ZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvYXNzZW1ibHkvcG9tLnhtbCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvYXNzZW1ibHkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAzNzA3MC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2Fzc2VtYmx5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWFzc2VtYmx5MTE8L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBBc3NlbWJseTwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+TXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBBc3NlbWJseSBpcyB1c2VkIHRvIGdlbmVyYXRlIAotICAgIC56aXAgYW5kIC50YXIuZ3ogZGlzdHJpYnV0aW9ucyA8L2Rlc2NyaXB0aW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvYXNzZW1ibHk8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy9hc3NlbWJseTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvYXNzZW1ibHk8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRlcGVuZGVuY3ktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktamF2YWRvYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZW5lcmljLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2JlYW4tdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2phdmFkb2M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1zb3VyY2U8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjb3JlLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtiZWFuLXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zcmM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBFWEVDVVRFIG12biBwYWNrYWdlIHRvIGdlbmVyYXRlIGFzc2VtYmx5IGZpbGVzIC0tPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X3NyYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5teWZhY2VzLWV4dHZhbDExLSR7dmVyc2lvbn0tc3JjPC9maW5hbE5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXR0YWNoZWQ8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X2JpbjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPiR7YmFzZWRpcn0vc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsMTEtJHt2ZXJzaW9ufS1iaW48L2ZpbmFsTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtiZWFuLXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPCEtLSBTaW5jZSBleHR2YWwgY291bGQgYmUgYXN5bmMgcmVsZWFzZWQsIGFuIGdlbmVyYXRlZCBhc3NlbWJseSBjb3VsZCBjb250YWluIGRpZmZlcmVudAotICAgICAgICAgYXJ0aWZhY3QgdmVyc2lvbnMgLS0+Ci0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxjb3JlLnZlcnNpb24+MS4xLjM8L2NvcmUudmVyc2lvbj4KLSAgICAgICAgPHRyaW5pZGFkLXN1cHBvcnQudmVyc2lvbj4xLjEuMzwvdHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9uPgotICAgICAgICA8Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb24+MS4xLjM8L2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9uPgotICAgICAgICA8cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9uPjEuMS4zPC9wcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb24+Ci0gICAgICAgIDxiZWFuLXZhbGlkYXRpb24udmVyc2lvbj4xLjEuMzwvYmVhbi12YWxpZGF0aW9uLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNjc5NWIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPmNvcmViaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAJPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+UkVBRE1FKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+TElDRU5TRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPk5PVElDRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPlJFTEVBU0UqPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9qYXZhZG9jPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmphdmFkb2M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3Jlc3JjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUxODZjNi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+Y29yZXNyYzwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPiAgCi0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAJPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+UkVBRE1FKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+TElDRU5TRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPk5PVElDRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPlJFTEVBU0UqPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+ICAgCi0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9zcmM8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+c3JjPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgotIApkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1YjNhNS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZjM2M2EuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IKLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzODc1ZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGU8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4xLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+Y29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjEuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y2dsaWI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZ2xpYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMV8zPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWVjZTU1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCFET0NUWVBFIGZhY2VzLWNvbmZpZyBQVUJMSUMNCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiINCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxmYWNlcy1jb25maWc+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+DQotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMuc3RhcnR1cC5HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyDQotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjFjZjkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGJlZDdiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcktpdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi0NCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZEludGVyY2VwdG9yOw0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuRW5oYW5jZXI7DQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RQcm94eTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxHZW5lcmljUmVuZGVyS2l0IGV4dGVuZHMgRXh0VmFsUmVuZGVyS2l0IGltcGxlbWVudHMgTWV0aG9kSW50ZXJjZXB0b3INCi17DQotICAgIHB1YmxpYyBzdGF0aWMgUmVuZGVyS2l0IG5ld0luc3RhbmNlKFJlbmRlcktpdCByZW5kZXJLaXQpDQotICAgIHsNCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IHJlbmRlcktpdC5nZXRDbGFzcygpOw0KLQ0KLSAgICAgICAgLy9pdCdzIG5vdCBwb3NzaWJsZSB0byB3cmFwIHRoZSBjb252ZXJ0ZXIgYWdhaW4gLSBvY2N1cnMgZS5nLiB1bmRlciBzb2xhcmlzICsgYmVhIHdlYmxvZ2ljDQotICAgICAgICBpZiAoUHJveHlVdGlscy5pc1Byb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZW5kZXJLaXQ7DQotICAgICAgICB9DQotDQotICAgICAgICBFbmhhbmNlciBlbmhhbmNlciA9IG5ldyBFbmhhbmNlcigpOw0KLSAgICAgICAgZW5oYW5jZXIuc2V0U3VwZXJjbGFzcyhyZW5kZXJLaXQuZ2V0Q2xhc3MoKSk7DQotICAgICAgICBlbmhhbmNlci5zZXRDYWxsYmFjayhuZXcgRXh0VmFsR2VuZXJpY1JlbmRlcktpdChyZW5kZXJLaXQpKTsNCi0gICAgICAgIGVuaGFuY2VyLnNldENsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOw0KLQ0KLSAgICAgICAgcmV0dXJuIChSZW5kZXJLaXQpIGVuaGFuY2VyLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgaW50ZXJjZXB0KE9iamVjdCBvYmosIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MsIE1ldGhvZFByb3h5IHByb3h5KSB0aHJvd3MgVGhyb3dhYmxlDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJnZXRSZW5kZXJlciIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRSZW5kZXJlcigoU3RyaW5nKWFyZ3NbMF0sIChTdHJpbmcpYXJnc1sxXSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJhZGRSZW5kZXJlciIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZFJlbmRlcmVyKChTdHJpbmcpYXJnc1swXSwgKFN0cmluZylhcmdzWzFdLCAoUmVuZGVyZXIpYXJnc1syXSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb3h5Lmludm9rZVN1cGVyKG9iaiwgYXJncyk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRXh0VmFsR2VuZXJpY1JlbmRlcktpdChSZW5kZXJLaXQgd3JhcHBlZCkNCi0gICAgew0KLSAgICAgICAgc3VwZXIod3JhcHBlZCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBSZW5kZXJlciBjcmVhdGVXcmFwcGVyKFJlbmRlcmVyIHJlbmRlcmVyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5uZXdJbnN0YW5jZShyZW5kZXJlcik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTY1NTc1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RJbnRlcmNlcHRvcjsKLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuRW5oYW5jZXI7Ci1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZFByb3h5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgZmluYWwgY2xhc3MgRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlciBleHRlbmRzIEV4dFZhbFJlbmRlcmVyV3JhcHBlciBpbXBsZW1lbnRzIE1ldGhvZEludGVyY2VwdG9yCi17Ci0gICAgcHVibGljIHN0YXRpYyBSZW5kZXJlciBuZXdJbnN0YW5jZShSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IHJlbmRlcmVyLmdldENsYXNzKCk7Ci0KLSAgICAgICAgLy90byBhdm9pZCByZS13cmFwcGluZyAtIG9jY3VycyBlLmcuIHVuZGVyIHNvbGFyaXMgKyBiZWEgd2VibG9naWMKLSAgICAgICAgaWYgKFByb3h5VXRpbHMuaXNQcm94aWVkQ2xhc3MoY3VycmVudENsYXNzKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgRW5oYW5jZXIgZW5oYW5jZXIgPSBuZXcgRW5oYW5jZXIoKTsKLSAgICAgICAgZW5oYW5jZXIuc2V0U3VwZXJjbGFzcyhyZW5kZXJlci5nZXRDbGFzcygpKTsKLSAgICAgICAgZW5oYW5jZXIuc2V0Q2FsbGJhY2sobmV3IEV4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIocmVuZGVyZXIpKTsKLSAgICAgICAgZW5oYW5jZXIuc2V0Q2xhc3NMb2FkZXIoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0KLSAgICAgICAgcmV0dXJuIChSZW5kZXJlcikgZW5oYW5jZXIuY3JlYXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBpbnRlcmNlcHQoT2JqZWN0IG9iaiwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncywgTWV0aG9kUHJveHkgcHJveHkpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0Q29udmVydGVkVmFsdWUiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDb252ZXJ0ZWRWYWx1ZSgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdLCBhcmdzWzJdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZGVjb2RlIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWNvZGUoKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImVuY29kZUJlZ2luIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGVCZWdpbigoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZW5jb2RlQ2hpbGRyZW4iKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZUNoaWxkcmVuKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJlbmNvZGVFbmQiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZUVuZCgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiY29udmVydENsaWVudElkIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRDbGllbnRJZCgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChTdHJpbmcpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldFJlbmRlcnNDaGlsZHJlbiIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm1ldGhvZCAiICsgbWV0aG9kLmdldE5hbWUoKSArICIgY2FsbGVkIHdpdGhvdXQgcmVuZGVyaW5nLWludGVyY2VwdG9ycyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcHJveHkuaW52b2tlU3VwZXIob2JqLCBhcmdzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlcihSZW5kZXJlciB3cmFwcGVkKQotICAgIHsKLSAgICAgICAgc3VwZXIod3JhcHBlZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1ZDI4Yi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5DQotew0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyS2l0IGNyZWF0ZVdyYXBwZXIoUmVuZGVyS2l0IHJlbmRlcktpdCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVya2l0IHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcktpdC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgdmlhIGNnbGliIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5uZXdJbnN0YW5jZShyZW5kZXJLaXQpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3N0YXJ0dXAvR2VuZXJpY01vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTczMzE0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdC5HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBHZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQzOTIxNTYwMzI4Nzc1MTk1NTZMOw0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpLmFkZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KG5ldyBHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWY2MzIwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGUgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlIHByb3ZpZGVzIGdlbmVyaWMgU3VwcG9ydCBmb3IgSlNGIGNvbXBvbmVudCBmcmFtZXdvcmtzIHdoaWNoIGhhdmUgc3BlY2lhbCByZXF1aXJlbWVudHMgKGUuZy4gUmljaEZhY2VzLCBNeUZhY2VzIFRvYmFnbywgLi4uKS4NCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEueCBhbmQgSlNGIDIueC4gQWxsIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9wb20ueG1sIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTE0ZTc2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIENvbXBvbmVudC1TdXBwb3J0IE1vZHVsZXM8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4xLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4xLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy9jb21wb25lbnQtc3VwcG9ydDwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8yX3JjL2NvbXBvbmVudC1zdXBwb3J0PC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy9jb21wb25lbnQtc3VwcG9ydDwvdXJsPgotICAgIDwvc2NtPgotCi0gICAgPG1vZHVsZXM+Ci0gICAgICAgIDxtb2R1bGU+dHJpbmlkYWQtc3VwcG9ydDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmdlbmVyaWMtc3VwcG9ydDwvbW9kdWxlPgotICAgIDwvbW9kdWxlcz4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPHRyaW5pZGFkLnZlcnNpb24+MS4wLjk8L3RyaW5pZGFkLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9wb20ueG1sIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZDEyOTQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlPC9uYW1lPgotICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4xLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJlZTM4NS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiIKLSAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzEuZHRkIiA+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGZhY2VzLWNvbmZpZz4KLSAgICA8bGlmZWN5Y2xlPgotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RhcnR1cC5UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lcgotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPgotICAgIDwvbGlmZWN5Y2xlPgotCi0gICAgPGxpZmVjeWNsZT4KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIKLSAgICAgICAgPC9waGFzZS1saXN0ZW5lcj4KLSAgICA8L2xpZmVjeWNsZT4KLTwvZmFjZXMtY29uZmlnPgpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjFjZjkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUwZWI2OC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi0vKioNCi0gKiBpbiBjYXNlIG9mIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gYSB0cmluaWRhZCBjbGllbnQgdmFsaWRhdG9yIGlzIGFkZGVkIHRvIHRoZSBjb21wb25lbnQgYmFzZWQgb24gdGhlIG1ldGEtZGF0YS4NCi0gKiBhdCB0aGUgcG9zdGJhY2s6IHRoZSBleHR2YWwgdmFsaWRhdGlvbiBzdHJhdGVneSBnZXRzIGNhbGxlZCBhbmQgYWZ0ZXIgdGhhdCB0aGUgYWRkZWQgdmFsaWRhdG9yLg0KLSAqIHRoaXMgd3JhcHBlciBwcmV2ZW50cyBzdWNoIGEgc2VydmVyLXNpZGUgZG91YmxlIHZhbGlkYXRpb24uDQotICogaXQganVzdCBkZWxlZ2F0ZXMgdGhlIGNsaWVudC1zaWRlIGZ1bmN0aW9uYWxpdHkuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIgaW1wbGVtZW50cyBWYWxpZGF0b3IsIENsaWVudFZhbGlkYXRvciwgU2VyaWFsaXphYmxlDQotew0KLSAgICBwcml2YXRlIHRyYW5zaWVudCBDbGllbnRWYWxpZGF0b3Igd3JhcHBlZDsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTQxNDU0Nzg0MTcwMDYyMTQxMEw7DQotDQotICAgIHB1YmxpYyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIoQ2xpZW50VmFsaWRhdG9yIGNsaWVudFZhbGlkYXRvcikNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gY2xpZW50VmFsaWRhdG9yOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHZhbGlkYXRlIC0gdGhlIGV4dHZhbCB2YWxpZGF0aW9uIHN0cmF0ZWd5IHdpbGwgZG8gdGhhdA0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50TGlicmFyeVNvdXJjZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRDbGllbnRMaWJyYXJ5U291cmNlKGZhY2VzQ29udGV4dCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRDbGllbnRJbXBvcnROYW1lcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudEltcG9ydE5hbWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRTY3JpcHQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudFNjcmlwdChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhODc3MDguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0LkV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0OwotCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5OwotCi0vKioKLSAqIHVzZSB0aGlzIHBoYXNlLWxpc3RlbmVyIGluc3RlYWQgb2YgYSBFeHRWYWxUcmluaWRhZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGR1ZSB0byBhIHRyaW5pZGFkIGlzc3VlCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDkxMDk3MjE4MzE4NjQxNDYxNjVMOwotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsKLQotICAgICAgICBSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnkgPSBnZXRSZW5kZXJLaXRGYWN0b3J5KCk7Ci0KLSAgICAgICAgU3RyaW5nIHJlbmRlcktpdElkID0gZ2V0UmVuZGVyS2l0SWQoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBpZiAoaXNJbmNvbXBhdGlibGVSZW5kZXJLaXQocmVuZGVyS2l0SWQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFuZ2VSZW5kZXJLaXQoZmFjZXNDb250ZXh0LCByZW5kZXJLaXRGYWN0b3J5LCByZW5kZXJLaXRJZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRSZW5kZXJLaXRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldFJlbmRlcktpdElkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJLaXRGYWN0b3J5IGdldFJlbmRlcktpdEZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChSZW5kZXJLaXRGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShGYWN0b3J5RmluZGVyLlJFTkRFUl9LSVRfRkFDVE9SWSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5jb21wYXRpYmxlUmVuZGVyS2l0KFN0cmluZyByZW5kZXJLaXRJZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAhRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuSUQuZXF1YWxzKHJlbmRlcktpdElkKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hhbmdlUmVuZGVyS2l0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFJlbmRlcktpdEZhY3RvcnkgcmVuZGVyS2l0RmFjdG9yeSwgU3RyaW5nIHJlbmRlcktpdElkKQotICAgIHsKLSAgICAgICAgUmVuZGVyS2l0IHJlbmRlcktpdCA9IHJlbmRlcktpdEZhY3RvcnkuZ2V0UmVuZGVyS2l0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgcmVuZGVyS2l0SWQpOwotICAgICAgICByZW5kZXJLaXRGYWN0b3J5LmFkZFJlbmRlcktpdChFeHRWYWxUcmluaWRhZFJlbmRlcktpdC5JRCwgbmV3IEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0KHJlbmRlcktpdCkpOwotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5zZXRSZW5kZXJLaXRJZChFeHRWYWxUcmluaWRhZFJlbmRlcktpdC5JRCk7Ci0gICAgfQotCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gUGhhc2VJZC5SRU5ERVJfUkVTUE9OU0U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCi0gICAgewotICAgICAgICBpZiAodGhpcyA9PSBvKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTBjYjc0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFyZW4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICAvKg0KLSAgICAgKiBkZWFjdGl2YXRlDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfQ0xJRU5UX1NJREVfVFJJTklEQURfVkFMSURBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9DTElFTlRfU0lERV9UUklOSURBRF9WQUxJREFUSU9OIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9UUklOSURBRF9DT1JFX09VVFBVVF9MQUJFTF9JTklUSUFMSVpBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9UUklOSURBRF9DT1JFX09VVFBVVF9MQUJFTF9JTklUSUFMSVpBVElPTiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfVFJJTklEQURfVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfVFJJTklEQURfVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IiKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0RvdWJsZVJhbmdlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEwMDBlMy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0RvdWJsZVJhbmdlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5Eb3VibGVSYW5nZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkNsaWVudFZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJza2lwVmFsaWRhdGlvblN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24iKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIERvdWJsZVJhbmdlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW5mb3JtYXRpb25BZGRlZCA9IGZhbHNlOwotICAgICAgICBEb3VibGVSYW5nZVZhbGlkYXRvciBkb3VibGVSYW5nZVZhbGlkYXRvciA9IChEb3VibGVSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRG91YmxlUmFuZ2UiKTsKLQotICAgICAgICBPYmplY3QgbWluID0gbnVsbDsKLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU5fREVGQVVMVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOX0RFRkFVTFQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWluIGluc3RhbmNlb2YgRG91YmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKChEb3VibGUpbWluKTsKLSAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IG1heCA9IG51bGw7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWF9ERUZBVUxUKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1heCBpbnN0YW5jZW9mIERvdWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bSgoRG91YmxlKW1heCk7Ci0gICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGluZm9ybWF0aW9uQWRkZWQgJiYKLSAgICAgICAgICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvciBpbnN0YW5jZW9mIENsaWVudFZhbGlkYXRvciAmJiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpZG91YmxlUmFuZ2VWYWxpZGF0b3IpKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xlbmd0aEluaXRpYWxpemVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xlbmd0aEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMjZjOGYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9MZW5ndGhJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBMZW5ndGhJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7Ci0gICAgICAgIC8vVE9ETwotICAgICAgICBMZW5ndGhWYWxpZGF0b3IgbGVuZ3RoVmFsaWRhdG9yID0gKExlbmd0aFZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTGVuZ3RoIik7Ci0KLSAgICAgICAgT2JqZWN0IG1pbkxlbmd0aCA9IG51bGw7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWluTGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIX0RFRkFVTFQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW5MZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEhfREVGQVVMVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtaW5MZW5ndGggaW5zdGFuY2VvZiBJbnRlZ2VyKQotICAgICAgICB7Ci0gICAgICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWluaW11bSgoSW50ZWdlciltaW5MZW5ndGgpOwotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbnVsbDsKLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEhfREVGQVVMVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heExlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSF9ERUZBVUxUKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1heExlbmd0aCBpbnN0YW5jZW9mIEludGVnZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudC5nZXRDbGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0TWF4aW11bUxlbmd0aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludC5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhMZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWF4aW11bSgoSW50ZWdlciltYXhMZW5ndGgpOwotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3JlSW5pdFZhbGlkYXRvcnMoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQsIG1ldGFEYXRhKTsgLy9zZWFyY2ggd3JhcHBlcnMgYW5kIGNhbGwgLmRlYWN0aXZhdGUKLQotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkICYmIGxlbmd0aFZhbGlkYXRvciBpbnN0YW5jZW9mIENsaWVudFZhbGlkYXRvcikKLSAgICAgICAgewotICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKWxlbmd0aFZhbGlkYXRvcikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobGVuZ3RoVmFsaWRhdG9yLmdldE1pbmltdW0oKSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgoQ29yZU91dHB1dExhYmVsKXVpQ29tcG9uZW50KS5zZXRTaG93UmVxdWlyZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTG9uZ1JhbmdlSW5pdGlhbGl6ZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTG9uZ1JhbmdlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc5ZWViOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xvbmdSYW5nZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuTG9uZ1JhbmdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgTG9uZ1JhbmdlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW5mb3JtYXRpb25BZGRlZCA9IGZhbHNlOwotICAgICAgICBMb25nUmFuZ2VWYWxpZGF0b3IgbG9uZ1JhbmdlVmFsaWRhdG9yID0gKExvbmdSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTG9uZ1JhbmdlIik7Ci0KLSAgICAgICAgT2JqZWN0IG1pbiA9IG51bGw7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pKQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOX0RFRkFVTFQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxUKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1pbiBpbnN0YW5jZW9mIExvbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKChMb25nKW1pbik7Ci0gICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBtYXggPSBudWxsOwotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4ID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWF9ERUZBVUxUKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4ID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVhfREVGQVVMVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtYXggaW5zdGFuY2VvZiBMb25nKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bSgoTG9uZyltYXgpOwotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkICYmCi0gICAgICAgICAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yIGluc3RhbmNlb2YgQ2xpZW50VmFsaWRhdG9yICYmIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikKLSAgICAgICAgewotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKWxvbmdSYW5nZVZhbGlkYXRvcikpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1BhdHRlcm5Jbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmYwODhkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuUmVnRXhwVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgUGF0dGVybkluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZighbWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4pKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBwYXR0ZXJucyA9IChTdHJpbmdbXSltZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4pOwotCi0gICAgICAgIFJlZ0V4cFZhbGlkYXRvciByZWdFeHBWYWxpZGF0b3I7Ci0KLSAgICAgICAgZm9yKFN0cmluZyBwYXR0ZXJuIDogcGF0dGVybnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZ0V4cFZhbGlkYXRvciA9IChSZWdFeHBWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5SZWdFeHAiKTsKLQotICAgICAgICAgICAgcmVnRXhwVmFsaWRhdG9yLnNldFBhdHRlcm4ocGF0dGVybik7Ci0gICAgICAgICAgICByZWdFeHBWYWxpZGF0b3Iuc2V0TWVzc2FnZURldGFpbE5vTWF0Y2goKFN0cmluZyltZXRhRGF0YS5nZXQoCi0gICAgICAgICAgICAgICAgQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFKSk7Ci0KLSAgICAgICAgICAgIGlmKHJlZ0V4cFZhbGlkYXRvciBpbnN0YW5jZW9mIENsaWVudFZhbGlkYXRvciAmJiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpcmVnRXhwVmFsaWRhdG9yKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1JlcXVpcmVkSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0YTk5Mi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1JlcXVpcmVkSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudXRpbC5UcmluaWRhZFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIFJlcXVpcmVkSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCF2YWxpZGF0ZUVtcHR5RmllbGRzKCkgfHwgIUV4dFZhbFV0aWxzLmlzUmVxdWlyZWRJbml0aWFsaXphdGlvbkFjdGl2ZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpIHx8Ci0gICAgICAgICAgIG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKXx8Ci0gICAgICAgICAgIG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigoCi0gICAgICAgICAgICAgICAgICghQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpICYmCi0gICAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQpKSkgfHwKLSAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpCi0gICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGlzQ29tcG9uZW50UmVxdWlyZWQodWlDb21wb25lbnQpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIENvcmVPdXRwdXRMYWJlbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgoQ29yZU91dHB1dExhYmVsKXVpQ29tcG9uZW50KS5zZXRTaG93UmVxdWlyZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJgotICAgICAgICAgICAgICAgICAgICFCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIgJiYgRXh0VmFsVXRpbHMuaXNSZXF1aXJlZFJlc2V0QWN0aXZhdGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlRW1wdHlGaWVsZHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLnZhbGlkYXRlRW1wdHlGaWVsZHMoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQm9vbGVhbiBpc0NvbXBvbmVudFJlcXVpcmVkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpQ29tcG9uZW50ID0gVHJpbmlkYWRVdGlscy5maW5kTGFiZWxlZEVkaXRhYmxlQ29tcG9uZW50KChDb3JlT3V0cHV0TGFiZWwpIHVpQ29tcG9uZW50KTsKLQotICAgICAgICAgICAgaWYodWlDb21wb25lbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL2NvbXBhcmUgd2l0aCBmYWxzZSBzbyB0cnVlID0gdHJ1ZSBvciBudWxsCi0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNSZWFkT25seSIpKSk7Ci0gICAgICAgIGJvb2xlYW4gaXNEaXNhYmxlZCA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNEaXNhYmxlZCIpKSk7Ci0KLSAgICAgICAgcmV0dXJuICEoaXNSZWFkT25seSB8fCBpc0Rpc2FibGVkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1RyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTJkMWU1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZS5UcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbnRleHQuUmVxdWVzdENvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9URVhUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXRUZXh0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXREYXRlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8VHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcj4gY29tcG9uZW50SW5pdGlhbGl6ZXJzID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyPigpOwotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBSZXF1aXJlZEluaXRpYWxpemVyKCkpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBMZW5ndGhJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgTG9uZ1JhbmdlSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IERvdWJsZVJhbmdlSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFBhdHRlcm5Jbml0aWFsaXplcigpKTsKLSAgICAgICAgLy9jb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBWYWxpZGF0b3JJbml0aWFsaXplcigpKTsKLSAgICB9Ci0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkxPVywgZGVzY3JpcHRpb24gPSAiY2hlY2sgcHByIGlzc3VlIikKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBmb3IoVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplciA6IGNvbXBvbmVudEluaXRpYWxpemVycykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoY29tcG9uZW50SW5pdGlhbGl6ZXIuY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZENvbXBvbmVudFRvU3RvcmFnZSh1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQ29tcG9uZW50KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZENvbXBvbmVudFRvU3RvcmFnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmNsYXNzLCBUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKQotICAgICAgICAgICAgICAgIC5hZGRDb21wb25lbnQodWlDb21wb25lbnQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKSB8fAotICAgICAgICAgICAgICAgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFLmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmKFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmlzUGFydGlhbFJlcXVlc3QoZmFjZXNDb250ZXh0KSkKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuYWRkUGFydGlhbFRhcmdldCh1aUNvbXBvbmVudC5nZXRQYXJlbnQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1ZhbGlkYXRvckluaXRpYWxpemVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1ZhbGlkYXRvckluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NmY0YWQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQotQFVzYWdlSW5mb3JtYXRpb24odmFsdWUgPSBVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gImltcGwuIHRyaW5pZGFkIGUtbWFpbCB2YWxpZGF0b3IiKQotY2xhc3MgVmFsaWRhdG9ySW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCFtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuQ1VTVE9NKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00pOwotCi0gICAgICAgIGlmKCEodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKE9iamVjdCBjdXJyZW50VmFsdWUgOiAoTGlzdCl2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIShjdXJyZW50VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihDb21tb25NZXRhRGF0YUtleXMuRU1BSUwuZXF1YWxzKGN1cnJlbnRWYWx1ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9UT0RPCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE0Njk2Yi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3INCi0gICAgICAgIC5Db21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigzMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBleHRlbmRzIENvbXBvbmVudEluaXRpYWxpemF0aW9uQXdhcmVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nRm9yQ29tcG9uZW50SW5pdGlhbGl6YXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzTWV0YURhdGFFbnRyaWVzKHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0TWV0YURhdGFFbnRyaWVzKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTWV0YURhdGFFbnRyaWVzKE1ldGFEYXRhRW50cnlbXSBtZXRhRGF0YUVudHJpZXMpDQotICAgIHsNCi0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IG1ldGFEYXRhRW50cmllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAocHJvY2Vzc0VudHJ5KGVudHJ5KSAmJiBpc0NsaWVudFZhbGlkYXRpb25EaXNhYmxlZChlbnRyeSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBkaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24oZW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvL2UuZy4gcmV0dXJucyBmYWxzZSBmb3IganNyMzAzIGVudHJpZXMNCi0gICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NFbnRyeShNZXRhRGF0YUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb247DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xpZW50VmFsaWRhdGlvbkRpc2FibGVkKE1ldGFEYXRhRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkNCi0gICAgICAgICAgICAgICAgLmV4dHJhY3QoZW50cnkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5pdGVyYXRvcigpLmhhc05leHQoKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwcml2YXRlIHZvaWQgZGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uKE1ldGFEYXRhRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmKGVudHJ5LmdldFByb3BlcnR5KENvbW1vbk1ldGFEYXRhS2V5cy5ESVNBQkxFX0NMSUVOVF9TSURFX1ZBTElEQVRJT04pID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZW50cnkuc2V0UHJvcGVydHkoQ29tbW9uTWV0YURhdGFLZXlzLkRJU0FCTEVfQ0xJRU5UX1NJREVfVkFMSURBVElPTiwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGtleXNUb0Rpc2FibGUgPSBlbnRyeS5nZXRQcm9wZXJ0eShDb21tb25NZXRhRGF0YUtleXMuRElTQUJMRV9DTElFTlRfU0lERV9WQUxJREFUSU9OLCBMaXN0LmNsYXNzKTsNCi0gICAgICAgIGtleXNUb0Rpc2FibGUuYWRkKGVudHJ5LmdldEtleSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZTNiNjEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UuVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudXRpbC5UcmluaWRhZFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUuQ29yZUZvcm07DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotcHVibGljIGNsYXNzIFRyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvciBleHRlbmRzIEFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcg0KLXsNCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpDQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChmaWx0ZXJDb3JlT3V0cHV0TGFiZWwodWlDb21wb25lbnQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRDb3JlT3V0cHV0TGFiZWwoZmFjZXNDb250ZXh0LCAoQ29yZU91dHB1dExhYmVsKSB1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyRW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQ0KLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIENvcmVGb3JtKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNsZWFudXBFeHRWYWxDbGllbnRWYWxpZGF0b3JzKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFudXBFeHRWYWxDbGllbnRWYWxpZGF0b3JzKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MsIFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpDQotICAgICAgICAgICAgICAgIC5yb2xsYmFjaygpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBmaWx0ZXJDb3JlT3V0cHV0TGFiZWwoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb3JlT3V0cHV0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgQ29yZU91dHB1dExhYmVsIGNvcmVPdXRwdXRMYWJlbCkNCi0gICAgew0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gVHJpbmlkYWRVdGlscy5maW5kTGFiZWxlZEVkaXRhYmxlQ29tcG9uZW50KGNvcmVPdXRwdXRMYWJlbCk7DQotDQotICAgICAgICBpZiAodGFyZ2V0Q29tcG9uZW50ID09IG51bGwgfHwgIWlzQ29tcG9uZW50RWRpdGFibGUodGFyZ2V0Q29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhUmVzdWx0ID0gRXh0VmFsVXRpbHMuZ2V0VHJhbnNmb3JtZWRNZXRhRGF0YShmYWNlc0NvbnRleHQsIHRhcmdldENvbXBvbmVudCk7DQotDQotICAgICAgICAvL2dldCBjb21wb25lbnQgaW5pdGlhbGl6ZXIgZm9yIHRoZSBjdXJyZW50IGNvbXBvbmVudCBhbmQgY29uZmlndXJlIGl0DQotICAgICAgICAvL2Fsc28gaW4gY2FzZSBvZiBza2lwcGVkIHZhbGlkYXRpb24gdG8gcmVzZXQgZS5nLiB0aGUgcmVxdWlyZWQgYXR0cmlidXRlDQotICAgICAgICBpZiAoIW1ldGFEYXRhUmVzdWx0LmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5jb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoZmFjZXNDb250ZXh0LCBjb3JlT3V0cHV0TGFiZWwsIG1ldGFEYXRhUmVzdWx0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDb21wb25lbnRFZGl0YWJsZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgLy9jb21wYXJlIHdpdGggZmFsc2Ugc28gdHJ1ZSA9IHRydWUgb3IgbnVsbA0KLSAgICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNSZWFkT25seSIpKSk7DQotICAgICAgICBib29sZWFuIGlzRGlzYWJsZWQgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc0Rpc2FibGVkIikpKTsNCi0NCi0gICAgICAgIHJldHVybiAhKGlzUmVhZE9ubHkgfHwgaXNEaXNhYmxlZCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q4NTQ2MS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5MYWJlbGVkTWVzc2FnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5leGNlcHRpb24uUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbnRleHQuUmVxdWVzdENvbnRleHQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dFRleHQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUuaW5wdXQuQ29yZUlucHV0RGF0ZSI7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb1JlZnJlc2hDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgICAgIHRyeVRvUGxhY2VMYWJlbEluRmFjZXNNZXNzYWdlKHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvUGxhY2VMYWJlbEluRmFjZXNNZXNzYWdlKA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHRyeVRvSGFuZGxlUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24odWlDb21wb25lbnQsIHZhbGlkYXRvckV4Y2VwdGlvbik7DQotDQotICAgICAgICBTdHJpbmcgbGFiZWwgPSBkZXRlY3RMYWJlbFRleHQobWV0YURhdGFFbnRyeSwgdWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0xhYmVsKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSwgbGFiZWwpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGRldGVjdExhYmVsVGV4dChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbGFiZWwgPSBnZXRMYWJlbCh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBsYWJlbCA9IGdldENsaWVudElkQXNGYWxsYmFja0lmTmVlZGVkKHVpQ29tcG9uZW50LCBsYWJlbCk7DQotDQotICAgICAgICBsYWJlbCA9IHRyeVRvT3ZlcnJpZGVMYWJlbElmUHJvdmlkZWRNYW51YWxseShtZXRhRGF0YUVudHJ5LCBsYWJlbCk7DQotICAgICAgICByZXR1cm4gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NMYWJlbChGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIExhYmVsZWRNZXNzYWdlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgICgoTGFiZWxlZE1lc3NhZ2UpZmFjZXNNZXNzYWdlKS5zZXRMYWJlbFRleHQobGFiZWwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9pZiBzb21lb25lIHVzZXMgYSBub3JtYWwgZmFjZXMgbWVzc2FnZQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwoZmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvT3ZlcnJpZGVMYWJlbElmUHJvdmlkZWRNYW51YWxseShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwsIFN0cmluZy5jbGFzcyk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xpZW50SWRBc0ZhbGxiYWNrSWZOZWVkZWQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgaWYobGFiZWwgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBsYWJlbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9IYW5kbGVSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdG9yRXhjZXB0aW9uIGluc3RhbmNlb2YgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKTsNCi0gICAgICAgICAgICBTdHJpbmcgaW5saW5lTWVzc2FnZSA9IGdldElubGluZVJlcXVpcmVkTWVzc2FnZSh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICAgICAgaWYoaW5saW5lTWVzc2FnZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoaW5saW5lTWVzc2FnZSk7DQotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoaW5saW5lTWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1JlZnJlc2hDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmKFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmlzUGFydGlhbFJlcXVlc3QoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBSZXF1ZXN0Q29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5hZGRQYXJ0aWFsVGFyZ2V0KHVpQ29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAoVFJJTklEQURfQ09SRV9JTlBVVF9URVhULmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSkgfHwNCi0gICAgICAgICAgICAgICAgIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURS5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRMYWJlbChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldExhYmVsIikpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldElubGluZVJlcXVpcmVkTWVzc2FnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldFJlcXVpcmVkTWVzc2FnZURldGFpbCIpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlY2EyMWUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwucmVuZGVya2l0LlJlbmRlcktpdERlY29yYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuY29yZS5Db3JlUmVuZGVyS2l0OwotCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlc3BvbnNlU3RhdGVNYW5hZ2VyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VXcml0ZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0IGV4dGVuZHMgUmVuZGVyS2l0RGVjb3JhdG9yCi17Ci0gICAgcHJvdGVjdGVkIEV4dFZhbFJlbmRlcktpdCBleHRWYWxSZW5kZXJLaXQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJFWFRWQUxfVFJJTklEQURfUkVOREVSS0lUIjsKLQotICAgIHB1YmxpYyBFeHRWYWxUcmluaWRhZFJlbmRlcktpdChSZW5kZXJLaXQgd3JhcHBlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZXh0VmFsUmVuZGVyS2l0ID0gbmV3IEV4dFZhbFJlbmRlcktpdCh3cmFwcGVkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlLCBSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCByZW5kZXJlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlbmRlcmVyIGdldFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5leHRWYWxSZW5kZXJLaXQuZ2V0UmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZXNwb25zZVN0YXRlTWFuYWdlciBnZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5leHRWYWxSZW5kZXJLaXQuZ2V0UmVzcG9uc2VTdGF0ZU1hbmFnZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVzcG9uc2VXcml0ZXIgY3JlYXRlUmVzcG9uc2VXcml0ZXIoV3JpdGVyIHdyaXRlciwgU3RyaW5nIHMsIFN0cmluZyBzMSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5jcmVhdGVSZXNwb25zZVdyaXRlcih3cml0ZXIsIHMsIHMxKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVzcG9uc2VTdHJlYW0gY3JlYXRlUmVzcG9uc2VTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5jcmVhdGVSZXNwb25zZVN0cmVhbShvdXRwdXRTdHJlYW0pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVjb3JhdGVkUmVuZGVyS2l0SWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIENvcmVSZW5kZXJLaXQuQkFTRV9SRU5ERVJfS0lUX0lEOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjI3MDFmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwucmVuZGVya2l0LmNvcmUueGh0bWwudGFibGUuVGFibGVSZW5kZXJpbmdDb250ZXh0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogc29sdXRpb24gZm9yIHRyaW5pZGFkIHRhYmxlIHJlbmRlcmVyIGlzc3VlIChpbiBjb25uZWN0aW9uIHdpdGggZG91YmxlIGNhbGwgcHJldmVudGlvbiBwcm94aWVzKQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkgZXh0ZW5kcyBFeHRWYWxSZW5kZXJlclByb3h5DQotew0KLSAgICBwdWJsaWMgRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5KFJlbmRlcmVyIHJlbmRlcmVyKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihyZW5kZXJlcik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3B0aW9uYWxLZXkoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmKFRhYmxlUmVuZGVyaW5nQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAifCIgKyBUYWJsZVJlbmRlcmluZ0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0UmVuZGVyU3RhZ2UoKS5nZXRTdGFnZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuICIiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdGFydHVwL1RyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGI3NTZiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdGFydHVwL1RyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXJIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQuVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UuVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZS5EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC52YWxpZGF0aW9uLm1lc3NhZ2UuVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0LkV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yLlRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3IuVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3IuVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGFsdGVybmF0aXZlIGFwcHJvYWNoIGZvciBFeHRWYWxSZW5kZXJLaXRGYWN0b3J5DQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgwMzQwODkyNDQ5MDM5NjY5OTlMOw0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgZGVhY3RpdmF0ZURlZmF1bHRFeHRWYWxSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpOw0KLQ0KLSAgICAgICAgaW5pdENsaWVudFNpZGVWYWxpZGF0aW9uU3VwcG9ydCgpOw0KLQ0KLSAgICAgICAgaW5pdExhYmVsSW5pdGlhbGl6YXRpb25TdXBwb3J0KCk7DQotDQotICAgICAgICBpbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdGlvbigpOw0KLQ0KLSAgICAgICAgcmVwbGFjZURlZmF1bHRQcm94eVdpdGhUcmluaWRhZFJlbmRlcmVyUHJveHkoKTsNCi0NCi0gICAgICAgIGluaXRUcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkoKTsNCi0gICAgICAgIC8qDQotICAgICAgICAgKiBpZiB0aGVyZSBhcmUgZnVydGhlciBpbmNvbXBhdGlibGUgcmVuZGVyZXJzIHVzZSB0aGUgZm9sbG93aW5nIHF1aWNrLWZpeDoNCi0gICAgICAgICAqICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZLCBudWxsKTsNCi0gICAgICAgICAgIGF0dGVudGlvbjogaXQgY2F1c2VzIGRpcmVjdCBkZWxlZ2F0aW9uIHdpdGhvdXQgYSBjaGVjayBvZiBkb3VibGUgaW52b2NhdGlvbnMNCi0gICAgICAgICAqLw0KLQ0KLSAgICAgICAgaW5pdFRyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IoKTsNCi0NCi0gICAgICAgIGluaXRUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UoKTsNCi0NCi0gICAgICAgIGluaXRSZXF1aXJlZEluaXRpYWxpemF0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGRlYWN0aXZhdGVEZWZhdWx0RXh0VmFsUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jbGFzcykuZGVhY3RpdmF0ZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0Q2xpZW50U2lkZVZhbGlkYXRpb25TdXBwb3J0KCkNCi0gICAgew0KLSAgICAgICAgaWYoaXNDbGllbnRTaWRlVmFsaWRhdGlvblN1cHBvcnRFbmFibGVkKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NMSUVOVF9TSURFX1RSSU5JREFEX1ZBTElEQVRJT04pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZENvbXBvbmVudEluaXRpYWxpemVyKG5ldyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TGFiZWxJbml0aWFsaXphdGlvblN1cHBvcnQoKQ0KLSAgICB7DQotICAgICAgICBpZihpc0xhYmVsSW5pdGlhbGl6YXRpb25FbmFibGVkKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX1RSSU5JREFEX0NPUkVfT1VUUFVUX0xBQkVMX0lOSVRJQUxJWkFUSU9OKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFRyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRpb24oKQ0KLSAgICB7DQotICAgICAgICBpZih1c2VWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0aW9uKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX1RSSU5JREFEX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IobmV3IFRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZXBsYWNlRGVmYXVsdFByb3h5V2l0aFRyaW5pZGFkUmVuZGVyZXJQcm94eSgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSwgRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRUcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjdG9yeU5hbWVzLkZBQ0VTX01FU1NBR0VfRkFDVE9SWS5uYW1lKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRUcmluaWRhZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZLCBTdG9yYWdlTWFuYWdlckhvbGRlci5jbGFzcykNCi0gICAgICAgICAgICAgICAgLnNldFN0b3JhZ2VNYW5hZ2VyKFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNMYWJlbEluaXRpYWxpemF0aW9uRW5hYmxlZChTdHJpbmcgZGVhY3RpdmF0ZUluaXRDb3JlT3V0cHV0TGFiZWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkZWFjdGl2YXRlSW5pdENvcmVPdXRwdXRMYWJlbCA9PSBudWxsIHx8ICFkZWFjdGl2YXRlSW5pdENvcmVPdXRwdXRMYWJlbC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xpZW50U2lkZVZhbGlkYXRpb25TdXBwb3J0RW5hYmxlZChTdHJpbmcgZGVhY3RpdmF0ZUNsaWVudFNpZGVWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGVhY3RpdmF0ZUNsaWVudFNpZGVWYWxpZGF0aW9uID09IG51bGwgfHwgIWRlYWN0aXZhdGVDbGllbnRTaWRlVmFsaWRhdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRpb24oU3RyaW5nIGRlYWN0aXZhdGVUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRlYWN0aXZhdGVUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA9PSBudWxsIHx8DQotICAgICAgICAgICAgICAgICFkZWFjdGl2YXRlVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRSZXF1aXJlZEluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgaWYoIWlzUmVxdWlyZWRJbml0aWFsaXphdGlvbkRlYWN0aXZhdGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoIm1vZGU6aW5pdDpyZXF1aXJlZCIsIEJvb2xlYW4uVFJVRSwgdHJ1ZSk7DQotDQotICAgICAgICAgICAgLy90aGVyZSBpcyBubyBzdXBwb3J0IGZvciBjbGllbnQtc2lkZSBzZXZlcml0eSBhd2FyZSB2YWxpZGF0aW9uIC0+IGRvbid0IHJlc2V0IHRoZSB2YWx1ZQ0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KCJtb2RlOnJlc2V0OnJlcXVpcmVkIiwgQm9vbGVhbi5GQUxTRSwgZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25EZWFjdGl2YXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAiZmFsc2UiLmVxdWFsc0lnbm9yZUNhc2UoDQotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlci5BQ1RJVkFURV9SRVFVSVJFRF9JTklUSUFMSVpBVElPTik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNTQyNTQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXI7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlIGltcGxlbWVudHMgVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlDQotew0KLSAgICBwcml2YXRlIExpc3Q8VUlDb21wb25lbnQ+IGNvbXBvbmVudExpc3QgPSBuZXcgQXJyYXlMaXN0PFVJQ29tcG9uZW50PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb21wb25lbnQoVUlDb21wb25lbnQgdHJpbmlkYWRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmKCF0aGlzLmNvbXBvbmVudExpc3QuY29udGFpbnModHJpbmlkYWRDb21wb25lbnQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuY29tcG9uZW50TGlzdC5hZGQodHJpbmlkYWRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJvbGxiYWNrKCkNCi0gICAgew0KLSAgICAgICAgZm9yIChVSUNvbXBvbmVudCBjb21wb25lbnQgOiB0aGlzLmNvbXBvbmVudExpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVtb3ZlVHJpbmlkYWRWYWxpZGF0b3JXcmFwcGVyKGNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgICAgICB0aGlzLmNvbXBvbmVudExpc3QuY2xlYXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlVHJpbmlkYWRWYWxpZGF0b3JXcmFwcGVyKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlbW92ZVdyYXBwZXJGcm9tQ29tcG9uZW50KHVpQ29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL3RvIGtlZXAgdGhlIHNvdXJjZSBpbiBzeW5jIHdpdGggb2xkZXIgdmVyc2lvbnMNCi0gICAgICAgICAgICBmb3IgKE9iamVjdCBjaGlsZCA6IHVpQ29tcG9uZW50LmdldENoaWxkcmVuKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZW1vdmVUcmluaWRhZFZhbGlkYXRvcldyYXBwZXIoKFVJQ29tcG9uZW50KWNoaWxkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVdyYXBwZXJGcm9tQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBmb3IgKFZhbGlkYXRvciB2YWxpZGF0b3IgOiAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpIHVpQ29tcG9uZW50KS5nZXRWYWxpZGF0b3JzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcikgdWlDb21wb25lbnQpLnJlbW92ZVZhbGlkYXRvcih2YWxpZGF0b3IpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU1hbmFnZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDAxZGM1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIGNvbXBvbmVudCBlbnRyaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU1hbmFnZXINCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZT4NCi17DQotICAgIHB1YmxpYyBEZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfVFJJTklEQURfQ0xJRU5UX1ZBTElEQVRPUjpLRVkiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL1RyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODNjYjguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotDQotLyoqDQotICogZXh0dmFsIGluamVjdHMgY2xpZW50LXZhbGlkYXRvcnMgaW50byB0cmluaWRhZCBjb21wb25lbnRzIGJhc2VkIG9uIG1ldGEtZGF0YS4NCi0gKiBzbyBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIGlzIHN1cHBvcnRlZC4gc29tZSBhcHAtc2VydmVycyBzaG93IGEgZGlmZmVyZW50IGJlaGF2aW91ci4NCi0gKiB0aGF0J3MgdGhlIHJlYXNvbiBmb3Igc3RvcmluZyB0aGVzZSBjb21wb25lbnRzIGFuZCByZW1vdmUgdGhlIGluamVjdGVkIHZhbGlkYXRvcnMgYWZ0ZXIgdGhlIHJlbmRlcmluZyBwaGFzZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UNCi17DQotICAgIHZvaWQgYWRkQ29tcG9uZW50KFVJQ29tcG9uZW50IHRyaW5pZGFkQ29tcG9uZW50KTsNCi0gICAgdm9pZCByb2xsYmFjaygpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZTY5YjMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZS5UcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLkRlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdXRpbC9UcmluaWRhZFV0aWxzLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdXRpbC9UcmluaWRhZFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNjM4MzIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3V0aWwvVHJpbmlkYWRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLm91dHB1dC5Db3JlT3V0cHV0TGFiZWw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiY2hlY2sgc3ViZm9ybSIpDQotcHVibGljIGNsYXNzIFRyaW5pZGFkVXRpbHMNCi17DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFRyaW5pZGFkVXRpbHMuY2xhc3MpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFVJQ29tcG9uZW50IGZpbmRMYWJlbGVkRWRpdGFibGVDb21wb25lbnQoQ29yZU91dHB1dExhYmVsIGNvcmVPdXRwdXRMYWJlbCkNCi0gICAgew0KLSAgICAgICAgLy9UT0RPDQotICAgICAgICBpZihpc0xhYmVsVGFyZ2V0QXZhaWxhYmxlKGNvcmVPdXRwdXRMYWJlbCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgVUlDb21wb25lbnQgcmVzdWx0ID0gcmVzb2x2ZUxhYmVsVGFyZ2V0KGZhY2VzQ29udGV4dCwgY29yZU91dHB1dExhYmVsKTsNCi0NCi0gICAgICAgIGlmKHJlc3VsdCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKExPRy5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExPRy50cmFjZShjb3JlT3V0cHV0TGFiZWwuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSArICIgZG9lc24ndCByZWZlcmVuY2UgYW4gZWRpdGFibGUgY29tcG9uZW50Iik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBVSUNvbXBvbmVudCByZXNvbHZlTGFiZWxUYXJnZXQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgQ29yZU91dHB1dExhYmVsIGNvcmVPdXRwdXRMYWJlbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmZpbmRDb21wb25lbnQoY29yZU91dHB1dExhYmVsLmdldEZvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTGFiZWxUYXJnZXRBdmFpbGFibGUoQ29yZU91dHB1dExhYmVsIGNvcmVPdXRwdXRMYWJlbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNvcmVPdXRwdXRMYWJlbC5nZXRGb3IoKSA9PSBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2MyMWNjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFRyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeSBleHRlbmRzIERlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5DQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNMYWJlbGVkRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2UgaW5zdGFuY2VvZiBUcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2UgY3JlYXRlKEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlKHNldmVyaXR5LCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmU2OTNiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnZhbGlkYXRpb24ubWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkxhYmVsZWRNZXNzYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudXRpbC5MYWJlbGVkRmFjZXNNZXNzYWdlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlIGV4dGVuZHMgTGFiZWxlZEZhY2VzTWVzc2FnZSBpbXBsZW1lbnRzIExhYmVsZWRNZXNzYWdlDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2MzU2ODAwNjg5OTYxNTA1MTU0TDsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIgPSAiPz8/IjsNCi0NCi0gICAgcHVibGljIFRyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZShTZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKHNldmVyaXR5LCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldExhYmVsQXNTdHJpbmcoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBnZXRTdW1tYXJ5KCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIHJlc3VsdCA9IHRyeVRvUGxhY2VMYWJlbChzdXBlci5nZXRTdW1tYXJ5KCkpOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN1cGVyLnNldFN1bW1hcnkocmVzdWx0LmdldFN1bW1hcnkoKSk7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5nZXRTdW1tYXJ5KCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0U3VtbWFyeSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERldGFpbCgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZSByZXN1bHQgPSB0cnlUb1BsYWNlTGFiZWwoc3VwZXIuZ2V0RGV0YWlsKCkpOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN1cGVyLnNldERldGFpbChyZXN1bHQuZ2V0RGV0YWlsKCkpOw0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQuZ2V0RGV0YWlsKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RGV0YWlsKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBGYWNlc01lc3NhZ2UgdHJ5VG9QbGFjZUxhYmVsKFN0cmluZyBvcmlnaW5hbE1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIGlmIChpc1ZhbGlkTWVzc2FnZShvcmlnaW5hbE1lc3NhZ2UpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBuZXdGYWNlc01lc3NhZ2UgPSBjcmVhdGVPcmlnaW5hbEZhY2VzTWVzc2FnZSgpOw0KLSAgICAgICAgICAgIHRyeVRvUGxhY2VMYWJlbEluKG5ld0ZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgcmV0dXJuIG5ld0ZhY2VzTWVzc2FnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgRmFjZXNNZXNzYWdlIGNyZWF0ZU9yaWdpbmFsRmFjZXNNZXNzYWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBGYWNlc01lc3NhZ2Uoc3VwZXIuZ2V0U2V2ZXJpdHkoKSwgc3VwZXIuZ2V0U3VtbWFyeSgpLCBzdXBlci5nZXREZXRhaWwoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvUGxhY2VMYWJlbEluKEZhY2VzTWVzc2FnZSBuZXdGYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBsYWJlbCA9IGdldExhYmVsVGV4dCgpOw0KLQ0KLSAgICAgICAgaWYobGFiZWwgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvUGxhY2VMYWJlbChuZXdGYWNlc01lc3NhZ2UsIGxhYmVsLCBpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRNZXNzYWdlKFN0cmluZyBvcmlnaW5hbE1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAhKG9yaWdpbmFsTWVzc2FnZSAhPSBudWxsICYmDQotICAgICAgICAgICAgICAgIG9yaWdpbmFsTWVzc2FnZS5zdGFydHNXaXRoKE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSKSAmJg0KLSAgICAgICAgICAgICAgICBvcmlnaW5hbE1lc3NhZ2UuZW5kc1dpdGgoTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIGxhYmVsKQ0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRMYWJlbChsYWJlbCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNWIzYTUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjZhNDM0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IKLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMjhjMmUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgVHJpbmlkYWQgU3VwcG9ydCBNb2R1bGUNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgVHJpbmlkYWQgU3VwcG9ydCBNb2R1bGUgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZSBwcm92aWRlcyBzcGVjaWFsIFRyaW5pZGFkIFN1cHBvcnQgZm9yIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IuDQotICAgIEZ1cnRoZXJtb3JlLCBpdCBhbGxvd3MgdG8gam9pbiB0aGUgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBtZWNoYW5pc20gb2YgVHJpbmlkYWQuIFNhbXBsZSB1c2UtY2FzZTogYW5ub3RhdGUgeW91ciBtb2RlbCB3aXRoIEpQQSAxLjAgYW5ub3RhdGlvbnMsIGJpbmQgcHJvcGVydGllcyB0byBKU0YgSW5wdXQgY29tcG9uZW50cyBhbmQgZ2V0IGF1dG9tYXRpYyBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIGp1c3QgYnkgYWRkaW5nIDMgSkFSIGZpbGVzIChNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUsIFByb3BlcnR5IFZhbGlkYXRpb24gYW5kIFRyaW5pZGFkIFN1cHBvcnQpLg0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS54IGFuZCBKU0YgMi54LiBBbGwgdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvcG9tLnhtbCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTcyYmFlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBDb3JlPC9uYW1lPgotICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gICAgCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvY29yZTwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8yX3JjL2NvcmU8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8yX3JjL2NvcmU8L3VybD4KLSAgICA8L3NjbT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvZGVjPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2RlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMzwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzA0NDc2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDDQotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMC8vRU4iDQotICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWZhY2VzY29uZmlnXzFfMS5kdGQiID4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08ZmFjZXMtY29uZmlnPg0KLSAgICA8ZmFjdG9yeT4NCi0gICAgICAgIDxyZW5kZXIta2l0LWZhY3Rvcnk+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcktpdEZhY3Rvcnk8L3JlbmRlci1raXQtZmFjdG9yeT4NCi0gICAgPC9mYWN0b3J5Pg0KLQ0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuRXh0VmFsU3RhcnR1cExpc3RlbmVyPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjFjZjkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0V4dFZhbEluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZDVkMWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0V4dFZhbEluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi0NCi0vKioNCi0gKiBkb250J3QgbW92ZSB0byBhbiBvdGhlciBwYWNrYWdlISEhDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRXh0VmFsSW5mb3JtYXRpb24NCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgPSBFeHRWYWxJbmZvcm1hdGlvbi5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlhNTF9QQVJBTV9QUkVGSVggPSBFeHRWYWxJbmZvcm1hdGlvbi5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSBDbGFzc1V0aWxzLmdldEphclZlcnNpb24oRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9DdXN0b21JbmZvcm1hdGlvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ3VzdG9tSW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJkYTM5ZS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9DdXN0b21JbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQ0KLXB1YmxpYyBlbnVtIEN1c3RvbUluZm9ybWF0aW9uDQotew0KLSAgICBCQVNFX1BBQ0tBR0UsDQotDQotICAgIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SLA0KLSAgICBWQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1IsDQotDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCwNCi0gICAgVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFX1JFU09MVkVSX1BPU1RGSVgsDQotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYLA0KLQ0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01TR19SRVNPTFZFUl9OQU1FX01BUFBFUiwNCi0gICAgTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIsDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSLA0KLQ0KLSAgICBTVEFSVFVQX0xJU1RFTkVSLA0KLSAgICBDT01QT05FTlRfSU5JVElBTElaRVIsDQotICAgIFZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SLA0KLSAgICBQUk9QRVJUWV9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SLA0KLSAgICBNRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUiwNCi0NCi0gICAgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLA0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksDQotICAgIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksDQotICAgIFZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZLA0KLSAgICBWQUxJREFUSU9OX1BBUkFNRVRFUl9GQUNUT1JZLA0KLSAgICBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwNCi0gICAgRkFDRVNfTUVTU0FHRV9GQUNUT1JZLA0KLSAgICBTVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwNCi0NCi0gICAgTUVTU0FHRV9CVU5ETEVfTkFNRSwNCi0gICAgU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFLA0KLQ0KLSAgICBNRVRBX0RBVEFfU1RPUkFHRV9GSUxURVINCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9EZWZhdWx0UHJvamVjdFN0YWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRiM2M1NC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9EZWZhdWx0UHJvamVjdFN0YWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvamVjdFN0YWdlUmVzb2x2ZXIgaW1wbGVtZW50cyBQcm9qZWN0U3RhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHVibGljIFByb2plY3RTdGFnZSBnZXRDdXJyZW50UHJvamVjdFN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgLy9kb24ndCB1c2UgdGhlIGRlZmF1bHQgZXh0dmFsIG1lY2hhbmlzbSB0byBhdm9pZCB0b28gZWFybHkgZXZhbHVhdGlvbiB3aXRoIG1vamFycmENCi0gICAgICAgIFN0cmluZyByZXN1bHQ7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRJbml0UGFyYW1ldGVyKCJqYXZheC5mYWNlcy5QUk9KRUNUX1NUQUdFIik7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVByb2plY3RTdGFnZShnZXREZWZhdWx0UHJvamVjdFN0YWdlKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwgfHwgIiIuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVByb2plY3RTdGFnZShnZXREZWZhdWx0UHJvamVjdFN0YWdlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZVByb2plY3RTdGFnZShQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKHJlc3VsdC50cmltKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgUHJvamVjdFN0YWdlIGNyZWF0ZVByb2plY3RTdGFnZShQcm9qZWN0U3RhZ2VOYW1lIHByb2plY3RTdGFnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2UocHJvamVjdFN0YWdlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBQcm9qZWN0U3RhZ2VOYW1lIGdldERlZmF1bHRQcm9qZWN0U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0RGVmYXVsdFN0YWdlTmFtZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHQuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4OTViZi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkRlZmF1bHRGYWN0b3J5RmluZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeUZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlJlbmRlcmVySW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXIuUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgRXh0VmFsQ29udGV4dAotewotICAgIHByaXZhdGUgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRXh0VmFsQ29udGV4dCBleHRWYWxDb250ZXh0OwotCi0gICAgLy9kb24ndCB0cnkgdG8gcmVzb2x2ZSBpdCBkeW5hbWljYWxseSBlLmcuIHZpYSBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiAtIHRoZXJlJ3MgYSBtb2phcnJhIGlzc3VlCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9FWFRWQUxfQ09OVEVYVF9DTEFTU19OQU1FID0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuY2xhc3MuZ2V0TmFtZSgpLnJlcGxhY2UoIi5jb3JlLiIsICIuY3VzdG9tLiIpOwotCi0gICAgcHJpdmF0ZSBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7Ci0gICAgcHJpdmF0ZSBGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIgPSBEZWZhdWx0RmFjdG9yeUZpbmRlci5nZXRJbnN0YW5jZSgpOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUmVuZGVyZXJJbnRlcmNlcHRvcj4gcmVuZGVyZXJJbnRlcmNlcHRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlbmRlcmVySW50ZXJjZXB0b3I+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZGVuaWVkSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI+IHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzID0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcj4oKTsKLQotICAgIHByaXZhdGUgU2tpcFZhbGlkYXRpb25FdmFsdWF0b3Igc2tpcFZhbGlkYXRpb25FdmFsdWF0b3I7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2xvYmFsUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLCBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+Pj4gc3RhdGljQ29uZmlnTWFwCi0gICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcywgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4+KCk7Ci0KLSAgICBwcml2YXRlIEV4dFZhbENvbnRleHRJbnRlcm5hbHMgY29udGV4dEhlbHBlcjsKLSAgICBwcml2YXRlIEV4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscyBpbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXI7Ci0KLSAgICBwcm90ZWN0ZWQgRXh0VmFsQ29udGV4dCgpCi0gICAgewotICAgICAgICB0aGlzLmNvbnRleHRIZWxwZXIgPSBuZXcgRXh0VmFsQ29udGV4dEludGVybmFscygpOwotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlciA9IG5ldyBFeHRWYWxDb250ZXh0SW52b2NhdGlvbk9yZGVyQXdhcmVJbnRlcm5hbHModGhpcy5jb250ZXh0SGVscGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEV4dFZhbENvbnRleHQgZ2V0Q29udGV4dCgpCi0gICAgewotICAgICAgICBpZiAoZXh0VmFsQ29udGV4dCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBleHRWYWxDb250ZXh0ID0gbmV3IEV4dFZhbENvbnRleHQoKTsKLQotICAgICAgICAgICAgdHJ5VG9DcmVhdGVDdXN0b21FeHRWYWxDb250ZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGV4dFZhbENvbnRleHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0cnlUb0NyZWF0ZUN1c3RvbUV4dFZhbENvbnRleHQoKQotICAgIHsKLSAgICAgICAgT2JqZWN0IGN1c3RvbUV4dFZhbENvbnRleHQgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoQ1VTVE9NX0VYVFZBTF9DT05URVhUX0NMQVNTX05BTUUpOwotCi0gICAgICAgIGlmIChjdXN0b21FeHRWYWxDb250ZXh0IGluc3RhbmNlb2YgRXh0VmFsQ29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgZXh0VmFsQ29udGV4dCA9IChFeHRWYWxDb250ZXh0KSBjdXN0b21FeHRWYWxDb250ZXh0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcihWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIpCi0gICAgewotICAgICAgICBzZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoCi0gICAgICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIsIGJvb2xlYW4gZm9yY2VPdmVycmlkZSkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLnZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgPT0gbnVsbCB8fCBmb3JjZU92ZXJyaWRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpICYmIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuZ2V0Q2xhc3MoKSArICIgaXMgdXNlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyID0gdmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKQotICAgIHsKLSAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciByZXF1ZXN0U2NvcGVkSW50ZXJwcmV0ZXIgPSB0aGlzLmNvbnRleHRIZWxwZXIKLSAgICAgICAgICAgICAgICAuZ2V0UmVxdWVzdFNjb3BlZFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsKLQotICAgICAgICBpZihyZXF1ZXN0U2NvcGVkSW50ZXJwcmV0ZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RTY29wZWRJbnRlcnByZXRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzLnZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIEZhY3RvcnlGaW5kZXIKLSAgICAqLwotICAgIHB1YmxpYyBGYWN0b3J5RmluZGVyIGdldEZhY3RvcnlGaW5kZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZmFjdG9yeUZpbmRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGYWN0b3J5RmluZGVyKEZhY3RvcnlGaW5kZXIgZmFjdG9yeUZpbmRlcikKLSAgICB7Ci0gICAgICAgIGlmIChmYWN0b3J5RmluZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZmFjdG9yeUZpbmRlciA9IGZhY3RvcnlGaW5kZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoU2tpcFZhbGlkYXRpb25FdmFsdWF0b3Igc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IpCi0gICAgewotICAgICAgICBzZXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcihza2lwVmFsaWRhdGlvbkV2YWx1YXRvciwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoU2tpcFZhbGlkYXRpb25FdmFsdWF0b3Igc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IsIGJvb2xlYW4gZm9yY2VPdmVycmlkZSkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLnNraXBWYWxpZGF0aW9uRXZhbHVhdG9yID09IG51bGwgfHwgZm9yY2VPdmVycmlkZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRoaXMubG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSAmJiBza2lwVmFsaWRhdGlvbkV2YWx1YXRvciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuZ2V0Q2xhc3MoKSArICIgaXMgdXNlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5za2lwVmFsaWRhdGlvbkV2YWx1YXRvciA9IHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIGdldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLnNraXBWYWxpZGF0aW9uRXZhbHVhdG9yID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHNraXBWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksIE1ldGFEYXRhRW50cnkgZW50cnkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzLnNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUmVuZGVyZXJJbnRlcmNlcHRvcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxSZW5kZXJlckludGVyY2VwdG9yPiBnZXRSZW5kZXJlckludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxSZW5kZXJlckludGVyY2VwdG9yPih0aGlzLnJlbmRlcmVySW50ZXJjZXB0b3JzLnZhbHVlcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChFeHRWYWxDb250ZXh0LmNsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGhpcy5kZW5pZWRJbnRlcmNlcHRvcnMuY29udGFpbnMocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy5yZW5kZXJlckludGVyY2VwdG9ycy5wdXQocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCksIHJlbmRlcmVySW50ZXJjZXB0b3IpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlcmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKENsYXNzPD8gZXh0ZW5kcyBSZW5kZXJlckludGVyY2VwdG9yPiByZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpCi0gICAgewotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzcyhyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoRXh0VmFsQ29udGV4dC5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5yZW5kZXJlckludGVyY2VwdG9ycy5yZW1vdmUocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy9pZiBhbiBpbnRlcmNlcHRvciBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkIHNvIGZhciwgaXQgc2hvdWxkIGJlIGRlbmllZCBhdCBmdXR1cmUgcmVnaXN0cmF0aW9ucwotICAgIHB1YmxpYyB2b2lkIGRlbnlSZW5kZXJlckludGVyY2VwdG9yKENsYXNzPD8gZXh0ZW5kcyBSZW5kZXJlckludGVyY2VwdG9yPiByZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpCi0gICAgewotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzcyhyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoRXh0VmFsQ29udGV4dC5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCF0aGlzLmRlbmllZEludGVyY2VwdG9ycy5jb250YWlucyhyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5kZW5pZWRJbnRlcmNlcHRvcnMuYWRkKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZXJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ29tcG9uZW50SW5pdGlhbGl6ZXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIoQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdENvbXBvbmVudEluaXRpYWxpemVycygpOwotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5hZGRDb21wb25lbnRJbml0aWFsaXplcihjb21wb25lbnRJbml0aWFsaXplcik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+IGdldENvbXBvbmVudEluaXRpYWxpemVycygpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdENvbXBvbmVudEluaXRpYWxpemVycygpOwotICAgICAgICByZXR1cm4gdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuZ2V0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPiBnZXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmxhenlJbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhbGwgZ2xvYmFsIHZhbGlkYXRpb24gaW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IGdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IGdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc0ZvcihDbGFzcyBtb2R1bGVLZXkpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzRm9yKG1vZHVsZUtleSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmxhenlJbml0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGFsbCBnbG9iYWwgbWV0YS1kYXRhIGV4dHJhY3Rpb24gaW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc0ZvcihDbGFzcyBtb2R1bGVLZXkpCi0gICAgewotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgICAgICBpZihtb2R1bGVLZXkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCksIG1vZHVsZUtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc1dpdGgocHJvcGVydGllcyk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc1dpdGgoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc1dpdGgocHJvcGVydGllcyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI+IGdldFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciBwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycy5hZGQocHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbgotICAgICAqLwotICAgIHB1YmxpYyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBnZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0SGVscGVyLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTdGF0aWNDb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IGdldFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzIG5hbWUpCi0gICAgewotICAgICAgICBpZiAoIXRoaXMuc3RhdGljQ29uZmlnTWFwLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBzdGF0aWNDb25maWdMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4oKTsKLSAgICAgICAgICAgIHRoaXMuc3RhdGljQ29uZmlnTWFwLnB1dChuYW1lLCBzdGF0aWNDb25maWdMaXN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5zdGF0aWNDb25maWdNYXAuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzIG5hbWUsIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZykKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gc3RhdGljQ29uZmlnTGlzdDsKLSAgICAgICAgICAgIGlmICghdGhpcy5zdGF0aWNDb25maWdNYXAuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5zdGF0aWNDb25maWdNYXAucHV0KG5hbWUsIHN0YXRpY0NvbmZpZ0xpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5zdGF0aWNDb25maWdNYXAuZ2V0KG5hbWUpLmFkZChzdGF0aWNDb25maWcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBHbG9iYWwgcHJvcGVydGllcwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gYWRkR2xvYmFsUHJvcGVydHkobmFtZSwgdmFsdWUsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gZm9yY2VPdmVycmlkZSkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLmdsb2JhbFByb3BlcnRpZXMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghZm9yY2VPdmVycmlkZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygib3ZlcnJpZGUgZ2xvYmFsIHByb3BlcnR5ICciICsgbmFtZSArICInIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLkRldmVsb3BtZW50KSAmJiB0aGlzLmxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oImdsb2JhbCBwcm9wZXJ0eSBbIiArIG5hbWUgKyAiXSBhZGRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5nbG9iYWxQcm9wZXJ0aWVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0R2xvYmFsUHJvcGVydHkoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5nbG9iYWxQcm9wZXJ0aWVzLmdldChuYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0SW50ZXJuYWxzLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0SW50ZXJuYWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YWU4NjcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dEludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBFeHRWYWxDb250ZXh0SW50ZXJuYWxzDQotew0KLSAgICBib29sZWFuIGlzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25BY3RpdmF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gISJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NPTVBPTkVOVF9JTklUSUFMSVpBVElPTik7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gaW5pdEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKE1hcCBhcHBsaWNhdGlvbk1hcCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4pOw0KLSAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzLmFkZChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5DVVNUT01fQkVBTik7DQotDQotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbjsNCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbk1hcC5wdXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FLCBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbik7DQotICAgICAgICAgICAgICAgIHJldHVybiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICB0cnlUb0luaXRDdXN0b21Db25maWd1cmVkSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWUoYXBwbGljYXRpb25NYXApOw0KLQ0KLSAgICAgICAgaWYgKGFwcGxpY2F0aW9uTWFwLmNvbnRhaW5zS2V5KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgYXBwbGljYXRpb25NYXAuZ2V0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgdm9pZCB0cnlUb0luaXRDdXN0b21Db25maWd1cmVkSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWUoTWFwIGFwcGxpY2F0aW9uTWFwKQ0KLSAgICB7DQotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBiZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgIC5nZXRCZWFuKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkNVU1RPTV9CRUFOLnJlcGxhY2UoIi4iLCAiXyIpKTsNCi0NCi0gICAgICAgIGlmIChiZWFuICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgYXBwbGljYXRpb25NYXAucHV0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSwgYmVhbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICB7DQotICAgICAgICBNYXAgYXBwbGljYXRpb25NYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25NYXAoKTsNCi0gICAgICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGJlYW4gPSAoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4pIGFwcGxpY2F0aW9uTWFwLmdldChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUpOw0KLQ0KLSAgICAgICAgaWYgKGJlYW4gPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gaW5pdEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKGFwcGxpY2F0aW9uTWFwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBiZWFuOw0KLSAgICB9DQotDQotICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgZ2V0UmVxdWVzdFNjb3BlZFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZSgNCi0gICAgICAgICAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuY2xhc3MsIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSkNCi0gICAgICAgICAgICAgICAgLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0SW52b2NhdGlvbk9yZGVyQXdhcmVJbnRlcm5hbHMuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2M2NWU0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBFeHRWYWxDb250ZXh0SW52b2NhdGlvbk9yZGVyQXdhcmVJbnRlcm5hbHMNCi17DQotICAgIHByaXZhdGUgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyA9IG51bGw7DQotICAgIHByaXZhdGUgTWFwPENsYXNzLCBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPj4gbW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMgPSBudWxsOw0KLSAgICBwcml2YXRlIExpc3Q8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPiB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPSBudWxsOw0KLSAgICBwcml2YXRlIE1hcDxDbGFzcywgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4+IG1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPiBjb21wb25lbnRJbml0aWFsaXplcnMgPSBudWxsOw0KLQ0KLSAgICBwcml2YXRlIEV4dFZhbENvbnRleHRJbnRlcm5hbHMgY29udGV4dEhlbHBlcjsNCi0NCi0gICAgRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzKEV4dFZhbENvbnRleHRJbnRlcm5hbHMgY29udGV4dEhlbHBlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb250ZXh0SGVscGVyID0gY29udGV4dEhlbHBlcjsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBDb21wb25lbnRJbml0aWFsaXplcnMNCi0gICAgICovDQotICAgIHZvaWQgYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIoQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChjb21wb25lbnRJbml0aWFsaXplcik7DQotICAgICAgICBzb3J0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7DQotICAgIH0NCi0NCi0gICAgTGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4gZ2V0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dEhlbHBlci5pc0NvbXBvbmVudEluaXRpYWxpemF0aW9uQWN0aXZhdGVkKCkgPw0KLSAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudEluaXRpYWxpemVycyA6IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+KCk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycw0KLSAgICAgKi8NCi0gICAgdm9pZCBhZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcikNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzLmFkZCh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpOw0KLSAgICAgICAgc29ydFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsNCi0gICAgfQ0KLQ0KLSAgICBMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4gZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnM7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzDQotICAgICAqLw0KLSAgICB2b2lkIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKQ0KLSAgICB7DQotICAgICAgICBpZiAocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uTW9kdWxlQXdhcmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGVzKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsNCi0gICAgICAgICAgICBzb3J0TW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckZvck1vZHVsZShudWxsLCBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7DQotICAgICAgICAgICAgc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IGdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yczsNCi0gICAgfQ0KLQ0KLSAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBnZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IoQ2xhc3MgbW9kdWxlS2V5KQ0KLSAgICB7DQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPigpOw0KLQ0KLSAgICAgICAgcmVzdWx0LmFkZEFsbChnZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKSk7DQotDQotICAgICAgICBpZiAobW9kdWxlS2V5ICE9IG51bGwgJiYgdGhpcy5tb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5jb250YWluc0tleShtb2R1bGVLZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodGhpcy5tb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5nZXQobW9kdWxlS2V5KSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdChyZXN1bHQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckZvck1vZHVsZXMoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpDQotICAgIHsNCi0gICAgICAgIENsYXNzIG1vZHVsZUtleTsNCi0gICAgICAgIGZvciAoU3RyaW5nIGN1cnJlbnRNb2R1bGVLZXkgOiAoKFZhbGlkYXRpb25Nb2R1bGVBd2FyZSkgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpLmdldE1vZHVsZUtleXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtb2R1bGVLZXkgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShjdXJyZW50TW9kdWxlS2V5KTsNCi0NCi0gICAgICAgICAgICBpZiAobW9kdWxlS2V5ID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUobW9kdWxlS2V5LCBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlKA0KLSAgICAgICAgICAgIENsYXNzIG1vZHVsZUtleSwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpDQotICAgIHsNCi0gICAgICAgIGlmIChtb2R1bGVLZXkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5hZGQocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOw0KLQ0KLSAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQgYXMgZ2xvYmFsIGludGVyY2VwdG9yIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdDsNCi0gICAgICAgICAgICBpZiAodGhpcy5tb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5jb250YWluc0tleShtb2R1bGVLZXkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0ID0gdGhpcy5tb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5nZXQobW9kdWxlS2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4oKTsNCi0gICAgICAgICAgICAgICAgdGhpcy5tb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5wdXQobW9kdWxlS2V5LCBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QuYWRkKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsNCi0NCi0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIGZvciAiICsgbW9kdWxlS2V5LmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycw0KLSAgICAgKi8NCi0gICAgdm9pZCBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcikNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uTW9kdWxlQXdhcmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGVzKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsNCi0gICAgICAgICAgICBzb3J0TW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckZvck1vZHVsZShudWxsLCBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7DQotICAgICAgICAgICAgc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckZvck1vZHVsZXMoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpDQotICAgIHsNCi0gICAgICAgIENsYXNzIG1vZHVsZUtleTsNCi0gICAgICAgIGZvciAoU3RyaW5nIGN1cnJlbnRNb2R1bGVLZXkgOiAoKFZhbGlkYXRpb25Nb2R1bGVBd2FyZSkgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpLmdldE1vZHVsZUtleXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtb2R1bGVLZXkgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShjdXJyZW50TW9kdWxlS2V5KTsNCi0NCi0gICAgICAgICAgICBpZiAobW9kdWxlS2V5ID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUobW9kdWxlS2V5LCBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlKA0KLSAgICAgICAgICAgIENsYXNzIG1vZHVsZUtleSwgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpDQotICAgIHsNCi0gICAgICAgIGlmIChtb2R1bGVLZXkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLm1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5hZGQobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpOw0KLQ0KLSAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQgYXMgZ2xvYmFsIGludGVyY2VwdG9yIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdDsNCi0gICAgICAgICAgICBpZiAodGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5jb250YWluc0tleShtb2R1bGVLZXkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0ID0gdGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5nZXQobW9kdWxlS2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4oKTsNCi0gICAgICAgICAgICAgICAgdGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5wdXQobW9kdWxlS2V5LCBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QuYWRkKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsNCi0NCi0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIGZvciAiICsgbW9kdWxlS2V5LmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yczsNCi0gICAgfQ0KLQ0KLSAgICBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnNXaXRoKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4oKTsNCi0NCi0gICAgICAgIHJlc3VsdC5hZGRBbGwoZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkpOw0KLQ0KLSAgICAgICAgQ2xhc3MgbW9kdWxlS2V5ID0gdHJ5VG9SZXNvbHZlTW9kdWxlS2V5KHByb3BlcnRpZXMpOw0KLSAgICAgICAgaWYobW9kdWxlS2V5ICE9IG51bGwgJiYgdGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5jb250YWluc0tleShtb2R1bGVLZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5nZXQobW9kdWxlS2V5KSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdChyZXN1bHQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3MgdHJ5VG9SZXNvbHZlTW9kdWxlS2V5KE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgbW9kdWxlS2V5ID0gbnVsbDsNCi0gICAgICAgIGlmKHByb3BlcnRpZXMgIT0gbnVsbCAmJiBwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBPYmplY3QgZm91bmRWYWx1ZSA9IHByb3BlcnRpZXMuZ2V0KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICBpZihmb3VuZFZhbHVlIGluc3RhbmNlb2YgQ2xhc3MpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtb2R1bGVLZXkgPSAoQ2xhc3MpZm91bmRWYWx1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbW9kdWxlS2V5Ow0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGluaXQNCi0gICAgICovDQotDQotICAgIHZvaWQgbGF6eUluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+KCk7DQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IpOw0KLSAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKHRoaXMuY29udGV4dEhlbHBlci5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldCgNCi0gICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUikpOw0KLQ0KLSAgICAgICAgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUgOiB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA9DQotICAgICAgICAgICAgICAgICAgICAoVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycy5hZGQodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHZvaWQgbGF6eUluaXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKQ0KLSAgICB7DQotICAgICAgICBpZiAobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4oKTsNCi0gICAgICAgIG1vZHVsZVNwZWNpZmljTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzID0gbmV3IEhhc2hNYXA8Q2xhc3MsIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+PigpOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzDQotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUik7DQotICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMNCi0gICAgICAgICAgICAgICAgLmFkZCh0aGlzLmNvbnRleHRIZWxwZXIuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoDQotICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IpKTsNCi0NCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSA6IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciA9DQotICAgICAgICAgICAgICAgICAgICAoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgdm9pZCBsYXp5SW5pdENvbXBvbmVudEluaXRpYWxpemVycygpDQotICAgIHsNCi0gICAgICAgIGlmIChjb21wb25lbnRJbml0aWFsaXplcnMgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMgPSBuZXcgQXJyYXlMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPigpOw0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzDQotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9DT01QT05FTlRfSU5JVElBTElaRVIpOw0KLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzDQotICAgICAgICAgICAgICAgIC5hZGQodGhpcy5jb250ZXh0SGVscGVyLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9JTklUSUFMSVpFUikpOw0KLQ0KLSAgICAgICAgQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXI7DQotICAgICAgICBmb3IgKFN0cmluZyBjb21wb25lbnRJbml0aWFsaXplck5hbWUgOiBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXIgPQ0KLSAgICAgICAgICAgICAgICAgICAgKENvbXBvbmVudEluaXRpYWxpemVyKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY29tcG9uZW50SW5pdGlhbGl6ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoY29tcG9uZW50SW5pdGlhbGl6ZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQoY29tcG9uZW50SW5pdGlhbGl6ZXIpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShjb21wb25lbnRJbml0aWFsaXplci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICB2b2lkIGxhenlJbml0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkNCi0gICAgew0KLSAgICAgICAgaWYgKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+KCk7DQotICAgICAgICBtb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycyA9IG5ldyBIYXNoTWFwPENsYXNzLCBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPj4oKTsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICB2YWxpZGF0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzDQotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9QUk9QRVJUWV9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SKTsNCi0gICAgICAgIHZhbGlkYXRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMNCi0gICAgICAgICAgICAgICAgLmFkZCh0aGlzLmNvbnRleHRIZWxwZXIuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoDQotICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tSW5mb3JtYXRpb24uUFJPUEVSVFlfVkFMSURBVElPTl9JTlRFUkNFUFRPUikpOw0KLQ0KLSAgICAgICAgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uSW50ZXJjZXB0b3JOYW1lIDogdmFsaWRhdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA9DQotICAgICAgICAgICAgICAgICAgICAoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uSW50ZXJjZXB0b3JOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBpbnN0YW5jZW9mIFZhbGlkYXRpb25Nb2R1bGVBd2FyZSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGVzKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlKG51bGwsIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBzb3J0DQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgc29ydENvbXBvbmVudEluaXRpYWxpemVycygpDQotICAgIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQodGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMsIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPENvbXBvbmVudEluaXRpYWxpemVyPigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpDQotICAgIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQodGhpcy5wcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMsDQotICAgICAgICAgICAgICAgIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPigpKTsNCi0gICAgfQ0KLQ0KLSAgICAvL3NvcnQgYWxsIC0gaXQgaXNuJ3QgYSBodWdlIG92ZXJoZWFkIHNpbmNlIGl0J3MganVzdCBkb25lIGR1cmluZyB0aGUgaW5pdC1waGFzZQ0KLSAgICBwcml2YXRlIHZvaWQgc29ydE1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkNCi0gICAgew0KLSAgICAgICAgZm9yKExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdCA6DQotICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMudmFsdWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdChwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdCgNCi0gICAgICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QpDQotICAgIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+KCkpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc29ydFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQ0KLSAgICB7DQotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRoaXMudmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycywNCi0gICAgICAgICAgICAgICAgbmV3IEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpDQotICAgIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQodGhpcy5tZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMsDQotICAgICAgICAgICAgICAgIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPigpKTsNCi0gICAgfQ0KLQ0KLSAgICAvL3NvcnQgYWxsIC0gaXQgaXNuJ3QgYSBodWdlIG92ZXJoZWFkIHNpbmNlIGl0J3MganVzdCBkb25lIGR1cmluZyB0aGUgaW5pdC1waGFzZQ0KLSAgICBwcml2YXRlIHZvaWQgc29ydE1vZHVsZVNwZWNpZmljTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkNCi0gICAgew0KLSAgICAgICAgZm9yKExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdCA6DQotICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMudmFsdWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdCgNCi0gICAgICAgICAgICBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QpDQotICAgIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+KCkpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU1ODdhNS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFyZW4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICogKyBzb21lIG9mIHRoZW0gY2FuIGJlIGN1c3RvbWl6ZWQgd2l0aGluIGEgY3VzdG9tIGltcGwuIG9mIHRoZSBiZWFuDQotICogKGV4dGVuZCB0aGlzIGNsYXNzIGFuZCBwcm92aWRlIGl0IHZpYSBjb252ZW50aW9uIG9yIHdlYi54bWwpDQotICogPHAvPg0KLSAqIHRoZSBzdGF0aWMgYXBpIHNob3VsZCBvbmx5IGJlIHVzZWQNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSSwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVBTl9OQU1FID0gRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUNCi0gICAgICAgICsgIi4iICsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICAvL2N1c3RvbSBjbGFzcyB3aGljaCBpcyBhbiBvcHRpb25hbCByZXBsYWNlbWVudCBmb3IgdGhpcyBjbGFzcyAoaGFzIHRvIGV4dGVuZCB0aGlzIGNsYXNzKQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQkVBTiA9IChFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRQ0KLSAgICAgICAgKyAiLmN1c3RvbS4iICsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsNCi0NCi0gICAgcHVibGljIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHNldHVwQ3VzdG9taXphYmxlSW5mb3JtYXRpb24oKTsNCi0gICAgICAgIGFwcGx5Q3VzdG9tVmFsdWVzKHRoaXMuY3VzdG9taXphYmxlSW5mb3MpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPEN1c3RvbUluZm9ybWF0aW9uLCBTdHJpbmc+IGN1c3RvbWl6YWJsZUluZm9zID0gbmV3IEhhc2hNYXA8Q3VzdG9tSW5mb3JtYXRpb24sIFN0cmluZz4oKTsNCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwQ3VzdG9taXphYmxlSW5mb3JtYXRpb24oKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgYmFzZVBhY2thZ2UgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0JBU0VfUEFDS0FHRTsNCi0NCi0gICAgICAgIGlmIChiYXNlUGFja2FnZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VQYWNrYWdlID0gRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgKyAiLmN1c3RvbS4iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFiYXNlUGFja2FnZS5lbmRzV2l0aCgiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VQYWNrYWdlID0gYmFzZVBhY2thZ2UgKyAiLiI7DQotICAgICAgICB9DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQkFTRV9QQUNLQUdFLCBiYXNlUGFja2FnZSk7DQotICAgICAgICANCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiwNCi0gICAgICAgICAgICAgICAgIkNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFUcmFuc2Zvcm1lciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX0lOSVRJQUxJWkVSLA0KLSAgICAgICAgICAgICAgICAiQ29tcG9uZW50SW5pdGlhbGl6ZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlBST1BFUlRZX1ZBTElEQVRJT05fSU5URVJDRVBUT1IsDQotICAgICAgICAgICAgICAgICJQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01TR19SRVNPTFZFUl9OQU1FX01BUFBFUiwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIsDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVJUVVBfTElTVEVORVIsDQotICAgICAgICAgICAgICAgICJTdGFydHVwTGlzdGVuZXIiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkZBQ0VTX01FU1NBR0VfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIkZhY2VzTWVzc2FnZUZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIlN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSIpOw0KLQ0KLSAgICAgICAgLy9jb252ZW50aW9ucyAodGhlIHJlc3Qgb2YgdGhlIGNvbnZlbnRpb25zIGFyZSBidWlsdCB3aXRoIHRoZSBoZWxwIG9mIG5hbWUgbWFwcGVycywuLi4NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX0JVTkRMRV9OQU1FLA0KLSAgICAgICAgICAgICAgICAidmFsaWRhdGlvbl9tZXNzYWdlcyIpOw0KLSAgICAgICAgLy9zdGF0aWMgc3RyYXRlZ3kgbWFwcGluZ3MgKG5hbWUgb2YgcHJvcGVydHkgZmlsZXMpDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFLA0KLSAgICAgICAgICAgICAgICAic3RyYXRlZ3lfbWFwcGluZ3MiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIsDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIiKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pDQotICAgIHByb3RlY3RlZCB2b2lkIGFwcGx5Q3VzdG9tVmFsdWVzKE1hcDxDdXN0b21JbmZvcm1hdGlvbiwgU3RyaW5nPiBtYXApDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgdG8gY3VzdG9taXplIGluZm9ybWF0aW9uDQotICAgIH0NCi0NCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXQoQ3VzdG9tSW5mb3JtYXRpb24gY3VzdG9tSW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGN1c3RvbWl6YWJsZUluZm9zLmdldChjdXN0b21JbmZvcm1hdGlvbik7DQotDQotICAgICAgICBzd2l0Y2ggKGN1c3RvbUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNhc2UgQkFTRV9QQUNLQUdFOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgKiBwb3N0Zml4IHVzZWQgYnkgdGhlIFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi0gICAgICAgICAgICAgKiB0aGUgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBpcyBmb3IgY3VzdG9tIHN0cmF0ZWdpZXMgb25seQ0KLSAgICAgICAgICAgICAqIChub3QgZm9yIHB1YmxpYyB2YWxpZGF0aW9uIG1vZHVsZXMpDQotICAgICAgICAgICAgICogc28gaXQncyBmaW5lIHRvIGN1c3RvbWl6ZSBpdA0KLSAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgY2FzZSBWQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVg6DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0NCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9taXphYmxlSW5mb3MuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkJBU0VfUEFDS0FHRSkgKyB2YWx1ZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5Zjg2OS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2R1bGVNZXNzYWdlQnVuZGxlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuZXdQYWNrYWdlTmFtZTsNCi0gICAgICAgIGlmIChwYWNrYWdlTmFtZS5lbmRzV2l0aCgiLnJlc29sdmVyIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgbmV3UGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZS5yZXBsYWNlKCIucmVzb2x2ZXIiLCAiLmJ1bmRsZSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5ld1BhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUucmVwbGFjZSgiLnJlc29sdmVyLiIsICIuYnVuZGxlLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG5ld1BhY2thZ2VOYW1lICsgIi52YWxpZGF0aW9uX21lc3NhZ2VzIjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKA0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsICIubWVzc2FnZS5yZXNvbHZlci4iLCB0YXJnZXRDbGFzc05hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoDQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgU3RyaW5nIHRhcmdldENsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgIi5tZXRhZGF0YS50cmFuc2Zvcm1lci4iLCB0YXJnZXRDbGFzc05hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UGFja2FnZU5hbWUsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXROYW1lKCk7DQotDQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUucmVwbGFjZSgiLnN0cmF0ZWd5LiIsIHRhcmdldFBhY2thZ2VOYW1lKTsNCi0NCi0gICAgICAgIGlmICh0YXJnZXRDbGFzc05hbWUgPT0gbnVsbCB8fCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSkgKyAiLiIgKyB0YXJnZXRDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHVzZSBhIGN1c3RvbSBuYW1lIG1hcHBlciB0byBpbXBsZW1lbnQgY3VzdG9tIGNvbnZlbnRpb25zDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgIlZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB1c2UgYSBjdXN0b20gbmFtZSBtYXBwZXIgdG8gaW1wbGVtZW50IGN1c3RvbSBjb252ZW50aW9ucw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5LnJlcGxhY2UoIi5hbm5vdGF0aW9uLiIsICIuc3RyYXRlZ3kuIikgKyAiU3RyYXRlZ3kiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgIk1ldGFEYXRhVHJhbnNmb3JtZXIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0YXJnZXRQb3N0Zml4KQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5lbmRzV2l0aCgiVmFsaWRhdGlvblN0cmF0ZWd5IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneU5hbWUuc3Vic3RyaW5nKDAsIHZhbGlkYXRpb25TdHJhdGVneU5hbWUubGVuZ3RoKCkgLSAxOCkgKyB0YXJnZXRQb3N0Zml4Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5lbmRzV2l0aCgiU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5zdWJzdHJpbmcoMCwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5sZW5ndGgoKSAtIDgpICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGZmYWQ4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7DQotDQotQFRhcmdldChUWVBFKQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLS8qKg0KLSAqIGFsbG93ZWQgdG8gdXNlIGZvciBjbGFzc2VzIHdoaWNoIGltcGxlbWVudCBpbnRlcmZhY2VzIHdoaWNoIGhhdmUgdGhlIG1hcmtlciBASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLSAqDQotICogc3VnZ2VzdGVkIHJhbmdlcyAobWFpbmx5IGZvciBuYW1lLW1hcHBlcnMpOg0KLSAqIG5lZ2F0aXZlIHZhbHVlcyBmb3IgImV4dHJlbWUiIGNhc2VzDQotICoNCi0gKiAwLTQ5IGZvciBjdXN0b20gYXJ0aWZhY3RzIHdoaWNoIHNob3VsZCBoYXZlIHRoZSBoaWdoZXN0IHByaW9yaXR5DQotICogNTAtOTkgZm9yIGFkZC1vbnMgd2hpY2ggcHJvdmlkZSBhcnRpZmFjdHMgd2hpY2ggc2hvdWxkIGhhdmUgYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGUgZGVmYXVsdCBhcnRpZmFjdHMNCi0gKiAxMDAtOTk5IGludGVybmFsIGFydGlmYWN0cw0KLSAqIDEwMDArIGZvciBjdXN0b20gYXJ0aWZhY3RzDQotICoNCi0gKiBzdWdnZXN0ZWQgcmFuZ2VzIGZvciBhcnRpZmFjdHMgbGlrZSBpbnRlcmNlcHRvcnMsLi4uDQotICogMXh4IC4uLiBhcnRpZmFjdHMgb2YgdGhlIGNvcmUNCi0gKiAyeHggLi4uIGFydGlmYWN0cyBvZiB2YWxpZGF0aW9uIG1vZHVsZXMNCi0gKiAzeHggLi4uIGFydGlmYWN0cyBvZiBjb21wb25lbnQgc3VwcG9ydCBtb2R1bGVzDQotICoNCi0gKiBhIHByaW9yaXR5IHNob3VsZCBiZSB1bmlxdWUgd2l0aGluIG9uZSBhcnRpZmFjdC10eXBlIC0gdGhhdCBtZWFucw0KLSAqIGlmIGEgbmFtZS1tYXBwZXIgaGFzIHByaW9yaXR5IDEwMCwgaXQncyBvayB0aGF0IGFuIGV4Y2VwdGlvbi1pbnRlcmNlcHRvciBhbHNvIGhhcyBwcmlvcml0eSAxMDAuDQotICogYnV0IGEgMm5kIG5hbWUtbWFwcGVyIHNob3VsZG4ndCBoYXZlIHByaW9yaXR5IDEwMA0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgSW52b2NhdGlvbk9yZGVyDQotew0KLSAgICAvKioNCi0gICAgICogZGVmYXVsdCBwcmlvcml0eSBmb3IgY3VzdG9tIGFydGlmYWN0cyAoaWYgdGhleSBzaG91bGQgZ2V0IGFkZGVkIGFmdGVyIHRoZSBpbnRlcm5hbCB2ZXJzaW9ucw0KLSAgICAgKiBAcmV0dXJuIHRoZSBwcmlvcml0eSBvZiBhbiBhcnRpZmFjdCBhbm5vdGF0ZWQgd2l0aCB0aGlzIGFubm90YXRpb24NCi0gICAgICovDQotICAgIGludCB2YWx1ZSgpIGRlZmF1bHQgMTAwMDsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTgwNzFlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlckNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8VD4gaW1wbGVtZW50cyBDb21wYXJhdG9yPFQ+DQotew0KLSAgICBwdWJsaWMgaW50IGNvbXBhcmUoVCBubTEsIFQgbm0yKQ0KLSAgICB7DQotICAgICAgICBpZiAoaGFzUHJpb3JpdHkobm0xKSAmJiBoYXNQcmlvcml0eShubTIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBpc1ByaW9yaXR5SGlnaGVyKG5tMS5nZXRDbGFzcygpLmdldEFubm90YXRpb24oSW52b2NhdGlvbk9yZGVyLmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgIG5tMi5nZXRDbGFzcygpLmdldEFubm90YXRpb24oSW52b2NhdGlvbk9yZGVyLmNsYXNzKSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWhhc1ByaW9yaXR5KG5tMSkgJiYgIWhhc1ByaW9yaXR5KG5tMikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gaGFzUHJpb3JpdHkobm0xKSA/IC0xIDogMTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGludCBpc1ByaW9yaXR5SGlnaGVyKEludm9jYXRpb25PcmRlciBwcmlvcml0eTEsIEludm9jYXRpb25PcmRlciBwcmlvcml0eTIpDQotICAgIHsNCi0gICAgICAgIGlmIChwcmlvcml0eTEudmFsdWUoKSA9PSBwcmlvcml0eTIudmFsdWUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBwcmlvcml0eTEudmFsdWUoKSA8IHByaW9yaXR5Mi52YWx1ZSgpID8gLTEgOiAxOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNQcmlvcml0eShPYmplY3Qgbm0pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBubS5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoSW52b2NhdGlvbk9yZGVyLmNsYXNzKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXJTdXBwb3J0LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXJTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMzRlNzkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi0NCi1AVGFyZ2V0KFRZUEUpDQotQERvY3VtZW50ZWQNCi0vKioNCi0gKiBtYXJrZXIgYW5ub3RhdGlvbiBmb3IgZWFzaWVyIHVzYWdlDQotICogaXQgbWFya3MgaW50ZXJmYWNlcyAtIGluc3RhbmNlcyBvZiBjbGFzc2VzIGltcGxlbWVudGluZyB0aGVzZSBpbnRlcmZhY2VzIHdpbGwgYmUgc29ydGVkDQotICogQHNlZSBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotew0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Kc2ZQcm9qZWN0U3RhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0pzZlByb2plY3RTdGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmIzMGJhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0pzZlByb2plY3RTdGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBwcm9qZWN0IHN0YWdlIGVxdWl2YWxlbnQgdG8ganNmIDIuMA0KLSAqIGV4dHZhbCAyLnggaGFzIGEgc3BlY2lhbCByZXNvbHZlciB3aGljaCByZWRpcmVjdHMgdGhlIGNhbGwgdG8gdGhlIG5ldyBqc2YgYXBpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBlbnVtIEpzZlByb2plY3RTdGFnZQ0KLXsNCi0gICAgRGV2ZWxvcG1lbnQoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZSgiRGV2ZWxvcG1lbnQiKSksDQotICAgIFVuaXRUZXN0KFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoIlVuaXRUZXN0IikpLA0KLSAgICBTeXN0ZW1UZXN0KFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoIlN5c3RlbVRlc3QiKSksDQotICAgIFByb2R1Y3Rpb24oUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZSgiUHJvZHVjdGlvbiIpKTsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0U3RhZ2VOYW1lIHZhbHVlOw0KLQ0KLSAgICBKc2ZQcm9qZWN0U3RhZ2UoUHJvamVjdFN0YWdlTmFtZSB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpcyhKc2ZQcm9qZWN0U3RhZ2UganNmUHJvamVjdFN0YWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUHJvamVjdFN0YWdlLmlzKGpzZlByb2plY3RTdGFnZS5nZXRWYWx1ZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvamVjdFN0YWdlTmFtZSBnZXRWYWx1ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnZhbHVlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL05lc3RlZC5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvTmVzdGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNjkxZTguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvTmVzdGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi0NCi0vKioNCi0gKiBtYXJrZXIgYW5ub3RhdGlvbiBlLmcuIHRvIG1hcmsgc3ViLW5hbWUtbWFwcGVycw0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBOZXN0ZWQNCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1BoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9QaGFzZUlkUmVjb3JkaW5nUGhhc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjk1NTQyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1BoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5GYWNlc0luZm9ybWF0aW9uU3RvcmFnZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi0NCi0vKioNCi0gKiBlLmcuIHRvIGFsbG93IGluIG1ldGFkYXRhIGV4dHJhY3Rpb24gaW50ZXJjZXB0b3JzIHRvIGtub3cgaWYgdGhleSBhcmUgaW52b2tlZCBkdXJpbmcgdmFsaWRhdGlvbiBvcg0KLSAqIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbiAoaWYgbmVlZGVkKQ0KLSAqIGV4YW1wbGU6IGNsaWVudC1zaWRlIHZhbGlkYXRpb24gLSBzb21lIGZ1bmN0aW9uYWxpdHkgc2hvdWxkbid0IGJlIHByb2Nlc3NlZCBkdXJpbmcgcmVuZGVyaW5nDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQaGFzZUlkUmVjb3JkaW5nUGhhc2VMaXN0ZW5lciBpbXBsZW1lbnRzIFBoYXNlTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI3OTEyNDA1MTQwMTQ4Njc0NTdMOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgcGhhc2VFdmVudCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgcGhhc2VFdmVudCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UgZmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UgPSBFeHRWYWxVdGlscw0KLSAgICAgICAgICAgICAgICAuZ2V0U3RvcmFnZShGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5jbGFzcywgRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLnNldEN1cnJlbnRQaGFzZUlkKHBoYXNlRXZlbnQuZ2V0UGhhc2VJZCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuQU5ZX1BIQVNFOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKHRoaXMgPT0gbykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBQaGFzZUlkUmVjb3JkaW5nUGhhc2VMaXN0ZW5lcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmE0NDRkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotLyoqDQotICogZXh0ZW5zaWJsZSBwcm9qZWN0IHN0YWdlIGltcGxlbWVudGF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0U3RhZ2UNCi17DQotICAgIHByaXZhdGUgUHJvamVjdFN0YWdlTmFtZSB2YWx1ZTsNCi0NCi0gICAgcHJpdmF0ZSBQcm9qZWN0U3RhZ2UoUHJvamVjdFN0YWdlTmFtZSB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdFN0YWdlTmFtZSBjcmVhdGVTdGFnZU5hbWUoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVQcm9qZWN0U3RhZ2VOYW1lKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdFN0YWdlIGNyZWF0ZVN0YWdlKFByb2plY3RTdGFnZU5hbWUgbmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBQcm9qZWN0U3RhZ2UobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzKFByb2plY3RTdGFnZU5hbWUgcHJvamVjdFN0YWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0Q3VycmVudFByb2plY3RTdGFnZSgpLmVxdWFscyhwcm9qZWN0U3RhZ2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFByb2plY3RTdGFnZU5hbWUgZ2V0Q3VycmVudFByb2plY3RTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIC8vc2V0IFByb2plY3RTdGFnZVJlc29sdmVyIHRvIG51bGwgdG8gdHdlYWsgdGhlIHBlcmZvcm1hbmNlDQotICAgICAgICBPYmplY3QgcHJvamVjdFN0YWdlUmVzb2x2ZXIgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0R2xvYmFsUHJvcGVydHkoUHJvamVjdFN0YWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGlmKHByb2plY3RTdGFnZVJlc29sdmVyIGluc3RhbmNlb2YgUHJvamVjdFN0YWdlUmVzb2x2ZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICgoUHJvamVjdFN0YWdlUmVzb2x2ZXIpcHJvamVjdFN0YWdlUmVzb2x2ZXIpLmdldEN1cnJlbnRQcm9qZWN0U3RhZ2UoKS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldERlZmF1bHRTdGFnZU5hbWUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvamVjdFN0YWdlTmFtZSBnZXRWYWx1ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnZhbHVlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZU5hbWUuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZU5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQyMmI4Ni4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBQcm9qZWN0U3RhZ2VOYW1lDQotew0KLSAgICBTdHJpbmcgZ2V0TmFtZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvamVjdFN0YWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ0ZjI3YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvamVjdFN0YWdlUmVzb2x2ZXINCi17DQotICAgIFByb2plY3RTdGFnZSBnZXRDdXJyZW50UHJvamVjdFN0YWdlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1ZhbGlkYXRpb25Nb2R1bGVBd2FyZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvVmFsaWRhdGlvbk1vZHVsZUF3YXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NDIwZjUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvVmFsaWRhdGlvbk1vZHVsZUF3YXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGlmIGFuIGFydGlmYWN0ICh3aGljaCBzdXBwb3J0cyB0aGlzIGNvbmNlcHQpIHNob3VsZCBiZSB1c2VkIGp1c3QgZm9yIGEvc29tZSBzcGVjaWZpYyBtb2R1bGUocyksDQotICogdGhlIGFydGlmYWN0IGhhcyB0byBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvbk1vZHVsZUF3YXJlDQotew0KLSAgICAvKioNCi0gICAgICogZHVyaW5nIHRoZSByZWdpc3RyYXRpb24gcHJvY2VzcyB0aGUgaW5mb3JtYXRpb24gZ2V0cyBldmFsdWF0ZWQ8YnIvPg0KLSAgICAgKiBpbnN0ZWFkIG9mIGEgY2xhc3MgYXJyYXkgYSBzdHJpbmcgYXJyYXkgaXMgdXNlZCBzbyB0aGF0IGl0J3MgcG9zc2libGUgdG8gaW1wbGVtZW50DQotICAgICAqIGFuIGFydGlmYWN0IGZvciBkaWZmZXJlbnQgbW9kdWxlcy4gaWYgYW4gYWRkLW9uIHJlc3RyaWN0cyBhbiBhcnRpZmFjdCB0byBzcGVjaWZpYyBtb2R1bGVzLA0KLSAgICAgKiBub3QgYWxsIG1vZHVsZXMgaGF2ZSB0byBiZSB1c2VkIGJ5IHRoZSB3ZWJhcHAuIGlmIGEgbW9kdWxlIGtleSBpcyB1bmtub3duLCB0aGUgYXJ0aWZhY3Qgd29uJ3QgZ2V0IHJlZ2lzdGVyZWQNCi0gICAgICogZm9yIHRoaXMgbW9kdWxlLiBpZiBhbiBhcnRpZmFjdCBkb2Vzbid0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgaXQgZ2V0cyByZWdpc3RlcmVkIGZvciBhbGwgbW9kdWxlcw0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lcyBvZiB0aGUgbW9kdWxlIGtleXMNCi0gICAgICovDQotICAgIFN0cmluZ1tdIGdldE1vZHVsZUtleXMoKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvVmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvVmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDUzNDBkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1ZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLQ0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi0vKioNCi0gKiBtYXJrZXIgYW5ub3RhdGlvbiBmb3IgbW9kdWxlIGtleXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFZhbGlkYXRpb25Nb2R1bGVLZXkNCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZGI3MGUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcmVuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgLyoNCi0gICAgICogbWlzYw0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVTU0FHRV9CVU5ETEUgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVNTQUdFX0JVTkRMRSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX1BBQ0tBR0UgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9CQVNFX1BBQ0tBR0UiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fSU5GT1JNQVRJT05fUFJPVklERVJfQkVBTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OX1NUUkFURUdZX01BUFBJTkciKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fUFJPUEVSVFlfVkFMSURBVElPTl9JTlRFUkNFUFRPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1BST1BFUlRZX1ZBTElEQVRJT05fSU5URVJDRVBUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9QUk9YWV9IRUxQRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9QUk9YWV9IRUxQRVIiKTsNCi0NCi0gICAgLyoNCi0gICAgICogbmFtZSBtYXBwZXINCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIiKTsNCi0NCi0gICAgLyoNCi0gICAgICogZmlsdGVyDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIiKTsNCi0gICAgDQotICAgIC8qDQotICAgICAqIGZhY3Rvcmllcw0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9GQUNFU19NRVNTQUdFX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9GQUNFU19NRVNTQUdFX0ZBQ1RPUlkiKTsNCi0NCi0gICAgLyoNCi0gICAgICogYWN0aXZhdGUNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZBVEVfUkVRVUlSRURfSU5JVElBTElaQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkFDVElWQVRFX1JFUVVJUkVEX0lOSVRJQUxJWkFUSU9OIik7DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBkZWFjdGl2YXRlDQotICAgICAqLw0KLSAgICBARGVwcmVjYXRlZA0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfUkVOREVSS0lUID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1JFTkRFUktJVCIpOw0KLQ0KLSAgICAvL2N1cnJlbnRseSBqdXN0IHVzZWQgYnkgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0RFRkFVTFRfQ09OVkVOVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT04iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0RFRkFVTFRfTkFNRV9NQVBQRVJTID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0RFRkFVTFRfTkFNRV9NQVBQRVJTIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9DT01QT05FTlRfSU5JVElBTElaQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfQ09NUE9ORU5UX0lOSVRJQUxJWkFUSU9OIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9WQUxJREFUSU9OX1BBUkFNRVRFUlMgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfVkFMSURBVElPTl9QQVJBTUVURVJTIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9SRU5ERVJfS0lUX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfUkVOREVSX0tJVF9GQUNUT1JZIik7DQotDQotICAgIC8vdGhlcmUgaXMgbm90aGluZyBsaWtlIERFQUNUSVZBVEVfREVGQVVMVF9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SDQotICAgIC8vdXNlIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmRlbnlSZW5kZXJlckludGVyY2VwdG9yKC4uLikgd2l0aGluIGFuIGV4dHZhbC1TdGFydHVwTGlzdGVuZXINCi0NCi0gICAgLyoNCi0gICAgICogc3BlYyBwYXJhbWV0ZXJzDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSUFJFVF9FTVBUWV9TVFJJTkdfU1VCTUlUVEVEX1ZBTFVFU19BU19OVUxMID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJqYXZheC5mYWNlcyIsICJJTlRFUlBSRVRfRU1QVFlfU1RSSU5HX1NVQk1JVFRFRF9WQUxVRVNfQVNfTlVMTCIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRFX0VNUFRZX0ZJRUxEUyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiamF2YXguZmFjZXMiLCAiVkFMSURBVEVfRU1QVFlfRklFTERTIik7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0Fic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9BYnN0cmFjdEVMSGVscGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjQwNWIwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0Fic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogZGV0YWlscw0KLSAqIEBzZWUgRGVmYXVsdEVMSGVscGVyDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotICAgIHByb3RlY3RlZCBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeSBjdXN0b21FTEhlbHBlckZhY3Rvcnk7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tRUxIZWxwZXJGYWN0b3J5KEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5IGVsSGVscGVyRmFjdG9yeSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jdXN0b21FTEhlbHBlckZhY3RvcnkgPSBlbEhlbHBlckZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGZpbmFsIEVMSGVscGVyIGNyZWF0ZSgpDQotICAgIHsNCi0gICAgICAgIEVMSGVscGVyIHJlc3VsdCA9IG51bGw7DQotDQotICAgICAgICBpZih0aGlzLmN1c3RvbUVMSGVscGVyRmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuY3VzdG9tRUxIZWxwZXJGYWN0b3J5LmNyZWF0ZUVMSGVscGVyKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlRUxIZWxwZXIoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IEVMSGVscGVyIGNyZWF0ZUVMSGVscGVyKCk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYjNmMzYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsNCi1pbXBvcnQgamF2YS5pby5FeHRlcm5hbGl6YWJsZTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIGluIG9yZGVyIHRvIGNlbnRyYWxpemUgdGhlIGpzZiB2ZXJzaW9uIGRlcGVuZGVuY3kgd2l0aGluIHRoZSBjb3JlDQotICoNCi0gKiB0aGlzIGVsLWhlbHBlciBzdXBwb3J0cyBqc3AgYW5kIGZhY2VsZXRzICh0ZXN0ZWQgd2l0aCAxLjEuMTQpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIHRoZXJlIGlzIGEgc3BlY2lhbCBmYWNlbGV0cyB3b3JrYXJvdW5kIGZvciBlbC1leHByZXNzaW9ucyBvZiBjdXN0b20gY29tcG9uZW50cw0KLSAqIGl0J3MgcGx1Z2dhYmxlIGluIG9yZGVyIHRvIHN1cHBvcnQgc3BlY2lhbCBtZWNoYW5pc21zIG9mIGRpZmZlcmVudCB0ZWNobm9sb2dpZXMgKHRoYW4ganNwIGFuZCBmYWNlbGV0cykNCi0gKiBzbyB5b3UgY2FuIHBsdWcgaW4geW91ciBvd24gaW1wbC4gd2hpY2ggaW1wbGVtZW50cyBhIGN1c3RvbSB3b3JrYXJvdW5kIChsaWtlIHRoZSBmYWNlbGV0cyB3b3JrYXJvdW5kIG9mIHRoaXMgaW1wbC4pDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEVMSGVscGVyIGltcGxlbWVudHMgRUxIZWxwZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0RUxIZWxwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgLy9kdWUgdG8gYSByZXN0cmljdGlvbiB3aXRoIHRoZSByaQ0KLSAgICAgICAgT2JqZWN0IGJlYW4gPSBnZXRWYWx1ZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgcmV0dXJuIChiZWFuICE9IG51bGwpID8gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhiZWFuLmdldENsYXNzKCkpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oU3RyaW5nIGJlYW5OYW1lKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgcmV0dXJuIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmdldFZhcmlhYmxlUmVzb2x2ZXIoKS5yZXNvbHZlVmFyaWFibGUoZmFjZXNDb250ZXh0LCBiZWFuTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiAhPSBudWxsKSA/IGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgLmNyZWF0ZVZhbHVlQmluZGluZyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSkuZ2V0VmFsdWUoZmFjZXNDb250ZXh0KSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmNyZWF0ZVZhbHVlQmluZGluZyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKSAhPSBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBnZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBib29sZWFuIGFsbG93QmxhbmtDaGFyYWN0ZXJzKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IGdldE9yaWdpbmFsVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih1aUNvbXBvbmVudCk7DQotDQotICAgICAgICAvL2ZvciBpbnB1dCBjb21wb25lbnRzIHdpdGhvdXQgdmFsdWUtYmluZGluZw0KLSAgICAgICAgLy8oZS5nLiBmb3Igc3BlY2lhbCBjb21wb25lbnQgbGlicyAtPiBpc3N1ZSB3aXRoIEV4dFZhbFJlbmRlcmVyV3JhcHBlciNlbmNvZGVCZWdpbikNCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoDQotICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKSArICIgaGFzIG5vIHZhbHVlIGJpbmRpbmcgLSBjb21wb25lbnQgaWQ6ICIgKyB1aUNvbXBvbmVudC5nZXRJZCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBpZighYWxsb3dCbGFua0NoYXJhY3RlcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZSgiICIsICIiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwNCi0gICAgICAgICAgICBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKS5nZXRCYXNlRXhwcmVzc2lvbigpKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gcmVzdWx0ID0gRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyLg0KLSAgICAgICAgICAgICAgICB0cnlUb0NyZWF0ZVZhbHVlQmluZGluZ0ZvckZhY2VsZXRzQmluZGluZyh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICAgICAgaWYocmVzdWx0ID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgcmVzb2x2ZSBleHByZXNzaW9uOiAiICsgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIENsYXNzIGVudGl0eUNsYXNzID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHJlc3VsdC5nZXRCYXNlRXhwcmVzc2lvbigpKTsNCi0NCi0gICAgICAgICAgICBpZihlbnRpdHlDbGFzcyA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IHJlc29sdmUgZXhwcmVzc2lvbjogIiArIHJlc3VsdC5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICB9DQotDQotICAgIC8va2VlcCBpbiBzeW5jIHdpdGggRGVmYXVsdEVMSGVscGVyI2dldFByb3BlcnR5RGV0YWlsc1ZpYVJlZmxlY3Rpb25GYWxsYmFjayBvZiB0cnVuayEhIQ0KLSAgICBwdWJsaWMgUHJvcGVydHlEZXRhaWxzIGdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gZ2V0VmFsdWVCaW5kaW5nRXhwcmVzc2lvbih1aUNvbXBvbmVudCwgZmFsc2UpOw0KLQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9DQotICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHBhdGggPSBudWxsOw0KLQ0KLSAgICAgICAgd2hpbGUoY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHBhdGggPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHBhdGggPSBnZXRQcm9wZXJ0eU5hbWUoY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwYXRoID0gZ2V0UHJvcGVydHlOYW1lKGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKSArICIuIiArIHBhdGg7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBhdGggPSBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpICsgIi4iICsgcGF0aDsNCi0NCi0gICAgICAgIE9iamVjdCBiYXNlT2JqZWN0ID0gZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLQ0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGUuZy46ICN7YmVhbltiZWFuLnBhc3N3b3JkUmVwZWF0ZWRQcm9wZXJ0eU5hbWVdfQ0KLSAgICAgICAgLy8tPiBiZWFuLnBhc3N3b3JkUmVwZWF0ZWRQcm9wZXJ0eU5hbWUgaXMgbm90IHRoZSBmaW5hbCBwcm9wZXJ0eSBuYW1lDQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscyhwYXRoLCBiYXNlT2JqZWN0LCBnZXRQcm9wZXJ0eU5hbWUodmFsdWVCaW5kaW5nRXhwcmVzc2lvbikpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldFByb3BlcnR5TmFtZShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCk7DQotDQotICAgICAgICBpZihwcm9wZXJ0eU5hbWUuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBleHRyYWN0UHJvcGVydHlOYW1lT2ZQcm9wZXJ0eVBhdGgocHJvcGVydHlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInN1cHBvcnQgZm9yIG1vcmUgZHluYW1pYyBiaW5kaW5ncyAtIGRldGFpbHMgc2VlIGlubGluZSIpDQotICAgIHByaXZhdGUgU3RyaW5nIGV4dHJhY3RQcm9wZXJ0eU5hbWVPZlByb3BlcnR5UGF0aChTdHJpbmcgcHJvcGVydHlDaGFpbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nW10gcHJvcGVydGllcyA9IHByb3BlcnR5Q2hhaW4uc3BsaXQoIlxcLiIpOw0KLQ0KLSAgICAgICAgT2JqZWN0IGN1cnJlbnRQcm9wZXJ0eVZhbHVlID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKHByb3BlcnRpZXNbMF0pOw0KLQ0KLSAgICAgICAgTWV0aG9kIGN1cnJlbnRNZXRob2Q7DQotICAgICAgICBTdHJpbmcgY3VycmVudFByb3BlcnR5TmFtZTsNCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzc09mUHJvcGVydHlWYWx1ZTsNCi0gICAgICAgIGZvcihpbnQgaSA9IDE7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0aWVzW2ldOw0KLSAgICAgICAgICAgIGN1cnJlbnRDbGFzc09mUHJvcGVydHlWYWx1ZSA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudFByb3BlcnR5VmFsdWUuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgY3VycmVudE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZChjdXJyZW50Q2xhc3NPZlByb3BlcnR5VmFsdWUsDQotICAgICAgICAgICAgICAgICJnZXQiICsgY3VycmVudFByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIGN1cnJlbnRQcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpKTsNCi0NCi0gICAgICAgICAgICBpZihjdXJyZW50TWV0aG9kID09IG51bGwgJiYgY3VycmVudFByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBNYXApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL2l0J3Mgb2sgZm9yIHRoZSBzaW1wbGUgbWFwIGNhc2UgLSBidXQgbm90IGZvciBlLmcuOg0KLSAgICAgICAgICAgICAgICAvLyN7YmVhbjFbYmVhbjIucHJvcGVydHlOYW1lUHJvdmlkZXJbIGJlYW4zLmluZGV4XV19DQotICAgICAgICAgICAgICAgIC8vb3IgZXZlcnkgb3RoZXIgY29tcGxleCByZXBsYWNlbWVudCBmb3IgYmVhbjMuaW5kZXgNCi0gICAgICAgICAgICAgICAgLy9pdCBtaWdodCBhbHNvIHJlcXVpcmUgYW4gYWRqdXN0bWVudCBhdCBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIjdHJ5VG9UcmFuc2Zvcm1Ub1JlYWxCaW5kaW5nDQotICAgICAgICAgICAgICAgICgoTWFwKWN1cnJlbnRQcm9wZXJ0eVZhbHVlKS5nZXQoY3VycmVudFByb3BlcnR5TmFtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eVZhbHVlID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKGN1cnJlbnRQcm9wZXJ0eVZhbHVlLCBjdXJyZW50TWV0aG9kKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZihjdXJyZW50UHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFN0cmluZyljdXJyZW50UHJvcGVydHlWYWx1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoInVuZXhwZWN0ZWQgdmFsdWUgd2l0aGluIG1hcCBzeW50YXg6ICIgKyBwcm9wZXJ0eUNoYWluICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGxhc3QgcHJvcGVydHkgbmFtZTogIiArIGN1cnJlbnRQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgc3RhdGljIFN0cmluZyBnZXRPcmlnaW5hbFZhbHVlQmluZGluZ0V4cHJlc3Npb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZyB2YWx1ZUV4cHJlc3Npb24gPSB1aUNvbXBvbmVudC5nZXRWYWx1ZUJpbmRpbmcoInZhbHVlIik7DQotDQotICAgICAgICByZXR1cm4gKHZhbHVlRXhwcmVzc2lvbiAhPSBudWxsKSA/IHZhbHVlRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtV2VsbEZvcm1lZChPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBWYWx1ZUJpbmRpbmcgfHwgbyBpbnN0YW5jZW9mIEV4dGVybmFsaXphYmxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBzID0gby50b1N0cmluZygpOw0KLSAgICAgICAgcmV0dXJuICgocy5jb250YWlucygiIyIpIHx8IHMuY29udGFpbnMoIiQiKSkgJiYgcy5jb250YWlucygieyIpICYmIHMuY29udGFpbnMoIn0iKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRCaW5kaW5nT2ZDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQuZ2V0VmFsdWVCaW5kaW5nKG5hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmZTU2Yy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRFTEhlbHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeQ0KLXsNCi0gICAgcHJpdmF0ZSBFTEhlbHBlciBlbEhlbHBlciA9IG5ldyBEZWZhdWx0RUxIZWxwZXIoKTsNCi0gICAgDQotICAgIHByb3RlY3RlZCBFTEhlbHBlciBjcmVhdGVFTEhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmVsSGVscGVyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FTEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWIyNTUzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogaW4gb3JkZXIgdG8gY2VudHJhbGl6ZSB0aGUganNmIHZlcnNpb24gZGVwZW5kZW5jeSB3aXRoaW4gdGhlIGNvcmUNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRUxIZWxwZXINCi17DQotICAgIE9iamVjdCBnZXRCZWFuKFN0cmluZyBiZWFuTmFtZSk7DQotDQotICAgIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLQ0KLSAgICBDbGFzcyBnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCk7DQotDQotICAgIGJvb2xlYW4gaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIGJvb2xlYW4gaXNFTFRlcm1XZWxsRm9ybWVkKE9iamVjdCBvKTsNCi0NCi0gICAgT2JqZWN0IGdldEJpbmRpbmdPZkNvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgU3RyaW5nIG5hbWUpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0ZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjE2MWIzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0ZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0Ow0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi0vKioNCi0gKiBIZWxwZXIgY2xhc3MgdG8gZ2V0IHRoZSByZWFsL2Z1bGwgdmFsdWUgYmluZGluZyAtIHRlc3RlZCB3aXRoIGZhY2VsZXRzIDEuMS4xNA0KLSAqIFRoZSB0YXJnZXQgaXMgdG8gZ2V0IHJpZCBvZiB0aGlzIGltcGwuIC0gY3VycmVudGx5IGl0J3MgYSB3b3JrYXJvdW5kIHRvIHN1cHBvcnQgY3VzdG9tIGZhY2VsZXRzIGNvbXBvbmVudHMuDQotICogQW4gYWx0ZXJuYXRpdmUgd291bGQgYmUgYW4gRUwtUmVzb2x2ZXIgLSB0aGVyZSBhcmUgc3RpbGwgc29tZSBvcGVuIGlzc3VlcyB3aXRoIHN1Y2ggYW4gYXBwcm9hY2gNCi0gKiArIEl0IGlzbid0IGF2YWlsYWJsZSB3aXRoIEpTRiAxLjEueA0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB0cnlUb0NyZWF0ZVZhbHVlQmluZGluZ0ZvckZhY2VsZXRzQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGZhY2VsZXRzVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IERlZmF1bHRFTEhlbHBlci5nZXRPcmlnaW5hbFZhbHVlQmluZGluZ0V4cHJlc3Npb24odWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGZvdW5kQmluZGluZ3MgPSBleHRyYWN0RUxUZXJtcygNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCaW5kaW5nT2ZDb21wb25lbnQodWlDb21wb25lbnQsICJ2YWx1ZSIpKTsNCi0NCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcHBlZEZhY2VsZXRzVmFycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmJlPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24NCi0gICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgMSkgKyAieyIgKyBjcmVhdGVCaW5kaW5nKGZvdW5kQmluZGluZ3MsIG1hcHBlZEZhY2VsZXRzVmFycykgKyAifSIpOw0KLQ0KLSAgICAgICAgICAgIENsYXNzIGVudGl0eUNsYXNzID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZiZS5nZXRCYXNlRXhwcmVzc2lvbigpKTsNCi0NCi0gICAgICAgICAgICBpZihlbnRpdHlDbGFzcyA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRyeVRvUmVwbGFjZVZhcnModmJlLCBtYXBwZWRGYWNlbGV0c1ZhcnMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gdmJlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNyZWF0ZUJpbmRpbmcoTGlzdDxTdHJpbmc+IGV4cHJlc3Npb25zLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHZpcnR1YWxWYXJzKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VycmVudEJpbmRpbmc7DQotDQotICAgICAgICBpbnQgaW5kZXhPZkJpbmRpbmdEZXRhaWxzOw0KLSAgICAgICAgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBleHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aCgiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZvdW5kQmluZGluZ0RldGFpbHMgPSBlbnRyeS5zcGxpdCgiICIpOw0KLSAgICAgICAgICAgIGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoZm91bmRCaW5kaW5nRGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9PSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBiaW5kaW5nRGV0YWlscyA9IGZvdW5kQmluZGluZ0RldGFpbHNbaW5kZXhPZkJpbmRpbmdEZXRhaWxzXS5zcGxpdCgiPSIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nRGV0YWlscy5sZW5ndGggPCAyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYmluZGluZ0RldGFpbHNbMV07DQotDQotICAgICAgICAgICAgLy90byBzdXBwb3J0IGJsYW5rcyB3aXRoaW4gYSBiaW5kaW5nIHdpdGggbWFwIHN5bnRheA0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgJiYgIWN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoY3VycmVudEJpbmRpbmcsIGZvdW5kQmluZGluZ0RldGFpbHMsIGluZGV4T2ZCaW5kaW5nRGV0YWlscyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9lbnRyeSBmb3IgInZpcnR1YWwiIGZhY2VsZXRzIGJlYW5zDQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWluc0tleShiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLnB1dChiaW5kaW5nRGV0YWlsc1swXSwgY3VycmVudEJpbmRpbmcpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICBpZighKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgfHwgY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2aXJ0dWFsVmFycy5wdXQoYmluZGluZ0RldGFpbHNbMF0sIGJpbmRpbmdEZXRhaWxzWzFdLnN1YnN0cmluZygxLCBiaW5kaW5nRGV0YWlsc1sxXS5sZW5ndGgoKS0yKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIG9yaWdpbmFsQmluZGluZyA9IGFkZGVkVmlydHVhbE5hbWVzLmdldCgidmFsdWUiKTsNCi0gICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5zdWJzdHJpbmcob3JpZ2luYWxCaW5kaW5nLmluZGV4T2YoInsiKSArIDEsIG9yaWdpbmFsQmluZGluZy5pbmRleE9mKCJ9IikpOw0KLSAgICAgICAgYWRkZWRWaXJ0dWFsTmFtZXMucmVtb3ZlKCJ2YWx1ZSIpOw0KLSAgICAgICAgcmV0dXJuIHRyeVRvVHJhbnNmb3JtVG9SZWFsQmluZGluZyhvcmlnaW5hbEJpbmRpbmcsIGFkZGVkVmlydHVhbE5hbWVzLCB2aXJ0dWFsVmFycyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRyeVRvVHJhbnNmb3JtVG9SZWFsQmluZGluZygNCi0gICAgICAgICAgICBTdHJpbmcgb3JpZ2luYWxCaW5kaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZGVkVmlydHVhbE5hbWVzLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHZpcnR1YWxWYXJzKQ0KLSAgICB7DQotICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSAiI3siICsgb3JpZ2luYWxCaW5kaW5nICsgIn0iOw0KLSAgICAgICAgSXRlcmF0b3IgbmFtZUl0ZXJhdG9yID0gYWRkZWRWaXJ0dWFsTmFtZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsNCi0NCi0gICAgICAgIFN0cmluZyBjdXJyZW50S2V5Ow0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRWYWx1ZTsNCi0gICAgICAgIHdoaWxlKG5hbWVJdGVyYXRvci5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudEtleSA9IChTdHJpbmcpIG5hbWVJdGVyYXRvci5uZXh0KCk7DQotDQotICAgICAgICAgICAgY3VycmVudFZhbHVlID0gYWRkZWRWaXJ0dWFsTmFtZXMuZ2V0KGN1cnJlbnRLZXkpOw0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoY3VycmVudFZhbHVlLmluZGV4T2YoInsiKSArIDEsIGN1cnJlbnRWYWx1ZS5pbmRleE9mKCJ9IikpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJ7IiArIGN1cnJlbnRLZXkgKyAiLiIsICJ7IiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoInsiICsgY3VycmVudEtleSArICJbIiwgInsiICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiLiIgKyBjdXJyZW50S2V5ICsgIi4iLCAiLiIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCIuIiArIGN1cnJlbnRLZXkgKyAiWyIsICIuIiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIlsiICsgY3VycmVudEtleSArICJdIiwgIlsnIiArIGN1cnJlbnRWYWx1ZSArICInXSIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiWyIsICJbIiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIlsiICsgY3VycmVudEtleSArICIuIiwgIlsiICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG5hbWVJdGVyYXRvciA9IHZpcnR1YWxWYXJzLmtleVNldCgpLml0ZXJhdG9yKCk7DQotDQotICAgICAgICB3aGlsZShuYW1lSXRlcmF0b3IuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRLZXkgPSAoU3RyaW5nKSBuYW1lSXRlcmF0b3IubmV4dCgpOw0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IHZpcnR1YWxWYXJzLmdldChjdXJyZW50S2V5KTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIi4iLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJ7IiArIGN1cnJlbnRLZXkgKyAiWyIsICJ7IiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICIuIiwgIi4iICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiLiIgKyBjdXJyZW50S2V5ICsgIlsiLCAiLiIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiXSIsICJbJyIgKyBjdXJyZW50VmFsdWUgKyAiJ10iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIlsiLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiLiIsICJbIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gb3JpZ2luYWxCaW5kaW5nLnN1YnN0cmluZygyLCBvcmlnaW5hbEJpbmRpbmcubGVuZ3RoKCkgLSAxKTsNCi0gICAgfQ0KLQ0KLSAgICAvL3RvIHN1cHBvcnQgYmxhbmtzIC0gZS5nLiB3aXRoIG1hcCBzeW50YXgNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoU3RyaW5nIGN1cnJlbnRCaW5kaW5nLCBTdHJpbmdbXSBmb3VuZEJpbmRpbmdEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhPZkJpbmRpbmdEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBmb3IoaW50IGkgPSBpbmRleE9mQmluZGluZ0RldGFpbHMgKyAxOyBpIDwgZm91bmRCaW5kaW5nRGV0YWlscy5sZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50QmluZGluZyArPSBmb3VuZEJpbmRpbmdEZXRhaWxzW2ldOw0KLSAgICAgICAgICAgIGlmKGZvdW5kQmluZGluZ0RldGFpbHNbaV0uY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50QmluZGluZzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY3VycmVudEJpbmRpbmc7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoU3RyaW5nW10gYmluZGluZ0RldGFpbHMpDQotICAgIHsNCi0gICAgICAgIGludCBjb3VudCA9IDA7DQotICAgICAgICBmb3IgKFN0cmluZyBlbnRyeSA6IGJpbmRpbmdEZXRhaWxzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbnRyeS5jb250YWlucygiPSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjb3VudCsrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBleHRyYWN0RUxUZXJtcyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGZvdW5kRUxUZXJtcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHJlc29sdmVFTFRlcm1zKG8sIG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpLCBmb3VuZEVMVGVybXMsIDApID4gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZEVMVGVybXM7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGludCByZXNvbHZlRUxUZXJtcyhPYmplY3QgbywgTWFwPE9iamVjdCwgT2JqZWN0PiB2aXNpdGVkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGZvdW5kRUxUZXJtcywgaW50IGNvdW50KSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChvID09IG51bGwgfHwgdmlzaXRlZC5jb250YWluc0tleShvKSB8fCBjb3VudCA+IDUwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdmlzaXRlZC5wdXQobywgbnVsbCk7DQotDQotICAgICAgICBpbnQgZWxDb3VudCA9IDA7DQotICAgICAgICBDbGFzcyBjID0gby5nZXRDbGFzcygpOw0KLQ0KLSAgICAgICAgLy9pbnNwZWN0IG1hcHMNCi0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgTWFwKQ0KLSAgICAgICAgew0KLQ0KLSAgICAgICAgICAgIGZvciAoT2JqZWN0IGVudHJ5IDogKChNYXApIG8pLnZhbHVlcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9mb3VuZCBlbnRyeSBmb3IgInZpcnR1YWwiIGZhY2VsZXRzIHZhcg0KLSAgICAgICAgICAgICAgICBpZihlbnRyeS50b1N0cmluZygpLmNvbnRhaW5zKCJWYWx1ZUV4cHJlc3Npb25bIikpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kRUxUZXJtcy5hZGQoZW50cnkudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxDb3VudCArPSByZXNvbHZlRUxUZXJtcyhlbnRyeSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gZWxDb3VudDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChvKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiArK2VsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2FuYWx5emUgYXJyYXlzDQotICAgICAgICBpZiAoYy5pc0FycmF5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW50IGxlbmd0aCA9IEFycmF5LmdldExlbmd0aChvKTsNCi0gICAgICAgICAgICAvL2NoZWNrIGFycmF5IFtMIC0+IG5vIGFycmF5IG9mIHByaW1pdGl2ZSB0eXBlcw0KLSAgICAgICAgICAgIGlmIChvLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiW0wiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChvLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiW0xqYXZhLmxhbmcuU3RyaW5nIikpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKEFycmF5LmdldChvLCBpKSkpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kRUxUZXJtcy5hZGQoby50b1N0cmluZygpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbENvdW50Kys7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoQXJyYXkuZ2V0KG8sIGkpLCB2aXNpdGVkLCBmb3VuZEVMVGVybXMsIGNvdW50ICsgMSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGVsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PEZpZWxkPiBhdHRyaWJ1dGVzID0gZmluZEFsbEF0dHJpYnV0ZXMoYywgbmV3IEFycmF5TGlzdDxGaWVsZD4oKSk7DQotICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGF0dHJpYnV0ZXMudG9BcnJheShuZXcgRmllbGRbYXR0cmlidXRlcy5zaXplKCldKTsNCi0NCi0gICAgICAgIEFjY2Vzc2libGVPYmplY3Quc2V0QWNjZXNzaWJsZShmaWVsZHMsIHRydWUpOw0KLSAgICAgICAgZm9yIChGaWVsZCBjdXJyZW50RmllbGQgOiBmaWVsZHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5nZXQobykgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmdldFR5cGUoKS5lcXVhbHMoU3RyaW5nLmNsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQuZ2V0KG8pICE9IG51bGwgJiYgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQoY3VycmVudEZpZWxkLmdldChvKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZEVMVGVybXMgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBlbENvdW50Kys7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZiAoIWN1cnJlbnRGaWVsZC5nZXRUeXBlKCkuaXNQcmltaXRpdmUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoY3VycmVudEZpZWxkLmdldChvKSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBlbENvdW50Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8RmllbGQ+IGZpbmRBbGxBdHRyaWJ1dGVzKENsYXNzIGMsIExpc3Q8RmllbGQ+IGF0dHJpYnV0ZXMpDQotICAgIHsNCi0gICAgICAgIGlmIChjID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7DQotICAgICAgICB9DQotICAgICAgICBmaW5kQWxsQXR0cmlidXRlcyhjLmdldFN1cGVyY2xhc3MoKSwgYXR0cmlidXRlcyk7DQotDQotICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGMuZ2V0RGVjbGFyZWRGaWVsZHMoKTsNCi0gICAgICAgIGZvciAoRmllbGQgY3VycmVudEZpZWxkIDogZmllbGRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghTW9kaWZpZXIuaXNTdGF0aWMoY3VycmVudEZpZWxkLmdldE1vZGlmaWVycygpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKGN1cnJlbnRGaWVsZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB0cnlUb1JlcGxhY2VWYXJzKFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcHBlZEZhY2VsZXRzVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5Ow0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOw0KLSAgICAgICAgYm9vbGVhbiBsYXN0ID0gZmFsc2U7DQotDQotICAgICAgICB3aGlsZSh0cnVlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbGFzdCA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLQ0KLQ0KLSAgICAgICAgICAgIHByb3BlcnR5ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpOw0KLQ0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgIC5yZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgZ2V0TmV3UHJvcGVydHkocHJvcGVydHksIG1hcHBlZEZhY2VsZXRzVmFycykpOw0KLQ0KLSAgICAgICAgICAgIGlmKHJlc3VsdC5sZW5ndGgoKSA9PSAwKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkgKyAiLiIgKyByZXN1bHQ7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCk7DQotDQotICAgICAgICAgICAgaWYobGFzdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByZWZpeCgpICsgInsiICsgcmVzdWx0ICsgIn0iKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmV3UHJvcGVydHkoU3RyaW5nIG9sZFByb3BlcnR5LCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcHBlZEZhY2VsZXRzVmFycykNCi0gICAgew0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZpcnR1YWxWYXJzID0gZ2V0UG90ZW50aWFsVmlydHVhbFZhcnMob2xkUHJvcGVydHkpOw0KLQ0KLSAgICAgICAgZm9yKFN0cmluZyB2aXJ0dWFsVmFyIDogdmlydHVhbFZhcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobWFwcGVkRmFjZWxldHNWYXJzLmNvbnRhaW5zS2V5KHZpcnR1YWxWYXIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgb2xkUHJvcGVydHkgPSByZXBsYWNlUHJvcGVydHlWYWx1ZShvbGRQcm9wZXJ0eSwgdmlydHVhbFZhciwgbWFwcGVkRmFjZWxldHNWYXJzLmdldCh2aXJ0dWFsVmFyKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG9sZFByb3BlcnR5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRQb3RlbnRpYWxWaXJ0dWFsVmFycyhTdHJpbmcgb2xkUHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGludCBzdGFydCA9IC0xOw0KLSAgICAgICAgaW50IGVuZCA9IC0xOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZpcnR1YWxWYXJMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgb2xkUHJvcGVydHkubGVuZ3RoKCk7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihzdGFydCA9PSAtIDEgJiYgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICdbJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYoKHN0YXJ0ICE9IC0gMSAmJiBvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ1snKSB8fCBvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ10nKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZW5kID0gaTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYoc3RhcnQgIT0gLTEgJiYgZW5kICE9IC0xKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhckxpc3QuYWRkKG9sZFByb3BlcnR5LnN1YnN0cmluZyhzdGFydCwgZW5kKSk7DQotICAgICAgICAgICAgICAgIGlmKG9sZFByb3BlcnR5LmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IC0xOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVuZCA9IC0xOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB2aXJ0dWFsVmFyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVwbGFjZVByb3BlcnR5VmFsdWUoU3RyaW5nIG9sZFByb3BlcnR5LCBTdHJpbmcgdGFyZ2V0VmFyLCBTdHJpbmcgbmV3VmFsdWUpDQotICAgIHsNCi0gICAgICAgIGludCBpbmRleCA9IG9sZFByb3BlcnR5LmluZGV4T2YodGFyZ2V0VmFyKTsNCi0NCi0gICAgICAgIGlmKGluZGV4ID09IC0xKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBvbGRQcm9wZXJ0eTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoMCwgaW5kZXgpOw0KLSAgICAgICAgcmVzdWx0ICs9IG5ld1ZhbHVlOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdCArIG9sZFByb3BlcnR5LnN1YnN0cmluZyhpbmRleCArIHRhcmdldFZhci5sZW5ndGgoKSwgb2xkUHJvcGVydHkubGVuZ3RoKCkpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHJlcGxhY2UgdmlydHVhbCBmYWNlbGV0cyB2YXJzIChtYXAgc3ludGF4KQ0KLSAgICAgKiB0ZXN0ZWQgc3R5bGVzIChzaW1wbGUgYW5kIG5lc3RlZCk6IHRlc3RbaXhbaXgyW2l4M11dXQ0KLSAgICAgKi8NCi0gICAgLyoNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIF9jcmVhdGVCaW5kaW5nKExpc3Q8U3RyaW5nPiBleHByZXNzaW9ucywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOw0KLQ0KLSAgICAgICAgU3RyaW5nIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRCaW5kaW5nOw0KLSAgICAgICAgU3RyaW5nIHBhcnRPZkJpbmRpbmc7DQotDQotICAgICAgICBpbnQgaW5kZXhPZkJpbmRpbmdEZXRhaWxzOw0KLSAgICAgICAgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGFkZGVkVmlydHVhbE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBlbnRyeSA6IGV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbnRyeS5zdGFydHNXaXRoKCJWYWx1ZUV4cHJlc3Npb25bIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgZm91bmRCaW5kaW5nRGV0YWlscyA9IGVudHJ5LnNwbGl0KCIgIik7DQotICAgICAgICAgICAgaW5kZXhPZkJpbmRpbmdEZXRhaWxzID0gZmluZEluZGV4T2ZCaW5kaW5nRGV0YWlscyhmb3VuZEJpbmRpbmdEZXRhaWxzKTsNCi0NCi0gICAgICAgICAgICBpZiAoaW5kZXhPZkJpbmRpbmdEZXRhaWxzID09IC0xKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGJpbmRpbmdEZXRhaWxzID0gZm91bmRCaW5kaW5nRGV0YWlsc1tpbmRleE9mQmluZGluZ0RldGFpbHNdLnNwbGl0KCI9Iik7DQotDQotICAgICAgICAgICAgaWYgKGJpbmRpbmdEZXRhaWxzLmxlbmd0aCA8IDIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgPSBiaW5kaW5nRGV0YWlsc1sxXTsNCi0NCi0gICAgICAgICAgICAvL3RvIHN1cHBvcnQgYmxhbmtzIHdpdGhpbiBhIGJpbmRpbmcgd2l0aCBtYXAgc3ludGF4DQotICAgICAgICAgICAgaWYoY3VycmVudEJpbmRpbmcuY29udGFpbnMoInsiKSAmJiAhY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYWRkRnVydGhlckJpbmRpbmdQYXJ0cyhjdXJyZW50QmluZGluZywgZm91bmRCaW5kaW5nRGV0YWlscywgaW5kZXhPZkJpbmRpbmdEZXRhaWxzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUgIT0gbnVsbCAmJiBjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9lbnRyeSBmb3IgInZpcnR1YWwiIGZhY2VsZXRzIGJlYW5zDQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWlucyhiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHBhcnRPZkJpbmRpbmcgPSBjdXJyZW50QmluZGluZy5zdWJzdHJpbmcoY3VycmVudEJpbmRpbmcuaW5kZXhPZihwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgcHJldkZhY2VsZXRzQXR0cmlidXRlTmFtZS5sZW5ndGgoKSwgY3VycmVudEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLmFkZChiaW5kaW5nRGV0YWlsc1swXSk7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBwYXJ0T2ZCaW5kaW5nOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy9lbnRyeSBmb3IgInZpcnR1YWwiIGZhY2VsZXRzIHZhcg0KLSAgICAgICAgICAgIGVsc2UgaWYoIShjdXJyZW50QmluZGluZy5jb250YWlucygieyIpIHx8IGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhcnMucHV0KGJpbmRpbmdEZXRhaWxzWzBdLCBiaW5kaW5nRGV0YWlsc1sxXS5zdWJzdHJpbmcoMSwgYmluZGluZ0RldGFpbHNbMV0ubGVuZ3RoKCktMikpOw0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoIWFkZGVkVmlydHVhbE5hbWVzLmNvbnRhaW5zKGJpbmRpbmdEZXRhaWxzWzBdKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYWRkZWRWaXJ0dWFsTmFtZXMuYWRkKGJpbmRpbmdEZXRhaWxzWzBdKTsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGN1cnJlbnRCaW5kaW5nLnN1YnN0cmluZyhjdXJyZW50QmluZGluZy5pbmRleE9mKCJ7IikgKyAxLCBjdXJyZW50QmluZGluZy5pbmRleE9mKCJ9IikpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUgPSBiaW5kaW5nRGV0YWlsc1swXTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0gICAgKi8NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzhlYjY2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiZGlmZmVyZW5jZSBiZXR3ZWVuIFsgYW5kIFsnIC0gdGVzdCB3aXRoIG1vcmUgY29uc3RlbGxhdGlvbnMiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSX0pDQotcHVibGljIGNsYXNzIFZhbHVlQmluZGluZ0V4cHJlc3Npb24NCi17DQotICAgIHByaXZhdGUgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBiYXNlOw0KLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJlZml4Ow0KLSAgICBwcml2YXRlIFN0cmluZyB0b2tlbjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlcGxhY2VPckFkZFByb3BlcnR5KFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuZXdQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gcmVwbGFjZVByb3BlcnR5KFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIC8vVE9ETyBhZGp1c3RtZW50cyBmb3IgaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5DQotICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkuZW5kc1dpdGgoIiddIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCksIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBhZGRQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIFN0cmluZyBuZXdQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUV4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzb3VyY2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBzb3VyY2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSk7DQotDQotICAgICAgICAvL1RPRE8gYWRqdXN0bWVudHMgZm9yIGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eQ0KLSAgICAgICAgaWYobmV3UHJvcGVydHkuc3RhcnRzV2l0aCgiWyciKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ocmVzdWx0ICsgbmV3UHJvcGVydHkgKyAifSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihyZXN1bHQgKyAiLiIgKyBuZXdQcm9wZXJ0eSArICJ9Iik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24oU3RyaW5nIGV4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIGlmKCFFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChleHByZXNzaW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGV4cHJlc3Npb24gKyAiIGlzIG5vIHZhbGlkIGVsLWV4cHJlc3Npb24iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGJvb2xlYW4gaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5ID0gZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiJ10iKSA9PSAtMTsNCi0gICAgICAgIGludCBpbmRleDEgPSBpc0R5bmFtaWNCYXNlQW5kUHJvcGVydHkgPyBleHByZXNzaW9uLmxhc3RJbmRleE9mKCJdIikgOiBleHByZXNzaW9uLmxhc3RJbmRleE9mKCInXSIpOw0KLSAgICAgICAgaW50IGluZGV4MiA9IGV4cHJlc3Npb24ubGFzdEluZGV4T2YoIi4iKTsNCi0NCi0gICAgICAgIGlmKGluZGV4MSA+IGluZGV4MikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgxKTsNCi0NCi0gICAgICAgICAgICBpbnQgaW5kZXgzID0gZmluZEluZGV4T2ZTdGFydGluZ0JyYWNrZXQoZXhwcmVzc2lvbik7DQotICAgICAgICAgICAgaWYoaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKGluZGV4MyArIDEsIGluZGV4MSk7DQotDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZyhpbmRleDMgKyAyLCBpbmRleDEpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB0aGlzLmJhc2UgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihleHByZXNzaW9uLnN1YnN0cmluZygwLCBpbmRleDMpICsgIn0iKTsNCi0gICAgICAgICAgICB0aGlzLnRva2VuID0gaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5ID8gIlsiIDogIlsnIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoIGluZGV4MiA+IGluZGV4MSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoaW5kZXgyICsgMSwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEgKTsNCi0gICAgICAgICAgICB0aGlzLmJhc2UgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihleHByZXNzaW9uLnN1YnN0cmluZygwLCBpbmRleDIpICsgIn0iKTsNCi0gICAgICAgICAgICB0aGlzLnRva2VuID0gIi4iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZygyLCBleHByZXNzaW9uLmxlbmd0aCgpIC0gMSk7DQotICAgICAgICAgICAgdGhpcy5wcmVmaXggPSBleHByZXNzaW9uLnN1YnN0cmluZygwLCAxKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUudHJpbSgpOw0KLSAgICAgICAgDQotICAgICAgICBpZigiWyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMudmFsdWUuc3RhcnRzV2l0aCgiJyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUuc3Vic3RyaW5nKDEsIHRoaXMudmFsdWUubGVuZ3RoKCkgLSAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy9yZXR1cm4gdGhpcy5iYXNlLnZhbHVlICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUuc3Vic3RyaW5nKDAsIHRoaXMudmFsdWUubGVuZ3RoKCkpICsgIiddIjsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBnZXRCYXNlRXhwcmVzc2lvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBiYXNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwcmVzc2lvblN0cmluZygpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMuYmFzZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBiYXNlRXhwcmVzc2lvbiA9IHRoaXMuYmFzZS5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotDQotICAgICAgICAgICAgaWYoIlsnIi5lcXVhbHModGhpcy50b2tlbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGJhc2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSkgKyB0aGlzLnRva2VuICsgdGhpcy52YWx1ZSArICInXX0iOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKCJbIi5lcXVhbHModGhpcy50b2tlbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGJhc2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSkgKyB0aGlzLnRva2VuICsgdGhpcy52YWx1ZSArICJdfSI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBiYXNlRXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgYmFzZUV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKSArIHRoaXMudG9rZW4gKyB0aGlzLnZhbHVlICsgIn0iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLnByZWZpeCArICJ7IiArIHRoaXMudmFsdWUgKyAifSI7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlLmdldFByZWZpeCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBwcmVmaXg7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMuYmFzZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuYmFzZS5zZXRQcmVmaXgocHJlZml4KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXhwcmVzc2lvblN0cmluZygpLmhhc2hDb2RlKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiAmJiBnZXRFeHByZXNzaW9uU3RyaW5nKCkNCi0gICAgICAgICAgICAuZXF1YWxzKCgoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbikgdGFyZ2V0KS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgaW50IGZpbmRJbmRleE9mU3RhcnRpbmdCcmFja2V0KFN0cmluZyBleHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBpbnQgY2xvc2VDb3VudCA9IDA7DQotICAgICAgICBmb3IoaW50IGkgPSBleHByZXNzaW9uLmxlbmd0aCgpIC0gMTsgaSA+IDA7IGktLSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihleHByZXNzaW9uLmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjbG9zZUNvdW50LS07DQotICAgICAgICAgICAgICAgIGlmKGNsb3NlQ291bnQgPCAwKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKGV4cHJlc3Npb24uY2hhckF0KGkpID09ICddJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNsb3NlQ291bnQrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0Fic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMxMDBiMy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0Fic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFQ+IGltcGxlbWVudHMgTmFtZU1hcHBlckF3YXJlRmFjdG9yeTxOYW1lTWFwcGVyPFQ+Pg0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PENsYXNzPiBkZW5pZWROYW1lTWFwcGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWdpc3RlcihOYW1lTWFwcGVyPFQ+IG5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIGlmKCFkZW5pZWROYW1lTWFwcGVyTGlzdC5jb250YWlucyhuYW1lTWFwcGVyLmdldENsYXNzKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGdldE5hbWVNYXBwZXJMaXN0KCkuYWRkKG5hbWVNYXBwZXIpOw0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoZ2V0TmFtZU1hcHBlckxpc3QoKSwgZ2V0Q29tcGFyYXRvcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgQ29tcGFyYXRvcjxOYW1lTWFwcGVyPFQ+PiBnZXRDb21wYXJhdG9yKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPE5hbWVNYXBwZXI8VD4+KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRlcmVnaXN0ZXIoQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IGNsYXNzVG9EZXJlZ2lzdGVyKQ0KLSAgICB7DQotICAgICAgICBJdGVyYXRvcjxOYW1lTWFwcGVyPFQ+PiBuYW1lTWFwcGVySXRlcmF0b3IgPSBnZXROYW1lTWFwcGVyTGlzdCgpLml0ZXJhdG9yKCk7DQotICAgICAgICB3aGlsZShuYW1lTWFwcGVySXRlcmF0b3IuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG5hbWVNYXBwZXJJdGVyYXRvci5uZXh0KCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKGNsYXNzVG9EZXJlZ2lzdGVyLmdldE5hbWUoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBuYW1lTWFwcGVySXRlcmF0b3IucmVtb3ZlKCk7DQotICAgICAgICAgICAgICAgIC8vZG9uJ3QgYnJlYWsgLSBlLmcuIHRvIGRlcmVnaXN0ZXIgYWxsIHdyYXBwZXJzLi4uDQotICAgICAgICAgICAgICAgIC8vYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGRlbnkoQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IGNsYXNzVG9EZW55KQ0KLSAgICB7DQotICAgICAgICBkZXJlZ2lzdGVyKGNsYXNzVG9EZW55KTsNCi0NCi0gICAgICAgIHN5bmNocm9uaXplZCAoZ2V0Q2xhc3MoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBkZW5pZWROYW1lTWFwcGVyTGlzdC5hZGQoY2xhc3NUb0RlbnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBMaXN0PE5hbWVNYXBwZXI8VD4+IGdldE5hbWVNYXBwZXJMaXN0KCk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9DbGFzc01hcHBpbmdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMjdlMGIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9DbGFzc01hcHBpbmdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIENsYXNzTWFwcGluZ0ZhY3Rvcnk8UCwgUj4KLXsKLSAgICBSIGNyZWF0ZShQIHNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0RlZmF1bHRGYWN0b3J5RmluZGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0RlZmF1bHRGYWN0b3J5RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OTc1NWYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9EZWZhdWx0RmFjdG9yeUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLkRlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRGVmYXVsdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8vZHluYW1pYyBhcHByb2FjaCB0byBjcmVhdGUgdGhlIGZhY3RvcmllcyBkdXJpbmcgdGhlIGZpcnN0IHJlcXVlc3QsIHdoZW4gYSBmYWNlcy1jb250ZXh0IGlzIGF2YWlsYWJsZQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWN0b3J5RmluZGVyIGltcGxlbWVudHMgRmFjdG9yeUZpbmRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJvdGVjdGVkIE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4gZmFjdG9yeU1hcCA9IG5ldyBIYXNoTWFwPEZhY3RvcnlOYW1lcywgT2JqZWN0PigpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIgPSBuZXcgRGVmYXVsdEZhY3RvcnlGaW5kZXIoKTsNCi0NCi0gICAgcHJvdGVjdGVkIERlZmF1bHRGYWN0b3J5RmluZGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY3RvcnlGaW5kZXIgZ2V0SW5zdGFuY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjdG9yeUZpbmRlcjsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgZmluYWwgPFQ+IFQgZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUsIENsYXNzPFQ+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZighKGZhY3RvcnlNYXAuY29udGFpbnNLZXkoZmFjdG9yeU5hbWUpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0RmFjdG9yeShmYWN0b3J5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKFQpZmFjdG9yeU1hcC5nZXQoZmFjdG9yeU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIHN3aXRjaCAoZmFjdG9yeU5hbWUpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2FzZSBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZU1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZU1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZVJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgRUxfSEVMUEVSX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVFTEhlbHBlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBGQUNFU19NRVNTQUdFX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVGYWNlc01lc3NhZ2VGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIFNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlU3RvcmFnZU1hbmFnZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZVZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICANCi0gICAgICAgICAgICBkZWZhdWx0OiAvL3JlcXVpcmVkIGJ5IGNoZWNrc3R5bGUNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgcG9zc2libGUgdG8gY3JlYXRlIGZhY3RvcnkgIiArIGZhY3RvcnlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZhY3RvcnlNYXAucHV0KGZhY3RvcnlOYW1lLCBmYWN0b3J5KTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkpOw0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSk7DQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotICAgICAgICBMaXN0PFN0cmluZz4gbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSk7DQotICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZICk7DQotICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUZhY2VzTWVzc2FnZUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0ZBQ0VTX01FU1NBR0VfRkFDVE9SWSk7DQotICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkpKTsNCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkubmFtZSgpKTsNCi0gICAgICAgIGlmKHRhcmdldCAhPSBudWxsICYmIHRhcmdldCBpbnN0YW5jZW9mIFN0cmluZykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoKFN0cmluZyl0YXJnZXQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlRUxIZWxwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0RUxIZWxwZXJGYWN0b3J5KCk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlkpOw0KLSAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSk7DQotICAgICAgICBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHN0b3JhZ2VNYW5hZ2VyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IHN0b3JhZ2VNYW5hZ2VyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWSk7DQotICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1BBUkFNRVRFUl9GQUNUT1JZKSk7DQotICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogdmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdiZDhhMy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRmFjZXNNZXNzYWdlRmFjdG9yeQ0KLXsNCi0gICAgRmFjZXNNZXNzYWdlIGNvbnZlcnQoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSk7DQotDQotICAgIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZjI2MjUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnlGaW5kZXIKLXsKLSAgICA8VD4gVCBnZXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpOwotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMmIxNWUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQotcHVibGljIGVudW0gRmFjdG9yeU5hbWVzCi17Ci0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwKLQotICAgIFZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZLAotICAgIFZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlksCi0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksCi0gICAgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLAotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLAotCi0gICAgRkFDRVNfTUVTU0FHRV9GQUNUT1JZLAotCi0gICAgUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwKLSAgICBFTF9IRUxQRVJfRkFDVE9SWSwKLQotICAgIFNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZCi19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L05hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDJkMWYwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8VCBleHRlbmRzIE5hbWVNYXBwZXI+DQotew0KLSAgICB2b2lkIHJlZ2lzdGVyKFQgY2xhc3NUb0FkZCk7DQotICAgIHZvaWQgZGVyZWdpc3RlcihDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gY2xhc3NUb0RlcmVnaXN0ZXIpOw0KLSAgICB2b2lkIGRlbnkoQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IGNsYXNzVG9EZW55KTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0Fic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9BYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNTAwYzMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0Fic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRTZWNyZXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3g7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVMaXN0Ym94Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTWVudTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZVJhZGlvOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUNoZWNrYm94Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUxpc3Rib3g7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TWVudTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dGFyZWE7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyDQotew0KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbGlkYXRlRW1wdHlGaWVsZHMoKSAmJiBFeHRWYWxVdGlscy5pc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25BY3RpdmUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyZVJlcXVpcmVkQXR0cmlidXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgY29uZmlndXJlTWF4TGVuZ3RoQXR0cmlidXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUVtcHR5RmllbGRzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLnZhbGlkYXRlRW1wdHlGaWVsZHMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjb25maWd1cmVSZXF1aXJlZEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSk7DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRTZWNyZXQgfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94IHx8DQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lTWVudSB8fA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVSYWRpbyB8fA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUxpc3Rib3ggfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueU1lbnUgfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogaWYgdGhlcmUgaXMgbm8gc3BlY2lhbCBhdHRyaWJ1dGUgYXQgdGhlIGNvbXBvbmVudCB3aGljaCBzaG91bGQgb3ZlcnJ1bGUNCi0gICAgICogdGhlIGFubm90YXRlZCBwcm9wZXJ0eSByZXR1cm4gdHJ1ZSENCi0gICAgICoNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IGNvbXBvbmVudCB3aGljaCBpbXBsZW1lbnRzIHRoZSBFZGl0YWJsZVZhbHVlSG9sZGVyIGludGVyZmFjZQ0KLSAgICAgKiBAcmV0dXJuIGZhbHNlIHRvIG92ZXJydWxlIHRoZSBhbm5vdGF0ZWQgcHJvcGVydHkgZS5nLiBpZiBjb21wb25lbnQgaXMgcmVhZG9ubHkNCi0gICAgICovDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJyZWZhY3RvciIpDQotICAgIHByb3RlY3RlZCBCb29sZWFuIGlzQ29tcG9uZW50UmVxdWlyZWQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzUmVhZG9ubHkiKSkpOw0KLSAgICAgICAgYm9vbGVhbiBpc0Rpc2FibGVkID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNEaXNhYmxlZCIpKSk7DQotDQotICAgICAgICByZXR1cm4gIShpc1JlYWRPbmx5IHx8IGlzRGlzYWJsZWQpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZU1heExlbmd0aEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKTsNCi0NCi0gICAgICAgICAgICBpZighKG1heExlbmd0aCBpbnN0YW5jZW9mIEludGVnZXIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBIdG1sSW5wdXRUZXh0IGh0bWxJbnB1dFRleHQgPSAoSHRtbElucHV0VGV4dCl1aUNvbXBvbmVudDsNCi0gICAgICAgICAgICAgICAgaHRtbElucHV0VGV4dC5zZXRNYXhsZW5ndGgoKEludGVnZXIpbWF4TGVuZ3RoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEh0bWxJbnB1dFNlY3JldCBodG1sSW5wdXRTZWNyZXQgPSAoSHRtbElucHV0U2VjcmV0KXVpQ29tcG9uZW50Ow0KLSAgICAgICAgICAgICAgICBodG1sSW5wdXRTZWNyZXQuc2V0TWF4bGVuZ3RoKChJbnRlZ2VyKW1heExlbmd0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9Db21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZGMwMWUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXJTdXBwb3J0OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQWxsb3dzIHRvIGluaXRpYWxpemUgY29tcG9uZW50cyBiZWZvcmVFbmNvZGVCZWdpbi48YnIvPgotICogZS5nLjogeW91IGNhbiBhZGQgaW5mb3JtYXRpb24gZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gbWVjaGFuaXNtcywuLi4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydAotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpOwotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU3MTU0MC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBTdGF0aWNDb25maWd1cmF0aW9uPFQsIFI+Ci17Ci0gICAgdm9pZCBzZXRTb3VyY2VPZk1hcHBpbmcoU3RyaW5nIHBhdGgpOwotICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFQsIFI+PiBnZXRNYXBwaW5nKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uRW50cnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMzEwZjQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8VCwgUj4KLXsKLSAgICBwcml2YXRlIFQgc291cmNlOwotICAgIHByaXZhdGUgUiB0YXJnZXQ7Ci0KLSAgICBwdWJsaWMgVCBnZXRTb3VyY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoVCBzb3VyY2UpCi0gICAgewotICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUiBnZXRUYXJnZXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRhcmdldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoUiB0YXJnZXQpCi0gICAgewotICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q3NWJmNC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSX0pCi1wdWJsaWMgZW51bSBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMKLXsKLSAgICBNRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9DT05GSUcsCi0gICAgU1RPUkFHRV9UWVBFX1RPX1NUT1JBR0VfTUFOQUdFUl9DT05GSUcsCi0KLSAgICBTS0lQX1ZBTElEQVRJT05fU1VQUE9SVF9DT05GSUcsCi0gICAgVkFMSURBVElPTl9QQVJBTUVURVJfQ09ORklHCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24uamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwODdkMGQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuUkVVU0V9KQotcHVibGljIGNsYXNzIFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+Ci17Ci0gICAgcHJpdmF0ZSBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmdzCi0gICAgICAgID0gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlT2ZNYXBwaW5nKFN0cmluZyBwYXRoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBnZXRNYXBwaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtYXBwaW5nczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBzb3VyY2UsIFN0cmluZyB0YXJnZXQpCi0gICAgewotICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5ID0gbmV3IFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgZW50cnkuc2V0U291cmNlKHNvdXJjZSk7Ci0gICAgICAgIGVudHJ5LnNldFRhcmdldCh0YXJnZXQpOwotICAgICAgICB0aGlzLm1hcHBpbmdzLmFkZChlbnRyeSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYTYzYzQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIFN0cmluZyBwYXRoOwotICAgIHByaXZhdGUgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5nczsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCkKLSAgICB7Ci0gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgICAgIC8vZm9yY2UgcmVsb2FkCi0gICAgICAgIG1hcHBpbmdzID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBnZXRNYXBwaW5nKCkKLSAgICB7Ci0gICAgICAgIGlmKG1hcHBpbmdzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtYXBwaW5nczsKLSAgICAgICAgfQotCi0gICAgICAgIG1hcHBpbmdzID0gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotCi0gICAgICAgIFJlc291cmNlQnVuZGxlIG1hcHBpbmcgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocGF0aCk7Ci0KLSAgICAgICAgaWYgKG1hcHBpbmcgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9sb2dnaW5nCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IG1hcHBpbmcuZ2V0S2V5cygpOwotCi0gICAgICAgIFN0cmluZyBtZXRhRGF0YUtleTsKLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsKLQotICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YURhdGFLZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSBtYXBwaW5nLmdldFN0cmluZyhtZXRhRGF0YUtleSk7Ci0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWV0YURhdGFLZXksIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBtZXRhRGF0YUtleSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2UobWV0YURhdGFLZXkpOwotICAgICAgICBlbnRyeS5zZXRUYXJnZXQodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsKLSAgICAgICAgdGhpcy5tYXBwaW5ncy5hZGQoZW50cnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZDNmMDcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yIGltcGxlbWVudHMgUmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRJbnRlcmNlcHRvcklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJldHVyblZhbHVlT25Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKAotICAgICAgICBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIHNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24sIE9iamVjdCBjdXJyZW50UmV0dXJuVmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gY3VycmVudFJldHVyblZhbHVlOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBiZWZvcmUKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJlZm9yZURlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGFmdGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZjM1ZmEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlZhbGlkYXRpb25Nb2R1bGVLZXk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5SZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZWwuUHJvcGVydHlOb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3INCi17DQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvblN1cHBvcnRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpDQotICAgICAgICAgICAgdGhyb3dzIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvKg0KLSAgICAgICAgICogY29tcG9uZW50IGluaXRpYWxpemF0aW9uIHNldHMgYSBjb21wb25lbnQgdG8gcmVxdWlyZWQgaWYgdGhlcmUgYXJlIGNvbnN0cmFpbnRzIHdoaWNoIGluZGljYXRlIGl0DQotICAgICAgICAgKiB0aGUgcmVxdWlyZWQgZmxhZyBpbiBhIGNvbXBvbmVudCBsZWFkcyB0byBwcm9ibGVtcyB3aXRoIGg6bWVzc2FnZXMgKGFkZGl0aW9uYWwgbWVzc2FnZSkgYXMgd2VsbCBhcw0KLSAgICAgICAgICogaW5jb21wYXRpYmlsaXRpZXMgd2l0aCBza2lwIHZhbGlkYXRpb24gYW5kIHNldmVyaXRpZXMNCi0gICAgICAgICAqLw0KLSAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyICYmIEV4dFZhbFV0aWxzLmlzUmVxdWlyZWRSZXNldEFjdGl2YXRlZCgpICYmDQotICAgICAgICAgICAgICAgIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvblN1cHBvcnRlZCgpICYmIEV4dFZhbFV0aWxzLmlzUmVxdWlyZWRJbml0aWFsaXphdGlvbkFjdGl2ZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQoZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkNCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkgJiYgIWlzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25EZWFjdGl2YXRlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCk7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHdyYXBwZWQpDQotICAgICAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0Ow0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgY29udmVydGVkT2JqZWN0ID0gd3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChQcm9wZXJ0eU5vdEZvdW5kRXhjZXB0aW9uIHIpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNGYXRhbEVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmZhdGFsKCJpdCBzZWVtcyB5b3UgYXJlIHVzaW5nIGFuIGludmFsaWQgYmluZGluZy4gIiArIHdyYXBwZWQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICArICI6IGNvbnZlcnNpb24gZmFpbGVkLiBub3JtYWxseSB0aGlzIGlzID5ub3Q8IGEgbXlmYWNlcyBleHR2YWwgaXNzdWUhIiwgcik7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHRocm93IHI7DQotICAgICAgICB9DQotDQotICAgICAgICBzZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydGllcyh1aUNvbXBvbmVudCk7DQotICAgICAgICANCi0gICAgICAgIGlmKHJlY29yZFByb2Nlc3NlZEluZm9ybWF0aW9uKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9yZWNvcmRlIHVzZXIgaW5wdXQgZS5nLiBmb3IgY3Jvc3MtY29tcG9uZW50IHZhbGlkYXRpb24NCi0gICAgICAgICAgICBmb3IoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciByZWNvcmRlciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZWNvcmRlci5yZWNvcmRVc2VySW5wdXQodWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UocmVjb3JkZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGNhbGxlZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QgPSB0cmFuc2Zvcm1WYWx1ZUZvclZhbGlkYXRpb24oY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgICAgICAgICAgICAgaWYodmFsaWRhdGVWYWx1ZShjb252ZXJ0ZWRPYmplY3QpICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0JlZm9yZVZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1ZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBtaWdodCBkZWNpZGUgdGhhdCBpdCBpc24ndCBhbiBleGNlcHRpb24NCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudCh1aUNvbXBvbmVudCwgZS5nZXRGYWNlc01lc3NhZ2UoKSwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZmluYWxFeGNlcHRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29udmVydGVyRXhjZXB0aW9uKGUuZ2V0RmFjZXNNZXNzYWdlKCksIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGZpbmFsbHkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzQWZ0ZXJWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICAgICAgcmVzZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydGllcyh1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0JlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmV4ZWN1dGVHbG9iYWxCZWZvcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHZhbHVlLA0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uLmNsYXNzLmdldE5hbWUoKSwgZ2V0UHJvcGVydHlJbmZvcm1hdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KSwgZ2V0TW9kdWxlS2V5KCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NBZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMuZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWx1ZSwNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIGdldFByb3BlcnR5SW5mb3JtYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCksIGdldE1vZHVsZUtleSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgUHJvcGVydHlJbmZvcm1hdGlvbiBnZXRQcm9wZXJ0eUluZm9ybWF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0aWVzRm9yQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IgPSBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcihwcm9wZXJ0aWVzKTsNCi0NCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXNGb3JDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBpZihnZXRNb2R1bGVLZXkoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpLCBnZXRNb2R1bGVLZXkoKSk7DQotICAgICAgICB9DQotICAgICAgICBwcm9wZXJ0aWVzLnB1dChVSUNvbXBvbmVudC5jbGFzcy5nZXROYW1lKCksIHVpQ29tcG9uZW50KTsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IHRyYW5zZm9ybVZhbHVlRm9yVmFsaWRhdGlvbihPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIiIuZXF1YWxzKGNvbnZlcnRlZE9iamVjdCkgJiYgaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZShPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZihpc1ZhbHVlVG9WYWxpZGF0ZUVtcHR5KGNvbnZlcnRlZE9iamVjdCkgJiYgIXZhbGlkYXRlRW1wdHlGaWVsZHMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoImVtcHR5IGZpZWxkIHZhbGlkYXRpb24gaXMgZGVhY3RpdmF0ZWQgaW4gdGhlIHdlYi54bWwgLSBzZWU6ICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5WQUxJREFURV9FTVBUWV9GSUVMRFMiKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWx1ZVRvVmFsaWRhdGVFbXB0eShPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0ID09IG51bGwgfHwgIiIuZXF1YWxzKGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVFbXB0eUZpZWxkcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy52YWxpZGF0ZUVtcHR5RmllbGRzKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIgJiYgaXNWYWx1ZUJpbmRpbmdPZkNvbXBvbmVudFZhbGlkKHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWx1ZUJpbmRpbmdPZkNvbXBvbmVudFZhbGlkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCkgIT0gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25EZWFjdGl2YXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DT01QT05FTlRfSU5JVElBTElaQVRJT04pOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHJlY29yZFByb2Nlc3NlZEluZm9ybWF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0TW9kdWxlS2V5KCkNCi0gICAgew0KLSAgICAgICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEludGVyY2VwdG9yUHJvcGVydGllcyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIGlmKGdldE1vZHVsZUtleSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LnB1dChWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzLmdldE5hbWUoKSwgZ2V0TW9kdWxlS2V5KCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmVzdWx0LnB1dChVSUNvbXBvbmVudC5jbGFzcy5nZXROYW1lKCksIHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0aWVzKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlIGludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlID0gZ2V0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gZ2V0SW50ZXJjZXB0b3JQcm9wZXJ0aWVzKHVpQ29tcG9uZW50KTsNCi0gICAgICAgIGZvcihTdHJpbmcga2V5IDogcHJvcGVydGllcy5rZXlTZXQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5zZXRQcm9wZXJ0eShrZXksIHByb3BlcnRpZXMuZ2V0KGtleSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZXNldFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0aWVzKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlIGludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlID0gZ2V0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgZm9yKFN0cmluZyBrZXkgOiBnZXRJbnRlcmNlcHRvclByb3BlcnRpZXModWlDb21wb25lbnQpLmtleVNldCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLnJlbW92ZVByb3BlcnR5KGtleSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlIGdldFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Bd2FyZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Db21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmNzExOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Db21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlclN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Bd2FyZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKEpzZlV0aWxzLmlzUmVuZGVyUmVzcG9uc2VQaGFzZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFmdGVyRXh0cmFjdGluZ0ZvckNvbXBvbmVudEluaXRpYWxpemF0aW9uKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFmdGVyRXh0cmFjdGluZ0ZvckNvbXBvbmVudEluaXRpYWxpemF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbik7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0ZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9GYWNlc01lc3NhZ2VQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTZiMTYzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0ZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkZhY2VzTWVzc2FnZVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDkwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBGYWNlc01lc3NhZ2VQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2VTdG9yYWdlIGZhY2VzTWVzc2FnZVN0b3JhZ2UgPSBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKA0KLSAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLCBGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBpZihmYWNlc01lc3NhZ2VTdG9yYWdlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNNZXNzYWdlU3RvcmFnZS5hZGRBbGwoKTsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5yZXNldFN0b3JhZ2UoRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcywgRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0h0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkN2M5MjguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5MYWJlbGVkTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLmV4Y2VwdGlvbi5SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFNlY3JldDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVMaXN0Ym94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVSYWRpbzsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueU1lbnU7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dGFyZWE7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpCi0gICAgewotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSBFeHRWYWxVdGlscy5jb252ZXJ0RmFjZXNNZXNzYWdlKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSk7Ci0KLSAgICAgICAgICAgIHRyeVRvVXNlSW5saW5lTWVzc2FnZSh1aUNvbXBvbmVudCwgdmFsaWRhdG9yRXhjZXB0aW9uKTsKLQotICAgICAgICAgICAgdHJ5VG9Vc2VMYWJlbChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBmYWNlc01lc3NhZ2UpOwotCi0gICAgICAgICAgICB0cnlUb0Jsb2Nrc05hdmlnYXRpb24odWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGZhY2VzTWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvVXNlSW5saW5lTWVzc2FnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCk7Ci0gICAgICAgIFN0cmluZyBpbmxpbmVNZXNzYWdlOwotCi0gICAgICAgIGlmKHZhbGlkYXRvckV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmxpbmVNZXNzYWdlID0gZ2V0SW5saW5lUmVxdWlyZWRNZXNzYWdlKHVpQ29tcG9uZW50KTsKLQotICAgICAgICAgICAgaWYoaW5saW5lTWVzc2FnZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGlubGluZU1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoaW5saW5lTWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgaW5saW5lTWVzc2FnZSA9IGdldElubGluZVZhbGlkYXRvck1lc3NhZ2UodWlDb21wb25lbnQpOwotCi0gICAgICAgICAgICBpZihpbmxpbmVNZXNzYWdlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoaW5saW5lTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldERldGFpbChpbmxpbmVNZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1VzZUxhYmVsKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpCi0gICAgewotICAgICAgICBTdHJpbmcgbGFiZWwgPSAoU3RyaW5nKSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsCi0gICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldExhYmVsIikpOwotCi0gICAgICAgIGlmKGxhYmVsID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxhYmVsID0gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vb3ZlcnJpZGUgdGhlIGxhYmVsIGlmIHRoZSBhbm5vdGF0aW9uIHByb3ZpZGVzIGEgbGFiZWwKLSAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxhYmVsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCwgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIExhYmVsZWRNZXNzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKExhYmVsZWRNZXNzYWdlKWZhY2VzTWVzc2FnZSkuc2V0TGFiZWxUZXh0KGxhYmVsKTsKLSAgICAgICAgfQotICAgICAgICAvL2lmIHNvbWVvbmUgdXNlcyBhIG5vcm1hbCBmYWNlcyBtZXNzYWdlCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwoZmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiY2hlY2sgaWYgaXQgaXMgc3RpbGwgcmVxdWlyZWQgaGVyZSIpCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvQmxvY2tzTmF2aWdhdGlvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQotICAgIHsKLSAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vY29ycmVjdCBzZXZlcml0eSBpcyBlLmcuIHByb3ZpZGVkIGJ5IFZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yCi0gICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnQodWlDb21wb25lbnQsIGZhY2VzTWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRJbmxpbmVSZXF1aXJlZE1lc3NhZ2UoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gKFN0cmluZylSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJnZXRSZXF1aXJlZE1lc3NhZ2UiKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW5saW5lVmFsaWRhdG9yTWVzc2FnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCh1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldFZhbGlkYXRvck1lc3NhZ2UiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lUmFkaW8gfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TGlzdGJveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjNDk2Mi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlJbmZvcm1hdGlvbiB0aGUgaW5mb3JtYXRpb24gZW50cnkgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3BlcnR5DQotICAgICAqLw0KLSAgICB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRjZjUyNy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotew0KLSAgICAvKioNCi0gICAgICogQHJldHVybiBmYWxzZSBpZiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzIHNob3VsZCBiZSBieXBhc3NlZA0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpOw0KLQ0KLSAgICAvKioNCi0gICAgICogcHJvY2Vzc2VkIGlmIHZhbGlkYXRpb24gd2FzIGV4ZWN1dGVkDQotICAgICAqIGluIGNvbnRyYXN0IHRvIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpdCBnZXRzIGV4ZWN1dGVkIGluIGFueSBjYXNlDQotICAgICAqLw0KLSAgICB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWYyNzU4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbGxvd3MgdG8gaW50ZXJjZXB0IHJlbmRlcmVyIG1ldGhvZHMuPGJyLz4KLSAqIEJhc2UgbWVjaGFuaXNtIG9mIGV4dHZhbC4gSXQgYWxsb3dzIHRvIGFkZCBjdXN0b20gaW5mcmFzdHJ1Y3R1cmVzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBSZW5kZXJlckludGVyY2VwdG9yCi17Ci0gICAgU3RyaW5nIGdldEludGVyY2VwdG9ySWQoKTsKLQotICAgIE9iamVjdCBnZXRSZXR1cm5WYWx1ZU9uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBza2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLCBPYmplY3QgY3VycmVudFJldHVyblZhbHVlKTsKLQotICAgIC8qCi0gICAgICogYmVmb3JlCi0gICAgICovCi0gICAgdm9pZCBiZWZvcmVEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKgotICAgICAqIGFmdGVyCi0gICAgICovCi0gICAgdm9pZCBhZnRlckRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZWMzZDAuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEFsbG93cyB0byBpbnRlcmNlcHQgdmFsaWRhdGlvciBleGNlcHRpb25zLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlclN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgLyoqDQotICAgICAqDQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCB0aGUgY3VycmVudCBjb21wb25lbnQNCi0gICAgICogQHBhcmFtIG1ldGFEYXRhRW50cnkgdGhlIG1ldGEgZGF0YSBlbnRyeSB3aGljaCBjb250YWlucyB0aGUgbWV0YSBkYXRhIG9mIHRoZSBwcm9wZXJ0eQ0KLSAgICAgKiBAcGFyYW0gY29udmVydGVkT2JqZWN0IHRoZSBjb252ZXJ0ZWQgdXNlciBpbnB1dA0KLSAgICAgKiBAcGFyYW0gdmFsaWRhdG9yRXhjZXB0aW9uIHRoZSBjdXJyZW50IGV4Y2VwdGlvbg0KLSAgICAgKiBAcGFyYW0gdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlIHZhbGlkYXRpb24gc3RyYXRlZ3kgd2hpY2ggdGhyZXcgdGhlIGV4Y2VwdGlvbg0KLSAgICAgKiBAcmV0dXJuIGZhbHNlIHRvIHN0b3AgdGhyb3dpbmcgdGhlIGV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJlMTVlMC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25JbnRlcmNlcHRvcgotewotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvblN1cHBvcnRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgdG8gaW5pdCBjb21wb25lbnQgIiArIHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGFSZXN1bHQgPSBFeHRWYWxVdGlscwotICAgICAgICAgICAgICAgIC5nZXRUcmFuc2Zvcm1lZE1ldGFEYXRhRm9yKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGdldE1vZHVsZUtleSgpKTsKLQotICAgICAgICAvL2dldCBjb21wb25lbnQgaW5pdGlhbGl6ZXIgZm9yIHRoZSBjdXJyZW50IGNvbXBvbmVudCBhbmQgY29uZmlndXJlIGl0Ci0gICAgICAgIC8vYWxzbyBpbiBjYXNlIG9mIHNraXBwZWQgdmFsaWRhdGlvbiB0byByZXNldCBlLmcuIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGUKLSAgICAgICAgaWYoIW1ldGFEYXRhUmVzdWx0LmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29uZmlndXJlQ29tcG9uZW50V2l0aE1ldGFEYXRhKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImluaXQgY29tcG9uZW50IG9mICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQotICAgIHsKLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IgPSBFeHRWYWxVdGlscwotICAgICAgICAgICAgICAgIC5nZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcldpdGgoZ2V0UHJvcGVydGllc0ZvckNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKHVpQ29tcG9uZW50KSk7Ci0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCB2YWxpZGF0aW9uIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByb2Nlc3NGaWVsZFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgidmFsaWRhdGlvbiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1ldGFEYXRhRXh0cmFjdG9yIGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcldpdGgocHJvcGVydGllcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ZpZWxkVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQotICAgIHsKLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsKLSAgICAgICAgU2tpcFZhbGlkYXRpb25FdmFsdWF0b3Igc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcigpOwotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldE1ldGFEYXRhRW50cmllcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7Ci0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkYXRpb25TdHJhdGVneUNvbXBhdGlibGVXaXRoVmFsdWUodmFsaWRhdGlvblN0cmF0ZWd5LCAgY29udmVydGVkT2JqZWN0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihza2lwVmFsaWRhdGlvbkV2YWx1YXRvci5za2lwVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uU3RyYXRlZ3ksIGVudHJ5KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInNraXAgdmFsaWRhdGlvbiBvZiAiICsgZW50cnkuZ2V0VmFsdWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2l0aCAiICsgdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvL2Rvbid0IGJyZWFrIG1heWJlIHRoZXJlIGFyZSBjb25zdHJhaW50cyB3aGljaCBkb24ndCBzdXBwb3J0IHRoZSBza2lwLW1lY2hhbmlzbQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgidmFsaWRhdGUgIiArIGVudHJ5LmdldFZhbHVlKCkgKyAiIHdpdGggIiArIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQW5ub3RhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIUV4dFZhbFV0aWxzLmV4ZWN1dGVMb2NhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIHByb3BlcnR5SW5mb3JtYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIHZhbGlkYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBlbnRyeSwgY29udmVydGVkT2JqZWN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb24pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmV4ZWN1dGVMb2NhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uLmNsYXNzLmdldE5hbWUoKSwgcHJvcGVydHlJbmZvcm1hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZih2YWxpZGF0aW9uU3RyYXRlZ3kgPT0gbnVsbCAmJiBsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm5vIHZhbGlkYXRpb24gc3RyYXRlZ3kgZm91bmQgZm9yICIgKyBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRhdGlvblN0cmF0ZWd5Q29tcGF0aWJsZVdpdGhWYWx1ZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBpZih2YWx1ZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3ModmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkpOwotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLmlzQW5ub3RhdGlvblByZXNlbnQoTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICEiIi5lcXVhbHModmFsdWUpIHx8IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3ModmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkpCi0gICAgICAgICAgICAgICAgLmlzQW5ub3RhdGlvblByZXNlbnQoRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICAvKioKLSAgICAgKiB0byBlbnN1cmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGludGVycHJldEVtcHR5U3RyaW5nVmFsdWVzQXNOdWxsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWNvcmRQcm9jZXNzZWRJbmZvcm1hdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WaW9sYXRpb25TZXZlcml0eVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmlvbGF0aW9uU2V2ZXJpdHlWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkzNGM2MS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WaW9sYXRpb25TZXZlcml0eVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoOTApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmlvbGF0aW9uU2V2ZXJpdHlWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZihpc0V4dFZhbE1ldGFEYXRhKG1ldGFEYXRhRW50cnkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvUGxhY2VTZXZlcml0eSh2YWxpZGF0b3JFeGNlcHRpb24sIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRXh0VmFsTWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQW5ub3RhdGlvbjsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9QbGFjZVNldmVyaXR5KFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgZm9yKEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSA6IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKQ0KLSAgICAgICAgICAgICAgICAuZXh0cmFjdChhbm5vdGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihWaW9sYXRpb25TZXZlcml0eS5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5LmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkuc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1NzhjNS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbi4gU3ViY2xhc3NlcyBqdXN0IGhhdmUgdG8gbm93IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgbmFtZSBtYXBwZXIuDQotICoNCi0gKiBOYW1lTWFwcGVycyBhcmUgc3RhdGVsZXNzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFQ+IGltcGxlbWVudHMgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJpdmF0ZSBOYW1lTWFwcGVyPFQ+IGN1c3RvbU5hbWVNYXBwZXI7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShUIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGN1c3RvbU5hbWVNYXBwZXIgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpOw0KLQ0KLSAgICAgICAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU5hbWVNYXBwZXIgPSAoTmFtZU1hcHBlcjxUPikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChjdXN0b21OYW1lTWFwcGVyICE9IG51bGwpID8gY3VzdG9tTmFtZU1hcHBlci5jcmVhdGVOYW1lKHNvdXJjZSkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL05hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU1YjYyZi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlclN1cHBvcnQ7DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBuYW1lIG1hcHBlcnMuDQotICogQSBuYW1lIG1hcHBlciBjYWxjdWxhdGVzIGEgbmFtZSBmb3IgYSBnaXZlbiBzb3VyY2Ugb2JqZWN0Lg0KLSAqIGUuZy4gTWV0YS1EYXRhIEtleSAoZS5nLjogYW5ub3RhdGlvbiBjbGFzcyBuYW1lKSAtPiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBOYW1lTWFwcGVyPFQ+DQotew0KLSAgICBTdHJpbmcgY3JlYXRlTmFtZShUIHNvdXJjZSk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9TdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9TdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U2ZGRkMi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBpbnRlcmZhY2UgZm9yIG5hbWUtbWFwcGVycyB3aGljaCBoYXZlIHRvIGRlbGVnYXRlIHRvIG90aGVyIChzdWItKW5hbWUtbWFwcGVycw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXI8VD4gZXh0ZW5kcyBOYW1lTWFwcGVyPFQ+DQotew0KLSAgICB2b2lkIGFkZE5hbWVNYXBwZXIoTmFtZU1hcHBlcjxUPiBuYW1lTWFwcGVyKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvQ29tbW9uTWV0YURhdGFLZXlzLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFhZTYzNy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogaGVscGVyIGZvciBmcmVxdWVudCBtZXRhLWRhdGEga2V5cw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotLyoNCi0gKiBwbGFjZWQgaW4gY29yZSB0byBhdm9pZCBkdXBsaWNhdGVkIGluZm9ybWF0aW9uIGluIG11bHRpcGxlIG1vZHVsZXMgKHZhbGlkYXRpb24gbW9kdWxlIGFuZCBjb21wb25lbnQtc3VwcG9ydCBtb2R1bGUpDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1vbk1ldGFEYXRhS2V5cw0KLXsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRCA9ICJyZXF1aXJlZCI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBS19SRVFVSVJFRCA9ICJ3ZWFrX3JlcXVpcmVkIjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5fTEVOR1RIID0gIm1pbl9sZW5ndGgiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTl9MRU5HVEhfREVGQVVMVCA9ICJtaW5fbGVuZ3RoX2RlZmF1bHQiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9MRU5HVEggPSAibWF4X2xlbmd0aCI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0xFTkdUSF9ERUZBVUxUID0gIm1heF9sZW5ndGhfZGVmYXVsdCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOR0VfTUlOID0gInJhbmdlX21pbiI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOR0VfTUlOX0RFRkFVTFQgPSAicmFuZ2VfbWluX2RlZmF1bHQiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01BWCA9ICJyYW5nZV9tYXgiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01BWF9ERUZBVUxUID0gInJhbmdlX21heF9kZWZhdWx0IjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRURVJOID0gInBhdHRlcm4iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFID0gInBhdHRlcm5fdmFsaWRhdGlvbl9lcnJvcl9tZXNzYWdlIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFTUFJTCA9ICJlbWFpbCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NID0gImN1c3RvbSI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9WQUxJREFUSU9OID0gInNraXBfdmFsaWRhdGlvbiI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRV9DTElFTlRfU0lERV9WQUxJREFUSU9OID0gImRpc2FibGVfY2xpZW50X3NpZGVfdmFsaWRhdGlvbiI7DQotICAgIC8vYXZhaWxhYmxlIGZvciBhZGQtb25zIG5vdCB1c2VkIGludGVybmFsbHkgZHVlIHRvIHBlcmZvcm1hbmNlIHJlYXNvbnMNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFX1NIT1dfSU5ESUNBVElPTiA9ICJkaXNhYmxlX3Nob3dfaW5kaWNhdGlvbiI7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL01ldGFEYXRhRW50cnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL01ldGFEYXRhRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU1NDU4Mi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9NZXRhRGF0YUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogRGF0YSBob2xkZXIgd2hpY2ggc3RvcmVzIHRoZSBtZXRhLWRhdGEgYW5kIHNvbWUgaW5mb3JtYXRpb24gd2hlcmUgdGhlIG1ldGEtZGF0YSB3YXMgYXJvdW5kLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIE1ldGFEYXRhRW50cnkKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcga2V5OwotICAgIHByaXZhdGUgT2JqZWN0IHZhbHVlOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gICAgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoInNldHRpbmcgbWV0YS1kYXRhIGtleTogIiArIGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0VmFsdWUoQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgic2V0dGluZyBtZXRhLWRhdGEgdmFsdWU6ICIgKyB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIDxUPiBUIGdldFByb3BlcnR5KFN0cmluZyBrZXksIENsYXNzPFQ+IHRhcmdldENsYXNzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUKWdldFByb3BlcnR5KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoIm5ldyBwcm9wZXJ0eSBhZGRlZCBrZXk6ICIgKyBrZXkgKyAiIHZhbHVlOiAiICsgdmFsdWUgKyAiIGZvciBtZXRhZGF0YS1rZXk6ICIgKyB0aGlzLmtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFkYzI2ZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYWxsIGZhY3RvcmllcyB3aGljaCBjcmVhdGUgbWV0YS1kYXRhIGV4dHJhY3RvcnMKLSAqIAotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeQotewotICAgIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZSgpOwotCi0gICAgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlV2l0aChNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpOwotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTRjY2NhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NZXRhRGF0YVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5Qcm9wZXJ0eVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS5iZWFucy5CZWFuSW5mbzsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIGV4dHJhY3RzIG1ldGEtZGF0YSAoZS5nLiB0aGUgYW5ub3RhdGlvbnMpIG9mIHRoZSB2YWx1ZSBiaW5kaW5nIG9mIGEgY29tcG9uZW50LgotICogSXQgZXh0cmFjdHMgdGhlIG1ldGEtZGF0YSBvZiB0aGUgZmllbGQgYW5kIHRoZSBwcm9wZXJ0eS4KLSAqIChBbHNvIHRoZSBhbm5vdGF0aW9ucyBvZiBzdXBlciBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzLikKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvciBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdG9yCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHB1YmxpYyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKQotICAgIHsKLSAgICAgICAgaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQotICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOwotCi0gICAgICAgIC8vc2hvdWxkIG5ldmVyIG9jY3VyCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSAmJiBvYmplY3QgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKG9iamVjdC5nZXRDbGFzcygpICsgIiBpcyBubyB2YWxpZCBjb21wb25lbnQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQgPSAoVUlDb21wb25lbnQpIG9iamVjdDsKLQotICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgZXh0cmFjdGluZyBtZXRhLWRhdGEgb2YgIiArIHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAocHJvcGVydHlEZXRhaWxzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZ2V0IGJlYW4gY2xhc3MgYW5kIHByb3BlcnR5IG5hbWUKLSAgICAgICAgICovCi0gICAgICAgIENsYXNzIGVudGl0eUNsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCkpOwotCi0gICAgICAgIC8vY3JlYXRlCi0gICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uc2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsKLQotICAgICAgICBpZiAoaXNDYWNoZWQoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkgOiBnZXRDYWNoZWRNZXRhRGF0YShlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uYWRkTWV0YURhdGFFbnRyeShtZXRhRGF0YUVudHJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4dHJhY3RBbm5vdGF0aW9ucyhwcm9wZXJ0eUluZm9ybWF0aW9uLCBwcm9wZXJ0eURldGFpbHMsIGVudGl0eUNsYXNzKTsKLSAgICAgICAgICAgIGNhY2hlTWV0YURhdGEocHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0cmFjdCBmaW5pc2hlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2FjaGVkKENsYXNzIGVudGl0eUNsYXNzLCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TWV0YURhdGFTdG9yYWdlKCkuY29udGFpbnNNZXRhRGF0YUZvcihlbnRpdHlDbGFzcywgcHJvcGVydHkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjYWNoZU1ldGFEYXRhKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIGdldE1ldGFEYXRhU3RvcmFnZSgpLnN0b3JlTWV0YURhdGFPZihwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1ldGFEYXRhRW50cnlbXSBnZXRDYWNoZWRNZXRhRGF0YShDbGFzcyBlbnRpdHlDbGFzcywgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldE1ldGFEYXRhU3RvcmFnZSgpLmdldE1ldGFEYXRhKGVudGl0eUNsYXNzLCBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVN0b3JhZ2UgZ2V0TWV0YURhdGFTdG9yYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKE1ldGFEYXRhU3RvcmFnZS5jbGFzcywgTWV0YURhdGFTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2FjaGVkRmllbGQoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlTdG9yYWdlKCkuY29udGFpbnNGaWVsZChlbnRpdHksIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9DYWNoZWRGaWVsZChDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSwgRmllbGQgZmllbGQpCi0gICAgewotICAgICAgICBQcm9wZXJ0eVN0b3JhZ2UgcHJvcGVydHlTdG9yYWdlID0gZ2V0UHJvcGVydHlTdG9yYWdlKCk7Ci0gICAgICAgIGlmICghcHJvcGVydHlTdG9yYWdlLmNvbnRhaW5zRmllbGQoZW50aXR5LCBwcm9wZXJ0eSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnR5U3RvcmFnZS5zdG9yZUZpZWxkKGVudGl0eSwgcHJvcGVydHksIGZpZWxkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgRmllbGQgZ2V0Q2FjaGVkRmllbGQoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlTdG9yYWdlKCkuZ2V0RmllbGQoZW50aXR5LCBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2FjaGVkTWV0aG9kKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5U3RvcmFnZSgpLmNvbnRhaW5zTWV0aG9kKGVudGl0eSwgcHJvcGVydHkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0NhY2hlZE1ldGhvZChDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSwgTWV0aG9kIG1ldGhvZCkKLSAgICB7Ci0gICAgICAgIFByb3BlcnR5U3RvcmFnZSBwcm9wZXJ0eVN0b3JhZ2UgPSBnZXRQcm9wZXJ0eVN0b3JhZ2UoKTsKLSAgICAgICAgaWYgKCFwcm9wZXJ0eVN0b3JhZ2UuY29udGFpbnNNZXRob2QoZW50aXR5LCBwcm9wZXJ0eSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnR5U3RvcmFnZS5zdG9yZU1ldGhvZChlbnRpdHksIHByb3BlcnR5LCBtZXRob2QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRob2QgZ2V0Q2FjaGVkTWV0aG9kKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5U3RvcmFnZSgpLmdldE1ldGhvZChlbnRpdHksIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFByb3BlcnR5U3RvcmFnZSBnZXRQcm9wZXJ0eVN0b3JhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoUHJvcGVydHlTdG9yYWdlLmNsYXNzLCBQcm9wZXJ0eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBleHRyYWN0QW5ub3RhdGlvbnMoCi0gICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24sIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMsIENsYXNzIGVudGl0eUNsYXNzKQotICAgIHsKLSAgICAgICAgd2hpbGUgKCFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhlbnRpdHlDbGFzcy5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgICAgICBhZGRGaWVsZEFjY2Vzc0Fubm90YXRpb25zKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0KLSAgICAgICAgICAgIHByb2Nlc3NJbnRlcmZhY2VzKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMsIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICBlbnRpdHlDbGFzcyA9IGVudGl0eUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzSW50ZXJmYWNlcygKLSAgICAgICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcywgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQotICAgIHsKLSAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50SW50ZXJmYWNlIDogY3VycmVudENsYXNzLmdldEludGVyZmFjZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhjdXJyZW50SW50ZXJmYWNlLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0KLSAgICAgICAgICAgIHByb2Nlc3NJbnRlcmZhY2VzKGN1cnJlbnRJbnRlcmZhY2UsIHByb3BlcnR5RGV0YWlscywgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQotICAgIHsKLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IHRyeVRvR2V0UmVhZE1ldGhvZChlbnRpdHksIHByb3BlcnR5KTsKLQotICAgICAgICBpZiAobWV0aG9kID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGhvZCA9IHRyeVRvR2V0UmVhZE1ldGhvZE1hbnVhbGx5KGVudGl0eSwgcHJvcGVydHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnlUb0NhY2hlZE1ldGhvZChlbnRpdHksIHByb3BlcnR5LCBtZXRob2QpOwotICAgICAgICAgICAgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoQXJyYXlzLmFzTGlzdChtZXRob2QuZ2V0QW5ub3RhdGlvbnMoKSksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRob2QgdHJ5VG9HZXRSZWFkTWV0aG9kKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgaWYgKGlzQ2FjaGVkTWV0aG9kKGVudGl0eSwgcHJvcGVydHkpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q2FjaGVkTWV0aG9kKGVudGl0eSwgcHJvcGVydHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHVzZUJlYW5JbmZvKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJlYW5JbmZvIGJlYW5JbmZvID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKGVudGl0eSk7Ci0gICAgICAgICAgICAgICAgZm9yIChQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlEZXNjcmlwdG9yIDogYmVhbkluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LmVxdWFscyhwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0TmFtZSgpKSAmJiBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEludHJvc3BlY3Rpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlQmVhbkluZm8oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRS5lcXVhbHMoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoQmVhbkluZm8uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRob2QgdHJ5VG9HZXRSZWFkTWV0aG9kTWFudWFsbHkoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2NoYW5nZWQgdG8gb2ZmaWNpYWwgYmVhbiBzcGVjLiBkdWUgdG8gY2FjaGluZyB0aGVyZSBpcyBubyBwZXJmb3JtYW5jZSBpc3N1ZSBhbnkgbW9yZQotICAgICAgICAgICAgcmV0dXJuIGVudGl0eS5nZXREZWNsYXJlZE1ldGhvZCgiaXMiICsgcHJvcGVydHkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVudGl0eS5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0IiArIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJtZXRob2Qgbm90IGZvdW5kIC0gY2xhc3M6ICIgKyBlbnRpdHkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC0gbWV0aG9kczogIiArICJnZXQiICsgcHJvcGVydHkgKyAiICIgKyAiaXMiICsgcHJvcGVydHkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9ucyhDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIEZpZWxkIGZpZWxkOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWVsZCA9IGdldERlY2xhcmVkRmllbGQoZW50aXR5LCBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpZWxkID0gZW50aXR5LmdldERlY2xhcmVkRmllbGQoIl8iICsgcHJvcGVydHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Lmxlbmd0aCgpID4gMSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShwcm9wZXJ0eS5jaGFyQXQoMCkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHByb3BlcnR5LmNoYXJBdCgxKSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vZG9uJ3QgdXNlIEludHJvc3BlY3RvciNkZWNhcGl0YWxpemUgaGVyZQotICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgPSBlbnRpdHkuZ2V0RGVjbGFyZWRGaWVsZChwcm9wZXJ0eS5zdWJzdHJpbmcoMCwgMSkudG9Mb3dlckNhc2UoKSArIHByb3BlcnR5LnN1YnN0cmluZygxKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUocHJvcGVydHkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImZpZWxkICIgKyBwcm9wZXJ0eSArICIgb3IgXyIgKyBwcm9wZXJ0eSArICIgbm90IGZvdW5kIiwgZTEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmaWVsZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnlUb0NhY2hlZEZpZWxkKGVudGl0eSwgcHJvcGVydHksIGZpZWxkKTsKLSAgICAgICAgICAgIGFkZEFubm90YXRpb25Ub0Fubm90YXRpb25FbnRyaWVzKEFycmF5cy5hc0xpc3QoZmllbGQuZ2V0QW5ub3RhdGlvbnMoKSksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWVsZCBnZXREZWNsYXJlZEZpZWxkKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChpc0NhY2hlZEZpZWxkKGVudGl0eSwgcHJvcGVydHkpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q2FjaGVkRmllbGQoZW50aXR5LCBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZW50aXR5LmdldERlY2xhcmVkRmllbGQocHJvcGVydHkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEFubm90YXRpb25Ub0Fubm90YXRpb25FbnRyaWVzKAotICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucywgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQotICAgIHsKLSAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykKLSAgICAgICAgewotICAgICAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5hZGRNZXRhRGF0YUVudHJ5KGNyZWF0ZU1ldGFEYXRhRW50cnlGb3JBbm5vdGF0aW9uKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShhbm5vdGF0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmb3VuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1ldGFEYXRhRW50cnkgY3JlYXRlTWV0YURhdGFFbnRyeUZvckFubm90YXRpb24oQW5ub3RhdGlvbiBmb3VuZEFubm90YXRpb24pCi0gICAgewotICAgICAgICBNZXRhRGF0YUVudHJ5IGVudHJ5ID0gbmV3IE1ldGFEYXRhRW50cnkoKTsKLQotICAgICAgICBlbnRyeS5zZXRLZXkoZm91bmRBbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgZW50cnkuc2V0VmFsdWUoZm91bmRBbm5vdGF0aW9uKTsKLQotICAgICAgICByZXR1cm4gZW50cnk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNzY0NWIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGlzIGZhY3RvcnkgY3JlYXRlcyBhIG1ldGEtZGF0YSBleHRyYWN0b3Igd2hpY2ggZXh0cmFjdHMgdGhlIG1ldGEtZGF0YQotICogb2YgdGhlIHZhbHVlIGJpbmRpbmcgb2YgYSBjb21wb25lbnQuCi0gKiA8cC8+Ci0gKiBvcmRlcjo8YnIvPgotICogPG9sPgotICogICA8bGk+Y29uZmlndXJlZCBtZXRhLWRhdGEgZXh0cmFjdG9yICh3ZWIueG1sKTwvbGk+Ci0gKiAgIDxsaT5jb25maWd1cmVkIG1ldGEtZGF0YSBleHRyYWN0b3IgKGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pPC9saT4KLSAqICAgPGxpPmRlZmF1bHQgaW1wbGVtZW50YXRpb248L2xpPgotICogPC9vbD4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkKLXsKLSAgICBwcml2YXRlIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gbnVsbDsKLQotICAgIHB1YmxpYyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQotICAgIHB1YmxpYyBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVdpdGgobnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZVdpdGgoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQotICAgIHsKLSAgICAgICAgaWYgKG1ldGFEYXRhRXh0cmFjdG9yID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SKTsKLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SKSk7Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMuYWRkKERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3IgPSAoTWV0YURhdGFFeHRyYWN0b3IpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1ldGFEYXRhRXh0cmFjdG9yICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKG1ldGFEYXRhRXh0cmFjdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjcmVhdGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvcldpdGgobWV0YURhdGFFeHRyYWN0b3IsIHByb3BlcnRpZXMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9NZXRhRGF0YUV4dHJhY3Rvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL01ldGFEYXRhRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNDA1MWQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL01ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci0KLS8qKgotICogQW4gbWV0YS1kYXRhIGV4dHJhY3RvciBpcyByZXNwb25zaWJsZSB0byBhbmFseXplIGFuIG9iamVjdAotICogYW5kIHJldHVybnMgYWxsIGF2YWlsYWJsZSBtZXRhLWRhdGEgaW5mb3JtYXRpb24KLSAqIAotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhRXh0cmFjdG9yCi17Ci0gICAgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5OTEyYS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgZXF1aXZhbGVudCB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0gKg0KLSAqIGlmIHRoZXJlIGlzIGFsc28gYSBwcm94eSBmb3IgdGhlIGV4dHJhY3RvciB5b3UgY2FuIHVzZSB0aGUgY2xhc3NOYW1lIHByb3BlcnR5IHRvIG1hbnVhbGx5IHJlcGVhdCB0aGUNCi0gKiBmdWxsIHF1YWxpZmllZCBjbGFzcyBuYW1lLg0KLSAqDQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGludGVyZmFjZSBCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIgZXh0ZW5kcyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZWE4MTkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIGl0J3MganVzdCBhIGhlbHBlciBmb3IgcHJveGllcyAtIHlvdSBqdXN0IG5lZWQgaXQsIGlmIHlvdSBkZWZpbmUgdGhlIGVxdWl2YWxlbnQgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotICoNCi0gKiBpZiB0aGVyZSBpcyBhbHNvIGEgcHJveHkgZm9yIHRoZSB0cmFuc2Zvcm1lciB5b3UgY2FuIHVzZSB0aGUgY2xhc3NOYW1lIHByb3BlcnR5IHRvIG1hbnVhbGx5IHJlcGVhdCB0aGUNCi0gKiBmdWxsIHF1YWxpZmllZCBjbGFzcyBuYW1lLg0KLSAqDQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGNsYXNzIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyLCBCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICBwcml2YXRlIFN0cmluZyBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lOw0KLQ0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyLmNvbnZlcnRNZXRhRGF0YShtZXRhRGF0YUVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWU7DQotICAgICAgICB9DQotICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKFN0cmluZyBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUgPSBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGdldE1ldGFEYXRhVHJhbnNmb3JtZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVRyYW5zZm9ybWVyKE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyID0gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmMzYWVlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5JZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5OZXN0ZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIuDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotDQotLyoqDQotICogRmFjdG9yeSB3aGljaCBjcmVhdGVzIHRoZSBNZXRhRGF0YVRyYW5zZm9ybWVyIGZvciBhIGdpdmVuIFZhbGlkYXRpb25TdHJhdGVneQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotLyoNCi0gKiBWYWxpZGF0aW9uU3RyYXRlZ3kgLT4gTWV0YURhdGFUcmFuc2Zvcm1lciBpbnN0ZWFkIG9mIE1ldGEtRGF0YSAtPiBNZXRhRGF0YVRyYW5zZm9ybWVyDQotICogdG8gYXZvaWQgYSBzZWNvbmQgc3RhdGljIG1hcHBpbmcgZS5nLiBmb3IganBhIGFubm90YXRpb25zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneT4NCi0gICAgICAgIGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1ldGFEYXRhVHJhbnNmb3JtZXI+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZzsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gc3ViTmFtZU1hcHBlckxpc3QgPQ0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PigpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vc2luY2UgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIHN0YXJ0dXAgbGlzdGVuZXIgb2YgdGhlIGNvcmUgZ2V0cyBleGVjdXRlZCBmaXJzdA0KLSAgICAgICAgcmVnaXN0ZXIobmV3IFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFUcmFuc2Zvcm1lciBjcmVhdGUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgPSBjcmVhdGVWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lKHZhbGlkYXRpb25TdHJhdGVneSk7DQotDQotICAgICAgICB0cnlUb0luaXRTdGF0aWNNYXBwaW5ncygpOw0KLQ0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyID0NCi0gICAgICAgICAgICAgICAgdHJ5VG9SZXNvbHZlQ2FjaGVkTWV0YURhdGFUcmFuc2Zvcm1lcih2YWxpZGF0aW9uU3RyYXRlZ3ksIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLQ0KLSAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZUFuZENhY2hlTWV0YURhdGFUcmFuc2Zvcm1lcih2YWxpZGF0aW9uU3RyYXRlZ3ksIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVZhbGlkYXRpb25TdHJhdGVneU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiBpc1Byb3h5RGV0ZWN0ZWQgPSBpc1Byb3h5KHZhbGlkYXRpb25TdHJhdGVneSk7DQotICAgICAgICAvL2luIGNhc2Ugb2YgYSBwcm94eSBhbmQgdGhlIHVzYWdlIG9mIGEgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi0gICAgICAgIGlmIChpc1Byb3h5RGV0ZWN0ZWQgJiYgdmFsaWRhdGlvblN0cmF0ZWd5IGluc3RhbmNlb2YgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICgoQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIpdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gIWlzUHJveHlEZXRlY3RlZCA/IFByb3h5VXRpbHMuZ2V0Q2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvSW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljTWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQcm94eShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpID09IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIGNyZWF0ZUFuZENhY2hlTWV0YURhdGFUcmFuc2Zvcm1lcigNCi0gICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LCBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICAgICAgU3RyaW5nIHRyYW5zZm9ybWVyTmFtZTsNCi0gICAgICAgIC8vbnVsbCAtPiB1c2UgbmFtZSBtYXBwZXJzDQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiBuYW1lTWFwcGVyIDogbmFtZU1hcHBlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJhbnNmb3JtZXJOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKHZhbGlkYXRpb25TdHJhdGVneSk7DQotDQotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWVyTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSB0cnlUb0NyZWF0ZUFuZENhY2hlTWV0YURhdGFUcmFuc2Zvcm1lcigNCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgdHJhbnNmb3JtZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhVHJhbnNmb3JtZXIgdHJ5VG9SZXNvbHZlQ2FjaGVkTWV0YURhdGFUcmFuc2Zvcm1lcigNCi0gICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LCBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcuY29udGFpbnNLZXkodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChNZXRhRGF0YVRyYW5zZm9ybWVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSgNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZy5nZXQodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5IGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBuZXdWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArIElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneS5JRF9QUkVGSVggKw0KLSAgICAgICAgICAgICAgICAgICAgKChJZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kpdmFsaWRhdGlvblN0cmF0ZWd5KS5nZXRJZCgpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLmNvbnRhaW5zS2V5KG5ld1ZhbGlkYXRpb25TdHJhdGVneU5hbWUpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIChNZXRhRGF0YVRyYW5zZm9ybWVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSgNCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcuZ2V0KG5ld1ZhbGlkYXRpb25TdHJhdGVneU5hbWUpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhVHJhbnNmb3JtZXIgdHJ5VG9DcmVhdGVBbmRDYWNoZU1ldGFEYXRhVHJhbnNmb3JtZXIoDQotICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0cmFuc2Zvcm1lck5hbWUpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lciA9IChNZXRhRGF0YVRyYW5zZm9ybWVyKQ0KLSAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodHJhbnNmb3JtZXJOYW1lKTsNCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5IGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICs9IElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneS5JRF9QUkVGSVggKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneSl2YWxpZGF0aW9uU3RyYXRlZ3kpLmdldElkKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCB0cmFuc2Zvcm1lck5hbWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgLy9zZXR1cCBpbnRlcm5hbCBzdGF0aWMgbWFwcGluZ3MNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnIDoNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cE1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cE1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3MpDQotICAgIHsNCi0gICAgICAgIGZvcihTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IG1hcHBpbmcgOiBtYXBwaW5ncykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNYXBwaW5nKG1hcHBpbmcuZ2V0U291cmNlKCksIG1hcHBpbmcuZ2V0VGFyZ2V0KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgU3RyaW5nIHRyYW5zZm9ybWVyTmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZGRpbmcgdmFsaWRhdGlvbiBzdHJhdGVneSB0byBtZXRhLWRhdGEgdHJhbnNmb3JtZXIgbWFwcGluZzogIg0KLSAgICAgICAgICAgICAgICArIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgKyAiIC0+ICIgKyB0cmFuc2Zvcm1lck5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZy5wdXQodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgdHJhbnNmb3JtZXJOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IGdldE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBTb3J0ZWROYW1lTWFwcGVyTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KHRoaXMubmFtZU1hcHBlckxpc3QsIHRoaXMuc3ViTmFtZU1hcHBlckxpc3QpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlcihOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgdHJ5VG9Jbml0TmFtZU1hcHBlcldpdGhFeGlzdGluZ1N1Yk1hcHBlcnModmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcik7DQotICAgICAgICBzdXBlci5yZWdpc3Rlcih2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogaXQncyBhIHZlcnkgc3BlY2lhbCBjYXNlIGR1ZSB0byB0aGUgbWlzc2luZyBvcmRlciBpbiB0aGUgZXhlY3V0aW9uIG9mIHN0YXJ0dXAtbGlzdGVuZXJzIChwaGFzZSBsaXN0ZW5lcnMpDQotICAgICAqIHBhY2thZ2VkIGluIGZhY2VzLWNvbmZpZy54bWwgZmlsZXMgb2YgamFycw0KLSAgICAgKg0KLSAgICAgKiBub3JtYWxseSB0aGUgZGVmYXVsdCBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIgc2hvdWxkIGJlIGVub3VnaA0KLSAgICAgKiBhbnl3YXksIGlmIGEgbW9kdWxlIGFkZHMgYSBuZXcgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyLA0KLSAgICAgKiBhbGwgcHJldmlvdXMgYWRkZWQgU3ViTmFtZU1hcHBlcnMgaGF2ZSB0byBiZSBhZGRlZCB0byBhdm9pZCBjb25mdXNpb24gaW4gc3BlY2lhbCBjYXNlcy4NCi0gICAgICogaWYgYSBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgZmluYWwgZXh0ZW5kIHRoZSBpbnRlcmZhY2UgYW5kIGZpbHRlciBpdCBpbiBhZGROYW1lTWFwcGVyDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciB3aGljaCBoYXMgdG8gYmUgYWRkZWQNCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0luaXROYW1lTWFwcGVyV2l0aEV4aXN0aW5nU3ViTWFwcGVycyhOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBpbnN0YW5jZW9mIFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IG5hbWVNYXBwZXIgOiB0aGlzLnN1Yk5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobmFtZU1hcHBlci5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoTmVzdGVkLmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgKChTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pil2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkTmFtZU1hcHBlcihuYW1lTWFwcGVyKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNTA0YjIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gdHJhbnNmb3JtIGNvbmNyZXRlIG1ldGEtZGF0YSB0byBhIG1vcmUgYWJzdHJhY3QgZm9ybS48YnIvPg0KLSAqIGUuZy46IEBSZXF1aXJlZCwgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLC4uLiksIEBMZW5ndGgobWluaW11bSA9IDEpLCAuLi4gLT4gcmVxdWlyZWQgPSB0cnVlDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotLy8qVHJhbnNmb3JtZXIgaW5zdGVhZCBvZiAqQ29udmVydGVyIHRvIGF2b2lkIG5hbWluZyBjb25mdXNpb24gDQotcHVibGljIGludGVyZmFjZSBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU29ydGVkTmFtZU1hcHBlckxpc3QuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NvcnRlZE5hbWVNYXBwZXJMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ODEzYmQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU29ydGVkTmFtZU1hcHBlckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5TdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLk5lc3RlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsNCi0NCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotY2xhc3MgU29ydGVkTmFtZU1hcHBlckxpc3Q8VCBleHRlbmRzIE5hbWVNYXBwZXI+IGltcGxlbWVudHMgTGlzdDxUPg0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PFQ+IHdyYXBwZWQ7DQotICAgIHByaXZhdGUgTGlzdDxUPiBnbG9iYWxTdWJOYW1lTWFwcGVyTGlzdDsNCi0NCi0gICAgU29ydGVkTmFtZU1hcHBlckxpc3QoTGlzdDxUPiB3cmFwcGVkLCBMaXN0PFQ+IHN1Yk5hbWVNYXBwZXJMaXN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOw0KLSAgICAgICAgdGhpcy5nbG9iYWxTdWJOYW1lTWFwcGVyTGlzdCA9IHN1Yk5hbWVNYXBwZXJMaXN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFkZChUIHQpDQotICAgIHsNCi0gICAgICAgIGlmICh0ICE9IG51bGwgJiYgdC5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoTmVzdGVkLmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYWRkU3ViTmFtZU1hcHBlcih0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IHdyYXBwZWQuYWRkKHQpOw0KLQ0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQod3JhcHBlZCwgbmV3IENvbXBhcmF0b3I8VD4oKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKFQgbm0xLCBUIG5tMikNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5tMSBpbnN0YW5jZW9mIFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlciAmJiBubTIgaW5zdGFuY2VvZiBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm0xIGluc3RhbmNlb2YgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyID8gMSA6IC0xOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gYWRkU3ViTmFtZU1hcHBlcihUIHN1Yk5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7DQotICAgICAgICBmb3IgKE5hbWVNYXBwZXIgbmFtZU1hcHBlciA6IHRoaXMud3JhcHBlZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAobmFtZU1hcHBlciBpbnN0YW5jZW9mIFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICgoU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyKSBuYW1lTWFwcGVyKS5hZGROYW1lTWFwcGVyKHN1Yk5hbWVNYXBwZXIpOw0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeVRvQWRkTWFwcGVyQXNHbG9iYWxTdWJOYW1lTWFwcGVyKHN1Yk5hbWVNYXBwZXIpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9BZGRNYXBwZXJBc0dsb2JhbFN1Yk5hbWVNYXBwZXIoVCBzdWJOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICBpZighdGhpcy5nbG9iYWxTdWJOYW1lTWFwcGVyTGlzdC5jb250YWlucyhzdWJOYW1lTWFwcGVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmdsb2JhbFN1Yk5hbWVNYXBwZXJMaXN0LmFkZChzdWJOYW1lTWFwcGVyKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBpbnQgc2l6ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnNpemUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaXNFbXB0eSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5jb250YWlucyhvKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSXRlcmF0b3I8VD4gaXRlcmF0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5pdGVyYXRvcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQudG9BcnJheSgpOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiU3VzcGljaW91c1RvQXJyYXlDYWxsIn0pDQotICAgIHB1YmxpYyA8VD4gVFtdIHRvQXJyYXkoVFtdIGEpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnRvQXJyYXkoYSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5yZW1vdmUobyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5jb250YWluc0FsbChjKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVD4gYykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuYWRkQWxsKGMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIFQ+IGMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmFkZEFsbChpbmRleCwgYyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVtb3ZlQWxsKGMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnJldGFpbkFsbChjKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpDQotICAgIHsNCi0gICAgICAgIHdyYXBwZWQuY2xlYXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVCBnZXQoaW50IGluZGV4KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXQoaW5kZXgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBUIHNldChpbnQgaW5kZXgsIFQgZWxlbWVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuc2V0KGluZGV4LCBlbGVtZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBUIGVsZW1lbnQpDQotICAgIHsNCi0gICAgICAgIHdyYXBwZWQuYWRkKGluZGV4LCBlbGVtZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVCByZW1vdmUoaW50IGluZGV4KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5yZW1vdmUoaW5kZXgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaW5kZXhPZihvKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5sYXN0SW5kZXhPZihvKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yPFQ+IGxpc3RJdGVyYXRvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmxpc3RJdGVyYXRvcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3I8VD4gbGlzdEl0ZXJhdG9yKGludCBpbmRleCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQubGlzdEl0ZXJhdG9yKGluZGV4KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxUPiBzdWJMaXN0KGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5zdWJMaXN0KGZyb21JbmRleCwgdG9JbmRleCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTM0ZmYzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIKLSAgICBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIxMzlkZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIC0gaWYgdGhlcmUgaXMgYSBwcm94eSBhcm91bmQgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDUwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5IGluc3RhbmNlb2YgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICgoQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIpdmFsaWRhdGlvblN0cmF0ZWd5KS5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTA1ZGUzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1ldGFEYXRhVHJhbnNmb3JtZXJzLg0KLSAqIChjb25maWd1cmVkIHZpYSB3ZWIueG1sKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI5YjMwNi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1ldGFEYXRhVHJhbnNmb3JtZXJzLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBlODUwZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIG1hcHMgRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1ldGFEYXRhVHJhbnNmb3JtZXJzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigzMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcyA9DQotICAgICAgICAgICAgICAgIFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3ModmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksIFZhbGlkYXRpb25TdHJhdGVneS5jbGFzcyk7DQotDQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsDQotICAgICAgICAgICAgICAgIGdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXRTaW1wbGVOYW1lKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWYxNzVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgdG8gcGxhY2UgVmFsaWRhdGlvblN0cmF0ZWdpZXMgYW5kIE1ldGFEYXRhVHJhbnNmb3JtZXJzIGluIHRoZSBzYW1lIHBhY2thZ2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDQwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcyA9DQotICAgICAgICAgICAgICAgIFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3ModmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksIFZhbGlkYXRpb25TdHJhdGVneS5jbGFzcyk7DQotDQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXRQYWNrYWdlKCkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBnZXRTaW1wbGVNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpICsgIi4iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLmdldFNpbXBsZU5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTaW1wbGVNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwb3N0Zml4ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVgpOw0KLQ0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmVuZHNXaXRoKCJWYWxpZGF0aW9uU3RyYXRlZ3kiKSB8fA0KLSAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmVuZHNXaXRoKCJTdHJhdGVneSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lQYWNrYWdlTmFtZSArIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYKSAscG9zdGZpeCkNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCJWYWxpZGF0aW9uU3RyYXRlZ3kiLCBwb3N0Zml4KQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoIlN0cmF0ZWd5IiwgcG9zdGZpeCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2luIGNhc2Ugb2YgYSBzdGF0aWMgdmFsaWRhdGlvbiBzdHJhdGVneSBtYXBwaW5nDQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUgKyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgKyBwb3N0Zml4Ow0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlMjE3Yi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5OZXN0ZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlckNvbXBhcmF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcg0KLSAgICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICBpbXBsZW1lbnRzIFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBzdWJOYW1lTWFwcGVycyA9IG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGROYW1lTWFwcGVyKE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiBuYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICBpZighdGhpcy5zdWJOYW1lTWFwcGVycy5jb250YWlucyhuYW1lTWFwcGVyKSAmJiBuYW1lTWFwcGVyLmdldENsYXNzKCkuaXNBbm5vdGF0aW9uUHJlc2VudChOZXN0ZWQuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuc3ViTmFtZU1hcHBlcnMuYWRkKG5hbWVNYXBwZXIpOw0KLSAgICAgICAgICAgIHNvcnRTdWJOYW1lTWFwcGVycygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzb3J0U3ViTmFtZU1hcHBlcnMoKQ0KLSAgICB7DQotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRoaXMuc3ViTmFtZU1hcHBlcnMsIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOw0KLQ0KLSAgICAgICAgZm9yKE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiBtYXBwZXIgOiB0aGlzLnN1Yk5hbWVNYXBwZXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IG1hcHBlci5jcmVhdGVOYW1lKHNvdXJjZSk7DQotDQotICAgICAgICAgICAgaWYocmVzdWx0ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24uamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NWY1MjguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uIGltcGxlbWVudHMgUHJvcGVydHlJbmZvcm1hdGlvbgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gaW5mb3JtYXRpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICBwcml2YXRlIExpc3Q8TWV0YURhdGFFbnRyeT4gbWV0YURhdGFMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUVudHJ5PigpOwotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNJbmZvcm1hdGlvbihTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZm9ybWF0aW9uTWFwLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZm9ybWF0aW9uTWFwLmdldChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gVCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVCkgZ2V0SW5mb3JtYXRpb24oa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgibmV3IGluZm9ybWF0aW9uIGFkZGVkIGtleTogIiArIGtleSArICIgdmFsdWU6ICIgKyB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmZvcm1hdGlvbk1hcC5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGFEYXRhRW50cnlbXSBnZXRNZXRhRGF0YUVudHJpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhTGlzdC50b0FycmF5KG5ldyBNZXRhRGF0YUVudHJ5W21ldGFEYXRhTGlzdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXRhRGF0YUVudHJ5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkKLSAgICB7Ci0gICAgICAgIG1ldGFEYXRhRW50cnkuc2V0UHJvcGVydGllcyh0aGlzLmluZm9ybWF0aW9uTWFwKTsKLSAgICAgICAgdGhpcy5tZXRhRGF0YUxpc3QuYWRkKG1ldGFEYXRhRW50cnkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0TWV0YURhdGFFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJyZXNldHRpbmcgbWV0YS1kYXRhIGVudHJpZXMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMubWV0YURhdGFMaXN0LmNsZWFyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlEZXRhaWxzLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eURldGFpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwMzdjZi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eURldGFpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eURldGFpbHMKLXsKLSAgICAvL2Zvcm1zIHRoZSBpZCBmb3IgY3Jvc3MtdmFsaWRhdGlvbiB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzCi0gICAgcHJpdmF0ZSBTdHJpbmcga2V5OwotICAgIHByaXZhdGUgT2JqZWN0IGJhc2VPYmplY3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlEZXRhaWxzKFN0cmluZyBrZXksIE9iamVjdCBiYXNlT2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICAgICAgdGhpcy5iYXNlT2JqZWN0ID0gYmFzZU9iamVjdDsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJhc2VPYmplY3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJhc2VPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZU9iamVjdChPYmplY3QgYmFzZU9iamVjdCkKLSAgICB7Ci0gICAgICAgIHRoaXMuYmFzZU9iamVjdCA9IGJhc2VPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb24uamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5Mjg0Zi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5SW5mb3JtYXRpb24KLXsKLSAgICBib29sZWFuIGNvbnRhaW5zSW5mb3JtYXRpb24oU3RyaW5nIGtleSk7Ci0gICAgT2JqZWN0IGdldEluZm9ybWF0aW9uKFN0cmluZyBrZXkpOwotICAgIDxUPiBUIGdldEluZm9ybWF0aW9uKFN0cmluZyBrZXksIENsYXNzPFQ+IHRhcmdldENsYXNzKTsKLSAgICB2b2lkIHNldEluZm9ybWF0aW9uKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSk7Ci0KLSAgICBNZXRhRGF0YUVudHJ5W10gZ2V0TWV0YURhdGFFbnRyaWVzKCk7Ci0gICAgdm9pZCBhZGRNZXRhRGF0YUVudHJ5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSk7Ci0gICAgdm9pZCByZXNldE1ldGFEYXRhRW50cmllcygpOwotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZWY0MzAuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlJbmZvcm1hdGlvbktleXMKLXsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFVEFJTFMgPSAicHJvcGVydHlfZGV0YWlscyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lQX1ZBTElEQVRJT04gPSAic2tpcF92YWxpZGF0aW9uIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gImxhYmVsIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9QUk9QRVJUSUVTID0gImN1c3RvbV9wcm9wZXJ0aWVzIjsKLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L0RlZmF1bHRQcm94eUhlbHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJveHkvRGVmYXVsdFByb3h5SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ODViOTYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJveHkvRGVmYXVsdFByb3h5SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb3h5SGVscGVyIGltcGxlbWVudHMgUHJveHlIZWxwZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0UHJveHlIZWxwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgPFQ+IENsYXNzPFQ+IGdldFVucHJveGllZENsYXNzKENsYXNzIGN1cnJlbnRDbGFzcywgQ2xhc3M8VD4gdGFyZ2V0VHlwZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChDbGFzczxUPilnZXRVbnByb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzcyBnZXRVbnByb3hpZWRDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIGlmKGlzUHJveGllZENsYXNzKGN1cnJlbnRDbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY3VycmVudENsYXNzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZU9mQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZiAoaXNQcm94aWVkQ2xhc3MoY3VycmVudENsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3VycmVudENsYXNzLmdldFN1cGVyY2xhc3MoKS5nZXROYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY3VycmVudENsYXNzLmdldE5hbWUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZU9mT2JqZWN0KE9iamVjdCBvYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmKG9iamVjdCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROYW1lT2ZDbGFzcyhvYmplY3QuZ2V0Q2xhc3MoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3hpZWRDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCIkJEVuaGFuY2VyQnlDR0xJQiQkIikgfHwNCi0gICAgICAgICAgICBjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCIkJEZhc3RDbGFzc0J5Q0dMSUIkJCIpIHx8DQotICAgICAgICAgICAgY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiXyQkX2phdmFzc2lzdCIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzUHJveGllZE9iamVjdChPYmplY3QgcHJveGllZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3hpZWRPYmplY3QgIT0gbnVsbCAmJiBpc1Byb3hpZWRDbGFzcyhwcm94aWVkT2JqZWN0LmdldENsYXNzKCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L1Byb3h5SGVscGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm94eS9Qcm94eUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2U3ZTRhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L1Byb3h5SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJveHlIZWxwZXINCi17DQotICAgIENsYXNzIGdldFVucHJveGllZENsYXNzKENsYXNzIGN1cnJlbnRDbGFzcyk7DQotDQotICAgIDxUPiBDbGFzczxUPiBnZXRVbnByb3hpZWRDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MsIENsYXNzPFQ+IHRhcmdldFR5cGUpOw0KLQ0KLSAgICBTdHJpbmcgZ2V0TmFtZU9mQ2xhc3MoQ2xhc3MgcHJveGllZENsYXNzKTsNCi0NCi0gICAgU3RyaW5nIGdldENsYXNzTmFtZU9mT2JqZWN0KE9iamVjdCBwcm94aWVkT2JqZWN0KTsNCi0NCi0gICAgYm9vbGVhbiBpc1Byb3hpZWRDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MpOw0KLQ0KLSAgICBib29sZWFuIGlzUHJveGllZE9iamVjdChPYmplY3QgcHJveGllZE9iamVjdCk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlY29yZGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlY29yZGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwZjIzZi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZWNvcmRlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotCi0vKioKLSAqIEFsbG93cyB0byBjYXB0dXJlIGNvbnZlcnRlZCB2YWx1ZXMuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIKLXsKLSAgICB2b2lkIHJlY29yZFVzZXJJbnB1dChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzU5MjBjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLQotLyoqCi0gKiBCYXNlIGZvciBhbGwgUmVuZGVyS2l0V3JhcHBlckZhY3RvcmllcyB0byBmb3JjZSBhIHNwZWNpZmljIGJlaGF2aW91cgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFJlbmRlcktpdCwgUmVuZGVyS2l0PgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSB3cmFwcGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBkZWFjdGl2YXRlZCA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeShBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRoaXMud3JhcHBlZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLndyYXBwZWQuYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkocmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkZWFjdGl2YXRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5kZWFjdGl2YXRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWFjdGl2YXRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVhY3RpdmF0ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFJlbmRlcktpdCBjcmVhdGUoUmVuZGVyS2l0IHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIGlmKGlzRGVhY3RpdmF0ZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBSZW5kZXJLaXQgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBpZih0aGlzLndyYXBwZWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy53cmFwcGVkLmNyZWF0ZShyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVXcmFwcGVyKHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KTsKLQotICAgIC8qKgotICAgICAqIHNpbXBsZSB0ZXN0IGZvciBlYXJseSBjb25maWcgaW4gY2FzZSBvZiBtb2phcnJhIChpbmNsLiB0aGUgY29tYmluYXRpb24gd2l0aCB0cmluaWRhZCkuCi0gICAgICogdXNlIGEgY3VzdG9tIGV4dHZhbCBjb250ZXh0IGltcGwuIChzZWUgRVhUVkFMLTU4KSB0byBvcHRpbWl6ZSB0aGlzIGNoZWNrIGZvciB0aGUgdGFyZ2V0IHJ1bnRpbWUuCi0gICAgICogdGhpcyBjaGVjayB3b3JrcyBmb3IgYWxsIGN1cnJlbnQgaW1wbGVtZW50YXRpb25zIHNpbmNlIHRoZSBqc2YgaW50ZXJuYWxzIGFyZSBhdXRvbS4gcmVhZHkgZHVyaW5nIGEgcmVxdWVzdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUganNmIGltcGwuIGlzIGluaXRpYWxpemVkIGFuZCBpdCdzIHBvc3NpYmxlIHRvIHVzZSBpdCBhcyBleHBlY3RlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQXBwbGljYXRpb25Jbml0aWFsaXplZCgpCi0gICAgewotICAgICAgICByZXR1cm4gSnNmVXRpbHMuaXNBcHBsaWNhdGlvbkluaXRpYWxpemVkKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0RlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0RlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjI2YjcyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeQotewotICAgIHByaXZhdGUgUmVuZGVyS2l0IHJlbmRlcktpdDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJJQ19SRU5ERVJfS0lUX1dSQVBQRVJfRkFDVE9SWSA9Ci0gICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0LkdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiB1c2VHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCBjcmVhdGVXcmFwcGVyKFJlbmRlcktpdCByZW5kZXJLaXQpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVya2l0IHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcktpdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3dvcmthcm91bmQgZm9yIG1vamFycmEgKEVYVFZBTC0zOCkKLSAgICAgICAgaWYodXNlR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENsYXNzIGdlbmVyaWNGYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUoR0VORVJJQ19SRU5ERVJfS0lUX1dSQVBQRVJfRkFDVE9SWSk7Ci0gICAgICAgICAgICB1c2VHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgPSBnZW5lcmljRmFjdG9yeSAhPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodXNlR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5KQotICAgICAgICB7Ci0gICAgICAgICAgICBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID0gKEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpQ2xhc3NVdGlscwotICAgICAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShHRU5FUklDX1JFTkRFUl9LSVRfV1JBUFBFUl9GQUNUT1JZKTsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jcmVhdGVXcmFwcGVyKHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLnJlbmRlcktpdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnJlbmRlcktpdCA9IG5ldyBFeHRWYWxSZW5kZXJLaXQocmVuZGVyS2l0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJLaXQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxMYXp5UmVuZGVyZXJQcm94eS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbExhenlSZW5kZXJlclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNmFiZDIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbExhenlSZW5kZXJlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7DQotDQotLyoqDQotICogdG8gc3VwcG9ydCBhIGN1c3RvbSBwcm94eQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBFeHRWYWxMYXp5UmVuZGVyZXJQcm94eSBleHRlbmRzIFJlbmRlcmVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIFJlbmRlcmVyIHdyYXBwZWQ7DQotDQotICAgIHB1YmxpYyBFeHRWYWxMYXp5UmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyZXI7DQotDQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInNpbXBsZSBwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldExhenlSZW5kZXJlcigpLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQ0KLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBSZW5kZXJlciBnZXRMYXp5UmVuZGVyZXIoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcHJveHlDbGFzc05hbWUgPSAoU3RyaW5nKSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSk7DQotDQotICAgICAgICBpZihwcm94eUNsYXNzTmFtZSAhPSBudWxsICYmICFwcm94eUNsYXNzTmFtZS5lbmRzV2l0aChnZXRDbGFzcygpLmdldE5hbWUoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShwcm94eUNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYodGFyZ2V0Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImEgY3VzdG9tIGludmFsaWQgcmVuZGVyZXIgcHJveHkgaXMgY29uZmlndXJlZDogIiArIHByb3h5Q2xhc3NOYW1lKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgQ2xhc3NbXSBhcmdDbGFzc2VzID0gbmV3IENsYXNzWzFdOw0KLSAgICAgICAgICAgIGFyZ0NsYXNzZXNbMF0gPSBSZW5kZXJlci5jbGFzczsNCi0NCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGFyZ2V0Q2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJnQ2xhc3Nlcyk7DQotICAgICAgICAgICAgICAgIHJldHVybiAoUmVuZGVyZXIpY29uc3RydWN0b3IubmV3SW5zdGFuY2UodGhpcy53cmFwcGVkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGNyZWF0ZTogIiArIHRhcmdldENsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMzU0ZTUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVN0cmVhbTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LlJlc3BvbnNlV3JpdGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZXNwb25zZVN0YXRlTWFuYWdlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcktpdCBleHRlbmRzIFJlbmRlcktpdAotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcktpdChSZW5kZXJLaXQgd3JhcHBlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlLCBSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIGlmIChyZW5kZXJlciBpbnN0YW5jZW9mIEV4dFZhbFJlbmRlcmVyV3JhcHBlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgcmVuZGVyZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgY3JlYXRlV3JhcHBlcihyZW5kZXJlcikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFJlbmRlcmVyIGdldFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUpCi0gICAgewotICAgICAgICBSZW5kZXJlciByZW5kZXJlciA9IHdyYXBwZWQuZ2V0UmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUpOwotCi0gICAgICAgIGlmKHJlbmRlcmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJlciBpbnN0YW5jZW9mIEV4dFZhbFJlbmRlcmVyV3JhcHBlciA/IHJlbmRlcmVyIDogY3JlYXRlV3JhcHBlcihyZW5kZXJlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oIm5vIHJlbmRlcmVyIGZvdW5kIGZvciBmYW1pbHkgIiArIGZhbWlseSArICIgYW5kIHR5cGUgIiArIHJlbmRlcmVyVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVuZGVyZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlU3RhdGVNYW5hZ2VyIGdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlV3JpdGVyIGNyZWF0ZVJlc3BvbnNlV3JpdGVyKFdyaXRlciB3cml0ZXIsIFN0cmluZyBzLCBTdHJpbmcgczEpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jcmVhdGVSZXNwb25zZVdyaXRlcih3cml0ZXIsIHMsIHMxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdHJlYW0gY3JlYXRlUmVzcG9uc2VTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmNyZWF0ZVJlc3BvbnNlU3RyZWFtKG91dHB1dFN0cmVhbSk7Ci0gICAgfQotCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkKLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgY3JlYXRlV3JhcHBlcihSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRXh0VmFsUmVuZGVyZXJXcmFwcGVyKHJlbmRlcmVyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0RmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM3NmI5OC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogY2VudHJhbCBtZWNoYW5pc20gd2hpY2ggaXMgcmVzcG9uc2libGUgdG8gY3JlYXRlIGEgd3JhcHBlciBmb3IgYSByZW5kZXJlciAtIHN0YXJ0aW5nIHBvaW50IG9mIGV4dHZhbC4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcktpdEZhY3RvcnkgZXh0ZW5kcyBSZW5kZXJLaXRGYWN0b3J5Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLSAgICBwcml2YXRlIFJlbmRlcktpdEZhY3Rvcnkgd3JhcHBlZDsKLSAgICBwcml2YXRlIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5OwotICAgIHByaXZhdGUgQm9vbGVhbiBpc0RlYWN0aXZhdGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcktpdEZhY3RvcnkoUmVuZGVyS2l0RmFjdG9yeSByZW5kZXJLaXRGYWN0b3J5KQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyS2l0RmFjdG9yeTsKLQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcktpdChTdHJpbmcgcywgUmVuZGVyS2l0IHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZC5hZGRSZW5kZXJLaXQocywgcmVuZGVyS2l0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVuZGVyS2l0IGdldFJlbmRlcktpdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIFJlbmRlcktpdCByZW5kZXJLaXQgPSB0aGlzLndyYXBwZWQuZ2V0UmVuZGVyS2l0KGZhY2VzQ29udGV4dCwgcyk7Ci0KLSAgICAgICAgLy9mb3IgbW9qYXJyYSArIHRyaW5pZGFkCi0gICAgICAgIGlmKHJlbmRlcktpdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeVRvSW5pdERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpOwotCi0gICAgICAgIGNoZWNrUmVuZGVyS2l0RmFjdG9yeURlYWN0aXZhdGlvbigpOwotCi0gICAgICAgIGlmKHRoaXMuaXNEZWFjdGl2YXRlZCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcktpdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vdGVzdCBlYXJseSBjb25maWcgaW4gY2FzZSBvZiBtb2phcnJhCi0gICAgICAgIGlmKCF0aGlzLmRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5pc0FwcGxpY2F0aW9uSW5pdGlhbGl6ZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmNyZWF0ZVdyYXBwZXIocmVuZGVyS2l0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnlUb0NyZWF0ZVdyYXBwZXJXaXRoV3JhcHBlckZhY3RvcnkocmVuZGVyS2l0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tSZW5kZXJLaXRGYWN0b3J5RGVhY3RpdmF0aW9uKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMuaXNEZWFjdGl2YXRlZCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihFeHRWYWxVdGlscy5pc0V4dFZhbERlYWN0aXZhdGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc0RlYWN0aXZhdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKHRoaXMuZGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmlzQXBwbGljYXRpb25Jbml0aWFsaXplZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuaXNEZWFjdGl2YXRlZCA9IGlzUmVuZGVyS2l0RmFjdG9yeURlYWN0aXZhdGVkVmlhV2ViWG1sKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc0RlYWN0aXZhdGVkID0gaXNSZW5kZXJLaXRGYWN0b3J5RGVhY3RpdmF0ZWRWaWFWTVBhcmFtZXRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB0cnlUb0luaXREZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5kZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy93b3JrYXJvdW5kIGZvciBtb2phcnJhIHRvIGFsbG93IGEgY3VzdG9tIGZhY3RvcnkgZHVyaW5nIHRoZSBlYXJseSBjb25maWcgcGhhc2UKLSAgICAgICAgICAgIC8vanVzdCBjcmVhdGUgdGhlIGZhY3Rvcnkgd2l0aCB0aGUgZ2l2ZW4gbmFtZQotICAgICAgICAgICAgLy8raXQgc2hvdWxkIGV4dGVuZCB5b3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiB3aGljaCB5b3UgcmVnaXN0ZXIgYXMgdXN1YWwKLSAgICAgICAgICAgIE9iamVjdCBjdXN0b21GYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKAotICAgICAgICAgICAgICAgICAgICBFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSArICIuY3VzdG9tLlJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Iik7Ci0KLSAgICAgICAgICAgIGlmKGN1c3RvbUZhY3RvcnkgaW5zdGFuY2VvZiBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID0gKEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpY3VzdG9tRmFjdG9yeTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSA9IG5ldyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUmVuZGVyS2l0IHRyeVRvQ3JlYXRlV3JhcHBlcldpdGhXcmFwcGVyRmFjdG9yeShSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSB3cmFwcGVyRmFjdG9yeSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgIC8vc29tZSBjb21wb25lbnQgbGlicyBlLmcuIG15ZmFjZXMtdHJpbmlkYWQgYXJlbid0IGNvbXBhdGlibGUgd2l0aCB0aGlzIGNsZWFuIGFwcHJvYWNoCi0gICAgICAgIC8vZXhhbXBsZSBzZWUgVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIKLSAgICAgICAgaWYod3JhcHBlckZhY3RvcnkuaXNEZWFjdGl2YXRlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJGYWN0b3J5LmNyZWF0ZShyZW5kZXJLaXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGdldFJlbmRlcktpdElkcygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkLmdldFJlbmRlcktpdElkcygpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlbmRlcktpdEZhY3RvcnlEZWFjdGl2YXRlZFZpYVdlYlhtbCgpCi0gICAgewotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfUkVOREVSX0tJVF9GQUNUT1JZKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNSZW5kZXJLaXRGYWN0b3J5RGVhY3RpdmF0ZWRWaWFWTVBhcmFtZXRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoU3lzdGVtCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsKLSAgICAgICAgICAgICAgICAgICAgIi5ERUFDVElWQVRFX1JFTkRFUl9LSVRfRkFDVE9SWSIsICJmYWxzZSIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzNjEzYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlJlbmRlcmVyUHJveHlTdG9yYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkpzZlByb2plY3RTdGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiB0byBhdm9pZCBtdWx0aXBsZSBjYWxscyBvZiByZW5kZXJlciBtZXRob2RzIHdpdGhpbiByZW5kZXJlciBpbnRlcmNlcHRvcnMgKGUuZy4gZm9yIGVuY29kZSwgZGVjb2RlLC4uLikKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcmVyUHJveHkgZXh0ZW5kcyBSZW5kZXJlcgotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9IEV4dFZhbFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpICsgIjpLRVkiOwotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0gICAgCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHJlbmRlcmVyOwotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInByb3h5IGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGVudHJ5ID0gZ2V0UmVuZGVyZXJFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRGVjb2RlQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldERlY29kZUNhbGxlZCh0cnVlKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVkLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DcmVhdGVNZXNzYWdlKCJkZWNvZGUiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkgPSBnZXRSZW5kZXJlckVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNFbmNvZGVCZWdpbkNhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXRFbmNvZGVCZWdpbkNhbGxlZCh0cnVlKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlZC5lbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DcmVhdGVNZXNzYWdlKCJlbmNvZGVCZWdpbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBlbnRyeSA9IGdldFJlbmRlcmVyRW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0VuY29kZUNoaWxkcmVuQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldEVuY29kZUNoaWxkcmVuQ2FsbGVkKHRydWUpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLndyYXBwZWQuZW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeVRvQ3JlYXRlTWVzc2FnZSgiZW5jb2RlQ2hpbGRyZW4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGVudHJ5ID0gZ2V0UmVuZGVyZXJFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRW5jb2RlRW5kQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldEVuY29kZUVuZENhbGxlZCh0cnVlKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVkLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DcmVhdGVNZXNzYWdlKCJlbmNvZGVFbmQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydENsaWVudElkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICB0aHJvdyByOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UmVuZGVyc0NoaWxkcmVuKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZW5kZXJzQ2hpbGRyZW4oKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgdGhyb3cgdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGVudHJ5ID0gZ2V0UmVuZGVyZXJFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoZW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh3cmFwcGVkLmdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DcmVhdGVNZXNzYWdlKCJnZXRDb252ZXJ0ZWRWYWx1ZSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGdldFJlbmRlcmVyRW50cnkoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBTdHJpbmcga2V5ID0gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBrZXkgKz0gZ2V0T3B0aW9uYWxLZXkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFnZXRSZW5kZXJlclN0b3JhZ2UoKS5jb250YWluc0VudHJ5KGdldFJlbmRlcmVyS2V5KCksIGtleSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldFJlbmRlcmVyU3RvcmFnZSgpLnNldEVudHJ5KGdldFJlbmRlcmVyS2V5KCksIGtleSwgbmV3IFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldFJlbmRlcmVyU3RvcmFnZSgpLmdldEVudHJ5KGdldFJlbmRlcmVyS2V5KCksIGtleSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcHRpb25hbEtleShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbmRlcmVyS2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh0aGlzLndyYXBwZWQuZ2V0Q2xhc3MoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJlclByb3h5U3RvcmFnZSBnZXRSZW5kZXJlclN0b3JhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoUmVuZGVyZXJQcm94eVN0b3JhZ2UuY2xhc3MsIFJlbmRlcmVyUHJveHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCkKLSAgICB7Ci0gICAgICAgIC8vcmVzZXQgY29tcG9uZW50IHByb3h5IG1hcHBpbmcKLSAgICAgICAgRXh0VmFsVXRpbHMucmVzZXRTdG9yYWdlKFJlbmRlcmVyUHJveHlTdG9yYWdlLmNsYXNzLCBSZW5kZXJlclByb3h5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0NyZWF0ZU1lc3NhZ2UoU3RyaW5nIG1ldGhvZE5hbWUpCi0gICAgewotICAgICAgICBpZihKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLkRldmVsb3BtZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiZG91YmxlIGNhbGwgb2YgIiArIHRoaXMud3JhcHBlZC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIjIiArIG1ldGhvZE5hbWUgKyAiIGZpbHRlcmVkLiAiICsKLSAgICAgICAgICAgICAgICAgICAgInRoaXMgb3B0aW1pemF0aW9uIG1pZ2h0IGxlYWQgdG8gaW5jb21wYXRpYmlsaXRpZXMgd2l0aCBzb21lIGNvbXBvbmVudCBsaWJzLiAiICsKLSAgICAgICAgICAgICAgICAgICAgImluIHN1Y2ggYSBjYXNlIHVzZSB0aGUgc3VwcG9ydCBtb2R1bGUgZm9yIHRoZSBjb21wb25lbnQgbGliIG9yIHVzZTogIiArCi0gICAgICAgICAgICAgICAgICAgICJFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSwgbnVsbCk7ICIgKwotICAgICAgICAgICAgICAgICAgICAiaW4gYSBzdGFydHVwIGxpc3RlbmVyIjsKLQotICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRNZXNzYWdlKG51bGwsIEV4dFZhbFV0aWxzLmNyZWF0ZUZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU0VWRVJJVFlfV0FSTiwgbWVzc2FnZSwgbWVzc2FnZSkpOwotCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKG1lc3NhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygidHVybiBvbiB0aGUgZGV2ZWxvcG1lbnQgbW9kZSBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiwgaWYgc29tZXRoaW5nIGlzIGRpc3BsYXllZCB3cm9uZy4iKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjMzA1ZS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUmVuZGVyZXJJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLQotLyoqCi0gKiBEZWZhdWx0IGFwcHJvYWNoIHRvIGF2b2lkIHByb3hpZXMgZm9yIGNvbnZlcnRlcnMgYW5kIHRoZSBhZGFwdGVyIGZhbGxiYWNrLgotICogSXQgcmVxdWlyZXMgdGhhdCBjb21wb25lbnRzIGRlbGVnYXRlIGdldENvbnZlcnRlZFZhbHVlIHRvIGEgcmVuZGVyZXIuPGJyLz4KLSAqIElmIGl0IGlzbid0IHRoZSBjYXNlIGZvciB5b3VyIGNvbXBvbmVudCBsaWIgdXNlOgotICogb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHkuRXh0VmFsQXBwbGljYXRpb25GYWN0b3J5PGJyLz4KLSAqIGFuZDxici8+Ci0gKiBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5Qcm94eU1hcHBpbmdQaGFzZUxpc3RlbmVyCi0gKiA8cC8+Ci0gKiBUaGlzIHdyYXBwZXIgd2lsbCBhbHNvIGltcGxlbWVudCBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIGJlaGF2aW91cgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyZXJXcmFwcGVyIGV4dGVuZHMgUmVuZGVyZXIKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIHdyYXBwZWQ7Ci0gICAgcHJvdGVjdGVkIEV4dFZhbENvbnRleHQgZXh0VmFsQ29udGV4dCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcmVyV3JhcHBlcihSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwcm94eUNsYXNzTmFtZSA9IChTdHJpbmcpRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVkpOwotCi0gICAgICAgIGlmKHByb3h5Q2xhc3NOYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNvbmZpZ3VyZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gbmV3IEV4dFZhbExhenlSZW5kZXJlclByb3h5KHJlbmRlcmVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUocHJveHlDbGFzc05hbWUpOwotCi0gICAgICAgIGlmKHRhcmdldENsYXNzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNvbmZpZ3VyZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gbmV3IEV4dFZhbExhenlSZW5kZXJlclByb3h5KHJlbmRlcmVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzW10gYXJnQ2xhc3NlcyA9IG5ldyBDbGFzc1sxXTsKLSAgICAgICAgYXJnQ2xhc3Nlc1swXSA9IFJlbmRlcmVyLmNsYXNzOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHRhcmdldENsYXNzLmdldENvbnN0cnVjdG9yKGFyZ0NsYXNzZXMpOwotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gKFJlbmRlcmVyKWNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHJlbmRlcmVyKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm5vIGV4dHZhbCByZW5kZXJlciBwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0dmFsIHJlbmRlcmVyIHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZURlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZURlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZGVjb2RlIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZURlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZURlY29kZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckRlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJEZWNvZGUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSB0cnVlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJlbmNvZGVCZWdpbiBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVCZWdpbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVCZWdpbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUNoaWxkcmVuIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImVuY29kZUNoaWxkcmVuIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUNoaWxkcmVuIG9mICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVDaGlsZHJlbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUNoaWxkcmVuIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZW5jb2RlRW5kIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVFbmQgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5lbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJFbmNvZGVFbmQgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlRW5kIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBjb252ZXJ0Q2xpZW50SWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jb252ZXJ0Q2xpZW50SWQoZmFjZXNDb250ZXh0LCBzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0gICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8sIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QgPSBlLmdldFJldHVyblZhbHVlT25FeGNlcHRpb24oY29udmVydGVkT2JqZWN0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJnZXRDb252ZXJ0ZWRWYWx1ZSBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlR2V0Q29udmVydGVkVmFsdWUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgY29udmVydGVkT2JqZWN0ID0gd3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyR2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbywgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRPYmplY3Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMmZmZGEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTQ3Mjc5MDQ5ODc2NjI1MTM0Nkw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThjMjBhNy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQxODQyNDA1MTQ2NDgxNDg4OEw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQyODU3YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXJJbnRlcmNlcHRvciBleGNlcHRpb25Tb3VyY2U7Ci0gICAgcHJvdGVjdGVkIE9iamVjdCBpbmZvcm1hdGlvbjsKLSAgICBib29sZWFuIHNraXBPdGhlckludGVyY2VwdG9ycyA9IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIzNDMwNzQwNzc1MzI5MTU3MjJMOwotCi0gICAgcHVibGljIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbihib29sZWFuIHNraXBPdGhlckludGVyY2VwdG9ycykKLSAgICB7Ci0gICAgICAgIHRoaXMuc2tpcE90aGVySW50ZXJjZXB0b3JzID0gc2tpcE90aGVySW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzLCBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzKHNraXBPdGhlckludGVyY2VwdG9ycyk7Ci0gICAgICAgIHRoaXMuZXhjZXB0aW9uU291cmNlID0gcmVuZGVyZXJJbnRlcmNlcHRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvbihPYmplY3QgaW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICB0aGlzLmluZm9ybWF0aW9uID0gaW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gaW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNraXBPdGhlckludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJldHVyblZhbHVlT25FeGNlcHRpb24oT2JqZWN0IGN1cnJlbnRSZXR1cm5WYWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLmV4Y2VwdGlvblNvdXJjZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5leGNlcHRpb25Tb3VyY2UuZ2V0UmV0dXJuVmFsdWVPblNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24odGhpcywgY3VycmVudFJldHVyblZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3VycmVudFJldHVyblZhbHVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA3MGE2YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0Fic3RyYWN0U3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Qcm9qZWN0U3RhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIGV4ZWN1dGUgbG9naWMganVzdCBvbmNlLg0KLSAqIGUuZy4gcmVnaXN0ZXIgYXJ0aWZhY3RzIHZpYSBhcGkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgLy9kb24ndCByZW1vdmUgLSBpdCdzIGEgZmFsbGJhY2sgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggZGVyZWdpc3RyYXRpb24NCi0gICAgLy90YXJnZXQ6IGRvbid0IHByb2Nlc3MgaW5pdCBsb2dpYyBtb3JlIHRoYW4gb25jZQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENsYXNzPiBpbml0aWFsaXplZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVySW5pdGlhbGl6ZWQgPSBmYWxzZTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKEFic3RyYWN0U3RhcnR1cExpc3RlbmVyLmNsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZWRMaXN0ZW5lcnMuY29udGFpbnMoZ2V0Q2xhc3MoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnQgaW5pdCBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWlzU3RhcnR1cExpc3RlbmVyRGVhY3RpdmF0ZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJpbml0IG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZGVhY3RpdmF0ZWQiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImluaXQgb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBKc2ZVdGlscy5kZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcih0aGlzKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBkZXJlZ2lzdGVyaW5nIHRoZSBwaGFzZS1saXN0ZW5lciINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtPiB0aGVyZSBpcyBqdXN0IGEgbGl0dGxlIG92ZXJoZWFkLCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBidXQgZXZlcnl0aGluZyBlbHNlIHdvcmtzIGNvcnJlY3RseS4iDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaG93ZXZlciwgcGxlYXNlIGluZm9ybSB0aGUgY29tbXVuaXR5IGFib3V0IHlvdXIgY29uZmlndXJhdGlvbiIsIHQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWRMaXN0ZW5lcnMuYWRkKGdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5SRVNUT1JFX1ZJRVc7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTdGFydHVwTGlzdGVuZXJEZWFjdGl2YXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5pc0V4dFZhbERlYWN0aXZhdGVkKCkgfHwNCi0gICAgICAgICAgICAgICAgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sVXRpbHMuZ2V0SW5pdFBhcmFtZXRlcihudWxsLCBnZXRDbGFzcygpLmdldE5hbWUoKSArICI6REVBQ1RJVkFURUQiKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFByb2plY3RTdGFnZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgaWYoIWRlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlckluaXRpYWxpemVkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoUHJvamVjdFN0YWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpLCBnZXRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpLCBmYWxzZSk7DQotICAgICAgICAgICAgZGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVySW5pdGlhbGl6ZWQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBQcm9qZWN0U3RhZ2VSZXNvbHZlciBnZXRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdCgpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0V4dFZhbFN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9FeHRWYWxTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVkMzI4MS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0V4dFZhbFN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlBoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXIKLSAgICAgICAgLkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjUwNDgyNjQyMTA4NjU3MjAxMkw7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKEV4dFZhbEluZm9ybWF0aW9uLlZFUlNJT04gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnRpbmcgdXAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciB2IiArIEV4dFZhbEluZm9ybWF0aW9uLlZFUlNJT04pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydGluZyB1cCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsKLQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSwgRXh0VmFsUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCksIGZhbHNlKTsKLQotICAgICAgICBpbml0TmFtZU1hcHBlcnMoKTsKLSAgICAgICAgaW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgaW5pdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsKLSAgICAgICAgaW5pdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICBpbml0UGhhc2VMaXN0ZW5lcnMoKTsKLSAgICAgICAgaW5pdFZpb2xhdGlvblNldmVyaXR5S2V5KCk7Ci0gICAgICAgIGluaXREaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb25LZXkoKTsKLSAgICAgICAgaW5pdFJlcXVpcmVkSW5pdGlhbGl6YXRpb24oKTsKLSAgICAgICAgZXhlY3V0ZUN1c3RvbVN0YXJ0dXBMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0TmFtZU1hcHBlcnMoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGRlYWN0aXZhdGVEZWZhdWx0TmFtZU1hcHBlcnMgPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9ERUZBVUxUX05BTUVfTUFQUEVSUzsKLSAgICAgICAgaWYgKChkZWFjdGl2YXRlRGVmYXVsdE5hbWVNYXBwZXJzICE9IG51bGwgJiYgZGVhY3RpdmF0ZURlZmF1bHROYW1lTWFwcGVycy5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvL3JlZ2lzdGVyIG1ldGFkYXRhIHRvIHZhbGlkYXRpb24gc3RyYXRlZ3kgbmFtZSBtYXBwZXIKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsKLQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsKLQotICAgICAgICAvL3JlZ2lzdGVyIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWVzc2FnZSByZXNvbHZlciBuYW1lIG1hcHBlcgotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0KLSAgICAgICAgLy9yZWdpc3RlciB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1ldGFkYXRhIHRyYW5zZm9ybWVyIG5hbWUgbWFwcGVyCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUN1c3RvbVN0YXJ0dXBMaXN0ZW5lcigpCi0gICAgewotICAgICAgICBTdHJpbmcgY3VzdG9tU3RhcnR1cExpc3RlbmVyTmFtZSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBUlRVUF9MSVNURU5FUik7Ci0gICAgICAgIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lciA9Ci0gICAgICAgICAgICAoQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGN1c3RvbVN0YXJ0dXBMaXN0ZW5lck5hbWUpOwotCi0gICAgICAgIGlmKGN1c3RvbVN0YXJ0dXBMaXN0ZW5lciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydCBpbml0IG9mICIgKyBjdXN0b21TdGFydHVwTGlzdGVuZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjdXN0b21TdGFydHVwTGlzdGVuZXIuaW5pdCgpOwotCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJpbml0IG9mICIgKyBjdXN0b21TdGFydHVwTGlzdGVuZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKAotICAgICAgICAgICAgICAgIG5ldyBIdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigKLSAgICAgICAgICAgICAgICBuZXcgVmlvbGF0aW9uU2V2ZXJpdHlWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCkKLSAgICB7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnNldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIobmV3IERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCksIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRQaGFzZUxpc3RlbmVycygpCi0gICAgewotICAgICAgICBKc2ZVdGlscy5yZWdpc3RlclBoYXNlTGlzdGVuZXIobmV3IFBoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0VmlvbGF0aW9uU2V2ZXJpdHlLZXkoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MuZ2V0TmFtZSgpLCBWaW9sYXRpb25TZXZlcml0eS5jbGFzcywgZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0RGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uS2V5KCkKLSAgICB7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KAotICAgICAgICAgICAgICAgIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCksIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcywgZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0UmVxdWlyZWRJbml0aWFsaXphdGlvbigpCi0gICAgewotICAgICAgICBpZihXZWJYbWxQYXJhbWV0ZXIuQUNUSVZBVEVfUkVRVUlSRURfSU5JVElBTElaQVRJT04gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiByZXF1aXJlZEluaXRpYWxpemF0aW9uID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkFDVElWQVRFX1JFUVVJUkVEX0lOSVRJQUxJWkFUSU9OKTsKLQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoIm1vZGU6aW5pdDpyZXF1aXJlZCIsIHJlcXVpcmVkSW5pdGlhbGl6YXRpb24sIGZhbHNlKTsKLQotICAgICAgICAgICAgaWYocmVxdWlyZWRJbml0aWFsaXphdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWFjdGl2YXRlUmVxdWlyZWRBdHRyaWJ1dGVTdXBwb3J0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpZiBpdCdzIGNvbmZpZ3VyZWQgdGhhdCByZXF1aXJlZCBpbml0IHNob3VsZCBoYXBwZW4sCi0gICAgICogaXQncyByZXF1aXJlZCB0byBkZWFjdGl2YXRlIHRoZSBzdXBwb3J0IGZvciB0aGUgcmVxdWlyZWQgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRlYWN0aXZhdGVSZXF1aXJlZEF0dHJpYnV0ZVN1cHBvcnQoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoIm1vZGU6cmVzZXQ6cmVxdWlyZWQiLCBCb29sZWFuLlRSVUUsIGZhbHNlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0QXBwbGljYXRpb25TY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjM4YmRmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5SRVVTRTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIGdlbmVyaWMgc3RvcmFnZSBtYW5hZ2VyIGltcGxlbWVudGF0aW9uIHdoaWNoIHN0b3JlcyB0aGUgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbnMgaW4gdGhlIGFwcGxpY2F0aW9uIHNjb3BlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihSRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxUPiBleHRlbmRzIEFic3RyYWN0U3RvcmFnZU1hbmFnZXI8VD4NCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBUPiByZXNvbHZlU3RvcmFnZU1hcCgpDQotICAgIHsNCi0gICAgICAgIE1hcCBhcHBsaWNhdGlvbk1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbk1hcCgpOw0KLSAgICAgICAgTWFwPFN0cmluZywgVD4gc3RvcmFnZU1hcDsNCi0NCi0gICAgICAgIGlmKCFhcHBsaWNhdGlvbk1hcC5jb250YWluc0tleShnZXRTdG9yYWdlTWFuYWdlcktleSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUPigpOw0KLSAgICAgICAgICAgIGFwcGxpY2F0aW9uTWFwLnB1dChnZXRTdG9yYWdlTWFuYWdlcktleSgpLCBzdG9yYWdlTWFwKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoTWFwPFN0cmluZywgVD4pYXBwbGljYXRpb25NYXAuZ2V0KGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjY2MTRlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LlJFVVNFOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogZ2VuZXJpYyBzdG9yYWdlIG1hbmFnZXIgaW1wbGVtZW50YXRpb24gd2hpY2ggc3RvcmVzIHRoZSBzdG9yYWdlIGltcGxlbWVudGF0aW9ucyBpbiB0aGUgcmVxdWVzdCBzY29wZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxUPiBleHRlbmRzIEFic3RyYWN0U3RvcmFnZU1hbmFnZXI8VD4NCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBUPiByZXNvbHZlU3RvcmFnZU1hcCgpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFQ+IHN0b3JhZ2VNYXA7DQotDQotICAgICAgICBpZighcmVxdWVzdE1hcC5jb250YWluc0tleShnZXRTdG9yYWdlTWFuYWdlcktleSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUPigpOw0KLSAgICAgICAgICAgIHJlcXVlc3RNYXAucHV0KGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCksIHN0b3JhZ2VNYXApOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChNYXA8U3RyaW5nLCBUPilyZXF1ZXN0TWFwLmdldChnZXRTdG9yYWdlTWFuYWdlcktleSgpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0U3RvcmFnZU1hbmFnZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODk4Yjk3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5SRVVTRTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBnZW5lcmljIHN0b3JhZ2UgbWFuYWdlciBpbXBsZW1lbnRhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RvcmFnZU1hbmFnZXI8VD4gZXh0ZW5kcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8U3RyaW5nPg0KLSAgICAgICAgaW1wbGVtZW50cyBTdG9yYWdlTWFuYWdlcjxUPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4oKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0U3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBUIGNyZWF0ZShTdHJpbmcgc3RvcmFnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIFQgc3RvcmFnZU1hbmFnZXI7DQotICAgICAgICBTdHJpbmcgc3RvcmFnZUNsYXNzTmFtZTsNCi0gICAgICAgIC8vbnVsbCAtPiB1c2UgbmFtZSBtYXBwZXJzDQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8U3RyaW5nPiBuYW1lTWFwcGVyIDogdGhpcy5uYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlQ2xhc3NOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKHN0b3JhZ2VOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoc3RvcmFnZUNsYXNzTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHN0b3JhZ2VNYW5hZ2VyID0gcmVzb2x2ZVN0b3JhZ2Uoc3RvcmFnZU5hbWUsIHN0b3JhZ2VDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChzdG9yYWdlTWFuYWdlciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2VNYW5hZ2VyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBUIHJlc29sdmVTdG9yYWdlKFN0cmluZyBzdG9yYWdlS2V5LCBTdHJpbmcgc3RvcmFnZUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgVD4gc3RvcmFnZU1hcCA9IHJlc29sdmVTdG9yYWdlTWFwKCk7DQotDQotICAgICAgICBpZighc3RvcmFnZU1hcC5jb250YWluc0tleShzdG9yYWdlS2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlTWFwLnB1dChzdG9yYWdlS2V5LCAoVClDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoc3RvcmFnZUNsYXNzTmFtZSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHN0b3JhZ2VNYXAuZ2V0KHN0b3JhZ2VLZXkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNYXA8U3RyaW5nLCBUPiByZXNvbHZlU3RvcmFnZU1hcCgpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgc3RvcmFnZUtleSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgVD4gc3RvcmFnZU1hcCA9IHJlc29sdmVTdG9yYWdlTWFwKCk7DQotDQotICAgICAgICBpZihzdG9yYWdlTWFwICE9IG51bGwgJiYgc3RvcmFnZU1hcC5jb250YWluc0tleShzdG9yYWdlS2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDbGFzcyBzdG9yYWdlQ2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHN0b3JhZ2VNYXAuZ2V0KHN0b3JhZ2VLZXkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgIHN0b3JhZ2VNYXAucHV0KHN0b3JhZ2VLZXksIChUKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHN0b3JhZ2VDbGFzcykpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gZ2V0TmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5uYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2FmMDMxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlIGltcGxlbWVudHMgRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgUGhhc2VJZCBjdXJyZW50UGhhc2VJZDsNCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q3VycmVudFBoYXNlSWQoUGhhc2VJZCBwaGFzZUlkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmN1cnJlbnRQaGFzZUlkID0gcGhhc2VJZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRDdXJyZW50UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRQaGFzZUlkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMTNiZGYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlci5EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIGpzZiBpbmZvcm1hdGlvbiBub3QgYXZhaWxhYmxlIHZpYSBqc2YtYXBpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIgZXh0ZW5kcw0KLSAgICAgICAgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlPg0KLXsNCi0gICAgRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBEZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfRkFDRVNfSU5GT1JNQVRJT05fU1RPUkFHRTpLRVkiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkNmI3Yy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuRmFjZXNNZXNzYWdlSG9sZGVyOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gIm9wdGlvbmFsIHBhcmFtZXRlciB0byBkZWFjdGl2YXRlIHNvcnRpbmciKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlIGltcGxlbWVudHMgRmFjZXNNZXNzYWdlU3RvcmFnZQ0KLXsNCi0gICAgTWFwPFN0cmluZywgVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgVmFsaWRhdGlvblJlc3VsdD4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkRmFjZXNNZXNzYWdlKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYoY2xpZW50SWQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjbGllbnRJZCA9ICIqIjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKCF0aGlzLnJlc3VsdHMuY29udGFpbnNLZXkoY2xpZW50SWQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMucmVzdWx0cy5wdXQoY2xpZW50SWQsIG5ldyBWYWxpZGF0aW9uUmVzdWx0KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGhpcy5yZXN1bHRzLmdldChjbGllbnRJZCkuYWRkRmFjZXNNZXNzYWdlSG9sZGVyKG5ldyBGYWNlc01lc3NhZ2VIb2xkZXIoZmFjZXNNZXNzYWdlLCBjbGllbnRJZCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZ2V0RmFjZXNNZXNzYWdlcygpDQotICAgIHsNCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgICAgIGZvcihWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRpb25SZXN1bHQgOiB0aGlzLnJlc3VsdHMudmFsdWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh2YWxpZGF0aW9uUmVzdWx0LmdldEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEFsbCgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdDsNCi0NCi0gICAgICAgIGZvcihWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRpb25SZXN1bHQgOiB0aGlzLnJlc3VsdHMudmFsdWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCA9IHZhbGlkYXRpb25SZXN1bHQuZ2V0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdCgpOw0KLSAgICAgICAgICAgIHNvcnRGYWNlc01lc3NhZ2VIb2xkZXJMaXN0KGZhY2VzTWVzc2FnZUhvbGRlckxpc3QpOw0KLQ0KLSAgICAgICAgICAgIGZvcihGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyIDogZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dC5hZGRNZXNzYWdlKGZhY2VzTWVzc2FnZUhvbGRlci5nZXRDbGllbnRJZCgpLCBmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0RmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc29ydEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QpDQotICAgIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCwgZ2V0RmFjZXNNZXNzYWdlQ29tcGFyYXRvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgQ29tcGFyYXRvcjxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZUNvbXBhcmF0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IENvbXBhcmF0b3I8RmFjZXNNZXNzYWdlSG9sZGVyPigpIHsNCi0gICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoRmFjZXNNZXNzYWdlSG9sZGVyIGhvbGRlcjEsIEZhY2VzTWVzc2FnZUhvbGRlciBob2xkZXIyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoaG9sZGVyMS5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpID09IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKGlzU2FtZVNldmVyaXR5KGhvbGRlcjEsIGhvbGRlcjIpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZU1lc3NhZ2VUZXh0KGhvbGRlcjEuZ2V0RmFjZXNNZXNzYWdlKCksIGhvbGRlcjIuZ2V0RmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmKGhvbGRlcjEuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKS5nZXRPcmRpbmFsKCkgPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlcjIuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKS5nZXRPcmRpbmFsKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByaXZhdGUgaW50IGNvbXBhcmVNZXNzYWdlVGV4dChGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlMSwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZTIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dDEgPSBmYWNlc01lc3NhZ2UxLmdldERldGFpbCgpOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dDIgPSBmYWNlc01lc3NhZ2UyLmdldERldGFpbCgpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZih0ZXh0MSA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0ZXh0MSA9IGZhY2VzTWVzc2FnZTEuZ2V0U3VtbWFyeSgpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmKHRleHQyID09IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRleHQyID0gZmFjZXNNZXNzYWdlMi5nZXRTdW1tYXJ5KCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYodGV4dDEgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYodGV4dDIgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0MS5jb21wYXJlVG9JZ25vcmVDYXNlKHRleHQyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NhbWVTZXZlcml0eShGYWNlc01lc3NhZ2VIb2xkZXIgaG9sZGVyMSwgRmFjZXNNZXNzYWdlSG9sZGVyIGhvbGRlcjIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBob2xkZXIxLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkuZXF1YWxzKGhvbGRlcjIuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU1hbmFnZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMjMyNmYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTmFtZU1hcHBlcjsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgZmFjZXMgbWVzc2FnZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTWFuYWdlciBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxGYWNlc01lc3NhZ2VTdG9yYWdlPg0KLXsNCi0gICAgRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX0ZBQ0VTX01FU1NBR0VTOktFWSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0R3JvdXBTdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiNGQ2MS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Hcm91cFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGdyb3Vwcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRHcm91cFN0b3JhZ2UgaW1wbGVtZW50cyBHcm91cFN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IGFkZGVkR3JvdXBzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PENsYXNzPj4oKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PENsYXNzPj4gcmVzdHJpY3RlZEdyb3VwcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgYWRkR3JvdXBUb0dyb3VwU3RvcmFnZShncm91cENsYXNzLCB2aWV3SWQsIGNsaWVudElkLCB0aGlzLmFkZGVkR3JvdXBzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZXN0cmljdEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgYWRkR3JvdXBUb0dyb3VwU3RvcmFnZShncm91cENsYXNzLCB2aWV3SWQsIGNsaWVudElkLCB0aGlzLnJlc3RyaWN0ZWRHcm91cHMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzc1tdIGdldEdyb3VwcyhTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMuYWRkZWRHcm91cHMuc2l6ZSgpIDwgMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vYWRkIGZvdW5kIGdyb3Vwcw0KLSAgICAgICAgU3RyaW5nIGtleSA9IEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBudWxsKTsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IHJlc3VsdExpc3RGb3JQYWdlID0gYnVpbGRHcm91cExpc3Qoa2V5LCB0aGlzLmFkZGVkR3JvdXBzKTsNCi0NCi0gICAgICAgIGtleSA9IEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBjbGllbnRJZCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN1bHRMaXN0Rm9yQ29tcG9uZW50ID0gYnVpbGRHcm91cExpc3Qoa2V5LCB0aGlzLmFkZGVkR3JvdXBzKTsNCi0NCi0gICAgICAgIC8vcmVtb3ZlIHJlc3RyaWN0ZWQgZ3JvdXBzDQotICAgICAgICBDbGFzc1tdIHJlc3VsdHNGb3JQYWdlID0NCi0gICAgICAgICAgICAgICAgZmlsdGVyR3JvdXBMaXN0KEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBudWxsKSwgcmVzdWx0TGlzdEZvclBhZ2UpOw0KLSAgICAgICAgQ2xhc3NbXSByZXN1bHRzRm9yQ29tcG9uZW50ID0NCi0gICAgICAgICAgICAgICAgZmlsdGVyR3JvdXBMaXN0KEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBjbGllbnRJZCksIHJlc3VsdExpc3RGb3JDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0c0ZvclBhZ2UubGVuZ3RoID09IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYocmVzdWx0c0ZvckNvbXBvbmVudC5sZW5ndGggPT0gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCJubyBncm91cHMgZm9yIGdyb3VwLXZhbGlkYXRpb24gYXZhaWxhYmxlLiIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF5YmUgeW91IHJlc3RyaWN0ZWQgYWxsIGdyb3VwcyBvciB5b3UgYXJlbid0IHVzaW5nIGdyb3Vwcy4iICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlYW4gdmFsaWRhdGlvbiB3aWxsIHVzZSB0aGUgZGVmYXVsdCBncm91cCBmb3IgdmFsaWRhdGlvbiIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRzRm9yQ29tcG9uZW50Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihyZXN1bHRzRm9yQ29tcG9uZW50Lmxlbmd0aCA9PSAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRzRm9yUGFnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBtZXJnZVJlc3VsdHMocmVzdWx0c0ZvclBhZ2UsIHJlc3VsdHNGb3JDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRHcm91cFRvR3JvdXBTdG9yYWdlKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IGdyb3VwU3RvcmFnZSkNCi0gICAgew0KLSAgICAgICAgTGlzdDxDbGFzcz4gZ3JvdXBMaXN0ID0gZ3JvdXBTdG9yYWdlLmdldChHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgY2xpZW50SWQpKTsNCi0NCi0gICAgICAgIGlmKGdyb3VwTGlzdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGdyb3VwTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgICAgICAgICAgZ3JvdXBTdG9yYWdlLnB1dChHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgY2xpZW50SWQpLCBncm91cExpc3QpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoIWdyb3VwTGlzdC5jb250YWlucyhncm91cENsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBncm91cExpc3QuYWRkKGdyb3VwQ2xhc3MpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxDbGFzcz4gYnVpbGRHcm91cExpc3QoU3RyaW5nIGtleSwgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IGdyb3VwU3RvcmFnZSkNCi0gICAgew0KLSAgICAgICAgTGlzdDxDbGFzcz4gbGlzdCA9IGdyb3VwU3RvcmFnZS5nZXQoa2V5KTsNCi0gICAgICAgIHJldHVybiAobGlzdCAhPSBudWxsKSA/IGxpc3QgOiBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3NbXSBmaWx0ZXJHcm91cExpc3QoU3RyaW5nIGtleSwgTGlzdDxDbGFzcz4gYWRkZWRHcm91cHMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHMgPSBidWlsZEdyb3VwTGlzdChrZXksIHRoaXMucmVzdHJpY3RlZEdyb3Vwcyk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBjdXJyZW50R3JvdXAgOiBhZGRlZEdyb3VwcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighcmVzdHJpY3RlZEdyb3Vwcy5jb250YWlucyhjdXJyZW50R3JvdXApKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoY3VycmVudEdyb3VwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0cy50b0FycmF5KG5ldyBDbGFzc1tyZXN1bHRzLnNpemUoKV0pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3NbXSBtZXJnZVJlc3VsdHMoQ2xhc3NbXSByZXN1bHRzRm9yUGFnZSwgQ2xhc3NbXSByZXN1bHRzRm9yQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBDbGFzc1tdIG1lcmdlZFJlc3VsdCA9IG5ldyBDbGFzc1tyZXN1bHRzRm9yUGFnZS5sZW5ndGggKyByZXN1bHRzRm9yQ29tcG9uZW50Lmxlbmd0aF07DQotDQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdHNGb3JQYWdlLCAwLCBtZXJnZWRSZXN1bHQsIDAsIHJlc3VsdHNGb3JQYWdlLmxlbmd0aCk7DQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdHNGb3JDb21wb25lbnQsIDAsIG1lcmdlZFJlc3VsdCwgcmVzdWx0c0ZvclBhZ2UubGVuZ3RoLCByZXN1bHRzRm9yQ29tcG9uZW50Lmxlbmd0aCk7DQotDQotICAgICAgICByZXR1cm4gbWVyZ2VkUmVzdWx0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEdyb3VwU3RvcmFnZU1hbmFnZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEdyb3VwU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE2YjViYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBncm91cHMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRHcm91cFN0b3JhZ2VNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPEdyb3VwU3RvcmFnZT4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfR1JPVVBTOktFWSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWV0YURhdGFTdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZkN2I1OC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRNZXRhRGF0YVN0b3JhZ2UgaW1wbGVtZW50cyBNZXRhRGF0YVN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWFwPFN0cmluZywgUHJvcGVydHlJbmZvcm1hdGlvbj4+IGNhY2hlZFByb3BlcnR5SW5mb3JtYXRpb24gPQ0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgUHJvcGVydHlJbmZvcm1hdGlvbj4+KCk7DQotDQotICAgIHByaXZhdGUgTGlzdDxNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IG1ldGFEYXRhU3RvcmFnZUZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4oKTsNCi0gICAgcHJpdmF0ZSBMaXN0PENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+PiBkZW5pZWRNZXRhRGF0YUZpbHRlcnMgPQ0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8Q2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0TWV0YURhdGFTdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgaW5pdEZpbHRlcnMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdEZpbHRlcnMoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIpOw0KLSAgICAgICAgbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoDQotICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIpKTsNCi0NCi0gICAgICAgIE1ldGFEYXRhU3RvcmFnZUZpbHRlciBtZXRhRGF0YVN0b3JhZ2VGaWx0ZXI7DQotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lIDogbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgPQ0KLSAgICAgICAgICAgICAgICAoTWV0YURhdGFTdG9yYWdlRmlsdGVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWV0YURhdGFTdG9yYWdlRmlsdGVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLm1ldGFEYXRhU3RvcmFnZUZpbHRlcnMuYWRkKG1ldGFEYXRhU3RvcmFnZUZpbHRlcik7DQotDQotICAgICAgICAgICAgICAgIGxvZ0FkZGVkRmlsdGVyKG1ldGFEYXRhU3RvcmFnZUZpbHRlci5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc3RvcmVNZXRhRGF0YU9mKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgaW52b2tlRmlsdGVycyhwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvblRvU3RvcmUgPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBwcm9wZXJ0eUluZm9ybWF0aW9uDQotICAgICAgICAgICAgICAgIC5nZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgY29weU1ldGFEYXRhKHByb3BlcnR5SW5mb3JtYXRpb24sIHByb3BlcnR5SW5mb3JtYXRpb25Ub1N0b3JlKTsNCi0NCi0gICAgICAgIGdldE1hcEZvckNsYXNzKFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpKSkNCi0gICAgICAgICAgICAgICAgLnB1dChwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvblRvU3RvcmUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbnZva2VGaWx0ZXJzKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgZm9yKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBmaWx0ZXIgOiB0aGlzLm1ldGFEYXRhU3RvcmFnZUZpbHRlcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmlsdGVyLmZpbHRlcihwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeVtdIGdldE1ldGFEYXRhKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IGdldE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5nZXQodGFyZ2V0UHJvcGVydHkpOw0KLQ0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBjbG9uZWRQcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKCk7DQotICAgICAgICBjb3B5TWV0YURhdGEocHJvcGVydHlJbmZvcm1hdGlvbiwgY2xvbmVkUHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgICAgICByZXR1cm4gY2xvbmVkUHJvcGVydHlJbmZvcm1hdGlvbi5nZXRNZXRhRGF0YUVudHJpZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc01ldGFEYXRhRm9yKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykuY29udGFpbnNLZXkodGFyZ2V0UHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRmlsdGVyKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBzdG9yYWdlRmlsdGVyKQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoIWlzRmlsdGVyRGVuaWVkKHN0b3JhZ2VGaWx0ZXIpICYmICFpc0ZpbHRlckFscmVhZHlSZWdpc3RlcmVkKHN0b3JhZ2VGaWx0ZXIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5tZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzLmFkZChzdG9yYWdlRmlsdGVyKTsNCi0gICAgICAgICAgICAgICAgbG9nQWRkZWRGaWx0ZXIoc3RvcmFnZUZpbHRlci5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRmlsdGVyRGVuaWVkKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBzdG9yYWdlRmlsdGVyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5kZW5pZWRNZXRhRGF0YUZpbHRlcnMuY29udGFpbnMoZ2V0U3RvcmFnZUZpbHRlckNsYXNzKHN0b3JhZ2VGaWx0ZXIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNGaWx0ZXJBbHJlYWR5UmVnaXN0ZXJlZChNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgc3RvcmFnZUZpbHRlcikNCi0gICAgew0KLSAgICAgICAgZm9yKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBmaWx0ZXIgOiB0aGlzLm1ldGFEYXRhU3RvcmFnZUZpbHRlcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoZmlsdGVyLmdldENsYXNzKCkuZXF1YWxzKGdldFN0b3JhZ2VGaWx0ZXJDbGFzcyhzdG9yYWdlRmlsdGVyKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZGVyZWdpc3RlckZpbHRlcihDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPiBmaWx0ZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgTWV0YURhdGFTdG9yYWdlRmlsdGVyIHN0b3JhZ2VGaWx0ZXIgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzcyhmaWx0ZXJDbGFzcyk7DQotDQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5tZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzLnJlbW92ZShzdG9yYWdlRmlsdGVyKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGxvZ1JlbW92ZWRGaWx0ZXIoc3RvcmFnZUZpbHRlci5nZXRDbGFzcygpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBkZW55RmlsdGVyKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlcklkIDogdGhpcy5kZW5pZWRNZXRhRGF0YUZpbHRlcnMpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihmaWx0ZXJJZC5lcXVhbHMoZmlsdGVyQ2xhc3MpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdGhpcy5kZW5pZWRNZXRhRGF0YUZpbHRlcnMuYWRkKGZpbHRlckNsYXNzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGRlcmVnaXN0ZXJGaWx0ZXIoZmlsdGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkNCi0gICAgcHJpdmF0ZSB2b2lkIGNvcHlNZXRhRGF0YShQcm9wZXJ0eUluZm9ybWF0aW9uIHNvdXJjZSwgUHJvcGVydHlJbmZvcm1hdGlvbiB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRW50cnkgbmV3TWV0YURhdGFFbnRyeTsNCi0gICAgICAgIGZvcihNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkgOiBzb3VyY2UuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbmV3TWV0YURhdGFFbnRyeSA9IG5ldyBNZXRhRGF0YUVudHJ5KCk7DQotICAgICAgICAgICAgbmV3TWV0YURhdGFFbnRyeS5zZXRLZXkobWV0YURhdGFFbnRyeS5nZXRLZXkoKSk7DQotICAgICAgICAgICAgbmV3TWV0YURhdGFFbnRyeS5zZXRWYWx1ZShtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkpOw0KLQ0KLSAgICAgICAgICAgIHRhcmdldC5hZGRNZXRhRGF0YUVudHJ5KG5ld01ldGFEYXRhRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBsb2dBZGRlZEZpbHRlcihDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPiBmaWx0ZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oZmlsdGVyQ2xhc3MuZ2V0TmFtZSgpICsgIiBhZGRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBsb2dSZW1vdmVkRmlsdGVyKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhmaWx0ZXJDbGFzcy5nZXROYW1lKCkgKyAiIHJlbW92ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFByb3BlcnR5SW5mb3JtYXRpb24+IGdldE1hcEZvckNsYXNzKENsYXNzIHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGtleSA9IFByb3h5VXRpbHMuZ2V0Q2xhc3NOYW1lKHRhcmdldCk7DQotICAgICAgICBpZighdGhpcy5jYWNoZWRQcm9wZXJ0eUluZm9ybWF0aW9uLmNvbnRhaW5zS2V5KGtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5jYWNoZWRQcm9wZXJ0eUluZm9ybWF0aW9uLnB1dChrZXksIG5ldyBIYXNoTWFwPFN0cmluZywgUHJvcGVydHlJbmZvcm1hdGlvbj4oKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRQcm9wZXJ0eUluZm9ybWF0aW9uLmdldChrZXkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gZ2V0U3RvcmFnZUZpbHRlckNsYXNzKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBzdG9yYWdlRmlsdGVyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhzdG9yYWdlRmlsdGVyLmdldENsYXNzKCksIE1ldGFEYXRhU3RvcmFnZUZpbHRlci5jbGFzcyk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWV0YURhdGFTdG9yYWdlTWFuYWdlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWV0YURhdGFTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2M2OWJlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRNZXRhRGF0YVN0b3JhZ2VOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIHByb3BlcnR5IGluZm9ybWF0aW9uIGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdEFwcGxpY2F0aW9uU2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPE1ldGFEYXRhU3RvcmFnZT4NCi17DQotICAgIERlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRNZXRhRGF0YVN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfTUVUQV9EQVRBX0NBQ0hFOktFWSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UHJvcGVydHlTdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEwYTdmMC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9wZXJ0eVN0b3JhZ2UgaW1wbGVtZW50cyBQcm9wZXJ0eVN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWFwPFN0cmluZywgRmllbGQ+PiBmaWVsZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgRmllbGQ+PigpOw0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIE1ldGhvZD4+IG1ldGhvZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgTWV0aG9kPj4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgc3RvcmVGaWVsZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5LCBGaWVsZCBmaWVsZCkNCi0gICAgew0KLSAgICAgICAgZ2V0RmllbGRNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykucHV0KHByb3BlcnR5LCBmaWVsZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc3RvcmVNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSwgTWV0aG9kIG1ldGhvZCkNCi0gICAgew0KLSAgICAgICAgZ2V0TWV0aG9kTWFwRm9yQ2xhc3ModGFyZ2V0Q2xhc3MpLnB1dChwcm9wZXJ0eSwgIG1ldGhvZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZpZWxkIGdldEZpZWxkKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRGaWVsZE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5nZXQocHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRNZXRob2RNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykuZ2V0KHByb3BlcnR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0ZpZWxkKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRGaWVsZE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5jb250YWluc0tleShwcm9wZXJ0eSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldE1ldGhvZE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5jb250YWluc0tleShwcm9wZXJ0eSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBGaWVsZD4gZ2V0RmllbGRNYXBGb3JDbGFzcyhDbGFzcyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBrZXkgPSBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh0YXJnZXQpOw0KLSAgICAgICAgaWYgKCF0aGlzLmZpZWxkTWFwLmNvbnRhaW5zS2V5KGtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5maWVsZE1hcC5wdXQoa2V5LCBuZXcgSGFzaE1hcDxTdHJpbmcsIEZpZWxkPigpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0aGlzLmZpZWxkTWFwLmdldChrZXkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWV0aG9kPiBnZXRNZXRob2RNYXBGb3JDbGFzcyhDbGFzcyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBrZXkgPSBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh0YXJnZXQpOw0KLSAgICAgICAgaWYgKCF0aGlzLm1ldGhvZE1hcC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubWV0aG9kTWFwLnB1dChrZXksIG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kPigpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0aGlzLm1ldGhvZE1hcC5nZXQoa2V5KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMzAxMGEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UHJvcGVydHlTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdFByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXI7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIHByb3BlcnR5IGluZm9ybWF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0UHJvcGVydHlTdG9yYWdlTWFuYWdlciBleHRlbmRzIEFic3RyYWN0QXBwbGljYXRpb25TY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8UHJvcGVydHlTdG9yYWdlPg0KLXsNCi0gICAgRGVmYXVsdFByb3BlcnR5U3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdFByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBTdG9yYWdlTWFuYWdlci5jbGFzcy5nZXROYW1lKCkgKyAiX0ZPUl9QUk9QRVJUWTpLRVkiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU3OWM2Mi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZSBpbXBsZW1lbnRzIFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuZ2V0KGtleSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIDxUPiBUIGdldFByb3BlcnR5KFN0cmluZyBrZXksIENsYXNzPFQ+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFQpdGhpcy5wcm9wZXJ0aWVzLmdldChrZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydGllcy5yZW1vdmUoa2V5KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTWFuYWdlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxYjEwYS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciByZW5kZXJlciBpbnRlcmNlcHRvciBwcm9wZXJ0aWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU1hbmFnZXINCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2U+DQotew0KLSAgICBEZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfUkVOREVSRVJfSU5URVJDRVBUT1JfUFJPUEVSVFk6S0VZIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBiNTBmNS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlIGltcGxlbWVudGF0aW9uIGZvciBncm91cHMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2UgaW1wbGVtZW50cyBSZW5kZXJlclByb3h5U3RvcmFnZQ0KLXsNCi0gICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeT4+IHByb3h5U3RvcmFnZSA9DQotICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnk+PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnRyeShTdHJpbmcgcmVuZGVyZXJLZXksIFN0cmluZyBjbGllbnRJZCwgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBlbnRyeSkNCi0gICAgew0KLSAgICAgICAgZ2V0UmVuZGVyZXJTdG9yYWdlKHJlbmRlcmVyS2V5KS5wdXQoY2xpZW50SWQsIGVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0VudHJ5KFN0cmluZyByZW5kZXJlcktleSwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZXJTdG9yYWdlKHJlbmRlcmVyS2V5KS5jb250YWluc0tleShjbGllbnRJZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZ2V0RW50cnkoU3RyaW5nIHJlbmRlcmVyS2V5LCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRSZW5kZXJlclN0b3JhZ2UocmVuZGVyZXJLZXkpLmdldChjbGllbnRJZCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5PiBnZXRSZW5kZXJlclN0b3JhZ2UoU3RyaW5nIHJlbmRlcmVyS2V5KQ0KLSAgICB7DQotICAgICAgICBpZighcHJveHlTdG9yYWdlLmNvbnRhaW5zS2V5KHJlbmRlcmVyS2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm94eVN0b3JhZ2UucHV0KHJlbmRlcmVyS2V5LCBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnk+KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHByb3h5U3RvcmFnZS5nZXQocmVuZGVyZXJLZXkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTWFuYWdlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkODExOTYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciByZW5kZXJlciBwcm94eSBlbnRyaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU1hbmFnZXINCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8UmVuZGVyZXJQcm94eVN0b3JhZ2U+DQotew0KLSAgICBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIC8vZm9yIGJldHRlciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5DQotICAgICAgICByZXR1cm4gRXh0VmFsUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCkgKyAiOlNUT1JBR0UiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0U3RvcmFnZU1hbmFnZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTY2ZGUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0U3RvcmFnZU1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBzdG9yYWdlLW1hbmFnZXIgY3JlYXRpb24gYW5kIGNhY2hpbmcNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0U3RvcmFnZU1hbmFnZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PENsYXNzPg0KLSAgICAgICAgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PENsYXNzLCBTdG9yYWdlTWFuYWdlcj4sIFN0b3JhZ2VNYW5hZ2VySG9sZGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gbGF6eVN0YXRpY01hcHBpbmdBcHBsaWVkID0gZmFsc2U7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPENsYXNzPj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8Q2xhc3M+PigpOw0KLSAgICBwcml2YXRlIE1hcDxDbGFzcywgU3RvcmFnZU1hbmFnZXI+IHN0b3JhZ2VUeXBlVG9TdG9yYWdlTWFuYWdlck1hcCA9IG5ldyBIYXNoTWFwPENsYXNzLCBTdG9yYWdlTWFuYWdlcj4oKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoUmVuZGVyZXJQcm94eVN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKEdyb3VwU3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRHcm91cFN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKE1ldGFEYXRhU3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKEZhY2VzTWVzc2FnZVN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoUHJvcGVydHlTdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFByb3BlcnR5U3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTWFuYWdlcigpLCBmYWxzZSk7DQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLQ0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RvcmFnZU1hbmFnZXIgY3JlYXRlKENsYXNzIHN0b3JhZ2VUeXBlKQ0KLSAgICB7DQotICAgICAgICBpZiAoIXRoaXMubGF6eVN0YXRpY01hcHBpbmdBcHBsaWVkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRTdGF0aWNNYXBwaW5ncygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RvcmFnZU1hbmFnZXIgc3RvcmFnZU1hbmFnZXI7DQotICAgICAgICBTdHJpbmcgc3RvcmFnZU1hbmFnZXJOYW1lOw0KLSAgICAgICAgLy9udWxsIC0+IHVzZSBuYW1lIG1hcHBlcnMNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxDbGFzcz4gbmFtZU1hcHBlciA6IHRoaXMubmFtZU1hcHBlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RvcmFnZU1hbmFnZXJOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKHN0b3JhZ2VUeXBlKTsNCi0NCi0gICAgICAgICAgICBpZiAoc3RvcmFnZU1hbmFnZXJOYW1lID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgc3RvcmFnZU1hbmFnZXIgPSAoU3RvcmFnZU1hbmFnZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHN0b3JhZ2VNYW5hZ2VyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHN0b3JhZ2VNYW5hZ2VyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKHN0b3JhZ2VUeXBlLCBzdG9yYWdlTWFuYWdlcik7DQotICAgICAgICAgICAgICAgIHJldHVybiBzdG9yYWdlTWFuYWdlcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZ2V0U3RvcmFnZU1hbmFnZXIoc3RvcmFnZVR5cGUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkTWFwcGluZyhDbGFzcyBzdG9yYWdlVHlwZSwgU3RvcmFnZU1hbmFnZXIgc3RvcmFnZU1hbmFnZXIpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gaXNWYWxpZEVudHJ5ID0gdHJ1ZTsNCi0gICAgICAgIGlmKHN0b3JhZ2VUeXBlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaXNWYWxpZEVudHJ5ID0gZmFsc2U7DQotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNFcnJvckVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCJ5b3UgdHJpZWQgdG8gYWRkIGFuIGludmFsaWQgc3RvcmFnZSB0eXBlIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoc3RvcmFnZU1hbmFnZXIgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpc1ZhbGlkRW50cnkgPSBmYWxzZTsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoInlvdSB0cmllZCB0byBhZGQgYW4gaW52YWxpZCBzdG9yYWdlIG1hbmFnZXIiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZighaXNWYWxpZEVudHJ5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKHN0b3JhZ2VUeXBlLCBzdG9yYWdlTWFuYWdlciwgdHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGF6eVN0YXRpY01hcHBpbmdBcHBsaWVkID0gdHJ1ZTsNCi0NCi0gICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlNUT1JBR0VfVFlQRV9UT19TVE9SQUdFX01BTkFHRVJfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cE1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cE1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3MpDQotICAgIHsNCi0gICAgICAgIGZvcihTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IG1hcHBpbmcgOiBtYXBwaW5ncykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNYXBwaW5nKENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKG1hcHBpbmcuZ2V0U291cmNlKCkpLA0KLSAgICAgICAgICAgICAgICAgICAgKFN0b3JhZ2VNYW5hZ2VyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShtYXBwaW5nLmdldFRhcmdldCgpKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxDbGFzcz4+IGdldE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZU1hcHBlckxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0U3RvcmFnZU1hbmFnZXIoQ2xhc3Mgc3RvcmFnZVR5cGUsIFN0b3JhZ2VNYW5hZ2VyIHN0b3JhZ2VNYW5hZ2VyLCBib29sZWFuIG92ZXJyaWRlKQ0KLSAgICB7DQotICAgICAgICBpZighdGhpcy5zdG9yYWdlVHlwZVRvU3RvcmFnZU1hbmFnZXJNYXAuY29udGFpbnNLZXkoc3RvcmFnZVR5cGUpIHx8DQotICAgICAgICAgICAgICAgICh0aGlzLnN0b3JhZ2VUeXBlVG9TdG9yYWdlTWFuYWdlck1hcC5jb250YWluc0tleShzdG9yYWdlVHlwZSkgJiYgb3ZlcnJpZGUpKQ0KLSAgICAgICAgew0KLQ0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZGRpbmcgdHlwZSB0byBzdG9yYWdlLW1hbmFnZXIgbWFwcGluZzogIg0KLSAgICAgICAgICAgICAgICAgICAgKyBzdG9yYWdlVHlwZS5nZXROYW1lKCkgKyAiIC0+ICIgKyBzdG9yYWdlTWFuYWdlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHRoaXMuc3RvcmFnZVR5cGVUb1N0b3JhZ2VNYW5hZ2VyTWFwLnB1dChzdG9yYWdlVHlwZSwgc3RvcmFnZU1hbmFnZXIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdG9yYWdlTWFuYWdlciBnZXRTdG9yYWdlTWFuYWdlcihDbGFzcyB0eXBlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlVHlwZVRvU3RvcmFnZU1hbmFnZXJNYXAuZ2V0KHR5cGUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDdiYzNkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZSBpbXBsZW1lbnRzIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgdmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsNCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcihWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciA9IHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAwOGI1My4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgYSBjdXN0b20gVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VNYW5hZ2VyIGV4dGVuZHMNCi0gICAgICAgIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZT4NCi17DQotICAgIERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX1ZJT0xBVElPTlNFVkVSSVRZX0lOVEVSUFJFVEVSOktFWSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9GYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9GYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjAxODM0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi0NCi0vKioNCi0gKiBzdG9yYWdlIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IGZhY2VzIHJlcXVlc3QNCi0gKiBmb3Igbm93IGl0IGp1c3QgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgcGhhc2Ugb2YgdGhlIGxpZmVjeWNsZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlDQotew0KLSAgICB2b2lkIHNldEN1cnJlbnRQaGFzZUlkKFBoYXNlSWQgcGhhc2VJZCk7DQotDQotICAgIFBoYXNlSWQgZ2V0Q3VycmVudFBoYXNlSWQoKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9GYWNlc01lc3NhZ2VTdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E1MGY0Zi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkZhY2VzTWVzc2FnZUhvbGRlcjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRmFjZXNNZXNzYWdlU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBhZGRGYWNlc01lc3NhZ2UoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKTsNCi0NCi0gICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZXMoKTsNCi0NCi0gICAgdm9pZCBhZGRBbGwoKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Hcm91cFN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvR3JvdXBTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYzAxNGIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Hcm91cFN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBzdWdnZXN0ZWQgaW50ZXJmYWNlIGZvciBhIGdyb3VwIHN0b3JhZ2UNCi0gKiB1c2VkIGJ5IHRoZSBidmkgbW9kdWxlIGFuZCBhZGQtb25zDQotICogPHAvPg0KLSAqIGl0IGFsbG93cyB0byBtYW5hZ2UgZ3JvdXBzIGZvciB0aGUgY3VycmVudCByZXF1ZXN0DQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBHcm91cFN0b3JhZ2UNCi17DQotICAgIHZvaWQgYWRkR3JvdXAoQ2xhc3MgZ3JvdXBDbGFzcywgU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKTsNCi0NCi0gICAgdm9pZCByZXN0cmljdEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCk7DQotDQotICAgIENsYXNzW10gZ2V0R3JvdXBzKFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWV0YURhdGFTdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01ldGFEYXRhU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWVjZWJkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWV0YURhdGFTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBNZXRhRGF0YVN0b3JhZ2UNCi17DQotICAgIHZvaWQgc3RvcmVNZXRhRGF0YU9mKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgIE1ldGFEYXRhRW50cnlbXSBnZXRNZXRhRGF0YShDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldFByb3BlcnR5KTsNCi0NCi0gICAgYm9vbGVhbiBjb250YWluc01ldGFEYXRhRm9yKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpOw0KLQ0KLSAgICB2b2lkIHJlZ2lzdGVyRmlsdGVyKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBzdG9yYWdlRmlsdGVyKTsNCi0NCi0gICAgdm9pZCBkZXJlZ2lzdGVyRmlsdGVyKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlckNsYXNzKTsNCi0NCi0gICAgdm9pZCBkZW55RmlsdGVyKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlckNsYXNzKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWV0YURhdGFTdG9yYWdlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Nzk0NzcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhU3RvcmFnZUZpbHRlcg0KLXsNCi0gICAgdm9pZCBmaWx0ZXIoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Qcm9wZXJ0eVN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUHJvcGVydHlTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YmVkMjYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Qcm9wZXJ0eVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlTdG9yYWdlDQotew0KLSAgICB2b2lkIHN0b3JlRmllbGQoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSwgRmllbGQgZmllbGQpOw0KLQ0KLSAgICB2b2lkIHN0b3JlTWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHksIE1ldGhvZCBtZXRob2QpOw0KLQ0KLSAgICBGaWVsZCBnZXRGaWVsZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5KTsNCi0NCi0gICAgTWV0aG9kIGdldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5KTsNCi0NCi0gICAgYm9vbGVhbiBjb250YWluc0ZpZWxkKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpOw0KLQ0KLSAgICBib29sZWFuIGNvbnRhaW5zTWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2M4YzFkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGEgc3RvcmFnZSB3aGljaCBpc24ndCB1c2VkIGludGVybmFsbHkuIGl0J3MgZm9yIGFkZC1vbnMgdG8gZWFzaWx5IHN0b3JlIHByb3BlcnRpZXMgb2YgaW50ZXJjZXB0b3JzLg0KLSAqIHdpdGhvdXQgYnJha2luZyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBpdCdzIHBvc3NpYmxlIHRvIHVzZSB0aGVzZSBwcm9wZXJ0aWVzIGluIGN1c3RvbSBhcnRpZmFjdHMuDQotICogcmVuZGVyaW5nIGludGVyY2VwdGlvbiBpcyBhbiBpbnRlcm5hbCBjb25jZXB0LiBzbyBwcm9wZXJ0aWVzLC4uLiBvZiBpdCB3b24ndCBnZXQgaW50byB0aGUgYXBpLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UNCi17DQotICAgIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKTsNCi0NCi0gICAgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpOw0KLQ0KLSAgICA8VD4gVCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcyk7DQotDQotICAgIHZvaWQgcmVtb3ZlUHJvcGVydHkoU3RyaW5nIGtleSk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJQcm94eVN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJQcm94eVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcxYTc1Yi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVyUHJveHlTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXJQcm94eVN0b3JhZ2UNCi17DQotICAgIHZvaWQgc2V0RW50cnkoU3RyaW5nIHJlbmRlcmVyS2V5LCBTdHJpbmcgY2xpZW50SWQsIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkpOw0KLQ0KLSAgICBib29sZWFuIGNvbnRhaW5zRW50cnkoU3RyaW5nIHJlbmRlcmVyS2V5LCBTdHJpbmcgY2xpZW50SWQpOw0KLQ0KLSAgICBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGdldEVudHJ5KFN0cmluZyByZW5kZXJlcktleSwgU3RyaW5nIGNsaWVudElkKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZiNTRiMi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGVjb2RlQ2FsbGVkID0gZmFsc2U7DQotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVCZWdpbkNhbGxlZCA9IGZhbHNlOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGVuY29kZUVuZENhbGxlZCA9IGZhbHNlOw0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBjb252ZXJ0ZWRWYWx1ZSA9IG51bGw7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVjb2RlQ2FsbGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRlY29kZUNhbGxlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWNvZGVDYWxsZWQoYm9vbGVhbiBkZWNvZGVDYWxsZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGVjb2RlQ2FsbGVkID0gZGVjb2RlQ2FsbGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlQmVnaW5DYWxsZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW5jb2RlQmVnaW5DYWxsZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlQmVnaW5DYWxsZWQoYm9vbGVhbiBlbmNvZGVCZWdpbkNhbGxlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5lbmNvZGVCZWdpbkNhbGxlZCA9IGVuY29kZUJlZ2luQ2FsbGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlQ2hpbGRyZW5DYWxsZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlQ2hpbGRyZW5DYWxsZWQoYm9vbGVhbiBlbmNvZGVDaGlsZHJlbkNhbGxlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5lbmNvZGVDaGlsZHJlbkNhbGxlZCA9IGVuY29kZUNoaWxkcmVuQ2FsbGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlRW5kQ2FsbGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVuY29kZUVuZENhbGxlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVFbmRDYWxsZWQoYm9vbGVhbiBlbmNvZGVFbmRDYWxsZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZW5jb2RlRW5kQ2FsbGVkID0gZW5jb2RlRW5kQ2FsbGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkVmFsdWUoT2JqZWN0IGNvbnZlcnRlZFZhbHVlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbnZlcnRlZFZhbHVlID0gY29udmVydGVkVmFsdWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTBkMGUzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuQVBJOw0KLQ0KLS8qKg0KLSAqIG1hbmFnZXIgdG8gY3JlYXRlIGFuZCByZXNldCBzcGVjaWZpYyBzdG9yYWdlIGltcGxlbWVudGF0aW9ucw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgU3RvcmFnZU1hbmFnZXI8VD4NCi17DQotICAgIFQgY3JlYXRlKFN0cmluZyBrZXkpOw0KLSAgICB2b2lkIHJlc2V0KFN0cmluZyBrZXkpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VySG9sZGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VySG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjOGE0ZmMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9TdG9yYWdlTWFuYWdlckhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5BUEk7DQotDQotLyoqDQotICogaW50ZXJmYWNlIHRvIG1hbmFnZSBzdG9yYWdlLW1hbmFnZXIgaW5zdGFuY2VzDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgU3RvcmFnZU1hbmFnZXJIb2xkZXINCi17DQotICAgIHZvaWQgc2V0U3RvcmFnZU1hbmFnZXIoQ2xhc3MgdHlwZSwgU3RvcmFnZU1hbmFnZXIgc3RvcmFnZU1hbmFnZXIsIGJvb2xlYW4gb3ZlcnJpZGUpOw0KLSAgICBTdG9yYWdlTWFuYWdlciBnZXRTdG9yYWdlTWFuYWdlcihDbGFzcyB0eXBlKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WYWxpZGF0aW9uUmVzdWx0LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1ZhbGlkYXRpb25SZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc5MzI3Yy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1ZhbGlkYXRpb25SZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkZhY2VzTWVzc2FnZUhvbGRlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gInJlZmFjdG9yIGl0IikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIFZhbGlkYXRpb25SZXN1bHQNCi17DQotICAgIHByaXZhdGUgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkRmFjZXNNZXNzYWdlSG9sZGVyKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmFjZXNNZXNzYWdlSG9sZGVyTGlzdC5hZGQoZmFjZXNNZXNzYWdlSG9sZGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1Zpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1Zpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNjY5ZWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOw0KLQ0KLS8qKg0KLSAqIHN1Z2dlc3RlZCBpbnRlcmZhY2UgZm9yIGEgdmlvbGF0aW9uLXNldmVyaXR5LWludGVycHJldGVyIHN0b3JhZ2UNCi0gKiB1c2VkIGJ5IGFkZC1vbnMgdG8gY2hhbmdlIHRoZSBpbnRlcnByZXRlciBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdA0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UNCi17DQotICAgIHZvaWQgc2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcihWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIpOw0KLQ0KLSAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTEwMjk2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5GYWNlc0luZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZTk3ZjIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRmFjZXNNZXNzYWdlU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEZhY2VzTWVzc2FnZVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YmZlOTcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NZXRhRGF0YVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdE1ldGFEYXRhU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWV0YURhdGFTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoTWV0YURhdGFTdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0TWV0YURhdGFTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Zjg2MjMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0UHJvcGVydHlTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlByb3BlcnR5U3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoUHJvcGVydHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0UHJvcGVydHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk2ODQxZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5SZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiB1c2UgYSBwdWJsaWMgY2xhc3MgdG8gYWxsb3cgb3B0aW9uYWwgZGVyZWdpc3RyYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZTlkZTkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5SZW5kZXJlclByb3h5U3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChSZW5kZXJlclByb3h5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTQ5NmQ3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL0VtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWZiZjY1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBFbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I3NTBlYi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL051bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBOdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjRjYWE0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcg0KLXsNCi0gICAgYm9vbGVhbiBza2lwVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YUVudHJ5IGVudHJ5KTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9leGNlcHRpb24vUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24uamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vZXhjZXB0aW9uL1JlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYjJiYjAuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9leGNlcHRpb24vUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uZXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiB0byBoYW5kbGUgc3BlY2lhbCBjYXNlcyBpbiBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24gZXh0ZW5kcyBWYWxpZGF0b3JFeGNlcHRpb24NCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NjQ2MzMxNzM2NDI4NDk1ODg0TDsNCi0NCi0gICAgcHVibGljIFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKGZhY2VzTWVzc2FnZSwgdGhyb3dhYmxlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjI1MTBjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjZXNNZXNzYWdlRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5IGltcGxlbWVudHMgRmFjZXNNZXNzYWdlRmFjdG9yeQ0KLXsNCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBjb252ZXJ0KEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIGlmKGlzTGFiZWxlZEZhY2VzTWVzc2FnZShmYWNlc01lc3NhZ2UpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2U7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY3JlYXRlKGZhY2VzTWVzc2FnZS5nZXRTZXZlcml0eSgpLCBmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLCBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2UgY3JlYXRlKEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVmlvbGF0aW9uTWVzc2FnZShzZXZlcml0eSwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xhYmVsZWRGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgLy9kb24ndCB1c2UgdGhlIGludGVyZmFjZSBoZXJlDQotICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlIGluc3RhbmNlb2YgVmlvbGF0aW9uTWVzc2FnZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRmFjZXNNZXNzYWdlSG9sZGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRmFjZXNNZXNzYWdlSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMWMzNjcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0ZhY2VzTWVzc2FnZUhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBGYWNlc01lc3NhZ2VIb2xkZXINCi17DQotICAgIHByaXZhdGUgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50SWQ7DQotDQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2VIb2xkZXIoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5mYWNlc01lc3NhZ2UgPSBmYWNlc01lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZUhvbGRlcihGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmFjZXNNZXNzYWdlID0gZmFjZXNNZXNzYWdlOw0KLSAgICAgICAgc2V0Q2xpZW50SWQoY2xpZW50SWQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2UgZ2V0RmFjZXNNZXNzYWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudElkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNsaWVudElkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudElkKFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgaWYoISIqIi5lcXVhbHMoY2xpZW50SWQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvTGFiZWxlZE1lc3NhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9MYWJlbGVkTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGY3YWU3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9MYWJlbGVkTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZG9uJ3QgcmVtb3ZlICpUZXh0IC0gaXQgd291bGQgbGVhZCB0byBhbiBvdmVybGFwIHdpdGggdHJpbmlkYWQNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIExhYmVsZWRNZXNzYWdlDQotew0KLSAgICBTdHJpbmcgZ2V0TGFiZWxUZXh0KCk7DQotICAgIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyBsYWJlbCk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9WaW9sYXRpb25NZXNzYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvVmlvbGF0aW9uTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTQ0Yzc2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9WaW9sYXRpb25NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIFZpb2xhdGlvbk1lc3NhZ2UgZXh0ZW5kcyBGYWNlc01lc3NhZ2UgaW1wbGVtZW50cyBMYWJlbGVkTWVzc2FnZQ0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjkwMzk1ODk0Mjk4NzcxMTIzMUw7DQotICAgIHByaXZhdGUgU3RyaW5nIGxhYmVsOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gc3VtbWFyeUxhYmVsUmVwbGFjZWQgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGRldGFpbExhYmVsUmVwbGFjZWQgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIFZpb2xhdGlvbk1lc3NhZ2UoU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHRoaXMoU0VWRVJJVFlfRVJST1IsIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZpb2xhdGlvbk1lc3NhZ2UoU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICBzZXRTZXZlcml0eShzZXZlcml0eSk7DQotICAgICAgICBzZXRTdW1tYXJ5KHN1bW1hcnkpOw0KLSAgICAgICAgc2V0RGV0YWlsKGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN1bW1hcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsYWJlbCAhPSBudWxsICYmICF0aGlzLnN1bW1hcnlMYWJlbFJlcGxhY2VkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHNldFN1bW1hcnkoZ2V0TGFiZWxlZE1lc3NzYWdlKHN1cGVyLmdldFN1bW1hcnkoKSwgZ2V0TGFiZWxUZXh0KCkpKTsNCi0gICAgICAgICAgICB0aGlzLnN1bW1hcnlMYWJlbFJlcGxhY2VkID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRTdW1tYXJ5KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGV0YWlsKCkNCi0gICAgew0KLSAgICAgICAgaWYobGFiZWwgIT0gbnVsbCAmJiAhdGhpcy5kZXRhaWxMYWJlbFJlcGxhY2VkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHNldERldGFpbChnZXRMYWJlbGVkTWVzc3NhZ2Uoc3VwZXIuZ2V0RGV0YWlsKCksIGdldExhYmVsVGV4dCgpKSk7DQotICAgICAgICAgICAgdGhpcy5kZXRhaWxMYWJlbFJlcGxhY2VkID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzdXBlci5nZXREZXRhaWwoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRMYWJlbGVkTWVzc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5jb250YWlucygieyIgKyBpICsgIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoInsiICsgaSArICJ9IiwgbGFiZWwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBtZXNzYWdlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdW1tYXJ5KFN0cmluZyBzKQ0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRTdW1tYXJ5KHMpOw0KLSAgICAgICAgdGhpcy5zdW1tYXJ5TGFiZWxSZXBsYWNlZCA9IGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXRhaWwoU3RyaW5nIHMpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldERldGFpbChzKTsNCi0gICAgICAgIHRoaXMuZGV0YWlsTGFiZWxSZXBsYWNlZCA9IGZhbHNlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2Mzk2ZDQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotDQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsNCi0NCi0vKioNCi0gKiBNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggdXNlcyBwcm9wZXJ0eSBmaWxlcy4NCi0gKiBTdWJjbGFzc2VzIGp1c3QgaGF2ZSB0byBwcm92aWRlIHRoZSBwYWNrYWdlIHRvIGxvb2sgYXQuDQotICogQW4gaW1wbGVtZW50YXRpb24gY2FuIGFsc28gcHJvdmlkZSBhIGN1c3RvbSBuYW1lIHdoaWNoIGlzIGUuZy4gY29uZmlndXJlZCB2aWEgd2ViLnhtbC4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGltcGxlbWVudHMgTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX1JFU09VUkNFX01BUktFUiA9ICI/Pz8iOw0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfREVGQVVMVF9DT05WRU5USU9OOw0KLSAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBkZWZhdWx0QnVuZGxlID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZUJ1bmRsZUJhc2VOYW1lOw0KLSAgICAvL3dpdGgganNmIDEuMSBvbmx5IGF2YWlsYWJsZSBpZiB0aGVyZSBpcyBhIGN1c3RvbSBiZWFuDQotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VCdW5kbGVWYXJOYW1lOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICBpZiAoa2V5ID09IG51bGwgfHwga2V5LmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihrZXkuY29udGFpbnMoIiAiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihrZXkuZW5kc1dpdGgoIl9kZXRhaWwiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcoMCwga2V5Lmxlbmd0aCgpIC0gNyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBrZXk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgY3VzdG9tTWVzc2FnZSA9IG51bGw7DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gdHJ5VG9GaW5kQ3VzdG9tTWVzc2FnZShrZXksIGxvY2FsZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nDQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY3VzdG9tTWVzc2FnZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIHRyeSB0byB1c2UgdGhlIGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZQ0KLSAgICAgICAgICovDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gdHJ5VG9Vc2VNZXNzYWdlQnVuZGxlQ29udmVudGlvbihrZXksIGxvY2FsZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nDQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY3VzdG9tTWVzc2FnZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIG5vIG1lc3NhZ2UgYnVuZGxlIG9yIG1lc3NhZ2UgZm91bmQgKHdpdGggdGhlIGNvbnZlbnRpb24pPw0KLSAgICAgICAgICovDQotDQotICAgICAgICAvL3RyeSB0byBsb2FkIGN1c3RvbSBtZXNzYWdlcw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHRyeVRvRmluZEN1c3RvbU1lc3NhZ2VJbkN1c3RvbVJlc291cmNlQnVuZGxlKGtleSwgbG9jYWxlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGRldGVybWluZU1lc3NhZ2Uoa2V5LCBsb2NhbGUsIGN1c3RvbU1lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvRmluZEN1c3RvbU1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7DQotICAgICAgICBTdHJpbmcgY3VzdG9tTWVzc2FnZSA9IG51bGw7DQotDQotICAgICAgICAvL29ubHkgaW4gY2FzZSBvZiBhIFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciB3aGljaCBpcyBjb25maWd1cmVkIGFzIGJlYW4NCi0gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lLCBsb2NhbGUpOw0KLSAgICAgICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigibWVzc2FnZSBidW5kbGUgIiArIHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lICsgIiBub3QgZm91bmQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vb25seSBpbiBjYXNlIG9mIGEgVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIHdoaWNoIGlzIGNvbmZpZ3VyZWQgYXMgYmVhbg0KLSAgICAgICAgaWYgKHRoaXMubWVzc2FnZUJ1bmRsZVZhck5hbWUgIT0gbnVsbCAmJiBjdXN0b21NZXNzYWdlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSAoUmVzb3VyY2VCdW5kbGUpIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbihtZXNzYWdlQnVuZGxlVmFyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJtZXNzYWdlIGJ1bmRsZSB2YXIgbmFtZSAiICsgdGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSArICIgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb1VzZU1lc3NhZ2VCdW5kbGVDb252ZW50aW9uKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIGlmICgoZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID09IG51bGwgfHwgIWRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICAgICAgJiYgaXNEZWZhdWx0TWVzc2FnZUJ1bmRsZUNvbnZlbnRpb25BY3RpdmUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZGVmYXVsdEJ1bmRsZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9CVU5ETEVfTkFNRSksIGxvY2FsZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgICAgICAgICAgICAgICAgIGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbiA9ICJ0cnVlIjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoZGVmYXVsdEJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHJ5VG9GaW5kQ3VzdG9tTWVzc2FnZUluQ3VzdG9tUmVzb3VyY2VCdW5kbGUoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSB0cnlUb0xvYWRDdXN0b21SZXNvdXJjZUJ1bmRsZShsb2NhbGUpOw0KLQ0KLSAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm5vIGN1c3RvbSBtZXNzYWdlIGZvciAiICsga2V5ICsgIiB3aXRoaW4gIiArIGdldEN1c3RvbUJhc2VOYW1lKCksIGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSB0cnlUb0xvYWRDdXN0b21SZXNvdXJjZUJ1bmRsZShMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VzdG9tQmFzZU5hbWUgPSBnZXRDdXN0b21CYXNlTmFtZSgpOw0KLQ0KLSAgICAgICAgaWYoY3VzdG9tQmFzZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGN1c3RvbUJhc2VOYW1lLCBsb2NhbGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGV0ZXJtaW5lTWVzc2FnZShTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlLCBTdHJpbmcgY3VzdG9tTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgLy91c2UgY3VzdG9tIG5hbWUgKGlmIHBvc3NpYmxlKSBvdGhlcndpc2U6IGZhbGxiYWNrIHRvIGRlZmF1bHQgbWVzc2FnZSAoaWYgcG9zc2libGUpDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKGN1c3RvbU1lc3NhZ2UgIT0gbnVsbCkgPyBjdXN0b21NZXNzYWdlDQotICAgICAgICAgICAgICAgICAgICA6IChnZXRCYXNlTmFtZSgpICE9IG51bGwpID8gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEJhc2VOYW1lKCksIGxvY2FsZSkuZ2V0U3RyaW5nKGtleSkgOiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBNSVNTSU5HX1JFU09VUkNFX01BUktFUiArIGtleSArIE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGVmYXVsdE1lc3NhZ2VCdW5kbGVDb252ZW50aW9uQWN0aXZlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRCYXNlTmFtZSgpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUJ1bmRsZUJhc2VOYW1lKFN0cmluZyBtZXNzYWdlQnVuZGxlQmFzZU5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lID0gbWVzc2FnZUJ1bmRsZUJhc2VOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VCdW5kbGVWYXJOYW1lKFN0cmluZyBtZXNzYWdlQnVuZGxlVmFyTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSA9IG1lc3NhZ2VCdW5kbGVWYXJOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MTgwMzcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyBhIE1lc3NhZ2VSZXNvbHZlciBmb3IgYSBnaXZlbiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJhZGQgZ2VuZXJpYyBqYXZhIGFwaSAoZGUtL3JlZ2lzdGVyIG1hcHBpbmcpIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotICAgICAgICBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXNzYWdlUmVzb2x2ZXI+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nOw0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBuYW1lTWFwcGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PigpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlUmVzb2x2ZXIgY3JlYXRlKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWUgPSBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSk7DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHN0cmF0ZWd5TmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChNZXNzYWdlUmVzb2x2ZXIpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmdldChzdHJhdGVneU5hbWUpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICBTdHJpbmcgcmVzb2x2ZXJOYW1lOw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vYnVpbGQgY29udmVudGlvbiAoVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKQ0KLSAgICAgICAgICAgIHJlc29sdmVyTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIC8vbmFtZSB3YXNuJ3QgbWFwcGVkDQotICAgICAgICAgICAgaWYgKHJlc29sdmVyTmFtZSA9PSBudWxsIHx8IFByb3h5VXRpbHMuZ2V0Q2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpKS5lcXVhbHMocmVzb2x2ZXJOYW1lKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtZXNzYWdlUmVzb2x2ZXIgPSAoTWVzc2FnZVJlc29sdmVyKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUocmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWVzc2FnZVJlc29sdmVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKHN0cmF0ZWd5TmFtZSwgcmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZXNvbHZlck5hbWUgKyAiIHVzZWQgZm9yICIgKyBzdHJhdGVneU5hbWUpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYWRkTWFwcGluZyhzdHJhdGVneU5hbWUsIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotDQotICAgICAgICAvL3NldHVwIGludGVybmFsIHN0YXRpYyBtYXBwaW5ncw0KLSAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgOg0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cE1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cE1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZyxTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWFwcGluZy5nZXRTb3VyY2UoKSwgbWFwcGluZy5nZXRUYXJnZXQoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyBtZXNzYWdlUmVzb2x2ZXJOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImFkZGluZyBzdGF0aWMgdmFsaWRhdGlvbiBzdHJhdGVneSB0byBtZXNzYWdlIHJlc29sdmVyIG1hcHBpbmc6ICINCi0gICAgICAgICAgICAgICAgKyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgIiAtPiAiICsgbWVzc2FnZVJlc29sdmVyTmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmcucHV0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIG1lc3NhZ2VSZXNvbHZlck5hbWUpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gZ2V0TmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmFtZU1hcHBlckxpc3Q7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYTk3MWYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgTWVzc2FnZVJlc29sdmVyIHdoaWNoIHVzZXMgdGhlIGRlZmF1bHQgY29udmVudGlvbiBmb3IgdGhlIG1lc3NhZ2UgYnVuZGxlLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBtZXNzYWdlIGJ1bmRsZSB2aWEgd2ViLnhtbA0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0JVTkRMRSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVTU0FHRV9CVU5ETEU7DQotDQotICAgIC8vbm90IHVzZWQgYXQgdGhlIG1vbWVudCAtIGp1c3QgZm9yIGEgY29udmVudGlvbg0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1vZHVsZU1lc3NhZ2VCdW5kbGVOYW1lKGdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21CYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBDVVNUT01fQlVORExFOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM0Zjg2My4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgZm9yIE1lc3NhZ2VSZXNvbHZlcnMgaW5kZXBlbmRlbnQgb2YgdGhlIG1lc3NhZ2Ugc291cmNlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTRjNGQ2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODc3M2ZjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1lc3NhZ2VSZXNvbHZlcnMuDQotICogKGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGRjZDA4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgVmFsaWRhdGlvblN0cmF0ZWd5IHRvIE1lc3NhZ2VSZXNvbHZlci4NCi0gKiAoY29uZmlndXJlZCB2aWEgaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbikNCi0gKiBUaGUgYmVhbiBwcm92aWRlcyB0aGUgZGVmYXVsdCBuYW1lIChjb252ZW50aW9uKS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gZnVsbCBxdWFsaWZpZWQgbmFtZS4gKD0gY3VzdG9taXphYmxlIGNvbnZlbnRpb24pDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTVNHX1JFU09MVkVSX05BTUVfTUFQUEVSKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg4MTYxOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIHByb3ZpZGUgYSBOYW1lTWFwcGVyIHBlciB2YWxpZGF0aW9uIG1vZHVsZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMzEwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBzdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGE0NzdiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFwcyBFeHRWYWwgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gRXh0VmFsIE1lc3NhZ2VSZXNvbHZlcnMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MgPSBQcm94eVV0aWxzDQotICAgICAgICAgICAgICAgIC5nZXRVbnByb3hpZWRDbGFzcyh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKTsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKHN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZDU5ODQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciB0byBwbGFjZSBWYWxpZGF0aW9uU3RyYXRlZ2llcyBhbmQgTWVzc2FnZVJlc29sdmVycyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcig0MDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VzdG9tUG9zdGZpeCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYKTsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoc3RyYXRlZ3lDbGFzc05hbWUsIGN1c3RvbVBvc3RmaXgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjA5NjRlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljQXJyYXlUeXBlOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5XaWxkY2FyZFR5cGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBleHRyYWN0QnlJZChhbm5vdGF0aW9uLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZXh0cmFjdEJ5SWQoYW5ub3RhdGlvbiwga2V5LCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgPFQ+IExpc3Q8VD4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGV4dHJhY3RCeUlkKGFubm90YXRpb24sIGtleSwgdmFsdWVUeXBlLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgPFQ+IFQgZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxUPiByZXN1bHRzID0gZXh0cmFjdEJ5SWQoYW5ub3RhdGlvbiwga2V5LCB2YWx1ZVR5cGUsIHZhbHVlSWQpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0cy5pdGVyYXRvcigpLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0cy5pdGVyYXRvcigpLm5leHQoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyA8VD4gTGlzdDxUPiBleHRyYWN0QnlJZChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxPYmplY3Q+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KLQ0KLSAgICAgICAgZm9yKE9iamVjdCBlbnRyeSA6IGV4dHJhY3RCeUlkKGFubm90YXRpb24sIGtleSwgdmFsdWVJZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodmFsdWVUeXBlLmlzQXNzaWduYWJsZUZyb20oZW50cnkuZ2V0Q2xhc3MoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKExpc3Q8VD4pcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZXh0cmFjdEJ5SWQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzcyB2YWx1ZUlkKQ0KLSAgICB7DQotICAgICAgICBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+IGZ1bGxSZXN1bHQgPSBleHRyYWN0QnlJZChhbm5vdGF0aW9uLCB2YWx1ZUlkKTsNCi0NCi0gICAgICAgIGlmKGZ1bGxSZXN1bHQuY29udGFpbnNLZXkoa2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZnVsbFJlc3VsdC5nZXQoa2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIHdlYi54bWwgcGFyYW1ldGVyIGZvciBwZXJmb3JtYW5jZSB0dW5pbmcgdG8gZGVhY3RpdmF0ZSB0aGUgc2NhbiIpDQotICAgIHB1YmxpYyBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+IGV4dHJhY3RCeUlkKEFubm90YXRpb24gYW5ub3RhdGlvbiwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4oKTsNCi0NCi0gICAgICAgIGZvcihNZXRob2QgY3VycmVudEFubm90YXRpb25BdHRyaWJ1dGUgOiBhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0RGVjbGFyZWRNZXRob2RzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZighaXNWYWxpZGF0aW9uUGFyYW1ldGVyKGN1cnJlbnRBbm5vdGF0aW9uQXR0cmlidXRlLmdldEdlbmVyaWNSZXR1cm5UeXBlKCkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBPYmplY3QgcGFyYW1ldGVyVmFsdWUgPSBjdXJyZW50QW5ub3RhdGlvbkF0dHJpYnV0ZS5pbnZva2UoYW5ub3RhdGlvbik7DQotDQotICAgICAgICAgICAgICAgIGlmKHBhcmFtZXRlclZhbHVlIGluc3RhbmNlb2YgQ2xhc3NbXSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRQYXJhbWV0ZXJWYWx1ZSA6IChDbGFzc1tdKXBhcmFtZXRlclZhbHVlKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8va2VlcCBjaGVjayBzbyB0aGF0IGZvbGxvd2luZyBpcyB0cnVlOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBmb3VuZCB3aGljaCB0ZWxscyB0aGF0IGl0IGlzbid0IGEgYmxvY2tpbmcgZXJyb3IsIGxldCBpdCBwYXNzDQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1BhcmFtZXRlclZhbHVlKGFubm90YXRpb24sIGN1cnJlbnRQYXJhbWV0ZXJWYWx1ZSwgcmVzdWx0LCB2YWx1ZUlkKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKHBhcmFtZXRlclZhbHVlIGluc3RhbmNlb2YgQ2xhc3MpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8va2VlcCBjaGVjayBzbyB0aGF0IGZvbGxvd2luZyBpcyB0cnVlOg0KLSAgICAgICAgICAgICAgICAgICAgLy9pZiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIGZvdW5kIHdoaWNoIHRlbGxzIHRoYXQgaXQgaXNuJ3QgYSBibG9ja2luZyBlcnJvciwgbGV0IGl0IHBhc3MNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQYXJhbWV0ZXJWYWx1ZShhbm5vdGF0aW9uLCAoQ2xhc3MpcGFyYW1ldGVyVmFsdWUsIHJlc3VsdCwgdmFsdWVJZCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBkb24ndCB1c2UgdGhlIEludHJvc3BlY3RvciBpbiB0aGlzIGNhc2UNCi0gICAgICogaWYgeW91IGhhdmUgYSBiZXR0ZXIgc29sdXRpb24gd2hpY2ggc3VwcG9ydHMgYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXIgc3R5bGVzIChzZWUgZXh0dmFsIHdpa2kpLA0KLSAgICAgKiB5b3UgY2FuIGltcGwuIGl0IGFuZCB1c2UgaXQgKGV4Y2hhbmdlIHRoZSBpbXBscy4gdmlhIHRoZSBFeHRWYWxDb250ZXh0KS4NCi0gICAgICogZnVydGhlcm1vcmUsIHlvdSBjYW4gcHJvdmlkZSB0aGUgZml4IGZvciB0aGUgY29tbXVuaXR5DQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1BhcmFtZXRlclZhbHVlKA0KLSAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiwgQ2xhc3MgcGFyYW1DbGFzcywgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiByZXN1bHQsIENsYXNzIHZhbHVlSWQpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGtleSA9IG51bGw7DQotICAgICAgICBMaXN0PE9iamVjdD4gcGFyYW1ldGVyVmFsdWVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7DQotDQotICAgICAgICBpZihWYWxpZGF0aW9uUGFyYW1ldGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocGFyYW1DbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgTGlzdDxGaWVsZD4gcHJvY2Vzc2VkRmllbGRzID0gbmV3IEFycmF5TGlzdDxGaWVsZD4oKTsNCi0gICAgICAgICAgICBMaXN0PE1ldGhvZD4gcHJvY2Vzc2VkTWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kPigpOw0KLQ0KLSAgICAgICAgICAgIENsYXNzIGN1cnJlbnRQYXJhbUNsYXNzID0gcGFyYW1DbGFzczsNCi0gICAgICAgICAgICB3aGlsZSAoY3VycmVudFBhcmFtQ2xhc3MgIT0gbnVsbCAmJiAhT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY3VycmVudFBhcmFtQ2xhc3MuZ2V0TmFtZSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICAgICAqIHByb2Nlc3MgY2xhc3MNCi0gICAgICAgICAgICAgICAgICovDQotICAgICAgICAgICAgICAgIC8vc3VwcG9ydCBwdXJlIGludGVyZmFjZSBhcHByb2FjaCBlLmcuIFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MNCi0gICAgICAgICAgICAgICAgZm9yKEZpZWxkIGN1cnJlbnRGaWVsZCA6IGN1cnJlbnRQYXJhbUNsYXNzLmdldERlY2xhcmVkRmllbGRzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFwcm9jZXNzZWRGaWVsZHMuY29udGFpbnMoY3VycmVudEZpZWxkKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBwcm9jZXNzRm91bmRGaWVsZChhbm5vdGF0aW9uLCBjdXJyZW50RmllbGQsIHBhcmFtZXRlclZhbHVlcywga2V5LCB2YWx1ZUlkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRGaWVsZHMuYWRkKGN1cnJlbnRGaWVsZCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgLy9pbnNwZWN0IHRoZSBvdGhlciBtZXRob2RzIG9mIHRoZSBpbXBsZW1lbnRpbmcgY2xhc3MNCi0gICAgICAgICAgICAgICAgZm9yKE1ldGhvZCBjdXJyZW50TWV0aG9kIDogY3VycmVudFBhcmFtQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFwcm9jZXNzZWRNZXRob2RzLmNvbnRhaW5zKGN1cnJlbnRNZXRob2QpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHByb2Nlc3NGb3VuZE1ldGhvZChjdXJyZW50UGFyYW1DbGFzcywgY3VycmVudE1ldGhvZCwgcGFyYW1ldGVyVmFsdWVzLCBrZXksIHZhbHVlSWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZE1ldGhvZHMuYWRkKGN1cnJlbnRNZXRob2QpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICAgICAqIHByb2Nlc3MgaW50ZXJmYWNlcw0KLSAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRJbnRlcmZhY2UgOiBjdXJyZW50UGFyYW1DbGFzcy5nZXRJbnRlcmZhY2VzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFWYWxpZGF0aW9uUGFyYW1ldGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY3VycmVudEludGVyZmFjZSkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAvL3N1cHBvcnQgaW50ZXJmYWNlICsgaW1wbC4gYXBwcm9hY2ggZS5nLiBNeVBhcmFtSW1wbC5jbGFzcw0KLSAgICAgICAgICAgICAgICAgICAgLy8oTXlQYXJhbUltcGwgaW1wbGVtZW50cyBNeVBhcmFtDQotICAgICAgICAgICAgICAgICAgICAvL015UGFyYW0gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotICAgICAgICAgICAgICAgICAgICAvL21ldGhvZHMgaW4gdGhlIGludGVyZmFjZSBoYXZlIHRvIGJlIG1hcmtlZCB3aXRoIEBQYXJhbWV0ZXJWYWx1ZSBhbmQgQFBhcmFtZXRlcktleQ0KLSAgICAgICAgICAgICAgICAgICAgZm9yKE1ldGhvZCBjdXJyZW50TWV0aG9kIDogY3VycmVudEludGVyZmFjZS5nZXREZWNsYXJlZE1ldGhvZHMoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZighcHJvY2Vzc2VkTWV0aG9kcy5jb250YWlucyhjdXJyZW50TWV0aG9kKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHByb2Nlc3NGb3VuZE1ldGhvZChjdXJyZW50UGFyYW1DbGFzcywgY3VycmVudE1ldGhvZCwgcGFyYW1ldGVyVmFsdWVzLCBrZXksIHZhbHVlSWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRNZXRob2RzLmFkZChjdXJyZW50TWV0aG9kKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBmb3IoRmllbGQgY3VycmVudEZpZWxkIDogY3VycmVudEludGVyZmFjZS5nZXREZWNsYXJlZEZpZWxkcygpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwcm9jZXNzZWRGaWVsZHMuY29udGFpbnMoY3VycmVudEZpZWxkKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHByb2Nlc3NGb3VuZEZpZWxkKGFubm90YXRpb24sIGN1cnJlbnRGaWVsZCwgcGFyYW1ldGVyVmFsdWVzLCBrZXksIHZhbHVlSWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRGaWVsZHMuYWRkKGN1cnJlbnRGaWVsZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGN1cnJlbnRQYXJhbUNsYXNzID0gY3VycmVudFBhcmFtQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGtleSA9IGNyZWF0ZURlZmF1bHRLZXkoa2V5LCBwYXJhbUNsYXNzKTsNCi0NCi0gICAgICAgIGlmKHBhcmFtZXRlclZhbHVlcy5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9AUGFyYW1ldGVyVmFsdWUgaXMgb3B0aW9uYWwgYXMgd2VsbA0KLSAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlcy5hZGQoa2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHJlc3VsdC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5nZXQoa2V5KS5hZGRBbGwocGFyYW1ldGVyVmFsdWVzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQucHV0KGtleSwgcGFyYW1ldGVyVmFsdWVzKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBjcmVhdGVEZWZhdWx0S2V5KE9iamVjdCBrZXksIENsYXNzIGN1cnJlbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYoa2V5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9jaGVjayBmb3Igc3VwZXItaW50ZXJmYWNlIChleGNsdWRlIFZhbGlkYXRpb25QYXJhbWV0ZXIgaXRzZWxmKQ0KLSAgICAgICAgICAgIGZvcihDbGFzcyBpbnRlcmZhY2VDbGFzcyA6IGN1cnJlbnRDbGFzcy5nZXRJbnRlcmZhY2VzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihWYWxpZGF0aW9uUGFyYW1ldGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaW50ZXJmYWNlQ2xhc3MpICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgKCFpbnRlcmZhY2VDbGFzcy5nZXROYW1lKCkuZXF1YWxzKFZhbGlkYXRpb25QYXJhbWV0ZXIuY2xhc3MuZ2V0TmFtZSgpKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGtleSA9IGludGVyZmFjZUNsYXNzOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZihrZXkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBrZXkgPSBjdXJyZW50Q2xhc3M7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4ga2V5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IHByb2Nlc3NGb3VuZEZpZWxkKA0KLSAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZSwgRmllbGQgY3VycmVudEZpZWxkLCBMaXN0PE9iamVjdD4gcGFyYW1WYWx1ZXMsIE9iamVjdCBrZXksIENsYXNzIHZhbHVlSWQpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBuZXdLZXkgPSBudWxsOw0KLSAgICAgICAgaWYoa2V5ID09IG51bGwgJiYgY3VycmVudEZpZWxkLmlzQW5ub3RhdGlvblByZXNlbnQoUGFyYW1ldGVyS2V5LmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG5ld0tleSA9IGN1cnJlbnRGaWVsZC5nZXQoaW5zdGFuY2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICAvL25vICJlbHNlIGlmIiB0byBhbGxvdyBib3RoIGF0IG9uZSBmaWVsZA0KLSAgICAgICAgaWYoY3VycmVudEZpZWxkLmlzQW5ub3RhdGlvblByZXNlbnQoUGFyYW1ldGVyVmFsdWUuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbHVlSWQgPT0gbnVsbCB8fCB2YWx1ZUlkLmVxdWFscyhjdXJyZW50RmllbGQuZ2V0QW5ub3RhdGlvbihQYXJhbWV0ZXJWYWx1ZS5jbGFzcykuaWQoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50RmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtVmFsdWVzLmFkZChjdXJyZW50RmllbGQuZ2V0KGluc3RhbmNlKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXdLZXkgIT0gbnVsbCA/IG5ld0tleSA6IGtleTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBwcm9jZXNzRm91bmRNZXRob2QoDQotICAgICAgICAgICAgQ2xhc3MgcGFyYW1DbGFzcywgTWV0aG9kIGN1cnJlbnRNZXRob2QsIExpc3Q8T2JqZWN0PiBwYXJhbWV0ZXJWYWx1ZXMsIE9iamVjdCBrZXksIENsYXNzIHZhbHVlSWQpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBuZXdLZXkgPSBudWxsOw0KLSAgICAgICAgaWYoa2V5ID09IG51bGwgJiYgY3VycmVudE1ldGhvZC5pc0Fubm90YXRpb25QcmVzZW50KFBhcmFtZXRlcktleS5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZighKE1vZGlmaWVyLmlzQWJzdHJhY3QocGFyYW1DbGFzcy5nZXRNb2RpZmllcnMoKSkgfHwgTW9kaWZpZXIuaXNJbnRlcmZhY2UocGFyYW1DbGFzcy5nZXRNb2RpZmllcnMoKSkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBuZXdLZXkgPSBjdXJyZW50TWV0aG9kLmludm9rZShwYXJhbUNsYXNzLm5ld0luc3RhbmNlKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIC8vbm8gImVsc2UgaWYiIHRvIGFsbG93IGJvdGggYXQgb25lIGZpZWxkDQotICAgICAgICBpZihjdXJyZW50TWV0aG9kLmlzQW5ub3RhdGlvblByZXNlbnQoUGFyYW1ldGVyVmFsdWUuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbHVlSWQgPT0gbnVsbCB8fCB2YWx1ZUlkLmVxdWFscyhjdXJyZW50TWV0aG9kLmdldEFubm90YXRpb24oUGFyYW1ldGVyVmFsdWUuY2xhc3MpLmlkKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudE1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOw0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWVzLmFkZChjdXJyZW50TWV0aG9kLmludm9rZShwYXJhbUNsYXNzLm5ld0luc3RhbmNlKCkpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgaXQncyBhIG5vbmUtc3RhdGljIGlubmVyIGNsYXNzIC0+IHJldHVybiB0aGlzIGNsYXNzDQotICAgICAgICAgICAgICAgICAgICBpZihwYXJhbUNsYXNzLmdldEVuY2xvc2luZ0NsYXNzKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJWYWx1ZXMuYWRkKHBhcmFtQ2xhc3MpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXdLZXkgIT0gbnVsbCA/IG5ld0tleSA6IGtleTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZGF0aW9uUGFyYW1ldGVyKFR5cGUgZ2VuZXJpY1JldHVyblR5cGUpDQotICAgIHsNCi0gICAgICAgIGlmKGdlbmVyaWNSZXR1cm5UeXBlIGluc3RhbmNlb2YgR2VuZXJpY0FycmF5VHlwZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZigoKEdlbmVyaWNBcnJheVR5cGUpZ2VuZXJpY1JldHVyblR5cGUpLmdldEdlbmVyaWNDb21wb25lbnRUeXBlKCkgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBhbmFseXplUGFyYW1ldGVyaXplZFR5cGUoDQotICAgICAgICAgICAgICAgICAgICAgICAgKFBhcmFtZXRlcml6ZWRUeXBlKSgoR2VuZXJpY0FycmF5VHlwZSlnZW5lcmljUmV0dXJuVHlwZSkuZ2V0R2VuZXJpY0NvbXBvbmVudFR5cGUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihnZW5lcmljUmV0dXJuVHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhbmFseXplUGFyYW1ldGVyaXplZFR5cGUoDQotICAgICAgICAgICAgICAgICAgICAoUGFyYW1ldGVyaXplZFR5cGUpZ2VuZXJpY1JldHVyblR5cGUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBhbmFseXplUGFyYW1ldGVyaXplZFR5cGUoUGFyYW1ldGVyaXplZFR5cGUgcGFyYW1ldGVyaXplZFR5cGUpDQotICAgIHsNCi0gICAgICAgIGZvcihUeXBlIHR5cGUgOiBwYXJhbWV0ZXJpemVkVHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodHlwZSBpbnN0YW5jZW9mIFdpbGRjYXJkVHlwZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZvcihUeXBlIHVwcGVyQm91bmRzIDogKChXaWxkY2FyZFR5cGUpdHlwZSkuZ2V0VXBwZXJCb3VuZHMoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYodXBwZXJCb3VuZHMgaW5zdGFuY2VvZiBDbGFzcyAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZvciBhdHRyaWJ1dGVzIGxpa2U6IENsYXNzPD8gZXh0ZW5kcyBJbmhlcml0ZWRGcm9tVmFsaWRhdGlvblBhcmFtZXRlcj4gdmFsdWUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblBhcmFtZXRlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKChDbGFzcyl1cHBlckJvdW5kcykpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc5NTJkNC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5IGltcGxlbWVudHMgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkNCi17DQotICAgIHByaXZhdGUgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBjcmVhdGUoKQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUik7DQotICAgICAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckNsYXNzTmFtZXMNCi0gICAgICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUikpOw0KLSAgICAgICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JDbGFzc05hbWVzKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciA9IChWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSh2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjcmVhdGVkIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDVjOGZlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBtYXBzIGludGVybmFsIHBhcmFtZXRlcnMgdG8gb3B0aW9uYWxseSBhdmFpbGFibGUgY3VzdG9tIHBhcmFtZXRlcnMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeSBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8Q2xhc3MsIENsYXNzPg0KLXsNCi0gICAgcHJpdmF0ZSBNYXA8Q2xhc3MsIENsYXNzPiBwYXJhbWV0ZXJNYXBwaW5nID0gbmV3IEhhc2hNYXA8Q2xhc3MsIENsYXNzPigpOw0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgY3JlYXRlKENsYXNzIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHRoaXMucGFyYW1ldGVyTWFwcGluZy5jb250YWluc0tleShzb3VyY2UpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmFtZXRlck1hcHBpbmcuZ2V0KHNvdXJjZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBDbGFzcyByZXN1bHQ7DQotDQotICAgICAgICAvL2l0J3MgaW1wb3J0YW50IHRvIGxvb2sgZm9yIHRoZSBzdGF0aWMgY29uZmlncyBmaXJzdCAtIGdsb2JhbCBwYXJhbWV0ZXJzIGFyZSB1c2VkIGludGVybmFsbHkNCi0gICAgICAgIHJlc3VsdCA9IHRyeVRvRmluZFN0YXRpY0NvbmZpZyhzb3VyY2UpOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHRyeVRvRmluZEdsb2JhbFBhcmFtZXRlcihzb3VyY2UpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHNvdXJjZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGNhY2hlTWFwcGluZyhzb3VyY2UsIHJlc3VsdCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3MgdHJ5VG9GaW5kR2xvYmFsUGFyYW1ldGVyKENsYXNzIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IHRhcmdldCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KHNvdXJjZS5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIENsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoQ2xhc3MpIHRhcmdldDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3MgdHJ5VG9GaW5kU3RhdGljQ29uZmlnKENsYXNzIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgcmVzdWx0ID0gbnVsbDsNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gY29uZmlnIDogRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlZBTElEQVRJT05fUEFSQU1FVEVSX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gdHJ5VG9NYXAoc291cmNlLCBjb25maWcuZ2V0TWFwcGluZygpKTsNCi0NCi0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3MgdHJ5VG9NYXAoQ2xhc3Mgc291cmNlLCBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmcpDQotICAgIHsNCi0gICAgICAgIENsYXNzIHRhcmdldCA9IG51bGw7DQotDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBtYXBwaW5nKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscyhlbnRyeS5nZXRTb3VyY2UoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0YXJnZXQgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShlbnRyeS5nZXRUYXJnZXQoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdGFyZ2V0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjYWNoZU1hcHBpbmcoQ2xhc3Mgc291cmNlLCBDbGFzcyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFyYW1ldGVyTWFwcGluZy5wdXQoc291cmNlLCB0YXJnZXQpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjZjN2YxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogbWVjaGFuaXNtIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBleHR2YWwNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGltcGxlbWVudHMgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcg0KLXsNCi0gICAgcHVibGljIGJvb2xlYW4gc2V2ZXJpdHlCbG9ja3NOYXZpZ2F0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IuZXF1YWxzKHNldmVyaXR5KSB8fCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUwuZXF1YWxzKHNldmVyaXR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXZlcml0eUNhdXNlc1ZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLmVxdWFscyhzZXZlcml0eSkgfHwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMLmVxdWFscyhzZXZlcml0eSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gc2V2ZXJpdHlDYXVzZXNWaW9sYXRpb25NZXNzYWdlKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHNldmVyaXR5QmxvY2tzU3VibWl0KA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IuZXF1YWxzKHNldmVyaXR5KSB8fCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUwuZXF1YWxzKHNldmVyaXR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXZlcml0eVNob3dzSW5kaWNhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLmVxdWFscyhzZXZlcml0eSkgfHwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMLmVxdWFscyhzZXZlcml0eSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI3MzUxYS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotew0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9QYXJhbWV0ZXJLZXkuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlcktleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGU0NWNiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlcktleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUYXJnZXQoe0ZJRUxELCBNRVRIT0R9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBQYXJhbWV0ZXJLZXkNCi17DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlclZhbHVlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9QYXJhbWV0ZXJWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmRjOGYzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlclZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRhcmdldCh7RklFTEQsIE1FVEhPRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFBhcmFtZXRlclZhbHVlDQotew0KLSAgICBDbGFzcyBpZCgpIGRlZmF1bHQgUGFyYW1ldGVyVmFsdWUuY2xhc3M7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE1OWM3Ni4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvblBhcmFtZXRlcg0KLXsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTY2ZjkxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvcg0KLXsNCi0gICAgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbik7DQotICAgIExpc3Q8T2JqZWN0PiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSk7DQotICAgIDxUPiBMaXN0PFQ+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzczxUPiB2YWx1ZVR5cGUpOw0KLSAgICA8VD4gVCBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSwgQ2xhc3M8VD4gdmFsdWVUeXBlLCBDbGFzcyB2YWx1ZUlkKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkY2RkZDIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeQ0KLXsNCi0gICAgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBjcmVhdGUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1Zpb2xhdGlvblNldmVyaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2M2JhMjEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZpb2xhdGlvblNldmVyaXR5DQotew0KLSAgICBpbnRlcmZhY2UgSW5mbyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi0gICAgew0KLSAgICAgICAgQFBhcmFtZXRlcktleQ0KLSAgICAgICAgcHVibGljIENsYXNzIEtFWSA9IFZpb2xhdGlvblNldmVyaXR5LmNsYXNzOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgcHVibGljIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBTRVZFUklUWSA9IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9JTkZPOw0KLQ0KLSAgICAgICAgLy9AUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIC8vTWVzc2FnZVR5cGUgcG9zdGZpeCA9IE1lc3NhZ2VUeXBlLklORk87DQotICAgIH0NCi0NCi0gICAgaW50ZXJmYWNlIFdhcm4gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotICAgIHsNCi0gICAgICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgICAgIHB1YmxpYyBDbGFzcyBLRVkgPSBWaW9sYXRpb25TZXZlcml0eS5jbGFzczsNCi0NCi0gICAgICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFNFVkVSSVRZID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk47DQotDQotICAgICAgICAvL0BQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgLy9NZXNzYWdlVHlwZSBwb3N0Zml4ID0gTWVzc2FnZVR5cGUuV0FSTjsNCi0gICAgfQ0KLQ0KLSAgICBpbnRlcmZhY2UgRXJyb3IgZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotICAgIHsNCi0gICAgICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgICAgIHB1YmxpYyBDbGFzcyBLRVkgPSBWaW9sYXRpb25TZXZlcml0eS5jbGFzczsNCi0NCi0gICAgICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFNFVkVSSVRZID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SOw0KLQ0KLSAgICAgICAgLy9AUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIC8vTWVzc2FnZVR5cGUgcG9zdGZpeCA9IE1lc3NhZ2VUeXBlLkVSUk9SOw0KLSAgICB9DQotDQotICAgIGludGVyZmFjZSBGYXRhbCBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi0gICAgew0KLSAgICAgICAgQFBhcmFtZXRlcktleQ0KLSAgICAgICAgcHVibGljIENsYXNzIEtFWSA9IFZpb2xhdGlvblNldmVyaXR5LmNsYXNzOw0KLQ0KLSAgICAgICAgQFBhcmFtZXRlclZhbHVlDQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgU0VWRVJJVFkgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUw7DQotDQotICAgICAgICAvL0BQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgLy9NZXNzYWdlVHlwZSBwb3N0Zml4ID0gTWVzc2FnZVR5cGUuRkFUQUw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzZiZDk0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1Zpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBtZWNoYW5pc20gdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGV4dHZhbA0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcg0KLXsNCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHNldmVyaXR5IHNob3VsZCBibG9jayB0aGUgbmF2aWdhdGlvbg0KLSAgICAgKiBpZiAjc2V2ZXJpdHlDYXVzZXNWYWxpZGF0b3JFeGNlcHRpb24gcmV0dXJucyBmYWxscyB2YWxpZGF0aW9uIHdpbGwgYmUgY29udGludWVkIGZvciB0aGUgY3VycmVudCBwcm9wZXJ0eQ0KLSAgICAgKiBhbGwgbWVzc2FnZXMgd2hpY2ggZG9uJ3QgbGVhZCB0byBhbiBleGNlcHRpb24gc2hvdWxkIGJlIHN0b3JlZCBpbiBhbiBzdG9yYWdlIGFuZA0KLSAgICAgKiBhZGRlZCBhZnRlciB0aGUgZmlyc3QgbWVzc2FnZSB3aGljaCBnZXRzIHRocm93biBhcyBleGNlcHRpb24NCi0gICAgICogYSBnbG9iYWwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgYWRkIHRoZSBtZXNzYWdlcyBvZiB0aGUgc3RvcmFnZSBhcyBmYWNlcyBtZXNzYWdlDQotICAgICAqLw0KLSAgICBib29sZWFuIHNldmVyaXR5QmxvY2tzTmF2aWdhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KTsNCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHNldmVyaXR5IHNob3VsZCBjYXVzZSBhIHZhbGlkYXRvciBleGNlcHRpb24NCi0gICAgICovDQotICAgIGJvb2xlYW4gc2V2ZXJpdHlDYXVzZXNWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSk7DQotDQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IGN1cnJlbnQgZmFjZXMgY29udGV4dA0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgY3VycmVudCBjb21wb25lbnQNCi0gICAgICogQHBhcmFtIHNldmVyaXR5IGpzZiBzZXZlcml0eSBmb3IgZmFjZXMgbWVzc2FnZXMNCi0gICAgICogQHJldHVybiB0cnVlIGlmIGEgdmlvbGF0aW9uIG1lc3NhZ2UgbGVhZHMgdG8gYSBmYWNlcyBtZXNzYWdlDQotICAgICAqLw0KLSAgICBib29sZWFuIHNldmVyaXR5Q2F1c2VzVmlvbGF0aW9uTWVzc2FnZSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KTsNCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnN0cmFpbnQgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkgc2hvdWxkIGJlIHZhbGlkYXRlZCBvbiB0aGUgY2xpZW50IHNpZGUgKGlmIHN1cHBvcnRlZCkNCi0gICAgICovDQotICAgIGJvb2xlYW4gc2V2ZXJpdHlCbG9ja3NTdWJtaXQoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSk7DQotDQotICAgIC8qKg0KLSAgICAgKiBhdmFpbGFibGUgZm9yIGFkZC1vbnMgLSBub3QgdXNlZCBpbnRlcm5hbGx5IGR1ZSB0byBwZXJmb3JtYW5jZSByZWFzb25zDQotICAgICAqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnN0cmFpbnQgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkNCi0gICAgICogc2hvdWxkIGNhdXNlIGUuZy4gYSByZXF1aXJlZCBtYXJrZXIgaW5kZXBlbmRlbnQgb2YgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiAoaWYgc3VwcG9ydGVkKQ0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBzZXZlcml0eVNob3dzSW5kaWNhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1OWM5MzQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLk1lc3NhZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotCi0vKioKLSAqIFByb3ZpZGVzIHRoZSBhYmlsaXR5IG9mIG1lc3NhZ2UgcmVzb2x2aW5nIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuUkVVU0V9KQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTxBIGV4dGVuZHMgQW5ub3RhdGlvbj4gZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQotewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYID0gIl9kZXRhaWwiOwotICAgIC8vZS5nLiBmb3IgaW5qZWN0aW5nIGEgbWVzc2FnZSByZXNvbHZlciB2aWEgc3ByaW5nCi0gICAgcHJpdmF0ZSBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgTG9jYWxlIGxvY2FsZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpOwotCi0gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VSZXNvbHZlciAhPSBudWxsID8gdGhpcy5tZXNzYWdlUmVzb2x2ZXIuZ2V0TWVzc2FnZShrZXksIGxvY2FsZSkgOgotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHRoaXMpLmdldE1lc3NhZ2Uoa2V5LCBsb2NhbGUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShBIGFubm90YXRpb24pCi0gICAgewotICAgICAgICByZXR1cm4gcmVzb2x2ZU1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChBIGFubm90YXRpb24pCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiAoa2V5ICE9IG51bGwpID8gcmVzb2x2ZU1lc3NhZ2Uoa2V5ICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgpIDogbnVsbDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbikgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBGYWNlc01lc3NhZ2UgZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNZXNzYWdlKEEgYW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2UoZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uKSwgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBIGFubm90YXRpb24pOwotCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZVJlc29sdmVyKE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXIpCi0gICAgewotICAgICAgICB0aGlzLm1lc3NhZ2VSZXNvbHZlciA9IG1lc3NhZ2VSZXNvbHZlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICAgIG1ldGFEYXRhRW50cnkuc2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwsIGdldExhYmVsKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnkpKTsKLQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uKTsKLSAgICB9Ci0KLSAgICAvL2UuZy4gZm9yIGN1c3RvbSBhbm5vdGF0aW9ucyAtIG92ZXJyaWRlIGlmIG5lZWRlZAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxZjNlZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5leGNlcHRpb24uUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBQcm92aWRlcyB0aGUgYWJpbGl0eSB0byB1c2UgVmFsaWRhdG9yRXhjZXB0aW9uIChhcyBleHBlY3RlZCBieSB0aGUgdXNlcikgaW5zdGVhZCBvZiBDb252ZXJ0ZXJFeGNlcHRpb24uDQotICogRnVydGhlcm1vcmUgaXQgcHJvdmlkZXM6PGJyLz4NCi0gKiBpbml0VmFsaWRhdGlvbjxici8+DQotICogcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgaW5pdFZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGluaXRWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImluaXRWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBwcm9jZXNzVmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcm9jZXNzVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJwcm9jZXNzVmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0gICAgICAgICAgICBpZihlIGluc3RhbmNlb2YgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24gPSBuZXcgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29udmVydEZhY2VzTWVzc2FnZShlLmdldEZhY2VzTWVzc2FnZSgpKSwgZS5nZXRDYXVzZSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uID0gbmV3IFZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb252ZXJ0RmFjZXNNZXNzYWdlKGUuZ2V0RmFjZXNNZXNzYWdlKCkpLCBlLmdldENhdXNlKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBpZiAocHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgIjogdGhyb3cgb3JpZ2luYWwgZXhjZXB0aW9uIGFmdGVyIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvVGhyb3dWYWxpZGF0b3JFeGNlcHRpb25Gb3JDb21wb25lbnQoDQotICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSwgdmFsaWRhdG9yRXhjZXB0aW9uKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgIjogb3JpZ2luYWwgZXhjZXB0aW9uIGFmdGVyIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbiwgdGhpcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZjg3ZGMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi0NCi0vKioNCi0gKiB0byBtYXAgY29uc3RyYWludHMgZGlyZWN0bHkgdG8gYSBtZXRhLWRhdGEgdHJhbnNmb3JtZXIgaWYgdGhlcmUgaXMgbm8gdmFsaWRhdGlvbiBzdHJhdGVneSAocmVxdWlyZWQgYnkganNyIDMwMykNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGUoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ0aGlzIGlzIGp1c3QgYW4gYWRhcHRlciBlLmcuIGZvciBjb21wb25lbnQgaW5pdGlhbGl6YXRpb24iKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMjVlMDQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIGl0IGlzbid0IGxpbmtlZCB0byBqc3IgMzAzDQotICoNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0NCi0gKiBhZGFwdGVyIHRvIGNvbm5lY3QgdmFsaWRhdGlvbiBzdHJhdGVnaWVzIHdpdGggbWV0YS1kYXRhIHRyYW5zZm9ybWVycywNCi0gKiBpZiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBkZWZpbmVkIGFzIGJlYW4gYW5kIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBpbnRlcmZhY2UgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIgZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIC8vdG8gZ2V0IGJhY2sgdGhlIGludGVybmFsIGNhc2hpbmcNCi0gICAgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpOw0KLQ0KLSAgICBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMxMTZmMi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLkJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogaXQgaXNuJ3QgbGlua2VkIHRvIGpzciAzMDMNCi0gKg0KLSAqIGl0J3MganVzdCBhIGhlbHBlciBmb3IgcHJveGllcyAtIHlvdSBqdXN0IG5lZWQgaXQsIGlmIHlvdSBkZWZpbmUgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0Lg0KLQ0KLSAqIGFkYXB0ZXIgdG8gY29ubmVjdCB2YWxpZGF0aW9uIHN0cmF0ZWdpZXMgd2l0aCBtZXRhLWRhdGEgdHJhbnNmb3JtZXJzLA0KLSAqIGlmIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIGRlZmluZWQgYXMgYmVhbiBhbmQgZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbCBpbXBsZW1lbnRzIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgcHJpdmF0ZSBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAvL29wdGlvbmFsIGZhbGxiYWNrIGZvciBpbnRlcm5hbCBjYXNoaW5nDQotICAgIHByaXZhdGUgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsNCi0NCi0gICAgcHVibGljIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbCgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciBpbnN0YW5jZW9mIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcikNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyKSBtZXRhRGF0YVRyYW5zZm9ybWVyICkuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgTWV0YURhdGFUcmFuc2Zvcm1lciBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFUcmFuc2Zvcm1lcihNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lciA9IG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25TdHJhdGVneShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneSA9IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTBhMTFkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcg0KLSAgICAuQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyB0aGUgVmFsaWRhdGlvblN0cmF0ZWd5IGZvciBhIGdpdmVuIE1ldGEtRGF0YSBLZXkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFN0cmluZz4NCi0gICAgICAgIGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxTdHJpbmcsIFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9IG51bGw7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBjcmVhdGUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICBpZiAobWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljTWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZy5jb250YWluc0tleShtZXRhRGF0YUtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nLmdldChtZXRhRGF0YUtleSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWU7DQotICAgICAgICAvL251bGwgLT4gdXNlIG5hbWUgbWFwcGVycw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFN0cmluZz4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0cmF0ZWd5TmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZShtZXRhRGF0YUtleSk7DQotDQotICAgICAgICAgICAgaWYgKHN0cmF0ZWd5TmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKHN0cmF0ZWd5TmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyhtZXRhRGF0YUtleSwgc3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lJbnN0YW5jZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUNCi0gICAgICAgICAgICAuc3RhcnRzV2l0aChBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5QUkVGSVhfRk9SX0JFQU5fTUFQUElORykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbih2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLlBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HLmxlbmd0aCgpKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIG1ldGFEYXRhS2V5LCBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZGRpbmcgbWV0YS1kYXRhIGtleSB0byB2YWxpZGF0aW9uIHN0cmF0ZWd5IG1hcHBpbmc6ICINCi0gICAgICAgICAgICAgICAgKyBtZXRhRGF0YUtleSArICIgLT4gIiArIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcucHV0KG1ldGFEYXRhS2V5LCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnID0gbmV3IFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgLy90cnkgdG8gc2V0dXAgbWFwcGluZyB3aXRoIGJhc2UgbmFtZSBieSBjb252ZW50aW9uIC0gb3ZlcnJpZGVzIGRlZmF1bHQgbWFwcGluZw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgLy9idWlsZCBjb252ZW50aW9uIChzdHJhdGVneSBtYXBwaW5nKQ0KLSAgICAgICAgICAgIHN0YXRpY0NvbmZpZy5zZXRTb3VyY2VPZk1hcHBpbmcoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVRJQ19TVFJBVEVHWV9NQVBQSU5HX1NPVVJDRSkpOw0KLQ0KLSAgICAgICAgICAgIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9zZXR1cCBjdXN0b20gbWFwcGluZyAtIG92ZXJyaWRlcyBhbGwgb3RoZXIgbWFwcGluZ3MNCi0gICAgICAgIFN0cmluZyBjdXN0b21NYXBwaW5nQmFzZU5hbWUgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OX1NUUkFURUdZX01BUFBJTkc7DQotICAgICAgICBpZiAoY3VzdG9tTWFwcGluZ0Jhc2VOYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzdGF0aWNDb25maWcgPSBuZXcgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAgICAgICAgIHN0YXRpY0NvbmZpZy5zZXRTb3VyY2VPZk1hcHBpbmcoY3VzdG9tTWFwcGluZ0Jhc2VOYW1lKTsNCi0gICAgICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBTdHJhdGVneU1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZyxTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWFwcGluZy5nZXRTb3VyY2UoKSwgbWFwcGluZy5nZXRUYXJnZXQoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxTdHJpbmc+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm5hbWVNYXBwZXJMaXN0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0lkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDM5NTBkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogaWYgYW4gYWRhcHRlciBpcyB1c2VkIGZvciBzZXZlcmFsIGNvbnN0cmFpbnRzLCB0aGlzIGludGVyZmFjZSBhbGxvd3MgdG8gaWRlbnRpZnkgaW5zdGFuY2VzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgU3RyaW5nIElEX1BSRUZJWCA9ICI6IjsNCi0NCi0gICAgU3RyaW5nIGdldElkKCk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTU1MjNkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQmFzZSBpbnRlcmZhY2UgZm9yIFZhbGlkYXRpb25TdHJhdGVnaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi0vLypWYWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGVhZCBvZiAqVmFsaWRhdG9yIHRvIGF2b2lkIG5hbWluZyBjb25mdXNpb24gDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmNlNzkxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHB1YmxpYyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZDk0ZjcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOw0KLQ0KLS8qKg0KLSAqIE5hbWUgTWFwcGVyIHdoaWNoIGRlbGVnYXRlcyB0aGUgbmFtZSBtYXBwaW5nLCBleHRyYWN0IHRoZSBuYW1lIGFuZCBjb252ZXJ0IGl0IHRvIGEgYmVhbiBuYW1lICsgcHJlZml4DQotICogdGFyZ2V0OiBjb25maWd1cmUgYSB2YWxpZGF0aW9uIHN0cmF0ZWd5IHZpYSBhIG1hbmFnZWQgYmVhbiBmYWNpbGl0eSAtPiBhbGxvd3MgdG8gaW5qZWN0IG90aGVyIGJlYW5zDQotICogaW5zdGVhZCBvZiBhcGkgY2FsbHMgKyBoYXJkY29kZWQgYmVhbiBuYW1lcw0KLSAqIDxwLz4NCi0gKiBhbGxvd2VkIGJlYW4gc2NvcGVzOg0KLSAqIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIHN0YXRlbGVzczogYXBwbGljYXRpb24vc2luZ2xldG9uDQotICogdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgc3RhdGVmdWw6IG5vbmUvcHJvdG90eXBlDQotICogZG9uJ3QgdXNlIHRoZSBzZXNzaW9uIG9yIGEgY29udmVyc2F0aW9uIHNjb3BlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDUwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HID0gImJlYW46IjsNCi0gICAgcHJpdmF0ZSBOYW1lTWFwcGVyPFN0cmluZz4gd3JhcHBlZDsNCi0NCi0gICAgcHVibGljIEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKE5hbWVNYXBwZXI8U3RyaW5nPiBuYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSBuYW1lTWFwcGVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbmFtZSA9IHdyYXBwZWQuY3JlYXRlTmFtZShzb3VyY2UpOw0KLQ0KLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKTsNCi0gICAgICAgIHJldHVybiBQUkVGSVhfRk9SX0JFQU5fTUFQUElORyArIEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUobmFtZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMDMyMDYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgQW5ub3RhdGlvbnMgdG8gVmFsaWRhdGlvblN0cmF0ZWdpZXMuDQotICogKGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlODMwMi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIEFubm90YXRpb25zIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMzhkOGYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBtYXBzIEV4dFZhbCBBbm5vdGF0aW9ucyB0byBFeHRWYWwgVmFsaWRhdGlvblN0cmF0ZWdpZXMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUobWV0YURhdGFLZXkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4MjA1My4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIHRvIHBsYWNlIEFubm90YXRpb25zIGFuZCBWYWxpZGF0aW9uU3RyYXRlZ2llcyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcig0MDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5ICsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Qcmlvcml0eS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OTQ3ZDUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGVudW0gUHJpb3JpdHkKLXsKLSAgICBCTE9DS0lORywKLSAgICBISUdILAotICAgIE1FRElVTSwKLSAgICBMT1cKLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Ub0RvLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVG9Eby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjJhZGFiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Ub0RvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuQ09OU1RSVUNUT1I7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTEQsIENPTlNUUlVDVE9SfSkKLXB1YmxpYyBAaW50ZXJmYWNlIFRvRG8KLXsKLSAgICBQcmlvcml0eSB2YWx1ZSgpOwotICAgIFN0cmluZyBkZXNjcmlwdGlvbigpIGRlZmF1bHQgIiI7Ci0KLSAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICBAaW50ZXJmYWNlIExpc3QKLSAgICB7Ci0gICAgICAgIFRvRG9bXSB2YWx1ZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VDYXRlZ29yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDdiMzg1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLS8qKgotICogQVBJOjxici8+Ci0gKiBwYXJ0cyB5b3UgbWlnaHQgbmVlZCBmb3IgY3VzdG9tIGltcGxlbWVudGF0aW9ucyBhbmQgd2hpY2ggYXJlIHF1aXRlIHN0YWJsZSBpbiB2aWV3IG9mIGNoYW5nZXMKLSAqIDxwLz4KLSAqIElOVEVSTkFMOjxici8+Ci0gKiBpZiB5b3UgdGhpbmsgYWJvdXQgcmVmZXJlbmNpbmcgYW4gYXJ0aWZhY3Qgd2hpY2ggaXMgbWFya2VkIGFzIGludGVybmFsLCBhc2sgZm9yIHN1cHBvcnQuCi0gKiB0aGVyZSBzaG91bGQgYmUgYSBiZXR0ZXIgc29sdXRpb24KLSAqIDxwLz4KLSAqIENVU1RPTUlaQUJMRTo8YnIvPgotICogYSBwbGFubmVkIGV4dGVuc2lvbiBwb2ludCB3aGljaCBjb250YWlucyBsb2dpYyB0byBjdXN0b21pemUgdGhlIGZyYW1ld29yay4KLSAqIGlmIGl0IGlzbid0IGFsc28gbWFya2VkIGFzIEFQSSBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotICogaG93ZXZlciwgd2UgdHJ5IHRvIGtlZXAgaXQgYXMgc3RhYmxlIGFzIHBvc3NpYmxlIGFuZCByZWFzb25hYmxlLgotICogPHAvPgotICogUkVVU0U6PGJyLz4KLSAqIGFuIGFydGlmYWN0IHdoaWNoIHlvdSBjYW4gcmV1c2UgZm9yIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uLgotICogaWYgaXQgaXNuJ3QgbWFya2VkIGFzIEFQSSBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotICogaG93ZXZlciwgd2UgdHJ5IHRvIGtlZXAgaXQgYXMgc3RhYmxlIGFzIHBvc3NpYmxlIGFuZCByZWFzb25hYmxlLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLXB1YmxpYyBlbnVtIFVzYWdlQ2F0ZWdvcnkKLXsKLSAgICBBUEksCi0gICAgSU5URVJOQUwsCi0gICAgQ1VTVE9NSVpBQkxFLAotICAgIFJFVVNFCi19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlSW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzN2ViYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIGl0J3MgYW4gaW50ZXJuYWwgYW5ub3RhdGlvbiB0byBwcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gY29uY2VybmluZyB1c2FnZS1jYXRlZ29yaWVzCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkKLSAqLwotQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi1wdWJsaWMgQGludGVyZmFjZSBVc2FnZUluZm9ybWF0aW9uCi17Ci0gICAgVXNhZ2VDYXRlZ29yeVtdIHZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZTIwNTYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsNCi1pbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ2xhc3NVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENsYXNzVXRpbHMuY2xhc3MpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIHRyeVRvTG9hZENsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGxvYWRDbGFzc0Zvck5hbWUobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGxvYWRDbGFzc0Zvck5hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIFRyeSBXZWJBcHAgQ2xhc3NMb2FkZXIgZmlyc3QNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwDQotICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWdub3JlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIGZhbGxiYWNrOiBUcnkgQ2xhc3NMb2FkZXIgZm9yIENsYXNzVXRpbHMgKGkuZS4gdGhlIG15ZmFjZXMuamFyIGxpYikNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwDQotICAgICAgICAgICAgICAgIENsYXNzVXRpbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyA8VD4gVCB0cnlUb0luc3RhbnRpYXRlQ2xhc3MoQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0YXJnZXRDbGFzcy5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKFN0cmluZyBjbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxvYWRDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEphclZlcnNpb24oQ2xhc3MgdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjbGFzc0ZpbGVQYXRoID0gdGFyZ2V0Q2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyI7DQotICAgICAgICBTdHJpbmcgbWFuaWZlc3RGaWxlUGF0aCA9ICIvTUVUQS1JTkYvTUFOSUZFU1QuTUYiOw0KLQ0KLSAgICAgICAgU3RyaW5nIGNsYXNzTG9jYXRpb24gPSB0YXJnZXRDbGFzcy5nZXRSZXNvdXJjZSh0YXJnZXRDbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLmNsYXNzIikudG9TdHJpbmcoKTsNCi0gICAgICAgIFN0cmluZyBtYW5pZmVzdEZpbGVMb2NhdGlvbiA9IGNsYXNzTG9jYXRpb24NCi0gICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCBjbGFzc0xvY2F0aW9uLmluZGV4T2YoY2xhc3NGaWxlUGF0aCkgLSAxKSArIG1hbmlmZXN0RmlsZVBhdGg7DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IE1hbmlmZXN0KG5ldyBVUkwobWFuaWZlc3RGaWxlTG9jYXRpb24pLm9wZW5TdHJlYW0oKSkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNYWluQXR0cmlidXRlcygpLmdldFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5JTVBMRU1FTlRBVElPTl9WRVJTSU9OKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoTE9HLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBMT0cudHJhY2UoImNvdWxkbid0IGxvYWQgdmVyc2lvbiBvZiBqYXIgZmlsZSB3aGljaCBjb250YWlucyAiICsgdGFyZ2V0Q2xhc3MuZ2V0TmFtZSgpLCB0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRGVmYXVsdFByb2plY3ROYW1lLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9EZWZhdWx0UHJvamVjdE5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkNjM5OS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9EZWZhdWx0UHJvamVjdE5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Qcm9qZWN0U3RhZ2VOYW1lOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0UHJvamVjdE5hbWUgaW1wbGVtZW50cyBQcm9qZWN0U3RhZ2VOYW1lDQotew0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOw0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pDQotICAgIHByaXZhdGUgRGVmYXVsdFByb2plY3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIERlZmF1bHRQcm9qZWN0TmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBzdGF0aWMgUHJvamVjdFN0YWdlTmFtZSBjcmVhdGVQcm9qZWN0U3RhZ2VOYW1lKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRQcm9qZWN0TmFtZShuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5uYW1lOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmICh0aGlzID09IG8pDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgRGVmYXVsdFByb2plY3ROYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBEZWZhdWx0UHJvamVjdE5hbWUgdGhhdCA9IChEZWZhdWx0UHJvamVjdE5hbWUpIG87DQotDQotICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKHRoYXQubmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmFtZS5oYXNoQ29kZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmVlM2RhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NjQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5WYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Qcm9qZWN0U3RhZ2VOYW1lOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5BYnN0cmFjdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5OYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5GYWNlc01lc3NhZ2VTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbFV0aWxzDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HR0VSID0gTG9nRmFjdG9yeS5nZXRMb2coRXh0VmFsVXRpbHMuY2xhc3MpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfUkVRVUlSRUQgPSAiamF2YXguZmFjZXMuY29tcG9uZW50LlVJSW5wdXQuUkVRVUlSRUQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfUkVRVUlSRURfREVUQUlMID0gImphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUlucHV0LlJFUVVJUkVEX2RldGFpbCI7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19NQVhJTVVNID0gImphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3IuTUFYSU1VTSI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19NQVhJTVVNX0RFVEFJTCA9ICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yLk1BWElNVU1fZGV0YWlsIjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChDbGFzc01hcHBpbmdGYWN0b3J5PFN0cmluZywgVmFsaWRhdGlvblN0cmF0ZWd5PikgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZShtZXRhRGF0YUtleSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgTmFtZU1hcHBlcjxTdHJpbmc+IG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlcmVnaXN0ZXIobWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbnlNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gbWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZW55KG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFUcmFuc2Zvcm1lciBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YVRyYW5zZm9ybWVyPikgRXh0VmFsQ29udGV4dA0KLSAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlKHZhbGlkYXRpb25TdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLnJlZ2lzdGVyKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVyZWdpc3Rlcih2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZW55VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVueSh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLCBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yV2l0aChNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksIENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVdpdGgocHJvcGVydGllcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudFdpdGhNZXRhRGF0YShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGZvciAoQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRDb21wb25lbnRJbml0aWFsaXplcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjb21wb25lbnRJbml0aWFsaXplci5jb25maWd1cmVDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOw0KLQ0KLSAgICAgICAgaWYgKG1ldGFEYXRhRW50cnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YUVudHJ5ID0gbmV3IE1ldGFEYXRhRW50cnkoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAoVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCF2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJUaHJvd2luZygNCi0gICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbiwgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGVJbnRlcmNlcHRlZE1ldGFEYXRhRXh0cmFjdG9yKGZpbmFsIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvcldpdGgobWV0YURhdGFFeHRyYWN0b3IsIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvckZvcigNCi0gICAgICAgICAgICBmaW5hbCBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciwgQ2xhc3MgbW9kdWxlS2V5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIGlmKG1vZHVsZUtleSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpLCBtb2R1bGVLZXkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3JXaXRoKG1ldGFEYXRhRXh0cmFjdG9yLCBwcm9wZXJ0aWVzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3JXaXRoKA0KLSAgICAgICAgICAgIGZpbmFsIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yLCBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgTWV0YURhdGFFeHRyYWN0b3IoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcmVzdWx0ID0gbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIG9iamVjdCk7DQotDQotICAgICAgICAgICAgICAgIGFkZFByb3BlcnRpZXMocmVzdWx0LCBwcm9wZXJ0aWVzKTsNCi0gICAgICAgICAgICAgICAgaW52b2tlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKHJlc3VsdCwgcHJvcGVydGllcyk7DQotDQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFByb3BlcnRpZXMoUHJvcGVydHlJbmZvcm1hdGlvbiByZXN1bHQsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgaWYocHJvcGVydGllcyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY3VzdG9tUHJvcGVydGllcyA9IGdldEN1c3RvbVByb3BlcnRpZXMocmVzdWx0KTsNCi0gICAgICAgICAgICBjdXN0b21Qcm9wZXJ0aWVzLnB1dEFsbChwcm9wZXJ0aWVzKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEN1c3RvbVByb3BlcnRpZXMoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZighcHJvcGVydHlJbmZvcm1hdGlvbi5jb250YWluc0luZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkNVU1RPTV9QUk9QRVJUSUVTKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnNldEluZm9ybWF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuQ1VTVE9NX1BST1BFUlRJRVMsIG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoTWFwPFN0cmluZywgT2JqZWN0PikgcHJvcGVydHlJbmZvcm1hdGlvbi5nZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5DVVNUT01fUFJPUEVSVElFUyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbnZva2VNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoUHJvcGVydHlJbmZvcm1hdGlvbiByZXN1bHQsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgZm9yIChNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciA6DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc1dpdGgocHJvcGVydGllcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJFeHRyYWN0aW5nKHJlc3VsdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlUmVzb2x2ZXIgZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXNzYWdlUmVzb2x2ZXI+KSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlKHZhbGlkYXRpb25TdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5yZWdpc3Rlcih2YWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlcmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IHZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlcmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZW55VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZW55KHZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEVMSGVscGVyIGdldEVMSGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRUxfSEVMUEVSX0ZBQ1RPUlksIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmNsYXNzKS5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY2VzTWVzc2FnZSBjcmVhdGVGYWNlc01lc3NhZ2UoU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcmVhdGVGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjZXNNZXNzYWdlIGNyZWF0ZUZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5GQUNFU19NRVNTQUdFX0ZBQ1RPUlksIEZhY2VzTWVzc2FnZUZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUoc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBGYWNlc01lc3NhZ2UgY29udmVydEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5GQUNFU19NRVNTQUdFX0ZBQ1RPUlksIEZhY2VzTWVzc2FnZUZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5jb252ZXJ0KGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eURldGFpbHMgY3JlYXRlUHJvcGVydHlEZXRhaWxzRm9yTmV3VGFyZ2V0KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgYmFzZU9iamVjdDsNCi0gICAgICAgIGlmIChnZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZCh0YXJnZXRFeHByZXNzaW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZSA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHRhcmdldEV4cHJlc3Npb24pOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyBleHByZXNzaW9uID0gdmJlLmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgICAgICBiYXNlT2JqZWN0ID0gZ2V0RUxIZWxwZXIoKS5nZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZiZS5nZXRCYXNlRXhwcmVzc2lvbigpKTsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uc3Vic3RyaW5nKDIsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKSwgYmFzZU9iamVjdCwgdmJlLmdldFByb3BlcnR5KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIG9yaWdpbmFsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eSgNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIFN0cmluZyBuZXdCYXNlS2V5ID0gb3JpZ2luYWwuZ2V0S2V5KCkuc3Vic3RyaW5nKDAsIG9yaWdpbmFsLmdldEtleSgpLmxhc3RJbmRleE9mKCIuIikgKyAxKTsNCi0gICAgICAgIFN0cmluZyBuZXdLZXkgPSBuZXdCYXNlS2V5ICsgdGFyZ2V0RXhwcmVzc2lvbjsNCi0NCi0gICAgICAgIGJhc2VPYmplY3QgPSBSZWZsZWN0aW9uVXRpbHMuZ2V0QmFzZU9mUHJvcGVydHlDaGFpbihvcmlnaW5hbC5nZXRCYXNlT2JqZWN0KCksIHRhcmdldEV4cHJlc3Npb24pOw0KLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURldGFpbHMoDQotICAgICAgICAgICAgICAgIG5ld0tleSwgYmFzZU9iamVjdCwgdGFyZ2V0RXhwcmVzc2lvbi5zdWJzdHJpbmcodGFyZ2V0RXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiLiIpICsgMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRFeHByZXNzaW9uLmxlbmd0aCgpKSk7DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvUGxhY2VMYWJlbChGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBTdHJpbmcgbGFiZWwsIGludCBpbmRleCkNCi0gICAgew0KLSAgICAgICAgaWYgKGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLmNvbnRhaW5zKCJ7IiArIGluZGV4ICsgIn0iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLnJlcGxhY2UoInsiICsgaW5kZXggKyAifSIsIGxhYmVsKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoZmFjZXNNZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwgJiYgZmFjZXNNZXNzYWdlLmdldERldGFpbCgpLmNvbnRhaW5zKCJ7IiArIGluZGV4ICsgIn0iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKS5yZXBsYWNlKCJ7IiArIGluZGV4ICsgIn0iLCBsYWJlbCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBsYWNlV2l0aERlZmF1bHRNYXhpbXVtTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBpbnQgbWF4TGVuZ3RoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2UgPSBKc2ZVdGlscy5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZShKQVZBWF9GQUNFU19NQVhJTVVNKTsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlOw0KLQ0KLSAgICAgICAgLy91c2UgdHJ5L2NhdGNoIGZvciBlYXNpZXIgc3luYyBiZXR3ZWVuIHRydW5rL2JyYW5jaA0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKEpzZlV0aWxzLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKEpBVkFYX0ZBQ0VTX01BWElNVU1fREVUQUlMKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBKc2ZVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZShKQVZBWF9GQUNFU19NQVhJTVVNX0RFVEFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9qc2YgMS4yIGRvZXNuJ3QgaGF2ZSBhIGRldGFpbCBtZXNzYWdlDQotICAgICAgICB9DQotDQotICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZSA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlLnJlcGxhY2UoInswfSIsICIiICsgbWF4TGVuZ3RoKTsNCi0gICAgICAgIGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsID0gZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwucmVwbGFjZSgiezB9IiwgIiIgKyBtYXhMZW5ndGgpOw0KLQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoZmFjZXNSZXF1aXJlZE1lc3NhZ2UpOw0KLSAgICAgICAgZmFjZXNNZXNzYWdlLnNldERldGFpbChmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCk7DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2UgPSBKc2ZVdGlscy5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZShKQVZBWF9GQUNFU19SRVFVSVJFRCk7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZTsNCi0NCi0gICAgICAgIC8vdXNlIHRyeS9jYXRjaCBmb3IgZWFzaWVyIHN5bmMgYmV0d2VlbiB0cnVuay9icmFuY2gNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChKc2ZVdGlscy5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZShKQVZBWF9GQUNFU19SRVFVSVJFRF9ERVRBSUwpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IEpzZlV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKEpBVkFYX0ZBQ0VTX1JFUVVJUkVEX0RFVEFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9qc2YgMS4yIGRvZXNuJ3QgaGF2ZSBhIGRldGFpbCBtZXNzYWdlDQotICAgICAgICB9DQotDQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc1JlcXVpcmVkTWVzc2FnZSk7DQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTa2lwYWJsZVZhbGlkYXRpb25TdHJhdGVneShDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50Q2xhc3MgOiBnZXRTa2lwVmFsaWRhdGlvblN1cHBvcnRDbGFzc0xpc3QoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoaXNTa2lwVmFsaWRhdGlvblN1cHBvcnRlZChjdXJyZW50Q2xhc3MsIHRhcmdldENsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvY2Vzc01ldGFEYXRhRW50cnlBZnRlclNraXBWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHRhcmdldENsYXNzLCBNZXRhRGF0YUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gaXNTa2lwYWJsZVZhbGlkYXRpb25TdHJhdGVneSh0YXJnZXRDbGFzcykgJiYNCi0gICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhlbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5TS0lQX1ZBTElEQVRJT04sIEJvb2xlYW4uY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8Q2xhc3M+IGdldFNraXBWYWxpZGF0aW9uU3VwcG9ydENsYXNzTGlzdCgpDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IHN0YXRpY0NvbmZpZ3VyYXRpb25MaXN0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlNLSVBfVkFMSURBVElPTl9TVVBQT1JUX0NPTkZJRyk7DQotDQotICAgICAgICBMaXN0PENsYXNzPiBtYXJrZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzczsNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gY3VycmVudEVudHJ5IDogc3RhdGljQ29uZmlndXJhdGlvbkxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IGN1cnJlbnRDb25maWd1cmF0aW9uRW50cnkgOiBjdXJyZW50RW50cnkuZ2V0TWFwcGluZygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudENsYXNzID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUoY3VycmVudENvbmZpZ3VyYXRpb25FbnRyeS5nZXRUYXJnZXQoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q2xhc3MgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbWFya2VyTGlzdC5hZGQoY3VycmVudENsYXNzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChMT0dHRVIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi53YXJuKCJjb25maWd1cmF0aW9uIGVudHJ5IHByb3ZpZGVzIGFuIGludmFsaWQgZW50cnk6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY3VycmVudENvbmZpZ3VyYXRpb25FbnRyeS5nZXRUYXJnZXQoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWFya2VyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTa2lwVmFsaWRhdGlvblN1cHBvcnRlZChDbGFzcyBjdXJyZW50Q2xhc3MsIENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZiAoY3VycmVudENsYXNzLmlzQW5ub3RhdGlvbigpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh0YXJnZXRDbGFzcy5pc0Fubm90YXRpb25QcmVzZW50KGN1cnJlbnRDbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGN1cnJlbnRDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRhcmdldENsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgZ2V0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpDQotICAgIHsNCi0gICAgICAgIGlmKGlzVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rpb25EZWFjdGl2YXRlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpIHsNCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4oKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5KQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIDxUPiBMaXN0PFQ+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzczxUPiB2YWx1ZVR5cGUpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFQ+KCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIDxUPiBUIGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzczxUPiB2YWx1ZVR5cGUsIENsYXNzIHZhbHVlSWQpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkuZ2V0RmFjdG9yeSgNCi0gICAgICAgICAgICAgICAgRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZLCBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKENsYXNzIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgIENsYXNzTWFwcGluZ0ZhY3Rvcnk8Q2xhc3MsIENsYXNzPiB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5LmNyZWF0ZShzb3VyY2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdGlvbkRlYWN0aXZhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX1ZBTElEQVRJT05fUEFSQU1FVEVSUyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGV4ZWN1dGVMb2NhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHByb3BlcnRpZXMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0gZ2V0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpLmV4dHJhY3QoDQotICAgICAgICAgICAgICAgIGFubm90YXRpb24sIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLCBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcyk7DQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7DQotDQotICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5TWFwLnB1dChwcm9wZXJ0eUtleSwgcHJvcGVydGllcyk7DQotICAgICAgICB9DQotICAgICAgICBwcm9wZXJ0eU1hcC5wdXQoQW5ub3RhdGlvbi5jbGFzcy5nZXROYW1lKCksIGFubm90YXRpb24pOw0KLQ0KLSAgICAgICAgZm9yIChQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA6IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIXByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgICAgICAgICAgICAgICAgICAuYmVmb3JlVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHByb3BlcnR5TWFwKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGV4ZWN1dGVMb2NhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5S2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwcm9wZXJ0aWVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0gZ2V0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpLmV4dHJhY3QoDQotICAgICAgICAgICAgICAgIGFubm90YXRpb24sIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLCBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcyk7DQotDQotICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5TWFwLnB1dChwcm9wZXJ0eUtleSwgcHJvcGVydGllcyk7DQotICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KEFubm90YXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgOiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlNYXApOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJpcyByZW5hbWluZyBvaz8iKQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXhlY3V0ZUdsb2JhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwcm9wZXJ0aWVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgbW9kdWxlS2V5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7DQotDQotICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5TWFwLnB1dChwcm9wZXJ0eUtleSwgcHJvcGVydGllcyk7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IobW9kdWxlS2V5KTsNCi0NCi0gICAgICAgIGZvciAoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgOiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLSAgICAgICAgICAgICAgICAgICAgLmJlZm9yZVZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eU1hcCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJpcyByZW5hbWluZyBvaz8iKQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5S2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcHJvcGVydGllcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgbW9kdWxlS2V5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5TWFwLnB1dChwcm9wZXJ0eUtleSwgcHJvcGVydGllcyk7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IobW9kdWxlS2V5KTsNCi0NCi0gICAgICAgIGZvciAoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgOiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlNYXApOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgZ2V0U3RvcmFnZShDbGFzczxUPiBzdG9yYWdlVHlwZSwgU3RyaW5nIHN0b3JhZ2VOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFQpIGdldFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSgpLmNyZWF0ZShzdG9yYWdlVHlwZSkuY3JlYXRlKHN0b3JhZ2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRTdG9yYWdlKENsYXNzIHN0b3JhZ2VUeXBlLCBTdHJpbmcgc3RvcmFnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIGdldFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSgpLmNyZWF0ZShzdG9yYWdlVHlwZSkucmVzZXQoc3RvcmFnZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIENsYXNzTWFwcGluZ0ZhY3Rvcnk8Q2xhc3MsIFN0b3JhZ2VNYW5hZ2VyPiBnZXRTdG9yYWdlTWFuYWdlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFRyYW5zZm9ybWVkTWV0YURhdGEoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRUcmFuc2Zvcm1lZE1ldGFEYXRhRm9yKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRUcmFuc2Zvcm1lZE1ldGFEYXRhRm9yKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBDbGFzcyBtb2R1bGVLZXkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgaWYobW9kdWxlS2V5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCksIG1vZHVsZUtleSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZ2V0VHJhbnNmb3JtZWRNZXRhRGF0YVdpdGgoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgcHJvcGVydGllcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFRyYW5zZm9ybWVkTWV0YURhdGFXaXRoKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotICAgICAgICBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvciBza2lwVmFsaWRhdGlvbkV2YWx1YXRvciA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKCk7DQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yV2l0aChwcm9wZXJ0aWVzKTsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGE7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhUmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGFEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gdHJhbnNmb3JtTWV0YURhdGEoDQotICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblN0cmF0ZWd5LCBza2lwVmFsaWRhdGlvbkV2YWx1YXRvciwgbWV0YURhdGEsIGVudHJ5KTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKCFpc0NvbXBvbmVudEluaXRpYWxpemF0aW9uU2tpcHBlZChtZXRhRGF0YSwgZW50cnksIHZhbGlkYXRpb25TdHJhdGVneSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vZG9uJ3QgYnJlYWsgbWF5YmUgdGhlcmUgYXJlIGNvbnN0cmFpbnRzIHdoaWNoIGRvbid0IHN1cHBvcnQgdGhlIHNraXAtbWVjaGFuaXNtDQotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YVJlc3VsdC5wdXRBbGwobWV0YURhdGEpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhUmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEsIE1ldGFEYXRhRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmICghc2tpcFZhbGlkYXRpb25FdmFsdWF0b3Iuc2tpcFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblN0cmF0ZWd5LCBlbnRyeSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyID0gZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckZvclZhbGlkYXRpb25TdHJhdGVneSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIExPR0dFUi5kZWJ1ZyhtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWV0YURhdGEgPSBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAobWV0YURhdGEgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbWV0YURhdGE7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvbXBvbmVudEluaXRpYWxpemF0aW9uU2tpcHBlZChNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhLCBNZXRhRGF0YUVudHJ5IGVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YS5pc0VtcHR5KCkgfHwNCi0gICAgICAgICAgICAgICAgKEJvb2xlYW4uVFJVRS5lcXVhbHMoZW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCBCb29sZWFuLmNsYXNzKSkgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICBpc1NraXBhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKSkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpDQotICAgIHsNCi0gICAgICAgIC8vdG8gZGVhY3RpdmF0ZTogdGhlIHBhcmFtZXRlciBoYXMgdG8gYmUgZXhwbGljaXRseSBmYWxzZQ0KLSAgICAgICAgcmV0dXJuICEiZmFsc2UiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLklOVEVSUFJFVF9FTVBUWV9TVFJJTkdfU1VCTUlUVEVEX1ZBTFVFU19BU19OVUxMKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVFbXB0eUZpZWxkcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAhImZhbHNlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFBhcmFtZXRlci5WQUxJREFURV9FTVBUWV9GSUVMRFMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHlEZXRhaWxzIGdldFByb3BlcnR5RGV0YWlscyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvVGhyb3dWYWxpZGF0b3JFeGNlcHRpb25Gb3JDb21wb25lbnRJZCgNCi0gICAgICAgICAgICBTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpDQotICAgIHsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IGZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgdHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudCh0YXJnZXRDb21wb25lbnQsIGZhY2VzTWVzc2FnZSwgdGhyb3dhYmxlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudCgNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkNCi0gICAgew0KLSAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBpbnRlcnByZXRlciA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBpZiAoaW50ZXJwcmV0ZXIuc2V2ZXJpdHlDYXVzZXNWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh0aHJvd2FibGUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc01lc3NhZ2UsIHRocm93YWJsZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudCh1aUNvbXBvbmVudCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50SWQoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBVSUNvbXBvbmVudCB0YXJnZXRDb21wb25lbnQgPSBmaW5kQ29tcG9uZW50KGNsaWVudElkKTsNCi0NCi0gICAgICAgIGlmICh0YXJnZXRDb21wb25lbnQgPT0gbnVsbCAmJiBjbGllbnRJZCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvclRlc3RDbGllbnRJZChjbGllbnRJZCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICB0cnlUb0FkZFZpb2xhdGlvbk1lc3NhZ2VGb3JDb21wb25lbnQodGFyZ2V0Q29tcG9uZW50LCBmYWNlc01lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJyZXF1aXJlZCBmb3IgdGVzdCBmcmFtZXdvcmtzIC0gZ29hbDogcmVtb3ZlIGl0IikNCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0cnlUb0FkZFZpb2xhdGlvbk1lc3NhZ2VGb3JUZXN0Q2xpZW50SWQoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGludGVycHJldGVyID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIGlmIChpbnRlcnByZXRlci5zZXZlcml0eUNhdXNlc1Zpb2xhdGlvbk1lc3NhZ2UoZmFjZXNDb250ZXh0LCBudWxsLCBmYWNlc01lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkRmFjZXNNZXNzYWdlKGNsaWVudElkLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50KG51bGwsIGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBpbnRlcnByZXRlciA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBpZiAoaW50ZXJwcmV0ZXIuc2V2ZXJpdHlDYXVzZXNWaW9sYXRpb25NZXNzYWdlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGZhY2VzTWVzc2FnZS5nZXRTZXZlcml0eSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodWlDb21wb25lbnQgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFkZEZhY2VzTWVzc2FnZSh1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRGYWNlc01lc3NhZ2UobnVsbCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICB0cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnQodWlDb21wb25lbnQsIGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBhZGRGYWNlc01lc3NhZ2UobnVsbCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRmFjZXNNZXNzYWdlKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlU3RvcmFnZSBzdG9yYWdlID0gZ2V0U3RvcmFnZShGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLCBGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBpZiAoc3RvcmFnZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0b3JhZ2UuYWRkRmFjZXNNZXNzYWdlKGNsaWVudElkLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5hZGRNZXNzYWdlKGNsaWVudElkLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnRJZChTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IGZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgdHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50KHRhcmdldENvbXBvbmVudCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGludGVycHJldGVyID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIGlmIChpbnRlcnByZXRlci5zZXZlcml0eUJsb2Nrc05hdmlnYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5yZW5kZXJSZXNwb25zZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXZlcml0eUJsb2Nrc1N1Ym1pdEZvckNvbXBvbmVudElkKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBpbnRlcnByZXRlciA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBVSUNvbXBvbmVudCB0YXJnZXRDb21wb25lbnQgPSBmaW5kQ29tcG9uZW50KGNsaWVudElkKTsNCi0NCi0gICAgICAgIHJldHVybiBpbnRlcnByZXRlci5zZXZlcml0eUJsb2Nrc1N1Ym1pdChmYWNlc0NvbnRleHQsIHRhcmdldENvbXBvbmVudCwgZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCkpOw0KLSAgICB9DQotDQotICAgIC8vYXZhaWxhYmxlIGZvciBhZGQtb25zIC0gbm90IHVzZWQgaW50ZXJuYWxseSBkdWUgdG8gcGVyZm9ybWFuY2UgcmVhc29ucw0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2V2ZXJpdHlTaG93c0luZGljYXRpb25Gb3JDb21wb25lbnRJZChTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gZmluZENvbXBvbmVudChjbGllbnRJZCk7DQotDQotICAgICAgICByZXR1cm4gaW50ZXJwcmV0ZXIuc2V2ZXJpdHlTaG93c0luZGljYXRpb24oZmFjZXNDb250ZXh0LCB0YXJnZXRDb21wb25lbnQsIGZhY2VzTWVzc2FnZS5nZXRTZXZlcml0eSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBVSUNvbXBvbmVudCBmaW5kQ29tcG9uZW50KFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgICAgIGlmIChjbGllbnRJZCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldENvbXBvbmVudCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRhcmdldENvbXBvbmVudDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQHJldHVybiB0cnVlIGlmIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbiBmb3IgcmVxdWlyZWQgdmFsaWRhdGlvbiBpcyBhY3RpdmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25BY3RpdmUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFLmVxdWFscyhFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eSgibW9kZTppbml0OnJlcXVpcmVkIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBuZWVkZWQgZm9yIHNvbWUgY29tcG9uZW50IGxpYnMgLSBpZiByZXF1aXJlZCBpbml0aWFsaXphdGlvbiBpcyB1c2VkIGUuZy4gZm9yIHZpc3VhbCBpbmRpY2F0b3JzDQotICAgICAqIGJ1dCBmZWF0dXJlcyBsaWtlIHNldmVyaXR5IGF3YXJlIHZhbGlkYXRpb24gYXJlbid0IHVzZWQuDQotICAgICAqIGluIHN1Y2ggYSBjYXNlIGl0J3MgcG9zc2libGUgdG8gdXNlIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGUuDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuIGZhbHNlIHRvIGRlYWN0aXZhdGUgdGhlIGZpbmFsIHJlc2V0IG9mIHRoZSB2YWx1ZSBvZiB0aGUgcmVxdWlyZWQgYXR0cmlidXRlDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZXF1aXJlZFJlc2V0QWN0aXZhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRS5lcXVhbHMoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoIm1vZGU6cmVzZXQ6cmVxdWlyZWQiKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0U3RhZ2VOYW1lIGdldERlZmF1bHRTdGFnZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY3JlYXRlUHJvamVjdFN0YWdlTmFtZSgiUHJvZHVjdGlvbiIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdFN0YWdlTmFtZSBjcmVhdGVQcm9qZWN0U3RhZ2VOYW1lKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRGVmYXVsdFByb2plY3ROYW1lLmNyZWF0ZVByb2plY3RTdGFnZU5hbWUobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXh0VmFsRGVhY3RpdmF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoU3lzdGVtDQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSArDQotICAgICAgICAgICAgICAgICAgICAiLkRFQUNUSVZBVEVfQUxMIiwgImZhbHNlIikpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0dyb3VwVXRpbHMuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0dyb3VwVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg1ZWFiMy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Hcm91cFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEdyb3VwVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEdyb3VwS2V5KFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNsaWVudElkID09IG51bGwgPyB2aWV3SWQgOiB2aWV3SWQgKyAiQCIgKyBjbGllbnRJZDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvSnNmVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc3OTg3NS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5GYWNlc0luZm9ybWF0aW9uU3RvcmFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5mYWNlcy5saWZlY3ljbGUuTGlmZWN5Y2xlOwotaW1wb3J0IGphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGVGYWN0b3J5OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgSnNmVXRpbHMKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3RlclBoYXNlTGlzdGVuZXIoUGhhc2VMaXN0ZW5lciBwaGFzZUxpc3RlbmVyKQotICAgIHsKLSAgICAgICAgTGlmZWN5Y2xlRmFjdG9yeSBsaWZlY3ljbGVGYWN0b3J5ID0gKExpZmVjeWNsZUZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEZhY3RvcnlGaW5kZXIuTElGRUNZQ0xFX0ZBQ1RPUlkpOwotCi0gICAgICAgIFN0cmluZyBjdXJyZW50SWQ7Ci0gICAgICAgIExpZmVjeWNsZSBjdXJyZW50TGlmZWN5Y2xlOwotICAgICAgICBJdGVyYXRvciBsaWZlY3ljbGVJZHMgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZUlkcygpOwotICAgICAgICB3aGlsZSAobGlmZWN5Y2xlSWRzLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudElkID0gKFN0cmluZykgbGlmZWN5Y2xlSWRzLm5leHQoKTsKLSAgICAgICAgICAgIGN1cnJlbnRMaWZlY3ljbGUgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZShjdXJyZW50SWQpOwotICAgICAgICAgICAgY3VycmVudExpZmVjeWNsZS5yZW1vdmVQaGFzZUxpc3RlbmVyKHBoYXNlTGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyUGhhc2VMaXN0ZW5lcihQaGFzZUxpc3RlbmVyIHBoYXNlTGlzdGVuZXIpCi0gICAgewotICAgICAgICBMaWZlY3ljbGVGYWN0b3J5IGxpZmVjeWNsZUZhY3RvcnkgPSAoTGlmZWN5Y2xlRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRmFjdG9yeUZpbmRlci5MSUZFQ1lDTEVfRkFDVE9SWSk7Ci0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRJZDsKLSAgICAgICAgTGlmZWN5Y2xlIGN1cnJlbnRMaWZlY3ljbGU7Ci0gICAgICAgIEl0ZXJhdG9yIGxpZmVjeWNsZUlkcyA9IGxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlSWRzKCk7Ci0gICAgICAgIHdoaWxlIChsaWZlY3ljbGVJZHMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjdXJyZW50SWQgPSAoU3RyaW5nKSBsaWZlY3ljbGVJZHMubmV4dCgpOwotICAgICAgICAgICAgY3VycmVudExpZmVjeWNsZSA9IGxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlKGN1cnJlbnRJZCk7Ci0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlLmFkZFBoYXNlTGlzdGVuZXIocGhhc2VMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKQotICAgIHsKLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsKLQotICAgICAgICByZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEZhY2VzTWVzc2FnZS5GQUNFU19NRVNTQUdFUywgZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0Q3VzdG9tRmFjZXNNZXNzYWdlQnVuZGxlKCkKLSAgICB7Ci0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBidW5kbGVOYW1lID0gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZ2V0TWVzc2FnZUJ1bmRsZSgpOwotCi0gICAgICAgIGlmIChidW5kbGVOYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShidW5kbGVOYW1lLCBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZUZyb21BcHBsaWNhdGlvbk1lc3NhZ2VCdW5kbGUoU3RyaW5nIG1lc3NhZ2VLZXkpCi0gICAgewotICAgICAgICBSZXNvdXJjZUJ1bmRsZSBjdXN0b21SZXNvdXJjZUJ1bmRsZSA9IGdldEN1c3RvbUZhY2VzTWVzc2FnZUJ1bmRsZSgpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY3VzdG9tUmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9tUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKG1lc3NhZ2VLZXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy9ubyBjdXN0b20gbWVzc2FnZSBpcyBhdmFpbGFibGUgLSBkbyBub3RoaW5nCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhtZXNzYWdlS2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZW5kZXJSZXNwb25zZVBoYXNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQaGFzZUlkLlJFTkRFUl9SRVNQT05TRS5lcXVhbHMoZ2V0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UoKS5nZXRDdXJyZW50UGhhc2VJZCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFBoYXNlSWQgZ2V0Q3VycmVudFBoYXNlSWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlKCkuZ2V0Q3VycmVudFBoYXNlSWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzaW1wbGUgdGVzdCBmb3IgZWFybHkgY29uZmlnIGluIGNhc2Ugb2YgbW9qYXJyYQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUganNmIGltcGwuIGlzIGluaXRpYWxpemVkIGFuZCBpdCdzIHBvc3NpYmxlIHRvIHVzZSBpdCBhcyBleHBlY3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FwcGxpY2F0aW9uSW5pdGlhbGl6ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRDbGFzcygpLmdldE5hbWUoKS5zdGFydHNXaXRoKCJvcmcuYXBhY2hlLm15ZmFjZXMiKSB8fAotICAgICAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIUZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlIGdldEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLCBGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Byb3h5VXRpbHMuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Byb3h5VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc1YzIzZS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Qcm94eVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHkuUHJveHlIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5LkRlZmF1bHRQcm94eUhlbHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJveHlVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgUHJveHlIZWxwZXIgcHJveHlIZWxwZXI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IENsYXNzPFQ+IGdldFVucHJveGllZENsYXNzKENsYXNzIGN1cnJlbnRDbGFzcywgQ2xhc3M8VD4gdGFyZ2V0VHlwZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFByb3h5SGVscGVyKCkuZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudENsYXNzLCB0YXJnZXRUeXBlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldFVucHJveGllZENsYXNzKENsYXNzIGN1cnJlbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFByb3h5SGVscGVyKCkuZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudENsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGFzc05hbWUoQ2xhc3MgcHJveGllZENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UHJveHlIZWxwZXIoKS5nZXROYW1lT2ZDbGFzcyhwcm94aWVkQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsYXNzTmFtZU9mT2JqZWN0KE9iamVjdCBwcm94aWVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UHJveHlIZWxwZXIoKS5nZXRDbGFzc05hbWVPZk9iamVjdChwcm94aWVkT2JqZWN0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UHJveHlIZWxwZXIoKS5pc1Byb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb3hpZWRPYmplY3QoT2JqZWN0IHByb3hpZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRQcm94eUhlbHBlcigpLmlzUHJveGllZE9iamVjdChwcm94aWVkT2JqZWN0KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBQcm94eUhlbHBlciBnZXRQcm94eUhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmIChwcm94eUhlbHBlciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vd29ya2Fyb3VuZCBmb3IgbW9qYXJyYQ0KLSAgICAgICAgICAgIGlmKCFKc2ZVdGlscy5pc0FwcGxpY2F0aW9uSW5pdGlhbGl6ZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFByb3h5SGVscGVyKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByb3h5SGVscGVyID0gY3JlYXRlUHJveHlIZWxwZXIoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBwcm94eUhlbHBlcjsNCi0gICAgfQ0KLQ0KLSAgICAvL2Rvbid0IHVzZSB0aGUgZGVmYXVsdCBhcHByb2FjaCAoZmFjdG9yeSBmaW5kZXIpIC0gUHJveHlIZWxwZXIgaXMgY2FsbGVkIHRvbyBvZnRlbi4uLg0KLSAgICBwcml2YXRlIHN0YXRpYyBQcm94eUhlbHBlciBjcmVhdGVQcm94eUhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjdXN0b21Qcm94eUhlbHBlckNsYXNzTmFtZSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fUFJPWFlfSEVMUEVSOw0KLQ0KLSAgICAgICAgUHJveHlIZWxwZXIgcmVzdWx0ID0gbnVsbDsNCi0gICAgICAgIGlmKGN1c3RvbVByb3h5SGVscGVyQ2xhc3NOYW1lICE9IG51bGwgJiYgISIiLmVxdWFscyhjdXN0b21Qcm94eUhlbHBlckNsYXNzTmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gKFByb3h5SGVscGVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjdXN0b21Qcm94eUhlbHBlckNsYXNzTmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBuZXcgRGVmYXVsdFByb3h5SGVscGVyKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1JlZmxlY3Rpb25VdGlscy5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMDYyYmYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBSZWZsZWN0aW9uVXRpbHMKLXsKLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCB0cnlUb0dldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ5VG9HZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIHRyeVRvR2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0TWV0aG9kTmFtZSwgQ2xhc3MuLi4gcGFyYW1ldGVyVHlwZXMpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldE1ldGhvZCh0YXJnZXRDbGFzcywgdGFyZ2V0TWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUpCi0gICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUsIENsYXNzLi4uIHBhcmFtZXRlclR5cGVzKQotICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSB0YXJnZXRDbGFzczsKLSAgICAgICAgTWV0aG9kIHRhcmdldE1ldGhvZCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAoIU9iamVjdC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0YXJnZXRNZXRob2QgPSBjdXJyZW50Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QodGFyZ2V0TWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50SW50ZXJmYWNlIDogdGFyZ2V0Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRJbnRlcmZhY2U7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudENsYXNzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gY3VycmVudENsYXNzLmdldERlY2xhcmVkTWV0aG9kKHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudENsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0TWV0aG9kOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbigidGhlcmUgaXMgbm8gbWV0aG9kIHdpdGggdGhlIG5hbWUgJyIgKyB0YXJnZXRNZXRob2ROYW1lICsgIiciICsKLSAgICAgICAgICAgICAgICAiIGNsYXNzOiAiICsgdGFyZ2V0Q2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvSW52b2tlTWV0aG9kKHRhcmdldCwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvSW52b2tlTWV0aG9kT2ZDbGFzcyh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kT2ZDbGFzcyh0YXJnZXQsIG1ldGhvZCwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldC5uZXdJbnN0YW5jZSgpLCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kLCBPYmplY3QuLi4gYXJncykKLSAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0Lm5ld0luc3RhbmNlKCksIG1ldGhvZCwgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldCwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgewotICAgICAgICBtZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2UodGFyZ2V0LCBhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKE9iamVjdCBiYXNlT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlDaGFpbikKLSAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHByb3BlcnR5Q2hhaW4sICIuIik7Ci0KLSAgICAgICAgT2JqZWN0IGN1cnJlbnRCYXNlID0gYmFzZU9iamVjdDsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnRQcm9wZXJ0eTsKLSAgICAgICAgTWV0aG9kIGN1cnJlbnRNZXRob2Q7Ci0KLSAgICAgICAgd2hpbGUodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudFByb3BlcnR5ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCi0gICAgICAgICAgICAvL2lnbm9yZSB0aGUgbGFzdCBwcm9wZXJ0eQotICAgICAgICAgICAgaWYoIXRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vbm8gaXMgLSBpdCdzIG9ubHkgcG9zc2libGUgYXQgcHJvcGVydGllcyBub3QgYXQgYmVhbiBsZXZlbAotICAgICAgICAgICAgY3VycmVudE1ldGhvZCA9IHRyeVRvR2V0TWV0aG9kKFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudEJhc2UuZ2V0Q2xhc3MoKSksCi0gICAgICAgICAgICAgICAgImdldCIgKyBjdXJyZW50UHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50UHJvcGVydHkuc3Vic3RyaW5nKDEsIGN1cnJlbnRQcm9wZXJ0eS5sZW5ndGgoKSkpOwotICAgICAgICAgICAgY3VycmVudEJhc2UgPSB0cnlUb0ludm9rZU1ldGhvZChjdXJyZW50QmFzZSwgY3VycmVudE1ldGhvZCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY3VycmVudEJhc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvV2ViWG1sVXRpbHMuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1dlYlhtbFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMDc2OWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvV2ViWG1sVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgV2ViWG1sVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEluaXRQYXJhbWV0ZXIoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEluaXRQYXJhbWV0ZXIoRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCwga2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZSA9IG5hbWU7DQotICAgICAgICBpZihwcmVmaXggIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwYXJhbWV0ZXJOYW1lID0gcHJlZml4ICsgIi4iICsgbmFtZTsNCi0gICAgICAgIH0NCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRJbml0UGFyYW1ldGVyKHBhcmFtZXRlck5hbWUpOw0KLSAgICAgICAgcmV0dXJuICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlLnJlcGxhY2UoIiAiLCAiIikudHJpbSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQwOTJmYi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlIE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlIE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUgTW9kdWxlIHByb3ZpZGVzIGFuIGV4dGVuc2libGUgdmFsaWRhdGlvbiBwbGF0Zm9ybSB0byBpbXBsZW1lbnQgdmFsaWRhdGlvbiBiYXNlZCBvbiBtZXRhLWRhdGEuDQotICAgIEJhc2VkIG9uIHRoaXMgbW9kdWxlIGl0IGlzIHBvc3NpYmxlIHRvIGltcGxlbWVudCB2YWxpZGF0aW9uIG1vZHVsZXMuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLnggYW5kIEpTRiAyLnguIEFsbCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIxZGQwMS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEV4YW1wbGVzIEFzc2VtYmx5PC9uYW1lPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1leGFtcGxlcy1hc3NlbWJseTEyPC9hcnRpZmFjdElkPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8yX3JjL2V4YW1wbGVzL2Fzc2VtYmx5PC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvZXhhbXBsZXMvYXNzZW1ibHk8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8yX3JjL2V4YW1wbGVzL2Fzc2VtYmx5PC91cmw+Ci0gICAgPC9zY20+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5kZXBlbmRlbmN5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LXdhcjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd2FyPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktc3JjPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fd29ybGQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXZhLXNvdXJjZTwvdHlwZT4gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmVhdHVyZS1zZXRfMDE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXZhLXNvdXJjZTwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc3JjPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPiAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBFWEVDVVRFIG12biBwYWNrYWdlIHRvIGdlbmVyYXRlIGFzc2VtYmx5IGZpbGVzIC0tPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9zcmM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmFzc2VtYmx5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4gICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwtZXhhbXBsZXMtJHtwcm9qZWN0LnZlcnNpb259LXNyYzwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfYmluPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hc3NlbWJseTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0JICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+ICAgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWw8L2Rlc2NyaXB0b3I+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsLWV4YW1wbGVzLSR7cHJvamVjdC52ZXJzaW9ufTwvZmluYWxOYW1lPgotCSAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd29yazwvd29ya0RpcmVjdG9yeT4KLQkgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0JICAgIAotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+d2Fnb24tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aWQ+bXlmYWNlcy1uaWdodGx5LWJ1aWxkczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vbWlub3RhdXIuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvYnVpbGRzL215ZmFjZXMvbmlnaHRseTwvdXJsPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9pbnB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICA8L3BsdWdpbnM+Ci0KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZjdiODEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+YmluPC9pZD4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+CQotICA8ZmlsZVNldHM+ICAgIAotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvd2FyPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLndhcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PiAgICAgCi0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTcwY2NjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPnNyYzwvaWQ+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgkKLSAgPGZpbGVTZXRzPiAgICAKLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3NyYzwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLnR4dDwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNWIzYTUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGYzNjNhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9wb20ueG1sIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDA4MGQ3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmVhdHVyZS1zZXRfMDE8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgZmVhdHVyZS1zZXQgMDE8L25hbWU+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5mYWNlbGV0czwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtZmFjZWxldHM8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE0PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmVsLWltcGw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRvbWFoYXdrPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRvbWFoYXdrPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS42PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYxY2Y5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jdXN0b20vdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jdXN0b20vdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDAxZGY3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0jIHRoaXMgbWVzc2FnZSBidW5kbGUgaXMgcGlja2VkIHVwIHZpYSBjb252ZW50aW9uDQotcmVwZWF0ZWRfcGFzc3dvcmRfcmVxdWlyZWQ9cGxlYXNlIHJldHlwZSB0aGUgcGFzc3dvcmQNCi1yZXBlYXRlZF9wYXNzd29yZF9yZXF1aXJlZF9kZXRhaWw9cGxlYXNlIHJldHlwZSB0aGUgcGFzc3dvcmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2RvbWFpbi9QZXJzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI1MTFkZS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRGF0ZUlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXNUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5Ob3RFcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbDsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVGVtcG9yYWxUeXBlOw0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi1wdWJsaWMgY2xhc3MgUGVyc29uDQotew0KLSAgICBATGVuZ3RoKG1pbmltdW0gPSAyKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDIwKQ0KLSAgICBATm90RXF1YWxzKCJsYXN0TmFtZSIpDQotICAgIEBQYXR0ZXJuKCJbQS1aXVthLXpdKyIpDQotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsNCi0NCi0gICAgQFJlcXVpcmVkKHBhcmFtZXRlcnMgPSBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpDQotICAgIEBMZW5ndGgobWluaW11bSA9IDIsIHBhcmFtZXRlcnMgPSBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpDQotICAgIEBDb2x1bW4obGVuZ3RoID0gMjApDQotICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsNCi0NCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcm9sZSA9ICJ1c2VyIjsNCi0NCi0gICAgQERhdGVJcyh0eXBlID0gRGF0ZUlzVHlwZS5iZWZvcmUsIHZhbHVlT2YgPSAiZmluYWxFeGFtIikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlKQ0KLSAgICBAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLkRBVEUpDQotICAgIHByaXZhdGUgRGF0ZSBiaXJ0aGRheTsNCi0NCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlKQ0KLSAgICBAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLkRBVEUpDQotICAgIHByaXZhdGUgRGF0ZSBmaW5hbEV4YW07DQotDQotICAgIEBMZW5ndGgobWluaW11bSA9IDIpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIG5pY2tOYW1lOw0KLQ0KLSAgICBATGVuZ3RoKG1pbmltdW0gPSA2KQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDYwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBlbWFpbDsNCi0NCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlKQ0KLSAgICBwcml2YXRlIGludCBudW1iZXJPZlNpYmxpbmdzOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbGFzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJvbGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcm9sZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRSb2xlKFN0cmluZyByb2xlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnJvbGUgPSByb2xlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldEJpcnRoZGF5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGJpcnRoZGF5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEJpcnRoZGF5KERhdGUgYmlydGhkYXkpDQotICAgIHsNCi0gICAgICAgIHRoaXMuYmlydGhkYXkgPSBiaXJ0aGRheTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXRGaW5hbEV4YW0oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmluYWxFeGFtOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEZpbmFsRXhhbShEYXRlIGZpbmFsRXhhbSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maW5hbEV4YW0gPSBmaW5hbEV4YW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROaWNrTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuaWNrTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROaWNrTmFtZShTdHJpbmcgbmlja05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmlja05hbWUgPSBuaWNrTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVtYWlsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKFN0cmluZyBlbWFpbCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5lbWFpbCA9IGVtYWlsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZTaWJsaW5ncygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBudW1iZXJPZlNpYmxpbmdzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlck9mU2libGluZ3MoaW50IG51bWJlck9mU2libGluZ3MpDQotICAgIHsNCi0gICAgICAgIHRoaXMubnVtYmVyT2ZTaWJsaW5ncyA9IG51bWJlck9mU2libGluZ3M7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI3NDQyMy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5ndWkuYmVhbnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uTm90RXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxvbmdSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5jdXN0b20uZW1haWx2YWxpZGF0b3IuRW1haWxWYWxpZGF0b3I7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvblBhZ2UNCi17DQotDQotICAgIC8vdGhlIG9sZCBwYXNzd29yZCBvZiB0aGUgcGVyc29uIGlzbid0IHVzZWQgd2l0aGluIHRoZSBwYWdlDQotICAgIC8vLT4gdmFsaWRhdGUgd2l0aCB2YWx1ZSBvZiB0aGUgbW9kZWwNCi0gICAgQFNraXBWYWxpZGF0aW9uKCIje3BlcnNvbi5yb2xlIGVxICdhZG1pbid9IikNCi0gICAgQFJlcXVpcmVkDQotICAgIEBFcXVhbHMoInBlcnNvbi5wYXNzd29yZCIpDQotICAgIEBOb3RFcXVhbHMoInBhc3N3b3JkIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgb2xkUGFzc3dvcmQ7DQotDQotICAgIEBFcXVhbHMoInBhc3N3b3JkUmVwZWF0ZWQiKQ0KLSAgICAvL2NvbWJpbmUgZ3VpIHJlbGF0ZWQgYW5ub3RhdGlvbnMgd2l0aCB0aGUgYW5ub2F0aW9ucyBvZiB0aGUgZG9tYWluIG1vZGVsDQotICAgIEBKb2luVmFsaWRhdGlvbih2YWx1ZSA9ICIje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLnBhc3N3b3JkfSIpDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOw0KLQ0KLSAgICBAUmVxdWlyZWQodmFsaWRhdGlvbkVycm9yTXNnS2V5ID0gInJlcGVhdGVkX3Bhc3N3b3JkX3JlcXVpcmVkIiwNCi0gICAgICAgICAgICBwYXJhbWV0ZXJzID0ge0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcywgVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzc30pDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkUmVwZWF0ZWQ7DQotDQotICAgIC8vdXNlICN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ubmlja05hbWV9LCAje3BlcnNvbi5uaWNrTmFtZX0NCi0gICAgLy91c2UgcmVnaXN0cmF0aW9uUGFnZSB0byBkaXNwbGF5IHRoZSBzZWNvbmQgZXJyb3IgbWVzc2FnZSBhdCBvbGQgbmlja25hbWUNCi0gICAgLy9vciBsb2NhbCBwcm9wZXJ0eSBjaGFpbmluZyAodG8gYXZvaWQgdGhlIHVzYWdlIG9mIHRoZSBiZWFuIG5hbWUpIC0gbGlrZToNCi0gICAgQFNraXBWYWxpZGF0aW9uKCIje3BlcnNvbi5yb2xlIGVxICdhZG1pbid9IikNCi0gICAgQE5vdEVxdWFscygicGVyc29uLm5pY2tOYW1lIikNCi0gICAgQEpvaW5WYWxpZGF0aW9uKCJwZXJzb24ubmlja05hbWUiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBuZXdOaWNrTmFtZTsNCi0NCi0gICAgcHJpdmF0ZSBQZXJzb24gcGVyc29uOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGZpbmlzaCgpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldFBhc3N3b3JkKHRoaXMucGFzc3dvcmQpOw0KLSAgICAgICAgcmV0dXJuICJob21lIjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHVwZGF0ZU5pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0Tmlja05hbWUodGhpcy5uZXdOaWNrTmFtZSk7DQotICAgICAgICByZXR1cm4gImhvbWUiOw0KLSAgICB9DQotDQotICAgIC8vanVzdCBhIHF1aWNrIGlsbHVzdHJhdGlvbiBvZiBza2lwVmFsaWRhdGlvbg0KLSAgICBwdWJsaWMgU3RyaW5nIHN3aXRjaE1vZGUoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VycmVudFJvbGUgPSB0aGlzLnBlcnNvbi5nZXRSb2xlKCk7DQotDQotICAgICAgICBpZihjdXJyZW50Um9sZS5lcXVhbHMoImFkbWluIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5wZXJzb24uc2V0Um9sZSgidXNlciIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMucGVyc29uLnNldFJvbGUoImFkbWluIik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gIiI7DQotICAgIH0NCi0NCi0gICAgQEpvaW5WYWxpZGF0aW9uKCJvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5kb21haW4uUGVyc29uOmVtYWlsIikNCi0gICAgQFZhbGlkYXRvcihFbWFpbFZhbGlkYXRvci5jbGFzcykNCi0gICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbi5nZXRFbWFpbCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKFN0cmluZyBlbWFpbCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0RW1haWwoZW1haWwpOw0KLSAgICB9DQotDQotICAgIEBKb2luVmFsaWRhdGlvbigiI3twZXJzb24ubnVtYmVyT2ZTaWJsaW5nc30iKQ0KLSAgICBATG9uZ1JhbmdlKG1heGltdW0gPSAyMCkNCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNpYmxpbmdzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uLmdldE51bWJlck9mU2libGluZ3MoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXJPZlNpYmxpbmdzKGludCBudW1iZXJPZlNpYmxpbmdzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXROdW1iZXJPZlNpYmxpbmdzKG51bWJlck9mU2libGluZ3MpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRPbGRQYXNzd29yZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBvbGRQYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRPbGRQYXNzd29yZChTdHJpbmcgb2xkUGFzc3dvcmQpDQotICAgIHsNCi0gICAgICAgIHRoaXMub2xkUGFzc3dvcmQgPSBvbGRQYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmRSZXBlYXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZFJlcGVhdGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkUmVwZWF0ZWQoU3RyaW5nIHBhc3N3b3JkUmVwZWF0ZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmRSZXBlYXRlZCA9IHBhc3N3b3JkUmVwZWF0ZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBlcnNvbiBnZXRQZXJzb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGVyc29uOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNvbihQZXJzb24gcGVyc29uKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbiA9IHBlcnNvbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5ld05pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ld05pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5ld05pY2tOYW1lKFN0cmluZyBuZXdOaWNrTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uZXdOaWNrTmFtZSA9IG5ld05pY2tOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OWRmNGYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQwotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMC8vRU4iCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlcy1jb25maWc+Ci0gICAgPGFwcGxpY2F0aW9uPgotICAgICAgICA8IS0tIHRyaW5pZGFkIC0tPgotICAgICAgICA8ZGVmYXVsdC1yZW5kZXIta2l0LWlkPgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvcmUKLSAgICAgICAgPC9kZWZhdWx0LXJlbmRlci1raXQtaWQ+Ci0KLSAgICA8L2FwcGxpY2F0aW9uPgotCi0gICAgPG1hbmFnZWQtYmVhbj4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1uYW1lPnJlZ2lzdHJhdGlvblBhZ2U8L21hbmFnZWQtYmVhbi1uYW1lPgotICAgICAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmd1aS5iZWFucy5SZWdpc3RyYXRpb25QYWdlPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPgotCi0gICAgICAgIDxtYW5hZ2VkLXByb3BlcnR5PgotICAgICAgICAgICAgPHByb3BlcnR5LW5hbWU+cGVyc29uPC9wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPHZhbHVlPiN7cGVyc29ufTwvdmFsdWU+Ci0gICAgICAgIDwvbWFuYWdlZC1wcm9wZXJ0eT4KLSAgICA8L21hbmFnZWQtYmVhbj4KLQotICAgIDxtYW5hZ2VkLWJlYW4+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tbmFtZT5wZXJzb248L21hbmFnZWQtYmVhbi1uYW1lPgotICAgICAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb248L21hbmFnZWQtYmVhbi1jbGFzcz4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5zZXNzaW9uPC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0gICAgPC9tYW5hZ2VkLWJlYW4+Ci0KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8ZnJvbS12aWV3LWlkPi9wYWdlcy9ob21lLnhodG1sPC9mcm9tLXZpZXctaWQ+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmFkZFVzZXI8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5jaGFuZ2VOaWNrTmFtZTwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmNoYW5nZVBhc3N3b3JkPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICA8L25hdmlnYXRpb24tcnVsZT4KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8ZnJvbS12aWV3LWlkPio8L2Zyb20tdmlldy1pZD4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+aG9tZTwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL2hvbWUueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgIDwvbmF2aWdhdGlvbi1ydWxlPgotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9tYWluLnRhZ2xpYi54bWwgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzOTM2Ni4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIGZhY2VsZXQtdGFnbGliIFBVQkxJQwotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEZhY2VsZXQgVGFnbGliIDEuMC8vRU4iCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9mYWNlbGV0LXRhZ2xpYl8xXzAuZHRkIj4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZmFjZWxldC10YWdsaWI+Ci0gICAgPG5hbWVzcGFjZT5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dHZhbC9kZW1vL2NvbXBvbmVudHM8L25hbWVzcGFjZT4KLQotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT51c2VyRm9ybTwvdGFnLW5hbWU+Ci0gICAgICAgIDxzb3VyY2U+Ci0gICAgICAgICAgICAuLi9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbAotICAgICAgICA8L3NvdXJjZT4KLSAgICA8L3RhZz4KLQotPC9mYWNlbGV0LXRhZ2xpYj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YzAxYWEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCi0gICAgICAgICB2ZXJzaW9uPSIyLjQiPgotCi0gICAgPGRlc2NyaXB0aW9uPk15UHJvamVjdCB3ZWIueG1sPC9kZXNjcmlwdGlvbj4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5ERUZBVUxUX1NVRkZJWDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi54aHRtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmZhY2VsZXRzLkxJQlJBUklFUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi9XRUItSU5GL21haW4udGFnbGliLnhtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5FTkFCTEVfTElHSFRXRUlHSFRfRElBTE9HUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRElTQUJMRV9DT05URU5UX0NPTVBSRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5BTFRFUk5BVEVfVklFV19IQU5ETEVSPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y29tLnN1bi5mYWNlbGV0cy5GYWNlbGV0Vmlld0hhbmRsZXI8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuVVNFX0FQUExJQ0FUSU9OX1ZJRVdfQ0FDSEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5DSEFOR0VfUEVSU0lTVEVOQ0U8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5zZXNzaW9uPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBTZWUgSlNGIFNwZWNpZmljYXRpb24gMi41LjMKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNsaWVudDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5OVU1CRVJfT0ZfVklFV1NfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPjIwPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzdGF0ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbSBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uCi0gICAgICAgICAgICBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KSBhbmQgaWYKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgY29tcHJlc3NlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUKLSAgICAgICAgICAgIHJlbmRlcmVkIEhUTUwgb3V0cHV0LgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgbm90IGFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFMTE9XX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5ERVRFQ1RfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCByZW5kZXJlZCBIVE1MIGNvZGUgd2lsbCBiZSBmb3JtYXR0ZWQsIHNvIHRoYXQgaXQgaXMgImh1bWFuIHJlYWRhYmxlIi4KLSAgICAgICAgICAgIGkuZS4gYWRkaXRpb25hbCBsaW5lIHNlcGFyYXRvcnMgYW5kIHdoaXRlc3BhY2Ugd2lsbCBiZSB3cml0dGVuLCB0aGF0IGRvIG5vdAotICAgICAgICAgICAgaW5mbHVlbmNlIHRoZSBIVE1MIGNvZGUuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlBSRVRUWV9IVE1MPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlCi0gICAgICAgICAgICBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuIENvbnZlbmllbnQgZmVhdHVyZSBpZiB5b3UgaGF2ZSBwYWdlcwotICAgICAgICAgICAgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGJyb3dzZXIgcGFnZSB0byBhbHdheXMganVtcCB0byB0aGUgdG9wCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuCi0gICAgICAgICAgICBEZWZhdWx0OiAiZmFsc2UiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BVVRPX1NDUk9MTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQotICAgICAgICAgICAgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucwotICAgICAgICAgICAgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IgZGlmZmVuZW50IGVuY3J5cHRpb24gc3RyZW5ndGhzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VDUkVUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+TnpZMU5ETXlNVEE9PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmFsaWRhdGUgbWFuYWdlZCBiZWFucywgbmF2aWdhdGlvbiBydWxlcyBhbmQgZW5zdXJlIHRoYXQgZm9ybXMgYXJlIG5vdCBuZXN0ZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDwhLS0gTGlzdGVuZXIsIHRvIGFsbG93IEpldHR5IHNlcnZpbmcgTXlGYWNlcyBhcHBzIC0tPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy53ZWJhcHAuU3RhcnR1cFNlcnZsZXRDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLndlYmFwcC5SZXNvdXJjZVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPGZpbHRlcj4KLSAgICAgICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlRyaW5pZGFkRmlsdGVyPC9maWx0ZXItY2xhc3M+Ci0gICAgPC9maWx0ZXI+Ci0KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT50cmluaWRhZDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZ3MgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4vZmFjZXMvKjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPnJlc291cmNlczwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+L2FkZi8qPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYmM5MWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiCi0gICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIgotICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIKLSAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIgotICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPgotCi08dWk6Y29tcG9zaXRpb24+Ci0gICAgPHRyOnBhbmVsRm9ybUxheW91dD4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJuaWNrIG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uWyAnbmlja05hbWUnIF19Ii8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9ImUtbWFpbCIgdmFsdWU9IiN7YmVhbi5lbWFpbH0iLz4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJmaXJzdCBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5maXJzdE5hbWV9Ii8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Imxhc3QgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb24ubGFzdE5hbWV9Ii8+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibGFzdCBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5sYXN0TmFtZX0iIHJlcXVpcmVkTWVzc2FnZURldGFpbD0iezB9IGlzIHJlcXVpcmVkIi8+Ci0gICAgICAgIC0tPgotICAgICAgICA8dHI6aW5wdXREYXRlIGxhYmVsPSJiaXJ0aGRheSIgdmFsdWU9IiN7YmVhbi5wZXJzb24uYmlydGhkYXl9Ij4KLSAgICAgICAgICAgIDx0cjpjb252ZXJ0RGF0ZVRpbWUgdHlwZT0iZGF0ZSIgcGF0dGVybj0iZGQuTU0ueXl5eSIvPgotICAgICAgICA8L3RyOmlucHV0RGF0ZT4KLSAgICAgICAgPHRyOmlucHV0RGF0ZSBsYWJlbD0iZmluYWwgZXhhbSIgdmFsdWU9IiN7YmVhbi5wZXJzb24uZmluYWxFeGFtfSI+Ci0gICAgICAgICAgICA8dHI6Y29udmVydERhdGVUaW1lIHR5cGU9ImRhdGUiIHBhdHRlcm49ImRkLk1NLnl5eXkiLz4KLSAgICAgICAgPC90cjppbnB1dERhdGU+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibnVtYmVyIG9mIHNpYmxpbmdzIiB2YWx1ZT0iI3tiZWFuLm51bWJlck9mU2libGluZ3N9Ii8+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0icGFzc3dvcmQiIHZhbHVlPSIje2JlYW4ucGFzc3dvcmR9IiBzZWNyZXQ9InRydWUiLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0icmUtZW50ZXIgcGFzc3dvcmQiIHZhbHVlPSIje2JlYW4ucGFzc3dvcmRSZXBlYXRlZH0iIHNlY3JldD0idHJ1ZSIvPgotCi0gICAgPC90cjpwYW5lbEZvcm1MYXlvdXQ+Ci08L3VpOmNvbXBvc2l0aW9uPgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1Y2QxNDguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLSAgICAgICAgDQotPGh0bWw+DQotDQotPGhlYWQ+DQotICAgIDxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjA7IFVSTD1mYWNlcy9wYWdlcy9ob21lLnhodG1sIj4NCi08L2hlYWQ+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBjMWVhOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08dHI6ZG9jdW1lbnQNCi0gICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCINCi0gICAgICAgIHhtbG5zOmM9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanN0bC9jb3JlIj4NCi0gICAgPGY6ZmFjZXQgbmFtZT0ibWV0YUNvbnRhaW5lciI+DQotICAgICAgICA8dGl0bGU+c2V2LWVuIGZlYXR1cmUtc2V0IGRlbW8gMDE8L3RpdGxlPg0KLSAgICA8L2Y6ZmFjZXQ+DQotDQotICAgIDx0cmg6Ym9keT4NCi0NCi0gICAgICAgIDwhLS0gb3JpZ2luYWwgLS0+DQotICAgICAgICA8ZGl2IGlkPSJ3cmFwIj4NCi0NCi0gICAgICAgICAgICA8dHI6Zm9ybSBpZD0iZm9ybSIgZGVmYXVsdENvbW1hbmQ9ImRlZmF1bHRCdXR0b24iPg0KLSAgICAgICAgICAgICAgICA8ZGl2IGlkPSJtYWluIj4NCi0gICAgICAgICAgICAgICAgICAgIDx1aTppbnNlcnQgbmFtZT0iY29udGVudCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idW5kZXJfY29uc3RydWN0aW9uIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPiFzaXRlIHVuZGVyIGNvbnN0cnVjdGlvbiE8L2gyPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgY29udGVudCBvZiB0aGlzIHNpdGUgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgbW9tZW50LjwvcD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgICAgICAgICAgIDwvdWk6aW5zZXJ0Pg0KLSAgICAgICAgICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICAgICAgICA8L3RyOmZvcm0+DQotICAgICAgICAgICAgPHRyOm1lc3NhZ2VzIGdsb2JhbE9ubHk9InRydWUiLz4NCi0NCi0gICAgICAgIDwvZGl2Pg0KLSAgICA8L3RyaDpib2R5Pg0KLQ0KLQ0KLTwvdHI6ZG9jdW1lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODkzZmFlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotDQotICAgICAgICA8dHI6cGFuZWxGb3JtTGF5b3V0Pg0KLQ0KLSAgICAgICAgICAgIDx1aTpyZW1vdmU+DQotICAgICAgICAgICAgICAgIGp1c3QgZm9yIHRoZSBkZW1vIHdlIGFyZSB1c2luZyB0d28gaW5wdXQgY29tcG9uZW50cw0KLSAgICAgICAgICAgIDwvdWk6cmVtb3ZlPg0KLSAgICAgICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im9sZCBuaWNrIG5hbWUiIHJlYWRPbmx5PSJ0cnVlIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5uaWNrTmFtZX0iLz4NCi0NCi0gICAgICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJuaWNrIG5hbWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UubmV3Tmlja05hbWV9Ii8+DQotDQotICAgICAgICA8L3RyOnBhbmVsRm9ybUxheW91dD4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9InNhdmUiIGFjdGlvbj0iI3tyZWdpc3RyYXRpb25QYWdlLnVwZGF0ZU5pY2tOYW1lfSIvPg0KLQ0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTA5NzVhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9wYXNzd29yZC54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotDQotICAgICAgICA8dGFibGU+DQotICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm91dHB1dExhYmVsIHZhbHVlPSJvbGQgcGFzc3dvcmQiIGZvcj0ib2xkX3Bhc3N3b3JkIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjppbnB1dFRleHQgaWQ9Im9sZF9wYXNzd29yZCIgc2ltcGxlPSJ0cnVlIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLm9sZFBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjptZXNzYWdlIGZvcj0ib2xkX3Bhc3N3b3JkIi8+PC90ZD4NCi0gICAgICAgICAgICA8L3RyPg0KLQ0KLSAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjpvdXRwdXRMYWJlbCB2YWx1ZT0ibmV3IHBhc3N3b3JkIiBmb3I9Im5ld19wYXNzd29yZCIvPjwvdGQ+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6aW5wdXRUZXh0IGlkPSJuZXdfcGFzc3dvcmQiIHNpbXBsZT0idHJ1ZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5wYXNzd29yZH0iIHNlY3JldD0idHJ1ZSIvPjwvdGQ+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6bWVzc2FnZSBmb3I9Im5ld19wYXNzd29yZCIvPjwvdGQ+DQotICAgICAgICAgICAgPC90cj4NCi0NCi0gICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6b3V0cHV0TGFiZWwgdmFsdWU9InJlLWVudGVyIHBhc3N3b3JkIiBmb3I9InJlZW50ZXJlZCIvPjwvdGQ+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6aW5wdXRUZXh0IGlkPSJyZWVudGVyZWQiIHNpbXBsZT0idHJ1ZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5wYXNzd29yZFJlcGVhdGVkfSIgc2VjcmV0PSJ0cnVlIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjptZXNzYWdlIGZvcj0icmVlbnRlcmVkIi8+PC90ZD4NCi0gICAgICAgICAgICA8L3RyPg0KLQ0KLSAgICAgICAgPC90YWJsZT4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9InNhdmUiIGFjdGlvbj0iI3tyZWdpc3RyYXRpb25QYWdlLmZpbmlzaH0iLz4NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTdlYmQ5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0iYWRkIHVzZXIiIGFjdGlvbj0iYWRkVXNlciIvPjxici8+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJjaGFuZ2UgbmljayBuYW1lIiBhY3Rpb249ImNoYW5nZU5pY2tOYW1lIi8+PGJyLz4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9ImNoYW5nZSBwYXNzd29yZCIgYWN0aW9uPSJjaGFuZ2VQYXNzd29yZCIvPjxici8+DQotICAgICAgICA8dHI6Y29tbWFuZExpbmsgdGV4dD0ibW9kZTogI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5yb2xlfSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0iI3tyZWdpc3RyYXRpb25QYWdlLnN3aXRjaE1vZGV9IiBpbW1lZGlhdGU9InRydWUiLz4NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmNmIwNi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOmM9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0dmFsL2RlbW8vY29tcG9uZW50cyINCi0gICAgICAgID4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDxjOnVzZXJGb3JtIGJlYW49IiN7cmVnaXN0cmF0aW9uUGFnZX0iLz4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9InNhdmUiIGFjdGlvbj0iI3tyZWdpc3RyYXRpb25QYWdlLmZpbmlzaH0iLz4NCi0NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvcG9tLnhtbCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0MjkwZi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWZlYXR1cmUtc2V0XzAyPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIGZlYXR1cmUtc2V0IDAyPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5oaWJlcm5hdGU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGliZXJuYXRlLXZhbGlkYXRvcjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj40LjAuMC5HQTwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS40LjI8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjQuMjwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uZmFjZWxldHM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWZhY2VsZXRzPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xNDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5lbC1pbXBsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYxY2Y5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2NvbnN0cmFpbnRzL0JpcnRoZGF5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vY29uc3RyYWludHMvQmlydGhkYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ViNGU3Mi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vY29uc3RyYWludHMvQmlydGhkYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmNvbnN0cmFpbnRzOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuUGFzdDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5BTk5PVEFUSU9OX1RZUEU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi0NCi1AUGFzdA0KLUBOb3ROdWxsDQotDQotQENvbnN0cmFpbnQodmFsaWRhdGVkQnkgPSB7fSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgQU5OT1RBVElPTl9UWVBFfSkNCi1wdWJsaWMgQGludGVyZmFjZSBCaXJ0aGRheQ0KLXsNCi0gICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJubyB2YWxpZCBiaXJ0aGRheSI7DQotDQotICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9jb25zdHJhaW50cy9OYW1lLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vY29uc3RyYWludHMvTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTIwMGY5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9jb25zdHJhaW50cy9OYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5jb25zdHJhaW50czsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk92ZXJyaWRlc0F0dHJpYnV0ZTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkFOTk9UQVRJT05fVFlQRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLQ0KLUBOb3ROdWxsDQotQFNpemUobWluID0gMikNCi0NCi1AQ29uc3RyYWludCh2YWxpZGF0ZWRCeSA9IHt9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBBTk5PVEFUSU9OX1RZUEV9KQ0KLXB1YmxpYyBAaW50ZXJmYWNlIE5hbWUNCi17DQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAiaW52YWxpZCBuYW1lIjsgLy9ub3QgdXNlZA0KLQ0KLSAgICBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQge307DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHt9Ow0KLQ0KLSAgICBAT3ZlcnJpZGVzQXR0cmlidXRlKGNvbnN0cmFpbnQgPSBTaXplLmNsYXNzLCBuYW1lID0gIm1heCIpDQotICAgIGludCBtYXhMZW5ndGgoKSBkZWZhdWx0IDIwOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2RvbWFpbi9QZXJzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkwNzNjZS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uY29uc3RyYWludHMuTmFtZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uY29uc3RyYWludHMuQmlydGhkYXk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlBhc3Q7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLXB1YmxpYyBjbGFzcyBQZXJzb24NCi17DQotICAgIEBOYW1lKG1heExlbmd0aCA9IDMwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7DQotDQotICAgIEBOYW1lKG1heExlbmd0aCA9IDMwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsNCi0NCi0gICAgQFNpemUobWluID0gMiwgbWF4ID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOw0KLQ0KLSAgICBAQmlydGhkYXkNCi0gICAgcHJpdmF0ZSBEYXRlIGJpcnRoZGF5Ow0KLQ0KLSAgICBAUGFzdA0KLSAgICBwcml2YXRlIERhdGUgZmluYWxFeGFtOw0KLQ0KLSAgICBATm90TnVsbA0KLSAgICBwcml2YXRlIFN0cmluZyBuaWNrTmFtZTsNCi0NCi0gICAgQFNpemUobWluID0gNiwgbWF4ID0gNjApDQotICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOw0KLQ0KLSAgICBATm90TnVsbA0KLSAgICBwcml2YXRlIGludCBudW1iZXJPZlNpYmxpbmdzOw0KLQ0KLSAgICBAU2l6ZShtaW4gPSAyLCBtYXggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcm9sZSA9ICJ1c2VyIjsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxhc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRSb2xlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHJvbGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Um9sZShTdHJpbmcgcm9sZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5yb2xlID0gcm9sZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXRCaXJ0aGRheSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBiaXJ0aGRheTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRCaXJ0aGRheShEYXRlIGJpcnRoZGF5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmJpcnRoZGF5ID0gYmlydGhkYXk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RmluYWxFeGFtKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZpbmFsRXhhbTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaW5hbEV4YW0oRGF0ZSBmaW5hbEV4YW0pDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmluYWxFeGFtID0gZmluYWxFeGFtOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tmlja05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmlja05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Tmlja05hbWUoU3RyaW5nIG5pY2tOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm5pY2tOYW1lID0gbmlja05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBlbWFpbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbWFpbChTdHJpbmcgZW1haWwpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZW1haWwgPSBlbWFpbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGdldE51bWJlck9mU2libGluZ3MoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbnVtYmVyT2ZTaWJsaW5nczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXJPZlNpYmxpbmdzKGludCBudW1iZXJPZlNpYmxpbmdzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm51bWJlck9mU2libGluZ3MgPSBudW1iZXJPZlNpYmxpbmdzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MjBmOTQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5ndWkuYmVhbnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uUGFnZQ0KLXsNCi0gICAgQE5vdE51bGwocGF5bG9hZCA9IERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7DQotDQotICAgIEBOb3ROdWxsKHBheWxvYWQgPSBWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZFJlcGVhdGVkOw0KLQ0KLSAgICBwcml2YXRlIFBlcnNvbiBwZXJzb247DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZmluaXNoKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0UGFzc3dvcmQodGhpcy5wYXNzd29yZCk7DQotICAgICAgICByZXR1cm4gImhvbWUiOw0KLSAgICB9DQotDQotICAgIEBTaXplKG1pbiA9IDYsIG1heCA9IDYwKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uLmdldEVtYWlsKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXRFbWFpbChlbWFpbCk7DQotICAgIH0NCi0NCi0gICAgQE5vdE51bGwNCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNpYmxpbmdzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uLmdldE51bWJlck9mU2libGluZ3MoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXJPZlNpYmxpbmdzKGludCBudW1iZXJPZlNpYmxpbmdzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXROdW1iZXJPZlNpYmxpbmdzKG51bWJlck9mU2libGluZ3MpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkUmVwZWF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmRSZXBlYXRlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZFJlcGVhdGVkKFN0cmluZyBwYXNzd29yZFJlcGVhdGVkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkUmVwZWF0ZWQgPSBwYXNzd29yZFJlcGVhdGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQZXJzb24gZ2V0UGVyc29uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBlcnNvbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzb24oUGVyc29uIHBlcnNvbikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24gPSBwZXJzb247DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0IGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNhMjdiYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiIKLSAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzEuZHRkIiA+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGZhY2VzLWNvbmZpZz4KLSAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgIDwhLS0gdHJpbmlkYWQgLS0+Ci0gICAgICAgIDxkZWZhdWx0LXJlbmRlci1raXQtaWQ+Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29yZQotICAgICAgICA8L2RlZmF1bHQtcmVuZGVyLWtpdC1pZD4KLQotICAgIDwvYXBwbGljYXRpb24+Ci0KLSAgICA8bWFuYWdlZC1iZWFuPgotICAgICAgICA8bWFuYWdlZC1iZWFuLW5hbWU+cmVnaXN0cmF0aW9uUGFnZTwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZ3VpLmJlYW5zLlJlZ2lzdHJhdGlvblBhZ2U8L21hbmFnZWQtYmVhbi1jbGFzcz4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0KLSAgICAgICAgPG1hbmFnZWQtcHJvcGVydHk+Ci0gICAgICAgICAgICA8cHJvcGVydHktbmFtZT5wZXJzb248L3Byb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8dmFsdWU+I3twZXJzb259PC92YWx1ZT4KLSAgICAgICAgPC9tYW5hZ2VkLXByb3BlcnR5PgotICAgIDwvbWFuYWdlZC1iZWFuPgotCi0gICAgPG1hbmFnZWQtYmVhbj4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1uYW1lPnBlcnNvbjwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluLlBlcnNvbjwvbWFuYWdlZC1iZWFuLWNsYXNzPgotICAgICAgICA8bWFuYWdlZC1iZWFuLXNjb3BlPnNlc3Npb248L21hbmFnZWQtYmVhbi1zY29wZT4KLSAgICA8L21hbmFnZWQtYmVhbj4KLQotICAgIDxuYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgICAgIDxmcm9tLXZpZXctaWQ+L3BhZ2VzL2hvbWUueGh0bWw8L2Zyb20tdmlldy1pZD4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+YWRkVXNlcjwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgPG5hdmlnYXRpb24tcnVsZT4KLSAgICAgICAgPGZyb20tdmlldy1pZD4qPC9mcm9tLXZpZXctaWQ+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmhvbWU8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9ob21lLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICA8L25hdmlnYXRpb24tcnVsZT4KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9tYWluLnRhZ2xpYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMzkzNjYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9tYWluLnRhZ2xpYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBmYWNlbGV0LXRhZ2xpYiBQVUJMSUMKLSAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBGYWNlbGV0IFRhZ2xpYiAxLjAvL0VOIgotICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZmFjZWxldC10YWdsaWJfMV8wLmR0ZCI+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGZhY2VsZXQtdGFnbGliPgotICAgIDxuYW1lc3BhY2U+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHR2YWwvZGVtby9jb21wb25lbnRzPC9uYW1lc3BhY2U+Ci0KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+dXNlckZvcm08L3RhZy1uYW1lPgotICAgICAgICA8c291cmNlPgotICAgICAgICAgICAgLi4vY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKLSAgICAgICAgPC9zb3VyY2U+Ci0gICAgPC90YWc+Ci0KLTwvZmFjZWxldC10YWdsaWI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWMwMWFhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgotICAgICAgICAgdmVyc2lvbj0iMi40Ij4KLQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuREVGQVVMVF9TVUZGSVg8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4ueGh0bWw8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5mYWNlbGV0cy5MSUJSQVJJRVM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9tYWluLnRhZ2xpYi54bWw8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRU5BQkxFX0xJR0hUV0VJR0hUX0RJQUxPR1M8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkRJU0FCTEVfQ09OVEVOVF9DT01QUkVTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQUxURVJOQVRFX1ZJRVdfSEFORExFUjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNvbS5zdW4uZmFjZWxldHMuRmFjZWxldFZpZXdIYW5kbGVyPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLlVTRV9BUFBMSUNBVElPTl9WSUVXX0NBQ0hFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQ0hBTkdFX1BFUlNJU1RFTkNFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+c2Vzc2lvbjwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5TdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jbGllbnQ8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgRGVmaW5lcyB0aGUgYW1vdW50IChkZWZhdWx0ID0gMjApIG9mIHRoZSBsYXRlc3Qgdmlld3MgYXJlIHN0b3JlZCBpbiBzZXNzaW9uLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuTlVNQkVSX09GX1ZJRVdTX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc3RhdGUgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0gYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLgotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkgYW5kIGlmCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04gaXMgdHJ1ZSAoPSBkZWZhdWx0KQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4gSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DT01QUkVTU19TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhpcyBwYXJhbWV0ZXIgdGVsbHMgTXlGYWNlcyBpZiBqYXZhc2NyaXB0IGNvZGUgc2hvdWxkIGJlIGFsbG93ZWQgaW4gdGhlCi0gICAgICAgICAgICByZW5kZXJlZCBIVE1MIG91dHB1dC4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgYWxsb3dlZCwgY29tbWFuZF9saW5rIGFuY2hvcnMgd2lsbCBoYXZlIGphdmFzY3JpcHQgY29kZQotICAgICAgICAgICAgdGhhdCBzdWJtaXRzIHRoZSBjb3JyZXNwb25kaW5nIGZvcm0uCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIG5vdCBhbGxvd2VkLCB0aGUgc3RhdGUgc2F2aW5nIGluZm8gYW5kIG5lc3RlZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICB3aWxsIGJlIGFkZGVkIGFzIHVybCBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BTExPV19KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuREVURUNUX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgcmVuZGVyZWQgSFRNTCBjb2RlIHdpbGwgYmUgZm9ybWF0dGVkLCBzbyB0aGF0IGl0IGlzICJodW1hbiByZWFkYWJsZSIuCi0gICAgICAgICAgICBpLmUuIGFkZGl0aW9uYWwgbGluZSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIHdpbGwgYmUgd3JpdHRlbiwgdGhhdCBkbyBub3QKLSAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgSFRNTCBjb2RlLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIGEgamF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRoYXQgaXMgYWJsZSB0byByZXN0b3JlIHRoZQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMKLSAgICAgICAgICAgIHdpdGggbG9uZyBsaXN0cyBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcAotICAgICAgICAgICAgaWYgeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZSBwYWdlLgotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQVVUT19TQ1JPTEw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlVzZWQgZm9yIGVuY3J5cHRpbmcgdmlldyBzdGF0ZS4gT25seSByZWxldmFudCBmb3IgY2xpZW50IHNpZGUKLSAgICAgICAgICAgIHN0YXRlIHNhdmluZy4gU2VlIE15RmFjZXMgd2lraS93ZWIgc2l0ZSBkb2N1bWVudGF0aW9uIGZvciBpbnN0cnVjdGlvbnMKLSAgICAgICAgICAgIG9uIGhvdyB0byBjb25maWd1cmUgYW4gYXBwbGljYXRpb24gZm9yIGRpZmZlbmVudCBlbmNyeXB0aW9uIHN0cmVuZ3Rocy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFQ1JFVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPk56WTFORE15TVRBPTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZhbGlkYXRlIG1hbmFnZWQgYmVhbnMsIG5hdmlnYXRpb24gcnVsZXMgYW5kIGVuc3VyZSB0aGF0IGZvcm1zIGFyZSBub3QgbmVzdGVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuVkFMSURBVEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8IS0tIExpc3RlbmVyLCB0byBhbGxvdyBKZXR0eSBzZXJ2aW5nIE15RmFjZXMgYXBwcyAtLT4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMud2ViYXBwLlN0YXJ0dXBTZXJ2bGV0Q29udGV4dExpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IC0tPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+cmVzb3VyY2VzPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC53ZWJhcHAuUmVzb3VyY2VTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgIDwvc2VydmxldD4KLQotICAgIDxmaWx0ZXI+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT50cmluaWRhZDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLndlYmFwcC5UcmluaWRhZEZpbHRlcjwvZmlsdGVyLWNsYXNzPgotICAgIDwvZmlsdGVyPgotCi0gICAgPGZpbHRlci1tYXBwaW5nPgotICAgICAgICA8ZmlsdGVyLW5hbWU+dHJpbmlkYWQ8L2ZpbHRlci1uYW1lPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICA8L2ZpbHRlci1tYXBwaW5nPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmdzIC0tPgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+L2ZhY2VzLyo8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9hZGYvKjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODRkNjQ4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIgotICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIKLSAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiCi0gICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCIKLSAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4KLQotPHVpOmNvbXBvc2l0aW9uPgotICAgIDx0cjpwYW5lbEZvcm1MYXlvdXQ+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibmljayBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvblsgJ25pY2tOYW1lJyBdfSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJlLW1haWwiIHZhbHVlPSIje2JlYW4uZW1haWx9Ii8+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0iZmlyc3QgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb24uZmlyc3ROYW1lfSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJsYXN0IG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uLmxhc3ROYW1lfSIvPgotICAgICAgICA8dHI6aW5wdXREYXRlIGxhYmVsPSJiaXJ0aGRheSIgdmFsdWU9IiN7YmVhbi5wZXJzb24uYmlydGhkYXl9Ij4KLSAgICAgICAgICAgIDx0cjpjb252ZXJ0RGF0ZVRpbWUgdHlwZT0iZGF0ZSIgcGF0dGVybj0iZGQuTU0ueXl5eSIvPgotICAgICAgICA8L3RyOmlucHV0RGF0ZT4KLSAgICAgICAgPHRyOmlucHV0RGF0ZSBsYWJlbD0iZmluYWwgZXhhbSIgdmFsdWU9IiN7YmVhbi5wZXJzb24uZmluYWxFeGFtfSI+Ci0gICAgICAgICAgICA8dHI6Y29udmVydERhdGVUaW1lIHR5cGU9ImRhdGUiIHBhdHRlcm49ImRkLk1NLnl5eXkiLz4KLSAgICAgICAgPC90cjppbnB1dERhdGU+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibnVtYmVyIG9mIHNpYmxpbmdzIiB2YWx1ZT0iI3tiZWFuLm51bWJlck9mU2libGluZ3N9Ii8+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0icGFzc3dvcmQiIHZhbHVlPSIje2JlYW4ucGFzc3dvcmR9IiBzZWNyZXQ9InRydWUiLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0icmUtZW50ZXIgcGFzc3dvcmQiIHZhbHVlPSIje2JlYW4ucGFzc3dvcmRSZXBlYXRlZH0iIHNlY3JldD0idHJ1ZSIvPgotCi0gICAgPC90cjpwYW5lbEZvcm1MYXlvdXQ+Ci08L3VpOmNvbXBvc2l0aW9uPgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1Y2QxNDguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLSAgICAgICAgDQotPGh0bWw+DQotDQotPGhlYWQ+DQotICAgIDxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjA7IFVSTD1mYWNlcy9wYWdlcy9ob21lLnhodG1sIj4NCi08L2hlYWQ+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBjMWVhOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08dHI6ZG9jdW1lbnQNCi0gICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCINCi0gICAgICAgIHhtbG5zOmM9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanN0bC9jb3JlIj4NCi0gICAgPGY6ZmFjZXQgbmFtZT0ibWV0YUNvbnRhaW5lciI+DQotICAgICAgICA8dGl0bGU+c2V2LWVuIGZlYXR1cmUtc2V0IGRlbW8gMDE8L3RpdGxlPg0KLSAgICA8L2Y6ZmFjZXQ+DQotDQotICAgIDx0cmg6Ym9keT4NCi0NCi0gICAgICAgIDwhLS0gb3JpZ2luYWwgLS0+DQotICAgICAgICA8ZGl2IGlkPSJ3cmFwIj4NCi0NCi0gICAgICAgICAgICA8dHI6Zm9ybSBpZD0iZm9ybSIgZGVmYXVsdENvbW1hbmQ9ImRlZmF1bHRCdXR0b24iPg0KLSAgICAgICAgICAgICAgICA8ZGl2IGlkPSJtYWluIj4NCi0gICAgICAgICAgICAgICAgICAgIDx1aTppbnNlcnQgbmFtZT0iY29udGVudCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idW5kZXJfY29uc3RydWN0aW9uIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPiFzaXRlIHVuZGVyIGNvbnN0cnVjdGlvbiE8L2gyPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgY29udGVudCBvZiB0aGlzIHNpdGUgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgbW9tZW50LjwvcD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgICAgICAgICAgIDwvdWk6aW5zZXJ0Pg0KLSAgICAgICAgICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICAgICAgICA8L3RyOmZvcm0+DQotICAgICAgICAgICAgPHRyOm1lc3NhZ2VzIGdsb2JhbE9ubHk9InRydWUiLz4NCi0NCi0gICAgICAgIDwvZGl2Pg0KLSAgICA8L3RyaDpib2R5Pg0KLQ0KLQ0KLTwvdHI6ZG9jdW1lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxN2IxNTMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJhZGQgdXNlciIgYWN0aW9uPSJhZGRVc2VyIi8+PGJyLz4NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmNmIwNi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOmM9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0dmFsL2RlbW8vY29tcG9uZW50cyINCi0gICAgICAgID4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDxjOnVzZXJGb3JtIGJlYW49IiN7cmVnaXN0cmF0aW9uUGFnZX0iLz4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9InNhdmUiIGFjdGlvbj0iI3tyZWdpc3RyYXRpb25QYWdlLmZpbmlzaH0iLz4NCi0NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3BvbS54bWwgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzIxZTk0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX2JlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBoZWxsbyBiZWFuLXZhbGlkYXRpb248L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5lbC1pbXBsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5oaWJlcm5hdGU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGliZXJuYXRlLXZhbGlkYXRvcjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj40LjAuMC5HQTwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS40LjI8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjQuMjwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjFjZjkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0NWZlMi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuazsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLmRvbWFpbi5QZXJzb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay52YWxpZGF0aW9uLmdyb3VwLkFkbWluOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cC5Vc2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cC5OYW1lOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5ncm91cHMuRGVmYXVsdDsNCi0NCi0vKioNCi0gKiBBIHR5cGljYWwgc2ltcGxlIGJhY2tpbmcgYmVhbiwgdGhhdCBpcyBiYWNrZWQgdG8gPGNvZGU+aGVsbG93b3JsZC5qc3A8L2NvZGU+DQotICovDQotcHVibGljIGNsYXNzIEhlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlcg0KLXsNCi0gICAgQEJlYW5WYWxpZGF0aW9uLkxpc3Qoew0KLSAgICAgICAgICAgIEBCZWFuVmFsaWRhdGlvbih1c2VHcm91cHMgPSBEZWZhdWx0LmNsYXNzKSwNCi0gICAgICAgICAgICBAQmVhblZhbGlkYXRpb24odmlld0lkcyA9ICIvZ3JvdXBWYWxpZGF0aW9uMDEuanNwIiwgdXNlR3JvdXBzID0gVXNlci5jbGFzcyksDQotICAgICAgICAgICAgQEJlYW5WYWxpZGF0aW9uKHZpZXdJZHMgPSAiL2dyb3VwVmFsaWRhdGlvbjAyLmpzcCIsIHVzZUdyb3VwcyA9IEFkbWluLmNsYXNzKSwNCi0gICAgICAgICAgICBAQmVhblZhbGlkYXRpb24odmlld0lkcyA9ICIvbW9kZWxWYWxpZGF0aW9uMDEuanNwIiwgdXNlR3JvdXBzID0gQWRtaW4uY2xhc3MpLA0KLSAgICAgICAgICAgIEBCZWFuVmFsaWRhdGlvbih2aWV3SWRzID0gIi9tb2RlbFZhbGlkYXRpb24wMS5qc3AiLCB1c2VHcm91cHMgPSBOYW1lLmNsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uID0gQE1vZGVsVmFsaWRhdGlvbihpc0FjdGl2ZSA9IHRydWUpKQ0KLSAgICB9KQ0KLSAgICBwcml2YXRlIFBlcnNvbiBwZXJzb24gPSBuZXcgUGVyc29uKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBkZWZhdWx0IGVtcHR5IGNvbnN0cnVjdG9yDQotICAgICAqLw0KLSAgICBwdWJsaWMgSGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyKCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgc2VuZCgpDQotICAgIHsNCi0gICAgICAgIC8vZG8gcmVhbCBsb2dpYywgcmV0dXJuIGEgc3RyaW5nIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgdGhlIG5hdmlnYXRpb24gc3lzdGVtIG9mIEpTRg0KLSAgICAgICAgcmV0dXJuICJzdWNjZXNzIjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwZXJzb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbiBwZXJzb24pDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uID0gcGVyc29uOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2UzZWI0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbms7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5kb21haW4uUGVyc29uOw0KLQ0KLS8qKg0KLSAqIEEgdHlwaWNhbCBzaW1wbGUgYmFja2luZyBiZWFuLCB0aGF0IGlzIGJhY2tlZCB0byA8Y29kZT5oZWxsb3dvcmxkLmpzcDwvY29kZT4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZENvbnRyb2xsZXINCi17DQotICAgIHByaXZhdGUgUGVyc29uIHBlcnNvbiA9IG5ldyBQZXJzb24oKTsNCi0NCi0gICAgLyoqDQotICAgICAqIGRlZmF1bHQgZW1wdHkgY29uc3RydWN0b3INCi0gICAgICovDQotICAgIHB1YmxpYyBIZWxsb1dvcmxkQ29udHJvbGxlcigpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHNlbmQoKQ0KLSAgICB7DQotICAgICAgICAvL2RvIHJlYWwgbG9naWMsIHJldHVybiBhIHN0cmluZyB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuYXZpZ2F0aW9uIHN5c3RlbSBvZiBKU0YNCi0gICAgICAgIHJldHVybiAic3VjY2VzcyI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBlcnNvbiBnZXRQZXJzb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGVyc29uOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNvbihQZXJzb24gcGVyc29uKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbiA9IHBlcnNvbjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZWE4M2UuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvZG9tYWluL1BlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLmRvbWFpbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb24uTmFtZUNvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay52YWxpZGF0aW9uLmdyb3VwLkFkbWluOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cC5Vc2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cC5OYW1lOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsNCi0NCi1ATmFtZUNvbnN0cmFpbnQoZ3JvdXBzID0gTmFtZS5jbGFzcykNCi1wdWJsaWMgY2xhc3MgUGVyc29uDQotew0KLSAgICBATm90TnVsbChwYXlsb2FkID0gVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcykNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOw0KLQ0KLSAgICAvL2RlbW8gZm9yIGJlYW4gdmFsaWRhdGlvbiBiYXNlZCB2YWxpZGF0aW9uIHN1cHBvcnQNCi0gICAgQE5vdE51bGwNCi0gICAgQFNpemUuTGlzdCh7DQotICAgICAgICAgICAgQFNpemUobWluID0gMywgbWF4ID0gNiwgZ3JvdXBzID0gVXNlci5jbGFzcyksDQotICAgICAgICAgICAgQFNpemUobWluID0gMywgbWF4ID0gMTIsIGdyb3VwcyA9IEFkbWluLmNsYXNzKQ0KLSAgICB9KQ0KLSAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxhc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vTmFtZUNvbnN0cmFpbnQuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vTmFtZUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNjMzdmNC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL05hbWVDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLQ0KLUBDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0gTmFtZUNvbnN0cmFpbnRWYWxpZGF0b3IuY2xhc3MpDQotQFRhcmdldChUWVBFKQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1wdWJsaWMgQGludGVyZmFjZSBOYW1lQ29uc3RyYWludA0KLXsNCi0gICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJpbnZhbGlkIG5hbWUiOw0KLQ0KLSAgICBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQge307DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHt9Ow0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL05hbWVDb25zdHJhaW50VmFsaWRhdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL05hbWVDb25zdHJhaW50VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1Yjg5MmMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9OYW1lQ29uc3RyYWludFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5kb21haW4uUGVyc29uOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIE5hbWVDb25zdHJhaW50VmFsaWRhdG9yIGltcGxlbWVudHMNCi0gICAgICAgIENvbnN0cmFpbnRWYWxpZGF0b3I8TmFtZUNvbnN0cmFpbnQsIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5kb21haW4uUGVyc29uPg0KLXsNCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShOYW1lQ29uc3RyYWludCBkaWZmZXJlbnROYW1lKQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChQZXJzb24gcGVyc29uLCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCkNCi0gICAgew0KLSAgICAgICAgaWYocGVyc29uID09IG51bGwgfHwgaXNFbXB0eShwZXJzb24uZ2V0Rmlyc3ROYW1lKCkpIHx8IGlzRW1wdHkocGVyc29uLmdldExhc3ROYW1lKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuICEocGVyc29uLmdldEZpcnN0TmFtZSgpLmVxdWFscyhwZXJzb24uZ2V0TGFzdE5hbWUoKSkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0VtcHR5KFN0cmluZyB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgIiIuZXF1YWxzKHZhbHVlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL2dyb3VwL0FkbWluLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL2dyb3VwL0FkbWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYzA5ZDIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9BZG1pbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb24uZ3JvdXA7DQotDQotcHVibGljIGludGVyZmFjZSBBZG1pbg0KLXsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9OYW1lLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL2dyb3VwL05hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTExNzAzOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL2dyb3VwL05hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay52YWxpZGF0aW9uLmdyb3VwOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZQ0KLXsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9Vc2VyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL2dyb3VwL1VzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJmOGRkNS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL2dyb3VwL1VzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay52YWxpZGF0aW9uLmdyb3VwOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgVXNlcg0KLXsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjFjZjkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzRiNTY3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQw0KLSAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKYXZhU2VydmVyIEZhY2VzIENvbmZpZyAxLjAvL0VOIg0KLSAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzEuZHRkIiA+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGZhY2VzLWNvbmZpZz4NCi0NCi0JPCEtLSBtYW5hZ2VkIGJlYW5zIG9mIHRoZSBzaW1wbGUgaGVsbG8gd29ybGQgYXBwIC0tPg0KLQk8bWFuYWdlZC1iZWFuPg0KLQkJPG1hbmFnZWQtYmVhbi1uYW1lPmhlbGxvV29ybGQ8L21hbmFnZWQtYmVhbi1uYW1lPg0KLQkJPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuSGVsbG9Xb3JsZENvbnRyb2xsZXI8L21hbmFnZWQtYmVhbi1jbGFzcz4NCi0JCTxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPg0KLQk8L21hbmFnZWQtYmVhbj4NCi0JDQotICAgIDxtYW5hZ2VkLWJlYW4+DQotICAgICAgICA8bWFuYWdlZC1iZWFuLW5hbWU+aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyPC9tYW5hZ2VkLWJlYW4tbmFtZT4NCi0gICAgICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLkhlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlcjwvbWFuYWdlZC1iZWFuLWNsYXNzPg0KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+DQotICAgIDwvbWFuYWdlZC1iZWFuPg0KLQ0KLSAgICA8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIGhlbGxvV29ybGQuanNwIC0tPg0KLSAgICA8bmF2aWdhdGlvbi1ydWxlPg0KLSAgICAgICAgPGZyb20tdmlldy1pZD4qPC9mcm9tLXZpZXctaWQ+DQotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPg0KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+c3VjY2VzczwvZnJvbS1vdXRjb21lPg0KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9yZXN1bHQuanNwPC90by12aWV3LWlkPg0KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+DQotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPg0KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+ZXhhbXBsZTAxPC9mcm9tLW91dGNvbWU+DQotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L2dyb3VwVmFsaWRhdGlvbjAxLmpzcDwvdG8tdmlldy1pZD4NCi0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPg0KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4NCi0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmV4YW1wbGUwMjwvZnJvbS1vdXRjb21lPg0KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9ncm91cFZhbGlkYXRpb24wMi5qc3A8L3RvLXZpZXctaWQ+DQotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4NCi0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+DQotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5leGFtcGxlMDM8L2Zyb20tb3V0Y29tZT4NCi0gICAgICAgICAgICA8dG8tdmlldy1pZD4vbW9kZWxWYWxpZGF0aW9uMDEuanNwPC90by12aWV3LWlkPg0KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+DQotICAgIDwvbmF2aWdhdGlvbi1ydWxlPg0KLQ0KLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIHJlc3VsdC5qc3AgLS0+DQotCTxuYXZpZ2F0aW9uLXJ1bGU+DQotCQk8ZnJvbS12aWV3LWlkPi9yZXN1bHQuanNwPC9mcm9tLXZpZXctaWQ+DQotCQk8bmF2aWdhdGlvbi1jYXNlPg0KLQkJCTxmcm9tLW91dGNvbWU+YmFjazwvZnJvbS1vdXRjb21lPg0KLQkJCTx0by12aWV3LWlkPi9oZWxsb1dvcmxkLmpzcDwvdG8tdmlldy1pZD4NCi0JCTwvbmF2aWdhdGlvbi1jYXNlPg0KLQk8L25hdmlnYXRpb24tcnVsZT4NCi08L2ZhY2VzLWNvbmZpZz4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFhZDRlNS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIg0KLSAgICAgICAgIHZlcnNpb249IjIuNCI+DQotDQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+DQotDQotICAgIDwhLS1vcHRpb25hbDogY29udGV4dC1wYXJhbT4NCi0gICAgICAgIDxkZXNjcmlwdGlvbj5Db21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBVUklzIG9mIChhZGRpdGlvbmFsKSBmYWNlcyBjb25maWcgZmlsZXMuDQotICAgICAgICAgICAgKGUuZy4gL1dFQi1JTkYvbXktY29uZmlnLnhtbCkNCi0gICAgICAgICAgICBTZWUgSlNGIDEuMCBQUkQyLCAxMC4zLjINCi0gICAgICAgICAgICBBdHRlbnRpb246IFlvdSBkbyBub3QgbmVlZCB0byBwdXQgL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBpbiBoZXJlLg0KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkNPTkZJR19GSUxFUzwvcGFyYW0tbmFtZT4NCi0gICAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sPC9wYXJhbS12YWx1ZT4NCi0gICAgPC9jb250ZXh0LXBhcmFtLS0+DQotICAgIDxjb250ZXh0LXBhcmFtPg0KLSAgICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpDQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+DQotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4NCi0gICAgPC9jb250ZXh0LXBhcmFtPg0KLSAgICA8Y29udGV4dC1wYXJhbT4NCi0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4NCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5OVU1CRVJfT0ZfVklFV1NfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4NCi0gICAgICAgIDxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+DQotICAgIDwvY29udGV4dC1wYXJhbT4NCi0gICAgPGNvbnRleHQtcGFyYW0+DQotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuDQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdA0KLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uDQotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS48L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPg0KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPg0KLSAgICA8L2NvbnRleHQtcGFyYW0+DQotICAgIDxjb250ZXh0LXBhcmFtPg0KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpIGFuZCBpZg0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpDQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdA0KLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBjb21wcmVzc2VkLjwvZGVzY3JpcHRpb24+DQotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4NCi0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4NCi0gICAgPC9jb250ZXh0LXBhcmFtPg0KLSAgICA8Y29udGV4dC1wYXJhbT4NCi0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUNCi0gICAgICAgICAgICByZW5kZXJlZCBIVE1MIG91dHB1dC4NCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUNCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4NCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIG5vdCBhbGxvd2VkLCB0aGUgc3RhdGUgc2F2aW5nIGluZm8gYW5kIG5lc3RlZCBwYXJhbWV0ZXJzDQotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4NCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFMTE9XX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+DQotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+DQotICAgIDwvY29udGV4dC1wYXJhbT4NCi0gICAgPGNvbnRleHQtcGFyYW0+DQotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuREVURUNUX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+DQotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPg0KLSAgICA8L2NvbnRleHQtcGFyYW0+DQotICAgIDxjb250ZXh0LXBhcmFtPg0KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLg0KLSAgICAgICAgICAgIGkuZS4gYWRkaXRpb25hbCBsaW5lIHNlcGFyYXRvcnMgYW5kIHdoaXRlc3BhY2Ugd2lsbCBiZSB3cml0dGVuLCB0aGF0IGRvIG5vdA0KLSAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgSFRNTCBjb2RlLg0KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+DQotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUFJFVFRZX0hUTUw8L3BhcmFtLW5hbWU+DQotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+DQotICAgIDwvY29udGV4dC1wYXJhbT4NCi0gICAgPGNvbnRleHQtcGFyYW0+DQotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlDQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMNCi0gICAgICAgICAgICB3aXRoIGxvbmcgbGlzdHMgYW5kIHlvdSBkbyBub3Qgd2FudCB0aGUgYnJvd3NlciBwYWdlIHRvIGFsd2F5cyBqdW1wIHRvIHRoZSB0b3ANCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuDQotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIjwvZGVzY3JpcHRpb24+DQotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQVVUT19TQ1JPTEw8L3BhcmFtLW5hbWU+DQotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+DQotICAgIDwvY29udGV4dC1wYXJhbT4NCi0NCi0gICAgPGNvbnRleHQtcGFyYW0+DQotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQ0KLSAgICAgICAgICAgIHN0YXRlIHNhdmluZy4gU2VlIE15RmFjZXMgd2lraS93ZWIgc2l0ZSBkb2N1bWVudGF0aW9uIGZvciBpbnN0cnVjdGlvbnMNCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuDQotICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFQ1JFVDwvcGFyYW0tbmFtZT4NCi0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPg0KLSAgICA8L2NvbnRleHQtcGFyYW0+DQotDQotICAgIDxjb250ZXh0LXBhcmFtPg0KLSAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgIFZhbGlkYXRlIG1hbmFnZWQgYmVhbnMsIG5hdmlnYXRpb24gcnVsZXMgYW5kIGVuc3VyZSB0aGF0IGZvcm1zIGFyZSBub3QgbmVzdGVkLg0KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4NCi0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4NCi0gICAgPC9jb250ZXh0LXBhcmFtPg0KLQ0KLSAgICA8Y29udGV4dC1wYXJhbT4NCi0gICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICBUcmVhdCByZWFkb25seSBzYW1lIGFzIGlmIGRpc2FibGVkIGF0dHJpYnV0ZSB3YXMgc2V0IGZvciBzZWxlY3QgZWxlbWVudHMuDQotICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlJFQURPTkxZX0FTX0RJU0FCTEVEX0ZPUl9TRUxFQ1RTPC9wYXJhbS1uYW1lPg0KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPg0KLSAgICA8L2NvbnRleHQtcGFyYW0+DQotDQotICAgIDxjb250ZXh0LXBhcmFtPg0KLSAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgIFVzZSB0aGUgZGVmaW5lZCBjbGFzcyBhcyB0aGUgY2xhc3Mgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiBhIHJlc291cmNlIGlzIGFkZGVkIHRvIHRoZQ0KLSAgICAgICAgICAgIEV4dGVuc2lvbkZpbHRlciBoYW5kbGluZy4gVXNpbmcgU3RyZWFtaW5nQWRkUmVzb3VyY2UgaGVyZSBoZWxwcyB3aXRoIHBlcmZvcm1hbmNlLiBJZiB5b3Ugd2FudCB0byBhZGQNCi0gICAgICAgICAgICBjdXN0b20gY29tcG9uZW50cyBhbmQgd2FudCB0byB1c2UgdGhlIEV4dGVuc2lvbkZpbHRlciwgeW91IG5lZWQgdG8gcHJvdmlkZSB5b3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBoZXJlLg0KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BRERfUkVTT1VSQ0VfQ0xBU1M8L3BhcmFtLW5hbWU+DQotICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLnV0aWwuRGVmYXVsdEFkZFJlc291cmNlPC9wYXJhbS12YWx1ZT4NCi0gICAgPC9jb250ZXh0LXBhcmFtPg0KLQ0KLSAgICA8Y29udGV4dC1wYXJhbT4NCi0gICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICBWaXJ0dWFsIHBhdGggaW4gdGhlIFVSTCB3aGljaCB0cmlnZ2VycyBsb2FkaW5nIG9mIHJlc291cmNlcyBmb3IgdGhlIE15RmFjZXMgZXh0ZW5kZWQgY29tcG9uZW50cw0KLSAgICAgICAgICAgIGluIHRoZSBFeHRlbnNpb25GaWx0ZXIuDQotICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlJFU09VUkNFX1ZJUlRVQUxfUEFUSDwvcGFyYW0tbmFtZT4NCi0gICAgICAgIDxwYXJhbS12YWx1ZT4vZmFjZXMvbXlGYWNlc0V4dGVuc2lvblJlc291cmNlPC9wYXJhbS12YWx1ZT4NCi0gICAgPC9jb250ZXh0LXBhcmFtPg0KLQ0KLSAgICA8Y29udGV4dC1wYXJhbT4NCi0gICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICBDaGVjayBpZiB0aGUgZXh0ZW5zaW9ucy1maWx0ZXIgaGFzIGJlZW4gcHJvcGVybHkgY29uZmlndXJlZC4NCi0gICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ0hFQ0tfRVhURU5TSU9OU19GSUxURVI8L3BhcmFtLW5hbWU+DQotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+DQotICAgIDwvY29udGV4dC1wYXJhbT4NCi0NCi0gICAgPGNvbnRleHQtcGFyYW0+DQotICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgRGVmaW5lIHBhcnRpYWwgc3RhdGUgc2F2aW5nIGFzIHRydWUvZmFsc2UuDQotICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuUEFSVElBTF9TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPg0KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4NCi0gICAgPC9jb250ZXh0LXBhcmFtPg0KLQ0KLSAgICA8IS0tIExpc3RlbmVyLCB0byBhbGxvdyBKZXR0eSBzZXJ2aW5nIE15RmFjZXMgYXBwcyAtLT4NCi0gICAgPGxpc3RlbmVyPg0KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy53ZWJhcHAuU3RhcnR1cFNlcnZsZXRDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPg0KLSAgICA8L2xpc3RlbmVyPg0KLQ0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+DQotICAgIDxzZXJ2bGV0Pg0KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+DQotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPg0KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+DQotICAgIDwvc2VydmxldD4NCi0NCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmcgLS0+DQotICAgIDxzZXJ2bGV0LW1hcHBpbmc+DQotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4NCi0gICAgICAgIDx1cmwtcGF0dGVybj4qLmpzZjwvdXJsLXBhdHRlcm4+DQotICAgIDwvc2VydmxldC1tYXBwaW5nPg0KLQ0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+DQotICAgIDx3ZWxjb21lLWZpbGUtbGlzdD4NCi0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguanNwPC93ZWxjb21lLWZpbGU+DQotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4NCi0gICAgPC93ZWxjb21lLWZpbGUtbGlzdD4NCi0NCi08L3dlYi1hcHA+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2dyb3VwVmFsaWRhdGlvbjAxLmpzcCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9ncm91cFZhbGlkYXRpb24wMS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNDZlNTQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2dyb3VwVmFsaWRhdGlvbjAxLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTwlLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tJT4NCi0NCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPg0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4NCi08aHRtbD4NCi0gICAgPGhlYWQ+DQotICAgICAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPg0KLSAgICA8L2hlYWQ+DQotICAgIDxib2R5Pg0KLSAgICAgICAgPGY6dmlldz4NCi0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+DQotICAgICAgICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMyI+DQotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0iZmlyc3RfbmFtZSIgdmFsdWU9IkZpcnN0IG5hbWUqOiIvPg0KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9ImZpcnN0X25hbWUiIHZhbHVlPSIje2hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlclsncGVyc29uJ10uZmlyc3ROYW1lfSIvPg0KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0iZmlyc3RfbmFtZSIgc2hvd1N1bW1hcnk9InRydWUiIHNob3dEZXRhaWw9ImZhbHNlIiBlcnJvclN0eWxlPSJjb2xvcjogcmVkOyIgd2FyblN0eWxlPSJjb2xvcjogb3JhbmdlOyIvPg0KLQ0KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9Imxhc3RfbmFtZSIgdmFsdWU9Ikxhc3QgbmFtZSoqOiIvPg0KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9Imxhc3RfbmFtZSIgdmFsdWU9IiN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLnBlcnNvbi5sYXN0TmFtZX0iLz4NCi0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9Imxhc3RfbmFtZSIgc2hvd1N1bW1hcnk9InRydWUiIHNob3dEZXRhaWw9ImZhbHNlIiBlcnJvclN0eWxlPSJjb2xvcjogcmVkOyIgd2FyblN0eWxlPSJjb2xvcjogb3JhbmdlOyIvPg0KLQ0KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJQcmVzcyBtZSIgYWN0aW9uPSIje2hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlci5zZW5kfSIvPg0KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4NCi0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+DQotICAgICAgICAgICAgICA8L2g6cGFuZWxHcmlkPg0KLSAgICAgICAgICAgIDwvaDpmb3JtPg0KLSAgICAgICAgICAgIDxoOm1lc3NhZ2VzIGdsb2JhbE9ubHk9InRydWUiIHNob3dEZXRhaWw9InRydWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIvPg0KLSAgICAgICAgPC9mOnZpZXc+DQotICAgICAgICA8aHIvPg0KLQ0KLSAgICAgICAgKiByZXF1aXJlZDxici8+DQotICAgICAgICAqKiByZXF1aXJlZDsgbGVuZ3RoOiAzLTYgY2hhcmFjdGVycw0KLSAgICA8L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9ncm91cFZhbGlkYXRpb24wMi5qc3AgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvZ3JvdXBWYWxpZGF0aW9uMDIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGU1YmRiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9ncm91cFZhbGlkYXRpb24wMi5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08JS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLSU+DQotDQotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4NCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+DQotPGh0bWw+DQotICAgIDxoZWFkPg0KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4NCi0gICAgPC9oZWFkPg0KLSAgICA8Ym9keT4NCi0gICAgICAgIDxmOnZpZXc+DQotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPg0KLSAgICAgICAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjMiPg0KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9ImZpcnN0X25hbWUiIHZhbHVlPSJGaXJzdCBuYW1lKjoiLz4NCi0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJmaXJzdF9uYW1lIiB2YWx1ZT0iI3toZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXJbJ3BlcnNvbiddLmZpcnN0TmFtZX0iLz4NCi0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9ImZpcnN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4NCi0NCi0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJsYXN0X25hbWUiIHZhbHVlPSJMYXN0IG5hbWUqKjoiLz4NCi0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJsYXN0X25hbWUiIHZhbHVlPSIje2hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlci5wZXJzb24ubGFzdE5hbWV9Ii8+DQotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJsYXN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4NCi0NCi0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiB2YWx1ZT0iUHJlc3MgbWUiIGFjdGlvbj0iI3toZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIuc2VuZH0iLz4NCi0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+DQotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPg0KLSAgICAgICAgICAgICAgPC9oOnBhbmVsR3JpZD4NCi0gICAgICAgICAgICA8L2g6Zm9ybT4NCi0gICAgICAgICAgICA8aDptZXNzYWdlcyBnbG9iYWxPbmx5PSJ0cnVlIiBzaG93RGV0YWlsPSJ0cnVlIiBzaG93U3VtbWFyeT0iZmFsc2UiLz4NCi0gICAgICAgIDwvZjp2aWV3Pg0KLSAgICAgICAgPGhyLz4NCi0NCi0gICAgICAgICogcmVxdWlyZWQ8YnIvPg0KLSAgICAgICAgKiogcmVxdWlyZWQ7IGxlbmd0aDogMy0xMiBjaGFyYWN0ZXJzDQotICAgIDwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDI5ZjA2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTwlLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tJT4NCi0NCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPg0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4NCi08aHRtbD4NCi0gICAgPGhlYWQ+DQotICAgICAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPg0KLSAgICA8L2hlYWQ+DQotICAgIDxib2R5Pg0KLSAgICAgICAgPGY6dmlldz4NCi0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+DQotICAgICAgICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMyI+DQotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0iZmlyc3RfbmFtZSIgdmFsdWU9IkZpcnN0IG5hbWUqOiIvPg0KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9ImZpcnN0X25hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQucGVyc29uLmZpcnN0TmFtZX0iLz4NCi0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9ImZpcnN0X25hbWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIgc2hvd0RldGFpbD0idHJ1ZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4NCi0NCi0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJsYXN0X25hbWUiIHZhbHVlPSJMYXN0IG5hbWUqKjoiLz4NCi0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJsYXN0X25hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfSIvPg0KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0ibGFzdF9uYW1lIiBzaG93U3VtbWFyeT0iZmFsc2UiIHNob3dEZXRhaWw9InRydWUiIGVycm9yU3R5bGU9ImNvbG9yOiByZWQ7IiB3YXJuU3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ii8+DQotDQotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Xb3JsZC5zZW5kfSIvPg0KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4NCi0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+DQotICAgICAgICAgICAgICA8L2g6cGFuZWxHcmlkPg0KLQ0KLSAgICAgICAgICAgICAgPGhyLz4NCi0gICAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIHZhbHVlPSJncm91cCB2YWxpZGF0aW9uIGV4YW1wbGUgMSIgYWN0aW9uPSJleGFtcGxlMDEiIGltbWVkaWF0ZT0idHJ1ZSIvPjxici8+DQotICAgICAgICAgICAgICA8aDpjb21tYW5kTGluayB2YWx1ZT0iZ3JvdXAgdmFsaWRhdGlvbiBleGFtcGxlIDIiIGFjdGlvbj0iZXhhbXBsZTAyIiBpbW1lZGlhdGU9InRydWUiLz48YnIvPg0KLSAgICAgICAgICAgICAgPGg6Y29tbWFuZExpbmsgdmFsdWU9Im1vZGVsIHZhbGlkYXRpb24gZXhhbXBsZSAxIiBhY3Rpb249ImV4YW1wbGUwMyIgaW1tZWRpYXRlPSJ0cnVlIi8+PGJyLz4NCi0gICAgICAgICAgICA8L2g6Zm9ybT4NCi0gICAgICAgICAgPC9mOnZpZXc+DQotICAgICAgICAgIDxoci8+DQotICAgICAgICAgICogbm9uIGJsb2NraW5nIHdhcm4gbW9kZTxici8+DQotICAgICAgICAgICoqIGJsb2NraW5nIGVycm9yIG1vZGUNCi0gICAgICA8L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGI1NzI1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08JS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLSU+DQotDQotPCVAIHBhZ2Ugc2Vzc2lvbj0iZmFsc2UiJT4NCi08JQ0KLXJlc3BvbnNlLnNlbmRSZWRpcmVjdCgiaGVsbG9Xb3JsZC5qc2YiKTsNCi0lPg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9tb2RlbFZhbGlkYXRpb24wMS5qc3AgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvbW9kZWxWYWxpZGF0aW9uMDEuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWZiZTVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9tb2RlbFZhbGlkYXRpb24wMS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08JS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLSU+DQotDQotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4NCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+DQotPGh0bWw+DQotICAgIDxoZWFkPg0KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4NCi0gICAgPC9oZWFkPg0KLSAgICA8Ym9keT4NCi0gICAgICAgIDxmOnZpZXc+DQotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPg0KLSAgICAgICAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjMiPg0KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9ImZpcnN0X25hbWUiIHZhbHVlPSJGaXJzdCBuYW1lKjoiLz4NCi0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJmaXJzdF9uYW1lIiB2YWx1ZT0iI3toZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXJbJ3BlcnNvbiddLmZpcnN0TmFtZX0iLz4NCi0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9ImZpcnN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4NCi0NCi0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJsYXN0X25hbWUiIHZhbHVlPSJMYXN0IG5hbWUqKjoiLz4NCi0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJsYXN0X25hbWUiIHZhbHVlPSIje2hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlci5wZXJzb24ubGFzdE5hbWV9Ii8+DQotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJsYXN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4NCi0NCi0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiB2YWx1ZT0iUHJlc3MgbWUiIGFjdGlvbj0iI3toZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIuc2VuZH0iLz4NCi0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+DQotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPg0KLSAgICAgICAgICAgICAgPC9oOnBhbmVsR3JpZD4NCi0gICAgICAgICAgICA8L2g6Zm9ybT4NCi0gICAgICAgICAgICA8aDptZXNzYWdlcyBnbG9iYWxPbmx5PSJ0cnVlIiBzaG93RGV0YWlsPSJ0cnVlIiBzaG93U3VtbWFyeT0iZmFsc2UiLz4NCi0gICAgICAgIDwvZjp2aWV3Pg0KLSAgICAgICAgPGhyLz4NCi0gICAgICAgIG1vZGVsIHZhbGlkYXRpb246IGZpcnN0IGFuZCBsYXN0IG5hbWUgaGF2ZSB0byBiZSBkaWZmZXJlbnQ8YnIvPg0KLQ0KLSAgICAgICAgKiByZXF1aXJlZDxici8+DQotICAgICAgICAqKiByZXF1aXJlZDsgbGVuZ3RoOiAzLTEyIGNoYXJhY3RlcnMNCi0gICAgPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvcmVzdWx0LmpzcCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9yZXN1bHQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWYxNzA3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9yZXN1bHQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPCUtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0lPg0KLQ0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+DQotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPg0KLTxodG1sPg0KLSAgICA8aGVhZD4NCi0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+DQotICAgIDwvaGVhZD4NCi0gICAgPGJvZHk+DQotICAgICAgICA8Zjp2aWV3Pg0KLSAgICAgICAgICAgIDxoOmZvcm0gaWQ9Im1haW5Gb3JtIj4NCi0gICAgICAgICAgICAgICAgPGgyPjxoOm91dHB1dFRleHQgdmFsdWU9IkhlbGxvICN7aGVsbG9Xb3JsZC5wZXJzb24uZmlyc3ROYW1lfSAje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfSN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLnBlcnNvbi5maXJzdE5hbWV9ICN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLnBlcnNvbi5sYXN0TmFtZX0uIFdlIGhvcGUgeW91IGVuam95IEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yISIvPjwvaDI+DQotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIGFjdGlvbj0iYmFjayI+DQotICAgICAgICAgICAgICAgICAgICA8aDpvdXRwdXRUZXh0IHZhbHVlPSJIb21lIi8+DQotICAgICAgICAgICAgICAgIDwvaDpjb21tYW5kTGluaz4NCi0gICAgICAgICAgICA8L2g6Zm9ybT4NCi0gICAgICAgICAgICA8aDptZXNzYWdlcyBnbG9iYWxPbmx5PSJ0cnVlIiBzaG93RGV0YWlsPSJ0cnVlIiBzaG93U3VtbWFyeT0iZmFsc2UiLz4NCi0gICAgICAgIDwvZjp2aWV3Pg0KLSAgICA8L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvcG9tLnhtbCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUzZDQ4MC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIGhlbGxvIHdvcmxkPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+ZWwtaW1wbDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2MWNmOS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhZmIzOS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbms7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluLlBlcnNvbjsKLQotLyoqCi0gKiBBIHR5cGljYWwgc2ltcGxlIGJhY2tpbmcgYmVhbiwgdGhhdCBpcyBiYWNrZWQgdG8gPGNvZGU+aGVsbG93b3JsZC5qc3A8L2NvZGU+Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEhlbGxvV29ybGRDb250cm9sbGVyCi17Ci0gICAgcHJpdmF0ZSBQZXJzb24gcGVyc29uID0gbmV3IFBlcnNvbigpOwotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBlbXB0eSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBIZWxsb1dvcmxkQ29udHJvbGxlcigpCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB0aGF0IGlzIGJhY2tlZCB0byBhIHN1Ym1pdCBidXR0b24gb2YgYSBmb3JtLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgc2VuZCgpCi0gICAgewotICAgICAgICAvL2RvIHJlYWwgbG9naWMsIHJldHVybiBhIHN0cmluZyB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuYXZpZ2F0aW9uIHN5c3RlbSBvZiBKU0YKLSAgICAgICAgcmV0dXJuICJzdWNjZXNzIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpCi0gICAgewotICAgICAgICByZXR1cm4gcGVyc29uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNvbihQZXJzb24gcGVyc29uKQotICAgIHsKLSAgICAgICAgdGhpcy5wZXJzb24gPSBwZXJzb247Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvZG9tYWluL1BlcnNvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMDc2Y2MuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsKLQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsKLQotcHVibGljIGNsYXNzIFBlcnNvbgotewotICAgIC8vaGVsbG8gd29ybGQgZGVtbwotICAgIEBSZXF1aXJlZChwYXJhbWV0ZXJzID0gVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcykKLSAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7Ci0KLSAgICAvL2RlbW8gZm9yIGpwYSBiYXNlZCB2YWxpZGF0aW9uIHN1cHBvcnQKLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwIC8qLi4uKi8pCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbGFzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2MWNmOS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NjQ0ZDAuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQwotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMC8vRU4iCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlcy1jb25maWc+Ci0JCi0JPCEtLSBtYW5hZ2VkIGJlYW5zIG9mIHRoZSBzaW1wbGUgaGVsbG8gd29ybGQgYXBwIC0tPgotCTxtYW5hZ2VkLWJlYW4+Ci0JCTxtYW5hZ2VkLWJlYW4tbmFtZT5oZWxsb1dvcmxkPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLQkJPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuSGVsbG9Xb3JsZENvbnRyb2xsZXI8L21hbmFnZWQtYmVhbi1jbGFzcz4KLQkJPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0JPC9tYW5hZ2VkLWJlYW4+Ci0JCi0JPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciBoZWxsb1dvcmxkLmpzcCAtLT4KLQk8bmF2aWdhdGlvbi1ydWxlPgotCQk8ZnJvbS12aWV3LWlkPi9oZWxsb1dvcmxkLmpzcDwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5zdWNjZXNzPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vcGFnZTIuanNwPC90by12aWV3LWlkPgotCQk8L25hdmlnYXRpb24tY2FzZT4KLQk8L25hdmlnYXRpb24tcnVsZT4KLQkKLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIHBhZ2UyLmpzcCAtLT4KLQk8bmF2aWdhdGlvbi1ydWxlPgotCQk8ZnJvbS12aWV3LWlkPi9wYWdlMi5qc3A8L2Zyb20tdmlldy1pZD4KLQkJPG5hdmlnYXRpb24tY2FzZT4KLQkJCTxmcm9tLW91dGNvbWU+YmFjazwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L2hlbGxvV29ybGQuanNwPC90by12aWV3LWlkPgotCQk8L25hdmlnYXRpb24tY2FzZT4KLQk8L25hdmlnYXRpb24tcnVsZT4KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE0YTE4My4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLSAgICAgICAgIHZlcnNpb249IjIuNCI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+TXlQcm9qZWN0IHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0gICAgPCEtLW9wdGlvbmFsOiBjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgVVJJcyBvZiAoYWRkaXRpb25hbCkgZmFjZXMgY29uZmlnIGZpbGVzLgotICAgICAgICAgICAgKGUuZy4gL1dFQi1JTkYvbXktY29uZmlnLnhtbCkKLSAgICAgICAgICAgIFNlZSBKU0YgMS4wIFBSRDIsIDEwLjMuMgotICAgICAgICAgICAgQXR0ZW50aW9uOiBZb3UgZG8gbm90IG5lZWQgdG8gcHV0IC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgaW4gaGVyZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuQ09ORklHX0ZJTEVTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L1dFQi1JTkYvZXhhbXBsZXMtY29uZmlnLnhtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtLS0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5TdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNsaWVudDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLk5VTUJFUl9PRl9WSUVXU19JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkgYW5kIGlmCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04gaXMgdHJ1ZSAoPSBkZWZhdWx0KQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4gSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUKLSAgICAgICAgICAgIHJlbmRlcmVkIEhUTUwgb3V0cHV0LgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgbm90IGFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLgotICAgICAgICAgICAgaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90Ci0gICAgICAgICAgICBpbmZsdWVuY2UgdGhlIEhUTUwgY29kZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIGEgamF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRoYXQgaXMgYWJsZSB0byByZXN0b3JlIHRoZQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMKLSAgICAgICAgICAgIHdpdGggbG9uZyBsaXN0cyBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcAotICAgICAgICAgICAgaWYgeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZSBwYWdlLgotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BVVRPX1NDUk9MTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQotICAgICAgICAgICAgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucwotICAgICAgICAgICAgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IgZGlmZmVuZW50IGVuY3J5cHRpb24gc3RyZW5ndGhzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VDUkVUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+TnpZMU5ETXlNVEE9PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmFsaWRhdGUgbWFuYWdlZCBiZWFucywgbmF2aWdhdGlvbiBydWxlcyBhbmQgZW5zdXJlIHRoYXQgZm9ybXMgYXJlIG5vdCBuZXN0ZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVHJlYXQgcmVhZG9ubHkgc2FtZSBhcyBpZiBkaXNhYmxlZCBhdHRyaWJ1dGUgd2FzIHNldCBmb3Igc2VsZWN0IGVsZW1lbnRzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUkVBRE9OTFlfQVNfRElTQUJMRURfRk9SX1NFTEVDVFM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBVc2UgdGhlIGRlZmluZWQgY2xhc3MgYXMgdGhlIGNsYXNzIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSByZXNvdXJjZSBpcyBhZGRlZCB0byB0aGUKLSAgICAgICAgICAgIEV4dGVuc2lvbkZpbHRlciBoYW5kbGluZy4gVXNpbmcgU3RyZWFtaW5nQWRkUmVzb3VyY2UgaGVyZSBoZWxwcyB3aXRoIHBlcmZvcm1hbmNlLiBJZiB5b3Ugd2FudCB0byBhZGQKLSAgICAgICAgICAgIGN1c3RvbSBjb21wb25lbnRzIGFuZCB3YW50IHRvIHVzZSB0aGUgRXh0ZW5zaW9uRmlsdGVyLCB5b3UgbmVlZCB0byBwcm92aWRlIHlvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIGhlcmUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BRERfUkVTT1VSQ0VfQ0xBU1M8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwudXRpbC5EZWZhdWx0QWRkUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgICAgIAotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZpcnR1YWwgcGF0aCBpbiB0aGUgVVJMIHdoaWNoIHRyaWdnZXJzIGxvYWRpbmcgb2YgcmVzb3VyY2VzIGZvciB0aGUgTXlGYWNlcyBleHRlbmRlZCBjb21wb25lbnRzCi0gICAgICAgICAgICBpbiB0aGUgRXh0ZW5zaW9uRmlsdGVyLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUkVTT1VSQ0VfVklSVFVBTF9QQVRIPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L2ZhY2VzL215RmFjZXNFeHRlbnNpb25SZXNvdXJjZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBDaGVjayBpZiB0aGUgZXh0ZW5zaW9ucy1maWx0ZXIgaGFzIGJlZW4gcHJvcGVybHkgY29uZmlndXJlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNIRUNLX0VYVEVOU0lPTlNfRklMVEVSPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBEZWZpbmUgcGFydGlhbCBzdGF0ZSBzYXZpbmcgYXMgdHJ1ZS9mYWxzZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuUEFSVElBTF9TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0KLSAgICA8IS0tIExpc3RlbmVyLCB0byBhbGxvdyBKZXR0eSBzZXJ2aW5nIE15RmFjZXMgYXBwcyAtLT4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMud2ViYXBwLlN0YXJ0dXBTZXJ2bGV0Q29udGV4dExpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IC0tPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmcgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4qLmpzZjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4LmpzcDwvd2VsY29tZS1maWxlPgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzQyZDY4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgICA8Zjp2aWV3PgotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPgotICAgICAgICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMyI+Ci0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJmaXJzdF9uYW1lIiB2YWx1ZT0iRmlyc3QgbmFtZSo6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJmaXJzdF9uYW1lIiB2YWx1ZT0iI3toZWxsb1dvcmxkLnBlcnNvbi5maXJzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9ImZpcnN0X25hbWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIgc2hvd0RldGFpbD0idHJ1ZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4KLQotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0ibGFzdF9uYW1lIiB2YWx1ZT0iTGFzdCBuYW1lKio6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJsYXN0X25hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJsYXN0X25hbWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIgc2hvd0RldGFpbD0idHJ1ZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4KLQotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Xb3JsZC5zZW5kfSIvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgICAgICAgPC9oOmZvcm0+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgICAgICA8aHIvPgotICAgICAgICAqIG5vbmUgYmxvY2tpbmcgd2FybiBtb2RlPGJyLz4KLSAgICAgICAgKiogYmxvY2tpbmcgZXJyb3IgbW9kZQotICAgIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ4MmQ1My4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCBwYWdlIHNlc3Npb249ImZhbHNlIiU+Ci08JQotcmVzcG9uc2Uuc2VuZFJlZGlyZWN0KCJoZWxsb1dvcmxkLmpzZiIpOwotJT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYzg1MjMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgICA8Zjp2aWV3PgotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPgotICAgICAgICAgICAgICAgIDxoMj48aDpvdXRwdXRUZXh0IHZhbHVlPSJIZWxsbyAje2hlbGxvV29ybGQucGVyc29uLmZpcnN0TmFtZX0gI3toZWxsb1dvcmxkLnBlcnNvbi5sYXN0TmFtZX0uIFdlIGhvcGUgeW91IGVuam95IEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yISIvPjwvaDI+Ci0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZExpbmsgYWN0aW9uPSJiYWNrIj4KLSAgICAgICAgICAgICAgICAgICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iSG9tZSIvPgotICAgICAgICAgICAgICAgIDwvaDpjb21tYW5kTGluaz4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICA8L2Y6dmlldz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9wb20ueG1sIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTdkNjY2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0NCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIHByb2plY3Q8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvZXhhbXBsZXM8L2Nvbm5lY3Rpb24+DQotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvZXhhbXBsZXM8L2RldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy9leGFtcGxlczwvdXJsPg0KLSAgICA8L3NjbT4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPCEtLVRoaXMgcGx1Z2luIGFsbG93cyB0byBydW4gdGhlIGV4YW1wbGUgdXNpbmcgbXZuIGpldHR5OnJ1biAtLT4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpldHR5LXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Ni4xLjg8L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+MTA8L3NjYW5JbnRlcnZhbFNlY29uZHM+DQotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi0gICAgPG1vZHVsZXM+DQotICAgICAgICA8bW9kdWxlPmhlbGxvX3dvcmxkPC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPmhlbGxvX2JlYW4tdmFsaWRhdGlvbjwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5mZWF0dXJlLXNldF8wMTwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5mZWF0dXJlLXNldF8wMjwvbW9kdWxlPg0KLSAgICA8L21vZHVsZXM+DQotDQotICAgIDxwcm9maWxlcz4NCi0gICAgICAgIDwhLS0gVGhpcyBwcm9maWxlIGlzIGludm9rZWQgYnkgLURwcmVwYXJlUmVsZWFzZT10cnVlLiAgVGhpcyBhbGxvd3MgbXZuIHJlbGVhc2U6cHJlcGFyZSB0bw0KLSAgICAgICAgICAgIHJ1biBzdWNjZXNzZnVsbHkgb24gdGhlIGFzc2VtYmx5IHByb2plY3RzLiAtLT4NCi0gICAgICAgIDxwcm9maWxlPg0KLSAgICAgICAgICAgIDxpZD5wcmVwYXJlLXJlbGVhc2U8L2lkPg0KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPg0KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+DQotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wcmVwYXJlUmVsZWFzZTwvbmFtZT4NCi0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8L2FjdGl2YXRpb24+DQotICAgICAgICAgICAgPG1vZHVsZXM+DQotICAgICAgICAgICAgICAgIDxtb2R1bGU+YXNzZW1ibHk8L21vZHVsZT4NCi0gICAgICAgICAgICA8L21vZHVsZXM+DQotICAgICAgICAgICAgPGJ1aWxkPg0KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVsZWFzZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+LURwcmVwYXJlUmVsZWFzZTwvYXJndW1lbnRzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+DQotICAgICAgICAgICAgPC9idWlsZD4NCi0gICAgICAgIDwvcHJvZmlsZT4NCi0gICAgPC9wcm9maWxlcz4NCi0NCi0gICAgPHByb3BlcnRpZXM+DQotICAgICAgICA8dHJpbmlkYWQudmVyc2lvbj4xLjAuOTwvdHJpbmlkYWQudmVyc2lvbj4NCi0gICAgPC9wcm9wZXJ0aWVzPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3BhcmVudC9MSUNFTlNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvcGFyZW50L0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvcGFyZW50L0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3BhcmVudC9OT1RJQ0UudHh0IGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9wYXJlbnQvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBmMzYzYS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3BhcmVudC9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcgotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvcGFyZW50L3BvbS54bWwgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3BhcmVudC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGU1MmZjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvcGFyZW50L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj42PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjEuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFByb2plY3QgUGFyZW50PC9uYW1lPgotICAgIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExPC91cmw+Ci0KLSAgICA8aXNzdWVNYW5hZ2VtZW50PgotICAgICAgICA8c3lzdGVtPmppcmE8L3N5c3RlbT4KLSAgICAgICAgPHVybD5odHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvRVhUVkFMPC91cmw+Ci0gICAgPC9pc3N1ZU1hbmFnZW1lbnQ+Ci0KLSAgICA8Y2lNYW5hZ2VtZW50PgotICAgICAgICA8c3lzdGVtPmNvbnRpbnV1bTwvc3lzdGVtPgotICAgICAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLnpvbmVzLmFwYWNoZS5vcmc6ODA4MC9jb250aW51dW08L3VybD4KLSAgICAgICAgPG5vdGlmaWVycz4KLSAgICAgICAgICAgIDxub3RpZmllcj4KLSAgICAgICAgICAgICAgICA8dHlwZT5tYWlsPC90eXBlPgotICAgICAgICAgICAgICAgIDxzZW5kT25TdWNjZXNzPnRydWU8L3NlbmRPblN1Y2Nlc3M+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhZGRyZXNzPmNvbW1pdHNAbXlmYWNlcy5hcGFjaGUub3JnPC9hZGRyZXNzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvbm90aWZpZXI+Ci0gICAgICAgIDwvbm90aWZpZXJzPgotICAgIDwvY2lNYW5hZ2VtZW50PgotICAgIAotICAgIDxpbmNlcHRpb25ZZWFyPjIwMDg8L2luY2VwdGlvblllYXI+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+TUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLQotICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KLSAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+Ci0KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS0KLSAgICAgICAgICAgICAgICAgICAgLSBDb3B5IExJQ0VOU0UudHh0IGFuZCBOT1RJQ0UudHh0IHNvIHRoYXQgdGhleSBhcmUgaW5jbHVkZWQKLSAgICAgICAgICAgICAgICAgICAgLSBpbiB0aGUgLWphdmFkb2MgamFyIGZpbGUgZm9yIHRoZSBjb21wb25lbnQuCi0gICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+amF2YWRvYy5yZXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hcGlkb2NzL01FVEEtSU5GIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTElDRU5TRS50eHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTk9USUNFLnR4dCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmphdmFkb2Muc2l0ZS5jb3B5PC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5zaXRlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENvcHkgamF2YWRvYyB0byBhbm90aGVyIGRpcmVjdG9yeSwgdG8ga2VlcCBqYXZhZG9jIG9mIHByZXZpb3VzIHZlcnNpb25zIG9uIHNpdGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zaXRlL2FwaWRvY3MtJHtwcm9qZWN0LnZlcnNpb259IiBmYWlsb25lcnJvcj0iZmFsc2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc2l0ZS9hcGlkb2NzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgICAgLSBNYWtlIGEgY2hlY2tzdHlsZSB2aW9sYXRpb24gYSBjb21waWxlIGVycm9yLiBOb3RlIHRoYXQgaWYgYSBjb21waWxlIGVycm9yIG9jY3VycywKLSAgICAgICAgICAgICAgICAtIGZ1cnRoZXIgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRhcmdldC9zaXRlL2NoZWNrc3R5bGUuaHRtbCAocHJlc2VudCBldmVuIHdoZW4KLSAgICAgICAgICAgICAgICAtIGp1c3QgdGhlIGNvbXBpbGUgZ29hbCBhbmQgbm90IHRoZSBzaXRlIGdvYWwgaGFzIGJlZW4gcnVuKS4gTm90ZSBhbHNvIHRoYXQgY2hpbGQKLSAgICAgICAgICAgICAgICAtIHByb2plY3RzIG1heSByZWRlY2xhcmUgdGhpcyBwbHVnaW4gYW5kIHByb3ZpZGUgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MKLSAgICAgICAgICAgICAgICAtIHRvIHVzZSBkaWZmZXJlbnQgY2hlY2tzIChtb3JlIG9yIGxlc3Mgc3RyaWN0IHRoYW4gdGhlIGRlZmF1bHQpLgotICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD52ZXJpZnktc3R5bGU8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWdMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0YW5kYXJkLnhtbDwvY29uZmlnTG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxoZWFkZXJMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtaGVhZGVyLnR4dDwvaGVhZGVyTG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tIFNldCBjb21waWxlIHNvdXJjZSBhdCAxLjUsIHNpbmNlIHRoZSB0YXJnZXQgSlNGIGltcGwgaXMgMS4yIC0tPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvcHRpbWl6ZT5mYWxzZTwvb3B0aW1pemU+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+ICAgICAgICAgICAgCi0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi0gICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+bWF2ZW4yLXJlcG9zaXRvcnkuZGV2LmphdmEubmV0PC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkphdmEubmV0IFJlcG9zaXRvcnkgZm9yIE1hdmVuPC9uYW1lPgotICAgICAgICAgICAgPHVybD5odHRwOi8vZG93bmxvYWQuamF2YS5uZXQvbWF2ZW4vMS88L3VybD4KLSAgICAgICAgICAgIDxsYXlvdXQ+bGVnYWN5PC9sYXlvdXQ+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICA8L3JlcG9zaXRvcmllcz4KLQotICAgIDxyZXBvcnRpbmc+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tanhyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcmVwb3J0LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcG1kLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxydWxlc2V0cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxydWxlc2V0Pi9ydWxlc2V0cy9iYXNpYy54bWw8L3J1bGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvdW51c2VkY29kZS54bWw8L3J1bGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvcnVsZXNldHM+Ci0gICAgICAgICAgICAgICAgICAgIDxsaW5rWHJlZj50cnVlPC9saW5rWHJlZj4KLSAgICAgICAgICAgICAgICAgICAgPG1pbmltdW1Ub2tlbnM+MTAwPC9taW5pbXVtVG9rZW5zPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0SmRrPjEuNTwvdGFyZ2V0SmRrPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY2hlY2tzdHlsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlnTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdGFuZGFyZC54bWw8L2NvbmZpZ0xvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aGVhZGVyTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWhlYWRlci50eHQ8L2hlYWRlckxvY2F0aW9uPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9yZXBvcnRpbmc+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy9wYXJlbnQ8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy9wYXJlbnQ8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8yX3JjL3BhcmVudDwvdXJsPgotICAgIDwvc2NtPgotCi0gICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgICAgIDxzbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8dW5pcXVlVmVyc2lvbj5mYWxzZTwvdW5pcXVlVmVyc2lvbj4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUuc25hcHNob3RzPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBNYXZlbiBTbmFwc2hvdCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1zbmFwc2hvdC1yZXBvc2l0b3J5PC91cmw+Ci0gICAgICAgIDwvc25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICA8c2l0ZT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc2l0ZTwvaWQ+Ci0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMTwvdXJsPgotICAgICAgICA8L3NpdGU+Ci0gICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgotCi0gICAgPHByb2ZpbGVzPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5nZW5lcmF0ZS1hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPnBlcmZvcm1SZWxlYXNlPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1qYXZhZG9jczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotICAgIDwvcHJvZmlsZXM+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGpzZi52ZXJzaW9uPjEuMS41PC9qc2YudmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMTM0MmYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIC0tLS0tLQ0KLU92ZXJ2aWV3DQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4xDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLnggYW5kIEpTRiAyLnguIEFsbCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41Kw0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvcGFyZW50L3NyYy9zaXRlL2FwdC9qYXZhZG9jLmFwdCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvcGFyZW50L3NyYy9zaXRlL2FwdC9qYXZhZG9jLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3MDVhOS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3BhcmVudC9zcmMvc2l0ZS9hcHQvamF2YWRvYy5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0gLS0tLS0tDQotSmF2YWRvYw0KLSAtLS0tLS0NCi0NCi1KYXZhZG9jDQotDQotICAgIEhlcmUgeW91IGNhbiBmaW5kIHRoZSBqYXZhZG9jIG9mIHByZXZpb3VzIGV4dHZhbCB2ZXJzaW9ucy4NCi0NCi0gICAgKiB7e3todHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvbXlmYWNlcy1leHR2YWwtY29yZS9hcGlkb2NzLTEuMS4xL2luZGV4Lmh0bWx9TXlmYWNlcyBFeHRWYWwgQ29yZSBWZXJzaW9uIDEuMS4xfX0NCi0NCi0gICAgKiB7e3todHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvdmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbi9hcGlkb2NzLTEuMS4xL2luZGV4Lmh0bWx9TXlmYWNlcyBFeHRWYWwgUHJvcGVydHkgVmFsaWRhdGlvbiBWZXJzaW9uIDEuMS4xfX0NCi0NCi0gICAgKiB7e3todHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvbXlmYWNlcy1leHR2YWwtY29yZS9hcGlkb2NzLTEuMS4yL2luZGV4Lmh0bWx9TXlmYWNlcyBFeHRWYWwgQ29yZSBWZXJzaW9uIDEuMS4yfX0NCi0NCi0gICAgKiB7e3todHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvdmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbi9hcGlkb2NzLTEuMS4yL2luZGV4Lmh0bWx9TXlmYWNlcyBFeHRWYWwgUHJvcGVydHkgVmFsaWRhdGlvbiBWZXJzaW9uIDEuMS4yfX0NCi0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3BhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvcGFyZW50L3NyYy9zaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTJhYmY2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvcGFyZW50L3NyYy9zaXRlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IG5hbWU9IkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIj4KLSAgPGJhbm5lckxlZnQ+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0VmFsPC9uYW1lPgotICAgIDxzcmM+aW1hZ2VzL2V4dHZhbF9sb2dvLnBuZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW5kZXguaHRtbDwvaHJlZj4KLSAgPC9iYW5uZXJMZWZ0PgotCi0gIDxiYW5uZXJSaWdodD4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlczwvbmFtZT4KLSAgICA8c3JjPmltZy9iYW5uZXJzL015RmFjZXNfbG9nby5qcGc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWw8L2hyZWY+Ci0gIDwvYmFubmVyUmlnaHQ+Ci0KLSAgPHB1Ymxpc2hEYXRlIGZvcm1hdD0iZGQgTU1NIHl5eXkiLz4KLQotICA8c2tpbj4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1zaXRlLXNraW48L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9za2luPgotCi0gIDxib2R5PgotICAgIDxsaW5rcz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSIgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJNeUZhY2VzIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkRvd25sb2FkIE15ZmFjZXMgRXh0VmFsIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Rvd25sb2FkLmh0bWwiLz4KLSAgICA8L2xpbmtzPgotCi0gICAgPG1lbnUgbmFtZT0iQXBhY2hlIE15RmFjZXMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9kb3dubG9hZC5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgbmFtZT0iQ29udGVudHMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9Ik1haW4gU2l0ZSIgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgPGl0ZW0gbmFtZT0iRXh0VmFsIGZvciBKU0YgMS4xIiAgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IkNvcmUgTW9kdWxlIiAgICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExL215ZmFjZXMtZXh0dmFsLWNvcmUvaW5kZXguaHRtbCIvPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJQcm9wZXJ0eSBWYWxpZGF0aW9uIiAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS92YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iVHJpbmlkYWQgU3VwcG9ydCIgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQvaW5kZXguaHRtbCIvPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJHZW5lcmljIFN1cHBvcnQiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS9jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0L2luZGV4Lmh0bWwiLz4KLSAgICAgICAgPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjIiICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2luZGV4Lmh0bWwiIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9ImR1bW15IiAgICAgICAgaHJlZj0iZHVtbXkiLz4KLSAgICAgICAgPC9pdGVtPgotICAgIDwvbWVudT4KLQkKLSAgICA8bWVudSBuYW1lPSJEb2N1bWVudGF0aW9uIj4KLSAgICAgIDxpdGVtIG5hbWU9Ildpa2kiICAgICAgICAgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9teWZhY2VzL0V4dGVuc2lvbnMvVmFsaWRhdG9yLyIvPgotICAgICAgPGl0ZW0gbmFtZT0iSmF2YWRvYyIgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvamF2YWRvYy5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgcmVmPSJyZXBvcnRzIi8+Ci0KLSAgICA8bWVudSBuYW1lPSJGb3VuZGF0aW9uIiBpbmhlcml0PSJib3R0b20iPgotICAgICAgPGl0ZW0gbmFtZT0iQVNGIiAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iIC8+Ci0gICAgICA8aXRlbSBuYW1lPSJTcG9uc29yc2hpcCIgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vc3BvbnNvcnNoaXAuaHRtbCIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlRoYW5rcyIgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi90aGFua3MuaHRtbCIgLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvcG9tLnhtbCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgyY2FkMC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtbW9kdWxlPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgTW9kdWxlPC9uYW1lPgotICAgIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExPC91cmw+Ci0gICAgCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMV8xLzwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzFfMS88L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzFfMS88L3VybD4KLSAgICA8L3NjbT4gICAgCi0KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDx1bmlxdWVWZXJzaW9uPmZhbHNlPC91bmlxdWVWZXJzaW9uPgotICAgICAgICAgICAgPGlkPmFwYWNoZS5zbmFwc2hvdHM8L2lkPgotICAgICAgICAgICAgPG5hbWU+QXBhY2hlIE1hdmVuIFNuYXBzaG90IFJlcG9zaXRvcnk8L25hbWU+Ci0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4KLSAgICAgICAgPC9zbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgICAgIDxzaXRlPgotICAgICAgICAgICAgPGlkPmFwYWNoZS1zaXRlPC9pZD4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyPC91cmw+Ci0gICAgICAgIDwvc2l0ZT4KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0KLSAgICA8IS0tIFdBUk5JTkc6IERPIE5PVCBHRU5FUkFURSBTSVRFIEZST00gSEVSRSBESVJFQ1RMWQotICAgIFNpbmNlIHRoaXMgcHJvamVjdCBoYXMgYW4gYXN5bmMgcmVsZWFzZSBwcm9jZWR1cmUgKG5vdAotICAgIGFsbCBtb2R1bGVzIHNob3VsZCBiZSByZWxlYXNlZCBhdCBvbmNlKSwgdGhlIHBhcmVudCBwb20ueG1sIAotICAgIGlzIG5vdCB0aGlzICh0aGVyZSBpcyBhIG1vZHVsZSBmb3IgdGhhdCkuIFVzZSBtYXZlbiBzaXRlIAotICAgIHBsdWdpbiBoZXJlIGNhdXNlIHByb2JsZW1zIHdoZW4gdGhlIHNpdGUgaXMgZ2VuZXJhdGVkLgotICAgIFRoZSBwcm9jZWR1cmUgbXVzdCBleGVjdXRlIHNpdGUgY29tbW1hbmQgZmlyc3Qgb24gcGFyZW50IAotICAgIG1vZHVsZSBhbmQgdGhlbiBvbiBlYWNoIG1vZHVsZSBsaXN0ZWQgYmVsb3cuIAotICAgICAtLT4KLQotICAgIDxtb2R1bGVzPgotICAgICAgICA8bW9kdWxlPnBhcmVudDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmNvcmU8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT52YWxpZGF0aW9uLW1vZHVsZXM8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5jb21wb25lbnQtc3VwcG9ydDwvbW9kdWxlPgotICAgICAgICA8IS0tbW9kdWxlPnRlc3QtbW9kdWxlczwvbW9kdWxlLS0+Ci0gICAgICAgIDwhLS1tb2R1bGU+ZXhhbXBsZXM8L21vZHVsZS0tPgotICAgIDwvbW9kdWxlcz4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPCEtLSBUaGlzIHByb2ZpbGUgaXMgaW52b2tlZCBieSAtRHByZXBhcmVSZWxlYXNlPXRydWUuICBUaGlzIGFsbG93cyBtdm4gcmVsZWFzZTpwcmVwYXJlIHRvCi0gICAgICAgICAgICBydW4gc3VjY2Vzc2Z1bGx5IG9uIHRoZSBhc3NlbWJseSBwcm9qZWN0cy4gLS0+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPnByZXBhcmUtcmVsZWFzZTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPnByZXBhcmVSZWxlYXNlPC9uYW1lPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8bW9kdWxlcz4KLSAgICAgICAgICAgICAgICA8bW9kdWxlPmFzc2VtYmx5PC9tb2R1bGU+Ci0gICAgICAgICAgICA8L21vZHVsZXM+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZWxlYXNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+LURwcmVwYXJlUmVsZWFzZTwvYXJndW1lbnRzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLSAgICAKLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGpzZi52ZXJzaW9uPjEuMS41PC9qc2YudmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3BvbS54bWwgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U1YjBhNS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIEJhc2UtVGVzdC1JbmZyYXN0cnVjdHVyZTwvbmFtZT4NCi0gICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+dGVzdC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYxY2Y5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL0Fic3RyYWN0RXhWYWxUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9BYnN0cmFjdEV4VmFsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIyMWUxOS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL0Fic3RyYWN0RXhWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2U7DQotDQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUlucHV0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkV4dFZhbFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5EZWZhdWx0RmFjdG9yeUZpbmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlByb2plY3RTdGFnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5FTEhlbHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuQWJzdHJhY3RFTEhlbHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UubW9jay5Nb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrLk1vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLm1vY2suTW9ja01ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLm1vY2suTW9ja0VMSGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLnV0aWwuVGVzdFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuc2hhcmVkX2ltcGwuY29uZmlnLk15ZmFjZXNDb25maWc7DQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0V4dGVybmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0ZhY2VzQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0ZhY2VzQ29udGV4dEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tIdHRwU2VydmxldFJlcXVlc3Q7DQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tIdHRwU2VydmxldFJlc3BvbnNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrSHR0cFNlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tMaWZlY3ljbGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tMaWZlY3ljbGVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrUmVuZGVyS2l0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrUmVzcG9uc2VXcml0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tTZXJ2bGV0Q29uZmlnOw0KLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrU2VydmxldENvbnRleHQ7DQotDQotLyoqDQotICogQWJzdHJhY3QgU2hhbGUgVGVzdCBiYXNlIGNsYXNzLCB3aGljaCBzZXRzIHVwIHRoZSBKU0YgZW52aXJvbm1lbnQuICBJZiB0aGUgdGVzdA0KLSAqIG92ZXJyaWRlcyA8Y29kZT5zZXRVcCgpPC9jb2RlPiBhbmQvb3IgPGNvZGU+dGVhckRvd24oKTwvY29kZT4sIHRoZW4gdGhvc2UNCi0gKiBtZXRob2RzIGJ1dCBjYWxsIHRoZSBvdmVyd2l0dGVuIG1ldGhvZCB0byBpbnN1cmUgYSB2YWxpZCB0ZXN0IGVudmlyb25tZW50Lg0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEV4VmFsVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0gICAgcHJvdGVjdGVkIE1vY2tBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbjsNCi0gICAgcHJvdGVjdGVkIE1vY2tTZXJ2bGV0Q29uZmlnIGNvbmZpZzsNCi0gICAgcHJvdGVjdGVkIE1vY2tFeHRlcm5hbENvbnRleHQgZXh0ZXJuYWxDb250ZXh0Ow0KLSAgICBwcm90ZWN0ZWQgTW9ja0ZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQ7DQotICAgIHByb3RlY3RlZCBNb2NrRmFjZXNDb250ZXh0RmFjdG9yeSBmYWNlc0NvbnRleHRGYWN0b3J5Ow0KLSAgICBwcm90ZWN0ZWQgTW9ja0xpZmVjeWNsZSBsaWZlY3ljbGU7DQotICAgIHByb3RlY3RlZCBNb2NrTGlmZWN5Y2xlRmFjdG9yeSBsaWZlY3ljbGVGYWN0b3J5Ow0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyS2l0IHJlbmRlcktpdDsNCi0gICAgcHJvdGVjdGVkIE1vY2tIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdDsNCi0gICAgcHJvdGVjdGVkIE1vY2tIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlOw0KLSAgICBwcm90ZWN0ZWQgTW9ja1NlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0Ow0KLSAgICBwcm90ZWN0ZWQgTW9ja0h0dHBTZXNzaW9uIHNlc3Npb247DQotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyOw0KLQ0KLSAgICAvKiogUmVzcG9uc2UgV3JpdGVyICovDQotICAgIHByaXZhdGUgTW9ja1Jlc3BvbnNlV3JpdGVyIHdyaXRlcjsNCi0NCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBBYnN0cmFjdEV4VmFsVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgYXBwbGljYXRpb24gPSBudWxsOw0KLSAgICAgICAgY29uZmlnID0gbnVsbDsNCi0gICAgICAgIGV4dGVybmFsQ29udGV4dCA9IG51bGw7DQotICAgICAgICBmYWNlc0NvbnRleHQgPSBudWxsOw0KLSAgICAgICAgZmFjZXNDb250ZXh0RmFjdG9yeSA9IG51bGw7DQotICAgICAgICBsaWZlY3ljbGUgPSBudWxsOw0KLSAgICAgICAgbGlmZWN5Y2xlRmFjdG9yeSA9IG51bGw7DQotICAgICAgICByZW5kZXJLaXQgPSBudWxsOw0KLSAgICAgICAgcmVxdWVzdCA9IG51bGw7DQotICAgICAgICByZXNwb25zZSA9IG51bGw7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dCA9IG51bGw7DQotICAgICAgICBzZXNzaW9uID0gbnVsbDsNCi0gICAgICAgIHRocmVhZENvbnRleHRDbGFzc0xvYWRlciA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqICBTZXR1cCB0aGUgdGVzdCBlbnZpcm9ubWVudCwgaW5jbHVkaW5nIHRoZSBmb2xsb3dpbmc6DQotICAgICAqICA8dWw+DQotICAgICAqICA8bGk+U2V0IHRoZSBBcHBsaWNhdGlvbiBNYXAuPC9saT4NCi0gICAgICogIDxsaT5TZXQgYSByZXNwb25zZSB3cml0ZXI8L2xpPg0KLSAgICAgKiAgPGxpPkFkZCBUb21haGF3aydzIHJlbmRlcmVycyB0byB0aGUgZmFjZXMgY29udGV4dC48L2xpPg0KLSAgICAgKiAgPC91bD4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOw0KLSAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIobmV3IFVSTENsYXNzTG9hZGVyKG5ldyBVUkxbMF0sIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkpOw0KLSAgICAgICAgc2VydmxldENvbnRleHQgPSBuZXcgTW9ja1NlcnZsZXRDb250ZXh0KCk7DQotICAgICAgICAvL2ZvciB0ZXN0aW5nIHRoZSBmYWxsYmFjaw0KLSAgICAgICAgLy9zZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVggKyAiLkRFQUNUSVZBVEVfRUxfUkVTT0xWRVIiLCAidHJ1ZSIpOw0KLSAgICAgICAgc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihFeHRWYWxJbmZvcm1hdGlvbi5XRUJYTUxfUEFSQU1fUFJFRklYICsgIi5DVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZIiwgTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCArICIuQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSIsIE1vY2tNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVggKyAiLkNVU1RPTV9NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSIsIE1vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgY29uZmlnID0gbmV3IE1vY2tTZXJ2bGV0Q29uZmlnKHNlcnZsZXRDb250ZXh0KTsNCi0gICAgICAgIHNlc3Npb24gPSBuZXcgTW9ja0h0dHBTZXNzaW9uKCk7DQotICAgICAgICBzZXNzaW9uLnNldFNlcnZsZXRDb250ZXh0KHNlcnZsZXRDb250ZXh0KTsNCi0gICAgICAgIHJlcXVlc3QgPSBuZXcgTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdChzZXNzaW9uKTsNCi0gICAgICAgIHJlcXVlc3Quc2V0U2VydmxldENvbnRleHQoc2VydmxldENvbnRleHQpOw0KLSAgICAgICAgcmVzcG9uc2UgPSBuZXcgTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2UoKTsNCi0gICAgICAgIEZhY3RvcnlGaW5kZXIucmVsZWFzZUZhY3RvcmllcygpOw0KLSAgICAgICAgRmFjdG9yeUZpbmRlci5zZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3RvcnkiLCAib3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0FwcGxpY2F0aW9uRmFjdG9yeSIpOw0KLSAgICAgICAgRmFjdG9yeUZpbmRlci5zZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dEZhY3RvcnkiLCAib3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0ZhY2VzQ29udGV4dEZhY3RvcnkiKTsNCi0gICAgICAgIEZhY3RvcnlGaW5kZXIuc2V0RmFjdG9yeSgiamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZUZhY3RvcnkiLCAib3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0xpZmVjeWNsZUZhY3RvcnkiKTsNCi0gICAgICAgIEZhY3RvcnlGaW5kZXIuc2V0RmFjdG9yeSgiamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3RvcnkiLCAib3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1JlbmRlcktpdEZhY3RvcnkiKTsNCi0gICAgICAgIGV4dGVybmFsQ29udGV4dCA9IG5ldyBNb2NrRXh0ZXJuYWxDb250ZXh0KHNlcnZsZXRDb250ZXh0LCByZXF1ZXN0LCByZXNwb25zZSk7DQotICAgICAgICBsaWZlY3ljbGVGYWN0b3J5ID0gKE1vY2tMaWZlY3ljbGVGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZUZhY3RvcnkiKTsNCi0gICAgICAgIGxpZmVjeWNsZSA9IChNb2NrTGlmZWN5Y2xlKWxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlKCJERUZBVUxUIik7DQotICAgICAgICBmYWNlc0NvbnRleHRGYWN0b3J5ID0gKE1vY2tGYWNlc0NvbnRleHRGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHRGYWN0b3J5Iik7DQotICAgICAgICBmYWNlc0NvbnRleHQgPSAoTW9ja0ZhY2VzQ29udGV4dClmYWNlc0NvbnRleHRGYWN0b3J5LmdldEZhY2VzQ29udGV4dChzZXJ2bGV0Q29udGV4dCwgcmVxdWVzdCwgcmVzcG9uc2UsIGxpZmVjeWNsZSk7DQotICAgICAgICBleHRlcm5hbENvbnRleHQgPSAoTW9ja0V4dGVybmFsQ29udGV4dClmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCk7DQotICAgICAgICBVSVZpZXdSb290IHJvb3QgPSBuZXcgVUlWaWV3Um9vdCgpOw0KLSAgICAgICAgcm9vdC5zZXRWaWV3SWQoIi92aWV3SWQiKTsNCi0gICAgICAgIHJvb3Quc2V0UmVuZGVyS2l0SWQoIkhUTUxfQkFTSUMiKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5zZXRWaWV3Um9vdChyb290KTsNCi0gICAgICAgIEFwcGxpY2F0aW9uRmFjdG9yeSBhcHBsaWNhdGlvbkZhY3RvcnkgPSAoQXBwbGljYXRpb25GYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5Iik7DQotICAgICAgICBhcHBsaWNhdGlvbiA9IChNb2NrQXBwbGljYXRpb24pYXBwbGljYXRpb25GYWN0b3J5LmdldEFwcGxpY2F0aW9uKCk7DQotICAgICAgICBmYWNlc0NvbnRleHQuc2V0QXBwbGljYXRpb24oYXBwbGljYXRpb24pOw0KLSAgICAgICAgUmVuZGVyS2l0RmFjdG9yeSByZW5kZXJLaXRGYWN0b3J5ID0gKFJlbmRlcktpdEZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeSIpOw0KLSAgICAgICAgLy9XcmFwIHJlbmRlcmVycyB3aXRoIHByb3BlciBleHZhbCB3cmFwcGVyDQotICAgICAgICByZW5kZXJLaXQgPSBuZXcgRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkuY3JlYXRlKG5ldyBNb2NrUmVuZGVyS2l0KCkpOw0KLSAgICAgICAgcmVuZGVyS2l0RmFjdG9yeS5hZGRSZW5kZXJLaXQoIkhUTUxfQkFTSUMiLCByZW5kZXJLaXQpOw0KLQ0KLSAgICAgICAgLy8gYWRkaXRpb25hbCBzZXR1cCBub3QgcHJvdmlkZWQgYXV0b21hdGljYWxseSBieSB0aGUgc2hhbGUgbW9jayBzdHVmZg0KLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uTWFwKCkucHV0KE15ZmFjZXNDb25maWcuY2xhc3MuZ2V0TmFtZSgpLCBuZXcgTXlmYWNlc0NvbmZpZygpKTsNCi0gICAgICAgIHdyaXRlciA9IG5ldyBNb2NrUmVzcG9uc2VXcml0ZXIobmV3IFN0cmluZ1dyaXRlcigpLCBudWxsLCBudWxsKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5zZXRSZXNwb25zZVdyaXRlcih3cml0ZXIpOw0KLQ0KLSAgICAgICAgVGVzdFV0aWxzLmFkZERlZmF1bHRSZW5kZXJlcnMoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIFRlc3RVdGlscy5hZGREZWZhdWx0VmFsaWRhdG9ycyhmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgZmluYWwgRUxIZWxwZXIgZGVmYXVsdEVsSGVscGVyID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRUxfSEVMUEVSX0ZBQ1RPUlksIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuc2V0Q3VzdG9tRUxIZWxwZXJGYWN0b3J5KG5ldyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeSgpIHsNCi0NCi0gICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBFTEhlbHBlciBjcmVhdGVFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2NrRUxIZWxwZXIoZGVmYXVsdEVsSGVscGVyKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSk7DQotICAgICAgICANCi0gICAgICAgIC8vZXhlY3V0ZSBzdGFydHVwIGxpc3RlbmVyDQotICAgICAgICBuZXcgRXh0VmFsU3RhcnR1cExpc3RlbmVyKCkgew0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoUHJvamVjdFN0YWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpLCBnZXRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpLCBmYWxzZSk7DQotICAgICAgICAgICAgICAgIHN1cGVyLmluaXQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9LmluaXQoKTsNCi0NCi0gICAgICAgIGludm9rZVN0YXJ0dXBMaXN0ZW5lcnMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbnZva2VTdGFydHVwTGlzdGVuZXJzKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBUZWFyIGRvd24gdGhlIHRlc3QgZW52aXJvbm1lbnQuDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgcmVzZXRGYWN0b3J5RmluZGVyKCk7DQotICAgICAgICByZXNldEV4dFZhbENvbnRleHQoKTsNCi0NCi0gICAgICAgIGFwcGxpY2F0aW9uID0gbnVsbDsNCi0gICAgICAgIGNvbmZpZyA9IG51bGw7DQotICAgICAgICBleHRlcm5hbENvbnRleHQgPSBudWxsOw0KLSAgICAgICAgZmFjZXNDb250ZXh0LnJlbGVhc2UoKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dCA9IG51bGw7DQotICAgICAgICBsaWZlY3ljbGUgPSBudWxsOw0KLSAgICAgICAgbGlmZWN5Y2xlRmFjdG9yeSA9IG51bGw7DQotICAgICAgICByZW5kZXJLaXQgPSBudWxsOw0KLSAgICAgICAgcmVxdWVzdCA9IG51bGw7DQotICAgICAgICByZXNwb25zZSA9IG51bGw7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dCA9IG51bGw7DQotICAgICAgICBzZXNzaW9uID0gbnVsbDsNCi0gICAgICAgIEZhY3RvcnlGaW5kZXIucmVsZWFzZUZhY3RvcmllcygpOw0KLSAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIodGhyZWFkQ29udGV4dENsYXNzTG9hZGVyKTsNCi0gICAgICAgIHRocmVhZENvbnRleHRDbGFzc0xvYWRlciA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0RmFjdG9yeUZpbmRlcigpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZpZWxkIGZhY3RvcnlNYXAgPSBEZWZhdWx0RmFjdG9yeUZpbmRlci5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJmYWN0b3J5TWFwIik7DQotICAgICAgICAgICAgZmFjdG9yeU1hcC5zZXRBY2Nlc3NpYmxlKHRydWUpOw0KLSAgICAgICAgICAgIGZhY3RvcnlNYXAuc2V0KEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKSwgbmV3IEhhc2hNYXA8RmFjdG9yeU5hbWVzLCBPYmplY3Q+KCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbm5vdCByZXNldCB0aGUgZmFjdG9yeSBmaW5kZXIiLCB0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXNldEV4dFZhbENvbnRleHQoKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBGaWVsZCBjb250ZXh0ID0gRXh0VmFsQ29udGV4dC5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJleHRWYWxDb250ZXh0Iik7DQotICAgICAgICAgICAgY29udGV4dC5zZXRBY2Nlc3NpYmxlKHRydWUpOw0KLSAgICAgICAgICAgIGNvbnRleHQuc2V0KEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLCBudWxsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjYW5ub3QgcmVzZXQgdGhlIGV4dHZhbC1jb250ZXh0IiwgdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tNZXNzYWdlQ291bnQoaW50IGV4cGVjdGVkKQ0KLSAgICB7DQotICAgICAgICBpbnQgYWN0dWFsID0gMDsNCi0gICAgICAgIGZvcihJdGVyYXRvciBtZXNzYWdlcyA9IGZhY2VzQ29udGV4dC5nZXRNZXNzYWdlcygpOyBtZXNzYWdlcy5oYXNOZXh0KCk7KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1lc3NhZ2VzLm5leHQoKTsNCi0gICAgICAgICAgICBhY3R1YWwrKzsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGFzc2VydEVxdWFscygiQ29tcGxldGUgbWVzc2FnZSBjb3VudCIsIGV4cGVjdGVkLCBhY3R1YWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrTWVzc2FnZUNvdW50KFN0cmluZyBjbGllbnRJZCwgaW50IGV4cGVjdGVkKQ0KLSAgICB7DQotICAgICAgICBpbnQgYWN0dWFsID0gMDsNCi0gICAgICAgIGZvcihJdGVyYXRvciBtZXNzYWdlcyA9IGZhY2VzQ29udGV4dC5nZXRNZXNzYWdlcyhjbGllbnRJZCk7IG1lc3NhZ2VzLmhhc05leHQoKTspDQotICAgICAgICB7DQotICAgICAgICAgICAgbWVzc2FnZXMubmV4dCgpOw0KLSAgICAgICAgICAgIGFjdHVhbCsrOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb21wbGV0ZSBtZXNzYWdlIGNvdW50IiwgZXhwZWN0ZWQsIGFjdHVhbCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU2V2ZXJpdHkuLi4gc2V2ZXJpdGllcykNCi0gICAgew0KLSAgICAgICAgaW50IGkgPSAwOw0KLSAgICAgICAgZm9yKEl0ZXJhdG9yIG1lc3NhZ2VzID0gZmFjZXNDb250ZXh0LmdldE1lc3NhZ2VzKCk7IG1lc3NhZ2VzLmhhc05leHQoKTspDQotICAgICAgICB7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNldmVyaXRpZXNbaV0sICgoRmFjZXNNZXNzYWdlKW1lc3NhZ2VzLm5leHQoKSkuZ2V0U2V2ZXJpdHkoKSk7DQotICAgICAgICAgICAgaSsrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGJvb2xlYW4gaXNCbG9ja2VkKQ0KLSAgICB7DQotICAgICAgICBhc3NlcnRFcXVhbHMoaXNCbG9ja2VkLCB0aGlzLmZhY2VzQ29udGV4dC5nZXRSZW5kZXJSZXNwb25zZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVmVyaWZ5IHRoZSBmb2xsb3dpbmc6DQotICAgICAqIDx1bD4NCi0gICAgICogPGxpPmlkIGlzIG5vdCBudWxsPC9saT4NCi0gICAgICogPGxpPlJlc3BvbnNlIGlzIGNvbXBsZXRlPC9saT4NCi0gICAgICogPGxpPlJlc3BvbmNlIGNvbnRhaW5zIHRoZSBpZDwvbGk+DQotICAgICAqIDwvdWw+DQotICAgICAqDQotICAgICAqIEBwYXJhbSBpZCBJRCB0byB2ZXJpZnkNCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydElkRXhpc3RzKFN0cmluZyBpZCkNCi0gICAgew0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiSUQgaXMgbm90IG51bGwiLCBpZCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJSZXNwb25zZSBDb21wbGV0ZSIsIGZhY2VzQ29udGV4dC5nZXRSZXNwb25zZUNvbXBsZXRlKCkpOw0KLSAgICAgICAgU3RyaW5nIG91dHB1dCA9IHdyaXRlci5nZXRXcml0ZXIoKS50b1N0cmluZygpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiSGFzIG91dHB1dCIsIG91dHB1dCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJDb250YWlucyBpZCAnIiArIGlkICsgIiciLCBvdXRwdXQuaW5kZXhPZihpZCkgIT0gLTEpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVZhbHVlQmluZGluZyhVSUlucHV0IHVpSW5wdXQsIFN0cmluZyBuYW1lLCBTdHJpbmcgZXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nIHZhbHVlQmluZGluZyA9IGFwcGxpY2F0aW9uLmNyZWF0ZVZhbHVlQmluZGluZyhleHByZXNzaW9uKTsNCi0NCi0gICAgICAgIGlmKHVpSW5wdXQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB1aUlucHV0LnNldFZhbHVlQmluZGluZyhuYW1lLCB2YWx1ZUJpbmRpbmcpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKFN0cmluZyBuYW1lLCBPYmplY3QgaW5zdGFuY2UpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhudWxsLCAidmFsdWUiLCAiI3siICsgbmFtZSArICJ9Iik7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dChuYW1lLCBpbnN0YW5jZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIDxUPiBUIHJlc29sdmVCZWFuKFN0cmluZyBuYW1lLCBDbGFzczxUPiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChUKSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4obmFtZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL01vY2tFTEhlbHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL01vY2tFTEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWIyMWUxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrRUxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UubW9jazsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi0NCi1wdWJsaWMgY2xhc3MgTW9ja0VMSGVscGVyIGltcGxlbWVudHMgRUxIZWxwZXINCi17DQotICAgIHByaXZhdGUgRUxIZWxwZXIgd3JhcHBlZDsNCi0NCi0gICAgcHVibGljIE1vY2tFTEhlbHBlcihFTEhlbHBlciB3cmFwcGVkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmVhbihTdHJpbmcgYmVhbk5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldEJlYW4oYmVhbk5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBpZigiI3t0cnVlfSIuZXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFR5cGVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvcGVydHlEZXRhaWxzIGdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaXNFTFRlcm1WYWxpZChmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtV2VsbEZvcm1lZChPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaXNFTFRlcm1XZWxsRm9ybWVkKG8pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmluZGluZ09mQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0QmluZGluZ09mQ29tcG9uZW50KHVpQ29tcG9uZW50LCBuYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svTW9ja01lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDUzODliLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTW9ja01lc3NhZ2VSZXNvbHZlckZhY3RvcnkgZXh0ZW5kcyBEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeQ0KLXsNCi0gICAgcHVibGljIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXRSZWdpc3RlcmVkTmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TmFtZU1hcHBlckxpc3QoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svTW9ja01ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svTW9ja01ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMGQ1ZDguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL01vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIE1vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSBleHRlbmRzIERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeQ0KLXsNCi0gICAgcHVibGljIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXRSZWdpc3RlcmVkTmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TmFtZU1hcHBlckxpc3QoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTY0MmJhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIE1vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5IGV4dGVuZHMgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGNyZWF0ZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIC8vZm9yY2UgaW5pdCBzbyB0aGF0IGV2ZXJ5IHRlc3QtY2FzZSBzZXR1cCBtZXRob2QgY2FuIGFkZCBhIG1vY2sgdmFsaWRhdGlvbiBzdHJhdGVneSB2aWEgZXh0dmFsIGphdmEtYXBpDQotICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodGhpcyxSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoZ2V0Q2xhc3MoKSwgImluaXRTdGF0aWNNYXBwaW5ncyIpKTsNCi0gICAgICAgIHJldHVybiBzdXBlci5jcmVhdGUobWV0YURhdGFLZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gZ2V0UmVnaXN0ZXJlZE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldE5hbWVNYXBwZXJMaXN0KCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS91dGlsL01ldGhvZFV0aWxzLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvTWV0aG9kVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThmMmUyNC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvTWV0aG9kVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UudXRpbDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotLy9UT0RPDQotcHVibGljIGNsYXNzIE1ldGhvZFV0aWxzDQotew0KLSAgICBwcml2YXRlIE1ldGhvZFV0aWxzKCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja01ldGhvZENhbGxlZChDbGFzcyB1c2VkQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBpbnQgY2FsbENvdW50KQ0KLSAgICB7DQotICAgICAgICBjaGVja1JlcXVpcmVkQ2xhc3ModXNlZENsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiBjYWxsQ291bnQgPT0gZ2V0TWV0aG9kQ2FsbENvdW50KHVzZWRDbGFzcywgbWV0aG9kTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWV0aG9kQ2FsbGVkKENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpDQotICAgIHsNCi0gICAgICAgIGNoZWNrUmVxdWlyZWRDbGFzcyh1c2VkQ2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkNCi0gICAgICAgICAgICAgICAgLmNvbnRhaW5zS2V5KHVzZWRDbGFzcy5nZXROYW1lKCkgKyAiIyIgKyBtZXRob2ROYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2lnbmFsTWV0aG9kQ2FsbGVkKENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIGludCBtZXRob2RDYWxsQ291bnQgPSAwOw0KLSAgICAgICAgU3RyaW5nIGtleSA9IHVzZWRDbGFzcy5nZXROYW1lKCkgKyAiIyIgKyBtZXRob2ROYW1lOw0KLQ0KLSAgICAgICAgaWYocmVxdWVzdE1hcC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGhvZENhbGxDb3VudCA9IChJbnRlZ2VyKXJlcXVlc3RNYXAuZ2V0KGtleSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXF1ZXN0TWFwLnB1dChrZXksICsrbWV0aG9kQ2FsbENvdW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TWV0aG9kQ2FsbENvdW50KENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIFN0cmluZyBrZXkgPSB1c2VkQ2xhc3MuZ2V0TmFtZSgpICsgIiMiICsgbWV0aG9kTmFtZTsNCi0NCi0gICAgICAgIGlmKHJlcXVlc3RNYXAuY29udGFpbnNLZXkoa2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKEludGVnZXIpcmVxdWVzdE1hcC5nZXQoa2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaWduYWxDbGFzc1VzZWQoQ2xhc3MgbW9ja0NsYXNzKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgICAgIC5wdXQobW9ja0NsYXNzLmdldE5hbWUoKSArICI6dXNlZCIsIHRydWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NsYXNzVXNlZChDbGFzcyBtb2NrQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgICAgIC5jb250YWluc0tleShtb2NrQ2xhc3MuZ2V0TmFtZSgpICsgIjp1c2VkIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1JlcXVpcmVkQ2xhc3MoQ2xhc3MgdXNlZENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzQ2xhc3NVc2VkKHVzZWRDbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbih1c2VkQ2xhc3MuZ2V0TmFtZSgpICsgIiBub3QgdXNlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvdXRpbC9UZXN0VXRpbHMuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvdXRpbC9UZXN0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0ZjE0OS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvVGVzdFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS51dGlsOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWNlc0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotcHVibGljIGZpbmFsIGNsYXNzIFRlc3RVdGlscw0KLXsNCi0gICAgLyoqIERlZmF1bHQgTG9nZ2VyICovDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUZXN0VXRpbHMuY2xhc3MpOw0KLQ0KLSAgICAvKiogdXRpbGl0eSBjbGFzcywgZG8gbm90IGluc3RhbnRpYXRlICovDQotICAgIHByaXZhdGUgVGVzdFV0aWxzKCkNCi0gICAgew0KLSAgICAgICAgLy8gdXRpbGl0eSBjbGFzcywgZGlzYWJsZSBpbnN0YW50aWF0aW9uDQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZERlZmF1bHRWYWxpZGF0b3JzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpDQotICAgIHsNCi0gICAgICAgIGFkZFZhbGlkYXRvcihmYWNlc0NvbnRleHQsImphdmF4LmZhY2VzLkRvdWJsZVJhbmdlIiwgImphdmF4LmZhY2VzLnZhbGlkYXRvci5Eb3VibGVSYW5nZVZhbGlkYXRvciIpOw0KLSAgICAgICAgYWRkVmFsaWRhdG9yKGZhY2VzQ29udGV4dCwiamF2YXguZmFjZXMuTGVuZ3RoIiwgImphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3IiKTsNCi0gICAgICAgIGFkZFZhbGlkYXRvcihmYWNlc0NvbnRleHQsImphdmF4LmZhY2VzLkxvbmdSYW5nZSIsICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTG9uZ1JhbmdlVmFsaWRhdG9yIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFZhbGlkYXRvcihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0b3JJZCwgU3RyaW5nIHZhbGlkYXRvckNsYXNzKQ0KLSAgICB7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5hZGRWYWxpZGF0b3IodmFsaWRhdG9ySWQsIHZhbGlkYXRvckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQWRkIGFsbCBvZiBKU0YgMS4yIGRlZmF1bHQgcmVuZGVyZXJzLiAgQ3VycmVudGx5IHRoaXMgaXMgbm90IHRpZWQgdG8NCi0gICAgICogZmFjZXMtY29uZmlnLnhtbCwgc28gYWxsIGNoYW5nZSB0byB0aGUgZmlsZSBNVVNUIGFsc28gYmUgbWFkZSBoZXJlLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0DQotICAgICAqIEB0b2RvIERvIG5vdCBhZGQgcmVuZGVyZXIgaWYgcmVuZGVyZXIgaXMgYWxyZWFkeSBhZGRlZC4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGREZWZhdWx0UmVuZGVyZXJzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpDQotICAgIHsNCi0gICAgICAgIC8vIFN0YW5kYXJkIEhUTUwgUmVuZGVyZXJzDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5Db21tYW5kIiwgImphdmF4LmZhY2VzLkJ1dHRvbiIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEJ1dHRvblJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RCb29sZWFuIiwNCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkNoZWNrYm94IiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sQ2hlY2tib3hSZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0TWFueSIsDQotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5DaGVja2JveCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbENoZWNrYm94UmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkZvcm0iLCAiamF2YXguZmFjZXMuRm9ybSIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEZvcm1SZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuUGFuZWwiLCAiamF2YXguZmFjZXMuR3JpZCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEdyaWRSZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuUGFuZWwiLCAiamF2YXguZmFjZXMuR3JvdXAiLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxHcm91cFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5IaWRkZW4iLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxIaWRkZW5SZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuR3JhcGhpYyIsICJqYXZheC5mYWNlcy5JbWFnZSIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEltYWdlUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5MYWJlbCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbExhYmVsUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5MaW5rIiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlua1JlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5Db21tYW5kIiwgImphdmF4LmZhY2VzLkxpbmsiLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMaW5rUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsDQotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5MaXN0Ym94IiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlzdGJveFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RNYW55IiwNCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkxpc3Rib3giLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMaXN0Ym94UmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsICJqYXZheC5mYWNlcy5NZW51IiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTWVudVJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RNYW55IiwgImphdmF4LmZhY2VzLk1lbnUiLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxNZW51UmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk1lc3NhZ2UiLCAiamF2YXguZmFjZXMuTWVzc2FnZSIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lc3NhZ2VSZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuT3V0cHV0IiwgImphdmF4LmZhY2VzLkZvcm1hdCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEZvcm1hdFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5NZXNzYWdlcyIsDQotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5NZXNzYWdlcyIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lc3NhZ2VzUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsICJqYXZheC5mYWNlcy5SYWRpbyIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFJhZGlvUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLklucHV0IiwgImphdmF4LmZhY2VzLlNlY3JldCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFNlY3JldFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5EYXRhIiwgImphdmF4LmZhY2VzLlRhYmxlIiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGFibGVSZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuSW5wdXQiLCAiamF2YXguZmFjZXMuVGV4dGFyZWEiLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxUZXh0YXJlYVJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5UZXh0IiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGV4dFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5PdXRwdXQiLCAiamF2YXguZmFjZXMuVGV4dCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFRleHRSZW5kZXJlciIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBZGQgYSByZW5kZXJlciB0byB0aGUgRmFjZXNDb250ZXh0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IEZhY2VzIENvbnRleHQNCi0gICAgICogQHBhcmFtIGZhbWlseSBDb21wb25lbmV0IEZhbWlseQ0KLSAgICAgKiBAcGFyYW0gcmVuZGVyZXJUeXBlIENvbXBvbmVudCBUeXBlDQotICAgICAqIEBwYXJhbSByZW5kZXJDbGFzc05hbWUgQ2xhc3MgTmFtZSBvZiBSZW5kZXJlcg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFJlbmRlcmVyKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBmYW1pbHksDQotICAgICAgICAgICAgU3RyaW5nIHJlbmRlcmVyVHlwZSwgU3RyaW5nIHJlbmRlckNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSAoUmVuZGVyZXIpIG5ld0luc3RhbmNlKHJlbmRlckNsYXNzTmFtZSk7DQotICAgICAgICBSZW5kZXJLaXQga2l0ID0gZmFjZXNDb250ZXh0LmdldFJlbmRlcktpdCgpOw0KLSAgICAgICAga2l0LmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCByZW5kZXJlcik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRyaWVzIGEgQ2xhc3MubG9hZENsYXNzIHdpdGggdGhlIGNvbnRleHQgY2xhc3MgbG9hZGVyIG9mIHRoZSBjdXJyZW50IHRocmVhZCBmaXJzdCBhbmQNCi0gICAgICogYXV0b21hdGljYWxseSBmYWxscyBiYWNrIHRvIHRoZSBDbGFzc1V0aWxzIGNsYXNzIGxvYWRlciAoaS5lLiB0aGUgbG9hZGVyIG9mIHRoZQ0KLSAgICAgKiBteWZhY2VzLmphciBsaWIpIGlmIG5lY2Vzc2FyeS4NCi0gICAgICoNCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMNCi0gICAgICoNCi0gICAgICogQHBhcmFtIHR5cGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBub24tcHJpbWl0aXZlIG5vbi1hcnJheSBjbGFzcw0KLSAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIENsYXNzDQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdHlwZSBpcyBudWxsDQotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgY2xhc3NGb3JOYW1lKFN0cmluZyB0eXBlKQ0KLSAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpDQotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0eXBlIik7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvLyBUcnkgV2ViQXBwIENsYXNzTG9hZGVyIGZpcnN0DQotICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUodHlwZSwgZmFsc2UsIC8vIGRvIG5vdCBpbml0aWFsaXplIGZvciBmYXN0ZXIgc3RhcnR1cA0KLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gZmFsbGJhY2s6IFRyeSBDbGFzc0xvYWRlciBmb3IgQ2xhc3NVdGlscyAoaS5lLiB0aGUgbXlmYWNlcy5qYXIgbGliKQ0KLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKHR5cGUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXANCi0gICAgICAgICAgICAgICAgICAgIFRlc3RVdGlscy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2FtZSBhcyB7QGxpbmsgI2NsYXNzRm9yTmFtZShTdHJpbmcpfSwgYnV0IHRocm93cyBhIFJ1bnRpbWVFeGNlcHRpb24NCi0gICAgICogKEZhY2VzRXhjZXB0aW9uKSBpbnN0ZWFkIG9mIGEgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi4NCi0gICAgICoNCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMNCi0gICAgICoNCi0gICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBDbGFzcw0KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHR5cGUgaXMgbnVsbA0KLSAgICAgKiBAdGhyb3dzIGphdmF4LmZhY2VzLkZhY2VzRXhjZXB0aW9uIGlmIGNsYXNzIG5vdCBmb3VuZA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3Mgc2ltcGxlQ2xhc3NGb3JOYW1lKFN0cmluZyB0eXBlKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY2xhc3NGb3JOYW1lKHR5cGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2cuZXJyb3IoIkNsYXNzICIgKyB0eXBlICsgIiBub3QgZm91bmQiLCBlKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3Mgd2l0aCB0aGUgdHlwZSBvZiA8Y29kZT50eXBlPC9jb2RlPi4NCi0gICAgICoNCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMNCi0gICAgICoNCi0gICAgICogQHBhcmFtIHR5cGUgVHlwZSBvZiBuZXcgY2xhc3MuDQotICAgICAqIEByZXR1cm4gSW5zdGFuY2Ugb2YgdGhlIGNsYXNzIDxjb2RlPnR5cGU8L2NvZGU+DQotICAgICAqIEB0aHJvd3MgamF2YXguZmFjZXMuRmFjZXNFeGNlcHRpb24NCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgdHlwZSkgdGhyb3dzIEZhY2VzRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpDQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2Uoc2ltcGxlQ2xhc3NGb3JOYW1lKHR5cGUpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyA8Y29kZT5jbGF6ejwvY29kZT4uDQotICAgICAqDQotICAgICAqIE5vdGU6IFRoaXMgd2FzIGNvcGllZCBmcm9tIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWQudXRpbC5DbGFzc1V0aWxzDQotICAgICAqDQotICAgICAqIEBwYXJhbSBjbGF6eiBDbGFzcyB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YuDQotICAgICAqIEByZXR1cm4gSW5zdGFuY2Ugb2YgdGhlIGNsYXNzIDxjb2RlPmNsYXp6PC9jb2RlPg0KLSAgICAgKiBAdGhyb3dzIGphdmF4LmZhY2VzLkZhY2VzRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoQ2xhc3MgY2xhenopIHRocm93cyBGYWNlc0V4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY2xhenoubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ2xhc3MgOiAiICsgY2xhenouZ2V0TmFtZSgpICsgIiBub3QgZm91bmQuIiwgZSk7DQotICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBGYWNlc0V4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJlbmRlcmVyZWQgYSBjb21wb25lbnQsIGluY2x1ZGluZyBpdCdzIGNoaWxkcmVuLCB0aGVuIGNvbXBsZXRlIHRoZSByZXBvbnNlLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gY29udGV4dCBGYWNlcyBDb250ZXh0DQotICAgICAqIEBwYXJhbSBjb21wb25lbnQgQ29tcG9uZW50IHRvIGJlIHJlbmRlcmVkLg0KLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gVGhyb3duIHdoaWxlIHJlbmRlcmluZy4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW5kZXJDb21wb25lbnQoRmFjZXNDb250ZXh0IGNvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSBjb250ZXh0LmdldFJlbmRlcktpdCgpLmdldFJlbmRlcmVyKA0KLSAgICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0RmFtaWx5KCksIGNvbXBvbmVudC5nZXRSZW5kZXJlclR5cGUoKSk7DQotICAgICAgICByZW5kZXJlci5lbmNvZGVCZWdpbihjb250ZXh0LCBjb21wb25lbnQpOw0KLSAgICAgICAgcmVuZGVyZXIuZW5jb2RlQ2hpbGRyZW4oY29udGV4dCwgY29tcG9uZW50KTsNCi0gICAgICAgIHJlbmRlcmVyLmVuY29kZUVuZChjb250ZXh0LCBjb21wb25lbnQpOw0KLSAgICAgICAgY29udGV4dC5yZXNwb25zZUNvbXBsZXRlKCk7DQotICAgICAgICBjb250ZXh0LnJlbmRlclJlc3BvbnNlKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3BvbS54bWwgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU0ODY0OC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbi10ZXN0czwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBCZWFuLVZhbGlkYXRpb24tSW50ZWdyYXRpb24tVGVzdHM8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPnRlc3QtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8cmVwb3NpdG9yaWVzPg0KLSAgICAgICAgPHJlcG9zaXRvcnk+DQotICAgICAgICAgICAgPGlkPmpib3NzPC9pZD4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvc2l0b3J5Lmpib3NzLmNvbS9tYXZlbjI8L3VybD4NCi0gICAgICAgICAgICA8cmVsZWFzZXM+DQotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+DQotICAgICAgICAgICAgPC9yZWxlYXNlcz4NCi0gICAgICAgICAgICA8c25hcHNob3RzPg0KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4NCi0gICAgICAgICAgICA8L3NuYXBzaG90cz4NCi0gICAgICAgIDwvcmVwb3NpdG9yeT4NCi0gICAgICAgIDxyZXBvc2l0b3J5Pg0KLSAgICAgICAgICAgIDxpZD5qYm9zcy1zbmFwc2hvdDwvaWQ+DQotICAgICAgICAgICAgPHVybD5odHRwOi8vc25hcHNob3RzLmpib3NzLm9yZy9tYXZlbjI8L3VybD4NCi0gICAgICAgICAgICA8cmVsZWFzZXM+DQotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+DQotICAgICAgICAgICAgPC9yZWxlYXNlcz4NCi0gICAgICAgICAgICA8c25hcHNob3RzPg0KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPg0KLSAgICAgICAgICAgIDwvc25hcHNob3RzPg0KLSAgICAgICAgPC9yZXBvc2l0b3J5Pg0KLSAgICA8L3JlcG9zaXRvcmllcz4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnZhbGlkYXRpb248L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjAuR0E8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlLXRlc3RzPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5oaWJlcm5hdGU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGliZXJuYXRlLXZhbGlkYXRvcjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj40LjAuMC5HQTwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS40LjI8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjQuMjwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYxY2Y5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0Fic3RyYWN0QmVhblZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThjNGI3ZS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0Fic3RyYWN0QmVhblZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5BYnN0cmFjdEV4VmFsVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0YXJ0dXAuQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi0NCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RCZWFuVmFsaWRhdGlvblRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgQWJzdHJhY3RCZWFuVmFsaWRhdGlvblRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbnZva2VTdGFydHVwTGlzdGVuZXJzKCkNCi0gICAgew0KLSAgICAgICAgbmV3IEJlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyKCkgew0KLQ0KLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zMTI0MTgyMzU1NDQ0NzU0NDk3TDsNCi0NCi0gICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHN1cGVyLmluaXQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9LmluaXQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgbmV3IE1vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIoKS5hZnRlclBoYXNlKG5ldyBQaGFzZUV2ZW50KGZhY2VzQ29udGV4dCwgUGhhc2VJZC5VUERBVEVfTU9ERUxfVkFMVUVTLCBsaWZlY3ljbGUpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0Jhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzY4YWQxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWw7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJSW5wdXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTxUPiBleHRlbmRzIEFic3RyYWN0QmVhblZhbGlkYXRpb25UZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDMgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgICAgICBiZWFuID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICBwcm90ZWN0ZWQgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICBwcm90ZWN0ZWQgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDMgPSBudWxsOw0KLQ0KLSAgICBwcml2YXRlIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHByb3RlY3RlZCBUIGJlYW47DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgYmVhbiA9IGdldEJlYW5Ub1Rlc3QoKTsNCi0gICAgICAgIGJpbmRCZWFuVG9FeHByZXNzaW9uKCk7DQotDQotICAgICAgICBjcmVhdGVDb21wb25lbnRzKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbXBvbmVudHMoKQ0KLSAgICB7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsNCi0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsNCi0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MyA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Myk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0SWQoImlucHV0MSIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50My5zZXRJZCgiaW5wdXQzIik7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQ0KLSAgICBwcml2YXRlIHZvaWQgYmluZEJlYW5Ub0V4cHJlc3Npb24oKQ0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmcgdmIgPSBhcHBsaWNhdGlvbi5jcmVhdGVWYWx1ZUJpbmRpbmcoIiN7dGVzdEJlYW59Iik7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dCgidGVzdEJlYW4iLCBiZWFuKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVCBnZXRCZWFuVG9UZXN0KCk7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQzID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgYmVhbiA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KFVJSW5wdXQgdWlDb21wb25lbnQsIFN0cmluZyB2YWx1ZUJpbmRpbmcpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyh1aUNvbXBvbmVudCwgInZhbHVlIiwgdmFsdWVCaW5kaW5nKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZVRvVmFsaWRhdGUoVUlJbnB1dCB1aUNvbXBvbmVudCwgU3RyaW5nIHZhbHVlVG9WYWxpZGF0ZSkNCi0gICAgew0KLSAgICAgICAgdWlDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVUb1ZhbGlkYXRlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbXBvbmVudHMoKQ0KLSAgICB7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEucHJvY2Vzc1ZhbGlkYXRvcnMoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5wcm9jZXNzVmFsaWRhdG9ycyhmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQzLnByb2Nlc3NWYWxpZGF0b3JzKGZhY2VzQ29udGV4dCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29tcG9uZW50cygpDQotICAgIHsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5wcm9jZXNzVXBkYXRlcyhmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnByb2Nlc3NVcGRhdGVzKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDMucHJvY2Vzc1VwZGF0ZXMoZmFjZXNDb250ZXh0KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRDb21wb25lbnRWYWxpZChVSUlucHV0IHVpSW5wdXQpDQotICAgIHsNCi0gICAgICAgIGFzc2VydFRydWUoaXNDb21wb25lbnRWYWxpZCh1aUlucHV0KSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Q29tcG9uZW50SW52YWxpZChVSUlucHV0IHVpSW5wdXQpDQotICAgIHsNCi0gICAgICAgIGFzc2VydEZhbHNlKGlzQ29tcG9uZW50VmFsaWQodWlJbnB1dCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbXBvbmVudFZhbGlkKFVJSW5wdXQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudC5pc1ZhbGlkKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9DdXN0b21TZXZlcml0eTFUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9DdXN0b21TZXZlcml0eTFUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzdjOWZmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXcuQ3VzdG9tU2V2ZXJpdHlUZXN0Q2FzZTFQYWdlQmVhbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5jdXN0b20uQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21TZXZlcml0eTFUZXN0Q2FzZSBleHRlbmRzIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8Q3VzdG9tU2V2ZXJpdHlUZXN0Q2FzZTFQYWdlQmVhbj4NCi17DQotICAgIHB1YmxpYyBDdXN0b21TZXZlcml0eTFUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBDdXN0b21TZXZlcml0eVRlc3RDYXNlMVBhZ2VCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEN1c3RvbVNldmVyaXR5VGVzdENhc2UxUGFnZUJlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tUGF5bG9hZFZpYUdsb2JhbFByb3BlcnR5KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MuZ2V0TmFtZSgpLCBDdXN0b21WaW9sYXRpb25TZXZlcml0eS5XYXJuaW5nLmNsYXNzKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfV0FSTik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbVBheWxvYWRWaWFTdGF0aWNDb25maWcoKQ0KLSAgICB7DQotICAgICAgICBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcy5nZXROYW1lKCksIEN1c3RvbVZpb2xhdGlvblNldmVyaXR5Lldhcm5pbmcuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5WQUxJREFUSU9OX1BBUkFNRVRFUl9DT05GSUcsIGNvbmZpZyk7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmtub3duUGF5bG9hZCgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0RlZmF1bHRHcm91cFRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0RlZmF1bHRHcm91cFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZjNjNjEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9EZWZhdWx0R3JvdXBUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5UZXN0Q2FzZTFCZWFuOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0R3JvdXBUZXN0Q2FzZSBleHRlbmRzIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8VGVzdENhc2UxQmVhbj4NCi17DQotICAgIHB1YmxpYyBEZWZhdWx0R3JvdXBUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRGVmYXVsdEdyb3VwVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBUZXN0Q2FzZTFCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RDYXNlMUJlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90TnVsbFNldmVyaXR5RXJyb3IoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE5vdE51bGxTZXZlcml0eVdhcm4oKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXZlcml0eU9yZGVyKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTN9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICJhYiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4pOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uMVRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL01vZGVsVmFsaWRhdGlvbjFUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzJkMTUzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uMVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52aWV3Lk1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLlNpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbjsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi1wdWJsaWMgY2xhc3MgTW9kZWxWYWxpZGF0aW9uMVRlc3RDYXNlIGV4dGVuZHMNCi0gICAgICAgIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8TW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4+DQotew0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uMVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShNb2RlbFZhbGlkYXRpb24xVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbiBnZXRCZWFuVG9UZXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFZhbGlkYXRpb24oKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMS5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIxMjMiKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwxLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIjEyMyIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICB1cGRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxWaW9sYXRpb25XaXRoR2xvYmFsVmlvbGF0aW9uTWVzc2FnZVZpYVByb3BlcnR5KCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDEucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiMTIzIik7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMS5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICI0NTYiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgdXBkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxWaW9sYXRpb25XaXRoSW5saW5lVmlvbGF0aW9uTWVzc2FnZVZpYVByb3BlcnR5KCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDIucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiMTIzIik7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMi5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICI0NTYiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgdXBkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgLy9kdWUgdG8gZGlzcGxheU1lc3NhZ2VJbmxpbmUNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDIpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmlvbGF0aW9uV2l0aEdsb2JhbFZpb2xhdGlvbk1lc3NhZ2VWaWFGaWVsZCgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwzLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIjEyMyIpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDMucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiNDU2Iik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHVwZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmlvbGF0aW9uV2l0aElubGluZVZpb2xhdGlvbk1lc3NhZ2VWaWFGaWVsZCgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWw0LnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIjEyMyIpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiNDU2Iik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHVwZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIC8vZHVlIHRvIGRpc3BsYXlNZXNzYWdlSW5saW5lDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgyKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFZpb2xhdGlvbldpdGhBZG1pblJvbGUoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVSZXF1ZXN0U2NvcGVkQmVhbigiY3VycmVudFVzZXIiLCBuZXcgU2ltdWxhdGVkVXNlckluZm9ybWF0aW9uKCJhZG1pbiIpKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWw1LnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIjEyMyIpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDUucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiNDU2Iik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHVwZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFZpb2xhdGlvbldpdGhVc2VyUm9sZSgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJjdXJyZW50VXNlciIsIG5ldyBTaW11bGF0ZWRVc2VySW5mb3JtYXRpb24oInVzZXIiKSk7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsNS5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIxMjMiKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWw1LnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIjQ1NiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICB1cGRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uMlRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL01vZGVsVmFsaWRhdGlvbjJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2FiMTExLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uMlRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXcuTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW47DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvbjJUZXN0Q2FzZSBleHRlbmRzDQotICAgICAgICBCYXNlQmVhblZhbFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlPE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuPg0KLXsNCi0gICAgcHVibGljIE1vZGVsVmFsaWRhdGlvbjJUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTW9kZWxWYWxpZGF0aW9uMlRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4gZ2V0QmVhblRvVGVzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxWYWxpZGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbC5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIxMjMiKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiMTIzIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHVwZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFZpb2xhdGlvbldpdGhHbG9iYWxWaW9sYXRpb25NZXNzYWdlQ2xhc3NMZXZlbCgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiMTIzIik7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIjQ1NiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICB1cGRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uM1Rlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL01vZGVsVmFsaWRhdGlvbjNUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmExNWNlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uM1Rlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXcuTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UzUGFnZUJlYW47DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb24zVGVzdENhc2UgZXh0ZW5kcw0KLSAgICAgICAgQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTxNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTNQYWdlQmVhbj4NCi17DQotICAgIHB1YmxpYyBNb2RlbFZhbGlkYXRpb24zVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKE1vZGVsVmFsaWRhdGlvbjNUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlM1BhZ2VCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlM1BhZ2VCZWFuKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmFsaWRhdGlvbk5vVmlld0lkTWF0Y2goKQ0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZSgpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmFsaWRhdGlvblZpZXdJZE1hdGNoKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuc2V0Vmlld0lkKCIvcGFnZXMvbW9kZWxWYWxpZGF0aW9uQXdhcmVQYWdlLnhodG1sIik7DQotDQotICAgICAgICB2YWxpZGF0ZSgpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIjEyMyIpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbC5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICI0NTYiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgdXBkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbigpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uNFRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL01vZGVsVmFsaWRhdGlvbjRUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTE0NTM1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uNFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXcuTW9kZWxWYWxpZGF0aW9uVGVzdENhc2U0UGFnZUJlYW47DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb240VGVzdENhc2UgZXh0ZW5kcw0KLSAgICAgICAgQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTxNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTRQYWdlQmVhbj4NCi17DQotICAgIHB1YmxpYyBNb2RlbFZhbGlkYXRpb240VGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKE1vZGVsVmFsaWRhdGlvbjRUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlNFBhZ2VCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlNFBhZ2VCZWFuKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmFsaWRhdGlvbk5vVmlld0lkTWF0Y2goKQ0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZSgpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmFsaWRhdGlvblZpZXdJZE1hdGNoKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuc2V0Vmlld0lkKCIvcGFnZXMvbW9kZWxWYWxpZGF0aW9uQXdhcmVQYWdlLnhodG1sIik7DQotDQotICAgICAgICB2YWxpZGF0ZSgpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIjEyMyIpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbC5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICI0NTYiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgdXBkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbigpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvUmVzdHJpY3RHcm91cHNUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9SZXN0cmljdEdyb3Vwc1Rlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNGRmNWQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9SZXN0cmljdEdyb3Vwc1Rlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52aWV3LlJlc3RyaWN0R3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuU2ltdWxhdGVkVXNlckluZm9ybWF0aW9uOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVzdHJpY3RHcm91cHNUZXN0Q2FzZSBleHRlbmRzIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8UmVzdHJpY3RHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbj4NCi17DQotICAgIHB1YmxpYyBSZXN0cmljdEdyb3Vwc1Rlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZXN0cmljdEdyb3Vwc1Rlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgUmVzdHJpY3RHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbiBnZXRCZWFuVG9UZXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBSZXN0cmljdEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc3RyaWN0ZWRHcm91cCgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwxLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdHJpY3RlZEdyb3VwV2l0aEFkbWluUm9sZSgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJjdXJyZW50VXNlciIsIG5ldyBTaW11bGF0ZWRVc2VySW5mb3JtYXRpb24oImFkbWluIikpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDIucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDIucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc3RyaWN0ZWRHcm91cFdpdGhVc2VyUm9sZSgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJjdXJyZW50VXNlciIsIG5ldyBTaW11bGF0ZWRVc2VySW5mb3JtYXRpb24oInVzZXIiKSk7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMi5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIiKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc3RyaWN0ZWRHcm91cFdpdGhDb3JyZWN0Vmlld0lkKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuc2V0Vmlld0lkKCIvcGFnZXMvZ3JvdXBWYWxpZGF0aW9uQXdhcmVQYWdlLnhodG1sIik7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMy5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMy5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIiKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdHJpY3RlZEdyb3VwV2l0aFdyb25nVmlld0lkKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDMucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDMucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VkQW5kUmVzdHJpY3RlZEdyb3VwKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvVXNlR3JvdXBWYWxpZGF0aW9uMVRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL1VzZUdyb3VwVmFsaWRhdGlvbjFUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGZmMmY1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvVXNlR3JvdXBWYWxpZGF0aW9uMVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldy5Vc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5TaW11bGF0ZWRVc2VySW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIFVzZUdyb3VwVmFsaWRhdGlvbjFUZXN0Q2FzZSBleHRlbmRzIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8VXNlR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4+DQotew0KLSAgICBwdWJsaWMgVXNlR3JvdXBWYWxpZGF0aW9uMVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShVc2VHcm91cFZhbGlkYXRpb24xVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBVc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbiBnZXRCZWFuVG9UZXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBVc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcm91cDFBd2FyZVZhbGlkYXRpb24oKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMS5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMS5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIiKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEdyb3VwMUFuZEdyb3VwMkF3YXJlVmFsaWRhdGlvbigpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwyLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwyLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDIpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEdyb3VwMkFuZEdyb3VwM0F3YXJlVmFsaWRhdGlvbldpdGhXcm9uZ1ZpZXdJZCgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwzLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwzLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgImciKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgInAiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEdyb3VwMkFuZEdyb3VwM0F3YXJlVmFsaWRhdGlvbldpdGhDb3JyZWN0Vmlld0lkMSgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLnNldFZpZXdJZCgiL3BhZ2VzL3BhZ2UxLnhodG1sIik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMy5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMy5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICJnIik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICJwIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgyKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcm91cDJBbmRHcm91cDNBd2FyZVZhbGlkYXRpb25XaXRoQ29ycmVjdFZpZXdJZDIoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5zZXRWaWV3SWQoIi9wYWdlcy9wYWdlMi54aHRtbCIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDMucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDMucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiZyIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAicCIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXAyQXdhcmVWYWxpZGF0aW9uV2l0aFJvbGVBZG1pbigpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJjdXJyZW50VXNlciIsIG5ldyBTaW11bGF0ZWRVc2VySW5mb3JtYXRpb24oImFkbWluIikpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiZyIpOyAvL2Rvbid0IGZvcmNlIGEgdmlvbGF0aW9uIHdpdGggR3JvdXAxDQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcm91cDJBbmRHcm91cDNBd2FyZVZhbGlkYXRpb25XaXRoUm9sZVVzZXIoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVSZXF1ZXN0U2NvcGVkQmVhbigiY3VycmVudFVzZXIiLCBuZXcgU2ltdWxhdGVkVXNlckluZm9ybWF0aW9uKCJ1c2VyIikpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiZyIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAicCIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL1VzZUdyb3VwVmFsaWRhdGlvbjJUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Vc2VHcm91cFZhbGlkYXRpb24yVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWViOWVlZS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL1VzZUdyb3VwVmFsaWRhdGlvbjJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldy5Vc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBVc2VHcm91cFZhbGlkYXRpb24yVGVzdENhc2UgZXh0ZW5kcyBCYXNlQmVhblZhbFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlPFVzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuPg0KLXsNCi0gICAgcHVibGljIFVzZUdyb3VwVmFsaWRhdGlvbjJUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVXNlR3JvdXBWYWxpZGF0aW9uMlRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgVXNlR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4gZ2V0QmVhblRvVGVzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVXNlR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXAxQXdhcmVWYWxpZGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbC5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL2N1c3RvbS9DdXN0b21WaW9sYXRpb25TZXZlcml0eS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9jdXN0b20vQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRlNTJiYS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL2N1c3RvbS9DdXN0b21WaW9sYXRpb25TZXZlcml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5jdXN0b207DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIEN1c3RvbVZpb2xhdGlvblNldmVyaXR5DQotew0KLSAgICBpbnRlcmZhY2UgV2FybmluZyBleHRlbmRzIFBheWxvYWQNCi0gICAgew0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Hcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwOGJlZTcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Hcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAxOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAzOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5QYXR0ZXJuOw0KLQ0KLXB1YmxpYyBjbGFzcyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuDQotew0KLSAgICBATm90TnVsbChncm91cHMgPSBHcm91cDEuY2xhc3MpDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0NCi0gICAgQFBhdHRlcm4ocmVnZXhwID0gIltBLVpdW2Etel0iLCBncm91cHMgPSBHcm91cDMuY2xhc3MpDQotICAgIEBTaXplKG1pbiA9IDMsIGdyb3VwcyA9IEdyb3VwMi5jbGFzcykNCi0gICAgQE5vdE51bGwoZ3JvdXBzID0gR3JvdXAyLmNsYXNzKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0dyb3VwVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4uamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDEzNDAyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uLkdyb3VwMTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uLkdyb3VwMjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLQ0KLXB1YmxpYyBjbGFzcyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuDQotew0KLSAgICBAQmVhblZhbGlkYXRpb24odXNlR3JvdXBzID0gR3JvdXAxLmNsYXNzKQ0KLSAgICBATm90TnVsbChncm91cHMgPSBHcm91cDEuY2xhc3MpDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0NCi0gICAgQE5vdE51bGwoZ3JvdXBzID0gR3JvdXAyLmNsYXNzKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4uamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTk3YmE2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uLkNsYXNzTGV2ZWxFcXVhbDsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLQ0KLUBDbGFzc0xldmVsRXF1YWwNCi1wdWJsaWMgY2xhc3MgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbg0KLXsNCi0gICAgQE5vdE51bGwNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkxOw0KLQ0KLSAgICBATm90TnVsbA0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4uamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTlmNTMxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uLkNsYXNzTGV2ZWxFcXVhbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi0NCi1AQ2xhc3NMZXZlbEVxdWFsDQotQEJlYW5WYWxpZGF0aW9uKHZpZXdJZHMgPSAiL3BhZ2VzL21vZGVsVmFsaWRhdGlvbkF3YXJlUGFnZS54aHRtbCIsDQotICAgICAgICBtb2RlbFZhbGlkYXRpb24gPSBATW9kZWxWYWxpZGF0aW9uKGlzQWN0aXZlID0gdHJ1ZSkpDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4NCi17DQotICAgIEBOb3ROdWxsDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0NCi0gICAgQE5vdE51bGwNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkyOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKFN0cmluZyBwcm9wZXJ0eTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9TaW11bGF0ZWRVc2VySW5mb3JtYXRpb24uamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvU2ltdWxhdGVkVXNlckluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYWNiMjcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9TaW11bGF0ZWRVc2VySW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWw7DQotDQotcHVibGljIGNsYXNzIFNpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbg0KLXsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7DQotDQotICAgIHB1YmxpYyBTaW11bGF0ZWRVc2VySW5mb3JtYXRpb24oU3RyaW5nIHZhbHVlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZG1pblJvbGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gImFkbWluIi5lcXVhbHModmFsdWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVXNlclJvbGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gInVzZXIiLmVxdWFscyh2YWx1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9UZXN0Q2FzZTFCZWFuLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1Rlc3RDYXNlMUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiYmNkZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1Rlc3RDYXNlMUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5QYXR0ZXJuOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7DQotDQotcHVibGljIGNsYXNzIFRlc3RDYXNlMUJlYW4NCi17DQotICAgIEBOb3ROdWxsDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0NCi0gICAgQE5vdE51bGwocGF5bG9hZCA9IFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MpDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MjsNCi0NCi0gICAgQFNpemUobWluID0gMywgcGF5bG9hZCA9IFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MpDQotICAgIEBQYXR0ZXJuKHJlZ2V4cCA9ICJbQS1aXVthLXpdKyIsIHBheWxvYWQgPSBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzcykNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkzOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKFN0cmluZyBwcm9wZXJ0eTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MyhTdHJpbmcgcHJvcGVydHkzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MyA9IHByb3BlcnR5MzsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vQ2xhc3NMZXZlbEVxdWFsLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vQ2xhc3NMZXZlbEVxdWFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNjBmZmYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0NsYXNzTGV2ZWxFcXVhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotDQotQGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldChUWVBFKQ0KLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb24oUlVOVElNRSkNCi1AamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZA0KLUBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQodmFsaWRhdGVkQnkgPSB7Q2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjEuY2xhc3MsIENsYXNzTGV2ZWxFcXVhbHNWYWxpZGF0b3IyLmNsYXNzfSkNCi1wdWJsaWMgQGludGVyZmFjZSBDbGFzc0xldmVsRXF1YWwNCi17DQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAiY2xhc3MtbGV2ZWwgZXF1YWwgdmlvbGF0aW9uIjsNCi0NCi0gICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9Ow0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0NsYXNzTGV2ZWxFcXVhbHNWYWxpZGF0b3IxLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vQ2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxZTE0OC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vQ2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIENsYXNzTGV2ZWxFcXVhbHNWYWxpZGF0b3IxIGltcGxlbWVudHMNCi0gICAgICAgIENvbnN0cmFpbnRWYWxpZGF0b3I8Q2xhc3NMZXZlbEVxdWFsLCBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuPg0KLXsNCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDbGFzc0xldmVsRXF1YWwgcGFyYW1ldGVycykNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBwYWdlQmVhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5MSA9IHBhZ2VCZWFuLmdldFByb3BlcnR5MSgpOw0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5MiA9IHBhZ2VCZWFuLmdldFByb3BlcnR5MigpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MSA9PSBudWxsICYmIHByb3BlcnR5MiA9PSBudWxsIHx8IHByb3BlcnR5MSAhPSBudWxsICYmIHByb3BlcnR5MS5lcXVhbHMocHJvcGVydHkyKTsNCi0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vQ2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9DbGFzc0xldmVsRXF1YWxzVmFsaWRhdG9yMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTZiNjQwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9DbGFzc0xldmVsRXF1YWxzVmFsaWRhdG9yMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLk1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW47DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgQ2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjIgaW1wbGVtZW50cw0KLSAgICAgICAgQ29uc3RyYWludFZhbGlkYXRvcjxDbGFzc0xldmVsRXF1YWwsIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4+DQotew0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKENsYXNzTGV2ZWxFcXVhbCBwYXJhbWV0ZXJzKQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuIHBhZ2VCZWFuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcHJvcGVydHkxID0gcGFnZUJlYW4uZ2V0UHJvcGVydHkxKCk7DQotICAgICAgICBTdHJpbmcgcHJvcGVydHkyID0gcGFnZUJlYW4uZ2V0UHJvcGVydHkyKCk7DQotDQotICAgICAgICByZXR1cm4gcHJvcGVydHkxID09IG51bGwgJiYgcHJvcGVydHkyID09IG51bGwgfHwgcHJvcGVydHkxICE9IG51bGwgJiYgcHJvcGVydHkxLmVxdWFscyhwcm9wZXJ0eTIpOw0KLQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9Hcm91cDEuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9Hcm91cDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI4OTQ4MC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb247DQotDQotcHVibGljIGludGVyZmFjZSBHcm91cDENCi17DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9Hcm91cDIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9Hcm91cDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA2OTljMS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb247DQotDQotcHVibGljIGludGVyZmFjZSBHcm91cDINCi17DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9Hcm91cDMuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9Hcm91cDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2N2ZiMy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb247DQotDQotcHVibGljIGludGVyZmFjZSBHcm91cDMNCi17DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9DdXN0b21TZXZlcml0eVRlc3RDYXNlMVBhZ2VCZWFuLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvQ3VzdG9tU2V2ZXJpdHlUZXN0Q2FzZTFQYWdlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODA5Y2YwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9DdXN0b21TZXZlcml0eVRlc3RDYXNlMVBhZ2VCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwuY3VzdG9tLkN1c3RvbVZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIEN1c3RvbVNldmVyaXR5VGVzdENhc2UxUGFnZUJlYW4NCi17DQotICAgIEBOb3ROdWxsKHBheWxvYWQgPSBDdXN0b21WaW9sYXRpb25TZXZlcml0eS5XYXJuaW5nLmNsYXNzKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTE7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFhMDczNi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbjsNCi0NCi1wdWJsaWMgY2xhc3MgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4NCi17DQotICAgIHByaXZhdGUgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDEgPSBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBwcml2YXRlIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gbW9kZWwyID0gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgQEJlYW5WYWxpZGF0aW9uKG1vZGVsVmFsaWRhdGlvbiA9IEBNb2RlbFZhbGlkYXRpb24oaXNBY3RpdmUgPSB0cnVlKSkNCi0gICAgcHJpdmF0ZSBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsMyA9IG5ldyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIEBCZWFuVmFsaWRhdGlvbihtb2RlbFZhbGlkYXRpb24gPSBATW9kZWxWYWxpZGF0aW9uKGlzQWN0aXZlID0gdHJ1ZSwgZGlzcGxheUlubGluZSA9IHRydWUpKQ0KLSAgICBwcml2YXRlIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gbW9kZWw0ID0gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgQEJlYW5WYWxpZGF0aW9uKGNvbmRpdGlvbnMgPSAiI3tjdXJyZW50VXNlci51c2VyUm9sZX0iLCBtb2RlbFZhbGlkYXRpb24gPSBATW9kZWxWYWxpZGF0aW9uKGlzQWN0aXZlID0gdHJ1ZSkpDQotICAgIHByaXZhdGUgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDUgPSBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24obW9kZWxWYWxpZGF0aW9uID0gQE1vZGVsVmFsaWRhdGlvbihpc0FjdGl2ZSA9IHRydWUpKQ0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWwxOw0KLSAgICB9DQotDQotICAgIEBCZWFuVmFsaWRhdGlvbihtb2RlbFZhbGlkYXRpb24gPSBATW9kZWxWYWxpZGF0aW9uKGlzQWN0aXZlID0gdHJ1ZSwgZGlzcGxheUlubGluZSA9IHRydWUpKQ0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWwyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIGdldE1vZGVsMygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWw0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1vZGVsNDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWw1Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMGVhMjkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uQmVhblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLk1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW47DQotDQotQEJlYW5WYWxpZGF0aW9uKG1vZGVsVmFsaWRhdGlvbiA9IEBNb2RlbFZhbGlkYXRpb24oaXNBY3RpdmUgPSB0cnVlLCB2YWxpZGF0aW9uVGFyZ2V0cyA9ICIje3Rlc3RCZWFuLm1vZGVsfSIpKQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsID0gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgcHVibGljIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L01vZGVsVmFsaWRhdGlvblRlc3RDYXNlM1BhZ2VCZWFuLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UzUGFnZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiZjg1Ni4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UzUGFnZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbjsNCi0NCi1AQmVhblZhbGlkYXRpb24odmlld0lkcyA9ICIvcGFnZXMvbW9kZWxWYWxpZGF0aW9uQXdhcmVQYWdlLnhodG1sIiwNCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbiA9IEBNb2RlbFZhbGlkYXRpb24oaXNBY3RpdmUgPSB0cnVlLCB2YWxpZGF0aW9uVGFyZ2V0cyA9ICIje3Rlc3RCZWFuLm1vZGVsfSIpKQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTNQYWdlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsID0gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgcHVibGljIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L01vZGVsVmFsaWRhdGlvblRlc3RDYXNlNFBhZ2VCZWFuLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2U0UGFnZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2MzBkNy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2U0UGFnZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuOw0KLQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTRQYWdlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuIG1vZGVsID0gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4oKTsNCi0NCi0gICAgcHVibGljIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4gZ2V0TW9kZWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L1Jlc3RyaWN0R3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4uamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9SZXN0cmljdEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZmIxYjcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L1Jlc3RyaWN0R3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5Hcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAxOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLQ0KLUBCZWFuVmFsaWRhdGlvbih1c2VHcm91cHMgPSBHcm91cDEuY2xhc3MpDQotcHVibGljIGNsYXNzIFJlc3RyaWN0R3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4NCi17DQotICAgIEBCZWFuVmFsaWRhdGlvbihyZXN0cmljdEdyb3VwcyA9IEdyb3VwMS5jbGFzcykNCi0gICAgcHJpdmF0ZSBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsMSA9IG5ldyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIHByaXZhdGUgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDIgPSBuZXcgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24odmlld0lkcyA9ICIvcGFnZXMvZ3JvdXBWYWxpZGF0aW9uQXdhcmVQYWdlLnhodG1sIiwgcmVzdHJpY3RHcm91cHMgPSBHcm91cDEuY2xhc3MpDQotICAgIHByaXZhdGUgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDMgPSBuZXcgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24ocmVzdHJpY3RHcm91cHMgPSBHcm91cDEuY2xhc3MsIHVzZUdyb3VwcyA9IEdyb3VwMi5jbGFzcykNCi0gICAgcHJpdmF0ZSBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsNCA9IG5ldyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIHB1YmxpYyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIGdldE1vZGVsMSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDE7DQotICAgIH0NCi0NCi0gICAgQEJlYW5WYWxpZGF0aW9uKGNvbmRpdGlvbnMgPSAiI3tjdXJyZW50VXNlci5hZG1pblJvbGV9IiwgcmVzdHJpY3RHcm91cHMgPSBHcm91cDEuY2xhc3MpDQotICAgIHB1YmxpYyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIGdldE1vZGVsMigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWwzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1vZGVsMzsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWw0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Vc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L1VzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYWE2Y2YuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L1VzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uLkdyb3VwMTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uLkdyb3VwMjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uLkdyb3VwMzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi0NCi1AQmVhblZhbGlkYXRpb24odXNlR3JvdXBzID0gR3JvdXAxLmNsYXNzKQ0KLXB1YmxpYyBjbGFzcyBVc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsMSA9IG5ldyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIHByaXZhdGUgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDIgPSBuZXcgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24odmlld0lkcyA9IHsiL3BhZ2VzL3BhZ2UxLnhodG1sIiwgIi9wYWdlcy9wYWdlMi54aHRtbCJ9LHVzZUdyb3VwcyA9IHtHcm91cDIuY2xhc3MsIEdyb3VwMy5jbGFzc30pDQotICAgIHByaXZhdGUgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDMgPSBuZXcgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24uTGlzdCh7DQotICAgICAgICBAQmVhblZhbGlkYXRpb24odXNlR3JvdXBzID0gR3JvdXAyLmNsYXNzLCBjb25kaXRpb25zID0gIiN7Y3VycmVudFVzZXIuYWRtaW5Sb2xlfSIpLA0KLSAgICAgICAgQEJlYW5WYWxpZGF0aW9uKHVzZUdyb3VwcyA9IHtHcm91cDIuY2xhc3MsIEdyb3VwMy5jbGFzc30sIGNvbmRpdGlvbnMgPSAiI3tjdXJyZW50VXNlci51c2VyUm9sZX0iKQ0KLSAgICB9KQ0KLSAgICBwcml2YXRlIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gbW9kZWw0ID0gbmV3IEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgcHVibGljIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWwxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1vZGVsMTsNCi0gICAgfQ0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24odXNlR3JvdXBzID0gR3JvdXAyLmNsYXNzKQ0KLSAgICBwdWJsaWMgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWwyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIGdldE1vZGVsMygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWw0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1vZGVsNDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvVXNlR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4uamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Vc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTU1MDNkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Vc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52aWV3Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLkdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMkJlYW47DQotDQotcHVibGljIGNsYXNzIFVzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuDQotew0KLSAgICBwcml2YXRlIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4gbW9kZWwgPSBuZXcgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyQmVhbigpOw0KLQ0KLSAgICBwdWJsaWMgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyQmVhbiBnZXRNb2RlbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3BvbS54bWwgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NTk0NzQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlLXRlc3RzPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIENvcmUtVGVzdHM8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPnRlc3QtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2MWNmOS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL0Fic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL0Fic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRmMDc5My4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLkFic3RyYWN0RXhWYWxUZXN0Q2FzZTsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGludm9rZVN0YXJ0dXBMaXN0ZW5lcnMoKQ0KLSAgICB7DQotDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvblRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjZmVlMS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvblRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YW5kYXJkU3ludGF4KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMS5wcm9wZXJ0eTF9Iik7DQotDQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xLnByb3BlcnR5MX0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygicHJvcGVydHkxIiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsncHJvcGVydHkxJ119Iik7DQotDQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xWydwcm9wZXJ0eTEnXX0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygicHJvcGVydHkxIiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsnYmVhbjInXS5wcm9wZXJ0eTF9Iik7DQotDQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xWydiZWFuMiddLnByb3BlcnR5MX0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xWydiZWFuMiddfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tiZWFuMX0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygicHJvcGVydHkxIiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhbmRhcmRTeW50YXhSZXBsYWNlUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xLnByb3BlcnR5MX0iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2VQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAicHJvcGVydHkyIik7DQotDQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xLnByb3BlcnR5Mn0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygicHJvcGVydHkyIiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsncHJvcGVydHkxJ119Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgInByb3BlcnR5MiIpOw0KLQ0KLSAgICAgICAgLy9UT0RPIHJlc3RvcmUgb3JpZ2luYWwgc3ludGF4DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xLnByb3BlcnR5Mn0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygicHJvcGVydHkyIiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsnYmVhbjInXS5wcm9wZXJ0eTF9Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgInByb3BlcnR5MiIpOw0KLQ0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tiZWFuMVsnYmVhbjInXS5wcm9wZXJ0eTJ9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tiZWFuMVsnYmVhbjInXX0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjF9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInByb3BlcnR5MiIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YW5kYXJkU3ludGF4QWRkUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xLmJlYW4yfSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24uYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgInByb3BlcnR5MSIpOw0KLQ0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tiZWFuMS5iZWFuMi5wcm9wZXJ0eTF9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tiZWFuMS5iZWFuMn0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInByb3BlcnR5MSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSk7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjFbJ2JlYW4yJ119Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5hZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAicHJvcGVydHkxIik7DQotDQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xWydiZWFuMiddLnByb3BlcnR5MX0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xWydiZWFuMiddfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygicHJvcGVydHkxIiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsnYmVhbjInXS5iZWFuM30iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sICJwcm9wZXJ0eTEiKTsNCi0NCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjFbJ2JlYW4yJ10uYmVhbjMucHJvcGVydHkxfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjFbJ2JlYW4yJ10uYmVhbjN9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xWydiZWFuMiddfSIsDQotICAgICAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTEiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWNlbGV0c0N1c3RvbUNvbXBvbmVudFN5bnRheCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7ZW50aXR5W2ZpZWxkTmFtZV19Iik7DQotDQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2VudGl0eVtmaWVsZE5hbWVdfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7ZW50aXR5fSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZmllbGROYW1lIiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFjZWxldHNDdXN0b21Db21wb25lbnRTeW50YXhSZXBsYWNlUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2VudGl0eVtmaWVsZE5hbWVdfSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sICJuZXdGaWVsZE5hbWUiKTsNCi0NCi0gICAgICAgIC8vVE9ETyByZXN0b3JlIG9yaWdpbmFsIHN5bnRheA0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tlbnRpdHkubmV3RmllbGROYW1lfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7ZW50aXR5fSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygibmV3RmllbGROYW1lIiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxleE1hcFN5bnRheCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjFbYmVhbjJbYmVhbjNbJ2tleTEnXV1dLnByb3BlcnR5MX0iKTsNCi0NCi0gICAgICAgIC8vVE9ETw0KLSAgICAgICAgLy9hc3NlcnRFcXVhbHMoIiN7YmVhbjFbYmVhbjJbYmVhbjNbJ2tleTEnXV1dLnByb3BlcnR5MX0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTEiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2luaXRpYWxpemVyL1JlZ2lzdHJhdGlvbkNvbXBvbmVudEluaXRpYWxpemVyVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2luaXRpYWxpemVyL1JlZ2lzdHJhdGlvbkNvbXBvbmVudEluaXRpYWxpemVyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM5ZjRjMS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbml0aWFsaXplci9SZWdpc3RyYXRpb25Db21wb25lbnRJbml0aWFsaXplclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5pbml0aWFsaXplcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25Db21wb25lbnRJbml0aWFsaXplclRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZQ0KLXsNCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBSZWdpc3RyYXRpb25Db21wb25lbnRJbml0aWFsaXplclRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWdpc3RyYXRpb25Db21wb25lbnRJbml0aWFsaXplclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXJJbml0aWFsaXphdGlvbigpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZENvbXBvbmVudEluaXRpYWxpemVyKG5ldyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIxMDAwKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IFRlc3RDb21wb25lbnRJbml0aWFsaXplcjIoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IFRlc3RDb21wb25lbnRJbml0aWFsaXplcjMoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMSgpKTsNCi0NCi0gICAgICAgIExpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldENvbXBvbmVudEluaXRpYWxpemVycygpOw0KLQ0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDU7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuc2l6ZSgpID09IHJlc3VsdExlbmd0aCk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjEpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIyKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMyk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjEwMDApOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDEpDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjEgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigyKQ0KLSAgICBjbGFzcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMykNCi0gICAgY2xhc3MgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMyBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDEwMDApDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjEwMDAgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTc4NTgwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUmVnaXN0cmF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVnaXN0cmF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ySW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMCgpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IyKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RDb21wb25lbnRJbml0aWFsaXplcigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IzKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEoKSk7DQotDQotICAgICAgICBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsNCi0NCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSA1Ow0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHRMZW5ndGgsIHJlc3VsdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMS5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IzLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDQ6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RDb21wb25lbnRJbml0aWFsaXplci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMSkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMSBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigyKQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IyIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDMpDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjMgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTAwMCkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMCBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTBkMzI4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvblByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5GYWNlc01lc3NhZ2VQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvblByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlZ2lzdHJhdGlvblByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvblByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RDb21wb25lbnRJbml0aWFsaXplcigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxMDAwKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMygpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxKCkpOw0KLQ0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7DQotDQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gNjsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0TGVuZ3RoLCByZXN1bHQuc2l6ZSgpKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMy5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDU6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RDb21wb25lbnRJbml0aWFsaXplci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDEpDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDIpDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDMpDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjMgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDEwMDApDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEwMDAgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU0ZDM2OC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WaW9sYXRpb25TZXZlcml0eVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlZ2lzdHJhdGlvblZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvclRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWdpc3RyYXRpb25WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMSgpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcihuZXcgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjIoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IzKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMTAwMCgpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcihuZXcgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigpKTsNCi0NCi0gICAgICAgIExpc3Q8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCk7DQotDQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gNzsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0TGVuZ3RoLCByZXN1bHQuc2l6ZSgpKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IxLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMy5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjEwMDAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA2Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLCBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMSkNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjEgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLCBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMikNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjIgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLCBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMykNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjMgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLCBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTAwMCkNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjEwMDAgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLCBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25NZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlclRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9tYXBwZXIvUmVnaXN0cmF0aW9uTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTAxYjAxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25NZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuTmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyLio7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UubW9jay5Nb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25NZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlclRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZQ0KLXsNCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBSZWdpc3RyYXRpb25NZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlclRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWdpc3RyYXRpb25NZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJJbml0aWFsaXphdGlvbigpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjY1MCgpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjE1MCgpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjQ1MCgpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjI1MCgpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjU1MCgpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjk5KCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyMzUwKCkpOw0KLQ0KLSAgICAgICAgTGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+IHJlc3VsdCA9IGdldE5hbWVNYXBwZXJzKCk7DQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gMTY7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3VsdExlbmd0aCwgcmVzdWx0LnNpemUoKSk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjk5LmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjE1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIyNTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA1Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDY6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyMzUwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDg6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyNDUwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgOToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxMzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI1NTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxNDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI2NTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxNToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gZ2V0TmFtZU1hcHBlcnMoKQ0KLSAgICB7DQotICAgICAgICBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcyk7DQotDQotICAgICAgICByZXR1cm4gKChNb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSlyZXN1bHQpLmdldFJlZ2lzdGVyZWROYW1lTWFwcGVyTGlzdCgpOw0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDk5KQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjk5IGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDE1MCkNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIxNTAgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMjUwKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjI1MCBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigzNTApDQotICAgIGNsYXNzIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyMzUwIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDQ1MCkNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI0NTAgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoNTUwKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjU1MCBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcig2NTApDQotICAgIGNsYXNzIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyNjUwIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9tYXBwZXIvUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTY3YjQzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuTmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlci4qOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLm1vY2suTW9ja01lc3NhZ2VSZXNvbHZlckZhY3Rvcnk7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlclRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIzMDEoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyMTUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjQ1MCgpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIyNTAoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyNTUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjk5KCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjM1MCgpKTsNCi0NCi0gICAgICAgIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiByZXN1bHQgPSBnZXROYW1lTWFwcGVycygpOw0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDEzOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHRMZW5ndGgsIHJlc3VsdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXI5OS5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyMTUwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIyNTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA1Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA2Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjMwMS5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDc6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKERlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDg6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyMzUwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgOToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXI0NTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXI1NTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gZ2V0TmFtZU1hcHBlcnMoKQ0KLSAgICB7DQotICAgICAgICBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcyk7DQotDQotICAgICAgICByZXR1cm4gKChNb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeSlyZXN1bHQpLmdldFJlZ2lzdGVyZWROYW1lTWFwcGVyTGlzdCgpOw0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDk5KQ0KLSAgICBjbGFzcyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjk5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDE1MCkNCi0gICAgY2xhc3MgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIxNTAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMjUwKQ0KLSAgICBjbGFzcyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjI1MCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigzMDEpDQotICAgIGNsYXNzIFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyMzAxIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDM1MCkNCi0gICAgY2xhc3MgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIzNTAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoNDUwKQ0KLSAgICBjbGFzcyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjQ1MCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcig1NTApDQotICAgIGNsYXNzIFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyNTUwIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9tYXBwZXIvUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlclRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9tYXBwZXIvUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZGNlMzMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5Lk5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlci4qOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UubW9jay5Nb2NrTWV0YURhdGFUcmFuc2Zvcm1lckZhY3Rvcnk7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlclRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZQ0KLXsNCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBSZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBlckluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyMTUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyNDUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyMjUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyNTUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOTkoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIzNTAoKSk7DQotDQotICAgICAgICBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gcmVzdWx0ID0gZ2V0TmFtZU1hcHBlcnMoKTsNCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSAxMzsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0TGVuZ3RoLCByZXN1bHQuc2l6ZSgpKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjk5LmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIxNTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDU6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjI1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDY6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyMzUwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgODoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDk6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjQ1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDEwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDExOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI1NTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IGdldE5hbWVNYXBwZXJzKCkNCi0gICAgew0KLSAgICAgICAgTmFtZU1hcHBlckF3YXJlRmFjdG9yeSByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcyk7DQotDQotICAgICAgICByZXR1cm4gKChNb2NrTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkpcmVzdWx0KS5nZXRSZWdpc3RlcmVkTmFtZU1hcHBlckxpc3QoKTsNCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcig5OSkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOTkgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxNTApDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjE1MCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDI1MCkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyMjUwIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMzUwKQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIzNTAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcig0NTApDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjQ1MCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDU1MCkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyNTUwIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0N1c3RvbVByb2plY3RTdGFnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvQ3VzdG9tUHJvamVjdFN0YWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NDNkNjAuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvQ3VzdG9tUHJvamVjdFN0YWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLnN0YWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlByb2plY3RTdGFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuUHJvamVjdFN0YWdlTmFtZTsNCi0NCi0vKioNCi0gKiBjdXN0b20gcHJvamVjdCBzdGFnZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1lbnVtIEN1c3RvbVByb2plY3RTdGFnZQ0KLXsNCi0gICAgRGV2KFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoIkRldiIpKSwNCi0gICAgVGVzdChQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKCJUZXN0IikpLA0KLSAgICBQcm9kKFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoIlByb2QiKSk7DQotDQotICAgIHByaXZhdGUgZmluYWwgUHJvamVjdFN0YWdlTmFtZSB2YWx1ZTsNCi0NCi0gICAgQ3VzdG9tUHJvamVjdFN0YWdlKFByb2plY3RTdGFnZU5hbWUgdmFsdWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXMoQ3VzdG9tUHJvamVjdFN0YWdlIGN1c3RvbVByb2plY3RTdGFnZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFByb2plY3RTdGFnZS5pcyhjdXN0b21Qcm9qZWN0U3RhZ2UuZ2V0VmFsdWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb2plY3RTdGFnZU5hbWUgZ2V0VmFsdWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9DdXN0b21Qcm9qZWN0U3RhZ2VUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvQ3VzdG9tUHJvamVjdFN0YWdlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA0ZjMxZi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9DdXN0b21Qcm9qZWN0U3RhZ2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5zdGFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSnNmUHJvamVjdFN0YWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Qcm9qZWN0U3RhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotcHVibGljIGNsYXNzIEN1c3RvbVByb2plY3RTdGFnZVRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZQ0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfU1RBR0UgPSAiamF2YXguZmFjZXMuUFJPSkVDVF9TVEFHRSI7DQotICAgIA0KLSAgICBwdWJsaWMgQ3VzdG9tUHJvamVjdFN0YWdlVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEN1c3RvbVByb2plY3RTdGFnZVRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGV2ZWxvcG1lbnRTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoUFJPSkVDVF9TVEFHRSwgIkRldiIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShDdXN0b21Qcm9qZWN0U3RhZ2UuaXMoQ3VzdG9tUHJvamVjdFN0YWdlLkRldikpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKFBST0pFQ1RfU1RBR0UsICJUZXN0Iik7DQotICAgICAgICBhc3NlcnRUcnVlKEN1c3RvbVByb2plY3RTdGFnZS5pcyhDdXN0b21Qcm9qZWN0U3RhZ2UuVGVzdCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9kdWN0aW9uU3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKFBST0pFQ1RfU1RBR0UsICJQcm9kIik7DQotICAgICAgICBhc3NlcnRUcnVlKEN1c3RvbVByb2plY3RTdGFnZS5pcyhDdXN0b21Qcm9qZWN0U3RhZ2UuUHJvZCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICBhc3NlcnRUcnVlKFByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuUHJvZHVjdGlvbi5nZXRWYWx1ZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFdyb25nRGVmYXVsdFN0YWdlMSgpDQotICAgIHsNCi0gICAgICAgIGFzc2VydEZhbHNlKEN1c3RvbVByb2plY3RTdGFnZS5pcyhDdXN0b21Qcm9qZWN0U3RhZ2UuRGV2KSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFdyb25nRGVmYXVsdFN0YWdlMigpDQotICAgIHsNCi0gICAgICAgIGFzc2VydEZhbHNlKEN1c3RvbVByb2plY3RTdGFnZS5pcyhDdXN0b21Qcm9qZWN0U3RhZ2UuVGVzdCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0luZGVwZW5kZW50UHJvamVjdFN0YWdlVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0luZGVwZW5kZW50UHJvamVjdFN0YWdlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdjYWQ0ZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9JbmRlcGVuZGVudFByb2plY3RTdGFnZVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5zdGFnZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLio7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIEluZGVwZW5kZW50UHJvamVjdFN0YWdlVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVBFTkRFTlRfUFJPSkVDVF9TVEFHRSA9ICJjdXN0b20uUFJPSkVDVF9TVEFHRSI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU0ZfUFJPSkVDVF9TVEFHRSA9ICJqYXZheC5mYWNlcy5QUk9KRUNUX1NUQUdFIjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9ERVYgPSAiY3VzdG9tX2RldiI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fUFJPRCA9ICJjdXN0b21fcHJvZCI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVEVTVCA9ICJjdXN0b21fdGVzdCI7DQotDQotICAgIHB1YmxpYyBJbmRlcGVuZGVudFByb2plY3RTdGFnZVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShJbmRlcGVuZGVudFByb2plY3RTdGFnZVRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eShQcm9qZWN0U3RhZ2VSZXNvbHZlci5jbGFzcy5nZXROYW1lKCksIG5ldyBEZWZhdWx0UHJvamVjdFN0YWdlUmVzb2x2ZXIoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHB1YmxpYyBQcm9qZWN0U3RhZ2UgZ2V0Q3VycmVudFByb2plY3RTdGFnZSgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcganNmUHJvamVjdFN0YWdlTmFtZSA9IHJlc29sdmVQcm9qZWN0U3RhZ2VOYW1lKCJqYXZheC5mYWNlcy5QUk9KRUNUX1NUQUdFIik7DQotICAgICAgICAgICAgICAgIFN0cmluZyBpbmRlcGVuZGVudFByb2plY3RTdGFnZU5hbWUgPSByZXNvbHZlUHJvamVjdFN0YWdlTmFtZShJTkRFUEVOREVOVF9QUk9KRUNUX1NUQUdFKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKCEoanNmUHJvamVjdFN0YWdlTmFtZSA9PSBudWxsIHx8ICIiLmVxdWFscyhqc2ZQcm9qZWN0U3RhZ2VOYW1lKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIFByb2plY3RTdGFnZU5hbWUgcmVzdWx0ID0gUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShqc2ZQcm9qZWN0U3RhZ2VOYW1lLnRyaW0oKSk7DQotICAgICAgICAgICAgICAgICAgICBmb3IoSnNmUHJvamVjdFN0YWdlIGpzZlByb2plY3RTdGFnZSA6IEpzZlByb2plY3RTdGFnZS52YWx1ZXMoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihqc2ZQcm9qZWN0U3RhZ2UuZ2V0VmFsdWUoKS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2UocmVzdWx0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYoIShpbmRlcGVuZGVudFByb2plY3RTdGFnZU5hbWUgPT0gbnVsbCB8fCAiIi5lcXVhbHMoaW5kZXBlbmRlbnRQcm9qZWN0U3RhZ2VOYW1lKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIFByb2plY3RTdGFnZU5hbWUgaW5kZXBlbmRlbnRSZXN1bHQgPSBQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKGluZGVwZW5kZW50UHJvamVjdFN0YWdlTmFtZS50cmltKCkpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBqc2Ygc3RhZ2UgdmFsdWVzIGZpcnN0DQotICAgICAgICAgICAgICAgICAgICBQcm9qZWN0U3RhZ2VOYW1lIHJlc3VsdCA9IFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoaW5kZXBlbmRlbnRQcm9qZWN0U3RhZ2VOYW1lLnRyaW0oKSk7DQotICAgICAgICAgICAgICAgICAgICBmb3IoSnNmUHJvamVjdFN0YWdlIGpzZlByb2plY3RTdGFnZSA6IEpzZlByb2plY3RTdGFnZS52YWx1ZXMoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihqc2ZQcm9qZWN0U3RhZ2UuZ2V0VmFsdWUoKS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2UocmVzdWx0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGN1c3RvbSBzdGFnZSB2YWx1ZXMNCi0gICAgICAgICAgICAgICAgICAgIGlmKFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoQ1VTVE9NX0RFVikuZXF1YWxzKGluZGVwZW5kZW50UmVzdWx0KSB8fA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKENVU1RPTV9URVNUKS5lcXVhbHMoaW5kZXBlbmRlbnRSZXN1bHQpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2UoaW5kZXBlbmRlbnRSZXN1bHQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVQcm9qZWN0U3RhZ2UoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShDVVNUT01fUFJPRCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHJlc29sdmVQcm9qZWN0U3RhZ2VOYW1lKFN0cmluZyBwYXJhbWV0ZXJOYW1lKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eShQcm9qZWN0U3RhZ2VSZXNvbHZlci5jbGFzcy5nZXROYW1lKCksIG5ldyBEZWZhdWx0UHJvamVjdFN0YWdlUmVzb2x2ZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdERldmVsb3BtZW50U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKElOREVQRU5ERU5UX1BST0pFQ1RfU1RBR0UsIENVU1RPTV9ERVYpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQcm9qZWN0U3RhZ2UuaXMoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShDVVNUT01fREVWKSkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKElOREVQRU5ERU5UX1BST0pFQ1RfU1RBR0UsIENVU1RPTV9URVNUKTsNCi0gICAgICAgIGFzc2VydFRydWUoUHJvamVjdFN0YWdlLmlzKFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoQ1VTVE9NX1RFU1QpKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhbGxiYWNrU3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKElOREVQRU5ERU5UX1BST0pFQ1RfU1RBR0UsICJTeXN0ZW1UZXN0Iik7DQotICAgICAgICBhc3NlcnRUcnVlKEpzZlByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuU3lzdGVtVGVzdCkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQcm9qZWN0U3RhZ2UuaXMoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZSgiU3lzdGVtVGVzdCIpKSk7DQotICAgICAgICBhc3NlcnRUcnVlKFByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuU3lzdGVtVGVzdC5nZXRWYWx1ZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE92ZXJyaWRlSnNmU3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKElOREVQRU5ERU5UX1BST0pFQ1RfU1RBR0UsIENVU1RPTV9ERVYpOw0KLSAgICAgICAgc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihKU0ZfUFJPSkVDVF9TVEFHRSwgIlN5c3RlbVRlc3QiKTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoSnNmUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5TeXN0ZW1UZXN0KSk7DQotICAgICAgICBhc3NlcnRUcnVlKFByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuU3lzdGVtVGVzdC5nZXRWYWx1ZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFByb2R1Y3Rpb25TdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoSU5ERVBFTkRFTlRfUFJPSkVDVF9TVEFHRSwgQ1VTVE9NX1BST0QpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQcm9qZWN0U3RhZ2UuaXMoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShDVVNUT01fUFJPRCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQcm9qZWN0U3RhZ2UuaXMoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShDVVNUT01fUFJPRCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdEZWZhdWx0U3RhZ2UxKCkNCi0gICAgew0KLSAgICAgICAgYXNzZXJ0RmFsc2UoUHJvamVjdFN0YWdlLmlzKFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoQ1VTVE9NX0RFVikpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdEZWZhdWx0U3RhZ2UyKCkNCi0gICAgew0KLSAgICAgICAgYXNzZXJ0RmFsc2UoUHJvamVjdFN0YWdlLmlzKFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoQ1VTVE9NX1RFU1QpKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvSnNmUHJvamVjdFN0YWdlVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0pzZlByb2plY3RTdGFnZVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MDE1NWEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvSnNmUHJvamVjdFN0YWdlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuc3RhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkpzZlByb2plY3RTdGFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1wdWJsaWMgY2xhc3MgSnNmUHJvamVjdFN0YWdlVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9TVEFHRSA9ICJqYXZheC5mYWNlcy5QUk9KRUNUX1NUQUdFIjsNCi0gICAgcHVibGljIEpzZlByb2plY3RTdGFnZVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShKc2ZQcm9qZWN0U3RhZ2VUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdERldmVsb3BtZW50U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKFBST0pFQ1RfU1RBR0UsICJEZXZlbG9wbWVudCIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLkRldmVsb3BtZW50KSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFVuaXRUZXN0U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKFBST0pFQ1RfU1RBR0UsICJVbml0VGVzdCIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLlVuaXRUZXN0KSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFN5c3RlbVRlc3RTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoUFJPSkVDVF9TVEFHRSwgIlN5c3RlbVRlc3QiKTsNCi0gICAgICAgIGFzc2VydFRydWUoSnNmUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5TeXN0ZW1UZXN0KSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFByb2R1Y3Rpb25TdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoUFJPSkVDVF9TVEFHRSwgIlByb2R1Y3Rpb24iKTsNCi0gICAgICAgIGFzc2VydFRydWUoSnNmUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5Qcm9kdWN0aW9uKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIGFzc2VydFRydWUoSnNmUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5Qcm9kdWN0aW9uKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFdyb25nRGVmYXVsdFN0YWdlMSgpDQotICAgIHsNCi0gICAgICAgIGFzc2VydEZhbHNlKEpzZlByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuRGV2ZWxvcG1lbnQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdEZWZhdWx0U3RhZ2UyKCkNCi0gICAgew0KLSAgICAgICAgYXNzZXJ0RmFsc2UoSnNmUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5Vbml0VGVzdCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ0RlZmF1bHRTdGFnZTMoKQ0KLSAgICB7DQotICAgICAgICBhc3NlcnRGYWxzZShKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLlN5c3RlbVRlc3QpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wb20ueG1sIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ2ZjJjNC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0NCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+dGVzdC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgVGVzdC1Nb2R1bGVzPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPHNjbT4NCi0gICAgICAgIDxjb25uZWN0aW9uPg0KLSAgICAgICAgICAgIHNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL3ZhbGlkYXRpb24tbW9kdWxlcw0KLSAgICAgICAgPC9jb25uZWN0aW9uPg0KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICAgICAgc2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL3ZhbGlkYXRpb24tbW9kdWxlcw0KLSAgICAgICAgPC9kZXZlbG9wZXJDb25uZWN0aW9uPg0KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvdmFsaWRhdGlvbi1tb2R1bGVzPC91cmw+DQotICAgIDwvc2NtPg0KLQ0KLSAgICA8bW9kdWxlcz4NCi0gICAgICAgIDxtb2R1bGU+YmFzZS10ZXN0LWluZnJhc3RydWN0dXJlPC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPmNvcmUtdGVzdHM8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+cHJvcGVydHktdmFsaWRhdGlvbi10ZXN0czwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5iZWFuLXZhbGlkYXRpb24tdGVzdHM8L21vZHVsZT4NCi0gICAgPC9tb2R1bGVzPg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi41PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQuanNwPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc2hhbGU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2hhbGUtdGVzdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuNDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxyZXNvdXJjZXM+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgIDwvcmVzb3VyY2VzPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotDQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnRlc3QtamFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLQ0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40LjI8L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL0Fic3RyYWN0Ki5qYXZhPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL0Jhc2UqLmphdmE8L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovVGVzdFV0aWxzLmphdmE8L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKkJlYW4uamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+DQotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9wb20ueG1sIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmI5OTAyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0czwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBQcm9wZXJ0eS1WYWxpZGF0aW9uLVRlc3RzPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD50ZXN0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZS10ZXN0czwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2MWNmOS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL0Fic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL0Fic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5NTNkNi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9BYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLkFic3RyYWN0RXhWYWxUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXI7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBBYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbnZva2VTdGFydHVwTGlzdGVuZXJzKCkNCi0gICAgew0KLSAgICAgICAgbmV3IFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lcigpew0KLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQyMzA3NjkyMDkyNjc1MjY0Nkw7DQotDQotICAgICAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzdXBlci5pbml0KCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfS5pbml0KCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpDQotICAgIHsNCi0gICAgICAgIG5ldyBDcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyKCkuYWZ0ZXJQaGFzZShuZXcgUGhhc2VFdmVudChmYWNlc0NvbnRleHQsIFBoYXNlSWQuQU5ZX1BIQVNFLGxpZmVjeWNsZSkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL0Jhc2VWYWxUZXN0QmVhbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvQmFzZVZhbFRlc3RCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NTQzZjguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvQmFzZVZhbFRlc3RCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkRvdWJsZVJhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxlbmd0aDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5QYXR0ZXJuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQmFzZVZhbFRlc3RCZWFuDQotew0KLSAgICBAUmVxdWlyZWQNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsNCi0NCi0gICAgQExlbmd0aChtaW5pbXVtPTIsbWF4aW11bT0zKQ0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lMTsNCi0NCi0gICAgQFBhdHRlcm4oIltBLVpdW2Etel0rIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGF0dGVybk5hbWU7DQotDQotICAgIEBEb3VibGVSYW5nZShtaW5pbXVtPS0zMDBkKQ0KLSAgICBwcml2YXRlIERvdWJsZSBkb3VibGVWYWx1ZTE7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lMSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuYW1lMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lMShTdHJpbmcgbmFtZTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmFtZTEgPSBuYW1lMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhdHRlcm5OYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhdHRlcm5OYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm5OYW1lKFN0cmluZyBwYXR0ZXJuTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXR0ZXJuTmFtZSA9IHBhdHRlcm5OYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEb3VibGUgZ2V0RG91YmxlVmFsdWUxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRvdWJsZVZhbHVlMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREb3VibGVWYWx1ZTEoRG91YmxlIGRvdWJsZVZhbHVlMSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5kb3VibGVWYWx1ZTEgPSBkb3VibGVWYWx1ZTE7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvQ3VzdG9tU2V2ZXJpdHlUZXN0QmVhbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvQ3VzdG9tU2V2ZXJpdHlUZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDQ3YjEzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL0N1c3RvbVNldmVyaXR5VGVzdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3VzdG9tLkN1c3RvbVZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21TZXZlcml0eVRlc3RCZWFuDQotew0KLSAgICBAUmVxdWlyZWQocGFyYW1ldGVycyA9IEN1c3RvbVZpb2xhdGlvblNldmVyaXR5Lldhcm5pbmcuY2xhc3MpDQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9CYXNlVmFsVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvQmFzZVZhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZDA3NjEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9CYXNlVmFsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5BYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLkJhc2VWYWxUZXN0QmVhbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlDQotICovDQotcHVibGljIGNsYXNzIEJhc2VWYWxUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UNCi17DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICBCYXNlVmFsVGVzdEJlYW4gYmVhbiA9IG51bGw7DQotDQotICAgIHB1YmxpYyBCYXNlVmFsVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgICAgICBiZWFuID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShCYXNlVmFsVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgYmVhbiA9IG5ldyBCYXNlVmFsVGVzdEJlYW4oKTsNCi0gICAgICAgIFZhbHVlQmluZGluZyB2YiA9IGFwcGxpY2F0aW9uLmNyZWF0ZVZhbHVlQmluZGluZygiI3t0ZXN0QmVhbn0iKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucHV0KCJ0ZXN0QmVhbiIsIGJlYW4pOw0KLQ0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7DQotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7DQotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7DQotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRJZCgiaW5wdXQxIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZWFyRG93bigpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgICAgICBiZWFuID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZVJlcXVpcmVkRmFpbCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lfSIpOw0KLQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZTFMZW5naHRNYXhGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWUxfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIxMjM0NSIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZTFMZW5naHRDb3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWUxfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZTFMZW5naHRNaW5GYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWUxfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCJ4Iik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lMU5vTGVuZ2h0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWUxfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0dGVybk5hbWVGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnBhdHRlcm5OYW1lfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCJQZXRlcjEiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFBhdHRlcm5Ob05hbWUoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucGF0dGVybk5hbWV9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXR0ZXJuTmFtZUNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucGF0dGVybk5hbWV9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIlBldGVyIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVZhbHVlRmFpbCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5kb3VibGVWYWx1ZTF9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIi0zMDEiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVZhbHVlQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5kb3VibGVWYWx1ZTF9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIjIwMCIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMGQsIGlucHV0Q29tcG9uZW50LmdldFZhbHVlKCkpOw0KLQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudXBkYXRlTW9kZWwoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyMDBkLCBiZWFuLmdldERvdWJsZVZhbHVlMSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlTm9WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5kb3VibGVWYWx1ZTF9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcxN2JiNC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL0N1c3RvbVNldmVyaXR5MVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5iYXNldmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5BYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLkN1c3RvbVNldmVyaXR5VGVzdEJlYW47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3VzdG9tLkN1c3RvbVZpb2xhdGlvblNldmVyaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21TZXZlcml0eTFUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UNCi17DQotICAgIHByaXZhdGUgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHByaXZhdGUgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgcHJpdmF0ZSBDdXN0b21TZXZlcml0eVRlc3RCZWFuIGJlYW4gPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgICAgICBiZWFuID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShDdXN0b21TZXZlcml0eTFUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgICAgICBiZWFuID0gbmV3IEN1c3RvbVNldmVyaXR5VGVzdEJlYW4oKTsNCi0gICAgICAgIFZhbHVlQmluZGluZyB2YiA9IGFwcGxpY2F0aW9uLmNyZWF0ZVZhbHVlQmluZGluZygiI3t0ZXN0QmVhbn0iKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucHV0KCJ0ZXN0QmVhbiIsIGJlYW4pOw0KLQ0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7DQotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7DQotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7DQotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRJZCgiaW5wdXQxIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZWFyRG93bigpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgICAgICBiZWFuID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tVmFsaWRhdGlvblBhcmFtZXRlclZpYUdsb2JhbFByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MuZ2V0TmFtZSgpLCBDdXN0b21WaW9sYXRpb25TZXZlcml0eS5jbGFzcyk7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWV9Iik7DQotDQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tVmFsaWRhdGlvblBhcmFtZXRlclZpYVN0YXRpY0NvbmZpZygpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgIGNvbmZpZy5hZGRNYXBwaW5nKFZpb2xhdGlvblNldmVyaXR5LmNsYXNzLmdldE5hbWUoKSwgQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5WQUxJREFUSU9OX1BBUkFNRVRFUl9DT05GSUcsIGNvbmZpZyk7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWV9Iik7DQotDQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5rbm93blZhbGlkYXRpb25QYXJhbWV0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZX0iKTsNCi0NCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9BZGRpdGlvbmFsVmFsaWRhdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9BZGRpdGlvbmFsVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNDJkMjEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvQWRkaXRpb25hbFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5iYXNldmFsLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5QYXJhbWV0ZXJWYWx1ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgQWRkaXRpb25hbFZhbGlkYXRvciBleHRlbmRzIFRlc3RWYWxpZGF0b3JQcm92aWRlcg0KLXsNCi0gICAgQFBhcmFtZXRlclZhbHVlDQotICAgIHB1YmxpYyBDbGFzcyBnZXRQcm92aWRlckNsYXNzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEFkZGl0aW9uYWxWYWxpZGF0b3IuY2xhc3M7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiAidmFsaWRhdGlvbl9mYWlsZWQiOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH07DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvUGFyYW1ldGVyVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1BhcmFtZXRlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3M2I1ODIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvUGFyYW1ldGVyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUGFyYW1ldGVyVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJTdHlsZU9uZSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKTsNCi0NCi0gICAgICAgIFRlc3RQZXJzb24gcGVyc29uID0gbmV3IFRlc3RQZXJzb24oKTsNCi0gICAgICAgIFJlcXVpcmVkIHJlcXVpcmVkID0gcGVyc29uLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgiZmlyc3ROYW1lIikuZ2V0QW5ub3RhdGlvbihSZXF1aXJlZC5jbGFzcyk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkKS5jb250YWluc0tleShWaW9sYXRpb25TZXZlcml0eS5jbGFzcykpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MpLml0ZXJhdG9yKCkubmV4dCgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfV0FSTiwgZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFZpb2xhdGlvblNldmVyaXR5LmNsYXNzKS5pdGVyYXRvcigpLm5leHQoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlclN0eWxlVHdvKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpOw0KLQ0KLSAgICAgICAgVGVzdFBlcnNvbiBwZXJzb24gPSBuZXcgVGVzdFBlcnNvbigpOw0KLSAgICAgICAgUmVxdWlyZWQgcmVxdWlyZWQgPSBwZXJzb24uZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJsYXN0TmFtZSIpLmdldEFubm90YXRpb24oUmVxdWlyZWQuY2xhc3MpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCkuY29udGFpbnNLZXkoImNsaWVudF9zaWRlX3ZhbGlkYXRpb25fc3VwcG9ydCIpKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsICJjbGllbnRfc2lkZV92YWxpZGF0aW9uX3N1cHBvcnQiKS5pdGVyYXRvcigpLm5leHQoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCAiY2xpZW50X3NpZGVfdmFsaWRhdGlvbl9zdXBwb3J0IikuaXRlcmF0b3IoKS5uZXh0KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJTdHlsZVRocmVlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpOw0KLQ0KLSAgICAgICAgVGVzdFBlcnNvbiBwZXJzb24gPSBuZXcgVGVzdFBlcnNvbigpOw0KLSAgICAgICAgUmVxdWlyZWQgcmVxdWlyZWQgPSBwZXJzb24uZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJsYXN0TmFtZSIpLmdldEFubm90YXRpb24oUmVxdWlyZWQuY2xhc3MpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCkuY29udGFpbnNLZXkoVGVzdFByaW9yaXR5LmNsYXNzKSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBUZXN0UHJpb3JpdHkuY2xhc3MpLml0ZXJhdG9yKCkubmV4dCgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxKSwgZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFRlc3RQcmlvcml0eS5jbGFzcywgSW50ZWdlci5jbGFzcykuaXRlcmF0b3IoKS5uZXh0KCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBUZXN0UHJpb3JpdHkuY2xhc3MsIFN0cmluZy5jbGFzcykuc2l6ZSgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiZG8gaXQgYXNhcCIsIGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBUZXN0UHJpb3JpdHkuY2xhc3MsIFN0cmluZy5jbGFzcywgVGVzdFByaW9yaXR5LlNob3J0RGVzY3JpcHRpb24uY2xhc3MpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiZG8gaXQgaW1tZWRpYXRlbHkiLCBleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgVGVzdFByaW9yaXR5LmNsYXNzLCBTdHJpbmcuY2xhc3MsIFRlc3RQcmlvcml0eS5Mb25nRGVzY3JpcHRpb24uY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyU3R5bGVGb3VyKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpOw0KLQ0KLSAgICAgICAgVGVzdFBlcnNvbiBwZXJzb24gPSBuZXcgVGVzdFBlcnNvbigpOw0KLSAgICAgICAgUmVxdWlyZWQgcmVxdWlyZWQgPSBwZXJzb24uZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJsYXN0TmFtZSIpLmdldEFubm90YXRpb24oUmVxdWlyZWQuY2xhc3MpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCkuY29udGFpbnNLZXkoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MpKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKS5pdGVyYXRvcigpLm5leHQoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKS5zaXplKCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MuZ2V0TmFtZSgpLCBleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKS5pdGVyYXRvcigpLm5leHQoKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlclN0eWxlRml2ZSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKTsNCi0NCi0gICAgICAgIFRlc3RQZXJzb24gcGVyc29uID0gbmV3IFRlc3RQZXJzb24oKTsNCi0gICAgICAgIFJlcXVpcmVkIHJlcXVpcmVkID0gcGVyc29uLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgibGFzdE5hbWUiKS5nZXRBbm5vdGF0aW9uKFJlcXVpcmVkLmNsYXNzKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQpLmNvbnRhaW5zS2V5KERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzKS5pdGVyYXRvcigpLm5leHQoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykuc2l6ZSgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLCBDbGFzcy5jbGFzcykuc2l6ZSgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLCBDbGFzcy5jbGFzcykuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBUT0RPIHRoZXNlIHRlc3RzIHdvcmsgaW4gYW4gaWRlIGJ1dCBub3QgdmlhIGNvbW1hbmRsaW5lIC0gaXQncyBhIFN1cmVmaXJlIGlzc3VlDQotICAgICAqLw0KLSAgICAvKg0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyU3R5bGVTaXgoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCk7DQotDQotICAgICAgICBUZXN0UGVyc29uIHBlcnNvbiA9IG5ldyBUZXN0UGVyc29uKCk7DQotICAgICAgICBSZXF1aXJlZCByZXF1aXJlZCA9IHBlcnNvbi5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoImxhc3ROYW1lIikuZ2V0QW5ub3RhdGlvbihSZXF1aXJlZC5jbGFzcyk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkKS5jb250YWluc0tleShUZXN0VmFsaWRhdG9yUHJvdmlkZXIuY2xhc3MpKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFRlc3RWYWxpZGF0b3JQcm92aWRlci5jbGFzcykuaXRlcmF0b3IoKS5uZXh0KCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBUZXN0VmFsaWRhdG9yUHJvdmlkZXIuY2xhc3MsIENsYXNzLmNsYXNzKS5zaXplKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJTdHlsZVNldmVuKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpOw0KLQ0KLSAgICAgICAgVGVzdFBlcnNvbiBwZXJzb24gPSBuZXcgVGVzdFBlcnNvbigpOw0KLSAgICAgICAgUmVxdWlyZWQgcmVxdWlyZWQgPSBwZXJzb24uZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJsYXN0TmFtZSIpLmdldEFubm90YXRpb24oUmVxdWlyZWQuY2xhc3MpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCkuY29udGFpbnNLZXkoVGVzdFZhbGlkYXRvclByb3ZpZGVyLmNsYXNzKSk7DQotICAgICAgICBmb3IgKENsYXNzIGN1cnJlbnRDbGFzcyA6IGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBUZXN0VmFsaWRhdG9yUHJvdmlkZXIuY2xhc3MsIENsYXNzLmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKFRlc3RWYWxpZGF0b3JQcm92aWRlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGN1cnJlbnRDbGFzcykpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgICovDQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RBbGxvd0NsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0QWxsb3dDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjNiOTczLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RBbGxvd0NsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5QYXJhbWV0ZXJWYWx1ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuUGFyYW1ldGVyS2V5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgVGVzdEFsbG93Q2xpZW50U2lkZVZhbGlkYXRpb24gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotew0KLSAgICBAUGFyYW1ldGVyS2V5DQotICAgIHB1YmxpYyBTdHJpbmcgS0VZID0gImNsaWVudF9zaWRlX3ZhbGlkYXRpb25fc3VwcG9ydCI7DQotDQotICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICBib29sZWFuIHZhbHVlID0gdHJ1ZTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdERlbnlDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdERlbnlDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjkzZGNkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3REZW55Q2xpZW50U2lkZVZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuYmFzZXZhbC5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlBhcmFtZXRlclZhbHVlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5QYXJhbWV0ZXJLZXk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotDQotcHVibGljIGludGVyZmFjZSBUZXN0RGVueUNsaWVudFNpZGVWYWxpZGF0aW9uIGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcg0KLXsNCi0gICAgQFBhcmFtZXRlcktleQ0KLSAgICBwdWJsaWMgU3RyaW5nIGtleSA9ICJjbGllbnRfc2lkZV92YWxpZGF0aW9uX3N1cHBvcnQiOw0KLQ0KLSAgICBAUGFyYW1ldGVyVmFsdWUNCi0gICAgYm9vbGVhbiB2YWx1ZSA9IGZhbHNlOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UGVyc29uLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODM0OTQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFBlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuYmFzZXZhbC5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb247DQotDQotcHVibGljIGNsYXNzIFRlc3RQZXJzb24NCi17DQotICAgIEBSZXF1aXJlZChwYXJhbWV0ZXJzID0ge1Zpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MsIFRlc3RBbGxvd0NsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzfSkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOw0KLQ0KLSAgICBAUmVxdWlyZWQocGFyYW1ldGVycyA9IHsNCi0gICAgICAgICAgICBWaW9sYXRpb25TZXZlcml0eS5JbmZvLmNsYXNzLA0KLSAgICAgICAgICAgIFRlc3REZW55Q2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MsDQotICAgICAgICAgICAgVGVzdFByaW9yaXR5SGlnaC5jbGFzcywNCi0gICAgICAgICAgICBUZXN0VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLA0KLSAgICAgICAgICAgIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcywNCi0gICAgICAgICAgICAvL0xvZ2luVmFsaWRhdG9yLmNsYXNzLA0KLSAgICAgICAgICAgIEFkZGl0aW9uYWxWYWxpZGF0b3IuY2xhc3N9KQ0KLSAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsNCi0NCi0gICAgcHJpdmF0ZSBpbnQgZmFpbGVkTG9naW5zID0gMDsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZXJMb2NrZWQ7DQotDQotICAgIC8qDQotICAgICAqIFRPRE8gdGhlc2UgdGVzdHMgd29yayBpbiBhbiBpZGUgYnV0IG5vdCB2aWEgY29tbWFuZGxpbmUgLSBpdCdzIGEgU3VyZWZpcmUgaXNzdWUNCi0gICAgICovDQotICAgIC8qDQotICAgIHB1YmxpYyBjbGFzcyBMb2dpblZhbGlkYXRvciBleHRlbmRzIFRlc3RWYWxpZGF0b3JQcm92aWRlcg0KLSAgICB7DQotICAgICAgICBAUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIHB1YmxpYyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5UHJvdmlkZXIgZ2V0VmFsdWUoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uU3RyYXRlZ3koKSB7DQotDQotICAgICAgICAgICAgICAgIGludCBmYWlsZWRMb2dpbnM7DQotDQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCh0aGlzLmZhaWxlZExvZ2lucyA9IGlzTG9naW5TdWNjZXNzZnVsKCkpID4gMCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmZhaWxlZExvZ2lucyA+IDMpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICAqLw0KLQ0KLSAgICBwcml2YXRlIGludCBpc0xvZ2luU3VjY2Vzc2Z1bCgpDQotICAgIHsNCi0gICAgICAgIC8vZm9yY2UgYW4gZXhjZXB0aW9uDQotICAgICAgICByZXR1cm4gKyt0aGlzLmZhaWxlZExvZ2luczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xvY2tlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB1c2VyTG9ja2VkOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBsb2NrKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy51c2VyTG9ja2VkID0gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UHJpb3JpdHkuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQcmlvcml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTllOGM0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQcmlvcml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5iYXNldmFsLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuUGFyYW1ldGVyVmFsdWU7DQotDQotcHVibGljIGludGVyZmFjZSBUZXN0UHJpb3JpdHkgZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotew0KLSAgICBAUGFyYW1ldGVyVmFsdWUNCi0gICAgSW50ZWdlciBnZXRWYWx1ZSgpOw0KLQ0KLSAgICBAUGFyYW1ldGVyVmFsdWUoaWQgPSBTaG9ydERlc2NyaXB0aW9uLmNsYXNzKQ0KLSAgICBTdHJpbmcgZ2V0U2hvcnREZXNjcmlwdGlvbigpOw0KLQ0KLSAgICBAUGFyYW1ldGVyVmFsdWUoaWQgPSBMb25nRGVzY3JpcHRpb24uY2xhc3MpDQotICAgIFN0cmluZyBnZXRMb25nRGVzY3JpcHRpb24oKTsNCi0NCi0gICAgaW50ZXJmYWNlIFNob3J0RGVzY3JpcHRpb257fQ0KLSAgICBpbnRlcmZhY2UgTG9uZ0Rlc2NyaXB0aW9ue30NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5SGlnaC5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5SGlnaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWZhMmRhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQcmlvcml0eUhpZ2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuYmFzZXZhbC5wYXJhbWV0ZXI7DQotDQotcHVibGljIGNsYXNzIFRlc3RQcmlvcml0eUhpZ2ggaW1wbGVtZW50cyBUZXN0UHJpb3JpdHkNCi17DQotICAgIHB1YmxpYyBJbnRlZ2VyIGdldFZhbHVlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIDE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTaG9ydERlc2NyaXB0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICJkbyBpdCBhc2FwIjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvbmdEZXNjcmlwdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAiZG8gaXQgaW1tZWRpYXRlbHkiOw0KLSAgICB9DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQcmlvcml0eUxvdy5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5TG93LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MmY1ZWQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5TG93LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0UHJpb3JpdHlMb3cgaW1wbGVtZW50cyBUZXN0UHJpb3JpdHkNCi17DQotICAgIHB1YmxpYyBJbnRlZ2VyIGdldFZhbHVlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIDM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTaG9ydERlc2NyaXB0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICJub3QgdGhhdCBpbXBvcnRhbnQiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9uZ0Rlc2NyaXB0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICJ0aGUgdG9waWMgaXMgbm90IHRoYXQgaW1wb3J0YW50IjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MTIyODMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5iYXNldmFsLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlBhcmFtZXRlclZhbHVlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotQEludm9jYXRpb25PcmRlcigyMTApDQotcHVibGljIGNsYXNzIFRlc3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotDQotICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICBwdWJsaWMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZ2V0SW5zdGFuY2UoKQ0KLSAgICB7DQotICAgICAgICBpZihwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yID0gbmV3IFRlc3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiaXQncyBhIHRlc3QgY2xhc3MiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJpdCdzIGEgdGVzdCBjbGFzcyIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0aW9uU3RyYXRlZ3lQcm92aWRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFZhbGlkYXRpb25TdHJhdGVneVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNzllMmQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFZhbGlkYXRpb25TdHJhdGVneVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lQcm92aWRlcg0KLXsNCi0gICAgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdG9yUHJvdmlkZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0b3JQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjY1OGU5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0b3JQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5iYXNldmFsLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlBhcmFtZXRlcktleTsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdFZhbGlkYXRvclByb3ZpZGVyIGltcGxlbWVudHMgVmFsaWRhdGlvblBhcmFtZXRlciwgVGVzdFZhbGlkYXRpb25TdHJhdGVneVByb3ZpZGVyDQotew0KLSAgICBAUGFyYW1ldGVyS2V5DQotICAgIHB1YmxpYyBDbGFzcyBnZXRLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gVGVzdFZhbGlkYXRvclByb3ZpZGVyLmNsYXNzOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBpdCBpc24ndCBhbGxvd2VkIHRvIGhhdmUgYW4gYWJzdHJhY3QgY2xhc3MgaW4gdGhpcyBjYXNlIC0gc28gdGhpcyBpbXBsLiBpcyByZXF1aXJlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ5b3UgaGF2ZSB0byBvdmVycmlkZSB0aGlzIG1ldGhvZCIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdEJlYW4uamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFmMjczOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotDQotLyoqDQotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbFRlc3RCZWFuDQotew0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTE7DQotDQotICAgIEBFcXVhbHMoInByb3BlcnR5MSIpDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MjsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkxOw0KLSAgICB9DQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MShTdHJpbmcgcHJvcGVydHkxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MSA9IHByb3BlcnR5MTsNCi0gICAgfQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTI7DQotICAgIH0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkyKFN0cmluZyBwcm9wZXJ0eTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkyID0gcHJvcGVydHkyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM2MWIwOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5BYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UNCi17DQotDQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLQ0KLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgQ3Jvc3NWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKENyb3NzVmFsVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0gICAgICAgIENyb3NzVmFsVGVzdEJlYW4gYmVhbiA9IG5ldyBDcm9zc1ZhbFRlc3RCZWFuKCk7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcobnVsbCwgInZhbHVlIiwgIiN7dGVzdEJlYW59Iik7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dCgidGVzdEJlYW4iLGJlYW4pOw0KLQ0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7DQotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7DQotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7DQotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRJZCgiaW5wdXQxIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc0NvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQ0Iik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRUxDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJiY2QxMS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsLm1vY2suTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS51dGlsLk1ldGhvZFV0aWxzOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZSBleHRlbmRzIEVMQ3Jvc3NWYWxUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIEVMQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShFTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLQ0KLSAgICAgICAgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24oKTsNCi0NCi0gICAgICAgIGNvbmZpZy5hZGRNYXBwaW5nKEVxdWFscy5jbGFzcy5nZXROYW1lKCksIE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRywgY29uZmlnKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgcmV0ZXN0IHRoaXMgdGVzdC1jYXNlDQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHJldGVzdCB0aGlzIHRlc3QtY2FzZQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCk7DQotICAgICAgICBhc3NlcnRGYWxzZShNZXRob2RVdGlscy5pc01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKTsNCi0gICAgICAgIGFzc2VydFRydWUoTWV0aG9kVXRpbHMuaXNNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIikpOw0KLSAgICAgICAgLy8xeCBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeSBhbmQgMXggZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShNZXRob2RVdGlscy5jaGVja01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiLCAyKSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRUxDcm9zc1ZhbFRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FTENyb3NzVmFsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ4NjFjZi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FTENyb3NzVmFsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuRGF0ZVRpbWVDb252ZXJ0ZXI7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLkFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U7DQotDQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFTENyb3NzVmFsVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlDQotew0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0NCi0gICAgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgcHVibGljIEVMQ3Jvc3NWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEVMQ3Jvc3NWYWxUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgY3JlYXRlUmVxdWVzdFNjb3BlZEJlYW4oImJlYW4xIiwgZ2V0RW50aXR5SW5zdGFuY2UoKSk7DQotICAgICAgICBjcmVhdGVSZXF1ZXN0U2NvcGVkQmVhbigiYmVhbjIiLCBnZXRFbnRpdHlJbnN0YW5jZSgpKTsNCi0NCi0NCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOw0KLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOw0KLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOw0KLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsNCi0NCi0gICAgICAgIC8vaW5wdXQxDQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldElkKCJpbnB1dDEiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRDb252ZXJ0ZXIobmV3IERhdGVUaW1lQ29udmVydGVyKCkpOw0KLSAgICAgICAgKChEYXRlVGltZUNvbnZlcnRlcilpbnB1dENvbXBvbmVudDEuZ2V0Q29udmVydGVyKCkpLnNldFBhdHRlcm4oImRkLk1NLnl5eXkiKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQxKTsNCi0NCi0gICAgICAgIC8vaW5wdXQyDQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRDb252ZXJ0ZXIobmV3IERhdGVUaW1lQ29udmVydGVyKCkpOw0KLSAgICAgICAgKChEYXRlVGltZUNvbnZlcnRlcilpbnB1dENvbXBvbmVudDIuZ2V0Q29udmVydGVyKCkpLnNldFBhdHRlcm4oImRkLk1NLnl5eXkiKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQyKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlRUxDcm9zc0NvbXBvbmVudFZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTENyb3NzQ29tcG9uZW50VmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjEyLjEyLjIwMDgiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUVMQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uVXNlQ2FzZShTdHJpbmcgdmFsdWVCZWFuMVByb3BlcnR5MSwgU3RyaW5nIHZhbHVlQmVhbjFQcm9wZXJ0eTIsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkxLCBTdHJpbmcgdmFsdWVCZWFuMlByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7YmVhbjEuZGF0ZTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3tiZWFuMi5kYXRlMn0iKTsNCi0NCi0gICAgICAgIC8vc2V0IG1vZGVsIHZhbHVlcw0KLSAgICAgICAgcmVzb2x2ZUJlYW4oImJlYW4xIiwgZ2V0RW50aXR5SW5zdGFuY2UoKS5nZXRDbGFzcygpKS5zZXREYXRlMigoRGF0ZSlpbnB1dENvbXBvbmVudDEuZ2V0Q29udmVydGVyKCkuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dENvbXBvbmVudDEsIHZhbHVlQmVhbjFQcm9wZXJ0eTIpKTsNCi0gICAgICAgIHJlc29sdmVCZWFuKCJiZWFuMiIsIGdldEVudGl0eUluc3RhbmNlKCkuZ2V0Q2xhc3MoKSkuc2V0RGF0ZTEoKERhdGUpaW5wdXRDb21wb25lbnQyLmdldENvbnZlcnRlcigpLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgaW5wdXRDb21wb25lbnQyLCB2YWx1ZUJlYW4yUHJvcGVydHkxKSk7DQotDQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKHZhbHVlQmVhbjFQcm9wZXJ0eTEpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKHZhbHVlQmVhbjJQcm9wZXJ0eTIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlRUxNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTIuMTIuMjAwOCIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRUxNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uVXNlQ2FzZShTdHJpbmcgdmFsdWVCZWFuMVByb3BlcnR5MSwgU3RyaW5nIHZhbHVlQmVhbjFQcm9wZXJ0eTIsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkxLCBTdHJpbmcgdmFsdWVCZWFuMlByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7YmVhbjEuZGF0ZTF9Iik7DQotDQotICAgICAgICAvL3NldCBtb2RlbCB2YWx1ZXMNCi0gICAgICAgIHJlc29sdmVCZWFuKCJiZWFuMSIsIGdldEVudGl0eUluc3RhbmNlKCkuZ2V0Q2xhc3MoKSkuc2V0RGF0ZTIoKERhdGUpaW5wdXRDb21wb25lbnQxLmdldENvbnZlcnRlcigpLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgaW5wdXRDb21wb25lbnQxLCB2YWx1ZUJlYW4xUHJvcGVydHkyKSk7DQotICAgICAgICByZXNvbHZlQmVhbigiYmVhbjIiLCBnZXRFbnRpdHlJbnN0YW5jZSgpLmdldENsYXNzKCkpLnNldERhdGUxKChEYXRlKWlucHV0Q29tcG9uZW50Mi5nZXRDb252ZXJ0ZXIoKS5nZXRBc09iamVjdChmYWNlc0NvbnRleHQsIGlucHV0Q29tcG9uZW50MiwgdmFsdWVCZWFuMlByb3BlcnR5MSkpOw0KLSAgICAgICAgcmVzb2x2ZUJlYW4oImJlYW4yIiwgZ2V0RW50aXR5SW5zdGFuY2UoKS5nZXRDbGFzcygpKS5zZXREYXRlMigoRGF0ZSlpbnB1dENvbXBvbmVudDIuZ2V0Q29udmVydGVyKCkuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dENvbXBvbmVudDIsIHZhbHVlQmVhbjJQcm9wZXJ0eTIpKTsNCi0NCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVCZWFuMVByb3BlcnR5MSk7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBFTENyb3NzVmFsVGVzdERhdGVCZWFuIGdldEVudGl0eUluc3RhbmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBFTENyb3NzVmFsVGVzdERhdGVCZWFuKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRUxDcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRUxDcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTczZDEyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIEVMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4NCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERhdGUgREVGQVVMVF9EQVRFID0gbmV3IERhdGUoKTsNCi0NCi0gICAgQEVxdWFscygiI3tiZWFuMi5kYXRlMn0iKQ0KLSAgICBwcml2YXRlIERhdGUgZGF0ZTEgPSBERUZBVUxUX0RBVEU7DQotDQotICAgIHByaXZhdGUgRGF0ZSBkYXRlMiA9IERFRkFVTFRfREFURTsNCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGF0ZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZTEoRGF0ZSBkYXRlMSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5kYXRlMSA9IGRhdGUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldERhdGUyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRhdGUyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERhdGUyKERhdGUgZGF0ZTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGF0ZTIgPSBkYXRlMjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxY2E0ZWYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsLm1vY2suTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS51dGlsLk1ldGhvZFV0aWxzOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlIGV4dGVuZHMgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKExvY2FsUHJvcGVydHlDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0NCi0gICAgICAgIFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uKCk7DQotDQotICAgICAgICBjb25maWcuYWRkTWFwcGluZyhFcXVhbHMuY2xhc3MuZ2V0TmFtZSgpLCBNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsIGNvbmZpZyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExvY2FsUHJvcGVydHlDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCByZXRlc3QgdGhpcyB0ZXN0LWNhc2UNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgcmV0ZXN0IHRoaXMgdGVzdC1jYXNlDQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCk7DQotICAgICAgICBhc3NlcnRGYWxzZShNZXRob2RVdGlscy5pc01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiKSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCk7DQotICAgICAgICBhc3NlcnRUcnVlKE1ldGhvZFV0aWxzLmlzTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIpKTsNCi0gICAgICAgIC8vMXggZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkgYW5kIDF4IGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwNCi0gICAgICAgIGFzc2VydFRydWUoTWV0aG9kVXRpbHMuY2hlY2tNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIiwgMikpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2M3ZjliLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UgZXh0ZW5kcyBFTENyb3NzVmFsVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKExvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgRUxDcm9zc1ZhbFRlc3REYXRlQmVhbiBnZXRFbnRpdHlJbnN0YW5jZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdERhdGVCZWFuKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU3ZTIxNy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIExvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3REYXRlQmVhbiBleHRlbmRzIEVMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4NCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERhdGUgREVGQVVMVF9EQVRFID0gbmV3IERhdGUoKTsNCi0NCi0gICAgQEVxdWFscygiZGF0ZTIiKQ0KLSAgICBwcml2YXRlIERhdGUgZGF0ZTEgPSBERUZBVUxUX0RBVEU7DQotDQotICAgIHByaXZhdGUgRGF0ZSBkYXRlMiA9IERFRkFVTFRfREFURTsNCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGF0ZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZTEoRGF0ZSBkYXRlMSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5kYXRlMSA9IGRhdGUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldERhdGUyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRhdGUyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERhdGUyKERhdGUgZGF0ZTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGF0ZTIgPSBkYXRlMjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOGIwYTQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsLm1vY2suTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS51dGlsLk1ldGhvZFV0aWxzOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlIGV4dGVuZHMgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotDQotICAgICAgICBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbigpOw0KLQ0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoRXF1YWxzLmNsYXNzLmdldE5hbWUoKSwgTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHLCBjb25maWcpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCByZXRlc3QgdGhpcyB0ZXN0LWNhc2UNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgcmV0ZXN0IHRoaXMgdGVzdC1jYXNlDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKTsNCi0gICAgICAgIGFzc2VydEZhbHNlKE1ldGhvZFV0aWxzLmlzTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShNZXRob2RVdGlscy5pc01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiKSk7DQotICAgICAgICAvLzF4IGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5IGFuZCAxeCBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsDQotICAgICAgICBhc3NlcnRUcnVlKE1ldGhvZFV0aWxzLmNoZWNrTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIsIDIpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmY2MwOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLkFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5EYXRlVGltZUNvbnZlcnRlcjsNCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZQ0KLXsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotDQotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgICAgICBjcmVhdGVSZXF1ZXN0U2NvcGVkQmVhbigiYmVhbjEiLCBnZXRFbnRpdHlJbnN0YW5jZSgpKTsNCi0NCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOw0KLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOw0KLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOw0KLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsNCi0NCi0gICAgICAgIC8vaW5wdXQxDQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldElkKCJpbnB1dDEiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRDb252ZXJ0ZXIobmV3IERhdGVUaW1lQ29udmVydGVyKCkpOw0KLSAgICAgICAgKChEYXRlVGltZUNvbnZlcnRlcilpbnB1dENvbXBvbmVudDEuZ2V0Q29udmVydGVyKCkpLnNldFBhdHRlcm4oImRkLk1NLnl5eXkiKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQxKTsNCi0NCi0gICAgICAgIC8vaW5wdXQyDQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRDb252ZXJ0ZXIobmV3IERhdGVUaW1lQ29udmVydGVyKCkpOw0KLSAgICAgICAgKChEYXRlVGltZUNvbnZlcnRlcilpbnB1dENvbXBvbmVudDIuZ2V0Q29udmVydGVyKCkpLnNldFBhdHRlcm4oImRkLk1NLnl5eXkiKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQyKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlUHJvcGVydHlDaGFpbkNyb3NzQ29tcG9uZW50VmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlUHJvcGVydHlDaGFpbkNyb3NzQ29tcG9uZW50VmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTIuMTIuMjAwOCIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUHJvcGVydHlDaGFpbkNyb3NzQ29tcG9uZW50VmFsaWRhdGlvblVzZUNhc2UoU3RyaW5nIHZhbHVlQmVhbjFQcm9wZXJ0eTEsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3tiZWFuMS5kYXRlMX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje2JlYW4xLnN1YkJlYW4uZGF0ZTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKHZhbHVlQmVhbjFQcm9wZXJ0eTEpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKHZhbHVlQmVhbjJQcm9wZXJ0eTIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjEyLjEyLjIwMDgiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUVMTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvblVzZUNhc2UoU3RyaW5nIHZhbHVlQmVhbjFQcm9wZXJ0eTEsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkxKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3tiZWFuMS5kYXRlMX0iKTsNCi0NCi0gICAgICAgIC8vc2V0IG1vZGVsIHZhbHVlcw0KLSAgICAgICAgcmVzb2x2ZUJlYW4oImJlYW4xIiwgZ2V0RW50aXR5SW5zdGFuY2UoKS5nZXRDbGFzcygpKS5nZXRTdWJCZWFuKCkuc2V0RGF0ZTIoKERhdGUpaW5wdXRDb21wb25lbnQyLmdldENvbnZlcnRlcigpLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgaW5wdXRDb21wb25lbnQyLCB2YWx1ZUJlYW4yUHJvcGVydHkxKSk7DQotDQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKHZhbHVlQmVhbjFQcm9wZXJ0eTEpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVCZWFuIGdldEVudGl0eUluc3RhbmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4oKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzU1YzEyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVCZWFuDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlIERFRkFVTFRfREFURSA9IG5ldyBEYXRlKCk7DQotDQotICAgIEBFcXVhbHMoInN1YkJlYW4uZGF0ZTIiKQ0KLSAgICBwcml2YXRlIERhdGUgZGF0ZTEgPSBERUZBVUxUX0RBVEU7DQotDQotICAgIHByaXZhdGUgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuIHN1YkJlYW4gPSBuZXcgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuKCk7DQotDQotICAgIHB1YmxpYyBEYXRlIGdldERhdGUxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRhdGUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERhdGUxKERhdGUgZGF0ZTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGF0ZTEgPSBkYXRlMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuIGdldFN1YkJlYW4oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3ViQmVhbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdWJCZWFuKFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbiBzdWJCZWFuKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnN1YkJlYW4gPSBzdWJCZWFuOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYzJhMmQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlIERFRkFVTFRfREFURSA9IG5ldyBEYXRlKCk7DQotDQotICAgIHByaXZhdGUgRGF0ZSBkYXRlMiA9IERFRkFVTFRfREFURTsNCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGF0ZTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZTIoRGF0ZSBkYXRlMikNCi0gICAgew0KLSAgICAgICAgdGhpcy5kYXRlMiA9IGRhdGUyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYxVGVzdEJlYW4uamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYxVGVzdEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ4MTJhMS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMVRlc3RCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmOw0KLQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZElmMVRlc3RCZWFuDQotew0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTE7DQotDQotICAgIEBSZXF1aXJlZElmKHZhbHVlT2YgPSAicHJvcGVydHkxIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkyOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKFN0cmluZyBwcm9wZXJ0eTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjFUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjFUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2QzYmNiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYxVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5BYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRJZjFUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UNCi17DQotDQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLQ0KLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgUmVxdWlyZWRJZjFUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlcXVpcmVkSWYxVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0gICAgICAgIFJlcXVpcmVkSWYxVGVzdEJlYW4gYmVhbiA9IG5ldyBSZXF1aXJlZElmMVRlc3RCZWFuKCk7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcobnVsbCwgInZhbHVlIiwgIiN7dGVzdEJlYW59Iik7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dCgidGVzdEJlYW4iLCBiZWFuKTsNCi0NCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOw0KLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOw0KLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOw0KLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0SWQoImlucHV0MSIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRJZCgiaW5wdXQyIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZWFyRG93bigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmVGFyZ2V0Tm90RW1wdHlGYWlsZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZUYXJnZXROb3RFbXB0eUNvcnJlY3QxKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZlRhcmdldE5vdEVtcHR5Q29ycmVjdDIoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmVGFyZ2V0Tm90RW1wdHlDb3JyZWN0MygpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjJUZXN0QmVhbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjJUZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzIwM2VlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYyVGVzdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkSWY7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmVHlwZS4qOw0KLQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZElmMlRlc3RCZWFuDQotew0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTE7DQotICAgIEBSZXF1aXJlZElmKHZhbHVlT2YgPSAicHJvcGVydHkxIiwgaXMgPSBlbXB0eSkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkyOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKFN0cmluZyBwcm9wZXJ0eTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjJUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWY3OTRhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5BYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRJZjJUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UNCi17DQotDQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLQ0KLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgUmVxdWlyZWRJZjJUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlcXVpcmVkSWYyVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0gICAgICAgIFJlcXVpcmVkSWYyVGVzdEJlYW4gYmVhbiA9IG5ldyBSZXF1aXJlZElmMlRlc3RCZWFuKCk7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcobnVsbCwgInZhbHVlIiwgIiN7dGVzdEJlYW59Iik7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dCgidGVzdEJlYW4iLCBiZWFuKTsNCi0NCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOw0KLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOw0KLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOw0KLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0SWQoImlucHV0MSIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRJZCgiaW5wdXQyIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZWFyRG93bigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmVGFyZ2V0RW1wdHlGYWlsZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZUYXJnZXRFbXB0eUNvcnJlY3QxKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZlRhcmdldEVtcHR5Q29ycmVjdDIoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmVGFyZ2V0RW1wdHlDb3JyZWN0MygpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjNUZXN0QmVhbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjNUZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTkyMjNiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYzVGVzdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkSWY7DQotDQotcHVibGljIGNsYXNzIFJlcXVpcmVkSWYzVGVzdEJlYW4NCi17DQotICAgIHByaXZhdGUgQm9vbGVhbiBwcm9wZXJ0eTE7DQotICAgIEBSZXF1aXJlZElmKHZhbHVlT2YgPSAicHJvcGVydHkxIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkyOw0KLQ0KLSAgICBwdWJsaWMgQm9vbGVhbiBnZXRQcm9wZXJ0eTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MShCb29sZWFuIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmM1Rlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmM1Rlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYjVlZTguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjNUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLkFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZElmM1Rlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZQ0KLXsNCi0NCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotDQotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHB1YmxpYyBSZXF1aXJlZElmM1Rlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVxdWlyZWRJZjNUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgUmVxdWlyZWRJZjNUZXN0QmVhbiBiZWFuID0gbmV3IFJlcXVpcmVkSWYzVGVzdEJlYW4oKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhudWxsLCAidmFsdWUiLCAiI3t0ZXN0QmVhbn0iKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucHV0KCJ0ZXN0QmVhbiIsIGJlYW4pOw0KLQ0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7DQotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7DQotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7DQotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRJZCgiaW5wdXQxIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZCb29sZWFuVGFyZ2V0Tm90RW1wdHlGYWlsZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZCb29sZWFuVGFyZ2V0Tm90RW1wdHlDb3JyZWN0MSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZShCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZCb29sZWFuVGFyZ2V0Tm90RW1wdHlDb3JyZWN0MigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZShCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmQm9vbGVhblRhcmdldE5vdEVtcHR5Q29ycmVjdDMoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoQm9vbGVhbi5GQUxTRS50b1N0cmluZygpKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmNFRlc3RCZWFuLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmNFRlc3RCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NGY1NTAuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjRUZXN0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkSWZUeXBlLio7DQotDQotcHVibGljIGNsYXNzIFJlcXVpcmVkSWY0VGVzdEJlYW4NCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiBwcm9wZXJ0eTE7DQotICAgIEBSZXF1aXJlZElmKHZhbHVlT2YgPSAicHJvcGVydHkxIiwgaXMgPSBlbXB0eSkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkyOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5MSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKGJvb2xlYW4gcHJvcGVydHkxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MSA9IHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkyKFN0cmluZyBwcm9wZXJ0eTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkyID0gcHJvcGVydHkyOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWY0VGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWY0VGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU2NTE2OS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmNFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZElmNFRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZQ0KLXsNCi0NCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotDQotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHB1YmxpYyBSZXF1aXJlZElmNFRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVxdWlyZWRJZjRUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgUmVxdWlyZWRJZjRUZXN0QmVhbiBiZWFuID0gbmV3IFJlcXVpcmVkSWY0VGVzdEJlYW4oKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhudWxsLCAidmFsdWUiLCAiI3t0ZXN0QmVhbn0iKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucHV0KCJ0ZXN0QmVhbiIsIGJlYW4pOw0KLQ0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7DQotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7DQotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7DQotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRJZCgiaW5wdXQxIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZCb29sZWFuVGFyZ2V0RW1wdHlGYWlsZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoQm9vbGVhbi5GQUxTRS50b1N0cmluZygpKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmQm9vbGVhblRhcmdldEVtcHR5Q29ycmVjdDEoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoQm9vbGVhbi5GQUxTRS50b1N0cmluZygpKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZkJvb2xlYW5UYXJnZXRFbXB0eUNvcnJlY3QyKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZkJvb2xlYW5UYXJnZXRFbXB0eUNvcnJlY3QzKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9tb2NrL01vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL21vY2svTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjVkNDgyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL21vY2svTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbC5tb2NrOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuRXF1YWxzU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UudXRpbC5NZXRob2RVdGlsczsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEVxdWFsc1N0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIE1ldGhvZFV0aWxzLnNpZ25hbENsYXNzVXNlZChnZXRDbGFzcygpKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIE1ldGhvZFV0aWxzLnNpZ25hbE1ldGhvZENhbGxlZChnZXRDbGFzcygpLCAicmV2ZXJzZU1lc3NhZ2UiKTsNCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgTWV0aG9kVXRpbHMuc2lnbmFsTWV0aG9kQ2FsbGVkKGdldENsYXNzKCksICJyZXZlcnNlTWVzc2FnZSIpOw0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3VzdG9tL0N1c3RvbVZpb2xhdGlvblNldmVyaXR5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jdXN0b20vQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJkNjcxOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jdXN0b20vQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3VzdG9tOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5QYXJhbWV0ZXJLZXk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlBhcmFtZXRlclZhbHVlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotcHVibGljIGludGVyZmFjZSBDdXN0b21WaW9sYXRpb25TZXZlcml0eQ0KLXsNCi0gICAgaW50ZXJmYWNlIFdhcm5pbmcgZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotICAgIHsNCi0gICAgICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgICAgIHB1YmxpYyBDbGFzcyBLRVkgPSBDdXN0b21WaW9sYXRpb25TZXZlcml0eS5jbGFzczsNCi0NCi0gICAgICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFNFVkVSSVRZID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk47DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uTW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uTW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTU4MGFmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvbk1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlZhbGlkYXRpb25Nb2R1bGVBd2FyZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25Nb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZQ0KLXsNCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBSZWdpc3RyYXRpb25Nb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWdpc3RyYXRpb25Nb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbml0aWFsaXphdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJlc2V0RXh0VmFsQ29udGV4dCgpOw0KLQ0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0R2xvYmFsTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxMDAwKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgVGVzdE1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMygpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0R2xvYmFsTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxKCkpOw0KLQ0KLSAgICAgICAgY2hlY2tHbG9iYWxPbmx5UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7DQotICAgICAgICBjaGVja01vZHVsZUF3YXJlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzV2l0aFRlc3RNb2R1bGUoKTsNCi0gICAgICAgIGNoZWNrTW9kdWxlQXdhcmVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNXaXRoUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrR2xvYmFsT25seVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpDQotICAgIHsNCi0gICAgICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOw0KLQ0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDM7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3VsdExlbmd0aCwgcmVzdWx0LnNpemUoKSk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0R2xvYmFsTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEdsb2JhbE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tNb2R1bGVBd2FyZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc1dpdGhUZXN0TW9kdWxlKCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzRm9yKFRlc3RNb2R1bGUuY2xhc3MpOw0KLQ0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDU7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuc2l6ZSgpID09IHJlc3VsdExlbmd0aCk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RHbG9iYWxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0TW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IyKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdE1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMyk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RHbG9iYWxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEwMDApOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjaGVja01vZHVsZUF3YXJlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzV2l0aFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZSgpDQotICAgIHsNCi0gICAgICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc0ZvcihQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MpOw0KLQ0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDQ7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuc2l6ZSgpID09IHJlc3VsdExlbmd0aCk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0R2xvYmFsTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMi5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RHbG9iYWxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEwMDAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDEpDQotICAgIGNsYXNzIFRlc3RHbG9iYWxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMikNCi0gICAgY2xhc3MgVGVzdE1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMiBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLCBWYWxpZGF0aW9uTW9kdWxlQXdhcmUNCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNb2R1bGVLZXlzKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpLCBUZXN0TW9kdWxlLmNsYXNzLmdldE5hbWUoKX07DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigzKQ0KLSAgICBjbGFzcyBUZXN0TW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IzIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IsIFZhbGlkYXRpb25Nb2R1bGVBd2FyZQ0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldE1vZHVsZUtleXMoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge1Rlc3RNb2R1bGUuY2xhc3MuZ2V0TmFtZSgpfTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBUZXN0TW9kdWxlDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDEwMDApDQotICAgIGNsYXNzIFRlc3RHbG9iYWxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEwMDAgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvbk1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvbk1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI0NTg0NS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25Nb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5WYWxpZGF0aW9uTW9kdWxlQXdhcmU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uTW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUmVnaXN0cmF0aW9uTW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVnaXN0cmF0aW9uTW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ySW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICByZXNldEV4dFZhbENvbnRleHQoKTsNCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMTAwMCgpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IyKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjMoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMSgpKTsNCi0NCi0gICAgICAgIGNoZWNrR2xvYmFsT25seVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOw0KLSAgICAgICAgY2hlY2tNb2R1bGVBd2FyZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc1dpdGhUZXN0TW9kdWxlKCk7DQotICAgICAgICBjaGVja01vZHVsZUF3YXJlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzV2l0aFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjaGVja0dsb2JhbE9ubHlQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsNCi0NCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSAzOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHRMZW5ndGgsIHJlc3VsdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMS5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjEwMDAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrTW9kdWxlQXdhcmVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNXaXRoVGVzdE1vZHVsZSgpDQotICAgIHsNCi0gICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc0ZvcihUZXN0TW9kdWxlLmNsYXNzKTsNCi0NCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSA1Ow0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LnNpemUoKSA9PSByZXN1bHRMZW5ndGgpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdE1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMik7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RNb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjMpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxMDAwKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDQ6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tNb2R1bGVBd2FyZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc1dpdGhQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGUoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IoUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzKTsNCi0NCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSA0Ow0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LnNpemUoKSA9PSByZXN1bHRMZW5ndGgpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMS5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxMDAwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMSkNCi0gICAgY2xhc3MgVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMSBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMikNCi0gICAgY2xhc3MgVGVzdE1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMiBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLCBWYWxpZGF0aW9uTW9kdWxlQXdhcmUNCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYmVmb3JlVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TW9kdWxlS2V5cygpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7UHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzLmdldE5hbWUoKSwgVGVzdE1vZHVsZS5jbGFzcy5nZXROYW1lKCl9Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMykNCi0gICAgY2xhc3MgVGVzdE1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMyBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLCBWYWxpZGF0aW9uTW9kdWxlQXdhcmUNCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYmVmb3JlVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TW9kdWxlS2V5cygpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7VGVzdE1vZHVsZS5jbGFzcy5nZXROYW1lKCl9Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RNb2R1bGUNCi0gICAgew0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTAwMCkNCi0gICAgY2xhc3MgVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMTAwMCBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvblJlbmRlcmVySW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uUmVuZGVyZXJJbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMDY0YjEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uUmVuZGVyZXJJbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5BYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvblJlbmRlcmVySW50ZXJjZXB0b3JUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUmVnaXN0cmF0aW9uUmVuZGVyZXJJbnRlcmNlcHRvclRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWdpc3RyYXRpb25SZW5kZXJlckludGVyY2VwdG9yVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiQ29uc3RhbnRDb25kaXRpb25zIn0pDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW5kZXJlckludGVyY2VwdG9ySW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFRlc3RDb21wb25lbnRJbml0aWFsaXplcigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMSgpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMigpKTsNCi0NCi0gICAgICAgIExpc3Q8UmVuZGVyZXJJbnRlcmNlcHRvcj4gcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKTsNCi0NCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSA0Ow0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHRMZW5ndGgsIHJlc3VsdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgUmVuZGVyZXJJbnRlcmNlcHRvciB0bXA7DQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgdG1wID0gcmVzdWx0LmdldChpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHRtcCBpbnN0YW5jZW9mIFRlc3RDb21wb25lbnRJbml0aWFsaXplciB8fA0KLSAgICAgICAgICAgICAgICAgICAgdG1wIGluc3RhbmNlb2YgVmFsaWRhdGlvbkludGVyY2VwdG9yIHx8ICAvKmR1ZSB0byBhIGp1bml0IGlzc3VlKi8NCi0gICAgICAgICAgICAgICAgICAgIHRtcCBpbnN0YW5jZW9mIFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdENvbXBvbmVudEluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIxIGV4dGVuZHMgVGVzdENvbXBvbmVudEluaXRpYWxpemVyDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIyIGV4dGVuZHMgVGVzdENvbXBvbmVudEluaXRpYWxpemVyDQotICAgIHsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vcG9tLnhtbCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODNmMmVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIEJlYW4tVmFsaWRhdGlvbi1JbnRlZ3JhdGlvbi1Nb2R1bGUgKEpTUiAzMDMpPC9uYW1lPgotICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+amJvc3M8L2lkPgotICAgICAgICAgICAgPHVybD5odHRwOi8vcmVwb3NpdG9yeS5qYm9zcy5jb20vbWF2ZW4yPC91cmw+Ci0gICAgICAgICAgICA8cmVsZWFzZXM+Ci0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4KLSAgICAgICAgICAgIDwvcmVsZWFzZXM+Ci0gICAgICAgICAgICA8c25hcHNob3RzPgotICAgICAgICAgICAgICAgIDxlbmFibGVkPmZhbHNlPC9lbmFibGVkPgotICAgICAgICAgICAgPC9zbmFwc2hvdHM+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+amJvc3Mtc25hcHNob3Q8L2lkPgotICAgICAgICAgICAgPHVybD5odHRwOi8vc25hcHNob3RzLmpib3NzLm9yZy9tYXZlbjI8L3VybD4KLSAgICAgICAgICAgIDxyZWxlYXNlcz4KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPgotICAgICAgICAgICAgPC9yZWxlYXNlcz4KLSAgICAgICAgICAgIDxzbmFwc2hvdHM+Ci0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4KLSAgICAgICAgICAgIDwvc25hcHNob3RzPgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgPC9yZXBvc2l0b3JpZXM+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnZhbGlkYXRpb248L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wLkdBPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICAgICAgPCEtLSBUZXN0IGRlcGVuZGVuY2llcyAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi41PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldC5qc3A8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3AtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zaGFsZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNoYWxlLXRlc3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuNDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovQWJzdHJhY3QqLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9UZXN0VXRpbHMuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypCZWFuLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+ICAgICAgICAgICAgCi0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGJiMzY1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDDQotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMC8vRU4iDQotICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWZhY2VzY29uZmlnXzFfMS5kdGQiID4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08ZmFjZXMtY29uZmlnPg0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0YXJ0dXAuQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2MWNmOS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhbkF3YXJlQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5Bd2FyZUNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YTc0MDQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhbkF3YXJlQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7DQotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgQmVhbkF3YXJlQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeQ0KLXsNCi0gICAgcHJpdmF0ZSBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBjb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeTsNCi0NCi0gICAgcHVibGljIEJlYW5Bd2FyZUNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KQ0KLSAgICB7DQotICAgICAgICBzZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeShjb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkpDQotICAgIHsNCi0gICAgICAgIGlmKGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibnVsbCBpcyBub3QgYWxsb3dlZCBoZXJlIik7DQotICAgICAgICB9DQotICAgICAgICB0aGlzLmNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5ID0gY29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFsbG93IHRoZSByZWdpc3RyYXRpb24gb2YgYSBjdXN0b20gcHJlZml4IikNCi0gICAgcHVibGljIDxUIGV4dGVuZHMgQ29uc3RyYWludFZhbGlkYXRvcjw/LCA/Pj4gVCBnZXRJbnN0YW5jZShDbGFzczxUPiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRvckNsYXNzTmFtZSA9IHRhcmdldENsYXNzLmdldFNpbXBsZU5hbWUoKTsNCi0gICAgICAgIE9iamVjdCByZXN1bHQgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4oY3JlYXRlQmVhbk5hbWUodmFsaWRhdG9yQ2xhc3NOYW1lKSk7DQotDQotICAgICAgICBpZihyZXN1bHQgIT0gbnVsbCAmJiB0YXJnZXRDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHJlc3VsdC5nZXRDbGFzcygpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFQpcmVzdWx0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuZ2V0SW5zdGFuY2UodGFyZ2V0Q2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZUJlYW5OYW1lKFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKHZhbGlkYXRvckNsYXNzTmFtZSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2Q3NmM2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5Bd2FyZVZhbGlkYXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yQ29udGV4dDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5NZXNzYWdlSW50ZXJwb2xhdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlRyYXZlcnNhYmxlUmVzb2x2ZXI7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeSBpbXBsZW1lbnRzIFZhbGlkYXRvckZhY3RvcnkNCi17DQotICAgIHByaXZhdGUgVmFsaWRhdG9yRmFjdG9yeSB2YWxpZGF0b3JGYWN0b3J5Ow0KLQ0KLSAgICBwdWJsaWMgQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeShWYWxpZGF0b3JGYWN0b3J5IHZhbGlkYXRvckZhY3RvcnkpDQotICAgIHsNCi0gICAgICAgIHNldFZhbGlkYXRvckZhY3RvcnkodmFsaWRhdG9yRmFjdG9yeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yRmFjdG9yeShWYWxpZGF0b3JGYWN0b3J5IHZhbGlkYXRvckZhY3RvcnkpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRvckZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJudWxsIGlzIG5vdCBhbGxvd2VkIGhlcmUiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRoaXMudmFsaWRhdG9yRmFjdG9yeSA9IHZhbGlkYXRvckZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeS5nZXRWYWxpZGF0b3IoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdG9yQ29udGV4dCB1c2luZ0NvbnRleHQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeS51c2luZ0NvbnRleHQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZUludGVycG9sYXRvciBnZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRvckZhY3RvcnkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBUcmF2ZXJzYWJsZVJlc29sdmVyIGdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeS5nZXRUcmF2ZXJzYWJsZVJlc29sdmVyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGdldENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBCZWFuQXdhcmVDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSh2YWxpZGF0b3JGYWN0b3J5LmdldENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyA8VD4gVCB1bndyYXAoQ2xhc3M8VD4gdENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeS51bndyYXAodENsYXNzKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1MzYyNy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuVmFsaWRhdGlvbk1vZHVsZUtleTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVmFsaWRhdGlvbk1vZHVsZUtleQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQmVhblZhbGlkYXRpb25Nb2R1bGVLZXkNCi17DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOThjOTEwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkFic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC51dGlsLkJlYW5WYWxpZGF0aW9uVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscyBidmlVdGlscyA9DQotICAgICAgICAgICAgbmV3IEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzKHRoaXMubG9nZ2VyKTsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvblN1cHBvcnRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHRvIGluaXQgY29tcG9uZW50ICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gYnZpVXRpbHMuZXh0cmFjdFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZ2V0UHJvcGVydGllc0ZvckNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKHVpQ29tcG9uZW50KSk7DQotDQotICAgICAgICBpZiAocHJvcGVydHlEZXRhaWxzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdENvbXBvbmVudFdpdGhQcm9wZXJ0eURldGFpbHMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgcHJvcGVydHlEZXRhaWxzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImluaXQgY29tcG9uZW50IG9mICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q29tcG9uZW50V2l0aFByb3BlcnR5RGV0YWlscyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscykNCi0gICAgew0KLSAgICAgICAgdGhpcy5idmlVdGlscy5pbml0Q29tcG9uZW50V2l0aFByb3BlcnR5RGV0YWlscyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBwcm9wZXJ0eURldGFpbHMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBnZXRQcm9wZXJ0eUluZm9ybWF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgYm9vbGVhbiB2YWxpZGF0ZVByb3BlcnR5ID0gaGFzQmVhblZhbGlkYXRpb25Db25zdHJhaW50cyhwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZVByb3BlcnR5KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImpzcjMwMyBzdGFydCB2YWxpZGF0aW9uIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcHJvY2Vzc0ZpZWxkVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGZpbmFsbHkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodmFsaWRhdGVQcm9wZXJ0eSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJqc3IzMDMgdmFsaWRhdGlvbiBmaW5pc2hlZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBidmlVdGlscy5nZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcihwcm9wZXJ0aWVzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNCZWFuVmFsaWRhdGlvbkNvbnN0cmFpbnRzKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuYnZpVXRpbHMuaGFzQmVhblZhbGlkYXRpb25Db25zdHJhaW50cyhwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRmllbGRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIC8qbm90IHVzZWQgeWV0IHN1cHBvcnRNdWx0aXBsZVZpb2xhdGlvbnNQZXJGaWVsZCgpKi8NCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPiB2aW9sYXRpb25zID0gdGhpcy5idmlVdGlscw0KLSAgICAgICAgICAgICAgICAudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIHByb2Nlc3NDb25zdHJhaW50VmlvbGF0aW9ucyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHZpb2xhdGlvbnMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NDb25zdHJhaW50VmlvbGF0aW9ucyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb24+IHZpb2xhdGlvbnMpDQotICAgIHsNCi0gICAgICAgIGlmKHZpb2xhdGlvbnMgIT0gbnVsbCAmJiAhdmlvbGF0aW9ucy5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQmVhblZhbGlkYXRpb25VdGlscy5wcm9jZXNzQ29uc3RyYWludFZpb2xhdGlvbnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCB2aW9sYXRpb25zKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIENsYXNzIGdldE1vZHVsZUtleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBCZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscy5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBmOGE3Yi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmdyb3Vwcy5EZWZhdWx0Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkJlYW5EZXNjcmlwdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkVsZW1lbnREZXNjcmlwdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzDQotew0KLSAgICBwcml2YXRlIExvZyBsb2dnZXI7DQotDQotICAgIEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzKExvZyBsb2dnZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyOw0KLSAgICB9DQotDQotICAgIFByb3BlcnR5RGV0YWlscyBleHRyYWN0UHJvcGVydHlEZXRhaWxzKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXNGb3JFeHRyYWN0aW9uKQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcmVzdWx0ID0gZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IocHJvcGVydGllc0ZvckV4dHJhY3Rpb24pDQotICAgICAgICAgICAgICAgIC5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpDQotICAgICAgICAgICAgICAgIC5nZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdC5nZXRCYXNlT2JqZWN0KCkgPT0gbnVsbCAmJiB0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5sb2dnZXIud2Fybigibm8gYmFzZSBvYmplY3QgYXQgIiArIHJlc3VsdC5nZXRLZXkoKSArDQotICAgICAgICAgICAgICAgICAgICAiIGNvbXBvbmVudC1pZDogIiArIHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC5nZXRCYXNlT2JqZWN0KCkgIT0gbnVsbCA/IHJlc3VsdCA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogYWxzbyBpbnZva2VzIG1ldGEtZGF0YSBleHRyYWN0aW9uIGludGVyY2VwdG9ycw0KLSAgICAgKiAoc2VlIGUuZy4gRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcikNCi0gICAgICovDQotICAgIE1ldGFEYXRhRXh0cmFjdG9yIGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yV2l0aChwcm9wZXJ0aWVzKTsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIGluaXRDb21wb25lbnRXaXRoUHJvcGVydHlEZXRhaWxzKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBDbGFzc1tdIGZvdW5kR3JvdXBzID0gcmVzb2x2ZUdyb3VwcyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmIChmb3VuZEdyb3VwcyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGZvdW5kR3JvdXBzLmxlbmd0aCA9PSAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvdW5kR3JvdXBzID0gbmV3IENsYXNzW117RGVmYXVsdC5jbGFzc307DQotICAgICAgICB9DQotDQotICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIHRhcmdldENsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyh0YXJnZXRDbGFzcyk7DQotDQotICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBlbGVtZW50RGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3JGb3IodGFyZ2V0Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpKTsNCi0NCi0gICAgICAgIGlmIChlbGVtZW50RGVzY3JpcHRvciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHByb2Nlc3NFbGVtZW50RGVzY3JpcHRvcihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBmb3VuZEdyb3VwcywgZWxlbWVudERlc2NyaXB0b3IpOw0KLSAgICB9DQotDQotICAgIHZvaWQgcHJvY2Vzc0VsZW1lbnREZXNjcmlwdG9yKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1tdIGZvdW5kR3JvdXBzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBlbGVtZW50RGVzY3JpcHRvcikNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YTsNCi0NCi0gICAgICAgIGZvciAoQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gY29uc3RyYWludERlc2NyaXB0b3IgOg0KLSAgICAgICAgICAgICAgICBlbGVtZW50RGVzY3JpcHRvci5maW5kQ29uc3RyYWludHMoKS51bm9yZGVyZWRBbmRNYXRjaGluZ0dyb3Vwcyhmb3VuZEdyb3VwcykuZ2V0Q29uc3RyYWludERlc2NyaXB0b3JzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGEgPSB0cmFuc2Zvcm1Db25zdHJhaW50RGVzY3JpcHRvclRvTWV0YURhdGEoDQotICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50RGVzY3JpcHRvciwgZWxlbWVudERlc2NyaXB0b3IuZ2V0RWxlbWVudENsYXNzKCkpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YSAhPSBudWxsICYmICFtZXRhRGF0YS5pc0VtcHR5KCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiQ29uc3RyYWludERlc2NyaXB0b3IjaXNSZXBvcnRBc1NpbmdsZVZpb2xhdGlvbiIpDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1Db25zdHJhaW50RGVzY3JpcHRvclRvTWV0YURhdGEoDQotICAgICAgICAgICAgQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gY29uc3RyYWludERlc2NyaXB0b3IsIENsYXNzIGVsZW1lbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0NCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSBFeHRWYWxVdGlscy5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KA0KLSAgICAgICAgICAgICAgICBuZXcgQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5KGNvbnN0cmFpbnREZXNjcmlwdG9yLCBlbGVtZW50Q2xhc3MpKTsNCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LnB1dEFsbCh0cmFuc2Zvcm1NZXRhRGF0YShtZXRhRGF0YVRyYW5zZm9ybWVyLCBjb25zdHJhaW50RGVzY3JpcHRvcikpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKCFjb25zdHJhaW50RGVzY3JpcHRvci5pc1JlcG9ydEFzU2luZ2xlVmlvbGF0aW9uKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgU2V0PENvbnN0cmFpbnREZXNjcmlwdG9yPD8+PiBjb21wb3NpbmdDb25zdHJhaW50cyA9IGNvbnN0cmFpbnREZXNjcmlwdG9yLmdldENvbXBvc2luZ0NvbnN0cmFpbnRzKCk7DQotICAgICAgICAgICAgaWYgKGNvbXBvc2luZ0NvbnN0cmFpbnRzICE9IG51bGwgJiYgIWNvbXBvc2luZ0NvbnN0cmFpbnRzLmlzRW1wdHkoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXRBbGwodHJhbnNmb3JtQ29tcG9zaW5nQ29uc3RyYWludHMoY29tcG9zaW5nQ29uc3RyYWludHMsIGVsZW1lbnRDbGFzcykpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybUNvbXBvc2luZ0NvbnN0cmFpbnRzKA0KLSAgICAgICAgICAgIFNldDxDb25zdHJhaW50RGVzY3JpcHRvcjw/Pj4gY29tcG9zaW5nQ29uc3RyYWludHMsIENsYXNzIGVsZW1lbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIGZvciAoQ29uc3RyYWludERlc2NyaXB0b3IgY29uc3RyYWludERlc2NyaXB0b3IgOiBjb21wb3NpbmdDb25zdHJhaW50cykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQucHV0QWxsKHRyYW5zZm9ybUNvbnN0cmFpbnREZXNjcmlwdG9yVG9NZXRhRGF0YShjb25zdHJhaW50RGVzY3JpcHRvciwgZWxlbWVudENsYXNzKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YSgNCi0gICAgICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIsIENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IGNvbnN0cmFpbnREZXNjcmlwdG9yKQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUVudHJ5IGVudHJ5Ow0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQ7DQotICAgICAgICBpZiAodGhpcy5sb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGVudHJ5ID0gbmV3IE1ldGFEYXRhRW50cnkoKTsNCi0gICAgICAgIGVudHJ5LnNldEtleShjb25zdHJhaW50RGVzY3JpcHRvci5nZXRBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgZW50cnkuc2V0VmFsdWUoY29uc3RyYWludERlc2NyaXB0b3IpOw0KLQ0KLSAgICAgICAgcmVzdWx0ID0gbWV0YURhdGFUcmFuc2Zvcm1lci5jb252ZXJ0TWV0YURhdGEoZW50cnkpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBib29sZWFuIGhhc0JlYW5WYWxpZGF0aW9uQ29uc3RyYWludHMoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMuZ2V0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKSk7DQotDQotICAgICAgICByZXR1cm4gZ2V0RGVzY3JpcHRvckZvcih0YXJnZXRDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCkpICE9IG51bGw7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb24+IHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIENsYXNzIGJhc2VCZWFuQ2xhc3MgPSBnZXRCYXNlQ2xhc3NUeXBlKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGdldFByb3BlcnR5VG9WYWxpZGF0ZShwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIENsYXNzW10gZ3JvdXBzID0gcmVzb2x2ZUdyb3VwcyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmIChncm91cHMgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFZhbGlkYXRvckZhY3RvcnkgdmFsaWRhdG9yRmFjdG9yeSA9IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWYWxpZGF0b3JGYWN0b3J5KCk7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeQ0KLSAgICAgICAgICAgICAgICAudXNpbmdDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLm1lc3NhZ2VJbnRlcnBvbGF0b3IoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKSkNCi0gICAgICAgICAgICAgICAgLmNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KHZhbGlkYXRvckZhY3RvcnkuZ2V0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoKSkNCi0gICAgICAgICAgICAgICAgLnRyYXZlcnNhYmxlUmVzb2x2ZXIodmFsaWRhdG9yRmFjdG9yeS5nZXRUcmF2ZXJzYWJsZVJlc29sdmVyKCkpDQotICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0b3IoKQ0KLSAgICAgICAgICAgICAgICAudmFsaWRhdGVWYWx1ZShiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eU5hbWUsIGNvbnZlcnRlZE9iamVjdCwgZ3JvdXBzKTsNCi0gICAgfQ0KLQ0KLSAgICBDbGFzcyBnZXRCYXNlQ2xhc3NUeXBlKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgcmVzdWx0ID0gRXh0VmFsVXRpbHMuZ2V0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5SW5mb3JtYXRpb24pLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpOw0KLQ0KLSAgICAgICAgcmV0dXJuIFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MocmVzdWx0KTsNCi0gICAgfQ0KLQ0KLSAgICBTdHJpbmcgZ2V0UHJvcGVydHlUb1ZhbGlkYXRlKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFByb3BlcnR5RGV0YWlscyhwcm9wZXJ0eUluZm9ybWF0aW9uKS5nZXRQcm9wZXJ0eSgpOw0KLSAgICB9DQotDQotICAgIENsYXNzW10gcmVzb2x2ZUdyb3VwcyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRHcm91cHMoDQotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldFZpZXdJZCgpLA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpKTsNCi0gICAgfQ0KLQ0KLSAgICBFbGVtZW50RGVzY3JpcHRvciBnZXREZXNjcmlwdG9yRm9yKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIEJlYW5EZXNjcmlwdG9yIGJlYW5EZXNjcmlwdG9yID0gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZhbGlkYXRvckZhY3RvcnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdG9yKCkuZ2V0Q29uc3RyYWludHNGb3JDbGFzcyh0YXJnZXRDbGFzcyk7DQotDQotICAgICAgICByZXR1cm4gYmVhbkRlc2NyaXB0b3IuZ2V0Q29uc3RyYWludHNGb3JQcm9wZXJ0eShwcm9wZXJ0eSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M3Yzg1Ni4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5tZXNzYWdlLmludGVycG9sYXRvci5EZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5tZXNzYWdlLmludGVycG9sYXRvci5FeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuTW9kZWxWYWxpZGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuTW9kZWxWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWwuQmVhblZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLk1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuR3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yRmFjdG9yeTsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGNsYXNzIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBpbXBsZW1lbnRzIEdyb3VwU3RvcmFnZSwgTW9kZWxWYWxpZGF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5jbGFzcy5nZXROYW1lKCkgKyAiOktFWSI7DQotDQotICAgIHByaXZhdGUgTWVzc2FnZUludGVycG9sYXRvciBkZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcjsNCi0NCi0gICAgcHJpdmF0ZSBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOw0KLQ0KLSAgICBwcml2YXRlIEdyb3VwU3RvcmFnZSBncm91cFN0b3JhZ2U7DQotDQotICAgIHByaXZhdGUgTW9kZWxWYWxpZGF0aW9uU3RvcmFnZSBtb2RlbFZhbGlkYXRpb25TdG9yYWdlOw0KLQ0KLSAgICBwcml2YXRlIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCgpDQotICAgIHsNCi0gICAgICAgIGluaXRHcm91cFN0b3JhZ2UoKTsNCi0gICAgICAgIGluaXRNb2RlbFZhbGlkYXRpb25TdG9yYWdlKCk7DQotDQotICAgICAgICBpbml0TWVzc2FnZVJlc29sdmVyKCk7DQotICAgICAgICBpbml0TWVzc2FnZUludGVycG9sYXRvcigpOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyBzdGF0aWMgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGdldEN1cnJlbnRJbnN0YW5jZSgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7DQotDQotICAgICAgICBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgY3VycmVudENvbnRleHQgPSAoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0KXJlcXVlc3RNYXAuZ2V0KEtFWSk7DQotDQotICAgICAgICBpZihjdXJyZW50Q29udGV4dCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gbmV3IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCgpOw0KLSAgICAgICAgICAgIHJlcXVlc3RNYXAucHV0KEtFWSwgY3VycmVudENvbnRleHQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRDb250ZXh0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWxpZGF0b3JGYWN0b3J5IGdldFZhbGlkYXRvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgdmFsaWRhdG9yRmFjdG9yeSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KFZhbGlkYXRvckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGlmKHZhbGlkYXRvckZhY3RvcnkgaW5zdGFuY2VvZiBWYWxpZGF0b3JGYWN0b3J5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoVmFsaWRhdG9yRmFjdG9yeSl2YWxpZGF0b3JGYWN0b3J5Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oImZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0IGJ2IHZhbGlkYXRvciBmYWN0b3J5Iik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gQmVhblZhbGlkYXRpb25VdGlscy5nZXREZWZhdWx0VmFsaWRhdG9yRmFjdG9yeSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlSW50ZXJwb2xhdG9yIGdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLm1lc3NhZ2VSZXNvbHZlciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgRXh0VmFsTWVzc2FnZUludGVycG9sYXRvckFkYXB0ZXIodGhpcy5kZWZhdWx0TWVzc2FnZUludGVycG9sYXRvciwgdGhpcy5tZXNzYWdlUmVzb2x2ZXIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkR3JvdXAoQ2xhc3MgZ3JvdXBDbGFzcywgU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmdyb3VwU3RvcmFnZS5hZGRHcm91cChncm91cENsYXNzLCB2aWV3SWQsIGNsaWVudElkKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZXN0cmljdEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5ncm91cFN0b3JhZ2UucmVzdHJpY3RHcm91cChncm91cENsYXNzLCB2aWV3SWQsIGNsaWVudElkKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3NbXSBnZXRHcm91cHMoU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5ncm91cFN0b3JhZ2UuZ2V0R3JvdXBzKHZpZXdJZCwgY2xpZW50SWQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkobW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllc1RvVmFsaWRhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdEdyb3VwU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZ3JvdXBTdG9yYWdlID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmdldFN0b3JhZ2UoR3JvdXBTdG9yYWdlLmNsYXNzLCBCZWFuVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMubW9kZWxWYWxpZGF0aW9uU3RvcmFnZSA9IEV4dFZhbFV0aWxzLg0KLSAgICAgICAgICAgICAgICBnZXRTdG9yYWdlKE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MsIE1vZGVsVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TWVzc2FnZUludGVycG9sYXRvcigpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmb3VuZEJlYW4gPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4oTWVzc2FnZUludGVycG9sYXRvci5jbGFzcy5nZXROYW1lKCkucmVwbGFjZSgiLiIsICJfIikpOw0KLQ0KLSAgICAgICAgaWYoZm91bmRCZWFuIGluc3RhbmNlb2YgTWVzc2FnZUludGVycG9sYXRvcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmRlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yID0gKE1lc3NhZ2VJbnRlcnBvbGF0b3IpZm91bmRCZWFuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuZGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IgPSBuZXcgRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IoDQotICAgICAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVXRpbHMuZ2V0RGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKS5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TWVzc2FnZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlUmVzb2x2ZXIgPSBFeHRWYWxVdGlscy5nZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koZ2V0QmVhblZhbGlkYXRpb25TdHJhdGVneSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSBnZXRCZWFuVmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kobnVsbCwgbnVsbCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YTA5NWEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQNCi0gICAgICAgIC5BYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigyMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyDQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVSZXF1aXJlZEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgaWYoIUV4dFZhbFV0aWxzLmludGVycHJldEVtcHR5U3RyaW5nVmFsdWVzQXNOdWxsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkgfHwNCi0gICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhpc0NvbXBvbmVudFJlcXVpcmVkKHVpQ29tcG9uZW50KSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZCh0cnVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL0JlYW5WYWxpZGF0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL0JlYW5WYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YThiYjQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9CZWFuVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmdyb3Vwcy5EZWZhdWx0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLQ0KLUBUYXJnZXQoe01FVEhPRCwgRklFTEQsIFRZUEV9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1ARG9jdW1lbnRlZA0KLXB1YmxpYyBAaW50ZXJmYWNlIEJlYW5WYWxpZGF0aW9uDQotew0KLSAgICBTdHJpbmdbXSB2aWV3SWRzKCkgZGVmYXVsdCAiKiI7DQotDQotICAgIENsYXNzW10gdXNlR3JvdXBzKCkgZGVmYXVsdCBEZWZhdWx0LmNsYXNzOw0KLQ0KLSAgICBDbGFzc1tdIHJlc3RyaWN0R3JvdXBzKCkgZGVmYXVsdCB7fTsNCi0NCi0gICAgU3RyaW5nW10gY29uZGl0aW9ucygpIGRlZmF1bHQgIiN7dHJ1ZX0iOw0KLQ0KLSAgICBNb2RlbFZhbGlkYXRpb24gbW9kZWxWYWxpZGF0aW9uKCkgZGVmYXVsdCBATW9kZWxWYWxpZGF0aW9uOw0KLSAgICANCi0gICAgQFJldGVudGlvbihSVU5USU1FKSBzdGF0aWMgQGludGVyZmFjZSBMaXN0DQotICAgIHsNCi0gICAgICAgIEJlYW5WYWxpZGF0aW9uW10gdmFsdWUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL01vZGVsVmFsaWRhdGlvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9Nb2RlbFZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjNzhkZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL01vZGVsVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLQ0KLUBUYXJnZXQoe01FVEhPRCwgRklFTEQsIFRZUEV9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1ARG9jdW1lbnRlZA0KLXB1YmxpYyBAaW50ZXJmYWNlIE1vZGVsVmFsaWRhdGlvbg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVCA9ICIiOw0KLQ0KLSAgICBib29sZWFuIGlzQWN0aXZlKCkgZGVmYXVsdCBmYWxzZTsNCi0NCi0gICAgYm9vbGVhbiBkaXNwbGF5SW5saW5lKCkgZGVmYXVsdCBmYWxzZTsNCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInN1cHBvcnQgcHJvcGVydHkgY2hhaW4gc3ludGF4IikNCi0gICAgU3RyaW5nW10gdmFsaWRhdGlvblRhcmdldHMoKSBkZWZhdWx0IERFRkFVTFQ7DQotDQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCBERUZBVUxUOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3IuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTZmMTM1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5leHRyYWN0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ1c2UgbWV0YS1kYXRhIHN0b3JhZ2UgLSBidXQgYSBzcGVjaWFsIGltcGwuIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3IgZXh0ZW5kcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3INCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFByb3BlcnR5RGV0YWlscykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihvYmplY3QuZ2V0Q2xhc3MoKSArICIgaXMgbm90IGEgIiArIFByb3BlcnR5RGV0YWlscy5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IChQcm9wZXJ0eURldGFpbHMpb2JqZWN0Ow0KLQ0KLSAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKSk7DQotDQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsNCi0gICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uc2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsNCi0NCi0gICAgICAgIGV4dHJhY3RBbm5vdGF0aW9ucyhwcm9wZXJ0eUluZm9ybWF0aW9uLCBwcm9wZXJ0eURldGFpbHMsIGVudGl0eUNsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0JlYW5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0JlYW5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgxN2Y4OC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9CZWFuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIGV4dHJhY3RzIGFuZCBhZGRzIHRoZSBleHR2YWwgYnYgbWV0YS1kYXRhIChlLmcuIHZhbGlkYXRpb24gZ3JvdXBzKSB0byB0aGUgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yDQotew0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyICYmIGlzQmxvY2tpbmdFeGNlcHRpb24odWlDb21wb25lbnQsIHZhbGlkYXRvckV4Y2VwdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9idiBpbnRlZ3JhdGlvbiBkb2Vzbid0IHRocm93IGV4Y2VwdGlvbnMgdG8gc3VwcG9ydCBtdWx0aXBsZSBtZXNzYWdlcyAtPiBzZXQgY29tcG9uZW50IHN0YXRlDQotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRWYWxpZChmYWxzZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNCbG9ja2luZ0V4Y2VwdGlvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKS5zZXZlcml0eUNhdXNlc1ZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0V4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0V4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjZjcwZi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuVmFsaWRhdGlvbk1vZHVsZUF3YXJlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLkJlYW5WYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC51dGlsLkJlYW5WYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIGV4dHJhY3RzIGFuZCBhZGRzIHRoZSBleHR2YWwgYnYgbWV0YS1kYXRhIChlLmcuIHZhbGlkYXRpb24gZ3JvdXBzKSB0byB0aGUgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotICAgICAgICBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLCBWYWxpZGF0aW9uTW9kdWxlQXdhcmUNCi17DQotICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKHByb3BlcnR5SW5mb3JtYXRpb24uY29udGFpbnNJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5DVVNUT01fUFJPUEVSVElFUykpDQotICAgICAgICB7DQotICAgICAgICAgICAgTWFwIHByb3BlcnRpZXMgPSBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkNVU1RPTV9QUk9QRVJUSUVTLCBNYXAuY2xhc3MpOw0KLQ0KLSAgICAgICAgICAgIGlmKHByb3BlcnRpZXMgIT0gbnVsbCAmJiBwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFVJQ29tcG9uZW50LmNsYXNzLmdldE5hbWUoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCA9IChVSUNvbXBvbmVudClwcm9wZXJ0aWVzLmdldChVSUNvbXBvbmVudC5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMuZ2V0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgICAgICAgICBwcm9jZXNzRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YSh1aUNvbXBvbmVudCwgcHJvcGVydHlEZXRhaWxzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIGFkZHMgdGhlIGV4dHZhbCBidiBtZXRhLWRhdGEgdG8gdGhlIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dA0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgY3VycmVudCBjb21wb25lbnQNCi0gICAgICogQHBhcmFtIHByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eSBkZXRhaWxzIG9mIHRoZSB2YWx1ZS1iaW5kaW5nDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0V4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGEoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMpDQotICAgIHsNCi0gICAgICAgIGlmKEpzZlV0aWxzLmlzUmVuZGVyUmVzcG9uc2VQaGFzZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVXRpbHMuYWRkTWV0YURhdGFUb0NvbnRleHQodWlDb21wb25lbnQsIHByb3BlcnR5RGV0YWlscywgZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVXRpbHMuYWRkTWV0YURhdGFUb0NvbnRleHQodWlDb21wb25lbnQsIHByb3BlcnR5RGV0YWlscywgdHJ1ZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldE1vZHVsZUtleXMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtCZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCl9Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0Fic3RyYWN0QmVhblZhbGlkYXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmZkYTBkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0Fic3RyYWN0QmVhblZhbGlkYXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLlZpb2xhdGlvblNldmVyaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEJlYW5WYWxpZGF0aW9uTWV0YURhdGFUcmFuc2Zvcm1lcjxUIGV4dGVuZHMgQW5ub3RhdGlvbj4gaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBDb25zdHJhaW50RGVzY3JpcHRvcjw/IGV4dGVuZHMgVD4gY29uc3RyYWludERlc2NyaXB0b3IgPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKENvbnN0cmFpbnREZXNjcmlwdG9yLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmKGlzQ2xpZW50U2lkZVZhbGlkYXRpb25FbmFibGVkKGNvbnN0cmFpbnREZXNjcmlwdG9yKSAmJiBpc0Jsb2NraW5nQ29uc3RyYWludChjb25zdHJhaW50RGVzY3JpcHRvcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybU1ldGFEYXRhKChDb25zdHJhaW50RGVzY3JpcHRvcjxUPiljb25zdHJhaW50RGVzY3JpcHRvcik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NsaWVudFNpZGVWYWxpZGF0aW9uRW5hYmxlZChDb25zdHJhaW50RGVzY3JpcHRvcjw/IGV4dGVuZHMgVD4gY29uc3RyYWludERlc2NyaXB0b3IpDQotICAgIHsNCi0gICAgICAgIGZvcihDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD4gcGF5bG9hZCA6IGNvbnN0cmFpbnREZXNjcmlwdG9yLmdldFBheWxvYWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzKS5pc0Fzc2lnbmFibGVGcm9tKHBheWxvYWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQmxvY2tpbmdDb25zdHJhaW50KENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IGNvbnN0cmFpbnREZXNjcmlwdG9yKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UgdGVzdE1lc3NhZ2UgPSBuZXcgRmFjZXNNZXNzYWdlKCk7DQotICAgICAgICB0ZXN0TWVzc2FnZS5zZXRTZXZlcml0eShWaW9sYXRpb25TZXZlcml0eS5FcnJvci5WQUxVRSk7DQotDQotICAgICAgICBmb3IgKENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPiBwYXlsb2FkIDogY29uc3RyYWludERlc2NyaXB0b3IuZ2V0UGF5bG9hZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcykuaXNBc3NpZ25hYmxlRnJvbShwYXlsb2FkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRlc3RNZXNzYWdlLnNldFNldmVyaXR5KFZpb2xhdGlvblNldmVyaXR5Lldhcm4uVkFMVUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihWaW9sYXRpb25TZXZlcml0eS5JbmZvLmNsYXNzKS5pc0Fzc2lnbmFibGVGcm9tKHBheWxvYWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGVzdE1lc3NhZ2Uuc2V0U2V2ZXJpdHkoVmlvbGF0aW9uU2V2ZXJpdHkuSW5mby5WQUxVRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYoRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKFZpb2xhdGlvblNldmVyaXR5LkZhdGFsLmNsYXNzKS5pc0Fzc2lnbmFibGVGcm9tKHBheWxvYWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGVzdE1lc3NhZ2Uuc2V0U2V2ZXJpdHkoVmlvbGF0aW9uU2V2ZXJpdHkuRmF0YWwuVkFMVUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5zZXZlcml0eUJsb2Nrc1N1Ym1pdEZvckNvbXBvbmVudElkKG51bGwsIHRlc3RNZXNzYWdlKTsNCi0gICAgfQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShDb25zdHJhaW50RGVzY3JpcHRvcjxUPiBjb25zdHJhaW50RGVzY3JpcHRvcik7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL05vdE51bGxNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ob3ROdWxsTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDA4ZDVhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL05vdE51bGxNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIE5vdE51bGxNZXRhRGF0YVRyYW5zZm9ybWVyIGV4dGVuZHMgQWJzdHJhY3RCZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXI8Tm90TnVsbD4NCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKENvbnN0cmFpbnREZXNjcmlwdG9yPE5vdE51bGw+IGNvbnN0cmFpbnREZXNjcmlwdG9yKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIGlmKEV4dFZhbFV0aWxzLmludGVycHJldEVtcHR5U3RyaW5nVmFsdWVzQXNOdWxsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU3RyaW5nU2l6ZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1N0cmluZ1NpemVNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOWZmNTguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU3RyaW5nU2l6ZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBTdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lciBleHRlbmRzIEFic3RyYWN0QmVhblZhbGlkYXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyPFNpemU+DQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShDb25zdHJhaW50RGVzY3JpcHRvcjxTaXplPiBjb25zdHJhaW50RGVzY3JpcHRvcikNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBTaXplIGFubm90YXRpb24gPSBjb25zdHJhaW50RGVzY3JpcHRvci5nZXRBbm5vdGF0aW9uKCk7DQotDQotICAgICAgICBpbnQgbWluaW11bSA9IGFubm90YXRpb24ubWluKCk7DQotDQotICAgICAgICBpZihtaW5pbXVtICE9IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEgsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIX0RFRkFVTFQsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW50IG1heGltdW0gPSBhbm5vdGF0aW9uLm1heCgpOw0KLSAgICAgICAgaWYobWF4aW11bSAhPSBJbnRlZ2VyLk1BWF9WQUxVRSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCwgbWF4aW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEhfREVGQVVMVCwgbWF4aW11bSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZTAzMWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0QmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXINCi0gICAgICAgIC5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotICAgIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYoaXNCZWFuVmFsaWRhdGlvblN0cmF0ZWd5KHNvdXJjZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5IGJlYW5WYWxpZGF0aW9uQWRhcHRlciA9DQotICAgICAgICAgICAgICAgICAgICAoQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5KXNvdXJjZTsNCi0NCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlQmVhblZhbGlkYXRpb25UcmFuc2Zvcm1lck5hbWUoYmVhblZhbGlkYXRpb25BZGFwdGVyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3koVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgIGFic3RyYWN0IFN0cmluZyBjcmVhdGVCZWFuVmFsaWRhdGlvblRyYW5zZm9ybWVyTmFtZSgNCi0gICAgICAgICAgICBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL05vdE51bGxOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvTm90TnVsbE5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMyODc4Ni4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvTm90TnVsbE5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIuTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5OZXN0ZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQE5lc3RlZA0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgTm90TnVsbE5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlQmVhblZhbGlkYXRpb25UcmFuc2Zvcm1lck5hbWUoQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5IGFkYXB0ZXIpDQotICAgIHsNCi0gICAgICAgIGlmKGlzTm90TnVsbENvbnN0cmFpbnQoYWRhcHRlcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIE5vdE51bGxNZXRhRGF0YVRyYW5zZm9ybWVyLmNsYXNzLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc05vdE51bGxDb25zdHJhaW50KEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSBhZGFwdGVyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gTm90TnVsbC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKA0KLSAgICAgICAgICAgICAgICBhZGFwdGVyLmdldENvbnN0cmFpbnREZXNjcmlwdG9yKCkuZ2V0QW5ub3RhdGlvbigpLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2l6ZU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaXplTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzg5MGM2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaXplTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5OZXN0ZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIuU3RyaW5nU2l6ZU1ldGFEYXRhVHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ATmVzdGVkDQotQEludm9jYXRpb25PcmRlcigyMTApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaXplTmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0QmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVCZWFuVmFsaWRhdGlvblRyYW5zZm9ybWVyTmFtZShCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgYWRhcHRlcikNCi0gICAgew0KLSAgICAgICAgaWYoaXNTdHJpbmdTaXplQ29uc3RyYWludChhZGFwdGVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gU3RyaW5nU2l6ZU1ldGFEYXRhVHJhbnNmb3JtZXIuY2xhc3MuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3RyaW5nU2l6ZUNvbnN0cmFpbnQoQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5IGFkYXB0ZXIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBTaXplLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoDQotICAgICAgICAgICAgICAgIGFkYXB0ZXIuZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKS5nZXRBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCkpICYmDQotICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGFkYXB0ZXIuZ2V0RWxlbWVudENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wYXlsb2FkL0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvcGF5bG9hZC9EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIyZDIyZi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wYXlsb2FkL0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwucGF5bG9hZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24gZXh0ZW5kcyBQYXlsb2FkDQotew0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wYXlsb2FkL1Zpb2xhdGlvblNldmVyaXR5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wYXlsb2FkL1Zpb2xhdGlvblNldmVyaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzODhiMmQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvcGF5bG9hZC9WaW9sYXRpb25TZXZlcml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwucGF5bG9hZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZpb2xhdGlvblNldmVyaXR5DQotew0KLSAgICBpbnRlcmZhY2UgSW5mbyBleHRlbmRzIFBheWxvYWQNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFZBTFVFID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0lORk87DQotICAgIH0NCi0NCi0gICAgaW50ZXJmYWNlIFdhcm4gZXh0ZW5kcyBQYXlsb2FkDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBWQUxVRSA9IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOOw0KLSAgICB9DQotDQotICAgIGludGVyZmFjZSBFcnJvciBleHRlbmRzIFBheWxvYWQNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFZBTFVFID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SOw0KLSAgICB9DQotDQotICAgIGludGVyZmFjZSBGYXRhbCBleHRlbmRzIFBheWxvYWQNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFZBTFVFID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0YXJ0dXAvQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0YXJ0dXAvQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JhYzZmOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdGFydHVwL0JlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLkh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5CZWFuQXdhcmVWYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLlZpb2xhdGlvblNldmVyaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbC5CZWFuVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5pbnRlcmNlcHRvci5FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5pbnRlcmNlcHRvci5CZWFuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLk1vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlci5TaXplTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyLk5vdE51bGxOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLkRlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5Nb2RlbFZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLm1hcHBlci5CZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UubWFwcGVyLk1vZGVsVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuR3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VySG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MDI1NzQ4Mzk5ODc2ODMzMzk0TDsNCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyVmFsaWRhdG9yRmFjdG9yeSgpOw0KLSAgICAgICAgcmVnaXN0ZXJCZWFuVmFsaWRhdGlvbkludGVyY2VwdG9yKCk7DQotICAgICAgICByZWdpc3Rlck1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCk7DQotICAgICAgICByZWdpc3Rlckdyb3VwU3RvcmFnZU5hbWVNYXBwZXIoKTsNCi0gICAgICAgIHJlZ2lzdGVyTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKTsNCi0gICAgICAgIHJlZ2lzdGVyQ29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7DQotICAgICAgICByZWdpc3Rlck1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOw0KLSAgICAgICAgcmVnaXN0ZXJQaGFzZUxpc3RlbmVycygpOw0KLSAgICAgICAgcmVnaXN0ZXJFeGNlcHRpb25JbnRlcmNlcHRvcigpOw0KLSAgICAgICAgcmVnaXN0ZXJWaW9sYXRpb25TZXZlcml0eVBheWxvYWQoKTsNCi0gICAgICAgIHJlZ2lzdGVyRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uUGF5bG9hZCgpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyVmFsaWRhdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KFZhbGlkYXRvckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpLA0KLSAgICAgICAgICAgICAgICBuZXcgQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeShCZWFuVmFsaWRhdGlvblV0aWxzLmdldERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCkpLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJCZWFuVmFsaWRhdGlvbkludGVyY2VwdG9yKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKG5ldyBCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlck1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKG5ldyBTaXplTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcihuZXcgTm90TnVsbE5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJHcm91cFN0b3JhZ2VOYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgU3RvcmFnZU1hbmFnZXIgc3RvcmFnZU1hbmFnZXIgPSBnZXRTdG9yYWdlTWFuYWdlckhvbGRlcigpLmdldFN0b3JhZ2VNYW5hZ2VyKEdyb3VwU3RvcmFnZS5jbGFzcyk7DQotDQotICAgICAgICBpZiAoc3RvcmFnZU1hbmFnZXIgaW5zdGFuY2VvZiBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkpDQotICAgICAgICB7DQotICAgICAgICAgICAgKChBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8U3RyaW5nPikgc3RvcmFnZU1hbmFnZXIpDQotICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihzdG9yYWdlTWFuYWdlci5nZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgIiBoYXMgdG8gaW1wbGVtZW50IEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeSAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICIgY291bGRuJ3QgcmVnaXN0ZXIgIiArIEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlck1vZGVsVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyIG1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyID0gbmV3IERlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlcigpOw0KLSAgICAgICAgbW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIucmVnaXN0ZXIobmV3IE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgZ2V0U3RvcmFnZU1hbmFnZXJIb2xkZXIoKS5zZXRTdG9yYWdlTWFuYWdlcihNb2RlbFZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLCBtb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlciwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyQ29tcG9uZW50SW5pdGlhbGl6ZXJzKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdG9yYWdlTWFuYWdlckhvbGRlciBnZXRTdG9yYWdlTWFuYWdlckhvbGRlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlksIFN0b3JhZ2VNYW5hZ2VySG9sZGVyLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJQaGFzZUxpc3RlbmVycygpDQotICAgIHsNCi0gICAgICAgIEpzZlV0aWxzLnJlZ2lzdGVyUGhhc2VMaXN0ZW5lcihuZXcgTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckV4Y2VwdGlvbkludGVyY2VwdG9yKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKG5ldyBCZWFuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyVmlvbGF0aW9uU2V2ZXJpdHlQYXlsb2FkKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dCBleHRWYWxDb250ZXh0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCk7DQotDQotICAgICAgICBleHRWYWxDb250ZXh0LmFkZEdsb2JhbFByb3BlcnR5KFZpb2xhdGlvblNldmVyaXR5LkluZm8uY2xhc3MuZ2V0TmFtZSgpLCBWaW9sYXRpb25TZXZlcml0eS5JbmZvLmNsYXNzLCBmYWxzZSk7DQotICAgICAgICBleHRWYWxDb250ZXh0LmFkZEdsb2JhbFByb3BlcnR5KFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MuZ2V0TmFtZSgpLCBWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzLCBmYWxzZSk7DQotICAgICAgICBleHRWYWxDb250ZXh0LmFkZEdsb2JhbFByb3BlcnR5KFZpb2xhdGlvblNldmVyaXR5LkZhdGFsLmNsYXNzLmdldE5hbWUoKSwgVmlvbGF0aW9uU2V2ZXJpdHkuRmF0YWwuY2xhc3MsIGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gbmVlZCB0byByZWdpc3RlciAiZXJyb3IiIGl0J3MgdGhlIGRlZmF1bHQNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb25QYXlsb2FkKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoDQotICAgICAgICAgICAgICAgIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCksIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcywgZmFsc2UpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRCZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjAzNzZlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRHcm91cFN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlIGltcGxlbWVudGF0aW9uIGZvciBiZWFuLXZhbGlkYXRpb24gZ3JvdXBzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlIGV4dGVuZHMgRGVmYXVsdEdyb3VwU3RvcmFnZQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBDbGFzc1tdIGdldEdyb3VwcyhTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIENsYXNzW10gcmVzdWx0ID0gc3VwZXIuZ2V0R3JvdXBzKHZpZXdJZCwgY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy90aGUgZGVmYXVsdCBncm91cCB3aWxsIGJlIHZhbGlkYXRlZCBhdXRvbWF0aWNhbGx5DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzc1tdIHt9Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MDBmOGIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkdyb3VwVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogc3RvcmFnZSBpbXBsZW1lbnRhdGlvbiBmb3IgbW9kZWwtdmFsaWRhdGlvbiBlbnRyaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UgaW1wbGVtZW50cyBNb2RlbFZhbGlkYXRpb25TdG9yYWdlDQotew0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+PiBtb2RlbFZhbGlkYXRpb25FbnRyaWVzID0NCi0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+PigpOw0KLQ0KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBjb21wb25lbnRzT2ZSZXF1ZXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY2xpZW50SWQgPSBnZXRDdXJyZW50Q2xpZW50SWQobW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLQ0KLSAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0ID0gcmVzb2x2ZU1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCgNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnksIGNsaWVudElkKTsNCi0NCi0gICAgICAgIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwgbW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldEN1cnJlbnRDbGllbnRJZChNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGNsaWVudElkID0gbnVsbDsNCi0NCi0gICAgICAgIGlmKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2xpZW50SWQgPSBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKS5nZXRDbGllbnRJZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOw0KLQ0KLSAgICAgICAgICAgIGlmKCF0aGlzLmNvbXBvbmVudHNPZlJlcXVlc3QuY29udGFpbnMoY2xpZW50SWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzT2ZSZXF1ZXN0LmFkZChjbGllbnRJZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNsaWVudElkOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gcmVzb2x2ZU1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCgNCi0gICAgICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QgPQ0KLSAgICAgICAgICAgICAgICB0aGlzLm1vZGVsVmFsaWRhdGlvbkVudHJpZXMuZ2V0KEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkoDQotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Vmlld0lkKCksIGNsaWVudElkKSk7DQotDQotICAgICAgICBpZihtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QgPSBuZXcgQXJyYXlMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PigpOw0KLSAgICAgICAgICAgIHRoaXMubW9kZWxWYWxpZGF0aW9uRW50cmllcy5wdXQoR3JvdXBVdGlscy5nZXRHcm91cEtleSgNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldFZpZXdJZCgpLCBjbGllbnRJZCksIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRNb2RlbFZhbGlkYXRpb25FbnRyeSgNCi0gICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZighbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LmNvbnRhaW5zKG1vZGVsVmFsaWRhdGlvbkVudHJ5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QuYWRkKG1vZGVsVmFsaWRhdGlvbkVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllc1RvVmFsaWRhdGUoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmlld0lkID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0Vmlld0lkKCk7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PigpOw0KLQ0KLSAgICAgICAgYWRkRW50cmllc0ZvckNvbXBvbmVudHModmlld0lkLCByZXN1bHQpOw0KLQ0KLSAgICAgICAgYWRkRW50cmllc0ZvclBhZ2Uodmlld0lkLCByZXN1bHQpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkRW50cmllc0ZvckNvbXBvbmVudHMoU3RyaW5nIHZpZXdJZCwgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RyaW5nIGN1cnJlbnRDbGllbnRJZCA6IHRoaXMuY29tcG9uZW50c09mUmVxdWVzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQuYWRkQWxsKGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXModmlld0lkLCBjdXJyZW50Q2xpZW50SWQpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkRW50cmllc0ZvclBhZ2UoU3RyaW5nIHZpZXdJZCwgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICByZXN1bHQuYWRkQWxsKGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXModmlld0lkKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBidWlsZE1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCgNCi0gICAgICAgICAgICBTdHJpbmcga2V5LCBNYXA8U3RyaW5nLCBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5Pj4gZ3JvdXBTdG9yYWdlKQ0KLSAgICB7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBsaXN0Ow0KLQ0KLSAgICAgICAgaWYoa2V5ICE9IG51bGwgJiYga2V5LmVuZHNXaXRoKCIqIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICAgICAgZm9yKE1hcC5FbnRyeTxTdHJpbmcsTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4+IGVudHJ5IDogZ3JvdXBTdG9yYWdlLmVudHJ5U2V0KCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihlbnRyeS5nZXRLZXkoKS5zdWJzdHJpbmcoMCwgZW50cnkuZ2V0S2V5KCkuaW5kZXhPZigiQCIpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoa2V5LnN1YnN0cmluZygwLCBrZXkuaW5kZXhPZigiQCIpKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkQWxsKGVudHJ5LmdldFZhbHVlKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBsaXN0Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbGlzdCA9IGdyb3VwU3RvcmFnZS5nZXQoa2V5KTsNCi0gICAgICAgIHJldHVybiAobGlzdCAhPSBudWxsKSA/IGxpc3QgOiBuZXcgQXJyYXlMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllcyhTdHJpbmcgdmlld0lkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllcyh2aWV3SWQsIG51bGwpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllcyhTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMubW9kZWxWYWxpZGF0aW9uRW50cmllcy5zaXplKCkgPCAxKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9hZGQgZm91bmQgZ3JvdXBzDQotICAgICAgICBTdHJpbmcga2V5Ow0KLSAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gcmVzdWx0TGlzdEZvclBhZ2UgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYoISIqIi5lcXVhbHMoY2xpZW50SWQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGtleSA9IEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBudWxsKTsNCi0gICAgICAgICAgICByZXN1bHRMaXN0Rm9yUGFnZSA9DQotICAgICAgICAgICAgICAgICAgICBidWlsZE1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdChrZXksIHRoaXMubW9kZWxWYWxpZGF0aW9uRW50cmllcyk7DQotICAgICAgICB9DQotDQotICAgICAgICBrZXkgPSBHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgY2xpZW50SWQpOw0KLSAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gcmVzdWx0TGlzdEZvckNvbXBvbmVudCA9DQotICAgICAgICAgICAgICAgIGJ1aWxkTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KGtleSwgdGhpcy5tb2RlbFZhbGlkYXRpb25FbnRyaWVzKTsNCi0NCi0gICAgICAgIGlmKHJlc3VsdExpc3RGb3JQYWdlID09IG51bGwgfHwgcmVzdWx0TGlzdEZvclBhZ2UuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRMaXN0Rm9yQ29tcG9uZW50Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihyZXN1bHRMaXN0Rm9yQ29tcG9uZW50LmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0TGlzdEZvclBhZ2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWVyZ2VSZXN1bHRzKHJlc3VsdExpc3RGb3JQYWdlLCByZXN1bHRMaXN0Rm9yQ29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1lcmdlUmVzdWx0cygNCi0gICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHRMaXN0Rm9yUGFnZSwgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gcmVzdWx0TGlzdEZvckNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbWVyZ2VkUmVzdWx0ID0gbmV3IEFycmF5TGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4oKTsNCi0gICAgICAgIG1lcmdlZFJlc3VsdC5hZGRBbGwocmVzdWx0TGlzdEZvclBhZ2UpOw0KLSAgICAgICAgbWVyZ2VkUmVzdWx0LmFkZEFsbChyZXN1bHRMaXN0Rm9yQ29tcG9uZW50KTsNCi0gICAgICAgIHJldHVybiBtZXJnZWRSZXN1bHQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZjgyODEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBtb2RlbC12YWxpZGF0aW9uIGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXINCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPE1vZGVsVmFsaWRhdGlvblN0b3JhZ2U+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX01PREVMX1ZBTElEQVRJT046S0VZIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvbkVudHJ5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvbkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OGE4ZjMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuQVBJOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oQVBJKQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25FbnRyeQ0KLXsNCi0gICAgcHJpdmF0ZSBVSUNvbXBvbmVudCBjb21wb25lbnQ7DQotICAgIHByaXZhdGUgTGlzdDxDbGFzcz4gZ3JvdXBzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgcHJpdmF0ZSBMaXN0PE9iamVjdD4gdmFsaWRhdGlvblRhcmdldHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGRpc3BsYXlNZXNzYWdlSW5saW5lID0gZmFsc2U7DQotICAgIHByaXZhdGUgU3RyaW5nIGN1c3RvbU1lc3NhZ2UgPSBNb2RlbFZhbGlkYXRpb24uREVGQVVMVDsNCi0gICAgDQotICAgIC8vdGhlIG9yaWdpbmFsIHNvdXJjZSB3aGVyZSB0aGUgZXh0dmFsLWJ2IG1ldGEtZGF0YSBoYXMgYmVlbiBmb3VuZA0KLSAgICBwcml2YXRlIE9iamVjdCBtZXRhRGF0YVNvdXJjZU9iamVjdDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmlld0lkID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0Vmlld0lkKCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEdyb3VwKENsYXNzIGdyb3VwKQ0KLSAgICB7DQotICAgICAgICBpZighdGhpcy5ncm91cHMuY29udGFpbnMoZ3JvdXApKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCEodGhpcy5ncm91cHMgaW5zdGFuY2VvZiBBcnJheUxpc3QpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gbmV3R3JvdXBMaXN0ID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgICAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRDbGFzcyA6IHRoaXMuZ3JvdXBzKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBuZXdHcm91cExpc3QuYWRkKGN1cnJlbnRDbGFzcyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgdGhpcy5ncm91cHMgPSBuZXdHcm91cExpc3Q7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHRoaXMuZ3JvdXBzLmFkZChncm91cCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlR3JvdXAoQ2xhc3MgZ3JvdXApDQotICAgIHsNCi0gICAgICAgIHRoaXMuZ3JvdXBzLnJlbW92ZShncm91cCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkVmFsaWRhdGlvblRhcmdldChPYmplY3QgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBpZighdGhpcy52YWxpZGF0aW9uVGFyZ2V0cy5jb250YWlucyh0YXJnZXQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCEodGhpcy52YWxpZGF0aW9uVGFyZ2V0cyBpbnN0YW5jZW9mIEFycmF5TGlzdCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBMaXN0PE9iamVjdD4gdmFsaWRhdGlvblRhcmdldExpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0NCi0gICAgICAgICAgICAgICAgZm9yKE9iamVjdCBjdXJyZW50VGFyZ2V0IDogdGhpcy52YWxpZGF0aW9uVGFyZ2V0cykNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldExpc3QuYWRkKGN1cnJlbnRUYXJnZXQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvblRhcmdldHMgPSB2YWxpZGF0aW9uVGFyZ2V0TGlzdDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uVGFyZ2V0cy5hZGQodGFyZ2V0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBVSUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudChVSUNvbXBvbmVudCBjb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzc1tdIGdldEdyb3VwcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmdyb3Vwcy50b0FycmF5KG5ldyBDbGFzc1t0aGlzLmdyb3Vwcy5zaXplKCldKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRHcm91cHMoTGlzdDxDbGFzcz4gZ3JvdXBzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmdyb3VwcyA9IGdyb3VwczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGdldFZhbGlkYXRpb25UYXJnZXRzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25UYXJnZXRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0TWV0YURhdGFTb3VyY2VPYmplY3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFTb3VyY2VPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFTb3VyY2VPYmplY3QoT2JqZWN0IG1ldGFEYXRhU291cmNlT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhU291cmNlT2JqZWN0ID0gbWV0YURhdGFTb3VyY2VPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJSZWR1bmRhbnRJZlN0YXRlbWVudCJ9KQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICBpZiAodGhpcyA9PSBvKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSB0aGF0ID0gKE1vZGVsVmFsaWRhdGlvbkVudHJ5KSBvOw0KLQ0KLSAgICAgICAgaWYgKGNvbXBvbmVudCAhPSBudWxsID8gIWNvbXBvbmVudC5lcXVhbHModGhhdC5jb21wb25lbnQpIDogdGhhdC5jb21wb25lbnQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWdyb3Vwcy5lcXVhbHModGhhdC5ncm91cHMpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghdmFsaWRhdGlvblRhcmdldHMuZXF1YWxzKHRoYXQudmFsaWRhdGlvblRhcmdldHMpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRGlzcGxheU1lc3NhZ2VJbmxpbmUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGlzcGxheU1lc3NhZ2VJbmxpbmU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGlzcGxheU1lc3NhZ2VJbmxpbmUoYm9vbGVhbiBkaXNwbGF5TWVzc2FnZUlubGluZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5kaXNwbGF5TWVzc2FnZUlubGluZSA9IGRpc3BsYXlNZXNzYWdlSW5saW5lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tTWVzc2FnZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbU1lc3NhZ2UoU3RyaW5nIGN1c3RvbU1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3VzdG9tTWVzc2FnZSA9IGN1c3RvbU1lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICBpbnQgcmVzdWx0ID0gY29tcG9uZW50ICE9IG51bGwgPyBjb21wb25lbnQuaGFzaENvZGUoKSA6IDA7DQotICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGdyb3Vwcy5oYXNoQ29kZSgpOw0KLSAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyB2YWxpZGF0aW9uVGFyZ2V0cy5oYXNoQ29kZSgpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZpZXdJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2aWV3SWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Vmlld0lkKFN0cmluZyB2aWV3SWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmlld0lkID0gdmlld0lkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvTW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmRmOTMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIHN1Z2dlc3RlZCBpbnRlcmZhY2UgZm9yIGEgbW9kZWwtdmFsaWRhdGlvbiBzdG9yYWdlDQotICogPHAvPg0KLSAqIGl0IGFsbG93cyB0byBtYW5hZ2UgbW9kZWwtdmFsaWRhdGlvbi1lbnRyaWVzIGZvciB0aGUgY3VycmVudCByZXF1ZXN0DQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBNb2RlbFZhbGlkYXRpb25TdG9yYWdlDQotew0KLSAgICB2b2lkIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5KTsNCi0NCi0gICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllc1RvVmFsaWRhdGUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9tYXBwZXIvQmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9CZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgyNGI1OS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9CZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLkRlZmF1bHRCZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChCZWFuVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGtleSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9tYXBwZXIvTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvbWFwcGVyL01vZGVsVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YzViNWIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9tYXBwZXIvTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5EZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKE1vZGVsVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGtleSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC91dGlsL0JlYW5WYWxpZGF0aW9uVXRpbHMuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvQmVhblZhbGlkYXRpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzZkMTczLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvQmVhblZhbGlkYXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5Nb2RlbFZhbGlkYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuRmFjZXNNZXNzYWdlSG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uVXRpbHMNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0dHRVIgPSBMb2dGYWN0b3J5LmdldExvZyhCZWFuVmFsaWRhdGlvblV0aWxzLmNsYXNzKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscyBidm1pID0gbmV3IEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFJbnRlcm5hbHMoTE9HR0VSKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRPUl9GQUNUT1JZX0tFWSA9ICJqYXZheC5mYWNlcy52YWxpZGF0b3IuYmVhblZhbGlkYXRvci5WYWxpZGF0b3JGYWN0b3J5IjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE1ldGFEYXRhVG9Db250ZXh0KA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IGNvbXBvbmVudCwgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmdbXSBrZXkgPSBwcm9wZXJ0eURldGFpbHMuZ2V0S2V5KCkuc3BsaXQoIlxcLiIpOw0KLQ0KLSAgICAgICAgT2JqZWN0IGZpcnN0QmVhbiA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbihrZXlbMF0pOw0KLQ0KLSAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24gPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLSAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QgPSBuZXcgQXJyYXlMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PigpOw0KLSAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgICAgICBidm1pLmV4dHJhY3RFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhKHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAga2V5LA0KLSAgICAgICAgICAgICAgICBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgYnZtaS5wcm9jZXNzRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YShjb21wb25lbnQsDQotICAgICAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByb2Nlc3NDb25zdHJhaW50VmlvbGF0aW9ucyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb24+IHZpb2xhdGlvbnMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+KCk7DQotDQotICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlOw0KLSAgICAgICAgZm9yIChDb25zdHJhaW50VmlvbGF0aW9uIHZpb2xhdGlvbiA6IHZpb2xhdGlvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNNZXNzYWdlID0gY3JlYXRlRmFjZXNNZXNzYWdlRm9yQ29uc3RyYWludFZpb2xhdGlvbih1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCB2aW9sYXRpb24pOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWNlc01lc3NhZ2UgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBidm1pLnByb2Nlc3NGYWNlc01lc3NhZ2UoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHByb2Nlc3NWaW9sYXRpb25NZXNzYWdlcyhmYWNlc01lc3NhZ2VIb2xkZXJMaXN0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY2VzTWVzc2FnZSBjcmVhdGVGYWNlc01lc3NhZ2VGb3JDb25zdHJhaW50VmlvbGF0aW9uKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RyYWludFZpb2xhdGlvbiB2aW9sYXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2aW9sYXRpb25NZXNzYWdlID0gdmlvbGF0aW9uLmdldE1lc3NhZ2UoKTsNCi0NCi0gICAgICAgIFN0cmluZyBsYWJlbGVkTWVzc2FnZVN1bW1hcnkgPSBidm1pLmNyZWF0ZUxhYmVsZWRNZXNzYWdlKHZpb2xhdGlvbk1lc3NhZ2UsIGZhbHNlKTsNCi0gICAgICAgIFN0cmluZyBsYWJlbGVkTWVzc2FnZURldGFpbCA9IGJ2bWkuY3JlYXRlTGFiZWxlZE1lc3NhZ2UodmlvbGF0aW9uTWVzc2FnZSwgdHJ1ZSk7DQotDQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkgPSBidm1pLmNhbGNTZXZlcml0eSh2aW9sYXRpb24pOw0KLQ0KLSAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiA9IGJ2bWkNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvckV4Y2VwdGlvbihsYWJlbGVkTWVzc2FnZVN1bW1hcnksIGxhYmVsZWRNZXNzYWdlRGV0YWlsLCBzZXZlcml0eSk7DQotDQotICAgICAgICBpZiAoIWJ2bWkuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnModWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChidm1pLmlzTWVzc2FnZVRleHRVbmNoYW5nZWQodmFsaWRhdG9yRXhjZXB0aW9uLCBsYWJlbGVkTWVzc2FnZVN1bW1hcnksIGxhYmVsZWRNZXNzYWdlRGV0YWlsKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKHNldmVyaXR5LCB2aW9sYXRpb25NZXNzYWdlLCB2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKHNldmVyaXR5LA0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldFN1bW1hcnkoKSwNCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKS5nZXREZXRhaWwoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByb2Nlc3NWaW9sYXRpb25NZXNzYWdlcyhMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gdmlvbGF0aW9uTWVzc2FnZUhvbGRlckxpc3QpDQotICAgIHsNCi0gICAgICAgIGlmICh2aW9sYXRpb25NZXNzYWdlSG9sZGVyTGlzdCA9PSBudWxsIHx8IHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0LmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlTGlzdFdpdGhMb3dTZXZlcml0eSA9DQotICAgICAgICAgICAgICAgIGJ2bWkuZ2V0RmFjZXNNZXNzYWdlTGlzdFdpdGhMb3dTZXZlcml0eSh2aW9sYXRpb25NZXNzYWdlSG9sZGVyTGlzdCk7DQotICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlTGlzdFdpdGhIaWdoU2V2ZXJpdHkgPQ0KLSAgICAgICAgICAgICAgICBidm1pLmdldEZhY2VzTWVzc2FnZUxpc3RXaXRoSGlnaFNldmVyaXR5KHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0KTsNCi0NCi0gICAgICAgIGJ2bWkuYWRkTWVzc2FnZXMoZmFjZXNNZXNzYWdlTGlzdFdpdGhIaWdoU2V2ZXJpdHkpOw0KLSAgICAgICAgYnZtaS5hZGRNZXNzYWdlcyhmYWNlc01lc3NhZ2VMaXN0V2l0aExvd1NldmVyaXR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbGlkYXRvckZhY3RvcnkgZ2V0RGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGFwcGxpY2F0aW9uTWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uTWFwKCk7DQotICAgICAgICBWYWxpZGF0b3JGYWN0b3J5IHZhbGlkYXRvckZhY3RvcnkgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKGFwcGxpY2F0aW9uTWFwLmNvbnRhaW5zS2V5KFZBTElEQVRPUl9GQUNUT1JZX0tFWSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGFwcGxpY2F0aW9uTWFwLmdldChWQUxJREFUT1JfRkFDVE9SWV9LRVkpIGluc3RhbmNlb2YgVmFsaWRhdG9yRmFjdG9yeSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRvckZhY3RvcnkgPSAoVmFsaWRhdG9yRmFjdG9yeSkgYXBwbGljYXRpb25NYXAuZ2V0KFZBTElEQVRPUl9GQUNUT1JZX0tFWSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHZhbGlkYXRvckZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0b3JGYWN0b3J5ID0gVmFsaWRhdGlvbi5idWlsZERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCk7DQotICAgICAgICAgICAgYXBwbGljYXRpb25NYXAucHV0KFZBTElEQVRPUl9GQUNUT1JZX0tFWSwgdmFsaWRhdG9yRmFjdG9yeSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC91dGlsL0V4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFJbnRlcm5hbHMuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGE2NzllLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjY4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLlZpb2xhdGlvblNldmVyaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5leHRyYWN0b3IuRGVmYXVsdEdyb3VwQ29udHJvbGxlclNjYW5uaW5nRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLk1vZGVsVmFsaWRhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5FTEhlbHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuRmFjZXNNZXNzYWdlSG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzDQotew0KLSAgICBwcml2YXRlIExvZyBsb2dnZXI7DQotICAgIHByaXZhdGUgTGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMgbGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMgPSBuZXcgTGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMoKTsNCi0NCi0gICAgRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscyhMb2cgbG9nZ2VyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIGV4dHJhY3RFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhKFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgZmlyc3RCZWFuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIGluc3BlY3RGaXJzdEJlYW4ocHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgZmlyc3RCZWFuLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgIGluc3BlY3RGaXJzdFByb3BlcnR5KHByb2Nlc3NNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIGtleSwNCi0gICAgICAgICAgICAgICAgZmlyc3RCZWFuLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBrZXkubGVuZ3RoID09IDIpOw0KLQ0KLSAgICAgICAgaW5zcGVjdEJhc2VPZlByb3BlcnR5KHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotDQotICAgICAgICBpbnNwZWN0TGFzdFByb3BlcnR5KHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotICAgIH0NCi0NCi0gICAgdm9pZCBwcm9jZXNzRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YShVSUNvbXBvbmVudCBjb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0ID0gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRWaWV3SWQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRWaWV3SWQoKTsNCi0NCi0gICAgICAgIFN0cmluZyBjbGllbnRJZCA9IGNvbXBvbmVudC5nZXRDbGllbnRJZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0ZvdW5kR3JvdXBzKGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCwgY3VycmVudFZpZXdJZCwgY2xpZW50SWQsDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgIHByb2Nlc3NSZXN0cmljdGVkR3JvdXBzKGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCwgY3VycmVudFZpZXdJZCwgY2xpZW50SWQsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgaW5pdE1vZGVsVmFsaWRhdGlvbihleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQsIGNvbXBvbmVudCwgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbnNwZWN0Rmlyc3RCZWFuKGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgcHJvY2Vzc0NsYXNzKGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RGaXJzdFByb3BlcnR5KGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0xhc3RQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcHJvY2Vzc0ZpZWxkc0FuZFByb3BlcnRpZXMoa2V5WzBdICsgIi4iICsga2V5WzFdLA0KLSAgICAgICAgICAgICAgICBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgIGtleVsxXSwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgaXNMYXN0UHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbnNwZWN0QmFzZU9mUHJvcGVydHkoUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgcHJvY2Vzc0NsYXNzKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCksDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbnNwZWN0TGFzdFByb3BlcnR5KFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgcHJvY2Vzc0ZpZWxkc0FuZFByb3BlcnRpZXMoDQotICAgICAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKSwNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHRydWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ2xhc3MoT2JqZWN0IG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgY2xhc3NUb0luc3BlY3QgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKG9iamVjdFRvSW5zcGVjdC5nZXRDbGFzcygpKTsNCi0NCi0gICAgICAgIHdoaWxlICghT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NUb0luc3BlY3QuZ2V0TmFtZSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cmFuc2Zlckdyb3VwVmFsaWRhdGlvbkluZm9ybWF0aW9uVG9Gb3VuZEdyb3VwcyhvYmplY3RUb0luc3BlY3QsDQotICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotDQotICAgICAgICAgICAgcHJvY2Vzc0ludGVyZmFjZXMob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCksIG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgICAgICBjbGFzc1RvSW5zcGVjdCA9IGNsYXNzVG9JbnNwZWN0LmdldFN1cGVyY2xhc3MoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ZpZWxkc0FuZFByb3BlcnRpZXMoU3RyaW5nIGtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBiYXNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNMYXN0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3IoKQ0KLSAgICAgICAgICAgICAgICAuZXh0cmFjdChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIG5ldyBQcm9wZXJ0eURldGFpbHMoa2V5LCBiYXNlLCBwcm9wZXJ0eSkpOw0KLQ0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkgOiBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeVRvUHJvY2Vzc01ldGFEYXRhKChCZWFuVmFsaWRhdGlvbikgbWV0YURhdGFFbnRyeS5nZXRWYWx1ZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeVRvQ3JlYXRlTmV3VGFyZ2V0KGJhc2UsIHByb3BlcnR5LCBpc0xhc3RQcm9wZXJ0eSksDQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZiAobWV0YURhdGFFbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQmVhblZhbGlkYXRpb24uTGlzdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZvciAoQmVhblZhbGlkYXRpb24gY3VycmVudEJlYW5WYWxpZGF0aW9uIDogKChCZWFuVmFsaWRhdGlvbi5MaXN0KSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkpLnZhbHVlKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRyeVRvUHJvY2Vzc01ldGFEYXRhKGN1cnJlbnRCZWFuVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5VG9DcmVhdGVOZXdUYXJnZXQoYmFzZSwgcHJvcGVydHksIGlzTGFzdFByb3BlcnR5KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgdHJ5VG9DcmVhdGVOZXdUYXJnZXQoT2JqZWN0IGJhc2UsIFN0cmluZyBwcm9wZXJ0eSwgYm9vbGVhbiBpc0xhc3RQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgaWYoaXNMYXN0UHJvcGVydHkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGJhc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBPYmplY3QgcmVzdWx0ID0gZ2V0VmFsdWVPZlByb3BlcnR5KGJhc2UsIHByb3BlcnR5KTsNCi0NCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYmFzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0VmFsdWVPZlByb3BlcnR5KE9iamVjdCBiYXNlLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHByb3BlcnR5ID0gcHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSwgcHJvcGVydHkubGVuZ3RoKCkpOw0KLQ0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKGJhc2UuZ2V0Q2xhc3MoKSk7DQotDQotICAgICAgICBNZXRob2QgdGFyZ2V0TWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHRhcmdldENsYXNzLCAiZ2V0IiArIHByb3BlcnR5KTsNCi0NCi0gICAgICAgIGlmICh0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0YXJnZXRNZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodGFyZ2V0Q2xhc3MsICJpcyIgKyBwcm9wZXJ0eSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodGFyZ2V0TWV0aG9kID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICJjbGFzcyAiICsgdGFyZ2V0Q2xhc3MgKyAiIGhhcyBubyBwdWJsaWMgZ2V0L2lzICIgKyBwcm9wZXJ0eS50b0xvd2VyQ2FzZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoYmFzZSwgdGFyZ2V0TWV0aG9kKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ZvdW5kR3JvdXBzKEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRWaWV3SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsaWVudElkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICAvKg0KLSAgICAgICAgICogYWRkIGZvdW5kIGdyb3VwcyB0byBjb250ZXh0DQotICAgICAgICAgKi8NCi0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEdyb3VwQ2xhc3MgOiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuYWRkR3JvdXAoY3VycmVudEdyb3VwQ2xhc3MsIGN1cnJlbnRWaWV3SWQsIGNsaWVudElkKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1Jlc3RyaWN0ZWRHcm91cHMoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50Vmlld0lkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsaWVudElkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIGFkZCByZXN0cmljdGVkIGdyb3Vwcw0KLSAgICAgICAgICovDQotICAgICAgICBmb3IgKENsYXNzIGN1cnJlbnRHcm91cENsYXNzIDogcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQucmVzdHJpY3RHcm91cChjdXJyZW50R3JvdXBDbGFzcywgY3VycmVudFZpZXdJZCwgY2xpZW50SWQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TW9kZWxWYWxpZGF0aW9uKEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IGNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICAvKg0KLSAgICAgICAgICogYWRkIG1vZGVsIHZhbGlkYXRpb24gZW50cnkgbGlzdA0KLSAgICAgICAgICovDQotICAgICAgICBmb3IgKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5IDogbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvciAoQ2xhc3MgcmVzdHJpY3RlZEdyb3VwIDogcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LnJlbW92ZUdyb3VwKHJlc3RyaWN0ZWRHcm91cCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRHcm91cHMoKS5sZW5ndGggPiAwKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYgKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldFZhbGlkYXRpb25UYXJnZXRzKCkuaXNFbXB0eSgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5hZGRWYWxpZGF0aW9uVGFyZ2V0KHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LnNldENvbXBvbmVudChjb21wb25lbnQpOw0KLSAgICAgICAgICAgICAgICBleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkobW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAidGVzdCBwcm94eSBzdXBwb3J0IikNCi0gICAgcHJpdmF0ZSB2b2lkIHRyYW5zZmVyR3JvdXBWYWxpZGF0aW9uSW5mb3JtYXRpb25Ub0ZvdW5kR3JvdXBzKA0KLSAgICAgICAgICAgIE9iamVjdCBvYmplY3RUb0luc3BlY3QsDQotICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChvYmplY3RUb0luc3BlY3QuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KEJlYW5WYWxpZGF0aW9uLmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb1Byb2Nlc3NNZXRhRGF0YShvYmplY3RUb0luc3BlY3QuZ2V0Q2xhc3MoKS5nZXRBbm5vdGF0aW9uKEJlYW5WYWxpZGF0aW9uLmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgIG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKG9iamVjdFRvSW5zcGVjdC5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoQmVhblZhbGlkYXRpb24uTGlzdC5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yIChCZWFuVmFsaWRhdGlvbiBjdXJyZW50QmVhblZhbGlkYXRpb24gOg0KLSAgICAgICAgICAgICAgICAgICAgKG9iamVjdFRvSW5zcGVjdC5nZXRDbGFzcygpLmdldEFubm90YXRpb24oQmVhblZhbGlkYXRpb24uTGlzdC5jbGFzcykpLnZhbHVlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnlUb1Byb2Nlc3NNZXRhRGF0YShjdXJyZW50QmVhblZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VG9JbnNwZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzSW50ZXJmYWNlcyhDbGFzcyBjdXJyZW50Q2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBmb3IgKENsYXNzIGN1cnJlbnRJbnRlcmZhY2UgOiBjdXJyZW50Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyYW5zZmVyR3JvdXBWYWxpZGF0aW9uSW5mb3JtYXRpb25Ub0ZvdW5kR3JvdXBzKG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgICAgIHByb2Nlc3NJbnRlcmZhY2VzKGN1cnJlbnRJbnRlcmZhY2UsIG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1Byb2Nlc3NNZXRhRGF0YShCZWFuVmFsaWRhdGlvbiBiZWFuVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIGZvciAoU3RyaW5nIGN1cnJlbnRWaWV3SWQgOiBiZWFuVmFsaWRhdGlvbi52aWV3SWRzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHVzZU1ldGFEYXRhRm9yVmlld0lkKGJlYW5WYWxpZGF0aW9uLCBjdXJyZW50Vmlld0lkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NNZXRhRGF0YShiZWFuVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZU1ldGFEYXRhRm9yVmlld0lkKEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uLCBTdHJpbmcgY3VycmVudFZpZXdJZCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChjdXJyZW50Vmlld0lkLmVxdWFscyhGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRWaWV3SWQoKSkgfHwNCi0gICAgICAgICAgICAgICAgY3VycmVudFZpZXdJZC5lcXVhbHMoIioiKSkgJiYgaXNWYWxpZGF0aW9uUGVybWl0dGVkKGJlYW5WYWxpZGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01ldGFEYXRhKEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKHByb2Nlc3NNb2RlbFZhbGlkYXRpb24gJiYgaXNNb2RlbFZhbGlkYXRpb24oYmVhblZhbGlkYXRpb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KA0KLSAgICAgICAgICAgICAgICAgICAgYmVhblZhbGlkYXRpb24sIG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LCByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKCFpc01vZGVsVmFsaWRhdGlvbihiZWFuVmFsaWRhdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc0dyb3VwcygNCi0gICAgICAgICAgICAgICAgICAgIGJlYW5WYWxpZGF0aW9uLCBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRhdGlvblBlcm1pdHRlZChCZWFuVmFsaWRhdGlvbiBiZWFuVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgRUxIZWxwZXIgZWxIZWxwZXIgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY29uZGl0aW9uIDogYmVhblZhbGlkYXRpb24uY29uZGl0aW9ucygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbEhlbHBlci5pc0VMVGVybVdlbGxGb3JtZWQoY29uZGl0aW9uKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgZWxIZWxwZXIuaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIGNvbmRpdGlvbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhlbEhlbHBlci5nZXRWYWx1ZU9mRXhwcmVzc2lvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKGNvbmRpdGlvbikpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYgKHRoaXMubG9nZ2VyLmlzRXJyb3JFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCJhbiBpbnZhbGlkIGNvbmRpdGlvbiBpcyB1c2VkOiAiICsgY29uZGl0aW9uKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNNb2RlbFZhbGlkYXRpb24oQmVhblZhbGlkYXRpb24gYmVhblZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBiZWFuVmFsaWRhdGlvbi5tb2RlbFZhbGlkYXRpb24oKS5pc0FjdGl2ZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRNb2RlbFZhbGlkYXRpb25FbnRyeShCZWFuVmFsaWRhdGlvbiBiZWFuVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5ID0gbmV3IE1vZGVsVmFsaWRhdGlvbkVudHJ5KCk7DQotDQotICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5zZXRHcm91cHMoQXJyYXlzLmFzTGlzdChiZWFuVmFsaWRhdGlvbi51c2VHcm91cHMoKSkpOw0KLSAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuc2V0RGlzcGxheU1lc3NhZ2VJbmxpbmUoYmVhblZhbGlkYXRpb24ubW9kZWxWYWxpZGF0aW9uKCkuZGlzcGxheUlubGluZSgpKTsNCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LnNldEN1c3RvbU1lc3NhZ2UoYmVhblZhbGlkYXRpb24ubW9kZWxWYWxpZGF0aW9uKCkubWVzc2FnZSgpKTsNCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LnNldE1ldGFEYXRhU291cmNlT2JqZWN0KG1ldGFEYXRhU291cmNlT2JqZWN0KTsNCi0NCi0gICAgICAgIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0Ow0KLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvblRhcmdldEV4cHJlc3Npb24gOiBiZWFuVmFsaWRhdGlvbi5tb2RlbFZhbGlkYXRpb24oKS52YWxpZGF0aW9uVGFyZ2V0cygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChNb2RlbFZhbGlkYXRpb24uREVGQVVMVC5lcXVhbHModmFsaWRhdGlvblRhcmdldEV4cHJlc3Npb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQgPSB0cnlUb1Jlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RXhwcmVzc2lvbih2YWxpZGF0aW9uVGFyZ2V0RXhwcmVzc2lvbik7DQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25UYXJnZXQgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmFkZFZhbGlkYXRpb25UYXJnZXQodmFsaWRhdGlvblRhcmdldCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGJlYW5WYWxpZGF0aW9uLnJlc3RyaWN0R3JvdXBzKCkubGVuZ3RoID4gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLmFkZEFsbChBcnJheXMuYXNMaXN0KGJlYW5WYWxpZGF0aW9uLnJlc3RyaWN0R3JvdXBzKCkpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRWYWxpZGF0aW9uVGFyZ2V0cygpLmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5hZGRWYWxpZGF0aW9uVGFyZ2V0KG1ldGFEYXRhU291cmNlT2JqZWN0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdC5hZGQobW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IHRyeVRvUmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFeHByZXNzaW9uKFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0RXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsaWRhdGlvblRhcmdldEV4cHJlc3Npb24pOw0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldFZhbHVlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NHcm91cHMoQmVhblZhbGlkYXRpb24gYmVhblZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChiZWFuVmFsaWRhdGlvbi51c2VHcm91cHMoKSkpOw0KLQ0KLSAgICAgICAgaWYgKGJlYW5WYWxpZGF0aW9uLnJlc3RyaWN0R3JvdXBzKCkubGVuZ3RoID4gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLmFkZEFsbChBcnJheXMuYXNMaXN0KGJlYW5WYWxpZGF0aW9uLnJlc3RyaWN0R3JvdXBzKCkpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBTdHJpbmcgY3JlYXRlTGFiZWxlZE1lc3NhZ2UoU3RyaW5nIHZpb2xhdGlvbk1lc3NhZ2UsIGJvb2xlYW4gaXNEZXRhaWxNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5sYWJlbGVkTWVzc2FnZUludGVybmFscy5jcmVhdGVMYWJlbGVkTWVzc2FnZSh2aW9sYXRpb25NZXNzYWdlLCBpc0RldGFpbE1lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBjYWxjU2V2ZXJpdHkoQ29uc3RyYWludFZpb2xhdGlvbjw/PiB2aW9sYXRpb24pDQotICAgIHsNCi0gICAgICAgIGZvciAoQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+IHBheWxvYWQgOiB2aW9sYXRpb24uZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKS5nZXRQYXlsb2FkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzKS5pc0Fzc2lnbmFibGVGcm9tKHBheWxvYWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmIChFeHRWYWxVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihWaW9sYXRpb25TZXZlcml0eS5JbmZvLmNsYXNzKS5pc0Fzc2lnbmFibGVGcm9tKHBheWxvYWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9JTkZPOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmIChFeHRWYWxVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihWaW9sYXRpb25TZXZlcml0eS5GYXRhbC5jbGFzcykuaXNBc3NpZ25hYmxlRnJvbShwYXlsb2FkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUjsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIHByb2Nlc3NGYWNlc01lc3NhZ2UoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlciA9IG5ldyBGYWNlc01lc3NhZ2VIb2xkZXIoZmFjZXNNZXNzYWdlKTsNCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZUhvbGRlci5zZXRDbGllbnRJZCh1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpKTsNCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZUhvbGRlckxpc3QuYWRkKGZhY2VzTWVzc2FnZUhvbGRlcik7DQotICAgIH0NCi0NCi0gICAgYm9vbGVhbiBleGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgIG51bGwsDQotICAgICAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBib29sZWFuIGlzTWVzc2FnZVRleHRVbmNoYW5nZWQoDQotICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwgU3RyaW5nIHZpb2xhdGlvblN1bW1hcnlNZXNzYWdlLCBTdHJpbmcgdmlvbGF0aW9uRGV0YWlsTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZpb2xhdGlvblN1bW1hcnlNZXNzYWdlLmVxdWFscyh2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U3VtbWFyeSgpKSAmJg0KLSAgICAgICAgICAgICAgICB2aW9sYXRpb25EZXRhaWxNZXNzYWdlLmVxdWFscyh2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0RGV0YWlsKCkpOw0KLSAgICB9DQotDQotICAgIFZhbGlkYXRvckV4Y2VwdGlvbiBjcmVhdGVWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgU3RyaW5nIHZpb2xhdGlvblN1bW1hcnlNZXNzYWdlLCBTdHJpbmcgdmlvbGF0aW9uRGV0YWlsTWVzc2FnZSwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKHNldmVyaXR5LCB2aW9sYXRpb25TdW1tYXJ5TWVzc2FnZSwgdmlvbGF0aW9uRGV0YWlsTWVzc2FnZSkpOw0KLSAgICB9DQotDQotICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBnZXRGYWNlc01lc3NhZ2VMaXN0V2l0aExvd1NldmVyaXR5KA0KLSAgICAgICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiB2aW9sYXRpb25NZXNzYWdlcykNCi0gICAgew0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPigpOw0KLQ0KLSAgICAgICAgZm9yIChGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyIDogdmlvbGF0aW9uTWVzc2FnZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOLmVxdWFscyhmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKSkgfHwNCi0gICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9JTkZPLmVxdWFscyhmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGZhY2VzTWVzc2FnZUhvbGRlcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZ2V0RmFjZXNNZXNzYWdlTGlzdFdpdGhIaWdoU2V2ZXJpdHkoDQotICAgICAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0KQ0KLSAgICB7DQotICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+KCk7DQotDQotICAgICAgICBmb3IgKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIgOiB2aW9sYXRpb25NZXNzYWdlSG9sZGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLmVxdWFscyhmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKSkgfHwNCi0gICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9GQVRBTC5lcXVhbHMoZmFjZXNNZXNzYWdlSG9sZGVyLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChmYWNlc01lc3NhZ2VIb2xkZXIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgdm9pZCBhZGRNZXNzYWdlcyhMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdFdpdGhMb3dTZXZlcml0eSkNCi0gICAgew0KLSAgICAgICAgZm9yIChGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyIDogZmFjZXNNZXNzYWdlSG9sZGVyTGlzdFdpdGhMb3dTZXZlcml0eSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb0FkZFZpb2xhdGlvbk1lc3NhZ2VGb3JDb21wb25lbnRJZCgNCi0gICAgICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZUhvbGRlci5nZXRDbGllbnRJZCgpLCBmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0RmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvTGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvTGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwYjc4My4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC91dGlsL0xhYmVsZWRNZXNzYWdlSW50ZXJuYWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIExhYmVsZWRNZXNzYWdlSW50ZXJuYWxzDQotew0KLSAgICAvL3RoZXJlIGlzIG5vIGNvbmN1cnJlbmN5IGlzc3VlIGhlcmUgLSBpdCBhbHdheXMgbGVhZHMgdG8gdGhlIHNhbWUgcmVzdWx0DQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRlZmF1bHRTdW1tYXJ5TWVzc2FnZVRlbXBsYXRlID0gInsxfTogezB9IjsNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVmYXVsdERldGFpbE1lc3NhZ2VUZW1wbGF0ZSA9ICJ7MX06IHswfSI7DQotICAgIHByaXZhdGUgU3RyaW5nIHN1bW1hcnlNZXNzYWdlVGVtcGxhdGUgPSBkZWZhdWx0U3VtbWFyeU1lc3NhZ2VUZW1wbGF0ZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGV0YWlsTWVzc2FnZVRlbXBsYXRlID0gZGVmYXVsdERldGFpbE1lc3NhZ2VUZW1wbGF0ZTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX1ZBTElEQVRPUl9CRUFOVkFMSURBVE9SX01FU1NBR0UgPQ0KLSAgICAgICAgICAgICJqYXZheC5mYWNlcy52YWxpZGF0b3IuQmVhblZhbGlkYXRvci5NRVNTQUdFIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX1ZBTElEQVRPUl9CRUFOVkFMSURBVE9SX01FU1NBR0VfREVUQUlMID0NCi0gICAgICAgICAgICAiamF2YXguZmFjZXMudmFsaWRhdG9yLkJlYW5WYWxpZGF0b3IuTUVTU0FHRV9kZXRhaWwiOw0KLQ0KLSAgICBTdHJpbmcgY3JlYXRlTGFiZWxlZE1lc3NhZ2UoU3RyaW5nIHZpb2xhdGlvbk1lc3NhZ2UsIGJvb2xlYW4gaXNEZXRhaWxNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBpZihpc0RldGFpbE1lc3NhZ2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRyeVRvUmVzb2x2ZURldGFpbE1lc3NhZ2UodmlvbGF0aW9uTWVzc2FnZSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRyeVRvUmVzb2x2ZVN1bW1hcnlNZXNzYWdlKHZpb2xhdGlvbk1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvUmVzb2x2ZVN1bW1hcnlNZXNzYWdlKFN0cmluZyB2aW9sYXRpb25NZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBpZihzdW1tYXJ5TWVzc2FnZVRlbXBsYXRlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdFN1bW1hcnlNZXNzYWdlVGVtcGxhdGUucmVwbGFjZSgiezB9IiwgdmlvbGF0aW9uTWVzc2FnZSk7DQotICAgICAgICB9DQotDQotICAgICAgICB0aGlzLnN1bW1hcnlNZXNzYWdlVGVtcGxhdGUgPSBsb2FkU3RhbmRhcmRNZXNzYWdlVGVtcGxhdGUoZmFsc2UpOw0KLQ0KLSAgICAgICAgaWYoc3VtbWFyeU1lc3NhZ2VUZW1wbGF0ZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVMYWJlbGVkTWVzc2FnZSh2aW9sYXRpb25NZXNzYWdlLCBmYWxzZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3VtbWFyeU1lc3NhZ2VUZW1wbGF0ZS5yZXBsYWNlKCJ7MH0iLCB2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb1Jlc29sdmVEZXRhaWxNZXNzYWdlKFN0cmluZyB2aW9sYXRpb25NZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBpZihkZXRhaWxNZXNzYWdlVGVtcGxhdGUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0RGV0YWlsTWVzc2FnZVRlbXBsYXRlLnJlcGxhY2UoInswfSIsIHZpb2xhdGlvbk1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGhpcy5kZXRhaWxNZXNzYWdlVGVtcGxhdGUgPSBsb2FkU3RhbmRhcmRNZXNzYWdlVGVtcGxhdGUodHJ1ZSk7DQotDQotICAgICAgICBpZihkZXRhaWxNZXNzYWdlVGVtcGxhdGUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlTGFiZWxlZE1lc3NhZ2UodmlvbGF0aW9uTWVzc2FnZSwgdHJ1ZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZGV0YWlsTWVzc2FnZVRlbXBsYXRlLnJlcGxhY2UoInswfSIsIHZpb2xhdGlvbk1lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGxvYWRTdGFuZGFyZE1lc3NhZ2VUZW1wbGF0ZShib29sZWFuIGlzRGV0YWlsTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoaXNEZXRhaWxNZXNzYWdlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEpzZlV0aWxzLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEpBVkFYX0ZBQ0VTX1ZBTElEQVRPUl9CRUFOVkFMSURBVE9SX01FU1NBR0VfREVUQUlMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEpzZlV0aWxzLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEpBVkFYX0ZBQ0VTX1ZBTElEQVRPUl9CRUFOVkFMSURBVE9SX01FU1NBR0UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGMyODk1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuQmVhblZhbGlkYXRpb25Nb2R1bGVLZXk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLkV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuTW9kZWxWYWxpZGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWwuQmVhblZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5GYWNlc01lc3NhZ2VIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5NZXNzYWdlSW50ZXJwb2xhdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBhdGg7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInJlZmFjdG9yIGltcGxlbWVudGF0aW9uIGRldGFpbHMiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzQ4MjIzMzg5MzE4NjcwODg3OEw7DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBwaGFzZUV2ZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJqc3IzMDMgc3RhcnQgbW9kZWwgdmFsaWRhdGlvbiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWFwPE9iamVjdCwgTGlzdDxDbGFzcz4+IHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBMaXN0PENsYXNzPj4oKTsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PigpOw0KLQ0KLSAgICAgICAgZm9yIChNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSA6IGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXNUb1ZhbGlkYXRlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbihtb2RlbFZhbGlkYXRpb25FbnRyeSwgcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMsIHJlc3VsdHMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvblJlc3VsdHMocmVzdWx0cyk7DQotDQotICAgICAgICBleGVjdXRlR2xvYmFsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzRm9yKHJlc3VsdHMpOw0KLQ0KLSAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgianNyMzAzIHZhbGlkYXRpb24gZmluaXNoZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXNUb1ZhbGlkYXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8T2JqZWN0LCBMaXN0PENsYXNzPj4gcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cykNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbjsNCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4+IHZpb2xhdGlvbnM7DQotICAgICAgICBDbGFzc1tdIGdyb3Vwc1RvVmFsaWRhdGU7DQotDQotICAgICAgICBmb3IgKE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0IDogbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0VmFsaWRhdGlvblRhcmdldHMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uID0gY3JlYXRlUHJvcGVydHlJbmZvcm1hdGlvbihtb2RlbFZhbGlkYXRpb25FbnRyeSwgdmFsaWRhdGlvblRhcmdldCk7DQotDQotICAgICAgICAgICAgaWYgKCFleGVjdXRlR2xvYmFsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCksIHZhbGlkYXRpb25UYXJnZXQsIHByb3BlcnR5SW5mb3JtYXRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmlzRGlzcGxheU1lc3NhZ2VJbmxpbmUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGdyb3Vwc1RvVmFsaWRhdGUgPSBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRHcm91cHMoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy9pZiB2aW9sYXRpb24gc2hvdWxkIGRpc3BsYXllZCBpbmxpbmUgdmFsaWRhdGlvbiBoYXMgdG8gdGFrZSBwbGFjZSB3aXRoIGFsbCBncm91cHMNCi0gICAgICAgICAgICAvL3doaWNoIG1lYW5zOiBnbG9iYWwgbWVzc2FnZXMgLT4gZmlsdGVyIGdyb3VwcyBhbHJlYWR5IHVzZWQgZm9yIHRoZSB2YWxpZGF0aW9uIHRhcmdldA0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGdyb3Vwc1RvVmFsaWRhdGUgPSBmaWx0ZXJHcm91cHNUb1ZhbGlkYXRlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0LCBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKCFzaG91bGRDb250aW51ZVZhbGlkYXRpb24obW9kZWxWYWxpZGF0aW9uRW50cnksIGdyb3Vwc1RvVmFsaWRhdGUpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGFkZFByb2Nlc3NlZFRhcmdldCh2YWxpZGF0aW9uVGFyZ2V0LCBncm91cHNUb1ZhbGlkYXRlLCBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cyk7DQotICAgICAgICAgICAgdmlvbGF0aW9ucyA9IHZhbGlkYXRlVGFyZ2V0KHZhbGlkYXRpb25UYXJnZXQsIGdyb3Vwc1RvVmFsaWRhdGUpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25zICE9IG51bGwgJiYgIXZpb2xhdGlvbnMuaXNFbXB0eSgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1Zpb2xhdGlvbnMoZmFjZXNDb250ZXh0LCBtb2RlbFZhbGlkYXRpb25FbnRyeSwgdmFsaWRhdGlvblRhcmdldCwgdmlvbGF0aW9ucywgcmVzdWx0cyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3NbXSBmaWx0ZXJHcm91cHNUb1ZhbGlkYXRlKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPE9iamVjdCwgTGlzdDxDbGFzcz4+IHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzKQ0KLSAgICB7DQotICAgICAgICBpZighcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMuY29udGFpbnNLZXkodmFsaWRhdGlvblRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldEdyb3VwcygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxDbGFzcz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IHZhbGlkYXRlZEdyb3VwcyA9IHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzLmdldCh2YWxpZGF0aW9uVGFyZ2V0KTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBncm91cCA6IG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldEdyb3VwcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCF2YWxpZGF0ZWRHcm91cHMuY29udGFpbnMoZ3JvdXApKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChncm91cCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBDbGFzc1tyZXN1bHQuc2l6ZSgpXSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZENvbnRpbnVlVmFsaWRhdGlvbihNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwgQ2xhc3NbXSBncm91cHNUb1ZhbGlkYXRlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIShncm91cHNUb1ZhbGlkYXRlID09IG51bGwgfHwgZ3JvdXBzVG9WYWxpZGF0ZS5sZW5ndGggPT0gMCkgfHwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuaXNEaXNwbGF5TWVzc2FnZUlubGluZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRQcm9jZXNzZWRUYXJnZXQoT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NbXSBncm91cHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPE9iamVjdCwgTGlzdDxDbGFzcz4+IHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzKQ0KLSAgICB7DQotICAgICAgICBpZighcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMuY29udGFpbnNLZXkodmFsaWRhdGlvblRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMucHV0KHZhbGlkYXRpb25UYXJnZXQsIG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxDbGFzcz4gdmFsaWRhdGVkR3JvdXBzID0gcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMuZ2V0KHZhbGlkYXRpb25UYXJnZXQpOw0KLQ0KLSAgICAgICAgZm9yKENsYXNzIGdyb3VwIDogZ3JvdXBzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCF2YWxpZGF0ZWRHcm91cHMuY29udGFpbnMoZ3JvdXApKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVkR3JvdXBzLmFkZChncm91cCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgUHJvcGVydHlJbmZvcm1hdGlvbiBjcmVhdGVQcm9wZXJ0eUluZm9ybWF0aW9uKA0KLSAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBPYmplY3QgdmFsaWRhdGlvblRhcmdldCkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uOw0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlsczsNCi0gICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsNCi0gICAgICAgIGlmIChtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzID0gbmV3IFByb3BlcnR5RGV0YWlscyhudWxsLCB2YWxpZGF0aW9uVGFyZ2V0LCBudWxsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uc2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBleGVjdXRlR2xvYmFsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmV4ZWN1dGVHbG9iYWxCZWZvcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uLCBCZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIEV4dFZhbFV0aWxzLmV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIHByb3BlcnR5SW5mb3JtYXRpb24sIEJlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4+IHZhbGlkYXRlVGFyZ2V0KE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LCBDbGFzc1tdIGdyb3VwcykNCi0gICAgew0KLSAgICAgICAgaWYoZ3JvdXBzID09IG51bGwgfHwgZ3JvdXBzLmxlbmd0aCA9PSAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVmFsaWRhdG9yRmFjdG9yeSB2YWxpZGF0b3JGYWN0b3J5ID0gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZhbGlkYXRvckZhY3RvcnkoKTsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5DQotICAgICAgICAgICAgICAgIC51c2luZ0NvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAubWVzc2FnZUludGVycG9sYXRvcihFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpKQ0KLSAgICAgICAgICAgICAgICAuY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkodmFsaWRhdG9yRmFjdG9yeS5nZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpKQ0KLSAgICAgICAgICAgICAgICAudHJhdmVyc2FibGVSZXNvbHZlcih2YWxpZGF0b3JGYWN0b3J5LmdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKSkNCi0gICAgICAgICAgICAgICAgLmdldFZhbGlkYXRvcigpDQotICAgICAgICAgICAgICAgIC52YWxpZGF0ZSh2YWxpZGF0aW9uVGFyZ2V0LCBncm91cHMpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzVmlvbGF0aW9ucyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4+IHZpb2xhdGlvbnMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMpDQotICAgIHsNCi0gICAgICAgIC8vanNmIDIuMCBpcyBhYmxlIHRvIGRpc3BsYXkgbXVsdGlwbGUgbWVzc2FnZXMgcGVyIGNvbXBvbmVudCAtIHNvIHByb2Nlc3MgYWxsIHZpb2xhdGlvbnMNCi0gICAgICAgIC8vanNmIDwgMi4wIHdpbGwganVzdCB1c2UgdGhlIGZpcnN0IG9uZSAoZm9yIGlubGluZSBtZXNzYWdlcyAtIHNvIGl0J3Mgb25seSBhIGxpdHRsZSBvdmVyaGVhZCkNCi0gICAgICAgIEl0ZXJhdG9yPENvbnN0cmFpbnRWaW9sYXRpb248T2JqZWN0Pj4gdmlvbGF0aW9uc0l0ZXJhdG9yID0gdmlvbGF0aW9ucy5pdGVyYXRvcigpOw0KLSAgICAgICAgQ29uc3RyYWludFZpb2xhdGlvbjxPYmplY3Q+IGNvbnN0cmFpbnRWaW9sYXRpb247DQotICAgICAgICBNb2RlbFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0Ow0KLSAgICAgICAgd2hpbGUgKHZpb2xhdGlvbnNJdGVyYXRvci5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9DcmVhdGVNb2RlbFZhbGlkYXRpb25SZXN1bHQoZmFjZXNDb250ZXh0LCBtb2RlbFZhbGlkYXRpb25FbnRyeSwgcmVzdWx0cyk7DQotDQotICAgICAgICAgICAgcmVzdWx0ID0gcmVzb2x2ZU1vZGVsVmFsaWRhdGlvblJlc3VsdChmYWNlc0NvbnRleHQsIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCByZXN1bHRzKTsNCi0NCi0gICAgICAgICAgICBjb25zdHJhaW50VmlvbGF0aW9uID0gdmlvbGF0aW9uc0l0ZXJhdG9yLm5leHQoKTsNCi0gICAgICAgICAgICBhZGRWaW9sYXRpb25NZXNzYWdlKG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0LCBjb25zdHJhaW50VmlvbGF0aW9uLCByZXN1bHQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0NyZWF0ZU1vZGVsVmFsaWRhdGlvblJlc3VsdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMpDQotICAgIHsNCi0gICAgICAgIE1vZGVsVmFsaWRhdGlvblJlc3VsdCByZXN1bHQ7DQotICAgICAgICBpZiAoIWlzTW9kZWxWYWxpZGF0aW9uUmVzdWx0QXZhaWxhYmxlRm9yKGZhY2VzQ29udGV4dCwgbW9kZWxWYWxpZGF0aW9uRW50cnksIHJlc3VsdHMpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBNb2RlbFZhbGlkYXRpb25SZXN1bHQoKTsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKS5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpLCByZXN1bHQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTW9kZWxWYWxpZGF0aW9uUmVzdWx0IHJlc29sdmVNb2RlbFZhbGlkYXRpb25SZXN1bHQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByZXN1bHRzLmdldChtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKS5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNNb2RlbFZhbGlkYXRpb25SZXN1bHRBdmFpbGFibGVGb3IoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcmVzdWx0cy5jb250YWluc0tleShtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKS5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkVmlvbGF0aW9uTWVzc2FnZShNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cmFpbnRWaW9sYXRpb248T2JqZWN0PiBjb25zdHJhaW50VmlvbGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBpZiAobW9kZWxWYWxpZGF0aW9uRW50cnkuaXNEaXNwbGF5TWVzc2FnZUlubGluZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRGYWNlc01lc3NhZ2VIb2xkZXIoY3JlYXRlRmFjZXNNZXNzYWdlSG9sZGVyRm9yQ29uc3RyYWludFZpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb24sIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0LCB0cnVlKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmFkZEZhY2VzTWVzc2FnZUhvbGRlcihjcmVhdGVGYWNlc01lc3NhZ2VIb2xkZXJGb3JDb25zdHJhaW50VmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludFZpb2xhdGlvbiwgbW9kZWxWYWxpZGF0aW9uRW50cnksIHZhbGlkYXRpb25UYXJnZXQsIGZhbHNlKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBGYWNlc01lc3NhZ2VIb2xkZXIgY3JlYXRlRmFjZXNNZXNzYWdlSG9sZGVyRm9yQ29uc3RyYWludFZpb2xhdGlvbihmaW5hbCBDb25zdHJhaW50VmlvbGF0aW9uIHZpb2xhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRpc3BsYXlBdENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgZmluYWwgU3RyaW5nIG5ld1Zpb2xhdGlvbk1lc3NhZ2UgPSB0cnlUb0NoYW5nZVZpb2xhdGlvbk1lc3NhZ2UoDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0LCB2aW9sYXRpb24pOw0KLQ0KLSAgICAgICAgQ29uc3RyYWludFZpb2xhdGlvbiBuZXdDb25zdHJhaW50VmlvbGF0aW9uID0gbmV3IENvbnN0cmFpbnRWaW9sYXRpb24oKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByaXZhdGUgQ29uc3RyYWludFZpb2xhdGlvbiB3cmFwcGVkID0gdmlvbGF0aW9uOw0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3VmlvbGF0aW9uTWVzc2FnZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlVGVtcGxhdGUoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0TWVzc2FnZVRlbXBsYXRlKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Um9vdEJlYW4oKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Um9vdEJlYW4oKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIENsYXNzIGdldFJvb3RCZWFuQ2xhc3MoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Um9vdEJlYW5DbGFzcygpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldExlYWZCZWFuKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldExlYWZCZWFuKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBQYXRoIGdldFByb3BlcnR5UGF0aCgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRQcm9wZXJ0eVBhdGgoKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRJbnZhbGlkVmFsdWUoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0SW52YWxpZFZhbHVlKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBDb25zdHJhaW50RGVzY3JpcHRvciBnZXRDb25zdHJhaW50RGVzY3JpcHRvcigpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRDb25zdHJhaW50RGVzY3JpcHRvcigpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH07DQotDQotDQotICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCA9IG51bGw7DQotICAgICAgICBTdHJpbmcgY2xpZW50SWQgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKGRpc3BsYXlBdENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB1aUNvbXBvbmVudCA9IG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpOw0KLSAgICAgICAgICAgIGNsaWVudElkID0gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZUhvbGRlciByZXN1bHQgPSBuZXcgRmFjZXNNZXNzYWdlSG9sZGVyKEJlYW5WYWxpZGF0aW9uVXRpbHMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZUZhY2VzTWVzc2FnZUZvckNvbnN0cmFpbnRWaW9sYXRpb24odWlDb21wb25lbnQsIHZhbGlkYXRpb25UYXJnZXQsIG5ld0NvbnN0cmFpbnRWaW9sYXRpb24pKTsNCi0gICAgICAgIHJlc3VsdC5zZXRDbGllbnRJZChjbGllbnRJZCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvQ2hhbmdlVmlvbGF0aW9uTWVzc2FnZShNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RyYWludFZpb2xhdGlvbiB2aW9sYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmICghaXNEZWZhdWx0TWVzc2FnZShtb2RlbFZhbGlkYXRpb25FbnRyeSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGludGVycG9sYXRlVmFsaWRhdGlvbkVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldEN1c3RvbU1lc3NhZ2UoKSwgdmFsaWRhdGlvblRhcmdldCwgdmlvbGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2aW9sYXRpb24uZ2V0TWVzc2FnZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHRNZXNzYWdlKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gTW9kZWxWYWxpZGF0aW9uLkRFRkFVTFQuZXF1YWxzKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldEN1c3RvbU1lc3NhZ2UoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgaW50ZXJwb2xhdGVWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKFN0cmluZyBleHRWYWxJbmxpbmVNZXNzYWdlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsIGZpbmFsIENvbnN0cmFpbnRWaW9sYXRpb24gdmlvbGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKQ0KLSAgICAgICAgICAgICAgICAuaW50ZXJwb2xhdGUoDQotICAgICAgICAgICAgICAgICAgICAgICAgZXh0VmFsSW5saW5lTWVzc2FnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWVzc2FnZUludGVycG9sYXRvci5Db250ZXh0KCkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDb25zdHJhaW50RGVzY3JpcHRvcjw/PiBnZXRDb25zdHJhaW50RGVzY3JpcHRvcigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2aW9sYXRpb24uZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFZhbGlkYXRlZFZhbHVlKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25UYXJnZXQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGVsVmFsaWRhdGlvblJlc3VsdHMoTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzKQ0KLSAgICB7DQotICAgICAgICBmb3IgKE1vZGVsVmFsaWRhdGlvblJlc3VsdCByZXN1bHQgOiByZXN1bHRzLnZhbHVlcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVXRpbHMucHJvY2Vzc1Zpb2xhdGlvbk1lc3NhZ2VzKHJlc3VsdC5nZXRGYWNlc01lc3NhZ2VIb2xkZXJMaXN0KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBleGVjdXRlR2xvYmFsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzRm9yKE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cykNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFVJQ29tcG9uZW50IGNvbXBvbmVudDsNCi0gICAgICAgIGZvciAoTW9kZWxWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA6IHJlc3VsdHMudmFsdWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yIChGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyIDogcmVzdWx0LmdldEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IG51bGw7DQotICAgICAgICAgICAgICAgIGlmIChmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0Q2xpZW50SWQoKSAhPSBudWxsICYmICFmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0Q2xpZW50SWQoKS5lcXVhbHMoIioiKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50ID0gZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZmluZENvbXBvbmVudChmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycyhmYWNlc0NvbnRleHQsIGNvbXBvbmVudCwgbnVsbCwgbnVsbCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgcGhhc2VFdmVudCkNCi0gICAgew0KLSAgICAgICAgLy9kbyBub3RoaW5nDQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLlVQREFURV9NT0RFTF9WQUxVRVM7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICBpZiAodGhpcyA9PSBvKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIE1vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25SZXN1bHQuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vTW9kZWxWYWxpZGF0aW9uUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYzE5OGIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25SZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkZhY2VzTWVzc2FnZUhvbGRlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gInJlZmFjdG9yIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIE1vZGVsVmFsaWRhdGlvblJlc3VsdA0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRGYWNlc01lc3NhZ2VIb2xkZXIoRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5mYWNlc01lc3NhZ2VIb2xkZXJMaXN0LmFkZChmYWNlc01lc3NhZ2VIb2xkZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZ2V0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vbWVzc2FnZS9pbnRlcnBvbGF0b3IvRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vbWVzc2FnZS9pbnRlcnBvbGF0b3IvRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4MzkyZi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0RlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLm1lc3NhZ2UuaW50ZXJwb2xhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5NZXNzYWdlSW50ZXJwb2xhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvciBpbXBsZW1lbnRzIE1lc3NhZ2VJbnRlcnBvbGF0b3INCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotICAgIA0KLSAgICBwcml2YXRlIE1lc3NhZ2VJbnRlcnBvbGF0b3Igd3JhcHBlZDsNCi0NCi0gICAgcHVibGljIERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yKE1lc3NhZ2VJbnRlcnBvbGF0b3Igd3JhcHBlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGludGVycG9sYXRlKFN0cmluZyBtZXNzYWdlT3JLZXksIENvbnRleHQgY29udGV4dCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGludGVycG9sYXRlKG1lc3NhZ2VPcktleSwgY29udGV4dCwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBpbnRlcnBvbGF0ZShTdHJpbmcgbWVzc2FnZU9yS2V5LCBDb250ZXh0IGNvbnRleHQsIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQuaW50ZXJwb2xhdGUobWVzc2FnZU9yS2V5LCBjb250ZXh0LCBnZXRDdXJyZW50TG9jYWxlKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBMb2NhbGUgZ2V0Q3VycmVudExvY2FsZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0V4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0V4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZTlmMzMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9tZXNzYWdlL2ludGVycG9sYXRvci9FeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5tZXNzYWdlLmludGVycG9sYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLk1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uTWVzc2FnZUludGVycG9sYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlciBleHRlbmRzIERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yDQotew0KLSAgICBwcml2YXRlIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXI7DQotDQotICAgIHB1YmxpYyBFeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlcihNZXNzYWdlSW50ZXJwb2xhdG9yIHdyYXBwZWQsIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXIpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKHdyYXBwZWQpOw0KLSAgICAgICAgdGhpcy5tZXNzYWdlUmVzb2x2ZXIgPSBtZXNzYWdlUmVzb2x2ZXI7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgaW50ZXJwb2xhdGUoU3RyaW5nIG1lc3NhZ2VPcktleSwgQ29udGV4dCBjb250ZXh0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZU9yS2V5LCBjb250ZXh0LCBnZXRDdXJyZW50TG9jYWxlKCkpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGludGVycG9sYXRlKFN0cmluZyBtZXNzYWdlT3JLZXksIENvbnRleHQgY29udGV4dCwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5tZXNzYWdlUmVzb2x2ZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihpc0JlYW5WYWxpZGF0aW9uTWVzc2FnZUtleUZvcm1hdChtZXNzYWdlT3JLZXkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld01lc3NhZ2VPcktleSA9IHRoaXMubWVzc2FnZVJlc29sdmVyLmdldE1lc3NhZ2UoZXh0cmFjdEtleShtZXNzYWdlT3JLZXkpLCBnZXRDdXJyZW50TG9jYWxlKCkpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZihpc1ZhbGlkZU1lc3NhZ2UobmV3TWVzc2FnZU9yS2V5KSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU9yS2V5ID0gbmV3TWVzc2FnZU9yS2V5Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJ5b3UgdHJpZWQgdG8gdXNlIGFuIGV4dHZhbCBtZXNzYWdlLXJlc29sdmVyIGZvciIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAianNyMzAzIHZhbGlkYXRpb24gd2l0aCBhbiBpbnZhbGlkIGtleSAtPiB1c2luZyBhIGRlZmF1bHQgaW50ZXJwb2xhdG9yIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3VwZXIuaW50ZXJwb2xhdGUobWVzc2FnZU9yS2V5LCBjb250ZXh0LCBnZXRDdXJyZW50TG9jYWxlKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0JlYW5WYWxpZGF0aW9uTWVzc2FnZUtleUZvcm1hdChTdHJpbmcgbWVzc2FnZU9yS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWVzc2FnZU9yS2V5LnN0YXJ0c1dpdGgoInsiKSAmJiBtZXNzYWdlT3JLZXkuZW5kc1dpdGgoIn0iKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBleHRyYWN0S2V5KFN0cmluZyBtZXNzYWdlT3JLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXNzYWdlT3JLZXkuc3Vic3RyaW5nKDEsIG1lc3NhZ2VPcktleS5sZW5ndGgoKSAtIDEpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkZU1lc3NhZ2UoU3RyaW5nIG5ld01lc3NhZ2VPcktleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICEobmV3TWVzc2FnZU9yS2V5LnN0YXJ0c1dpdGgoQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIpICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3TWVzc2FnZU9yS2V5LmVuZHNXaXRoKEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZGVlZjYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcml2YXRlIENvbnN0cmFpbnREZXNjcmlwdG9yIGNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLSAgICBwcml2YXRlIENsYXNzIGVsZW1lbnRDbGFzczsgLy9wcm9wZXJ0eSB0eXBlDQotDQotICAgIHB1YmxpYyBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3koQ29uc3RyYWludERlc2NyaXB0b3IgY29uc3RyYWludERlc2NyaXB0b3IsIENsYXNzIGVsZW1lbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb25zdHJhaW50RGVzY3JpcHRvciA9IGNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLSAgICAgICAgdGhpcy5lbGVtZW50Q2xhc3MgPSBlbGVtZW50Q2xhc3M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvbnN0cmFpbnREZXNjcmlwdG9yIGdldENvbnN0cmFpbnREZXNjcmlwdG9yKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzcyBnZXRFbGVtZW50Q2xhc3MoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZWxlbWVudENsYXNzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJhaW50RGVzY3JpcHRvci5nZXRBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODdlMzZhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgVmFsaWRhdGlvbi1Nb2R1bGVzPC9uYW1lPgotICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvdmFsaWRhdGlvbi1tb2R1bGVzPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvdmFsaWRhdGlvbi1tb2R1bGVzPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy92YWxpZGF0aW9uLW1vZHVsZXM8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxtb2R1bGVzPgotICAgICAgICA8bW9kdWxlPnByb3BlcnR5LXZhbGlkYXRpb248L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5iZWFuLXZhbGlkYXRpb248L21vZHVsZT4KLSAgICA8L21vZHVsZXM+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9wb20ueG1sIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTQzOTNlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgUHJvcGVydHktVmFsaWRhdGlvbi1Nb2R1bGU8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4xLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4xLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnBlcnNpc3RlbmNlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGVyc2lzdGVuY2UtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICAgICAgPCEtLSBUZXN0IGRlcGVuZGVuY2llcyAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldC5qc3A8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3AtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zaGFsZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNoYWxlLXRlc3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuNDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPgotICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9BYnN0cmFjdCouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL1Rlc3RVdGlscy5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKkJlYW4uamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4gICAgICAgICAgICAKLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyMGM3NS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCFET0NUWVBFIGZhY2VzLWNvbmZpZyBQVUJMSUMNCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiINCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxmYWNlcy1jb25maWc+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjFjZjkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNzg1ZDYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50Ci0gICAgICAgIC5BYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlUmVxdWlyZWRBdHRyaWJ1dGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYoKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKSkgfHwKLSAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSkKLSAgICAgICAgICAgICYmCi0gICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGlzQ29tcG9uZW50UmVxdWlyZWQodWlDb21wb25lbnQpKSkKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJgotICAgICAgICAgICAgICAgIUJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSm9pblZhbGlkYXRpb25NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSm9pblZhbGlkYXRpb25NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWExMjNjZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0pvaW5WYWxpZGF0aW9uTWV0YURhdGFTdG9yYWdlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NZXRhRGF0YVN0b3JhZ2VGaWx0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogRVhUVkFMLTU5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKb2luVmFsaWRhdGlvbk1ldGFEYXRhU3RvcmFnZUZpbHRlciBpbXBsZW1lbnRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRJQ19TRVBBUkFUT1IgPSAiOiI7DQotDQotICAgIHB1YmxpYyB2b2lkIGZpbHRlcihQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChwcm9wZXJ0eUluZm9ybWF0aW9uICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgTGlzdDxNZXRhRGF0YUVudHJ5PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE1ldGFEYXRhRW50cnk+KCk7DQotDQotICAgICAgICAgICAgcmVzb2x2ZUpvaW5WYWxpZGF0aW9uTWV0YURhdGEocHJvcGVydHlJbmZvcm1hdGlvbiwgcmVzdWx0KTsNCi0NCi0gICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnJlc2V0TWV0YURhdGFFbnRyaWVzKCk7DQotDQotICAgICAgICAgICAgc2V0RGVmYXVsdFByb3BlcnR5RGV0YWlscyhwcm9wZXJ0eUluZm9ybWF0aW9uLCByZXN1bHQpOw0KLQ0KLSAgICAgICAgICAgIGlmIChjb250YWluc0pvaW5WYWxpZGF0aW9uQ29uc3RyYWludChyZXN1bHQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmlsdGVyKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVzb2x2ZUpvaW5WYWxpZGF0aW9uTWV0YURhdGEoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uLCBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkgOiBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodHJ5VG9UcmFuc2Zvcm1FbnRyeShtZXRhRGF0YUVudHJ5KSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRQcm9wZXJ0eURldGFpbHMoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uLCBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkgOiByZXN1bHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5zZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLA0KLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5nZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTKSk7DQotICAgICAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5hZGRNZXRhRGF0YUVudHJ5KG1ldGFEYXRhRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc0pvaW5WYWxpZGF0aW9uQ29uc3RyYWludChMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogcmVzdWx0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgSm9pblZhbGlkYXRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhRW50cnk+IHRyeVRvVHJhbnNmb3JtRW50cnkoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFbnRyeT4oKTsNCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBKb2luVmFsaWRhdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBKb2luVmFsaWRhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShKb2luVmFsaWRhdGlvbi5jbGFzcyk7DQotDQotICAgICAgICAgICAgcmVwbGFjZU1ldGFEYXRhKGFubm90YXRpb24sIG1ldGFEYXRhRW50cnksIHJlc3VsdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmFkZChtZXRhRGF0YUVudHJ5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VNZXRhRGF0YShKb2luVmFsaWRhdGlvbiBhbm5vdGF0aW9uLCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIExpc3Q8TWV0YURhdGFFbnRyeT4gcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBmb3IgKFN0cmluZyB0YXJnZXQgOiBhbm5vdGF0aW9uLnZhbHVlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9SZXBsYWNlTWV0YURhdGFPZlRhcmdldCh0YXJnZXQsIG1ldGFEYXRhRW50cnksIHJlc3VsdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvUmVwbGFjZU1ldGFEYXRhT2ZUYXJnZXQoU3RyaW5nIHRhcmdldCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGlzU3RhdGljU3ludGF4KHRhcmdldCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNZXRhRGF0YShyZXN1bHQsIGV4dHJhY3RTdGF0aWNNZXRhRGF0YSh0YXJnZXQpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWV0YURhdGEocmVzdWx0LCBleHRyYWN0RHluYW1pY01ldGFEYXRhKG1ldGFEYXRhRW50cnksIHRhcmdldCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgYSBkaWZmZXJlbnQgZmlsdGVyIG1pZ2h0IGludHJvZHVjZSBhIG5ldyBzeW50YXggd2hpY2ggY2F1c2VzIHRoZSBleGNlcHRpb24NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkTWV0YURhdGEoTGlzdDxNZXRhRGF0YUVudHJ5PiByZXN1bHQsIE1ldGFEYXRhRW50cnlbXSBtZXRhRGF0YUVudHJpZXMpDQotICAgIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLmFkZEFsbChyZXN1bHQsIG1ldGFEYXRhRW50cmllcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3RhdGljU3ludGF4KFN0cmluZyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQuY29udGFpbnMoU1RBVElDX1NFUEFSQVRPUik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YUVudHJ5W10gZXh0cmFjdFN0YXRpY01ldGFEYXRhKFN0cmluZyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIGludCBzZXBhcmF0b3JJbmRleCA9IHRhcmdldC5sYXN0SW5kZXhPZihTVEFUSUNfU0VQQVJBVE9SKTsNCi0NCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gbG9hZENsYXNzKHRhcmdldC5zdWJzdHJpbmcoMCwgc2VwYXJhdG9ySW5kZXgpKTsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0YXJnZXQuc3Vic3RyaW5nKHNlcGFyYXRvckluZGV4ICsgMSk7DQotDQotICAgICAgICByZXR1cm4gbmV3IFN0YXRpY1N5bnRheE1ldGFEYXRhRXh0cmFjdG9yKCkuZXh0cmFjdCh0YXJnZXRDbGFzcywgcHJvcGVydHlOYW1lKS5nZXRNZXRhRGF0YUVudHJpZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3NVdGlscy5sb2FkQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YUVudHJ5W10gZXh0cmFjdER5bmFtaWNNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFN0cmluZyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscy5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0KTsNCi0NCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCkpOw0KLSAgICAgICAgcmV0dXJuIG5ldyBTdGF0aWNTeW50YXhNZXRhRGF0YUV4dHJhY3RvcigpLmV4dHJhY3QoDQotICAgICAgICAgICAgICAgIHRhcmdldENsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSkuZ2V0TWV0YURhdGFFbnRyaWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBjbGFzcyBTdGF0aWNTeW50YXhNZXRhRGF0YUV4dHJhY3RvciBleHRlbmRzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgICAgICB7DQotICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKCk7DQotDQotICAgICAgICAgICAgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyh0YXJnZXRDbGFzcywgdGFyZ2V0UHJvcGVydHksIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgICAgIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnModGFyZ2V0Q2xhc3MsIHRhcmdldFByb3BlcnR5LCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopDQotICAgIHsNCi0gICAgICAgIHJldHVybiBvYmogIT0gbnVsbCAmJiBnZXRDbGFzcygpLmVxdWFscyhvYmouZ2V0Q2xhc3MoKSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDBjZGUwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0R3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotLyoqDQotICogbmFtZSBtYXBwZXIgZm9yIGdyb3VwIGltcGxlbWVudGF0aW9ucyB2aWEgdmFsaWRhdGlvbiBwYXJhbWV0ZXJzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoVmFsaWRhdGlvblBhcmFtZXRlci5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdEdyb3VwU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yjc0ODQzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuVmFsaWRhdGlvbk1vZHVsZUtleTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVmFsaWRhdGlvbk1vZHVsZUtleQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5DQotew0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYwNzM0Mi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VySG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkdyb3VwU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NZXRhRGF0YVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnJlY29yZGVyLkNyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkRlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLm1hcHBlci5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UubWFwcGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yNDc0MzYxNjEyODU3MjIyMjgzTDsNCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIGluaXRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycygpOw0KLSAgICAgICAgaW5pdFN0YXRpY1N0cmF0ZWd5TWFwcGluZ3MoKTsNCi0gICAgICAgIGluaXREZWZhdWx0Q29tcG9uZW50SW5pdGlhbGl6ZXIoKTsNCi0gICAgICAgIGFkZFNraXBWYWxpZGF0aW9uU3VwcG9ydCgpOw0KLSAgICAgICAgaW5pdFN0b3JhZ2VNYW5hZ2VyQW5kTmFtZU1hcHBlcnMoKTsNCi0gICAgICAgIGluaXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcigpOw0KLSAgICAgICAgaW5pdE1ldGFEYXRhU3RvcmFnZUZpbHRlcnMoKTsNCi0gICAgICAgIGluaXRQaGFzZUxpc3RlbmVycygpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKG5ldyBDcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFN0YXRpY1N0cmF0ZWd5TWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcganBhQmFzZWRWYWxpZGF0aW9uID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfSlBBX0JBU0VEX1ZBTElEQVRJT047DQotICAgICAgICBpZiAoanBhQmFzZWRWYWxpZGF0aW9uID09IG51bGwNCi0gICAgICAgICAgICAgICAgfHwgIWpwYUJhc2VkVmFsaWRhdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnID0gbmV3IFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgICAgIHN0YXRpY0NvbmZpZy5zZXRTb3VyY2VPZk1hcHBpbmcoDQotICAgICAgICAgICAgICAgIEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsiLmpwYV9zdHJhdGVneV9tYXBwaW5ncyIpOw0KLQ0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsIHN0YXRpY0NvbmZpZyk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXREZWZhdWx0Q29tcG9uZW50SW5pdGlhbGl6ZXIoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFNraXBWYWxpZGF0aW9uU3VwcG9ydCgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmluZm8oImFkZGluZyBzdXBwb3J0IGZvciBAU2tpcFZhbGlkYXRpb24iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmRlbnlSZW5kZXJlckludGVyY2VwdG9yKFZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcyk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsNCi0NCi0gICAgICAgIFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAvL2l0J3MganVzdCByZXF1aXJlZCB0byBzZXQgdGhlIHRhcmdldA0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTiwgU2tpcFZhbGlkYXRpb25TdXBwb3J0LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuU0tJUF9WQUxJREFUSU9OX1NVUFBPUlRfQ09ORklHLCBjb25maWcpOw0KLQ0KLSAgICAgICAgLy9jb25maWcuYWRkTWFwcGluZyhDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCBSZXF1aXJlZFN0cmF0ZWd5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdG9yYWdlTWFuYWdlckFuZE5hbWVNYXBwZXJzKCkNCi0gICAgew0KLSAgICAgICAgU3RvcmFnZU1hbmFnZXJIb2xkZXIgc3RvcmFnZU1hbmFnZXJIb2xkZXIgPQ0KLSAgICAgICAgICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlksIFN0b3JhZ2VNYW5hZ2VySG9sZGVyLmNsYXNzKSk7DQotDQotICAgICAgICAvL3Byb2Nlc3NlZC1pbmZvcm1hdGlvbg0KLSAgICAgICAgRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIgcHJvY2Vzc2VkSW5mb1N0b3JhZ2VNYW5hZ2VyID0NCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyKCk7DQotICAgICAgICBwcm9jZXNzZWRJbmZvU3RvcmFnZU1hbmFnZXIucmVnaXN0ZXIobmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBzdG9yYWdlTWFuYWdlckhvbGRlci5zZXRTdG9yYWdlTWFuYWdlcihQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MsIHByb2Nlc3NlZEluZm9TdG9yYWdlTWFuYWdlciwgZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9jcm9zcy12YWxpZGF0aW9uDQotICAgICAgICBEZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgPQ0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyKCk7DQotICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5yZWdpc3RlcihuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBzdG9yYWdlTWFuYWdlckhvbGRlci5zZXRTdG9yYWdlTWFuYWdlcihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlciwgZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ncm91cC12YWxpZGF0aW9uIGxpZ2h0DQotICAgICAgICBTdG9yYWdlTWFuYWdlciBzdG9yYWdlTWFuYWdlciA9IHN0b3JhZ2VNYW5hZ2VySG9sZGVyLmdldFN0b3JhZ2VNYW5hZ2VyKEdyb3VwU3RvcmFnZS5jbGFzcyk7DQotDQotICAgICAgICBpZihzdG9yYWdlTWFuYWdlciBpbnN0YW5jZW9mIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAoKEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxTdHJpbmc+KXN0b3JhZ2VNYW5hZ2VyKQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBQcm9wZXJ0eVZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5zZXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcihuZXcgUHJvcGVydHlWYWxpZGF0aW9uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TWV0YURhdGFTdG9yYWdlRmlsdGVycygpDQotICAgIHsNCi0gICAgICAgICBNZXRhRGF0YVN0b3JhZ2UgbWV0YURhdGFTdG9yYWdlID0gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZSgNCi0gICAgICAgICAgICAgICAgIE1ldGFEYXRhU3RvcmFnZS5jbGFzcywgTWV0YURhdGFTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBtZXRhRGF0YVN0b3JhZ2UucmVnaXN0ZXJGaWx0ZXIobmV3IEpvaW5WYWxpZGF0aW9uTWV0YURhdGFTdG9yYWdlRmlsdGVyKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0UGhhc2VMaXN0ZW5lcnMoKQ0KLSAgICB7DQotICAgICAgICBKc2ZVdGlscy5yZWdpc3RlclBoYXNlTGlzdGVuZXIobmV3IENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YzQ1MjYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci0KLS8qKgotICogdGhlIHNraXAgdmFsaWRhdGlvbiBzdXBwb3J0IHdhcyByZWZhY3RvcmVkIHRvIGFuIGluZGVwZW5kZW50IG1lY2hhbmlzbQotICogc2VlIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJjaGFuZ2UgdGhlIGFkZC1vbnMiICsKLSAgICAgICAgIm9sZCBuYW1lOiBWYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0IikKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0TW9kdWxlS2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDQ1YmY3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm9wZXJ0eVZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFByb3BlcnR5VmFsaWRhdGlvblNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIGltcGxlbWVudHMgU2tpcFZhbGlkYXRpb25FdmFsdWF0b3INCi17DQotICAgIHB1YmxpYyBib29sZWFuIHNraXBWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7DQotICAgICAgICANCi0gICAgICAgIGlmKEpzZlV0aWxzLmlzUmVuZGVyUmVzcG9uc2VQaGFzZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9ICFpc0NsaWVudFNpZGVWYWxpZGF0aW9uRW5hYmxlZChtZXRhRGF0YUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQgfHwgUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZGF0aW9uU2tpcHBlZChmYWNlc0NvbnRleHQsIHZhbGlkYXRpb25TdHJhdGVneSwgbWV0YURhdGFFbnRyeSk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xpZW50U2lkZVZhbGlkYXRpb25FbmFibGVkKE1ldGFEYXRhRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBrZXlzVG9EaXNhYmxlID0gZW50cnkuZ2V0UHJvcGVydHkoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25NZXRhRGF0YUtleXMuRElTQUJMRV9DTElFTlRfU0lERV9WQUxJREFUSU9OLCBMaXN0LmNsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiBrZXlzVG9EaXNhYmxlID09IG51bGwgfHwgIWtleXNUb0Rpc2FibGUuY29udGFpbnMoZW50cnkuZ2V0S2V5KCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlZWIyOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFybid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJkb2N1bWVudGF0aW9uIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fTUVTU0FHRVNfSlBBID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMiKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9KUEFfQkFTRURfVkFMSURBVElPTiIpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vRG91YmxlUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM3YzNjNS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIERvdWJsZVJhbmdlDQotew0KLSAgICBkb3VibGUgbWluaW11bSgpIGRlZmF1bHQgRG91YmxlLk1JTl9WQUxVRTsNCi0NCi0gICAgZG91YmxlIG1heGltdW0oKSBkZWZhdWx0IERvdWJsZS5NQVhfVkFMVUU7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Kb2luVmFsaWRhdGlvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vSm9pblZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM5YTg5OS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Kb2luVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgSm9pblZhbGlkYXRpb24NCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xlbmd0aC5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTGVuZ3RoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZmNmMGYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTGVuZ3RoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgTGVuZ3RoDQotew0KLSAgICBpbnQgbWluaW11bSgpIGRlZmF1bHQgMDsNCi0NCi0gICAgaW50IG1heGltdW0oKSBkZWZhdWx0IEludGVnZXIuTUFYX1ZBTFVFOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Mb25nUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4MThmYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Mb25nUmFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBMb25nUmFuZ2UNCi17DQotICAgIGxvbmcgbWluaW11bSgpIGRlZmF1bHQgTG9uZy5NSU5fVkFMVUU7DQotDQotICAgIGxvbmcgbWF4aW11bSgpIGRlZmF1bHQgTG9uZy5NQVhfVkFMVUU7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NGJlOGEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFBhdHRlcm4NCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJub19tYXRjaCI7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZC5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUmVxdWlyZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFjZTEyOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFJlcXVpcmVkDQotew0KLSAgICAvKioNCi0gICAgICogdG8gY3VzdG9taXplIHRoZSBlcnJvciBtZXNzYWdlIG9yDQotICAgICAqIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGpzZiByZXF1aXJlZCBtZXNzYWdlIHdpdGggdGhlIHVzYWdlIG9mIHRoZSBtZXNzYWdlIHJlc29sdmVyIG1lY2hhbmlzbQ0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIGFuIG9wdGlvbmFsIGVycm9yIG1lc3NhZ2Uga2V5DQotICAgICAqLw0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZmllbGRfcmVxdWlyZWQiOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb24uamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZDFlMGMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFNraXBWYWxpZGF0aW9uDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZSgpOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCB7fTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM2YTQ3Mi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRhcmdldChUWVBFKQotQFJldGVudGlvbihSVU5USU1FKQotQERvY3VtZW50ZWQKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIEBpbnRlcmZhY2UgU2tpcFZhbGlkYXRpb25TdXBwb3J0Ci17Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9WYWxpZGF0b3IuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2M5OTAxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFZhbGlkYXRvcg0KLXsNCi0gICAgQ2xhc3M8PyBleHRlbmRzIGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I+W10gdmFsdWUoKTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTBlZWJhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ARGVwcmVjYXRlZAotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yIGV4dGVuZHMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yCi17Ci0gICAgcHJpdmF0ZSBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBnZXRJbnN0YW5jZSgpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvckZvcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvcigpLCBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkKLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsKLQotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBQcm9wZXJ0eURldGFpbHMpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG9iamVjdC5nZXRDbGFzcygpICsgIiBpcyBub3QgYSAiICsgUHJvcGVydHlEZXRhaWxzLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gKFByb3BlcnR5RGV0YWlscylvYmplY3Q7Ci0KLSAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKSk7Ci0KLSAgICAgICAgLy9UT0RPIHRlc3Qgd2l0aCBjb21wbGV4IGNvbXBvbmVudHMKLSAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5zZXRJbmZvcm1hdGlvbigKLSAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIHByb3BlcnR5RGV0YWlscyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZmluZCBhbmQgYWRkIGFubm90YXRpb25zCi0gICAgICAgICAqLwotICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlODAxMi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPVRoZSByZXF1aXJlZCBmb3JtYXRlIGlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdhYjU0My4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPVx1MDYyN1x1MDY0NFx1MDYzNVx1MDY0YVx1MDYzYVx1MDYyOSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2MjZcdTA2MjkNCi1ub19tYXRjaF9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjM1XHUwNjRhXHUwNjNhXHUwNjI5IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzN1x1MDY0NFx1MDY0OFx1MDYyOFx1MDYyOSBcdTA2NDdcdTA2NDk6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGQ2NDkwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW5vX21hdGNoPUZvcm1hdCBpbnZcdTAwZTBsaWQKLW5vX21hdGNoX2RldGFpbD1FbCBmb3JtYXQgcmVxdWVyaXQgXHUwMGU5czogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcyBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZTcwMWIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1Vbmf8bHRpZ2VzIEZvcm1hdA0KLW5vX21hdGNoX2RldGFpbD1EYXMgZXJmb3JkZXJsaWNoZSBGb3JtYXQgaXN0OiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlODAxMi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPVRoZSByZXF1aXJlZCBmb3JtYXRlIGlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiMTA3Ny4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXRvIGludlx1MDBlMWxpZG8gCi1ub19tYXRjaF9kZXRhaWw9RWwgZm9ybWF0byByZXF1ZXJpZG8gZXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjBhMjIzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9TGUgZm9ybWF0IGVzdCBpbnZhbGlkZQ0KLW5vX21hdGNoX2RldGFpbD1MZSBmb3JtYXQgZG9pdCAmZWNpcmM7dHJlIGRlIGxhIGZvcm1lOiB7MH0NCi0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE4NzQ4Yy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXRvIG5vbiB2YWxpZG8KLW5vX21hdGNoX2RldGFpbD1JbCBmb3JtYXRvIHJpY2hpZXN0byAmZWdyYXZlOzogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcyBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NGJjNzQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1HZVx1MDBlN2Vyc2l6IGJpXHUwMGU3aW0NCi1ub19tYXRjaF9kZXRhaWw9Z2VyZWtlbiBiaVx1MDBlN2ltOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZTk2N2EuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgICAgIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZU5hbWUgPSBudWxsOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VOYW1lID0gc3VwZXIuZ2V0QmFzZU5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBiYXNlTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9KcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTRlY2UzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIHRoZSBqcGEgc3VwcG9ydCBpcyBhbiBleGNlcHRpb24gaW4gdmlldyBvZiBzb21lIG1lY2hhbmlzbXMgLSBzbyB0aGVyZSdzIG5vIGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZS4NCi0gKiBpbnN0ZWFkIG9mIHRoZSBjb252ZW50aW9uIHRoZXJlIGlzIGEgZ2xvYmFsIHByb3BlcnR5IHRvIGhhdmUgYW4gYWx0ZXJuYXRpdmUgdG8gd2ViLnhtbCBjb25maWd1cmF0aW9uDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTID0gIkpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTIjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX05BTUUgPSBXZWJYbWxQYXJhbWV0ZXIuVkFMSURBVElPTl9NRVNTQUdFU19KUEE7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX05BTUUgPSBKcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MNCi0gICAgICAgICAgICAuZ2V0UGFja2FnZSgpLmdldE5hbWUoKS5yZXBsYWNlKCIubWVzc2FnZS5yZXNvbHZlciIsICIubWVzc2FnZS5idW5kbGUiKSsgIi5qcGFfbWVzc2FnZXMiOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYoQ1VTVE9NX0JBU0VfTkFNRSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBDVVNUT01fQkFTRV9OQU1FOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQkFTRV9OQU1FOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9BYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQWJzdHJhY3RWYWxpZGF0aW9uUGFyYW1ldGVyQXdhcmVUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTVjZDQ0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9BYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGlmIChpc0Jsb2NraW5nTWV0YURhdGEobWV0YURhdGEpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1NZXRhRGF0YShtZXRhRGF0YSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhKTsNCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNCbG9ja2luZ01ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIHRlc3RNZXNzYWdlID0gbmV3IEZhY2VzTWVzc2FnZSgpOw0KLSAgICAgICAgdGVzdE1lc3NhZ2Uuc2V0U2V2ZXJpdHkoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSA9IHRyeVRvVHJhbnNmb3JtVmlvbGF0aW9uU2V2ZXJpdHkobWV0YURhdGFFbnRyeSk7DQotDQotICAgICAgICBpZihzZXZlcml0eSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRlc3RNZXNzYWdlLnNldFNldmVyaXR5KHNldmVyaXR5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5zZXZlcml0eUJsb2Nrc1N1Ym1pdEZvckNvbXBvbmVudElkKG51bGwsIHRlc3RNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEZhY2VzTWVzc2FnZS5TZXZlcml0eSB0cnlUb1RyYW5zZm9ybVZpb2xhdGlvblNldmVyaXR5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2UuU2V2ZXJpdHk+IHJlc3VsdCA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKQ0KLSAgICAgICAgICAgICAgICAuZXh0cmFjdChtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihWaW9sYXRpb25TZXZlcml0eS5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5LmNsYXNzKTsNCi0NCi0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiAhcmVzdWx0LmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Lml0ZXJhdG9yKCkubmV4dCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU5ZTRlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Eb3VibGVSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkRvdWJsZVJhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uUGFyYW1ldGVyQXdhcmVUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIERvdWJsZVJhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKERvdWJsZVJhbmdlLmNsYXNzKTsNCi0NCi0gICAgICAgIGRvdWJsZSBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW5pbXVtKCk7DQotDQotICAgICAgICBpZihtaW5pbXVtICE9IERvdWJsZS5NSU5fVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTiwgbWluaW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxULCBtaW5pbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGRvdWJsZSBtYXhpbXVtID0gYW5ub3RhdGlvbi5tYXhpbXVtKCk7DQotDQotICAgICAgICBpZihtYXhpbXVtICE9IERvdWJsZS5NQVhfVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCwgbWF4aW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWF9ERUZBVUxULCBtYXhpbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pvaW5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMzUzMjQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pvaW5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uZXh0cmFjdG9yLkRlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJvcGVydHlWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLUBEZXByZWNhdGVkDQotcHVibGljIGNsYXNzIEpvaW5NZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnQobWV0YURhdGFFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybigidGhpcyBjbGFzcyBpcyByZXBsYWNlZCBieSBhIG1ldGEtZGF0YSBzdG9yYWdlIGZpbHRlci4gIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgImlmIGl0IGdldHMgaW52b2tlZCBhbmQgYW4gZXhjZXB0aW9uIG9jY3VycywgYSBjdXN0b20gc3ludGF4IGlzIHVzZWQuIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgY2xhc3MgbWlnaHQgYmUgdXNlZCBieSBhbiBvbGQgYWRkLW9uLiBwbGVhc2UgY2hlY2sgZm9yIGEgbmV3ZXIgdmVyc2lvbi4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnQoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBleHRyYWN0b3IgPSBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmdldEluc3RhbmNlKCk7DQotDQotICAgICAgICBTdHJpbmdbXSB0YXJnZXRFeHByZXNzaW9ucyA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoSm9pblZhbGlkYXRpb24uY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdGFyZ2V0RXhwcmVzc2lvbiA6IHRhcmdldEV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogZXh0cmFjdG9yLmV4dHJhY3QoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscykuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSA9PSBudWxsIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZGF0aW9uU2tpcHBlZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3ksIGVudHJ5KSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IEV4dFZhbFV0aWxzLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoIShlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQW5ub3RhdGlvbiAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXh0cmFjdChlbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXRlcmF0b3IoKS5oYXNOZXh0KCkpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0QWxsKG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pwYU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNlMTAxMS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQmFzaWM7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpwYU1ldGFEYXRhVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiaW1wbC4gdGhlIHJlc3QiKQ0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmKGFubm90YXRpb24gaW5zdGFuY2VvZiBDb2x1bW4pDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoKCEoKENvbHVtbikgYW5ub3RhdGlvbikubnVsbGFibGUoKSkgJiYgRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RILCAoKENvbHVtbikgYW5ub3RhdGlvbikubGVuZ3RoKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihhbm5vdGF0aW9uIGluc3RhbmNlb2YgQmFzaWMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoISgoQmFzaWMpIGFubm90YXRpb24pLm9wdGlvbmFsKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIElkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotICAgICAgICAvL1RPRE8gaW1wbC4gdGhlIHJlc3QhISENCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9MZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTGVuZ3RoTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzkxZjlhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9MZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXINCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBMZW5ndGggYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTGVuZ3RoLmNsYXNzKTsNCi0NCi0gICAgICAgIGludCBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW5pbXVtKCk7DQotDQotICAgICAgICBpZihtaW5pbXVtICE9IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEgsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIX0RFRkFVTFQsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW50IG1heGltdW0gPSBhbm5vdGF0aW9uLm1heGltdW0oKTsNCi0gICAgICAgIGlmKG1heGltdW0gIT0gSW50ZWdlci5NQVhfVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIX0RFRkFVTFQsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Mb25nUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYTMzMmIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxvbmdSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTG9uZ1JhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKExvbmdSYW5nZS5jbGFzcyk7DQotDQotICAgICAgICBsb25nIG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gIT0gTG9uZy5NSU5fVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTiwgbWluaW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxULCBtaW5pbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGxvbmcgbWF4aW11bSA9IGFubm90YXRpb24ubWF4aW11bSgpOw0KLQ0KLSAgICAgICAgaWYobWF4aW11bSAhPSBMb25nLk1BWF9WQUxVRSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYLCBtYXhpbXVtKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1BhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEwYmU2NS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQYXR0ZXJuTWV0YURhdGFUcmFuc2Zvcm1lciAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgUGF0dGVybiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShQYXR0ZXJuLmNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4sIChhbm5vdGF0aW9uKS52YWx1ZSgpKTsNCi0NCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkgPSAoYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgICAgICBMb2NhbGUgY3VycmVudExvY2FsZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpOw0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSA9DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7DQotDQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnID0gRXh0VmFsVXRpbHMuZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAuZ2V0TWVzc2FnZSh2YWxpZGF0aW9uRXJyb3JNc2dLZXksIGN1cnJlbnRMb2NhbGUpOw0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFLCB2YWxpZGF0aW9uRXJyb3JNc2cpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmJlY2M5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9SZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uUGFyYW1ldGVyQXdhcmVUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ta2lwTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NraXBNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYzY0YWIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NraXBNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFNraXBNZXRhRGF0YVRyYW5zZm9ybWVyICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXINCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCB0cnVlKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDA1YWIwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lciAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgVmFsaWRhdG9yIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFZhbGlkYXRvci5jbGFzcyk7DQotDQotICAgICAgICBDbGFzc1tdIHZhbGlkYXRvcnMgPSBhbm5vdGF0aW9uLnZhbHVlKCk7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBjdXJyZW50Q2xhc3MgOiB2YWxpZGF0b3JzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRDbGFzcy5nZXRTaW1wbGVOYW1lKCkudG9Mb3dlckNhc2UoKS5jb250YWlucyhDb21tb25NZXRhRGF0YUtleXMuRU1BSUwpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsdWUuYWRkKENvbW1vbk1ldGFEYXRhS2V5cy5FTUFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZhbHVlLmFkZChjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00sIHZhbHVlKTsNCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvRG91YmxlUmFuZ2VTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTc1OTMzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkRvdWJsZVJhbmdlVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEb3VibGVSYW5nZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIERvdWJsZVJhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKERvdWJsZVJhbmdlLmNsYXNzKTsNCi0gICAgICAgIERvdWJsZVJhbmdlVmFsaWRhdG9yIGRvdWJsZVJhbmdlVmFsaWRhdG9yID0gKERvdWJsZVJhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5Eb3VibGVSYW5nZSIpOw0KLQ0KLSAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Kb2luVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZGExYWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Kb2luVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5leHRyYWN0b3IuRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWNlc0V4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLUBEZXByZWNhdGVkDQotcHVibGljIGNsYXNzIEpvaW5WYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZUpvaW5WYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRmFjZXNFeGNlcHRpb24gdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyB0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oInRoaXMgY2xhc3MgaXMgcmVwbGFjZWQgYnkgYSBtZXRhLWRhdGEgc3RvcmFnZSBmaWx0ZXIuICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJpZiBpdCBnZXRzIGludm9rZWQgYW5kIGFuIGV4Y2VwdGlvbiBvY2N1cnMsIGEgY3VzdG9tIHN5bnRheCBpcyB1c2VkLiIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIGNsYXNzIG1pZ2h0IGJlIHVzZWQgYnkgYW4gb2xkIGFkZC1vbi4gcGxlYXNlIGNoZWNrIGZvciBhIG5ld2VyIHZlcnNpb24uIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUpvaW5WYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIGV4dHJhY3RvciA9IERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuZ2V0SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIFN0cmluZ1tdIHRhcmdldEV4cHJlc3Npb25zID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShKb2luVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdGFyZ2V0RXhwcmVzc2lvbiA6IHRhcmdldEV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogZXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCBwcm9wZXJ0eURldGFpbHMpLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLnByb2Nlc3NNZXRhRGF0YUVudHJ5QWZ0ZXJTa2lwVmFsaWRhdGlvbihQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKSwgZW50cnkpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyB2YWxpZGF0aW9uIHN0cmF0ZWd5IGZvdW5kIGZvciAiICsgZW50cnkuZ2V0VmFsdWUoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTQxYTkzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLmV4Y2VwdGlvbi5SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQmFzaWM7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZTsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpwYVZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUZhY2VzQnVuZGxlID0gZmFsc2U7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFURV9MRU5HVEggPSAibGVuZ3RoIjsNCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmlvbGF0aW9uOw0KLSAgICBwcml2YXRlIGludCBtYXhMZW5ndGg7DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKTsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgQ29sdW1uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlQ29sdW1uQW5ub3RhdGlvbigoQ29sdW1uKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIEJhc2ljKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlQmFzaWNBbm5vdGF0aW9uKChCYXNpYykgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBJZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgT25lVG9PbmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVPbmVUb09uZUFubm90YXRpb24oKE9uZVRvT25lKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE1hbnlUb09uZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZU1hbnlUb09uZUFubm90YXRpb24oKE1hbnlUb09uZSkgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVDb2x1bW5Bbm5vdGF0aW9uKENvbHVtbiBjb2x1bW4sIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKCFjb2x1bW4ubnVsbGFibGUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCBpbnN0YW5jZW9mIFN0cmluZw0KLSAgICAgICAgICAgICAgICAmJiBjb2x1bW4ubGVuZ3RoKCkgPCAoKFN0cmluZykgY29udmVydGVkT2JqZWN0KS5sZW5ndGgoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbiA9IFZBTElEQVRFX0xFTkdUSDsNCi0gICAgICAgICAgICB0aGlzLm1heExlbmd0aCA9IGNvbHVtbi5sZW5ndGgoKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWVzc2FnZShudWxsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQmFzaWNBbm5vdGF0aW9uKEJhc2ljIGJhc2ljLCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICghYmFzaWMub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlT25lVG9PbmVBbm5vdGF0aW9uKE9uZVRvT25lIG9uZVRvT25lLCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIW9uZVRvT25lLm9wdGlvbmFsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU1hbnlUb09uZUFubm90YXRpb24oTWFueVRvT25lIG1hbnlUb09uZSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFtYW55VG9PbmUub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCB8fCAoIiIuZXF1YWxzKGNvbnZlcnRlZE9iamVjdCkgJiYgRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb24gPSBDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQ7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWVzc2FnZShudWxsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoVkFMSURBVEVfTEVOR1RILmVxdWFscyh0aGlzLnZpb2xhdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJmaWVsZF90b29fbG9uZyI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJmaWVsZF9yZXF1aXJlZCI7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHN1cGVyLmdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgIGlmIChWQUxJREFURV9MRU5HVEguZXF1YWxzKHRoaXMudmlvbGF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLCAiIiArIHRoaXMubWF4TGVuZ3RoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc3VwZXIucmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0gICAgICAgIFN0cmluZyBtYXJrZXIgPSBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5NSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0NCi0gICAgICAgIGlmKChtYXJrZXIgKyBrZXkgKyBtYXJrZXIpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudXNlRmFjZXNCdW5kbGUgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IGUuZ2V0RmFjZXNNZXNzYWdlKCk7DQotDQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKFZBTElEQVRFX0xFTkdUSC5lcXVhbHModGhpcy52aW9sYXRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0TWF4aW11bU1lc3NhZ2UoZmFjZXNNZXNzYWdlLCB0aGlzLm1heExlbmd0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTGVuZ3RoU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2QwNTU4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMZW5ndGhTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBMZW5ndGggYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTGVuZ3RoLmNsYXNzKTsNCi0gICAgICAgIExlbmd0aFZhbGlkYXRvciBsZW5ndGhWYWxpZGF0b3IgPSAoTGVuZ3RoVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5MZW5ndGgiKTsNCi0NCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNTgyMDIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Mb25nUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5Mb25nUmFuZ2VWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExvbmdSYW5nZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIExvbmdSYW5nZSBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMb25nUmFuZ2UuY2xhc3MpOw0KLSAgICAgICAgTG9uZ1JhbmdlVmFsaWRhdG9yIGxvbmdSYW5nZVZhbGlkYXRvciA9IChMb25nUmFuZ2VWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigiamF2YXguZmFjZXMuTG9uZ1JhbmdlIik7DQotDQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bShhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUGF0dGVyblN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUGF0dGVyblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhM2Y0ZWYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUGF0dGVyblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5PFBhdHRlcm4+DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBQYXR0ZXJuIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFBhdHRlcm4uY2xhc3MpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZXhwcmVzc2lvbiA6IGFubm90YXRpb24udmFsdWUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIWphdmEudXRpbC5yZWdleC5QYXR0ZXJuLmNvbXBpbGUoZXhwcmVzc2lvbikubWF0Y2hlcihjb252ZXJ0ZWRPYmplY3QudG9TdHJpbmcoKSkubWF0Y2hlcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihuZXcgRmFjZXNNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24pLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKS5yZXBsYWNlKCJ7MH0iLCBleHByZXNzaW9uKSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShQYXR0ZXJuIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZXF1aXJlZFN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUmVxdWlyZWRTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDllNGM3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZXF1aXJlZFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uZXhjZXB0aW9uLlJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLk51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBOdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBFbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZFN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5PFJlcXVpcmVkPg0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUZhY2VzQnVuZGxlID0gZmFsc2U7DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCB8fCBjb252ZXJ0ZWRPYmplY3QuZXF1YWxzKCIiKSB8fA0KLSAgICAgICAgICAgICAgICAoY29udmVydGVkT2JqZWN0IGluc3RhbmNlb2YgQ29sbGVjdGlvbiAmJiAoKENvbGxlY3Rpb24pY29udmVydGVkT2JqZWN0KS5pc0VtcHR5KCkpIHx8DQotICAgICAgICAgICAgICAgIChjb252ZXJ0ZWRPYmplY3QgaW5zdGFuY2VvZiBNYXAgJiYgKChNYXApY29udmVydGVkT2JqZWN0KS5pc0VtcHR5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgIGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWVzc2FnZShtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFJlcXVpcmVkLmNsYXNzKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KFJlcXVpcmVkIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShlLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvU2tpcFZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1NraXBWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJlYTkzZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvU2tpcFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ci1ARW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ci1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFNraXBWYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBWYWxpZGF0aW9uU3RyYXRlZ3kKLXsKLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmdbXSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9ucyA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoU2tpcFZhbGlkYXRpb24uY2xhc3MpLnZhbHVlKCk7Ci0KLSAgICAgICAgZm9yKFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uIDogdmFsdWVCaW5kaW5nRXhwcmVzc2lvbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRWYWx1ZU9mRXhwcmVzc2lvbigKLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5zZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5TS0lQX1ZBTElEQVRJT04sIHRydWUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIzY2M5MS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLQ0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I+W10gdmFsaWRhdG9yQ2xhc3NlcyA9DQotICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShWYWxpZGF0b3IuY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yIHZhbGlkYXRvcjsNCi0gICAgICAgIGZvciAoQ2xhc3MgdmFsaWRhdG9yQ2xhc3NOYW1lIDogdmFsaWRhdG9yQ2xhc3NlcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0b3IgPSAoamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcikgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzcyh2YWxpZGF0b3JDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UodmFsaWRhdG9yQ2xhc3NOYW1lLmdldE5hbWUoKSArICIgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NmFjNjAuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5LkFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWNlc0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogVGhpcyBwaGFzZSBsaXN0ZW5lciBwcm9jZXNzZXMgY3Jvc3MgdmFsaWRhdGlvbiBhcyBzb29uIGFzIGl0IGZpbmRzIGEgc3BlY2lhbCByZXF1ZXN0IHNjb3BlZCBzdG9yYWdlLjxici8+DQotICogU28gaXQncyBwb3NzaWJsZSB0byBhZGQgaW5mb3JtYXRpb24gZHVyaW5nIHRoZSBwcm9jZXNzIHZhbGlkYXRpb24gcGhhc2UuIEF0IHRoZSBlbmQgb2YgdGhpcyBwaGFzZSBpdCBnZXRzIHByb2Nlc3NlZC4NCi0gKiBBZnRlciB0aGF0IHRoZSBzdG9yYWdlIGdldHMgcmVzZXRlZC48cC8+DQotICogSWYgeW91IHByb3ZpZGUgYSBjdXN0b20gZXh0ZW5zaW9uIGFuZCB5b3UgYWRkIHRoZSBzYW1lIHN0b3JhZ2UgdHlwZSB3aXRoaW4gYSBkaWZmZXJlbnQgcGhhc2UsDQotICogaXQgYWxzbyBnZXRzIHByb2Nlc3NlZCBhdCB0aGUgZW5kIG9mIHRoYXQgcGhhc2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTUzMzM0MDU4OTc2MzU3NDI3MzJMOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSA9IENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKTsNCi0gICAgICAgICAgICBmb3IgKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA6IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UuZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZighRXh0VmFsVXRpbHMuZXhlY3V0ZUdsb2JhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0Q29tcG9uZW50KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuY2xhc3MuZ2V0TmFtZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIC8vY2FsbCBpbml0LW1ldGhvZA0KLSAgICAgICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkgaW5zdGFuY2VvZiBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLmdldENsYXNzKCkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5pdENyb3NzVmFsaWRhdGlvbiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAgICAgICAgICogdmFsaWRhdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICovDQotICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5wcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKGVudHJ5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhZGRNZXNzYWdlID0gdHJ1ZTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpIGluc3RhbmNlb2YgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1lc3NhZ2UgPSAoQm9vbGVhbilSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5nZXRDbGFzcygpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuY2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0Q2xhc3MoKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmKGFkZE1lc3NhZ2UpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjZXNNZXNzYWdlICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudElkKGVudHJ5LmdldENsaWVudElkKCksIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvQmxvY2tzTmF2aWdhdGlvbkZvckNvbXBvbmVudElkKGVudHJ5LmdldENsaWVudElkKCksIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZmluYWxseQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5leGVjdXRlR2xvYmFsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldENvbXBvbmVudCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmNsYXNzLmdldE5hbWUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBmaW5hbGx5DQotICAgICAgICB7DQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMucmVzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc0luaXRpYWxpemVkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04gIT0gbnVsbA0KLSAgICAgICAgICAgICAgICAgICAgJiYgV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEpzZlV0aWxzLmRlcmVnaXN0ZXJQaGFzZUxpc3RlbmVyKHRoaXMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpc0luaXRpYWxpemVkID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLkFOWV9QSEFTRTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICBpZiAodGhpcyA9PSBvKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiN2Y4OWIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFybid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0NST1NTVkFMSURBVElPTiIpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjODA2NDAuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgRGF0ZUlzDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZU9mKCk7DQotDQotICAgIC8qDQotICAgICAqIG9wdGlvbmFsIHNlY3Rpb24NCi0gICAgICovDQotDQotICAgIERhdGVJc1R5cGUgdHlwZSgpIGRlZmF1bHQgRGF0ZUlzVHlwZS5zYW1lOw0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiIjsNCi0NCi0gICAgU3RyaW5nIG5vdEJlZm9yZUVycm9yTXNnS2V5KCkgZGVmYXVsdCAid3JvbmdfZGF0ZV9ub3RfYmVmb3JlIjsNCi0NCi0gICAgU3RyaW5nIG5vdEFmdGVyRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJ3cm9uZ19kYXRlX25vdF9hZnRlciI7DQotDQotICAgIFN0cmluZyBub3RFcXVhbEVycm9yTXNnS2V5KCkgZGVmYXVsdCAid3JvbmdfZGF0ZV9ub3RfZXF1YWwiOw0KLQ0KLSAgICBpbnQgZXJyb3JNZXNzYWdlRGF0ZVN0eWxlKCkgZGVmYXVsdCBEYXRlRm9ybWF0Lk1FRElVTTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzVmNDgyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJiZWZvcmVPclNhbWUsIGFmdGVyT3JTYW1lIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgZW51bSBEYXRlSXNUeXBlDQotew0KLSAgICBiZWZvcmUsIGFmdGVyLCBzYW1lDQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzZDU0MS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIEVxdWFscw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZCI7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MzhmMTUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL05vdEVxdWFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBOb3RFcXVhbHMNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJkdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkIjsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmU3ZmE0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFJlcXVpcmVkSWYNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlT2YoKTsNCi0NCi0gICAgLyoNCi0gICAgICogb3B0aW9uYWwgc2VjdGlvbg0KLSAgICAgKi8NCi0NCi0gICAgUmVxdWlyZWRJZlR5cGUgaXMoKSBkZWZhdWx0IFJlcXVpcmVkSWZUeXBlLm5vdF9lbXB0eTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImVtcHR5X2ZpZWxkIjsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmVHlwZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWZUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MGFjOTAuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWZUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBlbnVtIFJlcXVpcmVkSWZUeXBlDQotew0KLSAgICBlbXB0eSwgbm90X2VtcHR5DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNjA3NTkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUlucHV0IGlzIGRpZmZlcmVudA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9SW5wdXQgaXMgZGlmZmVyZW50DQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi0NCi13cm9uZ19kYXRlPVdyb25nIGRhdGUNCi13cm9uZ19kYXRlX2RldGFpbD1Xcm9uZyBkYXRlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcyBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmY5M2M0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1cdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgXHUwNjQ1XHUwNjJlXHUwNjJhXHUwNjQ0XHUwNjQxDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgXHUwNjQ1XHUwNjJlXHUwNjJhXHUwNjQ0XHUwNjQxDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1cdTA2M2FcdTA2NGFcdTA2MzEgXHUwNjQ1XHUwNjMzXHUwNjQ1XHUwNjQ4XHUwNjJkIFx1MDYyOFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDYgXHUwNjQxXHUwNjMzIFx1MDY0Mlx1MDY0YVx1MDY0NVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1cdTA2M2FcdTA2NGFcdTA2MzEgXHUwNjQ1XHUwNjMzXHUwNjQ1XHUwNjQ4XHUwNjJkIFx1MDYyOFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCAgXHUwNjQ2XHUwNjQxXHUwNjMzIFx1MDY0Mlx1MDY0YVx1MDY0NVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQNCi0NCi13cm9uZ19kYXRlPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2NDlcdTA2MjENCi13cm9uZ19kYXRlX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjJlXHUwNjI3XHUwNjM3XHUwNjQ5XHUwNjIxDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0M1x1MDY0OCBcdTA2NDYgXHUwNjI4XHUwNjM5XHUwNjJmIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzIFx1MDY0OFx1MDY0NiBcdTA2MjhcdTA2MzlcdTA2MmYgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzXHUwNjQ4IFx1MDY0NiBcdTA2NDJcdTA2MjhcdTA2NDQgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0MyBcdTA2NDhcdTA2NDYgXHUwNjQyXHUwNjI4XHUwNjQ0IHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NDRcdTA2MjcgXHUwNjRhXHUwNjMzXHUwNjI3XHUwNjQ4XHUwNjQ5IHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjQ0XHUwNjI3IFx1MDY0YVx1MDYzM1x1MDYyN1x1MDY0OFx1MDY0OSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcyBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODU0ZWQyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9ZWwgdmFsb3IgXHUwMGU5IGRpZmVyZW50Ci1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPWVsIHZhbG9yIFx1MDBlOSBkaWZlcmVudAotCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPW5vIGVzIHBlcm1ldCBlbCBtYXRlaXggdmFsb3IKLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPW5vIGVzIHBlcm1ldCBlbCBtYXRlaXggdmFsb3IKLQotd3JvbmdfZGF0ZT1kYXRhIGVyclx1MDBmMm5pYQotd3JvbmdfZGF0ZV9kZXRhaWw9ZGF0YSBlcnJcdTAwZjJuaWEKLQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1sYSBkYXRhIGhhIGRlIHNlciBwb3N0ZXJpb3IgYSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9bGEgZGF0YSBoYSBkZSBzZXIgYW50ZXJpb3IgYSB7MH0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1sYSBkYXRhIGhhIGRlIHNlciBwb3N0ZXJpb3IgYSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9bGEgZGF0YSBubyBcdTAwMGU5cyBpZ3VhbCBhIHswfQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPWxhIGRhdGEgbm8gXHUwMDBlOXMgaWd1YWwgYSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcyBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDg3MjM0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1FaW5nYWJlIGlzdCB1bnRlcnNjaGllZGxpY2gNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUVpbmdhYmUgaXN0IHVudGVyc2NoaWVkbGljaA0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9RGVyIGdsZWljaGUgV2VydCBpc3QgbmljaHQgZXJsYXVidA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPURlciBnbGVpY2hlIFdlcnQgaXN0IG5pY2h0IGVybGF1YnQNCi0NCi13cm9uZ19kYXRlPURhdHVtIGlua29ycmVrdA0KLXdyb25nX2RhdGVfZGV0YWlsPURhdHVtIGlua29ycmVrdA0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1EYXMgRGF0dW0gbXVzcyBuYWNoIGRlbSB7MH0gc2Vpbg0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9RGFzIERhdHVtIG11c3MgbmFjaCBkZW0gezB9IHNlaW4NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1EYXMgRGF0dW0gbXVzcyB2b3IgZGVtIHswfSBzZWluDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPURhcyBEYXR1bSBtdXNzIHZvciBkZW0gezB9IHNlaW4NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1EYXMgRGF0dW0gZW50c3ByaWNodCBuaWNodCBkZW0gezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPURhcyBEYXR1bSBlbnRzcHJpY2h0IG5pY2h0IGRlbSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcyBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjYwNzU5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1JbnB1dCBpcyBkaWZmZXJlbnQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUlucHV0IGlzIGRpZmZlcmVudA0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotDQotd3JvbmdfZGF0ZT1Xcm9uZyBkYXRlDQotd3JvbmdfZGF0ZV9kZXRhaWw9V3JvbmcgZGF0ZQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzODUyNC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPWxhIGVudHJhZGEgZXMgZGlmZXJlbnRlCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPWxhIGVudHJhZGEgZXMgZGlmZXJlbnRlCi0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9bm8gc2UgcGVybWl0ZW4gZW50cmFkYXMgaWd1YWxlcwotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9bm8gc2UgcGVybWl0ZW4gZW50cmFkYXMgaWd1YWxlcwotCi13cm9uZ19kYXRlPWZlY2hhIGVxdWl2b2NhZGEKLXdyb25nX2RhdGVfZGV0YWlsPWZlY2hhIGVxdWl2b2NhZGEKLQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgbHVlZ28gZGUgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgbHVlZ28gZGUgezB9Ci0KLXdyb25nX2RhdGVfbm90X2FmdGVyPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgYW50ZXMgZGUgezB9Ci13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBhbnRlcyBkZSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9bGEgZmVjaGEgbm8gZXMgaWd1YWwgYSB7MH0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1sYSBmZWNoYSBubyBlcyBpZ3VhbCBhIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZjAyMTguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUxlcyBjaGFtcHMgc29udCBkaWZmJmVhY3V0ZTtyZW50cw0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9TGVzIGNoYW1wcyBzb250IGRpZmYmZWFjdXRlO3JlbnRzDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1MZXMgY2hhbXBzIGRvaXZlbnQgJmVjaXJjO3RyZSBkaWZmJmVhY3V0ZTtyZW50cw0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPUxlcyBjaGFtcHMgZG9pdmVudCAmZWNpcmM7dHJlIGRpZmYmZWFjdXRlO3JlbnRzDQotDQotd3JvbmdfZGF0ZT1MYSBkYXRlIGVzdCBpbmNvcnJlY3RlDQotd3JvbmdfZGF0ZV9kZXRhaWw9TGEgZGF0ZSBlc3QgaW5jb3JyZWN0ZQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhcHImZWdyYXZlO3MgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhcHImZWdyYXZlO3MgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXZhbnQgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGF2YW50IHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPUxhIGRhdGUgbidlc3QgcGFzICZlYWN1dGU7Z2FsZSAmYWdyYXZlOyB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9TGEgZGF0ZSBuJ2VzdCBwYXMgJmVhY3V0ZTtnYWxlICZhZ3JhdmU7IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNDI4MDEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1WYWxvcmkgbm9uIHVndWFsaQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1JIHZhbG9yaSBpbnNlcml0aSBub24gY29pbmNpZG9ubwotCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPUxvIHN0ZXNzbyB2YWxvcmUgbm9uICZlZ3JhdmU7IHBlcm1lc3NvCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1MbyBzdGVzc28gdmFsb3JlIG5vbiAmZWdyYXZlOyBwZXJtZXNzbwotCi13cm9uZ19kYXRlPURhdGEgZXJyYXRhCi13cm9uZ19kYXRlX2RldGFpbD1EYXRhIGVycmF0YQotCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9TGEgZGF0YSBkZXZlIGVzc2VyZSBkb3BvIGRpIHswfQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1MYSBkYXRhIGRldmUgZXNzZXJlIGRvcG8gZGkgezB9Ci0KLXdyb25nX2RhdGVfbm90X2FmdGVyPUxhIGRhdGEgZGV2ZSBlc3NlcmUgcHJpbWEgZGkgezB9Ci13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9TGEgZGF0YSBkZXZlIGVzc2VyZSBwcmltYSBkaSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9TGEgZGF0YSBub24gJmVncmF2ZTsgdWd1YWxlIGEgezB9Ci13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9TGEgZGF0YSBub24gJmVncmF2ZTsgdWd1YWxlIGEgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFmNmE5ZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9Z2lyaWxlbiBkZVx1MDExZmVyIGZhcmtsXHUwMTMxDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1naXJpbGVuIGRlXHUwMTFmZXIgZmFya2xcdTAxMzENCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPWF5blx1MDEzMSBkZVx1MDExZmVyIGdpcmlsZW1leg0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPWF5blx1MDEzMSBkZVx1MDExZmVyIGdpcmlsZW1leg0KLQ0KLXdyb25nX2RhdGU9eWFubFx1MDEzMVx1MDE1ZiB0YXJpaA0KLXdyb25nX2RhdGVfZGV0YWlsPXlhbmxcdTAxMzFcdTAxNWYgdGFyaWgNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBzb25yYSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIHNvbnJhIG9sbWFsXHUwMTMxZFx1MDEzMXINCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIFx1MDBmNm5jZSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gXHUwMGY2bmNlIG9sbWFsXHUwMTMxZFx1MDEzMXINCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZSBlXHUwMTVmaXQgZGVcdTAxMWZpbA0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZSBlXHUwMTVmaXQgZGVcdTAxMWZpbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDc2NTllLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgICAgIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZU5hbWUgPSBudWxsOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VOYW1lID0gc3VwZXIuZ2V0QmFzZU5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBiYXNlTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlY29yZGVyL0Nyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlY29yZGVyL0Nyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkM2IwOGQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWNvcmRlci9Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnJlY29yZGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlci5Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIgaW1wbGVtZW50cyBQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyDQotew0KLSAgICBwdWJsaWMgdm9pZCByZWNvcmRVc2VySW5wdXQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgaWYgKCEodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICAvL3RvIHN1cHBvcnQgbG9jYWwgY3Jvc3MtdmFsaWRhdGlvbiAod2l0aGluIHRoZSBzYW1lIGVudGl0eSkNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgPSBDcm9zc1ZhbGlkYXRpb25VdGlscw0KLSAgICAgICAgICAgIC5nZXRPckluaXRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UoKTsNCi0NCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5Ow0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBpZihwcm9wZXJ0eURldGFpbHMgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGVudHJ5ID0gbmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5KCk7DQotICAgICAgICBlbnRyeS5zZXRCZWFuKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkpOw0KLSAgICAgICAgZW50cnkuc2V0Q29udmVydGVkVmFsdWUodmFsdWUpOw0KLSAgICAgICAgZW50cnkuc2V0Q29tcG9uZW50KHVpQ29tcG9uZW50KTsNCi0gICAgICAgIGVudHJ5LnNldENsaWVudElkKHVpQ29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGtleSA9IHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKTsNCi0NCi0gICAgICAgIC8vZm9yIGxvY2FsIGNyb3NzLXZhbGlkYXRpb24NCi0gICAgICAgIGlmIChwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY29udGFpbnNFbnRyeShrZXkpICYmDQotICAgICAgICAgICAgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmdldEVudHJ5KGtleSkuZ2V0QmVhbigpICE9IG51bGwgJiYNCi0gICAgICAgICAgICAhcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmdldEVudHJ5KGtleSkuZ2V0QmVhbigpLmVxdWFscyhlbnRyeS5nZXRCZWFuKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZm9yIHRoZSB2YWxpZGF0aW9uIHdpdGhpbiBhIGNvbXBsZXggY29tcG9uZW50IGUuZy4gYSB0YWJsZQ0KLSAgICAgICAgICAgIC8vZG9uJ3Qgb3ZlcnJpZGUgZXhpc3RpbmcgZXhwcmVzc2lvbiAoc3R5bGU6ICN7ZW50cnkucHJvcGVydHl9KSAtIG1ha2UgYSBzcGVjaWFsIG1hcHBpbmcNCi0NCi0gICAgICAgICAgICBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5PiBmdXJ0aGVyRW50cmllcyA9DQotICAgICAgICAgICAgICAgIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5nZXRFbnRyeShrZXkpLmdldEZ1cnRoZXJFbnRyaWVzKCk7DQotDQotICAgICAgICAgICAgaWYgKGZ1cnRoZXJFbnRyaWVzID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmdXJ0aGVyRW50cmllcyA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk+KCk7DQotDQotICAgICAgICAgICAgICAgIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5nZXRFbnRyeShrZXkpLnNldEZ1cnRoZXJFbnRyaWVzKGZ1cnRoZXJFbnRyaWVzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgZnVydGhlckVudHJpZXMuYWRkKGVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2ZvciBub3JtYWwgdmFsaWRhdGlvbg0KLSAgICAgICAgICAgIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5zZXRFbnRyeShrZXksIGVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5ZmFkNi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogbm9ybWFsbHkgaXQgc2hvdWxkIGJlIGluIHRoZSBzdG9yYWdlIHBhY2thZ2UgLSBkdWUgdG8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpdCBpc24ndCB0aGUgY2FzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlDQotew0KLSAgICB2b2lkIGFkZChDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkpOw0KLQ0KLSAgICBMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDllMWU3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLQ0KLS8qKg0KLSAqIG5vcm1hbGx5IGl0IHNob3VsZCBiZSBpbiB0aGUgc3RvcmFnZSBwYWNrYWdlIC0gZHVlIHRvIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaXQgaXNuJ3QgdGhlIGNhc2UNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5DQotew0KLSAgICBwcml2YXRlIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeTsNCi0gICAgLy9mb3IgY29tcGxleCBjb21wb25lbnRzIChlLmcuIGEgdGFibGUpIHN0b3JlcyB0aGUgb2JqZWN0IG9mIGVudHJ5ICgje2VudHJ5LnByb3BlcnR5fSkNCi0gICAgcHJpdmF0ZSBVSUNvbXBvbmVudCBjb21wb25lbnQ7DQotICAgIHByaXZhdGUgT2JqZWN0IGNvbnZlcnRlZE9iamVjdDsNCi0gICAgcHJpdmF0ZSBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIC8vanVzdCBmb3IgaW5wdXQgY29tcG9uZW50cyB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzIGUuZy4gZGF0YVRhYmxlLC4uLg0KLSAgICBwcml2YXRlIFN0cmluZyBjbGllbnRJZDsNCi0NCi0gICAgcHVibGljIE1ldGFEYXRhRW50cnkgZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUVudHJ5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhRW50cnkoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhRW50cnkgPSBtZXRhRGF0YUVudHJ5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBVSUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudChVSUNvbXBvbmVudCBjb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkT2JqZWN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZE9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZWRPYmplY3QoT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb252ZXJ0ZWRPYmplY3QgPSBjb252ZXJ0ZWRPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblN0cmF0ZWd5KENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3kgPSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjbGllbnRJZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGllbnRJZChTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTEwYTNiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgaW1wbGVtZW50cyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlDQotew0KLSAgICBwcml2YXRlIExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcyA9DQotICAgICAgICBuZXcgQXJyYXlMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcy5hZGQoZW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoTGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDQxYzk1ZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIGNyb3NzLXZhbGlkYXRpb24gZW50cmllcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlcg0KLSAgICBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIC8vZm9yIGJldHRlciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5DQotICAgICAgICByZXR1cm4gQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZDBmYzQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgaW1wbGVtZW50cyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk+IHByb2Nlc3NlZEluZm9ybWF0aW9uTWFwID0NCi0gICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVudHJ5KFN0cmluZyBrZXksIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb2Nlc3NlZEluZm9ybWF0aW9uTWFwLnB1dChrZXksIGVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0VudHJ5KFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9jZXNzZWRJbmZvcm1hdGlvbk1hcC5jb250YWluc0tleShrZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSBnZXRFbnRyeShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvY2Vzc2VkSW5mb3JtYXRpb25NYXAuZ2V0KGtleSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBiYjUwMC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIHByb2Nlc3NlZCBpbmZvcm1hdGlvbiBlbnRyaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXINCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZT4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICAvL2ZvciBiZXR0ZXIgYmFja3dhcmQgY29tcGF0aWJpbGl0eQ0KLSAgICAgICAgcmV0dXJuIENyb3NzVmFsaWRhdGlvblV0aWxzLmNsYXNzLmdldE5hbWUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYjE1NmUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UNCi17DQotICAgIHZvaWQgc2V0RW50cnkoU3RyaW5nIGtleSwgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgZW50cnkpOw0KLQ0KLSAgICBib29sZWFuIGNvbnRhaW5zRW50cnkoU3RyaW5nIGtleSk7DQotDQotICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IGdldEVudHJ5KFN0cmluZyBrZXkpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2Y3ODljLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBJbiBvcmRlciB0byBidWlsZCB1cCBhIG1hcHBpbmcgd2hpY2ggaXMgdXNlZCBmb3IgY3Jvc3MtdmFsaWRhdGlvbi4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5Ci17Ci0gICAgcHJpdmF0ZSBPYmplY3QgYmVhbjsKLSAgICBwcml2YXRlIE9iamVjdCBjb252ZXJ0ZWRWYWx1ZTsKLSAgICBwcml2YXRlIFVJQ29tcG9uZW50IGNvbXBvbmVudDsKLSAgICAvL2ZvciBjb21wbGV4IGNvbXBvbmVudHMgKGUuZy4gYSB0YWJsZSB0aGVyZSBhcmUgbXVsdGlwbGUgZW50cmllcyB3aXRoCi0gICAgLy90aGUgc2FtZSBrZXkgKGhlcmUgdGhlIGVsIGV4cHJlc3Npb24gI3tlbnRyeS5wcm9wZXJ0eX0pCi0gICAgLy9ob3dldmVyLCBkb24ndCBvdmVycmlkZSB0aGUgcHJldmlvdXMgZW50cnkgLSB0aGV5IGFybid0IHRoZSBzYW1lOwotICAgIHByaXZhdGUgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4gZnVydGhlckVudHJpZXM7Ci0gICAgLy9qdXN0IGZvciBpbnB1dCBjb21wb25lbnRzIHdpdGhpbiBjb21wbGV4IGNvbXBvbmVudHMgZS5nLiBkYXRhVGFibGUsLi4uCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50SWQ7Ci0KLSAgICAvKgotICAgICAqIGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmVhbigpCi0gICAgewotICAgICAgICByZXR1cm4gYmVhbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCZWFuKE9iamVjdCBiZWFuKQotICAgIHsKLSAgICAgICAgdGhpcy5iZWFuID0gYmVhbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZWRWYWx1ZShPYmplY3QgY29udmVydGVkVmFsdWUpCi0gICAgewotICAgICAgICB0aGlzLmNvbnZlcnRlZFZhbHVlID0gY29udmVydGVkVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFVJQ29tcG9uZW50IGdldENvbXBvbmVudCgpCi0gICAgewotICAgICAgICByZXR1cm4gY29tcG9uZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudChVSUNvbXBvbmVudCBjb21wb25lbnQpCi0gICAgewotICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudElkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjbGllbnRJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGllbnRJZChTdHJpbmcgY2xpZW50SWQpCi0gICAgewotICAgICAgICB0aGlzLmNsaWVudElkID0gY2xpZW50SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk+IGdldEZ1cnRoZXJFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmdXJ0aGVyRW50cmllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGdXJ0aGVyRW50cmllcyhMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5PiBmdXJ0aGVyRW50cmllcykKLSAgICB7Ci0gICAgICAgIHRoaXMuZnVydGhlckVudHJpZXMgPSBmdXJ0aGVyRW50cmllczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvbWFwcGVyL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvbWFwcGVyL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZWJmM2IuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL21hcHBlci9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhrZXkpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL21hcHBlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvbWFwcGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY5NGQxMC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvbWFwcGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhrZXkpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q29tcGFyZVN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMDIwMmIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneTxBIGV4dGVuZHMgQW5ub3RhdGlvbj4gZXh0ZW5kcyBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIExpc3Q8UmVmZXJlbmNpbmdTdHJhdGVneT4gcmVmZXJlbmNpbmdTdHJhdGVnaWVzOw0KLSAgICBwcm90ZWN0ZWQgTWFwPE9iamVjdCwgT2JqZWN0PiB2aW9sYXRpb25SZXN1bHRTdG9yYWdlID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIGluaXRSZWZlcmVuY2luZ1N0cmF0ZWdpZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UmVmZXJlbmNpbmdTdHJhdGVnaWVzKCkNCi0gICAgew0KLSAgICAgICAgaWYgKHJlZmVyZW5jaW5nU3RyYXRlZ2llcyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcyA9IG5ldyBBcnJheUxpc3Q8UmVmZXJlbmNpbmdTdHJhdGVneT4oKTsNCi0NCi0gICAgICAgICAgICBTdHJpbmcgY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneUNsYXNzTmFtZSA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQkFTRV9QQUNLQUdFKSArICJSZWZlcmVuY2luZ1N0cmF0ZWd5IjsNCi0NCi0gICAgICAgICAgICBSZWZlcmVuY2luZ1N0cmF0ZWd5IGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kgPSAoUmVmZXJlbmNpbmdTdHJhdGVneSkgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneUNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IEVMQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgICAgIC8vcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgQWxpYXNDb21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgTG9jYWxDb21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9pbml0Q3Jvc3NWYWxpZGF0aW9uIGlzIGRvbmUgaW4gdGhlIENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXINCi0NCi0gICAgICAgIFN0cmluZ1tdIHZhbGlkYXRpb25UYXJnZXRzID0gZ2V0VmFsaWRhdGlvblRhcmdldHMoKEEpDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQgOiB2YWxpZGF0aW9uVGFyZ2V0cykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0ID0gdmFsaWRhdGlvblRhcmdldC50cmltKCk7DQotDQotICAgICAgICAgICAgLy9zZWxlY3QgdmFsaWRhdGlvbiBtZXRob2QNCi0gICAgICAgICAgICB0cnlUb1ZhbGlkYXRlKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwgdmFsaWRhdGlvblRhcmdldCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIHRyeVRvVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQpDQotICAgIHsNCi0gICAgICAgIGZvciAoUmVmZXJlbmNpbmdTdHJhdGVneSByZWZlcmVuY2luZ1N0cmF0ZWd5IDogcmVmZXJlbmNpbmdTdHJhdGVnaWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChyZWZlcmVuY2luZ1N0cmF0ZWd5LmV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsIHZhbGlkYXRpb25UYXJnZXQsIHRoaXMpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVGhyb3dhYmxlSW5zdGFuY2VOZXZlclRocm93biJ9KQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UsDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZUYXJnZXQpDQotICAgIHsNCi0gICAgICAgIGlmICghaGFuZGxlVGFyZ2V0VmlvbGF0aW9uKGVudHJ5T2ZTb3VyY2UsIGVudHJ5T2ZUYXJnZXQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vbm8gdGFyZ2V0IC0gYmVjYXVzZSB0aGVyZSBpcyBubyB0YXJnZXQgY29tcG9uZW50IC0gdmFsdWUgd2FzIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBtb2RlbA0KLSAgICAgICAgICAgIGlmKGVudHJ5T2ZUYXJnZXQgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NUYXJnZXRDb21wb25lbnRBc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGVudHJ5T2ZTb3VyY2UpOw0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vZ2V0IHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSB0YXJnZXQgY29tcG9uZW50DQotICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldEVycm9yTWVzc2FnZVN1bW1hcnkoKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSwgdHJ1ZSk7DQotICAgICAgICBTdHJpbmcgZGV0YWlscyA9IGdldEVycm9yTWVzc2FnZURldGFpbCgoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpLCB0cnVlKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGlvbiB0YXJnZXQgaXNuJ3QgYm91bmQgdG8gYSBjb21wb25lbnQgd2l0aGluZyB0aGUgY3VycmVudCBwYWdlIA0KLSAgICAgICAgLy8oc2VlIHZhbGlkYXRlRm91bmRFbnRyeSwgdHJ5VG9WYWxpZGF0ZUxvY2FsbHkgYW5kIHRyeVRvVmFsaWRhdGVCaW5kaW5nT25seSkNCi0gICAgICAgIGlmIChlbnRyeU9mVGFyZ2V0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZW50cnlPZlRhcmdldCA9IGVudHJ5T2ZTb3VyY2U7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZTsNCi0gICAgICAgIGlmIChlbnRyeU9mVGFyZ2V0LmdldE1ldGFEYXRhRW50cnkoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1lc3NhZ2UgPSBnZXRUYXJnZXRDb21wb25lbnRFcnJvck1lc3NhZ2UoKEEpZW50cnlPZlRhcmdldC5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9UT0RPIGRvY3VtZW50IHBvc3NpYmxlIHNpZGUgZWZmZWN0cw0KLSAgICAgICAgICAgIC8vZHVlIHRvIGEgbWlzc2luZyB0YXJnZXQgYW5ub3RhdGlvbiAoc2VlOiB0cnlUb1ZhbGlkYXRlTG9jYWxseSkNCi0gICAgICAgICAgICBtZXNzYWdlID0gZ2V0VGFyZ2V0Q29tcG9uZW50RXJyb3JNZXNzYWdlKChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCksIHN1bW1hcnksIGRldGFpbHMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKChtZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsIHx8IG1lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkgJiYNCi0gICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldENsaWVudElkKCkgIT0gbnVsbCAmJiAhZW50cnlPZlNvdXJjZS5nZXRDbGllbnRJZCgpLmVxdWFscyhlbnRyeU9mVGFyZ2V0LmdldENsaWVudElkKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24gPSBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG1lc3NhZ2UpOw0KLQ0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNTb3VyY2VNZXRhRGF0YVVzZWQgPSBmYWxzZTsNCi0NCi0gICAgICAgICAgICBpZihlbnRyeU9mVGFyZ2V0LmdldE1ldGFEYXRhRW50cnkoKSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJlcGFyZVRhcmdldE1ldGFEYXRhRm9yU2V2ZXJpdHlBd2FyZUludGVyY2VwdGlvbihlbnRyeU9mU291cmNlLCBlbnRyeU9mVGFyZ2V0KTsNCi0gICAgICAgICAgICAgICAgaXNTb3VyY2VNZXRhRGF0YVVzZWQgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBpZihFeHRWYWxVdGlscy5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5T2ZUYXJnZXQuZ2V0Q29tcG9uZW50KCksIGVudHJ5T2ZUYXJnZXQuZ2V0TWV0YURhdGFFbnRyeSgpLA0KLSAgICAgICAgICAgICAgICAgICAgZW50cnlPZlRhcmdldC5nZXRDb252ZXJ0ZWRPYmplY3QoKSwgdmFsaWRhdG9yRXhjZXB0aW9uLCB0aGlzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudElkKGVudHJ5T2ZUYXJnZXQuZ2V0Q2xpZW50SWQoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb252ZXJ0RmFjZXNNZXNzYWdlKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZihpc1NvdXJjZU1ldGFEYXRhVXNlZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc2V0VGFyZ2V0TWV0YURhdGEoZW50cnlPZlRhcmdldCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcmVwYXJlVGFyZ2V0TWV0YURhdGFGb3JTZXZlcml0eUF3YXJlSW50ZXJjZXB0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlLCBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlRhcmdldCkNCi0gICAgew0KLSAgICAgICAgZW50cnlPZlRhcmdldC5zZXRNZXRhRGF0YUVudHJ5KGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRUYXJnZXRNZXRhRGF0YShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlRhcmdldCkNCi0gICAgew0KLSAgICAgICAgZW50cnlPZlRhcmdldC5zZXRNZXRhRGF0YUVudHJ5KG51bGwpOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVGhyb3dhYmxlSW5zdGFuY2VOZXZlclRocm93biJ9KQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1RhcmdldENvbXBvbmVudEFzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UpDQotICAgIHsNCi0gICAgICAgIC8vZ2V0IHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgICAgU3RyaW5nIHN1bW1hcnkgPSBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeSgoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpKTsNCi0gICAgICAgIFN0cmluZyBkZXRhaWxzID0gZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbCgoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlID0gZ2V0U291cmNlQ29tcG9uZW50RXJyb3JNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICAoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpLCBzdW1tYXJ5LCBkZXRhaWxzKTsNCi0NCi0gICAgICAgIGlmIChtZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsIHx8IG1lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8NCi0gICAgICAgICAgICBpZihFeHRWYWxVdGlscy5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycyhlbnRyeU9mU291cmNlLmdldENvbXBvbmVudCgpLA0KLSAgICAgICAgICAgICAgICAgICAgZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCksDQotICAgICAgICAgICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihtZXNzYWdlKSwNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudChlbnRyeU9mU291cmNlLmdldENvbXBvbmVudCgpLCBtZXNzYWdlLCBudWxsKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9UT0RPIGxvZ2dpbmcNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UpDQotICAgIHsNCi0gICAgICAgIGlmIChoYW5kbGVTb3VyY2VWaW9sYXRpb24oZW50cnlPZlNvdXJjZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9nZXQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAgICAgICAgU3RyaW5nIHN1bW1hcnkgPSBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCksIGZhbHNlKTsNCi0gICAgICAgICAgICBTdHJpbmcgZGV0YWlscyA9IGdldEVycm9yTWVzc2FnZURldGFpbCgoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpLCBmYWxzZSk7DQotDQotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIG1lc3NhZ2UgPSBnZXRTb3VyY2VDb21wb25lbnRFcnJvck1lc3NhZ2UoDQotICAgICAgICAgICAgICAgIChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCksIHN1bW1hcnksIGRldGFpbHMpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsIHx8IG1lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vVE9ETw0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50KGVudHJ5T2ZTb3VyY2UuZ2V0Q29tcG9uZW50KCksIG1lc3NhZ2UsIG51bGwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vanVzdCB0aHJvdyBhIG5ldyBtZXNzYWdlIC0gdGhlIGVycm9yIG1lc3NhZ2UgaXMgYXQgdGhlIHRhcmdldA0KLSAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudCgNCi0gICAgICAgICAgICAgICAgZW50cnlPZlNvdXJjZS5nZXRDb21wb25lbnQoKSwgbmV3IEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsIG51bGwsIG51bGwpLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgRmFjZXNNZXNzYWdlIGdldFNvdXJjZUNvbXBvbmVudEVycm9yTWVzc2FnZShBIGFubm90YXRpb24sIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEZhY2VzTWVzc2FnZSBnZXRUYXJnZXRDb21wb25lbnRFcnJvck1lc3NhZ2UoQSBmb3VuZEFubm90YXRpb24sIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KEEgYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHJlc29sdmVNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKEEgYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgU3RyaW5nIGtleSA9IGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgICAgICAgICAgcmV0dXJuIChrZXkgIT0gbnVsbCkgPyByZXNvbHZlTWVzc2FnZShrZXkgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCkgOiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBrZXkgIiArIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleSgoQSlhbm5vdGF0aW9uLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlVGFyZ2V0VmlvbGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlLA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW50cnlPZlRhcmdldCAhPSBudWxsICYmIGVudHJ5T2ZUYXJnZXQuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVTb3VyY2VWaW9sYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBoYW5kbGVUYXJnZXRWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBubyB0YXJnZXQgY29tcG9uZW50ICh2YWxpZGF0aW9uIGFnYWluc3QgdGhlIG1vZGVsKSAtPiBnZXQgcmV2ZXJzZSBtZXNzYWdlIGZvciBzb3VyY2UgY29tcG9uZW50DQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KEEgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgLy9pZiB0aGUgbWVzc2FnZSBpcyBuZXV0cmFsDQotICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uLCB0cnVlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBubyB0YXJnZXQgY29tcG9uZW50ICh2YWxpZGF0aW9uIGFnYWluc3QgdGhlIG1vZGVsKSAtPiBnZXQgcmV2ZXJzZSBtZXNzYWdlIGZvciBzb3VyY2UgY29tcG9uZW50DQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwoQSBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICAvL2lmIHRoZSBtZXNzYWdlIGlzIG5ldXRyYWwNCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbiwgdHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogYWJzdHJhY3QgbWV0aG9kcw0KLSAgICAgKi8NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQSBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0NCi0gICAgLyoNCi0gICAgICogaW1wbGVtZW50cyB0aGUgc3BlY2lmaWMgdmFsaWRhdGlvbiBsb2dpYw0KLSAgICAgKi8NCi0NCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLCBBIGFubm90YXRpb24pOw0KLQ0KLSAgICAvKg0KLSAgICAgKiByZXR1cm5zIHRoZSByZWZlcmVuY2VkIHZhbGlkYXRpb24gdGFyZ2V0cyBvZiB0aGUgYW5ub3RhdGlvbg0KLSAgICAgKiBlLmcuIEBEYXRlSXModHlwZSA9IERhdGVJc1R5cGUuYmVmb3JlLCB2YWx1ZSA9ICJmaW5hbEV4YW0iKQ0KLSAgICAgKiAtPiBtZXRob2QgcmV0dXJucyBhbiBhcnJheSB3aXRoIG9uZSB2YWx1ZSAoImZpbmFsRXhhbSIpDQotICAgICAqLw0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQSBhbm5vdGF0aW9uKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUzNzYxMi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgLy9pbml0IGNyb3NzLXZhbGlkYXRpb24NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA9DQotICAgICAgICAgICAgZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkuYWRkKGVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA9IG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoKTsNCi0NCi0gICAgICAgIGVudHJ5LnNldE1ldGFEYXRhRW50cnkobWV0YURhdGFFbnRyeSk7DQotICAgICAgICBlbnRyeS5zZXRDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgZW50cnkuc2V0Q2xpZW50SWQodWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIGVudHJ5LnNldFZhbGlkYXRpb25TdHJhdGVneSh0aGlzKTsNCi0NCi0gICAgICAgIHJldHVybiBlbnRyeTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgYXZhaWxhYmxlIGZvciBjcm9zcyB2YWxpZGF0aW9uIC0gdXNlIHByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IGF2YWlsYWJsZSBmb3IgY3Jvc3MgdmFsaWRhdGlvbiIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0VmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICAvL25vdCBhdmFpbGFibGUgZm9yIGNyb3NzIHZhbGlkYXRpb24gLSB1c2UgaW5pdENyb3NzVmFsaWRhdGlvbg0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDcm9zc1ZhbGlkYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICAvL292ZXJyaWRlIGlmIG5lZWRlZA0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLCB2YWxpZGF0b3JFeGNlcHRpb24sIHRoaXMpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uSGVscGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2Q0NzZlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5LA0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNNb2RlbEF3YXJlVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGNvbXBhcmVTdHJhdGVneS5pc1Zpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9wcm9jZXNzIGFmdGVyIHZpb2xhdGlvbg0KLSAgICAgICAgICAgIC8vanVzdCBhZGQgbWVzc2FnZXMNCi0gICAgICAgICAgICBpZighaXNNb2RlbEF3YXJlVmFsaWRhdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NUYXJnZXRBZnRlckNyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1RhcmdldEFmdGVyTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vdGhvdyBleGNlcHRpb24NCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzVGFyZ2V0QWZ0ZXJDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5ID0gbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgpOw0KLQ0KLSAgICAgICAgaWYgKGNvbXBhcmVTdHJhdGVneS51c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb21wb25lbnQodmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q2xpZW50SWQodmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENsaWVudElkKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb21wb25lbnQoc291cmNlQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q2xpZW50SWQoc291cmNlQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENsaWVudElkKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbnZlcnRlZE9iamVjdCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSk7DQotICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0VmFsaWRhdGlvblN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSk7DQotDQotICAgICAgICAvL2FkZCBtZXNzYWdlDQotICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICBzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzVGFyZ2V0QWZ0ZXJNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICAvL25vIHRhcmdldCAtIGJlY2F1c2UgdGhlcmUgaXMgbm8gdGFyZ2V0IGNvbXBvbmVudCAtIHZhbHVlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbW9kZWwNCi0gICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBudWxsKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMjdkYTUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICB2b2lkIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpDQotICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGFmYzhmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRGF0ZUlzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRGF0ZUlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXNUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEYXRlSXNTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5PERhdGVJcz4NCi17DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT19FQVJMWSA9ICJlYXJseSI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT19MQVRFID0gImxhdGUiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRVFVQUxfREFURV9USU1FID0gIm5vdCBlcXVhbCI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVkgPSAicmVzdWx0IjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFSRURfVkFMVUVfS0VZID0gInRhcmdldCB2YWx1ZSI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVkVSU0VfQ09NUEFSRURfVkFMVUVfS0VZID0gInJldmVyc2UgdGFyZ2V0IHZhbHVlIjsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIC8vVE9ETyB0ZXN0ICYgcmVtb3ZlDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVTb3VyY2VWaW9sYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHZpb2xhdGlvbkZvdW5kOw0KLQ0KLSAgICAgICAgaWYgKGFubm90YXRpb24udHlwZSgpLmVxdWFscyhEYXRlSXNUeXBlLnNhbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsICYmICFvYmplY3QxLmVxdWFscyhvYmplY3QyKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFU1VMVF9LRVksIE5PVF9FUVVBTF9EQVRFX1RJTUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24udHlwZSgpLmVxdWFscyhEYXRlSXNUeXBlLmJlZm9yZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSBvYmplY3QxICE9IG51bGwgJiYgb2JqZWN0MiAhPSBudWxsICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICghbmV3IERhdGUoKChEYXRlKSBvYmplY3QxKS5nZXRUaW1lKCkpLmJlZm9yZSgoRGF0ZSkgb2JqZWN0MikgfHwgb2JqZWN0MS5lcXVhbHMob2JqZWN0MikpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVTVUxUX0tFWSwgVE9PX0xBVEUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IG9iamVjdDEgIT0gbnVsbCAmJiBvYmplY3QyICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFuZXcgRGF0ZSgoKERhdGUpIG9iamVjdDEpLmdldFRpbWUoKSkuYWZ0ZXIoKERhdGUpIG9iamVjdDIpIHx8IG9iamVjdDEuZXF1YWxzKG9iamVjdDIpKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFU1VMVF9LRVksIFRPT19FQVJMWSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoQ09NUEFSRURfVkFMVUVfS0VZLCBvYmplY3QxKTsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFVkVSU0VfQ09NUEFSRURfVkFMVUVfS0VZLCBvYmplY3QyKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB2aW9sYXRpb25Gb3VuZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbHVlT2YoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBwcm90ZWN0ZWQNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KERhdGVJcyBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZykgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLmdldChSRVNVTFRfS0VZKTsNCi0NCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gcmV2ZXJzZVJlc3VsdChyZXN1bHQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKFRPT19FQVJMWS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0Tm90QWZ0ZXJFcnJvck1zZ0tleShhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKFRPT19MQVRFLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROb3RCZWZvcmVFcnJvck1zZ0tleShhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0Tm90RXF1YWxFcnJvck1zZ0tleShhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyByZXZlcnNlUmVzdWx0KFN0cmluZyByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIGlmIChUT09fRUFSTFkuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIFRPT19MQVRFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBUT09fRUFSTFk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShEYXRlSXMgYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCksIGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoRGF0ZUlzIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgICAgICB9DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgZmFsc2UpLCBhbm5vdGF0aW9uLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbChEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgZmFsc2UpDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBhbm5vdGF0aW9uLCBmYWxzZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZShTdHJpbmcga2V5LCBEYXRlSXMgYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSByZXNvbHZlTWVzc2FnZShrZXkpOw0KLQ0KLSAgICAgICAgRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoYW5ub3RhdGlvbi5lcnJvck1lc3NhZ2VEYXRlU3R5bGUoKSwNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKSk7DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0Ow0KLQ0KLSAgICAgICAgaWYoaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQuZm9ybWF0KChEYXRlKSB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UuZ2V0KENPTVBBUkVEX1ZBTFVFX0tFWSkpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBtZXNzYWdlLnJlcGxhY2UoInswfSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdC5mb3JtYXQoKERhdGUpIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5nZXQoUkVWRVJTRV9DT01QQVJFRF9WQUxVRV9LRVkpKSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL3JlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIG90aGVyIGNvbXBvbmVudA0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBwcml2YXRlDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBnZXROb3RBZnRlckVycm9yTXNnS2V5KERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uLm5vdEFmdGVyRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5vdEJlZm9yZUVycm9yTXNnS2V5KERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uLm5vdEJlZm9yZUVycm9yTXNnS2V5KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXROb3RFcXVhbEVycm9yTXNnS2V5KERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uLm5vdEVxdWFsRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRUxDb21wYXJlU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRUxDb21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5MTFkNS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VMQ29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIHJlZmVyZW5jaW5nIHZhbGlkYXRpb24gdGFyZ2V0cyAtIHBvc3NpYmxlIGZvcm1hdHM6DQotICogIiN7W2JlYW5fbmFtZV0uW3Byb3BlcnR5X25hbWVdfSIgLi4uIGNyb3NzLWVudGl0eSB2YWxpZGF0aW9uIHdpdGggdmFsdWUgYmluZGluZw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBFTENvbXBhcmVTdHJhdGVneSBpbXBsZW1lbnRzIFJlZmVyZW5jaW5nU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYgKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKHZhbGlkYXRpb25UYXJnZXQpICYmDQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVZhbGlkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgdmFsaWRhdGlvblRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9WYWxpZGF0ZVZhbHVlQmluZGluZygNCi0gICAgICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbGlkYXRpb25UYXJnZXQpLCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLCBjb21wYXJlU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ0ZXN0IikNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZVZhbHVlQmluZGluZygNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkgPQ0KLSAgICAgICAgICAgICAgICByZXNvbHZlVGFyZ2V0Rm9yQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldCk7DQotDQotICAgICAgICBpZih2YWxpZGF0aW9uVGFyZ2V0RW50cnkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgcmVzb2x2ZVRhcmdldEZvckNyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsaWRhdGlvblRhcmdldCkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSA9DQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgcmV0dXJuIENyb3NzVmFsaWRhdGlvblV0aWxzLnJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgICAgIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuY29udmVydFZhbHVlQmluZGluZ0V4cHJlc3Npb25Ub1Byb2Nlc3NlZEluZm9ybWF0aW9uS2V5KHZhbGlkYXRpb25UYXJnZXQpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSkNCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWxpZGF0aW9uVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgT2JqZWN0IHRhcmdldFZhbHVlID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRWYWx1ZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsIHZhbGlkYXRpb25UYXJnZXQpOw0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdGFyZ2V0RW50cnkgPSBuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkoKTsNCi0gICAgICAgIHRhcmdldEVudHJ5LnNldEJlYW4oDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWxpZGF0aW9uVGFyZ2V0LmdldEJhc2VFeHByZXNzaW9uKCkpKTsNCi0gICAgICAgIHRhcmdldEVudHJ5LnNldENvbnZlcnRlZFZhbHVlKHRhcmdldFZhbHVlKTsNCi0NCi0gICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneShjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0RW50cnksIHRydWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkYjNmNS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VxdWFsc1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLk51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEVxdWFsc1N0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKEVxdWFscykgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLCBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBvYmplY3QxICE9IG51bGwgJiYgIW9iamVjdDEuZXF1YWxzKG9iamVjdDIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKEVxdWFscykgYW5ub3RhdGlvbikudmFsdWUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NTJmM2MuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbENvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLQ0KLS8qKg0KLSAqICJbcHJvcGVydHlfbmFtZV0iIC4uLiBsb2NhbCB2YWxpZGF0aW9uIC0+IGNyb3NzLWNvbXBvbmVudCwgYnV0IG5vIGNyb3NzLWVudGl0eSB2YWxpZGF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIExvY2FsQ29tcGFyZVN0cmF0ZWd5IGltcGxlbWVudHMgUmVmZXJlbmNpbmdTdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZih2YWxpZGF0aW9uVGFyZ2V0LmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kgd2lsbCBjb250aW51ZQ0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnlUb1ZhbGlkYXRlTG9jYWxseSgNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZUxvY2FsbHkoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSwNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgPQ0KLSAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UoKTsNCi0NCi0gICAgICAgIGJvb2xlYW4gaXNNb2RlbEF3YXJlVmFsaWRhdGlvbiA9DQotICAgICAgICAgICAgICAgIGlzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSwgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldEtleTsNCi0NCi0gICAgICAgIFN0cmluZyBzb3VyY2VLZXkgPSByZXNvbHZlU291cmNlS2V5KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICB0YXJnZXRLZXkgPSBzb3VyY2VLZXkuc3Vic3RyaW5nKDAsIHNvdXJjZUtleS5sYXN0SW5kZXhPZigiLiIpICsgMSkgKyB0YXJnZXRLZXk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkgPSBDcm9zc1ZhbGlkYXRpb25VdGlscy5yZXNvbHZlVmFsaWRhdGlvblRhcmdldEVudHJ5KA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UsIHRhcmdldEtleSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0NCi0gICAgICAgIGlmICh2YWxpZGF0aW9uVGFyZ2V0RW50cnkgIT0gbnVsbCAmJiB2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCAmJiAhaXNNb2RlbEF3YXJlVmFsaWRhdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9ubyB0YXJnZXQgLSBiZWNhdXNlIHRoZXJlIGlzIG5vIHRhcmdldCBjb21wb25lbnQgLSB2YWx1ZSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1vZGVsDQotICAgICAgICBlbHNlIGlmKGlzTW9kZWxBd2FyZVZhbGlkYXRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldFByb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB1bnN1cHBvcnRlZENhc2UoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlVGFyZ2V0S2V5KENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFN0cmluZyB0YXJnZXRLZXkpDQotICAgIHsNCi0gICAgICAgIC8vbm8gcmVhbCB2YWx1ZSBiaW5kaW5nIGV4cHJlc3Npb24NCi0gICAgICAgIC8vVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBqdXN0IGhlcGxzIHRvIHJlcGxhY2UgdGhlIHByb3BlcnR5IG9mIHRoZSBrZXkNCi0gICAgICAgIC8vaGVyZSBvbmx5IGRvdC1ub3RhdGlvbiBpcyBhbGxvd2VkIC0+IG5vIHByb2JsZW0NCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYmFzZUV4cHJlc3Npb24gPQ0KLSAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIjeyIgKyBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLA0KLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZXRhaWxzLmNsYXNzKS5nZXRLZXkoKSArICJ9Iik7DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlT3JBZGRQcm9wZXJ0eShiYXNlRXhwcmVzc2lvbiwgdGFyZ2V0S2V5KQ0KLSAgICAgICAgICAgIC5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0LnN1YnN0cmluZygyLCByZXN1bHQubGVuZ3RoKCkgLTEpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWVPZlByb3BlcnR5KE9iamVjdCBiYXNlLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHByb3BlcnR5ID0gcHJvcGVydHkuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSArIHByb3BlcnR5LnN1YnN0cmluZygxLCBwcm9wZXJ0eS5sZW5ndGgoKSk7DQotICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoYmFzZS5nZXRDbGFzcygpKTsNCi0gICAgICAgIE1ldGhvZCB0YXJnZXRNZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodGFyZ2V0Q2xhc3MsICJnZXQiICsgcHJvcGVydHkpOw0KLQ0KLSAgICAgICAgaWYodGFyZ2V0TWV0aG9kID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHRhcmdldENsYXNzLCAiaXMiICsgcHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYodGFyZ2V0TWV0aG9kID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgImNsYXNzICIgKyBiYXNlLmdldENsYXNzKCkgKyAiIGhhcyBubyBwdWJsaWMgZ2V0L2lzICIgKyBwcm9wZXJ0eS50b0xvd2VyQ2FzZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoYmFzZSwgdGFyZ2V0TWV0aG9kKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZywNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0S2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbmV3S2V5ID0gY3JlYXRlVGFyZ2V0S2V5KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIHJldHVybiAha2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLmNvbnRhaW5zRW50cnkobmV3S2V5KTsNCi0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyByZXNvbHZlU291cmNlS2V5KENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUtleSA9IHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKTsNCi0NCi0gICAgICAgIGlmKCFzb3VyY2VLZXkuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzb3VyY2UgcGF0aDogIiArIHNvdXJjZUtleSArICIgaW52YWxpZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHNvdXJjZUtleTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdW5zdXBwb3J0ZWRDYXNlKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQgY29udmVydGVkIG9iamVjdCBmb3IgIiArICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcykuZ2V0S2V5KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSkNCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB0YXJnZXRFbnRyeSA9IG5ldyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSgpOw0KLQ0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0QmVhbigNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpLmdldEJhc2VPYmplY3QoKSk7DQotICAgICAgICB0YXJnZXRFbnRyeQ0KLSAgICAgICAgICAgICAgICAuc2V0Q29udmVydGVkVmFsdWUoZ2V0VmFsdWVPZlByb3BlcnR5KHRhcmdldEVudHJ5LmdldEJlYW4oKSwgdGFyZ2V0UHJvcGVydHkpKTsNCi0NCi0gICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneShjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0RW50cnksIHRydWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGVjNjFmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiAiW2xvY2FsX3Byb3BlcnR5LnByb3BlcnR5MS5wcm9wZXJ0eTJdIg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBMb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kgZXh0ZW5kcyBMb2NhbENvbXBhcmVTdHJhdGVneQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYoIXZhbGlkYXRpb25UYXJnZXQuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL25vdCBzdXBwb3J0ZWQgLSBUT0RPIGFkZCBsb2dnaW5nDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZUxvY2FsbHkoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0S2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgPQ0KLSAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UoKTsNCi0NCi0gICAgICAgIFN0cmluZyBuZXdLZXkgPSBjcmVhdGVUYXJnZXRLZXkoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgaWYgKHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jb250YWluc0VudHJ5KG5ld0tleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5ID0gcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmdldEVudHJ5KG5ld0tleSk7DQotDQotICAgICAgICAgICAgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vbm8gdGFyZ2V0IC0gYmVjYXVzZSB0aGVyZSBpcyBubyB0YXJnZXQgY29tcG9uZW50IC0gdmFsdWUgd2FzIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBtb2RlbA0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRLZXkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdGFyZ2V0SW5mb3JtYXRpb25FbnRyeSkNCi0gICAgew0KLSAgICAgICAgaWYgKGNvbXBhcmVTdHJhdGVneS5pc1Zpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICB0YXJnZXRJbmZvcm1hdGlvbkVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCksDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgPSBuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KCk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbXBvbmVudChjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDbGllbnRJZCh0YXJnZXRJbmZvcm1hdGlvbkVudHJ5LmdldENsaWVudElkKCkpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb252ZXJ0ZWRPYmplY3QodGFyZ2V0SW5mb3JtYXRpb25FbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpKTsNCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0VmFsaWRhdGlvblN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSk7DQotDQotICAgICAgICAgICAgLy9wcm9jZXNzIGFmdGVyIHZpb2xhdGlvbg0KLSAgICAgICAgICAgIC8vanVzdCBhZGQgbWVzc2FnZXMNCi0gICAgICAgICAgICBpZihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgbnVsbCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vdGhvdyBleGNlcHRpb24NCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBTdHJpbmcgdGFyZ2V0S2V5KQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgT2JqZWN0IG5ld0Jhc2UgPSBSZWZsZWN0aW9uVXRpbHMNCi0gICAgICAgICAgICAuZ2V0QmFzZU9mUHJvcGVydHlDaGFpbihwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgaWYodGFyZ2V0S2V5LmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9maW5kIHRoZSBsYXN0IHByb3BlcnR5DQotICAgICAgICAgICAgdGFyZ2V0S2V5ID0gdGFyZ2V0S2V5LnN1YnN0cmluZyh0YXJnZXRLZXkubGFzdEluZGV4T2YoIi4iKSArIDEsIHRhcmdldEtleS5sZW5ndGgoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBPYmplY3QgdGFyZ2V0VmFsdWUgPSBnZXRWYWx1ZU9mUHJvcGVydHkobmV3QmFzZSwgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHRhcmdldEVudHJ5ID0gbmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5KCk7DQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRCZWFuKG5ld0Jhc2UpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0Q29udmVydGVkVmFsdWUodGFyZ2V0VmFsdWUpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRFbnRyeSwgdHJ1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Ob3RFcXVhbHNTdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Ob3RFcXVhbHNTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTA5ZTg0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uTm90RXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLk51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIE5vdEVxdWFsc1N0cmF0ZWd5IGV4dGVuZHMgRXF1YWxzU3RyYXRlZ3kNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKE5vdEVxdWFscykgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwNCi0gICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAhc3VwZXIuaXNWaW9sYXRpb24ob2JqZWN0MSwgb2JqZWN0MiwgYW5ub3RhdGlvbik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKE5vdEVxdWFscykgYW5ub3RhdGlvbikudmFsdWUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlZmVyZW5jaW5nU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVmZXJlbmNpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTU2NGEyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVmZXJlbmNpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJbnRlcm5hbCBpbnRlcmZhY2UgdG8gYWxsb3cgbXVsdGlwbGUgcmVmZXJlbmNpbmcgc3RyYXRlZ2llcyBmb3IgY3Jvc3MgY29tcG9uZW50IHZhbGlkYXRpb24uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWludGVyZmFjZSBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgYWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlcXVpcmVkSWZTdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg3NTBiMy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlcXVpcmVkSWZTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLk51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBOdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBFbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZElmU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneTxSZXF1aXJlZElmPg0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUZhY2VzQnVuZGxlID0gZmFsc2U7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHN1cGVyLnJlc29sdmVNZXNzYWdlKGtleSk7DQotICAgICAgICBTdHJpbmcgbWFya2VyID0gQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVI7DQotDQotICAgICAgICBpZigobWFya2VyICsga2V5ICsgbWFya2VyKS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnVzZUZhY2VzQnVuZGxlID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoUmVxdWlyZWRJZiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgc291cmNlLCBPYmplY3QgdGFyZ2V0LCBSZXF1aXJlZElmIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gdmlvbGF0aW9uRm91bmQgPSBmYWxzZTsNCi0NCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLmlzKCkuZXF1YWxzKFJlcXVpcmVkSWZUeXBlLmVtcHR5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IChpc1RhcmdldEVtcHR5KHRhcmdldCkgfHwgQm9vbGVhbi5GQUxTRS5lcXVhbHModGFyZ2V0KSkgJiYgaXNTb3VyY2VFbXB0eShzb3VyY2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbi5pcygpLmVxdWFscyhSZXF1aXJlZElmVHlwZS5ub3RfZW1wdHkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gKGlzVGFyZ2V0Tm90RW1wdHkodGFyZ2V0KSAmJiBpc1NvdXJjZUVtcHR5KHNvdXJjZSkgJiYgISh0YXJnZXQgaW5zdGFuY2VvZiBCb29sZWFuKSkgfHwNCi0gICAgICAgICAgICAgICAgICAgIChCb29sZWFuLlRSVUUuZXF1YWxzKHRhcmdldCkgJiYgaXNTb3VyY2VFbXB0eShzb3VyY2UpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB2aW9sYXRpb25Gb3VuZDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNUYXJnZXRFbXB0eShPYmplY3QgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGFyZ2V0ID09IG51bGwgfHwgdGFyZ2V0LmVxdWFscygiIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU291cmNlRW1wdHkoT2JqZWN0IHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHNvdXJjZSA9PSBudWxsIHx8IHNvdXJjZS5lcXVhbHMoIiIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1RhcmdldE5vdEVtcHR5KE9iamVjdCB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQgIT0gbnVsbCAmJiAhdGFyZ2V0LmVxdWFscygiIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKFJlcXVpcmVkSWYgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsdWVPZigpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZSh2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdG9yRXhjZXB0aW9uKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2pwYV9zdHJhdGVneV9tYXBwaW5ncy5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkOTkyOS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2pwYV9zdHJhdGVneV9tYXBwaW5ncy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbj1vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5KcGFWYWxpZGF0aW9uU3RyYXRlZ3kNCi1qYXZheC5wZXJzaXN0ZW5jZS5CYXNpYz1vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5KcGFWYWxpZGF0aW9uU3RyYXRlZ3kNCi1qYXZheC5wZXJzaXN0ZW5jZS5JZD1vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5KcGFWYWxpZGF0aW9uU3RyYXRlZ3kNCi1qYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZT1vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5KcGFWYWxpZGF0aW9uU3RyYXRlZ3kNCi1qYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmU9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlmODUyYS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBnZXRPckluaXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcywgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxVdGlscy5yZXNldFN0b3JhZ2UoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcywgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIGdldE9ySW5pdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKA0KLSAgICAgICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MsIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVzZXRTdG9yYWdlKFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jbGFzcywgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSByZXNvbHZlVmFsaWRhdGlvblRhcmdldEVudHJ5KA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSwgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSA9DQotICAgICAgICAgICAgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmdldEVudHJ5KHRhcmdldEtleSk7DQotDQotICAgICAgICAvL3ZhbHVlIG5vdCBzdWJtaXR0ZWQgYXQgdGhpcyByZXF1ZXN0IC0gdXNlIG1vZGVsIHZhbHVlICh2YWxpZGF0aW9uIGFnYWluc3QgdGhlIG1vZGVsKQ0KLSAgICAgICAgaWYocHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9zaW1wbGUgY2FzZQ0KLSAgICAgICAgaWYgKHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuZ2V0RnVydGhlckVudHJpZXMoKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBPYmplY3QgdGFyZ2V0QmVhbiA9IHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCk7DQotDQotICAgICAgICAvL3Byb2Nlc3MgY29tcGxleCBjb21wb25lbnQgZW50cmllcyAoZS5nLiBhIHRhYmxlKQ0KLSAgICAgICAgLy9zdXBwb3J0ZWQ6IGNyb3NzLWNvbXBvbmVudCBidXQgbm8gY3Jvc3MtZW50aXR5IHZhbGlkYXRpb24gKD0gbG9jYWxlIHZhbGlkYXRpb24pDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5nZXRCZWFuKCkuZXF1YWxzKHRhcmdldEJlYW4pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZm9yIChQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA6IHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuZ2V0RnVydGhlckVudHJpZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuZ2V0QmVhbigpLmVxdWFscyh0YXJnZXRCZWFuKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic3VwcG9ydCBmb3IgbWFwIHN5bnRheCIpDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uVG9Qcm9jZXNzZWRJbmZvcm1hdGlvbktleShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZiZS5nZXRFeHByZXNzaW9uU3RyaW5nKCkucmVwbGFjZSgiI3siLCAiIikucmVwbGFjZSgifSIsICIiKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuamF2YSBiL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Qcm9wZXJ0eVZhbGlkYXRpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjE5MjBjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Qcm9wZXJ0eVZhbGlkYXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFByb3BlcnR5VmFsaWRhdGlvblV0aWxzDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HR0VSID0gTG9nRmFjdG9yeS5nZXRMb2coUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuY2xhc3MpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZGF0aW9uU2tpcHBlZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgaWYoRXh0VmFsVXRpbHMuaXNTa2lwYWJsZVZhbGlkYXRpb25TdHJhdGVneSgNCi0gICAgICAgICAgICAgICAgUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQm9vbGVhbiBza2lwVmFsaWRhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoDQotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlNLSVBfVkFMSURBVElPTiwgQm9vbGVhbi5jbGFzcyk7DQotDQotICAgICAgICAgICAgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhza2lwVmFsaWRhdGlvbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihMT0dHRVIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgTE9HR0VSLnRyYWNlKCJ2YWxpZGF0aW9uIG9mICIgKyB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGNhbmNlbGVkIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZih2YWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGFuY2VvZiBTa2lwVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIG51bGwsIG1ldGFEYXRhRW50cnksIG51bGwpOw0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9fcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZjgyNWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgUHJvcGVydHkgVmFsaWRhdGlvbiBNb2R1bGUNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBQcm9wZXJ0eSBWYWxpZGF0aW9uIE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFByb3BlcnR5IFZhbGlkYXRpb24gcHJvdmlkZXMgYW5ub3RhdGlvbiBiYXNlZCB2YWxpZGF0aW9uIGZvciBiZWFuIHByb3BlcnRpZXMuDQotICAgIEl0IGFsc28gcHJvdmlkZXMgSlBBIDEuMCBiYXNlZCB2YWxpZGF0aW9uIFN1cHBvcnQuDQotICANCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEueCBhbmQgSlNGIDIueC4gQWxsIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9hc3NlbWJseS9wb20ueG1sIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9hc3NlbWJseS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDdiYmRjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvYXNzZW1ibHkvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYXNzZW1ibHkxMjwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEFzc2VtYmx5PC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5NeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEFzc2VtYmx5IGlzIHVzZWQgdG8gZ2VuZXJhdGUgCi0gICAgLnppcCBhbmQgLnRhci5neiBkaXN0cmlidXRpb25zIDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9hc3NlbWJseTwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2Fzc2VtYmx5PC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9hc3NlbWJseTwvdXJsPgotICAgIDwvc2NtPgotICAgIAotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRlcGVuZGVuY3ktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktamF2YWRvYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZW5lcmljLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2JlYW4tdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2phdmFkb2M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1zb3VyY2U8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjb3JlLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtiZWFuLXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zcmM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBFWEVDVVRFIG12biBwYWNrYWdlIHRvIGdlbmVyYXRlIGFzc2VtYmx5IGZpbGVzIC0tPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X3NyYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5teWZhY2VzLWV4dHZhbDEyLSR7dmVyc2lvbn0tc3JjPC9maW5hbE5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXR0YWNoZWQ8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X2JpbjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPiR7YmFzZWRpcn0vc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsMTItJHt2ZXJzaW9ufS1iaW48L2ZpbmFsTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtiZWFuLXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8IS0tIFNpbmNlIGV4dHZhbCBjb3VsZCBiZSBhc3luYyByZWxlYXNlZCwgYW4gZ2VuZXJhdGVkIGFzc2VtYmx5IGNvdWxkIGNvbnRhaW4gZGlmZmVyZW50Ci0gICAgICAgICBhcnRpZmFjdCB2ZXJzaW9ucyAtLT4KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGNvcmUudmVyc2lvbj4xLjIuMzwvY29yZS52ZXJzaW9uPgotICAgICAgICA8dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9uPjEuMi4zPC90cmluaWRhZC1zdXBwb3J0LnZlcnNpb24+Ci0gICAgICAgIDxnZW5lcmljLXN1cHBvcnQudmVyc2lvbj4xLjIuMzwvZ2VuZXJpYy1zdXBwb3J0LnZlcnNpb24+Ci0gICAgICAgIDxwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb24+MS4yLjM8L3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbj4KLSAgICAgICAgPGJlYW4tdmFsaWRhdGlvbi52ZXJzaW9uPjEuMi4zPC9iZWFuLXZhbGlkYXRpb24udmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmViaW4ueG1sIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2Nzk1Yi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmViaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+Y29yZWJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgIAk8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgIAk8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5SRUFETUUqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5MSUNFTlNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+Tk9USUNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+UkVMRUFTRSo8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L2phdmFkb2M8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+amF2YWRvYzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLmphcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTE4NmM2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08YXNzZW1ibHk+Ci0gIDxpZD5jb3Jlc3JjPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+ICAKLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgIAk8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgIAk8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5SRUFETUUqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5MSUNFTlNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+Tk9USUNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+UkVMRUFTRSo8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4gICAKLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3NyYzwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5zcmM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+Ci0gCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDViM2E1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBmMzYzYS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcgotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3BvbS54bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDVkYzdhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZTwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjIuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMi40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jZ2xpYjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNnbGliPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4xXzM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDYzZTYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj4NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5zdGFydHVwLkdlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXINCi0gICAgICAgIDwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyS2l0LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYmVkN2IuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyS2l0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLQ0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kSW50ZXJjZXB0b3I7DQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5FbmhhbmNlcjsNCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZFByb3h5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbEdlbmVyaWNSZW5kZXJLaXQgZXh0ZW5kcyBFeHRWYWxSZW5kZXJLaXQgaW1wbGVtZW50cyBNZXRob2RJbnRlcmNlcHRvcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBSZW5kZXJLaXQgbmV3SW5zdGFuY2UoUmVuZGVyS2l0IHJlbmRlcktpdCkNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gcmVuZGVyS2l0LmdldENsYXNzKCk7DQotDQotICAgICAgICAvL2l0J3Mgbm90IHBvc3NpYmxlIHRvIHdyYXAgdGhlIGNvbnZlcnRlciBhZ2FpbiAtIG9jY3VycyBlLmcuIHVuZGVyIHNvbGFyaXMgKyBiZWEgd2VibG9naWMNCi0gICAgICAgIGlmIChQcm94eVV0aWxzLmlzUHJveGllZENsYXNzKGN1cnJlbnRDbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcktpdDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEVuaGFuY2VyIGVuaGFuY2VyID0gbmV3IEVuaGFuY2VyKCk7DQotICAgICAgICBlbmhhbmNlci5zZXRTdXBlcmNsYXNzKHJlbmRlcktpdC5nZXRDbGFzcygpKTsNCi0gICAgICAgIGVuaGFuY2VyLnNldENhbGxiYWNrKG5ldyBFeHRWYWxHZW5lcmljUmVuZGVyS2l0KHJlbmRlcktpdCkpOw0KLSAgICAgICAgZW5oYW5jZXIuc2V0Q2xhc3NMb2FkZXIoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7DQotDQotICAgICAgICByZXR1cm4gKFJlbmRlcktpdCkgZW5oYW5jZXIuY3JlYXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBpbnRlcmNlcHQoT2JqZWN0IG9iaiwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncywgTWV0aG9kUHJveHkgcHJveHkpIHRocm93cyBUaHJvd2FibGUNCi0gICAgew0KLSAgICAgICAgaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldFJlbmRlcmVyIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFJlbmRlcmVyKChTdHJpbmcpYXJnc1swXSwgKFN0cmluZylhcmdzWzFdKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImFkZFJlbmRlcmVyIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkUmVuZGVyZXIoKFN0cmluZylhcmdzWzBdLCAoU3RyaW5nKWFyZ3NbMV0sIChSZW5kZXJlcilhcmdzWzJdKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJveHkuaW52b2tlU3VwZXIob2JqLCBhcmdzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBFeHRWYWxHZW5lcmljUmVuZGVyS2l0KFJlbmRlcktpdCB3cmFwcGVkKQ0KLSAgICB7DQotICAgICAgICBzdXBlcih3cmFwcGVkKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIGNyZWF0ZVdyYXBwZXIoUmVuZGVyZXIgcmVuZGVyZXIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLm5ld0luc3RhbmNlKHJlbmRlcmVyKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNjU1NzUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZEludGVyY2VwdG9yOwotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5FbmhhbmNlcjsKLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kUHJveHk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBmaW5hbCBjbGFzcyBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyIGV4dGVuZHMgRXh0VmFsUmVuZGVyZXJXcmFwcGVyIGltcGxlbWVudHMgTWV0aG9kSW50ZXJjZXB0b3IKLXsKLSAgICBwdWJsaWMgc3RhdGljIFJlbmRlcmVyIG5ld0luc3RhbmNlKFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gcmVuZGVyZXIuZ2V0Q2xhc3MoKTsKLQotICAgICAgICAvL3RvIGF2b2lkIHJlLXdyYXBwaW5nIC0gb2NjdXJzIGUuZy4gdW5kZXIgc29sYXJpcyArIGJlYSB3ZWJsb2dpYwotICAgICAgICBpZiAoUHJveHlVdGlscy5pc1Byb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBFbmhhbmNlciBlbmhhbmNlciA9IG5ldyBFbmhhbmNlcigpOwotICAgICAgICBlbmhhbmNlci5zZXRTdXBlcmNsYXNzKHJlbmRlcmVyLmdldENsYXNzKCkpOwotICAgICAgICBlbmhhbmNlci5zZXRDYWxsYmFjayhuZXcgRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlcihyZW5kZXJlcikpOwotICAgICAgICBlbmhhbmNlci5zZXRDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLQotICAgICAgICByZXR1cm4gKFJlbmRlcmVyKSBlbmhhbmNlci5jcmVhdGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGludGVyY2VwdChPYmplY3Qgb2JqLCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzLCBNZXRob2RQcm94eSBwcm94eSkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJnZXRDb252ZXJ0ZWRWYWx1ZSIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldENvbnZlcnRlZFZhbHVlKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0sIGFyZ3NbMl0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJkZWNvZGUiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlY29kZSgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZW5jb2RlQmVnaW4iKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZUJlZ2luKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJlbmNvZGVDaGlsZHJlbiIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlQ2hpbGRyZW4oKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImVuY29kZUVuZCIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlRW5kKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJjb252ZXJ0Q2xpZW50SWQiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29udmVydENsaWVudElkKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFN0cmluZylhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0UmVuZGVyc0NoaWxkcmVuIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRSZW5kZXJzQ2hpbGRyZW4oKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibWV0aG9kICIgKyBtZXRob2QuZ2V0TmFtZSgpICsgIiBjYWxsZWQgd2l0aG91dCByZW5kZXJpbmctaW50ZXJjZXB0b3JzIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBwcm94eS5pbnZva2VTdXBlcihvYmosIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyKFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgewotICAgICAgICBzdXBlcih3cmFwcGVkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0dlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDkxN2U2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0dlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkNCi17DQotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImV4dHZhbCByZW5kZXJraXQgd3JhcHBlciBjcmVhdGVkIGZvciAiICsgcmVuZGVyS2l0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB2aWEgY2dsaWIiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBFeHRWYWxHZW5lcmljUmVuZGVyS2l0Lm5ld0luc3RhbmNlKHJlbmRlcktpdCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9zdGFydHVwL0dlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NzMzMTQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9zdGFydHVwL0dlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0LkdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEdlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDM5MjE1NjAzMjg3NzUxOTU1Nkw7DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jbGFzcykuYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkobmV3IEdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZjYzMjAuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGUNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGUgcHJvdmlkZXMgZ2VuZXJpYyBTdXBwb3J0IGZvciBKU0YgY29tcG9uZW50IGZyYW1ld29ya3Mgd2hpY2ggaGF2ZSBzcGVjaWFsIHJlcXVpcmVtZW50cyAoZS5nLiBSaWNoRmFjZXMsIE15RmFjZXMgVG9iYWdvLCAuLi4pLg0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS54IGFuZCBKU0YgMi54LiBBbGwgdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3BvbS54bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDJkMjMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQ29tcG9uZW50LVN1cHBvcnQgTW9kdWxlczwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjIuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvbXBvbmVudC1zdXBwb3J0PC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvY29tcG9uZW50LXN1cHBvcnQ8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvbXBvbmVudC1zdXBwb3J0PC91cmw+Ci0gICAgPC9zY20+Ci0KLSAgICA8bW9kdWxlcz4KLSAgICAgICAgPG1vZHVsZT50cmluaWRhZC1zdXBwb3J0PC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+Z2VuZXJpYy1zdXBwb3J0PC9tb2R1bGU+Ci0gICAgPC9tb2R1bGVzPgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8dHJpbmlkYWQudmVyc2lvbj4xLjIuOTwvdHJpbmlkYWQudmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEzNmRmOS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgVHJpbmlkYWQgU3VwcG9ydCBNb2R1bGU8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4yLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+Y29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OGIyYmIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+DQotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0YXJ0dXAuVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXINCi0gICAgICAgIDwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLQ0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPg0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyDQotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTBlYjY4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5DbGllbnRWYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLS8qKg0KLSAqIGluIGNhc2Ugb2YgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBhIHRyaW5pZGFkIGNsaWVudCB2YWxpZGF0b3IgaXMgYWRkZWQgdG8gdGhlIGNvbXBvbmVudCBiYXNlZCBvbiB0aGUgbWV0YS1kYXRhLg0KLSAqIGF0IHRoZSBwb3N0YmFjazogdGhlIGV4dHZhbCB2YWxpZGF0aW9uIHN0cmF0ZWd5IGdldHMgY2FsbGVkIGFuZCBhZnRlciB0aGF0IHRoZSBhZGRlZCB2YWxpZGF0b3IuDQotICogdGhpcyB3cmFwcGVyIHByZXZlbnRzIHN1Y2ggYSBzZXJ2ZXItc2lkZSBkb3VibGUgdmFsaWRhdGlvbi4NCi0gKiBpdCBqdXN0IGRlbGVnYXRlcyB0aGUgY2xpZW50LXNpZGUgZnVuY3Rpb25hbGl0eS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlciBpbXBsZW1lbnRzIFZhbGlkYXRvciwgQ2xpZW50VmFsaWRhdG9yLCBTZXJpYWxpemFibGUNCi17DQotICAgIHByaXZhdGUgdHJhbnNpZW50IENsaWVudFZhbGlkYXRvciB3cmFwcGVkOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxNDE0NTQ3ODQxNzAwNjIxNDEwTDsNCi0NCi0gICAgcHVibGljIEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcihDbGllbnRWYWxpZGF0b3IgY2xpZW50VmFsaWRhdG9yKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSBjbGllbnRWYWxpZGF0b3I7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgdmFsaWRhdGUgLSB0aGUgZXh0dmFsIHZhbGlkYXRpb24gc3RyYXRlZ3kgd2lsbCBkbyB0aGF0DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRMaWJyYXJ5U291cmNlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudExpYnJhcnlTb3VyY2UoZmFjZXNDb250ZXh0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldENsaWVudEltcG9ydE5hbWVzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q2xpZW50SW1wb3J0TmFtZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFNjcmlwdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q2xpZW50U2NyaXB0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50VmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q2xpZW50VmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc1ZDlkYi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0LkV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWN0b3J5RmluZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3Rvcnk7DQotDQotLyoqDQotICogdXNlIHRoaXMgcGhhc2UtbGlzdGVuZXIgaW5zdGVhZCBvZiBhIEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZHVlIHRvIGEgdHJpbmlkYWQgaXNzdWUNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA5MTA5NzIxODMxODY0MTQ2MTY1TDsNCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIFJlbmRlcktpdEZhY3RvcnkgcmVuZGVyS2l0RmFjdG9yeSA9IGdldFJlbmRlcktpdEZhY3RvcnkoKTsNCi0NCi0gICAgICAgIFN0cmluZyByZW5kZXJLaXRJZCA9IGdldFJlbmRlcktpdElkKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBpZiAoaXNJbmNvbXBhdGlibGVSZW5kZXJLaXQocmVuZGVyS2l0SWQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoYW5nZVJlbmRlcktpdChmYWNlc0NvbnRleHQsIHJlbmRlcktpdEZhY3RvcnksIHJlbmRlcktpdElkKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRSZW5kZXJLaXRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZ2V0UmVuZGVyS2l0SWQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFJlbmRlcktpdEZhY3RvcnkgZ2V0UmVuZGVyS2l0RmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoUmVuZGVyS2l0RmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRmFjdG9yeUZpbmRlci5SRU5ERVJfS0lUX0ZBQ1RPUlkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0luY29tcGF0aWJsZVJlbmRlcktpdChTdHJpbmcgcmVuZGVyS2l0SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAhRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuSUQuZXF1YWxzKHJlbmRlcktpdElkKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgY2hhbmdlUmVuZGVyS2l0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFJlbmRlcktpdEZhY3RvcnkgcmVuZGVyS2l0RmFjdG9yeSwgU3RyaW5nIHJlbmRlcktpdElkKQ0KLSAgICB7DQotICAgICAgICBSZW5kZXJLaXQgcmVuZGVyS2l0ID0gcmVuZGVyS2l0RmFjdG9yeS5nZXRSZW5kZXJLaXQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCByZW5kZXJLaXRJZCk7DQotICAgICAgICByZW5kZXJLaXRGYWN0b3J5LmFkZFJlbmRlcktpdChFeHRWYWxUcmluaWRhZFJlbmRlcktpdC5JRCwgbmV3IEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0KHJlbmRlcktpdCkpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuc2V0UmVuZGVyS2l0SWQoRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuSUQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5SRU5ERVJfUkVTUE9OU0U7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICBpZiAodGhpcyA9PSBvKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEV4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTBjYjc0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFyZW4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICAvKg0KLSAgICAgKiBkZWFjdGl2YXRlDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfQ0xJRU5UX1NJREVfVFJJTklEQURfVkFMSURBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9DTElFTlRfU0lERV9UUklOSURBRF9WQUxJREFUSU9OIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9UUklOSURBRF9DT1JFX09VVFBVVF9MQUJFTF9JTklUSUFMSVpBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9UUklOSURBRF9DT1JFX09VVFBVVF9MQUJFTF9JTklUSUFMSVpBVElPTiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfVFJJTklEQURfVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfVFJJTklEQURfVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IiKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0RvdWJsZVJhbmdlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEwMDBlMy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0RvdWJsZVJhbmdlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5Eb3VibGVSYW5nZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkNsaWVudFZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJza2lwVmFsaWRhdGlvblN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24iKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIERvdWJsZVJhbmdlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW5mb3JtYXRpb25BZGRlZCA9IGZhbHNlOwotICAgICAgICBEb3VibGVSYW5nZVZhbGlkYXRvciBkb3VibGVSYW5nZVZhbGlkYXRvciA9IChEb3VibGVSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRG91YmxlUmFuZ2UiKTsKLQotICAgICAgICBPYmplY3QgbWluID0gbnVsbDsKLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU5fREVGQVVMVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOX0RFRkFVTFQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWluIGluc3RhbmNlb2YgRG91YmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKChEb3VibGUpbWluKTsKLSAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IG1heCA9IG51bGw7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWF9ERUZBVUxUKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1heCBpbnN0YW5jZW9mIERvdWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bSgoRG91YmxlKW1heCk7Ci0gICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGluZm9ybWF0aW9uQWRkZWQgJiYKLSAgICAgICAgICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvciBpbnN0YW5jZW9mIENsaWVudFZhbGlkYXRvciAmJiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpZG91YmxlUmFuZ2VWYWxpZGF0b3IpKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xlbmd0aEluaXRpYWxpemVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xlbmd0aEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMjZjOGYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9MZW5ndGhJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBMZW5ndGhJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7Ci0gICAgICAgIC8vVE9ETwotICAgICAgICBMZW5ndGhWYWxpZGF0b3IgbGVuZ3RoVmFsaWRhdG9yID0gKExlbmd0aFZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTGVuZ3RoIik7Ci0KLSAgICAgICAgT2JqZWN0IG1pbkxlbmd0aCA9IG51bGw7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWluTGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIX0RFRkFVTFQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW5MZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEhfREVGQVVMVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtaW5MZW5ndGggaW5zdGFuY2VvZiBJbnRlZ2VyKQotICAgICAgICB7Ci0gICAgICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWluaW11bSgoSW50ZWdlciltaW5MZW5ndGgpOwotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbnVsbDsKLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEhfREVGQVVMVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heExlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSF9ERUZBVUxUKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1heExlbmd0aCBpbnN0YW5jZW9mIEludGVnZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudC5nZXRDbGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0TWF4aW11bUxlbmd0aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludC5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhMZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWF4aW11bSgoSW50ZWdlciltYXhMZW5ndGgpOwotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3JlSW5pdFZhbGlkYXRvcnMoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQsIG1ldGFEYXRhKTsgLy9zZWFyY2ggd3JhcHBlcnMgYW5kIGNhbGwgLmRlYWN0aXZhdGUKLQotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkICYmIGxlbmd0aFZhbGlkYXRvciBpbnN0YW5jZW9mIENsaWVudFZhbGlkYXRvcikKLSAgICAgICAgewotICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKWxlbmd0aFZhbGlkYXRvcikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobGVuZ3RoVmFsaWRhdG9yLmdldE1pbmltdW0oKSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgoQ29yZU91dHB1dExhYmVsKXVpQ29tcG9uZW50KS5zZXRTaG93UmVxdWlyZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTG9uZ1JhbmdlSW5pdGlhbGl6ZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTG9uZ1JhbmdlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc5ZWViOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xvbmdSYW5nZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuTG9uZ1JhbmdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgTG9uZ1JhbmdlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW5mb3JtYXRpb25BZGRlZCA9IGZhbHNlOwotICAgICAgICBMb25nUmFuZ2VWYWxpZGF0b3IgbG9uZ1JhbmdlVmFsaWRhdG9yID0gKExvbmdSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTG9uZ1JhbmdlIik7Ci0KLSAgICAgICAgT2JqZWN0IG1pbiA9IG51bGw7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pKQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOX0RFRkFVTFQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxUKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1pbiBpbnN0YW5jZW9mIExvbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKChMb25nKW1pbik7Ci0gICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBtYXggPSBudWxsOwotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4ID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWF9ERUZBVUxUKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4ID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVhfREVGQVVMVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtYXggaW5zdGFuY2VvZiBMb25nKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bSgoTG9uZyltYXgpOwotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkICYmCi0gICAgICAgICAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yIGluc3RhbmNlb2YgQ2xpZW50VmFsaWRhdG9yICYmIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikKLSAgICAgICAgewotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKWxvbmdSYW5nZVZhbGlkYXRvcikpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1BhdHRlcm5Jbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmYwODhkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuUmVnRXhwVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgUGF0dGVybkluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZighbWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4pKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBwYXR0ZXJucyA9IChTdHJpbmdbXSltZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4pOwotCi0gICAgICAgIFJlZ0V4cFZhbGlkYXRvciByZWdFeHBWYWxpZGF0b3I7Ci0KLSAgICAgICAgZm9yKFN0cmluZyBwYXR0ZXJuIDogcGF0dGVybnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZ0V4cFZhbGlkYXRvciA9IChSZWdFeHBWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5SZWdFeHAiKTsKLQotICAgICAgICAgICAgcmVnRXhwVmFsaWRhdG9yLnNldFBhdHRlcm4ocGF0dGVybik7Ci0gICAgICAgICAgICByZWdFeHBWYWxpZGF0b3Iuc2V0TWVzc2FnZURldGFpbE5vTWF0Y2goKFN0cmluZyltZXRhRGF0YS5nZXQoCi0gICAgICAgICAgICAgICAgQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFKSk7Ci0KLSAgICAgICAgICAgIGlmKHJlZ0V4cFZhbGlkYXRvciBpbnN0YW5jZW9mIENsaWVudFZhbGlkYXRvciAmJiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpcmVnRXhwVmFsaWRhdG9yKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1JlcXVpcmVkSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkNGVhNy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1JlcXVpcmVkSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudXRpbC5UcmluaWRhZFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIFJlcXVpcmVkSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCF2YWxpZGF0ZUVtcHR5RmllbGRzKCkgfHwgIUV4dFZhbFV0aWxzLmlzUmVxdWlyZWRJbml0aWFsaXphdGlvbkFjdGl2ZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpIHx8Ci0gICAgICAgICAgIG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKXx8Ci0gICAgICAgICAgIG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigoCi0gICAgICAgICAgICAgICAgICghQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpICYmCi0gICAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQpKSkgfHwKLSAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpCi0gICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGlzQ29tcG9uZW50UmVxdWlyZWQodWlDb21wb25lbnQpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIENvcmVPdXRwdXRMYWJlbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgoQ29yZU91dHB1dExhYmVsKXVpQ29tcG9uZW50KS5zZXRTaG93UmVxdWlyZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJgotICAgICAgICAgICAgICAgICAgICFCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIgJiYgRXh0VmFsVXRpbHMuaXNSZXF1aXJlZFJlc2V0QWN0aXZhdGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlRW1wdHlGaWVsZHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLnZhbGlkYXRlRW1wdHlGaWVsZHMoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQm9vbGVhbiBpc0NvbXBvbmVudFJlcXVpcmVkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpQ29tcG9uZW50ID0gVHJpbmlkYWRVdGlscy5maW5kTGFiZWxlZEVkaXRhYmxlQ29tcG9uZW50KChDb3JlT3V0cHV0TGFiZWwpIHVpQ29tcG9uZW50KTsKLQotICAgICAgICAgICAgaWYodWlDb21wb25lbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vY29tcGFyZSB3aXRoIGZhbHNlIHNvIHRydWUgPSB0cnVlIG9yIG51bGwKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc1JlYWRPbmx5IikpKTsKLSAgICAgICAgYm9vbGVhbiBpc0Rpc2FibGVkID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc0Rpc2FibGVkIikpKTsKLQotICAgICAgICByZXR1cm4gIShpc1JlYWRPbmx5IHx8IGlzRGlzYWJsZWQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NjBhYjUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLlRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29udGV4dC5SZXF1ZXN0Q29udGV4dDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQEludm9jYXRpb25PcmRlcigzMDApCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dFRleHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX0RBVEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dERhdGUiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyPiBjb21wb25lbnRJbml0aWFsaXplcnMgPQotICAgICAgICBuZXcgQXJyYXlMaXN0PFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXI+KCk7Ci0KLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFJlcXVpcmVkSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IExlbmd0aEluaXRpYWxpemVyKCkpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBMb25nUmFuZ2VJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgRG91YmxlUmFuZ2VJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgUGF0dGVybkluaXRpYWxpemVyKCkpOwotICAgICAgICAvL2NvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFZhbGlkYXRvckluaXRpYWxpemVyKCkpOwotICAgIH0KLQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTE9XLCBkZXNjcmlwdGlvbiA9ICJjaGVjayBwcHIgaXNzdWUiKQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGZvcihUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyIDogY29tcG9uZW50SW5pdGlhbGl6ZXJzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihjb21wb25lbnRJbml0aWFsaXplci5jb25maWd1cmVUcmluaWRhZENvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkQ29tcG9uZW50VG9TdG9yYWdlKHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgICAgICB1cGRhdGVDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkQ29tcG9uZW50VG9TdG9yYWdlKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MsIFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpCi0gICAgICAgICAgICAgICAgLmFkZENvbXBvbmVudCh1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVC5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpIHx8Ci0gICAgICAgICAgICAgICBUUklOSURBRF9DT1JFX0lOUFVUX0RBVEUuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYoUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuaXNQYXJ0aWFsUmVxdWVzdChmYWNlc0NvbnRleHQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXF1ZXN0Q29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5hZGRQYXJ0aWFsVGFyZ2V0KHVpQ29tcG9uZW50LmdldFBhcmVudCgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1ZhbGlkYXRvckluaXRpYWxpemVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1ZhbGlkYXRvckluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NmY0YWQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQotQFVzYWdlSW5mb3JtYXRpb24odmFsdWUgPSBVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gImltcGwuIHRyaW5pZGFkIGUtbWFpbCB2YWxpZGF0b3IiKQotY2xhc3MgVmFsaWRhdG9ySW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCFtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuQ1VTVE9NKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00pOwotCi0gICAgICAgIGlmKCEodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKE9iamVjdCBjdXJyZW50VmFsdWUgOiAoTGlzdCl2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIShjdXJyZW50VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihDb21tb25NZXRhRGF0YUtleXMuRU1BSUwuZXF1YWxzKGN1cnJlbnRWYWx1ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9UT0RPCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE0Njk2Yi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3INCi0gICAgICAgIC5Db21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigzMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBleHRlbmRzIENvbXBvbmVudEluaXRpYWxpemF0aW9uQXdhcmVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nRm9yQ29tcG9uZW50SW5pdGlhbGl6YXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzTWV0YURhdGFFbnRyaWVzKHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0TWV0YURhdGFFbnRyaWVzKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTWV0YURhdGFFbnRyaWVzKE1ldGFEYXRhRW50cnlbXSBtZXRhRGF0YUVudHJpZXMpDQotICAgIHsNCi0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IG1ldGFEYXRhRW50cmllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAocHJvY2Vzc0VudHJ5KGVudHJ5KSAmJiBpc0NsaWVudFZhbGlkYXRpb25EaXNhYmxlZChlbnRyeSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBkaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24oZW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvL2UuZy4gcmV0dXJucyBmYWxzZSBmb3IganNyMzAzIGVudHJpZXMNCi0gICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NFbnRyeShNZXRhRGF0YUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb247DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xpZW50VmFsaWRhdGlvbkRpc2FibGVkKE1ldGFEYXRhRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkNCi0gICAgICAgICAgICAgICAgLmV4dHJhY3QoZW50cnkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5pdGVyYXRvcigpLmhhc05leHQoKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwcml2YXRlIHZvaWQgZGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uKE1ldGFEYXRhRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmKGVudHJ5LmdldFByb3BlcnR5KENvbW1vbk1ldGFEYXRhS2V5cy5ESVNBQkxFX0NMSUVOVF9TSURFX1ZBTElEQVRJT04pID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZW50cnkuc2V0UHJvcGVydHkoQ29tbW9uTWV0YURhdGFLZXlzLkRJU0FCTEVfQ0xJRU5UX1NJREVfVkFMSURBVElPTiwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGtleXNUb0Rpc2FibGUgPSBlbnRyeS5nZXRQcm9wZXJ0eShDb21tb25NZXRhRGF0YUtleXMuRElTQUJMRV9DTElFTlRfU0lERV9WQUxJREFUSU9OLCBMaXN0LmNsYXNzKTsNCi0gICAgICAgIGtleXNUb0Rpc2FibGUuYWRkKGVudHJ5LmdldEtleSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZTNiNjEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UuVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudXRpbC5UcmluaWRhZFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUuQ29yZUZvcm07DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotcHVibGljIGNsYXNzIFRyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvciBleHRlbmRzIEFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcg0KLXsNCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpDQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChmaWx0ZXJDb3JlT3V0cHV0TGFiZWwodWlDb21wb25lbnQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRDb3JlT3V0cHV0TGFiZWwoZmFjZXNDb250ZXh0LCAoQ29yZU91dHB1dExhYmVsKSB1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyRW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQ0KLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIENvcmVGb3JtKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNsZWFudXBFeHRWYWxDbGllbnRWYWxpZGF0b3JzKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFudXBFeHRWYWxDbGllbnRWYWxpZGF0b3JzKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MsIFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpDQotICAgICAgICAgICAgICAgIC5yb2xsYmFjaygpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBmaWx0ZXJDb3JlT3V0cHV0TGFiZWwoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb3JlT3V0cHV0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgQ29yZU91dHB1dExhYmVsIGNvcmVPdXRwdXRMYWJlbCkNCi0gICAgew0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gVHJpbmlkYWRVdGlscy5maW5kTGFiZWxlZEVkaXRhYmxlQ29tcG9uZW50KGNvcmVPdXRwdXRMYWJlbCk7DQotDQotICAgICAgICBpZiAodGFyZ2V0Q29tcG9uZW50ID09IG51bGwgfHwgIWlzQ29tcG9uZW50RWRpdGFibGUodGFyZ2V0Q29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhUmVzdWx0ID0gRXh0VmFsVXRpbHMuZ2V0VHJhbnNmb3JtZWRNZXRhRGF0YShmYWNlc0NvbnRleHQsIHRhcmdldENvbXBvbmVudCk7DQotDQotICAgICAgICAvL2dldCBjb21wb25lbnQgaW5pdGlhbGl6ZXIgZm9yIHRoZSBjdXJyZW50IGNvbXBvbmVudCBhbmQgY29uZmlndXJlIGl0DQotICAgICAgICAvL2Fsc28gaW4gY2FzZSBvZiBza2lwcGVkIHZhbGlkYXRpb24gdG8gcmVzZXQgZS5nLiB0aGUgcmVxdWlyZWQgYXR0cmlidXRlDQotICAgICAgICBpZiAoIW1ldGFEYXRhUmVzdWx0LmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5jb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoZmFjZXNDb250ZXh0LCBjb3JlT3V0cHV0TGFiZWwsIG1ldGFEYXRhUmVzdWx0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDb21wb25lbnRFZGl0YWJsZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgLy9jb21wYXJlIHdpdGggZmFsc2Ugc28gdHJ1ZSA9IHRydWUgb3IgbnVsbA0KLSAgICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNSZWFkT25seSIpKSk7DQotICAgICAgICBib29sZWFuIGlzRGlzYWJsZWQgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc0Rpc2FibGVkIikpKTsNCi0NCi0gICAgICAgIHJldHVybiAhKGlzUmVhZE9ubHkgfHwgaXNEaXNhYmxlZCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q4NTQ2MS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5MYWJlbGVkTWVzc2FnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5leGNlcHRpb24uUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbnRleHQuUmVxdWVzdENvbnRleHQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dFRleHQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUuaW5wdXQuQ29yZUlucHV0RGF0ZSI7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb1JlZnJlc2hDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgICAgIHRyeVRvUGxhY2VMYWJlbEluRmFjZXNNZXNzYWdlKHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvUGxhY2VMYWJlbEluRmFjZXNNZXNzYWdlKA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHRyeVRvSGFuZGxlUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24odWlDb21wb25lbnQsIHZhbGlkYXRvckV4Y2VwdGlvbik7DQotDQotICAgICAgICBTdHJpbmcgbGFiZWwgPSBkZXRlY3RMYWJlbFRleHQobWV0YURhdGFFbnRyeSwgdWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0xhYmVsKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSwgbGFiZWwpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGRldGVjdExhYmVsVGV4dChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbGFiZWwgPSBnZXRMYWJlbCh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBsYWJlbCA9IGdldENsaWVudElkQXNGYWxsYmFja0lmTmVlZGVkKHVpQ29tcG9uZW50LCBsYWJlbCk7DQotDQotICAgICAgICBsYWJlbCA9IHRyeVRvT3ZlcnJpZGVMYWJlbElmUHJvdmlkZWRNYW51YWxseShtZXRhRGF0YUVudHJ5LCBsYWJlbCk7DQotICAgICAgICByZXR1cm4gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NMYWJlbChGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIExhYmVsZWRNZXNzYWdlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgICgoTGFiZWxlZE1lc3NhZ2UpZmFjZXNNZXNzYWdlKS5zZXRMYWJlbFRleHQobGFiZWwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9pZiBzb21lb25lIHVzZXMgYSBub3JtYWwgZmFjZXMgbWVzc2FnZQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwoZmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvT3ZlcnJpZGVMYWJlbElmUHJvdmlkZWRNYW51YWxseShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwsIFN0cmluZy5jbGFzcyk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xpZW50SWRBc0ZhbGxiYWNrSWZOZWVkZWQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgaWYobGFiZWwgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBsYWJlbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9IYW5kbGVSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdG9yRXhjZXB0aW9uIGluc3RhbmNlb2YgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKTsNCi0gICAgICAgICAgICBTdHJpbmcgaW5saW5lTWVzc2FnZSA9IGdldElubGluZVJlcXVpcmVkTWVzc2FnZSh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICAgICAgaWYoaW5saW5lTWVzc2FnZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoaW5saW5lTWVzc2FnZSk7DQotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoaW5saW5lTWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1JlZnJlc2hDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmKFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmlzUGFydGlhbFJlcXVlc3QoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBSZXF1ZXN0Q29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5hZGRQYXJ0aWFsVGFyZ2V0KHVpQ29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAoVFJJTklEQURfQ09SRV9JTlBVVF9URVhULmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSkgfHwNCi0gICAgICAgICAgICAgICAgIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURS5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRMYWJlbChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldExhYmVsIikpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldElubGluZVJlcXVpcmVkTWVzc2FnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldFJlcXVpcmVkTWVzc2FnZURldGFpbCIpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYjQ1ZTkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcktpdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuUmVuZGVyS2l0RGVjb3JhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuY29yZS5Db3JlUmVuZGVyS2l0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZXNwb25zZVN0YXRlTWFuYWdlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVdyaXRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5Xcml0ZXI7DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0IGV4dGVuZHMgUmVuZGVyS2l0RGVjb3JhdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgRXh0VmFsUmVuZGVyS2l0IGV4dFZhbFJlbmRlcktpdDsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiRVhUVkFMX1RSSU5JREFEX1JFTkRFUktJVCI7DQotDQotICAgIHB1YmxpYyBFeHRWYWxUcmluaWRhZFJlbmRlcktpdChSZW5kZXJLaXQgd3JhcHBlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5leHRWYWxSZW5kZXJLaXQgPSBuZXcgRXh0VmFsUmVuZGVyS2l0KHdyYXBwZWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlLCBSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5leHRWYWxSZW5kZXJLaXQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIHJlbmRlcmVyKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFJlbmRlcmVyIGdldFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5nZXRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBSZXNwb25zZVN0YXRlTWFuYWdlciBnZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5nZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUmVzcG9uc2VXcml0ZXIgY3JlYXRlUmVzcG9uc2VXcml0ZXIoV3JpdGVyIHdyaXRlciwgU3RyaW5nIHMsIFN0cmluZyBzMSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmNyZWF0ZVJlc3BvbnNlV3JpdGVyKHdyaXRlciwgcywgczEpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdHJlYW0gY3JlYXRlUmVzcG9uc2VTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmNyZWF0ZVJlc3BvbnNlU3RyZWFtKG91dHB1dFN0cmVhbSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZWNvcmF0ZWRSZW5kZXJLaXRJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBDb3JlUmVuZGVyS2l0LkJBU0VfUkVOREVSX0tJVF9JRDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYyNzAxZi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnJlbmRlcmtpdC5jb3JlLnhodG1sLnRhYmxlLlRhYmxlUmVuZGVyaW5nQ29udGV4dDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIHNvbHV0aW9uIGZvciB0cmluaWRhZCB0YWJsZSByZW5kZXJlciBpc3N1ZSAoaW4gY29ubmVjdGlvbiB3aXRoIGRvdWJsZSBjYWxsIHByZXZlbnRpb24gcHJveGllcykNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1wdWJsaWMgY2xhc3MgRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5IGV4dGVuZHMgRXh0VmFsUmVuZGVyZXJQcm94eQ0KLXsNCi0gICAgcHVibGljIEV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgc3VwZXIocmVuZGVyZXIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wdGlvbmFsS2V5KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZihUYWJsZVJlbmRlcmluZ0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gInwiICsgVGFibGVSZW5kZXJpbmdDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFJlbmRlclN0YWdlKCkuZ2V0U3RhZ2UoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAiIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRiNzU2Yi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkFic3RyYWN0U3RhcnR1cExpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VySG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50LlRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLlRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UuRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudmFsaWRhdGlvbi5tZXNzYWdlLlRyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdC5FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvci5UcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yLlRyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yLlRyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBhbHRlcm5hdGl2ZSBhcHByb2FjaCBmb3IgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFRyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04MDM0MDg5MjQ0OTAzOTY2OTk5TDsNCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIGRlYWN0aXZhdGVEZWZhdWx0RXh0VmFsUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsNCi0NCi0gICAgICAgIGluaXRDbGllbnRTaWRlVmFsaWRhdGlvblN1cHBvcnQoKTsNCi0NCi0gICAgICAgIGluaXRMYWJlbEluaXRpYWxpemF0aW9uU3VwcG9ydCgpOw0KLQ0KLSAgICAgICAgaW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRpb24oKTsNCi0NCi0gICAgICAgIHJlcGxhY2VEZWZhdWx0UHJveHlXaXRoVHJpbmlkYWRSZW5kZXJlclByb3h5KCk7DQotDQotICAgICAgICBpbml0VHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5KCk7DQotICAgICAgICAvKg0KLSAgICAgICAgICogaWYgdGhlcmUgYXJlIGZ1cnRoZXIgaW5jb21wYXRpYmxlIHJlbmRlcmVycyB1c2UgdGhlIGZvbGxvd2luZyBxdWljay1maXg6DQotICAgICAgICAgKiAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSwgbnVsbCk7DQotICAgICAgICAgICBhdHRlbnRpb246IGl0IGNhdXNlcyBkaXJlY3QgZGVsZWdhdGlvbiB3aXRob3V0IGEgY2hlY2sgb2YgZG91YmxlIGludm9jYXRpb25zDQotICAgICAgICAgKi8NCi0NCi0gICAgICAgIGluaXRUcmluaWRhZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKCk7DQotDQotICAgICAgICBpbml0VHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlKCk7DQotDQotICAgICAgICBpbml0UmVxdWlyZWRJbml0aWFsaXphdGlvbigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBkZWFjdGl2YXRlRGVmYXVsdEV4dFZhbFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpLmRlYWN0aXZhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdENsaWVudFNpZGVWYWxpZGF0aW9uU3VwcG9ydCgpDQotICAgIHsNCi0gICAgICAgIGlmKGlzQ2xpZW50U2lkZVZhbGlkYXRpb25TdXBwb3J0RW5hYmxlZChXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DTElFTlRfU0lERV9UUklOSURBRF9WQUxJREFUSU9OKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdExhYmVsSW5pdGlhbGl6YXRpb25TdXBwb3J0KCkNCi0gICAgew0KLSAgICAgICAgaWYoaXNMYWJlbEluaXRpYWxpemF0aW9uRW5hYmxlZChXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9UUklOSURBRF9DT1JFX09VVFBVVF9MQUJFTF9JTklUSUFMSVpBVElPTikpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKG5ldyBUcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0aW9uKCkNCi0gICAgew0KLSAgICAgICAgaWYodXNlVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdGlvbihXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9UUklOSURBRF9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUikpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKG5ldyBUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVwbGFjZURlZmF1bHRQcm94eVdpdGhUcmluaWRhZFJlbmRlcmVyUHJveHkoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVksIEV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0VHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY3RvcnlOYW1lcy5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkubmFtZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0VHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcigpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG5ldyBUcmluaWRhZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0VHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwgU3RvcmFnZU1hbmFnZXJIb2xkZXIuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5zZXRTdG9yYWdlTWFuYWdlcihUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTWFuYWdlcigpLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTGFiZWxJbml0aWFsaXphdGlvbkVuYWJsZWQoU3RyaW5nIGRlYWN0aXZhdGVJbml0Q29yZU91dHB1dExhYmVsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGVhY3RpdmF0ZUluaXRDb3JlT3V0cHV0TGFiZWwgPT0gbnVsbCB8fCAhZGVhY3RpdmF0ZUluaXRDb3JlT3V0cHV0TGFiZWwuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NsaWVudFNpZGVWYWxpZGF0aW9uU3VwcG9ydEVuYWJsZWQoU3RyaW5nIGRlYWN0aXZhdGVDbGllbnRTaWRlVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRlYWN0aXZhdGVDbGllbnRTaWRlVmFsaWRhdGlvbiA9PSBudWxsIHx8ICFkZWFjdGl2YXRlQ2xpZW50U2lkZVZhbGlkYXRpb24uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0aW9uKFN0cmluZyBkZWFjdGl2YXRlVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkZWFjdGl2YXRlVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgPT0gbnVsbCB8fA0KLSAgICAgICAgICAgICAgICAhZGVhY3RpdmF0ZVRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UmVxdWlyZWRJbml0aWFsaXphdGlvbigpDQotICAgIHsNCi0gICAgICAgIGlmKCFpc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25EZWFjdGl2YXRlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KCJtb2RlOmluaXQ6cmVxdWlyZWQiLCBCb29sZWFuLlRSVUUsIHRydWUpOw0KLQ0KLSAgICAgICAgICAgIC8vdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgc2V2ZXJpdHkgYXdhcmUgdmFsaWRhdGlvbiAtPiBkb24ndCByZXNldCB0aGUgdmFsdWUNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eSgibW9kZTpyZXNldDpyZXF1aXJlZCIsIEJvb2xlYW4uRkFMU0UsIGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNSZXF1aXJlZEluaXRpYWxpemF0aW9uRGVhY3RpdmF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gImZhbHNlIi5lcXVhbHNJZ25vcmVDYXNlKA0KLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXIuQUNUSVZBVEVfUkVRVUlSRURfSU5JVElBTElaQVRJT04pOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDU0MjU0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZSBpbXBsZW1lbnRzIFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZQ0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PFVJQ29tcG9uZW50PiBjb21wb25lbnRMaXN0ID0gbmV3IEFycmF5TGlzdDxVSUNvbXBvbmVudD4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkQ29tcG9uZW50KFVJQ29tcG9uZW50IHRyaW5pZGFkQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZighdGhpcy5jb21wb25lbnRMaXN0LmNvbnRhaW5zKHRyaW5pZGFkQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmNvbXBvbmVudExpc3QuYWRkKHRyaW5pZGFkQ29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByb2xsYmFjaygpDQotICAgIHsNCi0gICAgICAgIGZvciAoVUlDb21wb25lbnQgY29tcG9uZW50IDogdGhpcy5jb21wb25lbnRMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlbW92ZVRyaW5pZGFkVmFsaWRhdG9yV3JhcHBlcihjb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdGhpcy5jb21wb25lbnRMaXN0LmNsZWFyKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVRyaW5pZGFkVmFsaWRhdG9yV3JhcHBlcihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZW1vdmVXcmFwcGVyRnJvbUNvbXBvbmVudCh1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgLy90byBrZWVwIHRoZSBzb3VyY2UgaW4gc3luYyB3aXRoIG9sZGVyIHZlcnNpb25zDQotICAgICAgICAgICAgZm9yIChPYmplY3QgY2hpbGQgOiB1aUNvbXBvbmVudC5nZXRDaGlsZHJlbigpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVtb3ZlVHJpbmlkYWRWYWxpZGF0b3JXcmFwcGVyKChVSUNvbXBvbmVudCljaGlsZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZW1vdmVXcmFwcGVyRnJvbUNvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgZm9yIChWYWxpZGF0b3IgdmFsaWRhdG9yIDogKChFZGl0YWJsZVZhbHVlSG9sZGVyKSB1aUNvbXBvbmVudCkuZ2V0VmFsaWRhdG9ycygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpIHVpQ29tcG9uZW50KS5yZW1vdmVWYWxpZGF0b3IodmFsaWRhdG9yKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQwMWRjNS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5TdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBjb21wb25lbnQgZW50cmllcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyDQotICAgICAgICBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2U+DQotew0KLSAgICBwdWJsaWMgRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX1RSSU5JREFEX0NMSUVOVF9WQUxJREFUT1I6S0VZIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9UcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL1RyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzgzY2I4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL1RyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLQ0KLS8qKg0KLSAqIGV4dHZhbCBpbmplY3RzIGNsaWVudC12YWxpZGF0b3JzIGludG8gdHJpbmlkYWQgY29tcG9uZW50cyBiYXNlZCBvbiBtZXRhLWRhdGEuDQotICogc28gY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBpcyBzdXBwb3J0ZWQuIHNvbWUgYXBwLXNlcnZlcnMgc2hvdyBhIGRpZmZlcmVudCBiZWhhdmlvdXIuDQotICogdGhhdCdzIHRoZSByZWFzb24gZm9yIHN0b3JpbmcgdGhlc2UgY29tcG9uZW50cyBhbmQgcmVtb3ZlIHRoZSBpbmplY3RlZCB2YWxpZGF0b3JzIGFmdGVyIHRoZSByZW5kZXJpbmcgcGhhc2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlDQotew0KLSAgICB2b2lkIGFkZENvbXBvbmVudChVSUNvbXBvbmVudCB0cmluaWRhZENvbXBvbmVudCk7DQotICAgIHZvaWQgcm9sbGJhY2soKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmU2OWIzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL21hcHBlci9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UuVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZS5EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigzMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3V0aWwvVHJpbmlkYWRVdGlscy5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3V0aWwvVHJpbmlkYWRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTYzODMyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC91dGlsL1RyaW5pZGFkVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImNoZWNrIHN1YmZvcm0iKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZFV0aWxzDQotew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhUcmluaWRhZFV0aWxzLmNsYXNzKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBVSUNvbXBvbmVudCBmaW5kTGFiZWxlZEVkaXRhYmxlQ29tcG9uZW50KENvcmVPdXRwdXRMYWJlbCBjb3JlT3V0cHV0TGFiZWwpDQotICAgIHsNCi0gICAgICAgIC8vVE9ETw0KLSAgICAgICAgaWYoaXNMYWJlbFRhcmdldEF2YWlsYWJsZShjb3JlT3V0cHV0TGFiZWwpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFVJQ29tcG9uZW50IHJlc3VsdCA9IHJlc29sdmVMYWJlbFRhcmdldChmYWNlc0NvbnRleHQsIGNvcmVPdXRwdXRMYWJlbCk7DQotDQotICAgICAgICBpZihyZXN1bHQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihMT0cuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBMT0cudHJhY2UoY29yZU91dHB1dExhYmVsLmdldENsaWVudElkKGZhY2VzQ29udGV4dCkgKyAiIGRvZXNuJ3QgcmVmZXJlbmNlIGFuIGVkaXRhYmxlIGNvbXBvbmVudCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgVUlDb21wb25lbnQgcmVzb2x2ZUxhYmVsVGFyZ2V0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIENvcmVPdXRwdXRMYWJlbCBjb3JlT3V0cHV0TGFiZWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5maW5kQ29tcG9uZW50KGNvcmVPdXRwdXRMYWJlbC5nZXRGb3IoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xhYmVsVGFyZ2V0QXZhaWxhYmxlKENvcmVPdXRwdXRMYWJlbCBjb3JlT3V0cHV0TGFiZWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb3JlT3V0cHV0TGFiZWwuZ2V0Rm9yKCkgPT0gbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNjMjFjYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnZhbGlkYXRpb24ubWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkRlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkgZXh0ZW5kcyBEZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzTGFiZWxlZEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlIGluc3RhbmNlb2YgVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgRmFjZXNNZXNzYWdlIGNyZWF0ZShGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZShzZXZlcml0eSwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZlNjkzYi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5MYWJlbGVkTWVzc2FnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnV0aWwuTGFiZWxlZEZhY2VzTWVzc2FnZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIFRyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZSBleHRlbmRzIExhYmVsZWRGYWNlc01lc3NhZ2UgaW1wbGVtZW50cyBMYWJlbGVkTWVzc2FnZQ0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjM1NjgwMDY4OTk2MTUwNTE1NEw7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSID0gIj8/PyI7DQotDQotICAgIHB1YmxpYyBUcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UoU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihzZXZlcml0eSwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsVGV4dCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRMYWJlbEFzU3RyaW5nKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VtbWFyeSgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZSByZXN1bHQgPSB0cnlUb1BsYWNlTGFiZWwoc3VwZXIuZ2V0U3VtbWFyeSgpKTsNCi0NCi0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdXBlci5zZXRTdW1tYXJ5KHJlc3VsdC5nZXRTdW1tYXJ5KCkpOw0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQuZ2V0U3VtbWFyeSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFN1bW1hcnkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBnZXREZXRhaWwoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UgcmVzdWx0ID0gdHJ5VG9QbGFjZUxhYmVsKHN1cGVyLmdldERldGFpbCgpKTsNCi0NCi0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdXBlci5zZXREZXRhaWwocmVzdWx0LmdldERldGFpbCgpKTsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmdldERldGFpbCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldERldGFpbCgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgRmFjZXNNZXNzYWdlIHRyeVRvUGxhY2VMYWJlbChTdHJpbmcgb3JpZ2luYWxNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBpZiAoaXNWYWxpZE1lc3NhZ2Uob3JpZ2luYWxNZXNzYWdlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBGYWNlc01lc3NhZ2UgbmV3RmFjZXNNZXNzYWdlID0gY3JlYXRlT3JpZ2luYWxGYWNlc01lc3NhZ2UoKTsNCi0gICAgICAgICAgICB0cnlUb1BsYWNlTGFiZWxJbihuZXdGYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIHJldHVybiBuZXdGYWNlc01lc3NhZ2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEZhY2VzTWVzc2FnZSBjcmVhdGVPcmlnaW5hbEZhY2VzTWVzc2FnZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRmFjZXNNZXNzYWdlKHN1cGVyLmdldFNldmVyaXR5KCksIHN1cGVyLmdldFN1bW1hcnkoKSwgc3VwZXIuZ2V0RGV0YWlsKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1BsYWNlTGFiZWxJbihGYWNlc01lc3NhZ2UgbmV3RmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbGFiZWwgPSBnZXRMYWJlbFRleHQoKTsNCi0NCi0gICAgICAgIGlmKGxhYmVsICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwobmV3RmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkTWVzc2FnZShTdHJpbmcgb3JpZ2luYWxNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIShvcmlnaW5hbE1lc3NhZ2UgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICBvcmlnaW5hbE1lc3NhZ2Uuc3RhcnRzV2l0aChNSVNTSU5HX1JFU09VUkNFX01BUktFUikgJiYNCi0gICAgICAgICAgICAgICAgb3JpZ2luYWxNZXNzYWdlLmVuZHNXaXRoKE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0TGFiZWwobGFiZWwpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDI4YzJlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgVHJpbmlkYWQgU3VwcG9ydCBNb2R1bGUgcHJvdmlkZXMgc3BlY2lhbCBUcmluaWRhZCBTdXBwb3J0IGZvciBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yLg0KLSAgICBGdXJ0aGVybW9yZSwgaXQgYWxsb3dzIHRvIGpvaW4gdGhlIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gbWVjaGFuaXNtIG9mIFRyaW5pZGFkLiBTYW1wbGUgdXNlLWNhc2U6IGFubm90YXRlIHlvdXIgbW9kZWwgd2l0aCBKUEEgMS4wIGFubm90YXRpb25zLCBiaW5kIHByb3BlcnRpZXMgdG8gSlNGIElucHV0IGNvbXBvbmVudHMgYW5kIGdldCBhdXRvbWF0aWMgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBqdXN0IGJ5IGFkZGluZyAzIEpBUiBmaWxlcyAoTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlLCBQcm9wZXJ0eSBWYWxpZGF0aW9uIGFuZCBUcmluaWRhZCBTdXBwb3J0KS4NCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEueCBhbmQgSlNGIDIueC4gQWxsIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3BvbS54bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZmZmZlOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQ29yZTwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjIuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvY29yZTwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvcmU8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvcmU8L3VybD4KLSAgICA8L3NjbT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkNGRjNC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4NCi0gICAgPGZhY3Rvcnk+DQotICAgICAgICA8cmVuZGVyLWtpdC1mYWN0b3J5Pm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXRGYWN0b3J5PC9yZW5kZXIta2l0LWZhY3Rvcnk+DQotICAgIDwvZmFjdG9yeT4NCi0NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkV4dFZhbFN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2Q1ZDFjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotDQotLyoqDQotICogZG9udCd0IG1vdmUgdG8gYW4gb3RoZXIgcGFja2FnZSEhIQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIEV4dFZhbEluZm9ybWF0aW9uDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FID0gRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJYTUxfUEFSQU1fUFJFRklYID0gRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gQ2xhc3NVdGlscy5nZXRKYXJWZXJzaW9uKEV4dFZhbEluZm9ybWF0aW9uLmNsYXNzKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ3VzdG9tSW5mb3JtYXRpb24uamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0N1c3RvbUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZGEzOWUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ3VzdG9tSW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkNCi1wdWJsaWMgZW51bSBDdXN0b21JbmZvcm1hdGlvbg0KLXsNCi0gICAgQkFTRV9QQUNLQUdFLA0KLQ0KLSAgICBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiwNCi0gICAgVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SLA0KLQ0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgsDQotICAgIFZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYLA0KLSAgICBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfUE9TVEZJWCwNCi0NCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NU0dfUkVTT0xWRVJfTkFNRV9NQVBQRVIsDQotICAgIE1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSLA0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUiwNCi0NCi0gICAgU1RBUlRVUF9MSVNURU5FUiwNCi0gICAgQ09NUE9ORU5UX0lOSVRJQUxJWkVSLA0KLSAgICBWQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgUFJPUEVSVFlfVkFMSURBVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IsDQotDQotICAgIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwNCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLA0KLSAgICBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLA0KLSAgICBWQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWSwNCi0gICAgVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWSwNCi0gICAgTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksDQotICAgIEZBQ0VTX01FU1NBR0VfRkFDVE9SWSwNCi0gICAgU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlksDQotDQotICAgIE1FU1NBR0VfQlVORExFX05BTUUsDQotICAgIFNUQVRJQ19TVFJBVEVHWV9NQVBQSU5HX1NPVVJDRSwNCi0NCi0gICAgTUVUQV9EQVRBX1NUT1JBR0VfRklMVEVSDQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0RlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYjNjNTQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyIGltcGxlbWVudHMgUHJvamVjdFN0YWdlUmVzb2x2ZXINCi17DQotICAgIHB1YmxpYyBQcm9qZWN0U3RhZ2UgZ2V0Q3VycmVudFByb2plY3RTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgdXNlIHRoZSBkZWZhdWx0IGV4dHZhbCBtZWNoYW5pc20gdG8gYXZvaWQgdG9vIGVhcmx5IGV2YWx1YXRpb24gd2l0aCBtb2phcnJhDQotICAgICAgICBTdHJpbmcgcmVzdWx0Ow0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcigiamF2YXguZmFjZXMuUFJPSkVDVF9TVEFHRSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVQcm9qZWN0U3RhZ2UoZ2V0RGVmYXVsdFByb2plY3RTdGFnZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsIHx8ICIiLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVQcm9qZWN0U3RhZ2UoZ2V0RGVmYXVsdFByb2plY3RTdGFnZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjcmVhdGVQcm9qZWN0U3RhZ2UoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShyZXN1bHQudHJpbSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFByb2plY3RTdGFnZSBjcmVhdGVQcm9qZWN0U3RhZ2UoUHJvamVjdFN0YWdlTmFtZSBwcm9qZWN0U3RhZ2VOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlKHByb2plY3RTdGFnZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgUHJvamVjdFN0YWdlTmFtZSBnZXREZWZhdWx0UHJvamVjdFN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldERlZmF1bHRTdGFnZU5hbWUoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyODk1YmYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5EZWZhdWx0RmFjdG9yeUZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIEV4dFZhbENvbnRleHQKLXsKLSAgICBwcml2YXRlIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgc3RhdGljIEV4dFZhbENvbnRleHQgZXh0VmFsQ29udGV4dDsKLQotICAgIC8vZG9uJ3QgdHJ5IHRvIHJlc29sdmUgaXQgZHluYW1pY2FsbHkgZS5nLiB2aWEgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gLSB0aGVyZSdzIGEgbW9qYXJyYSBpc3N1ZQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fRVhUVkFMX0NPTlRFWFRfQ0xBU1NfTkFNRSA9Ci0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmNsYXNzLmdldE5hbWUoKS5yZXBsYWNlKCIuY29yZS4iLCAiLmN1c3RvbS4iKTsKLQotICAgIHByaXZhdGUgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOwotICAgIHByaXZhdGUgRmFjdG9yeUZpbmRlciBmYWN0b3J5RmluZGVyID0gRGVmYXVsdEZhY3RvcnlGaW5kZXIuZ2V0SW5zdGFuY2UoKTsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFJlbmRlcmVySW50ZXJjZXB0b3I+IHJlbmRlcmVySW50ZXJjZXB0b3JzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBSZW5kZXJlckludGVyY2VwdG9yPigpOwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGRlbmllZEludGVyY2VwdG9ycyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIHByaXZhdGUgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyPiBwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycyA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI+KCk7Ci0KLSAgICBwcml2YXRlIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGdsb2JhbFByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgIHByaXZhdGUgTWFwPFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcywgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4+IHN0YXRpY0NvbmZpZ01hcAotICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMsIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+PigpOwotCi0gICAgcHJpdmF0ZSBFeHRWYWxDb250ZXh0SW50ZXJuYWxzIGNvbnRleHRIZWxwZXI7Ci0gICAgcHJpdmF0ZSBFeHRWYWxDb250ZXh0SW52b2NhdGlvbk9yZGVyQXdhcmVJbnRlcm5hbHMgaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyOwotCi0gICAgcHJvdGVjdGVkIEV4dFZhbENvbnRleHQoKQotICAgIHsKLSAgICAgICAgdGhpcy5jb250ZXh0SGVscGVyID0gbmV3IEV4dFZhbENvbnRleHRJbnRlcm5hbHMoKTsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIgPSBuZXcgRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzKHRoaXMuY29udGV4dEhlbHBlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFeHRWYWxDb250ZXh0IGdldENvbnRleHQoKQotICAgIHsKLSAgICAgICAgaWYgKGV4dFZhbENvbnRleHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZXh0VmFsQ29udGV4dCA9IG5ldyBFeHRWYWxDb250ZXh0KCk7Ci0KLSAgICAgICAgICAgIHRyeVRvQ3JlYXRlQ3VzdG9tRXh0VmFsQ29udGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBleHRWYWxDb250ZXh0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdHJ5VG9DcmVhdGVDdXN0b21FeHRWYWxDb250ZXh0KCkKLSAgICB7Ci0gICAgICAgIE9iamVjdCBjdXN0b21FeHRWYWxDb250ZXh0ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKENVU1RPTV9FWFRWQUxfQ09OVEVYVF9DTEFTU19OQU1FKTsKLQotICAgICAgICBpZiAoY3VzdG9tRXh0VmFsQ29udGV4dCBpbnN0YW5jZW9mIEV4dFZhbENvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4dFZhbENvbnRleHQgPSAoRXh0VmFsQ29udGV4dCkgY3VzdG9tRXh0VmFsQ29udGV4dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKQotICAgIHsKLSAgICAgICAgc2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcih2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKAotICAgICAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLCBib29sZWFuIGZvcmNlT3ZlcnJpZGUpCi0gICAgewotICAgICAgICBpZiAodGhpcy52aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyID09IG51bGwgfHwgZm9yY2VPdmVycmlkZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRoaXMubG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSAmJiB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyh2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmdldENsYXNzKCkgKyAiIGlzIHVzZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciA9IHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBnZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCkKLSAgICB7Ci0gICAgICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgcmVxdWVzdFNjb3BlZEludGVycHJldGVyID0gdGhpcy5jb250ZXh0SGVscGVyCi0gICAgICAgICAgICAgICAgLmdldFJlcXVlc3RTY29wZWRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7Ci0KLSAgICAgICAgaWYocmVxdWVzdFNjb3BlZEludGVycHJldGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZXF1ZXN0U2NvcGVkSW50ZXJwcmV0ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpcy52aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBGYWN0b3J5RmluZGVyCi0gICAgKi8KLSAgICBwdWJsaWMgRmFjdG9yeUZpbmRlciBnZXRGYWN0b3J5RmluZGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZhY3RvcnlGaW5kZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmFjdG9yeUZpbmRlcihGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIpCi0gICAgewotICAgICAgICBpZiAoZmFjdG9yeUZpbmRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZhY3RvcnlGaW5kZXIgPSBmYWN0b3J5RmluZGVyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKQotICAgIHsKLSAgICAgICAgc2V0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3Ioc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLCBib29sZWFuIGZvcmNlT3ZlcnJpZGUpCi0gICAgewotICAgICAgICBpZiAodGhpcy5za2lwVmFsaWRhdGlvbkV2YWx1YXRvciA9PSBudWxsIHx8IGZvcmNlT3ZlcnJpZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc0luZm9FbmFibGVkKCkgJiYgc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmdldENsYXNzKCkgKyAiIGlzIHVzZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMuc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IgPSBza2lwVmFsaWRhdGlvbkV2YWx1YXRvcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvciBnZXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcigpCi0gICAgewotICAgICAgICBpZiAodGhpcy5za2lwVmFsaWRhdGlvbkV2YWx1YXRvciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBza2lwVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YUVudHJ5IGVudHJ5KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpcy5za2lwVmFsaWRhdGlvbkV2YWx1YXRvcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJlbmRlcmVySW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8UmVuZGVyZXJJbnRlcmNlcHRvcj4gZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8UmVuZGVyZXJJbnRlcmNlcHRvcj4odGhpcy5yZW5kZXJlckludGVyY2VwdG9ycy52YWx1ZXMoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoRXh0VmFsQ29udGV4dC5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRoaXMuZGVuaWVkSW50ZXJjZXB0b3JzLmNvbnRhaW5zKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRoaXMucmVuZGVyZXJJbnRlcmNlcHRvcnMucHV0KHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpLCByZW5kZXJlckludGVyY2VwdG9yKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihDbGFzczw/IGV4dGVuZHMgUmVuZGVyZXJJbnRlcmNlcHRvcj4gcmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3MocmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKEV4dFZhbENvbnRleHQuY2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucmVuZGVyZXJJbnRlcmNlcHRvcnMucmVtb3ZlKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vaWYgYW4gaW50ZXJjZXB0b3IgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZCBzbyBmYXIsIGl0IHNob3VsZCBiZSBkZW5pZWQgYXQgZnV0dXJlIHJlZ2lzdHJhdGlvbnMKLSAgICBwdWJsaWMgdm9pZCBkZW55UmVuZGVyZXJJbnRlcmNlcHRvcihDbGFzczw/IGV4dGVuZHMgUmVuZGVyZXJJbnRlcmNlcHRvcj4gcmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3MocmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKEV4dFZhbENvbnRleHQuY2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghdGhpcy5kZW5pZWRJbnRlcmNlcHRvcnMuY29udGFpbnMocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZGVuaWVkSW50ZXJjZXB0b3JzLmFkZChyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVyZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IocmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENvbXBvbmVudEluaXRpYWxpemVycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENvbXBvbmVudEluaXRpYWxpemVyKENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRDb21wb25lbnRJbml0aWFsaXplcnMoKTsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIoY29tcG9uZW50SW5pdGlhbGl6ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPiBnZXRDb21wb25lbnRJbml0aWFsaXplcnMoKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRDb21wb25lbnRJbml0aWFsaXplcnMoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmdldENvbXBvbmVudEluaXRpYWxpemVycygpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcihWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcih2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4gZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmdldFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYWxsIGdsb2JhbCB2YWxpZGF0aW9uIGludGVyY2VwdG9ycwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBnZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBnZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IoQ2xhc3MgbW9kdWxlS2V5KQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc0Zvcihtb2R1bGVLZXkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhbGwgZ2xvYmFsIG1ldGEtZGF0YSBleHRyYWN0aW9uIGludGVyY2VwdG9ycwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnNGb3IoQ2xhc3MgbW9kdWxlS2V5KQotICAgIHsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLSAgICAgICAgaWYobW9kdWxlS2V5ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpLCBtb2R1bGVLZXkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnNXaXRoKHByb3BlcnRpZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnNXaXRoKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmxhenlJbml0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHJldHVybiB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5nZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnNXaXRoKHByb3BlcnRpZXMpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyPiBnZXRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIgcHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcikKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMuYWRkKHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogSW5mb3JtYXRpb25Qcm92aWRlckJlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dEhlbHBlci5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogU3RhdGljQ29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBnZXRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcyBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKCF0aGlzLnN0YXRpY0NvbmZpZ01hcC5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gc3RhdGljQ29uZmlnTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgICAgICB0aGlzLnN0YXRpY0NvbmZpZ01hcC5wdXQobmFtZSwgc3RhdGljQ29uZmlnTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGljQ29uZmlnTWFwLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcyBuYW1lLCBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IHN0YXRpY0NvbmZpZ0xpc3Q7Ci0gICAgICAgICAgICBpZiAoIXRoaXMuc3RhdGljQ29uZmlnTWFwLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRpY0NvbmZpZ0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICAgICAgICAgIHRoaXMuc3RhdGljQ29uZmlnTWFwLnB1dChuYW1lLCBzdGF0aWNDb25maWdMaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMuc3RhdGljQ29uZmlnTWFwLmdldChuYW1lKS5hZGQoc3RhdGljQ29uZmlnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogR2xvYmFsIHByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRHbG9iYWxQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFkZEdsb2JhbFByb3BlcnR5KG5hbWUsIHZhbHVlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRHbG9iYWxQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIGZvcmNlT3ZlcnJpZGUpCi0gICAgewotICAgICAgICBpZiAodGhpcy5nbG9iYWxQcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWZvcmNlT3ZlcnJpZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oIm92ZXJyaWRlIGdsb2JhbCBwcm9wZXJ0eSAnIiArIG5hbWUgKyAiJyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoSnNmUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5EZXZlbG9wbWVudCkgJiYgdGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCJnbG9iYWwgcHJvcGVydHkgWyIgKyBuYW1lICsgIl0gYWRkZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuZ2xvYmFsUHJvcGVydGllcy5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2xvYmFsUHJvcGVydGllcy5nZXQobmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dEludGVybmFscy5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dEludGVybmFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmNmZDVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnRlcm5hbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIHgueC4zCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBFeHRWYWxDb250ZXh0SW50ZXJuYWxzCi17Ci0gICAgYm9vbGVhbiBpc0NvbXBvbmVudEluaXRpYWxpemF0aW9uQWN0aXZhdGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAhInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ09NUE9ORU5UX0lOSVRJQUxJWkFUSU9OKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQotICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGluaXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbihNYXAgYXBwbGljYXRpb25NYXApCi0gICAgewotICAgICAgICBMaXN0PFN0cmluZz4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4pOwotICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMuYWRkKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkNVU1RPTV9CRUFOKTsKLQotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbjsKLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChpbmZvcm1hdGlvblByb3ZpZGVyQmVhbiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uTWFwLnB1dChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUsIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnlUb0luaXRDdXN0b21Db25maWd1cmVkSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWUoYXBwbGljYXRpb25NYXApOwotCi0gICAgICAgIGlmIChhcHBsaWNhdGlvbk1hcC5jb250YWluc0tleShJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBhcHBsaWNhdGlvbk1hcC5nZXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkKLSAgICB2b2lkIHRyeVRvSW5pdEN1c3RvbUNvbmZpZ3VyZWRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZShNYXAgYXBwbGljYXRpb25NYXApCi0gICAgewotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBiZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpCi0gICAgICAgICAgICAgICAgLmdldEJlYW4oSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQ1VTVE9NX0JFQU4ucmVwbGFjZSgiLiIsICJfIikpOwotCi0gICAgICAgIGlmIChiZWFuICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uTWFwLnB1dChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUsIGJlYW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQotICAgIHsKLSAgICAgICAgTWFwIGFwcGxpY2F0aW9uTWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uTWFwKCk7Ci0gICAgICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGJlYW4gPSAoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4pIGFwcGxpY2F0aW9uTWFwLmdldChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUpOwotCi0gICAgICAgIGlmIChiZWFuID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbml0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oYXBwbGljYXRpb25NYXApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgZ2V0UmVxdWVzdFNjb3BlZFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoCi0gICAgICAgICAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuY2xhc3MsIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSkKLSAgICAgICAgICAgICAgICAuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0SW52b2NhdGlvbk9yZGVyQXdhcmVJbnRlcm5hbHMuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTkzNjZjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSB4LnguMwotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBNYXA8Q2xhc3MsIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+PiBtb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4gdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPSBudWxsOwotICAgIHByaXZhdGUgTWFwPENsYXNzLCBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPj4gbW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPSBudWxsOwotICAgIHByaXZhdGUgTGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4gY29tcG9uZW50SW5pdGlhbGl6ZXJzID0gbnVsbDsKLQotICAgIHByaXZhdGUgRXh0VmFsQ29udGV4dEludGVybmFscyBjb250ZXh0SGVscGVyOwotCi0gICAgRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzKEV4dFZhbENvbnRleHRJbnRlcm5hbHMgY29udGV4dEhlbHBlcikKLSAgICB7Ci0gICAgICAgIHRoaXMuY29udGV4dEhlbHBlciA9IGNvbnRleHRIZWxwZXI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDb21wb25lbnRJbml0aWFsaXplcnMKLSAgICAgKi8KLSAgICB2b2lkIGFkZENvbXBvbmVudEluaXRpYWxpemVyKENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyKQotICAgIHsKLSAgICAgICAgdGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMuYWRkKGNvbXBvbmVudEluaXRpYWxpemVyKTsKLSAgICAgICAgc29ydENvbXBvbmVudEluaXRpYWxpemVycygpOwotICAgIH0KLQotICAgIExpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+IGdldENvbXBvbmVudEluaXRpYWxpemVycygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0SGVscGVyLmlzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25BY3RpdmF0ZWQoKSA/Ci0gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMgOiBuZXcgQXJyYXlMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPigpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycwotICAgICAqLwotICAgIHZvaWQgYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMuYWRkKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgIHNvcnRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgfQotCi0gICAgTGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+IGdldFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycwotICAgICAqLwotICAgIHZvaWQgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBpZiAocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uTW9kdWxlQXdhcmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlcyhwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgICAgICBzb3J0TW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlKG51bGwsIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsKLSAgICAgICAgICAgIHNvcnRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IGdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzRm9yKENsYXNzIG1vZHVsZUtleSkKLSAgICB7Ci0gICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+KCk7Ci0KLSAgICAgICAgcmVzdWx0LmFkZEFsbChnZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKSk7Ci0KLSAgICAgICAgaWYgKG1vZHVsZUtleSAhPSBudWxsICYmIHRoaXMubW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMuY29udGFpbnNLZXkobW9kdWxlS2V5KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0aGlzLm1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzLmdldChtb2R1bGVLZXkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdChyZXN1bHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckZvck1vZHVsZXMoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBDbGFzcyBtb2R1bGVLZXk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGN1cnJlbnRNb2R1bGVLZXkgOiAoKFZhbGlkYXRpb25Nb2R1bGVBd2FyZSkgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpLmdldE1vZHVsZUtleXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbW9kdWxlS2V5ID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUoY3VycmVudE1vZHVsZUtleSk7Ci0KLSAgICAgICAgICAgIGlmIChtb2R1bGVLZXkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUobW9kdWxlS2V5LCBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUoCi0gICAgICAgICAgICBDbGFzcyBtb2R1bGVLZXksIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgaWYgKG1vZHVsZUtleSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5hZGQocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCBhcyBnbG9iYWwgaW50ZXJjZXB0b3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdDsKLSAgICAgICAgICAgIGlmICh0aGlzLm1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzLmNvbnRhaW5zS2V5KG1vZHVsZUtleSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0ID0gdGhpcy5tb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5nZXQobW9kdWxlS2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPigpOwotICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMucHV0KG1vZHVsZUtleSwgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdC5hZGQocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCBmb3IgIiArIG1vZHVsZUtleS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMKLSAgICAgKi8KLSAgICB2b2lkIGFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgaWYobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uTW9kdWxlQXdhcmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlcyhtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgICAgICBzb3J0TW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlKG51bGwsIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsKLSAgICAgICAgICAgIHNvcnRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckZvck1vZHVsZXMoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBDbGFzcyBtb2R1bGVLZXk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGN1cnJlbnRNb2R1bGVLZXkgOiAoKFZhbGlkYXRpb25Nb2R1bGVBd2FyZSkgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpLmdldE1vZHVsZUtleXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbW9kdWxlS2V5ID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUoY3VycmVudE1vZHVsZUtleSk7Ci0KLSAgICAgICAgICAgIGlmIChtb2R1bGVLZXkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUobW9kdWxlS2V5LCBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUoCi0gICAgICAgICAgICBDbGFzcyBtb2R1bGVLZXksIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgaWYgKG1vZHVsZUtleSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5hZGQobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCBhcyBnbG9iYWwgaW50ZXJjZXB0b3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdDsKLSAgICAgICAgICAgIGlmICh0aGlzLm1vZHVsZVNwZWNpZmljTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLmNvbnRhaW5zS2V5KG1vZHVsZUtleSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0ID0gdGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5nZXQobW9kdWxlS2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QgPSBuZXcgQXJyYXlMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPigpOwotICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMucHV0KG1vZHVsZUtleSwgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdC5hZGQobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCBmb3IgIiArIG1vZHVsZUtleS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnNXaXRoKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+KCk7Ci0KLSAgICAgICAgcmVzdWx0LmFkZEFsbChnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKSk7Ci0KLSAgICAgICAgQ2xhc3MgbW9kdWxlS2V5ID0gdHJ5VG9SZXNvbHZlTW9kdWxlS2V5KHByb3BlcnRpZXMpOwotICAgICAgICBpZihtb2R1bGVLZXkgIT0gbnVsbCAmJiB0aGlzLm1vZHVsZVNwZWNpZmljTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLmNvbnRhaW5zS2V5KG1vZHVsZUtleSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5nZXQobW9kdWxlS2V5KSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdChyZXN1bHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ2xhc3MgdHJ5VG9SZXNvbHZlTW9kdWxlS2V5KE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIENsYXNzIG1vZHVsZUtleSA9IG51bGw7Ci0gICAgICAgIGlmKHByb3BlcnRpZXMgIT0gbnVsbCAmJiBwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IGZvdW5kVmFsdWUgPSBwcm9wZXJ0aWVzLmdldChWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBpZihmb3VuZFZhbHVlIGluc3RhbmNlb2YgQ2xhc3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9kdWxlS2V5ID0gKENsYXNzKWZvdW5kVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1vZHVsZUtleTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGluaXQKLSAgICAgKi8KLQotICAgIHZvaWQgbGF6eUluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGlmICh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMgPSBuZXcgQXJyYXlMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4oKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SKTsKLSAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQodGhpcy5jb250ZXh0SGVscGVyLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IpKTsKLQotICAgICAgICBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lIDogdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yID0KLSAgICAgICAgICAgICAgICAgICAgKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzLmFkZCh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGxhenlJbml0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4oKTsKLSAgICAgICAgbW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMgPSBuZXcgSGFzaE1hcDxDbGFzcywgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4+KCk7Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUik7Ci0gICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQodGhpcy5jb250ZXh0SGVscGVyLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IpKTsKLQotICAgICAgICBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsKLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSA6IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgPQotICAgICAgICAgICAgICAgICAgICAoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUpOwotCi0gICAgICAgICAgICBpZiAobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGxhenlJbml0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCkKLSAgICB7Ci0gICAgICAgIGlmIChjb21wb25lbnRJbml0aWFsaXplcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4oKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZCh0aGlzLmNvbnRleHRIZWxwZXIuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX0lOSVRJQUxJWkVSKSk7Ci0KLSAgICAgICAgQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXI7Ci0gICAgICAgIGZvciAoU3RyaW5nIGNvbXBvbmVudEluaXRpYWxpemVyTmFtZSA6IGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXIgPQotICAgICAgICAgICAgICAgICAgICAoQ29tcG9uZW50SW5pdGlhbGl6ZXIpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjb21wb25lbnRJbml0aWFsaXplck5hbWUpOwotCi0gICAgICAgICAgICBpZiAoY29tcG9uZW50SW5pdGlhbGl6ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKGNvbXBvbmVudEluaXRpYWxpemVyKTsKLQotICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShjb21wb25lbnRJbml0aWFsaXplci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGxhenlJbml0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4oKTsKLSAgICAgICAgbW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPSBuZXcgSGFzaE1hcDxDbGFzcywgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4+KCk7Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICB2YWxpZGF0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1BST1BFUlRZX1ZBTElEQVRJT05fSU5URVJDRVBUT1IpOwotICAgICAgICB2YWxpZGF0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZCh0aGlzLmNvbnRleHRIZWxwZXIuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5QUk9QRVJUWV9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SKSk7Ci0KLSAgICAgICAgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25JbnRlcmNlcHRvck5hbWUgOiB2YWxpZGF0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgIChQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodmFsaWRhdGlvbkludGVyY2VwdG9yTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBpbnN0YW5jZW9mIFZhbGlkYXRpb25Nb2R1bGVBd2FyZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlcyhwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlKG51bGwsIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHNvcnQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc29ydENvbXBvbmVudEluaXRpYWxpemVycygpCi0gICAgewotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRoaXMuY29tcG9uZW50SW5pdGlhbGl6ZXJzLCBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxDb21wb25lbnRJbml0aWFsaXplcj4oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNvcnRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0aGlzLnByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycywKLSAgICAgICAgICAgICAgICBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4oKSk7Ci0gICAgfQotCi0gICAgLy9zb3J0IGFsbCAtIGl0IGlzbid0IGEgaHVnZSBvdmVyaGVhZCBzaW5jZSBpdCdzIGp1c3QgZG9uZSBkdXJpbmcgdGhlIGluaXQtcGhhc2UKLSAgICBwcml2YXRlIHZvaWQgc29ydE1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGZvcihMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QgOgotICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMudmFsdWVzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNvcnRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdCgKLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdCkKLSAgICB7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0LAotICAgICAgICAgICAgICAgICAgICBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4oKSk7Ci0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc29ydFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMsCi0gICAgICAgICAgICAgICAgbmV3IEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRoaXMubWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLAotICAgICAgICAgICAgICAgIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPigpKTsKLSAgICB9Ci0KLSAgICAvL3NvcnQgYWxsIC0gaXQgaXNuJ3QgYSBodWdlIG92ZXJoZWFkIHNpbmNlIGl0J3MganVzdCBkb25lIGR1cmluZyB0aGUgaW5pdC1waGFzZQotICAgIHByaXZhdGUgdm9pZCBzb3J0TW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgZm9yKExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdCA6Ci0gICAgICAgICAgICAgICAgdGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy52YWx1ZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBzb3J0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0KAotICAgICAgICAgICAgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0KQotICAgIHsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPigpKTsKLQotICAgICAgICByZXR1cm4gbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU1ODdhNS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFyZW4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICogKyBzb21lIG9mIHRoZW0gY2FuIGJlIGN1c3RvbWl6ZWQgd2l0aGluIGEgY3VzdG9tIGltcGwuIG9mIHRoZSBiZWFuDQotICogKGV4dGVuZCB0aGlzIGNsYXNzIGFuZCBwcm92aWRlIGl0IHZpYSBjb252ZW50aW9uIG9yIHdlYi54bWwpDQotICogPHAvPg0KLSAqIHRoZSBzdGF0aWMgYXBpIHNob3VsZCBvbmx5IGJlIHVzZWQNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSSwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVBTl9OQU1FID0gRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUNCi0gICAgICAgICsgIi4iICsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICAvL2N1c3RvbSBjbGFzcyB3aGljaCBpcyBhbiBvcHRpb25hbCByZXBsYWNlbWVudCBmb3IgdGhpcyBjbGFzcyAoaGFzIHRvIGV4dGVuZCB0aGlzIGNsYXNzKQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQkVBTiA9IChFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRQ0KLSAgICAgICAgKyAiLmN1c3RvbS4iICsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsNCi0NCi0gICAgcHVibGljIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHNldHVwQ3VzdG9taXphYmxlSW5mb3JtYXRpb24oKTsNCi0gICAgICAgIGFwcGx5Q3VzdG9tVmFsdWVzKHRoaXMuY3VzdG9taXphYmxlSW5mb3MpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPEN1c3RvbUluZm9ybWF0aW9uLCBTdHJpbmc+IGN1c3RvbWl6YWJsZUluZm9zID0gbmV3IEhhc2hNYXA8Q3VzdG9tSW5mb3JtYXRpb24sIFN0cmluZz4oKTsNCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwQ3VzdG9taXphYmxlSW5mb3JtYXRpb24oKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgYmFzZVBhY2thZ2UgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0JBU0VfUEFDS0FHRTsNCi0NCi0gICAgICAgIGlmIChiYXNlUGFja2FnZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VQYWNrYWdlID0gRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgKyAiLmN1c3RvbS4iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFiYXNlUGFja2FnZS5lbmRzV2l0aCgiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VQYWNrYWdlID0gYmFzZVBhY2thZ2UgKyAiLiI7DQotICAgICAgICB9DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQkFTRV9QQUNLQUdFLCBiYXNlUGFja2FnZSk7DQotICAgICAgICANCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiwNCi0gICAgICAgICAgICAgICAgIkNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFUcmFuc2Zvcm1lciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX0lOSVRJQUxJWkVSLA0KLSAgICAgICAgICAgICAgICAiQ29tcG9uZW50SW5pdGlhbGl6ZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlBST1BFUlRZX1ZBTElEQVRJT05fSU5URVJDRVBUT1IsDQotICAgICAgICAgICAgICAgICJQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01TR19SRVNPTFZFUl9OQU1FX01BUFBFUiwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIsDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVJUVVBfTElTVEVORVIsDQotICAgICAgICAgICAgICAgICJTdGFydHVwTGlzdGVuZXIiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkZBQ0VTX01FU1NBR0VfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIkZhY2VzTWVzc2FnZUZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIlN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSIpOw0KLQ0KLSAgICAgICAgLy9jb252ZW50aW9ucyAodGhlIHJlc3Qgb2YgdGhlIGNvbnZlbnRpb25zIGFyZSBidWlsdCB3aXRoIHRoZSBoZWxwIG9mIG5hbWUgbWFwcGVycywuLi4NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX0JVTkRMRV9OQU1FLA0KLSAgICAgICAgICAgICAgICAidmFsaWRhdGlvbl9tZXNzYWdlcyIpOw0KLSAgICAgICAgLy9zdGF0aWMgc3RyYXRlZ3kgbWFwcGluZ3MgKG5hbWUgb2YgcHJvcGVydHkgZmlsZXMpDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFLA0KLSAgICAgICAgICAgICAgICAic3RyYXRlZ3lfbWFwcGluZ3MiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIsDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIiKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pDQotICAgIHByb3RlY3RlZCB2b2lkIGFwcGx5Q3VzdG9tVmFsdWVzKE1hcDxDdXN0b21JbmZvcm1hdGlvbiwgU3RyaW5nPiBtYXApDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgdG8gY3VzdG9taXplIGluZm9ybWF0aW9uDQotICAgIH0NCi0NCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXQoQ3VzdG9tSW5mb3JtYXRpb24gY3VzdG9tSW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGN1c3RvbWl6YWJsZUluZm9zLmdldChjdXN0b21JbmZvcm1hdGlvbik7DQotDQotICAgICAgICBzd2l0Y2ggKGN1c3RvbUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNhc2UgQkFTRV9QQUNLQUdFOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgKiBwb3N0Zml4IHVzZWQgYnkgdGhlIFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi0gICAgICAgICAgICAgKiB0aGUgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBpcyBmb3IgY3VzdG9tIHN0cmF0ZWdpZXMgb25seQ0KLSAgICAgICAgICAgICAqIChub3QgZm9yIHB1YmxpYyB2YWxpZGF0aW9uIG1vZHVsZXMpDQotICAgICAgICAgICAgICogc28gaXQncyBmaW5lIHRvIGN1c3RvbWl6ZSBpdA0KLSAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgY2FzZSBWQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVg6DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0NCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9taXphYmxlSW5mb3MuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkJBU0VfUEFDS0FHRSkgKyB2YWx1ZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5Zjg2OS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2R1bGVNZXNzYWdlQnVuZGxlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuZXdQYWNrYWdlTmFtZTsNCi0gICAgICAgIGlmIChwYWNrYWdlTmFtZS5lbmRzV2l0aCgiLnJlc29sdmVyIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgbmV3UGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZS5yZXBsYWNlKCIucmVzb2x2ZXIiLCAiLmJ1bmRsZSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5ld1BhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUucmVwbGFjZSgiLnJlc29sdmVyLiIsICIuYnVuZGxlLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG5ld1BhY2thZ2VOYW1lICsgIi52YWxpZGF0aW9uX21lc3NhZ2VzIjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKA0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsICIubWVzc2FnZS5yZXNvbHZlci4iLCB0YXJnZXRDbGFzc05hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoDQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgU3RyaW5nIHRhcmdldENsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgIi5tZXRhZGF0YS50cmFuc2Zvcm1lci4iLCB0YXJnZXRDbGFzc05hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UGFja2FnZU5hbWUsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXROYW1lKCk7DQotDQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUucmVwbGFjZSgiLnN0cmF0ZWd5LiIsIHRhcmdldFBhY2thZ2VOYW1lKTsNCi0NCi0gICAgICAgIGlmICh0YXJnZXRDbGFzc05hbWUgPT0gbnVsbCB8fCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSkgKyAiLiIgKyB0YXJnZXRDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHVzZSBhIGN1c3RvbSBuYW1lIG1hcHBlciB0byBpbXBsZW1lbnQgY3VzdG9tIGNvbnZlbnRpb25zDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgIlZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB1c2UgYSBjdXN0b20gbmFtZSBtYXBwZXIgdG8gaW1wbGVtZW50IGN1c3RvbSBjb252ZW50aW9ucw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5LnJlcGxhY2UoIi5hbm5vdGF0aW9uLiIsICIuc3RyYXRlZ3kuIikgKyAiU3RyYXRlZ3kiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgIk1ldGFEYXRhVHJhbnNmb3JtZXIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0YXJnZXRQb3N0Zml4KQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5lbmRzV2l0aCgiVmFsaWRhdGlvblN0cmF0ZWd5IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneU5hbWUuc3Vic3RyaW5nKDAsIHZhbGlkYXRpb25TdHJhdGVneU5hbWUubGVuZ3RoKCkgLSAxOCkgKyB0YXJnZXRQb3N0Zml4Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5lbmRzV2l0aCgiU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5zdWJzdHJpbmcoMCwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5sZW5ndGgoKSAtIDgpICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWRiOWEwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7DQotDQotQFRhcmdldChUWVBFKQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLS8qKg0KLSAqIGFsbG93ZWQgdG8gdXNlIGZvciBjbGFzc2VzIHdoaWNoIGltcGxlbWVudCBpbnRlcmZhY2VzIHdoaWNoIGhhdmUgdGhlIG1hcmtlciBASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLSAqDQotICogc3VnZ2VzdGVkIHJhbmdlcyAobWFpbmx5IGZvciBuYW1lLW1hcHBlcnMpOg0KLSAqIG5lZ2F0aXZlIHZhbHVlcyBmb3IgImV4dHJlbWUiIGNhc2VzDQotICoNCi0gKiAwLTQ5IGZvciBjdXN0b20gYXJ0aWZhY3RzIHdoaWNoIHNob3VsZCBoYXZlIHRoZSBoaWdoZXN0IHByaW9yaXR5DQotICogNTAtOTkgZm9yIGFkZC1vbnMgd2hpY2ggcHJvdmlkZSBhcnRpZmFjdHMgd2hpY2ggc2hvdWxkIGhhdmUgYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGUgZGVmYXVsdCBhcnRpZmFjdHMNCi0gKiAxMDAtOTk5IGludGVybmFsIGFydGlmYWN0cw0KLSAqIDEwMDArIGZvciBjdXN0b20gYXJ0aWZhY3RzDQotICoNCi0gKiBzdWdnZXN0ZWQgcmFuZ2VzIGZvciBhcnRpZmFjdHMgbGlrZSBpbnRlcmNlcHRvcnMsLi4uDQotICogMXh4IC4uLiBhcnRpZmFjdHMgb2YgdGhlIGNvcmUNCi0gKiAyeHggLi4uIGFydGlmYWN0cyBvZiB2YWxpZGF0aW9uIG1vZHVsZXMNCi0gKiAzeHggLi4uIGFydGlmYWN0cyBvZiBjb21wb25lbnQgc3VwcG9ydCBtb2R1bGVzDQotICoNCi0gKiBhIHByaW9yaXR5IHNob3VsZCBiZSB1bmlxdWUgd2l0aGluIG9uZSBhcnRpZmFjdC10eXBlIC0gdGhhdCBtZWFucw0KLSAqIGlmIGEgbmFtZS1tYXBwZXIgaGFzIHByaW9yaXR5IDEwMCwgaXQncyBvayB0aGF0IGFuIGV4Y2VwdGlvbi1pbnRlcmNlcHRvciBhbHNvIGhhcyBwcmlvcml0eSAxMDAuDQotICogYnV0IGEgMm5kIG5hbWUtbWFwcGVyIHNob3VsZG4ndCBoYXZlIHByaW9yaXR5IDEwMA0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgSW52b2NhdGlvbk9yZGVyDQotew0KLSAgICAvKioNCi0gICAgICogZGVmYXVsdCBwcmlvcml0eSBmb3IgY3VzdG9tIGFydGlmYWN0cyAoaWYgdGhleSBzaG91bGQgZ2V0IGFkZGVkIGFmdGVyIHRoZSBpbnRlcm5hbCB2ZXJzaW9ucw0KLSAgICAgKiBAcmV0dXJuIHRoZSBwcmlvcml0eSBvZiBhbiBhcnRpZmFjdCBhbm5vdGF0ZWQgd2l0aCB0aGlzIGFubm90YXRpb24NCi0gICAgICovDQotICAgIGludCB2YWx1ZSgpIGRlZmF1bHQgMTAwMDsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTg1NTIyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlckNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8VD4gaW1wbGVtZW50cyBDb21wYXJhdG9yPFQ+DQotew0KLSAgICBwdWJsaWMgaW50IGNvbXBhcmUoVCBubTEsIFQgbm0yKQ0KLSAgICB7DQotICAgICAgICBpZiAoaGFzUHJpb3JpdHkobm0xKSAmJiBoYXNQcmlvcml0eShubTIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBpc1ByaW9yaXR5SGlnaGVyKG5tMS5nZXRDbGFzcygpLmdldEFubm90YXRpb24oSW52b2NhdGlvbk9yZGVyLmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgIG5tMi5nZXRDbGFzcygpLmdldEFubm90YXRpb24oSW52b2NhdGlvbk9yZGVyLmNsYXNzKSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWhhc1ByaW9yaXR5KG5tMSkgJiYgIWhhc1ByaW9yaXR5KG5tMikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gaGFzUHJpb3JpdHkobm0xKSA/IC0xIDogMTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGludCBpc1ByaW9yaXR5SGlnaGVyKEludm9jYXRpb25PcmRlciBwcmlvcml0eTEsIEludm9jYXRpb25PcmRlciBwcmlvcml0eTIpDQotICAgIHsNCi0gICAgICAgIGlmIChwcmlvcml0eTEudmFsdWUoKSA9PSBwcmlvcml0eTIudmFsdWUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBwcmlvcml0eTEudmFsdWUoKSA8IHByaW9yaXR5Mi52YWx1ZSgpID8gLTEgOiAxOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNQcmlvcml0eShPYmplY3Qgbm0pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBubS5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoSW52b2NhdGlvbk9yZGVyLmNsYXNzKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXJTdXBwb3J0LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXJTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMzRlNzkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi0NCi1AVGFyZ2V0KFRZUEUpDQotQERvY3VtZW50ZWQNCi0vKioNCi0gKiBtYXJrZXIgYW5ub3RhdGlvbiBmb3IgZWFzaWVyIHVzYWdlDQotICogaXQgbWFya3MgaW50ZXJmYWNlcyAtIGluc3RhbmNlcyBvZiBjbGFzc2VzIGltcGxlbWVudGluZyB0aGVzZSBpbnRlcmZhY2VzIHdpbGwgYmUgc29ydGVkDQotICogQHNlZSBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotew0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Kc2ZQcm9qZWN0U3RhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0pzZlByb2plY3RTdGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzU4OTBiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0pzZlByb2plY3RTdGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBwcm9qZWN0IHN0YWdlIGVxdWl2YWxlbnQgdG8ganNmIDIuMA0KLSAqIGV4dHZhbCAyLnggaGFzIGEgc3BlY2lhbCByZXNvbHZlciB3aGljaCByZWRpcmVjdHMgdGhlIGNhbGwgdG8gdGhlIG5ldyBqc2YgYXBpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBlbnVtIEpzZlByb2plY3RTdGFnZQ0KLXsNCi0gICAgRGV2ZWxvcG1lbnQoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZSgiRGV2ZWxvcG1lbnQiKSksDQotICAgIFVuaXRUZXN0KFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoIlVuaXRUZXN0IikpLA0KLSAgICBTeXN0ZW1UZXN0KFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoIlN5c3RlbVRlc3QiKSksDQotICAgIFByb2R1Y3Rpb24oUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZSgiUHJvZHVjdGlvbiIpKTsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0U3RhZ2VOYW1lIHZhbHVlOw0KLQ0KLSAgICBKc2ZQcm9qZWN0U3RhZ2UoUHJvamVjdFN0YWdlTmFtZSB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpcyhKc2ZQcm9qZWN0U3RhZ2UganNmUHJvamVjdFN0YWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUHJvamVjdFN0YWdlLmlzKGpzZlByb2plY3RTdGFnZS5nZXRWYWx1ZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvamVjdFN0YWdlTmFtZSBnZXRWYWx1ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnZhbHVlOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL05lc3RlZC5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvTmVzdGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNjkxZTguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvTmVzdGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi0NCi0vKioNCi0gKiBtYXJrZXIgYW5ub3RhdGlvbiBlLmcuIHRvIG1hcmsgc3ViLW5hbWUtbWFwcGVycw0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBOZXN0ZWQNCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1BoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9QaGFzZUlkUmVjb3JkaW5nUGhhc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjk1NTQyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1BoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5GYWNlc0luZm9ybWF0aW9uU3RvcmFnZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi0NCi0vKioNCi0gKiBlLmcuIHRvIGFsbG93IGluIG1ldGFkYXRhIGV4dHJhY3Rpb24gaW50ZXJjZXB0b3JzIHRvIGtub3cgaWYgdGhleSBhcmUgaW52b2tlZCBkdXJpbmcgdmFsaWRhdGlvbiBvcg0KLSAqIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbiAoaWYgbmVlZGVkKQ0KLSAqIGV4YW1wbGU6IGNsaWVudC1zaWRlIHZhbGlkYXRpb24gLSBzb21lIGZ1bmN0aW9uYWxpdHkgc2hvdWxkbid0IGJlIHByb2Nlc3NlZCBkdXJpbmcgcmVuZGVyaW5nDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQaGFzZUlkUmVjb3JkaW5nUGhhc2VMaXN0ZW5lciBpbXBsZW1lbnRzIFBoYXNlTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI3OTEyNDA1MTQwMTQ4Njc0NTdMOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgcGhhc2VFdmVudCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgcGhhc2VFdmVudCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UgZmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UgPSBFeHRWYWxVdGlscw0KLSAgICAgICAgICAgICAgICAuZ2V0U3RvcmFnZShGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5jbGFzcywgRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLnNldEN1cnJlbnRQaGFzZUlkKHBoYXNlRXZlbnQuZ2V0UGhhc2VJZCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuQU5ZX1BIQVNFOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKHRoaXMgPT0gbykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBQaGFzZUlkUmVjb3JkaW5nUGhhc2VMaXN0ZW5lcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmE0NDRkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotLyoqDQotICogZXh0ZW5zaWJsZSBwcm9qZWN0IHN0YWdlIGltcGxlbWVudGF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0U3RhZ2UNCi17DQotICAgIHByaXZhdGUgUHJvamVjdFN0YWdlTmFtZSB2YWx1ZTsNCi0NCi0gICAgcHJpdmF0ZSBQcm9qZWN0U3RhZ2UoUHJvamVjdFN0YWdlTmFtZSB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdFN0YWdlTmFtZSBjcmVhdGVTdGFnZU5hbWUoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVQcm9qZWN0U3RhZ2VOYW1lKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdFN0YWdlIGNyZWF0ZVN0YWdlKFByb2plY3RTdGFnZU5hbWUgbmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBQcm9qZWN0U3RhZ2UobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzKFByb2plY3RTdGFnZU5hbWUgcHJvamVjdFN0YWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0Q3VycmVudFByb2plY3RTdGFnZSgpLmVxdWFscyhwcm9qZWN0U3RhZ2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFByb2plY3RTdGFnZU5hbWUgZ2V0Q3VycmVudFByb2plY3RTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIC8vc2V0IFByb2plY3RTdGFnZVJlc29sdmVyIHRvIG51bGwgdG8gdHdlYWsgdGhlIHBlcmZvcm1hbmNlDQotICAgICAgICBPYmplY3QgcHJvamVjdFN0YWdlUmVzb2x2ZXIgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0R2xvYmFsUHJvcGVydHkoUHJvamVjdFN0YWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGlmKHByb2plY3RTdGFnZVJlc29sdmVyIGluc3RhbmNlb2YgUHJvamVjdFN0YWdlUmVzb2x2ZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICgoUHJvamVjdFN0YWdlUmVzb2x2ZXIpcHJvamVjdFN0YWdlUmVzb2x2ZXIpLmdldEN1cnJlbnRQcm9qZWN0U3RhZ2UoKS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldERlZmF1bHRTdGFnZU5hbWUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvamVjdFN0YWdlTmFtZSBnZXRWYWx1ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnZhbHVlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZU5hbWUuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZU5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQyMmI4Ni4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBQcm9qZWN0U3RhZ2VOYW1lDQotew0KLSAgICBTdHJpbmcgZ2V0TmFtZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvamVjdFN0YWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ0ZjI3YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvamVjdFN0YWdlUmVzb2x2ZXINCi17DQotICAgIFByb2plY3RTdGFnZSBnZXRDdXJyZW50UHJvamVjdFN0YWdlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1ZhbGlkYXRpb25Nb2R1bGVBd2FyZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvVmFsaWRhdGlvbk1vZHVsZUF3YXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NDIwZjUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvVmFsaWRhdGlvbk1vZHVsZUF3YXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGlmIGFuIGFydGlmYWN0ICh3aGljaCBzdXBwb3J0cyB0aGlzIGNvbmNlcHQpIHNob3VsZCBiZSB1c2VkIGp1c3QgZm9yIGEvc29tZSBzcGVjaWZpYyBtb2R1bGUocyksDQotICogdGhlIGFydGlmYWN0IGhhcyB0byBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvbk1vZHVsZUF3YXJlDQotew0KLSAgICAvKioNCi0gICAgICogZHVyaW5nIHRoZSByZWdpc3RyYXRpb24gcHJvY2VzcyB0aGUgaW5mb3JtYXRpb24gZ2V0cyBldmFsdWF0ZWQ8YnIvPg0KLSAgICAgKiBpbnN0ZWFkIG9mIGEgY2xhc3MgYXJyYXkgYSBzdHJpbmcgYXJyYXkgaXMgdXNlZCBzbyB0aGF0IGl0J3MgcG9zc2libGUgdG8gaW1wbGVtZW50DQotICAgICAqIGFuIGFydGlmYWN0IGZvciBkaWZmZXJlbnQgbW9kdWxlcy4gaWYgYW4gYWRkLW9uIHJlc3RyaWN0cyBhbiBhcnRpZmFjdCB0byBzcGVjaWZpYyBtb2R1bGVzLA0KLSAgICAgKiBub3QgYWxsIG1vZHVsZXMgaGF2ZSB0byBiZSB1c2VkIGJ5IHRoZSB3ZWJhcHAuIGlmIGEgbW9kdWxlIGtleSBpcyB1bmtub3duLCB0aGUgYXJ0aWZhY3Qgd29uJ3QgZ2V0IHJlZ2lzdGVyZWQNCi0gICAgICogZm9yIHRoaXMgbW9kdWxlLiBpZiBhbiBhcnRpZmFjdCBkb2Vzbid0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgaXQgZ2V0cyByZWdpc3RlcmVkIGZvciBhbGwgbW9kdWxlcw0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lcyBvZiB0aGUgbW9kdWxlIGtleXMNCi0gICAgICovDQotICAgIFN0cmluZ1tdIGdldE1vZHVsZUtleXMoKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvVmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvVmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDUzNDBkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1ZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLQ0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi0vKioNCi0gKiBtYXJrZXIgYW5ub3RhdGlvbiBmb3IgbW9kdWxlIGtleXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFZhbGlkYXRpb25Nb2R1bGVLZXkNCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MzFhYmUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcmVuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgLyoNCi0gICAgICogbWlzYw0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVTU0FHRV9CVU5ETEUgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVNTQUdFX0JVTkRMRSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX1BBQ0tBR0UgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9CQVNFX1BBQ0tBR0UiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fSU5GT1JNQVRJT05fUFJPVklERVJfQkVBTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OX1NUUkFURUdZX01BUFBJTkciKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fUFJPUEVSVFlfVkFMSURBVElPTl9JTlRFUkNFUFRPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1BST1BFUlRZX1ZBTElEQVRJT05fSU5URVJDRVBUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9QUk9YWV9IRUxQRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9QUk9YWV9IRUxQRVIiKTsNCi0NCi0gICAgLyoNCi0gICAgICogbmFtZSBtYXBwZXINCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIiKTsNCi0NCi0gICAgLyoNCi0gICAgICogZmlsdGVyDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIiKTsNCi0gICAgDQotICAgIC8qDQotICAgICAqIGZhY3Rvcmllcw0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9GQUNFU19NRVNTQUdFX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9GQUNFU19NRVNTQUdFX0ZBQ1RPUlkiKTsNCi0NCi0gICAgLyoNCi0gICAgICogYWN0aXZhdGUNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZBVEVfUkVRVUlSRURfSU5JVElBTElaQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkFDVElWQVRFX1JFUVVJUkVEX0lOSVRJQUxJWkFUSU9OIik7DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBkZWFjdGl2YXRlDQotICAgICAqLw0KLSAgICBARGVwcmVjYXRlZA0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfUkVOREVSS0lUID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1JFTkRFUktJVCIpOw0KLQ0KLSAgICAvL2N1cnJlbnRseSBqdXN0IHVzZWQgYnkgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0RFRkFVTFRfQ09OVkVOVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT04iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0RFRkFVTFRfTkFNRV9NQVBQRVJTID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0RFRkFVTFRfTkFNRV9NQVBQRVJTIik7DQotICAgIA0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfRUxfUkVTT0xWRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfRUxfUkVTT0xWRVIiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0NPTVBPTkVOVF9JTklUSUFMSVpBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9DT01QT05FTlRfSU5JVElBTElaQVRJT04iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX1ZBTElEQVRJT05fUEFSQU1FVEVSUyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9WQUxJREFUSU9OX1BBUkFNRVRFUlMiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX1JFTkRFUl9LSVRfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9SRU5ERVJfS0lUX0ZBQ1RPUlkiKTsNCi0NCi0gICAgLy90aGVyZSBpcyBub3RoaW5nIGxpa2UgREVBQ1RJVkFURV9ERUZBVUxUX1ZBTElEQVRJT05fSU5URVJDRVBUT1INCi0gICAgLy91c2UgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZGVueVJlbmRlcmVySW50ZXJjZXB0b3IoLi4uKSB3aXRoaW4gYW4gZXh0dmFsLVN0YXJ0dXBMaXN0ZW5lcg0KLQ0KLSAgICAvKg0KLSAgICAgKiBzcGVjIHBhcmFtZXRlcnMNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJQUkVUX0VNUFRZX1NUUklOR19TVUJNSVRURURfVkFMVUVTX0FTX05VTEwgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoImphdmF4LmZhY2VzIiwgIklOVEVSUFJFVF9FTVBUWV9TVFJJTkdfU1VCTUlUVEVEX1ZBTFVFU19BU19OVUxMIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVEVfRU1QVFlfRklFTERTID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJqYXZheC5mYWNlcyIsICJWQUxJREFURV9FTVBUWV9GSUVMRFMiKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0Fic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNDNmMjUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBkZXRhaWxzDQotICogQHNlZSBEZWZhdWx0RUxIZWxwZXINCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5IGN1c3RvbUVMSGVscGVyRmFjdG9yeTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21FTEhlbHBlckZhY3RvcnkoQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkgZWxIZWxwZXJGYWN0b3J5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmN1c3RvbUVMSGVscGVyRmFjdG9yeSA9IGVsSGVscGVyRmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgZmluYWwgRUxIZWxwZXIgY3JlYXRlKCkNCi0gICAgew0KLSAgICAgICAgRUxIZWxwZXIgcmVzdWx0ID0gbnVsbDsNCi0NCi0gICAgICAgIGlmKHRoaXMuY3VzdG9tRUxIZWxwZXJGYWN0b3J5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5jdXN0b21FTEhlbHBlckZhY3RvcnkuY3JlYXRlRUxIZWxwZXIoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVFTEhlbHBlcigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRUxIZWxwZXIgY3JlYXRlRUxIZWxwZXIoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYwZTgzNi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsNCi1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7DQotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBpbiBvcmRlciB0byBjZW50cmFsaXplIHRoZSBqc2YgdmVyc2lvbiBkZXBlbmRlbmN5IHdpdGhpbiB0aGUgY29yZQ0KLSAqDQotICogdGhpcyBlbC1oZWxwZXIgc3VwcG9ydHMganNwIGFuZCBmYWNlbGV0cyAodGVzdGVkIHdpdGggMS4xLjE0KQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotLyoNCi0gKiB0aGVyZSBpcyBhIHNwZWNpYWwgZmFjZWxldHMgd29ya2Fyb3VuZCBmb3IgZWwtZXhwcmVzc2lvbnMgb2YgY3VzdG9tIGNvbXBvbmVudHMNCi0gKiBpdCdzIHBsdWdnYWJsZSBpbiBvcmRlciB0byBzdXBwb3J0IHNwZWNpYWwgbWVjaGFuaXNtcyBvZiBkaWZmZXJlbnQgdGVjaG5vbG9naWVzICh0aGFuIGpzcCBhbmQgZmFjZWxldHMpDQotICogc28geW91IGNhbiBwbHVnIGluIHlvdXIgb3duIGltcGwuIHdoaWNoIGltcGxlbWVudHMgYSBjdXN0b20gd29ya2Fyb3VuZCAobGlrZSB0aGUgZmFjZWxldHMgd29ya2Fyb3VuZCBvZiB0aGlzIGltcGwuKQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRFTEhlbHBlciBpbXBsZW1lbnRzIEVMSGVscGVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9FTF9SRVNPTFZFUiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0VMX1JFU09MVkVSOw0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdEVMSGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIC8vZHVlIHRvIGEgcmVzdHJpY3Rpb24gd2l0aCB0aGUgcmkNCi0gICAgICAgIE9iamVjdCBiZWFuID0gZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIHJldHVybiAoYmVhbiAhPSBudWxsKSA/IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoYmVhbi5nZXRDbGFzcygpKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRCZWFuKFN0cmluZyBiZWFuTmFtZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIHJldHVybiBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5nZXRFTFJlc29sdmVyKCkuZ2V0VmFsdWUoZmFjZXNDb250ZXh0LmdldEVMQ29udGV4dCgpLCBudWxsLCBiZWFuTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uICE9IG51bGwpID8gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZXZhbHVhdGVFeHByZXNzaW9uR2V0KA0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksIE9iamVjdC5jbGFzcykgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmV2YWx1YXRlRXhwcmVzc2lvbkdldChmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIE9iamVjdC5jbGFzcyk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQsIGJvb2xlYW4gYWxsb3dCbGFua0NoYXJhY3RlcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIC8vZm9yIGlucHV0IGNvbXBvbmVudHMgd2l0aG91dCB2YWx1ZS1iaW5kaW5nDQotICAgICAgICAvLyhlLmcuIGZvciBzcGVjaWFsIGNvbXBvbmVudCBsaWJzIC0+IGlzc3VlIHdpdGggRXh0VmFsUmVuZGVyZXJXcmFwcGVyI2VuY29kZUJlZ2luKQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudC5nZXRDbGFzcygpICsgIiBoYXMgbm8gdmFsdWUgYmluZGluZyAtIGNvbXBvbmVudCBpZDogIiArIHVpQ29tcG9uZW50LmdldElkKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKCFhbGxvd0JsYW5rQ2hhcmFjdGVycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlKCIgIiwgIiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pLmdldEJhc2VFeHByZXNzaW9uKCkpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXN1bHQgPSBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuDQotICAgICAgICAgICAgICAgIHRyeVRvQ3JlYXRlVmFsdWVCaW5kaW5nRm9yRmFjZWxldHNCaW5kaW5nKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCByZXNvbHZlIGV4cHJlc3Npb246ICIgKyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgIC5nZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgcmVzdWx0LmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLQ0KLSAgICAgICAgICAgIGlmKGVudGl0eUNsYXNzID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgcmVzb2x2ZSBleHByZXNzaW9uOiAiICsgcmVzdWx0LmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYoInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoREVBQ1RJVkFURV9FTF9SRVNPTFZFUikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5RGV0YWlsc1ZpYVJlZmxlY3Rpb25GYWxsYmFjayh1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgRXh0VmFsRUxSZXNvbHZlciBlbFJlc29sdmVyID0gbmV3IEV4dFZhbEVMUmVzb2x2ZXIoZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZ2V0RUxSZXNvbHZlcigpKTsNCi0gICAgICAgIEVMQ29udGV4dCBlbENvbnRleHQgPSBFeHRWYWxFTFJlc29sdmVyLmNyZWF0ZUNvbnRleHRXcmFwcGVyKGZhY2VzQ29udGV4dC5nZXRFTENvbnRleHQoKSwgZWxSZXNvbHZlcik7DQotDQotICAgICAgICBWYWx1ZUV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uID0gdWlDb21wb25lbnQuZ2V0VmFsdWVFeHByZXNzaW9uKCJ2YWx1ZSIpOw0KLQ0KLSAgICAgICAgaWYodmFsdWVFeHByZXNzaW9uID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWx1ZUV4cHJlc3Npb24uc2V0VmFsdWUoZWxDb250ZXh0LCBudWxsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAiZXJyb3IgYXQgYmluZGluZzogIiArIHZhbHVlRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkgKw0KLSAgICAgICAgICAgICAgICAiIC0tIGFuIGVsLXJlc29sdmVyIGVycm9yIG9jY3VycmVkISBtYXliZSB5b3UgdXNlZCBhbiBpbnZhbGlkIGJpbmRpbmcuIG90aGVyd2lzZTogIiArDQotICAgICAgICAgICAgICAgICJwbGVhc2UgcmVwb3J0IHRoZSBpc3N1ZSwgZGVhY3RpdmF0ZSB0aGUgZWwtcmVzb3ZsZXIgb2YgZXh0dmFsIHZpYSB3ZWIueG1sIGNvbnRleHQtcGFyYW06ICIgKw0KLSAgICAgICAgICAgICAgICBFeHRWYWxJbmZvcm1hdGlvbi5XRUJYTUxfUEFSQU1fUFJFRklYICsgIi5ERUFDVElWQVRFX0VMX1JFU09MVkVSIiArDQotICAgICAgICAgICAgICAgICIgYW5kIHRlc3QgYWdhaW4uIiwgdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihlbFJlc29sdmVyLmdldFBhdGgoKSA9PSBudWxsIHx8IGVsUmVzb2x2ZXIuZ2V0QmFzZU9iamVjdCgpID09IG51bGwgfHwgZWxSZXNvbHZlci5nZXRQcm9wZXJ0eSgpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscyhlbFJlc29sdmVyLmdldFBhdGgoKSwgZWxSZXNvbHZlci5nZXRCYXNlT2JqZWN0KCksIGVsUmVzb2x2ZXIuZ2V0UHJvcGVydHkoKSk7DQotICAgIH0NCi0NCi0gICAgLy9rZWVwIGluIHN5bmMgd2l0aCBEZWZhdWx0RUxIZWxwZXIjZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcgb2YgYnJhbmNoISEhDQotICAgIHByb3RlY3RlZCBQcm9wZXJ0eURldGFpbHMgZ2V0UHJvcGVydHlEZXRhaWxzVmlhUmVmbGVjdGlvbkZhbGxiYWNrKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gZ2V0VmFsdWVCaW5kaW5nRXhwcmVzc2lvbih1aUNvbXBvbmVudCwgZmFsc2UpOw0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9DQotICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHBhdGggPSBudWxsOw0KLQ0KLSAgICAgICAgd2hpbGUoY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHBhdGggPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHBhdGggPSBnZXRQcm9wZXJ0eU5hbWUoY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwYXRoID0gZ2V0UHJvcGVydHlOYW1lKGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKSArICIuIiArIHBhdGg7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBhdGggPSBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpICsgIi4iICsgcGF0aDsNCi0NCi0gICAgICAgIE9iamVjdCBiYXNlT2JqZWN0ID0gZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLQ0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGUuZy46ICN7YmVhbltiZWFuLnBhc3N3b3JkUmVwZWF0ZWRQcm9wZXJ0eU5hbWVdfQ0KLSAgICAgICAgLy8tPiBiZWFuLnBhc3N3b3JkUmVwZWF0ZWRQcm9wZXJ0eU5hbWUgaXMgbm90IHRoZSBmaW5hbCBwcm9wZXJ0eSBuYW1lDQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscyhwYXRoLCBiYXNlT2JqZWN0LCBnZXRQcm9wZXJ0eU5hbWUodmFsdWVCaW5kaW5nRXhwcmVzc2lvbikpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldFByb3BlcnR5TmFtZShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCk7DQotDQotICAgICAgICBpZihwcm9wZXJ0eU5hbWUuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBleHRyYWN0UHJvcGVydHlOYW1lT2ZQcm9wZXJ0eVBhdGgocHJvcGVydHlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInN1cHBvcnQgZm9yIG1vcmUgZHluYW1pYyBiaW5kaW5ncyAtIGRldGFpbHMgc2VlIGlubGluZSIpDQotICAgIHByaXZhdGUgU3RyaW5nIGV4dHJhY3RQcm9wZXJ0eU5hbWVPZlByb3BlcnR5UGF0aChTdHJpbmcgcHJvcGVydHlDaGFpbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nW10gcHJvcGVydGllcyA9IHByb3BlcnR5Q2hhaW4uc3BsaXQoIlxcLiIpOw0KLQ0KLSAgICAgICAgT2JqZWN0IGN1cnJlbnRQcm9wZXJ0eVZhbHVlID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKHByb3BlcnRpZXNbMF0pOw0KLQ0KLSAgICAgICAgTWV0aG9kIGN1cnJlbnRNZXRob2Q7DQotICAgICAgICBTdHJpbmcgY3VycmVudFByb3BlcnR5TmFtZTsNCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzc09mUHJvcGVydHlWYWx1ZTsNCi0gICAgICAgIGZvcihpbnQgaSA9IDE7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0aWVzW2ldOw0KLSAgICAgICAgICAgIGN1cnJlbnRDbGFzc09mUHJvcGVydHlWYWx1ZSA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudFByb3BlcnR5VmFsdWUuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgY3VycmVudE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZChjdXJyZW50Q2xhc3NPZlByb3BlcnR5VmFsdWUsDQotICAgICAgICAgICAgICAgICJnZXQiICsgY3VycmVudFByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIGN1cnJlbnRQcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpKTsNCi0NCi0gICAgICAgICAgICBpZihjdXJyZW50TWV0aG9kID09IG51bGwgJiYgY3VycmVudFByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBNYXApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL2l0J3Mgb2sgZm9yIHRoZSBzaW1wbGUgbWFwIGNhc2UgLSBidXQgbm90IGZvciBlLmcuOg0KLSAgICAgICAgICAgICAgICAvLyN7YmVhbjFbYmVhbjIucHJvcGVydHlOYW1lUHJvdmlkZXJbIGJlYW4zLmluZGV4XV19DQotICAgICAgICAgICAgICAgIC8vb3IgZXZlcnkgb3RoZXIgY29tcGxleCByZXBsYWNlbWVudCBmb3IgYmVhbjMuaW5kZXgNCi0gICAgICAgICAgICAgICAgLy9pdCBtaWdodCBhbHNvIHJlcXVpcmUgYW4gYWRqdXN0bWVudCBhdCBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIjdHJ5VG9UcmFuc2Zvcm1Ub1JlYWxCaW5kaW5nDQotICAgICAgICAgICAgICAgICgoTWFwKWN1cnJlbnRQcm9wZXJ0eVZhbHVlKS5nZXQoY3VycmVudFByb3BlcnR5TmFtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eVZhbHVlID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKGN1cnJlbnRQcm9wZXJ0eVZhbHVlLCBjdXJyZW50TWV0aG9kKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZihjdXJyZW50UHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFN0cmluZyljdXJyZW50UHJvcGVydHlWYWx1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoInVuZXhwZWN0ZWQgdmFsdWUgd2l0aGluIG1hcCBzeW50YXg6ICIgKyBwcm9wZXJ0eUNoYWluICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGxhc3QgcHJvcGVydHkgbmFtZTogIiArIGN1cnJlbnRQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgc3RhdGljIFN0cmluZyBnZXRPcmlnaW5hbFZhbHVlQmluZGluZ0V4cHJlc3Npb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFZhbHVlRXhwcmVzc2lvbiB2YWx1ZUV4cHJlc3Npb24gPSB1aUNvbXBvbmVudC5nZXRWYWx1ZUV4cHJlc3Npb24oInZhbHVlIik7DQotDQotICAgICAgICByZXR1cm4gKHZhbHVlRXhwcmVzc2lvbiAhPSBudWxsKSA/IHZhbHVlRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtV2VsbEZvcm1lZChPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBWYWx1ZUJpbmRpbmcgfHwgbyBpbnN0YW5jZW9mIEV4dGVybmFsaXphYmxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBzID0gby50b1N0cmluZygpOw0KLSAgICAgICAgcmV0dXJuICgocy5jb250YWlucygiIyIpIHx8IHMuY29udGFpbnMoIiQiKSkgJiYgcy5jb250YWlucygieyIpICYmIHMuY29udGFpbnMoIn0iKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRCaW5kaW5nT2ZDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQuZ2V0VmFsdWVFeHByZXNzaW9uKG5hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmZTU2Yy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRFTEhlbHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeQ0KLXsNCi0gICAgcHJpdmF0ZSBFTEhlbHBlciBlbEhlbHBlciA9IG5ldyBEZWZhdWx0RUxIZWxwZXIoKTsNCi0gICAgDQotICAgIHByb3RlY3RlZCBFTEhlbHBlciBjcmVhdGVFTEhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmVsSGVscGVyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FTEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWIyNTUzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogaW4gb3JkZXIgdG8gY2VudHJhbGl6ZSB0aGUganNmIHZlcnNpb24gZGVwZW5kZW5jeSB3aXRoaW4gdGhlIGNvcmUNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRUxIZWxwZXINCi17DQotICAgIE9iamVjdCBnZXRCZWFuKFN0cmluZyBiZWFuTmFtZSk7DQotDQotICAgIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLQ0KLSAgICBDbGFzcyBnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCk7DQotDQotICAgIGJvb2xlYW4gaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIGJvb2xlYW4gaXNFTFRlcm1XZWxsRm9ybWVkKE9iamVjdCBvKTsNCi0NCi0gICAgT2JqZWN0IGdldEJpbmRpbmdPZkNvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgU3RyaW5nIG5hbWUpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FeHRWYWxFTFJlc29sdmVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FeHRWYWxFTFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOTgwNTAuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRXh0VmFsRUxSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsKLQotaW1wb3J0IGphdmF4LmVsLkVMUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0OwotaW1wb3J0IGphdmF4LmVsLlZhcmlhYmxlTWFwcGVyOwotaW1wb3J0IGphdmF4LmVsLkZ1bmN0aW9uTWFwcGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS5iZWFucy5GZWF0dXJlRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbEVMUmVzb2x2ZXIgZXh0ZW5kcyBFTFJlc29sdmVyCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgRUxSZXNvbHZlciB3cmFwcGVkOwotICAgIHByaXZhdGUgT2JqZWN0IGJhc2VPYmplY3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7Ci0gICAgLy9mb3JtcyB0aGUgaWQgZm9yIGNyb3NzLXZhbGlkYXRpb24gd2l0aGluIGNvbXBsZXggY29tcG9uZW50cwotICAgIHByaXZhdGUgU3RyaW5nIGV4cHJlc3Npb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGF0aFJlY29yZGluZ1N0b3BwZWQgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBFeHRWYWxFTFJlc29sdmVyKEVMUmVzb2x2ZXIgZWxSZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IGVsUmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRCYXNlT2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgiZXh0cmFjdGVkIHBhdGg6ICIgKyB0aGlzLmV4cHJlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKQotICAgIHsKLSAgICAgICAgdGhpcy5iYXNlT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IG51bGw7Ci0gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcGF0aCByZWNvcmRpbmcgaXMgcGVyZm9ybWVkIHRvIGdldCBhIGtleSBmb3IgY3Jvc3MtdmFsaWRhdGlvbjxici8+Ci0gICAgICogZXZlcnkgYmFzZSBhZnRlciB0aGUgZmlyc3QgY2FsbCB3aGljaCBpcyBudWxsIHN0b3BzIHJlY29yZGluZzxici8+Ci0gICAgICogd2l0aCBhIGR5bmFtaWMgbWFwIHN5bnRheCB0aGUgbGFzdCBwcm9wZXJ0eSBpbiB0aGUgbWlkZGxlIG9mIGFuIGV4cHJlc3Npb24gaGFzIHRvIGJlIGEgc3RyaW5nLgotICAgICAqIHN1Y2ggYSBzdHJpbmcgcmVzdWx0IGNvbnRpbnVlcyB0aGUgcGF0aCByZWNvcmRpbmcgYXQgdGhlIG5leHQgY2FsbCBmb3IgdGhlIGN1cnJlbnQgZXhwcmVzc2lvbi4KLSAgICAgKiA8cC8+Ci0gICAgICogZXhhbXBsZTogI3tiZWFuW2JlYW4ucHJvcGVydHlOYW1lUHJvdmlkZXJbJ25hbWVPZlByb3BlcnR5MSddXVsnZHluQmVhbiddLnByb3BlcnR5fQotICAgICAqIDxwLz4KLSAgICAgKiBsaW1pdGF0aW9uIGZvciBjcm9zcy12YWxpZGF0aW9uOiBuYW1lT2ZQcm9wZXJ0eTEgaGFzIHRvIGJlIG9mIHR5cGUgc3RyaW5nLgotICAgICAqIG90aGVyIGtleSB0eXBlcyBhcmVuJ3Qgc3VwcG9ydGVkIHlldAotICAgICAqCi0gICAgICogQHBhcmFtIGVsQ29udGV4dCB3cmFwcGVkIGVsLWNvbnRleHQKLSAgICAgKiBAcGFyYW0gYmFzZSBjdXJyZW50IGJhc2UKLSAgICAgKiBAcGFyYW0gcHJvcGVydHkgcHJvcGVydHkgdG8gcmVzb2x2ZQotICAgICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBkZWxlZ2F0ZWQgbWV0aG9kIGNhbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBiYXNlLCBPYmplY3QgcHJvcGVydHkpCi0gICAgewotICAgICAgICBPYmplY3QgcmVzdWx0ID0gdGhpcy53cmFwcGVkLmdldFZhbHVlKGVsQ29udGV4dCwgYmFzZSwgcHJvcGVydHkpOwotCi0gICAgICAgIC8vdmVyeSBmaXJzdCBjYWxsIGZvciBhbiBleHByZXNzaW9uCi0gICAgICAgIGlmKHRoaXMuZXhwcmVzc2lvbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSAoU3RyaW5nKXByb3BlcnR5OwotICAgICAgICB9Ci0gICAgICAgIC8vI3tiZWFuW2R5bkJhc2UucHJvcGVydHlOYW1lXX0gLT4gYmFzZSBvZiBkeW5CYXNlIGlzIG51bGwgLT4gc3RvcCBwYXRoIHJlY29yZGluZwotICAgICAgICBlbHNlIGlmKGJhc2UgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pc1BhdGhSZWNvcmRpbmdTdG9wcGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gcHJvcGVydHlFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eS50b1N0cmluZygpOwotICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHlOYW1lLnN1YnN0cmluZygxKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoYmFzZSBpbnN0YW5jZW9mIE1hcCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCgoTWFwKWJhc2UpLmNvbnRhaW5zS2V5KHByb3BlcnR5KSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhiYXNlLmdldENsYXNzKCkpLmdldE1ldGhvZCgiZ2V0IiArIHByb3BlcnR5TmFtZSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKGJhc2UuZ2V0Q2xhc3MoKSkuZ2V0TWV0aG9kKCJpcyIgKyBwcm9wZXJ0eU5hbWUpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoInByb3BlcnR5OiAiICsgcHJvcGVydHkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzbid0IHVzZWQgZm9yIHBhdGggLSBpdCBpc24ndCBhIHByb3BlcnR5IG9mICIgKyBiYXNlLmdldENsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2UuZy46ICN7YmVhbi5zdWJCYXNlLnByb3BlcnR5fSAtPiBoZXJlIHdlIGFyZSBhdCBzdWJCYXNlCi0gICAgICAgICAgICBpZihwcm9wZXJ0eUV4aXN0cyAmJiAhdGhpcy5pc1BhdGhSZWNvcmRpbmdTdG9wcGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbiArPSAiLiIgKyBwcm9wZXJ0eTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYocHJvcGVydHlFeGlzdHMgJiYgcmVzdWx0IGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuaXNQYXRoUmVjb3JkaW5nU3RvcHBlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgaWYodGhpcy5pc1BhdGhSZWNvcmRpbmdTdG9wcGVkICYmIHJlc3VsdCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uICs9ICIuIiArIHByb3BlcnR5OwotICAgICAgICB9Ci0gICAgICAgICovCi0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0VHlwZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbywgT2JqZWN0IG8xKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0VHlwZShlbENvbnRleHQsIG8sIG8xKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbywgT2JqZWN0IG8xLCBPYmplY3QgbzIpCi0gICAgewotICAgICAgICBleHByZXNzaW9uICs9ICIuIiArIG8xOwotICAgICAgICBwcm9wZXJ0eSA9IChTdHJpbmcpbzE7Ci0gICAgICAgIGJhc2VPYmplY3QgPSBvOwotICAgICAgICBlbENvbnRleHQuc2V0UHJvcGVydHlSZXNvbHZlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvLCBPYmplY3QgbzEpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5pc1JlYWRPbmx5KGVsQ29udGV4dCwgbywgbzEpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxGZWF0dXJlRGVzY3JpcHRvcj4gZ2V0RmVhdHVyZURlc2NyaXB0b3JzKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0RmVhdHVyZURlc2NyaXB0b3JzKGVsQ29udGV4dCwgbyk7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzPD8+IGdldENvbW1vblByb3BlcnR5VHlwZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbykKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENvbW1vblByb3BlcnR5VHlwZShlbENvbnRleHQsIG8pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRUxDb250ZXh0IGNyZWF0ZUNvbnRleHRXcmFwcGVyKGZpbmFsIEVMQ29udGV4dCBjb250ZXh0LCBmaW5hbCBFTFJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFTENvbnRleHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRMb2NhbGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVJlc29sdmVkKGJvb2xlYW4gdmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuc2V0UHJvcGVydHlSZXNvbHZlZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRQcm9wZXJ0eVJlc29sdmVkKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwdXRDb250ZXh0KENsYXNzIGNsYXp6LCBPYmplY3Qgb2JqZWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyLnB1dENvbnRleHQoY2xhenosIG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5wdXRDb250ZXh0KGNsYXp6LCBvYmplY3QpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udGV4dChDbGFzcyBjbGF6eikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRDb250ZXh0KGNsYXp6KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvY2FsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlci5zZXRMb2NhbGUobG9jYWxlKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldExvY2FsZShsb2NhbGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBFTFJlc29sdmVyIGdldEVMUmVzb2x2ZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgRnVuY3Rpb25NYXBwZXIgZ2V0RnVuY3Rpb25NYXBwZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldEZ1bmN0aW9uTWFwcGVyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFZhcmlhYmxlTWFwcGVyIGdldFZhcmlhYmxlTWFwcGVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRWYXJpYWJsZU1hcHBlcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyYjg5Zi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogSGVscGVyIGNsYXNzIHRvIGdldCB0aGUgcmVhbC9mdWxsIHZhbHVlIGJpbmRpbmcgLSB0ZXN0ZWQgd2l0aCBmYWNlbGV0cyAxLjEuMTQNCi0gKiBUaGUgdGFyZ2V0IGlzIHRvIGdldCByaWQgb2YgdGhpcyBpbXBsLiAtIGN1cnJlbnRseSBpdCdzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IGN1c3RvbSBmYWNlbGV0cyBjb21wb25lbnRzLg0KLSAqIEFuIGFsdGVybmF0aXZlIHdvdWxkIGJlIGFuIEVMLVJlc29sdmVyIC0gdGhlcmUgYXJlIHN0aWxsIHNvbWUgb3BlbiBpc3N1ZXMgd2l0aCBzdWNoIGFuIGFwcHJvYWNoDQotICogKyBJdCBpc24ndCBhdmFpbGFibGUgd2l0aCBKU0YgMS4xLngNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9DcmVhdGVWYWx1ZUJpbmRpbmdGb3JGYWNlbGV0c0JpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBEZWZhdWx0RUxIZWxwZXIuZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEJpbmRpbmdzID0gZXh0cmFjdEVMVGVybXMoDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmluZGluZ09mQ29tcG9uZW50KHVpQ29tcG9uZW50LCAidmFsdWUiKSk7DQotDQotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZT0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIDEpICsgInsiICsgY3JlYXRlQmluZGluZyhmb3VuZEJpbmRpbmdzLCBtYXBwZWRGYWNlbGV0c1ZhcnMpICsgIn0iKTsNCi0NCi0gICAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YmUuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotDQotICAgICAgICAgICAgaWYoZW50aXR5Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnlUb1JlcGxhY2VWYXJzKHZiZSwgbWFwcGVkRmFjZWxldHNWYXJzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHZiZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVCaW5kaW5nKExpc3Q8U3RyaW5nPiBleHByZXNzaW9ucywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkZWRWaXJ0dWFsTmFtZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGVudHJ5IDogZXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoIlZhbHVlRXhwcmVzc2lvblsiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBmb3VuZEJpbmRpbmdEZXRhaWxzID0gZW50cnkuc3BsaXQoIiAiKTsNCi0gICAgICAgICAgICBpbmRleE9mQmluZGluZ0RldGFpbHMgPSBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKGZvdW5kQmluZGluZ0RldGFpbHMpOw0KLQ0KLSAgICAgICAgICAgIGlmIChpbmRleE9mQmluZGluZ0RldGFpbHMgPT0gLTEpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgYmluZGluZ0RldGFpbHMgPSBmb3VuZEJpbmRpbmdEZXRhaWxzW2luZGV4T2ZCaW5kaW5nRGV0YWlsc10uc3BsaXQoIj0iKTsNCi0NCi0gICAgICAgICAgICBpZiAoYmluZGluZ0RldGFpbHMubGVuZ3RoIDwgMikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGJpbmRpbmdEZXRhaWxzWzFdOw0KLQ0KLSAgICAgICAgICAgIC8vdG8gc3VwcG9ydCBibGFua3Mgd2l0aGluIGEgYmluZGluZyB3aXRoIG1hcCBzeW50YXgNCi0gICAgICAgICAgICBpZihjdXJyZW50QmluZGluZy5jb250YWlucygieyIpICYmICFjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgPSBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKGN1cnJlbnRCaW5kaW5nLCBmb3VuZEJpbmRpbmdEZXRhaWxzLCBpbmRleE9mQmluZGluZ0RldGFpbHMpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnNLZXkoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5wdXQoYmluZGluZ0RldGFpbHNbMF0sIGN1cnJlbnRCaW5kaW5nKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvL2VudHJ5IGZvciAidmlydHVhbCIgZmFjZWxldHMgdmFyDQotICAgICAgICAgICAgaWYoIShjdXJyZW50QmluZGluZy5jb250YWlucygieyIpIHx8IGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhcnMucHV0KGJpbmRpbmdEZXRhaWxzWzBdLCBiaW5kaW5nRGV0YWlsc1sxXS5zdWJzdHJpbmcoMSwgYmluZGluZ0RldGFpbHNbMV0ubGVuZ3RoKCktMikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBvcmlnaW5hbEJpbmRpbmcgPSBhZGRlZFZpcnR1YWxOYW1lcy5nZXQoInZhbHVlIik7DQotICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcuc3Vic3RyaW5nKG9yaWdpbmFsQmluZGluZy5pbmRleE9mKCJ7IikgKyAxLCBvcmlnaW5hbEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLnJlbW92ZSgidmFsdWUiKTsNCi0gICAgICAgIHJldHVybiB0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcob3JpZ2luYWxCaW5kaW5nLCBhZGRlZFZpcnR1YWxOYW1lcywgdmlydHVhbFZhcnMpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcoDQotICAgICAgICAgICAgU3RyaW5nIG9yaWdpbmFsQmluZGluZywgTWFwPFN0cmluZywgU3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gIiN7IiArIG9yaWdpbmFsQmluZGluZyArICJ9IjsNCi0gICAgICAgIEl0ZXJhdG9yIG5hbWVJdGVyYXRvciA9IGFkZGVkVmlydHVhbE5hbWVzLmtleVNldCgpLml0ZXJhdG9yKCk7DQotDQotICAgICAgICBTdHJpbmcgY3VycmVudEtleTsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50VmFsdWU7DQotICAgICAgICB3aGlsZShuYW1lSXRlcmF0b3IuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRLZXkgPSAoU3RyaW5nKSBuYW1lSXRlcmF0b3IubmV4dCgpOw0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGFkZGVkVmlydHVhbE5hbWVzLmdldChjdXJyZW50S2V5KTsNCi0gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGN1cnJlbnRWYWx1ZS5pbmRleE9mKCJ7IikgKyAxLCBjdXJyZW50VmFsdWUuaW5kZXhPZigifSIpKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIi4iLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJ7IiArIGN1cnJlbnRLZXkgKyAiWyIsICJ7IiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICIuIiwgIi4iICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiLiIgKyBjdXJyZW50S2V5ICsgIlsiLCAiLiIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiXSIsICJbJyIgKyBjdXJyZW50VmFsdWUgKyAiJ10iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIlsiLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiLiIsICJbIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICB9DQotDQotICAgICAgICBuYW1lSXRlcmF0b3IgPSB2aXJ0dWFsVmFycy5rZXlTZXQoKS5pdGVyYXRvcigpOw0KLQ0KLSAgICAgICAgd2hpbGUobmFtZUl0ZXJhdG9yLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50S2V5ID0gKFN0cmluZykgbmFtZUl0ZXJhdG9yLm5leHQoKTsNCi0NCi0gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSB2aXJ0dWFsVmFycy5nZXQoY3VycmVudEtleSk7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoInsiICsgY3VycmVudEtleSArICIuIiwgInsiICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIlsiLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCIuIiArIGN1cnJlbnRLZXkgKyAiLiIsICIuIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICJbIiwgIi4iICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIl0iLCAiWyciICsgY3VycmVudFZhbHVlICsgIiddIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIlsiICsgY3VycmVudEtleSArICJbIiwgIlsiICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIi4iLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG9yaWdpbmFsQmluZGluZy5zdWJzdHJpbmcoMiwgb3JpZ2luYWxCaW5kaW5nLmxlbmd0aCgpIC0gMSk7DQotICAgIH0NCi0NCi0gICAgLy90byBzdXBwb3J0IGJsYW5rcyAtIGUuZy4gd2l0aCBtYXAgc3ludGF4DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKFN0cmluZyBjdXJyZW50QmluZGluZywgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlscykNCi0gICAgew0KLSAgICAgICAgZm9yKGludCBpID0gaW5kZXhPZkJpbmRpbmdEZXRhaWxzICsgMTsgaSA8IGZvdW5kQmluZGluZ0RldGFpbHMubGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgKz0gZm91bmRCaW5kaW5nRGV0YWlsc1tpXTsNCi0gICAgICAgICAgICBpZihmb3VuZEJpbmRpbmdEZXRhaWxzW2ldLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEJpbmRpbmc7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRCaW5kaW5nOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBpbnQgY291bnQgPSAwOw0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBiaW5kaW5nRGV0YWlscykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuY29udGFpbnMoIj0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY291bnQrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZXh0cmFjdEVMVGVybXMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlRUxUZXJtcyhvLCBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKSwgZm91bmRFTFRlcm1zLCAwKSA+IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRFTFRlcm1zOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcmVzb2x2ZUVMVGVybXMoT2JqZWN0IG8sIE1hcDxPYmplY3QsIE9iamVjdD4gdmlzaXRlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMsIGludCBjb3VudCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAobyA9PSBudWxsIHx8IHZpc2l0ZWQuY29udGFpbnNLZXkobykgfHwgY291bnQgPiA1MCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZpc2l0ZWQucHV0KG8sIG51bGwpOw0KLQ0KLSAgICAgICAgaW50IGVsQ291bnQgPSAwOw0KLSAgICAgICAgQ2xhc3MgYyA9IG8uZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIC8vaW5zcGVjdCBtYXBzDQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1hcCkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBmb3IgKE9iamVjdCBlbnRyeSA6ICgoTWFwKSBvKS52YWx1ZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZm91bmQgZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICAgICAgaWYoZW50cnkudG9TdHJpbmcoKS5jb250YWlucygiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKGVudHJ5LnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoZW50cnksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGVsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQobykpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gKytlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9hbmFseXplIGFycmF5cw0KLSAgICAgICAgaWYgKGMuaXNBcnJheSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgobyk7DQotICAgICAgICAgICAgLy9jaGVjayBhcnJheSBbTCAtPiBubyBhcnJheSBvZiBwcmltaXRpdmUgdHlwZXMNCi0gICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMamF2YS5sYW5nLlN0cmluZyIpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChBcnJheS5nZXQobywgaSkpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKEFycmF5LmdldChvLCBpKSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxGaWVsZD4gYXR0cmlidXRlcyA9IGZpbmRBbGxBdHRyaWJ1dGVzKGMsIG5ldyBBcnJheUxpc3Q8RmllbGQ+KCkpOw0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBhdHRyaWJ1dGVzLnRvQXJyYXkobmV3IEZpZWxkW2F0dHJpYnV0ZXMuc2l6ZSgpXSk7DQotDQotICAgICAgICBBY2Nlc3NpYmxlT2JqZWN0LnNldEFjY2Vzc2libGUoZmllbGRzLCB0cnVlKTsNCi0gICAgICAgIGZvciAoRmllbGQgY3VycmVudEZpZWxkIDogZmllbGRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQuZ2V0KG8pID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5nZXRUeXBlKCkuZXF1YWxzKFN0cmluZy5jbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmdldChvKSAhPSBudWxsICYmIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKGN1cnJlbnRGaWVsZC5nZXQobykpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFjdXJyZW50RmllbGQuZ2V0VHlwZSgpLmlzUHJpbWl0aXZlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKGN1cnJlbnRGaWVsZC5nZXQobyksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZWxDb3VudDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEZpZWxkPiBmaW5kQWxsQXR0cmlidXRlcyhDbGFzcyBjLCBMaXN0PEZpZWxkPiBhdHRyaWJ1dGVzKQ0KLSAgICB7DQotICAgICAgICBpZiAoYyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluZEFsbEF0dHJpYnV0ZXMoYy5nZXRTdXBlcmNsYXNzKCksIGF0dHJpYnV0ZXMpOw0KLQ0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBjLmdldERlY2xhcmVkRmllbGRzKCk7DQotICAgICAgICBmb3IgKEZpZWxkIGN1cnJlbnRGaWVsZCA6IGZpZWxkcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzU3RhdGljKGN1cnJlbnRGaWVsZC5nZXRNb2RpZmllcnMoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChjdXJyZW50RmllbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9SZXBsYWNlVmFycyhWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eTsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0gICAgICAgIGJvb2xlYW4gbGFzdCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgd2hpbGUodHJ1ZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxhc3QgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0NCi0gICAgICAgICAgICBwcm9wZXJ0eSA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbg0KLSAgICAgICAgICAgICAgICAucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIGdldE5ld1Byb3BlcnR5KHByb3BlcnR5LCBtYXBwZWRGYWNlbGV0c1ZhcnMpKTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQubGVuZ3RoKCkgPT0gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpICsgIi4iICsgcmVzdWx0Ow0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpOw0KLQ0KLSAgICAgICAgICAgIGlmKGxhc3QpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcmVmaXgoKSArICJ7IiArIHJlc3VsdCArICJ9Iik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5ld1Byb3BlcnR5KFN0cmluZyBvbGRQcm9wZXJ0eSwgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFycyA9IGdldFBvdGVudGlhbFZpcnR1YWxWYXJzKG9sZFByb3BlcnR5KTsNCi0NCi0gICAgICAgIGZvcihTdHJpbmcgdmlydHVhbFZhciA6IHZpcnR1YWxWYXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1hcHBlZEZhY2VsZXRzVmFycy5jb250YWluc0tleSh2aXJ0dWFsVmFyKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG9sZFByb3BlcnR5ID0gcmVwbGFjZVByb3BlcnR5VmFsdWUob2xkUHJvcGVydHksIHZpcnR1YWxWYXIsIG1hcHBlZEZhY2VsZXRzVmFycy5nZXQodmlydHVhbFZhcikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvbGRQcm9wZXJ0eTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0UG90ZW50aWFsVmlydHVhbFZhcnMoU3RyaW5nIG9sZFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpbnQgc3RhcnQgPSAtMTsNCi0gICAgICAgIGludCBlbmQgPSAtMTsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG9sZFByb3BlcnR5Lmxlbmd0aCgpOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoc3RhcnQgPT0gLSAxICYmIG9sZFByb3BlcnR5LmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKChzdGFydCAhPSAtIDEgJiYgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICdbJykgfHwgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICddJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGVuZCA9IGk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKHN0YXJ0ICE9IC0xICYmIGVuZCAhPSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJMaXN0LmFkZChvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOw0KLSAgICAgICAgICAgICAgICBpZihvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbmQgPSAtMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlydHVhbFZhckxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcGxhY2VQcm9wZXJ0eVZhbHVlKFN0cmluZyBvbGRQcm9wZXJ0eSwgU3RyaW5nIHRhcmdldFZhciwgU3RyaW5nIG5ld1ZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpbnQgaW5kZXggPSBvbGRQcm9wZXJ0eS5pbmRleE9mKHRhcmdldFZhcik7DQotDQotICAgICAgICBpZihpbmRleCA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gb2xkUHJvcGVydHk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gb2xkUHJvcGVydHkuc3Vic3RyaW5nKDAsIGluZGV4KTsNCi0gICAgICAgIHJlc3VsdCArPSBuZXdWYWx1ZTsNCi0gICAgICAgIHJldHVybiByZXN1bHQgKyBvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoaW5kZXggKyB0YXJnZXRWYXIubGVuZ3RoKCksIG9sZFByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiByZXBsYWNlIHZpcnR1YWwgZmFjZWxldHMgdmFycyAobWFwIHN5bnRheCkNCi0gICAgICogdGVzdGVkIHN0eWxlcyAoc2ltcGxlIGFuZCBuZXN0ZWQpOiB0ZXN0W2l4W2l4MltpeDNdXV0NCi0gICAgICovDQotICAgIC8qDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBfY3JlYXRlQmluZGluZyhMaXN0PFN0cmluZz4gZXhwcmVzc2lvbnMsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmlydHVhbFZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0NCi0gICAgICAgIFN0cmluZyBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50QmluZGluZzsNCi0gICAgICAgIFN0cmluZyBwYXJ0T2ZCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBleHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aCgiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZvdW5kQmluZGluZ0RldGFpbHMgPSBlbnRyeS5zcGxpdCgiICIpOw0KLSAgICAgICAgICAgIGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoZm91bmRCaW5kaW5nRGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9PSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBiaW5kaW5nRGV0YWlscyA9IGZvdW5kQmluZGluZ0RldGFpbHNbaW5kZXhPZkJpbmRpbmdEZXRhaWxzXS5zcGxpdCgiPSIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nRGV0YWlscy5sZW5ndGggPCAyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYmluZGluZ0RldGFpbHNbMV07DQotDQotICAgICAgICAgICAgLy90byBzdXBwb3J0IGJsYW5rcyB3aXRoaW4gYSBiaW5kaW5nIHdpdGggbWFwIHN5bnRheA0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgJiYgIWN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoY3VycmVudEJpbmRpbmcsIGZvdW5kQmluZGluZ0RldGFpbHMsIGluZGV4T2ZCaW5kaW5nRGV0YWlscyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lICE9IG51bGwgJiYgY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnMoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBwYXJ0T2ZCaW5kaW5nID0gY3VycmVudEJpbmRpbmcuc3Vic3RyaW5nKGN1cnJlbnRCaW5kaW5nLmluZGV4T2YocHJldkZhY2VsZXRzQXR0cmlidXRlTmFtZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICArIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUubGVuZ3RoKCksIGN1cnJlbnRCaW5kaW5nLmluZGV4T2YoIn0iKSk7DQotDQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5hZGQoYmluZGluZ0RldGFpbHNbMF0pOw0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgcGFydE9mQmluZGluZzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICBlbHNlIGlmKCEoY3VycmVudEJpbmRpbmcuY29udGFpbnMoInsiKSB8fCBjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJzLnB1dChiaW5kaW5nRGV0YWlsc1swXSwgYmluZGluZ0RldGFpbHNbMV0uc3Vic3RyaW5nKDEsIGJpbmRpbmdEZXRhaWxzWzFdLmxlbmd0aCgpLTIpKTsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWlucyhiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLmFkZChiaW5kaW5nRGV0YWlsc1swXSk7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyZW50QmluZGluZy5zdWJzdHJpbmcoY3VycmVudEJpbmRpbmcuaW5kZXhPZigieyIpICsgMSwgY3VycmVudEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gYmluZGluZ0RldGFpbHNbMF07DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotICAgICovDQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24uamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc4ZWI2Ni4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRpZmZlcmVuY2UgYmV0d2VlbiBbIGFuZCBbJyAtIHRlc3Qgd2l0aCBtb3JlIGNvbnN0ZWxsYXRpb25zIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQ0KLXB1YmxpYyBjbGFzcyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotew0KLSAgICBwcml2YXRlIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYmFzZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7DQotICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdG9rZW47DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXBsYWNlT3JBZGRQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlcGxhY2VQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1Byb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICAvL1RPRE8gYWRqdXN0bWVudHMgZm9yIGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLmVuZHNXaXRoKCInXSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYWRkUHJvcGVydHkoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBzb3VyY2VFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc291cmNlRXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgc291cmNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpOw0KLQ0KLSAgICAgICAgLy9UT0RPIGFkanVzdG1lbnRzIGZvciBpc0R5bmFtaWNCYXNlQW5kUHJvcGVydHkNCi0gICAgICAgIGlmKG5ld1Byb3BlcnR5LnN0YXJ0c1dpdGgoIlsnIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHJlc3VsdCArIG5ld1Byb3BlcnR5ICsgIn0iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ocmVzdWx0ICsgIi4iICsgbmV3UHJvcGVydHkgKyAifSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKFN0cmluZyBleHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBpZighRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQoZXhwcmVzc2lvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihleHByZXNzaW9uICsgIiBpcyBubyB2YWxpZCBlbC1leHByZXNzaW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBib29sZWFuIGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSA9IGV4cHJlc3Npb24ubGFzdEluZGV4T2YoIiddIikgPT0gLTE7DQotICAgICAgICBpbnQgaW5kZXgxID0gaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5ID8gZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiXSIpIDogZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiJ10iKTsNCi0gICAgICAgIGludCBpbmRleDIgPSBleHByZXNzaW9uLmxhc3RJbmRleE9mKCIuIik7DQotDQotICAgICAgICBpZihpbmRleDEgPiBpbmRleDIpDQotICAgICAgICB7DQotICAgICAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGluZGV4MSk7DQotDQotICAgICAgICAgICAgaW50IGluZGV4MyA9IGZpbmRJbmRleE9mU3RhcnRpbmdCcmFja2V0KGV4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIGlmKGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZyhpbmRleDMgKyAxLCBpbmRleDEpOw0KLQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoaW5kZXgzICsgMiwgaW5kZXgxKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdGhpcy5iYXNlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgzKSArICJ9Iik7DQotICAgICAgICAgICAgdGhpcy50b2tlbiA9IGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSA/ICJbIiA6ICJbJyI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKCBpbmRleDIgPiBpbmRleDEpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKGluZGV4MiArIDEsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxICk7DQotICAgICAgICAgICAgdGhpcy5iYXNlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgyKSArICJ9Iik7DQotICAgICAgICAgICAgdGhpcy50b2tlbiA9ICIuIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoMiwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpOw0KLSAgICAgICAgICAgIHRoaXMucHJlZml4ID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgMSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnRyaW0oKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYoIlsiLmVxdWFscyh0aGlzLnRva2VuKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLnZhbHVlLnN0YXJ0c1dpdGgoIiciKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlLnN1YnN0cmluZygxLCB0aGlzLnZhbHVlLmxlbmd0aCgpIC0gMSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vcmV0dXJuIHRoaXMuYmFzZS52YWx1ZSArIHRoaXMudG9rZW4gKyB0aGlzLnZhbHVlLnN1YnN0cmluZygwLCB0aGlzLnZhbHVlLmxlbmd0aCgpKSArICInXSI7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gZ2V0QmFzZUV4cHJlc3Npb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmFzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4cHJlc3Npb25TdHJpbmcoKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgYmFzZUV4cHJlc3Npb24gPSB0aGlzLmJhc2UuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLQ0KLSAgICAgICAgICAgIGlmKCJbJyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAiJ119IjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZigiWyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAiXX0iOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gYmFzZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGJhc2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSkgKyB0aGlzLnRva2VuICsgdGhpcy52YWx1ZSArICJ9IjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVmaXggKyAieyIgKyB0aGlzLnZhbHVlICsgIn0iOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5iYXNlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZS5nZXRQcmVmaXgoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJlZml4Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmJhc2Uuc2V0UHJlZml4KHByZWZpeCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEV4cHJlc3Npb25TdHJpbmcoKS5oYXNoQ29kZSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gJiYgZ2V0RXhwcmVzc2lvblN0cmluZygpDQotICAgICAgICAgICAgLmVxdWFscygoKFZhbHVlQmluZGluZ0V4cHJlc3Npb24pIHRhcmdldCkuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGludCBmaW5kSW5kZXhPZlN0YXJ0aW5nQnJhY2tldChTdHJpbmcgZXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgaW50IGNsb3NlQ291bnQgPSAwOw0KLSAgICAgICAgZm9yKGludCBpID0gZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDE7IGkgPiAwOyBpLS0pDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoZXhwcmVzc2lvbi5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2xvc2VDb3VudC0tOw0KLSAgICAgICAgICAgICAgICBpZihjbG9zZUNvdW50IDwgMCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZihleHByZXNzaW9uLmNoYXJBdChpKSA9PSAnXScpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjbG9zZUNvdW50Kys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMTAwYjMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlckNvbXBhcmF0b3I7DQotDQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxUPiBpbXBsZW1lbnRzIE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8TmFtZU1hcHBlcjxUPj4NCi17DQotICAgIHByaXZhdGUgTGlzdDxDbGFzcz4gZGVuaWVkTmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLQ0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVnaXN0ZXIoTmFtZU1hcHBlcjxUPiBuYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICBpZighZGVuaWVkTmFtZU1hcHBlckxpc3QuY29udGFpbnMobmFtZU1hcHBlci5nZXRDbGFzcygpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBnZXROYW1lTWFwcGVyTGlzdCgpLmFkZChuYW1lTWFwcGVyKTsNCi0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGdldE5hbWVNYXBwZXJMaXN0KCksIGdldENvbXBhcmF0b3IoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIENvbXBhcmF0b3I8TmFtZU1hcHBlcjxUPj4gZ2V0Q29tcGFyYXRvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxOYW1lTWFwcGVyPFQ+PigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkZXJlZ2lzdGVyKENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBjbGFzc1RvRGVyZWdpc3RlcikNCi0gICAgew0KLSAgICAgICAgSXRlcmF0b3I8TmFtZU1hcHBlcjxUPj4gbmFtZU1hcHBlckl0ZXJhdG9yID0gZ2V0TmFtZU1hcHBlckxpc3QoKS5pdGVyYXRvcigpOw0KLSAgICAgICAgd2hpbGUobmFtZU1hcHBlckl0ZXJhdG9yLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihuYW1lTWFwcGVySXRlcmF0b3IubmV4dCgpLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc1RvRGVyZWdpc3Rlci5nZXROYW1lKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbmFtZU1hcHBlckl0ZXJhdG9yLnJlbW92ZSgpOw0KLSAgICAgICAgICAgICAgICAvL2Rvbid0IGJyZWFrIC0gZS5nLiB0byBkZXJlZ2lzdGVyIGFsbCB3cmFwcGVycy4uLg0KLSAgICAgICAgICAgICAgICAvL2JyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBkZW55KENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBjbGFzc1RvRGVueSkNCi0gICAgew0KLSAgICAgICAgZGVyZWdpc3RlcihjbGFzc1RvRGVueSk7DQotDQotICAgICAgICBzeW5jaHJvbml6ZWQgKGdldENsYXNzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZGVuaWVkTmFtZU1hcHBlckxpc3QuYWRkKGNsYXNzVG9EZW55KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdDxOYW1lTWFwcGVyPFQ+PiBnZXROYW1lTWFwcGVyTGlzdCgpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzY2MDcwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ2xhc3NNYXBwaW5nRmFjdG9yeTxQLCBSPg0KLXsNCi0gICAgUiBjcmVhdGUoUCBzb3VyY2UpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0RlZmF1bHRGYWN0b3J5RmluZGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0RlZmF1bHRGYWN0b3J5RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OTc1NWYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9EZWZhdWx0RmFjdG9yeUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLkRlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRGVmYXVsdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8vZHluYW1pYyBhcHByb2FjaCB0byBjcmVhdGUgdGhlIGZhY3RvcmllcyBkdXJpbmcgdGhlIGZpcnN0IHJlcXVlc3QsIHdoZW4gYSBmYWNlcy1jb250ZXh0IGlzIGF2YWlsYWJsZQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWN0b3J5RmluZGVyIGltcGxlbWVudHMgRmFjdG9yeUZpbmRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJvdGVjdGVkIE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4gZmFjdG9yeU1hcCA9IG5ldyBIYXNoTWFwPEZhY3RvcnlOYW1lcywgT2JqZWN0PigpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIgPSBuZXcgRGVmYXVsdEZhY3RvcnlGaW5kZXIoKTsNCi0NCi0gICAgcHJvdGVjdGVkIERlZmF1bHRGYWN0b3J5RmluZGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY3RvcnlGaW5kZXIgZ2V0SW5zdGFuY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjdG9yeUZpbmRlcjsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgZmluYWwgPFQ+IFQgZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUsIENsYXNzPFQ+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZighKGZhY3RvcnlNYXAuY29udGFpbnNLZXkoZmFjdG9yeU5hbWUpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0RmFjdG9yeShmYWN0b3J5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKFQpZmFjdG9yeU1hcC5nZXQoZmFjdG9yeU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIHN3aXRjaCAoZmFjdG9yeU5hbWUpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2FzZSBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZU1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZU1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZVJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgRUxfSEVMUEVSX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVFTEhlbHBlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBGQUNFU19NRVNTQUdFX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVGYWNlc01lc3NhZ2VGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIFNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlU3RvcmFnZU1hbmFnZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZVZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICANCi0gICAgICAgICAgICBkZWZhdWx0OiAvL3JlcXVpcmVkIGJ5IGNoZWNrc3R5bGUNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgcG9zc2libGUgdG8gY3JlYXRlIGZhY3RvcnkgIiArIGZhY3RvcnlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZhY3RvcnlNYXAucHV0KGZhY3RvcnlOYW1lLCBmYWN0b3J5KTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkpOw0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSk7DQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotICAgICAgICBMaXN0PFN0cmluZz4gbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSk7DQotICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZICk7DQotICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUZhY2VzTWVzc2FnZUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0ZBQ0VTX01FU1NBR0VfRkFDVE9SWSk7DQotICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkpKTsNCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkubmFtZSgpKTsNCi0gICAgICAgIGlmKHRhcmdldCAhPSBudWxsICYmIHRhcmdldCBpbnN0YW5jZW9mIFN0cmluZykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoKFN0cmluZyl0YXJnZXQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlRUxIZWxwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0RUxIZWxwZXJGYWN0b3J5KCk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlkpOw0KLSAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSk7DQotICAgICAgICBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHN0b3JhZ2VNYW5hZ2VyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IHN0b3JhZ2VNYW5hZ2VyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWSk7DQotICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1BBUkFNRVRFUl9GQUNUT1JZKSk7DQotICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogdmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdiZDhhMy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRmFjZXNNZXNzYWdlRmFjdG9yeQ0KLXsNCi0gICAgRmFjZXNNZXNzYWdlIGNvbnZlcnQoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSk7DQotDQotICAgIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZjI2MjUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnlGaW5kZXIKLXsKLSAgICA8VD4gVCBnZXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpOwotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMmIxNWUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQotcHVibGljIGVudW0gRmFjdG9yeU5hbWVzCi17Ci0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwKLQotICAgIFZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZLAotICAgIFZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlksCi0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksCi0gICAgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLAotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLAotCi0gICAgRkFDRVNfTUVTU0FHRV9GQUNUT1JZLAotCi0gICAgUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwKLSAgICBFTF9IRUxQRVJfRkFDVE9SWSwKLQotICAgIFNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZCi19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L05hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDJkMWYwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8VCBleHRlbmRzIE5hbWVNYXBwZXI+DQotew0KLSAgICB2b2lkIHJlZ2lzdGVyKFQgY2xhc3NUb0FkZCk7DQotICAgIHZvaWQgZGVyZWdpc3RlcihDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gY2xhc3NUb0RlcmVnaXN0ZXIpOw0KLSAgICB2b2lkIGRlbnkoQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IGNsYXNzVG9EZW55KTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0Fic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9BYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNTAwYzMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0Fic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRTZWNyZXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3g7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVMaXN0Ym94Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTWVudTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZVJhZGlvOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUNoZWNrYm94Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUxpc3Rib3g7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TWVudTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dGFyZWE7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyDQotew0KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbGlkYXRlRW1wdHlGaWVsZHMoKSAmJiBFeHRWYWxVdGlscy5pc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25BY3RpdmUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyZVJlcXVpcmVkQXR0cmlidXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgY29uZmlndXJlTWF4TGVuZ3RoQXR0cmlidXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUVtcHR5RmllbGRzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLnZhbGlkYXRlRW1wdHlGaWVsZHMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjb25maWd1cmVSZXF1aXJlZEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSk7DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRTZWNyZXQgfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94IHx8DQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lTWVudSB8fA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVSYWRpbyB8fA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUxpc3Rib3ggfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueU1lbnUgfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogaWYgdGhlcmUgaXMgbm8gc3BlY2lhbCBhdHRyaWJ1dGUgYXQgdGhlIGNvbXBvbmVudCB3aGljaCBzaG91bGQgb3ZlcnJ1bGUNCi0gICAgICogdGhlIGFubm90YXRlZCBwcm9wZXJ0eSByZXR1cm4gdHJ1ZSENCi0gICAgICoNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IGNvbXBvbmVudCB3aGljaCBpbXBsZW1lbnRzIHRoZSBFZGl0YWJsZVZhbHVlSG9sZGVyIGludGVyZmFjZQ0KLSAgICAgKiBAcmV0dXJuIGZhbHNlIHRvIG92ZXJydWxlIHRoZSBhbm5vdGF0ZWQgcHJvcGVydHkgZS5nLiBpZiBjb21wb25lbnQgaXMgcmVhZG9ubHkNCi0gICAgICovDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJyZWZhY3RvciIpDQotICAgIHByb3RlY3RlZCBCb29sZWFuIGlzQ29tcG9uZW50UmVxdWlyZWQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzUmVhZG9ubHkiKSkpOw0KLSAgICAgICAgYm9vbGVhbiBpc0Rpc2FibGVkID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNEaXNhYmxlZCIpKSk7DQotDQotICAgICAgICByZXR1cm4gIShpc1JlYWRPbmx5IHx8IGlzRGlzYWJsZWQpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZU1heExlbmd0aEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKTsNCi0NCi0gICAgICAgICAgICBpZighKG1heExlbmd0aCBpbnN0YW5jZW9mIEludGVnZXIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBIdG1sSW5wdXRUZXh0IGh0bWxJbnB1dFRleHQgPSAoSHRtbElucHV0VGV4dCl1aUNvbXBvbmVudDsNCi0gICAgICAgICAgICAgICAgaHRtbElucHV0VGV4dC5zZXRNYXhsZW5ndGgoKEludGVnZXIpbWF4TGVuZ3RoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEh0bWxJbnB1dFNlY3JldCBodG1sSW5wdXRTZWNyZXQgPSAoSHRtbElucHV0U2VjcmV0KXVpQ29tcG9uZW50Ow0KLSAgICAgICAgICAgICAgICBodG1sSW5wdXRTZWNyZXQuc2V0TWF4bGVuZ3RoKChJbnRlZ2VyKW1heExlbmd0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9Db21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOGUzNTUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gaW5pdGlhbGl6ZSBjb21wb25lbnRzIGJlZm9yZUVuY29kZUJlZ2luLjxici8+DQotICogZS5nLjogeW91IGNhbiBhZGQgaW5mb3JtYXRpb24gZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gbWVjaGFuaXNtcywuLi4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBDb21wb25lbnRJbml0aWFsaXplcg0KLXsNCi0gICAgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTljMDQxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXRpY0NvbmZpZ3VyYXRpb248VCwgUj4NCi17DQotICAgIHZvaWQgc2V0U291cmNlT2ZNYXBwaW5nKFN0cmluZyBwYXRoKTsNCi0gICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8VCwgUj4+IGdldE1hcHBpbmcoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uRW50cnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiODRhZjUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgY2xhc3MgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFQsIFI+DQotew0KLSAgICBwcml2YXRlIFQgc291cmNlOw0KLSAgICBwcml2YXRlIFIgdGFyZ2V0Ow0KLQ0KLSAgICBwdWJsaWMgVCBnZXRTb3VyY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc291cmNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZShUIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFIgZ2V0VGFyZ2V0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoUiB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDc1YmY0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkKLXB1YmxpYyBlbnVtIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcwotewotICAgIE1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfQ09ORklHLAotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0NPTkZJRywKLSAgICBTVE9SQUdFX1RZUEVfVE9fU1RPUkFHRV9NQU5BR0VSX0NPTkZJRywKLQotICAgIFNLSVBfVkFMSURBVElPTl9TVVBQT1JUX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1BBUkFNRVRFUl9DT05GSUcKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBjYjZmNC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3MKLSAgICAgICAgPSBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VPZk1hcHBpbmcoU3RyaW5nIHBhdGgpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGdldE1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2Uoc291cmNlKTsKLSAgICAgICAgZW50cnkuc2V0VGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgIHRoaXMubWFwcGluZ3MuYWRkKGVudHJ5KTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYTYzYzQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIFN0cmluZyBwYXRoOwotICAgIHByaXZhdGUgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5nczsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCkKLSAgICB7Ci0gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgICAgIC8vZm9yY2UgcmVsb2FkCi0gICAgICAgIG1hcHBpbmdzID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBnZXRNYXBwaW5nKCkKLSAgICB7Ci0gICAgICAgIGlmKG1hcHBpbmdzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtYXBwaW5nczsKLSAgICAgICAgfQotCi0gICAgICAgIG1hcHBpbmdzID0gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotCi0gICAgICAgIFJlc291cmNlQnVuZGxlIG1hcHBpbmcgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocGF0aCk7Ci0KLSAgICAgICAgaWYgKG1hcHBpbmcgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9sb2dnaW5nCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IG1hcHBpbmcuZ2V0S2V5cygpOwotCi0gICAgICAgIFN0cmluZyBtZXRhRGF0YUtleTsKLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsKLQotICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YURhdGFLZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSBtYXBwaW5nLmdldFN0cmluZyhtZXRhRGF0YUtleSk7Ci0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWV0YURhdGFLZXksIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBtZXRhRGF0YUtleSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2UobWV0YURhdGFLZXkpOwotICAgICAgICBlbnRyeS5zZXRUYXJnZXQodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsKLSAgICAgICAgdGhpcy5tYXBwaW5ncy5hZGQoZW50cnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OTM5NjguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yIGltcGxlbWVudHMgUmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRJbnRlcmNlcHRvcklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJldHVyblZhbHVlT25Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKAotICAgICAgICBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIHNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24sIE9iamVjdCBjdXJyZW50UmV0dXJuVmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gY3VycmVudFJldHVyblZhbHVlOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBiZWZvcmUKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJlZm9yZURlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGFmdGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDI3MTI5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5WYWxpZGF0aW9uTW9kdWxlS2V5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZWwuUHJvcGVydHlOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgeC54LjMKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25JbnRlcmNlcHRvciBleHRlbmRzIEFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIHByb3RlY3RlZCBib29sZWFuIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvblN1cHBvcnRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgICAgICB0aHJvd3MgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBjb21wb25lbnQgaW5pdGlhbGl6YXRpb24gc2V0cyBhIGNvbXBvbmVudCB0byByZXF1aXJlZCBpZiB0aGVyZSBhcmUgY29uc3RyYWludHMgd2hpY2ggaW5kaWNhdGUgaXQKLSAgICAgICAgICogdGhlIHJlcXVpcmVkIGZsYWcgaW4gYSBjb21wb25lbnQgbGVhZHMgdG8gcHJvYmxlbXMgd2l0aCBoOm1lc3NhZ2VzIChhZGRpdGlvbmFsIG1lc3NhZ2UpIGFzIHdlbGwgYXMKLSAgICAgICAgICogaW5jb21wYXRpYmlsaXRpZXMgd2l0aCBza2lwIHZhbGlkYXRpb24gYW5kIHNldmVyaXRpZXMKLSAgICAgICAgICovCi0gICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlciAmJiBFeHRWYWxVdGlscy5pc1JlcXVpcmVkUmVzZXRBY3RpdmF0ZWQoKSAmJgotICAgICAgICAgICAgICAgIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvblN1cHBvcnRlZCgpICYmIEV4dFZhbFV0aWxzLmlzUmVxdWlyZWRJbml0aWFsaXphdGlvbkFjdGl2ZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSAmJiAhaXNDb21wb25lbnRJbml0aWFsaXphdGlvbkRlYWN0aXZhdGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0Q29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3Q7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdCA9IHdyYXBwZWQuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFByb3BlcnR5Tm90Rm91bmRFeGNlcHRpb24gcikKLSAgICAgICAgewotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNGYXRhbEVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5mYXRhbCgiaXQgc2VlbXMgeW91IGFyZSB1c2luZyBhbiBpbnZhbGlkIGJpbmRpbmcuICIgKyB3cmFwcGVkLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICI6IGNvbnZlcnNpb24gZmFpbGVkLiBub3JtYWxseSB0aGlzIGlzID5ub3Q8IGEgbXlmYWNlcyBleHR2YWwgaXNzdWUhIiwgcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydGllcyh1aUNvbXBvbmVudCk7Ci0gICAgICAgIAotICAgICAgICBpZihyZWNvcmRQcm9jZXNzZWRJbmZvcm1hdGlvbigpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL3JlY29yZGUgdXNlciBpbnB1dCBlLmcuIGZvciBjcm9zcy1jb21wb25lbnQgdmFsaWRhdGlvbgotICAgICAgICAgICAgZm9yKFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIgcmVjb3JkZXIgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlY29yZGVyLnJlY29yZFVzZXJJbnB1dCh1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHJlY29yZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjYWxsZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udmVydGVkT2JqZWN0ID0gdHJhbnNmb3JtVmFsdWVGb3JWYWxpZGF0aW9uKGNvbnZlcnRlZE9iamVjdCk7Ci0KLSAgICAgICAgICAgICAgICBpZih2YWxpZGF0ZVZhbHVlKGNvbnZlcnRlZE9iamVjdCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NCZWZvcmVWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVmFsaWRhdG9yRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBtaWdodCBkZWNpZGUgdGhhdCBpdCBpc24ndCBhbiBleGNlcHRpb24KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50KHVpQ29tcG9uZW50LCBlLmdldEZhY2VzTWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZmluYWxFeGNlcHRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbnZlcnRlckV4Y2VwdGlvbihlLmdldEZhY2VzTWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHByb2Nlc3NBZnRlclZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsKLSAgICAgICAgICAgIHJlc2V0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnRpZXModWlDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0JlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5leGVjdXRlR2xvYmFsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWx1ZSwKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uLmNsYXNzLmdldE5hbWUoKSwgZ2V0UHJvcGVydHlJbmZvcm1hdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KSwgZ2V0TW9kdWxlS2V5KCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NBZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIEV4dFZhbFV0aWxzLmV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsdWUsCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIGdldFByb3BlcnR5SW5mb3JtYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCksIGdldE1vZHVsZUtleSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUHJvcGVydHlJbmZvcm1hdGlvbiBnZXRQcm9wZXJ0eUluZm9ybWF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gZ2V0UHJvcGVydGllc0ZvckNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKHVpQ29tcG9uZW50KTsKLQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKHByb3BlcnRpZXMpOwotCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXNGb3JDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgICAgIGlmKGdldE1vZHVsZUtleSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpLCBnZXRNb2R1bGVLZXkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvcGVydGllcy5wdXQoVUlDb21wb25lbnQuY2xhc3MuZ2V0TmFtZSgpLCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpOwotCi0gICAgcHJvdGVjdGVkIE9iamVjdCB0cmFuc2Zvcm1WYWx1ZUZvclZhbGlkYXRpb24oT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkKLSAgICB7Ci0gICAgICAgIGlmICgiIi5lcXVhbHMoY29udmVydGVkT2JqZWN0KSAmJiBpbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRPYmplY3Q7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZShPYmplY3QgY29udmVydGVkT2JqZWN0KQotICAgIHsKLSAgICAgICAgaWYoaXNWYWx1ZVRvVmFsaWRhdGVFbXB0eShjb252ZXJ0ZWRPYmplY3QpICYmICF2YWxpZGF0ZUVtcHR5RmllbGRzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoImVtcHR5IGZpZWxkIHZhbGlkYXRpb24gaXMgZGVhY3RpdmF0ZWQgaW4gdGhlIHdlYi54bWwgLSBzZWU6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLlZBTElEQVRFX0VNUFRZX0ZJRUxEUyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbHVlVG9WYWxpZGF0ZUVtcHR5KE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpCi0gICAgewotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0ID09IG51bGwgfHwgIiIuZXF1YWxzKGNvbnZlcnRlZE9iamVjdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVFbXB0eUZpZWxkcygpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMudmFsaWRhdGVFbXB0eUZpZWxkcygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGludGVycHJldEVtcHR5U3RyaW5nVmFsdWVzQXNOdWxsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5pbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKAotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIgJiYgaXNWYWx1ZUJpbmRpbmdPZkNvbXBvbmVudFZhbGlkKHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWx1ZUJpbmRpbmdPZkNvbXBvbmVudFZhbGlkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKHVpQ29tcG9uZW50KSAhPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25EZWFjdGl2YXRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ09NUE9ORU5UX0lOSVRJQUxJWkFUSU9OKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWNvcmRQcm9jZXNzZWRJbmZvcm1hdGlvbigpCi0gICAgewotICAgICAgICAvL292ZXJyaWRlIGlmIG5lZWRlZAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENsYXNzIGdldE1vZHVsZUtleSgpCi0gICAgewotICAgICAgICAvL292ZXJyaWRlIGlmIG5lZWRlZAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRJbnRlcmNlcHRvclByb3BlcnRpZXMoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgICAgIGlmKGdldE1vZHVsZUtleSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5wdXQoVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCksIGdldE1vZHVsZUtleSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQucHV0KFVJQ29tcG9uZW50LmNsYXNzLmdldE5hbWUoKSwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0aWVzKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZSBpbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZSA9IGdldFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UoKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBnZXRJbnRlcmNlcHRvclByb3BlcnRpZXModWlDb21wb25lbnQpOwotICAgICAgICBmb3IoU3RyaW5nIGtleSA6IHByb3BlcnRpZXMua2V5U2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLnNldFByb3BlcnR5KGtleSwgcHJvcGVydGllcy5nZXQoa2V5KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydGllcyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UgaW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UgPSBnZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlKCk7Ci0KLSAgICAgICAgZm9yKFN0cmluZyBrZXkgOiBnZXRJbnRlcmNlcHRvclByb3BlcnRpZXModWlDb21wb25lbnQpLmtleVNldCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5yZW1vdmVQcm9wZXJ0eShrZXkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlIGdldFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5jbGFzcywKLSAgICAgICAgICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Bd2FyZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Db21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmNzExOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Db21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlclN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Bd2FyZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKEpzZlV0aWxzLmlzUmVuZGVyUmVzcG9uc2VQaGFzZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFmdGVyRXh0cmFjdGluZ0ZvckNvbXBvbmVudEluaXRpYWxpemF0aW9uKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFmdGVyRXh0cmFjdGluZ0ZvckNvbXBvbmVudEluaXRpYWxpemF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbik7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0ZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9GYWNlc01lc3NhZ2VQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTZiMTYzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0ZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkZhY2VzTWVzc2FnZVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDkwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBGYWNlc01lc3NhZ2VQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2VTdG9yYWdlIGZhY2VzTWVzc2FnZVN0b3JhZ2UgPSBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKA0KLSAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLCBGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBpZihmYWNlc01lc3NhZ2VTdG9yYWdlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNNZXNzYWdlU3RvcmFnZS5hZGRBbGwoKTsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5yZXNldFN0b3JhZ2UoRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcywgRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0h0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkN2M5MjguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5MYWJlbGVkTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLmV4Y2VwdGlvbi5SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFNlY3JldDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVMaXN0Ym94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVSYWRpbzsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueU1lbnU7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dGFyZWE7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpCi0gICAgewotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSBFeHRWYWxVdGlscy5jb252ZXJ0RmFjZXNNZXNzYWdlKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSk7Ci0KLSAgICAgICAgICAgIHRyeVRvVXNlSW5saW5lTWVzc2FnZSh1aUNvbXBvbmVudCwgdmFsaWRhdG9yRXhjZXB0aW9uKTsKLQotICAgICAgICAgICAgdHJ5VG9Vc2VMYWJlbChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBmYWNlc01lc3NhZ2UpOwotCi0gICAgICAgICAgICB0cnlUb0Jsb2Nrc05hdmlnYXRpb24odWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGZhY2VzTWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvVXNlSW5saW5lTWVzc2FnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCk7Ci0gICAgICAgIFN0cmluZyBpbmxpbmVNZXNzYWdlOwotCi0gICAgICAgIGlmKHZhbGlkYXRvckV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmxpbmVNZXNzYWdlID0gZ2V0SW5saW5lUmVxdWlyZWRNZXNzYWdlKHVpQ29tcG9uZW50KTsKLQotICAgICAgICAgICAgaWYoaW5saW5lTWVzc2FnZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGlubGluZU1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoaW5saW5lTWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgaW5saW5lTWVzc2FnZSA9IGdldElubGluZVZhbGlkYXRvck1lc3NhZ2UodWlDb21wb25lbnQpOwotCi0gICAgICAgICAgICBpZihpbmxpbmVNZXNzYWdlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoaW5saW5lTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldERldGFpbChpbmxpbmVNZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1VzZUxhYmVsKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpCi0gICAgewotICAgICAgICBTdHJpbmcgbGFiZWwgPSAoU3RyaW5nKSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsCi0gICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldExhYmVsIikpOwotCi0gICAgICAgIGlmKGxhYmVsID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxhYmVsID0gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vb3ZlcnJpZGUgdGhlIGxhYmVsIGlmIHRoZSBhbm5vdGF0aW9uIHByb3ZpZGVzIGEgbGFiZWwKLSAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxhYmVsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCwgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIExhYmVsZWRNZXNzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKExhYmVsZWRNZXNzYWdlKWZhY2VzTWVzc2FnZSkuc2V0TGFiZWxUZXh0KGxhYmVsKTsKLSAgICAgICAgfQotICAgICAgICAvL2lmIHNvbWVvbmUgdXNlcyBhIG5vcm1hbCBmYWNlcyBtZXNzYWdlCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwoZmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiY2hlY2sgaWYgaXQgaXMgc3RpbGwgcmVxdWlyZWQgaGVyZSIpCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvQmxvY2tzTmF2aWdhdGlvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQotICAgIHsKLSAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vY29ycmVjdCBzZXZlcml0eSBpcyBlLmcuIHByb3ZpZGVkIGJ5IFZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yCi0gICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnQodWlDb21wb25lbnQsIGZhY2VzTWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRJbmxpbmVSZXF1aXJlZE1lc3NhZ2UoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gKFN0cmluZylSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJnZXRSZXF1aXJlZE1lc3NhZ2UiKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW5saW5lVmFsaWRhdG9yTWVzc2FnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCh1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldFZhbGlkYXRvck1lc3NhZ2UiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lUmFkaW8gfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TGlzdGJveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFkMjFkZS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlJbmZvcm1hdGlvbiB0aGUgaW5mb3JtYXRpb24gZW50cnkgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3BlcnR5DQotICAgICAqLw0KLSAgICB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRjZjUyNy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotew0KLSAgICAvKioNCi0gICAgICogQHJldHVybiBmYWxzZSBpZiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzIHNob3VsZCBiZSBieXBhc3NlZA0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpOw0KLQ0KLSAgICAvKioNCi0gICAgICogcHJvY2Vzc2VkIGlmIHZhbGlkYXRpb24gd2FzIGV4ZWN1dGVkDQotICAgICAqIGluIGNvbnRyYXN0IHRvIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpdCBnZXRzIGV4ZWN1dGVkIGluIGFueSBjYXNlDQotICAgICAqLw0KLSAgICB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzFmMDU0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbGxvd3MgdG8gaW50ZXJjZXB0IHJlbmRlcmVyIG1ldGhvZHMuPGJyLz4KLSAqIEJhc2UgbWVjaGFuaXNtIG9mIGV4dHZhbC4gSXQgYWxsb3dzIHRvIGFkZCBjdXN0b20gaW5mcmFzdHJ1Y3R1cmVzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBSZW5kZXJlckludGVyY2VwdG9yCi17Ci0gICAgU3RyaW5nIGdldEludGVyY2VwdG9ySWQoKTsKLQotICAgIE9iamVjdCBnZXRSZXR1cm5WYWx1ZU9uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBza2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLCBPYmplY3QgY3VycmVudFJldHVyblZhbHVlKTsKLQotICAgIC8qCi0gICAgICogYmVmb3JlCi0gICAgICovCi0gICAgdm9pZCBiZWZvcmVEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKgotICAgICAqIGFmdGVyCi0gICAgICovCi0gICAgdm9pZCBhZnRlckRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGVjM2QwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlclN1cHBvcnQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gaW50ZXJjZXB0IHZhbGlkYXRpb3IgZXhjZXB0aW9ucy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAqIEBwYXJhbSBtZXRhRGF0YUVudHJ5IHRoZSBtZXRhIGRhdGEgZW50cnkgd2hpY2ggY29udGFpbnMgdGhlIG1ldGEgZGF0YSBvZiB0aGUgcHJvcGVydHkNCi0gICAgICogQHBhcmFtIGNvbnZlcnRlZE9iamVjdCB0aGUgY29udmVydGVkIHVzZXIgaW5wdXQNCi0gICAgICogQHBhcmFtIHZhbGlkYXRvckV4Y2VwdGlvbiB0aGUgY3VycmVudCBleGNlcHRpb24NCi0gICAgICogQHBhcmFtIHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IHdoaWNoIHRocmV3IHRoZSBleGNlcHRpb24NCi0gICAgICogQHJldHVybiBmYWxzZSB0byBzdG9wIHRocm93aW5nIHRoZSBleGNlcHRpb24NCi0gICAgICovDQotICAgIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZTE1ZTAuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkludGVyY2VwdG9yIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25TdXBwb3J0ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHRvIGluaXQgY29tcG9uZW50ICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhUmVzdWx0ID0gRXh0VmFsVXRpbHMKLSAgICAgICAgICAgICAgICAuZ2V0VHJhbnNmb3JtZWRNZXRhRGF0YUZvcihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBnZXRNb2R1bGVLZXkoKSk7Ci0KLSAgICAgICAgLy9nZXQgY29tcG9uZW50IGluaXRpYWxpemVyIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQgYW5kIGNvbmZpZ3VyZSBpdAotICAgICAgICAvL2Fsc28gaW4gY2FzZSBvZiBza2lwcGVkIHZhbGlkYXRpb24gdG8gcmVzZXQgZS5nLiB0aGUgcmVxdWlyZWQgYXR0cmlidXRlCi0gICAgICAgIGlmKCFtZXRhRGF0YVJlc3VsdC5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbmZpZ3VyZUNvbXBvbmVudFdpdGhNZXRhRGF0YShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YVJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJpbml0IGNvbXBvbmVudCBvZiAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkKLSAgICB7Ci0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gRXh0VmFsVXRpbHMKLSAgICAgICAgICAgICAgICAuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JXaXRoKGdldFByb3BlcnRpZXNGb3JDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcih1aUNvbXBvbmVudCkpOwotCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG1ldGFEYXRhRXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgdmFsaWRhdGlvbiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcm9jZXNzRmllbGRWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInZhbGlkYXRpb24gZmluaXNoZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JXaXRoKHByb3BlcnRpZXMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NGaWVsZFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7Ci0gICAgICAgIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKTsKLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogcHJvcGVydHlJbmZvcm1hdGlvbi5nZXRNZXRhRGF0YUVudHJpZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOwotCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgaXNWYWxpZGF0aW9uU3RyYXRlZ3lDb21wYXRpYmxlV2l0aFZhbHVlKHZhbGlkYXRpb25TdHJhdGVneSwgIGNvbnZlcnRlZE9iamVjdCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoc2tpcFZhbGlkYXRpb25FdmFsdWF0b3Iuc2tpcFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblN0cmF0ZWd5LCBlbnRyeSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJza2lwIHZhbGlkYXRpb24gb2YgIiArIGVudHJ5LmdldFZhbHVlKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggIiArIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy9kb24ndCBicmVhayBtYXliZSB0aGVyZSBhcmUgY29uc3RyYWludHMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCB0aGUgc2tpcC1tZWNoYW5pc20KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInZhbGlkYXRlICIgKyBlbnRyeS5nZXRWYWx1ZSgpICsgIiB3aXRoICIgKyB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb24pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFFeHRWYWxVdGlscy5leGVjdXRlTG9jYWxCZWZvcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiB2YWxpZGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZW50cnksIGNvbnZlcnRlZE9iamVjdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5leGVjdXRlTG9jYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIHByb3BlcnR5SW5mb3JtYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYodmFsaWRhdGlvblN0cmF0ZWd5ID09IG51bGwgJiYgbG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyB2YWxpZGF0aW9uIHN0cmF0ZWd5IGZvdW5kIGZvciAiICsgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkYXRpb25TdHJhdGVneUNvbXBhdGlibGVXaXRoVmFsdWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3MgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5pc0Fubm90YXRpb25QcmVzZW50KE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAhIiIuZXF1YWxzKHZhbHVlKSB8fCBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpKQotICAgICAgICAgICAgICAgIC5pc0Fubm90YXRpb25QcmVzZW50KEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneS5jbGFzcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgLyoqCi0gICAgICogdG8gZW5zdXJlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVjb3JkUHJvY2Vzc2VkSW5mb3JtYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmlvbGF0aW9uU2V2ZXJpdHlWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Zpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MzRjNjEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmlvbGF0aW9uU2V2ZXJpdHlWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDkwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYoaXNFeHRWYWxNZXRhRGF0YShtZXRhRGF0YUVudHJ5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb1BsYWNlU2V2ZXJpdHkodmFsaWRhdG9yRXhjZXB0aW9uLCBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0V4dFZhbE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb247DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvUGxhY2VTZXZlcml0eShWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLCBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGZvcihGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkgOiBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkNCi0gICAgICAgICAgICAgICAgLmV4dHJhY3QoYW5ub3RhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eS5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLnNldFNldmVyaXR5KHNldmVyaXR5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZDM4NjUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBBIGdlbmVyaWMgaW1wbGVtZW50YXRpb24uIFN1YmNsYXNzZXMganVzdCBoYXZlIHRvIG5vdyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIG5hbWUgbWFwcGVyLg0KLSAqDQotICogTmFtZU1hcHBlcnMgYXJlIHN0YXRlbGVzcy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxUPiBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VD4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotICAgIHByaXZhdGUgTmFtZU1hcHBlcjxUPiBjdXN0b21OYW1lTWFwcGVyOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVCBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIGlmIChjdXN0b21OYW1lTWFwcGVyID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKTsNCi0NCi0gICAgICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXN0b21OYW1lTWFwcGVyID0gKE5hbWVNYXBwZXI8VD4pIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoY3VzdG9tTmFtZU1hcHBlciAhPSBudWxsKSA/IGN1c3RvbU5hbWVNYXBwZXIuY3JlYXRlTmFtZShzb3VyY2UpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL05hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MzFjYjYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL05hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXJTdXBwb3J0Ow0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSBmb3IgbmFtZSBtYXBwZXJzLg0KLSAqIEEgbmFtZSBtYXBwZXIgY2FsY3VsYXRlcyBhIG5hbWUgZm9yIGEgZ2l2ZW4gc291cmNlIG9iamVjdC4NCi0gKiBlLmcuIE1ldGEtRGF0YSBLZXkgKGUuZy46IGFubm90YXRpb24gY2xhc3MgbmFtZSkgLT4gVmFsaWRhdGlvblN0cmF0ZWd5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgU3RyaW5nIGNyZWF0ZU5hbWUoVCBzb3VyY2UpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNmRkZDIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL1N1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogaW50ZXJmYWNlIGZvciBuYW1lLW1hcHBlcnMgd2hpY2ggaGF2ZSB0byBkZWxlZ2F0ZSB0byBvdGhlciAoc3ViLSluYW1lLW1hcHBlcnMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyPFQ+IGV4dGVuZHMgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgdm9pZCBhZGROYW1lTWFwcGVyKE5hbWVNYXBwZXI8VD4gbmFtZU1hcHBlcik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL0NvbW1vbk1ldGFEYXRhS2V5cy5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvQ29tbW9uTWV0YURhdGFLZXlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYWU2MzcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvQ29tbW9uTWV0YURhdGFLZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGhlbHBlciBmb3IgZnJlcXVlbnQgbWV0YS1kYXRhIGtleXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogcGxhY2VkIGluIGNvcmUgdG8gYXZvaWQgZHVwbGljYXRlZCBpbmZvcm1hdGlvbiBpbiBtdWx0aXBsZSBtb2R1bGVzICh2YWxpZGF0aW9uIG1vZHVsZSBhbmQgY29tcG9uZW50LXN1cHBvcnQgbW9kdWxlKQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBDb21tb25NZXRhRGF0YUtleXMNCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRUQgPSAicmVxdWlyZWQiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQUtfUkVRVUlSRUQgPSAid2Vha19yZXF1aXJlZCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOX0xFTkdUSCA9ICJtaW5fbGVuZ3RoIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5fTEVOR1RIX0RFRkFVTFQgPSAibWluX2xlbmd0aF9kZWZhdWx0IjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfTEVOR1RIID0gIm1heF9sZW5ndGgiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9MRU5HVEhfREVGQVVMVCA9ICJtYXhfbGVuZ3RoX2RlZmF1bHQiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01JTiA9ICJyYW5nZV9taW4iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01JTl9ERUZBVUxUID0gInJhbmdlX21pbl9kZWZhdWx0IjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9NQVggPSAicmFuZ2VfbWF4IjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9NQVhfREVGQVVMVCA9ICJyYW5nZV9tYXhfZGVmYXVsdCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUVEVSTiA9ICJwYXR0ZXJuIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRURVJOX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRSA9ICJwYXR0ZXJuX3ZhbGlkYXRpb25fZXJyb3JfbWVzc2FnZSI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1BSUwgPSAiZW1haWwiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTSA9ICJjdXN0b20iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSVBfVkFMSURBVElPTiA9ICJza2lwX3ZhbGlkYXRpb24iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfQ0xJRU5UX1NJREVfVkFMSURBVElPTiA9ICJkaXNhYmxlX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24iOw0KLSAgICAvL2F2YWlsYWJsZSBmb3IgYWRkLW9ucyBub3QgdXNlZCBpbnRlcm5hbGx5IGR1ZSB0byBwZXJmb3JtYW5jZSByZWFzb25zDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRV9TSE9XX0lORElDQVRJT04gPSAiZGlzYWJsZV9zaG93X2luZGljYXRpb24iOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9NZXRhRGF0YUVudHJ5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9NZXRhRGF0YUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNTQ1ODIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvTWV0YURhdGFFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIERhdGEgaG9sZGVyIHdoaWNoIHN0b3JlcyB0aGUgbWV0YS1kYXRhIGFuZCBzb21lIGluZm9ybWF0aW9uIHdoZXJlIHRoZSBtZXRhLWRhdGEgd2FzIGFyb3VuZC4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBNZXRhRGF0YUVudHJ5Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGtleTsKLSAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRLZXkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJzZXR0aW5nIG1ldGEtZGF0YSBrZXk6ICIgKyBrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIDxUPiBUIGdldFZhbHVlKENsYXNzPFQ+IHRhcmdldENsYXNzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUKWdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoInNldHRpbmcgbWV0YS1kYXRhIHZhbHVlOiAiICsgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmdldChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gVCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVClnZXRQcm9wZXJ0eShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJuZXcgcHJvcGVydHkgYWRkZWQga2V5OiAiICsga2V5ICsgIiB2YWx1ZTogIiArIHZhbHVlICsgIiBmb3IgbWV0YWRhdGEta2V5OiAiICsgdGhpcy5rZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZGMyNmQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGFsbCBmYWN0b3JpZXMgd2hpY2ggY3JlYXRlIG1ldGEtZGF0YSBleHRyYWN0b3JzCi0gKiAKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkKLXsKLSAgICBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGUoKTsKLQotICAgIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZVdpdGgoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsKLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU0Y2NjYS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuTWV0YURhdGFTdG9yYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUHJvcGVydHlTdG9yYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBleHRyYWN0cyBtZXRhLWRhdGEgKGUuZy4gdGhlIGFubm90YXRpb25zKSBvZiB0aGUgdmFsdWUgYmluZGluZyBvZiBhIGNvbXBvbmVudC4KLSAqIEl0IGV4dHJhY3RzIHRoZSBtZXRhLWRhdGEgb2YgdGhlIGZpZWxkIGFuZCB0aGUgcHJvcGVydHkuCi0gKiAoQWxzbyB0aGUgYW5ub3RhdGlvbnMgb2Ygc3VwZXIgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcy4pCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3RvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkKLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsKLQotICAgICAgICAvL3Nob3VsZCBuZXZlciBvY2N1cgotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkgJiYgb2JqZWN0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihvYmplY3QuZ2V0Q2xhc3MoKSArICIgaXMgbm8gdmFsaWQgY29tcG9uZW50Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50ID0gKFVJQ29tcG9uZW50KSBvYmplY3Q7Ci0KLSAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGV4dHJhY3RpbmcgbWV0YS1kYXRhIG9mICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5RGV0YWlscyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGdldCBiZWFuIGNsYXNzIGFuZCBwcm9wZXJ0eSBuYW1lCi0gICAgICAgICAqLwotICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpKTsKLQotICAgICAgICAvL2NyZWF0ZQotICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnNldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIHByb3BlcnR5RGV0YWlscyk7Ci0KLSAgICAgICAgaWYgKGlzQ2FjaGVkKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5IDogZ2V0Q2FjaGVkTWV0YURhdGEoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLmFkZE1ldGFEYXRhRW50cnkobWV0YURhdGFFbnRyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBleHRyYWN0QW5ub3RhdGlvbnMocHJvcGVydHlJbmZvcm1hdGlvbiwgcHJvcGVydHlEZXRhaWxzLCBlbnRpdHlDbGFzcyk7Ci0gICAgICAgICAgICBjYWNoZU1ldGFEYXRhKHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImV4dHJhY3QgZmluaXNoZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NhY2hlZChDbGFzcyBlbnRpdHlDbGFzcywgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldE1ldGFEYXRhU3RvcmFnZSgpLmNvbnRhaW5zTWV0YURhdGFGb3IoZW50aXR5Q2xhc3MsIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2FjaGVNZXRhRGF0YShQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBnZXRNZXRhRGF0YVN0b3JhZ2UoKS5zdG9yZU1ldGFEYXRhT2YocHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRhRGF0YUVudHJ5W10gZ2V0Q2FjaGVkTWV0YURhdGEoQ2xhc3MgZW50aXR5Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRNZXRhRGF0YVN0b3JhZ2UoKS5nZXRNZXRhRGF0YShlbnRpdHlDbGFzcywgcHJvcGVydHkpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWV0YURhdGFTdG9yYWdlIGdldE1ldGFEYXRhU3RvcmFnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShNZXRhRGF0YVN0b3JhZ2UuY2xhc3MsIE1ldGFEYXRhU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NhY2hlZEZpZWxkKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5U3RvcmFnZSgpLmNvbnRhaW5zRmllbGQoZW50aXR5LCBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvQ2FjaGVkRmllbGQoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksIEZpZWxkIGZpZWxkKQotICAgIHsKLSAgICAgICAgUHJvcGVydHlTdG9yYWdlIHByb3BlcnR5U3RvcmFnZSA9IGdldFByb3BlcnR5U3RvcmFnZSgpOwotICAgICAgICBpZiAoIXByb3BlcnR5U3RvcmFnZS5jb250YWluc0ZpZWxkKGVudGl0eSwgcHJvcGVydHkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVN0b3JhZ2Uuc3RvcmVGaWVsZChlbnRpdHksIHByb3BlcnR5LCBmaWVsZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpZWxkIGdldENhY2hlZEZpZWxkKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5U3RvcmFnZSgpLmdldEZpZWxkKGVudGl0eSwgcHJvcGVydHkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NhY2hlZE1ldGhvZChDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eVN0b3JhZ2UoKS5jb250YWluc01ldGhvZChlbnRpdHksIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9DYWNoZWRNZXRob2QoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksIE1ldGhvZCBtZXRob2QpCi0gICAgewotICAgICAgICBQcm9wZXJ0eVN0b3JhZ2UgcHJvcGVydHlTdG9yYWdlID0gZ2V0UHJvcGVydHlTdG9yYWdlKCk7Ci0gICAgICAgIGlmICghcHJvcGVydHlTdG9yYWdlLmNvbnRhaW5zTWV0aG9kKGVudGl0eSwgcHJvcGVydHkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVN0b3JhZ2Uuc3RvcmVNZXRob2QoZW50aXR5LCBwcm9wZXJ0eSwgbWV0aG9kKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWV0aG9kIGdldENhY2hlZE1ldGhvZChDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eVN0b3JhZ2UoKS5nZXRNZXRob2QoZW50aXR5LCBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eVN0b3JhZ2UgZ2V0UHJvcGVydHlTdG9yYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKFByb3BlcnR5U3RvcmFnZS5jbGFzcywgUHJvcGVydHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZXh0cmFjdEFubm90YXRpb25zKAotICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uLCBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLCBDbGFzcyBlbnRpdHlDbGFzcykKLSAgICB7Ci0gICAgICAgIHdoaWxlICghT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoZW50aXR5Q2xhc3MuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICAgICAgYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9ucyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICAgICAgZW50aXR5Q2xhc3MgPSBlbnRpdHlDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ludGVyZmFjZXMoCi0gICAgICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MsIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMsIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IGN1cnJlbnRDbGFzcy5nZXRJbnRlcmZhY2VzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoY3VycmVudEludGVyZmFjZSwgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhjdXJyZW50SW50ZXJmYWNlLCBwcm9wZXJ0eURldGFpbHMsIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QgPSB0cnlUb0dldFJlYWRNZXRob2QoZW50aXR5LCBwcm9wZXJ0eSk7Ci0KLSAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRob2QgPSB0cnlUb0dldFJlYWRNZXRob2RNYW51YWxseShlbnRpdHksIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DYWNoZWRNZXRob2QoZW50aXR5LCBwcm9wZXJ0eSwgbWV0aG9kKTsKLSAgICAgICAgICAgIGFkZEFubm90YXRpb25Ub0Fubm90YXRpb25FbnRyaWVzKEFycmF5cy5hc0xpc3QobWV0aG9kLmdldEFubm90YXRpb25zKCkpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWV0aG9kIHRyeVRvR2V0UmVhZE1ldGhvZChDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIGlmIChpc0NhY2hlZE1ldGhvZChlbnRpdHksIHByb3BlcnR5KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldENhY2hlZE1ldGhvZChlbnRpdHksIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh1c2VCZWFuSW5mbygpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCZWFuSW5mbyBiZWFuSW5mbyA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhlbnRpdHkpOwotICAgICAgICAgICAgICAgIGZvciAoUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA6IGJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yLmdldE5hbWUoKSkgJiYgcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUJlYW5JbmZvKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBCb29sZWFuLlRSVUUuZXF1YWxzKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KEJlYW5JbmZvLmNsYXNzLmdldE5hbWUoKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWV0aG9kIHRyeVRvR2V0UmVhZE1ldGhvZE1hbnVhbGx5KENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHByb3BlcnR5LnN1YnN0cmluZygxKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgLy9jaGFuZ2VkIHRvIG9mZmljaWFsIGJlYW4gc3BlYy4gZHVlIHRvIGNhY2hpbmcgdGhlcmUgaXMgbm8gcGVyZm9ybWFuY2UgaXNzdWUgYW55IG1vcmUKLSAgICAgICAgICAgIHJldHVybiBlbnRpdHkuZ2V0RGVjbGFyZWRNZXRob2QoImlzIiArIHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHkuZ2V0RGVjbGFyZWRNZXRob2QoImdldCIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibWV0aG9kIG5vdCBmb3VuZCAtIGNsYXNzOiAiICsgZW50aXR5LmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtIG1ldGhvZHM6ICIgKyAiZ2V0IiArIHByb3BlcnR5ICsgIiAiICsgImlzIiArIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBGaWVsZCBmaWVsZDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmllbGQgPSBnZXREZWNsYXJlZEZpZWxkKGVudGl0eSwgcHJvcGVydHkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKCJfIiArIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5sZW5ndGgoKSA+IDEgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuaXNVcHBlckNhc2UocHJvcGVydHkuY2hhckF0KDApKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShwcm9wZXJ0eS5jaGFyQXQoMSkpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2Rvbid0IHVzZSBJbnRyb3NwZWN0b3IjZGVjYXBpdGFsaXplIGhlcmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gZW50aXR5LmdldERlY2xhcmVkRmllbGQocHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvTG93ZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgPSBlbnRpdHkuZ2V0RGVjbGFyZWRGaWVsZChJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKHByb3BlcnR5KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJmaWVsZCAiICsgcHJvcGVydHkgKyAiIG9yIF8iICsgcHJvcGVydHkgKyAiIG5vdCBmb3VuZCIsIGUxKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmllbGQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DYWNoZWRGaWVsZChlbnRpdHksIHByb3BlcnR5LCBmaWVsZCk7Ci0gICAgICAgICAgICBhZGRBbm5vdGF0aW9uVG9Bbm5vdGF0aW9uRW50cmllcyhBcnJheXMuYXNMaXN0KGZpZWxkLmdldEFubm90YXRpb25zKCkpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgRmllbGQgZ2V0RGVjbGFyZWRGaWVsZChDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoaXNDYWNoZWRGaWVsZChlbnRpdHksIHByb3BlcnR5KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldENhY2hlZEZpZWxkKGVudGl0eSwgcHJvcGVydHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uVG9Bbm5vdGF0aW9uRW50cmllcygKLSAgICAgICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMsIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uYWRkTWV0YURhdGFFbnRyeShjcmVhdGVNZXRhRGF0YUVudHJ5Rm9yQW5ub3RhdGlvbihhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoYW5ub3RhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBNZXRhRGF0YUVudHJ5IGNyZWF0ZU1ldGFEYXRhRW50cnlGb3JBbm5vdGF0aW9uKEFubm90YXRpb24gZm91bmRBbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgTWV0YURhdGFFbnRyeSBlbnRyeSA9IG5ldyBNZXRhRGF0YUVudHJ5KCk7Ci0KLSAgICAgICAgZW50cnkuc2V0S2V5KGZvdW5kQW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIGVudHJ5LnNldFZhbHVlKGZvdW5kQW5ub3RhdGlvbik7Ci0KLSAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Zjc2NDViLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyBmYWN0b3J5IGNyZWF0ZXMgYSBtZXRhLWRhdGEgZXh0cmFjdG9yIHdoaWNoIGV4dHJhY3RzIHRoZSBtZXRhLWRhdGEKLSAqIG9mIHRoZSB2YWx1ZSBiaW5kaW5nIG9mIGEgY29tcG9uZW50LgotICogPHAvPgotICogb3JkZXI6PGJyLz4KLSAqIDxvbD4KLSAqICAgPGxpPmNvbmZpZ3VyZWQgbWV0YS1kYXRhIGV4dHJhY3RvciAod2ViLnhtbCk8L2xpPgotICogICA8bGk+Y29uZmlndXJlZCBtZXRhLWRhdGEgZXh0cmFjdG9yIChpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKTwvbGk+Ci0gKiAgIDxsaT5kZWZhdWx0IGltcGxlbWVudGF0aW9uPC9saT4KLSAqIDwvb2w+Ci0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IG51bGw7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikKLSAgICBwdWJsaWMgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVXaXRoKG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGVXaXRoKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3RvciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUik7Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUikpOwotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yID0gKE1ldGFEYXRhRXh0cmFjdG9yKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3RvciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShtZXRhRGF0YUV4dHJhY3Rvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY3JlYXRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3JXaXRoKG1ldGFEYXRhRXh0cmFjdG9yLCBwcm9wZXJ0aWVzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9NZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDQwNTFkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9NZXRhRGF0YUV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotCi0vKioKLSAqIEFuIG1ldGEtZGF0YSBleHRyYWN0b3IgaXMgcmVzcG9uc2libGUgdG8gYW5hbHl6ZSBhbiBvYmplY3QKLSAqIGFuZCByZXR1cm5zIGFsbCBhdmFpbGFibGUgbWV0YS1kYXRhIGluZm9ybWF0aW9uCi0gKiAKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBNZXRhRGF0YUV4dHJhY3RvcgotewotICAgIFByb3BlcnR5SW5mb3JtYXRpb24gZXh0cmFjdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OTkxMmEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIGl0J3MganVzdCBhIGhlbHBlciBmb3IgcHJveGllcyAtIHlvdSBqdXN0IG5lZWQgaXQsIGlmIHlvdSBkZWZpbmUgdGhlIGVxdWl2YWxlbnQgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotICoNCi0gKiBpZiB0aGVyZSBpcyBhbHNvIGEgcHJveHkgZm9yIHRoZSBleHRyYWN0b3IgeW91IGNhbiB1c2UgdGhlIGNsYXNzTmFtZSBwcm9wZXJ0eSB0byBtYW51YWxseSByZXBlYXQgdGhlDQotICogZnVsbCBxdWFsaWZpZWQgY2xhc3MgbmFtZS4NCi0gKg0KLSAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBpbnRlcmZhY2UgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyIGV4dGVuZHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbC5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGVhODE5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSBlcXVpdmFsZW50IHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0Lg0KLSAqDQotICogaWYgdGhlcmUgaXMgYWxzbyBhIHByb3h5IGZvciB0aGUgdHJhbnNmb3JtZXIgeW91IGNhbiB1c2UgdGhlIGNsYXNzTmFtZSBwcm9wZXJ0eSB0byBtYW51YWxseSByZXBlYXQgdGhlDQotICogZnVsbCBxdWFsaWZpZWQgY2xhc3MgbmFtZS4NCi0gKg0KLSAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBjbGFzcyBCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lciwgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZTsNCi0NCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lci5jb252ZXJ0TWV0YURhdGEobWV0YURhdGFFbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZShTdHJpbmcgbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lID0gbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFUcmFuc2Zvcm1lciBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFUcmFuc2Zvcm1lcihNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lciA9IG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJjM2FlZS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLlN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuTmVzdGVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyLg0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyB0aGUgTWV0YURhdGFUcmFuc2Zvcm1lciBmb3IgYSBnaXZlbiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogVmFsaWRhdGlvblN0cmF0ZWd5IC0+IE1ldGFEYXRhVHJhbnNmb3JtZXIgaW5zdGVhZCBvZiBNZXRhLURhdGEgLT4gTWV0YURhdGFUcmFuc2Zvcm1lcg0KLSAqIHRvIGF2b2lkIGEgc2Vjb25kIHN0YXRpYyBtYXBwaW5nIGUuZy4gZm9yIGpwYSBhbm5vdGF0aW9ucw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotICAgICAgICBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YVRyYW5zZm9ybWVyPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmc7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KCk7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IHN1Yk5hbWVNYXBwZXJMaXN0ID0NCi0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotDQotICAgICAgICAvL3NpbmNlIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBzdGFydHVwIGxpc3RlbmVyIG9mIHRoZSBjb3JlIGdldHMgZXhlY3V0ZWQgZmlyc3QNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgY3JlYXRlKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lID0gY3JlYXRlVmFsaWRhdGlvblN0cmF0ZWd5TmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgdHJ5VG9Jbml0U3RhdGljTWFwcGluZ3MoKTsNCi0NCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lciA9DQotICAgICAgICAgICAgICAgIHRyeVRvUmVzb2x2ZUNhY2hlZE1ldGFEYXRhVHJhbnNmb3JtZXIodmFsaWRhdGlvblN0cmF0ZWd5LCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0NCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBjcmVhdGVBbmRDYWNoZU1ldGFEYXRhVHJhbnNmb3JtZXIodmFsaWRhdGlvblN0cmF0ZWd5LCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gaXNQcm94eURldGVjdGVkID0gaXNQcm94eSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGEgcHJveHkgYW5kIHRoZSB1c2FnZSBvZiBhIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICAgICAgICBpZiAoaXNQcm94eURldGVjdGVkICYmIHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoKEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKXZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuICFpc1Byb3h5RGV0ZWN0ZWQgPyBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0luaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUHJveHkoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSA9PSBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciBjcmVhdGVBbmRDYWNoZU1ldGFEYXRhVHJhbnNmb3JtZXIoDQotICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgIFN0cmluZyB0cmFuc2Zvcm1lck5hbWU7DQotICAgICAgICAvL251bGwgLT4gdXNlIG5hbWUgbWFwcGVycw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyYW5zZm9ybWVyTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lck5hbWUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyID0gdHJ5VG9DcmVhdGVBbmRDYWNoZU1ldGFEYXRhVHJhbnNmb3JtZXIoDQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3ksIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIHRyYW5zZm9ybWVyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIHRyeVRvUmVzb2x2ZUNhY2hlZE1ldGFEYXRhVHJhbnNmb3JtZXIoDQotICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHZhbGlkYXRpb25TdHJhdGVneU5hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoTWV0YURhdGFUcmFuc2Zvcm1lcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcuZ2V0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgbmV3VmFsaWRhdGlvblN0cmF0ZWd5TmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneU5hbWUgKyBJZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kuSURfUFJFRklYICsNCi0gICAgICAgICAgICAgICAgICAgICgoSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KXZhbGlkYXRpb25TdHJhdGVneSkuZ2V0SWQoKTsNCi0NCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZy5jb250YWluc0tleShuZXdWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiAoTWV0YURhdGFUcmFuc2Zvcm1lcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoDQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLmdldChuZXdWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIHRyeVRvQ3JlYXRlQW5kQ2FjaGVNZXRhRGF0YVRyYW5zZm9ybWVyKA0KLSAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgdHJhbnNmb3JtZXJOYW1lKQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSAoTWV0YURhdGFUcmFuc2Zvcm1lcikNCi0gICAgICAgICAgICAgICAgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHRyYW5zZm9ybWVyTmFtZSk7DQotDQotICAgICAgICBpZiAobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneU5hbWUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArPSBJZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kuSURfUFJFRklYICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kpdmFsaWRhdGlvblN0cmF0ZWd5KS5nZXRJZCgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGFkZE1hcHBpbmcodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgdHJhbnNmb3JtZXJOYW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0dXBNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBNYXBwaW5ncyhMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhtYXBwaW5nLmdldFNvdXJjZSgpLCBtYXBwaW5nLmdldFRhcmdldCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0cmFuc2Zvcm1lck5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkaW5nIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWV0YS1kYXRhIHRyYW5zZm9ybWVyIG1hcHBpbmc6ICINCi0gICAgICAgICAgICAgICAgKyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgIiAtPiAiICsgdHJhbnNmb3JtZXJOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcucHV0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIHRyYW5zZm9ybWVyTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgU29ydGVkTmFtZU1hcHBlckxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+Pih0aGlzLm5hbWVNYXBwZXJMaXN0LCB0aGlzLnN1Yk5hbWVNYXBwZXJMaXN0KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIHRyeVRvSW5pdE5hbWVNYXBwZXJXaXRoRXhpc3RpbmdTdWJNYXBwZXJzKHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpOw0KLSAgICAgICAgc3VwZXIucmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIGl0J3MgYSB2ZXJ5IHNwZWNpYWwgY2FzZSBkdWUgdG8gdGhlIG1pc3Npbmcgb3JkZXIgaW4gdGhlIGV4ZWN1dGlvbiBvZiBzdGFydHVwLWxpc3RlbmVycyAocGhhc2UgbGlzdGVuZXJzKQ0KLSAgICAgKiBwYWNrYWdlZCBpbiBmYWNlcy1jb25maWcueG1sIGZpbGVzIG9mIGphcnMNCi0gICAgICoNCi0gICAgICogbm9ybWFsbHkgdGhlIGRlZmF1bHQgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyIHNob3VsZCBiZSBlbm91Z2gNCi0gICAgICogYW55d2F5LCBpZiBhIG1vZHVsZSBhZGRzIGEgbmV3IFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlciwNCi0gICAgICogYWxsIHByZXZpb3VzIGFkZGVkIFN1Yk5hbWVNYXBwZXJzIGhhdmUgdG8gYmUgYWRkZWQgdG8gYXZvaWQgY29uZnVzaW9uIGluIHNwZWNpYWwgY2FzZXMuDQotICAgICAqIGlmIGEgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIGZpbmFsIGV4dGVuZCB0aGUgaW50ZXJmYWNlIGFuZCBmaWx0ZXIgaXQgaW4gYWRkTmFtZU1hcHBlcg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgd2hpY2ggaGFzIHRvIGJlIGFkZGVkDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9Jbml0TmFtZU1hcHBlcldpdGhFeGlzdGluZ1N1Yk1hcHBlcnMoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgaW5zdGFuY2VvZiBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yKE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiBuYW1lTWFwcGVyIDogdGhpcy5zdWJOYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKG5hbWVNYXBwZXIuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KE5lc3RlZC5jbGFzcykpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICgoU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4pdmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcikNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZE5hbWVNYXBwZXIobmFtZU1hcHBlcik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTUwNGIyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQWxsb3dzIHRvIHRyYW5zZm9ybSBjb25jcmV0ZSBtZXRhLWRhdGEgdG8gYSBtb3JlIGFic3RyYWN0IGZvcm0uPGJyLz4NCi0gKiBlLmcuOiBAUmVxdWlyZWQsIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwuLi4pLCBATGVuZ3RoKG1pbmltdW0gPSAxKSwgLi4uIC0+IHJlcXVpcmVkID0gdHJ1ZQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLS8vKlRyYW5zZm9ybWVyIGluc3RlYWQgb2YgKkNvbnZlcnRlciB0byBhdm9pZCBuYW1pbmcgY29uZnVzaW9uIA0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YSk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NvcnRlZE5hbWVNYXBwZXJMaXN0LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9Tb3J0ZWROYW1lTWFwcGVyTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmNiYjQ4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NvcnRlZE5hbWVNYXBwZXJMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5OZXN0ZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7DQotDQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLWNsYXNzIFNvcnRlZE5hbWVNYXBwZXJMaXN0PFQgZXh0ZW5kcyBOYW1lTWFwcGVyPiBpbXBsZW1lbnRzIExpc3Q8VD4NCi17DQotICAgIHByaXZhdGUgTGlzdDxUPiB3cmFwcGVkOw0KLSAgICBwcml2YXRlIExpc3Q8VD4gZ2xvYmFsU3ViTmFtZU1hcHBlckxpc3Q7DQotDQotICAgIFNvcnRlZE5hbWVNYXBwZXJMaXN0KExpc3Q8VD4gd3JhcHBlZCwgTGlzdDxUPiBzdWJOYW1lTWFwcGVyTGlzdCkNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsNCi0gICAgICAgIHRoaXMuZ2xvYmFsU3ViTmFtZU1hcHBlckxpc3QgPSBzdWJOYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoVCB0KQ0KLSAgICB7DQotICAgICAgICBpZiAodCAhPSBudWxsICYmIHQuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KE5lc3RlZC5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkZFN1Yk5hbWVNYXBwZXIodCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB3cmFwcGVkLmFkZCh0KTsNCi0NCi0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHdyYXBwZWQsIG5ldyBDb21wYXJhdG9yPFQ+KCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShUIG5tMSwgVCBubTIpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChubTEgaW5zdGFuY2VvZiBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIgJiYgbm0yIGluc3RhbmNlb2YgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5tMSBpbnN0YW5jZW9mIFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlciA/IDEgOiAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHJpdmF0ZSBib29sZWFuIGFkZFN1Yk5hbWVNYXBwZXIoVCBzdWJOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyIG5hbWVNYXBwZXIgOiB0aGlzLndyYXBwZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKG5hbWVNYXBwZXIgaW5zdGFuY2VvZiBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAoKFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcikgbmFtZU1hcHBlcikuYWRkTmFtZU1hcHBlcihzdWJOYW1lTWFwcGVyKTsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICB0cnlUb0FkZE1hcHBlckFzR2xvYmFsU3ViTmFtZU1hcHBlcihzdWJOYW1lTWFwcGVyKTsNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvQWRkTWFwcGVyQXNHbG9iYWxTdWJOYW1lTWFwcGVyKFQgc3ViTmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgaWYoIXRoaXMuZ2xvYmFsU3ViTmFtZU1hcHBlckxpc3QuY29udGFpbnMoc3ViTmFtZU1hcHBlcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5nbG9iYWxTdWJOYW1lTWFwcGVyTGlzdC5hZGQoc3ViTmFtZU1hcHBlcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgaW50IHNpemUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5zaXplKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmlzRW1wdHkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udGFpbnMobyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaXRlcmF0b3IoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnRvQXJyYXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlN1c3BpY2lvdXNUb0FycmF5Q2FsbCJ9KQ0KLSAgICBwdWJsaWMgPFQ+IFRbXSB0b0FycmF5KFRbXSBhKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC50b0FycmF5KGEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVtb3ZlKG8pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udGFpbnNBbGwoYyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIFQ+IGMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmFkZEFsbChjKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUPiBjKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5hZGRBbGwoaW5kZXgsIGMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnJlbW92ZUFsbChjKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5yZXRhaW5BbGwoYyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKQ0KLSAgICB7DQotICAgICAgICB3cmFwcGVkLmNsZWFyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFQgZ2V0KGludCBpbmRleCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0KGluZGV4KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVCBzZXQoaW50IGluZGV4LCBUIGVsZW1lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnNldChpbmRleCwgZWxlbWVudCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgVCBlbGVtZW50KQ0KLSAgICB7DQotICAgICAgICB3cmFwcGVkLmFkZChpbmRleCwgZWxlbWVudCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFQgcmVtb3ZlKGludCBpbmRleCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVtb3ZlKGluZGV4KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmluZGV4T2Yobyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQubGFzdEluZGV4T2Yobyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3RJdGVyYXRvcjxUPiBsaXN0SXRlcmF0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5saXN0SXRlcmF0b3IoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yPFQ+IGxpc3RJdGVyYXRvcihpbnQgaW5kZXgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmxpc3RJdGVyYXRvcihpbmRleCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8VD4gc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuc3ViTGlzdChmcm9tSW5kZXgsIHRvSW5kZXgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRhZGMxNi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ODk0ZDEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciAtIGlmIHRoZXJlIGlzIGEgcHJveHkgYXJvdW5kIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5Lg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcig1MDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoKEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKXZhbGlkYXRpb25TdHJhdGVneSkuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIxYWFmOS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKiAoY29uZmlndXJlZCB2aWEgd2ViLnhtbCkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZDA4MGYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKiAoY29uZmlndXJlZCB2aWEgaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbikNCi0gKiBUaGUgYmVhbiBwcm92aWRlcyB0aGUgZGVmYXVsdCBuYW1lIChjb252ZW50aW9uKS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gZnVsbCBxdWFsaWZpZWQgbmFtZS4gKD0gY3VzdG9taXphYmxlIGNvbnZlbnRpb24pDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZTg1MGQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotLyoqDQotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBtYXBzIEV4dFZhbCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MgPQ0KLSAgICAgICAgICAgICAgICBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLA0KLSAgICAgICAgICAgICAgICBnZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmMTc1Yy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIHRvIHBsYWNlIFZhbGlkYXRpb25TdHJhdGVnaWVzIGFuZCBNZXRhRGF0YVRyYW5zZm9ybWVycyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcig0MDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MgPQ0KLSAgICAgICAgICAgICAgICBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0UGFja2FnZSgpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZ2V0U2ltcGxlTWV0YURhdGFUcmFuc2Zvcm1lck5hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArICIuIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXRTaW1wbGVOYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTWV0YURhdGFUcmFuc2Zvcm1lck5hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneVBhY2thZ2VOYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcG9zdGZpeCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYKTsNCi0NCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5lbmRzV2l0aCgiVmFsaWRhdGlvblN0cmF0ZWd5IikgfHwNCi0gICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5lbmRzV2l0aCgiU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUgKyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCkgLHBvc3RmaXgpDQotICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgiVmFsaWRhdGlvblN0cmF0ZWd5IiwgcG9zdGZpeCkNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCJTdHJhdGVneSIsIHBvc3RmaXgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGEgc3RhdGljIHZhbGlkYXRpb24gc3RyYXRlZ3kgbWFwcGluZw0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneVBhY2thZ2VOYW1lICsgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lICsgcG9zdGZpeDsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YTU4M2IuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1ZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLlN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuTmVzdGVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXINCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgaW1wbGVtZW50cyBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gc3ViTmFtZU1hcHBlcnMgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkTmFtZU1hcHBlcihOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgaWYoIXRoaXMuc3ViTmFtZU1hcHBlcnMuY29udGFpbnMobmFtZU1hcHBlcikgJiYgbmFtZU1hcHBlci5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoTmVzdGVkLmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnN1Yk5hbWVNYXBwZXJzLmFkZChuYW1lTWFwcGVyKTsNCi0gICAgICAgICAgICBzb3J0U3ViTmFtZU1hcHBlcnMoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc29ydFN1Yk5hbWVNYXBwZXJzKCkNCi0gICAgew0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0aGlzLnN1Yk5hbWVNYXBwZXJzLCBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsNCi0NCi0gICAgICAgIGZvcihOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbWFwcGVyIDogdGhpcy5zdWJOYW1lTWFwcGVycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBtYXBwZXIuY3JlYXRlTmFtZShzb3VyY2UpOw0KLQ0KLSAgICAgICAgICAgIGlmKHJlc3VsdCAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDVmNTI4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbiBpbXBsZW1lbnRzIFByb3BlcnR5SW5mb3JtYXRpb24KLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGluZm9ybWF0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhRW50cnk+IG1ldGFEYXRhTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFbnRyeT4oKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zSW5mb3JtYXRpb24oU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbk1hcC5jb250YWluc0tleShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbk1hcC5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpIGdldEluZm9ybWF0aW9uKGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoIm5ldyBpbmZvcm1hdGlvbiBhZGRlZCBrZXk6ICIgKyBrZXkgKyAiIHZhbHVlOiAiICsgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5mb3JtYXRpb25NYXAucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRhRGF0YUVudHJ5W10gZ2V0TWV0YURhdGFFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtZXRhRGF0YUxpc3QudG9BcnJheShuZXcgTWV0YURhdGFFbnRyeVttZXRhRGF0YUxpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpCi0gICAgewotICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnRpZXModGhpcy5pbmZvcm1hdGlvbk1hcCk7Ci0gICAgICAgIHRoaXMubWV0YURhdGFMaXN0LmFkZChtZXRhRGF0YUVudHJ5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldE1ldGFEYXRhRW50cmllcygpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgicmVzZXR0aW5nIG1ldGEtZGF0YSBlbnRyaWVzIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLm1ldGFEYXRhTGlzdC5jbGVhcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlEZXRhaWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MDM3Y2YuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlEZXRhaWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlEZXRhaWxzCi17Ci0gICAgLy9mb3JtcyB0aGUgaWQgZm9yIGNyb3NzLXZhbGlkYXRpb24gd2l0aGluIGNvbXBsZXggY29tcG9uZW50cwotICAgIHByaXZhdGUgU3RyaW5nIGtleTsKLSAgICBwcml2YXRlIE9iamVjdCBiYXNlT2JqZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5OwotCi0gICAgcHVibGljIFByb3BlcnR5RGV0YWlscyhTdHJpbmcga2V5LCBPYmplY3QgYmFzZU9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICAgIHRoaXMuYmFzZU9iamVjdCA9IGJhc2VPYmplY3Q7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gICAgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRCYXNlT2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VPYmplY3QoT2JqZWN0IGJhc2VPYmplY3QpCi0gICAgewotICAgICAgICB0aGlzLmJhc2VPYmplY3QgPSBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOTI4NGYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUluZm9ybWF0aW9uCi17Ci0gICAgYm9vbGVhbiBjb250YWluc0luZm9ybWF0aW9uKFN0cmluZyBrZXkpOwotICAgIE9iamVjdCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5KTsKLSAgICA8VD4gVCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcyk7Ci0gICAgdm9pZCBzZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpOwotCi0gICAgTWV0YURhdGFFbnRyeVtdIGdldE1ldGFEYXRhRW50cmllcygpOwotICAgIHZvaWQgYWRkTWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpOwotICAgIHZvaWQgcmVzZXRNZXRhRGF0YUVudHJpZXMoKTsKLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmVmNDMwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzCi17Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ERVRBSUxTID0gInByb3BlcnR5X2RldGFpbHMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9WQUxJREFUSU9OID0gInNraXBfdmFsaWRhdGlvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJsYWJlbCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fUFJPUEVSVElFUyA9ICJjdXN0b21fcHJvcGVydGllcyI7Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm94eS9EZWZhdWx0UHJveHlIZWxwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L0RlZmF1bHRQcm94eUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzg1Yjk2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L0RlZmF1bHRQcm94eUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRQcm94eUhlbHBlciBpbXBsZW1lbnRzIFByb3h5SGVscGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdFByb3h5SGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIDxUPiBDbGFzczxUPiBnZXRVbnByb3hpZWRDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MsIENsYXNzPFQ+IHRhcmdldFR5cGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoQ2xhc3M8VD4pZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudENsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VW5wcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZihpc1Byb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVPZkNsYXNzKENsYXNzIGN1cnJlbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYgKGlzUHJveGllZENsYXNzKGN1cnJlbnRDbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzcy5nZXROYW1lKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWVPZk9iamVjdChPYmplY3Qgb2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZihvYmplY3QgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0TmFtZU9mQ2xhc3Mob2JqZWN0LmdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRFbmhhbmNlckJ5Q0dMSUIkJCIpIHx8DQotICAgICAgICAgICAgY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRGYXN0Q2xhc3NCeUNHTElCJCQiKSB8fA0KLSAgICAgICAgICAgIGN1cnJlbnRDbGFzcy5nZXROYW1lKCkuY29udGFpbnMoIl8kJF9qYXZhc3Npc3QiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3hpZWRPYmplY3QoT2JqZWN0IHByb3hpZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm94aWVkT2JqZWN0ICE9IG51bGwgJiYgaXNQcm94aWVkQ2xhc3MocHJveGllZE9iamVjdC5nZXRDbGFzcygpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm94eS9Qcm94eUhlbHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJveHkvUHJveHlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNlN2U0YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm94eS9Qcm94eUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFByb3h5SGVscGVyDQotew0KLSAgICBDbGFzcyBnZXRVbnByb3hpZWRDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MpOw0KLQ0KLSAgICA8VD4gQ2xhc3M8VD4gZ2V0VW5wcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzLCBDbGFzczxUPiB0YXJnZXRUeXBlKTsNCi0NCi0gICAgU3RyaW5nIGdldE5hbWVPZkNsYXNzKENsYXNzIHByb3hpZWRDbGFzcyk7DQotDQotICAgIFN0cmluZyBnZXRDbGFzc05hbWVPZk9iamVjdChPYmplY3QgcHJveGllZE9iamVjdCk7DQotDQotICAgIGJvb2xlYW4gaXNQcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKTsNCi0NCi0gICAgYm9vbGVhbiBpc1Byb3hpZWRPYmplY3QoT2JqZWN0IHByb3hpZWRPYmplY3QpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZWNvcmRlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZWNvcmRlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MGYyM2YuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLQotLyoqCi0gKiBBbGxvd3MgdG8gY2FwdHVyZSBjb252ZXJ0ZWQgdmFsdWVzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyCi17Ci0gICAgdm9pZCByZWNvcmRVc2VySW5wdXQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0Fic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1OTIwYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci0KLS8qKgotICogQmFzZSBmb3IgYWxsIFJlbmRlcktpdFdyYXBwZXJGYWN0b3JpZXMgdG8gZm9yY2UgYSBzcGVjaWZpYyBiZWhhdmlvdXIKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxSZW5kZXJLaXQsIFJlbmRlcktpdD4KLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnkgd3JhcHBlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZGVhY3RpdmF0ZWQgPSBmYWxzZTsKLQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSByZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UocmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLndyYXBwZWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy53cmFwcGVkLmFkZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZGVhY3RpdmF0ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuZGVhY3RpdmF0ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVhY3RpdmF0ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlYWN0aXZhdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBSZW5kZXJLaXQgY3JlYXRlKFJlbmRlcktpdCByZW5kZXJLaXQpCi0gICAgewotICAgICAgICBpZihpc0RlYWN0aXZhdGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVuZGVyS2l0IHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYodGhpcy53cmFwcGVkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMud3JhcHBlZC5jcmVhdGUocmVuZGVyS2l0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlV3JhcHBlcihyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgUmVuZGVyS2l0IGNyZWF0ZVdyYXBwZXIoUmVuZGVyS2l0IHJlbmRlcktpdCk7Ci0KLSAgICAvKioKLSAgICAgKiBzaW1wbGUgdGVzdCBmb3IgZWFybHkgY29uZmlnIGluIGNhc2Ugb2YgbW9qYXJyYSAoaW5jbC4gdGhlIGNvbWJpbmF0aW9uIHdpdGggdHJpbmlkYWQpLgotICAgICAqIHVzZSBhIGN1c3RvbSBleHR2YWwgY29udGV4dCBpbXBsLiAoc2VlIEVYVFZBTC01OCkgdG8gb3B0aW1pemUgdGhpcyBjaGVjayBmb3IgdGhlIHRhcmdldCBydW50aW1lLgotICAgICAqIHRoaXMgY2hlY2sgd29ya3MgZm9yIGFsbCBjdXJyZW50IGltcGxlbWVudGF0aW9ucyBzaW5jZSB0aGUganNmIGludGVybmFscyBhcmUgYXV0b20uIHJlYWR5IGR1cmluZyBhIHJlcXVlc3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGpzZiBpbXBsLiBpcyBpbml0aWFsaXplZCBhbmQgaXQncyBwb3NzaWJsZSB0byB1c2UgaXQgYXMgZXhwZWN0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FwcGxpY2F0aW9uSW5pdGlhbGl6ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEpzZlV0aWxzLmlzQXBwbGljYXRpb25Jbml0aWFsaXplZCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YyNmI3Mi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkKLXsKLSAgICBwcml2YXRlIFJlbmRlcktpdCByZW5kZXJLaXQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSSUNfUkVOREVSX0tJVF9XUkFQUEVSX0ZBQ1RPUlkgPQotICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdC5HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkiOwotICAgIHByaXZhdGUgc3RhdGljIEJvb2xlYW4gdXNlR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0dmFsIHJlbmRlcmtpdCB3cmFwcGVyIGNyZWF0ZWQgZm9yICIgKyByZW5kZXJLaXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy93b3JrYXJvdW5kIGZvciBtb2phcnJhIChFWFRWQUwtMzgpCi0gICAgICAgIGlmKHVzZUdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyBnZW5lcmljRmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKEdFTkVSSUNfUkVOREVSX0tJVF9XUkFQUEVSX0ZBQ1RPUlkpOwotICAgICAgICAgICAgdXNlR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID0gZ2VuZXJpY0ZhY3RvcnkgIT0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHVzZUdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSkKLSAgICAgICAgewotICAgICAgICAgICAgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSByZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSA9IChBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KUNsYXNzVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoR0VORVJJQ19SRU5ERVJfS0lUX1dSQVBQRVJfRkFDVE9SWSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY3JlYXRlV3JhcHBlcihyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGhpcy5yZW5kZXJLaXQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5yZW5kZXJLaXQgPSBuZXcgRXh0VmFsUmVuZGVyS2l0KHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyS2l0OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxMYXp5UmVuZGVyZXJQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjM2Mjg3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxMYXp5UmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLQotLyoqCi0gKiB0byBzdXBwb3J0IGEgY3VzdG9tIHByb3h5Ci0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIEV4dFZhbExhenlSZW5kZXJlclByb3h5IGV4dGVuZHMgUmVuZGVyZXIKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBSZW5kZXJlciB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbExhenlSZW5kZXJlclByb3h5KFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyZXI7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic2ltcGxlIHByb3h5IGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBnZXRMYXp5UmVuZGVyZXIoKS5kZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRMYXp5UmVuZGVyZXIoKS5jb252ZXJ0Q2xpZW50SWQoZmFjZXNDb250ZXh0LCBzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldExhenlSZW5kZXJlcigpLmdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJlciBnZXRMYXp5UmVuZGVyZXIoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHByb3h5Q2xhc3NOYW1lID0gKFN0cmluZykgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVkpOwotCi0gICAgICAgIGlmKHByb3h5Q2xhc3NOYW1lICE9IG51bGwgJiYgIXByb3h5Q2xhc3NOYW1lLmVuZHNXaXRoKGdldENsYXNzKCkuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShwcm94eUNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmKHRhcmdldENsYXNzID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYSBjdXN0b20gaW52YWxpZCByZW5kZXJlciBwcm94eSBpcyBjb25maWd1cmVkOiAiICsgcHJveHlDbGFzc05hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDbGFzc1tdIGFyZ0NsYXNzZXMgPSBuZXcgQ2xhc3NbMV07Ci0gICAgICAgICAgICBhcmdDbGFzc2VzWzBdID0gUmVuZGVyZXIuY2xhc3M7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGFyZ2V0Q2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJnQ2xhc3Nlcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChSZW5kZXJlciljb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSh0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgY3JlYXRlOiAiICsgdGFyZ2V0Q2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZDsKLSAgICAgICAgfQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXQuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzNTRlNS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LlJlc3BvbnNlU3RyZWFtOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VXcml0ZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlc3BvbnNlU3RhdGVNYW5hZ2VyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyS2l0IGV4dGVuZHMgUmVuZGVyS2l0Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLSAgICBwcm90ZWN0ZWQgUmVuZGVyS2l0IHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyS2l0KFJlbmRlcktpdCB3cmFwcGVkKQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsKLQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgaWYgKHJlbmRlcmVyIGluc3RhbmNlb2YgRXh0VmFsUmVuZGVyZXJXcmFwcGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCByZW5kZXJlcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCBjcmVhdGVXcmFwcGVyKHJlbmRlcmVyKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVuZGVyZXIgZ2V0UmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSkKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyIHJlbmRlcmVyID0gd3JhcHBlZC5nZXRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSk7Ci0KLSAgICAgICAgaWYocmVuZGVyZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyIGluc3RhbmNlb2YgRXh0VmFsUmVuZGVyZXJXcmFwcGVyID8gcmVuZGVyZXIgOiBjcmVhdGVXcmFwcGVyKHJlbmRlcmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIud2Fybigibm8gcmVuZGVyZXIgZm91bmQgZm9yIGZhbWlseSAiICsgZmFtaWx5ICsgIiBhbmQgdHlwZSAiICsgcmVuZGVyZXJUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZW5kZXJlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdGF0ZU1hbmFnZXIgZ2V0UmVzcG9uc2VTdGF0ZU1hbmFnZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UmVzcG9uc2VTdGF0ZU1hbmFnZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2VXcml0ZXIgY3JlYXRlUmVzcG9uc2VXcml0ZXIoV3JpdGVyIHdyaXRlciwgU3RyaW5nIHMsIFN0cmluZyBzMSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmNyZWF0ZVJlc3BvbnNlV3JpdGVyKHdyaXRlciwgcywgczEpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZVN0cmVhbSBjcmVhdGVSZXNwb25zZVN0cmVhbShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY3JlYXRlUmVzcG9uc2VTdHJlYW0ob3V0cHV0U3RyZWFtKTsKLSAgICB9Ci0KLSAgICBAVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQotICAgIHByb3RlY3RlZCBSZW5kZXJlciBjcmVhdGVXcmFwcGVyKFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxSZW5kZXJlcldyYXBwZXIocmVuZGVyZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXRGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mzc2Yjk4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeTsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBjZW50cmFsIG1lY2hhbmlzbSB3aGljaCBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgYSB3cmFwcGVyIGZvciBhIHJlbmRlcmVyIC0gc3RhcnRpbmcgcG9pbnQgb2YgZXh0dmFsLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeSBleHRlbmRzIFJlbmRlcktpdEZhY3RvcnkKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotICAgIHByaXZhdGUgUmVuZGVyS2l0RmFjdG9yeSB3cmFwcGVkOwotICAgIHByaXZhdGUgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBkZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIGlzRGVhY3RpdmF0ZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeShSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnkpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSByZW5kZXJLaXRGYWN0b3J5OwotCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyS2l0KFN0cmluZyBzLCBSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkLmFkZFJlbmRlcktpdChzLCByZW5kZXJLaXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZW5kZXJLaXQgZ2V0UmVuZGVyS2l0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgUmVuZGVyS2l0IHJlbmRlcktpdCA9IHRoaXMud3JhcHBlZC5nZXRSZW5kZXJLaXQoZmFjZXNDb250ZXh0LCBzKTsKLQotICAgICAgICAvL2ZvciBtb2phcnJhICsgdHJpbmlkYWQKLSAgICAgICAgaWYocmVuZGVyS2l0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5VG9Jbml0RGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7Ci0KLSAgICAgICAgY2hlY2tSZW5kZXJLaXRGYWN0b3J5RGVhY3RpdmF0aW9uKCk7Ci0KLSAgICAgICAgaWYodGhpcy5pc0RlYWN0aXZhdGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy90ZXN0IGVhcmx5IGNvbmZpZyBpbiBjYXNlIG9mIG1vamFycmEKLSAgICAgICAgaWYoIXRoaXMuZGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmlzQXBwbGljYXRpb25Jbml0aWFsaXplZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY3JlYXRlV3JhcHBlcihyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRyeVRvQ3JlYXRlV3JhcHBlcldpdGhXcmFwcGVyRmFjdG9yeShyZW5kZXJLaXQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja1JlbmRlcktpdEZhY3RvcnlEZWFjdGl2YXRpb24oKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5pc0RlYWN0aXZhdGVkID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLmlzRXh0VmFsRGVhY3RpdmF0ZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmlzRGVhY3RpdmF0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYodGhpcy5kZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuaXNBcHBsaWNhdGlvbkluaXRpYWxpemVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc0RlYWN0aXZhdGVkID0gaXNSZW5kZXJLaXRGYWN0b3J5RGVhY3RpdmF0ZWRWaWFXZWJYbWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmlzRGVhY3RpdmF0ZWQgPSBpc1JlbmRlcktpdEZhY3RvcnlEZWFjdGl2YXRlZFZpYVZNUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHRyeVRvSW5pdERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpCi0gICAgewotICAgICAgICBpZih0aGlzLmRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL3dvcmthcm91bmQgZm9yIG1vamFycmEgdG8gYWxsb3cgYSBjdXN0b20gZmFjdG9yeSBkdXJpbmcgdGhlIGVhcmx5IGNvbmZpZyBwaGFzZQotICAgICAgICAgICAgLy9qdXN0IGNyZWF0ZSB0aGUgZmFjdG9yeSB3aXRoIHRoZSBnaXZlbiBuYW1lCi0gICAgICAgICAgICAvLytpdCBzaG91bGQgZXh0ZW5kIHlvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIHdoaWNoIHlvdSByZWdpc3RlciBhcyB1c3VhbAotICAgICAgICAgICAgT2JqZWN0IGN1c3RvbUZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoCi0gICAgICAgICAgICAgICAgICAgIEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsgIi5jdXN0b20uUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkiKTsKLQotICAgICAgICAgICAgaWYoY3VzdG9tRmFjdG9yeSBpbnN0YW5jZW9mIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgPSAoQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSljdXN0b21GYWN0b3J5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID0gbmV3IERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJLaXQgdHJ5VG9DcmVhdGVXcmFwcGVyV2l0aFdyYXBwZXJGYWN0b3J5KFJlbmRlcktpdCByZW5kZXJLaXQpCi0gICAgewotICAgICAgICBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHdyYXBwZXJGYWN0b3J5ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgLy9zb21lIGNvbXBvbmVudCBsaWJzIGUuZy4gbXlmYWNlcy10cmluaWRhZCBhcmVuJ3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgY2xlYW4gYXBwcm9hY2gKLSAgICAgICAgLy9leGFtcGxlIHNlZSBUcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lcgotICAgICAgICBpZih3cmFwcGVyRmFjdG9yeS5pc0RlYWN0aXZhdGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJLaXQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gd3JhcHBlckZhY3RvcnkuY3JlYXRlKHJlbmRlcktpdCk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gZ2V0UmVuZGVyS2l0SWRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQuZ2V0UmVuZGVyS2l0SWRzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVuZGVyS2l0RmFjdG9yeURlYWN0aXZhdGVkVmlhV2ViWG1sKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9SRU5ERVJfS0lUX0ZBQ1RPUlkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlbmRlcktpdEZhY3RvcnlEZWFjdGl2YXRlZFZpYVZNUGFyYW1ldGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShTeXN0ZW0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgKwotICAgICAgICAgICAgICAgICAgICAiLkRFQUNUSVZBVEVfUkVOREVSX0tJVF9GQUNUT1JZIiwgImZhbHNlIikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlclByb3h5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTM2MTNjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5SZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUmVuZGVyZXJQcm94eVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSnNmUHJvamVjdFN0YWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIHRvIGF2b2lkIG11bHRpcGxlIGNhbGxzIG9mIHJlbmRlcmVyIG1ldGhvZHMgd2l0aGluIHJlbmRlcmVyIGludGVyY2VwdG9ycyAoZS5nLiBmb3IgZW5jb2RlLCBkZWNvZGUsLi4uKQotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyZXJQcm94eSBleHRlbmRzIFJlbmRlcmVyCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZID0gRXh0VmFsUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCkgKyAiOktFWSI7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgd3JhcHBlZDsKLQotICAgIHB1YmxpYyBFeHRWYWxSZW5kZXJlclByb3h5KFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyZXI7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgicHJveHkgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkgPSBnZXRSZW5kZXJlckVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNEZWNvZGVDYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RGVjb2RlQ2FsbGVkKHRydWUpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLndyYXBwZWQuZGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnlUb0NyZWF0ZU1lc3NhZ2UoImRlY29kZSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBlbnRyeSA9IGdldFJlbmRlcmVyRW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0VuY29kZUJlZ2luQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldEVuY29kZUJlZ2luQ2FsbGVkKHRydWUpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVkLmVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnlUb0NyZWF0ZU1lc3NhZ2UoImVuY29kZUJlZ2luIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGVudHJ5ID0gZ2V0UmVuZGVyZXJFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRW5jb2RlQ2hpbGRyZW5DYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RW5jb2RlQ2hpbGRyZW5DYWxsZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlZC5lbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DcmVhdGVNZXNzYWdlKCJlbmNvZGVDaGlsZHJlbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkgPSBnZXRSZW5kZXJlckVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNFbmNvZGVFbmRDYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RW5jb2RlRW5kQ2FsbGVkKHRydWUpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLndyYXBwZWQuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnlUb0NyZWF0ZU1lc3NhZ2UoImVuY29kZUVuZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0Q2xpZW50SWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udmVydENsaWVudElkKGZhY2VzQ29udGV4dCwgcyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgewotICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICB0aHJvdyB0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkgPSBnZXRSZW5kZXJlckVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmIChlbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVudHJ5LnNldENvbnZlcnRlZFZhbHVlKHdyYXBwZWQuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnlUb0NyZWF0ZU1lc3NhZ2UoImdldENvbnZlcnRlZFZhbHVlIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZ2V0UmVuZGVyZXJFbnRyeShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGtleSArPSBnZXRPcHRpb25hbEtleShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWdldFJlbmRlcmVyU3RvcmFnZSgpLmNvbnRhaW5zRW50cnkoZ2V0UmVuZGVyZXJLZXkoKSwga2V5KSkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0UmVuZGVyZXJTdG9yYWdlKCkuc2V0RW50cnkoZ2V0UmVuZGVyZXJLZXkoKSwga2V5LCBuZXcgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZXJTdG9yYWdlKCkuZ2V0RW50cnkoZ2V0UmVuZGVyZXJLZXkoKSwga2V5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wdGlvbmFsS2V5KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVuZGVyZXJLZXkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFByb3h5VXRpbHMuZ2V0Q2xhc3NOYW1lKHRoaXMud3JhcHBlZC5nZXRDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlbmRlcmVyUHJveHlTdG9yYWdlIGdldFJlbmRlcmVyU3RvcmFnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShSZW5kZXJlclByb3h5U3RvcmFnZS5jbGFzcywgUmVuZGVyZXJQcm94eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgLy9yZXNldCBjb21wb25lbnQgcHJveHkgbWFwcGluZwotICAgICAgICBFeHRWYWxVdGlscy5yZXNldFN0b3JhZ2UoUmVuZGVyZXJQcm94eVN0b3JhZ2UuY2xhc3MsIFJlbmRlcmVyUHJveHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvQ3JlYXRlTWVzc2FnZShTdHJpbmcgbWV0aG9kTmFtZSkKLSAgICB7Ci0gICAgICAgIGlmKEpzZlByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuRGV2ZWxvcG1lbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJkb3VibGUgY2FsbCBvZiAiICsgdGhpcy53cmFwcGVkLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiMiICsgbWV0aG9kTmFtZSArICIgZmlsdGVyZWQuICIgKwotICAgICAgICAgICAgICAgICAgICAidGhpcyBvcHRpbWl6YXRpb24gbWlnaHQgbGVhZCB0byBpbmNvbXBhdGliaWxpdGllcyB3aXRoIHNvbWUgY29tcG9uZW50IGxpYnMuICIgKwotICAgICAgICAgICAgICAgICAgICAiaW4gc3VjaCBhIGNhc2UgdXNlIHRoZSBzdXBwb3J0IG1vZHVsZSBmb3IgdGhlIGNvbXBvbmVudCBsaWIgb3IgdXNlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgIkV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZLCBudWxsKTsgIiArCi0gICAgICAgICAgICAgICAgICAgICJpbiBhIHN0YXJ0dXAgbGlzdGVuZXIiOwotCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgLmFkZE1lc3NhZ2UobnVsbCwgRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOLCBtZXNzYWdlLCBtZXNzYWdlKSk7Ci0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4obWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJ0dXJuIG9uIHRoZSBkZXZlbG9wbWVudCBtb2RlIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCBpZiBzb21ldGhpbmcgaXMgZGlzcGxheWVkIHdyb25nLiIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyV3JhcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2MzMDVlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotCi0vKioKLSAqIERlZmF1bHQgYXBwcm9hY2ggdG8gYXZvaWQgcHJveGllcyBmb3IgY29udmVydGVycyBhbmQgdGhlIGFkYXB0ZXIgZmFsbGJhY2suCi0gKiBJdCByZXF1aXJlcyB0aGF0IGNvbXBvbmVudHMgZGVsZWdhdGUgZ2V0Q29udmVydGVkVmFsdWUgdG8gYSByZW5kZXJlci48YnIvPgotICogSWYgaXQgaXNuJ3QgdGhlIGNhc2UgZm9yIHlvdXIgY29tcG9uZW50IGxpYiB1c2U6Ci0gKiBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5FeHRWYWxBcHBsaWNhdGlvbkZhY3Rvcnk8YnIvPgotICogYW5kPGJyLz4KLSAqIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5LlByb3h5TWFwcGluZ1BoYXNlTGlzdGVuZXIKLSAqIDxwLz4KLSAqIFRoaXMgd3JhcHBlciB3aWxsIGFsc28gaW1wbGVtZW50IGNsaWVudC1zaWRlIHZhbGlkYXRpb24gYmVoYXZpb3VyCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJlcldyYXBwZXIgZXh0ZW5kcyBSZW5kZXJlcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgd3JhcHBlZDsKLSAgICBwcm90ZWN0ZWQgRXh0VmFsQ29udGV4dCBleHRWYWxDb250ZXh0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCk7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyZXJXcmFwcGVyKFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHByb3h5Q2xhc3NOYW1lID0gKFN0cmluZylFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSk7Ci0KLSAgICAgICAgaWYocHJveHlDbGFzc05hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyBleHR2YWwgcmVuZGVyZXIgcHJveHkgY29uZmlndXJlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSBuZXcgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkocmVuZGVyZXIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShwcm94eUNsYXNzTmFtZSk7Ci0KLSAgICAgICAgaWYodGFyZ2V0Q2xhc3MgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyBleHR2YWwgcmVuZGVyZXIgcHJveHkgY29uZmlndXJlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSBuZXcgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkocmVuZGVyZXIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xhc3NbXSBhcmdDbGFzc2VzID0gbmV3IENsYXNzWzFdOwotICAgICAgICBhcmdDbGFzc2VzWzBdID0gUmVuZGVyZXIuY2xhc3M7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGFyZ2V0Q2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJnQ2xhc3Nlcyk7Ci0gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSAoUmVuZGVyZXIpY29uc3RydWN0b3IubmV3SW5zdGFuY2UocmVuZGVyZXIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIud2Fybigibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVyZXIgd3JhcHBlciBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkZWNvZGUgZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRGVjb2RlIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJEZWNvZGUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckRlY29kZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImVuY29kZUJlZ2luIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUJlZ2luIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUJlZ2luIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVFbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZW5jb2RlQ2hpbGRyZW4gZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlQ2hpbGRyZW4gb2YgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUNoaWxkcmVuIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJFbmNvZGVDaGlsZHJlbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVDaGlsZHJlbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQ2hpbGRyZW4gaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJlbmNvZGVFbmQgZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUVuZCBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVFbmQgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGdldFJlbmRlcnNDaGlsZHJlbigpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZW5kZXJzQ2hpbGRyZW4oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLSAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbywgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdCA9IGUuZ2V0UmV0dXJuVmFsdWVPbkV4Y2VwdGlvbihjb252ZXJ0ZWRPYmplY3QpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImdldENvbnZlcnRlZFZhbHVlIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUdldENvbnZlcnRlZFZhbHVlIG9mICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QgPSB3cmFwcGVkLmdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8pOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyR2V0Q29udmVydGVkVmFsdWUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvLCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyR2V0Q29udmVydGVkVmFsdWUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckdldENvbnZlcnRlZFZhbHVlIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZE9iamVjdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIyZmZkYS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNDcyNzkwNDk4NzY2MjUxMzQ2TDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGMyMGE3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDE4NDI0MDUxNDY0ODE0ODg4TDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTIwZmJlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlJlbmRlcmVySW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICAgIHByb3RlY3RlZCBSZW5kZXJlckludGVyY2VwdG9yIGV4Y2VwdGlvblNvdXJjZTsKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGluZm9ybWF0aW9uOwotICAgIGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjM0MzA3NDA3NzUzMjkxNTcyMkw7Ci0KLSAgICBwdWJsaWMgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbigpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzKQotICAgIHsKLSAgICAgICAgdGhpcy5za2lwT3RoZXJJbnRlcmNlcHRvcnMgPSBza2lwT3RoZXJJbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgcHVibGljIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oYm9vbGVhbiBza2lwT3RoZXJJbnRlcmNlcHRvcnMsIFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHRoaXMoc2tpcE90aGVySW50ZXJjZXB0b3JzKTsKLSAgICAgICAgdGhpcy5leGNlcHRpb25Tb3VyY2UgPSByZW5kZXJlckludGVyY2VwdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEluZm9ybWF0aW9uKE9iamVjdCBpbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIHRoaXMuaW5mb3JtYXRpb24gPSBpbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEluZm9ybWF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NraXBPdGhlckludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gc2tpcE90aGVySW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmV0dXJuVmFsdWVPbkV4Y2VwdGlvbihPYmplY3QgY3VycmVudFJldHVyblZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMuZXhjZXB0aW9uU291cmNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmV4Y2VwdGlvblNvdXJjZS5nZXRSZXR1cm5WYWx1ZU9uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbih0aGlzLCBjdXJyZW50UmV0dXJuVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjdXJyZW50UmV0dXJuVmFsdWU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA3MGE2YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0Fic3RyYWN0U3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Qcm9qZWN0U3RhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIGV4ZWN1dGUgbG9naWMganVzdCBvbmNlLg0KLSAqIGUuZy4gcmVnaXN0ZXIgYXJ0aWZhY3RzIHZpYSBhcGkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgLy9kb24ndCByZW1vdmUgLSBpdCdzIGEgZmFsbGJhY2sgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggZGVyZWdpc3RyYXRpb24NCi0gICAgLy90YXJnZXQ6IGRvbid0IHByb2Nlc3MgaW5pdCBsb2dpYyBtb3JlIHRoYW4gb25jZQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENsYXNzPiBpbml0aWFsaXplZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVySW5pdGlhbGl6ZWQgPSBmYWxzZTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKEFic3RyYWN0U3RhcnR1cExpc3RlbmVyLmNsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZWRMaXN0ZW5lcnMuY29udGFpbnMoZ2V0Q2xhc3MoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnQgaW5pdCBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWlzU3RhcnR1cExpc3RlbmVyRGVhY3RpdmF0ZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJpbml0IG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZGVhY3RpdmF0ZWQiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImluaXQgb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBKc2ZVdGlscy5kZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcih0aGlzKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBkZXJlZ2lzdGVyaW5nIHRoZSBwaGFzZS1saXN0ZW5lciINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtPiB0aGVyZSBpcyBqdXN0IGEgbGl0dGxlIG92ZXJoZWFkLCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBidXQgZXZlcnl0aGluZyBlbHNlIHdvcmtzIGNvcnJlY3RseS4iDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaG93ZXZlciwgcGxlYXNlIGluZm9ybSB0aGUgY29tbXVuaXR5IGFib3V0IHlvdXIgY29uZmlndXJhdGlvbiIsIHQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWRMaXN0ZW5lcnMuYWRkKGdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5SRVNUT1JFX1ZJRVc7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTdGFydHVwTGlzdGVuZXJEZWFjdGl2YXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5pc0V4dFZhbERlYWN0aXZhdGVkKCkgfHwNCi0gICAgICAgICAgICAgICAgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sVXRpbHMuZ2V0SW5pdFBhcmFtZXRlcihudWxsLCBnZXRDbGFzcygpLmdldE5hbWUoKSArICI6REVBQ1RJVkFURUQiKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFByb2plY3RTdGFnZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgaWYoIWRlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlckluaXRpYWxpemVkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoUHJvamVjdFN0YWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpLCBnZXRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpLCBmYWxzZSk7DQotICAgICAgICAgICAgZGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVySW5pdGlhbGl6ZWQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBQcm9qZWN0U3RhZ2VSZXNvbHZlciBnZXRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdCgpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0V4dFZhbFN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9FeHRWYWxTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVkMzI4MS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0V4dFZhbFN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlBoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXIKLSAgICAgICAgLkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjUwNDgyNjQyMTA4NjU3MjAxMkw7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKEV4dFZhbEluZm9ybWF0aW9uLlZFUlNJT04gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnRpbmcgdXAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciB2IiArIEV4dFZhbEluZm9ybWF0aW9uLlZFUlNJT04pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydGluZyB1cCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsKLQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSwgRXh0VmFsUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCksIGZhbHNlKTsKLQotICAgICAgICBpbml0TmFtZU1hcHBlcnMoKTsKLSAgICAgICAgaW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgaW5pdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsKLSAgICAgICAgaW5pdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICBpbml0UGhhc2VMaXN0ZW5lcnMoKTsKLSAgICAgICAgaW5pdFZpb2xhdGlvblNldmVyaXR5S2V5KCk7Ci0gICAgICAgIGluaXREaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb25LZXkoKTsKLSAgICAgICAgaW5pdFJlcXVpcmVkSW5pdGlhbGl6YXRpb24oKTsKLSAgICAgICAgZXhlY3V0ZUN1c3RvbVN0YXJ0dXBMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0TmFtZU1hcHBlcnMoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGRlYWN0aXZhdGVEZWZhdWx0TmFtZU1hcHBlcnMgPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9ERUZBVUxUX05BTUVfTUFQUEVSUzsKLSAgICAgICAgaWYgKChkZWFjdGl2YXRlRGVmYXVsdE5hbWVNYXBwZXJzICE9IG51bGwgJiYgZGVhY3RpdmF0ZURlZmF1bHROYW1lTWFwcGVycy5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvL3JlZ2lzdGVyIG1ldGFkYXRhIHRvIHZhbGlkYXRpb24gc3RyYXRlZ3kgbmFtZSBtYXBwZXIKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsKLQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsKLQotICAgICAgICAvL3JlZ2lzdGVyIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWVzc2FnZSByZXNvbHZlciBuYW1lIG1hcHBlcgotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0KLSAgICAgICAgLy9yZWdpc3RlciB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1ldGFkYXRhIHRyYW5zZm9ybWVyIG5hbWUgbWFwcGVyCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUN1c3RvbVN0YXJ0dXBMaXN0ZW5lcigpCi0gICAgewotICAgICAgICBTdHJpbmcgY3VzdG9tU3RhcnR1cExpc3RlbmVyTmFtZSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBUlRVUF9MSVNURU5FUik7Ci0gICAgICAgIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lciA9Ci0gICAgICAgICAgICAoQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGN1c3RvbVN0YXJ0dXBMaXN0ZW5lck5hbWUpOwotCi0gICAgICAgIGlmKGN1c3RvbVN0YXJ0dXBMaXN0ZW5lciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydCBpbml0IG9mICIgKyBjdXN0b21TdGFydHVwTGlzdGVuZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjdXN0b21TdGFydHVwTGlzdGVuZXIuaW5pdCgpOwotCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJpbml0IG9mICIgKyBjdXN0b21TdGFydHVwTGlzdGVuZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKAotICAgICAgICAgICAgICAgIG5ldyBIdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigKLSAgICAgICAgICAgICAgICBuZXcgVmlvbGF0aW9uU2V2ZXJpdHlWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCkKLSAgICB7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnNldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIobmV3IERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCksIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRQaGFzZUxpc3RlbmVycygpCi0gICAgewotICAgICAgICBKc2ZVdGlscy5yZWdpc3RlclBoYXNlTGlzdGVuZXIobmV3IFBoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0VmlvbGF0aW9uU2V2ZXJpdHlLZXkoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MuZ2V0TmFtZSgpLCBWaW9sYXRpb25TZXZlcml0eS5jbGFzcywgZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0RGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uS2V5KCkKLSAgICB7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KAotICAgICAgICAgICAgICAgIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCksIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcywgZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0UmVxdWlyZWRJbml0aWFsaXphdGlvbigpCi0gICAgewotICAgICAgICBpZihXZWJYbWxQYXJhbWV0ZXIuQUNUSVZBVEVfUkVRVUlSRURfSU5JVElBTElaQVRJT04gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiByZXF1aXJlZEluaXRpYWxpemF0aW9uID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkFDVElWQVRFX1JFUVVJUkVEX0lOSVRJQUxJWkFUSU9OKTsKLQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoIm1vZGU6aW5pdDpyZXF1aXJlZCIsIHJlcXVpcmVkSW5pdGlhbGl6YXRpb24sIGZhbHNlKTsKLQotICAgICAgICAgICAgaWYocmVxdWlyZWRJbml0aWFsaXphdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWFjdGl2YXRlUmVxdWlyZWRBdHRyaWJ1dGVTdXBwb3J0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpZiBpdCdzIGNvbmZpZ3VyZWQgdGhhdCByZXF1aXJlZCBpbml0IHNob3VsZCBoYXBwZW4sCi0gICAgICogaXQncyByZXF1aXJlZCB0byBkZWFjdGl2YXRlIHRoZSBzdXBwb3J0IGZvciB0aGUgcmVxdWlyZWQgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRlYWN0aXZhdGVSZXF1aXJlZEF0dHJpYnV0ZVN1cHBvcnQoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoIm1vZGU6cmVzZXQ6cmVxdWlyZWQiLCBCb29sZWFuLlRSVUUsIGZhbHNlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0QXBwbGljYXRpb25TY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjM4YmRmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5SRVVTRTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIGdlbmVyaWMgc3RvcmFnZSBtYW5hZ2VyIGltcGxlbWVudGF0aW9uIHdoaWNoIHN0b3JlcyB0aGUgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbnMgaW4gdGhlIGFwcGxpY2F0aW9uIHNjb3BlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihSRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxUPiBleHRlbmRzIEFic3RyYWN0U3RvcmFnZU1hbmFnZXI8VD4NCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBUPiByZXNvbHZlU3RvcmFnZU1hcCgpDQotICAgIHsNCi0gICAgICAgIE1hcCBhcHBsaWNhdGlvbk1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbk1hcCgpOw0KLSAgICAgICAgTWFwPFN0cmluZywgVD4gc3RvcmFnZU1hcDsNCi0NCi0gICAgICAgIGlmKCFhcHBsaWNhdGlvbk1hcC5jb250YWluc0tleShnZXRTdG9yYWdlTWFuYWdlcktleSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUPigpOw0KLSAgICAgICAgICAgIGFwcGxpY2F0aW9uTWFwLnB1dChnZXRTdG9yYWdlTWFuYWdlcktleSgpLCBzdG9yYWdlTWFwKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoTWFwPFN0cmluZywgVD4pYXBwbGljYXRpb25NYXAuZ2V0KGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjY2MTRlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LlJFVVNFOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogZ2VuZXJpYyBzdG9yYWdlIG1hbmFnZXIgaW1wbGVtZW50YXRpb24gd2hpY2ggc3RvcmVzIHRoZSBzdG9yYWdlIGltcGxlbWVudGF0aW9ucyBpbiB0aGUgcmVxdWVzdCBzY29wZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxUPiBleHRlbmRzIEFic3RyYWN0U3RvcmFnZU1hbmFnZXI8VD4NCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBUPiByZXNvbHZlU3RvcmFnZU1hcCgpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFQ+IHN0b3JhZ2VNYXA7DQotDQotICAgICAgICBpZighcmVxdWVzdE1hcC5jb250YWluc0tleShnZXRTdG9yYWdlTWFuYWdlcktleSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUPigpOw0KLSAgICAgICAgICAgIHJlcXVlc3RNYXAucHV0KGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCksIHN0b3JhZ2VNYXApOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChNYXA8U3RyaW5nLCBUPilyZXF1ZXN0TWFwLmdldChnZXRTdG9yYWdlTWFuYWdlcktleSgpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0U3RvcmFnZU1hbmFnZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODk4Yjk3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5SRVVTRTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBnZW5lcmljIHN0b3JhZ2UgbWFuYWdlciBpbXBsZW1lbnRhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RvcmFnZU1hbmFnZXI8VD4gZXh0ZW5kcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8U3RyaW5nPg0KLSAgICAgICAgaW1wbGVtZW50cyBTdG9yYWdlTWFuYWdlcjxUPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4oKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0U3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBUIGNyZWF0ZShTdHJpbmcgc3RvcmFnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIFQgc3RvcmFnZU1hbmFnZXI7DQotICAgICAgICBTdHJpbmcgc3RvcmFnZUNsYXNzTmFtZTsNCi0gICAgICAgIC8vbnVsbCAtPiB1c2UgbmFtZSBtYXBwZXJzDQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8U3RyaW5nPiBuYW1lTWFwcGVyIDogdGhpcy5uYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlQ2xhc3NOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKHN0b3JhZ2VOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoc3RvcmFnZUNsYXNzTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHN0b3JhZ2VNYW5hZ2VyID0gcmVzb2x2ZVN0b3JhZ2Uoc3RvcmFnZU5hbWUsIHN0b3JhZ2VDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChzdG9yYWdlTWFuYWdlciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2VNYW5hZ2VyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBUIHJlc29sdmVTdG9yYWdlKFN0cmluZyBzdG9yYWdlS2V5LCBTdHJpbmcgc3RvcmFnZUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgVD4gc3RvcmFnZU1hcCA9IHJlc29sdmVTdG9yYWdlTWFwKCk7DQotDQotICAgICAgICBpZighc3RvcmFnZU1hcC5jb250YWluc0tleShzdG9yYWdlS2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlTWFwLnB1dChzdG9yYWdlS2V5LCAoVClDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoc3RvcmFnZUNsYXNzTmFtZSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHN0b3JhZ2VNYXAuZ2V0KHN0b3JhZ2VLZXkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNYXA8U3RyaW5nLCBUPiByZXNvbHZlU3RvcmFnZU1hcCgpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgc3RvcmFnZUtleSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgVD4gc3RvcmFnZU1hcCA9IHJlc29sdmVTdG9yYWdlTWFwKCk7DQotDQotICAgICAgICBpZihzdG9yYWdlTWFwICE9IG51bGwgJiYgc3RvcmFnZU1hcC5jb250YWluc0tleShzdG9yYWdlS2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDbGFzcyBzdG9yYWdlQ2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHN0b3JhZ2VNYXAuZ2V0KHN0b3JhZ2VLZXkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgIHN0b3JhZ2VNYXAucHV0KHN0b3JhZ2VLZXksIChUKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHN0b3JhZ2VDbGFzcykpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gZ2V0TmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5uYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2FmMDMxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlIGltcGxlbWVudHMgRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgUGhhc2VJZCBjdXJyZW50UGhhc2VJZDsNCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q3VycmVudFBoYXNlSWQoUGhhc2VJZCBwaGFzZUlkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmN1cnJlbnRQaGFzZUlkID0gcGhhc2VJZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRDdXJyZW50UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRQaGFzZUlkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMTNiZGYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlci5EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIGpzZiBpbmZvcm1hdGlvbiBub3QgYXZhaWxhYmxlIHZpYSBqc2YtYXBpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIgZXh0ZW5kcw0KLSAgICAgICAgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlPg0KLXsNCi0gICAgRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBEZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfRkFDRVNfSU5GT1JNQVRJT05fU1RPUkFHRTpLRVkiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkNmI3Yy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuRmFjZXNNZXNzYWdlSG9sZGVyOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gIm9wdGlvbmFsIHBhcmFtZXRlciB0byBkZWFjdGl2YXRlIHNvcnRpbmciKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlIGltcGxlbWVudHMgRmFjZXNNZXNzYWdlU3RvcmFnZQ0KLXsNCi0gICAgTWFwPFN0cmluZywgVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgVmFsaWRhdGlvblJlc3VsdD4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkRmFjZXNNZXNzYWdlKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYoY2xpZW50SWQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjbGllbnRJZCA9ICIqIjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKCF0aGlzLnJlc3VsdHMuY29udGFpbnNLZXkoY2xpZW50SWQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMucmVzdWx0cy5wdXQoY2xpZW50SWQsIG5ldyBWYWxpZGF0aW9uUmVzdWx0KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGhpcy5yZXN1bHRzLmdldChjbGllbnRJZCkuYWRkRmFjZXNNZXNzYWdlSG9sZGVyKG5ldyBGYWNlc01lc3NhZ2VIb2xkZXIoZmFjZXNNZXNzYWdlLCBjbGllbnRJZCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZ2V0RmFjZXNNZXNzYWdlcygpDQotICAgIHsNCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgICAgIGZvcihWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRpb25SZXN1bHQgOiB0aGlzLnJlc3VsdHMudmFsdWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh2YWxpZGF0aW9uUmVzdWx0LmdldEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEFsbCgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdDsNCi0NCi0gICAgICAgIGZvcihWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRpb25SZXN1bHQgOiB0aGlzLnJlc3VsdHMudmFsdWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCA9IHZhbGlkYXRpb25SZXN1bHQuZ2V0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdCgpOw0KLSAgICAgICAgICAgIHNvcnRGYWNlc01lc3NhZ2VIb2xkZXJMaXN0KGZhY2VzTWVzc2FnZUhvbGRlckxpc3QpOw0KLQ0KLSAgICAgICAgICAgIGZvcihGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyIDogZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dC5hZGRNZXNzYWdlKGZhY2VzTWVzc2FnZUhvbGRlci5nZXRDbGllbnRJZCgpLCBmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0RmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc29ydEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QpDQotICAgIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCwgZ2V0RmFjZXNNZXNzYWdlQ29tcGFyYXRvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgQ29tcGFyYXRvcjxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZUNvbXBhcmF0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IENvbXBhcmF0b3I8RmFjZXNNZXNzYWdlSG9sZGVyPigpIHsNCi0gICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoRmFjZXNNZXNzYWdlSG9sZGVyIGhvbGRlcjEsIEZhY2VzTWVzc2FnZUhvbGRlciBob2xkZXIyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoaG9sZGVyMS5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpID09IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKGlzU2FtZVNldmVyaXR5KGhvbGRlcjEsIGhvbGRlcjIpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZU1lc3NhZ2VUZXh0KGhvbGRlcjEuZ2V0RmFjZXNNZXNzYWdlKCksIGhvbGRlcjIuZ2V0RmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmKGhvbGRlcjEuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKS5nZXRPcmRpbmFsKCkgPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlcjIuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKS5nZXRPcmRpbmFsKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByaXZhdGUgaW50IGNvbXBhcmVNZXNzYWdlVGV4dChGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlMSwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZTIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dDEgPSBmYWNlc01lc3NhZ2UxLmdldERldGFpbCgpOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dDIgPSBmYWNlc01lc3NhZ2UyLmdldERldGFpbCgpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZih0ZXh0MSA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0ZXh0MSA9IGZhY2VzTWVzc2FnZTEuZ2V0U3VtbWFyeSgpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmKHRleHQyID09IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRleHQyID0gZmFjZXNNZXNzYWdlMi5nZXRTdW1tYXJ5KCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYodGV4dDEgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYodGV4dDIgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0MS5jb21wYXJlVG9JZ25vcmVDYXNlKHRleHQyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NhbWVTZXZlcml0eShGYWNlc01lc3NhZ2VIb2xkZXIgaG9sZGVyMSwgRmFjZXNNZXNzYWdlSG9sZGVyIGhvbGRlcjIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBob2xkZXIxLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkuZXF1YWxzKGhvbGRlcjIuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU1hbmFnZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMjMyNmYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTmFtZU1hcHBlcjsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgZmFjZXMgbWVzc2FnZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTWFuYWdlciBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxGYWNlc01lc3NhZ2VTdG9yYWdlPg0KLXsNCi0gICAgRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX0ZBQ0VTX01FU1NBR0VTOktFWSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0R3JvdXBTdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiNGQ2MS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Hcm91cFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGdyb3Vwcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRHcm91cFN0b3JhZ2UgaW1wbGVtZW50cyBHcm91cFN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IGFkZGVkR3JvdXBzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PENsYXNzPj4oKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PENsYXNzPj4gcmVzdHJpY3RlZEdyb3VwcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgYWRkR3JvdXBUb0dyb3VwU3RvcmFnZShncm91cENsYXNzLCB2aWV3SWQsIGNsaWVudElkLCB0aGlzLmFkZGVkR3JvdXBzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZXN0cmljdEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgYWRkR3JvdXBUb0dyb3VwU3RvcmFnZShncm91cENsYXNzLCB2aWV3SWQsIGNsaWVudElkLCB0aGlzLnJlc3RyaWN0ZWRHcm91cHMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzc1tdIGdldEdyb3VwcyhTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMuYWRkZWRHcm91cHMuc2l6ZSgpIDwgMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vYWRkIGZvdW5kIGdyb3Vwcw0KLSAgICAgICAgU3RyaW5nIGtleSA9IEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBudWxsKTsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IHJlc3VsdExpc3RGb3JQYWdlID0gYnVpbGRHcm91cExpc3Qoa2V5LCB0aGlzLmFkZGVkR3JvdXBzKTsNCi0NCi0gICAgICAgIGtleSA9IEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBjbGllbnRJZCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN1bHRMaXN0Rm9yQ29tcG9uZW50ID0gYnVpbGRHcm91cExpc3Qoa2V5LCB0aGlzLmFkZGVkR3JvdXBzKTsNCi0NCi0gICAgICAgIC8vcmVtb3ZlIHJlc3RyaWN0ZWQgZ3JvdXBzDQotICAgICAgICBDbGFzc1tdIHJlc3VsdHNGb3JQYWdlID0NCi0gICAgICAgICAgICAgICAgZmlsdGVyR3JvdXBMaXN0KEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBudWxsKSwgcmVzdWx0TGlzdEZvclBhZ2UpOw0KLSAgICAgICAgQ2xhc3NbXSByZXN1bHRzRm9yQ29tcG9uZW50ID0NCi0gICAgICAgICAgICAgICAgZmlsdGVyR3JvdXBMaXN0KEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBjbGllbnRJZCksIHJlc3VsdExpc3RGb3JDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0c0ZvclBhZ2UubGVuZ3RoID09IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYocmVzdWx0c0ZvckNvbXBvbmVudC5sZW5ndGggPT0gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCJubyBncm91cHMgZm9yIGdyb3VwLXZhbGlkYXRpb24gYXZhaWxhYmxlLiIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF5YmUgeW91IHJlc3RyaWN0ZWQgYWxsIGdyb3VwcyBvciB5b3UgYXJlbid0IHVzaW5nIGdyb3Vwcy4iICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlYW4gdmFsaWRhdGlvbiB3aWxsIHVzZSB0aGUgZGVmYXVsdCBncm91cCBmb3IgdmFsaWRhdGlvbiIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRzRm9yQ29tcG9uZW50Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihyZXN1bHRzRm9yQ29tcG9uZW50Lmxlbmd0aCA9PSAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRzRm9yUGFnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBtZXJnZVJlc3VsdHMocmVzdWx0c0ZvclBhZ2UsIHJlc3VsdHNGb3JDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRHcm91cFRvR3JvdXBTdG9yYWdlKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IGdyb3VwU3RvcmFnZSkNCi0gICAgew0KLSAgICAgICAgTGlzdDxDbGFzcz4gZ3JvdXBMaXN0ID0gZ3JvdXBTdG9yYWdlLmdldChHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgY2xpZW50SWQpKTsNCi0NCi0gICAgICAgIGlmKGdyb3VwTGlzdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGdyb3VwTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgICAgICAgICAgZ3JvdXBTdG9yYWdlLnB1dChHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgY2xpZW50SWQpLCBncm91cExpc3QpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoIWdyb3VwTGlzdC5jb250YWlucyhncm91cENsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBncm91cExpc3QuYWRkKGdyb3VwQ2xhc3MpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxDbGFzcz4gYnVpbGRHcm91cExpc3QoU3RyaW5nIGtleSwgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IGdyb3VwU3RvcmFnZSkNCi0gICAgew0KLSAgICAgICAgTGlzdDxDbGFzcz4gbGlzdCA9IGdyb3VwU3RvcmFnZS5nZXQoa2V5KTsNCi0gICAgICAgIHJldHVybiAobGlzdCAhPSBudWxsKSA/IGxpc3QgOiBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3NbXSBmaWx0ZXJHcm91cExpc3QoU3RyaW5nIGtleSwgTGlzdDxDbGFzcz4gYWRkZWRHcm91cHMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHMgPSBidWlsZEdyb3VwTGlzdChrZXksIHRoaXMucmVzdHJpY3RlZEdyb3Vwcyk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBjdXJyZW50R3JvdXAgOiBhZGRlZEdyb3VwcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighcmVzdHJpY3RlZEdyb3Vwcy5jb250YWlucyhjdXJyZW50R3JvdXApKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoY3VycmVudEdyb3VwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0cy50b0FycmF5KG5ldyBDbGFzc1tyZXN1bHRzLnNpemUoKV0pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3NbXSBtZXJnZVJlc3VsdHMoQ2xhc3NbXSByZXN1bHRzRm9yUGFnZSwgQ2xhc3NbXSByZXN1bHRzRm9yQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBDbGFzc1tdIG1lcmdlZFJlc3VsdCA9IG5ldyBDbGFzc1tyZXN1bHRzRm9yUGFnZS5sZW5ndGggKyByZXN1bHRzRm9yQ29tcG9uZW50Lmxlbmd0aF07DQotDQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdHNGb3JQYWdlLCAwLCBtZXJnZWRSZXN1bHQsIDAsIHJlc3VsdHNGb3JQYWdlLmxlbmd0aCk7DQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdHNGb3JDb21wb25lbnQsIDAsIG1lcmdlZFJlc3VsdCwgcmVzdWx0c0ZvclBhZ2UubGVuZ3RoLCByZXN1bHRzRm9yQ29tcG9uZW50Lmxlbmd0aCk7DQotDQotICAgICAgICByZXR1cm4gbWVyZ2VkUmVzdWx0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEdyb3VwU3RvcmFnZU1hbmFnZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEdyb3VwU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE2YjViYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBncm91cHMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRHcm91cFN0b3JhZ2VNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPEdyb3VwU3RvcmFnZT4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfR1JPVVBTOktFWSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWV0YURhdGFTdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZkN2I1OC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRNZXRhRGF0YVN0b3JhZ2UgaW1wbGVtZW50cyBNZXRhRGF0YVN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWFwPFN0cmluZywgUHJvcGVydHlJbmZvcm1hdGlvbj4+IGNhY2hlZFByb3BlcnR5SW5mb3JtYXRpb24gPQ0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgUHJvcGVydHlJbmZvcm1hdGlvbj4+KCk7DQotDQotICAgIHByaXZhdGUgTGlzdDxNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IG1ldGFEYXRhU3RvcmFnZUZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4oKTsNCi0gICAgcHJpdmF0ZSBMaXN0PENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+PiBkZW5pZWRNZXRhRGF0YUZpbHRlcnMgPQ0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8Q2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0TWV0YURhdGFTdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgaW5pdEZpbHRlcnMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdEZpbHRlcnMoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIpOw0KLSAgICAgICAgbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoDQotICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIpKTsNCi0NCi0gICAgICAgIE1ldGFEYXRhU3RvcmFnZUZpbHRlciBtZXRhRGF0YVN0b3JhZ2VGaWx0ZXI7DQotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lIDogbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgPQ0KLSAgICAgICAgICAgICAgICAoTWV0YURhdGFTdG9yYWdlRmlsdGVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWV0YURhdGFTdG9yYWdlRmlsdGVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLm1ldGFEYXRhU3RvcmFnZUZpbHRlcnMuYWRkKG1ldGFEYXRhU3RvcmFnZUZpbHRlcik7DQotDQotICAgICAgICAgICAgICAgIGxvZ0FkZGVkRmlsdGVyKG1ldGFEYXRhU3RvcmFnZUZpbHRlci5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc3RvcmVNZXRhRGF0YU9mKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgaW52b2tlRmlsdGVycyhwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvblRvU3RvcmUgPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBwcm9wZXJ0eUluZm9ybWF0aW9uDQotICAgICAgICAgICAgICAgIC5nZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgY29weU1ldGFEYXRhKHByb3BlcnR5SW5mb3JtYXRpb24sIHByb3BlcnR5SW5mb3JtYXRpb25Ub1N0b3JlKTsNCi0NCi0gICAgICAgIGdldE1hcEZvckNsYXNzKFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpKSkNCi0gICAgICAgICAgICAgICAgLnB1dChwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvblRvU3RvcmUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbnZva2VGaWx0ZXJzKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgZm9yKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBmaWx0ZXIgOiB0aGlzLm1ldGFEYXRhU3RvcmFnZUZpbHRlcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmlsdGVyLmZpbHRlcihwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeVtdIGdldE1ldGFEYXRhKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IGdldE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5nZXQodGFyZ2V0UHJvcGVydHkpOw0KLQ0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBjbG9uZWRQcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKCk7DQotICAgICAgICBjb3B5TWV0YURhdGEocHJvcGVydHlJbmZvcm1hdGlvbiwgY2xvbmVkUHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgICAgICByZXR1cm4gY2xvbmVkUHJvcGVydHlJbmZvcm1hdGlvbi5nZXRNZXRhRGF0YUVudHJpZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc01ldGFEYXRhRm9yKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykuY29udGFpbnNLZXkodGFyZ2V0UHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRmlsdGVyKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBzdG9yYWdlRmlsdGVyKQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoIWlzRmlsdGVyRGVuaWVkKHN0b3JhZ2VGaWx0ZXIpICYmICFpc0ZpbHRlckFscmVhZHlSZWdpc3RlcmVkKHN0b3JhZ2VGaWx0ZXIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5tZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzLmFkZChzdG9yYWdlRmlsdGVyKTsNCi0gICAgICAgICAgICAgICAgbG9nQWRkZWRGaWx0ZXIoc3RvcmFnZUZpbHRlci5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRmlsdGVyRGVuaWVkKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBzdG9yYWdlRmlsdGVyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5kZW5pZWRNZXRhRGF0YUZpbHRlcnMuY29udGFpbnMoZ2V0U3RvcmFnZUZpbHRlckNsYXNzKHN0b3JhZ2VGaWx0ZXIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNGaWx0ZXJBbHJlYWR5UmVnaXN0ZXJlZChNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgc3RvcmFnZUZpbHRlcikNCi0gICAgew0KLSAgICAgICAgZm9yKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBmaWx0ZXIgOiB0aGlzLm1ldGFEYXRhU3RvcmFnZUZpbHRlcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoZmlsdGVyLmdldENsYXNzKCkuZXF1YWxzKGdldFN0b3JhZ2VGaWx0ZXJDbGFzcyhzdG9yYWdlRmlsdGVyKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZGVyZWdpc3RlckZpbHRlcihDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPiBmaWx0ZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgTWV0YURhdGFTdG9yYWdlRmlsdGVyIHN0b3JhZ2VGaWx0ZXIgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzcyhmaWx0ZXJDbGFzcyk7DQotDQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5tZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzLnJlbW92ZShzdG9yYWdlRmlsdGVyKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGxvZ1JlbW92ZWRGaWx0ZXIoc3RvcmFnZUZpbHRlci5nZXRDbGFzcygpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBkZW55RmlsdGVyKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlcklkIDogdGhpcy5kZW5pZWRNZXRhRGF0YUZpbHRlcnMpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihmaWx0ZXJJZC5lcXVhbHMoZmlsdGVyQ2xhc3MpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdGhpcy5kZW5pZWRNZXRhRGF0YUZpbHRlcnMuYWRkKGZpbHRlckNsYXNzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGRlcmVnaXN0ZXJGaWx0ZXIoZmlsdGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkNCi0gICAgcHJpdmF0ZSB2b2lkIGNvcHlNZXRhRGF0YShQcm9wZXJ0eUluZm9ybWF0aW9uIHNvdXJjZSwgUHJvcGVydHlJbmZvcm1hdGlvbiB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRW50cnkgbmV3TWV0YURhdGFFbnRyeTsNCi0gICAgICAgIGZvcihNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkgOiBzb3VyY2UuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbmV3TWV0YURhdGFFbnRyeSA9IG5ldyBNZXRhRGF0YUVudHJ5KCk7DQotICAgICAgICAgICAgbmV3TWV0YURhdGFFbnRyeS5zZXRLZXkobWV0YURhdGFFbnRyeS5nZXRLZXkoKSk7DQotICAgICAgICAgICAgbmV3TWV0YURhdGFFbnRyeS5zZXRWYWx1ZShtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkpOw0KLQ0KLSAgICAgICAgICAgIHRhcmdldC5hZGRNZXRhRGF0YUVudHJ5KG5ld01ldGFEYXRhRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBsb2dBZGRlZEZpbHRlcihDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPiBmaWx0ZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oZmlsdGVyQ2xhc3MuZ2V0TmFtZSgpICsgIiBhZGRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBsb2dSZW1vdmVkRmlsdGVyKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhmaWx0ZXJDbGFzcy5nZXROYW1lKCkgKyAiIHJlbW92ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFByb3BlcnR5SW5mb3JtYXRpb24+IGdldE1hcEZvckNsYXNzKENsYXNzIHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGtleSA9IFByb3h5VXRpbHMuZ2V0Q2xhc3NOYW1lKHRhcmdldCk7DQotICAgICAgICBpZighdGhpcy5jYWNoZWRQcm9wZXJ0eUluZm9ybWF0aW9uLmNvbnRhaW5zS2V5KGtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5jYWNoZWRQcm9wZXJ0eUluZm9ybWF0aW9uLnB1dChrZXksIG5ldyBIYXNoTWFwPFN0cmluZywgUHJvcGVydHlJbmZvcm1hdGlvbj4oKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRQcm9wZXJ0eUluZm9ybWF0aW9uLmdldChrZXkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gZ2V0U3RvcmFnZUZpbHRlckNsYXNzKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBzdG9yYWdlRmlsdGVyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhzdG9yYWdlRmlsdGVyLmdldENsYXNzKCksIE1ldGFEYXRhU3RvcmFnZUZpbHRlci5jbGFzcyk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWV0YURhdGFTdG9yYWdlTWFuYWdlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWV0YURhdGFTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2M2OWJlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRNZXRhRGF0YVN0b3JhZ2VOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIHByb3BlcnR5IGluZm9ybWF0aW9uIGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdEFwcGxpY2F0aW9uU2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPE1ldGFEYXRhU3RvcmFnZT4NCi17DQotICAgIERlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRNZXRhRGF0YVN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfTUVUQV9EQVRBX0NBQ0hFOktFWSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UHJvcGVydHlTdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEwYTdmMC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9wZXJ0eVN0b3JhZ2UgaW1wbGVtZW50cyBQcm9wZXJ0eVN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWFwPFN0cmluZywgRmllbGQ+PiBmaWVsZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgRmllbGQ+PigpOw0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIE1ldGhvZD4+IG1ldGhvZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgTWV0aG9kPj4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgc3RvcmVGaWVsZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5LCBGaWVsZCBmaWVsZCkNCi0gICAgew0KLSAgICAgICAgZ2V0RmllbGRNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykucHV0KHByb3BlcnR5LCBmaWVsZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc3RvcmVNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSwgTWV0aG9kIG1ldGhvZCkNCi0gICAgew0KLSAgICAgICAgZ2V0TWV0aG9kTWFwRm9yQ2xhc3ModGFyZ2V0Q2xhc3MpLnB1dChwcm9wZXJ0eSwgIG1ldGhvZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZpZWxkIGdldEZpZWxkKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRGaWVsZE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5nZXQocHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRNZXRob2RNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykuZ2V0KHByb3BlcnR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0ZpZWxkKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRGaWVsZE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5jb250YWluc0tleShwcm9wZXJ0eSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldE1ldGhvZE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5jb250YWluc0tleShwcm9wZXJ0eSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBGaWVsZD4gZ2V0RmllbGRNYXBGb3JDbGFzcyhDbGFzcyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBrZXkgPSBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh0YXJnZXQpOw0KLSAgICAgICAgaWYgKCF0aGlzLmZpZWxkTWFwLmNvbnRhaW5zS2V5KGtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5maWVsZE1hcC5wdXQoa2V5LCBuZXcgSGFzaE1hcDxTdHJpbmcsIEZpZWxkPigpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0aGlzLmZpZWxkTWFwLmdldChrZXkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWV0aG9kPiBnZXRNZXRob2RNYXBGb3JDbGFzcyhDbGFzcyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBrZXkgPSBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh0YXJnZXQpOw0KLSAgICAgICAgaWYgKCF0aGlzLm1ldGhvZE1hcC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubWV0aG9kTWFwLnB1dChrZXksIG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kPigpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0aGlzLm1ldGhvZE1hcC5nZXQoa2V5KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNWExMDQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UHJvcGVydHlTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdFByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXI7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIHByb3BlcnR5IGluZm9ybWF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0UHJvcGVydHlTdG9yYWdlTWFuYWdlciBleHRlbmRzIEFic3RyYWN0QXBwbGljYXRpb25TY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8UHJvcGVydHlTdG9yYWdlPg0KLXsNCi0gICAgRGVmYXVsdFByb3BlcnR5U3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdFByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBTdG9yYWdlTWFuYWdlci5jbGFzcy5nZXROYW1lKCkgKyAiX0ZPUl9QUk9QRVJUWTpLRVkiOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMzNGNlMy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZSBpbXBsZW1lbnRzIFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuZ2V0KGtleSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIDxUPiBUIGdldFByb3BlcnR5KFN0cmluZyBrZXksIENsYXNzPFQ+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFQpdGhpcy5wcm9wZXJ0aWVzLmdldChrZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydGllcy5yZW1vdmUoa2V5KTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTWFuYWdlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY1YmMzMC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciByZW5kZXJlciBpbnRlcmNlcHRvciBwcm9wZXJ0aWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU1hbmFnZXINCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2U+DQotew0KLSAgICBEZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfUkVOREVSRVJfSU5URVJDRVBUT1JfUFJPUEVSVFk6S0VZIjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQyN2VmOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlIGltcGxlbWVudGF0aW9uIGZvciBncm91cHMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2UgaW1wbGVtZW50cyBSZW5kZXJlclByb3h5U3RvcmFnZQ0KLXsNCi0gICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeT4+IHByb3h5U3RvcmFnZSA9DQotICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnk+PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnRyeShTdHJpbmcgcmVuZGVyZXJLZXksIFN0cmluZyBjbGllbnRJZCwgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBlbnRyeSkNCi0gICAgew0KLSAgICAgICAgZ2V0UmVuZGVyZXJTdG9yYWdlKHJlbmRlcmVyS2V5KS5wdXQoY2xpZW50SWQsIGVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0VudHJ5KFN0cmluZyByZW5kZXJlcktleSwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZXJTdG9yYWdlKHJlbmRlcmVyS2V5KS5jb250YWluc0tleShjbGllbnRJZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZ2V0RW50cnkoU3RyaW5nIHJlbmRlcmVyS2V5LCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRSZW5kZXJlclN0b3JhZ2UocmVuZGVyZXJLZXkpLmdldChjbGllbnRJZCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5PiBnZXRSZW5kZXJlclN0b3JhZ2UoU3RyaW5nIHJlbmRlcmVyS2V5KQ0KLSAgICB7DQotICAgICAgICBpZighcHJveHlTdG9yYWdlLmNvbnRhaW5zS2V5KHJlbmRlcmVyS2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm94eVN0b3JhZ2UucHV0KHJlbmRlcmVyS2V5LCBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnk+KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHByb3h5U3RvcmFnZS5nZXQocmVuZGVyZXJLZXkpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTWFuYWdlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZDNhY2QuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciByZW5kZXJlciBwcm94eSBlbnRyaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU1hbmFnZXINCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8UmVuZGVyZXJQcm94eVN0b3JhZ2U+DQotew0KLSAgICBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIC8vZm9yIGJldHRlciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5DQotICAgICAgICByZXR1cm4gRXh0VmFsUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCkgKyAiOlNUT1JBR0UiOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0U3RvcmFnZU1hbmFnZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTY2ZGUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0U3RvcmFnZU1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBzdG9yYWdlLW1hbmFnZXIgY3JlYXRpb24gYW5kIGNhY2hpbmcNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0U3RvcmFnZU1hbmFnZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PENsYXNzPg0KLSAgICAgICAgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PENsYXNzLCBTdG9yYWdlTWFuYWdlcj4sIFN0b3JhZ2VNYW5hZ2VySG9sZGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gbGF6eVN0YXRpY01hcHBpbmdBcHBsaWVkID0gZmFsc2U7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPENsYXNzPj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8Q2xhc3M+PigpOw0KLSAgICBwcml2YXRlIE1hcDxDbGFzcywgU3RvcmFnZU1hbmFnZXI+IHN0b3JhZ2VUeXBlVG9TdG9yYWdlTWFuYWdlck1hcCA9IG5ldyBIYXNoTWFwPENsYXNzLCBTdG9yYWdlTWFuYWdlcj4oKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoUmVuZGVyZXJQcm94eVN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKEdyb3VwU3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRHcm91cFN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKE1ldGFEYXRhU3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKEZhY2VzTWVzc2FnZVN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoUHJvcGVydHlTdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFByb3BlcnR5U3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTWFuYWdlcigpLCBmYWxzZSk7DQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLQ0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RvcmFnZU1hbmFnZXIgY3JlYXRlKENsYXNzIHN0b3JhZ2VUeXBlKQ0KLSAgICB7DQotICAgICAgICBpZiAoIXRoaXMubGF6eVN0YXRpY01hcHBpbmdBcHBsaWVkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRTdGF0aWNNYXBwaW5ncygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RvcmFnZU1hbmFnZXIgc3RvcmFnZU1hbmFnZXI7DQotICAgICAgICBTdHJpbmcgc3RvcmFnZU1hbmFnZXJOYW1lOw0KLSAgICAgICAgLy9udWxsIC0+IHVzZSBuYW1lIG1hcHBlcnMNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxDbGFzcz4gbmFtZU1hcHBlciA6IHRoaXMubmFtZU1hcHBlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RvcmFnZU1hbmFnZXJOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKHN0b3JhZ2VUeXBlKTsNCi0NCi0gICAgICAgICAgICBpZiAoc3RvcmFnZU1hbmFnZXJOYW1lID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgc3RvcmFnZU1hbmFnZXIgPSAoU3RvcmFnZU1hbmFnZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHN0b3JhZ2VNYW5hZ2VyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHN0b3JhZ2VNYW5hZ2VyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKHN0b3JhZ2VUeXBlLCBzdG9yYWdlTWFuYWdlcik7DQotICAgICAgICAgICAgICAgIHJldHVybiBzdG9yYWdlTWFuYWdlcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZ2V0U3RvcmFnZU1hbmFnZXIoc3RvcmFnZVR5cGUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkTWFwcGluZyhDbGFzcyBzdG9yYWdlVHlwZSwgU3RvcmFnZU1hbmFnZXIgc3RvcmFnZU1hbmFnZXIpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gaXNWYWxpZEVudHJ5ID0gdHJ1ZTsNCi0gICAgICAgIGlmKHN0b3JhZ2VUeXBlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaXNWYWxpZEVudHJ5ID0gZmFsc2U7DQotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNFcnJvckVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCJ5b3UgdHJpZWQgdG8gYWRkIGFuIGludmFsaWQgc3RvcmFnZSB0eXBlIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoc3RvcmFnZU1hbmFnZXIgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpc1ZhbGlkRW50cnkgPSBmYWxzZTsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoInlvdSB0cmllZCB0byBhZGQgYW4gaW52YWxpZCBzdG9yYWdlIG1hbmFnZXIiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZighaXNWYWxpZEVudHJ5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKHN0b3JhZ2VUeXBlLCBzdG9yYWdlTWFuYWdlciwgdHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGF6eVN0YXRpY01hcHBpbmdBcHBsaWVkID0gdHJ1ZTsNCi0NCi0gICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlNUT1JBR0VfVFlQRV9UT19TVE9SQUdFX01BTkFHRVJfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cE1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cE1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3MpDQotICAgIHsNCi0gICAgICAgIGZvcihTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IG1hcHBpbmcgOiBtYXBwaW5ncykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNYXBwaW5nKENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKG1hcHBpbmcuZ2V0U291cmNlKCkpLA0KLSAgICAgICAgICAgICAgICAgICAgKFN0b3JhZ2VNYW5hZ2VyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShtYXBwaW5nLmdldFRhcmdldCgpKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxDbGFzcz4+IGdldE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZU1hcHBlckxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0U3RvcmFnZU1hbmFnZXIoQ2xhc3Mgc3RvcmFnZVR5cGUsIFN0b3JhZ2VNYW5hZ2VyIHN0b3JhZ2VNYW5hZ2VyLCBib29sZWFuIG92ZXJyaWRlKQ0KLSAgICB7DQotICAgICAgICBpZighdGhpcy5zdG9yYWdlVHlwZVRvU3RvcmFnZU1hbmFnZXJNYXAuY29udGFpbnNLZXkoc3RvcmFnZVR5cGUpIHx8DQotICAgICAgICAgICAgICAgICh0aGlzLnN0b3JhZ2VUeXBlVG9TdG9yYWdlTWFuYWdlck1hcC5jb250YWluc0tleShzdG9yYWdlVHlwZSkgJiYgb3ZlcnJpZGUpKQ0KLSAgICAgICAgew0KLQ0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZGRpbmcgdHlwZSB0byBzdG9yYWdlLW1hbmFnZXIgbWFwcGluZzogIg0KLSAgICAgICAgICAgICAgICAgICAgKyBzdG9yYWdlVHlwZS5nZXROYW1lKCkgKyAiIC0+ICIgKyBzdG9yYWdlTWFuYWdlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHRoaXMuc3RvcmFnZVR5cGVUb1N0b3JhZ2VNYW5hZ2VyTWFwLnB1dChzdG9yYWdlVHlwZSwgc3RvcmFnZU1hbmFnZXIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdG9yYWdlTWFuYWdlciBnZXRTdG9yYWdlTWFuYWdlcihDbGFzcyB0eXBlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlVHlwZVRvU3RvcmFnZU1hbmFnZXJNYXAuZ2V0KHR5cGUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjA2OWQ0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZSBpbXBsZW1lbnRzIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgdmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsNCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcihWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciA9IHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRmNzdmZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgYSBjdXN0b20gVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VNYW5hZ2VyIGV4dGVuZHMNCi0gICAgICAgIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZT4NCi17DQotICAgIERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX1ZJT0xBVElPTlNFVkVSSVRZX0lOVEVSUFJFVEVSOktFWSI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9GYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9GYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjAxODM0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi0NCi0vKioNCi0gKiBzdG9yYWdlIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IGZhY2VzIHJlcXVlc3QNCi0gKiBmb3Igbm93IGl0IGp1c3QgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgcGhhc2Ugb2YgdGhlIGxpZmVjeWNsZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlDQotew0KLSAgICB2b2lkIHNldEN1cnJlbnRQaGFzZUlkKFBoYXNlSWQgcGhhc2VJZCk7DQotDQotICAgIFBoYXNlSWQgZ2V0Q3VycmVudFBoYXNlSWQoKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9GYWNlc01lc3NhZ2VTdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwMDk1YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkZhY2VzTWVzc2FnZUhvbGRlcjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRmFjZXNNZXNzYWdlU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBhZGRGYWNlc01lc3NhZ2UoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKTsNCi0NCi0gICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZXMoKTsNCi0NCi0gICAgdm9pZCBhZGRBbGwoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Hcm91cFN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvR3JvdXBTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYzAxNGIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Hcm91cFN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBzdWdnZXN0ZWQgaW50ZXJmYWNlIGZvciBhIGdyb3VwIHN0b3JhZ2UNCi0gKiB1c2VkIGJ5IHRoZSBidmkgbW9kdWxlIGFuZCBhZGQtb25zDQotICogPHAvPg0KLSAqIGl0IGFsbG93cyB0byBtYW5hZ2UgZ3JvdXBzIGZvciB0aGUgY3VycmVudCByZXF1ZXN0DQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBHcm91cFN0b3JhZ2UNCi17DQotICAgIHZvaWQgYWRkR3JvdXAoQ2xhc3MgZ3JvdXBDbGFzcywgU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKTsNCi0NCi0gICAgdm9pZCByZXN0cmljdEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCk7DQotDQotICAgIENsYXNzW10gZ2V0R3JvdXBzKFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWV0YURhdGFTdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01ldGFEYXRhU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWVjZWJkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWV0YURhdGFTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBNZXRhRGF0YVN0b3JhZ2UNCi17DQotICAgIHZvaWQgc3RvcmVNZXRhRGF0YU9mKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgIE1ldGFEYXRhRW50cnlbXSBnZXRNZXRhRGF0YShDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldFByb3BlcnR5KTsNCi0NCi0gICAgYm9vbGVhbiBjb250YWluc01ldGFEYXRhRm9yKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpOw0KLQ0KLSAgICB2b2lkIHJlZ2lzdGVyRmlsdGVyKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBzdG9yYWdlRmlsdGVyKTsNCi0NCi0gICAgdm9pZCBkZXJlZ2lzdGVyRmlsdGVyKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlckNsYXNzKTsNCi0NCi0gICAgdm9pZCBkZW55RmlsdGVyKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlckNsYXNzKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWV0YURhdGFTdG9yYWdlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMmZkYjYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhU3RvcmFnZUZpbHRlcg0KLXsNCi0gICAgdm9pZCBmaWx0ZXIoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Qcm9wZXJ0eVN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUHJvcGVydHlTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NzMyN2QuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Qcm9wZXJ0eVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlTdG9yYWdlDQotew0KLSAgICB2b2lkIHN0b3JlRmllbGQoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSwgRmllbGQgZmllbGQpOw0KLQ0KLSAgICB2b2lkIHN0b3JlTWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHksIE1ldGhvZCBtZXRob2QpOw0KLQ0KLSAgICBGaWVsZCBnZXRGaWVsZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5KTsNCi0NCi0gICAgTWV0aG9kIGdldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5KTsNCi0NCi0gICAgYm9vbGVhbiBjb250YWluc0ZpZWxkKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpOw0KLQ0KLSAgICBib29sZWFuIGNvbnRhaW5zTWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGZhYTkwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGEgc3RvcmFnZSB3aGljaCBpc24ndCB1c2VkIGludGVybmFsbHkuIGl0J3MgZm9yIGFkZC1vbnMgdG8gZWFzaWx5IHN0b3JlIHByb3BlcnRpZXMgb2YgaW50ZXJjZXB0b3JzLg0KLSAqIHdpdGhvdXQgYnJha2luZyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBpdCdzIHBvc3NpYmxlIHRvIHVzZSB0aGVzZSBwcm9wZXJ0aWVzIGluIGN1c3RvbSBhcnRpZmFjdHMuDQotICogcmVuZGVyaW5nIGludGVyY2VwdGlvbiBpcyBhbiBpbnRlcm5hbCBjb25jZXB0LiBzbyBwcm9wZXJ0aWVzLC4uLiBvZiBpdCB3b24ndCBnZXQgaW50byB0aGUgYXBpLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UNCi17DQotICAgIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKTsNCi0NCi0gICAgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpOw0KLQ0KLSAgICA8VD4gVCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcyk7DQotDQotICAgIHZvaWQgcmVtb3ZlUHJvcGVydHkoU3RyaW5nIGtleSk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJQcm94eVN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJQcm94eVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcxYTc1Yi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVyUHJveHlTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXJQcm94eVN0b3JhZ2UNCi17DQotICAgIHZvaWQgc2V0RW50cnkoU3RyaW5nIHJlbmRlcmVyS2V5LCBTdHJpbmcgY2xpZW50SWQsIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkpOw0KLQ0KLSAgICBib29sZWFuIGNvbnRhaW5zRW50cnkoU3RyaW5nIHJlbmRlcmVyS2V5LCBTdHJpbmcgY2xpZW50SWQpOw0KLQ0KLSAgICBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGdldEVudHJ5KFN0cmluZyByZW5kZXJlcktleSwgU3RyaW5nIGNsaWVudElkKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkzNDc3OC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkKLXsKLSAgICBwcml2YXRlIGJvb2xlYW4gZGVjb2RlQ2FsbGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGVuY29kZUJlZ2luQ2FsbGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGVuY29kZUNoaWxkcmVuQ2FsbGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGVuY29kZUVuZENhbGxlZCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBPYmplY3QgY29udmVydGVkVmFsdWUgPSBudWxsOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWNvZGVDYWxsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlY29kZUNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWNvZGVDYWxsZWQoYm9vbGVhbiBkZWNvZGVDYWxsZWQpCi0gICAgewotICAgICAgICB0aGlzLmRlY29kZUNhbGxlZCA9IGRlY29kZUNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuY29kZUJlZ2luQ2FsbGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbmNvZGVCZWdpbkNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVCZWdpbkNhbGxlZChib29sZWFuIGVuY29kZUJlZ2luQ2FsbGVkKQotICAgIHsKLSAgICAgICAgdGhpcy5lbmNvZGVCZWdpbkNhbGxlZCA9IGVuY29kZUJlZ2luQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlQ2hpbGRyZW5DYWxsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVuY29kZUNoaWxkcmVuQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kZUNoaWxkcmVuQ2FsbGVkKGJvb2xlYW4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQpCi0gICAgewotICAgICAgICB0aGlzLmVuY29kZUNoaWxkcmVuQ2FsbGVkID0gZW5jb2RlQ2hpbGRyZW5DYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmNvZGVFbmRDYWxsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVuY29kZUVuZENhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVFbmRDYWxsZWQoYm9vbGVhbiBlbmNvZGVFbmRDYWxsZWQpCi0gICAgewotICAgICAgICB0aGlzLmVuY29kZUVuZENhbGxlZCA9IGVuY29kZUVuZENhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZWRWYWx1ZShPYmplY3QgY29udmVydGVkVmFsdWUpCi0gICAgewotICAgICAgICB0aGlzLmNvbnZlcnRlZFZhbHVlID0gY29udmVydGVkVmFsdWU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBjODM5Ny4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LkFQSTsNCi0NCi0vKioNCi0gKiBtYW5hZ2VyIHRvIGNyZWF0ZSBhbmQgcmVzZXQgc3BlY2lmaWMgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbnMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKEFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFN0b3JhZ2VNYW5hZ2VyPFQ+DQotew0KLSAgICBUIGNyZWF0ZShTdHJpbmcga2V5KTsNCi0gICAgdm9pZCByZXNldChTdHJpbmcga2V5KTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9TdG9yYWdlTWFuYWdlckhvbGRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9TdG9yYWdlTWFuYWdlckhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGY5NTM4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXJIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuQVBJOw0KLQ0KLS8qKg0KLSAqIGludGVyZmFjZSB0byBtYW5hZ2Ugc3RvcmFnZS1tYW5hZ2VyIGluc3RhbmNlcw0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKEFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFN0b3JhZ2VNYW5hZ2VySG9sZGVyDQotew0KLSAgICB2b2lkIHNldFN0b3JhZ2VNYW5hZ2VyKENsYXNzIHR5cGUsIFN0b3JhZ2VNYW5hZ2VyIHN0b3JhZ2VNYW5hZ2VyLCBib29sZWFuIG92ZXJyaWRlKTsNCi0gICAgU3RvcmFnZU1hbmFnZXIgZ2V0U3RvcmFnZU1hbmFnZXIoQ2xhc3MgdHlwZSk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvVmFsaWRhdGlvblJlc3VsdC5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WYWxpZGF0aW9uUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3OTMyN2MuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WYWxpZGF0aW9uUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5GYWNlc01lc3NhZ2VIb2xkZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTE9XLCBkZXNjcmlwdGlvbiA9ICJyZWZhY3RvciBpdCIpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBWYWxpZGF0aW9uUmVzdWx0DQotew0KLSAgICBwcml2YXRlIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEZhY2VzTWVzc2FnZUhvbGRlcihGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZhY2VzTWVzc2FnZUhvbGRlckxpc3QuYWRkKGZhY2VzTWVzc2FnZUhvbGRlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBnZXRGYWNlc01lc3NhZ2VIb2xkZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZUhvbGRlckxpc3Q7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWFjMTFjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsNCi0NCi0vKioNCi0gKiBzdWdnZXN0ZWQgaW50ZXJmYWNlIGZvciBhIHZpb2xhdGlvbi1zZXZlcml0eS1pbnRlcnByZXRlciBzdG9yYWdlDQotICogdXNlZCBieSBhZGQtb25zIHRvIGNoYW5nZSB0aGUgaW50ZXJwcmV0ZXIgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlDQotew0KLSAgICB2b2lkIHNldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKTsNCi0NCi0gICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBnZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExMDI5Ni4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiB1c2UgYSBwdWJsaWMgY2xhc3MgdG8gYWxsb3cgb3B0aW9uYWwgZGVyZWdpc3RyYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGU5N2YyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkZhY2VzTWVzc2FnZVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0TWV0YURhdGFTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWJmZTk3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuTWV0YURhdGFTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRNZXRhRGF0YVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKE1ldGFEYXRhU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdE1ldGFEYXRhU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTIyNjQxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdFByb3BlcnR5U3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5Qcm9wZXJ0eVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFByb3BlcnR5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdFByb3BlcnR5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NDc1MjguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDI0ZjNjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUmVuZGVyZXJQcm94eVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoUmVuZGVyZXJQcm94eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJlYzhkNy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiB1c2UgYSBwdWJsaWMgY2xhc3MgdG8gYWxsb3cgb3B0aW9uYWwgZGVyZWdpc3RyYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL0VtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE0ZWEyZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL0VtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSB4LnguMwotICovCi1AVGFyZ2V0KFRZUEUpCi1AUmV0ZW50aW9uKFJVTlRJTUUpCi1ARG9jdW1lbnRlZAotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgQGludGVyZmFjZSBFbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kKLXsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL051bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL051bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZDQ2OWIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSB4LnguMwotICovCi1AVGFyZ2V0KFRZUEUpCi1AUmV0ZW50aW9uKFJVTlRJTUUpCi1ARG9jdW1lbnRlZAotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgQGludGVyZmFjZSBOdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQotewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI0Y2FhNC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL1NraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgU2tpcFZhbGlkYXRpb25FdmFsdWF0b3INCi17DQotICAgIGJvb2xlYW4gc2tpcFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwgTWV0YURhdGFFbnRyeSBlbnRyeSk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vZXhjZXB0aW9uL1JlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL2V4Y2VwdGlvbi9SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmIyYmIwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vZXhjZXB0aW9uL1JlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLmV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogdG8gaGFuZGxlIHNwZWNpYWwgY2FzZXMgaW4gVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGNsYXNzIFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uIGV4dGVuZHMgVmFsaWRhdG9yRXhjZXB0aW9uDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDY0NjMzMTczNjQyODQ5NTg4NEw7DQotDQotICAgIHB1YmxpYyBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihmYWNlc01lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihmYWNlc01lc3NhZ2UsIHRocm93YWJsZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYyNTEwYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY2VzTWVzc2FnZUZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeSBpbXBsZW1lbnRzIEZhY2VzTWVzc2FnZUZhY3RvcnkNCi17DQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2UgY29udmVydChGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBpZihpc0xhYmVsZWRGYWNlc01lc3NhZ2UoZmFjZXNNZXNzYWdlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZShmYWNlc01lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSwgZmFjZXNNZXNzYWdlLmdldFN1bW1hcnkoKSwgZmFjZXNNZXNzYWdlLmdldERldGFpbCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRmFjZXNNZXNzYWdlIGNyZWF0ZShGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFZpb2xhdGlvbk1lc3NhZ2Uoc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNMYWJlbGVkRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgdXNlIHRoZSBpbnRlcmZhY2UgaGVyZQ0KLSAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIFZpb2xhdGlvbk1lc3NhZ2U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0ZhY2VzTWVzc2FnZUhvbGRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0ZhY2VzTWVzc2FnZUhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzFjMzY3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9GYWNlc01lc3NhZ2VIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRmFjZXNNZXNzYWdlSG9sZGVyDQotew0KLSAgICBwcml2YXRlIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2U7DQotICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudElkOw0KLQ0KLSAgICBwdWJsaWMgRmFjZXNNZXNzYWdlSG9sZGVyKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmFjZXNNZXNzYWdlID0gZmFjZXNNZXNzYWdlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2VIb2xkZXIoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZhY2VzTWVzc2FnZSA9IGZhY2VzTWVzc2FnZTsNCi0gICAgICAgIHNldENsaWVudElkKGNsaWVudElkKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRmFjZXNNZXNzYWdlIGdldEZhY2VzTWVzc2FnZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjbGllbnRJZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGllbnRJZChTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIGlmKCEiKiIuZXF1YWxzKGNsaWVudElkKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmNsaWVudElkID0gY2xpZW50SWQ7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0xhYmVsZWRNZXNzYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvTGFiZWxlZE1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RmN2FlNy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvTGFiZWxlZE1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGRvbid0IHJlbW92ZSAqVGV4dCAtIGl0IHdvdWxkIGxlYWQgdG8gYW4gb3ZlcmxhcCB3aXRoIHRyaW5pZGFkDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBMYWJlbGVkTWVzc2FnZQ0KLXsNCi0gICAgU3RyaW5nIGdldExhYmVsVGV4dCgpOw0KLSAgICB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgbGFiZWwpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvVmlvbGF0aW9uTWVzc2FnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL1Zpb2xhdGlvbk1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk0NGM3Ni4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvVmlvbGF0aW9uTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBWaW9sYXRpb25NZXNzYWdlIGV4dGVuZHMgRmFjZXNNZXNzYWdlIGltcGxlbWVudHMgTGFiZWxlZE1lc3NhZ2UNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY5MDM5NTg5NDI5ODc3MTEyMzFMOw0KLSAgICBwcml2YXRlIFN0cmluZyBsYWJlbDsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHN1bW1hcnlMYWJlbFJlcGxhY2VkID0gZmFsc2U7DQotICAgIHByaXZhdGUgYm9vbGVhbiBkZXRhaWxMYWJlbFJlcGxhY2VkID0gZmFsc2U7DQotDQotICAgIHB1YmxpYyBWaW9sYXRpb25NZXNzYWdlKFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzKFNFVkVSSVRZX0VSUk9SLCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWaW9sYXRpb25NZXNzYWdlKFNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOw0KLSAgICAgICAgc2V0U3VtbWFyeShzdW1tYXJ5KTsNCi0gICAgICAgIHNldERldGFpbChkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxhYmVsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBnZXRTdW1tYXJ5KCkNCi0gICAgew0KLSAgICAgICAgaWYobGFiZWwgIT0gbnVsbCAmJiAhdGhpcy5zdW1tYXJ5TGFiZWxSZXBsYWNlZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXRTdW1tYXJ5KGdldExhYmVsZWRNZXNzc2FnZShzdXBlci5nZXRTdW1tYXJ5KCksIGdldExhYmVsVGV4dCgpKSk7DQotICAgICAgICAgICAgdGhpcy5zdW1tYXJ5TGFiZWxSZXBsYWNlZCA9IHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0U3VtbWFyeSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERldGFpbCgpDQotICAgIHsNCi0gICAgICAgIGlmKGxhYmVsICE9IG51bGwgJiYgIXRoaXMuZGV0YWlsTGFiZWxSZXBsYWNlZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXREZXRhaWwoZ2V0TGFiZWxlZE1lc3NzYWdlKHN1cGVyLmdldERldGFpbCgpLCBnZXRMYWJlbFRleHQoKSkpOw0KLSAgICAgICAgICAgIHRoaXMuZGV0YWlsTGFiZWxSZXBsYWNlZCA9IHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RGV0YWlsKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGFiZWxlZE1lc3NzYWdlKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UuY29udGFpbnMoInsiICsgaSArICJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCJ7IiArIGkgKyAifSIsIGxhYmVsKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgc2V0U3VtbWFyeShTdHJpbmcgcykNCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0U3VtbWFyeShzKTsNCi0gICAgICAgIHRoaXMuc3VtbWFyeUxhYmVsUmVwbGFjZWQgPSBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgc2V0RGV0YWlsKFN0cmluZyBzKQ0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXREZXRhaWwocyk7DQotICAgICAgICB0aGlzLmRldGFpbExhYmVsUmVwbGFjZWQgPSBmYWxzZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjM5NmQ0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7DQotDQotLyoqDQotICogTWVzc2FnZVJlc29sdmVyIHdoaWNoIHVzZXMgcHJvcGVydHkgZmlsZXMuDQotICogU3ViY2xhc3NlcyBqdXN0IGhhdmUgdG8gcHJvdmlkZSB0aGUgcGFja2FnZSB0byBsb29rIGF0Lg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIGNhbiBhbHNvIHByb3ZpZGUgYSBjdXN0b20gbmFtZSB3aGljaCBpcyBlLmcuIGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciBpbXBsZW1lbnRzIE1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIgPSAiPz8/IjsNCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0RFRkFVTFRfQ09OVkVOVElPTjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZGVmYXVsdEJ1bmRsZSA9IG51bGw7DQotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VCdW5kbGVCYXNlTmFtZTsNCi0gICAgLy93aXRoIGpzZiAxLjEgb25seSBhdmFpbGFibGUgaWYgdGhlcmUgaXMgYSBjdXN0b20gYmVhbg0KLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlQnVuZGxlVmFyTmFtZTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGtleSA9PSBudWxsIHx8IGtleS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoa2V5LmNvbnRhaW5zKCIgIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoa2V5LmVuZHNXaXRoKCJfZGV0YWlsIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKDAsIGtleS5sZW5ndGgoKSAtIDcpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4ga2V5Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIGN1c3RvbU1lc3NhZ2UgPSBudWxsOw0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHRyeVRvRmluZEN1c3RvbU1lc3NhZ2Uoa2V5LCBsb2NhbGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGN1c3RvbU1lc3NhZ2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qDQotICAgICAgICAgKiB0cnkgdG8gdXNlIHRoZSBjb252ZW50aW9uIGZvciB0aGUgbWVzc2FnZSBidW5kbGUNCi0gICAgICAgICAqLw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHRyeVRvVXNlTWVzc2FnZUJ1bmRsZUNvbnZlbnRpb24oa2V5LCBsb2NhbGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGN1c3RvbU1lc3NhZ2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qDQotICAgICAgICAgKiBubyBtZXNzYWdlIGJ1bmRsZSBvciBtZXNzYWdlIGZvdW5kICh3aXRoIHRoZSBjb252ZW50aW9uKT8NCi0gICAgICAgICAqLw0KLQ0KLSAgICAgICAgLy90cnkgdG8gbG9hZCBjdXN0b20gbWVzc2FnZXMNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSB0cnlUb0ZpbmRDdXN0b21NZXNzYWdlSW5DdXN0b21SZXNvdXJjZUJ1bmRsZShrZXksIGxvY2FsZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBkZXRlcm1pbmVNZXNzYWdlKGtleSwgbG9jYWxlLCBjdXN0b21NZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb0ZpbmRDdXN0b21NZXNzYWdlKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOw0KLSAgICAgICAgU3RyaW5nIGN1c3RvbU1lc3NhZ2UgPSBudWxsOw0KLQ0KLSAgICAgICAgLy9vbmx5IGluIGNhc2Ugb2YgYSBWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggaXMgY29uZmlndXJlZCBhcyBiZWFuDQotICAgICAgICBpZiAodGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSh0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSwgbG9jYWxlKTsNCi0gICAgICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm1lc3NhZ2UgYnVuZGxlICIgKyB0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSArICIgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvL29ubHkgaW4gY2FzZSBvZiBhIFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciB3aGljaCBpcyBjb25maWd1cmVkIGFzIGJlYW4NCi0gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VCdW5kbGVWYXJOYW1lICE9IG51bGwgJiYgY3VzdG9tTWVzc2FnZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gKFJlc291cmNlQnVuZGxlKSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4obWVzc2FnZUJ1bmRsZVZhck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigibWVzc2FnZSBidW5kbGUgdmFyIG5hbWUgIiArIHRoaXMubWVzc2FnZUJ1bmRsZVZhck5hbWUgKyAiIG5vdCBmb3VuZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHJ5VG9Vc2VNZXNzYWdlQnVuZGxlQ29udmVudGlvbihTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICBpZiAoKGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbiA9PSBudWxsIHx8ICFkZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb24uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgICAgICYmIGlzRGVmYXVsdE1lc3NhZ2VCdW5kbGVDb252ZW50aW9uQWN0aXZlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGRlZmF1bHRCdW5kbGUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0QnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FU1NBR0VfQlVORExFX05BTUUpLCBsb2NhbGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nDQotICAgICAgICAgICAgICAgICAgICBkZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb24gPSAidHJ1ZSI7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGRlZmF1bHRCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0QnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvRmluZEN1c3RvbU1lc3NhZ2VJbkN1c3RvbVJlc291cmNlQnVuZGxlKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0gdHJ5VG9Mb2FkQ3VzdG9tUmVzb3VyY2VCdW5kbGUobG9jYWxlKTsNCi0NCi0gICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyBjdXN0b20gbWVzc2FnZSBmb3IgIiArIGtleSArICIgd2l0aGluICIgKyBnZXRDdXN0b21CYXNlTmFtZSgpLCBlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgUmVzb3VyY2VCdW5kbGUgdHJ5VG9Mb2FkQ3VzdG9tUmVzb3VyY2VCdW5kbGUoTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1c3RvbUJhc2VOYW1lID0gZ2V0Q3VzdG9tQmFzZU5hbWUoKTsNCi0NCi0gICAgICAgIGlmKGN1c3RvbUJhc2VOYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShjdXN0b21CYXNlTmFtZSwgbG9jYWxlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGRldGVybWluZU1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSwgU3RyaW5nIGN1c3RvbU1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIC8vdXNlIGN1c3RvbSBuYW1lIChpZiBwb3NzaWJsZSkgb3RoZXJ3aXNlOiBmYWxsYmFjayB0byBkZWZhdWx0IG1lc3NhZ2UgKGlmIHBvc3NpYmxlKQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChjdXN0b21NZXNzYWdlICE9IG51bGwpID8gY3VzdG9tTWVzc2FnZQ0KLSAgICAgICAgICAgICAgICAgICAgOiAoZ2V0QmFzZU5hbWUoKSAhPSBudWxsKSA/IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShnZXRCYXNlTmFtZSgpLCBsb2NhbGUpLmdldFN0cmluZyhrZXkpIDogbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIgKyBrZXkgKyBNSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlZmF1bHRNZXNzYWdlQnVuZGxlQ29udmVudGlvbkFjdGl2ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0QmFzZU5hbWUoKTsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21CYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VCdW5kbGVCYXNlTmFtZShTdHJpbmcgbWVzc2FnZUJ1bmRsZUJhc2VOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSA9IG1lc3NhZ2VCdW5kbGVCYXNlTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlQnVuZGxlVmFyTmFtZShTdHJpbmcgbWVzc2FnZUJ1bmRsZVZhck5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZUJ1bmRsZVZhck5hbWUgPSBtZXNzYWdlQnVuZGxlVmFyTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODE4MDM3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBGYWN0b3J5IHdoaWNoIGNyZWF0ZXMgYSBNZXNzYWdlUmVzb2x2ZXIgZm9yIGEgZ2l2ZW4gVmFsaWRhdGlvblN0cmF0ZWd5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdlbmVyaWMgamF2YSBhcGkgKGRlLS9yZWdpc3RlciBtYXBwaW5nKSIpDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLSAgICAgICAgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWVzc2FnZVJlc29sdmVyPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZzsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZVJlc29sdmVyIGNyZWF0ZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgc3RyYXRlZ3lOYW1lID0gUHJveHlVdGlscy5nZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkpOw0KLQ0KLSAgICAgICAgaWYgKHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRTdGF0aWNNYXBwaW5ncygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZy5jb250YWluc0tleShzdHJhdGVneU5hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoTWVzc2FnZVJlc29sdmVyKSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgIC50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZy5nZXQoc3RyYXRlZ3lOYW1lKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOw0KLSAgICAgICAgU3RyaW5nIHJlc29sdmVyTmFtZTsNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IG5hbWVNYXBwZXIgOiBuYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2J1aWxkIGNvbnZlbnRpb24gKFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcikNCi0gICAgICAgICAgICByZXNvbHZlck5hbWUgPSBuYW1lTWFwcGVyLmNyZWF0ZU5hbWUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAvL25hbWUgd2Fzbid0IG1hcHBlZA0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlck5hbWUgPT0gbnVsbCB8fCBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSkuZXF1YWxzKHJlc29sdmVyTmFtZSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgbWVzc2FnZVJlc29sdmVyID0gKE1lc3NhZ2VSZXNvbHZlcikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHJlc29sdmVyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKG1lc3NhZ2VSZXNvbHZlciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyhzdHJhdGVneU5hbWUsIHJlc29sdmVyTmFtZSk7DQotDQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UocmVzb2x2ZXJOYW1lICsgIiB1c2VkIGZvciAiICsgc3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZVJlc29sdmVyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGFkZE1hcHBpbmcoc3RyYXRlZ3lOYW1lLCBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgLy9zZXR1cCBpbnRlcm5hbCBzdGF0aWMgbWFwcGluZ3MNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnIDoNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0dXBNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBNYXBwaW5ncyhMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsU3RyaW5nPj4gbWFwcGluZ3MpDQotICAgIHsNCi0gICAgICAgIGZvcihTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IG1hcHBpbmcgOiBtYXBwaW5ncykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNYXBwaW5nKG1hcHBpbmcuZ2V0U291cmNlKCksIG1hcHBpbmcuZ2V0VGFyZ2V0KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgbWVzc2FnZVJlc29sdmVyTmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZGRpbmcgc3RhdGljIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWVzc2FnZSByZXNvbHZlciBtYXBwaW5nOiAiDQotICAgICAgICAgICAgICAgICsgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArICIgLT4gIiArIG1lc3NhZ2VSZXNvbHZlck5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLnB1dCh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBtZXNzYWdlUmVzb2x2ZXJOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IGdldE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5hbWVNYXBwZXJMaXN0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzllZGM2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IE1lc3NhZ2VSZXNvbHZlciB3aGljaCB1c2VzIHRoZSBkZWZhdWx0IGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gbWVzc2FnZSBidW5kbGUgdmlhIHdlYi54bWwNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CVU5ETEUgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FU1NBR0VfQlVORExFOw0KLQ0KLSAgICAvL25vdCB1c2VkIGF0IHRoZSBtb21lbnQgLSBqdXN0IGZvciBhIGNvbnZlbnRpb24NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNb2R1bGVNZXNzYWdlQnVuZGxlTmFtZShnZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tQmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ1VTVE9NX0JVTkRMRTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjY2ExYzEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL01lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBNZXNzYWdlUmVzb2x2ZXJzIGluZGVwZW5kZW50IG9mIHRoZSBtZXNzYWdlIHNvdXJjZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkNDBiNi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmMwOGU4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1lc3NhZ2VSZXNvbHZlcnMuDQotICogKGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDNjMDEzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgVmFsaWRhdGlvblN0cmF0ZWd5IHRvIE1lc3NhZ2VSZXNvbHZlci4NCi0gKiAoY29uZmlndXJlZCB2aWEgaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbikNCi0gKiBUaGUgYmVhbiBwcm92aWRlcyB0aGUgZGVmYXVsdCBuYW1lIChjb252ZW50aW9uKS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gZnVsbCBxdWFsaWZpZWQgbmFtZS4gKD0gY3VzdG9taXphYmxlIGNvbnZlbnRpb24pDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTVNHX1JFU09MVkVSX05BTUVfTUFQUEVSKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGViYjRkNi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIHByb3ZpZGUgYSBOYW1lTWFwcGVyIHBlciB2YWxpZGF0aW9uIG1vZHVsZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMzEwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBzdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGE0NzdiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFwcyBFeHRWYWwgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gRXh0VmFsIE1lc3NhZ2VSZXNvbHZlcnMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MgPSBQcm94eVV0aWxzDQotICAgICAgICAgICAgICAgIC5nZXRVbnByb3hpZWRDbGFzcyh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKTsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKHN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2M2Q5NzAuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciB0byBwbGFjZSBWYWxpZGF0aW9uU3RyYXRlZ2llcyBhbmQgTWVzc2FnZVJlc29sdmVycyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcig0MDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VzdG9tUG9zdGZpeCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYKTsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoc3RyYXRlZ3lDbGFzc05hbWUsIGN1c3RvbVBvc3RmaXgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDM4ZjU0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljQXJyYXlUeXBlOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5XaWxkY2FyZFR5cGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBleHRyYWN0QnlJZChhbm5vdGF0aW9uLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZXh0cmFjdEJ5SWQoYW5ub3RhdGlvbiwga2V5LCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgPFQ+IExpc3Q8VD4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGV4dHJhY3RCeUlkKGFubm90YXRpb24sIGtleSwgdmFsdWVUeXBlLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgPFQ+IFQgZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxUPiByZXN1bHRzID0gZXh0cmFjdEJ5SWQoYW5ub3RhdGlvbiwga2V5LCB2YWx1ZVR5cGUsIHZhbHVlSWQpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0cy5pdGVyYXRvcigpLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0cy5pdGVyYXRvcigpLm5leHQoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyA8VD4gTGlzdDxUPiBleHRyYWN0QnlJZChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxPYmplY3Q+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KLQ0KLSAgICAgICAgZm9yKE9iamVjdCBlbnRyeSA6IGV4dHJhY3RCeUlkKGFubm90YXRpb24sIGtleSwgdmFsdWVJZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodmFsdWVUeXBlLmlzQXNzaWduYWJsZUZyb20oZW50cnkuZ2V0Q2xhc3MoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKExpc3Q8VD4pcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZXh0cmFjdEJ5SWQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzcyB2YWx1ZUlkKQ0KLSAgICB7DQotICAgICAgICBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+IGZ1bGxSZXN1bHQgPSBleHRyYWN0QnlJZChhbm5vdGF0aW9uLCB2YWx1ZUlkKTsNCi0NCi0gICAgICAgIGlmKGZ1bGxSZXN1bHQuY29udGFpbnNLZXkoa2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZnVsbFJlc3VsdC5nZXQoa2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIHdlYi54bWwgcGFyYW1ldGVyIGZvciBwZXJmb3JtYW5jZSB0dW5pbmcgdG8gZGVhY3RpdmF0ZSB0aGUgc2NhbiIpDQotICAgIHB1YmxpYyBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+IGV4dHJhY3RCeUlkKEFubm90YXRpb24gYW5ub3RhdGlvbiwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4oKTsNCi0NCi0gICAgICAgIGZvcihNZXRob2QgY3VycmVudEFubm90YXRpb25BdHRyaWJ1dGUgOiBhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0RGVjbGFyZWRNZXRob2RzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZighaXNWYWxpZGF0aW9uUGFyYW1ldGVyKGN1cnJlbnRBbm5vdGF0aW9uQXR0cmlidXRlLmdldEdlbmVyaWNSZXR1cm5UeXBlKCkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBPYmplY3QgcGFyYW1ldGVyVmFsdWUgPSBjdXJyZW50QW5ub3RhdGlvbkF0dHJpYnV0ZS5pbnZva2UoYW5ub3RhdGlvbik7DQotDQotICAgICAgICAgICAgICAgIGlmKHBhcmFtZXRlclZhbHVlIGluc3RhbmNlb2YgQ2xhc3NbXSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRQYXJhbWV0ZXJWYWx1ZSA6IChDbGFzc1tdKXBhcmFtZXRlclZhbHVlKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8va2VlcCBjaGVjayBzbyB0aGF0IGZvbGxvd2luZyBpcyB0cnVlOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBmb3VuZCB3aGljaCB0ZWxscyB0aGF0IGl0IGlzbid0IGEgYmxvY2tpbmcgZXJyb3IsIGxldCBpdCBwYXNzDQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1BhcmFtZXRlclZhbHVlKGFubm90YXRpb24sIGN1cnJlbnRQYXJhbWV0ZXJWYWx1ZSwgcmVzdWx0LCB2YWx1ZUlkKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKHBhcmFtZXRlclZhbHVlIGluc3RhbmNlb2YgQ2xhc3MpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8va2VlcCBjaGVjayBzbyB0aGF0IGZvbGxvd2luZyBpcyB0cnVlOg0KLSAgICAgICAgICAgICAgICAgICAgLy9pZiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIGZvdW5kIHdoaWNoIHRlbGxzIHRoYXQgaXQgaXNuJ3QgYSBibG9ja2luZyBlcnJvciwgbGV0IGl0IHBhc3MNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQYXJhbWV0ZXJWYWx1ZShhbm5vdGF0aW9uLCAoQ2xhc3MpcGFyYW1ldGVyVmFsdWUsIHJlc3VsdCwgdmFsdWVJZCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBkb24ndCB1c2UgdGhlIEludHJvc3BlY3RvciBpbiB0aGlzIGNhc2UNCi0gICAgICogaWYgeW91IGhhdmUgYSBiZXR0ZXIgc29sdXRpb24gd2hpY2ggc3VwcG9ydHMgYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXIgc3R5bGVzIChzZWUgZXh0dmFsIHdpa2kpLA0KLSAgICAgKiB5b3UgY2FuIGltcGwuIGl0IGFuZCB1c2UgaXQgKGV4Y2hhbmdlIHRoZSBpbXBscy4gdmlhIHRoZSBFeHRWYWxDb250ZXh0KS4NCi0gICAgICogZnVydGhlcm1vcmUsIHlvdSBjYW4gcHJvdmlkZSB0aGUgZml4IGZvciB0aGUgY29tbXVuaXR5DQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1BhcmFtZXRlclZhbHVlKA0KLSAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiwgQ2xhc3MgcGFyYW1DbGFzcywgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiByZXN1bHQsIENsYXNzIHZhbHVlSWQpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGtleSA9IG51bGw7DQotICAgICAgICBMaXN0PE9iamVjdD4gcGFyYW1ldGVyVmFsdWVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7DQotDQotICAgICAgICBpZihWYWxpZGF0aW9uUGFyYW1ldGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocGFyYW1DbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgTGlzdDxGaWVsZD4gcHJvY2Vzc2VkRmllbGRzID0gbmV3IEFycmF5TGlzdDxGaWVsZD4oKTsNCi0gICAgICAgICAgICBMaXN0PE1ldGhvZD4gcHJvY2Vzc2VkTWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kPigpOw0KLQ0KLSAgICAgICAgICAgIENsYXNzIGN1cnJlbnRQYXJhbUNsYXNzID0gcGFyYW1DbGFzczsNCi0gICAgICAgICAgICB3aGlsZSAoY3VycmVudFBhcmFtQ2xhc3MgIT0gbnVsbCAmJiAhT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY3VycmVudFBhcmFtQ2xhc3MuZ2V0TmFtZSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICAgICAqIHByb2Nlc3MgY2xhc3MNCi0gICAgICAgICAgICAgICAgICovDQotICAgICAgICAgICAgICAgIC8vc3VwcG9ydCBwdXJlIGludGVyZmFjZSBhcHByb2FjaCBlLmcuIFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MNCi0gICAgICAgICAgICAgICAgZm9yKEZpZWxkIGN1cnJlbnRGaWVsZCA6IGN1cnJlbnRQYXJhbUNsYXNzLmdldERlY2xhcmVkRmllbGRzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFwcm9jZXNzZWRGaWVsZHMuY29udGFpbnMoY3VycmVudEZpZWxkKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBwcm9jZXNzRm91bmRGaWVsZChhbm5vdGF0aW9uLCBjdXJyZW50RmllbGQsIHBhcmFtZXRlclZhbHVlcywga2V5LCB2YWx1ZUlkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRGaWVsZHMuYWRkKGN1cnJlbnRGaWVsZCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgLy9pbnNwZWN0IHRoZSBvdGhlciBtZXRob2RzIG9mIHRoZSBpbXBsZW1lbnRpbmcgY2xhc3MNCi0gICAgICAgICAgICAgICAgZm9yKE1ldGhvZCBjdXJyZW50TWV0aG9kIDogY3VycmVudFBhcmFtQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFwcm9jZXNzZWRNZXRob2RzLmNvbnRhaW5zKGN1cnJlbnRNZXRob2QpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHByb2Nlc3NGb3VuZE1ldGhvZChjdXJyZW50UGFyYW1DbGFzcywgY3VycmVudE1ldGhvZCwgcGFyYW1ldGVyVmFsdWVzLCBrZXksIHZhbHVlSWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZE1ldGhvZHMuYWRkKGN1cnJlbnRNZXRob2QpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICAgICAqIHByb2Nlc3MgaW50ZXJmYWNlcw0KLSAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRJbnRlcmZhY2UgOiBjdXJyZW50UGFyYW1DbGFzcy5nZXRJbnRlcmZhY2VzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFWYWxpZGF0aW9uUGFyYW1ldGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY3VycmVudEludGVyZmFjZSkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAvL3N1cHBvcnQgaW50ZXJmYWNlICsgaW1wbC4gYXBwcm9hY2ggZS5nLiBNeVBhcmFtSW1wbC5jbGFzcw0KLSAgICAgICAgICAgICAgICAgICAgLy8oTXlQYXJhbUltcGwgaW1wbGVtZW50cyBNeVBhcmFtDQotICAgICAgICAgICAgICAgICAgICAvL015UGFyYW0gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotICAgICAgICAgICAgICAgICAgICAvL21ldGhvZHMgaW4gdGhlIGludGVyZmFjZSBoYXZlIHRvIGJlIG1hcmtlZCB3aXRoIEBQYXJhbWV0ZXJWYWx1ZSBhbmQgQFBhcmFtZXRlcktleQ0KLSAgICAgICAgICAgICAgICAgICAgZm9yKE1ldGhvZCBjdXJyZW50TWV0aG9kIDogY3VycmVudEludGVyZmFjZS5nZXREZWNsYXJlZE1ldGhvZHMoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZighcHJvY2Vzc2VkTWV0aG9kcy5jb250YWlucyhjdXJyZW50TWV0aG9kKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHByb2Nlc3NGb3VuZE1ldGhvZChjdXJyZW50UGFyYW1DbGFzcywgY3VycmVudE1ldGhvZCwgcGFyYW1ldGVyVmFsdWVzLCBrZXksIHZhbHVlSWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRNZXRob2RzLmFkZChjdXJyZW50TWV0aG9kKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBmb3IoRmllbGQgY3VycmVudEZpZWxkIDogY3VycmVudEludGVyZmFjZS5nZXREZWNsYXJlZEZpZWxkcygpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwcm9jZXNzZWRGaWVsZHMuY29udGFpbnMoY3VycmVudEZpZWxkKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHByb2Nlc3NGb3VuZEZpZWxkKGFubm90YXRpb24sIGN1cnJlbnRGaWVsZCwgcGFyYW1ldGVyVmFsdWVzLCBrZXksIHZhbHVlSWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRGaWVsZHMuYWRkKGN1cnJlbnRGaWVsZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGN1cnJlbnRQYXJhbUNsYXNzID0gY3VycmVudFBhcmFtQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGtleSA9IGNyZWF0ZURlZmF1bHRLZXkoa2V5LCBwYXJhbUNsYXNzKTsNCi0NCi0gICAgICAgIGlmKHBhcmFtZXRlclZhbHVlcy5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9AUGFyYW1ldGVyVmFsdWUgaXMgb3B0aW9uYWwgYXMgd2VsbA0KLSAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlcy5hZGQoa2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHJlc3VsdC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5nZXQoa2V5KS5hZGRBbGwocGFyYW1ldGVyVmFsdWVzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQucHV0KGtleSwgcGFyYW1ldGVyVmFsdWVzKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBjcmVhdGVEZWZhdWx0S2V5KE9iamVjdCBrZXksIENsYXNzIGN1cnJlbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYoa2V5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9jaGVjayBmb3Igc3VwZXItaW50ZXJmYWNlIChleGNsdWRlIFZhbGlkYXRpb25QYXJhbWV0ZXIgaXRzZWxmKQ0KLSAgICAgICAgICAgIGZvcihDbGFzcyBpbnRlcmZhY2VDbGFzcyA6IGN1cnJlbnRDbGFzcy5nZXRJbnRlcmZhY2VzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihWYWxpZGF0aW9uUGFyYW1ldGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaW50ZXJmYWNlQ2xhc3MpICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgKCFpbnRlcmZhY2VDbGFzcy5nZXROYW1lKCkuZXF1YWxzKFZhbGlkYXRpb25QYXJhbWV0ZXIuY2xhc3MuZ2V0TmFtZSgpKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGtleSA9IGludGVyZmFjZUNsYXNzOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZihrZXkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBrZXkgPSBjdXJyZW50Q2xhc3M7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4ga2V5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IHByb2Nlc3NGb3VuZEZpZWxkKA0KLSAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZSwgRmllbGQgY3VycmVudEZpZWxkLCBMaXN0PE9iamVjdD4gcGFyYW1WYWx1ZXMsIE9iamVjdCBrZXksIENsYXNzIHZhbHVlSWQpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBuZXdLZXkgPSBudWxsOw0KLSAgICAgICAgaWYoa2V5ID09IG51bGwgJiYgY3VycmVudEZpZWxkLmlzQW5ub3RhdGlvblByZXNlbnQoUGFyYW1ldGVyS2V5LmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG5ld0tleSA9IGN1cnJlbnRGaWVsZC5nZXQoaW5zdGFuY2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICAvL25vICJlbHNlIGlmIiB0byBhbGxvdyBib3RoIGF0IG9uZSBmaWVsZA0KLSAgICAgICAgaWYoY3VycmVudEZpZWxkLmlzQW5ub3RhdGlvblByZXNlbnQoUGFyYW1ldGVyVmFsdWUuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbHVlSWQgPT0gbnVsbCB8fCB2YWx1ZUlkLmVxdWFscyhjdXJyZW50RmllbGQuZ2V0QW5ub3RhdGlvbihQYXJhbWV0ZXJWYWx1ZS5jbGFzcykuaWQoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50RmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtVmFsdWVzLmFkZChjdXJyZW50RmllbGQuZ2V0KGluc3RhbmNlKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXdLZXkgIT0gbnVsbCA/IG5ld0tleSA6IGtleTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBwcm9jZXNzRm91bmRNZXRob2QoDQotICAgICAgICAgICAgQ2xhc3MgcGFyYW1DbGFzcywgTWV0aG9kIGN1cnJlbnRNZXRob2QsIExpc3Q8T2JqZWN0PiBwYXJhbWV0ZXJWYWx1ZXMsIE9iamVjdCBrZXksIENsYXNzIHZhbHVlSWQpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBuZXdLZXkgPSBudWxsOw0KLSAgICAgICAgaWYoa2V5ID09IG51bGwgJiYgY3VycmVudE1ldGhvZC5pc0Fubm90YXRpb25QcmVzZW50KFBhcmFtZXRlcktleS5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZighKE1vZGlmaWVyLmlzQWJzdHJhY3QocGFyYW1DbGFzcy5nZXRNb2RpZmllcnMoKSkgfHwgTW9kaWZpZXIuaXNJbnRlcmZhY2UocGFyYW1DbGFzcy5nZXRNb2RpZmllcnMoKSkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBuZXdLZXkgPSBjdXJyZW50TWV0aG9kLmludm9rZShwYXJhbUNsYXNzLm5ld0luc3RhbmNlKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIC8vbm8gImVsc2UgaWYiIHRvIGFsbG93IGJvdGggYXQgb25lIGZpZWxkDQotICAgICAgICBpZihjdXJyZW50TWV0aG9kLmlzQW5ub3RhdGlvblByZXNlbnQoUGFyYW1ldGVyVmFsdWUuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbHVlSWQgPT0gbnVsbCB8fCB2YWx1ZUlkLmVxdWFscyhjdXJyZW50TWV0aG9kLmdldEFubm90YXRpb24oUGFyYW1ldGVyVmFsdWUuY2xhc3MpLmlkKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudE1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOw0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWVzLmFkZChjdXJyZW50TWV0aG9kLmludm9rZShwYXJhbUNsYXNzLm5ld0luc3RhbmNlKCkpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgaXQncyBhIG5vbmUtc3RhdGljIGlubmVyIGNsYXNzIC0+IHJldHVybiB0aGlzIGNsYXNzDQotICAgICAgICAgICAgICAgICAgICBpZihwYXJhbUNsYXNzLmdldEVuY2xvc2luZ0NsYXNzKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJWYWx1ZXMuYWRkKHBhcmFtQ2xhc3MpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXdLZXkgIT0gbnVsbCA/IG5ld0tleSA6IGtleTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZGF0aW9uUGFyYW1ldGVyKFR5cGUgZ2VuZXJpY1JldHVyblR5cGUpDQotICAgIHsNCi0gICAgICAgIGlmKGdlbmVyaWNSZXR1cm5UeXBlIGluc3RhbmNlb2YgR2VuZXJpY0FycmF5VHlwZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZigoKEdlbmVyaWNBcnJheVR5cGUpZ2VuZXJpY1JldHVyblR5cGUpLmdldEdlbmVyaWNDb21wb25lbnRUeXBlKCkgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBhbmFseXplUGFyYW1ldGVyaXplZFR5cGUoDQotICAgICAgICAgICAgICAgICAgICAgICAgKFBhcmFtZXRlcml6ZWRUeXBlKSgoR2VuZXJpY0FycmF5VHlwZSlnZW5lcmljUmV0dXJuVHlwZSkuZ2V0R2VuZXJpY0NvbXBvbmVudFR5cGUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihnZW5lcmljUmV0dXJuVHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhbmFseXplUGFyYW1ldGVyaXplZFR5cGUoDQotICAgICAgICAgICAgICAgICAgICAoUGFyYW1ldGVyaXplZFR5cGUpZ2VuZXJpY1JldHVyblR5cGUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBhbmFseXplUGFyYW1ldGVyaXplZFR5cGUoUGFyYW1ldGVyaXplZFR5cGUgcGFyYW1ldGVyaXplZFR5cGUpDQotICAgIHsNCi0gICAgICAgIGZvcihUeXBlIHR5cGUgOiBwYXJhbWV0ZXJpemVkVHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodHlwZSBpbnN0YW5jZW9mIFdpbGRjYXJkVHlwZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZvcihUeXBlIHVwcGVyQm91bmRzIDogKChXaWxkY2FyZFR5cGUpdHlwZSkuZ2V0VXBwZXJCb3VuZHMoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYodXBwZXJCb3VuZHMgaW5zdGFuY2VvZiBDbGFzcyAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZvciBhdHRyaWJ1dGVzIGxpa2U6IENsYXNzPD8gZXh0ZW5kcyBJbmhlcml0ZWRGcm9tVmFsaWRhdGlvblBhcmFtZXRlcj4gdmFsdWUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblBhcmFtZXRlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKChDbGFzcyl1cHBlckJvdW5kcykpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyYTczYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5IGltcGxlbWVudHMgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkNCi17DQotICAgIHByaXZhdGUgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBjcmVhdGUoKQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUik7DQotICAgICAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckNsYXNzTmFtZXMNCi0gICAgICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUikpOw0KLSAgICAgICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JDbGFzc05hbWVzKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciA9IChWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSh2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjcmVhdGVkIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjdhZTkzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBtYXBzIGludGVybmFsIHBhcmFtZXRlcnMgdG8gb3B0aW9uYWxseSBhdmFpbGFibGUgY3VzdG9tIHBhcmFtZXRlcnMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeSBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8Q2xhc3MsIENsYXNzPg0KLXsNCi0gICAgcHJpdmF0ZSBNYXA8Q2xhc3MsIENsYXNzPiBwYXJhbWV0ZXJNYXBwaW5nID0gbmV3IEhhc2hNYXA8Q2xhc3MsIENsYXNzPigpOw0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgY3JlYXRlKENsYXNzIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHRoaXMucGFyYW1ldGVyTWFwcGluZy5jb250YWluc0tleShzb3VyY2UpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmFtZXRlck1hcHBpbmcuZ2V0KHNvdXJjZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBDbGFzcyByZXN1bHQ7DQotDQotICAgICAgICAvL2l0J3MgaW1wb3J0YW50IHRvIGxvb2sgZm9yIHRoZSBzdGF0aWMgY29uZmlncyBmaXJzdCAtIGdsb2JhbCBwYXJhbWV0ZXJzIGFyZSB1c2VkIGludGVybmFsbHkNCi0gICAgICAgIHJlc3VsdCA9IHRyeVRvRmluZFN0YXRpY0NvbmZpZyhzb3VyY2UpOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHRyeVRvRmluZEdsb2JhbFBhcmFtZXRlcihzb3VyY2UpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHNvdXJjZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGNhY2hlTWFwcGluZyhzb3VyY2UsIHJlc3VsdCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3MgdHJ5VG9GaW5kR2xvYmFsUGFyYW1ldGVyKENsYXNzIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IHRhcmdldCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KHNvdXJjZS5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIENsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoQ2xhc3MpIHRhcmdldDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3MgdHJ5VG9GaW5kU3RhdGljQ29uZmlnKENsYXNzIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgcmVzdWx0ID0gbnVsbDsNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gY29uZmlnIDogRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlZBTElEQVRJT05fUEFSQU1FVEVSX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gdHJ5VG9NYXAoc291cmNlLCBjb25maWcuZ2V0TWFwcGluZygpKTsNCi0NCi0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3MgdHJ5VG9NYXAoQ2xhc3Mgc291cmNlLCBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmcpDQotICAgIHsNCi0gICAgICAgIENsYXNzIHRhcmdldCA9IG51bGw7DQotDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBtYXBwaW5nKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscyhlbnRyeS5nZXRTb3VyY2UoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0YXJnZXQgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShlbnRyeS5nZXRUYXJnZXQoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdGFyZ2V0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjYWNoZU1hcHBpbmcoQ2xhc3Mgc291cmNlLCBDbGFzcyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFyYW1ldGVyTWFwcGluZy5wdXQoc291cmNlLCB0YXJnZXQpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjZjN2YxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogbWVjaGFuaXNtIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBleHR2YWwNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGltcGxlbWVudHMgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcg0KLXsNCi0gICAgcHVibGljIGJvb2xlYW4gc2V2ZXJpdHlCbG9ja3NOYXZpZ2F0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IuZXF1YWxzKHNldmVyaXR5KSB8fCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUwuZXF1YWxzKHNldmVyaXR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXZlcml0eUNhdXNlc1ZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLmVxdWFscyhzZXZlcml0eSkgfHwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMLmVxdWFscyhzZXZlcml0eSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gc2V2ZXJpdHlDYXVzZXNWaW9sYXRpb25NZXNzYWdlKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHNldmVyaXR5QmxvY2tzU3VibWl0KA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IuZXF1YWxzKHNldmVyaXR5KSB8fCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUwuZXF1YWxzKHNldmVyaXR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXZlcml0eVNob3dzSW5kaWNhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLmVxdWFscyhzZXZlcml0eSkgfHwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMLmVxdWFscyhzZXZlcml0eSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwMDg2Yi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotew0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9QYXJhbWV0ZXJLZXkuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlcktleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzAyYmJhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlcktleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUYXJnZXQoe0ZJRUxELCBNRVRIT0R9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBQYXJhbWV0ZXJLZXkNCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlclZhbHVlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9QYXJhbWV0ZXJWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmRjOGYzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlclZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRhcmdldCh7RklFTEQsIE1FVEhPRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFBhcmFtZXRlclZhbHVlDQotew0KLSAgICBDbGFzcyBpZCgpIGRlZmF1bHQgUGFyYW1ldGVyVmFsdWUuY2xhc3M7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE1OWM3Ni4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvblBhcmFtZXRlcg0KLXsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjA5OTAyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvcg0KLXsNCi0gICAgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbik7DQotICAgIExpc3Q8T2JqZWN0PiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSk7DQotICAgIDxUPiBMaXN0PFQ+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzczxUPiB2YWx1ZVR5cGUpOw0KLSAgICA8VD4gVCBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSwgQ2xhc3M8VD4gdmFsdWVUeXBlLCBDbGFzcyB2YWx1ZUlkKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkY2RkZDIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeQ0KLXsNCi0gICAgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBjcmVhdGUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1Zpb2xhdGlvblNldmVyaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMjg4N2MuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZpb2xhdGlvblNldmVyaXR5DQotew0KLSAgICBpbnRlcmZhY2UgSW5mbyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi0gICAgew0KLSAgICAgICAgQFBhcmFtZXRlcktleQ0KLSAgICAgICAgcHVibGljIENsYXNzIEtFWSA9IFZpb2xhdGlvblNldmVyaXR5LmNsYXNzOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgcHVibGljIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBTRVZFUklUWSA9IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9JTkZPOw0KLQ0KLSAgICAgICAgLy9AUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIC8vTWVzc2FnZVR5cGUgcG9zdGZpeCA9IE1lc3NhZ2VUeXBlLklORk87DQotICAgIH0NCi0NCi0gICAgaW50ZXJmYWNlIFdhcm4gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotICAgIHsNCi0gICAgICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgICAgIHB1YmxpYyBDbGFzcyBLRVkgPSBWaW9sYXRpb25TZXZlcml0eS5jbGFzczsNCi0NCi0gICAgICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFNFVkVSSVRZID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk47DQotDQotICAgICAgICAvL0BQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgLy9NZXNzYWdlVHlwZSBwb3N0Zml4ID0gTWVzc2FnZVR5cGUuV0FSTjsNCi0gICAgfQ0KLQ0KLSAgICBpbnRlcmZhY2UgRXJyb3IgZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotICAgIHsNCi0gICAgICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgICAgIHB1YmxpYyBDbGFzcyBLRVkgPSBWaW9sYXRpb25TZXZlcml0eS5jbGFzczsNCi0NCi0gICAgICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFNFVkVSSVRZID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SOw0KLQ0KLSAgICAgICAgLy9AUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIC8vTWVzc2FnZVR5cGUgcG9zdGZpeCA9IE1lc3NhZ2VUeXBlLkVSUk9SOw0KLSAgICB9DQotDQotICAgIGludGVyZmFjZSBGYXRhbCBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi0gICAgew0KLSAgICAgICAgQFBhcmFtZXRlcktleQ0KLSAgICAgICAgcHVibGljIENsYXNzIEtFWSA9IFZpb2xhdGlvblNldmVyaXR5LmNsYXNzOw0KLQ0KLSAgICAgICAgQFBhcmFtZXRlclZhbHVlDQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgU0VWRVJJVFkgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUw7DQotDQotICAgICAgICAvL0BQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgLy9NZXNzYWdlVHlwZSBwb3N0Zml4ID0gTWVzc2FnZVR5cGUuRkFUQUw7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzZiZDk0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1Zpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBtZWNoYW5pc20gdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGV4dHZhbA0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcg0KLXsNCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHNldmVyaXR5IHNob3VsZCBibG9jayB0aGUgbmF2aWdhdGlvbg0KLSAgICAgKiBpZiAjc2V2ZXJpdHlDYXVzZXNWYWxpZGF0b3JFeGNlcHRpb24gcmV0dXJucyBmYWxscyB2YWxpZGF0aW9uIHdpbGwgYmUgY29udGludWVkIGZvciB0aGUgY3VycmVudCBwcm9wZXJ0eQ0KLSAgICAgKiBhbGwgbWVzc2FnZXMgd2hpY2ggZG9uJ3QgbGVhZCB0byBhbiBleGNlcHRpb24gc2hvdWxkIGJlIHN0b3JlZCBpbiBhbiBzdG9yYWdlIGFuZA0KLSAgICAgKiBhZGRlZCBhZnRlciB0aGUgZmlyc3QgbWVzc2FnZSB3aGljaCBnZXRzIHRocm93biBhcyBleGNlcHRpb24NCi0gICAgICogYSBnbG9iYWwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgYWRkIHRoZSBtZXNzYWdlcyBvZiB0aGUgc3RvcmFnZSBhcyBmYWNlcyBtZXNzYWdlDQotICAgICAqLw0KLSAgICBib29sZWFuIHNldmVyaXR5QmxvY2tzTmF2aWdhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KTsNCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHNldmVyaXR5IHNob3VsZCBjYXVzZSBhIHZhbGlkYXRvciBleGNlcHRpb24NCi0gICAgICovDQotICAgIGJvb2xlYW4gc2V2ZXJpdHlDYXVzZXNWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSk7DQotDQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IGN1cnJlbnQgZmFjZXMgY29udGV4dA0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgY3VycmVudCBjb21wb25lbnQNCi0gICAgICogQHBhcmFtIHNldmVyaXR5IGpzZiBzZXZlcml0eSBmb3IgZmFjZXMgbWVzc2FnZXMNCi0gICAgICogQHJldHVybiB0cnVlIGlmIGEgdmlvbGF0aW9uIG1lc3NhZ2UgbGVhZHMgdG8gYSBmYWNlcyBtZXNzYWdlDQotICAgICAqLw0KLSAgICBib29sZWFuIHNldmVyaXR5Q2F1c2VzVmlvbGF0aW9uTWVzc2FnZSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KTsNCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnN0cmFpbnQgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkgc2hvdWxkIGJlIHZhbGlkYXRlZCBvbiB0aGUgY2xpZW50IHNpZGUgKGlmIHN1cHBvcnRlZCkNCi0gICAgICovDQotICAgIGJvb2xlYW4gc2V2ZXJpdHlCbG9ja3NTdWJtaXQoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSk7DQotDQotICAgIC8qKg0KLSAgICAgKiBhdmFpbGFibGUgZm9yIGFkZC1vbnMgLSBub3QgdXNlZCBpbnRlcm5hbGx5IGR1ZSB0byBwZXJmb3JtYW5jZSByZWFzb25zDQotICAgICAqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnN0cmFpbnQgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkNCi0gICAgICogc2hvdWxkIGNhdXNlIGUuZy4gYSByZXF1aXJlZCBtYXJrZXIgaW5kZXBlbmRlbnQgb2YgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiAoaWYgc3VwcG9ydGVkKQ0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBzZXZlcml0eVNob3dzSW5kaWNhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1OWM5MzQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLk1lc3NhZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotCi0vKioKLSAqIFByb3ZpZGVzIHRoZSBhYmlsaXR5IG9mIG1lc3NhZ2UgcmVzb2x2aW5nIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuUkVVU0V9KQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTxBIGV4dGVuZHMgQW5ub3RhdGlvbj4gZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQotewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYID0gIl9kZXRhaWwiOwotICAgIC8vZS5nLiBmb3IgaW5qZWN0aW5nIGEgbWVzc2FnZSByZXNvbHZlciB2aWEgc3ByaW5nCi0gICAgcHJpdmF0ZSBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgTG9jYWxlIGxvY2FsZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpOwotCi0gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VSZXNvbHZlciAhPSBudWxsID8gdGhpcy5tZXNzYWdlUmVzb2x2ZXIuZ2V0TWVzc2FnZShrZXksIGxvY2FsZSkgOgotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHRoaXMpLmdldE1lc3NhZ2Uoa2V5LCBsb2NhbGUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShBIGFubm90YXRpb24pCi0gICAgewotICAgICAgICByZXR1cm4gcmVzb2x2ZU1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChBIGFubm90YXRpb24pCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiAoa2V5ICE9IG51bGwpID8gcmVzb2x2ZU1lc3NhZ2Uoa2V5ICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgpIDogbnVsbDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbikgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBGYWNlc01lc3NhZ2UgZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNZXNzYWdlKEEgYW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2UoZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uKSwgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBIGFubm90YXRpb24pOwotCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZVJlc29sdmVyKE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXIpCi0gICAgewotICAgICAgICB0aGlzLm1lc3NhZ2VSZXNvbHZlciA9IG1lc3NhZ2VSZXNvbHZlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICAgIG1ldGFEYXRhRW50cnkuc2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwsIGdldExhYmVsKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnkpKTsKLQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uKTsKLSAgICB9Ci0KLSAgICAvL2UuZy4gZm9yIGN1c3RvbSBhbm5vdGF0aW9ucyAtIG92ZXJyaWRlIGlmIG5lZWRlZAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxZjNlZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5leGNlcHRpb24uUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBQcm92aWRlcyB0aGUgYWJpbGl0eSB0byB1c2UgVmFsaWRhdG9yRXhjZXB0aW9uIChhcyBleHBlY3RlZCBieSB0aGUgdXNlcikgaW5zdGVhZCBvZiBDb252ZXJ0ZXJFeGNlcHRpb24uDQotICogRnVydGhlcm1vcmUgaXQgcHJvdmlkZXM6PGJyLz4NCi0gKiBpbml0VmFsaWRhdGlvbjxici8+DQotICogcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgaW5pdFZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGluaXRWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImluaXRWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBwcm9jZXNzVmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcm9jZXNzVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJwcm9jZXNzVmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0gICAgICAgICAgICBpZihlIGluc3RhbmNlb2YgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24gPSBuZXcgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29udmVydEZhY2VzTWVzc2FnZShlLmdldEZhY2VzTWVzc2FnZSgpKSwgZS5nZXRDYXVzZSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uID0gbmV3IFZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb252ZXJ0RmFjZXNNZXNzYWdlKGUuZ2V0RmFjZXNNZXNzYWdlKCkpLCBlLmdldENhdXNlKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBpZiAocHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgIjogdGhyb3cgb3JpZ2luYWwgZXhjZXB0aW9uIGFmdGVyIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvVGhyb3dWYWxpZGF0b3JFeGNlcHRpb25Gb3JDb21wb25lbnQoDQotICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSwgdmFsaWRhdG9yRXhjZXB0aW9uKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgIjogb3JpZ2luYWwgZXhjZXB0aW9uIGFmdGVyIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbiwgdGhpcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YThjZmUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi0NCi0vKioNCi0gKiB0byBtYXAgY29uc3RyYWludHMgZGlyZWN0bHkgdG8gYSBtZXRhLWRhdGEgdHJhbnNmb3JtZXIgaWYgdGhlcmUgaXMgbm8gdmFsaWRhdGlvbiBzdHJhdGVneSAocmVxdWlyZWQgYnkganNyIDMwMykNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGUoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ0aGlzIGlzIGp1c3QgYW4gYWRhcHRlciBlLmcuIGZvciBjb21wb25lbnQgaW5pdGlhbGl6YXRpb24iKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjM2Q1OTAuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIGl0IGlzbid0IGxpbmtlZCB0byBqc3IgMzAzDQotICoNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0NCi0gKiBhZGFwdGVyIHRvIGNvbm5lY3QgdmFsaWRhdGlvbiBzdHJhdGVnaWVzIHdpdGggbWV0YS1kYXRhIHRyYW5zZm9ybWVycywNCi0gKiBpZiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBkZWZpbmVkIGFzIGJlYW4gYW5kIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBpbnRlcmZhY2UgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIgZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIC8vdG8gZ2V0IGJhY2sgdGhlIGludGVybmFsIGNhc2hpbmcNCi0gICAgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpOw0KLQ0KLSAgICBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMxMTZmMi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLkJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogaXQgaXNuJ3QgbGlua2VkIHRvIGpzciAzMDMNCi0gKg0KLSAqIGl0J3MganVzdCBhIGhlbHBlciBmb3IgcHJveGllcyAtIHlvdSBqdXN0IG5lZWQgaXQsIGlmIHlvdSBkZWZpbmUgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0Lg0KLQ0KLSAqIGFkYXB0ZXIgdG8gY29ubmVjdCB2YWxpZGF0aW9uIHN0cmF0ZWdpZXMgd2l0aCBtZXRhLWRhdGEgdHJhbnNmb3JtZXJzLA0KLSAqIGlmIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIGRlZmluZWQgYXMgYmVhbiBhbmQgZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbCBpbXBsZW1lbnRzIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgcHJpdmF0ZSBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAvL29wdGlvbmFsIGZhbGxiYWNrIGZvciBpbnRlcm5hbCBjYXNoaW5nDQotICAgIHByaXZhdGUgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsNCi0NCi0gICAgcHVibGljIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbCgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciBpbnN0YW5jZW9mIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcikNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyKSBtZXRhRGF0YVRyYW5zZm9ybWVyICkuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgTWV0YURhdGFUcmFuc2Zvcm1lciBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFUcmFuc2Zvcm1lcihNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lciA9IG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25TdHJhdGVneShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneSA9IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTBhMTFkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcg0KLSAgICAuQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyB0aGUgVmFsaWRhdGlvblN0cmF0ZWd5IGZvciBhIGdpdmVuIE1ldGEtRGF0YSBLZXkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFN0cmluZz4NCi0gICAgICAgIGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxTdHJpbmcsIFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9IG51bGw7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBjcmVhdGUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICBpZiAobWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljTWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZy5jb250YWluc0tleShtZXRhRGF0YUtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nLmdldChtZXRhRGF0YUtleSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWU7DQotICAgICAgICAvL251bGwgLT4gdXNlIG5hbWUgbWFwcGVycw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFN0cmluZz4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0cmF0ZWd5TmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZShtZXRhRGF0YUtleSk7DQotDQotICAgICAgICAgICAgaWYgKHN0cmF0ZWd5TmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKHN0cmF0ZWd5TmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyhtZXRhRGF0YUtleSwgc3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lJbnN0YW5jZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUNCi0gICAgICAgICAgICAuc3RhcnRzV2l0aChBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5QUkVGSVhfRk9SX0JFQU5fTUFQUElORykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbih2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLlBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HLmxlbmd0aCgpKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIG1ldGFEYXRhS2V5LCBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZGRpbmcgbWV0YS1kYXRhIGtleSB0byB2YWxpZGF0aW9uIHN0cmF0ZWd5IG1hcHBpbmc6ICINCi0gICAgICAgICAgICAgICAgKyBtZXRhRGF0YUtleSArICIgLT4gIiArIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcucHV0KG1ldGFEYXRhS2V5LCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnID0gbmV3IFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgLy90cnkgdG8gc2V0dXAgbWFwcGluZyB3aXRoIGJhc2UgbmFtZSBieSBjb252ZW50aW9uIC0gb3ZlcnJpZGVzIGRlZmF1bHQgbWFwcGluZw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgLy9idWlsZCBjb252ZW50aW9uIChzdHJhdGVneSBtYXBwaW5nKQ0KLSAgICAgICAgICAgIHN0YXRpY0NvbmZpZy5zZXRTb3VyY2VPZk1hcHBpbmcoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVRJQ19TVFJBVEVHWV9NQVBQSU5HX1NPVVJDRSkpOw0KLQ0KLSAgICAgICAgICAgIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9zZXR1cCBjdXN0b20gbWFwcGluZyAtIG92ZXJyaWRlcyBhbGwgb3RoZXIgbWFwcGluZ3MNCi0gICAgICAgIFN0cmluZyBjdXN0b21NYXBwaW5nQmFzZU5hbWUgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OX1NUUkFURUdZX01BUFBJTkc7DQotICAgICAgICBpZiAoY3VzdG9tTWFwcGluZ0Jhc2VOYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzdGF0aWNDb25maWcgPSBuZXcgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAgICAgICAgIHN0YXRpY0NvbmZpZy5zZXRTb3VyY2VPZk1hcHBpbmcoY3VzdG9tTWFwcGluZ0Jhc2VOYW1lKTsNCi0gICAgICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBTdHJhdGVneU1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZyxTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWFwcGluZy5nZXRTb3VyY2UoKSwgbWFwcGluZy5nZXRUYXJnZXQoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxTdHJpbmc+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm5hbWVNYXBwZXJMaXN0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0lkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjNhMmFiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogaWYgYW4gYWRhcHRlciBpcyB1c2VkIGZvciBzZXZlcmFsIGNvbnN0cmFpbnRzLCB0aGlzIGludGVyZmFjZSBhbGxvd3MgdG8gaWRlbnRpZnkgaW5zdGFuY2VzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgU3RyaW5nIElEX1BSRUZJWCA9ICI6IjsNCi0NCi0gICAgU3RyaW5nIGdldElkKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTU1MjNkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQmFzZSBpbnRlcmZhY2UgZm9yIFZhbGlkYXRpb25TdHJhdGVnaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi0vLypWYWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGVhZCBvZiAqVmFsaWRhdG9yIHRvIGF2b2lkIG5hbWluZyBjb25mdXNpb24gDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWIzZjBkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGQ5NGY3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsNCi0NCi0vKioNCi0gKiBOYW1lIE1hcHBlciB3aGljaCBkZWxlZ2F0ZXMgdGhlIG5hbWUgbWFwcGluZywgZXh0cmFjdCB0aGUgbmFtZSBhbmQgY29udmVydCBpdCB0byBhIGJlYW4gbmFtZSArIHByZWZpeA0KLSAqIHRhcmdldDogY29uZmlndXJlIGEgdmFsaWRhdGlvbiBzdHJhdGVneSB2aWEgYSBtYW5hZ2VkIGJlYW4gZmFjaWxpdHkgLT4gYWxsb3dzIHRvIGluamVjdCBvdGhlciBiZWFucw0KLSAqIGluc3RlYWQgb2YgYXBpIGNhbGxzICsgaGFyZGNvZGVkIGJlYW4gbmFtZXMNCi0gKiA8cC8+DQotICogYWxsb3dlZCBiZWFuIHNjb3BlczoNCi0gKiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBzdGF0ZWxlc3M6IGFwcGxpY2F0aW9uL3NpbmdsZXRvbg0KLSAqIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIHN0YXRlZnVsOiBub25lL3Byb3RvdHlwZQ0KLSAqIGRvbid0IHVzZSB0aGUgc2Vzc2lvbiBvciBhIGNvbnZlcnNhdGlvbiBzY29wZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcig1MDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfRk9SX0JFQU5fTUFQUElORyA9ICJiZWFuOiI7DQotICAgIHByaXZhdGUgTmFtZU1hcHBlcjxTdHJpbmc+IHdyYXBwZWQ7DQotDQotICAgIHB1YmxpYyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcihOYW1lTWFwcGVyPFN0cmluZz4gbmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gbmFtZU1hcHBlcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSB3cmFwcGVkLmNyZWF0ZU5hbWUoc291cmNlKTsNCi0NCi0gICAgICAgIGlmIChuYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7DQotICAgICAgICByZXR1cm4gUFJFRklYX0ZPUl9CRUFOX01BUFBJTkcgKyBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKG5hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDAzMjA2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIEFubm90YXRpb25zIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqIChjb25maWd1cmVkIHZpYSB3ZWIueG1sKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZTgzMDIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBBbm5vdGF0aW9ucyB0byBWYWxpZGF0aW9uU3RyYXRlZ2llcy4NCi0gKiAoY29uZmlndXJlZCB2aWEgaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbikNCi0gKiBUaGUgYmVhbiBwcm92aWRlcyB0aGUgZGVmYXVsdCBuYW1lIChjb252ZW50aW9uKS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gZnVsbCBxdWFsaWZpZWQgbmFtZS4gKD0gY3VzdG9taXphYmxlIGNvbnZlbnRpb24pDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzM4ZDhmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFwcyBFeHRWYWwgQW5ub3RhdGlvbnMgdG8gRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigzMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKG1ldGFEYXRhS2V5KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzODIwNTMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciB0byBwbGFjZSBBbm5vdGF0aW9ucyBhbmQgVmFsaWRhdGlvblN0cmF0ZWdpZXMgaW4gdGhlIHNhbWUgcGFja2FnZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoNDAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUtleSArDQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvUHJpb3JpdHkuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Qcmlvcml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTFhYTMzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Qcmlvcml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLXB1YmxpYyBlbnVtIFByaW9yaXR5Ci17Ci0gICAgQkxPQ0tJTkcsCi0gICAgSElHSCwKLSAgICBNRURJVU0sCi0gICAgTE9XCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Ub0RvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMjVhMGEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5DT05TVFJVQ1RPUjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRCwgQ09OU1RSVUNUT1J9KQotcHVibGljIEBpbnRlcmZhY2UgVG9EbwotewotICAgIFByaW9yaXR5IHZhbHVlKCk7Ci0gICAgU3RyaW5nIGRlc2NyaXB0aW9uKCkgZGVmYXVsdCAiIjsKLQotICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgIEBpbnRlcmZhY2UgTGlzdAotICAgIHsKLSAgICAgICAgVG9Eb1tdIHZhbHVlKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VDYXRlZ29yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDdiMzg1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLS8qKgotICogQVBJOjxici8+Ci0gKiBwYXJ0cyB5b3UgbWlnaHQgbmVlZCBmb3IgY3VzdG9tIGltcGxlbWVudGF0aW9ucyBhbmQgd2hpY2ggYXJlIHF1aXRlIHN0YWJsZSBpbiB2aWV3IG9mIGNoYW5nZXMKLSAqIDxwLz4KLSAqIElOVEVSTkFMOjxici8+Ci0gKiBpZiB5b3UgdGhpbmsgYWJvdXQgcmVmZXJlbmNpbmcgYW4gYXJ0aWZhY3Qgd2hpY2ggaXMgbWFya2VkIGFzIGludGVybmFsLCBhc2sgZm9yIHN1cHBvcnQuCi0gKiB0aGVyZSBzaG91bGQgYmUgYSBiZXR0ZXIgc29sdXRpb24KLSAqIDxwLz4KLSAqIENVU1RPTUlaQUJMRTo8YnIvPgotICogYSBwbGFubmVkIGV4dGVuc2lvbiBwb2ludCB3aGljaCBjb250YWlucyBsb2dpYyB0byBjdXN0b21pemUgdGhlIGZyYW1ld29yay4KLSAqIGlmIGl0IGlzbid0IGFsc28gbWFya2VkIGFzIEFQSSBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotICogaG93ZXZlciwgd2UgdHJ5IHRvIGtlZXAgaXQgYXMgc3RhYmxlIGFzIHBvc3NpYmxlIGFuZCByZWFzb25hYmxlLgotICogPHAvPgotICogUkVVU0U6PGJyLz4KLSAqIGFuIGFydGlmYWN0IHdoaWNoIHlvdSBjYW4gcmV1c2UgZm9yIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uLgotICogaWYgaXQgaXNuJ3QgbWFya2VkIGFzIEFQSSBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotICogaG93ZXZlciwgd2UgdHJ5IHRvIGtlZXAgaXQgYXMgc3RhYmxlIGFzIHBvc3NpYmxlIGFuZCByZWFzb25hYmxlLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLXB1YmxpYyBlbnVtIFVzYWdlQ2F0ZWdvcnkKLXsKLSAgICBBUEksCi0gICAgSU5URVJOQUwsCi0gICAgQ1VTVE9NSVpBQkxFLAotICAgIFJFVVNFCi19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlSW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzN2ViYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIGl0J3MgYW4gaW50ZXJuYWwgYW5ub3RhdGlvbiB0byBwcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gY29uY2VybmluZyB1c2FnZS1jYXRlZ29yaWVzCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkKLSAqLwotQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi1wdWJsaWMgQGludGVyZmFjZSBVc2FnZUluZm9ybWF0aW9uCi17Ci0gICAgVXNhZ2VDYXRlZ29yeVtdIHZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZTIwNTYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsNCi1pbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ2xhc3NVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENsYXNzVXRpbHMuY2xhc3MpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIHRyeVRvTG9hZENsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGxvYWRDbGFzc0Zvck5hbWUobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGxvYWRDbGFzc0Zvck5hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIFRyeSBXZWJBcHAgQ2xhc3NMb2FkZXIgZmlyc3QNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwDQotICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWdub3JlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIGZhbGxiYWNrOiBUcnkgQ2xhc3NMb2FkZXIgZm9yIENsYXNzVXRpbHMgKGkuZS4gdGhlIG15ZmFjZXMuamFyIGxpYikNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwDQotICAgICAgICAgICAgICAgIENsYXNzVXRpbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyA8VD4gVCB0cnlUb0luc3RhbnRpYXRlQ2xhc3MoQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0YXJnZXRDbGFzcy5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKFN0cmluZyBjbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxvYWRDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEphclZlcnNpb24oQ2xhc3MgdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjbGFzc0ZpbGVQYXRoID0gdGFyZ2V0Q2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyI7DQotICAgICAgICBTdHJpbmcgbWFuaWZlc3RGaWxlUGF0aCA9ICIvTUVUQS1JTkYvTUFOSUZFU1QuTUYiOw0KLQ0KLSAgICAgICAgU3RyaW5nIGNsYXNzTG9jYXRpb24gPSB0YXJnZXRDbGFzcy5nZXRSZXNvdXJjZSh0YXJnZXRDbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLmNsYXNzIikudG9TdHJpbmcoKTsNCi0gICAgICAgIFN0cmluZyBtYW5pZmVzdEZpbGVMb2NhdGlvbiA9IGNsYXNzTG9jYXRpb24NCi0gICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCBjbGFzc0xvY2F0aW9uLmluZGV4T2YoY2xhc3NGaWxlUGF0aCkgLSAxKSArIG1hbmlmZXN0RmlsZVBhdGg7DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IE1hbmlmZXN0KG5ldyBVUkwobWFuaWZlc3RGaWxlTG9jYXRpb24pLm9wZW5TdHJlYW0oKSkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNYWluQXR0cmlidXRlcygpLmdldFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5JTVBMRU1FTlRBVElPTl9WRVJTSU9OKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoTE9HLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBMT0cudHJhY2UoImNvdWxkbid0IGxvYWQgdmVyc2lvbiBvZiBqYXIgZmlsZSB3aGljaCBjb250YWlucyAiICsgdGFyZ2V0Q2xhc3MuZ2V0TmFtZSgpLCB0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRGVmYXVsdFByb2plY3ROYW1lLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9EZWZhdWx0UHJvamVjdE5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkNjM5OS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9EZWZhdWx0UHJvamVjdE5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Qcm9qZWN0U3RhZ2VOYW1lOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0UHJvamVjdE5hbWUgaW1wbGVtZW50cyBQcm9qZWN0U3RhZ2VOYW1lDQotew0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOw0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pDQotICAgIHByaXZhdGUgRGVmYXVsdFByb2plY3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIERlZmF1bHRQcm9qZWN0TmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBzdGF0aWMgUHJvamVjdFN0YWdlTmFtZSBjcmVhdGVQcm9qZWN0U3RhZ2VOYW1lKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRQcm9qZWN0TmFtZShuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5uYW1lOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmICh0aGlzID09IG8pDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgRGVmYXVsdFByb2plY3ROYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBEZWZhdWx0UHJvamVjdE5hbWUgdGhhdCA9IChEZWZhdWx0UHJvamVjdE5hbWUpIG87DQotDQotICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKHRoYXQubmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmFtZS5oYXNoQ29kZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmVlM2RhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NjQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5WYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Qcm9qZWN0U3RhZ2VOYW1lOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5BYnN0cmFjdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5OYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5GYWNlc01lc3NhZ2VTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbFV0aWxzDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HR0VSID0gTG9nRmFjdG9yeS5nZXRMb2coRXh0VmFsVXRpbHMuY2xhc3MpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfUkVRVUlSRUQgPSAiamF2YXguZmFjZXMuY29tcG9uZW50LlVJSW5wdXQuUkVRVUlSRUQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfUkVRVUlSRURfREVUQUlMID0gImphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUlucHV0LlJFUVVJUkVEX2RldGFpbCI7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19NQVhJTVVNID0gImphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3IuTUFYSU1VTSI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19NQVhJTVVNX0RFVEFJTCA9ICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yLk1BWElNVU1fZGV0YWlsIjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChDbGFzc01hcHBpbmdGYWN0b3J5PFN0cmluZywgVmFsaWRhdGlvblN0cmF0ZWd5PikgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZShtZXRhRGF0YUtleSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgTmFtZU1hcHBlcjxTdHJpbmc+IG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlcmVnaXN0ZXIobWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbnlNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gbWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZW55KG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFUcmFuc2Zvcm1lciBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YVRyYW5zZm9ybWVyPikgRXh0VmFsQ29udGV4dA0KLSAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlKHZhbGlkYXRpb25TdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLnJlZ2lzdGVyKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVyZWdpc3Rlcih2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZW55VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVueSh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLCBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yV2l0aChNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksIENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVdpdGgocHJvcGVydGllcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudFdpdGhNZXRhRGF0YShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGZvciAoQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRDb21wb25lbnRJbml0aWFsaXplcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjb21wb25lbnRJbml0aWFsaXplci5jb25maWd1cmVDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOw0KLQ0KLSAgICAgICAgaWYgKG1ldGFEYXRhRW50cnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YUVudHJ5ID0gbmV3IE1ldGFEYXRhRW50cnkoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAoVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCF2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJUaHJvd2luZygNCi0gICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbiwgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGVJbnRlcmNlcHRlZE1ldGFEYXRhRXh0cmFjdG9yKGZpbmFsIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvcldpdGgobWV0YURhdGFFeHRyYWN0b3IsIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvckZvcigNCi0gICAgICAgICAgICBmaW5hbCBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciwgQ2xhc3MgbW9kdWxlS2V5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIGlmKG1vZHVsZUtleSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpLCBtb2R1bGVLZXkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3JXaXRoKG1ldGFEYXRhRXh0cmFjdG9yLCBwcm9wZXJ0aWVzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3JXaXRoKA0KLSAgICAgICAgICAgIGZpbmFsIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yLCBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgTWV0YURhdGFFeHRyYWN0b3IoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcmVzdWx0ID0gbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIG9iamVjdCk7DQotDQotICAgICAgICAgICAgICAgIGFkZFByb3BlcnRpZXMocmVzdWx0LCBwcm9wZXJ0aWVzKTsNCi0gICAgICAgICAgICAgICAgaW52b2tlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKHJlc3VsdCwgcHJvcGVydGllcyk7DQotDQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFByb3BlcnRpZXMoUHJvcGVydHlJbmZvcm1hdGlvbiByZXN1bHQsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgaWYocHJvcGVydGllcyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY3VzdG9tUHJvcGVydGllcyA9IGdldEN1c3RvbVByb3BlcnRpZXMocmVzdWx0KTsNCi0gICAgICAgICAgICBjdXN0b21Qcm9wZXJ0aWVzLnB1dEFsbChwcm9wZXJ0aWVzKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEN1c3RvbVByb3BlcnRpZXMoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZighcHJvcGVydHlJbmZvcm1hdGlvbi5jb250YWluc0luZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkNVU1RPTV9QUk9QRVJUSUVTKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnNldEluZm9ybWF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuQ1VTVE9NX1BST1BFUlRJRVMsIG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoTWFwPFN0cmluZywgT2JqZWN0PikgcHJvcGVydHlJbmZvcm1hdGlvbi5nZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5DVVNUT01fUFJPUEVSVElFUyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbnZva2VNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoUHJvcGVydHlJbmZvcm1hdGlvbiByZXN1bHQsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgZm9yIChNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciA6DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc1dpdGgocHJvcGVydGllcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJFeHRyYWN0aW5nKHJlc3VsdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlUmVzb2x2ZXIgZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXNzYWdlUmVzb2x2ZXI+KSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlKHZhbGlkYXRpb25TdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5yZWdpc3Rlcih2YWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlcmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IHZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlcmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZW55VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZW55KHZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEVMSGVscGVyIGdldEVMSGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRUxfSEVMUEVSX0ZBQ1RPUlksIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmNsYXNzKS5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY2VzTWVzc2FnZSBjcmVhdGVGYWNlc01lc3NhZ2UoU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcmVhdGVGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjZXNNZXNzYWdlIGNyZWF0ZUZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5GQUNFU19NRVNTQUdFX0ZBQ1RPUlksIEZhY2VzTWVzc2FnZUZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUoc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBGYWNlc01lc3NhZ2UgY29udmVydEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5GQUNFU19NRVNTQUdFX0ZBQ1RPUlksIEZhY2VzTWVzc2FnZUZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5jb252ZXJ0KGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eURldGFpbHMgY3JlYXRlUHJvcGVydHlEZXRhaWxzRm9yTmV3VGFyZ2V0KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgYmFzZU9iamVjdDsNCi0gICAgICAgIGlmIChnZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZCh0YXJnZXRFeHByZXNzaW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZSA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHRhcmdldEV4cHJlc3Npb24pOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyBleHByZXNzaW9uID0gdmJlLmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgICAgICBiYXNlT2JqZWN0ID0gZ2V0RUxIZWxwZXIoKS5nZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZiZS5nZXRCYXNlRXhwcmVzc2lvbigpKTsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uc3Vic3RyaW5nKDIsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKSwgYmFzZU9iamVjdCwgdmJlLmdldFByb3BlcnR5KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIG9yaWdpbmFsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eSgNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIFN0cmluZyBuZXdCYXNlS2V5ID0gb3JpZ2luYWwuZ2V0S2V5KCkuc3Vic3RyaW5nKDAsIG9yaWdpbmFsLmdldEtleSgpLmxhc3RJbmRleE9mKCIuIikgKyAxKTsNCi0gICAgICAgIFN0cmluZyBuZXdLZXkgPSBuZXdCYXNlS2V5ICsgdGFyZ2V0RXhwcmVzc2lvbjsNCi0NCi0gICAgICAgIGJhc2VPYmplY3QgPSBSZWZsZWN0aW9uVXRpbHMuZ2V0QmFzZU9mUHJvcGVydHlDaGFpbihvcmlnaW5hbC5nZXRCYXNlT2JqZWN0KCksIHRhcmdldEV4cHJlc3Npb24pOw0KLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURldGFpbHMoDQotICAgICAgICAgICAgICAgIG5ld0tleSwgYmFzZU9iamVjdCwgdGFyZ2V0RXhwcmVzc2lvbi5zdWJzdHJpbmcodGFyZ2V0RXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiLiIpICsgMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRFeHByZXNzaW9uLmxlbmd0aCgpKSk7DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvUGxhY2VMYWJlbChGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBTdHJpbmcgbGFiZWwsIGludCBpbmRleCkNCi0gICAgew0KLSAgICAgICAgaWYgKGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLmNvbnRhaW5zKCJ7IiArIGluZGV4ICsgIn0iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLnJlcGxhY2UoInsiICsgaW5kZXggKyAifSIsIGxhYmVsKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoZmFjZXNNZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwgJiYgZmFjZXNNZXNzYWdlLmdldERldGFpbCgpLmNvbnRhaW5zKCJ7IiArIGluZGV4ICsgIn0iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKS5yZXBsYWNlKCJ7IiArIGluZGV4ICsgIn0iLCBsYWJlbCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBsYWNlV2l0aERlZmF1bHRNYXhpbXVtTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBpbnQgbWF4TGVuZ3RoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2UgPSBKc2ZVdGlscy5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZShKQVZBWF9GQUNFU19NQVhJTVVNKTsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlOw0KLQ0KLSAgICAgICAgLy91c2UgdHJ5L2NhdGNoIGZvciBlYXNpZXIgc3luYyBiZXR3ZWVuIHRydW5rL2JyYW5jaA0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKEpzZlV0aWxzLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKEpBVkFYX0ZBQ0VTX01BWElNVU1fREVUQUlMKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBKc2ZVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZShKQVZBWF9GQUNFU19NQVhJTVVNX0RFVEFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9qc2YgMS4yIGRvZXNuJ3QgaGF2ZSBhIGRldGFpbCBtZXNzYWdlDQotICAgICAgICB9DQotDQotICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZSA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlLnJlcGxhY2UoInswfSIsICIiICsgbWF4TGVuZ3RoKTsNCi0gICAgICAgIGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsID0gZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwucmVwbGFjZSgiezB9IiwgIiIgKyBtYXhMZW5ndGgpOw0KLQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoZmFjZXNSZXF1aXJlZE1lc3NhZ2UpOw0KLSAgICAgICAgZmFjZXNNZXNzYWdlLnNldERldGFpbChmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCk7DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2UgPSBKc2ZVdGlscy5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZShKQVZBWF9GQUNFU19SRVFVSVJFRCk7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZTsNCi0NCi0gICAgICAgIC8vdXNlIHRyeS9jYXRjaCBmb3IgZWFzaWVyIHN5bmMgYmV0d2VlbiB0cnVuay9icmFuY2gNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChKc2ZVdGlscy5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZShKQVZBWF9GQUNFU19SRVFVSVJFRF9ERVRBSUwpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IEpzZlV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKEpBVkFYX0ZBQ0VTX1JFUVVJUkVEX0RFVEFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9qc2YgMS4yIGRvZXNuJ3QgaGF2ZSBhIGRldGFpbCBtZXNzYWdlDQotICAgICAgICB9DQotDQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc1JlcXVpcmVkTWVzc2FnZSk7DQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTa2lwYWJsZVZhbGlkYXRpb25TdHJhdGVneShDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50Q2xhc3MgOiBnZXRTa2lwVmFsaWRhdGlvblN1cHBvcnRDbGFzc0xpc3QoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoaXNTa2lwVmFsaWRhdGlvblN1cHBvcnRlZChjdXJyZW50Q2xhc3MsIHRhcmdldENsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvY2Vzc01ldGFEYXRhRW50cnlBZnRlclNraXBWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHRhcmdldENsYXNzLCBNZXRhRGF0YUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gaXNTa2lwYWJsZVZhbGlkYXRpb25TdHJhdGVneSh0YXJnZXRDbGFzcykgJiYNCi0gICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhlbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5TS0lQX1ZBTElEQVRJT04sIEJvb2xlYW4uY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8Q2xhc3M+IGdldFNraXBWYWxpZGF0aW9uU3VwcG9ydENsYXNzTGlzdCgpDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IHN0YXRpY0NvbmZpZ3VyYXRpb25MaXN0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlNLSVBfVkFMSURBVElPTl9TVVBQT1JUX0NPTkZJRyk7DQotDQotICAgICAgICBMaXN0PENsYXNzPiBtYXJrZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzczsNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gY3VycmVudEVudHJ5IDogc3RhdGljQ29uZmlndXJhdGlvbkxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IGN1cnJlbnRDb25maWd1cmF0aW9uRW50cnkgOiBjdXJyZW50RW50cnkuZ2V0TWFwcGluZygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudENsYXNzID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUoY3VycmVudENvbmZpZ3VyYXRpb25FbnRyeS5nZXRUYXJnZXQoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q2xhc3MgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbWFya2VyTGlzdC5hZGQoY3VycmVudENsYXNzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChMT0dHRVIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi53YXJuKCJjb25maWd1cmF0aW9uIGVudHJ5IHByb3ZpZGVzIGFuIGludmFsaWQgZW50cnk6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY3VycmVudENvbmZpZ3VyYXRpb25FbnRyeS5nZXRUYXJnZXQoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWFya2VyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTa2lwVmFsaWRhdGlvblN1cHBvcnRlZChDbGFzcyBjdXJyZW50Q2xhc3MsIENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZiAoY3VycmVudENsYXNzLmlzQW5ub3RhdGlvbigpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh0YXJnZXRDbGFzcy5pc0Fubm90YXRpb25QcmVzZW50KGN1cnJlbnRDbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGN1cnJlbnRDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRhcmdldENsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgZ2V0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpDQotICAgIHsNCi0gICAgICAgIGlmKGlzVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rpb25EZWFjdGl2YXRlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpIHsNCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4oKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5KQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIDxUPiBMaXN0PFQ+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzczxUPiB2YWx1ZVR5cGUpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFQ+KCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIDxUPiBUIGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzczxUPiB2YWx1ZVR5cGUsIENsYXNzIHZhbHVlSWQpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkuZ2V0RmFjdG9yeSgNCi0gICAgICAgICAgICAgICAgRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZLCBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKENsYXNzIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgIENsYXNzTWFwcGluZ0ZhY3Rvcnk8Q2xhc3MsIENsYXNzPiB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5LmNyZWF0ZShzb3VyY2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdGlvbkRlYWN0aXZhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX1ZBTElEQVRJT05fUEFSQU1FVEVSUyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGV4ZWN1dGVMb2NhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHByb3BlcnRpZXMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0gZ2V0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpLmV4dHJhY3QoDQotICAgICAgICAgICAgICAgIGFubm90YXRpb24sIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLCBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcyk7DQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7DQotDQotICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5TWFwLnB1dChwcm9wZXJ0eUtleSwgcHJvcGVydGllcyk7DQotICAgICAgICB9DQotICAgICAgICBwcm9wZXJ0eU1hcC5wdXQoQW5ub3RhdGlvbi5jbGFzcy5nZXROYW1lKCksIGFubm90YXRpb24pOw0KLQ0KLSAgICAgICAgZm9yIChQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA6IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIXByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgICAgICAgICAgICAgICAgICAuYmVmb3JlVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHByb3BlcnR5TWFwKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGV4ZWN1dGVMb2NhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5S2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwcm9wZXJ0aWVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0gZ2V0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpLmV4dHJhY3QoDQotICAgICAgICAgICAgICAgIGFubm90YXRpb24sIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLCBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcyk7DQotDQotICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5TWFwLnB1dChwcm9wZXJ0eUtleSwgcHJvcGVydGllcyk7DQotICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KEFubm90YXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgOiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlNYXApOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJpcyByZW5hbWluZyBvaz8iKQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXhlY3V0ZUdsb2JhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwcm9wZXJ0aWVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgbW9kdWxlS2V5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7DQotDQotICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5TWFwLnB1dChwcm9wZXJ0eUtleSwgcHJvcGVydGllcyk7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IobW9kdWxlS2V5KTsNCi0NCi0gICAgICAgIGZvciAoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgOiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLSAgICAgICAgICAgICAgICAgICAgLmJlZm9yZVZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eU1hcCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJpcyByZW5hbWluZyBvaz8iKQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5S2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcHJvcGVydGllcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgbW9kdWxlS2V5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5TWFwLnB1dChwcm9wZXJ0eUtleSwgcHJvcGVydGllcyk7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IobW9kdWxlS2V5KTsNCi0NCi0gICAgICAgIGZvciAoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgOiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlNYXApOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgZ2V0U3RvcmFnZShDbGFzczxUPiBzdG9yYWdlVHlwZSwgU3RyaW5nIHN0b3JhZ2VOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFQpIGdldFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSgpLmNyZWF0ZShzdG9yYWdlVHlwZSkuY3JlYXRlKHN0b3JhZ2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRTdG9yYWdlKENsYXNzIHN0b3JhZ2VUeXBlLCBTdHJpbmcgc3RvcmFnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIGdldFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSgpLmNyZWF0ZShzdG9yYWdlVHlwZSkucmVzZXQoc3RvcmFnZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIENsYXNzTWFwcGluZ0ZhY3Rvcnk8Q2xhc3MsIFN0b3JhZ2VNYW5hZ2VyPiBnZXRTdG9yYWdlTWFuYWdlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFRyYW5zZm9ybWVkTWV0YURhdGEoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRUcmFuc2Zvcm1lZE1ldGFEYXRhRm9yKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRUcmFuc2Zvcm1lZE1ldGFEYXRhRm9yKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBDbGFzcyBtb2R1bGVLZXkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgaWYobW9kdWxlS2V5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCksIG1vZHVsZUtleSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZ2V0VHJhbnNmb3JtZWRNZXRhRGF0YVdpdGgoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgcHJvcGVydGllcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFRyYW5zZm9ybWVkTWV0YURhdGFXaXRoKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotICAgICAgICBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvciBza2lwVmFsaWRhdGlvbkV2YWx1YXRvciA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKCk7DQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yV2l0aChwcm9wZXJ0aWVzKTsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGE7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhUmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGFEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gdHJhbnNmb3JtTWV0YURhdGEoDQotICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblN0cmF0ZWd5LCBza2lwVmFsaWRhdGlvbkV2YWx1YXRvciwgbWV0YURhdGEsIGVudHJ5KTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKCFpc0NvbXBvbmVudEluaXRpYWxpemF0aW9uU2tpcHBlZChtZXRhRGF0YSwgZW50cnksIHZhbGlkYXRpb25TdHJhdGVneSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vZG9uJ3QgYnJlYWsgbWF5YmUgdGhlcmUgYXJlIGNvbnN0cmFpbnRzIHdoaWNoIGRvbid0IHN1cHBvcnQgdGhlIHNraXAtbWVjaGFuaXNtDQotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YVJlc3VsdC5wdXRBbGwobWV0YURhdGEpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhUmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEsIE1ldGFEYXRhRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmICghc2tpcFZhbGlkYXRpb25FdmFsdWF0b3Iuc2tpcFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblN0cmF0ZWd5LCBlbnRyeSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyID0gZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckZvclZhbGlkYXRpb25TdHJhdGVneSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIExPR0dFUi5kZWJ1ZyhtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWV0YURhdGEgPSBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAobWV0YURhdGEgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbWV0YURhdGE7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvbXBvbmVudEluaXRpYWxpemF0aW9uU2tpcHBlZChNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhLCBNZXRhRGF0YUVudHJ5IGVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YS5pc0VtcHR5KCkgfHwNCi0gICAgICAgICAgICAgICAgKEJvb2xlYW4uVFJVRS5lcXVhbHMoZW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCBCb29sZWFuLmNsYXNzKSkgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICBpc1NraXBhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKSkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpDQotICAgIHsNCi0gICAgICAgIC8vdG8gZGVhY3RpdmF0ZTogdGhlIHBhcmFtZXRlciBoYXMgdG8gYmUgZXhwbGljaXRseSBmYWxzZQ0KLSAgICAgICAgcmV0dXJuICEiZmFsc2UiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLklOVEVSUFJFVF9FTVBUWV9TVFJJTkdfU1VCTUlUVEVEX1ZBTFVFU19BU19OVUxMKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVFbXB0eUZpZWxkcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAhImZhbHNlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFBhcmFtZXRlci5WQUxJREFURV9FTVBUWV9GSUVMRFMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHlEZXRhaWxzIGdldFByb3BlcnR5RGV0YWlscyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvVGhyb3dWYWxpZGF0b3JFeGNlcHRpb25Gb3JDb21wb25lbnRJZCgNCi0gICAgICAgICAgICBTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpDQotICAgIHsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IGZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgdHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudCh0YXJnZXRDb21wb25lbnQsIGZhY2VzTWVzc2FnZSwgdGhyb3dhYmxlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudCgNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkNCi0gICAgew0KLSAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBpbnRlcnByZXRlciA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBpZiAoaW50ZXJwcmV0ZXIuc2V2ZXJpdHlDYXVzZXNWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh0aHJvd2FibGUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc01lc3NhZ2UsIHRocm93YWJsZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudCh1aUNvbXBvbmVudCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50SWQoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBVSUNvbXBvbmVudCB0YXJnZXRDb21wb25lbnQgPSBmaW5kQ29tcG9uZW50KGNsaWVudElkKTsNCi0NCi0gICAgICAgIGlmICh0YXJnZXRDb21wb25lbnQgPT0gbnVsbCAmJiBjbGllbnRJZCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvclRlc3RDbGllbnRJZChjbGllbnRJZCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICB0cnlUb0FkZFZpb2xhdGlvbk1lc3NhZ2VGb3JDb21wb25lbnQodGFyZ2V0Q29tcG9uZW50LCBmYWNlc01lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJyZXF1aXJlZCBmb3IgdGVzdCBmcmFtZXdvcmtzIC0gZ29hbDogcmVtb3ZlIGl0IikNCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0cnlUb0FkZFZpb2xhdGlvbk1lc3NhZ2VGb3JUZXN0Q2xpZW50SWQoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGludGVycHJldGVyID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIGlmIChpbnRlcnByZXRlci5zZXZlcml0eUNhdXNlc1Zpb2xhdGlvbk1lc3NhZ2UoZmFjZXNDb250ZXh0LCBudWxsLCBmYWNlc01lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkRmFjZXNNZXNzYWdlKGNsaWVudElkLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50KG51bGwsIGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBpbnRlcnByZXRlciA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBpZiAoaW50ZXJwcmV0ZXIuc2V2ZXJpdHlDYXVzZXNWaW9sYXRpb25NZXNzYWdlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGZhY2VzTWVzc2FnZS5nZXRTZXZlcml0eSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodWlDb21wb25lbnQgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFkZEZhY2VzTWVzc2FnZSh1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRGYWNlc01lc3NhZ2UobnVsbCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICB0cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnQodWlDb21wb25lbnQsIGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBhZGRGYWNlc01lc3NhZ2UobnVsbCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRmFjZXNNZXNzYWdlKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlU3RvcmFnZSBzdG9yYWdlID0gZ2V0U3RvcmFnZShGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLCBGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBpZiAoc3RvcmFnZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0b3JhZ2UuYWRkRmFjZXNNZXNzYWdlKGNsaWVudElkLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5hZGRNZXNzYWdlKGNsaWVudElkLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnRJZChTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IGZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgdHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50KHRhcmdldENvbXBvbmVudCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGludGVycHJldGVyID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIGlmIChpbnRlcnByZXRlci5zZXZlcml0eUJsb2Nrc05hdmlnYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5yZW5kZXJSZXNwb25zZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXZlcml0eUJsb2Nrc1N1Ym1pdEZvckNvbXBvbmVudElkKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBpbnRlcnByZXRlciA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBVSUNvbXBvbmVudCB0YXJnZXRDb21wb25lbnQgPSBmaW5kQ29tcG9uZW50KGNsaWVudElkKTsNCi0NCi0gICAgICAgIHJldHVybiBpbnRlcnByZXRlci5zZXZlcml0eUJsb2Nrc1N1Ym1pdChmYWNlc0NvbnRleHQsIHRhcmdldENvbXBvbmVudCwgZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCkpOw0KLSAgICB9DQotDQotICAgIC8vYXZhaWxhYmxlIGZvciBhZGQtb25zIC0gbm90IHVzZWQgaW50ZXJuYWxseSBkdWUgdG8gcGVyZm9ybWFuY2UgcmVhc29ucw0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2V2ZXJpdHlTaG93c0luZGljYXRpb25Gb3JDb21wb25lbnRJZChTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gZmluZENvbXBvbmVudChjbGllbnRJZCk7DQotDQotICAgICAgICByZXR1cm4gaW50ZXJwcmV0ZXIuc2V2ZXJpdHlTaG93c0luZGljYXRpb24oZmFjZXNDb250ZXh0LCB0YXJnZXRDb21wb25lbnQsIGZhY2VzTWVzc2FnZS5nZXRTZXZlcml0eSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBVSUNvbXBvbmVudCBmaW5kQ29tcG9uZW50KFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgICAgIGlmIChjbGllbnRJZCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldENvbXBvbmVudCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRhcmdldENvbXBvbmVudDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQHJldHVybiB0cnVlIGlmIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbiBmb3IgcmVxdWlyZWQgdmFsaWRhdGlvbiBpcyBhY3RpdmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25BY3RpdmUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFLmVxdWFscyhFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eSgibW9kZTppbml0OnJlcXVpcmVkIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBuZWVkZWQgZm9yIHNvbWUgY29tcG9uZW50IGxpYnMgLSBpZiByZXF1aXJlZCBpbml0aWFsaXphdGlvbiBpcyB1c2VkIGUuZy4gZm9yIHZpc3VhbCBpbmRpY2F0b3JzDQotICAgICAqIGJ1dCBmZWF0dXJlcyBsaWtlIHNldmVyaXR5IGF3YXJlIHZhbGlkYXRpb24gYXJlbid0IHVzZWQuDQotICAgICAqIGluIHN1Y2ggYSBjYXNlIGl0J3MgcG9zc2libGUgdG8gdXNlIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGUuDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuIGZhbHNlIHRvIGRlYWN0aXZhdGUgdGhlIGZpbmFsIHJlc2V0IG9mIHRoZSB2YWx1ZSBvZiB0aGUgcmVxdWlyZWQgYXR0cmlidXRlDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZXF1aXJlZFJlc2V0QWN0aXZhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRS5lcXVhbHMoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoIm1vZGU6cmVzZXQ6cmVxdWlyZWQiKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0U3RhZ2VOYW1lIGdldERlZmF1bHRTdGFnZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY3JlYXRlUHJvamVjdFN0YWdlTmFtZSgiUHJvZHVjdGlvbiIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdFN0YWdlTmFtZSBjcmVhdGVQcm9qZWN0U3RhZ2VOYW1lKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRGVmYXVsdFByb2plY3ROYW1lLmNyZWF0ZVByb2plY3RTdGFnZU5hbWUobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXh0VmFsRGVhY3RpdmF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoU3lzdGVtDQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSArDQotICAgICAgICAgICAgICAgICAgICAiLkRFQUNUSVZBVEVfQUxMIiwgImZhbHNlIikpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0dyb3VwVXRpbHMuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0dyb3VwVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwOTI4MS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Hcm91cFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEdyb3VwVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEdyb3VwS2V5KFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNsaWVudElkID09IG51bGwgPyB2aWV3SWQgOiB2aWV3SWQgKyAiQCIgKyBjbGllbnRJZDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvSnNmVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3NmVjYS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkZhY2VzSW5mb3JtYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY3RvcnlGaW5kZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGU7DQotaW1wb3J0IGphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGVGYWN0b3J5Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsNCi0NCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKc2ZVdGlscw0KLXsNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlcmVnaXN0ZXJQaGFzZUxpc3RlbmVyKFBoYXNlTGlzdGVuZXIgcGhhc2VMaXN0ZW5lcikNCi0gICAgew0KLSAgICAgICAgTGlmZWN5Y2xlRmFjdG9yeSBsaWZlY3ljbGVGYWN0b3J5ID0gKExpZmVjeWNsZUZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEZhY3RvcnlGaW5kZXIuTElGRUNZQ0xFX0ZBQ1RPUlkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRJZDsNCi0gICAgICAgIExpZmVjeWNsZSBjdXJyZW50TGlmZWN5Y2xlOw0KLSAgICAgICAgSXRlcmF0b3IgbGlmZWN5Y2xlSWRzID0gbGlmZWN5Y2xlRmFjdG9yeS5nZXRMaWZlY3ljbGVJZHMoKTsNCi0gICAgICAgIHdoaWxlIChsaWZlY3ljbGVJZHMuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRJZCA9IChTdHJpbmcpIGxpZmVjeWNsZUlkcy5uZXh0KCk7DQotICAgICAgICAgICAgY3VycmVudExpZmVjeWNsZSA9IGxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlKGN1cnJlbnRJZCk7DQotICAgICAgICAgICAgY3VycmVudExpZmVjeWNsZS5yZW1vdmVQaGFzZUxpc3RlbmVyKHBoYXNlTGlzdGVuZXIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlclBoYXNlTGlzdGVuZXIoUGhhc2VMaXN0ZW5lciBwaGFzZUxpc3RlbmVyKQ0KLSAgICB7DQotICAgICAgICBMaWZlY3ljbGVGYWN0b3J5IGxpZmVjeWNsZUZhY3RvcnkgPSAoTGlmZWN5Y2xlRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRmFjdG9yeUZpbmRlci5MSUZFQ1lDTEVfRkFDVE9SWSk7DQotDQotICAgICAgICBTdHJpbmcgY3VycmVudElkOw0KLSAgICAgICAgTGlmZWN5Y2xlIGN1cnJlbnRMaWZlY3ljbGU7DQotICAgICAgICBJdGVyYXRvciBsaWZlY3ljbGVJZHMgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZUlkcygpOw0KLSAgICAgICAgd2hpbGUgKGxpZmVjeWNsZUlkcy5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudElkID0gKFN0cmluZykgbGlmZWN5Y2xlSWRzLm5leHQoKTsNCi0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlID0gbGlmZWN5Y2xlRmFjdG9yeS5nZXRMaWZlY3ljbGUoY3VycmVudElkKTsNCi0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlLmFkZFBoYXNlTGlzdGVuZXIocGhhc2VMaXN0ZW5lcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIHJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoRmFjZXNNZXNzYWdlLkZBQ0VTX01FU1NBR0VTLCBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRDdXN0b21GYWNlc01lc3NhZ2VCdW5kbGUoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgU3RyaW5nIGJ1bmRsZU5hbWUgPSBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5nZXRNZXNzYWdlQnVuZGxlKCk7DQotDQotICAgICAgICBpZiAoYnVuZGxlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShidW5kbGVOYW1lLCBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZUZyb21BcHBsaWNhdGlvbk1lc3NhZ2VCdW5kbGUoU3RyaW5nIG1lc3NhZ2VLZXkpDQotICAgIHsNCi0gICAgICAgIFJlc291cmNlQnVuZGxlIGN1c3RvbVJlc291cmNlQnVuZGxlID0gZ2V0Q3VzdG9tRmFjZXNNZXNzYWdlQnVuZGxlKCk7DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoY3VzdG9tUmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjdXN0b21SZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcobWVzc2FnZUtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vbm8gY3VzdG9tIG1lc3NhZ2UgaXMgYXZhaWxhYmxlIC0gZG8gbm90aGluZw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcobWVzc2FnZUtleSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVuZGVyUmVzcG9uc2VQaGFzZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLlJFTkRFUl9SRVNQT05TRS5lcXVhbHMoZ2V0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UoKS5nZXRDdXJyZW50UGhhc2VJZCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFBoYXNlSWQgZ2V0Q3VycmVudFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UoKS5nZXRDdXJyZW50UGhhc2VJZCgpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBzaW1wbGUgdGVzdCBmb3IgZWFybHkgY29uZmlnIGluIGNhc2Ugb2YgbW9qYXJyYQ0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGpzZiBpbXBsLiBpcyBpbml0aWFsaXplZCBhbmQgaXQncyBwb3NzaWJsZSB0byB1c2UgaXQgYXMgZXhwZWN0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FwcGxpY2F0aW9uSW5pdGlhbGl6ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldENsYXNzKCkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIm9yZy5hcGFjaGUubXlmYWNlcyIpIHx8DQotICAgICAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICFGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLmlzRW1wdHkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBGYWNlc0luZm9ybWF0aW9uU3RvcmFnZSBnZXRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLCBGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Byb3h5VXRpbHMuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Byb3h5VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc1YzIzZS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Qcm94eVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHkuUHJveHlIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5LkRlZmF1bHRQcm94eUhlbHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJveHlVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgUHJveHlIZWxwZXIgcHJveHlIZWxwZXI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IENsYXNzPFQ+IGdldFVucHJveGllZENsYXNzKENsYXNzIGN1cnJlbnRDbGFzcywgQ2xhc3M8VD4gdGFyZ2V0VHlwZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFByb3h5SGVscGVyKCkuZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudENsYXNzLCB0YXJnZXRUeXBlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldFVucHJveGllZENsYXNzKENsYXNzIGN1cnJlbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFByb3h5SGVscGVyKCkuZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudENsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGFzc05hbWUoQ2xhc3MgcHJveGllZENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UHJveHlIZWxwZXIoKS5nZXROYW1lT2ZDbGFzcyhwcm94aWVkQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsYXNzTmFtZU9mT2JqZWN0KE9iamVjdCBwcm94aWVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UHJveHlIZWxwZXIoKS5nZXRDbGFzc05hbWVPZk9iamVjdChwcm94aWVkT2JqZWN0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UHJveHlIZWxwZXIoKS5pc1Byb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb3hpZWRPYmplY3QoT2JqZWN0IHByb3hpZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRQcm94eUhlbHBlcigpLmlzUHJveGllZE9iamVjdChwcm94aWVkT2JqZWN0KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBQcm94eUhlbHBlciBnZXRQcm94eUhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmIChwcm94eUhlbHBlciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vd29ya2Fyb3VuZCBmb3IgbW9qYXJyYQ0KLSAgICAgICAgICAgIGlmKCFKc2ZVdGlscy5pc0FwcGxpY2F0aW9uSW5pdGlhbGl6ZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFByb3h5SGVscGVyKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByb3h5SGVscGVyID0gY3JlYXRlUHJveHlIZWxwZXIoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBwcm94eUhlbHBlcjsNCi0gICAgfQ0KLQ0KLSAgICAvL2Rvbid0IHVzZSB0aGUgZGVmYXVsdCBhcHByb2FjaCAoZmFjdG9yeSBmaW5kZXIpIC0gUHJveHlIZWxwZXIgaXMgY2FsbGVkIHRvbyBvZnRlbi4uLg0KLSAgICBwcml2YXRlIHN0YXRpYyBQcm94eUhlbHBlciBjcmVhdGVQcm94eUhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjdXN0b21Qcm94eUhlbHBlckNsYXNzTmFtZSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fUFJPWFlfSEVMUEVSOw0KLQ0KLSAgICAgICAgUHJveHlIZWxwZXIgcmVzdWx0ID0gbnVsbDsNCi0gICAgICAgIGlmKGN1c3RvbVByb3h5SGVscGVyQ2xhc3NOYW1lICE9IG51bGwgJiYgISIiLmVxdWFscyhjdXN0b21Qcm94eUhlbHBlckNsYXNzTmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gKFByb3h5SGVscGVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjdXN0b21Qcm94eUhlbHBlckNsYXNzTmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBuZXcgRGVmYXVsdFByb3h5SGVscGVyKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1JlZmxlY3Rpb25VdGlscy5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMDYyYmYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBSZWZsZWN0aW9uVXRpbHMKLXsKLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCB0cnlUb0dldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ5VG9HZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIHRyeVRvR2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0TWV0aG9kTmFtZSwgQ2xhc3MuLi4gcGFyYW1ldGVyVHlwZXMpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldE1ldGhvZCh0YXJnZXRDbGFzcywgdGFyZ2V0TWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUpCi0gICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUsIENsYXNzLi4uIHBhcmFtZXRlclR5cGVzKQotICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSB0YXJnZXRDbGFzczsKLSAgICAgICAgTWV0aG9kIHRhcmdldE1ldGhvZCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAoIU9iamVjdC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0YXJnZXRNZXRob2QgPSBjdXJyZW50Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QodGFyZ2V0TWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50SW50ZXJmYWNlIDogdGFyZ2V0Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRJbnRlcmZhY2U7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudENsYXNzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gY3VycmVudENsYXNzLmdldERlY2xhcmVkTWV0aG9kKHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudENsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0TWV0aG9kOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbigidGhlcmUgaXMgbm8gbWV0aG9kIHdpdGggdGhlIG5hbWUgJyIgKyB0YXJnZXRNZXRob2ROYW1lICsgIiciICsKLSAgICAgICAgICAgICAgICAiIGNsYXNzOiAiICsgdGFyZ2V0Q2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvSW52b2tlTWV0aG9kKHRhcmdldCwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvSW52b2tlTWV0aG9kT2ZDbGFzcyh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kT2ZDbGFzcyh0YXJnZXQsIG1ldGhvZCwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldC5uZXdJbnN0YW5jZSgpLCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kLCBPYmplY3QuLi4gYXJncykKLSAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0Lm5ld0luc3RhbmNlKCksIG1ldGhvZCwgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldCwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgewotICAgICAgICBtZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2UodGFyZ2V0LCBhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKE9iamVjdCBiYXNlT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlDaGFpbikKLSAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHByb3BlcnR5Q2hhaW4sICIuIik7Ci0KLSAgICAgICAgT2JqZWN0IGN1cnJlbnRCYXNlID0gYmFzZU9iamVjdDsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnRQcm9wZXJ0eTsKLSAgICAgICAgTWV0aG9kIGN1cnJlbnRNZXRob2Q7Ci0KLSAgICAgICAgd2hpbGUodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudFByb3BlcnR5ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCi0gICAgICAgICAgICAvL2lnbm9yZSB0aGUgbGFzdCBwcm9wZXJ0eQotICAgICAgICAgICAgaWYoIXRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vbm8gaXMgLSBpdCdzIG9ubHkgcG9zc2libGUgYXQgcHJvcGVydGllcyBub3QgYXQgYmVhbiBsZXZlbAotICAgICAgICAgICAgY3VycmVudE1ldGhvZCA9IHRyeVRvR2V0TWV0aG9kKFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudEJhc2UuZ2V0Q2xhc3MoKSksCi0gICAgICAgICAgICAgICAgImdldCIgKyBjdXJyZW50UHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50UHJvcGVydHkuc3Vic3RyaW5nKDEsIGN1cnJlbnRQcm9wZXJ0eS5sZW5ndGgoKSkpOwotICAgICAgICAgICAgY3VycmVudEJhc2UgPSB0cnlUb0ludm9rZU1ldGhvZChjdXJyZW50QmFzZSwgY3VycmVudE1ldGhvZCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY3VycmVudEJhc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvV2ViWG1sVXRpbHMuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1dlYlhtbFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMDc2OWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvV2ViWG1sVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgV2ViWG1sVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEluaXRQYXJhbWV0ZXIoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEluaXRQYXJhbWV0ZXIoRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCwga2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZSA9IG5hbWU7DQotICAgICAgICBpZihwcmVmaXggIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwYXJhbWV0ZXJOYW1lID0gcHJlZml4ICsgIi4iICsgbmFtZTsNCi0gICAgICAgIH0NCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRJbml0UGFyYW1ldGVyKHBhcmFtZXRlck5hbWUpOw0KLSAgICAgICAgcmV0dXJuICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlLnJlcGxhY2UoIiAiLCAiIikudHJpbSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQwOTJmYi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlIE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlIE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUgTW9kdWxlIHByb3ZpZGVzIGFuIGV4dGVuc2libGUgdmFsaWRhdGlvbiBwbGF0Zm9ybSB0byBpbXBsZW1lbnQgdmFsaWRhdGlvbiBiYXNlZCBvbiBtZXRhLWRhdGEuDQotICAgIEJhc2VkIG9uIHRoaXMgbW9kdWxlIGl0IGlzIHBvc3NpYmxlIHRvIGltcGxlbWVudCB2YWxpZGF0aW9uIG1vZHVsZXMuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLnggYW5kIEpTRiAyLnguIEFsbCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI1NjZmYS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEV4YW1wbGVzIEFzc2VtYmx5PC9uYW1lPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1leGFtcGxlcy1hc3NlbWJseTEyPC9hcnRpZmFjdElkPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRlcGVuZGVuY3ktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktd2FyPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fd29ybGQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+CQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWZlYXR1cmUtc2V0XzAxPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS93YXI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1zcmM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1oZWxsb193b3JsZDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPmphdmEtc291cmNlPC90eXBlPiAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPmphdmEtc291cmNlPC90eXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zcmM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tIEVYRUNVVEUgbXZuIHBhY2thZ2UgdG8gZ2VuZXJhdGUgYXNzZW1ibHkgZmlsZXMgLS0+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X3NyYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXNzZW1ibHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPiAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5teWZhY2VzLWV4dHZhbC1leGFtcGxlcy0ke3Byb2plY3QudmVyc2lvbn0tc3JjPC9maW5hbE5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9iaW48L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmFzc2VtYmx5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLQkgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotCSAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4gICAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbDwvZGVzY3JpcHRvcj4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotCSAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwtZXhhbXBsZXMtJHtwcm9qZWN0LnZlcnNpb259PC9maW5hbE5hbWU+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS93b3JrPC93b3JrRGlyZWN0b3J5PgotCSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQkgICAgCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD53YWdvbi1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxpZD5teWZhY2VzLW5pZ2h0bHktYnVpbGRzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9taW5vdGF1ci5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9idWlsZHMvbXlmYWNlcy9uaWdodGx5PC91cmw+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9vdXQ8L2lucHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotCi0gICAgICAgIDwvcGx1Z2lucz4KLQotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBmN2I4MS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08YXNzZW1ibHk+Ci0gIDxpZD5iaW48L2lkPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4JCi0gIDxmaWxlU2V0cz4gICAgCi0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC93YXI8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPioud2FyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+ICAgICAKLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NzBjY2MuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+c3JjPC9pZD4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+CQotICA8ZmlsZVNldHM+ICAgIAotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvc3JjPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLmphcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPioudHh0PC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1YjNhNS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZjM2M2EuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IKLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3BvbS54bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNDE0Y2MuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBmZWF0dXJlLXNldCAwMTwvbmFtZT4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmZhY2VsZXRzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzZi1mYWNlbGV0czwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMTQ8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDwhLS0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgLS0+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudG9tYWhhd2s8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dG9tYWhhd2s8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjY8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2N1c3RvbS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2N1c3RvbS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MDFkZjcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jdXN0b20vdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLSMgdGhpcyBtZXNzYWdlIGJ1bmRsZSBpcyBwaWNrZWQgdXAgdmlhIGNvbnZlbnRpb24NCi1yZXBlYXRlZF9wYXNzd29yZF9yZXF1aXJlZD1wbGVhc2UgcmV0eXBlIHRoZSBwYXNzd29yZA0KLXJlcGVhdGVkX3Bhc3N3b3JkX3JlcXVpcmVkX2RldGFpbD1wbGVhc2UgcmV0eXBlIHRoZSBwYXNzd29yZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjUxMWRlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJc1R5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLk5vdEVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlRlbXBvcmFsOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbFR5cGU7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLXB1YmxpYyBjbGFzcyBQZXJzb24NCi17DQotICAgIEBMZW5ndGgobWluaW11bSA9IDIpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMjApDQotICAgIEBOb3RFcXVhbHMoImxhc3ROYW1lIikNCi0gICAgQFBhdHRlcm4oIltBLVpdW2Etel0rIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOw0KLQ0KLSAgICBAUmVxdWlyZWQocGFyYW1ldGVycyA9IERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykNCi0gICAgQExlbmd0aChtaW5pbXVtID0gMiwgcGFyYW1ldGVycyA9IERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykNCi0gICAgQENvbHVtbihsZW5ndGggPSAyMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7DQotDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwKQ0KLSAgICBwcml2YXRlIFN0cmluZyByb2xlID0gInVzZXIiOw0KLQ0KLSAgICBARGF0ZUlzKHR5cGUgPSBEYXRlSXNUeXBlLmJlZm9yZSwgdmFsdWVPZiA9ICJmaW5hbEV4YW0iKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIEBUZW1wb3JhbChUZW1wb3JhbFR5cGUuREFURSkNCi0gICAgcHJpdmF0ZSBEYXRlIGJpcnRoZGF5Ow0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIEBUZW1wb3JhbChUZW1wb3JhbFR5cGUuREFURSkNCi0gICAgcHJpdmF0ZSBEYXRlIGZpbmFsRXhhbTsNCi0NCi0gICAgQExlbmd0aChtaW5pbXVtID0gMikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmlja05hbWU7DQotDQotICAgIEBMZW5ndGgobWluaW11bSA9IDYpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gNjApDQotICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIHByaXZhdGUgaW50IG51bWJlck9mU2libGluZ3M7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByb2xlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFJvbGUoU3RyaW5nIHJvbGUpDQotICAgIHsNCi0gICAgICAgIHRoaXMucm9sZSA9IHJvbGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0QmlydGhkYXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmlydGhkYXk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0QmlydGhkYXkoRGF0ZSBiaXJ0aGRheSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5iaXJ0aGRheSA9IGJpcnRoZGF5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldEZpbmFsRXhhbSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmaW5hbEV4YW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RmluYWxFeGFtKERhdGUgZmluYWxFeGFtKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpbmFsRXhhbSA9IGZpbmFsRXhhbTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5pY2tOYW1lKFN0cmluZyBuaWNrTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uaWNrTmFtZSA9IG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNpYmxpbmdzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG51bWJlck9mU2libGluZ3M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyT2ZTaWJsaW5ncyhpbnQgbnVtYmVyT2ZTaWJsaW5ncykNCi0gICAgew0KLSAgICAgICAgdGhpcy5udW1iZXJPZlNpYmxpbmdzID0gbnVtYmVyT2ZTaWJsaW5nczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjc0NDIzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmd1aS5iZWFuczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluLlBlcnNvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5Ob3RFcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTG9uZ1JhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmN1c3RvbS5lbWFpbHZhbGlkYXRvci5FbWFpbFZhbGlkYXRvcjsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uUGFnZQ0KLXsNCi0NCi0gICAgLy90aGUgb2xkIHBhc3N3b3JkIG9mIHRoZSBwZXJzb24gaXNuJ3QgdXNlZCB3aXRoaW4gdGhlIHBhZ2UNCi0gICAgLy8tPiB2YWxpZGF0ZSB3aXRoIHZhbHVlIG9mIHRoZSBtb2RlbA0KLSAgICBAU2tpcFZhbGlkYXRpb24oIiN7cGVyc29uLnJvbGUgZXEgJ2FkbWluJ30iKQ0KLSAgICBAUmVxdWlyZWQNCi0gICAgQEVxdWFscygicGVyc29uLnBhc3N3b3JkIikNCi0gICAgQE5vdEVxdWFscygicGFzc3dvcmQiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBvbGRQYXNzd29yZDsNCi0NCi0gICAgQEVxdWFscygicGFzc3dvcmRSZXBlYXRlZCIpDQotICAgIC8vY29tYmluZSBndWkgcmVsYXRlZCBhbm5vdGF0aW9ucyB3aXRoIHRoZSBhbm5vYXRpb25zIG9mIHRoZSBkb21haW4gbW9kZWwNCi0gICAgQEpvaW5WYWxpZGF0aW9uKHZhbHVlID0gIiN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ucGFzc3dvcmR9IikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7DQotDQotICAgIEBSZXF1aXJlZCh2YWxpZGF0aW9uRXJyb3JNc2dLZXkgPSAicmVwZWF0ZWRfcGFzc3dvcmRfcmVxdWlyZWQiLA0KLSAgICAgICAgICAgIHBhcmFtZXRlcnMgPSB7RGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLCBWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzfSkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmRSZXBlYXRlZDsNCi0NCi0gICAgLy91c2UgI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5uaWNrTmFtZX0sICN7cGVyc29uLm5pY2tOYW1lfQ0KLSAgICAvL3VzZSByZWdpc3RyYXRpb25QYWdlIHRvIGRpc3BsYXkgdGhlIHNlY29uZCBlcnJvciBtZXNzYWdlIGF0IG9sZCBuaWNrbmFtZQ0KLSAgICAvL29yIGxvY2FsIHByb3BlcnR5IGNoYWluaW5nICh0byBhdm9pZCB0aGUgdXNhZ2Ugb2YgdGhlIGJlYW4gbmFtZSkgLSBsaWtlOg0KLSAgICBAU2tpcFZhbGlkYXRpb24oIiN7cGVyc29uLnJvbGUgZXEgJ2FkbWluJ30iKQ0KLSAgICBATm90RXF1YWxzKCJwZXJzb24ubmlja05hbWUiKQ0KLSAgICBASm9pblZhbGlkYXRpb24oInBlcnNvbi5uaWNrTmFtZSIpDQotICAgIHByaXZhdGUgU3RyaW5nIG5ld05pY2tOYW1lOw0KLQ0KLSAgICBwcml2YXRlIFBlcnNvbiBwZXJzb247DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZmluaXNoKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0UGFzc3dvcmQodGhpcy5wYXNzd29yZCk7DQotICAgICAgICByZXR1cm4gImhvbWUiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgdXBkYXRlTmlja05hbWUoKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXROaWNrTmFtZSh0aGlzLm5ld05pY2tOYW1lKTsNCi0gICAgICAgIHJldHVybiAiaG9tZSI7DQotICAgIH0NCi0NCi0gICAgLy9qdXN0IGEgcXVpY2sgaWxsdXN0cmF0aW9uIG9mIHNraXBWYWxpZGF0aW9uDQotICAgIHB1YmxpYyBTdHJpbmcgc3dpdGNoTW9kZSgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50Um9sZSA9IHRoaXMucGVyc29uLmdldFJvbGUoKTsNCi0NCi0gICAgICAgIGlmKGN1cnJlbnRSb2xlLmVxdWFscygiYWRtaW4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnBlcnNvbi5zZXRSb2xlKCJ1c2VyIik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5wZXJzb24uc2V0Um9sZSgiYWRtaW4iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAiIjsNCi0gICAgfQ0KLQ0KLSAgICBASm9pblZhbGlkYXRpb24oIm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb246ZW1haWwiKQ0KLSAgICBAVmFsaWRhdG9yKEVtYWlsVmFsaWRhdG9yLmNsYXNzKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uLmdldEVtYWlsKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXRFbWFpbChlbWFpbCk7DQotICAgIH0NCi0NCi0gICAgQEpvaW5WYWxpZGF0aW9uKCIje3BlcnNvbi5udW1iZXJPZlNpYmxpbmdzfSIpDQotICAgIEBMb25nUmFuZ2UobWF4aW11bSA9IDIwKQ0KLSAgICBwdWJsaWMgaW50IGdldE51bWJlck9mU2libGluZ3MoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5wZXJzb24uZ2V0TnVtYmVyT2ZTaWJsaW5ncygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlck9mU2libGluZ3MoaW50IG51bWJlck9mU2libGluZ3MpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldE51bWJlck9mU2libGluZ3MobnVtYmVyT2ZTaWJsaW5ncyk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9sZFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG9sZFBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE9sZFBhc3N3b3JkKFN0cmluZyBvbGRQYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5vbGRQYXNzd29yZCA9IG9sZFBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZFJlcGVhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkUmVwZWF0ZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRSZXBlYXRlZChTdHJpbmcgcGFzc3dvcmRSZXBlYXRlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZFJlcGVhdGVkID0gcGFzc3dvcmRSZXBlYXRlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwZXJzb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbiBwZXJzb24pDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uID0gcGVyc29uOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmV3Tmlja05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3Tmlja05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TmV3Tmlja05hbWUoU3RyaW5nIG5ld05pY2tOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm5ld05pY2tOYW1lID0gbmV3Tmlja05hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0IGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxOGQ2Ni4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCIKLSAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4KLSAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgIDwhLS0gdHJpbmlkYWQgLS0+Ci0gICAgICAgIDxkZWZhdWx0LXJlbmRlci1raXQtaWQ+Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29yZQotICAgICAgICA8L2RlZmF1bHQtcmVuZGVyLWtpdC1pZD4KLQotICAgIDwvYXBwbGljYXRpb24+Ci0KLSAgICA8bWFuYWdlZC1iZWFuPgotICAgICAgICA8bWFuYWdlZC1iZWFuLW5hbWU+cmVnaXN0cmF0aW9uUGFnZTwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZ3VpLmJlYW5zLlJlZ2lzdHJhdGlvblBhZ2U8L21hbmFnZWQtYmVhbi1jbGFzcz4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0KLSAgICAgICAgPG1hbmFnZWQtcHJvcGVydHk+Ci0gICAgICAgICAgICA8cHJvcGVydHktbmFtZT5wZXJzb248L3Byb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8dmFsdWU+I3twZXJzb259PC92YWx1ZT4KLSAgICAgICAgPC9tYW5hZ2VkLXByb3BlcnR5PgotICAgIDwvbWFuYWdlZC1iZWFuPgotCi0gICAgPG1hbmFnZWQtYmVhbj4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1uYW1lPnBlcnNvbjwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluLlBlcnNvbjwvbWFuYWdlZC1iZWFuLWNsYXNzPgotICAgICAgICA8bWFuYWdlZC1iZWFuLXNjb3BlPnNlc3Npb248L21hbmFnZWQtYmVhbi1zY29wZT4KLSAgICA8L21hbmFnZWQtYmVhbj4KLQotICAgIDxuYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgICAgIDxmcm9tLXZpZXctaWQ+L3BhZ2VzL2hvbWUueGh0bWw8L2Zyb20tdmlldy1pZD4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+YWRkVXNlcjwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmNoYW5nZU5pY2tOYW1lPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+Y2hhbmdlUGFzc3dvcmQ8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgIDwvbmF2aWdhdGlvbi1ydWxlPgotICAgIDxuYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgICAgIDxmcm9tLXZpZXctaWQ+KjwvZnJvbS12aWV3LWlkPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5ob21lPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvaG9tZS54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgPC9uYXZpZ2F0aW9uLXJ1bGU+Ci08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzM5MzY2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgZmFjZWxldC10YWdsaWIgUFVCTElDCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRmFjZWxldCBUYWdsaWIgMS4wLy9FTiIKLSAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2ZhY2VsZXQtdGFnbGliXzFfMC5kdGQiPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlbGV0LXRhZ2xpYj4KLSAgICA8bmFtZXNwYWNlPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0dmFsL2RlbW8vY29tcG9uZW50czwvbmFtZXNwYWNlPgotCi0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPnVzZXJGb3JtPC90YWctbmFtZT4KLSAgICAgICAgPHNvdXJjZT4KLSAgICAgICAgICAgIC4uL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sCi0gICAgICAgIDwvc291cmNlPgotICAgIDwvdGFnPgotCi08L2ZhY2VsZXQtdGFnbGliPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjMDFhYS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLSAgICAgICAgIHZlcnNpb249IjIuNCI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+TXlQcm9qZWN0IHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkRFRkFVTFRfU1VGRklYPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+LnhodG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+ZmFjZWxldHMuTElCUkFSSUVTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L1dFQi1JTkYvbWFpbi50YWdsaWIueG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkVOQUJMRV9MSUdIVFdFSUdIVF9ESUFMT0dTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5ESVNBQkxFX0NPTlRFTlRfQ09NUFJFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkFMVEVSTkFURV9WSUVXX0hBTkRMRVI8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jb20uc3VuLmZhY2VsZXRzLkZhY2VsZXRWaWV3SGFuZGxlcjwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5VU0VfQVBQTElDQVRJT05fVklFV19DQUNIRTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkNIQU5HRV9QRVJTSVNURU5DRTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnNlc3Npb248L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+U3RhdGUgc2F2aW5nIG1ldGhvZDogImNsaWVudCIgb3IgInNlcnZlciIgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIFNlZSBKU0YgU3BlY2lmaWNhdGlvbiAyLjUuMwotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIGFtb3VudCAoZGVmYXVsdCA9IDIwKSBvZiB0aGUgbGF0ZXN0IHZpZXdzIGFyZSBzdG9yZWQgaW4gc2Vzc2lvbi4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLk5VTUJFUl9PRl9WSUVXU19JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpIGFuZCBpZgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OIGlzIHRydWUgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzZXJpYWxpemVkIHN0YXRlIHdpbGwgYmUgY29tcHJlc3NlZCBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBjb21wcmVzc2VkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcGFyYW1ldGVyIHRlbGxzIE15RmFjZXMgaWYgamF2YXNjcmlwdCBjb2RlIHNob3VsZCBiZSBhbGxvd2VkIGluIHRoZQotICAgICAgICAgICAgcmVuZGVyZWQgSFRNTCBvdXRwdXQuCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUKLSAgICAgICAgICAgIHRoYXQgc3VibWl0cyB0aGUgY29ycmVzcG9uZGluZyBmb3JtLgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBub3QgYWxsb3dlZCwgdGhlIHN0YXRlIHNhdmluZyBpbmZvIGFuZCBuZXN0ZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLgotICAgICAgICAgICAgaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90Ci0gICAgICAgICAgICBpbmZsdWVuY2UgdGhlIEhUTUwgY29kZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUFJFVFRZX0hUTUw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCBhIGphdmFzY3JpcHQgZnVuY3Rpb24gd2lsbCBiZSByZW5kZXJlZCB0aGF0IGlzIGFibGUgdG8gcmVzdG9yZSB0aGUKLSAgICAgICAgICAgIGZvcm1lciB2ZXJ0aWNhbCBzY3JvbGwgb24gZXZlcnkgcmVxdWVzdC4gQ29udmVuaWVudCBmZWF0dXJlIGlmIHlvdSBoYXZlIHBhZ2VzCi0gICAgICAgICAgICB3aXRoIGxvbmcgbGlzdHMgYW5kIHlvdSBkbyBub3Qgd2FudCB0aGUgYnJvd3NlciBwYWdlIHRvIGFsd2F5cyBqdW1wIHRvIHRoZSB0b3AKLSAgICAgICAgICAgIGlmIHlvdSB0cmlnZ2VyIGEgbGluayBvciBidXR0b24gYWN0aW9uIHRoYXQgc3RheXMgb24gdGhlIHNhbWUgcGFnZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJmYWxzZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFVVE9fU0NST0xMPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Vc2VkIGZvciBlbmNyeXB0aW5nIHZpZXcgc3RhdGUuIE9ubHkgcmVsZXZhbnQgZm9yIGNsaWVudCBzaWRlCi0gICAgICAgICAgICBzdGF0ZSBzYXZpbmcuIFNlZSBNeUZhY2VzIHdpa2kvd2ViIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRUNSRVQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWYWxpZGF0ZSBtYW5hZ2VkIGJlYW5zLCBuYXZpZ2F0aW9uIHJ1bGVzIGFuZCBlbnN1cmUgdGhhdCBmb3JtcyBhcmUgbm90IG5lc3RlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlZBTElEQVRFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPCEtLSBMaXN0ZW5lciwgdG8gYWxsb3cgSmV0dHkgc2VydmluZyBNeUZhY2VzIGFwcHMgLS0+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLndlYmFwcC5TdGFydHVwU2VydmxldENvbnRleHRMaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+Ci0gICAgPC9saXN0ZW5lcj4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCAtLT4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICAgIDwvc2VydmxldD4KLQotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPnJlc291cmNlczwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlJlc291cmNlU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8ZmlsdGVyPgotICAgICAgICA8ZmlsdGVyLW5hbWU+dHJpbmlkYWQ8L2ZpbHRlci1uYW1lPgotICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC53ZWJhcHAuVHJpbmlkYWRGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KLSAgICA8L2ZpbHRlcj4KLQotICAgIDxmaWx0ZXItbWFwcGluZz4KLSAgICAgICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgPC9maWx0ZXItbWFwcGluZz4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCBNYXBwaW5ncyAtLT4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9mYWNlcy8qPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+cmVzb3VyY2VzPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4vYWRmLyo8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPCEtLSBXZWxjb21lIGZpbGVzIC0tPgotICAgIDx3ZWxjb21lLWZpbGUtbGlzdD4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+Ci0gICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KLQotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiYzkxYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyIKLSAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiCi0gICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIgotICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiCi0gICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+Ci0KLTx1aTpjb21wb3NpdGlvbj4KLSAgICA8dHI6cGFuZWxGb3JtTGF5b3V0PgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im5pY2sgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb25bICduaWNrTmFtZScgXX0iLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0iZS1tYWlsIiB2YWx1ZT0iI3tiZWFuLmVtYWlsfSIvPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9ImZpcnN0IG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uLmZpcnN0TmFtZX0iLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibGFzdCBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5sYXN0TmFtZX0iLz4KLSAgICAgICAgPCEtLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJsYXN0IG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uLmxhc3ROYW1lfSIgcmVxdWlyZWRNZXNzYWdlRGV0YWlsPSJ7MH0gaXMgcmVxdWlyZWQiLz4KLSAgICAgICAgLS0+Ci0gICAgICAgIDx0cjppbnB1dERhdGUgbGFiZWw9ImJpcnRoZGF5IiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5iaXJ0aGRheX0iPgotICAgICAgICAgICAgPHRyOmNvbnZlcnREYXRlVGltZSB0eXBlPSJkYXRlIiBwYXR0ZXJuPSJkZC5NTS55eXl5Ii8+Ci0gICAgICAgIDwvdHI6aW5wdXREYXRlPgotICAgICAgICA8dHI6aW5wdXREYXRlIGxhYmVsPSJmaW5hbCBleGFtIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5maW5hbEV4YW19Ij4KLSAgICAgICAgICAgIDx0cjpjb252ZXJ0RGF0ZVRpbWUgdHlwZT0iZGF0ZSIgcGF0dGVybj0iZGQuTU0ueXl5eSIvPgotICAgICAgICA8L3RyOmlucHV0RGF0ZT4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJudW1iZXIgb2Ygc2libGluZ3MiIHZhbHVlPSIje2JlYW4ubnVtYmVyT2ZTaWJsaW5nc30iLz4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJwYXNzd29yZCIgdmFsdWU9IiN7YmVhbi5wYXNzd29yZH0iIHNlY3JldD0idHJ1ZSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJyZS1lbnRlciBwYXNzd29yZCIgdmFsdWU9IiN7YmVhbi5wYXNzd29yZFJlcGVhdGVkfSIgc2VjcmV0PSJ0cnVlIi8+Ci0KLSAgICA8L3RyOnBhbmVsRm9ybUxheW91dD4KLTwvdWk6Y29tcG9zaXRpb24+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjZDE0OC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotICAgICAgICANCi08aHRtbD4NCi0NCi08aGVhZD4NCi0gICAgPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDsgVVJMPWZhY2VzL3BhZ2VzL2hvbWUueGh0bWwiPg0KLTwvaGVhZD4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGMxZWE4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTx0cjpkb2N1bWVudA0KLSAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIg0KLSAgICAgICAgeG1sbnM6Yz0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3RsL2NvcmUiPg0KLSAgICA8ZjpmYWNldCBuYW1lPSJtZXRhQ29udGFpbmVyIj4NCi0gICAgICAgIDx0aXRsZT5zZXYtZW4gZmVhdHVyZS1zZXQgZGVtbyAwMTwvdGl0bGU+DQotICAgIDwvZjpmYWNldD4NCi0NCi0gICAgPHRyaDpib2R5Pg0KLQ0KLSAgICAgICAgPCEtLSBvcmlnaW5hbCAtLT4NCi0gICAgICAgIDxkaXYgaWQ9IndyYXAiPg0KLQ0KLSAgICAgICAgICAgIDx0cjpmb3JtIGlkPSJmb3JtIiBkZWZhdWx0Q29tbWFuZD0iZGVmYXVsdEJ1dHRvbiI+DQotICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1haW4iPg0KLSAgICAgICAgICAgICAgICAgICAgPHVpOmluc2VydCBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ1bmRlcl9jb25zdHJ1Y3Rpb24iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+IXNpdGUgdW5kZXIgY29uc3RydWN0aW9uITwvaDI+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBjb250ZW50IG9mIHRoaXMgc2l0ZSBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSBtb21lbnQuPC9wPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC91aTppbnNlcnQ+DQotICAgICAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICAgIDwvdHI6Zm9ybT4NCi0gICAgICAgICAgICA8dHI6bWVzc2FnZXMgZ2xvYmFsT25seT0idHJ1ZSIvPg0KLQ0KLSAgICAgICAgPC9kaXY+DQotICAgIDwvdHJoOmJvZHk+DQotDQotDQotPC90cjpkb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OTNmYWUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDx0cjpwYW5lbEZvcm1MYXlvdXQ+DQotDQotICAgICAgICAgICAgPHVpOnJlbW92ZT4NCi0gICAgICAgICAgICAgICAganVzdCBmb3IgdGhlIGRlbW8gd2UgYXJlIHVzaW5nIHR3byBpbnB1dCBjb21wb25lbnRzDQotICAgICAgICAgICAgPC91aTpyZW1vdmU+DQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ib2xkIG5pY2sgbmFtZSIgcmVhZE9ubHk9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLm5pY2tOYW1lfSIvPg0KLQ0KLSAgICAgICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im5pY2sgbmFtZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5uZXdOaWNrTmFtZX0iLz4NCi0NCi0gICAgICAgIDwvdHI6cGFuZWxGb3JtTGF5b3V0Pg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UudXBkYXRlTmlja05hbWV9Ii8+DQotDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMDk3NWEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDx0YWJsZT4NCi0gICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6b3V0cHV0TGFiZWwgdmFsdWU9Im9sZCBwYXNzd29yZCIgZm9yPSJvbGRfcGFzc3dvcmQiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOmlucHV0VGV4dCBpZD0ib2xkX3Bhc3N3b3JkIiBzaW1wbGU9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2Uub2xkUGFzc3dvcmR9IiBzZWNyZXQ9InRydWUiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm1lc3NhZ2UgZm9yPSJvbGRfcGFzc3dvcmQiLz48L3RkPg0KLSAgICAgICAgICAgIDwvdHI+DQotDQotICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm91dHB1dExhYmVsIHZhbHVlPSJuZXcgcGFzc3dvcmQiIGZvcj0ibmV3X3Bhc3N3b3JkIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjppbnB1dFRleHQgaWQ9Im5ld19wYXNzd29yZCIgc2ltcGxlPSJ0cnVlIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjptZXNzYWdlIGZvcj0ibmV3X3Bhc3N3b3JkIi8+PC90ZD4NCi0gICAgICAgICAgICA8L3RyPg0KLQ0KLSAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjpvdXRwdXRMYWJlbCB2YWx1ZT0icmUtZW50ZXIgcGFzc3dvcmQiIGZvcj0icmVlbnRlcmVkIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjppbnB1dFRleHQgaWQ9InJlZW50ZXJlZCIgc2ltcGxlPSJ0cnVlIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBhc3N3b3JkUmVwZWF0ZWR9IiBzZWNyZXQ9InRydWUiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm1lc3NhZ2UgZm9yPSJyZWVudGVyZWQiLz48L3RkPg0KLSAgICAgICAgICAgIDwvdHI+DQotDQotICAgICAgICA8L3RhYmxlPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UuZmluaXNofSIvPg0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxN2ViZDkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJhZGQgdXNlciIgYWN0aW9uPSJhZGRVc2VyIi8+PGJyLz4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9ImNoYW5nZSBuaWNrIG5hbWUiIGFjdGlvbj0iY2hhbmdlTmlja05hbWUiLz48YnIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0iY2hhbmdlIHBhc3N3b3JkIiBhY3Rpb249ImNoYW5nZVBhc3N3b3JkIi8+PGJyLz4NCi0gICAgICAgIDx0cjpjb21tYW5kTGluayB0ZXh0PSJtb2RlOiAje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLnJvbGV9Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2Uuc3dpdGNoTW9kZX0iIGltbWVkaWF0ZT0idHJ1ZSIvPg0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGY2YjA2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6Yz0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHR2YWwvZGVtby9jb21wb25lbnRzIg0KLSAgICAgICAgPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgPGM6dXNlckZvcm0gYmVhbj0iI3tyZWdpc3RyYXRpb25QYWdlfSIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UuZmluaXNofSIvPg0KLQ0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9wb20ueG1sIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzA4MTUzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmVhdHVyZS1zZXRfMDI8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgZmVhdHVyZS1zZXQgMDI8L25hbWU+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGliZXJuYXRlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmhpYmVybmF0ZS12YWxpZGF0b3I8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+NC4wLjAuR0E8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuNC4yPC92ZXJzaW9uPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS40LjI8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmZhY2VsZXRzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzZi1mYWNlbGV0czwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMTQ8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDwhLS0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgLS0+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9jb25zdHJhaW50cy9CaXJ0aGRheS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2NvbnN0cmFpbnRzL0JpcnRoZGF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYjRlNzIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2NvbnN0cmFpbnRzL0JpcnRoZGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5jb25zdHJhaW50czsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlBhc3Q7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuQU5OT1RBVElPTl9UWVBFOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotDQotQFBhc3QNCi1ATm90TnVsbA0KLQ0KLUBDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0ge30pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBUYXJnZXQoe01FVEhPRCwgRklFTEQsIEFOTk9UQVRJT05fVFlQRX0pDQotcHVibGljIEBpbnRlcmZhY2UgQmlydGhkYXkNCi17DQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAibm8gdmFsaWQgYmlydGhkYXkiOw0KLQ0KLSAgICBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQge307DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHt9Ow0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vY29uc3RyYWludHMvTmFtZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2NvbnN0cmFpbnRzL05hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkyMDBmOS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vY29uc3RyYWludHMvTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uY29uc3RyYWludHM7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5PdmVycmlkZXNBdHRyaWJ1dGU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5BTk5PVEFUSU9OX1RZUEU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi0NCi1ATm90TnVsbA0KLUBTaXplKG1pbiA9IDIpDQotDQotQENvbnN0cmFpbnQodmFsaWRhdGVkQnkgPSB7fSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgQU5OT1RBVElPTl9UWVBFfSkNCi1wdWJsaWMgQGludGVyZmFjZSBOYW1lDQotew0KLSAgICBTdHJpbmcgbWVzc2FnZSgpIGRlZmF1bHQgImludmFsaWQgbmFtZSI7IC8vbm90IHVzZWQNCi0NCi0gICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9Ow0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsNCi0NCi0gICAgQE92ZXJyaWRlc0F0dHJpYnV0ZShjb25zdHJhaW50ID0gU2l6ZS5jbGFzcywgbmFtZSA9ICJtYXgiKQ0KLSAgICBpbnQgbWF4TGVuZ3RoKCkgZGVmYXVsdCAyMDsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2RvbWFpbi9QZXJzb24uamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MDczY2UuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2RvbWFpbi9QZXJzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5kb21haW47DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmNvbnN0cmFpbnRzLk5hbWU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmNvbnN0cmFpbnRzLkJpcnRoZGF5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5QYXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi1wdWJsaWMgY2xhc3MgUGVyc29uDQotew0KLSAgICBATmFtZShtYXhMZW5ndGggPSAzMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOw0KLQ0KLSAgICBATmFtZShtYXhMZW5ndGggPSAzMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7DQotDQotICAgIEBTaXplKG1pbiA9IDIsIG1heCA9IDEwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsNCi0NCi0gICAgQEJpcnRoZGF5DQotICAgIHByaXZhdGUgRGF0ZSBiaXJ0aGRheTsNCi0NCi0gICAgQFBhc3QNCi0gICAgcHJpdmF0ZSBEYXRlIGZpbmFsRXhhbTsNCi0NCi0gICAgQE5vdE51bGwNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmlja05hbWU7DQotDQotICAgIEBTaXplKG1pbiA9IDYsIG1heCA9IDYwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBlbWFpbDsNCi0NCi0gICAgQE5vdE51bGwNCi0gICAgcHJpdmF0ZSBpbnQgbnVtYmVyT2ZTaWJsaW5nczsNCi0NCi0gICAgQFNpemUobWluID0gMiwgbWF4ID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIHJvbGUgPSAidXNlciI7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByb2xlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFJvbGUoU3RyaW5nIHJvbGUpDQotICAgIHsNCi0gICAgICAgIHRoaXMucm9sZSA9IHJvbGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0QmlydGhkYXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmlydGhkYXk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0QmlydGhkYXkoRGF0ZSBiaXJ0aGRheSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5iaXJ0aGRheSA9IGJpcnRoZGF5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldEZpbmFsRXhhbSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmaW5hbEV4YW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RmluYWxFeGFtKERhdGUgZmluYWxFeGFtKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpbmFsRXhhbSA9IGZpbmFsRXhhbTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5pY2tOYW1lKFN0cmluZyBuaWNrTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uaWNrTmFtZSA9IG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNpYmxpbmdzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG51bWJlck9mU2libGluZ3M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyT2ZTaWJsaW5ncyhpbnQgbnVtYmVyT2ZTaWJsaW5ncykNCi0gICAgew0KLSAgICAgICAgdGhpcy5udW1iZXJPZlNpYmxpbmdzID0gbnVtYmVyT2ZTaWJsaW5nczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDIwZjk0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZ3VpLmJlYW5zOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5kb21haW4uUGVyc29uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwucGF5bG9hZC5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvblBhZ2UNCi17DQotICAgIEBOb3ROdWxsKHBheWxvYWQgPSBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOw0KLQ0KLSAgICBATm90TnVsbChwYXlsb2FkID0gVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcykNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmRSZXBlYXRlZDsNCi0NCi0gICAgcHJpdmF0ZSBQZXJzb24gcGVyc29uOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGZpbmlzaCgpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldFBhc3N3b3JkKHRoaXMucGFzc3dvcmQpOw0KLSAgICAgICAgcmV0dXJuICJob21lIjsNCi0gICAgfQ0KLQ0KLSAgICBAU2l6ZShtaW4gPSA2LCBtYXggPSA2MCkNCi0gICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbi5nZXRFbWFpbCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKFN0cmluZyBlbWFpbCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0RW1haWwoZW1haWwpOw0KLSAgICB9DQotDQotICAgIEBOb3ROdWxsDQotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZTaWJsaW5ncygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbi5nZXROdW1iZXJPZlNpYmxpbmdzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyT2ZTaWJsaW5ncyhpbnQgbnVtYmVyT2ZTaWJsaW5ncykNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0TnVtYmVyT2ZTaWJsaW5ncyhudW1iZXJPZlNpYmxpbmdzKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZFJlcGVhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkUmVwZWF0ZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRSZXBlYXRlZChTdHJpbmcgcGFzc3dvcmRSZXBlYXRlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZFJlcGVhdGVkID0gcGFzc3dvcmRSZXBlYXRlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwZXJzb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbiBwZXJzb24pDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uID0gcGVyc29uOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMTg5M2MuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+Ci0gICAgPGFwcGxpY2F0aW9uPgotICAgICAgICA8IS0tIHRyaW5pZGFkIC0tPgotICAgICAgICA8ZGVmYXVsdC1yZW5kZXIta2l0LWlkPgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvcmUKLSAgICAgICAgPC9kZWZhdWx0LXJlbmRlci1raXQtaWQ+Ci0KLSAgICA8L2FwcGxpY2F0aW9uPgotCi0gICAgPG1hbmFnZWQtYmVhbj4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1uYW1lPnJlZ2lzdHJhdGlvblBhZ2U8L21hbmFnZWQtYmVhbi1uYW1lPgotICAgICAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmd1aS5iZWFucy5SZWdpc3RyYXRpb25QYWdlPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPgotCi0gICAgICAgIDxtYW5hZ2VkLXByb3BlcnR5PgotICAgICAgICAgICAgPHByb3BlcnR5LW5hbWU+cGVyc29uPC9wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPHZhbHVlPiN7cGVyc29ufTwvdmFsdWU+Ci0gICAgICAgIDwvbWFuYWdlZC1wcm9wZXJ0eT4KLSAgICA8L21hbmFnZWQtYmVhbj4KLQotICAgIDxtYW5hZ2VkLWJlYW4+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tbmFtZT5wZXJzb248L21hbmFnZWQtYmVhbi1uYW1lPgotICAgICAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb248L21hbmFnZWQtYmVhbi1jbGFzcz4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5zZXNzaW9uPC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0gICAgPC9tYW5hZ2VkLWJlYW4+Ci0KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8ZnJvbS12aWV3LWlkPi9wYWdlcy9ob21lLnhodG1sPC9mcm9tLXZpZXctaWQ+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmFkZFVzZXI8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgIDwvbmF2aWdhdGlvbi1ydWxlPgotICAgIDxuYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgICAgIDxmcm9tLXZpZXctaWQ+KjwvZnJvbS12aWV3LWlkPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5ob21lPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvaG9tZS54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgPC9uYXZpZ2F0aW9uLXJ1bGU+Ci08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzM5MzY2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgZmFjZWxldC10YWdsaWIgUFVCTElDCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRmFjZWxldCBUYWdsaWIgMS4wLy9FTiIKLSAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2ZhY2VsZXQtdGFnbGliXzFfMC5kdGQiPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlbGV0LXRhZ2xpYj4KLSAgICA8bmFtZXNwYWNlPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0dmFsL2RlbW8vY29tcG9uZW50czwvbmFtZXNwYWNlPgotCi0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPnVzZXJGb3JtPC90YWctbmFtZT4KLSAgICAgICAgPHNvdXJjZT4KLSAgICAgICAgICAgIC4uL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sCi0gICAgICAgIDwvc291cmNlPgotICAgIDwvdGFnPgotCi08L2ZhY2VsZXQtdGFnbGliPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjMDFhYS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLSAgICAgICAgIHZlcnNpb249IjIuNCI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+TXlQcm9qZWN0IHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkRFRkFVTFRfU1VGRklYPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+LnhodG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+ZmFjZWxldHMuTElCUkFSSUVTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L1dFQi1JTkYvbWFpbi50YWdsaWIueG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkVOQUJMRV9MSUdIVFdFSUdIVF9ESUFMT0dTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5ESVNBQkxFX0NPTlRFTlRfQ09NUFJFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkFMVEVSTkFURV9WSUVXX0hBTkRMRVI8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jb20uc3VuLmZhY2VsZXRzLkZhY2VsZXRWaWV3SGFuZGxlcjwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5VU0VfQVBQTElDQVRJT05fVklFV19DQUNIRTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkNIQU5HRV9QRVJTSVNURU5DRTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnNlc3Npb248L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+U3RhdGUgc2F2aW5nIG1ldGhvZDogImNsaWVudCIgb3IgInNlcnZlciIgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIFNlZSBKU0YgU3BlY2lmaWNhdGlvbiAyLjUuMwotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIGFtb3VudCAoZGVmYXVsdCA9IDIwKSBvZiB0aGUgbGF0ZXN0IHZpZXdzIGFyZSBzdG9yZWQgaW4gc2Vzc2lvbi4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLk5VTUJFUl9PRl9WSUVXU19JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpIGFuZCBpZgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OIGlzIHRydWUgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzZXJpYWxpemVkIHN0YXRlIHdpbGwgYmUgY29tcHJlc3NlZCBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBjb21wcmVzc2VkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcGFyYW1ldGVyIHRlbGxzIE15RmFjZXMgaWYgamF2YXNjcmlwdCBjb2RlIHNob3VsZCBiZSBhbGxvd2VkIGluIHRoZQotICAgICAgICAgICAgcmVuZGVyZWQgSFRNTCBvdXRwdXQuCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUKLSAgICAgICAgICAgIHRoYXQgc3VibWl0cyB0aGUgY29ycmVzcG9uZGluZyBmb3JtLgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBub3QgYWxsb3dlZCwgdGhlIHN0YXRlIHNhdmluZyBpbmZvIGFuZCBuZXN0ZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLgotICAgICAgICAgICAgaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90Ci0gICAgICAgICAgICBpbmZsdWVuY2UgdGhlIEhUTUwgY29kZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUFJFVFRZX0hUTUw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCBhIGphdmFzY3JpcHQgZnVuY3Rpb24gd2lsbCBiZSByZW5kZXJlZCB0aGF0IGlzIGFibGUgdG8gcmVzdG9yZSB0aGUKLSAgICAgICAgICAgIGZvcm1lciB2ZXJ0aWNhbCBzY3JvbGwgb24gZXZlcnkgcmVxdWVzdC4gQ29udmVuaWVudCBmZWF0dXJlIGlmIHlvdSBoYXZlIHBhZ2VzCi0gICAgICAgICAgICB3aXRoIGxvbmcgbGlzdHMgYW5kIHlvdSBkbyBub3Qgd2FudCB0aGUgYnJvd3NlciBwYWdlIHRvIGFsd2F5cyBqdW1wIHRvIHRoZSB0b3AKLSAgICAgICAgICAgIGlmIHlvdSB0cmlnZ2VyIGEgbGluayBvciBidXR0b24gYWN0aW9uIHRoYXQgc3RheXMgb24gdGhlIHNhbWUgcGFnZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJmYWxzZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFVVE9fU0NST0xMPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Vc2VkIGZvciBlbmNyeXB0aW5nIHZpZXcgc3RhdGUuIE9ubHkgcmVsZXZhbnQgZm9yIGNsaWVudCBzaWRlCi0gICAgICAgICAgICBzdGF0ZSBzYXZpbmcuIFNlZSBNeUZhY2VzIHdpa2kvd2ViIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRUNSRVQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWYWxpZGF0ZSBtYW5hZ2VkIGJlYW5zLCBuYXZpZ2F0aW9uIHJ1bGVzIGFuZCBlbnN1cmUgdGhhdCBmb3JtcyBhcmUgbm90IG5lc3RlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlZBTElEQVRFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPCEtLSBMaXN0ZW5lciwgdG8gYWxsb3cgSmV0dHkgc2VydmluZyBNeUZhY2VzIGFwcHMgLS0+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLndlYmFwcC5TdGFydHVwU2VydmxldENvbnRleHRMaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+Ci0gICAgPC9saXN0ZW5lcj4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCAtLT4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICAgIDwvc2VydmxldD4KLQotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPnJlc291cmNlczwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlJlc291cmNlU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8ZmlsdGVyPgotICAgICAgICA8ZmlsdGVyLW5hbWU+dHJpbmlkYWQ8L2ZpbHRlci1uYW1lPgotICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC53ZWJhcHAuVHJpbmlkYWRGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KLSAgICA8L2ZpbHRlcj4KLQotICAgIDxmaWx0ZXItbWFwcGluZz4KLSAgICAgICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgPC9maWx0ZXItbWFwcGluZz4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCBNYXBwaW5ncyAtLT4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9mYWNlcy8qPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+cmVzb3VyY2VzPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4vYWRmLyo8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPCEtLSBXZWxjb21lIGZpbGVzIC0tPgotICAgIDx3ZWxjb21lLWZpbGUtbGlzdD4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+Ci0gICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KLQotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg0ZDY0OC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyIKLSAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiCi0gICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIgotICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiCi0gICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+Ci0KLTx1aTpjb21wb3NpdGlvbj4KLSAgICA8dHI6cGFuZWxGb3JtTGF5b3V0PgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im5pY2sgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb25bICduaWNrTmFtZScgXX0iLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0iZS1tYWlsIiB2YWx1ZT0iI3tiZWFuLmVtYWlsfSIvPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9ImZpcnN0IG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uLmZpcnN0TmFtZX0iLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibGFzdCBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5sYXN0TmFtZX0iLz4KLSAgICAgICAgPHRyOmlucHV0RGF0ZSBsYWJlbD0iYmlydGhkYXkiIHZhbHVlPSIje2JlYW4ucGVyc29uLmJpcnRoZGF5fSI+Ci0gICAgICAgICAgICA8dHI6Y29udmVydERhdGVUaW1lIHR5cGU9ImRhdGUiIHBhdHRlcm49ImRkLk1NLnl5eXkiLz4KLSAgICAgICAgPC90cjppbnB1dERhdGU+Ci0gICAgICAgIDx0cjppbnB1dERhdGUgbGFiZWw9ImZpbmFsIGV4YW0iIHZhbHVlPSIje2JlYW4ucGVyc29uLmZpbmFsRXhhbX0iPgotICAgICAgICAgICAgPHRyOmNvbnZlcnREYXRlVGltZSB0eXBlPSJkYXRlIiBwYXR0ZXJuPSJkZC5NTS55eXl5Ii8+Ci0gICAgICAgIDwvdHI6aW5wdXREYXRlPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im51bWJlciBvZiBzaWJsaW5ncyIgdmFsdWU9IiN7YmVhbi5udW1iZXJPZlNpYmxpbmdzfSIvPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9InBhc3N3b3JkIiB2YWx1ZT0iI3tiZWFuLnBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9InJlLWVudGVyIHBhc3N3b3JkIiB2YWx1ZT0iI3tiZWFuLnBhc3N3b3JkUmVwZWF0ZWR9IiBzZWNyZXQ9InRydWUiLz4KLQotICAgIDwvdHI6cGFuZWxGb3JtTGF5b3V0PgotPC91aTpjb21wb3NpdGlvbj4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWNkMTQ4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0gICAgICAgIA0KLTxodG1sPg0KLQ0KLTxoZWFkPg0KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIwOyBVUkw9ZmFjZXMvcGFnZXMvaG9tZS54aHRtbCI+DQotPC9oZWFkPg0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYzFlYTguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPHRyOmRvY3VtZW50DQotICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiDQotICAgICAgICB4bWxuczpjPSJodHRwOi8vamF2YS5zdW4uY29tL2pzdGwvY29yZSI+DQotICAgIDxmOmZhY2V0IG5hbWU9Im1ldGFDb250YWluZXIiPg0KLSAgICAgICAgPHRpdGxlPnNldi1lbiBmZWF0dXJlLXNldCBkZW1vIDAxPC90aXRsZT4NCi0gICAgPC9mOmZhY2V0Pg0KLQ0KLSAgICA8dHJoOmJvZHk+DQotDQotICAgICAgICA8IS0tIG9yaWdpbmFsIC0tPg0KLSAgICAgICAgPGRpdiBpZD0id3JhcCI+DQotDQotICAgICAgICAgICAgPHRyOmZvcm0gaWQ9ImZvcm0iIGRlZmF1bHRDb21tYW5kPSJkZWZhdWx0QnV0dG9uIj4NCi0gICAgICAgICAgICAgICAgPGRpdiBpZD0ibWFpbiI+DQotICAgICAgICAgICAgICAgICAgICA8dWk6aW5zZXJ0IG5hbWU9ImNvbnRlbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InVuZGVyX2NvbnN0cnVjdGlvbiI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj4hc2l0ZSB1bmRlciBjb25zdHJ1Y3Rpb24hPC9oMj4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIGNvbnRlbnQgb2YgdGhpcyBzaXRlIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhlIG1vbWVudC48L3A+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICA8L3VpOmluc2VydD4NCi0gICAgICAgICAgICAgICAgPC9kaXY+DQotDQotICAgICAgICAgICAgPC90cjpmb3JtPg0KLSAgICAgICAgICAgIDx0cjptZXNzYWdlcyBnbG9iYWxPbmx5PSJ0cnVlIi8+DQotDQotICAgICAgICA8L2Rpdj4NCi0gICAgPC90cmg6Ym9keT4NCi0NCi0NCi08L3RyOmRvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTdiMTUzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0iYWRkIHVzZXIiIGFjdGlvbj0iYWRkVXNlciIvPjxici8+DQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZjZiMDYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczpjPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dHZhbC9kZW1vL2NvbXBvbmVudHMiDQotICAgICAgICA+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotDQotICAgICAgICA8Yzp1c2VyRm9ybSBiZWFuPSIje3JlZ2lzdHJhdGlvblBhZ2V9Ii8+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJzYXZlIiBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS5maW5pc2h9Ii8+DQotDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9wb20ueG1sIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3NjU2Zi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1oZWxsb19iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgaGVsbG8gYmVhbi12YWxpZGF0aW9uPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmpzdGw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anN0bDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhpYmVybmF0ZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5oaWJlcm5hdGUtdmFsaWRhdG9yPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjQuMC4wLkdBPC92ZXJzaW9uPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjQuMjwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1sb2c0ajEyPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuNC4yPC92ZXJzaW9uPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWM4Zjc4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLmRvbWFpbi5QZXJzb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb24uZ3JvdXAuQWRtaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb24uZ3JvdXAuVXNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cC5OYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uQmVhblZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmdyb3Vwcy5EZWZhdWx0OwotCi1wdWJsaWMgY2xhc3MgSGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyCi17Ci0gICAgQEJlYW5WYWxpZGF0aW9uLkxpc3QoewotICAgICAgICAgICAgQEJlYW5WYWxpZGF0aW9uKHVzZUdyb3VwcyA9IERlZmF1bHQuY2xhc3MpLAotICAgICAgICAgICAgQEJlYW5WYWxpZGF0aW9uKHZpZXdJZHMgPSAiL2dyb3VwVmFsaWRhdGlvbjAxLmpzcCIsIHVzZUdyb3VwcyA9IFVzZXIuY2xhc3MpLAotICAgICAgICAgICAgQEJlYW5WYWxpZGF0aW9uKHZpZXdJZHMgPSAiL2dyb3VwVmFsaWRhdGlvbjAyLmpzcCIsIHVzZUdyb3VwcyA9IEFkbWluLmNsYXNzKSwKLSAgICAgICAgICAgIEBCZWFuVmFsaWRhdGlvbih2aWV3SWRzID0gIi9tb2RlbFZhbGlkYXRpb24wMS5qc3AiLCB1c2VHcm91cHMgPSBBZG1pbi5jbGFzcyksCi0gICAgICAgICAgICBAQmVhblZhbGlkYXRpb24odmlld0lkcyA9ICIvbW9kZWxWYWxpZGF0aW9uMDEuanNwIiwgdXNlR3JvdXBzID0gTmFtZS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uID0gQE1vZGVsVmFsaWRhdGlvbihpc0FjdGl2ZSA9IHRydWUpKQotICAgIH0pCi0gICAgcHJpdmF0ZSBQZXJzb24gcGVyc29uID0gbmV3IFBlcnNvbigpOwotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBlbXB0eSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBIZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHNlbmQoKQotICAgIHsKLSAgICAgICAgLy9kbyByZWFsIGxvZ2ljLCByZXR1cm4gYSBzdHJpbmcgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciB0aGUgbmF2aWdhdGlvbiBzeXN0ZW0gb2YgSlNGCi0gICAgICAgIHJldHVybiAic3VjY2VzcyI7Ci0gICAgfQotCi0gICAgcHVibGljIFBlcnNvbiBnZXRQZXJzb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBlcnNvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzb24oUGVyc29uIHBlcnNvbikKLSAgICB7Ci0gICAgICAgIHRoaXMucGVyc29uID0gcGVyc29uOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI0ZTY4Yi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLmRvbWFpbi5QZXJzb247Ci0KLS8qKgotICogQSB0eXBpY2FsIHNpbXBsZSBiYWNraW5nIGJlYW4sIHRoYXQgaXMgYmFja2VkIHRvIDxjb2RlPmhlbGxvd29ybGQuanNwPC9jb2RlPgotICovCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZENvbnRyb2xsZXIKLXsKLSAgICBwcml2YXRlIFBlcnNvbiBwZXJzb24gPSBuZXcgUGVyc29uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBkZWZhdWx0IGVtcHR5IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIEhlbGxvV29ybGRDb250cm9sbGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBzZW5kKCkKLSAgICB7Ci0gICAgICAgIC8vZG8gcmVhbCBsb2dpYywgcmV0dXJuIGEgc3RyaW5nIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgdGhlIG5hdmlnYXRpb24gc3lzdGVtIG9mIEpTRgotICAgICAgICByZXR1cm4gInN1Y2Nlc3MiOwotICAgIH0KLQotICAgIHB1YmxpYyBQZXJzb24gZ2V0UGVyc29uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwZXJzb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbiBwZXJzb24pCi0gICAgewotICAgICAgICB0aGlzLnBlcnNvbiA9IHBlcnNvbjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvZG9tYWluL1BlcnNvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvZG9tYWluL1BlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTg5ODBjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5kb21haW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5OYW1lQ29uc3RyYWludDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cC5BZG1pbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cC5Vc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay52YWxpZGF0aW9uLmdyb3VwLk5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwucGF5bG9hZC5WaW9sYXRpb25TZXZlcml0eTsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7Ci0KLUBOYW1lQ29uc3RyYWludChncm91cHMgPSBOYW1lLmNsYXNzKQotcHVibGljIGNsYXNzIFBlcnNvbgotewotICAgIEBOb3ROdWxsKHBheWxvYWQgPSBWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzKQotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsKLQotICAgIC8vZGVtbyBmb3IgYmVhbiB2YWxpZGF0aW9uIGJhc2VkIHZhbGlkYXRpb24gc3VwcG9ydAotICAgIEBOb3ROdWxsCi0gICAgQFNpemUuTGlzdCh7Ci0gICAgICAgICAgICBAU2l6ZShtaW4gPSAzLCBtYXggPSA2LCBncm91cHMgPSBVc2VyLmNsYXNzKSwKLSAgICAgICAgICAgIEBTaXplKG1pbiA9IDMsIG1heCA9IDEyLCBncm91cHMgPSBBZG1pbi5jbGFzcykKLSAgICB9KQotICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGxhc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL05hbWVDb25zdHJhaW50LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL05hbWVDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYzM3ZjQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9OYW1lQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb247DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi0NCi1AQ29uc3RyYWludCh2YWxpZGF0ZWRCeSA9IE5hbWVDb25zdHJhaW50VmFsaWRhdG9yLmNsYXNzKQ0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotcHVibGljIEBpbnRlcmZhY2UgTmFtZUNvbnN0cmFpbnQNCi17DQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAiaW52YWxpZCBuYW1lIjsNCi0NCi0gICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9Ow0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9OYW1lQ29uc3RyYWludFZhbGlkYXRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9OYW1lQ29uc3RyYWludFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWI4OTJjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vTmFtZUNvbnN0cmFpbnRWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluLlBlcnNvbjsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBOYW1lQ29uc3RyYWludFZhbGlkYXRvciBpbXBsZW1lbnRzDQotICAgICAgICBDb25zdHJhaW50VmFsaWRhdG9yPE5hbWVDb25zdHJhaW50LCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluLlBlcnNvbj4NCi17DQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoTmFtZUNvbnN0cmFpbnQgZGlmZmVyZW50TmFtZSkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoUGVyc29uIHBlcnNvbiwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29uc3RyYWludFZhbGlkYXRvckNvbnRleHQpDQotICAgIHsNCi0gICAgICAgIGlmKHBlcnNvbiA9PSBudWxsIHx8IGlzRW1wdHkocGVyc29uLmdldEZpcnN0TmFtZSgpKSB8fCBpc0VtcHR5KHBlcnNvbi5nZXRMYXN0TmFtZSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAhKHBlcnNvbi5nZXRGaXJzdE5hbWUoKS5lcXVhbHMocGVyc29uLmdldExhc3ROYW1lKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFbXB0eShTdHJpbmcgdmFsdWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8ICIiLmVxdWFscyh2YWx1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9BZG1pbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9BZG1pbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTI1ZmQwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvQWRtaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay52YWxpZGF0aW9uLmdyb3VwOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgQWRtaW4NCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvTmFtZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9OYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMTcwMzguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9OYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cDsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWUNCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvVXNlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9Vc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZjhkZDUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9Vc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cDsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIFVzZXINCi17DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg4YzI5YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZmFjZXMtY29uZmlnIHZlcnNpb249IjEuMiIgCi0gICAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiPgotCQotCTwhLS0gbWFuYWdlZCBiZWFucyBvZiB0aGUgc2ltcGxlIGhlbGxvIHdvcmxkIGFwcCAtLT4KLQk8bWFuYWdlZC1iZWFuPgotCQk8bWFuYWdlZC1iZWFuLW5hbWU+aGVsbG9Xb3JsZDwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0JCTxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLkhlbGxvV29ybGRDb250cm9sbGVyPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0JCTxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPgotCTwvbWFuYWdlZC1iZWFuPgotCQotCTxtYW5hZ2VkLWJlYW4+Ci0JCTxtYW5hZ2VkLWJlYW4tbmFtZT5oZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXI8L21hbmFnZWQtYmVhbi1uYW1lPgotCQk8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5IZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXI8L21hbmFnZWQtYmVhbi1jbGFzcz4KLQkJPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0JPC9tYW5hZ2VkLWJlYW4+Ci0KLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIGhlbGxvV29ybGQuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+KjwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5zdWNjZXNzPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vcmVzdWx0LmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPmV4YW1wbGUwMTwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L2dyb3VwVmFsaWRhdGlvbjAxLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPmV4YW1wbGUwMjwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L2dyb3VwVmFsaWRhdGlvbjAyLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPmV4YW1wbGUwMzwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L21vZGVsVmFsaWRhdGlvbjAxLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0JCi0JPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciByZXN1bHQuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L3Jlc3VsdC5qc3A8L2Zyb20tdmlldy1pZD4KLQkJPG5hdmlnYXRpb24tY2FzZT4KLQkJCTxmcm9tLW91dGNvbWU+YmFjazwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L2hlbGxvV29ybGQuanNwPC90by12aWV3LWlkPgotCQk8L25hdmlnYXRpb24tY2FzZT4KLQk8L25hdmlnYXRpb24tcnVsZT4KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTRhMTgzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLSAgICAgICAgIHZlcnNpb249IjIuNCI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+TXlQcm9qZWN0IHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0gICAgPCEtLW9wdGlvbmFsOiBjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgVVJJcyBvZiAoYWRkaXRpb25hbCkgZmFjZXMgY29uZmlnIGZpbGVzLgotICAgICAgICAgICAgKGUuZy4gL1dFQi1JTkYvbXktY29uZmlnLnhtbCkKLSAgICAgICAgICAgIFNlZSBKU0YgMS4wIFBSRDIsIDEwLjMuMgotICAgICAgICAgICAgQXR0ZW50aW9uOiBZb3UgZG8gbm90IG5lZWQgdG8gcHV0IC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgaW4gaGVyZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuQ09ORklHX0ZJTEVTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L1dFQi1JTkYvZXhhbXBsZXMtY29uZmlnLnhtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtLS0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5TdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNsaWVudDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLk5VTUJFUl9PRl9WSUVXU19JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkgYW5kIGlmCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04gaXMgdHJ1ZSAoPSBkZWZhdWx0KQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4gSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUKLSAgICAgICAgICAgIHJlbmRlcmVkIEhUTUwgb3V0cHV0LgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgbm90IGFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLgotICAgICAgICAgICAgaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90Ci0gICAgICAgICAgICBpbmZsdWVuY2UgdGhlIEhUTUwgY29kZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIGEgamF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRoYXQgaXMgYWJsZSB0byByZXN0b3JlIHRoZQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMKLSAgICAgICAgICAgIHdpdGggbG9uZyBsaXN0cyBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcAotICAgICAgICAgICAgaWYgeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZSBwYWdlLgotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BVVRPX1NDUk9MTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQotICAgICAgICAgICAgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucwotICAgICAgICAgICAgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IgZGlmZmVuZW50IGVuY3J5cHRpb24gc3RyZW5ndGhzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VDUkVUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+TnpZMU5ETXlNVEE9PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmFsaWRhdGUgbWFuYWdlZCBiZWFucywgbmF2aWdhdGlvbiBydWxlcyBhbmQgZW5zdXJlIHRoYXQgZm9ybXMgYXJlIG5vdCBuZXN0ZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVHJlYXQgcmVhZG9ubHkgc2FtZSBhcyBpZiBkaXNhYmxlZCBhdHRyaWJ1dGUgd2FzIHNldCBmb3Igc2VsZWN0IGVsZW1lbnRzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUkVBRE9OTFlfQVNfRElTQUJMRURfRk9SX1NFTEVDVFM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBVc2UgdGhlIGRlZmluZWQgY2xhc3MgYXMgdGhlIGNsYXNzIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSByZXNvdXJjZSBpcyBhZGRlZCB0byB0aGUKLSAgICAgICAgICAgIEV4dGVuc2lvbkZpbHRlciBoYW5kbGluZy4gVXNpbmcgU3RyZWFtaW5nQWRkUmVzb3VyY2UgaGVyZSBoZWxwcyB3aXRoIHBlcmZvcm1hbmNlLiBJZiB5b3Ugd2FudCB0byBhZGQKLSAgICAgICAgICAgIGN1c3RvbSBjb21wb25lbnRzIGFuZCB3YW50IHRvIHVzZSB0aGUgRXh0ZW5zaW9uRmlsdGVyLCB5b3UgbmVlZCB0byBwcm92aWRlIHlvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIGhlcmUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BRERfUkVTT1VSQ0VfQ0xBU1M8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwudXRpbC5EZWZhdWx0QWRkUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgICAgIAotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZpcnR1YWwgcGF0aCBpbiB0aGUgVVJMIHdoaWNoIHRyaWdnZXJzIGxvYWRpbmcgb2YgcmVzb3VyY2VzIGZvciB0aGUgTXlGYWNlcyBleHRlbmRlZCBjb21wb25lbnRzCi0gICAgICAgICAgICBpbiB0aGUgRXh0ZW5zaW9uRmlsdGVyLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUkVTT1VSQ0VfVklSVFVBTF9QQVRIPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L2ZhY2VzL215RmFjZXNFeHRlbnNpb25SZXNvdXJjZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBDaGVjayBpZiB0aGUgZXh0ZW5zaW9ucy1maWx0ZXIgaGFzIGJlZW4gcHJvcGVybHkgY29uZmlndXJlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNIRUNLX0VYVEVOU0lPTlNfRklMVEVSPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBEZWZpbmUgcGFydGlhbCBzdGF0ZSBzYXZpbmcgYXMgdHJ1ZS9mYWxzZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuUEFSVElBTF9TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0KLSAgICA8IS0tIExpc3RlbmVyLCB0byBhbGxvdyBKZXR0eSBzZXJ2aW5nIE15RmFjZXMgYXBwcyAtLT4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMud2ViYXBwLlN0YXJ0dXBTZXJ2bGV0Q29udGV4dExpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IC0tPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmcgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4qLmpzZjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4LmpzcDwvd2VsY29tZS1maWxlPgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvZ3JvdXBWYWxpZGF0aW9uMDEuanNwIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2dyb3VwVmFsaWRhdGlvbjAxLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNmMDM5ZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvZ3JvdXBWYWxpZGF0aW9uMDEuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgICA8Zjp2aWV3PgotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPgotICAgICAgICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMyI+Ci0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJmaXJzdF9uYW1lIiB2YWx1ZT0iRmlyc3QgbmFtZSo6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJmaXJzdF9uYW1lIiBsYWJlbD0iRmlyc3QgbmFtZSIgdmFsdWU9IiN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyWydwZXJzb24nXS5maXJzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9ImZpcnN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4KLQotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0ibGFzdF9uYW1lIiB2YWx1ZT0iTGFzdCBuYW1lKio6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJsYXN0X25hbWUiIGxhYmVsPSJMYXN0IG5hbWUiIHZhbHVlPSIje2hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlci5wZXJzb24ubGFzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9Imxhc3RfbmFtZSIgc2hvd1N1bW1hcnk9InRydWUiIHNob3dEZXRhaWw9ImZhbHNlIiBlcnJvclN0eWxlPSJjb2xvcjogcmVkOyIgd2FyblN0eWxlPSJjb2xvcjogb3JhbmdlOyIvPgotCi0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiB2YWx1ZT0iUHJlc3MgbWUiIGFjdGlvbj0iI3toZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIuc2VuZH0iLz4KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4KLSAgICAgICAgICAgICAgPC9oOnBhbmVsR3JpZD4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICAgICAgPGg6bWVzc2FnZXMgZ2xvYmFsT25seT0idHJ1ZSIgc2hvd0RldGFpbD0idHJ1ZSIgc2hvd1N1bW1hcnk9ImZhbHNlIi8+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgICAgICA8aHIvPgotCi0gICAgICAgICogcmVxdWlyZWQ8YnIvPgotICAgICAgICAqKiByZXF1aXJlZDsgbGVuZ3RoOiAzLTYgY2hhcmFjdGVycwotICAgIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9ncm91cFZhbGlkYXRpb24wMi5qc3AgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvZ3JvdXBWYWxpZGF0aW9uMDIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWZhMDQ2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9ncm91cFZhbGlkYXRpb24wMi5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIzIj4KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9ImZpcnN0X25hbWUiIHZhbHVlPSJGaXJzdCBuYW1lKjoiLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9ImZpcnN0X25hbWUiIGxhYmVsPSJGaXJzdCBuYW1lIiB2YWx1ZT0iI3toZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXJbJ3BlcnNvbiddLmZpcnN0TmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0iZmlyc3RfbmFtZSIgc2hvd1N1bW1hcnk9InRydWUiIHNob3dEZXRhaWw9ImZhbHNlIiBlcnJvclN0eWxlPSJjb2xvcjogcmVkOyIgd2FyblN0eWxlPSJjb2xvcjogb3JhbmdlOyIvPgotCi0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJsYXN0X25hbWUiIHZhbHVlPSJMYXN0IG5hbWUqKjoiLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9Imxhc3RfbmFtZSIgbGFiZWw9Ikxhc3QgbmFtZSIgdmFsdWU9IiN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLnBlcnNvbi5sYXN0TmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0ibGFzdF9uYW1lIiBzaG93U3VtbWFyeT0idHJ1ZSIgc2hvd0RldGFpbD0iZmFsc2UiIGVycm9yU3R5bGU9ImNvbG9yOiByZWQ7IiB3YXJuU3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ii8+Ci0KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJQcmVzcyBtZSIgYWN0aW9uPSIje2hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlci5zZW5kfSIvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgICAgICAgPC9oOmZvcm0+Ci0gICAgICAgICAgICA8aDptZXNzYWdlcyBnbG9iYWxPbmx5PSJ0cnVlIiBzaG93RGV0YWlsPSJ0cnVlIiBzaG93U3VtbWFyeT0iZmFsc2UiLz4KLSAgICAgICAgPC9mOnZpZXc+Ci0gICAgICAgIDxoci8+Ci0KLSAgICAgICAgKiByZXF1aXJlZDxici8+Ci0gICAgICAgICoqIHJlcXVpcmVkOyBsZW5ndGg6IDMtMTIgY2hhcmFjdGVycwotICAgIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE0OTczMy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIzIj4KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9ImZpcnN0X25hbWUiIHZhbHVlPSJGaXJzdCBuYW1lKjoiLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9ImZpcnN0X25hbWUiIGxhYmVsPSJGaXJzdCBuYW1lIiB2YWx1ZT0iI3toZWxsb1dvcmxkLnBlcnNvbi5maXJzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9ImZpcnN0X25hbWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIgc2hvd0RldGFpbD0idHJ1ZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4KLQotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0ibGFzdF9uYW1lIiB2YWx1ZT0iTGFzdCBuYW1lKio6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJsYXN0X25hbWUiIGxhYmVsPSJMYXN0IG5hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJsYXN0X25hbWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIgc2hvd0RldGFpbD0idHJ1ZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4KLQotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Xb3JsZC5zZW5kfSIvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICA8L2g6cGFuZWxHcmlkPgotCi0gICAgICAgICAgICAgIDxoci8+Ci0gICAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIHZhbHVlPSJncm91cCB2YWxpZGF0aW9uIGV4YW1wbGUgMSIgYWN0aW9uPSJleGFtcGxlMDEiIGltbWVkaWF0ZT0idHJ1ZSIvPjxici8+Ci0gICAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIHZhbHVlPSJncm91cCB2YWxpZGF0aW9uIGV4YW1wbGUgMiIgYWN0aW9uPSJleGFtcGxlMDIiIGltbWVkaWF0ZT0idHJ1ZSIvPjxici8+Ci0gICAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIHZhbHVlPSJtb2RlbCB2YWxpZGF0aW9uIGV4YW1wbGUgMSIgYWN0aW9uPSJleGFtcGxlMDMiIGltbWVkaWF0ZT0idHJ1ZSIvPjxici8+Ci0gICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgPC9mOnZpZXc+Ci0gICAgICAgIDxoci8+Ci0gICAgICAgICogbm9uIGJsb2NraW5nIHdhcm4gbW9kZTxici8+Ci0gICAgICAgICoqIGJsb2NraW5nIGVycm9yIG1vZGUKLSAgICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ4MmQ1My4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgcGFnZSBzZXNzaW9uPSJmYWxzZSIlPgotPCUKLXJlc3BvbnNlLnNlbmRSZWRpcmVjdCgiaGVsbG9Xb3JsZC5qc2YiKTsKLSU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL21vZGVsVmFsaWRhdGlvbjAxLmpzcCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9tb2RlbFZhbGlkYXRpb24wMS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MWY3ZGUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL21vZGVsVmFsaWRhdGlvbjAxLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwlLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tJT4KLQotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgICAgPGY6dmlldz4KLSAgICAgICAgICAgIDxoOmZvcm0gaWQ9Im1haW5Gb3JtIj4KLSAgICAgICAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjMiPgotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0iZmlyc3RfbmFtZSIgdmFsdWU9IkZpcnN0IG5hbWUqOiIvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0iZmlyc3RfbmFtZSIgbGFiZWw9IkZpcnN0IG5hbWUiIHZhbHVlPSIje2hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlclsncGVyc29uJ10uZmlyc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJmaXJzdF9uYW1lIiBzaG93U3VtbWFyeT0idHJ1ZSIgc2hvd0RldGFpbD0iZmFsc2UiIGVycm9yU3R5bGU9ImNvbG9yOiByZWQ7IiB3YXJuU3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ii8+Ci0KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9Imxhc3RfbmFtZSIgdmFsdWU9Ikxhc3QgbmFtZSoqOiIvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0ibGFzdF9uYW1lIiBsYWJlbD0iTGFzdCBuYW1lIiB2YWx1ZT0iI3toZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIucGVyc29uLmxhc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJsYXN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4KLQotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLnNlbmR9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+Ci0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+Ci0gICAgICAgICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0gICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgICAgIDxoOm1lc3NhZ2VzIGdsb2JhbE9ubHk9InRydWUiIHNob3dEZXRhaWw9InRydWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIvPgotICAgICAgICA8L2Y6dmlldz4KLSAgICAgICAgPGhyLz4KLSAgICAgICAgbW9kZWwgdmFsaWRhdGlvbjogZmlyc3QgYW5kIGxhc3QgbmFtZSBoYXZlIHRvIGJlIGRpZmZlcmVudDxici8+Ci0KLSAgICAgICAgKiByZXF1aXJlZDxici8+Ci0gICAgICAgICoqIHJlcXVpcmVkOyBsZW5ndGggb2YgcHJvdmlkZWQgdmFsdWU6IDMtMTIgY2hhcmFjdGVycwotICAgIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9yZXN1bHQuanNwIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL3Jlc3VsdC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlOGIxZWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL3Jlc3VsdC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgICAgPGgyPjxoOm91dHB1dFRleHQgdmFsdWU9IkhlbGxvICN7aGVsbG9Xb3JsZC5wZXJzb24uZmlyc3ROYW1lfSAje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfSN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLnBlcnNvbi5maXJzdE5hbWV9ICN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLnBlcnNvbi5sYXN0TmFtZX0uIFdlIGhvcGUgeW91IGVuam95IEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yISIvPjwvaDI+Ci0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZExpbmsgYWN0aW9uPSJiYWNrIj4KLSAgICAgICAgICAgICAgICAgICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iSG9tZSIvPgotICAgICAgICAgICAgICAgIDwvaDpjb21tYW5kTGluaz4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICAgICAgPGg6bWVzc2FnZXMgZ2xvYmFsT25seT0idHJ1ZSIgc2hvd0RldGFpbD0idHJ1ZSIgc2hvd1N1bW1hcnk9ImZhbHNlIi8+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgIDwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3BvbS54bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NzM1ZjMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIGhlbGxvIHdvcmxkPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmpzdGw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anN0bDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5PiAgICAgICAgDQotDQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhZmIzOS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbms7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluLlBlcnNvbjsKLQotLyoqCi0gKiBBIHR5cGljYWwgc2ltcGxlIGJhY2tpbmcgYmVhbiwgdGhhdCBpcyBiYWNrZWQgdG8gPGNvZGU+aGVsbG93b3JsZC5qc3A8L2NvZGU+Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEhlbGxvV29ybGRDb250cm9sbGVyCi17Ci0gICAgcHJpdmF0ZSBQZXJzb24gcGVyc29uID0gbmV3IFBlcnNvbigpOwotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBlbXB0eSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBIZWxsb1dvcmxkQ29udHJvbGxlcigpCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB0aGF0IGlzIGJhY2tlZCB0byBhIHN1Ym1pdCBidXR0b24gb2YgYSBmb3JtLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgc2VuZCgpCi0gICAgewotICAgICAgICAvL2RvIHJlYWwgbG9naWMsIHJldHVybiBhIHN0cmluZyB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuYXZpZ2F0aW9uIHN5c3RlbSBvZiBKU0YKLSAgICAgICAgcmV0dXJuICJzdWNjZXNzIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpCi0gICAgewotICAgICAgICByZXR1cm4gcGVyc29uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNvbihQZXJzb24gcGVyc29uKQotICAgIHsKLSAgICAgICAgdGhpcy5wZXJzb24gPSBwZXJzb247Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvZG9tYWluL1BlcnNvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMDc2Y2MuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsKLQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsKLQotcHVibGljIGNsYXNzIFBlcnNvbgotewotICAgIC8vaGVsbG8gd29ybGQgZGVtbwotICAgIEBSZXF1aXJlZChwYXJhbWV0ZXJzID0gVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcykKLSAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7Ci0KLSAgICAvL2RlbW8gZm9yIGpwYSBiYXNlZCB2YWxpZGF0aW9uIHN1cHBvcnQKLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwIC8qLi4uKi8pCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbGFzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYmVhZTcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZmFjZXMtY29uZmlnIHZlcnNpb249IjEuMiIgCi0gICAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiPgotCQotCTwhLS0gbWFuYWdlZCBiZWFucyBvZiB0aGUgc2ltcGxlIGhlbGxvIHdvcmxkIGFwcCAtLT4KLQk8bWFuYWdlZC1iZWFuPgotCQk8bWFuYWdlZC1iZWFuLW5hbWU+aGVsbG9Xb3JsZDwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0JCTxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLkhlbGxvV29ybGRDb250cm9sbGVyPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0JCTxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPgotCTwvbWFuYWdlZC1iZWFuPgotCQotCTwhLS0gbmF2aWdhdGlvbiBydWxlcyBmb3IgaGVsbG9Xb3JsZC5qc3AgLS0+Ci0JPG5hdmlnYXRpb24tcnVsZT4KLQkJPGZyb20tdmlldy1pZD4vaGVsbG9Xb3JsZC5qc3A8L2Zyb20tdmlldy1pZD4KLQkJPG5hdmlnYXRpb24tY2FzZT4KLQkJCTxmcm9tLW91dGNvbWU+c3VjY2VzczwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L3BhZ2UyLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0JCi0JPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciBwYWdlMi5qc3AgLS0+Ci0JPG5hdmlnYXRpb24tcnVsZT4KLQkJPGZyb20tdmlldy1pZD4vcGFnZTIuanNwPC9mcm9tLXZpZXctaWQ+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPmJhY2s8L2Zyb20tb3V0Y29tZT4KLQkJCTx0by12aWV3LWlkPi9oZWxsb1dvcmxkLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNGExODMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCi0gICAgICAgICB2ZXJzaW9uPSIyLjQiPgotCi0gICAgPGRlc2NyaXB0aW9uPk15UHJvamVjdCB3ZWIueG1sPC9kZXNjcmlwdGlvbj4KLQotICAgIDwhLS1vcHRpb25hbDogY29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIFVSSXMgb2YgKGFkZGl0aW9uYWwpIGZhY2VzIGNvbmZpZyBmaWxlcy4KLSAgICAgICAgICAgIChlLmcuIC9XRUItSU5GL215LWNvbmZpZy54bWwpCi0gICAgICAgICAgICBTZWUgSlNGIDEuMCBQUkQyLCAxMC4zLjIKLSAgICAgICAgICAgIEF0dGVudGlvbjogWW91IGRvIG5vdCBuZWVkIHRvIHB1dCAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGluIGhlcmUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkNPTkZJR19GSUxFUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi9XRUItSU5GL2V4YW1wbGVzLWNvbmZpZy54bWw8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbS0tPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+U3RhdGUgc2F2aW5nIG1ldGhvZDogImNsaWVudCIgb3IgInNlcnZlciIgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIFNlZSBKU0YgU3BlY2lmaWNhdGlvbiAyLjUuMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jbGllbnQ8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgRGVmaW5lcyB0aGUgYW1vdW50IChkZWZhdWx0ID0gMjApIG9mIHRoZSBsYXRlc3Qgdmlld3MgYXJlIHN0b3JlZCBpbiBzZXNzaW9uLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5OVU1CRVJfT0ZfVklFV1NfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPjIwPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzdGF0ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbSBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uCi0gICAgICAgICAgICBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpIGFuZCBpZgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OIGlzIHRydWUgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzZXJpYWxpemVkIHN0YXRlIHdpbGwgYmUgY29tcHJlc3NlZCBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBjb21wcmVzc2VkLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DT01QUkVTU19TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhpcyBwYXJhbWV0ZXIgdGVsbHMgTXlGYWNlcyBpZiBqYXZhc2NyaXB0IGNvZGUgc2hvdWxkIGJlIGFsbG93ZWQgaW4gdGhlCi0gICAgICAgICAgICByZW5kZXJlZCBIVE1MIG91dHB1dC4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgYWxsb3dlZCwgY29tbWFuZF9saW5rIGFuY2hvcnMgd2lsbCBoYXZlIGphdmFzY3JpcHQgY29kZQotICAgICAgICAgICAgdGhhdCBzdWJtaXRzIHRoZSBjb3JyZXNwb25kaW5nIGZvcm0uCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIG5vdCBhbGxvd2VkLCB0aGUgc3RhdGUgc2F2aW5nIGluZm8gYW5kIG5lc3RlZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICB3aWxsIGJlIGFkZGVkIGFzIHVybCBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFMTE9XX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5ERVRFQ1RfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCByZW5kZXJlZCBIVE1MIGNvZGUgd2lsbCBiZSBmb3JtYXR0ZWQsIHNvIHRoYXQgaXQgaXMgImh1bWFuIHJlYWRhYmxlIi4KLSAgICAgICAgICAgIGkuZS4gYWRkaXRpb25hbCBsaW5lIHNlcGFyYXRvcnMgYW5kIHdoaXRlc3BhY2Ugd2lsbCBiZSB3cml0dGVuLCB0aGF0IGRvIG5vdAotICAgICAgICAgICAgaW5mbHVlbmNlIHRoZSBIVE1MIGNvZGUuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUFJFVFRZX0hUTUw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCBhIGphdmFzY3JpcHQgZnVuY3Rpb24gd2lsbCBiZSByZW5kZXJlZCB0aGF0IGlzIGFibGUgdG8gcmVzdG9yZSB0aGUKLSAgICAgICAgICAgIGZvcm1lciB2ZXJ0aWNhbCBzY3JvbGwgb24gZXZlcnkgcmVxdWVzdC4gQ29udmVuaWVudCBmZWF0dXJlIGlmIHlvdSBoYXZlIHBhZ2VzCi0gICAgICAgICAgICB3aXRoIGxvbmcgbGlzdHMgYW5kIHlvdSBkbyBub3Qgd2FudCB0aGUgYnJvd3NlciBwYWdlIHRvIGFsd2F5cyBqdW1wIHRvIHRoZSB0b3AKLSAgICAgICAgICAgIGlmIHlvdSB0cmlnZ2VyIGEgbGluayBvciBidXR0b24gYWN0aW9uIHRoYXQgc3RheXMgb24gdGhlIHNhbWUgcGFnZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJmYWxzZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQVVUT19TQ1JPTEw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlVzZWQgZm9yIGVuY3J5cHRpbmcgdmlldyBzdGF0ZS4gT25seSByZWxldmFudCBmb3IgY2xpZW50IHNpZGUKLSAgICAgICAgICAgIHN0YXRlIHNhdmluZy4gU2VlIE15RmFjZXMgd2lraS93ZWIgc2l0ZSBkb2N1bWVudGF0aW9uIGZvciBpbnN0cnVjdGlvbnMKLSAgICAgICAgICAgIG9uIGhvdyB0byBjb25maWd1cmUgYW4gYXBwbGljYXRpb24gZm9yIGRpZmZlbmVudCBlbmNyeXB0aW9uIHN0cmVuZ3Rocy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFQ1JFVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPk56WTFORE15TVRBPTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZhbGlkYXRlIG1hbmFnZWQgYmVhbnMsIG5hdmlnYXRpb24gcnVsZXMgYW5kIGVuc3VyZSB0aGF0IGZvcm1zIGFyZSBub3QgbmVzdGVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuVkFMSURBVEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRyZWF0IHJlYWRvbmx5IHNhbWUgYXMgaWYgZGlzYWJsZWQgYXR0cmlidXRlIHdhcyBzZXQgZm9yIHNlbGVjdCBlbGVtZW50cy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlJFQURPTkxZX0FTX0RJU0FCTEVEX0ZPUl9TRUxFQ1RTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVXNlIHRoZSBkZWZpbmVkIGNsYXNzIGFzIHRoZSBjbGFzcyB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgcmVzb3VyY2UgaXMgYWRkZWQgdG8gdGhlCi0gICAgICAgICAgICBFeHRlbnNpb25GaWx0ZXIgaGFuZGxpbmcuIFVzaW5nIFN0cmVhbWluZ0FkZFJlc291cmNlIGhlcmUgaGVscHMgd2l0aCBwZXJmb3JtYW5jZS4gSWYgeW91IHdhbnQgdG8gYWRkCi0gICAgICAgICAgICBjdXN0b20gY29tcG9uZW50cyBhbmQgd2FudCB0byB1c2UgdGhlIEV4dGVuc2lvbkZpbHRlciwgeW91IG5lZWQgdG8gcHJvdmlkZSB5b3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBoZXJlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUREX1JFU09VUkNFX0NMQVNTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLnV0aWwuRGVmYXVsdEFkZFJlc291cmNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgICAgICAKLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWaXJ0dWFsIHBhdGggaW4gdGhlIFVSTCB3aGljaCB0cmlnZ2VycyBsb2FkaW5nIG9mIHJlc291cmNlcyBmb3IgdGhlIE15RmFjZXMgZXh0ZW5kZWQgY29tcG9uZW50cwotICAgICAgICAgICAgaW4gdGhlIEV4dGVuc2lvbkZpbHRlci4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlJFU09VUkNFX1ZJUlRVQUxfUEFUSDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi9mYWNlcy9teUZhY2VzRXh0ZW5zaW9uUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgQ2hlY2sgaWYgdGhlIGV4dGVuc2lvbnMtZmlsdGVyIGhhcyBiZWVuIHByb3Blcmx5IGNvbmZpZ3VyZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DSEVDS19FWFRFTlNJT05TX0ZJTFRFUjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgRGVmaW5lIHBhcnRpYWwgc3RhdGUgc2F2aW5nIGFzIHRydWUvZmFsc2UuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlBBUlRJQUxfU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotCi0gICAgPCEtLSBMaXN0ZW5lciwgdG8gYWxsb3cgSmV0dHkgc2VydmluZyBNeUZhY2VzIGFwcHMgLS0+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLndlYmFwcC5TdGFydHVwU2VydmxldENvbnRleHRMaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+Ci0gICAgPC9saXN0ZW5lcj4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCAtLT4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICAgIDwvc2VydmxldD4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCBNYXBwaW5nIC0tPgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+Ki5qc2Y8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPCEtLSBXZWxjb21lIGZpbGVzIC0tPgotICAgIDx3ZWxjb21lLWZpbGUtbGlzdD4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5qc3A8L3dlbGNvbWUtZmlsZT4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+Ci0gICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KLQotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkOWI1NS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwlLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tJT4KLQotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgICAgPGY6dmlldz4KLSAgICAgICAgICAgIDxoOmZvcm0gaWQ9Im1haW5Gb3JtIj4KLSAgICAgICAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjMiPgotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0iZmlyc3RfbmFtZSIgdmFsdWU9IkZpcnN0IG5hbWUqOiIvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0iZmlyc3RfbmFtZSIgbGFiZWw9IkZpcnN0IG5hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQucGVyc29uLmZpcnN0TmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0iZmlyc3RfbmFtZSIgc2hvd1N1bW1hcnk9ImZhbHNlIiBzaG93RGV0YWlsPSJ0cnVlIiBlcnJvclN0eWxlPSJjb2xvcjogcmVkOyIgd2FyblN0eWxlPSJjb2xvcjogb3JhbmdlOyIvPgotCi0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJsYXN0X25hbWUiIHZhbHVlPSJMYXN0IG5hbWUqKjoiLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9Imxhc3RfbmFtZSIgbGFiZWw9Ikxhc3QgbmFtZSIgdmFsdWU9IiN7aGVsbG9Xb3JsZC5wZXJzb24ubGFzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9Imxhc3RfbmFtZSIgc2hvd1N1bW1hcnk9ImZhbHNlIiBzaG93RGV0YWlsPSJ0cnVlIiBlcnJvclN0eWxlPSJjb2xvcjogcmVkOyIgd2FyblN0eWxlPSJjb2xvcjogb3JhbmdlOyIvPgotCi0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiB2YWx1ZT0iUHJlc3MgbWUiIGFjdGlvbj0iI3toZWxsb1dvcmxkLnNlbmR9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+Ci0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+Ci0gICAgICAgICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0gICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgPC9mOnZpZXc+Ci0gICAgICAgIDxoci8+Ci0gICAgICAgICogbm9uZSBibG9ja2luZyB3YXJuIG1vZGU8YnIvPgotICAgICAgICAqKiBibG9ja2luZyBlcnJvciBtb2RlCi0gICAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDgyZDUzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTwlLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tJT4KLQotPCVAIHBhZ2Ugc2Vzc2lvbj0iZmFsc2UiJT4KLTwlCi1yZXNwb25zZS5zZW5kUmVkaXJlY3QoImhlbGxvV29ybGQuanNmIik7Ci0lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFjODUyMy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgICAgPGgyPjxoOm91dHB1dFRleHQgdmFsdWU9IkhlbGxvICN7aGVsbG9Xb3JsZC5wZXJzb24uZmlyc3ROYW1lfSAje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfS4gV2UgaG9wZSB5b3UgZW5qb3kgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IhIi8+PC9oMj4KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kTGluayBhY3Rpb249ImJhY2siPgotICAgICAgICAgICAgICAgICAgICA8aDpvdXRwdXRUZXh0IHZhbHVlPSJIb21lIi8+Ci0gICAgICAgICAgICAgICAgPC9oOmNvbW1hbmRMaW5rPgotICAgICAgICAgICAgPC9oOmZvcm0+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgIDwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL3BvbS54bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYTFjOTkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgcHJvamVjdDwvbmFtZT4NCi0gICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxzY20+DQotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9leGFtcGxlczwvY29ubmVjdGlvbj4NCi0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9leGFtcGxlczwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4NCi0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2V4YW1wbGVzPC91cmw+DQotICAgIDwvc2NtPg0KLSAgICANCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPCEtLVRoaXMgcGx1Z2luIGFsbG93cyB0byBydW4gdGhlIGV4YW1wbGUgdXNpbmcgbXZuIGpldHR5OnJ1biAtLT4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpldHR5LXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Ni4xLjg8L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+MTA8L3NjYW5JbnRlcnZhbFNlY29uZHM+DQotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi0gICAgPG1vZHVsZXM+DQotICAgICAgICA8bW9kdWxlPmhlbGxvX3dvcmxkPC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPmhlbGxvX2JlYW4tdmFsaWRhdGlvbjwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5mZWF0dXJlLXNldF8wMTwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5mZWF0dXJlLXNldF8wMjwvbW9kdWxlPg0KLSAgICA8L21vZHVsZXM+DQotDQotICAgIDxwcm9maWxlcz4NCi0gICAgICAgIDwhLS0gVGhpcyBwcm9maWxlIGlzIGludm9rZWQgYnkgLURwcmVwYXJlUmVsZWFzZT10cnVlLiAgVGhpcyBhbGxvd3MgbXZuIHJlbGVhc2U6cHJlcGFyZSB0bw0KLSAgICAgICAgICAgIHJ1biBzdWNjZXNzZnVsbHkgb24gdGhlIGFzc2VtYmx5IHByb2plY3RzLiAtLT4NCi0gICAgICAgIDxwcm9maWxlPg0KLSAgICAgICAgICAgIDxpZD5wcmVwYXJlLXJlbGVhc2U8L2lkPg0KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPg0KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+DQotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wcmVwYXJlUmVsZWFzZTwvbmFtZT4NCi0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8L2FjdGl2YXRpb24+DQotICAgICAgICAgICAgPG1vZHVsZXM+DQotICAgICAgICAgICAgICAgIDxtb2R1bGU+YXNzZW1ibHk8L21vZHVsZT4NCi0gICAgICAgICAgICA8L21vZHVsZXM+DQotICAgICAgICAgICAgPGJ1aWxkPg0KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVsZWFzZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+LURwcmVwYXJlUmVsZWFzZTwvYXJndW1lbnRzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+DQotICAgICAgICAgICAgPC9idWlsZD4NCi0gICAgICAgIDwvcHJvZmlsZT4NCi0gICAgPC9wcm9maWxlcz4NCi0NCi0gICAgPHByb3BlcnRpZXM+DQotICAgICAgICA8dHJpbmlkYWQudmVyc2lvbj4xLjIuOTwvdHJpbmlkYWQudmVyc2lvbj4NCi0gICAgPC9wcm9wZXJ0aWVzPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2xvZ28vTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2xvZ28vTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9sb2dvL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2xvZ28vTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvbG9nby9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvbG9nby9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9sb2dvL2V4dHZhbC1sb2dvLnN2ZyBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvbG9nby9leHR2YWwtbG9nby5zdmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MmI1MzkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9sb2dvL2V4dHZhbC1sb2dvLnN2ZworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPCEtLSBDcmVhdGVkIHdpdGggSW5rc2NhcGUgKGh0dHA6Ly93d3cuaW5rc2NhcGUub3JnLykgLS0+Ci0KLQotPCEtLQotCUNvcHlyaWdodCAyMDA5IEVucmljbyBCZXJ0aSAoZW5yaWNvLmJlcnRpQGdtYWlsLmNvbSkKLQotCUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotCXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLQlZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotCSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotCVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLQlkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotCVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotCVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLQlsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0KLTxzdmcKLSAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCi0gICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCi0gICB2ZXJzaW9uPSIxLjAiCi0gICB3aWR0aD0iNzQ0LjA5NDQ4IgotICAgaGVpZ2h0PSIxMDUyLjM2MjIiCi0gICBpZD0ic3ZnMiI+Ci0gIDxkZWZzCi0gICAgIGlkPSJkZWZzNCIgLz4KLSAgPGcKLSAgICAgaWQ9ImxheWVyMiI+Ci0gICAgPHJlY3QKLSAgICAgICB3aWR0aD0iMzUzLjQxOTUzIgotICAgICAgIGhlaWdodD0iMTEzLjEwODQiCi0gICAgICAgcnk9IjExIgotICAgICAgIHg9IjE4Mi4yMzAxNSIKLSAgICAgICB5PSIzODEuMzMyOTIiCi0gICAgICAgaWQ9InJlY3QyNDg0IgotICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiM2NjY2NmY7c3Ryb2tlLXdpZHRoOjAuODAxODgyNjI7c3Ryb2tlLW9wYWNpdHk6MC45NDExNzY0NyIgLz4KLSAgPC9nPgotICA8ZwotICAgICBpZD0ibGF5ZXIxIj4KLSAgICA8cGF0aAotICAgICAgIGQ9Ik0gMTA3LjE4NzUsMzkzLjU2NjM4IEwgMTIyLjMwNDY5LDM5My41NjYzOCBMIDE3Ny41LDQ2Ny4zOTQ1MSBMIDE2Mi4zODI4MSw0NjcuMzk0NTEgTCAxMDcuMTg3NSwzOTMuNTY2MzggTSAxMjIuMzA0NjksNDY3LjM5NDUxIEwgMTA3LjE4NzUsNDY3LjM5NDUxIEwgMTYyLjM4MjgxLDM5My41NjYzOCBMIDE3Ny41LDM5My41NjYzOCBMIDEyMi4zMDQ2OSw0NjcuMzk0NTEgTSAxODUuOTM3NSwzODEuNjEzMjYgTCAxOTQuMDkzNzUsMzgxLjYxMzI2IEwgMTk2LjkwNjI1LDM5My41NjYzOCBMIDIxNC4wNjI1LDM5My41NjYzOCBMIDIxNC4wNjI1LDQwNC4xMTMyNiBMIDE5OC45NDUzMSw0MDQuMTEzMjYgTCAxOTguOTQ1MzEsNDQ2LjUxMTY5IEMgMTk4Ljk0NTMsNDUzLjQwMjMzIDIwMS45MjE4Niw0NTYuODQ3NjQgMjA3Ljg3NSw0NTYuODQ3NjMgTCAyMTQuMDYyNSw0NTYuODQ3NjMgTCAyMTQuMDYyNSw0NjcuMzk0NTEgTCAyMDQuNSw0NjcuMzk0NTEgQyAxOTIuMTI0OTksNDY3LjM5NDUxIDE4NS45Mzc1LDQ2MC43NjE3IDE4NS45Mzc1LDQ0Ny40OTYwNyBMIDE4NS45Mzc1LDM4MS42MTMyNiIKLSAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNDcuNTIxNzMsMTkuMjkxOTIyKSIKLSAgICAgICBpZD0iZmxvd1Jvb3QyNDYxIgotICAgICAgIHN0eWxlPSJmb250LXNpemU6NDBweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjE7Zm9udC1mYW1pbHk6U2Fuc2F0aW9uOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246U2Fuc2F0aW9uIiAvPgotICAgIDxwYXRoCi0gICAgICAgZD0iTSA0ODQuMTU2MjUsMzM3LjkzNzUgQyA0NzkuOTUwMDcsMzQxLjE4MTA1IDQ3Ni45MDg2MSwzNDUuNjAxMjEgNDczLjcxODc1LDM0OS43ODEyNSBDIDQ2Ni4wNzE5MiwzNjAuMTU5MDIgNDU4LjM1MzQ3LDM3MC40ODQ2MSA0NTAuODM3MzksMzgwLjk1Nzk2IEMgNDQwLjk4MTIzLDM5NC40NDg3MyA0MzEuMjk1OTMsNDA4LjA2NDQ5IDQyMS44MzI5OCw0MjEuODM0MTMgQyA0MTMuNjUwMDcsNDMzLjcyNzk5IDQwNS40NTU2OCw0NDUuNjE0MTIgMzk3LjM1ODU3LDQ1Ny41NjY2NiBDIDM5Ni43NDQ2LDQ1OC4zMzMwOSAzOTYuMzUxMTksNDU5LjMwNDI3IDM5NS41OTM3NSw0NTkuOTM3NSBDIDM5NC43ODMwMyw0NjAuNTA2MjcgMzkzLjM5Njk3LDQ2MC4wNzQyNSAzOTMuMzA5OTUsNDU5LjAwNzg1IEMgMzkwLjA1NzgyLDQ0MS42NDUxNCAzODYuNzcyNTYsNDI0LjI4ODY1IDM4My4zOTc0Miw0MDYuOTQ5MzggQyAzODIuMDI2LDM5OS43NzQyMiAzODAuNjI2NDMsMzkyLjYwMzQ0IDM3OS4wNjg2NiwzODUuNDY2MjUgQyAzNzguMzMzMDIsMzgyLjEyOTI0IDM3Ny41NTc2NCwzNzguNzg4NTQgMzc2LjQ1NTYsMzc1LjU1MjMzIEMgMzc2LjA4MTg5LDM3NC42OTM3MyAzNzUuOTI4NDYsMzczLjQ4NzM5IDM3NC44NjE1MiwzNzMuMjEzMzYgQyAzNzMuOTA5NDUsMzcyLjc3MzU5IDM3Mi44NzExMywzNzMuMzUwNTQgMzcyLjM2MTIzLDM3NC4xNzkwOSBDIDM3MS40MTQ4MSwzNzUuNTU2OTEgMzcwLjYxNTcxLDM3Ny4wNTc5OCAzNzAuMTYyNjMsMzc4LjY3Mzk4IEMgMzY5LjE1OTQ2LDM4MS43MDAxOSAzNjguODUwOTcsMzg0LjkwNDkyIDM2OC43MzQ0NSwzODguMDc0ODEgQyAzNjguNjY4NzYsMzkyLjc3NDE3IDM2OS40MDg4OCwzOTcuNDMzNjkgMzcwLjEyMTYyLDQwMi4wNjQ3OSBDIDM3MS45NDUxOCw0MTMuMzMzOTMgMzc0LjMyNDE3LDQyNC41MDM3MyAzNzYuMTc0ODYsNDM1Ljc2ODEzIEMgMzc2Ljg2MDU1LDQzOS41NzEwNyAzNzcuNTAyOTcsNDQzLjM4MzMgMzc3LjkxOTczLDQ0Ny4yMjY2OSBDIDM3OC40NTgxOCw0NTIuMTg3MDggMzc4LjU3ODQ3LDQ1Ny4xODI3OSAzNzguNjI1LDQ2Mi4xNjg3MyBDIDM3OC42NDg5Myw0NzAuNzM3MDkgMzc4LjA1MDM4LDQ3OS4zMDA4NSAzNzguMjY0MzksNDg3Ljg2OTc0IEMgMzc4LjUwNjk5LDQ5MS4wNjUxNSAzNzguOTQzNjksNDk0LjM5NDI5IDM4MC42MzY3Niw0OTcuMTgxNTUgQyAzODEuNzE4MTgsNDk4LjkxNjEgMzgzLjU3NDcsNTAwLjI1Nzg2IDM4NS42NzExNyw1MDAuMjk5NjUgQyAzODcuNzk1ODQsNTAwLjM0ODAzIDM4OS44OTcwNCw0OTkuNTU5NzUgMzkxLjYzMzU0LDQ5OC4zNzA4MyBDIDM5Mi45ODAxMSw0OTcuMzQ0MjggMzk0LjEwMDQ0LDQ5Ni4wMjM2NyAzOTQuOTk4ODksNDk0LjU5MTcyIEMgMzk2LjQ5ODMxLDQ5Mi4wNTI0NiAzOTguMDYzMDcsNDg5LjUzOTEzIDM5OS4yMzAyOCw0ODYuODI3OTcgQyA0MDAuNjEzNTMsNDgzLjcyODgzIDQwMS45NjQ3Miw0ODAuNjE0IDQwMy4xNzAyNiw0NzcuNDM5ODkgQyA0MDQuNzkzMzgsNDczLjIxNjQ1IDQwNi40MjU2Nyw0NjguOTkwMTIgNDA4LjQ0MDc0LDQ2NC45MzQyIEMgNDExLjc3NzkxLDQ1Ny44NTI1MSA0MTUuMzQyNjYsNDUwLjg4MDExIDQxOS4wMDgyLDQ0My45NjM2MiBDIDQyMS4wNTA2MSw0NDAuMTMwNDIgNDIzLjIwOTIxLDQzNi4zNTYzMSA0MjUuNTU4NjUsNDMyLjcwMjkzIEMgNDI4LjQwMjU0LDQyOC41MTM0NyA0MzEuNDE2NjEsNDI0LjQ0MzE4IDQzNC40MjkxMiw0MjAuMzc0NjUgQyA0NDAuMjg2NSw0MTIuNTc0NTYgNDQ2LjMzMzY3LDQwNC45MTk2NCA0NTIuMjM2OTEsMzk3LjE1NDQ3IEMgNDU2Ljk3ODc5LDM5MC45ODYxNSA0NjEuNzUyMzUsMzg0Ljg0MDcxIDQ2Ni4zOTMxNywzNzguNTk1ODcgQyA0NjkuMzUzNzMsMzc0LjU5MTY2IDQ3Mi4yMjE2MywzNzAuNTE2MzIgNDc0Ljk0MjkzLDM2Ni4zNDU2OCBDIDQ3Ny44NDQwNiwzNjEuNzY4NDcgNDgwLjUyNzU3LDM1Ny4wMzUwNSA0ODIuNjc0MjksMzUyLjA1NDA1IEMgNDg0LjA3OTkzLDM0OC42NzM3OSA0ODUuMjcwMzYsMzQ1LjEzOSA0ODUuNDQyNzMsMzQxLjQ1Mjc5IEMgNDg1LjQ1OTkxLDM0MC41MzQxOSA0ODUuNTU4MjMsMzM5LjU4MjY5IDQ4NS4zMTI1LDMzOC42ODc1IEMgNDg1LjExNzgzLDMzOC4yMzM1OSA0ODQuNzAyNDYsMzM3Ljc4MTA5IDQ4NC4xNTYyNSwzMzcuOTM3NSB6IgotICAgICAgIGlkPSJ0ZXh0MjQ3NSIKLSAgICAgICBzdHlsZT0iZm9udC1zaXplOjQ5LjMyMTY5MzQycHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiM5OWNjMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO2ZvbnQtZmFtaWx5OlNhbnNhdGlvbjstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlNhbnNhdGlvbiIgLz4KLSAgICA8cGF0aAotICAgICAgIGQ9Ik0gMTQyLjU1NDY5LDM5My41NjYzOCBDIDE2NS4xNDgzOCwzOTMuNTY2NDYgMTc0LjI2NTU2LDQwNy4xMTMzMiAxNjkuOTA2MjUsNDM0LjIwNzAxIEwgMTIwLjE5NTMxLDQzNC4yMDcwMSBDIDEyMC4xOTUzLDQ0OS4zMDA3NyAxMjkuNzEwOTEsNDU2Ljg0NzY0IDE0OC43NDIxOSw0NTYuODQ3NjMgQyAxNTUuMjU3NzYsNDU2Ljg0NzY0IDE2MS43NzMzOCw0NTYuMTQ0NTIgMTY4LjI4OTA2LDQ1NC43MzgyNiBMIDE2OC4yODkwNiw0NjUuMjg1MTMgQyAxNjEuNzczMzgsNDY2LjY5MTM4IDE1My44NTE1Miw0NjcuMzk0NTEgMTQ0LjUyMzQ0LDQ2Ny4zOTQ1MSBDIDExOS42MzI4LDQ2Ny4zOTQ1MSAxMDcuMTg3NSw0NTQuODA4NTggMTA3LjE4NzUsNDI5LjYzNjY5IEMgMTA3LjE4NzUsNDA1LjU4OTg4IDExOC45NzY1NSwzOTMuNTY2NDYgMTQyLjU1NDY5LDM5My41NjYzOCBNIDEyMC4xOTUzMSw0MjMuMzc4ODggTCAxNTguMDIzNDQsNDIzLjM3ODg4IEMgMTU4LjY3OTY0LDQxMC40NDE0NCAxNTIuODIwMjcsNDAzLjk3MjY5IDE0MC40NDUzMSw0MDMuOTcyNjMgQyAxMjcuNzg5MDQsNDAzLjk3MjY5IDEyMS4wMzkwNSw0MTAuNDQxNDQgMTIwLjE5NTMxLDQyMy4zNzg4OCIKLSAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg4MS4wNDI1LDE5LjI5MTY3NikiCi0gICAgICAgaWQ9ImZsb3dSb290NDc4MyIKLSAgICAgICBzdHlsZT0iZm9udC1zaXplOjQwcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO2ZvbnQtZmFtaWx5OlNhbnNhdGlvbjstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlNhbnNhdGlvbiIgLz4KLSAgICA8cGF0aAotICAgICAgIGQ9Ik0gMTA3LjE4NzUsNDQ0LjQwMjMyIEMgMTA3LjE4NzUsNDI5LjI2MTczIDExNy4xNzE4Nyw0MjEuNjkxNDMgMTM3LjE0MDYyLDQyMS42OTEzOCBDIDE0NC40OTk5Niw0MjEuNjkxNDMgMTUwLjkyMTgzLDQyMi4xNjAxOCAxNTYuNDA2MjUsNDIzLjA5NzYzIEwgMTU2LjQwNjI1LDQxNi4xMzY2OSBDIDE1Ni40MDYyLDQwOC4xMjExMyAxNDkuNzczMzksNDA0LjExMzMyIDEzNi41MDc4MSw0MDQuMTEzMjYgQyAxMjguOTE0MDQsNDA0LjExMzMyIDEyMS4xMzI4LDQwNS4yODUxOSAxMTMuMTY0MDYsNDA3LjYyODg4IEwgMTEzLjE2NDA2LDM5Ny4wODIwMSBDIDEyMS4xMzI4LDM5NC43MzgzMyAxMjguOTE0MDQsMzkzLjU2NjQ2IDEzNi41MDc4MSwzOTMuNTY2MzggQyAxNTguNDQ1MjYsMzkzLjU2NjQ2IDE2OS40MTQsNDAxLjQ0MTQ1IDE2OS40MTQwNiw0MTcuMTkxMzggTCAxNjkuNDE0MDYsNDY3LjM5NDUxIEwgMTYyLjgwNDY5LDQ2Ny4zOTQ1MSBMIDE1Ny42MDE1Niw0NjIuMTkxMzggQyAxNTEuMTc5NjQsNDY1LjY2MDEzIDE0My42MzI3OCw0NjcuMzk0NTEgMTM0Ljk2MDk0LDQ2Ny4zOTQ1MSBDIDExNi40NDUzLDQ2Ny4zOTQ1MSAxMDcuMTg3NSw0NTkuNzMwNDUgMTA3LjE4NzUsNDQ0LjQwMjMyIE0gMTU2LjQwNjI1LDQzMy42NDQ1MSBDIDE1MS4yNDk5Niw0MzIuNzA3MDQgMTQ0LjgyODA5LDQzMi4yMzgyOSAxMzcuMTQwNjIsNDMyLjIzODI2IEMgMTI1Ljg0MzczLDQzMi4yMzgyOSAxMjAuMTk1Myw0MzYuMjIyNjYgMTIwLjE5NTMxLDQ0NC4xOTEzOCBDIDEyMC4xOTUzLDQ1Mi42Mjg5IDEyNS4xMTcxNyw0NTYuODQ3NjQgMTM0Ljk2MDk0LDQ1Ni44NDc2MyBDIDE0My45NjA5LDQ1Ni44NDc2NCAxNTEuMTA5MzMsNDU0LjkyNTc3IDE1Ni40MDYyNSw0NTEuMDgyMDEgTCAxNTYuNDA2MjUsNDMzLjY0NDUxIgotICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDAwMDAyLDAsMCwxLDMyOS43MzgyOSwxOS4yOTE2NzYpIgotICAgICAgIGlkPSJmbG93Um9vdDQ4MDciCi0gICAgICAgc3R5bGU9ImZvbnQtc2l6ZTo0MHB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojNjY2NjY2O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtmb250LWZhbWlseTpTYW5zYXRpb247LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpTYW5zYXRpb24iIC8+Ci0gICAgPHBhdGgKLSAgICAgICBkPSJNIDEwNy4xODc1LDM2Ni44NDc2MyBMIDEwNy4xODc1LDQ2Ny4zOTQ1MSBMIDEyMC4xOTUzMSw0NjcuMzk0NTEgTCAxMjAuMTk1MzEsMzY2Ljg0NzYzIEwgMTA3LjE4NzUsMzY2Ljg0NzYzIgotICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDAwMDAyLDAsMCwxLDQwMy43OTkyOSwxOS4yOTE2NzYpIgotICAgICAgIGlkPSJmbG93Um9vdDQ4MTkiCi0gICAgICAgc3R5bGU9ImZvbnQtc2l6ZTo0MHB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojNjY2NjY2O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtmb250LWZhbWlseTpTYW5zYXRpb247LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpTYW5zYXRpb24iIC8+Ci0gIDwvZz4KLSAgPGcKLSAgICAgaWQ9ImxheWVyMyI+Ci0gICAgPHJlY3QKLSAgICAgICB3aWR0aD0iMTEuODkxNTk3IgotICAgICAgIGhlaWdodD0iMTIuODA2MzM1IgotICAgICAgIHg9IjMzMy41NzQ1NSIKLSAgICAgICB5PSI0MDAuODczODQiCi0gICAgICAgaWQ9InJlY3Q0Njk1IgotICAgICAgIHN0eWxlPSJmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KLSAgICA8cmVjdAotICAgICAgIHdpZHRoPSIxNS4wNzE0NzMiCi0gICAgICAgaGVpZ2h0PSIyMC4xMjQxNTciCi0gICAgICAgcnk9IjAuMzE0NDQxMzIiCi0gICAgICAgeD0iMjgxLjg5MTgyIgotICAgICAgIHk9IjQzOS43OTI0OCIKLSAgICAgICBpZD0icmVjdDQ2OTciCi0gICAgICAgc3R5bGU9ImZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utb3BhY2l0eToxIiAvPgotICAgIDxyZWN0Ci0gICAgICAgd2lkdGg9IjExLjg5MTU5NyIKLSAgICAgICBoZWlnaHQ9IjEwLjUzMDY0NSIKLSAgICAgICB4PSIzMjcuNjk2OTkiCi0gICAgICAgeT0iNDEyLjg3MTU1IgotICAgICAgIGlkPSJyZWN0NDg5MSIKLSAgICAgICBzdHlsZT0iZmlsbDojNjY2NjY2O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+Ci0gIDwvZz4KLTwvc3ZnPgpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9wYXJlbnQvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3BhcmVudC9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3BhcmVudC9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9wYXJlbnQvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvcGFyZW50L05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZjM2M2EuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9wYXJlbnQvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IKLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3BhcmVudC9wb20ueG1sIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9wYXJlbnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzOWVkZi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3BhcmVudC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+NjwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4yLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBQcm9qZWN0IFBhcmVudDwvbmFtZT4KLSAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMjwvdXJsPgotCi0gICAgPGlzc3VlTWFuYWdlbWVudD4KLSAgICAgICAgPHN5c3RlbT5qaXJhPC9zeXN0ZW0+Ci0gICAgICAgIDx1cmw+aHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0VYVFZBTDwvdXJsPgotICAgIDwvaXNzdWVNYW5hZ2VtZW50PgotCi0gICAgPGNpTWFuYWdlbWVudD4KLSAgICAgICAgPHN5c3RlbT5jb250aW51dW08L3N5c3RlbT4KLSAgICAgICAgPHVybD5odHRwOi8vbXlmYWNlcy56b25lcy5hcGFjaGUub3JnOjgwODAvY29udGludXVtPC91cmw+Ci0gICAgICAgIDxub3RpZmllcnM+Ci0gICAgICAgICAgICA8bm90aWZpZXI+Ci0gICAgICAgICAgICAgICAgPHR5cGU+bWFpbDwvdHlwZT4KLSAgICAgICAgICAgICAgICA8c2VuZE9uU3VjY2Vzcz50cnVlPC9zZW5kT25TdWNjZXNzPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8YWRkcmVzcz5jb21taXRzQG15ZmFjZXMuYXBhY2hlLm9yZzwvYWRkcmVzcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L25vdGlmaWVyPgotICAgICAgICA8L25vdGlmaWVycz4KLSAgICA8L2NpTWFuYWdlbWVudD4KLSAgICAKLSAgICA8aW5jZXB0aW9uWWVhcj4yMDA4PC9pbmNlcHRpb25ZZWFyPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfTwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0KLSAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+Ci0gICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFyY2hpdmU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmU+Ci0gICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgotCi0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgICAgICAgIC0gQ29weSBMSUNFTlNFLnR4dCBhbmQgTk9USUNFLnR4dCBzbyB0aGF0IHRoZXkgYXJlIGluY2x1ZGVkCi0gICAgICAgICAgICAgICAgICAgIC0gaW4gdGhlIC1qYXZhZG9jIGphciBmaWxlIGZvciB0aGUgY29tcG9uZW50LgotICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmphdmFkb2MucmVzb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1zb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vYXBpZG9jcy9NRVRBLUlORiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IkxJQ0VOU0UudHh0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik5PVElDRS50eHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5qYXZhZG9jLnNpdGUuY29weTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+c2l0ZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDb3B5IGphdmFkb2MgdG8gYW5vdGhlciBkaXJlY3RvcnksIHRvIGtlZXAgamF2YWRvYyBvZiBwcmV2aW91cyB2ZXJzaW9ucyBvbiBzaXRlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc2l0ZS9hcGlkb2NzLSR7cHJvamVjdC52ZXJzaW9ufSIgZmFpbG9uZXJyb3I9ImZhbHNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3NpdGUvYXBpZG9jcyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPCEtLQotICAgICAgICAgICAgICAgIC0gTWFrZSBhIGNoZWNrc3R5bGUgdmlvbGF0aW9uIGEgY29tcGlsZSBlcnJvci4gTm90ZSB0aGF0IGlmIGEgY29tcGlsZSBlcnJvciBvY2N1cnMsCi0gICAgICAgICAgICAgICAgLSBmdXJ0aGVyIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0YXJnZXQvc2l0ZS9jaGVja3N0eWxlLmh0bWwgKHByZXNlbnQgZXZlbiB3aGVuCi0gICAgICAgICAgICAgICAgLSBqdXN0IHRoZSBjb21waWxlIGdvYWwgYW5kIG5vdCB0aGUgc2l0ZSBnb2FsIGhhcyBiZWVuIHJ1bikuIE5vdGUgYWxzbyB0aGF0IGNoaWxkCi0gICAgICAgICAgICAgICAgLSBwcm9qZWN0cyBtYXkgcmVkZWNsYXJlIHRoaXMgcGx1Z2luIGFuZCBwcm92aWRlIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIHNldHRpbmdzCi0gICAgICAgICAgICAgICAgLSB0byB1c2UgZGlmZmVyZW50IGNoZWNrcyAobW9yZSBvciBsZXNzIHN0cmljdCB0aGFuIHRoZSBkZWZhdWx0KS4KLSAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGVja3N0eWxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+dmVyaWZ5LXN0eWxlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNoZWNrPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlnTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdGFuZGFyZC54bWw8L2NvbmZpZ0xvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aGVhZGVyTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWhlYWRlci50eHQ8L2hlYWRlckxvY2F0aW9uPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBTZXQgY29tcGlsZSBzb3VyY2UgYXQgMS41LCBzaW5jZSB0aGUgdGFyZ2V0IEpTRiBpbXBsIGlzIDEuMiAtLT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgotICAgICAgICAgICAgICAgICAgICA8b3B0aW1pemU+ZmFsc2U8L29wdGltaXplPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgICAgICAgICAgIAotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotICAgIDxyZXBvc2l0b3JpZXM+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPm1hdmVuMi1yZXBvc2l0b3J5LmRldi5qYXZhLm5ldDwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5KYXZhLm5ldCBSZXBvc2l0b3J5IGZvciBNYXZlbjwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL2Rvd25sb2FkLmphdmEubmV0L21hdmVuLzEvPC91cmw+Ci0gICAgICAgICAgICA8bGF5b3V0PmxlZ2FjeTwvbGF5b3V0PgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgPC9yZXBvc2l0b3JpZXM+Ci0KLSAgICA8cmVwb3J0aW5nPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWp4ci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXJlcG9ydC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40LjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBtZC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cnVsZXNldHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvYmFzaWMueG1sPC9ydWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL3VudXNlZGNvZGUueG1sPC9ydWxlc2V0PgotICAgICAgICAgICAgICAgICAgICA8L3J1bGVzZXRzPgotICAgICAgICAgICAgICAgICAgICA8bGlua1hyZWY+dHJ1ZTwvbGlua1hyZWY+Ci0gICAgICAgICAgICAgICAgICAgIDxtaW5pbXVtVG9rZW5zPjEwMDwvbWluaW11bVRva2Vucz4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldEpkaz4xLjU8L3RhcmdldEpkaz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1jaGVja3Mtc3RhbmRhcmQueG1sPC9jb25maWdMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGhlYWRlckxvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1oZWFkZXIudHh0PC9oZWFkZXJMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvcmVwb3J0aW5nPgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvcGFyZW50PC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvcGFyZW50PC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9wYXJlbnQ8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgICAgICA8c25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICAgICAgPHVuaXF1ZVZlcnNpb24+ZmFsc2U8L3VuaXF1ZVZlcnNpb24+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLnNuYXBzaG90czwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgTWF2ZW4gU25hcHNob3QgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgPHNpdGU+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTI8L3VybD4KLSAgICAgICAgPC9zaXRlPgotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtYXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wZXJmb3JtUmVsZWFzZTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvY3M8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxqc2YudmVyc2lvbj4xLjIuNDwvanNmLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3BhcmVudC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTNlMjA5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSAtLS0tLS0NCi1PdmVydmlldw0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMg0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS54IGFuZCBKU0YgMi54LiBBbGwgdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsNCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3BhcmVudC9zcmMvc2l0ZS9hcHQvamF2YWRvYy5hcHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3BhcmVudC9zcmMvc2l0ZS9hcHQvamF2YWRvYy5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZmQzNmYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9wYXJlbnQvc3JjL3NpdGUvYXB0L2phdmFkb2MuYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIC0tLS0tLQ0KLUphdmFkb2MNCi0gLS0tLS0tDQotDQotSmF2YWRvYw0KLQ0KLSAgICBIZXJlIHlvdSBjYW4gZmluZCB0aGUgamF2YWRvYyBvZiBwcmV2aW91cyBleHR2YWwgdmVyc2lvbnMuDQotDQotICAgICoge3t7aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL215ZmFjZXMtZXh0dmFsLWNvcmUvYXBpZG9jcy0xLjIuMS9pbmRleC5odG1sfU15ZmFjZXMgRXh0VmFsIENvcmUgVmVyc2lvbiAxLjIuMX19DQotDQotICAgICoge3t7aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL3ZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb24vYXBpZG9jcy0xLjIuMS9pbmRleC5odG1sfU15ZmFjZXMgRXh0VmFsIFByb3BlcnR5IFZhbGlkYXRpb24gVmVyc2lvbiAxLjIuMX19DQotDQotICAgICoge3t7aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL215ZmFjZXMtZXh0dmFsLWNvcmUvYXBpZG9jcy0xLjIuMi9pbmRleC5odG1sfU15ZmFjZXMgRXh0VmFsIENvcmUgVmVyc2lvbiAxLjIuMn19DQotDQotICAgICoge3t7aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL3ZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb24vYXBpZG9jcy0xLjIuMi9pbmRleC5odG1sfU15ZmFjZXMgRXh0VmFsIFByb3BlcnR5IFZhbGlkYXRpb24gVmVyc2lvbiAxLjIuMn19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9wYXJlbnQvc3JjL3NpdGUvc2l0ZS54bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3BhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc4NjQ5Zi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3BhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCBuYW1lPSJBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciI+Ci0gIDxiYW5uZXJMZWZ0PgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dFZhbDwvbmFtZT4KLSAgICA8c3JjPmltYWdlcy9leHR2YWxfbG9nby5wbmc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2luZGV4Lmh0bWw8L2hyZWY+Ci0gIDwvYmFubmVyTGVmdD4KLQotICA8YmFubmVyUmlnaHQ+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXM8L25hbWU+Ci0gICAgPHNyYz5pbWcvYmFubmVycy9NeUZhY2VzX2xvZ28uanBnPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sPC9ocmVmPgotICA8L2Jhbm5lclJpZ2h0PgotCi0gIDxwdWJsaXNoRGF0ZSBmb3JtYXQ9ImRkIE1NTSB5eXl5Ii8+Ci0KLSAgPHNraW4+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLm1hdmVuPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtc2l0ZS1za2luPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvc2tpbj4KLQotICA8Ym9keT4KLSAgICA8bGlua3M+Ci0gICAgICA8aXRlbSBuYW1lPSJBcGFjaGUiIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZyIvPgotICAgICAgPGl0ZW0gbmFtZT0iTXlGYWNlcyIgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCBNeWZhY2VzIEV4dFZhbCIgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9kb3dubG9hZC5odG1sIi8+Ci0gICAgPC9saW5rcz4KLQotICAgIDxtZW51IG5hbWU9IkFwYWNoZSBNeUZhY2VzIiBpbmhlcml0PSJ0b3AiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZG93bmxvYWQuaHRtbCIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IG5hbWU9IkNvbnRlbnRzIiBpbmhlcml0PSJ0b3AiPgotICAgICAgICA8aXRlbSBuYW1lPSJNYWluIFNpdGUiICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sIi8+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkV4dFZhbCBmb3IgSlNGIDEuMSIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExL2luZGV4Lmh0bWwiIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9ImR1bW15IiAgICAgICAgaHJlZj0iZHVtbXkiLz4KLSAgICAgICAgPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjIiICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJDb3JlIE1vZHVsZSIgICAgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9teWZhY2VzLWV4dHZhbC1jb3JlL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iUHJvcGVydHkgVmFsaWRhdGlvbiIgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvdmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbi9pbmRleC5odG1sIi8+Ci0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IlRyaW5pZGFkIFN1cHBvcnQiICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2NvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0L2luZGV4Lmh0bWwiLz4KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iR2VuZXJpYyBTdXBwb3J0IiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydC9pbmRleC5odG1sIi8+Ci0gICAgICAgIDwvaXRlbT4KLSAgICA8L21lbnU+Ci0JCi0gICAgPG1lbnUgbmFtZT0iRG9jdW1lbnRhdGlvbiI+Ci0gICAgICA8aXRlbSBuYW1lPSJXaWtpIiAgICAgICAgIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvbXlmYWNlcy9FeHRlbnNpb25zL1ZhbGlkYXRvci8iLz4KLSAgICAgIDxpdGVtIG5hbWU9IkphdmFkb2MiICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2phdmFkb2MuaHRtbCIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IHJlZj0icmVwb3J0cyIvPgotCi0gICAgPG1lbnUgbmFtZT0iRm91bmRhdGlvbiIgaW5oZXJpdD0iYm90dG9tIj4KLSAgICAgIDxpdGVtIG5hbWU9IkFTRiIgICAgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIiAvPgotICAgICAgPGl0ZW0gbmFtZT0iU3BvbnNvcnNoaXAiICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3Nwb25zb3JzaGlwLmh0bWwiIC8+Ci0gICAgICA8aXRlbSBuYW1lPSJUaGFua3MiICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vdGhhbmtzLmh0bWwiIC8+Ci0gICAgPC9tZW51PgotICA8L2JvZHk+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3BvbS54bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYzc1NjEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj42PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLW1vZHVsZTwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjIuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIE1vZHVsZTwvbmFtZT4KLSAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMjwvdXJsPgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay88L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgICAgICA8c25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICAgICAgPHVuaXF1ZVZlcnNpb24+ZmFsc2U8L3VuaXF1ZVZlcnNpb24+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLnNuYXBzaG90czwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgTWF2ZW4gU25hcHNob3QgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgPHNpdGU+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTI8L3VybD4KLSAgICAgICAgPC9zaXRlPgotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotICAgIDwhLS0gV0FSTklORzogRE8gTk9UIEdFTkVSQVRFIFNJVEUgRlJPTSBIRVJFIERJUkVDVExZCi0gICAgU2luY2UgdGhpcyBwcm9qZWN0IGhhcyBhbiBhc3luYyByZWxlYXNlIHByb2NlZHVyZSAobm90Ci0gICAgYWxsIG1vZHVsZXMgc2hvdWxkIGJlIHJlbGVhc2VkIGF0IG9uY2UpLCB0aGUgcGFyZW50IHBvbS54bWwgCi0gICAgaXMgbm90IHRoaXMgKHRoZXJlIGlzIGEgbW9kdWxlIGZvciB0aGF0KS4gVXNlIG1hdmVuIHNpdGUgCi0gICAgcGx1Z2luIGhlcmUgY2F1c2UgcHJvYmxlbXMgd2hlbiB0aGUgc2l0ZSBpcyBnZW5lcmF0ZWQuCi0gICAgVGhlIHByb2NlZHVyZSBtdXN0IGV4ZWN1dGUgc2l0ZSBjb21tbWFuZCBmaXJzdCBvbiBwYXJlbnQgCi0gICAgbW9kdWxlIGFuZCB0aGVuIG9uIGVhY2ggbW9kdWxlIGxpc3RlZCBiZWxvdy4gCi0gICAgIC0tPgotCi0gICAgPG1vZHVsZXM+Ci0gICAgICAgIDxtb2R1bGU+cGFyZW50PC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+Y29yZTwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPnZhbGlkYXRpb24tbW9kdWxlczwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmNvbXBvbmVudC1zdXBwb3J0PC9tb2R1bGU+Ci0gICAgICAgIDwhLS1tb2R1bGU+dGVzdC1tb2R1bGVzPC9tb2R1bGUtLT4KLSAgICAgICAgPCEtLW1vZHVsZT5leGFtcGxlczwvbW9kdWxlLS0+Ci0gICAgPC9tb2R1bGVzPgotCi0gICAgPHByb2ZpbGVzPgotICAgICAgICA8IS0tIFRoaXMgcHJvZmlsZSBpcyBpbnZva2VkIGJ5IC1EcHJlcGFyZVJlbGVhc2U9dHJ1ZS4gIFRoaXMgYWxsb3dzIG12biByZWxlYXNlOnByZXBhcmUgdG8KLSAgICAgICAgICAgIHJ1biBzdWNjZXNzZnVsbHkgb24gdGhlIGFzc2VtYmx5IHByb2plY3RzLiAtLT4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+cHJlcGFyZS1yZWxlYXNlPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+cHJlcGFyZVJlbGVhc2U8L25hbWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxtb2R1bGVzPgotICAgICAgICAgICAgICAgIDxtb2R1bGU+YXNzZW1ibHk8L21vZHVsZT4KLSAgICAgICAgICAgIDwvbW9kdWxlcz4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ3VtZW50cz4tRHByZXBhcmVSZWxlYXNlPC9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotCi0gICAgPHJlcG9ydGluZz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kb2FwLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjYXRlZ29yeT53ZWItZnJhbWV3b3JrLCB2YWxpZGF0aW9uPC9jYXRlZ29yeT4KLSAgICAgICAgICAgICAgICAgICAgPGxhbmd1YWdlPkphdmE8L2xhbmd1YWdlPgotICAgICAgICAgICAgICAgICAgICA8c2hvcnRkZXNjPkpTRiBjZW50cmljIHZhbGlkYXRpb24gZnJhbWV3b3JrIGZvciBtZXRhZGF0YSBiYXNlZCB2YWxpZGF0aW9uLjwvc2hvcnRkZXNjPgotICAgICAgICAgICAgICAgICAgICA8cG1jPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmc8L3BtYz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvcmVwb3J0aW5nPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxqc2YudmVyc2lvbj4xLjIuNDwvanNmLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvc2l0ZS9wb20ueG1sIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9zaXRlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NjhlMDIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9zaXRlL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gICAgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgICAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgICAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICAgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgICAqCi0gICAgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAgICoKLSAgICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+NjwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtc2l0ZTwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yPC9uYW1lPgotICAgIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjwvdXJsPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8ZGVmYXVsdEdvYWw+c2l0ZTwvZGVmYXVsdEdvYWw+Ci0gICAgICAgIDxleHRlbnNpb25zPgotICAgICAgICAgIDxleHRlbnNpb24+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLndhZ29uPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+d2Fnb24tc3NoLWV4dGVybmFsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wLWFscGhhLTU8L3ZlcnNpb24+Ci0gICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgIDwvZXh0ZW5zaW9ucz4KLSAgICA8L2J1aWxkPgotICAgIDxyZXBvcnRpbmc+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvcmVwb3J0aW5nPgotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rL3NpdGU8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay9zaXRlPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rL3NpdGU8L3VybD4KLSAgICA8L3NjbT4KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgIDxzaXRlPgotICAgICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPgotICAgICAgICA8bmFtZT5BcGFjaGUgV2Vic2l0ZTwvbmFtZT4KLSAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yPC91cmw+Ci0gICAgICA8L3NpdGU+Ci0gICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3NpdGUvc3JjL3NpdGUvYXB0L2Rvd25sb2FkLmFwdCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvc2l0ZS9zcmMvc2l0ZS9hcHQvZG93bmxvYWQuYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzUxNGUwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvc2l0ZS9zcmMvc2l0ZS9hcHQvZG93bmxvYWQuYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLSB+fiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gfn4gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotIH5+IHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gfn4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gfn4gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gfn4gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gfn4NCi0gfn4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gfn4NCi0gfn4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSB+fiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSB+fiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gfn4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSB+fiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gDQotIC0tLS0tLQ0KLURvd25sb2FkIEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotIC0tLS0tLQ0KLQ0KLURvd25sb2FkIEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotDQotDQotICBVc2UgdGhlIGxpbmtzIGJlbG93IHRvIGRvd25sb2FkIGEgZGlzdHJpYnV0aW9uIG9mIEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZyb20NCi0gIG9uZSBvZiBvdXIgbWlycm9ycy4gSXQgaXMgZ29vZCBwcmFjdGljZSB0byB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGUNCi0gIGRpc3RyaWJ1dGlvbiBmaWxlcy4NCi0NCi0gIFlvdSB3aWxsIGJlIHByb21wdGVkIGZvciBhIG1pcnJvciAtIGlmIHRoZSBmaWxlIGlzIG5vdCBmb3VuZCBvbiB5b3VycywgcGxlYXNlIGJlIHBhdGllbnQsIGFzIGl0IG1heSB0YWtlIDI0DQotICBob3VycyB0byByZWFjaCBhbGwgbWlycm9ycy4NCi0NCi0gIEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGRpc3RyaWJ1dGVkIGFzIGEgPDw8emlwPj4+IGFyY2hpdmUgKGZvciBXaW5kb3dzKSBhbmQNCi0gIGFzIGEgPDw8dGFyLmd6Pj4+IGFyY2hpdmUgKGZvciBVTklYKS4gVGhlIGNvbnRlbnQgaXMgdGhlIHNhbWUuIFBsZWFzZSBub3RlDQotICB0aGF0IHRoZSA8PDx0YXIuZ3o+Pj4gYXJjaGl2ZXMgY29udGFpbiBmaWxlIG5hbWVzIGxvbmdlciB0aGFuIDEwMCBjaGFyYWN0ZXJzIGFuZCBoYXZlIGJlZW4NCi0gIGNyZWF0ZWQgdXNpbmcgR05VIHRhciBleHRlbnNpb25zLiBUaHVzIHRoZXkgbXVzdCBiZSB1bnRhcnJlZCB3aXRoIGEgR05VIGNvbXBhdGlibGUNCi0gIHZlcnNpb24gb2YgdGFyLg0KLQ0KLSAgPDwgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgMS4wLjAgRGlzdHJpYnV0aW9uID4+DQotDQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCAgICAgICAgICAgICAgICAgICAgICAgICB8IE1pcnJvcnMgfCBDaGVja3N1bSB8IFNpZ25hdHVyZSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4xIDEuMS4yICh0YXIuZ3opICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nen0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nei5tZDV9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nei5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6LmFzY30gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6LmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjEgMS4xLjIgKHppcCkgICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnppcH0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4uemlwfX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnppcC5tZDV9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnppcC5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4uemlwLmFzY30gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4uemlwLmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjEgMS4xLjIgU291cmNlICh0YXIuZ3opICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy50YXIuZ3p9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnRhci5nen19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMudGFyLmd6Lm1kNX0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMudGFyLmd6Lm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMudGFyLmd6LmFzY30gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMudGFyLmd6LmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjEgMS4xLjIgU291cmNlICh6aXApICAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMuemlwfSBteWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy56aXB9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnppcC5tZDV9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnppcC5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnppcC5hc2N9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnppcC5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4yIDEuMi4yICh0YXIuZ3opICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnRhci5nen0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4udGFyLmd6fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnRhci5nei5tZDV9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnRhci5nei5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4udGFyLmd6LmFzY30gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4udGFyLmd6LmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjIgMS4yLjIgKHppcCkgICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnppcH0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4uemlwfX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnppcC5tZDV9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnppcC5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4uemlwLmFzY30gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4uemlwLmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjIgMS4yLjIgU291cmNlICh0YXIuZ3opICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy50YXIuZ3p9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnRhci5nen19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMudGFyLmd6Lm1kNX0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMudGFyLmd6Lm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMudGFyLmd6LmFzY30gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMudGFyLmd6LmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjIgMS4yLjIgU291cmNlICh6aXApICAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMuemlwfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy56aXB9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnppcC5tZDV9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnppcC5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnppcC5hc2N9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnppcC5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotDQotTGF0ZXN0IHNvdXJjZSBjb2RlIGZyb20gU1ZOIHJlcG9zaXRvcnkNCi0NCi0gICAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBsYXRlc3QgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZmVhdHVyZXMsIHRoZSBzb3VyY2UgY29kZSBpcyB1bmRlcg0KLSAgICB2ZXJzaW9uIGNvbnRyb2wgd2l0aCBTVk4uICBDbGljayB7e3tzb3VyY2UtcmVwb3NpdG9yeS5odG1sfSBoZXJlIH19DQotICAgIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIHRoZSBBU0YgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgU1ZOIFJlcG9zaXRvcnkuDQotDQotVmVyaWZ5aW5nIGNoZWNrc3Vtcw0KLQ0KLSAgICBJdCBpcyBlc3NlbnRpYWwgdGhhdCB5b3UgdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGRvd25sb2FkZWQNCi0gICAgZmlsZXMgdXNpbmcgdGhlIFBHUCBhbmQgTUQ1IHNpZ25hdHVyZXMuIE1ENSB2ZXJpZmljYXRpb24gZW5zdXJlcyB0aGUNCi0gICAgZmlsZSB3YXMgbm90IGNvcnJ1cHRlZCBkdXJpbmcgdGhlIGRvd25sb2FkIHByb2Nlc3MuIFBHUCB2ZXJpZmljYXRpb24NCi0gICAgZW5zdXJlcyB0aGF0IHRoZSBmaWxlIGNhbWUgZnJvbSBhIGNlcnRhaW4gcGVyc29uLg0KLQ0KLSAgICBUbyB2ZXJpZnkgdGhlIE1ENSBzaWduYXR1cmUgb24gdGhlIGZpbGVzLCB5b3UgbmVlZCB0byB1c2UgYSBwcm9ncmFtDQotICAgIGNhbGxlZCA8PDxtZDU+Pj4gb3IgPDw8bWQ1c3VtPj4+LCB3aGljaCBpcw0KLSAgICBpbmNsdWRlZCBpbiBtYW55IFVOSVggZGlzdHJpYnV0aW9ucy4gIEl0IGlzIGFsc28gYXZhaWxhYmxlIGFzIHBhcnQgb2YNCi0gICAge3t7aHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL3RleHR1dGlscy90ZXh0dXRpbHMuaHRtbH1HTlUgVGV4dHV0aWxzfX0uDQotICAgIFdpbmRvd3MgdXNlcnMgY2FuIGdldCBiaW5hcnkgbWQ1IHByb2dyYW1zIGZyb20ge3t7aHR0cDovL3d3dy5mb3VybWlsYWIuY2gvbWQ1L31oZXJlfX0sDQotICAgIHt7e2h0dHA6Ly93d3cucGMtdG9vbHMubmV0L3dpbjMyL2ZyZWV3YXJlL2NvbnNvbGUvfWhlcmV9fSwgb3INCi0gICAge3t7aHR0cDovL3d3dy5zbGF2YXNvZnQuY29tL2ZzdW0vfWhlcmV9fS4NCi0NCi1WZXJpZnlpbmcgc2lnbmF0dXJlcw0KLQ0KLSAgCVBHUCB2ZXJpZmljYXRpb24gZW5zdXJlcyB0aGF0IHRoZSBmaWxlIGNhbWUgZnJvbSBhIGNlcnRhaW4gcGVyc29uLiAgV2Ugc3Ryb25nbHkgcmVjb21tZW5kDQotCSAgeW91IHZlcmlmeSB5b3VyIGRvd25sb2FkcyB3aXRoIGJvdGggUEdQIGFuZCBNRDUuDQotDQotCVRoZSBQR1Agc2lnbmF0dXJlcyBjYW4gYmUgdmVyaWZpZWQgdXNpbmcge3t7aHR0cDovL3d3dy5wZ3BpLm9yZy99UEdQfX0gb3IgDQotCXt7e2h0dHA6Ly93d3cuZ251cGcub3JnL31HUEd9fS4gIEZpcnN0IGRvd25sb2FkIHRoZSBBcGFjaGUgTXlGYWNlcyANCi0Je3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9LRVlTfUtFWVN9fQlhcyB3ZWxsIGFzIHRoZSA8PDxhc2M+Pj4gc2lnbmF0dXJlIGZpbGUgDQotCWZvciB0aGUgcGFydGljdWxhciBkaXN0cmlidXRpb24uIEl0IGlzIGltcG9ydGFudCB0aGF0IHlvdSBnZXQgdGhlc2UgZmlsZXMgZnJvbSB0aGUgdWx0aW1hdGUNCi0JdHJ1c3RlZCBzb3VyY2UgLSB0aGUgbWFpbiBBU0YgZGlzdHJpYnV0aW9uIHNpdGUsIHJhdGhlciB0aGFuIGZyb20gYSBtaXJyb3IuDQotCVRoZW4gdmVyaWZ5IHRoZSBzaWduYXR1cmVzIHVzaW5nIC4uLg0KLQ0KLQkgIDw8PA0KLQkgICUgcGdwayAtYSBLRVlTDQotCSAgJSBwZ3B2IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nei5hc2MgbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6DQotCSAgPj4+DQotDQotCSAgPG9yPg0KLQ0KLQkgIDw8PA0KLQkgICUgcGdwIC1rYSBLRVlTDQotCSAgJSBwZ3AgbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6LmFzYyBteWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi50YXIuZ3oNCi0JICA+Pj4NCi0NCi0JICA8b3I+DQotDQotCSAgPDw8DQotICAJJSBncGcgLS1pbXBvcnQgS0VZUw0KLQkgICUgZ3BnIC0tdmVyaWZ5IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nei5hc2MgbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6DQotCSAgPj4+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9zaXRlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3NpdGUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwOTU1Ny4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3NpdGUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGEgSlNGIGNlbnRyaWMgdmFsaWRhdGlvbiBmcmFtZXdvcmsuDQotICANCi0gICAgSXQgb2ZmZXJzIHBvd2VyZnVsIGFuZCBlYXN5IHRvIHVzZSBmaWVsZCBiYXNlZCB2YWxpZGF0aW9uIGJhc2VkIG9uIGFubm90YXRpb25zLg0KLUl0IGhhcyBhIHBsdWdnYWJsZSBhcmNoaXRlY3R1cmUsIHNvIGl0IGlzIHBvc3NpYmxlIHRvIGFkZCBuZXcgdmFsaWRhdGlvbiBtb2R1bGVzIG9yIHN1cHBvcnQgZm9yIGNvbXBvbmVudCBsaWJyYXJpZXMgbGlrZSBUcmluaWRhZCBvciBvdGhlciAzcmQgcGFydHkgZnJhbWV3b3Jrcy4NCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEueCBhbmQgSlNGIDIueC4gQWxsIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrDQotDQotICAgIEZ1cnRoZXIgaW5mb3JtYXRpb24gYXJlIGF2YWlsYWJsZSBhdCB0aGUge3t7aHR0cDovL3dpa2kuYXBhY2hlLm9yZy9teWZhY2VzL0V4dGVuc2lvbnMvVmFsaWRhdG9yL31XaWtpfX0uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9zaXRlL3NyYy9zaXRlL3NpdGUueG1sIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9zaXRlL3NyYy9zaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmM5ZTg1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvc2l0ZS9zcmMvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCBuYW1lPSJBcGFjaGUgTXlmYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciI+Ci0gIDxiYW5uZXJMZWZ0PgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dFZhbDwvbmFtZT4KLSAgICA8c3JjPmltYWdlcy9leHR2YWxfbG9nby5wbmc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2luZGV4Lmh0bWw8L2hyZWY+Ci0gIDwvYmFubmVyTGVmdD4KLQotICA8YmFubmVyUmlnaHQ+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXM8L25hbWU+Ci0gICAgPHNyYz5pbWcvYmFubmVycy9NeUZhY2VzX2xvZ28uanBnPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sPC9ocmVmPgotICA8L2Jhbm5lclJpZ2h0PiAKLQotICA8cHVibGlzaERhdGUgZm9ybWF0PSJkZCBNTU0geXl5eSIvPgotCi0gIDxza2luPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5tYXZlbjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLXNpdGUtc2tpbjwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3NraW4+Ci0KLSAgPGJvZHk+Ci0gICAgPGxpbmtzPgotICAgICAgPGl0ZW0gbmFtZT0iQXBhY2hlIiBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmciLz4KLSAgICAgIDxpdGVtIG5hbWU9Ik15RmFjZXMiIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQgTXlmYWNlcyBFeHRWYWwiICAgICAgIGhyZWY9ImRvd25sb2FkLmh0bWwiLz4KLSAgICA8L2xpbmtzPgotCi0gICAgPG1lbnUgbmFtZT0iQXBhY2hlIE15RmFjZXMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9kb3dubG9hZC5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgbmFtZT0iQ29udGVudHMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9Ik1haW4gU2l0ZSIgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgPGl0ZW0gbmFtZT0iRXh0VmFsIGZvciBKU0YgMS4xIiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvaW5kZXguaHRtbCIgY29sbGFwc2U9InRydWUiPgotICAgICAgICAgICAgPGl0ZW0gbmFtZT0iZHVtbXkiICAgICAgICBocmVmPSJkdW1teSIvPgotICAgICAgICA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkV4dFZhbCBmb3IgSlNGIDEuMiIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2luZGV4Lmh0bWwiIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9ImR1bW15IiAgICAgICAgaHJlZj0iZHVtbXkiLz4KLSAgICAgICAgPC9pdGVtPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IG5hbWU9IkRvY3VtZW50YXRpb24iPgotICAgICAgPGl0ZW0gbmFtZT0iV2lraSIgICAgICAgICBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL215ZmFjZXMvRXh0ZW5zaW9ucy9WYWxpZGF0b3IvIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgcmVmPSJyZXBvcnRzIi8+Ci0KLSAgICA8bWVudSBuYW1lPSJGb3VuZGF0aW9uIiBpbmhlcml0PSJ0b3AiPgotICAgICAgPGl0ZW0gbmFtZT0iQVNGIiAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iIC8+Ci0gICAgICA8aXRlbSBuYW1lPSJTcG9uc29yc2hpcCIgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vc3BvbnNvcnNoaXAuaHRtbCIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlRoYW5rcyIgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi90aGFua3MuaHRtbCIgLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9wb20ueG1sIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OTkxYmUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZTwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBCYXNlLVRlc3QtSW5mcmFzdHJ1Y3R1cmU8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPnRlc3QtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9BYnN0cmFjdEV4VmFsVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvQWJzdHJhY3RFeFZhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MjdiMTYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9BYnN0cmFjdEV4VmFsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLio7DQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5lbC5Nb2NrRXhwcmVzc2lvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrLio7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UudXRpbC5UZXN0VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkV4dFZhbFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5EZWZhdWx0RmFjdG9yeUZpbmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlByb2plY3RTdGFnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5BYnN0cmFjdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWRfaW1wbC5jb25maWcuTXlmYWNlc0NvbmZpZzsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY3RvcnlGaW5kZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlJbnB1dDsNCi1pbXBvcnQgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogQWJzdHJhY3QgU2hhbGUgVGVzdCBiYXNlIGNsYXNzLCB3aGljaCBzZXRzIHVwIHRoZSBKU0YgZW52aXJvbm1lbnQuICBJZiB0aGUgdGVzdA0KLSAqIG92ZXJyaWRlcyA8Y29kZT5zZXRVcCgpPC9jb2RlPiBhbmQvb3IgPGNvZGU+dGVhckRvd24oKTwvY29kZT4sIHRoZW4gdGhvc2UNCi0gKiBtZXRob2RzIGJ1dCBjYWxsIHRoZSBvdmVyd2l0dGVuIG1ldGhvZCB0byBpbnN1cmUgYSB2YWxpZCB0ZXN0IGVudmlyb25tZW50Lg0KLSAqLw0KLUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RXhWYWxUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlDQotew0KLSAgICBwcm90ZWN0ZWQgTW9ja0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uOw0KLSAgICBwcm90ZWN0ZWQgTW9ja1NlcnZsZXRDb25maWcgY29uZmlnOw0KLSAgICBwcm90ZWN0ZWQgTW9ja0V4dGVybmFsQ29udGV4dCBleHRlcm5hbENvbnRleHQ7DQotICAgIHByb3RlY3RlZCBNb2NrRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dDsNCi0gICAgcHJvdGVjdGVkIE1vY2tGYWNlc0NvbnRleHRGYWN0b3J5IGZhY2VzQ29udGV4dEZhY3Rvcnk7DQotICAgIHByb3RlY3RlZCBNb2NrTGlmZWN5Y2xlIGxpZmVjeWNsZTsNCi0gICAgcHJvdGVjdGVkIE1vY2tMaWZlY3ljbGVGYWN0b3J5IGxpZmVjeWNsZUZhY3Rvcnk7DQotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgcmVuZGVyS2l0Ow0KLSAgICBwcm90ZWN0ZWQgTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0Ow0KLSAgICBwcm90ZWN0ZWQgTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2U7DQotICAgIHByb3RlY3RlZCBNb2NrU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQ7DQotICAgIHByb3RlY3RlZCBNb2NrSHR0cFNlc3Npb24gc2Vzc2lvbjsNCi0gICAgcHJvdGVjdGVkIE1vY2tFeHByZXNzaW9uRmFjdG9yeSBleHByZXNzaW9uRmFjdG9yeTsNCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciB0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXI7DQotDQotICAgIC8qKiBSZXNwb25zZSBXcml0ZXIgKi8NCi0gICAgcHJpdmF0ZSBNb2NrUmVzcG9uc2VXcml0ZXIgd3JpdGVyOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIEFic3RyYWN0RXhWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgICAgICBhcHBsaWNhdGlvbiA9IG51bGw7DQotICAgICAgICBjb25maWcgPSBudWxsOw0KLSAgICAgICAgZXh0ZXJuYWxDb250ZXh0ID0gbnVsbDsNCi0gICAgICAgIGZhY2VzQ29udGV4dCA9IG51bGw7DQotICAgICAgICBmYWNlc0NvbnRleHRGYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIGxpZmVjeWNsZSA9IG51bGw7DQotICAgICAgICBsaWZlY3ljbGVGYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIHJlbmRlcktpdCA9IG51bGw7DQotICAgICAgICByZXF1ZXN0ID0gbnVsbDsNCi0gICAgICAgIHJlc3BvbnNlID0gbnVsbDsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0ID0gbnVsbDsNCi0gICAgICAgIHNlc3Npb24gPSBudWxsOw0KLSAgICAgICAgZXhwcmVzc2lvbkZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogIFNldHVwIHRoZSB0ZXN0IGVudmlyb25tZW50LCBpbmNsdWRpbmcgdGhlIGZvbGxvd2luZzoNCi0gICAgICogIDx1bD4NCi0gICAgICogIDxsaT5TZXQgdGhlIEFwcGxpY2F0aW9uIE1hcC48L2xpPg0KLSAgICAgKiAgPGxpPlNldCBhIHJlc3BvbnNlIHdyaXRlcjwvbGk+DQotICAgICAqICA8bGk+QWRkIFRvbWFoYXdrJ3MgcmVuZGVyZXJzIHRvIHRoZSBmYWNlcyBjb250ZXh0LjwvbGk+DQotICAgICAqICA8L3VsPg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHRocmVhZENvbnRleHRDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7DQotICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFswXSwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKSk7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dCA9IG5ldyBNb2NrU2VydmxldENvbnRleHQoKTsNCi0gICAgICAgIC8vZm9yIHRlc3RpbmcgdGhlIGZhbGxiYWNrDQotICAgICAgICAvL3NlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCArICIuREVBQ1RJVkFURV9FTF9SRVNPTFZFUiIsICJ0cnVlIik7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVggKyAiLkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkiLCBNb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihFeHRWYWxJbmZvcm1hdGlvbi5XRUJYTUxfUEFSQU1fUFJFRklYICsgIi5DVVNUT01fTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZIiwgTW9ja01lc3NhZ2VSZXNvbHZlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCArICIuQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZIiwgTW9ja01ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICBjb25maWcgPSBuZXcgTW9ja1NlcnZsZXRDb25maWcoc2VydmxldENvbnRleHQpOw0KLSAgICAgICAgc2Vzc2lvbiA9IG5ldyBNb2NrSHR0cFNlc3Npb24oKTsNCi0gICAgICAgIHNlc3Npb24uc2V0U2VydmxldENvbnRleHQoc2VydmxldENvbnRleHQpOw0KLSAgICAgICAgcmVxdWVzdCA9IG5ldyBNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0KHNlc3Npb24pOw0KLSAgICAgICAgcmVxdWVzdC5zZXRTZXJ2bGV0Q29udGV4dChzZXJ2bGV0Q29udGV4dCk7DQotICAgICAgICByZXNwb25zZSA9IG5ldyBNb2NrSHR0cFNlcnZsZXRSZXNwb25zZSgpOw0KLSAgICAgICAgRmFjdG9yeUZpbmRlci5yZWxlYXNlRmFjdG9yaWVzKCk7DQotICAgICAgICBGYWN0b3J5RmluZGVyLnNldEZhY3RvcnkoImphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeSIsIEV4dFZhbE1vY2tBcHBsaWNhdGlvbkZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIEZhY3RvcnlGaW5kZXIuc2V0RmFjdG9yeSgiamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHRGYWN0b3J5IiwgIm9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tGYWNlc0NvbnRleHRGYWN0b3J5Iik7DQotICAgICAgICBGYWN0b3J5RmluZGVyLnNldEZhY3RvcnkoImphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGVGYWN0b3J5IiwgIm9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tMaWZlY3ljbGVGYWN0b3J5Iik7DQotICAgICAgICBGYWN0b3J5RmluZGVyLnNldEZhY3RvcnkoImphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5IiwgIm9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tSZW5kZXJLaXRGYWN0b3J5Iik7DQotICAgICAgICBleHRlcm5hbENvbnRleHQgPSBuZXcgTW9ja0V4dGVybmFsQ29udGV4dChzZXJ2bGV0Q29udGV4dCwgcmVxdWVzdCwgcmVzcG9uc2UpOw0KLSAgICAgICAgbGlmZWN5Y2xlRmFjdG9yeSA9IChNb2NrTGlmZWN5Y2xlRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoImphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGVGYWN0b3J5Iik7DQotICAgICAgICBsaWZlY3ljbGUgPSAoTW9ja0xpZmVjeWNsZSlsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZSgiREVGQVVMVCIpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0RmFjdG9yeSA9IChNb2NrRmFjZXNDb250ZXh0RmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoImphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0RmFjdG9yeSIpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0ID0gKE1vY2tGYWNlc0NvbnRleHQpZmFjZXNDb250ZXh0RmFjdG9yeS5nZXRGYWNlc0NvbnRleHQoc2VydmxldENvbnRleHQsIHJlcXVlc3QsIHJlc3BvbnNlLCBsaWZlY3ljbGUpOw0KLSAgICAgICAgZXh0ZXJuYWxDb250ZXh0ID0gKE1vY2tFeHRlcm5hbENvbnRleHQpZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpOw0KLSAgICAgICAgVUlWaWV3Um9vdCByb290ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIHJvb3Quc2V0Vmlld0lkKCIvdmlld0lkIik7DQotICAgICAgICByb290LnNldFJlbmRlcktpdElkKCJIVE1MX0JBU0lDIik7DQotICAgICAgICBmYWNlc0NvbnRleHQuc2V0Vmlld1Jvb3Qocm9vdCk7DQotICAgICAgICBBcHBsaWNhdGlvbkZhY3RvcnkgYXBwbGljYXRpb25GYWN0b3J5ID0gKEFwcGxpY2F0aW9uRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoImphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeSIpOw0KLSAgICAgICAgYXBwbGljYXRpb24gPSAoTW9ja0FwcGxpY2F0aW9uKWFwcGxpY2F0aW9uRmFjdG9yeS5nZXRBcHBsaWNhdGlvbigpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0LnNldEFwcGxpY2F0aW9uKGFwcGxpY2F0aW9uKTsNCi0gICAgICAgIFJlbmRlcktpdEZhY3RvcnkgcmVuZGVyS2l0RmFjdG9yeSA9IChSZW5kZXJLaXRGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3RvcnkiKTsNCi0gICAgICAgIC8vV3JhcCByZW5kZXJlcnMgd2l0aCBwcm9wZXIgZXh2YWwgd3JhcHBlcg0KLSAgICAgICAgcmVuZGVyS2l0ID0gbmV3IERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpLmNyZWF0ZShuZXcgTW9ja1JlbmRlcktpdCgpKTsNCi0gICAgICAgIHJlbmRlcktpdEZhY3RvcnkuYWRkUmVuZGVyS2l0KCJIVE1MX0JBU0lDIiwgcmVuZGVyS2l0KTsNCi0NCi0gICAgICAgIC8vIGFkZGl0aW9uYWwgc2V0dXAgbm90IHByb3ZpZGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHNoYWxlIG1vY2sgc3R1ZmYNCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbk1hcCgpLnB1dChNeWZhY2VzQ29uZmlnLmNsYXNzLmdldE5hbWUoKSwgbmV3IE15ZmFjZXNDb25maWcoKSk7DQotICAgICAgICB3cml0ZXIgPSBuZXcgTW9ja1Jlc3BvbnNlV3JpdGVyKG5ldyBTdHJpbmdXcml0ZXIoKSwgbnVsbCwgbnVsbCk7DQotICAgICAgICBmYWNlc0NvbnRleHQuc2V0UmVzcG9uc2VXcml0ZXIod3JpdGVyKTsNCi0NCi0gICAgICAgIFRlc3RVdGlscy5hZGREZWZhdWx0UmVuZGVyZXJzKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBUZXN0VXRpbHMuYWRkRGVmYXVsdFZhbGlkYXRvcnMoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGV4cHJlc3Npb25GYWN0b3J5ID0gKE1vY2tFeHByZXNzaW9uRmFjdG9yeSlhcHBsaWNhdGlvbi5nZXRFeHByZXNzaW9uRmFjdG9yeSgpOw0KLQ0KLSAgICAgICAgZmluYWwgRUxIZWxwZXIgZGVmYXVsdEVsSGVscGVyID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRUxfSEVMUEVSX0ZBQ1RPUlksIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuc2V0Q3VzdG9tRUxIZWxwZXJGYWN0b3J5KG5ldyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeSgpIHsNCi0NCi0gICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBFTEhlbHBlciBjcmVhdGVFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2NrRUxIZWxwZXIoZGVmYXVsdEVsSGVscGVyKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSk7DQotDQotICAgICAgICAvL2V4ZWN1dGUgc3RhcnR1cCBsaXN0ZW5lcg0KLSAgICAgICAgbmV3IEV4dFZhbFN0YXJ0dXBMaXN0ZW5lcigpIHsNCi0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzg2MTgxMDYwNTE2MDI4MTg4NEw7DQotDQotICAgICAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShQcm9qZWN0U3RhZ2VSZXNvbHZlci5jbGFzcy5nZXROYW1lKCksIGdldFByb2plY3RTdGFnZVJlc29sdmVyKCksIGZhbHNlKTsNCi0gICAgICAgICAgICAgICAgc3VwZXIuaW5pdCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0uaW5pdCgpOw0KLQ0KLSAgICAgICAgaW52b2tlU3RhcnR1cExpc3RlbmVycygpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGludm9rZVN0YXJ0dXBMaXN0ZW5lcnMoKTsNCi0NCi0gICAgLyoqDQotICAgICAqIFRlYXIgZG93biB0aGUgdGVzdCBlbnZpcm9ubWVudC4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXNldEZhY3RvcnlGaW5kZXIoKTsNCi0gICAgICAgIHJlc2V0RXh0VmFsQ29udGV4dCgpOw0KLQ0KLSAgICAgICAgYXBwbGljYXRpb24gPSBudWxsOw0KLSAgICAgICAgY29uZmlnID0gbnVsbDsNCi0gICAgICAgIGV4dGVybmFsQ29udGV4dCA9IG51bGw7DQotICAgICAgICBmYWNlc0NvbnRleHQucmVsZWFzZSgpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0ID0gbnVsbDsNCi0gICAgICAgIGxpZmVjeWNsZSA9IG51bGw7DQotICAgICAgICBsaWZlY3ljbGVGYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIHJlbmRlcktpdCA9IG51bGw7DQotICAgICAgICByZXF1ZXN0ID0gbnVsbDsNCi0gICAgICAgIHJlc3BvbnNlID0gbnVsbDsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0ID0gbnVsbDsNCi0gICAgICAgIHNlc3Npb24gPSBudWxsOw0KLSAgICAgICAgRmFjdG9yeUZpbmRlci5yZWxlYXNlRmFjdG9yaWVzKCk7DQotICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcih0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIpOw0KLSAgICAgICAgZXhwcmVzc2lvbkZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgRmllbGQgZmFjdG9yeU1hcCA9IERlZmF1bHRGYWN0b3J5RmluZGVyLmNsYXNzLmdldERlY2xhcmVkRmllbGQoImZhY3RvcnlNYXAiKTsNCi0gICAgICAgICAgICBmYWN0b3J5TWFwLnNldEFjY2Vzc2libGUodHJ1ZSk7DQotICAgICAgICAgICAgZmFjdG9yeU1hcC5zZXQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpLCBuZXcgSGFzaE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4oKSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY2Fubm90IHJlc2V0IHRoZSBmYWN0b3J5IGZpbmRlciIsIHQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlc2V0RXh0VmFsQ29udGV4dCgpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZpZWxkIGNvbnRleHQgPSBFeHRWYWxDb250ZXh0LmNsYXNzLmdldERlY2xhcmVkRmllbGQoImV4dFZhbENvbnRleHQiKTsNCi0gICAgICAgICAgICBjb250ZXh0LnNldEFjY2Vzc2libGUodHJ1ZSk7DQotICAgICAgICAgICAgY29udGV4dC5zZXQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCksIG51bGwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbm5vdCByZXNldCB0aGUgZXh0dmFsLWNvbnRleHQiLCB0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja01lc3NhZ2VDb3VudChpbnQgZXhwZWN0ZWQpDQotICAgIHsNCi0gICAgICAgIGludCBpID0gMDsNCi0gICAgICAgIGZvcihJdGVyYXRvciBtZXNzYWdlcyA9IGZhY2VzQ29udGV4dC5nZXRNZXNzYWdlcygpOyBtZXNzYWdlcy5oYXNOZXh0KCk7KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1lc3NhZ2VzLm5leHQoKTsNCi0gICAgICAgICAgICBpKys7DQotICAgICAgICB9DQotDQotICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbXBsZXRlIG1lc3NhZ2UgY291bnQiLCBleHBlY3RlZCwgaSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tNZXNzYWdlQ291bnQoU3RyaW5nIGNsaWVudElkLCBpbnQgZXhwZWN0ZWQpDQotICAgIHsNCi0gICAgICAgIGludCBpID0gMDsNCi0gICAgICAgIGZvcihJdGVyYXRvciBtZXNzYWdlcyA9IGZhY2VzQ29udGV4dC5nZXRNZXNzYWdlcyhjbGllbnRJZCk7IG1lc3NhZ2VzLmhhc05leHQoKTspDQotICAgICAgICB7DQotICAgICAgICAgICAgbWVzc2FnZXMubmV4dCgpOw0KLSAgICAgICAgICAgIGkrKzsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGFzc2VydEVxdWFscygiQ29tcGxldGUgbWVzc2FnZSBjb3VudCIsIGV4cGVjdGVkLCBpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TZXZlcml0eS4uLiBzZXZlcml0aWVzKQ0KLSAgICB7DQotICAgICAgICBpbnQgaSA9IDA7DQotICAgICAgICBmb3IoSXRlcmF0b3IgbWVzc2FnZXMgPSBmYWNlc0NvbnRleHQuZ2V0TWVzc2FnZXMoKTsgbWVzc2FnZXMuaGFzTmV4dCgpOykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc2V2ZXJpdGllc1tpXSwgKChGYWNlc01lc3NhZ2UpbWVzc2FnZXMubmV4dCgpKS5nZXRTZXZlcml0eSgpKTsNCi0gICAgICAgICAgICBpKys7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoYm9vbGVhbiBpc0Jsb2NrZWQpDQotICAgIHsNCi0gICAgICAgIGFzc2VydEVxdWFscyhpc0Jsb2NrZWQsIHRoaXMuZmFjZXNDb250ZXh0LmdldFJlbmRlclJlc3BvbnNlKCkpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBWZXJpZnkgdGhlIGZvbGxvd2luZzoNCi0gICAgICogPHVsPg0KLSAgICAgKiA8bGk+aWQgaXMgbm90IG51bGw8L2xpPg0KLSAgICAgKiA8bGk+UmVzcG9uc2UgaXMgY29tcGxldGU8L2xpPg0KLSAgICAgKiA8bGk+UmVzcG9uY2UgY29udGFpbnMgdGhlIGlkPC9saT4NCi0gICAgICogPC91bD4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIGlkIElEIHRvIHZlcmlmeQ0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0SWRFeGlzdHMoU3RyaW5nIGlkKQ0KLSAgICB7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJJRCBpcyBub3QgbnVsbCIsIGlkKTsNCi0gICAgICAgIGFzc2VydFRydWUoIlJlc3BvbnNlIENvbXBsZXRlIiwgZmFjZXNDb250ZXh0LmdldFJlc3BvbnNlQ29tcGxldGUoKSk7DQotICAgICAgICBTdHJpbmcgb3V0cHV0ID0gd3JpdGVyLmdldFdyaXRlcigpLnRvU3RyaW5nKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJIYXMgb3V0cHV0Iiwgb3V0cHV0KTsNCi0gICAgICAgIGFzc2VydFRydWUoIkNvbnRhaW5zIGlkICciICsgaWQgKyAiJyIsIG91dHB1dC5pbmRleE9mKGlkKSAhPSAtMSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmFsdWVCaW5kaW5nKFVJSW5wdXQgdWlJbnB1dCwgU3RyaW5nIG5hbWUsIFN0cmluZyBleHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmcgdmFsdWVCaW5kaW5nID0gYXBwbGljYXRpb24uY3JlYXRlVmFsdWVCaW5kaW5nKGV4cHJlc3Npb24pOw0KLSAgICAgICAgVmFsdWVFeHByZXNzaW9uIHZhbHVlRXhwcmVzc2lvbiA9IGV4cHJlc3Npb25GYWN0b3J5LmNyZWF0ZVZhbHVlRXhwcmVzc2lvbigNCi0gICAgICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RUxDb250ZXh0KCksIGV4cHJlc3Npb24sIE9iamVjdC5jbGFzcyk7DQotDQotICAgICAgICBpZih1aUlucHV0ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdWlJbnB1dC5zZXRWYWx1ZUJpbmRpbmcobmFtZSwgdmFsdWVCaW5kaW5nKTsNCi0gICAgICAgICAgICB1aUlucHV0LnNldFZhbHVlRXhwcmVzc2lvbihuYW1lLCB2YWx1ZUV4cHJlc3Npb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKFN0cmluZyBuYW1lLCBPYmplY3QgaW5zdGFuY2UpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhudWxsLCAidmFsdWUiLCAiI3siICsgbmFtZSArICJ9Iik7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dChuYW1lLCBpbnN0YW5jZSk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiIsICJ1bmNoZWNrZWQifSkNCi0gICAgcHJvdGVjdGVkIDxUPiBUIHJlc29sdmVCZWFuKFN0cmluZyBuYW1lLCBDbGFzczxUPiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChUKSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4obmFtZSk7DQotICAgIH0NCi19DQotDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL0V4dFZhbE1vY2tBcHBsaWNhdGlvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL0V4dFZhbE1vY2tBcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjViM2UwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9FeHRWYWxNb2NrQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UubW9jazsKLQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbjsKLQotaW1wb3J0IGphdmF4LmVsLkVMQ29udGV4dExpc3RlbmVyOwotaW1wb3J0IGphdmF4LmVsLkVMUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXguZWwuRXhwcmVzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguZWwuRUxFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRWYWxNb2NrQXBwbGljYXRpb24gZXh0ZW5kcyBNb2NrQXBwbGljYXRpb24KLXsKLSAgICBwcml2YXRlIEFwcGxpY2F0aW9uIHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsTW9ja0FwcGxpY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEV4dFZhbE1vY2tBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IGFwcGxpY2F0aW9uOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFTENvbnRleHRMaXN0ZW5lcltdIGdldEVMQ29udGV4dExpc3RlbmVycygpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEVMQ29udGV4dExpc3RlbmVyWzBdOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFTFJlc29sdmVyIGdldEVMUmVzb2x2ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZC5nZXRFTFJlc29sdmVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEV4cHJlc3Npb25GYWN0b3J5IGdldEV4cHJlc3Npb25GYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRXh0VmFsTW9ja0V4cHJlc3Npb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBldmFsdWF0ZUV4cHJlc3Npb25HZXQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIGV4cHJlc3Npb24sIENsYXNzIGFDbGFzcykgdGhyb3dzIEVMRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5ldmFsdWF0ZUV4cHJlc3Npb25HZXQoZmFjZXNDb250ZXh0LCBleHByZXNzaW9uLCBhQ2xhc3MpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uRmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL0V4dFZhbE1vY2tBcHBsaWNhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiMmMzOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0FwcGxpY2F0aW9uRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICovCi1wdWJsaWMgY2xhc3MgRXh0VmFsTW9ja0FwcGxpY2F0aW9uRmFjdG9yeSBleHRlbmRzIE1vY2tBcHBsaWNhdGlvbkZhY3RvcnkKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxNb2NrQXBwbGljYXRpb24oc3VwZXIuZ2V0QXBwbGljYXRpb24oKSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9FeHRWYWxNb2NrRXhwcmVzc2lvbkZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9FeHRWYWxNb2NrRXhwcmVzc2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg1ODExNi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svRXh0VmFsTW9ja0V4cHJlc3Npb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLm1vY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QuZWwuTW9ja0V4cHJlc3Npb25GYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0OwotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqLwotcHVibGljIGNsYXNzIEV4dFZhbE1vY2tFeHByZXNzaW9uRmFjdG9yeSBleHRlbmRzIE1vY2tFeHByZXNzaW9uRmFjdG9yeQotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWYWx1ZUV4cHJlc3Npb24gY3JlYXRlVmFsdWVFeHByZXNzaW9uKEVMQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgZXhwcmVzc2lvbiwgQ2xhc3MgZXhwZWN0ZWRUeXBlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uKGV4cHJlc3Npb24sIGV4cGVjdGVkVHlwZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9FeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svRXh0VmFsTW9ja1ZhbHVlRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTgyZDg4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9FeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRXh0VmFsRUxSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QuZWwuTW9ja1ZhbHVlRXhwcmVzc2lvbjsKLQotaW1wb3J0IGphdmF4LmVsLkVMQ29udGV4dDsKLWltcG9ydCBqYXZheC5lbC5FTFJlc29sdmVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICovCi0vL1RPRE8gaW1wcm92ZQotcHVibGljIGNsYXNzIEV4dFZhbE1vY2tWYWx1ZUV4cHJlc3Npb24gZXh0ZW5kcyBNb2NrVmFsdWVFeHByZXNzaW9uCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBlbGVtZW50cyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZXhwcmVzc2lvbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTg1ODg3MTY1NDU2MTk0MjEwNDFMOwotCi0gICAgcHVibGljIEV4dFZhbE1vY2tWYWx1ZUV4cHJlc3Npb24oU3RyaW5nIGV4cHJlc3Npb24sIENsYXNzIGV4cGVjdGVkVHlwZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKGV4cHJlc3Npb24sIGV4cGVjdGVkVHlwZSk7Ci0KLSAgICAgICAgaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJFeHByZXNzaW9uIHN0cmluZyBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKLSAgICAgICAgcGFyc2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKEVMQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgRUxSZXNvbHZlciByZXNvbHZlciA9IGNvbnRleHQuZ2V0RUxSZXNvbHZlcigpOwotCi0gICAgICAgIGlmIChyZXNvbHZlciBpbnN0YW5jZW9mIEV4dFZhbEVMUmVzb2x2ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRCYXNlKGNvbnRleHQsIHJlc29sdmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRWYWx1ZShjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShFTENvbnRleHQgY29udGV4dCwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKGNvbnRleHQuZ2V0RUxSZXNvbHZlcigpIGluc3RhbmNlb2YgRXh0VmFsRUxSZXNvbHZlcikKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC5nZXRFTFJlc29sdmVyKCkuc2V0VmFsdWUoY29udGV4dCwgZ2V0VmFsdWUoY29udGV4dCksIGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBiYXNlID0gZ2V0QmFzZShjb250ZXh0LCBjb250ZXh0LmdldEVMUmVzb2x2ZXIoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgc2V0dGVyID0gInNldCIgKyBjcmVhdGVQcm9wZXJ0eVN0cmluZygpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNZXRob2Qgc2V0dGVyTWV0aG9kID0gYmFzZS5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKHNldHRlciwgdmFsdWUgIT0gbnVsbCA/IHZhbHVlLmdldENsYXNzKCkgOiBPYmplY3QuY2xhc3MpOwotICAgICAgICAgICAgICAgIHNldHRlck1ldGhvZC5pbnZva2UoYmFzZSwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKEVMQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgYmFzZSA9IGdldEJhc2UoY29udGV4dCwgY29udGV4dC5nZXRFTFJlc29sdmVyKCkpOwotCi0gICAgICAgIGlmIChiYXNlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGdldHRlciA9ICJnZXQiICsgY3JlYXRlUHJvcGVydHlTdHJpbmcoKTsKLQotICAgICAgICAgICAgTWV0aG9kIGdldHRlck1ldGhvZDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldHRlck1ldGhvZCA9IGJhc2UuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZChnZXR0ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiBnZXR0ZXJNZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldHRlciA9ICJpcyIgKyBjcmVhdGVQcm9wZXJ0eVN0cmluZygpOwotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBnZXR0ZXJNZXRob2QgPSBiYXNlLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2QoZ2V0dGVyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldHRlck1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZTEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlKCkKLSAgICB7Ci0KLSAgICAgICAgaWYgKGlzTGl0ZXJhbFRleHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZWxlbWVudHMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4cHJlc3Npb24uc3RhcnRzV2l0aCgiJHsiKSB8fCBleHByZXNzaW9uLnN0YXJ0c1dpdGgoIiN7IikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChleHByZXNzaW9uLmVuZHNXaXRoKCJ9IikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgZXhwciA9IG5ldyBTdHJpbmdCdWZmZXIoZXhwcmVzc2lvbi5zdWJzdHJpbmcoMiwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpLnJlcGxhY2VBbGwoIiAiLCAiIikpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNCbG9ja09uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGV4cHIubGVuZ3RoKCkgLSAxOyBpID4gLTE7IGktLSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChleHByLmNoYXJBdChpKSA9PSAnICcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZGVsZXRlQ2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4cHIuY2hhckF0KGkpID09ICddJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhwci5kZWxldGVDaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhwci5jaGFyQXQoaSkgPT0gJ1snKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHByLmRlbGV0ZUNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHByLmNoYXJBdChpKSA9PSAnXCcnKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQmxvY2tPbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLmRlbGV0ZUNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcy5hZGQoMCwgZXhwci5zdWJzdHJpbmcoaSArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLmRlbGV0ZShpLCBleHByLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlzQmxvY2tPbiA9ICFpc0Jsb2NrT247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhwci5jaGFyQXQoaSkgPT0gJy4nICYmICFpc0Jsb2NrT24pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZCgwLCBleHByLnN1YnN0cmluZyhpICsgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXhwci5kZWxldGUoaSwgZXhwci5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGV4cHIubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXMuYWRkKDAsIGV4cHIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZWxlbWVudHMgPSAoU3RyaW5nW10pIG5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tuYW1lcy5zaXplKCldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV4cHJlc3Npb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihleHByZXNzaW9uKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRCYXNlKEVMQ29udGV4dCBjb250ZXh0LCBFTFJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgT2JqZWN0IGJhc2UgPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aCAtIDE7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgYmFzZSA9IHJlc29sdmVyLmdldFZhbHVlKGNvbnRleHQsIGJhc2UsIGVsZW1lbnRzW2ldKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmFzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVQcm9wZXJ0eVN0cmluZygpCi0gICAgewotICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBlbGVtZW50c1tlbGVtZW50cy5sZW5ndGggLSAxXTsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEsIHByb3BlcnR5Lmxlbmd0aCgpKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL01vY2tFTEhlbHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL01vY2tFTEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWIyMWUxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrRUxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UubW9jazsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi0NCi1wdWJsaWMgY2xhc3MgTW9ja0VMSGVscGVyIGltcGxlbWVudHMgRUxIZWxwZXINCi17DQotICAgIHByaXZhdGUgRUxIZWxwZXIgd3JhcHBlZDsNCi0NCi0gICAgcHVibGljIE1vY2tFTEhlbHBlcihFTEhlbHBlciB3cmFwcGVkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmVhbihTdHJpbmcgYmVhbk5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldEJlYW4oYmVhbk5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBpZigiI3t0cnVlfSIuZXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFR5cGVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvcGVydHlEZXRhaWxzIGdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaXNFTFRlcm1WYWxpZChmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtV2VsbEZvcm1lZChPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaXNFTFRlcm1XZWxsRm9ybWVkKG8pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmluZGluZ09mQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0QmluZGluZ09mQ29tcG9uZW50KHVpQ29tcG9uZW50LCBuYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svTW9ja01lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDUzODliLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTW9ja01lc3NhZ2VSZXNvbHZlckZhY3RvcnkgZXh0ZW5kcyBEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeQ0KLXsNCi0gICAgcHVibGljIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXRSZWdpc3RlcmVkTmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TmFtZU1hcHBlckxpc3QoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svTW9ja01ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svTW9ja01ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMGQ1ZDguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL01vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIE1vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSBleHRlbmRzIERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeQ0KLXsNCi0gICAgcHVibGljIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXRSZWdpc3RlcmVkTmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TmFtZU1hcHBlckxpc3QoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTY0MmJhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIE1vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5IGV4dGVuZHMgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGNyZWF0ZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIC8vZm9yY2UgaW5pdCBzbyB0aGF0IGV2ZXJ5IHRlc3QtY2FzZSBzZXR1cCBtZXRob2QgY2FuIGFkZCBhIG1vY2sgdmFsaWRhdGlvbiBzdHJhdGVneSB2aWEgZXh0dmFsIGphdmEtYXBpDQotICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodGhpcyxSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoZ2V0Q2xhc3MoKSwgImluaXRTdGF0aWNNYXBwaW5ncyIpKTsNCi0gICAgICAgIHJldHVybiBzdXBlci5jcmVhdGUobWV0YURhdGFLZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gZ2V0UmVnaXN0ZXJlZE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldE5hbWVNYXBwZXJMaXN0KCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS91dGlsL01ldGhvZFV0aWxzLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvTWV0aG9kVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThmMmUyNC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvTWV0aG9kVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UudXRpbDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotLy9UT0RPDQotcHVibGljIGNsYXNzIE1ldGhvZFV0aWxzDQotew0KLSAgICBwcml2YXRlIE1ldGhvZFV0aWxzKCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja01ldGhvZENhbGxlZChDbGFzcyB1c2VkQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBpbnQgY2FsbENvdW50KQ0KLSAgICB7DQotICAgICAgICBjaGVja1JlcXVpcmVkQ2xhc3ModXNlZENsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiBjYWxsQ291bnQgPT0gZ2V0TWV0aG9kQ2FsbENvdW50KHVzZWRDbGFzcywgbWV0aG9kTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWV0aG9kQ2FsbGVkKENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpDQotICAgIHsNCi0gICAgICAgIGNoZWNrUmVxdWlyZWRDbGFzcyh1c2VkQ2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkNCi0gICAgICAgICAgICAgICAgLmNvbnRhaW5zS2V5KHVzZWRDbGFzcy5nZXROYW1lKCkgKyAiIyIgKyBtZXRob2ROYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2lnbmFsTWV0aG9kQ2FsbGVkKENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIGludCBtZXRob2RDYWxsQ291bnQgPSAwOw0KLSAgICAgICAgU3RyaW5nIGtleSA9IHVzZWRDbGFzcy5nZXROYW1lKCkgKyAiIyIgKyBtZXRob2ROYW1lOw0KLQ0KLSAgICAgICAgaWYocmVxdWVzdE1hcC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGhvZENhbGxDb3VudCA9IChJbnRlZ2VyKXJlcXVlc3RNYXAuZ2V0KGtleSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXF1ZXN0TWFwLnB1dChrZXksICsrbWV0aG9kQ2FsbENvdW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TWV0aG9kQ2FsbENvdW50KENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIFN0cmluZyBrZXkgPSB1c2VkQ2xhc3MuZ2V0TmFtZSgpICsgIiMiICsgbWV0aG9kTmFtZTsNCi0NCi0gICAgICAgIGlmKHJlcXVlc3RNYXAuY29udGFpbnNLZXkoa2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKEludGVnZXIpcmVxdWVzdE1hcC5nZXQoa2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaWduYWxDbGFzc1VzZWQoQ2xhc3MgbW9ja0NsYXNzKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgICAgIC5wdXQobW9ja0NsYXNzLmdldE5hbWUoKSArICI6dXNlZCIsIHRydWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NsYXNzVXNlZChDbGFzcyBtb2NrQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgICAgIC5jb250YWluc0tleShtb2NrQ2xhc3MuZ2V0TmFtZSgpICsgIjp1c2VkIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1JlcXVpcmVkQ2xhc3MoQ2xhc3MgdXNlZENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzQ2xhc3NVc2VkKHVzZWRDbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbih1c2VkQ2xhc3MuZ2V0TmFtZSgpICsgIiBub3QgdXNlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvdXRpbC9UZXN0VXRpbHMuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvdXRpbC9UZXN0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0ZjE0OS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvVGVzdFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS51dGlsOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWNlc0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotcHVibGljIGZpbmFsIGNsYXNzIFRlc3RVdGlscw0KLXsNCi0gICAgLyoqIERlZmF1bHQgTG9nZ2VyICovDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUZXN0VXRpbHMuY2xhc3MpOw0KLQ0KLSAgICAvKiogdXRpbGl0eSBjbGFzcywgZG8gbm90IGluc3RhbnRpYXRlICovDQotICAgIHByaXZhdGUgVGVzdFV0aWxzKCkNCi0gICAgew0KLSAgICAgICAgLy8gdXRpbGl0eSBjbGFzcywgZGlzYWJsZSBpbnN0YW50aWF0aW9uDQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZERlZmF1bHRWYWxpZGF0b3JzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpDQotICAgIHsNCi0gICAgICAgIGFkZFZhbGlkYXRvcihmYWNlc0NvbnRleHQsImphdmF4LmZhY2VzLkRvdWJsZVJhbmdlIiwgImphdmF4LmZhY2VzLnZhbGlkYXRvci5Eb3VibGVSYW5nZVZhbGlkYXRvciIpOw0KLSAgICAgICAgYWRkVmFsaWRhdG9yKGZhY2VzQ29udGV4dCwiamF2YXguZmFjZXMuTGVuZ3RoIiwgImphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3IiKTsNCi0gICAgICAgIGFkZFZhbGlkYXRvcihmYWNlc0NvbnRleHQsImphdmF4LmZhY2VzLkxvbmdSYW5nZSIsICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTG9uZ1JhbmdlVmFsaWRhdG9yIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFZhbGlkYXRvcihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0b3JJZCwgU3RyaW5nIHZhbGlkYXRvckNsYXNzKQ0KLSAgICB7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5hZGRWYWxpZGF0b3IodmFsaWRhdG9ySWQsIHZhbGlkYXRvckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQWRkIGFsbCBvZiBKU0YgMS4yIGRlZmF1bHQgcmVuZGVyZXJzLiAgQ3VycmVudGx5IHRoaXMgaXMgbm90IHRpZWQgdG8NCi0gICAgICogZmFjZXMtY29uZmlnLnhtbCwgc28gYWxsIGNoYW5nZSB0byB0aGUgZmlsZSBNVVNUIGFsc28gYmUgbWFkZSBoZXJlLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0DQotICAgICAqIEB0b2RvIERvIG5vdCBhZGQgcmVuZGVyZXIgaWYgcmVuZGVyZXIgaXMgYWxyZWFkeSBhZGRlZC4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGREZWZhdWx0UmVuZGVyZXJzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpDQotICAgIHsNCi0gICAgICAgIC8vIFN0YW5kYXJkIEhUTUwgUmVuZGVyZXJzDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5Db21tYW5kIiwgImphdmF4LmZhY2VzLkJ1dHRvbiIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEJ1dHRvblJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RCb29sZWFuIiwNCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkNoZWNrYm94IiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sQ2hlY2tib3hSZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0TWFueSIsDQotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5DaGVja2JveCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbENoZWNrYm94UmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkZvcm0iLCAiamF2YXguZmFjZXMuRm9ybSIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEZvcm1SZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuUGFuZWwiLCAiamF2YXguZmFjZXMuR3JpZCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEdyaWRSZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuUGFuZWwiLCAiamF2YXguZmFjZXMuR3JvdXAiLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxHcm91cFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5IaWRkZW4iLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxIaWRkZW5SZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuR3JhcGhpYyIsICJqYXZheC5mYWNlcy5JbWFnZSIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEltYWdlUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5MYWJlbCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbExhYmVsUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5MaW5rIiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlua1JlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5Db21tYW5kIiwgImphdmF4LmZhY2VzLkxpbmsiLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMaW5rUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsDQotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5MaXN0Ym94IiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlzdGJveFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RNYW55IiwNCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkxpc3Rib3giLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMaXN0Ym94UmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsICJqYXZheC5mYWNlcy5NZW51IiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTWVudVJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RNYW55IiwgImphdmF4LmZhY2VzLk1lbnUiLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxNZW51UmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk1lc3NhZ2UiLCAiamF2YXguZmFjZXMuTWVzc2FnZSIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lc3NhZ2VSZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuT3V0cHV0IiwgImphdmF4LmZhY2VzLkZvcm1hdCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEZvcm1hdFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5NZXNzYWdlcyIsDQotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5NZXNzYWdlcyIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lc3NhZ2VzUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsICJqYXZheC5mYWNlcy5SYWRpbyIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFJhZGlvUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLklucHV0IiwgImphdmF4LmZhY2VzLlNlY3JldCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFNlY3JldFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5EYXRhIiwgImphdmF4LmZhY2VzLlRhYmxlIiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGFibGVSZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuSW5wdXQiLCAiamF2YXguZmFjZXMuVGV4dGFyZWEiLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxUZXh0YXJlYVJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5UZXh0IiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGV4dFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5PdXRwdXQiLCAiamF2YXguZmFjZXMuVGV4dCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFRleHRSZW5kZXJlciIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBZGQgYSByZW5kZXJlciB0byB0aGUgRmFjZXNDb250ZXh0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IEZhY2VzIENvbnRleHQNCi0gICAgICogQHBhcmFtIGZhbWlseSBDb21wb25lbmV0IEZhbWlseQ0KLSAgICAgKiBAcGFyYW0gcmVuZGVyZXJUeXBlIENvbXBvbmVudCBUeXBlDQotICAgICAqIEBwYXJhbSByZW5kZXJDbGFzc05hbWUgQ2xhc3MgTmFtZSBvZiBSZW5kZXJlcg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFJlbmRlcmVyKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBmYW1pbHksDQotICAgICAgICAgICAgU3RyaW5nIHJlbmRlcmVyVHlwZSwgU3RyaW5nIHJlbmRlckNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSAoUmVuZGVyZXIpIG5ld0luc3RhbmNlKHJlbmRlckNsYXNzTmFtZSk7DQotICAgICAgICBSZW5kZXJLaXQga2l0ID0gZmFjZXNDb250ZXh0LmdldFJlbmRlcktpdCgpOw0KLSAgICAgICAga2l0LmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCByZW5kZXJlcik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRyaWVzIGEgQ2xhc3MubG9hZENsYXNzIHdpdGggdGhlIGNvbnRleHQgY2xhc3MgbG9hZGVyIG9mIHRoZSBjdXJyZW50IHRocmVhZCBmaXJzdCBhbmQNCi0gICAgICogYXV0b21hdGljYWxseSBmYWxscyBiYWNrIHRvIHRoZSBDbGFzc1V0aWxzIGNsYXNzIGxvYWRlciAoaS5lLiB0aGUgbG9hZGVyIG9mIHRoZQ0KLSAgICAgKiBteWZhY2VzLmphciBsaWIpIGlmIG5lY2Vzc2FyeS4NCi0gICAgICoNCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMNCi0gICAgICoNCi0gICAgICogQHBhcmFtIHR5cGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBub24tcHJpbWl0aXZlIG5vbi1hcnJheSBjbGFzcw0KLSAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIENsYXNzDQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdHlwZSBpcyBudWxsDQotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgY2xhc3NGb3JOYW1lKFN0cmluZyB0eXBlKQ0KLSAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpDQotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0eXBlIik7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvLyBUcnkgV2ViQXBwIENsYXNzTG9hZGVyIGZpcnN0DQotICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUodHlwZSwgZmFsc2UsIC8vIGRvIG5vdCBpbml0aWFsaXplIGZvciBmYXN0ZXIgc3RhcnR1cA0KLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gZmFsbGJhY2s6IFRyeSBDbGFzc0xvYWRlciBmb3IgQ2xhc3NVdGlscyAoaS5lLiB0aGUgbXlmYWNlcy5qYXIgbGliKQ0KLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKHR5cGUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXANCi0gICAgICAgICAgICAgICAgICAgIFRlc3RVdGlscy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2FtZSBhcyB7QGxpbmsgI2NsYXNzRm9yTmFtZShTdHJpbmcpfSwgYnV0IHRocm93cyBhIFJ1bnRpbWVFeGNlcHRpb24NCi0gICAgICogKEZhY2VzRXhjZXB0aW9uKSBpbnN0ZWFkIG9mIGEgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi4NCi0gICAgICoNCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMNCi0gICAgICoNCi0gICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBDbGFzcw0KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHR5cGUgaXMgbnVsbA0KLSAgICAgKiBAdGhyb3dzIGphdmF4LmZhY2VzLkZhY2VzRXhjZXB0aW9uIGlmIGNsYXNzIG5vdCBmb3VuZA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3Mgc2ltcGxlQ2xhc3NGb3JOYW1lKFN0cmluZyB0eXBlKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY2xhc3NGb3JOYW1lKHR5cGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2cuZXJyb3IoIkNsYXNzICIgKyB0eXBlICsgIiBub3QgZm91bmQiLCBlKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3Mgd2l0aCB0aGUgdHlwZSBvZiA8Y29kZT50eXBlPC9jb2RlPi4NCi0gICAgICoNCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMNCi0gICAgICoNCi0gICAgICogQHBhcmFtIHR5cGUgVHlwZSBvZiBuZXcgY2xhc3MuDQotICAgICAqIEByZXR1cm4gSW5zdGFuY2Ugb2YgdGhlIGNsYXNzIDxjb2RlPnR5cGU8L2NvZGU+DQotICAgICAqIEB0aHJvd3MgamF2YXguZmFjZXMuRmFjZXNFeGNlcHRpb24NCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgdHlwZSkgdGhyb3dzIEZhY2VzRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpDQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2Uoc2ltcGxlQ2xhc3NGb3JOYW1lKHR5cGUpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyA8Y29kZT5jbGF6ejwvY29kZT4uDQotICAgICAqDQotICAgICAqIE5vdGU6IFRoaXMgd2FzIGNvcGllZCBmcm9tIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWQudXRpbC5DbGFzc1V0aWxzDQotICAgICAqDQotICAgICAqIEBwYXJhbSBjbGF6eiBDbGFzcyB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YuDQotICAgICAqIEByZXR1cm4gSW5zdGFuY2Ugb2YgdGhlIGNsYXNzIDxjb2RlPmNsYXp6PC9jb2RlPg0KLSAgICAgKiBAdGhyb3dzIGphdmF4LmZhY2VzLkZhY2VzRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoQ2xhc3MgY2xhenopIHRocm93cyBGYWNlc0V4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY2xhenoubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ2xhc3MgOiAiICsgY2xhenouZ2V0TmFtZSgpICsgIiBub3QgZm91bmQuIiwgZSk7DQotICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBGYWNlc0V4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJlbmRlcmVyZWQgYSBjb21wb25lbnQsIGluY2x1ZGluZyBpdCdzIGNoaWxkcmVuLCB0aGVuIGNvbXBsZXRlIHRoZSByZXBvbnNlLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gY29udGV4dCBGYWNlcyBDb250ZXh0DQotICAgICAqIEBwYXJhbSBjb21wb25lbnQgQ29tcG9uZW50IHRvIGJlIHJlbmRlcmVkLg0KLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gVGhyb3duIHdoaWxlIHJlbmRlcmluZy4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW5kZXJDb21wb25lbnQoRmFjZXNDb250ZXh0IGNvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSBjb250ZXh0LmdldFJlbmRlcktpdCgpLmdldFJlbmRlcmVyKA0KLSAgICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0RmFtaWx5KCksIGNvbXBvbmVudC5nZXRSZW5kZXJlclR5cGUoKSk7DQotICAgICAgICByZW5kZXJlci5lbmNvZGVCZWdpbihjb250ZXh0LCBjb21wb25lbnQpOw0KLSAgICAgICAgcmVuZGVyZXIuZW5jb2RlQ2hpbGRyZW4oY29udGV4dCwgY29tcG9uZW50KTsNCi0gICAgICAgIHJlbmRlcmVyLmVuY29kZUVuZChjb250ZXh0LCBjb21wb25lbnQpOw0KLSAgICAgICAgY29udGV4dC5yZXNwb25zZUNvbXBsZXRlKCk7DQotICAgICAgICBjb250ZXh0LnJlbmRlclJlc3BvbnNlKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3BvbS54bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE2MTgyYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbi10ZXN0czwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBCZWFuLVZhbGlkYXRpb24tSW50ZWdyYXRpb24tVGVzdHM8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPnRlc3QtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8cmVwb3NpdG9yaWVzPg0KLSAgICAgICAgPHJlcG9zaXRvcnk+DQotICAgICAgICAgICAgPGlkPmpib3NzPC9pZD4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvc2l0b3J5Lmpib3NzLmNvbS9tYXZlbjI8L3VybD4NCi0gICAgICAgICAgICA8cmVsZWFzZXM+DQotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+DQotICAgICAgICAgICAgPC9yZWxlYXNlcz4NCi0gICAgICAgICAgICA8c25hcHNob3RzPg0KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4NCi0gICAgICAgICAgICA8L3NuYXBzaG90cz4NCi0gICAgICAgIDwvcmVwb3NpdG9yeT4NCi0gICAgICAgIDxyZXBvc2l0b3J5Pg0KLSAgICAgICAgICAgIDxpZD5qYm9zcy1zbmFwc2hvdDwvaWQ+DQotICAgICAgICAgICAgPHVybD5odHRwOi8vc25hcHNob3RzLmpib3NzLm9yZy9tYXZlbjI8L3VybD4NCi0gICAgICAgICAgICA8cmVsZWFzZXM+DQotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+DQotICAgICAgICAgICAgPC9yZWxlYXNlcz4NCi0gICAgICAgICAgICA8c25hcHNob3RzPg0KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPg0KLSAgICAgICAgICAgIDwvc25hcHNob3RzPg0KLSAgICAgICAgPC9yZXBvc2l0b3J5Pg0KLSAgICA8L3JlcG9zaXRvcmllcz4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnZhbGlkYXRpb248L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjAuR0E8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlLXRlc3RzPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5oaWJlcm5hdGU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGliZXJuYXRlLXZhbGlkYXRvcjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj40LjAuMC5HQTwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS40LjI8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjQuMjwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0Fic3RyYWN0QmVhblZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThjNGI3ZS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0Fic3RyYWN0QmVhblZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5BYnN0cmFjdEV4VmFsVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0YXJ0dXAuQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi0NCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RCZWFuVmFsaWRhdGlvblRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgQWJzdHJhY3RCZWFuVmFsaWRhdGlvblRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbnZva2VTdGFydHVwTGlzdGVuZXJzKCkNCi0gICAgew0KLSAgICAgICAgbmV3IEJlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyKCkgew0KLQ0KLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zMTI0MTgyMzU1NDQ0NzU0NDk3TDsNCi0NCi0gICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHN1cGVyLmluaXQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9LmluaXQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgbmV3IE1vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIoKS5hZnRlclBoYXNlKG5ldyBQaGFzZUV2ZW50KGZhY2VzQ29udGV4dCwgUGhhc2VJZC5VUERBVEVfTU9ERUxfVkFMVUVTLCBsaWZlY3ljbGUpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0Jhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzY4YWQxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWw7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJSW5wdXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTxUPiBleHRlbmRzIEFic3RyYWN0QmVhblZhbGlkYXRpb25UZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDMgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgICAgICBiZWFuID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICBwcm90ZWN0ZWQgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICBwcm90ZWN0ZWQgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDMgPSBudWxsOw0KLQ0KLSAgICBwcml2YXRlIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHByb3RlY3RlZCBUIGJlYW47DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgYmVhbiA9IGdldEJlYW5Ub1Rlc3QoKTsNCi0gICAgICAgIGJpbmRCZWFuVG9FeHByZXNzaW9uKCk7DQotDQotICAgICAgICBjcmVhdGVDb21wb25lbnRzKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbXBvbmVudHMoKQ0KLSAgICB7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsNCi0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsNCi0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MyA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Myk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0SWQoImlucHV0MSIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50My5zZXRJZCgiaW5wdXQzIik7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQ0KLSAgICBwcml2YXRlIHZvaWQgYmluZEJlYW5Ub0V4cHJlc3Npb24oKQ0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmcgdmIgPSBhcHBsaWNhdGlvbi5jcmVhdGVWYWx1ZUJpbmRpbmcoIiN7dGVzdEJlYW59Iik7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dCgidGVzdEJlYW4iLCBiZWFuKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVCBnZXRCZWFuVG9UZXN0KCk7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQzID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgYmVhbiA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KFVJSW5wdXQgdWlDb21wb25lbnQsIFN0cmluZyB2YWx1ZUJpbmRpbmcpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyh1aUNvbXBvbmVudCwgInZhbHVlIiwgdmFsdWVCaW5kaW5nKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZVRvVmFsaWRhdGUoVUlJbnB1dCB1aUNvbXBvbmVudCwgU3RyaW5nIHZhbHVlVG9WYWxpZGF0ZSkNCi0gICAgew0KLSAgICAgICAgdWlDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVUb1ZhbGlkYXRlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbXBvbmVudHMoKQ0KLSAgICB7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEucHJvY2Vzc1ZhbGlkYXRvcnMoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5wcm9jZXNzVmFsaWRhdG9ycyhmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQzLnByb2Nlc3NWYWxpZGF0b3JzKGZhY2VzQ29udGV4dCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29tcG9uZW50cygpDQotICAgIHsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5wcm9jZXNzVXBkYXRlcyhmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnByb2Nlc3NVcGRhdGVzKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDMucHJvY2Vzc1VwZGF0ZXMoZmFjZXNDb250ZXh0KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRDb21wb25lbnRWYWxpZChVSUlucHV0IHVpSW5wdXQpDQotICAgIHsNCi0gICAgICAgIGFzc2VydFRydWUoaXNDb21wb25lbnRWYWxpZCh1aUlucHV0KSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Q29tcG9uZW50SW52YWxpZChVSUlucHV0IHVpSW5wdXQpDQotICAgIHsNCi0gICAgICAgIGFzc2VydEZhbHNlKGlzQ29tcG9uZW50VmFsaWQodWlJbnB1dCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbXBvbmVudFZhbGlkKFVJSW5wdXQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudC5pc1ZhbGlkKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9DdXN0b21TZXZlcml0eTFUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9DdXN0b21TZXZlcml0eTFUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWRlYWUwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXcuQ3VzdG9tU2V2ZXJpdHlUZXN0Q2FzZTFQYWdlQmVhbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5jdXN0b20uQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21TZXZlcml0eTFUZXN0Q2FzZSBleHRlbmRzIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8Q3VzdG9tU2V2ZXJpdHlUZXN0Q2FzZTFQYWdlQmVhbj4NCi17DQotICAgIHB1YmxpYyBDdXN0b21TZXZlcml0eTFUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBDdXN0b21TZXZlcml0eVRlc3RDYXNlMVBhZ2VCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEN1c3RvbVNldmVyaXR5VGVzdENhc2UxUGFnZUJlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tUGF5bG9hZFZpYUdsb2JhbFByb3BlcnR5KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MuZ2V0TmFtZSgpLCBDdXN0b21WaW9sYXRpb25TZXZlcml0eS5XYXJuaW5nLmNsYXNzKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfV0FSTik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbVBheWxvYWRWaWFTdGF0aWNDb25maWcoKQ0KLSAgICB7DQotICAgICAgICBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcy5nZXROYW1lKCksIEN1c3RvbVZpb2xhdGlvblNldmVyaXR5Lldhcm5pbmcuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5WQUxJREFUSU9OX1BBUkFNRVRFUl9DT05GSUcsIGNvbmZpZyk7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmtub3duUGF5bG9hZCgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0RlZmF1bHRHcm91cFRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0RlZmF1bHRHcm91cFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZjNjNjEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9EZWZhdWx0R3JvdXBUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5UZXN0Q2FzZTFCZWFuOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0R3JvdXBUZXN0Q2FzZSBleHRlbmRzIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8VGVzdENhc2UxQmVhbj4NCi17DQotICAgIHB1YmxpYyBEZWZhdWx0R3JvdXBUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRGVmYXVsdEdyb3VwVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBUZXN0Q2FzZTFCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RDYXNlMUJlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90TnVsbFNldmVyaXR5RXJyb3IoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE5vdE51bGxTZXZlcml0eVdhcm4oKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXZlcml0eU9yZGVyKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTN9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICJhYiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4pOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTGFiZWxSZXBsYWNlbWVudFRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0xhYmVsUmVwbGFjZW1lbnRUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmM1ZTNiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTGFiZWxSZXBsYWNlbWVudFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLlRlc3RDYXNlMUJlYW47DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotcHVibGljIGNsYXNzIExhYmVsUmVwbGFjZW1lbnRUZXN0Q2FzZSBleHRlbmRzIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8VGVzdENhc2UxQmVhbj4NCi17DQotICAgIHB1YmxpYyBMYWJlbFJlcGxhY2VtZW50VGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKExhYmVsUmVwbGFjZW1lbnRUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFRlc3RDYXNlMUJlYW4gZ2V0QmVhblRvVGVzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdENhc2UxQmVhbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RMYWJlbFJlcGxhY2VtZW50KCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCA9ICJwcm9wZXJ0eTEiOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICB0aGlzLmlucHV0Q29tcG9uZW50MS5zZXRMYWJlbChsYWJlbFRleHQpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9ICgoRmFjZXNNZXNzYWdlKWZhY2VzQ29udGV4dC5nZXRNZXNzYWdlcygpLm5leHQoKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkuc3RhcnRzV2l0aChsYWJlbFRleHQpKTsNCi0gICAgICAgIGFzc2VydFRydWUoZmFjZXNNZXNzYWdlLmdldERldGFpbCgpLnN0YXJ0c1dpdGgobGFiZWxUZXh0KSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24xVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uMVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MmQxNTMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24xVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXcuTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuU2ltdWxhdGVkVXNlckluZm9ybWF0aW9uOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb24xVGVzdENhc2UgZXh0ZW5kcw0KLSAgICAgICAgQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTxNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbj4NCi17DQotICAgIHB1YmxpYyBNb2RlbFZhbGlkYXRpb24xVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKE1vZGVsVmFsaWRhdGlvbjFUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmFsaWRhdGlvbigpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwxLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIjEyMyIpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDEucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiMTIzIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHVwZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFZpb2xhdGlvbldpdGhHbG9iYWxWaW9sYXRpb25NZXNzYWdlVmlhUHJvcGVydHkoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMS5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIxMjMiKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwxLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIjQ1NiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICB1cGRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFZpb2xhdGlvbldpdGhJbmxpbmVWaW9sYXRpb25NZXNzYWdlVmlhUHJvcGVydHkoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIxMjMiKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwyLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIjQ1NiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICB1cGRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICAvL2R1ZSB0byBkaXNwbGF5TWVzc2FnZUlubGluZQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxWaW9sYXRpb25XaXRoR2xvYmFsVmlvbGF0aW9uTWVzc2FnZVZpYUZpZWxkKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDMucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiMTIzIik7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMy5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICI0NTYiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgdXBkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxWaW9sYXRpb25XaXRoSW5saW5lVmlvbGF0aW9uTWVzc2FnZVZpYUZpZWxkKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiMTIzIik7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsNC5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICI0NTYiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgdXBkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgLy9kdWUgdG8gZGlzcGxheU1lc3NhZ2VJbmxpbmUNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDIpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmlvbGF0aW9uV2l0aEFkbWluUm9sZSgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJjdXJyZW50VXNlciIsIG5ldyBTaW11bGF0ZWRVc2VySW5mb3JtYXRpb24oImFkbWluIikpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDUucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiMTIzIik7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsNS5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICI0NTYiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgdXBkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmlvbGF0aW9uV2l0aFVzZXJSb2xlKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlUmVxdWVzdFNjb3BlZEJlYW4oImN1cnJlbnRVc2VyIiwgbmV3IFNpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbigidXNlciIpKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWw1LnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIjEyMyIpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDUucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiNDU2Iik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHVwZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24yVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uMlRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNDEyNWUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24yVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldy5Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbjsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi1wdWJsaWMgY2xhc3MgTW9kZWxWYWxpZGF0aW9uMlRlc3RDYXNlIGV4dGVuZHMNCi0gICAgICAgIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8TW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4+DQotew0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uMlRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShNb2RlbFZhbGlkYXRpb24yVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbiBnZXRCZWFuVG9UZXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFZhbGlkYXRpb24oKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIjEyMyIpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbC5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICIxMjMiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgdXBkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmlvbGF0aW9uV2l0aEdsb2JhbFZpb2xhdGlvbk1lc3NhZ2VDbGFzc0xldmVsKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbC5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIxMjMiKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiNDU2Iik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHVwZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24zVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uM1Rlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YTM2ZTcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24zVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldy5Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTNQYWdlQmVhbjsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvbjNUZXN0Q2FzZSBleHRlbmRzDQotICAgICAgICBCYXNlQmVhblZhbFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlPE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlM1BhZ2VCZWFuPg0KLXsNCi0gICAgcHVibGljIE1vZGVsVmFsaWRhdGlvbjNUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTW9kZWxWYWxpZGF0aW9uM1Rlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UzUGFnZUJlYW4gZ2V0QmVhblRvVGVzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UzUGFnZUJlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxWYWxpZGF0aW9uTm9WaWV3SWRNYXRjaCgpDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlKCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxWYWxpZGF0aW9uVmlld0lkTWF0Y2goKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5zZXRWaWV3SWQoIi9wYWdlcy9tb2RlbFZhbGlkYXRpb25Bd2FyZVBhZ2UueGh0bWwiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlKCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiMTIzIik7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIjQ1NiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICB1cGRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb240VGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uNFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZDMzNzguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb240VGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldy5Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTRQYWdlQmVhbjsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvbjRUZXN0Q2FzZSBleHRlbmRzDQotICAgICAgICBCYXNlQmVhblZhbFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlPE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlNFBhZ2VCZWFuPg0KLXsNCi0gICAgcHVibGljIE1vZGVsVmFsaWRhdGlvbjRUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTW9kZWxWYWxpZGF0aW9uNFRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2U0UGFnZUJlYW4gZ2V0QmVhblRvVGVzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2U0UGFnZUJlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxWYWxpZGF0aW9uTm9WaWV3SWRNYXRjaCgpDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlKCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxWYWxpZGF0aW9uVmlld0lkTWF0Y2goKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5zZXRWaWV3SWQoIi9wYWdlcy9tb2RlbFZhbGlkYXRpb25Bd2FyZVBhZ2UueGh0bWwiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlKCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiMTIzIik7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIjQ1NiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICB1cGRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9SZXN0cmljdEdyb3Vwc1Rlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL1Jlc3RyaWN0R3JvdXBzVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNkOTY5MC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL1Jlc3RyaWN0R3JvdXBzVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXcuUmVzdHJpY3RHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5TaW11bGF0ZWRVc2VySW5mb3JtYXRpb247DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZXN0cmljdEdyb3Vwc1Rlc3RDYXNlIGV4dGVuZHMgQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTxSZXN0cmljdEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuPg0KLXsNCi0gICAgcHVibGljIFJlc3RyaWN0R3JvdXBzVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlc3RyaWN0R3JvdXBzVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBSZXN0cmljdEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFJlc3RyaWN0R3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdHJpY3RlZEdyb3VwKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDEucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN0cmljdGVkR3JvdXBXaXRoQWRtaW5Sb2xlKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlUmVxdWVzdFNjb3BlZEJlYW4oImN1cnJlbnRVc2VyIiwgbmV3IFNpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbigiYWRtaW4iKSk7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMi5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIiKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdHJpY3RlZEdyb3VwV2l0aFVzZXJSb2xlKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlUmVxdWVzdFNjb3BlZEJlYW4oImN1cnJlbnRVc2VyIiwgbmV3IFNpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbigidXNlciIpKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwyLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwyLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdHJpY3RlZEdyb3VwV2l0aENvcnJlY3RWaWV3SWQoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5zZXRWaWV3SWQoIi9wYWdlcy9ncm91cFZhbGlkYXRpb25Bd2FyZVBhZ2UueGh0bWwiKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwzLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwzLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN0cmljdGVkR3JvdXBXaXRoV3JvbmdWaWV3SWQoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMy5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMy5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIiKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFVzZWRBbmRSZXN0cmljdGVkR3JvdXAoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsNC5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsNC5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIiKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Vc2VHcm91cFZhbGlkYXRpb24xVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvVXNlR3JvdXBWYWxpZGF0aW9uMVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZmYyZjUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Vc2VHcm91cFZhbGlkYXRpb24xVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52aWV3LlVzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLlNpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgVXNlR3JvdXBWYWxpZGF0aW9uMVRlc3RDYXNlIGV4dGVuZHMgQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTxVc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbj4NCi17DQotICAgIHB1YmxpYyBVc2VHcm91cFZhbGlkYXRpb24xVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFVzZUdyb3VwVmFsaWRhdGlvbjFUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFVzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFVzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEdyb3VwMUF3YXJlVmFsaWRhdGlvbigpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwxLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwxLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXAxQW5kR3JvdXAyQXdhcmVWYWxpZGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDIucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDIucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXAyQW5kR3JvdXAzQXdhcmVWYWxpZGF0aW9uV2l0aFdyb25nVmlld0lkKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDMucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDMucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiZyIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAicCIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXAyQW5kR3JvdXAzQXdhcmVWYWxpZGF0aW9uV2l0aENvcnJlY3RWaWV3SWQxKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuc2V0Vmlld0lkKCIvcGFnZXMvcGFnZTEueGh0bWwiKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwzLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwzLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgImciKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgInAiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDIpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEdyb3VwMkFuZEdyb3VwM0F3YXJlVmFsaWRhdGlvbldpdGhDb3JyZWN0Vmlld0lkMigpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLnNldFZpZXdJZCgiL3BhZ2VzL3BhZ2UyLnhodG1sIik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMy5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMy5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICJnIik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICJwIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgyKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcm91cDJBd2FyZVZhbGlkYXRpb25XaXRoUm9sZUFkbWluKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlUmVxdWVzdFNjb3BlZEJlYW4oImN1cnJlbnRVc2VyIiwgbmV3IFNpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbigiYWRtaW4iKSk7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsNC5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsNC5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICJnIik7IC8vZG9uJ3QgZm9yY2UgYSB2aW9sYXRpb24gd2l0aCBHcm91cDENCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEdyb3VwMkFuZEdyb3VwM0F3YXJlVmFsaWRhdGlvbldpdGhSb2xlVXNlcigpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJjdXJyZW50VXNlciIsIG5ldyBTaW11bGF0ZWRVc2VySW5mb3JtYXRpb24oInVzZXIiKSk7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsNC5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsNC5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICJnIik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICJwIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgyKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvVXNlR3JvdXBWYWxpZGF0aW9uMlRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL1VzZUdyb3VwVmFsaWRhdGlvbjJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjdmMTJlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvVXNlR3JvdXBWYWxpZGF0aW9uMlRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52aWV3LlVzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotcHVibGljIGNsYXNzIFVzZUdyb3VwVmFsaWRhdGlvbjJUZXN0Q2FzZSBleHRlbmRzIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8VXNlR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4+DQotew0KLSAgICBwdWJsaWMgVXNlR3JvdXBWYWxpZGF0aW9uMlRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShVc2VHcm91cFZhbGlkYXRpb24yVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBVc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbiBnZXRCZWFuVG9UZXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBVc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcm91cDFBd2FyZVZhbGlkYXRpb24oKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvY3VzdG9tL0N1c3RvbVZpb2xhdGlvblNldmVyaXR5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL2N1c3RvbS9DdXN0b21WaW9sYXRpb25TZXZlcml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDgzMDc2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvY3VzdG9tL0N1c3RvbVZpb2xhdGlvblNldmVyaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLmN1c3RvbTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHkNCi17DQotICAgIGludGVyZmFjZSBXYXJuaW5nIGV4dGVuZHMgUGF5bG9hZA0KLSAgICB7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Hcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0dyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1M2MxNS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0dyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmFsaWRhdGlvbi5Hcm91cDE7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmFsaWRhdGlvbi5Hcm91cDI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmFsaWRhdGlvbi5Hcm91cDM7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlBhdHRlcm47DQotDQotcHVibGljIGNsYXNzIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4NCi17DQotICAgIEBOb3ROdWxsKGdyb3VwcyA9IEdyb3VwMS5jbGFzcykNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkxOw0KLQ0KLSAgICBAUGF0dGVybihyZWdleHAgPSAiW0EtWl1bYS16XSIsIGdyb3VwcyA9IEdyb3VwMy5jbGFzcykNCi0gICAgQFNpemUobWluID0gMywgZ3JvdXBzID0gR3JvdXAyLmNsYXNzKQ0KLSAgICBATm90TnVsbChncm91cHMgPSBHcm91cDIuY2xhc3MpDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MjsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MShTdHJpbmcgcHJvcGVydHkxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MSA9IHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkyKFN0cmluZyBwcm9wZXJ0eTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkyID0gcHJvcGVydHkyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyQmVhbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Hcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZjI5ZDkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Hcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAxOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotDQotcHVibGljIGNsYXNzIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4NCi17DQotICAgIEBCZWFuVmFsaWRhdGlvbih1c2VHcm91cHMgPSBHcm91cDEuY2xhc3MpDQotICAgIEBOb3ROdWxsKGdyb3VwcyA9IEdyb3VwMS5jbGFzcykNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkxOw0KLQ0KLSAgICBATm90TnVsbChncm91cHMgPSBHcm91cDIuY2xhc3MpDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MjsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MShTdHJpbmcgcHJvcGVydHkxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MSA9IHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkyKFN0cmluZyBwcm9wZXJ0eTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkyID0gcHJvcGVydHkyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0Y2RiMjIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uQ2xhc3NMZXZlbEVxdWFsOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotDQotQENsYXNzTGV2ZWxFcXVhbA0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuDQotew0KLSAgICBATm90TnVsbA0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTE7DQotDQotICAgIEBOb3ROdWxsDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MjsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MShTdHJpbmcgcHJvcGVydHkxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MSA9IHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkyKFN0cmluZyBwcm9wZXJ0eTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkyID0gcHJvcGVydHkyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyQmVhbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NTQzMjMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uQ2xhc3NMZXZlbEVxdWFsOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLQ0KLUBDbGFzc0xldmVsRXF1YWwNCi1AQmVhblZhbGlkYXRpb24odmlld0lkcyA9ICIvcGFnZXMvbW9kZWxWYWxpZGF0aW9uQXdhcmVQYWdlLnhodG1sIiwNCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbiA9IEBNb2RlbFZhbGlkYXRpb24oaXNBY3RpdmUgPSB0cnVlKSkNCi1wdWJsaWMgY2xhc3MgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyQmVhbg0KLXsNCi0gICAgQE5vdE51bGwNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkxOw0KLQ0KLSAgICBATm90TnVsbA0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1NpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9TaW11bGF0ZWRVc2VySW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwZWQxYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1NpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbDsNCi0NCi1wdWJsaWMgY2xhc3MgU2ltdWxhdGVkVXNlckluZm9ybWF0aW9uDQotew0KLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsNCi0NCi0gICAgcHVibGljIFNpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbihTdHJpbmcgdmFsdWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkbWluUm9sZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAiYWRtaW4iLmVxdWFscyh2YWx1ZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNVc2VyUm9sZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAidXNlciIuZXF1YWxzKHZhbHVlKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1Rlc3RDYXNlMUJlYW4uamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvVGVzdENhc2UxQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWJiY2RkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvVGVzdENhc2UxQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwucGF5bG9hZC5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlBhdHRlcm47DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdENhc2UxQmVhbg0KLXsNCi0gICAgQE5vdE51bGwNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkxOw0KLQ0KLSAgICBATm90TnVsbChwYXlsb2FkID0gVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcykNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkyOw0KLQ0KLSAgICBAU2l6ZShtaW4gPSAzLCBwYXlsb2FkID0gVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcykNCi0gICAgQFBhdHRlcm4ocmVnZXhwID0gIltBLVpdW2Etel0rIiwgcGF5bG9hZCA9IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTM7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkzKFN0cmluZyBwcm9wZXJ0eTMpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkzID0gcHJvcGVydHkzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9DbGFzc0xldmVsRXF1YWwuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9DbGFzc0xldmVsRXF1YWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ2MGZmZi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vQ2xhc3NMZXZlbEVxdWFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb247DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi0NCi1AamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0KFRZUEUpDQotQGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbihSVU5USU1FKQ0KLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkDQotQGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludCh2YWxpZGF0ZWRCeSA9IHtDbGFzc0xldmVsRXF1YWxzVmFsaWRhdG9yMS5jbGFzcywgQ2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjIuY2xhc3N9KQ0KLXB1YmxpYyBAaW50ZXJmYWNlIENsYXNzTGV2ZWxFcXVhbA0KLXsNCi0gICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJjbGFzcy1sZXZlbCBlcXVhbCB2aW9sYXRpb24iOw0KLQ0KLSAgICBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQge307DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHt9Ow0KLQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vQ2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjEuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9DbGFzc0xldmVsRXF1YWxzVmFsaWRhdG9yMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzFlMTQ4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9DbGFzc0xldmVsRXF1YWxzVmFsaWRhdG9yMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLk1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW47DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgQ2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjEgaW1wbGVtZW50cw0KLSAgICAgICAgQ29uc3RyYWludFZhbGlkYXRvcjxDbGFzc0xldmVsRXF1YWwsIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4+DQotew0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKENsYXNzTGV2ZWxFcXVhbCBwYXJhbWV0ZXJzKQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIHBhZ2VCZWFuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcHJvcGVydHkxID0gcGFnZUJlYW4uZ2V0UHJvcGVydHkxKCk7DQotICAgICAgICBTdHJpbmcgcHJvcGVydHkyID0gcGFnZUJlYW4uZ2V0UHJvcGVydHkyKCk7DQotDQotICAgICAgICByZXR1cm4gcHJvcGVydHkxID09IG51bGwgJiYgcHJvcGVydHkyID09IG51bGwgfHwgcHJvcGVydHkxICE9IG51bGwgJiYgcHJvcGVydHkxLmVxdWFscyhwcm9wZXJ0eTIpOw0KLQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9DbGFzc0xldmVsRXF1YWxzVmFsaWRhdG9yMi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0NsYXNzTGV2ZWxFcXVhbHNWYWxpZGF0b3IyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYWQ5MWUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0NsYXNzTGV2ZWxFcXVhbHNWYWxpZGF0b3IyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyQmVhbjsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBDbGFzc0xldmVsRXF1YWxzVmFsaWRhdG9yMiBpbXBsZW1lbnRzDQotICAgICAgICBDb25zdHJhaW50VmFsaWRhdG9yPENsYXNzTGV2ZWxFcXVhbCwgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyQmVhbj4NCi17DQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ2xhc3NMZXZlbEVxdWFsIHBhcmFtZXRlcnMpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4gcGFnZUJlYW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29uc3RyYWludFZhbGlkYXRvckNvbnRleHQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eTEgPSBwYWdlQmVhbi5nZXRQcm9wZXJ0eTEoKTsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eTIgPSBwYWdlQmVhbi5nZXRQcm9wZXJ0eTIoKTsNCi0NCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTEgPT0gbnVsbCAmJiBwcm9wZXJ0eTIgPT0gbnVsbCB8fCBwcm9wZXJ0eTEgIT0gbnVsbCAmJiBwcm9wZXJ0eTEuZXF1YWxzKHByb3BlcnR5Mik7DQotDQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0dyb3VwMS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0dyb3VwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yjg5NDgwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9Hcm91cDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmFsaWRhdGlvbjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIEdyb3VwMQ0KLXsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0dyb3VwMi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0dyb3VwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTY1YjUzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9Hcm91cDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmFsaWRhdGlvbjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIEdyb3VwMg0KLXsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0dyb3VwMy5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0dyb3VwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmJhY2ZiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9Hcm91cDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmFsaWRhdGlvbjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIEdyb3VwMw0KLXsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L0N1c3RvbVNldmVyaXR5VGVzdENhc2UxUGFnZUJlYW4uamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9DdXN0b21TZXZlcml0eVRlc3RDYXNlMVBhZ2VCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MDljZjAuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L0N1c3RvbVNldmVyaXR5VGVzdENhc2UxUGFnZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5jdXN0b20uQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ3VzdG9tU2V2ZXJpdHlUZXN0Q2FzZTFQYWdlQmVhbg0KLXsNCi0gICAgQE5vdE51bGwocGF5bG9hZCA9IEN1c3RvbVZpb2xhdGlvblNldmVyaXR5Lldhcm5pbmcuY2xhc3MpDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MShTdHJpbmcgcHJvcGVydHkxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MSA9IHByb3BlcnR5MTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4uamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWEwNzM2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52aWV3Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuOw0KLQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsMSA9IG5ldyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIHByaXZhdGUgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDIgPSBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24obW9kZWxWYWxpZGF0aW9uID0gQE1vZGVsVmFsaWRhdGlvbihpc0FjdGl2ZSA9IHRydWUpKQ0KLSAgICBwcml2YXRlIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gbW9kZWwzID0gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgQEJlYW5WYWxpZGF0aW9uKG1vZGVsVmFsaWRhdGlvbiA9IEBNb2RlbFZhbGlkYXRpb24oaXNBY3RpdmUgPSB0cnVlLCBkaXNwbGF5SW5saW5lID0gdHJ1ZSkpDQotICAgIHByaXZhdGUgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDQgPSBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24oY29uZGl0aW9ucyA9ICIje2N1cnJlbnRVc2VyLnVzZXJSb2xlfSIsIG1vZGVsVmFsaWRhdGlvbiA9IEBNb2RlbFZhbGlkYXRpb24oaXNBY3RpdmUgPSB0cnVlKSkNCi0gICAgcHJpdmF0ZSBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsNSA9IG5ldyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIEBCZWFuVmFsaWRhdGlvbihtb2RlbFZhbGlkYXRpb24gPSBATW9kZWxWYWxpZGF0aW9uKGlzQWN0aXZlID0gdHJ1ZSkpDQotICAgIHB1YmxpYyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIGdldE1vZGVsMSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDE7DQotICAgIH0NCi0NCi0gICAgQEJlYW5WYWxpZGF0aW9uKG1vZGVsVmFsaWRhdGlvbiA9IEBNb2RlbFZhbGlkYXRpb24oaXNBY3RpdmUgPSB0cnVlLCBkaXNwbGF5SW5saW5lID0gdHJ1ZSkpDQotICAgIHB1YmxpYyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIGdldE1vZGVsMigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWwzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1vZGVsMzsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWw0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIGdldE1vZGVsNSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDU7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFlNDkyNC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbjsNCi0NCi1AQmVhblZhbGlkYXRpb24obW9kZWxWYWxpZGF0aW9uID0gQE1vZGVsVmFsaWRhdGlvbihpc0FjdGl2ZSA9IHRydWUsIHZhbGlkYXRpb25UYXJnZXRzID0gIiN7dGVzdEJlYW4ubW9kZWx9IikpDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuDQotew0KLSAgICBwcml2YXRlIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gbW9kZWwgPSBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UzUGFnZUJlYW4uamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTNQYWdlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjZjYzBlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTNQYWdlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52aWV3Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuOw0KLQ0KLUBCZWFuVmFsaWRhdGlvbih2aWV3SWRzID0gIi9wYWdlcy9tb2RlbFZhbGlkYXRpb25Bd2FyZVBhZ2UueGh0bWwiLA0KLSAgICAgICAgbW9kZWxWYWxpZGF0aW9uID0gQE1vZGVsVmFsaWRhdGlvbihpc0FjdGl2ZSA9IHRydWUsIHZhbGlkYXRpb25UYXJnZXRzID0gIiN7dGVzdEJlYW4ubW9kZWx9IikpDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlM1BhZ2VCZWFuDQotew0KLSAgICBwcml2YXRlIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gbW9kZWwgPSBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2U0UGFnZUJlYW4uamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTRQYWdlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2M3NGMwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTRQYWdlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52aWV3Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLk1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW47DQotDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlNFBhZ2VCZWFuDQotew0KLSAgICBwcml2YXRlIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4gbW9kZWwgPSBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyQmVhbigpOw0KLQ0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyQmVhbiBnZXRNb2RlbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvUmVzdHJpY3RHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L1Jlc3RyaWN0R3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU3MjRlZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvUmVzdHJpY3RHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52aWV3Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLkdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmFsaWRhdGlvbi5Hcm91cDE7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmFsaWRhdGlvbi5Hcm91cDI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uQmVhblZhbGlkYXRpb247DQotDQotQEJlYW5WYWxpZGF0aW9uKHVzZUdyb3VwcyA9IEdyb3VwMS5jbGFzcykNCi1wdWJsaWMgY2xhc3MgUmVzdHJpY3RHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbg0KLXsNCi0gICAgQEJlYW5WYWxpZGF0aW9uKHJlc3RyaWN0R3JvdXBzID0gR3JvdXAxLmNsYXNzKQ0KLSAgICBwcml2YXRlIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gbW9kZWwxID0gbmV3IEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgcHJpdmF0ZSBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsMiA9IG5ldyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIEBCZWFuVmFsaWRhdGlvbih2aWV3SWRzID0gIi9wYWdlcy9ncm91cFZhbGlkYXRpb25Bd2FyZVBhZ2UueGh0bWwiLCByZXN0cmljdEdyb3VwcyA9IEdyb3VwMS5jbGFzcykNCi0gICAgcHJpdmF0ZSBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsMyA9IG5ldyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIEBCZWFuVmFsaWRhdGlvbihyZXN0cmljdEdyb3VwcyA9IEdyb3VwMS5jbGFzcywgdXNlR3JvdXBzID0gR3JvdXAyLmNsYXNzKQ0KLSAgICBwcml2YXRlIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gbW9kZWw0ID0gbmV3IEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgcHVibGljIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWwxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1vZGVsMTsNCi0gICAgfQ0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24oY29uZGl0aW9ucyA9ICIje2N1cnJlbnRVc2VyLmFkbWluUm9sZX0iLCByZXN0cmljdEdyb3VwcyA9IEdyb3VwMS5jbGFzcykNCi0gICAgcHVibGljIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWwyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1vZGVsMjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWwzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIGdldE1vZGVsNCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDQ7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L1VzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvVXNlR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgyZTVlYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvVXNlR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5Hcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAxOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLQ0KLUBCZWFuVmFsaWRhdGlvbih1c2VHcm91cHMgPSBHcm91cDEuY2xhc3MpDQotcHVibGljIGNsYXNzIFVzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuDQotew0KLSAgICBwcml2YXRlIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gbW9kZWwxID0gbmV3IEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgcHJpdmF0ZSBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsMiA9IG5ldyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIEBCZWFuVmFsaWRhdGlvbih2aWV3SWRzID0geyIvcGFnZXMvcGFnZTEueGh0bWwiLCAiL3BhZ2VzL3BhZ2UyLnhodG1sIn0sdXNlR3JvdXBzID0ge0dyb3VwMi5jbGFzcywgR3JvdXAzLmNsYXNzfSkNCi0gICAgcHJpdmF0ZSBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsMyA9IG5ldyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIEBCZWFuVmFsaWRhdGlvbi5MaXN0KHsNCi0gICAgICAgIEBCZWFuVmFsaWRhdGlvbih1c2VHcm91cHMgPSBHcm91cDIuY2xhc3MsIGNvbmRpdGlvbnMgPSAiI3tjdXJyZW50VXNlci5hZG1pblJvbGV9IiksDQotICAgICAgICBAQmVhblZhbGlkYXRpb24odXNlR3JvdXBzID0ge0dyb3VwMi5jbGFzcywgR3JvdXAzLmNsYXNzfSwgY29uZGl0aW9ucyA9ICIje2N1cnJlbnRVc2VyLnVzZXJSb2xlfSIpDQotICAgIH0pDQotICAgIHByaXZhdGUgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDQgPSBuZXcgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBwdWJsaWMgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWwxOw0KLSAgICB9DQotDQotICAgIEBCZWFuVmFsaWRhdGlvbih1c2VHcm91cHMgPSBHcm91cDIuY2xhc3MpDQotICAgIHB1YmxpYyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIGdldE1vZGVsMigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWwzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1vZGVsMzsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWw0Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Vc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L1VzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZjg1ZGQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L1VzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyQmVhbjsNCi0NCi1wdWJsaWMgY2xhc3MgVXNlR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4NCi17DQotICAgIHByaXZhdGUgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyQmVhbiBtb2RlbCA9IG5ldyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuKCk7DQotDQotICAgIHB1YmxpYyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuIGdldE1vZGVsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1vZGVsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvcG9tLnhtbCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmYmY1Yi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmUtdGVzdHM8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQ29yZS1UZXN0czwvbmFtZT4NCi0gICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+dGVzdC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGYwNzkzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL0Fic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UuQWJzdHJhY3RFeFZhbFRlc3RDYXNlOw0KLQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW52b2tlU3RhcnR1cExpc3RlbmVycygpDQotICAgIHsNCi0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb25UZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWNmZWUxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb25UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotcHVibGljIGNsYXNzIFZhbHVlQmluZGluZ0V4cHJlc3Npb25UZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFZhbHVlQmluZGluZ0V4cHJlc3Npb25UZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhbmRhcmRTeW50YXgoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xLnByb3BlcnR5MX0iKTsNCi0NCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjEucHJvcGVydHkxfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjF9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTEiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydwcm9wZXJ0eTEnXX0iKTsNCi0NCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjFbJ3Byb3BlcnR5MSddfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjF9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTEiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydiZWFuMiddLnByb3BlcnR5MX0iKTsNCi0NCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjFbJ2JlYW4yJ10ucHJvcGVydHkxfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjFbJ2JlYW4yJ119IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTEiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFyZFN5bnRheFJlcGxhY2VQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjEucHJvcGVydHkxfSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sICJwcm9wZXJ0eTIiKTsNCi0NCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjEucHJvcGVydHkyfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjF9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTIiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydwcm9wZXJ0eTEnXX0iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2VQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAicHJvcGVydHkyIik7DQotDQotICAgICAgICAvL1RPRE8gcmVzdG9yZSBvcmlnaW5hbCBzeW50YXgNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjEucHJvcGVydHkyfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjF9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTIiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydiZWFuMiddLnByb3BlcnR5MX0iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2VQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAicHJvcGVydHkyIik7DQotDQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xWydiZWFuMiddLnByb3BlcnR5Mn0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xWydiZWFuMiddfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tiZWFuMX0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygicHJvcGVydHkyIiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhbmRhcmRTeW50YXhBZGRQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjEuYmVhbjJ9Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5hZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAicHJvcGVydHkxIik7DQotDQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xLmJlYW4yLnByb3BlcnR5MX0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xLmJlYW4yfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygicHJvcGVydHkxIiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsnYmVhbjInXX0iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sICJwcm9wZXJ0eTEiKTsNCi0NCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjFbJ2JlYW4yJ10ucHJvcGVydHkxfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjFbJ2JlYW4yJ119IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTEiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydiZWFuMiddLmJlYW4zfSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24uYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgInByb3BlcnR5MSIpOw0KLQ0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tiZWFuMVsnYmVhbjInXS5iZWFuMy5wcm9wZXJ0eTF9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tiZWFuMVsnYmVhbjInXS5iZWFuM30iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjFbJ2JlYW4yJ119IiwNCi0gICAgICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInByb3BlcnR5MSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhY2VsZXRzQ3VzdG9tQ29tcG9uZW50U3ludGF4KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tlbnRpdHlbZmllbGROYW1lXX0iKTsNCi0NCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7ZW50aXR5W2ZpZWxkTmFtZV19IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tlbnRpdHl9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJmaWVsZE5hbWUiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWNlbGV0c0N1c3RvbUNvbXBvbmVudFN5bnRheFJlcGxhY2VQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7ZW50aXR5W2ZpZWxkTmFtZV19Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgIm5ld0ZpZWxkTmFtZSIpOw0KLQ0KLSAgICAgICAgLy9UT0RPIHJlc3RvcmUgb3JpZ2luYWwgc3ludGF4DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2VudGl0eS5uZXdGaWVsZE5hbWV9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tlbnRpdHl9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJuZXdGaWVsZE5hbWUiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wbGV4TWFwU3ludGF4KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24NCi0gICAgICAgICAgICAgICAgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVtiZWFuMltiZWFuM1sna2V5MSddXV0ucHJvcGVydHkxfSIpOw0KLQ0KLSAgICAgICAgLy9UT0RPDQotICAgICAgICAvL2Fzc2VydEVxdWFscygiI3tiZWFuMVtiZWFuMltiZWFuM1sna2V5MSddXV0ucHJvcGVydHkxfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInByb3BlcnR5MSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW5pdGlhbGl6ZXIvUmVnaXN0cmF0aW9uQ29tcG9uZW50SW5pdGlhbGl6ZXJUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW5pdGlhbGl6ZXIvUmVnaXN0cmF0aW9uQ29tcG9uZW50SW5pdGlhbGl6ZXJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzlmNGMxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2luaXRpYWxpemVyL1JlZ2lzdHJhdGlvbkNvbXBvbmVudEluaXRpYWxpemVyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLmluaXRpYWxpemVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvbkNvbXBvbmVudEluaXRpYWxpemVyVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlZ2lzdHJhdGlvbkNvbXBvbmVudEluaXRpYWxpemVyVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvbkNvbXBvbmVudEluaXRpYWxpemVyVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wb25lbnRJbml0aWFsaXplckluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IFRlc3RDb21wb25lbnRJbml0aWFsaXplcjEwMDAoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZENvbXBvbmVudEluaXRpYWxpemVyKG5ldyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMygpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZENvbXBvbmVudEluaXRpYWxpemVyKG5ldyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIxKCkpOw0KLQ0KLSAgICAgICAgTGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4gcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7DQotDQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gNTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5zaXplKCkgPT0gcmVzdWx0TGVuZ3RoKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjIpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIzKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMTAwMCk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RDb21wb25lbnRJbml0aWFsaXplcik7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdENvbXBvbmVudEluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMSkNCi0gICAgY2xhc3MgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMSBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDIpDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjIgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigzKQ0KLSAgICBjbGFzcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIzIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTAwMCkNCi0gICAgY2xhc3MgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMTAwMCBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNzg1ODAuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZQ0KLXsNCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBSZWdpc3RyYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWdpc3RyYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JJbml0aWFsaXphdGlvbigpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxMDAwKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjMoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMSgpKTsNCi0NCi0gICAgICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOw0KLQ0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDU7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3VsdExlbmd0aCwgcmVzdWx0LnNpemUoKSk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMi5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjMuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxMDAwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdENvbXBvbmVudEluaXRpYWxpemVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxKQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDIpDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMykNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMyBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxMDAwKQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxMDAwIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MGQzMjguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUmVnaXN0cmF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVnaXN0cmF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ySW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEwMDAoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IzKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEoKSk7DQotDQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsNCi0NCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSA2Ow0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHRMZW5ndGgsIHJlc3VsdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMS5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IzLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxMDAwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdENvbXBvbmVudEluaXRpYWxpemVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMSkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMSBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMikNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMiBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMykNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMyBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTAwMCkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMCBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTRkMzY4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUmVnaXN0cmF0aW9uVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvblZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ySW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IxKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcihuZXcgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjMoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IxMDAwKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkpOw0KLQ0KLSAgICAgICAgTGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsNCi0NCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSA3Ow0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHRMZW5ndGgsIHJlc3VsdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjEuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMi5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IzLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVmlvbGF0aW9uU2V2ZXJpdHlWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhIdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA1Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMTAwMC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDY6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMSBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigyKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMiBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigzKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMyBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxMDAwKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMTAwMCBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvbk1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25NZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMDFiMDEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvbk1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5OYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIuKjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrLk1vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvbk1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlZ2lzdHJhdGlvbk1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvbk1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyNjUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyMTUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyNDUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyMjUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyNTUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOTkoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIzNTAoKSk7DQotDQotICAgICAgICBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gcmVzdWx0ID0gZ2V0TmFtZU1hcHBlcnMoKTsNCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSAxNjsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0TGVuZ3RoLCByZXN1bHQuc2l6ZSgpKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOTkuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyMTUwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjI1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDU6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKERlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIzNTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA3Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgODoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI0NTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA5Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDEwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDExOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDEyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDEzOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjU1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjY1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE1Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxTdHJpbmc+PiBnZXROYW1lTWFwcGVycygpDQotICAgIHsNCi0gICAgICAgIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkgcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiAoKE1vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KXJlc3VsdCkuZ2V0UmVnaXN0ZXJlZE5hbWVNYXBwZXJMaXN0KCk7DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoOTkpDQotICAgIGNsYXNzIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOTkgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTUwKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjE1MCBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigyNTApDQotICAgIGNsYXNzIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyMjUwIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDM1MCkNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIzNTAgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoNDUwKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjQ1MCBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcig1NTApDQotICAgIGNsYXNzIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyNTUwIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDY1MCkNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI2NTAgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNjdiNDMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5OYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyLio7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UubW9jay5Nb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVySW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjMwMSgpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIxNTAoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyNDUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjI1MCgpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXI1NTAoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyOTkoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyMzUwKCkpOw0KLQ0KLSAgICAgICAgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IHJlc3VsdCA9IGdldE5hbWVNYXBwZXJzKCk7DQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gMTM7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3VsdExlbmd0aCwgcmVzdWx0LnNpemUoKSk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjk5LmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIxNTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjI1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDU6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDY6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyMzAxLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgODoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIzNTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA5Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDEwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjQ1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDExOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjU1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDEyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXROYW1lTWFwcGVycygpDQotICAgIHsNCi0gICAgICAgIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkgcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiAoKE1vY2tNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5KXJlc3VsdCkuZ2V0UmVnaXN0ZXJlZE5hbWVNYXBwZXJMaXN0KCk7DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoOTkpDQotICAgIGNsYXNzIFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyOTkgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTUwKQ0KLSAgICBjbGFzcyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjE1MCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigyNTApDQotICAgIGNsYXNzIFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyMjUwIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDMwMSkNCi0gICAgY2xhc3MgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIzMDEgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMzUwKQ0KLSAgICBjbGFzcyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjM1MCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcig0NTApDQotICAgIGNsYXNzIFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyNDUwIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDU1MCkNCi0gICAgY2xhc3MgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXI1NTAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdkY2UzMy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9tYXBwZXIvUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuTmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyLio7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrLk1vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGVySW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIxNTAoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI0NTAoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIyNTAoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI1NTAoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI5OSgpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjM1MCgpKTsNCi0NCi0gICAgICAgIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiByZXN1bHQgPSBnZXROYW1lTWFwcGVycygpOw0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDEzOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHRMZW5ndGgsIHJlc3VsdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOTkuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjE1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDQ6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyMjUwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA3Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIzNTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA4Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgOToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyNDUwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMTA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMTE6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjU1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDEyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gZ2V0TmFtZU1hcHBlcnMoKQ0KLSAgICB7DQotICAgICAgICBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiAoKE1vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSlyZXN1bHQpLmdldFJlZ2lzdGVyZWROYW1lTWFwcGVyTGlzdCgpOw0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDk5KQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI5OSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDE1MCkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyMTUwIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMjUwKQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIyNTAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigzNTApDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjM1MCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDQ1MCkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyNDUwIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoNTUwKQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI1NTAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvQ3VzdG9tUHJvamVjdFN0YWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9DdXN0b21Qcm9qZWN0U3RhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmMTZiMy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9DdXN0b21Qcm9qZWN0U3RhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuc3RhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuUHJvamVjdFN0YWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Qcm9qZWN0U3RhZ2VOYW1lOw0KLQ0KLS8qKg0KLSAqIGN1c3RvbSBwcm9qZWN0IHN0YWdlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWVudW0gQ3VzdG9tUHJvamVjdFN0YWdlDQotew0KLSAgICBEZXYoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZSgiRGV2IikpLA0KLSAgICBUZXN0KFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoIlRlc3QiKSksDQotICAgIFByb2QoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZSgiUHJvZCIpKTsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0U3RhZ2VOYW1lIHZhbHVlOw0KLQ0KLSAgICBDdXN0b21Qcm9qZWN0U3RhZ2UoUHJvamVjdFN0YWdlTmFtZSB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpcyhDdXN0b21Qcm9qZWN0U3RhZ2UgY3VzdG9tUHJvamVjdFN0YWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUHJvamVjdFN0YWdlLmlzKGN1c3RvbVByb2plY3RTdGFnZS5nZXRWYWx1ZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvamVjdFN0YWdlTmFtZSBnZXRWYWx1ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnZhbHVlOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0N1c3RvbVByb2plY3RTdGFnZVRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9DdXN0b21Qcm9qZWN0U3RhZ2VUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTIzOWQ5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0N1c3RvbVByb2plY3RTdGFnZVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLnN0YWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Kc2ZQcm9qZWN0U3RhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlByb2plY3RTdGFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1wdWJsaWMgY2xhc3MgQ3VzdG9tUHJvamVjdFN0YWdlVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9TVEFHRSA9ICJqYXZheC5mYWNlcy5QUk9KRUNUX1NUQUdFIjsNCi0gICAgDQotICAgIHB1YmxpYyBDdXN0b21Qcm9qZWN0U3RhZ2VUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ3VzdG9tUHJvamVjdFN0YWdlVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3REZXZlbG9wbWVudFN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihQUk9KRUNUX1NUQUdFLCAiRGV2Iik7DQotICAgICAgICBhc3NlcnRUcnVlKEN1c3RvbVByb2plY3RTdGFnZS5pcyhDdXN0b21Qcm9qZWN0U3RhZ2UuRGV2KSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFRlc3RTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoUFJPSkVDVF9TVEFHRSwgIlRlc3QiKTsNCi0gICAgICAgIGFzc2VydFRydWUoQ3VzdG9tUHJvamVjdFN0YWdlLmlzKEN1c3RvbVByb2plY3RTdGFnZS5UZXN0KSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFByb2R1Y3Rpb25TdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoUFJPSkVDVF9TVEFHRSwgIlByb2QiKTsNCi0gICAgICAgIGFzc2VydFRydWUoQ3VzdG9tUHJvamVjdFN0YWdlLmlzKEN1c3RvbVByb2plY3RTdGFnZS5Qcm9kKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIGFzc2VydFRydWUoUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5Qcm9kdWN0aW9uLmdldFZhbHVlKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdEZWZhdWx0U3RhZ2UxKCkNCi0gICAgew0KLSAgICAgICAgYXNzZXJ0RmFsc2UoQ3VzdG9tUHJvamVjdFN0YWdlLmlzKEN1c3RvbVByb2plY3RTdGFnZS5EZXYpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdEZWZhdWx0U3RhZ2UyKCkNCi0gICAgew0KLSAgICAgICAgYXNzZXJ0RmFsc2UoQ3VzdG9tUHJvamVjdFN0YWdlLmlzKEN1c3RvbVByb2plY3RTdGFnZS5UZXN0KSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvSW5kZXBlbmRlbnRQcm9qZWN0U3RhZ2VUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvSW5kZXBlbmRlbnRQcm9qZWN0U3RhZ2VUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjZhNGY5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0luZGVwZW5kZW50UHJvamVjdFN0YWdlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLnN0YWdlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgSW5kZXBlbmRlbnRQcm9qZWN0U3RhZ2VUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFUEVOREVOVF9QUk9KRUNUX1NUQUdFID0gImN1c3RvbS5QUk9KRUNUX1NUQUdFIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTRl9QUk9KRUNUX1NUQUdFID0gImphdmF4LmZhY2VzLlBST0pFQ1RfU1RBR0UiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0RFViA9ICJjdXN0b21fZGV2IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9QUk9EID0gImN1c3RvbV9wcm9kIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9URVNUID0gImN1c3RvbV90ZXN0IjsNCi0NCi0gICAgcHVibGljIEluZGVwZW5kZW50UHJvamVjdFN0YWdlVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEluZGVwZW5kZW50UHJvamVjdFN0YWdlVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KFByb2plY3RTdGFnZVJlc29sdmVyLmNsYXNzLmdldE5hbWUoKSwgbmV3IERlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpDQotICAgICAgICB7DQotICAgICAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICAgICAgcHVibGljIFByb2plY3RTdGFnZSBnZXRDdXJyZW50UHJvamVjdFN0YWdlKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFN0cmluZyBqc2ZQcm9qZWN0U3RhZ2VOYW1lID0gcmVzb2x2ZVByb2plY3RTdGFnZU5hbWUoImphdmF4LmZhY2VzLlBST0pFQ1RfU1RBR0UiKTsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIGluZGVwZW5kZW50UHJvamVjdFN0YWdlTmFtZSA9IHJlc29sdmVQcm9qZWN0U3RhZ2VOYW1lKElOREVQRU5ERU5UX1BST0pFQ1RfU1RBR0UpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoIShqc2ZQcm9qZWN0U3RhZ2VOYW1lID09IG51bGwgfHwgIiIuZXF1YWxzKGpzZlByb2plY3RTdGFnZU5hbWUpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgUHJvamVjdFN0YWdlTmFtZSByZXN1bHQgPSBQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKGpzZlByb2plY3RTdGFnZU5hbWUudHJpbSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIGZvcihKc2ZQcm9qZWN0U3RhZ2UganNmUHJvamVjdFN0YWdlIDogSnNmUHJvamVjdFN0YWdlLnZhbHVlcygpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGpzZlByb2plY3RTdGFnZS5nZXRWYWx1ZSgpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZShyZXN1bHQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZighKGluZGVwZW5kZW50UHJvamVjdFN0YWdlTmFtZSA9PSBudWxsIHx8ICIiLmVxdWFscyhpbmRlcGVuZGVudFByb2plY3RTdGFnZU5hbWUpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgUHJvamVjdFN0YWdlTmFtZSBpbmRlcGVuZGVudFJlc3VsdCA9IFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoaW5kZXBlbmRlbnRQcm9qZWN0U3RhZ2VOYW1lLnRyaW0oKSk7DQotDQotICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGpzZiBzdGFnZSB2YWx1ZXMgZmlyc3QNCi0gICAgICAgICAgICAgICAgICAgIFByb2plY3RTdGFnZU5hbWUgcmVzdWx0ID0gUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShpbmRlcGVuZGVudFByb2plY3RTdGFnZU5hbWUudHJpbSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIGZvcihKc2ZQcm9qZWN0U3RhZ2UganNmUHJvamVjdFN0YWdlIDogSnNmUHJvamVjdFN0YWdlLnZhbHVlcygpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGpzZlByb2plY3RTdGFnZS5nZXRWYWx1ZSgpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZShyZXN1bHQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgY3VzdG9tIHN0YWdlIHZhbHVlcw0KLSAgICAgICAgICAgICAgICAgICAgaWYoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShDVVNUT01fREVWKS5lcXVhbHMoaW5kZXBlbmRlbnRSZXN1bHQpIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoQ1VTVE9NX1RFU1QpLmVxdWFscyhpbmRlcGVuZGVudFJlc3VsdCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZShpbmRlcGVuZGVudFJlc3VsdCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVByb2plY3RTdGFnZShQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKENVU1RPTV9QUk9EKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZVByb2plY3RTdGFnZU5hbWUoU3RyaW5nIHBhcmFtZXRlck5hbWUpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRJbml0UGFyYW1ldGVyKHBhcmFtZXRlck5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KFByb2plY3RTdGFnZVJlc29sdmVyLmNsYXNzLmdldE5hbWUoKSwgbmV3IERlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGV2ZWxvcG1lbnRTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoSU5ERVBFTkRFTlRfUFJPSkVDVF9TVEFHRSwgQ1VTVE9NX0RFVik7DQotICAgICAgICBhc3NlcnRUcnVlKFByb2plY3RTdGFnZS5pcyhQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKENVU1RPTV9ERVYpKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFRlc3RTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoSU5ERVBFTkRFTlRfUFJPSkVDVF9TVEFHRSwgQ1VTVE9NX1RFU1QpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQcm9qZWN0U3RhZ2UuaXMoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShDVVNUT01fVEVTVCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFsbGJhY2tTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoSU5ERVBFTkRFTlRfUFJPSkVDVF9TVEFHRSwgIlN5c3RlbVRlc3QiKTsNCi0gICAgICAgIGFzc2VydFRydWUoSnNmUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5TeXN0ZW1UZXN0KSk7DQotICAgICAgICBhc3NlcnRUcnVlKFByb2plY3RTdGFnZS5pcyhQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKCJTeXN0ZW1UZXN0IikpKTsNCi0gICAgICAgIGFzc2VydFRydWUoUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5TeXN0ZW1UZXN0LmdldFZhbHVlKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGVKc2ZTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoSU5ERVBFTkRFTlRfUFJPSkVDVF9TVEFHRSwgQ1VTVE9NX0RFVik7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKEpTRl9QUk9KRUNUX1NUQUdFLCAiU3lzdGVtVGVzdCIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLlN5c3RlbVRlc3QpKTsNCi0gICAgICAgIGFzc2VydFRydWUoUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5TeXN0ZW1UZXN0LmdldFZhbHVlKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZHVjdGlvblN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihJTkRFUEVOREVOVF9QUk9KRUNUX1NUQUdFLCBDVVNUT01fUFJPRCk7DQotICAgICAgICBhc3NlcnRUcnVlKFByb2plY3RTdGFnZS5pcyhQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKENVU1RPTV9QUk9EKSkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICBhc3NlcnRUcnVlKFByb2plY3RTdGFnZS5pcyhQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKENVU1RPTV9QUk9EKSkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ0RlZmF1bHRTdGFnZTEoKQ0KLSAgICB7DQotICAgICAgICBhc3NlcnRGYWxzZShQcm9qZWN0U3RhZ2UuaXMoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShDVVNUT01fREVWKSkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ0RlZmF1bHRTdGFnZTIoKQ0KLSAgICB7DQotICAgICAgICBhc3NlcnRGYWxzZShQcm9qZWN0U3RhZ2UuaXMoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShDVVNUT01fVEVTVCkpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9Kc2ZQcm9qZWN0U3RhZ2VUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvSnNmUHJvamVjdFN0YWdlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwMTU1YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9Kc2ZQcm9qZWN0U3RhZ2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5zdGFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSnNmUHJvamVjdFN0YWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLXB1YmxpYyBjbGFzcyBKc2ZQcm9qZWN0U3RhZ2VUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX1NUQUdFID0gImphdmF4LmZhY2VzLlBST0pFQ1RfU1RBR0UiOw0KLSAgICBwdWJsaWMgSnNmUHJvamVjdFN0YWdlVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEpzZlByb2plY3RTdGFnZVRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGV2ZWxvcG1lbnRTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoUFJPSkVDVF9TVEFHRSwgIkRldmVsb3BtZW50Iik7DQotICAgICAgICBhc3NlcnRUcnVlKEpzZlByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuRGV2ZWxvcG1lbnQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pdFRlc3RTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoUFJPSkVDVF9TVEFHRSwgIlVuaXRUZXN0Iik7DQotICAgICAgICBhc3NlcnRUcnVlKEpzZlByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuVW5pdFRlc3QpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3lzdGVtVGVzdFN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihQUk9KRUNUX1NUQUdFLCAiU3lzdGVtVGVzdCIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLlN5c3RlbVRlc3QpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZHVjdGlvblN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihQUk9KRUNUX1NUQUdFLCAiUHJvZHVjdGlvbiIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLlByb2R1Y3Rpb24pKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgYXNzZXJ0VHJ1ZShKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLlByb2R1Y3Rpb24pKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdEZWZhdWx0U3RhZ2UxKCkNCi0gICAgew0KLSAgICAgICAgYXNzZXJ0RmFsc2UoSnNmUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5EZXZlbG9wbWVudCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ0RlZmF1bHRTdGFnZTIoKQ0KLSAgICB7DQotICAgICAgICBhc3NlcnRGYWxzZShKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLlVuaXRUZXN0KSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFdyb25nRGVmYXVsdFN0YWdlMygpDQotICAgIHsNCi0gICAgICAgIGFzc2VydEZhbHNlKEpzZlByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuU3lzdGVtVGVzdCkpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3BvbS54bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTU0ZDBiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD50ZXN0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBUZXN0LU1vZHVsZXM8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+DQotICAgICAgICAgICAgc2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvdmFsaWRhdGlvbi1tb2R1bGVzDQotICAgICAgICA8L2Nvbm5lY3Rpb24+DQotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj4NCi0gICAgICAgICAgICBzY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvdmFsaWRhdGlvbi1tb2R1bGVzDQotICAgICAgICA8L2RldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy92YWxpZGF0aW9uLW1vZHVsZXM8L3VybD4NCi0gICAgPC9zY20+DQotDQotICAgIDxtb2R1bGVzPg0KLSAgICAgICAgPG1vZHVsZT5iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmU8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+Y29yZS10ZXN0czwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzPC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPmJlYW4tdmFsaWRhdGlvbi10ZXN0czwvbW9kdWxlPg0KLSAgICA8L21vZHVsZXM+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjU8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldC5qc3A8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNwLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zaGFsZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zaGFsZS10ZXN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC40PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4NCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5teWZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgPC9leGNsdXNpb25zPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgPC9yZXNvdXJjZXM+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+dGVzdC1qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotDQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQuMjwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovQWJzdHJhY3QqLmphdmE8L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovQmFzZSouamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9UZXN0VXRpbHMuamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qQmVhbi5qYXZhPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3BvbS54bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MjQzMGQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFByb3BlcnR5LVZhbGlkYXRpb24tVGVzdHM8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPnRlc3QtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlLXRlc3RzPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk1M2Q2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL0Fic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UuQWJzdHJhY3RFeFZhbFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIEFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGludm9rZVN0YXJ0dXBMaXN0ZW5lcnMoKQ0KLSAgICB7DQotICAgICAgICBuZXcgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyKCl7DQotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDIzMDc2OTIwOTI2NzUyNjQ2TDsNCi0NCi0gICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHN1cGVyLmluaXQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9LmluaXQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgbmV3IENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIoKS5hZnRlclBoYXNlKG5ldyBQaGFzZUV2ZW50KGZhY2VzQ29udGV4dCwgUGhhc2VJZC5BTllfUEhBU0UsbGlmZWN5Y2xlKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvQmFzZVZhbFRlc3RCZWFuLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9CYXNlVmFsVGVzdEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg1NDNmOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9CYXNlVmFsVGVzdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uRG91YmxlUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBCYXNlVmFsVGVzdEJlYW4NCi17DQotICAgIEBSZXF1aXJlZA0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOw0KLQ0KLSAgICBATGVuZ3RoKG1pbmltdW09MixtYXhpbXVtPTMpDQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWUxOw0KLQ0KLSAgICBAUGF0dGVybigiW0EtWl1bYS16XSsiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXR0ZXJuTmFtZTsNCi0NCi0gICAgQERvdWJsZVJhbmdlKG1pbmltdW09LTMwMGQpDQotICAgIHByaXZhdGUgRG91YmxlIGRvdWJsZVZhbHVlMTsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5hbWUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUxKFN0cmluZyBuYW1lMSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uYW1lMSA9IG5hbWUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0dGVybk5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGF0dGVybk5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGF0dGVybk5hbWUoU3RyaW5nIHBhdHRlcm5OYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhdHRlcm5OYW1lID0gcGF0dGVybk5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERvdWJsZSBnZXREb3VibGVWYWx1ZTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZG91YmxlVmFsdWUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERvdWJsZVZhbHVlMShEb3VibGUgZG91YmxlVmFsdWUxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRvdWJsZVZhbHVlMSA9IGRvdWJsZVZhbHVlMTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9DdXN0b21TZXZlcml0eVRlc3RCZWFuLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9DdXN0b21TZXZlcml0eVRlc3RCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NzdmZmUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvQ3VzdG9tU2V2ZXJpdHlUZXN0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jdXN0b20uQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotcHVibGljIGNsYXNzIEN1c3RvbVNldmVyaXR5VGVzdEJlYW4NCi17DQotICAgIEBSZXF1aXJlZChwYXJhbWV0ZXJzID0gQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHkuV2FybmluZy5jbGFzcykNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL0Jhc2VWYWxUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9CYXNlVmFsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhkMDc2MS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL0Jhc2VWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuYmFzZXZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLkFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuQmFzZVZhbFRlc3RCZWFuOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQmFzZVZhbFRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZQ0KLXsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIEJhc2VWYWxUZXN0QmVhbiBiZWFuID0gbnVsbDsNCi0NCi0gICAgcHVibGljIEJhc2VWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudCA9IG51bGw7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgICAgIGJlYW4gPSBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEJhc2VWYWxUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgICAgICBiZWFuID0gbmV3IEJhc2VWYWxUZXN0QmVhbigpOw0KLSAgICAgICAgVmFsdWVCaW5kaW5nIHZiID0gYXBwbGljYXRpb24uY3JlYXRlVmFsdWVCaW5kaW5nKCIje3Rlc3RCZWFufSIpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKS5wdXQoInRlc3RCZWFuIiwgYmVhbik7DQotDQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsNCi0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsNCi0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudCA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldElkKCJpbnB1dDEiKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudCA9IG51bGw7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgICAgIGJlYW4gPSBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lUmVxdWlyZWRGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWV9Iik7DQotDQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lMUxlbmdodE1heEZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZTF9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIjEyMzQ1Iik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lMUxlbmdodENvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZTF9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lMUxlbmdodE1pbkZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZTF9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIngiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWUxTm9MZW5naHQoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZTF9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXR0ZXJuTmFtZUZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucGF0dGVybk5hbWV9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIlBldGVyMSIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0dGVybk5vTmFtZSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wYXR0ZXJuTmFtZX0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFBhdHRlcm5OYW1lQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wYXR0ZXJuTmFtZX0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiUGV0ZXIiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWVGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLmRvdWJsZVZhbHVlMX0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiLTMwMSIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWVDb3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLmRvdWJsZVZhbHVlMX0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiMjAwIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMjAwZCwgaW5wdXRDb21wb25lbnQuZ2V0VmFsdWUoKSk7DQotDQotICAgICAgICBpbnB1dENvbXBvbmVudC51cGRhdGVNb2RlbChmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMGQsIGJlYW4uZ2V0RG91YmxlVmFsdWUxKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVOb1ZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLmRvdWJsZVZhbHVlMX0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9DdXN0b21TZXZlcml0eTFUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9DdXN0b21TZXZlcml0eTFUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzZhOGNiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLkFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuQ3VzdG9tU2V2ZXJpdHlUZXN0QmVhbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jdXN0b20uQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotcHVibGljIGNsYXNzIEN1c3RvbVNldmVyaXR5MVRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZQ0KLXsNCi0gICAgcHJpdmF0ZSBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgcHJpdmF0ZSBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICBwcml2YXRlIEN1c3RvbVNldmVyaXR5VGVzdEJlYW4gYmVhbiA9IG51bGw7DQotDQotICAgIHB1YmxpYyBDdXN0b21TZXZlcml0eTFUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudCA9IG51bGw7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgICAgIGJlYW4gPSBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEN1c3RvbVNldmVyaXR5MVRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0gICAgICAgIGJlYW4gPSBuZXcgQ3VzdG9tU2V2ZXJpdHlUZXN0QmVhbigpOw0KLSAgICAgICAgVmFsdWVCaW5kaW5nIHZiID0gYXBwbGljYXRpb24uY3JlYXRlVmFsdWVCaW5kaW5nKCIje3Rlc3RCZWFufSIpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKS5wdXQoInRlc3RCZWFuIiwgYmVhbik7DQotDQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsNCi0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsNCi0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudCA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldElkKCJpbnB1dDEiKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudCA9IG51bGw7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgICAgIGJlYW4gPSBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21WYWxpZGF0aW9uUGFyYW1ldGVyVmlhR2xvYmFsUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShWaW9sYXRpb25TZXZlcml0eS5jbGFzcy5nZXROYW1lKCksIEN1c3RvbVZpb2xhdGlvblNldmVyaXR5LmNsYXNzKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZX0iKTsNCi0NCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21WYWxpZGF0aW9uUGFyYW1ldGVyVmlhU3RhdGljQ29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MuZ2V0TmFtZSgpLCBDdXN0b21WaW9sYXRpb25TZXZlcml0eS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlZBTElEQVRJT05fUEFSQU1FVEVSX0NPTkZJRywgY29uZmlnKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZX0iKTsNCi0NCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmtub3duVmFsaWRhdGlvblBhcmFtZXRlcigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lfSIpOw0KLQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL0FkZGl0aW9uYWxWYWxpZGF0b3IuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL0FkZGl0aW9uYWxWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM0MmQyMS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9BZGRpdGlvbmFsVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlBhcmFtZXRlclZhbHVlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBBZGRpdGlvbmFsVmFsaWRhdG9yIGV4dGVuZHMgVGVzdFZhbGlkYXRvclByb3ZpZGVyDQotew0KLSAgICBAUGFyYW1ldGVyVmFsdWUNCi0gICAgcHVibGljIENsYXNzIGdldFByb3ZpZGVyQ2xhc3MoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQWRkaXRpb25hbFZhbGlkYXRvci5jbGFzczsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuICJ2YWxpZGF0aW9uX2ZhaWxlZCI7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9QYXJhbWV0ZXJUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvUGFyYW1ldGVyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxMzE4NS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9QYXJhbWV0ZXJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuYmFzZXZhbC5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShQYXJhbWV0ZXJUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlclN0eWxlT25lKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpOw0KLQ0KLSAgICAgICAgVGVzdFBlcnNvbiBwZXJzb24gPSBuZXcgVGVzdFBlcnNvbigpOw0KLSAgICAgICAgUmVxdWlyZWQgcmVxdWlyZWQgPSBwZXJzb24uZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJmaXJzdE5hbWUiKS5nZXRBbm5vdGF0aW9uKFJlcXVpcmVkLmNsYXNzKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQpLmNvbnRhaW5zS2V5KFZpb2xhdGlvblNldmVyaXR5LmNsYXNzKSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBWaW9sYXRpb25TZXZlcml0eS5jbGFzcykuaXRlcmF0b3IoKS5uZXh0KCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOLCBleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MpLml0ZXJhdG9yKCkubmV4dCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyU3R5bGVUd28oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCk7DQotDQotICAgICAgICBUZXN0UGVyc29uIHBlcnNvbiA9IG5ldyBUZXN0UGVyc29uKCk7DQotICAgICAgICBSZXF1aXJlZCByZXF1aXJlZCA9IHBlcnNvbi5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoImxhc3ROYW1lIikuZ2V0QW5ub3RhdGlvbihSZXF1aXJlZC5jbGFzcyk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkKS5jb250YWluc0tleSgiY2xpZW50X3NpZGVfdmFsaWRhdGlvbl9zdXBwb3J0IikpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgImNsaWVudF9zaWRlX3ZhbGlkYXRpb25fc3VwcG9ydCIpLml0ZXJhdG9yKCkubmV4dCgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsICJjbGllbnRfc2lkZV92YWxpZGF0aW9uX3N1cHBvcnQiKS5pdGVyYXRvcigpLm5leHQoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlclN0eWxlVGhyZWUoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCk7DQotDQotICAgICAgICBUZXN0UGVyc29uIHBlcnNvbiA9IG5ldyBUZXN0UGVyc29uKCk7DQotICAgICAgICBSZXF1aXJlZCByZXF1aXJlZCA9IHBlcnNvbi5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoImxhc3ROYW1lIikuZ2V0QW5ub3RhdGlvbihSZXF1aXJlZC5jbGFzcyk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkKS5jb250YWluc0tleShUZXN0UHJpb3JpdHkuY2xhc3MpKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFRlc3RQcmlvcml0eS5jbGFzcykuaXRlcmF0b3IoKS5uZXh0KCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEpLCBleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgVGVzdFByaW9yaXR5LmNsYXNzLCBJbnRlZ2VyLmNsYXNzKS5pdGVyYXRvcigpLm5leHQoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFRlc3RQcmlvcml0eS5jbGFzcywgU3RyaW5nLmNsYXNzKS5zaXplKCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJkbyBpdCBhc2FwIiwgZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFRlc3RQcmlvcml0eS5jbGFzcywgU3RyaW5nLmNsYXNzLCBUZXN0UHJpb3JpdHkuU2hvcnREZXNjcmlwdGlvbi5jbGFzcykpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJkbyBpdCBpbW1lZGlhdGVseSIsIGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBUZXN0UHJpb3JpdHkuY2xhc3MsIFN0cmluZy5jbGFzcywgVGVzdFByaW9yaXR5LkxvbmdEZXNjcmlwdGlvbi5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJTdHlsZUZvdXIoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCk7DQotDQotICAgICAgICBUZXN0UGVyc29uIHBlcnNvbiA9IG5ldyBUZXN0UGVyc29uKCk7DQotICAgICAgICBSZXF1aXJlZCByZXF1aXJlZCA9IHBlcnNvbi5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoImxhc3ROYW1lIikuZ2V0QW5ub3RhdGlvbihSZXF1aXJlZC5jbGFzcyk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkKS5jb250YWluc0tleShQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcykpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MpLml0ZXJhdG9yKCkubmV4dCgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MpLnNpemUoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcy5nZXROYW1lKCksIGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcywgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MpLml0ZXJhdG9yKCkubmV4dCgpLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyU3R5bGVGaXZlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpOw0KLQ0KLSAgICAgICAgVGVzdFBlcnNvbiBwZXJzb24gPSBuZXcgVGVzdFBlcnNvbigpOw0KLSAgICAgICAgUmVxdWlyZWQgcmVxdWlyZWQgPSBwZXJzb24uZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJsYXN0TmFtZSIpLmdldEFubm90YXRpb24oUmVxdWlyZWQuY2xhc3MpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCkuY29udGFpbnNLZXkoRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzKSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpLml0ZXJhdG9yKCkubmV4dCgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzKS5zaXplKCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MsIENsYXNzLmNsYXNzKS5zaXplKCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCksIGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MsIENsYXNzLmNsYXNzKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIFRPRE8gdGhlc2UgdGVzdHMgd29yayBpbiBhbiBpZGUgYnV0IG5vdCB2aWEgY29tbWFuZGxpbmUgLSBpdCdzIGEgU3VyZWZpcmUgaXNzdWUNCi0gICAgICovDQotICAgIC8qDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJTdHlsZVNpeCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKTsNCi0NCi0gICAgICAgIFRlc3RQZXJzb24gcGVyc29uID0gbmV3IFRlc3RQZXJzb24oKTsNCi0gICAgICAgIFJlcXVpcmVkIHJlcXVpcmVkID0gcGVyc29uLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgibGFzdE5hbWUiKS5nZXRBbm5vdGF0aW9uKFJlcXVpcmVkLmNsYXNzKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQpLmNvbnRhaW5zS2V5KFRlc3RWYWxpZGF0b3JQcm92aWRlci5jbGFzcykpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgVGVzdFZhbGlkYXRvclByb3ZpZGVyLmNsYXNzKS5pdGVyYXRvcigpLm5leHQoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFRlc3RWYWxpZGF0b3JQcm92aWRlci5jbGFzcywgQ2xhc3MuY2xhc3MpLnNpemUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlclN0eWxlU2V2ZW4oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCk7DQotDQotICAgICAgICBUZXN0UGVyc29uIHBlcnNvbiA9IG5ldyBUZXN0UGVyc29uKCk7DQotICAgICAgICBSZXF1aXJlZCByZXF1aXJlZCA9IHBlcnNvbi5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoImxhc3ROYW1lIikuZ2V0QW5ub3RhdGlvbihSZXF1aXJlZC5jbGFzcyk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkKS5jb250YWluc0tleShUZXN0VmFsaWRhdG9yUHJvdmlkZXIuY2xhc3MpKTsNCi0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudENsYXNzIDogZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFRlc3RWYWxpZGF0b3JQcm92aWRlci5jbGFzcywgQ2xhc3MuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFzc2VydFRydWUoVGVzdFZhbGlkYXRvclByb3ZpZGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY3VycmVudENsYXNzKSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgKi8NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdEFsbG93Q2xpZW50U2lkZVZhbGlkYXRpb24uamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RBbGxvd0NsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiM2I5NzMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdEFsbG93Q2xpZW50U2lkZVZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuYmFzZXZhbC5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlBhcmFtZXRlclZhbHVlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5QYXJhbWV0ZXJLZXk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotDQotcHVibGljIGludGVyZmFjZSBUZXN0QWxsb3dDbGllbnRTaWRlVmFsaWRhdGlvbiBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi17DQotICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgcHVibGljIFN0cmluZyBLRVkgPSAiY2xpZW50X3NpZGVfdmFsaWRhdGlvbl9zdXBwb3J0IjsNCi0NCi0gICAgQFBhcmFtZXRlclZhbHVlDQotICAgIGJvb2xlYW4gdmFsdWUgPSB0cnVlOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0RGVueUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0RGVueUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyOTNkY2QuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdERlbnlDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5iYXNldmFsLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuUGFyYW1ldGVyVmFsdWU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlBhcmFtZXRlcktleTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIFRlc3REZW55Q2xpZW50U2lkZVZhbGlkYXRpb24gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotew0KLSAgICBAUGFyYW1ldGVyS2V5DQotICAgIHB1YmxpYyBTdHJpbmcga2V5ID0gImNsaWVudF9zaWRlX3ZhbGlkYXRpb25fc3VwcG9ydCI7DQotDQotICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICBib29sZWFuIHZhbHVlID0gZmFsc2U7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQZXJzb24uamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQZXJzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4MzQ5NC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5iYXNldmFsLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdFBlcnNvbg0KLXsNCi0gICAgQFJlcXVpcmVkKHBhcmFtZXRlcnMgPSB7VmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcywgVGVzdEFsbG93Q2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3N9KQ0KLSAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7DQotDQotICAgIEBSZXF1aXJlZChwYXJhbWV0ZXJzID0gew0KLSAgICAgICAgICAgIFZpb2xhdGlvblNldmVyaXR5LkluZm8uY2xhc3MsDQotICAgICAgICAgICAgVGVzdERlbnlDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcywNCi0gICAgICAgICAgICBUZXN0UHJpb3JpdHlIaWdoLmNsYXNzLA0KLSAgICAgICAgICAgIFRlc3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsDQotICAgICAgICAgICAgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLA0KLSAgICAgICAgICAgIC8vTG9naW5WYWxpZGF0b3IuY2xhc3MsDQotICAgICAgICAgICAgQWRkaXRpb25hbFZhbGlkYXRvci5jbGFzc30pDQotICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOw0KLQ0KLSAgICBwcml2YXRlIGludCBmYWlsZWRMb2dpbnMgPSAwOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlckxvY2tlZDsNCi0NCi0gICAgLyoNCi0gICAgICogVE9ETyB0aGVzZSB0ZXN0cyB3b3JrIGluIGFuIGlkZSBidXQgbm90IHZpYSBjb21tYW5kbGluZSAtIGl0J3MgYSBTdXJlZmlyZSBpc3N1ZQ0KLSAgICAgKi8NCi0gICAgLyoNCi0gICAgcHVibGljIGNsYXNzIExvZ2luVmFsaWRhdG9yIGV4dGVuZHMgVGVzdFZhbGlkYXRvclByb3ZpZGVyDQotICAgIHsNCi0gICAgICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgcHVibGljIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lQcm92aWRlciBnZXRWYWx1ZSgpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQotICAgICAgICB9DQotDQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHB1YmxpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25TdHJhdGVneSgpIHsNCi0NCi0gICAgICAgICAgICAgICAgaW50IGZhaWxlZExvZ2luczsNCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoKHRoaXMuZmFpbGVkTG9naW5zID0gaXNMb2dpblN1Y2Nlc3NmdWwoKSkgPiAwKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuZmFpbGVkTG9naW5zID4gMykNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2soKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgICovDQotDQotICAgIHByaXZhdGUgaW50IGlzTG9naW5TdWNjZXNzZnVsKCkNCi0gICAgew0KLSAgICAgICAgLy9mb3JjZSBhbiBleGNlcHRpb24NCi0gICAgICAgIHJldHVybiArK3RoaXMuZmFpbGVkTG9naW5zOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzTG9ja2VkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHVzZXJMb2NrZWQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGxvY2soKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnVzZXJMb2NrZWQgPSB0cnVlOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxhc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQcmlvcml0eS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxOWU4YzQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5QYXJhbWV0ZXJWYWx1ZTsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIFRlc3RQcmlvcml0eSBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi17DQotICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICBJbnRlZ2VyIGdldFZhbHVlKCk7DQotDQotICAgIEBQYXJhbWV0ZXJWYWx1ZShpZCA9IFNob3J0RGVzY3JpcHRpb24uY2xhc3MpDQotICAgIFN0cmluZyBnZXRTaG9ydERlc2NyaXB0aW9uKCk7DQotDQotICAgIEBQYXJhbWV0ZXJWYWx1ZShpZCA9IExvbmdEZXNjcmlwdGlvbi5jbGFzcykNCi0gICAgU3RyaW5nIGdldExvbmdEZXNjcmlwdGlvbigpOw0KLQ0KLSAgICBpbnRlcmZhY2UgU2hvcnREZXNjcmlwdGlvbnt9DQotICAgIGludGVyZmFjZSBMb25nRGVzY3JpcHRpb257fQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UHJpb3JpdHlIaWdoLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UHJpb3JpdHlIaWdoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZmEyZGEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5SGlnaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5iYXNldmFsLnBhcmFtZXRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdFByaW9yaXR5SGlnaCBpbXBsZW1lbnRzIFRlc3RQcmlvcml0eQ0KLXsNCi0gICAgcHVibGljIEludGVnZXIgZ2V0VmFsdWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNob3J0RGVzY3JpcHRpb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gImRvIGl0IGFzYXAiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9uZ0Rlc2NyaXB0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICJkbyBpdCBpbW1lZGlhdGVseSI7DQotICAgIH0NCi0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5TG93LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UHJpb3JpdHlMb3cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyZjVlZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UHJpb3JpdHlMb3cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuYmFzZXZhbC5wYXJhbWV0ZXI7DQotDQotcHVibGljIGNsYXNzIFRlc3RQcmlvcml0eUxvdyBpbXBsZW1lbnRzIFRlc3RQcmlvcml0eQ0KLXsNCi0gICAgcHVibGljIEludGVnZXIgZ2V0VmFsdWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gMzsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNob3J0RGVzY3JpcHRpb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIm5vdCB0aGF0IGltcG9ydGFudCI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMb25nRGVzY3JpcHRpb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gInRoZSB0b3BpYyBpcyBub3QgdGhhdCBpbXBvcnRhbnQiOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcxMjI4My4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuUGFyYW1ldGVyVmFsdWU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1ASW52b2NhdGlvbk9yZGVyKDIxMCkNCi1wdWJsaWMgY2xhc3MgVGVzdFZhbGlkYXRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi0NCi0gICAgQFBhcmFtZXRlclZhbHVlDQotICAgIHB1YmxpYyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBnZXRJbnN0YW5jZSgpDQotICAgIHsNCi0gICAgICAgIGlmKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgPSBuZXcgVGVzdFZhbGlkYXRpb25JbnRlcmNlcHRvcigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJpdCdzIGEgdGVzdCBjbGFzcyIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIml0J3MgYSB0ZXN0IGNsYXNzIik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFZhbGlkYXRpb25TdHJhdGVneVByb3ZpZGVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdGlvblN0cmF0ZWd5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3OWUyZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdGlvblN0cmF0ZWd5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuYmFzZXZhbC5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgVGVzdFZhbGlkYXRpb25TdHJhdGVneVByb3ZpZGVyDQotew0KLSAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0b3JQcm92aWRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFZhbGlkYXRvclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNjU4ZTkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFZhbGlkYXRvclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuUGFyYW1ldGVyS2V5Ow0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0VmFsaWRhdG9yUHJvdmlkZXIgaW1wbGVtZW50cyBWYWxpZGF0aW9uUGFyYW1ldGVyLCBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5UHJvdmlkZXINCi17DQotICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgcHVibGljIENsYXNzIGdldEtleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBUZXN0VmFsaWRhdG9yUHJvdmlkZXIuY2xhc3M7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIGl0IGlzbid0IGFsbG93ZWQgdG8gaGF2ZSBhbiBhYnN0cmFjdCBjbGFzcyBpbiB0aGlzIGNhc2UgLSBzbyB0aGlzIGltcGwuIGlzIHJlcXVpcmVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInlvdSBoYXZlIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kIik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0QmVhbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWYyNzM4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlDQotICovDQotcHVibGljIGNsYXNzIENyb3NzVmFsVGVzdEJlYW4NCi17DQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0NCi0gICAgQEVxdWFscygicHJvcGVydHkxIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkyOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTE7DQotICAgIH0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKFN0cmluZyBwcm9wZXJ0eTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOw0KLSAgICB9DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsNCi0gICAgfQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTA0N2VmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLkFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U7DQotDQotLyoqDQotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbFRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZQ0KLXsNCi0NCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotDQotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHB1YmxpYyBDcm9zc1ZhbFRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ3Jvc3NWYWxUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgQ3Jvc3NWYWxUZXN0QmVhbiBiZWFuID0gbmV3IENyb3NzVmFsVGVzdEJlYW4oKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhudWxsLCAidmFsdWUiLCAiI3t0ZXN0QmVhbn0iKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucHV0KCJ0ZXN0QmVhbiIsYmVhbik7DQotDQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsNCi0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsNCi0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldElkKCJpbnB1dDEiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0SWQoImlucHV0MiIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc0ZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDQiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgyKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VMQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmJjZDExLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VMQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWwubW9jay5Nb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLnV0aWwuTWV0aG9kVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIEVMQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlIGV4dGVuZHMgRUxDcm9zc1ZhbFRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgRUxDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEVMQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotDQotICAgICAgICBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbigpOw0KLQ0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoRXF1YWxzLmNsYXNzLmdldE5hbWUoKSwgTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHLCBjb25maWcpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCByZXRlc3QgdGhpcyB0ZXN0LWNhc2UNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgcmV0ZXN0IHRoaXMgdGVzdC1jYXNlDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKTsNCi0gICAgICAgIGFzc2VydEZhbHNlKE1ldGhvZFV0aWxzLmlzTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShNZXRob2RVdGlscy5pc01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiKSk7DQotICAgICAgICAvLzF4IGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5IGFuZCAxeCBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsDQotICAgICAgICBhc3NlcnRUcnVlKE1ldGhvZFV0aWxzLmNoZWNrTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIsIDIpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FTENyb3NzVmFsVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDhlOTMzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5EYXRlVGltZUNvbnZlcnRlcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIEVMQ3Jvc3NWYWxUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UNCi17DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLQ0KLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgRUxDcm9zc1ZhbFRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRUxDcm9zc1ZhbFRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgICAgICBjcmVhdGVSZXF1ZXN0U2NvcGVkQmVhbigiYmVhbjEiLCBnZXRFbnRpdHlJbnN0YW5jZSgpKTsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJiZWFuMiIsIGdldEVudGl0eUluc3RhbmNlKCkpOw0KLQ0KLQ0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7DQotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7DQotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7DQotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOw0KLQ0KLSAgICAgICAgLy9pbnB1dDENCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0SWQoImlucHV0MSIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldENvbnZlcnRlcihuZXcgRGF0ZVRpbWVDb252ZXJ0ZXIoKSk7DQotICAgICAgICAoKERhdGVUaW1lQ29udmVydGVyKWlucHV0Q29tcG9uZW50MS5nZXRDb252ZXJ0ZXIoKSkuc2V0UGF0dGVybigiZGQuTU0ueXl5eSIpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDEpOw0KLQ0KLSAgICAgICAgLy9pbnB1dDINCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0SWQoImlucHV0MiIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldENvbnZlcnRlcihuZXcgRGF0ZVRpbWVDb252ZXJ0ZXIoKSk7DQotICAgICAgICAoKERhdGVUaW1lQ29udmVydGVyKWlucHV0Q29tcG9uZW50Mi5nZXRDb252ZXJ0ZXIoKSkuc2V0UGF0dGVybigiZGQuTU0ueXl5eSIpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTENyb3NzQ29tcG9uZW50VmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZUVMQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTIuMTIuMjAwOCIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRUxDcm9zc0NvbXBvbmVudFZhbGlkYXRpb25Vc2VDYXNlKFN0cmluZyB2YWx1ZUJlYW4xUHJvcGVydHkxLCBTdHJpbmcgdmFsdWVCZWFuMVByb3BlcnR5MiwgU3RyaW5nIHZhbHVlQmVhbjJQcm9wZXJ0eTEsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3tiZWFuMS5kYXRlMX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje2JlYW4yLmRhdGUyfSIpOw0KLQ0KLSAgICAgICAgLy9zZXQgbW9kZWwgdmFsdWVzDQotICAgICAgICByZXNvbHZlQmVhbigiYmVhbjEiLCBnZXRFbnRpdHlJbnN0YW5jZSgpLmdldENsYXNzKCkpLnNldERhdGUyKChEYXRlKWlucHV0Q29tcG9uZW50MS5nZXRDb252ZXJ0ZXIoKS5nZXRBc09iamVjdChmYWNlc0NvbnRleHQsIGlucHV0Q29tcG9uZW50MSwgdmFsdWVCZWFuMVByb3BlcnR5MikpOw0KLSAgICAgICAgcmVzb2x2ZUJlYW4oImJlYW4yIiwgZ2V0RW50aXR5SW5zdGFuY2UoKS5nZXRDbGFzcygpKS5zZXREYXRlMSgoRGF0ZSlpbnB1dENvbXBvbmVudDIuZ2V0Q29udmVydGVyKCkuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dENvbXBvbmVudDIsIHZhbHVlQmVhbjJQcm9wZXJ0eTEpKTsNCi0NCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVCZWFuMVByb3BlcnR5MSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVCZWFuMlByb3BlcnR5Mik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZUVMTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxMi4xMi4yMDA4Iik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKFN0cmluZyB2YWx1ZUJlYW4xUHJvcGVydHkxLCBTdHJpbmcgdmFsdWVCZWFuMVByb3BlcnR5MiwgU3RyaW5nIHZhbHVlQmVhbjJQcm9wZXJ0eTEsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3tiZWFuMS5kYXRlMX0iKTsNCi0NCi0gICAgICAgIC8vc2V0IG1vZGVsIHZhbHVlcw0KLSAgICAgICAgcmVzb2x2ZUJlYW4oImJlYW4xIiwgZ2V0RW50aXR5SW5zdGFuY2UoKS5nZXRDbGFzcygpKS5zZXREYXRlMigoRGF0ZSlpbnB1dENvbXBvbmVudDEuZ2V0Q29udmVydGVyKCkuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dENvbXBvbmVudDEsIHZhbHVlQmVhbjFQcm9wZXJ0eTIpKTsNCi0gICAgICAgIHJlc29sdmVCZWFuKCJiZWFuMiIsIGdldEVudGl0eUluc3RhbmNlKCkuZ2V0Q2xhc3MoKSkuc2V0RGF0ZTEoKERhdGUpaW5wdXRDb21wb25lbnQyLmdldENvbnZlcnRlcigpLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgaW5wdXRDb21wb25lbnQyLCB2YWx1ZUJlYW4yUHJvcGVydHkxKSk7DQotICAgICAgICByZXNvbHZlQmVhbigiYmVhbjIiLCBnZXRFbnRpdHlJbnN0YW5jZSgpLmdldENsYXNzKCkpLnNldERhdGUyKChEYXRlKWlucHV0Q29tcG9uZW50Mi5nZXRDb252ZXJ0ZXIoKS5nZXRBc09iamVjdChmYWNlc0NvbnRleHQsIGlucHV0Q29tcG9uZW50MiwgdmFsdWVCZWFuMlByb3BlcnR5MikpOw0KLQ0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSh2YWx1ZUJlYW4xUHJvcGVydHkxKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEVMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4gZ2V0RW50aXR5SW5zdGFuY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEVMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4oKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FTENyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FTENyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NzNkMTIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRUxDcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRUxDcm9zc1ZhbFRlc3REYXRlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZSBERUZBVUxUX0RBVEUgPSBuZXcgRGF0ZSgpOw0KLQ0KLSAgICBARXF1YWxzKCIje2JlYW4yLmRhdGUyfSIpDQotICAgIHByaXZhdGUgRGF0ZSBkYXRlMSA9IERFRkFVTFRfREFURTsNCi0NCi0gICAgcHJpdmF0ZSBEYXRlIGRhdGUyID0gREVGQVVMVF9EQVRFOw0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlMSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkYXRlMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlMShEYXRlIGRhdGUxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRhdGUxID0gZGF0ZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGF0ZTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZTIoRGF0ZSBkYXRlMikNCi0gICAgew0KLSAgICAgICAgdGhpcy5kYXRlMiA9IGRhdGUyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFjYTRlZi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWwubW9jay5Nb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLnV0aWwuTWV0aG9kVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIExvY2FsUHJvcGVydHlDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UgZXh0ZW5kcyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTG9jYWxQcm9wZXJ0eUNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLQ0KLSAgICAgICAgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24oKTsNCi0NCi0gICAgICAgIGNvbmZpZy5hZGRNYXBwaW5nKEVxdWFscy5jbGFzcy5nZXROYW1lKCksIE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRywgY29uZmlnKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHJldGVzdCB0aGlzIHRlc3QtY2FzZQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCByZXRlc3QgdGhpcyB0ZXN0LWNhc2UNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKTsNCi0gICAgICAgIGFzc2VydEZhbHNlKE1ldGhvZFV0aWxzLmlzTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKTsNCi0gICAgICAgIGFzc2VydFRydWUoTWV0aG9kVXRpbHMuaXNNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIikpOw0KLSAgICAgICAgLy8xeCBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeSBhbmQgMXggZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShNZXRob2RVdGlscy5jaGVja01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiLCAyKSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YzdmOWIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZSBleHRlbmRzIEVMQ3Jvc3NWYWxUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBFTENyb3NzVmFsVGVzdERhdGVCZWFuIGdldEVudGl0eUluc3RhbmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4oKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTdlMjE3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdERhdGVCZWFuIGV4dGVuZHMgRUxDcm9zc1ZhbFRlc3REYXRlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZSBERUZBVUxUX0RBVEUgPSBuZXcgRGF0ZSgpOw0KLQ0KLSAgICBARXF1YWxzKCJkYXRlMiIpDQotICAgIHByaXZhdGUgRGF0ZSBkYXRlMSA9IERFRkFVTFRfREFURTsNCi0NCi0gICAgcHJpdmF0ZSBEYXRlIGRhdGUyID0gREVGQVVMVF9EQVRFOw0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlMSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkYXRlMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlMShEYXRlIGRhdGUxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRhdGUxID0gZGF0ZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGF0ZTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZTIoRGF0ZSBkYXRlMikNCi0gICAgew0KLSAgICAgICAgdGhpcy5kYXRlMiA9IGRhdGUyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M4YjBhNC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWwubW9jay5Nb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLnV0aWwuTWV0aG9kVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UgZXh0ZW5kcyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUHJvcGVydHlDaGFpbkNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0NCi0gICAgICAgIFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uKCk7DQotDQotICAgICAgICBjb25maWcuYWRkTWFwcGluZyhFcXVhbHMuY2xhc3MuZ2V0TmFtZSgpLCBNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsIGNvbmZpZyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHJldGVzdCB0aGlzIHRlc3QtY2FzZQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCByZXRlc3QgdGhpcyB0ZXN0LWNhc2UNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpOw0KLSAgICAgICAgYXNzZXJ0RmFsc2UoTWV0aG9kVXRpbHMuaXNNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIikpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCk7DQotICAgICAgICBhc3NlcnRUcnVlKE1ldGhvZFV0aWxzLmlzTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIpKTsNCi0gICAgICAgIC8vMXggZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkgYW5kIDF4IGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwNCi0gICAgICAgIGFzc2VydFRydWUoTWV0aG9kVXRpbHMuY2hlY2tNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIiwgMikpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzU4YzBlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkRhdGVUaW1lQ29udmVydGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlDQotew0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0NCi0gICAgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJiZWFuMSIsIGdldEVudGl0eUluc3RhbmNlKCkpOw0KLQ0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7DQotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7DQotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7DQotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOw0KLQ0KLSAgICAgICAgLy9pbnB1dDENCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0SWQoImlucHV0MSIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldENvbnZlcnRlcihuZXcgRGF0ZVRpbWVDb252ZXJ0ZXIoKSk7DQotICAgICAgICAoKERhdGVUaW1lQ29udmVydGVyKWlucHV0Q29tcG9uZW50MS5nZXRDb252ZXJ0ZXIoKSkuc2V0UGF0dGVybigiZGQuTU0ueXl5eSIpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDEpOw0KLQ0KLSAgICAgICAgLy9pbnB1dDINCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0SWQoImlucHV0MiIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldENvbnZlcnRlcihuZXcgRGF0ZVRpbWVDb252ZXJ0ZXIoKSk7DQotICAgICAgICAoKERhdGVUaW1lQ29udmVydGVyKWlucHV0Q29tcG9uZW50Mi5nZXRDb252ZXJ0ZXIoKSkuc2V0UGF0dGVybigiZGQuTU0ueXl5eSIpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVQcm9wZXJ0eUNoYWluQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVQcm9wZXJ0eUNoYWluQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxMi4xMi4yMDA4Iik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgyKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVQcm9wZXJ0eUNoYWluQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uVXNlQ2FzZShTdHJpbmcgdmFsdWVCZWFuMVByb3BlcnR5MSwgU3RyaW5nIHZhbHVlQmVhbjJQcm9wZXJ0eTIpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje2JlYW4xLmRhdGUxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7YmVhbjEuc3ViQmVhbi5kYXRlMn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVCZWFuMVByb3BlcnR5MSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVCZWFuMlByb3BlcnR5Mik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZUVMTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZUVMTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTIuMTIuMjAwOCIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRUxNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uVXNlQ2FzZShTdHJpbmcgdmFsdWVCZWFuMVByb3BlcnR5MSwgU3RyaW5nIHZhbHVlQmVhbjJQcm9wZXJ0eTEpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje2JlYW4xLmRhdGUxfSIpOw0KLQ0KLSAgICAgICAgLy9zZXQgbW9kZWwgdmFsdWVzDQotICAgICAgICByZXNvbHZlQmVhbigiYmVhbjEiLCBnZXRFbnRpdHlJbnN0YW5jZSgpLmdldENsYXNzKCkpLmdldFN1YkJlYW4oKS5zZXREYXRlMigoRGF0ZSlpbnB1dENvbXBvbmVudDIuZ2V0Q29udmVydGVyKCkuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dENvbXBvbmVudDIsIHZhbHVlQmVhbjJQcm9wZXJ0eTEpKTsNCi0NCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVCZWFuMVByb3BlcnR5MSk7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4gZ2V0RW50aXR5SW5zdGFuY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbigpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NTVjMTIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4NCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERhdGUgREVGQVVMVF9EQVRFID0gbmV3IERhdGUoKTsNCi0NCi0gICAgQEVxdWFscygic3ViQmVhbi5kYXRlMiIpDQotICAgIHByaXZhdGUgRGF0ZSBkYXRlMSA9IERFRkFVTFRfREFURTsNCi0NCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4gc3ViQmVhbiA9IG5ldyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4oKTsNCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGF0ZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZTEoRGF0ZSBkYXRlMSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5kYXRlMSA9IGRhdGUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4gZ2V0U3ViQmVhbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzdWJCZWFuOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFN1YkJlYW4oUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuIHN1YkJlYW4pDQotICAgIHsNCi0gICAgICAgIHRoaXMuc3ViQmVhbiA9IHN1YkJlYW47DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJjMmEyZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4NCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERhdGUgREVGQVVMVF9EQVRFID0gbmV3IERhdGUoKTsNCi0NCi0gICAgcHJpdmF0ZSBEYXRlIGRhdGUyID0gREVGQVVMVF9EQVRFOw0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlMigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkYXRlMjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlMihEYXRlIGRhdGUyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRhdGUyID0gZGF0ZTI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjFUZXN0QmVhbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjFUZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWU1OGU4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYxVGVzdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkSWY7DQotDQotcHVibGljIGNsYXNzIFJlcXVpcmVkSWYxVGVzdEJlYW4NCi17DQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0NCi0gICAgQFJlcXVpcmVkSWYodmFsdWVPZiA9ICJwcm9wZXJ0eTEiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMVRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NGI2ZWEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjFUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLkFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZElmMVRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZQ0KLXsNCi0NCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotDQotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHB1YmxpYyBSZXF1aXJlZElmMVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVxdWlyZWRJZjFUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgUmVxdWlyZWRJZjFUZXN0QmVhbiBiZWFuID0gbmV3IFJlcXVpcmVkSWYxVGVzdEJlYW4oKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhudWxsLCAidmFsdWUiLCAiI3t0ZXN0QmVhbn0iKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucHV0KCJ0ZXN0QmVhbiIsIGJlYW4pOw0KLQ0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7DQotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7DQotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7DQotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRJZCgiaW5wdXQxIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZUYXJnZXROb3RFbXB0eUZhaWxlZCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZlRhcmdldE5vdEVtcHR5Q29ycmVjdDEoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmVGFyZ2V0Tm90RW1wdHlDb3JyZWN0MigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZUYXJnZXROb3RFbXB0eUNvcnJlY3QzKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMlRlc3RCZWFuLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMlRlc3RCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZTJmOWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjJUZXN0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkSWZUeXBlLio7DQotDQotcHVibGljIGNsYXNzIFJlcXVpcmVkSWYyVGVzdEJlYW4NCi17DQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0gICAgQFJlcXVpcmVkSWYodmFsdWVPZiA9ICJwcm9wZXJ0eTEiLCBpcyA9IGVtcHR5KQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMlRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMlRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZGIyMWIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLkFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZElmMlRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZQ0KLXsNCi0NCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotDQotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHB1YmxpYyBSZXF1aXJlZElmMlRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVxdWlyZWRJZjJUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgUmVxdWlyZWRJZjJUZXN0QmVhbiBiZWFuID0gbmV3IFJlcXVpcmVkSWYyVGVzdEJlYW4oKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhudWxsLCAidmFsdWUiLCAiI3t0ZXN0QmVhbn0iKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucHV0KCJ0ZXN0QmVhbiIsIGJlYW4pOw0KLQ0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7DQotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7DQotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7DQotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRJZCgiaW5wdXQxIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZUYXJnZXRFbXB0eUZhaWxlZCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZlRhcmdldEVtcHR5Q29ycmVjdDEoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmVGFyZ2V0RW1wdHlDb3JyZWN0MigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZUYXJnZXRFbXB0eUNvcnJlY3QzKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmM1Rlc3RCZWFuLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmM1Rlc3RCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MzQ0ZGYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjNUZXN0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZjsNCi0NCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRJZjNUZXN0QmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBCb29sZWFuIHByb3BlcnR5MTsNCi0gICAgQFJlcXVpcmVkSWYodmFsdWVPZiA9ICJwcm9wZXJ0eTEiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7DQotDQotICAgIHB1YmxpYyBCb29sZWFuIGdldFByb3BlcnR5MSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKEJvb2xlYW4gcHJvcGVydHkxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MSA9IHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkyKFN0cmluZyBwcm9wZXJ0eTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkyID0gcHJvcGVydHkyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYzVGVzdENhc2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYzVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkODAzZS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmM1Rlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotcHVibGljIGNsYXNzIFJlcXVpcmVkSWYzVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlDQotew0KLQ0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0NCi0gICAgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgcHVibGljIFJlcXVpcmVkSWYzVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZXF1aXJlZElmM1Rlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgICAgICBSZXF1aXJlZElmM1Rlc3RCZWFuIGJlYW4gPSBuZXcgUmVxdWlyZWRJZjNUZXN0QmVhbigpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKG51bGwsICJ2YWx1ZSIsICIje3Rlc3RCZWFufSIpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKS5wdXQoInRlc3RCZWFuIiwgYmVhbik7DQotDQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsNCi0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsNCi0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldElkKCJpbnB1dDEiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0SWQoImlucHV0MiIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZkJvb2xlYW5UYXJnZXROb3RFbXB0eUZhaWxlZCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZShCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZkJvb2xlYW5UYXJnZXROb3RFbXB0eUNvcnJlY3QxKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZkJvb2xlYW5UYXJnZXROb3RFbXB0eUNvcnJlY3QyKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKEJvb2xlYW4uRkFMU0UudG9TdHJpbmcoKSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZCb29sZWFuVGFyZ2V0Tm90RW1wdHlDb3JyZWN0MygpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZShCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWY0VGVzdEJlYW4uamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWY0VGVzdEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzYjY5ZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmNFRlc3RCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZlR5cGUuKjsNCi0NCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRJZjRUZXN0QmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHByb3BlcnR5MTsNCi0gICAgQFJlcXVpcmVkSWYodmFsdWVPZiA9ICJwcm9wZXJ0eTEiLCBpcyA9IGVtcHR5KQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzUHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoYm9vbGVhbiBwcm9wZXJ0eTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjRUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjRUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWZhYWNkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWY0VGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5BYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlDQotICovDQotcHVibGljIGNsYXNzIFJlcXVpcmVkSWY0VGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlDQotew0KLQ0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0NCi0gICAgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgcHVibGljIFJlcXVpcmVkSWY0VGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZXF1aXJlZElmNFRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgICAgICBSZXF1aXJlZElmNFRlc3RCZWFuIGJlYW4gPSBuZXcgUmVxdWlyZWRJZjRUZXN0QmVhbigpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKG51bGwsICJ2YWx1ZSIsICIje3Rlc3RCZWFufSIpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKS5wdXQoInRlc3RCZWFuIiwgYmVhbik7DQotDQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsNCi0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsNCi0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldElkKCJpbnB1dDEiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0SWQoImlucHV0MiIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZkJvb2xlYW5UYXJnZXRFbXB0eUZhaWxlZCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZShCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZCb29sZWFuVGFyZ2V0RW1wdHlDb3JyZWN0MSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZShCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmQm9vbGVhblRhcmdldEVtcHR5Q29ycmVjdDIoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmQm9vbGVhblRhcmdldEVtcHR5Q29ycmVjdDMoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL21vY2svTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvbW9jay9Nb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNWQ0ODIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvbW9jay9Nb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsLm1vY2s7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneS5FcXVhbHNTdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS51dGlsLk1ldGhvZFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgRXF1YWxzU3RyYXRlZ3kNCi17DQotICAgIHB1YmxpYyBNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgTWV0aG9kVXRpbHMuc2lnbmFsQ2xhc3NVc2VkKGdldENsYXNzKCkpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgTWV0aG9kVXRpbHMuc2lnbmFsTWV0aG9kQ2FsbGVkKGdldENsYXNzKCksICJyZXZlcnNlTWVzc2FnZSIpOw0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24pOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBNZXRob2RVdGlscy5zaWduYWxNZXRob2RDYWxsZWQoZ2V0Q2xhc3MoKSwgInJldmVyc2VNZXNzYWdlIik7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jdXN0b20vQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHkuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2N1c3RvbS9DdXN0b21WaW9sYXRpb25TZXZlcml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWQwNDdlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2N1c3RvbS9DdXN0b21WaW9sYXRpb25TZXZlcml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jdXN0b207DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlBhcmFtZXRlcktleTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuUGFyYW1ldGVyVmFsdWU7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIEN1c3RvbVZpb2xhdGlvblNldmVyaXR5DQotew0KLSAgICBpbnRlcmZhY2UgV2FybmluZyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi0gICAgew0KLSAgICAgICAgQFBhcmFtZXRlcktleQ0KLSAgICAgICAgcHVibGljIENsYXNzIEtFWSA9IEN1c3RvbVZpb2xhdGlvblNldmVyaXR5LmNsYXNzOw0KLQ0KLSAgICAgICAgQFBhcmFtZXRlclZhbHVlDQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgU0VWRVJJVFkgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfV0FSTjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25Nb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25Nb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNTgwYWYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uTW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuVmFsaWRhdGlvbk1vZHVsZUF3YXJlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvbk1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlZ2lzdHJhdGlvbk1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvbk1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmVzZXRFeHRWYWxDb250ZXh0KCk7DQotDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RHbG9iYWxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEwMDAoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgVGVzdE1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IzKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RHbG9iYWxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEoKSk7DQotDQotICAgICAgICBjaGVja0dsb2JhbE9ubHlQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsNCi0gICAgICAgIGNoZWNrTW9kdWxlQXdhcmVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNXaXRoVGVzdE1vZHVsZSgpOw0KLSAgICAgICAgY2hlY2tNb2R1bGVBd2FyZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc1dpdGhQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tHbG9iYWxPbmx5UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7DQotDQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gMzsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0TGVuZ3RoLCByZXN1bHQuc2l6ZSgpKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RHbG9iYWxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0R2xvYmFsTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxMDAwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjaGVja01vZHVsZUF3YXJlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzV2l0aFRlc3RNb2R1bGUoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnNGb3IoVGVzdE1vZHVsZS5jbGFzcyk7DQotDQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gNTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5zaXplKCkgPT0gcmVzdWx0TGVuZ3RoKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdEdsb2JhbE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RNb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0TW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IzKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdEdsb2JhbE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMCk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrTW9kdWxlQXdhcmVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNXaXRoUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlKCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzRm9yKFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcyk7DQotDQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gNDsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5zaXplKCkgPT0gcmVzdWx0TGVuZ3RoKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RHbG9iYWxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEdsb2JhbE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMSkNCi0gICAgY2xhc3MgVGVzdEdsb2JhbE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMSBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigyKQ0KLSAgICBjbGFzcyBUZXN0TW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IyIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IsIFZhbGlkYXRpb25Nb2R1bGVBd2FyZQ0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldE1vZHVsZUtleXMoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCksIFRlc3RNb2R1bGUuY2xhc3MuZ2V0TmFtZSgpfTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDMpDQotICAgIGNsYXNzIFRlc3RNb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjMgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciwgVmFsaWRhdGlvbk1vZHVsZUF3YXJlDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TW9kdWxlS2V5cygpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7VGVzdE1vZHVsZS5jbGFzcy5nZXROYW1lKCl9Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RNb2R1bGUNCi0gICAgew0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTAwMCkNCi0gICAgY2xhc3MgVGVzdEdsb2JhbE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMCBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uTW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uTW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjQ1ODQ1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvbk1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlZhbGlkYXRpb25Nb2R1bGVBd2FyZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25Nb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvclRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZQ0KLXsNCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBSZWdpc3RyYXRpb25Nb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvclRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWdpc3RyYXRpb25Nb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbml0aWFsaXphdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJlc2V0RXh0VmFsQ29udGV4dCgpOw0KLQ0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxMDAwKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjIoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgVGVzdE1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMygpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxKCkpOw0KLQ0KLSAgICAgICAgY2hlY2tHbG9iYWxPbmx5UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7DQotICAgICAgICBjaGVja01vZHVsZUF3YXJlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzV2l0aFRlc3RNb2R1bGUoKTsNCi0gICAgICAgIGNoZWNrTW9kdWxlQXdhcmVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNXaXRoUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrR2xvYmFsT25seVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpDQotICAgIHsNCi0gICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOw0KLQ0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDM7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3VsdExlbmd0aCwgcmVzdWx0LnNpemUoKSk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMTAwMC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tNb2R1bGVBd2FyZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc1dpdGhUZXN0TW9kdWxlKCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzRm9yKFRlc3RNb2R1bGUuY2xhc3MpOw0KLQ0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDU7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuc2l6ZSgpID09IHJlc3VsdExlbmd0aCk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjEpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0TW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IyKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdE1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMyk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjEwMDApOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjaGVja01vZHVsZUF3YXJlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzV2l0aFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZSgpDQotICAgIHsNCi0gICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc0ZvcihQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MpOw0KLQ0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDQ7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuc2l6ZSgpID09IHJlc3VsdExlbmd0aCk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMi5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjEwMDAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYmVmb3JlVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxKQ0KLSAgICBjbGFzcyBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxIGltcGxlbWVudHMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYmVmb3JlVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigyKQ0KLSAgICBjbGFzcyBUZXN0TW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IyIGltcGxlbWVudHMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IsIFZhbGlkYXRpb25Nb2R1bGVBd2FyZQ0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNb2R1bGVLZXlzKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpLCBUZXN0TW9kdWxlLmNsYXNzLmdldE5hbWUoKX07DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigzKQ0KLSAgICBjbGFzcyBUZXN0TW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IzIGltcGxlbWVudHMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IsIFZhbGlkYXRpb25Nb2R1bGVBd2FyZQ0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNb2R1bGVLZXlzKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtUZXN0TW9kdWxlLmNsYXNzLmdldE5hbWUoKX07DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdE1vZHVsZQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxMDAwKQ0KLSAgICBjbGFzcyBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxMDAwIGltcGxlbWVudHMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYmVmb3JlVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uUmVuZGVyZXJJbnRlcmNlcHRvclRlc3RDYXNlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25SZW5kZXJlckludGVyY2VwdG9yVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ3NDc0ZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25SZW5kZXJlckludGVyY2VwdG9yVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlJlbmRlcmVySW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uUmVuZGVyZXJJbnRlcmNlcHRvclRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZQ0KLXsNCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBSZWdpc3RyYXRpb25SZW5kZXJlckludGVyY2VwdG9yVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvblJlbmRlcmVySW50ZXJjZXB0b3JUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJDb25zdGFudENvbmRpdGlvbnMifSkNCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbmRlcmVySW50ZXJjZXB0b3JJbml0aWFsaXphdGlvbigpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKG5ldyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIxKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKG5ldyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIyKCkpOw0KLQ0KLSAgICAgICAgTGlzdDxSZW5kZXJlckludGVyY2VwdG9yPiByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpOw0KLQ0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDQ7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3VsdExlbmd0aCwgcmVzdWx0LnNpemUoKSk7DQotDQotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yIHRtcDsNCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0bXAgPSByZXN1bHQuZ2V0KGkpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUodG1wIGluc3RhbmNlb2YgVGVzdENvbXBvbmVudEluaXRpYWxpemVyIHx8DQotICAgICAgICAgICAgICAgICAgICB0bXAgaW5zdGFuY2VvZiBWYWxpZGF0aW9uSW50ZXJjZXB0b3IgfHwgIC8qZHVlIHRvIGEganVuaXQgaXNzdWUqLw0KLSAgICAgICAgICAgICAgICAgICAgdG1wIGluc3RhbmNlb2YgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3INCi0gICAgew0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjEgZXh0ZW5kcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXINCi0gICAgew0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjIgZXh0ZW5kcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXINCi0gICAgew0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9wb20ueG1sIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZTI1NzUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQmVhbi1WYWxpZGF0aW9uLUludGVncmF0aW9uLU1vZHVsZSAoSlNSIDMwMyk8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4yLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8cmVwb3NpdG9yaWVzPgotICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5qYm9zczwvaWQ+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvc2l0b3J5Lmpib3NzLmNvbS9tYXZlbjI8L3VybD4KLSAgICAgICAgICAgIDxyZWxlYXNlcz4KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPgotICAgICAgICAgICAgPC9yZWxlYXNlcz4KLSAgICAgICAgICAgIDxzbmFwc2hvdHM+Ci0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+ZmFsc2U8L2VuYWJsZWQ+Ci0gICAgICAgICAgICA8L3NuYXBzaG90cz4KLSAgICAgICAgPC9yZXBvc2l0b3J5PgotICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5qYm9zcy1zbmFwc2hvdDwvaWQ+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9zbmFwc2hvdHMuamJvc3Mub3JnL21hdmVuMjwvdXJsPgotICAgICAgICAgICAgPHJlbGVhc2VzPgotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+Ci0gICAgICAgICAgICA8L3JlbGVhc2VzPgotICAgICAgICAgICAgPHNuYXBzaG90cz4KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPgotICAgICAgICAgICAgPC9zbmFwc2hvdHM+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICA8L3JlcG9zaXRvcmllcz4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgudmFsaWRhdGlvbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnZhbGlkYXRpb24tYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjAuR0E8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgICAgICA8IS0tIFRlc3QgZGVwZW5kZW5jaWVzIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjU8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0LmpzcDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnNoYWxlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2hhbGUtdGVzdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC40PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9BYnN0cmFjdCouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL1Rlc3RVdGlscy5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKkJlYW4uamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4gICAgICAgICAgICAKLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMjlkMTguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RhcnR1cC5CZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuQXdhcmVDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhbkF3YXJlQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdhNzQwNC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuQXdhcmVDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBCZWFuQXdhcmVDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5DQotew0KLSAgICBwcml2YXRlIENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5Ow0KLQ0KLSAgICBwdWJsaWMgQmVhbkF3YXJlQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkpDQotICAgIHsNCi0gICAgICAgIHNldENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeShDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBjb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSkNCi0gICAgew0KLSAgICAgICAgaWYoY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJudWxsIGlzIG5vdCBhbGxvd2VkIGhlcmUiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRoaXMuY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgPSBjb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWxsb3cgdGhlIHJlZ2lzdHJhdGlvbiBvZiBhIGN1c3RvbSBwcmVmaXgiKQ0KLSAgICBwdWJsaWMgPFQgZXh0ZW5kcyBDb25zdHJhaW50VmFsaWRhdG9yPD8sID8+PiBUIGdldEluc3RhbmNlKENsYXNzPFQ+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsaWRhdG9yQ2xhc3NOYW1lID0gdGFyZ2V0Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbihjcmVhdGVCZWFuTmFtZSh2YWxpZGF0b3JDbGFzc05hbWUpKTsNCi0NCi0gICAgICAgIGlmKHJlc3VsdCAhPSBudWxsICYmIHRhcmdldENsYXNzLmlzQXNzaWduYWJsZUZyb20ocmVzdWx0LmdldENsYXNzKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoVClyZXN1bHQ7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeS5nZXRJbnN0YW5jZSh0YXJnZXRDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlQmVhbk5hbWUoU3RyaW5nIHZhbGlkYXRvckNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUodmFsaWRhdG9yQ2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuQXdhcmVWYWxpZGF0b3JGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuQXdhcmVWYWxpZGF0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMTA3ZDMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JDb250ZXh0Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVHJhdmVyc2FibGVSZXNvbHZlcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBCZWFuQXdhcmVWYWxpZGF0b3JGYWN0b3J5IGltcGxlbWVudHMgVmFsaWRhdG9yRmFjdG9yeQ0KLXsNCi0gICAgcHJpdmF0ZSBWYWxpZGF0b3JGYWN0b3J5IHZhbGlkYXRvckZhY3Rvcnk7DQotDQotICAgIHB1YmxpYyBCZWFuQXdhcmVWYWxpZGF0b3JGYWN0b3J5KFZhbGlkYXRvckZhY3RvcnkgdmFsaWRhdG9yRmFjdG9yeSkNCi0gICAgew0KLSAgICAgICAgc2V0VmFsaWRhdG9yRmFjdG9yeSh2YWxpZGF0b3JGYWN0b3J5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3JGYWN0b3J5KFZhbGlkYXRvckZhY3RvcnkgdmFsaWRhdG9yRmFjdG9yeSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdG9yRmFjdG9yeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm51bGwgaXMgbm90IGFsbG93ZWQgaGVyZSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdGhpcy52YWxpZGF0b3JGYWN0b3J5ID0gdmFsaWRhdG9yRmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5LmdldFZhbGlkYXRvcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWxpZGF0b3JDb250ZXh0IHVzaW5nQ29udGV4dCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5LnVzaW5nQ29udGV4dCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlSW50ZXJwb2xhdG9yIGdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeS5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFRyYXZlcnNhYmxlUmVzb2x2ZXIgZ2V0VHJhdmVyc2FibGVSZXNvbHZlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5LmdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgZ2V0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEJlYW5Bd2FyZUNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KHZhbGlkYXRvckZhY3RvcnkuZ2V0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIDxUPiBUIHVud3JhcChDbGFzczxUPiB0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5LnVud3JhcCh0Q2xhc3MpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDUzNjI3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5WYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBWYWxpZGF0aW9uTW9kdWxlS2V5DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBCZWFuVmFsaWRhdGlvbk1vZHVsZUtleQ0KLXsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OGM5MTAuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWwuQmVhblZhbGlkYXRpb25VdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzIGJ2aVV0aWxzID0NCi0gICAgICAgICAgICBuZXcgQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHModGhpcy5sb2dnZXIpOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXF1aXJlZEluaXRpYWxpemF0aW9uU3VwcG9ydGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgdG8gaW5pdCBjb21wb25lbnQgIiArIHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBidmlVdGlscy5leHRyYWN0UHJvcGVydHlEZXRhaWxzKA0KLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBnZXRQcm9wZXJ0aWVzRm9yQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IodWlDb21wb25lbnQpKTsNCi0NCi0gICAgICAgIGlmIChwcm9wZXJ0eURldGFpbHMgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0Q29tcG9uZW50V2l0aFByb3BlcnR5RGV0YWlscyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBwcm9wZXJ0eURldGFpbHMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiaW5pdCBjb21wb25lbnQgb2YgIiArIHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb21wb25lbnRXaXRoUHJvcGVydHlEZXRhaWxzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmJ2aVV0aWxzLmluaXRDb21wb25lbnRXaXRoUHJvcGVydHlEZXRhaWxzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHByb3BlcnR5RGV0YWlscyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IGdldFByb3BlcnR5SW5mb3JtYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBib29sZWFuIHZhbGlkYXRlUHJvcGVydHkgPSBoYXNCZWFuVmFsaWRhdGlvbkNvbnN0cmFpbnRzKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHZhbGlkYXRlUHJvcGVydHkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgianNyMzAzIHN0YXJ0IHZhbGlkYXRpb24iKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBwcm9jZXNzRmllbGRWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlJbmZvcm1hdGlvbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluYWxseQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZVByb3BlcnR5KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImpzcjMwMyB2YWxpZGF0aW9uIGZpbmlzaGVkIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE1ldGFEYXRhRXh0cmFjdG9yIGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGJ2aVV0aWxzLmdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKHByb3BlcnRpZXMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhc0JlYW5WYWxpZGF0aW9uQ29uc3RyYWludHMoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5idmlVdGlscy5oYXNCZWFuVmFsaWRhdGlvbkNvbnN0cmFpbnRzKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NGaWVsZFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgLypub3QgdXNlZCB5ZXQgc3VwcG9ydE11bHRpcGxlVmlvbGF0aW9uc1BlckZpZWxkKCkqLw0KLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb24+IHZpb2xhdGlvbnMgPSB0aGlzLmJ2aVV0aWxzDQotICAgICAgICAgICAgICAgIC52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0NvbnN0cmFpbnRWaW9sYXRpb25zKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgdmlvbGF0aW9ucyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NvbnN0cmFpbnRWaW9sYXRpb25zKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbj4gdmlvbGF0aW9ucykNCi0gICAgew0KLSAgICAgICAgaWYodmlvbGF0aW9ucyAhPSBudWxsICYmICF2aW9sYXRpb25zLmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBCZWFuVmFsaWRhdGlvblV0aWxzLnByb2Nlc3NDb25zdHJhaW50VmlvbGF0aW9ucyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHZpb2xhdGlvbnMpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0TW9kdWxlS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEJlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGY4YTdiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uZ3JvdXBzLkRlZmF1bHQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQmVhbkRlc2NyaXB0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuRWxlbWVudERlc2NyaXB0b3I7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHMNCi17DQotICAgIHByaXZhdGUgTG9nIGxvZ2dlcjsNCi0NCi0gICAgQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHMoTG9nIGxvZ2dlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7DQotICAgIH0NCi0NCi0gICAgUHJvcGVydHlEZXRhaWxzIGV4dHJhY3RQcm9wZXJ0eURldGFpbHMoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllc0ZvckV4dHJhY3Rpb24pDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyByZXN1bHQgPSBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcihwcm9wZXJ0aWVzRm9yRXh0cmFjdGlvbikNCi0gICAgICAgICAgICAgICAgLmV4dHJhY3QoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgLmdldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBpZiAocmVzdWx0LmdldEJhc2VPYmplY3QoKSA9PSBudWxsICYmIHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCJubyBiYXNlIG9iamVjdCBhdCAiICsgcmVzdWx0LmdldEtleSgpICsNCi0gICAgICAgICAgICAgICAgICAgICIgY29tcG9uZW50LWlkOiAiICsgdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0LmdldEJhc2VPYmplY3QoKSAhPSBudWxsID8gcmVzdWx0IDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBhbHNvIGludm9rZXMgbWV0YS1kYXRhIGV4dHJhY3Rpb24gaW50ZXJjZXB0b3JzDQotICAgICAqIChzZWUgZS5nLiBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKQ0KLSAgICAgKi8NCi0gICAgTWV0YURhdGFFeHRyYWN0b3IgZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JXaXRoKHByb3BlcnRpZXMpOw0KLSAgICB9DQotDQotICAgIHZvaWQgaW5pdENvbXBvbmVudFdpdGhQcm9wZXJ0eURldGFpbHMoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMpDQotICAgIHsNCi0gICAgICAgIENsYXNzW10gZm91bmRHcm91cHMgPSByZXNvbHZlR3JvdXBzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgaWYgKGZvdW5kR3JvdXBzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoZm91bmRHcm91cHMubGVuZ3RoID09IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgZm91bmRHcm91cHMgPSBuZXcgQ2xhc3NbXXtEZWZhdWx0LmNsYXNzfTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpOw0KLQ0KLSAgICAgICAgdGFyZ2V0Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHRhcmdldENsYXNzKTsNCi0NCi0gICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIGVsZW1lbnREZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvckZvcih0YXJnZXRDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCkpOw0KLQ0KLSAgICAgICAgaWYgKGVsZW1lbnREZXNjcmlwdG9yID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHJvY2Vzc0VsZW1lbnREZXNjcmlwdG9yKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGZvdW5kR3JvdXBzLCBlbGVtZW50RGVzY3JpcHRvcik7DQotICAgIH0NCi0NCi0gICAgdm9pZCBwcm9jZXNzRWxlbWVudERlc2NyaXB0b3IoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzW10gZm91bmRHcm91cHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIGVsZW1lbnREZXNjcmlwdG9yKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhOw0KLQ0KLSAgICAgICAgZm9yIChDb25zdHJhaW50RGVzY3JpcHRvcjw/PiBjb25zdHJhaW50RGVzY3JpcHRvciA6DQotICAgICAgICAgICAgICAgIGVsZW1lbnREZXNjcmlwdG9yLmZpbmRDb25zdHJhaW50cygpLnVub3JkZXJlZEFuZE1hdGNoaW5nR3JvdXBzKGZvdW5kR3JvdXBzKS5nZXRDb25zdHJhaW50RGVzY3JpcHRvcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YSA9IHRyYW5zZm9ybUNvbnN0cmFpbnREZXNjcmlwdG9yVG9NZXRhRGF0YSgNCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnREZXNjcmlwdG9yLCBlbGVtZW50RGVzY3JpcHRvci5nZXRFbGVtZW50Q2xhc3MoKSk7DQotDQotICAgICAgICAgICAgaWYgKG1ldGFEYXRhICE9IG51bGwgJiYgIW1ldGFEYXRhLmlzRW1wdHkoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbmZpZ3VyZUNvbXBvbmVudFdpdGhNZXRhRGF0YShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJDb25zdHJhaW50RGVzY3JpcHRvciNpc1JlcG9ydEFzU2luZ2xlVmlvbGF0aW9uIikNCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybUNvbnN0cmFpbnREZXNjcmlwdG9yVG9NZXRhRGF0YSgNCi0gICAgICAgICAgICBDb25zdHJhaW50RGVzY3JpcHRvcjw/PiBjb25zdHJhaW50RGVzY3JpcHRvciwgQ2xhc3MgZWxlbWVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLQ0KLSAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IEV4dFZhbFV0aWxzLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgIG5ldyBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3koY29uc3RyYWludERlc2NyaXB0b3IsIGVsZW1lbnRDbGFzcykpOw0KLQ0KLSAgICAgICAgaWYgKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQucHV0QWxsKHRyYW5zZm9ybU1ldGFEYXRhKG1ldGFEYXRhVHJhbnNmb3JtZXIsIGNvbnN0cmFpbnREZXNjcmlwdG9yKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoIWNvbnN0cmFpbnREZXNjcmlwdG9yLmlzUmVwb3J0QXNTaW5nbGVWaW9sYXRpb24oKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTZXQ8Q29uc3RyYWludERlc2NyaXB0b3I8Pz4+IGNvbXBvc2luZ0NvbnN0cmFpbnRzID0gY29uc3RyYWludERlc2NyaXB0b3IuZ2V0Q29tcG9zaW5nQ29uc3RyYWludHMoKTsNCi0gICAgICAgICAgICBpZiAoY29tcG9zaW5nQ29uc3RyYWludHMgIT0gbnVsbCAmJiAhY29tcG9zaW5nQ29uc3RyYWludHMuaXNFbXB0eSgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0LnB1dEFsbCh0cmFuc2Zvcm1Db21wb3NpbmdDb25zdHJhaW50cyhjb21wb3NpbmdDb25zdHJhaW50cywgZWxlbWVudENsYXNzKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtQ29tcG9zaW5nQ29uc3RyYWludHMoDQotICAgICAgICAgICAgU2V0PENvbnN0cmFpbnREZXNjcmlwdG9yPD8+PiBjb21wb3NpbmdDb25zdHJhaW50cywgQ2xhc3MgZWxlbWVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgZm9yIChDb25zdHJhaW50RGVzY3JpcHRvciBjb25zdHJhaW50RGVzY3JpcHRvciA6IGNvbXBvc2luZ0NvbnN0cmFpbnRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5wdXRBbGwodHJhbnNmb3JtQ29uc3RyYWludERlc2NyaXB0b3JUb01ldGFEYXRhKGNvbnN0cmFpbnREZXNjcmlwdG9yLCBlbGVtZW50Q2xhc3MpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKA0KLSAgICAgICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lciwgQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gY29uc3RyYWludERlc2NyaXB0b3IpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRW50cnkgZW50cnk7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdDsNCi0gICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZW50cnkgPSBuZXcgTWV0YURhdGFFbnRyeSgpOw0KLSAgICAgICAgZW50cnkuc2V0S2V5KGNvbnN0cmFpbnREZXNjcmlwdG9yLmdldEFubm90YXRpb24oKS5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7DQotICAgICAgICBlbnRyeS5zZXRWYWx1ZShjb25zdHJhaW50RGVzY3JpcHRvcik7DQotDQotICAgICAgICByZXN1bHQgPSBtZXRhRGF0YVRyYW5zZm9ybWVyLmNvbnZlcnRNZXRhRGF0YShlbnRyeSk7DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIGJvb2xlYW4gaGFzQmVhblZhbGlkYXRpb25Db25zdHJhaW50cyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscy5nZXRQcm9wZXJ0eURldGFpbHMocHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpKTsNCi0NCi0gICAgICAgIHJldHVybiBnZXREZXNjcmlwdG9yRm9yKHRhcmdldENsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSkgIT0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbj4gdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgYmFzZUJlYW5DbGFzcyA9IGdldEJhc2VDbGFzc1R5cGUocHJvcGVydHlJbmZvcm1hdGlvbik7DQotICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gZ2V0UHJvcGVydHlUb1ZhbGlkYXRlKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgQ2xhc3NbXSBncm91cHMgPSByZXNvbHZlR3JvdXBzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgaWYgKGdyb3VwcyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVmFsaWRhdG9yRmFjdG9yeSB2YWxpZGF0b3JGYWN0b3J5ID0gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZhbGlkYXRvckZhY3RvcnkoKTsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5DQotICAgICAgICAgICAgICAgIC51c2luZ0NvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAubWVzc2FnZUludGVycG9sYXRvcihFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpKQ0KLSAgICAgICAgICAgICAgICAuY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkodmFsaWRhdG9yRmFjdG9yeS5nZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpKQ0KLSAgICAgICAgICAgICAgICAudHJhdmVyc2FibGVSZXNvbHZlcih2YWxpZGF0b3JGYWN0b3J5LmdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKSkNCi0gICAgICAgICAgICAgICAgLmdldFZhbGlkYXRvcigpDQotICAgICAgICAgICAgICAgIC52YWxpZGF0ZVZhbHVlKGJhc2VCZWFuQ2xhc3MsIHByb3BlcnR5TmFtZSwgY29udmVydGVkT2JqZWN0LCBncm91cHMpOw0KLSAgICB9DQotDQotICAgIENsYXNzIGdldEJhc2VDbGFzc1R5cGUoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBDbGFzcyByZXN1bHQgPSBFeHRWYWxVdGlscy5nZXRQcm9wZXJ0eURldGFpbHMocHJvcGVydHlJbmZvcm1hdGlvbikuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCk7DQotDQotICAgICAgICByZXR1cm4gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhyZXN1bHQpOw0KLSAgICB9DQotDQotICAgIFN0cmluZyBnZXRQcm9wZXJ0eVRvVmFsaWRhdGUoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5SW5mb3JtYXRpb24pLmdldFByb3BlcnR5KCk7DQotICAgIH0NCi0NCi0gICAgQ2xhc3NbXSByZXNvbHZlR3JvdXBzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEdyb3VwcygNCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZ2V0Vmlld0lkKCksDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCkpOw0KLSAgICB9DQotDQotICAgIEVsZW1lbnREZXNjcmlwdG9yIGdldERlc2NyaXB0b3JGb3IoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgQmVhbkRlc2NyaXB0b3IgYmVhbkRlc2NyaXB0b3IgPSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0VmFsaWRhdG9yRmFjdG9yeSgpDQotICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0b3IoKS5nZXRDb25zdHJhaW50c0ZvckNsYXNzKHRhcmdldENsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiBiZWFuRGVzY3JpcHRvci5nZXRDb25zdHJhaW50c0ZvclByb3BlcnR5KHByb3BlcnR5KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0V4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzdjODU2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0V4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLm1lc3NhZ2UuaW50ZXJwb2xhdG9yLkRlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLm1lc3NhZ2UuaW50ZXJwb2xhdG9yLkV4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5Nb2RlbFZhbGlkYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5Nb2RlbFZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbC5CZWFuVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5Hcm91cFN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uTWVzc2FnZUludGVycG9sYXRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGltcGxlbWVudHMgR3JvdXBTdG9yYWdlLCBNb2RlbFZhbGlkYXRpb25TdG9yYWdlDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZID0gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmNsYXNzLmdldE5hbWUoKSArICI6S0VZIjsNCi0NCi0gICAgcHJpdmF0ZSBNZXNzYWdlSW50ZXJwb2xhdG9yIGRlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yOw0KLQ0KLSAgICBwcml2YXRlIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXI7DQotDQotICAgIHByaXZhdGUgR3JvdXBTdG9yYWdlIGdyb3VwU3RvcmFnZTsNCi0NCi0gICAgcHJpdmF0ZSBNb2RlbFZhbGlkYXRpb25TdG9yYWdlIG1vZGVsVmFsaWRhdGlvblN0b3JhZ2U7DQotDQotICAgIHByaXZhdGUgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0KCkNCi0gICAgew0KLSAgICAgICAgaW5pdEdyb3VwU3RvcmFnZSgpOw0KLSAgICAgICAgaW5pdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UoKTsNCi0NCi0gICAgICAgIGluaXRNZXNzYWdlUmVzb2x2ZXIoKTsNCi0gICAgICAgIGluaXRNZXNzYWdlSW50ZXJwb2xhdG9yKCk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHVibGljIHN0YXRpYyBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgZ2V0Q3VycmVudEluc3RhbmNlKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBjdXJyZW50Q29udGV4dCA9IChFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQpcmVxdWVzdE1hcC5nZXQoS0VZKTsNCi0NCi0gICAgICAgIGlmKGN1cnJlbnRDb250ZXh0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudENvbnRleHQgPSBuZXcgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0KCk7DQotICAgICAgICAgICAgcmVxdWVzdE1hcC5wdXQoS0VZLCBjdXJyZW50Q29udGV4dCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gY3VycmVudENvbnRleHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRvckZhY3RvcnkgZ2V0VmFsaWRhdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCB2YWxpZGF0b3JGYWN0b3J5ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoVmFsaWRhdG9yRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgaWYodmFsaWRhdG9yRmFjdG9yeSBpbnN0YW5jZW9mIFZhbGlkYXRvckZhY3RvcnkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0b3JGYWN0b3J5KXZhbGlkYXRvckZhY3Rvcnk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybigiZmFsbGJhY2sgdG8gdGhlIGRlZmF1bHQgYnYgdmFsaWRhdG9yIGZhY3RvcnkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBCZWFuVmFsaWRhdGlvblV0aWxzLmdldERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1lc3NhZ2VJbnRlcnBvbGF0b3IgZ2V0TWVzc2FnZUludGVycG9sYXRvcigpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMubWVzc2FnZVJlc29sdmVyICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlcih0aGlzLmRlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yLCB0aGlzLm1lc3NhZ2VSZXNvbHZlcik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRHcm91cChDbGFzcyBncm91cENsYXNzLCBTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZ3JvdXBTdG9yYWdlLmFkZEdyb3VwKGdyb3VwQ2xhc3MsIHZpZXdJZCwgY2xpZW50SWQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlc3RyaWN0R3JvdXAoQ2xhc3MgZ3JvdXBDbGFzcywgU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmdyb3VwU3RvcmFnZS5yZXN0cmljdEdyb3VwKGdyb3VwQ2xhc3MsIHZpZXdJZCwgY2xpZW50SWQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzc1tdIGdldEdyb3VwcyhTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmdyb3VwU3RvcmFnZS5nZXRHcm91cHModmlld0lkLCBjbGllbnRJZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMubW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5hZGRNb2RlbFZhbGlkYXRpb25FbnRyeShtb2RlbFZhbGlkYXRpb25FbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXNUb1ZhbGlkYXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5nZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0R3JvdXBTdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5ncm91cFN0b3JhZ2UgPSBFeHRWYWxVdGlscw0KLSAgICAgICAgICAgICAgICAuZ2V0U3RvcmFnZShHcm91cFN0b3JhZ2UuY2xhc3MsIEJlYW5WYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRNb2RlbFZhbGlkYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tb2RlbFZhbGlkYXRpb25TdG9yYWdlID0gRXh0VmFsVXRpbHMuDQotICAgICAgICAgICAgICAgIGdldFN0b3JhZ2UoTW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcywgTW9kZWxWYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZvdW5kQmVhbiA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbihNZXNzYWdlSW50ZXJwb2xhdG9yLmNsYXNzLmdldE5hbWUoKS5yZXBsYWNlKCIuIiwgIl8iKSk7DQotDQotICAgICAgICBpZihmb3VuZEJlYW4gaW5zdGFuY2VvZiBNZXNzYWdlSW50ZXJwb2xhdG9yKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuZGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IgPSAoTWVzc2FnZUludGVycG9sYXRvcilmb3VuZEJlYW47DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5kZWZhdWx0TWVzc2FnZUludGVycG9sYXRvciA9IG5ldyBEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcigNCi0gICAgICAgICAgICAgICAgQmVhblZhbGlkYXRpb25VdGlscy5nZXREZWZhdWx0VmFsaWRhdG9yRmFjdG9yeSgpLmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRNZXNzYWdlUmVzb2x2ZXIoKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1lc3NhZ2VSZXNvbHZlciA9IEV4dFZhbFV0aWxzLmdldE1lc3NhZ2VSZXNvbHZlckZvclZhbGlkYXRpb25TdHJhdGVneShnZXRCZWFuVmFsaWRhdGlvblN0cmF0ZWd5KCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgVmFsaWRhdGlvblN0cmF0ZWd5IGdldEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneShudWxsLCBudWxsKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNjlkMy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQKLSAgICAgICAgLkFic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIHgueC4zCi0gKi8KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVSZXF1aXJlZEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZighRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkgfHwKLSAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGlzQ29tcG9uZW50UmVxdWlyZWQodWlDb21wb25lbnQpKSkKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vQmVhblZhbGlkYXRpb24uamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vQmVhblZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY5MzNhOS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL0JlYW5WYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uZ3JvdXBzLkRlZmF1bHQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgVFlQRX0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLUBEb2N1bWVudGVkDQotcHVibGljIEBpbnRlcmZhY2UgQmVhblZhbGlkYXRpb24NCi17DQotICAgIFN0cmluZ1tdIHZpZXdJZHMoKSBkZWZhdWx0ICIqIjsNCi0NCi0gICAgQ2xhc3NbXSB1c2VHcm91cHMoKSBkZWZhdWx0IERlZmF1bHQuY2xhc3M7DQotDQotICAgIENsYXNzW10gcmVzdHJpY3RHcm91cHMoKSBkZWZhdWx0IHt9Ow0KLQ0KLSAgICBTdHJpbmdbXSBjb25kaXRpb25zKCkgZGVmYXVsdCAiI3t0cnVlfSI7DQotDQotICAgIE1vZGVsVmFsaWRhdGlvbiBtb2RlbFZhbGlkYXRpb24oKSBkZWZhdWx0IEBNb2RlbFZhbGlkYXRpb247DQotICAgIA0KLSAgICBAUmV0ZW50aW9uKFJVTlRJTUUpIHN0YXRpYyBAaW50ZXJmYWNlIExpc3QNCi0gICAgew0KLSAgICAgICAgQmVhblZhbGlkYXRpb25bXSB2YWx1ZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vTW9kZWxWYWxpZGF0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL01vZGVsVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmM3OGRkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vTW9kZWxWYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgVFlQRX0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLUBEb2N1bWVudGVkDQotcHVibGljIEBpbnRlcmZhY2UgTW9kZWxWYWxpZGF0aW9uDQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUID0gIiI7DQotDQotICAgIGJvb2xlYW4gaXNBY3RpdmUoKSBkZWZhdWx0IGZhbHNlOw0KLQ0KLSAgICBib29sZWFuIGRpc3BsYXlJbmxpbmUoKSBkZWZhdWx0IGZhbHNlOw0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic3VwcG9ydCBwcm9wZXJ0eSBjaGFpbiBzeW50YXgiKQ0KLSAgICBTdHJpbmdbXSB2YWxpZGF0aW9uVGFyZ2V0cygpIGRlZmF1bHQgREVGQVVMVDsNCi0NCi0gICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0IERFRkFVTFQ7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3Rvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdEdyb3VwQ29udHJvbGxlclNjYW5uaW5nRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNmYxMzUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdEdyb3VwQ29udHJvbGxlclNjYW5uaW5nRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLmV4dHJhY3RvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLkRlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInVzZSBtZXRhLWRhdGEgc3RvcmFnZSAtIGJ1dCBhIHNwZWNpYWwgaW1wbC4iKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3RvciBleHRlbmRzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcg0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgUHJvcGVydHlEZXRhaWxzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG9iamVjdC5nZXRDbGFzcygpICsgIiBpcyBub3QgYSAiICsgUHJvcGVydHlEZXRhaWxzLmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gKFByb3BlcnR5RGV0YWlscylvYmplY3Q7DQotDQotICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpKTsNCi0NCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOw0KLSAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5zZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBwcm9wZXJ0eURldGFpbHMpOw0KLQ0KLSAgICAgICAgZXh0cmFjdEFubm90YXRpb25zKHByb3BlcnR5SW5mb3JtYXRpb24sIHByb3BlcnR5RGV0YWlscywgZW50aXR5Q2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvQmVhblZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvQmVhblZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzc3NWM3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0JlYW5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogZXh0cmFjdHMgYW5kIGFkZHMgdGhlIGV4dHZhbCBidiBtZXRhLWRhdGEgKGUuZy4gdmFsaWRhdGlvbiBncm91cHMpIHRvIHRoZSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIgJiYgaXNCbG9ja2luZ0V4Y2VwdGlvbih1aUNvbXBvbmVudCwgdmFsaWRhdG9yRXhjZXB0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2J2IGludGVncmF0aW9uIGRvZXNuJ3QgdGhyb3cgZXhjZXB0aW9ucyB0byBzdXBwb3J0IG11bHRpcGxlIG1lc3NhZ2VzIC0+IHNldCBjb21wb25lbnQgc3RhdGUNCi0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFZhbGlkKGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0Jsb2NraW5nRXhjZXB0aW9uKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpLnNldmVyaXR5Q2F1c2VzVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmNmNzBmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0V4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5WYWxpZGF0aW9uTW9kdWxlQXdhcmU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuQmVhblZhbGlkYXRpb25Nb2R1bGVLZXk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWwuQmVhblZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogZXh0cmFjdHMgYW5kIGFkZHMgdGhlIGV4dHZhbCBidiBtZXRhLWRhdGEgKGUuZy4gdmFsaWRhdGlvbiBncm91cHMpIHRvIHRoZSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi0gICAgICAgIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IsIFZhbGlkYXRpb25Nb2R1bGVBd2FyZQ0KLXsNCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYocHJvcGVydHlJbmZvcm1hdGlvbi5jb250YWluc0luZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkNVU1RPTV9QUk9QRVJUSUVTKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBNYXAgcHJvcGVydGllcyA9IHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuQ1VTVE9NX1BST1BFUlRJRVMsIE1hcC5jbGFzcyk7DQotDQotICAgICAgICAgICAgaWYocHJvcGVydGllcyAhPSBudWxsICYmIHByb3BlcnRpZXMuY29udGFpbnNLZXkoVUlDb21wb25lbnQuY2xhc3MuZ2V0TmFtZSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50ID0gKFVJQ29tcG9uZW50KXByb3BlcnRpZXMuZ2V0KFVJQ29tcG9uZW50LmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscy5nZXRQcm9wZXJ0eURldGFpbHMocHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgICAgICAgICAgICAgIHByb2Nlc3NFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhKHVpQ29tcG9uZW50LCBwcm9wZXJ0eURldGFpbHMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogYWRkcyB0aGUgZXh0dmFsIGJ2IG1ldGEtZGF0YSB0byB0aGUgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0DQotICAgICAqDQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlEZXRhaWxzIHByb3BlcnR5IGRldGFpbHMgb2YgdGhlIHZhbHVlLWJpbmRpbmcNCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscykNCi0gICAgew0KLSAgICAgICAgaWYoSnNmVXRpbHMuaXNSZW5kZXJSZXNwb25zZVBoYXNlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQmVhblZhbGlkYXRpb25VdGlscy5hZGRNZXRhRGF0YVRvQ29udGV4dCh1aUNvbXBvbmVudCwgcHJvcGVydHlEZXRhaWxzLCBmYWxzZSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgQmVhblZhbGlkYXRpb25VdGlscy5hZGRNZXRhRGF0YVRvQ29udGV4dCh1aUNvbXBvbmVudCwgcHJvcGVydHlEZXRhaWxzLCB0cnVlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TW9kdWxlS2V5cygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge0JlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzLmdldE5hbWUoKX07DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0Fic3RyYWN0QmVhblZhbGlkYXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZmRhMGQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QmVhblZhbGlkYXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyPFQgZXh0ZW5kcyBBbm5vdGF0aW9uPiBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIENvbnN0cmFpbnREZXNjcmlwdG9yPD8gZXh0ZW5kcyBUPiBjb25zdHJhaW50RGVzY3JpcHRvciA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoQ29uc3RyYWludERlc2NyaXB0b3IuY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYoaXNDbGllbnRTaWRlVmFsaWRhdGlvbkVuYWJsZWQoY29uc3RyYWludERlc2NyaXB0b3IpICYmIGlzQmxvY2tpbmdDb25zdHJhaW50KGNvbnN0cmFpbnREZXNjcmlwdG9yKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtTWV0YURhdGEoKENvbnN0cmFpbnREZXNjcmlwdG9yPFQ+KWNvbnN0cmFpbnREZXNjcmlwdG9yKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ2xpZW50U2lkZVZhbGlkYXRpb25FbmFibGVkKENvbnN0cmFpbnREZXNjcmlwdG9yPD8gZXh0ZW5kcyBUPiBjb25zdHJhaW50RGVzY3JpcHRvcikNCi0gICAgew0KLSAgICAgICAgZm9yKENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPiBwYXlsb2FkIDogY29uc3RyYWludERlc2NyaXB0b3IuZ2V0UGF5bG9hZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNCbG9ja2luZ0NvbnN0cmFpbnQoQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gY29uc3RyYWludERlc2NyaXB0b3IpDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZSB0ZXN0TWVzc2FnZSA9IG5ldyBGYWNlc01lc3NhZ2UoKTsNCi0gICAgICAgIHRlc3RNZXNzYWdlLnNldFNldmVyaXR5KFZpb2xhdGlvblNldmVyaXR5LkVycm9yLlZBTFVFKTsNCi0NCi0gICAgICAgIGZvciAoQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+IHBheWxvYWQgOiBjb25zdHJhaW50RGVzY3JpcHRvci5nZXRQYXlsb2FkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzKS5pc0Fzc2lnbmFibGVGcm9tKHBheWxvYWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGVzdE1lc3NhZ2Uuc2V0U2V2ZXJpdHkoVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5WQUxVRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYoRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKFZpb2xhdGlvblNldmVyaXR5LkluZm8uY2xhc3MpLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0ZXN0TWVzc2FnZS5zZXRTZXZlcml0eShWaW9sYXRpb25TZXZlcml0eS5JbmZvLlZBTFVFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZihFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoVmlvbGF0aW9uU2V2ZXJpdHkuRmF0YWwuY2xhc3MpLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0ZXN0TWVzc2FnZS5zZXRTZXZlcml0eShWaW9sYXRpb25TZXZlcml0eS5GYXRhbC5WQUxVRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLnNldmVyaXR5QmxvY2tzU3VibWl0Rm9yQ29tcG9uZW50SWQobnVsbCwgdGVzdE1lc3NhZ2UpOw0KLSAgICB9DQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKENvbnN0cmFpbnREZXNjcmlwdG9yPFQ+IGNvbnN0cmFpbnREZXNjcmlwdG9yKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL05vdE51bGxNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYzc1ZWUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdEJlYW5WYWxpZGF0aW9uTWV0YURhdGFUcmFuc2Zvcm1lcjxOb3ROdWxsPg0KLXsNCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoQ29uc3RyYWludERlc2NyaXB0b3I8Tm90TnVsbD4gY29uc3RyYWludERlc2NyaXB0b3IpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgaWYoRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9TdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU3RyaW5nU2l6ZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE5ZmY1OC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9TdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFN0cmluZ1NpemVNZXRhRGF0YVRyYW5zZm9ybWVyIGV4dGVuZHMgQWJzdHJhY3RCZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXI8U2l6ZT4NCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKENvbnN0cmFpbnREZXNjcmlwdG9yPFNpemU+IGNvbnN0cmFpbnREZXNjcmlwdG9yKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIFNpemUgYW5ub3RhdGlvbiA9IGNvbnN0cmFpbnREZXNjcmlwdG9yLmdldEFubm90YXRpb24oKTsNCi0NCi0gICAgICAgIGludCBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW4oKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gIT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSCwgbWluaW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEhfREVGQVVMVCwgbWluaW11bSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpbnQgbWF4aW11bSA9IGFubm90YXRpb24ubWF4KCk7DQotICAgICAgICBpZihtYXhpbXVtICE9IEludGVnZXIuTUFYX1ZBTFVFKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RILCBtYXhpbXVtKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSF9ERUZBVUxULCBtYXhpbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBlMDMxYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcg0KLSAgICAgICAgLkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZihpc0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3koc291cmNlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgYmVhblZhbGlkYXRpb25BZGFwdGVyID0NCi0gICAgICAgICAgICAgICAgICAgIChCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kpc291cmNlOw0KLQ0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVCZWFuVmFsaWRhdGlvblRyYW5zZm9ybWVyTmFtZShiZWFuVmFsaWRhdGlvbkFkYXB0ZXIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQmVhblZhbGlkYXRpb25TdHJhdGVneShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc291cmNlIGluc3RhbmNlb2YgQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCAgYWJzdHJhY3QgU3RyaW5nIGNyZWF0ZUJlYW5WYWxpZGF0aW9uVHJhbnNmb3JtZXJOYW1lKA0KLSAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvTm90TnVsbE5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9Ob3ROdWxsTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzI4Nzg2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9Ob3ROdWxsTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5Ob3ROdWxsTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLk5lc3RlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ATmVzdGVkDQotQEludm9jYXRpb25PcmRlcigyMDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBOb3ROdWxsTmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0QmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVCZWFuVmFsaWRhdGlvblRyYW5zZm9ybWVyTmFtZShCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgYWRhcHRlcikNCi0gICAgew0KLSAgICAgICAgaWYoaXNOb3ROdWxsQ29uc3RyYWludChhZGFwdGVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXIuY2xhc3MuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTm90TnVsbENvbnN0cmFpbnQoQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5IGFkYXB0ZXIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBOb3ROdWxsLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoDQotICAgICAgICAgICAgICAgIGFkYXB0ZXIuZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKS5nZXRBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaXplTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpemVOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjODkwYzYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpemVOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLk5lc3RlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5TdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBOZXN0ZWQNCi1ASW52b2NhdGlvbk9yZGVyKDIxMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIFNpemVOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZUJlYW5WYWxpZGF0aW9uVHJhbnNmb3JtZXJOYW1lKEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSBhZGFwdGVyKQ0KLSAgICB7DQotICAgICAgICBpZihpc1N0cmluZ1NpemVDb25zdHJhaW50KGFkYXB0ZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBTdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lci5jbGFzcy5nZXROYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTdHJpbmdTaXplQ29uc3RyYWludChCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgYWRhcHRlcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFNpemUuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscygNCi0gICAgICAgICAgICAgICAgYWRhcHRlci5nZXRDb25zdHJhaW50RGVzY3JpcHRvcigpLmdldEFubm90YXRpb24oKS5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSkgJiYNCi0gICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoYWRhcHRlci5nZXRFbGVtZW50Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3BheWxvYWQvRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wYXlsb2FkL0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjJkMjJmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3BheWxvYWQvRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbiBleHRlbmRzIFBheWxvYWQNCi17DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3BheWxvYWQvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3BheWxvYWQvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4OGIyZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wYXlsb2FkL1Zpb2xhdGlvblNldmVyaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmlvbGF0aW9uU2V2ZXJpdHkNCi17DQotICAgIGludGVyZmFjZSBJbmZvIGV4dGVuZHMgUGF5bG9hZA0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgVkFMVUUgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfSU5GTzsNCi0gICAgfQ0KLQ0KLSAgICBpbnRlcmZhY2UgV2FybiBleHRlbmRzIFBheWxvYWQNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFZBTFVFID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk47DQotICAgIH0NCi0NCi0gICAgaW50ZXJmYWNlIEVycm9yIGV4dGVuZHMgUGF5bG9hZA0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgVkFMVUUgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1I7DQotICAgIH0NCi0NCi0gICAgaW50ZXJmYWNlIEZhdGFsIGV4dGVuZHMgUGF5bG9hZA0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgVkFMVUUgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RhcnR1cC9CZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RhcnR1cC9CZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmFjNmY4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0YXJ0dXAvQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLkJlYW5Bd2FyZVZhbGlkYXRvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC51dGlsLkJlYW5WYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yLkV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yLkJlYW5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyLlNpemVOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIuTm90TnVsbE5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLk1vZGVsVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UubWFwcGVyLkJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5tYXBwZXIuTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5Hcm91cFN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXJIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTUwMjU3NDgzOTk4NzY4MzMzOTRMOw0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXJWYWxpZGF0b3JGYWN0b3J5KCk7DQotICAgICAgICByZWdpc3RlckJlYW5WYWxpZGF0aW9uSW50ZXJjZXB0b3IoKTsNCi0gICAgICAgIHJlZ2lzdGVyTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKTsNCi0gICAgICAgIHJlZ2lzdGVyR3JvdXBTdG9yYWdlTmFtZU1hcHBlcigpOw0KLSAgICAgICAgcmVnaXN0ZXJNb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlcigpOw0KLSAgICAgICAgcmVnaXN0ZXJDb21wb25lbnRJbml0aWFsaXplcnMoKTsNCi0gICAgICAgIHJlZ2lzdGVyTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7DQotICAgICAgICByZWdpc3RlclBoYXNlTGlzdGVuZXJzKCk7DQotICAgICAgICByZWdpc3RlckV4Y2VwdGlvbkludGVyY2VwdG9yKCk7DQotICAgICAgICByZWdpc3RlclZpb2xhdGlvblNldmVyaXR5UGF5bG9hZCgpOw0KLSAgICAgICAgcmVnaXN0ZXJEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb25QYXlsb2FkKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJWYWxpZGF0b3JGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoVmFsaWRhdG9yRmFjdG9yeS5jbGFzcy5nZXROYW1lKCksDQotICAgICAgICAgICAgICAgIG5ldyBCZWFuQXdhcmVWYWxpZGF0b3JGYWN0b3J5KEJlYW5WYWxpZGF0aW9uVXRpbHMuZ2V0RGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKSksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckJlYW5WYWxpZGF0aW9uSW50ZXJjZXB0b3IoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIobmV3IFNpemVOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKG5ldyBOb3ROdWxsTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlckdyb3VwU3RvcmFnZU5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBTdG9yYWdlTWFuYWdlciBzdG9yYWdlTWFuYWdlciA9IGdldFN0b3JhZ2VNYW5hZ2VySG9sZGVyKCkuZ2V0U3RvcmFnZU1hbmFnZXIoR3JvdXBTdG9yYWdlLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmIChzdG9yYWdlTWFuYWdlciBpbnN0YW5jZW9mIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAoKEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxTdHJpbmc+KSBzdG9yYWdlTWFuYWdlcikNCi0gICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgQmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKHN0b3JhZ2VNYW5hZ2VyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGhhcyB0byBpbXBsZW1lbnQgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5ICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgIiBjb3VsZG4ndCByZWdpc3RlciAiICsgQmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyLmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBEZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgbW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgPSBuZXcgRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyKCk7DQotICAgICAgICBtb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5yZWdpc3RlcihuZXcgTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBnZXRTdG9yYWdlTWFuYWdlckhvbGRlcigpLnNldFN0b3JhZ2VNYW5hZ2VyKE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MsIG1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJDb21wb25lbnRJbml0aWFsaXplcnMoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0b3JhZ2VNYW5hZ2VySG9sZGVyIGdldFN0b3JhZ2VNYW5hZ2VySG9sZGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwgU3RvcmFnZU1hbmFnZXJIb2xkZXIuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlck1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclBoYXNlTGlzdGVuZXJzKCkNCi0gICAgew0KLSAgICAgICAgSnNmVXRpbHMucmVnaXN0ZXJQaGFzZUxpc3RlbmVyKG5ldyBNb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyRXhjZXB0aW9uSW50ZXJjZXB0b3IoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IobmV3IEJlYW5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJWaW9sYXRpb25TZXZlcml0eVBheWxvYWQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0IGV4dFZhbENvbnRleHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKTsNCi0NCi0gICAgICAgIGV4dFZhbENvbnRleHQuYWRkR2xvYmFsUHJvcGVydHkoVmlvbGF0aW9uU2V2ZXJpdHkuSW5mby5jbGFzcy5nZXROYW1lKCksIFZpb2xhdGlvblNldmVyaXR5LkluZm8uY2xhc3MsIGZhbHNlKTsNCi0gICAgICAgIGV4dFZhbENvbnRleHQuYWRkR2xvYmFsUHJvcGVydHkoVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcy5nZXROYW1lKCksIFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MsIGZhbHNlKTsNCi0gICAgICAgIGV4dFZhbENvbnRleHQuYWRkR2xvYmFsUHJvcGVydHkoVmlvbGF0aW9uU2V2ZXJpdHkuRmF0YWwuY2xhc3MuZ2V0TmFtZSgpLCBWaW9sYXRpb25TZXZlcml0eS5GYXRhbC5jbGFzcywgZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyBuZWVkIHRvIHJlZ2lzdGVyICJlcnJvciIgaXQncyB0aGUgZGVmYXVsdA0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvblBheWxvYWQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eSgNCi0gICAgICAgICAgICAgICAgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKSwgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLCBmYWxzZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MDM3NmUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdEdyb3VwU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGJlYW4tdmFsaWRhdGlvbiBncm91cHMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UgZXh0ZW5kcyBEZWZhdWx0R3JvdXBTdG9yYWdlDQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIENsYXNzW10gZ2V0R3JvdXBzKFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgQ2xhc3NbXSByZXN1bHQgPSBzdXBlci5nZXRHcm91cHModmlld0lkLCBjbGllbnRJZCk7DQotDQotICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL3RoZSBkZWZhdWx0IGdyb3VwIHdpbGwgYmUgdmFsaWRhdGVkIGF1dG9tYXRpY2FsbHkNCi0gICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzW10ge307DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgwMGY4Yi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuR3JvdXBVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBzdG9yYWdlIGltcGxlbWVudGF0aW9uIGZvciBtb2RlbC12YWxpZGF0aW9uIGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZSBpbXBsZW1lbnRzIE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4+IG1vZGVsVmFsaWRhdGlvbkVudHJpZXMgPQ0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4+KCk7DQotDQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGNvbXBvbmVudHNPZlJlcXVlc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjbGllbnRJZCA9IGdldEN1cnJlbnRDbGllbnRJZChtb2RlbFZhbGlkYXRpb25FbnRyeSk7DQotDQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QgPSByZXNvbHZlTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeSwgY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkobW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LCBtb2RlbFZhbGlkYXRpb25FbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q3VycmVudENsaWVudElkKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY2xpZW50SWQgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjbGllbnRJZCA9IG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpLmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotDQotICAgICAgICAgICAgaWYoIXRoaXMuY29tcG9uZW50c09mUmVxdWVzdC5jb250YWlucyhjbGllbnRJZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNPZlJlcXVlc3QuYWRkKGNsaWVudElkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY2xpZW50SWQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXNvbHZlTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KA0KLSAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9DQotICAgICAgICAgICAgICAgIHRoaXMubW9kZWxWYWxpZGF0aW9uRW50cmllcy5nZXQoR3JvdXBVdGlscy5nZXRHcm91cEtleSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRWaWV3SWQoKSwgY2xpZW50SWQpKTsNCi0NCi0gICAgICAgIGlmKG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICAgICAgdGhpcy5tb2RlbFZhbGlkYXRpb25FbnRyaWVzLnB1dChHcm91cFV0aWxzLmdldEdyb3VwS2V5KA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Vmlld0lkKCksIGNsaWVudElkKSwgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KA0KLSAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmKCFtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QuY29udGFpbnMobW9kZWxWYWxpZGF0aW9uRW50cnkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdC5hZGQobW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2aWV3SWQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRWaWV3SWQoKTsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotDQotICAgICAgICBhZGRFbnRyaWVzRm9yQ29tcG9uZW50cyh2aWV3SWQsIHJlc3VsdCk7DQotDQotICAgICAgICBhZGRFbnRyaWVzRm9yUGFnZSh2aWV3SWQsIHJlc3VsdCk7DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRFbnRyaWVzRm9yQ29tcG9uZW50cyhTdHJpbmcgdmlld0lkLCBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIGZvcihTdHJpbmcgY3VycmVudENsaWVudElkIDogdGhpcy5jb21wb25lbnRzT2ZSZXF1ZXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwoZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllcyh2aWV3SWQsIGN1cnJlbnRDbGllbnRJZCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRFbnRyaWVzRm9yUGFnZShTdHJpbmcgdmlld0lkLCBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIHJlc3VsdC5hZGRBbGwoZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllcyh2aWV3SWQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGJ1aWxkTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KA0KLSAgICAgICAgICAgIFN0cmluZyBrZXksIE1hcDxTdHJpbmcsIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+PiBncm91cFN0b3JhZ2UpDQotICAgIHsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGxpc3Q7DQotDQotICAgICAgICBpZihrZXkgIT0gbnVsbCAmJiBrZXkuZW5kc1dpdGgoIioiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4oKTsNCi0gICAgICAgICAgICBmb3IoTWFwLkVudHJ5PFN0cmluZyxMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5Pj4gZW50cnkgOiBncm91cFN0b3JhZ2UuZW50cnlTZXQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldEtleSgpLnN1YnN0cmluZygwLCBlbnRyeS5nZXRLZXkoKS5pbmRleE9mKCJAIikpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhrZXkuc3Vic3RyaW5nKDAsIGtleS5pbmRleE9mKCJAIikpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGRBbGwoZW50cnkuZ2V0VmFsdWUoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGxpc3Q7DQotICAgICAgICB9DQotDQotICAgICAgICBsaXN0ID0gZ3JvdXBTdG9yYWdlLmdldChrZXkpOw0KLSAgICAgICAgcmV0dXJuIChsaXN0ICE9IG51bGwpID8gbGlzdCA6IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzKFN0cmluZyB2aWV3SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzKHZpZXdJZCwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzKFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5tb2RlbFZhbGlkYXRpb25FbnRyaWVzLnNpemUoKSA8IDEpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2FkZCBmb3VuZCBncm91cHMNCi0gICAgICAgIFN0cmluZyBrZXk7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHRMaXN0Rm9yUGFnZSA9IG51bGw7DQotDQotICAgICAgICBpZighIioiLmVxdWFscyhjbGllbnRJZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAga2V5ID0gR3JvdXBVdGlscy5nZXRHcm91cEtleSh2aWV3SWQsIG51bGwpOw0KLSAgICAgICAgICAgIHJlc3VsdExpc3RGb3JQYWdlID0NCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KGtleSwgdGhpcy5tb2RlbFZhbGlkYXRpb25FbnRyaWVzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGtleSA9IEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBjbGllbnRJZCk7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHRMaXN0Rm9yQ29tcG9uZW50ID0NCi0gICAgICAgICAgICAgICAgYnVpbGRNb2RlbFZhbGlkYXRpb25FbnRyeUxpc3Qoa2V5LCB0aGlzLm1vZGVsVmFsaWRhdGlvbkVudHJpZXMpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0TGlzdEZvclBhZ2UgPT0gbnVsbCB8fCByZXN1bHRMaXN0Rm9yUGFnZS5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdExpc3RGb3JDb21wb25lbnQ7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKHJlc3VsdExpc3RGb3JDb21wb25lbnQuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRMaXN0Rm9yUGFnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBtZXJnZVJlc3VsdHMocmVzdWx0TGlzdEZvclBhZ2UsIHJlc3VsdExpc3RGb3JDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbWVyZ2VSZXN1bHRzKA0KLSAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IHJlc3VsdExpc3RGb3JQYWdlLCBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHRMaXN0Rm9yQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtZXJnZWRSZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PigpOw0KLSAgICAgICAgbWVyZ2VkUmVzdWx0LmFkZEFsbChyZXN1bHRMaXN0Rm9yUGFnZSk7DQotICAgICAgICBtZXJnZWRSZXN1bHQuYWRkQWxsKHJlc3VsdExpc3RGb3JDb21wb25lbnQpOw0KLSAgICAgICAgcmV0dXJuIG1lcmdlZFJlc3VsdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgzMTAxMi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5TdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIG1vZGVsLXZhbGlkYXRpb24gZW50cmllcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlcg0KLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8TW9kZWxWYWxpZGF0aW9uU3RvcmFnZT4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfTU9ERUxfVkFMSURBVElPTjpLRVkiOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvTW9kZWxWYWxpZGF0aW9uRW50cnkuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvTW9kZWxWYWxpZGF0aW9uRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc4YThmMy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5BUEk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihBUEkpDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvbkVudHJ5DQotew0KLSAgICBwcml2YXRlIFVJQ29tcG9uZW50IGNvbXBvbmVudDsNCi0gICAgcHJpdmF0ZSBMaXN0PENsYXNzPiBncm91cHMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLSAgICBwcml2YXRlIExpc3Q8T2JqZWN0PiB2YWxpZGF0aW9uVGFyZ2V0cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGlzcGxheU1lc3NhZ2VJbmxpbmUgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgY3VzdG9tTWVzc2FnZSA9IE1vZGVsVmFsaWRhdGlvbi5ERUZBVUxUOw0KLSAgICANCi0gICAgLy90aGUgb3JpZ2luYWwgc291cmNlIHdoZXJlIHRoZSBleHR2YWwtYnYgbWV0YS1kYXRhIGhhcyBiZWVuIGZvdW5kDQotICAgIHByaXZhdGUgT2JqZWN0IG1ldGFEYXRhU291cmNlT2JqZWN0Ow0KLSAgICBwcml2YXRlIFN0cmluZyB2aWV3SWQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRWaWV3SWQoKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkR3JvdXAoQ2xhc3MgZ3JvdXApDQotICAgIHsNCi0gICAgICAgIGlmKCF0aGlzLmdyb3Vwcy5jb250YWlucyhncm91cCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoISh0aGlzLmdyb3VwcyBpbnN0YW5jZW9mIEFycmF5TGlzdCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBuZXdHcm91cExpc3QgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLQ0KLSAgICAgICAgICAgICAgICBmb3IoQ2xhc3MgY3VycmVudENsYXNzIDogdGhpcy5ncm91cHMpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG5ld0dyb3VwTGlzdC5hZGQoY3VycmVudENsYXNzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB0aGlzLmdyb3VwcyA9IG5ld0dyb3VwTGlzdDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdGhpcy5ncm91cHMuYWRkKGdyb3VwKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVHcm91cChDbGFzcyBncm91cCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5ncm91cHMucmVtb3ZlKGdyb3VwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRWYWxpZGF0aW9uVGFyZ2V0KE9iamVjdCB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIGlmKCF0aGlzLnZhbGlkYXRpb25UYXJnZXRzLmNvbnRhaW5zKHRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoISh0aGlzLnZhbGlkYXRpb25UYXJnZXRzIGluc3RhbmNlb2YgQXJyYXlMaXN0KSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIExpc3Q8T2JqZWN0PiB2YWxpZGF0aW9uVGFyZ2V0TGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KLQ0KLSAgICAgICAgICAgICAgICBmb3IoT2JqZWN0IGN1cnJlbnRUYXJnZXQgOiB0aGlzLnZhbGlkYXRpb25UYXJnZXRzKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0TGlzdC5hZGQoY3VycmVudFRhcmdldCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uVGFyZ2V0cyA9IHZhbGlkYXRpb25UYXJnZXRMaXN0Ow0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25UYXJnZXRzLmFkZCh0YXJnZXQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIFVJQ29tcG9uZW50IGdldENvbXBvbmVudCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KFVJQ29tcG9uZW50IGNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENsYXNzW10gZ2V0R3JvdXBzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzLnRvQXJyYXkobmV3IENsYXNzW3RoaXMuZ3JvdXBzLnNpemUoKV0pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwcyhMaXN0PENsYXNzPiBncm91cHMpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZ3JvdXBzID0gZ3JvdXBzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZ2V0VmFsaWRhdGlvblRhcmdldHMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblRhcmdldHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRNZXRhRGF0YVNvdXJjZU9iamVjdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YVNvdXJjZU9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVNvdXJjZU9iamVjdChPYmplY3QgbWV0YURhdGFTb3VyY2VPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFTb3VyY2VPYmplY3QgPSBtZXRhRGF0YVNvdXJjZU9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlJlZHVuZGFudElmU3RhdGVtZW50In0pDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmICh0aGlzID09IG8pDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IHRoYXQgPSAoTW9kZWxWYWxpZGF0aW9uRW50cnkpIG87DQotDQotICAgICAgICBpZiAoY29tcG9uZW50ICE9IG51bGwgPyAhY29tcG9uZW50LmVxdWFscyh0aGF0LmNvbXBvbmVudCkgOiB0aGF0LmNvbXBvbmVudCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghZ3JvdXBzLmVxdWFscyh0aGF0Lmdyb3VwcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCF2YWxpZGF0aW9uVGFyZ2V0cy5lcXVhbHModGhhdC52YWxpZGF0aW9uVGFyZ2V0cykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNEaXNwbGF5TWVzc2FnZUlubGluZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkaXNwbGF5TWVzc2FnZUlubGluZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TWVzc2FnZUlubGluZShib29sZWFuIGRpc3BsYXlNZXNzYWdlSW5saW5lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRpc3BsYXlNZXNzYWdlSW5saW5lID0gZGlzcGxheU1lc3NhZ2VJbmxpbmU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDdXN0b21NZXNzYWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tTWVzc2FnZShTdHJpbmcgY3VzdG9tTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jdXN0b21NZXNzYWdlID0gY3VzdG9tTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIGludCByZXN1bHQgPSBjb21wb25lbnQgIT0gbnVsbCA/IGNvbXBvbmVudC5oYXNoQ29kZSgpIDogMDsNCi0gICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgZ3JvdXBzLmhhc2hDb2RlKCk7DQotICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIHZhbGlkYXRpb25UYXJnZXRzLmhhc2hDb2RlKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Vmlld0lkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZpZXdJZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWaWV3SWQoU3RyaW5nIHZpZXdJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy52aWV3SWQgPSB2aWV3SWQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiZGY5My4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogc3VnZ2VzdGVkIGludGVyZmFjZSBmb3IgYSBtb2RlbC12YWxpZGF0aW9uIHN0b3JhZ2UNCi0gKiA8cC8+DQotICogaXQgYWxsb3dzIHRvIG1hbmFnZSBtb2RlbC12YWxpZGF0aW9uLWVudHJpZXMgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHZvaWQgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLQ0KLSAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9CZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvbWFwcGVyL0JlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWMyZTM5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvbWFwcGVyL0JlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uQmVhblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuRGVmYXVsdEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEJlYW5WYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoa2V5KSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9tYXBwZXIvTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE2MjA1MC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLkRlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoTW9kZWxWYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoa2V5KSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvQmVhblZhbGlkYXRpb25VdGlscy5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9CZWFuVmFsaWRhdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NmQxNzMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9CZWFuVmFsaWRhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLk1vZGVsVmFsaWRhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5GYWNlc01lc3NhZ2VIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25VdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPR0dFUiA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEJlYW5WYWxpZGF0aW9uVXRpbHMuY2xhc3MpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzIGJ2bWkgPSBuZXcgRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscyhMT0dHRVIpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVE9SX0ZBQ1RPUllfS0VZID0gImphdmF4LmZhY2VzLnZhbGlkYXRvci5iZWFuVmFsaWRhdG9yLlZhbGlkYXRvckZhY3RvcnkiOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTWV0YURhdGFUb0NvbnRleHQoDQotICAgICAgICAgICAgVUlDb21wb25lbnQgY29tcG9uZW50LCBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLCBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZ1tdIGtleSA9IHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKS5zcGxpdCgiXFwuIik7DQotDQotICAgICAgICBPYmplY3QgZmlyc3RCZWFuID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKGtleVswXSk7DQotDQotICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgIGJ2bWkuZXh0cmFjdEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGEocHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBrZXksDQotICAgICAgICAgICAgICAgIGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotDQotICAgICAgICBidm1pLnByb2Nlc3NFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhKGNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc0NvbnN0cmFpbnRWaW9sYXRpb25zKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbj4gdmlvbGF0aW9ucykNCi0gICAgew0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2U7DQotICAgICAgICBmb3IgKENvbnN0cmFpbnRWaW9sYXRpb24gdmlvbGF0aW9uIDogdmlvbGF0aW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2UgPSBjcmVhdGVGYWNlc01lc3NhZ2VGb3JDb25zdHJhaW50VmlvbGF0aW9uKHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHZpb2xhdGlvbik7DQotDQotICAgICAgICAgICAgaWYgKGZhY2VzTWVzc2FnZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGJ2bWkucHJvY2Vzc0ZhY2VzTWVzc2FnZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0LCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHJvY2Vzc1Zpb2xhdGlvbk1lc3NhZ2VzKGZhY2VzTWVzc2FnZUhvbGRlckxpc3QpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjZXNNZXNzYWdlIGNyZWF0ZUZhY2VzTWVzc2FnZUZvckNvbnN0cmFpbnRWaW9sYXRpb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJhaW50VmlvbGF0aW9uIHZpb2xhdGlvbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZpb2xhdGlvbk1lc3NhZ2UgPSB2aW9sYXRpb24uZ2V0TWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGxhYmVsZWRNZXNzYWdlU3VtbWFyeSA9IGJ2bWkuY3JlYXRlTGFiZWxlZE1lc3NhZ2UodmlvbGF0aW9uTWVzc2FnZSwgZmFsc2UpOw0KLSAgICAgICAgU3RyaW5nIGxhYmVsZWRNZXNzYWdlRGV0YWlsID0gYnZtaS5jcmVhdGVMYWJlbGVkTWVzc2FnZSh2aW9sYXRpb25NZXNzYWdlLCB0cnVlKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSA9IGJ2bWkuY2FsY1NldmVyaXR5KHZpb2xhdGlvbik7DQotDQotICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uID0gYnZtaQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yRXhjZXB0aW9uKGxhYmVsZWRNZXNzYWdlU3VtbWFyeSwgbGFiZWxlZE1lc3NhZ2VEZXRhaWwsIHNldmVyaXR5KTsNCi0NCi0gICAgICAgIGlmICghYnZtaS5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycyh1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGJ2bWkuaXNNZXNzYWdlVGV4dFVuY2hhbmdlZCh2YWxpZGF0b3JFeGNlcHRpb24sIGxhYmVsZWRNZXNzYWdlU3VtbWFyeSwgbGFiZWxlZE1lc3NhZ2VEZXRhaWwpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc2V2ZXJpdHksIHZpb2xhdGlvbk1lc3NhZ2UsIHZpb2xhdGlvbk1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc2V2ZXJpdHksDQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U3VtbWFyeSgpLA0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldERldGFpbCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc1Zpb2xhdGlvbk1lc3NhZ2VzKExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiB2aW9sYXRpb25NZXNzYWdlSG9sZGVyTGlzdCkNCi0gICAgew0KLSAgICAgICAgaWYgKHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0ID09IG51bGwgfHwgdmlvbGF0aW9uTWVzc2FnZUhvbGRlckxpc3QuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VMaXN0V2l0aExvd1NldmVyaXR5ID0NCi0gICAgICAgICAgICAgICAgYnZtaS5nZXRGYWNlc01lc3NhZ2VMaXN0V2l0aExvd1NldmVyaXR5KHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0KTsNCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VMaXN0V2l0aEhpZ2hTZXZlcml0eSA9DQotICAgICAgICAgICAgICAgIGJ2bWkuZ2V0RmFjZXNNZXNzYWdlTGlzdFdpdGhIaWdoU2V2ZXJpdHkodmlvbGF0aW9uTWVzc2FnZUhvbGRlckxpc3QpOw0KLQ0KLSAgICAgICAgYnZtaS5hZGRNZXNzYWdlcyhmYWNlc01lc3NhZ2VMaXN0V2l0aEhpZ2hTZXZlcml0eSk7DQotICAgICAgICBidm1pLmFkZE1lc3NhZ2VzKGZhY2VzTWVzc2FnZUxpc3RXaXRoTG93U2V2ZXJpdHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yRmFjdG9yeSBnZXREZWZhdWx0VmFsaWRhdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gYXBwbGljYXRpb25NYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25NYXAoKTsNCi0gICAgICAgIFZhbGlkYXRvckZhY3RvcnkgdmFsaWRhdG9yRmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBpZiAoYXBwbGljYXRpb25NYXAuY29udGFpbnNLZXkoVkFMSURBVE9SX0ZBQ1RPUllfS0VZKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoYXBwbGljYXRpb25NYXAuZ2V0KFZBTElEQVRPUl9GQUNUT1JZX0tFWSkgaW5zdGFuY2VvZiBWYWxpZGF0b3JGYWN0b3J5KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yRmFjdG9yeSA9IChWYWxpZGF0b3JGYWN0b3J5KSBhcHBsaWNhdGlvbk1hcC5nZXQoVkFMSURBVE9SX0ZBQ1RPUllfS0VZKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmFsaWRhdG9yRmFjdG9yeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRvckZhY3RvcnkgPSBWYWxpZGF0aW9uLmJ1aWxkRGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKTsNCi0gICAgICAgICAgICBhcHBsaWNhdGlvbk1hcC5wdXQoVkFMSURBVE9SX0ZBQ1RPUllfS0VZLCB2YWxpZGF0b3JGYWN0b3J5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscy5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYTY3OWUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uQmVhblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLmV4dHJhY3Rvci5EZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuTW9kZWxWYWxpZGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkVMSGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5GYWNlc01lc3NhZ2VIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFJbnRlcm5hbHMNCi17DQotICAgIHByaXZhdGUgTG9nIGxvZ2dlcjsNCi0gICAgcHJpdmF0ZSBMYWJlbGVkTWVzc2FnZUludGVybmFscyBsYWJlbGVkTWVzc2FnZUludGVybmFscyA9IG5ldyBMYWJlbGVkTWVzc2FnZUludGVybmFscygpOw0KLQ0KLSAgICBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzKExvZyBsb2dnZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyOw0KLSAgICB9DQotDQotICAgIHZvaWQgZXh0cmFjdEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGEoUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10ga2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgaW5zcGVjdEZpcnN0QmVhbihwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgaW5zcGVjdEZpcnN0UHJvcGVydHkocHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAga2V5LA0KLSAgICAgICAgICAgICAgICBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIGtleS5sZW5ndGggPT0gMik7DQotDQotICAgICAgICBpbnNwZWN0QmFzZU9mUHJvcGVydHkocHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgIGluc3BlY3RMYXN0UHJvcGVydHkocHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIHByb2Nlc3NFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhKFVJQ29tcG9uZW50IGNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgPSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBTdHJpbmcgY3VycmVudFZpZXdJZCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldFZpZXdJZCgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGNsaWVudElkID0gY29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotDQotICAgICAgICBwcm9jZXNzRm91bmRHcm91cHMoZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LCBjdXJyZW50Vmlld0lkLCBjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgcHJvY2Vzc1Jlc3RyaWN0ZWRHcm91cHMoZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LCBjdXJyZW50Vmlld0lkLCBjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbik7DQotDQotICAgICAgICBpbml0TW9kZWxWYWxpZGF0aW9uKGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCwgY29tcG9uZW50LCBwcm9wZXJ0eURldGFpbHMsDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RGaXJzdEJlYW4oYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgZmlyc3RCZWFuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzQ2xhc3MoZmlyc3RCZWFuLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5zcGVjdEZpcnN0UHJvcGVydHkoYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10ga2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzTGFzdFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzRmllbGRzQW5kUHJvcGVydGllcyhrZXlbMF0gKyAiLiIgKyBrZXlbMV0sDQotICAgICAgICAgICAgICAgIGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAga2V5WzFdLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBpc0xhc3RQcm9wZXJ0eSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RCYXNlT2ZQcm9wZXJ0eShQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RMYXN0UHJvcGVydHkoUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzRmllbGRzQW5kUHJvcGVydGllcygNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzLmdldEtleSgpLA0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgdHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDbGFzcyhPYmplY3Qgb2JqZWN0VG9JbnNwZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBDbGFzcyBjbGFzc1RvSW5zcGVjdCA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3Mob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCkpOw0KLQ0KLSAgICAgICAgd2hpbGUgKCFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc1RvSW5zcGVjdC5nZXROYW1lKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyYW5zZmVyR3JvdXBWYWxpZGF0aW9uSW5mb3JtYXRpb25Ub0ZvdW5kR3JvdXBzKG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhvYmplY3RUb0luc3BlY3QuZ2V0Q2xhc3MoKSwgb2JqZWN0VG9JbnNwZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgICAgIGNsYXNzVG9JbnNwZWN0ID0gY2xhc3NUb0luc3BlY3QuZ2V0U3VwZXJjbGFzcygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmllbGRzQW5kUHJvcGVydGllcyhTdHJpbmcga2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGJhc2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0xhc3RQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3RvcigpDQotICAgICAgICAgICAgICAgIC5leHRyYWN0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgbmV3IFByb3BlcnR5RGV0YWlscyhrZXksIGJhc2UsIHByb3BlcnR5KSk7DQotDQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSA6IHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5VG9Qcm9jZXNzTWV0YURhdGEoKEJlYW5WYWxpZGF0aW9uKSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5VG9DcmVhdGVOZXdUYXJnZXQoYmFzZSwgcHJvcGVydHksIGlzTGFzdFByb3BlcnR5KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmIChtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdGlvbi5MaXN0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm9yIChCZWFuVmFsaWRhdGlvbiBjdXJyZW50QmVhblZhbGlkYXRpb24gOiAoKEJlYW5WYWxpZGF0aW9uLkxpc3QpIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSkudmFsdWUoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdHJ5VG9Qcm9jZXNzTWV0YURhdGEoY3VycmVudEJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlUb0NyZWF0ZU5ld1RhcmdldChiYXNlLCBwcm9wZXJ0eSwgaXNMYXN0UHJvcGVydHkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCB0cnlUb0NyZWF0ZU5ld1RhcmdldChPYmplY3QgYmFzZSwgU3RyaW5nIHByb3BlcnR5LCBib29sZWFuIGlzTGFzdFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpZihpc0xhc3RQcm9wZXJ0eSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYmFzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE9iamVjdCByZXN1bHQgPSBnZXRWYWx1ZU9mUHJvcGVydHkoYmFzZSwgcHJvcGVydHkpOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBiYXNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBnZXRWYWx1ZU9mUHJvcGVydHkoT2JqZWN0IGJhc2UsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHByb3BlcnR5LnN1YnN0cmluZygxLCBwcm9wZXJ0eS5sZW5ndGgoKSk7DQotDQotICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoYmFzZS5nZXRDbGFzcygpKTsNCi0NCi0gICAgICAgIE1ldGhvZCB0YXJnZXRNZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodGFyZ2V0Q2xhc3MsICJnZXQiICsgcHJvcGVydHkpOw0KLQ0KLSAgICAgICAgaWYgKHRhcmdldE1ldGhvZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh0YXJnZXRDbGFzcywgImlzIiArIHByb3BlcnR5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgImNsYXNzICIgKyB0YXJnZXRDbGFzcyArICIgaGFzIG5vIHB1YmxpYyBnZXQvaXMgIiArIHByb3BlcnR5LnRvTG93ZXJDYXNlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZChiYXNlLCB0YXJnZXRNZXRob2QpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRm91bmRHcm91cHMoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudFZpZXdJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xpZW50SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIC8qDQotICAgICAgICAgKiBhZGQgZm91bmQgZ3JvdXBzIHRvIGNvbnRleHQNCi0gICAgICAgICAqLw0KLSAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50R3JvdXBDbGFzcyA6IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5hZGRHcm91cChjdXJyZW50R3JvdXBDbGFzcywgY3VycmVudFZpZXdJZCwgY2xpZW50SWQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUmVzdHJpY3RlZEdyb3VwcyhFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRWaWV3SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xpZW50SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICAvKg0KLSAgICAgICAgICogYWRkIHJlc3RyaWN0ZWQgZ3JvdXBzDQotICAgICAgICAgKi8NCi0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEdyb3VwQ2xhc3MgOiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5yZXN0cmljdEdyb3VwKGN1cnJlbnRHcm91cENsYXNzLCBjdXJyZW50Vmlld0lkLCBjbGllbnRJZCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRNb2RlbFZhbGlkYXRpb24oRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgY29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIC8qDQotICAgICAgICAgKiBhZGQgbW9kZWwgdmFsaWRhdGlvbiBlbnRyeSBsaXN0DQotICAgICAgICAgKi8NCi0gICAgICAgIGZvciAoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkgOiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yIChDbGFzcyByZXN0cmljdGVkR3JvdXAgOiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkucmVtb3ZlR3JvdXAocmVzdHJpY3RlZEdyb3VwKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldEdyb3VwcygpLmxlbmd0aCA+IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0VmFsaWRhdGlvblRhcmdldHMoKS5pc0VtcHR5KCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmFkZFZhbGlkYXRpb25UYXJnZXQocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuc2V0Q29tcG9uZW50KGNvbXBvbmVudCk7DQotICAgICAgICAgICAgICAgIGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5hZGRNb2RlbFZhbGlkYXRpb25FbnRyeShtb2RlbFZhbGlkYXRpb25FbnRyeSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ0ZXN0IHByb3h5IHN1cHBvcnQiKQ0KLSAgICBwcml2YXRlIHZvaWQgdHJhbnNmZXJHcm91cFZhbGlkYXRpb25JbmZvcm1hdGlvblRvRm91bmRHcm91cHMoDQotICAgICAgICAgICAgT2JqZWN0IG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKG9iamVjdFRvSW5zcGVjdC5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoQmVhblZhbGlkYXRpb24uY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvUHJvY2Vzc01ldGFEYXRhKG9iamVjdFRvSW5zcGVjdC5nZXRDbGFzcygpLmdldEFubm90YXRpb24oQmVhblZhbGlkYXRpb24uY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0VG9JbnNwZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCkuaXNBbm5vdGF0aW9uUHJlc2VudChCZWFuVmFsaWRhdGlvbi5MaXN0LmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IgKEJlYW5WYWxpZGF0aW9uIGN1cnJlbnRCZWFuVmFsaWRhdGlvbiA6DQotICAgICAgICAgICAgICAgICAgICAob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCkuZ2V0QW5ub3RhdGlvbihCZWFuVmFsaWRhdGlvbi5MaXN0LmNsYXNzKSkudmFsdWUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeVRvUHJvY2Vzc01ldGFEYXRhKGN1cnJlbnRCZWFuVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUb0luc3BlY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbnRlcmZhY2VzKENsYXNzIGN1cnJlbnRDbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IGN1cnJlbnRDbGFzcy5nZXRJbnRlcmZhY2VzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJhbnNmZXJHcm91cFZhbGlkYXRpb25JbmZvcm1hdGlvblRvRm91bmRHcm91cHMobWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotDQotICAgICAgICAgICAgcHJvY2Vzc0ludGVyZmFjZXMoY3VycmVudEludGVyZmFjZSwgbWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvUHJvY2Vzc01ldGFEYXRhKEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgZm9yIChTdHJpbmcgY3VycmVudFZpZXdJZCA6IGJlYW5WYWxpZGF0aW9uLnZpZXdJZHMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodXNlTWV0YURhdGFGb3JWaWV3SWQoYmVhblZhbGlkYXRpb24sIGN1cnJlbnRWaWV3SWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01ldGFEYXRhKGJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlTWV0YURhdGFGb3JWaWV3SWQoQmVhblZhbGlkYXRpb24gYmVhblZhbGlkYXRpb24sIFN0cmluZyBjdXJyZW50Vmlld0lkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKGN1cnJlbnRWaWV3SWQuZXF1YWxzKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldFZpZXdJZCgpKSB8fA0KLSAgICAgICAgICAgICAgICBjdXJyZW50Vmlld0lkLmVxdWFscygiKiIpKSAmJiBpc1ZhbGlkYXRpb25QZXJtaXR0ZWQoYmVhblZhbGlkYXRpb24pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTWV0YURhdGEoQmVhblZhbGlkYXRpb24gYmVhblZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAocHJvY2Vzc01vZGVsVmFsaWRhdGlvbiAmJiBpc01vZGVsVmFsaWRhdGlvbihiZWFuVmFsaWRhdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoDQotICAgICAgICAgICAgICAgICAgICBiZWFuVmFsaWRhdGlvbiwgbWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoIWlzTW9kZWxWYWxpZGF0aW9uKGJlYW5WYWxpZGF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzR3JvdXBzKA0KLSAgICAgICAgICAgICAgICAgICAgYmVhblZhbGlkYXRpb24sIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLCByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZGF0aW9uUGVybWl0dGVkKEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBFTEhlbHBlciBlbEhlbHBlciA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjb25kaXRpb24gOiBiZWFuVmFsaWRhdGlvbi5jb25kaXRpb25zKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVsSGVscGVyLmlzRUxUZXJtV2VsbEZvcm1lZChjb25kaXRpb24pICYmDQotICAgICAgICAgICAgICAgICAgICBlbEhlbHBlci5pc0VMVGVybVZhbGlkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgY29uZGl0aW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGVsSGVscGVyLmdldFZhbHVlT2ZFeHByZXNzaW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oY29uZGl0aW9uKSkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAodGhpcy5sb2dnZXIuaXNFcnJvckVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoImFuIGludmFsaWQgY29uZGl0aW9uIGlzIHVzZWQ6ICIgKyBjb25kaXRpb24pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc01vZGVsVmFsaWRhdGlvbihCZWFuVmFsaWRhdGlvbiBiZWFuVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGJlYW5WYWxpZGF0aW9uLm1vZGVsVmFsaWRhdGlvbigpLmlzQWN0aXZlKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkgPSBuZXcgTW9kZWxWYWxpZGF0aW9uRW50cnkoKTsNCi0NCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LnNldEdyb3VwcyhBcnJheXMuYXNMaXN0KGJlYW5WYWxpZGF0aW9uLnVzZUdyb3VwcygpKSk7DQotICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5zZXREaXNwbGF5TWVzc2FnZUlubGluZShiZWFuVmFsaWRhdGlvbi5tb2RlbFZhbGlkYXRpb24oKS5kaXNwbGF5SW5saW5lKCkpOw0KLSAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuc2V0Q3VzdG9tTWVzc2FnZShiZWFuVmFsaWRhdGlvbi5tb2RlbFZhbGlkYXRpb24oKS5tZXNzYWdlKCkpOw0KLSAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuc2V0TWV0YURhdGFTb3VyY2VPYmplY3QobWV0YURhdGFTb3VyY2VPYmplY3QpOw0KLQ0KLSAgICAgICAgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQ7DQotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0RXhwcmVzc2lvbiA6IGJlYW5WYWxpZGF0aW9uLm1vZGVsVmFsaWRhdGlvbigpLnZhbGlkYXRpb25UYXJnZXRzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKE1vZGVsVmFsaWRhdGlvbi5ERUZBVUxULmVxdWFscyh2YWxpZGF0aW9uVGFyZ2V0RXhwcmVzc2lvbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCA9IHRyeVRvUmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFeHByZXNzaW9uKHZhbGlkYXRpb25UYXJnZXRFeHByZXNzaW9uKTsNCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblRhcmdldCAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuYWRkVmFsaWRhdGlvblRhcmdldCh2YWxpZGF0aW9uVGFyZ2V0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoYmVhblZhbGlkYXRpb24ucmVzdHJpY3RHcm91cHMoKS5sZW5ndGggPiAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24uYWRkQWxsKEFycmF5cy5hc0xpc3QoYmVhblZhbGlkYXRpb24ucmVzdHJpY3RHcm91cHMoKSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldFZhbGlkYXRpb25UYXJnZXRzKCkuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmFkZFZhbGlkYXRpb25UYXJnZXQobWV0YURhdGFTb3VyY2VPYmplY3QpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LmFkZChtb2RlbFZhbGlkYXRpb25FbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgdHJ5VG9SZXNvbHZlVmFsaWRhdGlvblRhcmdldEV4cHJlc3Npb24oU3RyaW5nIHZhbGlkYXRpb25UYXJnZXRFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWxpZGF0aW9uVGFyZ2V0RXhwcmVzc2lvbik7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0dyb3VwcyhCZWFuVmFsaWRhdGlvbiBiZWFuVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLmFkZEFsbChBcnJheXMuYXNMaXN0KGJlYW5WYWxpZGF0aW9uLnVzZUdyb3VwcygpKSk7DQotDQotICAgICAgICBpZiAoYmVhblZhbGlkYXRpb24ucmVzdHJpY3RHcm91cHMoKS5sZW5ndGggPiAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24uYWRkQWxsKEFycmF5cy5hc0xpc3QoYmVhblZhbGlkYXRpb24ucmVzdHJpY3RHcm91cHMoKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIFN0cmluZyBjcmVhdGVMYWJlbGVkTWVzc2FnZShTdHJpbmcgdmlvbGF0aW9uTWVzc2FnZSwgYm9vbGVhbiBpc0RldGFpbE1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmxhYmVsZWRNZXNzYWdlSW50ZXJuYWxzLmNyZWF0ZUxhYmVsZWRNZXNzYWdlKHZpb2xhdGlvbk1lc3NhZ2UsIGlzRGV0YWlsTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IGNhbGNTZXZlcml0eShDb25zdHJhaW50VmlvbGF0aW9uPD8+IHZpb2xhdGlvbikNCi0gICAgew0KLSAgICAgICAgZm9yIChDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD4gcGF5bG9hZCA6IHZpb2xhdGlvbi5nZXRDb25zdHJhaW50RGVzY3JpcHRvcigpLmdldFBheWxvYWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MpLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKFZpb2xhdGlvblNldmVyaXR5LkluZm8uY2xhc3MpLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0lORk87DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKFZpb2xhdGlvblNldmVyaXR5LkZhdGFsLmNsYXNzKS5pc0Fzc2lnbmFibGVGcm9tKHBheWxvYWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9GQVRBTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SOw0KLSAgICB9DQotDQotICAgIHZvaWQgcHJvY2Vzc0ZhY2VzTWVzc2FnZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0LCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyID0gbmV3IEZhY2VzTWVzc2FnZUhvbGRlcihmYWNlc01lc3NhZ2UpOw0KLQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlSG9sZGVyLnNldENsaWVudElkKHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCkpOw0KLQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlSG9sZGVyTGlzdC5hZGQoZmFjZXNNZXNzYWdlSG9sZGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBib29sZWFuIGV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgbnVsbCwNCi0gICAgICAgICAgICAgICAgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgIG51bGwpOw0KLSAgICB9DQotDQotICAgIGJvb2xlYW4gaXNNZXNzYWdlVGV4dFVuY2hhbmdlZCgNCi0gICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLCBTdHJpbmcgdmlvbGF0aW9uU3VtbWFyeU1lc3NhZ2UsIFN0cmluZyB2aW9sYXRpb25EZXRhaWxNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmlvbGF0aW9uU3VtbWFyeU1lc3NhZ2UuZXF1YWxzKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTdW1tYXJ5KCkpICYmDQotICAgICAgICAgICAgICAgIHZpb2xhdGlvbkRldGFpbE1lc3NhZ2UuZXF1YWxzKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKS5nZXREZXRhaWwoKSk7DQotICAgIH0NCi0NCi0gICAgVmFsaWRhdG9yRXhjZXB0aW9uIGNyZWF0ZVZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICBTdHJpbmcgdmlvbGF0aW9uU3VtbWFyeU1lc3NhZ2UsIFN0cmluZyB2aW9sYXRpb25EZXRhaWxNZXNzYWdlLCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc2V2ZXJpdHksIHZpb2xhdGlvblN1bW1hcnlNZXNzYWdlLCB2aW9sYXRpb25EZXRhaWxNZXNzYWdlKSk7DQotICAgIH0NCi0NCi0gICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZUxpc3RXaXRoTG93U2V2ZXJpdHkoDQotICAgICAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IHZpb2xhdGlvbk1lc3NhZ2VzKQ0KLSAgICB7DQotICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+KCk7DQotDQotICAgICAgICBmb3IgKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIgOiB2aW9sYXRpb25NZXNzYWdlcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4uZXF1YWxzKGZhY2VzTWVzc2FnZUhvbGRlci5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0lORk8uZXF1YWxzKGZhY2VzTWVzc2FnZUhvbGRlci5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZmFjZXNNZXNzYWdlSG9sZGVyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBnZXRGYWNlc01lc3NhZ2VMaXN0V2l0aEhpZ2hTZXZlcml0eSgNCi0gICAgICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gdmlvbGF0aW9uTWVzc2FnZUhvbGRlckxpc3QpDQotICAgIHsNCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgICAgIGZvciAoRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlciA6IHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IuZXF1YWxzKGZhY2VzTWVzc2FnZUhvbGRlci5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMLmVxdWFscyhmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGZhY2VzTWVzc2FnZUhvbGRlcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIGFkZE1lc3NhZ2VzKExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0V2l0aExvd1NldmVyaXR5KQ0KLSAgICB7DQotICAgICAgICBmb3IgKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIgOiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0V2l0aExvd1NldmVyaXR5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudElkKA0KLSAgICAgICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlSG9sZGVyLmdldENsaWVudElkKCksIGZhY2VzTWVzc2FnZUhvbGRlci5nZXRGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9MYWJlbGVkTWVzc2FnZUludGVybmFscy5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9MYWJlbGVkTWVzc2FnZUludGVybmFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDBiNzgzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvTGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgTGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMNCi17DQotICAgIC8vdGhlcmUgaXMgbm8gY29uY3VycmVuY3kgaXNzdWUgaGVyZSAtIGl0IGFsd2F5cyBsZWFkcyB0byB0aGUgc2FtZSByZXN1bHQNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVmYXVsdFN1bW1hcnlNZXNzYWdlVGVtcGxhdGUgPSAiezF9OiB7MH0iOw0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZWZhdWx0RGV0YWlsTWVzc2FnZVRlbXBsYXRlID0gInsxfTogezB9IjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3VtbWFyeU1lc3NhZ2VUZW1wbGF0ZSA9IGRlZmF1bHRTdW1tYXJ5TWVzc2FnZVRlbXBsYXRlOw0KLSAgICBwcml2YXRlIFN0cmluZyBkZXRhaWxNZXNzYWdlVGVtcGxhdGUgPSBkZWZhdWx0RGV0YWlsTWVzc2FnZVRlbXBsYXRlOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfVkFMSURBVE9SX0JFQU5WQUxJREFUT1JfTUVTU0FHRSA9DQotICAgICAgICAgICAgImphdmF4LmZhY2VzLnZhbGlkYXRvci5CZWFuVmFsaWRhdG9yLk1FU1NBR0UiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfVkFMSURBVE9SX0JFQU5WQUxJREFUT1JfTUVTU0FHRV9ERVRBSUwgPQ0KLSAgICAgICAgICAgICJqYXZheC5mYWNlcy52YWxpZGF0b3IuQmVhblZhbGlkYXRvci5NRVNTQUdFX2RldGFpbCI7DQotDQotICAgIFN0cmluZyBjcmVhdGVMYWJlbGVkTWVzc2FnZShTdHJpbmcgdmlvbGF0aW9uTWVzc2FnZSwgYm9vbGVhbiBpc0RldGFpbE1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIGlmKGlzRGV0YWlsTWVzc2FnZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ5VG9SZXNvbHZlRGV0YWlsTWVzc2FnZSh2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ5VG9SZXNvbHZlU3VtbWFyeU1lc3NhZ2UodmlvbGF0aW9uTWVzc2FnZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHJ5VG9SZXNvbHZlU3VtbWFyeU1lc3NhZ2UoU3RyaW5nIHZpb2xhdGlvbk1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIGlmKHN1bW1hcnlNZXNzYWdlVGVtcGxhdGUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0U3VtbWFyeU1lc3NhZ2VUZW1wbGF0ZS5yZXBsYWNlKCJ7MH0iLCB2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRoaXMuc3VtbWFyeU1lc3NhZ2VUZW1wbGF0ZSA9IGxvYWRTdGFuZGFyZE1lc3NhZ2VUZW1wbGF0ZShmYWxzZSk7DQotDQotICAgICAgICBpZihzdW1tYXJ5TWVzc2FnZVRlbXBsYXRlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxhYmVsZWRNZXNzYWdlKHZpb2xhdGlvbk1lc3NhZ2UsIGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzdW1tYXJ5TWVzc2FnZVRlbXBsYXRlLnJlcGxhY2UoInswfSIsIHZpb2xhdGlvbk1lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvUmVzb2x2ZURldGFpbE1lc3NhZ2UoU3RyaW5nIHZpb2xhdGlvbk1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIGlmKGRldGFpbE1lc3NhZ2VUZW1wbGF0ZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHREZXRhaWxNZXNzYWdlVGVtcGxhdGUucmVwbGFjZSgiezB9IiwgdmlvbGF0aW9uTWVzc2FnZSk7DQotICAgICAgICB9DQotDQotICAgICAgICB0aGlzLmRldGFpbE1lc3NhZ2VUZW1wbGF0ZSA9IGxvYWRTdGFuZGFyZE1lc3NhZ2VUZW1wbGF0ZSh0cnVlKTsNCi0NCi0gICAgICAgIGlmKGRldGFpbE1lc3NhZ2VUZW1wbGF0ZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVMYWJlbGVkTWVzc2FnZSh2aW9sYXRpb25NZXNzYWdlLCB0cnVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBkZXRhaWxNZXNzYWdlVGVtcGxhdGUucmVwbGFjZSgiezB9IiwgdmlvbGF0aW9uTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgbG9hZFN0YW5kYXJkTWVzc2FnZVRlbXBsYXRlKGJvb2xlYW4gaXNEZXRhaWxNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihpc0RldGFpbE1lc3NhZ2UpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gSnNmVXRpbHMuZ2V0TWVzc2FnZUZyb21BcHBsaWNhdGlvbk1lc3NhZ2VCdW5kbGUoDQotICAgICAgICAgICAgICAgICAgICAgICAgSkFWQVhfRkFDRVNfVkFMSURBVE9SX0JFQU5WQUxJREFUT1JfTUVTU0FHRV9ERVRBSUwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gSnNmVXRpbHMuZ2V0TWVzc2FnZUZyb21BcHBsaWNhdGlvbk1lc3NhZ2VCdW5kbGUoDQotICAgICAgICAgICAgICAgICAgICAgICAgSkFWQVhfRkFDRVNfVkFMSURBVE9SX0JFQU5WQUxJREFUT1JfTUVTU0FHRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYzI4OTUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5CZWFuVmFsaWRhdGlvbk1vZHVsZUtleTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5Nb2RlbFZhbGlkYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbC5CZWFuVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkZhY2VzTWVzc2FnZUhvbGRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF0aDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAicmVmYWN0b3IgaW1wbGVtZW50YXRpb24gZGV0YWlscyIpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lciBpbXBsZW1lbnRzIFBoYXNlTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zNDgyMjMzODkzMTg2NzA4ODc4TDsNCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IHBoYXNlRXZlbnQpDQotICAgIHsNCi0gICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImpzcjMwMyBzdGFydCBtb2RlbCB2YWxpZGF0aW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBNYXA8T2JqZWN0LCBMaXN0PENsYXNzPj4gcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIExpc3Q8Q2xhc3M+PigpOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+KCk7DQotDQotICAgICAgICBmb3IgKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5IDogZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllc1RvVmFsaWRhdGUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cywgcmVzdWx0cyk7DQotICAgICAgICB9DQotDQotICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uUmVzdWx0cyhyZXN1bHRzKTsNCi0NCi0gICAgICAgIGV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IocmVzdWx0cyk7DQotDQotICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJqc3IzMDMgdmFsaWRhdGlvbiBmaW5pc2hlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllc1RvVmFsaWRhdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXNUb1ZhbGlkYXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24oTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxPYmplY3QsIExpc3Q8Q2xhc3M+PiBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uOw0KLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248T2JqZWN0Pj4gdmlvbGF0aW9uczsNCi0gICAgICAgIENsYXNzW10gZ3JvdXBzVG9WYWxpZGF0ZTsNCi0NCi0gICAgICAgIGZvciAoT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQgOiBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRWYWxpZGF0aW9uVGFyZ2V0cygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24gPSBjcmVhdGVQcm9wZXJ0eUluZm9ybWF0aW9uKG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0NCi0gICAgICAgICAgICBpZiAoIWV4ZWN1dGVHbG9iYWxCZWZvcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKSwgdmFsaWRhdGlvblRhcmdldCwgcHJvcGVydHlJbmZvcm1hdGlvbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYobW9kZWxWYWxpZGF0aW9uRW50cnkuaXNEaXNwbGF5TWVzc2FnZUlubGluZSgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZ3JvdXBzVG9WYWxpZGF0ZSA9IG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldEdyb3VwcygpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvL2lmIHZpb2xhdGlvbiBzaG91bGQgZGlzcGxheWVkIGlubGluZSB2YWxpZGF0aW9uIGhhcyB0byB0YWtlIHBsYWNlIHdpdGggYWxsIGdyb3Vwcw0KLSAgICAgICAgICAgIC8vd2hpY2ggbWVhbnM6IGdsb2JhbCBtZXNzYWdlcyAtPiBmaWx0ZXIgZ3JvdXBzIGFscmVhZHkgdXNlZCBmb3IgdGhlIHZhbGlkYXRpb24gdGFyZ2V0DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZ3JvdXBzVG9WYWxpZGF0ZSA9IGZpbHRlckdyb3Vwc1RvVmFsaWRhdGUoDQotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnksIHZhbGlkYXRpb25UYXJnZXQsIHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYoIXNob3VsZENvbnRpbnVlVmFsaWRhdGlvbihtb2RlbFZhbGlkYXRpb25FbnRyeSwgZ3JvdXBzVG9WYWxpZGF0ZSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgYWRkUHJvY2Vzc2VkVGFyZ2V0KHZhbGlkYXRpb25UYXJnZXQsIGdyb3Vwc1RvVmFsaWRhdGUsIHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzKTsNCi0gICAgICAgICAgICB2aW9sYXRpb25zID0gdmFsaWRhdGVUYXJnZXQodmFsaWRhdGlvblRhcmdldCwgZ3JvdXBzVG9WYWxpZGF0ZSk7DQotDQotICAgICAgICAgICAgaWYgKHZpb2xhdGlvbnMgIT0gbnVsbCAmJiAhdmlvbGF0aW9ucy5pc0VtcHR5KCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzVmlvbGF0aW9ucyhmYWNlc0NvbnRleHQsIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0LCB2aW9sYXRpb25zLCByZXN1bHRzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBDbGFzc1tdIGZpbHRlckdyb3Vwc1RvVmFsaWRhdGUoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8T2JqZWN0LCBMaXN0PENsYXNzPj4gcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMpDQotICAgIHsNCi0gICAgICAgIGlmKCFwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cy5jb250YWluc0tleSh2YWxpZGF0aW9uVGFyZ2V0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0R3JvdXBzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PENsYXNzPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLSAgICAgICAgTGlzdDxDbGFzcz4gdmFsaWRhdGVkR3JvdXBzID0gcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMuZ2V0KHZhbGlkYXRpb25UYXJnZXQpOw0KLQ0KLSAgICAgICAgZm9yKENsYXNzIGdyb3VwIDogbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0R3JvdXBzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoIXZhbGlkYXRlZEdyb3Vwcy5jb250YWlucyhncm91cCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGdyb3VwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IENsYXNzW3Jlc3VsdC5zaXplKCldKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkQ29udGludWVWYWxpZGF0aW9uKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBDbGFzc1tdIGdyb3Vwc1RvVmFsaWRhdGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAhKGdyb3Vwc1RvVmFsaWRhdGUgPT0gbnVsbCB8fCBncm91cHNUb1ZhbGlkYXRlLmxlbmd0aCA9PSAwKSB8fA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5pc0Rpc3BsYXlNZXNzYWdlSW5saW5lKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFByb2Nlc3NlZFRhcmdldChPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1tdIGdyb3VwcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8T2JqZWN0LCBMaXN0PENsYXNzPj4gcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMpDQotICAgIHsNCi0gICAgICAgIGlmKCFwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cy5jb250YWluc0tleSh2YWxpZGF0aW9uVGFyZ2V0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cy5wdXQodmFsaWRhdGlvblRhcmdldCwgbmV3IEFycmF5TGlzdDxDbGFzcz4oKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PENsYXNzPiB2YWxpZGF0ZWRHcm91cHMgPSBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cy5nZXQodmFsaWRhdGlvblRhcmdldCk7DQotDQotICAgICAgICBmb3IoQ2xhc3MgZ3JvdXAgOiBncm91cHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoIXZhbGlkYXRlZEdyb3Vwcy5jb250YWlucyhncm91cCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0ZWRHcm91cHMuYWRkKGdyb3VwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eUluZm9ybWF0aW9uIGNyZWF0ZVByb3BlcnR5SW5mb3JtYXRpb24oDQotICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb247DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzOw0KLSAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOw0KLSAgICAgICAgaWYgKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMgPSBuZXcgUHJvcGVydHlEZXRhaWxzKG51bGwsIHZhbGlkYXRpb25UYXJnZXQsIG51bGwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5zZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBwcm9wZXJ0eURldGFpbHMpOw0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGV4ZWN1dGVHbG9iYWxCZWZvcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUdsb2JhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIHByb3BlcnR5SW5mb3JtYXRpb24sIEJlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMuZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uLmNsYXNzLmdldE5hbWUoKSwgcHJvcGVydHlJbmZvcm1hdGlvbiwgQmVhblZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248T2JqZWN0Pj4gdmFsaWRhdGVUYXJnZXQoT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsIENsYXNzW10gZ3JvdXBzKQ0KLSAgICB7DQotICAgICAgICBpZihncm91cHMgPT0gbnVsbCB8fCBncm91cHMubGVuZ3RoID09IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBWYWxpZGF0b3JGYWN0b3J5IHZhbGlkYXRvckZhY3RvcnkgPSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0VmFsaWRhdG9yRmFjdG9yeSgpOw0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRvckZhY3RvcnkNCi0gICAgICAgICAgICAgICAgLnVzaW5nQ29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5tZXNzYWdlSW50ZXJwb2xhdG9yKEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkpDQotICAgICAgICAgICAgICAgIC5jb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSh2YWxpZGF0b3JGYWN0b3J5LmdldENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KCkpDQotICAgICAgICAgICAgICAgIC50cmF2ZXJzYWJsZVJlc29sdmVyKHZhbGlkYXRvckZhY3RvcnkuZ2V0VHJhdmVyc2FibGVSZXNvbHZlcigpKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdG9yKCkNCi0gICAgICAgICAgICAgICAgLnZhbGlkYXRlKHZhbGlkYXRpb25UYXJnZXQsIGdyb3Vwcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NWaW9sYXRpb25zKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248T2JqZWN0Pj4gdmlvbGF0aW9ucywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cykNCi0gICAgew0KLSAgICAgICAgLy9qc2YgMi4wIGlzIGFibGUgdG8gZGlzcGxheSBtdWx0aXBsZSBtZXNzYWdlcyBwZXIgY29tcG9uZW50IC0gc28gcHJvY2VzcyBhbGwgdmlvbGF0aW9ucw0KLSAgICAgICAgLy9qc2YgPCAyLjAgd2lsbCBqdXN0IHVzZSB0aGUgZmlyc3Qgb25lIChmb3IgaW5saW5lIG1lc3NhZ2VzIC0gc28gaXQncyBvbmx5IGEgbGl0dGxlIG92ZXJoZWFkKQ0KLSAgICAgICAgSXRlcmF0b3I8Q29uc3RyYWludFZpb2xhdGlvbjxPYmplY3Q+PiB2aW9sYXRpb25zSXRlcmF0b3IgPSB2aW9sYXRpb25zLml0ZXJhdG9yKCk7DQotICAgICAgICBDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4gY29uc3RyYWludFZpb2xhdGlvbjsNCi0gICAgICAgIE1vZGVsVmFsaWRhdGlvblJlc3VsdCByZXN1bHQ7DQotICAgICAgICB3aGlsZSAodmlvbGF0aW9uc0l0ZXJhdG9yLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb0NyZWF0ZU1vZGVsVmFsaWRhdGlvblJlc3VsdChmYWNlc0NvbnRleHQsIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCByZXN1bHRzKTsNCi0NCi0gICAgICAgICAgICByZXN1bHQgPSByZXNvbHZlTW9kZWxWYWxpZGF0aW9uUmVzdWx0KGZhY2VzQ29udGV4dCwgbW9kZWxWYWxpZGF0aW9uRW50cnksIHJlc3VsdHMpOw0KLQ0KLSAgICAgICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb24gPSB2aW9sYXRpb25zSXRlcmF0b3IubmV4dCgpOw0KLSAgICAgICAgICAgIGFkZFZpb2xhdGlvbk1lc3NhZ2UobW9kZWxWYWxpZGF0aW9uRW50cnksIHZhbGlkYXRpb25UYXJnZXQsIGNvbnN0cmFpbnRWaW9sYXRpb24sIHJlc3VsdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvQ3JlYXRlTW9kZWxWYWxpZGF0aW9uUmVzdWx0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cykNCi0gICAgew0KLSAgICAgICAgTW9kZWxWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdDsNCi0gICAgICAgIGlmICghaXNNb2RlbFZhbGlkYXRpb25SZXN1bHRBdmFpbGFibGVGb3IoZmFjZXNDb250ZXh0LCBtb2RlbFZhbGlkYXRpb25FbnRyeSwgcmVzdWx0cykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IE1vZGVsVmFsaWRhdGlvblJlc3VsdCgpOw0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpLmdldENsaWVudElkKGZhY2VzQ29udGV4dCksIHJlc3VsdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNb2RlbFZhbGlkYXRpb25SZXN1bHQgcmVzb2x2ZU1vZGVsVmFsaWRhdGlvblJlc3VsdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHMuZ2V0KG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpLmdldENsaWVudElkKGZhY2VzQ29udGV4dCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc01vZGVsVmFsaWRhdGlvblJlc3VsdEF2YWlsYWJsZUZvcihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByZXN1bHRzLmNvbnRhaW5zS2V5KG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpLmdldENsaWVudElkKGZhY2VzQ29udGV4dCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRWaW9sYXRpb25NZXNzYWdlKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RyYWludFZpb2xhdGlvbjxPYmplY3Q+IGNvbnN0cmFpbnRWaW9sYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvblJlc3VsdCByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIGlmIChtb2RlbFZhbGlkYXRpb25FbnRyeS5pc0Rpc3BsYXlNZXNzYWdlSW5saW5lKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmFkZEZhY2VzTWVzc2FnZUhvbGRlcihjcmVhdGVGYWNlc01lc3NhZ2VIb2xkZXJGb3JDb25zdHJhaW50VmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludFZpb2xhdGlvbiwgbW9kZWxWYWxpZGF0aW9uRW50cnksIHZhbGlkYXRpb25UYXJnZXQsIHRydWUpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQuYWRkRmFjZXNNZXNzYWdlSG9sZGVyKGNyZWF0ZUZhY2VzTWVzc2FnZUhvbGRlckZvckNvbnN0cmFpbnRWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50VmlvbGF0aW9uLCBtb2RlbFZhbGlkYXRpb25FbnRyeSwgdmFsaWRhdGlvblRhcmdldCwgZmFsc2UpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEZhY2VzTWVzc2FnZUhvbGRlciBjcmVhdGVGYWNlc01lc3NhZ2VIb2xkZXJGb3JDb25zdHJhaW50VmlvbGF0aW9uKGZpbmFsIENvbnN0cmFpbnRWaW9sYXRpb24gdmlvbGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGlzcGxheUF0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBmaW5hbCBTdHJpbmcgbmV3VmlvbGF0aW9uTWVzc2FnZSA9IHRyeVRvQ2hhbmdlVmlvbGF0aW9uTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnksIHZhbGlkYXRpb25UYXJnZXQsIHZpb2xhdGlvbik7DQotDQotICAgICAgICBDb25zdHJhaW50VmlvbGF0aW9uIG5ld0NvbnN0cmFpbnRWaW9sYXRpb24gPSBuZXcgQ29uc3RyYWludFZpb2xhdGlvbigpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJpdmF0ZSBDb25zdHJhaW50VmlvbGF0aW9uIHdyYXBwZWQgPSB2aW9sYXRpb247DQotDQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBuZXdWaW9sYXRpb25NZXNzYWdlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VUZW1wbGF0ZSgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRNZXNzYWdlVGVtcGxhdGUoKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRSb290QmVhbigpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSb290QmVhbigpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgQ2xhc3MgZ2V0Um9vdEJlYW5DbGFzcygpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSb290QmVhbkNsYXNzKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0TGVhZkJlYW4oKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0TGVhZkJlYW4oKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIFBhdGggZ2V0UHJvcGVydHlQYXRoKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldFByb3BlcnR5UGF0aCgpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEludmFsaWRWYWx1ZSgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRJbnZhbGlkVmFsdWUoKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIENvbnN0cmFpbnREZXNjcmlwdG9yIGdldENvbnN0cmFpbnREZXNjcmlwdG9yKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldENvbnN0cmFpbnREZXNjcmlwdG9yKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0NCi0NCi0gICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50ID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjbGllbnRJZCA9IG51bGw7DQotDQotICAgICAgICBpZiAoZGlzcGxheUF0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHVpQ29tcG9uZW50ID0gbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCk7DQotICAgICAgICAgICAgY2xpZW50SWQgPSB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlSG9sZGVyIHJlc3VsdCA9IG5ldyBGYWNlc01lc3NhZ2VIb2xkZXIoQmVhblZhbGlkYXRpb25VdGlscw0KLSAgICAgICAgICAgICAgICAuY3JlYXRlRmFjZXNNZXNzYWdlRm9yQ29uc3RyYWludFZpb2xhdGlvbih1aUNvbXBvbmVudCwgdmFsaWRhdGlvblRhcmdldCwgbmV3Q29uc3RyYWludFZpb2xhdGlvbikpOw0KLSAgICAgICAgcmVzdWx0LnNldENsaWVudElkKGNsaWVudElkKTsNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHJ5VG9DaGFuZ2VWaW9sYXRpb25NZXNzYWdlKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJhaW50VmlvbGF0aW9uIHZpb2xhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc0RlZmF1bHRNZXNzYWdlKG1vZGVsVmFsaWRhdGlvbkVudHJ5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGVWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q3VzdG9tTWVzc2FnZSgpLCB2YWxpZGF0aW9uVGFyZ2V0LCB2aW9sYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHZpb2xhdGlvbi5nZXRNZXNzYWdlKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdE1lc3NhZ2UoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBNb2RlbFZhbGlkYXRpb24uREVGQVVMVC5lcXVhbHMobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q3VzdG9tTWVzc2FnZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBpbnRlcnBvbGF0ZVZhbGlkYXRpb25FcnJvck1lc3NhZ2UoU3RyaW5nIGV4dFZhbElubGluZU1lc3NhZ2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwgZmluYWwgQ29uc3RyYWludFZpb2xhdGlvbiB2aW9sYXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpDQotICAgICAgICAgICAgICAgIC5pbnRlcnBvbGF0ZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRWYWxJbmxpbmVNZXNzYWdlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZXNzYWdlSW50ZXJwb2xhdG9yLkNvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IGdldENvbnN0cmFpbnREZXNjcmlwdG9yKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZpb2xhdGlvbi5nZXRDb25zdHJhaW50RGVzY3JpcHRvcigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsaWRhdGVkVmFsdWUoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblRhcmdldDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9EbyhQcmlvcml0eS5NRURJVU0pDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uUmVzdWx0cyhNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMpDQotICAgIHsNCi0gICAgICAgIGZvciAoTW9kZWxWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA6IHJlc3VsdHMudmFsdWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQmVhblZhbGlkYXRpb25VdGlscy5wcm9jZXNzVmlvbGF0aW9uTWVzc2FnZXMocmVzdWx0LmdldEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IoTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgVUlDb21wb25lbnQgY29tcG9uZW50Ow0KLSAgICAgICAgZm9yIChNb2RlbFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0IDogcmVzdWx0cy52YWx1ZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IgKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIgOiByZXN1bHQuZ2V0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29tcG9uZW50ID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgaWYgKGZhY2VzTWVzc2FnZUhvbGRlci5nZXRDbGllbnRJZCgpICE9IG51bGwgJiYgIWZhY2VzTWVzc2FnZUhvbGRlci5nZXRDbGllbnRJZCgpLmVxdWFscygiKiIpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5maW5kQ29tcG9uZW50KGZhY2VzTWVzc2FnZUhvbGRlci5nZXRDbGllbnRJZCgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBleGVjdXRlR2xvYmFsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKGZhY2VzQ29udGV4dCwgY29tcG9uZW50LCBudWxsLCBudWxsKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBwaGFzZUV2ZW50KQ0KLSAgICB7DQotICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuVVBEQVRFX01PREVMX1ZBTFVFUzsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmICh0aGlzID09IG8pDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvblJlc3VsdC5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25SZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjMTk4Yi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvblJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuRmFjZXNNZXNzYWdlSG9sZGVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkxPVywgZGVzY3JpcHRpb24gPSAicmVmYWN0b3IiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgTW9kZWxWYWxpZGF0aW9uUmVzdWx0DQotew0KLSAgICBwcml2YXRlIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEZhY2VzTWVzc2FnZUhvbGRlcihGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZhY2VzTWVzc2FnZUhvbGRlckxpc3QuYWRkKGZhY2VzTWVzc2FnZUhvbGRlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBnZXRGYWNlc01lc3NhZ2VIb2xkZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZUhvbGRlckxpc3Q7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9tZXNzYWdlL2ludGVycG9sYXRvci9EZWZhdWx0TWVzc2FnZUludGVycG9sYXRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9tZXNzYWdlL2ludGVycG9sYXRvci9EZWZhdWx0TWVzc2FnZUludGVycG9sYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTkzMmYyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vbWVzc2FnZS9pbnRlcnBvbGF0b3IvRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24ubWVzc2FnZS5pbnRlcnBvbGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yIGltcGxlbWVudHMgTWVzc2FnZUludGVycG9sYXRvcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgDQotICAgIHByaXZhdGUgTWVzc2FnZUludGVycG9sYXRvciB3cmFwcGVkOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IoTWVzc2FnZUludGVycG9sYXRvciB3cmFwcGVkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgaW50ZXJwb2xhdGUoU3RyaW5nIG1lc3NhZ2VPcktleSwgQ29udGV4dCBjb250ZXh0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZU9yS2V5LCBjb250ZXh0LCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGludGVycG9sYXRlKFN0cmluZyBtZXNzYWdlT3JLZXksIENvbnRleHQgY29udGV4dCwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZC5pbnRlcnBvbGF0ZShtZXNzYWdlT3JLZXksIGNvbnRleHQsIGdldEN1cnJlbnRMb2NhbGUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExvY2FsZSBnZXRDdXJyZW50TG9jYWxlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vbWVzc2FnZS9pbnRlcnBvbGF0b3IvRXh0VmFsTWVzc2FnZUludGVycG9sYXRvckFkYXB0ZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vbWVzc2FnZS9pbnRlcnBvbGF0b3IvRXh0VmFsTWVzc2FnZUludGVycG9sYXRvckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZlOWYzMy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0V4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLm1lc3NhZ2UuaW50ZXJwb2xhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5NZXNzYWdlSW50ZXJwb2xhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyIGV4dGVuZHMgRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3INCi17DQotICAgIHByaXZhdGUgTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcjsNCi0NCi0gICAgcHVibGljIEV4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyKE1lc3NhZ2VJbnRlcnBvbGF0b3Igd3JhcHBlZCwgTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcikNCi0gICAgew0KLSAgICAgICAgc3VwZXIod3JhcHBlZCk7DQotICAgICAgICB0aGlzLm1lc3NhZ2VSZXNvbHZlciA9IG1lc3NhZ2VSZXNvbHZlcjsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBpbnRlcnBvbGF0ZShTdHJpbmcgbWVzc2FnZU9yS2V5LCBDb250ZXh0IGNvbnRleHQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShtZXNzYWdlT3JLZXksIGNvbnRleHQsIGdldEN1cnJlbnRMb2NhbGUoKSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgaW50ZXJwb2xhdGUoU3RyaW5nIG1lc3NhZ2VPcktleSwgQ29udGV4dCBjb250ZXh0LCBMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLm1lc3NhZ2VSZXNvbHZlciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGlzQmVhblZhbGlkYXRpb25NZXNzYWdlS2V5Rm9ybWF0KG1lc3NhZ2VPcktleSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbmV3TWVzc2FnZU9yS2V5ID0gdGhpcy5tZXNzYWdlUmVzb2x2ZXIuZ2V0TWVzc2FnZShleHRyYWN0S2V5KG1lc3NhZ2VPcktleSksIGdldEN1cnJlbnRMb2NhbGUoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmKGlzVmFsaWRlTWVzc2FnZShuZXdNZXNzYWdlT3JLZXkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlT3JLZXkgPSBuZXdNZXNzYWdlT3JLZXk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoInlvdSB0cmllZCB0byB1c2UgYW4gZXh0dmFsIG1lc3NhZ2UtcmVzb2x2ZXIgZm9yIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqc3IzMDMgdmFsaWRhdGlvbiB3aXRoIGFuIGludmFsaWQga2V5IC0+IHVzaW5nIGEgZGVmYXVsdCBpbnRlcnBvbGF0b3IiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzdXBlci5pbnRlcnBvbGF0ZShtZXNzYWdlT3JLZXksIGNvbnRleHQsIGdldEN1cnJlbnRMb2NhbGUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQmVhblZhbGlkYXRpb25NZXNzYWdlS2V5Rm9ybWF0KFN0cmluZyBtZXNzYWdlT3JLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXNzYWdlT3JLZXkuc3RhcnRzV2l0aCgieyIpICYmIG1lc3NhZ2VPcktleS5lbmRzV2l0aCgifSIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGV4dHJhY3RLZXkoU3RyaW5nIG1lc3NhZ2VPcktleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VPcktleS5zdWJzdHJpbmcoMSwgbWVzc2FnZU9yS2V5Lmxlbmd0aCgpIC0gMSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRlTWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZU9yS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIShuZXdNZXNzYWdlT3JLZXkuc3RhcnRzV2l0aChBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5NSVNTSU5HX1JFU09VUkNFX01BUktFUikgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXdNZXNzYWdlT3JLZXkuZW5kc1dpdGgoQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRkZWVmNi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByaXZhdGUgQ29uc3RyYWludERlc2NyaXB0b3IgY29uc3RyYWludERlc2NyaXB0b3I7DQotICAgIHByaXZhdGUgQ2xhc3MgZWxlbWVudENsYXNzOyAvL3Byb3BlcnR5IHR5cGUNCi0NCi0gICAgcHVibGljIEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneShDb25zdHJhaW50RGVzY3JpcHRvciBjb25zdHJhaW50RGVzY3JpcHRvciwgQ2xhc3MgZWxlbWVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbnN0cmFpbnREZXNjcmlwdG9yID0gY29uc3RyYWludERlc2NyaXB0b3I7DQotICAgICAgICB0aGlzLmVsZW1lbnRDbGFzcyA9IGVsZW1lbnRDbGFzczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29uc3RyYWludERlc2NyaXB0b3IgZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29uc3RyYWludERlc2NyaXB0b3I7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENsYXNzIGdldEVsZW1lbnRDbGFzcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBlbGVtZW50Q2xhc3M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmNvbnN0cmFpbnREZXNjcmlwdG9yLmdldEFubm90YXRpb24oKS5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcG9tLnhtbCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NTQyY2IuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPnZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBWYWxpZGF0aW9uLU1vZHVsZXM8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4yLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy92YWxpZGF0aW9uLW1vZHVsZXM8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy92YWxpZGF0aW9uLW1vZHVsZXM8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL3ZhbGlkYXRpb24tbW9kdWxlczwvdXJsPgotICAgIDwvc2NtPgotCi0gICAgPG1vZHVsZXM+Ci0gICAgICAgIDxtb2R1bGU+cHJvcGVydHktdmFsaWRhdGlvbjwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmJlYW4tdmFsaWRhdGlvbjwvbW9kdWxlPgotICAgIDwvbW9kdWxlcz4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MmVkZjguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBQcm9wZXJ0eS1WYWxpZGF0aW9uLU1vZHVsZTwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjIuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPnZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgucGVyc2lzdGVuY2U8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5wZXJzaXN0ZW5jZS1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgICAgICA8IS0tIFRlc3QgZGVwZW5kZW5jaWVzIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjU8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0LmpzcDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnNoYWxlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2hhbGUtdGVzdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC40PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9BYnN0cmFjdCouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL1Rlc3RVdGlscy5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKkJlYW4uamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4gICAgICAgICAgICAKLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE2YmVlYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNzg1ZDYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50Ci0gICAgICAgIC5BYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlUmVxdWlyZWRBdHRyaWJ1dGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYoKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKSkgfHwKLSAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSkKLSAgICAgICAgICAgICYmCi0gICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGlzQ29tcG9uZW50UmVxdWlyZWQodWlDb21wb25lbnQpKSkKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJgotICAgICAgICAgICAgICAgIUJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSm9pblZhbGlkYXRpb25NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSm9pblZhbGlkYXRpb25NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWExMjNjZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0pvaW5WYWxpZGF0aW9uTWV0YURhdGFTdG9yYWdlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NZXRhRGF0YVN0b3JhZ2VGaWx0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogRVhUVkFMLTU5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKb2luVmFsaWRhdGlvbk1ldGFEYXRhU3RvcmFnZUZpbHRlciBpbXBsZW1lbnRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRJQ19TRVBBUkFUT1IgPSAiOiI7DQotDQotICAgIHB1YmxpYyB2b2lkIGZpbHRlcihQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChwcm9wZXJ0eUluZm9ybWF0aW9uICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgTGlzdDxNZXRhRGF0YUVudHJ5PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE1ldGFEYXRhRW50cnk+KCk7DQotDQotICAgICAgICAgICAgcmVzb2x2ZUpvaW5WYWxpZGF0aW9uTWV0YURhdGEocHJvcGVydHlJbmZvcm1hdGlvbiwgcmVzdWx0KTsNCi0NCi0gICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnJlc2V0TWV0YURhdGFFbnRyaWVzKCk7DQotDQotICAgICAgICAgICAgc2V0RGVmYXVsdFByb3BlcnR5RGV0YWlscyhwcm9wZXJ0eUluZm9ybWF0aW9uLCByZXN1bHQpOw0KLQ0KLSAgICAgICAgICAgIGlmIChjb250YWluc0pvaW5WYWxpZGF0aW9uQ29uc3RyYWludChyZXN1bHQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmlsdGVyKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVzb2x2ZUpvaW5WYWxpZGF0aW9uTWV0YURhdGEoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uLCBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkgOiBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodHJ5VG9UcmFuc2Zvcm1FbnRyeShtZXRhRGF0YUVudHJ5KSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRQcm9wZXJ0eURldGFpbHMoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uLCBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkgOiByZXN1bHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5zZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLA0KLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5nZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTKSk7DQotICAgICAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5hZGRNZXRhRGF0YUVudHJ5KG1ldGFEYXRhRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc0pvaW5WYWxpZGF0aW9uQ29uc3RyYWludChMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogcmVzdWx0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgSm9pblZhbGlkYXRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhRW50cnk+IHRyeVRvVHJhbnNmb3JtRW50cnkoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFbnRyeT4oKTsNCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBKb2luVmFsaWRhdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBKb2luVmFsaWRhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShKb2luVmFsaWRhdGlvbi5jbGFzcyk7DQotDQotICAgICAgICAgICAgcmVwbGFjZU1ldGFEYXRhKGFubm90YXRpb24sIG1ldGFEYXRhRW50cnksIHJlc3VsdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmFkZChtZXRhRGF0YUVudHJ5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VNZXRhRGF0YShKb2luVmFsaWRhdGlvbiBhbm5vdGF0aW9uLCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIExpc3Q8TWV0YURhdGFFbnRyeT4gcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBmb3IgKFN0cmluZyB0YXJnZXQgOiBhbm5vdGF0aW9uLnZhbHVlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9SZXBsYWNlTWV0YURhdGFPZlRhcmdldCh0YXJnZXQsIG1ldGFEYXRhRW50cnksIHJlc3VsdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvUmVwbGFjZU1ldGFEYXRhT2ZUYXJnZXQoU3RyaW5nIHRhcmdldCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGlzU3RhdGljU3ludGF4KHRhcmdldCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNZXRhRGF0YShyZXN1bHQsIGV4dHJhY3RTdGF0aWNNZXRhRGF0YSh0YXJnZXQpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWV0YURhdGEocmVzdWx0LCBleHRyYWN0RHluYW1pY01ldGFEYXRhKG1ldGFEYXRhRW50cnksIHRhcmdldCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgYSBkaWZmZXJlbnQgZmlsdGVyIG1pZ2h0IGludHJvZHVjZSBhIG5ldyBzeW50YXggd2hpY2ggY2F1c2VzIHRoZSBleGNlcHRpb24NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkTWV0YURhdGEoTGlzdDxNZXRhRGF0YUVudHJ5PiByZXN1bHQsIE1ldGFEYXRhRW50cnlbXSBtZXRhRGF0YUVudHJpZXMpDQotICAgIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLmFkZEFsbChyZXN1bHQsIG1ldGFEYXRhRW50cmllcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3RhdGljU3ludGF4KFN0cmluZyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQuY29udGFpbnMoU1RBVElDX1NFUEFSQVRPUik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YUVudHJ5W10gZXh0cmFjdFN0YXRpY01ldGFEYXRhKFN0cmluZyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIGludCBzZXBhcmF0b3JJbmRleCA9IHRhcmdldC5sYXN0SW5kZXhPZihTVEFUSUNfU0VQQVJBVE9SKTsNCi0NCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gbG9hZENsYXNzKHRhcmdldC5zdWJzdHJpbmcoMCwgc2VwYXJhdG9ySW5kZXgpKTsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0YXJnZXQuc3Vic3RyaW5nKHNlcGFyYXRvckluZGV4ICsgMSk7DQotDQotICAgICAgICByZXR1cm4gbmV3IFN0YXRpY1N5bnRheE1ldGFEYXRhRXh0cmFjdG9yKCkuZXh0cmFjdCh0YXJnZXRDbGFzcywgcHJvcGVydHlOYW1lKS5nZXRNZXRhRGF0YUVudHJpZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3NVdGlscy5sb2FkQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YUVudHJ5W10gZXh0cmFjdER5bmFtaWNNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFN0cmluZyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscy5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0KTsNCi0NCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCkpOw0KLSAgICAgICAgcmV0dXJuIG5ldyBTdGF0aWNTeW50YXhNZXRhRGF0YUV4dHJhY3RvcigpLmV4dHJhY3QoDQotICAgICAgICAgICAgICAgIHRhcmdldENsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSkuZ2V0TWV0YURhdGFFbnRyaWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBjbGFzcyBTdGF0aWNTeW50YXhNZXRhRGF0YUV4dHJhY3RvciBleHRlbmRzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgICAgICB7DQotICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKCk7DQotDQotICAgICAgICAgICAgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyh0YXJnZXRDbGFzcywgdGFyZ2V0UHJvcGVydHksIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgICAgIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnModGFyZ2V0Q2xhc3MsIHRhcmdldFByb3BlcnR5LCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopDQotICAgIHsNCi0gICAgICAgIHJldHVybiBvYmogIT0gbnVsbCAmJiBnZXRDbGFzcygpLmVxdWFscyhvYmouZ2V0Q2xhc3MoKSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDBjZGUwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0R3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotLyoqDQotICogbmFtZSBtYXBwZXIgZm9yIGdyb3VwIGltcGxlbWVudGF0aW9ucyB2aWEgdmFsaWRhdGlvbiBwYXJhbWV0ZXJzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoVmFsaWRhdGlvblBhcmFtZXRlci5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdEdyb3VwU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yjc0ODQzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuVmFsaWRhdGlvbk1vZHVsZUtleTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVmFsaWRhdGlvbk1vZHVsZUtleQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5DQotew0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYwNzM0Mi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VySG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkdyb3VwU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NZXRhRGF0YVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnJlY29yZGVyLkNyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkRlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLm1hcHBlci5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UubWFwcGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yNDc0MzYxNjEyODU3MjIyMjgzTDsNCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIGluaXRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycygpOw0KLSAgICAgICAgaW5pdFN0YXRpY1N0cmF0ZWd5TWFwcGluZ3MoKTsNCi0gICAgICAgIGluaXREZWZhdWx0Q29tcG9uZW50SW5pdGlhbGl6ZXIoKTsNCi0gICAgICAgIGFkZFNraXBWYWxpZGF0aW9uU3VwcG9ydCgpOw0KLSAgICAgICAgaW5pdFN0b3JhZ2VNYW5hZ2VyQW5kTmFtZU1hcHBlcnMoKTsNCi0gICAgICAgIGluaXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcigpOw0KLSAgICAgICAgaW5pdE1ldGFEYXRhU3RvcmFnZUZpbHRlcnMoKTsNCi0gICAgICAgIGluaXRQaGFzZUxpc3RlbmVycygpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKG5ldyBDcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFN0YXRpY1N0cmF0ZWd5TWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcganBhQmFzZWRWYWxpZGF0aW9uID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfSlBBX0JBU0VEX1ZBTElEQVRJT047DQotICAgICAgICBpZiAoanBhQmFzZWRWYWxpZGF0aW9uID09IG51bGwNCi0gICAgICAgICAgICAgICAgfHwgIWpwYUJhc2VkVmFsaWRhdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnID0gbmV3IFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgICAgIHN0YXRpY0NvbmZpZy5zZXRTb3VyY2VPZk1hcHBpbmcoDQotICAgICAgICAgICAgICAgIEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsiLmpwYV9zdHJhdGVneV9tYXBwaW5ncyIpOw0KLQ0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsIHN0YXRpY0NvbmZpZyk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXREZWZhdWx0Q29tcG9uZW50SW5pdGlhbGl6ZXIoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFNraXBWYWxpZGF0aW9uU3VwcG9ydCgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmluZm8oImFkZGluZyBzdXBwb3J0IGZvciBAU2tpcFZhbGlkYXRpb24iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmRlbnlSZW5kZXJlckludGVyY2VwdG9yKFZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcyk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsNCi0NCi0gICAgICAgIFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAvL2l0J3MganVzdCByZXF1aXJlZCB0byBzZXQgdGhlIHRhcmdldA0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTiwgU2tpcFZhbGlkYXRpb25TdXBwb3J0LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuU0tJUF9WQUxJREFUSU9OX1NVUFBPUlRfQ09ORklHLCBjb25maWcpOw0KLQ0KLSAgICAgICAgLy9jb25maWcuYWRkTWFwcGluZyhDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCBSZXF1aXJlZFN0cmF0ZWd5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdG9yYWdlTWFuYWdlckFuZE5hbWVNYXBwZXJzKCkNCi0gICAgew0KLSAgICAgICAgU3RvcmFnZU1hbmFnZXJIb2xkZXIgc3RvcmFnZU1hbmFnZXJIb2xkZXIgPQ0KLSAgICAgICAgICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlksIFN0b3JhZ2VNYW5hZ2VySG9sZGVyLmNsYXNzKSk7DQotDQotICAgICAgICAvL3Byb2Nlc3NlZC1pbmZvcm1hdGlvbg0KLSAgICAgICAgRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIgcHJvY2Vzc2VkSW5mb1N0b3JhZ2VNYW5hZ2VyID0NCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyKCk7DQotICAgICAgICBwcm9jZXNzZWRJbmZvU3RvcmFnZU1hbmFnZXIucmVnaXN0ZXIobmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBzdG9yYWdlTWFuYWdlckhvbGRlci5zZXRTdG9yYWdlTWFuYWdlcihQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MsIHByb2Nlc3NlZEluZm9TdG9yYWdlTWFuYWdlciwgZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9jcm9zcy12YWxpZGF0aW9uDQotICAgICAgICBEZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgPQ0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyKCk7DQotICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5yZWdpc3RlcihuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBzdG9yYWdlTWFuYWdlckhvbGRlci5zZXRTdG9yYWdlTWFuYWdlcihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlciwgZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ncm91cC12YWxpZGF0aW9uIGxpZ2h0DQotICAgICAgICBTdG9yYWdlTWFuYWdlciBzdG9yYWdlTWFuYWdlciA9IHN0b3JhZ2VNYW5hZ2VySG9sZGVyLmdldFN0b3JhZ2VNYW5hZ2VyKEdyb3VwU3RvcmFnZS5jbGFzcyk7DQotDQotICAgICAgICBpZihzdG9yYWdlTWFuYWdlciBpbnN0YW5jZW9mIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAoKEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxTdHJpbmc+KXN0b3JhZ2VNYW5hZ2VyKQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBQcm9wZXJ0eVZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5zZXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcihuZXcgUHJvcGVydHlWYWxpZGF0aW9uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TWV0YURhdGFTdG9yYWdlRmlsdGVycygpDQotICAgIHsNCi0gICAgICAgICBNZXRhRGF0YVN0b3JhZ2UgbWV0YURhdGFTdG9yYWdlID0gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZSgNCi0gICAgICAgICAgICAgICAgIE1ldGFEYXRhU3RvcmFnZS5jbGFzcywgTWV0YURhdGFTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBtZXRhRGF0YVN0b3JhZ2UucmVnaXN0ZXJGaWx0ZXIobmV3IEpvaW5WYWxpZGF0aW9uTWV0YURhdGFTdG9yYWdlRmlsdGVyKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0UGhhc2VMaXN0ZW5lcnMoKQ0KLSAgICB7DQotICAgICAgICBKc2ZVdGlscy5yZWdpc3RlclBoYXNlTGlzdGVuZXIobmV3IENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZmEyNDcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci0KLS8qKgotICogdGhlIHNraXAgdmFsaWRhdGlvbiBzdXBwb3J0IHdhcyByZWZhY3RvcmVkIHRvIGFuIGluZGVwZW5kZW50IG1lY2hhbmlzbQotICogc2VlIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJjaGFuZ2UgdGhlIGFkZC1vbnMiICsKLSAgICAgICAgIm9sZCBuYW1lOiBWYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0IikKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0TW9kdWxlS2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3M7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVhNmFkYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvblNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3BlcnR5VmFsaWRhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIHgueC4zCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0aW9uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IgaW1wbGVtZW50cyBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcgotewotICAgIHB1YmxpYyBib29sZWFuIHNraXBWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpCi0gICAgewotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgaWYoSnNmVXRpbHMuaXNSZW5kZXJSZXNwb25zZVBoYXNlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9ICFpc0NsaWVudFNpZGVWYWxpZGF0aW9uRW5hYmxlZChtZXRhRGF0YUVudHJ5KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0IHx8IFByb3BlcnR5VmFsaWRhdGlvblV0aWxzLmlzVmFsaWRhdGlvblNraXBwZWQoZmFjZXNDb250ZXh0LCB2YWxpZGF0aW9uU3RyYXRlZ3ksIG1ldGFEYXRhRW50cnkpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xpZW50U2lkZVZhbGlkYXRpb25FbmFibGVkKE1ldGFEYXRhRW50cnkgZW50cnkpCi0gICAgewotICAgICAgICBMaXN0PFN0cmluZz4ga2V5c1RvRGlzYWJsZSA9IGVudHJ5LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25NZXRhRGF0YUtleXMuRElTQUJMRV9DTElFTlRfU0lERV9WQUxJREFUSU9OLCBMaXN0LmNsYXNzKTsKLQotICAgICAgICByZXR1cm4ga2V5c1RvRGlzYWJsZSA9PSBudWxsIHx8ICFrZXlzVG9EaXNhYmxlLmNvbnRhaW5zKGVudHJ5LmdldEtleSgpKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzc3YTRlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRvY3VtZW50YXRpb24iKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NRVNTQUdFU19KUEEgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJKUEFfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFUyIpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfSlBBX0JBU0VEX1ZBTElEQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OIik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0RvdWJsZVJhbmdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjRlMDJmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0RvdWJsZVJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgRG91YmxlUmFuZ2UNCi17DQotICAgIGRvdWJsZSBtaW5pbXVtKCkgZGVmYXVsdCBEb3VibGUuTUlOX1ZBTFVFOw0KLQ0KLSAgICBkb3VibGUgbWF4aW11bSgpIGRlZmF1bHQgRG91YmxlLk1BWF9WQUxVRTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Kb2luVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzlhODk5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBKb2luVmFsaWRhdGlvbg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTGVuZ3RoLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM0MzdkMS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBMZW5ndGgNCi17DQotICAgIGludCBtaW5pbXVtKCkgZGVmYXVsdCAwOw0KLQ0KLSAgICBpbnQgbWF4aW11bSgpIGRlZmF1bHQgSW50ZWdlci5NQVhfVkFMVUU7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Mb25nUmFuZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDI1MWVmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIExvbmdSYW5nZQ0KLXsNCi0gICAgbG9uZyBtaW5pbXVtKCkgZGVmYXVsdCBMb25nLk1JTl9WQUxVRTsNCi0NCi0gICAgbG9uZyBtYXhpbXVtKCkgZGVmYXVsdCBMb25nLk1BWF9WQUxVRTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1BhdHRlcm4uamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1BhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc3NWQ4OS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUGF0dGVybg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgIm5vX21hdGNoIjsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWNlMTI4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUmVxdWlyZWQNCi17DQotICAgIC8qKg0KLSAgICAgKiB0byBjdXN0b21pemUgdGhlIGVycm9yIG1lc3NhZ2Ugb3INCi0gICAgICogdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQganNmIHJlcXVpcmVkIG1lc3NhZ2Ugd2l0aCB0aGUgdXNhZ2Ugb2YgdGhlIG1lc3NhZ2UgcmVzb2x2ZXIgbWVjaGFuaXNtDQotICAgICAqDQotICAgICAqIEByZXR1cm4gYW4gb3B0aW9uYWwgZXJyb3IgbWVzc2FnZSBrZXkNCi0gICAgICovDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJmaWVsZF9yZXF1aXJlZCI7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJjNTI5Yi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgU2tpcFZhbGlkYXRpb24NCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IHt9Ow0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTA3NjIxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVGFyZ2V0KFRZUEUpCi1AUmV0ZW50aW9uKFJVTlRJTUUpCi1ARG9jdW1lbnRlZAotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgQGludGVyZmFjZSBTa2lwVmFsaWRhdGlvblN1cHBvcnQKLXsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9WYWxpZGF0b3IuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjM4YWNhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFZhbGlkYXRvcg0KLXsNCi0gICAgQ2xhc3M8PyBleHRlbmRzIGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I+W10gdmFsdWUoKTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTBlZWJhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ARGVwcmVjYXRlZAotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yIGV4dGVuZHMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yCi17Ci0gICAgcHJpdmF0ZSBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBnZXRJbnN0YW5jZSgpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvckZvcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvcigpLCBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkKLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsKLQotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBQcm9wZXJ0eURldGFpbHMpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG9iamVjdC5nZXRDbGFzcygpICsgIiBpcyBub3QgYSAiICsgUHJvcGVydHlEZXRhaWxzLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gKFByb3BlcnR5RGV0YWlscylvYmplY3Q7Ci0KLSAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKSk7Ci0KLSAgICAgICAgLy9UT0RPIHRlc3Qgd2l0aCBjb21wbGV4IGNvbXBvbmVudHMKLSAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5zZXRJbmZvcm1hdGlvbigKLSAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIHByb3BlcnR5RGV0YWlscyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZmluZCBhbmQgYWRkIGFubm90YXRpb25zCi0gICAgICAgICAqLwotICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlODAxMi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPVRoZSByZXF1aXJlZCBmb3JtYXRlIGlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdhYjU0My4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPVx1MDYyN1x1MDY0NFx1MDYzNVx1MDY0YVx1MDYzYVx1MDYyOSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2MjZcdTA2MjkNCi1ub19tYXRjaF9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjM1XHUwNjRhXHUwNjNhXHUwNjI5IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzN1x1MDY0NFx1MDY0OFx1MDYyOFx1MDYyOSBcdTA2NDdcdTA2NDk6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGQ2NDkwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW5vX21hdGNoPUZvcm1hdCBpbnZcdTAwZTBsaWQKLW5vX21hdGNoX2RldGFpbD1FbCBmb3JtYXQgcmVxdWVyaXQgXHUwMGU5czogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcyBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZTcwMWIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1Vbmf8bHRpZ2VzIEZvcm1hdA0KLW5vX21hdGNoX2RldGFpbD1EYXMgZXJmb3JkZXJsaWNoZSBGb3JtYXQgaXN0OiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlODAxMi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPVRoZSByZXF1aXJlZCBmb3JtYXRlIGlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiMTA3Ny4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXRvIGludlx1MDBlMWxpZG8gCi1ub19tYXRjaF9kZXRhaWw9RWwgZm9ybWF0byByZXF1ZXJpZG8gZXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjBhMjIzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9TGUgZm9ybWF0IGVzdCBpbnZhbGlkZQ0KLW5vX21hdGNoX2RldGFpbD1MZSBmb3JtYXQgZG9pdCAmZWNpcmM7dHJlIGRlIGxhIGZvcm1lOiB7MH0NCi0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE4NzQ4Yy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXRvIG5vbiB2YWxpZG8KLW5vX21hdGNoX2RldGFpbD1JbCBmb3JtYXRvIHJpY2hpZXN0byAmZWdyYXZlOzogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcyBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NGJjNzQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1HZVx1MDBlN2Vyc2l6IGJpXHUwMGU3aW0NCi1ub19tYXRjaF9kZXRhaWw9Z2VyZWtlbiBiaVx1MDBlN2ltOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYWU2NGIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgICAgIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZU5hbWUgPSBudWxsOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VOYW1lID0gc3VwZXIuZ2V0QmFzZU5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBiYXNlTmFtZTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9KcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDc2YWQ5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIHRoZSBqcGEgc3VwcG9ydCBpcyBhbiBleGNlcHRpb24gaW4gdmlldyBvZiBzb21lIG1lY2hhbmlzbXMgLSBzbyB0aGVyZSdzIG5vIGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZS4NCi0gKiBpbnN0ZWFkIG9mIHRoZSBjb252ZW50aW9uIHRoZXJlIGlzIGEgZ2xvYmFsIHByb3BlcnR5IHRvIGhhdmUgYW4gYWx0ZXJuYXRpdmUgdG8gd2ViLnhtbCBjb25maWd1cmF0aW9uDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTID0gIkpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTIjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX05BTUUgPSBXZWJYbWxQYXJhbWV0ZXIuVkFMSURBVElPTl9NRVNTQUdFU19KUEE7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX05BTUUgPSBKcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MNCi0gICAgICAgICAgICAuZ2V0UGFja2FnZSgpLmdldE5hbWUoKS5yZXBsYWNlKCIubWVzc2FnZS5yZXNvbHZlciIsICIubWVzc2FnZS5idW5kbGUiKSsgIi5qcGFfbWVzc2FnZXMiOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYoQ1VTVE9NX0JBU0VfTkFNRSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBDVVNUT01fQkFTRV9OQU1FOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQkFTRV9OQU1FOw0KLSAgICB9DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9BYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQWJzdHJhY3RWYWxpZGF0aW9uUGFyYW1ldGVyQXdhcmVUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTVjZDQ0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9BYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGlmIChpc0Jsb2NraW5nTWV0YURhdGEobWV0YURhdGEpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1NZXRhRGF0YShtZXRhRGF0YSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhKTsNCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNCbG9ja2luZ01ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIHRlc3RNZXNzYWdlID0gbmV3IEZhY2VzTWVzc2FnZSgpOw0KLSAgICAgICAgdGVzdE1lc3NhZ2Uuc2V0U2V2ZXJpdHkoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSA9IHRyeVRvVHJhbnNmb3JtVmlvbGF0aW9uU2V2ZXJpdHkobWV0YURhdGFFbnRyeSk7DQotDQotICAgICAgICBpZihzZXZlcml0eSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRlc3RNZXNzYWdlLnNldFNldmVyaXR5KHNldmVyaXR5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5zZXZlcml0eUJsb2Nrc1N1Ym1pdEZvckNvbXBvbmVudElkKG51bGwsIHRlc3RNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEZhY2VzTWVzc2FnZS5TZXZlcml0eSB0cnlUb1RyYW5zZm9ybVZpb2xhdGlvblNldmVyaXR5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2UuU2V2ZXJpdHk+IHJlc3VsdCA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKQ0KLSAgICAgICAgICAgICAgICAuZXh0cmFjdChtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihWaW9sYXRpb25TZXZlcml0eS5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5LmNsYXNzKTsNCi0NCi0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiAhcmVzdWx0LmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Lml0ZXJhdG9yKCkubmV4dCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU5ZTRlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Eb3VibGVSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkRvdWJsZVJhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uUGFyYW1ldGVyQXdhcmVUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIERvdWJsZVJhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKERvdWJsZVJhbmdlLmNsYXNzKTsNCi0NCi0gICAgICAgIGRvdWJsZSBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW5pbXVtKCk7DQotDQotICAgICAgICBpZihtaW5pbXVtICE9IERvdWJsZS5NSU5fVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTiwgbWluaW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxULCBtaW5pbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGRvdWJsZSBtYXhpbXVtID0gYW5ub3RhdGlvbi5tYXhpbXVtKCk7DQotDQotICAgICAgICBpZihtYXhpbXVtICE9IERvdWJsZS5NQVhfVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCwgbWF4aW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWF9ERUZBVUxULCBtYXhpbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pvaW5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMzUzMjQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pvaW5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uZXh0cmFjdG9yLkRlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJvcGVydHlWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLUBEZXByZWNhdGVkDQotcHVibGljIGNsYXNzIEpvaW5NZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnQobWV0YURhdGFFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybigidGhpcyBjbGFzcyBpcyByZXBsYWNlZCBieSBhIG1ldGEtZGF0YSBzdG9yYWdlIGZpbHRlci4gIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgImlmIGl0IGdldHMgaW52b2tlZCBhbmQgYW4gZXhjZXB0aW9uIG9jY3VycywgYSBjdXN0b20gc3ludGF4IGlzIHVzZWQuIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgY2xhc3MgbWlnaHQgYmUgdXNlZCBieSBhbiBvbGQgYWRkLW9uLiBwbGVhc2UgY2hlY2sgZm9yIGEgbmV3ZXIgdmVyc2lvbi4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnQoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBleHRyYWN0b3IgPSBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmdldEluc3RhbmNlKCk7DQotDQotICAgICAgICBTdHJpbmdbXSB0YXJnZXRFeHByZXNzaW9ucyA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoSm9pblZhbGlkYXRpb24uY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdGFyZ2V0RXhwcmVzc2lvbiA6IHRhcmdldEV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogZXh0cmFjdG9yLmV4dHJhY3QoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscykuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSA9PSBudWxsIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZGF0aW9uU2tpcHBlZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3ksIGVudHJ5KSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IEV4dFZhbFV0aWxzLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoIShlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQW5ub3RhdGlvbiAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXh0cmFjdChlbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXRlcmF0b3IoKS5oYXNOZXh0KCkpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0QWxsKG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pwYU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNlMTAxMS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQmFzaWM7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpwYU1ldGFEYXRhVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiaW1wbC4gdGhlIHJlc3QiKQ0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmKGFubm90YXRpb24gaW5zdGFuY2VvZiBDb2x1bW4pDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoKCEoKENvbHVtbikgYW5ub3RhdGlvbikubnVsbGFibGUoKSkgJiYgRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RILCAoKENvbHVtbikgYW5ub3RhdGlvbikubGVuZ3RoKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihhbm5vdGF0aW9uIGluc3RhbmNlb2YgQmFzaWMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoISgoQmFzaWMpIGFubm90YXRpb24pLm9wdGlvbmFsKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIElkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotICAgICAgICAvL1RPRE8gaW1wbC4gdGhlIHJlc3QhISENCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9MZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTGVuZ3RoTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzkxZjlhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9MZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXINCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBMZW5ndGggYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTGVuZ3RoLmNsYXNzKTsNCi0NCi0gICAgICAgIGludCBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW5pbXVtKCk7DQotDQotICAgICAgICBpZihtaW5pbXVtICE9IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEgsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIX0RFRkFVTFQsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW50IG1heGltdW0gPSBhbm5vdGF0aW9uLm1heGltdW0oKTsNCi0gICAgICAgIGlmKG1heGltdW0gIT0gSW50ZWdlci5NQVhfVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIX0RFRkFVTFQsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Mb25nUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYTMzMmIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxvbmdSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTG9uZ1JhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKExvbmdSYW5nZS5jbGFzcyk7DQotDQotICAgICAgICBsb25nIG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gIT0gTG9uZy5NSU5fVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTiwgbWluaW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxULCBtaW5pbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGxvbmcgbWF4aW11bSA9IGFubm90YXRpb24ubWF4aW11bSgpOw0KLQ0KLSAgICAgICAgaWYobWF4aW11bSAhPSBMb25nLk1BWF9WQUxVRSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYLCBtYXhpbXVtKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1BhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEwYmU2NS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQYXR0ZXJuTWV0YURhdGFUcmFuc2Zvcm1lciAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgUGF0dGVybiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShQYXR0ZXJuLmNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4sIChhbm5vdGF0aW9uKS52YWx1ZSgpKTsNCi0NCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkgPSAoYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgICAgICBMb2NhbGUgY3VycmVudExvY2FsZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpOw0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSA9DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7DQotDQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnID0gRXh0VmFsVXRpbHMuZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAuZ2V0TWVzc2FnZSh2YWxpZGF0aW9uRXJyb3JNc2dLZXksIGN1cnJlbnRMb2NhbGUpOw0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFLCB2YWxpZGF0aW9uRXJyb3JNc2cpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmJlY2M5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9SZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uUGFyYW1ldGVyQXdhcmVUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ta2lwTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NraXBNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYzY0YWIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NraXBNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFNraXBNZXRhRGF0YVRyYW5zZm9ybWVyICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXINCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCB0cnVlKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDA1YWIwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lciAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgVmFsaWRhdG9yIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFZhbGlkYXRvci5jbGFzcyk7DQotDQotICAgICAgICBDbGFzc1tdIHZhbGlkYXRvcnMgPSBhbm5vdGF0aW9uLnZhbHVlKCk7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBjdXJyZW50Q2xhc3MgOiB2YWxpZGF0b3JzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRDbGFzcy5nZXRTaW1wbGVOYW1lKCkudG9Mb3dlckNhc2UoKS5jb250YWlucyhDb21tb25NZXRhRGF0YUtleXMuRU1BSUwpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsdWUuYWRkKENvbW1vbk1ldGFEYXRhS2V5cy5FTUFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZhbHVlLmFkZChjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00sIHZhbHVlKTsNCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvRG91YmxlUmFuZ2VTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTc1OTMzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkRvdWJsZVJhbmdlVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEb3VibGVSYW5nZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIERvdWJsZVJhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKERvdWJsZVJhbmdlLmNsYXNzKTsNCi0gICAgICAgIERvdWJsZVJhbmdlVmFsaWRhdG9yIGRvdWJsZVJhbmdlVmFsaWRhdG9yID0gKERvdWJsZVJhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5Eb3VibGVSYW5nZSIpOw0KLQ0KLSAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Kb2luVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZGExYWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Kb2luVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5leHRyYWN0b3IuRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWNlc0V4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLUBEZXByZWNhdGVkDQotcHVibGljIGNsYXNzIEpvaW5WYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZUpvaW5WYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRmFjZXNFeGNlcHRpb24gdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyB0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oInRoaXMgY2xhc3MgaXMgcmVwbGFjZWQgYnkgYSBtZXRhLWRhdGEgc3RvcmFnZSBmaWx0ZXIuICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJpZiBpdCBnZXRzIGludm9rZWQgYW5kIGFuIGV4Y2VwdGlvbiBvY2N1cnMsIGEgY3VzdG9tIHN5bnRheCBpcyB1c2VkLiIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIGNsYXNzIG1pZ2h0IGJlIHVzZWQgYnkgYW4gb2xkIGFkZC1vbi4gcGxlYXNlIGNoZWNrIGZvciBhIG5ld2VyIHZlcnNpb24uIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUpvaW5WYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIGV4dHJhY3RvciA9IERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuZ2V0SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIFN0cmluZ1tdIHRhcmdldEV4cHJlc3Npb25zID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShKb2luVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdGFyZ2V0RXhwcmVzc2lvbiA6IHRhcmdldEV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogZXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCBwcm9wZXJ0eURldGFpbHMpLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLnByb2Nlc3NNZXRhRGF0YUVudHJ5QWZ0ZXJTa2lwVmFsaWRhdGlvbihQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKSwgZW50cnkpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyB2YWxpZGF0aW9uIHN0cmF0ZWd5IGZvdW5kIGZvciAiICsgZW50cnkuZ2V0VmFsdWUoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTQxYTkzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLmV4Y2VwdGlvbi5SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQmFzaWM7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZTsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpwYVZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUZhY2VzQnVuZGxlID0gZmFsc2U7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFURV9MRU5HVEggPSAibGVuZ3RoIjsNCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmlvbGF0aW9uOw0KLSAgICBwcml2YXRlIGludCBtYXhMZW5ndGg7DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKTsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgQ29sdW1uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlQ29sdW1uQW5ub3RhdGlvbigoQ29sdW1uKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIEJhc2ljKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlQmFzaWNBbm5vdGF0aW9uKChCYXNpYykgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBJZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgT25lVG9PbmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVPbmVUb09uZUFubm90YXRpb24oKE9uZVRvT25lKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE1hbnlUb09uZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZU1hbnlUb09uZUFubm90YXRpb24oKE1hbnlUb09uZSkgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVDb2x1bW5Bbm5vdGF0aW9uKENvbHVtbiBjb2x1bW4sIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKCFjb2x1bW4ubnVsbGFibGUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCBpbnN0YW5jZW9mIFN0cmluZw0KLSAgICAgICAgICAgICAgICAmJiBjb2x1bW4ubGVuZ3RoKCkgPCAoKFN0cmluZykgY29udmVydGVkT2JqZWN0KS5sZW5ndGgoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbiA9IFZBTElEQVRFX0xFTkdUSDsNCi0gICAgICAgICAgICB0aGlzLm1heExlbmd0aCA9IGNvbHVtbi5sZW5ndGgoKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWVzc2FnZShudWxsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQmFzaWNBbm5vdGF0aW9uKEJhc2ljIGJhc2ljLCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICghYmFzaWMub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlT25lVG9PbmVBbm5vdGF0aW9uKE9uZVRvT25lIG9uZVRvT25lLCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIW9uZVRvT25lLm9wdGlvbmFsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU1hbnlUb09uZUFubm90YXRpb24oTWFueVRvT25lIG1hbnlUb09uZSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFtYW55VG9PbmUub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCB8fCAoIiIuZXF1YWxzKGNvbnZlcnRlZE9iamVjdCkgJiYgRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb24gPSBDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQ7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWVzc2FnZShudWxsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoVkFMSURBVEVfTEVOR1RILmVxdWFscyh0aGlzLnZpb2xhdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJmaWVsZF90b29fbG9uZyI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJmaWVsZF9yZXF1aXJlZCI7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHN1cGVyLmdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgIGlmIChWQUxJREFURV9MRU5HVEguZXF1YWxzKHRoaXMudmlvbGF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLCAiIiArIHRoaXMubWF4TGVuZ3RoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc3VwZXIucmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0gICAgICAgIFN0cmluZyBtYXJrZXIgPSBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5NSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0NCi0gICAgICAgIGlmKChtYXJrZXIgKyBrZXkgKyBtYXJrZXIpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudXNlRmFjZXNCdW5kbGUgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IGUuZ2V0RmFjZXNNZXNzYWdlKCk7DQotDQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKFZBTElEQVRFX0xFTkdUSC5lcXVhbHModGhpcy52aW9sYXRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0TWF4aW11bU1lc3NhZ2UoZmFjZXNNZXNzYWdlLCB0aGlzLm1heExlbmd0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTGVuZ3RoU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2QwNTU4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMZW5ndGhTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBMZW5ndGggYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTGVuZ3RoLmNsYXNzKTsNCi0gICAgICAgIExlbmd0aFZhbGlkYXRvciBsZW5ndGhWYWxpZGF0b3IgPSAoTGVuZ3RoVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5MZW5ndGgiKTsNCi0NCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNTgyMDIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Mb25nUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5Mb25nUmFuZ2VWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExvbmdSYW5nZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIExvbmdSYW5nZSBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMb25nUmFuZ2UuY2xhc3MpOw0KLSAgICAgICAgTG9uZ1JhbmdlVmFsaWRhdG9yIGxvbmdSYW5nZVZhbGlkYXRvciA9IChMb25nUmFuZ2VWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigiamF2YXguZmFjZXMuTG9uZ1JhbmdlIik7DQotDQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bShhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUGF0dGVyblN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUGF0dGVyblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhM2Y0ZWYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUGF0dGVyblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5PFBhdHRlcm4+DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBQYXR0ZXJuIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFBhdHRlcm4uY2xhc3MpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZXhwcmVzc2lvbiA6IGFubm90YXRpb24udmFsdWUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIWphdmEudXRpbC5yZWdleC5QYXR0ZXJuLmNvbXBpbGUoZXhwcmVzc2lvbikubWF0Y2hlcihjb252ZXJ0ZWRPYmplY3QudG9TdHJpbmcoKSkubWF0Y2hlcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihuZXcgRmFjZXNNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24pLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKS5yZXBsYWNlKCJ7MH0iLCBleHByZXNzaW9uKSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShQYXR0ZXJuIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZXF1aXJlZFN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUmVxdWlyZWRTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDllNGM3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZXF1aXJlZFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uZXhjZXB0aW9uLlJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLk51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBOdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBFbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZFN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5PFJlcXVpcmVkPg0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUZhY2VzQnVuZGxlID0gZmFsc2U7DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCB8fCBjb252ZXJ0ZWRPYmplY3QuZXF1YWxzKCIiKSB8fA0KLSAgICAgICAgICAgICAgICAoY29udmVydGVkT2JqZWN0IGluc3RhbmNlb2YgQ29sbGVjdGlvbiAmJiAoKENvbGxlY3Rpb24pY29udmVydGVkT2JqZWN0KS5pc0VtcHR5KCkpIHx8DQotICAgICAgICAgICAgICAgIChjb252ZXJ0ZWRPYmplY3QgaW5zdGFuY2VvZiBNYXAgJiYgKChNYXApY29udmVydGVkT2JqZWN0KS5pc0VtcHR5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgIGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWVzc2FnZShtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFJlcXVpcmVkLmNsYXNzKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KFJlcXVpcmVkIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShlLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvU2tpcFZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1NraXBWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgyNWI3MC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvU2tpcFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFNraXBWYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgU3RyaW5nW10gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbnMgPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFNraXBWYWxpZGF0aW9uLmNsYXNzKS52YWx1ZSgpOw0KLQ0KLSAgICAgICAgZm9yKFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uIDogdmFsdWVCaW5kaW5nRXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFZhbHVlT2ZFeHByZXNzaW9uKA0KLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlNLSVBfVkFMSURBVElPTiwgdHJ1ZSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9WYWxpZGF0b3JTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjNjYzkxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9WYWxpZGF0b3JTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uVmFsaWRhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotDQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcj5bXSB2YWxpZGF0b3JDbGFzc2VzID0NCi0gICAgICAgICAgICBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFZhbGlkYXRvci5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3IgdmFsaWRhdG9yOw0KLSAgICAgICAgZm9yIChDbGFzcyB2YWxpZGF0b3JDbGFzc05hbWUgOiB2YWxpZGF0b3JDbGFzc2VzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRvciA9IChqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yKSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHZhbGlkYXRvckNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRvciA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSh2YWxpZGF0b3JDbGFzc05hbWUuZ2V0TmFtZSgpICsgIiBub3QgZm91bmQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY2YWM2MC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY2VzRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBUaGlzIHBoYXNlIGxpc3RlbmVyIHByb2Nlc3NlcyBjcm9zcyB2YWxpZGF0aW9uIGFzIHNvb24gYXMgaXQgZmluZHMgYSBzcGVjaWFsIHJlcXVlc3Qgc2NvcGVkIHN0b3JhZ2UuPGJyLz4NCi0gKiBTbyBpdCdzIHBvc3NpYmxlIHRvIGFkZCBpbmZvcm1hdGlvbiBkdXJpbmcgdGhlIHByb2Nlc3MgdmFsaWRhdGlvbiBwaGFzZS4gQXQgdGhlIGVuZCBvZiB0aGlzIHBoYXNlIGl0IGdldHMgcHJvY2Vzc2VkLg0KLSAqIEFmdGVyIHRoYXQgdGhlIHN0b3JhZ2UgZ2V0cyByZXNldGVkLjxwLz4NCi0gKiBJZiB5b3UgcHJvdmlkZSBhIGN1c3RvbSBleHRlbnNpb24gYW5kIHlvdSBhZGQgdGhlIHNhbWUgc3RvcmFnZSB0eXBlIHdpdGhpbiBhIGRpZmZlcmVudCBwaGFzZSwNCi0gKiBpdCBhbHNvIGdldHMgcHJvY2Vzc2VkIGF0IHRoZSBlbmQgb2YgdGhhdCBwaGFzZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTMzMzQwNTg5NzYzNTc0MjczMkw7DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlID0gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpOw0KLSAgICAgICAgICAgIGZvciAoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5IDogY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5nZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFFeHRWYWxVdGlscy5leGVjdXRlR2xvYmFsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRDb21wb25lbnQoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5jbGFzcy5nZXROYW1lKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgLy9jYWxsIGluaXQtbWV0aG9kDQotICAgICAgICAgICAgICAgICAgICBpZihlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKSBpbnN0YW5jZW9mIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkuZ2V0Q2xhc3MoKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbml0Q3Jvc3NWYWxpZGF0aW9uIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICAgICAgICAgKiB2YWxpZGF0aW9uDQotICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLnByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oZW50cnksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFkZE1lc3NhZ2UgPSB0cnVlOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkgaW5zdGFuY2VvZiBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWVzc2FnZSA9IChCb29sZWFuKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLmdldENsYXNzKCkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5jbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRDbGFzcygpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYoYWRkTWVzc2FnZSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWNlc01lc3NhZ2UgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsICYmIGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50SWQoZW50cnkuZ2V0Q2xpZW50SWQoKSwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50SWQoZW50cnkuZ2V0Q2xpZW50SWQoKSwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBmaW5hbGx5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0Q29tcG9uZW50KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuY2xhc3MuZ2V0TmFtZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGZpbmFsbHkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5yZXNldENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzSW5pdGlhbGl6ZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NST1NTVkFMSURBVElPTiAhPSBudWxsDQotICAgICAgICAgICAgICAgICAgICAmJiBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgSnNmVXRpbHMuZGVyZWdpc3RlclBoYXNlTGlzdGVuZXIodGhpcyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuQU5ZX1BIQVNFOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmICh0aGlzID09IG8pDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM0MDI3OS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0NST1NTVkFMSURBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OIik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXMuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0ZDJhNC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBEYXRlSXMNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlT2YoKTsNCi0NCi0gICAgLyoNCi0gICAgICogb3B0aW9uYWwgc2VjdGlvbg0KLSAgICAgKi8NCi0NCi0gICAgRGF0ZUlzVHlwZSB0eXBlKCkgZGVmYXVsdCBEYXRlSXNUeXBlLnNhbWU7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICIiOw0KLQ0KLSAgICBTdHJpbmcgbm90QmVmb3JlRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJ3cm9uZ19kYXRlX25vdF9iZWZvcmUiOw0KLQ0KLSAgICBTdHJpbmcgbm90QWZ0ZXJFcnJvck1zZ0tleSgpIGRlZmF1bHQgIndyb25nX2RhdGVfbm90X2FmdGVyIjsNCi0NCi0gICAgU3RyaW5nIG5vdEVxdWFsRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJ3cm9uZ19kYXRlX25vdF9lcXVhbCI7DQotDQotICAgIGludCBlcnJvck1lc3NhZ2VEYXRlU3R5bGUoKSBkZWZhdWx0IERhdGVGb3JtYXQuTUVESVVNOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJc1R5cGUuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNWY0ODIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJc1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImJlZm9yZU9yU2FtZSwgYWZ0ZXJPclNhbWUiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBlbnVtIERhdGVJc1R5cGUNCi17DQotICAgIGJlZm9yZSwgYWZ0ZXIsIHNhbWUNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0VxdWFscy5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0VxdWFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmU3NmI3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgRXF1YWxzDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZSgpOw0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkIjsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9Ob3RFcXVhbHMuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9Ob3RFcXVhbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI3YmM0NC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIE5vdEVxdWFscw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQiOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NWRiMjQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUmVxdWlyZWRJZg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWVPZigpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBvcHRpb25hbCBzZWN0aW9uDQotICAgICAqLw0KLQ0KLSAgICBSZXF1aXJlZElmVHlwZSBpcygpIGRlZmF1bHQgUmVxdWlyZWRJZlR5cGUubm90X2VtcHR5Ow0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZW1wdHlfZmllbGQiOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWZUeXBlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFjNThkOS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGVudW0gUmVxdWlyZWRJZlR5cGUNCi17DQotICAgIGVtcHR5LCBub3RfZW1wdHkNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2MDc1OS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9SW5wdXQgaXMgZGlmZmVyZW50DQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1JbnB1dCBpcyBkaWZmZXJlbnQNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLQ0KLXdyb25nX2RhdGU9V3JvbmcgZGF0ZQ0KLXdyb25nX2RhdGVfZGV0YWlsPVdyb25nIGRhdGUNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZjkzYzQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPVx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDVcdTA2MmVcdTA2MmFcdTA2NDRcdTA2NDENCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDVcdTA2MmVcdTA2MmFcdTA2NDRcdTA2NDENCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPVx1MDYzYVx1MDY0YVx1MDYzMSBcdTA2NDVcdTA2MzNcdTA2NDVcdTA2NDhcdTA2MmQgXHUwNjI4XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0IFx1MDY0NiBcdTA2NDFcdTA2MzMgXHUwNjQyXHUwNjRhXHUwNjQ1XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPVx1MDYzYVx1MDY0YVx1MDYzMSBcdTA2NDVcdTA2MzNcdTA2NDVcdTA2NDhcdTA2MmQgXHUwNjI4XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0ICBcdTA2NDZcdTA2NDFcdTA2MzMgXHUwNjQyXHUwNjRhXHUwNjQ1XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NA0KLQ0KLXdyb25nX2RhdGU9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDYyZVx1MDYyN1x1MDYzN1x1MDY0OVx1MDYyMQ0KLXdyb25nX2RhdGVfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2NDlcdTA2MjENCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzXHUwNjQ4IFx1MDY0NiBcdTA2MjhcdTA2MzlcdTA2MmYgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDMgXHUwNjQ4XHUwNjQ2IFx1MDYyOFx1MDYzOVx1MDYyZiB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDNcdTA2NDggXHUwNjQ2IFx1MDY0Mlx1MDYyOFx1MDY0NCB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzIFx1MDY0OFx1MDY0NiBcdTA2NDJcdTA2MjhcdTA2NDQgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0NFx1MDYyNyBcdTA2NGFcdTA2MzNcdTA2MjdcdTA2NDhcdTA2NDkgezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NDRcdTA2MjcgXHUwNjRhXHUwNjMzXHUwNjI3XHUwNjQ4XHUwNjQ5IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NTRlZDIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1lbCB2YWxvciBcdTAwZTkgZGlmZXJlbnQKLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9ZWwgdmFsb3IgXHUwMGU5IGRpZmVyZW50Ci0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9bm8gZXMgcGVybWV0IGVsIG1hdGVpeCB2YWxvcgotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9bm8gZXMgcGVybWV0IGVsIG1hdGVpeCB2YWxvcgotCi13cm9uZ19kYXRlPWRhdGEgZXJyXHUwMGYybmlhCi13cm9uZ19kYXRlX2RldGFpbD1kYXRhIGVyclx1MDBmMm5pYQotCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9bGEgZGF0YSBoYSBkZSBzZXIgcG9zdGVyaW9yIGEgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotCi13cm9uZ19kYXRlX25vdF9hZnRlcj1sYSBkYXRhIGhhIGRlIHNlciBhbnRlcmlvciBhIHswfQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotCi13cm9uZ19kYXRlX25vdF9lcXVhbD1sYSBkYXRhIG5vIFx1MDAwZTlzIGlndWFsIGEgezB9Ci13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9bGEgZGF0YSBubyBcdTAwMGU5cyBpZ3VhbCBhIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkODcyMzQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUVpbmdhYmUgaXN0IHVudGVyc2NoaWVkbGljaA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9RWluZ2FiZSBpc3QgdW50ZXJzY2hpZWRsaWNoDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1EZXIgZ2xlaWNoZSBXZXJ0IGlzdCBuaWNodCBlcmxhdWJ0DQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9RGVyIGdsZWljaGUgV2VydCBpc3QgbmljaHQgZXJsYXVidA0KLQ0KLXdyb25nX2RhdGU9RGF0dW0gaW5rb3JyZWt0DQotd3JvbmdfZGF0ZV9kZXRhaWw9RGF0dW0gaW5rb3JyZWt0DQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhcyBEYXR1bSBtdXNzIG5hY2ggZGVtIHswfSBzZWluDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1EYXMgRGF0dW0gbXVzcyBuYWNoIGRlbSB7MH0gc2Vpbg0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPURhcyBEYXR1bSBtdXNzIHZvciBkZW0gezB9IHNlaW4NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9RGFzIERhdHVtIG11c3Mgdm9yIGRlbSB7MH0gc2Vpbg0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPURhcyBEYXR1bSBlbnRzcHJpY2h0IG5pY2h0IGRlbSB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGFzIERhdHVtIGVudHNwcmljaHQgbmljaHQgZGVtIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNjA3NTkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUlucHV0IGlzIGRpZmZlcmVudA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9SW5wdXQgaXMgZGlmZmVyZW50DQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi0NCi13cm9uZ19kYXRlPVdyb25nIGRhdGUNCi13cm9uZ19kYXRlX2RldGFpbD1Xcm9uZyBkYXRlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcyBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzM4NTI0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9bGEgZW50cmFkYSBlcyBkaWZlcmVudGUKLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9bGEgZW50cmFkYSBlcyBkaWZlcmVudGUKLQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1ubyBzZSBwZXJtaXRlbiBlbnRyYWRhcyBpZ3VhbGVzCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1ubyBzZSBwZXJtaXRlbiBlbnRyYWRhcyBpZ3VhbGVzCi0KLXdyb25nX2RhdGU9ZmVjaGEgZXF1aXZvY2FkYQotd3JvbmdfZGF0ZV9kZXRhaWw9ZmVjaGEgZXF1aXZvY2FkYQotCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBsdWVnbyBkZSB7MH0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBsdWVnbyBkZSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBhbnRlcyBkZSB7MH0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGFudGVzIGRlIHswfQotCi13cm9uZ19kYXRlX25vdF9lcXVhbD1sYSBmZWNoYSBubyBlcyBpZ3VhbCBhIHswfQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPWxhIGZlY2hhIG5vIGVzIGlndWFsIGEgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmMDIxOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9TGVzIGNoYW1wcyBzb250IGRpZmYmZWFjdXRlO3JlbnRzDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1MZXMgY2hhbXBzIHNvbnQgZGlmZiZlYWN1dGU7cmVudHMNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPUxlcyBjaGFtcHMgZG9pdmVudCAmZWNpcmM7dHJlIGRpZmYmZWFjdXRlO3JlbnRzDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9TGVzIGNoYW1wcyBkb2l2ZW50ICZlY2lyYzt0cmUgZGlmZiZlYWN1dGU7cmVudHMNCi0NCi13cm9uZ19kYXRlPUxhIGRhdGUgZXN0IGluY29ycmVjdGUNCi13cm9uZ19kYXRlX2RldGFpbD1MYSBkYXRlIGVzdCBpbmNvcnJlY3RlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGFwciZlZ3JhdmU7cyB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGFwciZlZ3JhdmU7cyB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhdmFudCB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXZhbnQgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9TGEgZGF0ZSBuJ2VzdCBwYXMgJmVhY3V0ZTtnYWxlICZhZ3JhdmU7IHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1MYSBkYXRlIG4nZXN0IHBhcyAmZWFjdXRlO2dhbGUgJmFncmF2ZTsgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA0MjgwMS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPVZhbG9yaSBub24gdWd1YWxpCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUkgdmFsb3JpIGluc2VyaXRpIG5vbiBjb2luY2lkb25vCi0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9TG8gc3Rlc3NvIHZhbG9yZSBub24gJmVncmF2ZTsgcGVybWVzc28KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPUxvIHN0ZXNzbyB2YWxvcmUgbm9uICZlZ3JhdmU7IHBlcm1lc3NvCi0KLXdyb25nX2RhdGU9RGF0YSBlcnJhdGEKLXdyb25nX2RhdGVfZGV0YWlsPURhdGEgZXJyYXRhCi0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1MYSBkYXRhIGRldmUgZXNzZXJlIGRvcG8gZGkgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPUxhIGRhdGEgZGV2ZSBlc3NlcmUgZG9wbyBkaSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9TGEgZGF0YSBkZXZlIGVzc2VyZSBwcmltYSBkaSB7MH0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1MYSBkYXRhIGRldmUgZXNzZXJlIHByaW1hIGRpIHswfQotCi13cm9uZ19kYXRlX25vdF9lcXVhbD1MYSBkYXRhIG5vbiAmZWdyYXZlOyB1Z3VhbGUgYSB7MH0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1MYSBkYXRhIG5vbiAmZWdyYXZlOyB1Z3VhbGUgYSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcyBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWY2YTlkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1naXJpbGVuIGRlXHUwMTFmZXIgZmFya2xcdTAxMzENCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPWdpcmlsZW4gZGVcdTAxMWZlciBmYXJrbFx1MDEzMQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9YXluXHUwMTMxIGRlXHUwMTFmZXIgZ2lyaWxlbWV6DQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9YXluXHUwMTMxIGRlXHUwMTFmZXIgZ2lyaWxlbWV6DQotDQotd3JvbmdfZGF0ZT15YW5sXHUwMTMxXHUwMTVmIHRhcmloDQotd3JvbmdfZGF0ZV9kZXRhaWw9eWFubFx1MDEzMVx1MDE1ZiB0YXJpaA0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIHNvbnJhIG9sbWFsXHUwMTMxZFx1MDEzMXINCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gc29ucmEgb2xtYWxcdTAxMzFkXHUwMTMxcg0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gXHUwMGY2bmNlIG9sbWFsXHUwMTMxZFx1MDEzMXINCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBcdTAwZjZuY2Ugb2xtYWxcdTAxMzFkXHUwMTMxcg0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPXRhcmloIHswfSBkZVx1MDExZmVyaW5lIGVcdTAxNWZpdCBkZVx1MDExZmlsDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5lIGVcdTAxNWZpdCBkZVx1MDExZmlsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNzY1OWUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLSAgICAgICAgZXh0ZW5kcw0KLSAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBiYXNlTmFtZSA9IG51bGw7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYgKGJhc2VOYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZU5hbWUgPSBzdXBlci5nZXRCYXNlTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGJhc2VOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcmVjb3JkZXIvQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcmVjb3JkZXIvQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzYjA4ZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlY29yZGVyL0Nyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwucmVjb3JkZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlciBpbXBsZW1lbnRzIFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXINCi17DQotICAgIHB1YmxpYyB2b2lkIHJlY29yZFVzZXJJbnB1dChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IHZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpZiAoISh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vdG8gc3VwcG9ydCBsb2NhbCBjcm9zcy12YWxpZGF0aW9uICh3aXRoaW4gdGhlIHNhbWUgZW50aXR5KQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSA9IENyb3NzVmFsaWRhdGlvblV0aWxzDQotICAgICAgICAgICAgLmdldE9ySW5pdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgZW50cnk7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0NCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmKHByb3BlcnR5RGV0YWlscyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgZW50cnkgPSBuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkoKTsNCi0gICAgICAgIGVudHJ5LnNldEJlYW4ocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSk7DQotICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh2YWx1ZSk7DQotICAgICAgICBlbnRyeS5zZXRDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgZW50cnkuc2V0Q2xpZW50SWQodWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKSk7DQotDQotICAgICAgICBTdHJpbmcga2V5ID0gcHJvcGVydHlEZXRhaWxzLmdldEtleSgpOw0KLQ0KLSAgICAgICAgLy9mb3IgbG9jYWwgY3Jvc3MtdmFsaWRhdGlvbg0KLSAgICAgICAgaWYgKHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jb250YWluc0VudHJ5KGtleSkgJiYNCi0gICAgICAgICAgICBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkoa2V5KS5nZXRCZWFuKCkgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICFwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkoa2V5KS5nZXRCZWFuKCkuZXF1YWxzKGVudHJ5LmdldEJlYW4oKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9mb3IgdGhlIHZhbGlkYXRpb24gd2l0aGluIGEgY29tcGxleCBjb21wb25lbnQgZS5nLiBhIHRhYmxlDQotICAgICAgICAgICAgLy9kb24ndCBvdmVycmlkZSBleGlzdGluZyBleHByZXNzaW9uIChzdHlsZTogI3tlbnRyeS5wcm9wZXJ0eX0pIC0gbWFrZSBhIHNwZWNpYWwgbWFwcGluZw0KLQ0KLSAgICAgICAgICAgIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk+IGZ1cnRoZXJFbnRyaWVzID0NCi0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmdldEVudHJ5KGtleSkuZ2V0RnVydGhlckVudHJpZXMoKTsNCi0NCi0gICAgICAgICAgICBpZiAoZnVydGhlckVudHJpZXMgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZ1cnRoZXJFbnRyaWVzID0gbmV3IEFycmF5TGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4oKTsNCi0NCi0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmdldEVudHJ5KGtleSkuc2V0RnVydGhlckVudHJpZXMoZnVydGhlckVudHJpZXMpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBmdXJ0aGVyRW50cmllcy5hZGQoZW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZm9yIG5vcm1hbCB2YWxpZGF0aW9uDQotICAgICAgICAgICAgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLnNldEVudHJ5KGtleSwgZW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDlmYWQ2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBub3JtYWxseSBpdCBzaG91bGQgYmUgaW4gdGhlIHN0b3JhZ2UgcGFja2FnZSAtIGR1ZSB0byBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGl0IGlzbid0IHRoZSBjYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHZvaWQgYWRkKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSk7DQotDQotICAgIExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcygpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOWUxZTcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneS5Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotDQotLyoqDQotICogbm9ybWFsbHkgaXQgc2hvdWxkIGJlIGluIHRoZSBzdG9yYWdlIHBhY2thZ2UgLSBkdWUgdG8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpdCBpc24ndCB0aGUgY2FzZQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkNCi17DQotICAgIHByaXZhdGUgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5Ow0KLSAgICAvL2ZvciBjb21wbGV4IGNvbXBvbmVudHMgKGUuZy4gYSB0YWJsZSkgc3RvcmVzIHRoZSBvYmplY3Qgb2YgZW50cnkgKCN7ZW50cnkucHJvcGVydHl9KQ0KLSAgICBwcml2YXRlIFVJQ29tcG9uZW50IGNvbXBvbmVudDsNCi0gICAgcHJpdmF0ZSBPYmplY3QgY29udmVydGVkT2JqZWN0Ow0KLSAgICBwcml2YXRlIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgLy9qdXN0IGZvciBpbnB1dCBjb21wb25lbnRzIHdpdGhpbiBjb21wbGV4IGNvbXBvbmVudHMgZS5nLiBkYXRhVGFibGUsLi4uDQotICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudElkOw0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeSBnZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhRW50cnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFFbnRyeSA9IG1ldGFEYXRhRW50cnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFVJQ29tcG9uZW50IGdldENvbXBvbmVudCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KFVJQ29tcG9uZW50IGNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRPYmplY3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlZE9iamVjdChPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbnZlcnRlZE9iamVjdCA9IGNvbnZlcnRlZE9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uU3RyYXRlZ3koQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneSA9IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudElkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNsaWVudElkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudElkKFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMTBhM2IuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBpbXBsZW1lbnRzIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgTGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzID0NCi0gICAgICAgIG5ldyBBcnJheUxpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGQoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzLmFkZChlbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcyhMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNDFjOTVkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgY3Jvc3MtdmFsaWRhdGlvbiBlbnRyaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyDQotICAgIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPENyb3NzVmFsaWRhdGlvblN0b3JhZ2U+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgLy9mb3IgYmV0dGVyIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkNCi0gICAgICAgIHJldHVybiBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI4ZTE4Ny4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSBpbXBsZW1lbnRzIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4gcHJvY2Vzc2VkSW5mb3JtYXRpb25NYXAgPQ0KLSAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW50cnkoU3RyaW5nIGtleSwgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvY2Vzc2VkSW5mb3JtYXRpb25NYXAucHV0KGtleSwgZW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zRW50cnkoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uTWFwLmNvbnRhaW5zS2V5KGtleSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IGdldEVudHJ5KFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9jZXNzZWRJbmZvcm1hdGlvbk1hcC5nZXQoa2V5KTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjE4MmM4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgcHJvY2Vzc2VkIGluZm9ybWF0aW9uIGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlcg0KLSAgICBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIC8vZm9yIGJldHRlciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5DQotICAgICAgICByZXR1cm4gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuY2xhc3MuZ2V0TmFtZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBiMTU2ZS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBzZXRFbnRyeShTdHJpbmcga2V5LCBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSk7DQotDQotICAgIGJvb2xlYW4gY29udGFpbnNFbnRyeShTdHJpbmcga2V5KTsNCi0NCi0gICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgZ2V0RW50cnkoU3RyaW5nIGtleSk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZjc4OWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEluIG9yZGVyIHRvIGJ1aWxkIHVwIGEgbWFwcGluZyB3aGljaCBpcyB1c2VkIGZvciBjcm9zcy12YWxpZGF0aW9uLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkKLXsKLSAgICBwcml2YXRlIE9iamVjdCBiZWFuOwotICAgIHByaXZhdGUgT2JqZWN0IGNvbnZlcnRlZFZhbHVlOwotICAgIHByaXZhdGUgVUlDb21wb25lbnQgY29tcG9uZW50OwotICAgIC8vZm9yIGNvbXBsZXggY29tcG9uZW50cyAoZS5nLiBhIHRhYmxlIHRoZXJlIGFyZSBtdWx0aXBsZSBlbnRyaWVzIHdpdGgKLSAgICAvL3RoZSBzYW1lIGtleSAoaGVyZSB0aGUgZWwgZXhwcmVzc2lvbiAje2VudHJ5LnByb3BlcnR5fSkKLSAgICAvL2hvd2V2ZXIsIGRvbid0IG92ZXJyaWRlIHRoZSBwcmV2aW91cyBlbnRyeSAtIHRoZXkgYXJuJ3QgdGhlIHNhbWU7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5PiBmdXJ0aGVyRW50cmllczsKLSAgICAvL2p1c3QgZm9yIGlucHV0IGNvbXBvbmVudHMgd2l0aGluIGNvbXBsZXggY29tcG9uZW50cyBlLmcuIGRhdGFUYWJsZSwuLi4KLSAgICBwcml2YXRlIFN0cmluZyBjbGllbnRJZDsKLQotICAgIC8qCi0gICAgICogZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRCZWFuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJlYW4oT2JqZWN0IGJlYW4pCi0gICAgewotICAgICAgICB0aGlzLmJlYW4gPSBiZWFuOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlZFZhbHVlKE9iamVjdCBjb252ZXJ0ZWRWYWx1ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29udmVydGVkVmFsdWUgPSBjb252ZXJ0ZWRWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVUlDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21wb25lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KFVJQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNsaWVudElkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudElkKFN0cmluZyBjbGllbnRJZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4gZ2V0RnVydGhlckVudHJpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZ1cnRoZXJFbnRyaWVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZ1cnRoZXJFbnRyaWVzKExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk+IGZ1cnRoZXJFbnRyaWVzKQotICAgIHsKLSAgICAgICAgdGhpcy5mdXJ0aGVyRW50cmllcyA9IGZ1cnRoZXJFbnRyaWVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlYmYzYi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvbWFwcGVyL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkRlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGtleSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvbWFwcGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODc1MzAzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkRlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigyMDApDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGtleSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMwMjAyYi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5PEEgZXh0ZW5kcyBBbm5vdGF0aW9uPiBleHRlbmRzIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBzdGF0aWMgTGlzdDxSZWZlcmVuY2luZ1N0cmF0ZWd5PiByZWZlcmVuY2luZ1N0cmF0ZWdpZXM7DQotICAgIHByb3RlY3RlZCBNYXA8T2JqZWN0LCBPYmplY3Q+IHZpb2xhdGlvblJlc3VsdFN0b3JhZ2UgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgaW5pdFJlZmVyZW5jaW5nU3RyYXRlZ2llcygpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRSZWZlcmVuY2luZ1N0cmF0ZWdpZXMoKQ0KLSAgICB7DQotICAgICAgICBpZiAocmVmZXJlbmNpbmdTdHJhdGVnaWVzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzID0gbmV3IEFycmF5TGlzdDxSZWZlcmVuY2luZ1N0cmF0ZWd5PigpOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyBjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5Q2xhc3NOYW1lID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5CQVNFX1BBQ0tBR0UpICsgIlJlZmVyZW5jaW5nU3RyYXRlZ3kiOw0KLQ0KLSAgICAgICAgICAgIFJlZmVyZW5jaW5nU3RyYXRlZ3kgY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneSA9IChSZWZlcmVuY2luZ1N0cmF0ZWd5KSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5KTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgRUxDb21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICAgICAgLy9yZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBBbGlhc0NvbXBhcmVTdHJhdGVneSgpKTsNCi0gICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBMb2NhbENvbXBhcmVTdHJhdGVneSgpKTsNCi0gICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBMb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2luaXRDcm9zc1ZhbGlkYXRpb24gaXMgZG9uZSBpbiB0aGUgQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcg0KLQ0KLSAgICAgICAgU3RyaW5nW10gdmFsaWRhdGlvblRhcmdldHMgPSBnZXRWYWxpZGF0aW9uVGFyZ2V0cygoQSkNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvblRhcmdldCA6IHZhbGlkYXRpb25UYXJnZXRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQgPSB2YWxpZGF0aW9uVGFyZ2V0LnRyaW0oKTsNCi0NCi0gICAgICAgICAgICAvL3NlbGVjdCB2YWxpZGF0aW9uIG1ldGhvZA0KLSAgICAgICAgICAgIHRyeVRvVmFsaWRhdGUoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCkNCi0gICAgew0KLSAgICAgICAgZm9yIChSZWZlcmVuY2luZ1N0cmF0ZWd5IHJlZmVyZW5jaW5nU3RyYXRlZ3kgOiByZWZlcmVuY2luZ1N0cmF0ZWdpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHJlZmVyZW5jaW5nU3RyYXRlZ3kuZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwgdmFsaWRhdGlvblRhcmdldCwgdGhpcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJUaHJvd2FibGVJbnN0YW5jZU5ldmVyVGhyb3duIn0pDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlRhcmdldCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFoYW5kbGVUYXJnZXRWaW9sYXRpb24oZW50cnlPZlNvdXJjZSwgZW50cnlPZlRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9ubyB0YXJnZXQgLSBiZWNhdXNlIHRoZXJlIGlzIG5vIHRhcmdldCBjb21wb25lbnQgLSB2YWx1ZSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1vZGVsDQotICAgICAgICAgICAgaWYoZW50cnlPZlRhcmdldCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1RhcmdldENvbXBvbmVudEFzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oZW50cnlPZlNvdXJjZSk7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9nZXQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIHRhcmdldCBjb21wb25lbnQNCi0gICAgICAgIFN0cmluZyBzdW1tYXJ5ID0gZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeSgoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpLCB0cnVlKTsNCi0gICAgICAgIFN0cmluZyBkZXRhaWxzID0gZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCksIHRydWUpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0aW9uIHRhcmdldCBpc24ndCBib3VuZCB0byBhIGNvbXBvbmVudCB3aXRoaW5nIHRoZSBjdXJyZW50IHBhZ2UgDQotICAgICAgICAvLyhzZWUgdmFsaWRhdGVGb3VuZEVudHJ5LCB0cnlUb1ZhbGlkYXRlTG9jYWxseSBhbmQgdHJ5VG9WYWxpZGF0ZUJpbmRpbmdPbmx5KQ0KLSAgICAgICAgaWYgKGVudHJ5T2ZUYXJnZXQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBlbnRyeU9mVGFyZ2V0ID0gZW50cnlPZlNvdXJjZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlOw0KLSAgICAgICAgaWYgKGVudHJ5T2ZUYXJnZXQuZ2V0TWV0YURhdGFFbnRyeSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWVzc2FnZSA9IGdldFRhcmdldENvbXBvbmVudEVycm9yTWVzc2FnZSgoQSllbnRyeU9mVGFyZ2V0LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpLCBzdW1tYXJ5LCBkZXRhaWxzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8gZG9jdW1lbnQgcG9zc2libGUgc2lkZSBlZmZlY3RzDQotICAgICAgICAgICAgLy9kdWUgdG8gYSBtaXNzaW5nIHRhcmdldCBhbm5vdGF0aW9uIChzZWU6IHRyeVRvVmFsaWRhdGVMb2NhbGx5KQ0KLSAgICAgICAgICAgIG1lc3NhZ2UgPSBnZXRUYXJnZXRDb21wb25lbnRFcnJvck1lc3NhZ2UoKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoKG1lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgfHwgbWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKSAmJg0KLSAgICAgICAgICAgIGVudHJ5T2ZTb3VyY2UuZ2V0Q2xpZW50SWQoKSAhPSBudWxsICYmICFlbnRyeU9mU291cmNlLmdldENsaWVudElkKCkuZXF1YWxzKGVudHJ5T2ZUYXJnZXQuZ2V0Q2xpZW50SWQoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiA9IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24obWVzc2FnZSk7DQotDQotICAgICAgICAgICAgYm9vbGVhbiBpc1NvdXJjZU1ldGFEYXRhVXNlZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgICAgIGlmKGVudHJ5T2ZUYXJnZXQuZ2V0TWV0YURhdGFFbnRyeSgpID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcmVwYXJlVGFyZ2V0TWV0YURhdGFGb3JTZXZlcml0eUF3YXJlSW50ZXJjZXB0aW9uKGVudHJ5T2ZTb3VyY2UsIGVudHJ5T2ZUYXJnZXQpOw0KLSAgICAgICAgICAgICAgICBpc1NvdXJjZU1ldGFEYXRhVXNlZCA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICAgICAgZW50cnlPZlRhcmdldC5nZXRDb21wb25lbnQoKSwgZW50cnlPZlRhcmdldC5nZXRNZXRhRGF0YUVudHJ5KCksDQotICAgICAgICAgICAgICAgICAgICBlbnRyeU9mVGFyZ2V0LmdldENvbnZlcnRlZE9iamVjdCgpLCB2YWxpZGF0b3JFeGNlcHRpb24sIHRoaXMpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50SWQoZW50cnlPZlRhcmdldC5nZXRDbGllbnRJZCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbnZlcnRGYWNlc01lc3NhZ2UodmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKGlzU291cmNlTWV0YURhdGFVc2VkKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzZXRUYXJnZXRNZXRhRGF0YShlbnRyeU9mVGFyZ2V0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVUYXJnZXRNZXRhRGF0YUZvclNldmVyaXR5QXdhcmVJbnRlcmNlcHRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UsIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBlbnRyeU9mVGFyZ2V0LnNldE1ldGFEYXRhRW50cnkoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZXNldFRhcmdldE1ldGFEYXRhKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBlbnRyeU9mVGFyZ2V0LnNldE1ldGFEYXRhRW50cnkobnVsbCk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJUaHJvd2FibGVJbnN0YW5jZU5ldmVyVGhyb3duIn0pDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzVGFyZ2V0Q29tcG9uZW50QXNTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgLy9nZXQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCkpOw0KLSAgICAgICAgU3RyaW5nIGRldGFpbHMgPSBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsKChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCkpOw0KLQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlIG1lc3NhZ2UgPSBnZXRTb3VyY2VDb21wb25lbnRFcnJvck1lc3NhZ2UoDQotICAgICAgICAgICAgICAgIChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCksIHN1bW1hcnksIGRldGFpbHMpOw0KLQ0KLSAgICAgICAgaWYgKG1lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgfHwgbWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vVE9ETw0KLSAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKGVudHJ5T2ZTb3VyY2UuZ2V0Q29tcG9uZW50KCksDQotICAgICAgICAgICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKSwNCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5T2ZTb3VyY2UuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgICAgICBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG1lc3NhZ2UpLA0KLSAgICAgICAgICAgICAgICAgICAgdGhpcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50KGVudHJ5T2ZTb3VyY2UuZ2V0Q29tcG9uZW50KCksIG1lc3NhZ2UsIG51bGwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8gbG9nZ2luZw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByb2Nlc3NTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGhhbmRsZVNvdXJjZVZpb2xhdGlvbihlbnRyeU9mU291cmNlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2dldCB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQNCi0gICAgICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldEVycm9yTWVzc2FnZVN1bW1hcnkoKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSwgZmFsc2UpOw0KLSAgICAgICAgICAgIFN0cmluZyBkZXRhaWxzID0gZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCksIGZhbHNlKTsNCi0NCi0gICAgICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZSA9IGdldFNvdXJjZUNvbXBvbmVudEVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgfHwgbWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9UT0RPDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvVGhyb3dWYWxpZGF0b3JFeGNlcHRpb25Gb3JDb21wb25lbnQoZW50cnlPZlNvdXJjZS5nZXRDb21wb25lbnQoKSwgbWVzc2FnZSwgbnVsbCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9qdXN0IHRocm93IGEgbmV3IG1lc3NhZ2UgLSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBhdCB0aGUgdGFyZ2V0DQotICAgICAgICBFeHRWYWxVdGlscy50cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50KA0KLSAgICAgICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldENvbXBvbmVudCgpLCBuZXcgRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwgbnVsbCwgbnVsbCksIG51bGwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBGYWNlc01lc3NhZ2UgZ2V0U291cmNlQ29tcG9uZW50RXJyb3JNZXNzYWdlKEEgYW5ub3RhdGlvbiwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgRmFjZXNNZXNzYWdlIGdldFRhcmdldENvbXBvbmVudEVycm9yTWVzc2FnZShBIGZvdW5kQW5ub3RhdGlvbiwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoQSBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcmVzb2x2ZU1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQSBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcga2V5ID0gZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgICAgICByZXR1cm4gKGtleSAhPSBudWxsKSA/IHJlc29sdmVNZXNzYWdlKGtleSArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYKSA6IG51bGw7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KChBKWFubm90YXRpb24sIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVUYXJnZXRWaW9sYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UsDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZUYXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBlbnRyeU9mVGFyZ2V0ICE9IG51bGwgJiYgZW50cnlPZlRhcmdldC5nZXRDb21wb25lbnQoKSAhPSBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVNvdXJjZVZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGhhbmRsZVRhcmdldFZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIG51bGwpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIG5vIHRhcmdldCBjb21wb25lbnQgKHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbW9kZWwpIC0+IGdldCByZXZlcnNlIG1lc3NhZ2UgZm9yIHNvdXJjZSBjb21wb25lbnQNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkoQSBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICAvL2lmIHRoZSBtZXNzYWdlIGlzIG5ldXRyYWwNCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24sIHRydWUpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIG5vIHRhcmdldCBjb21wb25lbnQgKHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbW9kZWwpIC0+IGdldCByZXZlcnNlIG1lc3NhZ2UgZm9yIHNvdXJjZSBjb21wb25lbnQNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbChBIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIC8vaWYgdGhlIG1lc3NhZ2UgaXMgbmV1dHJhbA0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uLCB0cnVlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBhYnN0cmFjdCBtZXRob2RzDQotICAgICAqLw0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBpbXBsZW1lbnRzIHRoZSBzcGVjaWZpYyB2YWxpZGF0aW9uIGxvZ2ljDQotICAgICAqLw0KLQ0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEEgYW5ub3RhdGlvbik7DQotDQotICAgIC8qDQotICAgICAqIHJldHVybnMgdGhlIHJlZmVyZW5jZWQgdmFsaWRhdGlvbiB0YXJnZXRzIG9mIHRoZSBhbm5vdGF0aW9uDQotICAgICAqIGUuZy4gQERhdGVJcyh0eXBlID0gRGF0ZUlzVHlwZS5iZWZvcmUsIHZhbHVlID0gImZpbmFsRXhhbSIpDQotICAgICAqIC0+IG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IHdpdGggb25lIHZhbHVlICgiZmluYWxFeGFtIikNCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBIGFubm90YXRpb24pOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTM3NjEyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzDQotICAgIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICAvL2luaXQgY3Jvc3MtdmFsaWRhdGlvbg0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5ID0NCi0gICAgICAgICAgICBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKS5hZGQoZW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5ID0gbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgpOw0KLQ0KLSAgICAgICAgZW50cnkuc2V0TWV0YURhdGFFbnRyeShtZXRhRGF0YUVudHJ5KTsNCi0gICAgICAgIGVudHJ5LnNldENvbXBvbmVudCh1aUNvbXBvbmVudCk7DQotICAgICAgICBlbnRyeS5zZXRDbGllbnRJZCh1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpKTsNCi0gICAgICAgIGVudHJ5LnNldENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgZW50cnkuc2V0VmFsaWRhdGlvblN0cmF0ZWd5KHRoaXMpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGVudHJ5Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vdCBhdmFpbGFibGUgZm9yIGNyb3NzIHZhbGlkYXRpb24gLSB1c2UgcHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24iKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRMYWJlbChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgYXZhaWxhYmxlIGZvciBjcm9zcyB2YWxpZGF0aW9uIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIC8vbm90IGF2YWlsYWJsZSBmb3IgY3Jvc3MgdmFsaWRhdGlvbiAtIHVzZSBpbml0Q3Jvc3NWYWxpZGF0aW9uDQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdENyb3NzVmFsaWRhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICAvL292ZXJyaWRlIGlmIG5lZWRlZA0KLSAgICB9DQotDQotICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbXBvbmVudCgpLCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksIHZhbGlkYXRvckV4Y2VwdGlvbiwgdGhpcyk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25IZWxwZXIuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZDQ3NmUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneShBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnksDQotICAgICAgICAgICAgYm9vbGVhbiBpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LmlzVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL3Byb2Nlc3MgYWZ0ZXIgdmlvbGF0aW9uDQotICAgICAgICAgICAgLy9qdXN0IGFkZCBtZXNzYWdlcw0KLSAgICAgICAgICAgIGlmKCFpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1RhcmdldEFmdGVyQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzVGFyZ2V0QWZ0ZXJNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy90aG93IGV4Y2VwdGlvbg0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NUYXJnZXRBZnRlckNyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgPSBuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KCk7DQotDQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LnVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbXBvbmVudCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDbGllbnRJZCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbXBvbmVudChzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDbGllbnRJZChzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29udmVydGVkT2JqZWN0KHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpKTsNCi0gICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5KTsNCi0NCi0gICAgICAgIC8vYWRkIG1lc3NhZ2UNCi0gICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgIHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NUYXJnZXRBZnRlck1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIC8vbm8gdGFyZ2V0IC0gYmVjYXVzZSB0aGVyZSBpcyBubyB0YXJnZXQgY29tcG9uZW50IC0gdmFsdWUgd2FzIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBtb2RlbA0KLSAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIG51bGwpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMyN2RhNS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgIHZvaWQgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSkNCi0gICAgICAgICAgICB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0RhdGVJc1N0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0RhdGVJc1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYWZjOGYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJc1R5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsNCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERhdGVJc1N0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3k8RGF0ZUlzPg0KLXsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PX0VBUkxZID0gImVhcmx5IjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PX0xBVEUgPSAibGF0ZSI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9FUVVBTF9EQVRFX1RJTUUgPSAibm90IGVxdWFsIjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWSA9ICJyZXN1bHQiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QQVJFRF9WQUxVRV9LRVkgPSAidGFyZ2V0IHZhbHVlIjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVWRVJTRV9DT01QQVJFRF9WQUxVRV9LRVkgPSAicmV2ZXJzZSB0YXJnZXQgdmFsdWUiOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgLy9UT0RPIHRlc3QgJiByZW1vdmUNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVNvdXJjZVZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwgRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gdmlvbGF0aW9uRm91bmQ7DQotDQotICAgICAgICBpZiAoYW5ub3RhdGlvbi50eXBlKCkuZXF1YWxzKERhdGVJc1R5cGUuc2FtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSBvYmplY3QxICE9IG51bGwgJiYgIW9iamVjdDEuZXF1YWxzKG9iamVjdDIpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVTVUxUX0tFWSwgTk9UX0VRVUFMX0RBVEVfVElNRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbi50eXBlKCkuZXF1YWxzKERhdGVJc1R5cGUuYmVmb3JlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IG9iamVjdDEgIT0gbnVsbCAmJiBvYmplY3QyICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFuZXcgRGF0ZSgoKERhdGUpIG9iamVjdDEpLmdldFRpbWUoKSkuYmVmb3JlKChEYXRlKSBvYmplY3QyKSB8fCBvYmplY3QxLmVxdWFscyhvYmplY3QyKSk7DQotDQotICAgICAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVNVTFRfS0VZLCBUT09fTEFURSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsICYmIG9iamVjdDIgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW5ldyBEYXRlKCgoRGF0ZSkgb2JqZWN0MSkuZ2V0VGltZSgpKS5hZnRlcigoRGF0ZSkgb2JqZWN0MikgfHwgb2JqZWN0MS5lcXVhbHMob2JqZWN0MikpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVTVUxUX0tFWSwgVE9PX0VBUkxZKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChDT01QQVJFRF9WQUxVRV9LRVksIG9iamVjdDEpOw0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVWRVJTRV9DT01QQVJFRF9WQUxVRV9LRVksIG9iamVjdDIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZpb2xhdGlvbkZvdW5kOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsdWVPZigpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHByb3RlY3RlZA0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAoU3RyaW5nKSB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UuZ2V0KFJFU1VMVF9LRVkpOw0KLQ0KLSAgICAgICAgaWYgKCFpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSByZXZlcnNlUmVzdWx0KHJlc3VsdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoVE9PX0VBUkxZLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROb3RBZnRlckVycm9yTXNnS2V5KGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoVE9PX0xBVEUuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldE5vdEJlZm9yZUVycm9yTXNnS2V5KGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROb3RFcXVhbEVycm9yTXNnS2V5KGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHJldmVyc2VSZXN1bHQoU3RyaW5nIHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgaWYgKFRPT19FQVJMWS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gVE9PX0xBVEU7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIFRPT19FQVJMWTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KERhdGVJcyBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KSwgYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChEYXRlSXMgYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBrZXkgIiArIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBmYWxzZSksIGFubm90YXRpb24sIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsKERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBmYWxzZSkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGFubm90YXRpb24sIGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbikNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKFN0cmluZyBrZXksIERhdGVJcyBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHJlc29sdmVNZXNzYWdlKGtleSk7DQotDQotICAgICAgICBEYXRlRm9ybWF0IGRhdGVGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZShhbm5vdGF0aW9uLmVycm9yTWVzc2FnZURhdGVTdHlsZSgpLA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpKTsNCi0NCi0gICAgICAgIFN0cmluZyByZXN1bHQ7DQotDQotICAgICAgICBpZihpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBtZXNzYWdlLnJlcGxhY2UoInswfSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdC5mb3JtYXQoKERhdGUpIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5nZXQoQ09NUEFSRURfVkFMVUVfS0VZKSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IG1lc3NhZ2UucmVwbGFjZSgiezB9IiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0LmZvcm1hdCgoRGF0ZSkgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLmdldChSRVZFUlNFX0NPTVBBUkVEX1ZBTFVFX0tFWSkpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vcmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgb3RoZXIgY29tcG9uZW50DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHByaXZhdGUNCi0gICAgICovDQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5vdEFmdGVyRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpLmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24ubm90QWZ0ZXJFcnJvck1zZ0tleSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90QmVmb3JlRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpLmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24ubm90QmVmb3JlRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5vdEVxdWFsRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpLmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24ubm90RXF1YWxFcnJvck1zZ0tleSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjkxMWQ1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRUxDb21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogcmVmZXJlbmNpbmcgdmFsaWRhdGlvbiB0YXJnZXRzIC0gcG9zc2libGUgZm9ybWF0czoNCi0gKiAiI3tbYmVhbl9uYW1lXS5bcHJvcGVydHlfbmFtZV19IiAuLi4gY3Jvc3MtZW50aXR5IHZhbGlkYXRpb24gd2l0aCB2YWx1ZSBiaW5kaW5nDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIEVMQ29tcGFyZVN0cmF0ZWd5IGltcGxlbWVudHMgUmVmZXJlbmNpbmdTdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQodmFsaWRhdGlvblRhcmdldCkgJiYNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YWxpZGF0aW9uVGFyZ2V0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb1ZhbGlkYXRlVmFsdWVCaW5kaW5nKA0KLSAgICAgICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsaWRhdGlvblRhcmdldCksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsIGNvbXBhcmVTdHJhdGVneSk7DQotDQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInRlc3QiKQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlVmFsdWVCaW5kaW5nKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9DQotICAgICAgICAgICAgICAgIHJlc29sdmVUYXJnZXRGb3JDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0NCi0gICAgICAgIGlmKHZhbGlkYXRpb25UYXJnZXRFbnRyeSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSByZXNvbHZlVGFyZ2V0Rm9yQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWxpZGF0aW9uVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlID0NCi0gICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlKCk7DQotDQotICAgICAgICByZXR1cm4gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMucmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFbnRyeSgNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5jb252ZXJ0VmFsdWVCaW5kaW5nRXhwcmVzc2lvblRvUHJvY2Vzc2VkSW5mb3JtYXRpb25LZXkodmFsaWRhdGlvblRhcmdldCksDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbGlkYXRpb25UYXJnZXQpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBPYmplY3QgdGFyZ2V0VmFsdWUgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFZhbHVlT2ZFeHByZXNzaW9uKGZhY2VzQ29udGV4dCwgdmFsaWRhdGlvblRhcmdldCk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB0YXJnZXRFbnRyeSA9IG5ldyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSgpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0QmVhbigNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRWYWx1ZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsIHZhbGlkYXRpb25UYXJnZXQuZ2V0QmFzZUV4cHJlc3Npb24oKSkpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0Q29udmVydGVkVmFsdWUodGFyZ2V0VmFsdWUpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRFbnRyeSwgdHJ1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FcXVhbHNTdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FcXVhbHNTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmU5NzVmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1ATnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1ARW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXF1YWxzU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRXF1YWxzKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG9iamVjdDEgIT0gbnVsbCAmJiAhb2JqZWN0MS5lcXVhbHMob2JqZWN0Mik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRXF1YWxzKSBhbm5vdGF0aW9uKS52YWx1ZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxDb21wYXJlU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxDb21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc1MmYzYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotDQotLyoqDQotICogIltwcm9wZXJ0eV9uYW1lXSIgLi4uIGxvY2FsIHZhbGlkYXRpb24gLT4gY3Jvc3MtY29tcG9uZW50LCBidXQgbm8gY3Jvc3MtZW50aXR5IHZhbGlkYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgTG9jYWxDb21wYXJlU3RyYXRlZ3kgaW1wbGVtZW50cyBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LCBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25UYXJnZXQuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneSB3aWxsIGNvbnRpbnVlDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlTG9jYWxseSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0S2V5LA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSA9DQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgYm9vbGVhbiBpc01vZGVsQXdhcmVWYWxpZGF0aW9uID0NCi0gICAgICAgICAgICAgICAgaXNNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHRhcmdldFByb3BlcnR5ID0gdGFyZ2V0S2V5Ow0KLQ0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUtleSA9IHJlc29sdmVTb3VyY2VLZXkoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIHRhcmdldEtleSA9IHNvdXJjZUtleS5zdWJzdHJpbmcoMCwgc291cmNlS2V5Lmxhc3RJbmRleE9mKCIuIikgKyAxKSArIHRhcmdldEtleTsNCi0NCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9IENyb3NzVmFsaWRhdGlvblV0aWxzLnJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgICAgIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSwgdGFyZ2V0S2V5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLQ0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25UYXJnZXRFbnRyeSAhPSBudWxsICYmIHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb21wb25lbnQoKSAhPSBudWxsICYmICFpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICAvL25vIHRhcmdldCAtIGJlY2F1c2UgdGhlcmUgaXMgbm8gdGFyZ2V0IGNvbXBvbmVudCAtIHZhbHVlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbW9kZWwNCi0gICAgICAgIGVsc2UgaWYoaXNNb2RlbEF3YXJlVmFsaWRhdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHVuc3VwcG9ydGVkQ2FzZShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVUYXJnZXRLZXkoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgU3RyaW5nIHRhcmdldEtleSkNCi0gICAgew0KLSAgICAgICAgLy9ubyByZWFsIHZhbHVlIGJpbmRpbmcgZXhwcmVzc2lvbg0KLSAgICAgICAgLy9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGp1c3QgaGVwbHMgdG8gcmVwbGFjZSB0aGUgcHJvcGVydHkgb2YgdGhlIGtleQ0KLSAgICAgICAgLy9oZXJlIG9ubHkgZG90LW5vdGF0aW9uIGlzIGFsbG93ZWQgLT4gbm8gcHJvYmxlbQ0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBiYXNlRXhwcmVzc2lvbiA9DQotICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7IiArIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsDQotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMuY2xhc3MpLmdldEtleSgpICsgIn0iKTsNCi0NCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2VPckFkZFByb3BlcnR5KGJhc2VFeHByZXNzaW9uLCB0YXJnZXRLZXkpDQotICAgICAgICAgICAgLmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgIHJldHVybiByZXN1bHQuc3Vic3RyaW5nKDIsIHJlc3VsdC5sZW5ndGgoKSAtMSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRWYWx1ZU9mUHJvcGVydHkoT2JqZWN0IGJhc2UsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEsIHByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhiYXNlLmdldENsYXNzKCkpOw0KLSAgICAgICAgTWV0aG9kIHRhcmdldE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh0YXJnZXRDbGFzcywgImdldCIgKyBwcm9wZXJ0eSk7DQotDQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0YXJnZXRNZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodGFyZ2V0Q2xhc3MsICJpcyIgKyBwcm9wZXJ0eSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAiY2xhc3MgIiArIGJhc2UuZ2V0Q2xhc3MoKSArICIgaGFzIG5vIHB1YmxpYyBnZXQvaXMgIiArIHByb3BlcnR5LnRvTG93ZXJDYXNlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZChiYXNlLCB0YXJnZXRNZXRob2QpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2Uga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuZXdLZXkgPSBjcmVhdGVUYXJnZXRLZXkoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgcmV0dXJuICFrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcuY29udGFpbnNFbnRyeShuZXdLZXkpOw0KLQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHJlc29sdmVTb3VyY2VLZXkoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBTdHJpbmcgc291cmNlS2V5ID0gcHJvcGVydHlEZXRhaWxzLmdldEtleSgpOw0KLQ0KLSAgICAgICAgaWYoIXNvdXJjZUtleS5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNvdXJjZSBwYXRoOiAiICsgc291cmNlS2V5ICsgIiBpbnZhbGlkIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc291cmNlS2V5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB1bnN1cHBvcnRlZENhc2UoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBjb252ZXJ0ZWQgb2JqZWN0IGZvciAiICsgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKS5nZXRLZXkoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHRhcmdldEVudHJ5ID0gbmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5KCk7DQotDQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRCZWFuKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcykuZ2V0QmFzZU9iamVjdCgpKTsNCi0gICAgICAgIHRhcmdldEVudHJ5DQotICAgICAgICAgICAgICAgIC5zZXRDb252ZXJ0ZWRWYWx1ZShnZXRWYWx1ZU9mUHJvcGVydHkodGFyZ2V0RW50cnkuZ2V0QmVhbigpLCB0YXJnZXRQcm9wZXJ0eSkpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRFbnRyeSwgdHJ1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYjY1NmMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqICJbbG9jYWxfcHJvcGVydHkucHJvcGVydHkxLnByb3BlcnR5Ml0iDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIExvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneSBleHRlbmRzIExvY2FsQ29tcGFyZVN0cmF0ZWd5DQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZighdmFsaWRhdGlvblRhcmdldC5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vbm90IHN1cHBvcnRlZCAtIFRPRE8gYWRkIGxvZ2dpbmcNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ5VG9WYWxpZGF0ZUxvY2FsbHkoDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlTG9jYWxseShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSA9DQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IGNyZWF0ZVRhcmdldEtleShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEtleSk7DQotDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNvbnRhaW5zRW50cnkobmV3S2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkgPSBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkobmV3S2V5KTsNCi0NCi0gICAgICAgICAgICBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9ubyB0YXJnZXQgLSBiZWNhdXNlIHRoZXJlIGlzIG5vIHRhcmdldCBjb21wb25lbnQgLSB2YWx1ZSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1vZGVsDQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEtleSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB0YXJnZXRJbmZvcm1hdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LmlzVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgIHRhcmdldEluZm9ybWF0aW9uRW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSA9IG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoKTsNCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29tcG9uZW50KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENsaWVudElkKHRhcmdldEluZm9ybWF0aW9uRW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbnZlcnRlZE9iamVjdCh0YXJnZXRJbmZvcm1hdGlvbkVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCkpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAvL3Byb2Nlc3MgYWZ0ZXIgdmlvbGF0aW9uDQotICAgICAgICAgICAgLy9qdXN0IGFkZCBtZXNzYWdlcw0KLSAgICAgICAgICAgIGlmKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBudWxsKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy90aG93IGV4Y2VwdGlvbg0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFN0cmluZyB0YXJnZXRLZXkpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBPYmplY3QgbmV3QmFzZSA9IFJlZmxlY3Rpb25VdGlscw0KLSAgICAgICAgICAgIC5nZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCksIHRhcmdldEtleSk7DQotDQotICAgICAgICBpZih0YXJnZXRLZXkuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2ZpbmQgdGhlIGxhc3QgcHJvcGVydHkNCi0gICAgICAgICAgICB0YXJnZXRLZXkgPSB0YXJnZXRLZXkuc3Vic3RyaW5nKHRhcmdldEtleS5sYXN0SW5kZXhPZigiLiIpICsgMSwgdGFyZ2V0S2V5Lmxlbmd0aCgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXRWYWx1ZSA9IGdldFZhbHVlT2ZQcm9wZXJ0eShuZXdCYXNlLCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdGFyZ2V0RW50cnkgPSBuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkoKTsNCi0gICAgICAgIHRhcmdldEVudHJ5LnNldEJlYW4obmV3QmFzZSk7DQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh0YXJnZXRWYWx1ZSk7DQotDQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEVudHJ5LCB0cnVlKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L05vdEVxdWFsc1N0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L05vdEVxdWFsc1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MDllODQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Ob3RFcXVhbHNTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5Ob3RFcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1ATnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1ARW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTm90RXF1YWxzU3RyYXRlZ3kgZXh0ZW5kcyBFcXVhbHNTdHJhdGVneQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoTm90RXF1YWxzKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLA0KLSAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICFzdXBlci5pc1Zpb2xhdGlvbihvYmplY3QxLCBvYmplY3QyLCBhbm5vdGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoTm90RXF1YWxzKSBhbm5vdGF0aW9uKS52YWx1ZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVmZXJlbmNpbmdTdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYzUwMTEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEludGVybmFsIGludGVyZmFjZSB0byBhbGxvdyBtdWx0aXBsZSByZWZlcmVuY2luZyBzdHJhdGVnaWVzIGZvciBjcm9zcyBjb21wb25lbnQgdmFsaWRhdGlvbi4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotaW50ZXJmYWNlIFJlZmVyZW5jaW5nU3RyYXRlZ3kNCi17DQotICAgIGJvb2xlYW4gZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBhYnN0cmFjdENvbXBhcmVTdHJhdGVneSk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVxdWlyZWRJZlN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlcXVpcmVkSWZTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODc1MGIzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVxdWlyZWRJZlN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkSWY7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkSWZUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFJlcXVpcmVkSWZTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5PFJlcXVpcmVkSWY+DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRmFjZXNCdW5kbGUgPSBmYWxzZTsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc3VwZXIucmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0gICAgICAgIFN0cmluZyBtYXJrZXIgPSBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5NSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0NCi0gICAgICAgIGlmKChtYXJrZXIgKyBrZXkgKyBtYXJrZXIpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudXNlRmFjZXNCdW5kbGUgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShSZXF1aXJlZElmIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBzb3VyY2UsIE9iamVjdCB0YXJnZXQsIFJlcXVpcmVkSWYgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiB2aW9sYXRpb25Gb3VuZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgaWYgKGFubm90YXRpb24uaXMoKS5lcXVhbHMoUmVxdWlyZWRJZlR5cGUuZW1wdHkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gKGlzVGFyZ2V0RW1wdHkodGFyZ2V0KSB8fCBCb29sZWFuLkZBTFNFLmVxdWFscyh0YXJnZXQpKSAmJiBpc1NvdXJjZUVtcHR5KHNvdXJjZSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uLmlzKCkuZXF1YWxzKFJlcXVpcmVkSWZUeXBlLm5vdF9lbXB0eSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSAoaXNUYXJnZXROb3RFbXB0eSh0YXJnZXQpICYmIGlzU291cmNlRW1wdHkoc291cmNlKSAmJiAhKHRhcmdldCBpbnN0YW5jZW9mIEJvb2xlYW4pKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgKEJvb2xlYW4uVFJVRS5lcXVhbHModGFyZ2V0KSAmJiBpc1NvdXJjZUVtcHR5KHNvdXJjZSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZpb2xhdGlvbkZvdW5kOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1RhcmdldEVtcHR5KE9iamVjdCB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQuZXF1YWxzKCIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTb3VyY2VFbXB0eShPYmplY3Qgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc291cmNlID09IG51bGwgfHwgc291cmNlLmVxdWFscygiIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVGFyZ2V0Tm90RW1wdHkoT2JqZWN0IHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldCAhPSBudWxsICYmICF0YXJnZXQuZXF1YWxzKCIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoUmVxdWlyZWRJZiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWx1ZU9mKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMudXNlRmFjZXNCdW5kbGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2pwYV9zdHJhdGVneV9tYXBwaW5ncy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Q5OTI5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLkJhc2ljPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLklkPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZT1vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5KcGFWYWxpZGF0aW9uU3RyYXRlZ3kKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuamF2YSBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Dcm9zc1ZhbGlkYXRpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWY4NTJhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Dcm9zc1ZhbGlkYXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25VdGlscw0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLCBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlc2V0U3RvcmFnZShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLCBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgZ2V0T3JJbml0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoDQotICAgICAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jbGFzcywgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0S2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxVdGlscy5yZXNldFN0b3JhZ2UoUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLCBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0S2V5LCBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5ID0NCi0gICAgICAgICAgICBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkodGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIC8vdmFsdWUgbm90IHN1Ym1pdHRlZCBhdCB0aGlzIHJlcXVlc3QgLSB1c2UgbW9kZWwgdmFsdWUgKHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbW9kZWwpDQotICAgICAgICBpZihwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICAvL3NpbXBsZSBjYXNlDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5nZXRGdXJ0aGVyRW50cmllcygpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXRCZWFuID0gcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKTsNCi0NCi0gICAgICAgIC8vcHJvY2VzcyBjb21wbGV4IGNvbXBvbmVudCBlbnRyaWVzIChlLmcuIGEgdGFibGUpDQotICAgICAgICAvL3N1cHBvcnRlZDogY3Jvc3MtY29tcG9uZW50IGJ1dCBubyBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbiAoPSBsb2NhbGUgdmFsaWRhdGlvbikNCi0gICAgICAgIGlmIChwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEJlYW4oKS5lcXVhbHModGFyZ2V0QmVhbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotICAgICAgICB9DQotDQotICAgICAgICBmb3IgKFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5IDogcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5nZXRGdXJ0aGVyRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbnRyeS5nZXRCZWFuKCkuZXF1YWxzKHRhcmdldEJlYW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJzdXBwb3J0IGZvciBtYXAgc3ludGF4IikNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFZhbHVlQmluZGluZ0V4cHJlc3Npb25Ub1Byb2Nlc3NlZEluZm9ybWF0aW9uS2V5KFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmJlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmJlLmdldEV4cHJlc3Npb25TdHJpbmcoKS5yZXBsYWNlKCIjeyIsICIiKS5yZXBsYWNlKCJ9IiwgIiIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Qcm9wZXJ0eVZhbGlkYXRpb25VdGlscy5qYXZhIGIvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Byb3BlcnR5VmFsaWRhdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMTkyMGMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Byb3BlcnR5VmFsaWRhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LlNraXBWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0dHRVIgPSBMb2dGYWN0b3J5LmdldExvZyhQcm9wZXJ0eVZhbGlkYXRpb25VdGlscy5jbGFzcyk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkYXRpb25Ta2lwcGVkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZihFeHRWYWxVdGlscy5pc1NraXBhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KA0KLSAgICAgICAgICAgICAgICBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBCb29sZWFuIHNraXBWYWxpZGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eSgNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCBCb29sZWFuLmNsYXNzKTsNCi0NCi0gICAgICAgICAgICBpZihCb29sZWFuLlRSVUUuZXF1YWxzKHNraXBWYWxpZGF0aW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKExPR0dFUi5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBMT0dHRVIudHJhY2UoInZhbGlkYXRpb24gb2YgIiArIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY2FuY2VsZWQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIFNraXBWYWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgbnVsbCwgbWV0YURhdGFFbnRyeSwgbnVsbCk7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL19wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmODI1Yy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBQcm9wZXJ0eSBWYWxpZGF0aW9uIE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFByb3BlcnR5IFZhbGlkYXRpb24gTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgUHJvcGVydHkgVmFsaWRhdGlvbiBwcm92aWRlcyBhbm5vdGF0aW9uIGJhc2VkIHZhbGlkYXRpb24gZm9yIGJlYW4gcHJvcGVydGllcy4NCi0gICAgSXQgYWxzbyBwcm92aWRlcyBKUEEgMS4wIGJhc2VkIHZhbGlkYXRpb24gU3VwcG9ydC4NCi0gIA0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS54IGFuZCBKU0YgMi54LiBBbGwgdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2Fzc2VtYmx5L3BvbS54bWwgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2Fzc2VtYmx5L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZWFkMDUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9hc3NlbWJseS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWFzc2VtYmx5MjA8L2FydGlmYWN0SWQ+DQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEFzc2VtYmx5PC9uYW1lPg0KLSAgICA8ZGVzY3JpcHRpb24+TXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBBc3NlbWJseSBpcyB1c2VkIHRvIGdlbmVyYXRlIA0KLSAgICAuemlwIGFuZCAudGFyLmd6IGRpc3RyaWJ1dGlvbnMgPC9kZXNjcmlwdGlvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPHNjbT4NCi0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2Fzc2VtYmx5PC9jb25uZWN0aW9uPg0KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2Fzc2VtYmx5PC9kZXZlbG9wZXJDb25uZWN0aW9uPg0KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvYXNzZW1ibHk8L3VybD4NCi0gICAgPC9zY20+DQotICAgIA0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZGVwZW5kZW5jeS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1qYXZhZG9jPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+amF2YWRvYzwvY2xhc3NpZmllcj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZW5lcmljLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+amF2YWRvYzwvY2xhc3NpZmllcj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+amF2YWRvYzwvY2xhc3NpZmllcj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2JlYW4tdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9qYXZhZG9jPC9vdXRwdXREaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LXNvdXJjZTwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjb3JlLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtiZWFuLXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc3JjPC9vdXRwdXREaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8IS0tIEVYRUNVVEUgbXZuIHBhY2thZ2UgdG8gZ2VuZXJhdGUgYXNzZW1ibHkgZmlsZXMgLS0+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X3NyYzwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sPC9kZXNjcmlwdG9yPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsMjAtJHt2ZXJzaW9ufS1zcmM8L2ZpbmFsTmFtZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L291dDwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvd29yazwvd29ya0RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXR0YWNoZWQ8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9iaW48L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj4ke2Jhc2VkaXJ9L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmViaW4ueG1sPC9kZXNjcmlwdG9yPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsMjAtJHt2ZXJzaW9ufS1iaW48L2ZpbmFsTmFtZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L291dDwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvd29yazwvd29ya0RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXR0YWNoZWQ8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5wZXJzaXN0ZW5jZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnBlcnNpc3RlbmNlLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgPC9leGNsdXNpb25zPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtiZWFuLXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgICAgIDxleGNsdXNpb25zPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgudmFsaWRhdGlvbjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnZhbGlkYXRpb24tYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCi0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtnZW5lcmljLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgICAgIDxleGNsdXNpb25zPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y2dsaWI8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZ2xpYjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgPC9leGNsdXNpb25zPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPCEtLSBTaW5jZSBleHR2YWwgY291bGQgYmUgYXN5bmMgcmVsZWFzZWQsIGFuIGdlbmVyYXRlZCBhc3NlbWJseSBjb3VsZCBjb250YWluIGRpZmZlcmVudA0KLSAgICAgICAgIGFydGlmYWN0IHZlcnNpb25zIC0tPg0KLSAgICA8cHJvcGVydGllcz4NCi0gICAgICAgIDxjb3JlLnZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L2NvcmUudmVyc2lvbj4NCi0gICAgICAgIDx0cmluaWRhZC1zdXBwb3J0LnZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L3RyaW5pZGFkLXN1cHBvcnQudmVyc2lvbj4NCi0gICAgICAgIDxnZW5lcmljLXN1cHBvcnQudmVyc2lvbj4yLjAuMy1TTkFQU0hPVDwvZ2VuZXJpYy1zdXBwb3J0LnZlcnNpb24+DQotICAgICAgICA8cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC9wcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb24+DQotICAgICAgICA8YmVhbi12YWxpZGF0aW9uLnZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L2JlYW4tdmFsaWRhdGlvbi52ZXJzaW9uPg0KLSAgICA8L3Byb3BlcnRpZXM+DQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWwgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmViaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjcxMmYwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08YXNzZW1ibHk+DQotICA8aWQ+Y29yZWJpbjwvaWQ+DQotICA8Zm9ybWF0cz4NCi0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4NCi0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4NCi0gIDwvZm9ybWF0cz4NCi0gIDxkZXBlbmRlbmN5U2V0cz4NCi0gICAgPGRlcGVuZGVuY3lTZXQ+DQotICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4NCi0gICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+DQotICAgIDwvZGVwZW5kZW5jeVNldD4NCi0gIDwvZGVwZW5kZW5jeVNldHM+DQotICA8ZmlsZVNldHM+DQotICAgIDxmaWxlU2V0Pg0KLSAgICAJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgCTxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+DQotICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgPGluY2x1ZGU+UkVBRE1FKjwvaW5jbHVkZT4NCi0gICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UqPC9pbmNsdWRlPg0KLSAgICAgICAgPGluY2x1ZGU+Tk9USUNFKjwvaW5jbHVkZT4NCi0gICAgICAgIDxpbmNsdWRlPlJFTEVBU0UqPC9pbmNsdWRlPg0KLSAgICAgIDwvaW5jbHVkZXM+DQotICAgIDwvZmlsZVNldD4NCi0gICAgPGZpbGVTZXQ+DQotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvamF2YWRvYzwvZGlyZWN0b3J5Pg0KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+amF2YWRvYzwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPg0KLSAgICAgIDwvaW5jbHVkZXM+DQotICAgIDwvZmlsZVNldD4NCi0gIDwvZmlsZVNldHM+DQotPC9hc3NlbWJseT4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3Jlc3JjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxZWNlMS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPGFzc2VtYmx5Pg0KLSAgPGlkPmNvcmVzcmM8L2lkPg0KLSAgPGZvcm1hdHM+DQotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+DQotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+DQotICA8L2Zvcm1hdHM+ICANCi0gIDxmaWxlU2V0cz4NCi0gICAgPGZpbGVTZXQ+DQotICAgIAk8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5Pg0KLSAgICAJPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4NCi0gICAgICA8aW5jbHVkZXM+DQotICAgICAgICA8aW5jbHVkZT5SRUFETUUqPC9pbmNsdWRlPg0KLSAgICAgICAgPGluY2x1ZGU+TElDRU5TRSo8L2luY2x1ZGU+DQotICAgICAgICA8aW5jbHVkZT5OT1RJQ0UqPC9pbmNsdWRlPg0KLSAgICAgICAgPGluY2x1ZGU+UkVMRUFTRSo8L2luY2x1ZGU+DQotICAgICAgPC9pbmNsdWRlcz4NCi0gICAgPC9maWxlU2V0PiAgIA0KLSAgICA8ZmlsZVNldD4NCi0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9zcmM8L2RpcmVjdG9yeT4NCi0gICAgICA8b3V0cHV0RGlyZWN0b3J5PnNyYzwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPg0KLSAgICAgIDwvaW5jbHVkZXM+DQotICAgIDwvZmlsZVNldD4NCi0gIDwvZmlsZVNldHM+DQotPC9hc3NlbWJseT4NCi0gDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3BvbS54bWwgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWM2MGEwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGU8L25hbWU+DQotICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4yLjAuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5jZ2xpYjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZ2xpYjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjFfMzwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cmVzb3VyY2VzPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICA8L3Jlc291cmNlcz4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzRhMjUyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMl8wLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjIuMCI+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+DQotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMuc3RhcnR1cC5HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyDQotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGJlZDdiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcktpdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi0NCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZEludGVyY2VwdG9yOw0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuRW5oYW5jZXI7DQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RQcm94eTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxHZW5lcmljUmVuZGVyS2l0IGV4dGVuZHMgRXh0VmFsUmVuZGVyS2l0IGltcGxlbWVudHMgTWV0aG9kSW50ZXJjZXB0b3INCi17DQotICAgIHB1YmxpYyBzdGF0aWMgUmVuZGVyS2l0IG5ld0luc3RhbmNlKFJlbmRlcktpdCByZW5kZXJLaXQpDQotICAgIHsNCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IHJlbmRlcktpdC5nZXRDbGFzcygpOw0KLQ0KLSAgICAgICAgLy9pdCdzIG5vdCBwb3NzaWJsZSB0byB3cmFwIHRoZSBjb252ZXJ0ZXIgYWdhaW4gLSBvY2N1cnMgZS5nLiB1bmRlciBzb2xhcmlzICsgYmVhIHdlYmxvZ2ljDQotICAgICAgICBpZiAoUHJveHlVdGlscy5pc1Byb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZW5kZXJLaXQ7DQotICAgICAgICB9DQotDQotICAgICAgICBFbmhhbmNlciBlbmhhbmNlciA9IG5ldyBFbmhhbmNlcigpOw0KLSAgICAgICAgZW5oYW5jZXIuc2V0U3VwZXJjbGFzcyhyZW5kZXJLaXQuZ2V0Q2xhc3MoKSk7DQotICAgICAgICBlbmhhbmNlci5zZXRDYWxsYmFjayhuZXcgRXh0VmFsR2VuZXJpY1JlbmRlcktpdChyZW5kZXJLaXQpKTsNCi0gICAgICAgIGVuaGFuY2VyLnNldENsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOw0KLQ0KLSAgICAgICAgcmV0dXJuIChSZW5kZXJLaXQpIGVuaGFuY2VyLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgaW50ZXJjZXB0KE9iamVjdCBvYmosIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MsIE1ldGhvZFByb3h5IHByb3h5KSB0aHJvd3MgVGhyb3dhYmxlDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJnZXRSZW5kZXJlciIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRSZW5kZXJlcigoU3RyaW5nKWFyZ3NbMF0sIChTdHJpbmcpYXJnc1sxXSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJhZGRSZW5kZXJlciIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZFJlbmRlcmVyKChTdHJpbmcpYXJnc1swXSwgKFN0cmluZylhcmdzWzFdLCAoUmVuZGVyZXIpYXJnc1syXSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb3h5Lmludm9rZVN1cGVyKG9iaiwgYXJncyk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRXh0VmFsR2VuZXJpY1JlbmRlcktpdChSZW5kZXJLaXQgd3JhcHBlZCkNCi0gICAgew0KLSAgICAgICAgc3VwZXIod3JhcHBlZCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBSZW5kZXJlciBjcmVhdGVXcmFwcGVyKFJlbmRlcmVyIHJlbmRlcmVyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5uZXdJbnN0YW5jZShyZW5kZXJlcik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTY1NTc1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RJbnRlcmNlcHRvcjsKLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuRW5oYW5jZXI7Ci1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZFByb3h5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgZmluYWwgY2xhc3MgRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlciBleHRlbmRzIEV4dFZhbFJlbmRlcmVyV3JhcHBlciBpbXBsZW1lbnRzIE1ldGhvZEludGVyY2VwdG9yCi17Ci0gICAgcHVibGljIHN0YXRpYyBSZW5kZXJlciBuZXdJbnN0YW5jZShSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IHJlbmRlcmVyLmdldENsYXNzKCk7Ci0KLSAgICAgICAgLy90byBhdm9pZCByZS13cmFwcGluZyAtIG9jY3VycyBlLmcuIHVuZGVyIHNvbGFyaXMgKyBiZWEgd2VibG9naWMKLSAgICAgICAgaWYgKFByb3h5VXRpbHMuaXNQcm94aWVkQ2xhc3MoY3VycmVudENsYXNzKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgRW5oYW5jZXIgZW5oYW5jZXIgPSBuZXcgRW5oYW5jZXIoKTsKLSAgICAgICAgZW5oYW5jZXIuc2V0U3VwZXJjbGFzcyhyZW5kZXJlci5nZXRDbGFzcygpKTsKLSAgICAgICAgZW5oYW5jZXIuc2V0Q2FsbGJhY2sobmV3IEV4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIocmVuZGVyZXIpKTsKLSAgICAgICAgZW5oYW5jZXIuc2V0Q2xhc3NMb2FkZXIoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0KLSAgICAgICAgcmV0dXJuIChSZW5kZXJlcikgZW5oYW5jZXIuY3JlYXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBpbnRlcmNlcHQoT2JqZWN0IG9iaiwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncywgTWV0aG9kUHJveHkgcHJveHkpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0Q29udmVydGVkVmFsdWUiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDb252ZXJ0ZWRWYWx1ZSgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdLCBhcmdzWzJdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZGVjb2RlIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWNvZGUoKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImVuY29kZUJlZ2luIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGVCZWdpbigoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZW5jb2RlQ2hpbGRyZW4iKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZUNoaWxkcmVuKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJlbmNvZGVFbmQiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZUVuZCgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiY29udmVydENsaWVudElkIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRDbGllbnRJZCgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChTdHJpbmcpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldFJlbmRlcnNDaGlsZHJlbiIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm1ldGhvZCAiICsgbWV0aG9kLmdldE5hbWUoKSArICIgY2FsbGVkIHdpdGhvdXQgcmVuZGVyaW5nLWludGVyY2VwdG9ycyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcHJveHkuaW52b2tlU3VwZXIob2JqLCBhcmdzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlcihSZW5kZXJlciB3cmFwcGVkKQotICAgIHsKLSAgICAgICAgc3VwZXIod3JhcHBlZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5MTdlNi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5DQotew0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyS2l0IGNyZWF0ZVdyYXBwZXIoUmVuZGVyS2l0IHJlbmRlcktpdCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVya2l0IHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcktpdC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgdmlhIGNnbGliIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5uZXdJbnN0YW5jZShyZW5kZXJLaXQpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3N0YXJ0dXAvR2VuZXJpY01vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTczMzE0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdC5HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBHZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQzOTIxNTYwMzI4Nzc1MTk1NTZMOw0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpLmFkZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KG5ldyBHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWY2MzIwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGUgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlIHByb3ZpZGVzIGdlbmVyaWMgU3VwcG9ydCBmb3IgSlNGIGNvbXBvbmVudCBmcmFtZXdvcmtzIHdoaWNoIGhhdmUgc3BlY2lhbCByZXF1aXJlbWVudHMgKGUuZy4gUmljaEZhY2VzLCBNeUZhY2VzIFRvYmFnbywgLi4uKS4NCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEueCBhbmQgSlNGIDIueC4gQWxsIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9wb20ueG1sIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjZlYzJmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0NCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBDb21wb25lbnQtU3VwcG9ydCBNb2R1bGVzPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4yLjAuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPHNjbT4NCi0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvbXBvbmVudC1zdXBwb3J0PC9jb25uZWN0aW9uPg0KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvbXBvbmVudC1zdXBwb3J0PC9kZXZlbG9wZXJDb25uZWN0aW9uPg0KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvY29tcG9uZW50LXN1cHBvcnQ8L3VybD4NCi0gICAgPC9zY20+DQotDQotICAgIDxtb2R1bGVzPg0KLSAgICAgICAgPG1vZHVsZT50cmluaWRhZC1zdXBwb3J0PC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPmdlbmVyaWMtc3VwcG9ydDwvbW9kdWxlPg0KLSAgICA8L21vZHVsZXM+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjAuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8cHJvcGVydGllcz4NCi0gICAgICAgIDx0cmluaWRhZC52ZXJzaW9uPjIuMC4wLWFscGhhLTI8L3RyaW5pZGFkLnZlcnNpb24+DQotICAgIDwvcHJvcGVydGllcz4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVlN2Y2YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4yLjAuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+Y29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgPC9yZXNvdXJjZXM+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDU3MWY2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzJfMC54c2QiDQotICAgICAgICAgICAgICB2ZXJzaW9uPSIyLjAiPg0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPg0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdGFydHVwLlRyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyDQotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi0NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj4NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcg0KLSAgICAgICAgPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotPC9mYWNlcy1jb25maWc+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjFjZjkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUwZWI2OC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi0vKioNCi0gKiBpbiBjYXNlIG9mIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gYSB0cmluaWRhZCBjbGllbnQgdmFsaWRhdG9yIGlzIGFkZGVkIHRvIHRoZSBjb21wb25lbnQgYmFzZWQgb24gdGhlIG1ldGEtZGF0YS4NCi0gKiBhdCB0aGUgcG9zdGJhY2s6IHRoZSBleHR2YWwgdmFsaWRhdGlvbiBzdHJhdGVneSBnZXRzIGNhbGxlZCBhbmQgYWZ0ZXIgdGhhdCB0aGUgYWRkZWQgdmFsaWRhdG9yLg0KLSAqIHRoaXMgd3JhcHBlciBwcmV2ZW50cyBzdWNoIGEgc2VydmVyLXNpZGUgZG91YmxlIHZhbGlkYXRpb24uDQotICogaXQganVzdCBkZWxlZ2F0ZXMgdGhlIGNsaWVudC1zaWRlIGZ1bmN0aW9uYWxpdHkuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIgaW1wbGVtZW50cyBWYWxpZGF0b3IsIENsaWVudFZhbGlkYXRvciwgU2VyaWFsaXphYmxlDQotew0KLSAgICBwcml2YXRlIHRyYW5zaWVudCBDbGllbnRWYWxpZGF0b3Igd3JhcHBlZDsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTQxNDU0Nzg0MTcwMDYyMTQxMEw7DQotDQotICAgIHB1YmxpYyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIoQ2xpZW50VmFsaWRhdG9yIGNsaWVudFZhbGlkYXRvcikNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gY2xpZW50VmFsaWRhdG9yOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHZhbGlkYXRlIC0gdGhlIGV4dHZhbCB2YWxpZGF0aW9uIHN0cmF0ZWd5IHdpbGwgZG8gdGhhdA0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50TGlicmFyeVNvdXJjZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRDbGllbnRMaWJyYXJ5U291cmNlKGZhY2VzQ29udGV4dCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRDbGllbnRJbXBvcnROYW1lcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudEltcG9ydE5hbWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRTY3JpcHQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudFNjcmlwdChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NWQ5ZGIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdC5FeHRWYWxUcmluaWRhZFJlbmRlcktpdDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSB0aGlzIHBoYXNlLWxpc3RlbmVyIGluc3RlYWQgb2YgYSBFeHRWYWxUcmluaWRhZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGR1ZSB0byBhIHRyaW5pZGFkIGlzc3VlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gOTEwOTcyMTgzMTg2NDE0NjE2NUw7DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnkgPSBnZXRSZW5kZXJLaXRGYWN0b3J5KCk7DQotDQotICAgICAgICBTdHJpbmcgcmVuZGVyS2l0SWQgPSBnZXRSZW5kZXJLaXRJZChmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgaWYgKGlzSW5jb21wYXRpYmxlUmVuZGVyS2l0KHJlbmRlcktpdElkKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGFuZ2VSZW5kZXJLaXQoZmFjZXNDb250ZXh0LCByZW5kZXJLaXRGYWN0b3J5LCByZW5kZXJLaXRJZCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmVuZGVyS2l0SWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldFJlbmRlcktpdElkKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBSZW5kZXJLaXRGYWN0b3J5IGdldFJlbmRlcktpdEZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFJlbmRlcktpdEZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEZhY3RvcnlGaW5kZXIuUkVOREVSX0tJVF9GQUNUT1JZKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbmNvbXBhdGlibGVSZW5kZXJLaXQoU3RyaW5nIHJlbmRlcktpdElkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIUV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LklELmVxdWFscyhyZW5kZXJLaXRJZCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNoYW5nZVJlbmRlcktpdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnksIFN0cmluZyByZW5kZXJLaXRJZCkNCi0gICAgew0KLSAgICAgICAgUmVuZGVyS2l0IHJlbmRlcktpdCA9IHJlbmRlcktpdEZhY3RvcnkuZ2V0UmVuZGVyS2l0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgcmVuZGVyS2l0SWQpOw0KLSAgICAgICAgcmVuZGVyS2l0RmFjdG9yeS5hZGRSZW5kZXJLaXQoRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuSUQsIG5ldyBFeHRWYWxUcmluaWRhZFJlbmRlcktpdChyZW5kZXJLaXQpKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLnNldFJlbmRlcktpdElkKEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LklEKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuUkVOREVSX1JFU1BPTlNFOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKHRoaXMgPT0gbykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBFeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E3ZDBlMy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcmVuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgLyoNCi0gICAgICogZGVhY3RpdmF0ZQ0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0NMSUVOVF9TSURFX1RSSU5JREFEX1ZBTElEQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfQ0xJRU5UX1NJREVfVFJJTklEQURfVkFMSURBVElPTiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfVFJJTklEQURfQ09SRV9PVVRQVVRfTEFCRUxfSU5JVElBTElaQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfVFJJTklEQURfQ09SRV9PVVRQVVRfTEFCRUxfSU5JVElBTElaQVRJT04iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX1RSSU5JREFEX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1RSSU5JREFEX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SIik7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvRG91YmxlUmFuZ2VJbml0aWFsaXplci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MWE2MWQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5Eb3VibGVSYW5nZVZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5DbGllbnRWYWxpZGF0b3I7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJza2lwVmFsaWRhdGlvblN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24iKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRG91YmxlUmFuZ2VJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXINCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7DQotICAgICAgICBEb3VibGVSYW5nZVZhbGlkYXRvciBkb3VibGVSYW5nZVZhbGlkYXRvciA9IChEb3VibGVSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkRvdWJsZVJhbmdlIik7DQotDQotICAgICAgICBPYmplY3QgbWluID0gbnVsbDsNCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxUKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxUKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKG1pbiBpbnN0YW5jZW9mIERvdWJsZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKChEb3VibGUpbWluKTsNCi0gICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE9iamVjdCBtYXggPSBudWxsOw0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWF4ID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1heCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYobWF4IGluc3RhbmNlb2YgRG91YmxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oKERvdWJsZSltYXgpOw0KLSAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoaW5mb3JtYXRpb25BZGRlZCAmJg0KLSAgICAgICAgICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvciBpbnN0YW5jZW9mIENsaWVudFZhbGlkYXRvciAmJiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IoDQotICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpZG91YmxlUmFuZ2VWYWxpZGF0b3IpKTsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xlbmd0aEluaXRpYWxpemVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xlbmd0aEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYzZkZmMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9MZW5ndGhJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBMZW5ndGhJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXINCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7DQotICAgICAgICAvL1RPRE8NCi0gICAgICAgIExlbmd0aFZhbGlkYXRvciBsZW5ndGhWYWxpZGF0b3IgPSAoTGVuZ3RoVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTGVuZ3RoIik7DQotDQotICAgICAgICBPYmplY3QgbWluTGVuZ3RoID0gbnVsbDsNCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtaW5MZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSF9ERUZBVUxUKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtaW5MZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEhfREVGQVVMVCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihtaW5MZW5ndGggaW5zdGFuY2VvZiBJbnRlZ2VyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNaW5pbXVtKChJbnRlZ2VyKW1pbkxlbmd0aCk7DQotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbnVsbDsNCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSF9ERUZBVUxUKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEhfREVGQVVMVCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihtYXhMZW5ndGggaW5zdGFuY2VvZiBJbnRlZ2VyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0TWF4aW11bUxlbmd0aCIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQuY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1heExlbmd0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNYXhpbXVtKChJbnRlZ2VyKW1heExlbmd0aCk7DQotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICAvL3JlSW5pdFZhbGlkYXRvcnMoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQsIG1ldGFEYXRhKTsgLy9zZWFyY2ggd3JhcHBlcnMgYW5kIGNhbGwgLmRlYWN0aXZhdGUNCi0NCi0gICAgICAgIGlmKGluZm9ybWF0aW9uQWRkZWQgJiYgbGVuZ3RoVmFsaWRhdG9yIGluc3RhbmNlb2YgQ2xpZW50VmFsaWRhdG9yKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIoKENsaWVudFZhbGlkYXRvcilsZW5ndGhWYWxpZGF0b3IpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsZW5ndGhWYWxpZGF0b3IuZ2V0TWluaW11bSgpID4gMCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgKChDb3JlT3V0cHV0TGFiZWwpdWlDb21wb25lbnQpLnNldFNob3dSZXF1aXJlZCh0cnVlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZihCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICgoQ29yZU91dHB1dExhYmVsKXVpQ29tcG9uZW50KS5zZXRTaG93UmVxdWlyZWQoZmFsc2UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTG9uZ1JhbmdlSW5pdGlhbGl6ZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTG9uZ1JhbmdlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBiYWNjOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xvbmdSYW5nZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5Mb25nUmFuZ2VWYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIExvbmdSYW5nZUluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcg0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIGluZm9ybWF0aW9uQWRkZWQgPSBmYWxzZTsNCi0gICAgICAgIExvbmdSYW5nZVZhbGlkYXRvciBsb25nUmFuZ2VWYWxpZGF0b3IgPSAoTG9uZ1JhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTG9uZ1JhbmdlIik7DQotDQotICAgICAgICBPYmplY3QgbWluID0gbnVsbDsNCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxUKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxUKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKG1pbiBpbnN0YW5jZW9mIExvbmcpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnNldE1pbmltdW0oKExvbmcpbWluKTsNCi0gICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE9iamVjdCBtYXggPSBudWxsOw0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWF4ID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1heCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYobWF4IGluc3RhbmNlb2YgTG9uZykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bSgoTG9uZyltYXgpOw0KLSAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoaW5mb3JtYXRpb25BZGRlZCAmJg0KLSAgICAgICAgICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3IgaW5zdGFuY2VvZiBDbGllbnRWYWxpZGF0b3IgJiYgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcigNCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpbG9uZ1JhbmdlVmFsaWRhdG9yKSk7DQotDQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1BhdHRlcm5Jbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTExZTM5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5SZWdFeHBWYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIFBhdHRlcm5Jbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXINCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgaWYoIW1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmdbXSBwYXR0ZXJucyA9IChTdHJpbmdbXSltZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4pOw0KLQ0KLSAgICAgICAgUmVnRXhwVmFsaWRhdG9yIHJlZ0V4cFZhbGlkYXRvcjsNCi0NCi0gICAgICAgIGZvcihTdHJpbmcgcGF0dGVybiA6IHBhdHRlcm5zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlZ0V4cFZhbGlkYXRvciA9IChSZWdFeHBWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuUmVnRXhwIik7DQotDQotICAgICAgICAgICAgcmVnRXhwVmFsaWRhdG9yLnNldFBhdHRlcm4ocGF0dGVybik7DQotICAgICAgICAgICAgcmVnRXhwVmFsaWRhdG9yLnNldE1lc3NhZ2VEZXRhaWxOb01hdGNoKChTdHJpbmcpbWV0YURhdGEuZ2V0KA0KLSAgICAgICAgICAgICAgICBDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTl9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UpKTsNCi0NCi0gICAgICAgICAgICBpZihyZWdFeHBWYWxpZGF0b3IgaW5zdGFuY2VvZiBDbGllbnRWYWxpZGF0b3IgJiYgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IoDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKXJlZ0V4cFZhbGlkYXRvcikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUmVxdWlyZWRJbml0aWFsaXplci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MTM1MWQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC51dGlsLlRyaW5pZGFkVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIFJlcXVpcmVkSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyDQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGlmKCF2YWxpZGF0ZUVtcHR5RmllbGRzKCkgfHwgIUV4dFZhbFV0aWxzLmlzUmVxdWlyZWRJbml0aWFsaXphdGlvbkFjdGl2ZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkgfHwNCi0gICAgICAgICAgIG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKXx8DQotICAgICAgICAgICBtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZigoDQotICAgICAgICAgICAgICAgICAoIUJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJg0KLSAgICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCkpKSB8fA0KLSAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpDQotICAgICAgICAgICAgICAgICYmDQotICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMoaXNDb21wb25lbnRSZXF1aXJlZCh1aUNvbXBvbmVudCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKHRydWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgQ29yZU91dHB1dExhYmVsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKHRydWUpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJg0KLSAgICAgICAgICAgICAgICAgICAhQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIgJiYgRXh0VmFsVXRpbHMuaXNSZXF1aXJlZFJlc2V0QWN0aXZhdGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQoZmFsc2UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgQ29yZU91dHB1dExhYmVsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKGZhbHNlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVFbXB0eUZpZWxkcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy52YWxpZGF0ZUVtcHR5RmllbGRzKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEJvb2xlYW4gaXNDb21wb25lbnRSZXF1aXJlZChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdWlDb21wb25lbnQgPSBUcmluaWRhZFV0aWxzLmZpbmRMYWJlbGVkRWRpdGFibGVDb21wb25lbnQoKENvcmVPdXRwdXRMYWJlbCkgdWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgICAgIGlmKHVpQ29tcG9uZW50ID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvL2NvbXBhcmUgd2l0aCBmYWxzZSBzbyB0cnVlID0gdHJ1ZSBvciBudWxsDQotICAgICAgICBib29sZWFuIGlzUmVhZE9ubHkgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc1JlYWRPbmx5IikpKTsNCi0gICAgICAgIGJvb2xlYW4gaXNEaXNhYmxlZCA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzRGlzYWJsZWQiKSkpOw0KLQ0KLSAgICAgICAgcmV0dXJuICEoaXNSZWFkT25seSB8fCBpc0Rpc2FibGVkKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1RyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzJhZWVlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZS5UcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb250ZXh0LlJlcXVlc3RDb250ZXh0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXRUZXh0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dERhdGUiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXI+IGNvbXBvbmVudEluaXRpYWxpemVycyA9DQotICAgICAgICBuZXcgQXJyYXlMaXN0PFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXI+KCk7DQotDQotICAgIHN0YXRpYw0KLSAgICB7DQotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBSZXF1aXJlZEluaXRpYWxpemVyKCkpOw0KLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgTGVuZ3RoSW5pdGlhbGl6ZXIoKSk7DQotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBMb25nUmFuZ2VJbml0aWFsaXplcigpKTsNCi0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IERvdWJsZVJhbmdlSW5pdGlhbGl6ZXIoKSk7DQotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBQYXR0ZXJuSW5pdGlhbGl6ZXIoKSk7DQotICAgICAgICAvL2NvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFZhbGlkYXRvckluaXRpYWxpemVyKCkpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTE9XLCBkZXNjcmlwdGlvbiA9ICJjaGVjayBwcHIgaXNzdWUiKQ0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICB7DQotICAgICAgICBmb3IoVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplciA6IGNvbXBvbmVudEluaXRpYWxpemVycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihjb21wb25lbnRJbml0aWFsaXplci5jb25maWd1cmVUcmluaWRhZENvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRDb21wb25lbnRUb1N0b3JhZ2UodWlDb21wb25lbnQpOw0KLSAgICAgICAgICAgICAgICB1cGRhdGVDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRDb21wb25lbnRUb1N0b3JhZ2UoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmNsYXNzLCBUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKQ0KLSAgICAgICAgICAgICAgICAuYWRkQ29tcG9uZW50KHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKSB8fA0KLSAgICAgICAgICAgICAgIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURS5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmKFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmlzUGFydGlhbFJlcXVlc3QoZmFjZXNDb250ZXh0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBSZXF1ZXN0Q29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5hZGRQYXJ0aWFsVGFyZ2V0KHVpQ29tcG9uZW50LmdldFBhcmVudCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1ZhbGlkYXRvckluaXRpYWxpemVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1ZhbGlkYXRvckluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYWM5YzguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih2YWx1ZSA9IFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gImltcGwuIHRyaW5pZGFkIGUtbWFpbCB2YWxpZGF0b3IiKQ0KLWNsYXNzIFZhbGlkYXRvckluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXINCi17DQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgaWYoIW1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuQ1VTVE9NKTsNCi0NCi0gICAgICAgIGlmKCEodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBmb3IoT2JqZWN0IGN1cnJlbnRWYWx1ZSA6IChMaXN0KXZhbHVlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCEoY3VycmVudFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZihDb21tb25NZXRhRGF0YUtleXMuRU1BSUwuZXF1YWxzKGN1cnJlbnRWYWx1ZSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL1RPRE8NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNDY5NmIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yDQotICAgICAgICAuQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Bd2FyZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFRyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBDb21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHByb3RlY3RlZCB2b2lkIGFmdGVyRXh0cmFjdGluZ0ZvckNvbXBvbmVudEluaXRpYWxpemF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgcHJvY2Vzc01ldGFEYXRhRW50cmllcyhwcm9wZXJ0eUluZm9ybWF0aW9uLmdldE1ldGFEYXRhRW50cmllcygpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01ldGFEYXRhRW50cmllcyhNZXRhRGF0YUVudHJ5W10gbWV0YURhdGFFbnRyaWVzKQ0KLSAgICB7DQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBtZXRhRGF0YUVudHJpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHByb2Nlc3NFbnRyeShlbnRyeSkgJiYgaXNDbGllbnRWYWxpZGF0aW9uRGlzYWJsZWQoZW50cnkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uKGVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLy9lLmcuIHJldHVybnMgZmFsc2UgZm9yIGpzcjMwMyBlbnRyaWVzDQotICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzRW50cnkoTWV0YURhdGFFbnRyeSBlbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBBbm5vdGF0aW9uOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NsaWVudFZhbGlkYXRpb25EaXNhYmxlZChNZXRhRGF0YUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpDQotICAgICAgICAgICAgICAgIC5leHRyYWN0KGVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuaXRlcmF0b3IoKS5oYXNOZXh0KCk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHJpdmF0ZSB2b2lkIGRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbihNZXRhRGF0YUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZihlbnRyeS5nZXRQcm9wZXJ0eShDb21tb25NZXRhRGF0YUtleXMuRElTQUJMRV9DTElFTlRfU0lERV9WQUxJREFUSU9OKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGVudHJ5LnNldFByb3BlcnR5KENvbW1vbk1ldGFEYXRhS2V5cy5ESVNBQkxFX0NMSUVOVF9TSURFX1ZBTElEQVRJT04sIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBrZXlzVG9EaXNhYmxlID0gZW50cnkuZ2V0UHJvcGVydHkoQ29tbW9uTWV0YURhdGFLZXlzLkRJU0FCTEVfQ0xJRU5UX1NJREVfVkFMSURBVElPTiwgTGlzdC5jbGFzcyk7DQotICAgICAgICBrZXlzVG9EaXNhYmxlLmFkZChlbnRyeS5nZXRLZXkoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWUzYjYxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLlRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnV0aWwuVHJpbmlkYWRVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLkNvcmVGb3JtOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3INCi17DQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQ0KLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoZmlsdGVyQ29yZU91dHB1dExhYmVsKHVpQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0Q29yZU91dHB1dExhYmVsKGZhY2VzQ29udGV4dCwgKENvcmVPdXRwdXRMYWJlbCkgdWlDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlckVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkNCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlRm9ybSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjbGVhbnVwRXh0VmFsQ2xpZW50VmFsaWRhdG9ycygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjbGVhbnVwRXh0VmFsQ2xpZW50VmFsaWRhdG9ycygpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmNsYXNzLCBUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKQ0KLSAgICAgICAgICAgICAgICAucm9sbGJhY2soKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gZmlsdGVyQ29yZU91dHB1dExhYmVsKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgQ29yZU91dHB1dExhYmVsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q29yZU91dHB1dExhYmVsKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIENvcmVPdXRwdXRMYWJlbCBjb3JlT3V0cHV0TGFiZWwpDQotICAgIHsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IFRyaW5pZGFkVXRpbHMuZmluZExhYmVsZWRFZGl0YWJsZUNvbXBvbmVudChjb3JlT3V0cHV0TGFiZWwpOw0KLQ0KLSAgICAgICAgaWYgKHRhcmdldENvbXBvbmVudCA9PSBudWxsIHx8ICFpc0NvbXBvbmVudEVkaXRhYmxlKHRhcmdldENvbXBvbmVudCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YVJlc3VsdCA9IEV4dFZhbFV0aWxzLmdldFRyYW5zZm9ybWVkTWV0YURhdGEoZmFjZXNDb250ZXh0LCB0YXJnZXRDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgLy9nZXQgY29tcG9uZW50IGluaXRpYWxpemVyIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQgYW5kIGNvbmZpZ3VyZSBpdA0KLSAgICAgICAgLy9hbHNvIGluIGNhc2Ugb2Ygc2tpcHBlZCB2YWxpZGF0aW9uIHRvIHJlc2V0IGUuZy4gdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZQ0KLSAgICAgICAgaWYgKCFtZXRhRGF0YVJlc3VsdC5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29uZmlndXJlQ29tcG9uZW50V2l0aE1ldGFEYXRhKGZhY2VzQ29udGV4dCwgY29yZU91dHB1dExhYmVsLCBtZXRhRGF0YVJlc3VsdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcG9uZW50RWRpdGFibGUoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIC8vY29tcGFyZSB3aXRoIGZhbHNlIHNvIHRydWUgPSB0cnVlIG9yIG51bGwNCi0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzUmVhZE9ubHkiKSkpOw0KLSAgICAgICAgYm9vbGVhbiBpc0Rpc2FibGVkID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNEaXNhYmxlZCIpKSk7DQotDQotICAgICAgICByZXR1cm4gIShpc1JlYWRPbmx5IHx8IGlzRGlzYWJsZWQpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODU0NjEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuTGFiZWxlZE1lc3NhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uZXhjZXB0aW9uLlJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb250ZXh0LlJlcXVlc3RDb250ZXh0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigzMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXRUZXh0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dERhdGUiOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9SZWZyZXNoQ29tcG9uZW50KHVpQ29tcG9uZW50KTsNCi0gICAgICAgICAgICB0cnlUb1BsYWNlTGFiZWxJbkZhY2VzTWVzc2FnZSh1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgdmFsaWRhdG9yRXhjZXB0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1BsYWNlTGFiZWxJbkZhY2VzTWVzc2FnZSgNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICB0cnlUb0hhbmRsZVJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKHVpQ29tcG9uZW50LCB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLQ0KLSAgICAgICAgU3RyaW5nIGxhYmVsID0gZGV0ZWN0TGFiZWxUZXh0KG1ldGFEYXRhRW50cnksIHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIHByb2Nlc3NMYWJlbCh2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCksIGxhYmVsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBkZXRlY3RMYWJlbFRleHQoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGxhYmVsID0gZ2V0TGFiZWwodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgbGFiZWwgPSBnZXRDbGllbnRJZEFzRmFsbGJhY2tJZk5lZWRlZCh1aUNvbXBvbmVudCwgbGFiZWwpOw0KLQ0KLSAgICAgICAgbGFiZWwgPSB0cnlUb092ZXJyaWRlTGFiZWxJZlByb3ZpZGVkTWFudWFsbHkobWV0YURhdGFFbnRyeSwgbGFiZWwpOw0KLSAgICAgICAgcmV0dXJuIGxhYmVsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTGFiZWwoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgU3RyaW5nIGxhYmVsKQ0KLSAgICB7DQotICAgICAgICBpZihmYWNlc01lc3NhZ2UgaW5zdGFuY2VvZiBMYWJlbGVkTWVzc2FnZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAoKExhYmVsZWRNZXNzYWdlKWZhY2VzTWVzc2FnZSkuc2V0TGFiZWxUZXh0KGxhYmVsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vaWYgc29tZW9uZSB1c2VzIGEgbm9ybWFsIGZhY2VzIG1lc3NhZ2UNCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9QbGFjZUxhYmVsKGZhY2VzTWVzc2FnZSwgbGFiZWwsIGkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb092ZXJyaWRlTGFiZWxJZlByb3ZpZGVkTWFudWFsbHkoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhRW50cnkgIT0gbnVsbCAmJiBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMLCBTdHJpbmcuY2xhc3MpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGxhYmVsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldENsaWVudElkQXNGYWxsYmFja0lmTmVlZGVkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIGlmKGxhYmVsID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHVpQ29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvSGFuZGxlUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRvckV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCk7DQotICAgICAgICAgICAgU3RyaW5nIGlubGluZU1lc3NhZ2UgPSBnZXRJbmxpbmVSZXF1aXJlZE1lc3NhZ2UodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgICAgIGlmKGlubGluZU1lc3NhZ2UgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGlubGluZU1lc3NhZ2UpOw0KLSAgICAgICAgICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGlubGluZU1lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9SZWZyZXNoQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZihSZXF1ZXN0Q29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5pc1BhcnRpYWxSZXF1ZXN0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuYWRkUGFydGlhbFRhcmdldCh1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHVpQ29tcG9uZW50ICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgKFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVC5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpIHx8DQotICAgICAgICAgICAgICAgICBUUklOSURBRF9DT1JFX0lOUFVUX0RBVEUuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGFiZWwoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoU3RyaW5nKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCh1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJnZXRMYWJlbCIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRJbmxpbmVSZXF1aXJlZE1lc3NhZ2UoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoU3RyaW5nKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCh1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJnZXRSZXF1aXJlZE1lc3NhZ2VEZXRhaWwiKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWFiYWQ1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwucmVuZGVya2l0LlJlbmRlcktpdERlY29yYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwucmVuZGVya2l0LmNvcmUuQ29yZVJlbmRlcktpdDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVzcG9uc2VTdGF0ZU1hbmFnZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VXcml0ZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uV3JpdGVyOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZFJlbmRlcktpdCBleHRlbmRzIFJlbmRlcktpdERlY29yYXRvcg0KLXsNCi0gICAgcHJvdGVjdGVkIEV4dFZhbFJlbmRlcktpdCBleHRWYWxSZW5kZXJLaXQ7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIkVYVFZBTF9UUklOSURBRF9SRU5ERVJLSVQiOw0KLQ0KLSAgICBwdWJsaWMgRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQoUmVuZGVyS2l0IHdyYXBwZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZXh0VmFsUmVuZGVyS2l0ID0gbmV3IEV4dFZhbFJlbmRlcktpdCh3cmFwcGVkKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSwgUmVuZGVyZXIgcmVuZGVyZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCByZW5kZXJlcik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBSZW5kZXJlciBnZXRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5leHRWYWxSZW5kZXJLaXQuZ2V0UmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdGF0ZU1hbmFnZXIgZ2V0UmVzcG9uc2VTdGF0ZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5leHRWYWxSZW5kZXJLaXQuZ2V0UmVzcG9uc2VTdGF0ZU1hbmFnZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFJlc3BvbnNlV3JpdGVyIGNyZWF0ZVJlc3BvbnNlV3JpdGVyKFdyaXRlciB3cml0ZXIsIFN0cmluZyBzLCBTdHJpbmcgczEpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5jcmVhdGVSZXNwb25zZVdyaXRlcih3cml0ZXIsIHMsIHMxKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFJlc3BvbnNlU3RyZWFtIGNyZWF0ZVJlc3BvbnNlU3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5jcmVhdGVSZXNwb25zZVN0cmVhbShvdXRwdXRTdHJlYW0pOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVjb3JhdGVkUmVuZGVyS2l0SWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ29yZVJlbmRlcktpdC5CQVNFX1JFTkRFUl9LSVRfSUQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMjcwMWYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuY29yZS54aHRtbC50YWJsZS5UYWJsZVJlbmRlcmluZ0NvbnRleHQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBzb2x1dGlvbiBmb3IgdHJpbmlkYWQgdGFibGUgcmVuZGVyZXIgaXNzdWUgKGluIGNvbm5lY3Rpb24gd2l0aCBkb3VibGUgY2FsbCBwcmV2ZW50aW9uIHByb3hpZXMpDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eSBleHRlbmRzIEV4dFZhbFJlbmRlcmVyUHJveHkNCi17DQotICAgIHB1YmxpYyBFeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkoUmVuZGVyZXIgcmVuZGVyZXIpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKHJlbmRlcmVyKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcHRpb25hbEtleShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYoVGFibGVSZW5kZXJpbmdDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJ8IiArIFRhYmxlUmVuZGVyaW5nQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRSZW5kZXJTdGFnZSgpLmdldFN0YWdlKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gIiI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdGFydHVwL1RyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0Yjc1NmIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5TdG9yYWdlTWFuYWdlckhvbGRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudC5UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZS5UcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLkRlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnZhbGlkYXRpb24ubWVzc2FnZS5UcmluaWRhZEZhY2VzTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQuRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3IuVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvci5UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvci5UcmluaWRhZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogYWx0ZXJuYXRpdmUgYXBwcm9hY2ggZm9yIEV4dFZhbFJlbmRlcktpdEZhY3RvcnkNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODAzNDA4OTI0NDkwMzk2Njk5OUw7DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBkZWFjdGl2YXRlRGVmYXVsdEV4dFZhbFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7DQotDQotICAgICAgICBpbml0Q2xpZW50U2lkZVZhbGlkYXRpb25TdXBwb3J0KCk7DQotDQotICAgICAgICBpbml0TGFiZWxJbml0aWFsaXphdGlvblN1cHBvcnQoKTsNCi0NCi0gICAgICAgIGluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0aW9uKCk7DQotDQotICAgICAgICByZXBsYWNlRGVmYXVsdFByb3h5V2l0aFRyaW5pZGFkUmVuZGVyZXJQcm94eSgpOw0KLQ0KLSAgICAgICAgaW5pdFRyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeSgpOw0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIGlmIHRoZXJlIGFyZSBmdXJ0aGVyIGluY29tcGF0aWJsZSByZW5kZXJlcnMgdXNlIHRoZSBmb2xsb3dpbmcgcXVpY2stZml4Og0KLSAgICAgICAgICogICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVksIG51bGwpOw0KLSAgICAgICAgICAgYXR0ZW50aW9uOiBpdCBjYXVzZXMgZGlyZWN0IGRlbGVnYXRpb24gd2l0aG91dCBhIGNoZWNrIG9mIGRvdWJsZSBpbnZvY2F0aW9ucw0KLSAgICAgICAgICovDQotDQotICAgICAgICBpbml0VHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcigpOw0KLQ0KLSAgICAgICAgaW5pdFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgaW5pdFJlcXVpcmVkSW5pdGlhbGl6YXRpb24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgZGVhY3RpdmF0ZURlZmF1bHRFeHRWYWxSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5SRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZLCBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmNsYXNzKS5kZWFjdGl2YXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRDbGllbnRTaWRlVmFsaWRhdGlvblN1cHBvcnQoKQ0KLSAgICB7DQotICAgICAgICBpZihpc0NsaWVudFNpZGVWYWxpZGF0aW9uU3VwcG9ydEVuYWJsZWQoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ0xJRU5UX1NJREVfVFJJTklEQURfVkFMSURBVElPTikpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRMYWJlbEluaXRpYWxpemF0aW9uU3VwcG9ydCgpDQotICAgIHsNCi0gICAgICAgIGlmKGlzTGFiZWxJbml0aWFsaXphdGlvbkVuYWJsZWQoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfVFJJTklEQURfQ09SRV9PVVRQVVRfTEFCRUxfSU5JVElBTElaQVRJT04pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdGlvbigpDQotICAgIHsNCi0gICAgICAgIGlmKHVzZVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRpb24oV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfVFJJTklEQURfVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcihuZXcgVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VEZWZhdWx0UHJveHlXaXRoVHJpbmlkYWRSZW5kZXJlclByb3h5KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZLCBFeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFRyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5TmFtZXMuRkFDRVNfTUVTU0FHRV9GQUNUT1JZLm5hbWUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBUcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFRyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlksIFN0b3JhZ2VNYW5hZ2VySG9sZGVyLmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuc2V0U3RvcmFnZU1hbmFnZXIoVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0xhYmVsSW5pdGlhbGl6YXRpb25FbmFibGVkKFN0cmluZyBkZWFjdGl2YXRlSW5pdENvcmVPdXRwdXRMYWJlbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRlYWN0aXZhdGVJbml0Q29yZU91dHB1dExhYmVsID09IG51bGwgfHwgIWRlYWN0aXZhdGVJbml0Q29yZU91dHB1dExhYmVsLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDbGllbnRTaWRlVmFsaWRhdGlvblN1cHBvcnRFbmFibGVkKFN0cmluZyBkZWFjdGl2YXRlQ2xpZW50U2lkZVZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkZWFjdGl2YXRlQ2xpZW50U2lkZVZhbGlkYXRpb24gPT0gbnVsbCB8fCAhZGVhY3RpdmF0ZUNsaWVudFNpZGVWYWxpZGF0aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdGlvbihTdHJpbmcgZGVhY3RpdmF0ZVRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGVhY3RpdmF0ZVRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yID09IG51bGwgfHwNCi0gICAgICAgICAgICAgICAgIWRlYWN0aXZhdGVUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFJlcXVpcmVkSW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBpZighaXNSZXF1aXJlZEluaXRpYWxpemF0aW9uRGVhY3RpdmF0ZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eSgibW9kZTppbml0OnJlcXVpcmVkIiwgQm9vbGVhbi5UUlVFLCB0cnVlKTsNCi0NCi0gICAgICAgICAgICAvL3RoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHNldmVyaXR5IGF3YXJlIHZhbGlkYXRpb24gLT4gZG9uJ3QgcmVzZXQgdGhlIHZhbHVlDQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoIm1vZGU6cmVzZXQ6cmVxdWlyZWQiLCBCb29sZWFuLkZBTFNFLCBmYWxzZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvbkRlYWN0aXZhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICJmYWxzZSIuZXF1YWxzSWdub3JlQ2FzZSgNCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyLkFDVElWQVRFX1JFUVVJUkVEX0lOSVRJQUxJWkFUSU9OKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA4NjFkNS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2UgaW1wbGVtZW50cyBUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgTGlzdDxVSUNvbXBvbmVudD4gY29tcG9uZW50TGlzdCA9IG5ldyBBcnJheUxpc3Q8VUlDb21wb25lbnQ+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZENvbXBvbmVudChVSUNvbXBvbmVudCB0cmluaWRhZENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYoIXRoaXMuY29tcG9uZW50TGlzdC5jb250YWlucyh0cmluaWRhZENvbXBvbmVudCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5jb21wb25lbnRMaXN0LmFkZCh0cmluaWRhZENvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcm9sbGJhY2soKQ0KLSAgICB7DQotICAgICAgICBmb3IgKFVJQ29tcG9uZW50IGNvbXBvbmVudCA6IHRoaXMuY29tcG9uZW50TGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZW1vdmVUcmluaWRhZFZhbGlkYXRvcldyYXBwZXIoY29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRoaXMuY29tcG9uZW50TGlzdC5jbGVhcigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZW1vdmVUcmluaWRhZFZhbGlkYXRvcldyYXBwZXIoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVtb3ZlV3JhcHBlckZyb21Db21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vdG8ga2VlcCB0aGUgc291cmNlIGluIHN5bmMgd2l0aCBvbGRlciB2ZXJzaW9ucw0KLSAgICAgICAgICAgIGZvciAoT2JqZWN0IGNoaWxkIDogdWlDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlbW92ZVRyaW5pZGFkVmFsaWRhdG9yV3JhcHBlcigoVUlDb21wb25lbnQpY2hpbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlV3JhcHBlckZyb21Db21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGZvciAoVmFsaWRhdG9yIHZhbGlkYXRvciA6ICgoRWRpdGFibGVWYWx1ZUhvbGRlcikgdWlDb21wb25lbnQpLmdldFZhbGlkYXRvcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKSB1aUNvbXBvbmVudCkucmVtb3ZlVmFsaWRhdG9yKHZhbGlkYXRvcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTWFuYWdlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MDFkYzUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLm1hcHBlci5EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgY29tcG9uZW50IGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTWFuYWdlcg0KLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8VHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlPg0KLXsNCi0gICAgcHVibGljIERlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBEZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBTdG9yYWdlTWFuYWdlci5jbGFzcy5nZXROYW1lKCkgKyAiX0ZPUl9UUklOSURBRF9DTElFTlRfVkFMSURBVE9SOktFWSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9UcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc4M2NiOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9UcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi0NCi0vKioNCi0gKiBleHR2YWwgaW5qZWN0cyBjbGllbnQtdmFsaWRhdG9ycyBpbnRvIHRyaW5pZGFkIGNvbXBvbmVudHMgYmFzZWQgb24gbWV0YS1kYXRhLg0KLSAqIHNvIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gaXMgc3VwcG9ydGVkLiBzb21lIGFwcC1zZXJ2ZXJzIHNob3cgYSBkaWZmZXJlbnQgYmVoYXZpb3VyLg0KLSAqIHRoYXQncyB0aGUgcmVhc29uIGZvciBzdG9yaW5nIHRoZXNlIGNvbXBvbmVudHMgYW5kIHJlbW92ZSB0aGUgaW5qZWN0ZWQgdmFsaWRhdG9ycyBhZnRlciB0aGUgcmVuZGVyaW5nIHBoYXNlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBhZGRDb21wb25lbnQoVUlDb21wb25lbnQgdHJpbmlkYWRDb21wb25lbnQpOw0KLSAgICB2b2lkIHJvbGxiYWNrKCk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL21hcHBlci9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL21hcHBlci9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlNjliMy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLlRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UuRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiB1c2UgYSBwdWJsaWMgY2xhc3MgdG8gYWxsb3cgb3B0aW9uYWwgZGVyZWdpc3RyYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC91dGlsL1RyaW5pZGFkVXRpbHMuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC91dGlsL1RyaW5pZGFkVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE2MzgzMi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdXRpbC9UcmluaWRhZFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJjaGVjayBzdWJmb3JtIikNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRVdGlscw0KLXsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coVHJpbmlkYWRVdGlscy5jbGFzcyk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVUlDb21wb25lbnQgZmluZExhYmVsZWRFZGl0YWJsZUNvbXBvbmVudChDb3JlT3V0cHV0TGFiZWwgY29yZU91dHB1dExhYmVsKQ0KLSAgICB7DQotICAgICAgICAvL1RPRE8NCi0gICAgICAgIGlmKGlzTGFiZWxUYXJnZXRBdmFpbGFibGUoY29yZU91dHB1dExhYmVsKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBVSUNvbXBvbmVudCByZXN1bHQgPSByZXNvbHZlTGFiZWxUYXJnZXQoZmFjZXNDb250ZXh0LCBjb3JlT3V0cHV0TGFiZWwpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoTE9HLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgTE9HLnRyYWNlKGNvcmVPdXRwdXRMYWJlbC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpICsgIiBkb2Vzbid0IHJlZmVyZW5jZSBhbiBlZGl0YWJsZSBjb21wb25lbnQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFVJQ29tcG9uZW50IHJlc29sdmVMYWJlbFRhcmdldChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBDb3JlT3V0cHV0TGFiZWwgY29yZU91dHB1dExhYmVsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZmluZENvbXBvbmVudChjb3JlT3V0cHV0TGFiZWwuZ2V0Rm9yKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMYWJlbFRhcmdldEF2YWlsYWJsZShDb3JlT3V0cHV0TGFiZWwgY29yZU91dHB1dExhYmVsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29yZU91dHB1dExhYmVsLmdldEZvcigpID09IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYzIxY2MuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5IGV4dGVuZHMgRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xhYmVsZWRGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIFRyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2Uoc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZTY5M2IuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuTGFiZWxlZE1lc3NhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC51dGlsLkxhYmVsZWRGYWNlc01lc3NhZ2U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBUcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UgZXh0ZW5kcyBMYWJlbGVkRmFjZXNNZXNzYWdlIGltcGxlbWVudHMgTGFiZWxlZE1lc3NhZ2UNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYzNTY4MDA2ODk5NjE1MDUxNTRMOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX1JFU09VUkNFX01BUktFUiA9ICI/Pz8iOw0KLQ0KLSAgICBwdWJsaWMgVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlKFNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgc3VwZXIoc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TGFiZWxBc1N0cmluZyhGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN1bW1hcnkoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UgcmVzdWx0ID0gdHJ5VG9QbGFjZUxhYmVsKHN1cGVyLmdldFN1bW1hcnkoKSk7DQotDQotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3VwZXIuc2V0U3VtbWFyeShyZXN1bHQuZ2V0U3VtbWFyeSgpKTsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmdldFN1bW1hcnkoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRTdW1tYXJ5KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGV0YWlsKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIHJlc3VsdCA9IHRyeVRvUGxhY2VMYWJlbChzdXBlci5nZXREZXRhaWwoKSk7DQotDQotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3VwZXIuc2V0RGV0YWlsKHJlc3VsdC5nZXREZXRhaWwoKSk7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5nZXREZXRhaWwoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5nZXREZXRhaWwoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEZhY2VzTWVzc2FnZSB0cnlUb1BsYWNlTGFiZWwoU3RyaW5nIG9yaWdpbmFsTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGlzVmFsaWRNZXNzYWdlKG9yaWdpbmFsTWVzc2FnZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIG5ld0ZhY2VzTWVzc2FnZSA9IGNyZWF0ZU9yaWdpbmFsRmFjZXNNZXNzYWdlKCk7DQotICAgICAgICAgICAgdHJ5VG9QbGFjZUxhYmVsSW4obmV3RmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICByZXR1cm4gbmV3RmFjZXNNZXNzYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBGYWNlc01lc3NhZ2UgY3JlYXRlT3JpZ2luYWxGYWNlc01lc3NhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEZhY2VzTWVzc2FnZShzdXBlci5nZXRTZXZlcml0eSgpLCBzdXBlci5nZXRTdW1tYXJ5KCksIHN1cGVyLmdldERldGFpbCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9QbGFjZUxhYmVsSW4oRmFjZXNNZXNzYWdlIG5ld0ZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGxhYmVsID0gZ2V0TGFiZWxUZXh0KCk7DQotDQotICAgICAgICBpZihsYWJlbCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9QbGFjZUxhYmVsKG5ld0ZhY2VzTWVzc2FnZSwgbGFiZWwsIGkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZE1lc3NhZ2UoU3RyaW5nIG9yaWdpbmFsTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICEob3JpZ2luYWxNZXNzYWdlICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgb3JpZ2luYWxNZXNzYWdlLnN0YXJ0c1dpdGgoTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIpICYmDQotICAgICAgICAgICAgICAgIG9yaWdpbmFsTWVzc2FnZS5lbmRzV2l0aChNSVNTSU5HX1JFU09VUkNFX01BUktFUikpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldExhYmVsKGxhYmVsKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjFjZjkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQyOGMyZS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlIHByb3ZpZGVzIHNwZWNpYWwgVHJpbmlkYWQgU3VwcG9ydCBmb3IgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvci4NCi0gICAgRnVydGhlcm1vcmUsIGl0IGFsbG93cyB0byBqb2luIHRoZSBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIG1lY2hhbmlzbSBvZiBUcmluaWRhZC4gU2FtcGxlIHVzZS1jYXNlOiBhbm5vdGF0ZSB5b3VyIG1vZGVsIHdpdGggSlBBIDEuMCBhbm5vdGF0aW9ucywgYmluZCBwcm9wZXJ0aWVzIHRvIEpTRiBJbnB1dCBjb21wb25lbnRzIGFuZCBnZXQgYXV0b21hdGljIGNsaWVudC1zaWRlIHZhbGlkYXRpb24ganVzdCBieSBhZGRpbmcgMyBKQVIgZmlsZXMgKE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSwgUHJvcGVydHkgVmFsaWRhdGlvbiBhbmQgVHJpbmlkYWQgU3VwcG9ydCkuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLnggYW5kIEpTRiAyLnguIEFsbCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9wb20ueG1sIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZTQ5NzkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQ29yZTwvbmFtZT4NCi0gICAgPHZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+DQotDQotICAgIDxzY20+DQotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9jb3JlPC9jb25uZWN0aW9uPg0KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvcmU8L2RldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9jb3JlPC91cmw+DQotICAgIDwvc2NtPg0KLSAgICANCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cmVzb3VyY2VzPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICA8L3Jlc291cmNlcz4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MTk1NmEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMl8wLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjIuMCI+DQotICAgIDxmYWN0b3J5Pg0KLSAgICAgICAgPHJlbmRlci1raXQtZmFjdG9yeT5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyS2l0RmFjdG9yeTwvcmVuZGVyLWtpdC1mYWN0b3J5Pg0KLSAgICA8L2ZhY3Rvcnk+DQotDQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5FeHRWYWxTdGFydHVwTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0V4dFZhbEluZm9ybWF0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkNWQxYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLQ0KLS8qKg0KLSAqIGRvbnQndCBtb3ZlIHRvIGFuIG90aGVyIHBhY2thZ2UhISENCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBFeHRWYWxJbmZvcm1hdGlvbg0KLXsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSA9IEV4dFZhbEluZm9ybWF0aW9uLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCWE1MX1BBUkFNX1BSRUZJWCA9IEV4dFZhbEluZm9ybWF0aW9uLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9IENsYXNzVXRpbHMuZ2V0SmFyVmVyc2lvbihFeHRWYWxJbmZvcm1hdGlvbi5jbGFzcyk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0N1c3RvbUluZm9ybWF0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9DdXN0b21JbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmRhMzllLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0N1c3RvbUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSX0pDQotcHVibGljIGVudW0gQ3VzdG9tSW5mb3JtYXRpb24NCi17DQotICAgIEJBU0VfUEFDS0FHRSwNCi0NCi0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IsDQotICAgIFZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUiwNCi0NCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYLA0KLSAgICBWQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWCwNCi0gICAgTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVgsDQotDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfVE9fTVNHX1JFU09MVkVSX05BTUVfTUFQUEVSLA0KLSAgICBNRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUiwNCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIsDQotDQotICAgIFNUQVJUVVBfTElTVEVORVIsDQotICAgIENPTVBPTkVOVF9JTklUSUFMSVpFUiwNCi0gICAgVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IsDQotICAgIFBST1BFUlRZX1ZBTElEQVRJT05fSU5URVJDRVBUT1IsDQotICAgIE1FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SLA0KLQ0KLSAgICBNRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwNCi0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwNCi0gICAgVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlksDQotICAgIFZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlksDQotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLA0KLSAgICBGQUNFU19NRVNTQUdFX0ZBQ1RPUlksDQotICAgIFNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZLA0KLQ0KLSAgICBNRVNTQUdFX0JVTkRMRV9OQU1FLA0KLSAgICBTVEFUSUNfU1RSQVRFR1lfTUFQUElOR19TT1VSQ0UsDQotDQotICAgIE1FVEFfREFUQV9TVE9SQUdFX0ZJTFRFUg0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9EZWZhdWx0UHJvamVjdFN0YWdlUmVzb2x2ZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0RlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzRkMTBhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0RlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlciBpbXBsZW1lbnRzIFByb2plY3RTdGFnZVJlc29sdmVyDQotew0KLSAgICBwdWJsaWMgUHJvamVjdFN0YWdlIGdldEN1cnJlbnRQcm9qZWN0U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHVzZSB0aGUgZGVmYXVsdCBleHR2YWwgbWVjaGFuaXNtIHRvIGF2b2lkIHRvbyBlYXJseSBldmFsdWF0aW9uIHdpdGggbW9qYXJyYQ0KLSAgICAgICAgU3RyaW5nIHJlc3VsdDsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRBcHBsaWNhdGlvbigpLmdldFByb2plY3RTdGFnZSgpLnRvU3RyaW5nKCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVByb2plY3RTdGFnZShnZXREZWZhdWx0UHJvamVjdFN0YWdlKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwgfHwgIiIuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVByb2plY3RTdGFnZShnZXREZWZhdWx0UHJvamVjdFN0YWdlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZVByb2plY3RTdGFnZShQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKHJlc3VsdC50cmltKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgUHJvamVjdFN0YWdlIGNyZWF0ZVByb2plY3RTdGFnZShQcm9qZWN0U3RhZ2VOYW1lIHByb2plY3RTdGFnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2UocHJvamVjdFN0YWdlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBQcm9qZWN0U3RhZ2VOYW1lIGdldERlZmF1bHRQcm9qZWN0U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0RGVmYXVsdFN0YWdlTmFtZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHQuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4OTViZi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkRlZmF1bHRGYWN0b3J5RmluZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeUZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlJlbmRlcmVySW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXIuUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgRXh0VmFsQ29udGV4dAotewotICAgIHByaXZhdGUgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRXh0VmFsQ29udGV4dCBleHRWYWxDb250ZXh0OwotCi0gICAgLy9kb24ndCB0cnkgdG8gcmVzb2x2ZSBpdCBkeW5hbWljYWxseSBlLmcuIHZpYSBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiAtIHRoZXJlJ3MgYSBtb2phcnJhIGlzc3VlCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9FWFRWQUxfQ09OVEVYVF9DTEFTU19OQU1FID0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuY2xhc3MuZ2V0TmFtZSgpLnJlcGxhY2UoIi5jb3JlLiIsICIuY3VzdG9tLiIpOwotCi0gICAgcHJpdmF0ZSBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7Ci0gICAgcHJpdmF0ZSBGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIgPSBEZWZhdWx0RmFjdG9yeUZpbmRlci5nZXRJbnN0YW5jZSgpOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUmVuZGVyZXJJbnRlcmNlcHRvcj4gcmVuZGVyZXJJbnRlcmNlcHRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlbmRlcmVySW50ZXJjZXB0b3I+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZGVuaWVkSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI+IHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzID0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcj4oKTsKLQotICAgIHByaXZhdGUgU2tpcFZhbGlkYXRpb25FdmFsdWF0b3Igc2tpcFZhbGlkYXRpb25FdmFsdWF0b3I7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2xvYmFsUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLCBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+Pj4gc3RhdGljQ29uZmlnTWFwCi0gICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcywgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4+KCk7Ci0KLSAgICBwcml2YXRlIEV4dFZhbENvbnRleHRJbnRlcm5hbHMgY29udGV4dEhlbHBlcjsKLSAgICBwcml2YXRlIEV4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscyBpbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXI7Ci0KLSAgICBwcm90ZWN0ZWQgRXh0VmFsQ29udGV4dCgpCi0gICAgewotICAgICAgICB0aGlzLmNvbnRleHRIZWxwZXIgPSBuZXcgRXh0VmFsQ29udGV4dEludGVybmFscygpOwotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlciA9IG5ldyBFeHRWYWxDb250ZXh0SW52b2NhdGlvbk9yZGVyQXdhcmVJbnRlcm5hbHModGhpcy5jb250ZXh0SGVscGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEV4dFZhbENvbnRleHQgZ2V0Q29udGV4dCgpCi0gICAgewotICAgICAgICBpZiAoZXh0VmFsQ29udGV4dCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBleHRWYWxDb250ZXh0ID0gbmV3IEV4dFZhbENvbnRleHQoKTsKLQotICAgICAgICAgICAgdHJ5VG9DcmVhdGVDdXN0b21FeHRWYWxDb250ZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGV4dFZhbENvbnRleHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0cnlUb0NyZWF0ZUN1c3RvbUV4dFZhbENvbnRleHQoKQotICAgIHsKLSAgICAgICAgT2JqZWN0IGN1c3RvbUV4dFZhbENvbnRleHQgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoQ1VTVE9NX0VYVFZBTF9DT05URVhUX0NMQVNTX05BTUUpOwotCi0gICAgICAgIGlmIChjdXN0b21FeHRWYWxDb250ZXh0IGluc3RhbmNlb2YgRXh0VmFsQ29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgZXh0VmFsQ29udGV4dCA9IChFeHRWYWxDb250ZXh0KSBjdXN0b21FeHRWYWxDb250ZXh0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcihWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIpCi0gICAgewotICAgICAgICBzZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoCi0gICAgICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIsIGJvb2xlYW4gZm9yY2VPdmVycmlkZSkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLnZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgPT0gbnVsbCB8fCBmb3JjZU92ZXJyaWRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpICYmIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuZ2V0Q2xhc3MoKSArICIgaXMgdXNlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyID0gdmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKQotICAgIHsKLSAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciByZXF1ZXN0U2NvcGVkSW50ZXJwcmV0ZXIgPSB0aGlzLmNvbnRleHRIZWxwZXIKLSAgICAgICAgICAgICAgICAuZ2V0UmVxdWVzdFNjb3BlZFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsKLQotICAgICAgICBpZihyZXF1ZXN0U2NvcGVkSW50ZXJwcmV0ZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RTY29wZWRJbnRlcnByZXRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzLnZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIEZhY3RvcnlGaW5kZXIKLSAgICAqLwotICAgIHB1YmxpYyBGYWN0b3J5RmluZGVyIGdldEZhY3RvcnlGaW5kZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZmFjdG9yeUZpbmRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGYWN0b3J5RmluZGVyKEZhY3RvcnlGaW5kZXIgZmFjdG9yeUZpbmRlcikKLSAgICB7Ci0gICAgICAgIGlmIChmYWN0b3J5RmluZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZmFjdG9yeUZpbmRlciA9IGZhY3RvcnlGaW5kZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoU2tpcFZhbGlkYXRpb25FdmFsdWF0b3Igc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IpCi0gICAgewotICAgICAgICBzZXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcihza2lwVmFsaWRhdGlvbkV2YWx1YXRvciwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoU2tpcFZhbGlkYXRpb25FdmFsdWF0b3Igc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IsIGJvb2xlYW4gZm9yY2VPdmVycmlkZSkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLnNraXBWYWxpZGF0aW9uRXZhbHVhdG9yID09IG51bGwgfHwgZm9yY2VPdmVycmlkZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRoaXMubG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSAmJiBza2lwVmFsaWRhdGlvbkV2YWx1YXRvciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuZ2V0Q2xhc3MoKSArICIgaXMgdXNlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5za2lwVmFsaWRhdGlvbkV2YWx1YXRvciA9IHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIGdldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLnNraXBWYWxpZGF0aW9uRXZhbHVhdG9yID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHNraXBWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksIE1ldGFEYXRhRW50cnkgZW50cnkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzLnNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUmVuZGVyZXJJbnRlcmNlcHRvcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxSZW5kZXJlckludGVyY2VwdG9yPiBnZXRSZW5kZXJlckludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxSZW5kZXJlckludGVyY2VwdG9yPih0aGlzLnJlbmRlcmVySW50ZXJjZXB0b3JzLnZhbHVlcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChFeHRWYWxDb250ZXh0LmNsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGhpcy5kZW5pZWRJbnRlcmNlcHRvcnMuY29udGFpbnMocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy5yZW5kZXJlckludGVyY2VwdG9ycy5wdXQocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCksIHJlbmRlcmVySW50ZXJjZXB0b3IpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlcmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKENsYXNzPD8gZXh0ZW5kcyBSZW5kZXJlckludGVyY2VwdG9yPiByZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpCi0gICAgewotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzcyhyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoRXh0VmFsQ29udGV4dC5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5yZW5kZXJlckludGVyY2VwdG9ycy5yZW1vdmUocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy9pZiBhbiBpbnRlcmNlcHRvciBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkIHNvIGZhciwgaXQgc2hvdWxkIGJlIGRlbmllZCBhdCBmdXR1cmUgcmVnaXN0cmF0aW9ucwotICAgIHB1YmxpYyB2b2lkIGRlbnlSZW5kZXJlckludGVyY2VwdG9yKENsYXNzPD8gZXh0ZW5kcyBSZW5kZXJlckludGVyY2VwdG9yPiByZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpCi0gICAgewotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzcyhyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoRXh0VmFsQ29udGV4dC5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCF0aGlzLmRlbmllZEludGVyY2VwdG9ycy5jb250YWlucyhyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5kZW5pZWRJbnRlcmNlcHRvcnMuYWRkKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZXJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ29tcG9uZW50SW5pdGlhbGl6ZXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIoQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdENvbXBvbmVudEluaXRpYWxpemVycygpOwotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5hZGRDb21wb25lbnRJbml0aWFsaXplcihjb21wb25lbnRJbml0aWFsaXplcik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+IGdldENvbXBvbmVudEluaXRpYWxpemVycygpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdENvbXBvbmVudEluaXRpYWxpemVycygpOwotICAgICAgICByZXR1cm4gdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuZ2V0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPiBnZXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmxhenlJbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhbGwgZ2xvYmFsIHZhbGlkYXRpb24gaW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IGdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IGdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc0ZvcihDbGFzcyBtb2R1bGVLZXkpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzRm9yKG1vZHVsZUtleSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmxhenlJbml0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGFsbCBnbG9iYWwgbWV0YS1kYXRhIGV4dHJhY3Rpb24gaW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc0ZvcihDbGFzcyBtb2R1bGVLZXkpCi0gICAgewotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgICAgICBpZihtb2R1bGVLZXkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCksIG1vZHVsZUtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc1dpdGgocHJvcGVydGllcyk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc1dpdGgoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc1dpdGgocHJvcGVydGllcyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI+IGdldFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciBwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycy5hZGQocHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbgotICAgICAqLwotICAgIHB1YmxpYyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBnZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0SGVscGVyLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTdGF0aWNDb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IGdldFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzIG5hbWUpCi0gICAgewotICAgICAgICBpZiAoIXRoaXMuc3RhdGljQ29uZmlnTWFwLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBzdGF0aWNDb25maWdMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4oKTsKLSAgICAgICAgICAgIHRoaXMuc3RhdGljQ29uZmlnTWFwLnB1dChuYW1lLCBzdGF0aWNDb25maWdMaXN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5zdGF0aWNDb25maWdNYXAuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzIG5hbWUsIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZykKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gc3RhdGljQ29uZmlnTGlzdDsKLSAgICAgICAgICAgIGlmICghdGhpcy5zdGF0aWNDb25maWdNYXAuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5zdGF0aWNDb25maWdNYXAucHV0KG5hbWUsIHN0YXRpY0NvbmZpZ0xpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5zdGF0aWNDb25maWdNYXAuZ2V0KG5hbWUpLmFkZChzdGF0aWNDb25maWcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBHbG9iYWwgcHJvcGVydGllcwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gYWRkR2xvYmFsUHJvcGVydHkobmFtZSwgdmFsdWUsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gZm9yY2VPdmVycmlkZSkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLmdsb2JhbFByb3BlcnRpZXMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghZm9yY2VPdmVycmlkZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygib3ZlcnJpZGUgZ2xvYmFsIHByb3BlcnR5ICciICsgbmFtZSArICInIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLkRldmVsb3BtZW50KSAmJiB0aGlzLmxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oImdsb2JhbCBwcm9wZXJ0eSBbIiArIG5hbWUgKyAiXSBhZGRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5nbG9iYWxQcm9wZXJ0aWVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0R2xvYmFsUHJvcGVydHkoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5nbG9iYWxQcm9wZXJ0aWVzLmdldChuYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0SW50ZXJuYWxzLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0SW50ZXJuYWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyY2ZkNWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dEludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgeC54LjMKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIEV4dFZhbENvbnRleHRJbnRlcm5hbHMKLXsKLSAgICBib29sZWFuIGlzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25BY3RpdmF0ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICEidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DT01QT05FTlRfSU5JVElBTElaQVRJT04pOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pCi0gICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gaW5pdEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKE1hcCBhcHBsaWNhdGlvbk1hcCkKLSAgICB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fSU5GT1JNQVRJT05fUFJPVklERVJfQkVBTik7Ci0gICAgICAgIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lcy5hZGQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQ1VTVE9NX0JFQU4pOwotCi0gICAgICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuOwotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgaWYgKGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXBwbGljYXRpb25NYXAucHV0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSwgaW5mb3JtYXRpb25Qcm92aWRlckJlYW4pOwotICAgICAgICAgICAgICAgIHJldHVybiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeVRvSW5pdEN1c3RvbUNvbmZpZ3VyZWRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZShhcHBsaWNhdGlvbk1hcCk7Ci0KLSAgICAgICAgaWYgKGFwcGxpY2F0aW9uTWFwLmNvbnRhaW5zS2V5KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4pIGFwcGxpY2F0aW9uTWFwLmdldChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQotICAgIHZvaWQgdHJ5VG9Jbml0Q3VzdG9tQ29uZmlndXJlZEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lKE1hcCBhcHBsaWNhdGlvbk1hcCkKLSAgICB7Ci0gICAgICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGJlYW4gPSAoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4pIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkKLSAgICAgICAgICAgICAgICAuZ2V0QmVhbihJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5DVVNUT01fQkVBTi5yZXBsYWNlKCIuIiwgIl8iKSk7Ci0KLSAgICAgICAgaWYgKGJlYW4gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYXBwbGljYXRpb25NYXAucHV0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSwgYmVhbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBnZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpCi0gICAgewotICAgICAgICBNYXAgYXBwbGljYXRpb25NYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25NYXAoKTsKLSAgICAgICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gYmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgYXBwbGljYXRpb25NYXAuZ2V0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSk7Ci0KLSAgICAgICAgaWYgKGJlYW4gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGluaXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbihhcHBsaWNhdGlvbk1hcCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJlYW47Ci0gICAgfQotCi0gICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBnZXRSZXF1ZXN0U2NvcGVkVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZSgKLSAgICAgICAgICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5jbGFzcywgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKQotICAgICAgICAgICAgICAgIC5nZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscy5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOTM2NmMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIHgueC4zCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBFeHRWYWxDb250ZXh0SW52b2NhdGlvbk9yZGVyQXdhcmVJbnRlcm5hbHMKLXsKLSAgICBwcml2YXRlIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzID0gbnVsbDsKLSAgICBwcml2YXRlIE1hcDxDbGFzcywgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4+IG1vZHVsZVNwZWNpZmljTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzID0gbnVsbDsKLSAgICBwcml2YXRlIExpc3Q8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPiB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzID0gbnVsbDsKLSAgICBwcml2YXRlIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBNYXA8Q2xhc3MsIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+PiBtb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPiBjb21wb25lbnRJbml0aWFsaXplcnMgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBFeHRWYWxDb250ZXh0SW50ZXJuYWxzIGNvbnRleHRIZWxwZXI7Ci0KLSAgICBFeHRWYWxDb250ZXh0SW52b2NhdGlvbk9yZGVyQXdhcmVJbnRlcm5hbHMoRXh0VmFsQ29udGV4dEludGVybmFscyBjb250ZXh0SGVscGVyKQotICAgIHsKLSAgICAgICAgdGhpcy5jb250ZXh0SGVscGVyID0gY29udGV4dEhlbHBlcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENvbXBvbmVudEluaXRpYWxpemVycwotICAgICAqLwotICAgIHZvaWQgYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIoQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIpCi0gICAgewotICAgICAgICB0aGlzLmNvbXBvbmVudEluaXRpYWxpemVycy5hZGQoY29tcG9uZW50SW5pdGlhbGl6ZXIpOwotICAgICAgICBzb3J0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7Ci0gICAgfQotCi0gICAgTGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4gZ2V0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHRIZWxwZXIuaXNDb21wb25lbnRJbml0aWFsaXphdGlvbkFjdGl2YXRlZCgpID8KLSAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudEluaXRpYWxpemVycyA6IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+KCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgdm9pZCBhZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHRoaXMudmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycy5hZGQodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKTsKLSAgICAgICAgc29ydFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICB9Ci0KLSAgICBMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4gZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgdm9pZCBhZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBpbnN0YW5jZW9mIFZhbGlkYXRpb25Nb2R1bGVBd2FyZSkKLSAgICAgICAgewotICAgICAgICAgICAgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGVzKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsKLSAgICAgICAgICAgIHNvcnRNb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUobnVsbCwgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOwotICAgICAgICAgICAgc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBnZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IoQ2xhc3MgbW9kdWxlS2V5KQotICAgIHsKLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4oKTsKLQotICAgICAgICByZXN1bHQuYWRkQWxsKGdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpKTsKLQotICAgICAgICBpZiAobW9kdWxlS2V5ICE9IG51bGwgJiYgdGhpcy5tb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5jb250YWluc0tleShtb2R1bGVLZXkpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRoaXMubW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMuZ2V0KG1vZHVsZUtleSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzb3J0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0KHJlc3VsdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlcyhQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIENsYXNzIG1vZHVsZUtleTsKLSAgICAgICAgZm9yIChTdHJpbmcgY3VycmVudE1vZHVsZUtleSA6ICgoVmFsaWRhdGlvbk1vZHVsZUF3YXJlKSBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcikuZ2V0TW9kdWxlS2V5cygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb2R1bGVLZXkgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShjdXJyZW50TW9kdWxlS2V5KTsKLQotICAgICAgICAgICAgaWYgKG1vZHVsZUtleSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckZvck1vZHVsZShtb2R1bGVLZXksIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckZvck1vZHVsZSgKLSAgICAgICAgICAgIENsYXNzIG1vZHVsZUtleSwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBpZiAobW9kdWxlS2V5ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzLmFkZChwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7Ci0KLSAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIGFzIGdsb2JhbCBpbnRlcmNlcHRvciIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0OwotICAgICAgICAgICAgaWYgKHRoaXMubW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMuY29udGFpbnNLZXkobW9kdWxlS2V5KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QgPSB0aGlzLm1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzLmdldChtb2R1bGVLZXkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+KCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5tb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5wdXQobW9kdWxlS2V5LCBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0LmFkZChwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7Ci0KLSAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIGZvciAiICsgbW9kdWxlS2V5LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycwotICAgICAqLwotICAgIHZvaWQgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBpZihtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBpbnN0YW5jZW9mIFZhbGlkYXRpb25Nb2R1bGVBd2FyZSkKLSAgICAgICAgewotICAgICAgICAgICAgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGVzKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsKLSAgICAgICAgICAgIHNvcnRNb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUobnVsbCwgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpOwotICAgICAgICAgICAgc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlcyhNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIENsYXNzIG1vZHVsZUtleTsKLSAgICAgICAgZm9yIChTdHJpbmcgY3VycmVudE1vZHVsZUtleSA6ICgoVmFsaWRhdGlvbk1vZHVsZUF3YXJlKSBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcikuZ2V0TW9kdWxlS2V5cygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb2R1bGVLZXkgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShjdXJyZW50TW9kdWxlS2V5KTsKLQotICAgICAgICAgICAgaWYgKG1vZHVsZUtleSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckZvck1vZHVsZShtb2R1bGVLZXksIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckZvck1vZHVsZSgKLSAgICAgICAgICAgIENsYXNzIG1vZHVsZUtleSwgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBpZiAobW9kdWxlS2V5ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLmFkZChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0KLSAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIGFzIGdsb2JhbCBpbnRlcmNlcHRvciIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0OwotICAgICAgICAgICAgaWYgKHRoaXMubW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMuY29udGFpbnNLZXkobW9kdWxlS2V5KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QgPSB0aGlzLm1vZHVsZVNwZWNpZmljTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLmdldChtb2R1bGVLZXkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+KCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5wdXQobW9kdWxlS2V5LCBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0LmFkZChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0KLSAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIGZvciAiICsgbW9kdWxlS2V5LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc1dpdGgoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQotICAgIHsKLSAgICAgICAgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4oKTsKLQotICAgICAgICByZXN1bHQuYWRkQWxsKGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpKTsKLQotICAgICAgICBDbGFzcyBtb2R1bGVLZXkgPSB0cnlUb1Jlc29sdmVNb2R1bGVLZXkocHJvcGVydGllcyk7Ci0gICAgICAgIGlmKG1vZHVsZUtleSAhPSBudWxsICYmIHRoaXMubW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMuY29udGFpbnNLZXkobW9kdWxlS2V5KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0aGlzLm1vZHVsZVNwZWNpZmljTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLmdldChtb2R1bGVLZXkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzb3J0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0KHJlc3VsdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGFzcyB0cnlUb1Jlc29sdmVNb2R1bGVLZXkoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQotICAgIHsKLSAgICAgICAgQ2xhc3MgbW9kdWxlS2V5ID0gbnVsbDsKLSAgICAgICAgaWYocHJvcGVydGllcyAhPSBudWxsICYmIHByb3BlcnRpZXMuY29udGFpbnNLZXkoVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgZm91bmRWYWx1ZSA9IHByb3BlcnRpZXMuZ2V0KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGlmKGZvdW5kVmFsdWUgaW5zdGFuY2VvZiBDbGFzcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb2R1bGVLZXkgPSAoQ2xhc3MpZm91bmRWYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbW9kdWxlS2V5OwotICAgIH0KLQotICAgIC8qCi0gICAgICogaW5pdAotICAgICAqLwotCi0gICAgdm9pZCBsYXp5SW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgaWYgKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycyA9IG5ldyBBcnJheUxpc3Q8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPigpOwotICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IpOwotICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZCh0aGlzLmNvbnRleHRIZWxwZXIuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUikpOwotCi0gICAgICAgIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7Ci0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUgOiB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgPQotICAgICAgICAgICAgICAgICAgICAoVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lKTsKLQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMuYWRkKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcik7Ci0KLSAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgbGF6eUluaXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgaWYgKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMgPSBuZXcgQXJyYXlMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPigpOwotICAgICAgICBtb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyA9IG5ldyBIYXNoTWFwPENsYXNzLCBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPj4oKTsKLQotICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SKTsKLSAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZCh0aGlzLmNvbnRleHRIZWxwZXIuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUikpOwotCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOwotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lIDogbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgIChNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgbGF6eUluaXRDb21wb25lbnRJbml0aWFsaXplcnMoKQotICAgIHsKLSAgICAgICAgaWYgKGNvbXBvbmVudEluaXRpYWxpemVycyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMgPSBuZXcgQXJyYXlMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPigpOwotICAgICAgICBMaXN0PFN0cmluZz4gY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9DT01QT05FTlRfSU5JVElBTElaRVIpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKHRoaXMuY29udGV4dEhlbHBlci5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfSU5JVElBTElaRVIpKTsKLQotICAgICAgICBDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplcjsKLSAgICAgICAgZm9yIChTdHJpbmcgY29tcG9uZW50SW5pdGlhbGl6ZXJOYW1lIDogY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb21wb25lbnRJbml0aWFsaXplciA9Ci0gICAgICAgICAgICAgICAgICAgIChDb21wb25lbnRJbml0aWFsaXplcikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNvbXBvbmVudEluaXRpYWxpemVyTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChjb21wb25lbnRJbml0aWFsaXplciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQoY29tcG9uZW50SW5pdGlhbGl6ZXIpOwotCi0gICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGNvbXBvbmVudEluaXRpYWxpemVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgbGF6eUluaXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgaWYgKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPigpOwotICAgICAgICBtb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycyA9IG5ldyBIYXNoTWFwPENsYXNzLCBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPj4oKTsKLQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIHZhbGlkYXRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fUFJPUEVSVFlfVkFMSURBVElPTl9JTlRFUkNFUFRPUik7Ci0gICAgICAgIHZhbGlkYXRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKHRoaXMuY29udGV4dEhlbHBlci5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbUluZm9ybWF0aW9uLlBST1BFUlRZX1ZBTElEQVRJT05fSU5URVJDRVBUT1IpKTsKLQotICAgICAgICBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsKLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvbkludGVyY2VwdG9yTmFtZSA6IHZhbGlkYXRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yID0KLSAgICAgICAgICAgICAgICAgICAgKFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uSW50ZXJjZXB0b3JOYW1lKTsKLQotICAgICAgICAgICAgaWYgKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIGluc3RhbmNlb2YgVmFsaWRhdGlvbk1vZHVsZUF3YXJlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGVzKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUobnVsbCwgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogc29ydAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzb3J0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCkKLSAgICB7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQodGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMsIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPENvbXBvbmVudEluaXRpYWxpemVyPigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRoaXMucHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzLAotICAgICAgICAgICAgICAgIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPigpKTsKLSAgICB9Ci0KLSAgICAvL3NvcnQgYWxsIC0gaXQgaXNuJ3QgYSBodWdlIG92ZXJoZWFkIHNpbmNlIGl0J3MganVzdCBkb25lIGR1cmluZyB0aGUgaW5pdC1waGFzZQotICAgIHByaXZhdGUgdm9pZCBzb3J0TW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgZm9yKExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdCA6Ci0gICAgICAgICAgICAgICAgdGhpcy5tb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy52YWx1ZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdChwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBzb3J0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0KAotICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0KQotICAgIHsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPigpKTsKLQotICAgICAgICByZXR1cm4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzb3J0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRoaXMudmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycywKLSAgICAgICAgICAgICAgICBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+KCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzb3J0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQodGhpcy5tZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMsCi0gICAgICAgICAgICAgICAgbmV3IEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+KCkpOwotICAgIH0KLQotICAgIC8vc29ydCBhbGwgLSBpdCBpc24ndCBhIGh1Z2Ugb3ZlcmhlYWQgc2luY2UgaXQncyBqdXN0IGRvbmUgZHVyaW5nIHRoZSBpbml0LXBoYXNlCi0gICAgcHJpdmF0ZSB2b2lkIHNvcnRNb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBmb3IoTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0IDoKLSAgICAgICAgICAgICAgICB0aGlzLm1vZHVsZVNwZWNpZmljTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLnZhbHVlcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzb3J0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0KG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IHNvcnRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QoCi0gICAgICAgICAgICBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QpCi0gICAgewotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+KCkpOwotCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3Q7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTU4N2E1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJlbid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKiArIHNvbWUgb2YgdGhlbSBjYW4gYmUgY3VzdG9taXplZCB3aXRoaW4gYSBjdXN0b20gaW1wbC4gb2YgdGhlIGJlYW4NCi0gKiAoZXh0ZW5kIHRoaXMgY2xhc3MgYW5kIHByb3ZpZGUgaXQgdmlhIGNvbnZlbnRpb24gb3Igd2ViLnhtbCkNCi0gKiA8cC8+DQotICogdGhlIHN0YXRpYyBhcGkgc2hvdWxkIG9ubHkgYmUgdXNlZA0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUFOX05BTUUgPSBFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRQ0KLSAgICAgICAgKyAiLiIgKyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7DQotICAgIC8vY3VzdG9tIGNsYXNzIHdoaWNoIGlzIGFuIG9wdGlvbmFsIHJlcGxhY2VtZW50IGZvciB0aGlzIGNsYXNzIChoYXMgdG8gZXh0ZW5kIHRoaXMgY2xhc3MpDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CRUFOID0gKEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FDQotICAgICAgICArICIuY3VzdG9tLiIgKyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOw0KLQ0KLSAgICBwdWJsaWMgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc2V0dXBDdXN0b21pemFibGVJbmZvcm1hdGlvbigpOw0KLSAgICAgICAgYXBwbHlDdXN0b21WYWx1ZXModGhpcy5jdXN0b21pemFibGVJbmZvcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8Q3VzdG9tSW5mb3JtYXRpb24sIFN0cmluZz4gY3VzdG9taXphYmxlSW5mb3MgPSBuZXcgSGFzaE1hcDxDdXN0b21JbmZvcm1hdGlvbiwgU3RyaW5nPigpOw0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBDdXN0b21pemFibGVJbmZvcm1hdGlvbigpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBiYXNlUGFja2FnZSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fQkFTRV9QQUNLQUdFOw0KLQ0KLSAgICAgICAgaWYgKGJhc2VQYWNrYWdlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZVBhY2thZ2UgPSBFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSArICIuY3VzdG9tLiI7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWJhc2VQYWNrYWdlLmVuZHNXaXRoKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZVBhY2thZ2UgPSBiYXNlUGFja2FnZSArICIuIjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5CQVNFX1BBQ0tBR0UsIGJhc2VQYWNrYWdlKTsNCi0gICAgICAgIA0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SLA0KLSAgICAgICAgICAgICAgICAiQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1IsDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVgsDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVRyYW5zZm9ybWVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFX1JFU09MVkVSX1BPU1RGSVgsDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfSU5JVElBTElaRVIsDQotICAgICAgICAgICAgICAgICJDb21wb25lbnRJbml0aWFsaXplciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uUFJPUEVSVFlfVkFMSURBVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgICAgICAgICAgICAgIlByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IsDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTVNHX1JFU09MVkVSX05BTUVfTUFQUEVSLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUiwNCi0gICAgICAgICAgICAgICAgIk1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIsDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBUlRVUF9MSVNURU5FUiwNCi0gICAgICAgICAgICAgICAgIlN0YXJ0dXBMaXN0ZW5lciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIk1lc3NhZ2VSZXNvbHZlckZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIkNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1BBUkFNRVRFUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIk1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uRkFDRVNfTUVTU0FHRV9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiRmFjZXNNZXNzYWdlRmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiU3RvcmFnZU1hbmFnZXJGYWN0b3J5Iik7DQotDQotICAgICAgICAvL2NvbnZlbnRpb25zICh0aGUgcmVzdCBvZiB0aGUgY29udmVudGlvbnMgYXJlIGJ1aWx0IHdpdGggdGhlIGhlbHAgb2YgbmFtZSBtYXBwZXJzLC4uLg0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FU1NBR0VfQlVORExFX05BTUUsDQotICAgICAgICAgICAgICAgICJ2YWxpZGF0aW9uX21lc3NhZ2VzIik7DQotICAgICAgICAvL3N0YXRpYyBzdHJhdGVneSBtYXBwaW5ncyAobmFtZSBvZiBwcm9wZXJ0eSBmaWxlcykNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5TVEFUSUNfU1RSQVRFR1lfTUFQUElOR19TT1VSQ0UsDQotICAgICAgICAgICAgICAgICJzdHJhdGVneV9tYXBwaW5ncyIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9TVE9SQUdFX0ZJTFRFUiwNCi0gICAgICAgICAgICAgICAgIk1ldGFEYXRhU3RvcmFnZUZpbHRlciIpOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkNCi0gICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlDdXN0b21WYWx1ZXMoTWFwPEN1c3RvbUluZm9ybWF0aW9uLCBTdHJpbmc+IG1hcCkNCi0gICAgew0KLSAgICAgICAgLy9vdmVycmlkZSB0byBjdXN0b21pemUgaW5mb3JtYXRpb24NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldChDdXN0b21JbmZvcm1hdGlvbiBjdXN0b21JbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gY3VzdG9taXphYmxlSW5mb3MuZ2V0KGN1c3RvbUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIHN3aXRjaCAoY3VzdG9tSW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgY2FzZSBCQVNFX1BBQ0tBR0U6DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0NCi0gICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAqIHBvc3RmaXggdXNlZCBieSB0aGUgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLSAgICAgICAgICAgICAqIHRoZSBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGlzIGZvciBjdXN0b20gc3RyYXRlZ2llcyBvbmx5DQotICAgICAgICAgICAgICogKG5vdCBmb3IgcHVibGljIHZhbGlkYXRpb24gbW9kdWxlcykNCi0gICAgICAgICAgICAgKiBzbyBpdCdzIGZpbmUgdG8gY3VzdG9taXplIGl0DQotICAgICAgICAgICAgICovDQotICAgICAgICAgICAgY2FzZSBWQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVg6DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0NCi0gICAgICAgICAgICBjYXNlIFZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgY2FzZSBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfUE9TVEZJWDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIHJldHVybiBjdXN0b21pemFibGVJbmZvcy5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQkFTRV9QQUNLQUdFKSArIHZhbHVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDlmODY5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1vZHVsZU1lc3NhZ2VCdW5kbGVOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG5ld1BhY2thZ2VOYW1lOw0KLSAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmVuZHNXaXRoKCIucmVzb2x2ZXIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBuZXdQYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lLnJlcGxhY2UoIi5yZXNvbHZlciIsICIuYnVuZGxlIik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgbmV3UGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZS5yZXBsYWNlKCIucmVzb2x2ZXIuIiwgIi5idW5kbGUuIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbmV3UGFja2FnZU5hbWUgKyAiLnZhbGlkYXRpb25fbWVzc2FnZXMiOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB1c2UgYSBjdXN0b20gbmFtZSBtYXBwZXIgdG8gaW1wbGVtZW50IGN1c3RvbSBjb252ZW50aW9ucw0KLSAgICAgKi8NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUoDQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgU3RyaW5nIHRhcmdldENsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgIi5tZXNzYWdlLnJlc29sdmVyLiIsIHRhcmdldENsYXNzTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgNCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLCBTdHJpbmcgdGFyZ2V0Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLCAiLm1ldGFkYXRhLnRyYW5zZm9ybWVyLiIsIHRhcmdldENsYXNzTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZShDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRQYWNrYWdlTmFtZSwgU3RyaW5nIHRhcmdldENsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLmdldE5hbWUoKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5yZXBsYWNlKCIuc3RyYXRlZ3kuIiwgdGFyZ2V0UGFja2FnZU5hbWUpOw0KLQ0KLSAgICAgICAgaWYgKHRhcmdldENsYXNzTmFtZSA9PSBudWxsIHx8IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpID09IC0xKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZQ0KLSAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpKSArICIuIiArIHRhcmdldENsYXNzTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VSZXNvbHZlckNsYXNzTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCAiVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHVzZSBhIGN1c3RvbSBuYW1lIG1hcHBlciB0byBpbXBsZW1lbnQgY3VzdG9tIGNvbnZlbnRpb25zDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFLZXkucmVwbGFjZSgiLmFubm90YXRpb24uIiwgIi5zdHJhdGVneS4iKSArICJTdHJhdGVneSI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCAiTWV0YURhdGFUcmFuc2Zvcm1lciIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgU3RyaW5nIHRhcmdldFBvc3RmaXgpDQotICAgIHsNCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLmVuZHNXaXRoKCJWYWxpZGF0aW9uU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5zdWJzdHJpbmcoMCwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5sZW5ndGgoKSAtIDE4KSArIHRhcmdldFBvc3RmaXg7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLmVuZHNXaXRoKCJTdHJhdGVneSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLnN1YnN0cmluZygwLCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLmxlbmd0aCgpIC0gOCkgKyB0YXJnZXRQb3N0Zml4Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgKyB0YXJnZXRQb3N0Zml4Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZmZhZDguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi0NCi1AVGFyZ2V0KFRZUEUpDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotLyoqDQotICogYWxsb3dlZCB0byB1c2UgZm9yIGNsYXNzZXMgd2hpY2ggaW1wbGVtZW50IGludGVyZmFjZXMgd2hpY2ggaGF2ZSB0aGUgbWFya2VyIEBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotICoNCi0gKiBzdWdnZXN0ZWQgcmFuZ2VzIChtYWlubHkgZm9yIG5hbWUtbWFwcGVycyk6DQotICogbmVnYXRpdmUgdmFsdWVzIGZvciAiZXh0cmVtZSIgY2FzZXMNCi0gKg0KLSAqIDAtNDkgZm9yIGN1c3RvbSBhcnRpZmFjdHMgd2hpY2ggc2hvdWxkIGhhdmUgdGhlIGhpZ2hlc3QgcHJpb3JpdHkNCi0gKiA1MC05OSBmb3IgYWRkLW9ucyB3aGljaCBwcm92aWRlIGFydGlmYWN0cyB3aGljaCBzaG91bGQgaGF2ZSBhIGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZSBkZWZhdWx0IGFydGlmYWN0cw0KLSAqIDEwMC05OTkgaW50ZXJuYWwgYXJ0aWZhY3RzDQotICogMTAwMCsgZm9yIGN1c3RvbSBhcnRpZmFjdHMNCi0gKg0KLSAqIHN1Z2dlc3RlZCByYW5nZXMgZm9yIGFydGlmYWN0cyBsaWtlIGludGVyY2VwdG9ycywuLi4NCi0gKiAxeHggLi4uIGFydGlmYWN0cyBvZiB0aGUgY29yZQ0KLSAqIDJ4eCAuLi4gYXJ0aWZhY3RzIG9mIHZhbGlkYXRpb24gbW9kdWxlcw0KLSAqIDN4eCAuLi4gYXJ0aWZhY3RzIG9mIGNvbXBvbmVudCBzdXBwb3J0IG1vZHVsZXMNCi0gKg0KLSAqIGEgcHJpb3JpdHkgc2hvdWxkIGJlIHVuaXF1ZSB3aXRoaW4gb25lIGFydGlmYWN0LXR5cGUgLSB0aGF0IG1lYW5zDQotICogaWYgYSBuYW1lLW1hcHBlciBoYXMgcHJpb3JpdHkgMTAwLCBpdCdzIG9rIHRoYXQgYW4gZXhjZXB0aW9uLWludGVyY2VwdG9yIGFsc28gaGFzIHByaW9yaXR5IDEwMC4NCi0gKiBidXQgYSAybmQgbmFtZS1tYXBwZXIgc2hvdWxkbid0IGhhdmUgcHJpb3JpdHkgMTAwDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBJbnZvY2F0aW9uT3JkZXINCi17DQotICAgIC8qKg0KLSAgICAgKiBkZWZhdWx0IHByaW9yaXR5IGZvciBjdXN0b20gYXJ0aWZhY3RzIChpZiB0aGV5IHNob3VsZCBnZXQgYWRkZWQgYWZ0ZXIgdGhlIGludGVybmFsIHZlcnNpb25zDQotICAgICAqIEByZXR1cm4gdGhlIHByaW9yaXR5IG9mIGFuIGFydGlmYWN0IGFubm90YXRlZCB3aXRoIHRoaXMgYW5ub3RhdGlvbg0KLSAgICAgKi8NCi0gICAgaW50IHZhbHVlKCkgZGVmYXVsdCAxMDAwOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxODA3MWUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxUPiBpbXBsZW1lbnRzIENvbXBhcmF0b3I8VD4NCi17DQotICAgIHB1YmxpYyBpbnQgY29tcGFyZShUIG5tMSwgVCBubTIpDQotICAgIHsNCi0gICAgICAgIGlmIChoYXNQcmlvcml0eShubTEpICYmIGhhc1ByaW9yaXR5KG5tMikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGlzUHJpb3JpdHlIaWdoZXIobm0xLmdldENsYXNzKCkuZ2V0QW5ub3RhdGlvbihJbnZvY2F0aW9uT3JkZXIuY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgbm0yLmdldENsYXNzKCkuZ2V0QW5ub3RhdGlvbihJbnZvY2F0aW9uT3JkZXIuY2xhc3MpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghaGFzUHJpb3JpdHkobm0xKSAmJiAhaGFzUHJpb3JpdHkobm0yKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBoYXNQcmlvcml0eShubTEpID8gLTEgOiAxOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgaW50IGlzUHJpb3JpdHlIaWdoZXIoSW52b2NhdGlvbk9yZGVyIHByaW9yaXR5MSwgSW52b2NhdGlvbk9yZGVyIHByaW9yaXR5MikNCi0gICAgew0KLSAgICAgICAgaWYgKHByaW9yaXR5MS52YWx1ZSgpID09IHByaW9yaXR5Mi52YWx1ZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHByaW9yaXR5MS52YWx1ZSgpIDwgcHJpb3JpdHkyLnZhbHVlKCkgPyAtMSA6IDE7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc1ByaW9yaXR5KE9iamVjdCBubSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5tLmdldENsYXNzKCkuaXNBbm5vdGF0aW9uUHJlc2VudChJbnZvY2F0aW9uT3JkZXIuY2xhc3MpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlclN1cHBvcnQuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlclN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQzNGU3OS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXJTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLQ0KLUBUYXJnZXQoVFlQRSkNCi1ARG9jdW1lbnRlZA0KLS8qKg0KLSAqIG1hcmtlciBhbm5vdGF0aW9uIGZvciBlYXNpZXIgdXNhZ2UNCi0gKiBpdCBtYXJrcyBpbnRlcmZhY2VzIC0gaW5zdGFuY2VzIG9mIGNsYXNzZXMgaW1wbGVtZW50aW5nIHRoZXNlIGludGVyZmFjZXMgd2lsbCBiZSBzb3J0ZWQNCi0gKiBAc2VlIEludm9jYXRpb25PcmRlckNvbXBhcmF0b3INCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIEludm9jYXRpb25PcmRlclN1cHBvcnQNCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0pzZlByb2plY3RTdGFnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSnNmUHJvamVjdFN0YWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjMwYmEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSnNmUHJvamVjdFN0YWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHByb2plY3Qgc3RhZ2UgZXF1aXZhbGVudCB0byBqc2YgMi4wDQotICogZXh0dmFsIDIueCBoYXMgYSBzcGVjaWFsIHJlc29sdmVyIHdoaWNoIHJlZGlyZWN0cyB0aGUgY2FsbCB0byB0aGUgbmV3IGpzZiBhcGkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGVudW0gSnNmUHJvamVjdFN0YWdlDQotew0KLSAgICBEZXZlbG9wbWVudChQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKCJEZXZlbG9wbWVudCIpKSwNCi0gICAgVW5pdFRlc3QoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZSgiVW5pdFRlc3QiKSksDQotICAgIFN5c3RlbVRlc3QoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZSgiU3lzdGVtVGVzdCIpKSwNCi0gICAgUHJvZHVjdGlvbihQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKCJQcm9kdWN0aW9uIikpOw0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIFByb2plY3RTdGFnZU5hbWUgdmFsdWU7DQotDQotICAgIEpzZlByb2plY3RTdGFnZShQcm9qZWN0U3RhZ2VOYW1lIHZhbHVlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzKEpzZlByb2plY3RTdGFnZSBqc2ZQcm9qZWN0U3RhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQcm9qZWN0U3RhZ2UuaXMoanNmUHJvamVjdFN0YWdlLmdldFZhbHVlKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm9qZWN0U3RhZ2VOYW1lIGdldFZhbHVlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvTmVzdGVkLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9OZXN0ZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA2OTFlOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9OZXN0ZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLQ0KLS8qKg0KLSAqIG1hcmtlciBhbm5vdGF0aW9uIGUuZy4gdG8gbWFyayBzdWItbmFtZS1tYXBwZXJzDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRhcmdldChUWVBFKQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIE5lc3RlZA0KLXsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUGhhc2VJZFJlY29yZGluZ1BoYXNlTGlzdGVuZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1BoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OTU1NDIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUGhhc2VJZFJlY29yZGluZ1BoYXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkZhY2VzSW5mb3JtYXRpb25TdG9yYWdlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLQ0KLS8qKg0KLSAqIGUuZy4gdG8gYWxsb3cgaW4gbWV0YWRhdGEgZXh0cmFjdGlvbiBpbnRlcmNlcHRvcnMgdG8ga25vdyBpZiB0aGV5IGFyZSBpbnZva2VkIGR1cmluZyB2YWxpZGF0aW9uIG9yDQotICogY29tcG9uZW50IGluaXRpYWxpemF0aW9uIChpZiBuZWVkZWQpDQotICogZXhhbXBsZTogY2xpZW50LXNpZGUgdmFsaWRhdGlvbiAtIHNvbWUgZnVuY3Rpb25hbGl0eSBzaG91bGRuJ3QgYmUgcHJvY2Vzc2VkIGR1cmluZyByZW5kZXJpbmcNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFBoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjc5MTI0MDUxNDAxNDg2NzQ1N0w7DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBwaGFzZUV2ZW50KQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBwaGFzZUV2ZW50KQ0KLSAgICB7DQotICAgICAgICBGYWNlc0luZm9ybWF0aW9uU3RvcmFnZSBmYWNlc0luZm9ybWF0aW9uU3RvcmFnZSA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5nZXRTdG9yYWdlKEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLCBGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZmFjZXNJbmZvcm1hdGlvblN0b3JhZ2Uuc2V0Q3VycmVudFBoYXNlSWQocGhhc2VFdmVudC5nZXRQaGFzZUlkKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5BTllfUEhBU0U7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICBpZiAodGhpcyA9PSBvKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFBoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvamVjdFN0YWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYTQ0NGQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvamVjdFN0YWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi0vKioNCi0gKiBleHRlbnNpYmxlIHByb2plY3Qgc3RhZ2UgaW1wbGVtZW50YXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFByb2plY3RTdGFnZQ0KLXsNCi0gICAgcHJpdmF0ZSBQcm9qZWN0U3RhZ2VOYW1lIHZhbHVlOw0KLQ0KLSAgICBwcml2YXRlIFByb2plY3RTdGFnZShQcm9qZWN0U3RhZ2VOYW1lIHZhbHVlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0U3RhZ2VOYW1lIGNyZWF0ZVN0YWdlTmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZVByb2plY3RTdGFnZU5hbWUobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0U3RhZ2UgY3JlYXRlU3RhZ2UoUHJvamVjdFN0YWdlTmFtZSBuYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFByb2plY3RTdGFnZShuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXMoUHJvamVjdFN0YWdlTmFtZSBwcm9qZWN0U3RhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRDdXJyZW50UHJvamVjdFN0YWdlKCkuZXF1YWxzKHByb2plY3RTdGFnZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgUHJvamVjdFN0YWdlTmFtZSBnZXRDdXJyZW50UHJvamVjdFN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgLy9zZXQgUHJvamVjdFN0YWdlUmVzb2x2ZXIgdG8gbnVsbCB0byB0d2VhayB0aGUgcGVyZm9ybWFuY2UNCi0gICAgICAgIE9iamVjdCBwcm9qZWN0U3RhZ2VSZXNvbHZlciA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRHbG9iYWxQcm9wZXJ0eShQcm9qZWN0U3RhZ2VSZXNvbHZlci5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgaWYocHJvamVjdFN0YWdlUmVzb2x2ZXIgaW5zdGFuY2VvZiBQcm9qZWN0U3RhZ2VSZXNvbHZlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKChQcm9qZWN0U3RhZ2VSZXNvbHZlcilwcm9qZWN0U3RhZ2VSZXNvbHZlcikuZ2V0Q3VycmVudFByb2plY3RTdGFnZSgpLmdldFZhbHVlKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0RGVmYXVsdFN0YWdlTmFtZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm9qZWN0U3RhZ2VOYW1lIGdldFZhbHVlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvamVjdFN0YWdlTmFtZS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvamVjdFN0YWdlTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDIyYjg2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZU5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFByb2plY3RTdGFnZU5hbWUNCi17DQotICAgIFN0cmluZyBnZXROYW1lKCk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZVJlc29sdmVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDRmMjdhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBQcm9qZWN0U3RhZ2VSZXNvbHZlcg0KLXsNCi0gICAgUHJvamVjdFN0YWdlIGdldEN1cnJlbnRQcm9qZWN0U3RhZ2UoKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvVmFsaWRhdGlvbk1vZHVsZUF3YXJlLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9WYWxpZGF0aW9uTW9kdWxlQXdhcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0MjBmNS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9WYWxpZGF0aW9uTW9kdWxlQXdhcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogaWYgYW4gYXJ0aWZhY3QgKHdoaWNoIHN1cHBvcnRzIHRoaXMgY29uY2VwdCkgc2hvdWxkIGJlIHVzZWQganVzdCBmb3IgYS9zb21lIHNwZWNpZmljIG1vZHVsZShzKSwNCi0gKiB0aGUgYXJ0aWZhY3QgaGFzIHRvIGltcGxlbWVudCB0aGlzIGludGVyZmFjZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uTW9kdWxlQXdhcmUNCi17DQotICAgIC8qKg0KLSAgICAgKiBkdXJpbmcgdGhlIHJlZ2lzdHJhdGlvbiBwcm9jZXNzIHRoZSBpbmZvcm1hdGlvbiBnZXRzIGV2YWx1YXRlZDxici8+DQotICAgICAqIGluc3RlYWQgb2YgYSBjbGFzcyBhcnJheSBhIHN0cmluZyBhcnJheSBpcyB1c2VkIHNvIHRoYXQgaXQncyBwb3NzaWJsZSB0byBpbXBsZW1lbnQNCi0gICAgICogYW4gYXJ0aWZhY3QgZm9yIGRpZmZlcmVudCBtb2R1bGVzLiBpZiBhbiBhZGQtb24gcmVzdHJpY3RzIGFuIGFydGlmYWN0IHRvIHNwZWNpZmljIG1vZHVsZXMsDQotICAgICAqIG5vdCBhbGwgbW9kdWxlcyBoYXZlIHRvIGJlIHVzZWQgYnkgdGhlIHdlYmFwcC4gaWYgYSBtb2R1bGUga2V5IGlzIHVua25vd24sIHRoZSBhcnRpZmFjdCB3b24ndCBnZXQgcmVnaXN0ZXJlZA0KLSAgICAgKiBmb3IgdGhpcyBtb2R1bGUuIGlmIGFuIGFydGlmYWN0IGRvZXNuJ3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBpdCBnZXRzIHJlZ2lzdGVyZWQgZm9yIGFsbCBtb2R1bGVzDQotICAgICAqDQotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWVzIG9mIHRoZSBtb2R1bGUga2V5cw0KLSAgICAgKi8NCi0gICAgU3RyaW5nW10gZ2V0TW9kdWxlS2V5cygpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9WYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9WYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNTM0MGQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvVmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7DQotDQotQFRhcmdldChUWVBFKQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLS8qKg0KLSAqIG1hcmtlciBhbm5vdGF0aW9uIGZvciBtb2R1bGUga2V5cw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgVmFsaWRhdGlvbk1vZHVsZUtleQ0KLXsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE4YTE3OS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFyZW4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICAvKg0KLSAgICAgKiBtaXNjDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVNTQUdFX0JVTkRMRSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FU1NBR0VfQlVORExFIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0JBU0VfUEFDS0FHRSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0JBU0VfUEFDS0FHRSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9JTkZPUk1BVElPTl9QUk9WSURFUl9CRUFOID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fSU5GT1JNQVRJT05fUFJPVklERVJfQkVBTiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9TVEFUSUNfVkFMSURBVElPTl9TVFJBVEVHWV9NQVBQSU5HID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORyIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DT01QT05FTlRfSU5JVElBTElaRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT01QT05FTlRfSU5JVElBTElaRVIiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9QUk9QRVJUWV9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fUFJPUEVSVFlfVkFMSURBVElPTl9JTlRFUkNFUFRPUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1BST1hZX0hFTFBFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1BST1hZX0hFTFBFUiIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBuYW1lIG1hcHBlcg0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUiIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBmaWx0ZXINCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FVEFfREFUQV9TVE9SQUdFX0ZJTFRFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FVEFfREFUQV9TVE9SQUdFX0ZJTFRFUiIpOw0KLSAgICANCi0gICAgLyoNCi0gICAgICogZmFjdG9yaWVzDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1NUT1JBR0VfTUFOQUdFUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0ZBQ0VTX01FU1NBR0VfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0ZBQ0VTX01FU1NBR0VfRkFDVE9SWSIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBhY3RpdmF0ZQ0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVkFURV9SRVFVSVJFRF9JTklUSUFMSVpBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQUNUSVZBVEVfUkVRVUlSRURfSU5JVElBTElaQVRJT04iKTsNCi0gICAgDQotICAgIC8qDQotICAgICAqIGRlYWN0aXZhdGUNCi0gICAgICovDQotICAgIEBEZXByZWNhdGVkDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9SRU5ERVJLSVQgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfUkVOREVSS0lUIik7DQotDQotICAgIC8vY3VycmVudGx5IGp1c3QgdXNlZCBieSBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfREVGQVVMVF9DT05WRU5USU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0RFRkFVTFRfQ09OVkVOVElPTiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfREVGQVVMVF9OQU1FX01BUFBFUlMgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfREVGQVVMVF9OQU1FX01BUFBFUlMiKTsNCi0gICAgDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9FTF9SRVNPTFZFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9FTF9SRVNPTFZFUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfQ09NUE9ORU5UX0lOSVRJQUxJWkFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0NPTVBPTkVOVF9JTklUSUFMSVpBVElPTiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfVkFMSURBVElPTl9QQVJBTUVURVJTID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1ZBTElEQVRJT05fUEFSQU1FVEVSUyIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfUkVOREVSX0tJVF9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1JFTkRFUl9LSVRfRkFDVE9SWSIpOw0KLQ0KLSAgICAvL3RoZXJlIGlzIG5vdGhpbmcgbGlrZSBERUFDVElWQVRFX0RFRkFVTFRfVkFMSURBVElPTl9JTlRFUkNFUFRPUg0KLSAgICAvL3VzZSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5kZW55UmVuZGVyZXJJbnRlcmNlcHRvciguLi4pIHdpdGhpbiBhbiBleHR2YWwtU3RhcnR1cExpc3RlbmVyDQotDQotICAgIC8qDQotICAgICAqIHNwZWMgcGFyYW1ldGVycw0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFUlBSRVRfRU1QVFlfU1RSSU5HX1NVQk1JVFRFRF9WQUxVRVNfQVNfTlVMTCA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiamF2YXguZmFjZXMiLCAiSU5URVJQUkVUX0VNUFRZX1NUUklOR19TVUJNSVRURURfVkFMVUVTX0FTX05VTEwiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFURV9FTVBUWV9GSUVMRFMgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoImphdmF4LmZhY2VzIiwgIlZBTElEQVRFX0VNUFRZX0ZJRUxEUyIpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9BYnN0cmFjdEVMSGVscGVyRmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE0M2YyNS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9BYnN0cmFjdEVMSGVscGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIGRldGFpbHMNCi0gKiBAc2VlIERlZmF1bHRFTEhlbHBlcg0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkgY3VzdG9tRUxIZWxwZXJGYWN0b3J5Ow0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbUVMSGVscGVyRmFjdG9yeShBYnN0cmFjdEVMSGVscGVyRmFjdG9yeSBlbEhlbHBlckZhY3RvcnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3VzdG9tRUxIZWxwZXJGYWN0b3J5ID0gZWxIZWxwZXJGYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBmaW5hbCBFTEhlbHBlciBjcmVhdGUoKQ0KLSAgICB7DQotICAgICAgICBFTEhlbHBlciByZXN1bHQgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYodGhpcy5jdXN0b21FTEhlbHBlckZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSB0aGlzLmN1c3RvbUVMSGVscGVyRmFjdG9yeS5jcmVhdGVFTEhlbHBlcigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUVMSGVscGVyKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBFTEhlbHBlciBjcmVhdGVFTEhlbHBlcigpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzEwOWYwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsNCi1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7DQotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBpbiBvcmRlciB0byBjZW50cmFsaXplIHRoZSBqc2YgdmVyc2lvbiBkZXBlbmRlbmN5IHdpdGhpbiB0aGUgY29yZQ0KLSAqDQotICogdGhpcyBlbC1oZWxwZXIgc3VwcG9ydHMganNwIGFuZCBmYWNlbGV0cyAodGVzdGVkIHdpdGggMS4xLjE0KQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotLyoNCi0gKiB0aGVyZSBpcyBhIHNwZWNpYWwgZmFjZWxldHMgd29ya2Fyb3VuZCBmb3IgZWwtZXhwcmVzc2lvbnMgb2YgY3VzdG9tIGNvbXBvbmVudHMNCi0gKiBpdCdzIHBsdWdnYWJsZSBpbiBvcmRlciB0byBzdXBwb3J0IHNwZWNpYWwgbWVjaGFuaXNtcyBvZiBkaWZmZXJlbnQgdGVjaG5vbG9naWVzICh0aGFuIGpzcCBhbmQgZmFjZWxldHMpDQotICogc28geW91IGNhbiBwbHVnIGluIHlvdXIgb3duIGltcGwuIHdoaWNoIGltcGxlbWVudHMgYSBjdXN0b20gd29ya2Fyb3VuZCAobGlrZSB0aGUgZmFjZWxldHMgd29ya2Fyb3VuZCBvZiB0aGlzIGltcGwuKQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRFTEhlbHBlciBpbXBsZW1lbnRzIEVMSGVscGVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9FTF9SRVNPTFZFUiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0VMX1JFU09MVkVSOw0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdEVMSGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIC8vZHVlIHRvIGEgcmVzdHJpY3Rpb24gd2l0aCB0aGUgcmkNCi0gICAgICAgIE9iamVjdCBiZWFuID0gZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIHJldHVybiAoYmVhbiAhPSBudWxsKSA/IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoYmVhbi5nZXRDbGFzcygpKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRCZWFuKFN0cmluZyBiZWFuTmFtZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIHJldHVybiBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5nZXRFTFJlc29sdmVyKCkuZ2V0VmFsdWUoZmFjZXNDb250ZXh0LmdldEVMQ29udGV4dCgpLCBudWxsLCBiZWFuTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uICE9IG51bGwpID8gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZXZhbHVhdGVFeHByZXNzaW9uR2V0KA0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksIE9iamVjdC5jbGFzcykgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmV2YWx1YXRlRXhwcmVzc2lvbkdldChmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIE9iamVjdC5jbGFzcyk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQsIGJvb2xlYW4gYWxsb3dCbGFua0NoYXJhY3RlcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIC8vZm9yIGlucHV0IGNvbXBvbmVudHMgd2l0aG91dCB2YWx1ZS1iaW5kaW5nDQotICAgICAgICAvLyhlLmcuIGZvciBzcGVjaWFsIGNvbXBvbmVudCBsaWJzIC0+IGlzc3VlIHdpdGggRXh0VmFsUmVuZGVyZXJXcmFwcGVyI2VuY29kZUJlZ2luKQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudC5nZXRDbGFzcygpICsgIiBoYXMgbm8gdmFsdWUgYmluZGluZyAtIGNvbXBvbmVudCBpZDogIiArIHVpQ29tcG9uZW50LmdldElkKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKCFhbGxvd0JsYW5rQ2hhcmFjdGVycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlKCIgIiwgIiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pLmdldEJhc2VFeHByZXNzaW9uKCkpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXN1bHQgPSBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuDQotICAgICAgICAgICAgICAgIHRyeVRvQ3JlYXRlVmFsdWVCaW5kaW5nRm9yRmFjZWxldHNCaW5kaW5nKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCByZXNvbHZlIGV4cHJlc3Npb246ICIgKyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgIC5nZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgcmVzdWx0LmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLQ0KLSAgICAgICAgICAgIGlmKGVudGl0eUNsYXNzID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgcmVzb2x2ZSBleHByZXNzaW9uOiAiICsgcmVzdWx0LmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5ISUdILCBkZXNjcmlwdGlvbiA9ICJjaGVjayBpZiBpdCB3b3JrcyB3aXRoIG5lc3RlZCBjb21wb3NpdGUgY29tcG9uZW50cyIpDQotICAgIHB1YmxpYyBQcm9wZXJ0eURldGFpbHMgZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKERFQUNUSVZBVEVfRUxfUkVTT0xWRVIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eURldGFpbHNWaWFSZWZsZWN0aW9uRmFsbGJhY2sodWlDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIFZhbHVlRXhwcmVzc2lvbiB2YWx1ZUV4cHJlc3Npb24gPSB1aUNvbXBvbmVudC5nZXRWYWx1ZUV4cHJlc3Npb24oInZhbHVlIik7DQotDQotICAgICAgICBpZih2YWx1ZUV4cHJlc3Npb24gPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEV4dFZhbEVMUmVzb2x2ZXIgZWxSZXNvbHZlciA9IGNyZWF0ZVdyYXBwZWRFTENvbnRleHQoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGluc3BlY3RUYXJnZXQodmFsdWVFeHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICBFeHRWYWxFTFJlc29sdmVyLmNyZWF0ZUNvbnRleHRXcmFwcGVyKGZhY2VzQ29udGV4dC5nZXRFTENvbnRleHQoKSwgZWxSZXNvbHZlciksIGZhbHNlKTsNCi0NCi0gICAgICAgIEV4dFZhbEVMUmVzb2x2ZXIgY29tcG9zaXRlQ29tcG9uZW50RUxSZXNvbHZlciA9IG51bGw7DQotDQotICAgICAgICAvL3JlLWNoZWNrIHRvIGdldCBmdWxsIGtleSBmb3IgY3Jvc3MtdmFsaWRhdGlvbg0KLSAgICAgICAgaWYgKGVsUmVzb2x2ZXIuZ2V0Q29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbigpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgVmFsdWVFeHByZXNzaW9uIGNvbXBvc2l0ZUV4cHJlc3Npb24gPSBlbFJlc29sdmVyLmdldENvbXBvc2l0ZUNvbXBvbmVudEV4cHJlc3Npb24oKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBjb21wb3NpdGVDb21wb25lbnRFTFJlc29sdmVyID0gY3JlYXRlV3JhcHBlZEVMQ29udGV4dChmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgICAgIGluc3BlY3RUYXJnZXQoY29tcG9zaXRlRXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgIEV4dFZhbEVMUmVzb2x2ZXIuY3JlYXRlQ29udGV4dFdyYXBwZXIoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dC5nZXRFTENvbnRleHQoKSwgY29tcG9zaXRlQ29tcG9uZW50RUxSZXNvbHZlciksIHRydWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoZWxSZXNvbHZlci5nZXRQYXRoKCkgPT0gbnVsbCB8fCBlbFJlc29sdmVyLmdldEJhc2VPYmplY3QoKSA9PSBudWxsIHx8IGVsUmVzb2x2ZXIuZ2V0UHJvcGVydHkoKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIGtleTsNCi0gICAgICAgIGlmKGNvbXBvc2l0ZUNvbXBvbmVudEVMUmVzb2x2ZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBrZXkgPSBjb21wb3NpdGVDb21wb25lbnRFTFJlc29sdmVyLmdldFBhdGgoKSArDQotICAgICAgICAgICAgICAgICAgICBlbFJlc29sdmVyLmdldFBhdGgoKS5zdWJzdHJpbmcoZWxSZXNvbHZlci5nZXRQYXRoKCkuaW5kZXhPZigiLiIpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBrZXkgPSBlbFJlc29sdmVyLmdldFBhdGgoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlEZXRhaWxzKGtleSwgZWxSZXNvbHZlci5nZXRCYXNlT2JqZWN0KCksIGVsUmVzb2x2ZXIuZ2V0UHJvcGVydHkoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RUYXJnZXQoVmFsdWVFeHByZXNzaW9uIHZhbHVlRXhwcmVzc2lvbiwgRUxDb250ZXh0IGVsQ29udGV4dCwgYm9vbGVhbiBpbnNwZWN0Q29tcG9zaXRlQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWx1ZUV4cHJlc3Npb24uc2V0VmFsdWUoZWxDb250ZXh0LCBudWxsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihpbnNwZWN0Q29tcG9zaXRlQ29tcG9uZW50KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IgYXQgYmluZGluZzogIiArIHZhbHVlRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAtLSBhbiBlbC1yZXNvbHZlciBlcnJvciBvY2N1cnJlZCEgbWF5YmUgeW91IHVzZWQgYW4gaW52YWxpZCBiaW5kaW5nLiIsIHQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEV4dFZhbEVMUmVzb2x2ZXIgY3JlYXRlV3JhcHBlZEVMQ29udGV4dChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEV4dFZhbEVMUmVzb2x2ZXIoZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZ2V0RUxSZXNvbHZlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICAvL2tlZXAgaW4gc3luYyB3aXRoIERlZmF1bHRFTEhlbHBlciNnZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyBvZiBicmFuY2ghISENCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eURldGFpbHMgZ2V0UHJvcGVydHlEZXRhaWxzVmlhUmVmbGVjdGlvbkZhbGxiYWNrKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gZ2V0VmFsdWVCaW5kaW5nRXhwcmVzc2lvbih1aUNvbXBvbmVudCwgZmFsc2UpOw0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9DQotICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHBhdGggPSBudWxsOw0KLQ0KLSAgICAgICAgd2hpbGUoY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHBhdGggPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHBhdGggPSBnZXRQcm9wZXJ0eU5hbWUoY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwYXRoID0gZ2V0UHJvcGVydHlOYW1lKGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKSArICIuIiArIHBhdGg7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBhdGggPSBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpICsgIi4iICsgcGF0aDsNCi0NCi0gICAgICAgIE9iamVjdCBiYXNlT2JqZWN0ID0gZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLQ0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGUuZy46ICN7YmVhbltiZWFuLnBhc3N3b3JkUmVwZWF0ZWRQcm9wZXJ0eU5hbWVdfQ0KLSAgICAgICAgLy8tPiBiZWFuLnBhc3N3b3JkUmVwZWF0ZWRQcm9wZXJ0eU5hbWUgaXMgbm90IHRoZSBmaW5hbCBwcm9wZXJ0eSBuYW1lDQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscyhwYXRoLCBiYXNlT2JqZWN0LCBnZXRQcm9wZXJ0eU5hbWUodmFsdWVCaW5kaW5nRXhwcmVzc2lvbikpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldFByb3BlcnR5TmFtZShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCk7DQotDQotICAgICAgICBpZihwcm9wZXJ0eU5hbWUuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBleHRyYWN0UHJvcGVydHlOYW1lT2ZQcm9wZXJ0eVBhdGgocHJvcGVydHlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInN1cHBvcnQgZm9yIG1vcmUgZHluYW1pYyBiaW5kaW5ncyAtIGRldGFpbHMgc2VlIGlubGluZSIpDQotICAgIHByaXZhdGUgU3RyaW5nIGV4dHJhY3RQcm9wZXJ0eU5hbWVPZlByb3BlcnR5UGF0aChTdHJpbmcgcHJvcGVydHlDaGFpbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nW10gcHJvcGVydGllcyA9IHByb3BlcnR5Q2hhaW4uc3BsaXQoIlxcLiIpOw0KLQ0KLSAgICAgICAgT2JqZWN0IGN1cnJlbnRQcm9wZXJ0eVZhbHVlID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKHByb3BlcnRpZXNbMF0pOw0KLQ0KLSAgICAgICAgTWV0aG9kIGN1cnJlbnRNZXRob2Q7DQotICAgICAgICBTdHJpbmcgY3VycmVudFByb3BlcnR5TmFtZTsNCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzc09mUHJvcGVydHlWYWx1ZTsNCi0gICAgICAgIGZvcihpbnQgaSA9IDE7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0aWVzW2ldOw0KLSAgICAgICAgICAgIGN1cnJlbnRDbGFzc09mUHJvcGVydHlWYWx1ZSA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudFByb3BlcnR5VmFsdWUuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgY3VycmVudE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZChjdXJyZW50Q2xhc3NPZlByb3BlcnR5VmFsdWUsDQotICAgICAgICAgICAgICAgICJnZXQiICsgY3VycmVudFByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIGN1cnJlbnRQcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpKTsNCi0NCi0gICAgICAgICAgICBpZihjdXJyZW50TWV0aG9kID09IG51bGwgJiYgY3VycmVudFByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBNYXApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL2l0J3Mgb2sgZm9yIHRoZSBzaW1wbGUgbWFwIGNhc2UgLSBidXQgbm90IGZvciBlLmcuOg0KLSAgICAgICAgICAgICAgICAvLyN7YmVhbjFbYmVhbjIucHJvcGVydHlOYW1lUHJvdmlkZXJbIGJlYW4zLmluZGV4XV19DQotICAgICAgICAgICAgICAgIC8vb3IgZXZlcnkgb3RoZXIgY29tcGxleCByZXBsYWNlbWVudCBmb3IgYmVhbjMuaW5kZXgNCi0gICAgICAgICAgICAgICAgLy9pdCBtaWdodCBhbHNvIHJlcXVpcmUgYW4gYWRqdXN0bWVudCBhdCBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIjdHJ5VG9UcmFuc2Zvcm1Ub1JlYWxCaW5kaW5nDQotICAgICAgICAgICAgICAgICgoTWFwKWN1cnJlbnRQcm9wZXJ0eVZhbHVlKS5nZXQoY3VycmVudFByb3BlcnR5TmFtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eVZhbHVlID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKGN1cnJlbnRQcm9wZXJ0eVZhbHVlLCBjdXJyZW50TWV0aG9kKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZihjdXJyZW50UHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFN0cmluZyljdXJyZW50UHJvcGVydHlWYWx1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoInVuZXhwZWN0ZWQgdmFsdWUgd2l0aGluIG1hcCBzeW50YXg6ICIgKyBwcm9wZXJ0eUNoYWluICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGxhc3QgcHJvcGVydHkgbmFtZTogIiArIGN1cnJlbnRQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgc3RhdGljIFN0cmluZyBnZXRPcmlnaW5hbFZhbHVlQmluZGluZ0V4cHJlc3Npb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFZhbHVlRXhwcmVzc2lvbiB2YWx1ZUV4cHJlc3Npb24gPSB1aUNvbXBvbmVudC5nZXRWYWx1ZUV4cHJlc3Npb24oInZhbHVlIik7DQotDQotICAgICAgICByZXR1cm4gKHZhbHVlRXhwcmVzc2lvbiAhPSBudWxsKSA/IHZhbHVlRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtV2VsbEZvcm1lZChPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBWYWx1ZUJpbmRpbmcgfHwgbyBpbnN0YW5jZW9mIEV4dGVybmFsaXphYmxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBzID0gby50b1N0cmluZygpOw0KLSAgICAgICAgcmV0dXJuICgocy5jb250YWlucygiIyIpIHx8IHMuY29udGFpbnMoIiQiKSkgJiYgcy5jb250YWlucygieyIpICYmIHMuY29udGFpbnMoIn0iKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRCaW5kaW5nT2ZDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQuZ2V0VmFsdWVFeHByZXNzaW9uKG5hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmZTU2Yy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRFTEhlbHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeQ0KLXsNCi0gICAgcHJpdmF0ZSBFTEhlbHBlciBlbEhlbHBlciA9IG5ldyBEZWZhdWx0RUxIZWxwZXIoKTsNCi0gICAgDQotICAgIHByb3RlY3RlZCBFTEhlbHBlciBjcmVhdGVFTEhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmVsSGVscGVyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FTEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWIyNTUzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogaW4gb3JkZXIgdG8gY2VudHJhbGl6ZSB0aGUganNmIHZlcnNpb24gZGVwZW5kZW5jeSB3aXRoaW4gdGhlIGNvcmUNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRUxIZWxwZXINCi17DQotICAgIE9iamVjdCBnZXRCZWFuKFN0cmluZyBiZWFuTmFtZSk7DQotDQotICAgIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLQ0KLSAgICBDbGFzcyBnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCk7DQotDQotICAgIGJvb2xlYW4gaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIGJvb2xlYW4gaXNFTFRlcm1XZWxsRm9ybWVkKE9iamVjdCBvKTsNCi0NCi0gICAgT2JqZWN0IGdldEJpbmRpbmdPZkNvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgU3RyaW5nIG5hbWUpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FeHRWYWxFTFJlc29sdmVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FeHRWYWxFTFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYjFkNTguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRXh0VmFsRUxSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsKLQotaW1wb3J0IGphdmF4LmVsLkVMUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0OwotaW1wb3J0IGphdmF4LmVsLlZhcmlhYmxlTWFwcGVyOwotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsKLWltcG9ydCBqYXZheC5lbC5GdW5jdGlvbk1hcHBlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5lbC5Db21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uSG9sZGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS5iZWFucy5GZWF0dXJlRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbEVMUmVzb2x2ZXIgZXh0ZW5kcyBFTFJlc29sdmVyCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgRUxSZXNvbHZlciB3cmFwcGVkOwotICAgIHByaXZhdGUgT2JqZWN0IGJhc2VPYmplY3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7Ci0gICAgLy9mb3JtcyB0aGUgaWQgZm9yIGNyb3NzLXZhbGlkYXRpb24gd2l0aGluIGNvbXBsZXggY29tcG9uZW50cwotICAgIHByaXZhdGUgU3RyaW5nIGV4cHJlc3Npb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGF0aFJlY29yZGluZ1N0b3BwZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIENvbXBvc2l0ZUNvbXBvbmVudEV4cHJlc3Npb25Ib2xkZXIgY29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbkhvbGRlcjsKLSAgICBwcml2YXRlIFN0cmluZyBjb21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uQmFzZTsKLQotICAgIHB1YmxpYyBFeHRWYWxFTFJlc29sdmVyKEVMUmVzb2x2ZXIgZWxSZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IGVsUmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRCYXNlT2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgiZXh0cmFjdGVkIHBhdGg6ICIgKyB0aGlzLmV4cHJlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKQotICAgIHsKLSAgICAgICAgdGhpcy5iYXNlT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IG51bGw7Ci0gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcGF0aCByZWNvcmRpbmcgaXMgcGVyZm9ybWVkIHRvIGdldCBhIGtleSBmb3IgY3Jvc3MtdmFsaWRhdGlvbjxici8+Ci0gICAgICogZXZlcnkgYmFzZSBhZnRlciB0aGUgZmlyc3QgY2FsbCB3aGljaCBpcyBudWxsIHN0b3BzIHJlY29yZGluZzxici8+Ci0gICAgICogd2l0aCBhIGR5bmFtaWMgbWFwIHN5bnRheCB0aGUgbGFzdCBwcm9wZXJ0eSBpbiB0aGUgbWlkZGxlIG9mIGFuIGV4cHJlc3Npb24gaGFzIHRvIGJlIGEgc3RyaW5nLgotICAgICAqIHN1Y2ggYSBzdHJpbmcgcmVzdWx0IGNvbnRpbnVlcyB0aGUgcGF0aCByZWNvcmRpbmcgYXQgdGhlIG5leHQgY2FsbCBmb3IgdGhlIGN1cnJlbnQgZXhwcmVzc2lvbi4KLSAgICAgKiA8cC8+Ci0gICAgICogZXhhbXBsZTogI3tiZWFuW2JlYW4ucHJvcGVydHlOYW1lUHJvdmlkZXJbJ25hbWVPZlByb3BlcnR5MSddXVsnZHluQmVhbiddLnByb3BlcnR5fQotICAgICAqIDxwLz4KLSAgICAgKiBsaW1pdGF0aW9uIGZvciBjcm9zcy12YWxpZGF0aW9uOiBuYW1lT2ZQcm9wZXJ0eTEgaGFzIHRvIGJlIG9mIHR5cGUgc3RyaW5nLgotICAgICAqIG90aGVyIGtleSB0eXBlcyBhcmVuJ3Qgc3VwcG9ydGVkIHlldAotICAgICAqCi0gICAgICogQHBhcmFtIGVsQ29udGV4dCB3cmFwcGVkIGVsLWNvbnRleHQKLSAgICAgKiBAcGFyYW0gYmFzZSBjdXJyZW50IGJhc2UKLSAgICAgKiBAcGFyYW0gcHJvcGVydHkgcHJvcGVydHkgdG8gcmVzb2x2ZQotICAgICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBkZWxlZ2F0ZWQgbWV0aG9kIGNhbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBiYXNlLCBPYmplY3QgcHJvcGVydHkpCi0gICAgewotICAgICAgICBPYmplY3QgcmVzdWx0ID0gdGhpcy53cmFwcGVkLmdldFZhbHVlKGVsQ29udGV4dCwgYmFzZSwgcHJvcGVydHkpOwotCi0gICAgICAgIGlmKHRoaXMuY29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbkhvbGRlciAhPSBudWxsICYmIHRoaXMuY29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbkJhc2UgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5jb21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uQmFzZSA9IChTdHJpbmcpcHJvcGVydHk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLmNvbXBvc2l0ZUNvbXBvbmVudEV4cHJlc3Npb25Ib2xkZXIgPT0gbnVsbCAmJiByZXN1bHQgaW5zdGFuY2VvZiBDb21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uSG9sZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmNvbXBvc2l0ZUNvbXBvbmVudEV4cHJlc3Npb25Ib2xkZXIgPSAoKENvbXBvc2l0ZUNvbXBvbmVudEV4cHJlc3Npb25Ib2xkZXIpcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vdmVyeSBmaXJzdCBjYWxsIGZvciBhbiBleHByZXNzaW9uCi0gICAgICAgIGlmKHRoaXMuZXhwcmVzc2lvbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSAoU3RyaW5nKXByb3BlcnR5OwotICAgICAgICB9Ci0gICAgICAgIC8vI3tiZWFuW2R5bkJhc2UucHJvcGVydHlOYW1lXX0gLT4gYmFzZSBvZiBkeW5CYXNlIGlzIG51bGwgLT4gc3RvcCBwYXRoIHJlY29yZGluZwotICAgICAgICBlbHNlIGlmKGJhc2UgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pc1BhdGhSZWNvcmRpbmdTdG9wcGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gcHJvcGVydHlFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKXByb3BlcnR5OwotICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHlOYW1lLnN1YnN0cmluZygxKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoYmFzZSBpbnN0YW5jZW9mIE1hcCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCgoTWFwKWJhc2UpLmNvbnRhaW5zS2V5KHByb3BlcnR5KSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhiYXNlLmdldENsYXNzKCkpLmdldE1ldGhvZCgiZ2V0IiArIHByb3BlcnR5TmFtZSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKGJhc2UuZ2V0Q2xhc3MoKSkuZ2V0TWV0aG9kKCJpcyIgKyBwcm9wZXJ0eU5hbWUpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSAmJiAhImF0dHJzIi5lcXVhbHMocHJvcGVydHkpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgicHJvcGVydHk6ICIgKyBwcm9wZXJ0eSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaXNuJ3QgdXNlZCBmb3IgcGF0aCAtIGl0IGlzbid0IGEgcHJvcGVydHkgb2YgIiArIGJhc2UuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9lLmcuOiAje2JlYW4uc3ViQmFzZS5wcm9wZXJ0eX0gLT4gaGVyZSB3ZSBhcmUgYXQgc3ViQmFzZQotICAgICAgICAgICAgaWYocHJvcGVydHlFeGlzdHMgJiYgIXRoaXMuaXNQYXRoUmVjb3JkaW5nU3RvcHBlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gKz0gIi4iICsgcHJvcGVydHk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKHByb3BlcnR5RXhpc3RzICYmIHJlc3VsdCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmlzUGF0aFJlY29yZGluZ1N0b3BwZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgIGlmKHRoaXMuaXNQYXRoUmVjb3JkaW5nU3RvcHBlZCAmJiByZXN1bHQgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbiArPSAiLiIgKyBwcm9wZXJ0eTsKLSAgICAgICAgfQotICAgICAgICAqLwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzPD8+IGdldFR5cGUoRUxDb250ZXh0IGVsQ29udGV4dCwgT2JqZWN0IG8sIE9iamVjdCBvMSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFR5cGUoZWxDb250ZXh0LCBvLCBvMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoRUxDb250ZXh0IGVsQ29udGV4dCwgT2JqZWN0IG8sIE9iamVjdCBvMSwgT2JqZWN0IG8yKQotICAgIHsKLSAgICAgICAgZXhwcmVzc2lvbiArPSAiLiIgKyBvMTsKLSAgICAgICAgcHJvcGVydHkgPSAoU3RyaW5nKW8xOwotICAgICAgICBiYXNlT2JqZWN0ID0gbzsKLSAgICAgICAgZWxDb250ZXh0LnNldFByb3BlcnR5UmVzb2x2ZWQodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbywgT2JqZWN0IG8xKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaXNSZWFkT25seShlbENvbnRleHQsIG8sIG8xKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3I8RmVhdHVyZURlc2NyaXB0b3I+IGdldEZlYXR1cmVEZXNjcmlwdG9ycyhFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbykKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldEZlYXR1cmVEZXNjcmlwdG9ycyhlbENvbnRleHQsIG8pOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzczw/PiBnZXRDb21tb25Qcm9wZXJ0eVR5cGUoRUxDb250ZXh0IGVsQ29udGV4dCwgT2JqZWN0IG8pCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRDb21tb25Qcm9wZXJ0eVR5cGUoZWxDb250ZXh0LCBvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEVMQ29udGV4dCBjcmVhdGVDb250ZXh0V3JhcHBlcihmaW5hbCBFTENvbnRleHQgY29udGV4dCwgZmluYWwgRUxSZXNvbHZlciByZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRUxDb250ZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0TG9jYWxlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlSZXNvbHZlZChib29sZWFuIHZhbHVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyLnNldFByb3BlcnR5UmVzb2x2ZWQodmFsdWUpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0UHJvcGVydHlSZXNvbHZlZCh2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcHV0Q29udGV4dChDbGFzcyBjbGF6eiwgT2JqZWN0IG9iamVjdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlci5wdXRDb250ZXh0KGNsYXp6LCBvYmplY3QpOwotICAgICAgICAgICAgICAgIGNvbnRleHQucHV0Q29udGV4dChjbGF6eiwgb2JqZWN0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldENvbnRleHQoQ2xhc3MgY2xhenopCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0Q29udGV4dChjbGF6eik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TG9jYWxlKExvY2FsZSBsb2NhbGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuc2V0TG9jYWxlKGxvY2FsZSk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRMb2NhbGUobG9jYWxlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgRUxSZXNvbHZlciBnZXRFTFJlc29sdmVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEZ1bmN0aW9uTWFwcGVyIGdldEZ1bmN0aW9uTWFwcGVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRGdW5jdGlvbk1hcHBlcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBWYXJpYWJsZU1hcHBlciBnZXRWYXJpYWJsZU1hcHBlcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0VmFyaWFibGVNYXBwZXIoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9OwotICAgIH0KLQotICAgIHB1YmxpYyBWYWx1ZUV4cHJlc3Npb24gZ2V0Q29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbigpCi0gICAgewotICAgICAgICBpZih0aGlzLmNvbXBvc2l0ZUNvbXBvbmVudEV4cHJlc3Npb25Ib2xkZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbkhvbGRlci5nZXRFeHByZXNzaW9uKHRoaXMuY29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbkJhc2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0ZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMmI4OWYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3Q7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5Ow0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLQ0KLS8qKg0KLSAqIEhlbHBlciBjbGFzcyB0byBnZXQgdGhlIHJlYWwvZnVsbCB2YWx1ZSBiaW5kaW5nIC0gdGVzdGVkIHdpdGggZmFjZWxldHMgMS4xLjE0DQotICogVGhlIHRhcmdldCBpcyB0byBnZXQgcmlkIG9mIHRoaXMgaW1wbC4gLSBjdXJyZW50bHkgaXQncyBhIHdvcmthcm91bmQgdG8gc3VwcG9ydCBjdXN0b20gZmFjZWxldHMgY29tcG9uZW50cy4NCi0gKiBBbiBhbHRlcm5hdGl2ZSB3b3VsZCBiZSBhbiBFTC1SZXNvbHZlciAtIHRoZXJlIGFyZSBzdGlsbCBzb21lIG9wZW4gaXNzdWVzIHdpdGggc3VjaCBhbiBhcHByb2FjaA0KLSAqICsgSXQgaXNuJ3QgYXZhaWxhYmxlIHdpdGggSlNGIDEuMS54DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIEZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHRyeVRvQ3JlYXRlVmFsdWVCaW5kaW5nRm9yRmFjZWxldHNCaW5kaW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gRGVmYXVsdEVMSGVscGVyLmdldE9yaWdpbmFsVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih1aUNvbXBvbmVudCk7DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gZm91bmRCaW5kaW5ncyA9IGV4dHJhY3RFTFRlcm1zKA0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJpbmRpbmdPZkNvbXBvbmVudCh1aUNvbXBvbmVudCwgInZhbHVlIikpOw0KLQ0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwcGVkRmFjZWxldHNWYXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YmU9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKGZhY2VsZXRzVmFsdWVCaW5kaW5nRXhwcmVzc2lvbg0KLSAgICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCAxKSArICJ7IiArIGNyZWF0ZUJpbmRpbmcoZm91bmRCaW5kaW5ncywgbWFwcGVkRmFjZWxldHNWYXJzKSArICJ9Iik7DQotDQotICAgICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgIC5nZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgdmJlLmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLQ0KLSAgICAgICAgICAgIGlmKGVudGl0eUNsYXNzID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ5VG9SZXBsYWNlVmFycyh2YmUsIG1hcHBlZEZhY2VsZXRzVmFycyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiB2YmU7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKGZhY2VsZXRzVmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3JlYXRlQmluZGluZyhMaXN0PFN0cmluZz4gZXhwcmVzc2lvbnMsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmlydHVhbFZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50QmluZGluZzsNCi0NCi0gICAgICAgIGludCBpbmRleE9mQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBmb3VuZEJpbmRpbmdEZXRhaWxzOw0KLSAgICAgICAgU3RyaW5nW10gYmluZGluZ0RldGFpbHM7DQotDQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZGVkVmlydHVhbE5hbWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBlbnRyeSA6IGV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbnRyeS5zdGFydHNXaXRoKCJWYWx1ZUV4cHJlc3Npb25bIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgZm91bmRCaW5kaW5nRGV0YWlscyA9IGVudHJ5LnNwbGl0KCIgIik7DQotICAgICAgICAgICAgaW5kZXhPZkJpbmRpbmdEZXRhaWxzID0gZmluZEluZGV4T2ZCaW5kaW5nRGV0YWlscyhmb3VuZEJpbmRpbmdEZXRhaWxzKTsNCi0NCi0gICAgICAgICAgICBpZiAoaW5kZXhPZkJpbmRpbmdEZXRhaWxzID09IC0xKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGJpbmRpbmdEZXRhaWxzID0gZm91bmRCaW5kaW5nRGV0YWlsc1tpbmRleE9mQmluZGluZ0RldGFpbHNdLnNwbGl0KCI9Iik7DQotDQotICAgICAgICAgICAgaWYgKGJpbmRpbmdEZXRhaWxzLmxlbmd0aCA8IDIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgPSBiaW5kaW5nRGV0YWlsc1sxXTsNCi0NCi0gICAgICAgICAgICAvL3RvIHN1cHBvcnQgYmxhbmtzIHdpdGhpbiBhIGJpbmRpbmcgd2l0aCBtYXAgc3ludGF4DQotICAgICAgICAgICAgaWYoY3VycmVudEJpbmRpbmcuY29udGFpbnMoInsiKSAmJiAhY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYWRkRnVydGhlckJpbmRpbmdQYXJ0cyhjdXJyZW50QmluZGluZywgZm91bmRCaW5kaW5nRGV0YWlscywgaW5kZXhPZkJpbmRpbmdEZXRhaWxzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL2VudHJ5IGZvciAidmlydHVhbCIgZmFjZWxldHMgYmVhbnMNCi0gICAgICAgICAgICAgICAgaWYoIWFkZGVkVmlydHVhbE5hbWVzLmNvbnRhaW5zS2V5KGJpbmRpbmdEZXRhaWxzWzBdKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYWRkZWRWaXJ0dWFsTmFtZXMucHV0KGJpbmRpbmdEZXRhaWxzWzBdLCBjdXJyZW50QmluZGluZyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy9lbnRyeSBmb3IgInZpcnR1YWwiIGZhY2VsZXRzIHZhcg0KLSAgICAgICAgICAgIGlmKCEoY3VycmVudEJpbmRpbmcuY29udGFpbnMoInsiKSB8fCBjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJzLnB1dChiaW5kaW5nRGV0YWlsc1swXSwgYmluZGluZ0RldGFpbHNbMV0uc3Vic3RyaW5nKDEsIGJpbmRpbmdEZXRhaWxzWzFdLmxlbmd0aCgpLTIpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgb3JpZ2luYWxCaW5kaW5nID0gYWRkZWRWaXJ0dWFsTmFtZXMuZ2V0KCJ2YWx1ZSIpOw0KLSAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnN1YnN0cmluZyhvcmlnaW5hbEJpbmRpbmcuaW5kZXhPZigieyIpICsgMSwgb3JpZ2luYWxCaW5kaW5nLmluZGV4T2YoIn0iKSk7DQotICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5yZW1vdmUoInZhbHVlIik7DQotICAgICAgICByZXR1cm4gdHJ5VG9UcmFuc2Zvcm1Ub1JlYWxCaW5kaW5nKG9yaWdpbmFsQmluZGluZywgYWRkZWRWaXJ0dWFsTmFtZXMsIHZpcnR1YWxWYXJzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdHJ5VG9UcmFuc2Zvcm1Ub1JlYWxCaW5kaW5nKA0KLSAgICAgICAgICAgIFN0cmluZyBvcmlnaW5hbEJpbmRpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkZWRWaXJ0dWFsTmFtZXMsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmlydHVhbFZhcnMpDQotICAgIHsNCi0gICAgICAgIG9yaWdpbmFsQmluZGluZyA9ICIjeyIgKyBvcmlnaW5hbEJpbmRpbmcgKyAifSI7DQotICAgICAgICBJdGVyYXRvciBuYW1lSXRlcmF0b3IgPSBhZGRlZFZpcnR1YWxOYW1lcy5rZXlTZXQoKS5pdGVyYXRvcigpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRLZXk7DQotICAgICAgICBTdHJpbmcgY3VycmVudFZhbHVlOw0KLSAgICAgICAgd2hpbGUobmFtZUl0ZXJhdG9yLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50S2V5ID0gKFN0cmluZykgbmFtZUl0ZXJhdG9yLm5leHQoKTsNCi0NCi0gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBhZGRlZFZpcnR1YWxOYW1lcy5nZXQoY3VycmVudEtleSk7DQotICAgICAgICAgICAgY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlLnN1YnN0cmluZyhjdXJyZW50VmFsdWUuaW5kZXhPZigieyIpICsgMSwgY3VycmVudFZhbHVlLmluZGV4T2YoIn0iKSk7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoInsiICsgY3VycmVudEtleSArICIuIiwgInsiICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIlsiLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCIuIiArIGN1cnJlbnRLZXkgKyAiLiIsICIuIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICJbIiwgIi4iICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIl0iLCAiWyciICsgY3VycmVudFZhbHVlICsgIiddIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIlsiICsgY3VycmVudEtleSArICJbIiwgIlsiICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIi4iLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbmFtZUl0ZXJhdG9yID0gdmlydHVhbFZhcnMua2V5U2V0KCkuaXRlcmF0b3IoKTsNCi0NCi0gICAgICAgIHdoaWxlKG5hbWVJdGVyYXRvci5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudEtleSA9IChTdHJpbmcpIG5hbWVJdGVyYXRvci5uZXh0KCk7DQotDQotICAgICAgICAgICAgY3VycmVudFZhbHVlID0gdmlydHVhbFZhcnMuZ2V0KGN1cnJlbnRLZXkpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJ7IiArIGN1cnJlbnRLZXkgKyAiLiIsICJ7IiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoInsiICsgY3VycmVudEtleSArICJbIiwgInsiICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiLiIgKyBjdXJyZW50S2V5ICsgIi4iLCAiLiIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCIuIiArIGN1cnJlbnRLZXkgKyAiWyIsICIuIiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIlsiICsgY3VycmVudEtleSArICJdIiwgIlsnIiArIGN1cnJlbnRWYWx1ZSArICInXSIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiWyIsICJbIiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIlsiICsgY3VycmVudEtleSArICIuIiwgIlsiICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBvcmlnaW5hbEJpbmRpbmcuc3Vic3RyaW5nKDIsIG9yaWdpbmFsQmluZGluZy5sZW5ndGgoKSAtIDEpOw0KLSAgICB9DQotDQotICAgIC8vdG8gc3VwcG9ydCBibGFua3MgLSBlLmcuIHdpdGggbWFwIHN5bnRheA0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYWRkRnVydGhlckJpbmRpbmdQYXJ0cyhTdHJpbmcgY3VycmVudEJpbmRpbmcsIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE9mQmluZGluZ0RldGFpbHMpDQotICAgIHsNCi0gICAgICAgIGZvcihpbnQgaSA9IGluZGV4T2ZCaW5kaW5nRGV0YWlscyArIDE7IGkgPCBmb3VuZEJpbmRpbmdEZXRhaWxzLmxlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nICs9IGZvdW5kQmluZGluZ0RldGFpbHNbaV07DQotICAgICAgICAgICAgaWYoZm91bmRCaW5kaW5nRGV0YWlsc1tpXS5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRCaW5kaW5nOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjdXJyZW50QmluZGluZzsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZmluZEluZGV4T2ZCaW5kaW5nRGV0YWlscyhTdHJpbmdbXSBiaW5kaW5nRGV0YWlscykNCi0gICAgew0KLSAgICAgICAgaW50IGNvdW50ID0gMDsNCi0gICAgICAgIGZvciAoU3RyaW5nIGVudHJ5IDogYmluZGluZ0RldGFpbHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LmNvbnRhaW5zKCI9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gY291bnQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNvdW50Kys7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGV4dHJhY3RFTFRlcm1zKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFN0cmluZz4gZm91bmRFTFRlcm1zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAocmVzb2x2ZUVMVGVybXMobywgbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCksIGZvdW5kRUxUZXJtcywgMCkgPiAwKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kRUxUZXJtczsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHJlc29sdmVFTFRlcm1zKE9iamVjdCBvLCBNYXA8T2JqZWN0LCBPYmplY3Q+IHZpc2l0ZWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gZm91bmRFTFRlcm1zLCBpbnQgY291bnQpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCB2aXNpdGVkLmNvbnRhaW5zS2V5KG8pIHx8IGNvdW50ID4gNTApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotDQotICAgICAgICB2aXNpdGVkLnB1dChvLCBudWxsKTsNCi0NCi0gICAgICAgIGludCBlbENvdW50ID0gMDsNCi0gICAgICAgIENsYXNzIGMgPSBvLmdldENsYXNzKCk7DQotDQotICAgICAgICAvL2luc3BlY3QgbWFwcw0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBNYXApDQotICAgICAgICB7DQotDQotICAgICAgICAgICAgZm9yIChPYmplY3QgZW50cnkgOiAoKE1hcCkgbykudmFsdWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL2ZvdW5kIGVudHJ5IGZvciAidmlydHVhbCIgZmFjZWxldHMgdmFyDQotICAgICAgICAgICAgICAgIGlmKGVudHJ5LnRvU3RyaW5nKCkuY29udGFpbnMoIlZhbHVlRXhwcmVzc2lvblsiKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChlbnRyeS50b1N0cmluZygpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKGVudHJ5LCB2aXNpdGVkLCBmb3VuZEVMVGVybXMsIGNvdW50ICsgMSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKG8pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChmb3VuZEVMVGVybXMgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZvdW5kRUxUZXJtcy5hZGQoby50b1N0cmluZygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuICsrZWxDb3VudDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vYW5hbHl6ZSBhcnJheXMNCi0gICAgICAgIGlmIChjLmlzQXJyYXkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKG8pOw0KLSAgICAgICAgICAgIC8vY2hlY2sgYXJyYXkgW0wgLT4gbm8gYXJyYXkgb2YgcHJpbWl0aXZlIHR5cGVzDQotICAgICAgICAgICAgaWYgKG8udG9TdHJpbmcoKS5zdGFydHNXaXRoKCJbTCIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG8udG9TdHJpbmcoKS5zdGFydHNXaXRoKCJbTGphdmEubGFuZy5TdHJpbmciKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQoQXJyYXkuZ2V0KG8sIGkpKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZEVMVGVybXMgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsQ291bnQrKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZWxDb3VudCArPSByZXNvbHZlRUxUZXJtcyhBcnJheS5nZXQobywgaSksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gZWxDb3VudDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8RmllbGQ+IGF0dHJpYnV0ZXMgPSBmaW5kQWxsQXR0cmlidXRlcyhjLCBuZXcgQXJyYXlMaXN0PEZpZWxkPigpKTsNCi0gICAgICAgIEZpZWxkW10gZmllbGRzID0gYXR0cmlidXRlcy50b0FycmF5KG5ldyBGaWVsZFthdHRyaWJ1dGVzLnNpemUoKV0pOw0KLQ0KLSAgICAgICAgQWNjZXNzaWJsZU9iamVjdC5zZXRBY2Nlc3NpYmxlKGZpZWxkcywgdHJ1ZSk7DQotICAgICAgICBmb3IgKEZpZWxkIGN1cnJlbnRGaWVsZCA6IGZpZWxkcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmdldChvKSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQuZ2V0VHlwZSgpLmVxdWFscyhTdHJpbmcuY2xhc3MpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5nZXQobykgIT0gbnVsbCAmJiBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChjdXJyZW50RmllbGQuZ2V0KG8pKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kRUxUZXJtcy5hZGQoby50b1N0cmluZygpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGVsQ291bnQrKzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmICghY3VycmVudEZpZWxkLmdldFR5cGUoKS5pc1ByaW1pdGl2ZSgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZWxDb3VudCArPSByZXNvbHZlRUxUZXJtcyhjdXJyZW50RmllbGQuZ2V0KG8pLCB2aXNpdGVkLCBmb3VuZEVMVGVybXMsIGNvdW50ICsgMSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGVsQ291bnQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxGaWVsZD4gZmluZEFsbEF0dHJpYnV0ZXMoQ2xhc3MgYywgTGlzdDxGaWVsZD4gYXR0cmlidXRlcykNCi0gICAgew0KLSAgICAgICAgaWYgKGMgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlczsNCi0gICAgICAgIH0NCi0gICAgICAgIGZpbmRBbGxBdHRyaWJ1dGVzKGMuZ2V0U3VwZXJjbGFzcygpLCBhdHRyaWJ1dGVzKTsNCi0NCi0gICAgICAgIEZpZWxkW10gZmllbGRzID0gYy5nZXREZWNsYXJlZEZpZWxkcygpOw0KLSAgICAgICAgZm9yIChGaWVsZCBjdXJyZW50RmllbGQgOiBmaWVsZHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCFNb2RpZmllci5pc1N0YXRpYyhjdXJyZW50RmllbGQuZ2V0TW9kaWZpZXJzKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQoY3VycmVudEZpZWxkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gYXR0cmlidXRlczsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHRyeVRvUmVwbGFjZVZhcnMoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwcGVkRmFjZWxldHNWYXJzKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcHJvcGVydHk7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gIiI7DQotICAgICAgICBib29sZWFuIGxhc3QgPSBmYWxzZTsNCi0NCi0gICAgICAgIHdoaWxlKHRydWUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsYXN0ID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotDQotDQotICAgICAgICAgICAgcHJvcGVydHkgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCk7DQotDQotICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24NCi0gICAgICAgICAgICAgICAgLnJlcGxhY2VQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBnZXROZXdQcm9wZXJ0eShwcm9wZXJ0eSwgbWFwcGVkRmFjZWxldHNWYXJzKSk7DQotDQotICAgICAgICAgICAgaWYocmVzdWx0Lmxlbmd0aCgpID09IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSArICIuIiArIHJlc3VsdDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKTsNCi0NCi0gICAgICAgICAgICBpZihsYXN0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJlZml4KCkgKyAieyIgKyByZXN1bHQgKyAifSIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXROZXdQcm9wZXJ0eShTdHJpbmcgb2xkUHJvcGVydHksIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwcGVkRmFjZWxldHNWYXJzKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFN0cmluZz4gdmlydHVhbFZhcnMgPSBnZXRQb3RlbnRpYWxWaXJ0dWFsVmFycyhvbGRQcm9wZXJ0eSk7DQotDQotICAgICAgICBmb3IoU3RyaW5nIHZpcnR1YWxWYXIgOiB2aXJ0dWFsVmFycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihtYXBwZWRGYWNlbGV0c1ZhcnMuY29udGFpbnNLZXkodmlydHVhbFZhcikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBvbGRQcm9wZXJ0eSA9IHJlcGxhY2VQcm9wZXJ0eVZhbHVlKG9sZFByb3BlcnR5LCB2aXJ0dWFsVmFyLCBtYXBwZWRGYWNlbGV0c1ZhcnMuZ2V0KHZpcnR1YWxWYXIpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gb2xkUHJvcGVydHk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldFBvdGVudGlhbFZpcnR1YWxWYXJzKFN0cmluZyBvbGRQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgaW50IHN0YXJ0ID0gLTE7DQotICAgICAgICBpbnQgZW5kID0gLTE7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmlydHVhbFZhckxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBvbGRQcm9wZXJ0eS5sZW5ndGgoKTsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHN0YXJ0ID09IC0gMSAmJiBvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgc3RhcnQgPSBpICsgMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZigoc3RhcnQgIT0gLSAxICYmIG9sZFByb3BlcnR5LmNoYXJBdChpKSA9PSAnWycpIHx8IG9sZFByb3BlcnR5LmNoYXJBdChpKSA9PSAnXScpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBlbmQgPSBpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZihzdGFydCAhPSAtMSAmJiBlbmQgIT0gLTEpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2aXJ0dWFsVmFyTGlzdC5hZGQob2xkUHJvcGVydHkuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKTsNCi0gICAgICAgICAgICAgICAgaWYob2xkUHJvcGVydHkuY2hhckF0KGkpID09ICdbJykNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpICsgMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gLTE7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZW5kID0gLTE7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZpcnR1YWxWYXJMaXN0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZXBsYWNlUHJvcGVydHlWYWx1ZShTdHJpbmcgb2xkUHJvcGVydHksIFN0cmluZyB0YXJnZXRWYXIsIFN0cmluZyBuZXdWYWx1ZSkNCi0gICAgew0KLSAgICAgICAgaW50IGluZGV4ID0gb2xkUHJvcGVydHkuaW5kZXhPZih0YXJnZXRWYXIpOw0KLQ0KLSAgICAgICAgaWYoaW5kZXggPT0gLTEpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG9sZFByb3BlcnR5Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG9sZFByb3BlcnR5LnN1YnN0cmluZygwLCBpbmRleCk7DQotICAgICAgICByZXN1bHQgKz0gbmV3VmFsdWU7DQotICAgICAgICByZXR1cm4gcmVzdWx0ICsgb2xkUHJvcGVydHkuc3Vic3RyaW5nKGluZGV4ICsgdGFyZ2V0VmFyLmxlbmd0aCgpLCBvbGRQcm9wZXJ0eS5sZW5ndGgoKSk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogcmVwbGFjZSB2aXJ0dWFsIGZhY2VsZXRzIHZhcnMgKG1hcCBzeW50YXgpDQotICAgICAqIHRlc3RlZCBzdHlsZXMgKHNpbXBsZSBhbmQgbmVzdGVkKTogdGVzdFtpeFtpeDJbaXgzXV1dDQotICAgICAqLw0KLSAgICAvKg0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgX2NyZWF0ZUJpbmRpbmcoTGlzdDxTdHJpbmc+IGV4cHJlc3Npb25zLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHZpcnR1YWxWYXJzKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gIiI7DQotDQotICAgICAgICBTdHJpbmcgcHJldkZhY2VsZXRzQXR0cmlidXRlTmFtZSA9IG51bGw7DQotICAgICAgICBTdHJpbmcgY3VycmVudEJpbmRpbmc7DQotICAgICAgICBTdHJpbmcgcGFydE9mQmluZGluZzsNCi0NCi0gICAgICAgIGludCBpbmRleE9mQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBmb3VuZEJpbmRpbmdEZXRhaWxzOw0KLSAgICAgICAgU3RyaW5nW10gYmluZGluZ0RldGFpbHM7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gYWRkZWRWaXJ0dWFsTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGVudHJ5IDogZXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoIlZhbHVlRXhwcmVzc2lvblsiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBmb3VuZEJpbmRpbmdEZXRhaWxzID0gZW50cnkuc3BsaXQoIiAiKTsNCi0gICAgICAgICAgICBpbmRleE9mQmluZGluZ0RldGFpbHMgPSBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKGZvdW5kQmluZGluZ0RldGFpbHMpOw0KLQ0KLSAgICAgICAgICAgIGlmIChpbmRleE9mQmluZGluZ0RldGFpbHMgPT0gLTEpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgYmluZGluZ0RldGFpbHMgPSBmb3VuZEJpbmRpbmdEZXRhaWxzW2luZGV4T2ZCaW5kaW5nRGV0YWlsc10uc3BsaXQoIj0iKTsNCi0NCi0gICAgICAgICAgICBpZiAoYmluZGluZ0RldGFpbHMubGVuZ3RoIDwgMikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGJpbmRpbmdEZXRhaWxzWzFdOw0KLQ0KLSAgICAgICAgICAgIC8vdG8gc3VwcG9ydCBibGFua3Mgd2l0aGluIGEgYmluZGluZyB3aXRoIG1hcCBzeW50YXgNCi0gICAgICAgICAgICBpZihjdXJyZW50QmluZGluZy5jb250YWlucygieyIpICYmICFjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgPSBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKGN1cnJlbnRCaW5kaW5nLCBmb3VuZEJpbmRpbmdEZXRhaWxzLCBpbmRleE9mQmluZGluZ0RldGFpbHMpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAocHJldkZhY2VsZXRzQXR0cmlidXRlTmFtZSAhPSBudWxsICYmIGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL2VudHJ5IGZvciAidmlydHVhbCIgZmFjZWxldHMgYmVhbnMNCi0gICAgICAgICAgICAgICAgaWYoIWFkZGVkVmlydHVhbE5hbWVzLmNvbnRhaW5zKGJpbmRpbmdEZXRhaWxzWzBdKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcGFydE9mQmluZGluZyA9IGN1cnJlbnRCaW5kaW5nLnN1YnN0cmluZyhjdXJyZW50QmluZGluZy5pbmRleE9mKHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUpDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lLmxlbmd0aCgpLCBjdXJyZW50QmluZGluZy5pbmRleE9mKCJ9IikpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgYWRkZWRWaXJ0dWFsTmFtZXMuYWRkKGJpbmRpbmdEZXRhaWxzWzBdKTsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHBhcnRPZkJpbmRpbmc7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvL2VudHJ5IGZvciAidmlydHVhbCIgZmFjZWxldHMgdmFyDQotICAgICAgICAgICAgZWxzZSBpZighKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgfHwgY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2aXJ0dWFsVmFycy5wdXQoYmluZGluZ0RldGFpbHNbMF0sIGJpbmRpbmdEZXRhaWxzWzFdLnN1YnN0cmluZygxLCBiaW5kaW5nRGV0YWlsc1sxXS5sZW5ndGgoKS0yKSk7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnMoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5hZGQoYmluZGluZ0RldGFpbHNbMF0pOw0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY3VycmVudEJpbmRpbmcuc3Vic3RyaW5nKGN1cnJlbnRCaW5kaW5nLmluZGV4T2YoInsiKSArIDEsIGN1cnJlbnRCaW5kaW5nLmluZGV4T2YoIn0iKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHJldkZhY2VsZXRzQXR0cmlidXRlTmFtZSA9IGJpbmRpbmdEZXRhaWxzWzBdOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLSAgICAqLw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OGViNjYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJkaWZmZXJlbmNlIGJldHdlZW4gWyBhbmQgWycgLSB0ZXN0IHdpdGggbW9yZSBjb25zdGVsbGF0aW9ucyIpDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkNCi1wdWJsaWMgY2xhc3MgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbg0KLXsNCi0gICAgcHJpdmF0ZSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGJhc2U7DQotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOw0KLSAgICBwcml2YXRlIFN0cmluZyBwcmVmaXg7DQotICAgIHByaXZhdGUgU3RyaW5nIHRva2VuOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gcmVwbGFjZU9yQWRkUHJvcGVydHkoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1Byb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXBsYWNlUHJvcGVydHkoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuZXdQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgLy9UT0RPIGFkanVzdG1lbnRzIGZvciBpc0R5bmFtaWNCYXNlQW5kUHJvcGVydHkNCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKS5lbmRzV2l0aCgiJ10iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGFkZFByb3BlcnR5KFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgU3RyaW5nIG5ld1Byb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgc291cmNlRXhwcmVzc2lvbiA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHNvdXJjZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIHNvdXJjZUV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKTsNCi0NCi0gICAgICAgIC8vVE9ETyBhZGp1c3RtZW50cyBmb3IgaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5DQotICAgICAgICBpZihuZXdQcm9wZXJ0eS5zdGFydHNXaXRoKCJbJyIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihyZXN1bHQgKyBuZXdQcm9wZXJ0eSArICJ9Iik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHJlc3VsdCArICIuIiArIG5ld1Byb3BlcnR5ICsgIn0iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihTdHJpbmcgZXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgaWYoIUV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKGV4cHJlc3Npb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXhwcmVzc2lvbiArICIgaXMgbm8gdmFsaWQgZWwtZXhwcmVzc2lvbiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYm9vbGVhbiBpc0R5bmFtaWNCYXNlQW5kUHJvcGVydHkgPSBleHByZXNzaW9uLmxhc3RJbmRleE9mKCInXSIpID09IC0xOw0KLSAgICAgICAgaW50IGluZGV4MSA9IGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSA/IGV4cHJlc3Npb24ubGFzdEluZGV4T2YoIl0iKSA6IGV4cHJlc3Npb24ubGFzdEluZGV4T2YoIiddIik7DQotICAgICAgICBpbnQgaW5kZXgyID0gZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiLiIpOw0KLQ0KLSAgICAgICAgaWYoaW5kZXgxID4gaW5kZXgyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnN1YnN0cmluZygwLCBpbmRleDEpOw0KLQ0KLSAgICAgICAgICAgIGludCBpbmRleDMgPSBmaW5kSW5kZXhPZlN0YXJ0aW5nQnJhY2tldChleHByZXNzaW9uKTsNCi0gICAgICAgICAgICBpZihpc0R5bmFtaWNCYXNlQW5kUHJvcGVydHkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoaW5kZXgzICsgMSwgaW5kZXgxKTsNCi0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKGluZGV4MyArIDIsIGluZGV4MSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHRoaXMuYmFzZSA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKGV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGluZGV4MykgKyAifSIpOw0KLSAgICAgICAgICAgIHRoaXMudG9rZW4gPSBpc0R5bmFtaWNCYXNlQW5kUHJvcGVydHkgPyAiWyIgOiAiWyciOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiggaW5kZXgyID4gaW5kZXgxKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZyhpbmRleDIgKyAxLCBleHByZXNzaW9uLmxlbmd0aCgpIC0gMSApOw0KLSAgICAgICAgICAgIHRoaXMuYmFzZSA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKGV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGluZGV4MikgKyAifSIpOw0KLSAgICAgICAgICAgIHRoaXMudG9rZW4gPSAiLiI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKDIsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKTsNCi0gICAgICAgICAgICB0aGlzLnByZWZpeCA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIDEpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS50cmltKCk7DQotICAgICAgICANCi0gICAgICAgIGlmKCJbIi5lcXVhbHModGhpcy50b2tlbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGhpcy52YWx1ZS5zdGFydHNXaXRoKCInIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS5zdWJzdHJpbmcoMSwgdGhpcy52YWx1ZS5sZW5ndGgoKSAtIDEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvL3JldHVybiB0aGlzLmJhc2UudmFsdWUgKyB0aGlzLnRva2VuICsgdGhpcy52YWx1ZS5zdWJzdHJpbmcoMCwgdGhpcy52YWx1ZS5sZW5ndGgoKSkgKyAiJ10iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGdldEJhc2VFeHByZXNzaW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGJhc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRFeHByZXNzaW9uU3RyaW5nKCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5iYXNlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgU3RyaW5nIGJhc2VFeHByZXNzaW9uID0gdGhpcy5iYXNlLmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0NCi0gICAgICAgICAgICBpZigiWyciLmVxdWFscyh0aGlzLnRva2VuKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBiYXNlRXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgYmFzZUV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKSArIHRoaXMudG9rZW4gKyB0aGlzLnZhbHVlICsgIiddfSI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYoIlsiLmVxdWFscyh0aGlzLnRva2VuKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBiYXNlRXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgYmFzZUV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKSArIHRoaXMudG9rZW4gKyB0aGlzLnZhbHVlICsgIl19IjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAifSI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlZml4ICsgInsiICsgdGhpcy52YWx1ZSArICJ9IjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMuYmFzZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UuZ2V0UHJlZml4KCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5iYXNlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5iYXNlLnNldFByZWZpeChwcmVmaXgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRFeHByZXNzaW9uU3RyaW5nKCkuaGFzaENvZGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uICYmIGdldEV4cHJlc3Npb25TdHJpbmcoKQ0KLSAgICAgICAgICAgIC5lcXVhbHMoKChWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKSB0YXJnZXQpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBpbnQgZmluZEluZGV4T2ZTdGFydGluZ0JyYWNrZXQoU3RyaW5nIGV4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIGludCBjbG9zZUNvdW50ID0gMDsNCi0gICAgICAgIGZvcihpbnQgaSA9IGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxOyBpID4gMDsgaS0tKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGV4cHJlc3Npb24uY2hhckF0KGkpID09ICdbJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNsb3NlQ291bnQtLTsNCi0gICAgICAgICAgICAgICAgaWYoY2xvc2VDb3VudCA8IDApDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYoZXhwcmVzc2lvbi5jaGFyQXQoaSkgPT0gJ10nKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2xvc2VDb3VudCsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0Fic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzEwMGIzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8VD4gaW1wbGVtZW50cyBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5PE5hbWVNYXBwZXI8VD4+DQotew0KLSAgICBwcml2YXRlIExpc3Q8Q2xhc3M+IGRlbmllZE5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlZ2lzdGVyKE5hbWVNYXBwZXI8VD4gbmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgaWYoIWRlbmllZE5hbWVNYXBwZXJMaXN0LmNvbnRhaW5zKG5hbWVNYXBwZXIuZ2V0Q2xhc3MoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZ2V0TmFtZU1hcHBlckxpc3QoKS5hZGQobmFtZU1hcHBlcik7DQotICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChnZXROYW1lTWFwcGVyTGlzdCgpLCBnZXRDb21wYXJhdG9yKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBDb21wYXJhdG9yPE5hbWVNYXBwZXI8VD4+IGdldENvbXBhcmF0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8TmFtZU1hcHBlcjxUPj4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGVyZWdpc3RlcihDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gY2xhc3NUb0RlcmVnaXN0ZXIpDQotICAgIHsNCi0gICAgICAgIEl0ZXJhdG9yPE5hbWVNYXBwZXI8VD4+IG5hbWVNYXBwZXJJdGVyYXRvciA9IGdldE5hbWVNYXBwZXJMaXN0KCkuaXRlcmF0b3IoKTsNCi0gICAgICAgIHdoaWxlKG5hbWVNYXBwZXJJdGVyYXRvci5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobmFtZU1hcHBlckl0ZXJhdG9yLm5leHQoKS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NUb0RlcmVnaXN0ZXIuZ2V0TmFtZSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG5hbWVNYXBwZXJJdGVyYXRvci5yZW1vdmUoKTsNCi0gICAgICAgICAgICAgICAgLy9kb24ndCBicmVhayAtIGUuZy4gdG8gZGVyZWdpc3RlciBhbGwgd3JhcHBlcnMuLi4NCi0gICAgICAgICAgICAgICAgLy9icmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZGVueShDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gY2xhc3NUb0RlbnkpDQotICAgIHsNCi0gICAgICAgIGRlcmVnaXN0ZXIoY2xhc3NUb0RlbnkpOw0KLQ0KLSAgICAgICAgc3luY2hyb25pemVkIChnZXRDbGFzcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGRlbmllZE5hbWVNYXBwZXJMaXN0LmFkZChjbGFzc1RvRGVueSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IExpc3Q8TmFtZU1hcHBlcjxUPj4gZ2V0TmFtZU1hcHBlckxpc3QoKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9DbGFzc01hcHBpbmdGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2NjA3MC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIENsYXNzTWFwcGluZ0ZhY3Rvcnk8UCwgUj4NCi17DQotICAgIFIgY3JlYXRlKFAgc291cmNlKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9EZWZhdWx0RmFjdG9yeUZpbmRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9EZWZhdWx0RmFjdG9yeUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjk3NTVmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRGVmYXVsdEZhY3RvcnlGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkRlZmF1bHRFTEhlbHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLkRlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vL2R5bmFtaWMgYXBwcm9hY2ggdG8gY3JlYXRlIHRoZSBmYWN0b3JpZXMgZHVyaW5nIHRoZSBmaXJzdCByZXF1ZXN0LCB3aGVuIGEgZmFjZXMtY29udGV4dCBpcyBhdmFpbGFibGUNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RmFjdG9yeUZpbmRlciBpbXBsZW1lbnRzIEZhY3RvcnlGaW5kZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotICAgIHByb3RlY3RlZCBNYXA8RmFjdG9yeU5hbWVzLCBPYmplY3Q+IGZhY3RvcnlNYXAgPSBuZXcgSGFzaE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4oKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgRmFjdG9yeUZpbmRlciBmYWN0b3J5RmluZGVyID0gbmV3IERlZmF1bHRGYWN0b3J5RmluZGVyKCk7DQotDQotICAgIHByb3RlY3RlZCBEZWZhdWx0RmFjdG9yeUZpbmRlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBGYWN0b3J5RmluZGVyIGdldEluc3RhbmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY3RvcnlGaW5kZXI7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHVibGljIGZpbmFsIDxUPiBUIGdldEZhY3RvcnkoRmFjdG9yeU5hbWVzIGZhY3RvcnlOYW1lLCBDbGFzczxUPiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYoIShmYWN0b3J5TWFwLmNvbnRhaW5zS2V5KGZhY3RvcnlOYW1lKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdEZhY3RvcnkoZmFjdG9yeU5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChUKWZhY3RvcnlNYXAuZ2V0KGZhY3RvcnlOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdEZhY3RvcnkoRmFjdG9yeU5hbWVzIGZhY3RvcnlOYW1lKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotICAgICAgICBzd2l0Y2ggKGZhY3RvcnlOYW1lKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNhc2UgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZUNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIFZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZVZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIFJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIEVMX0hFTFBFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlRUxIZWxwZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgRkFDRVNfTUVTU0FHRV9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlRmFjZXNNZXNzYWdlRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIFZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBTVE9SQUdFX01BTkFHRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZVN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIFZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgDQotICAgICAgICAgICAgZGVmYXVsdDogLy9yZXF1aXJlZCBieSBjaGVja3N0eWxlDQotICAgICAgICB9DQotDQotICAgICAgICBpZihmYWN0b3J5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IHBvc3NpYmxlIHRvIGNyZWF0ZSBmYWN0b3J5ICIgKyBmYWN0b3J5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBmYWN0b3J5TWFwLnB1dChmYWN0b3J5TmFtZSwgZmFjdG9yeSk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZKTsNCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZKSk7DQotICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkpOw0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZKSk7DQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkpOw0KLSAgICAgICAgbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZKSk7DQotICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSApOw0KLSAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZKSk7DQotICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVGYWNlc01lc3NhZ2VGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9GQUNFU19NRVNTQUdFX0ZBQ1RPUlkpOw0KLSAgICAgICAgZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uRkFDRVNfTUVTU0FHRV9GQUNUT1JZKSk7DQotDQotICAgICAgICBPYmplY3QgdGFyZ2V0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoQ3VzdG9tSW5mb3JtYXRpb24uRkFDRVNfTUVTU0FHRV9GQUNUT1JZLm5hbWUoKSk7DQotICAgICAgICBpZih0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQgaW5zdGFuY2VvZiBTdHJpbmcpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMuYWRkKChTdHJpbmcpdGFyZ2V0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUVMSGVscGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdEVMSGVscGVyRmFjdG9yeSgpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJhZGQgZ2xvYmFsIHByb3BlcnR5IGV4dGVuc2lvbiBwb2ludCIpDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZKTsNCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZKSk7DQotICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVTdG9yYWdlTWFuYWdlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gc3RvcmFnZU1hbmFnZXJGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgc3RvcmFnZU1hbmFnZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlkpOw0KLSAgICAgICAgc3RvcmFnZU1hbmFnZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZKSk7DQotICAgICAgICBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0U3RvcmFnZU1hbmFnZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgY3JlYXRlVmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlkpOw0KLSAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWSkpOw0KLSAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IHZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YmQ4YTMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIEZhY2VzTWVzc2FnZUZhY3RvcnkNCi17DQotICAgIEZhY2VzTWVzc2FnZSBjb252ZXJ0KEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpOw0KLQ0KLSAgICBGYWNlc01lc3NhZ2UgY3JlYXRlKEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlGaW5kZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGYyNjI1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBGYWN0b3J5RmluZGVyCi17Ci0gICAgPFQ+IFQgZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUsIENsYXNzPFQ+IHRhcmdldENsYXNzKTsKLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeU5hbWVzLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTJiMTVlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkKLXB1YmxpYyBlbnVtIEZhY3RvcnlOYW1lcwotewotICAgIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksCi0KLSAgICBWQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWSwKLSAgICBWQUxJREFUSU9OX1BBUkFNRVRFUl9GQUNUT1JZLAotCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLAotICAgIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwKLSAgICBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwKLQotICAgIEZBQ0VTX01FU1NBR0VfRkFDVE9SWSwKLQotICAgIFJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksCi0gICAgRUxfSEVMUEVSX0ZBQ1RPUlksCi0KLSAgICBTVE9SQUdFX01BTkFHRVJfRkFDVE9SWQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9OYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L05hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQyZDFmMC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L05hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFQgZXh0ZW5kcyBOYW1lTWFwcGVyPg0KLXsNCi0gICAgdm9pZCByZWdpc3RlcihUIGNsYXNzVG9BZGQpOw0KLSAgICB2b2lkIGRlcmVnaXN0ZXIoQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IGNsYXNzVG9EZXJlZ2lzdGVyKTsNCi0gICAgdm9pZCBkZW55KENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBjbGFzc1RvRGVueSk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9BYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjUwMGMzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9BYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0U2VjcmV0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTGlzdGJveDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZU1lbnU7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVSYWRpbzsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlDaGVja2JveDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlMaXN0Ym94Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueU1lbnU7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHRhcmVhOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcg0KLXsNCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICB7DQotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWxpZGF0ZUVtcHR5RmllbGRzKCkgJiYgRXh0VmFsVXRpbHMuaXNSZXF1aXJlZEluaXRpYWxpemF0aW9uQWN0aXZlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb25maWd1cmVSZXF1aXJlZEF0dHJpYnV0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGNvbmZpZ3VyZU1heExlbmd0aEF0dHJpYnV0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVFbXB0eUZpZWxkcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy52YWxpZGF0ZUVtcHR5RmllbGRzKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY29uZmlndXJlUmVxdWlyZWRBdHRyaWJ1dGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0IHx8DQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0U2VjcmV0IHx8DQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveCB8fA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVMaXN0Ym94IHx8DQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZU1lbnUgfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lUmFkaW8gfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUNoZWNrYm94IHx8DQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlMaXN0Ym94IHx8DQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlNZW51IHx8DQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0VGV4dGFyZWE7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIGlmIHRoZXJlIGlzIG5vIHNwZWNpYWwgYXR0cmlidXRlIGF0IHRoZSBjb21wb25lbnQgd2hpY2ggc2hvdWxkIG92ZXJydWxlDQotICAgICAqIHRoZSBhbm5vdGF0ZWQgcHJvcGVydHkgcmV0dXJuIHRydWUhDQotICAgICAqDQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjb21wb25lbnQgd2hpY2ggaW1wbGVtZW50cyB0aGUgRWRpdGFibGVWYWx1ZUhvbGRlciBpbnRlcmZhY2UNCi0gICAgICogQHJldHVybiBmYWxzZSB0byBvdmVycnVsZSB0aGUgYW5ub3RhdGVkIHByb3BlcnR5IGUuZy4gaWYgY29tcG9uZW50IGlzIHJlYWRvbmx5DQotICAgICAqLw0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAicmVmYWN0b3IiKQ0KLSAgICBwcm90ZWN0ZWQgQm9vbGVhbiBpc0NvbXBvbmVudFJlcXVpcmVkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIGlzUmVhZE9ubHkgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc1JlYWRvbmx5IikpKTsNCi0gICAgICAgIGJvb2xlYW4gaXNEaXNhYmxlZCA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzRGlzYWJsZWQiKSkpOw0KLQ0KLSAgICAgICAgcmV0dXJuICEoaXNSZWFkT25seSB8fCBpc0Rpc2FibGVkKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVNYXhMZW5ndGhBdHRyaWJ1dGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICB7DQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgT2JqZWN0IG1heExlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCk7DQotDQotICAgICAgICAgICAgaWYoIShtYXhMZW5ndGggaW5zdGFuY2VvZiBJbnRlZ2VyKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgSHRtbElucHV0VGV4dCBodG1sSW5wdXRUZXh0ID0gKEh0bWxJbnB1dFRleHQpdWlDb21wb25lbnQ7DQotICAgICAgICAgICAgICAgIGh0bWxJbnB1dFRleHQuc2V0TWF4bGVuZ3RoKChJbnRlZ2VyKW1heExlbmd0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRTZWNyZXQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBIdG1sSW5wdXRTZWNyZXQgaHRtbElucHV0U2VjcmV0ID0gKEh0bWxJbnB1dFNlY3JldCl1aUNvbXBvbmVudDsNCi0gICAgICAgICAgICAgICAgaHRtbElucHV0U2VjcmV0LnNldE1heGxlbmd0aCgoSW50ZWdlciltYXhMZW5ndGgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9Db21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzhlMzU1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9Db21wb25lbnRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlclN1cHBvcnQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQWxsb3dzIHRvIGluaXRpYWxpemUgY29tcG9uZW50cyBiZWZvcmVFbmNvZGVCZWdpbi48YnIvPg0KLSAqIGUuZy46IHlvdSBjYW4gYWRkIGluZm9ybWF0aW9uIGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIG1lY2hhbmlzbXMsLi4uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50SW5pdGlhbGl6ZXINCi17DQotICAgIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5YzA0MS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBTdGF0aWNDb25maWd1cmF0aW9uPFQsIFI+DQotew0KLSAgICB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCk7DQotICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFQsIFI+PiBnZXRNYXBwaW5nKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjg0YWY1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGNsYXNzIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxULCBSPg0KLXsNCi0gICAgcHJpdmF0ZSBUIHNvdXJjZTsNCi0gICAgcHJpdmF0ZSBSIHRhcmdldDsNCi0NCi0gICAgcHVibGljIFQgZ2V0U291cmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHNvdXJjZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoVCBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSIGdldFRhcmdldCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KFIgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q3NWJmNC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSX0pCi1wdWJsaWMgZW51bSBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMKLXsKLSAgICBNRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9DT05GSUcsCi0gICAgU1RPUkFHRV9UWVBFX1RPX1NUT1JBR0VfTUFOQUdFUl9DT05GSUcsCi0KLSAgICBTS0lQX1ZBTElEQVRJT05fU1VQUE9SVF9DT05GSUcsCi0gICAgVkFMSURBVElPTl9QQVJBTUVURVJfQ09ORklHCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24uamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwY2I2ZjQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuUkVVU0V9KQotcHVibGljIGNsYXNzIFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+Ci17Ci0gICAgcHJpdmF0ZSBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmdzCi0gICAgICAgID0gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlT2ZNYXBwaW5nKFN0cmluZyBwYXRoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBnZXRNYXBwaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtYXBwaW5nczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBzb3VyY2UsIFN0cmluZyB0YXJnZXQpCi0gICAgewotICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5ID0gbmV3IFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgZW50cnkuc2V0U291cmNlKHNvdXJjZSk7Ci0gICAgICAgIGVudHJ5LnNldFRhcmdldCh0YXJnZXQpOwotICAgICAgICB0aGlzLm1hcHBpbmdzLmFkZChlbnRyeSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWE2M2M0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuUkVVU0V9KQotcHVibGljIGNsYXNzIFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+Ci17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGF0aDsKLSAgICBwcml2YXRlIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3M7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VPZk1hcHBpbmcoU3RyaW5nIHBhdGgpCi0gICAgewotICAgICAgICB0aGlzLnBhdGggPSBwYXRoOwotICAgICAgICAvL2ZvcmNlIHJlbG9hZAotICAgICAgICBtYXBwaW5ncyA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gZ2V0TWFwcGluZygpCi0gICAgewotICAgICAgICBpZihtYXBwaW5ncyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbWFwcGluZ3M7Ci0gICAgICAgIH0KLQotICAgICAgICBtYXBwaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4oKTsKLQotICAgICAgICBSZXNvdXJjZUJ1bmRsZSBtYXBwaW5nID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHBhdGgpOwotCi0gICAgICAgIGlmIChtYXBwaW5nID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vbG9nZ2luZwotICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIEVudW1lcmF0aW9uIGtleXMgPSBtYXBwaW5nLmdldEtleXMoKTsKLQotICAgICAgICBTdHJpbmcgbWV0YURhdGFLZXk7Ci0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7Ci0KLSAgICAgICAgd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFEYXRhS2V5ID0gKFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lID0gbWFwcGluZy5nZXRTdHJpbmcobWV0YURhdGFLZXkpOwotCi0gICAgICAgICAgICBhZGRNYXBwaW5nKG1ldGFEYXRhS2V5LCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXBwaW5nczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgbWV0YURhdGFLZXksIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpCi0gICAgewotICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5ID0gbmV3IFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgZW50cnkuc2V0U291cmNlKG1ldGFEYXRhS2V5KTsKLSAgICAgICAgZW50cnkuc2V0VGFyZ2V0KHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSk7Ci0gICAgICAgIHRoaXMubWFwcGluZ3MuYWRkKGVudHJ5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTkzOTY4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFJlbmRlcmVySW50ZXJjZXB0b3IKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcigpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0SW50ZXJjZXB0b3JJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRSZXR1cm5WYWx1ZU9uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBza2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLCBPYmplY3QgY3VycmVudFJldHVyblZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnRSZXR1cm5WYWx1ZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICogYmVmb3JlCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBhZnRlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFmdGVyRGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyRW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyRW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZnRlckdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyNzEyOS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuVmFsaWRhdGlvbk1vZHVsZUtleTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlci5Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmVsLlByb3BlcnR5Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIHgueC4zCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IKLXsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25TdXBwb3J0ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFmdGVyRGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICAgICAgdGhyb3dzIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogY29tcG9uZW50IGluaXRpYWxpemF0aW9uIHNldHMgYSBjb21wb25lbnQgdG8gcmVxdWlyZWQgaWYgdGhlcmUgYXJlIGNvbnN0cmFpbnRzIHdoaWNoIGluZGljYXRlIGl0Ci0gICAgICAgICAqIHRoZSByZXF1aXJlZCBmbGFnIGluIGEgY29tcG9uZW50IGxlYWRzIHRvIHByb2JsZW1zIHdpdGggaDptZXNzYWdlcyAoYWRkaXRpb25hbCBtZXNzYWdlKSBhcyB3ZWxsIGFzCi0gICAgICAgICAqIGluY29tcGF0aWJpbGl0aWVzIHdpdGggc2tpcCB2YWxpZGF0aW9uIGFuZCBzZXZlcml0aWVzCi0gICAgICAgICAqLwotICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIgJiYgRXh0VmFsVXRpbHMuaXNSZXF1aXJlZFJlc2V0QWN0aXZhdGVkKCkgJiYKLSAgICAgICAgICAgICAgICBpc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25TdXBwb3J0ZWQoKSAmJiBFeHRWYWxVdGlscy5pc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25BY3RpdmUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkgJiYgIWlzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25EZWFjdGl2YXRlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0Q29tcG9uZW50KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0OwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QgPSB3cmFwcGVkLmdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChQcm9wZXJ0eU5vdEZvdW5kRXhjZXB0aW9uIHIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRmF0YWxFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZmF0YWwoIml0IHNlZW1zIHlvdSBhcmUgdXNpbmcgYW4gaW52YWxpZCBiaW5kaW5nLiAiICsgd3JhcHBlZC5nZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBjb252ZXJzaW9uIGZhaWxlZC4gbm9ybWFsbHkgdGhpcyBpcyA+bm90PCBhIG15ZmFjZXMgZXh0dmFsIGlzc3VlISIsIHIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aHJvdyByOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnRpZXModWlDb21wb25lbnQpOwotICAgICAgICAKLSAgICAgICAgaWYocmVjb3JkUHJvY2Vzc2VkSW5mb3JtYXRpb24oKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy9yZWNvcmRlIHVzZXIgaW5wdXQgZS5nLiBmb3IgY3Jvc3MtY29tcG9uZW50IHZhbGlkYXRpb24KLSAgICAgICAgICAgIGZvcihQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyIHJlY29yZGVyIDogRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWNvcmRlci5yZWNvcmRVc2VySW5wdXQodWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZWNvcmRlci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY2FsbGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdCA9IHRyYW5zZm9ybVZhbHVlRm9yVmFsaWRhdGlvbihjb252ZXJ0ZWRPYmplY3QpOwotCi0gICAgICAgICAgICAgICAgaWYodmFsaWRhdGVWYWx1ZShjb252ZXJ0ZWRPYmplY3QpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQmVmb3JlVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1ZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFZhbGlkYXRvckV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL1Zpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgbWlnaHQgZGVjaWRlIHRoYXQgaXQgaXNuJ3QgYW4gZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudCh1aUNvbXBvbmVudCwgZS5nZXRGYWNlc01lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVmFsaWRhdG9yRXhjZXB0aW9uIGZpbmFsRXhjZXB0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb252ZXJ0ZXJFeGNlcHRpb24oZS5nZXRGYWNlc01lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9jZXNzQWZ0ZXJWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7Ci0gICAgICAgICAgICByZXNldFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0aWVzKHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NCZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUdsb2JhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsdWUsCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIGdldFByb3BlcnR5SW5mb3JtYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCksIGdldE1vZHVsZUtleSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQWZ0ZXJWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBFeHRWYWxVdGlscy5leGVjdXRlR2xvYmFsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHZhbHVlLAotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBnZXRQcm9wZXJ0eUluZm9ybWF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpLCBnZXRNb2R1bGVLZXkoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFByb3BlcnR5SW5mb3JtYXRpb24gZ2V0UHJvcGVydHlJbmZvcm1hdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IGdldFByb3BlcnRpZXNGb3JDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcih1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IgPSBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcihwcm9wZXJ0aWVzKTsKLQotICAgICAgICByZXR1cm4gbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRQcm9wZXJ0aWVzRm9yQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgICAgICBpZihnZXRNb2R1bGVLZXkoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzLmdldE5hbWUoKSwgZ2V0TW9kdWxlS2V5KCkpOwotICAgICAgICB9Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KFVJQ29tcG9uZW50LmNsYXNzLmdldE5hbWUoKSwgdWlDb21wb25lbnQpOwotICAgICAgICByZXR1cm4gcHJvcGVydGllczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTWV0YURhdGFFeHRyYWN0b3IgZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsKLQotICAgIHByb3RlY3RlZCBPYmplY3QgdHJhbnNmb3JtVmFsdWVGb3JWYWxpZGF0aW9uKE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpCi0gICAgewotICAgICAgICBpZiAoIiIuZXF1YWxzKGNvbnZlcnRlZE9iamVjdCkgJiYgaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlVmFsdWUoT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkKLSAgICB7Ci0gICAgICAgIGlmKGlzVmFsdWVUb1ZhbGlkYXRlRW1wdHkoY29udmVydGVkT2JqZWN0KSAmJiAhdmFsaWRhdGVFbXB0eUZpZWxkcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCJlbXB0eSBmaWVsZCB2YWxpZGF0aW9uIGlzIGRlYWN0aXZhdGVkIGluIHRoZSB3ZWIueG1sIC0gc2VlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5WQUxJREFURV9FTVBUWV9GSUVMRFMiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWx1ZVRvVmFsaWRhdGVFbXB0eShPYmplY3QgY29udmVydGVkT2JqZWN0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZE9iamVjdCA9PSBudWxsIHx8ICIiLmVxdWFscyhjb252ZXJ0ZWRPYmplY3QpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlRW1wdHlGaWVsZHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLnZhbGlkYXRlRW1wdHlGaWVsZHMoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbigKLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0KTsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyICYmIGlzVmFsdWVCaW5kaW5nT2ZDb21wb25lbnRWYWxpZCh1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsdWVCaW5kaW5nT2ZDb21wb25lbnRWYWxpZChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCkgIT0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbXBvbmVudEluaXRpYWxpemF0aW9uRGVhY3RpdmF0ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NPTVBPTkVOVF9JTklUSUFMSVpBVElPTik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVjb3JkUHJvY2Vzc2VkSW5mb3JtYXRpb24oKQotICAgIHsKLSAgICAgICAgLy9vdmVycmlkZSBpZiBuZWVkZWQKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDbGFzcyBnZXRNb2R1bGVLZXkoKQotICAgIHsKLSAgICAgICAgLy9vdmVycmlkZSBpZiBuZWVkZWQKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0SW50ZXJjZXB0b3JQcm9wZXJ0aWVzKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgICAgICBpZihnZXRNb2R1bGVLZXkoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQucHV0KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpLCBnZXRNb2R1bGVLZXkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LnB1dChVSUNvbXBvbmVudC5jbGFzcy5nZXROYW1lKCksIHVpQ29tcG9uZW50KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydGllcyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UgaW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UgPSBnZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlKCk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gZ2V0SW50ZXJjZXB0b3JQcm9wZXJ0aWVzKHVpQ29tcG9uZW50KTsKLSAgICAgICAgZm9yKFN0cmluZyBrZXkgOiBwcm9wZXJ0aWVzLmtleVNldCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5zZXRQcm9wZXJ0eShrZXksIHByb3BlcnRpZXMuZ2V0KGtleSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnRpZXMoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlIGludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlID0gZ2V0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZSgpOwotCi0gICAgICAgIGZvcihTdHJpbmcga2V5IDogZ2V0SW50ZXJjZXB0b3JQcm9wZXJ0aWVzKHVpQ29tcG9uZW50KS5rZXlTZXQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UucmVtb3ZlUHJvcGVydHkoa2V5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZSBnZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuY2xhc3MsCi0gICAgICAgICAgICAgICAgUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0NvbXBvbmVudEluaXRpYWxpemF0aW9uQXdhcmVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Bd2FyZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZjcxMTguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Bd2FyZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXJTdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBvbmVudEluaXRpYWxpemF0aW9uQXdhcmVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZihKc2ZVdGlscy5pc1JlbmRlclJlc3BvbnNlUGhhc2UoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZnRlckV4dHJhY3RpbmdGb3JDb21wb25lbnRJbml0aWFsaXphdGlvbihwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZnRlckV4dHJhY3RpbmdGb3JDb21wb25lbnRJbml0aWFsaXphdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9GYWNlc01lc3NhZ2VQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2YjE2My4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9GYWNlc01lc3NhZ2VQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5GYWNlc01lc3NhZ2VTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcig5MDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gYmVmb3JlVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlU3RvcmFnZSBmYWNlc01lc3NhZ2VTdG9yYWdlID0gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZSgNCi0gICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcywgRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgaWYoZmFjZXNNZXNzYWdlU3RvcmFnZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZVN0b3JhZ2UuYWRkQWxsKCk7DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVzZXRTdG9yYWdlKEZhY2VzTWVzc2FnZVN0b3JhZ2UuY2xhc3MsIEZhY2VzTWVzc2FnZVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0h0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDdjOTI4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0h0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuTGFiZWxlZE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5leGNlcHRpb24uUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRTZWNyZXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTWVudTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lUmFkaW87Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlDaGVja2JveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUxpc3Rib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHRhcmVhOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQEludm9jYXRpb25PcmRlcigxMDApCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEh0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQotICAgIHsKLSAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7Ci0gICAgICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gRXh0VmFsVXRpbHMuY29udmVydEZhY2VzTWVzc2FnZSh2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkpOwotCi0gICAgICAgICAgICB0cnlUb1VzZUlubGluZU1lc3NhZ2UodWlDb21wb25lbnQsIHZhbGlkYXRvckV4Y2VwdGlvbik7Ci0KLSAgICAgICAgICAgIHRyeVRvVXNlTGFiZWwoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgZmFjZXNNZXNzYWdlKTsKLQotICAgICAgICAgICAgdHJ5VG9CbG9ja3NOYXZpZ2F0aW9uKHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBmYWNlc01lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1VzZUlubGluZU1lc3NhZ2UoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pCi0gICAgewotICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpOwotICAgICAgICBTdHJpbmcgaW5saW5lTWVzc2FnZTsKLQotICAgICAgICBpZih2YWxpZGF0b3JFeGNlcHRpb24gaW5zdGFuY2VvZiBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgaW5saW5lTWVzc2FnZSA9IGdldElubGluZVJlcXVpcmVkTWVzc2FnZSh1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgICAgIGlmKGlubGluZU1lc3NhZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShpbmxpbmVNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGlubGluZU1lc3NhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGlubGluZU1lc3NhZ2UgPSBnZXRJbmxpbmVWYWxpZGF0b3JNZXNzYWdlKHVpQ29tcG9uZW50KTsKLQotICAgICAgICAgICAgaWYoaW5saW5lTWVzc2FnZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGlubGluZU1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoaW5saW5lTWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9Vc2VMYWJlbChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGxhYmVsID0gKFN0cmluZykgUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHVpQ29tcG9uZW50LAotICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJnZXRMYWJlbCIpKTsKLQotICAgICAgICBpZihsYWJlbCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBsYWJlbCA9IHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL292ZXJyaWRlIHRoZSBsYWJlbCBpZiB0aGUgYW5ub3RhdGlvbiBwcm92aWRlcyBhIGxhYmVsCi0gICAgICAgIGlmKG1ldGFEYXRhRW50cnkgIT0gbnVsbCAmJiBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBsYWJlbCA9IG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwsIFN0cmluZy5jbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihmYWNlc01lc3NhZ2UgaW5zdGFuY2VvZiBMYWJlbGVkTWVzc2FnZSkKLSAgICAgICAgewotICAgICAgICAgICAgKChMYWJlbGVkTWVzc2FnZSlmYWNlc01lc3NhZ2UpLnNldExhYmVsVGV4dChsYWJlbCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9pZiBzb21lb25lIHVzZXMgYSBub3JtYWwgZmFjZXMgbWVzc2FnZQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9QbGFjZUxhYmVsKGZhY2VzTWVzc2FnZSwgbGFiZWwsIGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImNoZWNrIGlmIGl0IGlzIHN0aWxsIHJlcXVpcmVkIGhlcmUiKQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0Jsb2Nrc05hdmlnYXRpb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkKLSAgICB7Ci0gICAgICAgIGlmKG1ldGFEYXRhRW50cnkgIT0gbnVsbCAmJiBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2NvcnJlY3Qgc2V2ZXJpdHkgaXMgZS5nLiBwcm92aWRlZCBieSBWaW9sYXRpb25TZXZlcml0eVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcgotICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50KHVpQ29tcG9uZW50LCBmYWNlc01lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW5saW5lUmVxdWlyZWRNZXNzYWdlKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiZ2V0UmVxdWlyZWRNZXNzYWdlIikpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldElubGluZVZhbGlkYXRvck1lc3NhZ2UoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gKFN0cmluZylSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJnZXRWYWxpZGF0b3JNZXNzYWdlIikpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRTZWNyZXQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVMaXN0Ym94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lTWVudSB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZVJhZGlvIHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUNoZWNrYm94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TWVudSB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0VGV4dGFyZWE7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZDIxZGUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlclN1cHBvcnQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQEludm9jYXRpb25PcmRlclN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotew0KLSAgICAvKioNCi0gICAgICoNCi0gICAgICogQHBhcmFtIHByb3BlcnR5SW5mb3JtYXRpb24gdGhlIGluZm9ybWF0aW9uIGVudHJ5IHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9wZXJ0eQ0KLSAgICAgKi8NCi0gICAgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0Y2Y1MjcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlclN1cHBvcnQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlclN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcg0KLXsNCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlIHZhbGlkYXRpb24gcHJvY2VzcyBzaG91bGQgYmUgYnlwYXNzZWQNCi0gICAgICovDQotICAgIGJvb2xlYW4gYmVmb3JlVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsNCi0NCi0gICAgLyoqDQotICAgICAqIHByb2Nlc3NlZCBpZiB2YWxpZGF0aW9uIHdhcyBleGVjdXRlZA0KLSAgICAgKiBpbiBjb250cmFzdCB0byBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaXQgZ2V0cyBleGVjdXRlZCBpbiBhbnkgY2FzZQ0KLSAgICAgKi8NCi0gICAgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxZjA1NC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9SZW5kZXJlckludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogQWxsb3dzIHRvIGludGVyY2VwdCByZW5kZXJlciBtZXRob2RzLjxici8+Ci0gKiBCYXNlIG1lY2hhbmlzbSBvZiBleHR2YWwuIEl0IGFsbG93cyB0byBhZGQgY3VzdG9tIGluZnJhc3RydWN0dXJlcy4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIFN0cmluZyBnZXRJbnRlcmNlcHRvcklkKCk7Ci0KLSAgICBPYmplY3QgZ2V0UmV0dXJuVmFsdWVPblNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oCi0gICAgICAgIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gc2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiwgT2JqZWN0IGN1cnJlbnRSZXR1cm5WYWx1ZSk7Ci0KLSAgICAvKgotICAgICAqIGJlZm9yZQotICAgICAqLwotICAgIHZvaWQgYmVmb3JlRGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlRW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgLyoKLSAgICAgKiBhZnRlcgotICAgICAqLwotICAgIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyRW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRlYzNkMC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXJTdXBwb3J0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQWxsb3dzIHRvIGludGVyY2VwdCB2YWxpZGF0aW9yIGV4Y2VwdGlvbnMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yDQotew0KLSAgICAvKioNCi0gICAgICoNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IHRoZSBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gbWV0YURhdGFFbnRyeSB0aGUgbWV0YSBkYXRhIGVudHJ5IHdoaWNoIGNvbnRhaW5zIHRoZSBtZXRhIGRhdGEgb2YgdGhlIHByb3BlcnR5DQotICAgICAqIEBwYXJhbSBjb252ZXJ0ZWRPYmplY3QgdGhlIGNvbnZlcnRlZCB1c2VyIGlucHV0DQotICAgICAqIEBwYXJhbSB2YWxpZGF0b3JFeGNlcHRpb24gdGhlIGN1cnJlbnQgZXhjZXB0aW9uDQotICAgICAqIEBwYXJhbSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UgdmFsaWRhdGlvbiBzdHJhdGVneSB3aGljaCB0aHJldyB0aGUgZXhjZXB0aW9uDQotICAgICAqIEByZXR1cm4gZmFsc2UgdG8gc3RvcCB0aHJvd2luZyB0aGUgZXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmUxNWUwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLk51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25JbnRlcmNlcHRvciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXF1aXJlZEluaXRpYWxpemF0aW9uU3VwcG9ydGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCB0byBpbml0IGNvbXBvbmVudCAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YVJlc3VsdCA9IEV4dFZhbFV0aWxzCi0gICAgICAgICAgICAgICAgLmdldFRyYW5zZm9ybWVkTWV0YURhdGFGb3IoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZ2V0TW9kdWxlS2V5KCkpOwotCi0gICAgICAgIC8vZ2V0IGNvbXBvbmVudCBpbml0aWFsaXplciBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50IGFuZCBjb25maWd1cmUgaXQKLSAgICAgICAgLy9hbHNvIGluIGNhc2Ugb2Ygc2tpcHBlZCB2YWxpZGF0aW9uIHRvIHJlc2V0IGUuZy4gdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZQotICAgICAgICBpZighbWV0YURhdGFSZXN1bHQuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBFeHRWYWxVdGlscy5jb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFSZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiaW5pdCBjb21wb25lbnQgb2YgIiArIHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpCi0gICAgewotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IEV4dFZhbFV0aWxzCi0gICAgICAgICAgICAgICAgLmdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yV2l0aChnZXRQcm9wZXJ0aWVzRm9yQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IodWlDb21wb25lbnQpKTsKLQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHZhbGlkYXRpb24iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJvY2Vzc0ZpZWxkVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJ2YWxpZGF0aW9uIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWV0YURhdGFFeHRyYWN0b3IgZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yV2l0aChwcm9wZXJ0aWVzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRmllbGRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5OwotICAgICAgICBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvciBza2lwVmFsaWRhdGlvbkV2YWx1YXRvciA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKCk7Ci0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0TWV0YURhdGFFbnRyaWVzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKGVudHJ5LmdldEtleSgpKTsKLQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgIGlzVmFsaWRhdGlvblN0cmF0ZWd5Q29tcGF0aWJsZVdpdGhWYWx1ZSh2YWxpZGF0aW9uU3RyYXRlZ3ksICBjb252ZXJ0ZWRPYmplY3QpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLnNraXBWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHZhbGlkYXRpb25TdHJhdGVneSwgZW50cnkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic2tpcCB2YWxpZGF0aW9uIG9mICIgKyBlbnRyeS5nZXRWYWx1ZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aXRoICIgKyB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vZG9uJ3QgYnJlYWsgbWF5YmUgdGhlcmUgYXJlIGNvbnN0cmFpbnRzIHdoaWNoIGRvbid0IHN1cHBvcnQgdGhlIHNraXAtbWVjaGFuaXNtCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJ2YWxpZGF0ZSAiICsgZW50cnkuZ2V0VmFsdWUoKSArICIgd2l0aCAiICsgdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZighRXh0VmFsVXRpbHMuZXhlY3V0ZUxvY2FsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uLmNsYXNzLmdldE5hbWUoKSwgcHJvcGVydHlJbmZvcm1hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogdmFsaWRhdGlvbgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQW5ub3RhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZXhlY3V0ZUxvY2FsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKHZhbGlkYXRpb25TdHJhdGVneSA9PSBudWxsICYmIGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gdmFsaWRhdGlvbiBzdHJhdGVneSBmb3VuZCBmb3IgIiArIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZGF0aW9uU3RyYXRlZ3lDb21wYXRpYmxlV2l0aFZhbHVlKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmKHZhbHVlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENsYXNzIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuaXNBbm5vdGF0aW9uUHJlc2VudChOdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneS5jbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gISIiLmVxdWFscyh2YWx1ZSkgfHwgUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSkKLSAgICAgICAgICAgICAgICAuaXNBbm5vdGF0aW9uUHJlc2VudChFbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIC8qKgotICAgICAqIHRvIGVuc3VyZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIHJlY29yZFByb2Nlc3NlZEluZm9ybWF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Zpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WaW9sYXRpb25TZXZlcml0eVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTM0YzYxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Zpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcig5MCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBWaW9sYXRpb25TZXZlcml0eVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgIHsNCi0gICAgICAgIGlmKGlzRXh0VmFsTWV0YURhdGEobWV0YURhdGFFbnRyeSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9QbGFjZVNldmVyaXR5KHZhbGlkYXRvckV4Y2VwdGlvbiwgbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFeHRWYWxNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBBbm5vdGF0aW9uOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1BsYWNlU2V2ZXJpdHkoVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBmb3IoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5IDogRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpDQotICAgICAgICAgICAgICAgIC5leHRyYWN0KGFubm90YXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKFZpb2xhdGlvblNldmVyaXR5LmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKS5zZXRTZXZlcml0eShzZXZlcml0eSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2QzODY1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQSBnZW5lcmljIGltcGxlbWVudGF0aW9uLiBTdWJjbGFzc2VzIGp1c3QgaGF2ZSB0byBub3cgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBuYW1lIG1hcHBlci4NCi0gKg0KLSAqIE5hbWVNYXBwZXJzIGFyZSBzdGF0ZWxlc3MuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VD4gaW1wbGVtZW50cyBOYW1lTWFwcGVyPFQ+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLSAgICBwcml2YXRlIE5hbWVNYXBwZXI8VD4gY3VzdG9tTmFtZU1hcHBlcjsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFQgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZiAoY3VzdG9tTmFtZU1hcHBlciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCk7DQotDQotICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTmFtZU1hcHBlciA9IChOYW1lTWFwcGVyPFQ+KSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKGN1c3RvbU5hbWVNYXBwZXIgIT0gbnVsbCkgPyBjdXN0b21OYW1lTWFwcGVyLmNyZWF0ZU5hbWUoc291cmNlKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODMxY2I2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgZm9yIG5hbWUgbWFwcGVycy4NCi0gKiBBIG5hbWUgbWFwcGVyIGNhbGN1bGF0ZXMgYSBuYW1lIGZvciBhIGdpdmVuIHNvdXJjZSBvYmplY3QuDQotICogZS5nLiBNZXRhLURhdGEgS2V5IChlLmcuOiBhbm5vdGF0aW9uIGNsYXNzIG5hbWUpIC0+IFZhbGlkYXRpb25TdHJhdGVneQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlclN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVNYXBwZXI8VD4NCi17DQotICAgIFN0cmluZyBjcmVhdGVOYW1lKFQgc291cmNlKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL1N1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL1N1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTZkZGQyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9TdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIGludGVyZmFjZSBmb3IgbmFtZS1tYXBwZXJzIHdoaWNoIGhhdmUgdG8gZGVsZWdhdGUgdG8gb3RoZXIgKHN1Yi0pbmFtZS1tYXBwZXJzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcjxUPiBleHRlbmRzIE5hbWVNYXBwZXI8VD4NCi17DQotICAgIHZvaWQgYWRkTmFtZU1hcHBlcihOYW1lTWFwcGVyPFQ+IG5hbWVNYXBwZXIpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL0NvbW1vbk1ldGFEYXRhS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWFlNjM3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL0NvbW1vbk1ldGFEYXRhS2V5cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGE7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBoZWxwZXIgZm9yIGZyZXF1ZW50IG1ldGEtZGF0YSBrZXlzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIHBsYWNlZCBpbiBjb3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgaW5mb3JtYXRpb24gaW4gbXVsdGlwbGUgbW9kdWxlcyAodmFsaWRhdGlvbiBtb2R1bGUgYW5kIGNvbXBvbmVudC1zdXBwb3J0IG1vZHVsZSkNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbW9uTWV0YURhdGFLZXlzDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVJUkVEID0gInJlcXVpcmVkIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFLX1JFUVVJUkVEID0gIndlYWtfcmVxdWlyZWQiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTl9MRU5HVEggPSAibWluX2xlbmd0aCI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOX0xFTkdUSF9ERUZBVUxUID0gIm1pbl9sZW5ndGhfZGVmYXVsdCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0xFTkdUSCA9ICJtYXhfbGVuZ3RoIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfTEVOR1RIX0RFRkFVTFQgPSAibWF4X2xlbmd0aF9kZWZhdWx0IjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9NSU4gPSAicmFuZ2VfbWluIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9NSU5fREVGQVVMVCA9ICJyYW5nZV9taW5fZGVmYXVsdCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOR0VfTUFYID0gInJhbmdlX21heCI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOR0VfTUFYX0RFRkFVTFQgPSAicmFuZ2VfbWF4X2RlZmF1bHQiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVFRFUk4gPSAicGF0dGVybiI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUVEVSTl9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UgPSAicGF0dGVybl92YWxpZGF0aW9uX2Vycm9yX21lc3NhZ2UiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQUlMID0gImVtYWlsIjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT00gPSAiY3VzdG9tIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lQX1ZBTElEQVRJT04gPSAic2tpcF92YWxpZGF0aW9uIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFX0NMSUVOVF9TSURFX1ZBTElEQVRJT04gPSAiZGlzYWJsZV9jbGllbnRfc2lkZV92YWxpZGF0aW9uIjsNCi0gICAgLy9hdmFpbGFibGUgZm9yIGFkZC1vbnMgbm90IHVzZWQgaW50ZXJuYWxseSBkdWUgdG8gcGVyZm9ybWFuY2UgcmVhc29ucw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfU0hPV19JTkRJQ0FUSU9OID0gImRpc2FibGVfc2hvd19pbmRpY2F0aW9uIjsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvTWV0YURhdGFFbnRyeS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvTWV0YURhdGFFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTU0NTgyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL01ldGFEYXRhRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBEYXRhIGhvbGRlciB3aGljaCBzdG9yZXMgdGhlIG1ldGEtZGF0YSBhbmQgc29tZSBpbmZvcm1hdGlvbiB3aGVyZSB0aGUgbWV0YS1kYXRhIHdhcyBhcm91bmQuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgTWV0YURhdGFFbnRyeQotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBrZXk7Ci0gICAgcHJpdmF0ZSBPYmplY3QgdmFsdWU7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgic2V0dGluZyBtZXRhLWRhdGEga2V5OiAiICsga2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gVCBnZXRWYWx1ZShDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVClnZXRWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJzZXR0aW5nIG1ldGEtZGF0YSB2YWx1ZTogIiArIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpZ2V0UHJvcGVydHkoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgibmV3IHByb3BlcnR5IGFkZGVkIGtleTogIiArIGtleSArICIgdmFsdWU6ICIgKyB2YWx1ZSArICIgZm9yIG1ldGFkYXRhLWtleTogIiArIHRoaXMua2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMucHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWRjMjZkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhbGwgZmFjdG9yaWVzIHdoaWNoIGNyZWF0ZSBtZXRhLWRhdGEgZXh0cmFjdG9ycwotICogCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ci17Ci0gICAgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlKCk7Ci0KLSAgICBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGVXaXRoKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyk7Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NGNjY2EuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLk1ldGFEYXRhU3RvcmFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlByb3BlcnR5U3RvcmFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLmJlYW5zLkJlYW5JbmZvOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggZXh0cmFjdHMgbWV0YS1kYXRhIChlLmcuIHRoZSBhbm5vdGF0aW9ucykgb2YgdGhlIHZhbHVlIGJpbmRpbmcgb2YgYSBjb21wb25lbnQuCi0gKiBJdCBleHRyYWN0cyB0aGUgbWV0YS1kYXRhIG9mIHRoZSBmaWVsZCBhbmQgdGhlIHByb3BlcnR5LgotICogKEFsc28gdGhlIGFubm90YXRpb25zIG9mIHN1cGVyIGNsYXNzZXMgYW5kIGludGVyZmFjZXMuKQotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0b3IKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHVibGljIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcigpCi0gICAgewotICAgICAgICBpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVG9EbyhQcmlvcml0eS5NRURJVU0pCi0gICAgcHVibGljIFByb3BlcnR5SW5mb3JtYXRpb24gZXh0cmFjdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKCk7Ci0KLSAgICAgICAgLy9zaG91bGQgbmV2ZXIgb2NjdXIKLSAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgVUlDb21wb25lbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpICYmIG9iamVjdCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4ob2JqZWN0LmdldENsYXNzKCkgKyAiIGlzIG5vIHZhbGlkIGNvbXBvbmVudCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCA9IChVSUNvbXBvbmVudCkgb2JqZWN0OwotCi0gICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBleHRyYWN0aW5nIG1ldGEtZGF0YSBvZiAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcodWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmIChwcm9wZXJ0eURldGFpbHMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBnZXQgYmVhbiBjbGFzcyBhbmQgcHJvcGVydHkgbmFtZQotICAgICAgICAgKi8KLSAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKSk7Ci0KLSAgICAgICAgLy9jcmVhdGUKLSAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5zZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBwcm9wZXJ0eURldGFpbHMpOwotCi0gICAgICAgIGlmIChpc0NhY2hlZChlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSA6IGdldENhY2hlZE1ldGFEYXRhKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5hZGRNZXRhRGF0YUVudHJ5KG1ldGFEYXRhRW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZXh0cmFjdEFubm90YXRpb25zKHByb3BlcnR5SW5mb3JtYXRpb24sIHByb3BlcnR5RGV0YWlscywgZW50aXR5Q2xhc3MpOwotICAgICAgICAgICAgY2FjaGVNZXRhRGF0YShwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHRyYWN0IGZpbmlzaGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDYWNoZWQoQ2xhc3MgZW50aXR5Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRNZXRhRGF0YVN0b3JhZ2UoKS5jb250YWluc01ldGFEYXRhRm9yKGVudGl0eUNsYXNzLCBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNhY2hlTWV0YURhdGEoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQotICAgIHsKLSAgICAgICAgZ2V0TWV0YURhdGFTdG9yYWdlKCkuc3RvcmVNZXRhRGF0YU9mKHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgIH0KLQotICAgIHByaXZhdGUgTWV0YURhdGFFbnRyeVtdIGdldENhY2hlZE1ldGFEYXRhKENsYXNzIGVudGl0eUNsYXNzLCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TWV0YURhdGFTdG9yYWdlKCkuZ2V0TWV0YURhdGEoZW50aXR5Q2xhc3MsIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1ldGFEYXRhU3RvcmFnZSBnZXRNZXRhRGF0YVN0b3JhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoTWV0YURhdGFTdG9yYWdlLmNsYXNzLCBNZXRhRGF0YVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDYWNoZWRGaWVsZChDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eVN0b3JhZ2UoKS5jb250YWluc0ZpZWxkKGVudGl0eSwgcHJvcGVydHkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0NhY2hlZEZpZWxkKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5LCBGaWVsZCBmaWVsZCkKLSAgICB7Ci0gICAgICAgIFByb3BlcnR5U3RvcmFnZSBwcm9wZXJ0eVN0b3JhZ2UgPSBnZXRQcm9wZXJ0eVN0b3JhZ2UoKTsKLSAgICAgICAgaWYgKCFwcm9wZXJ0eVN0b3JhZ2UuY29udGFpbnNGaWVsZChlbnRpdHksIHByb3BlcnR5KSkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvcGVydHlTdG9yYWdlLnN0b3JlRmllbGQoZW50aXR5LCBwcm9wZXJ0eSwgZmllbGQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWVsZCBnZXRDYWNoZWRGaWVsZChDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eVN0b3JhZ2UoKS5nZXRGaWVsZChlbnRpdHksIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDYWNoZWRNZXRob2QoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlTdG9yYWdlKCkuY29udGFpbnNNZXRob2QoZW50aXR5LCBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvQ2FjaGVkTWV0aG9kKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5LCBNZXRob2QgbWV0aG9kKQotICAgIHsKLSAgICAgICAgUHJvcGVydHlTdG9yYWdlIHByb3BlcnR5U3RvcmFnZSA9IGdldFByb3BlcnR5U3RvcmFnZSgpOwotICAgICAgICBpZiAoIXByb3BlcnR5U3RvcmFnZS5jb250YWluc01ldGhvZChlbnRpdHksIHByb3BlcnR5KSkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvcGVydHlTdG9yYWdlLnN0b3JlTWV0aG9kKGVudGl0eSwgcHJvcGVydHksIG1ldGhvZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE1ldGhvZCBnZXRDYWNoZWRNZXRob2QoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlTdG9yYWdlKCkuZ2V0TWV0aG9kKGVudGl0eSwgcHJvcGVydHkpOwotICAgIH0KLQotICAgIHByaXZhdGUgUHJvcGVydHlTdG9yYWdlIGdldFByb3BlcnR5U3RvcmFnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShQcm9wZXJ0eVN0b3JhZ2UuY2xhc3MsIFByb3BlcnR5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGV4dHJhY3RBbm5vdGF0aW9ucygKLSAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiwgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywgQ2xhc3MgZW50aXR5Q2xhc3MpCi0gICAgewotICAgICAgICB3aGlsZSAoIU9iamVjdC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGVudGl0eUNsYXNzLmdldE5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgICAgIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICAgICAgcHJvY2Vzc0ludGVyZmFjZXMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscywgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0KLSAgICAgICAgICAgIGVudGl0eUNsYXNzID0gZW50aXR5Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbnRlcmZhY2VzKAotICAgICAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzLCBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLCBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBmb3IgKENsYXNzIGN1cnJlbnRJbnRlcmZhY2UgOiBjdXJyZW50Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGN1cnJlbnRJbnRlcmZhY2UsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICAgICAgcHJvY2Vzc0ludGVyZmFjZXMoY3VycmVudEludGVyZmFjZSwgcHJvcGVydHlEZXRhaWxzLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBNZXRob2QgbWV0aG9kID0gdHJ5VG9HZXRSZWFkTWV0aG9kKGVudGl0eSwgcHJvcGVydHkpOwotCi0gICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0aG9kID0gdHJ5VG9HZXRSZWFkTWV0aG9kTWFudWFsbHkoZW50aXR5LCBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeVRvQ2FjaGVkTWV0aG9kKGVudGl0eSwgcHJvcGVydHksIG1ldGhvZCk7Ci0gICAgICAgICAgICBhZGRBbm5vdGF0aW9uVG9Bbm5vdGF0aW9uRW50cmllcyhBcnJheXMuYXNMaXN0KG1ldGhvZC5nZXRBbm5vdGF0aW9ucygpKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE1ldGhvZCB0cnlUb0dldFJlYWRNZXRob2QoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICBpZiAoaXNDYWNoZWRNZXRob2QoZW50aXR5LCBwcm9wZXJ0eSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDYWNoZWRNZXRob2QoZW50aXR5LCBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodXNlQmVhbkluZm8oKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQmVhbkluZm8gYmVhbkluZm8gPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oZW50aXR5KTsKLSAgICAgICAgICAgICAgICBmb3IgKFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IgOiBiZWFuSW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkuZXF1YWxzKHByb3BlcnR5RGVzY3JpcHRvci5nZXROYW1lKCkpICYmIHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VCZWFuSW5mbygpCi0gICAgewotICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFLmVxdWFscyhFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShCZWFuSW5mby5jbGFzcy5nZXROYW1lKCkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1ldGhvZCB0cnlUb0dldFJlYWRNZXRob2RNYW51YWxseShDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHByb3BlcnR5ID0gcHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vY2hhbmdlZCB0byBvZmZpY2lhbCBiZWFuIHNwZWMuIGR1ZSB0byBjYWNoaW5nIHRoZXJlIGlzIG5vIHBlcmZvcm1hbmNlIGlzc3VlIGFueSBtb3JlCi0gICAgICAgICAgICByZXR1cm4gZW50aXR5LmdldERlY2xhcmVkTWV0aG9kKCJpcyIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZW50aXR5LmdldERlY2xhcmVkTWV0aG9kKCJnZXQiICsgcHJvcGVydHkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm1ldGhvZCBub3QgZm91bmQgLSBjbGFzczogIiArIGVudGl0eS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgLSBtZXRob2RzOiAiICsgImdldCIgKyBwcm9wZXJ0eSArICIgIiArICJpcyIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRGaWVsZEFjY2Vzc0Fubm90YXRpb25zKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQotICAgIHsKLSAgICAgICAgRmllbGQgZmllbGQ7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpZWxkID0gZ2V0RGVjbGFyZWRGaWVsZChlbnRpdHksIHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmllbGQgPSBlbnRpdHkuZ2V0RGVjbGFyZWRGaWVsZCgiXyIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZTEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkubGVuZ3RoKCkgPiAxICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHByb3BlcnR5LmNoYXJBdCgwKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuaXNVcHBlckNhc2UocHJvcGVydHkuY2hhckF0KDEpKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9kb24ndCB1c2UgSW50cm9zcGVjdG9yI2RlY2FwaXRhbGl6ZSBoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKHByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gZW50aXR5LmdldERlY2xhcmVkRmllbGQoSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShwcm9wZXJ0eSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZmllbGQgIiArIHByb3BlcnR5ICsgIiBvciBfIiArIHByb3BlcnR5ICsgIiBub3QgZm91bmQiLCBlMSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZpZWxkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeVRvQ2FjaGVkRmllbGQoZW50aXR5LCBwcm9wZXJ0eSwgZmllbGQpOwotICAgICAgICAgICAgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoQXJyYXlzLmFzTGlzdChmaWVsZC5nZXRBbm5vdGF0aW9ucygpKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpZWxkIGdldERlY2xhcmVkRmllbGQoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHkpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKGlzQ2FjaGVkRmllbGQoZW50aXR5LCBwcm9wZXJ0eSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDYWNoZWRGaWVsZChlbnRpdHksIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlbnRpdHkuZ2V0RGVjbGFyZWRGaWVsZChwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoCi0gICAgICAgICAgICBMaXN0PEFubm90YXRpb24+IGFubm90YXRpb25zLCBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGFubm90YXRpb25zKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLmFkZE1ldGFEYXRhRW50cnkoY3JlYXRlTWV0YURhdGFFbnRyeUZvckFubm90YXRpb24oYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGFubm90YXRpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZvdW5kIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWV0YURhdGFFbnRyeSBjcmVhdGVNZXRhRGF0YUVudHJ5Rm9yQW5ub3RhdGlvbihBbm5vdGF0aW9uIGZvdW5kQW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICAgIE1ldGFEYXRhRW50cnkgZW50cnkgPSBuZXcgTWV0YURhdGFFbnRyeSgpOwotCi0gICAgICAgIGVudHJ5LnNldEtleShmb3VuZEFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCkpOwotICAgICAgICBlbnRyeS5zZXRWYWx1ZShmb3VuZEFubm90YXRpb24pOwotCi0gICAgICAgIHJldHVybiBlbnRyeTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3NjQ1Yi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoaXMgZmFjdG9yeSBjcmVhdGVzIGEgbWV0YS1kYXRhIGV4dHJhY3RvciB3aGljaCBleHRyYWN0cyB0aGUgbWV0YS1kYXRhCi0gKiBvZiB0aGUgdmFsdWUgYmluZGluZyBvZiBhIGNvbXBvbmVudC4KLSAqIDxwLz4KLSAqIG9yZGVyOjxici8+Ci0gKiA8b2w+Ci0gKiAgIDxsaT5jb25maWd1cmVkIG1ldGEtZGF0YSBleHRyYWN0b3IgKHdlYi54bWwpPC9saT4KLSAqICAgPGxpPmNvbmZpZ3VyZWQgbWV0YS1kYXRhIGV4dHJhY3RvciAoaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbik8L2xpPgotICogICA8bGk+ZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjwvbGk+Ci0gKiA8L29sPgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeQotewotICAgIHByaXZhdGUgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IgPSBudWxsOwotCi0gICAgcHVibGljIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpCi0gICAgcHVibGljIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gY3JlYXRlV2l0aChudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlV2l0aChNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICBpZiAobWV0YURhdGFFeHRyYWN0b3IgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IpOwotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IpKTsKLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcy5hZGQoRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3RvciA9IChNZXRhRGF0YUV4dHJhY3RvcikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobWV0YURhdGFFeHRyYWN0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UobWV0YURhdGFFeHRyYWN0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGNyZWF0ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVJbnRlcmNlcHRlZE1ldGFEYXRhRXh0cmFjdG9yV2l0aChtZXRhRGF0YUV4dHJhY3RvciwgcHJvcGVydGllcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL01ldGFEYXRhRXh0cmFjdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0MDUxZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLQotLyoqCi0gKiBBbiBtZXRhLWRhdGEgZXh0cmFjdG9yIGlzIHJlc3BvbnNpYmxlIHRvIGFuYWx5emUgYW4gb2JqZWN0Ci0gKiBhbmQgcmV0dXJucyBhbGwgYXZhaWxhYmxlIG1ldGEtZGF0YSBpbmZvcm1hdGlvbgotICogCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFFeHRyYWN0b3IKLXsKLSAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njk5MTJhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSBlcXVpdmFsZW50IHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0Lg0KLSAqDQotICogaWYgdGhlcmUgaXMgYWxzbyBhIHByb3h5IGZvciB0aGUgZXh0cmFjdG9yIHlvdSBjYW4gdXNlIHRoZSBjbGFzc05hbWUgcHJvcGVydHkgdG8gbWFudWFsbHkgcmVwZWF0IHRoZQ0KLSAqIGZ1bGwgcXVhbGlmaWVkIGNsYXNzIG5hbWUuDQotICoNCi0gKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgaW50ZXJmYWNlIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlciBleHRlbmRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlYTgxOS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgZXF1aXZhbGVudCB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0gKg0KLSAqIGlmIHRoZXJlIGlzIGFsc28gYSBwcm94eSBmb3IgdGhlIHRyYW5zZm9ybWVyIHlvdSBjYW4gdXNlIHRoZSBjbGFzc05hbWUgcHJvcGVydHkgdG8gbWFudWFsbHkgcmVwZWF0IHRoZQ0KLSAqIGZ1bGwgcXVhbGlmaWVkIGNsYXNzIG5hbWUuDQotICoNCi0gKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgY2xhc3MgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbCBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXIsIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIHByaXZhdGUgU3RyaW5nIG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWU7DQotDQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKG1ldGFEYXRhRW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoU3RyaW5nIG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSA9IG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhVHJhbnNmb3JtZXIoTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXIgPSBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYzNhZWUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LklkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5TdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLk5lc3RlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlci4NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0NCi0vKioNCi0gKiBGYWN0b3J5IHdoaWNoIGNyZWF0ZXMgdGhlIE1ldGFEYXRhVHJhbnNmb3JtZXIgZm9yIGEgZ2l2ZW4gVmFsaWRhdGlvblN0cmF0ZWd5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIFZhbGlkYXRpb25TdHJhdGVneSAtPiBNZXRhRGF0YVRyYW5zZm9ybWVyIGluc3RlYWQgb2YgTWV0YS1EYXRhIC0+IE1ldGFEYXRhVHJhbnNmb3JtZXINCi0gKiB0byBhdm9pZCBhIHNlY29uZCBzdGF0aWMgbWFwcGluZyBlLmcuIGZvciBqcGEgYW5ub3RhdGlvbnMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLSAgICAgICAgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWV0YURhdGFUcmFuc2Zvcm1lcj4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nOw0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBuYW1lTWFwcGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PigpOw0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBzdWJOYW1lTWFwcGVyTGlzdCA9DQotICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9zaW5jZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgc3RhcnR1cCBsaXN0ZW5lciBvZiB0aGUgY29yZSBnZXRzIGV4ZWN1dGVkIGZpcnN0DQotICAgICAgICByZWdpc3RlcihuZXcgVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGNyZWF0ZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSA9IGNyZWF0ZVZhbGlkYXRpb25TdHJhdGVneU5hbWUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgIHRyeVRvSW5pdFN0YXRpY01hcHBpbmdzKCk7DQotDQotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIgPQ0KLSAgICAgICAgICAgICAgICB0cnlUb1Jlc29sdmVDYWNoZWRNZXRhRGF0YVRyYW5zZm9ybWVyKHZhbGlkYXRpb25TdHJhdGVneSwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSk7DQotDQotICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gY3JlYXRlQW5kQ2FjaGVNZXRhRGF0YVRyYW5zZm9ybWVyKHZhbGlkYXRpb25TdHJhdGVneSwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlVmFsaWRhdGlvblN0cmF0ZWd5TmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIGlzUHJveHlEZXRlY3RlZCA9IGlzUHJveHkodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0gICAgICAgIC8vaW4gY2FzZSBvZiBhIHByb3h5IGFuZCB0aGUgdXNhZ2Ugb2YgYSBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcg0KLSAgICAgICAgaWYgKGlzUHJveHlEZXRlY3RlZCAmJiB2YWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKChCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcil2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAhaXNQcm94eURldGVjdGVkID8gUHJveHlVdGlscy5nZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9Jbml0U3RhdGljTWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRTdGF0aWNNYXBwaW5ncygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1Byb3h5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgPT0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhVHJhbnNmb3JtZXIgY3JlYXRlQW5kQ2FjaGVNZXRhRGF0YVRyYW5zZm9ybWVyKA0KLSAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgICAgICBTdHJpbmcgdHJhbnNmb3JtZXJOYW1lOw0KLSAgICAgICAgLy9udWxsIC0+IHVzZSBuYW1lIG1hcHBlcnMNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IG5hbWVNYXBwZXIgOiBuYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cmFuc2Zvcm1lck5hbWUgPSBuYW1lTWFwcGVyLmNyZWF0ZU5hbWUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICBpZiAodHJhbnNmb3JtZXJOYW1lID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IHRyeVRvQ3JlYXRlQW5kQ2FjaGVNZXRhRGF0YVRyYW5zZm9ybWVyKA0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCB0cmFuc2Zvcm1lck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciB0cnlUb1Jlc29sdmVDYWNoZWRNZXRhRGF0YVRyYW5zZm9ybWVyKA0KLSAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZy5jb250YWluc0tleSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKE1ldGFEYXRhVHJhbnNmb3JtZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLmdldCh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGFuY2VvZiBJZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICB7DQotICAgICAgICAgICAgU3RyaW5nIG5ld1ZhbGlkYXRpb25TdHJhdGVneU5hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5LklEX1BSRUZJWCArDQotICAgICAgICAgICAgICAgICAgICAoKElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneSl2YWxpZGF0aW9uU3RyYXRlZ3kpLmdldElkKCk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcuY29udGFpbnNLZXkobmV3VmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gKE1ldGFEYXRhVHJhbnNmb3JtZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKA0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZy5nZXQobmV3VmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciB0cnlUb0NyZWF0ZUFuZENhY2hlTWV0YURhdGFUcmFuc2Zvcm1lcigNCi0gICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LCBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgU3RyaW5nIHRyYW5zZm9ybWVyTmFtZSkNCi0gICAgew0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyID0gKE1ldGFEYXRhVHJhbnNmb3JtZXIpDQotICAgICAgICAgICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh0cmFuc2Zvcm1lck5hbWUpOw0KLQ0KLSAgICAgICAgaWYgKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGFuY2VvZiBJZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgKz0gSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5LklEX1BSRUZJWCArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KXZhbGlkYXRpb25TdHJhdGVneSkuZ2V0SWQoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIHRyYW5zZm9ybWVyTmFtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbml0U3RhdGljTWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotDQotICAgICAgICAvL3NldHVwIGludGVybmFsIHN0YXRpYyBtYXBwaW5ncw0KLSAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgOg0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9DT05GSUcpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHNldHVwTWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwTWFwcGluZ3MoTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWFwcGluZy5nZXRTb3VyY2UoKSwgbWFwcGluZy5nZXRUYXJnZXQoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgdHJhbnNmb3JtZXJOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImFkZGluZyB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1ldGEtZGF0YSB0cmFuc2Zvcm1lciBtYXBwaW5nOiAiDQotICAgICAgICAgICAgICAgICsgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArICIgLT4gIiArIHRyYW5zZm9ybWVyTmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLnB1dCh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCB0cmFuc2Zvcm1lck5hbWUpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gZ2V0TmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFNvcnRlZE5hbWVNYXBwZXJMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4odGhpcy5uYW1lTWFwcGVyTGlzdCwgdGhpcy5zdWJOYW1lTWFwcGVyTGlzdCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICB0cnlUb0luaXROYW1lTWFwcGVyV2l0aEV4aXN0aW5nU3ViTWFwcGVycyh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKTsNCi0gICAgICAgIHN1cGVyLnJlZ2lzdGVyKHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBpdCdzIGEgdmVyeSBzcGVjaWFsIGNhc2UgZHVlIHRvIHRoZSBtaXNzaW5nIG9yZGVyIGluIHRoZSBleGVjdXRpb24gb2Ygc3RhcnR1cC1saXN0ZW5lcnMgKHBoYXNlIGxpc3RlbmVycykNCi0gICAgICogcGFja2FnZWQgaW4gZmFjZXMtY29uZmlnLnhtbCBmaWxlcyBvZiBqYXJzDQotICAgICAqDQotICAgICAqIG5vcm1hbGx5IHRoZSBkZWZhdWx0IFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlciBzaG91bGQgYmUgZW5vdWdoDQotICAgICAqIGFueXdheSwgaWYgYSBtb2R1bGUgYWRkcyBhIG5ldyBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIsDQotICAgICAqIGFsbCBwcmV2aW91cyBhZGRlZCBTdWJOYW1lTWFwcGVycyBoYXZlIHRvIGJlIGFkZGVkIHRvIGF2b2lkIGNvbmZ1c2lvbiBpbiBzcGVjaWFsIGNhc2VzLg0KLSAgICAgKiBpZiBhIFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlciBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyBmaW5hbCBleHRlbmQgdGhlIGludGVyZmFjZSBhbmQgZmlsdGVyIGl0IGluIGFkZE5hbWVNYXBwZXINCi0gICAgICogDQotICAgICAqIEBwYXJhbSB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIHdoaWNoIGhhcyB0byBiZSBhZGRlZA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvSW5pdE5hbWVNYXBwZXJXaXRoRXhpc3RpbmdTdWJNYXBwZXJzKE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGluc3RhbmNlb2YgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvcihOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlciA6IHRoaXMuc3ViTmFtZU1hcHBlckxpc3QpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihuYW1lTWFwcGVyLmdldENsYXNzKCkuaXNBbm5vdGF0aW9uUHJlc2VudChOZXN0ZWQuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAoKFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+KXZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGROYW1lTWFwcGVyKG5hbWVNYXBwZXIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1MDRiMi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEFsbG93cyB0byB0cmFuc2Zvcm0gY29uY3JldGUgbWV0YS1kYXRhIHRvIGEgbW9yZSBhYnN0cmFjdCBmb3JtLjxici8+DQotICogZS5nLjogQFJlcXVpcmVkLCBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsLi4uKSwgQExlbmd0aChtaW5pbXVtID0gMSksIC4uLiAtPiByZXF1aXJlZCA9IHRydWUNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi0vLypUcmFuc2Zvcm1lciBpbnN0ZWFkIG9mICpDb252ZXJ0ZXIgdG8gYXZvaWQgbmFtaW5nIGNvbmZ1c2lvbiANCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGEpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9Tb3J0ZWROYW1lTWFwcGVyTGlzdC5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU29ydGVkTmFtZU1hcHBlckxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjYmI0OC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9Tb3J0ZWROYW1lTWFwcGVyTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLlN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuTmVzdGVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOw0KLQ0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1jbGFzcyBTb3J0ZWROYW1lTWFwcGVyTGlzdDxUIGV4dGVuZHMgTmFtZU1hcHBlcj4gaW1wbGVtZW50cyBMaXN0PFQ+DQotew0KLSAgICBwcml2YXRlIExpc3Q8VD4gd3JhcHBlZDsNCi0gICAgcHJpdmF0ZSBMaXN0PFQ+IGdsb2JhbFN1Yk5hbWVNYXBwZXJMaXN0Ow0KLQ0KLSAgICBTb3J0ZWROYW1lTWFwcGVyTGlzdChMaXN0PFQ+IHdyYXBwZWQsIExpc3Q8VD4gc3ViTmFtZU1hcHBlckxpc3QpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7DQotICAgICAgICB0aGlzLmdsb2JhbFN1Yk5hbWVNYXBwZXJMaXN0ID0gc3ViTmFtZU1hcHBlckxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gYWRkKFQgdCkNCi0gICAgew0KLSAgICAgICAgaWYgKHQgIT0gbnVsbCAmJiB0LmdldENsYXNzKCkuaXNBbm5vdGF0aW9uUHJlc2VudChOZXN0ZWQuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRTdWJOYW1lTWFwcGVyKHQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gd3JhcHBlZC5hZGQodCk7DQotDQotICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh3cmFwcGVkLCBuZXcgQ29tcGFyYXRvcjxUPigpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoVCBubTEsIFQgbm0yKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAobm0xIGluc3RhbmNlb2YgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyICYmIG5tMiBpbnN0YW5jZW9mIFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcikNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBubTEgaW5zdGFuY2VvZiBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIgPyAxIDogLTE7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHByaXZhdGUgYm9vbGVhbiBhZGRTdWJOYW1lTWFwcGVyKFQgc3ViTmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlciBuYW1lTWFwcGVyIDogdGhpcy53cmFwcGVkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChuYW1lTWFwcGVyIGluc3RhbmNlb2YgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgKChTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIpIG5hbWVNYXBwZXIpLmFkZE5hbWVNYXBwZXIoc3ViTmFtZU1hcHBlcik7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdHJ5VG9BZGRNYXBwZXJBc0dsb2JhbFN1Yk5hbWVNYXBwZXIoc3ViTmFtZU1hcHBlcik7DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0FkZE1hcHBlckFzR2xvYmFsU3ViTmFtZU1hcHBlcihUIHN1Yk5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIGlmKCF0aGlzLmdsb2JhbFN1Yk5hbWVNYXBwZXJMaXN0LmNvbnRhaW5zKHN1Yk5hbWVNYXBwZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuZ2xvYmFsU3ViTmFtZU1hcHBlckxpc3QuYWRkKHN1Yk5hbWVNYXBwZXIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIGludCBzaXplKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuc2l6ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5pc0VtcHR5KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmNvbnRhaW5zKG8pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJdGVyYXRvcjxUPiBpdGVyYXRvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLml0ZXJhdG9yKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC50b0FycmF5KCk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJTdXNwaWNpb3VzVG9BcnJheUNhbGwifSkNCi0gICAgcHVibGljIDxUPiBUW10gdG9BcnJheShUW10gYSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQudG9BcnJheShhKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnJlbW92ZShvKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmNvbnRhaW5zQWxsKGMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUPiBjKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5hZGRBbGwoYyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgVD4gYykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuYWRkQWxsKGluZGV4LCBjKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5yZW1vdmVBbGwoYyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQucmV0YWluQWxsKGMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkNCi0gICAgew0KLSAgICAgICAgd3JhcHBlZC5jbGVhcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBUIGdldChpbnQgaW5kZXgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldChpbmRleCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFQgc2V0KGludCBpbmRleCwgVCBlbGVtZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5zZXQoaW5kZXgsIGVsZW1lbnQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIFQgZWxlbWVudCkNCi0gICAgew0KLSAgICAgICAgd3JhcHBlZC5hZGQoaW5kZXgsIGVsZW1lbnQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBUIHJlbW92ZShpbnQgaW5kZXgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnJlbW92ZShpbmRleCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5pbmRleE9mKG8pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmxhc3RJbmRleE9mKG8pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3I8VD4gbGlzdEl0ZXJhdG9yKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQubGlzdEl0ZXJhdG9yKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3RJdGVyYXRvcjxUPiBsaXN0SXRlcmF0b3IoaW50IGluZGV4KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5saXN0SXRlcmF0b3IoaW5kZXgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PFQ+IHN1Ykxpc3QoaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnN1Ykxpc3QoZnJvbUluZGV4LCB0b0luZGV4KTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYWRjMTYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotICAgIGltcGxlbWVudHMgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODg5NGQxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgLSBpZiB0aGVyZSBpcyBhIHByb3h5IGFyb3VuZCB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoNTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKChCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcil2YWxpZGF0aW9uU3RyYXRlZ3kpLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMWFhZjkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gTWV0YURhdGFUcmFuc2Zvcm1lcnMuDQotICogKGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmQwODBmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gTWV0YURhdGFUcmFuc2Zvcm1lcnMuDQotICogKGNvbmZpZ3VyZWQgdmlhIGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pDQotICogVGhlIGJlYW4gcHJvdmlkZXMgdGhlIGRlZmF1bHQgbmFtZSAoY29udmVudGlvbikuDQotICogSXQncyBwb3NzaWJsZSB0byBwcm92aWRlIGEgY3VzdG9tIGZ1bGwgcXVhbGlmaWVkIG5hbWUuICg9IGN1c3RvbWl6YWJsZSBjb252ZW50aW9uKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigyMDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGU4NTBkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFwcyBFeHRWYWwgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gTWV0YURhdGFUcmFuc2Zvcm1lcnMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzID0NCi0gICAgICAgICAgICAgICAgUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywNCi0gICAgICAgICAgICAgICAgZ2V0Q2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLmdldFNpbXBsZU5hbWUoKSkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZjE3NWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciB0byBwbGFjZSBWYWxpZGF0aW9uU3RyYXRlZ2llcyBhbmQgTWV0YURhdGFUcmFuc2Zvcm1lcnMgaW4gdGhlIHNhbWUgcGFja2FnZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoNDAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzID0NCi0gICAgICAgICAgICAgICAgUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKTsNCi0NCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLmdldFBhY2thZ2UoKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGdldFNpbXBsZU1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkgKyAiLiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNpbXBsZU1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lQYWNrYWdlTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHBvc3RmaXggPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfUE9TVEZJWCk7DQotDQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUuZW5kc1dpdGgoIlZhbGlkYXRpb25TdHJhdGVneSIpIHx8DQotICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUuZW5kc1dpdGgoIlN0cmF0ZWd5IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneVBhY2thZ2VOYW1lICsgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lDQotICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgpICxwb3N0Zml4KQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoIlZhbGlkYXRpb25TdHJhdGVneSIsIHBvc3RmaXgpDQotICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgiU3RyYXRlZ3kiLCBwb3N0Zml4KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vaW4gY2FzZSBvZiBhIHN0YXRpYyB2YWxpZGF0aW9uIHN0cmF0ZWd5IG1hcHBpbmcNCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lQYWNrYWdlTmFtZSArIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSArIHBvc3RmaXg7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1ZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1ZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmE1ODNiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5TdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLk5lc3RlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyDQotICAgIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotICAgIGltcGxlbWVudHMgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IHN1Yk5hbWVNYXBwZXJzID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZE5hbWVNYXBwZXIoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IG5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIGlmKCF0aGlzLnN1Yk5hbWVNYXBwZXJzLmNvbnRhaW5zKG5hbWVNYXBwZXIpICYmIG5hbWVNYXBwZXIuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KE5lc3RlZC5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5zdWJOYW1lTWFwcGVycy5hZGQobmFtZU1hcHBlcik7DQotICAgICAgICAgICAgc29ydFN1Yk5hbWVNYXBwZXJzKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNvcnRTdWJOYW1lTWFwcGVycygpDQotICAgIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQodGhpcy5zdWJOYW1lTWFwcGVycywgbmV3IEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7DQotDQotICAgICAgICBmb3IoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IG1hcHBlciA6IHRoaXMuc3ViTmFtZU1hcHBlcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gbWFwcGVyLmNyZWF0ZU5hbWUoc291cmNlKTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1ZjUyOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24gaW1wbGVtZW50cyBQcm9wZXJ0eUluZm9ybWF0aW9uCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBpbmZvcm1hdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgIHByaXZhdGUgTGlzdDxNZXRhRGF0YUVudHJ5PiBtZXRhRGF0YUxpc3QgPSBuZXcgQXJyYXlMaXN0PE1ldGFEYXRhRW50cnk+KCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0luZm9ybWF0aW9uKFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gaW5mb3JtYXRpb25NYXAuY29udGFpbnNLZXkoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEluZm9ybWF0aW9uKFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gaW5mb3JtYXRpb25NYXAuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIDxUPiBUIGdldEluZm9ybWF0aW9uKFN0cmluZyBrZXksIENsYXNzPFQ+IHRhcmdldENsYXNzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUKSBnZXRJbmZvcm1hdGlvbihrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEluZm9ybWF0aW9uKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJuZXcgaW5mb3JtYXRpb24gYWRkZWQga2V5OiAiICsga2V5ICsgIiB2YWx1ZTogIiArIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGluZm9ybWF0aW9uTWFwLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeVtdIGdldE1ldGFEYXRhRW50cmllcygpCi0gICAgewotICAgICAgICByZXR1cm4gbWV0YURhdGFMaXN0LnRvQXJyYXkobmV3IE1ldGFEYXRhRW50cnlbbWV0YURhdGFMaXN0LnNpemUoKV0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1ldGFEYXRhRW50cnkoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQotICAgIHsKLSAgICAgICAgbWV0YURhdGFFbnRyeS5zZXRQcm9wZXJ0aWVzKHRoaXMuaW5mb3JtYXRpb25NYXApOwotICAgICAgICB0aGlzLm1ldGFEYXRhTGlzdC5hZGQobWV0YURhdGFFbnRyeSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXRNZXRhRGF0YUVudHJpZXMoKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoInJlc2V0dGluZyBtZXRhLWRhdGEgZW50cmllcyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5tZXRhRGF0YUxpc3QuY2xlYXIoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eURldGFpbHMuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTAzN2NmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5RGV0YWlscwotewotICAgIC8vZm9ybXMgdGhlIGlkIGZvciBjcm9zcy12YWxpZGF0aW9uIHdpdGhpbiBjb21wbGV4IGNvbXBvbmVudHMKLSAgICBwcml2YXRlIFN0cmluZyBrZXk7Ci0gICAgcHJpdmF0ZSBPYmplY3QgYmFzZU9iamVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eURldGFpbHMoU3RyaW5nIGtleSwgT2JqZWN0IGJhc2VPYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgICAgICB0aGlzLmJhc2VPYmplY3QgPSBiYXNlT2JqZWN0OwotICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRLZXkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmFzZU9iamVjdCgpCi0gICAgewotICAgICAgICByZXR1cm4gYmFzZU9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlT2JqZWN0KE9iamVjdCBiYXNlT2JqZWN0KQotICAgIHsKLSAgICAgICAgdGhpcy5iYXNlT2JqZWN0ID0gYmFzZU9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDkyODRmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlJbmZvcm1hdGlvbgotewotICAgIGJvb2xlYW4gY29udGFpbnNJbmZvcm1hdGlvbihTdHJpbmcga2V5KTsKLSAgICBPYmplY3QgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSk7Ci0gICAgPFQ+IFQgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpOwotICAgIHZvaWQgc2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKTsKLQotICAgIE1ldGFEYXRhRW50cnlbXSBnZXRNZXRhRGF0YUVudHJpZXMoKTsKLSAgICB2b2lkIGFkZE1ldGFEYXRhRW50cnkoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KTsKLSAgICB2b2lkIHJlc2V0TWV0YURhdGFFbnRyaWVzKCk7Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZlZjQzMC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cwotewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfREVUQUlMUyA9ICJwcm9wZXJ0eV9kZXRhaWxzIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSVBfVkFMSURBVElPTiA9ICJza2lwX3ZhbGlkYXRpb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSAibGFiZWwiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1BST1BFUlRJRVMgPSAiY3VzdG9tX3Byb3BlcnRpZXMiOwotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJveHkvRGVmYXVsdFByb3h5SGVscGVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm94eS9EZWZhdWx0UHJveHlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4NWI5Ni4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm94eS9EZWZhdWx0UHJveHlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJveHlIZWxwZXIgaW1wbGVtZW50cyBQcm94eUhlbHBlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRQcm94eUhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyA8VD4gQ2xhc3M8VD4gZ2V0VW5wcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzLCBDbGFzczxUPiB0YXJnZXRUeXBlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKENsYXNzPFQ+KWdldFVucHJveGllZENsYXNzKGN1cnJlbnRDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENsYXNzIGdldFVucHJveGllZENsYXNzKENsYXNzIGN1cnJlbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYoaXNQcm94aWVkQ2xhc3MoY3VycmVudENsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3VycmVudENsYXNzLmdldFN1cGVyY2xhc3MoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjdXJyZW50Q2xhc3M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lT2ZDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIGlmIChpc1Byb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lT2ZPYmplY3QoT2JqZWN0IG9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYob2JqZWN0ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldE5hbWVPZkNsYXNzKG9iamVjdC5nZXRDbGFzcygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzUHJveGllZENsYXNzKENsYXNzIGN1cnJlbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzcy5nZXROYW1lKCkuY29udGFpbnMoIiQkRW5oYW5jZXJCeUNHTElCJCQiKSB8fA0KLSAgICAgICAgICAgIGN1cnJlbnRDbGFzcy5nZXROYW1lKCkuY29udGFpbnMoIiQkRmFzdENsYXNzQnlDR0xJQiQkIikgfHwNCi0gICAgICAgICAgICBjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCJfJCRfamF2YXNzaXN0Iik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcm94aWVkT2JqZWN0KE9iamVjdCBwcm94aWVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJveGllZE9iamVjdCAhPSBudWxsICYmIGlzUHJveGllZENsYXNzKHByb3hpZWRPYmplY3QuZ2V0Q2xhc3MoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJveHkvUHJveHlIZWxwZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L1Byb3h5SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZTdlNGEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJveHkvUHJveHlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBQcm94eUhlbHBlcg0KLXsNCi0gICAgQ2xhc3MgZ2V0VW5wcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKTsNCi0NCi0gICAgPFQ+IENsYXNzPFQ+IGdldFVucHJveGllZENsYXNzKENsYXNzIGN1cnJlbnRDbGFzcywgQ2xhc3M8VD4gdGFyZ2V0VHlwZSk7DQotDQotICAgIFN0cmluZyBnZXROYW1lT2ZDbGFzcyhDbGFzcyBwcm94aWVkQ2xhc3MpOw0KLQ0KLSAgICBTdHJpbmcgZ2V0Q2xhc3NOYW1lT2ZPYmplY3QoT2JqZWN0IHByb3hpZWRPYmplY3QpOw0KLQ0KLSAgICBib29sZWFuIGlzUHJveGllZENsYXNzKENsYXNzIGN1cnJlbnRDbGFzcyk7DQotDQotICAgIGJvb2xlYW4gaXNQcm94aWVkT2JqZWN0KE9iamVjdCBwcm94aWVkT2JqZWN0KTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzBmMjNmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlY29yZGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci0KLS8qKgotICogQWxsb3dzIHRvIGNhcHR1cmUgY29udmVydGVkIHZhbHVlcy4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcgotewotICAgIHZvaWQgcmVjb3JkVXNlcklucHV0KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0Fic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNTkyMGMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0Fic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotCi0vKioKLSAqIEJhc2UgZm9yIGFsbCBSZW5kZXJLaXRXcmFwcGVyRmFjdG9yaWVzIHRvIGZvcmNlIGEgc3BlY2lmaWMgYmVoYXZpb3VyCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8UmVuZGVyS2l0LCBSZW5kZXJLaXQ+Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHdyYXBwZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRlYWN0aXZhdGVkID0gZmFsc2U7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgcmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGhpcy53cmFwcGVkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMud3JhcHBlZC5hZGRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeShyZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLndyYXBwZWQgPSByZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGRlYWN0aXZhdGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmRlYWN0aXZhdGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlYWN0aXZhdGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWFjdGl2YXRlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgUmVuZGVyS2l0IGNyZWF0ZShSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgaWYoaXNEZWFjdGl2YXRlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFJlbmRlcktpdCByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIGlmKHRoaXMud3JhcHBlZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSB0aGlzLndyYXBwZWQuY3JlYXRlKHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVdyYXBwZXIocmVuZGVyS2l0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFJlbmRlcktpdCBjcmVhdGVXcmFwcGVyKFJlbmRlcktpdCByZW5kZXJLaXQpOwotCi0gICAgLyoqCi0gICAgICogc2ltcGxlIHRlc3QgZm9yIGVhcmx5IGNvbmZpZyBpbiBjYXNlIG9mIG1vamFycmEgKGluY2wuIHRoZSBjb21iaW5hdGlvbiB3aXRoIHRyaW5pZGFkKS4KLSAgICAgKiB1c2UgYSBjdXN0b20gZXh0dmFsIGNvbnRleHQgaW1wbC4gKHNlZSBFWFRWQUwtNTgpIHRvIG9wdGltaXplIHRoaXMgY2hlY2sgZm9yIHRoZSB0YXJnZXQgcnVudGltZS4KLSAgICAgKiB0aGlzIGNoZWNrIHdvcmtzIGZvciBhbGwgY3VycmVudCBpbXBsZW1lbnRhdGlvbnMgc2luY2UgdGhlIGpzZiBpbnRlcm5hbHMgYXJlIGF1dG9tLiByZWFkeSBkdXJpbmcgYSByZXF1ZXN0Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBqc2YgaW1wbC4gaXMgaW5pdGlhbGl6ZWQgYW5kIGl0J3MgcG9zc2libGUgdG8gdXNlIGl0IGFzIGV4cGVjdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBcHBsaWNhdGlvbkluaXRpYWxpemVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBKc2ZVdGlscy5pc0FwcGxpY2F0aW9uSW5pdGlhbGl6ZWQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMjZiNzIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0RlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ci17Ci0gICAgcHJpdmF0ZSBSZW5kZXJLaXQgcmVuZGVyS2l0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUklDX1JFTkRFUl9LSVRfV1JBUFBFUl9GQUNUT1JZID0KLSAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5yZW5kZXJraXQuR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBCb29sZWFuIHVzZUdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyS2l0IGNyZWF0ZVdyYXBwZXIoUmVuZGVyS2l0IHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImV4dHZhbCByZW5kZXJraXQgd3JhcHBlciBjcmVhdGVkIGZvciAiICsgcmVuZGVyS2l0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vd29ya2Fyb3VuZCBmb3IgbW9qYXJyYSAoRVhUVkFMLTM4KQotICAgICAgICBpZih1c2VHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3MgZ2VuZXJpY0ZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShHRU5FUklDX1JFTkRFUl9LSVRfV1JBUFBFUl9GQUNUT1JZKTsKLSAgICAgICAgICAgIHVzZUdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSA9IGdlbmVyaWNGYWN0b3J5ICE9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih1c2VHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgcmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgPSAoQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSlDbGFzc1V0aWxzCi0gICAgICAgICAgICAgICAgICAgIC50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKEdFTkVSSUNfUkVOREVSX0tJVF9XUkFQUEVSX0ZBQ1RPUlkpOwotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmNyZWF0ZVdyYXBwZXIocmVuZGVyS2l0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRoaXMucmVuZGVyS2l0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucmVuZGVyS2l0ID0gbmV3IEV4dFZhbFJlbmRlcktpdChyZW5kZXJLaXQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcktpdDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbExhenlSZW5kZXJlclByb3h5LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzNjI4Ny4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci0KLS8qKgotICogdG8gc3VwcG9ydCBhIGN1c3RvbSBwcm94eQotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBFeHRWYWxMYXp5UmVuZGVyZXJQcm94eSBleHRlbmRzIFJlbmRlcmVyCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgUmVuZGVyZXIgd3JhcHBlZDsKLQotICAgIHB1YmxpYyBFeHRWYWxMYXp5UmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHJlbmRlcmVyOwotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInNpbXBsZSBwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZXRMYXp5UmVuZGVyZXIoKS5lbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0Q2xpZW50SWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuY29udmVydENsaWVudElkKGZhY2VzQ29udGV4dCwgcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UmVuZGVyc0NoaWxkcmVuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRMYXp5UmVuZGVyZXIoKS5nZXRSZW5kZXJzQ2hpbGRyZW4oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldExhenlSZW5kZXJlcigpLmdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8pOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVuZGVyZXIgZ2V0TGF6eVJlbmRlcmVyKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwcm94eUNsYXNzTmFtZSA9IChTdHJpbmcpIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZKTsKLQotICAgICAgICBpZihwcm94eUNsYXNzTmFtZSAhPSBudWxsICYmICFwcm94eUNsYXNzTmFtZS5lbmRzV2l0aChnZXRDbGFzcygpLmdldE5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUocHJveHlDbGFzc05hbWUpOwotCi0gICAgICAgICAgICBpZih0YXJnZXRDbGFzcyA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImEgY3VzdG9tIGludmFsaWQgcmVuZGVyZXIgcHJveHkgaXMgY29uZmlndXJlZDogIiArIHByb3h5Q2xhc3NOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ2xhc3NbXSBhcmdDbGFzc2VzID0gbmV3IENsYXNzWzFdOwotICAgICAgICAgICAgYXJnQ2xhc3Nlc1swXSA9IFJlbmRlcmVyLmNsYXNzOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHRhcmdldENsYXNzLmdldENvbnN0cnVjdG9yKGFyZ0NsYXNzZXMpOwotICAgICAgICAgICAgICAgIHJldHVybiAoUmVuZGVyZXIpY29uc3RydWN0b3IubmV3SW5zdGFuY2UodGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGNyZWF0ZTogIiArIHRhcmdldENsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0N2U2ZjQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVN0cmVhbTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LlJlc3BvbnNlV3JpdGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZXNwb25zZVN0YXRlTWFuYWdlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuQ2xpZW50QmVoYXZpb3JSZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJLaXQgZXh0ZW5kcyBSZW5kZXJLaXQKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgd3JhcHBlZDsKLQotICAgIHB1YmxpYyBFeHRWYWxSZW5kZXJLaXQoUmVuZGVyS2l0IHdyYXBwZWQpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOwotCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICBpZiAocmVuZGVyZXIgaW5zdGFuY2VvZiBFeHRWYWxSZW5kZXJlcldyYXBwZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIHJlbmRlcmVyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIGNyZWF0ZVdyYXBwZXIocmVuZGVyZXIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBSZW5kZXJlciBnZXRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSB3cmFwcGVkLmdldFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlKTsKLQotICAgICAgICBpZihyZW5kZXJlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyZXIgaW5zdGFuY2VvZiBFeHRWYWxSZW5kZXJlcldyYXBwZXIgPyByZW5kZXJlciA6IGNyZWF0ZVdyYXBwZXIocmVuZGVyZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCJubyByZW5kZXJlciBmb3VuZCBmb3IgZmFtaWx5ICIgKyBmYW1pbHkgKyAiIGFuZCB0eXBlICIgKyByZW5kZXJlclR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlbmRlcmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZVN0YXRlTWFuYWdlciBnZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZVdyaXRlciBjcmVhdGVSZXNwb25zZVdyaXRlcihXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcywgU3RyaW5nIHMxKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY3JlYXRlUmVzcG9uc2VXcml0ZXIod3JpdGVyLCBzLCBzMSk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlU3RyZWFtIGNyZWF0ZVJlc3BvbnNlU3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jcmVhdGVSZXNwb25zZVN0cmVhbShvdXRwdXRTdHJlYW0pOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGdldENvbXBvbmVudEZhbWlsaWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENvbXBvbmVudEZhbWlsaWVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gZ2V0UmVuZGVyZXJUeXBlcyhTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlbmRlcmVyVHlwZXMocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQ2xpZW50QmVoYXZpb3JSZW5kZXJlcihTdHJpbmcgcywgQ2xpZW50QmVoYXZpb3JSZW5kZXJlciBjbGllbnRCZWhhdmlvclJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgd3JhcHBlZC5hZGRDbGllbnRCZWhhdmlvclJlbmRlcmVyKHMsIGNsaWVudEJlaGF2aW9yUmVuZGVyZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGllbnRCZWhhdmlvclJlbmRlcmVyIGdldENsaWVudEJlaGF2aW9yUmVuZGVyZXIoU3RyaW5nIHMpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRDbGllbnRCZWhhdmlvclJlbmRlcmVyKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGdldENsaWVudEJlaGF2aW9yUmVuZGVyZXJUeXBlcygpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRDbGllbnRCZWhhdmlvclJlbmRlcmVyVHlwZXMoKTsKLSAgICB9Ci0KLSAgICBAVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQotICAgIHByb3RlY3RlZCBSZW5kZXJlciBjcmVhdGVXcmFwcGVyKFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxSZW5kZXJlcldyYXBwZXIocmVuZGVyZXIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNzZiOTguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIGNlbnRyYWwgbWVjaGFuaXNtIHdoaWNoIGlzIHJlc3BvbnNpYmxlIHRvIGNyZWF0ZSBhIHdyYXBwZXIgZm9yIGEgcmVuZGVyZXIgLSBzdGFydGluZyBwb2ludCBvZiBleHR2YWwuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJLaXRGYWN0b3J5IGV4dGVuZHMgUmVuZGVyS2l0RmFjdG9yeQotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0gICAgcHJpdmF0ZSBSZW5kZXJLaXRGYWN0b3J5IHdyYXBwZWQ7Ci0gICAgcHJpdmF0ZSBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsKLSAgICBwcml2YXRlIEJvb2xlYW4gaXNEZWFjdGl2YXRlZDsKLQotICAgIHB1YmxpYyBFeHRWYWxSZW5kZXJLaXRGYWN0b3J5KFJlbmRlcktpdEZhY3RvcnkgcmVuZGVyS2l0RmFjdG9yeSkKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHJlbmRlcktpdEZhY3Rvcnk7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJLaXQoU3RyaW5nIHMsIFJlbmRlcktpdCByZW5kZXJLaXQpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQuYWRkUmVuZGVyS2l0KHMsIHJlbmRlcktpdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlbmRlcktpdCBnZXRSZW5kZXJLaXQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICBSZW5kZXJLaXQgcmVuZGVyS2l0ID0gdGhpcy53cmFwcGVkLmdldFJlbmRlcktpdChmYWNlc0NvbnRleHQsIHMpOwotCi0gICAgICAgIC8vZm9yIG1vamFycmEgKyB0cmluaWRhZAotICAgICAgICBpZihyZW5kZXJLaXQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnlUb0luaXREZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsKLQotICAgICAgICBjaGVja1JlbmRlcktpdEZhY3RvcnlEZWFjdGl2YXRpb24oKTsKLQotICAgICAgICBpZih0aGlzLmlzRGVhY3RpdmF0ZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJLaXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3Rlc3QgZWFybHkgY29uZmlnIGluIGNhc2Ugb2YgbW9qYXJyYQotICAgICAgICBpZighdGhpcy5kZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuaXNBcHBsaWNhdGlvbkluaXRpYWxpemVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jcmVhdGVXcmFwcGVyKHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ5VG9DcmVhdGVXcmFwcGVyV2l0aFdyYXBwZXJGYWN0b3J5KHJlbmRlcktpdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVuZGVyS2l0RmFjdG9yeURlYWN0aXZhdGlvbigpCi0gICAgewotICAgICAgICBpZih0aGlzLmlzRGVhY3RpdmF0ZWQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoRXh0VmFsVXRpbHMuaXNFeHRWYWxEZWFjdGl2YXRlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuaXNEZWFjdGl2YXRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZih0aGlzLmRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5pc0FwcGxpY2F0aW9uSW5pdGlhbGl6ZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmlzRGVhY3RpdmF0ZWQgPSBpc1JlbmRlcktpdEZhY3RvcnlEZWFjdGl2YXRlZFZpYVdlYlhtbCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuaXNEZWFjdGl2YXRlZCA9IGlzUmVuZGVyS2l0RmFjdG9yeURlYWN0aXZhdGVkVmlhVk1QYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgdHJ5VG9Jbml0RGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMuZGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vd29ya2Fyb3VuZCBmb3IgbW9qYXJyYSB0byBhbGxvdyBhIGN1c3RvbSBmYWN0b3J5IGR1cmluZyB0aGUgZWFybHkgY29uZmlnIHBoYXNlCi0gICAgICAgICAgICAvL2p1c3QgY3JlYXRlIHRoZSBmYWN0b3J5IHdpdGggdGhlIGdpdmVuIG5hbWUKLSAgICAgICAgICAgIC8vK2l0IHNob3VsZCBleHRlbmQgeW91ciBjdXN0b20gaW1wbGVtZW50YXRpb24gd2hpY2ggeW91IHJlZ2lzdGVyIGFzIHVzdWFsCi0gICAgICAgICAgICBPYmplY3QgY3VzdG9tRmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgKyAiLmN1c3RvbS5SZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSIpOwotCi0gICAgICAgICAgICBpZihjdXN0b21GYWN0b3J5IGluc3RhbmNlb2YgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSA9IChBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KWN1c3RvbUZhY3Rvcnk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgPSBuZXcgRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlbmRlcktpdCB0cnlUb0NyZWF0ZVdyYXBwZXJXaXRoV3JhcHBlckZhY3RvcnkoUmVuZGVyS2l0IHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnkgd3JhcHBlckZhY3RvcnkgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkKLSAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5SRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZLCBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvL3NvbWUgY29tcG9uZW50IGxpYnMgZS5nLiBteWZhY2VzLXRyaW5pZGFkIGFyZW4ndCBjb21wYXRpYmxlIHdpdGggdGhpcyBjbGVhbiBhcHByb2FjaAotICAgICAgICAvL2V4YW1wbGUgc2VlIFRyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyCi0gICAgICAgIGlmKHdyYXBwZXJGYWN0b3J5LmlzRGVhY3RpdmF0ZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcktpdDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB3cmFwcGVyRmFjdG9yeS5jcmVhdGUocmVuZGVyS2l0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBnZXRSZW5kZXJLaXRJZHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZC5nZXRSZW5kZXJLaXRJZHMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNSZW5kZXJLaXRGYWN0b3J5RGVhY3RpdmF0ZWRWaWFXZWJYbWwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX1JFTkRFUl9LSVRfRkFDVE9SWSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVuZGVyS2l0RmFjdG9yeURlYWN0aXZhdGVkVmlhVk1QYXJhbWV0ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFN5c3RlbQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSArCi0gICAgICAgICAgICAgICAgICAgICIuREVBQ1RJVkFURV9SRU5ERVJfS0lUX0ZBQ1RPUlkiLCAiZmFsc2UiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyUHJveHkuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMzYxM2MuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5SZW5kZXJlclByb3h5U3RvcmFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Kc2ZQcm9qZWN0U3RhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogdG8gYXZvaWQgbXVsdGlwbGUgY2FsbHMgb2YgcmVuZGVyZXIgbWV0aG9kcyB3aXRoaW4gcmVuZGVyZXIgaW50ZXJjZXB0b3JzIChlLmcuIGZvciBlbmNvZGUsIGRlY29kZSwuLi4pCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJlclByb3h5IGV4dGVuZHMgUmVuZGVyZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVkgPSBFeHRWYWxSZW5kZXJlclByb3h5LmNsYXNzLmdldE5hbWUoKSArICI6S0VZIjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotICAgIAotICAgIHByb3RlY3RlZCBSZW5kZXJlciB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcmVyUHJveHkoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSByZW5kZXJlcjsKLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBlbnRyeSA9IGdldFJlbmRlcmVyRW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0RlY29kZUNhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXREZWNvZGVDYWxsZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlZC5kZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeVRvQ3JlYXRlTWVzc2FnZSgiZGVjb2RlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGVudHJ5ID0gZ2V0UmVuZGVyZXJFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRW5jb2RlQmVnaW5DYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RW5jb2RlQmVnaW5DYWxsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLndyYXBwZWQuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeVRvQ3JlYXRlTWVzc2FnZSgiZW5jb2RlQmVnaW4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkgPSBnZXRSZW5kZXJlckVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNFbmNvZGVDaGlsZHJlbkNhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXRFbmNvZGVDaGlsZHJlbkNhbGxlZCh0cnVlKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVkLmVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnlUb0NyZWF0ZU1lc3NhZ2UoImVuY29kZUNoaWxkcmVuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBlbnRyeSA9IGdldFJlbmRlcmVyRW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0VuY29kZUVuZENhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXRFbmNvZGVFbmRDYWxsZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlZC5lbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeVRvQ3JlYXRlTWVzc2FnZSgiZW5jb2RlRW5kIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5jb252ZXJ0Q2xpZW50SWQoZmFjZXNDb250ZXh0LCBzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGdldFJlbmRlcnNDaGlsZHJlbigpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gdCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgIHRocm93IHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBlbnRyeSA9IGdldFJlbmRlcmVyRW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKGVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW50cnkuc2V0Q29udmVydGVkVmFsdWUod3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeVRvQ3JlYXRlTWVzc2FnZSgiZ2V0Q29udmVydGVkVmFsdWUiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBnZXRSZW5kZXJlckVudHJ5KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgU3RyaW5nIGtleSA9IHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAga2V5ICs9IGdldE9wdGlvbmFsS2V5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZ2V0UmVuZGVyZXJTdG9yYWdlKCkuY29udGFpbnNFbnRyeShnZXRSZW5kZXJlcktleSgpLCBrZXkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRSZW5kZXJlclN0b3JhZ2UoKS5zZXRFbnRyeShnZXRSZW5kZXJlcktleSgpLCBrZXksIG5ldyBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXRSZW5kZXJlclN0b3JhZ2UoKS5nZXRFbnRyeShnZXRSZW5kZXJlcktleSgpLCBrZXkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3B0aW9uYWxLZXkoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZW5kZXJlcktleSgpCi0gICAgewotICAgICAgICByZXR1cm4gUHJveHlVdGlscy5nZXRDbGFzc05hbWUodGhpcy53cmFwcGVkLmdldENsYXNzKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVuZGVyZXJQcm94eVN0b3JhZ2UgZ2V0UmVuZGVyZXJTdG9yYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKFJlbmRlcmVyUHJveHlTdG9yYWdlLmNsYXNzLCBSZW5kZXJlclByb3h5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpCi0gICAgewotICAgICAgICAvL3Jlc2V0IGNvbXBvbmVudCBwcm94eSBtYXBwaW5nCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlc2V0U3RvcmFnZShSZW5kZXJlclByb3h5U3RvcmFnZS5jbGFzcywgUmVuZGVyZXJQcm94eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9DcmVhdGVNZXNzYWdlKFN0cmluZyBtZXRob2ROYW1lKQotICAgIHsKLSAgICAgICAgaWYoSnNmUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5EZXZlbG9wbWVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gImRvdWJsZSBjYWxsIG9mICIgKyB0aGlzLndyYXBwZWQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIyIgKyBtZXRob2ROYW1lICsgIiBmaWx0ZXJlZC4gIiArCi0gICAgICAgICAgICAgICAgICAgICJ0aGlzIG9wdGltaXphdGlvbiBtaWdodCBsZWFkIHRvIGluY29tcGF0aWJpbGl0aWVzIHdpdGggc29tZSBjb21wb25lbnQgbGlicy4gIiArCi0gICAgICAgICAgICAgICAgICAgICJpbiBzdWNoIGEgY2FzZSB1c2UgdGhlIHN1cHBvcnQgbW9kdWxlIGZvciB0aGUgY29tcG9uZW50IGxpYiBvciB1c2U6ICIgKwotICAgICAgICAgICAgICAgICAgICAiRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVksIG51bGwpOyAiICsKLSAgICAgICAgICAgICAgICAgICAgImluIGEgc3RhcnR1cCBsaXN0ZW5lciI7Ci0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgICAgICAuYWRkTWVzc2FnZShudWxsLCBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4sIG1lc3NhZ2UsIG1lc3NhZ2UpKTsKLQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybihtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoInR1cm4gb24gdGhlIGRldmVsb3BtZW50IG1vZGUgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24sIGlmIHNvbWV0aGluZyBpcyBkaXNwbGF5ZWQgd3JvbmcuIik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YzMwNWUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlJlbmRlcmVySW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci0KLS8qKgotICogRGVmYXVsdCBhcHByb2FjaCB0byBhdm9pZCBwcm94aWVzIGZvciBjb252ZXJ0ZXJzIGFuZCB0aGUgYWRhcHRlciBmYWxsYmFjay4KLSAqIEl0IHJlcXVpcmVzIHRoYXQgY29tcG9uZW50cyBkZWxlZ2F0ZSBnZXRDb252ZXJ0ZWRWYWx1ZSB0byBhIHJlbmRlcmVyLjxici8+Ci0gKiBJZiBpdCBpc24ndCB0aGUgY2FzZSBmb3IgeW91ciBjb21wb25lbnQgbGliIHVzZToKLSAqIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5LkV4dFZhbEFwcGxpY2F0aW9uRmFjdG9yeTxici8+Ci0gKiBhbmQ8YnIvPgotICogb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHkuUHJveHlNYXBwaW5nUGhhc2VMaXN0ZW5lcgotICogPHAvPgotICogVGhpcyB3cmFwcGVyIHdpbGwgYWxzbyBpbXBsZW1lbnQgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBiZWhhdmlvdXIKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcmVyV3JhcHBlciBleHRlbmRzIFJlbmRlcmVyCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByb3RlY3RlZCBSZW5kZXJlciB3cmFwcGVkOwotICAgIHByb3RlY3RlZCBFeHRWYWxDb250ZXh0IGV4dFZhbENvbnRleHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKTsKLQotICAgIHB1YmxpYyBFeHRWYWxSZW5kZXJlcldyYXBwZXIoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICBTdHJpbmcgcHJveHlDbGFzc05hbWUgPSAoU3RyaW5nKUV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZKTsKLQotICAgICAgICBpZihwcm94eUNsYXNzTmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm5vIGV4dHZhbCByZW5kZXJlciBwcm94eSBjb25maWd1cmVkIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRoaXMud3JhcHBlZCA9IG5ldyBFeHRWYWxMYXp5UmVuZGVyZXJQcm94eShyZW5kZXJlcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKHByb3h5Q2xhc3NOYW1lKTsKLQotICAgICAgICBpZih0YXJnZXRDbGFzcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm5vIGV4dHZhbCByZW5kZXJlciBwcm94eSBjb25maWd1cmVkIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRoaXMud3JhcHBlZCA9IG5ldyBFeHRWYWxMYXp5UmVuZGVyZXJQcm94eShyZW5kZXJlcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBDbGFzc1tdIGFyZ0NsYXNzZXMgPSBuZXcgQ2xhc3NbMV07Ci0gICAgICAgIGFyZ0NsYXNzZXNbMF0gPSBSZW5kZXJlci5jbGFzczsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSB0YXJnZXRDbGFzcy5nZXRDb25zdHJ1Y3RvcihhcmdDbGFzc2VzKTsKLSAgICAgICAgICAgIHRoaXMud3JhcHBlZCA9IChSZW5kZXJlciljb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShyZW5kZXJlcik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJubyBleHR2YWwgcmVuZGVyZXIgcHJveHkgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImV4dHZhbCByZW5kZXJlciB3cmFwcGVyIGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSB0cnVlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVEZWNvZGUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVEZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImRlY29kZSBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVEZWNvZGUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVEZWNvZGUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5kZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJEZWNvZGUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJEZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckRlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRGVjb2RlIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVFbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZW5jb2RlQmVnaW4gZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlQmVnaW4gaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5lbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQmVnaW4gaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBlbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSB0cnVlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVFbmNvZGVDaGlsZHJlbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJlbmNvZGVDaGlsZHJlbiBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVDaGlsZHJlbiBvZiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlQ2hpbGRyZW4gaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5lbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckVuY29kZUNoaWxkcmVuIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUNoaWxkcmVuIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVDaGlsZHJlbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSB0cnVlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVFbmNvZGVFbmQgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVFbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImVuY29kZUVuZCBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVFbmQgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlRW5kIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVFbmQgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUVuZCBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY29udmVydENsaWVudElkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udmVydENsaWVudElkKGZhY2VzQ29udGV4dCwgcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZ2V0UmVuZGVyc0NoaWxkcmVuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSB0cnVlOwotICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0ID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlR2V0Q29udmVydGVkVmFsdWUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvLCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udmVydGVkT2JqZWN0ID0gZS5nZXRSZXR1cm5WYWx1ZU9uRXhjZXB0aW9uKGNvbnZlcnRlZE9iamVjdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZ2V0Q29udmVydGVkVmFsdWUgZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlR2V0Q29udmVydGVkVmFsdWUgb2YgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUdldENvbnZlcnRlZFZhbHVlIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdCA9IHdyYXBwZWQuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8sIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyR2V0Q29udmVydGVkVmFsdWUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjJmZmRhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTE0NzI3OTA0OTg3NjYyNTEzNDZMOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YzIwYTcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00MTg0MjQwNTE0NjQ4MTQ4ODhMOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MjBmYmUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUmVuZGVyZXJJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gICAgcHJvdGVjdGVkIFJlbmRlcmVySW50ZXJjZXB0b3IgZXhjZXB0aW9uU291cmNlOwotICAgIHByb3RlY3RlZCBPYmplY3QgaW5mb3JtYXRpb247Ci0gICAgYm9vbGVhbiBza2lwT3RoZXJJbnRlcmNlcHRvcnMgPSBmYWxzZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMzQzMDc0MDc3NTMyOTE1NzIyTDsKLQotICAgIHB1YmxpYyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oYm9vbGVhbiBza2lwT3RoZXJJbnRlcmNlcHRvcnMpCi0gICAgewotICAgICAgICB0aGlzLnNraXBPdGhlckludGVyY2VwdG9ycyA9IHNraXBPdGhlckludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbihib29sZWFuIHNraXBPdGhlckludGVyY2VwdG9ycywgUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgdGhpcyhza2lwT3RoZXJJbnRlcmNlcHRvcnMpOwotICAgICAgICB0aGlzLmV4Y2VwdGlvblNvdXJjZSA9IHJlbmRlcmVySW50ZXJjZXB0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5mb3JtYXRpb24oT2JqZWN0IGluZm9ybWF0aW9uKQotICAgIHsKLSAgICAgICAgdGhpcy5pbmZvcm1hdGlvbiA9IGluZm9ybWF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZm9ybWF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBza2lwT3RoZXJJbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRSZXR1cm5WYWx1ZU9uRXhjZXB0aW9uKE9iamVjdCBjdXJyZW50UmV0dXJuVmFsdWUpCi0gICAgewotICAgICAgICBpZiAodGhpcy5leGNlcHRpb25Tb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhjZXB0aW9uU291cmNlLmdldFJldHVyblZhbHVlT25Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKHRoaXMsIGN1cnJlbnRSZXR1cm5WYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRSZXR1cm5WYWx1ZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDcwYTZhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlByb2plY3RTdGFnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5EZWZhdWx0UHJvamVjdFN0YWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogSW4gb3JkZXIgdG8gZXhlY3V0ZSBsb2dpYyBqdXN0IG9uY2UuDQotICogZS5nLiByZWdpc3RlciBhcnRpZmFjdHMgdmlhIGFwaQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICAvL2Rvbid0IHJlbW92ZSAtIGl0J3MgYSBmYWxsYmFjayBpZiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCBkZXJlZ2lzdHJhdGlvbg0KLSAgICAvL3RhcmdldDogZG9uJ3QgcHJvY2VzcyBpbml0IGxvZ2ljIG1vcmUgdGhhbiBvbmNlDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8Q2xhc3M+IGluaXRpYWxpemVkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWZhdWx0UHJvamVjdFN0YWdlUmVzb2x2ZXJJbml0aWFsaXplZCA9IGZhbHNlOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIHN5bmNocm9uaXplZCAoQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuY2xhc3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCFpbml0aWFsaXplZExpc3RlbmVycy5jb250YWlucyhnZXRDbGFzcygpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydCBpbml0IG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZighaXNTdGFydHVwTGlzdGVuZXJEZWFjdGl2YXRlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdFByb2plY3RTdGFnZVJlc29sdmVyKCk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImluaXQgb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkZWFjdGl2YXRlZCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiaW5pdCBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZmluYWxseQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEpzZlV0aWxzLmRlcmVnaXN0ZXJQaGFzZUxpc3RlbmVyKHRoaXMpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiYW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGRlcmVnaXN0ZXJpbmcgdGhlIHBoYXNlLWxpc3RlbmVyIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRDbGFzcygpLmdldE5hbWUoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC0+IHRoZXJlIGlzIGp1c3QgYSBsaXR0bGUgb3ZlcmhlYWQsIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJ1dCBldmVyeXRoaW5nIGVsc2Ugd29ya3MgY29ycmVjdGx5LiINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBob3dldmVyLCBwbGVhc2UgaW5mb3JtIHRoZSBjb21tdW5pdHkgYWJvdXQgeW91ciBjb25maWd1cmF0aW9uIiwgdCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZmluYWxseQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZExpc3RlbmVycy5hZGQoZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLlJFU1RPUkVfVklFVzsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1N0YXJ0dXBMaXN0ZW5lckRlYWN0aXZhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmlzRXh0VmFsRGVhY3RpdmF0ZWQoKSB8fA0KLSAgICAgICAgICAgICAgICAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShXZWJYbWxVdGlscy5nZXRJbml0UGFyYW1ldGVyKG51bGwsIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjpERUFDVElWQVRFRCIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UHJvamVjdFN0YWdlUmVzb2x2ZXIoKQ0KLSAgICB7DQotICAgICAgICBpZighZGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVySW5pdGlhbGl6ZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShQcm9qZWN0U3RhZ2VSZXNvbHZlci5jbGFzcy5nZXROYW1lKCksIGdldFByb2plY3RTdGFnZVJlc29sdmVyKCksIGZhbHNlKTsNCi0gICAgICAgICAgICBkZWZhdWx0UHJvamVjdFN0YWdlUmVzb2x2ZXJJbml0aWFsaXplZCA9IHRydWU7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFByb2plY3RTdGFnZVJlc29sdmVyIGdldFByb2plY3RTdGFnZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UHJvamVjdFN0YWdlUmVzb2x2ZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0KCk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0V4dFZhbFN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWQzMjgxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmlvbGF0aW9uU2V2ZXJpdHlWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuUGhhc2VJZFJlY29yZGluZ1BoYXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIKLSAgICAgICAgLlNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIKLSAgICAgICAgLlNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIKLSAgICAgICAgLkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXIKLSAgICAgICAgLkRlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yNTA0ODI2NDIxMDg2NTcyMDEyTDsKLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoRXh0VmFsSW5mb3JtYXRpb24uVkVSU0lPTiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydGluZyB1cCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIHYiICsgRXh0VmFsSW5mb3JtYXRpb24uVkVSU0lPTik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oInN0YXJ0aW5nIHVwIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgVmFsaWRhdGlvbkludGVyY2VwdG9yKCkpOwotCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZLCBFeHRWYWxSZW5kZXJlclByb3h5LmNsYXNzLmdldE5hbWUoKSwgZmFsc2UpOwotCi0gICAgICAgIGluaXROYW1lTWFwcGVycygpOwotICAgICAgICBpbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICBpbml0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOwotICAgICAgICBpbml0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIGluaXRQaGFzZUxpc3RlbmVycygpOwotICAgICAgICBpbml0VmlvbGF0aW9uU2V2ZXJpdHlLZXkoKTsKLSAgICAgICAgaW5pdERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbktleSgpOwotICAgICAgICBpbml0UmVxdWlyZWRJbml0aWFsaXphdGlvbigpOwotICAgICAgICBleGVjdXRlQ3VzdG9tU3RhcnR1cExpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXROYW1lTWFwcGVycygpCi0gICAgewotICAgICAgICBTdHJpbmcgZGVhY3RpdmF0ZURlZmF1bHROYW1lTWFwcGVycyA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0RFRkFVTFRfTkFNRV9NQVBQRVJTOwotICAgICAgICBpZiAoKGRlYWN0aXZhdGVEZWZhdWx0TmFtZU1hcHBlcnMgIT0gbnVsbCAmJiBkZWFjdGl2YXRlRGVmYXVsdE5hbWVNYXBwZXJzLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vcmVnaXN0ZXIgbWV0YWRhdGEgdG8gdmFsaWRhdGlvbiBzdHJhdGVneSBuYW1lIG1hcHBlcgotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOwotCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOwotCi0gICAgICAgIC8vcmVnaXN0ZXIgdmFsaWRhdGlvbiBzdHJhdGVneSB0byBtZXNzYWdlIHJlc29sdmVyIG5hbWUgbWFwcGVyCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsKLQotICAgICAgICAvL3JlZ2lzdGVyIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWV0YWRhdGEgdHJhbnNmb3JtZXIgbmFtZSBtYXBwZXIKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleGVjdXRlQ3VzdG9tU3RhcnR1cExpc3RlbmVyKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBjdXN0b21TdGFydHVwTGlzdGVuZXJOYW1lID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5TVEFSVFVQX0xJU1RFTkVSKTsKLSAgICAgICAgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIgY3VzdG9tU3RhcnR1cExpc3RlbmVyID0KLSAgICAgICAgICAgIChBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY3VzdG9tU3RhcnR1cExpc3RlbmVyTmFtZSk7Ci0KLSAgICAgICAgaWYoY3VzdG9tU3RhcnR1cExpc3RlbmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oInN0YXJ0IGluaXQgb2YgIiArIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lci5pbml0KCk7Ci0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImluaXQgb2YgIiArIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoCi0gICAgICAgICAgICAgICAgbmV3IEh0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigpKTsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKAotICAgICAgICAgICAgICAgIG5ldyBWaW9sYXRpb25TZXZlcml0eVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuc2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcihuZXcgRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKSwgZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBGYWNlc01lc3NhZ2VQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFBoYXNlTGlzdGVuZXJzKCkKLSAgICB7Ci0gICAgICAgIEpzZlV0aWxzLnJlZ2lzdGVyUGhhc2VMaXN0ZW5lcihuZXcgUGhhc2VJZFJlY29yZGluZ1BoYXNlTGlzdGVuZXIoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRWaW9sYXRpb25TZXZlcml0eUtleSgpCi0gICAgewotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eShWaW9sYXRpb25TZXZlcml0eS5jbGFzcy5nZXROYW1lKCksIFZpb2xhdGlvblNldmVyaXR5LmNsYXNzLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXREaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb25LZXkoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoCi0gICAgICAgICAgICAgICAgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKSwgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRSZXF1aXJlZEluaXRpYWxpemF0aW9uKCkKLSAgICB7Ci0gICAgICAgIGlmKFdlYlhtbFBhcmFtZXRlci5BQ1RJVkFURV9SRVFVSVJFRF9JTklUSUFMSVpBVElPTiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIHJlcXVpcmVkSW5pdGlhbGl6YXRpb24gPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShXZWJYbWxQYXJhbWV0ZXIuQUNUSVZBVEVfUkVRVUlSRURfSU5JVElBTElaQVRJT04pOwotCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eSgibW9kZTppbml0OnJlcXVpcmVkIiwgcmVxdWlyZWRJbml0aWFsaXphdGlvbiwgZmFsc2UpOwotCi0gICAgICAgICAgICBpZihyZXF1aXJlZEluaXRpYWxpemF0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlYWN0aXZhdGVSZXF1aXJlZEF0dHJpYnV0ZVN1cHBvcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGlmIGl0J3MgY29uZmlndXJlZCB0aGF0IHJlcXVpcmVkIGluaXQgc2hvdWxkIGhhcHBlbiwKLSAgICAgKiBpdCdzIHJlcXVpcmVkIHRvIGRlYWN0aXZhdGUgdGhlIHN1cHBvcnQgZm9yIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGVhY3RpdmF0ZVJlcXVpcmVkQXR0cmlidXRlU3VwcG9ydCgpCi0gICAgewotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eSgibW9kZTpyZXNldDpyZXF1aXJlZCIsIEJvb2xlYW4uVFJVRSwgZmFsc2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdEFwcGxpY2F0aW9uU2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMzhiZGYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdEFwcGxpY2F0aW9uU2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LlJFVVNFOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogZ2VuZXJpYyBzdG9yYWdlIG1hbmFnZXIgaW1wbGVtZW50YXRpb24gd2hpY2ggc3RvcmVzIHRoZSBzdG9yYWdlIGltcGxlbWVudGF0aW9ucyBpbiB0aGUgYXBwbGljYXRpb24gc2NvcGUNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFJFVVNFKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFwcGxpY2F0aW9uU2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPFQ+IGV4dGVuZHMgQWJzdHJhY3RTdG9yYWdlTWFuYWdlcjxUPg0KLXsNCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFQ+IHJlc29sdmVTdG9yYWdlTWFwKCkNCi0gICAgew0KLSAgICAgICAgTWFwIGFwcGxpY2F0aW9uTWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uTWFwKCk7DQotICAgICAgICBNYXA8U3RyaW5nLCBUPiBzdG9yYWdlTWFwOw0KLQ0KLSAgICAgICAgaWYoIWFwcGxpY2F0aW9uTWFwLmNvbnRhaW5zS2V5KGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0b3JhZ2VNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFQ+KCk7DQotICAgICAgICAgICAgYXBwbGljYXRpb25NYXAucHV0KGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCksIHN0b3JhZ2VNYXApOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChNYXA8U3RyaW5nLCBUPilhcHBsaWNhdGlvbk1hcC5nZXQoZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNjYxNGUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuUkVVU0U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBnZW5lcmljIHN0b3JhZ2UgbWFuYWdlciBpbXBsZW1lbnRhdGlvbiB3aGljaCBzdG9yZXMgdGhlIHN0b3JhZ2UgaW1wbGVtZW50YXRpb25zIGluIHRoZSByZXF1ZXN0IHNjb3BlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihSRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPFQ+IGV4dGVuZHMgQWJzdHJhY3RTdG9yYWdlTWFuYWdlcjxUPg0KLXsNCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFQ+IHJlc29sdmVTdG9yYWdlTWFwKCkNCi0gICAgew0KLSAgICAgICAgTWFwIHJlcXVlc3RNYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpOw0KLSAgICAgICAgTWFwPFN0cmluZywgVD4gc3RvcmFnZU1hcDsNCi0NCi0gICAgICAgIGlmKCFyZXF1ZXN0TWFwLmNvbnRhaW5zS2V5KGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0b3JhZ2VNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFQ+KCk7DQotICAgICAgICAgICAgcmVxdWVzdE1hcC5wdXQoZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKSwgc3RvcmFnZU1hcCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKE1hcDxTdHJpbmcsIFQ+KXJlcXVlc3RNYXAuZ2V0KGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RTdG9yYWdlTWFuYWdlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdFN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OThiOTcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdFN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LlJFVVNFOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIGdlbmVyaWMgc3RvcmFnZSBtYW5hZ2VyIGltcGxlbWVudGF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihSRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdG9yYWdlTWFuYWdlcjxUPiBleHRlbmRzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxTdHJpbmc+DQotICAgICAgICBpbXBsZW1lbnRzIFN0b3JhZ2VNYW5hZ2VyPFQ+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxTdHJpbmc+PiBuYW1lTWFwcGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxTdHJpbmc+PigpOw0KLQ0KLSAgICBwdWJsaWMgQWJzdHJhY3RTdG9yYWdlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFQgY3JlYXRlKFN0cmluZyBzdG9yYWdlTmFtZSkNCi0gICAgew0KLSAgICAgICAgVCBzdG9yYWdlTWFuYWdlcjsNCi0gICAgICAgIFN0cmluZyBzdG9yYWdlQ2xhc3NOYW1lOw0KLSAgICAgICAgLy9udWxsIC0+IHVzZSBuYW1lIG1hcHBlcnMNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxTdHJpbmc+IG5hbWVNYXBwZXIgOiB0aGlzLm5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0b3JhZ2VDbGFzc05hbWUgPSBuYW1lTWFwcGVyLmNyZWF0ZU5hbWUoc3RvcmFnZU5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChzdG9yYWdlQ2xhc3NOYW1lID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgc3RvcmFnZU1hbmFnZXIgPSByZXNvbHZlU3RvcmFnZShzdG9yYWdlTmFtZSwgc3RvcmFnZUNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHN0b3JhZ2VNYW5hZ2VyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmFnZU1hbmFnZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFQgcmVzb2x2ZVN0b3JhZ2UoU3RyaW5nIHN0b3JhZ2VLZXksIFN0cmluZyBzdG9yYWdlQ2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBUPiBzdG9yYWdlTWFwID0gcmVzb2x2ZVN0b3JhZ2VNYXAoKTsNCi0NCi0gICAgICAgIGlmKCFzdG9yYWdlTWFwLmNvbnRhaW5zS2V5KHN0b3JhZ2VLZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0b3JhZ2VNYXAucHV0KHN0b3JhZ2VLZXksIChUKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShzdG9yYWdlQ2xhc3NOYW1lKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3RvcmFnZU1hcC5nZXQoc3RvcmFnZUtleSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IE1hcDxTdHJpbmcsIFQ+IHJlc29sdmVTdG9yYWdlTWFwKCk7DQotDQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KFN0cmluZyBzdG9yYWdlS2V5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBUPiBzdG9yYWdlTWFwID0gcmVzb2x2ZVN0b3JhZ2VNYXAoKTsNCi0NCi0gICAgICAgIGlmKHN0b3JhZ2VNYXAgIT0gbnVsbCAmJiBzdG9yYWdlTWFwLmNvbnRhaW5zS2V5KHN0b3JhZ2VLZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENsYXNzIHN0b3JhZ2VDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3Moc3RvcmFnZU1hcC5nZXQoc3RvcmFnZUtleSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgc3RvcmFnZU1hcC5wdXQoc3RvcmFnZUtleSwgKFQpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3Moc3RvcmFnZUNsYXNzKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxTdHJpbmc+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm5hbWVNYXBwZXJMaXN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YWYwMzEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UgaW1wbGVtZW50cyBGYWNlc0luZm9ybWF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgcHJpdmF0ZSBQaGFzZUlkIGN1cnJlbnRQaGFzZUlkOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50UGhhc2VJZChQaGFzZUlkIHBoYXNlSWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3VycmVudFBoYXNlSWQgPSBwaGFzZUlkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldEN1cnJlbnRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFBoYXNlSWQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExM2JkZi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IganNmIGluZm9ybWF0aW9uIG5vdCBhdmFpbGFibGUgdmlhIGpzZi1hcGkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlciBleHRlbmRzDQotICAgICAgICBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2U+DQotew0KLSAgICBEZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBTdG9yYWdlTWFuYWdlci5jbGFzcy5nZXROYW1lKCkgKyAiX0ZPUl9GQUNFU19JTkZPUk1BVElPTl9TVE9SQUdFOktFWSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ2YjdjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5GYWNlc01lc3NhZ2VIb2xkZXI7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkxPVywgZGVzY3JpcHRpb24gPSAib3B0aW9uYWwgcGFyYW1ldGVyIHRvIGRlYWN0aXZhdGUgc29ydGluZyIpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2UgaW1wbGVtZW50cyBGYWNlc01lc3NhZ2VTdG9yYWdlDQotew0KLSAgICBNYXA8U3RyaW5nLCBWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBWYWxpZGF0aW9uUmVzdWx0PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRGYWNlc01lc3NhZ2UoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBpZihjbGllbnRJZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNsaWVudElkID0gIioiOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoIXRoaXMucmVzdWx0cy5jb250YWluc0tleShjbGllbnRJZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5yZXN1bHRzLnB1dChjbGllbnRJZCwgbmV3IFZhbGlkYXRpb25SZXN1bHQoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICB0aGlzLnJlc3VsdHMuZ2V0KGNsaWVudElkKS5hZGRGYWNlc01lc3NhZ2VIb2xkZXIobmV3IEZhY2VzTWVzc2FnZUhvbGRlcihmYWNlc01lc3NhZ2UsIGNsaWVudElkKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBnZXRGYWNlc01lc3NhZ2VzKCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPigpOw0KLQ0KLSAgICAgICAgZm9yKFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGlvblJlc3VsdCA6IHRoaXMucmVzdWx0cy52YWx1ZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQuYWRkQWxsKHZhbGlkYXRpb25SZXN1bHQuZ2V0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkQWxsKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0Ow0KLQ0KLSAgICAgICAgZm9yKFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGlvblJlc3VsdCA6IHRoaXMucmVzdWx0cy52YWx1ZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0ID0gdmFsaWRhdGlvblJlc3VsdC5nZXRGYWNlc01lc3NhZ2VIb2xkZXJMaXN0KCk7DQotICAgICAgICAgICAgc29ydEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCk7DQotDQotICAgICAgICAgICAgZm9yKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIgOiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LmFkZE1lc3NhZ2UoZmFjZXNNZXNzYWdlSG9sZGVyLmdldENsaWVudElkKCksIGZhY2VzTWVzc2FnZUhvbGRlci5nZXRGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzb3J0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdChMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCkNCi0gICAgew0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChmYWNlc01lc3NhZ2VIb2xkZXJMaXN0LCBnZXRGYWNlc01lc3NhZ2VDb21wYXJhdG9yKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBDb21wYXJhdG9yPEZhY2VzTWVzc2FnZUhvbGRlcj4gZ2V0RmFjZXNNZXNzYWdlQ29tcGFyYXRvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgQ29tcGFyYXRvcjxGYWNlc01lc3NhZ2VIb2xkZXI+KCkgew0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShGYWNlc01lc3NhZ2VIb2xkZXIgaG9sZGVyMSwgRmFjZXNNZXNzYWdlSG9sZGVyIGhvbGRlcjIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihob2xkZXIxLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYoaXNTYW1lU2V2ZXJpdHkoaG9sZGVyMSwgaG9sZGVyMikpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlTWVzc2FnZVRleHQoaG9sZGVyMS5nZXRGYWNlc01lc3NhZ2UoKSwgaG9sZGVyMi5nZXRGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYoaG9sZGVyMS5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpLmdldE9yZGluYWwoKSA+DQotICAgICAgICAgICAgICAgICAgICAgICAgaG9sZGVyMi5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpLmdldE9yZGluYWwoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHJpdmF0ZSBpbnQgY29tcGFyZU1lc3NhZ2VUZXh0KEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UxLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlMikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0MSA9IGZhY2VzTWVzc2FnZTEuZ2V0RGV0YWlsKCk7DQotICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0MiA9IGZhY2VzTWVzc2FnZTIuZ2V0RGV0YWlsKCk7DQotDQotICAgICAgICAgICAgICAgIGlmKHRleHQxID09IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRleHQxID0gZmFjZXNNZXNzYWdlMS5nZXRTdW1tYXJ5KCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYodGV4dDIgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdGV4dDIgPSBmYWNlc01lc3NhZ2UyLmdldFN1bW1hcnkoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZih0ZXh0MSA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZih0ZXh0MiA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRleHQxLmNvbXBhcmVUb0lnbm9yZUNhc2UodGV4dDIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH07DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU2FtZVNldmVyaXR5KEZhY2VzTWVzc2FnZUhvbGRlciBob2xkZXIxLCBGYWNlc01lc3NhZ2VIb2xkZXIgaG9sZGVyMikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGhvbGRlcjEuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKS5lcXVhbHMoaG9sZGVyMi5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTWFuYWdlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEyMzI2Zi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VOYW1lTWFwcGVyOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBmYWNlcyBtZXNzYWdlcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotY2xhc3MgRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPEZhY2VzTWVzc2FnZVN0b3JhZ2U+DQotew0KLSAgICBEZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfRkFDRVNfTUVTU0FHRVM6S0VZIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEdyb3VwU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmI0ZDYxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEdyb3VwU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkdyb3VwVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbiBmb3IgZ3JvdXBzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEdyb3VwU3RvcmFnZSBpbXBsZW1lbnRzIEdyb3VwU3RvcmFnZQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PENsYXNzPj4gYWRkZWRHcm91cHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8Q2xhc3M+PigpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8Q2xhc3M+PiByZXN0cmljdGVkR3JvdXBzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PENsYXNzPj4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkR3JvdXAoQ2xhc3MgZ3JvdXBDbGFzcywgU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICBhZGRHcm91cFRvR3JvdXBTdG9yYWdlKGdyb3VwQ2xhc3MsIHZpZXdJZCwgY2xpZW50SWQsIHRoaXMuYWRkZWRHcm91cHMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlc3RyaWN0R3JvdXAoQ2xhc3MgZ3JvdXBDbGFzcywgU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICBhZGRHcm91cFRvR3JvdXBTdG9yYWdlKGdyb3VwQ2xhc3MsIHZpZXdJZCwgY2xpZW50SWQsIHRoaXMucmVzdHJpY3RlZEdyb3Vwcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENsYXNzW10gZ2V0R3JvdXBzKFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5hZGRlZEdyb3Vwcy5zaXplKCkgPCAxKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9hZGQgZm91bmQgZ3JvdXBzDQotICAgICAgICBTdHJpbmcga2V5ID0gR3JvdXBVdGlscy5nZXRHcm91cEtleSh2aWV3SWQsIG51bGwpOw0KLSAgICAgICAgTGlzdDxDbGFzcz4gcmVzdWx0TGlzdEZvclBhZ2UgPSBidWlsZEdyb3VwTGlzdChrZXksIHRoaXMuYWRkZWRHcm91cHMpOw0KLQ0KLSAgICAgICAga2V5ID0gR3JvdXBVdGlscy5nZXRHcm91cEtleSh2aWV3SWQsIGNsaWVudElkKTsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IHJlc3VsdExpc3RGb3JDb21wb25lbnQgPSBidWlsZEdyb3VwTGlzdChrZXksIHRoaXMuYWRkZWRHcm91cHMpOw0KLQ0KLSAgICAgICAgLy9yZW1vdmUgcmVzdHJpY3RlZCBncm91cHMNCi0gICAgICAgIENsYXNzW10gcmVzdWx0c0ZvclBhZ2UgPQ0KLSAgICAgICAgICAgICAgICBmaWx0ZXJHcm91cExpc3QoR3JvdXBVdGlscy5nZXRHcm91cEtleSh2aWV3SWQsIG51bGwpLCByZXN1bHRMaXN0Rm9yUGFnZSk7DQotICAgICAgICBDbGFzc1tdIHJlc3VsdHNGb3JDb21wb25lbnQgPQ0KLSAgICAgICAgICAgICAgICBmaWx0ZXJHcm91cExpc3QoR3JvdXBVdGlscy5nZXRHcm91cEtleSh2aWV3SWQsIGNsaWVudElkKSwgcmVzdWx0TGlzdEZvckNvbXBvbmVudCk7DQotDQotICAgICAgICBpZihyZXN1bHRzRm9yUGFnZS5sZW5ndGggPT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihyZXN1bHRzRm9yQ29tcG9uZW50Lmxlbmd0aCA9PSAwKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoIm5vIGdyb3VwcyBmb3IgZ3JvdXAtdmFsaWRhdGlvbiBhdmFpbGFibGUuIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXliZSB5b3UgcmVzdHJpY3RlZCBhbGwgZ3JvdXBzIG9yIHlvdSBhcmVuJ3QgdXNpbmcgZ3JvdXBzLiIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVhbiB2YWxpZGF0aW9uIHdpbGwgdXNlIHRoZSBkZWZhdWx0IGdyb3VwIGZvciB2YWxpZGF0aW9uIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNGb3JDb21wb25lbnQ7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKHJlc3VsdHNGb3JDb21wb25lbnQubGVuZ3RoID09IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNGb3JQYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG1lcmdlUmVzdWx0cyhyZXN1bHRzRm9yUGFnZSwgcmVzdWx0c0ZvckNvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEdyb3VwVG9Hcm91cFN0b3JhZ2UoQ2xhc3MgZ3JvdXBDbGFzcywgU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PENsYXNzPj4gZ3JvdXBTdG9yYWdlKQ0KLSAgICB7DQotICAgICAgICBMaXN0PENsYXNzPiBncm91cExpc3QgPSBncm91cFN0b3JhZ2UuZ2V0KEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBjbGllbnRJZCkpOw0KLQ0KLSAgICAgICAgaWYoZ3JvdXBMaXN0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZ3JvdXBMaXN0ID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgICAgICAgICBncm91cFN0b3JhZ2UucHV0KEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBjbGllbnRJZCksIGdyb3VwTGlzdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZighZ3JvdXBMaXN0LmNvbnRhaW5zKGdyb3VwQ2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGdyb3VwTGlzdC5hZGQoZ3JvdXBDbGFzcyk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PENsYXNzPiBidWlsZEdyb3VwTGlzdChTdHJpbmcga2V5LCBNYXA8U3RyaW5nLCBMaXN0PENsYXNzPj4gZ3JvdXBTdG9yYWdlKQ0KLSAgICB7DQotICAgICAgICBMaXN0PENsYXNzPiBsaXN0ID0gZ3JvdXBTdG9yYWdlLmdldChrZXkpOw0KLSAgICAgICAgcmV0dXJuIChsaXN0ICE9IG51bGwpID8gbGlzdCA6IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBDbGFzc1tdIGZpbHRlckdyb3VwTGlzdChTdHJpbmcga2V5LCBMaXN0PENsYXNzPiBhZGRlZEdyb3VwcykNCi0gICAgew0KLSAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3VwcyA9IGJ1aWxkR3JvdXBMaXN0KGtleSwgdGhpcy5yZXN0cmljdGVkR3JvdXBzKTsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLQ0KLSAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRHcm91cCA6IGFkZGVkR3JvdXBzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCFyZXN0cmljdGVkR3JvdXBzLmNvbnRhaW5zKGN1cnJlbnRHcm91cCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChjdXJyZW50R3JvdXApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzLnRvQXJyYXkobmV3IENsYXNzW3Jlc3VsdHMuc2l6ZSgpXSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBDbGFzc1tdIG1lcmdlUmVzdWx0cyhDbGFzc1tdIHJlc3VsdHNGb3JQYWdlLCBDbGFzc1tdIHJlc3VsdHNGb3JDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIENsYXNzW10gbWVyZ2VkUmVzdWx0ID0gbmV3IENsYXNzW3Jlc3VsdHNGb3JQYWdlLmxlbmd0aCArIHJlc3VsdHNGb3JDb21wb25lbnQubGVuZ3RoXTsNCi0NCi0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkocmVzdWx0c0ZvclBhZ2UsIDAsIG1lcmdlZFJlc3VsdCwgMCwgcmVzdWx0c0ZvclBhZ2UubGVuZ3RoKTsNCi0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkocmVzdWx0c0ZvckNvbXBvbmVudCwgMCwgbWVyZ2VkUmVzdWx0LCByZXN1bHRzRm9yUGFnZS5sZW5ndGgsIHJlc3VsdHNGb3JDb21wb25lbnQubGVuZ3RoKTsNCi0NCi0gICAgICAgIHJldHVybiBtZXJnZWRSZXN1bHQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0R3JvdXBTdG9yYWdlTWFuYWdlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0R3JvdXBTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTZiNWJjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEdyb3VwU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIGdyb3Vwcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotY2xhc3MgRGVmYXVsdEdyb3VwU3RvcmFnZU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8R3JvdXBTdG9yYWdlPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBTdG9yYWdlTWFuYWdlci5jbGFzcy5nZXROYW1lKCkgKyAiX0ZPUl9HUk9VUFM6S0VZIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmQ3YjU4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1ldGFEYXRhU3RvcmFnZSBpbXBsZW1lbnRzIE1ldGFEYXRhU3RvcmFnZQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBQcm9wZXJ0eUluZm9ybWF0aW9uPj4gY2FjaGVkUHJvcGVydHlJbmZvcm1hdGlvbiA9DQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBQcm9wZXJ0eUluZm9ybWF0aW9uPj4oKTsNCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gbWV0YURhdGFTdG9yYWdlRmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFTdG9yYWdlRmlsdGVyPigpOw0KLSAgICBwcml2YXRlIExpc3Q8Q2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4+IGRlbmllZE1ldGFEYXRhRmlsdGVycyA9DQotICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPj4oKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRNZXRhRGF0YVN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICBpbml0RmlsdGVycygpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0RmlsdGVycygpDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YVN0b3JhZ2VGaWx0ZXJDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBtZXRhRGF0YVN0b3JhZ2VGaWx0ZXJDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FVEFfREFUQV9TVE9SQUdFX0ZJTFRFUik7DQotICAgICAgICBtZXRhRGF0YVN0b3JhZ2VGaWx0ZXJDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldCgNCi0gICAgICAgICAgICAgICAgICAgIEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9TVE9SQUdFX0ZJTFRFUikpOw0KLQ0KLSAgICAgICAgTWV0YURhdGFTdG9yYWdlRmlsdGVyIG1ldGFEYXRhU3RvcmFnZUZpbHRlcjsNCi0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUgOiBtZXRhRGF0YVN0b3JhZ2VGaWx0ZXJDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGFEYXRhU3RvcmFnZUZpbHRlciA9DQotICAgICAgICAgICAgICAgIChNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubWV0YURhdGFTdG9yYWdlRmlsdGVycy5hZGQobWV0YURhdGFTdG9yYWdlRmlsdGVyKTsNCi0NCi0gICAgICAgICAgICAgICAgbG9nQWRkZWRGaWx0ZXIobWV0YURhdGFTdG9yYWdlRmlsdGVyLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzdG9yZU1ldGFEYXRhT2YoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpbnZva2VGaWx0ZXJzKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uVG9TdG9yZSA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOw0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IHByb3BlcnR5SW5mb3JtYXRpb24NCi0gICAgICAgICAgICAgICAgLmdldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBjb3B5TWV0YURhdGEocHJvcGVydHlJbmZvcm1hdGlvbiwgcHJvcGVydHlJbmZvcm1hdGlvblRvU3RvcmUpOw0KLQ0KLSAgICAgICAgZ2V0TWFwRm9yQ2xhc3MoUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCkpKQ0KLSAgICAgICAgICAgICAgICAucHV0KHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uVG9TdG9yZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGludm9rZUZpbHRlcnMoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBmb3IoTWV0YURhdGFTdG9yYWdlRmlsdGVyIGZpbHRlciA6IHRoaXMubWV0YURhdGFTdG9yYWdlRmlsdGVycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmaWx0ZXIuZmlsdGVyKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXRhRGF0YUVudHJ5W10gZ2V0TWV0YURhdGEoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gZ2V0TWFwRm9yQ2xhc3ModGFyZ2V0Q2xhc3MpLmdldCh0YXJnZXRQcm9wZXJ0eSk7DQotDQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIGNsb25lZFByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsNCi0gICAgICAgIGNvcHlNZXRhRGF0YShwcm9wZXJ0eUluZm9ybWF0aW9uLCBjbG9uZWRQcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIHJldHVybiBjbG9uZWRQcm9wZXJ0eUluZm9ybWF0aW9uLmdldE1ldGFEYXRhRW50cmllcygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zTWV0YURhdGFGb3IoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5jb250YWluc0tleSh0YXJnZXRQcm9wZXJ0eSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGaWx0ZXIoTWV0YURhdGFTdG9yYWdlRmlsdGVyIHN0b3JhZ2VGaWx0ZXIpDQotICAgIHsNCi0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighaXNGaWx0ZXJEZW5pZWQoc3RvcmFnZUZpbHRlcikgJiYgIWlzRmlsdGVyQWxyZWFkeVJlZ2lzdGVyZWQoc3RvcmFnZUZpbHRlcikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLm1ldGFEYXRhU3RvcmFnZUZpbHRlcnMuYWRkKHN0b3JhZ2VGaWx0ZXIpOw0KLSAgICAgICAgICAgICAgICBsb2dBZGRlZEZpbHRlcihzdG9yYWdlRmlsdGVyLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNGaWx0ZXJEZW5pZWQoTWV0YURhdGFTdG9yYWdlRmlsdGVyIHN0b3JhZ2VGaWx0ZXIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmRlbmllZE1ldGFEYXRhRmlsdGVycy5jb250YWlucyhnZXRTdG9yYWdlRmlsdGVyQ2xhc3Moc3RvcmFnZUZpbHRlcikpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0ZpbHRlckFscmVhZHlSZWdpc3RlcmVkKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBzdG9yYWdlRmlsdGVyKQ0KLSAgICB7DQotICAgICAgICBmb3IoTWV0YURhdGFTdG9yYWdlRmlsdGVyIGZpbHRlciA6IHRoaXMubWV0YURhdGFTdG9yYWdlRmlsdGVycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihmaWx0ZXIuZ2V0Q2xhc3MoKS5lcXVhbHMoZ2V0U3RvcmFnZUZpbHRlckNsYXNzKHN0b3JhZ2VGaWx0ZXIpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBkZXJlZ2lzdGVyRmlsdGVyKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgc3RvcmFnZUZpbHRlciA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKGZpbHRlckNsYXNzKTsNCi0NCi0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLm1ldGFEYXRhU3RvcmFnZUZpbHRlcnMucmVtb3ZlKHN0b3JhZ2VGaWx0ZXIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbG9nUmVtb3ZlZEZpbHRlcihzdG9yYWdlRmlsdGVyLmdldENsYXNzKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGRlbnlGaWx0ZXIoQ2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gZmlsdGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IoQ2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gZmlsdGVySWQgOiB0aGlzLmRlbmllZE1ldGFEYXRhRmlsdGVycykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGZpbHRlcklkLmVxdWFscyhmaWx0ZXJDbGFzcykpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB0aGlzLmRlbmllZE1ldGFEYXRhRmlsdGVycy5hZGQoZmlsdGVyQ2xhc3MpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZGVyZWdpc3RlckZpbHRlcihmaWx0ZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQ0KLSAgICBwcml2YXRlIHZvaWQgY29weU1ldGFEYXRhKFByb3BlcnR5SW5mb3JtYXRpb24gc291cmNlLCBQcm9wZXJ0eUluZm9ybWF0aW9uIHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgTWV0YURhdGFFbnRyeSBuZXdNZXRhRGF0YUVudHJ5Ow0KLSAgICAgICAgZm9yKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSA6IHNvdXJjZS5nZXRNZXRhRGF0YUVudHJpZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBuZXdNZXRhRGF0YUVudHJ5ID0gbmV3IE1ldGFEYXRhRW50cnkoKTsNCi0gICAgICAgICAgICBuZXdNZXRhRGF0YUVudHJ5LnNldEtleShtZXRhRGF0YUVudHJ5LmdldEtleSgpKTsNCi0gICAgICAgICAgICBuZXdNZXRhRGF0YUVudHJ5LnNldFZhbHVlKG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSk7DQotDQotICAgICAgICAgICAgdGFyZ2V0LmFkZE1ldGFEYXRhRW50cnkobmV3TWV0YURhdGFFbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGxvZ0FkZGVkRmlsdGVyKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhmaWx0ZXJDbGFzcy5nZXROYW1lKCkgKyAiIGFkZGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGxvZ1JlbW92ZWRGaWx0ZXIoQ2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gZmlsdGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKGZpbHRlckNsYXNzLmdldE5hbWUoKSArICIgcmVtb3ZlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUHJvcGVydHlJbmZvcm1hdGlvbj4gZ2V0TWFwRm9yQ2xhc3MoQ2xhc3MgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcga2V5ID0gUHJveHlVdGlscy5nZXRDbGFzc05hbWUodGFyZ2V0KTsNCi0gICAgICAgIGlmKCF0aGlzLmNhY2hlZFByb3BlcnR5SW5mb3JtYXRpb24uY29udGFpbnNLZXkoa2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmNhY2hlZFByb3BlcnR5SW5mb3JtYXRpb24ucHV0KGtleSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0eUluZm9ybWF0aW9uPigpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0aGlzLmNhY2hlZFByb3BlcnR5SW5mb3JtYXRpb24uZ2V0KGtleSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPiBnZXRTdG9yYWdlRmlsdGVyQ2xhc3MoTWV0YURhdGFTdG9yYWdlRmlsdGVyIHN0b3JhZ2VGaWx0ZXIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHN0b3JhZ2VGaWx0ZXIuZ2V0Q2xhc3MoKSwgTWV0YURhdGFTdG9yYWdlRmlsdGVyLmNsYXNzKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYzY5YmUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWV0YURhdGFTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgcHJvcGVydHkgaW5mb3JtYXRpb24gZW50cmllcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0TWV0YURhdGFTdG9yYWdlTWFuYWdlciBleHRlbmRzIEFic3RyYWN0QXBwbGljYXRpb25TY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8TWV0YURhdGFTdG9yYWdlPg0KLXsNCi0gICAgRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBTdG9yYWdlTWFuYWdlci5jbGFzcy5nZXROYW1lKCkgKyAiX0ZPUl9NRVRBX0RBVEFfQ0FDSEU6S0VZIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFByb3BlcnR5U3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTBhN2YwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFByb3BlcnR5U3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb3BlcnR5U3RvcmFnZSBpbXBsZW1lbnRzIFByb3BlcnR5U3RvcmFnZQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBGaWVsZD4+IGZpZWxkTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBGaWVsZD4+KCk7DQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWFwPFN0cmluZywgTWV0aG9kPj4gbWV0aG9kTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBNZXRob2Q+PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzdG9yZUZpZWxkKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHksIEZpZWxkIGZpZWxkKQ0KLSAgICB7DQotICAgICAgICBnZXRGaWVsZE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5wdXQocHJvcGVydHksIGZpZWxkKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzdG9yZU1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5LCBNZXRob2QgbWV0aG9kKQ0KLSAgICB7DQotICAgICAgICBnZXRNZXRob2RNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykucHV0KHByb3BlcnR5LCAgbWV0aG9kKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRmllbGQgZ2V0RmllbGQoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEZpZWxkTWFwRm9yQ2xhc3ModGFyZ2V0Q2xhc3MpLmdldChwcm9wZXJ0eSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1ldGhvZCBnZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldE1ldGhvZE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5nZXQocHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zRmllbGQoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEZpZWxkTWFwRm9yQ2xhc3ModGFyZ2V0Q2xhc3MpLmNvbnRhaW5zS2V5KHByb3BlcnR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc01ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0TWV0aG9kTWFwRm9yQ2xhc3ModGFyZ2V0Q2xhc3MpLmNvbnRhaW5zS2V5KHByb3BlcnR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEZpZWxkPiBnZXRGaWVsZE1hcEZvckNsYXNzKENsYXNzIHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGtleSA9IFByb3h5VXRpbHMuZ2V0Q2xhc3NOYW1lKHRhcmdldCk7DQotICAgICAgICBpZiAoIXRoaXMuZmllbGRNYXAuY29udGFpbnNLZXkoa2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmZpZWxkTWFwLnB1dChrZXksIG5ldyBIYXNoTWFwPFN0cmluZywgRmllbGQ+KCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRoaXMuZmllbGRNYXAuZ2V0KGtleSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNZXRob2Q+IGdldE1ldGhvZE1hcEZvckNsYXNzKENsYXNzIHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGtleSA9IFByb3h5VXRpbHMuZ2V0Q2xhc3NOYW1lKHRhcmdldCk7DQotICAgICAgICBpZiAoIXRoaXMubWV0aG9kTWFwLmNvbnRhaW5zS2V5KGtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5tZXRob2RNYXAucHV0KGtleSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXRob2Q+KCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRoaXMubWV0aG9kTWFwLmdldChrZXkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFByb3BlcnR5U3RvcmFnZU1hbmFnZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFByb3BlcnR5U3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzMDEwYS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlci5EZWZhdWx0UHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlcjsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgcHJvcGVydHkgaW5mb3JtYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxQcm9wZXJ0eVN0b3JhZ2U+DQotew0KLSAgICBEZWZhdWx0UHJvcGVydHlTdG9yYWdlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBEZWZhdWx0UHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX1BST1BFUlRZOktFWSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTc5YzYyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlIGltcGxlbWVudHMgUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5nZXQoa2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoVCl0aGlzLnByb3BlcnRpZXMuZ2V0KGtleSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHkoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnJlbW92ZShrZXkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjFiMTBhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlci5EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXI7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIHJlbmRlcmVyIGludGVyY2VwdG9yIHByb3BlcnRpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTWFuYWdlcg0KLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZT4NCi17DQotICAgIERlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBEZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBTdG9yYWdlTWFuYWdlci5jbGFzcy5nZXROYW1lKCkgKyAiX0ZPUl9SRU5ERVJFUl9JTlRFUkNFUFRPUl9QUk9QRVJUWTpLRVkiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDI3ZWY4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGdyb3Vwcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZSBpbXBsZW1lbnRzIFJlbmRlcmVyUHJveHlTdG9yYWdlDQotew0KLSAgICBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5Pj4gcHJveHlTdG9yYWdlID0NCi0gICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeT4+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVudHJ5KFN0cmluZyByZW5kZXJlcktleSwgU3RyaW5nIGNsaWVudElkLCBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICBnZXRSZW5kZXJlclN0b3JhZ2UocmVuZGVyZXJLZXkpLnB1dChjbGllbnRJZCwgZW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zRW50cnkoU3RyaW5nIHJlbmRlcmVyS2V5LCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRSZW5kZXJlclN0b3JhZ2UocmVuZGVyZXJLZXkpLmNvbnRhaW5zS2V5KGNsaWVudElkKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBnZXRFbnRyeShTdHJpbmcgcmVuZGVyZXJLZXksIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFJlbmRlcmVyU3RvcmFnZShyZW5kZXJlcktleSkuZ2V0KGNsaWVudElkKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnk+IGdldFJlbmRlcmVyU3RvcmFnZShTdHJpbmcgcmVuZGVyZXJLZXkpDQotICAgIHsNCi0gICAgICAgIGlmKCFwcm94eVN0b3JhZ2UuY29udGFpbnNLZXkocmVuZGVyZXJLZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3h5U3RvcmFnZS5wdXQocmVuZGVyZXJLZXksIG5ldyBIYXNoTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeT4oKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcHJveHlTdG9yYWdlLmdldChyZW5kZXJlcktleSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q4MTE5Ni4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlci5EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIHJlbmRlcmVyIHByb3h5IGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTWFuYWdlcg0KLSAgICBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxSZW5kZXJlclByb3h5U3RvcmFnZT4NCi17DQotICAgIERlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgLy9mb3IgYmV0dGVyIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkNCi0gICAgICAgIHJldHVybiBFeHRWYWxSZW5kZXJlclByb3h5LmNsYXNzLmdldE5hbWUoKSArICI6U1RPUkFHRSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0U3RvcmFnZU1hbmFnZXJGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1NjZkZS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHN0b3JhZ2UtbWFuYWdlciBjcmVhdGlvbiBhbmQgY2FjaGluZw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8Q2xhc3M+DQotICAgICAgICBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8Q2xhc3MsIFN0b3JhZ2VNYW5hZ2VyPiwgU3RvcmFnZU1hbmFnZXJIb2xkZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBsYXp5U3RhdGljTWFwcGluZ0FwcGxpZWQgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8Q2xhc3M+PiBuYW1lTWFwcGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxDbGFzcz4+KCk7DQotICAgIHByaXZhdGUgTWFwPENsYXNzLCBTdG9yYWdlTWFuYWdlcj4gc3RvcmFnZVR5cGVUb1N0b3JhZ2VNYW5hZ2VyTWFwID0gbmV3IEhhc2hNYXA8Q2xhc3MsIFN0b3JhZ2VNYW5hZ2VyPigpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotDQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihSZW5kZXJlclByb3h5U3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoR3JvdXBTdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdEdyb3VwU3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoTWV0YURhdGFTdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTWFuYWdlcigpLCBmYWxzZSk7DQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihQcm9wZXJ0eVN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0UHJvcGVydHlTdG9yYWdlTWFuYWdlcigpLCBmYWxzZSk7DQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTWFuYWdlcigpLCBmYWxzZSk7DQotDQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdG9yYWdlTWFuYWdlciBjcmVhdGUoQ2xhc3Mgc3RvcmFnZVR5cGUpDQotICAgIHsNCi0gICAgICAgIGlmICghdGhpcy5sYXp5U3RhdGljTWFwcGluZ0FwcGxpZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdG9yYWdlTWFuYWdlciBzdG9yYWdlTWFuYWdlcjsNCi0gICAgICAgIFN0cmluZyBzdG9yYWdlTWFuYWdlck5hbWU7DQotICAgICAgICAvL251bGwgLT4gdXNlIG5hbWUgbWFwcGVycw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPENsYXNzPiBuYW1lTWFwcGVyIDogdGhpcy5uYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlTWFuYWdlck5hbWUgPSBuYW1lTWFwcGVyLmNyZWF0ZU5hbWUoc3RvcmFnZVR5cGUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChzdG9yYWdlTWFuYWdlck5hbWUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBzdG9yYWdlTWFuYWdlciA9IChTdG9yYWdlTWFuYWdlcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoc3RvcmFnZU1hbmFnZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoc3RvcmFnZU1hbmFnZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFkZE1hcHBpbmcoc3RvcmFnZVR5cGUsIHN0b3JhZ2VNYW5hZ2VyKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2VNYW5hZ2VyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBnZXRTdG9yYWdlTWFuYWdlcihzdG9yYWdlVHlwZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNYXBwaW5nKENsYXNzIHN0b3JhZ2VUeXBlLCBTdG9yYWdlTWFuYWdlciBzdG9yYWdlTWFuYWdlcikNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiBpc1ZhbGlkRW50cnkgPSB0cnVlOw0KLSAgICAgICAgaWYoc3RvcmFnZVR5cGUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpc1ZhbGlkRW50cnkgPSBmYWxzZTsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoInlvdSB0cmllZCB0byBhZGQgYW4gaW52YWxpZCBzdG9yYWdlIHR5cGUiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZihzdG9yYWdlTWFuYWdlciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlzVmFsaWRFbnRyeSA9IGZhbHNlOw0KLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRXJyb3JFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigieW91IHRyaWVkIHRvIGFkZCBhbiBpbnZhbGlkIHN0b3JhZ2UgbWFuYWdlciIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKCFpc1ZhbGlkRW50cnkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoc3RvcmFnZVR5cGUsIHN0b3JhZ2VNYW5hZ2VyLCB0cnVlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5sYXp5U3RhdGljTWFwcGluZ0FwcGxpZWQgPSB0cnVlOw0KLQ0KLSAgICAgICAgLy9zZXR1cCBpbnRlcm5hbCBzdGF0aWMgbWFwcGluZ3MNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnIDoNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuU1RPUkFHRV9UWVBFX1RPX1NUT1JBR0VfTUFOQUdFUl9DT05GSUcpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHNldHVwTWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwTWFwcGluZ3MoTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcoQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUobWFwcGluZy5nZXRTb3VyY2UoKSksDQotICAgICAgICAgICAgICAgICAgICAoU3RvcmFnZU1hbmFnZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKG1hcHBpbmcuZ2V0VGFyZ2V0KCkpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTGlzdDxOYW1lTWFwcGVyPENsYXNzPj4gZ2V0TmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5uYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdG9yYWdlTWFuYWdlcihDbGFzcyBzdG9yYWdlVHlwZSwgU3RvcmFnZU1hbmFnZXIgc3RvcmFnZU1hbmFnZXIsIGJvb2xlYW4gb3ZlcnJpZGUpDQotICAgIHsNCi0gICAgICAgIGlmKCF0aGlzLnN0b3JhZ2VUeXBlVG9TdG9yYWdlTWFuYWdlck1hcC5jb250YWluc0tleShzdG9yYWdlVHlwZSkgfHwNCi0gICAgICAgICAgICAgICAgKHRoaXMuc3RvcmFnZVR5cGVUb1N0b3JhZ2VNYW5hZ2VyTWFwLmNvbnRhaW5zS2V5KHN0b3JhZ2VUeXBlKSAmJiBvdmVycmlkZSkpDQotICAgICAgICB7DQotDQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFkZGluZyB0eXBlIHRvIHN0b3JhZ2UtbWFuYWdlciBtYXBwaW5nOiAiDQotICAgICAgICAgICAgICAgICAgICArIHN0b3JhZ2VUeXBlLmdldE5hbWUoKSArICIgLT4gIiArIHN0b3JhZ2VNYW5hZ2VyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdGhpcy5zdG9yYWdlVHlwZVRvU3RvcmFnZU1hbmFnZXJNYXAucHV0KHN0b3JhZ2VUeXBlLCBzdG9yYWdlTWFuYWdlcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0b3JhZ2VNYW5hZ2VyIGdldFN0b3JhZ2VNYW5hZ2VyKENsYXNzIHR5cGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2VUeXBlVG9TdG9yYWdlTWFuYWdlck1hcC5nZXQodHlwZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwN2JjM2QuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlIGltcGxlbWVudHMgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgdmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy52aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyID0gdmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBnZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMudmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU1hbmFnZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDA4YjUzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBhIGN1c3RvbSBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU1hbmFnZXIgZXh0ZW5kcw0KLSAgICAgICAgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlPg0KLXsNCi0gICAgRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBEZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfVklPTEFUSU9OU0VWRVJJVFlfSU5URVJQUkVURVI6S0VZIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MDE4MzQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9GYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLQ0KLS8qKg0KLSAqIHN0b3JhZ2UgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgZmFjZXMgcmVxdWVzdA0KLSAqIGZvciBub3cgaXQganVzdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBwaGFzZSBvZiB0aGUgbGlmZWN5Y2xlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UNCi17DQotICAgIHZvaWQgc2V0Q3VycmVudFBoYXNlSWQoUGhhc2VJZCBwaGFzZUlkKTsNCi0NCi0gICAgUGhhc2VJZCBnZXRDdXJyZW50UGhhc2VJZCgpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRmFjZXNNZXNzYWdlU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTUwZjRmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRmFjZXNNZXNzYWdlU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuRmFjZXNNZXNzYWdlSG9sZGVyOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBGYWNlc01lc3NhZ2VTdG9yYWdlDQotew0KLSAgICB2b2lkIGFkZEZhY2VzTWVzc2FnZShTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpOw0KLQ0KLSAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZ2V0RmFjZXNNZXNzYWdlcygpOw0KLQ0KLSAgICB2b2lkIGFkZEFsbCgpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0dyb3VwU3RvcmFnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Hcm91cFN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJjMDE0Yi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0dyb3VwU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHN1Z2dlc3RlZCBpbnRlcmZhY2UgZm9yIGEgZ3JvdXAgc3RvcmFnZQ0KLSAqIHVzZWQgYnkgdGhlIGJ2aSBtb2R1bGUgYW5kIGFkZC1vbnMNCi0gKiA8cC8+DQotICogaXQgYWxsb3dzIHRvIG1hbmFnZSBncm91cHMgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIEdyb3VwU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBhZGRHcm91cChDbGFzcyBncm91cENsYXNzLCBTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQpOw0KLQ0KLSAgICB2b2lkIHJlc3RyaWN0R3JvdXAoQ2xhc3MgZ3JvdXBDbGFzcywgU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKTsNCi0NCi0gICAgQ2xhc3NbXSBnZXRHcm91cHMoU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NZXRhRGF0YVN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWV0YURhdGFTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZWNlYmQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NZXRhRGF0YVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBzdG9yZU1ldGFEYXRhT2YoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgTWV0YURhdGFFbnRyeVtdIGdldE1ldGFEYXRhKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpOw0KLQ0KLSAgICBib29sZWFuIGNvbnRhaW5zTWV0YURhdGFGb3IoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSk7DQotDQotICAgIHZvaWQgcmVnaXN0ZXJGaWx0ZXIoTWV0YURhdGFTdG9yYWdlRmlsdGVyIHN0b3JhZ2VGaWx0ZXIpOw0KLQ0KLSAgICB2b2lkIGRlcmVnaXN0ZXJGaWx0ZXIoQ2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gZmlsdGVyQ2xhc3MpOw0KLQ0KLSAgICB2b2lkIGRlbnlGaWx0ZXIoQ2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gZmlsdGVyQ2xhc3MpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01ldGFEYXRhU3RvcmFnZUZpbHRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIyZmRiNi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01ldGFEYXRhU3RvcmFnZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFTdG9yYWdlRmlsdGVyDQotew0KLSAgICB2b2lkIGZpbHRlcihQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1Byb3BlcnR5U3RvcmFnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Qcm9wZXJ0eVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTliZWQyNi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1Byb3BlcnR5U3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eVN0b3JhZ2UNCi17DQotICAgIHZvaWQgc3RvcmVGaWVsZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5LCBGaWVsZCBmaWVsZCk7DQotDQotICAgIHZvaWQgc3RvcmVNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSwgTWV0aG9kIG1ldGhvZCk7DQotDQotICAgIEZpZWxkIGdldEZpZWxkKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpOw0KLQ0KLSAgICBNZXRob2QgZ2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpOw0KLQ0KLSAgICBib29sZWFuIGNvbnRhaW5zRmllbGQoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSk7DQotDQotICAgIGJvb2xlYW4gY29udGFpbnNNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYzhjMWQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogYSBzdG9yYWdlIHdoaWNoIGlzbid0IHVzZWQgaW50ZXJuYWxseS4gaXQncyBmb3IgYWRkLW9ucyB0byBlYXNpbHkgc3RvcmUgcHJvcGVydGllcyBvZiBpbnRlcmNlcHRvcnMuDQotICogd2l0aG91dCBicmFraW5nIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGl0J3MgcG9zc2libGUgdG8gdXNlIHRoZXNlIHByb3BlcnRpZXMgaW4gY3VzdG9tIGFydGlmYWN0cy4NCi0gKiByZW5kZXJpbmcgaW50ZXJjZXB0aW9uIGlzIGFuIGludGVybmFsIGNvbmNlcHQuIHNvIHByb3BlcnRpZXMsLi4uIG9mIGl0IHdvbid0IGdldCBpbnRvIHRoZSBhcGkuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpOw0KLQ0KLSAgICBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSk7DQotDQotICAgIDxUPiBUIGdldFByb3BlcnR5KFN0cmluZyBrZXksIENsYXNzPFQ+IHRhcmdldENsYXNzKTsNCi0NCi0gICAgdm9pZCByZW1vdmVQcm9wZXJ0eShTdHJpbmcga2V5KTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzFhNzViLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJQcm94eVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBSZW5kZXJlclByb3h5U3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBzZXRFbnRyeShTdHJpbmcgcmVuZGVyZXJLZXksIFN0cmluZyBjbGllbnRJZCwgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBlbnRyeSk7DQotDQotICAgIGJvb2xlYW4gY29udGFpbnNFbnRyeShTdHJpbmcgcmVuZGVyZXJLZXksIFN0cmluZyBjbGllbnRJZCk7DQotDQotICAgIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZ2V0RW50cnkoU3RyaW5nIHJlbmRlcmVyS2V5LCBTdHJpbmcgY2xpZW50SWQpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTM0Nzc4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeQotewotICAgIHByaXZhdGUgYm9vbGVhbiBkZWNvZGVDYWxsZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlQmVnaW5DYWxsZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlRW5kQ2FsbGVkID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIE9iamVjdCBjb252ZXJ0ZWRWYWx1ZSA9IG51bGw7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlY29kZUNhbGxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVjb2RlQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlY29kZUNhbGxlZChib29sZWFuIGRlY29kZUNhbGxlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVjb2RlQ2FsbGVkID0gZGVjb2RlQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlQmVnaW5DYWxsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVuY29kZUJlZ2luQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kZUJlZ2luQ2FsbGVkKGJvb2xlYW4gZW5jb2RlQmVnaW5DYWxsZWQpCi0gICAgewotICAgICAgICB0aGlzLmVuY29kZUJlZ2luQ2FsbGVkID0gZW5jb2RlQmVnaW5DYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmNvZGVDaGlsZHJlbkNhbGxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlQ2hpbGRyZW5DYWxsZWQoYm9vbGVhbiBlbmNvZGVDaGlsZHJlbkNhbGxlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZW5jb2RlQ2hpbGRyZW5DYWxsZWQgPSBlbmNvZGVDaGlsZHJlbkNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuY29kZUVuZENhbGxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZW5jb2RlRW5kQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kZUVuZENhbGxlZChib29sZWFuIGVuY29kZUVuZENhbGxlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZW5jb2RlRW5kQ2FsbGVkID0gZW5jb2RlRW5kQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlZFZhbHVlKE9iamVjdCBjb252ZXJ0ZWRWYWx1ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29udmVydGVkVmFsdWUgPSBjb252ZXJ0ZWRWYWx1ZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGM4Mzk3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuQVBJOw0KLQ0KLS8qKg0KLSAqIG1hbmFnZXIgdG8gY3JlYXRlIGFuZCByZXNldCBzcGVjaWZpYyBzdG9yYWdlIGltcGxlbWVudGF0aW9ucw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgU3RvcmFnZU1hbmFnZXI8VD4NCi17DQotICAgIFQgY3JlYXRlKFN0cmluZyBrZXkpOw0KLSAgICB2b2lkIHJlc2V0KFN0cmluZyBrZXkpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VySG9sZGVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VySG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZjk1MzguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9TdG9yYWdlTWFuYWdlckhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5BUEk7DQotDQotLyoqDQotICogaW50ZXJmYWNlIHRvIG1hbmFnZSBzdG9yYWdlLW1hbmFnZXIgaW5zdGFuY2VzDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgU3RvcmFnZU1hbmFnZXJIb2xkZXINCi17DQotICAgIHZvaWQgc2V0U3RvcmFnZU1hbmFnZXIoQ2xhc3MgdHlwZSwgU3RvcmFnZU1hbmFnZXIgc3RvcmFnZU1hbmFnZXIsIGJvb2xlYW4gb3ZlcnJpZGUpOw0KLSAgICBTdG9yYWdlTWFuYWdlciBnZXRTdG9yYWdlTWFuYWdlcihDbGFzcyB0eXBlKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WYWxpZGF0aW9uUmVzdWx0LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1ZhbGlkYXRpb25SZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc5MzI3Yy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1ZhbGlkYXRpb25SZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkZhY2VzTWVzc2FnZUhvbGRlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gInJlZmFjdG9yIGl0IikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIFZhbGlkYXRpb25SZXN1bHQNCi17DQotICAgIHByaXZhdGUgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkRmFjZXNNZXNzYWdlSG9sZGVyKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmFjZXNNZXNzYWdlSG9sZGVyTGlzdC5hZGQoZmFjZXNNZXNzYWdlSG9sZGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1Zpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1Zpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNjY5ZWMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOw0KLQ0KLS8qKg0KLSAqIHN1Z2dlc3RlZCBpbnRlcmZhY2UgZm9yIGEgdmlvbGF0aW9uLXNldmVyaXR5LWludGVycHJldGVyIHN0b3JhZ2UNCi0gKiB1c2VkIGJ5IGFkZC1vbnMgdG8gY2hhbmdlIHRoZSBpbnRlcnByZXRlciBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdA0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UNCi17DQotICAgIHZvaWQgc2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcihWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIpOw0KLQ0KLSAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTEwMjk2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5GYWNlc0luZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZTk3ZjIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRmFjZXNNZXNzYWdlU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEZhY2VzTWVzc2FnZVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YmZlOTcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NZXRhRGF0YVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdE1ldGFEYXRhU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWV0YURhdGFTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoTWV0YURhdGFTdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0TWV0YURhdGFTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Zjg2MjMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0UHJvcGVydHlTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlByb3BlcnR5U3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoUHJvcGVydHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0UHJvcGVydHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk2ODQxZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5SZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiB1c2UgYSBwdWJsaWMgY2xhc3MgdG8gYWxsb3cgb3B0aW9uYWwgZGVyZWdpc3RyYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZTlkZTkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5SZW5kZXJlclByb3h5U3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChSZW5kZXJlclByb3h5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTQ5NmQ3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL0VtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWZiZjY1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBFbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I3NTBlYi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL051bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBOdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjRjYWE0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcg0KLXsNCi0gICAgYm9vbGVhbiBza2lwVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YUVudHJ5IGVudHJ5KTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9leGNlcHRpb24vUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24uamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vZXhjZXB0aW9uL1JlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYjJiYjAuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9leGNlcHRpb24vUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uZXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiB0byBoYW5kbGUgc3BlY2lhbCBjYXNlcyBpbiBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24gZXh0ZW5kcyBWYWxpZGF0b3JFeGNlcHRpb24NCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NjQ2MzMxNzM2NDI4NDk1ODg0TDsNCi0NCi0gICAgcHVibGljIFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKGZhY2VzTWVzc2FnZSwgdGhyb3dhYmxlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjI1MTBjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjZXNNZXNzYWdlRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5IGltcGxlbWVudHMgRmFjZXNNZXNzYWdlRmFjdG9yeQ0KLXsNCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBjb252ZXJ0KEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIGlmKGlzTGFiZWxlZEZhY2VzTWVzc2FnZShmYWNlc01lc3NhZ2UpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2U7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY3JlYXRlKGZhY2VzTWVzc2FnZS5nZXRTZXZlcml0eSgpLCBmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLCBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2UgY3JlYXRlKEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVmlvbGF0aW9uTWVzc2FnZShzZXZlcml0eSwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xhYmVsZWRGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgLy9kb24ndCB1c2UgdGhlIGludGVyZmFjZSBoZXJlDQotICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlIGluc3RhbmNlb2YgVmlvbGF0aW9uTWVzc2FnZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRmFjZXNNZXNzYWdlSG9sZGVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRmFjZXNNZXNzYWdlSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMWMzNjcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0ZhY2VzTWVzc2FnZUhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBGYWNlc01lc3NhZ2VIb2xkZXINCi17DQotICAgIHByaXZhdGUgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50SWQ7DQotDQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2VIb2xkZXIoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5mYWNlc01lc3NhZ2UgPSBmYWNlc01lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZUhvbGRlcihGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmFjZXNNZXNzYWdlID0gZmFjZXNNZXNzYWdlOw0KLSAgICAgICAgc2V0Q2xpZW50SWQoY2xpZW50SWQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2UgZ2V0RmFjZXNNZXNzYWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudElkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNsaWVudElkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudElkKFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgaWYoISIqIi5lcXVhbHMoY2xpZW50SWQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvTGFiZWxlZE1lc3NhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9MYWJlbGVkTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGY3YWU3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9MYWJlbGVkTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZG9uJ3QgcmVtb3ZlICpUZXh0IC0gaXQgd291bGQgbGVhZCB0byBhbiBvdmVybGFwIHdpdGggdHJpbmlkYWQNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIExhYmVsZWRNZXNzYWdlDQotew0KLSAgICBTdHJpbmcgZ2V0TGFiZWxUZXh0KCk7DQotICAgIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyBsYWJlbCk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9WaW9sYXRpb25NZXNzYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvVmlvbGF0aW9uTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTQ0Yzc2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9WaW9sYXRpb25NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIFZpb2xhdGlvbk1lc3NhZ2UgZXh0ZW5kcyBGYWNlc01lc3NhZ2UgaW1wbGVtZW50cyBMYWJlbGVkTWVzc2FnZQ0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjkwMzk1ODk0Mjk4NzcxMTIzMUw7DQotICAgIHByaXZhdGUgU3RyaW5nIGxhYmVsOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gc3VtbWFyeUxhYmVsUmVwbGFjZWQgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGRldGFpbExhYmVsUmVwbGFjZWQgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIFZpb2xhdGlvbk1lc3NhZ2UoU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHRoaXMoU0VWRVJJVFlfRVJST1IsIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZpb2xhdGlvbk1lc3NhZ2UoU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICBzZXRTZXZlcml0eShzZXZlcml0eSk7DQotICAgICAgICBzZXRTdW1tYXJ5KHN1bW1hcnkpOw0KLSAgICAgICAgc2V0RGV0YWlsKGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN1bW1hcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsYWJlbCAhPSBudWxsICYmICF0aGlzLnN1bW1hcnlMYWJlbFJlcGxhY2VkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHNldFN1bW1hcnkoZ2V0TGFiZWxlZE1lc3NzYWdlKHN1cGVyLmdldFN1bW1hcnkoKSwgZ2V0TGFiZWxUZXh0KCkpKTsNCi0gICAgICAgICAgICB0aGlzLnN1bW1hcnlMYWJlbFJlcGxhY2VkID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRTdW1tYXJ5KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGV0YWlsKCkNCi0gICAgew0KLSAgICAgICAgaWYobGFiZWwgIT0gbnVsbCAmJiAhdGhpcy5kZXRhaWxMYWJlbFJlcGxhY2VkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHNldERldGFpbChnZXRMYWJlbGVkTWVzc3NhZ2Uoc3VwZXIuZ2V0RGV0YWlsKCksIGdldExhYmVsVGV4dCgpKSk7DQotICAgICAgICAgICAgdGhpcy5kZXRhaWxMYWJlbFJlcGxhY2VkID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzdXBlci5nZXREZXRhaWwoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRMYWJlbGVkTWVzc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5jb250YWlucygieyIgKyBpICsgIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoInsiICsgaSArICJ9IiwgbGFiZWwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBtZXNzYWdlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdW1tYXJ5KFN0cmluZyBzKQ0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRTdW1tYXJ5KHMpOw0KLSAgICAgICAgdGhpcy5zdW1tYXJ5TGFiZWxSZXBsYWNlZCA9IGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXRhaWwoU3RyaW5nIHMpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldERldGFpbChzKTsNCi0gICAgICAgIHRoaXMuZGV0YWlsTGFiZWxSZXBsYWNlZCA9IGZhbHNlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2Mzk2ZDQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotDQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsNCi0NCi0vKioNCi0gKiBNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggdXNlcyBwcm9wZXJ0eSBmaWxlcy4NCi0gKiBTdWJjbGFzc2VzIGp1c3QgaGF2ZSB0byBwcm92aWRlIHRoZSBwYWNrYWdlIHRvIGxvb2sgYXQuDQotICogQW4gaW1wbGVtZW50YXRpb24gY2FuIGFsc28gcHJvdmlkZSBhIGN1c3RvbSBuYW1lIHdoaWNoIGlzIGUuZy4gY29uZmlndXJlZCB2aWEgd2ViLnhtbC4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGltcGxlbWVudHMgTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX1JFU09VUkNFX01BUktFUiA9ICI/Pz8iOw0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfREVGQVVMVF9DT05WRU5USU9OOw0KLSAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBkZWZhdWx0QnVuZGxlID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZUJ1bmRsZUJhc2VOYW1lOw0KLSAgICAvL3dpdGgganNmIDEuMSBvbmx5IGF2YWlsYWJsZSBpZiB0aGVyZSBpcyBhIGN1c3RvbSBiZWFuDQotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VCdW5kbGVWYXJOYW1lOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICBpZiAoa2V5ID09IG51bGwgfHwga2V5LmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihrZXkuY29udGFpbnMoIiAiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihrZXkuZW5kc1dpdGgoIl9kZXRhaWwiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcoMCwga2V5Lmxlbmd0aCgpIC0gNyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBrZXk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgY3VzdG9tTWVzc2FnZSA9IG51bGw7DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gdHJ5VG9GaW5kQ3VzdG9tTWVzc2FnZShrZXksIGxvY2FsZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nDQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY3VzdG9tTWVzc2FnZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIHRyeSB0byB1c2UgdGhlIGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZQ0KLSAgICAgICAgICovDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gdHJ5VG9Vc2VNZXNzYWdlQnVuZGxlQ29udmVudGlvbihrZXksIGxvY2FsZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nDQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY3VzdG9tTWVzc2FnZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIG5vIG1lc3NhZ2UgYnVuZGxlIG9yIG1lc3NhZ2UgZm91bmQgKHdpdGggdGhlIGNvbnZlbnRpb24pPw0KLSAgICAgICAgICovDQotDQotICAgICAgICAvL3RyeSB0byBsb2FkIGN1c3RvbSBtZXNzYWdlcw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHRyeVRvRmluZEN1c3RvbU1lc3NhZ2VJbkN1c3RvbVJlc291cmNlQnVuZGxlKGtleSwgbG9jYWxlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGRldGVybWluZU1lc3NhZ2Uoa2V5LCBsb2NhbGUsIGN1c3RvbU1lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvRmluZEN1c3RvbU1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7DQotICAgICAgICBTdHJpbmcgY3VzdG9tTWVzc2FnZSA9IG51bGw7DQotDQotICAgICAgICAvL29ubHkgaW4gY2FzZSBvZiBhIFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciB3aGljaCBpcyBjb25maWd1cmVkIGFzIGJlYW4NCi0gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lLCBsb2NhbGUpOw0KLSAgICAgICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigibWVzc2FnZSBidW5kbGUgIiArIHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lICsgIiBub3QgZm91bmQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vb25seSBpbiBjYXNlIG9mIGEgVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIHdoaWNoIGlzIGNvbmZpZ3VyZWQgYXMgYmVhbg0KLSAgICAgICAgaWYgKHRoaXMubWVzc2FnZUJ1bmRsZVZhck5hbWUgIT0gbnVsbCAmJiBjdXN0b21NZXNzYWdlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSAoUmVzb3VyY2VCdW5kbGUpIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbihtZXNzYWdlQnVuZGxlVmFyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJtZXNzYWdlIGJ1bmRsZSB2YXIgbmFtZSAiICsgdGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSArICIgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb1VzZU1lc3NhZ2VCdW5kbGVDb252ZW50aW9uKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIGlmICgoZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID09IG51bGwgfHwgIWRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICAgICAgJiYgaXNEZWZhdWx0TWVzc2FnZUJ1bmRsZUNvbnZlbnRpb25BY3RpdmUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZGVmYXVsdEJ1bmRsZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9CVU5ETEVfTkFNRSksIGxvY2FsZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgICAgICAgICAgICAgICAgIGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbiA9ICJ0cnVlIjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoZGVmYXVsdEJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHJ5VG9GaW5kQ3VzdG9tTWVzc2FnZUluQ3VzdG9tUmVzb3VyY2VCdW5kbGUoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSB0cnlUb0xvYWRDdXN0b21SZXNvdXJjZUJ1bmRsZShsb2NhbGUpOw0KLQ0KLSAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm5vIGN1c3RvbSBtZXNzYWdlIGZvciAiICsga2V5ICsgIiB3aXRoaW4gIiArIGdldEN1c3RvbUJhc2VOYW1lKCksIGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSB0cnlUb0xvYWRDdXN0b21SZXNvdXJjZUJ1bmRsZShMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VzdG9tQmFzZU5hbWUgPSBnZXRDdXN0b21CYXNlTmFtZSgpOw0KLQ0KLSAgICAgICAgaWYoY3VzdG9tQmFzZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGN1c3RvbUJhc2VOYW1lLCBsb2NhbGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGV0ZXJtaW5lTWVzc2FnZShTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlLCBTdHJpbmcgY3VzdG9tTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgLy91c2UgY3VzdG9tIG5hbWUgKGlmIHBvc3NpYmxlKSBvdGhlcndpc2U6IGZhbGxiYWNrIHRvIGRlZmF1bHQgbWVzc2FnZSAoaWYgcG9zc2libGUpDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKGN1c3RvbU1lc3NhZ2UgIT0gbnVsbCkgPyBjdXN0b21NZXNzYWdlDQotICAgICAgICAgICAgICAgICAgICA6IChnZXRCYXNlTmFtZSgpICE9IG51bGwpID8gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEJhc2VOYW1lKCksIGxvY2FsZSkuZ2V0U3RyaW5nKGtleSkgOiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBNSVNTSU5HX1JFU09VUkNFX01BUktFUiArIGtleSArIE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGVmYXVsdE1lc3NhZ2VCdW5kbGVDb252ZW50aW9uQWN0aXZlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRCYXNlTmFtZSgpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUJ1bmRsZUJhc2VOYW1lKFN0cmluZyBtZXNzYWdlQnVuZGxlQmFzZU5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lID0gbWVzc2FnZUJ1bmRsZUJhc2VOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VCdW5kbGVWYXJOYW1lKFN0cmluZyBtZXNzYWdlQnVuZGxlVmFyTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSA9IG1lc3NhZ2VCdW5kbGVWYXJOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MTgwMzcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyBhIE1lc3NhZ2VSZXNvbHZlciBmb3IgYSBnaXZlbiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJhZGQgZ2VuZXJpYyBqYXZhIGFwaSAoZGUtL3JlZ2lzdGVyIG1hcHBpbmcpIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotICAgICAgICBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXNzYWdlUmVzb2x2ZXI+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nOw0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBuYW1lTWFwcGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PigpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlUmVzb2x2ZXIgY3JlYXRlKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWUgPSBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSk7DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHN0cmF0ZWd5TmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChNZXNzYWdlUmVzb2x2ZXIpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmdldChzdHJhdGVneU5hbWUpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICBTdHJpbmcgcmVzb2x2ZXJOYW1lOw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vYnVpbGQgY29udmVudGlvbiAoVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKQ0KLSAgICAgICAgICAgIHJlc29sdmVyTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIC8vbmFtZSB3YXNuJ3QgbWFwcGVkDQotICAgICAgICAgICAgaWYgKHJlc29sdmVyTmFtZSA9PSBudWxsIHx8IFByb3h5VXRpbHMuZ2V0Q2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpKS5lcXVhbHMocmVzb2x2ZXJOYW1lKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtZXNzYWdlUmVzb2x2ZXIgPSAoTWVzc2FnZVJlc29sdmVyKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUocmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWVzc2FnZVJlc29sdmVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKHN0cmF0ZWd5TmFtZSwgcmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZXNvbHZlck5hbWUgKyAiIHVzZWQgZm9yICIgKyBzdHJhdGVneU5hbWUpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYWRkTWFwcGluZyhzdHJhdGVneU5hbWUsIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotDQotICAgICAgICAvL3NldHVwIGludGVybmFsIHN0YXRpYyBtYXBwaW5ncw0KLSAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgOg0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cE1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cE1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZyxTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWFwcGluZy5nZXRTb3VyY2UoKSwgbWFwcGluZy5nZXRUYXJnZXQoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyBtZXNzYWdlUmVzb2x2ZXJOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImFkZGluZyBzdGF0aWMgdmFsaWRhdGlvbiBzdHJhdGVneSB0byBtZXNzYWdlIHJlc29sdmVyIG1hcHBpbmc6ICINCi0gICAgICAgICAgICAgICAgKyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgIiAtPiAiICsgbWVzc2FnZVJlc29sdmVyTmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmcucHV0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIG1lc3NhZ2VSZXNvbHZlck5hbWUpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gZ2V0TmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmFtZU1hcHBlckxpc3Q7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OWVkYzYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgTWVzc2FnZVJlc29sdmVyIHdoaWNoIHVzZXMgdGhlIGRlZmF1bHQgY29udmVudGlvbiBmb3IgdGhlIG1lc3NhZ2UgYnVuZGxlLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBtZXNzYWdlIGJ1bmRsZSB2aWEgd2ViLnhtbA0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0JVTkRMRSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVTU0FHRV9CVU5ETEU7DQotDQotICAgIC8vbm90IHVzZWQgYXQgdGhlIG1vbWVudCAtIGp1c3QgZm9yIGEgY29udmVudGlvbg0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1vZHVsZU1lc3NhZ2VCdW5kbGVOYW1lKGdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21CYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBDVVNUT01fQlVORExFOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNjYTFjMS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgZm9yIE1lc3NhZ2VSZXNvbHZlcnMgaW5kZXBlbmRlbnQgb2YgdGhlIG1lc3NhZ2Ugc291cmNlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGQ0MGI2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YzA4ZTguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gTWVzc2FnZVJlc29sdmVycy4NCi0gKiAoY29uZmlndXJlZCB2aWEgd2ViLnhtbCkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfTkFNRV9NQVBQRVI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0M2MwMTMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ3kgdG8gTWVzc2FnZVJlc29sdmVyLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NU0dfUkVTT0xWRVJfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWJiNGQ2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSW4gb3JkZXIgdG8gcHJvdmlkZSBhIE5hbWVNYXBwZXIgcGVyIHZhbGlkYXRpb24gbW9kdWxlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigzMTApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYTQ3N2IuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotLyoqDQotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBtYXBzIEV4dFZhbCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBFeHRWYWwgTWVzc2FnZVJlc29sdmVycy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcyA9IFByb3h5VXRpbHMNCi0gICAgICAgICAgICAgICAgLmdldFVucHJveGllZENsYXNzKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MpOw0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1lc3NhZ2VSZXNvbHZlckNsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXRTaW1wbGVOYW1lKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgc3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUoc3RyYXRlZ3lDbGFzc05hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYzZDk3MC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIHRvIHBsYWNlIFZhbGlkYXRpb25TdHJhdGVnaWVzIGFuZCBNZXNzYWdlUmVzb2x2ZXJzIGluIHRoZSBzYW1lIHBhY2thZ2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDQwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgc3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjdXN0b21Qb3N0Zml4ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFX1JFU09MVkVSX1BPU1RGSVgpOw0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZShzdHJhdGVneUNsYXNzTmFtZSwgY3VzdG9tUG9zdGZpeCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMzhmNTQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkdlbmVyaWNBcnJheVR5cGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LldpbGRjYXJkVHlwZTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGV4dHJhY3RCeUlkKGFubm90YXRpb24sIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBleHRyYWN0QnlJZChhbm5vdGF0aW9uLCBrZXksIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyA8VD4gTGlzdDxUPiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSwgQ2xhc3M8VD4gdmFsdWVUeXBlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZXh0cmFjdEJ5SWQoYW5ub3RhdGlvbiwga2V5LCB2YWx1ZVR5cGUsIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyA8VD4gVCBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSwgQ2xhc3M8VD4gdmFsdWVUeXBlLCBDbGFzcyB2YWx1ZUlkKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFQ+IHJlc3VsdHMgPSBleHRyYWN0QnlJZChhbm5vdGF0aW9uLCBrZXksIHZhbHVlVHlwZSwgdmFsdWVJZCk7DQotDQotICAgICAgICBpZihyZXN1bHRzLml0ZXJhdG9yKCkuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRzLml0ZXJhdG9yKCkubmV4dCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHVibGljIDxUPiBMaXN0PFQ+IGV4dHJhY3RCeUlkKEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSwgQ2xhc3M8VD4gdmFsdWVUeXBlLCBDbGFzcyB2YWx1ZUlkKQ0KLSAgICB7DQotICAgICAgICBMaXN0PE9iamVjdD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7DQotDQotICAgICAgICBmb3IoT2JqZWN0IGVudHJ5IDogZXh0cmFjdEJ5SWQoYW5ub3RhdGlvbiwga2V5LCB2YWx1ZUlkKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWx1ZVR5cGUuaXNBc3NpZ25hYmxlRnJvbShlbnRyeS5nZXRDbGFzcygpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoTGlzdDxUPilyZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8T2JqZWN0PiBleHRyYWN0QnlJZChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzIHZhbHVlSWQpDQotICAgIHsNCi0gICAgICAgIE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4gZnVsbFJlc3VsdCA9IGV4dHJhY3RCeUlkKGFubm90YXRpb24sIHZhbHVlSWQpOw0KLQ0KLSAgICAgICAgaWYoZnVsbFJlc3VsdC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmdWxsUmVzdWx0LmdldChrZXkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJhZGQgd2ViLnhtbCBwYXJhbWV0ZXIgZm9yIHBlcmZvcm1hbmNlIHR1bmluZyB0byBkZWFjdGl2YXRlIHRoZSBzY2FuIikNCi0gICAgcHVibGljIE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4gZXh0cmFjdEJ5SWQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBDbGFzcyB2YWx1ZUlkKQ0KLSAgICB7DQotICAgICAgICBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PigpOw0KLQ0KLSAgICAgICAgZm9yKE1ldGhvZCBjdXJyZW50QW5ub3RhdGlvbkF0dHJpYnV0ZSA6IGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKS5nZXREZWNsYXJlZE1ldGhvZHMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKCFpc1ZhbGlkYXRpb25QYXJhbWV0ZXIoY3VycmVudEFubm90YXRpb25BdHRyaWJ1dGUuZ2V0R2VuZXJpY1JldHVyblR5cGUoKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIE9iamVjdCBwYXJhbWV0ZXJWYWx1ZSA9IGN1cnJlbnRBbm5vdGF0aW9uQXR0cmlidXRlLmludm9rZShhbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYocGFyYW1ldGVyVmFsdWUgaW5zdGFuY2VvZiBDbGFzc1tdKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBmb3IoQ2xhc3MgY3VycmVudFBhcmFtZXRlclZhbHVlIDogKENsYXNzW10pcGFyYW1ldGVyVmFsdWUpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgLy9rZWVwIGNoZWNrIHNvIHRoYXQgZm9sbG93aW5nIGlzIHRydWU6DQotICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIGZvdW5kIHdoaWNoIHRlbGxzIHRoYXQgaXQgaXNuJ3QgYSBibG9ja2luZyBlcnJvciwgbGV0IGl0IHBhc3MNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUGFyYW1ldGVyVmFsdWUoYW5ub3RhdGlvbiwgY3VycmVudFBhcmFtZXRlclZhbHVlLCByZXN1bHQsIHZhbHVlSWQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UgaWYocGFyYW1ldGVyVmFsdWUgaW5zdGFuY2VvZiBDbGFzcykNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgLy9rZWVwIGNoZWNrIHNvIHRoYXQgZm9sbG93aW5nIGlzIHRydWU6DQotICAgICAgICAgICAgICAgICAgICAvL2lmIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgZm91bmQgd2hpY2ggdGVsbHMgdGhhdCBpdCBpc24ndCBhIGJsb2NraW5nIGVycm9yLCBsZXQgaXQgcGFzcw0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1BhcmFtZXRlclZhbHVlKGFubm90YXRpb24sIChDbGFzcylwYXJhbWV0ZXJWYWx1ZSwgcmVzdWx0LCB2YWx1ZUlkKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGRvbid0IHVzZSB0aGUgSW50cm9zcGVjdG9yIGluIHRoaXMgY2FzZQ0KLSAgICAgKiBpZiB5b3UgaGF2ZSBhIGJldHRlciBzb2x1dGlvbiB3aGljaCBzdXBwb3J0cyBhbGwgc3VwcG9ydGVkIHBhcmFtZXRlciBzdHlsZXMgKHNlZSBleHR2YWwgd2lraSksDQotICAgICAqIHlvdSBjYW4gaW1wbC4gaXQgYW5kIHVzZSBpdCAoZXhjaGFuZ2UgdGhlIGltcGxzLiB2aWEgdGhlIEV4dFZhbENvbnRleHQpLg0KLSAgICAgKiBmdXJ0aGVybW9yZSwgeW91IGNhbiBwcm92aWRlIHRoZSBmaXggZm9yIHRoZSBjb21tdW5pdHkNCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUGFyYW1ldGVyVmFsdWUoDQotICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBDbGFzcyBwYXJhbUNsYXNzLCBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+IHJlc3VsdCwgQ2xhc3MgdmFsdWVJZCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBPYmplY3Qga2V5ID0gbnVsbDsNCi0gICAgICAgIExpc3Q8T2JqZWN0PiBwYXJhbWV0ZXJWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0NCi0gICAgICAgIGlmKFZhbGlkYXRpb25QYXJhbWV0ZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShwYXJhbUNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBMaXN0PEZpZWxkPiBwcm9jZXNzZWRGaWVsZHMgPSBuZXcgQXJyYXlMaXN0PEZpZWxkPigpOw0KLSAgICAgICAgICAgIExpc3Q8TWV0aG9kPiBwcm9jZXNzZWRNZXRob2RzID0gbmV3IEFycmF5TGlzdDxNZXRob2Q+KCk7DQotDQotICAgICAgICAgICAgQ2xhc3MgY3VycmVudFBhcmFtQ2xhc3MgPSBwYXJhbUNsYXNzOw0KLSAgICAgICAgICAgIHdoaWxlIChjdXJyZW50UGFyYW1DbGFzcyAhPSBudWxsICYmICFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjdXJyZW50UGFyYW1DbGFzcy5nZXROYW1lKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgICAgICogcHJvY2VzcyBjbGFzcw0KLSAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICAgICAgLy9zdXBwb3J0IHB1cmUgaW50ZXJmYWNlIGFwcHJvYWNoIGUuZy4gVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcw0KLSAgICAgICAgICAgICAgICBmb3IoRmllbGQgY3VycmVudEZpZWxkIDogY3VycmVudFBhcmFtQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoIXByb2Nlc3NlZEZpZWxkcy5jb250YWlucyhjdXJyZW50RmllbGQpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHByb2Nlc3NGb3VuZEZpZWxkKGFubm90YXRpb24sIGN1cnJlbnRGaWVsZCwgcGFyYW1ldGVyVmFsdWVzLCBrZXksIHZhbHVlSWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEZpZWxkcy5hZGQoY3VycmVudEZpZWxkKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAvL2luc3BlY3QgdGhlIG90aGVyIG1ldGhvZHMgb2YgdGhlIGltcGxlbWVudGluZyBjbGFzcw0KLSAgICAgICAgICAgICAgICBmb3IoTWV0aG9kIGN1cnJlbnRNZXRob2QgOiBjdXJyZW50UGFyYW1DbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoIXByb2Nlc3NlZE1ldGhvZHMuY29udGFpbnMoY3VycmVudE1ldGhvZCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcHJvY2Vzc0ZvdW5kTWV0aG9kKGN1cnJlbnRQYXJhbUNsYXNzLCBjdXJyZW50TWV0aG9kLCBwYXJhbWV0ZXJWYWx1ZXMsIGtleSwgdmFsdWVJZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkTWV0aG9kcy5hZGQoY3VycmVudE1ldGhvZCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgICAgICogcHJvY2VzcyBpbnRlcmZhY2VzDQotICAgICAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgICAgICBmb3IoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IGN1cnJlbnRQYXJhbUNsYXNzLmdldEludGVyZmFjZXMoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoIVZhbGlkYXRpb25QYXJhbWV0ZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjdXJyZW50SW50ZXJmYWNlKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIC8vc3VwcG9ydCBpbnRlcmZhY2UgKyBpbXBsLiBhcHByb2FjaCBlLmcuIE15UGFyYW1JbXBsLmNsYXNzDQotICAgICAgICAgICAgICAgICAgICAvLyhNeVBhcmFtSW1wbCBpbXBsZW1lbnRzIE15UGFyYW0NCi0gICAgICAgICAgICAgICAgICAgIC8vTXlQYXJhbSBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi0gICAgICAgICAgICAgICAgICAgIC8vbWV0aG9kcyBpbiB0aGUgaW50ZXJmYWNlIGhhdmUgdG8gYmUgbWFya2VkIHdpdGggQFBhcmFtZXRlclZhbHVlIGFuZCBAUGFyYW1ldGVyS2V5DQotICAgICAgICAgICAgICAgICAgICBmb3IoTWV0aG9kIGN1cnJlbnRNZXRob2QgOiBjdXJyZW50SW50ZXJmYWNlLmdldERlY2xhcmVkTWV0aG9kcygpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwcm9jZXNzZWRNZXRob2RzLmNvbnRhaW5zKGN1cnJlbnRNZXRob2QpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcHJvY2Vzc0ZvdW5kTWV0aG9kKGN1cnJlbnRQYXJhbUNsYXNzLCBjdXJyZW50TWV0aG9kLCBwYXJhbWV0ZXJWYWx1ZXMsIGtleSwgdmFsdWVJZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZE1ldGhvZHMuYWRkKGN1cnJlbnRNZXRob2QpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGZvcihGaWVsZCBjdXJyZW50RmllbGQgOiBjdXJyZW50SW50ZXJmYWNlLmdldERlY2xhcmVkRmllbGRzKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXByb2Nlc3NlZEZpZWxkcy5jb250YWlucyhjdXJyZW50RmllbGQpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcHJvY2Vzc0ZvdW5kRmllbGQoYW5ub3RhdGlvbiwgY3VycmVudEZpZWxkLCBwYXJhbWV0ZXJWYWx1ZXMsIGtleSwgdmFsdWVJZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEZpZWxkcy5hZGQoY3VycmVudEZpZWxkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgY3VycmVudFBhcmFtQ2xhc3MgPSBjdXJyZW50UGFyYW1DbGFzcy5nZXRTdXBlcmNsYXNzKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAga2V5ID0gY3JlYXRlRGVmYXVsdEtleShrZXksIHBhcmFtQ2xhc3MpOw0KLQ0KLSAgICAgICAgaWYocGFyYW1ldGVyVmFsdWVzLmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL0BQYXJhbWV0ZXJWYWx1ZSBpcyBvcHRpb25hbCBhcyB3ZWxsDQotICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWVzLmFkZChrZXkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYocmVzdWx0LmNvbnRhaW5zS2V5KGtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmdldChrZXkpLmFkZEFsbChwYXJhbWV0ZXJWYWx1ZXMpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5wdXQoa2V5LCBwYXJhbWV0ZXJWYWx1ZXMpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IGNyZWF0ZURlZmF1bHRLZXkoT2JqZWN0IGtleSwgQ2xhc3MgY3VycmVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZihrZXkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2NoZWNrIGZvciBzdXBlci1pbnRlcmZhY2UgKGV4Y2x1ZGUgVmFsaWRhdGlvblBhcmFtZXRlciBpdHNlbGYpDQotICAgICAgICAgICAgZm9yKENsYXNzIGludGVyZmFjZUNsYXNzIDogY3VycmVudENsYXNzLmdldEludGVyZmFjZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKFZhbGlkYXRpb25QYXJhbWV0ZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShpbnRlcmZhY2VDbGFzcykgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAoIWludGVyZmFjZUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoVmFsaWRhdGlvblBhcmFtZXRlci5jbGFzcy5nZXROYW1lKCkpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAga2V5ID0gaW50ZXJmYWNlQ2xhc3M7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGtleSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGtleSA9IGN1cnJlbnRDbGFzczsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBrZXk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgcHJvY2Vzc0ZvdW5kRmllbGQoDQotICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlLCBGaWVsZCBjdXJyZW50RmllbGQsIExpc3Q8T2JqZWN0PiBwYXJhbVZhbHVlcywgT2JqZWN0IGtleSwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IG5ld0tleSA9IG51bGw7DQotICAgICAgICBpZihrZXkgPT0gbnVsbCAmJiBjdXJyZW50RmllbGQuaXNBbm5vdGF0aW9uUHJlc2VudChQYXJhbWV0ZXJLZXkuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbmV3S2V5ID0gY3VycmVudEZpZWxkLmdldChpbnN0YW5jZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIC8vbm8gImVsc2UgaWYiIHRvIGFsbG93IGJvdGggYXQgb25lIGZpZWxkDQotICAgICAgICBpZihjdXJyZW50RmllbGQuaXNBbm5vdGF0aW9uUHJlc2VudChQYXJhbWV0ZXJWYWx1ZS5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodmFsdWVJZCA9PSBudWxsIHx8IHZhbHVlSWQuZXF1YWxzKGN1cnJlbnRGaWVsZC5nZXRBbm5vdGF0aW9uKFBhcmFtZXRlclZhbHVlLmNsYXNzKS5pZCgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOw0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1WYWx1ZXMuYWRkKGN1cnJlbnRGaWVsZC5nZXQoaW5zdGFuY2UpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG5ld0tleSAhPSBudWxsID8gbmV3S2V5IDoga2V5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IHByb2Nlc3NGb3VuZE1ldGhvZCgNCi0gICAgICAgICAgICBDbGFzcyBwYXJhbUNsYXNzLCBNZXRob2QgY3VycmVudE1ldGhvZCwgTGlzdDxPYmplY3Q+IHBhcmFtZXRlclZhbHVlcywgT2JqZWN0IGtleSwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IG5ld0tleSA9IG51bGw7DQotICAgICAgICBpZihrZXkgPT0gbnVsbCAmJiBjdXJyZW50TWV0aG9kLmlzQW5ub3RhdGlvblByZXNlbnQoUGFyYW1ldGVyS2V5LmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKCEoTW9kaWZpZXIuaXNBYnN0cmFjdChwYXJhbUNsYXNzLmdldE1vZGlmaWVycygpKSB8fCBNb2RpZmllci5pc0ludGVyZmFjZShwYXJhbUNsYXNzLmdldE1vZGlmaWVycygpKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG5ld0tleSA9IGN1cnJlbnRNZXRob2QuaW52b2tlKHBhcmFtQ2xhc3MubmV3SW5zdGFuY2UoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9ubyAiZWxzZSBpZiIgdG8gYWxsb3cgYm90aCBhdCBvbmUgZmllbGQNCi0gICAgICAgIGlmKGN1cnJlbnRNZXRob2QuaXNBbm5vdGF0aW9uUHJlc2VudChQYXJhbWV0ZXJWYWx1ZS5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodmFsdWVJZCA9PSBudWxsIHx8IHZhbHVlSWQuZXF1YWxzKGN1cnJlbnRNZXRob2QuZ2V0QW5ub3RhdGlvbihQYXJhbWV0ZXJWYWx1ZS5jbGFzcykuaWQoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50TWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJWYWx1ZXMuYWRkKGN1cnJlbnRNZXRob2QuaW52b2tlKHBhcmFtQ2xhc3MubmV3SW5zdGFuY2UoKSkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBpZiBpdCdzIGEgbm9uZS1zdGF0aWMgaW5uZXIgY2xhc3MgLT4gcmV0dXJuIHRoaXMgY2xhc3MNCi0gICAgICAgICAgICAgICAgICAgIGlmKHBhcmFtQ2xhc3MuZ2V0RW5jbG9zaW5nQ2xhc3MoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlcy5hZGQocGFyYW1DbGFzcyk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG5ld0tleSAhPSBudWxsID8gbmV3S2V5IDoga2V5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkYXRpb25QYXJhbWV0ZXIoVHlwZSBnZW5lcmljUmV0dXJuVHlwZSkNCi0gICAgew0KLSAgICAgICAgaWYoZ2VuZXJpY1JldHVyblR5cGUgaW5zdGFuY2VvZiBHZW5lcmljQXJyYXlUeXBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCgoR2VuZXJpY0FycmF5VHlwZSlnZW5lcmljUmV0dXJuVHlwZSkuZ2V0R2VuZXJpY0NvbXBvbmVudFR5cGUoKSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGFuYWx5emVQYXJhbWV0ZXJpemVkVHlwZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICAoUGFyYW1ldGVyaXplZFR5cGUpKChHZW5lcmljQXJyYXlUeXBlKWdlbmVyaWNSZXR1cm5UeXBlKS5nZXRHZW5lcmljQ29tcG9uZW50VHlwZSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKGdlbmVyaWNSZXR1cm5UeXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFuYWx5emVQYXJhbWV0ZXJpemVkVHlwZSgNCi0gICAgICAgICAgICAgICAgICAgIChQYXJhbWV0ZXJpemVkVHlwZSlnZW5lcmljUmV0dXJuVHlwZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGFuYWx5emVQYXJhbWV0ZXJpemVkVHlwZShQYXJhbWV0ZXJpemVkVHlwZSBwYXJhbWV0ZXJpemVkVHlwZSkNCi0gICAgew0KLSAgICAgICAgZm9yKFR5cGUgdHlwZSA6IHBhcmFtZXRlcml6ZWRUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0eXBlIGluc3RhbmNlb2YgV2lsZGNhcmRUeXBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm9yKFR5cGUgdXBwZXJCb3VuZHMgOiAoKFdpbGRjYXJkVHlwZSl0eXBlKS5nZXRVcHBlckJvdW5kcygpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZih1cHBlckJvdW5kcyBpbnN0YW5jZW9mIENsYXNzICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZm9yIGF0dHJpYnV0ZXMgbGlrZTogQ2xhc3M8PyBleHRlbmRzIEluaGVyaXRlZEZyb21WYWxpZGF0aW9uUGFyYW1ldGVyPiB2YWx1ZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uUGFyYW1ldGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oKENsYXNzKXVwcGVyQm91bmRzKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTJhNzNjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkgaW1wbGVtZW50cyBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeQ0KLXsNCi0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciA9IG51bGw7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGNyZWF0ZSgpDQotICAgIHsNCi0gICAgICAgIGlmICh2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SKTsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yQ2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SKSk7DQotICAgICAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckNsYXNzTmFtZXMuYWRkKERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckNsYXNzTmFtZXMpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yID0gKFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IpDQotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGNyZWF0ZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNWM4ZmUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIG1hcHMgaW50ZXJuYWwgcGFyYW1ldGVycyB0byBvcHRpb25hbGx5IGF2YWlsYWJsZSBjdXN0b20gcGFyYW1ldGVycw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxDbGFzcywgQ2xhc3M+DQotew0KLSAgICBwcml2YXRlIE1hcDxDbGFzcywgQ2xhc3M+IHBhcmFtZXRlck1hcHBpbmcgPSBuZXcgSGFzaE1hcDxDbGFzcywgQ2xhc3M+KCk7DQotDQotICAgIHB1YmxpYyBDbGFzcyBjcmVhdGUoQ2xhc3Mgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZiAodGhpcy5wYXJhbWV0ZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHNvdXJjZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1ldGVyTWFwcGluZy5nZXQoc291cmNlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIENsYXNzIHJlc3VsdDsNCi0NCi0gICAgICAgIC8vaXQncyBpbXBvcnRhbnQgdG8gbG9vayBmb3IgdGhlIHN0YXRpYyBjb25maWdzIGZpcnN0IC0gZ2xvYmFsIHBhcmFtZXRlcnMgYXJlIHVzZWQgaW50ZXJuYWxseQ0KLSAgICAgICAgcmVzdWx0ID0gdHJ5VG9GaW5kU3RhdGljQ29uZmlnKHNvdXJjZSk7DQotDQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gdHJ5VG9GaW5kR2xvYmFsUGFyYW1ldGVyKHNvdXJjZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gc291cmNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgY2FjaGVNYXBwaW5nKHNvdXJjZSwgcmVzdWx0KTsNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBDbGFzcyB0cnlUb0ZpbmRHbG9iYWxQYXJhbWV0ZXIoQ2xhc3Mgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgdGFyZ2V0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoc291cmNlLmdldE5hbWUoKSk7DQotDQotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQ2xhc3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChDbGFzcykgdGFyZ2V0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBDbGFzcyB0cnlUb0ZpbmRTdGF0aWNDb25maWcoQ2xhc3Mgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBDbGFzcyByZXN1bHQgPSBudWxsOw0KLSAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBjb25maWcgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0U3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuVkFMSURBVElPTl9QQVJBTUVURVJfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSB0cnlUb01hcChzb3VyY2UsIGNvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLQ0KLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBDbGFzcyB0cnlUb01hcChDbGFzcyBzb3VyY2UsIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZykNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0ID0gbnVsbDsNCi0NCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IG1hcHBpbmcpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHNvdXJjZS5nZXROYW1lKCkuZXF1YWxzKGVudHJ5LmdldFNvdXJjZSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRhcmdldCA9IENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKGVudHJ5LmdldFRhcmdldCgpKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0YXJnZXQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNhY2hlTWFwcGluZyhDbGFzcyBzb3VyY2UsIENsYXNzIHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJNYXBwaW5nLnB1dChzb3VyY2UsIHRhcmdldCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNmM3ZjEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBtZWNoYW5pc20gdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGV4dHZhbA0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgaW1wbGVtZW50cyBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyDQotew0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXZlcml0eUJsb2Nrc05hdmlnYXRpb24oDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUi5lcXVhbHMoc2V2ZXJpdHkpIHx8IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9GQVRBTC5lcXVhbHMoc2V2ZXJpdHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHNldmVyaXR5Q2F1c2VzVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IuZXF1YWxzKHNldmVyaXR5KSB8fCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUwuZXF1YWxzKHNldmVyaXR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXZlcml0eUNhdXNlc1Zpb2xhdGlvbk1lc3NhZ2UoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gc2V2ZXJpdHlCbG9ja3NTdWJtaXQoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUi5lcXVhbHMoc2V2ZXJpdHkpIHx8IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9GQVRBTC5lcXVhbHMoc2V2ZXJpdHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHNldmVyaXR5U2hvd3NJbmRpY2F0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IuZXF1YWxzKHNldmVyaXR5KSB8fCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUwuZXF1YWxzKHNldmVyaXR5KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzAwODZiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbiBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlcktleS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvUGFyYW1ldGVyS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMDJiYmEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvUGFyYW1ldGVyS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRhcmdldCh7RklFTEQsIE1FVEhPRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFBhcmFtZXRlcktleQ0KLXsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvUGFyYW1ldGVyVmFsdWUuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlclZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZGM4ZjMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvUGFyYW1ldGVyVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVGFyZ2V0KHtGSUVMRCwgTUVUSE9EfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUGFyYW1ldGVyVmFsdWUNCi17DQotICAgIENsYXNzIGlkKCkgZGVmYXVsdCBQYXJhbWV0ZXJWYWx1ZS5jbGFzczsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTU5Yzc2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uUGFyYW1ldGVyDQotew0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMDk5MDIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yDQotew0KLSAgICBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKTsNCi0gICAgTGlzdDxPYmplY3Q+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5KTsNCi0gICAgPFQ+IExpc3Q8VD4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSk7DQotICAgIDxUPiBUIGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzczxUPiB2YWx1ZVR5cGUsIENsYXNzIHZhbHVlSWQpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRjZGRkMi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5DQotew0KLSAgICBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGNyZWF0ZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WaW9sYXRpb25TZXZlcml0eS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMyODg3Yy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WaW9sYXRpb25TZXZlcml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmlvbGF0aW9uU2V2ZXJpdHkNCi17DQotICAgIGludGVyZmFjZSBJbmZvIGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcg0KLSAgICB7DQotICAgICAgICBAUGFyYW1ldGVyS2V5DQotICAgICAgICBwdWJsaWMgQ2xhc3MgS0VZID0gVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3M7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgQFBhcmFtZXRlclZhbHVlDQotICAgICAgICBwdWJsaWMgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFNFVkVSSVRZID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0lORk87DQotDQotICAgICAgICAvL0BQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgLy9NZXNzYWdlVHlwZSBwb3N0Zml4ID0gTWVzc2FnZVR5cGUuSU5GTzsNCi0gICAgfQ0KLQ0KLSAgICBpbnRlcmZhY2UgV2FybiBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi0gICAgew0KLSAgICAgICAgQFBhcmFtZXRlcktleQ0KLSAgICAgICAgcHVibGljIENsYXNzIEtFWSA9IFZpb2xhdGlvblNldmVyaXR5LmNsYXNzOw0KLQ0KLSAgICAgICAgQFBhcmFtZXRlclZhbHVlDQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgU0VWRVJJVFkgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfV0FSTjsNCi0NCi0gICAgICAgIC8vQFBhcmFtZXRlclZhbHVlDQotICAgICAgICAvL01lc3NhZ2VUeXBlIHBvc3RmaXggPSBNZXNzYWdlVHlwZS5XQVJOOw0KLSAgICB9DQotDQotICAgIGludGVyZmFjZSBFcnJvciBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi0gICAgew0KLSAgICAgICAgQFBhcmFtZXRlcktleQ0KLSAgICAgICAgcHVibGljIENsYXNzIEtFWSA9IFZpb2xhdGlvblNldmVyaXR5LmNsYXNzOw0KLQ0KLSAgICAgICAgQFBhcmFtZXRlclZhbHVlDQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgU0VWRVJJVFkgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1I7DQotDQotICAgICAgICAvL0BQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgLy9NZXNzYWdlVHlwZSBwb3N0Zml4ID0gTWVzc2FnZVR5cGUuRVJST1I7DQotICAgIH0NCi0NCi0gICAgaW50ZXJmYWNlIEZhdGFsIGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcg0KLSAgICB7DQotICAgICAgICBAUGFyYW1ldGVyS2V5DQotICAgICAgICBwdWJsaWMgQ2xhc3MgS0VZID0gVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3M7DQotDQotICAgICAgICBAUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBTRVZFUklUWSA9IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9GQVRBTDsNCi0NCi0gICAgICAgIC8vQFBhcmFtZXRlclZhbHVlDQotICAgICAgICAvL01lc3NhZ2VUeXBlIHBvc3RmaXggPSBNZXNzYWdlVHlwZS5GQVRBTDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NmJkOTQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIG1lY2hhbmlzbSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgZXh0dmFsDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyDQotew0KLSAgICAvKioNCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBjdXJyZW50IGZhY2VzIGNvbnRleHQNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IGN1cnJlbnQgY29tcG9uZW50DQotICAgICAqIEBwYXJhbSBzZXZlcml0eSBqc2Ygc2V2ZXJpdHkgZm9yIGZhY2VzIG1lc3NhZ2VzDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2V2ZXJpdHkgc2hvdWxkIGJsb2NrIHRoZSBuYXZpZ2F0aW9uDQotICAgICAqIGlmICNzZXZlcml0eUNhdXNlc1ZhbGlkYXRvckV4Y2VwdGlvbiByZXR1cm5zIGZhbGxzIHZhbGlkYXRpb24gd2lsbCBiZSBjb250aW51ZWQgZm9yIHRoZSBjdXJyZW50IHByb3BlcnR5DQotICAgICAqIGFsbCBtZXNzYWdlcyB3aGljaCBkb24ndCBsZWFkIHRvIGFuIGV4Y2VwdGlvbiBzaG91bGQgYmUgc3RvcmVkIGluIGFuIHN0b3JhZ2UgYW5kDQotICAgICAqIGFkZGVkIGFmdGVyIHRoZSBmaXJzdCBtZXNzYWdlIHdoaWNoIGdldHMgdGhyb3duIGFzIGV4Y2VwdGlvbg0KLSAgICAgKiBhIGdsb2JhbCBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBhZGQgdGhlIG1lc3NhZ2VzIG9mIHRoZSBzdG9yYWdlIGFzIGZhY2VzIG1lc3NhZ2UNCi0gICAgICovDQotICAgIGJvb2xlYW4gc2V2ZXJpdHlCbG9ja3NOYXZpZ2F0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpOw0KLQ0KLSAgICAvKioNCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBjdXJyZW50IGZhY2VzIGNvbnRleHQNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IGN1cnJlbnQgY29tcG9uZW50DQotICAgICAqIEBwYXJhbSBzZXZlcml0eSBqc2Ygc2V2ZXJpdHkgZm9yIGZhY2VzIG1lc3NhZ2VzDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2V2ZXJpdHkgc2hvdWxkIGNhdXNlIGEgdmFsaWRhdG9yIGV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBzZXZlcml0eUNhdXNlc1ZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KTsNCi0NCi0gICAgLyoqDQotICAgICAqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSB2aW9sYXRpb24gbWVzc2FnZSBsZWFkcyB0byBhIGZhY2VzIG1lc3NhZ2UNCi0gICAgICovDQotICAgIGJvb2xlYW4gc2V2ZXJpdHlDYXVzZXNWaW9sYXRpb25NZXNzYWdlKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpOw0KLQ0KLSAgICAvKioNCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBjdXJyZW50IGZhY2VzIGNvbnRleHQNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IGN1cnJlbnQgY29tcG9uZW50DQotICAgICAqIEBwYXJhbSBzZXZlcml0eSBqc2Ygc2V2ZXJpdHkgZm9yIGZhY2VzIG1lc3NhZ2VzDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29uc3RyYWludCB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSBzaG91bGQgYmUgdmFsaWRhdGVkIG9uIHRoZSBjbGllbnQgc2lkZSAoaWYgc3VwcG9ydGVkKQ0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBzZXZlcml0eUJsb2Nrc1N1Ym1pdCgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KTsNCi0NCi0gICAgLyoqDQotICAgICAqIGF2YWlsYWJsZSBmb3IgYWRkLW9ucyAtIG5vdCB1c2VkIGludGVybmFsbHkgZHVlIHRvIHBlcmZvcm1hbmNlIHJlYXNvbnMNCi0gICAgICoNCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBjdXJyZW50IGZhY2VzIGNvbnRleHQNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IGN1cnJlbnQgY29tcG9uZW50DQotICAgICAqIEBwYXJhbSBzZXZlcml0eSBqc2Ygc2V2ZXJpdHkgZm9yIGZhY2VzIG1lc3NhZ2VzDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29uc3RyYWludCB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eQ0KLSAgICAgKiBzaG91bGQgY2F1c2UgZS5nLiBhIHJlcXVpcmVkIG1hcmtlciBpbmRlcGVuZGVudCBvZiBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIChpZiBzdXBwb3J0ZWQpDQotICAgICAqLw0KLSAgICBib29sZWFuIHNldmVyaXR5U2hvd3NJbmRpY2F0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU5YzkzNC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci0KLS8qKgotICogUHJvdmlkZXMgdGhlIGFiaWxpdHkgb2YgbWVzc2FnZSByZXNvbHZpbmcgdG8gVmFsaWRhdGlvblN0cmF0ZWdpZXMKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5PEEgZXh0ZW5kcyBBbm5vdGF0aW9uPiBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ci17Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVggPSAiX2RldGFpbCI7Ci0gICAgLy9lLmcuIGZvciBpbmplY3RpbmcgYSBtZXNzYWdlIHJlc29sdmVyIHZpYSBzcHJpbmcKLSAgICBwcml2YXRlIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXI7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICBMb2NhbGUgbG9jYWxlID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCk7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZVJlc29sdmVyICE9IG51bGwgPyB0aGlzLm1lc3NhZ2VSZXNvbHZlci5nZXRNZXNzYWdlKGtleSwgbG9jYWxlKSA6Ci0gICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodGhpcykuZ2V0TWVzc2FnZShrZXksIGxvY2FsZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KEEgYW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiByZXNvbHZlTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbikpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKEEgYW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pOwotICAgICAgICAgICAgcmV0dXJuIChrZXkgIT0gbnVsbCkgPyByZXNvbHZlTWVzc2FnZShrZXkgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCkgOiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBrZXkgIiArIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKSArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLAotICAgICAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEZhY2VzTWVzc2FnZSBnZXRWYWxpZGF0aW9uRXJyb3JGYWNlc01lc3NhZ2UoQSBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZUZhY2VzTWVzc2FnZShnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24pLCBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbikpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEEgYW5ub3RhdGlvbik7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlUmVzb2x2ZXIoTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIHRoaXMubWVzc2FnZVJlc29sdmVyID0gbWVzc2FnZVJlc29sdmVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQotICAgIHsKLSAgICAgICAgbWV0YURhdGFFbnRyeS5zZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCwgZ2V0TGFiZWwoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSkpOwotCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24pOwotICAgIH0KLQotICAgIC8vZS5nLiBmb3IgY3VzdG9tIGFubm90YXRpb25zIC0gb3ZlcnJpZGUgaWYgbmVlZGVkCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDFmM2VkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLmV4Y2VwdGlvbi5SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIFByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIHVzZSBWYWxpZGF0b3JFeGNlcHRpb24gKGFzIGV4cGVjdGVkIGJ5IHRoZSB1c2VyKSBpbnN0ZWFkIG9mIENvbnZlcnRlckV4Y2VwdGlvbi4NCi0gKiBGdXJ0aGVybW9yZSBpdCBwcm92aWRlczo8YnIvPg0KLSAqIGluaXRWYWxpZGF0aW9uPGJyLz4NCi0gKiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBpbml0VmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW5pdFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiaW5pdFZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHByb2Nlc3NWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByb2Nlc3NWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInByb2Nlc3NWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVmFsaWRhdG9yRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLSAgICAgICAgICAgIGlmKGUgaW5zdGFuY2VvZiBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbiA9IG5ldyBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb252ZXJ0RmFjZXNNZXNzYWdlKGUuZ2V0RmFjZXNNZXNzYWdlKCkpLCBlLmdldENhdXNlKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24gPSBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbnZlcnRGYWNlc01lc3NhZ2UoZS5nZXRGYWNlc01lc3NhZ2UoKSksIGUuZ2V0Q2F1c2UoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlmIChwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGdldENsYXNzKCkuZ2V0TmFtZSgpICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiOiB0aHJvdyBvcmlnaW5hbCBleGNlcHRpb24gYWZ0ZXIgcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudCgNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLCB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAiOiBvcmlnaW5hbCBleGNlcHRpb24gYWZ0ZXIgcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICAvL292ZXJyaWRlIGlmIG5lZWRlZA0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uLCB0aGlzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmlydHVhbFZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZhOGNmZS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmlydHVhbFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLQ0KLS8qKg0KLSAqIHRvIG1hcCBjb25zdHJhaW50cyBkaXJlY3RseSB0byBhIG1ldGEtZGF0YSB0cmFuc2Zvcm1lciBpZiB0aGVyZSBpcyBubyB2YWxpZGF0aW9uIHN0cmF0ZWd5IChyZXF1aXJlZCBieSBqc3IgMzAzKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInRoaXMgaXMganVzdCBhbiBhZGFwdGVyIGUuZy4gZm9yIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbiIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMyNWUwNC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogaXQgaXNuJ3QgbGlua2VkIHRvIGpzciAzMDMNCi0gKg0KLSAqIGl0J3MganVzdCBhIGhlbHBlciBmb3IgcHJveGllcyAtIHlvdSBqdXN0IG5lZWQgaXQsIGlmIHlvdSBkZWZpbmUgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0Lg0KLQ0KLSAqIGFkYXB0ZXIgdG8gY29ubmVjdCB2YWxpZGF0aW9uIHN0cmF0ZWdpZXMgd2l0aCBtZXRhLWRhdGEgdHJhbnNmb3JtZXJzLA0KLSAqIGlmIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIGRlZmluZWQgYXMgYmVhbiBhbmQgZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGludGVyZmFjZSBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlciBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgLy90byBnZXQgYmFjayB0aGUgaW50ZXJuYWwgY2FzaGluZw0KLSAgICBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKCk7DQotDQotICAgIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzExNmYyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBpdCBpc24ndCBsaW5rZWQgdG8ganNyIDMwMw0KLSAqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotDQotICogYWRhcHRlciB0byBjb25uZWN0IHZhbGlkYXRpb24gc3RyYXRlZ2llcyB3aXRoIG1ldGEtZGF0YSB0cmFuc2Zvcm1lcnMsDQotICogaWYgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgZGVmaW5lZCBhcyBiZWFuIGFuZCBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIC8vb3B0aW9uYWwgZmFsbGJhY2sgZm9yIGludGVybmFsIGNhc2hpbmcNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOw0KLQ0KLSAgICBwdWJsaWMgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyIGluc3RhbmNlb2YgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIpIG1ldGFEYXRhVHJhbnNmb3JtZXIgKS5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGdldE1ldGFEYXRhVHJhbnNmb3JtZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVRyYW5zZm9ybWVyKE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyID0gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsaWRhdGlvblN0cmF0ZWd5ID0gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMGExMWQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyDQotICAgIC5Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotDQotLyoqDQotICogRmFjdG9yeSB3aGljaCBjcmVhdGVzIHRoZSBWYWxpZGF0aW9uU3RyYXRlZ3kgZm9yIGEgZ2l2ZW4gTWV0YS1EYXRhIEtleQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8U3RyaW5nPg0KLSAgICAgICAgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFN0cmluZywgVmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4oKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGNyZWF0ZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIGlmIChtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRTdGF0aWNNYXBwaW5ncygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nLmNvbnRhaW5zS2V5KG1ldGFEYXRhS2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5SW5zdGFuY2UobWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcuZ2V0KG1ldGFEYXRhS2V5KSk7DQotICAgICAgICB9DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgU3RyaW5nIHN0cmF0ZWd5TmFtZTsNCi0gICAgICAgIC8vbnVsbCAtPiB1c2UgbmFtZSBtYXBwZXJzDQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8U3RyaW5nPiBuYW1lTWFwcGVyIDogbmFtZU1hcHBlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RyYXRlZ3lOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKG1ldGFEYXRhS2V5KTsNCi0NCi0gICAgICAgICAgICBpZiAoc3RyYXRlZ3lOYW1lID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5SW5zdGFuY2Uoc3RyYXRlZ3lOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKG1ldGFEYXRhS2V5LCBzdHJhdGVneU5hbWUpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZQ0KLSAgICAgICAgICAgIC5zdGFydHNXaXRoKEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLlBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFZhbGlkYXRpb25TdHJhdGVneSkgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKHZhbGlkYXRpb25TdHJhdGVneU5hbWUNCi0gICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuUFJFRklYX0ZPUl9CRUFOX01BUFBJTkcubGVuZ3RoKCkpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFZhbGlkYXRpb25TdHJhdGVneSkgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgbWV0YURhdGFLZXksIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImFkZGluZyBtZXRhLWRhdGEga2V5IHRvIHZhbGlkYXRpb24gc3RyYXRlZ3kgbWFwcGluZzogIg0KLSAgICAgICAgICAgICAgICArIG1ldGFEYXRhS2V5ICsgIiAtPiAiICsgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZy5wdXQobWV0YURhdGFLZXksIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbml0U3RhdGljTWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgLy9zZXR1cCBpbnRlcm5hbCBzdGF0aWMgbWFwcGluZ3MNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnIDoNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgPSBuZXcgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAvL3RyeSB0byBzZXR1cCBtYXBwaW5nIHdpdGggYmFzZSBuYW1lIGJ5IGNvbnZlbnRpb24gLSBvdmVycmlkZXMgZGVmYXVsdCBtYXBwaW5nDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2J1aWxkIGNvbnZlbnRpb24gKHN0cmF0ZWd5IG1hcHBpbmcpDQotICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZyhFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFKSk7DQotDQotICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotDQotICAgICAgICAvL3NldHVwIGN1c3RvbSBtYXBwaW5nIC0gb3ZlcnJpZGVzIGFsbCBvdGhlciBtYXBwaW5ncw0KLSAgICAgICAgU3RyaW5nIGN1c3RvbU1hcHBpbmdCYXNlTmFtZSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORzsNCi0gICAgICAgIGlmIChjdXN0b21NYXBwaW5nQmFzZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHN0YXRpY0NvbmZpZyA9IG5ldyBTdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZyhjdXN0b21NYXBwaW5nQmFzZU5hbWUpOw0KLSAgICAgICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cFN0cmF0ZWd5TWFwcGluZ3MoTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhtYXBwaW5nLmdldFNvdXJjZSgpLCBtYXBwaW5nLmdldFRhcmdldCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+IGdldE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZU1hcHBlckxpc3Q7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9JZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmM2EyYWIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9JZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBpZiBhbiBhZGFwdGVyIGlzIHVzZWQgZm9yIHNldmVyYWwgY29uc3RyYWludHMsIHRoaXMgaW50ZXJmYWNlIGFsbG93cyB0byBpZGVudGlmeSBpbnN0YW5jZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBTdHJpbmcgSURfUFJFRklYID0gIjoiOw0KLQ0KLSAgICBTdHJpbmcgZ2V0SWQoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NTUyM2QuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBCYXNlIGludGVyZmFjZSBmb3IgVmFsaWRhdGlvblN0cmF0ZWdpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLS8vKlZhbGlkYXRpb25TdHJhdGVneSBpbnN0ZWFkIG9mICpWYWxpZGF0b3IgdG8gYXZvaWQgbmFtaW5nIGNvbmZ1c2lvbiANCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9BYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9BYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YjNmMGQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZDk0ZjcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOw0KLQ0KLS8qKg0KLSAqIE5hbWUgTWFwcGVyIHdoaWNoIGRlbGVnYXRlcyB0aGUgbmFtZSBtYXBwaW5nLCBleHRyYWN0IHRoZSBuYW1lIGFuZCBjb252ZXJ0IGl0IHRvIGEgYmVhbiBuYW1lICsgcHJlZml4DQotICogdGFyZ2V0OiBjb25maWd1cmUgYSB2YWxpZGF0aW9uIHN0cmF0ZWd5IHZpYSBhIG1hbmFnZWQgYmVhbiBmYWNpbGl0eSAtPiBhbGxvd3MgdG8gaW5qZWN0IG90aGVyIGJlYW5zDQotICogaW5zdGVhZCBvZiBhcGkgY2FsbHMgKyBoYXJkY29kZWQgYmVhbiBuYW1lcw0KLSAqIDxwLz4NCi0gKiBhbGxvd2VkIGJlYW4gc2NvcGVzOg0KLSAqIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIHN0YXRlbGVzczogYXBwbGljYXRpb24vc2luZ2xldG9uDQotICogdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgc3RhdGVmdWw6IG5vbmUvcHJvdG90eXBlDQotICogZG9uJ3QgdXNlIHRoZSBzZXNzaW9uIG9yIGEgY29udmVyc2F0aW9uIHNjb3BlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDUwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HID0gImJlYW46IjsNCi0gICAgcHJpdmF0ZSBOYW1lTWFwcGVyPFN0cmluZz4gd3JhcHBlZDsNCi0NCi0gICAgcHVibGljIEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKE5hbWVNYXBwZXI8U3RyaW5nPiBuYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSBuYW1lTWFwcGVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbmFtZSA9IHdyYXBwZWQuY3JlYXRlTmFtZShzb3VyY2UpOw0KLQ0KLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKTsNCi0gICAgICAgIHJldHVybiBQUkVGSVhfRk9SX0JFQU5fTUFQUElORyArIEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUobmFtZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMDMyMDYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgQW5ub3RhdGlvbnMgdG8gVmFsaWRhdGlvblN0cmF0ZWdpZXMuDQotICogKGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlODMwMi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIEFubm90YXRpb25zIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMzhkOGYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBtYXBzIEV4dFZhbCBBbm5vdGF0aW9ucyB0byBFeHRWYWwgVmFsaWRhdGlvblN0cmF0ZWdpZXMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUobWV0YURhdGFLZXkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4MjA1My4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIHRvIHBsYWNlIEFubm90YXRpb25zIGFuZCBWYWxpZGF0aW9uU3RyYXRlZ2llcyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcig0MDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5ICsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Qcmlvcml0eS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMWFhMzMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGVudW0gUHJpb3JpdHkKLXsKLSAgICBCTE9DS0lORywKLSAgICBISUdILAotICAgIE1FRElVTSwKLSAgICBMT1cKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVG9Eby5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQyNWEwYS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVG9Eby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkNPTlNUUlVDVE9SOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxELCBDT05TVFJVQ1RPUn0pCi1wdWJsaWMgQGludGVyZmFjZSBUb0RvCi17Ci0gICAgUHJpb3JpdHkgdmFsdWUoKTsKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24oKSBkZWZhdWx0ICIiOwotCi0gICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgQGludGVyZmFjZSBMaXN0Ci0gICAgewotICAgICAgICBUb0RvW10gdmFsdWUoKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlQ2F0ZWdvcnkuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0N2IzODUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbDsKLQotLyoqCi0gKiBBUEk6PGJyLz4KLSAqIHBhcnRzIHlvdSBtaWdodCBuZWVkIGZvciBjdXN0b20gaW1wbGVtZW50YXRpb25zIGFuZCB3aGljaCBhcmUgcXVpdGUgc3RhYmxlIGluIHZpZXcgb2YgY2hhbmdlcwotICogPHAvPgotICogSU5URVJOQUw6PGJyLz4KLSAqIGlmIHlvdSB0aGluayBhYm91dCByZWZlcmVuY2luZyBhbiBhcnRpZmFjdCB3aGljaCBpcyBtYXJrZWQgYXMgaW50ZXJuYWwsIGFzayBmb3Igc3VwcG9ydC4KLSAqIHRoZXJlIHNob3VsZCBiZSBhIGJldHRlciBzb2x1dGlvbgotICogPHAvPgotICogQ1VTVE9NSVpBQkxFOjxici8+Ci0gKiBhIHBsYW5uZWQgZXh0ZW5zaW9uIHBvaW50IHdoaWNoIGNvbnRhaW5zIGxvZ2ljIHRvIGN1c3RvbWl6ZSB0aGUgZnJhbWV3b3JrLgotICogaWYgaXQgaXNuJ3QgYWxzbyBtYXJrZWQgYXMgQVBJIGl0IG1pZ2h0IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuCi0gKiBob3dldmVyLCB3ZSB0cnkgdG8ga2VlcCBpdCBhcyBzdGFibGUgYXMgcG9zc2libGUgYW5kIHJlYXNvbmFibGUuCi0gKiA8cC8+Ci0gKiBSRVVTRTo8YnIvPgotICogYW4gYXJ0aWZhY3Qgd2hpY2ggeW91IGNhbiByZXVzZSBmb3IgYSBjdXN0b20gaW1wbGVtZW50YXRpb24uCi0gKiBpZiBpdCBpc24ndCBtYXJrZWQgYXMgQVBJIGl0IG1pZ2h0IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuCi0gKiBob3dldmVyLCB3ZSB0cnkgdG8ga2VlcCBpdCBhcyBzdGFibGUgYXMgcG9zc2libGUgYW5kIHJlYXNvbmFibGUuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGVudW0gVXNhZ2VDYXRlZ29yeQotewotICAgIEFQSSwKLSAgICBJTlRFUk5BTCwKLSAgICBDVVNUT01JWkFCTEUsCi0gICAgUkVVU0UKLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUluZm9ybWF0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTM3ZWJjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogaXQncyBhbiBpbnRlcm5hbCBhbm5vdGF0aW9uIHRvIHByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBjb25jZXJuaW5nIHVzYWdlLWNhdGVnb3JpZXMKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeQotICovCi1AVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLXB1YmxpYyBAaW50ZXJmYWNlIFVzYWdlSW5mb3JtYXRpb24KLXsKLSAgICBVc2FnZUNhdGVnb3J5W10gdmFsdWUoKTsKLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0NsYXNzVXRpbHMuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0NsYXNzVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNlMjA1Ni4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDbGFzc1V0aWxzDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coQ2xhc3NVdGlscy5jbGFzcyk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgdHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbG9hZENsYXNzRm9yTmFtZShuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgbG9hZENsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gVHJ5IFdlYkFwcCBDbGFzc0xvYWRlciBmaXJzdA0KLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKG5hbWUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXANCi0gICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gZmFsbGJhY2s6IFRyeSBDbGFzc0xvYWRlciBmb3IgQ2xhc3NVdGlscyAoaS5lLiB0aGUgbXlmYWNlcy5qYXIgbGliKQ0KLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKG5hbWUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXANCi0gICAgICAgICAgICAgICAgQ2xhc3NVdGlscy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIDxUPiBUIHRyeVRvSW5zdGFudGlhdGVDbGFzcyhDbGFzczxUPiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRhcmdldENsYXNzLm5ld0luc3RhbmNlKCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoU3RyaW5nIGNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGluc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKFN0cmluZyBjbGFzc05hbWUpDQotICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXR1cm4gbG9hZENsYXNzRm9yTmFtZShjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SmFyVmVyc2lvbihDbGFzcyB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGNsYXNzRmlsZVBhdGggPSB0YXJnZXRDbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkucmVwbGFjZSgnLicsICcvJykgKyAiLmNsYXNzIjsNCi0gICAgICAgIFN0cmluZyBtYW5pZmVzdEZpbGVQYXRoID0gIi9NRVRBLUlORi9NQU5JRkVTVC5NRiI7DQotDQotICAgICAgICBTdHJpbmcgY2xhc3NMb2NhdGlvbiA9IHRhcmdldENsYXNzLmdldFJlc291cmNlKHRhcmdldENsYXNzLmdldFNpbXBsZU5hbWUoKSArICIuY2xhc3MiKS50b1N0cmluZygpOw0KLSAgICAgICAgU3RyaW5nIG1hbmlmZXN0RmlsZUxvY2F0aW9uID0gY2xhc3NMb2NhdGlvbg0KLSAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIGNsYXNzTG9jYXRpb24uaW5kZXhPZihjbGFzc0ZpbGVQYXRoKSAtIDEpICsgbWFuaWZlc3RGaWxlUGF0aDsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTWFuaWZlc3QobmV3IFVSTChtYW5pZmVzdEZpbGVMb2NhdGlvbikub3BlblN0cmVhbSgpKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldE1haW5BdHRyaWJ1dGVzKCkuZ2V0VmFsdWUoQXR0cmlidXRlcy5OYW1lLklNUExFTUVOVEFUSU9OX1ZFUlNJT04pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChMT0cuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIExPRy50cmFjZSgiY291bGRuJ3QgbG9hZCB2ZXJzaW9uIG9mIGphciBmaWxlIHdoaWNoIGNvbnRhaW5zICIgKyB0YXJnZXRDbGFzcy5nZXROYW1lKCksIHQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9EZWZhdWx0UHJvamVjdE5hbWUuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0RlZmF1bHRQcm9qZWN0TmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmQ2Mzk5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0RlZmF1bHRQcm9qZWN0TmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlByb2plY3RTdGFnZU5hbWU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRQcm9qZWN0TmFtZSBpbXBsZW1lbnRzIFByb2plY3RTdGFnZU5hbWUNCi17DQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkNCi0gICAgcHJpdmF0ZSBEZWZhdWx0UHJvamVjdE5hbWUoKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm5hbWUgPSBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgRGVmYXVsdFByb2plY3ROYW1lKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOw0KLSAgICB9DQotDQotICAgIHN0YXRpYyBQcm9qZWN0U3RhZ2VOYW1lIGNyZWF0ZVByb2plY3RTdGFnZU5hbWUoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFByb2plY3ROYW1lKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm5hbWU7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKHRoaXMgPT0gbykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBEZWZhdWx0UHJvamVjdE5hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIERlZmF1bHRQcm9qZWN0TmFtZSB0aGF0ID0gKERlZmF1bHRQcm9qZWN0TmFtZSkgbzsNCi0NCi0gICAgICAgIGlmICghbmFtZS5lcXVhbHModGhhdC5uYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuYW1lLmhhc2hDb2RlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZWUzZGEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlZhbGlkYXRpb25Nb2R1bGVLZXk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlByb2plY3RTdGFnZU5hbWU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkFic3RyYWN0RUxIZWxwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5FTEhlbHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY2VzTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5Lk5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLkNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkZhY2VzTWVzc2FnZVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsVXRpbHMNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0dHRVIgPSBMb2dGYWN0b3J5LmdldExvZyhFeHRWYWxVdGlscy5jbGFzcyk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19SRVFVSVJFRCA9ICJqYXZheC5mYWNlcy5jb21wb25lbnQuVUlJbnB1dC5SRVFVSVJFRCI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19SRVFVSVJFRF9ERVRBSUwgPSAiamF2YXguZmFjZXMuY29tcG9uZW50LlVJSW5wdXQuUkVRVUlSRURfZGV0YWlsIjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX01BWElNVU0gPSAiamF2YXguZmFjZXMudmFsaWRhdG9yLkxlbmd0aFZhbGlkYXRvci5NQVhJTVVNIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX01BWElNVU1fREVUQUlMID0gImphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3IuTUFYSU1VTV9kZXRhaWwiOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKENsYXNzTWFwcGluZ0ZhY3Rvcnk8U3RyaW5nLCBWYWxpZGF0aW9uU3RyYXRlZ3k+KSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlKG1ldGFEYXRhS2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICBOYW1lTWFwcGVyPFN0cmluZz4gbWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAucmVnaXN0ZXIobWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVyZWdpc3RlcihtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVueU1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlbnkobWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1ldGFEYXRhVHJhbnNmb3JtZXI+KSBFeHRWYWxDb250ZXh0DQotICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAucmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlcmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZXJlZ2lzdGVyKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbnlWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZW55KHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksIENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JXaXRoKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlV2l0aChwcm9wZXJ0aWVzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50V2l0aE1ldGFEYXRhKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgZm9yIChDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldENvbXBvbmVudEluaXRpYWxpemVycygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyLmNvbmZpZ3VyZUNvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7DQotDQotICAgICAgICBpZiAobWV0YURhdGFFbnRyeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGFEYXRhRW50cnkgPSBuZXcgTWV0YURhdGFFbnRyeSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZm9yIChWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIDogRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIXZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5hZnRlclRocm93aW5nKA0KLSAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uLCB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3IoZmluYWwgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcmVhdGVJbnRlcmNlcHRlZE1ldGFEYXRhRXh0cmFjdG9yV2l0aChtZXRhRGF0YUV4dHJhY3RvciwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGVJbnRlcmNlcHRlZE1ldGFEYXRhRXh0cmFjdG9yRm9yKA0KLSAgICAgICAgICAgIGZpbmFsIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yLCBDbGFzcyBtb2R1bGVLZXkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgaWYobW9kdWxlS2V5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCksIG1vZHVsZUtleSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvcldpdGgobWV0YURhdGFFeHRyYWN0b3IsIHByb3BlcnRpZXMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvcldpdGgoDQotICAgICAgICAgICAgZmluYWwgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IsIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBNZXRhRGF0YUV4dHJhY3RvcigpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHVibGljIFByb3BlcnR5SW5mb3JtYXRpb24gZXh0cmFjdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBPYmplY3Qgb2JqZWN0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiByZXN1bHQgPSBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgb2JqZWN0KTsNCi0NCi0gICAgICAgICAgICAgICAgYWRkUHJvcGVydGllcyhyZXN1bHQsIHByb3BlcnRpZXMpOw0KLSAgICAgICAgICAgICAgICBpbnZva2VNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMocmVzdWx0LCBwcm9wZXJ0aWVzKTsNCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkUHJvcGVydGllcyhQcm9wZXJ0eUluZm9ybWF0aW9uIHJlc3VsdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICBpZihwcm9wZXJ0aWVzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjdXN0b21Qcm9wZXJ0aWVzID0gZ2V0Q3VzdG9tUHJvcGVydGllcyhyZXN1bHQpOw0KLSAgICAgICAgICAgIGN1c3RvbVByb3BlcnRpZXMucHV0QWxsKHByb3BlcnRpZXMpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0Q3VzdG9tUHJvcGVydGllcyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKCFwcm9wZXJ0eUluZm9ybWF0aW9uLmNvbnRhaW5zSW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuQ1VTVE9NX1BST1BFUlRJRVMpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uc2V0SW5mb3JtYXRpb24oDQotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5DVVNUT01fUFJPUEVSVElFUywgbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChNYXA8U3RyaW5nLCBPYmplY3Q+KSBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkNVU1RPTV9QUk9QRVJUSUVTKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGludm9rZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyhQcm9wZXJ0eUluZm9ybWF0aW9uIHJlc3VsdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICBmb3IgKE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIDoNCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzV2l0aChwcm9wZXJ0aWVzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5hZnRlckV4dHJhY3RpbmcocmVzdWx0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VSZXNvbHZlciBnZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1lc3NhZ2VSZXNvbHZlcj4pIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLnJlZ2lzdGVyKHZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVyZWdpc3Rlcih2YWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbnlWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IHZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlbnkodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRUxIZWxwZXIgZ2V0RUxIZWxwZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5FTF9IRUxQRVJfRkFDVE9SWSwgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuY2xhc3MpLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjZXNNZXNzYWdlIGNyZWF0ZUZhY2VzTWVzc2FnZShTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZUZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBGYWNlc01lc3NhZ2UgY3JlYXRlRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkZBQ0VTX01FU1NBR0VfRkFDVE9SWSwgRmFjZXNNZXNzYWdlRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZShzZXZlcml0eSwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY2VzTWVzc2FnZSBjb252ZXJ0RmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkZBQ0VTX01FU1NBR0VfRkFDVE9SWSwgRmFjZXNNZXNzYWdlRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNvbnZlcnQoZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5RGV0YWlscyBjcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldEV4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBiYXNlT2JqZWN0Ow0KLSAgICAgICAgaWYgKGdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKHRhcmdldEV4cHJlc3Npb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmJlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgU3RyaW5nIGV4cHJlc3Npb24gPSB2YmUuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgICAgIGJhc2VPYmplY3QgPSBnZXRFTEhlbHBlcigpLmdldFZhbHVlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgdmJlLmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlEZXRhaWxzKA0KLSAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5zdWJzdHJpbmcoMiwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpLCBiYXNlT2JqZWN0LCB2YmUuZ2V0UHJvcGVydHkoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgb3JpZ2luYWwgPSBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KA0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgU3RyaW5nIG5ld0Jhc2VLZXkgPSBvcmlnaW5hbC5nZXRLZXkoKS5zdWJzdHJpbmcoMCwgb3JpZ2luYWwuZ2V0S2V5KCkubGFzdEluZGV4T2YoIi4iKSArIDEpOw0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IG5ld0Jhc2VLZXkgKyB0YXJnZXRFeHByZXNzaW9uOw0KLQ0KLSAgICAgICAgYmFzZU9iamVjdCA9IFJlZmxlY3Rpb25VdGlscy5nZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKG9yaWdpbmFsLmdldEJhc2VPYmplY3QoKSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICAgICAgbmV3S2V5LCBiYXNlT2JqZWN0LCB0YXJnZXRFeHByZXNzaW9uLnN1YnN0cmluZyh0YXJnZXRFeHByZXNzaW9uLmxhc3RJbmRleE9mKCIuIikgKyAxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEV4cHJlc3Npb24ubGVuZ3RoKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBAVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9QbGFjZUxhYmVsKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIFN0cmluZyBsYWJlbCwgaW50IGluZGV4KQ0KLSAgICB7DQotICAgICAgICBpZiAoZmFjZXNNZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsICYmIGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkuY29udGFpbnMoInsiICsgaW5kZXggKyAifSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkucmVwbGFjZSgieyIgKyBpbmRleCArICJ9IiwgbGFiZWwpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkuY29udGFpbnMoInsiICsgaW5kZXggKyAifSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNNZXNzYWdlLmdldERldGFpbCgpLnJlcGxhY2UoInsiICsgaW5kZXggKyAifSIsIGxhYmVsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VXaXRoRGVmYXVsdE1heGltdW1NZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIGludCBtYXhMZW5ndGgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZSA9IEpzZlV0aWxzLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKEpBVkFYX0ZBQ0VTX01BWElNVU0pOw0KLSAgICAgICAgU3RyaW5nIGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsID0gZmFjZXNSZXF1aXJlZE1lc3NhZ2U7DQotDQotICAgICAgICAvL3VzZSB0cnkvY2F0Y2ggZm9yIGVhc2llciBzeW5jIGJldHdlZW4gdHJ1bmsvYnJhbmNoDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoSnNmVXRpbHMuZ2V0TWVzc2FnZUZyb21BcHBsaWNhdGlvbk1lc3NhZ2VCdW5kbGUoSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IEpzZlV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKEpBVkFYX0ZBQ0VTX01BWElNVU1fREVUQUlMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2pzZiAxLjIgZG9lc24ndCBoYXZlIGEgZGV0YWlsIG1lc3NhZ2UNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZhY2VzUmVxdWlyZWRNZXNzYWdlID0gZmFjZXNSZXF1aXJlZE1lc3NhZ2UucmVwbGFjZSgiezB9IiwgIiIgKyBtYXhMZW5ndGgpOw0KLSAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbC5yZXBsYWNlKCJ7MH0iLCAiIiArIG1heExlbmd0aCk7DQotDQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc1JlcXVpcmVkTWVzc2FnZSk7DQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBAVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZSA9IEpzZlV0aWxzLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKEpBVkFYX0ZBQ0VTX1JFUVVJUkVEKTsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlOw0KLQ0KLSAgICAgICAgLy91c2UgdHJ5L2NhdGNoIGZvciBlYXNpZXIgc3luYyBiZXR3ZWVuIHRydW5rL2JyYW5jaA0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKEpzZlV0aWxzLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKEpBVkFYX0ZBQ0VTX1JFUVVJUkVEX0RFVEFJTCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsID0gSnNmVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZUZyb21BcHBsaWNhdGlvbk1lc3NhZ2VCdW5kbGUoSkFWQVhfRkFDRVNfUkVRVUlSRURfREVUQUlMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2pzZiAxLjIgZG9lc24ndCBoYXZlIGEgZGV0YWlsIG1lc3NhZ2UNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGZhY2VzUmVxdWlyZWRNZXNzYWdlKTsNCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NraXBhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBmb3IgKENsYXNzIGN1cnJlbnRDbGFzcyA6IGdldFNraXBWYWxpZGF0aW9uU3VwcG9ydENsYXNzTGlzdCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChpc1NraXBWYWxpZGF0aW9uU3VwcG9ydGVkKGN1cnJlbnRDbGFzcywgdGFyZ2V0Q2xhc3MpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9jZXNzTWV0YURhdGFFbnRyeUFmdGVyU2tpcFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdGFyZ2V0Q2xhc3MsIE1ldGFEYXRhRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBpc1NraXBhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KHRhcmdldENsYXNzKSAmJg0KLSAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlNLSVBfVkFMSURBVElPTiwgQm9vbGVhbi5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxDbGFzcz4gZ2V0U2tpcFZhbGlkYXRpb25TdXBwb3J0Q2xhc3NMaXN0KCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gc3RhdGljQ29uZmlndXJhdGlvbkxpc3QgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0U3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuU0tJUF9WQUxJREFUSU9OX1NVUFBPUlRfQ09ORklHKTsNCi0NCi0gICAgICAgIExpc3Q8Q2xhc3M+IG1hcmtlckxpc3QgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLQ0KLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzOw0KLSAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBjdXJyZW50RW50cnkgOiBzdGF0aWNDb25maWd1cmF0aW9uTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gY3VycmVudENvbmZpZ3VyYXRpb25FbnRyeSA6IGN1cnJlbnRFbnRyeS5nZXRNYXBwaW5nKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShjdXJyZW50Q29uZmlndXJhdGlvbkVudHJ5LmdldFRhcmdldCgpKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDbGFzcyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBtYXJrZXJMaXN0LmFkZChjdXJyZW50Q2xhc3MpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLndhcm4oImNvbmZpZ3VyYXRpb24gZW50cnkgcHJvdmlkZXMgYW4gaW52YWxpZCBlbnRyeTogIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjdXJyZW50Q29uZmlndXJhdGlvbkVudHJ5LmdldFRhcmdldCgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBtYXJrZXJMaXN0Ow0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NraXBWYWxpZGF0aW9uU3VwcG9ydGVkKENsYXNzIGN1cnJlbnRDbGFzcywgQ2xhc3MgdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIGlmIChjdXJyZW50Q2xhc3MuaXNBbm5vdGF0aW9uKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHRhcmdldENsYXNzLmlzQW5ub3RhdGlvblByZXNlbnQoY3VycmVudENsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoY3VycmVudENsYXNzLmlzQXNzaWduYWJsZUZyb20odGFyZ2V0Q2xhc3MpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBnZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkNCi0gICAgew0KLSAgICAgICAgaWYoaXNWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdGlvbkRlYWN0aXZhdGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkgew0KLQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNoTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PigpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgPFQ+IExpc3Q8VD4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8VD4oKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgPFQ+IFQgZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKS5nZXRGYWN0b3J5KA0KLSAgICAgICAgICAgICAgICBGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlksIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBDbGFzcyBnZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoQ2xhc3Mgc291cmNlKQ0KLSAgICB7DQotICAgICAgICAgQ2xhc3NNYXBwaW5nRmFjdG9yeTxDbGFzcywgQ2xhc3M+IHZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcyk7DQotDQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnkuY3JlYXRlKHNvdXJjZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0aW9uRGVhY3RpdmF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfVkFMSURBVElPTl9QQVJBTUVURVJTKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXhlY3V0ZUxvY2FsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5S2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcHJvcGVydGllcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPSBnZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkuZXh0cmFjdCgNCi0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbiwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKTsNCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsNCi0NCi0gICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KHByb3BlcnR5S2V5LCBwcm9wZXJ0aWVzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHByb3BlcnR5TWFwLnB1dChBbm5vdGF0aW9uLmNsYXNzLmdldE5hbWUoKSwgYW5ub3RhdGlvbik7DQotDQotICAgICAgICBmb3IgKFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIDogcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3INCi0gICAgICAgICAgICAgICAgICAgIC5iZWZvcmVWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlNYXApKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZXhlY3V0ZUxvY2FsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlLZXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHByb3BlcnRpZXMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPSBnZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkuZXh0cmFjdCgNCi0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbiwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KHByb3BlcnR5S2V5LCBwcm9wZXJ0aWVzKTsNCi0gICAgICAgICAgICBwcm9wZXJ0eU1hcC5wdXQoQW5ub3RhdGlvbi5jbGFzcy5nZXROYW1lKCksIGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZm9yIChQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA6IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5hZnRlclZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eU1hcCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImlzIHJlbmFtaW5nIG9rPyIpDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGVjdXRlR2xvYmFsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5S2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHByb3BlcnRpZXMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBtb2R1bGVLZXkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydHlNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsNCi0NCi0gICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KHByb3BlcnR5S2V5LCBwcm9wZXJ0aWVzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycyA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc0Zvcihtb2R1bGVLZXkpOw0KLQ0KLSAgICAgICAgZm9yIChQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA6IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIXByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgICAgICAgICAgICAgICAgICAuYmVmb3JlVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHByb3BlcnR5TWFwKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImlzIHJlbmFtaW5nIG9rPyIpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBleGVjdXRlR2xvYmFsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlLZXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwcm9wZXJ0aWVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBtb2R1bGVLZXkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydHlNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KHByb3BlcnR5S2V5LCBwcm9wZXJ0aWVzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycyA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc0Zvcihtb2R1bGVLZXkpOw0KLQ0KLSAgICAgICAgZm9yIChQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA6IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5hZnRlclZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eU1hcCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyA8VD4gVCBnZXRTdG9yYWdlKENsYXNzPFQ+IHN0b3JhZ2VUeXBlLCBTdHJpbmcgc3RvcmFnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoVCkgZ2V0U3RvcmFnZU1hbmFnZXJGYWN0b3J5KCkuY3JlYXRlKHN0b3JhZ2VUeXBlKS5jcmVhdGUoc3RvcmFnZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldFN0b3JhZ2UoQ2xhc3Mgc3RvcmFnZVR5cGUsIFN0cmluZyBzdG9yYWdlTmFtZSkNCi0gICAgew0KLSAgICAgICAgZ2V0U3RvcmFnZU1hbmFnZXJGYWN0b3J5KCkuY3JlYXRlKHN0b3JhZ2VUeXBlKS5yZXNldChzdG9yYWdlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxDbGFzcywgU3RvcmFnZU1hbmFnZXI+IGdldFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0VHJhbnNmb3JtZWRNZXRhRGF0YShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFRyYW5zZm9ybWVkTWV0YURhdGFGb3IoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFRyYW5zZm9ybWVkTWV0YURhdGFGb3IoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIENsYXNzIG1vZHVsZUtleSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBpZihtb2R1bGVLZXkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzLmdldE5hbWUoKSwgbW9kdWxlS2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBnZXRUcmFuc2Zvcm1lZE1ldGFEYXRhV2l0aChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBwcm9wZXJ0aWVzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0VHJhbnNmb3JtZWRNZXRhRGF0YVdpdGgoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi0gICAgICAgIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKTsNCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JXaXRoKHByb3BlcnRpZXMpOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YTsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGFSZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IG1ldGFEYXRhRXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCkuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWV0YURhdGEgPSB0cmFuc2Zvcm1NZXRhRGF0YSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uU3RyYXRlZ3ksIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLCBtZXRhRGF0YSwgZW50cnkpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoIWlzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Ta2lwcGVkKG1ldGFEYXRhLCBlbnRyeSwgdmFsaWRhdGlvblN0cmF0ZWd5KSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgLy9kb24ndCBicmVhayBtYXliZSB0aGVyZSBhcmUgY29uc3RyYWludHMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCB0aGUgc2tpcC1tZWNoYW5pc20NCi0gICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhUmVzdWx0LnB1dEFsbChtZXRhRGF0YSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWV0YURhdGFSZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpcFZhbGlkYXRpb25FdmFsdWF0b3Igc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSwgTWV0YURhdGFFbnRyeSBlbnRyeSkNCi0gICAgew0KLSAgICAgICAgaWYgKCFza2lwVmFsaWRhdGlvbkV2YWx1YXRvci5za2lwVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uU3RyYXRlZ3ksIGVudHJ5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSk7DQotDQotICAgICAgICAgICAgaWYgKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmRlYnVnKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbWV0YURhdGFUcmFuc2Zvcm1lci5jb252ZXJ0TWV0YURhdGEoZW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtZXRhRGF0YTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Ta2lwcGVkKE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEsIE1ldGFEYXRhRW50cnkgZW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhLmlzRW1wdHkoKSB8fA0KLSAgICAgICAgICAgICAgICAoQm9vbGVhbi5UUlVFLmVxdWFscyhlbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5TS0lQX1ZBTElEQVRJT04sIEJvb2xlYW4uY2xhc3MpKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlzU2tpcGFibGVWYWxpZGF0aW9uU3RyYXRlZ3koUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcygNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MpKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGludGVycHJldEVtcHR5U3RyaW5nVmFsdWVzQXNOdWxsKCkNCi0gICAgew0KLSAgICAgICAgLy90byBkZWFjdGl2YXRlOiB0aGUgcGFyYW1ldGVyIGhhcyB0byBiZSBleHBsaWNpdGx5IGZhbHNlDQotICAgICAgICByZXR1cm4gISJmYWxzZSIuZXF1YWxzSWdub3JlQ2FzZShXZWJYbWxQYXJhbWV0ZXIuSU5URVJQUkVUX0VNUFRZX1NUUklOR19TVUJNSVRURURfVkFMVUVTX0FTX05VTEwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZUVtcHR5RmllbGRzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICEiZmFsc2UiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLlZBTElEQVRFX0VNUFRZX0ZJRUxEUyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eURldGFpbHMgZ2V0UHJvcGVydHlEZXRhaWxzKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudElkKA0KLSAgICAgICAgICAgIFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkNCi0gICAgew0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gZmluZENvbXBvbmVudChjbGllbnRJZCk7DQotDQotICAgICAgICB0cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50KHRhcmdldENvbXBvbmVudCwgZmFjZXNNZXNzYWdlLCB0aHJvd2FibGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50KA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKQ0KLSAgICB7DQotICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGludGVycHJldGVyID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIGlmIChpbnRlcnByZXRlci5zZXZlcml0eUNhdXNlc1ZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBmYWNlc01lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHRocm93YWJsZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKGZhY2VzTWVzc2FnZSwgdGhyb3dhYmxlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50KHVpQ29tcG9uZW50LCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb0FkZFZpb2xhdGlvbk1lc3NhZ2VGb3JDb21wb25lbnRJZChTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IGZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgaWYgKHRhcmdldENvbXBvbmVudCA9PSBudWxsICYmIGNsaWVudElkICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yVGVzdENsaWVudElkKGNsaWVudElkLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIHRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudCh0YXJnZXRDb21wb25lbnQsIGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInJlcXVpcmVkIGZvciB0ZXN0IGZyYW1ld29ya3MgLSBnb2FsOiByZW1vdmUgaXQiKQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvclRlc3RDbGllbnRJZChTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgaWYgKGludGVycHJldGVyLnNldmVyaXR5Q2F1c2VzVmlvbGF0aW9uTWVzc2FnZShmYWNlc0NvbnRleHQsIG51bGwsIGZhY2VzTWVzc2FnZS5nZXRTZXZlcml0eSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRGYWNlc01lc3NhZ2UoY2xpZW50SWQsIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICB9DQotICAgICAgICB0cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnQobnVsbCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGludGVycHJldGVyID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIGlmIChpbnRlcnByZXRlci5zZXZlcml0eUNhdXNlc1Zpb2xhdGlvbk1lc3NhZ2UoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh1aUNvbXBvbmVudCAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkRmFjZXNNZXNzYWdlKHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCksIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFkZEZhY2VzTWVzc2FnZShudWxsLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHRyeVRvQmxvY2tzTmF2aWdhdGlvbkZvckNvbXBvbmVudCh1aUNvbXBvbmVudCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIGFkZEZhY2VzTWVzc2FnZShudWxsLCBmYWNlc01lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGYWNlc01lc3NhZ2UoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2VTdG9yYWdlIHN0b3JhZ2UgPSBnZXRTdG9yYWdlKEZhY2VzTWVzc2FnZVN0b3JhZ2UuY2xhc3MsIEZhY2VzTWVzc2FnZVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGlmIChzdG9yYWdlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RvcmFnZS5hZGRGYWNlc01lc3NhZ2UoY2xpZW50SWQsIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmFkZE1lc3NhZ2UoY2xpZW50SWQsIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvQmxvY2tzTmF2aWdhdGlvbkZvckNvbXBvbmVudElkKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gZmluZENvbXBvbmVudChjbGllbnRJZCk7DQotDQotICAgICAgICB0cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnQodGFyZ2V0Q29tcG9uZW50LCBmYWNlc01lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgaWYgKGludGVycHJldGVyLnNldmVyaXR5QmxvY2tzTmF2aWdhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBmYWNlc01lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLnJlbmRlclJlc3BvbnNlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNldmVyaXR5QmxvY2tzU3VibWl0Rm9yQ29tcG9uZW50SWQoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGludGVycHJldGVyID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IGZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGludGVycHJldGVyLnNldmVyaXR5QmxvY2tzU3VibWl0KGZhY2VzQ29udGV4dCwgdGFyZ2V0Q29tcG9uZW50LCBmYWNlc01lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSk7DQotICAgIH0NCi0NCi0gICAgLy9hdmFpbGFibGUgZm9yIGFkZC1vbnMgLSBub3QgdXNlZCBpbnRlcm5hbGx5IGR1ZSB0byBwZXJmb3JtYW5jZSByZWFzb25zDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXZlcml0eVNob3dzSW5kaWNhdGlvbkZvckNvbXBvbmVudElkKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBpbnRlcnByZXRlciA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBVSUNvbXBvbmVudCB0YXJnZXRDb21wb25lbnQgPSBmaW5kQ29tcG9uZW50KGNsaWVudElkKTsNCi0NCi0gICAgICAgIHJldHVybiBpbnRlcnByZXRlci5zZXZlcml0eVNob3dzSW5kaWNhdGlvbihmYWNlc0NvbnRleHQsIHRhcmdldENvbXBvbmVudCwgZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFVJQ29tcG9uZW50IGZpbmRDb21wb25lbnQoU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICBVSUNvbXBvbmVudCB0YXJnZXRDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKGNsaWVudElkICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0Q29tcG9uZW50ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZmluZENvbXBvbmVudChjbGllbnRJZCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdGFyZ2V0Q29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgY29tcG9uZW50IGluaXRpYWxpemF0aW9uIGZvciByZXF1aXJlZCB2YWxpZGF0aW9uIGlzIGFjdGl2YXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvbkFjdGl2ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBCb29sZWFuLlRSVUUuZXF1YWxzKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KCJtb2RlOmluaXQ6cmVxdWlyZWQiKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIG5lZWRlZCBmb3Igc29tZSBjb21wb25lbnQgbGlicyAtIGlmIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIGlzIHVzZWQgZS5nLiBmb3IgdmlzdWFsIGluZGljYXRvcnMNCi0gICAgICogYnV0IGZlYXR1cmVzIGxpa2Ugc2V2ZXJpdHkgYXdhcmUgdmFsaWRhdGlvbiBhcmVuJ3QgdXNlZC4NCi0gICAgICogaW4gc3VjaCBhIGNhc2UgaXQncyBwb3NzaWJsZSB0byB1c2UgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZS4NCi0gICAgICogDQotICAgICAqIEByZXR1cm4gZmFsc2UgdG8gZGVhY3RpdmF0ZSB0aGUgZmluYWwgcmVzZXQgb2YgdGhlIHZhbHVlIG9mIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGUNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlcXVpcmVkUmVzZXRBY3RpdmF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFLmVxdWFscyhFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eSgibW9kZTpyZXNldDpyZXF1aXJlZCIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFByb2plY3RTdGFnZU5hbWUgZ2V0RGVmYXVsdFN0YWdlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcmVhdGVQcm9qZWN0U3RhZ2VOYW1lKCJQcm9kdWN0aW9uIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0U3RhZ2VOYW1lIGNyZWF0ZVByb2plY3RTdGFnZU5hbWUoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBEZWZhdWx0UHJvamVjdE5hbWUuY3JlYXRlUHJvamVjdFN0YWdlTmFtZShuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRWYWxEZWFjdGl2YXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShTeXN0ZW0NCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsNCi0gICAgICAgICAgICAgICAgICAgICIuREVBQ1RJVkFURV9BTEwiLCAiZmFsc2UiKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvR3JvdXBVdGlscy5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvR3JvdXBVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODVlYWIzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0dyb3VwVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgR3JvdXBVdGlscw0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R3JvdXBLZXkoU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY2xpZW50SWQgPT0gbnVsbCA/IHZpZXdJZCA6IHZpZXdJZCArICJAIiArIGNsaWVudElkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0pzZlV0aWxzLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTc2ZWNhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0pzZlV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZTsNCi1pbXBvcnQgamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZUZhY3Rvcnk7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOw0KLQ0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpzZlV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3RlclBoYXNlTGlzdGVuZXIoUGhhc2VMaXN0ZW5lciBwaGFzZUxpc3RlbmVyKQ0KLSAgICB7DQotICAgICAgICBMaWZlY3ljbGVGYWN0b3J5IGxpZmVjeWNsZUZhY3RvcnkgPSAoTGlmZWN5Y2xlRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRmFjdG9yeUZpbmRlci5MSUZFQ1lDTEVfRkFDVE9SWSk7DQotDQotICAgICAgICBTdHJpbmcgY3VycmVudElkOw0KLSAgICAgICAgTGlmZWN5Y2xlIGN1cnJlbnRMaWZlY3ljbGU7DQotICAgICAgICBJdGVyYXRvciBsaWZlY3ljbGVJZHMgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZUlkcygpOw0KLSAgICAgICAgd2hpbGUgKGxpZmVjeWNsZUlkcy5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudElkID0gKFN0cmluZykgbGlmZWN5Y2xlSWRzLm5leHQoKTsNCi0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlID0gbGlmZWN5Y2xlRmFjdG9yeS5nZXRMaWZlY3ljbGUoY3VycmVudElkKTsNCi0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlLnJlbW92ZVBoYXNlTGlzdGVuZXIocGhhc2VMaXN0ZW5lcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyUGhhc2VMaXN0ZW5lcihQaGFzZUxpc3RlbmVyIHBoYXNlTGlzdGVuZXIpDQotICAgIHsNCi0gICAgICAgIExpZmVjeWNsZUZhY3RvcnkgbGlmZWN5Y2xlRmFjdG9yeSA9IChMaWZlY3ljbGVGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShGYWN0b3J5RmluZGVyLkxJRkVDWUNMRV9GQUNUT1JZKTsNCi0NCi0gICAgICAgIFN0cmluZyBjdXJyZW50SWQ7DQotICAgICAgICBMaWZlY3ljbGUgY3VycmVudExpZmVjeWNsZTsNCi0gICAgICAgIEl0ZXJhdG9yIGxpZmVjeWNsZUlkcyA9IGxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlSWRzKCk7DQotICAgICAgICB3aGlsZSAobGlmZWN5Y2xlSWRzLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50SWQgPSAoU3RyaW5nKSBsaWZlY3ljbGVJZHMubmV4dCgpOw0KLSAgICAgICAgICAgIGN1cnJlbnRMaWZlY3ljbGUgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZShjdXJyZW50SWQpOw0KLSAgICAgICAgICAgIGN1cnJlbnRMaWZlY3ljbGUuYWRkUGhhc2VMaXN0ZW5lcihwaGFzZUxpc3RlbmVyKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShGYWNlc01lc3NhZ2UuRkFDRVNfTUVTU0FHRVMsIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldEN1c3RvbUZhY2VzTWVzc2FnZUJ1bmRsZSgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBTdHJpbmcgYnVuZGxlTmFtZSA9IGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmdldE1lc3NhZ2VCdW5kbGUoKTsNCi0NCi0gICAgICAgIGlmIChidW5kbGVOYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGJ1bmRsZU5hbWUsIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZShTdHJpbmcgbWVzc2FnZUtleSkNCi0gICAgew0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgY3VzdG9tUmVzb3VyY2VCdW5kbGUgPSBnZXRDdXN0b21GYWNlc01lc3NhZ2VCdW5kbGUoKTsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChjdXN0b21SZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbVJlc291cmNlQnVuZGxlLmdldFN0cmluZyhtZXNzYWdlS2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9ubyBjdXN0b20gbWVzc2FnZSBpcyBhdmFpbGFibGUgLSBkbyBub3RoaW5nDQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhtZXNzYWdlS2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZW5kZXJSZXNwb25zZVBoYXNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuUkVOREVSX1JFU1BPTlNFLmVxdWFscyhnZXRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZSgpLmdldEN1cnJlbnRQaGFzZUlkKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUGhhc2VJZCBnZXRDdXJyZW50UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZSgpLmdldEN1cnJlbnRQaGFzZUlkKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHNpbXBsZSB0ZXN0IGZvciBlYXJseSBjb25maWcgaW4gY2FzZSBvZiBtb2phcnJhDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUganNmIGltcGwuIGlzIGluaXRpYWxpemVkIGFuZCBpdCdzIHBvc3NpYmxlIHRvIHVzZSBpdCBhcyBleHBlY3RlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXBwbGljYXRpb25Jbml0aWFsaXplZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuc3RhcnRzV2l0aCgib3JnLmFwYWNoZS5teWZhY2VzIikgfHwNCi0gICAgICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKSAhPSBudWxsICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgIUZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkuaXNFbXB0eSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlIGdldEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MsIEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUHJveHlVdGlscy5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUHJveHlVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzVjMjNlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Byb3h5VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5Qcm94eUhlbHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHkuRGVmYXVsdFByb3h5SGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQcm94eVV0aWxzDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBQcm94eUhlbHBlciBwcm94eUhlbHBlcjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyA8VD4gQ2xhc3M8VD4gZ2V0VW5wcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzLCBDbGFzczxUPiB0YXJnZXRUeXBlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UHJveHlIZWxwZXIoKS5nZXRVbnByb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MsIHRhcmdldFR5cGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0VW5wcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UHJveHlIZWxwZXIoKS5nZXRVbnByb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsYXNzTmFtZShDbGFzcyBwcm94aWVkQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRQcm94eUhlbHBlcigpLmdldE5hbWVPZkNsYXNzKHByb3hpZWRDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lT2ZPYmplY3QoT2JqZWN0IHByb3hpZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRQcm94eUhlbHBlcigpLmdldENsYXNzTmFtZU9mT2JqZWN0KHByb3hpZWRPYmplY3QpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb3hpZWRDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRQcm94eUhlbHBlcigpLmlzUHJveGllZENsYXNzKGN1cnJlbnRDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJveGllZE9iamVjdChPYmplY3QgcHJveGllZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFByb3h5SGVscGVyKCkuaXNQcm94aWVkT2JqZWN0KHByb3hpZWRPYmplY3QpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFByb3h5SGVscGVyIGdldFByb3h5SGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYgKHByb3h5SGVscGVyID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy93b3JrYXJvdW5kIGZvciBtb2phcnJhDQotICAgICAgICAgICAgaWYoIUpzZlV0aWxzLmlzQXBwbGljYXRpb25Jbml0aWFsaXplZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UHJveHlIZWxwZXIoKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHJveHlIZWxwZXIgPSBjcmVhdGVQcm94eUhlbHBlcigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHByb3h5SGVscGVyOw0KLSAgICB9DQotDQotICAgIC8vZG9uJ3QgdXNlIHRoZSBkZWZhdWx0IGFwcHJvYWNoIChmYWN0b3J5IGZpbmRlcikgLSBQcm94eUhlbHBlciBpcyBjYWxsZWQgdG9vIG9mdGVuLi4uDQotICAgIHByaXZhdGUgc3RhdGljIFByb3h5SGVscGVyIGNyZWF0ZVByb3h5SGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1c3RvbVByb3h5SGVscGVyQ2xhc3NOYW1lID0gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9QUk9YWV9IRUxQRVI7DQotDQotICAgICAgICBQcm94eUhlbHBlciByZXN1bHQgPSBudWxsOw0KLSAgICAgICAgaWYoY3VzdG9tUHJveHlIZWxwZXJDbGFzc05hbWUgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKGN1c3RvbVByb3h5SGVscGVyQ2xhc3NOYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSAoUHJveHlIZWxwZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGN1c3RvbVByb3h5SGVscGVyQ2xhc3NOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBEZWZhdWx0UHJveHlIZWxwZXIoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9SZWZsZWN0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUwNjJiZi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9SZWZsZWN0aW9uVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFJlZmxlY3Rpb25VdGlscwotewotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIHRyeVRvR2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0TWV0aG9kTmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0dldE1ldGhvZCh0YXJnZXRDbGFzcywgdGFyZ2V0TWV0aG9kTmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgdHJ5VG9HZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lLCBDbGFzcy4uLiBwYXJhbWV0ZXJUeXBlcykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0TWV0aG9kKHRhcmdldENsYXNzLCB0YXJnZXRNZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0TWV0aG9kTmFtZSkKLSAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldE1ldGhvZCh0YXJnZXRDbGFzcywgdGFyZ2V0TWV0aG9kTmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0TWV0aG9kTmFtZSwgQ2xhc3MuLi4gcGFyYW1ldGVyVHlwZXMpCi0gICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IHRhcmdldENsYXNzOwotICAgICAgICBNZXRob2QgdGFyZ2V0TWV0aG9kID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlICghT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY3VycmVudENsYXNzLmdldE5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IGN1cnJlbnRDbGFzcy5nZXREZWNsYXJlZE1ldGhvZCh0YXJnZXRNZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudENsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKENsYXNzIGN1cnJlbnRJbnRlcmZhY2UgOiB0YXJnZXRDbGFzcy5nZXRJbnRlcmZhY2VzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudEludGVyZmFjZTsKLQotICAgICAgICAgICAgICAgIHdoaWxlIChjdXJyZW50Q2xhc3MgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNZXRob2QgPSBjdXJyZW50Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QodGFyZ2V0TWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGFyZ2V0TWV0aG9kICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0YXJnZXRNZXRob2Q7Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKCJ0aGVyZSBpcyBubyBtZXRob2Qgd2l0aCB0aGUgbmFtZSAnIiArIHRhcmdldE1ldGhvZE5hbWUgKyAiJyIgKwotICAgICAgICAgICAgICAgICIgY2xhc3M6ICIgKyB0YXJnZXRDbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ5VG9JbnZva2VNZXRob2QodGFyZ2V0LCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ5VG9JbnZva2VNZXRob2RPZkNsYXNzKHRhcmdldCwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbnZva2VNZXRob2RPZkNsYXNzKHRhcmdldCwgbWV0aG9kLCBhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0Lm5ld0luc3RhbmNlKCksIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdC4uLiBhcmdzKQotICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQubmV3SW5zdGFuY2UoKSwgbWV0aG9kLCBhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kLCBPYmplY3QuLi4gYXJncykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldCwgbWV0aG9kLCBhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0LCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kLCBPYmplY3QuLi4gYXJncykKLSAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICByZXR1cm4gbWV0aG9kLmludm9rZSh0YXJnZXQsIGFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEJhc2VPZlByb3BlcnR5Q2hhaW4oT2JqZWN0IGJhc2VPYmplY3QsIFN0cmluZyBwcm9wZXJ0eUNoYWluKQotICAgIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocHJvcGVydHlDaGFpbiwgIi4iKTsKLQotICAgICAgICBPYmplY3QgY3VycmVudEJhc2UgPSBiYXNlT2JqZWN0OwotICAgICAgICBTdHJpbmcgY3VycmVudFByb3BlcnR5OwotICAgICAgICBNZXRob2QgY3VycmVudE1ldGhvZDsKLQotICAgICAgICB3aGlsZSh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjdXJyZW50UHJvcGVydHkgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0KLSAgICAgICAgICAgIC8vaWdub3JlIHRoZSBsYXN0IHByb3BlcnR5Ci0gICAgICAgICAgICBpZighdG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9ubyBpcyAtIGl0J3Mgb25seSBwb3NzaWJsZSBhdCBwcm9wZXJ0aWVzIG5vdCBhdCBiZWFuIGxldmVsCi0gICAgICAgICAgICBjdXJyZW50TWV0aG9kID0gdHJ5VG9HZXRNZXRob2QoUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhjdXJyZW50QmFzZS5nZXRDbGFzcygpKSwKLSAgICAgICAgICAgICAgICAiZ2V0IiArIGN1cnJlbnRQcm9wZXJ0eS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eS5zdWJzdHJpbmcoMSwgY3VycmVudFByb3BlcnR5Lmxlbmd0aCgpKSk7Ci0gICAgICAgICAgICBjdXJyZW50QmFzZSA9IHRyeVRvSW52b2tlTWV0aG9kKGN1cnJlbnRCYXNlLCBjdXJyZW50TWV0aG9kKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjdXJyZW50QmFzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvV2ViWG1sVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwNzY5Yy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBXZWJYbWxVdGlscw0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW5pdFBhcmFtZXRlcihTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0SW5pdFBhcmFtZXRlcihFeHRWYWxJbmZvcm1hdGlvbi5XRUJYTUxfUEFSQU1fUFJFRklYLCBrZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEluaXRQYXJhbWV0ZXIoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwYXJhbWV0ZXJOYW1lID0gbmFtZTsNCi0gICAgICAgIGlmKHByZWZpeCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHBhcmFtZXRlck5hbWUgPSBwcmVmaXggKyAiLiIgKyBuYW1lOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldEluaXRQYXJhbWV0ZXIocGFyYW1ldGVyTmFtZSk7DQotICAgICAgICByZXR1cm4gKHZhbHVlICE9IG51bGwpID8gdmFsdWUucmVwbGFjZSgiICIsICIiKS50cmltKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDA5MmZiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUgTW9kdWxlDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUgTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSBNb2R1bGUgcHJvdmlkZXMgYW4gZXh0ZW5zaWJsZSB2YWxpZGF0aW9uIHBsYXRmb3JtIHRvIGltcGxlbWVudCB2YWxpZGF0aW9uIGJhc2VkIG9uIG1ldGEtZGF0YS4NCi0gICAgQmFzZWQgb24gdGhpcyBtb2R1bGUgaXQgaXMgcG9zc2libGUgdG8gaW1wbGVtZW50IHZhbGlkYXRpb24gbW9kdWxlcy4NCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEueCBhbmQgSlNGIDIueC4gQWxsIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9wb20ueG1sIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDEwMjYwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgRXhhbXBsZXMgQXNzZW1ibHk8L25hbWU+DQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZXhhbXBsZXMtYXNzZW1ibHkxMjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4yLjAuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5kZXBlbmRlbmN5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LXdhcjwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+CQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS93YXI8L291dHB1dERpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktc3JjPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fd29ybGQ8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPmphdmEtc291cmNlPC90eXBlPiAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmVhdHVyZS1zZXRfMDE8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPmphdmEtc291cmNlPC90eXBlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zcmM8L291dHB1dERpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4gICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotDQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPCEtLSBFWEVDVVRFIG12biBwYWNrYWdlIHRvIGdlbmVyYXRlIGFzc2VtYmx5IGZpbGVzIC0tPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X3NyYzwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXNzZW1ibHk8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPiAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbDwvZGVzY3JpcHRvcj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5teWZhY2VzLWV4dHZhbC1leGFtcGxlcy0ke3Byb2plY3QudmVyc2lvbn0tc3JjPC9maW5hbE5hbWU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L291dDwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS93b3JrPC93b3JrRGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfYmluPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hc3NlbWJseTwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLQkgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLQkgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+ICAgDQotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9kZXAueG1sPC9kZXNjcmlwdG9yPg0KLQkgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPg0KLQkgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsLWV4YW1wbGVzLSR7cHJvamVjdC52ZXJzaW9ufTwvZmluYWxOYW1lPg0KLQkgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L291dDwvb3V0cHV0RGlyZWN0b3J5Pg0KLQkgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS93b3JrPC93b3JrRGlyZWN0b3J5Pg0KLQkgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotCSAgICANCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPndhZ29uLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wLjE8L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGlkPm15ZmFjZXMtbmlnaHRseS1idWlsZHM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9taW5vdGF1ci5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9idWlsZHMvbXlmYWNlcy9uaWdodGx5PC91cmw+DQotICAgICAgICAgICAgICAgICAgICA8aW5wdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9pbnB1dERpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLQ0KLSAgICAgICAgPC9wbHVnaW5zPg0KLQ0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYjNlYzQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPGFzc2VtYmx5Pg0KLSAgPGlkPmJpbjwvaWQ+DQotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5Pg0KLSAgPGZvcm1hdHM+DQotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+DQotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+DQotICA8L2Zvcm1hdHM+CQ0KLSAgPGZpbGVTZXRzPiAgICANCi0gICAgPGZpbGVTZXQ+DQotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvd2FyPC9kaXJlY3Rvcnk+DQotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4NCi0gICAgICA8aW5jbHVkZXM+DQotICAgICAgICA8aW5jbHVkZT4qLndhcjwvaW5jbHVkZT4NCi0gICAgICA8L2luY2x1ZGVzPg0KLSAgICA8L2ZpbGVTZXQ+ICAgICANCi0gIDwvZmlsZVNldHM+DQotPC9hc3NlbWJseT4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWwgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYTU4MDMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPGFzc2VtYmx5Pg0KLSAgPGlkPnNyYzwvaWQ+DQotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5Pg0KLSAgPGZvcm1hdHM+DQotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+DQotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+DQotICA8L2Zvcm1hdHM+CQ0KLSAgPGZpbGVTZXRzPiAgICANCi0gICAgPGZpbGVTZXQ+DQotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvc3JjPC9kaXJlY3Rvcnk+DQotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4NCi0gICAgICA8aW5jbHVkZXM+DQotICAgICAgICA8aW5jbHVkZT4qLmphcjwvaW5jbHVkZT4NCi0gICAgICA8L2luY2x1ZGVzPg0KLSAgICA8L2ZpbGVTZXQ+DQotICAgIDxmaWxlU2V0Pg0KLSAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4NCi0gICAgICA8aW5jbHVkZXM+DQotICAgICAgICA8aW5jbHVkZT4qLnR4dDwvaW5jbHVkZT4NCi0gICAgICA8L2luY2x1ZGVzPg0KLSAgICA8L2ZpbGVTZXQ+DQotICA8L2ZpbGVTZXRzPg0KLTwvYXNzZW1ibHk+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvZXhhbXBsZXMvcG9tLnhtbCBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvZXhhbXBsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU0NDU0MS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2V4YW1wbGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotDQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBwcm9qZWN0PC9uYW1lPg0KLSAgICA8dmVyc2lvbj4yLjAuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPHNjbT4NCi0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2V4YW1wbGVzPC9jb25uZWN0aW9uPg0KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2V4YW1wbGVzPC9kZXZlbG9wZXJDb25uZWN0aW9uPg0KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvZXhhbXBsZXM8L3VybD4NCi0gICAgPC9zY20+DQotICAgIA0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8IS0tVGhpcyBwbHVnaW4gYWxsb3dzIHRvIHJ1biB0aGUgZXhhbXBsZSB1c2luZyBtdm4gamV0dHk6cnVuIC0tPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamV0dHktcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj42LjEuODwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8c2NhbkludGVydmFsU2Vjb25kcz4xMDwvc2NhbkludGVydmFsU2Vjb25kcz4NCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLSAgICA8bW9kdWxlcz4NCi0gICAgICAgIDwhLS1tb2R1bGU+aGVsbG9fd29ybGQ8L21vZHVsZS0tPg0KLSAgICAgICAgPCEtLW1vZHVsZT5oZWxsb19iZWFuLXZhbGlkYXRpb248L21vZHVsZS0tPg0KLSAgICAgICAgPCEtLW1vZHVsZT5mZWF0dXJlLXNldF8wMTwvbW9kdWxlLS0+DQotICAgIDwvbW9kdWxlcz4NCi0NCi0gICAgPHByb2ZpbGVzPg0KLSAgICAgICAgPCEtLSBUaGlzIHByb2ZpbGUgaXMgaW52b2tlZCBieSAtRHByZXBhcmVSZWxlYXNlPXRydWUuICBUaGlzIGFsbG93cyBtdm4gcmVsZWFzZTpwcmVwYXJlIHRvDQotICAgICAgICAgICAgcnVuIHN1Y2Nlc3NmdWxseSBvbiB0aGUgYXNzZW1ibHkgcHJvamVjdHMuIC0tPg0KLSAgICAgICAgPHByb2ZpbGU+DQotICAgICAgICAgICAgPGlkPnByZXBhcmUtcmVsZWFzZTwvaWQ+DQotICAgICAgICAgICAgPGFjdGl2YXRpb24+DQotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4NCi0gICAgICAgICAgICAgICAgICAgIDxuYW1lPnByZXBhcmVSZWxlYXNlPC9uYW1lPg0KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4NCi0gICAgICAgICAgICA8bW9kdWxlcz4NCi0gICAgICAgICAgICAgICAgPG1vZHVsZT5hc3NlbWJseTwvbW9kdWxlPg0KLSAgICAgICAgICAgIDwvbW9kdWxlcz4NCi0gICAgICAgICAgICA8YnVpbGQ+DQotICAgICAgICAgICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZWxlYXNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ3VtZW50cz4tRHByZXBhcmVSZWxlYXNlPC9hcmd1bWVudHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4NCi0gICAgICAgICAgICA8L2J1aWxkPg0KLSAgICAgICAgPC9wcm9maWxlPg0KLSAgICA8L3Byb2ZpbGVzPg0KLQ0KLSAgICA8cHJvcGVydGllcz4NCi0gICAgICAgIDx0cmluaWRhZC52ZXJzaW9uPjIuMC4wLWFscGhhLTI8L3RyaW5pZGFkLnZlcnNpb24+DQotICAgIDwvcHJvcGVydGllcz4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9wYXJlbnQvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3BhcmVudC9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViNTI0OC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3BhcmVudC9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQotDQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TDQotDQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLg0KLQ0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nDQotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIg0KLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlDQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUNCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGENCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlDQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyDQotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLg0KLQ0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQ0KLQ0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvcGFyZW50L05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3BhcmVudC9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvcGFyZW50L05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3BhcmVudC9wb20ueG1sIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9wYXJlbnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmNjE3Ny4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3BhcmVudC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08IS0tDQotICAtIFBhcmVudCBwb20gb2YgYWxsIHRoZSBteWZhY2VzIGV4dGVuc2lvbnMgdmFsaWRhdG9yIHN1YnByb2plY3RzIA0KLSAgICB0aGF0IGhlbHAgdG8gYnVpbGQgb3RoZXIgbXlmYWNlcyBwcm9qZWN0cy4NCi0gIC0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlczwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4NCi0gICAgPHZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFByb2plY3QgUGFyZW50PC9uYW1lPg0KLSAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IyMDwvdXJsPg0KLQ0KLSAgICA8aXNzdWVNYW5hZ2VtZW50Pg0KLSAgICAgICAgPHN5c3RlbT5qaXJhPC9zeXN0ZW0+DQotICAgICAgICA8dXJsPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9FWFRWQUw8L3VybD4NCi0gICAgPC9pc3N1ZU1hbmFnZW1lbnQ+DQotDQotICAgIDxjaU1hbmFnZW1lbnQ+DQotICAgICAgICA8c3lzdGVtPmNvbnRpbnV1bTwvc3lzdGVtPg0KLSAgICAgICAgPHVybD5odHRwOi8vbXlmYWNlcy56b25lcy5hcGFjaGUub3JnOjgwODAvY29udGludXVtPC91cmw+DQotICAgICAgICA8bm90aWZpZXJzPg0KLSAgICAgICAgICAgIDxub3RpZmllcj4NCi0gICAgICAgICAgICAgICAgPHR5cGU+bWFpbDwvdHlwZT4NCi0gICAgICAgICAgICAgICAgPHNlbmRPblN1Y2Nlc3M+dHJ1ZTwvc2VuZE9uU3VjY2Vzcz4NCi0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8YWRkcmVzcz5jb21taXRzQG15ZmFjZXMuYXBhY2hlLm9yZzwvYWRkcmVzcz4NCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgIDwvbm90aWZpZXI+DQotICAgICAgICA8L25vdGlmaWVycz4NCi0gICAgPC9jaU1hbmFnZW1lbnQ+DQotICAgIA0KLSAgICA8aW5jZXB0aW9uWWVhcj4yMDA4PC9pbmNlcHRpb25ZZWFyPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cmVzb3VyY2VzPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9PC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgPC9yZXNvdXJjZXM+DQotDQotICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4NCi0gICAgICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmU+DQotICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgIDwvcGx1Z2lucz4NCi0gICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4NCi0NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDwhLS0NCi0gICAgICAgICAgICAgICAgICAgIC0gQ29weSBMSUNFTlNFLnR4dCBhbmQgTk9USUNFLnR4dCBzbyB0aGF0IHRoZXkgYXJlIGluY2x1ZGVkDQotICAgICAgICAgICAgICAgICAgICAtIGluIHRoZSAtamF2YWRvYyBqYXIgZmlsZSBmb3IgdGhlIGNvbXBvbmVudC4NCi0gICAgICAgICAgICAgICAgLS0+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5qYXZhZG9jLnJlc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hcGlkb2NzL01FVEEtSU5GIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJMSUNFTlNFLnR4dCIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTk9USUNFLnR4dCIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5qYXZhZG9jLnNpdGUuY29weTwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnNpdGU8L3BoYXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ29weSBqYXZhZG9jIHRvIGFub3RoZXIgZGlyZWN0b3J5LCB0byBrZWVwIGphdmFkb2Mgb2YgcHJldmlvdXMgdmVyc2lvbnMgb24gc2l0ZSAtLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zaXRlL2FwaWRvY3MtJHtwcm9qZWN0LnZlcnNpb259IiBmYWlsb25lcnJvcj0iZmFsc2UiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3NpdGUvYXBpZG9jcyIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICAgICAgPCEtLQ0KLSAgICAgICAgICAgICAgICAtIE1ha2UgYSBjaGVja3N0eWxlIHZpb2xhdGlvbiBhIGNvbXBpbGUgZXJyb3IuIE5vdGUgdGhhdCBpZiBhIGNvbXBpbGUgZXJyb3Igb2NjdXJzLA0KLSAgICAgICAgICAgICAgICAtIGZ1cnRoZXIgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRhcmdldC9zaXRlL2NoZWNrc3R5bGUuaHRtbCAocHJlc2VudCBldmVuIHdoZW4NCi0gICAgICAgICAgICAgICAgLSBqdXN0IHRoZSBjb21waWxlIGdvYWwgYW5kIG5vdCB0aGUgc2l0ZSBnb2FsIGhhcyBiZWVuIHJ1bikuIE5vdGUgYWxzbyB0aGF0IGNoaWxkDQotICAgICAgICAgICAgICAgIC0gcHJvamVjdHMgbWF5IHJlZGVjbGFyZSB0aGlzIHBsdWdpbiBhbmQgcHJvdmlkZSBkaWZmZXJlbnQgY29uZmlndXJhdGlvbiBzZXR0aW5ncw0KLSAgICAgICAgICAgICAgICAtIHRvIHVzZSBkaWZmZXJlbnQgY2hlY2tzIChtb3JlIG9yIGxlc3Mgc3RyaWN0IHRoYW4gdGhlIGRlZmF1bHQpLg0KLSAgICAgICAgICAgIC0tPg0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY2hlY2tzdHlsZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD52ZXJpZnktc3R5bGU8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1jaGVja3Mtc3RhbmRhcmQueG1sPC9jb25maWdMb2NhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxoZWFkZXJMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtaGVhZGVyLnR4dDwvaGVhZGVyTG9jYXRpb24+DQotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICANCi0NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8IS0tIFNldCBjb21waWxlIHNvdXJjZSBhdCAxLjUsIHNpbmNlIHRoZSB0YXJnZXQgSlNGIGltcGwgaXMgMi4wIC0tPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPg0KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4NCi0gICAgICAgICAgICAgICAgICAgIDxvcHRpbWl6ZT5mYWxzZTwvb3B0aW1pemU+DQotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4gICAgICAgICAgICANCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi0gICAgPHJlcG9zaXRvcmllcz4NCi0gICAgICAgIDxyZXBvc2l0b3J5Pg0KLSAgICAgICAgICAgIDxpZD5tYXZlbjItcmVwb3NpdG9yeS5kZXYuamF2YS5uZXQ8L2lkPg0KLSAgICAgICAgICAgIDxuYW1lPkphdmEubmV0IFJlcG9zaXRvcnkgZm9yIE1hdmVuPC9uYW1lPg0KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL2Rvd25sb2FkLmphdmEubmV0L21hdmVuLzIvPC91cmw+DQotICAgICAgICAgICAgPGxheW91dD5kZWZhdWx0PC9sYXlvdXQ+DQotICAgICAgICA8L3JlcG9zaXRvcnk+DQotICAgIDwvcmVwb3NpdG9yaWVzPg0KLQ0KLSAgICA8cmVwb3J0aW5nPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qeHItcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcmVwb3J0LXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40LjM8L3ZlcnNpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjAuMTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbWQtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPHJ1bGVzZXRzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxydWxlc2V0Pi9ydWxlc2V0cy9iYXNpYy54bWw8L3J1bGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL3VudXNlZGNvZGUueG1sPC9ydWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgPC9ydWxlc2V0cz4NCi0gICAgICAgICAgICAgICAgICAgIDxsaW5rWHJlZj50cnVlPC9saW5rWHJlZj4NCi0gICAgICAgICAgICAgICAgICAgIDxtaW5pbXVtVG9rZW5zPjEwMDwvbWluaW11bVRva2Vucz4NCi0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXRKZGs+MS41PC90YXJnZXRKZGs+DQotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1jaGVja3Mtc3RhbmRhcmQueG1sPC9jb25maWdMb2NhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxoZWFkZXJMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtaGVhZGVyLnR4dDwvaGVhZGVyTG9jYXRpb24+DQotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9yZXBvcnRpbmc+DQotDQotICAgIDxzY20+DQotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9wYXJlbnQ8L2Nvbm5lY3Rpb24+DQotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvcGFyZW50PC9kZXZlbG9wZXJDb25uZWN0aW9uPg0KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvcGFyZW50PC91cmw+DQotICAgIDwvc2NtPg0KLQ0KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4NCi0gICAgICAgIDxzbmFwc2hvdFJlcG9zaXRvcnk+DQotICAgICAgICAgICAgPHVuaXF1ZVZlcnNpb24+ZmFsc2U8L3VuaXF1ZVZlcnNpb24+DQotICAgICAgICAgICAgPGlkPmFwYWNoZS5zbmFwc2hvdHM8L2lkPg0KLSAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBNYXZlbiBTbmFwc2hvdCBSZXBvc2l0b3J5PC9uYW1lPg0KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPg0KLSAgICAgICAgPC9zbmFwc2hvdFJlcG9zaXRvcnk+DQotICAgICAgICA8c2l0ZT4NCi0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPg0KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjIwPC91cmw+DQotICAgICAgICA8L3NpdGU+DQotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4NCi0NCi0gICAgPHByb2ZpbGVzPg0KLSAgICAgICAgPHByb2ZpbGU+DQotICAgICAgICAgICAgPGlkPmdlbmVyYXRlLWFzc2VtYmx5PC9pZD4NCi0gICAgICAgICAgICA8YWN0aXZhdGlvbj4NCi0gICAgICAgICAgICAgICAgPHByb3BlcnR5Pg0KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+cGVyZm9ybVJlbGVhc2U8L25hbWU+DQotICAgICAgICAgICAgICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+DQotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPg0KLSAgICAgICAgICAgIDxidWlsZD4NCi0gICAgICAgICAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvY3M8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+DQotICAgICAgICAgICAgPC9idWlsZD4NCi0gICAgICAgIDwvcHJvZmlsZT4NCi0gICAgPC9wcm9maWxlcz4NCi0NCi0gICAgPHByb3BlcnRpZXM+DQotICAgICAgICA8anNmLnZlcnNpb24+Mi4wLjAtYmV0YS0yPC9qc2YudmVyc2lvbj4NCi0gICAgPC9wcm9wZXJ0aWVzPg0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3BhcmVudC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI1ZmJjNS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3BhcmVudC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0gLS0tLS0tDQotT3ZlcnZpZXcNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAyLjANCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEueCBhbmQgSlNGIDIueC4gQWxsIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9wYXJlbnQvc3JjL3NpdGUvYXB0L2phdmFkb2MuYXB0IGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9wYXJlbnQvc3JjL3NpdGUvYXB0L2phdmFkb2MuYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWZkMzZmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvcGFyZW50L3NyYy9zaXRlL2FwdC9qYXZhZG9jLmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSAtLS0tLS0NCi1KYXZhZG9jDQotIC0tLS0tLQ0KLQ0KLUphdmFkb2MNCi0NCi0gICAgSGVyZSB5b3UgY2FuIGZpbmQgdGhlIGphdmFkb2Mgb2YgcHJldmlvdXMgZXh0dmFsIHZlcnNpb25zLg0KLQ0KLSAgICAqIHt7e2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9teWZhY2VzLWV4dHZhbC1jb3JlL2FwaWRvY3MtMS4yLjEvaW5kZXguaHRtbH1NeWZhY2VzIEV4dFZhbCBDb3JlIFZlcnNpb24gMS4yLjF9fQ0KLQ0KLSAgICAqIHt7e2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi92YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uL2FwaWRvY3MtMS4yLjEvaW5kZXguaHRtbH1NeWZhY2VzIEV4dFZhbCBQcm9wZXJ0eSBWYWxpZGF0aW9uIFZlcnNpb24gMS4yLjF9fQ0KLQ0KLSAgICAqIHt7e2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9teWZhY2VzLWV4dHZhbC1jb3JlL2FwaWRvY3MtMS4yLjIvaW5kZXguaHRtbH1NeWZhY2VzIEV4dFZhbCBDb3JlIFZlcnNpb24gMS4yLjJ9fQ0KLQ0KLSAgICAqIHt7e2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi92YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uL2FwaWRvY3MtMS4yLjIvaW5kZXguaHRtbH1NeWZhY2VzIEV4dFZhbCBQcm9wZXJ0eSBWYWxpZGF0aW9uIFZlcnNpb24gMS4yLjJ9fQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvcGFyZW50L3NyYy9zaXRlL3NpdGUueG1sIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9wYXJlbnQvc3JjL3NpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YTRmZjMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9wYXJlbnQvc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+DQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPHByb2plY3QgbmFtZT0iQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IiPg0KLSAgPGJhbm5lckxlZnQ+DQotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dFZhbDwvbmFtZT4NCi0gICAgPHNyYz5pbWFnZXMvZXh0dmFsX2xvZ28ucG5nPC9zcmM+DQotICAgIDxocmVmPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW5kZXguaHRtbDwvaHJlZj4NCi0gIDwvYmFubmVyTGVmdD4NCi0NCi0gIDxiYW5uZXJSaWdodD4NCi0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXM8L25hbWU+DQotICAgIDxzcmM+aW1nL2Jhbm5lcnMvTXlGYWNlc19sb2dvLmpwZzwvc3JjPg0KLSAgICA8aHJlZj5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWw8L2hyZWY+DQotICA8L2Jhbm5lclJpZ2h0Pg0KLQ0KLSAgPHB1Ymxpc2hEYXRlIGZvcm1hdD0iZGQgTU1NIHl5eXkiLz4NCi0NCi0gIDxza2luPg0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtc2l0ZS1za2luPC9hcnRpZmFjdElkPg0KLSAgICA8dmVyc2lvbj4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgPC9za2luPg0KLQ0KLSAgPGJvZHk+DQotICAgIDxsaW5rcz4NCi0gICAgICA8aXRlbSBuYW1lPSJBcGFjaGUiIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZyIvPg0KLSAgICAgIDxpdGVtIG5hbWU9Ik15RmFjZXMiIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPg0KLSAgICAgIDxpdGVtIG5hbWU9IkRvd25sb2FkIE15ZmFjZXMgRXh0VmFsIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Rvd25sb2FkLmh0bWwiLz4NCi0gICAgPC9saW5rcz4NCi0NCi0gICAgPG1lbnUgbmFtZT0iQXBhY2hlIE15RmFjZXMiIGluaGVyaXQ9InRvcCI+DQotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPg0KLSAgICAgIDxpdGVtIG5hbWU9IkRvd25sb2FkIiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2Rvd25sb2FkLmh0bWwiLz4NCi0gICAgPC9tZW51Pg0KLQ0KLSAgICA8bWVudSBuYW1lPSJDb250ZW50cyIgaW5oZXJpdD0idG9wIj4NCi0gICAgICAgIDxpdGVtIG5hbWU9Ik1haW4gU2l0ZSIgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2luZGV4Lmh0bWwiLz4NCi0gICAgICAgIDxpdGVtIG5hbWU9IkV4dFZhbCBmb3IgSlNGIDEuMSIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExL2luZGV4Lmh0bWwiIGNvbGxhcHNlPSJ0cnVlIj4NCi0gICAgICAgICAgICA8aXRlbSBuYW1lPSJkdW1teSIgICAgICAgIGhyZWY9ImR1bW15Ii8+DQotICAgICAgICA8L2l0ZW0+DQotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjIiICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2luZGV4Lmh0bWwiPg0KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iQ29yZSBNb2R1bGUiICAgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvbXlmYWNlcy1leHR2YWwtY29yZS9pbmRleC5odG1sIi8+DQotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJQcm9wZXJ0eSBWYWxpZGF0aW9uIiAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi92YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uL2luZGV4Lmh0bWwiLz4NCi0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IlRyaW5pZGFkIFN1cHBvcnQiICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2NvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0L2luZGV4Lmh0bWwiLz4NCi0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IkdlbmVyaWMgU3VwcG9ydCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2NvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQvaW5kZXguaHRtbCIvPg0KLSAgICAgICAgPC9pdGVtPg0KLSAgICA8L21lbnU+DQotCQ0KLSAgICA8bWVudSBuYW1lPSJEb2N1bWVudGF0aW9uIj4NCi0gICAgICA8aXRlbSBuYW1lPSJXaWtpIiAgICAgICAgIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvbXlmYWNlcy9FeHRlbnNpb25zL1ZhbGlkYXRvci8iLz4NCi0gICAgICA8aXRlbSBuYW1lPSJKYXZhZG9jIiAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9qYXZhZG9jLmh0bWwiLz4NCi0gICAgPC9tZW51Pg0KLQ0KLSAgICA8bWVudSByZWY9InJlcG9ydHMiLz4NCi0NCi0gICAgPG1lbnUgbmFtZT0iRm91bmRhdGlvbiIgaW5oZXJpdD0iYm90dG9tIj4NCi0gICAgICA8aXRlbSBuYW1lPSJBU0YiICAgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIgLz4NCi0gICAgICA8aXRlbSBuYW1lPSJTcG9uc29yc2hpcCIgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vc3BvbnNvcnNoaXAuaHRtbCIgLz4NCi0gICAgICA8aXRlbSBuYW1lPSJUaGFua3MiICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vdGhhbmtzLmh0bWwiIC8+DQotICAgIDwvbWVudT4NCi0gIDwvYm9keT4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9wb20ueG1sIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWMzYmIwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+NjwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtbW9kdWxlPC9hcnRpZmFjdElkPg0KLSAgICA8dmVyc2lvbj4yLjAuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgTW9kdWxlPC9uYW1lPg0KLSAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMjwvdXJsPg0KLQ0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvPC9jb25uZWN0aW9uPg0KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rLzwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4NCi0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rLzwvdXJsPg0KLSAgICA8L3NjbT4NCi0NCi0gICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+DQotICAgICAgICA8c25hcHNob3RSZXBvc2l0b3J5Pg0KLSAgICAgICAgICAgIDx1bmlxdWVWZXJzaW9uPmZhbHNlPC91bmlxdWVWZXJzaW9uPg0KLSAgICAgICAgICAgIDxpZD5hcGFjaGUuc25hcHNob3RzPC9pZD4NCi0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgTWF2ZW4gU25hcHNob3QgUmVwb3NpdG9yeTwvbmFtZT4NCi0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4NCi0gICAgICAgIDwvc25hcHNob3RSZXBvc2l0b3J5Pg0KLSAgICAgICAgPHNpdGU+DQotICAgICAgICAgICAgPGlkPmFwYWNoZS1zaXRlPC9pZD4NCi0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IyMDwvdXJsPg0KLSAgICAgICAgPC9zaXRlPg0KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+DQotDQotICAgIDwhLS0gV0FSTklORzogRE8gTk9UIEdFTkVSQVRFIFNJVEUgRlJPTSBIRVJFIERJUkVDVExZDQotICAgIFNpbmNlIHRoaXMgcHJvamVjdCBoYXMgYW4gYXN5bmMgcmVsZWFzZSBwcm9jZWR1cmUgKG5vdA0KLSAgICBhbGwgbW9kdWxlcyBzaG91bGQgYmUgcmVsZWFzZWQgYXQgb25jZSksIHRoZSBwYXJlbnQgcG9tLnhtbCANCi0gICAgaXMgbm90IHRoaXMgKHRoZXJlIGlzIGEgbW9kdWxlIGZvciB0aGF0KS4gVXNlIG1hdmVuIHNpdGUgDQotICAgIHBsdWdpbiBoZXJlIGNhdXNlIHByb2JsZW1zIHdoZW4gdGhlIHNpdGUgaXMgZ2VuZXJhdGVkLg0KLSAgICBUaGUgcHJvY2VkdXJlIG11c3QgZXhlY3V0ZSBzaXRlIGNvbW1tYW5kIGZpcnN0IG9uIHBhcmVudCANCi0gICAgbW9kdWxlIGFuZCB0aGVuIG9uIGVhY2ggbW9kdWxlIGxpc3RlZCBiZWxvdy4gDQotICAgICAtLT4NCi0NCi0gICAgPG1vZHVsZXM+DQotICAgICAgICA8bW9kdWxlPnBhcmVudDwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5jb3JlPC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPnZhbGlkYXRpb24tbW9kdWxlczwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5jb21wb25lbnQtc3VwcG9ydDwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5leGFtcGxlczwvbW9kdWxlPg0KLSAgICA8L21vZHVsZXM+DQotDQotICAgIDxwcm9maWxlcz4NCi0gICAgICAgIDwhLS0gVGhpcyBwcm9maWxlIGlzIGludm9rZWQgYnkgLURwcmVwYXJlUmVsZWFzZT10cnVlLiAgVGhpcyBhbGxvd3MgbXZuIHJlbGVhc2U6cHJlcGFyZSB0bw0KLSAgICAgICAgICAgIHJ1biBzdWNjZXNzZnVsbHkgb24gdGhlIGFzc2VtYmx5IHByb2plY3RzLiAtLT4NCi0gICAgICAgIDxwcm9maWxlPg0KLSAgICAgICAgICAgIDxpZD5wcmVwYXJlLXJlbGVhc2U8L2lkPg0KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPg0KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+DQotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wcmVwYXJlUmVsZWFzZTwvbmFtZT4NCi0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8L2FjdGl2YXRpb24+DQotICAgICAgICAgICAgPG1vZHVsZXM+DQotICAgICAgICAgICAgICAgIDxtb2R1bGU+YXNzZW1ibHk8L21vZHVsZT4NCi0gICAgICAgICAgICA8L21vZHVsZXM+DQotICAgICAgICAgICAgPGJ1aWxkPg0KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVsZWFzZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+LURwcmVwYXJlUmVsZWFzZTwvYXJndW1lbnRzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+DQotICAgICAgICAgICAgPC9idWlsZD4NCi0gICAgICAgIDwvcHJvZmlsZT4NCi0gICAgPC9wcm9maWxlcz4NCi0gICAgDQotICAgIDxwcm9wZXJ0aWVzPg0KLSAgICAgICAgPGpzZi52ZXJzaW9uPjIuMC4wLWJldGEtMjwvanNmLnZlcnNpb24+DQotICAgIDwvcHJvcGVydGllcz4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9zaXRlL3BvbS54bWwgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3NpdGUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM4NjQzNS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3NpdGUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgICAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgICAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gICAgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgICAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICAgICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gICAgKg0KLSAgICAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICAgICoNCi0gICAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICAgICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICAgICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj42PC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1zaXRlPC9hcnRpZmFjdElkPg0KLSAgICA8dmVyc2lvbj4yLjAuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3I8L25hbWU+DQotICAgIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjwvdXJsPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8ZGVmYXVsdEdvYWw+c2l0ZTwvZGVmYXVsdEdvYWw+DQotICAgICAgICA8ZXh0ZW5zaW9ucz4NCi0gICAgICAgICAgPGV4dGVuc2lvbj4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLndhZ29uPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPndhZ29uLXNzaC1leHRlcm5hbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtNTwvdmVyc2lvbj4NCi0gICAgICAgICAgPC9leHRlbnNpb24+DQotICAgICAgICA8L2V4dGVuc2lvbnM+DQotICAgIDwvYnVpbGQ+DQotICAgIDxyZXBvcnRpbmc+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvcmVwb3J0aW5nPg0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvc2l0ZTwvY29ubmVjdGlvbj4NCi0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay9zaXRlPC9kZXZlbG9wZXJDb25uZWN0aW9uPg0KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay9zaXRlPC91cmw+DQotICAgIDwvc2NtPg0KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4NCi0gICAgICA8c2l0ZT4NCi0gICAgICAgIDxpZD5hcGFjaGUtc2l0ZTwvaWQ+DQotICAgICAgICA8bmFtZT5BcGFjaGUgV2Vic2l0ZTwvbmFtZT4NCi0gICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjwvdXJsPg0KLSAgICAgIDwvc2l0ZT4NCi0gICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50Pg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3NpdGUvc3JjL3NpdGUvYXB0L2Rvd25sb2FkLmFwdCBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvc2l0ZS9zcmMvc2l0ZS9hcHQvZG93bmxvYWQuYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzUxNGUwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvc2l0ZS9zcmMvc2l0ZS9hcHQvZG93bmxvYWQuYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLSB+fiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gfn4gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotIH5+IHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gfn4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gfn4gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gfn4gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gfn4NCi0gfn4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gfn4NCi0gfn4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSB+fiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSB+fiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gfn4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSB+fiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gDQotIC0tLS0tLQ0KLURvd25sb2FkIEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotIC0tLS0tLQ0KLQ0KLURvd25sb2FkIEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotDQotDQotICBVc2UgdGhlIGxpbmtzIGJlbG93IHRvIGRvd25sb2FkIGEgZGlzdHJpYnV0aW9uIG9mIEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZyb20NCi0gIG9uZSBvZiBvdXIgbWlycm9ycy4gSXQgaXMgZ29vZCBwcmFjdGljZSB0byB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGUNCi0gIGRpc3RyaWJ1dGlvbiBmaWxlcy4NCi0NCi0gIFlvdSB3aWxsIGJlIHByb21wdGVkIGZvciBhIG1pcnJvciAtIGlmIHRoZSBmaWxlIGlzIG5vdCBmb3VuZCBvbiB5b3VycywgcGxlYXNlIGJlIHBhdGllbnQsIGFzIGl0IG1heSB0YWtlIDI0DQotICBob3VycyB0byByZWFjaCBhbGwgbWlycm9ycy4NCi0NCi0gIEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGRpc3RyaWJ1dGVkIGFzIGEgPDw8emlwPj4+IGFyY2hpdmUgKGZvciBXaW5kb3dzKSBhbmQNCi0gIGFzIGEgPDw8dGFyLmd6Pj4+IGFyY2hpdmUgKGZvciBVTklYKS4gVGhlIGNvbnRlbnQgaXMgdGhlIHNhbWUuIFBsZWFzZSBub3RlDQotICB0aGF0IHRoZSA8PDx0YXIuZ3o+Pj4gYXJjaGl2ZXMgY29udGFpbiBmaWxlIG5hbWVzIGxvbmdlciB0aGFuIDEwMCBjaGFyYWN0ZXJzIGFuZCBoYXZlIGJlZW4NCi0gIGNyZWF0ZWQgdXNpbmcgR05VIHRhciBleHRlbnNpb25zLiBUaHVzIHRoZXkgbXVzdCBiZSB1bnRhcnJlZCB3aXRoIGEgR05VIGNvbXBhdGlibGUNCi0gIHZlcnNpb24gb2YgdGFyLg0KLQ0KLSAgPDwgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgMS4wLjAgRGlzdHJpYnV0aW9uID4+DQotDQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCAgICAgICAgICAgICAgICAgICAgICAgICB8IE1pcnJvcnMgfCBDaGVja3N1bSB8IFNpZ25hdHVyZSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4xIDEuMS4yICh0YXIuZ3opICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nen0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nei5tZDV9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nei5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6LmFzY30gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6LmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjEgMS4xLjIgKHppcCkgICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnppcH0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4uemlwfX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnppcC5tZDV9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnppcC5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4uemlwLmFzY30gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4uemlwLmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjEgMS4xLjIgU291cmNlICh0YXIuZ3opICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy50YXIuZ3p9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnRhci5nen19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMudGFyLmd6Lm1kNX0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMudGFyLmd6Lm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMudGFyLmd6LmFzY30gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMudGFyLmd6LmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjEgMS4xLjIgU291cmNlICh6aXApICAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMuemlwfSBteWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy56aXB9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnppcC5tZDV9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnppcC5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnppcC5hc2N9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnppcC5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4yIDEuMi4yICh0YXIuZ3opICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnRhci5nen0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4udGFyLmd6fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnRhci5nei5tZDV9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnRhci5nei5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4udGFyLmd6LmFzY30gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4udGFyLmd6LmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjIgMS4yLjIgKHppcCkgICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnppcH0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4uemlwfX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnppcC5tZDV9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnppcC5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4uemlwLmFzY30gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4uemlwLmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjIgMS4yLjIgU291cmNlICh0YXIuZ3opICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy50YXIuZ3p9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnRhci5nen19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMudGFyLmd6Lm1kNX0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMudGFyLmd6Lm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMudGFyLmd6LmFzY30gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMudGFyLmd6LmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjIgMS4yLjIgU291cmNlICh6aXApICAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMuemlwfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy56aXB9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnppcC5tZDV9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnppcC5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnppcC5hc2N9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnppcC5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotDQotTGF0ZXN0IHNvdXJjZSBjb2RlIGZyb20gU1ZOIHJlcG9zaXRvcnkNCi0NCi0gICAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBsYXRlc3QgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZmVhdHVyZXMsIHRoZSBzb3VyY2UgY29kZSBpcyB1bmRlcg0KLSAgICB2ZXJzaW9uIGNvbnRyb2wgd2l0aCBTVk4uICBDbGljayB7e3tzb3VyY2UtcmVwb3NpdG9yeS5odG1sfSBoZXJlIH19DQotICAgIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIHRoZSBBU0YgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgU1ZOIFJlcG9zaXRvcnkuDQotDQotVmVyaWZ5aW5nIGNoZWNrc3Vtcw0KLQ0KLSAgICBJdCBpcyBlc3NlbnRpYWwgdGhhdCB5b3UgdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGRvd25sb2FkZWQNCi0gICAgZmlsZXMgdXNpbmcgdGhlIFBHUCBhbmQgTUQ1IHNpZ25hdHVyZXMuIE1ENSB2ZXJpZmljYXRpb24gZW5zdXJlcyB0aGUNCi0gICAgZmlsZSB3YXMgbm90IGNvcnJ1cHRlZCBkdXJpbmcgdGhlIGRvd25sb2FkIHByb2Nlc3MuIFBHUCB2ZXJpZmljYXRpb24NCi0gICAgZW5zdXJlcyB0aGF0IHRoZSBmaWxlIGNhbWUgZnJvbSBhIGNlcnRhaW4gcGVyc29uLg0KLQ0KLSAgICBUbyB2ZXJpZnkgdGhlIE1ENSBzaWduYXR1cmUgb24gdGhlIGZpbGVzLCB5b3UgbmVlZCB0byB1c2UgYSBwcm9ncmFtDQotICAgIGNhbGxlZCA8PDxtZDU+Pj4gb3IgPDw8bWQ1c3VtPj4+LCB3aGljaCBpcw0KLSAgICBpbmNsdWRlZCBpbiBtYW55IFVOSVggZGlzdHJpYnV0aW9ucy4gIEl0IGlzIGFsc28gYXZhaWxhYmxlIGFzIHBhcnQgb2YNCi0gICAge3t7aHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL3RleHR1dGlscy90ZXh0dXRpbHMuaHRtbH1HTlUgVGV4dHV0aWxzfX0uDQotICAgIFdpbmRvd3MgdXNlcnMgY2FuIGdldCBiaW5hcnkgbWQ1IHByb2dyYW1zIGZyb20ge3t7aHR0cDovL3d3dy5mb3VybWlsYWIuY2gvbWQ1L31oZXJlfX0sDQotICAgIHt7e2h0dHA6Ly93d3cucGMtdG9vbHMubmV0L3dpbjMyL2ZyZWV3YXJlL2NvbnNvbGUvfWhlcmV9fSwgb3INCi0gICAge3t7aHR0cDovL3d3dy5zbGF2YXNvZnQuY29tL2ZzdW0vfWhlcmV9fS4NCi0NCi1WZXJpZnlpbmcgc2lnbmF0dXJlcw0KLQ0KLSAgCVBHUCB2ZXJpZmljYXRpb24gZW5zdXJlcyB0aGF0IHRoZSBmaWxlIGNhbWUgZnJvbSBhIGNlcnRhaW4gcGVyc29uLiAgV2Ugc3Ryb25nbHkgcmVjb21tZW5kDQotCSAgeW91IHZlcmlmeSB5b3VyIGRvd25sb2FkcyB3aXRoIGJvdGggUEdQIGFuZCBNRDUuDQotDQotCVRoZSBQR1Agc2lnbmF0dXJlcyBjYW4gYmUgdmVyaWZpZWQgdXNpbmcge3t7aHR0cDovL3d3dy5wZ3BpLm9yZy99UEdQfX0gb3IgDQotCXt7e2h0dHA6Ly93d3cuZ251cGcub3JnL31HUEd9fS4gIEZpcnN0IGRvd25sb2FkIHRoZSBBcGFjaGUgTXlGYWNlcyANCi0Je3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9LRVlTfUtFWVN9fQlhcyB3ZWxsIGFzIHRoZSA8PDxhc2M+Pj4gc2lnbmF0dXJlIGZpbGUgDQotCWZvciB0aGUgcGFydGljdWxhciBkaXN0cmlidXRpb24uIEl0IGlzIGltcG9ydGFudCB0aGF0IHlvdSBnZXQgdGhlc2UgZmlsZXMgZnJvbSB0aGUgdWx0aW1hdGUNCi0JdHJ1c3RlZCBzb3VyY2UgLSB0aGUgbWFpbiBBU0YgZGlzdHJpYnV0aW9uIHNpdGUsIHJhdGhlciB0aGFuIGZyb20gYSBtaXJyb3IuDQotCVRoZW4gdmVyaWZ5IHRoZSBzaWduYXR1cmVzIHVzaW5nIC4uLg0KLQ0KLQkgIDw8PA0KLQkgICUgcGdwayAtYSBLRVlTDQotCSAgJSBwZ3B2IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nei5hc2MgbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6DQotCSAgPj4+DQotDQotCSAgPG9yPg0KLQ0KLQkgIDw8PA0KLQkgICUgcGdwIC1rYSBLRVlTDQotCSAgJSBwZ3AgbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6LmFzYyBteWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi50YXIuZ3oNCi0JICA+Pj4NCi0NCi0JICA8b3I+DQotDQotCSAgPDw8DQotICAJJSBncGcgLS1pbXBvcnQgS0VZUw0KLQkgICUgZ3BnIC0tdmVyaWZ5IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nei5hc2MgbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6DQotCSAgPj4+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9zaXRlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3NpdGUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwOTU1Ny4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3NpdGUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGEgSlNGIGNlbnRyaWMgdmFsaWRhdGlvbiBmcmFtZXdvcmsuDQotICANCi0gICAgSXQgb2ZmZXJzIHBvd2VyZnVsIGFuZCBlYXN5IHRvIHVzZSBmaWVsZCBiYXNlZCB2YWxpZGF0aW9uIGJhc2VkIG9uIGFubm90YXRpb25zLg0KLUl0IGhhcyBhIHBsdWdnYWJsZSBhcmNoaXRlY3R1cmUsIHNvIGl0IGlzIHBvc3NpYmxlIHRvIGFkZCBuZXcgdmFsaWRhdGlvbiBtb2R1bGVzIG9yIHN1cHBvcnQgZm9yIGNvbXBvbmVudCBsaWJyYXJpZXMgbGlrZSBUcmluaWRhZCBvciBvdGhlciAzcmQgcGFydHkgZnJhbWV3b3Jrcy4NCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEueCBhbmQgSlNGIDIueC4gQWxsIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrDQotDQotICAgIEZ1cnRoZXIgaW5mb3JtYXRpb24gYXJlIGF2YWlsYWJsZSBhdCB0aGUge3t7aHR0cDovL3dpa2kuYXBhY2hlLm9yZy9teWZhY2VzL0V4dGVuc2lvbnMvVmFsaWRhdG9yL31XaWtpfX0uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9zaXRlL3NyYy9zaXRlL3NpdGUueG1sIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9zaXRlL3NyYy9zaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWJjOWZmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvc2l0ZS9zcmMvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08cHJvamVjdCBuYW1lPSJBcGFjaGUgTXlmYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciI+DQotICA8YmFubmVyTGVmdD4NCi0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0VmFsPC9uYW1lPg0KLSAgICA8c3JjPmltYWdlcy9leHR2YWxfbG9nby5wbmc8L3NyYz4NCi0gICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sPC9ocmVmPg0KLSAgPC9iYW5uZXJMZWZ0Pg0KLQ0KLSAgPGJhbm5lclJpZ2h0Pg0KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlczwvbmFtZT4NCi0gICAgPHNyYz5pbWcvYmFubmVycy9NeUZhY2VzX2xvZ28uanBnPC9zcmM+DQotICAgIDxocmVmPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbDwvaHJlZj4NCi0gIDwvYmFubmVyUmlnaHQ+IA0KLQ0KLSAgPHB1Ymxpc2hEYXRlIGZvcm1hdD0iZGQgTU1NIHl5eXkiLz4NCi0NCi0gIDxza2luPg0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtc2l0ZS1za2luPC9hcnRpZmFjdElkPg0KLSAgICA8dmVyc2lvbj4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgPC9za2luPg0KLQ0KLSAgPGJvZHk+DQotICAgIDxsaW5rcz4NCi0gICAgICA8aXRlbSBuYW1lPSJBcGFjaGUiIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZyIvPg0KLSAgICAgIDxpdGVtIG5hbWU9Ik15RmFjZXMiIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPg0KLSAgICAgIDxpdGVtIG5hbWU9IkRvd25sb2FkIE15ZmFjZXMgRXh0VmFsIiAgICAgICBocmVmPSJkb3dubG9hZC5odG1sIi8+DQotICAgIDwvbGlua3M+DQotDQotICAgIDxtZW51IG5hbWU9IkFwYWNoZSBNeUZhY2VzIiBpbmhlcml0PSJ0b3AiPg0KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4NCi0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9kb3dubG9hZC5odG1sIi8+DQotICAgIDwvbWVudT4NCi0NCi0gICAgPG1lbnUgbmFtZT0iQ29udGVudHMiIGluaGVyaXQ9InRvcCI+DQotICAgICAgICA8aXRlbSBuYW1lPSJNYWluIFNpdGUiICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sIi8+DQotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjEiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS9pbmRleC5odG1sIiBjb2xsYXBzZT0idHJ1ZSI+DQotICAgICAgICAgICAgPGl0ZW0gbmFtZT0iZHVtbXkiICAgICAgICBocmVmPSJkdW1teSIvPg0KLSAgICAgICAgPC9pdGVtPg0KLSAgICAgICAgPGl0ZW0gbmFtZT0iRXh0VmFsIGZvciBKU0YgMS4yIiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvaW5kZXguaHRtbCIgY29sbGFwc2U9InRydWUiPg0KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9ImR1bW15IiAgICAgICAgaHJlZj0iZHVtbXkiLz4NCi0gICAgICAgIDwvaXRlbT4NCi0gICAgPC9tZW51Pg0KLQ0KLSAgICA8bWVudSBuYW1lPSJEb2N1bWVudGF0aW9uIj4NCi0gICAgICA8aXRlbSBuYW1lPSJXaWtpIiAgICAgICAgIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvbXlmYWNlcy9FeHRlbnNpb25zL1ZhbGlkYXRvci8iLz4NCi0gICAgPC9tZW51Pg0KLQ0KLSAgICA8bWVudSByZWY9InJlcG9ydHMiLz4NCi0NCi0gICAgPG1lbnUgbmFtZT0iRm91bmRhdGlvbiIgaW5oZXJpdD0idG9wIj4NCi0gICAgICA8aXRlbSBuYW1lPSJBU0YiICAgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIgLz4NCi0gICAgICA8aXRlbSBuYW1lPSJTcG9uc29yc2hpcCIgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vc3BvbnNvcnNoaXAuaHRtbCIgLz4NCi0gICAgICA8aXRlbSBuYW1lPSJUaGFua3MiICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vdGhhbmtzLmh0bWwiIC8+DQotICAgIDwvbWVudT4NCi0gIDwvYm9keT4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3BvbS54bWwgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA4NGZiZS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBCZWFuLVZhbGlkYXRpb24tSW50ZWdyYXRpb24tTW9kdWxlIChKU1IgMzAzKTwvbmFtZT4NCi0gICAgPHZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4yLjAuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxyZXBvc2l0b3JpZXM+DQotICAgICAgICA8cmVwb3NpdG9yeT4NCi0gICAgICAgICAgICA8aWQ+amJvc3M8L2lkPg0KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3JlcG9zaXRvcnkuamJvc3MuY29tL21hdmVuMjwvdXJsPg0KLSAgICAgICAgICAgIDxyZWxlYXNlcz4NCi0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4NCi0gICAgICAgICAgICA8L3JlbGVhc2VzPg0KLSAgICAgICAgICAgIDxzbmFwc2hvdHM+DQotICAgICAgICAgICAgICAgIDxlbmFibGVkPmZhbHNlPC9lbmFibGVkPg0KLSAgICAgICAgICAgIDwvc25hcHNob3RzPg0KLSAgICAgICAgPC9yZXBvc2l0b3J5Pg0KLSAgICAgICAgPHJlcG9zaXRvcnk+DQotICAgICAgICAgICAgPGlkPmpib3NzLXNuYXBzaG90PC9pZD4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9zbmFwc2hvdHMuamJvc3Mub3JnL21hdmVuMjwvdXJsPg0KLSAgICAgICAgICAgIDxyZWxlYXNlcz4NCi0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4NCi0gICAgICAgICAgICA8L3JlbGVhc2VzPg0KLSAgICAgICAgICAgIDxzbmFwc2hvdHM+DQotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+DQotICAgICAgICAgICAgPC9zbmFwc2hvdHM+DQotICAgICAgICA8L3JlcG9zaXRvcnk+DQotICAgIDwvcmVwb3NpdG9yaWVzPg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgudmFsaWRhdGlvbjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuMC5HQTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cmVzb3VyY2VzPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICA8L3Jlc291cmNlcz4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40LjI8L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL0Fic3RyYWN0Ki5qYXZhPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL1Rlc3RVdGlscy5qYXZhPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypCZWFuLmphdmE8L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+ICAgICAgICAgICAgDQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhlZTMxNS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18yXzAueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMi4wIj4NCi0gICAgPGZhY3Rvcnk+DQotICAgICAgICA8YXBwbGljYXRpb24tZmFjdG9yeT5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5mYWN0b3J5LkV4dFZhbEFwcGxpY2F0aW9uRmFjdG9yeTwvYXBwbGljYXRpb24tZmFjdG9yeT4NCi0gICAgPC9mYWN0b3J5Pg0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0YXJ0dXAuSlNGMkF3YXJlQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0YXJ0dXAuQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhbkF3YXJlQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5Bd2FyZUNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YTc0MDQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhbkF3YXJlQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7DQotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgQmVhbkF3YXJlQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeQ0KLXsNCi0gICAgcHJpdmF0ZSBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBjb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeTsNCi0NCi0gICAgcHVibGljIEJlYW5Bd2FyZUNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KQ0KLSAgICB7DQotICAgICAgICBzZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeShjb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkpDQotICAgIHsNCi0gICAgICAgIGlmKGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibnVsbCBpcyBub3QgYWxsb3dlZCBoZXJlIik7DQotICAgICAgICB9DQotICAgICAgICB0aGlzLmNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5ID0gY29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFsbG93IHRoZSByZWdpc3RyYXRpb24gb2YgYSBjdXN0b20gcHJlZml4IikNCi0gICAgcHVibGljIDxUIGV4dGVuZHMgQ29uc3RyYWludFZhbGlkYXRvcjw/LCA/Pj4gVCBnZXRJbnN0YW5jZShDbGFzczxUPiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRvckNsYXNzTmFtZSA9IHRhcmdldENsYXNzLmdldFNpbXBsZU5hbWUoKTsNCi0gICAgICAgIE9iamVjdCByZXN1bHQgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4oY3JlYXRlQmVhbk5hbWUodmFsaWRhdG9yQ2xhc3NOYW1lKSk7DQotDQotICAgICAgICBpZihyZXN1bHQgIT0gbnVsbCAmJiB0YXJnZXRDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHJlc3VsdC5nZXRDbGFzcygpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFQpcmVzdWx0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuZ2V0SW5zdGFuY2UodGFyZ2V0Q2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZUJlYW5OYW1lKFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKHZhbGlkYXRvckNsYXNzTmFtZSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2Q3NmM2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5Bd2FyZVZhbGlkYXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yQ29udGV4dDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5NZXNzYWdlSW50ZXJwb2xhdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlRyYXZlcnNhYmxlUmVzb2x2ZXI7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeSBpbXBsZW1lbnRzIFZhbGlkYXRvckZhY3RvcnkNCi17DQotICAgIHByaXZhdGUgVmFsaWRhdG9yRmFjdG9yeSB2YWxpZGF0b3JGYWN0b3J5Ow0KLQ0KLSAgICBwdWJsaWMgQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeShWYWxpZGF0b3JGYWN0b3J5IHZhbGlkYXRvckZhY3RvcnkpDQotICAgIHsNCi0gICAgICAgIHNldFZhbGlkYXRvckZhY3RvcnkodmFsaWRhdG9yRmFjdG9yeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yRmFjdG9yeShWYWxpZGF0b3JGYWN0b3J5IHZhbGlkYXRvckZhY3RvcnkpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRvckZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJudWxsIGlzIG5vdCBhbGxvd2VkIGhlcmUiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRoaXMudmFsaWRhdG9yRmFjdG9yeSA9IHZhbGlkYXRvckZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeS5nZXRWYWxpZGF0b3IoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdG9yQ29udGV4dCB1c2luZ0NvbnRleHQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeS51c2luZ0NvbnRleHQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZUludGVycG9sYXRvciBnZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRvckZhY3RvcnkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBUcmF2ZXJzYWJsZVJlc29sdmVyIGdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeS5nZXRUcmF2ZXJzYWJsZVJlc29sdmVyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGdldENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBCZWFuQXdhcmVDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSh2YWxpZGF0b3JGYWN0b3J5LmdldENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyA8VD4gVCB1bndyYXAoQ2xhc3M8VD4gdENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeS51bndyYXAodENsYXNzKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1MzYyNy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuVmFsaWRhdGlvbk1vZHVsZUtleTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVmFsaWRhdGlvbk1vZHVsZUtleQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQmVhblZhbGlkYXRpb25Nb2R1bGVLZXkNCi17DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOThjOTEwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkFic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC51dGlsLkJlYW5WYWxpZGF0aW9uVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscyBidmlVdGlscyA9DQotICAgICAgICAgICAgbmV3IEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzKHRoaXMubG9nZ2VyKTsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvblN1cHBvcnRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHRvIGluaXQgY29tcG9uZW50ICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gYnZpVXRpbHMuZXh0cmFjdFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZ2V0UHJvcGVydGllc0ZvckNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKHVpQ29tcG9uZW50KSk7DQotDQotICAgICAgICBpZiAocHJvcGVydHlEZXRhaWxzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdENvbXBvbmVudFdpdGhQcm9wZXJ0eURldGFpbHMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgcHJvcGVydHlEZXRhaWxzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImluaXQgY29tcG9uZW50IG9mICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q29tcG9uZW50V2l0aFByb3BlcnR5RGV0YWlscyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscykNCi0gICAgew0KLSAgICAgICAgdGhpcy5idmlVdGlscy5pbml0Q29tcG9uZW50V2l0aFByb3BlcnR5RGV0YWlscyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBwcm9wZXJ0eURldGFpbHMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBnZXRQcm9wZXJ0eUluZm9ybWF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgYm9vbGVhbiB2YWxpZGF0ZVByb3BlcnR5ID0gaGFzQmVhblZhbGlkYXRpb25Db25zdHJhaW50cyhwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZVByb3BlcnR5KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImpzcjMwMyBzdGFydCB2YWxpZGF0aW9uIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcHJvY2Vzc0ZpZWxkVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGZpbmFsbHkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodmFsaWRhdGVQcm9wZXJ0eSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJqc3IzMDMgdmFsaWRhdGlvbiBmaW5pc2hlZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBidmlVdGlscy5nZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcihwcm9wZXJ0aWVzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNCZWFuVmFsaWRhdGlvbkNvbnN0cmFpbnRzKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuYnZpVXRpbHMuaGFzQmVhblZhbGlkYXRpb25Db25zdHJhaW50cyhwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRmllbGRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIC8qbm90IHVzZWQgeWV0IHN1cHBvcnRNdWx0aXBsZVZpb2xhdGlvbnNQZXJGaWVsZCgpKi8NCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPiB2aW9sYXRpb25zID0gdGhpcy5idmlVdGlscw0KLSAgICAgICAgICAgICAgICAudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIHByb2Nlc3NDb25zdHJhaW50VmlvbGF0aW9ucyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHZpb2xhdGlvbnMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NDb25zdHJhaW50VmlvbGF0aW9ucyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb24+IHZpb2xhdGlvbnMpDQotICAgIHsNCi0gICAgICAgIGlmKHZpb2xhdGlvbnMgIT0gbnVsbCAmJiAhdmlvbGF0aW9ucy5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQmVhblZhbGlkYXRpb25VdGlscy5wcm9jZXNzQ29uc3RyYWludFZpb2xhdGlvbnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCB2aW9sYXRpb25zKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIENsYXNzIGdldE1vZHVsZUtleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBCZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscy5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBmOGE3Yi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmdyb3Vwcy5EZWZhdWx0Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkJlYW5EZXNjcmlwdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkVsZW1lbnREZXNjcmlwdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzDQotew0KLSAgICBwcml2YXRlIExvZyBsb2dnZXI7DQotDQotICAgIEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzKExvZyBsb2dnZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyOw0KLSAgICB9DQotDQotICAgIFByb3BlcnR5RGV0YWlscyBleHRyYWN0UHJvcGVydHlEZXRhaWxzKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXNGb3JFeHRyYWN0aW9uKQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcmVzdWx0ID0gZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IocHJvcGVydGllc0ZvckV4dHJhY3Rpb24pDQotICAgICAgICAgICAgICAgIC5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpDQotICAgICAgICAgICAgICAgIC5nZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdC5nZXRCYXNlT2JqZWN0KCkgPT0gbnVsbCAmJiB0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5sb2dnZXIud2Fybigibm8gYmFzZSBvYmplY3QgYXQgIiArIHJlc3VsdC5nZXRLZXkoKSArDQotICAgICAgICAgICAgICAgICAgICAiIGNvbXBvbmVudC1pZDogIiArIHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC5nZXRCYXNlT2JqZWN0KCkgIT0gbnVsbCA/IHJlc3VsdCA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogYWxzbyBpbnZva2VzIG1ldGEtZGF0YSBleHRyYWN0aW9uIGludGVyY2VwdG9ycw0KLSAgICAgKiAoc2VlIGUuZy4gRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcikNCi0gICAgICovDQotICAgIE1ldGFEYXRhRXh0cmFjdG9yIGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yV2l0aChwcm9wZXJ0aWVzKTsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIGluaXRDb21wb25lbnRXaXRoUHJvcGVydHlEZXRhaWxzKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBDbGFzc1tdIGZvdW5kR3JvdXBzID0gcmVzb2x2ZUdyb3VwcyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmIChmb3VuZEdyb3VwcyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGZvdW5kR3JvdXBzLmxlbmd0aCA9PSAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvdW5kR3JvdXBzID0gbmV3IENsYXNzW117RGVmYXVsdC5jbGFzc307DQotICAgICAgICB9DQotDQotICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIHRhcmdldENsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyh0YXJnZXRDbGFzcyk7DQotDQotICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBlbGVtZW50RGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3JGb3IodGFyZ2V0Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpKTsNCi0NCi0gICAgICAgIGlmIChlbGVtZW50RGVzY3JpcHRvciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHByb2Nlc3NFbGVtZW50RGVzY3JpcHRvcihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBmb3VuZEdyb3VwcywgZWxlbWVudERlc2NyaXB0b3IpOw0KLSAgICB9DQotDQotICAgIHZvaWQgcHJvY2Vzc0VsZW1lbnREZXNjcmlwdG9yKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1tdIGZvdW5kR3JvdXBzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBlbGVtZW50RGVzY3JpcHRvcikNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YTsNCi0NCi0gICAgICAgIGZvciAoQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gY29uc3RyYWludERlc2NyaXB0b3IgOg0KLSAgICAgICAgICAgICAgICBlbGVtZW50RGVzY3JpcHRvci5maW5kQ29uc3RyYWludHMoKS51bm9yZGVyZWRBbmRNYXRjaGluZ0dyb3Vwcyhmb3VuZEdyb3VwcykuZ2V0Q29uc3RyYWludERlc2NyaXB0b3JzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGEgPSB0cmFuc2Zvcm1Db25zdHJhaW50RGVzY3JpcHRvclRvTWV0YURhdGEoDQotICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50RGVzY3JpcHRvciwgZWxlbWVudERlc2NyaXB0b3IuZ2V0RWxlbWVudENsYXNzKCkpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YSAhPSBudWxsICYmICFtZXRhRGF0YS5pc0VtcHR5KCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiQ29uc3RyYWludERlc2NyaXB0b3IjaXNSZXBvcnRBc1NpbmdsZVZpb2xhdGlvbiIpDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1Db25zdHJhaW50RGVzY3JpcHRvclRvTWV0YURhdGEoDQotICAgICAgICAgICAgQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gY29uc3RyYWludERlc2NyaXB0b3IsIENsYXNzIGVsZW1lbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0NCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSBFeHRWYWxVdGlscy5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KA0KLSAgICAgICAgICAgICAgICBuZXcgQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5KGNvbnN0cmFpbnREZXNjcmlwdG9yLCBlbGVtZW50Q2xhc3MpKTsNCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LnB1dEFsbCh0cmFuc2Zvcm1NZXRhRGF0YShtZXRhRGF0YVRyYW5zZm9ybWVyLCBjb25zdHJhaW50RGVzY3JpcHRvcikpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKCFjb25zdHJhaW50RGVzY3JpcHRvci5pc1JlcG9ydEFzU2luZ2xlVmlvbGF0aW9uKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgU2V0PENvbnN0cmFpbnREZXNjcmlwdG9yPD8+PiBjb21wb3NpbmdDb25zdHJhaW50cyA9IGNvbnN0cmFpbnREZXNjcmlwdG9yLmdldENvbXBvc2luZ0NvbnN0cmFpbnRzKCk7DQotICAgICAgICAgICAgaWYgKGNvbXBvc2luZ0NvbnN0cmFpbnRzICE9IG51bGwgJiYgIWNvbXBvc2luZ0NvbnN0cmFpbnRzLmlzRW1wdHkoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXRBbGwodHJhbnNmb3JtQ29tcG9zaW5nQ29uc3RyYWludHMoY29tcG9zaW5nQ29uc3RyYWludHMsIGVsZW1lbnRDbGFzcykpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybUNvbXBvc2luZ0NvbnN0cmFpbnRzKA0KLSAgICAgICAgICAgIFNldDxDb25zdHJhaW50RGVzY3JpcHRvcjw/Pj4gY29tcG9zaW5nQ29uc3RyYWludHMsIENsYXNzIGVsZW1lbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIGZvciAoQ29uc3RyYWludERlc2NyaXB0b3IgY29uc3RyYWludERlc2NyaXB0b3IgOiBjb21wb3NpbmdDb25zdHJhaW50cykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQucHV0QWxsKHRyYW5zZm9ybUNvbnN0cmFpbnREZXNjcmlwdG9yVG9NZXRhRGF0YShjb25zdHJhaW50RGVzY3JpcHRvciwgZWxlbWVudENsYXNzKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YSgNCi0gICAgICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIsIENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IGNvbnN0cmFpbnREZXNjcmlwdG9yKQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUVudHJ5IGVudHJ5Ow0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQ7DQotICAgICAgICBpZiAodGhpcy5sb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGVudHJ5ID0gbmV3IE1ldGFEYXRhRW50cnkoKTsNCi0gICAgICAgIGVudHJ5LnNldEtleShjb25zdHJhaW50RGVzY3JpcHRvci5nZXRBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgZW50cnkuc2V0VmFsdWUoY29uc3RyYWludERlc2NyaXB0b3IpOw0KLQ0KLSAgICAgICAgcmVzdWx0ID0gbWV0YURhdGFUcmFuc2Zvcm1lci5jb252ZXJ0TWV0YURhdGEoZW50cnkpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBib29sZWFuIGhhc0JlYW5WYWxpZGF0aW9uQ29uc3RyYWludHMoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMuZ2V0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKSk7DQotDQotICAgICAgICByZXR1cm4gZ2V0RGVzY3JpcHRvckZvcih0YXJnZXRDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCkpICE9IG51bGw7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb24+IHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIENsYXNzIGJhc2VCZWFuQ2xhc3MgPSBnZXRCYXNlQ2xhc3NUeXBlKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGdldFByb3BlcnR5VG9WYWxpZGF0ZShwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIENsYXNzW10gZ3JvdXBzID0gcmVzb2x2ZUdyb3VwcyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmIChncm91cHMgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFZhbGlkYXRvckZhY3RvcnkgdmFsaWRhdG9yRmFjdG9yeSA9IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWYWxpZGF0b3JGYWN0b3J5KCk7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeQ0KLSAgICAgICAgICAgICAgICAudXNpbmdDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLm1lc3NhZ2VJbnRlcnBvbGF0b3IoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKSkNCi0gICAgICAgICAgICAgICAgLmNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KHZhbGlkYXRvckZhY3RvcnkuZ2V0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoKSkNCi0gICAgICAgICAgICAgICAgLnRyYXZlcnNhYmxlUmVzb2x2ZXIodmFsaWRhdG9yRmFjdG9yeS5nZXRUcmF2ZXJzYWJsZVJlc29sdmVyKCkpDQotICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0b3IoKQ0KLSAgICAgICAgICAgICAgICAudmFsaWRhdGVWYWx1ZShiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eU5hbWUsIGNvbnZlcnRlZE9iamVjdCwgZ3JvdXBzKTsNCi0gICAgfQ0KLQ0KLSAgICBDbGFzcyBnZXRCYXNlQ2xhc3NUeXBlKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgcmVzdWx0ID0gRXh0VmFsVXRpbHMuZ2V0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5SW5mb3JtYXRpb24pLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpOw0KLQ0KLSAgICAgICAgcmV0dXJuIFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MocmVzdWx0KTsNCi0gICAgfQ0KLQ0KLSAgICBTdHJpbmcgZ2V0UHJvcGVydHlUb1ZhbGlkYXRlKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFByb3BlcnR5RGV0YWlscyhwcm9wZXJ0eUluZm9ybWF0aW9uKS5nZXRQcm9wZXJ0eSgpOw0KLSAgICB9DQotDQotICAgIENsYXNzW10gcmVzb2x2ZUdyb3VwcyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRHcm91cHMoDQotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldFZpZXdJZCgpLA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpKTsNCi0gICAgfQ0KLQ0KLSAgICBFbGVtZW50RGVzY3JpcHRvciBnZXREZXNjcmlwdG9yRm9yKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIEJlYW5EZXNjcmlwdG9yIGJlYW5EZXNjcmlwdG9yID0gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZhbGlkYXRvckZhY3RvcnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdG9yKCkuZ2V0Q29uc3RyYWludHNGb3JDbGFzcyh0YXJnZXRDbGFzcyk7DQotDQotICAgICAgICByZXR1cm4gYmVhbkRlc2NyaXB0b3IuZ2V0Q29uc3RyYWludHNGb3JQcm9wZXJ0eShwcm9wZXJ0eSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M3Yzg1Ni4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5tZXNzYWdlLmludGVycG9sYXRvci5EZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5tZXNzYWdlLmludGVycG9sYXRvci5FeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuTW9kZWxWYWxpZGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuTW9kZWxWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWwuQmVhblZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLk1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuR3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yRmFjdG9yeTsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGNsYXNzIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBpbXBsZW1lbnRzIEdyb3VwU3RvcmFnZSwgTW9kZWxWYWxpZGF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5jbGFzcy5nZXROYW1lKCkgKyAiOktFWSI7DQotDQotICAgIHByaXZhdGUgTWVzc2FnZUludGVycG9sYXRvciBkZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcjsNCi0NCi0gICAgcHJpdmF0ZSBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOw0KLQ0KLSAgICBwcml2YXRlIEdyb3VwU3RvcmFnZSBncm91cFN0b3JhZ2U7DQotDQotICAgIHByaXZhdGUgTW9kZWxWYWxpZGF0aW9uU3RvcmFnZSBtb2RlbFZhbGlkYXRpb25TdG9yYWdlOw0KLQ0KLSAgICBwcml2YXRlIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCgpDQotICAgIHsNCi0gICAgICAgIGluaXRHcm91cFN0b3JhZ2UoKTsNCi0gICAgICAgIGluaXRNb2RlbFZhbGlkYXRpb25TdG9yYWdlKCk7DQotDQotICAgICAgICBpbml0TWVzc2FnZVJlc29sdmVyKCk7DQotICAgICAgICBpbml0TWVzc2FnZUludGVycG9sYXRvcigpOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyBzdGF0aWMgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGdldEN1cnJlbnRJbnN0YW5jZSgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7DQotDQotICAgICAgICBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgY3VycmVudENvbnRleHQgPSAoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0KXJlcXVlc3RNYXAuZ2V0KEtFWSk7DQotDQotICAgICAgICBpZihjdXJyZW50Q29udGV4dCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gbmV3IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCgpOw0KLSAgICAgICAgICAgIHJlcXVlc3RNYXAucHV0KEtFWSwgY3VycmVudENvbnRleHQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRDb250ZXh0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWxpZGF0b3JGYWN0b3J5IGdldFZhbGlkYXRvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgdmFsaWRhdG9yRmFjdG9yeSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KFZhbGlkYXRvckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGlmKHZhbGlkYXRvckZhY3RvcnkgaW5zdGFuY2VvZiBWYWxpZGF0b3JGYWN0b3J5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoVmFsaWRhdG9yRmFjdG9yeSl2YWxpZGF0b3JGYWN0b3J5Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oImZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0IGJ2IHZhbGlkYXRvciBmYWN0b3J5Iik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gQmVhblZhbGlkYXRpb25VdGlscy5nZXREZWZhdWx0VmFsaWRhdG9yRmFjdG9yeSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlSW50ZXJwb2xhdG9yIGdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLm1lc3NhZ2VSZXNvbHZlciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgRXh0VmFsTWVzc2FnZUludGVycG9sYXRvckFkYXB0ZXIodGhpcy5kZWZhdWx0TWVzc2FnZUludGVycG9sYXRvciwgdGhpcy5tZXNzYWdlUmVzb2x2ZXIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkR3JvdXAoQ2xhc3MgZ3JvdXBDbGFzcywgU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmdyb3VwU3RvcmFnZS5hZGRHcm91cChncm91cENsYXNzLCB2aWV3SWQsIGNsaWVudElkKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZXN0cmljdEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5ncm91cFN0b3JhZ2UucmVzdHJpY3RHcm91cChncm91cENsYXNzLCB2aWV3SWQsIGNsaWVudElkKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3NbXSBnZXRHcm91cHMoU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5ncm91cFN0b3JhZ2UuZ2V0R3JvdXBzKHZpZXdJZCwgY2xpZW50SWQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkobW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllc1RvVmFsaWRhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdEdyb3VwU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZ3JvdXBTdG9yYWdlID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmdldFN0b3JhZ2UoR3JvdXBTdG9yYWdlLmNsYXNzLCBCZWFuVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMubW9kZWxWYWxpZGF0aW9uU3RvcmFnZSA9IEV4dFZhbFV0aWxzLg0KLSAgICAgICAgICAgICAgICBnZXRTdG9yYWdlKE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MsIE1vZGVsVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TWVzc2FnZUludGVycG9sYXRvcigpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmb3VuZEJlYW4gPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4oTWVzc2FnZUludGVycG9sYXRvci5jbGFzcy5nZXROYW1lKCkucmVwbGFjZSgiLiIsICJfIikpOw0KLQ0KLSAgICAgICAgaWYoZm91bmRCZWFuIGluc3RhbmNlb2YgTWVzc2FnZUludGVycG9sYXRvcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmRlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yID0gKE1lc3NhZ2VJbnRlcnBvbGF0b3IpZm91bmRCZWFuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuZGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IgPSBuZXcgRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IoDQotICAgICAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVXRpbHMuZ2V0RGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKS5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TWVzc2FnZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlUmVzb2x2ZXIgPSBFeHRWYWxVdGlscy5nZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koZ2V0QmVhblZhbGlkYXRpb25TdHJhdGVneSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSBnZXRCZWFuVmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kobnVsbCwgbnVsbCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzY5ZDMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50Ci0gICAgICAgIC5BYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSB4LnguMwotICovCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlUmVxdWlyZWRBdHRyaWJ1dGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYoIUV4dFZhbFV0aWxzLmludGVycHJldEVtcHR5U3RyaW5nVmFsdWVzQXNOdWxsKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpIHx8Ci0gICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhpc0NvbXBvbmVudFJlcXVpcmVkKHVpQ29tcG9uZW50KSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL0JlYW5WYWxpZGF0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL0JlYW5WYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OTMzYTkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9CZWFuVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmdyb3Vwcy5EZWZhdWx0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLQ0KLUBUYXJnZXQoe01FVEhPRCwgRklFTEQsIFRZUEV9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1ARG9jdW1lbnRlZA0KLXB1YmxpYyBAaW50ZXJmYWNlIEJlYW5WYWxpZGF0aW9uDQotew0KLSAgICBTdHJpbmdbXSB2aWV3SWRzKCkgZGVmYXVsdCAiKiI7DQotDQotICAgIENsYXNzW10gdXNlR3JvdXBzKCkgZGVmYXVsdCBEZWZhdWx0LmNsYXNzOw0KLQ0KLSAgICBDbGFzc1tdIHJlc3RyaWN0R3JvdXBzKCkgZGVmYXVsdCB7fTsNCi0NCi0gICAgU3RyaW5nW10gY29uZGl0aW9ucygpIGRlZmF1bHQgIiN7dHJ1ZX0iOw0KLQ0KLSAgICBNb2RlbFZhbGlkYXRpb24gbW9kZWxWYWxpZGF0aW9uKCkgZGVmYXVsdCBATW9kZWxWYWxpZGF0aW9uOw0KLSAgICANCi0gICAgQFJldGVudGlvbihSVU5USU1FKSBzdGF0aWMgQGludGVyZmFjZSBMaXN0DQotICAgIHsNCi0gICAgICAgIEJlYW5WYWxpZGF0aW9uW10gdmFsdWUoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL01vZGVsVmFsaWRhdGlvbi5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9Nb2RlbFZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjNzhkZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL01vZGVsVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLQ0KLUBUYXJnZXQoe01FVEhPRCwgRklFTEQsIFRZUEV9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1ARG9jdW1lbnRlZA0KLXB1YmxpYyBAaW50ZXJmYWNlIE1vZGVsVmFsaWRhdGlvbg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVCA9ICIiOw0KLQ0KLSAgICBib29sZWFuIGlzQWN0aXZlKCkgZGVmYXVsdCBmYWxzZTsNCi0NCi0gICAgYm9vbGVhbiBkaXNwbGF5SW5saW5lKCkgZGVmYXVsdCBmYWxzZTsNCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInN1cHBvcnQgcHJvcGVydHkgY2hhaW4gc3ludGF4IikNCi0gICAgU3RyaW5nW10gdmFsaWRhdGlvblRhcmdldHMoKSBkZWZhdWx0IERFRkFVTFQ7DQotDQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCBERUZBVUxUOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3IuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTZmMTM1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5leHRyYWN0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ1c2UgbWV0YS1kYXRhIHN0b3JhZ2UgLSBidXQgYSBzcGVjaWFsIGltcGwuIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3IgZXh0ZW5kcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3INCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFByb3BlcnR5RGV0YWlscykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihvYmplY3QuZ2V0Q2xhc3MoKSArICIgaXMgbm90IGEgIiArIFByb3BlcnR5RGV0YWlscy5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IChQcm9wZXJ0eURldGFpbHMpb2JqZWN0Ow0KLQ0KLSAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKSk7DQotDQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsNCi0gICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uc2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsNCi0NCi0gICAgICAgIGV4dHJhY3RBbm5vdGF0aW9ucyhwcm9wZXJ0eUluZm9ybWF0aW9uLCBwcm9wZXJ0eURldGFpbHMsIGVudGl0eUNsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ZhY3RvcnkvRXh0VmFsQXBwbGljYXRpb25GYWN0b3J5LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9mYWN0b3J5L0V4dFZhbEFwcGxpY2F0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Zjc1ZGNhLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ZhY3RvcnkvRXh0VmFsQXBwbGljYXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uV3JhcHBlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMi54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxBcHBsaWNhdGlvbkZhY3RvcnkgZXh0ZW5kcyBBcHBsaWNhdGlvbkZhY3RvcnkNCi17DQotICAgIHByaXZhdGUgQXBwbGljYXRpb25GYWN0b3J5IHdyYXBwZWQ7DQotDQotICAgIHB1YmxpYyBFeHRWYWxBcHBsaWNhdGlvbkZhY3RvcnkoQXBwbGljYXRpb25GYWN0b3J5IHdyYXBwZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEFwcGxpY2F0aW9uRmFjdG9yeSBnZXRXcmFwcGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0V3JhcHBlZCgpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuSElHSCwgZGVzY3JpcHRpb24gPSAiY29udGV4dCBwYXJhbS4gdG8gZGVhY3RpdmF0ZSB0aGlzIHdyYXBwZXIiKQ0KLSAgICBwdWJsaWMgQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uV3JhcHBlcigpIHsNCi0NCi0gICAgICAgICAgICBwdWJsaWMgQXBwbGljYXRpb24gZ2V0V3JhcHBlZCgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRBcHBsaWNhdGlvbigpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZhdWx0VmFsaWRhdG9ySWQoU3RyaW5nIHMpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZighImphdmF4LmZhY2VzLkJlYW4iLmVxdWFscyhzKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgc3VwZXIuYWRkRGVmYXVsdFZhbGlkYXRvcklkKHMpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikNCi0gICAgew0KLSAgICAgICAgd3JhcHBlZC5zZXRBcHBsaWNhdGlvbihhcHBsaWNhdGlvbik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvQmVhblZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvQmVhblZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzc3NWM3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0JlYW5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogZXh0cmFjdHMgYW5kIGFkZHMgdGhlIGV4dHZhbCBidiBtZXRhLWRhdGEgKGUuZy4gdmFsaWRhdGlvbiBncm91cHMpIHRvIHRoZSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIgJiYgaXNCbG9ja2luZ0V4Y2VwdGlvbih1aUNvbXBvbmVudCwgdmFsaWRhdG9yRXhjZXB0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2J2IGludGVncmF0aW9uIGRvZXNuJ3QgdGhyb3cgZXhjZXB0aW9ucyB0byBzdXBwb3J0IG11bHRpcGxlIG1lc3NhZ2VzIC0+IHNldCBjb21wb25lbnQgc3RhdGUNCi0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFZhbGlkKGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0Jsb2NraW5nRXhjZXB0aW9uKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpLnNldmVyaXR5Q2F1c2VzVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvQmVhblZhbGlkYXRpb25UYWdBd2FyZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvQmVhblZhbGlkYXRpb25UYWdBd2FyZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2M0NjM4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0JlYW5WYWxpZGF0aW9uVGFnQXdhcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuQmVhblZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDIueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25UYWdBd2FyZVZhbGlkYXRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlciAmJiAvLyJmaWx0ZXIiIGNyb3NzLXZhbGlkYXRpb24gY2FsbHMNCi0gICAgICAgICAgICAgICAgcHJvcGVydGllcy5jb250YWluc0tleShQcm9wZXJ0eUluZm9ybWF0aW9uLmNsYXNzLmdldE5hbWUoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5zcGVjdFZhbGlkYXRvcnMoZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZ2V0Vmlld0lkKCksDQotICAgICAgICAgICAgICAgICAgICAoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCksDQotICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmdldFZhbGlkYXRvcnMoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgLy9ub3QgdXNlZA0KLSAgICB9DQotDQotICAgIEBUb0RvLkxpc3Qoe0BUb0RvKHZhbHVlID0gUHJpb3JpdHkuSElHSCwgZGVzY3JpcHRpb24gPSAib3B0aW1pemUiKSwNCi0gICAgICAgICAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkhJR0gsIGRlc2NyaXB0aW9uID0gInVzZSByZWZsZWN0aW9uIGluc3RlYWQgb2YgQmVhblZhbGlkYXRvciBmb3IganNmIDEueCB2ZXJzaW9ucyIpLA0KLSAgICAgICAgICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuSElHSCwgZGVzY3JpcHRpb24gPSAidGVzdCIpDQotICAgIH0pDQotICAgIHByaXZhdGUgdm9pZCBpbnNwZWN0VmFsaWRhdG9ycyhTdHJpbmcgdmlld0lkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdGFibGVWYWx1ZUhvbGRlciBlZGl0YWJsZVZhbHVlSG9sZGVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsaWVudElkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yW10gdmFsaWRhdG9ycykNCi0gICAgew0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkYXRvcnNPZlRhZ0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvciAoVmFsaWRhdG9yIHZhbGlkYXRvciA6IHZhbGlkYXRvcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kb24ndCBjaGVjayB3aXRoIGluc3RhbmNlb2YNCi0gICAgICAgICAgICBpZiAodmFsaWRhdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscyhCZWFuVmFsaWRhdG9yLmNsYXNzLmdldE5hbWUoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3JzT2ZUYWdMaXN0LmFkZEFsbCgNCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCgoQmVhblZhbGlkYXRvcikgdmFsaWRhdG9yKS5nZXRWYWxpZGF0aW9uR3JvdXBzKCkuc3BsaXQoIiwiKSkpOw0KLQ0KLSAgICAgICAgICAgICAgICAvL3ByZXZlbnQgZG91YmxlLXZhbGlkYXRpb24NCi0gICAgICAgICAgICAgICAgZWRpdGFibGVWYWx1ZUhvbGRlci5yZW1vdmVWYWxpZGF0b3IodmFsaWRhdG9yKTsNCi0gICAgICAgICAgICAgICAgZWRpdGFibGVWYWx1ZUhvbGRlci5hZGRWYWxpZGF0b3IobmV3IEJlYW5WYWxpZGF0b3JXcmFwcGVyKChCZWFuVmFsaWRhdG9yKXZhbGlkYXRvcikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzczsNCi0gICAgICAgIGZvcihTdHJpbmcgZ3JvdXBDbGFzc05hbWUgOiB2YWxpZGF0b3JzT2ZUYWdMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKGdyb3VwQ2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZihjdXJyZW50Q2xhc3MgIT0gbnVsbCAmJiBjdXJyZW50Q2xhc3MuaXNJbnRlcmZhY2UoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5hZGRHcm91cChjdXJyZW50Q2xhc3MsIHZpZXdJZCwgY2xpZW50SWQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihncm91cENsYXNzTmFtZSArICIgaXMgbm8gdmFsaWQgZ3JvdXAgLSBvbmx5IGV4aXN0aW5nIGludGVyZmFjZXMgYXJlIGFsbG93ZWQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9CZWFuVmFsaWRhdG9yV3JhcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvQmVhblZhbGlkYXRvcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZlYzI5Ny4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9CZWFuVmFsaWRhdG9yV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5CZWFuVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLQ0KLS8qKg0KLSAqIHJlcGxhY2VtZW50IGZvciBCZWFuVmFsaWRhdG9yIHdoaWNoIGdldHMgYWRkZWQgZHVlIHRvIGY6dmFsaWRhdGVCZWFuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMi54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIEJlYW5WYWxpZGF0b3JXcmFwcGVyIGV4dGVuZHMgQmVhblZhbGlkYXRvcg0KLXsNCi0gICAgcHJpdmF0ZSBCZWFuVmFsaWRhdG9yIHdyYXBwZWQ7DQotDQotICAgIEJlYW5WYWxpZGF0b3JXcmFwcGVyKEJlYW5WYWxpZGF0b3Igd3JhcHBlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQmVhblZhbGlkYXRvciBnZXRXcmFwcGVkQmVhblZhbGlkYXRvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0V3JhcHBlZChCZWFuVmFsaWRhdG9yIHdyYXBwZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvbkdyb3VwcyhTdHJpbmcgcykNCi0gICAgew0KLSAgICAgICAgd3JhcHBlZC5zZXRWYWxpZGF0aW9uR3JvdXBzKHMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvbkdyb3VwcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFZhbGlkYXRpb25Hcm91cHMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgdmFsaWRhdGUgLSB0aGUgZXh0dmFsIGJlYW4tdmFsaWRhdGlvbiBhZGFwdGVyIHdpbGwgZG8gdGhhdA0KLSAgICB9DQotDQotICAgIC8qDQotICAgIHB1YmxpYyBPYmplY3Qgc2F2ZVN0YXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCByZXN1bHRbXSA9IG5ldyBPYmplY3RbMV07DQotICAgICAgICByZXN1bHRbMF0gPSB3cmFwcGVkLmdldFZhbGlkYXRpb25Hcm91cHMoKTsNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBzdGF0ZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gbmV3IEJlYW5WYWxpZGF0b3IoKTsNCi0NCi0gICAgICAgIGlmIChzdGF0ZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZXNbXSA9IChPYmplY3RbXSkgc3RhdGU7DQotICAgICAgICAgICAgdGhpcy53cmFwcGVkLnNldFZhbGlkYXRpb25Hcm91cHMoKFN0cmluZykgdmFsdWVzWzBdKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICAqLw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBtYXJrSW5pdGlhbFN0YXRlKCkNCi0gICAgew0KLSAgICAgICAgd3JhcHBlZC5tYXJrSW5pdGlhbFN0YXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaW5pdGlhbFN0YXRlTWFya2VkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaW5pdGlhbFN0YXRlTWFya2VkKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgY2xlYXJJbml0aWFsU3RhdGUoKQ0KLSAgICB7DQotICAgICAgICB3cmFwcGVkLmNsZWFySW5pdGlhbFN0YXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNUcmFuc2llbnQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5pc1RyYW5zaWVudCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zaWVudChib29sZWFuIGIpDQotICAgIHsNCi0gICAgICAgIHdyYXBwZWQuc2V0VHJhbnNpZW50KGIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0V4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0V4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjZjcwZi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuVmFsaWRhdGlvbk1vZHVsZUF3YXJlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLkJlYW5WYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC51dGlsLkJlYW5WYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIGV4dHJhY3RzIGFuZCBhZGRzIHRoZSBleHR2YWwgYnYgbWV0YS1kYXRhIChlLmcuIHZhbGlkYXRpb24gZ3JvdXBzKSB0byB0aGUgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotICAgICAgICBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLCBWYWxpZGF0aW9uTW9kdWxlQXdhcmUNCi17DQotICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKHByb3BlcnR5SW5mb3JtYXRpb24uY29udGFpbnNJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5DVVNUT01fUFJPUEVSVElFUykpDQotICAgICAgICB7DQotICAgICAgICAgICAgTWFwIHByb3BlcnRpZXMgPSBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkNVU1RPTV9QUk9QRVJUSUVTLCBNYXAuY2xhc3MpOw0KLQ0KLSAgICAgICAgICAgIGlmKHByb3BlcnRpZXMgIT0gbnVsbCAmJiBwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFVJQ29tcG9uZW50LmNsYXNzLmdldE5hbWUoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCA9IChVSUNvbXBvbmVudClwcm9wZXJ0aWVzLmdldChVSUNvbXBvbmVudC5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMuZ2V0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgICAgICAgICBwcm9jZXNzRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YSh1aUNvbXBvbmVudCwgcHJvcGVydHlEZXRhaWxzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIGFkZHMgdGhlIGV4dHZhbCBidiBtZXRhLWRhdGEgdG8gdGhlIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dA0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgY3VycmVudCBjb21wb25lbnQNCi0gICAgICogQHBhcmFtIHByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eSBkZXRhaWxzIG9mIHRoZSB2YWx1ZS1iaW5kaW5nDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0V4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGEoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMpDQotICAgIHsNCi0gICAgICAgIGlmKEpzZlV0aWxzLmlzUmVuZGVyUmVzcG9uc2VQaGFzZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVXRpbHMuYWRkTWV0YURhdGFUb0NvbnRleHQodWlDb21wb25lbnQsIHByb3BlcnR5RGV0YWlscywgZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVXRpbHMuYWRkTWV0YURhdGFUb0NvbnRleHQodWlDb21wb25lbnQsIHByb3BlcnR5RGV0YWlscywgdHJ1ZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldE1vZHVsZUtleXMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtCZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCl9Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL1Jlc2V0QmVhblZhbGlkYXRpb25SZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9SZXNldEJlYW5WYWxpZGF0aW9uUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjFkMTMzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL1Jlc2V0QmVhblZhbGlkYXRpb25SZW5kZXJlckludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIHNlcGFyYXRlZCBmb3IgZWFzaWVyIHN5bmMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAyLnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFJlc2V0QmVhblZhbGlkYXRpb25SZW5kZXJlckludGVyY2VwdG9yIGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yDQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpDQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2hCYWNrVmFsaWRhdG9ycygoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHN3aXRjaEJhY2tWYWxpZGF0b3JzKEVkaXRhYmxlVmFsdWVIb2xkZXIgZWRpdGFibGVWYWx1ZUhvbGRlcikNCi0gICAgew0KLSAgICAgICAgZm9yKFZhbGlkYXRvciB2YWxpZGF0b3IgOiBlZGl0YWJsZVZhbHVlSG9sZGVyLmdldFZhbGlkYXRvcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWxpZGF0b3IgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdG9yV3JhcHBlcikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGVkaXRhYmxlVmFsdWVIb2xkZXIuYWRkVmFsaWRhdG9yKCgoQmVhblZhbGlkYXRvcldyYXBwZXIpdmFsaWRhdG9yKS5nZXRXcmFwcGVkQmVhblZhbGlkYXRvcigpKTsNCi0gICAgICAgICAgICAgICAgZWRpdGFibGVWYWx1ZUhvbGRlci5yZW1vdmVWYWxpZGF0b3IodmFsaWRhdG9yKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0Fic3RyYWN0QmVhblZhbGlkYXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZmRhMGQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QmVhblZhbGlkYXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyPFQgZXh0ZW5kcyBBbm5vdGF0aW9uPiBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIENvbnN0cmFpbnREZXNjcmlwdG9yPD8gZXh0ZW5kcyBUPiBjb25zdHJhaW50RGVzY3JpcHRvciA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoQ29uc3RyYWludERlc2NyaXB0b3IuY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYoaXNDbGllbnRTaWRlVmFsaWRhdGlvbkVuYWJsZWQoY29uc3RyYWludERlc2NyaXB0b3IpICYmIGlzQmxvY2tpbmdDb25zdHJhaW50KGNvbnN0cmFpbnREZXNjcmlwdG9yKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtTWV0YURhdGEoKENvbnN0cmFpbnREZXNjcmlwdG9yPFQ+KWNvbnN0cmFpbnREZXNjcmlwdG9yKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ2xpZW50U2lkZVZhbGlkYXRpb25FbmFibGVkKENvbnN0cmFpbnREZXNjcmlwdG9yPD8gZXh0ZW5kcyBUPiBjb25zdHJhaW50RGVzY3JpcHRvcikNCi0gICAgew0KLSAgICAgICAgZm9yKENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPiBwYXlsb2FkIDogY29uc3RyYWludERlc2NyaXB0b3IuZ2V0UGF5bG9hZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNCbG9ja2luZ0NvbnN0cmFpbnQoQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gY29uc3RyYWludERlc2NyaXB0b3IpDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZSB0ZXN0TWVzc2FnZSA9IG5ldyBGYWNlc01lc3NhZ2UoKTsNCi0gICAgICAgIHRlc3RNZXNzYWdlLnNldFNldmVyaXR5KFZpb2xhdGlvblNldmVyaXR5LkVycm9yLlZBTFVFKTsNCi0NCi0gICAgICAgIGZvciAoQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+IHBheWxvYWQgOiBjb25zdHJhaW50RGVzY3JpcHRvci5nZXRQYXlsb2FkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzKS5pc0Fzc2lnbmFibGVGcm9tKHBheWxvYWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGVzdE1lc3NhZ2Uuc2V0U2V2ZXJpdHkoVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5WQUxVRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYoRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKFZpb2xhdGlvblNldmVyaXR5LkluZm8uY2xhc3MpLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0ZXN0TWVzc2FnZS5zZXRTZXZlcml0eShWaW9sYXRpb25TZXZlcml0eS5JbmZvLlZBTFVFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZihFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoVmlvbGF0aW9uU2V2ZXJpdHkuRmF0YWwuY2xhc3MpLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0ZXN0TWVzc2FnZS5zZXRTZXZlcml0eShWaW9sYXRpb25TZXZlcml0eS5GYXRhbC5WQUxVRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLnNldmVyaXR5QmxvY2tzU3VibWl0Rm9yQ29tcG9uZW50SWQobnVsbCwgdGVzdE1lc3NhZ2UpOw0KLSAgICB9DQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKENvbnN0cmFpbnREZXNjcmlwdG9yPFQ+IGNvbnN0cmFpbnREZXNjcmlwdG9yKTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL05vdE51bGxNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMDhkNWEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdEJlYW5WYWxpZGF0aW9uTWV0YURhdGFUcmFuc2Zvcm1lcjxOb3ROdWxsPg0KLXsNCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoQ29uc3RyYWludERlc2NyaXB0b3I8Tm90TnVsbD4gY29uc3RyYWludERlc2NyaXB0b3IpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgaWYoRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9TdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU3RyaW5nU2l6ZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE5ZmY1OC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9TdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFN0cmluZ1NpemVNZXRhRGF0YVRyYW5zZm9ybWVyIGV4dGVuZHMgQWJzdHJhY3RCZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXI8U2l6ZT4NCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKENvbnN0cmFpbnREZXNjcmlwdG9yPFNpemU+IGNvbnN0cmFpbnREZXNjcmlwdG9yKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIFNpemUgYW5ub3RhdGlvbiA9IGNvbnN0cmFpbnREZXNjcmlwdG9yLmdldEFubm90YXRpb24oKTsNCi0NCi0gICAgICAgIGludCBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW4oKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gIT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSCwgbWluaW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEhfREVGQVVMVCwgbWluaW11bSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpbnQgbWF4aW11bSA9IGFubm90YXRpb24ubWF4KCk7DQotICAgICAgICBpZihtYXhpbXVtICE9IEludGVnZXIuTUFYX1ZBTFVFKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RILCBtYXhpbXVtKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSF9ERUZBVUxULCBtYXhpbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBlMDMxYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcg0KLSAgICAgICAgLkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZihpc0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3koc291cmNlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgYmVhblZhbGlkYXRpb25BZGFwdGVyID0NCi0gICAgICAgICAgICAgICAgICAgIChCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kpc291cmNlOw0KLQ0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVCZWFuVmFsaWRhdGlvblRyYW5zZm9ybWVyTmFtZShiZWFuVmFsaWRhdGlvbkFkYXB0ZXIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQmVhblZhbGlkYXRpb25TdHJhdGVneShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc291cmNlIGluc3RhbmNlb2YgQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCAgYWJzdHJhY3QgU3RyaW5nIGNyZWF0ZUJlYW5WYWxpZGF0aW9uVHJhbnNmb3JtZXJOYW1lKA0KLSAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvTm90TnVsbE5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9Ob3ROdWxsTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzI4Nzg2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9Ob3ROdWxsTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5Ob3ROdWxsTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLk5lc3RlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ATmVzdGVkDQotQEludm9jYXRpb25PcmRlcigyMDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBOb3ROdWxsTmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0QmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVCZWFuVmFsaWRhdGlvblRyYW5zZm9ybWVyTmFtZShCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgYWRhcHRlcikNCi0gICAgew0KLSAgICAgICAgaWYoaXNOb3ROdWxsQ29uc3RyYWludChhZGFwdGVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXIuY2xhc3MuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTm90TnVsbENvbnN0cmFpbnQoQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5IGFkYXB0ZXIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBOb3ROdWxsLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoDQotICAgICAgICAgICAgICAgIGFkYXB0ZXIuZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKS5nZXRBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaXplTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpemVOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjODkwYzYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpemVOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLk5lc3RlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5TdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBOZXN0ZWQNCi1ASW52b2NhdGlvbk9yZGVyKDIxMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIFNpemVOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZUJlYW5WYWxpZGF0aW9uVHJhbnNmb3JtZXJOYW1lKEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSBhZGFwdGVyKQ0KLSAgICB7DQotICAgICAgICBpZihpc1N0cmluZ1NpemVDb25zdHJhaW50KGFkYXB0ZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBTdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lci5jbGFzcy5nZXROYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTdHJpbmdTaXplQ29uc3RyYWludChCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgYWRhcHRlcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFNpemUuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscygNCi0gICAgICAgICAgICAgICAgYWRhcHRlci5nZXRDb25zdHJhaW50RGVzY3JpcHRvcigpLmdldEFubm90YXRpb24oKS5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSkgJiYNCi0gICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoYWRhcHRlci5nZXRFbGVtZW50Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3BheWxvYWQvRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wYXlsb2FkL0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjJkMjJmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3BheWxvYWQvRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbiBleHRlbmRzIFBheWxvYWQNCi17DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3BheWxvYWQvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3BheWxvYWQvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4OGIyZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wYXlsb2FkL1Zpb2xhdGlvblNldmVyaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmlvbGF0aW9uU2V2ZXJpdHkNCi17DQotICAgIGludGVyZmFjZSBJbmZvIGV4dGVuZHMgUGF5bG9hZA0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgVkFMVUUgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfSU5GTzsNCi0gICAgfQ0KLQ0KLSAgICBpbnRlcmZhY2UgV2FybiBleHRlbmRzIFBheWxvYWQNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFZBTFVFID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk47DQotICAgIH0NCi0NCi0gICAgaW50ZXJmYWNlIEVycm9yIGV4dGVuZHMgUGF5bG9hZA0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgVkFMVUUgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1I7DQotICAgIH0NCi0NCi0gICAgaW50ZXJmYWNlIEZhdGFsIGV4dGVuZHMgUGF5bG9hZA0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgVkFMVUUgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RhcnR1cC9CZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RhcnR1cC9CZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDI2OWVmLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0YXJ0dXAvQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLkJlYW5Bd2FyZVZhbGlkYXRvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC51dGlsLkJlYW5WYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yLkV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yLkJlYW5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyLlNpemVOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIuTm90TnVsbE5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLk1vZGVsVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UubWFwcGVyLkJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5tYXBwZXIuTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5Hcm91cFN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXJIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTUwMjU3NDgzOTk4NzY4MzMzOTRMOw0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXJWYWxpZGF0b3JGYWN0b3J5KCk7DQotICAgICAgICByZWdpc3RlckJlYW5WYWxpZGF0aW9uSW50ZXJjZXB0b3IoKTsNCi0gICAgICAgIHJlZ2lzdGVyTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKTsNCi0gICAgICAgIHJlZ2lzdGVyR3JvdXBTdG9yYWdlTmFtZU1hcHBlcigpOw0KLSAgICAgICAgcmVnaXN0ZXJNb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlcigpOw0KLSAgICAgICAgcmVnaXN0ZXJDb21wb25lbnRJbml0aWFsaXplcnMoKTsNCi0gICAgICAgIHJlZ2lzdGVyTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7DQotICAgICAgICByZWdpc3RlclBoYXNlTGlzdGVuZXJzKCk7DQotICAgICAgICByZWdpc3RlckV4Y2VwdGlvbkludGVyY2VwdG9yKCk7DQotICAgICAgICByZWdpc3RlclZpb2xhdGlvblNldmVyaXR5UGF5bG9hZCgpOw0KLSAgICAgICAgcmVnaXN0ZXJEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb25QYXlsb2FkKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJWYWxpZGF0b3JGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoVmFsaWRhdG9yRmFjdG9yeS5jbGFzcy5nZXROYW1lKCksDQotICAgICAgICAgICAgICAgIG5ldyBCZWFuQXdhcmVWYWxpZGF0b3JGYWN0b3J5KEJlYW5WYWxpZGF0aW9uVXRpbHMuZ2V0RGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKSksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckJlYW5WYWxpZGF0aW9uSW50ZXJjZXB0b3IoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIobmV3IFNpemVOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKG5ldyBOb3ROdWxsTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlckdyb3VwU3RvcmFnZU5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBTdG9yYWdlTWFuYWdlciBzdG9yYWdlTWFuYWdlciA9IGdldFN0b3JhZ2VNYW5hZ2VySG9sZGVyKCkuZ2V0U3RvcmFnZU1hbmFnZXIoR3JvdXBTdG9yYWdlLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmIChzdG9yYWdlTWFuYWdlciBpbnN0YW5jZW9mIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAoKEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxTdHJpbmc+KSBzdG9yYWdlTWFuYWdlcikNCi0gICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgQmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKHN0b3JhZ2VNYW5hZ2VyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGhhcyB0byBpbXBsZW1lbnQgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5ICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgIiBjb3VsZG4ndCByZWdpc3RlciAiICsgQmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyLmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBEZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgbW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgPSBuZXcgRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyKCk7DQotICAgICAgICBtb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5yZWdpc3RlcihuZXcgTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBnZXRTdG9yYWdlTWFuYWdlckhvbGRlcigpLnNldFN0b3JhZ2VNYW5hZ2VyKE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MsIG1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJDb21wb25lbnRJbml0aWFsaXplcnMoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0b3JhZ2VNYW5hZ2VySG9sZGVyIGdldFN0b3JhZ2VNYW5hZ2VySG9sZGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwgU3RvcmFnZU1hbmFnZXJIb2xkZXIuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlck1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclBoYXNlTGlzdGVuZXJzKCkNCi0gICAgew0KLSAgICAgICAgSnNmVXRpbHMucmVnaXN0ZXJQaGFzZUxpc3RlbmVyKG5ldyBNb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyKCkpOw0KLSAgICAgICAgSnNmVXRpbHMucmVnaXN0ZXJQaGFzZUxpc3RlbmVyKG5ldyBNb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyRXhjZXB0aW9uSW50ZXJjZXB0b3IoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IobmV3IEJlYW5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJWaW9sYXRpb25TZXZlcml0eVBheWxvYWQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0IGV4dFZhbENvbnRleHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKTsNCi0NCi0gICAgICAgIGV4dFZhbENvbnRleHQuYWRkR2xvYmFsUHJvcGVydHkoVmlvbGF0aW9uU2V2ZXJpdHkuSW5mby5jbGFzcy5nZXROYW1lKCksIFZpb2xhdGlvblNldmVyaXR5LkluZm8uY2xhc3MsIGZhbHNlKTsNCi0gICAgICAgIGV4dFZhbENvbnRleHQuYWRkR2xvYmFsUHJvcGVydHkoVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcy5nZXROYW1lKCksIFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MsIGZhbHNlKTsNCi0gICAgICAgIGV4dFZhbENvbnRleHQuYWRkR2xvYmFsUHJvcGVydHkoVmlvbGF0aW9uU2V2ZXJpdHkuRmF0YWwuY2xhc3MuZ2V0TmFtZSgpLCBWaW9sYXRpb25TZXZlcml0eS5GYXRhbC5jbGFzcywgZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyBuZWVkIHRvIHJlZ2lzdGVyICJlcnJvciIgaXQncyB0aGUgZGVmYXVsdA0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvblBheWxvYWQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eSgNCi0gICAgICAgICAgICAgICAgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKSwgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLCBmYWxzZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RhcnR1cC9KU0YyQXdhcmVCZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RhcnR1cC9KU0YyQXdhcmVCZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTY5NGQ5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0YXJ0dXAvSlNGMkF3YXJlQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yLlJlc2V0QmVhblZhbGlkYXRpb25SZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5pbnRlcmNlcHRvci5CZWFuVmFsaWRhdGlvblRhZ0F3YXJlVmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDIueC4zDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5ISUdILCBkZXNjcmlwdGlvbiA9ICJhZGQgb3B0aW9uYWwgd2ViLnhtbCBwYXJhbSB0byBkZWFjdGl2YXRlIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKU0YyQXdhcmVCZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTAyNTc0ODM5OTg3NjgzMzM5M0w7DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFJlc2V0QmVhblZhbGlkYXRpb25SZW5kZXJlckludGVyY2VwdG9yKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IEJlYW5WYWxpZGF0aW9uVGFnQXdhcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MDM3NmUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdEdyb3VwU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGJlYW4tdmFsaWRhdGlvbiBncm91cHMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UgZXh0ZW5kcyBEZWZhdWx0R3JvdXBTdG9yYWdlDQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIENsYXNzW10gZ2V0R3JvdXBzKFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgQ2xhc3NbXSByZXN1bHQgPSBzdXBlci5nZXRHcm91cHModmlld0lkLCBjbGllbnRJZCk7DQotDQotICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL3RoZSBkZWZhdWx0IGdyb3VwIHdpbGwgYmUgdmFsaWRhdGVkIGF1dG9tYXRpY2FsbHkNCi0gICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzW10ge307DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgwMGY4Yi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuR3JvdXBVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBzdG9yYWdlIGltcGxlbWVudGF0aW9uIGZvciBtb2RlbC12YWxpZGF0aW9uIGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZSBpbXBsZW1lbnRzIE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4+IG1vZGVsVmFsaWRhdGlvbkVudHJpZXMgPQ0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4+KCk7DQotDQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGNvbXBvbmVudHNPZlJlcXVlc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjbGllbnRJZCA9IGdldEN1cnJlbnRDbGllbnRJZChtb2RlbFZhbGlkYXRpb25FbnRyeSk7DQotDQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QgPSByZXNvbHZlTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeSwgY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkobW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LCBtb2RlbFZhbGlkYXRpb25FbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q3VycmVudENsaWVudElkKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY2xpZW50SWQgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjbGllbnRJZCA9IG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpLmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotDQotICAgICAgICAgICAgaWYoIXRoaXMuY29tcG9uZW50c09mUmVxdWVzdC5jb250YWlucyhjbGllbnRJZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNPZlJlcXVlc3QuYWRkKGNsaWVudElkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY2xpZW50SWQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXNvbHZlTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KA0KLSAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9DQotICAgICAgICAgICAgICAgIHRoaXMubW9kZWxWYWxpZGF0aW9uRW50cmllcy5nZXQoR3JvdXBVdGlscy5nZXRHcm91cEtleSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRWaWV3SWQoKSwgY2xpZW50SWQpKTsNCi0NCi0gICAgICAgIGlmKG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICAgICAgdGhpcy5tb2RlbFZhbGlkYXRpb25FbnRyaWVzLnB1dChHcm91cFV0aWxzLmdldEdyb3VwS2V5KA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Vmlld0lkKCksIGNsaWVudElkKSwgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KA0KLSAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmKCFtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QuY29udGFpbnMobW9kZWxWYWxpZGF0aW9uRW50cnkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdC5hZGQobW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2aWV3SWQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRWaWV3SWQoKTsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotDQotICAgICAgICBhZGRFbnRyaWVzRm9yQ29tcG9uZW50cyh2aWV3SWQsIHJlc3VsdCk7DQotDQotICAgICAgICBhZGRFbnRyaWVzRm9yUGFnZSh2aWV3SWQsIHJlc3VsdCk7DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRFbnRyaWVzRm9yQ29tcG9uZW50cyhTdHJpbmcgdmlld0lkLCBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIGZvcihTdHJpbmcgY3VycmVudENsaWVudElkIDogdGhpcy5jb21wb25lbnRzT2ZSZXF1ZXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwoZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllcyh2aWV3SWQsIGN1cnJlbnRDbGllbnRJZCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRFbnRyaWVzRm9yUGFnZShTdHJpbmcgdmlld0lkLCBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIHJlc3VsdC5hZGRBbGwoZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllcyh2aWV3SWQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGJ1aWxkTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KA0KLSAgICAgICAgICAgIFN0cmluZyBrZXksIE1hcDxTdHJpbmcsIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+PiBncm91cFN0b3JhZ2UpDQotICAgIHsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGxpc3Q7DQotDQotICAgICAgICBpZihrZXkgIT0gbnVsbCAmJiBrZXkuZW5kc1dpdGgoIioiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4oKTsNCi0gICAgICAgICAgICBmb3IoTWFwLkVudHJ5PFN0cmluZyxMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5Pj4gZW50cnkgOiBncm91cFN0b3JhZ2UuZW50cnlTZXQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldEtleSgpLnN1YnN0cmluZygwLCBlbnRyeS5nZXRLZXkoKS5pbmRleE9mKCJAIikpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhrZXkuc3Vic3RyaW5nKDAsIGtleS5pbmRleE9mKCJAIikpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGRBbGwoZW50cnkuZ2V0VmFsdWUoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGxpc3Q7DQotICAgICAgICB9DQotDQotICAgICAgICBsaXN0ID0gZ3JvdXBTdG9yYWdlLmdldChrZXkpOw0KLSAgICAgICAgcmV0dXJuIChsaXN0ICE9IG51bGwpID8gbGlzdCA6IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzKFN0cmluZyB2aWV3SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzKHZpZXdJZCwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzKFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5tb2RlbFZhbGlkYXRpb25FbnRyaWVzLnNpemUoKSA8IDEpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2FkZCBmb3VuZCBncm91cHMNCi0gICAgICAgIFN0cmluZyBrZXk7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHRMaXN0Rm9yUGFnZSA9IG51bGw7DQotDQotICAgICAgICBpZighIioiLmVxdWFscyhjbGllbnRJZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAga2V5ID0gR3JvdXBVdGlscy5nZXRHcm91cEtleSh2aWV3SWQsIG51bGwpOw0KLSAgICAgICAgICAgIHJlc3VsdExpc3RGb3JQYWdlID0NCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KGtleSwgdGhpcy5tb2RlbFZhbGlkYXRpb25FbnRyaWVzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGtleSA9IEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBjbGllbnRJZCk7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHRMaXN0Rm9yQ29tcG9uZW50ID0NCi0gICAgICAgICAgICAgICAgYnVpbGRNb2RlbFZhbGlkYXRpb25FbnRyeUxpc3Qoa2V5LCB0aGlzLm1vZGVsVmFsaWRhdGlvbkVudHJpZXMpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0TGlzdEZvclBhZ2UgPT0gbnVsbCB8fCByZXN1bHRMaXN0Rm9yUGFnZS5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdExpc3RGb3JDb21wb25lbnQ7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKHJlc3VsdExpc3RGb3JDb21wb25lbnQuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRMaXN0Rm9yUGFnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBtZXJnZVJlc3VsdHMocmVzdWx0TGlzdEZvclBhZ2UsIHJlc3VsdExpc3RGb3JDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbWVyZ2VSZXN1bHRzKA0KLSAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IHJlc3VsdExpc3RGb3JQYWdlLCBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHRMaXN0Rm9yQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtZXJnZWRSZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PigpOw0KLSAgICAgICAgbWVyZ2VkUmVzdWx0LmFkZEFsbChyZXN1bHRMaXN0Rm9yUGFnZSk7DQotICAgICAgICBtZXJnZWRSZXN1bHQuYWRkQWxsKHJlc3VsdExpc3RGb3JDb21wb25lbnQpOw0KLSAgICAgICAgcmV0dXJuIG1lcmdlZFJlc3VsdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgzMTAxMi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5TdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIG1vZGVsLXZhbGlkYXRpb24gZW50cmllcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlcg0KLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8TW9kZWxWYWxpZGF0aW9uU3RvcmFnZT4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfTU9ERUxfVkFMSURBVElPTjpLRVkiOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvTW9kZWxWYWxpZGF0aW9uRW50cnkuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvTW9kZWxWYWxpZGF0aW9uRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc4YThmMy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5BUEk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihBUEkpDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvbkVudHJ5DQotew0KLSAgICBwcml2YXRlIFVJQ29tcG9uZW50IGNvbXBvbmVudDsNCi0gICAgcHJpdmF0ZSBMaXN0PENsYXNzPiBncm91cHMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLSAgICBwcml2YXRlIExpc3Q8T2JqZWN0PiB2YWxpZGF0aW9uVGFyZ2V0cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGlzcGxheU1lc3NhZ2VJbmxpbmUgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgY3VzdG9tTWVzc2FnZSA9IE1vZGVsVmFsaWRhdGlvbi5ERUZBVUxUOw0KLSAgICANCi0gICAgLy90aGUgb3JpZ2luYWwgc291cmNlIHdoZXJlIHRoZSBleHR2YWwtYnYgbWV0YS1kYXRhIGhhcyBiZWVuIGZvdW5kDQotICAgIHByaXZhdGUgT2JqZWN0IG1ldGFEYXRhU291cmNlT2JqZWN0Ow0KLSAgICBwcml2YXRlIFN0cmluZyB2aWV3SWQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRWaWV3SWQoKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkR3JvdXAoQ2xhc3MgZ3JvdXApDQotICAgIHsNCi0gICAgICAgIGlmKCF0aGlzLmdyb3Vwcy5jb250YWlucyhncm91cCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoISh0aGlzLmdyb3VwcyBpbnN0YW5jZW9mIEFycmF5TGlzdCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBuZXdHcm91cExpc3QgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLQ0KLSAgICAgICAgICAgICAgICBmb3IoQ2xhc3MgY3VycmVudENsYXNzIDogdGhpcy5ncm91cHMpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG5ld0dyb3VwTGlzdC5hZGQoY3VycmVudENsYXNzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB0aGlzLmdyb3VwcyA9IG5ld0dyb3VwTGlzdDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdGhpcy5ncm91cHMuYWRkKGdyb3VwKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVHcm91cChDbGFzcyBncm91cCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5ncm91cHMucmVtb3ZlKGdyb3VwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRWYWxpZGF0aW9uVGFyZ2V0KE9iamVjdCB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIGlmKCF0aGlzLnZhbGlkYXRpb25UYXJnZXRzLmNvbnRhaW5zKHRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoISh0aGlzLnZhbGlkYXRpb25UYXJnZXRzIGluc3RhbmNlb2YgQXJyYXlMaXN0KSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIExpc3Q8T2JqZWN0PiB2YWxpZGF0aW9uVGFyZ2V0TGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KLQ0KLSAgICAgICAgICAgICAgICBmb3IoT2JqZWN0IGN1cnJlbnRUYXJnZXQgOiB0aGlzLnZhbGlkYXRpb25UYXJnZXRzKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0TGlzdC5hZGQoY3VycmVudFRhcmdldCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uVGFyZ2V0cyA9IHZhbGlkYXRpb25UYXJnZXRMaXN0Ow0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25UYXJnZXRzLmFkZCh0YXJnZXQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIFVJQ29tcG9uZW50IGdldENvbXBvbmVudCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KFVJQ29tcG9uZW50IGNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENsYXNzW10gZ2V0R3JvdXBzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzLnRvQXJyYXkobmV3IENsYXNzW3RoaXMuZ3JvdXBzLnNpemUoKV0pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwcyhMaXN0PENsYXNzPiBncm91cHMpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZ3JvdXBzID0gZ3JvdXBzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZ2V0VmFsaWRhdGlvblRhcmdldHMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblRhcmdldHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRNZXRhRGF0YVNvdXJjZU9iamVjdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YVNvdXJjZU9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVNvdXJjZU9iamVjdChPYmplY3QgbWV0YURhdGFTb3VyY2VPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFTb3VyY2VPYmplY3QgPSBtZXRhRGF0YVNvdXJjZU9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlJlZHVuZGFudElmU3RhdGVtZW50In0pDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmICh0aGlzID09IG8pDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IHRoYXQgPSAoTW9kZWxWYWxpZGF0aW9uRW50cnkpIG87DQotDQotICAgICAgICBpZiAoY29tcG9uZW50ICE9IG51bGwgPyAhY29tcG9uZW50LmVxdWFscyh0aGF0LmNvbXBvbmVudCkgOiB0aGF0LmNvbXBvbmVudCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghZ3JvdXBzLmVxdWFscyh0aGF0Lmdyb3VwcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCF2YWxpZGF0aW9uVGFyZ2V0cy5lcXVhbHModGhhdC52YWxpZGF0aW9uVGFyZ2V0cykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNEaXNwbGF5TWVzc2FnZUlubGluZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkaXNwbGF5TWVzc2FnZUlubGluZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TWVzc2FnZUlubGluZShib29sZWFuIGRpc3BsYXlNZXNzYWdlSW5saW5lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRpc3BsYXlNZXNzYWdlSW5saW5lID0gZGlzcGxheU1lc3NhZ2VJbmxpbmU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDdXN0b21NZXNzYWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tTWVzc2FnZShTdHJpbmcgY3VzdG9tTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jdXN0b21NZXNzYWdlID0gY3VzdG9tTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIGludCByZXN1bHQgPSBjb21wb25lbnQgIT0gbnVsbCA/IGNvbXBvbmVudC5oYXNoQ29kZSgpIDogMDsNCi0gICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgZ3JvdXBzLmhhc2hDb2RlKCk7DQotICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIHZhbGlkYXRpb25UYXJnZXRzLmhhc2hDb2RlKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Vmlld0lkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZpZXdJZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWaWV3SWQoU3RyaW5nIHZpZXdJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy52aWV3SWQgPSB2aWV3SWQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiZGY5My4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogc3VnZ2VzdGVkIGludGVyZmFjZSBmb3IgYSBtb2RlbC12YWxpZGF0aW9uIHN0b3JhZ2UNCi0gKiA8cC8+DQotICogaXQgYWxsb3dzIHRvIG1hbmFnZSBtb2RlbC12YWxpZGF0aW9uLWVudHJpZXMgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHZvaWQgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLQ0KLSAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9CZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvbWFwcGVyL0JlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWMyZTM5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvbWFwcGVyL0JlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uQmVhblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuRGVmYXVsdEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEJlYW5WYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoa2V5KSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9tYXBwZXIvTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE2MjA1MC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLkRlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoTW9kZWxWYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoa2V5KSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvQmVhblZhbGlkYXRpb25VdGlscy5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9CZWFuVmFsaWRhdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NmQxNzMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9CZWFuVmFsaWRhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLk1vZGVsVmFsaWRhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5GYWNlc01lc3NhZ2VIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25VdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPR0dFUiA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEJlYW5WYWxpZGF0aW9uVXRpbHMuY2xhc3MpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzIGJ2bWkgPSBuZXcgRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscyhMT0dHRVIpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVE9SX0ZBQ1RPUllfS0VZID0gImphdmF4LmZhY2VzLnZhbGlkYXRvci5iZWFuVmFsaWRhdG9yLlZhbGlkYXRvckZhY3RvcnkiOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTWV0YURhdGFUb0NvbnRleHQoDQotICAgICAgICAgICAgVUlDb21wb25lbnQgY29tcG9uZW50LCBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLCBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZ1tdIGtleSA9IHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKS5zcGxpdCgiXFwuIik7DQotDQotICAgICAgICBPYmplY3QgZmlyc3RCZWFuID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKGtleVswXSk7DQotDQotICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgIGJ2bWkuZXh0cmFjdEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGEocHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBrZXksDQotICAgICAgICAgICAgICAgIGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotDQotICAgICAgICBidm1pLnByb2Nlc3NFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhKGNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc0NvbnN0cmFpbnRWaW9sYXRpb25zKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbj4gdmlvbGF0aW9ucykNCi0gICAgew0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2U7DQotICAgICAgICBmb3IgKENvbnN0cmFpbnRWaW9sYXRpb24gdmlvbGF0aW9uIDogdmlvbGF0aW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2UgPSBjcmVhdGVGYWNlc01lc3NhZ2VGb3JDb25zdHJhaW50VmlvbGF0aW9uKHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHZpb2xhdGlvbik7DQotDQotICAgICAgICAgICAgaWYgKGZhY2VzTWVzc2FnZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGJ2bWkucHJvY2Vzc0ZhY2VzTWVzc2FnZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0LCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHJvY2Vzc1Zpb2xhdGlvbk1lc3NhZ2VzKGZhY2VzTWVzc2FnZUhvbGRlckxpc3QpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjZXNNZXNzYWdlIGNyZWF0ZUZhY2VzTWVzc2FnZUZvckNvbnN0cmFpbnRWaW9sYXRpb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJhaW50VmlvbGF0aW9uIHZpb2xhdGlvbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZpb2xhdGlvbk1lc3NhZ2UgPSB2aW9sYXRpb24uZ2V0TWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGxhYmVsZWRNZXNzYWdlU3VtbWFyeSA9IGJ2bWkuY3JlYXRlTGFiZWxlZE1lc3NhZ2UodmlvbGF0aW9uTWVzc2FnZSwgZmFsc2UpOw0KLSAgICAgICAgU3RyaW5nIGxhYmVsZWRNZXNzYWdlRGV0YWlsID0gYnZtaS5jcmVhdGVMYWJlbGVkTWVzc2FnZSh2aW9sYXRpb25NZXNzYWdlLCB0cnVlKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSA9IGJ2bWkuY2FsY1NldmVyaXR5KHZpb2xhdGlvbik7DQotDQotICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uID0gYnZtaQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yRXhjZXB0aW9uKGxhYmVsZWRNZXNzYWdlU3VtbWFyeSwgbGFiZWxlZE1lc3NhZ2VEZXRhaWwsIHNldmVyaXR5KTsNCi0NCi0gICAgICAgIGlmICghYnZtaS5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycyh1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGJ2bWkuaXNNZXNzYWdlVGV4dFVuY2hhbmdlZCh2YWxpZGF0b3JFeGNlcHRpb24sIGxhYmVsZWRNZXNzYWdlU3VtbWFyeSwgbGFiZWxlZE1lc3NhZ2VEZXRhaWwpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc2V2ZXJpdHksIHZpb2xhdGlvbk1lc3NhZ2UsIHZpb2xhdGlvbk1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc2V2ZXJpdHksDQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U3VtbWFyeSgpLA0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldERldGFpbCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc1Zpb2xhdGlvbk1lc3NhZ2VzKExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiB2aW9sYXRpb25NZXNzYWdlSG9sZGVyTGlzdCkNCi0gICAgew0KLSAgICAgICAgaWYgKHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0ID09IG51bGwgfHwgdmlvbGF0aW9uTWVzc2FnZUhvbGRlckxpc3QuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VMaXN0V2l0aExvd1NldmVyaXR5ID0NCi0gICAgICAgICAgICAgICAgYnZtaS5nZXRGYWNlc01lc3NhZ2VMaXN0V2l0aExvd1NldmVyaXR5KHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0KTsNCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VMaXN0V2l0aEhpZ2hTZXZlcml0eSA9DQotICAgICAgICAgICAgICAgIGJ2bWkuZ2V0RmFjZXNNZXNzYWdlTGlzdFdpdGhIaWdoU2V2ZXJpdHkodmlvbGF0aW9uTWVzc2FnZUhvbGRlckxpc3QpOw0KLQ0KLSAgICAgICAgYnZtaS5hZGRNZXNzYWdlcyhmYWNlc01lc3NhZ2VMaXN0V2l0aEhpZ2hTZXZlcml0eSk7DQotICAgICAgICBidm1pLmFkZE1lc3NhZ2VzKGZhY2VzTWVzc2FnZUxpc3RXaXRoTG93U2V2ZXJpdHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yRmFjdG9yeSBnZXREZWZhdWx0VmFsaWRhdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gYXBwbGljYXRpb25NYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25NYXAoKTsNCi0gICAgICAgIFZhbGlkYXRvckZhY3RvcnkgdmFsaWRhdG9yRmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBpZiAoYXBwbGljYXRpb25NYXAuY29udGFpbnNLZXkoVkFMSURBVE9SX0ZBQ1RPUllfS0VZKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoYXBwbGljYXRpb25NYXAuZ2V0KFZBTElEQVRPUl9GQUNUT1JZX0tFWSkgaW5zdGFuY2VvZiBWYWxpZGF0b3JGYWN0b3J5KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yRmFjdG9yeSA9IChWYWxpZGF0b3JGYWN0b3J5KSBhcHBsaWNhdGlvbk1hcC5nZXQoVkFMSURBVE9SX0ZBQ1RPUllfS0VZKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmFsaWRhdG9yRmFjdG9yeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRvckZhY3RvcnkgPSBWYWxpZGF0aW9uLmJ1aWxkRGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKTsNCi0gICAgICAgICAgICBhcHBsaWNhdGlvbk1hcC5wdXQoVkFMSURBVE9SX0ZBQ1RPUllfS0VZLCB2YWxpZGF0b3JGYWN0b3J5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscy5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMjE4OTQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uQmVhblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLmV4dHJhY3Rvci5EZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuTW9kZWxWYWxpZGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkVMSGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5GYWNlc01lc3NhZ2VIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFJbnRlcm5hbHMNCi17DQotICAgIHByaXZhdGUgTG9nIGxvZ2dlcjsNCi0gICAgcHJpdmF0ZSBMYWJlbGVkTWVzc2FnZUludGVybmFscyBsYWJlbGVkTWVzc2FnZUludGVybmFscyA9IG5ldyBMYWJlbGVkTWVzc2FnZUludGVybmFscygpOw0KLQ0KLSAgICBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzKExvZyBsb2dnZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyOw0KLSAgICB9DQotDQotICAgIHZvaWQgZXh0cmFjdEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGEoUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10ga2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgaW5zcGVjdEZpcnN0QmVhbihwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgaW5zcGVjdEZpcnN0UHJvcGVydHkocHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAga2V5LA0KLSAgICAgICAgICAgICAgICBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIGtleS5sZW5ndGggPT0gMik7DQotDQotICAgICAgICBpbnNwZWN0QmFzZU9mUHJvcGVydHkocHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgIGluc3BlY3RMYXN0UHJvcGVydHkocHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIHByb2Nlc3NFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhKFVJQ29tcG9uZW50IGNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgPSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBTdHJpbmcgY3VycmVudFZpZXdJZCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldFZpZXdJZCgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGNsaWVudElkID0gY29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotDQotICAgICAgICBwcm9jZXNzRm91bmRHcm91cHMoZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LCBjdXJyZW50Vmlld0lkLCBjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgcHJvY2Vzc1Jlc3RyaWN0ZWRHcm91cHMoZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LCBjdXJyZW50Vmlld0lkLCBjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbik7DQotDQotICAgICAgICBpbml0TW9kZWxWYWxpZGF0aW9uKGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCwgY29tcG9uZW50LCBwcm9wZXJ0eURldGFpbHMsDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RGaXJzdEJlYW4oYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgZmlyc3RCZWFuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzQ2xhc3MoZmlyc3RCZWFuLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5zcGVjdEZpcnN0UHJvcGVydHkoYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10ga2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzTGFzdFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzRmllbGRzQW5kUHJvcGVydGllcyhrZXlbMF0gKyAiLiIgKyBrZXlbMV0sDQotICAgICAgICAgICAgICAgIGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAga2V5WzFdLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBpc0xhc3RQcm9wZXJ0eSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RCYXNlT2ZQcm9wZXJ0eShQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RMYXN0UHJvcGVydHkoUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzRmllbGRzQW5kUHJvcGVydGllcygNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzLmdldEtleSgpLA0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgdHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDbGFzcyhPYmplY3Qgb2JqZWN0VG9JbnNwZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBDbGFzcyBjbGFzc1RvSW5zcGVjdCA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3Mob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCkpOw0KLQ0KLSAgICAgICAgd2hpbGUgKCFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc1RvSW5zcGVjdC5nZXROYW1lKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyYW5zZmVyR3JvdXBWYWxpZGF0aW9uSW5mb3JtYXRpb25Ub0ZvdW5kR3JvdXBzKG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhvYmplY3RUb0luc3BlY3QuZ2V0Q2xhc3MoKSwgb2JqZWN0VG9JbnNwZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgICAgIGNsYXNzVG9JbnNwZWN0ID0gY2xhc3NUb0luc3BlY3QuZ2V0U3VwZXJjbGFzcygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmllbGRzQW5kUHJvcGVydGllcyhTdHJpbmcga2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGJhc2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0xhc3RQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3RvcigpDQotICAgICAgICAgICAgICAgIC5leHRyYWN0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgbmV3IFByb3BlcnR5RGV0YWlscyhrZXksIGJhc2UsIHByb3BlcnR5KSk7DQotDQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSA6IHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5VG9Qcm9jZXNzTWV0YURhdGEoKEJlYW5WYWxpZGF0aW9uKSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5VG9DcmVhdGVOZXdUYXJnZXQoYmFzZSwgcHJvcGVydHksIGlzTGFzdFByb3BlcnR5KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmIChtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdGlvbi5MaXN0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm9yIChCZWFuVmFsaWRhdGlvbiBjdXJyZW50QmVhblZhbGlkYXRpb24gOiAoKEJlYW5WYWxpZGF0aW9uLkxpc3QpIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSkudmFsdWUoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdHJ5VG9Qcm9jZXNzTWV0YURhdGEoY3VycmVudEJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlUb0NyZWF0ZU5ld1RhcmdldChiYXNlLCBwcm9wZXJ0eSwgaXNMYXN0UHJvcGVydHkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCB0cnlUb0NyZWF0ZU5ld1RhcmdldChPYmplY3QgYmFzZSwgU3RyaW5nIHByb3BlcnR5LCBib29sZWFuIGlzTGFzdFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpZihpc0xhc3RQcm9wZXJ0eSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYmFzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGdldFZhbHVlT2ZQcm9wZXJ0eShiYXNlLCBwcm9wZXJ0eSk7DQotDQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGJhc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IGdldFZhbHVlT2ZQcm9wZXJ0eShPYmplY3QgYmFzZSwgU3RyaW5nIHByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEsIHByb3BlcnR5Lmxlbmd0aCgpKTsNCi0NCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhiYXNlLmdldENsYXNzKCkpOw0KLQ0KLSAgICAgICAgTWV0aG9kIHRhcmdldE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh0YXJnZXRDbGFzcywgImdldCIgKyBwcm9wZXJ0eSk7DQotDQotICAgICAgICBpZiAodGFyZ2V0TWV0aG9kID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHRhcmdldENsYXNzLCAiaXMiICsgcHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHRhcmdldE1ldGhvZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICAiY2xhc3MgIiArIHRhcmdldENsYXNzICsgIiBoYXMgbm8gcHVibGljIGdldC9pcyAiICsgcHJvcGVydHkudG9Mb3dlckNhc2UoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKGJhc2UsIHRhcmdldE1ldGhvZCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NGb3VuZEdyb3VwcyhFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50Vmlld0lkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIGFkZCBmb3VuZCBncm91cHMgdG8gY29udGV4dA0KLSAgICAgICAgICovDQotICAgICAgICBmb3IgKENsYXNzIGN1cnJlbnRHcm91cENsYXNzIDogZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmFkZEdyb3VwKGN1cnJlbnRHcm91cENsYXNzLCBjdXJyZW50Vmlld0lkLCBjbGllbnRJZCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NSZXN0cmljdGVkR3JvdXBzKEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudFZpZXdJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIC8qDQotICAgICAgICAgKiBhZGQgcmVzdHJpY3RlZCBncm91cHMNCi0gICAgICAgICAqLw0KLSAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50R3JvdXBDbGFzcyA6IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LnJlc3RyaWN0R3JvdXAoY3VycmVudEdyb3VwQ2xhc3MsIGN1cnJlbnRWaWV3SWQsIGNsaWVudElkKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdE1vZGVsVmFsaWRhdGlvbihFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCBjb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIGFkZCBtb2RlbCB2YWxpZGF0aW9uIGVudHJ5IGxpc3QNCi0gICAgICAgICAqLw0KLSAgICAgICAgZm9yIChNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSA6IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IgKENsYXNzIHJlc3RyaWN0ZWRHcm91cCA6IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5yZW1vdmVHcm91cChyZXN0cmljdGVkR3JvdXApOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0R3JvdXBzKCkubGVuZ3RoID4gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRWYWxpZGF0aW9uVGFyZ2V0cygpLmlzRW1wdHkoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuYWRkVmFsaWRhdGlvblRhcmdldChwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5zZXRDb21wb25lbnQoY29tcG9uZW50KTsNCi0gICAgICAgICAgICAgICAgZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KG1vZGVsVmFsaWRhdGlvbkVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInRlc3QgcHJveHkgc3VwcG9ydCIpDQotICAgIHByaXZhdGUgdm9pZCB0cmFuc2Zlckdyb3VwVmFsaWRhdGlvbkluZm9ybWF0aW9uVG9Gb3VuZEdyb3VwcygNCi0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0VG9JbnNwZWN0LA0KLSAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCkuaXNBbm5vdGF0aW9uUHJlc2VudChCZWFuVmFsaWRhdGlvbi5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9Qcm9jZXNzTWV0YURhdGEob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCkuZ2V0QW5ub3RhdGlvbihCZWFuVmFsaWRhdGlvbi5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICBvYmplY3RUb0luc3BlY3QsDQotICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChvYmplY3RUb0luc3BlY3QuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KEJlYW5WYWxpZGF0aW9uLkxpc3QuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvciAoQmVhblZhbGlkYXRpb24gY3VycmVudEJlYW5WYWxpZGF0aW9uIDoNCi0gICAgICAgICAgICAgICAgICAgIChvYmplY3RUb0luc3BlY3QuZ2V0Q2xhc3MoKS5nZXRBbm5vdGF0aW9uKEJlYW5WYWxpZGF0aW9uLkxpc3QuY2xhc3MpKS52YWx1ZSgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5VG9Qcm9jZXNzTWV0YURhdGEoY3VycmVudEJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ludGVyZmFjZXMoQ2xhc3MgY3VycmVudENsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50SW50ZXJmYWNlIDogY3VycmVudENsYXNzLmdldEludGVyZmFjZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cmFuc2Zlckdyb3VwVmFsaWRhdGlvbkluZm9ybWF0aW9uVG9Gb3VuZEdyb3VwcyhtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhjdXJyZW50SW50ZXJmYWNlLCBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9Qcm9jZXNzTWV0YURhdGEoQmVhblZhbGlkYXRpb24gYmVhblZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBmb3IgKFN0cmluZyBjdXJyZW50Vmlld0lkIDogYmVhblZhbGlkYXRpb24udmlld0lkcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh1c2VNZXRhRGF0YUZvclZpZXdJZChiZWFuVmFsaWRhdGlvbiwgY3VycmVudFZpZXdJZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTWV0YURhdGEoYmVhblZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VNZXRhRGF0YUZvclZpZXdJZChCZWFuVmFsaWRhdGlvbiBiZWFuVmFsaWRhdGlvbiwgU3RyaW5nIGN1cnJlbnRWaWV3SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoY3VycmVudFZpZXdJZC5lcXVhbHMoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0Vmlld0lkKCkpIHx8DQotICAgICAgICAgICAgICAgIGN1cnJlbnRWaWV3SWQuZXF1YWxzKCIqIikpICYmIGlzVmFsaWRhdGlvblBlcm1pdHRlZChiZWFuVmFsaWRhdGlvbik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNZXRhRGF0YShCZWFuVmFsaWRhdGlvbiBiZWFuVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChwcm9jZXNzTW9kZWxWYWxpZGF0aW9uICYmIGlzTW9kZWxWYWxpZGF0aW9uKGJlYW5WYWxpZGF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNb2RlbFZhbGlkYXRpb25FbnRyeSgNCi0gICAgICAgICAgICAgICAgICAgIGJlYW5WYWxpZGF0aW9uLCBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmICghaXNNb2RlbFZhbGlkYXRpb24oYmVhblZhbGlkYXRpb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NHcm91cHMoDQotICAgICAgICAgICAgICAgICAgICBiZWFuVmFsaWRhdGlvbiwgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkYXRpb25QZXJtaXR0ZWQoQmVhblZhbGlkYXRpb24gYmVhblZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIEVMSGVscGVyIGVsSGVscGVyID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNvbmRpdGlvbiA6IGJlYW5WYWxpZGF0aW9uLmNvbmRpdGlvbnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZWxIZWxwZXIuaXNFTFRlcm1XZWxsRm9ybWVkKGNvbmRpdGlvbikgJiYNCi0gICAgICAgICAgICAgICAgICAgIGVsSGVscGVyLmlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCBjb25kaXRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoZWxIZWxwZXIuZ2V0VmFsdWVPZkV4cHJlc3Npb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihjb25kaXRpb24pKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigiYW4gaW52YWxpZCBjb25kaXRpb24gaXMgdXNlZDogIiArIGNvbmRpdGlvbik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTW9kZWxWYWxpZGF0aW9uKEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmVhblZhbGlkYXRpb24ubW9kZWxWYWxpZGF0aW9uKCkuaXNBY3RpdmUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoQmVhblZhbGlkYXRpb24gYmVhblZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSA9IG5ldyBNb2RlbFZhbGlkYXRpb25FbnRyeSgpOw0KLQ0KLSAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuc2V0R3JvdXBzKEFycmF5cy5hc0xpc3QoYmVhblZhbGlkYXRpb24udXNlR3JvdXBzKCkpKTsNCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LnNldERpc3BsYXlNZXNzYWdlSW5saW5lKGJlYW5WYWxpZGF0aW9uLm1vZGVsVmFsaWRhdGlvbigpLmRpc3BsYXlJbmxpbmUoKSk7DQotICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5zZXRDdXN0b21NZXNzYWdlKGJlYW5WYWxpZGF0aW9uLm1vZGVsVmFsaWRhdGlvbigpLm1lc3NhZ2UoKSk7DQotICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5zZXRNZXRhRGF0YVNvdXJjZU9iamVjdChtZXRhRGF0YVNvdXJjZU9iamVjdCk7DQotDQotICAgICAgICBPYmplY3QgdmFsaWRhdGlvblRhcmdldDsNCi0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25UYXJnZXRFeHByZXNzaW9uIDogYmVhblZhbGlkYXRpb24ubW9kZWxWYWxpZGF0aW9uKCkudmFsaWRhdGlvblRhcmdldHMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoTW9kZWxWYWxpZGF0aW9uLkRFRkFVTFQuZXF1YWxzKHZhbGlkYXRpb25UYXJnZXRFeHByZXNzaW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0ID0gdHJ5VG9SZXNvbHZlVmFsaWRhdGlvblRhcmdldEV4cHJlc3Npb24odmFsaWRhdGlvblRhcmdldEV4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uVGFyZ2V0ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5hZGRWYWxpZGF0aW9uVGFyZ2V0KHZhbGlkYXRpb25UYXJnZXQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChiZWFuVmFsaWRhdGlvbi5yZXN0cmljdEdyb3VwcygpLmxlbmd0aCA+IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChiZWFuVmFsaWRhdGlvbi5yZXN0cmljdEdyb3VwcygpKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0VmFsaWRhdGlvblRhcmdldHMoKS5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuYWRkVmFsaWRhdGlvblRhcmdldChtZXRhRGF0YVNvdXJjZU9iamVjdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QuYWRkKG1vZGVsVmFsaWRhdGlvbkVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCB0cnlUb1Jlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RXhwcmVzc2lvbihTdHJpbmcgdmFsaWRhdGlvblRhcmdldEV4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbGlkYXRpb25UYXJnZXRFeHByZXNzaW9uKTsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgIC5nZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzR3JvdXBzKEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24uYWRkQWxsKEFycmF5cy5hc0xpc3QoYmVhblZhbGlkYXRpb24udXNlR3JvdXBzKCkpKTsNCi0NCi0gICAgICAgIGlmIChiZWFuVmFsaWRhdGlvbi5yZXN0cmljdEdyb3VwcygpLmxlbmd0aCA+IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChiZWFuVmFsaWRhdGlvbi5yZXN0cmljdEdyb3VwcygpKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgU3RyaW5nIGNyZWF0ZUxhYmVsZWRNZXNzYWdlKFN0cmluZyB2aW9sYXRpb25NZXNzYWdlLCBib29sZWFuIGlzRGV0YWlsTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMuY3JlYXRlTGFiZWxlZE1lc3NhZ2UodmlvbGF0aW9uTWVzc2FnZSwgaXNEZXRhaWxNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgY2FsY1NldmVyaXR5KENvbnN0cmFpbnRWaW9sYXRpb248Pz4gdmlvbGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBmb3IgKENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPiBwYXlsb2FkIDogdmlvbGF0aW9uLmdldENvbnN0cmFpbnREZXNjcmlwdG9yKCkuZ2V0UGF5bG9hZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcykuaXNBc3NpZ25hYmxlRnJvbShwYXlsb2FkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfV0FSTjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZiAoRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoVmlvbGF0aW9uU2V2ZXJpdHkuSW5mby5jbGFzcykuaXNBc3NpZ25hYmxlRnJvbShwYXlsb2FkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfSU5GTzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZiAoRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoVmlvbGF0aW9uU2V2ZXJpdHkuRmF0YWwuY2xhc3MpLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1I7DQotICAgIH0NCi0NCi0gICAgdm9pZCBwcm9jZXNzRmFjZXNNZXNzYWdlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIgPSBuZXcgRmFjZXNNZXNzYWdlSG9sZGVyKGZhY2VzTWVzc2FnZSk7DQotDQotICAgICAgICBmYWNlc01lc3NhZ2VIb2xkZXIuc2V0Q2xpZW50SWQodWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotDQotICAgICAgICBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0LmFkZChmYWNlc01lc3NhZ2VIb2xkZXIpOw0KLSAgICB9DQotDQotICAgIGJvb2xlYW4gZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICBudWxsLA0KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgYm9vbGVhbiBpc01lc3NhZ2VUZXh0VW5jaGFuZ2VkKA0KLSAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIFN0cmluZyB2aW9sYXRpb25TdW1tYXJ5TWVzc2FnZSwgU3RyaW5nIHZpb2xhdGlvbkRldGFpbE1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2aW9sYXRpb25TdW1tYXJ5TWVzc2FnZS5lcXVhbHModmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldFN1bW1hcnkoKSkgJiYNCi0gICAgICAgICAgICAgICAgdmlvbGF0aW9uRGV0YWlsTWVzc2FnZS5lcXVhbHModmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldERldGFpbCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBWYWxpZGF0b3JFeGNlcHRpb24gY3JlYXRlVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgIFN0cmluZyB2aW9sYXRpb25TdW1tYXJ5TWVzc2FnZSwgU3RyaW5nIHZpb2xhdGlvbkRldGFpbE1lc3NhZ2UsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNyZWF0ZUZhY2VzTWVzc2FnZShzZXZlcml0eSwgdmlvbGF0aW9uU3VtbWFyeU1lc3NhZ2UsIHZpb2xhdGlvbkRldGFpbE1lc3NhZ2UpKTsNCi0gICAgfQ0KLQ0KLSAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZ2V0RmFjZXNNZXNzYWdlTGlzdFdpdGhMb3dTZXZlcml0eSgNCi0gICAgICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gdmlvbGF0aW9uTWVzc2FnZXMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgICAgIGZvciAoRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlciA6IHZpb2xhdGlvbk1lc3NhZ2VzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChGYWNlc01lc3NhZ2UuU0VWRVJJVFlfV0FSTi5lcXVhbHMoZmFjZXNNZXNzYWdlSG9sZGVyLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkpIHx8DQotICAgICAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfSU5GTy5lcXVhbHMoZmFjZXNNZXNzYWdlSG9sZGVyLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChmYWNlc01lc3NhZ2VIb2xkZXIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZUxpc3RXaXRoSGlnaFNldmVyaXR5KA0KLSAgICAgICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiB2aW9sYXRpb25NZXNzYWdlSG9sZGVyTGlzdCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPigpOw0KLQ0KLSAgICAgICAgZm9yIChGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyIDogdmlvbGF0aW9uTWVzc2FnZUhvbGRlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUi5lcXVhbHMoZmFjZXNNZXNzYWdlSG9sZGVyLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkpIHx8DQotICAgICAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUwuZXF1YWxzKGZhY2VzTWVzc2FnZUhvbGRlci5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZmFjZXNNZXNzYWdlSG9sZGVyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHZvaWQgYWRkTWVzc2FnZXMoTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3RXaXRoTG93U2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIGZvciAoRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlciA6IGZhY2VzTWVzc2FnZUhvbGRlckxpc3RXaXRoTG93U2V2ZXJpdHkpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50SWQoDQotICAgICAgICAgICAgICAgICAgICBmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0Q2xpZW50SWQoKSwgZmFjZXNNZXNzYWdlSG9sZGVyLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC91dGlsL0xhYmVsZWRNZXNzYWdlSW50ZXJuYWxzLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC91dGlsL0xhYmVsZWRNZXNzYWdlSW50ZXJuYWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MGI3ODMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9MYWJlbGVkTWVzc2FnZUludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBMYWJlbGVkTWVzc2FnZUludGVybmFscw0KLXsNCi0gICAgLy90aGVyZSBpcyBubyBjb25jdXJyZW5jeSBpc3N1ZSBoZXJlIC0gaXQgYWx3YXlzIGxlYWRzIHRvIHRoZSBzYW1lIHJlc3VsdA0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZWZhdWx0U3VtbWFyeU1lc3NhZ2VUZW1wbGF0ZSA9ICJ7MX06IHswfSI7DQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRlZmF1bHREZXRhaWxNZXNzYWdlVGVtcGxhdGUgPSAiezF9OiB7MH0iOw0KLSAgICBwcml2YXRlIFN0cmluZyBzdW1tYXJ5TWVzc2FnZVRlbXBsYXRlID0gZGVmYXVsdFN1bW1hcnlNZXNzYWdlVGVtcGxhdGU7DQotICAgIHByaXZhdGUgU3RyaW5nIGRldGFpbE1lc3NhZ2VUZW1wbGF0ZSA9IGRlZmF1bHREZXRhaWxNZXNzYWdlVGVtcGxhdGU7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19WQUxJREFUT1JfQkVBTlZBTElEQVRPUl9NRVNTQUdFID0NCi0gICAgICAgICAgICAiamF2YXguZmFjZXMudmFsaWRhdG9yLkJlYW5WYWxpZGF0b3IuTUVTU0FHRSI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19WQUxJREFUT1JfQkVBTlZBTElEQVRPUl9NRVNTQUdFX0RFVEFJTCA9DQotICAgICAgICAgICAgImphdmF4LmZhY2VzLnZhbGlkYXRvci5CZWFuVmFsaWRhdG9yLk1FU1NBR0VfZGV0YWlsIjsNCi0NCi0gICAgU3RyaW5nIGNyZWF0ZUxhYmVsZWRNZXNzYWdlKFN0cmluZyB2aW9sYXRpb25NZXNzYWdlLCBib29sZWFuIGlzRGV0YWlsTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYoaXNEZXRhaWxNZXNzYWdlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnlUb1Jlc29sdmVEZXRhaWxNZXNzYWdlKHZpb2xhdGlvbk1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnlUb1Jlc29sdmVTdW1tYXJ5TWVzc2FnZSh2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb1Jlc29sdmVTdW1tYXJ5TWVzc2FnZShTdHJpbmcgdmlvbGF0aW9uTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYoc3VtbWFyeU1lc3NhZ2VUZW1wbGF0ZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRTdW1tYXJ5TWVzc2FnZVRlbXBsYXRlLnJlcGxhY2UoInswfSIsIHZpb2xhdGlvbk1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGhpcy5zdW1tYXJ5TWVzc2FnZVRlbXBsYXRlID0gbG9hZFN0YW5kYXJkTWVzc2FnZVRlbXBsYXRlKGZhbHNlKTsNCi0NCi0gICAgICAgIGlmKHN1bW1hcnlNZXNzYWdlVGVtcGxhdGUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlTGFiZWxlZE1lc3NhZ2UodmlvbGF0aW9uTWVzc2FnZSwgZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHN1bW1hcnlNZXNzYWdlVGVtcGxhdGUucmVwbGFjZSgiezB9IiwgdmlvbGF0aW9uTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHJ5VG9SZXNvbHZlRGV0YWlsTWVzc2FnZShTdHJpbmcgdmlvbGF0aW9uTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYoZGV0YWlsTWVzc2FnZVRlbXBsYXRlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdERldGFpbE1lc3NhZ2VUZW1wbGF0ZS5yZXBsYWNlKCJ7MH0iLCB2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRoaXMuZGV0YWlsTWVzc2FnZVRlbXBsYXRlID0gbG9hZFN0YW5kYXJkTWVzc2FnZVRlbXBsYXRlKHRydWUpOw0KLQ0KLSAgICAgICAgaWYoZGV0YWlsTWVzc2FnZVRlbXBsYXRlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxhYmVsZWRNZXNzYWdlKHZpb2xhdGlvbk1lc3NhZ2UsIHRydWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGRldGFpbE1lc3NhZ2VUZW1wbGF0ZS5yZXBsYWNlKCJ7MH0iLCB2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBsb2FkU3RhbmRhcmRNZXNzYWdlVGVtcGxhdGUoYm9vbGVhbiBpc0RldGFpbE1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGlzRGV0YWlsTWVzc2FnZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBKc2ZVdGlscy5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVZBWF9GQUNFU19WQUxJREFUT1JfQkVBTlZBTElEQVRPUl9NRVNTQUdFX0RFVEFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBKc2ZVdGlscy5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVZBWF9GQUNFU19WQUxJREFUT1JfQkVBTlZBTElEQVRPUl9NRVNTQUdFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRjMjg5NS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLkJlYW5WYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLk1vZGVsVmFsaWRhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC51dGlsLkJlYW5WYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuRmFjZXNNZXNzYWdlSG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uTWVzc2FnZUludGVycG9sYXRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXRoOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJyZWZhY3RvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM0ODIyMzM4OTMxODY3MDg4NzhMOw0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgcGhhc2VFdmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgianNyMzAzIHN0YXJ0IG1vZGVsIHZhbGlkYXRpb24iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1hcDxPYmplY3QsIExpc3Q8Q2xhc3M+PiBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgTGlzdDxDbGFzcz4+KCk7DQotDQotICAgICAgICBNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4oKTsNCi0NCi0gICAgICAgIGZvciAoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkgOiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24obW9kZWxWYWxpZGF0aW9uRW50cnksIHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzLCByZXN1bHRzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb25SZXN1bHRzKHJlc3VsdHMpOw0KLQ0KLSAgICAgICAgZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9yc0ZvcihyZXN1bHRzKTsNCi0NCi0gICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImpzcjMwMyB2YWxpZGF0aW9uIGZpbmlzaGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllc1RvVmFsaWRhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbihNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPE9iamVjdCwgTGlzdDxDbGFzcz4+IHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb247DQotICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxPYmplY3Q+PiB2aW9sYXRpb25zOw0KLSAgICAgICAgQ2xhc3NbXSBncm91cHNUb1ZhbGlkYXRlOw0KLQ0KLSAgICAgICAgZm9yIChPYmplY3QgdmFsaWRhdGlvblRhcmdldCA6IG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldFZhbGlkYXRpb25UYXJnZXRzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbiA9IGNyZWF0ZVByb3BlcnR5SW5mb3JtYXRpb24obW9kZWxWYWxpZGF0aW9uRW50cnksIHZhbGlkYXRpb25UYXJnZXQpOw0KLQ0KLSAgICAgICAgICAgIGlmICghZXhlY3V0ZUdsb2JhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpLCB2YWxpZGF0aW9uVGFyZ2V0LCBwcm9wZXJ0eUluZm9ybWF0aW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZihtb2RlbFZhbGlkYXRpb25FbnRyeS5pc0Rpc3BsYXlNZXNzYWdlSW5saW5lKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBncm91cHNUb1ZhbGlkYXRlID0gbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0R3JvdXBzKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vaWYgdmlvbGF0aW9uIHNob3VsZCBkaXNwbGF5ZWQgaW5saW5lIHZhbGlkYXRpb24gaGFzIHRvIHRha2UgcGxhY2Ugd2l0aCBhbGwgZ3JvdXBzDQotICAgICAgICAgICAgLy93aGljaCBtZWFuczogZ2xvYmFsIG1lc3NhZ2VzIC0+IGZpbHRlciBncm91cHMgYWxyZWFkeSB1c2VkIGZvciB0aGUgdmFsaWRhdGlvbiB0YXJnZXQNCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBncm91cHNUb1ZhbGlkYXRlID0gZmlsdGVyR3JvdXBzVG9WYWxpZGF0ZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeSwgdmFsaWRhdGlvblRhcmdldCwgcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZighc2hvdWxkQ29udGludWVWYWxpZGF0aW9uKG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBncm91cHNUb1ZhbGlkYXRlKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBhZGRQcm9jZXNzZWRUYXJnZXQodmFsaWRhdGlvblRhcmdldCwgZ3JvdXBzVG9WYWxpZGF0ZSwgcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMpOw0KLSAgICAgICAgICAgIHZpb2xhdGlvbnMgPSB2YWxpZGF0ZVRhcmdldCh2YWxpZGF0aW9uVGFyZ2V0LCBncm91cHNUb1ZhbGlkYXRlKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9ucyAhPSBudWxsICYmICF2aW9sYXRpb25zLmlzRW1wdHkoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NWaW9sYXRpb25zKGZhY2VzQ29udGV4dCwgbW9kZWxWYWxpZGF0aW9uRW50cnksIHZhbGlkYXRpb25UYXJnZXQsIHZpb2xhdGlvbnMsIHJlc3VsdHMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENsYXNzW10gZmlsdGVyR3JvdXBzVG9WYWxpZGF0ZShNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxPYmplY3QsIExpc3Q8Q2xhc3M+PiBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cykNCi0gICAgew0KLSAgICAgICAgaWYoIXByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzLmNvbnRhaW5zS2V5KHZhbGlkYXRpb25UYXJnZXQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRHcm91cHMoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8Q2xhc3M+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgICAgICBMaXN0PENsYXNzPiB2YWxpZGF0ZWRHcm91cHMgPSBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cy5nZXQodmFsaWRhdGlvblRhcmdldCk7DQotDQotICAgICAgICBmb3IoQ2xhc3MgZ3JvdXAgOiBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRHcm91cHMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighdmFsaWRhdGVkR3JvdXBzLmNvbnRhaW5zKGdyb3VwKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZ3JvdXApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQudG9BcnJheShuZXcgQ2xhc3NbcmVzdWx0LnNpemUoKV0pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRDb250aW51ZVZhbGlkYXRpb24oTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksIENsYXNzW10gZ3JvdXBzVG9WYWxpZGF0ZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICEoZ3JvdXBzVG9WYWxpZGF0ZSA9PSBudWxsIHx8IGdyb3Vwc1RvVmFsaWRhdGUubGVuZ3RoID09IDApIHx8DQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmlzRGlzcGxheU1lc3NhZ2VJbmxpbmUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkUHJvY2Vzc2VkVGFyZ2V0KE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzW10gZ3JvdXBzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxPYmplY3QsIExpc3Q8Q2xhc3M+PiBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cykNCi0gICAgew0KLSAgICAgICAgaWYoIXByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzLmNvbnRhaW5zS2V5KHZhbGlkYXRpb25UYXJnZXQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzLnB1dCh2YWxpZGF0aW9uVGFyZ2V0LCBuZXcgQXJyYXlMaXN0PENsYXNzPigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8Q2xhc3M+IHZhbGlkYXRlZEdyb3VwcyA9IHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzLmdldCh2YWxpZGF0aW9uVGFyZ2V0KTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBncm91cCA6IGdyb3VwcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighdmFsaWRhdGVkR3JvdXBzLmNvbnRhaW5zKGdyb3VwKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRlZEdyb3Vwcy5hZGQoZ3JvdXApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFByb3BlcnR5SW5mb3JtYXRpb24gY3JlYXRlUHJvcGVydHlJbmZvcm1hdGlvbigNCi0gICAgICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbjsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHM7DQotICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKCk7DQotICAgICAgICBpZiAobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IG5ldyBQcm9wZXJ0eURldGFpbHMobnVsbCwgdmFsaWRhdGlvblRhcmdldCwgbnVsbCk7DQotICAgICAgICB9DQotICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnNldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIHByb3BlcnR5RGV0YWlscyk7DQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gZXhlY3V0ZUdsb2JhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5leGVjdXRlR2xvYmFsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uLmNsYXNzLmdldE5hbWUoKSwgcHJvcGVydHlJbmZvcm1hdGlvbiwgQmVhblZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBleGVjdXRlR2xvYmFsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxVdGlscy5leGVjdXRlR2xvYmFsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uLCBCZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxPYmplY3Q+PiB2YWxpZGF0ZVRhcmdldChPYmplY3QgdmFsaWRhdGlvblRhcmdldCwgQ2xhc3NbXSBncm91cHMpDQotICAgIHsNCi0gICAgICAgIGlmKGdyb3VwcyA9PSBudWxsIHx8IGdyb3Vwcy5sZW5ndGggPT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFZhbGlkYXRvckZhY3RvcnkgdmFsaWRhdG9yRmFjdG9yeSA9IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWYWxpZGF0b3JGYWN0b3J5KCk7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeQ0KLSAgICAgICAgICAgICAgICAudXNpbmdDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLm1lc3NhZ2VJbnRlcnBvbGF0b3IoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKSkNCi0gICAgICAgICAgICAgICAgLmNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KHZhbGlkYXRvckZhY3RvcnkuZ2V0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoKSkNCi0gICAgICAgICAgICAgICAgLnRyYXZlcnNhYmxlUmVzb2x2ZXIodmFsaWRhdG9yRmFjdG9yeS5nZXRUcmF2ZXJzYWJsZVJlc29sdmVyKCkpDQotICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0b3IoKQ0KLSAgICAgICAgICAgICAgICAudmFsaWRhdGUodmFsaWRhdGlvblRhcmdldCwgZ3JvdXBzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1Zpb2xhdGlvbnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxPYmplY3Q+PiB2aW9sYXRpb25zLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzKQ0KLSAgICB7DQotICAgICAgICAvL2pzZiAyLjAgaXMgYWJsZSB0byBkaXNwbGF5IG11bHRpcGxlIG1lc3NhZ2VzIHBlciBjb21wb25lbnQgLSBzbyBwcm9jZXNzIGFsbCB2aW9sYXRpb25zDQotICAgICAgICAvL2pzZiA8IDIuMCB3aWxsIGp1c3QgdXNlIHRoZSBmaXJzdCBvbmUgKGZvciBpbmxpbmUgbWVzc2FnZXMgLSBzbyBpdCdzIG9ubHkgYSBsaXR0bGUgb3ZlcmhlYWQpDQotICAgICAgICBJdGVyYXRvcjxDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4+IHZpb2xhdGlvbnNJdGVyYXRvciA9IHZpb2xhdGlvbnMuaXRlcmF0b3IoKTsNCi0gICAgICAgIENvbnN0cmFpbnRWaW9sYXRpb248T2JqZWN0PiBjb25zdHJhaW50VmlvbGF0aW9uOw0KLSAgICAgICAgTW9kZWxWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdDsNCi0gICAgICAgIHdoaWxlICh2aW9sYXRpb25zSXRlcmF0b3IuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvQ3JlYXRlTW9kZWxWYWxpZGF0aW9uUmVzdWx0KGZhY2VzQ29udGV4dCwgbW9kZWxWYWxpZGF0aW9uRW50cnksIHJlc3VsdHMpOw0KLQ0KLSAgICAgICAgICAgIHJlc3VsdCA9IHJlc29sdmVNb2RlbFZhbGlkYXRpb25SZXN1bHQoZmFjZXNDb250ZXh0LCBtb2RlbFZhbGlkYXRpb25FbnRyeSwgcmVzdWx0cyk7DQotDQotICAgICAgICAgICAgY29uc3RyYWludFZpb2xhdGlvbiA9IHZpb2xhdGlvbnNJdGVyYXRvci5uZXh0KCk7DQotICAgICAgICAgICAgYWRkVmlvbGF0aW9uTWVzc2FnZShtb2RlbFZhbGlkYXRpb25FbnRyeSwgdmFsaWRhdGlvblRhcmdldCwgY29uc3RyYWludFZpb2xhdGlvbiwgcmVzdWx0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9DcmVhdGVNb2RlbFZhbGlkYXRpb25SZXN1bHQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzKQ0KLSAgICB7DQotICAgICAgICBNb2RlbFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0Ow0KLSAgICAgICAgaWYgKCFpc01vZGVsVmFsaWRhdGlvblJlc3VsdEF2YWlsYWJsZUZvcihmYWNlc0NvbnRleHQsIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCByZXN1bHRzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBuZXcgTW9kZWxWYWxpZGF0aW9uUmVzdWx0KCk7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSwgcmVzdWx0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1vZGVsVmFsaWRhdGlvblJlc3VsdCByZXNvbHZlTW9kZWxWYWxpZGF0aW9uUmVzdWx0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcmVzdWx0cy5nZXQobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTW9kZWxWYWxpZGF0aW9uUmVzdWx0QXZhaWxhYmxlRm9yKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHMuY29udGFpbnNLZXkobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFZpb2xhdGlvbk1lc3NhZ2UoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4gY29uc3RyYWludFZpb2xhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgaWYgKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmlzRGlzcGxheU1lc3NhZ2VJbmxpbmUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQuYWRkRmFjZXNNZXNzYWdlSG9sZGVyKGNyZWF0ZUZhY2VzTWVzc2FnZUhvbGRlckZvckNvbnN0cmFpbnRWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50VmlvbGF0aW9uLCBtb2RlbFZhbGlkYXRpb25FbnRyeSwgdmFsaWRhdGlvblRhcmdldCwgdHJ1ZSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRGYWNlc01lc3NhZ2VIb2xkZXIoY3JlYXRlRmFjZXNNZXNzYWdlSG9sZGVyRm9yQ29uc3RyYWludFZpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb24sIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0LCBmYWxzZSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgRmFjZXNNZXNzYWdlSG9sZGVyIGNyZWF0ZUZhY2VzTWVzc2FnZUhvbGRlckZvckNvbnN0cmFpbnRWaW9sYXRpb24oZmluYWwgQ29uc3RyYWludFZpb2xhdGlvbiB2aW9sYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkaXNwbGF5QXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGZpbmFsIFN0cmluZyBuZXdWaW9sYXRpb25NZXNzYWdlID0gdHJ5VG9DaGFuZ2VWaW9sYXRpb25NZXNzYWdlKA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeSwgdmFsaWRhdGlvblRhcmdldCwgdmlvbGF0aW9uKTsNCi0NCi0gICAgICAgIENvbnN0cmFpbnRWaW9sYXRpb24gbmV3Q29uc3RyYWludFZpb2xhdGlvbiA9IG5ldyBDb25zdHJhaW50VmlvbGF0aW9uKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcml2YXRlIENvbnN0cmFpbnRWaW9sYXRpb24gd3JhcHBlZCA9IHZpb2xhdGlvbjsNCi0NCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ld1Zpb2xhdGlvbk1lc3NhZ2U7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZVRlbXBsYXRlKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldE1lc3NhZ2VUZW1wbGF0ZSgpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFJvb3RCZWFuKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJvb3RCZWFuKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBDbGFzcyBnZXRSb290QmVhbkNsYXNzKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJvb3RCZWFuQ2xhc3MoKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRMZWFmQmVhbigpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRMZWFmQmVhbigpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgUGF0aCBnZXRQcm9wZXJ0eVBhdGgoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UHJvcGVydHlQYXRoKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0SW52YWxpZFZhbHVlKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldEludmFsaWRWYWx1ZSgpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgQ29uc3RyYWludERlc2NyaXB0b3IgZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9Ow0KLQ0KLQ0KLSAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIGNsaWVudElkID0gbnVsbDsNCi0NCi0gICAgICAgIGlmIChkaXNwbGF5QXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgdWlDb21wb25lbnQgPSBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKTsNCi0gICAgICAgICAgICBjbGllbnRJZCA9IHVpQ29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc01lc3NhZ2VIb2xkZXIgcmVzdWx0ID0gbmV3IEZhY2VzTWVzc2FnZUhvbGRlcihCZWFuVmFsaWRhdGlvblV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVGYWNlc01lc3NhZ2VGb3JDb25zdHJhaW50VmlvbGF0aW9uKHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uVGFyZ2V0LCBuZXdDb25zdHJhaW50VmlvbGF0aW9uKSk7DQotICAgICAgICByZXN1bHQuc2V0Q2xpZW50SWQoY2xpZW50SWQpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb0NoYW5nZVZpb2xhdGlvbk1lc3NhZ2UoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cmFpbnRWaW9sYXRpb24gdmlvbGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzRGVmYXVsdE1lc3NhZ2UobW9kZWxWYWxpZGF0aW9uRW50cnkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZVZhbGlkYXRpb25FcnJvck1lc3NhZ2UoDQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDdXN0b21NZXNzYWdlKCksIHZhbGlkYXRpb25UYXJnZXQsIHZpb2xhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmlvbGF0aW9uLmdldE1lc3NhZ2UoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0TWVzc2FnZShNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIE1vZGVsVmFsaWRhdGlvbi5ERUZBVUxULmVxdWFscyhtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDdXN0b21NZXNzYWdlKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGludGVycG9sYXRlVmFsaWRhdGlvbkVycm9yTWVzc2FnZShTdHJpbmcgZXh0VmFsSW5saW5lTWVzc2FnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LCBmaW5hbCBDb25zdHJhaW50VmlvbGF0aW9uIHZpb2xhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkNCi0gICAgICAgICAgICAgICAgLmludGVycG9sYXRlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dFZhbElubGluZU1lc3NhZ2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1lc3NhZ2VJbnRlcnBvbGF0b3IuQ29udGV4dCgpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlvbGF0aW9uLmdldENvbnN0cmFpbnREZXNjcmlwdG9yKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWxpZGF0ZWRWYWx1ZSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uVGFyZ2V0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICApOw0KLSAgICB9DQotDQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkNCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb2RlbFZhbGlkYXRpb25SZXN1bHRzKE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cykNCi0gICAgew0KLSAgICAgICAgZm9yIChNb2RlbFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0IDogcmVzdWx0cy52YWx1ZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBCZWFuVmFsaWRhdGlvblV0aWxzLnByb2Nlc3NWaW9sYXRpb25NZXNzYWdlcyhyZXN1bHQuZ2V0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9yc0ZvcihNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBVSUNvbXBvbmVudCBjb21wb25lbnQ7DQotICAgICAgICBmb3IgKE1vZGVsVmFsaWRhdGlvblJlc3VsdCByZXN1bHQgOiByZXN1bHRzLnZhbHVlcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvciAoRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlciA6IHJlc3VsdC5nZXRGYWNlc01lc3NhZ2VIb2xkZXJMaXN0KCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgICAgICAgICBpZiAoZmFjZXNNZXNzYWdlSG9sZGVyLmdldENsaWVudElkKCkgIT0gbnVsbCAmJiAhZmFjZXNNZXNzYWdlSG9sZGVyLmdldENsaWVudElkKCkuZXF1YWxzKCIqIikpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmZpbmRDb21wb25lbnQoZmFjZXNNZXNzYWdlSG9sZGVyLmdldENsaWVudElkKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoZmFjZXNDb250ZXh0LCBjb21wb25lbnQsIG51bGwsIG51bGwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IHBoYXNlRXZlbnQpDQotICAgIHsNCi0gICAgICAgIC8vZG8gbm90aGluZw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5VUERBVEVfTU9ERUxfVkFMVUVTOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKHRoaXMgPT0gbykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vTW9kZWxWYWxpZGF0aW9uUmVzdWx0LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvblJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2MxOThiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vTW9kZWxWYWxpZGF0aW9uUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5GYWNlc01lc3NhZ2VIb2xkZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTE9XLCBkZXNjcmlwdGlvbiA9ICJyZWZhY3RvciIpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBNb2RlbFZhbGlkYXRpb25SZXN1bHQNCi17DQotICAgIHByaXZhdGUgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkRmFjZXNNZXNzYWdlSG9sZGVyKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmFjZXNNZXNzYWdlSG9sZGVyTGlzdC5hZGQoZmFjZXNNZXNzYWdlSG9sZGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0RlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0RlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODM5MmYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9tZXNzYWdlL2ludGVycG9sYXRvci9EZWZhdWx0TWVzc2FnZUludGVycG9sYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5tZXNzYWdlLmludGVycG9sYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uTWVzc2FnZUludGVycG9sYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IgaW1wbGVtZW50cyBNZXNzYWdlSW50ZXJwb2xhdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLSAgICANCi0gICAgcHJpdmF0ZSBNZXNzYWdlSW50ZXJwb2xhdG9yIHdyYXBwZWQ7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcihNZXNzYWdlSW50ZXJwb2xhdG9yIHdyYXBwZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBpbnRlcnBvbGF0ZShTdHJpbmcgbWVzc2FnZU9yS2V5LCBDb250ZXh0IGNvbnRleHQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShtZXNzYWdlT3JLZXksIGNvbnRleHQsIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgaW50ZXJwb2xhdGUoU3RyaW5nIG1lc3NhZ2VPcktleSwgQ29udGV4dCBjb250ZXh0LCBMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkLmludGVycG9sYXRlKG1lc3NhZ2VPcktleSwgY29udGV4dCwgZ2V0Q3VycmVudExvY2FsZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTG9jYWxlIGdldEN1cnJlbnRMb2NhbGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9tZXNzYWdlL2ludGVycG9sYXRvci9FeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9tZXNzYWdlL2ludGVycG9sYXRvci9FeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmU5ZjMzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vbWVzc2FnZS9pbnRlcnBvbGF0b3IvRXh0VmFsTWVzc2FnZUludGVycG9sYXRvckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24ubWVzc2FnZS5pbnRlcnBvbGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsTWVzc2FnZUludGVycG9sYXRvckFkYXB0ZXIgZXh0ZW5kcyBEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcg0KLXsNCi0gICAgcHJpdmF0ZSBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOw0KLQ0KLSAgICBwdWJsaWMgRXh0VmFsTWVzc2FnZUludGVycG9sYXRvckFkYXB0ZXIoTWVzc2FnZUludGVycG9sYXRvciB3cmFwcGVkLCBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyKQ0KLSAgICB7DQotICAgICAgICBzdXBlcih3cmFwcGVkKTsNCi0gICAgICAgIHRoaXMubWVzc2FnZVJlc29sdmVyID0gbWVzc2FnZVJlc29sdmVyOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGludGVycG9sYXRlKFN0cmluZyBtZXNzYWdlT3JLZXksIENvbnRleHQgY29udGV4dCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGludGVycG9sYXRlKG1lc3NhZ2VPcktleSwgY29udGV4dCwgZ2V0Q3VycmVudExvY2FsZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBpbnRlcnBvbGF0ZShTdHJpbmcgbWVzc2FnZU9yS2V5LCBDb250ZXh0IGNvbnRleHQsIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMubWVzc2FnZVJlc29sdmVyICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoaXNCZWFuVmFsaWRhdGlvbk1lc3NhZ2VLZXlGb3JtYXQobWVzc2FnZU9yS2V5KSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFN0cmluZyBuZXdNZXNzYWdlT3JLZXkgPSB0aGlzLm1lc3NhZ2VSZXNvbHZlci5nZXRNZXNzYWdlKGV4dHJhY3RLZXkobWVzc2FnZU9yS2V5KSwgZ2V0Q3VycmVudExvY2FsZSgpKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYoaXNWYWxpZGVNZXNzYWdlKG5ld01lc3NhZ2VPcktleSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VPcktleSA9IG5ld01lc3NhZ2VPcktleTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgieW91IHRyaWVkIHRvIHVzZSBhbiBleHR2YWwgbWVzc2FnZS1yZXNvbHZlciBmb3IiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcjMwMyB2YWxpZGF0aW9uIHdpdGggYW4gaW52YWxpZCBrZXkgLT4gdXNpbmcgYSBkZWZhdWx0IGludGVycG9sYXRvciIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmludGVycG9sYXRlKG1lc3NhZ2VPcktleSwgY29udGV4dCwgZ2V0Q3VycmVudExvY2FsZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNCZWFuVmFsaWRhdGlvbk1lc3NhZ2VLZXlGb3JtYXQoU3RyaW5nIG1lc3NhZ2VPcktleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VPcktleS5zdGFydHNXaXRoKCJ7IikgJiYgbWVzc2FnZU9yS2V5LmVuZHNXaXRoKCJ9Iik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXh0cmFjdEtleShTdHJpbmcgbWVzc2FnZU9yS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWVzc2FnZU9yS2V5LnN1YnN0cmluZygxLCBtZXNzYWdlT3JLZXkubGVuZ3RoKCkgLSAxKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZGVNZXNzYWdlKFN0cmluZyBuZXdNZXNzYWdlT3JLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAhKG5ld01lc3NhZ2VPcktleS5zdGFydHNXaXRoKEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld01lc3NhZ2VPcktleS5lbmRzV2l0aChBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5NSVNTSU5HX1JFU09VUkNFX01BUktFUikpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGRlZWY2Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmlydHVhbFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmlydHVhbFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJpdmF0ZSBDb25zdHJhaW50RGVzY3JpcHRvciBjb25zdHJhaW50RGVzY3JpcHRvcjsNCi0gICAgcHJpdmF0ZSBDbGFzcyBlbGVtZW50Q2xhc3M7IC8vcHJvcGVydHkgdHlwZQ0KLQ0KLSAgICBwdWJsaWMgQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5KENvbnN0cmFpbnREZXNjcmlwdG9yIGNvbnN0cmFpbnREZXNjcmlwdG9yLCBDbGFzcyBlbGVtZW50Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29uc3RyYWludERlc2NyaXB0b3IgPSBjb25zdHJhaW50RGVzY3JpcHRvcjsNCi0gICAgICAgIHRoaXMuZWxlbWVudENsYXNzID0gZWxlbWVudENsYXNzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDb25zdHJhaW50RGVzY3JpcHRvciBnZXRDb25zdHJhaW50RGVzY3JpcHRvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb25zdHJhaW50RGVzY3JpcHRvcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0RWxlbWVudENsYXNzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVsZW1lbnRDbGFzczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RyYWludERlc2NyaXB0b3IuZ2V0QW5ub3RhdGlvbigpLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wb20ueG1sIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIwNGExMC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBWYWxpZGF0aW9uLU1vZHVsZXM8L25hbWU+DQotICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvdmFsaWRhdGlvbi1tb2R1bGVzPC9jb25uZWN0aW9uPg0KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL3ZhbGlkYXRpb24tbW9kdWxlczwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4NCi0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL3ZhbGlkYXRpb24tbW9kdWxlczwvdXJsPg0KLSAgICA8L3NjbT4NCi0NCi0gICAgPG1vZHVsZXM+DQotICAgICAgICA8bW9kdWxlPnByb3BlcnR5LXZhbGlkYXRpb248L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+YmVhbi12YWxpZGF0aW9uPC9tb2R1bGU+DQotICAgIDwvbW9kdWxlcz4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbCBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZkNDk0ZC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFByb3BlcnR5LVZhbGlkYXRpb24tTW9kdWxlPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4yLjAuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnBlcnNpc3RlbmNlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnBlcnNpc3RlbmNlLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjU8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldC5qc3A8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNwLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zaGFsZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zaGFsZS10ZXN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC40PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4NCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5teWZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgPC9leGNsdXNpb25zPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cmVzb3VyY2VzPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICA8L3Jlc291cmNlcz4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40LjI8L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL0Fic3RyYWN0Ki5qYXZhPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL1Rlc3RVdGlscy5qYXZhPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypCZWFuLmphdmE8L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+ICAgICAgICAgICAgDQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzM3ZjQyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18yXzAueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMi4wIj4NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotPC9mYWNlcy1jb25maWc+DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM3ODVkNi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQKLSAgICAgICAgLkFic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVSZXF1aXJlZEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZigoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQpKSB8fAotICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICAgICAgJiYKLSAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMoaXNDb21wb25lbnRSZXF1aXJlZCh1aUNvbXBvbmVudCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpICYmCi0gICAgICAgICAgICAgICAhQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Kb2luVmFsaWRhdGlvbk1ldGFEYXRhU3RvcmFnZUZpbHRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Kb2luVmFsaWRhdGlvbk1ldGFEYXRhU3RvcmFnZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTEyM2NkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSm9pblZhbGlkYXRpb25NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLk1ldGFEYXRhU3RvcmFnZUZpbHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBFWFRWQUwtNTkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpvaW5WYWxpZGF0aW9uTWV0YURhdGFTdG9yYWdlRmlsdGVyIGltcGxlbWVudHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVElDX1NFUEFSQVRPUiA9ICI6IjsNCi0NCi0gICAgcHVibGljIHZvaWQgZmlsdGVyKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKHByb3BlcnR5SW5mb3JtYXRpb24gIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFbnRyeT4oKTsNCi0NCi0gICAgICAgICAgICByZXNvbHZlSm9pblZhbGlkYXRpb25NZXRhRGF0YShwcm9wZXJ0eUluZm9ybWF0aW9uLCByZXN1bHQpOw0KLQ0KLSAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24ucmVzZXRNZXRhRGF0YUVudHJpZXMoKTsNCi0NCi0gICAgICAgICAgICBzZXREZWZhdWx0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5SW5mb3JtYXRpb24sIHJlc3VsdCk7DQotDQotICAgICAgICAgICAgaWYgKGNvbnRhaW5zSm9pblZhbGlkYXRpb25Db25zdHJhaW50KHJlc3VsdCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmaWx0ZXIocHJvcGVydHlJbmZvcm1hdGlvbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZXNvbHZlSm9pblZhbGlkYXRpb25NZXRhRGF0YShQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24sIExpc3Q8TWV0YURhdGFFbnRyeT4gcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSA6IHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0cnlUb1RyYW5zZm9ybUVudHJ5KG1ldGFEYXRhRW50cnkpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0RGVmYXVsdFByb3BlcnR5RGV0YWlscyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24sIExpc3Q8TWV0YURhdGFFbnRyeT4gcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSA6IHJlc3VsdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsDQotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMpKTsNCi0gICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLmFkZE1ldGFEYXRhRW50cnkobWV0YURhdGFFbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zSm9pblZhbGlkYXRpb25Db25zdHJhaW50KExpc3Q8TWV0YURhdGFFbnRyeT4gcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiByZXN1bHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBKb2luVmFsaWRhdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TWV0YURhdGFFbnRyeT4gdHJ5VG9UcmFuc2Zvcm1FbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIExpc3Q8TWV0YURhdGFFbnRyeT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUVudHJ5PigpOw0KLQ0KLSAgICAgICAgaWYgKG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEpvaW5WYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEpvaW5WYWxpZGF0aW9uIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEpvaW5WYWxpZGF0aW9uLmNsYXNzKTsNCi0NCi0gICAgICAgICAgICByZXBsYWNlTWV0YURhdGEoYW5ub3RhdGlvbiwgbWV0YURhdGFFbnRyeSwgcmVzdWx0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQuYWRkKG1ldGFEYXRhRW50cnkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVwbGFjZU1ldGFEYXRhKEpvaW5WYWxpZGF0aW9uIGFubm90YXRpb24sIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgTGlzdDxNZXRhRGF0YUVudHJ5PiByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIGZvciAoU3RyaW5nIHRhcmdldCA6IGFubm90YXRpb24udmFsdWUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb1JlcGxhY2VNZXRhRGF0YU9mVGFyZ2V0KHRhcmdldCwgbWV0YURhdGFFbnRyeSwgcmVzdWx0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9SZXBsYWNlTWV0YURhdGFPZlRhcmdldChTdHJpbmcgdGFyZ2V0LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIExpc3Q8TWV0YURhdGFFbnRyeT4gcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoaXNTdGF0aWNTeW50YXgodGFyZ2V0KSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFkZE1ldGFEYXRhKHJlc3VsdCwgZXh0cmFjdFN0YXRpY01ldGFEYXRhKHRhcmdldCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNZXRhRGF0YShyZXN1bHQsIGV4dHJhY3REeW5hbWljTWV0YURhdGEobWV0YURhdGFFbnRyeSwgdGFyZ2V0KSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyBhIGRpZmZlcmVudCBmaWx0ZXIgbWlnaHQgaW50cm9kdWNlIGEgbmV3IHN5bnRheCB3aGljaCBjYXVzZXMgdGhlIGV4Y2VwdGlvbg0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRNZXRhRGF0YShMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCwgTWV0YURhdGFFbnRyeVtdIG1ldGFEYXRhRW50cmllcykNCi0gICAgew0KLSAgICAgICAgQ29sbGVjdGlvbnMuYWRkQWxsKHJlc3VsdCwgbWV0YURhdGFFbnRyaWVzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTdGF0aWNTeW50YXgoU3RyaW5nIHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldC5jb250YWlucyhTVEFUSUNfU0VQQVJBVE9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhRW50cnlbXSBleHRyYWN0U3RhdGljTWV0YURhdGEoU3RyaW5nIHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgaW50IHNlcGFyYXRvckluZGV4ID0gdGFyZ2V0Lmxhc3RJbmRleE9mKFNUQVRJQ19TRVBBUkFUT1IpOw0KLQ0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBsb2FkQ2xhc3ModGFyZ2V0LnN1YnN0cmluZygwLCBzZXBhcmF0b3JJbmRleCkpOw0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRhcmdldC5zdWJzdHJpbmcoc2VwYXJhdG9ySW5kZXggKyAxKTsNCi0NCi0gICAgICAgIHJldHVybiBuZXcgU3RhdGljU3ludGF4TWV0YURhdGFFeHRyYWN0b3IoKS5leHRyYWN0KHRhcmdldENsYXNzLCBwcm9wZXJ0eU5hbWUpLmdldE1ldGFEYXRhRW50cmllcygpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBjbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBDbGFzc1V0aWxzLmxvYWRDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhRW50cnlbXSBleHRyYWN0RHluYW1pY01ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgU3RyaW5nIHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzLmNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChtZXRhRGF0YUVudHJ5LCB0YXJnZXQpOw0KLQ0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICByZXR1cm4gbmV3IFN0YXRpY1N5bnRheE1ldGFEYXRhRXh0cmFjdG9yKCkuZXh0cmFjdCgNCi0gICAgICAgICAgICAgICAgdGFyZ2V0Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpKS5nZXRNZXRhRGF0YUVudHJpZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGNsYXNzIFN0YXRpY1N5bnRheE1ldGFEYXRhRXh0cmFjdG9yIGV4dGVuZHMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsNCi0NCi0gICAgICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKHRhcmdldENsYXNzLCB0YXJnZXRQcm9wZXJ0eSwgcHJvcGVydHlJbmZvcm1hdGlvbik7DQotICAgICAgICAgICAgYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9ucyh0YXJnZXRDbGFzcywgdGFyZ2V0UHJvcGVydHksIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG9iaiAhPSBudWxsICYmIGdldENsYXNzKCkuZXF1YWxzKG9iai5nZXRDbGFzcygpKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MGNkZTAuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRHcm91cFN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBuYW1lIG1hcHBlciBmb3IgZ3JvdXAgaW1wbGVtZW50YXRpb25zIHZpYSB2YWxpZGF0aW9uIHBhcmFtZXRlcnMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uUGFyYW1ldGVyLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0R3JvdXBTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNzQ4NDMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5WYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBWYWxpZGF0aW9uTW9kdWxlS2V5DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkNCi17DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGUwZjhkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkFic3RyYWN0U3RhcnR1cExpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXJIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuR3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLk1ldGFEYXRhU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwucmVjb3JkZXIuQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkRlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UubWFwcGVyLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5tYXBwZXIuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTI0NzQzNjE2MTI4NTcyMjIyODNMOw0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgaW5pdFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCk7DQotICAgICAgICBpbml0U3RhdGljU3RyYXRlZ3lNYXBwaW5ncygpOw0KLSAgICAgICAgaW5pdERlZmF1bHRDb21wb25lbnRJbml0aWFsaXplcigpOw0KLSAgICAgICAgYWRkU2tpcFZhbGlkYXRpb25TdXBwb3J0KCk7DQotICAgICAgICBpbml0U3RvcmFnZU1hbmFnZXJBbmROYW1lTWFwcGVycygpOw0KLSAgICAgICAgaW5pdFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKCk7DQotICAgICAgICBpbml0TWV0YURhdGFTdG9yYWdlRmlsdGVycygpOw0KLSAgICAgICAgaW5pdFBoYXNlTGlzdGVuZXJzKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycygpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIobmV3IENyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0U3RhdGljU3RyYXRlZ3lNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBqcGFCYXNlZFZhbGlkYXRpb24gPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9KUEFfQkFTRURfVkFMSURBVElPTjsNCi0gICAgICAgIGlmIChqcGFCYXNlZFZhbGlkYXRpb24gPT0gbnVsbA0KLSAgICAgICAgICAgICAgICB8fCAhanBhQmFzZWRWYWxpZGF0aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgPSBuZXcgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZygNCi0gICAgICAgICAgICAgICAgRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgKyIuanBhX3N0cmF0ZWd5X21hcHBpbmdzIik7DQotDQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkU3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRywgc3RhdGljQ29uZmlnKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdERlZmF1bHRDb21wb25lbnRJbml0aWFsaXplcigpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZENvbXBvbmVudEluaXRpYWxpemVyKG5ldyBIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkU2tpcFZhbGlkYXRpb25TdXBwb3J0KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuaW5mbygiYWRkaW5nIHN1cHBvcnQgZm9yIEBTa2lwVmFsaWRhdGlvbiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZGVueVJlbmRlcmVySW50ZXJjZXB0b3IoVmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yKCkpOw0KLQ0KLSAgICAgICAgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgIC8vaXQncyBqdXN0IHJlcXVpcmVkIHRvIHNldCB0aGUgdGFyZ2V0DQotICAgICAgICBjb25maWcuYWRkTWFwcGluZyhDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCBTa2lwVmFsaWRhdGlvblN1cHBvcnQuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5TS0lQX1ZBTElEQVRJT05fU1VQUE9SVF9DT05GSUcsIGNvbmZpZyk7DQotDQotICAgICAgICAvL2NvbmZpZy5hZGRNYXBwaW5nKENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04sIFJlcXVpcmVkU3RyYXRlZ3kuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFN0b3JhZ2VNYW5hZ2VyQW5kTmFtZU1hcHBlcnMoKQ0KLSAgICB7DQotICAgICAgICBTdG9yYWdlTWFuYWdlckhvbGRlciBzdG9yYWdlTWFuYWdlckhvbGRlciA9DQotICAgICAgICAgICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwgU3RvcmFnZU1hbmFnZXJIb2xkZXIuY2xhc3MpKTsNCi0NCi0gICAgICAgIC8vcHJvY2Vzc2VkLWluZm9ybWF0aW9uDQotICAgICAgICBEZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlciBwcm9jZXNzZWRJbmZvU3RvcmFnZU1hbmFnZXIgPQ0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIoKTsNCi0gICAgICAgIHByb2Nlc3NlZEluZm9TdG9yYWdlTWFuYWdlci5yZWdpc3RlcihuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIHN0b3JhZ2VNYW5hZ2VySG9sZGVyLnNldFN0b3JhZ2VNYW5hZ2VyKFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jbGFzcywgcHJvY2Vzc2VkSW5mb1N0b3JhZ2VNYW5hZ2VyLCBmYWxzZSk7DQotDQotICAgICAgICAvL2Nyb3NzLXZhbGlkYXRpb24NCi0gICAgICAgIERlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlciBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlciA9DQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIoKTsNCi0gICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLnJlZ2lzdGVyKG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIHN0b3JhZ2VNYW5hZ2VySG9sZGVyLnNldFN0b3JhZ2VNYW5hZ2VyKENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MsIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLCBmYWxzZSk7DQotDQotICAgICAgICAvL2dyb3VwLXZhbGlkYXRpb24gbGlnaHQNCi0gICAgICAgIFN0b3JhZ2VNYW5hZ2VyIHN0b3JhZ2VNYW5hZ2VyID0gc3RvcmFnZU1hbmFnZXJIb2xkZXIuZ2V0U3RvcmFnZU1hbmFnZXIoR3JvdXBTdG9yYWdlLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmKHN0b3JhZ2VNYW5hZ2VyIGluc3RhbmNlb2YgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgICgoQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFN0cmluZz4pc3RvcmFnZU1hbmFnZXIpDQotICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IFByb3BlcnR5VmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcigpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnNldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKG5ldyBQcm9wZXJ0eVZhbGlkYXRpb25Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvcigpLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRNZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzKCkNCi0gICAgew0KLSAgICAgICAgIE1ldGFEYXRhU3RvcmFnZSBtZXRhRGF0YVN0b3JhZ2UgPSBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKA0KLSAgICAgICAgICAgICAgICAgTWV0YURhdGFTdG9yYWdlLmNsYXNzLCBNZXRhRGF0YVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIG1ldGFEYXRhU3RvcmFnZS5yZWdpc3RlckZpbHRlcihuZXcgSm9pblZhbGlkYXRpb25NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIoKSk7DQotICAgICAgICAvL21ldGFEYXRhU3RvcmFnZS5yZWdpc3RlckZpbHRlcihuZXcgQ29tcG9zaXRlTWV0YURhdGFTdG9yYWdlRmlsdGVyKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0UGhhc2VMaXN0ZW5lcnMoKQ0KLSAgICB7DQotICAgICAgICBKc2ZVdGlscy5yZWdpc3RlclBoYXNlTGlzdGVuZXIobmV3IENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YzQ1MjYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci0KLS8qKgotICogdGhlIHNraXAgdmFsaWRhdGlvbiBzdXBwb3J0IHdhcyByZWZhY3RvcmVkIHRvIGFuIGluZGVwZW5kZW50IG1lY2hhbmlzbQotICogc2VlIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJjaGFuZ2UgdGhlIGFkZC1vbnMiICsKLSAgICAgICAgIm9sZCBuYW1lOiBWYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0IikKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0TW9kdWxlS2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWE2YWRjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJvcGVydHlWYWxpZGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgeC54LjMKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvciBpbXBsZW1lbnRzIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yCi17Ci0gICAgcHVibGljIGJvb2xlYW4gc2tpcFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBpZihKc2ZVdGlscy5pc1JlbmRlclJlc3BvbnNlUGhhc2UoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gIWlzQ2xpZW50U2lkZVZhbGlkYXRpb25FbmFibGVkKG1ldGFEYXRhRW50cnkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQgfHwgUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZGF0aW9uU2tpcHBlZChmYWNlc0NvbnRleHQsIHZhbGlkYXRpb25TdHJhdGVneSwgbWV0YURhdGFFbnRyeSk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDbGllbnRTaWRlVmFsaWRhdGlvbkVuYWJsZWQoTWV0YURhdGFFbnRyeSBlbnRyeSkKLSAgICB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBrZXlzVG9EaXNhYmxlID0gZW50cnkuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbk1ldGFEYXRhS2V5cy5ESVNBQkxFX0NMSUVOVF9TSURFX1ZBTElEQVRJT04sIExpc3QuY2xhc3MpOwotCi0gICAgICAgIHJldHVybiBrZXlzVG9EaXNhYmxlID09IG51bGwgfHwgIWtleXNUb0Rpc2FibGUuY29udGFpbnMoZW50cnkuZ2V0S2V5KCkpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NzdhNGUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcm4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiZG9jdW1lbnRhdGlvbiIpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01FU1NBR0VTX0pQQSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTIik7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9KUEFfQkFTRURfVkFMSURBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfSlBBX0JBU0VEX1ZBTElEQVRJT04iKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vRG91YmxlUmFuZ2UuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0RvdWJsZVJhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNGUwMmYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vRG91YmxlUmFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBEb3VibGVSYW5nZQ0KLXsNCi0gICAgZG91YmxlIG1pbmltdW0oKSBkZWZhdWx0IERvdWJsZS5NSU5fVkFMVUU7DQotDQotICAgIGRvdWJsZSBtYXhpbXVtKCkgZGVmYXVsdCBEb3VibGUuTUFYX1ZBTFVFOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vSm9pblZhbGlkYXRpb24uamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjOWE4OTkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vSm9pblZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIEpvaW5WYWxpZGF0aW9uDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xlbmd0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzQzN2QxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xlbmd0aC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIExlbmd0aA0KLXsNCi0gICAgaW50IG1pbmltdW0oKSBkZWZhdWx0IDA7DQotDQotICAgIGludCBtYXhpbXVtKCkgZGVmYXVsdCBJbnRlZ2VyLk1BWF9WQUxVRTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MjUxZWYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgTG9uZ1JhbmdlDQotew0KLSAgICBsb25nIG1pbmltdW0oKSBkZWZhdWx0IExvbmcuTUlOX1ZBTFVFOw0KLQ0KLSAgICBsb25nIG1heGltdW0oKSBkZWZhdWx0IExvbmcuTUFYX1ZBTFVFOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUGF0dGVybi5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzc1ZDg5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1BhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBQYXR0ZXJuDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZSgpOw0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAibm9fbWF0Y2giOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUmVxdWlyZWQuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExY2UxMjguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUmVxdWlyZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBSZXF1aXJlZA0KLXsNCi0gICAgLyoqDQotICAgICAqIHRvIGN1c3RvbWl6ZSB0aGUgZXJyb3IgbWVzc2FnZSBvcg0KLSAgICAgKiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBqc2YgcmVxdWlyZWQgbWVzc2FnZSB3aXRoIHRoZSB1c2FnZSBvZiB0aGUgbWVzc2FnZSByZXNvbHZlciBtZWNoYW5pc20NCi0gICAgICoNCi0gICAgICogQHJldHVybiBhbiBvcHRpb25hbCBlcnJvciBtZXNzYWdlIGtleQ0KLSAgICAgKi8NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImZpZWxkX3JlcXVpcmVkIjsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmM1MjliLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBTa2lwVmFsaWRhdGlvbg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQge307DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uU3VwcG9ydC5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMDc2MjEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUYXJnZXQoVFlQRSkKLUBSZXRlbnRpb24oUlVOVElNRSkKLUBEb2N1bWVudGVkCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBAaW50ZXJmYWNlIFNraXBWYWxpZGF0aW9uU3VwcG9ydAotewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1ZhbGlkYXRvci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMzhhY2EuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgVmFsaWRhdG9yDQotew0KLSAgICBDbGFzczw/IGV4dGVuZHMgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcj5bXSB2YWx1ZSgpOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMGVlYmEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLkRlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBEZXByZWNhdGVkCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IgZXh0ZW5kcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IKLXsKLSAgICBwcml2YXRlIERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGdldEluc3RhbmNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVJbnRlcmNlcHRlZE1ldGFEYXRhRXh0cmFjdG9yRm9yKAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yKCksIFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQotICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOwotCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFByb3BlcnR5RGV0YWlscykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24ob2JqZWN0LmdldENsYXNzKCkgKyAiIGlzIG5vdCBhICIgKyBQcm9wZXJ0eURldGFpbHMuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSAoUHJvcGVydHlEZXRhaWxzKW9iamVjdDsKLQotICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpKTsKLQotICAgICAgICAvL1RPRE8gdGVzdCB3aXRoIGNvbXBsZXggY29tcG9uZW50cwotICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnNldEluZm9ybWF0aW9uKAotICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBmaW5kIGFuZCBhZGQgYW5ub3RhdGlvbnMKLSAgICAgICAgICovCi0gICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9ucyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU4MDEyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9SW52YWxpZCBmb3JtYXQNCi1ub19tYXRjaF9kZXRhaWw9VGhlIHJlcXVpcmVkIGZvcm1hdGUgaXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2FiNTQzLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9XHUwNjI3XHUwNjQ0XHUwNjM1XHUwNjRhXHUwNjNhXHUwNjI5IFx1MDYyZVx1MDYyN1x1MDYzN1x1MDYyNlx1MDYyOQ0KLW5vX21hdGNoX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MzVcdTA2NGFcdTA2M2FcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjM3XHUwNjQ0XHUwNjQ4XHUwNjI4XHUwNjI5IFx1MDY0N1x1MDY0OTogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcyBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZDY0OTAuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotbm9fbWF0Y2g9Rm9ybWF0IGludlx1MDBlMGxpZAotbm9fbWF0Y2hfZGV0YWlsPUVsIGZvcm1hdCByZXF1ZXJpdCBcdTAwZTlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVlNzAxYi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPVVuZ/xsdGlnZXMgRm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPURhcyBlcmZvcmRlcmxpY2hlIEZvcm1hdCBpc3Q6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU4MDEyLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9SW52YWxpZCBmb3JtYXQNCi1ub19tYXRjaF9kZXRhaWw9VGhlIHJlcXVpcmVkIGZvcm1hdGUgaXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2JiOThjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9Rm9ybWF0byBpbnZcdTAwZTFsaWRvIA0KLW5vX21hdGNoX2RldGFpbD1FbCBmb3JtYXRvIHJlcXVlcmlkbyBlczogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcyBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMGEyMjMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1MZSBmb3JtYXQgZXN0IGludmFsaWRlDQotbm9fbWF0Y2hfZGV0YWlsPUxlIGZvcm1hdCBkb2l0ICZlY2lyYzt0cmUgZGUgbGEgZm9ybWU6IHswfQ0KLQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTg3NDhjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW5vX21hdGNoPUZvcm1hdG8gbm9uIHZhbGlkbwotbm9fbWF0Y2hfZGV0YWlsPUlsIGZvcm1hdG8gcmljaGllc3RvICZlZ3JhdmU7OiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0YmM3NC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUdlXHUwMGU3ZXJzaXogYmlcdTAwZTdpbQ0KLW5vX21hdGNoX2RldGFpbD1nZXJla2VuIGJpXHUwMGU3aW06IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFhZTY0Yi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLSAgICAgICAgZXh0ZW5kcw0KLSAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBiYXNlTmFtZSA9IG51bGw7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYgKGJhc2VOYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZU5hbWUgPSBzdXBlci5nZXRCYXNlTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGJhc2VOYW1lOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NzZhZDkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogdGhlIGpwYSBzdXBwb3J0IGlzIGFuIGV4Y2VwdGlvbiBpbiB2aWV3IG9mIHNvbWUgbWVjaGFuaXNtcyAtIHNvIHRoZXJlJ3Mgbm8gY29udmVudGlvbiBmb3IgdGhlIG1lc3NhZ2UgYnVuZGxlLg0KLSAqIGluc3RlYWQgb2YgdGhlIGNvbnZlbnRpb24gdGhlcmUgaXMgYSBnbG9iYWwgcHJvcGVydHkgdG8gaGF2ZSBhbiBhbHRlcm5hdGl2ZSB0byB3ZWIueG1sIGNvbmZpZ3VyYXRpb24NCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMgPSAiSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0JBU0VfTkFNRSA9IFdlYlhtbFBhcmFtZXRlci5WQUxJREFUSU9OX01FU1NBR0VTX0pQQTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfTkFNRSA9IEpwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5jbGFzcw0KLSAgICAgICAgICAgIC5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLnJlcGxhY2UoIi5tZXNzYWdlLnJlc29sdmVyIiwgIi5tZXNzYWdlLmJ1bmRsZSIpKyAiLmpwYV9tZXNzYWdlcyI7DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tQmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZihDVVNUT01fQkFTRV9OQU1FICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIENVU1RPTV9CQVNFX05BTUU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKFN0cmluZylFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShKUEFfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFUyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBCQVNFX05BTUU7DQotICAgIH0NCi0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0Fic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9BYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NWNkNDQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0Fic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgaWYgKGlzQmxvY2tpbmdNZXRhRGF0YShtZXRhRGF0YSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybU1ldGFEYXRhKG1ldGFEYXRhKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGEpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Jsb2NraW5nTWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UgdGVzdE1lc3NhZ2UgPSBuZXcgRmFjZXNNZXNzYWdlKCk7DQotICAgICAgICB0ZXN0TWVzc2FnZS5zZXRTZXZlcml0eShGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5ID0gdHJ5VG9UcmFuc2Zvcm1WaW9sYXRpb25TZXZlcml0eShtZXRhRGF0YUVudHJ5KTsNCi0NCi0gICAgICAgIGlmKHNldmVyaXR5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGVzdE1lc3NhZ2Uuc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLnNldmVyaXR5QmxvY2tzU3VibWl0Rm9yQ29tcG9uZW50SWQobnVsbCwgdGVzdE1lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHRyeVRvVHJhbnNmb3JtVmlvbGF0aW9uU2V2ZXJpdHkoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZS5TZXZlcml0eT4gcmVzdWx0ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpDQotICAgICAgICAgICAgICAgIC5leHRyYWN0KG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKFZpb2xhdGlvblNldmVyaXR5LmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkuY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmICFyZXN1bHQuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQuaXRlcmF0b3IoKS5uZXh0KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTllNGUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uRG91YmxlUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEb3VibGVSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgRG91YmxlUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoRG91YmxlUmFuZ2UuY2xhc3MpOw0KLQ0KLSAgICAgICAgZG91YmxlIG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gIT0gRG91YmxlLk1JTl9WQUxVRSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOLCBtaW5pbXVtKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOX0RFRkFVTFQsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZG91YmxlIG1heGltdW0gPSBhbm5vdGF0aW9uLm1heGltdW0oKTsNCi0NCi0gICAgICAgIGlmKG1heGltdW0gIT0gRG91YmxlLk1BWF9WQUxVRSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYLCBtYXhpbXVtKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pvaW5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSm9pbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYzNTMyNC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSm9pbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Kb2luVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5leHRyYWN0b3IuRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm9wZXJ0eVZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotQERlcHJlY2F0ZWQNCi1wdWJsaWMgY2xhc3MgSm9pbk1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY29udmVydChtZXRhRGF0YUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCJ0aGlzIGNsYXNzIGlzIHJlcGxhY2VkIGJ5IGEgbWV0YS1kYXRhIHN0b3JhZ2UgZmlsdGVyLiAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiaWYgaXQgZ2V0cyBpbnZva2VkIGFuZCBhbiBleGNlcHRpb24gb2NjdXJzLCBhIGN1c3RvbSBzeW50YXggaXMgdXNlZC4iICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBjbGFzcyBtaWdodCBiZSB1c2VkIGJ5IGFuIG9sZCBhZGQtb24uIHBsZWFzZSBjaGVjayBmb3IgYSBuZXdlciB2ZXJzaW9uLiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIGV4dHJhY3RvciA9IERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuZ2V0SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIFN0cmluZ1tdIHRhcmdldEV4cHJlc3Npb25zID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShKb2luVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotDQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHM7DQotICAgICAgICBmb3IgKFN0cmluZyB0YXJnZXRFeHByZXNzaW9uIDogdGFyZ2V0RXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChtZXRhRGF0YUVudHJ5LCB0YXJnZXRFeHByZXNzaW9uKTsNCi0NCi0gICAgICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBleHRyYWN0b3IuZXh0cmFjdChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzKS5nZXRNZXRhRGF0YUVudHJpZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKGVudHJ5LmdldEtleSgpKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5ID09IG51bGwgfHwNCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbGlkYXRpb25VdGlscy5pc1ZhbGlkYXRpb25Ta2lwcGVkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSwgZW50cnkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyID0gRXh0VmFsVXRpbHMuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckZvclZhbGlkYXRpb25TdHJhdGVneSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZighKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBBbm5vdGF0aW9uICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5leHRyYWN0KGVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pdGVyYXRvcigpLmhhc05leHQoKSkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXRBbGwobWV0YURhdGFUcmFuc2Zvcm1lci5jb252ZXJ0TWV0YURhdGEoZW50cnkpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2UxMDExLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5CYXNpYzsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhTWV0YURhdGFUcmFuc2Zvcm1lciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXINCi17DQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJpbXBsLiB0aGUgcmVzdCIpDQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIENvbHVtbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZigoISgoQ29sdW1uKSBhbm5vdGF0aW9uKS5udWxsYWJsZSgpKSAmJiBFeHRWYWxVdGlscy5pbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgsICgoQ29sdW1uKSBhbm5vdGF0aW9uKS5sZW5ndGgoKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKGFubm90YXRpb24gaW5zdGFuY2VvZiBCYXNpYykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighKChCYXNpYykgYW5ub3RhdGlvbikub3B0aW9uYWwoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihhbm5vdGF0aW9uIGluc3RhbmNlb2YgSWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vVE9ETyBpbXBsLiB0aGUgcmVzdCEhIQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9MZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzOTFmOWEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxlbmd0aDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIgIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uUGFyYW1ldGVyQXdhcmVUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIExlbmd0aCBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMZW5ndGguY2xhc3MpOw0KLQ0KLSAgICAgICAgaW50IG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gIT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSCwgbWluaW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEhfREVGQVVMVCwgbWluaW11bSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpbnQgbWF4aW11bSA9IGFubm90YXRpb24ubWF4aW11bSgpOw0KLSAgICAgICAgaWYobWF4aW11bSAhPSBJbnRlZ2VyLk1BWF9WQUxVRSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCwgbWF4aW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEhfREVGQVVMVCwgbWF4aW11bSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBhMzMyYi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTG9uZ1JhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXINCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBMb25nUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTG9uZ1JhbmdlLmNsYXNzKTsNCi0NCi0gICAgICAgIGxvbmcgbWluaW11bSA9IGFubm90YXRpb24ubWluaW11bSgpOw0KLQ0KLSAgICAgICAgaWYobWluaW11bSAhPSBMb25nLk1JTl9WQUxVRSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOLCBtaW5pbXVtKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOX0RFRkFVTFQsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbG9uZyBtYXhpbXVtID0gYW5ub3RhdGlvbi5tYXhpbXVtKCk7DQotDQotICAgICAgICBpZihtYXhpbXVtICE9IExvbmcuTUFYX1ZBTFVFKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVhfREVGQVVMVCwgbWF4aW11bSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9QYXR0ZXJuTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTBiZTY1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9QYXR0ZXJuTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFBhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXINCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBQYXR0ZXJuIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFBhdHRlcm4uY2xhc3MpOw0KLSAgICAgICAgDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTiwgKGFubm90YXRpb24pLnZhbHVlKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSA9IChhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIExvY2FsZSBjdXJyZW50TG9jYWxlID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCk7DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5ID0NCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2cgPSBFeHRWYWxVdGlscy5nZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgIC5nZXRNZXNzYWdlKHZhbGlkYXRpb25FcnJvck1zZ0tleSwgY3VycmVudExvY2FsZSk7DQotDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTl9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UsIHZhbGlkYXRpb25FcnJvck1zZyk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYmVjYzkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NraXBNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU2tpcE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjNjRhYi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU2tpcE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgU2tpcE1ldGFEYXRhVHJhbnNmb3JtZXIgIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uUGFyYW1ldGVyQXdhcmVUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04sIHRydWUpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1ZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMDVhYjAuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1ZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXINCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBWYWxpZGF0b3IgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoVmFsaWRhdG9yLmNsYXNzKTsNCi0NCi0gICAgICAgIENsYXNzW10gdmFsaWRhdG9ycyA9IGFubm90YXRpb24udmFsdWUoKTsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRDbGFzcyA6IHZhbGlkYXRvcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoY3VycmVudENsYXNzLmdldFNpbXBsZU5hbWUoKS50b0xvd2VyQ2FzZSgpLmNvbnRhaW5zKENvbW1vbk1ldGFEYXRhS2V5cy5FTUFJTCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWx1ZS5hZGQoQ29tbW9uTWV0YURhdGFLZXlzLkVNQUlMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdmFsdWUuYWRkKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLkNVU1RPTSwgdmFsdWUpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNzU5MzMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkRvdWJsZVJhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuRG91YmxlUmFuZ2VWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERvdWJsZVJhbmdlU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLQ0KLSAgICAgICAgRG91YmxlUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoRG91YmxlUmFuZ2UuY2xhc3MpOw0KLSAgICAgICAgRG91YmxlUmFuZ2VWYWxpZGF0b3IgZG91YmxlUmFuZ2VWYWxpZGF0b3IgPSAoRG91YmxlUmFuZ2VWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoImphdmF4LmZhY2VzLkRvdWJsZVJhbmdlIik7DQotDQotICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSm9pblZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkYTFhYy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSm9pblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3Rvci5EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY2VzRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotQERlcHJlY2F0ZWQNCi1wdWJsaWMgY2xhc3MgSm9pblZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlSm9pblZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChGYWNlc0V4Y2VwdGlvbiB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IHQ7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybigidGhpcyBjbGFzcyBpcyByZXBsYWNlZCBieSBhIG1ldGEtZGF0YSBzdG9yYWdlIGZpbHRlci4gIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgImlmIGl0IGdldHMgaW52b2tlZCBhbmQgYW4gZXhjZXB0aW9uIG9jY3VycywgYSBjdXN0b20gc3ludGF4IGlzIHVzZWQuIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgY2xhc3MgbWlnaHQgYmUgdXNlZCBieSBhbiBvbGQgYWRkLW9uLiBwbGVhc2UgY2hlY2sgZm9yIGEgbmV3ZXIgdmVyc2lvbi4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlSm9pblZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgZXh0cmFjdG9yID0gRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5nZXRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgU3RyaW5nW10gdGFyZ2V0RXhwcmVzc2lvbnMgPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEpvaW5WYWxpZGF0aW9uLmNsYXNzKS52YWx1ZSgpOw0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHM7DQotICAgICAgICBmb3IgKFN0cmluZyB0YXJnZXRFeHByZXNzaW9uIDogdGFyZ2V0RXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChtZXRhRGF0YUVudHJ5LCB0YXJnZXRFeHByZXNzaW9uKTsNCi0NCi0gICAgICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBleHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHByb3BlcnR5RGV0YWlscykuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoRXh0VmFsVXRpbHMucHJvY2Vzc01ldGFEYXRhRW50cnlBZnRlclNraXBWYWxpZGF0aW9uKFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MpLCBlbnRyeSkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm5vIHZhbGlkYXRpb24gc3RyYXRlZ3kgZm91bmQgZm9yICIgKyBlbnRyeS5nZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSnBhVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSnBhVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNDFhOTMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uZXhjZXB0aW9uLlJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLk51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5CYXNpYzsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmU7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ATnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1ARW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRmFjZXNCdW5kbGUgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRFX0xFTkdUSCA9ICJsZW5ndGgiOw0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB2aW9sYXRpb247DQotICAgIHByaXZhdGUgaW50IG1heExlbmd0aDsNCi0NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpOw0KLSAgICAgICAgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBDb2x1bW4pDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVDb2x1bW5Bbm5vdGF0aW9uKChDb2x1bW4pIGFubm90YXRpb24sIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgQmFzaWMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVCYXNpY0Fubm90YXRpb24oKEJhc2ljKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIElkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBPbmVUb09uZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZU9uZVRvT25lQW5ub3RhdGlvbigoT25lVG9PbmUpIGFubm90YXRpb24sIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTWFueVRvT25lKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlTWFueVRvT25lQW5ub3RhdGlvbigoTWFueVRvT25lKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUNvbHVtbkFubm90YXRpb24oQ29sdW1uIGNvbHVtbiwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoIWNvbHVtbi5udWxsYWJsZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nDQotICAgICAgICAgICAgICAgICYmIGNvbHVtbi5sZW5ndGgoKSA8ICgoU3RyaW5nKSBjb252ZXJ0ZWRPYmplY3QpLmxlbmd0aCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uID0gVkFMSURBVEVfTEVOR1RIOw0KLSAgICAgICAgICAgIHRoaXMubWF4TGVuZ3RoID0gY29sdW1uLmxlbmd0aCgpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNZXNzYWdlKG51bGwpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVCYXNpY0Fubm90YXRpb24oQmFzaWMgYmFzaWMsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKCFiYXNpYy5vcHRpb25hbCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVPbmVUb09uZUFubm90YXRpb24oT25lVG9PbmUgb25lVG9PbmUsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmICghb25lVG9PbmUub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTWFueVRvT25lQW5ub3RhdGlvbihNYW55VG9PbmUgbWFueVRvT25lLCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIW1hbnlUb09uZS5vcHRpb25hbCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9EbyhQcmlvcml0eS5NRURJVU0pDQotICAgIHByaXZhdGUgdm9pZCBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCA9PSBudWxsIHx8ICgiIi5lcXVhbHMoY29udmVydGVkT2JqZWN0KSAmJiBFeHRWYWxVdGlscy5pbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbiA9IENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRDsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24oZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNZXNzYWdlKG51bGwpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChWQUxJREFURV9MRU5HVEguZXF1YWxzKHRoaXMudmlvbGF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gImZpZWxkX3Rvb19sb25nIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gImZpZWxkX3JlcXVpcmVkIjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24pOw0KLQ0KLSAgICAgICAgaWYgKFZBTElEQVRFX0xFTkdUSC5lcXVhbHModGhpcy52aW9sYXRpb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLnJlcGxhY2UoInswfSIsICIiICsgdGhpcy5tYXhMZW5ndGgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gZS5nZXRGYWNlc01lc3NhZ2UoKTsNCi0NCi0gICAgICAgIGlmKHRoaXMudXNlRmFjZXNCdW5kbGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoVkFMSURBVEVfTEVOR1RILmVxdWFscyh0aGlzLnZpb2xhdGlvbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5yZXBsYWNlV2l0aERlZmF1bHRNYXhpbXVtTWVzc2FnZShmYWNlc01lc3NhZ2UsIHRoaXMubWF4TGVuZ3RoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKGZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIGUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xlbmd0aFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZDA1NTguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xlbmd0aFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExlbmd0aFN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIExlbmd0aCBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMZW5ndGguY2xhc3MpOw0KLSAgICAgICAgTGVuZ3RoVmFsaWRhdG9yIGxlbmd0aFZhbGlkYXRvciA9IChMZW5ndGhWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoImphdmF4LmZhY2VzLkxlbmd0aCIpOw0KLQ0KLSAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1pbmltdW0oYW5ub3RhdGlvbi5taW5pbXVtKCkpOw0KLSAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1heGltdW0oYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTG9uZ1JhbmdlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM1ODIwMi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTG9uZ1JhbmdlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxvbmdSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkxvbmdSYW5nZVZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTG9uZ1JhbmdlU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLQ0KLSAgICAgICAgTG9uZ1JhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKExvbmdSYW5nZS5jbGFzcyk7DQotICAgICAgICBMb25nUmFuZ2VWYWxpZGF0b3IgbG9uZ1JhbmdlVmFsaWRhdG9yID0gKExvbmdSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5Mb25nUmFuZ2UiKTsNCi0NCi0gICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9QYXR0ZXJuU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9QYXR0ZXJuU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEzZjRlZi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUGF0dGVyblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5QYXR0ZXJuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQYXR0ZXJuU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k8UGF0dGVybj4NCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFBhdHRlcm4gYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoUGF0dGVybi5jbGFzcyk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBleHByZXNzaW9uIDogYW5ub3RhdGlvbi52YWx1ZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4uY29tcGlsZShleHByZXNzaW9uKS5tYXRjaGVyKGNvbnZlcnRlZE9iamVjdC50b1N0cmluZygpKS5tYXRjaGVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG5ldyBGYWNlc01lc3NhZ2UoDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiksDQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24pLnJlcGxhY2UoInswfSIsIGV4cHJlc3Npb24pKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KFBhdHRlcm4gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZXF1aXJlZFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOWU0YzcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5leGNlcHRpb24uUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFJlcXVpcmVkU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k8UmVxdWlyZWQ+DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRmFjZXNCdW5kbGUgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCA9PSBudWxsIHx8IGNvbnZlcnRlZE9iamVjdC5lcXVhbHMoIiIpIHx8DQotICAgICAgICAgICAgICAgIChjb252ZXJ0ZWRPYmplY3QgaW5zdGFuY2VvZiBDb2xsZWN0aW9uICYmICgoQ29sbGVjdGlvbiljb252ZXJ0ZWRPYmplY3QpLmlzRW1wdHkoKSkgfHwNCi0gICAgICAgICAgICAgICAgKGNvbnZlcnRlZE9iamVjdCBpbnN0YW5jZW9mIE1hcCAmJiAoKE1hcCljb252ZXJ0ZWRPYmplY3QpLmlzRW1wdHkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNZXNzYWdlKG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoUmVxdWlyZWQuY2xhc3MpKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoUmVxdWlyZWQgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHN1cGVyLnJlc29sdmVNZXNzYWdlKGtleSk7DQotICAgICAgICBTdHJpbmcgbWFya2VyID0gQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVI7DQotDQotICAgICAgICBpZigobWFya2VyICsga2V5ICsgbWFya2VyKS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnVzZUZhY2VzQnVuZGxlID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIGUpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMudXNlRmFjZXNCdW5kbGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKGUuZ2V0RmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIGUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvU2tpcFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGYwZDhlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLk51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ATnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1ARW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgU2tpcFZhbGlkYXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBTdHJpbmdbXSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9ucyA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoU2tpcFZhbGlkYXRpb24uY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBmb3IoU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gOiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihCb29sZWFuLlRSVUUuZXF1YWxzKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0VmFsdWVPZkV4cHJlc3Npb24oDQotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbikpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1ldGFEYXRhRW50cnkuc2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCB0cnVlKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9WYWxpZGF0b3JTdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiM2NjOTEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFZhbGlkYXRvclN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yPltdIHZhbGlkYXRvckNsYXNzZXMgPQ0KLSAgICAgICAgICAgIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoVmFsaWRhdG9yLmNsYXNzKS52YWx1ZSgpOw0KLQ0KLSAgICAgICAgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvciB2YWxpZGF0b3I7DQotICAgICAgICBmb3IgKENsYXNzIHZhbGlkYXRvckNsYXNzTmFtZSA6IHZhbGlkYXRvckNsYXNzZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdG9yID0gKGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3IpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgIC50cnlUb0luc3RhbnRpYXRlQ2xhc3ModmFsaWRhdG9yQ2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAodmFsaWRhdG9yID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHZhbGlkYXRvckNsYXNzTmFtZS5nZXROYW1lKCkgKyAiIG5vdCBmb3VuZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjZhYzYwLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneS5BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjZXNFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIFRoaXMgcGhhc2UgbGlzdGVuZXIgcHJvY2Vzc2VzIGNyb3NzIHZhbGlkYXRpb24gYXMgc29vbiBhcyBpdCBmaW5kcyBhIHNwZWNpYWwgcmVxdWVzdCBzY29wZWQgc3RvcmFnZS48YnIvPg0KLSAqIFNvIGl0J3MgcG9zc2libGUgdG8gYWRkIGluZm9ybWF0aW9uIGR1cmluZyB0aGUgcHJvY2VzcyB2YWxpZGF0aW9uIHBoYXNlLiBBdCB0aGUgZW5kIG9mIHRoaXMgcGhhc2UgaXQgZ2V0cyBwcm9jZXNzZWQuDQotICogQWZ0ZXIgdGhhdCB0aGUgc3RvcmFnZSBnZXRzIHJlc2V0ZWQuPHAvPg0KLSAqIElmIHlvdSBwcm92aWRlIGEgY3VzdG9tIGV4dGVuc2lvbiBhbmQgeW91IGFkZCB0aGUgc2FtZSBzdG9yYWdlIHR5cGUgd2l0aGluIGEgZGlmZmVyZW50IHBoYXNlLA0KLSAqIGl0IGFsc28gZ2V0cyBwcm9jZXNzZWQgYXQgdGhlIGVuZCBvZiB0aGF0IHBoYXNlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lciBpbXBsZW1lbnRzIFBoYXNlTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MzMzNDA1ODk3NjM1NzQyNzMyTDsNCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UgPSBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCk7DQotICAgICAgICAgICAgZm9yIChDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkgOiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoIUV4dFZhbFV0aWxzLmV4ZWN1dGVHbG9iYWxCZWZvcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldENvbXBvbmVudCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmNsYXNzLmdldE5hbWUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcykpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAvL2NhbGwgaW5pdC1tZXRob2QNCi0gICAgICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpIGluc3RhbmNlb2YgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5nZXRDbGFzcygpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluaXRDcm9zc1ZhbGlkYXRpb24iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgICAgICAgICAqIHZhbGlkYXRpb24NCi0gICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkucHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbihlbnRyeSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWRkTWVzc2FnZSA9IHRydWU7DQotDQotICAgICAgICAgICAgICAgICAgICBpZihlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKSBpbnN0YW5jZW9mIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRNZXNzYWdlID0gKEJvb2xlYW4pUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkuZ2V0Q2xhc3MoKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmNsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uLmdldENsYXNzKCkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbik7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGYWNlc0V4Y2VwdGlvbihlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBpZihhZGRNZXNzYWdlKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhY2VzTWVzc2FnZSAhPSBudWxsICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgJiYgZmFjZXNNZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb0FkZFZpb2xhdGlvbk1lc3NhZ2VGb3JDb21wb25lbnRJZChlbnRyeS5nZXRDbGllbnRJZCgpLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnRJZChlbnRyeS5nZXRDbGllbnRJZCgpLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRDb21wb25lbnQoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5jbGFzcy5nZXROYW1lKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluYWxseQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLnJlc2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNJbml0aWFsaXplZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OICE9IG51bGwNCi0gICAgICAgICAgICAgICAgICAgICYmIFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NST1NTVkFMSURBVElPTi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBKc2ZVdGlscy5kZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcih0aGlzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5BTllfUEhBU0U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKHRoaXMgPT0gbykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBDcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzQwMjc5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcm4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04iKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJcy5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDRkMmE0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIERhdGVJcw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWVPZigpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBvcHRpb25hbCBzZWN0aW9uDQotICAgICAqLw0KLQ0KLSAgICBEYXRlSXNUeXBlIHR5cGUoKSBkZWZhdWx0IERhdGVJc1R5cGUuc2FtZTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgIiI7DQotDQotICAgIFN0cmluZyBub3RCZWZvcmVFcnJvck1zZ0tleSgpIGRlZmF1bHQgIndyb25nX2RhdGVfbm90X2JlZm9yZSI7DQotDQotICAgIFN0cmluZyBub3RBZnRlckVycm9yTXNnS2V5KCkgZGVmYXVsdCAid3JvbmdfZGF0ZV9ub3RfYWZ0ZXIiOw0KLQ0KLSAgICBTdHJpbmcgbm90RXF1YWxFcnJvck1zZ0tleSgpIGRlZmF1bHQgIndyb25nX2RhdGVfbm90X2VxdWFsIjsNCi0NCi0gICAgaW50IGVycm9yTWVzc2FnZURhdGVTdHlsZSgpIGRlZmF1bHQgRGF0ZUZvcm1hdC5NRURJVU07DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzVHlwZS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJc1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1ZjQ4Mi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYmVmb3JlT3JTYW1lLCBhZnRlck9yU2FtZSIpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGVudW0gRGF0ZUlzVHlwZQ0KLXsNCi0gICAgYmVmb3JlLCBhZnRlciwgc2FtZQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZTc2YjcuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0VxdWFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBFcXVhbHMNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJkdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQiOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL05vdEVxdWFscy5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL05vdEVxdWFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjdiYzQ0Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9Ob3RFcXVhbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgTm90RXF1YWxzDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZSgpOw0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZHVwbGljYXRlZF9jb250ZW50X2RlbmllZCI7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ1ZGIyNC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBSZXF1aXJlZElmDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZU9mKCk7DQotDQotICAgIC8qDQotICAgICAqIG9wdGlvbmFsIHNlY3Rpb24NCi0gICAgICovDQotDQotICAgIFJlcXVpcmVkSWZUeXBlIGlzKCkgZGVmYXVsdCBSZXF1aXJlZElmVHlwZS5ub3RfZW1wdHk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJlbXB0eV9maWVsZCI7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZlR5cGUuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWM1OGQ5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgZW51bSBSZXF1aXJlZElmVHlwZQ0KLXsNCi0gICAgZW1wdHksIG5vdF9lbXB0eQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjYwNzU5Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1JbnB1dCBpcyBkaWZmZXJlbnQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUlucHV0IGlzIGRpZmZlcmVudA0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotDQotd3JvbmdfZGF0ZT1Xcm9uZyBkYXRlDQotd3JvbmdfZGF0ZV9kZXRhaWw9V3JvbmcgZGF0ZQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZmOTNjNC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9XHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0IFx1MDY0NVx1MDYyZVx1MDYyYVx1MDY0NFx1MDY0MQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0IFx1MDY0NVx1MDYyZVx1MDYyYVx1MDY0NFx1MDY0MQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9XHUwNjNhXHUwNjRhXHUwNjMxIFx1MDY0NVx1MDYzM1x1MDY0NVx1MDY0OFx1MDYyZCBcdTA2MjhcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgXHUwNjQ2IFx1MDY0MVx1MDYzMyBcdTA2NDJcdTA2NGFcdTA2NDVcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0DQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9XHUwNjNhXHUwNjRhXHUwNjMxIFx1MDY0NVx1MDYzM1x1MDY0NVx1MDY0OFx1MDYyZCBcdTA2MjhcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgIFx1MDY0Nlx1MDY0MVx1MDYzMyBcdTA2NDJcdTA2NGFcdTA2NDVcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0DQotDQotd3JvbmdfZGF0ZT1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjJlXHUwNjI3XHUwNjM3XHUwNjQ5XHUwNjIxDQotd3JvbmdfZGF0ZV9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDYyZVx1MDYyN1x1MDYzN1x1MDY0OVx1MDYyMQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDNcdTA2NDggXHUwNjQ2IFx1MDYyOFx1MDYzOVx1MDYyZiB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0MyBcdTA2NDhcdTA2NDYgXHUwNjI4XHUwNjM5XHUwNjJmIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0M1x1MDY0OCBcdTA2NDYgXHUwNjQyXHUwNjI4XHUwNjQ0IHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDMgXHUwNjQ4XHUwNjQ2IFx1MDY0Mlx1MDYyOFx1MDY0NCB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjQ0XHUwNjI3IFx1MDY0YVx1MDYzM1x1MDYyN1x1MDY0OFx1MDY0OSB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0NFx1MDYyNyBcdTA2NGFcdTA2MzNcdTA2MjdcdTA2NDhcdTA2NDkgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1NGVkMi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPWVsIHZhbG9yIFx1MDBlOSBkaWZlcmVudAotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1lbCB2YWxvciBcdTAwZTkgZGlmZXJlbnQKLQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1ubyBlcyBwZXJtZXQgZWwgbWF0ZWl4IHZhbG9yCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1ubyBlcyBwZXJtZXQgZWwgbWF0ZWl4IHZhbG9yCi0KLXdyb25nX2RhdGU9ZGF0YSBlcnJcdTAwZjJuaWEKLXdyb25nX2RhdGVfZGV0YWlsPWRhdGEgZXJyXHUwMGYybmlhCi0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1sYSBkYXRhIGhhIGRlIHNlciBwb3N0ZXJpb3IgYSB7MH0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9bGEgZGF0YSBoYSBkZSBzZXIgcG9zdGVyaW9yIGEgezB9Ci0KLXdyb25nX2RhdGVfbm90X2FmdGVyPWxhIGRhdGEgaGEgZGUgc2VyIGFudGVyaW9yIGEgezB9Ci13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9bGEgZGF0YSBoYSBkZSBzZXIgcG9zdGVyaW9yIGEgezB9Ci0KLXdyb25nX2RhdGVfbm90X2VxdWFsPWxhIGRhdGEgbm8gXHUwMDBlOXMgaWd1YWwgYSB7MH0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1sYSBkYXRhIG5vIFx1MDAwZTlzIGlndWFsIGEgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4NzIzNC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9RWluZ2FiZSBpc3QgdW50ZXJzY2hpZWRsaWNoDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1FaW5nYWJlIGlzdCB1bnRlcnNjaGllZGxpY2gNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPURlciBnbGVpY2hlIFdlcnQgaXN0IG5pY2h0IGVybGF1YnQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1EZXIgZ2xlaWNoZSBXZXJ0IGlzdCBuaWNodCBlcmxhdWJ0DQotDQotd3JvbmdfZGF0ZT1EYXR1bSBpbmtvcnJla3QNCi13cm9uZ19kYXRlX2RldGFpbD1EYXR1bSBpbmtvcnJla3QNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9RGFzIERhdHVtIG11c3MgbmFjaCBkZW0gezB9IHNlaW4NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPURhcyBEYXR1bSBtdXNzIG5hY2ggZGVtIHswfSBzZWluDQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9RGFzIERhdHVtIG11c3Mgdm9yIGRlbSB7MH0gc2Vpbg0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1EYXMgRGF0dW0gbXVzcyB2b3IgZGVtIHswfSBzZWluDQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9RGFzIERhdHVtIGVudHNwcmljaHQgbmljaHQgZGVtIHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1EYXMgRGF0dW0gZW50c3ByaWNodCBuaWNodCBkZW0gezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2MDc1OS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9SW5wdXQgaXMgZGlmZmVyZW50DQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1JbnB1dCBpcyBkaWZmZXJlbnQNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLQ0KLXdyb25nX2RhdGU9V3JvbmcgZGF0ZQ0KLXdyb25nX2RhdGVfZGV0YWlsPVdyb25nIGRhdGUNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTkxNzAuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPWxhIGVudHJhZGEgZXMgZGlmZXJlbnRlDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1sYSBlbnRyYWRhIGVzIGRpZmVyZW50ZQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9bm8gc2UgcGVybWl0ZW4gZW50cmFkYXMgaWd1YWxlcw0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPW5vIHNlIHBlcm1pdGVuIGVudHJhZGFzIGlndWFsZXMNCi0NCi13cm9uZ19kYXRlPWZlY2hhIGVxdWl2b2NhZGENCi13cm9uZ19kYXRlX2RldGFpbD1mZWNoYSBlcXVpdm9jYWRhDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgbHVlZ28gZGUgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGx1ZWdvIGRlIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgYW50ZXMgZGUgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgYW50ZXMgZGUgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9bGEgZmVjaGEgbm8gZXMgaWd1YWwgYSB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9bGEgZmVjaGEgbm8gZXMgaWd1YWwgYSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcyBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWYwMjE4Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1MZXMgY2hhbXBzIHNvbnQgZGlmZiZlYWN1dGU7cmVudHMNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUxlcyBjaGFtcHMgc29udCBkaWZmJmVhY3V0ZTtyZW50cw0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9TGVzIGNoYW1wcyBkb2l2ZW50ICZlY2lyYzt0cmUgZGlmZiZlYWN1dGU7cmVudHMNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1MZXMgY2hhbXBzIGRvaXZlbnQgJmVjaXJjO3RyZSBkaWZmJmVhY3V0ZTtyZW50cw0KLQ0KLXdyb25nX2RhdGU9TGEgZGF0ZSBlc3QgaW5jb3JyZWN0ZQ0KLXdyb25nX2RhdGVfZGV0YWlsPUxhIGRhdGUgZXN0IGluY29ycmVjdGUNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXByJmVncmF2ZTtzIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXByJmVncmF2ZTtzIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGF2YW50IHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhdmFudCB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1MYSBkYXRlIG4nZXN0IHBhcyAmZWFjdXRlO2dhbGUgJmFncmF2ZTsgezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPUxhIGRhdGUgbidlc3QgcGFzICZlYWN1dGU7Z2FsZSAmYWdyYXZlOyB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcyBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDQyODAxLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9VmFsb3JpIG5vbiB1Z3VhbGkKLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9SSB2YWxvcmkgaW5zZXJpdGkgbm9uIGNvaW5jaWRvbm8KLQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1MbyBzdGVzc28gdmFsb3JlIG5vbiAmZWdyYXZlOyBwZXJtZXNzbwotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9TG8gc3Rlc3NvIHZhbG9yZSBub24gJmVncmF2ZTsgcGVybWVzc28KLQotd3JvbmdfZGF0ZT1EYXRhIGVycmF0YQotd3JvbmdfZGF0ZV9kZXRhaWw9RGF0YSBlcnJhdGEKLQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPUxhIGRhdGEgZGV2ZSBlc3NlcmUgZG9wbyBkaSB7MH0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9TGEgZGF0YSBkZXZlIGVzc2VyZSBkb3BvIGRpIHswfQotCi13cm9uZ19kYXRlX25vdF9hZnRlcj1MYSBkYXRhIGRldmUgZXNzZXJlIHByaW1hIGRpIHswfQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPUxhIGRhdGEgZGV2ZSBlc3NlcmUgcHJpbWEgZGkgezB9Ci0KLXdyb25nX2RhdGVfbm90X2VxdWFsPUxhIGRhdGEgbm9uICZlZ3JhdmU7IHVndWFsZSBhIHswfQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPUxhIGRhdGEgbm9uICZlZ3JhdmU7IHVndWFsZSBhIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZjZhOWQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPWdpcmlsZW4gZGVcdTAxMWZlciBmYXJrbFx1MDEzMQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9Z2lyaWxlbiBkZVx1MDExZmVyIGZhcmtsXHUwMTMxDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1heW5cdTAxMzEgZGVcdTAxMWZlciBnaXJpbGVtZXoNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1heW5cdTAxMzEgZGVcdTAxMWZlciBnaXJpbGVtZXoNCi0NCi13cm9uZ19kYXRlPXlhbmxcdTAxMzFcdTAxNWYgdGFyaWgNCi13cm9uZ19kYXRlX2RldGFpbD15YW5sXHUwMTMxXHUwMTVmIHRhcmloDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gc29ucmEgb2xtYWxcdTAxMzFkXHUwMTMxcg0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBzb25yYSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBcdTAwZjZuY2Ugb2xtYWxcdTAxMzFkXHUwMTMxcg0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIFx1MDBmNm5jZSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmUgZVx1MDE1Zml0IGRlXHUwMTFmaWwNCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmUgZVx1MDE1Zml0IGRlXHUwMTFmaWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q3NjU5ZS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotICAgICAgICBleHRlbmRzDQotICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZiAoYmFzZU5hbWUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBiYXNlTmFtZSA9IHN1cGVyLmdldEJhc2VOYW1lKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gYmFzZU5hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWNvcmRlci9Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWNvcmRlci9Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNiMDhkLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcmVjb3JkZXIvQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5yZWNvcmRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXIuUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyIGltcGxlbWVudHMgUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcg0KLXsNCi0gICAgcHVibGljIHZvaWQgcmVjb3JkVXNlcklucHV0KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgdmFsdWUpDQotICAgIHsNCi0gICAgICAgIGlmICghKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy90byBzdXBwb3J0IGxvY2FsIGNyb3NzLXZhbGlkYXRpb24gKHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkpDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlID0gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMNCi0gICAgICAgICAgICAuZ2V0T3JJbml0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlKCk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSBlbnRyeTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPQ0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgaWYocHJvcGVydHlEZXRhaWxzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBlbnRyeSA9IG5ldyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSgpOw0KLSAgICAgICAgZW50cnkuc2V0QmVhbihwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpKTsNCi0gICAgICAgIGVudHJ5LnNldENvbnZlcnRlZFZhbHVlKHZhbHVlKTsNCi0gICAgICAgIGVudHJ5LnNldENvbXBvbmVudCh1aUNvbXBvbmVudCk7DQotICAgICAgICBlbnRyeS5zZXRDbGllbnRJZCh1aUNvbXBvbmVudC5nZXRDbGllbnRJZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpKTsNCi0NCi0gICAgICAgIFN0cmluZyBrZXkgPSBwcm9wZXJ0eURldGFpbHMuZ2V0S2V5KCk7DQotDQotICAgICAgICAvL2ZvciBsb2NhbCBjcm9zcy12YWxpZGF0aW9uDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNvbnRhaW5zRW50cnkoa2V5KSAmJg0KLSAgICAgICAgICAgIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5nZXRFbnRyeShrZXkpLmdldEJlYW4oKSAhPSBudWxsICYmDQotICAgICAgICAgICAgIXByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5nZXRFbnRyeShrZXkpLmdldEJlYW4oKS5lcXVhbHMoZW50cnkuZ2V0QmVhbigpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2ZvciB0aGUgdmFsaWRhdGlvbiB3aXRoaW4gYSBjb21wbGV4IGNvbXBvbmVudCBlLmcuIGEgdGFibGUNCi0gICAgICAgICAgICAvL2Rvbid0IG92ZXJyaWRlIGV4aXN0aW5nIGV4cHJlc3Npb24gKHN0eWxlOiAje2VudHJ5LnByb3BlcnR5fSkgLSBtYWtlIGEgc3BlY2lhbCBtYXBwaW5nDQotDQotICAgICAgICAgICAgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4gZnVydGhlckVudHJpZXMgPQ0KLSAgICAgICAgICAgICAgICBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkoa2V5KS5nZXRGdXJ0aGVyRW50cmllcygpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmdXJ0aGVyRW50cmllcyA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZnVydGhlckVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5PigpOw0KLQ0KLSAgICAgICAgICAgICAgICBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkoa2V5KS5zZXRGdXJ0aGVyRW50cmllcyhmdXJ0aGVyRW50cmllcyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZ1cnRoZXJFbnRyaWVzLmFkZChlbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9mb3Igbm9ybWFsIHZhbGlkYXRpb24NCi0gICAgICAgICAgICBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2Uuc2V0RW50cnkoa2V5LCBlbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOWZhZDYuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIG5vcm1hbGx5IGl0IHNob3VsZCBiZSBpbiB0aGUgc3RvcmFnZSBwYWNrYWdlIC0gZHVlIHRvIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaXQgaXNuJ3QgdGhlIGNhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBhZGQoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5KTsNCi0NCi0gICAgTGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+IGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKCk7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5ZTFlNy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5LkNyb3NzVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi0NCi0vKioNCi0gKiBub3JtYWxseSBpdCBzaG91bGQgYmUgaW4gdGhlIHN0b3JhZ2UgcGFja2FnZSAtIGR1ZSB0byBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGl0IGlzbid0IHRoZSBjYXNlDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeQ0KLXsNCi0gICAgcHJpdmF0ZSBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnk7DQotICAgIC8vZm9yIGNvbXBsZXggY29tcG9uZW50cyAoZS5nLiBhIHRhYmxlKSBzdG9yZXMgdGhlIG9iamVjdCBvZiBlbnRyeSAoI3tlbnRyeS5wcm9wZXJ0eX0pDQotICAgIHByaXZhdGUgVUlDb21wb25lbnQgY29tcG9uZW50Ow0KLSAgICBwcml2YXRlIE9iamVjdCBjb252ZXJ0ZWRPYmplY3Q7DQotICAgIHByaXZhdGUgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAvL2p1c3QgZm9yIGlucHV0IGNvbXBvbmVudHMgd2l0aGluIGNvbXBsZXggY29tcG9uZW50cyBlLmcuIGRhdGFUYWJsZSwuLi4NCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50SWQ7DQotDQotICAgIHB1YmxpYyBNZXRhRGF0YUVudHJ5IGdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFFbnRyeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YUVudHJ5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YUVudHJ5ID0gbWV0YURhdGFFbnRyeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVUlDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnQoVUlDb21wb25lbnQgY29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldENvbnZlcnRlZE9iamVjdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkT2JqZWN0KE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29udmVydGVkT2JqZWN0ID0gY29udmVydGVkT2JqZWN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25TdHJhdGVneShDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsaWRhdGlvblN0cmF0ZWd5ID0gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY2xpZW50SWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50SWQoU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNsaWVudElkID0gY2xpZW50SWQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUxMGEzYi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGltcGxlbWVudHMgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMgPQ0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZChDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMuYWRkKGVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+IGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcykNCi0gICAgew0KLSAgICAgICAgdGhpcy5jcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA0MWM5NWQuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBjcm9zcy12YWxpZGF0aW9uIGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXINCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZT4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICAvL2ZvciBiZXR0ZXIgYmFja3dhcmQgY29tcGF0aWJpbGl0eQ0KLSAgICAgICAgcmV0dXJuIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjhlMTg3Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIGltcGxlbWVudHMgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlDQotew0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5PiBwcm9jZXNzZWRJbmZvcm1hdGlvbk1hcCA9DQotICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnRyeShTdHJpbmcga2V5LCBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9jZXNzZWRJbmZvcm1hdGlvbk1hcC5wdXQoa2V5LCBlbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNFbnRyeShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvY2Vzc2VkSW5mb3JtYXRpb25NYXAuY29udGFpbnNLZXkoa2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgZ2V0RW50cnkoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uTWFwLmdldChrZXkpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MTgyYzguLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBwcm9jZXNzZWQgaW5mb3JtYXRpb24gZW50cmllcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyDQotICAgIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPENyb3NzVmFsaWRhdGlvblN0b3JhZ2U+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgLy9mb3IgYmV0dGVyIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkNCi0gICAgICAgIHJldHVybiBDcm9zc1ZhbGlkYXRpb25VdGlscy5jbGFzcy5nZXROYW1lKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGIxNTZlLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlDQotew0KLSAgICB2b2lkIHNldEVudHJ5KFN0cmluZyBrZXksIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5KTsNCi0NCi0gICAgYm9vbGVhbiBjb250YWluc0VudHJ5KFN0cmluZyBrZXkpOw0KLQ0KLSAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSBnZXRFbnRyeShTdHJpbmcga2V5KTsNCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmNzg5Yy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogSW4gb3JkZXIgdG8gYnVpbGQgdXAgYSBtYXBwaW5nIHdoaWNoIGlzIHVzZWQgZm9yIGNyb3NzLXZhbGlkYXRpb24uCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeQotewotICAgIHByaXZhdGUgT2JqZWN0IGJlYW47Ci0gICAgcHJpdmF0ZSBPYmplY3QgY29udmVydGVkVmFsdWU7Ci0gICAgcHJpdmF0ZSBVSUNvbXBvbmVudCBjb21wb25lbnQ7Ci0gICAgLy9mb3IgY29tcGxleCBjb21wb25lbnRzIChlLmcuIGEgdGFibGUgdGhlcmUgYXJlIG11bHRpcGxlIGVudHJpZXMgd2l0aAotICAgIC8vdGhlIHNhbWUga2V5IChoZXJlIHRoZSBlbCBleHByZXNzaW9uICN7ZW50cnkucHJvcGVydHl9KQotICAgIC8vaG93ZXZlciwgZG9uJ3Qgb3ZlcnJpZGUgdGhlIHByZXZpb3VzIGVudHJ5IC0gdGhleSBhcm4ndCB0aGUgc2FtZTsKLSAgICBwcml2YXRlIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk+IGZ1cnRoZXJFbnRyaWVzOwotICAgIC8vanVzdCBmb3IgaW5wdXQgY29tcG9uZW50cyB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzIGUuZy4gZGF0YVRhYmxlLC4uLgotICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudElkOwotCi0gICAgLyoKLSAgICAgKiBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmVhbihPYmplY3QgYmVhbikKLSAgICB7Ci0gICAgICAgIHRoaXMuYmVhbiA9IGJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkVmFsdWUoT2JqZWN0IGNvbnZlcnRlZFZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy5jb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBVSUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnQoVUlDb21wb25lbnQgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gY2xpZW50SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50SWQoU3RyaW5nIGNsaWVudElkKQotICAgIHsKLSAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5PiBnZXRGdXJ0aGVyRW50cmllcygpCi0gICAgewotICAgICAgICByZXR1cm4gZnVydGhlckVudHJpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RnVydGhlckVudHJpZXMoTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4gZnVydGhlckVudHJpZXMpCi0gICAgewotICAgICAgICB0aGlzLmZ1cnRoZXJFbnRyaWVzID0gZnVydGhlckVudHJpZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL21hcHBlci9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL21hcHBlci9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGViZjNiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigyMDApDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoa2V5KSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL21hcHBlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NzUzMDMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL21hcHBlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoa2V5KSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzAyMDJiLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3k8QSBleHRlbmRzIEFubm90YXRpb24+IGV4dGVuZHMgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBMaXN0PFJlZmVyZW5jaW5nU3RyYXRlZ3k+IHJlZmVyZW5jaW5nU3RyYXRlZ2llczsNCi0gICAgcHJvdGVjdGVkIE1hcDxPYmplY3QsIE9iamVjdD4gdmlvbGF0aW9uUmVzdWx0U3RvcmFnZSA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOw0KLQ0KLSAgICBwdWJsaWMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICBpbml0UmVmZXJlbmNpbmdTdHJhdGVnaWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFJlZmVyZW5jaW5nU3RyYXRlZ2llcygpDQotICAgIHsNCi0gICAgICAgIGlmIChyZWZlcmVuY2luZ1N0cmF0ZWdpZXMgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMgPSBuZXcgQXJyYXlMaXN0PFJlZmVyZW5jaW5nU3RyYXRlZ3k+KCk7DQotDQotICAgICAgICAgICAgU3RyaW5nIGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3lDbGFzc05hbWUgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkJBU0VfUEFDS0FHRSkgKyAiUmVmZXJlbmNpbmdTdHJhdGVneSI7DQotDQotICAgICAgICAgICAgUmVmZXJlbmNpbmdTdHJhdGVneSBjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5ID0gKFJlZmVyZW5jaW5nU3RyYXRlZ3kpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgIC50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3lDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBFTENvbXBhcmVTdHJhdGVneSgpKTsNCi0gICAgICAgICAgICAvL3JlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IEFsaWFzQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IExvY2FsQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IExvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlKSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vaW5pdENyb3NzVmFsaWRhdGlvbiBpcyBkb25lIGluIHRoZSBDcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyDQotDQotICAgICAgICBTdHJpbmdbXSB2YWxpZGF0aW9uVGFyZ2V0cyA9IGdldFZhbGlkYXRpb25UYXJnZXRzKChBKQ0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0IDogdmFsaWRhdGlvblRhcmdldHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCA9IHZhbGlkYXRpb25UYXJnZXQudHJpbSgpOw0KLQ0KLSAgICAgICAgICAgIC8vc2VsZWN0IHZhbGlkYXRpb24gbWV0aG9kDQotICAgICAgICAgICAgdHJ5VG9WYWxpZGF0ZShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsIHZhbGlkYXRpb25UYXJnZXQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBmb3IgKFJlZmVyZW5jaW5nU3RyYXRlZ3kgcmVmZXJlbmNpbmdTdHJhdGVneSA6IHJlZmVyZW5jaW5nU3RyYXRlZ2llcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAocmVmZXJlbmNpbmdTdHJhdGVneS5ldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLCB2YWxpZGF0aW9uVGFyZ2V0LCB0aGlzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlRocm93YWJsZUluc3RhbmNlTmV2ZXJUaHJvd24ifSkNCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlLA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWhhbmRsZVRhcmdldFZpb2xhdGlvbihlbnRyeU9mU291cmNlLCBlbnRyeU9mVGFyZ2V0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL25vIHRhcmdldCAtIGJlY2F1c2UgdGhlcmUgaXMgbm8gdGFyZ2V0IGNvbXBvbmVudCAtIHZhbHVlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbW9kZWwNCi0gICAgICAgICAgICBpZihlbnRyeU9mVGFyZ2V0ID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzVGFyZ2V0Q29tcG9uZW50QXNTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihlbnRyeU9mU291cmNlKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICAvL2dldCB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgdGFyZ2V0IGNvbXBvbmVudA0KLSAgICAgICAgU3RyaW5nIHN1bW1hcnkgPSBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCksIHRydWUpOw0KLSAgICAgICAgU3RyaW5nIGRldGFpbHMgPSBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSwgdHJ1ZSk7DQotDQotICAgICAgICAvL3ZhbGlkYXRpb24gdGFyZ2V0IGlzbid0IGJvdW5kIHRvIGEgY29tcG9uZW50IHdpdGhpbmcgdGhlIGN1cnJlbnQgcGFnZSANCi0gICAgICAgIC8vKHNlZSB2YWxpZGF0ZUZvdW5kRW50cnksIHRyeVRvVmFsaWRhdGVMb2NhbGx5IGFuZCB0cnlUb1ZhbGlkYXRlQmluZGluZ09ubHkpDQotICAgICAgICBpZiAoZW50cnlPZlRhcmdldCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGVudHJ5T2ZUYXJnZXQgPSBlbnRyeU9mU291cmNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlIG1lc3NhZ2U7DQotICAgICAgICBpZiAoZW50cnlPZlRhcmdldC5nZXRNZXRhRGF0YUVudHJ5KCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXNzYWdlID0gZ2V0VGFyZ2V0Q29tcG9uZW50RXJyb3JNZXNzYWdlKChBKWVudHJ5T2ZUYXJnZXQuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCksIHN1bW1hcnksIGRldGFpbHMpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vVE9ETyBkb2N1bWVudCBwb3NzaWJsZSBzaWRlIGVmZmVjdHMNCi0gICAgICAgICAgICAvL2R1ZSB0byBhIG1pc3NpbmcgdGFyZ2V0IGFubm90YXRpb24gKHNlZTogdHJ5VG9WYWxpZGF0ZUxvY2FsbHkpDQotICAgICAgICAgICAgbWVzc2FnZSA9IGdldFRhcmdldENvbXBvbmVudEVycm9yTWVzc2FnZSgoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpLCBzdW1tYXJ5LCBkZXRhaWxzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICgobWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCB8fCBtZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwpICYmDQotICAgICAgICAgICAgZW50cnlPZlNvdXJjZS5nZXRDbGllbnRJZCgpICE9IG51bGwgJiYgIWVudHJ5T2ZTb3VyY2UuZ2V0Q2xpZW50SWQoKS5lcXVhbHMoZW50cnlPZlRhcmdldC5nZXRDbGllbnRJZCgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uID0gbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihtZXNzYWdlKTsNCi0NCi0gICAgICAgICAgICBib29sZWFuIGlzU291cmNlTWV0YURhdGFVc2VkID0gZmFsc2U7DQotDQotICAgICAgICAgICAgaWYoZW50cnlPZlRhcmdldC5nZXRNZXRhRGF0YUVudHJ5KCkgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByZXBhcmVUYXJnZXRNZXRhRGF0YUZvclNldmVyaXR5QXdhcmVJbnRlcmNlcHRpb24oZW50cnlPZlNvdXJjZSwgZW50cnlPZlRhcmdldCk7DQotICAgICAgICAgICAgICAgIGlzU291cmNlTWV0YURhdGFVc2VkID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgaWYoRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgICAgICBlbnRyeU9mVGFyZ2V0LmdldENvbXBvbmVudCgpLCBlbnRyeU9mVGFyZ2V0LmdldE1ldGFEYXRhRW50cnkoKSwNCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5T2ZUYXJnZXQuZ2V0Q29udmVydGVkT2JqZWN0KCksIHZhbGlkYXRvckV4Y2VwdGlvbiwgdGhpcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb0FkZFZpb2xhdGlvbk1lc3NhZ2VGb3JDb21wb25lbnRJZChlbnRyeU9mVGFyZ2V0LmdldENsaWVudElkKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29udmVydEZhY2VzTWVzc2FnZSh2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYoaXNTb3VyY2VNZXRhRGF0YVVzZWQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXNldFRhcmdldE1ldGFEYXRhKGVudHJ5T2ZUYXJnZXQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJlcGFyZVRhcmdldE1ldGFEYXRhRm9yU2V2ZXJpdHlBd2FyZUludGVyY2VwdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSwgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZUYXJnZXQpDQotICAgIHsNCi0gICAgICAgIGVudHJ5T2ZUYXJnZXQuc2V0TWV0YURhdGFFbnRyeShlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0VGFyZ2V0TWV0YURhdGEoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZUYXJnZXQpDQotICAgIHsNCi0gICAgICAgIGVudHJ5T2ZUYXJnZXQuc2V0TWV0YURhdGFFbnRyeShudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlRocm93YWJsZUluc3RhbmNlTmV2ZXJUaHJvd24ifSkNCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NUYXJnZXRDb21wb25lbnRBc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlKQ0KLSAgICB7DQotICAgICAgICAvL2dldCB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQNCi0gICAgICAgIFN0cmluZyBzdW1tYXJ5ID0gZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkoKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSk7DQotICAgICAgICBTdHJpbmcgZGV0YWlscyA9IGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwoKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSk7DQotDQotICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZSA9IGdldFNvdXJjZUNvbXBvbmVudEVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotDQotICAgICAgICBpZiAobWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCB8fCBtZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9UT0RPDQotICAgICAgICAgICAgaWYoRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoZW50cnlPZlNvdXJjZS5nZXRDb21wb25lbnQoKSwNCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLA0KLSAgICAgICAgICAgICAgICAgICAgZW50cnlPZlNvdXJjZS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgICAgIG5ldyBWYWxpZGF0b3JFeGNlcHRpb24obWVzc2FnZSksDQotICAgICAgICAgICAgICAgICAgICB0aGlzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvVGhyb3dWYWxpZGF0b3JFeGNlcHRpb25Gb3JDb21wb25lbnQoZW50cnlPZlNvdXJjZS5nZXRDb21wb25lbnQoKSwgbWVzc2FnZSwgbnVsbCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vVE9ETyBsb2dnaW5nDQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHJvY2Vzc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZiAoaGFuZGxlU291cmNlVmlvbGF0aW9uKGVudHJ5T2ZTb3VyY2UpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZ2V0IHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgICAgICAgIFN0cmluZyBzdW1tYXJ5ID0gZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeSgoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpLCBmYWxzZSk7DQotICAgICAgICAgICAgU3RyaW5nIGRldGFpbHMgPSBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSwgZmFsc2UpOw0KLQ0KLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlID0gZ2V0U291cmNlQ29tcG9uZW50RXJyb3JNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICAoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpLCBzdW1tYXJ5LCBkZXRhaWxzKTsNCi0NCi0gICAgICAgICAgICBpZiAobWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCB8fCBtZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL1RPRE8NCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudChlbnRyeU9mU291cmNlLmdldENvbXBvbmVudCgpLCBtZXNzYWdlLCBudWxsKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvL2p1c3QgdGhyb3cgYSBuZXcgbWVzc2FnZSAtIHRoZSBlcnJvciBtZXNzYWdlIGlzIGF0IHRoZSB0YXJnZXQNCi0gICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvVGhyb3dWYWxpZGF0b3JFeGNlcHRpb25Gb3JDb21wb25lbnQoDQotICAgICAgICAgICAgICAgIGVudHJ5T2ZTb3VyY2UuZ2V0Q29tcG9uZW50KCksIG5ldyBGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLCBudWxsLCBudWxsKSwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEZhY2VzTWVzc2FnZSBnZXRTb3VyY2VDb21wb25lbnRFcnJvck1lc3NhZ2UoQSBhbm5vdGF0aW9uLCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZUZhY2VzTWVzc2FnZShzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBGYWNlc01lc3NhZ2UgZ2V0VGFyZ2V0Q29tcG9uZW50RXJyb3JNZXNzYWdlKEEgZm91bmRBbm5vdGF0aW9uLCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZUZhY2VzTWVzc2FnZShzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShBIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByZXNvbHZlTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChBIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgICAgIHJldHVybiAoa2V5ICE9IG51bGwpID8gcmVzb2x2ZU1lc3NhZ2Uoa2V5ICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgpIDogbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoKEEpYW5ub3RhdGlvbiwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVRhcmdldFZpb2xhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVudHJ5T2ZUYXJnZXQgIT0gbnVsbCAmJiBlbnRyeU9mVGFyZ2V0LmdldENvbXBvbmVudCgpICE9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlU291cmNlVmlvbGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gaGFuZGxlVGFyZ2V0VmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogbm8gdGFyZ2V0IGNvbXBvbmVudCAodmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBtb2RlbCkgLT4gZ2V0IHJldmVyc2UgbWVzc2FnZSBmb3Igc291cmNlIGNvbXBvbmVudA0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeShBIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIC8vaWYgdGhlIG1lc3NhZ2UgaXMgbmV1dHJhbA0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiwgdHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogbm8gdGFyZ2V0IGNvbXBvbmVudCAodmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBtb2RlbCkgLT4gZ2V0IHJldmVyc2UgbWVzc2FnZSBmb3Igc291cmNlIGNvbXBvbmVudA0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsKEEgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgLy9pZiB0aGUgbWVzc2FnZSBpcyBuZXV0cmFsDQotICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24sIHRydWUpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGFic3RyYWN0IG1ldGhvZHMNCi0gICAgICovDQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEEgYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCk7DQotDQotICAgIC8qDQotICAgICAqIGltcGxlbWVudHMgdGhlIHNwZWNpZmljIHZhbGlkYXRpb24gbG9naWMNCi0gICAgICovDQotDQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwgQSBhbm5vdGF0aW9uKTsNCi0NCi0gICAgLyoNCi0gICAgICogcmV0dXJucyB0aGUgcmVmZXJlbmNlZCB2YWxpZGF0aW9uIHRhcmdldHMgb2YgdGhlIGFubm90YXRpb24NCi0gICAgICogZS5nLiBARGF0ZUlzKHR5cGUgPSBEYXRlSXNUeXBlLmJlZm9yZSwgdmFsdWUgPSAiZmluYWxFeGFtIikNCi0gICAgICogLT4gbWV0aG9kIHJldHVybnMgYW4gYXJyYXkgd2l0aCBvbmUgdmFsdWUgKCJmaW5hbEV4YW0iKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEEgYW5ub3RhdGlvbik7DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1Mzc2MTIuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMNCi0gICAgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIC8vaW5pdCBjcm9zcy12YWxpZGF0aW9uDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkgPQ0KLSAgICAgICAgICAgIGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpLmFkZChlbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkgPSBuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KCk7DQotDQotICAgICAgICBlbnRyeS5zZXRNZXRhRGF0YUVudHJ5KG1ldGFEYXRhRW50cnkpOw0KLSAgICAgICAgZW50cnkuc2V0Q29tcG9uZW50KHVpQ29tcG9uZW50KTsNCi0gICAgICAgIGVudHJ5LnNldENsaWVudElkKHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCkpOw0KLSAgICAgICAgZW50cnkuc2V0Q29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICBlbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3kodGhpcyk7DQotDQotICAgICAgICByZXR1cm4gZW50cnk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IGF2YWlsYWJsZSBmb3IgY3Jvc3MgdmFsaWRhdGlvbiAtIHVzZSBwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbiIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldExhYmVsKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vdCBhdmFpbGFibGUgZm9yIGNyb3NzIHZhbGlkYXRpb24iKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgLy9ub3QgYXZhaWxhYmxlIGZvciBjcm9zcyB2YWxpZGF0aW9uIC0gdXNlIGluaXRDcm9zc1ZhbGlkYXRpb24NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q3Jvc3NWYWxpZGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCksDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwgdmFsaWRhdG9yRXhjZXB0aW9uLCB0aGlzKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvbkhlbHBlci5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdkNDc2ZS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSwNCi0gICAgICAgICAgICBib29sZWFuIGlzTW9kZWxBd2FyZVZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChjb21wYXJlU3RyYXRlZ3kuaXNWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCksDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vcHJvY2VzcyBhZnRlciB2aW9sYXRpb24NCi0gICAgICAgICAgICAvL2p1c3QgYWRkIG1lc3NhZ2VzDQotICAgICAgICAgICAgaWYoIWlzTW9kZWxBd2FyZVZhbGlkYXRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzVGFyZ2V0QWZ0ZXJDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NUYXJnZXRBZnRlck1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvL3Rob3cgZXhjZXB0aW9uDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc1RhcmdldEFmdGVyQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgc291cmNlQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSkNCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSA9IG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoKTsNCi0NCi0gICAgICAgIGlmIChjb21wYXJlU3RyYXRlZ3kudXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coc291cmNlQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29tcG9uZW50KHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb21wb25lbnQoKSk7DQotICAgICAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENsaWVudElkKHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDbGllbnRJZCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29tcG9uZW50KHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSk7DQotICAgICAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENsaWVudElkKHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDbGllbnRJZCgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb252ZXJ0ZWRPYmplY3QodmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCkpOw0KLSAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldFZhbGlkYXRpb25TdHJhdGVneShjb21wYXJlU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgLy9hZGQgbWVzc2FnZQ0KLSAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgc291cmNlQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc1RhcmdldEFmdGVyTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgLy9ubyB0YXJnZXQgLSBiZWNhdXNlIHRoZXJlIGlzIG5vIHRhcmdldCBjb21wb25lbnQgLSB2YWx1ZSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1vZGVsDQotICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgbnVsbCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzI3ZGE1Li4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgdm9pZCBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlKQ0KLSAgICAgICAgICAgIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb247DQotfQ0KZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRGF0ZUlzU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRGF0ZUlzU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhZmM4Zi4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0RhdGVJc1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRGF0ZUlzVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0Ow0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGF0ZUlzU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneTxEYXRlSXM+DQotew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUT09fRUFSTFkgPSAiZWFybHkiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUT09fTEFURSA9ICJsYXRlIjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UX0VRVUFMX0RBVEVfVElNRSA9ICJub3QgZXF1YWwiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfS0VZID0gInJlc3VsdCI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBUkVEX1ZBTFVFX0tFWSA9ICJ0YXJnZXQgdmFsdWUiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVZFUlNFX0NPTVBBUkVEX1ZBTFVFX0tFWSA9ICJyZXZlcnNlIHRhcmdldCB2YWx1ZSI7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZygNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICAvL1RPRE8gdGVzdCAmIHJlbW92ZQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlU291cmNlVmlvbGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLCBEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiB2aW9sYXRpb25Gb3VuZDsNCi0NCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnR5cGUoKS5lcXVhbHMoRGF0ZUlzVHlwZS5zYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IG9iamVjdDEgIT0gbnVsbCAmJiAhb2JqZWN0MS5lcXVhbHMob2JqZWN0Mik7DQotDQotICAgICAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVNVTFRfS0VZLCBOT1RfRVFVQUxfREFURV9USU1FKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uLnR5cGUoKS5lcXVhbHMoRGF0ZUlzVHlwZS5iZWZvcmUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsICYmIG9iamVjdDIgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW5ldyBEYXRlKCgoRGF0ZSkgb2JqZWN0MSkuZ2V0VGltZSgpKS5iZWZvcmUoKERhdGUpIG9iamVjdDIpIHx8IG9iamVjdDEuZXF1YWxzKG9iamVjdDIpKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFU1VMVF9LRVksIFRPT19MQVRFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSBvYmplY3QxICE9IG51bGwgJiYgb2JqZWN0MiAhPSBudWxsICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICghbmV3IERhdGUoKChEYXRlKSBvYmplY3QxKS5nZXRUaW1lKCkpLmFmdGVyKChEYXRlKSBvYmplY3QyKSB8fCBvYmplY3QxLmVxdWFscyhvYmplY3QyKSk7DQotDQotICAgICAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVNVTFRfS0VZLCBUT09fRUFSTFkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KENPTVBBUkVEX1ZBTFVFX0tFWSwgb2JqZWN0MSk7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVZFUlNFX0NPTVBBUkVEX1ZBTFVFX0tFWSwgb2JqZWN0Mik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlvbGF0aW9uRm91bmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWx1ZU9mKCk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogcHJvdGVjdGVkDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IChTdHJpbmcpIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5nZXQoUkVTVUxUX0tFWSk7DQotDQotICAgICAgICBpZiAoIWlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHJldmVyc2VSZXN1bHQocmVzdWx0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChUT09fRUFSTFkuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldE5vdEFmdGVyRXJyb3JNc2dLZXkoYW5ub3RhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChUT09fTEFURS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0Tm90QmVmb3JlRXJyb3JNc2dLZXkoYW5ub3RhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldE5vdEVxdWFsRXJyb3JNc2dLZXkoYW5ub3RhdGlvbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmV2ZXJzZVJlc3VsdChTdHJpbmcgcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBpZiAoVE9PX0VBUkxZLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBUT09fTEFURTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gVE9PX0VBUkxZOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoRGF0ZUlzIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpLCBhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKERhdGVJcyBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGZhbHNlKSwgYW5ub3RhdGlvbiwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGZhbHNlKQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgYW5ub3RhdGlvbiwgZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBrZXkgIiArIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGtleSwgRGF0ZUlzIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gcmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0NCi0gICAgICAgIERhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKGFubm90YXRpb24uZXJyb3JNZXNzYWdlRGF0ZVN0eWxlKCksDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlc3VsdDsNCi0NCi0gICAgICAgIGlmKGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IG1lc3NhZ2UucmVwbGFjZSgiezB9IiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0LmZvcm1hdCgoRGF0ZSkgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLmdldChDT01QQVJFRF9WQUxVRV9LRVkpKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQuZm9ybWF0KChEYXRlKSB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UuZ2V0KFJFVkVSU0VfQ09NUEFSRURfVkFMVUVfS0VZKSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9yZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBvdGhlciBjb21wb25lbnQNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogcHJpdmF0ZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90QWZ0ZXJFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RBZnRlckVycm9yTXNnS2V5KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXROb3RCZWZvcmVFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RCZWZvcmVFcnJvck1zZ0tleSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90RXF1YWxFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RFcXVhbEVycm9yTXNnS2V5KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VMQ29tcGFyZVN0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VMQ29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OTExZDUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiByZWZlcmVuY2luZyB2YWxpZGF0aW9uIHRhcmdldHMgLSBwb3NzaWJsZSBmb3JtYXRzOg0KLSAqICIje1tiZWFuX25hbWVdLltwcm9wZXJ0eV9uYW1lXX0iIC4uLiBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbiB3aXRoIHZhbHVlIGJpbmRpbmcNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRUxDb21wYXJlU3RyYXRlZ3kgaW1wbGVtZW50cyBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LCBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZCh2YWxpZGF0aW9uVGFyZ2V0KSAmJg0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZhbGlkYXRpb25UYXJnZXQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvVmFsaWRhdGVWYWx1ZUJpbmRpbmcoDQotICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgICAgICAgICBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWxpZGF0aW9uVGFyZ2V0KSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwgY29tcGFyZVN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAidGVzdCIpDQotICAgIHByb3RlY3RlZCBib29sZWFuIHRyeVRvVmFsaWRhdGVWYWx1ZUJpbmRpbmcoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5ID0NCi0gICAgICAgICAgICAgICAgcmVzb2x2ZVRhcmdldEZvckNyb3NzQ29tcG9uZW50VmFsaWRhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXQpOw0KLQ0KLSAgICAgICAgaWYodmFsaWRhdGlvblRhcmdldEVudHJ5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHJlc29sdmVUYXJnZXRGb3JDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbGlkYXRpb25UYXJnZXQpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgPQ0KLSAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UoKTsNCi0NCi0gICAgICAgIHJldHVybiBDcm9zc1ZhbGlkYXRpb25VdGlscy5yZXNvbHZlVmFsaWRhdGlvblRhcmdldEVudHJ5KA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmNvbnZlcnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uVG9Qcm9jZXNzZWRJbmZvcm1hdGlvbktleSh2YWxpZGF0aW9uVGFyZ2V0KSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5LCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsaWRhdGlvblRhcmdldCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIE9iamVjdCB0YXJnZXRWYWx1ZSA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0NCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHRhcmdldEVudHJ5ID0gbmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5KCk7DQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRCZWFuKA0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFZhbHVlT2ZFeHByZXNzaW9uKGZhY2VzQ29udGV4dCwgdmFsaWRhdGlvblRhcmdldC5nZXRCYXNlRXhwcmVzc2lvbigpKSk7DQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh0YXJnZXRWYWx1ZSk7DQotDQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEVudHJ5LCB0cnVlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VxdWFsc1N0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VxdWFsc1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZGIzZjUuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FcXVhbHNTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBOdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBFbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFcXVhbHNTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5DQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChFcXVhbHMpIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gb2JqZWN0MSAhPSBudWxsICYmICFvYmplY3QxLmVxdWFscyhvYmplY3QyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChFcXVhbHMpIGFubm90YXRpb24pLnZhbHVlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbENvbXBhcmVTdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzUyZjNjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxDb21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi0NCi0vKioNCi0gKiAiW3Byb3BlcnR5X25hbWVdIiAuLi4gbG9jYWwgdmFsaWRhdGlvbiAtPiBjcm9zcy1jb21wb25lbnQsIGJ1dCBubyBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBMb2NhbENvbXBhcmVTdHJhdGVneSBpbXBsZW1lbnRzIFJlZmVyZW5jaW5nU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblRhcmdldC5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5IHdpbGwgY29udGludWUNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ5VG9WYWxpZGF0ZUxvY2FsbHkoDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXksDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlID0NCi0gICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlKCk7DQotDQotICAgICAgICBib29sZWFuIGlzTW9kZWxBd2FyZVZhbGlkYXRpb24gPQ0KLSAgICAgICAgICAgICAgICBpc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UsIHRhcmdldEtleSk7DQotDQotICAgICAgICBTdHJpbmcgdGFyZ2V0UHJvcGVydHkgPSB0YXJnZXRLZXk7DQotDQotICAgICAgICBTdHJpbmcgc291cmNlS2V5ID0gcmVzb2x2ZVNvdXJjZUtleShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgdGFyZ2V0S2V5ID0gc291cmNlS2V5LnN1YnN0cmluZygwLCBzb3VyY2VLZXkubGFzdEluZGV4T2YoIi4iKSArIDEpICsgdGFyZ2V0S2V5Ow0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5ID0gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMucmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFbnRyeSgNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLCB0YXJnZXRLZXksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotDQotICAgICAgICBpZiAodmFsaWRhdGlvblRhcmdldEVudHJ5ICE9IG51bGwgJiYgdmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENvbXBvbmVudCgpICE9IG51bGwgJiYgIWlzTW9kZWxBd2FyZVZhbGlkYXRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vbm8gdGFyZ2V0IC0gYmVjYXVzZSB0aGVyZSBpcyBubyB0YXJnZXQgY29tcG9uZW50IC0gdmFsdWUgd2FzIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBtb2RlbA0KLSAgICAgICAgZWxzZSBpZihpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdW5zdXBwb3J0ZWRDYXNlKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZVRhcmdldEtleShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBTdHJpbmcgdGFyZ2V0S2V5KQ0KLSAgICB7DQotICAgICAgICAvL25vIHJlYWwgdmFsdWUgYmluZGluZyBleHByZXNzaW9uDQotICAgICAgICAvL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24ganVzdCBoZXBscyB0byByZXBsYWNlIHRoZSBwcm9wZXJ0eSBvZiB0aGUga2V5DQotICAgICAgICAvL2hlcmUgb25seSBkb3Qtbm90YXRpb24gaXMgYWxsb3dlZCAtPiBubyBwcm9ibGVtDQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGJhc2VFeHByZXNzaW9uID0NCi0gICAgICAgICAgICBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3siICsgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywNCi0gICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGV0YWlscy5jbGFzcykuZ2V0S2V5KCkgKyAifSIpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZU9yQWRkUHJvcGVydHkoYmFzZUV4cHJlc3Npb24sIHRhcmdldEtleSkNCi0gICAgICAgICAgICAuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC5zdWJzdHJpbmcoMiwgcmVzdWx0Lmxlbmd0aCgpIC0xKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlT2ZQcm9wZXJ0eShPYmplY3QgYmFzZSwgU3RyaW5nIHByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnR5LnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSwgcHJvcGVydHkubGVuZ3RoKCkpOw0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKGJhc2UuZ2V0Q2xhc3MoKSk7DQotICAgICAgICBNZXRob2QgdGFyZ2V0TWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHRhcmdldENsYXNzLCAiZ2V0IiArIHByb3BlcnR5KTsNCi0NCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh0YXJnZXRDbGFzcywgImlzIiArIHByb3BlcnR5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICJjbGFzcyAiICsgYmFzZS5nZXRDbGFzcygpICsgIiBoYXMgbm8gcHVibGljIGdldC9pcyAiICsgcHJvcGVydHkudG9Mb3dlckNhc2UoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKGJhc2UsIHRhcmdldE1ldGhvZCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSBrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcsDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IGNyZWF0ZVRhcmdldEtleShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEtleSk7DQotDQotICAgICAgICByZXR1cm4gIWtleUNvbnZlcnRlZFZhbHVlTWFwcGluZy5jb250YWluc0VudHJ5KG5ld0tleSk7DQotDQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZVNvdXJjZUtleShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIFN0cmluZyBzb3VyY2VLZXkgPSBwcm9wZXJ0eURldGFpbHMuZ2V0S2V5KCk7DQotDQotICAgICAgICBpZighc291cmNlS2V5LmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic291cmNlIHBhdGg6ICIgKyBzb3VyY2VLZXkgKyAiIGludmFsaWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzb3VyY2VLZXk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHVuc3VwcG9ydGVkQ2FzZShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGNvbnZlcnRlZCBvYmplY3QgZm9yICIgKyAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpLmdldEtleSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5LCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdGFyZ2V0RW50cnkgPSBuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkoKTsNCi0NCi0gICAgICAgIHRhcmdldEVudHJ5LnNldEJlYW4oDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKS5nZXRCYXNlT2JqZWN0KCkpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkNCi0gICAgICAgICAgICAgICAgLnNldENvbnZlcnRlZFZhbHVlKGdldFZhbHVlT2ZQcm9wZXJ0eSh0YXJnZXRFbnRyeS5nZXRCZWFuKCksIHRhcmdldFByb3BlcnR5KSk7DQotDQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEVudHJ5LCB0cnVlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneS5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGViNjU2Yy4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogIltsb2NhbF9wcm9wZXJ0eS5wcm9wZXJ0eTEucHJvcGVydHkyXSINCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5IGV4dGVuZHMgTG9jYWxDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LCBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKCF2YWxpZGF0aW9uVGFyZ2V0LmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9ub3Qgc3VwcG9ydGVkIC0gVE9ETyBhZGQgbG9nZ2luZw0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnlUb1ZhbGlkYXRlTG9jYWxseSgNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlID0NCi0gICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlKCk7DQotDQotICAgICAgICBTdHJpbmcgbmV3S2V5ID0gY3JlYXRlVGFyZ2V0S2V5KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIGlmIChwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY29udGFpbnNFbnRyeShuZXdLZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9IHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5nZXRFbnRyeShuZXdLZXkpOw0KLQ0KLSAgICAgICAgICAgIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICAvL25vIHRhcmdldCAtIGJlY2F1c2UgdGhlcmUgaXMgbm8gdGFyZ2V0IGNvbXBvbmVudCAtIHZhbHVlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbW9kZWwNCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0S2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHRhcmdldEluZm9ybWF0aW9uRW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmIChjb21wYXJlU3RyYXRlZ3kuaXNWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgdGFyZ2V0SW5mb3JtYXRpb25FbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5ID0gbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb21wb25lbnQoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q2xpZW50SWQodGFyZ2V0SW5mb3JtYXRpb25FbnRyeS5nZXRDbGllbnRJZCgpKTsNCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29udmVydGVkT2JqZWN0KHRhcmdldEluZm9ybWF0aW9uRW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldFZhbGlkYXRpb25TdHJhdGVneShjb21wYXJlU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIC8vcHJvY2VzcyBhZnRlciB2aW9sYXRpb24NCi0gICAgICAgICAgICAvL2p1c3QgYWRkIG1lc3NhZ2VzDQotICAgICAgICAgICAgaWYoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbXBvbmVudCgpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIG51bGwpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvL3Rob3cgZXhjZXB0aW9uDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgU3RyaW5nIHRhcmdldEtleSkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIE9iamVjdCBuZXdCYXNlID0gUmVmbGVjdGlvblV0aWxzDQotICAgICAgICAgICAgLmdldEJhc2VPZlByb3BlcnR5Q2hhaW4ocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSwgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIGlmKHRhcmdldEtleS5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZmluZCB0aGUgbGFzdCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIHRhcmdldEtleSA9IHRhcmdldEtleS5zdWJzdHJpbmcodGFyZ2V0S2V5Lmxhc3RJbmRleE9mKCIuIikgKyAxLCB0YXJnZXRLZXkubGVuZ3RoKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgT2JqZWN0IHRhcmdldFZhbHVlID0gZ2V0VmFsdWVPZlByb3BlcnR5KG5ld0Jhc2UsIHRhcmdldEtleSk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB0YXJnZXRFbnRyeSA9IG5ldyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSgpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0QmVhbihuZXdCYXNlKTsNCi0gICAgICAgIHRhcmdldEVudHJ5LnNldENvbnZlcnRlZFZhbHVlKHRhcmdldFZhbHVlKTsNCi0NCi0gICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0RW50cnksIHRydWUpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwOWU4NC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L05vdEVxdWFsc1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLk5vdEVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBOdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBFbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBOb3RFcXVhbHNTdHJhdGVneSBleHRlbmRzIEVxdWFsc1N0cmF0ZWd5DQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChOb3RFcXVhbHMpIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsDQotICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIXN1cGVyLmlzVmlvbGF0aW9uKG9iamVjdDEsIG9iamVjdDIsIGFubm90YXRpb24pOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChOb3RFcXVhbHMpIGFubm90YXRpb24pLnZhbHVlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlZmVyZW5jaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRjNTAxMS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlZmVyZW5jaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSW50ZXJuYWwgaW50ZXJmYWNlIHRvIGFsbG93IG11bHRpcGxlIHJlZmVyZW5jaW5nIHN0cmF0ZWdpZXMgZm9yIGNyb3NzIGNvbXBvbmVudCB2YWxpZGF0aW9uLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1pbnRlcmZhY2UgUmVmZXJlbmNpbmdTdHJhdGVneQ0KLXsNCi0gICAgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5KTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YSBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVxdWlyZWRJZlN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NzUwYjMuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZlR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1ATnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1ARW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRJZlN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3k8UmVxdWlyZWRJZj4NCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VGYWNlc0J1bmRsZSA9IGZhbHNlOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KFJlcXVpcmVkSWYgYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IHNvdXJjZSwgT2JqZWN0IHRhcmdldCwgUmVxdWlyZWRJZiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHZpb2xhdGlvbkZvdW5kID0gZmFsc2U7DQotDQotICAgICAgICBpZiAoYW5ub3RhdGlvbi5pcygpLmVxdWFscyhSZXF1aXJlZElmVHlwZS5lbXB0eSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSAoaXNUYXJnZXRFbXB0eSh0YXJnZXQpIHx8IEJvb2xlYW4uRkFMU0UuZXF1YWxzKHRhcmdldCkpICYmIGlzU291cmNlRW1wdHkoc291cmNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24uaXMoKS5lcXVhbHMoUmVxdWlyZWRJZlR5cGUubm90X2VtcHR5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IChpc1RhcmdldE5vdEVtcHR5KHRhcmdldCkgJiYgaXNTb3VyY2VFbXB0eShzb3VyY2UpICYmICEodGFyZ2V0IGluc3RhbmNlb2YgQm9vbGVhbikpIHx8DQotICAgICAgICAgICAgICAgICAgICAoQm9vbGVhbi5UUlVFLmVxdWFscyh0YXJnZXQpICYmIGlzU291cmNlRW1wdHkoc291cmNlKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlvbGF0aW9uRm91bmQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVGFyZ2V0RW1wdHkoT2JqZWN0IHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldCA9PSBudWxsIHx8IHRhcmdldC5lcXVhbHMoIiIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NvdXJjZUVtcHR5KE9iamVjdCBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzb3VyY2UgPT0gbnVsbCB8fCBzb3VyY2UuZXF1YWxzKCIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNUYXJnZXROb3RFbXB0eShPYmplY3QgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGFyZ2V0ICE9IG51bGwgJiYgIXRhcmdldC5lcXVhbHMoIiIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhSZXF1aXJlZElmIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbHVlT2YoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy51c2VGYWNlc0J1bmRsZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5yZXBsYWNlV2l0aERlZmF1bHRSZXF1aXJlZE1lc3NhZ2UodmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRvckV4Y2VwdGlvbik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcyBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZDk5MjkuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1qYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW49b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuQmFzaWM9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuSWQ9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmU9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Dcm9zc1ZhbGlkYXRpb25VdGlscy5qYXZhIGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5Zjg1MmEuLjAwMDAwMDAKLS0tIGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgZ2V0T3JJbml0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MsIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVzZXRTdG9yYWdlKENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MsIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSBnZXRPckluaXRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZSgNCi0gICAgICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLCBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlc2V0U3RvcmFnZShQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MsIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgcmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFbnRyeSgNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXksIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgPQ0KLSAgICAgICAgICAgIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5nZXRFbnRyeSh0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgLy92YWx1ZSBub3Qgc3VibWl0dGVkIGF0IHRoaXMgcmVxdWVzdCAtIHVzZSBtb2RlbCB2YWx1ZSAodmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBtb2RlbCkNCi0gICAgICAgIGlmKHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vc2ltcGxlIGNhc2UNCi0gICAgICAgIGlmIChwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEZ1cnRoZXJFbnRyaWVzKCkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgT2JqZWN0IHRhcmdldEJlYW4gPSBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpOw0KLQ0KLSAgICAgICAgLy9wcm9jZXNzIGNvbXBsZXggY29tcG9uZW50IGVudHJpZXMgKGUuZy4gYSB0YWJsZSkNCi0gICAgICAgIC8vc3VwcG9ydGVkOiBjcm9zcy1jb21wb25lbnQgYnV0IG5vIGNyb3NzLWVudGl0eSB2YWxpZGF0aW9uICg9IGxvY2FsZSB2YWxpZGF0aW9uKQ0KLSAgICAgICAgaWYgKHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuZ2V0QmVhbigpLmVxdWFscyh0YXJnZXRCZWFuKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAoUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgZW50cnkgOiBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEZ1cnRoZXJFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LmdldEJlYW4oKS5lcXVhbHModGFyZ2V0QmVhbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInN1cHBvcnQgZm9yIG1hcCBzeW50YXgiKQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VmFsdWVCaW5kaW5nRXhwcmVzc2lvblRvUHJvY2Vzc2VkSW5mb3JtYXRpb25LZXkoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YmUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YmUuZ2V0RXhwcmVzc2lvblN0cmluZygpLnJlcGxhY2UoIiN7IiwgIiIpLnJlcGxhY2UoIn0iLCAiIik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Byb3BlcnR5VmFsaWRhdGlvblV0aWxzLmphdmEgYi9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY3M2EyOC4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuU2tpcFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25VdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPR0dFUiA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFByb3BlcnR5VmFsaWRhdGlvblV0aWxzLmNsYXNzKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRhdGlvblNraXBwZWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmKEV4dFZhbFV0aWxzLmlzU2tpcGFibGVWYWxpZGF0aW9uU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgIFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3ModmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksIFZhbGlkYXRpb25TdHJhdGVneS5jbGFzcykpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEJvb2xlYW4gc2tpcFZhbGlkYXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KA0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5TS0lQX1ZBTElEQVRJT04sIEJvb2xlYW4uY2xhc3MpOw0KLQ0KLSAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMoc2tpcFZhbGlkYXRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoTE9HR0VSLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIExPR0dFUi50cmFjZSgidmFsaWRhdGlvbiBvZiAiICsgdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjYW5jZWxlZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYodmFsaWRhdGlvblN0cmF0ZWd5IGluc3RhbmNlb2YgU2tpcFZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCBudWxsLCBtZXRhRGF0YUVudHJ5LCBudWxsKTsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9fcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvX3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWY4MjVjLi4wMDAwMDAwCi0tLSBhL19wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFByb3BlcnR5IFZhbGlkYXRpb24gTW9kdWxlDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgUHJvcGVydHkgVmFsaWRhdGlvbiBNb2R1bGUgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBQcm9wZXJ0eSBWYWxpZGF0aW9uIHByb3ZpZGVzIGFubm90YXRpb24gYmFzZWQgdmFsaWRhdGlvbiBmb3IgYmVhbiBwcm9wZXJ0aWVzLg0KLSAgICBJdCBhbHNvIHByb3ZpZGVzIEpQQSAxLjAgYmFzZWQgdmFsaWRhdGlvbiBTdXBwb3J0Lg0KLSAgDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLnggYW5kIEpTRiAyLnguIEFsbCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BvbS54bWwgYi9hc3NlbWJseS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMzg2ODkKLS0tIC9kZXYvbnVsbAorKysgYi9hc3NlbWJseS9wb20ueG1sCkBAIC0wLDAgKzEsOTUgQEAKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsMTE8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKyAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBBc3NlbWJseTwvbmFtZT4KKyAgICA8ZGVzY3JpcHRpb24+TXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBBc3NlbWJseSBpcyB1c2VkIHRvIGdlbmVyYXRlIAorICAgIC56aXAgYW5kIC50YXIuZ3ogZGlzdHJpYnV0aW9ucyA8L2Rlc2NyaXB0aW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1tb2R1bGU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPCEtLSBFWEVDVVRFIG12biBwYWNrYWdlIHRvIGdlbmVyYXRlIGFzc2VtYmx5IGZpbGVzIC0tPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X2JpbjwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPiR7YmFzZWRpcn0vc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWw8L2Rlc2NyaXB0b3I+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPmdudTwvdGFyTG9uZ0ZpbGVNb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5wZXJzaXN0ZW5jZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGVyc2lzdGVuY2UtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgudmFsaWRhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jZ2xpYjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2dsaWI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWwgYi9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWQ3ZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWwKQEAgLTAsMCArMSw1MCBAQAorPCEtLQorICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICAgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8YXNzZW1ibHk+CisgIDxpZD5iaW48L2lkPgorICA8Zm9ybWF0cz4KKyAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgorICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+CisgIDwvZm9ybWF0cz4KKyAgPGRlcGVuZGVuY3lTZXRzPgorICAgIDxkZXBlbmRlbmN5U2V0PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3lTZXQ+CisgIDwvZGVwZW5kZW5jeVNldHM+CisgIDxmaWxlU2V0cz4KKyAgICA8ZmlsZVNldD4KKyAgICAJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAJPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+UkVBRE1FKjwvaW5jbHVkZT4KKyAgICAgICAgPGluY2x1ZGU+TElDRU5TRSo8L2luY2x1ZGU+CisgICAgICAgIDxpbmNsdWRlPk5PVElDRSo8L2luY2x1ZGU+CisgICAgICAgIDxpbmNsdWRlPlJFTEVBU0UqPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PnRhcmdldC9qYXZhZG9jPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmphdmFkb2M8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgPC9maWxlU2V0cz4KKzwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWwgYi9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3Jlc3JjLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sCnJlbmFtZSB0byBhc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3Jlc3JjLnhtbApkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHByZXBhcmUvMV8xXzIvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CnJlbmFtZSB0byBhc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKcmVuYW1lIHRvIGFzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvYXNzZW1ibHkvcG9tLnhtbCBiL2JyYW5jaF9mb3JfanNmXzFfMS9hc3NlbWJseS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTQ4ZjYwLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzFfMS9hc3NlbWJseS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWFzc2VtYmx5MTE8L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBBc3NlbWJseTwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+TXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBBc3NlbWJseSBpcyB1c2VkIHRvIGdlbmVyYXRlIAotICAgIC56aXAgYW5kIC50YXIuZ3ogZGlzdHJpYnV0aW9ucyA8L2Rlc2NyaXB0aW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMV8xL2Fzc2VtYmx5PC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMV8xL2Fzc2VtYmx5PC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy9icmFuY2hfZm9yX2pzZl8xXzEvYXNzZW1ibHk8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRlcGVuZGVuY3ktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktamF2YWRvYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZW5lcmljLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2JlYW4tdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2phdmFkb2M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1zb3VyY2U8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjb3JlLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtiZWFuLXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zcmM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBFWEVDVVRFIG12biBwYWNrYWdlIHRvIGdlbmVyYXRlIGFzc2VtYmx5IGZpbGVzIC0tPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X3NyYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5teWZhY2VzLWV4dHZhbDExLSR7dmVyc2lvbn0tc3JjPC9maW5hbE5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXR0YWNoZWQ8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X2JpbjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPiR7YmFzZWRpcn0vc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsMTEtJHt2ZXJzaW9ufS1iaW48L2ZpbmFsTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgucGVyc2lzdGVuY2U8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnBlcnNpc3RlbmNlLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7YmVhbi12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgudmFsaWRhdGlvbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y2dsaWI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNnbGliPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8IS0tIFNpbmNlIGV4dHZhbCBjb3VsZCBiZSBhc3luYyByZWxlYXNlZCwgYW4gZ2VuZXJhdGVkIGFzc2VtYmx5IGNvdWxkIGNvbnRhaW4gZGlmZmVyZW50Ci0gICAgICAgICBhcnRpZmFjdCB2ZXJzaW9ucyAtLT4KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGNvcmUudmVyc2lvbj4xLjEuNC1TTkFQU0hPVDwvY29yZS52ZXJzaW9uPgotICAgICAgICA8dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC90cmluaWRhZC1zdXBwb3J0LnZlcnNpb24+Ci0gICAgICAgIDxnZW5lcmljLXN1cHBvcnQudmVyc2lvbj4xLjEuNC1TTkFQU0hPVDwvZ2VuZXJpYy1zdXBwb3J0LnZlcnNpb24+Ci0gICAgICAgIDxwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb24+MS4xLjQtU05BUFNIT1Q8L3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbj4KLSAgICAgICAgPGJlYW4tdmFsaWRhdGlvbi52ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC9iZWFuLXZhbGlkYXRpb24udmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWwgYi9icmFuY2hfZm9yX2pzZl8xXzEvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYmNhNTcuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmViaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08YXNzZW1ibHk+Ci0gIDxpZD5jb3JlYmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgCTxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgCTxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPlJFQURNRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5OT1RJQ0UqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5SRUxFQVNFKjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvamF2YWRvYzwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5qYXZhZG9jPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL2JyYW5jaF9mb3JfanNmXzFfMS9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNWIzYTUuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3BvbS54bWwgYi9icmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QwYmI2MS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIENvbXBvbmVudC1TdXBwb3J0IE1vZHVsZXM8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4xLjQ8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4xLjQ8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90YWdzL2V4dHZhbC0xLjEuNC9icmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQ8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90YWdzL2V4dHZhbC0xLjEuNC9icmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQ8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RhZ3MvZXh0dmFsLTEuMS40L2JyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydDwvdXJsPgotICAgIDwvc2NtPgotCi0gICAgPG1vZHVsZXM+Ci0gICAgICAgIDxtb2R1bGU+dHJpbmlkYWQtc3VwcG9ydDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmdlbmVyaWMtc3VwcG9ydDwvbW9kdWxlPgotICAgIDwvbW9kdWxlcz4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS40PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPHRyaW5pZGFkLnZlcnNpb24+MS4wLjk8L3RyaW5pZGFkLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUwZWI2OC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5DbGllbnRWYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLS8qKg0KLSAqIGluIGNhc2Ugb2YgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBhIHRyaW5pZGFkIGNsaWVudCB2YWxpZGF0b3IgaXMgYWRkZWQgdG8gdGhlIGNvbXBvbmVudCBiYXNlZCBvbiB0aGUgbWV0YS1kYXRhLg0KLSAqIGF0IHRoZSBwb3N0YmFjazogdGhlIGV4dHZhbCB2YWxpZGF0aW9uIHN0cmF0ZWd5IGdldHMgY2FsbGVkIGFuZCBhZnRlciB0aGF0IHRoZSBhZGRlZCB2YWxpZGF0b3IuDQotICogdGhpcyB3cmFwcGVyIHByZXZlbnRzIHN1Y2ggYSBzZXJ2ZXItc2lkZSBkb3VibGUgdmFsaWRhdGlvbi4NCi0gKiBpdCBqdXN0IGRlbGVnYXRlcyB0aGUgY2xpZW50LXNpZGUgZnVuY3Rpb25hbGl0eS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlciBpbXBsZW1lbnRzIFZhbGlkYXRvciwgQ2xpZW50VmFsaWRhdG9yLCBTZXJpYWxpemFibGUNCi17DQotICAgIHByaXZhdGUgdHJhbnNpZW50IENsaWVudFZhbGlkYXRvciB3cmFwcGVkOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxNDE0NTQ3ODQxNzAwNjIxNDEwTDsNCi0NCi0gICAgcHVibGljIEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcihDbGllbnRWYWxpZGF0b3IgY2xpZW50VmFsaWRhdG9yKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSBjbGllbnRWYWxpZGF0b3I7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgdmFsaWRhdGUgLSB0aGUgZXh0dmFsIHZhbGlkYXRpb24gc3RyYXRlZ3kgd2lsbCBkbyB0aGF0DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRMaWJyYXJ5U291cmNlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudExpYnJhcnlTb3VyY2UoZmFjZXNDb250ZXh0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldENsaWVudEltcG9ydE5hbWVzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q2xpZW50SW1wb3J0TmFtZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFNjcmlwdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q2xpZW50U2NyaXB0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50VmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q2xpZW50VmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZjA4OGQuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1BhdHRlcm5Jbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLlJlZ0V4cFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkNsaWVudFZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJza2lwVmFsaWRhdGlvblN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24iKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIFBhdHRlcm5Jbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYoIW1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gcGF0dGVybnMgPSAoU3RyaW5nW10pbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOKTsKLQotICAgICAgICBSZWdFeHBWYWxpZGF0b3IgcmVnRXhwVmFsaWRhdG9yOwotCi0gICAgICAgIGZvcihTdHJpbmcgcGF0dGVybiA6IHBhdHRlcm5zKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWdFeHBWYWxpZGF0b3IgPSAoUmVnRXhwVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuUmVnRXhwIik7Ci0KLSAgICAgICAgICAgIHJlZ0V4cFZhbGlkYXRvci5zZXRQYXR0ZXJuKHBhdHRlcm4pOwotICAgICAgICAgICAgcmVnRXhwVmFsaWRhdG9yLnNldE1lc3NhZ2VEZXRhaWxOb01hdGNoKChTdHJpbmcpbWV0YURhdGEuZ2V0KAotICAgICAgICAgICAgICAgIENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRSkpOwotCi0gICAgICAgICAgICBpZihyZWdFeHBWYWxpZGF0b3IgaW5zdGFuY2VvZiBDbGllbnRWYWxpZGF0b3IgJiYgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKXJlZ0V4cFZhbGlkYXRvcikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlY2EyMWUuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcktpdDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuUmVuZGVyS2l0RGVjb3JhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnJlbmRlcmtpdC5jb3JlLkNvcmVSZW5kZXJLaXQ7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVzcG9uc2VTdGF0ZU1hbmFnZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVdyaXRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LlJlc3BvbnNlU3RyZWFtOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQgZXh0ZW5kcyBSZW5kZXJLaXREZWNvcmF0b3IKLXsKLSAgICBwcm90ZWN0ZWQgRXh0VmFsUmVuZGVyS2l0IGV4dFZhbFJlbmRlcktpdDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIkVYVFZBTF9UUklOSURBRF9SRU5ERVJLSVQiOwotCi0gICAgcHVibGljIEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0KFJlbmRlcktpdCB3cmFwcGVkKQotICAgIHsKLSAgICAgICAgdGhpcy5leHRWYWxSZW5kZXJLaXQgPSBuZXcgRXh0VmFsUmVuZGVyS2l0KHdyYXBwZWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgdGhpcy5leHRWYWxSZW5kZXJLaXQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIHJlbmRlcmVyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVuZGVyZXIgZ2V0UmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5nZXRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlc3BvbnNlU3RhdGVNYW5hZ2VyIGdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5nZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZXNwb25zZVdyaXRlciBjcmVhdGVSZXNwb25zZVdyaXRlcihXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcywgU3RyaW5nIHMxKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmNyZWF0ZVJlc3BvbnNlV3JpdGVyKHdyaXRlciwgcywgczEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZXNwb25zZVN0cmVhbSBjcmVhdGVSZXNwb25zZVN0cmVhbShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmNyZWF0ZVJlc3BvbnNlU3RyZWFtKG91dHB1dFN0cmVhbSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZWNvcmF0ZWRSZW5kZXJLaXRJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gQ29yZVJlbmRlcktpdC5CQVNFX1JFTkRFUl9LSVRfSUQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2MyMWNjLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5IGV4dGVuZHMgRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xhYmVsZWRGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIFRyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2Uoc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvcG9tLnhtbCBiL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzOGZhMTguLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjEuNDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQ29yZTwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjEuNDwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICAgIAotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RhZ3MvZXh0dmFsLTEuMS40L2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGFncy9leHR2YWwtMS4xLjQvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmU8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RhZ3MvZXh0dmFsLTEuMS40L2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlPC91cmw+Ci0gICAgPC9zY20+Ci0gICAgCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jb2RlYzwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29kZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjM8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDlmODY5Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TW9kdWxlTWVzc2FnZUJ1bmRsZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbmV3UGFja2FnZU5hbWU7DQotICAgICAgICBpZiAocGFja2FnZU5hbWUuZW5kc1dpdGgoIi5yZXNvbHZlciIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5ld1BhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUucmVwbGFjZSgiLnJlc29sdmVyIiwgIi5idW5kbGUiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBuZXdQYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lLnJlcGxhY2UoIi5yZXNvbHZlci4iLCAiLmJ1bmRsZS4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXdQYWNrYWdlTmFtZSArICIudmFsaWRhdGlvbl9tZXNzYWdlcyI7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHVzZSBhIGN1c3RvbSBuYW1lIG1hcHBlciB0byBpbXBsZW1lbnQgY3VzdG9tIGNvbnZlbnRpb25zDQotICAgICAqLw0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VSZXNvbHZlckNsYXNzTmFtZSgNCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLCBTdHJpbmcgdGFyZ2V0Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLCAiLm1lc3NhZ2UucmVzb2x2ZXIuIiwgdGFyZ2V0Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKA0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsICIubWV0YWRhdGEudHJhbnNmb3JtZXIuIiwgdGFyZ2V0Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldFBhY2thZ2VOYW1lLCBTdHJpbmcgdGFyZ2V0Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0TmFtZSgpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLnJlcGxhY2UoIi5zdHJhdGVneS4iLCB0YXJnZXRQYWNrYWdlTmFtZSk7DQotDQotICAgICAgICBpZiAodGFyZ2V0Q2xhc3NOYW1lID09IG51bGwgfHwgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgPT0gLTEpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lDQotICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikpICsgIi4iICsgdGFyZ2V0Q2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB1c2UgYSBjdXN0b20gbmFtZSBtYXBwZXIgdG8gaW1wbGVtZW50IGN1c3RvbSBjb252ZW50aW9ucw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneU5hbWUsICJWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIiKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUtleS5yZXBsYWNlKCIuYW5ub3RhdGlvbi4iLCAiLnN0cmF0ZWd5LiIpICsgIlN0cmF0ZWd5IjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneU5hbWUsICJNZXRhRGF0YVRyYW5zZm9ybWVyIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgdGFyZ2V0UG9zdGZpeCkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUuZW5kc1dpdGgoIlZhbGlkYXRpb25TdHJhdGVneSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLnN1YnN0cmluZygwLCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLmxlbmd0aCgpIC0gMTgpICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUuZW5kc1dpdGgoIlN0cmF0ZWd5IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneU5hbWUuc3Vic3RyaW5nKDAsIHZhbGlkYXRpb25TdHJhdGVneU5hbWUubGVuZ3RoKCkgLSA4KSArIHRhcmdldFBvc3RmaXg7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArIHRhcmdldFBvc3RmaXg7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXJGYWN0b3J5LmphdmEgYi9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmZTU2Yy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEVMSGVscGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5DQotew0KLSAgICBwcml2YXRlIEVMSGVscGVyIGVsSGVscGVyID0gbmV3IERlZmF1bHRFTEhlbHBlcigpOw0KLSAgICANCi0gICAgcHJvdGVjdGVkIEVMSGVscGVyIGNyZWF0ZUVMSGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZWxIZWxwZXI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YSBiL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MjUxMGMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY2VzTWVzc2FnZUZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeSBpbXBsZW1lbnRzIEZhY2VzTWVzc2FnZUZhY3RvcnkNCi17DQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2UgY29udmVydChGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBpZihpc0xhYmVsZWRGYWNlc01lc3NhZ2UoZmFjZXNNZXNzYWdlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZShmYWNlc01lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSwgZmFjZXNNZXNzYWdlLmdldFN1bW1hcnkoKSwgZmFjZXNNZXNzYWdlLmdldERldGFpbCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRmFjZXNNZXNzYWdlIGNyZWF0ZShGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFZpb2xhdGlvbk1lc3NhZ2Uoc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNMYWJlbGVkRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgdXNlIHRoZSBpbnRlcmZhY2UgaGVyZQ0KLSAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIFZpb2xhdGlvbk1lc3NhZ2U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvUHJpb3JpdHkuamF2YSBiL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OTQ3ZDUuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvUHJpb3JpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1wdWJsaWMgZW51bSBQcmlvcml0eQotewotICAgIEJMT0NLSU5HLAotICAgIEhJR0gsCi0gICAgTUVESVVNLAotICAgIExPVwotfQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VDYXRlZ29yeS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VDYXRlZ29yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDdiMzg1Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbDsKLQotLyoqCi0gKiBBUEk6PGJyLz4KLSAqIHBhcnRzIHlvdSBtaWdodCBuZWVkIGZvciBjdXN0b20gaW1wbGVtZW50YXRpb25zIGFuZCB3aGljaCBhcmUgcXVpdGUgc3RhYmxlIGluIHZpZXcgb2YgY2hhbmdlcwotICogPHAvPgotICogSU5URVJOQUw6PGJyLz4KLSAqIGlmIHlvdSB0aGluayBhYm91dCByZWZlcmVuY2luZyBhbiBhcnRpZmFjdCB3aGljaCBpcyBtYXJrZWQgYXMgaW50ZXJuYWwsIGFzayBmb3Igc3VwcG9ydC4KLSAqIHRoZXJlIHNob3VsZCBiZSBhIGJldHRlciBzb2x1dGlvbgotICogPHAvPgotICogQ1VTVE9NSVpBQkxFOjxici8+Ci0gKiBhIHBsYW5uZWQgZXh0ZW5zaW9uIHBvaW50IHdoaWNoIGNvbnRhaW5zIGxvZ2ljIHRvIGN1c3RvbWl6ZSB0aGUgZnJhbWV3b3JrLgotICogaWYgaXQgaXNuJ3QgYWxzbyBtYXJrZWQgYXMgQVBJIGl0IG1pZ2h0IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuCi0gKiBob3dldmVyLCB3ZSB0cnkgdG8ga2VlcCBpdCBhcyBzdGFibGUgYXMgcG9zc2libGUgYW5kIHJlYXNvbmFibGUuCi0gKiA8cC8+Ci0gKiBSRVVTRTo8YnIvPgotICogYW4gYXJ0aWZhY3Qgd2hpY2ggeW91IGNhbiByZXVzZSBmb3IgYSBjdXN0b20gaW1wbGVtZW50YXRpb24uCi0gKiBpZiBpdCBpc24ndCBtYXJrZWQgYXMgQVBJIGl0IG1pZ2h0IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuCi0gKiBob3dldmVyLCB3ZSB0cnkgdG8ga2VlcCBpdCBhcyBzdGFibGUgYXMgcG9zc2libGUgYW5kIHJlYXNvbmFibGUuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGVudW0gVXNhZ2VDYXRlZ29yeQotewotICAgIEFQSSwKLSAgICBJTlRFUk5BTCwKLSAgICBDVVNUT01JWkFCTEUsCi0gICAgUkVVU0UKLX0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlSW5mb3JtYXRpb24uamF2YSBiL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlSW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzN2ViYy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogaXQncyBhbiBpbnRlcm5hbCBhbm5vdGF0aW9uIHRvIHByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBjb25jZXJuaW5nIHVzYWdlLWNhdGVnb3JpZXMKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeQotICovCi1AVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLXB1YmxpYyBAaW50ZXJmYWNlIFVzYWdlSW5mb3JtYXRpb24KLXsKLSAgICBVc2FnZUNhdGVnb3J5W10gdmFsdWUoKTsKLX0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXAueG1sIGIvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZjdiODEuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08YXNzZW1ibHk+Ci0gIDxpZD5iaW48L2lkPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4JCi0gIDxmaWxlU2V0cz4gICAgCi0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC93YXI8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPioud2FyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+ICAgICAKLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbCBiL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTcwY2NjLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+c3JjPC9pZD4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+CQotICA8ZmlsZVNldHM+ICAgIAotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvc3JjPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLmphcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPioudHh0PC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNWIzYTUuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2N1c3RvbS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwMWRmNy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0jIHRoaXMgbWVzc2FnZSBidW5kbGUgaXMgcGlja2VkIHVwIHZpYSBjb252ZW50aW9uDQotcmVwZWF0ZWRfcGFzc3dvcmRfcmVxdWlyZWQ9cGxlYXNlIHJldHlwZSB0aGUgcGFzc3dvcmQNCi1yZXBlYXRlZF9wYXNzd29yZF9yZXF1aXJlZF9kZXRhaWw9cGxlYXNlIHJldHlwZSB0aGUgcGFzc3dvcmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQgYi9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjlkZjRmLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQwotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMC8vRU4iCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlcy1jb25maWc+Ci0gICAgPGFwcGxpY2F0aW9uPgotICAgICAgICA8IS0tIHRyaW5pZGFkIC0tPgotICAgICAgICA8ZGVmYXVsdC1yZW5kZXIta2l0LWlkPgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvcmUKLSAgICAgICAgPC9kZWZhdWx0LXJlbmRlci1raXQtaWQ+Ci0KLSAgICA8L2FwcGxpY2F0aW9uPgotCi0gICAgPG1hbmFnZWQtYmVhbj4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1uYW1lPnJlZ2lzdHJhdGlvblBhZ2U8L21hbmFnZWQtYmVhbi1uYW1lPgotICAgICAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmd1aS5iZWFucy5SZWdpc3RyYXRpb25QYWdlPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPgotCi0gICAgICAgIDxtYW5hZ2VkLXByb3BlcnR5PgotICAgICAgICAgICAgPHByb3BlcnR5LW5hbWU+cGVyc29uPC9wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPHZhbHVlPiN7cGVyc29ufTwvdmFsdWU+Ci0gICAgICAgIDwvbWFuYWdlZC1wcm9wZXJ0eT4KLSAgICA8L21hbmFnZWQtYmVhbj4KLQotICAgIDxtYW5hZ2VkLWJlYW4+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tbmFtZT5wZXJzb248L21hbmFnZWQtYmVhbi1uYW1lPgotICAgICAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb248L21hbmFnZWQtYmVhbi1jbGFzcz4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5zZXNzaW9uPC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0gICAgPC9tYW5hZ2VkLWJlYW4+Ci0KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8ZnJvbS12aWV3LWlkPi9wYWdlcy9ob21lLnhodG1sPC9mcm9tLXZpZXctaWQ+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmFkZFVzZXI8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5jaGFuZ2VOaWNrTmFtZTwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmNoYW5nZVBhc3N3b3JkPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICA8L25hdmlnYXRpb24tcnVsZT4KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8ZnJvbS12aWV3LWlkPio8L2Zyb20tdmlldy1pZD4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+aG9tZTwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL2hvbWUueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgIDwvbmF2aWdhdGlvbi1ydWxlPgotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbCBiL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9tYWluLnRhZ2xpYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMzkzNjYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIGZhY2VsZXQtdGFnbGliIFBVQkxJQwotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEZhY2VsZXQgVGFnbGliIDEuMC8vRU4iCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9mYWNlbGV0LXRhZ2xpYl8xXzAuZHRkIj4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZmFjZWxldC10YWdsaWI+Ci0gICAgPG5hbWVzcGFjZT5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dHZhbC9kZW1vL2NvbXBvbmVudHM8L25hbWVzcGFjZT4KLQotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT51c2VyRm9ybTwvdGFnLW5hbWU+Ci0gICAgICAgIDxzb3VyY2U+Ci0gICAgICAgICAgICAuLi9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbAotICAgICAgICA8L3NvdXJjZT4KLSAgICA8L3RhZz4KLQotPC9mYWNlbGV0LXRhZ2xpYj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWMwMWFhLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCi0gICAgICAgICB2ZXJzaW9uPSIyLjQiPgotCi0gICAgPGRlc2NyaXB0aW9uPk15UHJvamVjdCB3ZWIueG1sPC9kZXNjcmlwdGlvbj4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5ERUZBVUxUX1NVRkZJWDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi54aHRtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmZhY2VsZXRzLkxJQlJBUklFUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi9XRUItSU5GL21haW4udGFnbGliLnhtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5FTkFCTEVfTElHSFRXRUlHSFRfRElBTE9HUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRElTQUJMRV9DT05URU5UX0NPTVBSRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5BTFRFUk5BVEVfVklFV19IQU5ETEVSPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y29tLnN1bi5mYWNlbGV0cy5GYWNlbGV0Vmlld0hhbmRsZXI8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuVVNFX0FQUExJQ0FUSU9OX1ZJRVdfQ0FDSEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5DSEFOR0VfUEVSU0lTVEVOQ0U8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5zZXNzaW9uPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBTZWUgSlNGIFNwZWNpZmljYXRpb24gMi41LjMKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNsaWVudDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5OVU1CRVJfT0ZfVklFV1NfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPjIwPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzdGF0ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbSBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uCi0gICAgICAgICAgICBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KSBhbmQgaWYKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgY29tcHJlc3NlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUKLSAgICAgICAgICAgIHJlbmRlcmVkIEhUTUwgb3V0cHV0LgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgbm90IGFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFMTE9XX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5ERVRFQ1RfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCByZW5kZXJlZCBIVE1MIGNvZGUgd2lsbCBiZSBmb3JtYXR0ZWQsIHNvIHRoYXQgaXQgaXMgImh1bWFuIHJlYWRhYmxlIi4KLSAgICAgICAgICAgIGkuZS4gYWRkaXRpb25hbCBsaW5lIHNlcGFyYXRvcnMgYW5kIHdoaXRlc3BhY2Ugd2lsbCBiZSB3cml0dGVuLCB0aGF0IGRvIG5vdAotICAgICAgICAgICAgaW5mbHVlbmNlIHRoZSBIVE1MIGNvZGUuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlBSRVRUWV9IVE1MPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlCi0gICAgICAgICAgICBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuIENvbnZlbmllbnQgZmVhdHVyZSBpZiB5b3UgaGF2ZSBwYWdlcwotICAgICAgICAgICAgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGJyb3dzZXIgcGFnZSB0byBhbHdheXMganVtcCB0byB0aGUgdG9wCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuCi0gICAgICAgICAgICBEZWZhdWx0OiAiZmFsc2UiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BVVRPX1NDUk9MTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQotICAgICAgICAgICAgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucwotICAgICAgICAgICAgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IgZGlmZmVuZW50IGVuY3J5cHRpb24gc3RyZW5ndGhzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VDUkVUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+TnpZMU5ETXlNVEE9PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmFsaWRhdGUgbWFuYWdlZCBiZWFucywgbmF2aWdhdGlvbiBydWxlcyBhbmQgZW5zdXJlIHRoYXQgZm9ybXMgYXJlIG5vdCBuZXN0ZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDwhLS0gTGlzdGVuZXIsIHRvIGFsbG93IEpldHR5IHNlcnZpbmcgTXlGYWNlcyBhcHBzIC0tPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy53ZWJhcHAuU3RhcnR1cFNlcnZsZXRDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLndlYmFwcC5SZXNvdXJjZVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPGZpbHRlcj4KLSAgICAgICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlRyaW5pZGFkRmlsdGVyPC9maWx0ZXItY2xhc3M+Ci0gICAgPC9maWx0ZXI+Ci0KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT50cmluaWRhZDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZ3MgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4vZmFjZXMvKjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPnJlc291cmNlczwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+L2FkZi8qPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbCBiL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjZDE0OC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0gICAgICAgIA0KLTxodG1sPg0KLQ0KLTxoZWFkPg0KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIwOyBVUkw9ZmFjZXMvcGFnZXMvaG9tZS54aHRtbCI+DQotPC9oZWFkPg0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbCBiL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGMxZWE4Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPHRyOmRvY3VtZW50DQotICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiDQotICAgICAgICB4bWxuczpjPSJodHRwOi8vamF2YS5zdW4uY29tL2pzdGwvY29yZSI+DQotICAgIDxmOmZhY2V0IG5hbWU9Im1ldGFDb250YWluZXIiPg0KLSAgICAgICAgPHRpdGxlPnNldi1lbiBmZWF0dXJlLXNldCBkZW1vIDAxPC90aXRsZT4NCi0gICAgPC9mOmZhY2V0Pg0KLQ0KLSAgICA8dHJoOmJvZHk+DQotDQotICAgICAgICA8IS0tIG9yaWdpbmFsIC0tPg0KLSAgICAgICAgPGRpdiBpZD0id3JhcCI+DQotDQotICAgICAgICAgICAgPHRyOmZvcm0gaWQ9ImZvcm0iIGRlZmF1bHRDb21tYW5kPSJkZWZhdWx0QnV0dG9uIj4NCi0gICAgICAgICAgICAgICAgPGRpdiBpZD0ibWFpbiI+DQotICAgICAgICAgICAgICAgICAgICA8dWk6aW5zZXJ0IG5hbWU9ImNvbnRlbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InVuZGVyX2NvbnN0cnVjdGlvbiI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj4hc2l0ZSB1bmRlciBjb25zdHJ1Y3Rpb24hPC9oMj4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIGNvbnRlbnQgb2YgdGhpcyBzaXRlIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhlIG1vbWVudC48L3A+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICA8L3VpOmluc2VydD4NCi0gICAgICAgICAgICAgICAgPC9kaXY+DQotDQotICAgICAgICAgICAgPC90cjpmb3JtPg0KLSAgICAgICAgICAgIDx0cjptZXNzYWdlcyBnbG9iYWxPbmx5PSJ0cnVlIi8+DQotDQotICAgICAgICA8L2Rpdj4NCi0gICAgPC90cmg6Ym9keT4NCi0NCi0NCi08L3RyOmRvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sIGIvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OTNmYWUuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgPHRyOnBhbmVsRm9ybUxheW91dD4NCi0NCi0gICAgICAgICAgICA8dWk6cmVtb3ZlPg0KLSAgICAgICAgICAgICAgICBqdXN0IGZvciB0aGUgZGVtbyB3ZSBhcmUgdXNpbmcgdHdvIGlucHV0IGNvbXBvbmVudHMNCi0gICAgICAgICAgICA8L3VpOnJlbW92ZT4NCi0gICAgICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJvbGQgbmljayBuYW1lIiByZWFkT25seT0idHJ1ZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ubmlja05hbWV9Ii8+DQotDQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibmljayBuYW1lIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLm5ld05pY2tOYW1lfSIvPg0KLQ0KLSAgICAgICAgPC90cjpwYW5lbEZvcm1MYXlvdXQ+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJzYXZlIiBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS51cGRhdGVOaWNrTmFtZX0iLz4NCi0NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sIGIvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMDk3NWEuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgPHRhYmxlPg0KLSAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjpvdXRwdXRMYWJlbCB2YWx1ZT0ib2xkIHBhc3N3b3JkIiBmb3I9Im9sZF9wYXNzd29yZCIvPjwvdGQ+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6aW5wdXRUZXh0IGlkPSJvbGRfcGFzc3dvcmQiIHNpbXBsZT0idHJ1ZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5vbGRQYXNzd29yZH0iIHNlY3JldD0idHJ1ZSIvPjwvdGQ+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6bWVzc2FnZSBmb3I9Im9sZF9wYXNzd29yZCIvPjwvdGQ+DQotICAgICAgICAgICAgPC90cj4NCi0NCi0gICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6b3V0cHV0TGFiZWwgdmFsdWU9Im5ldyBwYXNzd29yZCIgZm9yPSJuZXdfcGFzc3dvcmQiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOmlucHV0VGV4dCBpZD0ibmV3X3Bhc3N3b3JkIiBzaW1wbGU9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGFzc3dvcmR9IiBzZWNyZXQ9InRydWUiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm1lc3NhZ2UgZm9yPSJuZXdfcGFzc3dvcmQiLz48L3RkPg0KLSAgICAgICAgICAgIDwvdHI+DQotDQotICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm91dHB1dExhYmVsIHZhbHVlPSJyZS1lbnRlciBwYXNzd29yZCIgZm9yPSJyZWVudGVyZWQiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOmlucHV0VGV4dCBpZD0icmVlbnRlcmVkIiBzaW1wbGU9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGFzc3dvcmRSZXBlYXRlZH0iIHNlY3JldD0idHJ1ZSIvPjwvdGQ+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6bWVzc2FnZSBmb3I9InJlZW50ZXJlZCIvPjwvdGQ+DQotICAgICAgICAgICAgPC90cj4NCi0NCi0gICAgICAgIDwvdGFibGU+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJzYXZlIiBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS5maW5pc2h9Ii8+DQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwgYi9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxN2ViZDkuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9ImFkZCB1c2VyIiBhY3Rpb249ImFkZFVzZXIiLz48YnIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0iY2hhbmdlIG5pY2sgbmFtZSIgYWN0aW9uPSJjaGFuZ2VOaWNrTmFtZSIvPjxici8+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJjaGFuZ2UgcGFzc3dvcmQiIGFjdGlvbj0iY2hhbmdlUGFzc3dvcmQiLz48YnIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRMaW5rIHRleHQ9Im1vZGU6ICN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ucm9sZX0iDQotICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS5zd2l0Y2hNb2RlfSIgaW1tZWRpYXRlPSJ0cnVlIi8+DQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbCBiL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGY2YjA2Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczpjPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dHZhbC9kZW1vL2NvbXBvbmVudHMiDQotICAgICAgICA+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotDQotICAgICAgICA8Yzp1c2VyRm9ybSBiZWFuPSIje3JlZ2lzdHJhdGlvblBhZ2V9Ii8+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJzYXZlIiBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS5maW5pc2h9Ii8+DQotDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmFmYjM5Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLmRvbWFpbi5QZXJzb247Ci0KLS8qKgotICogQSB0eXBpY2FsIHNpbXBsZSBiYWNraW5nIGJlYW4sIHRoYXQgaXMgYmFja2VkIHRvIDxjb2RlPmhlbGxvd29ybGQuanNwPC9jb2RlPgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkQ29udHJvbGxlcgotewotICAgIHByaXZhdGUgUGVyc29uIHBlcnNvbiA9IG5ldyBQZXJzb24oKTsKLQotICAgIC8qKgotICAgICAqIGRlZmF1bHQgZW1wdHkgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgSGVsbG9Xb3JsZENvbnRyb2xsZXIoKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdGhhdCBpcyBiYWNrZWQgdG8gYSBzdWJtaXQgYnV0dG9uIG9mIGEgZm9ybS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHNlbmQoKQotICAgIHsKLSAgICAgICAgLy9kbyByZWFsIGxvZ2ljLCByZXR1cm4gYSBzdHJpbmcgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciB0aGUgbmF2aWdhdGlvbiBzeXN0ZW0gb2YgSlNGCi0gICAgICAgIHJldHVybiAic3VjY2VzcyI7Ci0gICAgfQotCi0gICAgcHVibGljIFBlcnNvbiBnZXRQZXJzb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBlcnNvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzb24oUGVyc29uIHBlcnNvbikKLSAgICB7Ci0gICAgICAgIHRoaXMucGVyc29uID0gcGVyc29uOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjY0NGQwLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQwotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMC8vRU4iCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlcy1jb25maWc+Ci0JCi0JPCEtLSBtYW5hZ2VkIGJlYW5zIG9mIHRoZSBzaW1wbGUgaGVsbG8gd29ybGQgYXBwIC0tPgotCTxtYW5hZ2VkLWJlYW4+Ci0JCTxtYW5hZ2VkLWJlYW4tbmFtZT5oZWxsb1dvcmxkPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLQkJPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuSGVsbG9Xb3JsZENvbnRyb2xsZXI8L21hbmFnZWQtYmVhbi1jbGFzcz4KLQkJPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0JPC9tYW5hZ2VkLWJlYW4+Ci0JCi0JPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciBoZWxsb1dvcmxkLmpzcCAtLT4KLQk8bmF2aWdhdGlvbi1ydWxlPgotCQk8ZnJvbS12aWV3LWlkPi9oZWxsb1dvcmxkLmpzcDwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5zdWNjZXNzPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vcGFnZTIuanNwPC90by12aWV3LWlkPgotCQk8L25hdmlnYXRpb24tY2FzZT4KLQk8L25hdmlnYXRpb24tcnVsZT4KLQkKLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIHBhZ2UyLmpzcCAtLT4KLQk8bmF2aWdhdGlvbi1ydWxlPgotCQk8ZnJvbS12aWV3LWlkPi9wYWdlMi5qc3A8L2Zyb20tdmlldy1pZD4KLQkJPG5hdmlnYXRpb24tY2FzZT4KLQkJCTxmcm9tLW91dGNvbWU+YmFjazwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L2hlbGxvV29ybGQuanNwPC90by12aWV3LWlkPgotCQk8L25hdmlnYXRpb24tY2FzZT4KLQk8L25hdmlnYXRpb24tcnVsZT4KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNGExODMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLSAgICAgICAgIHZlcnNpb249IjIuNCI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+TXlQcm9qZWN0IHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0gICAgPCEtLW9wdGlvbmFsOiBjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgVVJJcyBvZiAoYWRkaXRpb25hbCkgZmFjZXMgY29uZmlnIGZpbGVzLgotICAgICAgICAgICAgKGUuZy4gL1dFQi1JTkYvbXktY29uZmlnLnhtbCkKLSAgICAgICAgICAgIFNlZSBKU0YgMS4wIFBSRDIsIDEwLjMuMgotICAgICAgICAgICAgQXR0ZW50aW9uOiBZb3UgZG8gbm90IG5lZWQgdG8gcHV0IC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgaW4gaGVyZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuQ09ORklHX0ZJTEVTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L1dFQi1JTkYvZXhhbXBsZXMtY29uZmlnLnhtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtLS0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5TdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNsaWVudDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLk5VTUJFUl9PRl9WSUVXU19JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkgYW5kIGlmCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04gaXMgdHJ1ZSAoPSBkZWZhdWx0KQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4gSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUKLSAgICAgICAgICAgIHJlbmRlcmVkIEhUTUwgb3V0cHV0LgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgbm90IGFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLgotICAgICAgICAgICAgaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90Ci0gICAgICAgICAgICBpbmZsdWVuY2UgdGhlIEhUTUwgY29kZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIGEgamF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRoYXQgaXMgYWJsZSB0byByZXN0b3JlIHRoZQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMKLSAgICAgICAgICAgIHdpdGggbG9uZyBsaXN0cyBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcAotICAgICAgICAgICAgaWYgeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZSBwYWdlLgotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BVVRPX1NDUk9MTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQotICAgICAgICAgICAgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucwotICAgICAgICAgICAgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IgZGlmZmVuZW50IGVuY3J5cHRpb24gc3RyZW5ndGhzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VDUkVUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+TnpZMU5ETXlNVEE9PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmFsaWRhdGUgbWFuYWdlZCBiZWFucywgbmF2aWdhdGlvbiBydWxlcyBhbmQgZW5zdXJlIHRoYXQgZm9ybXMgYXJlIG5vdCBuZXN0ZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVHJlYXQgcmVhZG9ubHkgc2FtZSBhcyBpZiBkaXNhYmxlZCBhdHRyaWJ1dGUgd2FzIHNldCBmb3Igc2VsZWN0IGVsZW1lbnRzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUkVBRE9OTFlfQVNfRElTQUJMRURfRk9SX1NFTEVDVFM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBVc2UgdGhlIGRlZmluZWQgY2xhc3MgYXMgdGhlIGNsYXNzIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSByZXNvdXJjZSBpcyBhZGRlZCB0byB0aGUKLSAgICAgICAgICAgIEV4dGVuc2lvbkZpbHRlciBoYW5kbGluZy4gVXNpbmcgU3RyZWFtaW5nQWRkUmVzb3VyY2UgaGVyZSBoZWxwcyB3aXRoIHBlcmZvcm1hbmNlLiBJZiB5b3Ugd2FudCB0byBhZGQKLSAgICAgICAgICAgIGN1c3RvbSBjb21wb25lbnRzIGFuZCB3YW50IHRvIHVzZSB0aGUgRXh0ZW5zaW9uRmlsdGVyLCB5b3UgbmVlZCB0byBwcm92aWRlIHlvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIGhlcmUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BRERfUkVTT1VSQ0VfQ0xBU1M8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwudXRpbC5EZWZhdWx0QWRkUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgICAgIAotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZpcnR1YWwgcGF0aCBpbiB0aGUgVVJMIHdoaWNoIHRyaWdnZXJzIGxvYWRpbmcgb2YgcmVzb3VyY2VzIGZvciB0aGUgTXlGYWNlcyBleHRlbmRlZCBjb21wb25lbnRzCi0gICAgICAgICAgICBpbiB0aGUgRXh0ZW5zaW9uRmlsdGVyLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUkVTT1VSQ0VfVklSVFVBTF9QQVRIPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L2ZhY2VzL215RmFjZXNFeHRlbnNpb25SZXNvdXJjZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBDaGVjayBpZiB0aGUgZXh0ZW5zaW9ucy1maWx0ZXIgaGFzIGJlZW4gcHJvcGVybHkgY29uZmlndXJlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNIRUNLX0VYVEVOU0lPTlNfRklMVEVSPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBEZWZpbmUgcGFydGlhbCBzdGF0ZSBzYXZpbmcgYXMgdHJ1ZS9mYWxzZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuUEFSVElBTF9TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0KLSAgICA8IS0tIExpc3RlbmVyLCB0byBhbGxvdyBKZXR0eSBzZXJ2aW5nIE15RmFjZXMgYXBwcyAtLT4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMud2ViYXBwLlN0YXJ0dXBTZXJ2bGV0Q29udGV4dExpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IC0tPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmcgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4qLmpzZjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4LmpzcDwvd2VsY29tZS1maWxlPgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcCBiL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDgyZDUzLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgcGFnZSBzZXNzaW9uPSJmYWxzZSIlPgotPCUKLXJlc3BvbnNlLnNlbmRSZWRpcmVjdCgiaGVsbG9Xb3JsZC5qc2YiKTsKLSU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AgYi9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFjODUyMy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwlLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tJT4KLQotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgICAgPGY6dmlldz4KLSAgICAgICAgICAgIDxoOmZvcm0gaWQ9Im1haW5Gb3JtIj4KLSAgICAgICAgICAgICAgICA8aDI+PGg6b3V0cHV0VGV4dCB2YWx1ZT0iSGVsbG8gI3toZWxsb1dvcmxkLnBlcnNvbi5maXJzdE5hbWV9ICN7aGVsbG9Xb3JsZC5wZXJzb24ubGFzdE5hbWV9LiBXZSBob3BlIHlvdSBlbmpveSBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciEiLz48L2gyPgotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIGFjdGlvbj0iYmFjayI+Ci0gICAgICAgICAgICAgICAgICAgIDxoOm91dHB1dFRleHQgdmFsdWU9IkhvbWUiLz4KLSAgICAgICAgICAgICAgICA8L2g6Y29tbWFuZExpbms+Ci0gICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgPC9mOnZpZXc+Ci0gICAgPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9wb20ueG1sIGIvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMWJkZmMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotDQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBwcm9qZWN0PC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjEuNC1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPHNjbT4NCi0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlczwvY29ubmVjdGlvbj4NCi0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXM8L2RldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXM8L3VybD4NCi0gICAgPC9zY20+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDwhLS1UaGlzIHBsdWdpbiBhbGxvd3MgdG8gcnVuIHRoZSBleGFtcGxlIHVzaW5nIG12biBqZXR0eTpydW4gLS0+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZXR0eS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjYuMS44PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjEwPC9zY2FuSW50ZXJ2YWxTZWNvbmRzPg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotICAgIDxtb2R1bGVzPg0KLSAgICAgICAgPG1vZHVsZT5oZWxsb193b3JsZDwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5oZWxsb19iZWFuLXZhbGlkYXRpb248L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+ZmVhdHVyZS1zZXRfMDE8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+ZmVhdHVyZS1zZXRfMDI8L21vZHVsZT4NCi0gICAgPC9tb2R1bGVzPg0KLQ0KLSAgICA8cHJvZmlsZXM+DQotICAgICAgICA8IS0tIFRoaXMgcHJvZmlsZSBpcyBpbnZva2VkIGJ5IC1EcHJlcGFyZVJlbGVhc2U9dHJ1ZS4gIFRoaXMgYWxsb3dzIG12biByZWxlYXNlOnByZXBhcmUgdG8NCi0gICAgICAgICAgICBydW4gc3VjY2Vzc2Z1bGx5IG9uIHRoZSBhc3NlbWJseSBwcm9qZWN0cy4gLS0+DQotICAgICAgICA8cHJvZmlsZT4NCi0gICAgICAgICAgICA8aWQ+cHJlcGFyZS1yZWxlYXNlPC9pZD4NCi0gICAgICAgICAgICA8YWN0aXZhdGlvbj4NCi0gICAgICAgICAgICAgICAgPHByb3BlcnR5Pg0KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+cHJlcGFyZVJlbGVhc2U8L25hbWU+DQotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPg0KLSAgICAgICAgICAgIDxtb2R1bGVzPg0KLSAgICAgICAgICAgICAgICA8bW9kdWxlPmFzc2VtYmx5PC9tb2R1bGU+DQotICAgICAgICAgICAgPC9tb2R1bGVzPg0KLSAgICAgICAgICAgIDxidWlsZD4NCi0gICAgICAgICAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnRzPi1EcHJlcGFyZVJlbGVhc2U8L2FyZ3VtZW50cz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPg0KLSAgICAgICAgICAgIDwvYnVpbGQ+DQotICAgICAgICA8L3Byb2ZpbGU+DQotICAgIDwvcHJvZmlsZXM+DQotDQotICAgIDxwcm9wZXJ0aWVzPg0KLSAgICAgICAgPHRyaW5pZGFkLnZlcnNpb24+MS4wLjk8L3RyaW5pZGFkLnZlcnNpb24+DQotICAgIDwvcHJvcGVydGllcz4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3BhcmVudC9MSUNFTlNFLnR4dCBiL2JyYW5jaF9mb3JfanNmXzFfMS9wYXJlbnQvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDU2OTUuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3BhcmVudC9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3BhcmVudC9OT1RJQ0UudHh0IGIvYnJhbmNoX2Zvcl9qc2ZfMV8xL3BhcmVudC9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGYzNjNhLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzFfMS9wYXJlbnQvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IKLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvcGFyZW50L3BvbS54bWwgYi9icmFuY2hfZm9yX2pzZl8xXzEvcGFyZW50L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MmQyYzguLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3BhcmVudC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0KLSAgLSBQYXJlbnQgcG9tIG9mIGFsbCB0aGUgbXlmYWNlcyBleHRlbnNpb25zIHZhbGlkYXRvciBzdWJwcm9qZWN0cyAKLSAgICB0aGF0IGhlbHAgdG8gYnVpbGQgb3RoZXIgbXlmYWNlcyBwcm9qZWN0cy4KLSAgLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjk8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMS40PC92ZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgUHJvamVjdCBQYXJlbnQ8L25hbWU+Ci0gICAgPHVybD5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTE8L3VybD4KLQotICAgIDxpc3N1ZU1hbmFnZW1lbnQ+Ci0gICAgICAgIDxzeXN0ZW0+amlyYTwvc3lzdGVtPgotICAgICAgICA8dXJsPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9FWFRWQUw8L3VybD4KLSAgICA8L2lzc3VlTWFuYWdlbWVudD4KLQotICAgIDxjaU1hbmFnZW1lbnQ+Ci0gICAgICAgIDxzeXN0ZW0+Y29udGludXVtPC9zeXN0ZW0+Ci0gICAgICAgIDx1cmw+aHR0cDovL215ZmFjZXMuem9uZXMuYXBhY2hlLm9yZzo4MDgwL2NvbnRpbnV1bTwvdXJsPgotICAgICAgICA8bm90aWZpZXJzPgotICAgICAgICAgICAgPG5vdGlmaWVyPgotICAgICAgICAgICAgICAgIDx0eXBlPm1haWw8L3R5cGU+Ci0gICAgICAgICAgICAgICAgPHNlbmRPblN1Y2Nlc3M+dHJ1ZTwvc2VuZE9uU3VjY2Vzcz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGFkZHJlc3M+Y29tbWl0c0BteWZhY2VzLmFwYWNoZS5vcmc8L2FkZHJlc3M+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9ub3RpZmllcj4KLSAgICAgICAgPC9ub3RpZmllcnM+Ci0gICAgPC9jaU1hbmFnZW1lbnQ+Ci0gICAgCi0gICAgPGluY2VwdGlvblllYXI+MjAwODwvaW5jZXB0aW9uWWVhcj4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn08L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD5NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotCi0gICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgotICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KLQotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLQotICAgICAgICAgICAgICAgICAgICAtIENvcHkgTElDRU5TRS50eHQgYW5kIE5PVElDRS50eHQgc28gdGhhdCB0aGV5IGFyZSBpbmNsdWRlZAotICAgICAgICAgICAgICAgICAgICAtIGluIHRoZSAtamF2YWRvYyBqYXIgZmlsZSBmb3IgdGhlIGNvbXBvbmVudC4KLSAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5qYXZhZG9jLnJlc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2FwaWRvY3MvTUVUQS1JTkYiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJMSUNFTlNFLnR4dCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJOT1RJQ0UudHh0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+amF2YWRvYy5zaXRlLmNvcHk8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnNpdGU8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ29weSBqYXZhZG9jIHRvIGFub3RoZXIgZGlyZWN0b3J5LCB0byBrZWVwIGphdmFkb2Mgb2YgcHJldmlvdXMgdmVyc2lvbnMgb24gc2l0ZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3NpdGUvYXBpZG9jcy0ke3Byb2plY3QudmVyc2lvbn0iIGZhaWxvbmVycm9yPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zaXRlL2FwaWRvY3MiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDwhLS0KLSAgICAgICAgICAgICAgICAtIE1ha2UgYSBjaGVja3N0eWxlIHZpb2xhdGlvbiBhIGNvbXBpbGUgZXJyb3IuIE5vdGUgdGhhdCBpZiBhIGNvbXBpbGUgZXJyb3Igb2NjdXJzLAotICAgICAgICAgICAgICAgIC0gZnVydGhlciBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGFyZ2V0L3NpdGUvY2hlY2tzdHlsZS5odG1sIChwcmVzZW50IGV2ZW4gd2hlbgotICAgICAgICAgICAgICAgIC0ganVzdCB0aGUgY29tcGlsZSBnb2FsIGFuZCBub3QgdGhlIHNpdGUgZ29hbCBoYXMgYmVlbiBydW4pLiBOb3RlIGFsc28gdGhhdCBjaGlsZAotICAgICAgICAgICAgICAgIC0gcHJvamVjdHMgbWF5IHJlZGVjbGFyZSB0aGlzIHBsdWdpbiBhbmQgcHJvdmlkZSBkaWZmZXJlbnQgY29uZmlndXJhdGlvbiBzZXR0aW5ncwotICAgICAgICAgICAgICAgIC0gdG8gdXNlIGRpZmZlcmVudCBjaGVja3MgKG1vcmUgb3IgbGVzcyBzdHJpY3QgdGhhbiB0aGUgZGVmYXVsdCkuCi0gICAgICAgICAgICAtLT4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY2hlY2tzdHlsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnZlcmlmeS1zdHlsZTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jaGVjazwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1jaGVja3Mtc3RhbmRhcmQueG1sPC9jb25maWdMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGhlYWRlckxvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1oZWFkZXIudHh0PC9oZWFkZXJMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS0gU2V0IGNvbXBpbGUgc291cmNlIGF0IDEuNSwgc2luY2UgdGhlIHRhcmdldCBKU0YgaW1wbCBpcyAxLjIgLS0+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4KLSAgICAgICAgICAgICAgICAgICAgPG9wdGltaXplPmZhbHNlPC9vcHRpbWl6ZT4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4gICAgICAgICAgICAKLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLSAgICA8cmVwb3NpdG9yaWVzPgotICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5tYXZlbjItcmVwb3NpdG9yeS5kZXYuamF2YS5uZXQ8L2lkPgotICAgICAgICAgICAgPG5hbWU+SmF2YS5uZXQgUmVwb3NpdG9yeSBmb3IgTWF2ZW48L25hbWU+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9kb3dubG9hZC5qYXZhLm5ldC9tYXZlbi8xLzwvdXJsPgotICAgICAgICAgICAgPGxheW91dD5sZWdhY3k8L2xheW91dD4KLSAgICAgICAgPC9yZXBvc2l0b3J5PgotICAgIDwvcmVwb3NpdG9yaWVzPgotCi0gICAgPHJlcG9ydGluZz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qeHItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1yZXBvcnQtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4zPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3QtaW5mby1yZXBvcnRzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjAuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbWQtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHJ1bGVzZXRzPgotICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL2Jhc2ljLnhtbDwvcnVsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxydWxlc2V0Pi9ydWxlc2V0cy91bnVzZWRjb2RlLnhtbDwvcnVsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgPC9ydWxlc2V0cz4KLSAgICAgICAgICAgICAgICAgICAgPGxpbmtYcmVmPnRydWU8L2xpbmtYcmVmPgotICAgICAgICAgICAgICAgICAgICA8bWluaW11bVRva2Vucz4xMDA8L21pbmltdW1Ub2tlbnM+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXRKZGs+MS41PC90YXJnZXRKZGs+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGVja3N0eWxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWdMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0YW5kYXJkLnhtbDwvY29uZmlnTG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxoZWFkZXJMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtaGVhZGVyLnR4dDwvaGVhZGVyTG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L3JlcG9ydGluZz4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RhZ3MvZXh0dmFsLTEuMS40L2JyYW5jaF9mb3JfanNmXzFfMS9wYXJlbnQ8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90YWdzL2V4dHZhbC0xLjEuNC9icmFuY2hfZm9yX2pzZl8xXzEvcGFyZW50PC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90YWdzL2V4dHZhbC0xLjEuNC9icmFuY2hfZm9yX2pzZl8xXzEvcGFyZW50PC91cmw+Ci0gICAgPC9zY20+Ci0KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgICAgPHNpdGU+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTE8L3VybD4KLSAgICAgICAgPC9zaXRlPgotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtYXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wZXJmb3JtUmVsZWFzZTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvY3M8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxqc2YudmVyc2lvbj4xLjEuNTwvanNmLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3BhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbCBiL2JyYW5jaF9mb3JfanNmXzFfMS9wYXJlbnQvc3JjL3NpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMzI4ZjMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3BhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCBuYW1lPSJBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciI+Ci0gIDxiYW5uZXJMZWZ0PgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dFZhbDwvbmFtZT4KLSAgICA8c3JjPmltYWdlcy9leHR2YWxfbG9nby5wbmc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2luZGV4Lmh0bWw8L2hyZWY+Ci0gIDwvYmFubmVyTGVmdD4KLQotICA8YmFubmVyUmlnaHQ+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXM8L25hbWU+Ci0gICAgPHNyYz5pbWcvYmFubmVycy9NeUZhY2VzX2xvZ28uanBnPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sPC9ocmVmPgotICA8L2Jhbm5lclJpZ2h0PgotCi0gIDxwdWJsaXNoRGF0ZSBmb3JtYXQ9ImRkIE1NTSB5eXl5Ii8+Ci0KLSAgPHNraW4+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLm1hdmVuPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtc2l0ZS1za2luPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvc2tpbj4KLQotICA8Ym9keT4KLSAgICA8bGlua3M+Ci0gICAgICA8aXRlbSBuYW1lPSJBcGFjaGUiIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZyIvPgotICAgICAgPGl0ZW0gbmFtZT0iTXlGYWNlcyIgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCBNeWZhY2VzIEV4dFZhbCIgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9kb3dubG9hZC5odG1sIi8+Ci0gICAgPC9saW5rcz4KLQotICAgIDxtZW51IG5hbWU9IkFwYWNoZSBNeUZhY2VzIiBpbmhlcml0PSJ0b3AiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZG93bmxvYWQuaHRtbCIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IG5hbWU9IkNvbnRlbnRzIiBpbmhlcml0PSJ0b3AiPgotICAgICAgICA8aXRlbSBuYW1lPSJNYWluIFNpdGUiICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sIi8+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkV4dFZhbCBmb3IgSlNGIDEuMSIgICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJDb3JlIE1vZHVsZSIgICAgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS9teWZhY2VzLWV4dHZhbC1jb3JlL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iQmVhbiBWYWxpZGF0aW9uIiAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS92YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb24vaW5kZXguaHRtbCIvPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJQcm9wZXJ0eSBWYWxpZGF0aW9uIiAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS92YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iVHJpbmlkYWQgU3VwcG9ydCIgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQvaW5kZXguaHRtbCIvPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJHZW5lcmljIFN1cHBvcnQiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS9jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0L2luZGV4Lmh0bWwiLz4KLSAgICAgICAgPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjIiICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2luZGV4Lmh0bWwiIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9ImR1bW15IiAgICAgICAgaHJlZj0iZHVtbXkiLz4KLSAgICAgICAgPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAyLjAiICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjIwL2luZGV4Lmh0bWwiIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9ImR1bW15IiAgICAgICAgaHJlZj0iZHVtbXkiLz4KLSAgICAgICAgPC9pdGVtPgotICAgIDwvbWVudT4KLQkKLSAgICA8bWVudSBuYW1lPSJEb2N1bWVudGF0aW9uIj4KLSAgICAgIDxpdGVtIG5hbWU9Ildpa2kiICAgICAgICAgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9teWZhY2VzL0V4dGVuc2lvbnMvVmFsaWRhdG9yLyIvPgotICAgICAgPGl0ZW0gbmFtZT0iSmF2YWRvYyIgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvamF2YWRvYy5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgcmVmPSJyZXBvcnRzIi8+Ci0KLSAgICA8bWVudSBuYW1lPSJGb3VuZGF0aW9uIiBpbmhlcml0PSJib3R0b20iPgotICAgICAgPGl0ZW0gbmFtZT0iQVNGIiAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iIC8+Ci0gICAgICA8aXRlbSBuYW1lPSJTcG9uc29yc2hpcCIgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vc3BvbnNvcnNoaXAuaHRtbCIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlRoYW5rcyIgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi90aGFua3MuaHRtbCIgLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9wb20ueG1sIGIvYnJhbmNoX2Zvcl9qc2ZfMV8xL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNGQwYzEuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjk8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtbW9kdWxlPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMS40PC92ZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgTW9kdWxlPC9uYW1lPgotICAgIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExPC91cmw+Ci0gICAgCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGFncy9leHR2YWwtMS4xLjQvYnJhbmNoX2Zvcl9qc2ZfMV8xPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGFncy9leHR2YWwtMS4xLjQvYnJhbmNoX2Zvcl9qc2ZfMV8xPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90YWdzL2V4dHZhbC0xLjEuNC9icmFuY2hfZm9yX2pzZl8xXzE8L3VybD4KLSAgICA8L3NjbT4gICAgCi0KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgICAgPHNpdGU+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTI8L3VybD4KLSAgICAgICAgPC9zaXRlPgotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotICAgIDwhLS0gV0FSTklORzogRE8gTk9UIEdFTkVSQVRFIFNJVEUgRlJPTSBIRVJFIERJUkVDVExZCi0gICAgU2luY2UgdGhpcyBwcm9qZWN0IGhhcyBhbiBhc3luYyByZWxlYXNlIHByb2NlZHVyZSAobm90Ci0gICAgYWxsIG1vZHVsZXMgc2hvdWxkIGJlIHJlbGVhc2VkIGF0IG9uY2UpLCB0aGUgcGFyZW50IHBvbS54bWwgCi0gICAgaXMgbm90IHRoaXMgKHRoZXJlIGlzIGEgbW9kdWxlIGZvciB0aGF0KS4gVXNlIG1hdmVuIHNpdGUgCi0gICAgcGx1Z2luIGhlcmUgY2F1c2UgcHJvYmxlbXMgd2hlbiB0aGUgc2l0ZSBpcyBnZW5lcmF0ZWQuCi0gICAgVGhlIHByb2NlZHVyZSBtdXN0IGV4ZWN1dGUgc2l0ZSBjb21tbWFuZCBmaXJzdCBvbiBwYXJlbnQgCi0gICAgbW9kdWxlIGFuZCB0aGVuIG9uIGVhY2ggbW9kdWxlIGxpc3RlZCBiZWxvdy4gCi0gICAgIC0tPgotCi0gICAgPG1vZHVsZXM+Ci0gICAgICAgIDxtb2R1bGU+cGFyZW50PC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+Y29yZTwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPnZhbGlkYXRpb24tbW9kdWxlczwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmNvbXBvbmVudC1zdXBwb3J0PC9tb2R1bGU+Ci0gICAgICAgIDwhLS1tb2R1bGU+dGVzdC1tb2R1bGVzPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+ZXhhbXBsZXM8L21vZHVsZS0tPgotICAgIDwvbW9kdWxlcz4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPCEtLSBUaGlzIHByb2ZpbGUgaXMgaW52b2tlZCBieSAtRHByZXBhcmVSZWxlYXNlPXRydWUuICBUaGlzIGFsbG93cyBtdm4gcmVsZWFzZTpwcmVwYXJlIHRvCi0gICAgICAgICAgICBydW4gc3VjY2Vzc2Z1bGx5IG9uIHRoZSBhc3NlbWJseSBwcm9qZWN0cy4gLS0+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPnByZXBhcmUtcmVsZWFzZTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPnByZXBhcmVSZWxlYXNlPC9uYW1lPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8bW9kdWxlcz4KLSAgICAgICAgICAgICAgICA8bW9kdWxlPmFzc2VtYmx5PC9tb2R1bGU+Ci0gICAgICAgICAgICA8L21vZHVsZXM+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZWxlYXNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+LURwcmVwYXJlUmVsZWFzZTwvYXJndW1lbnRzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLQotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8anNmLnZlcnNpb24+MS4xLjU8L2pzZi52ZXJzaW9uPgotICAgIDwvcHJvcGVydGllcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcG9tLnhtbCBiL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I1NWYyYi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD50ZXN0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBUZXN0LU1vZHVsZXM8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4xLjQtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlczwvY29ubmVjdGlvbj4NCi0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzPC9kZXZlbG9wZXJDb25uZWN0aW9uPg0KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlczwvdXJsPg0KLSAgICA8L3NjbT4NCi0NCi0gICAgPG1vZHVsZXM+DQotICAgICAgICA8bW9kdWxlPmJhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZTwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5jb3JlLXRlc3RzPC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPnByb3BlcnR5LXZhbGlkYXRpb24tdGVzdHM8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+YmVhbi12YWxpZGF0aW9uLXRlc3RzPC9tb2R1bGU+DQotCQk8bW9kdWxlPnRyaW5pZGFkLWNvbXBvbmVudC1zdXBwb3J0LXRlc3RzPC9tb2R1bGU+DQotICAgIDwvbW9kdWxlcz4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuNTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0LmpzcDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3AtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnNoYWxlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNoYWxlLXRlc3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjQ8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgICAgIDxleGNsdXNpb25zPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5teWZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCi0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cmVzb3VyY2VzPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICA8L3Jlc291cmNlcz4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLQ0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD50ZXN0LWphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4yPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9BYnN0cmFjdCouamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9CYXNlKi5qYXZhPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL1Rlc3RVdGlscy5qYXZhPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypCZWFuLmphdmE8L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPg0KLQkJCQkJPHVzZVN5c3RlbUNsYXNzTG9hZGVyPnRydWU8L3VzZVN5c3RlbUNsYXNzTG9hZGVyPg0KLQkJCQkJPGZvcmtNb2RlPm9uY2U8L2ZvcmtNb2RlPg0KLQkJCQkJPGFyZ0xpbmU+LVhteDEwMjRtIC1YWDpNYXhQZXJtU2l6ZT01MTJtPC9hcmdMaW5lPg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcG9tLnhtbCBiL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBjZTJkOC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgVmFsaWRhdGlvbi1Nb2R1bGVzPC9uYW1lPgotICAgIDx2ZXJzaW9uPjEuMS40PC92ZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS40PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGFncy9leHR2YWwtMS4xLjQvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlczwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RhZ3MvZXh0dmFsLTEuMS40L2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXM8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RhZ3MvZXh0dmFsLTEuMS40L2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXM8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxtb2R1bGVzPgotICAgICAgICA8bW9kdWxlPnByb3BlcnR5LXZhbGlkYXRpb248L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5iZWFuLXZhbGlkYXRpb248L21vZHVsZT4KLSAgICA8L21vZHVsZXM+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuNDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWU5NjdhLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgICAgIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZU5hbWUgPSBudWxsOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VOYW1lID0gc3VwZXIuZ2V0QmFzZU5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBiYXNlTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTGVuZ3RoU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkMDU1OC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMZW5ndGhTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBMZW5ndGggYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTGVuZ3RoLmNsYXNzKTsNCi0gICAgICAgIExlbmd0aFZhbGlkYXRvciBsZW5ndGhWYWxpZGF0b3IgPSAoTGVuZ3RoVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5MZW5ndGgiKTsNCi0NCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJc1R5cGUuamF2YSBiL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJc1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1ZjQ4Mi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJiZWZvcmVPclNhbWUsIGFmdGVyT3JTYW1lIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgZW51bSBEYXRlSXNUeXBlDQotew0KLSAgICBiZWZvcmUsIGFmdGVyLCBzYW1lDQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q3NjU5ZS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgICAgIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZU5hbWUgPSBudWxsOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VOYW1lID0gc3VwZXIuZ2V0QmFzZU5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBiYXNlTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvYXNzZW1ibHkvcG9tLnhtbCBiL2JyYW5jaF9mb3JfanNmXzJfMC9hc3NlbWJseS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmQ5MDI1Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9hc3NlbWJseS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWFzc2VtYmx5MjA8L2FydGlmYWN0SWQ+DQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEFzc2VtYmx5PC9uYW1lPg0KLSAgICA8ZGVzY3JpcHRpb24+TXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBBc3NlbWJseSBpcyB1c2VkIHRvIGdlbmVyYXRlIA0KLSAgICAuemlwIGFuZCAudGFyLmd6IGRpc3RyaWJ1dGlvbnMgPC9kZXNjcmlwdGlvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjIuMC40LVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPHNjbT4NCi0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzJfMC9hc3NlbWJseTwvY29ubmVjdGlvbj4NCi0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy9icmFuY2hfZm9yX2pzZl8yXzAvYXNzZW1ibHk8L2RldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy9icmFuY2hfZm9yX2pzZl8yXzAvYXNzZW1ibHk8L3VybD4NCi0gICAgPC9zY20+DQotICAgIA0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZGVwZW5kZW5jeS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1qYXZhZG9jPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+amF2YWRvYzwvY2xhc3NpZmllcj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZW5lcmljLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+amF2YWRvYzwvY2xhc3NpZmllcj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+amF2YWRvYzwvY2xhc3NpZmllcj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2JlYW4tdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9qYXZhZG9jPC9vdXRwdXREaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LXNvdXJjZTwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjb3JlLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtiZWFuLXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc3JjPC9vdXRwdXREaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8IS0tIEVYRUNVVEUgbXZuIHBhY2thZ2UgdG8gZ2VuZXJhdGUgYXNzZW1ibHkgZmlsZXMgLS0+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X3NyYzwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sPC9kZXNjcmlwdG9yPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsMjAtJHt2ZXJzaW9ufS1zcmM8L2ZpbmFsTmFtZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L291dDwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvd29yazwvd29ya0RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXR0YWNoZWQ8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9iaW48L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj4ke2Jhc2VkaXJ9L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmViaW4ueG1sPC9kZXNjcmlwdG9yPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsMjAtJHt2ZXJzaW9ufS1iaW48L2ZpbmFsTmFtZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L291dDwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvd29yazwvd29ya0RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXR0YWNoZWQ8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5wZXJzaXN0ZW5jZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnBlcnNpc3RlbmNlLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgPC9leGNsdXNpb25zPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtiZWFuLXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgICAgIDxleGNsdXNpb25zPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgudmFsaWRhdGlvbjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnZhbGlkYXRpb24tYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCi0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtnZW5lcmljLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgICAgIDxleGNsdXNpb25zPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y2dsaWI8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZ2xpYjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgPC9leGNsdXNpb25zPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPCEtLSBTaW5jZSBleHR2YWwgY291bGQgYmUgYXN5bmMgcmVsZWFzZWQsIGFuIGdlbmVyYXRlZCBhc3NlbWJseSBjb3VsZCBjb250YWluIGRpZmZlcmVudA0KLSAgICAgICAgIGFydGlmYWN0IHZlcnNpb25zIC0tPg0KLSAgICA8cHJvcGVydGllcz4NCi0gICAgICAgIDxjb3JlLnZlcnNpb24+Mi4wLjQtU05BUFNIT1Q8L2NvcmUudmVyc2lvbj4NCi0gICAgICAgIDx0cmluaWRhZC1zdXBwb3J0LnZlcnNpb24+Mi4wLjQtU05BUFNIT1Q8L3RyaW5pZGFkLXN1cHBvcnQudmVyc2lvbj4NCi0gICAgICAgIDxnZW5lcmljLXN1cHBvcnQudmVyc2lvbj4yLjAuNC1TTkFQU0hPVDwvZ2VuZXJpYy1zdXBwb3J0LnZlcnNpb24+DQotICAgICAgICA8cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9uPjIuMC40LVNOQVBTSE9UPC9wcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb24+DQotICAgICAgICA8YmVhbi12YWxpZGF0aW9uLnZlcnNpb24+Mi4wLjQtU05BUFNIT1Q8L2JlYW4tdmFsaWRhdGlvbi52ZXJzaW9uPg0KLSAgICA8L3Byb3BlcnRpZXM+DQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbCBiL2JyYW5jaF9mb3JfanNmXzJfMC9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRiMTBmNS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxhc3NlbWJseT4NCi0gIDxpZD5jb3JlYmluPC9pZD4NCi0gIDxmb3JtYXRzPg0KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0Pg0KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0Pg0KLSAgPC9mb3JtYXRzPg0KLSAgPGRlcGVuZGVuY3lTZXRzPg0KLSAgICA8ZGVwZW5kZW5jeVNldD4NCi0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4NCi0gICAgPC9kZXBlbmRlbmN5U2V0Pg0KLSAgPC9kZXBlbmRlbmN5U2V0cz4NCi0gIDxmaWxlU2V0cz4NCi0gICAgPGZpbGVTZXQ+DQotICAgIAk8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5Pg0KLSAgICAJPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4NCi0gICAgICA8aW5jbHVkZXM+DQotICAgICAgICA8aW5jbHVkZT5SRUFETUUqPC9pbmNsdWRlPg0KLSAgICAgICAgPGluY2x1ZGU+TElDRU5TRSo8L2luY2x1ZGU+DQotICAgICAgICA8aW5jbHVkZT5OT1RJQ0UqPC9pbmNsdWRlPg0KLSAgICAgICAgPGluY2x1ZGU+UkVMRUFTRSo8L2luY2x1ZGU+DQotICAgICAgPC9pbmNsdWRlcz4NCi0gICAgPC9maWxlU2V0Pg0KLSAgICA8ZmlsZVNldD4NCi0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9qYXZhZG9jPC9kaXJlY3Rvcnk+DQotICAgICAgPG91dHB1dERpcmVjdG9yeT5qYXZhZG9jPC9vdXRwdXREaXJlY3Rvcnk+DQotICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+DQotICAgICAgPC9pbmNsdWRlcz4NCi0gICAgPC9maWxlU2V0Pg0KLSAgPC9maWxlU2V0cz4NCi08L2Fzc2VtYmx5Pg0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3Jlc3JjLnhtbCBiL2JyYW5jaF9mb3JfanNmXzJfMC9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3Jlc3JjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcxZjZkNS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxhc3NlbWJseT4NCi0gIDxpZD5jb3Jlc3JjPC9pZD4NCi0gIDxmb3JtYXRzPg0KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0Pg0KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0Pg0KLSAgPC9mb3JtYXRzPiAgDQotICA8ZmlsZVNldHM+DQotICAgIDxmaWxlU2V0Pg0KLSAgICAJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgCTxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+DQotICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgPGluY2x1ZGU+UkVBRE1FKjwvaW5jbHVkZT4NCi0gICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UqPC9pbmNsdWRlPg0KLSAgICAgICAgPGluY2x1ZGU+Tk9USUNFKjwvaW5jbHVkZT4NCi0gICAgICAgIDxpbmNsdWRlPlJFTEVBU0UqPC9pbmNsdWRlPg0KLSAgICAgIDwvaW5jbHVkZXM+DQotICAgIDwvZmlsZVNldD4gICANCi0gICAgPGZpbGVTZXQ+DQotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvc3JjPC9kaXJlY3Rvcnk+DQotICAgICAgPG91dHB1dERpcmVjdG9yeT5zcmM8L291dHB1dERpcmVjdG9yeT4NCi0gICAgICA8aW5jbHVkZXM+DQotICAgICAgICA8aW5jbHVkZT4qLmphcjwvaW5jbHVkZT4NCi0gICAgICA8L2luY2x1ZGVzPg0KLSAgICA8L2ZpbGVTZXQ+DQotICA8L2ZpbGVTZXRzPg0KLTwvYXNzZW1ibHk+DQotIA0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9icmFuY2hfZm9yX2pzZl8yXzAvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL2JyYW5jaF9mb3JfanNmXzJfMC9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3BvbS54bWwgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NDJiZGIuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGU8L25hbWU+DQotICAgIDx2ZXJzaW9uPjIuMC40LVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4yLjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+Y2dsaWI8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2dsaWI8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4xXzM8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOTMwOTEuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyS2l0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5yZW5kZXJraXQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotDQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RJbnRlcmNlcHRvcjsNCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5LkVuaGFuY2VyOw0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kUHJveHk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsR2VuZXJpY1JlbmRlcktpdCBleHRlbmRzIEV4dFZhbFJlbmRlcktpdCBpbXBsZW1lbnRzIE1ldGhvZEludGVyY2VwdG9yDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFJlbmRlcktpdCBuZXdJbnN0YW5jZShSZW5kZXJLaXQgcmVuZGVyS2l0KQ0KLSAgICB7DQotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSByZW5kZXJLaXQuZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIC8vaXQncyBub3QgcG9zc2libGUgdG8gd3JhcCB0aGUgY29udmVydGVyIGFnYWluIC0gb2NjdXJzIGUuZy4gdW5kZXIgc29sYXJpcyArIGJlYSB3ZWJsb2dpYw0KLSAgICAgICAgaWYgKFByb3h5VXRpbHMuaXNQcm94aWVkQ2xhc3MoY3VycmVudENsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRW5oYW5jZXIgZW5oYW5jZXIgPSBuZXcgRW5oYW5jZXIoKTsNCi0gICAgICAgIGVuaGFuY2VyLnNldFN1cGVyY2xhc3MocmVuZGVyS2l0LmdldENsYXNzKCkpOw0KLSAgICAgICAgZW5oYW5jZXIuc2V0Q2FsbGJhY2sobmV3IEV4dFZhbEdlbmVyaWNSZW5kZXJLaXQocmVuZGVyS2l0KSk7DQotICAgICAgICBlbmhhbmNlci5zZXRDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsNCi0NCi0gICAgICAgIHJldHVybiAoUmVuZGVyS2l0KSBlbmhhbmNlci5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGludGVyY2VwdChPYmplY3Qgb2JqLCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzLCBNZXRob2RQcm94eSBwcm94eSkgdGhyb3dzIFRocm93YWJsZQ0KLSAgICB7DQotICAgICAgICBpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0UmVuZGVyZXIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZXIoKFN0cmluZylhcmdzWzBdLCAoU3RyaW5nKWFyZ3NbMV0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiYWRkUmVuZGVyZXIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRSZW5kZXJlcigoU3RyaW5nKWFyZ3NbMF0sIChTdHJpbmcpYXJnc1sxXSwgKFJlbmRlcmVyKWFyZ3NbMl0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7DQotICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKGdldFdyYXBwZWQoKSwgYXJncyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBwcm94eS5pbnZva2VTdXBlcihvYmosIGFyZ3MpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBFeHRWYWxHZW5lcmljUmVuZGVyS2l0KFJlbmRlcktpdCB3cmFwcGVkKQ0KLSAgICB7DQotICAgICAgICBzdXBlcih3cmFwcGVkKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIGNyZWF0ZVdyYXBwZXIoUmVuZGVyZXIgcmVuZGVyZXIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLm5ld0luc3RhbmNlKHJlbmRlcmVyKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmIwOGYyLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZEludGVyY2VwdG9yOwotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5FbmhhbmNlcjsKLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kUHJveHk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBmaW5hbCBjbGFzcyBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyIGV4dGVuZHMgRXh0VmFsUmVuZGVyZXJXcmFwcGVyIGltcGxlbWVudHMgTWV0aG9kSW50ZXJjZXB0b3IKLXsKLSAgICBwdWJsaWMgc3RhdGljIFJlbmRlcmVyIG5ld0luc3RhbmNlKFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gcmVuZGVyZXIuZ2V0Q2xhc3MoKTsKLQotICAgICAgICAvL3RvIGF2b2lkIHJlLXdyYXBwaW5nIC0gb2NjdXJzIGUuZy4gdW5kZXIgc29sYXJpcyArIGJlYSB3ZWJsb2dpYwotICAgICAgICBpZiAoUHJveHlVdGlscy5pc1Byb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBFbmhhbmNlciBlbmhhbmNlciA9IG5ldyBFbmhhbmNlcigpOwotICAgICAgICBlbmhhbmNlci5zZXRTdXBlcmNsYXNzKHJlbmRlcmVyLmdldENsYXNzKCkpOwotICAgICAgICBlbmhhbmNlci5zZXRDYWxsYmFjayhuZXcgRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlcihyZW5kZXJlcikpOwotICAgICAgICBlbmhhbmNlci5zZXRDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLQotICAgICAgICByZXR1cm4gKFJlbmRlcmVyKSBlbmhhbmNlci5jcmVhdGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGludGVyY2VwdChPYmplY3Qgb2JqLCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzLCBNZXRob2RQcm94eSBwcm94eSkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJnZXRDb252ZXJ0ZWRWYWx1ZSIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldENvbnZlcnRlZFZhbHVlKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0sIGFyZ3NbMl0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJkZWNvZGUiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlY29kZSgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZW5jb2RlQmVnaW4iKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZUJlZ2luKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJlbmNvZGVDaGlsZHJlbiIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlQ2hpbGRyZW4oKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImVuY29kZUVuZCIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlRW5kKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJjb252ZXJ0Q2xpZW50SWQiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29udmVydENsaWVudElkKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFN0cmluZylhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0UmVuZGVyc0NoaWxkcmVuIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRSZW5kZXJzQ2hpbGRyZW4oKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5maW5lc3QoIm1ldGhvZCAiICsgbWV0aG9kLmdldE5hbWUoKSArICIgY2FsbGVkIHdpdGhvdXQgcmVuZGVyaW5nLWludGVyY2VwdG9ycyIpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kLmludm9rZSh0aGlzLndyYXBwZWQsIGFyZ3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBwcm94eS5pbnZva2VTdXBlcihvYmosIGFyZ3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyKFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgewotICAgICAgICBzdXBlcih3cmFwcGVkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0dlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMwOTczOS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0dlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5DQotew0KLSAgICBwcml2YXRlIE1hcDxDbGFzczw/IGV4dGVuZHMgUmVuZGVyS2l0PiwgUmVuZGVyS2l0PiByZW5kZXJLaXRDYWNoZSA9DQotICAgICAgICAgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBSZW5kZXJLaXQ+LCBSZW5kZXJLaXQ+KCk7DQotDQotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KQ0KLSAgICB7DQotICAgICAgICBsb2dnZXIuZmluZXN0KCJleHR2YWwgcmVuZGVya2l0IHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcktpdC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgdmlhIGNnbGliIik7DQotDQotICAgICAgICBpZighdGhpcy5yZW5kZXJLaXRDYWNoZS5jb250YWluc0tleShyZW5kZXJLaXQuZ2V0Q2xhc3MoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgUmVuZGVyS2l0IHdyYXBwZWRSZW5kZXJLaXQgPSBFeHRWYWxHZW5lcmljUmVuZGVyS2l0Lm5ld0luc3RhbmNlKHJlbmRlcktpdCk7DQotICAgICAgICAgICAgdGhpcy5yZW5kZXJLaXRDYWNoZS5wdXQocmVuZGVyS2l0LmdldENsYXNzKCksIHdyYXBwZWRSZW5kZXJLaXQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyS2l0Q2FjaGUuZ2V0KHJlbmRlcktpdC5nZXRDbGFzcygpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NzMzMTQuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3N0YXJ0dXAvR2VuZXJpY01vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkFic3RyYWN0U3RhcnR1cExpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5yZW5kZXJraXQuR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgR2VuZXJpY01vZHVsZVN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0MzkyMTU2MDMyODc3NTE5NTU2TDsNCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKS5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5SRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmNsYXNzKS5hZGRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeShuZXcgR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS50eHQgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcueG1sIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZhY2Q3ZS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMl8wLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjIuMCI+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+DQotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMuc3RhcnR1cC5HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyDQotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZjYzMjAuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZSBwcm92aWRlcyBnZW5lcmljIFN1cHBvcnQgZm9yIEpTRiBjb21wb25lbnQgZnJhbWV3b3JrcyB3aGljaCBoYXZlIHNwZWNpYWwgcmVxdWlyZW1lbnRzIChlLmcuIFJpY2hGYWNlcywgTXlGYWNlcyBUb2JhZ28sIC4uLikuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLnggYW5kIEpTRiAyLnguIEFsbCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC9wb20ueG1sIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NDM3NjguLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotDQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQ29tcG9uZW50LVN1cHBvcnQgTW9kdWxlczwvbmFtZT4NCi0gICAgPHZlcnNpb24+Mi4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4yLjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxzY20+DQotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQ8L2Nvbm5lY3Rpb24+DQotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0PC9kZXZlbG9wZXJDb25uZWN0aW9uPg0KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0PC91cmw+DQotICAgIDwvc2NtPg0KLQ0KLSAgICA8bW9kdWxlcz4NCi0gICAgICAgIDwhLS1tb2R1bGU+dHJpbmlkYWQtc3VwcG9ydDwvbW9kdWxlLS0+DQotICAgICAgICA8bW9kdWxlPmdlbmVyaWMtc3VwcG9ydDwvbW9kdWxlPg0KLSAgICA8L21vZHVsZXM+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8cHJvcGVydGllcz4NCi0gICAgICAgIDx0cmluaWRhZC52ZXJzaW9uPjIuMC4wLWFscGhhLTI8L3RyaW5pZGFkLnZlcnNpb24+DQotICAgIDwvcHJvcGVydGllcz4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvcG9tLnhtbCBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZTlmNmIuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgVHJpbmlkYWQgU3VwcG9ydCBNb2R1bGU8L25hbWU+DQotICAgIDx2ZXJzaW9uPjIuMC40LVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4yLjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRGVmYXVsdEV4dFZhbFRyaW5pZGFkU3VwcG9ydE1vZHVsZUNvbmZpZ3VyYXRpb24uamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0RlZmF1bHRFeHRWYWxUcmluaWRhZFN1cHBvcnRNb2R1bGVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiODVhM2EuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRGVmYXVsdEV4dFZhbFRyaW5pZGFkU3VwcG9ydE1vZHVsZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSByNA0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRFeHRWYWxUcmluaWRhZFN1cHBvcnRNb2R1bGVDb25maWd1cmF0aW9uIGV4dGVuZHMgRXh0VmFsVHJpbmlkYWRTdXBwb3J0TW9kdWxlQ29uZmlndXJhdGlvbg0KLXsNCi0gICAgLyoNCi0gICAgICogd2ViLnhtbCBjb25maWcNCi0gICAgICovDQotDQotICAgIHB1YmxpYyBib29sZWFuIGRlYWN0aXZhdGVDbGllbnRTaWRlVmFsaWRhdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DTElFTlRfU0lERV9UUklOSURBRF9WQUxJREFUSU9OKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBkZWFjdGl2YXRlQ29yZU91dHB1dExhYmVsSW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfVFJJTklEQURfQ09SRV9PVVRQVVRfTEFCRUxfSU5JVElBTElaQVRJT04pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGRlYWN0aXZhdGVWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfVFJJTklEQURfVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MGViNjguLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi0vKioNCi0gKiBpbiBjYXNlIG9mIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gYSB0cmluaWRhZCBjbGllbnQgdmFsaWRhdG9yIGlzIGFkZGVkIHRvIHRoZSBjb21wb25lbnQgYmFzZWQgb24gdGhlIG1ldGEtZGF0YS4NCi0gKiBhdCB0aGUgcG9zdGJhY2s6IHRoZSBleHR2YWwgdmFsaWRhdGlvbiBzdHJhdGVneSBnZXRzIGNhbGxlZCBhbmQgYWZ0ZXIgdGhhdCB0aGUgYWRkZWQgdmFsaWRhdG9yLg0KLSAqIHRoaXMgd3JhcHBlciBwcmV2ZW50cyBzdWNoIGEgc2VydmVyLXNpZGUgZG91YmxlIHZhbGlkYXRpb24uDQotICogaXQganVzdCBkZWxlZ2F0ZXMgdGhlIGNsaWVudC1zaWRlIGZ1bmN0aW9uYWxpdHkuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIgaW1wbGVtZW50cyBWYWxpZGF0b3IsIENsaWVudFZhbGlkYXRvciwgU2VyaWFsaXphYmxlDQotew0KLSAgICBwcml2YXRlIHRyYW5zaWVudCBDbGllbnRWYWxpZGF0b3Igd3JhcHBlZDsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTQxNDU0Nzg0MTcwMDYyMTQxMEw7DQotDQotICAgIHB1YmxpYyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIoQ2xpZW50VmFsaWRhdG9yIGNsaWVudFZhbGlkYXRvcikNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gY2xpZW50VmFsaWRhdG9yOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHZhbGlkYXRlIC0gdGhlIGV4dHZhbCB2YWxpZGF0aW9uIHN0cmF0ZWd5IHdpbGwgZG8gdGhhdA0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50TGlicmFyeVNvdXJjZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRDbGllbnRMaWJyYXJ5U291cmNlKGZhY2VzQ29udGV4dCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRDbGllbnRJbXBvcnROYW1lcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudEltcG9ydE5hbWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRTY3JpcHQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudFNjcmlwdChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRTdXBwb3J0TW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRTdXBwb3J0TW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjdkMTcwLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkU3VwcG9ydE1vZHVsZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsTW9kdWxlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSByNA0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEV4dFZhbFRyaW5pZGFkU3VwcG9ydE1vZHVsZUNvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBFeHRWYWxNb2R1bGVDb25maWd1cmF0aW9uDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBFeHRWYWxDb250ZXh0IGV4dFZhbENvbnRleHQgPSBudWxsOw0KLQ0KLSAgICBwcm90ZWN0ZWQgRXh0VmFsVHJpbmlkYWRTdXBwb3J0TW9kdWxlQ29uZmlndXJhdGlvbigpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogRG9uJ3QgYWNjZXNzIEV4dFZhbENvbnRleHQgZHVyaW5nIGluaXRpYWxpemF0aW9uIG9mIHRoZSBjbGFzcy4gIE9wZW5XZWJCZWFucyBpbml0aWFsaXplcyBhbGwgY2xhc3NlcyBkdXJpbmcNCi0gICAgICogc3RhcnR1cCBvZiB0aGUgV2ViQ29udGFpbmVyLiAgZXh0VmFsQ29udGV4dCBjb25zdHJ1Y3RvciB0cmllcyB0byBhY2Nlc3MgV2ViLnhtbCBwYXJhbWV0ZXJzIHRocm91Z2ggRmFjZXNDb250ZXh0DQotICAgICAqIHdoaWNoIGlzbid0IGF2YWlsYWJsZSB5ZXQuDQotICAgICAqIEByZXR1cm4gVGhlIEV4dFZhbENvbnRleHQNCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIEV4dFZhbENvbnRleHQgZ2V0RXh0VmFsQ29udGV4dCgpDQotICAgIHsNCi0gICAgICAgIGlmIChleHRWYWxDb250ZXh0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZXh0VmFsQ29udGV4dCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGV4dFZhbENvbnRleHQ7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgRXh0VmFsVHJpbmlkYWRTdXBwb3J0TW9kdWxlQ29uZmlndXJhdGlvbiBnZXQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXh0VmFsQ29udGV4dCgpLmdldE1vZHVsZUNvbmZpZ3VyYXRpb24oRXh0VmFsVHJpbmlkYWRTdXBwb3J0TW9kdWxlQ29uZmlndXJhdGlvbi5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHVzZShFeHRWYWxUcmluaWRhZFN1cHBvcnRNb2R1bGVDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiBmb3JjZU92ZXJyaWRlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXh0VmFsQ29udGV4dCgpLmFkZE1vZHVsZUNvbmZpZ3VyYXRpb24oRXh0VmFsVHJpbmlkYWRTdXBwb3J0TW9kdWxlQ29uZmlndXJhdGlvbi5jbGFzcywgY29uZmlnLA0KLSAgICAgICAgICAgICAgICBmb3JjZU92ZXJyaWRlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiB3ZWIueG1sIGNvbmZpZw0KLSAgICAgKi8NCi0NCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZGVhY3RpdmF0ZUNsaWVudFNpZGVWYWxpZGF0aW9uKCk7DQotDQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGRlYWN0aXZhdGVDb3JlT3V0cHV0TGFiZWxJbml0aWFsaXphdGlvbigpOw0KLQ0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBkZWFjdGl2YXRlVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc1ZDlkYi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQuRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY3RvcnlGaW5kZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeTsNCi0NCi0vKioNCi0gKiB1c2UgdGhpcyBwaGFzZS1saXN0ZW5lciBpbnN0ZWFkIG9mIGEgRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBkdWUgdG8gYSB0cmluaWRhZCBpc3N1ZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lciBpbXBsZW1lbnRzIFBoYXNlTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDkxMDk3MjE4MzE4NjQxNDYxNjVMOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgUmVuZGVyS2l0RmFjdG9yeSByZW5kZXJLaXRGYWN0b3J5ID0gZ2V0UmVuZGVyS2l0RmFjdG9yeSgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlbmRlcktpdElkID0gZ2V0UmVuZGVyS2l0SWQoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGlmIChpc0luY29tcGF0aWJsZVJlbmRlcktpdChyZW5kZXJLaXRJZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hhbmdlUmVuZGVyS2l0KGZhY2VzQ29udGV4dCwgcmVuZGVyS2l0RmFjdG9yeSwgcmVuZGVyS2l0SWQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldFJlbmRlcktpdElkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5nZXRSZW5kZXJLaXRJZCgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgUmVuZGVyS2l0RmFjdG9yeSBnZXRSZW5kZXJLaXRGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChSZW5kZXJLaXRGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShGYWN0b3J5RmluZGVyLlJFTkRFUl9LSVRfRkFDVE9SWSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5jb21wYXRpYmxlUmVuZGVyS2l0KFN0cmluZyByZW5kZXJLaXRJZCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICFFeHRWYWxUcmluaWRhZFJlbmRlcktpdC5JRC5lcXVhbHMocmVuZGVyS2l0SWQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjaGFuZ2VSZW5kZXJLaXQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgUmVuZGVyS2l0RmFjdG9yeSByZW5kZXJLaXRGYWN0b3J5LCBTdHJpbmcgcmVuZGVyS2l0SWQpDQotICAgIHsNCi0gICAgICAgIFJlbmRlcktpdCByZW5kZXJLaXQgPSByZW5kZXJLaXRGYWN0b3J5LmdldFJlbmRlcktpdChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHJlbmRlcktpdElkKTsNCi0gICAgICAgIHJlbmRlcktpdEZhY3RvcnkuYWRkUmVuZGVyS2l0KEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LklELCBuZXcgRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQocmVuZGVyS2l0KSk7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5zZXRSZW5kZXJLaXRJZChFeHRWYWxUcmluaWRhZFJlbmRlcktpdC5JRCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLlJFTkRFUl9SRVNQT05TRTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmICh0aGlzID09IG8pDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjg3NmViLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJlbid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgLyoNCi0gICAgICogZGVhY3RpdmF0ZQ0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0NMSUVOVF9TSURFX1RSSU5JREFEX1ZBTElEQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfQ0xJRU5UX1NJREVfVFJJTklEQURfVkFMSURBVElPTiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfVFJJTklEQURfQ09SRV9PVVRQVVRfTEFCRUxfSU5JVElBTElaQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfVFJJTklEQURfQ09SRV9PVVRQVVRfTEFCRUxfSU5JVElBTElaQVRJT04iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX1RSSU5JREFEX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1RSSU5JREFEX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SIik7DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvRG91YmxlUmFuZ2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTAwMGUzLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuRG91YmxlUmFuZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5DbGllbnRWYWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBEb3VibGVSYW5nZUluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBib29sZWFuIGluZm9ybWF0aW9uQWRkZWQgPSBmYWxzZTsKLSAgICAgICAgRG91YmxlUmFuZ2VWYWxpZGF0b3IgZG91YmxlUmFuZ2VWYWxpZGF0b3IgPSAoRG91YmxlUmFuZ2VWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkRvdWJsZVJhbmdlIik7Ci0KLSAgICAgICAgT2JqZWN0IG1pbiA9IG51bGw7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pKQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOX0RFRkFVTFQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxUKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1pbiBpbnN0YW5jZW9mIERvdWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bSgoRG91YmxlKW1pbik7Ci0gICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBtYXggPSBudWxsOwotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4ID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWF9ERUZBVUxUKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4ID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVhfREVGQVVMVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtYXggaW5zdGFuY2VvZiBEb3VibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oKERvdWJsZSltYXgpOwotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkICYmCi0gICAgICAgICAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3IgaW5zdGFuY2VvZiBDbGllbnRWYWxpZGF0b3IgJiYgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKWRvdWJsZVJhbmdlVmFsaWRhdG9yKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xlbmd0aEluaXRpYWxpemVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUyNmM4Zi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkNsaWVudFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgTGVuZ3RoSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW5mb3JtYXRpb25BZGRlZCA9IGZhbHNlOwotICAgICAgICAvL1RPRE8KLSAgICAgICAgTGVuZ3RoVmFsaWRhdG9yIGxlbmd0aFZhbGlkYXRvciA9IChMZW5ndGhWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkxlbmd0aCIpOwotCi0gICAgICAgIE9iamVjdCBtaW5MZW5ndGggPSBudWxsOwotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbkxlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSF9ERUZBVUxUKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWluTGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIX0RFRkFVTFQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWluTGVuZ3RoIGluc3RhbmNlb2YgSW50ZWdlcikKLSAgICAgICAgewotICAgICAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1pbmltdW0oKEludGVnZXIpbWluTGVuZ3RoKTsKLSAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IG1heExlbmd0aCA9IG51bGw7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4TGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIX0RFRkFVTFQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEhfREVGQVVMVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtYXhMZW5ndGggaW5zdGFuY2VvZiBJbnRlZ2VyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldE1heGltdW1MZW5ndGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQuY2xhc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1heGltdW0oKEludGVnZXIpbWF4TGVuZ3RoKTsKLSAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9yZUluaXRWYWxpZGF0b3JzKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50LCBtZXRhRGF0YSk7IC8vc2VhcmNoIHdyYXBwZXJzIGFuZCBjYWxsIC5kZWFjdGl2YXRlCi0KLSAgICAgICAgaWYoaW5mb3JtYXRpb25BZGRlZCAmJiBsZW5ndGhWYWxpZGF0b3IgaW5zdGFuY2VvZiBDbGllbnRWYWxpZGF0b3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIoKENsaWVudFZhbGlkYXRvcilsZW5ndGhWYWxpZGF0b3IpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgQ29yZU91dHB1dExhYmVsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxlbmd0aFZhbGlkYXRvci5nZXRNaW5pbXVtKCkgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChDb3JlT3V0cHV0TGFiZWwpdWlDb21wb25lbnQpLnNldFNob3dSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTG9uZ1JhbmdlSW5pdGlhbGl6ZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Mb25nUmFuZ2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzllZWI4Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Mb25nUmFuZ2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkxvbmdSYW5nZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkNsaWVudFZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJza2lwVmFsaWRhdGlvblN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24iKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIExvbmdSYW5nZUluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBib29sZWFuIGluZm9ybWF0aW9uQWRkZWQgPSBmYWxzZTsKLSAgICAgICAgTG9uZ1JhbmdlVmFsaWRhdG9yIGxvbmdSYW5nZVZhbGlkYXRvciA9IChMb25nUmFuZ2VWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkxvbmdSYW5nZSIpOwotCi0gICAgICAgIE9iamVjdCBtaW4gPSBudWxsOwotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWluID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxUKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWluID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU5fREVGQVVMVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtaW4gaW5zdGFuY2VvZiBMb25nKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bSgoTG9uZyltaW4pOwotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgbWF4ID0gbnVsbDsKLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVhfREVGQVVMVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWF4IGluc3RhbmNlb2YgTG9uZykKLSAgICAgICAgewotICAgICAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oKExvbmcpbWF4KTsKLSAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoaW5mb3JtYXRpb25BZGRlZCAmJgotICAgICAgICAgICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvciBpbnN0YW5jZW9mIENsaWVudFZhbGlkYXRvciAmJiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIoKENsaWVudFZhbGlkYXRvcilsb25nUmFuZ2VWYWxpZGF0b3IpKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZjA4OGQuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1BhdHRlcm5Jbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLlJlZ0V4cFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkNsaWVudFZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJza2lwVmFsaWRhdGlvblN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24iKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIFBhdHRlcm5Jbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYoIW1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gcGF0dGVybnMgPSAoU3RyaW5nW10pbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOKTsKLQotICAgICAgICBSZWdFeHBWYWxpZGF0b3IgcmVnRXhwVmFsaWRhdG9yOwotCi0gICAgICAgIGZvcihTdHJpbmcgcGF0dGVybiA6IHBhdHRlcm5zKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWdFeHBWYWxpZGF0b3IgPSAoUmVnRXhwVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuUmVnRXhwIik7Ci0KLSAgICAgICAgICAgIHJlZ0V4cFZhbGlkYXRvci5zZXRQYXR0ZXJuKHBhdHRlcm4pOwotICAgICAgICAgICAgcmVnRXhwVmFsaWRhdG9yLnNldE1lc3NhZ2VEZXRhaWxOb01hdGNoKChTdHJpbmcpbWV0YURhdGEuZ2V0KAotICAgICAgICAgICAgICAgIENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRSkpOwotCi0gICAgICAgICAgICBpZihyZWdFeHBWYWxpZGF0b3IgaW5zdGFuY2VvZiBDbGllbnRWYWxpZGF0b3IgJiYgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKXJlZ0V4cFZhbGlkYXRvcikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUmVxdWlyZWRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQ0ZWE3Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnV0aWwuVHJpbmlkYWRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBSZXF1aXJlZEluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZighdmFsaWRhdGVFbXB0eUZpZWxkcygpIHx8ICFFeHRWYWxVdGlscy5pc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25BY3RpdmUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSB8fAotICAgICAgICAgICBtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCl8fAotICAgICAgICAgICBtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoKAotICAgICAgICAgICAgICAgICAoIUJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJgotICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKSkpIHx8Ci0gICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhpc0NvbXBvbmVudFJlcXVpcmVkKHVpQ29tcG9uZW50KSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkgJiYKLSAgICAgICAgICAgICAgICAgICAhQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyICYmIEV4dFZhbFV0aWxzLmlzUmVxdWlyZWRSZXNldEFjdGl2YXRlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgQ29yZU91dHB1dExhYmVsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChDb3JlT3V0cHV0TGFiZWwpdWlDb21wb25lbnQpLnNldFNob3dSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUVtcHR5RmllbGRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy52YWxpZGF0ZUVtcHR5RmllbGRzKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEJvb2xlYW4gaXNDb21wb25lbnRSZXF1aXJlZChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgQ29yZU91dHB1dExhYmVsKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aUNvbXBvbmVudCA9IFRyaW5pZGFkVXRpbHMuZmluZExhYmVsZWRFZGl0YWJsZUNvbXBvbmVudCgoQ29yZU91dHB1dExhYmVsKSB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgICAgIGlmKHVpQ29tcG9uZW50ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvL2NvbXBhcmUgd2l0aCBmYWxzZSBzbyB0cnVlID0gdHJ1ZSBvciBudWxsCi0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNSZWFkT25seSIpKSk7Ci0gICAgICAgIGJvb2xlYW4gaXNEaXNhYmxlZCA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNEaXNhYmxlZCIpKSk7Ci0KLSAgICAgICAgcmV0dXJuICEoaXNSZWFkT25seSB8fCBpc0Rpc2FibGVkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1RyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRhYWM1Ny4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLlRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29udGV4dC5SZXF1ZXN0Q29udGV4dDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQEludm9jYXRpb25PcmRlcigzMDApCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dFRleHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX0RBVEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dERhdGUiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyPiBjb21wb25lbnRJbml0aWFsaXplcnMgPQotICAgICAgICBuZXcgQXJyYXlMaXN0PFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXI+KCk7Ci0KLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFJlcXVpcmVkSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IExlbmd0aEluaXRpYWxpemVyKCkpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBMb25nUmFuZ2VJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgRG91YmxlUmFuZ2VJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgUGF0dGVybkluaXRpYWxpemVyKCkpOwotICAgICAgICAvL2NvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFZhbGlkYXRvckluaXRpYWxpemVyKCkpOwotICAgIH0KLQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTE9XLCBkZXNjcmlwdGlvbiA9ICJjaGVjayBwcHIgaXNzdWUiKQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZSBzdG9yYWdlID0gRXh0VmFsVXRpbHMKLSAgICAgICAgICAgICAgICAuZ2V0U3RvcmFnZShUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MsIFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIGZvcihUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyIDogY29tcG9uZW50SW5pdGlhbGl6ZXJzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihjb21wb25lbnRJbml0aWFsaXplci5jb25maWd1cmVUcmluaWRhZENvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RvcmFnZS5hZGRDb21wb25lbnQodWlDb21wb25lbnQpOwotICAgICAgICAgICAgICAgIHVwZGF0ZUNvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKSB8fAotICAgICAgICAgICAgICAgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFLmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmKFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmlzUGFydGlhbFJlcXVlc3QoZmFjZXNDb250ZXh0KSkKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuYWRkUGFydGlhbFRhcmdldCh1aUNvbXBvbmVudC5nZXRQYXJlbnQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVmFsaWRhdG9ySW5pdGlhbGl6ZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzZmNGFkLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQotQFVzYWdlSW5mb3JtYXRpb24odmFsdWUgPSBVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gImltcGwuIHRyaW5pZGFkIGUtbWFpbCB2YWxpZGF0b3IiKQotY2xhc3MgVmFsaWRhdG9ySW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCFtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuQ1VTVE9NKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00pOwotCi0gICAgICAgIGlmKCEodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKE9iamVjdCBjdXJyZW50VmFsdWUgOiAoTGlzdCl2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIShjdXJyZW50VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihDb21tb25NZXRhRGF0YUtleXMuRU1BSUwuZXF1YWxzKGN1cnJlbnRWYWx1ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9UT0RPCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNDY5NmIuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3INCi0gICAgICAgIC5Db21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigzMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBleHRlbmRzIENvbXBvbmVudEluaXRpYWxpemF0aW9uQXdhcmVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nRm9yQ29tcG9uZW50SW5pdGlhbGl6YXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzTWV0YURhdGFFbnRyaWVzKHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0TWV0YURhdGFFbnRyaWVzKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTWV0YURhdGFFbnRyaWVzKE1ldGFEYXRhRW50cnlbXSBtZXRhRGF0YUVudHJpZXMpDQotICAgIHsNCi0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IG1ldGFEYXRhRW50cmllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAocHJvY2Vzc0VudHJ5KGVudHJ5KSAmJiBpc0NsaWVudFZhbGlkYXRpb25EaXNhYmxlZChlbnRyeSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBkaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24oZW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvL2UuZy4gcmV0dXJucyBmYWxzZSBmb3IganNyMzAzIGVudHJpZXMNCi0gICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NFbnRyeShNZXRhRGF0YUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb247DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xpZW50VmFsaWRhdGlvbkRpc2FibGVkKE1ldGFEYXRhRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkNCi0gICAgICAgICAgICAgICAgLmV4dHJhY3QoZW50cnkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5pdGVyYXRvcigpLmhhc05leHQoKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwcml2YXRlIHZvaWQgZGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uKE1ldGFEYXRhRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmKGVudHJ5LmdldFByb3BlcnR5KENvbW1vbk1ldGFEYXRhS2V5cy5ESVNBQkxFX0NMSUVOVF9TSURFX1ZBTElEQVRJT04pID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZW50cnkuc2V0UHJvcGVydHkoQ29tbW9uTWV0YURhdGFLZXlzLkRJU0FCTEVfQ0xJRU5UX1NJREVfVkFMSURBVElPTiwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGtleXNUb0Rpc2FibGUgPSBlbnRyeS5nZXRQcm9wZXJ0eShDb21tb25NZXRhRGF0YUtleXMuRElTQUJMRV9DTElFTlRfU0lERV9WQUxJREFUSU9OLCBMaXN0LmNsYXNzKTsNCi0gICAgICAgIGtleXNUb0Rpc2FibGUuYWRkKGVudHJ5LmdldEtleSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWUzYjYxLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UuVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudXRpbC5UcmluaWRhZFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUuQ29yZUZvcm07DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotcHVibGljIGNsYXNzIFRyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvciBleHRlbmRzIEFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcg0KLXsNCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpDQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChmaWx0ZXJDb3JlT3V0cHV0TGFiZWwodWlDb21wb25lbnQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRDb3JlT3V0cHV0TGFiZWwoZmFjZXNDb250ZXh0LCAoQ29yZU91dHB1dExhYmVsKSB1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyRW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQ0KLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIENvcmVGb3JtKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNsZWFudXBFeHRWYWxDbGllbnRWYWxpZGF0b3JzKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFudXBFeHRWYWxDbGllbnRWYWxpZGF0b3JzKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MsIFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpDQotICAgICAgICAgICAgICAgIC5yb2xsYmFjaygpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBmaWx0ZXJDb3JlT3V0cHV0TGFiZWwoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb3JlT3V0cHV0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgQ29yZU91dHB1dExhYmVsIGNvcmVPdXRwdXRMYWJlbCkNCi0gICAgew0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gVHJpbmlkYWRVdGlscy5maW5kTGFiZWxlZEVkaXRhYmxlQ29tcG9uZW50KGNvcmVPdXRwdXRMYWJlbCk7DQotDQotICAgICAgICBpZiAodGFyZ2V0Q29tcG9uZW50ID09IG51bGwgfHwgIWlzQ29tcG9uZW50RWRpdGFibGUodGFyZ2V0Q29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhUmVzdWx0ID0gRXh0VmFsVXRpbHMuZ2V0VHJhbnNmb3JtZWRNZXRhRGF0YShmYWNlc0NvbnRleHQsIHRhcmdldENvbXBvbmVudCk7DQotDQotICAgICAgICAvL2dldCBjb21wb25lbnQgaW5pdGlhbGl6ZXIgZm9yIHRoZSBjdXJyZW50IGNvbXBvbmVudCBhbmQgY29uZmlndXJlIGl0DQotICAgICAgICAvL2Fsc28gaW4gY2FzZSBvZiBza2lwcGVkIHZhbGlkYXRpb24gdG8gcmVzZXQgZS5nLiB0aGUgcmVxdWlyZWQgYXR0cmlidXRlDQotICAgICAgICBpZiAoIW1ldGFEYXRhUmVzdWx0LmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5jb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoZmFjZXNDb250ZXh0LCBjb3JlT3V0cHV0TGFiZWwsIG1ldGFEYXRhUmVzdWx0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDb21wb25lbnRFZGl0YWJsZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgLy9jb21wYXJlIHdpdGggZmFsc2Ugc28gdHJ1ZSA9IHRydWUgb3IgbnVsbA0KLSAgICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNSZWFkT25seSIpKSk7DQotICAgICAgICBib29sZWFuIGlzRGlzYWJsZWQgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc0Rpc2FibGVkIikpKTsNCi0NCi0gICAgICAgIHJldHVybiAhKGlzUmVhZE9ubHkgfHwgaXNEaXNhYmxlZCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODU0NjEuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5MYWJlbGVkTWVzc2FnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5leGNlcHRpb24uUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbnRleHQuUmVxdWVzdENvbnRleHQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dFRleHQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUuaW5wdXQuQ29yZUlucHV0RGF0ZSI7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb1JlZnJlc2hDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgICAgIHRyeVRvUGxhY2VMYWJlbEluRmFjZXNNZXNzYWdlKHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvUGxhY2VMYWJlbEluRmFjZXNNZXNzYWdlKA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHRyeVRvSGFuZGxlUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24odWlDb21wb25lbnQsIHZhbGlkYXRvckV4Y2VwdGlvbik7DQotDQotICAgICAgICBTdHJpbmcgbGFiZWwgPSBkZXRlY3RMYWJlbFRleHQobWV0YURhdGFFbnRyeSwgdWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0xhYmVsKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSwgbGFiZWwpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGRldGVjdExhYmVsVGV4dChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbGFiZWwgPSBnZXRMYWJlbCh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBsYWJlbCA9IGdldENsaWVudElkQXNGYWxsYmFja0lmTmVlZGVkKHVpQ29tcG9uZW50LCBsYWJlbCk7DQotDQotICAgICAgICBsYWJlbCA9IHRyeVRvT3ZlcnJpZGVMYWJlbElmUHJvdmlkZWRNYW51YWxseShtZXRhRGF0YUVudHJ5LCBsYWJlbCk7DQotICAgICAgICByZXR1cm4gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NMYWJlbChGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIExhYmVsZWRNZXNzYWdlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgICgoTGFiZWxlZE1lc3NhZ2UpZmFjZXNNZXNzYWdlKS5zZXRMYWJlbFRleHQobGFiZWwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9pZiBzb21lb25lIHVzZXMgYSBub3JtYWwgZmFjZXMgbWVzc2FnZQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwoZmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvT3ZlcnJpZGVMYWJlbElmUHJvdmlkZWRNYW51YWxseShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwsIFN0cmluZy5jbGFzcyk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xpZW50SWRBc0ZhbGxiYWNrSWZOZWVkZWQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgaWYobGFiZWwgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBsYWJlbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9IYW5kbGVSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdG9yRXhjZXB0aW9uIGluc3RhbmNlb2YgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKTsNCi0gICAgICAgICAgICBTdHJpbmcgaW5saW5lTWVzc2FnZSA9IGdldElubGluZVJlcXVpcmVkTWVzc2FnZSh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICAgICAgaWYoaW5saW5lTWVzc2FnZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoaW5saW5lTWVzc2FnZSk7DQotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoaW5saW5lTWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1JlZnJlc2hDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmKFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmlzUGFydGlhbFJlcXVlc3QoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBSZXF1ZXN0Q29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5hZGRQYXJ0aWFsVGFyZ2V0KHVpQ29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAoVFJJTklEQURfQ09SRV9JTlBVVF9URVhULmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSkgfHwNCi0gICAgICAgICAgICAgICAgIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURS5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRMYWJlbChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldExhYmVsIikpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldElubGluZVJlcXVpcmVkTWVzc2FnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldFJlcXVpcmVkTWVzc2FnZURldGFpbCIpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGI0NWU5Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcktpdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuUmVuZGVyS2l0RGVjb3JhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuY29yZS5Db3JlUmVuZGVyS2l0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZXNwb25zZVN0YXRlTWFuYWdlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVdyaXRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5Xcml0ZXI7DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0IGV4dGVuZHMgUmVuZGVyS2l0RGVjb3JhdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgRXh0VmFsUmVuZGVyS2l0IGV4dFZhbFJlbmRlcktpdDsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiRVhUVkFMX1RSSU5JREFEX1JFTkRFUktJVCI7DQotDQotICAgIHB1YmxpYyBFeHRWYWxUcmluaWRhZFJlbmRlcktpdChSZW5kZXJLaXQgd3JhcHBlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5leHRWYWxSZW5kZXJLaXQgPSBuZXcgRXh0VmFsUmVuZGVyS2l0KHdyYXBwZWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlLCBSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5leHRWYWxSZW5kZXJLaXQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIHJlbmRlcmVyKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFJlbmRlcmVyIGdldFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5nZXRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBSZXNwb25zZVN0YXRlTWFuYWdlciBnZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5nZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUmVzcG9uc2VXcml0ZXIgY3JlYXRlUmVzcG9uc2VXcml0ZXIoV3JpdGVyIHdyaXRlciwgU3RyaW5nIHMsIFN0cmluZyBzMSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmNyZWF0ZVJlc3BvbnNlV3JpdGVyKHdyaXRlciwgcywgczEpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdHJlYW0gY3JlYXRlUmVzcG9uc2VTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmNyZWF0ZVJlc3BvbnNlU3RyZWFtKG91dHB1dFN0cmVhbSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZWNvcmF0ZWRSZW5kZXJLaXRJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBDb3JlUmVuZGVyS2l0LkJBU0VfUkVOREVSX0tJVF9JRDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5LmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZTBhYjkuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnJlbmRlcmtpdC5jb3JlLnhodG1sLnRhYmxlLlRhYmxlUmVuZGVyaW5nQ29udGV4dDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIHNvbHV0aW9uIGZvciB0cmluaWRhZCB0YWJsZSByZW5kZXJlciBpc3N1ZSAoaW4gY29ubmVjdGlvbiB3aXRoIGRvdWJsZSBjYWxsIHByZXZlbnRpb24gcHJveGllcykNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ARGVwcmVjYXRlZA0KLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkgZXh0ZW5kcyBFeHRWYWxSZW5kZXJlclByb3h5DQotew0KLSAgICBwdWJsaWMgRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5KFJlbmRlcmVyIHJlbmRlcmVyKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihyZW5kZXJlcik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3B0aW9uYWxLZXkoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmKFRhYmxlUmVuZGVyaW5nQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAifCIgKyBUYWJsZVJlbmRlcmluZ0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0UmVuZGVyU3RhZ2UoKS5nZXRTdGFnZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuICIiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkODc2OS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdGFydHVwL1RyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkRlZmF1bHRFeHRWYWxDb3JlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXJIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQuVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkU3VwcG9ydE1vZHVsZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5EZWZhdWx0RXh0VmFsVHJpbmlkYWRTdXBwb3J0TW9kdWxlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UuVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZS5EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC52YWxpZGF0aW9uLm1lc3NhZ2UuVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0LkV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yLlRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3IuVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3IuVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGFsdGVybmF0aXZlIGFwcHJvYWNoIGZvciBFeHRWYWxSZW5kZXJLaXRGYWN0b3J5DQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgwMzQwODkyNDQ5MDM5NjY5OTlMOw0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0TW9kdWxlQ29uZmlnKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVHJpbmlkYWRTdXBwb3J0TW9kdWxlQ29uZmlndXJhdGlvbi51c2UobmV3IERlZmF1bHRFeHRWYWxUcmluaWRhZFN1cHBvcnRNb2R1bGVDb25maWd1cmF0aW9uKCksIGZhbHNlKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIGluaXRNb2R1bGVDb25maWcoKTsNCi0NCi0gICAgICAgIGRlYWN0aXZhdGVEZWZhdWx0RXh0VmFsUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsNCi0NCi0gICAgICAgIGluaXRDbGllbnRTaWRlVmFsaWRhdGlvblN1cHBvcnQoKTsNCi0NCi0gICAgICAgIGluaXRMYWJlbEluaXRpYWxpemF0aW9uU3VwcG9ydCgpOw0KLQ0KLSAgICAgICAgaW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRpb24oKTsNCi0NCi0gICAgICAgIC8vcmVwbGFjZURlZmF1bHRQcm94eVdpdGhUcmluaWRhZFJlbmRlcmVyUHJveHkoKTsNCi0NCi0gICAgICAgIGluaXRUcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkoKTsNCi0gICAgICAgIC8qDQotICAgICAgICAgKiBpZiB0aGVyZSBhcmUgZnVydGhlciBpbmNvbXBhdGlibGUgcmVuZGVyZXJzIHVzZSB0aGUgZm9sbG93aW5nIHF1aWNrLWZpeDoNCi0gICAgICAgICAqICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZLCBudWxsKTsNCi0gICAgICAgICAgIGF0dGVudGlvbjogaXQgY2F1c2VzIGRpcmVjdCBkZWxlZ2F0aW9uIHdpdGhvdXQgYSBjaGVjayBvZiBkb3VibGUgaW52b2NhdGlvbnMNCi0gICAgICAgICAqLw0KLQ0KLSAgICAgICAgaW5pdFRyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IoKTsNCi0NCi0gICAgICAgIGluaXRUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UoKTsNCi0NCi0gICAgICAgIGluaXRSZXF1aXJlZEluaXRpYWxpemF0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGRlYWN0aXZhdGVEZWZhdWx0RXh0VmFsUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jbGFzcykuZGVhY3RpdmF0ZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0Q2xpZW50U2lkZVZhbGlkYXRpb25TdXBwb3J0KCkNCi0gICAgew0KLSAgICAgICAgaWYoIUV4dFZhbFRyaW5pZGFkU3VwcG9ydE1vZHVsZUNvbmZpZ3VyYXRpb24uZ2V0KCkuZGVhY3RpdmF0ZUNsaWVudFNpZGVWYWxpZGF0aW9uKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRMYWJlbEluaXRpYWxpemF0aW9uU3VwcG9ydCgpDQotICAgIHsNCi0gICAgICAgIGlmKCFFeHRWYWxUcmluaWRhZFN1cHBvcnRNb2R1bGVDb25maWd1cmF0aW9uLmdldCgpLmRlYWN0aXZhdGVDb3JlT3V0cHV0TGFiZWxJbml0aWFsaXphdGlvbigpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdGlvbigpDQotICAgIHsNCi0gICAgICAgIGlmKCFFeHRWYWxUcmluaWRhZFN1cHBvcnRNb2R1bGVDb25maWd1cmF0aW9uLmdldCgpLmRlYWN0aXZhdGVWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IobmV3IFRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZXBsYWNlRGVmYXVsdFByb3h5V2l0aFRyaW5pZGFkUmVuZGVyZXJQcm94eSgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSwgRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRUcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjdG9yeU5hbWVzLkZBQ0VTX01FU1NBR0VfRkFDVE9SWS5uYW1lKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRUcmluaWRhZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZLCBTdG9yYWdlTWFuYWdlckhvbGRlci5jbGFzcykNCi0gICAgICAgICAgICAgICAgLnNldFN0b3JhZ2VNYW5hZ2VyKFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UmVxdWlyZWRJbml0aWFsaXphdGlvbigpDQotICAgIHsNCi0gICAgICAgIERlZmF1bHRFeHRWYWxDb3JlQ29uZmlndXJhdGlvbi5vdmVycnVsZUFjdGl2YXRlUmVxdWlyZWRJbml0aWFsaXphdGlvbihCb29sZWFuLlRSVUUsIHRydWUpOw0KLQ0KLSAgICAgICAgLy90aGVyZSBpcyBubyBzdXBwb3J0IGZvciBjbGllbnQtc2lkZSBzZXZlcml0eSBhd2FyZSB2YWxpZGF0aW9uIC0+IGRvbid0IHJlc2V0IHRoZSB2YWx1ZQ0KLSAgICAgICAgRGVmYXVsdEV4dFZhbENvcmVDb25maWd1cmF0aW9uLm92ZXJydWxlRGVhY3RpdmF0ZVJlcXVpcmVkQXR0cmlidXRlU3VwcG9ydChCb29sZWFuLkZBTFNFLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvbkRlYWN0aXZhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICFFeHRWYWxDb3JlQ29uZmlndXJhdGlvbi5nZXQoKS5hY3RpdmF0ZVJlcXVpcmVkSW5pdGlhbGl6YXRpb24oKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNTQyNTQuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2UgaW1wbGVtZW50cyBUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgTGlzdDxVSUNvbXBvbmVudD4gY29tcG9uZW50TGlzdCA9IG5ldyBBcnJheUxpc3Q8VUlDb21wb25lbnQ+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZENvbXBvbmVudChVSUNvbXBvbmVudCB0cmluaWRhZENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYoIXRoaXMuY29tcG9uZW50TGlzdC5jb250YWlucyh0cmluaWRhZENvbXBvbmVudCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5jb21wb25lbnRMaXN0LmFkZCh0cmluaWRhZENvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcm9sbGJhY2soKQ0KLSAgICB7DQotICAgICAgICBmb3IgKFVJQ29tcG9uZW50IGNvbXBvbmVudCA6IHRoaXMuY29tcG9uZW50TGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZW1vdmVUcmluaWRhZFZhbGlkYXRvcldyYXBwZXIoY29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRoaXMuY29tcG9uZW50TGlzdC5jbGVhcigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZW1vdmVUcmluaWRhZFZhbGlkYXRvcldyYXBwZXIoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVtb3ZlV3JhcHBlckZyb21Db21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vdG8ga2VlcCB0aGUgc291cmNlIGluIHN5bmMgd2l0aCBvbGRlciB2ZXJzaW9ucw0KLSAgICAgICAgICAgIGZvciAoT2JqZWN0IGNoaWxkIDogdWlDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlbW92ZVRyaW5pZGFkVmFsaWRhdG9yV3JhcHBlcigoVUlDb21wb25lbnQpY2hpbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlV3JhcHBlckZyb21Db21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGZvciAoVmFsaWRhdG9yIHZhbGlkYXRvciA6ICgoRWRpdGFibGVWYWx1ZUhvbGRlcikgdWlDb21wb25lbnQpLmdldFZhbGlkYXRvcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKSB1aUNvbXBvbmVudCkucmVtb3ZlVmFsaWRhdG9yKHZhbGlkYXRvcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWRlMjBiLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLm1hcHBlci5EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgY29tcG9uZW50IGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTWFuYWdlcg0KLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8VHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlPg0KLXsNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcga2V5ID0gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfVFJJTklEQURfQ0xJRU5UX1ZBTElEQVRPUjpLRVkiOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGtleTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL1RyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9UcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc4M2NiOC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL1RyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLQ0KLS8qKg0KLSAqIGV4dHZhbCBpbmplY3RzIGNsaWVudC12YWxpZGF0b3JzIGludG8gdHJpbmlkYWQgY29tcG9uZW50cyBiYXNlZCBvbiBtZXRhLWRhdGEuDQotICogc28gY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBpcyBzdXBwb3J0ZWQuIHNvbWUgYXBwLXNlcnZlcnMgc2hvdyBhIGRpZmZlcmVudCBiZWhhdmlvdXIuDQotICogdGhhdCdzIHRoZSByZWFzb24gZm9yIHN0b3JpbmcgdGhlc2UgY29tcG9uZW50cyBhbmQgcmVtb3ZlIHRoZSBpbmplY3RlZCB2YWxpZGF0b3JzIGFmdGVyIHRoZSByZW5kZXJpbmcgcGhhc2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlDQotew0KLSAgICB2b2lkIGFkZENvbXBvbmVudChVSUNvbXBvbmVudCB0cmluaWRhZENvbXBvbmVudCk7DQotICAgIHZvaWQgcm9sbGJhY2soKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL21hcHBlci9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlNjliMy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL21hcHBlci9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UuVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZS5EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigzMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdXRpbC9UcmluaWRhZFV0aWxzLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC91dGlsL1RyaW5pZGFkVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAyZDQ0Zi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC91dGlsL1RyaW5pZGFkVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImNoZWNrIHN1YmZvcm0iKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZFV0aWxzDQotew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFRyaW5pZGFkVXRpbHMuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBVSUNvbXBvbmVudCBmaW5kTGFiZWxlZEVkaXRhYmxlQ29tcG9uZW50KENvcmVPdXRwdXRMYWJlbCBjb3JlT3V0cHV0TGFiZWwpDQotICAgIHsNCi0gICAgICAgIC8vVE9ETw0KLSAgICAgICAgaWYoaXNMYWJlbFRhcmdldEF2YWlsYWJsZShjb3JlT3V0cHV0TGFiZWwpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFVJQ29tcG9uZW50IHJlc3VsdCA9IHJlc29sdmVMYWJlbFRhcmdldChmYWNlc0NvbnRleHQsIGNvcmVPdXRwdXRMYWJlbCk7DQotDQotICAgICAgICBpZihyZXN1bHQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotDQotICAgICAgICBMT0cuZmluZXN0KGNvcmVPdXRwdXRMYWJlbC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpICsgIiBkb2Vzbid0IHJlZmVyZW5jZSBhbiBlZGl0YWJsZSBjb21wb25lbnQiKTsNCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFVJQ29tcG9uZW50IHJlc29sdmVMYWJlbFRhcmdldChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBDb3JlT3V0cHV0TGFiZWwgY29yZU91dHB1dExhYmVsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZmluZENvbXBvbmVudChjb3JlT3V0cHV0TGFiZWwuZ2V0Rm9yKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMYWJlbFRhcmdldEF2YWlsYWJsZShDb3JlT3V0cHV0TGFiZWwgY29yZU91dHB1dExhYmVsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29yZU91dHB1dExhYmVsLmdldEZvcigpID09IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2MyMWNjLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5IGV4dGVuZHMgRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xhYmVsZWRGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIFRyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2Uoc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmU2OTNiLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuTGFiZWxlZE1lc3NhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC51dGlsLkxhYmVsZWRGYWNlc01lc3NhZ2U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBUcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UgZXh0ZW5kcyBMYWJlbGVkRmFjZXNNZXNzYWdlIGltcGxlbWVudHMgTGFiZWxlZE1lc3NhZ2UNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYzNTY4MDA2ODk5NjE1MDUxNTRMOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX1JFU09VUkNFX01BUktFUiA9ICI/Pz8iOw0KLQ0KLSAgICBwdWJsaWMgVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlKFNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgc3VwZXIoc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TGFiZWxBc1N0cmluZyhGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN1bW1hcnkoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UgcmVzdWx0ID0gdHJ5VG9QbGFjZUxhYmVsKHN1cGVyLmdldFN1bW1hcnkoKSk7DQotDQotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3VwZXIuc2V0U3VtbWFyeShyZXN1bHQuZ2V0U3VtbWFyeSgpKTsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmdldFN1bW1hcnkoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRTdW1tYXJ5KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGV0YWlsKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIHJlc3VsdCA9IHRyeVRvUGxhY2VMYWJlbChzdXBlci5nZXREZXRhaWwoKSk7DQotDQotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3VwZXIuc2V0RGV0YWlsKHJlc3VsdC5nZXREZXRhaWwoKSk7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5nZXREZXRhaWwoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5nZXREZXRhaWwoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEZhY2VzTWVzc2FnZSB0cnlUb1BsYWNlTGFiZWwoU3RyaW5nIG9yaWdpbmFsTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGlzVmFsaWRNZXNzYWdlKG9yaWdpbmFsTWVzc2FnZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIG5ld0ZhY2VzTWVzc2FnZSA9IGNyZWF0ZU9yaWdpbmFsRmFjZXNNZXNzYWdlKCk7DQotICAgICAgICAgICAgdHJ5VG9QbGFjZUxhYmVsSW4obmV3RmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICByZXR1cm4gbmV3RmFjZXNNZXNzYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBGYWNlc01lc3NhZ2UgY3JlYXRlT3JpZ2luYWxGYWNlc01lc3NhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEZhY2VzTWVzc2FnZShzdXBlci5nZXRTZXZlcml0eSgpLCBzdXBlci5nZXRTdW1tYXJ5KCksIHN1cGVyLmdldERldGFpbCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9QbGFjZUxhYmVsSW4oRmFjZXNNZXNzYWdlIG5ld0ZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGxhYmVsID0gZ2V0TGFiZWxUZXh0KCk7DQotDQotICAgICAgICBpZihsYWJlbCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9QbGFjZUxhYmVsKG5ld0ZhY2VzTWVzc2FnZSwgbGFiZWwsIGkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZE1lc3NhZ2UoU3RyaW5nIG9yaWdpbmFsTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICEob3JpZ2luYWxNZXNzYWdlICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgb3JpZ2luYWxNZXNzYWdlLnN0YXJ0c1dpdGgoTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIpICYmDQotICAgICAgICAgICAgICAgIG9yaWdpbmFsTWVzc2FnZS5lbmRzV2l0aChNSVNTSU5HX1JFU09VUkNFX01BUktFUikpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldExhYmVsKGxhYmVsKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dCBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRlOTMyYi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzJfMC54c2QiDQotICAgICAgICAgICAgICB2ZXJzaW9uPSIyLjAiPg0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPg0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdGFydHVwLlRyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyDQotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi0NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj4NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcg0KLSAgICAgICAgPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMjhjMmUuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlIHByb3ZpZGVzIHNwZWNpYWwgVHJpbmlkYWQgU3VwcG9ydCBmb3IgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvci4NCi0gICAgRnVydGhlcm1vcmUsIGl0IGFsbG93cyB0byBqb2luIHRoZSBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIG1lY2hhbmlzbSBvZiBUcmluaWRhZC4gU2FtcGxlIHVzZS1jYXNlOiBhbm5vdGF0ZSB5b3VyIG1vZGVsIHdpdGggSlBBIDEuMCBhbm5vdGF0aW9ucywgYmluZCBwcm9wZXJ0aWVzIHRvIEpTRiBJbnB1dCBjb21wb25lbnRzIGFuZCBnZXQgYXV0b21hdGljIGNsaWVudC1zaWRlIHZhbGlkYXRpb24ganVzdCBieSBhZGRpbmcgMyBKQVIgZmlsZXMgKE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSwgUHJvcGVydHkgVmFsaWRhdGlvbiBhbmQgVHJpbmlkYWQgU3VwcG9ydCkuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLnggYW5kIEpTRiAyLnguIEFsbCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3BvbS54bWwgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTQ5YmUxLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4yLjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBDb3JlPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4yLjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPHNjbT4NCi0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlPC9jb25uZWN0aW9uPg0KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlPC9kZXZlbG9wZXJDb25uZWN0aW9uPg0KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmU8L3VybD4NCi0gICAgPC9zY20+DQotICAgIA0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0V4dFZhbEluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNWI1MTMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLQ0KLS8qKg0KLSAqIGRvbnQndCBtb3ZlIHRvIGFuIG90aGVyIHBhY2thZ2UhISENCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBFeHRWYWxJbmZvcm1hdGlvbg0KLXsNCi0gICAgLy8gZ2V0UGFja2FnZSBpc24ndCB3b3JraW5nIHdpdGggYSBjdXN0b20gY2xhc3MgbG9hZGVyDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgPSBDbGFzc1V0aWxzLmdldFBhY2thZ2VOYW1lKEV4dFZhbEluZm9ybWF0aW9uLmNsYXNzKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJYTUxfUEFSQU1fUFJFRklYID0gQ2xhc3NVdGlscy5nZXRQYWNrYWdlTmFtZShFeHRWYWxJbmZvcm1hdGlvbi5jbGFzcyk7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9IENsYXNzVXRpbHMuZ2V0SmFyVmVyc2lvbihFeHRWYWxJbmZvcm1hdGlvbi5jbGFzcyk7DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ3VzdG9tSW5mb3JtYXRpb24uamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ3VzdG9tSW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZiMjJlZC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0N1c3RvbUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEV4dFZhbCBhcnRpZmFjdHMgc3VwcG9ydGVkIGJ5IHRoZSB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW5mb3JtYXRpb25Qcm92aWRlckJlYW59DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQ0KLXB1YmxpYyBlbnVtIEN1c3RvbUluZm9ybWF0aW9uDQotew0KLSAgICBCQVNFX1BBQ0tBR0UsDQotDQotICAgIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SLA0KLSAgICBWQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1IsDQotDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCwNCi0gICAgVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFX1JFU09MVkVSX1BPU1RGSVgsDQotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYLA0KLQ0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01TR19SRVNPTFZFUl9OQU1FX01BUFBFUiwNCi0gICAgTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIsDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSLA0KLQ0KLSAgICBTVEFSVFVQX0xJU1RFTkVSLA0KLSAgICBDT01QT05FTlRfSU5JVElBTElaRVIsDQotICAgIFZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SLA0KLSAgICBQUk9QRVJUWV9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SLA0KLSAgICBNRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUiwNCi0NCi0gICAgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLA0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksDQotICAgIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksDQotICAgIFZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZLA0KLSAgICBWQUxJREFUSU9OX1BBUkFNRVRFUl9GQUNUT1JZLA0KLSAgICBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwNCi0gICAgRkFDRVNfTUVTU0FHRV9GQUNUT1JZLA0KLSAgICBTVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwNCi0NCi0gICAgTUVTU0FHRV9CVU5ETEVfTkFNRSwNCi0gICAgU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFLA0KLQ0KLSAgICBNRVRBX0RBVEFfU1RPUkFHRV9GSUxURVINCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9EZWZhdWx0RXh0VmFsQ29yZUNvbmZpZ3VyYXRpb24uamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRGVmYXVsdEV4dFZhbENvcmVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MTMyNDYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9EZWZhdWx0RXh0VmFsQ29yZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHkuUHJveHlIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5LkRlZmF1bHRQcm94eUhlbHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uQ29uc3RyYWludFNvdXJjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5JZ25vcmVDb25zdHJhaW50U291cmNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlRhcmdldFByb3BlcnR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlRhcmdldFByb3BlcnR5SWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IEV4dFZhbCBDb3JlIE1vZHVsZSBDb25maWd1cmF0aW9uIHRoYXQgcmV0cmlldmVzIG1vc3Qgb2YgdGhlIHZhbHVlcyBmcm9tIHRoZSBXZWIueG1sIGluaXRpYWxpemF0aW9uDQotICogcGFyYW1ldGVycy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSByNA0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRFeHRWYWxDb3JlQ29uZmlndXJhdGlvbiBleHRlbmRzIEV4dFZhbENvcmVDb25maWd1cmF0aW9uDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0xPQkFMX1BST1BFUlRZX01PREVfSU5JVF9SRVFVSVJFRCA9ICJtb2RlOmluaXQ6cmVxdWlyZWQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0xPQkFMX1BST1BFUlRZX01PREVfUkVTRVRfUkVRVUlSRUQgPSAibW9kZTpyZXNldDpyZXF1aXJlZCI7DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIFBhcmFtZXRlciB0YWtlbiBmcm9tIHRoZSBXZWIueG1sIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBDVVNUT01fTUVTU0FHRV9CVU5ETEUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGN1c3RvbU1lc3NhZ2VCdW5kbGVCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FU1NBR0VfQlVORExFOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIFBhcmFtZXRlciB0YWtlbiBmcm9tIHRoZSBXZWIueG1sIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBDVVNUT01fQkFTRV9QQUNLQUdFLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBjdXN0b21CYXNlUGFja2FnZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0JBU0VfUEFDS0FHRTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiBQYXJhbWV0ZXIgdGFrZW4gZnJvbSB0aGUgV2ViLnhtbCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4uDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGN1c3RvbUluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fSU5GT1JNQVRJT05fUFJPVklERVJfQkVBTjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiBQYXJhbWV0ZXIgdGFrZW4gZnJvbSB0aGUgV2ViLnhtbCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBjdXN0b21Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIFBhcmFtZXRlciB0YWtlbiBmcm9tIHRoZSBXZWIueG1sIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBDVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBjdXN0b21WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIFBhcmFtZXRlciB0YWtlbiBmcm9tIHRoZSBXZWIueG1sIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciAgQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OX1NUUkFURUdZX01BUFBJTkcuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGN1c3RvbVN0YXRpY1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmdTb3VyY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9TVEFUSUNfVkFMSURBVElPTl9TVFJBVEVHWV9NQVBQSU5HOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIFBhcmFtZXRlciB0YWtlbiBmcm9tIHRoZSBXZWIueG1sIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBjdXN0b21Db21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9JTklUSUFMSVpFUjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiBQYXJhbWV0ZXIgdGFrZW4gZnJvbSB0aGUgV2ViLnhtbCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgQ1VTVE9NX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBjdXN0b21WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiBQYXJhbWV0ZXIgdGFrZW4gZnJvbSB0aGUgV2ViLnhtbCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgQ1VTVE9NX1BST1BFUlRZX1ZBTElEQVRJT05fSU5URVJDRVBUT1IuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGN1c3RvbVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fUFJPUEVSVFlfVkFMSURBVElPTl9JTlRFUkNFUFRPUjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiBQYXJhbWV0ZXIgdGFrZW4gZnJvbSB0aGUgV2ViLnhtbCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgQ1VTVE9NX01FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBjdXN0b21NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIFBhcmFtZXRlciB0YWtlbiBmcm9tIHRoZSBXZWIueG1sIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBDVVNUT01fTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IuIFdoZW4gbm8NCi0gICAgICogdmFsdWUgaXMgc3BlY2lmaWVkLCB0aGUge0BsaW5rIERlZmF1bHRQcm94eUhlbHBlcn0gaXMgcmV0dXJuZWQuDQotICAgICAqLw0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiVGhlIHRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUgY2FuIHJldHVybiBhIG51bGwgdmFsdWUgd2hpY2ggaXNuJ3QgIg0KLSAgICAgICAgICAgICsgImhhbmRsZWQgY29ycmVjdGx5IGFmdGVyd2FyZHMuICBXZSBzaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uIGxpa2UgaW4gcmVuZGVyZXJQcm94eSBtZXRob2QuIikNCi0gICAgcHVibGljIFByb3h5SGVscGVyIHByb3h5SGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1c3RvbVByb3h5SGVscGVyQ2xhc3NOYW1lID0gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9QUk9YWV9IRUxQRVI7DQotDQotICAgICAgICBpZiAoY3VzdG9tUHJveHlIZWxwZXJDbGFzc05hbWUgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKGN1c3RvbVByb3h5SGVscGVyQ2xhc3NOYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFByb3h5SGVscGVyKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY3VzdG9tUHJveHlIZWxwZXJDbGFzc05hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UHJveHlIZWxwZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiBSZXR1cm5zIGFsd2F5cyB0aGUgRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFByb2plY3RTdGFnZVJlc29sdmVyIHByb2plY3RTdGFnZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UHJvamVjdFN0YWdlUmVzb2x2ZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiBSZXR1cm5zIHRoZSBFeHRWYWxSZW5kZXJlclByb3h5IGNsYXNzIHdoaWNoIGlzIGNvbmZpZ3VyZWQgaW4gdGhlIGdsb2JhbCBwcm9wZXJ0eSBvZiBFeHRWYWwuIFdoZW4gbm8gcHJvcGVydHkNCi0gICAgICogZGVmaW5lZCwgbnVsbCBpcyByZXR1cm5lZCAod2hpY2ggaXMgY29ycmVjdGx5IGhhbmRsZWQgYnkgdGhlIGNhbGxpbmcgbWV0aG9kcykgb3IgYW4gZXhjZXB0aW9uIGNhbiBiZSB0aHJvd24NCi0gICAgICogd2hlbiB0aGUgZ2xvYmFsIHByb3BlcnR5IGNvbnRhaW5zIGFuIGludmFsaWQgY2xhc3MgbmFtZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgRXh0VmFsUmVuZGVyZXJQcm94eT4gcmVuZGVyZXJQcm94eSgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm94eUNsYXNzTmFtZSA9IChTdHJpbmcpIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZKTsNCi0NCi0gICAgICAgIGlmIChwcm94eUNsYXNzTmFtZSAhPSBudWxsICYmICFwcm94eUNsYXNzTmFtZS5lbmRzV2l0aChnZXRDbGFzcygpLmdldE5hbWUoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEV4dFZhbFJlbmRlcmVyUHJveHk+IHRhcmdldENsYXNzID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUocHJveHlDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmICh0YXJnZXRDbGFzcyA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYSBjdXN0b20gaW52YWxpZCByZW5kZXJlciBwcm94eSBpcyBjb25maWd1cmVkOiAiICsgcHJveHlDbGFzc05hbWUpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0Q2xhc3M7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiBSZXR1cm5zIGFsd2F5cyB0aGUgVmlvbGF0aW9uU2V2ZXJpdHkuDQotICAgICAqLw0KLSAgICBwdWJsaWMgQ2xhc3MgdmlvbGF0aW9uU2V2ZXJpdHkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3M7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHtAaW5oZXJpdERvY30NCi0gICAgICogVmFsdWUgdGFrZW4gZnJvbSB0aGUgV2ViLnhtbCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUi4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgY3VzdG9tVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIFZhbHVlIHRha2VuIGZyb20gdGhlIFdlYi54bWwgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIENVU1RPTV9NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUi4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgY3VzdG9tTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiBWYWx1ZSB0YWtlbiBmcm9tIHRoZSBXZWIueG1sIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcg0KLSAgICAgKiBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGN1c3RvbVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiBWYWx1ZSB0YWtlbiBmcm9tIHRoZSBXZWIueG1sIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBDVVNUT01fTUVUQV9EQVRBX1NUT1JBR0VfRklMVEVSLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBjdXN0b21NZXRhRGF0YVN0b3JhZ2VGaWx0ZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVI7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHtAaW5oZXJpdERvY30NCi0gICAgICogVmFsdWUgdGFrZW4gZnJvbSB0aGUgV2ViLnhtbCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWS4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgY3VzdG9tVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiBWYWx1ZSB0YWtlbiBmcm9tIHRoZSBXZWIueG1sIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBDVVNUT01fTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBjdXN0b21NZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIFZhbHVlIHRha2VuIGZyb20gdGhlIFdlYi54bWwgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIENVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBjdXN0b21Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIFZhbHVlIHRha2VuIGZyb20gdGhlIFdlYi54bWwgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIENVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWS4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgY3VzdG9tVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiBWYWx1ZSB0YWtlbiBmcm9tIHRoZSBXZWIueG1sIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBDVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWS4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgY3VzdG9tVmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnlDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9GQUNUT1JZOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIFZhbHVlIHRha2VuIGZyb20gdGhlIFdlYi54bWwgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIENVU1RPTV9NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWS4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgY3VzdG9tTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiBWYWx1ZSB0YWtlbiBmcm9tIHRoZSBXZWIueG1sIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBDVVNUT01fU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlkuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGN1c3RvbVN0b3JhZ2VNYW5hZ2VyRmFjdG9yeUNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1NUT1JBR0VfTUFOQUdFUl9GQUNUT1JZOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIFZhbHVlIHRha2VuIGZyb20gdGhlIFdlYi54bWwgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIENVU1RPTV9GQUNFU19NRVNTQUdFX0ZBQ1RPUlkuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGN1c3RvbUZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9GQUNFU19NRVNTQUdFX0ZBQ1RPUlk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHtAaW5oZXJpdERvY30NCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIENvbnN0cmFpbnRTb3VyY2V9IGNsYXNzIGFzIGFubm90YXRpb24gZm9yIHRoZSBDb25zdHJhaW50IFNvdXJjZSBmZWF0dXJlLiAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGNvbnN0cmFpbnRTb3VyY2VBbm5vdGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENvbnN0cmFpbnRTb3VyY2UuY2xhc3M7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHtAaW5oZXJpdERvY30NCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIElnbm9yZUNvbnN0cmFpbnRTb3VyY2V9IGNsYXNzIGFzIGFubm90YXRpb24gZm9yIHRoZSBpZ25vcmUgZmVhdHVyZSBvZiB0aGUgQ29uc3RyYWludCBTb3VyY2UuDQotICAgICAqLw0KLSAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGlnbm9yZUNvbnN0cmFpbnRTb3VyY2VBbm5vdGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIElnbm9yZUNvbnN0cmFpbnRTb3VyY2UuY2xhc3M7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHtAaW5oZXJpdERvY30NCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIFRhcmdldFByb3BlcnR5fSBjbGFzcyBhcyBhbm5vdGF0aW9uIGZvciB0aGUgQ29uc3RyYWludCBTb3VyY2UgdGFyZ2V0IHByb3BlcnR5IGZlYXR1cmUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHRhcmdldFByb3BlcnR5QW5ub3RhdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBUYXJnZXRQcm9wZXJ0eS5jbGFzczsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVGFyZ2V0UHJvcGVydHlJZH0gY2xhc3MgYXMgYW5ub3RhdGlvbiBmb3IgdGhlIENvbnN0cmFpbnQgU291cmNlIHRhcmdldCBwcm9wZXJ0eSBmZWF0dXJlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiB0YXJnZXRQcm9wZXJ0eUlkQW5ub3RhdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBUYXJnZXRQcm9wZXJ0eUlkLmNsYXNzOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb259IGNsYXNzIGFzIGluZGljYXRvciBmb3IgdGhpcyBmZWF0dXJlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPiBkaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb25WYWxpZGF0aW9uUGFyYW1ldGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzczsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiBGaXJzdCBhIGdsb2JhbCBwYXJhbWV0ZXIgaXMgY2hlY2tlZCB0byBzZWUgaWYgdGhlIE1vZHVsZSBvciBBZGQtb24gaGFzbid0IG92ZXJydWxlZCB0aGUgdmFsdWUgb2YgdGhlDQotICAgICAqIFdlYi54bWwgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIEFDVElWQVRFX1JFUVVJUkVEX0lOSVRJQUxJWkFUSU9OLiAgSWYgb3ZlcnJ1bGVkLCB0aGlzIHZhbHVlIGlzIHRha2VuLCBvdGhlcndpc2UNCi0gICAgICogdGhlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB2YWx1ZS4gIEJ5IGRlZmF1bHQsIHRoZSBtZXRob2QgcmV0dXJuIGZhbHNlIGlmIHRoZXJlIGFyZSBubyB2YWx1ZXMgc3BlY2lmaWVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gYWN0aXZhdGVSZXF1aXJlZEluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgQm9vbGVhbiBnbG9iYWxQcm9wZXJ0eSA9IChCb29sZWFuKUV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KA0KLSAgICAgICAgICAgICAgICBHTE9CQUxfUFJPUEVSVFlfTU9ERV9JTklUX1JFUVVJUkVEKTsNCi0NCi0gICAgICAgIGlmKGdsb2JhbFByb3BlcnR5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdsb2JhbFByb3BlcnR5Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5BQ1RJVkFURV9SRVFVSVJFRF9JTklUSUFMSVpBVElPTiAhPSBudWxsICYmDQotICAgICAgICAgICAgICAgICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFBhcmFtZXRlci5BQ1RJVkFURV9SRVFVSVJFRF9JTklUSUFMSVpBVElPTik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIE1vZHVsZSBhbmQgYWRkLW9uIHdyaXRlcnMgY2FuIHVzZSB0aGlzIG1ldGhvZCB0byBvdmVycnVsZSB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlcg0KLSAgICAgKiBhY3RpdmF0ZVJlcXVpcmVkSW5pdGlhbGl6YXRpb24uIGl0IGlzIGFsc28gdXNlZnVsIGZvciB0aGVtIHRvIHNwZWNpZnkgYSBjZXJ0YWluIHBhcmFtZXRlciB2YWx1ZSB3aXRob3V0IHRoZSBuZWVkDQotICAgICAqIGZvciBhIHdlYi54bWwgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB3ZSB3YW50IHRvIGdpdmUgdGhlIHBhcmFtZXRlcg0KLSAgICAgKiBAcGFyYW0gZm9yY2VPdmVycmlkZSBkbyB3ZSBmb3JjZSBvdmVycmlkaW5nIG9mIGFub3RoZXIgdmFsdWUgc2V0IGJ5IGEgY2FsbCB0byB0aGlzIG92ZXJydWxlIG1ldGhvZC4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBvdmVycnVsZUFjdGl2YXRlUmVxdWlyZWRJbml0aWFsaXphdGlvbihCb29sZWFuIHZhbHVlLCBib29sZWFuIGZvcmNlT3ZlcnJpZGUpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KEdMT0JBTF9QUk9QRVJUWV9NT0RFX0lOSVRfUkVRVUlSRUQsIHZhbHVlLCBmb3JjZU92ZXJyaWRlKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIHtAaW5oZXJpdERvY30NCi0gICAgICogVmFsdWUgdGFrZW4gZnJvbSB0aGUgV2ViLnhtbCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT04uDQotICAgICAqLw0KLSAgICBwdWJsaWMgYm9vbGVhbiBkZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfREVGQVVMVF9DT05WRU5USU9OKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiBWYWx1ZSB0YWtlbiBmcm9tIHRoZSBXZWIueG1sIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBERUFDVElWQVRFX0RFRkFVTFRfTkFNRV9NQVBQRVJTLg0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gZGVhY3RpdmF0ZURlZmF1bHROYW1lTWFwcGVycygpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBkZWFjdGl2YXRlRGVmYXVsdE5hbWVNYXBwZXJzID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfREVGQVVMVF9OQU1FX01BUFBFUlM7DQotICAgICAgICByZXR1cm4gZGVhY3RpdmF0ZURlZmF1bHROYW1lTWFwcGVycyAhPSBudWxsICYmIGRlYWN0aXZhdGVEZWZhdWx0TmFtZU1hcHBlcnMuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIFZhbHVlIHRha2VuIGZyb20gdGhlIFdlYi54bWwgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIERFQUNUSVZBVEVfRUxfUkVTT0xWRVIuDQotICAgICAqLw0KLSAgICBwdWJsaWMgYm9vbGVhbiBkZWFjdGl2YXRlRWxSZXNvbHZlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9FTF9SRVNPTFZFUik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHtAaW5oZXJpdERvY30NCi0gICAgICogVmFsdWUgdGFrZW4gZnJvbSB0aGUgV2ViLnhtbCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgREVBQ1RJVkFURV9DT01QT05FTlRfSU5JVElBTElaQVRJT04uDQotICAgICAqLw0KLSAgICBwdWJsaWMgYm9vbGVhbiBkZWFjdGl2YXRlQ29tcG9uZW50SW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ09NUE9ORU5UX0lOSVRJQUxJWkFUSU9OKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiBWYWx1ZSB0YWtlbiBmcm9tIHRoZSBXZWIueG1sIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBERUFDVElWQVRFX1ZBTElEQVRJT05fUEFSQU1FVEVSUy4NCi0gICAgICovDQotICAgIHB1YmxpYyBib29sZWFuIGRlYWN0aXZhdGVWYWxpZGF0aW9uUGFyYW1ldGVycygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9WQUxJREFUSU9OX1BBUkFNRVRFUlMpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIFZhbHVlIHRha2VuIGZyb20gdGhlIFdlYi54bWwgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIERFQUNUSVZBVEVfUkVOREVSX0tJVF9GQUNUT1JZLg0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gZGVhY3RpdmF0ZVJlbmRlcktpdEZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfUkVOREVSX0tJVF9GQUNUT1JZKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiBGaXJzdCBhIGdsb2JhbCBwYXJhbWV0ZXIgaXMgY2hlY2tlZCB0byBzZWUgaWYgc29tZSBNb2R1bGUgb3IgQWRkLW9uIGhhc24ndCBvdmVycnVsZWQgdGhlIHZhbHVlIG9mIHRoZQ0KLSAgICAgKiBXZWIueG1sIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBERUFDVElWQVRFX1JFUVVJUkVEX0FUVFJJQlVURV9TVVBQT1JULiAgSWYgb3ZlcnJ1bGVkLCB0aGlzIHZhbHVlIGlzIHRha2VuLA0KLSAgICAgKiBvdGhlcndpc2UgdGhlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB2YWx1ZS4gIEJ5IGRlZmF1bHQsIHRoZSBtZXRob2QgcmV0dXJuIGZhbHNlIGlmIHRoZXJlIGFyZSBubyB2YWx1ZXMNCi0gICAgICogc3BlY2lmaWVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gZGVhY3RpdmF0ZVJlcXVpcmVkQXR0cmlidXRlU3VwcG9ydCgpDQotICAgIHsNCi0gICAgICAgIEJvb2xlYW4gZ2xvYmFsUHJvcGVydHkgPSAoQm9vbGVhbilFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eSgNCi0gICAgICAgICAgICAgICAgR0xPQkFMX1BST1BFUlRZX01PREVfUkVTRVRfUkVRVUlSRUQpOw0KLQ0KLSAgICAgICAgaWYoZ2xvYmFsUHJvcGVydHkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2xvYmFsUHJvcGVydHk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfUkVRVUlSRURfQVRUUklCVVRFX1NVUFBPUlQgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9SRVFVSVJFRF9BVFRSSUJVVEVfU1VQUE9SVCk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBNb2R1bGUgYW5kIGFkZC1vbiB3cml0ZXJzIGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gb3ZlcnJ1bGUgdGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXINCi0gICAgICogZGVhY3RpdmF0ZVJlcXVpcmVkQXR0cmlidXRlU3VwcG9ydC4gSXQgaXMgYWxzbyB1c2VmdWwgZm9yIHRoZW0gdG8gc3BlY2lmeSBhIGNlcnRhaW4gcGFyYW1ldGVyIHZhbHVlIHdpdGhvdXQgdGhlDQotICAgICAqIG5lZWQgZm9yIGEgd2ViLnhtbCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHdlIHdhbnQgdG8gZ2l2ZSB0aGUgcGFyYW1ldGVyDQotICAgICAqIEBwYXJhbSBmb3JjZU92ZXJyaWRlIGRvIHdlIGZvcmNlIG92ZXJyaWRpbmcgb2YgYW5vdGhlciB2YWx1ZSBzZXQgYnkgYSBjYWxsIHRvIHRoaXMgb3ZlcnJ1bGUgbWV0aG9kLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG92ZXJydWxlRGVhY3RpdmF0ZVJlcXVpcmVkQXR0cmlidXRlU3VwcG9ydChCb29sZWFuIHZhbHVlLCBib29sZWFuIGZvcmNlT3ZlcnJpZGUpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KEdMT0JBTF9QUk9QRVJUWV9NT0RFX1JFU0VUX1JFUVVJUkVELCB2YWx1ZSwgZm9yY2VPdmVycmlkZSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIFZhbHVlIHRha2VuIGZyb20gdGhlIFdlYi54bWwgaW5pdGlhbGl6YXRpb24gKEpTRiAyKSBwYXJhbWV0ZXINCi0gICAgICogYXZheC5mYWNlcy5JTlRFUlBSRVRfRU1QVFlfU1RSSU5HX1NVQk1JVFRFRF9WQUxVRVNfQVNfTlVMTC4NCi0gICAgICovDQotICAgIHB1YmxpYyBib29sZWFuIGludGVycHJldEVtcHR5U3RyaW5nU3VibWl0dGVkVmFsdWVzQXNOdWxsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICEiZmFsc2UiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLklOVEVSUFJFVF9FTVBUWV9TVFJJTkdfU1VCTUlUVEVEX1ZBTFVFU19BU19OVUxMKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiBWYWx1ZSB0YWtlbiBmcm9tIHRoZSBXZWIueG1sIGluaXRpYWxpemF0aW9uIChKU0YgMikgcGFyYW1ldGVyIGphdmF4LmZhY2VzLlZBTElEQVRFX0VNUFRZX0ZJRUxEUy4NCi0gICAgICovDQotICAgIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlRW1wdHlGaWVsZHMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gISJmYWxzZSIuZXF1YWxzSWdub3JlQ2FzZShXZWJYbWxQYXJhbWV0ZXIuVkFMSURBVEVfRU1QVFlfRklFTERTKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0RlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9EZWZhdWx0UHJvamVjdFN0YWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMzN2ZmOS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0RlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlciBpbXBsZW1lbnRzIFByb2plY3RTdGFnZVJlc29sdmVyDQotew0KLSAgICBwdWJsaWMgUHJvamVjdFN0YWdlIGdldEN1cnJlbnRQcm9qZWN0U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHVzZSB0aGUgZGVmYXVsdCBleHR2YWwgbWVjaGFuaXNtIHRvIGF2b2lkIHRvbyBlYXJseSBldmFsdWF0aW9uIHdpdGggbW9qYXJyYQ0KLSAgICAgICAgU3RyaW5nIHJlc3VsdDsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRBcHBsaWNhdGlvbigpLmdldFByb2plY3RTdGFnZSgpLnRvU3RyaW5nKCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVByb2plY3RTdGFnZShnZXREZWZhdWx0UHJvamVjdFN0YWdlKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwgfHwgIiIuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVByb2plY3RTdGFnZShnZXREZWZhdWx0UHJvamVjdFN0YWdlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZVByb2plY3RTdGFnZShQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKHJlc3VsdC50cmltKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgUHJvamVjdFN0YWdlIGNyZWF0ZVByb2plY3RTdGFnZShQcm9qZWN0U3RhZ2VOYW1lIHByb2plY3RTdGFnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2UocHJvamVjdFN0YWdlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBQcm9qZWN0U3RhZ2VOYW1lIGdldERlZmF1bHRQcm9qZWN0U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0RGVmYXVsdFN0YWdlTmFtZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dC5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNGI2MmIuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkRlZmF1bHRGYWN0b3J5RmluZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeUZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlJlbmRlcmVySW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXIuUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzLmdldEluaXRQYXJhbWV0ZXI7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgRXh0VmFsQ29udGV4dAotewotICAgIHByaXZhdGUgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRXh0VmFsQ29udGV4dCBleHRWYWxDb250ZXh0OwotCi0gICAgLy9kb24ndCB0cnkgdG8gcmVzb2x2ZSBpdCBkeW5hbWljYWxseSBlLmcuIHZpYSBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiAtIHRoZXJlJ3MgYSBtb2phcnJhIGlzc3VlCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9FWFRWQUxfQ09OVEVYVF9DTEFTU19OQU1FID0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuY2xhc3MuZ2V0TmFtZSgpLnJlcGxhY2UoIi5jb3JlLiIsICIuY3VzdG9tLiIpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9FWFRWQUxfTU9EVUxFX0NPTkZJR1VSQVRJT05fUkVTT0xWRVJfQ0xBU1NfTkFNRSA9Ci0gICAgICAgICAgICBFeHRWYWxNb2R1bGVDb25maWd1cmF0aW9uUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpLnJlcGxhY2UoIi5jb3JlLiIsICIuY3VzdG9tLiIpOwotCi0gICAgcHJpdmF0ZSBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7Ci0gICAgcHJpdmF0ZSBGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIgPSBEZWZhdWx0RmFjdG9yeUZpbmRlci5nZXRJbnN0YW5jZSgpOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUmVuZGVyZXJJbnRlcmNlcHRvcj4gcmVuZGVyZXJJbnRlcmNlcHRvcnMgPQotICAgICAgICAgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgUmVuZGVyZXJJbnRlcmNlcHRvcj4oKTsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBkZW5pZWRJbnRlcmNlcHRvcnMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIHByaXZhdGUgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyPiBwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycyA9Ci0gICAgICAgICAgICBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcj4oKTsKLQotICAgIHByaXZhdGUgU2tpcFZhbGlkYXRpb25FdmFsdWF0b3Igc2tpcFZhbGlkYXRpb25FdmFsdWF0b3I7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2xvYmFsUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgLyoqCi0gICAgICogU3RvcmFnZSBmb3IgYWxsIGNvbmZpZ3VyYXRpb24gb2JqZWN0cy4KLSAgICAgKiBAc2luY2UgcjQKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcDxDbGFzczw/IGV4dGVuZHMgRXh0VmFsTW9kdWxlQ29uZmlndXJhdGlvbj4sIEV4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb24+IGV4dFZhbENvbmZpZyA9Ci0gICAgICAgICAgICBuZXcgQ29uY3VycmVudEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIEV4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb24+LCBFeHRWYWxNb2R1bGVDb25maWd1cmF0aW9uPigpOwotCi0gICAgLyoqCi0gICAgICogQ29uZmlndXJlZCBNb2R1bGUgQ29uZmlndXJhdGlvbiByZXNvbHZlci4KLSAgICAgKiBAc2luY2UgcjQKLSAgICAgKi8KLSAgICBwcml2YXRlIEV4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb25SZXNvbHZlciBkZWZhdWx0TW9kdWxlQ29uZmlndXJhdGlvblJlc29sdmVyOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLCBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+Pj4gc3RhdGljQ29uZmlnTWFwCi0gICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcywgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4+KCk7Ci0KLSAgICBwcml2YXRlIEV4dFZhbENvbnRleHRJbnRlcm5hbHMgY29udGV4dEhlbHBlcjsKLSAgICBwcml2YXRlIEV4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscyBpbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXI7Ci0KLSAgICBwcm90ZWN0ZWQgRXh0VmFsQ29udGV4dCgpCi0gICAgewotICAgICAgICB0aGlzLmNvbnRleHRIZWxwZXIgPSBuZXcgRXh0VmFsQ29udGV4dEludGVybmFscygpOwotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlciA9IG5ldyBFeHRWYWxDb250ZXh0SW52b2NhdGlvbk9yZGVyQXdhcmVJbnRlcm5hbHModGhpcy5jb250ZXh0SGVscGVyKTsKLQotICAgICAgICByZXRyaWV2ZU1vZHVsZUNvbmZpZ3VyYXRpb25SZXNvbHZlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgTW9kdWxlIENvbmZpZ3VyYXRpb24gUmVzb2x2ZXIuICBDb2RlIGxvb2tzIGZpcnN0IGZvciBhIHJlc29sdmVyIGxvY2F0ZWQgdW5kZXIgdGhlIEV4dFZhbCBDdXN0b20KLSAgICAgKiBwYWNrYWdlIChvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3VzdG9tLkV4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb25SZXNvbHZlcikgYW5kIHRoZW4gZm9yIGEKLSAgICAgKiB3ZWIueG1sIGRlZmluZWQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLgotICAgICAqIEV4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb25SZXNvbHZlcgotICAgICAqIGZvciBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLiAgVGhlIHJlc29sdmVyIGNvbmZpZ3VyZWQgYnkgdGhlIHdlYi54bWwgb3ZlcnJpZGVzIHRoZSBjdXN0b20gZGVmaW5lZCBvbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJldHJpZXZlTW9kdWxlQ29uZmlndXJhdGlvblJlc29sdmVyKCkKLSAgICB7Ci0gICAgICAgIE9iamVjdCBjdXN0b21FeHRWYWxNb2R1bGVDb25maWd1cmF0aW9uUmVzb2x2ZXIgPQotICAgICAgICAgICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShDVVNUT01fRVhUVkFMX01PRFVMRV9DT05GSUdVUkFUSU9OX1JFU09MVkVSX0NMQVNTX05BTUUpOwotCi0gICAgICAgIGlmKGN1c3RvbUV4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb25SZXNvbHZlciBpbnN0YW5jZW9mIEV4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb25SZXNvbHZlcikKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5kZWZhdWx0TW9kdWxlQ29uZmlndXJhdGlvblJlc29sdmVyID0KLSAgICAgICAgICAgICAgICAgICAgKEV4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb25SZXNvbHZlciljdXN0b21FeHRWYWxNb2R1bGVDb25maWd1cmF0aW9uUmVzb2x2ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgY3VzdG9tRXh0VmFsTW9kdWxlQ29uZmlndXJhdGlvblJlc29sdmVyQ2xhc3NOYW1lID0KLSAgICAgICAgICAgICAgICBnZXRJbml0UGFyYW1ldGVyKG51bGwsIEV4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb25SZXNvbHZlci5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIGlmKGN1c3RvbUV4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb25SZXNvbHZlckNsYXNzTmFtZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBjdXN0b21FeHRWYWxNb2R1bGVDb25maWd1cmF0aW9uUmVzb2x2ZXIgPQotICAgICAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY3VzdG9tRXh0VmFsTW9kdWxlQ29uZmlndXJhdGlvblJlc29sdmVyQ2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgaWYoY3VzdG9tRXh0VmFsTW9kdWxlQ29uZmlndXJhdGlvblJlc29sdmVyIGluc3RhbmNlb2YgRXh0VmFsTW9kdWxlQ29uZmlndXJhdGlvblJlc29sdmVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdE1vZHVsZUNvbmZpZ3VyYXRpb25SZXNvbHZlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoRXh0VmFsTW9kdWxlQ29uZmlndXJhdGlvblJlc29sdmVyKWN1c3RvbUV4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb25SZXNvbHZlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRXh0VmFsQ29udGV4dCBnZXRDb250ZXh0KCkKLSAgICB7Ci0gICAgICAgIGlmIChleHRWYWxDb250ZXh0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4dFZhbENvbnRleHQgPSBuZXcgRXh0VmFsQ29udGV4dCgpOwotCi0gICAgICAgICAgICB0cnlUb0NyZWF0ZUN1c3RvbUV4dFZhbENvbnRleHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXh0VmFsQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRyeVRvQ3JlYXRlQ3VzdG9tRXh0VmFsQ29udGV4dCgpCi0gICAgewotICAgICAgICBPYmplY3QgY3VzdG9tRXh0VmFsQ29udGV4dCA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShDVVNUT01fRVhUVkFMX0NPTlRFWFRfQ0xBU1NfTkFNRSk7Ci0KLSAgICAgICAgaWYgKGN1c3RvbUV4dFZhbENvbnRleHQgaW5zdGFuY2VvZiBFeHRWYWxDb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBleHRWYWxDb250ZXh0ID0gKEV4dFZhbENvbnRleHQpIGN1c3RvbUV4dFZhbENvbnRleHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgdmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcikKLSAgICB7Ci0gICAgICAgIHNldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIodmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigKLSAgICAgICAgICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgdmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciwgYm9vbGVhbiBmb3JjZU92ZXJyaWRlKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMudmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciA9PSBudWxsIHx8IGZvcmNlT3ZlcnJpZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyh2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmdldENsYXNzKCkgKyAiIGlzIHVzZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciA9IHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBnZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCkKLSAgICB7Ci0gICAgICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgcmVxdWVzdFNjb3BlZEludGVycHJldGVyID0gdGhpcy5jb250ZXh0SGVscGVyCi0gICAgICAgICAgICAgICAgLmdldFJlcXVlc3RTY29wZWRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7Ci0KLSAgICAgICAgaWYocmVxdWVzdFNjb3BlZEludGVycHJldGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZXF1ZXN0U2NvcGVkSW50ZXJwcmV0ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpcy52aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBGYWN0b3J5RmluZGVyCi0gICAgKi8KLSAgICBwdWJsaWMgRmFjdG9yeUZpbmRlciBnZXRGYWN0b3J5RmluZGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZhY3RvcnlGaW5kZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmFjdG9yeUZpbmRlcihGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIpCi0gICAgewotICAgICAgICBpZiAoZmFjdG9yeUZpbmRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZhY3RvcnlGaW5kZXIgPSBmYWN0b3J5RmluZGVyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKQotICAgIHsKLSAgICAgICAgc2V0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3Ioc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLCBib29sZWFuIGZvcmNlT3ZlcnJpZGUpCi0gICAgewotICAgICAgICBpZiAodGhpcy5za2lwVmFsaWRhdGlvbkV2YWx1YXRvciA9PSBudWxsIHx8IGZvcmNlT3ZlcnJpZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChza2lwVmFsaWRhdGlvbkV2YWx1YXRvciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuZ2V0Q2xhc3MoKSArICIgaXMgdXNlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5za2lwVmFsaWRhdGlvbkV2YWx1YXRvciA9IHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIGdldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLnNraXBWYWxpZGF0aW9uRXZhbHVhdG9yID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHNraXBWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksIE1ldGFEYXRhRW50cnkgZW50cnkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzLnNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUmVuZGVyZXJJbnRlcmNlcHRvcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxSZW5kZXJlckludGVyY2VwdG9yPiBnZXRSZW5kZXJlckludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxSZW5kZXJlckludGVyY2VwdG9yPih0aGlzLnJlbmRlcmVySW50ZXJjZXB0b3JzLnZhbHVlcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChFeHRWYWxDb250ZXh0LmNsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGhpcy5kZW5pZWRJbnRlcmNlcHRvcnMuY29udGFpbnMocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy5yZW5kZXJlckludGVyY2VwdG9ycy5wdXQocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCksIHJlbmRlcmVySW50ZXJjZXB0b3IpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlcmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKENsYXNzPD8gZXh0ZW5kcyBSZW5kZXJlckludGVyY2VwdG9yPiByZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpCi0gICAgewotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzcyhyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoRXh0VmFsQ29udGV4dC5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5yZW5kZXJlckludGVyY2VwdG9ycy5yZW1vdmUocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy9pZiBhbiBpbnRlcmNlcHRvciBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkIHNvIGZhciwgaXQgc2hvdWxkIGJlIGRlbmllZCBhdCBmdXR1cmUgcmVnaXN0cmF0aW9ucwotICAgIHB1YmxpYyB2b2lkIGRlbnlSZW5kZXJlckludGVyY2VwdG9yKENsYXNzPD8gZXh0ZW5kcyBSZW5kZXJlckludGVyY2VwdG9yPiByZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpCi0gICAgewotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzcyhyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoRXh0VmFsQ29udGV4dC5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCF0aGlzLmRlbmllZEludGVyY2VwdG9ycy5jb250YWlucyhyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5kZW5pZWRJbnRlcmNlcHRvcnMuYWRkKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZXJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ29tcG9uZW50SW5pdGlhbGl6ZXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIoQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdENvbXBvbmVudEluaXRpYWxpemVycygpOwotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5hZGRDb21wb25lbnRJbml0aWFsaXplcihjb21wb25lbnRJbml0aWFsaXplcik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+IGdldENvbXBvbmVudEluaXRpYWxpemVycygpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdENvbXBvbmVudEluaXRpYWxpemVycygpOwotICAgICAgICByZXR1cm4gdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuZ2V0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPiBnZXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmxhenlJbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhbGwgZ2xvYmFsIHZhbGlkYXRpb24gaW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IGdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IGdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc0ZvcihDbGFzcyBtb2R1bGVLZXkpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzRm9yKG1vZHVsZUtleSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmxhenlJbml0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGFsbCBnbG9iYWwgbWV0YS1kYXRhIGV4dHJhY3Rpb24gaW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc0ZvcihDbGFzcyBtb2R1bGVLZXkpCi0gICAgewotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgICAgICBpZihtb2R1bGVLZXkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCksIG1vZHVsZUtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc1dpdGgocHJvcGVydGllcyk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc1dpdGgoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc1dpdGgocHJvcGVydGllcyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI+IGdldFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciBwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycy5hZGQocHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbgotICAgICAqLwotICAgIHB1YmxpYyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBnZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0SGVscGVyLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTdGF0aWNDb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IGdldFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzIG5hbWUpCi0gICAgewotICAgICAgICBpZiAoIXRoaXMuc3RhdGljQ29uZmlnTWFwLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBzdGF0aWNDb25maWdMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4oKTsKLSAgICAgICAgICAgIHRoaXMuc3RhdGljQ29uZmlnTWFwLnB1dChuYW1lLCBzdGF0aWNDb25maWdMaXN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5zdGF0aWNDb25maWdNYXAuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzIG5hbWUsIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZykKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gc3RhdGljQ29uZmlnTGlzdDsKLSAgICAgICAgICAgIGlmICghdGhpcy5zdGF0aWNDb25maWdNYXAuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5zdGF0aWNDb25maWdNYXAucHV0KG5hbWUsIHN0YXRpY0NvbmZpZ0xpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5zdGF0aWNDb25maWdNYXAuZ2V0KG5hbWUpLmFkZChzdGF0aWNDb25maWcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBHbG9iYWwgcHJvcGVydGllcwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gYWRkR2xvYmFsUHJvcGVydHkobmFtZSwgdmFsdWUsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gZm9yY2VPdmVycmlkZSkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLmdsb2JhbFByb3BlcnRpZXMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghZm9yY2VPdmVycmlkZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oIm92ZXJyaWRlIGdsb2JhbCBwcm9wZXJ0eSAnIiArIG5hbWUgKyAiJyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoSnNmUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5EZXZlbG9wbWVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oImdsb2JhbCBwcm9wZXJ0eSBbIiArIG5hbWUgKyAiXSBhZGRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5nbG9iYWxQcm9wZXJ0aWVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0R2xvYmFsUHJvcGVydHkoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5nbG9iYWxQcm9wZXJ0aWVzLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IG9mIHRoZSB0eXBlIHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVyICd0YXJnZXRUeXBlJy4gIFRoZSB0eXBlIHNob3VsZCBiZQotICAgICAqIGRpcmVjdCBkZXNjZW5kYW50cyBvZiBFeHRWYWxNb2R1bGVDb25maWd1cmF0aW9uIGFuZCB0aGUgc2FtZSBhcyB0aGUgdHlwZSB5b3UgdXNlZCB0byByZWdpc3RlciB0aGUgY29uZmlndXJhdGlvbgotICAgICAqIChzZWUgYWRkTW9kdWxlQ29uZmlndXJhdGlvbikuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFyZ2V0VHlwZSBLZXkgdGhhdCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgY29uZmlndXJhdGlvbiwgc2hvdWxkIGJlIGRpcmVjdCBkZXNjZW5kYW50cyBvZgotICAgICAqIEV4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb24KLSAgICAgKiBAcGFyYW0gPFQ+Ci0gICAgICogQHJldHVybiAgY29uZmlndXJhdGlvbiBvYmplY3QKLSAgICAgKiBAc2luY2UgcjQKLSAgICAgKi8KLSAgICBwdWJsaWMgPFQgZXh0ZW5kcyBFeHRWYWxNb2R1bGVDb25maWd1cmF0aW9uPiBUIGdldE1vZHVsZUNvbmZpZ3VyYXRpb24oQ2xhc3M8VD4gdGFyZ2V0VHlwZSkKLSAgICB7Ci0gICAgICAgIEV4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb24gcmVzdWx0ID0gdGhpcy5leHRWYWxDb25maWcuZ2V0KHRhcmdldFR5cGUpOwotCi0gICAgICAgIC8vbm9pbnNwZWN0aW9uIHVuY2hlY2tlZAotICAgICAgICByZXR1cm4gKFQpcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyB0aGUgY29uZmlndXJhdGlvbiBvYmplY3Qgc3BlY2lmaWVkIGluIHRoZSBwYXJhbWV0ZXIgJ2NvbmZpZycgZm9yIHRoZSB0eXBlICdrZXknIHdpdGhpbiBFeHRWYWwKLSAgICAgKiBvdmVycmlkaW5nCi0gICAgICogcG9zc2libGUgYW5vdGhlciByZWdpc3RyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IEtleSB0aGF0IHNwZWNpZmllcyB0aGUgdHlwZSBvZiBjb25maWd1cmF0aW9uLCBzaG91bGQgYmUgZGlyZWN0IGRlc2NlbmRhbnRzIG9mCi0gICAgICogRXh0VmFsTW9kdWxlQ29uZmlndXJhdGlvbgotICAgICAqIEBwYXJhbSBleHRWYWxDb25maWcgQ29uZmlndXJhdGlvbiBvYmplY3QgdG8gcmVnaXN0ZXIKLSAgICAgKiBAcmV0dXJuIHRydWUKLSAgICAgKiBAc2luY2UgcjQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRNb2R1bGVDb25maWd1cmF0aW9uKENsYXNzPD8gZXh0ZW5kcyBFeHRWYWxNb2R1bGVDb25maWd1cmF0aW9uPiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxNb2R1bGVDb25maWd1cmF0aW9uIGV4dFZhbENvbmZpZykKLSAgICB7Ci0gICAgICAgIHJldHVybiBhZGRNb2R1bGVDb25maWd1cmF0aW9uKGtleSwgZXh0VmFsQ29uZmlnLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHNwZWNpZmllZCBpbiB0aGUgcGFyYW1ldGVyICdjb25maWcnIGZvciB0aGUgdHlwZSAna2V5JyB3aXRoaW4gRXh0VmFsLiAgV2hlbiBhCi0gICAgICogY29uZmlndXJhdGlvbiBvYmplY3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGtleSBhbmQgd2UgZG9uJ3Qgc3BlY2lmeSB0byBvdmVycmlkZSBpdCAocGFyYW1ldGVyIGZvcmNlT3ZlcnJpZGUpIHRoZQotICAgICAqIGNvbmZpZ3VyYXRpb24gaXNuJ3QgcmVnaXN0ZXJlZC4KLSAgICAgKiBAcGFyYW0ga2V5IEtleSB0aGF0IHNwZWNpZmllcyB0aGUgdHlwZSBvZiBjb25maWd1cmF0aW9uLCBzaG91bGQgYmUgZGlyZWN0IGRlc2NlbmRhbnRzIG9mCi0gICAgICogRXh0VmFsTW9kdWxlQ29uZmlndXJhdGlvbgotICAgICAqIEBwYXJhbSBjb25maWcgQ29uZmlndXJhdGlvbiBvYmplY3QgdG8gcmVnaXN0ZXIKLSAgICAgKiBAcGFyYW0gZm9yY2VPdmVycmlkZSBEbyB3ZSBvdmVycmlkZSBhbm90aGVyIGN1c3RvbSBjb25maWd1cmF0aW9uIHRoYXQgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpcyB0aGUgY29uZmlndXJhdGlvbiBpcyByZWdpc3RlcmVkIG9yIGZhbHNlIGlmIGFscmVhZHkgZXhpc3RlZCBhbmQgbm8gb2ZyY2Ugb3ZlcnJpZGUgc3BlY2lmaWVkLgotICAgICAqIEBzaW5jZSByNAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZE1vZHVsZUNvbmZpZ3VyYXRpb24oQ2xhc3M8PyBleHRlbmRzIEV4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb24+IGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb24gY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmb3JjZU92ZXJyaWRlKQotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgaWYgaXQgYWxyZWFkeSBleGlzdHMuCi0gICAgICAgIGlmICh0aGlzLmV4dFZhbENvbmZpZy5jb250YWluc0tleShrZXkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWZvcmNlT3ZlcnJpZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgZm9yY2VkLCBzbyBub3QgcmVnaXN0ZXJlZAotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygib3ZlcnJpZGUgY29uZmlnIGZvciBrZXkgJyIgKyBjb25maWcuZ2V0Q2xhc3MoKSArICInIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvL2Fub255bW91cyBjbGFzcyBhcmUgb25seSBzdXBwb3J0ZWQgZm9yIHRlc3QtY2FzZXMgYW5kCi0gICAgICAgIC8vdGhlcmUgd2UgZG9uJ3QgbmVlZCBhIGN1c3RvbSBjb25maWcgZGVmaW5lZCBpbiB0aGUgd2ViLnhtbAotICAgICAgICAvLyBvciBmcm9tIGEgcmVzb2x2ZXIKLSAgICAgICAgaWYoIWNvbmZpZy5nZXRDbGFzcygpLmlzQW5vbnltb3VzQ2xhc3MoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY29uZmlnID0gdHJ5VG9Mb2FkQ3VzdG9tQ29uZmlnSW1wbGVtZW50YXRpb24oY29uZmlnKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFN0b3JlIHRoZSBjb25maWd1cmF0aW9uCi0gICAgICAgIHRoaXMuZXh0VmFsQ29uZmlnLnB1dChrZXksIGNvbmZpZyk7Ci0KLSAgICAgICAgLy8gTG9nZ2luZyB3aGVuIGluIERldmVsb3BtZW50IFN0YWdlLgotICAgICAgICBpZihKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLkRldmVsb3BtZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygiY29uZmlnIGZvciBrZXkgWyIgKyBjb25maWcuZ2V0Q2xhc3MoKSArICJdIGFkZGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmllcyB0byBsb2FkIGEgY3VzdG9tIGNvbmZpZ3VyYXRpb24gaW1wbGVtZW50YXRpb24gYnkgbG9va2luZyBmb3IgYSB3ZWIueG1sIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlci4gVGhlIG1ldGhvZAotICAgICAqIHJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgc2hvdWxkIGJlIHVzZWQuIFRoYXQgaXMsIHRoZSBjdXN0b20gZGVmaW5lZCB2ZXJzaW9uIG9yIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBhcyBwYXJhbWV0ZXIgb2YgdGhlIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWcgVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB3aGljaCB3ZSB0cnkgdG8gbG9hZCBhbm90aGVyIHZlcnNpb24KLSAgICAgKiBAcmV0dXJuIFRoZSBjdXN0b20gY29uZmlndXJhdGlvbiBvYmplY3Qgb3IgcGFyYW1ldGVyIHNwZWNpZmllZCBpZiBubyBhbHRlcm5hdGl2ZSBmb3VuZC4KLSAgICAgKiBAc2luY2UgcjQKLSAgICAgKi8KLSAgICBwcml2YXRlIEV4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb24gdHJ5VG9Mb2FkQ3VzdG9tQ29uZmlnSW1wbGVtZW50YXRpb24oRXh0VmFsTW9kdWxlQ29uZmlndXJhdGlvbiBjb25maWcpCi0gICAgewotICAgICAgICAvLyBHZXQgdGhlIHBhcmVudCBpZiB0aGUgcGFyYW1ldGVyLiAgRm9yIHRoZSBkZWZhdWx0IHZlcnNpb24sIGxpa2UgRGVmYXVsdEV4dFZhbENvcmVDb25maWd1cmF0aW9uLCBpdCBpcwotICAgICAgICAvLyB0aGUgYWJzdHJhY3QgYmFzZSBjbGFzcy4KLSAgICAgICAgQ2xhc3MgY29uZmlnQ2xhc3MgPSBjb25maWcuZ2V0Q2xhc3MoKS5nZXRTdXBlcmNsYXNzKCk7Ci0KLSAgICAgICAgLy8gVG8gYmUgb24gdGhlIHNhZmUgc2lkZSB0aGF0IHRoZSBwYXJlbnQgc3RpbGwgYmVsb25ncyB0byB0aGUgY29uZmlndXJhdGlvbiBwYXJ0IG9mIEV4dFZhbC4KLSAgICAgICAgaWYoIUV4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjb25maWdDbGFzcykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb25maWc7Ci0gICAgICAgIH0KLQotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgRXh0VmFsTW9kdWxlQ29uZmlndXJhdGlvbj4gY29uZmlnRGVmaW5pdGlvbkNsYXNzID0KLSAgICAgICAgICAgICAgICAoQ2xhc3M8PyBleHRlbmRzICBFeHRWYWxNb2R1bGVDb25maWd1cmF0aW9uPiljb25maWdDbGFzczsKLQotICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgcmVzb2x2ZXIsIHVzZSBpdCB0byByZXRyaWV2ZSB0aGUgY29uZmlndXJhdGlvbgotICAgICAgICBpZih0aGlzLmRlZmF1bHRNb2R1bGVDb25maWd1cmF0aW9uUmVzb2x2ZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgY29uZmlnID0gdGhpcy5kZWZhdWx0TW9kdWxlQ29uZmlndXJhdGlvblJlc29sdmVyLmdldEN1c3RvbUNvbmZpZ3VyYXRpb24oY29uZmlnRGVmaW5pdGlvbkNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIExvb2t1cCB0aGUgd2ViLnhtbCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIKLSAgICAgICAgU3RyaW5nIGN1c3RvbUNvbmZpZ0NsYXNzTmFtZSA9IGdldEluaXRQYXJhbWV0ZXIobnVsbCwgY29uZmlnRGVmaW5pdGlvbkNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgaWYoY3VzdG9tQ29uZmlnQ2xhc3NOYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIHNwZWNpZmllZCwgc2VlIGlmIGl0IGV4aXN0cyBhbmQgY2FuIGJlIHVzZWQuCi0gICAgICAgICAgICBPYmplY3QgY3VzdG9tQ29uZmlnID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGN1c3RvbUNvbmZpZ0NsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmKGN1c3RvbUNvbmZpZyBpbnN0YW5jZW9mIEV4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChFeHRWYWxNb2R1bGVDb25maWd1cmF0aW9uKWN1c3RvbUNvbmZpZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyByZXR1cm4gdGhlIHBhcmFtZXRlciBvciByZXNvbHZlciBvbmUuCi0gICAgICAgIHJldHVybiBjb25maWc7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0SW50ZXJuYWxzLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnRlcm5hbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ1YzNhOC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnRlcm5hbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIHgueC4zCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBFeHRWYWxDb250ZXh0SW50ZXJuYWxzCi17Ci0gICAgYm9vbGVhbiBpc0NvbXBvbmVudEluaXRpYWxpemF0aW9uQWN0aXZhdGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAhRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb24uZ2V0KCkuZGVhY3RpdmF0ZUNvbXBvbmVudEluaXRpYWxpemF0aW9uKCk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkKLSAgICBzeW5jaHJvbml6ZWQgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gaW5pdEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKE1hcCBhcHBsaWNhdGlvbk1hcCkKLSAgICB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMuYWRkKEV4dFZhbENvcmVDb25maWd1cmF0aW9uLmdldCgpLmN1c3RvbUluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lKCkpOwotICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMuYWRkKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkNVU1RPTV9CRUFOKTsKLQotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbjsKLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChpbmZvcm1hdGlvblByb3ZpZGVyQmVhbiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uTWFwLnB1dChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUsIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnlUb0luaXRDdXN0b21Db25maWd1cmVkSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWUoYXBwbGljYXRpb25NYXApOwotCi0gICAgICAgIGlmIChhcHBsaWNhdGlvbk1hcC5jb250YWluc0tleShJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBhcHBsaWNhdGlvbk1hcC5nZXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkKLSAgICBzeW5jaHJvbml6ZWQgdm9pZCB0cnlUb0luaXRDdXN0b21Db25maWd1cmVkSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWUoTWFwIGFwcGxpY2F0aW9uTWFwKQotICAgIHsKLSAgICAgICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gYmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKQotICAgICAgICAgICAgICAgIC5nZXRCZWFuKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkNVU1RPTV9CRUFOLnJlcGxhY2UoIi4iLCAiXyIpKTsKLQotICAgICAgICBpZiAoYmVhbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcHBsaWNhdGlvbk1hcC5wdXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FLCBiZWFuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICB7Ci0gICAgICAgIE1hcCBhcHBsaWNhdGlvbk1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbk1hcCgpOwotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBiZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBhcHBsaWNhdGlvbk1hcC5nZXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FKTsKLQotICAgICAgICBpZiAoYmVhbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW5pdEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKGFwcGxpY2F0aW9uTWFwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmVhbjsKLSAgICB9Ci0KLSAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGdldFJlcXVlc3RTY29wZWRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKAotICAgICAgICAgICAgICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmNsYXNzLCBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpCi0gICAgICAgICAgICAgICAgLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscy5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0SW52b2NhdGlvbk9yZGVyQXdhcmVJbnRlcm5hbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ1NDc1Zi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgeC54LjMKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIEV4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscwotewotICAgIHByaXZhdGUgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCi0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMgPSBudWxsOwotICAgIHByaXZhdGUgTWFwPENsYXNzLCBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPj4gbW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMgPSBudWxsOwotICAgIHByaXZhdGUgTGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+IHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMgPSBudWxsOwotICAgIHByaXZhdGUgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0gbnVsbDsKLSAgICBwcml2YXRlIE1hcDxDbGFzcywgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4+IG1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0gbnVsbDsKLSAgICBwcml2YXRlIExpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+IGNvbXBvbmVudEluaXRpYWxpemVycyA9IG51bGw7Ci0KLSAgICBwcml2YXRlIEV4dFZhbENvbnRleHRJbnRlcm5hbHMgY29udGV4dEhlbHBlcjsKLQotICAgIEV4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscyhFeHRWYWxDb250ZXh0SW50ZXJuYWxzIGNvbnRleHRIZWxwZXIpCi0gICAgewotICAgICAgICB0aGlzLmNvbnRleHRIZWxwZXIgPSBjb250ZXh0SGVscGVyOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ29tcG9uZW50SW5pdGlhbGl6ZXJzCi0gICAgICovCi0gICAgdm9pZCBhZGRDb21wb25lbnRJbml0aWFsaXplcihDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplcikKLSAgICB7Ci0gICAgICAgIHRoaXMuY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChjb21wb25lbnRJbml0aWFsaXplcik7Ci0gICAgICAgIHNvcnRDb21wb25lbnRJbml0aWFsaXplcnMoKTsKLSAgICB9Ci0KLSAgICBMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPiBnZXRDb21wb25lbnRJbml0aWFsaXplcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dEhlbHBlci5pc0NvbXBvbmVudEluaXRpYWxpemF0aW9uQWN0aXZhdGVkKCkgPwotICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50SW5pdGlhbGl6ZXJzIDogbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPigpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycwotICAgICAqLwotICAgIHZvaWQgYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMuYWRkKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgIHNvcnRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgfQotCi0gICAgTGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+IGdldFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycwotICAgICAqLwotICAgIHZvaWQgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBpZiAocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uTW9kdWxlQXdhcmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlcyhwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgICAgICBzb3J0TW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlKG51bGwsIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsKLSAgICAgICAgICAgIHNvcnRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IGdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzRm9yKENsYXNzIG1vZHVsZUtleSkKLSAgICB7Ci0gICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+KCk7Ci0KLSAgICAgICAgcmVzdWx0LmFkZEFsbChnZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKSk7Ci0KLSAgICAgICAgaWYgKG1vZHVsZUtleSAhPSBudWxsICYmIHRoaXMubW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMuY29udGFpbnNLZXkobW9kdWxlS2V5KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0aGlzLm1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzLmdldChtb2R1bGVLZXkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdChyZXN1bHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckZvck1vZHVsZXMoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBDbGFzcyBtb2R1bGVLZXk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGN1cnJlbnRNb2R1bGVLZXkgOiAoKFZhbGlkYXRpb25Nb2R1bGVBd2FyZSkgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpLmdldE1vZHVsZUtleXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbW9kdWxlS2V5ID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUoY3VycmVudE1vZHVsZUtleSk7Ci0KLSAgICAgICAgICAgIGlmIChtb2R1bGVLZXkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUobW9kdWxlS2V5LCBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUoCi0gICAgICAgICAgICBDbGFzcyBtb2R1bGVLZXksIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgaWYgKG1vZHVsZUtleSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5hZGQocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICBsb2dnZXIuZmluZXN0KHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCBhcyBnbG9iYWwgaW50ZXJjZXB0b3IiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdDsKLSAgICAgICAgICAgIGlmICh0aGlzLm1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzLmNvbnRhaW5zS2V5KG1vZHVsZUtleSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0ID0gdGhpcy5tb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5nZXQobW9kdWxlS2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+KCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5tb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5wdXQobW9kdWxlS2V5LCBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0LmFkZChwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7Ci0KLSAgICAgICAgICAgIGxvZ2dlci5maW5lc3QocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIGZvciAiICsgbW9kdWxlS2V5LmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycwotICAgICAqLwotICAgIHZvaWQgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBpZihtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBpbnN0YW5jZW9mIFZhbGlkYXRpb25Nb2R1bGVBd2FyZSkKLSAgICAgICAgewotICAgICAgICAgICAgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGVzKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsKLSAgICAgICAgICAgIHNvcnRNb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUobnVsbCwgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpOwotICAgICAgICAgICAgc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlcyhNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIENsYXNzIG1vZHVsZUtleTsKLSAgICAgICAgZm9yIChTdHJpbmcgY3VycmVudE1vZHVsZUtleSA6ICgoVmFsaWRhdGlvbk1vZHVsZUF3YXJlKSBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcikuZ2V0TW9kdWxlS2V5cygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb2R1bGVLZXkgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShjdXJyZW50TW9kdWxlS2V5KTsKLQotICAgICAgICAgICAgaWYgKG1vZHVsZUtleSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckZvck1vZHVsZShtb2R1bGVLZXksIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckZvck1vZHVsZSgKLSAgICAgICAgICAgIENsYXNzIG1vZHVsZUtleSwgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBpZiAobW9kdWxlS2V5ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLmFkZChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0KLSAgICAgICAgICAgIGxvZ2dlci5maW5lc3QobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIGFzIGdsb2JhbCBpbnRlcmNlcHRvciIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0OwotICAgICAgICAgICAgaWYgKHRoaXMubW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMuY29udGFpbnNLZXkobW9kdWxlS2V5KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QgPSB0aGlzLm1vZHVsZVNwZWNpZmljTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLmdldChtb2R1bGVLZXkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdCA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4oKTsKLSAgICAgICAgICAgICAgICB0aGlzLm1vZHVsZVNwZWNpZmljTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLnB1dChtb2R1bGVLZXksIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QuYWRkKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsKLQotICAgICAgICAgICAgbG9nZ2VyLmZpbmVzdChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQgZm9yICIgKyBtb2R1bGVLZXkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5tZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzV2l0aChNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPigpOwotCi0gICAgICAgIHJlc3VsdC5hZGRBbGwoZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkpOwotCi0gICAgICAgIENsYXNzIG1vZHVsZUtleSA9IHRyeVRvUmVzb2x2ZU1vZHVsZUtleShwcm9wZXJ0aWVzKTsKLSAgICAgICAgaWYobW9kdWxlS2V5ICE9IG51bGwgJiYgdGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5jb250YWluc0tleShtb2R1bGVLZXkpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRoaXMubW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMuZ2V0KG1vZHVsZUtleSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNvcnRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QocmVzdWx0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENsYXNzIHRyeVRvUmVzb2x2ZU1vZHVsZUtleShNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICBDbGFzcyBtb2R1bGVLZXkgPSBudWxsOwotICAgICAgICBpZihwcm9wZXJ0aWVzICE9IG51bGwgJiYgcHJvcGVydGllcy5jb250YWluc0tleShWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzLmdldE5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBmb3VuZFZhbHVlID0gcHJvcGVydGllcy5nZXQoVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgaWYoZm91bmRWYWx1ZSBpbnN0YW5jZW9mIENsYXNzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vZHVsZUtleSA9IChDbGFzcylmb3VuZFZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtb2R1bGVLZXk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBpbml0Ci0gICAgICovCi0KLSAgICB2b2lkIGxhenlJbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBpZiAodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4oKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZChFeHRWYWxDb3JlQ29uZmlndXJhdGlvbi5nZXQoKS5jdXN0b21WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWUoKSk7Ci0gICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKHRoaXMuY29udGV4dEhlbHBlci5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SKSk7Ci0KLSAgICAgICAgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsKLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSA6IHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgIChWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUpOwotCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycy5hZGQodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKTsKLQotICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lc3QodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBsYXp5SW5pdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBpZiAobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyA9Ci0gICAgICAgICAgICAgICAgbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPigpOwotICAgICAgICBtb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyA9Ci0gICAgICAgICAgICAgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPENsYXNzLCBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPj4oKTsKLQotICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZChFeHRWYWxDb3JlQ29uZmlndXJhdGlvbi5nZXQoKS5jdXN0b21NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckNsYXNzTmFtZSgpKTsKLSAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZCh0aGlzLmNvbnRleHRIZWxwZXIuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUikpOwotCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOwotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lIDogbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgIChNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgbGF6eUluaXRDb21wb25lbnRJbml0aWFsaXplcnMoKQotICAgIHsKLSAgICAgICAgaWYgKGNvbXBvbmVudEluaXRpYWxpemVycyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+KCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZChFeHRWYWxDb3JlQ29uZmlndXJhdGlvbi5nZXQoKS5jdXN0b21Db21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZSgpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZCh0aGlzLmNvbnRleHRIZWxwZXIuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX0lOSVRJQUxJWkVSKSk7Ci0KLSAgICAgICAgQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXI7Ci0gICAgICAgIGZvciAoU3RyaW5nIGNvbXBvbmVudEluaXRpYWxpemVyTmFtZSA6IGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXIgPQotICAgICAgICAgICAgICAgICAgICAoQ29tcG9uZW50SW5pdGlhbGl6ZXIpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjb21wb25lbnRJbml0aWFsaXplck5hbWUpOwotCi0gICAgICAgICAgICBpZiAoY29tcG9uZW50SW5pdGlhbGl6ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKGNvbXBvbmVudEluaXRpYWxpemVyKTsKLQotICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lc3QoY29tcG9uZW50SW5pdGlhbGl6ZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGxhenlJbml0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0KLSAgICAgICAgICAgICAgICBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+KCk7Ci0gICAgICAgIG1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0KLSAgICAgICAgICAgICAgICBuZXcgQ29uY3VycmVudEhhc2hNYXA8Q2xhc3MsIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+PigpOwotCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgdmFsaWRhdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb24uZ2V0KCkuY3VzdG9tUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWUoKSk7Ci0gICAgICAgIHZhbGlkYXRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKHRoaXMuY29udGV4dEhlbHBlci5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbUluZm9ybWF0aW9uLlBST1BFUlRZX1ZBTElEQVRJT05fSU5URVJDRVBUT1IpKTsKLQotICAgICAgICBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsKLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvbkludGVyY2VwdG9yTmFtZSA6IHZhbGlkYXRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yID0KLSAgICAgICAgICAgICAgICAgICAgKFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uSW50ZXJjZXB0b3JOYW1lKTsKLQotICAgICAgICAgICAgaWYgKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIGluc3RhbmNlb2YgVmFsaWRhdGlvbk1vZHVsZUF3YXJlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGVzKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUobnVsbCwgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogc29ydAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzb3J0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCkKLSAgICB7Ci0gICAgICAgIExpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+IGNvbXBvbmVudEluaXRpYWxpemVyc1RvU29ydCA9Ci0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4odGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMpOwotCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoY29tcG9uZW50SW5pdGlhbGl6ZXJzVG9Tb3J0LCBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxDb21wb25lbnRJbml0aWFsaXplcj4oKSk7Ci0KLSAgICAgICAgdGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMuY2xlYXIoKTsKLSAgICAgICAgdGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMuYWRkQWxsKGNvbXBvbmVudEluaXRpYWxpemVyc1RvU29ydCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNvcnRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzVG9Tb3J0ID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPih0aGlzLnByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycyk7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzVG9Tb3J0LAotICAgICAgICAgICAgICAgIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPigpKTsKLQotICAgICAgICB0aGlzLnByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5jbGVhcigpOwotICAgICAgICB0aGlzLnByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5hZGRBbGwocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzVG9Tb3J0KTsKLSAgICB9Ci0KLSAgICAvL3NvcnQgYWxsIC0gaXQgaXNuJ3QgYSBodWdlIG92ZXJoZWFkIHNpbmNlIGl0J3MganVzdCBkb25lIGR1cmluZyB0aGUgaW5pdC1waGFzZQotICAgIHByaXZhdGUgdm9pZCBzb3J0TW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgZm9yKExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdCA6Ci0gICAgICAgICAgICAgICAgdGhpcy5tb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy52YWx1ZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdChwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBzb3J0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0KAotICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0KQotICAgIHsKLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0VG9Tb3J0ID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPihwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QpOwotCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0VG9Tb3J0LAotICAgICAgICAgICAgICAgICAgICBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4oKSk7Ci0KLSAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0LmNsZWFyKCk7Ci0gICAgICAgIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdC5hZGRBbGwocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0VG9Tb3J0KTsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc29ydFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgTGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+IHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnNUb1NvcnQgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPih0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMpOwotCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yc1RvU29ydCwKLSAgICAgICAgICAgICAgICBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+KCkpOwotCi0gICAgICAgIHRoaXMudmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycy5jbGVhcigpOwotICAgICAgICB0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMuYWRkQWxsKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnNUb1NvcnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzb3J0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc1RvU29ydCA9Ci0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4odGhpcy5tZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMpOwotCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzVG9Tb3J0LAotICAgICAgICAgICAgICAgIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPigpKTsKLQotICAgICAgICB0aGlzLm1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5jbGVhcigpOwotICAgICAgICB0aGlzLm1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5hZGRBbGwobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzVG9Tb3J0KTsKLSAgICB9Ci0KLSAgICAvL3NvcnQgYWxsIC0gaXQgaXNuJ3QgYSBodWdlIG92ZXJoZWFkIHNpbmNlIGl0J3MganVzdCBkb25lIGR1cmluZyB0aGUgaW5pdC1waGFzZQotICAgIHByaXZhdGUgdm9pZCBzb3J0TW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgZm9yKExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdCA6Ci0gICAgICAgICAgICAgICAgdGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy52YWx1ZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBzb3J0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0KAotICAgICAgICAgICAgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0KQotICAgIHsKLSAgICAgICAgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0VG9Tb3J0ID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPihtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QpOwotCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0VG9Tb3J0LAotICAgICAgICAgICAgICAgICAgICBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4oKSk7Ci0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0LmNsZWFyKCk7Ci0gICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdC5hZGRBbGwobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0VG9Tb3J0KTsKLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvcmVDb25maWd1cmF0aW9uLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvcmVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYmMwY2QuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5Qcm94eUhlbHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIEV4dFZhbCBDb3JlIE1vZHVsZSBjb25maWd1cmF0aW9uLg0KLSAqICdjdXN0b20nIGFzIHByZWZpeCBpcyB1c2VkIGZvciAnb3B0aW9uYWwnIGNvbmZpZ3VyYXRpb25zLiBUaGF0IG1lYW5zDQotICogaWYgYSBtZXRob2QgcmV0dXJucyBudWxsIEV4dFZhbCB1c2VzIGEgZGlmZmVyZW50IGFwcHJvYWNoIHRvIGZpbmQgYW4gaW1wbGVtZW50YXRpb24gZS5nLiB2aWEgYSBuYW1pbmcgY29udmVudGlvbg0KLSAqIC0+IGFsbCBvdGhlciBtZXRob2RzIGFyZW4ndCBhbGxvd2VkIHRvIHJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgcnVsZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSByNA0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEV4dFZhbENvcmVDb25maWd1cmF0aW9uIGltcGxlbWVudHMgRXh0VmFsTW9kdWxlQ29uZmlndXJhdGlvbg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgRXh0VmFsQ29udGV4dCBleHRWYWxDb250ZXh0ID0gbnVsbDsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfTU9EVUxFX0NPTkZJR19NRVNTQUdFID0NCi0gICAgICAgICAgICAibm8gY29uZmlnIGZvciAiICsgRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb24uY2xhc3MuZ2V0TmFtZSgpICsgIiBmb3VuZC4gIiArDQotICAgICAgICAgICAgIm1heWJlIHRoZSBjYWxsIG9mIEV4dFZhbENvcmVDb25maWcjZ2V0IGlzIHRyaWdnZXJlZCBiZWZvcmUgdGhlIHJlZ2lzdHJhdGlvbiBwcm9jZXNzLiIgKw0KLSAgICAgICAgICAgICJ0aGUgZGVmYXVsdCBjb25maWcgZ2V0cyB1c2VkLiI7DQotDQotICAgIHByb3RlY3RlZCBFeHRWYWxDb3JlQ29uZmlndXJhdGlvbigpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogRG9uJ3QgYWNjZXNzIEV4dFZhbENvbnRleHQgZHVyaW5nIGluaXRpYWxpemF0aW9uIG9mIHRoZSBjbGFzcy4gRS5nLiBPcGVuV2ViQmVhbnMgaW5pdGlhbGl6ZXMgYWxsIGNsYXNzZXMgZHVyaW5nDQotICAgICAqIHN0YXJ0dXAgb2YgdGhlIFdlYkNvbnRhaW5lci4NCi0gICAgICogKHtAbGluayBFeHRWYWxDb250ZXh0fSBjb25zdHJ1Y3RvciB0cmllcyB0byBhY2Nlc3MgV2ViLnhtbCBwYXJhbWV0ZXJzIHRocm91Z2gNCi0gICAgICoge0BsaW5rIGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0fSB3aGljaCBpc24ndCBhdmFpbGFibGUgZHVyaW5nIHRoZSBjbGFzc3BhdGgtc2Nhbm5pbmcuKQ0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIFRoZSBFeHRWYWxDb250ZXh0DQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBFeHRWYWxDb250ZXh0IGdldEV4dFZhbENvbnRleHQoKQ0KLSAgICB7DQotICAgICAgICBpZiAoZXh0VmFsQ29udGV4dCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGV4dFZhbENvbnRleHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBleHRWYWxDb250ZXh0Ow0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNvcmUtbW9kdWxlIHN0b3JlZCBpbiB0aGUgY29udGV4dC4NCi0gICAgICogSWYgdGhpcyBkb2Vzbid0IGV4aXN0cyAodXN1YWxseSBhIHN0YXJ0dXAtbGlzdGVuZXIgcmVnaXN0ZXJzIGEgKGN1c3RvbSkgaW1wbGVtZW50YXRpb24pLA0KLSAgICAgKiBpdCByZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLg0KLSAgICAgKiANCi0gICAgICogQHJldHVybiBUaGUgYWN0aXZlIEV4dFZhbCBDb3JlIE1vZHVsZSBDb25maWd1cmF0aW9uIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBFeHRWYWxDb3JlQ29uZmlndXJhdGlvbiBnZXQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb3JlQ29uZmlndXJhdGlvbiBtb2R1bGVDb25maWcgPSBnZXRFeHRWYWxDb250ZXh0KCkuZ2V0TW9kdWxlQ29uZmlndXJhdGlvbihFeHRWYWxDb3JlQ29uZmlndXJhdGlvbi5jbGFzcyk7DQotDQotICAgICAgICBpZihtb2R1bGVDb25maWcgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBMT0dHRVIuZmluZShNSVNTSU5HX01PRFVMRV9DT05GSUdfTUVTU0FHRSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbW9kdWxlQ29uZmlnICE9IG51bGwgPyBtb2R1bGVDb25maWcgOiBuZXcgRGVmYXVsdEV4dFZhbENvcmVDb25maWd1cmF0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgYSBuZXcgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNvcmUtbW9kdWxlDQotICAgICAqDQotICAgICAqIEBwYXJhbSBjb25maWcgVGhlIG5ldyBjb25maWd1cmF0aW9uIGZvciB0aGUgY29yZS1tb2R1bGUNCi0gICAgICogQHBhcmFtIGZvcmNlT3ZlcnJpZGUgdXNlIHRydWUgdG8gcmVwbGFjZSBhbiBleGlzdGluZyBjb25maWd1cmF0aW9uDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmV3IGNvbmZpZyB3YXMgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHkNCi0gICAgICovDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1c2UoRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb24gY29uZmlnLCBib29sZWFuIGZvcmNlT3ZlcnJpZGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRFeHRWYWxDb250ZXh0KCkuYWRkTW9kdWxlQ29uZmlndXJhdGlvbihFeHRWYWxDb3JlQ29uZmlndXJhdGlvbi5jbGFzcywgY29uZmlnLCBmb3JjZU92ZXJyaWRlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiB3ZWIueG1sIGNvbmZpZw0KLSAgICAgKi8NCi0gICAgLyoqDQotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBSZXNvdXJjZSBidW5kbGUgdXNlZCBmb3IgbG9va2luZyB1cCByZXNvdXJjZSBrZXlzIG9mIHZhbGlkYXRpb24gbWVzc2FnZXMuDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuIEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgY3VzdG9tIHJlc291cmNlIGJ1bmRsZS4NCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBjdXN0b21NZXNzYWdlQnVuZGxlQmFzZU5hbWUoKTsNCi0NCi0gICAgLyoqDQotICAgICAqIERlZmluZSBhIG5ldyBiYXNlIHBhY2thZ2Ugd2hlcmUgY3VzdG9tIHZlcnNpb25zIG9mIHRoZSBFeHRWYWwgYXJ0aWZhY3RzIGNhbiBiZSBmb3VuZC4NCi0gICAgICogKERlZmF1bHQgdmFsdWU6IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jdXN0b20pDQotICAgICAqDQotICAgICAqIEBzZWUgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4jc2V0dXBDdXN0b21pemFibGVJbmZvcm1hdGlvbigpDQotICAgICAqDQotICAgICAqIEByZXR1cm4gcGFja2FnZSBuYW1lDQotICAgICAqLw0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGN1c3RvbUJhc2VQYWNrYWdlKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBEZWZpbmVzIHRoZSBjbGFzcyBuYW1lIGZvciBhIGN1c3RvbSB7QGxpbmsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW59LiBUaGlzIGNsYXNzIG11c3QgZXh0ZW5kDQotICAgICAqIHtAbGluayBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbn0uDQotICAgICAqICAgDQotICAgICAqIEByZXR1cm4gRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIHVzZWQgYXMge0BsaW5rIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFufQ0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBjdXN0b21JbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZSgpOw0KLQ0KLSAgICAvKioNCi0gICAgICogRGVmaW5lcyB0aGUgY2xhc3MgbmFtZSBvZiBhIGN1c3RvbQ0KLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yfS4NCi0gICAgICogKERlZmF1bHQgaW1wbGVtZW50YXRpb246DQotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yfSkuDQotICAgICAqDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLkRlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkjY3JlYXRlV2l0aChqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsamF2YS5sYW5nLk9iamVjdD4pDQotICAgICAqDQotICAgICAqIEByZXR1cm4gRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIHVzZWQgYXMNCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3Rvcn0uDQotICAgICAqLw0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGN1c3RvbUNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBEZWZpbmVzIHRoZSBjbGFzcyBuYW1lIG9mIGEgY3VzdG9tIHtAbGluaw0KLSAgICAgKiBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yfS4NCi0gICAgICogKERlZmF1bHQgaW1wbGVtZW50YXRpb246DQotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvcn0uDQotICAgICAqDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5I2NyZWF0ZSgpDQotICAgICAqDQotICAgICAqIEByZXR1cm4gRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIHVzZWQgYXMNCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IpLg0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBjdXN0b21WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yQ2xhc3NOYW1lKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBOYW1lIG9mIHRoZSBvcHRpb25hbCBwcm9wZXJ0eSBmaWxlIHdoaWNoIGNvbnRhaW5zIHRoZSBtYXBwaW5ncyBiZXR3ZWVuIEV4dFZhbCBjb25zdHJhaW50cyBhbmQgdGhlDQotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneX1zIGZvciB2YWxpZGF0aW5nIHRoZW0uDQotICAgICAqIFRoZXNlIG1hcHBpbmdzIGNhbiBiZSB1c2VkIHRvIG92ZXJydWxlIGFsbCBvdGhlciBjb25maWd1cmF0aW9ucy4NCi0gICAgICoNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5I2luaXRTdGF0aWNNYXBwaW5ncygpDQotICAgICAqDQotICAgICAqIEByZXR1cm4gRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgd2hpY2ggY29udGFpbnMgdGhlIG1hcHBpbmdzLg0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBjdXN0b21TdGF0aWNWYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nU291cmNlKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBEZWZpbmVzIHRoZSBuYW1lIG9mIGEgY3VzdG9tDQotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXJ9Lg0KLSAgICAgKg0KLSAgICAgKiBAc2VlIEV4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscyNsYXp5SW5pdENvbXBvbmVudEluaXRpYWxpemVycygpDQotICAgICAqDQotICAgICAqIEByZXR1cm4gRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIHVzZWQgYXMNCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcn0uDQotICAgICAqLw0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGN1c3RvbUNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBEZWZpbmVzIHRoZSBuYW1lIG9mIGEgY3VzdG9tDQotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3J9Lg0KLSAgICAgKg0KLSAgICAgKiBAc2VlIEV4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscyNsYXp5SW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQ0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIEZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjbGFzcyB0byBiZSB1c2VkIGFzDQotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3J9Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBjdXN0b21WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWUoKTsNCi0NCi0gICAgLyoqDQotICAgICAqIERlZmluZXMgdGhlIG5hbWUgb2YgYSBjdXN0b20NCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yfS4NCi0gICAgICoNCi0gICAgICogQHNlZSBFeHRWYWxDb250ZXh0SW52b2NhdGlvbk9yZGVyQXdhcmVJbnRlcm5hbHMjbGF6eUluaXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKQ0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIEZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjbGFzcyB0byBiZSB1c2VkIGFzDQotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcn0uDQotICAgICAqLw0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGN1c3RvbVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBEZWZpbmVzIHRoZSBuYW1lIG9mIGEgY3VzdG9tDQotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcn0uDQotICAgICAqDQotICAgICAqIEBzZWUgRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzI2xhenlJbml0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkNCi0gICAgICoNCi0gICAgICogQHJldHVybiBGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgdXNlZCBhcw0KLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3J9Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBjdXN0b21NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckNsYXNzTmFtZSgpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBvdGhlcnMNCi0gICAgICovDQotICAgIA0KLSAgICAvKioNCi0gICAgICogRGVmaW5lcyB0aGUge0BsaW5rIFByb3h5SGVscGVyfSB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IEV4dFZhbC4NCi0gICAgICogKERlZmF1bHQgaW1wbGVtZW50YXRpb246IHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5EZWZhdWx0UHJveHlIZWxwZXJ9KS4NCi0gICAgICogVGhlIG1ldGhvZCBzaG91bGQgbmV2ZXIgcmV0dXJuIG51bGwuDQotICAgICAqDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlscyNnZXRQcm94eUhlbHBlcigpDQotICAgICAqDQotICAgICAqIEByZXR1cm4gVGhlIGluc3RhbmNlIG9mIHRoZSB7QGxpbmsgUHJveHlIZWxwZXJ9IHRoYXQgc2hvdWxkIGJlIHVzZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgYWJzdHJhY3QgUHJveHlIZWxwZXIgcHJveHlIZWxwZXIoKTsNCi0NCi0gICAgLyoqDQotICAgICAqIERlZmluZXMgdGhlIHtAbGluayBQcm9qZWN0U3RhZ2VSZXNvbHZlcn0gdGhhdCBzaG91bGQgYmUgdXNlZCBieSBFeHRWYWwuDQotICAgICAqIChEZWZhdWx0IGltcGxlbWVudGF0aW9uOiB7QGxpbmsgRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyfQ0KLSAgICAgKiBJZiB0aGUgbWV0aG9kIHJldHVybnMgbnVsbCwgdGhlIHByb2plY3Qtc3RhZ2UgJ1Byb2R1Y3Rpb24nIHdpbGwgYmUgdXNlZC4NCi0gICAgICoNCi0gICAgICogQHNlZSBQcm9qZWN0U3RhZ2UjZ2V0Q3VycmVudFByb2plY3RTdGFnZSgpDQotICAgICAqDQotICAgICAqIEByZXR1cm4gVGhlIGluc3RhbmNlIG9mIHRoZSBQcm9qZWN0U3RhZ2VSZXNvbHZlciB0aGF0IHNob3VsZCBiZSB1c2VkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IFByb2plY3RTdGFnZVJlc29sdmVyIHByb2plY3RTdGFnZVJlc29sdmVyKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBEZWZpbmVzIGFuIG9wdGlvbmFsIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuUmVuZGVyZXJQcm94eX0NCi0gICAgICogdGhhdCBzaG91bGQgYmUgdXNlZCBieSBFeHRWYWwuDQotICAgICAqDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbExhenlSZW5kZXJlclByb3h5I2dldExhenlSZW5kZXJlcigpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyV3JhcHBlciNFeHRWYWxSZW5kZXJlcldyYXBwZXIoamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyKQ0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIFRoZSBpbnN0YW5jZSBvZiB0aGUge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5SZW5kZXJlclByb3h5fQ0KLSAgICAgKiB0aGF0IHNob3VsZCBiZSB1c2VkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IENsYXNzPD8gZXh0ZW5kcyBFeHRWYWxSZW5kZXJlclByb3h5PiByZW5kZXJlclByb3h5KCk7DQotDQotICAgIC8qDQotICAgICAqIENvbnN0cmFpbnRTb3VyY2UNCi0gICAgICovDQotICAgIA0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyBhIGNsYXNzIG9mIGFuIGFubm90YXRpb24gd2hpY2ggc2hvdWxkIGJlIHVzZWQgYXMNCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uQ29uc3RyYWludFNvdXJjZX0NCi0gICAgICogKHVzZSBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiwgaWYgaXQgaXMgcmVxdWlyZWQgdG8ga2VlcCBpbXBsZW1lbnRhdGlvbnMgaW5kZXBlbmRlbnQgb2YgRXh0VmFsKQ0KLSAgICAgKg0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNvbnN0cmFpbnRTb3VyY2VVdGlscyNmaW5kTWFwcGVkQ2xhc3Mob3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5Qcm9wZXJ0eVN0b3JhZ2UsIGphdmEubGFuZy5DbGFzcywgamF2YS5sYW5nLlN0cmluZykNCi0gICAgICoNCi0gICAgICogQHJldHVybiBBbm5vdGF0aW9uIGNsYXNzIG9mIHRoZSBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBjb25zdHJhaW50U291cmNlQW5ub3RhdGlvbigpOw0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyBhIGNsYXNzIG9mIGFuIGFubm90YXRpb24gd2hpY2ggc2hvdWxkIGJlIHVzZWQgYXMNCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uSWdub3JlQ29uc3RyYWludFNvdXJjZX0NCi0gICAgICogKHVzZSBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiwgaWYgaXQgaXMgcmVxdWlyZWQgdG8ga2VlcCBpbXBsZW1lbnRhdGlvbnMgaW5kZXBlbmRlbnQgb2YgRXh0VmFsKQ0KLSAgICAgKg0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNvbnN0cmFpbnRTb3VyY2VVdGlscyNnZXRJZ25vcmVDb25zdHJhaW50U291cmNlQW5ub3RhdGlvbkltcGxlbWVudGF0aW9uKCkNCi0gICAgICoNCi0gICAgICogQHJldHVybiBBbm5vdGF0aW9uIGNsYXNzIG9mIHRoZSBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBpZ25vcmVDb25zdHJhaW50U291cmNlQW5ub3RhdGlvbigpOw0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyBhIGNsYXNzIG9mIGFuIGFubm90YXRpb24gd2hpY2ggc2hvdWxkIGJlIHVzZWQgYXMNCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uVGFyZ2V0UHJvcGVydHl9DQotICAgICAqICh1c2UgYSBjdXN0b20gaW1wbGVtZW50YXRpb24sIGlmIGl0IGlzIHJlcXVpcmVkIHRvIGtlZXAgaW1wbGVtZW50YXRpb25zIGluZGVwZW5kZW50IG9mIEV4dFZhbCkNCi0gICAgICoNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Db25zdHJhaW50U291cmNlVXRpbHMjZ2V0VGFyZ2V0UHJvcGVydHlBbm5vdGF0aW9uSW1wbGVtZW50YXRpb24oKQ0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIEFubm90YXRpb24gY2xhc3Mgb2YgdGhlIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgYWJzdHJhY3QgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHRhcmdldFByb3BlcnR5QW5ub3RhdGlvbigpOw0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyBhIGNsYXNzIG9mIGFuIGFubm90YXRpb24gd2hpY2ggc2hvdWxkIGJlIHVzZWQgYXMNCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uVGFyZ2V0UHJvcGVydHlJZH0NCi0gICAgICogKHVzZSBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiwgaWYgaXQgaXMgcmVxdWlyZWQgdG8ga2VlcCBpbXBsZW1lbnRhdGlvbnMgaW5kZXBlbmRlbnQgb2YgRXh0VmFsKQ0KLSAgICAgKg0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNvbnN0cmFpbnRTb3VyY2VVdGlscyNnZXRUYXJnZXRQcm9wZXJ0eUlkQW5ub3RhdGlvbkltcGxlbWVudGF0aW9uKCkNCi0gICAgICoNCi0gICAgICogQHJldHVybiBBbm5vdGF0aW9uIGNsYXNzIG9mIHRoZSBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiB0YXJnZXRQcm9wZXJ0eUlkQW5ub3RhdGlvbigpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiB2YWxpZGF0aW9uIHBhcmFtZXRlcg0KLSAgICAgKi8NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIGNsYXNzIHdoaWNoIHNob3VsZCBiZSB1c2VkIGFzIHZpb2xhdGlvbiBzZXZlcml0eS4NCi0gICAgICogKERlZmF1bHQgaW1wbGVtZW50YXRpb246DQotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eX0pLg0KLSAgICAgKiANCi0gICAgICogQHJldHVybiBjbGFzcyB3aGljaCBzaG91bGQgYmUgdXNlZCBhcyB2aW9sYXRpb24gc2V2ZXJpdHkNCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBDbGFzcyB2aW9sYXRpb25TZXZlcml0eSgpOw0KLQ0KLSAgICAvKioNCi0gICAgICogRGVmaW5lcyB0aGUgdmFsaWRhdGlvbiBwYXJhbWV0ZXIgYW5ub3RhdGlvbiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbiBzaG91bGQgbm90IGJlDQotICAgICAqIHRyYW5zZmVycmVkIHRvIHRoZSB7QGxpbmsgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50fS4NCi0gICAgICoNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkV4dFZhbFN0YXJ0dXBMaXN0ZW5lciNpbml0RGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uS2V5KCkNCi0gICAgICoNCi0gICAgICogQHJldHVybiBWYWxpZGF0aW9uIHBhcmFtZXRlciBhbm5vdGF0aW9uIGZvciBpbmRpY2F0aW5nIHRoYXQgbm8gdmFsaWRhdGlvbiBpbmZvcm1hdGlvbiBuZWVkcyB0byBiZSBzZXQgb24gdGhlDQotICAgICAqIHVpLWNvbXBvbmVudC4NCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj4gZGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uVmFsaWRhdGlvblBhcmFtZXRlcigpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBuYW1lIG1hcHBlcg0KLSAgICAgKi8NCi0NCi0gICAgLyoqDQotICAgICAqIERlZmluZXMgdGhlIG5hbWUgb2YgYSBjdXN0b20NCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyfSB0aGF0DQotICAgICAqIHRha2VzIGEgVmFsaWRhdGlvblN0cmF0ZWd5IGFuZCBwb2ludHMgdG8gdGhlDQotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyfQ0KLSAgICAgKiB0aGF0IGlzIGxpbmtlZCB0byBpdC4NCi0gICAgICogKFRoZSBjbGFzcyBzaG91bGQgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+LikNCi0gICAgICoNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyLkN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciNnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgICoNCi0gICAgICogQHJldHVybiBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY3VzdG9tIE5hbWVNYXBwZXIgdG8gcmV0cmlldmUgTWVzc2FnZVJlc29sdmVyIG5hbWUgZm9yIGEgZ2l2ZW4NCi0gICAgICogVmFsaWRhdGlvblN0cmF0ZWd5Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBjdXN0b21WYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzc05hbWUoKTsNCi0NCi0gICAgLyoqDQotICAgICAqIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGN1c3RvbQ0KLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXJ9IHRoYXQNCi0gICAgICogdGFrZXMgYSBjb25zdHJhaW50LWtleSBhbmQgcG9pbnRzIHRvIHRoZQ0KLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3l9DQotICAgICAqIHRoYXQgaXMgbGlua2VkIHRvIGl0Lg0KLSAgICAgKiAoVGhlIGNsYXNzIHNob3VsZCBpbXBsZW1lbnQgdGhlIGludGVyZmFjZSBOYW1lTWFwcGVyPFN0cmluZz4uKQ0KLSAgICAgKg0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyLkN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyI0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkNCi0gICAgICoNCi0gICAgICogQHJldHVybiBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY3VzdG9tIE5hbWVNYXBwZXIgdG8gcmV0cmlldmUgVmFsaWRhdGlvblN0cmF0ZWd5IG5hbWUgZm9yIGEgZ2l2ZW4NCi0gICAgICogY29uc3RyYWludC1rZXkuDQotICAgICAqLw0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGN1c3RvbU1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3NOYW1lKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBjdXN0b20NCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyfSB0aGF0DQotICAgICAqIHRha2VzIGEgVmFsaWRhdGlvblN0cmF0ZWd5IGFuZCBwb2ludHMgdG8gdGhlDQotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyfQ0KLSAgICAgKiB0aGF0IGlzIGxpbmtlZCB0byBpdC4NCi0gICAgICogKFRoZSBjbGFzcyBzaG91bGQgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+LikNCi0gICAgICoNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIuQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIjZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgICAqDQotICAgICAqIEByZXR1cm4gZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGN1c3RvbSBOYW1lTWFwcGVyIHRvIHJldHJpZXZlIE1ldGFEYXRhVHJhbnNmb3JtZXIgbmFtZSBmb3IgYSBnaXZlbg0KLSAgICAgKiBWYWxpZGF0aW9uU3RyYXRlZ3kuDQotICAgICAqLw0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGN1c3RvbVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJDbGFzc05hbWUoKTsNCi0NCi0gICAgLyoNCi0gICAgICogZmlsdGVyDQotICAgICAqLw0KLQ0KLSAgICAvKioNCi0gICAgICogRGVmaW5lcyB0aGUgbmFtZSBvZiBhIGN1c3RvbQ0KLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NZXRhRGF0YVN0b3JhZ2VGaWx0ZXJ9Lg0KLSAgICAgKg0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdE1ldGFEYXRhU3RvcmFnZSNpbml0RmlsdGVycygpDQotICAgICAqDQotICAgICAqIEByZXR1cm4gRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIHVzZWQgYXMNCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuTWV0YURhdGFTdG9yYWdlRmlsdGVyfS4NCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgY3VzdG9tTWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lKCk7DQotDQotICAgIC8qDQotICAgICAqIGZhY3Rvcmllcw0KLSAgICAgKi8NCi0NCi0gICAgLyoqDQotICAgICAqIERlZmluZXMgdGhlIG5hbWUgb2YgYSBjdXN0b20NCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeQ0KLSAgICAgKiA8U3RyaW5nLG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Pn0gd2hpY2ggaXMNCi0gICAgICogcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGENCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5fQ0KLSAgICAgKiBmb3IgYSBnaXZlbiBtZXRhRGF0YS1rZXkuDQotICAgICAqIChEZWZhdWx0IGltcGxlbWVudGF0aW9uOg0KLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeX0uKQ0KLSAgICAgKg0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRGVmYXVsdEZhY3RvcnlGaW5kZXIjY3JlYXRlVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpDQotICAgICAqDQotICAgICAqIEByZXR1cm4gRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIHVzZWQgYXMNCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeX0NCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgY3VzdG9tVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZSgpOw0KLQ0KLSAgICAvKioNCi0gICAgICogRGVmaW5lcyB0aGUgbmFtZSBvZiBhIGN1c3RvbQ0KLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5DQotICAgICAqIDxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1lc3NhZ2VSZXNvbHZlcj59DQotICAgICAqIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUNCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXJ9DQotICAgICAqIGZvciBhIGdpdmVuIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneX0uDQotICAgICAqIChEZWZhdWx0IGltcGxlbWVudGF0aW9uOg0KLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5fS4pDQotICAgICAqDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5EZWZhdWx0RmFjdG9yeUZpbmRlciNjcmVhdGVNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5KCkNCi0gICAgICoNCi0gICAgICogQHJldHVybiBGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgdXNlZCBhcw0KLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5fQ0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBjdXN0b21NZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBEZWZpbmVzIHRoZSBuYW1lIG9mIGEgY3VzdG9tDQotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5fQ0KLSAgICAgKiB3aGljaCBjcmVhdGVzIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3J9cy4NCi0gICAgICogKERlZmF1bHQgaW1wbGVtZW50YXRpb246DQotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeX0NCi0gICAgICogLikNCi0gICAgICoNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkRlZmF1bHRGYWN0b3J5RmluZGVyI2NyZWF0ZUNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpDQotICAgICAqDQotICAgICAqIEByZXR1cm4gRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIHVzZWQgYXMNCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3Rvcnl9DQotICAgICAqLw0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGN1c3RvbUNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZSgpOw0KLQ0KLSAgICAvKioNCi0gICAgICogRGVmaW5lcyB0aGUgbmFtZSBvZiBhIGN1c3RvbQ0KLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3Rvcnl9DQotICAgICAqIHdoaWNoIGNyZWF0ZXMNCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3J9cy4NCi0gICAgICogKERlZmF1bHQgaW1wbGVtZW50YXRpb246DQotICAgICAqIHtAbGluaw0KLSAgICAgKiBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3Rvcnl9LikNCi0gICAgICoNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkRlZmF1bHRGYWN0b3J5RmluZGVyI2NyZWF0ZVZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5KCkNCi0gICAgICoNCi0gICAgICogQHJldHVybiBGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgdXNlZCBhcw0KLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3Rvcnl9DQotICAgICAqLw0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGN1c3RvbVZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBEZWZpbmVzIHRoZSBuYW1lIG9mIGEgY3VzdG9tDQotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3RvcnkgPENsYXNzLCBDbGFzcz59DQotICAgICAqIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgZmluYWwgVmFsaWRhdGlvbiBQYXJhbWV0ZXIgY2xhc3MuDQotICAgICAqIChEZWZhdWx0IGltcGxlbWVudGF0aW9uOg0KLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5fS4pDQotICAgICAqDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5EZWZhdWx0RmFjdG9yeUZpbmRlciNjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeSgpDQotICAgICAqDQotICAgICAqIEByZXR1cm4gRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIHVzZWQgYXMNCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeX0NCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgY3VzdG9tVmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnlDbGFzc05hbWUoKTsNCi0NCi0gICAgLyoqDQotICAgICAqIERlZmluZXMgdGhlIG5hbWUgb2YgYSBjdXN0b20NCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeQ0KLSAgICAgKiA8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YVRyYW5zZm9ybWVyPn0NCi0gICAgICogd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGENCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXJ9DQotICAgICAqIGZvciBhIGdpdmVuDQotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneX0uDQotICAgICAqIChEZWZhdWx0IGltcGxlbWVudGF0aW9uOg0KLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5fS4pDQotICAgICAqDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5EZWZhdWx0RmFjdG9yeUZpbmRlciNjcmVhdGVNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSgpDQotICAgICAqDQotICAgICAqIEByZXR1cm4gRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIHVzZWQgYXMNCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeX0NCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgY3VzdG9tTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWUoKTsNCi0NCi0gICAgLyoqDQotICAgICAqIERlZmluZXMgdGhlIG5hbWUgb2YgYSBjdXN0b20NCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeQ0KLSAgICAgKiA8Q2xhc3MsIFN0b3JhZ2VNYW5hZ2VyPn0gd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZQ0KLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5TdG9yYWdlTWFuYWdlcn0gZm9yDQotICAgICAqIGEgZ2l2ZW4gc3RvcmFnZSBjbGFzcy4NCi0gICAgICogKERlZmF1bHQgaW1wbGVtZW50YXRpb246DQotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3Rvcnl9LikNCi0gICAgICoNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkRlZmF1bHRGYWN0b3J5RmluZGVyI2NyZWF0ZVN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSgpDQotICAgICAqDQotICAgICAqIEByZXR1cm4gRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgaW1wbGVtZW50YXRpb24gb2YgYSBDbGFzc01hcHBpbmdGYWN0b3J5Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBjdXN0b21TdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWUoKTsNCi0NCi0gICAgLyoqDQotICAgICAqIERlZmluZXMgdGhlIG5hbWUgb2YgYSBjdXN0b20NCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjZXNNZXNzYWdlRmFjdG9yeX0NCi0gICAgICogd2hpY2ggY3JlYXRlcyBhbmQgY29udmVydHMge0BsaW5rIGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZX1zDQotICAgICAqIChEZWZhdWx0IGltcGxlbWVudGF0aW9uOg0KLSAgICAgKiB7QGxpbmsNCi0gICAgICogb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5fS4pDQotICAgICAqDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5EZWZhdWx0RmFjdG9yeUZpbmRlciNjcmVhdGVGYWNlc01lc3NhZ2VGYWN0b3J5KCkNCi0gICAgICoNCi0gICAgICogQHJldHVybiBGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgdXNlZCBhcw0KLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWNlc01lc3NhZ2VGYWN0b3J5fQ0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBjdXN0b21GYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lKCk7DQotDQotICAgIC8qDQotICAgICAqIGFjdGl2YXRlDQotICAgICAqLw0KLQ0KLSAgICAvKioNCi0gICAgICogSW5kaWNhdGVzIGlmIHRoZSBDb21wb25lbnRJbml0aWFsaXplcidzIHNob3VsZCBtYXJrIHtAbGluayBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnR9cyBhcyAncmVxdWlyZWQnDQotICAgICAqIGlmIGFuIGVxdWl2YWxlbnQgY29uc3RyYWludCBpcyBob3N0ZWQgYnkgdGhlIHJlZmVyZW5jZWQgcHJvcGVydHkuDQotICAgICAqDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkFic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIjY29uZmlndXJlQ29tcG9uZW50KGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0LCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQsIGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZyxqYXZhLmxhbmcuT2JqZWN0PikNCi0gICAgICoNCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGUgc2hvdWxkIGJlIGhvbm9yZWQsIGZhbHNlIG90aGVyd2lzZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFjdGl2YXRlUmVxdWlyZWRJbml0aWFsaXphdGlvbigpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBkZWFjdGl2YXRlDQotICAgICAqLw0KLQ0KLSAgICAvKioNCi0gICAgICogSW5kaWNhdGVzIGlmIEV4dFZhbCBzaG91bGQgZGVhY3RpdmF0ZSB0aGUgZGVmYXVsdCBjb252ZW50aW9uLg0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRlZmF1bHQgY29udmVudGlvbiBzaG91bGQgYmUgZGVhY3RpdmF0ZWQsIGZhbHNlIG90aGVyd2lzZQ0KLSAgICAgKi8NCi0gICAgLy9jdXJyZW50bHkganVzdCB1c2VkIGJ5IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbigpOw0KLQ0KLSAgICAvKioNCi0gICAgICogSW5kaWNhdGVzIGlmIEV4dFZhbCBzaG91bGQgZGVhY3RpdmF0ZSBhbGwgdGhlIGludGVybmFsIGRlZmluZWQgbmFtZSBtYXBwZXJzLg0KLSAgICAgKiAoQmUgYXdhcmUgdGhhdCBFeHRWYWwgd2lsbCBmYWlsLCBpZiBubyBhbHRlcm5hdGl2ZXMgYXJlIGRlZmluZWQuKQ0KLSAgICAgKg0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuRXh0VmFsU3RhcnR1cExpc3RlbmVyI2luaXROYW1lTWFwcGVycygpDQotICAgICAqDQotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHdlIHdhbnQgdG8gZGVhY3RpdmF0ZSBpbnRlcm5hbCBkZWZpbmVkIG5hbWUgbWFwcGVycy4NCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGRlYWN0aXZhdGVEZWZhdWx0TmFtZU1hcHBlcnMoKTsNCi0NCi0gICAgLyoqDQotICAgICAqIERlZmluZXMgaWYgRXh0VmFsIHNob3VsZCBmYWxsYmFjayB0byBhbiBhbHRlcm5hdGl2ZSAoYnV0IGRlcHJlY2F0ZWQpIGFwcHJvYWNoIGZvciBpbnNwZWN0aW5nIEVMLWV4cHJlc3Npb25zLg0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuICB0cnVlIHdoZW4gd2Ugd2FudCB0byBkZWFjdGl2YXRlIGludGVybmFsIEVMIFJlc29sdmVyLg0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkRlZmF1bHRFTEhlbHBlcg0KLSAgICAgKi8NCi0gICAgQERlcHJlY2F0ZWQNCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZGVhY3RpdmF0ZUVsUmVzb2x2ZXIoKTsNCi0NCi0gICAgLyoqDQotICAgICAqIERlZmluZXMgaWYgdGhlIG1lY2hhbmlzbSBvZiBjb21wb25lbnQgaW5pdGlhbGl6YXRpb24gKGJlZm9yZSB0aGUgcmVuZGVyaW5nIHByb2Nlc3MpIHNob3VsZCBiZSBkZWFjdGl2YXRlZC4NCi0gICAgICoNCi0gICAgICogQHNlZSBFeHRWYWxDb250ZXh0SW50ZXJuYWxzI2lzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25BY3RpdmF0ZWQoKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkFic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yI2lzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25EZWFjdGl2YXRlZCgpDQotICAgICAqDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB7QGxpbmsgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50fXMgc2hvdWxkIG5vdCBiZSBpbml0aWFsaXplZCBieSBFeHRWYWwsIGZhbHNlIG90aGVyd2lzZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGRlYWN0aXZhdGVDb21wb25lbnRJbml0aWFsaXphdGlvbigpOw0KLQ0KLSAgICAvKioNCi0gICAgICogRGVmaW5lcyBpZiB0aGUgbWVjaGFuaXNtIG9mIGdlbmVyaWMgdmFsaWRhdGlvbiBwYXJhbWV0ZXJzIHNob3VsZCBiZSBkZWFjdGl2YXRlZC4NCi0gICAgICoNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlscyNnZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkNCi0gICAgICoNCi0gICAgICogQHJldHVybiB0cnVlIGlmIHZhbGlkYXRpb24gcGFyYW1ldGVyIGV4dHJhY3Rpb24gc2hvdWxkIGJlIHNraXBwZWQsIGZhbHNlIG90aGVyd2lzZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZGVhY3RpdmF0ZVZhbGlkYXRpb25QYXJhbWV0ZXJzKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBEZWZpbmVzIGlmIHRoZSBkZWZhdWx0IGVudHJ5IHBvaW50IG9mIEV4dFZhbCBzaG91bGQgYmUgZGVhY3RpdmF0ZWQuDQotICAgICAqIChBdHRlbnRpb246IGluIGNhc2Ugb2YgbW9qYXJyYSB5b3UgaGF2ZSB0byB1c2UgdGhlIHZtLXBhcmFtZXRlcjoNCi0gICAgICogb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkRFQUNUSVZBVEVfUkVOREVSX0tJVF9GQUNUT1JZKQ0KLSAgICAgKg0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXRGYWN0b3J5I2NoZWNrUmVuZGVyS2l0RmFjdG9yeURlYWN0aXZhdGlvbigpDQotICAgICAqDQotICAgICAqIEByZXR1cm4gdHJ1ZSBmb3IgZGVhY3RpdmF0aW5nIEV4dFZhbCwgZmFsc2Ugb3RoZXJ3aXNlDQotICAgICAqLw0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBkZWFjdGl2YXRlUmVuZGVyS2l0RmFjdG9yeSgpOw0KLQ0KLSAgICAvL3RoZXJlIGlzIG5vdGhpbmcgbGlrZSBERUFDVElWQVRFX0RFRkFVTFRfVkFMSURBVElPTl9JTlRFUkNFUFRPUg0KLSAgICAvL3VzZSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5kZW55UmVuZGVyZXJJbnRlcmNlcHRvciguLi4pIHdpdGhpbiBhbiBFeHRWYWxTdGFydHVwTGlzdGVuZXINCi0NCi0gICAgLyoqDQotICAgICAqIERlZmluZXMgaWYgRXh0VmFsIHNob3VsZCByZXNldCB0aGUgcmVxdWlyZWQgYXR0cmlidXRlIG9mIGEge0BsaW5rIGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudH0NCi0gICAgICogYWZ0ZXIgdGhlIGRlY29kaW5nIHRoZSBjb21wb25lbnQuIChJdCdzIG5lZWRlZCBmb3Igc3BlY2lhbCB1c2UtY2FzZXMuKQ0KLSAgICAgKg0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzI2lzUmVxdWlyZWRSZXNldEFjdGl2YXRlZCgpDQotICAgICAqDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBFeHRWYWwgc2hvdWxkIHNldCB0aGUgcmVxdWlyZWQgYXR0cmlidXRlIHRvIGZhbHNlLCBmYWxzZSBvdGhlcndpc2UNCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGRlYWN0aXZhdGVSZXF1aXJlZEF0dHJpYnV0ZVN1cHBvcnQoKTsNCi0NCi0gICAgLyoNCi0gICAgICogc3VwcG9ydGVkIHNwZWMgcGFyYW1ldGVycw0KLSAgICAgKi8NCi0NCi0gICAgLyoqDQotICAgICAqIERlZmluZXMgaWYgRXh0VmFsIHNob3VsZCBjb252ZXJ0IGVtcHR5IHN0cmluZ3MgdG8gbnVsbCAoanVzdCBmb3IgdGhlIHZhbGlkYXRpb24gcHJvY2VzcykuDQotICAgICAqIChJbnRyb2R1Y2VkIGJ5IEpTRiAyLjApDQotICAgICAqIENvbXBhcmVkIHRvIHN0ZC4gSlNGIGl0J3MgYWN0aXZhdGVkIGJ5IGRlZmF1bHQhDQotICAgICAqDQotICAgICAqIEByZXR1cm4gZmFsc2UgZm9yIHVzaW5nIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIEpTRiAyLjANCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGludGVycHJldEVtcHR5U3RyaW5nU3VibWl0dGVkVmFsdWVzQXNOdWxsKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBEZWZpbmVzIGlmIEV4dFZhbCBzaG91bGQgdmFsaWRhdGUgZW1wdHkgZmllbGRzLg0KLSAgICAgKg0KLSAgICAgKiBQbGVhc2UgYWxzbyBoYXZlIGEgbG9vayBhdCB0aGUNCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3l9IGFubm90YXRpb24uDQotICAgICAqDQotICAgICAqIChJbnRyb2R1Y2VkIGJ5IEpTRiAyLjApDQotICAgICAqIENvbXBhcmVkIHRvIHN0ZC4gSlNGIGl0J3MgYWN0aXZhdGVkIGJ5IGRlZmF1bHQhDQotICAgICAqDQotICAgICAqIEByZXR1cm4gZmFsc2UgZm9yIHVzaW5nIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIEpTRiAyLjANCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHZhbGlkYXRlRW1wdHlGaWVsZHMoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxNb2R1bGVDb25maWd1cmF0aW9uLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5YzAwOS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogTWFya2VyIGludGVyZmFjZSBmb3IgdHlwZS1zYWZlIEV4dFZhbCBjb25maWd1cmF0aW9ucy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSByNA0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBFeHRWYWxNb2R1bGVDb25maWd1cmF0aW9uDQotew0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb25SZXNvbHZlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxNb2R1bGVDb25maWd1cmF0aW9uUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJiNzg2OS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb25SZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdGhlIHJldHJpZXZhbCBvZiBhIGN1c3RvbSBjb25maWd1cmF0aW9uIG9iamVjdC4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSByNA0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSSwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBpbnRlcmZhY2UgRXh0VmFsTW9kdWxlQ29uZmlndXJhdGlvblJlc29sdmVyDQotew0KLSAgICAvKioNCi0gICAgICogUmV0cmlldmVzIHRoZSBjdXN0b20gY29uZmlndXJhdGlvbiB3aGljaCBtYXRjaGVzIHRoZSBnaXZlbiBjb25maWctdHlwZS4NCi0gICAgICogVGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlciBpcyBvbmUgb2YgdGhlIGFic3RyYWN0IGNsYXNzZXMgd2hpY2ggZGlyZWN0bHkgaW1wbGVtZW50cyB0aGUNCi0gICAgICoge0BsaW5rIEV4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb259IGludGVyZmFjZSwgbGlrZSB7QGxpbmsgRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb259Lg0KLSAgICAgKiBUaGUgcmV0dXJuZWQgY29uZmlnIGhhcyB0byBleHRlbmQgb25lIG9mIHRoZSBhYnN0cmFjdCBjb25maWcgY2xhc3Nlcy4NCi0gICAgICoNCi0gICAgICogKFRoZSBtZXRob2QgaXNuJ3QgYWxsb3dlZCB0byByZXR1cm4gbnVsbCBleGNlcHQNCi0gICAgICogZm9yIHRoZSBjYXNlIHRoYXQgYSBjdXN0b20gY29uZmlndXJhdGlvbiBmb3IgdGhhdCB0eXBlIGlzIGRlZmluZWQgdmlhIGEgd2ViLnhtbCBjb250ZXh0LXBhcmFtLikNCi0gICAgICoNCi0gICAgICogQHBhcmFtIGNvbmZpZ1R5cGUgQ2xhc3MgdGhhdCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIHRhcmdldCBjb25maWcuDQotICAgICAqIEBwYXJhbSA8VD4NCi0gICAgICogQHJldHVybiBDb25maWd1cmF0aW9uIG9iamVjdCB3aGljaCB3aWxsIGJlIHVzZWQgYnkgRXh0VmFsLg0KLSAgICAgKi8NCi0gICAgPFQgZXh0ZW5kcyBFeHRWYWxNb2R1bGVDb25maWd1cmF0aW9uPiBFeHRWYWxNb2R1bGVDb25maWd1cmF0aW9uIGdldEN1c3RvbUNvbmZpZ3VyYXRpb24oQ2xhc3M8VD4gY29uZmlnVHlwZSk7DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZkOTVmYi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuTnVsbFZhbHVlQXdhcmVDb25jdXJyZW50SGFzaE1hcDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcmVuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqICsgc29tZSBvZiB0aGVtIGNhbiBiZSBjdXN0b21pemVkIHdpdGhpbiBhIGN1c3RvbSBpbXBsLiBvZiB0aGUgYmVhbg0KLSAqIChleHRlbmQgdGhpcyBjbGFzcyBhbmQgcHJvdmlkZSBpdCB2aWEgY29udmVudGlvbiBvciB3ZWIueG1sKQ0KLSAqIDxwLz4NCi0gKiB0aGUgc3RhdGljIGFwaSBzaG91bGQgb25seSBiZSB1c2VkDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEksIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFQU5fTkFNRSA9IEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FDQotICAgICAgICArICIuIiArIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsNCi0gICAgLy9jdXN0b20gY2xhc3Mgd2hpY2ggaXMgYW4gb3B0aW9uYWwgcmVwbGFjZW1lbnQgZm9yIHRoaXMgY2xhc3MgKGhhcyB0byBleHRlbmQgdGhpcyBjbGFzcykNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0JFQU4gPSAoRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUNCi0gICAgICAgICsgIi5jdXN0b20uIiArIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7DQotDQotICAgIHB1YmxpYyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgIHsNCi0gICAgICAgIGxvZ2dlci5maW5lKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0NCi0gICAgICAgIHNldHVwQ3VzdG9taXphYmxlSW5mb3JtYXRpb24oKTsNCi0gICAgICAgIGFwcGx5Q3VzdG9tVmFsdWVzKHRoaXMuY3VzdG9taXphYmxlSW5mb3MpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPEN1c3RvbUluZm9ybWF0aW9uLCBTdHJpbmc+IGN1c3RvbWl6YWJsZUluZm9zID0NCi0gICAgICAgICAgICBuZXcgTnVsbFZhbHVlQXdhcmVDb25jdXJyZW50SGFzaE1hcDxDdXN0b21JbmZvcm1hdGlvbiwgU3RyaW5nPihTdHJpbmcuY2xhc3MpOw0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBDdXN0b21pemFibGVJbmZvcm1hdGlvbigpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBiYXNlUGFja2FnZSA9IEV4dFZhbENvcmVDb25maWd1cmF0aW9uLmdldCgpLmN1c3RvbUJhc2VQYWNrYWdlKCk7DQotDQotICAgICAgICBpZiAoYmFzZVBhY2thZ2UgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBiYXNlUGFja2FnZSA9IEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsgIi5jdXN0b20uIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghYmFzZVBhY2thZ2UuZW5kc1dpdGgoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBiYXNlUGFja2FnZSA9IGJhc2VQYWNrYWdlICsgIi4iOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkJBU0VfUEFDS0FHRSwgYmFzZVBhY2thZ2UpOw0KLSAgICAgICAgDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IsDQotICAgICAgICAgICAgICAgICJDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUiwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgsDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uU3RyYXRlZ3kiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfUE9TVEZJWCwNCi0gICAgICAgICAgICAgICAgIk1ldGFEYXRhVHJhbnNmb3JtZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWCwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9JTklUSUFMSVpFUiwNCi0gICAgICAgICAgICAgICAgIkNvbXBvbmVudEluaXRpYWxpemVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IsDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5QUk9QRVJUWV9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SLA0KLSAgICAgICAgICAgICAgICAiUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgICAgICAgICAgICAgIk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NU0dfUkVTT0xWRVJfTkFNRV9NQVBQRVIsDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUiwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5TVEFSVFVQX0xJU1RFTkVSLA0KLSAgICAgICAgICAgICAgICAiU3RhcnR1cExpc3RlbmVyIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiTWVzc2FnZVJlc29sdmVyRmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJGYWNlc01lc3NhZ2VGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJTdG9yYWdlTWFuYWdlckZhY3RvcnkiKTsNCi0NCi0gICAgICAgIC8vY29udmVudGlvbnMgKHRoZSByZXN0IG9mIHRoZSBjb252ZW50aW9ucyBhcmUgYnVpbHQgd2l0aCB0aGUgaGVscCBvZiBuYW1lIG1hcHBlcnMsLi4uDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9CVU5ETEVfTkFNRSwNCi0gICAgICAgICAgICAgICAgInZhbGlkYXRpb25fbWVzc2FnZXMiKTsNCi0gICAgICAgIC8vc3RhdGljIHN0cmF0ZWd5IG1hcHBpbmdzIChuYW1lIG9mIHByb3BlcnR5IGZpbGVzKQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVRJQ19TVFJBVEVHWV9NQVBQSU5HX1NPVVJDRSwNCi0gICAgICAgICAgICAgICAgInN0cmF0ZWd5X21hcHBpbmdzIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1NUT1JBR0VfRklMVEVSLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFTdG9yYWdlRmlsdGVyIik7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcHBseUN1c3RvbVZhbHVlcyhNYXA8Q3VzdG9tSW5mb3JtYXRpb24sIFN0cmluZz4gbWFwKQ0KLSAgICB7DQotICAgICAgICAvL292ZXJyaWRlIHRvIGN1c3RvbWl6ZSBpbmZvcm1hdGlvbg0KLSAgICB9DQotDQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0KEN1c3RvbUluZm9ybWF0aW9uIGN1c3RvbUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBjdXN0b21pemFibGVJbmZvcy5nZXQoY3VzdG9tSW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgc3dpdGNoIChjdXN0b21JbmZvcm1hdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjYXNlIEJBU0VfUEFDS0FHRToNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICogcG9zdGZpeCB1c2VkIGJ5IHRoZSBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgICAgICAgICAgICogdGhlIFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgaXMgZm9yIGN1c3RvbSBzdHJhdGVnaWVzIG9ubHkNCi0gICAgICAgICAgICAgKiAobm90IGZvciBwdWJsaWMgdmFsaWRhdGlvbiBtb2R1bGVzKQ0KLSAgICAgICAgICAgICAqIHNvIGl0J3MgZmluZSB0byBjdXN0b21pemUgaXQNCi0gICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICBjYXNlIFZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFX1JFU09MVkVSX1BPU1RGSVg6DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbWl6YWJsZUluZm9zLmdldChDdXN0b21JbmZvcm1hdGlvbi5CQVNFX1BBQ0tBR0UpICsgdmFsdWU7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDlmODY5Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TW9kdWxlTWVzc2FnZUJ1bmRsZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbmV3UGFja2FnZU5hbWU7DQotICAgICAgICBpZiAocGFja2FnZU5hbWUuZW5kc1dpdGgoIi5yZXNvbHZlciIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5ld1BhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUucmVwbGFjZSgiLnJlc29sdmVyIiwgIi5idW5kbGUiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBuZXdQYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lLnJlcGxhY2UoIi5yZXNvbHZlci4iLCAiLmJ1bmRsZS4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXdQYWNrYWdlTmFtZSArICIudmFsaWRhdGlvbl9tZXNzYWdlcyI7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHVzZSBhIGN1c3RvbSBuYW1lIG1hcHBlciB0byBpbXBsZW1lbnQgY3VzdG9tIGNvbnZlbnRpb25zDQotICAgICAqLw0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VSZXNvbHZlckNsYXNzTmFtZSgNCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLCBTdHJpbmcgdGFyZ2V0Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLCAiLm1lc3NhZ2UucmVzb2x2ZXIuIiwgdGFyZ2V0Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKA0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsICIubWV0YWRhdGEudHJhbnNmb3JtZXIuIiwgdGFyZ2V0Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldFBhY2thZ2VOYW1lLCBTdHJpbmcgdGFyZ2V0Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0TmFtZSgpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLnJlcGxhY2UoIi5zdHJhdGVneS4iLCB0YXJnZXRQYWNrYWdlTmFtZSk7DQotDQotICAgICAgICBpZiAodGFyZ2V0Q2xhc3NOYW1lID09IG51bGwgfHwgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgPT0gLTEpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lDQotICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikpICsgIi4iICsgdGFyZ2V0Q2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB1c2UgYSBjdXN0b20gbmFtZSBtYXBwZXIgdG8gaW1wbGVtZW50IGN1c3RvbSBjb252ZW50aW9ucw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneU5hbWUsICJWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIiKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUtleS5yZXBsYWNlKCIuYW5ub3RhdGlvbi4iLCAiLnN0cmF0ZWd5LiIpICsgIlN0cmF0ZWd5IjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneU5hbWUsICJNZXRhRGF0YVRyYW5zZm9ybWVyIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgdGFyZ2V0UG9zdGZpeCkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUuZW5kc1dpdGgoIlZhbGlkYXRpb25TdHJhdGVneSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLnN1YnN0cmluZygwLCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLmxlbmd0aCgpIC0gMTgpICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUuZW5kc1dpdGgoIlN0cmF0ZWd5IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneU5hbWUuc3Vic3RyaW5nKDAsIHZhbGlkYXRpb25TdHJhdGVneU5hbWUubGVuZ3RoKCkgLSA4KSArIHRhcmdldFBvc3RmaXg7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArIHRhcmdldFBvc3RmaXg7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZmZhZDguLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLQ0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi0vKioNCi0gKiBhbGxvd2VkIHRvIHVzZSBmb3IgY2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgaW50ZXJmYWNlcyB3aGljaCBoYXZlIHRoZSBtYXJrZXIgQEludm9jYXRpb25PcmRlclN1cHBvcnQNCi0gKg0KLSAqIHN1Z2dlc3RlZCByYW5nZXMgKG1haW5seSBmb3IgbmFtZS1tYXBwZXJzKToNCi0gKiBuZWdhdGl2ZSB2YWx1ZXMgZm9yICJleHRyZW1lIiBjYXNlcw0KLSAqDQotICogMC00OSBmb3IgY3VzdG9tIGFydGlmYWN0cyB3aGljaCBzaG91bGQgaGF2ZSB0aGUgaGlnaGVzdCBwcmlvcml0eQ0KLSAqIDUwLTk5IGZvciBhZGQtb25zIHdoaWNoIHByb3ZpZGUgYXJ0aWZhY3RzIHdoaWNoIHNob3VsZCBoYXZlIGEgaGlnaGVyIHByaW9yaXR5IHRoYW4gdGhlIGRlZmF1bHQgYXJ0aWZhY3RzDQotICogMTAwLTk5OSBpbnRlcm5hbCBhcnRpZmFjdHMNCi0gKiAxMDAwKyBmb3IgY3VzdG9tIGFydGlmYWN0cw0KLSAqDQotICogc3VnZ2VzdGVkIHJhbmdlcyBmb3IgYXJ0aWZhY3RzIGxpa2UgaW50ZXJjZXB0b3JzLC4uLg0KLSAqIDF4eCAuLi4gYXJ0aWZhY3RzIG9mIHRoZSBjb3JlDQotICogMnh4IC4uLiBhcnRpZmFjdHMgb2YgdmFsaWRhdGlvbiBtb2R1bGVzDQotICogM3h4IC4uLiBhcnRpZmFjdHMgb2YgY29tcG9uZW50IHN1cHBvcnQgbW9kdWxlcw0KLSAqDQotICogYSBwcmlvcml0eSBzaG91bGQgYmUgdW5pcXVlIHdpdGhpbiBvbmUgYXJ0aWZhY3QtdHlwZSAtIHRoYXQgbWVhbnMNCi0gKiBpZiBhIG5hbWUtbWFwcGVyIGhhcyBwcmlvcml0eSAxMDAsIGl0J3Mgb2sgdGhhdCBhbiBleGNlcHRpb24taW50ZXJjZXB0b3IgYWxzbyBoYXMgcHJpb3JpdHkgMTAwLg0KLSAqIGJ1dCBhIDJuZCBuYW1lLW1hcHBlciBzaG91bGRuJ3QgaGF2ZSBwcmlvcml0eSAxMDANCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIEludm9jYXRpb25PcmRlcg0KLXsNCi0gICAgLyoqDQotICAgICAqIGRlZmF1bHQgcHJpb3JpdHkgZm9yIGN1c3RvbSBhcnRpZmFjdHMgKGlmIHRoZXkgc2hvdWxkIGdldCBhZGRlZCBhZnRlciB0aGUgaW50ZXJuYWwgdmVyc2lvbnMNCi0gICAgICogQHJldHVybiB0aGUgcHJpb3JpdHkgb2YgYW4gYXJ0aWZhY3QgYW5ub3RhdGVkIHdpdGggdGhpcyBhbm5vdGF0aW9uDQotICAgICAqLw0KLSAgICBpbnQgdmFsdWUoKSBkZWZhdWx0IDEwMDA7DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NjdmZGIuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsNCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxUPiBpbXBsZW1lbnRzIENvbXBhcmF0b3I8VD4sIFNlcmlhbGl6YWJsZQ0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjI4NzI1ODY1NjM3MzYxNjU4NEw7DQotDQotICAgIHB1YmxpYyBpbnQgY29tcGFyZShUIG5tMSwgVCBubTIpDQotICAgIHsNCi0gICAgICAgIGlmIChoYXNQcmlvcml0eShubTEpICYmIGhhc1ByaW9yaXR5KG5tMikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGlzUHJpb3JpdHlIaWdoZXIobm0xLmdldENsYXNzKCkuZ2V0QW5ub3RhdGlvbihJbnZvY2F0aW9uT3JkZXIuY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgbm0yLmdldENsYXNzKCkuZ2V0QW5ub3RhdGlvbihJbnZvY2F0aW9uT3JkZXIuY2xhc3MpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghaGFzUHJpb3JpdHkobm0xKSAmJiAhaGFzUHJpb3JpdHkobm0yKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBoYXNQcmlvcml0eShubTEpID8gLTEgOiAxOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgaW50IGlzUHJpb3JpdHlIaWdoZXIoSW52b2NhdGlvbk9yZGVyIHByaW9yaXR5MSwgSW52b2NhdGlvbk9yZGVyIHByaW9yaXR5MikNCi0gICAgew0KLSAgICAgICAgaWYgKHByaW9yaXR5MS52YWx1ZSgpID09IHByaW9yaXR5Mi52YWx1ZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHByaW9yaXR5MS52YWx1ZSgpIDwgcHJpb3JpdHkyLnZhbHVlKCkgPyAtMSA6IDE7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc1ByaW9yaXR5KE9iamVjdCBubSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5tLmdldENsYXNzKCkuaXNBbm5vdGF0aW9uUHJlc2VudChJbnZvY2F0aW9uT3JkZXIuY2xhc3MpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyU3VwcG9ydC5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXJTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMzRlNzkuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXJTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLQ0KLUBUYXJnZXQoVFlQRSkNCi1ARG9jdW1lbnRlZA0KLS8qKg0KLSAqIG1hcmtlciBhbm5vdGF0aW9uIGZvciBlYXNpZXIgdXNhZ2UNCi0gKiBpdCBtYXJrcyBpbnRlcmZhY2VzIC0gaW5zdGFuY2VzIG9mIGNsYXNzZXMgaW1wbGVtZW50aW5nIHRoZXNlIGludGVyZmFjZXMgd2lsbCBiZSBzb3J0ZWQNCi0gKiBAc2VlIEludm9jYXRpb25PcmRlckNvbXBhcmF0b3INCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIEludm9jYXRpb25PcmRlclN1cHBvcnQNCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSnNmUHJvamVjdFN0YWdlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0pzZlByb2plY3RTdGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmIzMGJhLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSnNmUHJvamVjdFN0YWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHByb2plY3Qgc3RhZ2UgZXF1aXZhbGVudCB0byBqc2YgMi4wDQotICogZXh0dmFsIDIueCBoYXMgYSBzcGVjaWFsIHJlc29sdmVyIHdoaWNoIHJlZGlyZWN0cyB0aGUgY2FsbCB0byB0aGUgbmV3IGpzZiBhcGkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGVudW0gSnNmUHJvamVjdFN0YWdlDQotew0KLSAgICBEZXZlbG9wbWVudChQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKCJEZXZlbG9wbWVudCIpKSwNCi0gICAgVW5pdFRlc3QoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZSgiVW5pdFRlc3QiKSksDQotICAgIFN5c3RlbVRlc3QoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZSgiU3lzdGVtVGVzdCIpKSwNCi0gICAgUHJvZHVjdGlvbihQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKCJQcm9kdWN0aW9uIikpOw0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIFByb2plY3RTdGFnZU5hbWUgdmFsdWU7DQotDQotICAgIEpzZlByb2plY3RTdGFnZShQcm9qZWN0U3RhZ2VOYW1lIHZhbHVlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzKEpzZlByb2plY3RTdGFnZSBqc2ZQcm9qZWN0U3RhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQcm9qZWN0U3RhZ2UuaXMoanNmUHJvamVjdFN0YWdlLmdldFZhbHVlKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm9qZWN0U3RhZ2VOYW1lIGdldFZhbHVlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9OZXN0ZWQuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvTmVzdGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNjkxZTguLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9OZXN0ZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLQ0KLS8qKg0KLSAqIG1hcmtlciBhbm5vdGF0aW9uIGUuZy4gdG8gbWFyayBzdWItbmFtZS1tYXBwZXJzDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRhcmdldChUWVBFKQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIE5lc3RlZA0KLXsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9QaGFzZUlkUmVjb3JkaW5nUGhhc2VMaXN0ZW5lci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9QaGFzZUlkUmVjb3JkaW5nUGhhc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjk1NTQyLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUGhhc2VJZFJlY29yZGluZ1BoYXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkZhY2VzSW5mb3JtYXRpb25TdG9yYWdlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLQ0KLS8qKg0KLSAqIGUuZy4gdG8gYWxsb3cgaW4gbWV0YWRhdGEgZXh0cmFjdGlvbiBpbnRlcmNlcHRvcnMgdG8ga25vdyBpZiB0aGV5IGFyZSBpbnZva2VkIGR1cmluZyB2YWxpZGF0aW9uIG9yDQotICogY29tcG9uZW50IGluaXRpYWxpemF0aW9uIChpZiBuZWVkZWQpDQotICogZXhhbXBsZTogY2xpZW50LXNpZGUgdmFsaWRhdGlvbiAtIHNvbWUgZnVuY3Rpb25hbGl0eSBzaG91bGRuJ3QgYmUgcHJvY2Vzc2VkIGR1cmluZyByZW5kZXJpbmcNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFBoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjc5MTI0MDUxNDAxNDg2NzQ1N0w7DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBwaGFzZUV2ZW50KQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBwaGFzZUV2ZW50KQ0KLSAgICB7DQotICAgICAgICBGYWNlc0luZm9ybWF0aW9uU3RvcmFnZSBmYWNlc0luZm9ybWF0aW9uU3RvcmFnZSA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5nZXRTdG9yYWdlKEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLCBGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZmFjZXNJbmZvcm1hdGlvblN0b3JhZ2Uuc2V0Q3VycmVudFBoYXNlSWQocGhhc2VFdmVudC5nZXRQaGFzZUlkKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5BTllfUEhBU0U7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICBpZiAodGhpcyA9PSBvKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFBoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvamVjdFN0YWdlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjAyMjcyLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvamVjdFN0YWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi0vKioNCi0gKiBleHRlbnNpYmxlIHByb2plY3Qgc3RhZ2UgaW1wbGVtZW50YXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFByb2plY3RTdGFnZQ0KLXsNCi0gICAgcHJpdmF0ZSBQcm9qZWN0U3RhZ2VOYW1lIHZhbHVlOw0KLQ0KLSAgICBwcml2YXRlIFByb2plY3RTdGFnZShQcm9qZWN0U3RhZ2VOYW1lIHZhbHVlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0U3RhZ2VOYW1lIGNyZWF0ZVN0YWdlTmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZVByb2plY3RTdGFnZU5hbWUobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0U3RhZ2UgY3JlYXRlU3RhZ2UoUHJvamVjdFN0YWdlTmFtZSBuYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFByb2plY3RTdGFnZShuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXMoUHJvamVjdFN0YWdlTmFtZSBwcm9qZWN0U3RhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRDdXJyZW50UHJvamVjdFN0YWdlKCkuZXF1YWxzKHByb2plY3RTdGFnZSk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWU9UHJpb3JpdHkuTE9XLCBkZXNjcmlwdGlvbj0iQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIjaW5pdFByb2plY3RTdGFnZVJlc29sdmVyIFNldHMgdGhlIHJlc29sdmVyIGluIGEiICsNCi0gICAgICAgICAgICAiZ2xvYmFsIHByb3BlcnR5LiBhbGlnbi4iKQ0KLSAgICBwcml2YXRlIHN0YXRpYyBQcm9qZWN0U3RhZ2VOYW1lIGdldEN1cnJlbnRQcm9qZWN0U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICAvL3NldCBQcm9qZWN0U3RhZ2VSZXNvbHZlciB0byBudWxsIHRvIHR3ZWFrIHRoZSBwZXJmb3JtYW5jZQ0KLSAgICAgICAgUHJvamVjdFN0YWdlUmVzb2x2ZXIgcHJvamVjdFN0YWdlUmVzb2x2ZXIgPSBFeHRWYWxDb3JlQ29uZmlndXJhdGlvbi5nZXQoKS5wcm9qZWN0U3RhZ2VSZXNvbHZlcigpOw0KLQ0KLSAgICAgICAgaWYocHJvamVjdFN0YWdlUmVzb2x2ZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKHByb2plY3RTdGFnZVJlc29sdmVyKS5nZXRDdXJyZW50UHJvamVjdFN0YWdlKCkuZ2V0VmFsdWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXREZWZhdWx0U3RhZ2VOYW1lKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb2plY3RTdGFnZU5hbWUgZ2V0VmFsdWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZU5hbWUuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvamVjdFN0YWdlTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDIyYjg2Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvamVjdFN0YWdlTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvamVjdFN0YWdlTmFtZQ0KLXsNCi0gICAgU3RyaW5nIGdldE5hbWUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDRmMjdhLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvamVjdFN0YWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFByb2plY3RTdGFnZVJlc29sdmVyDQotew0KLSAgICBQcm9qZWN0U3RhZ2UgZ2V0Q3VycmVudFByb2plY3RTdGFnZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1ZhbGlkYXRpb25Nb2R1bGVBd2FyZS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9WYWxpZGF0aW9uTW9kdWxlQXdhcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0MjBmNS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1ZhbGlkYXRpb25Nb2R1bGVBd2FyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBpZiBhbiBhcnRpZmFjdCAod2hpY2ggc3VwcG9ydHMgdGhpcyBjb25jZXB0KSBzaG91bGQgYmUgdXNlZCBqdXN0IGZvciBhL3NvbWUgc3BlY2lmaWMgbW9kdWxlKHMpLA0KLSAqIHRoZSBhcnRpZmFjdCBoYXMgdG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25Nb2R1bGVBd2FyZQ0KLXsNCi0gICAgLyoqDQotICAgICAqIGR1cmluZyB0aGUgcmVnaXN0cmF0aW9uIHByb2Nlc3MgdGhlIGluZm9ybWF0aW9uIGdldHMgZXZhbHVhdGVkPGJyLz4NCi0gICAgICogaW5zdGVhZCBvZiBhIGNsYXNzIGFycmF5IGEgc3RyaW5nIGFycmF5IGlzIHVzZWQgc28gdGhhdCBpdCdzIHBvc3NpYmxlIHRvIGltcGxlbWVudA0KLSAgICAgKiBhbiBhcnRpZmFjdCBmb3IgZGlmZmVyZW50IG1vZHVsZXMuIGlmIGFuIGFkZC1vbiByZXN0cmljdHMgYW4gYXJ0aWZhY3QgdG8gc3BlY2lmaWMgbW9kdWxlcywNCi0gICAgICogbm90IGFsbCBtb2R1bGVzIGhhdmUgdG8gYmUgdXNlZCBieSB0aGUgd2ViYXBwLiBpZiBhIG1vZHVsZSBrZXkgaXMgdW5rbm93biwgdGhlIGFydGlmYWN0IHdvbid0IGdldCByZWdpc3RlcmVkDQotICAgICAqIGZvciB0aGlzIG1vZHVsZS4gaWYgYW4gYXJ0aWZhY3QgZG9lc24ndCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UsIGl0IGdldHMgcmVnaXN0ZXJlZCBmb3IgYWxsIG1vZHVsZXMNCi0gICAgICoNCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZXMgb2YgdGhlIG1vZHVsZSBrZXlzDQotICAgICAqLw0KLSAgICBTdHJpbmdbXSBnZXRNb2R1bGVLZXlzKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvVmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9WYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNTM0MGQuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9WYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi0NCi1AVGFyZ2V0KFRZUEUpDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotLyoqDQotICogbWFya2VyIGFubm90YXRpb24gZm9yIG1vZHVsZSBrZXlzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBWYWxpZGF0aW9uTW9kdWxlS2V5DQotew0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkMjRhZi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJlbid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgLyoNCi0gICAgICogbWlzYw0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVTU0FHRV9CVU5ETEUgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVNTQUdFX0JVTkRMRSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX1BBQ0tBR0UgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9CQVNFX1BBQ0tBR0UiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fSU5GT1JNQVRJT05fUFJPVklERVJfQkVBTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OX1NUUkFURUdZX01BUFBJTkciKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fUFJPUEVSVFlfVkFMSURBVElPTl9JTlRFUkNFUFRPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1BST1BFUlRZX1ZBTElEQVRJT05fSU5URVJDRVBUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9QUk9YWV9IRUxQRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9QUk9YWV9IRUxQRVIiKTsNCi0NCi0gICAgLyoNCi0gICAgICogbmFtZSBtYXBwZXINCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIiKTsNCi0NCi0gICAgLyoNCi0gICAgICogZmlsdGVyDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIiKTsNCi0gICAgDQotICAgIC8qDQotICAgICAqIGZhY3Rvcmllcw0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9GQUNFU19NRVNTQUdFX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9GQUNFU19NRVNTQUdFX0ZBQ1RPUlkiKTsNCi0NCi0gICAgLyoNCi0gICAgICogYWN0aXZhdGUNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZBVEVfUkVRVUlSRURfSU5JVElBTElaQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkFDVElWQVRFX1JFUVVJUkVEX0lOSVRJQUxJWkFUSU9OIik7DQotDQotICAgIC8qDQotICAgICAqIGRlYWN0aXZhdGUNCi0gICAgICovDQotICAgIC8qKg0KLSAgICAgKiBAc2luY2UgcjQNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9SRVFVSVJFRF9BVFRSSUJVVEVfU1VQUE9SVCA9IFdlYlhtbFV0aWxzDQotICAgICAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfUkVRVUlSRURfQVRUUklCVVRFX1NVUFBPUlQiKTsNCi0NCi0gICAgLy9jdXJyZW50bHkganVzdCB1c2VkIGJ5IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfREVGQVVMVF9DT05WRU5USU9OIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9ERUZBVUxUX05BTUVfTUFQUEVSUyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9ERUZBVUxUX05BTUVfTUFQUEVSUyIpOw0KLSAgICANCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0VMX1JFU09MVkVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0VMX1JFU09MVkVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9DT01QT05FTlRfSU5JVElBTElaQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfQ09NUE9ORU5UX0lOSVRJQUxJWkFUSU9OIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9WQUxJREFUSU9OX1BBUkFNRVRFUlMgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfVkFMSURBVElPTl9QQVJBTUVURVJTIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9SRU5ERVJfS0lUX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfUkVOREVSX0tJVF9GQUNUT1JZIik7DQotDQotICAgIC8vdGhlcmUgaXMgbm90aGluZyBsaWtlIERFQUNUSVZBVEVfREVGQVVMVF9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SDQotICAgIC8vdXNlIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmRlbnlSZW5kZXJlckludGVyY2VwdG9yKC4uLikgd2l0aGluIGFuIGV4dHZhbC1TdGFydHVwTGlzdGVuZXINCi0NCi0gICAgLyoNCi0gICAgICogc3BlYyBwYXJhbWV0ZXJzDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSUFJFVF9FTVBUWV9TVFJJTkdfU1VCTUlUVEVEX1ZBTFVFU19BU19OVUxMID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJqYXZheC5mYWNlcyIsICJJTlRFUlBSRVRfRU1QVFlfU1RSSU5HX1NVQk1JVFRFRF9WQUxVRVNfQVNfTlVMTCIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRFX0VNUFRZX0ZJRUxEUyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiamF2YXguZmFjZXMiLCAiVkFMSURBVEVfRU1QVFlfRklFTERTIik7DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYyMDI2Ny4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0Fic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7DQotDQotLyoqDQotICogZGV0YWlscw0KLSAqIEBzZWUgRGVmYXVsdEVMSGVscGVyDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgIHByb3RlY3RlZCBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeSBjdXN0b21FTEhlbHBlckZhY3Rvcnk7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGxvZ2dlci5maW5lKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21FTEhlbHBlckZhY3RvcnkoQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkgZWxIZWxwZXJGYWN0b3J5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmN1c3RvbUVMSGVscGVyRmFjdG9yeSA9IGVsSGVscGVyRmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgZmluYWwgRUxIZWxwZXIgY3JlYXRlKCkNCi0gICAgew0KLSAgICAgICAgRUxIZWxwZXIgcmVzdWx0ID0gbnVsbDsNCi0NCi0gICAgICAgIGlmKHRoaXMuY3VzdG9tRUxIZWxwZXJGYWN0b3J5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5jdXN0b21FTEhlbHBlckZhY3RvcnkuY3JlYXRlRUxIZWxwZXIoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVFTEhlbHBlcigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRUxIZWxwZXIgY3JlYXRlRUxIZWxwZXIoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMjU1MzEuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSnNmUHJvamVjdFN0YWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi0NCi1pbXBvcnQgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uOw0KLWltcG9ydCBqYXZheC5lbC5FTENvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsNCi1pbXBvcnQgamF2YXguZmFjZXMuZWwuQ29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbkhvbGRlcjsNCi1pbXBvcnQgamF2YS5pby5FeHRlcm5hbGl6YWJsZTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7DQotDQotLyoqDQotICogaW4gb3JkZXIgdG8gY2VudHJhbGl6ZSB0aGUganNmIHZlcnNpb24gZGVwZW5kZW5jeSB3aXRoaW4gdGhlIGNvcmUNCi0gKg0KLSAqIHRoaXMgZWwtaGVscGVyIHN1cHBvcnRzIGpzcCBhbmQgZmFjZWxldHMgKHRlc3RlZCB3aXRoIDEuMS4xNCkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogdGhlcmUgaXMgYSBzcGVjaWFsIGZhY2VsZXRzIHdvcmthcm91bmQgZm9yIGVsLWV4cHJlc3Npb25zIG9mIGN1c3RvbSBjb21wb25lbnRzDQotICogaXQncyBwbHVnZ2FibGUgaW4gb3JkZXIgdG8gc3VwcG9ydCBzcGVjaWFsIG1lY2hhbmlzbXMgb2YgZGlmZmVyZW50IHRlY2hub2xvZ2llcyAodGhhbiBqc3AgYW5kIGZhY2VsZXRzKQ0KLSAqIHNvIHlvdSBjYW4gcGx1ZyBpbiB5b3VyIG93biBpbXBsLiB3aGljaCBpbXBsZW1lbnRzIGEgY3VzdG9tIHdvcmthcm91bmQgKGxpa2UgdGhlIGZhY2VsZXRzIHdvcmthcm91bmQgb2YgdGhpcyBpbXBsLikNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RUxIZWxwZXIgaW1wbGVtZW50cyBFTEhlbHBlcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUFDVElWQVRFX0VMX1JFU09MVkVSID0gRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb24uZ2V0KCkuZGVhY3RpdmF0ZUVsUmVzb2x2ZXIoKTsNCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvamVjdFN0YWdlRGV2ZWxvcG1lbnQgPSBKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLkRldmVsb3BtZW50KTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRFTEhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIGxvZ2dlci5maW5lKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIC8vZHVlIHRvIGEgcmVzdHJpY3Rpb24gd2l0aCB0aGUgcmkNCi0gICAgICAgIE9iamVjdCBiZWFuID0gZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIHJldHVybiAoYmVhbiAhPSBudWxsKSA/IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoYmVhbi5nZXRDbGFzcygpKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRCZWFuKFN0cmluZyBiZWFuTmFtZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIHJldHVybiBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5nZXRFTFJlc29sdmVyKCkuZ2V0VmFsdWUoZmFjZXNDb250ZXh0LmdldEVMQ29udGV4dCgpLCBudWxsLCBiZWFuTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uICE9IG51bGwpID8gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZXZhbHVhdGVFeHByZXNzaW9uR2V0KA0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksIE9iamVjdC5jbGFzcykgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmV2YWx1YXRlRXhwcmVzc2lvbkdldChmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIE9iamVjdC5jbGFzcyk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQsIGJvb2xlYW4gYWxsb3dCbGFua0NoYXJhY3RlcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIC8vZm9yIGlucHV0IGNvbXBvbmVudHMgd2l0aG91dCB2YWx1ZS1iaW5kaW5nDQotICAgICAgICAvLyhlLmcuIGZvciBzcGVjaWFsIGNvbXBvbmVudCBsaWJzIC0+IGlzc3VlIHdpdGggRXh0VmFsUmVuZGVyZXJXcmFwcGVyI2VuY29kZUJlZ2luKQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLmZpbmVzdCgNCi0gICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LmdldENsYXNzKCkgKyAiIGhhcyBubyB2YWx1ZSBiaW5kaW5nIC0gY29tcG9uZW50IGlkOiAiICsgdWlDb21wb25lbnQuZ2V0SWQoKSk7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBpZighYWxsb3dCbGFua0NoYXJhY3RlcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZSgiICIsICIiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBpZiAoZ2V0VHlwZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbikuZ2V0QmFzZUV4cHJlc3Npb24oKSkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlc3VsdCA9IEZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlci4NCi0gICAgICAgICAgICAgICAgdHJ5VG9DcmVhdGVWYWx1ZUJpbmRpbmdGb3JGYWNlbGV0c0JpbmRpbmcodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLmZpbmUoImNvdWxkbid0IHJlc29sdmUgZXhwcmVzc2lvbjogIiArIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBnZXRUeXBlT2ZFeHByZXNzaW9uKGZhY2VzQ29udGV4dCwgcmVzdWx0LmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLQ0KLSAgICAgICAgICAgIGlmKGVudGl0eUNsYXNzID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIuZmluZSgiY291bGRuJ3QgcmVzb2x2ZSBleHByZXNzaW9uOiAiICsgcmVzdWx0LmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm9wZXJ0eURldGFpbHMgZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmKERFQUNUSVZBVEVfRUxfUkVTT0xWRVIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5RGV0YWlsc1ZpYVJlZmxlY3Rpb25GYWxsYmFjayh1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgVmFsdWVFeHByZXNzaW9uIHZhbHVlRXhwcmVzc2lvbiA9IHVpQ29tcG9uZW50LmdldFZhbHVlRXhwcmVzc2lvbigidmFsdWUiKTsNCi0NCi0gICAgICAgIGlmKHZhbHVlRXhwcmVzc2lvbiA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRXh0VmFsRUxSZXNvbHZlciBlbFJlc29sdmVyID0gY3JlYXRlRXh0VmFsRUxSZXNvbHZlcihmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5zcGVjdFRhcmdldCh2YWx1ZUV4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgIEV4dFZhbEVMUmVzb2x2ZXIuY3JlYXRlQ29udGV4dFdyYXBwZXIoZmFjZXNDb250ZXh0LmdldEVMQ29udGV4dCgpLCBlbFJlc29sdmVyKSwgZmFsc2UpOw0KLQ0KLSAgICAgICAgRXh0VmFsRUxSZXNvbHZlciBjb21wb3NpdGVDb21wb25lbnRFTFJlc29sdmVyID0gbnVsbDsNCi0NCi0gICAgICAgIC8vc2VlIEVYVFZBTC0xMDINCi0gICAgICAgIHdoaWxlKGVsUmVzb2x2ZXIuZ2V0QmFzZU9iamVjdCgpIGluc3RhbmNlb2YgQ29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbkhvbGRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBWYWx1ZUV4cHJlc3Npb24gbmV3VmFsdWVFeHByZXNzaW9uID0gKChDb21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uSG9sZGVyKSBlbFJlc29sdmVyLmdldEJhc2VPYmplY3QoKSkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRFeHByZXNzaW9uKGVsUmVzb2x2ZXIuZ2V0UHJvcGVydHkoKSk7DQotDQotICAgICAgICAgICAgaWYgKG5ld1ZhbHVlRXhwcmVzc2lvbiAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZWxSZXNvbHZlciA9IGNyZWF0ZUV4dFZhbEVMUmVzb2x2ZXIoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgICAgICAgICAgaW5zcGVjdFRhcmdldChuZXdWYWx1ZUV4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsRUxSZXNvbHZlci5jcmVhdGVDb250ZXh0V3JhcHBlcigNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dC5nZXRFTENvbnRleHQoKSwgZWxSZXNvbHZlciksIGZhbHNlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvL3JlLWNoZWNrIHRvIGdldCBmdWxsIGtleSBmb3IgY3Jvc3MtdmFsaWRhdGlvbg0KLSAgICAgICAgaWYgKGVsUmVzb2x2ZXIuZ2V0Q29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbigpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgVmFsdWVFeHByZXNzaW9uIGNvbXBvc2l0ZUV4cHJlc3Npb24gPSBlbFJlc29sdmVyLmdldENvbXBvc2l0ZUNvbXBvbmVudEV4cHJlc3Npb24oKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBjb21wb3NpdGVDb21wb25lbnRFTFJlc29sdmVyID0gY3JlYXRlRXh0VmFsRUxSZXNvbHZlcihmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgICAgIGluc3BlY3RUYXJnZXQoY29tcG9zaXRlRXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgIEV4dFZhbEVMUmVzb2x2ZXIuY3JlYXRlQ29udGV4dFdyYXBwZXIoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dC5nZXRFTENvbnRleHQoKSwgY29tcG9zaXRlQ29tcG9uZW50RUxSZXNvbHZlciksIHRydWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoZWxSZXNvbHZlci5nZXRQYXRoKCkgPT0gbnVsbCB8fCBlbFJlc29sdmVyLmdldEJhc2VPYmplY3QoKSA9PSBudWxsIHx8IGVsUmVzb2x2ZXIuZ2V0UHJvcGVydHkoKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIGtleTsNCi0gICAgICAgIGlmKGNvbXBvc2l0ZUNvbXBvbmVudEVMUmVzb2x2ZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBrZXkgPSBjb21wb3NpdGVDb21wb25lbnRFTFJlc29sdmVyLmdldFBhdGgoKSArDQotICAgICAgICAgICAgICAgICAgICBlbFJlc29sdmVyLmdldFBhdGgoKS5zdWJzdHJpbmcoZWxSZXNvbHZlci5nZXRQYXRoKCkuaW5kZXhPZigiLiIpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBrZXkgPSBlbFJlc29sdmVyLmdldFBhdGgoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlEZXRhaWxzKGtleSwgZWxSZXNvbHZlci5nZXRCYXNlT2JqZWN0KCksIGVsUmVzb2x2ZXIuZ2V0UHJvcGVydHkoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RUYXJnZXQoVmFsdWVFeHByZXNzaW9uIHZhbHVlRXhwcmVzc2lvbiwgRUxDb250ZXh0IGVsQ29udGV4dCwgYm9vbGVhbiBpbnNwZWN0Q29tcG9zaXRlQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWx1ZUV4cHJlc3Npb24uc2V0VmFsdWUoZWxDb250ZXh0LCBudWxsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihpbnNwZWN0Q29tcG9zaXRlQ29tcG9uZW50KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IgYXQgYmluZGluZzogIiArIHZhbHVlRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAtLSBhbiBlbC1yZXNvbHZlciBlcnJvciBvY2N1cnJlZCEgbWF5YmUgeW91IHVzZWQgYW4gaW52YWxpZCBiaW5kaW5nLiIsIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEV4dFZhbEVMUmVzb2x2ZXIgY3JlYXRlRXh0VmFsRUxSZXNvbHZlcihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEV4dFZhbEVMUmVzb2x2ZXIoZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZ2V0RUxSZXNvbHZlcigpLCB0aGlzLnByb2plY3RTdGFnZURldmVsb3BtZW50KTsNCi0gICAgfQ0KLQ0KLSAgICAvL2tlZXAgaW4gc3luYyB3aXRoIERlZmF1bHRFTEhlbHBlciNnZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyBvZiBicmFuY2ghISENCi0gICAgcHJvdGVjdGVkIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNWaWFSZWZsZWN0aW9uRmFsbGJhY2soVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBnZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50LCBmYWxzZSk7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uID0NCi0gICAgICAgICAgICBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotDQotICAgICAgICBTdHJpbmcgcGF0aCA9IG51bGw7DQotDQotICAgICAgICB3aGlsZShjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYocGF0aCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcGF0aCA9IGdldFByb3BlcnR5TmFtZShjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHBhdGggPSBnZXRQcm9wZXJ0eU5hbWUoY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24pICsgIi4iICsgcGF0aDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcGF0aCA9IGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkgKyAiLiIgKyBwYXRoOw0KLQ0KLSAgICAgICAgT2JqZWN0IGJhc2VPYmplY3QgPSBnZXRWYWx1ZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotDQotICAgICAgICAvL2luIGNhc2Ugb2YgZS5nLjogI3tiZWFuW2JlYW4ucGFzc3dvcmRSZXBlYXRlZFByb3BlcnR5TmFtZV19DQotICAgICAgICAvLy0+IGJlYW4ucGFzc3dvcmRSZXBlYXRlZFByb3BlcnR5TmFtZSBpcyBub3QgdGhlIGZpbmFsIHByb3BlcnR5IG5hbWUNCi0gICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlEZXRhaWxzKHBhdGgsIGJhc2VPYmplY3QsIGdldFByb3BlcnR5TmFtZSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0NCi0gICAgICAgIGlmKHByb3BlcnR5TmFtZS5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IGV4dHJhY3RQcm9wZXJ0eU5hbWVPZlByb3BlcnR5UGF0aChwcm9wZXJ0eU5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic3VwcG9ydCBmb3IgbW9yZSBkeW5hbWljIGJpbmRpbmdzIC0gZGV0YWlscyBzZWUgaW5saW5lIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXh0cmFjdFByb3BlcnR5TmFtZU9mUHJvcGVydHlQYXRoKFN0cmluZyBwcm9wZXJ0eUNoYWluKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmdbXSBwcm9wZXJ0aWVzID0gcHJvcGVydHlDaGFpbi5zcGxpdCgiXFwuIik7DQotDQotICAgICAgICBPYmplY3QgY3VycmVudFByb3BlcnR5VmFsdWUgPSBnZXRCZWFuKHByb3BlcnRpZXNbMF0pOw0KLQ0KLSAgICAgICAgTWV0aG9kIGN1cnJlbnRNZXRob2Q7DQotICAgICAgICBTdHJpbmcgY3VycmVudFByb3BlcnR5TmFtZTsNCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzc09mUHJvcGVydHlWYWx1ZTsNCi0gICAgICAgIGZvcihpbnQgaSA9IDE7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0aWVzW2ldOw0KLSAgICAgICAgICAgIGN1cnJlbnRDbGFzc09mUHJvcGVydHlWYWx1ZSA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudFByb3BlcnR5VmFsdWUuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgY3VycmVudE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZChjdXJyZW50Q2xhc3NPZlByb3BlcnR5VmFsdWUsDQotICAgICAgICAgICAgICAgICJnZXQiICsgY3VycmVudFByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIGN1cnJlbnRQcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpKTsNCi0NCi0gICAgICAgICAgICBpZihjdXJyZW50TWV0aG9kID09IG51bGwgJiYgY3VycmVudFByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBNYXApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL2l0J3Mgb2sgZm9yIHRoZSBzaW1wbGUgbWFwIGNhc2UgLSBidXQgbm90IGZvciBlLmcuOg0KLSAgICAgICAgICAgICAgICAvLyN7YmVhbjFbYmVhbjIucHJvcGVydHlOYW1lUHJvdmlkZXJbIGJlYW4zLmluZGV4XV19DQotICAgICAgICAgICAgICAgIC8vb3IgZXZlcnkgb3RoZXIgY29tcGxleCByZXBsYWNlbWVudCBmb3IgYmVhbjMuaW5kZXgNCi0gICAgICAgICAgICAgICAgLy9pdCBtaWdodCBhbHNvIHJlcXVpcmUgYW4gYWRqdXN0bWVudCBhdCBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIjdHJ5VG9UcmFuc2Zvcm1Ub1JlYWxCaW5kaW5nDQotICAgICAgICAgICAgICAgICgoTWFwKWN1cnJlbnRQcm9wZXJ0eVZhbHVlKS5nZXQoY3VycmVudFByb3BlcnR5TmFtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eVZhbHVlID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKGN1cnJlbnRQcm9wZXJ0eVZhbHVlLCBjdXJyZW50TWV0aG9kKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZihjdXJyZW50UHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFN0cmluZyljdXJyZW50UHJvcGVydHlWYWx1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmxvZ2dlci5zZXZlcmUoInVuZXhwZWN0ZWQgdmFsdWUgd2l0aGluIG1hcCBzeW50YXg6ICIgKyBwcm9wZXJ0eUNoYWluICsNCi0gICAgICAgICAgICAgICAgICAgICIgbGFzdCBwcm9wZXJ0eSBuYW1lOiAiICsgY3VycmVudFByb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHN0YXRpYyBTdHJpbmcgZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBWYWx1ZUV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uID0gdWlDb21wb25lbnQuZ2V0VmFsdWVFeHByZXNzaW9uKCJ2YWx1ZSIpOw0KLQ0KLSAgICAgICAgcmV0dXJuICh2YWx1ZUV4cHJlc3Npb24gIT0gbnVsbCkgPyB2YWx1ZUV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VMVGVybVdlbGxGb3JtZWQoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgVmFsdWVCaW5kaW5nIHx8IG8gaW5zdGFuY2VvZiBFeHRlcm5hbGl6YWJsZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcyA9IG8udG9TdHJpbmcoKTsNCi0gICAgICAgIHJldHVybiAoKHMuY29udGFpbnMoIiMiKSB8fCBzLmNvbnRhaW5zKCIkIikpICYmIHMuY29udGFpbnMoInsiKSAmJiBzLmNvbnRhaW5zKCJ9IikpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmluZGluZ09mQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHVpQ29tcG9uZW50LmdldFZhbHVlRXhwcmVzc2lvbihuYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2ZlNTZjLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RUxIZWxwZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkNCi17DQotICAgIHByaXZhdGUgRUxIZWxwZXIgZWxIZWxwZXIgPSBuZXcgRGVmYXVsdEVMSGVscGVyKCk7DQotICAgIA0KLSAgICBwcm90ZWN0ZWQgRUxIZWxwZXIgY3JlYXRlRUxIZWxwZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5lbEhlbHBlcjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMzMxODIuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FTEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBFbmNhcHVsYXRlcyBFTCBoYW5kbGluZyB0byBpc29sYXRlIHRoZSBkZXBlbmRlbmN5IHRvIHRoZSBzcGVjaWZpYyBqc2YgdmVyc2lvbi4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRUxIZWxwZXINCi17DQotICAgIC8qKg0KLSAgICAgKiBSZXNvbHZlcyB0aGUgYmVhbiBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBuYW1lLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gYmVhbk5hbWUgVGhlIGJlYW4gbmFtZSB3ZSBhcmUgaW50ZXJlc3RlZCBpbiwgbm8gRUwgZXhwcmVzc2lvbi4NCi0gICAgICogQHJldHVybiBpbnN0YW5jZSBmb3IgdGhlIGJlYW4gbmFtZSBvciBudWxsLg0KLSAgICAgKi8NCi0gICAgT2JqZWN0IGdldEJlYW4oU3RyaW5nIGJlYW5OYW1lKTsNCi0NCi0gICAgLyoqDQotICAgICAqIEV2YWx1YXRlcyB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiB3aXRoaW4gdGhlIGN1cnJlbnQge0BsaW5rIGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0fQ0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IDxjb2RlPkZhY2VzQ29udGV4dDwvY29kZT4gZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QNCi0gICAgICogQHBhcmFtIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWUtYmluZGluZyB0byBldmFsdWF0ZQ0KLSAgICAgKiBAcmV0dXJuIHJlc3VsdCBmb3IgdGhlIGdpdmVuIGV4cHJlc3Npb24NCi0gICAgICovDQotICAgIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLQ0KLSAgICAvKioNCi0gICAgICogRXZhbHVhdGVzIHRoZSB0eXBlIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0VmFsdWVPZkV4cHJlc3Npb259DQotICAgICAqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgPGNvZGU+RmFjZXNDb250ZXh0PC9jb2RlPiBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZS1iaW5kaW5nIHRvIGV2YWx1YXRlDQotICAgICAqIEByZXR1cm4gdHlwZSBvZiB0aGUgcmVzdWx0IG9mIHRoZSBleHByZXNzaW9uDQotICAgICAqLw0KLSAgICBDbGFzcyBnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIC8qKg0KLSAgICAgKiBFeHRyYWN0cyB0aGUgcHJvcGVydHkgZGV0YWlscyAoZXhwcmVzc2lvbiwgYmFzZSBvYmplY3QgYW5kIHByb3BlcnR5IG5hbWUpIGluZm9ybWF0aW9uIG9mIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgb2YNCi0gICAgICogdGhlIGdpdmVuIHtAbGluayBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnR9DQotICAgICAqIHZhbHVlIGF0dHJpYnV0ZS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IFRoZSB7QGxpbmsgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50fSBpbiBxdWVzdGlvbg0KLSAgICAgKiBAcmV0dXJuIHByb3BlcnR5IGRldGFpbHMgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4ge0BsaW5rIGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudH0NCi0gICAgICovDQotICAgIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBleHByZXNzaW9uIGlzIGEgdmFsaWQgZXhwcmVzc2lvbiwgbWVhbmluZyB0aGF0IHRoZSBleHByZXNzaW9uIGNhbiBiZSBldmFsdWF0ZWQgd2l0aG91dA0KLSAgICAgKiBhbiBleGNlcHRpb24uDQotICAgICAqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgVGhlIEpTRiBDb250ZXh0DQotICAgICAqIEBwYXJhbSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uIFRoZSBFTCBleHByZXNzaW9uIHdlIHdhbnQgdG8gZXZhbHVhdGUuDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXhwcmVzc2lvbiBpcyB2YWxpZCAtIGZhbHNlIG90aGVyd2lzZQ0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBpc0VMVGVybVZhbGlkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0NCi0gICAgLyoqDQotICAgICAqIEEgdmVyeSBiYXNpYyBjaGVjayBvZiB0aGUgRUwgZXhwcmVzc2lvbg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbyBPYmplY3QgaW4gcXVlc3Rpb24NCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgYSB3ZWxsIGZvcm1lZCBzdHJpbmcgLSBmYWxzZSBvdGhlcndpc2UNCi0gICAgICovDQotICAgIGJvb2xlYW4gaXNFTFRlcm1XZWxsRm9ybWVkKE9iamVjdCBvKTsNCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgc3BlY2lmaWVkICBieSB0aGUgcGFyYW1ldGVyIG5hbWUgZm9yIHRoZSBVSUNvbXBvbmVudC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IFRoZSB7QGxpbmsgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50fSBpbiBxdWVzdGlvbg0KLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLg0KLSAgICAgKiBAcmV0dXJuIFRoZSBWYWx1ZUV4cHJlc3Npb24gYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZS4NCi0gICAgICovDQotICAgIEBEZXByZWNhdGVkDQotICAgIE9iamVjdCBnZXRCaW5kaW5nT2ZDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBuYW1lKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FeHRWYWxFTFJlc29sdmVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0V4dFZhbEVMUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVjMDdiZi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0V4dFZhbEVMUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7Ci0KLWltcG9ydCBqYXZheC5lbC5FTFJlc29sdmVyOwotaW1wb3J0IGphdmF4LmVsLkVMQ29udGV4dDsKLWltcG9ydCBqYXZheC5lbC5WYXJpYWJsZU1hcHBlcjsKLWltcG9ydCBqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb247Ci1pbXBvcnQgamF2YXguZWwuRnVuY3Rpb25NYXBwZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuZWwuQ29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbkhvbGRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBqYXZhLmJlYW5zLkZlYXR1cmVEZXNjcmlwdG9yOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsRUxSZXNvbHZlciBleHRlbmRzIEVMUmVzb2x2ZXIKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCi0gICAgcHJpdmF0ZSBFTFJlc29sdmVyIHdyYXBwZWQ7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gcHJvamVjdFN0YWdlRGV2ZWxvcG1lbnQ7Ci0KLSAgICBwcml2YXRlIE9iamVjdCBiYXNlT2JqZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5OwotICAgIC8vZm9ybXMgdGhlIGlkIGZvciBjcm9zcy12YWxpZGF0aW9uIHdpdGhpbiBjb21wbGV4IGNvbXBvbmVudHMKLSAgICBwcml2YXRlIFN0cmluZyBleHByZXNzaW9uOwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BhdGhSZWNvcmRpbmdTdG9wcGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uSG9sZGVyIGNvbXBvc2l0ZUNvbXBvbmVudEV4cHJlc3Npb25Ib2xkZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbkJhc2U7Ci0KLSAgICBwdWJsaWMgRXh0VmFsRUxSZXNvbHZlcihFTFJlc29sdmVyIGVsUmVzb2x2ZXIsIGJvb2xlYW4gcHJvamVjdFN0YWdlRGV2ZWxvcG1lbnQpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSBlbFJlc29sdmVyOwotICAgICAgICB0aGlzLnByb2plY3RTdGFnZURldmVsb3BtZW50ID0gcHJvamVjdFN0YWdlRGV2ZWxvcG1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRCYXNlT2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpCi0gICAgewotICAgICAgICB0aGlzLmxvZ2dlci5maW5lc3QoImV4dHJhY3RlZCBwYXRoOiAiICsgdGhpcy5leHByZXNzaW9uKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpCi0gICAgewotICAgICAgICB0aGlzLmJhc2VPYmplY3QgPSBudWxsOwotICAgICAgICB0aGlzLnByb3BlcnR5ID0gbnVsbDsKLSAgICAgICAgdGhpcy5leHByZXNzaW9uID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBwYXRoIHJlY29yZGluZyBpcyBwZXJmb3JtZWQgdG8gZ2V0IGEga2V5IGZvciBjcm9zcy12YWxpZGF0aW9uPGJyLz4KLSAgICAgKiBldmVyeSBiYXNlIGFmdGVyIHRoZSBmaXJzdCBjYWxsIHdoaWNoIGlzIG51bGwgc3RvcHMgcmVjb3JkaW5nPGJyLz4KLSAgICAgKiB3aXRoIGEgZHluYW1pYyBtYXAgc3ludGF4IHRoZSBsYXN0IHByb3BlcnR5IGluIHRoZSBtaWRkbGUgb2YgYW4gZXhwcmVzc2lvbiBoYXMgdG8gYmUgYSBzdHJpbmcuCi0gICAgICogc3VjaCBhIHN0cmluZyByZXN1bHQgY29udGludWVzIHRoZSBwYXRoIHJlY29yZGluZyBhdCB0aGUgbmV4dCBjYWxsIGZvciB0aGUgY3VycmVudCBleHByZXNzaW9uLgotICAgICAqIDxwLz4KLSAgICAgKiBleGFtcGxlOiAje2JlYW5bYmVhbi5wcm9wZXJ0eU5hbWVQcm92aWRlclsnbmFtZU9mUHJvcGVydHkxJ11dWydkeW5CZWFuJ10ucHJvcGVydHl9Ci0gICAgICogPHAvPgotICAgICAqIGxpbWl0YXRpb24gZm9yIGNyb3NzLXZhbGlkYXRpb246IG5hbWVPZlByb3BlcnR5MSBoYXMgdG8gYmUgb2YgdHlwZSBzdHJpbmcuCi0gICAgICogb3RoZXIga2V5IHR5cGVzIGFyZW4ndCBzdXBwb3J0ZWQgeWV0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxDb250ZXh0IHdyYXBwZWQgZWwtY29udGV4dAotICAgICAqIEBwYXJhbSBiYXNlIGN1cnJlbnQgYmFzZQotICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBwcm9wZXJ0eSB0byByZXNvbHZlCi0gICAgICogQHJldHVybiByZXN1bHQgb2YgdGhlIGRlbGVnYXRlZCBtZXRob2QgY2FsbAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoRUxDb250ZXh0IGVsQ29udGV4dCwgT2JqZWN0IGJhc2UsIE9iamVjdCBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIE9iamVjdCByZXN1bHQgPSB0aGlzLndyYXBwZWQuZ2V0VmFsdWUoZWxDb250ZXh0LCBiYXNlLCBwcm9wZXJ0eSk7Ci0KLSAgICAgICAgaWYodGhpcy5jb21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uSG9sZGVyICE9IG51bGwgJiYgdGhpcy5jb21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uQmFzZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmNvbXBvc2l0ZUNvbXBvbmVudEV4cHJlc3Npb25CYXNlID0gKFN0cmluZylwcm9wZXJ0eTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRoaXMuY29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbkhvbGRlciA9PSBudWxsICYmIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBvc2l0ZUNvbXBvbmVudEV4cHJlc3Npb25Ib2xkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuY29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbkhvbGRlciA9ICgoQ29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbkhvbGRlcilyZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy92ZXJ5IGZpcnN0IGNhbGwgZm9yIGFuIGV4cHJlc3Npb24KLSAgICAgICAgaWYodGhpcy5leHByZXNzaW9uID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IChTdHJpbmcpcHJvcGVydHk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8je2JlYW5bZHluQmFzZS5wcm9wZXJ0eU5hbWVdfSAtPiBiYXNlIG9mIGR5bkJhc2UgaXMgbnVsbCAtPiBzdG9wIHBhdGggcmVjb3JkaW5nCi0gICAgICAgIGVsc2UgaWYoYmFzZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmlzUGF0aFJlY29yZGluZ1N0b3BwZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBwcm9wZXJ0eUV4aXN0cyA9IGZhbHNlOwotICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IChTdHJpbmcpcHJvcGVydHk7Ci0gICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihiYXNlIGluc3RhbmNlb2YgTWFwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoKChNYXApYmFzZSkuY29udGFpbnNLZXkocHJvcGVydHkpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZihQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKGJhc2UuZ2V0Q2xhc3MoKSkuZ2V0TWV0aG9kKCJnZXQiICsgcHJvcGVydHlOYW1lKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoYmFzZS5nZXRDbGFzcygpKS5nZXRNZXRob2QoImlzIiArIHByb3BlcnR5TmFtZSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZTEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZighImF0dHJzIi5lcXVhbHMocHJvcGVydHkpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5maW5lc3QoInByb3BlcnR5OiAiICsgcHJvcGVydHkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzbid0IHVzZWQgZm9yIHBhdGggLSBpdCBpc24ndCBhIHByb3BlcnR5IG9mICIgKyBiYXNlLmdldENsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vZS5nLjogI3tiZWFuLnN1YkJhc2UucHJvcGVydHl9IC0+IGhlcmUgd2UgYXJlIGF0IHN1YkJhc2UKLSAgICAgICAgICAgIGlmKHByb3BlcnR5RXhpc3RzICYmICF0aGlzLmlzUGF0aFJlY29yZGluZ1N0b3BwZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uICs9ICIuIiArIHByb3BlcnR5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihwcm9wZXJ0eUV4aXN0cyAmJiByZXN1bHQgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc1BhdGhSZWNvcmRpbmdTdG9wcGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICBpZih0aGlzLmlzUGF0aFJlY29yZGluZ1N0b3BwZWQgJiYgcmVzdWx0IGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gKz0gIi4iICsgcHJvcGVydHk7Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzczw/PiBnZXRUeXBlKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvLCBPYmplY3QgbzEpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRUeXBlKGVsQ29udGV4dCwgbywgbzEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvLCBPYmplY3QgbzEsIE9iamVjdCBvMikKLSAgICB7Ci0gICAgICAgIGlmKG8xIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihleHByZXNzaW9uID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IChTdHJpbmcpbzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXhwcmVzc2lvbiArPSAiLiIgKyBvMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb3BlcnR5ID0gKFN0cmluZylvMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ1dhcm5pbmdGb3JVbnN1cHBvcnRlZEV4cHJlc3Npb24obzEpOwotICAgICAgICB9Ci0KLSAgICAgICAgYmFzZU9iamVjdCA9IG87Ci0gICAgICAgIGVsQ29udGV4dC5zZXRQcm9wZXJ0eVJlc29sdmVkKHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoRUxDb250ZXh0IGVsQ29udGV4dCwgT2JqZWN0IG8sIE9iamVjdCBvMSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmlzUmVhZE9ubHkoZWxDb250ZXh0LCBvLCBvMSk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yPEZlYXR1cmVEZXNjcmlwdG9yPiBnZXRGZWF0dXJlRGVzY3JpcHRvcnMoRUxDb250ZXh0IGVsQ29udGV4dCwgT2JqZWN0IG8pCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRGZWF0dXJlRGVzY3JpcHRvcnMoZWxDb250ZXh0LCBvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0Q29tbW9uUHJvcGVydHlUeXBlKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q29tbW9uUHJvcGVydHlUeXBlKGVsQ29udGV4dCwgbyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFTENvbnRleHQgY3JlYXRlQ29udGV4dFdyYXBwZXIoZmluYWwgRUxDb250ZXh0IGNvbnRleHQsIGZpbmFsIEVMUmVzb2x2ZXIgcmVzb2x2ZXIpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEVMQ29udGV4dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIExvY2FsZSBnZXRMb2NhbGUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldExvY2FsZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5UmVzb2x2ZWQoYm9vbGVhbiB2YWx1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlci5zZXRQcm9wZXJ0eVJlc29sdmVkKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldFByb3BlcnR5UmVzb2x2ZWQodmFsdWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHB1dENvbnRleHQoQ2xhc3MgY2xhenosIE9iamVjdCBvYmplY3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIucHV0Q29udGV4dChjbGF6eiwgb2JqZWN0KTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnB1dENvbnRleHQoY2xhenosIG9iamVjdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRDb250ZXh0KENsYXNzIGNsYXp6KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldENvbnRleHQoY2xhenopOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jYWxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyLnNldExvY2FsZShsb2NhbGUpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0TG9jYWxlKGxvY2FsZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEVMUmVzb2x2ZXIgZ2V0RUxSZXNvbHZlcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBGdW5jdGlvbk1hcHBlciBnZXRGdW5jdGlvbk1hcHBlcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0RnVuY3Rpb25NYXBwZXIoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgVmFyaWFibGVNYXBwZXIgZ2V0VmFyaWFibGVNYXBwZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldFZhcmlhYmxlTWFwcGVyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmFsdWVFeHByZXNzaW9uIGdldENvbXBvc2l0ZUNvbXBvbmVudEV4cHJlc3Npb24oKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5jb21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uSG9sZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBvc2l0ZUNvbXBvbmVudEV4cHJlc3Npb25Ib2xkZXIuZ2V0RXhwcmVzc2lvbih0aGlzLmNvbXBvc2l0ZUNvbXBvbmVudEV4cHJlc3Npb25CYXNlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9nV2FybmluZ0ZvclVuc3VwcG9ydGVkRXhwcmVzc2lvbihPYmplY3QgbzEpCi0gICAgewotICAgICAgICBpZih0aGlzLnByb2plY3RTdGFnZURldmVsb3BtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuaW5nKG8xICsgIiBpcyBub3QgYSB2YWxpZCBwcm9wZXJ0eSBmb3IgY29uc3RyYWludCBiYXNlZCB2YWxpZGF0aW9uLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybmluZygiQSBwcm9wZXJ0eSB3aGljaCBkb2Vzbid0IHN1cHBvcnQgY29uc3RyYWludCBiYXNlZCB2YWxpZGF0aW9uIGhhcyBiZWVuIGRldGVjdGVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZTI2NTcuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogSGVscGVyIGNsYXNzIHRvIGdldCB0aGUgcmVhbC9mdWxsIHZhbHVlIGJpbmRpbmcgLSB0ZXN0ZWQgd2l0aCBmYWNlbGV0cyAxLjEuMTQNCi0gKiBUaGUgdGFyZ2V0IGlzIHRvIGdldCByaWQgb2YgdGhpcyBpbXBsLiAtIGN1cnJlbnRseSBpdCdzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IGN1c3RvbSBmYWNlbGV0cyBjb21wb25lbnRzLg0KLSAqIEFuIGFsdGVybmF0aXZlIHdvdWxkIGJlIGFuIEVMLVJlc29sdmVyIC0gdGhlcmUgYXJlIHN0aWxsIHNvbWUgb3BlbiBpc3N1ZXMgd2l0aCBzdWNoIGFuIGFwcHJvYWNoDQotICogKyBJdCBpc24ndCBhdmFpbGFibGUgd2l0aCBKU0YgMS4xLngNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9DcmVhdGVWYWx1ZUJpbmRpbmdGb3JGYWNlbGV0c0JpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBEZWZhdWx0RUxIZWxwZXIuZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEJpbmRpbmdzID0gZXh0cmFjdEVMVGVybXMoDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmluZGluZ09mQ29tcG9uZW50KHVpQ29tcG9uZW50LCAidmFsdWUiKSk7DQotDQotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZT0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIDEpICsgInsiICsgY3JlYXRlQmluZGluZyhmb3VuZEJpbmRpbmdzLCBtYXBwZWRGYWNlbGV0c1ZhcnMpICsgIn0iKTsNCi0NCi0gICAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YmUuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotDQotICAgICAgICAgICAgaWYoZW50aXR5Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnlUb1JlcGxhY2VWYXJzKHZiZSwgbWFwcGVkRmFjZWxldHNWYXJzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHZiZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVCaW5kaW5nKExpc3Q8U3RyaW5nPiBleHByZXNzaW9ucywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkZWRWaXJ0dWFsTmFtZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGVudHJ5IDogZXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoIlZhbHVlRXhwcmVzc2lvblsiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBmb3VuZEJpbmRpbmdEZXRhaWxzID0gZW50cnkuc3BsaXQoIiAiKTsNCi0gICAgICAgICAgICBpbmRleE9mQmluZGluZ0RldGFpbHMgPSBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKGZvdW5kQmluZGluZ0RldGFpbHMpOw0KLQ0KLSAgICAgICAgICAgIGlmIChpbmRleE9mQmluZGluZ0RldGFpbHMgPT0gLTEpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgYmluZGluZ0RldGFpbHMgPSBmb3VuZEJpbmRpbmdEZXRhaWxzW2luZGV4T2ZCaW5kaW5nRGV0YWlsc10uc3BsaXQoIj0iKTsNCi0NCi0gICAgICAgICAgICBpZiAoYmluZGluZ0RldGFpbHMubGVuZ3RoIDwgMikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGJpbmRpbmdEZXRhaWxzWzFdOw0KLQ0KLSAgICAgICAgICAgIC8vdG8gc3VwcG9ydCBibGFua3Mgd2l0aGluIGEgYmluZGluZyB3aXRoIG1hcCBzeW50YXgNCi0gICAgICAgICAgICBpZihjdXJyZW50QmluZGluZy5jb250YWlucygieyIpICYmICFjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgPSBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKGN1cnJlbnRCaW5kaW5nLCBmb3VuZEJpbmRpbmdEZXRhaWxzLCBpbmRleE9mQmluZGluZ0RldGFpbHMpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnNLZXkoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5wdXQoYmluZGluZ0RldGFpbHNbMF0sIGN1cnJlbnRCaW5kaW5nKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvL2VudHJ5IGZvciAidmlydHVhbCIgZmFjZWxldHMgdmFyDQotICAgICAgICAgICAgaWYoIShjdXJyZW50QmluZGluZy5jb250YWlucygieyIpIHx8IGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhcnMucHV0KGJpbmRpbmdEZXRhaWxzWzBdLCBiaW5kaW5nRGV0YWlsc1sxXS5zdWJzdHJpbmcoMSwgYmluZGluZ0RldGFpbHNbMV0ubGVuZ3RoKCktMikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBvcmlnaW5hbEJpbmRpbmcgPSBhZGRlZFZpcnR1YWxOYW1lcy5nZXQoInZhbHVlIik7DQotICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcuc3Vic3RyaW5nKG9yaWdpbmFsQmluZGluZy5pbmRleE9mKCJ7IikgKyAxLCBvcmlnaW5hbEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLnJlbW92ZSgidmFsdWUiKTsNCi0gICAgICAgIHJldHVybiB0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcob3JpZ2luYWxCaW5kaW5nLCBhZGRlZFZpcnR1YWxOYW1lcywgdmlydHVhbFZhcnMpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcoDQotICAgICAgICAgICAgU3RyaW5nIG9yaWdpbmFsQmluZGluZywgTWFwPFN0cmluZywgU3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gIiN7IiArIG9yaWdpbmFsQmluZGluZyArICJ9IjsNCi0gICAgICAgIEl0ZXJhdG9yIG5hbWVJdGVyYXRvciA9IGFkZGVkVmlydHVhbE5hbWVzLmtleVNldCgpLml0ZXJhdG9yKCk7DQotDQotICAgICAgICBTdHJpbmcgY3VycmVudEtleTsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50VmFsdWU7DQotICAgICAgICB3aGlsZShuYW1lSXRlcmF0b3IuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRLZXkgPSAoU3RyaW5nKSBuYW1lSXRlcmF0b3IubmV4dCgpOw0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGFkZGVkVmlydHVhbE5hbWVzLmdldChjdXJyZW50S2V5KTsNCi0gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGN1cnJlbnRWYWx1ZS5pbmRleE9mKCJ7IikgKyAxLCBjdXJyZW50VmFsdWUuaW5kZXhPZigifSIpKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIi4iLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJ7IiArIGN1cnJlbnRLZXkgKyAiWyIsICJ7IiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICIuIiwgIi4iICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiLiIgKyBjdXJyZW50S2V5ICsgIlsiLCAiLiIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiXSIsICJbJyIgKyBjdXJyZW50VmFsdWUgKyAiJ10iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIlsiLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiLiIsICJbIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICB9DQotDQotICAgICAgICBuYW1lSXRlcmF0b3IgPSB2aXJ0dWFsVmFycy5rZXlTZXQoKS5pdGVyYXRvcigpOw0KLQ0KLSAgICAgICAgd2hpbGUobmFtZUl0ZXJhdG9yLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50S2V5ID0gKFN0cmluZykgbmFtZUl0ZXJhdG9yLm5leHQoKTsNCi0NCi0gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSB2aXJ0dWFsVmFycy5nZXQoY3VycmVudEtleSk7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoInsiICsgY3VycmVudEtleSArICIuIiwgInsiICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIlsiLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCIuIiArIGN1cnJlbnRLZXkgKyAiLiIsICIuIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICJbIiwgIi4iICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIl0iLCAiWyciICsgY3VycmVudFZhbHVlICsgIiddIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIlsiICsgY3VycmVudEtleSArICJbIiwgIlsiICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIi4iLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG9yaWdpbmFsQmluZGluZy5zdWJzdHJpbmcoMiwgb3JpZ2luYWxCaW5kaW5nLmxlbmd0aCgpIC0gMSk7DQotICAgIH0NCi0NCi0gICAgLy90byBzdXBwb3J0IGJsYW5rcyAtIGUuZy4gd2l0aCBtYXAgc3ludGF4DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKFN0cmluZyBjdXJyZW50QmluZGluZywgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlscykNCi0gICAgew0KLSAgICAgICAgZm9yKGludCBpID0gaW5kZXhPZkJpbmRpbmdEZXRhaWxzICsgMTsgaSA8IGZvdW5kQmluZGluZ0RldGFpbHMubGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgKz0gZm91bmRCaW5kaW5nRGV0YWlsc1tpXTsNCi0gICAgICAgICAgICBpZihmb3VuZEJpbmRpbmdEZXRhaWxzW2ldLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEJpbmRpbmc7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRCaW5kaW5nOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBpbnQgY291bnQgPSAwOw0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBiaW5kaW5nRGV0YWlscykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuY29udGFpbnMoIj0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY291bnQrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZXh0cmFjdEVMVGVybXMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlRUxUZXJtcyhvLCBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKSwgZm91bmRFTFRlcm1zLCAwKSA+IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRFTFRlcm1zOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcmVzb2x2ZUVMVGVybXMoT2JqZWN0IG8sIE1hcDxPYmplY3QsIE9iamVjdD4gdmlzaXRlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMsIGludCBjb3VudCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAobyA9PSBudWxsIHx8IHZpc2l0ZWQuY29udGFpbnNLZXkobykgfHwgY291bnQgPiA1MCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZpc2l0ZWQucHV0KG8sIG51bGwpOw0KLQ0KLSAgICAgICAgaW50IGVsQ291bnQgPSAwOw0KLSAgICAgICAgQ2xhc3MgYyA9IG8uZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIC8vaW5zcGVjdCBtYXBzDQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1hcCkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBmb3IgKE9iamVjdCBlbnRyeSA6ICgoTWFwKSBvKS52YWx1ZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZm91bmQgZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICAgICAgaWYoZW50cnkudG9TdHJpbmcoKS5jb250YWlucygiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKGVudHJ5LnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoZW50cnksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGVsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQobykpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gKytlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9hbmFseXplIGFycmF5cw0KLSAgICAgICAgaWYgKGMuaXNBcnJheSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgobyk7DQotICAgICAgICAgICAgLy9jaGVjayBhcnJheSBbTCAtPiBubyBhcnJheSBvZiBwcmltaXRpdmUgdHlwZXMNCi0gICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMamF2YS5sYW5nLlN0cmluZyIpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChBcnJheS5nZXQobywgaSkpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKEFycmF5LmdldChvLCBpKSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxGaWVsZD4gYXR0cmlidXRlcyA9IGZpbmRBbGxBdHRyaWJ1dGVzKGMsIG5ldyBBcnJheUxpc3Q8RmllbGQ+KCkpOw0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBhdHRyaWJ1dGVzLnRvQXJyYXkobmV3IEZpZWxkW2F0dHJpYnV0ZXMuc2l6ZSgpXSk7DQotDQotICAgICAgICBBY2Nlc3NpYmxlT2JqZWN0LnNldEFjY2Vzc2libGUoZmllbGRzLCB0cnVlKTsNCi0gICAgICAgIGZvciAoRmllbGQgY3VycmVudEZpZWxkIDogZmllbGRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQuZ2V0KG8pID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5nZXRUeXBlKCkuZXF1YWxzKFN0cmluZy5jbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmdldChvKSAhPSBudWxsICYmIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKGN1cnJlbnRGaWVsZC5nZXQobykpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFjdXJyZW50RmllbGQuZ2V0VHlwZSgpLmlzUHJpbWl0aXZlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKGN1cnJlbnRGaWVsZC5nZXQobyksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZWxDb3VudDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEZpZWxkPiBmaW5kQWxsQXR0cmlidXRlcyhDbGFzcyBjLCBMaXN0PEZpZWxkPiBhdHRyaWJ1dGVzKQ0KLSAgICB7DQotICAgICAgICBpZiAoYyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluZEFsbEF0dHJpYnV0ZXMoYy5nZXRTdXBlcmNsYXNzKCksIGF0dHJpYnV0ZXMpOw0KLQ0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBjLmdldERlY2xhcmVkRmllbGRzKCk7DQotICAgICAgICBmb3IgKEZpZWxkIGN1cnJlbnRGaWVsZCA6IGZpZWxkcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzU3RhdGljKGN1cnJlbnRGaWVsZC5nZXRNb2RpZmllcnMoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChjdXJyZW50RmllbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9SZXBsYWNlVmFycyhWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eTsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0gICAgICAgIGJvb2xlYW4gbGFzdCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgd2hpbGUodHJ1ZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxhc3QgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0NCi0gICAgICAgICAgICBwcm9wZXJ0eSA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbg0KLSAgICAgICAgICAgICAgICAucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIGdldE5ld1Byb3BlcnR5KHByb3BlcnR5LCBtYXBwZWRGYWNlbGV0c1ZhcnMpKTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQubGVuZ3RoKCkgPT0gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpICsgIi4iICsgcmVzdWx0Ow0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpOw0KLQ0KLSAgICAgICAgICAgIGlmKGxhc3QpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcmVmaXgoKSArICJ7IiArIHJlc3VsdCArICJ9Iik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5ld1Byb3BlcnR5KFN0cmluZyBvbGRQcm9wZXJ0eSwgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFycyA9IGdldFBvdGVudGlhbFZpcnR1YWxWYXJzKG9sZFByb3BlcnR5KTsNCi0NCi0gICAgICAgIGZvcihTdHJpbmcgdmlydHVhbFZhciA6IHZpcnR1YWxWYXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1hcHBlZEZhY2VsZXRzVmFycy5jb250YWluc0tleSh2aXJ0dWFsVmFyKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG9sZFByb3BlcnR5ID0gcmVwbGFjZVByb3BlcnR5VmFsdWUob2xkUHJvcGVydHksIHZpcnR1YWxWYXIsIG1hcHBlZEZhY2VsZXRzVmFycy5nZXQodmlydHVhbFZhcikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvbGRQcm9wZXJ0eTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0UG90ZW50aWFsVmlydHVhbFZhcnMoU3RyaW5nIG9sZFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpbnQgc3RhcnQgPSAtMTsNCi0gICAgICAgIGludCBlbmQgPSAtMTsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG9sZFByb3BlcnR5Lmxlbmd0aCgpOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoc3RhcnQgPT0gLSAxICYmIG9sZFByb3BlcnR5LmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKChzdGFydCAhPSAtIDEgJiYgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICdbJykgfHwgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICddJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGVuZCA9IGk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKHN0YXJ0ICE9IC0xICYmIGVuZCAhPSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJMaXN0LmFkZChvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOw0KLSAgICAgICAgICAgICAgICBpZihvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbmQgPSAtMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlydHVhbFZhckxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcGxhY2VQcm9wZXJ0eVZhbHVlKFN0cmluZyBvbGRQcm9wZXJ0eSwgU3RyaW5nIHRhcmdldFZhciwgU3RyaW5nIG5ld1ZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpbnQgaW5kZXggPSBvbGRQcm9wZXJ0eS5pbmRleE9mKHRhcmdldFZhcik7DQotDQotICAgICAgICBpZihpbmRleCA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gb2xkUHJvcGVydHk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gb2xkUHJvcGVydHkuc3Vic3RyaW5nKDAsIGluZGV4KTsNCi0gICAgICAgIHJlc3VsdCArPSBuZXdWYWx1ZTsNCi0gICAgICAgIHJldHVybiByZXN1bHQgKyBvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoaW5kZXggKyB0YXJnZXRWYXIubGVuZ3RoKCksIG9sZFByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiByZXBsYWNlIHZpcnR1YWwgZmFjZWxldHMgdmFycyAobWFwIHN5bnRheCkNCi0gICAgICogdGVzdGVkIHN0eWxlcyAoc2ltcGxlIGFuZCBuZXN0ZWQpOiB0ZXN0W2l4W2l4MltpeDNdXV0NCi0gICAgICovDQotICAgIC8qDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBfY3JlYXRlQmluZGluZyhMaXN0PFN0cmluZz4gZXhwcmVzc2lvbnMsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmlydHVhbFZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0NCi0gICAgICAgIFN0cmluZyBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50QmluZGluZzsNCi0gICAgICAgIFN0cmluZyBwYXJ0T2ZCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBleHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aCgiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZvdW5kQmluZGluZ0RldGFpbHMgPSBlbnRyeS5zcGxpdCgiICIpOw0KLSAgICAgICAgICAgIGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoZm91bmRCaW5kaW5nRGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9PSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBiaW5kaW5nRGV0YWlscyA9IGZvdW5kQmluZGluZ0RldGFpbHNbaW5kZXhPZkJpbmRpbmdEZXRhaWxzXS5zcGxpdCgiPSIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nRGV0YWlscy5sZW5ndGggPCAyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYmluZGluZ0RldGFpbHNbMV07DQotDQotICAgICAgICAgICAgLy90byBzdXBwb3J0IGJsYW5rcyB3aXRoaW4gYSBiaW5kaW5nIHdpdGggbWFwIHN5bnRheA0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgJiYgIWN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoY3VycmVudEJpbmRpbmcsIGZvdW5kQmluZGluZ0RldGFpbHMsIGluZGV4T2ZCaW5kaW5nRGV0YWlscyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lICE9IG51bGwgJiYgY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnMoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBwYXJ0T2ZCaW5kaW5nID0gY3VycmVudEJpbmRpbmcuc3Vic3RyaW5nKGN1cnJlbnRCaW5kaW5nLmluZGV4T2YocHJldkZhY2VsZXRzQXR0cmlidXRlTmFtZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICArIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUubGVuZ3RoKCksIGN1cnJlbnRCaW5kaW5nLmluZGV4T2YoIn0iKSk7DQotDQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5hZGQoYmluZGluZ0RldGFpbHNbMF0pOw0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgcGFydE9mQmluZGluZzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICBlbHNlIGlmKCEoY3VycmVudEJpbmRpbmcuY29udGFpbnMoInsiKSB8fCBjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJzLnB1dChiaW5kaW5nRGV0YWlsc1swXSwgYmluZGluZ0RldGFpbHNbMV0uc3Vic3RyaW5nKDEsIGJpbmRpbmdEZXRhaWxzWzFdLmxlbmd0aCgpLTIpKTsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWlucyhiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLmFkZChiaW5kaW5nRGV0YWlsc1swXSk7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyZW50QmluZGluZy5zdWJzdHJpbmcoY3VycmVudEJpbmRpbmcuaW5kZXhPZigieyIpICsgMSwgY3VycmVudEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gYmluZGluZ0RldGFpbHNbMF07DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotICAgICovDQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMDQ4ZGEuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotLyoqDQotICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBzdG9yZXMgdGhlIGRpZmZlcmVudCBwYXJ0cyBvZiBhbiBleHByZXNzaW9uIHN0cmluZyBhbmQNCi0gKiBhbGxvd3MgYW4gZWFzaWVyIHVzYWdlIG9mIHZhbHVlLWJpbmRpbmdzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRpZmZlcmVuY2UgYmV0d2VlbiBbIGFuZCBbJyAtIHRlc3Qgd2l0aCBtb3JlIGNvbnN0ZWxsYXRpb25zIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQ0KLXB1YmxpYyBjbGFzcyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotew0KLSAgICBwcml2YXRlIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYmFzZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7DQotICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdG9rZW47DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEVMSGVscGVyIEVMX0hFTFBFUiA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGUgZ2l2ZW4gcHJvcGVydHkgaXMgdXNlZCBhcyBuZXcgcHJvcGVydHkgb2YgdGhlIGV4cHJlc3Npb24uDQotICAgICAqIEV4YW1wbGVzIGZvciAnbmV3UHJvcGVydHknOjxici8+DQotICAgICAqICN7YmVhbn0gLT4gI3tiZWFuLm5ld1Byb3BlcnR5fQ0KLSAgICAgKiA8cC8+DQotICAgICAqICN7YmVhbi5wcm9wZXJ0eX0gLT4gI3tiZWFuLm5ld1Byb3BlcnR5fQ0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBUaGUgdGFyZ2V0IGluc3RhbmNlIG9mIHtAbGluayBWYWx1ZUJpbmRpbmdFeHByZXNzaW9ufQ0KLSAgICAgKiBAcGFyYW0gbmV3UHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIHVzZS4NCi0gICAgICogQHJldHVybiBUaGUgcmVzdWx0aW5nIHtAbGluayBWYWx1ZUJpbmRpbmdFeHByZXNzaW9ufSAod2l0aCB0aGUgbmV3IHByb3BlcnR5KQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlcGxhY2VPckFkZFByb3BlcnR5KFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuZXdQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmVwbGFjZSB0aGUgcHJvcGVydHkgaW4gdGhlIGV4cHJlc3Npb24gc3RyaW5nIHdpdGggdGhlIGdpdmVuIHByb3BlcnR5Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBUaGUgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB3aGVyZSB3ZSB3YW50IHRvIHJlcGxhY2UgdGhlIHByb3BlcnR5DQotICAgICAqIEBwYXJhbSBuZXdQcm9wZXJ0eSBUaGUgbmV3IHByb3BlcnR5IHdoaWNoIHNob3VsZCByZXBsYWNlIHRoZSBleGlzdGluZyBvbmUuDQotICAgICAqIEByZXR1cm4gVGhlIHJlc3VsdGluZyB7QGxpbmsgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbn0gKHdpdGggdGhlIG5ldyBwcm9wZXJ0eSkNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXBsYWNlUHJvcGVydHkoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuZXdQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgLy9UT0RPIGFkanVzdG1lbnRzIGZvciBpc0R5bmFtaWNCYXNlQW5kUHJvcGVydHkNCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKS5lbmRzV2l0aCgiJ10iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEFkZHMgdGhlIHByb3BlcnR5IHRvIHRoZSBnaXZlbiB7QGxpbmsgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbn0uDQotICAgICAqDQotICAgICAqIEBwYXJhbSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uIFRoZSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uIHdoZXJlIHdlIHdhbnQgdG8gYWRkIHRoZSBwcm9wZXJ0eQ0KLSAgICAgKiBAcGFyYW0gbmV3UHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGFkZC4NCi0gICAgICogQHJldHVybiBUaGUgcmVzdWx0aW5nIHtAbGluayBWYWx1ZUJpbmRpbmdFeHByZXNzaW9ufSAod2l0aCB0aGUgbmV3IHByb3BlcnR5KQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGFkZFByb3BlcnR5KFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgU3RyaW5nIG5ld1Byb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgc291cmNlRXhwcmVzc2lvbiA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHNvdXJjZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIHNvdXJjZUV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKTsNCi0NCi0gICAgICAgIC8vVE9ETyBhZGp1c3RtZW50cyBmb3IgaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5DQotICAgICAgICBpZihuZXdQcm9wZXJ0eS5zdGFydHNXaXRoKCJbJyIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihyZXN1bHQgKyBuZXdQcm9wZXJ0eSArICJ9Iik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHJlc3VsdCArICIuIiArIG5ld1Byb3BlcnR5ICsgIn0iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYmFzZWQgb24gYSB3ZWxsIGZvcm1lZCBFTCBleHByZXNzaW9uLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgRUwgZXhwcmVzc2lvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24oU3RyaW5nIGV4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIGlmKCFFTF9IRUxQRVIuaXNFTFRlcm1XZWxsRm9ybWVkKGV4cHJlc3Npb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXhwcmVzc2lvbiArICIgaXMgbm8gdmFsaWQgZWwtZXhwcmVzc2lvbiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYm9vbGVhbiBpc0R5bmFtaWNCYXNlQW5kUHJvcGVydHkgPSBleHByZXNzaW9uLmxhc3RJbmRleE9mKCInXSIpID09IC0xOw0KLSAgICAgICAgaW50IGluZGV4MSA9IGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSA/IGV4cHJlc3Npb24ubGFzdEluZGV4T2YoIl0iKSA6IGV4cHJlc3Npb24ubGFzdEluZGV4T2YoIiddIik7DQotICAgICAgICBpbnQgaW5kZXgyID0gZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiLiIpOw0KLQ0KLSAgICAgICAgaWYoaW5kZXgxID4gaW5kZXgyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnN1YnN0cmluZygwLCBpbmRleDEpOw0KLQ0KLSAgICAgICAgICAgIGludCBpbmRleDMgPSBmaW5kSW5kZXhPZlN0YXJ0aW5nQnJhY2tldChleHByZXNzaW9uKTsNCi0gICAgICAgICAgICBpZihpc0R5bmFtaWNCYXNlQW5kUHJvcGVydHkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoaW5kZXgzICsgMSwgaW5kZXgxKTsNCi0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKGluZGV4MyArIDIsIGluZGV4MSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHRoaXMuYmFzZSA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKGV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGluZGV4MykgKyAifSIpOw0KLSAgICAgICAgICAgIHRoaXMudG9rZW4gPSBpc0R5bmFtaWNCYXNlQW5kUHJvcGVydHkgPyAiWyIgOiAiWyciOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiggaW5kZXgyID4gaW5kZXgxKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZyhpbmRleDIgKyAxLCBleHByZXNzaW9uLmxlbmd0aCgpIC0gMSApOw0KLSAgICAgICAgICAgIHRoaXMuYmFzZSA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKGV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGluZGV4MikgKyAifSIpOw0KLSAgICAgICAgICAgIHRoaXMudG9rZW4gPSAiLiI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKDIsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKTsNCi0gICAgICAgICAgICB0aGlzLnByZWZpeCA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIDEpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGUgKGxhc3QpIHByb3BlcnR5IG9mIHRoZSBleHByZXNzaW9uLg0KLSAgICAgKiBAcmV0dXJuIFRoZSAobGFzdCkgcHJvcGVydHkgb2YgdGhlIGV4cHJlc3Npb24uDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUudHJpbSgpOw0KLSAgICAgICAgDQotICAgICAgICBpZigiWyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMudmFsdWUuc3RhcnRzV2l0aCgiJyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUuc3Vic3RyaW5nKDEsIHRoaXMudmFsdWUubGVuZ3RoKCkgLSAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy9yZXR1cm4gdGhpcy5iYXNlLnZhbHVlICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUuc3Vic3RyaW5nKDAsIHRoaXMudmFsdWUubGVuZ3RoKCkpICsgIiddIjsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBnZXRCYXNlRXhwcmVzc2lvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBiYXNlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZWNyZWF0ZXMgdGhlIGV4cHJlc3Npb24gc3RyaW5nIGZyb20gd2hpY2ggdGhpcyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uIHdhcyBidWlsZC4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlDQotICAgICAqIHNhbWUgZm9ybWF0IGlzIGtlcCwgZm9yIGV4YW1wbGUgeyNiZWFuWydwcm9wZXJ0eSddfSBjb3VsZCBiZWNvbWUgeyNiZWFuLnByb3BlcnR5fQ0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuICBUaGUgZXhwcmVzc2lvbiBzdHJpbmcgZXF1aXZhbGVudCBvZiB0aGUgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwcmVzc2lvblN0cmluZygpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMuYmFzZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBiYXNlRXhwcmVzc2lvbiA9IHRoaXMuYmFzZS5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotDQotICAgICAgICAgICAgaWYoIlsnIi5lcXVhbHModGhpcy50b2tlbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGJhc2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSkgKyB0aGlzLnRva2VuICsgdGhpcy52YWx1ZSArICInXX0iOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKCJbIi5lcXVhbHModGhpcy50b2tlbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGJhc2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSkgKyB0aGlzLnRva2VuICsgdGhpcy52YWx1ZSArICJdfSI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBiYXNlRXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgYmFzZUV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKSArIHRoaXMudG9rZW4gKyB0aGlzLnZhbHVlICsgIn0iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLnByZWZpeCArICJ7IiArIHRoaXMudmFsdWUgKyAifSI7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlLmdldFByZWZpeCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBwcmVmaXg7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMuYmFzZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuYmFzZS5zZXRQcmVmaXgocHJlZml4KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXhwcmVzc2lvblN0cmluZygpLmhhc2hDb2RlKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiAmJiBnZXRFeHByZXNzaW9uU3RyaW5nKCkNCi0gICAgICAgICAgICAuZXF1YWxzKCgoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbikgdGFyZ2V0KS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgaW50IGZpbmRJbmRleE9mU3RhcnRpbmdCcmFja2V0KFN0cmluZyBleHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBpbnQgY2xvc2VDb3VudCA9IDA7DQotICAgICAgICBmb3IoaW50IGkgPSBleHByZXNzaW9uLmxlbmd0aCgpIC0gMTsgaSA+IDA7IGktLSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihleHByZXNzaW9uLmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjbG9zZUNvdW50LS07DQotICAgICAgICAgICAgICAgIGlmKGNsb3NlQ291bnQgPCAwKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKGV4cHJlc3Npb24uY2hhckF0KGkpID09ICddJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNsb3NlQ291bnQrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNTRhM2IuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0Fic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQotDQotLyoqDQotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBhIE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnkgd2hlcmUgdGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgc3RvcmFnZQ0KLSAqIG9mIHRoZSBsaXN0IG9mIG5hbWVNYXBwZXJzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxUPiBpbXBsZW1lbnRzIE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8TmFtZU1hcHBlcjxUPj4NCi17DQotICAgIHByaXZhdGUgTGlzdDxDbGFzcz4gZGVuaWVkTmFtZU1hcHBlckxpc3QgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWdpc3RlcihOYW1lTWFwcGVyPFQ+IG5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIGlmKCFkZW5pZWROYW1lTWFwcGVyTGlzdC5jb250YWlucyhuYW1lTWFwcGVyLmdldENsYXNzKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGdldE5hbWVNYXBwZXJMaXN0KCkuYWRkKG5hbWVNYXBwZXIpOw0KLSAgICAgICAgICAgIExpc3Q8TmFtZU1hcHBlcjxUPj4gbmFtZU1hcHBlckxpc3QgPSBnZXROYW1lTWFwcGVyTGlzdCgpOw0KLQ0KLSAgICAgICAgICAgIGlmKG5hbWVNYXBwZXJMaXN0IGluc3RhbmNlb2YgQ29weU9uV3JpdGVBcnJheUxpc3QpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBMaXN0PE5hbWVNYXBwZXI8VD4+IHNvcnRhYmxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxUPj4obmFtZU1hcHBlckxpc3QpOw0KLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHNvcnRhYmxlTGlzdCwgZ2V0Q29tcGFyYXRvcigpKTsNCi0gICAgICAgICAgICAgICAgbmFtZU1hcHBlckxpc3QuY2xlYXIoKTsNCi0gICAgICAgICAgICAgICAgbmFtZU1hcHBlckxpc3QuYWRkQWxsKHNvcnRhYmxlTGlzdCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobmFtZU1hcHBlckxpc3QsIGdldENvbXBhcmF0b3IoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBDb21wYXJhdG9yPE5hbWVNYXBwZXI8VD4+IGdldENvbXBhcmF0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8TmFtZU1hcHBlcjxUPj4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGVyZWdpc3RlcihDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gY2xhc3NUb0RlcmVnaXN0ZXIpDQotICAgIHsNCi0gICAgICAgIEl0ZXJhdG9yPE5hbWVNYXBwZXI8VD4+IG5hbWVNYXBwZXJJdGVyYXRvciA9IGdldE5hbWVNYXBwZXJMaXN0KCkuaXRlcmF0b3IoKTsNCi0gICAgICAgIHdoaWxlKG5hbWVNYXBwZXJJdGVyYXRvci5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobmFtZU1hcHBlckl0ZXJhdG9yLm5leHQoKS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NUb0RlcmVnaXN0ZXIuZ2V0TmFtZSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG5hbWVNYXBwZXJJdGVyYXRvci5yZW1vdmUoKTsNCi0gICAgICAgICAgICAgICAgLy9kb24ndCBicmVhayAtIGUuZy4gdG8gZGVyZWdpc3RlciBhbGwgd3JhcHBlcnMuLi4NCi0gICAgICAgICAgICAgICAgLy9icmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZGVueShDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gY2xhc3NUb0RlbnkpDQotICAgIHsNCi0gICAgICAgIGRlcmVnaXN0ZXIoY2xhc3NUb0RlbnkpOw0KLQ0KLSAgICAgICAgc3luY2hyb25pemVkIChnZXRDbGFzcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGRlbmllZE5hbWVNYXBwZXJMaXN0LmFkZChjbGFzc1RvRGVueSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IExpc3Q8TmFtZU1hcHBlcjxUPj4gZ2V0TmFtZU1hcHBlckxpc3QoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9DbGFzc01hcHBpbmdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhN2Q1YzUuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBBIHN0cnVjdHVyZSBvZiBhIGZhY3RvcnkgdGhhdCBjcmVhdGVzIGNsYXNzZXMgb2YgdGhlIHRhcmdldCB0eXBlIFIgZm9yIGEgY2VydGFpbiBzb3VyY2UgY2xhc3Mgb2YgdHlwZSBQLiBNb3N0DQotICogZmFjdG9yaWVzIHVzZXMgdGhlIE5hbWVNYXBwZXIgZmFjaWxpdHkgdG8gY29uZmlndXJlIHRoZSB0eXBlIG9mIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQuDQotICoNCi0gKiBAcGFyYW0gPFA+IGdlbmVyaWMgdHlwZSBmb3IgdGhlIHNvdXJjZSB0eXBlDQotICogQHBhcmFtIDxSPiBnZW5lcmljIHR5cGUgZm9yIHRoZSB0YXJnZXQgdHlwZS4NCi0NCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIENsYXNzTWFwcGluZ0ZhY3Rvcnk8UCwgUj4NCi17DQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHRhcmdldCB0eXBlIGJhc2VkIG9uIHRoZSBzb3VyY2UgdHlwZS4gIEFuIGV4YW1wbGUgaXMgdGhlDQotICAgICAqIERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSB0aGF0IGNyZWF0ZXMgYSBtZXRhRGF0YVRyYW5zZm9ybWVyIGZvciBhIGNlcnRhaW4gVmFsaWRhdGlvblN0cmF0ZWd5Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gc291cmNlIHNvdXJjZSB0eXBlIHRvIGJlIHVzZWQuDQotICAgICAqIEByZXR1cm4gdGFyZ2V0IG9iamVjdC4NCi0gICAgICovDQotICAgIFIgY3JlYXRlKFAgc291cmNlKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0RlZmF1bHRGYWN0b3J5RmluZGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRGVmYXVsdEZhY3RvcnlGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJkMjA5Ny4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRGVmYXVsdEZhY3RvcnlGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRGVmYXVsdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8vZHluYW1pYyBhcHByb2FjaCB0byBjcmVhdGUgdGhlIGZhY3RvcmllcyBkdXJpbmcgdGhlIGZpcnN0IHJlcXVlc3QsIHdoZW4gYSBmYWNlcy1jb250ZXh0IGlzIGF2YWlsYWJsZQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWN0b3J5RmluZGVyIGltcGxlbWVudHMgRmFjdG9yeUZpbmRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgcHJvdGVjdGVkIE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4gZmFjdG9yeU1hcCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4oKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgRmFjdG9yeUZpbmRlciBmYWN0b3J5RmluZGVyID0gbmV3IERlZmF1bHRGYWN0b3J5RmluZGVyKCk7DQotDQotICAgIHByb3RlY3RlZCBEZWZhdWx0RmFjdG9yeUZpbmRlcigpDQotICAgIHsNCi0gICAgICAgIGxvZ2dlci5maW5lKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY3RvcnlGaW5kZXIgZ2V0SW5zdGFuY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjdG9yeUZpbmRlcjsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgZmluYWwgPFQ+IFQgZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUsIENsYXNzPFQ+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZighKGZhY3RvcnlNYXAuY29udGFpbnNLZXkoZmFjdG9yeU5hbWUpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0RmFjdG9yeShmYWN0b3J5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKFQpZmFjdG9yeU1hcC5nZXQoZmFjdG9yeU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIHN3aXRjaCAoZmFjdG9yeU5hbWUpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2FzZSBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZU1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZU1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZVJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgRUxfSEVMUEVSX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVFTEhlbHBlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBGQUNFU19NRVNTQUdFX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVGYWNlc01lc3NhZ2VGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIFNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlU3RvcmFnZU1hbmFnZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZVZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICANCi0gICAgICAgICAgICBkZWZhdWx0OiAvL3JlcXVpcmVkIGJ5IGNoZWNrc3R5bGUNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgcG9zc2libGUgdG8gY3JlYXRlIGZhY3RvcnkgIiArIGZhY3RvcnlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZhY3RvcnlNYXAucHV0KGZhY3RvcnlOYW1lLCBmYWN0b3J5KTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzLmFkZChnZXRDb3JlQ29uZmlnKCkuY3VzdG9tQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lKCkpOw0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzLmFkZChnZXRDb3JlQ29uZmlnKCkuY3VzdG9tVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZSgpKTsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSkpOw0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJhZGQgZ2xvYmFsIHByb3BlcnR5IGV4dGVuc2lvbiBwb2ludCIpDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlTWVzc2FnZVJlc29sdmVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKGdldENvcmVDb25maWcoKS5jdXN0b21NZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lKCkpOw0KLSAgICAgICAgbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZKSk7DQotICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoZ2V0Q29yZUNvbmZpZygpLmN1c3RvbU1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lKCkpOw0KLSAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZKSk7DQotICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVGYWNlc01lc3NhZ2VGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoZ2V0Q29yZUNvbmZpZygpLmN1c3RvbUZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWUoKSk7DQotICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkpKTsNCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkubmFtZSgpKTsNCi0gICAgICAgIGlmKHRhcmdldCAhPSBudWxsICYmIHRhcmdldCBpbnN0YW5jZW9mIFN0cmluZykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoKFN0cmluZyl0YXJnZXQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlRUxIZWxwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0RUxIZWxwZXJGYWN0b3J5KCk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKGdldENvcmVDb25maWcoKS5jdXN0b21WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZSgpKTsNCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZKSk7DQotICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVTdG9yYWdlTWFuYWdlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gc3RvcmFnZU1hbmFnZXJGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgc3RvcmFnZU1hbmFnZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKGdldENvcmVDb25maWcoKS5jdXN0b21TdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWUoKSk7DQotICAgICAgICBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHN0b3JhZ2VNYW5hZ2VyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IHN0b3JhZ2VNYW5hZ2VyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKGdldENvcmVDb25maWcoKS5jdXN0b21WYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZSgpKTsNCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEV4dFZhbENvcmVDb25maWd1cmF0aW9uIGdldENvcmVDb25maWcoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb24uZ2V0KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNGM4ZDEuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIFN0cnVjdHVyZSBmb3IgYSBmYWN0b3J5IHRoYXQgY3JlYXRlcyBGYWNlc01lc3NhZ2VzIHRoYXQgYWxzbyBpbXBsZW1lbnQgdGhlIExhYmVsZWRNZXNzYWdlIGludGVyZmFjZS4gVGhlIExhYmVsTWVzc2FnZQ0KLSAqIGludGVyZmFjZSBhZGRzIGxhYmVsIGNhcGFiaWxpdGllcyB0byB0aGUgRmFjZXNNZXNzYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBGYWNlc01lc3NhZ2VGYWN0b3J5DQotew0KLSAgICAvKioNCi0gICAgICogQ29udmVydHMgdGhlIGZhY2VzTWVzc2FnZSBzbyB0aGF0IGlzIGltcGxlbWVudHMgdGhlIExhYmVsTWVzc2FnZSBpbnRlcmZhY2UuIElmIHRoZSBwYXJhbWV0ZXIgaW1wbGVtZW50cyBhbHJlYWR5DQotICAgICAqIHRoZSBjb3JyZWN0IGludGVyZmFjZSwgaXQgaXMgcmV0dXJuZWQgd2l0aG91dCBjaGFuZ2UuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBmYWNlc01lc3NhZ2UgVGhlIGZhY2VzTWVzc2FnZSB0byBjb252ZXJ0DQotICAgICAqIEByZXR1cm4gQSBGYWNlc01lc3NhZ2UgaW5zdGFuY2UgdGhhdCBhbHNvIGltcGxlbWVudHMgTGFiZWxNZXNzYWdlLg0KLSAgICAgKi8NCi0gICAgRmFjZXNNZXNzYWdlIGNvbnZlcnQoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSk7DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYSBMYWJlbE1lc3NhZ2UgaW1wbGVtZW50aW5nIEZhY2VzTWVzc2FnZSB1c2luZyB0aGUgcGFyYW1ldGVycyBhcyBjb250ZW50Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkgU2V2ZXJpdHkgZm9yIHRoZSBGYWNlc01lc3NhZ2UuDQotICAgICAqIEBwYXJhbSBzdW1tYXJ5IHN1bW1hcnkgdGV4dCBmb3IgdGhlIG1lc3NhZ2UuDQotICAgICAqIEBwYXJhbSBkZXRhaWwgZGV0YWlsIHRlc3QgZm9yIHRoZSBtZXNzYWdlLg0KLSAgICAgKiBAcmV0dXJuIEEgRmFjZXNNZXNzYWdlIGluc3RhbmNlIHRoYXQgYWxzbyBpbXBsZW1lbnRzIExhYmVsTWVzc2FnZS4NCi0gICAgICovDQotICAgIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCk7DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDQzZjc1Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogU3RydWN0dXJlIGZvciB0aGUgb2JqZWN0IHRoYXQgaXMgYWJsZSB0byBsb2NhdGUgdGhlIGRpZmZlcmVudCBmYWN0b3JpZXMgd2l0aGluIHRoZSBFeHRWYWwgRnJhbWV3b3JrLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBGYWN0b3J5RmluZGVyCi17Ci0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSBkZWZhdWx0IG9yIGNvbmZpZ3VyZWQgZmFjdG9yeS4gSXQgaXMgaW5zdGFudGlhdGVkIHRoZSBmaXJzdCB0aW1lIGFuZCByZXRyaWV2ZWQgZnJvbSBhIGNhY2hlIGluIHRoZQotICAgICAqIHN1YnNlcXVlbnQgcmVxdWVzdHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmFjdG9yeU5hbWUgVGhlIG5hbWUgb2YgdGhlIGZhY3Rvcnkgd2Ugd2FudCB0byByZXRyaWV2ZS4KLSAgICAgKiBAcGFyYW0gdGFyZ2V0Q2xhc3MgVGhlIGNsYXNzIHR5cGUgdGhlIGZhY3RvcnkgbmVlZHMgdG8gYmUgY2FzdGVkIHRvLgotICAgICAqIEBwYXJhbSA8VD4gZ2VuZXJpYyB0eXBlIHBhcmFtZXRlcgotICAgICAqIEByZXR1cm4gRmFjdG9yeSBpbnN0YW5jZSwgY2FuIG5ldmVyIGJlIG51bGwuCi0gICAgICovCi0gICAgPFQ+IFQgZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUsIENsYXNzPFQ+IHRhcmdldENsYXNzKTsKLX0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQzMmY3MC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogTmFtZXMgb2YgZmFjdG9yaWVzIGtub3duIGJ5IHRoZQotICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeUZpbmRlcn0KLSAqIAotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkKLXB1YmxpYyBlbnVtIEZhY3RvcnlOYW1lcwotewotICAgIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksCi0KLSAgICBWQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWSwKLSAgICBWQUxJREFUSU9OX1BBUkFNRVRFUl9GQUNUT1JZLAotCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLAotICAgIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwKLSAgICBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwKLQotICAgIEZBQ0VTX01FU1NBR0VfRkFDVE9SWSwKLQotICAgIFJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksCi0gICAgRUxfSEVMUEVSX0ZBQ1RPUlksCi0KLSAgICBTVE9SQUdFX01BTkFHRVJfRkFDVE9SWQotfQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L05hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9OYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YzM0NGYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L05hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBmYWN0b3JpZXMgd2hpY2ggYXJlIHVzaW5nIHtAbGluayBOYW1lTWFwcGVyfXMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZU1hcHBlckF3YXJlRmFjdG9yeTxUIGV4dGVuZHMgTmFtZU1hcHBlcj4NCi17DQotICAgIC8qKg0KLSAgICAgKiBSZWdpc3RlcnMgYSBuZXcge0BsaW5rIE5hbWVNYXBwZXJ9IHdoaWNoIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgbWFwcGluZyBwcm9jZXNzLg0KLSAgICAgKiBJdCB3aWxsIGJlIHVzZWQgaWYgaXQgaXNuJ3QgZGVuaWVkLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gY2xhc3NUb0FkZCB7QGxpbmsgTmFtZU1hcHBlcn0gdG8gYWRkDQotICAgICAqLw0KLSAgICB2b2lkIHJlZ2lzdGVyKFQgY2xhc3NUb0FkZCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBSZW1vdmVzIGFsbCB7QGxpbmsgTmFtZU1hcHBlcn1zIG9mIHRoZSBnaXZlbiB0eXBlLg0KLSAgICAgKiBAcGFyYW0gY2xhc3NUb0RlcmVnaXN0ZXIgbmFtZU1hcHBlciB0byByZW1vdmUuDQotICAgICAqLw0KLSAgICB2b2lkIGRlcmVnaXN0ZXIoQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IGNsYXNzVG9EZXJlZ2lzdGVyKTsNCi0NCi0gICAgLyoqDQotICAgICAqIERlcmVnaXN0ZXJzIGV4aXN0aW5nIHtAbGluayBOYW1lTWFwcGVyfXMgb2YgdGhlIGdpdmVuIHR5cGUgYW5kIGRlbnkgdGhlIHR5cGUgZm9yIHtAbGluayBOYW1lTWFwcGVyfSB3aGljaA0KLSAgICAgKiBtaWdodCBiZSBhZGRlZCBsYXRlciBvbi4NCi0gICAgICogQHBhcmFtIGNsYXNzVG9EZW55IHtAbGluayBOYW1lTWFwcGVyfSB0byBkZW55DQotICAgICAqLw0KLSAgICB2b2lkIGRlbnkoQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IGNsYXNzVG9EZW55KTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODE2ZDI5Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0Fic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRTZWNyZXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3g7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVMaXN0Ym94Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTWVudTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZVJhZGlvOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUNoZWNrYm94Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUxpc3Rib3g7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TWVudTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dGFyZWE7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQmFzaWMgaW1wbGVtZW50YXRpb24gb2YgYSB7QGxpbmsgQ29tcG9uZW50SW5pdGlhbGl6ZXJ9IHdoaWNoIGFsbG93cyBhbiBlYXNpZXIgaGFuZGxpbmcgb2YgcmVxdWlyZWQgdmFsaWRhdGlvbnMgYW5kDQotICogcHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBzdGFuZGFyZCBjb21wb25lbnRzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyDQotew0KLSAgICAvKioNCi0gICAgICogSWYgdGhlIGNvbXBvbmVudCBpcyBvbmUgb2YgdGhlIHN0YW5kYXJkIGlucHV0IGNvbXBvbmVudHMsIHRoZSBtYXggbGVuZ3RoIGF0dHJpYnV0ZSBpcyBjb25maWd1cmVkIGFuZCB0aGUNCi0gICAgICogcmVxdWlyZWQgYXR0cmlidXRlIGlzIGNvbmZpZ3VyZWQgKGlmIGVtcHR5IGZpZWxkIHZhbGlkYXRpb24gYW5kIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIGlzIGFjdGl2YXRlZCkNCi0gICAgICoNCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBUaGUgSlNGIENvbnRleHQNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IFRoZSBjb21wb25lbnQgd2hpY2ggc2hvdWxkIGJlIGluaXRpYWxpc2VkDQotICAgICAqIEBwYXJhbSBtZXRhRGF0YSBtYXAgd2hpY2ggY29udGFpbnMgdGhlIHRyYW5zZm9ybWVkIG1ldGEtZGF0YQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICB7DQotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWxpZGF0ZUVtcHR5RmllbGRzKCkgJiYgaXNSZXF1aXJlZEluaXRpYWxpemF0aW9uQWN0aXZlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb25maWd1cmVSZXF1aXJlZEF0dHJpYnV0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGNvbmZpZ3VyZU1heExlbmd0aEF0dHJpYnV0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFVzZXMgdGhlIGNvbmZpZyBpbnRyb2R1Y2VkIGJ5IEpTRiAyIGZvciBzcGVjaWZ5aW5nIGlmDQotICAgICAqIGZpZWxkcyB3aXRob3V0IGNvbnRlbnQgc2hvdWxkIGJlIGF2YWlsYWJsZSBmb3IgcmVxdWlyZWQgdmFsaWRhdGlvbi4NCi0gICAgICoNCi0gICAgICogQHJldHVybiB0cnVlIGlmIGZpZWxkcyB3aXRoIGVtcHR5IHZhbHVlcyBzaG91bGQgYmUgdmFsaWRhdGVkLCBmYWxzZSBvdGhlcndpc2UuDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUVtcHR5RmllbGRzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLnZhbGlkYXRlRW1wdHlGaWVsZHMoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVXNlcyB0aGUgY29uZmlnIGludHJvZHVjZWQgYnkgcHJldi4gRXh0VmFsIHZlcnNpb25zIGZvciBzcGVjaWZ5aW5nIGlmDQotICAgICAqIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIHNob3VsZCBiZSB1c2VkDQotICAgICAqIChpdCdzIHVzZWZ1bCBlLmcuIGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9ucyBwcm92aWRlZCBieSBsaWJzIGxpa2UgdHJpbmlkYWQpLg0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgRXh0VmFsIHNob3VsZCB0cmFuc2ZlciBtZXRhLWRhdGEgZm9yIHJlcXVpcmVkIGZpZWxkcyB0byB0aGUgY29tcG9uZW50DQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25BY3RpdmUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuaXNSZXF1aXJlZEluaXRpYWxpemF0aW9uQWN0aXZlKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBoYXMgdG8gaW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50IGJhc2VkIG9uIHRoZSBnaXZlbiBtZXRhLWRhdGEgbWFwLg0KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCBpZiBhbGwgcHJlLWNvbmRpdGlvbnMgYXJlIGZ1bGZpbGxlZC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBUaGUgSlNGIENvbnRleHQNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IFRoZSBVSUNvbXBvbmVudCB3aGljaCBzaG91bGQgYmUgY29uZmlndXJlZC4NCi0gICAgICogQHBhcmFtIG1ldGFEYXRhIG1hcCB3aGljaCBjb250YWlucyB0aGUgdHJhbnNmb3JtZWQgbWV0YS1kYXRhDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjb25maWd1cmVSZXF1aXJlZEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSk7DQotDQotICAgIC8qKg0KLSAgICAgKiBBY3RpdmF0ZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBzcGVjaWFsIGNvbXBvbmVudHMgKC0+IG90aGVyIGNvbXBvbmVudHMgd2lsbCBiZSBpZ25vcmVkKS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IFRoZSBVSUNvbXBvbmVudCB3aGljaCBzaG91bGQgYmUgY29uZmlndXJlZC4NCi0gICAgICogQHJldHVybiBTaG91bGQgdGhlIGNvbXBvbmVudCBiZSBpbml0aWFsaXplZC4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwNCi0gICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCB8fA0KLSAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveCB8fA0KLSAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwNCi0gICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVNZW51IHx8DQotICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lUmFkaW8gfHwNCi0gICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwNCi0gICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TGlzdGJveCB8fA0KLSAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlNZW51IHx8DQotICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogaWYgdGhlcmUgaXMgbm8gc3BlY2lhbCBhdHRyaWJ1dGUgYXQgdGhlIGNvbXBvbmVudCB3aGljaCBzaG91bGQgb3ZlcnJ1bGUNCi0gICAgICogdGhlIGFubm90YXRlZCBwcm9wZXJ0eSByZXR1cm4gdHJ1ZSENCi0gICAgICoNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IGNvbXBvbmVudCB3aGljaCBpbXBsZW1lbnRzIHRoZSBFZGl0YWJsZVZhbHVlSG9sZGVyIGludGVyZmFjZQ0KLSAgICAgKiBAcmV0dXJuIGZhbHNlIHRvIG92ZXJydWxlIHRoZSBhbm5vdGF0ZWQgcHJvcGVydHkgZS5nLiBpZiBjb21wb25lbnQgaXMgcmVhZG9ubHkNCi0gICAgICovDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJyZWZhY3RvciIpDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvblN1cHBvcnRlZChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNSZWFkb25seSIpKSk7DQotICAgICAgICBib29sZWFuIGlzRGlzYWJsZWQgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc0Rpc2FibGVkIikpKTsNCi0NCi0gICAgICAgIHJldHVybiAhKGlzUmVhZE9ubHkgfHwgaXNEaXNhYmxlZCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSB0cmFuc2Zvcm1lZCBtZXRhLWRhdGEgc3RvcmVkIHZpYSB0aGUgKHtAbGluayBDb21tb25NZXRhRGF0YUtleXMjTUFYX0xFTkdUSH0NCi0gICAgICoga2V5IGZvciBpbml0aWFsaXppbmcgZS5nLiB0aGUgbWF4TGVuZ3RoIGF0dHJpYnV0ZSBvZiB0aGUgY3VycmVudCBjb21wb25lbnQNCi0gICAgICogKG9mIHR5cGUge0BsaW5rIEh0bWxJbnB1dFRleHR9IG9yIHtAbGluayBIdG1sSW5wdXRTZWNyZXR9Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IFRoZSBKU0YgQ29udGV4dA0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgIFRoZSBjb21wb25lbnQgdG8gY29uZmlndXJlLg0KLSAgICAgKiBAcGFyYW0gbWV0YURhdGEgbWFwIHdoaWNoIGNvbnRhaW5zIHRoZSB0cmFuc2Zvcm1lZCBtZXRhLWRhdGENCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZU1heExlbmd0aEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICB7DQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgT2JqZWN0IG1heExlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCk7DQotDQotICAgICAgICAgICAgaWYoIShtYXhMZW5ndGggaW5zdGFuY2VvZiBJbnRlZ2VyKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgSHRtbElucHV0VGV4dCBodG1sSW5wdXRUZXh0ID0gKEh0bWxJbnB1dFRleHQpdWlDb21wb25lbnQ7DQotICAgICAgICAgICAgICAgIGh0bWxJbnB1dFRleHQuc2V0TWF4bGVuZ3RoKChJbnRlZ2VyKW1heExlbmd0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRTZWNyZXQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBIdG1sSW5wdXRTZWNyZXQgaHRtbElucHV0U2VjcmV0ID0gKEh0bWxJbnB1dFNlY3JldCl1aUNvbXBvbmVudDsNCi0gICAgICAgICAgICAgICAgaHRtbElucHV0U2VjcmV0LnNldE1heGxlbmd0aCgoSW50ZWdlciltYXhMZW5ndGgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9Db21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQyZTBkYy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9Db21wb25lbnRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlclN1cHBvcnQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQWxsb3dzIHRvIGluaXRpYWxpemUgY29tcG9uZW50cyBiZWZvcmVFbmNvZGVCZWdpbi48YnIvPg0KLSAqIGUuZy46IHlvdSBjYW4gYWRkIGluZm9ybWF0aW9uIGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIG1lY2hhbmlzbXMsLi4uDQotICogVGhlIE1ldGFEYXRhVHJhbnNmb3JtZXJzIGFyZSB1c2VkIHRvIGNvbnZlcnQgTWV0YURhdGFFbnRyeSB0byB0aGUgbWFwIGJhc2VkIGluZm9ybWF0aW9uIHN1cHBsaWVkIGhlcmUuDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlclN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvbmVudEluaXRpYWxpemVyDQotew0KLSAgICAvKioNCi0gICAgICogSW5pdGlhbGl6ZSBjb21wb25lbnRzIHdpdGggaW5mb3JtYXRpb24gZnJvbSB0aGUgbWV0YS1kYXRhLg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IFRoZSBKU0YgQ29udGV4dA0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgVGhlIGNvbXBvbmVudCB0aGF0IHNob3VsZCBiZSBpbml0aWFsaXNlZA0KLSAgICAgKiBAcGFyYW0gbWV0YURhdGEgSW5mb3JtYXRpb24gZnJvbSB0aGUgTWV0YURhdGFFbnRyeSBpbiB0aGUgYWJzdHJhY3QgZm9ybS4NCi0gICAgICovDQotICAgIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOWNmMDYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQWxsb3dzIHRvIHByb3ZpZGUgc3RhdGljIGNvbmZpZ3VyYXRpb25zIChtYXBwaW5ncykuDQotICogVGhlIGNvbmZpZyBmb3JtYXQgZGVwZW5kcyBvbiB0aGUgaW1wbGVtZW50YXRpb24uDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBTdGF0aWNDb25maWd1cmF0aW9uPFQsIFI+DQotew0KLSAgICAvKioNCi0gICAgICogU3BlY2lmeSB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGZvdW5kLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcGF0aCBmaWxlIGxvY2F0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uLg0KLSAgICAgKi8NCi0gICAgdm9pZCBzZXRTb3VyY2VPZk1hcHBpbmcoU3RyaW5nIHBhdGgpOw0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyBhbGwgY29uZmlnIGVudHJpZXMgZm91bmQgaW4gdGhlIHNwZWNpZmllZCBjb25maWcuDQotICAgICAqDQotICAgICAqIEByZXR1cm4gTGlzdCBvZiBjb25maWd1cmF0aW9uIGVudHJpZXMuDQotICAgICAqLw0KLSAgICBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxULCBSPj4gZ2V0TWFwcGluZygpOw0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkODlkMzguLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIENvbmZpZ3VyYXRpb24gZW50cnkgZm9yIGVhc2llciBoYW5kbGluZyBvZiBrZXkvdmFsdWUgcGFpcnMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgY2xhc3MgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFQsIFI+DQotew0KLSAgICBwcml2YXRlIFQgc291cmNlOw0KLSAgICBwcml2YXRlIFIgdGFyZ2V0Ow0KLQ0KLSAgICBwdWJsaWMgVCBnZXRTb3VyY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc291cmNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZShUIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFIgZ2V0VGFyZ2V0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoUiB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E0NTRjOS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogTGlzdCBvZiBhbGwgYXJ0aWZhY3RzIHdoaWNoIGNhbiBiZSBjb25maWd1cmVkIHZpYSBzdGF0aWMgbWFwcGluZ3MgKHtAbGluayBTdGF0aWNDb25maWd1cmF0aW9ufSkuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkKLXB1YmxpYyBlbnVtIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcwotewotICAgIE1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfQ09ORklHLAotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0NPTkZJRywKLSAgICBTVE9SQUdFX1RZUEVfVE9fU1RPUkFHRV9NQU5BR0VSX0NPTkZJRywKLQotICAgIFNLSVBfVkFMSURBVElPTl9TVVBQT1JUX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1BBUkFNRVRFUl9DT05GSUcKLX0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24uamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUyYTZjNi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgU3RhdGljQ29uZmlndXJhdGlvbn0gaW50ZXJmYWNlIGZvciBpbi1tZW1vcnkgY29uZmlncy4KLSAqIEl0J3MgYW4gaW1wbGVtZW50YXRpb24gd2hpY2ggaGVscHMgdG8gY3JlYXRlIGN1c3RvbSBjb25maWcgYXBwcm9hY2hlcyBlYXNpbHkuCi0gKiAKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LlJFVVNFfSkKLXB1YmxpYyBjbGFzcyBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPgotewotICAgIHByaXZhdGUgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5ncwotICAgICAgICA9IG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4oKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gZ2V0TWFwcGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gbWFwcGluZ3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgc291cmNlLCBTdHJpbmcgdGFyZ2V0KQotICAgIHsKLSAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA9IG5ldyBTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIGVudHJ5LnNldFNvdXJjZShzb3VyY2UpOwotICAgICAgICBlbnRyeS5zZXRUYXJnZXQodGFyZ2V0KTsKLSAgICAgICAgdGhpcy5tYXBwaW5ncy5hZGQoZW50cnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI0N2JlOC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFN0YXRpY0NvbmZpZ3VyYXRpb259IGludGVyZmFjZSBmb3IgcHJvcGVydHktZmlsZSBiYXNlZCBjb25maWdzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LlJFVVNFfSkKLXB1YmxpYyBjbGFzcyBTdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPgotewotICAgIHByaXZhdGUgU3RyaW5nIHBhdGg7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmdzOwotCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlT2ZNYXBwaW5nKFN0cmluZyBwYXRoKQotICAgIHsKLSAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKLSAgICAgICAgLy9mb3JjZSByZWxvYWQKLSAgICAgICAgbWFwcGluZ3MgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGdldE1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgaWYobWFwcGluZ3MgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgICAgICB9Ci0KLSAgICAgICAgbWFwcGluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+KCk7Ci0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgbWFwcGluZyA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShwYXRoKTsKLQotICAgICAgICBpZiAobWFwcGluZyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2xvZ2dpbmcKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBFbnVtZXJhdGlvbiBrZXlzID0gbWFwcGluZy5nZXRLZXlzKCk7Ci0KLSAgICAgICAgU3RyaW5nIG1ldGFEYXRhS2V5OwotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOwotCi0gICAgICAgIHdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhRGF0YUtleSA9IChTdHJpbmcpIGtleXMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSA9IG1hcHBpbmcuZ2V0U3RyaW5nKG1ldGFEYXRhS2V5KTsKLQotICAgICAgICAgICAgYWRkTWFwcGluZyhtZXRhRGF0YUtleSwgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFwcGluZ3M7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIG1ldGFEYXRhS2V5LCBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQotICAgIHsKLSAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA9IG5ldyBTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIGVudHJ5LnNldFNvdXJjZShtZXRhRGF0YUtleSk7Ci0gICAgICAgIGVudHJ5LnNldFRhcmdldCh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpOwotICAgICAgICB0aGlzLm1hcHBpbmdzLmFkZChlbnRyeSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMGU5YWMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi0vKioKLSAqIEVtcHR5IGJhc2UgaW1wbGVtZW50YXRpb24gd2hpY2ggYWxsb3dzIGNvbmNyZXRlIGltcGxlbWVudGF0aW9ucyB0byBvdmVycmlkZSBqdXN0IHRoZSBuZWVkZWQgbWV0aG9kcy4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFJlbmRlcmVySW50ZXJjZXB0b3IKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcigpCi0gICAgewotICAgICAgICAgICAgbG9nZ2VyLmZpbmUoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0SW50ZXJjZXB0b3JJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmV0dXJuVmFsdWVPblNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oCi0gICAgICAgIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gc2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiwgT2JqZWN0IGN1cnJlbnRSZXR1cm5WYWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50UmV0dXJuVmFsdWU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIGJlZm9yZQotICAgICovCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJlZm9yZURlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBhZnRlcgotICAgICAqLwotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZnRlckRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFmdGVyRW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZnRlckVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFmdGVyR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjU5Y2UwLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkVMSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuVmFsaWRhdGlvbk1vZHVsZUtleTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb3JlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuUmVuZGVyZXJQcm94eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlci5Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmVsLlByb3BlcnR5Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi0vKioKLSAqIEEgYmFzaWMgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFJlbmRlcmVySW50ZXJjZXB0b3J9IGZvciB2YWxpZGF0aW5nIGZpZWxkcy4KLSAqIEl0IGFkZHMgc29tZSBleHRlbnNpb24gcG9pbnQgZm9yIHN1YmNsYXNzZXMgYW5kIHBlcmZvcm1zIHRhc2tzIGxpa2UgOiA8YnIvPgotICogLSBzdG9yaW5nIGZpZWxkIHZhbHVlcyAoe0BsaW5rICNyZWNvcmRQcm9jZXNzZWRJbmZvcm1hdGlvbn0pIDxici8+Ci0gKiAtIHJlc2V0dGluZyByZXF1aXJlZCBpbmZvcm1hdGlvbiBwcm9wZXJ0eSBVSUNvbXBvbmVudCA8YnIvPgotICogLSBjYWxsaW5nIGJlZm9yZSBhbmQgYWZ0ZXIgVmFsaWRhdGlvbiBpbnRlcmNlcHRvcnMgPGJyLz4KLSAqIC0gZXRjIC4uLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIHgueC4zCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IKLXsKLSAgICBwcml2YXRlIEVMSGVscGVyIGVsSGVscGVyOwotCi0gICAgLyoqCi0gICAgICogSW4gY2FzZSBvZiByZXF1aXJlZCBpbml0aWFsaXphdGlvbgotICAgICAqIGl0J3MgbmVlZGVkIGZvciBzb21lIHVzZS1jYXNlcyB0byByZXNldCB0aGUgKHJlcXVpcmVkLSlzdGF0ZSBvZiB0aGUgY29tcG9uZW50cy4KLSAgICAgKiBTdWNoIGEgcmVzZXQgaXMganVzdCBuZWVkZWQgaWYgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24gaXMgYWN0aXZhdGVkLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIGlzIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXF1aXJlZEluaXRpYWxpemF0aW9uU3VwcG9ydGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHJlcXVpcmVkIHByb3BlcnR5IG9mIFVJQ29tcG9uZW50IHRvIGZhbHNlIGFmdGVyIGRlY29kaW5nLgotICAgICAqIEl0J3MgbmVlZGVkIGZvciBzcGVjaWFsIHVzZS1jYXNlcyBpZiByZXF1aXJlZCBpbml0aWFsaXphdGlvbiBpcyBzdXBwb3J0ZWQuCi0gICAgICogVGhlIGZpbmFsIHJlcXVpcmVkIHZhbGlkYXRpb24gd2lsbCBiZSBkb25lIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGNvbnN0cmFpbnQgdmFsaWRhdG9yLgotICAgICAqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFmdGVyRGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICAgICAgdGhyb3dzIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogY29tcG9uZW50IGluaXRpYWxpemF0aW9uIHNldHMgYSBjb21wb25lbnQgdG8gcmVxdWlyZWQgaWYgdGhlcmUgYXJlIGNvbnN0cmFpbnRzIHdoaWNoIGluZGljYXRlIGl0Ci0gICAgICAgICAqIHRoZSByZXF1aXJlZCBmbGFnIGluIGEgY29tcG9uZW50IGxlYWRzIHRvIHByb2JsZW1zIHdpdGggaDptZXNzYWdlcyAoYWRkaXRpb25hbCBtZXNzYWdlKSBhcyB3ZWxsIGFzCi0gICAgICAgICAqIGluY29tcGF0aWJpbGl0aWVzIHdpdGggc2tpcCB2YWxpZGF0aW9uIGFuZCBzZXZlcml0aWVzCi0gICAgICAgICAqLwotICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIgJiYgRXh0VmFsVXRpbHMuaXNSZXF1aXJlZFJlc2V0QWN0aXZhdGVkKCkgJiYKLSAgICAgICAgICAgICAgICBpc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25TdXBwb3J0ZWQoKSAmJiBFeHRWYWxVdGlscy5pc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25BY3RpdmUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCZWZvcmUgdGhlIGNvbXBvbmVudCBnZXRzIHJlbmRlcmVkIHRoZSBpbnRlcmNlcHRvciBpbml0aWFsaXplcyB0aGUgY29tcG9uZW50IGJhc2VkIG9uIHRoZSBtZXRhLWRhdGEKLSAgICAgKiB3aGljaCBpcyBwcm92aWRlZCBieSB0aGUgcmVmZXJlbmNlZCBwcm9wZXJ0eSAoaWYgY29tcG9uZW50IGluaXRpYWxpemF0aW9uIGlzIGFjdGl2YXRlZCkuCi0gICAgICoKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpICYmICFpc0NvbXBvbmVudEluaXRpYWxpemF0aW9uRGVhY3RpdmF0ZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdENvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgdGhlIGNvbXBvbmVudCBiYXNlZCBvbiB0aGUgbWV0YS1kYXRhIHdoaWNoIGlzIHByb3ZpZGVkIGJ5IHRoZSByZWZlcmVuY2VkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBUaGUgSlNGIENvbnRleHQKLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgVGhlIGNvbXBvbmVudCB3aGljaCBpcyBwcm9jZXNzZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0Q29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KTsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRob2QgcGVyZm9ybXMgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkIGFuZCBjYWxscyB0aGUgcmVnaXN0ZXJlZCBpbnRlcmNlcHRvcnMgcmVnYXJkaW5nIHRoZSB2YWxpZGF0aW9uLgotICAgICAqCi0gICAgICogVGhlIG1haW4gc3RlcHMgYXJlIDo8YnIvPgotICAgICAqIC0gR2V0IHRoZSBjb252ZXJ0ZWQgdmFsdWUgZnJvbSB0aGUgcmVuZGVyZXIgKHBvc3NpYmx5IGNhY2hlZCBieSB0aGUgUmVuZGVyZXJQcm94eSk8YnIvPgotICAgICAqIC0gUmVjb3JkIHRoZSB2YWx1ZSAoZS5nLiBmb3IgY3Jvc3MgdmFsaWRhdGlvbik8YnIvPgotICAgICAqIC0gQWRqdXN0IHRoZSBjb252ZXJ0ZWQgdmFsdWUgZm9yIGludGVycHJldCBlbXB0eSB2YWx1ZXMgYXMgbnVsbC48YnIvPgotICAgICAqIC0gRXhlY3V0ZSB0aGUgYmVmb3JlVmFsaWRhdGlvbiBtZXRob2Qgb2YgdGhlIHJlZ2lzdGVyZWQgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3Incy4gPGJyLz4KLSAgICAgKiAtIFBlcmZvcm0gdGhlIHZhbGlkYXRpb24gd2hlbiB0aGUgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgaGF2ZSBpbmRpY2F0ZSBpdCB0aGF0IGl0IHNob3VsZCBiZSBwZXJmb3JtZWQuCi0gICAgICogPGJyLz4KLSAgICAgKiAtIFdoZW4gYSB2YWxpZGF0aW9uIGVycm9yIG9jY3VycmVkLCBhc2sgdGhlIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgaWYgdGhpcyB2YWxpZGF0aW9uIHNob3VsZCByZXN1bHQgaW4gYW4KLSAgICAgKiAgZXhjZXB0aW9uIDxici8+Ci0gICAgICogLSBFeGVjdXRlIHRoZSBhZnRlclZhbGlkYXRpb24gbWV0aG9kIG9mIHRoZSByZWdpc3RlcmVkIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yJ3MuICh3aGVuIHZhbGlkYXRpb24gYWN0dWFsbHkKLSAgICAgKiAgdG9va3MgcGxhY2UpCi0gICAgICoKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYod3JhcHBlZCBpbnN0YW5jZW9mIFJlbmRlcmVyUHJveHkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udmVydGVkT2JqZWN0ID0gKChSZW5kZXJlclByb3h5KXdyYXBwZWQpLmdldENhY2hlZENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdCA9IHdyYXBwZWQuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFByb3BlcnR5Tm90Rm91bmRFeGNlcHRpb24gcikKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExldmVsLlNFVkVSRSwgIml0IHNlZW1zIHlvdSBhcmUgdXNpbmcgYW4gaW52YWxpZCBiaW5kaW5nLiAiICsgd3JhcHBlZC5nZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICArICI6IGNvbnZlcnNpb24gZmFpbGVkLiBub3JtYWxseSB0aGlzIGlzID5ub3Q8IGEgbXlmYWNlcyBleHR2YWwgaXNzdWUhIiwgcik7Ci0KLSAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydGllcyh1aUNvbXBvbmVudCk7Ci0gICAgICAgIAotICAgICAgICBpZihyZWNvcmRQcm9jZXNzZWRJbmZvcm1hdGlvbigpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL3JlY29yZCB1c2VyIGlucHV0IGUuZy4gZm9yIGNyb3NzLWNvbXBvbmVudCB2YWxpZGF0aW9uCi0gICAgICAgICAgICBmb3IoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciByZWNvcmRlciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVjb3JkZXIucmVjb3JkVXNlcklucHV0KHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOwotCi0gICAgICAgICAgICAgICAgbG9nZ2VyLmZpbmVzdChyZWNvcmRlci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY2FsbGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHZhbGlkYXRlVmFsdWUgPSBmYWxzZTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdCA9IHRyYW5zZm9ybVZhbHVlRm9yVmFsaWRhdGlvbihjb252ZXJ0ZWRPYmplY3QpOwotCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSA9IHZhbGlkYXRlVmFsdWUoY29udmVydGVkT2JqZWN0KTsKLSAgICAgICAgICAgICAgICBpZih2YWxpZGF0ZVZhbHVlICYmIHByb2Nlc3NCZWZvcmVWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVmFsaWRhdG9yRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBtaWdodCBkZWNpZGUgdGhhdCBpdCBpc24ndCBhbiBleGNlcHRpb24KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50KHVpQ29tcG9uZW50LCBlLmdldEZhY2VzTWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZmluYWxFeGNlcHRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbnZlcnRlckV4Y2VwdGlvbihlLmdldEZhY2VzTWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHZhbGlkYXRlVmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0FmdGVyVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydGllcyh1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlIHRoZSBiZWZvcmVWYWxpZGF0aW9uIG1ldGhvZCBvZiB0aGUgcmVnaXN0ZXJlZCBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcidzLgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBUaGUgSlNGIENvbnRleHQKLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgVGhlIFVJQ29tcG9uZW50IHdoaWNoIGlzIHByb2Nlc3NlZC4KLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHZhbGlkYXRlCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdmFsaWRhdGlvbiBjYW4gcHJvY2VlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NCZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUdsb2JhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsdWUsCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIGdldFByb3BlcnR5SW5mb3JtYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCksIGdldE1vZHVsZUtleSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlIHRoZSBhZnRlclZhbGlkYXRpb24gbWV0aG9kIG9mIHRoZSByZWdpc3RlcmVkIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yJ3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IFRoZSBKU0YgQ29udGV4dAotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBUaGUgVUlDb21wb25lbnQgd2hpY2ggaXMgcHJvY2Vzc2VkLgotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgd2hpY2ggaGFzIGp1c3QgYmVlbiB2YWxpZGF0ZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0FmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgRXh0VmFsVXRpbHMuZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWx1ZSwKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uLmNsYXNzLmdldE5hbWUoKSwgZ2V0UHJvcGVydHlJbmZvcm1hdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KSwgZ2V0TW9kdWxlS2V5KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4dHJhbmN0cyB0aGUge0BsaW5rIFByb3BlcnR5SW5mb3JtYXRpb259IGZvciB0aGUgZ2l2ZW4gY29tcG9uZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBUaGUgSlNGIENvbnRleHQKLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgVGhlIFVJQ29tcG9uZW50IHdoaWNoIGlzIHByb2Nlc3NlZC4KLSAgICAgKiBAcmV0dXJuIHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgcmVmZXJlbmNlZCBwcm9wZXJ0eSAoZS5nLiBiYXNlIG9iamVjdCwgcHJvcGVydHkgbmFtZSwgbWV0YS1kYXRhLCAuLi4pCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFByb3BlcnR5SW5mb3JtYXRpb24gZ2V0UHJvcGVydHlJbmZvcm1hdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IGdldFByb3BlcnRpZXNGb3JDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcih1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IgPSBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcihwcm9wZXJ0aWVzKTsKLQotICAgICAgICByZXR1cm4gbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbnMgbXVzdCByZXR1cm4gdGhlIE1ldGFEYXRhRXh0cmFjdG9yIHRoYXQgd2lsbCBwZXJmb3JtIHRoZSBleHRyYWN0aW9uIG9mIHRoZSBtZXRhIGRhdGEgZnJvbSB0aGUKLSAgICAgKiBjb21wb25lbnQuIFRoZSBjb21wb25lbnQgaXRzZWxmIGlzIHByZXNlbnQgaW4gdGhlIHByb3BlcnRpZXMgbWFwIChpdCBtaWdodCBpbmZsdWVuY2UgdGhlIHR5cGUgb2YgdGhlIHJldHVybmVkCi0gICAgICoge0BsaW5rIE1ldGFEYXRhRXh0cmFjdG9yfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFByb3BlcnRpZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGV4dHJhY3RvciB3aGljaCBpcyByZXR1cm5lZC4KLSAgICAgKiBAcmV0dXJuIFRoZSBNZXRhRGF0YUV4dHJhY3RvciB1c2VkIGZvciBwZXJmb3JtaW5nIHRoZSB4dHJhY3Rpb24gb2YgdGhlIG1ldGEgZGF0YSBmcm9tIHRoZSBjb21wb25lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IE1ldGFEYXRhRXh0cmFjdG9yIGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyk7Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhbiBlbXB0eSBTdHJpbmcgdG8gbnVsbCB3aGVuIHRoZSBwYXJhbWV0ZXIgaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwgaXMgc2V0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnZlcnRlZE9iamVjdCAgQ29udmVydGVkIG9iamVjdGVkCi0gICAgICogQHJldHVybiBBZGp1c3RlZCB2YWx1ZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZyb20gbm93IG9uIGFzIGNvbnZlcnRlZCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IHRyYW5zZm9ybVZhbHVlRm9yVmFsaWRhdGlvbihPYmplY3QgY29udmVydGVkT2JqZWN0KQotICAgIHsKLSAgICAgICAgaWYgKCIiLmVxdWFscyhjb252ZXJ0ZWRPYmplY3QpICYmIGludGVycHJldEVtcHR5U3RyaW5nVmFsdWVzQXNOdWxsKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZE9iamVjdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFdmFsdWF0ZXMgaWYgdGhlIHZhbHVlIHNob3VsZCBiZSB2YWxpZGF0ZWQgaW4gY2FzZSBpdCBpcyBlbXB0eSAobnVsbCBvciBubyBjaGFyYWN0ZXJzKS4KLSAgICAgKiBFeHRWYWwgYWxzbyB1c2VzIGEgY29uZmlnIHBhcmFtZXRlciBpbnRyb2R1Y2VkIGJ5IEpTRiAyIHdoaWNoIGFsbG93cyB0byBza2lwIHRoZSB2YWxpZGF0aW9uIG9mIGVtcHR5IGZpZWxkcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb252ZXJ0ZWRPYmplY3QgVGhlIGNvbnZlcnRlZCB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHZhbHVlIHNob3VsZCBiZSB2YWxpZGF0ZWQsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlVmFsdWUoT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkKLSAgICB7Ci0gICAgICAgIGlmKGlzVmFsdWVUb1ZhbGlkYXRlRW1wdHkoY29udmVydGVkT2JqZWN0KSAmJiAhdmFsaWRhdGVFbXB0eUZpZWxkcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci5maW5lKCJlbXB0eSBmaWVsZCB2YWxpZGF0aW9uIGlzIGRlYWN0aXZhdGVkIGluIHRoZSB3ZWIueG1sIC0gc2VlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLlZBTElEQVRFX0VNUFRZX0ZJRUxEUyIpOwotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWZpbmVzIGlmIGEgdmFsdWUgaXMgZW1wdHkuIFRoZSBkZWZpbml0aW9uIG9mIGVtcHR5IGlzIHRoYXQgaXQgaXMgbnVsbCBvciBoYXMgbm8gY2hhcmFjdGVycyBpbiB0aGUgU3RyaW5nIHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnZlcnRlZE9iamVjdCBUaGUgY29udmVydGVkIHZhbHVlLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFuIGVtcHR5IHZhbHVlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWx1ZVRvVmFsaWRhdGVFbXB0eShPYmplY3QgY29udmVydGVkT2JqZWN0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZE9iamVjdCA9PSBudWxsIHx8ICIiLmVxdWFscyhjb252ZXJ0ZWRPYmplY3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZXMgYSBjb25maWcgcGFyYW1ldGVyIChqYXZheC5mYWNlcy5WQUxJREFURV9FTVBUWV9GSUVMRFMpIHdoaWNoIHdhcyBpbnRyb2R1Y2VkIGJ5IEpTRiAyIGZvciBkZWFjdGl2YXRpbmcKLSAgICAgKiB0aGUgdmFsaWRhdGlvbiBvZiBlbXB0eSBmaWVsZHMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWxpZGF0aW9uIG9mIGVtcHR5IGZpZWxkcyBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUVtcHR5RmllbGRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy52YWxpZGF0ZUVtcHR5RmllbGRzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlcyBhIGNvbmZpZyBwYXJhbWV0ZXIgKGphdmF4LmZhY2VzLklOVEVSUFJFVF9FTVBUWV9TVFJJTkdfU1VCTUlUVEVEX1ZBTFVFU19BU19OVUxMKQotICAgICAqIHdoaWNoIHdhcyBpbnRyb2R1Y2VkIGJ5IEpTRiAyIGZvciBjb252ZXJ0aW5nIGVtcHR5IHN0cmluZ3MgdG8gbnVsbC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbiBlbXB0eSBzdHJpbmcgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggbnVsbCAoZm9yIHRoZSB2YWxpZGF0aW9uIHByb2Nlc3MpLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIGhhcyB0byBwZXJmb3JtIHRoZSBhY3R1YWwgdmFsaWRhdGlvbiBvZiB0aGUgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IFRoZSBKU0YgQ29udGV4dAotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBUaGUgVUlDb21wb25lbnQgd2hpY2ggaXMgcHJvY2Vzc2VkLgotICAgICAqIEBwYXJhbSBjb252ZXJ0ZWRPYmplY3QgVGhlIChhZGp1c3RlZCkgY29udmVydGVkIHZhbHVlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKAotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOwotCi0gICAgLyoqCi0gICAgICogQmFzZWQgb24gYmFzaWMgcnVsZXMgdGhlIG1ldGhvZCBjaGVja3MgaWYgdGhlIGN1cnJlbnQgY29tcG9uZW50IHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgVGhlIFVJQ29tcG9uZW50IHdoaWNoIGlzIHByb2Nlc3NlZC4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGNvbXBvbmVudCBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5IHRoZSBjdXJyZW50IGludGVyY2VwdG9yLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlciAmJiBpc1ZhbHVlQmluZGluZ09mQ29tcG9uZW50VmFsaWQodWlDb21wb25lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEVMSGVscGVyIHRvIGJlIHVzZWQgaW4gdGhlIHByb2Nlc3Mgb2YgdGhlIHZhbGlkYXRpb24uIEl0IGlzIGNhY2hlZCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KLSAgICAgKiBAcmV0dXJuIFRoZSBFTEhlbHBlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRUxIZWxwZXIgZ2V0RUxIZWxwZXIoKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5lbEhlbHBlciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmVsSGVscGVyID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5lbEhlbHBlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWx1ZUJpbmRpbmdPZkNvbXBvbmVudFZhbGlkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRFTEhlbHBlcigpLmdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKHVpQ29tcG9uZW50KSAhPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25EZWFjdGl2YXRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb24uZ2V0KCkuZGVhY3RpdmF0ZUNvbXBvbmVudEluaXRpYWxpemF0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2lnbmFscyBpZiB0aGUgY29udmVydGVkIHZhbHVlIHNob3VsZCBiZSBzdG9yZWQgZS5nLiBmb3IgdGhlIGNyb3NzLXZhbGlkYXRpb24gcHJvY2Vzcy4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnZlcnRlZCB2YWx1ZSBzaG91bGQgYmUgcmVjb3JkZWQsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHJlY29yZFByb2Nlc3NlZEluZm9ybWF0aW9uKCkKLSAgICB7Ci0gICAgICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZGVudGlmaWNhdGlvbiBvZiB0aGUgdmFsaWRhdGlvbiBtb2R1bGUuCi0gICAgICogQSBrZXkgaXMganVzdCBuZWVkZWQgaWYgb3RoZXIgaW1wbGVtZW50YXRpb25zIHNob3VsZCBiZSByZXN0cmljdGVkIHRvIDEtbiBzcGVjaWFsIHZhbGlkYXRpb24gbW9kdWxlcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIElkZW50aWZpY2F0aW9uIG9mIHRoZSB2YWxpZGF0aW9uIG1vZHVsZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0TW9kdWxlS2V5KCkKLSAgICB7Ci0gICAgICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgcHJvcGVydGllcyB3aGljaCBjYW4gYmUgdXNlZCBieSBhIHtAbGluayBNZXRhRGF0YUV4dHJhY3Rvcn0uCi0gICAgICogQnkgZGVmYXVsdCBpdCBhZGRzIGEga2V5IHdoaWNoIGlkZW50aWZpZXMgdGhlIGN1cnJlbnQgdmFsaWRhdGlvbi1tb2R1bGUKLSAgICAgKiBhbmQgdGhlIGN1cnJlbnQgY29tcG9uZW50ICh0byBhdm9pZCBjaGFuZ2VzIG9mIHRoZSBhcGkgZm9yIHF1aXRlIHNwZWNpYWwgdXNlLWNhc2VzKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCAgVGhlIFVJQ29tcG9uZW50IHdoaWNoIGlzIHByb2Nlc3NlZC4KLSAgICAgKiBAcmV0dXJuIHByb3BlcnRpZXMgdXNlZCBieSB0aGUgc2VsZWN0aW9uIG9mIHRoZSBNZXRhRGF0YUV4dHJhY3RvcgotICAgICAqLwotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXNGb3JDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVQcm9wZXJ0aWVzKHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHByb3BlcnRpZXMgd2hpY2ggY2FuIGJlIHVzZWQgYnkgYSB7QGxpbmsgTWV0YURhdGFFeHRyYWN0b3J9LgotICAgICAqIFJldHVybnMgdGhlIHByb3BlcnRpZXMgd2hpY2ggd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSB0byBpbnRlcmNlcHRvcnMuIEJ5IGRlZmF1bHQgdGhlIG1vZHVsZUtleSBhbmQgdGhlIFVJQ29tcG9uZW50Ci0gICAgICogaXRzZWxmIGlzIGFkZGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50ICBUaGUgVUlDb21wb25lbnQgd2hpY2ggaXMgcHJvY2Vzc2VkLgotICAgICAqIEByZXR1cm4gIHByb3BlcnRpZXMgZm9yIHRoZSBpbnRlcmNlcHRvcnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0SW50ZXJjZXB0b3JQcm9wZXJ0aWVzKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVByb3BlcnRpZXModWlDb21wb25lbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBjcmVhdGVQcm9wZXJ0aWVzKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgICAgICBpZihnZXRNb2R1bGVLZXkoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQucHV0KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpLCBnZXRNb2R1bGVLZXkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LnB1dChVSUNvbXBvbmVudC5jbGFzcy5nZXROYW1lKCksIHVpQ29tcG9uZW50KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3JlcyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3MgKHRvIGF2b2lkIGFwaSBjaGFuZ2VzKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBUaGUgVUlDb21wb25lbnQgd2hpY2ggaXMgcHJvY2Vzc2VkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydGllcyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UgaW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UgPSBnZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlKCk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gZ2V0SW50ZXJjZXB0b3JQcm9wZXJ0aWVzKHVpQ29tcG9uZW50KTsKLSAgICAgICAgZm9yKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLnNldFByb3BlcnR5KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZXNldFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0aWVzKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZSBpbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZSA9IGdldFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UoKTsKLQotICAgICAgICBmb3IoU3RyaW5nIGtleSA6IGdldEludGVyY2VwdG9yUHJvcGVydGllcyh1aUNvbXBvbmVudCkua2V5U2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLnJlbW92ZVByb3BlcnR5KGtleSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UgZ2V0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmNsYXNzLAotICAgICAgICAgICAgICAgIFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0NvbXBvbmVudEluaXRpYWxpemF0aW9uQXdhcmVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Db21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU3MzFiMy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0NvbXBvbmVudEluaXRpYWxpemF0aW9uQXdhcmVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotDQotLyoqDQotICogVGhpcyBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGEgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgdGhhdCBzaG91bGQgb25seSBiZQ0KLSAqIGludm9rZWQgd2hlbiB0aGUgTWV0YURhdGFFeHRyYWN0aW9uIGhhcHBlbnMgaW4gdGhlIFJlbmRlciBSZXNwb25zZSBQaGFzZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Bd2FyZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKEpzZlV0aWxzLmlzUmVuZGVyUmVzcG9uc2VQaGFzZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFmdGVyRXh0cmFjdGluZ0ZvckNvbXBvbmVudEluaXRpYWxpemF0aW9uKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBQZXJmb3JtIGFueSBhZGRpdGlvbmFsIGFjdGlvbnMgb24gdGhlIFByb3BlcnR5SW5mb3JtYXRpb24gZGF0YSBhZnRlciB0aGUgZXh0cmFjdGlvbiBpcyBwZXJmb3JtZWQgYW5kIGJlZm9yZSBpdCBpcw0KLSAgICAgKiB1c2VkIHRvIGRldGVybWluZSBVSUNvbXBvbmVudHMgYWRqdXN0bWVudHMuDQotICAgICAqIEBwYXJhbSBwcm9wZXJ0eUluZm9ybWF0aW9uIGhlIGluZm9ybWF0aW9uIGVudHJ5IHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9wZXJ0eQ0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWZ0ZXJFeHRyYWN0aW5nRm9yQ29tcG9uZW50SW5pdGlhbGl6YXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9GYWNlc01lc3NhZ2VQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9GYWNlc01lc3NhZ2VQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzRhNDE1Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRmFjZXNNZXNzYWdlU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoOTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZVN0b3JhZ2UgZmFjZXNNZXNzYWdlU3RvcmFnZSA9IEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoDQotICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZVN0b3JhZ2UuY2xhc3MsIEZhY2VzTWVzc2FnZVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZVN0b3JhZ2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2VTdG9yYWdlLmFkZEFsbCgpOw0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlc2V0U3RvcmFnZShGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLCBGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNGJiMjguLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkxhYmVsZWRNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uZXhjZXB0aW9uLlJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0U2VjcmV0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZUxpc3Rib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZU1lbnU7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZVJhZGlvOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55Q2hlY2tib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlMaXN0Ym94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TWVudTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0YXJlYTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpCi0gICAgewotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSBFeHRWYWxVdGlscy5jb252ZXJ0RmFjZXNNZXNzYWdlKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSk7Ci0KLSAgICAgICAgICAgIHRyeVRvVXNlSW5saW5lTWVzc2FnZSh1aUNvbXBvbmVudCwgdmFsaWRhdG9yRXhjZXB0aW9uKTsKLQotICAgICAgICAgICAgdHJ5VG9Vc2VMYWJlbChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBmYWNlc01lc3NhZ2UpOwotCi0gICAgICAgICAgICB0cnlUb0Jsb2Nrc05hdmlnYXRpb24odWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGZhY2VzTWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvVXNlSW5saW5lTWVzc2FnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCk7Ci0gICAgICAgIFN0cmluZyBpbmxpbmVNZXNzYWdlOwotCi0gICAgICAgIGlmKHZhbGlkYXRvckV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmxpbmVNZXNzYWdlID0gZ2V0SW5saW5lUmVxdWlyZWRNZXNzYWdlKHVpQ29tcG9uZW50KTsKLQotICAgICAgICAgICAgaWYoaW5saW5lTWVzc2FnZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGlubGluZU1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoaW5saW5lTWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgaW5saW5lTWVzc2FnZSA9IGdldElubGluZVZhbGlkYXRvck1lc3NhZ2UodWlDb21wb25lbnQpOwotCi0gICAgICAgICAgICBpZihpbmxpbmVNZXNzYWdlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoaW5saW5lTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldERldGFpbChpbmxpbmVNZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1VzZUxhYmVsKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpCi0gICAgewotICAgICAgICBTdHJpbmcgbGFiZWwgPSAoU3RyaW5nKSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsCi0gICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldExhYmVsIikpOwotCi0gICAgICAgIGlmKGxhYmVsID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxhYmVsID0gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vb3ZlcnJpZGUgdGhlIGxhYmVsIGlmIHRoZSBhbm5vdGF0aW9uIHByb3ZpZGVzIGEgbGFiZWwKLSAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxhYmVsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCwgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIExhYmVsZWRNZXNzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKExhYmVsZWRNZXNzYWdlKWZhY2VzTWVzc2FnZSkuc2V0TGFiZWxUZXh0KGxhYmVsKTsKLSAgICAgICAgfQotICAgICAgICAvL2lmIHNvbWVvbmUgdXNlcyBhIG5vcm1hbCBmYWNlcyBtZXNzYWdlCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwoZmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiY2hlY2sgaWYgaXQgaXMgc3RpbGwgcmVxdWlyZWQgaGVyZSIpCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvQmxvY2tzTmF2aWdhdGlvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQotICAgIHsKLSAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vY29ycmVjdCBzZXZlcml0eSBpcyBlLmcuIHByb3ZpZGVkIGJ5IFZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yCi0gICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnQodWlDb21wb25lbnQsIGZhY2VzTWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRJbmxpbmVSZXF1aXJlZE1lc3NhZ2UoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gKFN0cmluZylSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJnZXRSZXF1aXJlZE1lc3NhZ2UiKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW5saW5lVmFsaWRhdG9yTWVzc2FnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCh1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldFZhbGlkYXRvck1lc3NhZ2UiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lUmFkaW8gfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TGlzdGJveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OWE0NGUuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gcG9zdC1wcm9jZXNzIHRoZSByZXN1bHQgb2YgdGhlIG1ldGEtZGF0YSBleHRyYWN0aW9uIHByb2Nlc3MgKHNlZQ0KLSAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3J9KQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQEludm9jYXRpb25PcmRlclN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotew0KLSAgICAvKioNCi0gICAgICogQWxsb3dzIHRvIGV4ZWN1dGUgYWRkaXRpb25hbCBhY3Rpb25zIG9uIHRoZQ0KLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbn0NCi0gICAgICogZGF0YSBhZnRlciB0aGUgZXh0cmFjdGlvbiBpcyBwZXJmb3JtZWQgYW5kIGJlZm9yZSBpdCBpcw0KLSAgICAgKiB1c2VkIHRvIGRldGVybWluZSB2YWxpZGF0aW9uIHN0cmF0ZWdpZXMgb3IgVUlDb21wb25lbnQgYWRqdXN0bWVudHMuDQotICAgICAqICANCi0gICAgICogQHBhcmFtIHByb3BlcnR5SW5mb3JtYXRpb24gdGhlIGluZm9ybWF0aW9uIGVudHJ5IHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9wZXJ0eQ0KLSAgICAgKi8NCi0gICAgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDhkZGRhLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlclN1cHBvcnQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogUHJvcGVydHktdmFsaWRhdGlvbiBpbnRlcmNlcHRvcnMgYWxsb3cgdG8gaW50ZXJjZXB0IHRoZSB2YWxpZGF0aW9uIG9mIGEgcHJvcGVydHkuIEl0J3MgcG9zc2libGUgdG8gcmVnaXN0ZXIgYQ0KLSAqIGdsb2JhbCBpbnRlcmNlcHRvciB3aGljaCBpbnRlcmNlcHRzIHRoZSB2YWxpZGF0aW9uIHByb2Nlc3Mgb2YgYWxsIHByb3BlcnRpZXMgb3IgYSBsb2NhbCBpbnRlcmNlcHRvcg0KLSAqICg9IGEge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXJ9IHdoaWNoIGFsbG93cw0KLSAqIHRvIGludGVyY2VwdCB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgY29uc3RyYWludCB3aGljaCBob3N0cyB0aGUgaW50ZXJjZXB0b3IgYXMNCi0gKiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcn0uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotew0KLSAgICAvKioNCi0gICAgICogRXhlY3V0ZWQgYmVmb3JlIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3kNCi0gICAgICogdmFsaWRhdGlvbiBzdHJhdGVnaWVzfSBhcmUgaW52b2tlZCB0byB2YWxpZGF0ZSB0aGUgY29udmVydGVkIHZhbHVlLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IFRoZSBKU0YgQ29udGV4dA0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgVGhlIGNvbXBvbmVudCB3aGljaCBpcyBwcm9jZXNzZWQNCi0gICAgICogQHBhcmFtIGNvbnZlcnRlZE9iamVjdCAgVGhlIGNvbnZlcnRlZCBvYmplY3QNCi0gICAgICogQHBhcmFtIHByb3BlcnRpZXMgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvZiBpbnRlcmVzdC4gQ29udGFpbnMgZS5nLiB0aGUNCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb259IGV4dHJhY3RlZCBmcm9tIHRoZSBjb21wb25lbnQuDQotICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlIHZhbGlkYXRpb24gcHJvY2VzcyBzaG91bGQgYmUgYnlwYXNzZWQNCi0gICAgICovDQotICAgIGJvb2xlYW4gYmVmb3JlVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsNCi0NCi0gICAgLyoqDQotICAgICAqIFByb2Nlc3NlZCBpZiB2YWxpZGF0aW9uIHdhcyBleGVjdXRlZC4NCi0gICAgICogSW4gY29udHJhc3QgdG8gYSB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yDQotICAgICAqIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcn0gaXQgZ2V0cyBleGVjdXRlZCBpbiBhbnkgY2FzZS4NCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBUaGUgSlNGIENvbnRleHQNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IFRoZSBjb21wb25lbnQgd2hpY2ggaXMgcHJvY2Vzc2VkDQotICAgICAqIEBwYXJhbSBjb252ZXJ0ZWRPYmplY3QgVGhlIGNvbnZlcnRlZCBvYmplY3QNCi0gICAgICogQHBhcmFtIHByb3BlcnRpZXMgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvZiBpbnRlcmVzdC4gQ29udGFpbnMgZS5nLiB0aGUNCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb259IGV4dHJhY3RlZCBmcm9tIHRoZSBjb21wb25lbnQuDQotICAgICAqLw0KLSAgICB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9SZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQyNjU0ZS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogQWxsb3dzIHRvIGludGVyY2VwdCByZW5kZXJlciBtZXRob2RzLjxici8+Ci0gKiBJdCdzIHRoZSBiYXNlIG1lY2hhbmlzbSBvZiBFeHRWYWwgd2hpY2ggZW5hYmxlcyBtb3N0IG9mIHRoZSBjb25jZXB0cyBwcm92aWRlZCBieSB0aGUgZnJhbWV3b3JrLgotICogRnVydGhlcm1vcmUsIGl0IGFsbG93cyB0byBhZGQgY3VzdG9tIGNvbmNlcHRzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBSZW5kZXJlckludGVyY2VwdG9yCi17Ci0gICAgU3RyaW5nIGdldEludGVyY2VwdG9ySWQoKTsKLQotICAgIC8qKgotICAgICAqIEluIGNhc2Ugb2YgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpdCBkZWZpbmVzIHRoZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCBieSB0aGUgZ2V0Q29udmVydGVkVmFsdWUgbWV0aG9kCi0gICAgICogaW4gY2FzZSB0aGVyZSB3YXMgYSB7QGxpbmsgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbn0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRocm93biB0byBhYm9ydCBmdXJ0aGVyIHtAbGluayBSZW5kZXJlckludGVyY2VwdG9yfXMuCi0gICAgICogQHBhcmFtIGN1cnJlbnRSZXR1cm5WYWx1ZSBUaGUgY29udmVydGVkIHZhbHVlIHRoYXQgaXMgZGVmaW5lZCBhdCB0aGlzIHRpbWUuCi0gICAgICogQHJldHVybiB2YWx1ZSB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIGNvbnZlcnRlZCB2YWx1ZS4KLSAgICAgKi8KLSAgICBPYmplY3QgZ2V0UmV0dXJuVmFsdWVPblNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oCi0gICAgICAgIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gc2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiwgT2JqZWN0IGN1cnJlbnRSZXR1cm5WYWx1ZSk7Ci0KLSAgICAvKgotICAgICAqIGJlZm9yZQotICAgICAqLwotCi0gICAgLyoqCi0gICAgICogSW50ZXJjZXB0cyBhIG1ldGhvZCBvZiB0aGUgcmVuZGVyZXIuIFRoZSBuYW1lIG9mIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QgaXMgdGhlIG5hbWUgb2YgdGhpcyBtZXRob2Qgd2l0aG91dCB0aGUKLSAgICAgKiBwcmVmaXggKCdiZWZvcmUnKS4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBUaGUgSlNGIENvbnRleHQKLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgVGhlIGN1cnJlbnQgY29tcG9uZW50Ci0gICAgICogQHBhcmFtIHJlbmRlcmVyIFRoZSBpbnRlcmNlcHRlZCByZW5kZXJlcgotICAgICAqIEB0aHJvd3MgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBjYW4gYmUgdGhyb3duIHRvIHN0b3AgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgc3Vic2VxdWVudCBpbnRlcmNlcHRvcnMKLSAgICAgKiBAdGhyb3dzIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gY2FuIGJlIHRob3J3biB0byBza2lwIHRoZSBpbnZvY2F0aW9uIG9mIHRoZSBpbnRlcmNlcHRlZCByZW5kZXJlciBtZXRob2QuCi0gICAgICovCi0gICAgdm9pZCBiZWZvcmVEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEludGVyY2VwdHMgYSBtZXRob2Qgb2YgdGhlIHJlbmRlcmVyLiBUaGUgbmFtZSBvZiB0aGUgaW50ZXJjZXB0ZWQgbWV0aG9kIGlzIHRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kIHdpdGhvdXQgdGhlCi0gICAgICogcHJlZml4ICgnYmVmb3JlJykuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IFRoZSBKU0YgQ29udGV4dAotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBUaGUgY3VycmVudCBjb21wb25lbnQKLSAgICAgKiBAcGFyYW0gcmVuZGVyZXIgVGhlIGludGVyY2VwdGVkIHJlbmRlcmVyCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgSW4gY2FzZSB0aGUgcmVzcG9uc2Ugd3JpdGVyIGlzIGFjY2Vzc2VkIGFuZCB0aGVyZSB3YXMgYW4gSU8gcHJvYmxlbS4KLSAgICAgKiBAdGhyb3dzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gY2FuIGJlIHRocm93biB0byBzdG9wIHRoZSBleGVjdXRpb24gb2YgdGhlIHN1YnNlcXVlbnQgaW50ZXJjZXB0b3JzCi0gICAgICogQHRocm93cyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGNhbiBiZSB0aG9yd24gdG8gc2tpcCB0aGUgaW52b2NhdGlvbiBvZiB0aGUgaW50ZXJjZXB0ZWQgcmVuZGVyZXIgbWV0aG9kLgotICAgICAqLwotICAgIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmNlcHRzIGEgbWV0aG9kIG9mIHRoZSByZW5kZXJlci4gVGhlIG5hbWUgb2YgdGhlIGludGVyY2VwdGVkIG1ldGhvZCBpcyB0aGUgbmFtZSBvZiB0aGlzIG1ldGhvZCB3aXRob3V0IHRoZQotICAgICAqIHByZWZpeCAoJ2JlZm9yZScpLgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBUaGUgSlNGIENvbnRleHQKLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgVGhlIGN1cnJlbnQgY29tcG9uZW50Ci0gICAgICogQHBhcmFtIHJlbmRlcmVyIFRoZSBpbnRlcmNlcHRlZCByZW5kZXJlcgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSW4gY2FzZSB0aGUgcmVzcG9uc2Ugd3JpdGVyIGlzIGFjY2Vzc2VkIGFuZCB0aGVyZSB3YXMgYW4gSU8gcHJvYmxlbS4KLSAgICAgKiBAdGhyb3dzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gY2FuIGJlIHRocm93biB0byBzdG9wIHRoZSBleGVjdXRpb24gb2YgdGhlIHN1YnNlcXVlbnQgaW50ZXJjZXB0b3JzCi0gICAgICogQHRocm93cyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGNhbiBiZSB0aG9yd24gdG8gc2tpcCB0aGUgaW52b2NhdGlvbiBvZiB0aGUgaW50ZXJjZXB0ZWQgcmVuZGVyZXIgbWV0aG9kLgotICAgICAqLwotICAgIHZvaWQgYmVmb3JlRW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmNlcHRzIGEgbWV0aG9kIG9mIHRoZSByZW5kZXJlci4gVGhlIG5hbWUgb2YgdGhlIGludGVyY2VwdGVkIG1ldGhvZCBpcyB0aGUgbmFtZSBvZiB0aGlzIG1ldGhvZCB3aXRob3V0IHRoZQotICAgICAqIHByZWZpeCAoJ2JlZm9yZScpLgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBUaGUgSlNGIENvbnRleHQKLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgVGhlIGN1cnJlbnQgY29tcG9uZW50Ci0gICAgICogQHBhcmFtIHJlbmRlcmVyIFRoZSBpbnRlcmNlcHRlZCByZW5kZXJlcgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSW4gY2FzZSB0aGUgcmVzcG9uc2Ugd3JpdGVyIGlzIGFjY2Vzc2VkIGFuZCB0aGVyZSB3YXMgYW4gSU8gcHJvYmxlbS4KLSAgICAgKiBAdGhyb3dzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gY2FuIGJlIHRocm93biB0byBzdG9wIHRoZSBleGVjdXRpb24gb2YgdGhlIHN1YnNlcXVlbnQgaW50ZXJjZXB0b3JzCi0gICAgICogQHRocm93cyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGNhbiBiZSB0aG9yd24gdG8gc2tpcCB0aGUgaW52b2NhdGlvbiBvZiB0aGUgaW50ZXJjZXB0ZWQgcmVuZGVyZXIgbWV0aG9kLgotICAgICAqLwotICAgIHZvaWQgYmVmb3JlRW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogSW50ZXJjZXB0cyBhIG1ldGhvZCBvZiB0aGUgcmVuZGVyZXIuIFRoZSBuYW1lIG9mIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QgaXMgdGhlIG5hbWUgb2YgdGhpcyBtZXRob2Qgd2l0aG91dCB0aGUKLSAgICAgKiBwcmVmaXggKCdiZWZvcmUnKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgVGhlIEpTRiBDb250ZXh0Ci0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IFRoZSBjdXJyZW50IGNvbXBvbmVudAotICAgICAqIEBwYXJhbSBzdWJtaXR0ZWRWYWx1ZSBUaGUgc3VibWl0dGVkIHZhbHVlCi0gICAgICogQHBhcmFtIHJlbmRlcmVyIFRoZSBpbnRlcmNlcHRlZCByZW5kZXJlcgotICAgICAqIEB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uIEV4dFZhbCB2YWxpZGF0aW9uIHN0cmF0ZWdpZXMgY2FuIHRocm93Ci0gICAgICoge0BsaW5rIGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb259cy4KLSAgICAgKiBEdWUgdG8gdGhlIHRyaWNrIHVzZWQgYnkgRXh0VmFsIGl0IGhhcyB0byBiZSBjb252ZXJ0ZWQgdG8gYSB7QGxpbmsgQ29udmVydGVyRXhjZXB0aW9ufQotICAgICAqIChzZWUge0BsaW5rIEFic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yfSkuCi0gICAgICogQHRocm93cyBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGNhbiBiZSB0aHJvd24gdG8gc3RvcCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBzdWJzZXF1ZW50IGludGVyY2VwdG9ycwotICAgICAqIEB0aHJvd3MgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBjYW4gYmUgdGhvcnduIHRvIHNraXAgdGhlIGludm9jYXRpb24gb2YgdGhlIGludGVyY2VwdGVkIHJlbmRlcmVyIG1ldGhvZC4KLSAgICAgKi8KLSAgICB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3Qgc3VibWl0dGVkVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIC8qCi0gICAgICogYWZ0ZXIKLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqIEludGVyY2VwdHMgYSBtZXRob2Qgb2YgdGhlIHJlbmRlcmVyLiBUaGUgbmFtZSBvZiB0aGUgaW50ZXJjZXB0ZWQgbWV0aG9kIGlzIHRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kIHdpdGhvdXQgdGhlCi0gICAgICogcHJlZml4ICgnYWZ0ZXInKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgVGhlIEpTRiBDb250ZXh0Ci0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IFRoZSBjdXJyZW50IGNvbXBvbmVudAotICAgICAqIEBwYXJhbSByZW5kZXJlciBUaGUgaW50ZXJjZXB0ZWQgcmVuZGVyZXIKLSAgICAgKiBAdGhyb3dzIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBDYW4gYmUgdGhyb3duIHRvIHN0b3AgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgc3Vic2VxdWVudCBpbnRlcmNlcHRvcnMuCi0gICAgICovCi0gICAgdm9pZCBhZnRlckRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmNlcHRzIGEgbWV0aG9kIG9mIHRoZSByZW5kZXJlci4gVGhlIG5hbWUgb2YgdGhlIGludGVyY2VwdGVkIG1ldGhvZCBpcyB0aGUgbmFtZSBvZiB0aGlzIG1ldGhvZCB3aXRob3V0IHRoZQotICAgICAqIHByZWZpeCAoJ2FmdGVyJykuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IFRoZSBKU0YgY29udGV4dAotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBUaGUgY3VycmVudCBjb21wb25lbnQKLSAgICAgKiBAcGFyYW0gcmVuZGVyZXIgVGhlIGludGVyY2VwdGVkIHJlbmRlcmVyCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJbiBjYXNlIHRoZSByZXNwb25zZSB3cml0ZXIgaXMgYWNjZXNzZWQgYW5kIHRoZXJlIHdhcyBhbiBJTyBwcm9ibGVtLgotICAgICAqIEB0aHJvd3MgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIENhbiBiZSB0aHJvd24gdG8gc3RvcCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBzdWJzZXF1ZW50IGludGVyY2VwdG9ycy4KLSAgICAgKi8KLSAgICB2b2lkIGFmdGVyRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEludGVyY2VwdHMgYSBtZXRob2Qgb2YgdGhlIHJlbmRlcmVyLiBUaGUgbmFtZSBvZiB0aGUgaW50ZXJjZXB0ZWQgbWV0aG9kIGlzIHRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kIHdpdGhvdXQgdGhlCi0gICAgICogcHJlZml4ICgnYWZ0ZXInKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgVGhlIEpTRiBDb250ZXh0Ci0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IFRoZSBjdXJyZW50IGNvbXBvbmVudAotICAgICAqIEBwYXJhbSByZW5kZXJlciBUaGUgaW50ZXJjZXB0ZWQgcmVuZGVyZXIKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIEluIGNhc2UgdGhlIHJlc3BvbnNlIHdyaXRlciBpcyBhY2Nlc3NlZCBhbmQgdGhlcmUgd2FzIGFuIElPIHByb2JsZW0uCi0gICAgICogQHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gQ2FuIGJlIHRocm93biB0byBzdG9wIHRoZSBleGVjdXRpb24gb2YgdGhlIHN1YnNlcXVlbnQgaW50ZXJjZXB0b3JzLgotICAgICAqLwotICAgIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogSW50ZXJjZXB0cyBhIG1ldGhvZCBvZiB0aGUgcmVuZGVyZXIuIFRoZSBuYW1lIG9mIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QgaXMgdGhlIG5hbWUgb2YgdGhpcyBtZXRob2Qgd2l0aG91dCB0aGUKLSAgICAgKiBwcmVmaXggKCdhZnRlcicpLgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBUaGUgSlNGIENvbnRleHQKLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgVGhlIGN1cnJlbnQgY29tcG9uZW50Ci0gICAgICogQHBhcmFtIHJlbmRlcmVyIFRoZSBpbnRlcmNlcHRlZCByZW5kZXJlcgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSW4gY2FzZSB0aGUgcmVzcG9uc2Ugd3JpdGVyIGlzIGFjY2Vzc2VkIGFuZCB0aGVyZSB3YXMgYW4gSU8gcHJvYmxlbS4KLSAgICAgKiBAdGhyb3dzIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBDYW4gYmUgdGhyb3duIHRvIHN0b3AgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgc3Vic2VxdWVudCBpbnRlcmNlcHRvcnMuCi0gICAgICovCi0gICAgdm9pZCBhZnRlckVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogSW50ZXJjZXB0cyBhIG1ldGhvZCBvZiB0aGUgcmVuZGVyZXIuIFRoZSBuYW1lIG9mIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QgaXMgdGhlIG5hbWUgb2YgdGhpcyBtZXRob2Qgd2l0aG91dCB0aGUKLSAgICAgKiBwcmVmaXggKCdhZnRlcicpLgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBUaGUgSlNGIENvbnRleHQKLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgVGhlIGN1cnJlbnQgY29tcG9uZW50Ci0gICAgICogQHBhcmFtIHN1Ym1pdHRlZFZhbHVlIFRoZSBzdWJtaXR0ZWQgdmFsdWUKLSAgICAgKiBAcGFyYW0gcmVuZGVyZXIgVGhlIGludGVyY2VwdGVkIHJlbmRlcmVyCi0gICAgICogQHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24gRXh0VmFsIHZhbGlkYXRpb24gc3RyYXRlZ2llcyBjYW4gdGhyb3cKLSAgICAgKiB7QGxpbmsgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbn1zLgotICAgICAqIER1ZSB0byB0aGUgdHJpY2sgdXNlZCBieSBFeHRWYWwgaXQgaGFzIHRvIGJlIGNvbnZlcnRlZCB0byBhIHtAbGluayBDb252ZXJ0ZXJFeGNlcHRpb259Ci0gICAgICogKHNlZSB7QGxpbmsgQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3J9KS4KLSAgICAgKiBAdGhyb3dzIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBDYW4gYmUgdGhyb3duIHRvIHN0b3AgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgc3Vic2VxdWVudCBpbnRlcmNlcHRvcnMuCi0gICAgICovCi0gICAgdm9pZCBhZnRlckdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3Qgc3VibWl0dGVkVmFsdWUsIFJlbmRlcmVyCi0gICAgICAgICAgICByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9TaW5nbGVWaW9sYXRpb25Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9TaW5nbGVWaW9sYXRpb25Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGQ3YzcyLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvU2luZ2xlVmlvbGF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgcjQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2luZ2xlVmlvbGF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgcHVibGljIGJvb2xlYW4gYmVmb3JlVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIgJiYgIWlzQ29tcG9uZW50VmFsaWQodWlDb21wb25lbnQpICYmIGlzTmF2aWdhdGlvbkJsb2NrZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDb21wb25lbnRWYWxpZChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuaXNWYWxpZCgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc05hdmlnYXRpb25CbG9ja2VkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRSZW5kZXJSZXNwb25zZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZDA3YjAuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXJTdXBwb3J0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQWxsb3dzIHRvIGludGVyY2VwdCB7QGxpbmsgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbn0uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yDQotew0KLSAgICAvKioNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IHRoZSBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gbWV0YURhdGFFbnRyeSB0aGUgbWV0YSBkYXRhIGVudHJ5IHdoaWNoIGNvbnRhaW5zIHRoZSBtZXRhIGRhdGEgb2YgdGhlIHByb3BlcnR5DQotICAgICAqIEBwYXJhbSBjb252ZXJ0ZWRPYmplY3QgdGhlIGNvbnZlcnRlZCB1c2VyIGlucHV0DQotICAgICAqIEBwYXJhbSB2YWxpZGF0b3JFeGNlcHRpb24gdGhlIGN1cnJlbnQgZXhjZXB0aW9uDQotICAgICAqIEBwYXJhbSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UgdmFsaWRhdGlvbiBzdHJhdGVneSB3aGljaCB0aHJldyB0aGUgZXhjZXB0aW9uDQotICAgICAqIEByZXR1cm4gZmFsc2UgdG8gc3RvcCB0aHJvd2luZyB0aGUgZXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpOw0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgyYTU5ZC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLk51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25JbnRlcmNlcHRvciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXF1aXJlZEluaXRpYWxpemF0aW9uU3VwcG9ydGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBsb2dnZXIuZmluZXN0KCJzdGFydCB0byBpbml0IGNvbXBvbmVudCAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGFSZXN1bHQgPSBnZXRUcmFuc2Zvcm1lZE1ldGFEYXRhRm9yKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIC8vZ2V0IGNvbXBvbmVudCBpbml0aWFsaXplciBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50IGFuZCBjb25maWd1cmUgaXQKLSAgICAgICAgLy9hbHNvIGluIGNhc2Ugb2Ygc2tpcHBlZCB2YWxpZGF0aW9uIHRvIHJlc2V0IGUuZy4gdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZQotICAgICAgICBpZighbWV0YURhdGFSZXN1bHQuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBFeHRWYWxVdGlscy5jb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFSZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9nZ2VyLmZpbmVzdCgiaW5pdCBjb21wb25lbnQgb2YgIiArIHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFRyYW5zZm9ybWVkTWV0YURhdGFGb3IoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0VHJhbnNmb3JtZWRNZXRhRGF0YUZvcihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBnZXRNb2R1bGVLZXkoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpCi0gICAgewotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IEV4dFZhbFV0aWxzCi0gICAgICAgICAgICAgICAgLmdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yV2l0aChnZXRQcm9wZXJ0aWVzRm9yQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IodWlDb21wb25lbnQpKTsKLQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZmluZXN0KCJzdGFydCB2YWxpZGF0aW9uIik7Ci0KLSAgICAgICAgICAgIHByb2Nlc3NGaWVsZFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5maW5lc3QoInZhbGlkYXRpb24gZmluaXNoZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JXaXRoKHByb3BlcnRpZXMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NGaWVsZFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7Ci0gICAgICAgIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKTsKLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogcHJvcGVydHlJbmZvcm1hdGlvbi5nZXRNZXRhRGF0YUVudHJpZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOwotCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgaXNWYWxpZGF0aW9uU3RyYXRlZ3lDb21wYXRpYmxlV2l0aFZhbHVlKHZhbGlkYXRpb25TdHJhdGVneSwgY29udmVydGVkT2JqZWN0LCBlbnRyeSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoc2tpcFZhbGlkYXRpb25FdmFsdWF0b3Iuc2tpcFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblN0cmF0ZWd5LCBlbnRyeSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZmluZXN0KCJza2lwIHZhbGlkYXRpb24gb2YgIiArIGVudHJ5LmdldFZhbHVlKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2l0aCAiICsgdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgLy9kb24ndCBicmVhayBtYXliZSB0aGVyZSBhcmUgY29uc3RyYWludHMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCB0aGUgc2tpcC1tZWNoYW5pc20KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbG9nZ2VyLmZpbmVzdCgidmFsaWRhdGUgIiArIGVudHJ5LmdldFZhbHVlKCkgKyAiIHdpdGggIiArIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZighRXh0VmFsVXRpbHMuZXhlY3V0ZUxvY2FsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uLmNsYXNzLmdldE5hbWUoKSwgcHJvcGVydHlJbmZvcm1hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogdmFsaWRhdGlvbgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQW5ub3RhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZXhlY3V0ZUxvY2FsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKHZhbGlkYXRpb25TdHJhdGVneSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lc3QoIm5vIHZhbGlkYXRpb24gc3RyYXRlZ3kgZm91bmQgZm9yICIgKyBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRhdGlvblN0cmF0ZWd5Q29tcGF0aWJsZVdpdGhWYWx1ZSgKLSAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksIE9iamVjdCB2YWx1ZSwgTWV0YURhdGFFbnRyeSBlbnRyeSAvKmZvciBhZGQtb25zKi8pCi0gICAgewotICAgICAgICBpZih2YWx1ZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3ModmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkpOwotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLmlzQW5ub3RhdGlvblByZXNlbnQoTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICEiIi5lcXVhbHModmFsdWUpIHx8IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3ModmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkpCi0gICAgICAgICAgICAgICAgLmlzQW5ub3RhdGlvblByZXNlbnQoRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICAvKioKLSAgICAgKiB0byBlbnN1cmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGludGVycHJldEVtcHR5U3RyaW5nVmFsdWVzQXNOdWxsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWNvcmRQcm9jZXNzZWRJbmZvcm1hdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Zpb2xhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Zpb2xhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNGIxZjYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WaW9sYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogVGhpcyB2YWxpZGF0aW9uLWV4Y2VwdGlvbiBpbnRlcmNlcHRvciBzZXRzIHRoZSB2YWxpZCBwcm9wZXJ0eSBvZiB0aGUgdWlDb21wb25lbnQgdG8gZmFsc2UsDQotICogaWYgaXQgaXMgYSBibG9ja2luZyBzZXZlcml0eS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBWaW9sYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLXsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgIHsNCi0gICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlciAmJiBpc0Jsb2NraW5nRXhjZXB0aW9uKHVpQ29tcG9uZW50LCB2YWxpZGF0b3JFeGNlcHRpb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vYnYgaW50ZWdyYXRpb24gZG9lc24ndCB0aHJvdyBleGNlcHRpb25zIHRvIHN1cHBvcnQgbXVsdGlwbGUgbWVzc2FnZXMgLT4gc2V0IGNvbXBvbmVudCBzdGF0ZQ0KLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0VmFsaWQoZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQmxvY2tpbmdFeGNlcHRpb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCkuc2V2ZXJpdHlDYXVzZXNWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Zpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Zpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZGI0YzMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WaW9sYXRpb25TZXZlcml0eVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoOTApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmlvbGF0aW9uU2V2ZXJpdHlWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZihpc0V4dFZhbE1ldGFEYXRhKG1ldGFEYXRhRW50cnkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvUGxhY2VTZXZlcml0eSh2YWxpZGF0b3JFeGNlcHRpb24sIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRXh0VmFsTWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQW5ub3RhdGlvbjsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9QbGFjZVNldmVyaXR5KFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgZm9yKEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSA6IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKQ0KLSAgICAgICAgICAgICAgICAuZXh0cmFjdChhbm5vdGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihWaW9sYXRpb25TZXZlcml0eS5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5LmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkuc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNmZlZGIuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLS8qKg0KLSAqIEEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiBhIGN1c3RvbSBuYW1lIG1hcHBlciB0aGF0IGNhbiBiZSBjb25maWd1cmVkIHVzaW5nIGNvbmZpZ3VyYXRpb24uIFN1YmNsYXNzZXMganVzdCBoYXZlDQotICogdG8gc3BlY2lmeSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNvbmZpZ3VyZWQgbmFtZSBtYXBwZXIuDQotICoNCi0gKiBOYW1lTWFwcGVycyBhcmUgc3RhdGVsZXNzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFQ+IGltcGxlbWVudHMgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgcHJpdmF0ZSBOYW1lTWFwcGVyPFQ+IGN1c3RvbU5hbWVNYXBwZXI7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBsb2dnZXIuZmluZShnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHtAaW5oZXJpdERvY30NCi0gICAgICogV2hlbiBubyBuYW1lIG1hcHBlciBpcyBjb25maWd1cmVkLCB0aGUgbWV0aG9kIHJldHVybnMgbnVsbC4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShUIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGN1c3RvbU5hbWVNYXBwZXIgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpOw0KLQ0KLSAgICAgICAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU5hbWVNYXBwZXIgPSAoTmFtZU1hcHBlcjxUPikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChjdXN0b21OYW1lTWFwcGVyICE9IG51bGwpID8gY3VzdG9tTmFtZU1hcHBlci5jcmVhdGVOYW1lKHNvdXJjZSkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uZmlndXJlZCBuYW1lIG1hcHBlciB0aGF0IG11c3QgYmUgdXNlZC4NCi0gICAgICoNCi0gICAgICogQHJldHVybiBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGN1c3RvbSBuYW1lIG1hcHBlci4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MzhkMWUuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlclN1cHBvcnQ7DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBuYW1lIG1hcHBlcnMuDQotICogQSBuYW1lIG1hcHBlciBjYWxjdWxhdGVzIGEgbmFtZSBvZiB0aGUgcmVzb3VyY2Ugd2hpY2ggaXMgbGlua2VkIHRvIHRoZSBnaXZlbiBzb3VyY2UuDQotICogZS5nLiBjb25zdHJhaW50cyBhcmUgbWFwcGVkIHRvIHRoZSBjb3JyZXNwb25kaW5nDQotICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5fS4NCi0gKiBOYW1lTWFwcGVycyBoYXZlIHRvIGJlIHN0YXRlbGVzcy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCByZXNvdXJjZSBmb3IgdGhlIGdpdmVuIHNvdXJjZSBvciBudWxsIGlmIHRoZSBpbXBsZW1lbnRhdGlvbnMgaXNuJ3QgcmVzcG9uc2libGUNCi0gICAgICogdG8gbWFwIHRoZSBnaXZlbiBpbnN0YW5jZS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHNvdXJjZSBPYmplY3QgZm9yIHdoaWNoIHRoZSBuYW1lIG11c3QgYmUgY3JlYXRlZC4NCi0gICAgICogQHJldHVybiBuYW1lIG9mIHRoZSB0YXJnZXQgcmVzb3VyY2Ugb3IgbnVsbCBpZiB0aGUgc291cmNlIGlzbid0IHN1cHBvcnRlZC4NCi0gICAgICovDQotICAgIFN0cmluZyBjcmVhdGVOYW1lKFQgc291cmNlKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9TdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg5Y2Y5OS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9TdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSBmb3IgbmFtZS1tYXBwZXJzIHdoaWNoIGhhdmUgdG8gZGVsZWdhdGUgdG8gb3RoZXIgKHN1Yi0pbmFtZS1tYXBwZXJzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXI8VD4gZXh0ZW5kcyBOYW1lTWFwcGVyPFQ+DQotew0KLSAgICAvKioNCi0gICAgICogQWRkIGEgKHN1Yi0pbmFtZSBtYXBwZXINCi0gICAgICogQHBhcmFtIG5hbWVNYXBwZXIgc3ViLW5hbWVNYXBwZXIgdG8gYWRkDQotICAgICAqLw0KLSAgICB2b2lkIGFkZE5hbWVNYXBwZXIoTmFtZU1hcHBlcjxUPiBuYW1lTWFwcGVyKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvQ29tbW9uTWV0YURhdGFLZXlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYWU2MzcuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogaGVscGVyIGZvciBmcmVxdWVudCBtZXRhLWRhdGEga2V5cw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotLyoNCi0gKiBwbGFjZWQgaW4gY29yZSB0byBhdm9pZCBkdXBsaWNhdGVkIGluZm9ybWF0aW9uIGluIG11bHRpcGxlIG1vZHVsZXMgKHZhbGlkYXRpb24gbW9kdWxlIGFuZCBjb21wb25lbnQtc3VwcG9ydCBtb2R1bGUpDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1vbk1ldGFEYXRhS2V5cw0KLXsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRCA9ICJyZXF1aXJlZCI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBS19SRVFVSVJFRCA9ICJ3ZWFrX3JlcXVpcmVkIjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5fTEVOR1RIID0gIm1pbl9sZW5ndGgiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTl9MRU5HVEhfREVGQVVMVCA9ICJtaW5fbGVuZ3RoX2RlZmF1bHQiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9MRU5HVEggPSAibWF4X2xlbmd0aCI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0xFTkdUSF9ERUZBVUxUID0gIm1heF9sZW5ndGhfZGVmYXVsdCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOR0VfTUlOID0gInJhbmdlX21pbiI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOR0VfTUlOX0RFRkFVTFQgPSAicmFuZ2VfbWluX2RlZmF1bHQiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01BWCA9ICJyYW5nZV9tYXgiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01BWF9ERUZBVUxUID0gInJhbmdlX21heF9kZWZhdWx0IjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRURVJOID0gInBhdHRlcm4iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFID0gInBhdHRlcm5fdmFsaWRhdGlvbl9lcnJvcl9tZXNzYWdlIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFTUFJTCA9ICJlbWFpbCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NID0gImN1c3RvbSI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9WQUxJREFUSU9OID0gInNraXBfdmFsaWRhdGlvbiI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRV9DTElFTlRfU0lERV9WQUxJREFUSU9OID0gImRpc2FibGVfY2xpZW50X3NpZGVfdmFsaWRhdGlvbiI7DQotICAgIC8vYXZhaWxhYmxlIGZvciBhZGQtb25zIG5vdCB1c2VkIGludGVybmFsbHkgZHVlIHRvIHBlcmZvcm1hbmNlIHJlYXNvbnMNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFX1NIT1dfSU5ESUNBVElPTiA9ICJkaXNhYmxlX3Nob3dfaW5kaWNhdGlvbiI7DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvTWV0YURhdGFFbnRyeS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9NZXRhRGF0YUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjOGNjNTkuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9NZXRhRGF0YUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi0vKioKLSAqIERhdGEgaG9sZGVyIHdoaWNoIHN0b3JlcyB0aGUgbWV0YS1kYXRhIGFuZCBzb21lIGluZm9ybWF0aW9uIHdoZXJlIHRoZSBtZXRhLWRhdGEgd2FzIGZvdW5kLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIE1ldGFEYXRhRW50cnkKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcga2V5OwotICAgIHByaXZhdGUgT2JqZWN0IHZhbHVlOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgd2hpY2ggaWRlbnRpZmllcyB0aGUgbWV0YS1kYXRhLgotICAgICAqCi0gICAgICogQHJldHVybiBrZXkgb2YgdGhlIG1ldGEtZGF0YS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gICAgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGtleSBvZiB0aGUgbWV0YS1kYXRhLgotICAgICAqIEl0J3Mgc3VnZ2VzdGVkIHRvIHVzZSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBjb25zdHJhaW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSB2YWx1ZSBpZGVudGlmaWVzIHRoZSB0aGUgbWV0YS1kYXRhIHN0b3JlZCBpbiB0aGUgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICB0aGlzLmxvZ2dlci5maW5lc3QoInNldHRpbmcgbWV0YS1kYXRhIGtleTogIiArIGtleSk7Ci0KLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YS1kYXRhIG9yIGEgZGF0YS1zdHJ1Y3R1cmUgd2hpY2ggcmVwcmVzZW50cyB0aGUgbWV0YS1kYXRhLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbWV0YS1kYXRhIG9yIGEgZGF0YS1zdHJ1Y3R1cmUgd2hpY2ggcmVwcmVzZW50cyB0aGUgbWV0YS1kYXRhLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEtZGF0YSBvciBhIGRhdGEtc3RydWN0dXJlIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1ldGEtZGF0YS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXJnZXRDbGFzcyBUeXBlIHRvIHdoaWNoIHRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBjYXN0ZWQuCi0gICAgICogQHBhcmFtIDxUPiBnZW5lcmljIHR5cGUKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhLWRhdGEgb3IgYSBkYXRhLXN0cnVjdHVyZSB3aGljaCByZXByZXNlbnRzIHRoZSBtZXRhLWRhdGEuCi0gICAgICovCi0gICAgcHVibGljIDxUPiBUIGdldFZhbHVlKENsYXNzPFQ+IHRhcmdldENsYXNzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUKWdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIG1ldGEtZGF0YSBob2xkIGJ5IHRoaXMgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSBtZXRhLWRhdGEgaG9sZCBieSB0aGlzIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMubG9nZ2VyLmZpbmVzdCgic2V0dGluZyBtZXRhLWRhdGEgdmFsdWU6ICIgKyB2YWx1ZSk7Ci0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1hcCB3aGljaCBjb250YWlucyBmdXJ0aGVyIHByb3BlcnRpZXMgd2hpY2ggYXJlIGxpbmtlZCB0byB0aGUgbWV0YS1kYXRhLgotICAgICAqCi0gICAgICogQHBhcmFtIHByb3BlcnRpZXMgcHJvcGVydGllcyB3aGljaCBhcmUgbGlua2VkIHRvIHRoZSBtZXRhLWRhdGEuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb3BlcnR5LXZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkta2V5LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBrZXkgdmFsdWUgdXNlZCB0byBpZGVudGlmeSB0aGUgcHJvcGVydHkgdmFsdWUuCi0gICAgICogQHJldHVybiBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eS12YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LWtleS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkga2V5IHdoaWNoIGlkZW50aWZpZXMgYSBwcm9wZXJ0eQotICAgICAqIEBwYXJhbSB0YXJnZXRDbGFzcyBUeXBlIHRvIHdoaWNoIHRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBjYXN0ZWQuCi0gICAgICogQHBhcmFtIDxUPiBHZW5lcmljIHR5cGUKLSAgICAgKiBAcmV0dXJuIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGtleS4KLSAgICAgKi8KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpZ2V0UHJvcGVydHkoa2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwcm9wZXJ0eS12YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LWtleS4KLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXN9Ci0gICAgICogY29udGFpbnMgdGhlIGtleXMgdXNlZCBieSBFeHRWYWwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IGtleSB2YWx1ZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBwcm9wZXJ0eSB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgcHJvcGVydHkgdmFsdWUgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMubG9nZ2VyLmZpbmVzdCgibmV3IHByb3BlcnR5IGFkZGVkIGtleTogIiArIGtleSArICIgdmFsdWU6ICIgKyB2YWx1ZSArICIgZm9yIG1ldGFkYXRhLWtleTogIiArIHRoaXMua2V5KTsKLQotICAgICAgICB0aGlzLnByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzID09IG8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNZXRhRGF0YUVudHJ5KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgTWV0YURhdGFFbnRyeSB0aGF0ID0gKE1ldGFEYXRhRW50cnkpIG87Ci0KLSAgICAgICAgaWYgKGtleSAhPSBudWxsID8gIWtleS5lcXVhbHModGhhdC5rZXkpIDogdGhhdC5rZXkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwgPyAhcHJvcGVydGllcy5lcXVhbHModGhhdC5wcm9wZXJ0aWVzKSA6IHRoYXQucHJvcGVydGllcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgPyAhdmFsdWUuZXF1YWxzKHRoYXQudmFsdWUpIDogdGhhdC52YWx1ZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKLSAgICB7Ci0gICAgICAgIGludCByZXN1bHQgPSBrZXkgIT0gbnVsbCA/IGtleS5oYXNoQ29kZSgpIDogMDsKLSAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAodmFsdWUgIT0gbnVsbCA/IGNyZWF0ZU51bGxBd2FyZUhhc2hDb2RlKHZhbHVlKSA6IDApOwotICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChwcm9wZXJ0aWVzICE9IG51bGwgPyBjcmVhdGVOdWxsQXdhcmVIYXNoQ29kZShwcm9wZXJ0aWVzKSA6IDApOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGNyZWF0ZU51bGxBd2FyZUhhc2hDb2RlKE9iamVjdCBvKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBvLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNhZGEwMS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhbGwgZmFjdG9yaWVzIHdoaWNoIGNyZWF0ZSBtZXRhLWRhdGEgZXh0cmFjdG9ycy4KLSAqIAotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeQotewotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBNZXRhRGF0YUV4dHJhY3Rvci4gVGhlIGZhY3Rvcnkgc2hvdWxkIGNhY2hlIHRoZSByZXN1bHQgaW5zdGFuY2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCi0gICAgICogQHJldHVybiBNZXRhRGF0YUV4dHJhY3Rvci4KLSAgICAgKi8KLSAgICBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBNZXRhRGF0YUV4dHJhY3RvciB0aGF0IGFkZCB0aGUgc3VwcGxpZWQgcHJvcGVydGllcyB0byB0aGUgUHJvcGVydHlJbmZvcm1hdGlvbiBvYmplY3QgZHVyaW5nIGV4dHJhY3Rpb24KLSAgICAgKiBvZiB0aGUgaW5mb3JtYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvcGVydGllcyBQcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgaW5mb3JtYXRpb24uCi0gICAgICogQHJldHVybiBNZXRhRGF0YUV4dHJhY3Rvci4KLSAgICAgKi8KLSAgICBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGVXaXRoKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyk7Ci19CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGUwYjQ3Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NZXRhRGF0YVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbEFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOwotCi0vKioKLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggZXh0cmFjdHMgbWV0YS1kYXRhIChlLmcuIHRoZSBhbm5vdGF0aW9ucykgb2YgdGhlIHZhbHVlIGJpbmRpbmcgb2YgYSBjb21wb25lbnQuCi0gKiBJdCBleHRyYWN0cyB0aGUgbWV0YS1kYXRhIG9mIHRoZSBmaWVsZCBhbmQgdGhlIHByb3BlcnR5LgotICogKEFsc28gdGhlIGFubm90YXRpb25zIG9mIHN1cGVyIGNsYXNzZXMgYW5kIGludGVyZmFjZXMuKQotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0b3IKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCi0gICAgcHVibGljIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcigpCi0gICAgewotICAgICAgICBsb2dnZXIuZmluZShnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgfQotCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQotICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICAgIC8vc2hvdWxkIG5ldmVyIG9jY3VyCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG9iamVjdCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm5pbmcob2JqZWN0LmdldENsYXNzKCkgKyAiIGlzIG5vIHZhbGlkIGNvbXBvbmVudCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQgPSAoVUlDb21wb25lbnQpIG9iamVjdDsKLQotICAgICAgICBsb2dnZXIuZmluZXN0KCJzdGFydCBleHRyYWN0aW5nIG1ldGEtZGF0YSBvZiAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAocHJvcGVydHlEZXRhaWxzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGdldCBiZWFuIGNsYXNzIGFuZCBwcm9wZXJ0eSBuYW1lCi0gICAgICAgICAqLwotICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpKTsKLQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBnZXRQcm9wZXJ0eUluZm9ybWF0aW9uKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMpOwotCi0gICAgICAgIGxvZ2dlci5maW5lc3QoImV4dHJhY3QgZmluaXNoZWQiKTsKLQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUHJvcGVydHlJbmZvcm1hdGlvbiBnZXRQcm9wZXJ0eUluZm9ybWF0aW9uKENsYXNzIGVudGl0eUNsYXNzLCBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzKQotICAgIHsKLSAgICAgICAgTWV0YURhdGFTdG9yYWdlIHN0b3JhZ2UgPSBnZXRNZXRhRGF0YVN0b3JhZ2UoKTsKLQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsKLQotICAgICAgICBpZiAoaXNDYWNoZWQoc3RvcmFnZSwgZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy9jcmVhdGUKLSAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uc2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsKLQotICAgICAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkgOiBnZXRDYWNoZWRNZXRhRGF0YShzdG9yYWdlLCBlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uYWRkTWV0YURhdGFFbnRyeShtZXRhRGF0YUVudHJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24gPSBFeHRWYWxBbm5vdGF0aW9uVXRpbHMuZXh0cmFjdEFubm90YXRpb25zKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMpOwotICAgICAgICAgICAgY2FjaGVNZXRhRGF0YShzdG9yYWdlLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NhY2hlZChNZXRhRGF0YVN0b3JhZ2Ugc3RvcmFnZSwgQ2xhc3MgZW50aXR5Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzdG9yYWdlLmNvbnRhaW5zTWV0YURhdGFGb3IoZW50aXR5Q2xhc3MsIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjYWNoZU1ldGFEYXRhKE1ldGFEYXRhU3RvcmFnZSBzdG9yYWdlLCBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBzdG9yYWdlLnN0b3JlTWV0YURhdGFPZihwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWV0YURhdGFFbnRyeVtdIGdldENhY2hlZE1ldGFEYXRhKE1ldGFEYXRhU3RvcmFnZSBzdG9yYWdlLCBDbGFzcyBlbnRpdHlDbGFzcywgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIHN0b3JhZ2UuZ2V0TWV0YURhdGEoZW50aXR5Q2xhc3MsIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWV0YURhdGFTdG9yYWdlIGdldE1ldGFEYXRhU3RvcmFnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShNZXRhRGF0YVN0b3JhZ2UuY2xhc3MsIE1ldGFEYXRhU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE5MzUxMi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvcmVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotLyoqCi0gKiBUaGlzIGZhY3RvcnkgY3JlYXRlcyBhIG1ldGEtZGF0YSBleHRyYWN0b3Igd2hpY2ggZXh0cmFjdHMgdGhlIG1ldGEtZGF0YQotICogb2YgdGhlIHZhbHVlIGJpbmRpbmcgb2YgYSBjb21wb25lbnQuCi0gKiA8cC8+Ci0gKiBvcmRlcjo8YnIvPgotICogPG9sPgotICogICA8bGk+Y29uZmlndXJlZCBtZXRhLWRhdGEgZXh0cmFjdG9yICh3ZWIueG1sKTwvbGk+Ci0gKiAgIDxsaT5jb25maWd1cmVkIG1ldGEtZGF0YSBleHRyYWN0b3IgKGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pPC9saT4KLSAqICAgPGxpPmRlZmF1bHQgaW1wbGVtZW50YXRpb248L2xpPgotICogPC9vbD4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkKLXsKLSAgICBwcml2YXRlIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQotICAgIHByaXZhdGUgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gbnVsbDsKLQotICAgIHB1YmxpYyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIGxvZ2dlci5maW5lKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICB9Ci0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpCi0gICAgcHVibGljIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gY3JlYXRlV2l0aChudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlV2l0aChNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICBpZiAobWV0YURhdGFFeHRyYWN0b3IgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMuYWRkKEV4dFZhbENvcmVDb25maWd1cmF0aW9uLmdldCgpLmN1c3RvbUNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IpKTsKLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcy5hZGQoRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3RvciA9IChNZXRhRGF0YUV4dHJhY3RvcikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobWV0YURhdGFFeHRyYWN0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGxvZ2dlci5maW5lc3QobWV0YURhdGFFeHRyYWN0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGNyZWF0ZWQiKTsKLQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvcldpdGgobWV0YURhdGFFeHRyYWN0b3IsIHByb3BlcnRpZXMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL01ldGFEYXRhRXh0cmFjdG9yLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9NZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmQ2ZTIwLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL01ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci0KLS8qKgotICogQSBtZXRhLWRhdGEgZXh0cmFjdG9yIGlzIHJlc3BvbnNpYmxlIHRvIGFuYWx5emUgYW4gb2JqZWN0IChlLmcuIFVJQ29tcG9uZW50KQotICogYW5kIHJldHVybnMgYWxsIGF2YWlsYWJsZSBtZXRhLWRhdGEgaW5mb3JtYXRpb24uCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBzaG91bGQgcHJvdmlkZSB0aGUgcG9zc2liaWxpdHkgdG8gZmlsdGVyIHRoZSBmb3VuZCBtZXRhLWRhdGEgZS5nLiB2aWEKLSAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLk1ldGFEYXRhU3RvcmFnZUZpbHRlcn0KLSAqIAotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhRXh0cmFjdG9yCi17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgVGhlIEpTRiBGYWNlcyBDb250ZXh0Ci0gICAgICogQHBhcmFtIG9iamVjdCBlLmcuIGFuIGluc3RhbmNlIG9mIHtAbGluayBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnR9IHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIGV4dHJhY3QKLSAgICAgKiB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIGJvdW5kIHByb3BlcnR5LgotICAgICAqIEByZXR1cm4gIEFsbCB0aGUgZXNzZW50aWFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBib3VuZCBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJmMGI1OS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSBlcXVpdmFsZW50IHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0LiBJdCBpcyBub3QgbGlua2VkIHRvIGpzcjMwMy4NCi0gKg0KLSAqIGlmIHRoZXJlIGlzIGFsc28gYSBwcm94eSBmb3IgdGhlIGV4dHJhY3RvciB5b3UgY2FuIHVzZSB0aGUgY2xhc3NOYW1lIHByb3BlcnR5IHRvIG1hbnVhbGx5IHJlcGVhdCB0aGUNCi0gKiBmdWxsIHF1YWxpZmllZCBjbGFzcyBuYW1lLg0KLSAqDQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkhJR0gsIGRlc2NyaXB0aW9uID0gInNlZSBFWFRWQUwtMTE2IikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGludGVyZmFjZSBCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIgZXh0ZW5kcyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgTWV0YURhdGFUcmFuc2Zvcm1lciBjbGFzcyBuYW1lLg0KLSAgICAgKiBAcmV0dXJuIENsYXNzIG5hbWUgb2YgdGhlIE1ldGFEYXRhVHJhbnNmb3JtZXINCi0gICAgICovDQotICAgIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbC5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZWIxYTkuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgZXF1aXZhbGVudCB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4gSXQgaXMgbm90IGxpbmtlZCB0byBqc3IzMDMuDQotICoNCi0gKiBpZiB0aGVyZSBpcyBhbHNvIGEgcHJveHkgZm9yIHRoZSB0cmFuc2Zvcm1lciB5b3UgY2FuIHVzZSB0aGUgY2xhc3NOYW1lIHByb3BlcnR5IHRvIG1hbnVhbGx5IHJlcGVhdCB0aGUNCi0gKiBmdWxsIHF1YWxpZmllZCBjbGFzcyBuYW1lLg0KLSAqDQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkhJR0gsIGRlc2NyaXB0aW9uID0gInNlZSBFWFRWQUwtMTE2IikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGNsYXNzIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyLCBCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICBwcml2YXRlIFN0cmluZyBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lOw0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiBEZWxlZ2F0ZXMgdGhlIGNvbnZlcnNpb24gb2YgdGhlIE1ldGFEYXRhIHRvIHRoZSBtZXRhRGF0YVRyYW5zZm9ybWVyIGVuY2Fwc3VsYXRlZCBieSB0aGUgYWRhcHRlci4NCi0gICAgICovDQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKG1ldGFEYXRhRW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoU3RyaW5nIG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSA9IG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhVHJhbnNmb3JtZXIoTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXIgPSBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDBmZDczLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LklkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5TdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLk5lc3RlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlci4NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuTnVsbFZhbHVlQXdhcmVDb25jdXJyZW50SGFzaE1hcDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0NCi0vKioNCi0gKiBGYWN0b3J5IHdoaWNoIGNyZWF0ZXMgdGhlIE1ldGFEYXRhVHJhbnNmb3JtZXIgZm9yIGEgZ2l2ZW4gVmFsaWRhdGlvblN0cmF0ZWd5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIFZhbGlkYXRpb25TdHJhdGVneSAtPiBNZXRhRGF0YVRyYW5zZm9ybWVyIGluc3RlYWQgb2YgTWV0YS1EYXRhIC0+IE1ldGFEYXRhVHJhbnNmb3JtZXINCi0gKiB0byBhdm9pZCBhIHNlY29uZCBzdGF0aWMgbWFwcGluZyBlLmcuIGZvciBqcGEgYW5ub3RhdGlvbnMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLSAgICAgICAgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWV0YURhdGFUcmFuc2Zvcm1lcj4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nOw0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBuYW1lTWFwcGVyTGlzdCA9DQotICAgICAgICAgICAgbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gc3ViTmFtZU1hcHBlckxpc3QgPQ0KLSAgICAgICAgICAgIG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBsb2dnZXIuZmluZShnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotDQotICAgICAgICAvL3NpbmNlIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBzdGFydHVwIGxpc3RlbmVyIG9mIHRoZSBjb3JlIGdldHMgZXhlY3V0ZWQgZmlyc3QNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgY3JlYXRlKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lID0gY3JlYXRlVmFsaWRhdGlvblN0cmF0ZWd5TmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgdHJ5VG9Jbml0U3RhdGljTWFwcGluZ3MoKTsNCi0NCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lciA9DQotICAgICAgICAgICAgICAgIHRyeVRvUmVzb2x2ZUNhY2hlZE1ldGFEYXRhVHJhbnNmb3JtZXIodmFsaWRhdGlvblN0cmF0ZWd5LCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0NCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBjcmVhdGVBbmRDYWNoZU1ldGFEYXRhVHJhbnNmb3JtZXIodmFsaWRhdGlvblN0cmF0ZWd5LCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gaXNQcm94eURldGVjdGVkID0gaXNQcm94eSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGEgcHJveHkgYW5kIHRoZSB1c2FnZSBvZiBhIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICAgICAgICBpZiAoaXNQcm94eURldGVjdGVkICYmIHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoKEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKXZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuICFpc1Byb3h5RGV0ZWN0ZWQgPyBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0luaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUHJveHkoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSA9PSBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciBjcmVhdGVBbmRDYWNoZU1ldGFEYXRhVHJhbnNmb3JtZXIoDQotICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgIFN0cmluZyB0cmFuc2Zvcm1lck5hbWU7DQotICAgICAgICAvL251bGwgLT4gdXNlIG5hbWUgbWFwcGVycw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyYW5zZm9ybWVyTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lck5hbWUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyID0gdHJ5VG9DcmVhdGVBbmRDYWNoZU1ldGFEYXRhVHJhbnNmb3JtZXIoDQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3ksIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIHRyYW5zZm9ybWVyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRyeVRvQ3JlYXRlQW5kQ2FjaGVNZXRhRGF0YVRyYW5zZm9ybWVyKHZhbGlkYXRpb25TdHJhdGVneSwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIHRyeVRvUmVzb2x2ZUNhY2hlZE1ldGFEYXRhVHJhbnNmb3JtZXIoDQotICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHZhbGlkYXRpb25TdHJhdGVneU5hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoTWV0YURhdGFUcmFuc2Zvcm1lcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcuZ2V0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgbmV3VmFsaWRhdGlvblN0cmF0ZWd5TmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneU5hbWUgKyBJZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kuSURfUFJFRklYICsNCi0gICAgICAgICAgICAgICAgICAgICgoSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KXZhbGlkYXRpb25TdHJhdGVneSkuZ2V0SWQoKTsNCi0NCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZy5jb250YWluc0tleShuZXdWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiAoTWV0YURhdGFUcmFuc2Zvcm1lcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoDQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLmdldChuZXdWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIHRyeVRvQ3JlYXRlQW5kQ2FjaGVNZXRhRGF0YVRyYW5zZm9ybWVyKA0KLSAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgdHJhbnNmb3JtZXJOYW1lKQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYodHJhbnNmb3JtZXJOYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IChNZXRhRGF0YVRyYW5zZm9ybWVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh0cmFuc2Zvcm1lck5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgKz0gSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5LklEX1BSRUZJWCArDQotICAgICAgICAgICAgICAgICAgICAgICAgKChJZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kpdmFsaWRhdGlvblN0cmF0ZWd5KS5nZXRJZCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBhZGRNYXBwaW5nKHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIHRyYW5zZm9ybWVyTmFtZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcgPQ0KLSAgICAgICAgICAgICAgICBuZXcgTnVsbFZhbHVlQXdhcmVDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oU3RyaW5nLmNsYXNzKTsNCi0NCi0gICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0dXBNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBNYXBwaW5ncyhMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhtYXBwaW5nLmdldFNvdXJjZSgpLCBtYXBwaW5nLmdldFRhcmdldCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0cmFuc2Zvcm1lck5hbWUpDQotICAgIHsNCi0gICAgICAgIGxvZ2dlci5maW5lc3QoImFkZGluZyB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1ldGEtZGF0YSB0cmFuc2Zvcm1lciBtYXBwaW5nOiAiDQotICAgICAgICAgICAgKyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgIiAtPiAiICsgdHJhbnNmb3JtZXJOYW1lKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcucHV0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIHRyYW5zZm9ybWVyTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgU29ydGVkTmFtZU1hcHBlckxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+Pih0aGlzLm5hbWVNYXBwZXJMaXN0LCB0aGlzLnN1Yk5hbWVNYXBwZXJMaXN0KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIHRyeVRvSW5pdE5hbWVNYXBwZXJXaXRoRXhpc3RpbmdTdWJNYXBwZXJzKHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpOw0KLSAgICAgICAgc3VwZXIucmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIGl0J3MgYSB2ZXJ5IHNwZWNpYWwgY2FzZSBkdWUgdG8gdGhlIG1pc3Npbmcgb3JkZXIgaW4gdGhlIGV4ZWN1dGlvbiBvZiBzdGFydHVwLWxpc3RlbmVycyAocGhhc2UgbGlzdGVuZXJzKQ0KLSAgICAgKiBwYWNrYWdlZCBpbiBmYWNlcy1jb25maWcueG1sIGZpbGVzIG9mIGphcnMNCi0gICAgICoNCi0gICAgICogbm9ybWFsbHkgdGhlIGRlZmF1bHQgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyIHNob3VsZCBiZSBlbm91Z2gNCi0gICAgICogYW55d2F5LCBpZiBhIG1vZHVsZSBhZGRzIGEgbmV3IFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlciwNCi0gICAgICogYWxsIHByZXZpb3VzIGFkZGVkIFN1Yk5hbWVNYXBwZXJzIGhhdmUgdG8gYmUgYWRkZWQgdG8gYXZvaWQgY29uZnVzaW9uIGluIHNwZWNpYWwgY2FzZXMuDQotICAgICAqIGlmIGEgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIGZpbmFsIGV4dGVuZCB0aGUgaW50ZXJmYWNlIGFuZCBmaWx0ZXIgaXQgaW4gYWRkTmFtZU1hcHBlcg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgd2hpY2ggaGFzIHRvIGJlIGFkZGVkDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9Jbml0TmFtZU1hcHBlcldpdGhFeGlzdGluZ1N1Yk1hcHBlcnMoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgaW5zdGFuY2VvZiBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yKE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiBuYW1lTWFwcGVyIDogdGhpcy5zdWJOYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKG5hbWVNYXBwZXIuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KE5lc3RlZC5jbGFzcykpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICgoU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4pdmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcikNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZE5hbWVNYXBwZXIobmFtZU1hcHBlcik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRkYWViMy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXIgTWV0YURhdGFUcmFuc2Zvcm1lcnN9DQotICogYXJlIHVzZWQgdG8gY29udmVydCBzcGVjaWZpYyBpbmZvcm1hdGlvbiBvZiBjb25zdHJhaW50cyB0byBhIGdlbmVyaWMgcmVwcmVzZW50YXRpb24uDQotICogU28gaXQncyBwb3NzaWJsZSB0byB0cmFuc2Zvcm0gZGlmZmVyZW50IG1ldGEtZGF0YSBpbXBsZW1lbnRhdGlvbnMgdG8gYW4gaW5kZXBlbmRlbnQgcmVwcmVzZW50YXRpb24uDQotICogRS5nLiBATGVuZ3RoIGFuZCBAU2l6ZSBzcGVjaWZpZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24uDQotICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXIgTWV0YURhdGFUcmFuc2Zvcm1lcnN9DQotICogYXJlIGF3YXJlIG9mIHRoZSBjb25jcmV0ZSBtZXRhLWRhdGEgaW1wbGVtZW50YXRpb24gYnV0IHRoZXkgYXJlbid0IGF3YXJlIG9mIEpTRiBjb21wb25lbnRzLg0KLSAqDQotICogVGhlIHJlc3VsdCBvZiB0aGUgdHJhbnNmb3JtYXRpb24gaXMgdXNlZCBieQ0KLSAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXIgQ29tcG9uZW50SW5pdGlhbGl6ZXJzfQ0KLSAqIHRvIGluaXRpYWxpemUgSlNGIGNvbXBvbmVudHMgYmFzZWQgb24gdGhlIGZvdW5kIG1ldGEtZGF0YS4NCi0gKg0KLSAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXN9IHByb3ZpZGVzIHRoZSBrZXlzIHVzZWQgYnkgRXh0VmFsLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotLy8qVHJhbnNmb3JtZXIgaW5zdGVhZCBvZiAqQ29udmVydGVyIHRvIGF2b2lkIG5hbWluZyBjb25mdXNpb24gDQotcHVibGljIGludGVyZmFjZSBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICAvKioNCi0gICAgICogQ29udmVydHMgdGhlIGluZm9ybWF0aW9uIG9mIGEge0BsaW5rIE1ldGFEYXRhRW50cnl9IGludG8gYW4gaW5kZXBlbmRlbnQgZm9ybWF0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbWV0YURhdGEgVGhlIG1ldGEtZGF0YSB3aGljaCBzaG91bGQgYmUgY29udmVydGVkLg0KLSAgICAgKiBAcmV0dXJuIE1hcCB3aXRoIHRoZSBjb252ZXJ0ZWQgaW5mb3JtYXRpb24uDQotICAgICAqLw0KLSAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9Tb3J0ZWROYW1lTWFwcGVyTGlzdC5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9Tb3J0ZWROYW1lTWFwcGVyTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTY4MWZhLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU29ydGVkTmFtZU1hcHBlckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5TdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLk5lc3RlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7DQotDQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLWNsYXNzIFNvcnRlZE5hbWVNYXBwZXJMaXN0PFQgZXh0ZW5kcyBOYW1lTWFwcGVyPiBleHRlbmRzIENvcHlPbldyaXRlQXJyYXlMaXN0PFQ+DQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxNTAyMTU2OTk5NTk5OTYyMzY1TDsNCi0NCi0gICAgcHJpdmF0ZSBMaXN0PFQ+IHdyYXBwZWQ7DQotICAgIHByaXZhdGUgTGlzdDxUPiBnbG9iYWxTdWJOYW1lTWFwcGVyTGlzdDsNCi0NCi0gICAgU29ydGVkTmFtZU1hcHBlckxpc3QoTGlzdDxUPiB3cmFwcGVkLCBMaXN0PFQ+IHN1Yk5hbWVNYXBwZXJMaXN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOw0KLSAgICAgICAgdGhpcy5nbG9iYWxTdWJOYW1lTWFwcGVyTGlzdCA9IHN1Yk5hbWVNYXBwZXJMaXN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFkZChUIHQpDQotICAgIHsNCi0gICAgICAgIGlmICh0ICE9IG51bGwgJiYgdC5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoTmVzdGVkLmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYWRkU3ViTmFtZU1hcHBlcih0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IHdyYXBwZWQuYWRkKHQpOw0KLQ0KLSAgICAgICAgICAgIHNvcnRXcmFwcGVkTGlzdCgpOw0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNvcnRXcmFwcGVkTGlzdCgpDQotICAgIHsNCi0gICAgICAgIExpc3Q8VD4gc29ydGFibGVMaXN0ID0gbmV3IEFycmF5TGlzdDxUPih3cmFwcGVkKTsNCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoc29ydGFibGVMaXN0LCBuZXcgQ29tcGFyYXRvcjxUPigpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKFQgbm0xLCBUIG5tMikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChubTEgaW5zdGFuY2VvZiBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIgJiYgbm0yIGluc3RhbmNlb2YgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbm0xIGluc3RhbmNlb2YgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyID8gMSA6IC0xOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLSAgICAgICAgd3JhcHBlZC5jbGVhcigpOw0KLSAgICAgICAgd3JhcHBlZC5hZGRBbGwoc29ydGFibGVMaXN0KTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gYWRkU3ViTmFtZU1hcHBlcihUIHN1Yk5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7DQotICAgICAgICBmb3IgKE5hbWVNYXBwZXIgbmFtZU1hcHBlciA6IHRoaXMud3JhcHBlZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAobmFtZU1hcHBlciBpbnN0YW5jZW9mIFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICgoU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyKSBuYW1lTWFwcGVyKS5hZGROYW1lTWFwcGVyKHN1Yk5hbWVNYXBwZXIpOw0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeVRvQWRkTWFwcGVyQXNHbG9iYWxTdWJOYW1lTWFwcGVyKHN1Yk5hbWVNYXBwZXIpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9BZGRNYXBwZXJBc0dsb2JhbFN1Yk5hbWVNYXBwZXIoVCBzdWJOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICBpZighdGhpcy5nbG9iYWxTdWJOYW1lTWFwcGVyTGlzdC5jb250YWlucyhzdWJOYW1lTWFwcGVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmdsb2JhbFN1Yk5hbWVNYXBwZXJMaXN0LmFkZChzdWJOYW1lTWFwcGVyKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBpbnQgc2l6ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnNpemUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaXNFbXB0eSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5jb250YWlucyhvKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSXRlcmF0b3I8VD4gaXRlcmF0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5pdGVyYXRvcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQudG9BcnJheSgpOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiU3VzcGljaW91c1RvQXJyYXlDYWxsIn0pDQotICAgIHB1YmxpYyA8VD4gVFtdIHRvQXJyYXkoVFtdIGEpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnRvQXJyYXkoYSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5yZW1vdmUobyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5jb250YWluc0FsbChjKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVD4gYykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuYWRkQWxsKGMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIFQ+IGMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmFkZEFsbChpbmRleCwgYyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVtb3ZlQWxsKGMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnJldGFpbkFsbChjKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpDQotICAgIHsNCi0gICAgICAgIHdyYXBwZWQuY2xlYXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVCBnZXQoaW50IGluZGV4KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXQoaW5kZXgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBUIHNldChpbnQgaW5kZXgsIFQgZWxlbWVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuc2V0KGluZGV4LCBlbGVtZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBUIGVsZW1lbnQpDQotICAgIHsNCi0gICAgICAgIHdyYXBwZWQuYWRkKGluZGV4LCBlbGVtZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVCByZW1vdmUoaW50IGluZGV4KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5yZW1vdmUoaW5kZXgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaW5kZXhPZihvKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5sYXN0SW5kZXhPZihvKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yPFQ+IGxpc3RJdGVyYXRvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmxpc3RJdGVyYXRvcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3I8VD4gbGlzdEl0ZXJhdG9yKGludCBpbmRleCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQubGlzdEl0ZXJhdG9yKGluZGV4KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxUPiBzdWJMaXN0KGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5zdWJMaXN0KGZyb21JbmRleCwgdG9JbmRleCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwYWViOC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpDQotICAgIHsNCi0gICAgICAgIGxvZ2dlci5maW5lKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMxYjEwOS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgLSBpZiB0aGVyZSBpcyBhIHByb3h5IGFyb3VuZCB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuSElHSCwgZGVzY3JpcHRpb24gPSAic2VlIEVYVFZBTC0xMTYiKQ0KLUBJbnZvY2F0aW9uT3JkZXIoNTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKChCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcil2YWxpZGF0aW9uU3RyYXRlZ3kpLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWJiY2QxLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKiAoY29uZmlndXJlZCB2aWEgd2ViLnhtbCkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb3JlQ29uZmlndXJhdGlvbi5nZXQoKS5jdXN0b21WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyQ2xhc3NOYW1lKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZDA4MGYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1ldGFEYXRhVHJhbnNmb3JtZXJzLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZTg1MGQuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIG1hcHMgRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1ldGFEYXRhVHJhbnNmb3JtZXJzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigzMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcyA9DQotICAgICAgICAgICAgICAgIFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3ModmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksIFZhbGlkYXRpb25TdHJhdGVneS5jbGFzcyk7DQotDQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsDQotICAgICAgICAgICAgICAgIGdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXRTaW1wbGVOYW1lKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmMTc1Yy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgdG8gcGxhY2UgVmFsaWRhdGlvblN0cmF0ZWdpZXMgYW5kIE1ldGFEYXRhVHJhbnNmb3JtZXJzIGluIHRoZSBzYW1lIHBhY2thZ2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDQwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcyA9DQotICAgICAgICAgICAgICAgIFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3ModmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksIFZhbGlkYXRpb25TdHJhdGVneS5jbGFzcyk7DQotDQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXRQYWNrYWdlKCkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBnZXRTaW1wbGVNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpICsgIi4iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLmdldFNpbXBsZU5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTaW1wbGVNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwb3N0Zml4ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVgpOw0KLQ0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmVuZHNXaXRoKCJWYWxpZGF0aW9uU3RyYXRlZ3kiKSB8fA0KLSAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmVuZHNXaXRoKCJTdHJhdGVneSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lQYWNrYWdlTmFtZSArIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYKSAscG9zdGZpeCkNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCJWYWxpZGF0aW9uU3RyYXRlZ3kiLCBwb3N0Zml4KQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoIlN0cmF0ZWd5IiwgcG9zdGZpeCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2luIGNhc2Ugb2YgYSBzdGF0aWMgdmFsaWRhdGlvbiBzdHJhdGVneSBtYXBwaW5nDQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUgKyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgKyBwb3N0Zml4Ow0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1ZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYmY4YTguLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5OZXN0ZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlckNvbXBhcmF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXINCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgaW1wbGVtZW50cyBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gc3ViTmFtZU1hcHBlcnMgPQ0KLSAgICAgICAgICAgIG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZE5hbWVNYXBwZXIoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IG5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIGlmKCF0aGlzLnN1Yk5hbWVNYXBwZXJzLmNvbnRhaW5zKG5hbWVNYXBwZXIpICYmIG5hbWVNYXBwZXIuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KE5lc3RlZC5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5zdWJOYW1lTWFwcGVycy5hZGQobmFtZU1hcHBlcik7DQotICAgICAgICAgICAgc29ydFN1Yk5hbWVNYXBwZXJzKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNvcnRTdWJOYW1lTWFwcGVycygpDQotICAgIHsNCi0gICAgICAgIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBzb3J0YWJsZUxpc3QgPQ0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4odGhpcy5zdWJOYW1lTWFwcGVycyk7DQotDQotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHNvcnRhYmxlTGlzdCwgbmV3IEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PigpKTsNCi0NCi0gICAgICAgIHN1Yk5hbWVNYXBwZXJzLmNsZWFyKCk7DQotICAgICAgICBzdWJOYW1lTWFwcGVycy5hZGRBbGwoc29ydGFibGVMaXN0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7DQotDQotICAgICAgICBmb3IoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IG1hcHBlciA6IHRoaXMuc3ViTmFtZU1hcHBlcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gbWFwcGVyLmNyZWF0ZU5hbWUoc291cmNlKTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYzQyNWUuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbiBpbXBsZW1lbnRzIFByb3BlcnR5SW5mb3JtYXRpb24KLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGluZm9ybWF0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhRW50cnk+IG1ldGFEYXRhTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFbnRyeT4oKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zSW5mb3JtYXRpb24oU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbk1hcC5jb250YWluc0tleShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbk1hcC5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpIGdldEluZm9ybWF0aW9uKGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy5sb2dnZXIuZmluZXN0KCJuZXcgaW5mb3JtYXRpb24gYWRkZWQga2V5OiAiICsga2V5ICsgIiB2YWx1ZTogIiArIHZhbHVlKTsKLQotICAgICAgICBpbmZvcm1hdGlvbk1hcC5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGFEYXRhRW50cnlbXSBnZXRNZXRhRGF0YUVudHJpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhTGlzdC50b0FycmF5KG5ldyBNZXRhRGF0YUVudHJ5W21ldGFEYXRhTGlzdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXRhRGF0YUVudHJ5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkKLSAgICB7Ci0gICAgICAgIG1ldGFEYXRhRW50cnkuc2V0UHJvcGVydGllcyh0aGlzLmluZm9ybWF0aW9uTWFwKTsKLSAgICAgICAgdGhpcy5tZXRhRGF0YUxpc3QuYWRkKG1ldGFEYXRhRW50cnkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0TWV0YURhdGFFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIHRoaXMubG9nZ2VyLmZpbmVzdCgicmVzZXR0aW5nIG1ldGEtZGF0YSBlbnRyaWVzIik7Ci0KLSAgICAgICAgdGhpcy5tZXRhRGF0YUxpc3QuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCi0gICAgewotICAgICAgICBpZiAodGhpcyA9PSBvKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24pKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbiB0aGF0ID0gKERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKSBvOwotCi0gICAgICAgIGlmICghaW5mb3JtYXRpb25NYXAuZXF1YWxzKHRoYXQuaW5mb3JtYXRpb25NYXApKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtZXRhRGF0YUxpc3QuZXF1YWxzKHRoYXQubWV0YURhdGFMaXN0KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gICAgewotICAgICAgICBpbnQgcmVzdWx0ID0gY3JlYXRlTnVsbEF3YXJlSGFzaENvZGUoaW5mb3JtYXRpb25NYXApOwotICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGNyZWF0ZU51bGxBd2FyZUhhc2hDb2RlKG1ldGFEYXRhTGlzdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgY3JlYXRlTnVsbEF3YXJlSGFzaENvZGUoT2JqZWN0IG8pCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG8uaGFzaENvZGUoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eURldGFpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ1ZTIzNC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eURldGFpbHMKLXsKLSAgICAvL2Zvcm1zIHRoZSBpZCBmb3IgY3Jvc3MtdmFsaWRhdGlvbiB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzCi0gICAgcHJpdmF0ZSBTdHJpbmcga2V5OwotICAgIHByaXZhdGUgT2JqZWN0IGJhc2VPYmplY3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlEZXRhaWxzKFN0cmluZyBrZXksIE9iamVjdCBiYXNlT2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICAgICAgdGhpcy5iYXNlT2JqZWN0ID0gYmFzZU9iamVjdDsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJhc2VPYmplY3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJhc2VPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZU9iamVjdChPYmplY3QgYmFzZU9iamVjdCkKLSAgICB7Ci0gICAgICAgIHRoaXMuYmFzZU9iamVjdCA9IGJhc2VPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzID09IG8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBQcm9wZXJ0eURldGFpbHMpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgdGhhdCA9IChQcm9wZXJ0eURldGFpbHMpIG87Ci0KLSAgICAgICAgaWYgKGJhc2VPYmplY3QgIT0gbnVsbCA/ICFiYXNlT2JqZWN0LmVxdWFscyh0aGF0LmJhc2VPYmplY3QpIDogdGhhdC5iYXNlT2JqZWN0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoa2V5ICE9IG51bGwgPyAha2V5LmVxdWFscyh0aGF0LmtleSkgOiB0aGF0LmtleSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwgPyAhcHJvcGVydHkuZXF1YWxzKHRoYXQucHJvcGVydHkpIDogdGhhdC5wcm9wZXJ0eSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKLSAgICB7Ci0gICAgICAgIGludCByZXN1bHQgPSBrZXkgIT0gbnVsbCA/IGtleS5oYXNoQ29kZSgpIDogMDsKLSAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAoYmFzZU9iamVjdCAhPSBudWxsID8gY3JlYXRlTnVsbEF3YXJlSGFzaENvZGUoYmFzZU9iamVjdCkgOiAwKTsKLSAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAocHJvcGVydHkgIT0gbnVsbCA/IHByb3BlcnR5Lmhhc2hDb2RlKCkgOiAwKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBjcmVhdGVOdWxsQXdhcmVIYXNoQ29kZShPYmplY3QgbykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gby5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOTkzMjguLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci0KLS8qKgotICogQ29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBvZiBhIHByb3BlcnR5Ci0gKiAoZS5nLiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzfSkKLSAqIE1ldGFEYXRhRW50cnkncyBhcmUgY29uc2lkZXJlZCBhcyBhIHNwZWNpYWwga2luZCBvZiBpbmZvcm1hdGlvbiBhbmQgc2VwYXJhdGUgbWV0aG9kcyBhcmUgY3JlYXRlZCBmb3IgdGhlbS4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlJbmZvcm1hdGlvbgotewotICAgIC8qKgotICAgICAqIFZlcmlmaWVzIGlmIHdlIGhhdmUgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBrZXkuCi0gICAgICogU29tZSBwcmVkZWZpbmVkIGtleXMgYXJlIGRlZmluZWQgaW4ge0BsaW5rIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzfS4KLSAgICAgKiBAcGFyYW0ga2V5IGtleSBvZiB0aGUgaW5mb3JtYXRpb24uCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBpbnN0YW5jZSBpcyBhd2FyZSBvZiBhbiBpbmZvcm1hdGlvbiB3aGljaCBpcyBsaW5rZWQgdG8gdGhlIGdpdmVuIGtleQotICAgICAqLwotICAgIGJvb2xlYW4gY29udGFpbnNJbmZvcm1hdGlvbihTdHJpbmcga2V5KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgZ2l2ZW4ga2V5LgotICAgICAqIEBwYXJhbSBrZXkga2V5IGZvciB0aGUgcmVxdWVzdGVkIGluZm9ybWF0aW9uCi0gICAgICogQHJldHVybiB0aGUgb2JqZWN0IChvciBudWxsKSB3aGljaCBpcyBsaW5rZWQgdG8gdGhlIGdpdmVuIGtleQotICAgICAqLwotICAgIE9iamVjdCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5KTsKLQotICAgIC8qKgotICAgICAqIEluIGFkZGl0aW9uIHRvIFByb3BlcnR5SW5mb3JtYXRpb24jZ2V0SW5mb3JtYXRpb24oamF2YS5sYW5nLlN0cmluZykgaXQgY2FzdHMgdG8gdGhlIGdpdmVuIHR5cGUuCi0gICAgICoKLSAgICAgKiBAc2VlIFByb3BlcnR5SW5mb3JtYXRpb24jZ2V0SW5mb3JtYXRpb24oamF2YS5sYW5nLlN0cmluZykKLSAgICAgKiBAcGFyYW0ga2V5IGtleSBmb3IgdGhlIHJlcXVlc3RlZCBpbmZvcm1hdGlvbgotICAgICAqIEBwYXJhbSB0YXJnZXRDbGFzcyB0YXJnZXQgY2xhc3MgdHlwZQotICAgICAqIEBwYXJhbSA8VD4gVHlwZSBkZWNsYXJhdGlvbiBmb3IgZ2VuZXJpY3MuCi0gICAgICogQHJldHVybiB0aGUgb2JqZWN0IChvciBudWxsKSB3aGljaCBpcyBsaW5rZWQgdG8gdGhlIGdpdmVuIGtleQotICAgICAqLwotICAgIDxUPiBUIGdldEluZm9ybWF0aW9uKFN0cmluZyBrZXksIENsYXNzPFQ+IHRhcmdldENsYXNzKTsKLQotICAgIC8qKgotICAgICAqIFN0b3JlcyB0aGUgZ2l2ZW4gdmFsdWUgYW5kIGxpbmtzIGl0IHRvIHRoZSBnaXZlbiBrZXkuCi0gICAgICogQHBhcmFtIGtleSBrZXkgb2YgdGhlIGluZm9ybWF0aW9uLgotICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSBhcyBpbmZvcm1hdGlvbiBmb3IgdGhlIGtleS4KLSAgICAgKi8KLSAgICB2b2lkIHNldEluZm9ybWF0aW9uKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGltbXV0YWJsZSBhcnJheSB3aGljaCBjb250YWlucyB0aGUKLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeX1zIHdoaWNoIHdlcmUgY3JlYXRlZCBmb3IgdGhlIHByb3BlcnR5LgotICAgICAqIEByZXR1cm4gYWxsIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5fXMKLSAgICAgKi8KLSAgICBNZXRhRGF0YUVudHJ5W10gZ2V0TWV0YURhdGFFbnRyaWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBnaXZlbiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeX0KLSAgICAgKiBAcGFyYW0gbWV0YURhdGFFbnRyeSB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeX0gdG8gc3RvcmUuCi0gICAgICovCi0gICAgdm9pZCBhZGRNZXRhRGF0YUVudHJ5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSk7Ci0KLSAgICAvKioKLSAgICAgKiByZW1vdmVzIGFsbCB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeX1zLgotICAgICAqLwotICAgIHZvaWQgcmVzZXRNZXRhRGF0YUVudHJpZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZlZjQzMC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzCi17Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ERVRBSUxTID0gInByb3BlcnR5X2RldGFpbHMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9WQUxJREFUSU9OID0gInNraXBfdmFsaWRhdGlvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJsYWJlbCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fUFJPUEVSVElFUyA9ICJjdXN0b21fcHJvcGVydGllcyI7Ci19CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L0RlZmF1bHRQcm94eUhlbHBlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm94eS9EZWZhdWx0UHJveHlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYxYjE1NC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L0RlZmF1bHRQcm94eUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIFN1cHBvcnRzIENHTElCIGFuZCBqYXZhc3Npc3QuDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb3h5SGVscGVyIGltcGxlbWVudHMgUHJveHlIZWxwZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0UHJveHlIZWxwZXIoKQ0KLSAgICB7DQotICAgICAgICBsb2dnZXIuZmluZShnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIDxUPiBDbGFzczxUPiBnZXRVbnByb3hpZWRDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MsIENsYXNzPFQ+IHRhcmdldFR5cGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoQ2xhc3M8VD4pZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudENsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VW5wcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZihpc1Byb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVPZkNsYXNzKENsYXNzIGN1cnJlbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYgKGlzUHJveGllZENsYXNzKGN1cnJlbnRDbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzcy5nZXROYW1lKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWVPZk9iamVjdChPYmplY3Qgb2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZihvYmplY3QgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0TmFtZU9mQ2xhc3Mob2JqZWN0LmdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRFbmhhbmNlckJ5Q0dMSUIkJCIpIHx8DQotICAgICAgICAgICAgY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRGYXN0Q2xhc3NCeUNHTElCJCQiKSB8fA0KLSAgICAgICAgICAgIGN1cnJlbnRDbGFzcy5nZXROYW1lKCkuY29udGFpbnMoIl8kJF9qYXZhc3Npc3QiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3hpZWRPYmplY3QoT2JqZWN0IHByb3hpZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm94aWVkT2JqZWN0ICE9IG51bGwgJiYgaXNQcm94aWVkQ2xhc3MocHJveGllZE9iamVjdC5nZXRDbGFzcygpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L1Byb3h5SGVscGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L1Byb3h5SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NzgxN2IuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm94eS9Qcm94eUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBQbHVnZ2FibGUgaGVscGVyIHdoaWNoIGhhbmRsZXMgcHJveGllZCBpbnN0YW5jZXMgY29ycmVjdGx5Lg0KLSAqIChUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBjZ2xpYiBhbmQgamF2YXNzaXN0DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFByb3h5SGVscGVyDQotew0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgb3JpZ2luYWwgY2xhc3MgZm9yIHRoZSBnaXZlbiBjbGFzcyB3aGljaCBtaWdodCBiZSB0aGUgY2xhc3Mgb2YgYSBwcm94aWVkIGluc3RhbmNlLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gY3VycmVudENsYXNzIGNsYXNzIG9mIHByb3h5IGluc3RhbmNlIG9yIGFueSByZWd1bGFyIGNsYXNzLg0KLSAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcyBvZiB0aGUgb3JpZ2luYWwgKHVucHJveGllZCkgaW5zdGFuY2Ugb3IgdGhlIHBhcmFtZXRlciBpdHNlbGYNCi0gICAgICovDQotICAgIENsYXNzIGdldFVucHJveGllZENsYXNzKENsYXNzIGN1cnJlbnRDbGFzcyk7DQotDQotICAgIC8qKg0KLSAgICAgKiBJbiBhZGRpdGlvbiB0byBQcm94eUhlbHBlciNnZXRVbnByb3hpZWRDbGFzcyhqYXZhLmxhbmcuQ2xhc3MpIGl0IGNhc3RzIHRvIHRoZSBnaXZlbiB0eXBlLg0KLSAgICAgKiBAc2VlIFByb3h5SGVscGVyI2dldFVucHJveGllZENsYXNzKGphdmEubGFuZy5DbGFzcykNCi0gICAgICoNCi0gICAgICogQHBhcmFtIGN1cnJlbnRDbGFzcyBjbGFzcyBvZiBwcm94eSBpbnN0YW5jZSBvciBhbnkgcmVndWxhciBjbGFzcy4NCi0gICAgICogQHBhcmFtIHRhcmdldFR5cGUgdGFyZ2V0IGNsYXNzIHR5cGUNCi0gICAgICogQHBhcmFtIDxUPiBUeXBlIGRlY2xhcmF0aW9uIGZvciBnZW5lcmljcy4NCi0gICAgICogQHJldHVybiB0aGUgY2xhc3Mgb2YgdGhlIG9yaWdpbmFsICh1bnByb3hpZWQpIGluc3RhbmNlIG9yIHRoZSBwYXJhbWV0ZXIgaXRzZWxmDQotICAgICAqLw0KLSAgICA8VD4gQ2xhc3M8VD4gZ2V0VW5wcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzLCBDbGFzczxUPiB0YXJnZXRUeXBlKTsNCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIG9yaWdpbmFsIGZ1bGx5IHF1YWxpZmllZCBjbGFzcy1uYW1lIGZvcg0KLSAgICAgKiB0aGUgZ2l2ZW4gY2xhc3Mgd2hpY2ggbWlnaHQgYmUgdGhlIGNsYXNzIG9mIGEgcHJveGllZCBpbnN0YW5jZS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHByb3hpZWRDbGFzcyBjbGFzcyBvZiBwcm94eSBpbnN0YW5jZSBvciBhbnkgcmVndWxhciBjbGFzcy4NCi0gICAgICogQHJldHVybiB0aGUgY2xhc3MtbmFtZSBvZiB0aGUgb3JpZ2luYWwgKHVucHJveGllZCkgaW5zdGFuY2Ugb3IgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpdHNlbGYNCi0gICAgICovDQotICAgIFN0cmluZyBnZXROYW1lT2ZDbGFzcyhDbGFzcyBwcm94aWVkQ2xhc3MpOw0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgb3JpZ2luYWwgZnVsbHkgcXVhbGlmaWVkIGNsYXNzLW5hbWUgZm9yDQotICAgICAqIHRoZSBnaXZlbiBvYmplY3Qgd2hpY2ggbWlnaHQgYmUgYSBwcm94aWVkIGluc3RhbmNlLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcHJveGllZE9iamVjdCBwcm94eSBpbnN0YW5jZSBvciBhbnkgcmVndWxhciBvYmplY3QuDQotICAgICAqIEByZXR1cm4gdGhlIGNsYXNzLW5hbWUgb2YgdGhlIG9yaWdpbmFsICh1bnByb3hpZWQpIGluc3RhbmNlIG9yIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgaXRzZWxmDQotICAgICAqLw0KLSAgICBTdHJpbmcgZ2V0Q2xhc3NOYW1lT2ZPYmplY3QoT2JqZWN0IHByb3hpZWRPYmplY3QpOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBjbGFzcyBpcyBhIGNsYXNzIG9mIGEgcHJveGllZCBpbnN0YW5jZS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIGN1cnJlbnRDbGFzcyBwcm94eSBjbGFzcyB0byBjaGVjay4NCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBjbGFzcyBpcyBhIGNsYXNzIG9mIGEgcHJveGllZCBpbnN0YW5jZQ0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBpc1Byb3hpZWRDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MpOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBpbnN0YW5jZSBpcyBwcm94aWVkLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcHJveGllZE9iamVjdCBvYmplY3QgdG8gY2hlY2suDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgcHJveGllZCBpbnN0YW5jZQ0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBpc1Byb3hpZWRPYmplY3QoT2JqZWN0IHByb3hpZWRPYmplY3QpOw0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlY29yZGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzY2NzUzLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLQotLyoqCi0gKiBBbGxvd3MgdG8gY2FwdHVyZSBjb252ZXJ0ZWQgdmFsdWVzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyCi17Ci0gICAgLyoqCi0gICAgICogQWxsb3dzIHRvIHN0b3JlIHRoZSBjb252ZXJ0ZWQgdmFsdWUgb2YgdGhlIGdpdmVuIHVpQ29tcG9uZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IGN1cnJlbnQgY29tcG9uZW50Ci0gICAgICogQHBhcmFtIHZhbHVlIENvbnZlcnRlZCB1c2VyIHZhbHVlLgotICAgICAqLwotICAgIHZvaWQgcmVjb3JkVXNlcklucHV0KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWI5ZTFlLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0Fic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotLyoqCi0gKiBCYXNlIGZvciBhbGwgUmVuZGVyS2l0V3JhcHBlckZhY3RvcmllcyB0byBmb3JjZSBhIHNwZWNpZmljIGJlaGF2aW91ci4gU3ViY2xhc3NlcyBuZWVkIHRvIHNwZWNpZnkgdGhlIGxvZ2ljIHRvIGNyZWF0ZQotICogdGhlIHdyYXBwZXJzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFJlbmRlcktpdCwgUmVuZGVyS2l0PgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSB3cmFwcGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBkZWFjdGl2YXRlZCA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgbG9nZ2VyLmZpbmUoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHRvIHRoaXMgaW5zdGFuY2UuICBJZiBpdCBoYXMgYWxyZWFkeSBhIFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LCBpdCBpcyBhZGRlZCB0bwotICAgICAqIHRoYXQgaW5zdGFuY2UsIHNvIHRoYXQgd2UgaGF2ZSBhIGNoYWluIG9mIFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5J3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgVGhlIHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHRvIGFkZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeShBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KQotICAgIHsKLSAgICAgICAgbG9nZ2VyLmZpbmVzdChyZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLQotICAgICAgICBpZih0aGlzLndyYXBwZWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy53cmFwcGVkLmFkZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGlzIGluc3RhbmNlIGFuIG5vdCBhY3RpdmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gICAgewotICAgICAgICBsb2dnZXIuZmluZXN0KGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkZWFjdGl2YXRlZCIpOwotCi0gICAgICAgIHRoaXMuZGVhY3RpdmF0ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGlzIGluc3RhbmNlIGlzIG5vdCBhY3RpdmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGlzIGl0IGRlYWN0aXZhdGVkPwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGVhY3RpdmF0ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlYWN0aXZhdGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBSZW5kZXJLaXQgd3JhcHBlciB3aGVuIGl0IGlzIG5vdCBkZWFjdGl2YXRlZC4gIFdoZW4gd2UgaGF2ZSBhIGNoYWluIG9mIFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LCB0aGUKLSAgICAgKiBuZXh0IGluc3RhbmNlIGluIHRoZSBjaGFpbiBpcyBhc2tlZCB0byBjcmVhdGUgdGhlIFJlbmRlcktpdCBpbnN0YW5jZS4gIFRoZSBhY3R1YWwgY3JlYXRpb24gaXMgcGVyZm9ybWVkIGJ5IHRoZQotICAgICAqIGFic3RyYWN0IGNyZWF0ZVdyYXBwZXIgbWV0aG9kLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlbmRlcktpdCBUaGUgcmVuZGVyS2l0IHRvIHVzZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgUmVuZGVyS2l0Ci0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFJlbmRlcktpdCBjcmVhdGUoUmVuZGVyS2l0IHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIGlmKGlzRGVhY3RpdmF0ZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBSZW5kZXJLaXQgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBpZih0aGlzLndyYXBwZWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy53cmFwcGVkLmNyZWF0ZShyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVXcmFwcGVyKHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgd3JhcHBlciBmb3IgdGhlIHJlbmRlcktpdC4gIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhlIHdyYXBwZXIgaXMgdGhhdCB3ZSBjYW4gd3JhcCB0aGUgcmVuZGVyZXJzIHNvCi0gICAgICogdGhhdCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIHBlcmZvcm1lZCAobGlrZSBWYWxpZGF0aW9uIGR1cmluZyB0aGUgZGVjb2RlIHZhbHVlKQotICAgICAqCi0gICAgICogQHBhcmFtIHJlbmRlcktpdCAgVGhlIHJlbmRlcktpdCB0byB1c2UuCi0gICAgICogQHJldHVybiAgV3JhcHBlZCB2ZXJzaW9uIG9mIHRoZSBSZW5kZXJLaXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgUmVuZGVyS2l0IGNyZWF0ZVdyYXBwZXIoUmVuZGVyS2l0IHJlbmRlcktpdCk7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhlIEpTRiBhcHBsaWNhdGlvbiBpcyBmdWxseSBpbml0aWFsaXplZC4KLSAgICAgKiBzaW1wbGUgdGVzdCBmb3IgZWFybHkgY29uZmlnIGluIGNhc2Ugb2YgbW9qYXJyYSAoaW5jbC4gdGhlIGNvbWJpbmF0aW9uIHdpdGggdHJpbmlkYWQpLgotICAgICAqIHVzZSBhIGN1c3RvbSBleHR2YWwgY29udGV4dCBpbXBsLiAoc2VlIEVYVFZBTC01OCkgdG8gb3B0aW1pemUgdGhpcyBjaGVjayBmb3IgdGhlIHRhcmdldCBydW50aW1lLgotICAgICAqIHRoaXMgY2hlY2sgd29ya3MgZm9yIGFsbCBjdXJyZW50IGltcGxlbWVudGF0aW9ucyBzaW5jZSB0aGUganNmIGludGVybmFscyBhcmUgYXV0b20uIHJlYWR5IGR1cmluZyBhIHJlcXVlc3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGpzZiBpbXBsLiBpcyBpbml0aWFsaXplZCBhbmQgaXQncyBwb3NzaWJsZSB0byB1c2UgaXQgYXMgZXhwZWN0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FwcGxpY2F0aW9uSW5pdGlhbGl6ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEpzZlV0aWxzLmlzQXBwbGljYXRpb25Jbml0aWFsaXplZCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0NvbnZlcnRlZFZhbHVlQ2FjaGUuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0NvbnZlcnRlZFZhbHVlQ2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkNjgxYS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9Db252ZXJ0ZWRWYWx1ZUNhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIENvbnZlcnRlZFZhbHVlQ2FjaGUNCi17DQotICAgIHByaXZhdGUgc3RhdGljIFRocmVhZExvY2FsPENvbnZlcnRlZFZhbHVlQ2FjaGVFbnRyeT4gdmFsdWUgPSBuZXcgVGhyZWFkTG9jYWw8Q29udmVydGVkVmFsdWVDYWNoZUVudHJ5PigpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXQoKQ0KLSAgICB7DQotICAgICAgICB2YWx1ZS5zZXQobnVsbCk7DQotICAgICAgICB2YWx1ZS5yZW1vdmUoKTsNCi0gICAgfQ0KLQ0KLSAgICAvL25lZWRlZCBiZWNhdXNlIG51bGwgaXMgYSB2YWxpZCB2YWx1ZQ0KLSAgICBzdGF0aWMgYm9vbGVhbiBpc0NhY2hlZFZhbHVlQXZhaWxhYmxlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldENhY2hlRW50cnkoKS5pc0NhY2hlZFZhbHVlQXZhaWxhYmxlKCk7DQotICAgIH0NCi0NCi0gICAgc3RhdGljIE9iamVjdCBnZXRDYWNoZWRWYWx1ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRDYWNoZUVudHJ5KCkuZ2V0Q2FjaGVkVmFsdWUoKTsNCi0gICAgfQ0KLQ0KLSAgICBzdGF0aWMgdm9pZCBzZXRDYWNoZWRWYWx1ZShPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBnZXRDYWNoZUVudHJ5KCkuc2V0Q2FjaGVkVmFsdWUoY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBDb252ZXJ0ZWRWYWx1ZUNhY2hlRW50cnkgZ2V0Q2FjaGVFbnRyeSgpDQotICAgIHsNCi0gICAgICAgIENvbnZlcnRlZFZhbHVlQ2FjaGVFbnRyeSBlbnRyeSA9IHZhbHVlLmdldCgpOw0KLQ0KLSAgICAgICAgaWYoZW50cnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBlbnRyeSA9IG5ldyBDb252ZXJ0ZWRWYWx1ZUNhY2hlRW50cnkoKTsNCi0gICAgICAgICAgICB2YWx1ZS5zZXQoZW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGVudHJ5Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0NvbnZlcnRlZFZhbHVlQ2FjaGVFbnRyeS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQ29udmVydGVkVmFsdWVDYWNoZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZjJkYTYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQ29udmVydGVkVmFsdWVDYWNoZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotY2xhc3MgQ29udmVydGVkVmFsdWVDYWNoZUVudHJ5DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gY2FjaGVkVmFsdWVBdmFpbGFibGU7DQotICAgIHByaXZhdGUgT2JqZWN0IGNhY2hlZFZhbHVlOw0KLQ0KLSAgICB2b2lkIHNldENhY2hlZFZhbHVlKE9iamVjdCBjYWNoZWRWYWx1ZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jYWNoZWRWYWx1ZSA9IGNhY2hlZFZhbHVlOw0KLSAgICAgICAgdGhpcy5jYWNoZWRWYWx1ZUF2YWlsYWJsZSA9IHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRDYWNoZWRWYWx1ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjYWNoZWRWYWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NhY2hlZFZhbHVlQXZhaWxhYmxlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNhY2hlZFZhbHVlQXZhaWxhYmxlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0RlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwODYyYjAuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkKLXsKLSAgICBwcml2YXRlIFJlbmRlcktpdCByZW5kZXJLaXQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSSUNfUkVOREVSX0tJVF9XUkFQUEVSX0ZBQ1RPUlkgPQotICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdC5HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkiOwotICAgIHByaXZhdGUgc3RhdGljIEJvb2xlYW4gdXNlR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgbG9nZ2VyLmZpbmVzdCgiZXh0dmFsIHJlbmRlcmtpdCB3cmFwcGVyIGNyZWF0ZWQgZm9yICIgKyByZW5kZXJLaXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vd29ya2Fyb3VuZCBmb3IgbW9qYXJyYSAoRVhUVkFMLTM4KQotICAgICAgICBpZih1c2VHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3MgZ2VuZXJpY0ZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShHRU5FUklDX1JFTkRFUl9LSVRfV1JBUFBFUl9GQUNUT1JZKTsKLSAgICAgICAgICAgIHVzZUdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSA9IGdlbmVyaWNGYWN0b3J5ICE9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih1c2VHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgcmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgPSAoQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSlDbGFzc1V0aWxzCi0gICAgICAgICAgICAgICAgICAgIC50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKEdFTkVSSUNfUkVOREVSX0tJVF9XUkFQUEVSX0ZBQ1RPUlkpOwotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmNyZWF0ZVdyYXBwZXIocmVuZGVyS2l0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRoaXMucmVuZGVyS2l0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucmVuZGVyS2l0ID0gbmV3IEV4dFZhbFJlbmRlcktpdChyZW5kZXJLaXQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcktpdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxMYXp5UmVuZGVyZXJQcm94eS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg1NTFjNC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxMYXp5UmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvcmVDb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotLyoqCi0gKiB0byBzdXBwb3J0IGEgY3VzdG9tIHByb3h5Ci0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIEV4dFZhbExhenlSZW5kZXJlclByb3h5IGV4dGVuZHMgUmVuZGVyZXIgaW1wbGVtZW50cyBSZW5kZXJlclByb3h5Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQotICAgIHByaXZhdGUgUmVuZGVyZXIgd3JhcHBlZDsKLQotICAgIHB1YmxpYyBFeHRWYWxMYXp5UmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHJlbmRlcmVyOwotCi0gICAgICAgIGxvZ2dlci5maW5lc3QoInNpbXBsZSBwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZXRMYXp5UmVuZGVyZXIoKS5lbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZXRMYXp5UmVuZGVyZXIoKS5lbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydENsaWVudElkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldExhenlSZW5kZXJlcigpLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGdldFJlbmRlcnNDaGlsZHJlbigpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRDYWNoZWRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyIHJlbmRlcmVyID0gZ2V0TGF6eVJlbmRlcmVyKCk7Ci0gICAgICAgIGlmKHJlbmRlcmVyIGluc3RhbmNlb2YgUmVuZGVyZXJQcm94eSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICgoUmVuZGVyZXJQcm94eSlnZXRMYXp5UmVuZGVyZXIoKSkuZ2V0Q2FjaGVkQ29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL2J5IGRlZmF1bHQgdGhlcmUgaXMgbm8gcHJveHkgLSBzbyB3ZSB1c2UgYSBsb2NhbCBjYWNoZQotICAgICAgICBpZihDb252ZXJ0ZWRWYWx1ZUNhY2hlLmlzQ2FjaGVkVmFsdWVBdmFpbGFibGUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENvbnZlcnRlZFZhbHVlQ2FjaGUuZ2V0Q2FjaGVkVmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCByZXN1bHQgPSByZW5kZXJlci5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLSAgICAgICAgQ29udmVydGVkVmFsdWVDYWNoZS5zZXRDYWNoZWRWYWx1ZShyZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZihnZXRMYXp5UmVuZGVyZXIoKSA9PSB0aGlzLndyYXBwZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKENvbnZlcnRlZFZhbHVlQ2FjaGUuaXNDYWNoZWRWYWx1ZUF2YWlsYWJsZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBDb252ZXJ0ZWRWYWx1ZUNhY2hlLmdldENhY2hlZFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJlciBnZXRMYXp5UmVuZGVyZXIoKQotICAgIHsKLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFJlbmRlcmVyPiB0YXJnZXRDbGFzcyA9IEV4dFZhbENvcmVDb25maWd1cmF0aW9uLmdldCgpLnJlbmRlcmVyUHJveHkoKTsKLQotICAgICAgICBpZih0YXJnZXRDbGFzcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzc1tdIGFyZ0NsYXNzZXMgPSBuZXcgQ2xhc3NbMV07Ci0gICAgICAgICAgICBhcmdDbGFzc2VzWzBdID0gUmVuZGVyZXIuY2xhc3M7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGFyZ2V0Q2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJnQ2xhc3Nlcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChSZW5kZXJlciljb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSh0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCJjb3VsZG4ndCBjcmVhdGU6ICIgKyB0YXJnZXRDbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVuZGVyZXIgZ2V0V3JhcHBlZFJlbmRlcmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQ7Ci0gICAgfQotCi0gICAgdm9pZCByZXNldENvbnZlcnRlZFZhbHVlQ2FjaGUoKQotICAgIHsKLSAgICAgICAgQ29udmVydGVkVmFsdWVDYWNoZS5yZXNldCgpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXQuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTE3MjdlLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuTGlzdGVuZXJGb3I7Ci1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuTGlzdGVuZXJzRm9yOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdFdyYXBwZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcktpdCBleHRlbmRzIFJlbmRlcktpdFdyYXBwZXIKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgd3JhcHBlZDsKLQotICAgIHB1YmxpYyBFeHRWYWxSZW5kZXJLaXQoUmVuZGVyS2l0IHdyYXBwZWQpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOwotCi0gICAgICAgIGxvZ2dlci5maW5lKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlLCBSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIGlmIChyZW5kZXJlciBpbnN0YW5jZW9mIEV4dFZhbFJlbmRlcmVyV3JhcHBlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgcmVuZGVyZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgY3JlYXRlV3JhcHBlcihyZW5kZXJlcikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFJlbmRlcmVyIGdldFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUpCi0gICAgewotICAgICAgICBSZW5kZXJlciByZW5kZXJlciA9IHdyYXBwZWQuZ2V0UmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUpOwotCi0gICAgICAgIGlmKHJlbmRlcmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJlciBpbnN0YW5jZW9mIEV4dFZhbFJlbmRlcmVyV3JhcHBlciA/IHJlbmRlcmVyIDogY3JlYXRlV3JhcHBlcihyZW5kZXJlcik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVuZGVyZXI7Ci0gICAgfQotCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkKLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkhJR0gsIGRlc2NyaXB0aW9uID0gImxvZyB3YXJuaW5nICsgaGludCB0aGF0IGEgKGdlbmVyaWMpIGNvbXBvbmVudCBzdXBwb3J0IG1vZHVsZSBpcyBuZWVkZWQiKQotICAgIHByb3RlY3RlZCBSZW5kZXJlciBjcmVhdGVXcmFwcGVyKFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgaWYocmVuZGVyZXIgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihyZW5kZXJlci5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoTGlzdGVuZXJGb3IuY2xhc3MpIHx8Ci0gICAgICAgICAgICAgICAgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KExpc3RlbmVyc0Zvci5jbGFzcykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vd2UgYXJlbid0IGFsbG93ZWQgdG8gY3JlYXRlIGEgd3JhcHBlciB3aXRob3V0IGtub3dpbmcgZGV0YWlscyBhYm91dCB0aGUgcmVuZGVyZXIgb3IKLSAgICAgICAgICAgIC8vd2l0aG91dCBnZW5lcmF0aW5nIGEgcHJveHkgZHVlIHRvIHRoZSBhbm5vdGF0aW9uIHNjYW5uaW5nIHByb2Nlc3MKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJlcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEV4dFZhbFJlbmRlcmVyV3JhcHBlcihyZW5kZXJlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlbmRlcktpdCBnZXRXcmFwcGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0RmFjdG9yeS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWM2MzAzLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvcmVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi0vKioKLSAqIGNlbnRyYWwgbWVjaGFuaXNtIHdoaWNoIGlzIHJlc3BvbnNpYmxlIHRvIGNyZWF0ZSBhIHdyYXBwZXIgZm9yIGEgcmVuZGVyZXIgLSBzdGFydGluZyBwb2ludCBvZiBleHR2YWwuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJLaXRGYWN0b3J5IGV4dGVuZHMgUmVuZGVyS2l0RmFjdG9yeQotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgcHJpdmF0ZSBSZW5kZXJLaXRGYWN0b3J5IHdyYXBwZWQ7Ci0gICAgcHJpdmF0ZSBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsKLSAgICBwcml2YXRlIEJvb2xlYW4gaXNEZWFjdGl2YXRlZDsKLQotICAgIHB1YmxpYyBFeHRWYWxSZW5kZXJLaXRGYWN0b3J5KFJlbmRlcktpdEZhY3RvcnkgcmVuZGVyS2l0RmFjdG9yeSkKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHJlbmRlcktpdEZhY3Rvcnk7Ci0KLSAgICAgICAgbG9nZ2VyLmZpbmUoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcktpdChTdHJpbmcgcywgUmVuZGVyS2l0IHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZC5hZGRSZW5kZXJLaXQocywgcmVuZGVyS2l0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVuZGVyS2l0IGdldFJlbmRlcktpdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIFJlbmRlcktpdCByZW5kZXJLaXQgPSB0aGlzLndyYXBwZWQuZ2V0UmVuZGVyS2l0KGZhY2VzQ29udGV4dCwgcyk7Ci0KLSAgICAgICAgLy9mb3IgbW9qYXJyYSArIHRyaW5pZGFkCi0gICAgICAgIGlmKHJlbmRlcktpdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeVRvSW5pdERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpOwotCi0gICAgICAgIGNoZWNrUmVuZGVyS2l0RmFjdG9yeURlYWN0aXZhdGlvbigpOwotCi0gICAgICAgIGlmKHRoaXMuaXNEZWFjdGl2YXRlZCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcktpdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vdGVzdCBlYXJseSBjb25maWcgaW4gY2FzZSBvZiBtb2phcnJhCi0gICAgICAgIGlmKCF0aGlzLmRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5pc0FwcGxpY2F0aW9uSW5pdGlhbGl6ZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmNyZWF0ZVdyYXBwZXIocmVuZGVyS2l0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnlUb0NyZWF0ZVdyYXBwZXJXaXRoV3JhcHBlckZhY3RvcnkocmVuZGVyS2l0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tSZW5kZXJLaXRGYWN0b3J5RGVhY3RpdmF0aW9uKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMuaXNEZWFjdGl2YXRlZCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihFeHRWYWxVdGlscy5pc0V4dFZhbERlYWN0aXZhdGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc0RlYWN0aXZhdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKHRoaXMuZGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmlzQXBwbGljYXRpb25Jbml0aWFsaXplZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuaXNEZWFjdGl2YXRlZCA9IGlzUmVuZGVyS2l0RmFjdG9yeURlYWN0aXZhdGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc0RlYWN0aXZhdGVkID0gaXNSZW5kZXJLaXRGYWN0b3J5RGVhY3RpdmF0ZWRWaWFWTVBhcmFtZXRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB0cnlUb0luaXREZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5kZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy93b3JrYXJvdW5kIGZvciBtb2phcnJhIHRvIGFsbG93IGEgY3VzdG9tIGZhY3RvcnkgZHVyaW5nIHRoZSBlYXJseSBjb25maWcgcGhhc2UKLSAgICAgICAgICAgIC8vanVzdCBjcmVhdGUgdGhlIGZhY3Rvcnkgd2l0aCB0aGUgZ2l2ZW4gbmFtZQotICAgICAgICAgICAgLy8raXQgc2hvdWxkIGV4dGVuZCB5b3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiB3aGljaCB5b3UgcmVnaXN0ZXIgYXMgdXN1YWwKLSAgICAgICAgICAgIE9iamVjdCBjdXN0b21GYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKAotICAgICAgICAgICAgICAgICAgICBFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSArICIuY3VzdG9tLlJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Iik7Ci0KLSAgICAgICAgICAgIGlmKGN1c3RvbUZhY3RvcnkgaW5zdGFuY2VvZiBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID0gKEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpY3VzdG9tRmFjdG9yeTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSA9IG5ldyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUmVuZGVyS2l0IHRyeVRvQ3JlYXRlV3JhcHBlcldpdGhXcmFwcGVyRmFjdG9yeShSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSB3cmFwcGVyRmFjdG9yeSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgIC8vc29tZSBjb21wb25lbnQgbGlicyBlLmcuIG15ZmFjZXMtdHJpbmlkYWQgYXJlbid0IGNvbXBhdGlibGUgd2l0aCB0aGlzIGNsZWFuIGFwcHJvYWNoCi0gICAgICAgIC8vZXhhbXBsZSBzZWUgVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIKLSAgICAgICAgaWYod3JhcHBlckZhY3RvcnkuaXNEZWFjdGl2YXRlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJGYWN0b3J5LmNyZWF0ZShyZW5kZXJLaXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGdldFJlbmRlcktpdElkcygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkLmdldFJlbmRlcktpdElkcygpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlbmRlcktpdEZhY3RvcnlEZWFjdGl2YXRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb24uZ2V0KCkuZGVhY3RpdmF0ZVJlbmRlcktpdEZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNSZW5kZXJLaXRGYWN0b3J5RGVhY3RpdmF0ZWRWaWFWTVBhcmFtZXRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoU3lzdGVtCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsKLSAgICAgICAgICAgICAgICAgICAgIi5ERUFDVElWQVRFX1JFTkRFUl9LSVRfRkFDVE9SWSIsICJmYWxzZSIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlclByb3h5LmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MTk3MWEuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlJlbmRlcmVyUHJveHlTdG9yYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkpzZlByb2plY3RTdGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLS8qKgotICogdG8gYXZvaWQgbXVsdGlwbGUgY2FsbHMgb2YgcmVuZGVyZXIgbWV0aG9kcyB3aXRoaW4gcmVuZGVyZXIgaW50ZXJjZXB0b3JzIChlLmcuIGZvciBlbmNvZGUsIGRlY29kZSwuLi4pCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJlclByb3h5IGV4dGVuZHMgUmVuZGVyZXIgaW1wbGVtZW50cyBSZW5kZXJlclByb3h5Ci17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZID0gRXh0VmFsUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCkgKyAiOktFWSI7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQotICAgIHByb3RlY3RlZCBSZW5kZXJlciB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcmVyUHJveHkoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSByZW5kZXJlcjsKLQotICAgICAgICBsb2dnZXIuZmluZXN0KCJwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkgPSBnZXRSZW5kZXJlckVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNEZWNvZGVDYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RGVjb2RlQ2FsbGVkKHRydWUpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLndyYXBwZWQuZGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnlUb0NyZWF0ZU1lc3NhZ2UoImRlY29kZSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBlbnRyeSA9IGdldFJlbmRlcmVyRW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0VuY29kZUJlZ2luQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldEVuY29kZUJlZ2luQ2FsbGVkKHRydWUpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVkLmVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnlUb0NyZWF0ZU1lc3NhZ2UoImVuY29kZUJlZ2luIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGVudHJ5ID0gZ2V0UmVuZGVyZXJFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRW5jb2RlQ2hpbGRyZW5DYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RW5jb2RlQ2hpbGRyZW5DYWxsZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlZC5lbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DcmVhdGVNZXNzYWdlKCJlbmNvZGVDaGlsZHJlbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkgPSBnZXRSZW5kZXJlckVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNFbmNvZGVFbmRDYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RW5jb2RlRW5kQ2FsbGVkKHRydWUpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLndyYXBwZWQuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnlUb0NyZWF0ZU1lc3NhZ2UoImVuY29kZUVuZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0Q2xpZW50SWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udmVydENsaWVudElkKGZhY2VzQ29udGV4dCwgcyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgewotICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICB0aHJvdyB0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRDYWNoZWRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGVudHJ5ID0gZ2V0UmVuZGVyZXJFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoZW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh3cmFwcGVkLmdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkgPSBnZXRSZW5kZXJlckVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmIChlbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVudHJ5LnNldENvbnZlcnRlZFZhbHVlKHdyYXBwZWQuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnlUb0NyZWF0ZU1lc3NhZ2UoImdldENvbnZlcnRlZFZhbHVlIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZ2V0UmVuZGVyZXJFbnRyeShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGtleSArPSBnZXRPcHRpb25hbEtleShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBSZW5kZXJlclByb3h5U3RvcmFnZSByZW5kZXJlclByb3h5U3RvcmFnZSA9IGdldFJlbmRlcmVyU3RvcmFnZSgpOwotCi0gICAgICAgIGlmICghcmVuZGVyZXJQcm94eVN0b3JhZ2UuY29udGFpbnNFbnRyeShnZXRSZW5kZXJlcktleSgpLCBrZXkpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZW5kZXJlclByb3h5U3RvcmFnZS5zZXRFbnRyeShnZXRSZW5kZXJlcktleSgpLCBrZXksIG5ldyBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZW5kZXJlclByb3h5U3RvcmFnZS5nZXRFbnRyeShnZXRSZW5kZXJlcktleSgpLCBrZXkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3B0aW9uYWxLZXkoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZW5kZXJlcktleSgpCi0gICAgewotICAgICAgICByZXR1cm4gUHJveHlVdGlscy5nZXRDbGFzc05hbWUodGhpcy53cmFwcGVkLmdldENsYXNzKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVuZGVyZXJQcm94eVN0b3JhZ2UgZ2V0UmVuZGVyZXJTdG9yYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKFJlbmRlcmVyUHJveHlTdG9yYWdlLmNsYXNzLCBSZW5kZXJlclByb3h5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpCi0gICAgewotICAgICAgICAvL3Jlc2V0IGNvbXBvbmVudCBwcm94eSBtYXBwaW5nCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlc2V0U3RvcmFnZShSZW5kZXJlclByb3h5U3RvcmFnZS5jbGFzcywgUmVuZGVyZXJQcm94eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9DcmVhdGVNZXNzYWdlKFN0cmluZyBtZXRob2ROYW1lKQotICAgIHsKLSAgICAgICAgaWYoSnNmUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5EZXZlbG9wbWVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gImRvdWJsZSBjYWxsIG9mICIgKyB0aGlzLndyYXBwZWQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIyIgKyBtZXRob2ROYW1lICsgIiBmaWx0ZXJlZC4gIiArCi0gICAgICAgICAgICAgICAgICAgICJ0aGlzIG9wdGltaXphdGlvbiBtaWdodCBsZWFkIHRvIGluY29tcGF0aWJpbGl0aWVzIHdpdGggc29tZSBjb21wb25lbnQgbGlicy4gIiArCi0gICAgICAgICAgICAgICAgICAgICJpbiBzdWNoIGEgY2FzZSB1c2UgdGhlIHN1cHBvcnQgbW9kdWxlIGZvciB0aGUgY29tcG9uZW50IGxpYiBvciB1c2U6ICIgKwotICAgICAgICAgICAgICAgICAgICAiRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVksIG51bGwpOyAiICsKLSAgICAgICAgICAgICAgICAgICAgImluIGEgc3RhcnR1cCBsaXN0ZW5lciI7Ci0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgICAgICAuYWRkTWVzc2FnZShudWxsLCBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4sIG1lc3NhZ2UsIG1lc3NhZ2UpKTsKLQotICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcobWVzc2FnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2dnZXIuZmluZSgidHVybiBvbiB0aGUgZGV2ZWxvcG1lbnQgbW9kZSBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiwgaWYgc29tZXRoaW5nIGlzIGRpc3BsYXllZCB3cm9uZy4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVuZGVyZXIgZ2V0V3JhcHBlZFJlbmRlcmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRhODQwZS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLS8qKgotICogRGVmYXVsdCBhcHByb2FjaCB0byBhdm9pZCBwcm94aWVzIGZvciBjb252ZXJ0ZXJzIGFuZCB0aGUgYWRhcHRlciBmYWxsYmFjay4KLSAqIEl0IHJlcXVpcmVzIHRoYXQgY29tcG9uZW50cyBkZWxlZ2F0ZSBnZXRDb252ZXJ0ZWRWYWx1ZSB0byBhIHJlbmRlcmVyLjxici8+Ci0gKiBJZiBpdCBpc24ndCB0aGUgY2FzZSBmb3IgeW91ciBjb21wb25lbnQgbGliIHVzZToKLSAqIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5LkV4dFZhbEFwcGxpY2F0aW9uRmFjdG9yeTxici8+Ci0gKiBhbmQ8YnIvPgotICogb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHkuUHJveHlNYXBwaW5nUGhhc2VMaXN0ZW5lcgotICogPHAvPgotICogVGhpcyB3cmFwcGVyIHdpbGwgYWxzbyBpbXBsZW1lbnQgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBiZWhhdmlvdXIKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcmVyV3JhcHBlciBleHRlbmRzIFJlbmRlcmVyCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQotICAgIHByb3RlY3RlZCBSZW5kZXJlciB3cmFwcGVkOwotICAgIHByb3RlY3RlZCBFeHRWYWxDb250ZXh0IGV4dFZhbENvbnRleHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKTsKLQotICAgIHB1YmxpYyBFeHRWYWxSZW5kZXJlcldyYXBwZXIoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICBDbGFzczw/IGV4dGVuZHMgRXh0VmFsUmVuZGVyZXJQcm94eT4gcHJveHlDbGFzcyA9IEV4dFZhbENvcmVDb25maWd1cmF0aW9uLmdldCgpLnJlbmRlcmVyUHJveHkoKTsKLQotICAgICAgICBpZihwcm94eUNsYXNzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5maW5lc3QoIm5vIGV4dHZhbCByZW5kZXJlciBwcm94eSBjb25maWd1cmVkIik7Ci0KLSAgICAgICAgICAgIHRoaXMud3JhcHBlZCA9IG5ldyBFeHRWYWxMYXp5UmVuZGVyZXJQcm94eShyZW5kZXJlcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBDbGFzc1tdIGFyZ0NsYXNzZXMgPSBuZXcgQ2xhc3NbMV07Ci0gICAgICAgIGFyZ0NsYXNzZXNbMF0gPSBSZW5kZXJlci5jbGFzczsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBwcm94eUNsYXNzLmdldENvbnN0cnVjdG9yKGFyZ0NsYXNzZXMpOwotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gKFJlbmRlcmVyKWNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHJlbmRlcmVyKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCJubyBleHR2YWwgcmVuZGVyZXIgcHJveHkgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZ2dlci5maW5lc3QoImV4dHZhbCByZW5kZXJlciB3cmFwcGVyIGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuZmluZXN0KCJzdGFydCBiZWZvcmVEZWNvZGUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZURlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5GSU5FU1QsICJkZWNvZGUgZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbG9nZ2VyLmZpbmVzdCgiYmVmb3JlRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5GSU5FU1QsICJiZWZvcmVEZWNvZGUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5kZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuZmluZXN0KCJzdGFydCBhZnRlckRlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBsb2dnZXIuZmluZXN0KCJhZnRlckRlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuRklORVNULCAiYWZ0ZXJEZWNvZGUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSB0cnVlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lc3QoInN0YXJ0IGJlZm9yZUVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVFbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5GSU5FU1QsICJlbmNvZGVCZWdpbiBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsb2dnZXIuZmluZXN0KCJiZWZvcmVFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLkZJTkVTVCwgImJlZm9yZUVuY29kZUJlZ2luIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuZmluZXN0KCJzdGFydCBhZnRlckVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgbG9nZ2VyLmZpbmVzdCgiYWZ0ZXJFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuRklORVNULCAiYWZ0ZXJFbmNvZGVCZWdpbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmZpbmVzdCgic3RhcnQgYmVmb3JlRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLkZJTkVTVCwgImVuY29kZUNoaWxkcmVuIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lc3QoImJlZm9yZUVuY29kZUNoaWxkcmVuIG9mICIgKwotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuRklORVNULCAiYmVmb3JlRW5jb2RlQ2hpbGRyZW4gaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5lbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lc3QoInN0YXJ0IGFmdGVyRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBsb2dnZXIuZmluZXN0KCJhZnRlckVuY29kZUNoaWxkcmVuIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5GSU5FU1QsICJhZnRlckVuY29kZUNoaWxkcmVuIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmZpbmVzdCgic3RhcnQgYmVmb3JlRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVFbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuRklORVNULCAiZW5jb2RlRW5kIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lc3QoImJlZm9yZUVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLkZJTkVTVCwgImJlZm9yZUVuY29kZUVuZCBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lc3QoInN0YXJ0IGFmdGVyRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lc3QoImFmdGVyRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5GSU5FU1QsICJhZnRlckVuY29kZUVuZCBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY29udmVydENsaWVudElkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udmVydENsaWVudElkKGZhY2VzQ29udGV4dCwgcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZ2V0UmVuZGVyc0NoaWxkcmVuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSB0cnVlOwotICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0ID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lc3QoInN0YXJ0IGJlZm9yZUdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvLCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdCA9IGUuZ2V0UmV0dXJuVmFsdWVPbkV4Y2VwdGlvbihjb252ZXJ0ZWRPYmplY3QpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLkZJTkVTVCwgImdldENvbnZlcnRlZFZhbHVlIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZmluZXN0KCJiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLkZJTkVTVCwgImJlZm9yZUdldENvbnZlcnRlZFZhbHVlIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QgPSB3cmFwcGVkLmdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmZpbmVzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhcnQgYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8sIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmZpbmVzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5GSU5FU1QsICJhZnRlckdldENvbnZlcnRlZFZhbHVlIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYodGhpcy53cmFwcGVkIGluc3RhbmNlb2YgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChFeHRWYWxMYXp5UmVuZGVyZXJQcm94eSl0aGlzLndyYXBwZWQpLnJlc2V0Q29udmVydGVkVmFsdWVDYWNoZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZE9iamVjdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9SZW5kZXJlclByb3h5LmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9SZW5kZXJlclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYzA3NDUuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvUmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGludGVyZmFjZSBSZW5kZXJlclByb3h5DQotew0KLSAgICBSZW5kZXJlciBnZXRXcmFwcGVkUmVuZGVyZXIoKTsNCi0NCi0gICAgT2JqZWN0IGdldENhY2hlZENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3Qgb2JqZWN0KTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTE2NmMwLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBNYXJrZXIgZXhjZXB0aW9uIHRoYXQgY2FuIGJlIHRocm93biBieSBhbiBhZnRlci1tZXRob2QKLSAqICh7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUmVuZGVyZXJJbnRlcmNlcHRvcn0pCi0gKiB0byBzdG9wIHRoZSBleGVjdXRpb24gb2YgdGhlIHN1YnNlcXVlbnQgaW50ZXJjZXB0b3JzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNDcyNzkwNDk4NzY2MjUxMzQ2TDsKLX0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWI0ZGY3Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLS8qKgotICogTWFya2VyIGV4Y2VwdGlvbiB0aGF0IGNhbiBiZSB0aHJvd24gYnkgYSBiZWZvcmUtbWV0aG9kCi0gKiAoe0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlJlbmRlcmVySW50ZXJjZXB0b3J9KQotICogdG8gc3RvcCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBzdWJzZXF1ZW50IGludGVyY2VwdG9ycy4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQxODQyNDA1MTQ2NDgxNDg4OEw7Ci19CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk1NDQ2Yy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEV4Y2VwdGlvbiB0aGF0IGNhbiBiZSB0aHJvd24gYnkgYQotICogKHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yfSkKLSAqIHRvIHNraXAgdGhlIGludm9jYXRpb24gb2YgdGhlIGludGVyY2VwdGVkIHJlbmRlcmVyIG1ldGhvZC4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gICAgcHJvdGVjdGVkIFJlbmRlcmVySW50ZXJjZXB0b3IgZXhjZXB0aW9uU291cmNlOwotICAgIHByb3RlY3RlZCBPYmplY3QgaW5mb3JtYXRpb247Ci0gICAgYm9vbGVhbiBza2lwT3RoZXJJbnRlcmNlcHRvcnMgPSBmYWxzZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMzQzMDc0MDc3NTMyOTE1NzIyTDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBjcmVhdGluZyBhbiBleGNlcHRpb24gd2hpY2ggZG9lc24ndCBza2lwIHRoZSBpbnZvY2F0aW9uIG9mIHRoZSBvdGhlciBpbnRlcmNlcHRvcnMuCi0gICAgICovCi0gICAgcHVibGljIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgY3JlYXRpbmcgYW4gZXhjZXB0aW9uIHdoaWNoIG1pZ2h0IHNraXAgdGhlIGludm9jYXRpb24gb2YgdGhlIG90aGVyIGludGVyY2VwdG9ycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBza2lwT3RoZXJJbnRlcmNlcHRvcnMgc2lnbmFscyBpZiB0aGUgb3RoZXIgaW50ZXJjZXB0b3JzIHNob3VsZCBiZSBza2lwcGVkLgotICAgICAqLwotICAgIHB1YmxpYyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzKQotICAgIHsKLSAgICAgICAgdGhpcy5za2lwT3RoZXJJbnRlcmNlcHRvcnMgPSBza2lwT3RoZXJJbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIGFuIGV4Y2VwdGlvbiB3aGljaCBkb2Vzbid0IHNraXAgdGhlIGludm9jYXRpb24gb2YgdGhlIG90aGVyIGludGVyY2VwdG9ycy4KLSAgICAgKiBGdXJ0aGVybW9yZSwgaXQgYWxsb3dzIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUge0BsaW5rIFJlbmRlcmVySW50ZXJjZXB0b3J9IHdoaWNoIHRocmV3IHRoZSBleGNlcHRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2tpcE90aGVySW50ZXJjZXB0b3JzIHNpZ25hbHMgaWYgdGhlIG90aGVyIGludGVyY2VwdG9ycyBzaG91bGQgYmUgc2tpcHBlZC4KLSAgICAgKiBAcGFyYW0gcmVuZGVyZXJJbnRlcmNlcHRvciBpbnRlcmNlcHRvciB3aGljaCB0aHJldyB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbihib29sZWFuIHNraXBPdGhlckludGVyY2VwdG9ycywgUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgdGhpcyhza2lwT3RoZXJJbnRlcmNlcHRvcnMpOwotICAgICAgICB0aGlzLmV4Y2VwdGlvblNvdXJjZSA9IHJlbmRlcmVySW50ZXJjZXB0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhbiBhZGRpdGlvbmFsIG9iamVjdCB3aXRoIGluZm9ybWF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGluZm9ybWF0aW9uIHNvbWUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvbihPYmplY3QgaW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICB0aGlzLmluZm9ybWF0aW9uID0gaW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gaW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2lnbmFscyBpZiB0aGUgc3Vic2VxdWVudCBpbnRlcmNlcHRvcnMgc2hvdWxkIGJlIHNraXBwZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN1YnNlcXVlbnQgaW50ZXJjZXB0b3JzIHNob3VsZCBiZSBza2lwcGVkLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NraXBPdGhlckludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gc2tpcE90aGVySW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHdoaWNoIHNob3VsZCBiZSB1c2VkIGFzIHJlc3VsdCAoaWYgdGhlIGludGVyY2VwdGVkIG1ldGhvZCBoYXMgdG8gcHJvdmlkZSBhIHJldHVybiB2YWx1ZSkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY3VycmVudFJldHVyblZhbHVlIHRoZSBvcmlnaW5hbCBjb252ZXJ0ZWQgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkIGFzIGNvbnZlcnRlZCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJldHVyblZhbHVlT25FeGNlcHRpb24oT2JqZWN0IGN1cnJlbnRSZXR1cm5WYWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLmV4Y2VwdGlvblNvdXJjZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5leGNlcHRpb25Tb3VyY2UuZ2V0UmV0dXJuVmFsdWVPblNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24odGhpcywgY3VycmVudFJldHVyblZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3VycmVudFJldHVyblZhbHVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0Fic3RyYWN0U3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MGEwYjYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0Fic3RyYWN0U3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Qcm9qZWN0U3RhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7DQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOw0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIGV4ZWN1dGUgbG9naWMganVzdCBvbmNlLg0KLSAqIGUuZy4gcmVnaXN0ZXIgYXJ0aWZhY3RzIHZpYSBhcGkuIEl0IGlzIGRvbmUgYmVmb3JlIHRoZSBmaXJzdCBSZXN0b3JlIHZpZXcgb2YgdGhlIGFwcGxpY2F0aW9uLiBQaGFzZUxpc3RlbmVycyBhcmUNCi0gKiBkZXJlZ2lzdGVyZWQgc28gdGhhdCB0aGV5IGRvbid0IGhhdmUgYW55IGFkZGl0aW9uYWwgaW1wYWN0IG9uIHRoZSBhcHBsaWNhdGlvbi4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0NCi0gICAgLy9kb24ndCByZW1vdmUgLSBpdCdzIGEgZmFsbGJhY2sgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggZGVyZWdpc3RyYXRpb24NCi0gICAgLy90YXJnZXQ6IGRvbid0IHByb2Nlc3MgaW5pdCBsb2dpYyBtb3JlIHRoYW4gb25jZQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENsYXNzPiBpbml0aWFsaXplZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVySW5pdGlhbGl6ZWQgPSBmYWxzZTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyKCkNCi0gICAgew0KLSAgICAgICAgbG9nZ2VyLmZpbmUoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBJcyByZXNwb25zaWJsZSBmb3IgZXhlY3V0aW5nIHRoZSBvbmUgdGltZSBvbmx5IGxvZ2ljLiAgQmVmb3JlIHRoZSBsb2dpYyBpcyBwZXJmb3JtZWQgKGluaXQgbWV0aG9kKSwgdGhlIHN0YXJ0LXVwDQotICAgICAqIGxpc3RlbmVyIGhhcyB0aGUgY2hhbmNlIG9mIHB1dHRpbmcgYSBjb25maWd1cmF0aW9uIG9iamVjdCBpbiBwbGFjZSBpbiB0aGUgaW5pdE1vZHVsZUNvbmZpZyBtZXRob2QuDQotICAgICAqIFN0YXJ0dXAgbGlzdGVuZXJzIGNhbiBiZSBkZWFjdGl2YXRlZCBieSBhbiBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgaW4gdGhlIHdlYi54bWwgZmlsZSBhbmQgYXJlIGRlcmVnaXN0ZXJlZCBmcm9tDQotICAgICAqIHRoZSBKU0Ygc3lzdGVtLiAgSWYgdGhpcyBmYWlscywgYSBmYWxsYmFjayBzeXN0ZW0gaXMgaW4gcGxhY2Ugc28gdGhhdCB0aGUgbG9naWMgY2FuJ3QgYmUgZXhlY3V0ZWQgbW9yZSB0aGVuIG9uY2UuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBldmVudCBKc2YgUGhhc2UgRXZlbnQgaW5mby4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIHN5bmNocm9uaXplZCAoQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuY2xhc3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCFpbml0aWFsaXplZExpc3RlbmVycy5jb250YWlucyhnZXRDbGFzcygpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnQgaW5pdCBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWlzU3RhcnR1cExpc3RlbmVyRGVhY3RpdmF0ZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRNb2R1bGVDb25maWcoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdFByb2plY3RTdGFnZVJlc29sdmVyKCk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImluaXQgb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkZWFjdGl2YXRlZCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiaW5pdCBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBmaW5hbGx5DQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgSnNmVXRpbHMuZGVyZWdpc3RlclBoYXNlTGlzdGVuZXIodGhpcyk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5XQVJOSU5HLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBkZXJlZ2lzdGVyaW5nIHRoZSBwaGFzZS1saXN0ZW5lciINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtPiB0aGVyZSBpcyBqdXN0IGEgbGl0dGxlIG92ZXJoZWFkLCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBidXQgZXZlcnl0aGluZyBlbHNlIHdvcmtzIGNvcnJlY3RseS4iDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaG93ZXZlciwgcGxlYXNlIGluZm9ybSB0aGUgY29tbXVuaXR5IGFib3V0IHlvdXIgY29uZmlndXJhdGlvbiIsIGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWRMaXN0ZW5lcnMuYWRkKGdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBbGxvd3Mgc3ViY2xhc3NlcyB0byBwdXQgc29tZSBjb25maWd1cmF0aW9uIGluIHBsYWNlLCBiZWZvcmUgdGhlIGFjdHVhbCBpbml0aWFsaXphdGlvbiBjb2RlIGlzIHBlcmZvcm1lZC4NCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb3JlQ29uZmlndXJhdGlvbiN1c2Uob3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb24sIGJvb2xlYW4pDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0TW9kdWxlQ29uZmlnKCkNCi0gICAgew0KLSAgICAgICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogTG9naWMgc2hvdWxkIGJlIGV4ZWN1dGVkIGJlZm9yZSB0aGUgUkVTVE9SRV9WSUVXIHBoYXNlLg0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIFJlc3RvcmUgVmlldyBKU0YgUGhhc2UuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuUkVTVE9SRV9WSUVXOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBJbmRpdmlkdWFsIHN0YXJ0dXAgbGlzdGVuZXJzIGNhbiBiZSBkZWFjdGl2YXRlZCBieSBzcGVjaWZ5aW5nIGFuIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBpbiB0aGUgd2ViLnhtbCBmaWxlDQotICAgICAqIHdpdGggdGhlIG5hbWUgb2YgdGhlIHN0YXJ0dXAgbGlzdGVuZXIgZm9sbG93ZWQgYnkgJzpERUFDVElWQVRFRCcgdGhhdCBoYXZlIGEgdmFsdWUgb2YgJ3RydWUnLg0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIElzIHRoaXMgc3RhcnR1cCBsaXN0ZW5lciBkZWFjdGl2YXRlZC4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzU3RhcnR1cExpc3RlbmVyRGVhY3RpdmF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuaXNFeHRWYWxEZWFjdGl2YXRlZCgpIHx8DQotICAgICAgICAgICAgICAgICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFV0aWxzLmdldEluaXRQYXJhbWV0ZXIobnVsbCwgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOkRFQUNUSVZBVEVEIikpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlPVByaW9yaXR5LkxPVywgZGVzY3JpcHRpb249IlByb2plY3RTdGFnZSNnZXRDdXJyZW50UHJvamVjdFN0YWdlIGlzIHVzaW5nIHRoZSBjb25maWcgYW5kIG5vdCB0aGUgZ2xvYmFsIiArDQotICAgICAgICAgICAgInByb3BlcnR5LiBhbGlnbi4iKQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UHJvamVjdFN0YWdlUmVzb2x2ZXIoKQ0KLSAgICB7DQotICAgICAgICBpZighZGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVySW5pdGlhbGl6ZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShQcm9qZWN0U3RhZ2VSZXNvbHZlci5jbGFzcy5nZXROYW1lKCksIGdldFByb2plY3RTdGFnZVJlc29sdmVyKCksIGZhbHNlKTsNCi0gICAgICAgICAgICBkZWZhdWx0UHJvamVjdFN0YWdlUmVzb2x2ZXJJbml0aWFsaXplZCA9IHRydWU7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFByb2plY3RTdGFnZVJlc29sdmVyIGdldFByb2plY3RTdGFnZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvcmVDb25maWd1cmF0aW9uLmdldCgpLnByb2plY3RTdGFnZVJlc29sdmVyKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFN1YmNsYXNzZXMgY2FuIGhlcmUgcHV0IHRoZWlyIGxvZ2ljIHRoYXQgdGhleSB3YW50IHRvIGJlIGV4ZWN1dGVkIG9uY2UsIGxpa2UgaW5pdGlhbGl6YXRpb24gY29kZSBvZiBhIG1vZHVsZQ0KLSAgICAgKiBvciBhZGQtb24uDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0KCk7DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9FeHRWYWxTdGFydHVwTGlzdGVuZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9FeHRWYWxTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JkOTc4Ni4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZpb2xhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRGVmYXVsdEV4dFZhbENvcmVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlBoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXIKLSAgICAgICAgLkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjUwNDgyNjQyMTA4NjU3MjAxMkw7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0TW9kdWxlQ29uZmlnKCkKLSAgICB7Ci0gICAgICAgIEV4dFZhbENvcmVDb25maWd1cmF0aW9uLnVzZShuZXcgRGVmYXVsdEV4dFZhbENvcmVDb25maWd1cmF0aW9uKCksIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkKLSAgICB7Ci0gICAgICAgIGlmKEV4dFZhbEluZm9ybWF0aW9uLlZFUlNJT04gIT0gbnVsbCAmJiAhRXh0VmFsSW5mb3JtYXRpb24uVkVSU0lPTi5zdGFydHNXaXRoKCJudWxsIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydGluZyB1cCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIHYiICsgRXh0VmFsSW5mb3JtYXRpb24uVkVSU0lPTik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnRpbmcgdXAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciIpOwotICAgICAgICB9Ci0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKG5ldyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IoKSk7Ci0KLSAgICAgICAgaW5pdE5hbWVNYXBwZXJzKCk7Ci0gICAgICAgIGluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIGluaXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7Ci0gICAgICAgIGluaXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgaW5pdFBoYXNlTGlzdGVuZXJzKCk7Ci0gICAgICAgIGluaXRWaW9sYXRpb25TZXZlcml0eUtleSgpOwotICAgICAgICBpbml0RGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uS2V5KCk7Ci0gICAgICAgIGluaXRSZXF1aXJlZEluaXRpYWxpemF0aW9uKCk7Ci0KLSAgICAgICAgZXhlY3V0ZUN1c3RvbVN0YXJ0dXBMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0TmFtZU1hcHBlcnMoKQotICAgIHsKLSAgICAgICAgaWYgKEV4dFZhbENvcmVDb25maWd1cmF0aW9uLmdldCgpLmRlYWN0aXZhdGVEZWZhdWx0TmFtZU1hcHBlcnMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9yZWdpc3RlciBtZXRhZGF0YSB0byB2YWxpZGF0aW9uIHN0cmF0ZWd5IG5hbWUgbWFwcGVyCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7Ci0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7Ci0KLSAgICAgICAgLy9yZWdpc3RlciB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1lc3NhZ2UgcmVzb2x2ZXIgbmFtZSBtYXBwZXIKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotCi0gICAgICAgIC8vcmVnaXN0ZXIgdmFsaWRhdGlvbiBzdHJhdGVneSB0byBtZXRhZGF0YSB0cmFuc2Zvcm1lciBuYW1lIG1hcHBlcgotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVDdXN0b21TdGFydHVwTGlzdGVuZXIoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lck5hbWUgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVJUVVBfTElTVEVORVIpOwotICAgICAgICBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lciBjdXN0b21TdGFydHVwTGlzdGVuZXIgPQotICAgICAgICAgICAgKEFic3RyYWN0U3RhcnR1cExpc3RlbmVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjdXN0b21TdGFydHVwTGlzdGVuZXJOYW1lKTsKLQotICAgICAgICBpZihjdXN0b21TdGFydHVwTGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmluZm8oInN0YXJ0IGluaXQgb2YgIiArIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lci5pbml0KCk7Ci0KLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJpbml0IG9mICIgKyBjdXN0b21TdGFydHVwTGlzdGVuZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKAotICAgICAgICAgICAgICAgIG5ldyBIdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigKLSAgICAgICAgICAgICAgICBuZXcgVmlvbGF0aW9uU2V2ZXJpdHlWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7Ci0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKAotICAgICAgICAgICAgICAgIG5ldyBWaW9sYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuc2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcihuZXcgRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKSwgZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBGYWNlc01lc3NhZ2VQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFBoYXNlTGlzdGVuZXJzKCkKLSAgICB7Ci0gICAgICAgIEpzZlV0aWxzLnJlZ2lzdGVyUGhhc2VMaXN0ZW5lcihuZXcgUGhhc2VJZFJlY29yZGluZ1BoYXNlTGlzdGVuZXIoKSk7Ci0gICAgfQotCi0gICAgQERlcHJlY2F0ZWQKLSAgICBAVG9Ebyh2YWx1ZT1Qcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uPSJEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnkjdHJ5VG9GaW5kR2xvYmFsUGFyYW1ldGVyIHN0aWxsIHVzZXMiICsKLSAgICAgICAgICAgICJ0aGUgZ2xvYmFsIHBhcmFtZXRlciIpCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRWaW9sYXRpb25TZXZlcml0eUtleSgpCi0gICAgewotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eShWaW9sYXRpb25TZXZlcml0eS5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb24uZ2V0KCkudmlvbGF0aW9uU2V2ZXJpdHkoKSwgZmFsc2UpOwotICAgIH0KLQotICAgIEBEZXByZWNhdGVkCi0gICAgcHJpdmF0ZSB2b2lkIGluaXREaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb25LZXkoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICBFeHRWYWxDb3JlQ29uZmlndXJhdGlvbi5nZXQoKS5kaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb25WYWxpZGF0aW9uUGFyYW1ldGVyKCksIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFJlcXVpcmVkSW5pdGlhbGl6YXRpb24oKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiByZXF1aXJlZEluaXRpYWxpemF0aW9uID0gRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb24uZ2V0KCkuYWN0aXZhdGVSZXF1aXJlZEluaXRpYWxpemF0aW9uKCk7Ci0KLSAgICAgICAgLy9ub2luc3BlY3Rpb24gZGVwcmVjYXRpb24KLSAgICAgICAgYWRkUmVxdWlyZWRJbml0aWFsaXphdGlvbkFzR2xvYmFsUHJvcGVydHkocmVxdWlyZWRJbml0aWFsaXphdGlvbik7Ci0KLSAgICAgICAgaW5pdFJlcXVpcmVkQXR0cmlidXRlU3VwcG9ydCgpOwotICAgIH0KLQotICAgIEBEZXByZWNhdGVkCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFJlcXVpcmVkSW5pdGlhbGl6YXRpb25Bc0dsb2JhbFByb3BlcnR5KGJvb2xlYW4gcmVxdWlyZWRJbml0aWFsaXphdGlvbikKLSAgICB7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KCJtb2RlOmluaXQ6cmVxdWlyZWQiLCByZXF1aXJlZEluaXRpYWxpemF0aW9uLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaWYgaXQncyBjb25maWd1cmVkIHRoYXQgcmVxdWlyZWQgaW5pdCBzaG91bGQgaGFwcGVuLAotICAgICAqIGl0J3MgcmVxdWlyZWQgdG8gZGVhY3RpdmF0ZSB0aGUgc3VwcG9ydCBmb3IgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZQotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRSZXF1aXJlZEF0dHJpYnV0ZVN1cHBvcnQoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoIm1vZGU6cmVzZXQ6cmVxdWlyZWQiLAotICAgICAgICAgICAgICAgIEV4dFZhbENvcmVDb25maWd1cmF0aW9uLmdldCgpLmRlYWN0aXZhdGVSZXF1aXJlZEF0dHJpYnV0ZVN1cHBvcnQoKSwKLSAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0QXBwbGljYXRpb25TY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdEFwcGxpY2F0aW9uU2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZDc3MzcuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0QXBwbGljYXRpb25TY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuUkVVU0U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsNCi0NCi0vKioNCi0gKiBHZW5lcmljIHN0b3JhZ2UgbWFuYWdlciBpbXBsZW1lbnRhdGlvbiB3aGljaCBzdG9yZXMgdGhlIHN0b3JhZ2UgaW1wbGVtZW50YXRpb25zIGluIHRoZSBKU0YgYXBwbGljYXRpb24gc2NvcGUuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihSRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxUPiBleHRlbmRzIEFic3RyYWN0U3RvcmFnZU1hbmFnZXI8VD4NCi17DQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIGEgTWFwIG9mIGFsbCBjYWNoZWQgaW5zdGFuY2VzIGtleWVkIG9uIHRoZSB0eXBlIG9mIHN0b3JhZ2UgYXZhaWxhYmxlIGluIHRoZSBKU0YgQXBwbGljYXRpb24gc2NvcGUuDQotICAgICAqDQotICAgICAqIEByZXR1cm4gIE1hcCBvZiBhbGwgY2FjaGVkIHN0b3JhZ2UgTWFuYWdlciBpbXBsZW1lbnRhdGlvbnMga2V5ZWQgb24gdGhlIHR5cGUgb2Ygc3RvcmFnZS4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBUPiByZXNvbHZlU3RvcmFnZU1hcCgpDQotICAgIHsNCi0gICAgICAgIE1hcCBhcHBsaWNhdGlvbk1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbk1hcCgpOw0KLSAgICAgICAgTWFwPFN0cmluZywgVD4gc3RvcmFnZU1hcDsNCi0NCi0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighYXBwbGljYXRpb25NYXAuY29udGFpbnNLZXkoZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzdG9yYWdlTWFwID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgVD4oKTsNCi0gICAgICAgICAgICAgICAgYXBwbGljYXRpb25NYXAucHV0KGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCksIHN0b3JhZ2VNYXApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoTWFwPFN0cmluZywgVD4pYXBwbGljYXRpb25NYXAuZ2V0KGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFkODc1YS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LlJFVVNFOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogR2VuZXJpYyBzdG9yYWdlIG1hbmFnZXIgaW1wbGVtZW50YXRpb24gd2hpY2ggc3RvcmVzIHRoZSBzdG9yYWdlIGltcGxlbWVudGF0aW9ucyBpbiB0aGUgSlNGIHJlcXVlc3Qgc2NvcGUuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihSRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPFQ+IGV4dGVuZHMgQWJzdHJhY3RTdG9yYWdlTWFuYWdlcjxUPg0KLXsNCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgYSBNYXAgb2YgYWxsIGNhY2hlZCBpbnN0YW5jZXMga2V5ZWQgb24gdGhlIHR5cGUgb2Ygc3RvcmFnZSBhdmFpbGFibGUgaW4gdGhlIEpTRiBSZXF1ZXN0IHNjb3BlLg0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuICBNYXAgb2YgYWxsIGNhY2hlZCBzdG9yYWdlIE1hbmFnZXIgaW1wbGVtZW50YXRpb25zIGtleWVkIG9uIHRoZSB0eXBlIG9mIHN0b3JhZ2UuDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgVD4gcmVzb2x2ZVN0b3JhZ2VNYXAoKQ0KLSAgICB7DQotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7DQotICAgICAgICBNYXA8U3RyaW5nLCBUPiBzdG9yYWdlTWFwOw0KLQ0KLSAgICAgICAgaWYoIXJlcXVlc3RNYXAuY29udGFpbnNLZXkoZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RvcmFnZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgVD4oKTsNCi0gICAgICAgICAgICByZXF1ZXN0TWFwLnB1dChnZXRTdG9yYWdlTWFuYWdlcktleSgpLCBzdG9yYWdlTWFwKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoTWFwPFN0cmluZywgVD4pcmVxdWVzdE1hcC5nZXQoZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0U3RvcmFnZU1hbmFnZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdFN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOWYyZjEuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0U3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuUkVVU0U7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIEdlbmVyaWMgc3RvcmFnZSBtYW5hZ2VyIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIG5hbWUgbWFwcGVycy4gVGhlcmUgZXhpc3RzIDIgc3ViY2xhc3NlcywNCi0gKiBBYnN0cmFjdEFwcGxpY2F0aW9uU2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyIGFuZCBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIsIHRoYXQgdXNlIEpTRiBzY29wZXMgdG8gc3RvcmUNCi0gKiB0aGUgaW5mb3JtYXRpb24uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihSRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdG9yYWdlTWFuYWdlcjxUPiBleHRlbmRzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxTdHJpbmc+DQotICAgICAgICBpbXBsZW1lbnRzIFN0b3JhZ2VNYW5hZ2VyPFQ+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxTdHJpbmc+PiBuYW1lTWFwcGVyTGlzdCA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+KCk7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdFN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgbG9nZ2VyLmZpbmUoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIEltcGxlbWVudGF0aW9uIGNsYXNzZXMgZm9yIHRoZSBrZXkgKGFsc28gbmFtZWQgc3RvcmFnZU5hbWUpLCBhcmUgc3VwcGxpZWQgYnkgcmVnaXN0ZXJlZCBuYW1lTWFwcGVycy4NCi0gICAgICovDQotICAgIHB1YmxpYyBUIGNyZWF0ZShTdHJpbmcgc3RvcmFnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIFQgc3RvcmFnZU1hbmFnZXI7DQotICAgICAgICBTdHJpbmcgc3RvcmFnZUNsYXNzTmFtZTsNCi0gICAgICAgIC8vbnVsbCAtPiB1c2UgbmFtZSBtYXBwZXJzDQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8U3RyaW5nPiBuYW1lTWFwcGVyIDogdGhpcy5uYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlQ2xhc3NOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKHN0b3JhZ2VOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoc3RvcmFnZUNsYXNzTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHN0b3JhZ2VNYW5hZ2VyID0gcmVzb2x2ZVN0b3JhZ2Uoc3RvcmFnZU5hbWUsIHN0b3JhZ2VDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChzdG9yYWdlTWFuYWdlciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2VNYW5hZ2VyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXRyaWV2ZXMgdGhlIHN0b3JhZ2UgTWFuYWdlciBmcm9tIHRoZSBjYWNoZWQgaW5zdGFuY2VzLCBpZiBhbHJlYWR5IGNyZWF0ZWQgcHJldmlvdXNseS4gIEluIHRoZSBvdGhlciBjYXNlLA0KLSAgICAgKiBhIG5ldyBpbnN0YW5jZSBpcyBjcmVhdGVkIGFuZCBzdG9yZWQgdG8gdGhlIGNhY2hlLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gc3RvcmFnZUtleSAgVGhlIHR5cGUgb2Ygc3RvcmFnZSB0aGF0IG5lZWRzIHRvIGJlIGNyZWF0ZWQNCi0gICAgICogQHBhcmFtIHN0b3JhZ2VDbGFzc05hbWUgIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3RvcmFnZSBtYW5hZ2VyLg0KLSAgICAgKiBAcmV0dXJuIEltcGxlbWVudGF0aW9uIG9mIHRoZSBzdG9yYWdlIG1hbmFnZXIuIENvdWxkIGJlIG51bGwgaWYgbmFtZSBtYXBwZXIgc3VwcGxpZWQgbm9uIGV4aXN0ZW50IGNsYXNzIG5hbWUuDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgVCByZXNvbHZlU3RvcmFnZShTdHJpbmcgc3RvcmFnZUtleSwgU3RyaW5nIHN0b3JhZ2VDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFQ+IHN0b3JhZ2VNYXAgPSByZXNvbHZlU3RvcmFnZU1hcCgpOw0KLQ0KLSAgICAgICAgaWYoIXN0b3JhZ2VNYXAuY29udGFpbnNLZXkoc3RvcmFnZUtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3luY2hyb25pemVkIChzdG9yYWdlTWFwKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgc3RvcmFnZU1hcC5wdXQoc3RvcmFnZUtleSwgKFQpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHN0b3JhZ2VDbGFzc05hbWUpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3RvcmFnZU1hcC5nZXQoc3RvcmFnZUtleSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFN1YmNsYXNzZXMgbmVlZCB0byBzdXBwbHkgdGhlIGxpc3Qgb2YgYWxsIGNhY2hlZCBpbnN0YW5jZXMuDQotICAgICAqDQotICAgICAqIEByZXR1cm4gTWFwIG9mIGFsbCBjYWNoZWQgc3RvcmFnZSBNYW5hZ2VyIGltcGxlbWVudGF0aW9ucyBrZXllZCBvbiB0aGUgdHlwZSBvZiBzdG9yYWdlLg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IE1hcDxTdHJpbmcsIFQ+IHJlc29sdmVTdG9yYWdlTWFwKCk7DQotDQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldChTdHJpbmcgc3RvcmFnZUtleSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgVD4gc3RvcmFnZU1hcCA9IHJlc29sdmVTdG9yYWdlTWFwKCk7DQotDQotICAgICAgICBpZihzdG9yYWdlTWFwICE9IG51bGwgJiYgc3RvcmFnZU1hcC5jb250YWluc0tleShzdG9yYWdlS2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDbGFzcyBzdG9yYWdlQ2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHN0b3JhZ2VNYXAuZ2V0KHN0b3JhZ2VLZXkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgIHN0b3JhZ2VNYXAucHV0KHN0b3JhZ2VLZXksIChUKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHN0b3JhZ2VDbGFzcykpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gZ2V0TmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5uYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUga2V5IHdoZXJlIHRoZSBjYWNoZWQgaW5zdGFuY2VzIGNhbiBiZSBmb3VuZCBpbiB0aGUgSlNGIFNjb3BlLg0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIGtleSBmb3IgZmluZGluZyB0aGUgY2FjaGVkIGluc3RhbmNlcyBpbiB0aHJlIEpTRiBTY29wZS4gDQotICAgICAqLw0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCk7DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdhZjAzMS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlIGltcGxlbWVudHMgRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgUGhhc2VJZCBjdXJyZW50UGhhc2VJZDsNCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q3VycmVudFBoYXNlSWQoUGhhc2VJZCBwaGFzZUlkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmN1cnJlbnRQaGFzZUlkID0gcGhhc2VJZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRDdXJyZW50UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRQaGFzZUlkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDJlYzRiLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlci5EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIGpzZiBpbmZvcm1hdGlvbiBub3QgYXZhaWxhYmxlIHZpYSBqc2YtYXBpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIgZXh0ZW5kcw0KLSAgICAgICAgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlPg0KLXsNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcga2V5ID0gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfRkFDRVNfSU5GT1JNQVRJT05fU1RPUkFHRTpLRVkiOw0KLQ0KLSAgICBEZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBrZXk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkNmI3Yy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5GYWNlc01lc3NhZ2VIb2xkZXI7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkxPVywgZGVzY3JpcHRpb24gPSAib3B0aW9uYWwgcGFyYW1ldGVyIHRvIGRlYWN0aXZhdGUgc29ydGluZyIpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2UgaW1wbGVtZW50cyBGYWNlc01lc3NhZ2VTdG9yYWdlDQotew0KLSAgICBNYXA8U3RyaW5nLCBWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBWYWxpZGF0aW9uUmVzdWx0PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRGYWNlc01lc3NhZ2UoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBpZihjbGllbnRJZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNsaWVudElkID0gIioiOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoIXRoaXMucmVzdWx0cy5jb250YWluc0tleShjbGllbnRJZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5yZXN1bHRzLnB1dChjbGllbnRJZCwgbmV3IFZhbGlkYXRpb25SZXN1bHQoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICB0aGlzLnJlc3VsdHMuZ2V0KGNsaWVudElkKS5hZGRGYWNlc01lc3NhZ2VIb2xkZXIobmV3IEZhY2VzTWVzc2FnZUhvbGRlcihmYWNlc01lc3NhZ2UsIGNsaWVudElkKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBnZXRGYWNlc01lc3NhZ2VzKCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPigpOw0KLQ0KLSAgICAgICAgZm9yKFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGlvblJlc3VsdCA6IHRoaXMucmVzdWx0cy52YWx1ZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQuYWRkQWxsKHZhbGlkYXRpb25SZXN1bHQuZ2V0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkQWxsKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0Ow0KLQ0KLSAgICAgICAgZm9yKFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGlvblJlc3VsdCA6IHRoaXMucmVzdWx0cy52YWx1ZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0ID0gdmFsaWRhdGlvblJlc3VsdC5nZXRGYWNlc01lc3NhZ2VIb2xkZXJMaXN0KCk7DQotICAgICAgICAgICAgc29ydEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCk7DQotDQotICAgICAgICAgICAgZm9yKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIgOiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LmFkZE1lc3NhZ2UoZmFjZXNNZXNzYWdlSG9sZGVyLmdldENsaWVudElkKCksIGZhY2VzTWVzc2FnZUhvbGRlci5nZXRGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzb3J0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdChMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCkNCi0gICAgew0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChmYWNlc01lc3NhZ2VIb2xkZXJMaXN0LCBnZXRGYWNlc01lc3NhZ2VDb21wYXJhdG9yKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBDb21wYXJhdG9yPEZhY2VzTWVzc2FnZUhvbGRlcj4gZ2V0RmFjZXNNZXNzYWdlQ29tcGFyYXRvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgQ29tcGFyYXRvcjxGYWNlc01lc3NhZ2VIb2xkZXI+KCkgew0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShGYWNlc01lc3NhZ2VIb2xkZXIgaG9sZGVyMSwgRmFjZXNNZXNzYWdlSG9sZGVyIGhvbGRlcjIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihob2xkZXIxLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYoaXNTYW1lU2V2ZXJpdHkoaG9sZGVyMSwgaG9sZGVyMikpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlTWVzc2FnZVRleHQoaG9sZGVyMS5nZXRGYWNlc01lc3NhZ2UoKSwgaG9sZGVyMi5nZXRGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYoaG9sZGVyMS5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpLmdldE9yZGluYWwoKSA+DQotICAgICAgICAgICAgICAgICAgICAgICAgaG9sZGVyMi5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpLmdldE9yZGluYWwoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHJpdmF0ZSBpbnQgY29tcGFyZU1lc3NhZ2VUZXh0KEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UxLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlMikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0MSA9IGZhY2VzTWVzc2FnZTEuZ2V0RGV0YWlsKCk7DQotICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0MiA9IGZhY2VzTWVzc2FnZTIuZ2V0RGV0YWlsKCk7DQotDQotICAgICAgICAgICAgICAgIGlmKHRleHQxID09IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRleHQxID0gZmFjZXNNZXNzYWdlMS5nZXRTdW1tYXJ5KCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYodGV4dDIgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdGV4dDIgPSBmYWNlc01lc3NhZ2UyLmdldFN1bW1hcnkoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZih0ZXh0MSA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZih0ZXh0MiA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRleHQxLmNvbXBhcmVUb0lnbm9yZUNhc2UodGV4dDIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH07DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU2FtZVNldmVyaXR5KEZhY2VzTWVzc2FnZUhvbGRlciBob2xkZXIxLCBGYWNlc01lc3NhZ2VIb2xkZXIgaG9sZGVyMikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGhvbGRlcjEuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKS5lcXVhbHMoaG9sZGVyMi5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NDg5MTcuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VOYW1lTWFwcGVyOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBmYWNlcyBtZXNzYWdlcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotY2xhc3MgRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPEZhY2VzTWVzc2FnZVN0b3JhZ2U+DQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZID0gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfRkFDRVNfTUVTU0FHRVM6S0VZIjsNCi0NCi0gICAgRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEtFWTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEdyb3VwU3RvcmFnZS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM2YmRjMy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEdyb3VwU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkdyb3VwVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbiBmb3IgZ3JvdXBzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEdyb3VwU3RvcmFnZSBpbXBsZW1lbnRzIEdyb3VwU3RvcmFnZQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PENsYXNzPj4gYWRkZWRHcm91cHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8Q2xhc3M+PigpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8Q2xhc3M+PiByZXN0cmljdGVkR3JvdXBzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PENsYXNzPj4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkR3JvdXAoQ2xhc3MgZ3JvdXBDbGFzcywgU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICBhZGRHcm91cFRvR3JvdXBTdG9yYWdlKGdyb3VwQ2xhc3MsIHZpZXdJZCwgY2xpZW50SWQsIHRoaXMuYWRkZWRHcm91cHMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlc3RyaWN0R3JvdXAoQ2xhc3MgZ3JvdXBDbGFzcywgU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICBhZGRHcm91cFRvR3JvdXBTdG9yYWdlKGdyb3VwQ2xhc3MsIHZpZXdJZCwgY2xpZW50SWQsIHRoaXMucmVzdHJpY3RlZEdyb3Vwcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENsYXNzW10gZ2V0R3JvdXBzKFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5hZGRlZEdyb3Vwcy5zaXplKCkgPCAxKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9hZGQgZm91bmQgZ3JvdXBzDQotICAgICAgICBTdHJpbmcga2V5ID0gR3JvdXBVdGlscy5nZXRHcm91cEtleSh2aWV3SWQsIG51bGwpOw0KLSAgICAgICAgTGlzdDxDbGFzcz4gcmVzdWx0TGlzdEZvclBhZ2UgPSBidWlsZEdyb3VwTGlzdChrZXksIHRoaXMuYWRkZWRHcm91cHMpOw0KLQ0KLSAgICAgICAga2V5ID0gR3JvdXBVdGlscy5nZXRHcm91cEtleSh2aWV3SWQsIGNsaWVudElkKTsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IHJlc3VsdExpc3RGb3JDb21wb25lbnQgPSBidWlsZEdyb3VwTGlzdChrZXksIHRoaXMuYWRkZWRHcm91cHMpOw0KLQ0KLSAgICAgICAgLy9yZW1vdmUgcmVzdHJpY3RlZCBncm91cHMNCi0gICAgICAgIENsYXNzW10gcmVzdWx0c0ZvclBhZ2UgPQ0KLSAgICAgICAgICAgICAgICBmaWx0ZXJHcm91cExpc3QoR3JvdXBVdGlscy5nZXRHcm91cEtleSh2aWV3SWQsIG51bGwpLCByZXN1bHRMaXN0Rm9yUGFnZSk7DQotICAgICAgICBDbGFzc1tdIHJlc3VsdHNGb3JDb21wb25lbnQgPQ0KLSAgICAgICAgICAgICAgICBmaWx0ZXJHcm91cExpc3QoR3JvdXBVdGlscy5nZXRHcm91cEtleSh2aWV3SWQsIGNsaWVudElkKSwgcmVzdWx0TGlzdEZvckNvbXBvbmVudCk7DQotDQotICAgICAgICBpZihyZXN1bHRzRm9yUGFnZS5sZW5ndGggPT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihyZXN1bHRzRm9yQ29tcG9uZW50Lmxlbmd0aCA9PSAwKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZmluZSgibm8gZ3JvdXBzIGZvciBncm91cC12YWxpZGF0aW9uIGF2YWlsYWJsZS4iICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAibWF5YmUgeW91IHJlc3RyaWN0ZWQgYWxsIGdyb3VwcyBvciB5b3UgYXJlbid0IHVzaW5nIGdyb3Vwcy4iICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiYmVhbiB2YWxpZGF0aW9uIHdpbGwgdXNlIHRoZSBkZWZhdWx0IGdyb3VwIGZvciB2YWxpZGF0aW9uIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRzRm9yQ29tcG9uZW50Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihyZXN1bHRzRm9yQ29tcG9uZW50Lmxlbmd0aCA9PSAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRzRm9yUGFnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBtZXJnZVJlc3VsdHMocmVzdWx0c0ZvclBhZ2UsIHJlc3VsdHNGb3JDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRHcm91cFRvR3JvdXBTdG9yYWdlKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IGdyb3VwU3RvcmFnZSkNCi0gICAgew0KLSAgICAgICAgTGlzdDxDbGFzcz4gZ3JvdXBMaXN0ID0gZ3JvdXBTdG9yYWdlLmdldChHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgY2xpZW50SWQpKTsNCi0NCi0gICAgICAgIGlmKGdyb3VwTGlzdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGdyb3VwTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgICAgICAgICAgZ3JvdXBTdG9yYWdlLnB1dChHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgY2xpZW50SWQpLCBncm91cExpc3QpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoIWdyb3VwTGlzdC5jb250YWlucyhncm91cENsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBncm91cExpc3QuYWRkKGdyb3VwQ2xhc3MpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxDbGFzcz4gYnVpbGRHcm91cExpc3QoU3RyaW5nIGtleSwgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IGdyb3VwU3RvcmFnZSkNCi0gICAgew0KLSAgICAgICAgTGlzdDxDbGFzcz4gbGlzdCA9IGdyb3VwU3RvcmFnZS5nZXQoa2V5KTsNCi0gICAgICAgIHJldHVybiAobGlzdCAhPSBudWxsKSA/IGxpc3QgOiBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3NbXSBmaWx0ZXJHcm91cExpc3QoU3RyaW5nIGtleSwgTGlzdDxDbGFzcz4gYWRkZWRHcm91cHMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHMgPSBidWlsZEdyb3VwTGlzdChrZXksIHRoaXMucmVzdHJpY3RlZEdyb3Vwcyk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBjdXJyZW50R3JvdXAgOiBhZGRlZEdyb3VwcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighcmVzdHJpY3RlZEdyb3Vwcy5jb250YWlucyhjdXJyZW50R3JvdXApKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoY3VycmVudEdyb3VwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0cy50b0FycmF5KG5ldyBDbGFzc1tyZXN1bHRzLnNpemUoKV0pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3NbXSBtZXJnZVJlc3VsdHMoQ2xhc3NbXSByZXN1bHRzRm9yUGFnZSwgQ2xhc3NbXSByZXN1bHRzRm9yQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBDbGFzc1tdIG1lcmdlZFJlc3VsdCA9IG5ldyBDbGFzc1tyZXN1bHRzRm9yUGFnZS5sZW5ndGggKyByZXN1bHRzRm9yQ29tcG9uZW50Lmxlbmd0aF07DQotDQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdHNGb3JQYWdlLCAwLCBtZXJnZWRSZXN1bHQsIDAsIHJlc3VsdHNGb3JQYWdlLmxlbmd0aCk7DQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdHNGb3JDb21wb25lbnQsIDAsIG1lcmdlZFJlc3VsdCwgcmVzdWx0c0ZvclBhZ2UubGVuZ3RoLCByZXN1bHRzRm9yQ29tcG9uZW50Lmxlbmd0aCk7DQotDQotICAgICAgICByZXR1cm4gbWVyZ2VkUmVzdWx0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0R3JvdXBTdG9yYWdlTWFuYWdlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlY2NiOWYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBncm91cHMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRHcm91cFN0b3JhZ2VNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPEdyb3VwU3RvcmFnZT4NCi17DQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGtleSA9IFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX0dST1VQUzpLRVkiOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGtleTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMGY2YWYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuTnVsbFZhbHVlQXdhcmVDb25jdXJyZW50SGFzaE1hcDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSByNA0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2UgaW1wbGVtZW50cyBNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBQcm9wZXJ0eURldGFpbHM+PiBwcm9wZXJ0eURldGFpbHNNYXAgPQ0KLSAgICAgICAgICAgIG5ldyBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFByb3BlcnR5RGV0YWlscz4+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIHN0b3JlTWFwcGluZyhDbGFzcyBvcmlnaW5hbENsYXNzLCBTdHJpbmcgb3JpZ2luYWxQcm9wZXJ0eSwgUHJvcGVydHlEZXRhaWxzIHRhcmdldFByb3BlcnR5RGV0YWlscykNCi0gICAgew0KLSAgICAgICAgaWYodGFyZ2V0UHJvcGVydHlEZXRhaWxzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoaXNGaWx0ZXJlZENsYXNzKG9yaWdpbmFsQ2xhc3MpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURldGFpbHM+IGNsYXNzTWFwID0gZ2V0TWFwRm9yQ2xhc3Mob3JpZ2luYWxDbGFzcyk7DQotICAgICAgICAgICAgY2xhc3NNYXAucHV0KG9yaWdpbmFsUHJvcGVydHksIG51bGwpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBuZXcgUHJvcGVydHlEZXRhaWxzKHRhcmdldFByb3BlcnR5RGV0YWlscy5nZXRLZXkoKSwNCi0gICAgICAgICAgICAgICAgdGFyZ2V0UHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSwgdGFyZ2V0UHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCkpOw0KLQ0KLSAgICAgICAgZ2V0TWFwRm9yQ2xhc3Mob3JpZ2luYWxDbGFzcykucHV0KG9yaWdpbmFsUHJvcGVydHksIHByb3BlcnR5RGV0YWlscyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNGaWx0ZXJlZENsYXNzKENsYXNzIG9yaWdpbmFsQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBSZXNvdXJjZUJ1bmRsZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG9yaWdpbmFsQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm9wZXJ0eURldGFpbHMgZ2V0TWFwcGVkQ29uc3RyYWludFNvdXJjZShDbGFzcyBvcmlnaW5hbENsYXNzLCBTdHJpbmcgb3JpZ2luYWxQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgaWYoaXNGaWx0ZXJlZENsYXNzKG9yaWdpbmFsQ2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIGZvdW5kRW50cnkgPSBnZXRNYXBGb3JDbGFzcyhvcmlnaW5hbENsYXNzKS5nZXQob3JpZ2luYWxQcm9wZXJ0eSk7DQotDQotICAgICAgICBpZihmb3VuZEVudHJ5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscyhmb3VuZEVudHJ5LmdldEtleSgpLCBmb3VuZEVudHJ5LmdldEJhc2VPYmplY3QoKSwgZm91bmRFbnRyeS5nZXRQcm9wZXJ0eSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc01hcHBpbmcoQ2xhc3Mgb3JpZ2luYWxDbGFzcywgU3RyaW5nIG9yaWdpbmFsUHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGlmKGlzRmlsdGVyZWRDbGFzcyhvcmlnaW5hbENsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2F2b2lkIHNjYW5uaW5nIHByb2Nlc3MNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBnZXRNYXBGb3JDbGFzcyhvcmlnaW5hbENsYXNzKS5jb250YWluc0tleShvcmlnaW5hbFByb3BlcnR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFByb3BlcnR5RGV0YWlscz4gZ2V0TWFwRm9yQ2xhc3MoQ2xhc3MgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcga2V5ID0gUHJveHlVdGlscy5nZXRDbGFzc05hbWUodGFyZ2V0KTsNCi0gICAgICAgIGlmKCF0aGlzLnByb3BlcnR5RGV0YWlsc01hcC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMucHJvcGVydHlEZXRhaWxzTWFwLnB1dCgNCi0gICAgICAgICAgICAgICAgICAgIGtleSwgbmV3IE51bGxWYWx1ZUF3YXJlQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0eURldGFpbHM+KGNyZWF0ZURlZmF1bHRWYWx1ZSgpKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eURldGFpbHNNYXAuZ2V0KGtleSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eURldGFpbHMgY3JlYXRlRGVmYXVsdFZhbHVlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURldGFpbHMobnVsbCwgbnVsbCwgbnVsbCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZU1hbmFnZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMTcyNmEuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIG1hcHBlZCBwcm9wZXJ0aWVzIGluZm9ybWF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgcjQNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0TWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2VNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxQcm9wZXJ0eVN0b3JhZ2U+DQotew0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBrZXkgPSBTdG9yYWdlTWFuYWdlci5jbGFzcy5nZXROYW1lKCkgKyAiX0ZPUl9NQVBQRURfQ09OU1RSQUlOVF9TT1VSQ0U6S0VZIjsNCi0NCi0gICAgRGVmYXVsdE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBEZWZhdWx0TWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4ga2V5Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWV0YURhdGFTdG9yYWdlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWZkMTI4Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWV0YURhdGFTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuTnVsbFZhbHVlQXdhcmVDb25jdXJyZW50SGFzaE1hcDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWV0YURhdGFTdG9yYWdlIGltcGxlbWVudHMgTWV0YURhdGFTdG9yYWdlDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFByb3BlcnR5SW5mb3JtYXRpb24+PiBjYWNoZWRQcm9wZXJ0eUluZm9ybWF0aW9uID0NCi0gICAgICAgICAgICBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBQcm9wZXJ0eUluZm9ybWF0aW9uPj4oKTsNCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gbWV0YURhdGFTdG9yYWdlRmlsdGVycyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDxNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+KCk7DQotICAgIHByaXZhdGUgTGlzdDxDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPj4gZGVuaWVkTWV0YURhdGFGaWx0ZXJzID0NCi0gICAgICAgICAgICBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8Q2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0TWV0YURhdGFTdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgaW5pdEZpbHRlcnMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdEZpbHRlcnMoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb24uZ2V0KCkuY3VzdG9tTWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lKCkpOw0KLSAgICAgICAgbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoDQotICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIpKTsNCi0NCi0gICAgICAgIE1ldGFEYXRhU3RvcmFnZUZpbHRlciBtZXRhRGF0YVN0b3JhZ2VGaWx0ZXI7DQotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lIDogbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgPQ0KLSAgICAgICAgICAgICAgICAoTWV0YURhdGFTdG9yYWdlRmlsdGVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWV0YURhdGFTdG9yYWdlRmlsdGVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLm1ldGFEYXRhU3RvcmFnZUZpbHRlcnMuYWRkKG1ldGFEYXRhU3RvcmFnZUZpbHRlcik7DQotDQotICAgICAgICAgICAgICAgIGxvZ0FkZGVkRmlsdGVyKG1ldGFEYXRhU3RvcmFnZUZpbHRlci5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc3RvcmVNZXRhRGF0YU9mKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgaW52b2tlRmlsdGVycyhwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvblRvU3RvcmUgPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBwcm9wZXJ0eUluZm9ybWF0aW9uDQotICAgICAgICAgICAgICAgIC5nZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgY29weU1ldGFEYXRhKHByb3BlcnR5SW5mb3JtYXRpb24sIHByb3BlcnR5SW5mb3JtYXRpb25Ub1N0b3JlKTsNCi0NCi0gICAgICAgIGdldE1hcEZvckNsYXNzKFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpKSkNCi0gICAgICAgICAgICAgICAgLnB1dChwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvblRvU3RvcmUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbnZva2VGaWx0ZXJzKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgZm9yKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBmaWx0ZXIgOiB0aGlzLm1ldGFEYXRhU3RvcmFnZUZpbHRlcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmlsdGVyLmZpbHRlcihwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeVtdIGdldE1ldGFEYXRhKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IGdldE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5nZXQodGFyZ2V0UHJvcGVydHkpOw0KLQ0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBjbG9uZWRQcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKCk7DQotICAgICAgICBjb3B5TWV0YURhdGEocHJvcGVydHlJbmZvcm1hdGlvbiwgY2xvbmVkUHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgICAgICByZXR1cm4gY2xvbmVkUHJvcGVydHlJbmZvcm1hdGlvbi5nZXRNZXRhRGF0YUVudHJpZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc01ldGFEYXRhRm9yKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykuY29udGFpbnNLZXkodGFyZ2V0UHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRmlsdGVyKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBzdG9yYWdlRmlsdGVyKQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoIWlzRmlsdGVyRGVuaWVkKHN0b3JhZ2VGaWx0ZXIpICYmICFpc0ZpbHRlckFscmVhZHlSZWdpc3RlcmVkKHN0b3JhZ2VGaWx0ZXIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5tZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzLmFkZChzdG9yYWdlRmlsdGVyKTsNCi0gICAgICAgICAgICAgICAgbG9nQWRkZWRGaWx0ZXIoc3RvcmFnZUZpbHRlci5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRmlsdGVyRGVuaWVkKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBzdG9yYWdlRmlsdGVyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5kZW5pZWRNZXRhRGF0YUZpbHRlcnMuY29udGFpbnMoZ2V0U3RvcmFnZUZpbHRlckNsYXNzKHN0b3JhZ2VGaWx0ZXIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNGaWx0ZXJBbHJlYWR5UmVnaXN0ZXJlZChNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgc3RvcmFnZUZpbHRlcikNCi0gICAgew0KLSAgICAgICAgZm9yKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBmaWx0ZXIgOiB0aGlzLm1ldGFEYXRhU3RvcmFnZUZpbHRlcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoZmlsdGVyLmdldENsYXNzKCkuZXF1YWxzKGdldFN0b3JhZ2VGaWx0ZXJDbGFzcyhzdG9yYWdlRmlsdGVyKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZGVyZWdpc3RlckZpbHRlcihDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPiBmaWx0ZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgTWV0YURhdGFTdG9yYWdlRmlsdGVyIHN0b3JhZ2VGaWx0ZXIgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzcyhmaWx0ZXJDbGFzcyk7DQotDQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5tZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzLnJlbW92ZShzdG9yYWdlRmlsdGVyKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGxvZ1JlbW92ZWRGaWx0ZXIoc3RvcmFnZUZpbHRlci5nZXRDbGFzcygpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBkZW55RmlsdGVyKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlcklkIDogdGhpcy5kZW5pZWRNZXRhRGF0YUZpbHRlcnMpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihmaWx0ZXJJZC5lcXVhbHMoZmlsdGVyQ2xhc3MpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdGhpcy5kZW5pZWRNZXRhRGF0YUZpbHRlcnMuYWRkKGZpbHRlckNsYXNzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGRlcmVnaXN0ZXJGaWx0ZXIoZmlsdGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkNCi0gICAgcHJpdmF0ZSB2b2lkIGNvcHlNZXRhRGF0YShQcm9wZXJ0eUluZm9ybWF0aW9uIHNvdXJjZSwgUHJvcGVydHlJbmZvcm1hdGlvbiB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRW50cnkgbmV3TWV0YURhdGFFbnRyeTsNCi0gICAgICAgIGZvcihNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkgOiBzb3VyY2UuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbmV3TWV0YURhdGFFbnRyeSA9IG5ldyBNZXRhRGF0YUVudHJ5KCk7DQotICAgICAgICAgICAgbmV3TWV0YURhdGFFbnRyeS5zZXRLZXkobWV0YURhdGFFbnRyeS5nZXRLZXkoKSk7DQotICAgICAgICAgICAgbmV3TWV0YURhdGFFbnRyeS5zZXRWYWx1ZShtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkpOw0KLQ0KLSAgICAgICAgICAgIHRhcmdldC5hZGRNZXRhRGF0YUVudHJ5KG5ld01ldGFEYXRhRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBsb2dBZGRlZEZpbHRlcihDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPiBmaWx0ZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhmaWx0ZXJDbGFzcy5nZXROYW1lKCkgKyAiIGFkZGVkIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGxvZ1JlbW92ZWRGaWx0ZXIoQ2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gZmlsdGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oZmlsdGVyQ2xhc3MuZ2V0TmFtZSgpICsgIiByZW1vdmVkIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBQcm9wZXJ0eUluZm9ybWF0aW9uPiBnZXRNYXBGb3JDbGFzcyhDbGFzcyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBrZXkgPSBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh0YXJnZXQpOw0KLSAgICAgICAgaWYoIXRoaXMuY2FjaGVkUHJvcGVydHlJbmZvcm1hdGlvbi5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuY2FjaGVkUHJvcGVydHlJbmZvcm1hdGlvbi5wdXQoa2V5LA0KLSAgICAgICAgICAgICAgICBuZXcgTnVsbFZhbHVlQXdhcmVDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5SW5mb3JtYXRpb24+KG5ldyBOdWxsTWFya2VyUHJvcGVydHlJbmZvcm1hdGlvbigpKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRQcm9wZXJ0eUluZm9ybWF0aW9uLmdldChrZXkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE51bGxNYXJrZXJQcm9wZXJ0eUluZm9ybWF0aW9uIGltcGxlbWVudHMgUHJvcGVydHlJbmZvcm1hdGlvbg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0luZm9ybWF0aW9uKFN0cmluZyBrZXkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEluZm9ybWF0aW9uKFN0cmluZyBrZXkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgPFQ+IFQgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgTWV0YURhdGFFbnRyeVtdIGdldE1ldGFEYXRhRW50cmllcygpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRNZXRhRGF0YUVudHJ5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0TWV0YURhdGFFbnRyaWVzKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuaGFzaENvZGUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0YXJnZXQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRhcmdldCAhPSBudWxsICYmIGdldENsYXNzKCkuZXF1YWxzKHRhcmdldC5nZXRDbGFzcygpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGdldFN0b3JhZ2VGaWx0ZXJDbGFzcyhNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgc3RvcmFnZUZpbHRlcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3Moc3RvcmFnZUZpbHRlci5nZXRDbGFzcygpLCBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuY2xhc3MpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWV0YURhdGFTdG9yYWdlTWFuYWdlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMThjZjguLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlci5EZWZhdWx0TWV0YURhdGFTdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBwcm9wZXJ0eSBpbmZvcm1hdGlvbiBlbnRyaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxNZXRhRGF0YVN0b3JhZ2U+DQotew0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBrZXkgPSBTdG9yYWdlTWFuYWdlci5jbGFzcy5nZXROYW1lKCkgKyAiX0ZPUl9NRVRBX0RBVEFfQ0FDSEU6S0VZIjsNCi0NCi0gICAgRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBrZXk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2UuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UHJvcGVydHlTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMGU1NTIuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9wZXJ0eVN0b3JhZ2UgaW1wbGVtZW50cyBQcm9wZXJ0eVN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWFwPFN0cmluZywgRmllbGQ+PiBmaWVsZE1hcCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEZpZWxkPj4oKTsNCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBNZXRob2Q+PiBtZXRob2RNYXAgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBNZXRob2Q+PigpOw0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZmllbGROb3RBdmFpbGFibGVNYXAgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+KCk7DQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBtZXRob2ROb3RBdmFpbGFibGVNYXAgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIHN0b3JlRmllbGQoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSwgRmllbGQgZmllbGQpDQotICAgIHsNCi0gICAgICAgIGlmKGZpZWxkICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZ2V0RmllbGRNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykucHV0KHByb3BlcnR5LCBmaWVsZCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgZ2V0Tm90QXZhaWxhYmxlRmllbGRMaXN0Rm9yQ2xhc3ModGFyZ2V0Q2xhc3MpLmFkZChwcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc3RvcmVNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSwgTWV0aG9kIG1ldGhvZCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0aG9kICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZ2V0TWV0aG9kTWFwRm9yQ2xhc3ModGFyZ2V0Q2xhc3MpLnB1dChwcm9wZXJ0eSwgIG1ldGhvZCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgZ2V0Tm90QXZhaWxhYmxlTWV0aG9kTGlzdEZvckNsYXNzKHRhcmdldENsYXNzKS5hZGQocHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGaWVsZCBnZXRGaWVsZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBGaWVsZD4gZmllbGRNYXAgPSBnZXRGaWVsZE1hcEZvckNsYXNzKHRhcmdldENsYXNzKTsNCi0gICAgICAgIHJldHVybiBmaWVsZE1hcC5nZXQocHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE1ldGhvZD4gbWV0aG9kTWFwID0gZ2V0TWV0aG9kTWFwRm9yQ2xhc3ModGFyZ2V0Q2xhc3MpOw0KLSAgICAgICAgcmV0dXJuIG1ldGhvZE1hcC5nZXQocHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zRmllbGQoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBnZXRGaWVsZE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5jb250YWluc0tleShwcm9wZXJ0eSk7DQotDQotICAgICAgICBpZighcmVzdWx0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IGdldE5vdEF2YWlsYWJsZUZpZWxkTGlzdEZvckNsYXNzKHRhcmdldENsYXNzKS5jb250YWlucyhwcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zTWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZ2V0TWV0aG9kTWFwRm9yQ2xhc3ModGFyZ2V0Q2xhc3MpLmNvbnRhaW5zS2V5KHByb3BlcnR5KTsNCi0NCi0gICAgICAgIGlmKCFyZXN1bHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gZ2V0Tm90QXZhaWxhYmxlTWV0aG9kTGlzdEZvckNsYXNzKHRhcmdldENsYXNzKS5jb250YWlucyhwcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgRmllbGQ+IGdldEZpZWxkTWFwRm9yQ2xhc3MoQ2xhc3MgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcga2V5ID0gUHJveHlVdGlscy5nZXRDbGFzc05hbWUodGFyZ2V0KTsNCi0gICAgICAgIGlmICghdGhpcy5maWVsZE1hcC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuZmllbGRNYXAucHV0KGtleSwgbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgRmllbGQ+KCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRoaXMuZmllbGRNYXAuZ2V0KGtleSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0Tm90QXZhaWxhYmxlRmllbGRMaXN0Rm9yQ2xhc3MoQ2xhc3MgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcga2V5ID0gUHJveHlVdGlscy5nZXRDbGFzc05hbWUodGFyZ2V0KTsNCi0gICAgICAgIGlmICghdGhpcy5maWVsZE5vdEF2YWlsYWJsZU1hcC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuZmllbGROb3RBdmFpbGFibGVNYXAucHV0KGtleSwgbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PFN0cmluZz4oKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdGhpcy5maWVsZE5vdEF2YWlsYWJsZU1hcC5nZXQoa2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1ldGhvZD4gZ2V0TWV0aG9kTWFwRm9yQ2xhc3MoQ2xhc3MgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcga2V5ID0gUHJveHlVdGlscy5nZXRDbGFzc05hbWUodGFyZ2V0KTsNCi0gICAgICAgIGlmICghdGhpcy5tZXRob2RNYXAuY29udGFpbnNLZXkoa2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLm1ldGhvZE1hcC5wdXQoa2V5LCBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBNZXRob2Q+KCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRoaXMubWV0aG9kTWFwLmdldChrZXkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGdldE5vdEF2YWlsYWJsZU1ldGhvZExpc3RGb3JDbGFzcyhDbGFzcyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBrZXkgPSBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh0YXJnZXQpOw0KLSAgICAgICAgaWYgKCF0aGlzLm1ldGhvZE5vdEF2YWlsYWJsZU1hcC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubWV0aG9kTm90QXZhaWxhYmxlTWFwLnB1dChrZXksIG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDxTdHJpbmc+KCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRoaXMubWV0aG9kTm90QXZhaWxhYmxlTWFwLmdldChrZXkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UHJvcGVydHlTdG9yYWdlTWFuYWdlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MWVjNTIuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlci5EZWZhdWx0UHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlcjsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgcHJvcGVydHkgaW5mb3JtYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxQcm9wZXJ0eVN0b3JhZ2U+DQotew0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBrZXkgPSBTdG9yYWdlTWFuYWdlci5jbGFzcy5nZXROYW1lKCkgKyAiX0ZPUl9QUk9QRVJUWTpLRVkiOw0KLQ0KLSAgICBEZWZhdWx0UHJvcGVydHlTdG9yYWdlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBEZWZhdWx0UHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGtleTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTVmYjBjLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UgaW1wbGVtZW50cyBSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmdldChrZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyA8VD4gVCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChUKXRoaXMucHJvcGVydGllcy5nZXQoa2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnRpZXMucmVtb3ZlKGtleSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTWFuYWdlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGRmYmI4Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlcjsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgcmVuZGVyZXIgaW50ZXJjZXB0b3IgcHJvcGVydGllcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotY2xhc3MgRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyDQotICAgICAgICBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlPg0KLXsNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcga2V5ID0gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfUkVOREVSRVJfSU5URVJDRVBUT1JfUFJPUEVSVFk6S0VZIjsNCi0NCi0gICAgRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGtleTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMjdlZjguLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlIGltcGxlbWVudGF0aW9uIGZvciBncm91cHMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2UgaW1wbGVtZW50cyBSZW5kZXJlclByb3h5U3RvcmFnZQ0KLXsNCi0gICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeT4+IHByb3h5U3RvcmFnZSA9DQotICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnk+PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnRyeShTdHJpbmcgcmVuZGVyZXJLZXksIFN0cmluZyBjbGllbnRJZCwgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBlbnRyeSkNCi0gICAgew0KLSAgICAgICAgZ2V0UmVuZGVyZXJTdG9yYWdlKHJlbmRlcmVyS2V5KS5wdXQoY2xpZW50SWQsIGVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0VudHJ5KFN0cmluZyByZW5kZXJlcktleSwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZXJTdG9yYWdlKHJlbmRlcmVyS2V5KS5jb250YWluc0tleShjbGllbnRJZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZ2V0RW50cnkoU3RyaW5nIHJlbmRlcmVyS2V5LCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRSZW5kZXJlclN0b3JhZ2UocmVuZGVyZXJLZXkpLmdldChjbGllbnRJZCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5PiBnZXRSZW5kZXJlclN0b3JhZ2UoU3RyaW5nIHJlbmRlcmVyS2V5KQ0KLSAgICB7DQotICAgICAgICBpZighcHJveHlTdG9yYWdlLmNvbnRhaW5zS2V5KHJlbmRlcmVyS2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm94eVN0b3JhZ2UucHV0KHJlbmRlcmVyS2V5LCBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnk+KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHByb3h5U3RvcmFnZS5nZXQocmVuZGVyZXJLZXkpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTQ1ZWJkLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciByZW5kZXJlciBwcm94eSBlbnRyaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU1hbmFnZXINCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8UmVuZGVyZXJQcm94eVN0b3JhZ2U+DQotew0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBrZXkgPSBFeHRWYWxSZW5kZXJlclByb3h5LmNsYXNzLmdldE5hbWUoKSArICI6U1RPUkFHRSI7DQotDQotICAgIERlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgLy9mb3IgYmV0dGVyIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkNCi0gICAgICAgIHJldHVybiBrZXk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0U3RvcmFnZU1hbmFnZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OTQ2OGQuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBzdG9yYWdlLW1hbmFnZXIgY3JlYXRpb24gYW5kIGNhY2hpbmcNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0U3RvcmFnZU1hbmFnZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PENsYXNzPg0KLSAgICAgICAgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PENsYXNzLCBTdG9yYWdlTWFuYWdlcj4sIFN0b3JhZ2VNYW5hZ2VySG9sZGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gbGF6eVN0YXRpY01hcHBpbmdBcHBsaWVkID0gZmFsc2U7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPENsYXNzPj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8TmFtZU1hcHBlcjxDbGFzcz4+KCk7DQotICAgIHByaXZhdGUgTWFwPENsYXNzLCBTdG9yYWdlTWFuYWdlcj4gc3RvcmFnZVR5cGVUb1N0b3JhZ2VNYW5hZ2VyTWFwID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPENsYXNzLCBTdG9yYWdlTWFuYWdlcj4oKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBsb2dnZXIuZmluZShnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotDQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihSZW5kZXJlclByb3h5U3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoR3JvdXBTdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdEdyb3VwU3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoTWV0YURhdGFTdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTWFuYWdlcigpLCBmYWxzZSk7DQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihQcm9wZXJ0eVN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0UHJvcGVydHlTdG9yYWdlTWFuYWdlcigpLCBmYWxzZSk7DQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTWFuYWdlcigpLCBmYWxzZSk7DQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLQ0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RvcmFnZU1hbmFnZXIgY3JlYXRlKENsYXNzIHN0b3JhZ2VUeXBlKQ0KLSAgICB7DQotICAgICAgICBpZiAoIXRoaXMubGF6eVN0YXRpY01hcHBpbmdBcHBsaWVkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRTdGF0aWNNYXBwaW5ncygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RvcmFnZU1hbmFnZXIgc3RvcmFnZU1hbmFnZXI7DQotICAgICAgICBTdHJpbmcgc3RvcmFnZU1hbmFnZXJOYW1lOw0KLSAgICAgICAgLy9udWxsIC0+IHVzZSBuYW1lIG1hcHBlcnMNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxDbGFzcz4gbmFtZU1hcHBlciA6IHRoaXMubmFtZU1hcHBlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RvcmFnZU1hbmFnZXJOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKHN0b3JhZ2VUeXBlKTsNCi0NCi0gICAgICAgICAgICBpZiAoc3RvcmFnZU1hbmFnZXJOYW1lID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgc3RvcmFnZU1hbmFnZXIgPSAoU3RvcmFnZU1hbmFnZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHN0b3JhZ2VNYW5hZ2VyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHN0b3JhZ2VNYW5hZ2VyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKHN0b3JhZ2VUeXBlLCBzdG9yYWdlTWFuYWdlcik7DQotICAgICAgICAgICAgICAgIHJldHVybiBzdG9yYWdlTWFuYWdlcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZ2V0U3RvcmFnZU1hbmFnZXIoc3RvcmFnZVR5cGUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkTWFwcGluZyhDbGFzcyBzdG9yYWdlVHlwZSwgU3RvcmFnZU1hbmFnZXIgc3RvcmFnZU1hbmFnZXIpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gaXNWYWxpZEVudHJ5ID0gdHJ1ZTsNCi0gICAgICAgIGlmKHN0b3JhZ2VUeXBlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaXNWYWxpZEVudHJ5ID0gZmFsc2U7DQotICAgICAgICAgICAgdGhpcy5sb2dnZXIuc2V2ZXJlKCJ5b3UgdHJpZWQgdG8gYWRkIGFuIGludmFsaWQgc3RvcmFnZSB0eXBlIik7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihzdG9yYWdlTWFuYWdlciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlzVmFsaWRFbnRyeSA9IGZhbHNlOw0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnNldmVyZSgieW91IHRyaWVkIHRvIGFkZCBhbiBpbnZhbGlkIHN0b3JhZ2UgbWFuYWdlciIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoIWlzVmFsaWRFbnRyeSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihzdG9yYWdlVHlwZSwgc3RvcmFnZU1hbmFnZXIsIHRydWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0U3RhdGljTWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmxhenlTdGF0aWNNYXBwaW5nQXBwbGllZCA9IHRydWU7DQotDQotICAgICAgICAvL3NldHVwIGludGVybmFsIHN0YXRpYyBtYXBwaW5ncw0KLSAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgOg0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5TVE9SQUdFX1RZUEVfVE9fU1RPUkFHRV9NQU5BR0VSX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0dXBNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBNYXBwaW5ncyhMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShtYXBwaW5nLmdldFNvdXJjZSgpKSwNCi0gICAgICAgICAgICAgICAgICAgIChTdG9yYWdlTWFuYWdlcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUobWFwcGluZy5nZXRUYXJnZXQoKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBMaXN0PE5hbWVNYXBwZXI8Q2xhc3M+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm5hbWVNYXBwZXJMaXN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFN0b3JhZ2VNYW5hZ2VyKENsYXNzIHN0b3JhZ2VUeXBlLCBTdG9yYWdlTWFuYWdlciBzdG9yYWdlTWFuYWdlciwgYm9vbGVhbiBvdmVycmlkZSkNCi0gICAgew0KLSAgICAgICAgaWYoIXRoaXMuc3RvcmFnZVR5cGVUb1N0b3JhZ2VNYW5hZ2VyTWFwLmNvbnRhaW5zS2V5KHN0b3JhZ2VUeXBlKSB8fA0KLSAgICAgICAgICAgICAgICAodGhpcy5zdG9yYWdlVHlwZVRvU3RvcmFnZU1hbmFnZXJNYXAuY29udGFpbnNLZXkoc3RvcmFnZVR5cGUpICYmIG92ZXJyaWRlKSkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBsb2dnZXIuZmluZXN0KCJhZGRpbmcgdHlwZSB0byBzdG9yYWdlLW1hbmFnZXIgbWFwcGluZzogIg0KLSAgICAgICAgICAgICAgICArIHN0b3JhZ2VUeXBlLmdldE5hbWUoKSArICIgLT4gIiArIHN0b3JhZ2VNYW5hZ2VyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgICAgICB0aGlzLnN0b3JhZ2VUeXBlVG9TdG9yYWdlTWFuYWdlck1hcC5wdXQoc3RvcmFnZVR5cGUsIHN0b3JhZ2VNYW5hZ2VyKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RvcmFnZU1hbmFnZXIgZ2V0U3RvcmFnZU1hbmFnZXIoQ2xhc3MgdHlwZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZVR5cGVUb1N0b3JhZ2VNYW5hZ2VyTWFwLmdldCh0eXBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZTA3YTYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UgaW1wbGVtZW50cyBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0NCi0gICAgcHJpdmF0ZSBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgPSB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy52aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGMxOTU4Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlci5EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIGEgY3VzdG9tIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXINCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTWFuYWdlciBleHRlbmRzDQotICAgICAgICBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2U+DQotew0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBrZXkgPSBTdG9yYWdlTWFuYWdlci5jbGFzcy5nZXROYW1lKCkgKyAiX0ZPUl9WSU9MQVRJT05TRVZFUklUWV9JTlRFUlBSRVRFUjpLRVkiOw0KLQ0KLSAgICBEZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBrZXk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYwMTgzNC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi0NCi0vKioNCi0gKiBzdG9yYWdlIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IGZhY2VzIHJlcXVlc3QNCi0gKiBmb3Igbm93IGl0IGp1c3QgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgcGhhc2Ugb2YgdGhlIGxpZmVjeWNsZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlDQotew0KLSAgICB2b2lkIHNldEN1cnJlbnRQaGFzZUlkKFBoYXNlSWQgcGhhc2VJZCk7DQotDQotICAgIFBoYXNlSWQgZ2V0Q3VycmVudFBoYXNlSWQoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9GYWNlc01lc3NhZ2VTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNTBmNGYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkZhY2VzTWVzc2FnZUhvbGRlcjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRmFjZXNNZXNzYWdlU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBhZGRGYWNlc01lc3NhZ2UoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKTsNCi0NCi0gICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZXMoKTsNCi0NCi0gICAgdm9pZCBhZGRBbGwoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0dyb3VwU3RvcmFnZS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0dyb3VwU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDRiMmVkLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Hcm91cFN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBTdWdnZXN0ZWQgaW50ZXJmYWNlIGZvciBhIGdyb3VwIHN0b3JhZ2UNCi0gKiB1c2VkIGJ5IHRoZSBidmkgbW9kdWxlIGFuZCBhZGQtb25zDQotICogPHAvPg0KLSAqIGl0IGFsbG93cyB0byBtYW5hZ2UgZ3JvdXBzIGZvciB0aGUgY3VycmVudCByZXF1ZXN0DQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBHcm91cFN0b3JhZ2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBBZGQgdGhlIGdyb3VwLCBpZGVudGlmaWVkIGJ5IHRoZSBncm91cENsYXNzIHBhcmFtZXRlciwgZm9yIHRoZSBjb21wb25lbnQgaWRlbnRpZmllZCBieSB0aGUgY2xpZW50SWQgZm9yIHRoZSB2aWV3DQotICAgICAqIHZpZXdJZC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIGdyb3VwQ2xhc3MgVGhlIGdyb3VwIHRvIGFkZC4NCi0gICAgICogQHBhcmFtIHZpZXdJZCBUaGUgdmlldyB3aGVyZSB0aGUgdWlDb21wb25lbnQgaXMgbG9jYXRlZCB3aGVyZSB3ZSB3YW50IHRvIGFkZCB0aGUgZ3JvdXAuDQotICAgICAqIEBwYXJhbSBjbGllbnRJZCBUaGUgY2xpZW50SWQgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCB3aXRoaW4gdGhlIHZpZXcuDQotICAgICAqLw0KLSAgICB2b2lkIGFkZEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBBZGQgdGhlIGdyb3VwIGluIHRoZSByZXN0cmljdGVkIGdyb3VwIGxpc3QgLGlkZW50aWZpZWQgYnkgdGhlIGdyb3VwQ2xhc3MgcGFyYW1ldGVyLCBmb3IgdGhlIGNvbXBvbmVudCBpZGVudGlmaWVkDQotICAgICAqIGJ5IHRoZSBjbGllbnRJZCBmb3IgdGhlIHZpZXcgdmlld0lkLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZ3JvdXBDbGFzcyBUaGUgZ3JvdXAgdG8gYWRkIGluIHRoZSByZXN0cmljdGVkIGdyb3VwIGxpc3QuDQotICAgICAqIEBwYXJhbSB2aWV3SWQgVGhlIHZpZXcgd2hlcmUgdGhlIHVpQ29tcG9uZW50IGlzIGxvY2F0ZWQgd2hlcmUgd2Ugd2FudCB0byBhZGQgdGhlIGdyb3VwLg0KLSAgICAgKiBAcGFyYW0gY2xpZW50SWQgVGhlIGNsaWVudElkIHZhbHVlIG9mIHRoZSBjb21wb25lbnQgd2l0aGluIHRoZSB2aWV3Lg0KLSAgICAgKi8NCi0gICAgdm9pZCByZXN0cmljdEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGdyb3VwcyBkZWZpbmVkIGZvciB0aGUgY29tcG9uZW50IHdpdGggdGhlIGNsaWVudElkIHNwZWNpZmllZCBhcyBwYXJhbWV0ZXIgaW4gdGhlIHZpZXcuICBUaGUNCi0gICAgICogYXJyYXkgaXMgdGhlIHZhbHVlcyBvZiB0aGUgZ3JvdXBzIGFkZGVkIG1pbnVzIHRoZSBncm91cHMgZnJvbSB0aGUgcmVzdHJpY3RlZCBncm91cCBsaXN0Lg0KLSAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSB2aWV3IHdoZXJlIHRoZSB1aUNvbXBvbmVudCBpcyBsb2NhdGVkLg0KLSAgICAgKiBAcGFyYW0gY2xpZW50SWQgVGhlIGNsaWVudElkIHZhbHVlIG9mIHRoZSBjb21wb25lbnQgd2l0aGluIHRoZSB2aWV3Lg0KLSAgICAgKiBAcmV0dXJuIEFycmF5IG9mIGdyb3VwcyBkZWZpbmVkIGZvciB0aGUgY29tcG9uZW50Lg0KLSAgICAgKi8NCi0gICAgQ2xhc3NbXSBnZXRHcm91cHMoU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NjNWFlNi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSByNA0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBzdG9yZU1hcHBpbmcoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSwgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyk7DQotDQotICAgIFByb3BlcnR5RGV0YWlscyBnZXRNYXBwZWRDb25zdHJhaW50U291cmNlKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpOw0KLQ0KLSAgICBib29sZWFuIGNvbnRhaW5zTWFwcGluZyhDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5KTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01ldGFEYXRhU3RvcmFnZS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01ldGFEYXRhU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWVjZWJkLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NZXRhRGF0YVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBzdG9yZU1ldGFEYXRhT2YoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgTWV0YURhdGFFbnRyeVtdIGdldE1ldGFEYXRhKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpOw0KLQ0KLSAgICBib29sZWFuIGNvbnRhaW5zTWV0YURhdGFGb3IoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSk7DQotDQotICAgIHZvaWQgcmVnaXN0ZXJGaWx0ZXIoTWV0YURhdGFTdG9yYWdlRmlsdGVyIHN0b3JhZ2VGaWx0ZXIpOw0KLQ0KLSAgICB2b2lkIGRlcmVnaXN0ZXJGaWx0ZXIoQ2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gZmlsdGVyQ2xhc3MpOw0KLQ0KLSAgICB2b2lkIGRlbnlGaWx0ZXIoQ2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gZmlsdGVyQ2xhc3MpOw0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWV0YURhdGFTdG9yYWdlRmlsdGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWV0YURhdGFTdG9yYWdlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NmJkMDguLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01ldGFEYXRhU3RvcmFnZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEFsbG93cyBmaWx0ZXJpbmcgZS5nLiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeSBNZXRhRGF0YUVudHJpZXN9Lg0KLSAqIFNvIGl0J3MgcG9zc2libGUgdG8gYWRkL3JlbW92ZSBlbnRyaWVzIHdoaWNoIHNob3VsZCBvciBzaG91bGRuJ3QgYmUgdXNlZC4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFTdG9yYWdlRmlsdGVyDQotew0KLSAgICAvKioNCi0gICAgICogQWxsb3dzIHRvIG1hbmlwdWxhdGUgdGhlIGdpdmVuIGluZm9ybWF0aW9uIHdoaWNoIHdpbGwgYmUgdXNlZCBlLmcuIGZvcg0KLSAgICAgKiB0aGUgdmFsaWRhdGlvbiBhbmQgY29tcG9uZW50IGluaXRpYWxpemF0aW9uIHByb2Nlc3MuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBwcm9wZXJ0eUluZm9ybWF0aW9uIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHByb3BlcnR5DQotICAgICAqLw0KLSAgICB2b2lkIGZpbHRlcihQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUHJvcGVydHlTdG9yYWdlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUHJvcGVydHlTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YmVkMjYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1Byb3BlcnR5U3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eVN0b3JhZ2UNCi17DQotICAgIHZvaWQgc3RvcmVGaWVsZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5LCBGaWVsZCBmaWVsZCk7DQotDQotICAgIHZvaWQgc3RvcmVNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSwgTWV0aG9kIG1ldGhvZCk7DQotDQotICAgIEZpZWxkIGdldEZpZWxkKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpOw0KLQ0KLSAgICBNZXRob2QgZ2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpOw0KLQ0KLSAgICBib29sZWFuIGNvbnRhaW5zRmllbGQoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSk7DQotDQotICAgIGJvb2xlYW4gY29udGFpbnNNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSk7DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2M4YzFkLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogYSBzdG9yYWdlIHdoaWNoIGlzbid0IHVzZWQgaW50ZXJuYWxseS4gaXQncyBmb3IgYWRkLW9ucyB0byBlYXNpbHkgc3RvcmUgcHJvcGVydGllcyBvZiBpbnRlcmNlcHRvcnMuDQotICogd2l0aG91dCBicmFraW5nIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGl0J3MgcG9zc2libGUgdG8gdXNlIHRoZXNlIHByb3BlcnRpZXMgaW4gY3VzdG9tIGFydGlmYWN0cy4NCi0gKiByZW5kZXJpbmcgaW50ZXJjZXB0aW9uIGlzIGFuIGludGVybmFsIGNvbmNlcHQuIHNvIHByb3BlcnRpZXMsLi4uIG9mIGl0IHdvbid0IGdldCBpbnRvIHRoZSBhcGkuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpOw0KLQ0KLSAgICBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSk7DQotDQotICAgIDxUPiBUIGdldFByb3BlcnR5KFN0cmluZyBrZXksIENsYXNzPFQ+IHRhcmdldENsYXNzKTsNCi0NCi0gICAgdm9pZCByZW1vdmVQcm9wZXJ0eShTdHJpbmcga2V5KTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVyUHJveHlTdG9yYWdlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJQcm94eVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcxYTc1Yi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJQcm94eVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBSZW5kZXJlclByb3h5U3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBzZXRFbnRyeShTdHJpbmcgcmVuZGVyZXJLZXksIFN0cmluZyBjbGllbnRJZCwgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBlbnRyeSk7DQotDQotICAgIGJvb2xlYW4gY29udGFpbnNFbnRyeShTdHJpbmcgcmVuZGVyZXJLZXksIFN0cmluZyBjbGllbnRJZCk7DQotDQotICAgIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZ2V0RW50cnkoU3RyaW5nIHJlbmRlcmVyS2V5LCBTdHJpbmcgY2xpZW50SWQpOw0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkzNDc3OC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeQotewotICAgIHByaXZhdGUgYm9vbGVhbiBkZWNvZGVDYWxsZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlQmVnaW5DYWxsZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlRW5kQ2FsbGVkID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIE9iamVjdCBjb252ZXJ0ZWRWYWx1ZSA9IG51bGw7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlY29kZUNhbGxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVjb2RlQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlY29kZUNhbGxlZChib29sZWFuIGRlY29kZUNhbGxlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVjb2RlQ2FsbGVkID0gZGVjb2RlQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlQmVnaW5DYWxsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVuY29kZUJlZ2luQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kZUJlZ2luQ2FsbGVkKGJvb2xlYW4gZW5jb2RlQmVnaW5DYWxsZWQpCi0gICAgewotICAgICAgICB0aGlzLmVuY29kZUJlZ2luQ2FsbGVkID0gZW5jb2RlQmVnaW5DYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmNvZGVDaGlsZHJlbkNhbGxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlQ2hpbGRyZW5DYWxsZWQoYm9vbGVhbiBlbmNvZGVDaGlsZHJlbkNhbGxlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZW5jb2RlQ2hpbGRyZW5DYWxsZWQgPSBlbmNvZGVDaGlsZHJlbkNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuY29kZUVuZENhbGxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZW5jb2RlRW5kQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kZUVuZENhbGxlZChib29sZWFuIGVuY29kZUVuZENhbGxlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZW5jb2RlRW5kQ2FsbGVkID0gZW5jb2RlRW5kQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlZFZhbHVlKE9iamVjdCBjb252ZXJ0ZWRWYWx1ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29udmVydGVkVmFsdWUgPSBjb252ZXJ0ZWRWYWx1ZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3MTA2ZS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuQVBJOw0KLQ0KLS8qKg0KLSAqIFN0b3JhZ2UgbWFuYWdlcnMgYXJlIHJlc3BvbnNpYmxlIHRvIGNyZWF0ZSBhbmQgcmVzZXQgc3BlY2lmaWMgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSBzY29wZS4NCi0gKiBBIG1hbmFnZXIgY2FuIGJlIHJlc3BvbnNpYmxlIGZvciBtdWx0aXBsZSAobmFtZWQpIHN0b3JhZ2VzLg0KLSAqDQotICogQHBhcmFtIDxUPiBUeXBlIG9mIFN0b3JhZ2UgdGhhdCBpcyBtYWludGFpbmVkIGJ5IHRoZSBzdG9yYWdlTWFuYWdlci4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKEFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFN0b3JhZ2VNYW5hZ2VyPFQ+DQotew0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlcyBhbmQgc2NvcGUgb3IgcmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgaW5zdGFuY2UsIG9mIHRoZSBzdG9yYWdlIGZvciB0aGUgZ2l2ZW4ga2V5Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIGEgc3RvcmFnZSB0aGF0IG5lZWRzIHRvIGJlIGNyZWF0ZWQNCi0gICAgICogQHJldHVybiBUaGUgc3RvcmFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBvciBudWxsIGlmIHRoZSBrZXkgaXMgdW5rbm93biB0byB0aGUgc3RvcmFnZU1hbmFnZXIuDQotICAgICAqLw0KLSAgICBUIGNyZWF0ZShTdHJpbmcga2V5KTsNCi0NCi0gICAgLyoqDQotICAgICAqIFJlc2V0cyB0aGUgc3RvcmFnZSBsaW5rZWQgdG8gdGhlIGdpdmVuIGtleS4NCi0gICAgICogSWYgdGhlIHN0b3JhZ2UgaXNuJ3QgY3JlYXRlZCB5ZXQgb3IgdGhlIGtleSBpcyB1bmtub3duDQotICAgICAqIGZvciB0aGUgc3RvcmFnZU1hbmFnZXIsIG5vdGhpbmcgaXMgcGVyZm9ybWVkIGFuZCBubyBleGNlcHRpb24gaXMgdGhyb3duLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGtleSBUaGUga2V5IGZvciBhIHN0b3JhZ2UgdGhhdCBuZWVkcyB0byBiZSByZXNldHRlZA0KLSAgICAgKi8NCi0gICAgdm9pZCByZXNldChTdHJpbmcga2V5KTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VySG9sZGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXJIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMwNDNjYS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXJIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuQVBJOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSB0byBtYW5hZ2Ugc3RvcmFnZS1tYW5hZ2VyIGluc3RhbmNlcy4NCi0gKg0KLSAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5TdG9yYWdlTWFuYWdlcg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgU3RvcmFnZU1hbmFnZXJIb2xkZXINCi17DQotICAgIC8qKg0KLSAgICAgKiBEZWZpbmUgdGhlIHN0b3JhZ2UgbWFuYWdlciBmb3IgdGhlIGdpdmVuIHR5cGUuDQotICAgICAqDQotICAgICAqIEBwYXJhbSB0eXBlIFRoZSBpZGVudGlmaWNhdGlvbiBmb3IgdGhlIHN0b3JhZ2UgbWFuYWdlciwgdXN1YWxseSBpdCBpcyB0aGUgc3RvcmFnZS1jbGFzcw0KLSAgICAgKiBAcGFyYW0gc3RvcmFnZU1hbmFnZXIgVGhlIHN0b3JhZ2VNYW5hZ2VyIHRvIHVzZS4NCi0gICAgICogQHBhcmFtIG92ZXJyaWRlIHVzZSB0cnVlIHRvIHJlcGxhY2UgYW4gZXhpc3Rpbmcgc3RvcmFnZU1hbmFnZXIgYW5kDQotICAgICAqIGZhbHNlIHRvIHVzZSB0aGUgbWFuYWdlciBvbmx5IGlmIHRoZXJlIGlzbid0IGFuIGV4aXN0aW5nIG1hbmFnZXIgZm9yIHRoZSBnaXZlbiB0eXBlDQotICAgICAqLw0KLSAgICB2b2lkIHNldFN0b3JhZ2VNYW5hZ2VyKENsYXNzIHR5cGUsIFN0b3JhZ2VNYW5hZ2VyIHN0b3JhZ2VNYW5hZ2VyLCBib29sZWFuIG92ZXJyaWRlKTsNCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIHN0b3JhZ2VNYW5hZ2VyIGZvciB0aGUgZ2l2ZW4gdHlwZS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHR5cGUgVGhlIGlkZW50aWZpY2F0aW9uIGZvciB0aGUgc3RvcmFnZSBtYW5hZ2VyLCB1c3VhbGx5IGl0IGlzIHRoZSBzdG9yYWdlLWNsYXNzDQotICAgICAqIEByZXR1cm4gdGhlIHN0b3JhZ2VNYW5hZ2VyIGZvciB0aGUgZ2l2ZW4gdHlwZSBvciBudWxsDQotICAgICAqLw0KLSAgICBTdG9yYWdlTWFuYWdlciBnZXRTdG9yYWdlTWFuYWdlcihDbGFzcyB0eXBlKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1ZhbGlkYXRpb25SZXN1bHQuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WYWxpZGF0aW9uUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3OTMyN2MuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1ZhbGlkYXRpb25SZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkZhY2VzTWVzc2FnZUhvbGRlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gInJlZmFjdG9yIGl0IikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIFZhbGlkYXRpb25SZXN1bHQNCi17DQotICAgIHByaXZhdGUgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkRmFjZXNNZXNzYWdlSG9sZGVyKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmFjZXNNZXNzYWdlSG9sZGVyTGlzdC5hZGQoZmFjZXNNZXNzYWdlSG9sZGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWM2Y2Y0Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSBmb3IgYSB7QGxpbmsgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcn0gc3RvcmFnZS4NCi0gKiBVc2VkIGJ5IGFkZC1vbnMgdG8gY2hhbmdlIHRoZSBpbnRlcnByZXRlciBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdC4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBQdXRzIHRoZSB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGludG8gdGhlIHN0b3JhZ2UuDQotICAgICAqIEBwYXJhbSB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgdG8gc2UgdGluIHRoZSBzdG9yYWdlLg0KLSAgICAgKi8NCi0gICAgdm9pZCBzZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgdmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcik7DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXRyaWV2ZXMgdGhlIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgZnJvbSB0aGUgc3RvcmFnZS4NCi0gICAgICogQHJldHVybiAgdGhlIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgZnJvbSB0aGUgc3RvcmFnZS4NCi0gICAgICovDQotICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTEwMjk2Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkZhY2VzSW5mb3JtYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZTk3ZjIuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5GYWNlc01lc3NhZ2VTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiB1c2UgYSBwdWJsaWMgY2xhc3MgdG8gYWxsb3cgb3B0aW9uYWwgZGVyZWdpc3RyYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTY4YmE5Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuTWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgcjQNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0TWV0YURhdGFTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0TWV0YURhdGFTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWJmZTk3Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NZXRhRGF0YVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdE1ldGFEYXRhU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWV0YURhdGFTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoTWV0YURhdGFTdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0TWV0YURhdGFTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2Y4NjIzLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0UHJvcGVydHlTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlByb3BlcnR5U3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoUHJvcGVydHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0UHJvcGVydHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5Njg0MWQuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5SZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiB1c2UgYSBwdWJsaWMgY2xhc3MgdG8gYWxsb3cgb3B0aW9uYWwgZGVyZWdpc3RyYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGU5ZGU5Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5SZW5kZXJlclByb3h5U3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChSZW5kZXJlclByb3h5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk0OTZkNy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9Db25zdHJhaW50U291cmNlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vQ29uc3RyYWludFNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2FlYTBjLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9Db25zdHJhaW50U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotDQotLyoqDQotICogQW5ub3RhdGlvbiB0aGF0IHNwZWNpZmllcyB0aGUgY2xhc3MgdGhhdCBuZWVkcyB0byBiZSB1c2VkIGFzIHNvdXJjZSBmb3IgdGhlIEV4dFZhbCBjb25zdHJhaW50cy4gIDxici8+DQotICogSWYgbmVlZGVkLCB0aGlzIGFubm90YXRpb24gY2FuIGJlIHJlcGxhY2VkIGJ5IGEgY3VzdG9tZXIgZGVmaW5lZCBvbmUgaWYgb25lIGxpa2VzIHRvIGhhdmUgaW5kZXBlbmRlbmNlIG9mIEV4dFZhbCBpbg0KLSAqIG1vZGVsIGNsYXNzZXMsIHNlZSBjb25zdHJhaW50U291cmNlQW5ub3RhdGlvbiBpbiBFeHRWYWxDb3JlQ29uZmlndXJhdGlvbi4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSByNA0KLSAqLw0KLUBUYXJnZXQoe1RZUEUsIEZJRUxELCBNRVRIT0R9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIENvbnN0cmFpbnRTb3VyY2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBDbGFzcyB0aGF0IG5lZWRzIHRvIGJlIHVzZWQgYXMgc291cmNlIGZvciBjb25zdHJhaW50cy4NCi0gICAgICogQHJldHVybiBDbGFzcyB0aGF0IG5lZWRzIHRvIGJlIHVzZWQgYXMgc291cmNlIGZvciBjb25zdHJhaW50cy4NCi0gICAgICovDQotICAgIENsYXNzIHZhbHVlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA2ZWJjNi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLQ0KLS8qKg0KLSAqIE1hcmtlciBhbm5vdGF0aW9uIHRvIGluZGljYXRlIHRoYXQgdGhlIHN0cmF0ZWd5IGNhbiBoYW5kbGUgZW1wdHkgdmFsdWVzIChzdHJpbmdzIG9mIGxlbmd0aCAwKSBhcyB2YWx1ZXMgdG8gdmFsaWRhdGUuDQotICogVGhpcyB3YXMgaW50cm9kdWNlZCB0byBoYXZlIHRoZSBjb3JyZWN0IGJlaGF2aW91ciBpbiByZWxhdGlvbiB0byB0aGUgcGFyYW1ldGVyIGphdmF4LmZhY2VzLlZBTElEQVRFX0VNUFRZX0ZJRUxEUy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVGFyZ2V0KFRZUEUpDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vSWdub3JlQ29uc3RyYWludFNvdXJjZS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL0lnbm9yZUNvbnN0cmFpbnRTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwMTc4NS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vSWdub3JlQ29uc3RyYWludFNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotDQotLyoqDQotICogTWFya2VyIGFubm90YXRpb24gdG8gaW5kaWNhdGUgdGhhdCBmb3IgdGhlIGFubm90YXRlZCBwcm9wZXJ0eSwgbm8gc291cmNlIGZvciBFeHRWYWwgY29uc3RyYWludHMgbmVlZCB0byBiZSBzZWFyY2hlZA0KLSAqIGluIHRoZSBjbGFzcyBpbmRpY2F0ZWQgYnkgdGhlIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkNvbnN0cmFpbnRTb3VyY2V9DQotICogYW5ub3RhdGlvbi4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSByNA0KLSAqLw0KLUBUYXJnZXQoe0ZJRUxELCBNRVRIT0R9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIElnbm9yZUNvbnN0cmFpbnRTb3VyY2UNCi17DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL051bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNjJjNmEuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL051bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLQ0KLS8qKg0KLSAqIE1hcmtlciBhbm5vdGF0aW9uIHRvIGluZGljYXRlIHRoYXQgdGhlIHN0cmF0ZWd5IGNhbiBoYW5kbGUgbnVsbCB2YWx1ZXMgYXMgdmFsdWVzIHRvIHZhbGlkYXRlLg0KLSAqIElmIGEge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5fSBpcyBOT1QgYW5ub3RhdGVkDQotICogd2l0aCB0aGlzIG1hcmtlciwgaXQgZG9lc24ndCBoYXZlIHRvIGNhcmUgYWJvdXQgbnVsbCB2YWx1ZXMuDQotICogIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBOdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL1NraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYwOTU0Zi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotDQotLyoqDQotICogRXZhbHVhdG9yIHdoaWNoIGNoZWNrcyBpZiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzIHNob3VsZCBiZSBza2lwcGVkIGZvciB0aGUgZ2l2ZW4gY29tcG9uZW50Lg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcg0KLXsNCi0gICAgLyoqDQotICAgICAqIENoZWNrcyBpZiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzIHNob3VsZCBiZSBza2lwcGVkIGZvciB0aGUgZ2l2ZW4gY29tcG9uZW50Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IFRoZSBKU0YgQ29udGV4dA0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgVGhlIGNvbXBvbmVudCBmb3Igd2hpY2ggdGhlIHZhbGlkYXRpb24gc2hvdWxkIGhhcHBlbi4NCi0gICAgICogQHBhcmFtIHZhbGlkYXRpb25TdHJhdGVneSBUaGUgdmFsaWRhdGlvbi1zdHJhdGVneSB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgdmFsaWRhdGluZyB0aGUgZ2l2ZW4gZW50cnkNCi0gICAgICogQHBhcmFtIGVudHJ5IHRoZSB7QGxpbmsgTWV0YURhdGFFbnRyeX0gaW4gcXVlc3Rpb24NCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWxpZGF0aW9uIHByb2Nlc3Mgc2hvdWxkIGJlIHNraXBwZWQsIGZhbHNlIG90aGVyd2lzZQ0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBza2lwVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBlbnRyeSk7DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9UYXJnZXRQcm9wZXJ0eS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL1RhcmdldFByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YTlmMzcuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL1RhcmdldFByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi0NCi0vKioNCi0gKiBUbyBzcGVjaWZ5IHdoaWNoIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIGFzIGNvbnN0cmFpbnQgc291cmNlIChpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG5hbWluZyBjb252ZW50aW9uKS4NCi0gKg0KLSAqIElmIG5lZWRlZCwgdGhpcyBhbm5vdGF0aW9uIGNhbiBiZSByZXBsYWNlZCBieSBhIGN1c3RvbSBhbm5vdGF0aW9uIHRvIGtlZXAgdGhlIGltcGxlbWVudGF0aW9uIGluZGVwZW5kZW50IG9mIEV4dFZhbC4NCi0gKiAoc2VlIHRhcmdldFByb3BlcnR5QW5ub3RhdGlvbiBpbiBFeHRWYWxDb3JlQ29uZmlndXJhdGlvbikNCi0gKg0KLSAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5Db25zdHJhaW50U291cmNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgcjQNCi0gKi8NCi1AVGFyZ2V0KHtGSUVMRCwgTUVUSE9EfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBUYXJnZXRQcm9wZXJ0eQ0KLXsNCi0gICAgLyoqDQotICAgICAqIHByb3BlcnR5LW5hbWUgYXZhaWxhYmxlIGF0IHRoZSB0YXJnZXQgd2hpY2ggc2hvdWxkIGJlIHVzZWQgYXMgY29uc3RyYWludCBzb3VyY2UNCi0gICAgICoNCi0gICAgICogQHJldHVybiBwcm9wZXJ0eS1uYW1lIHdoaWNoIGhhcyB0byBleGlzdCBhdCB0aGUgdGFyZ2V0LWNhc3MNCi0gICAgICovDQotICAgIFN0cmluZyB2YWx1ZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vVGFyZ2V0UHJvcGVydHlJZC5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL1RhcmdldFByb3BlcnR5SWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEyZjRlNC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vVGFyZ2V0UHJvcGVydHlJZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotDQotLyoqDQotICogVG8gc3BlY2lmeSB3aGljaCBwcm9wZXJ0eSBzaG91bGQgYmUgdXNlZCBhcyBjb25zdHJhaW50IHNvdXJjZSAoaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBuYW1pbmcgY29udmVudGlvbikuDQotICogQ29tcGFyZWQgdG8ge0BsaW5rIFRhcmdldFByb3BlcnR5fSB0aGlzIGFubm90YXRpb24gYWxsb3dzIHRvIHVzZSBjdXN0b20gYW5ub3RhdGlvbnMgdG8gbWFyayB0aGUgdGFyZ2V0DQotICogKGluc3RlYWQgb2YgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5KS4NCi0gKg0KLSAqIElmIG5lZWRlZCwgdGhpcyBhbm5vdGF0aW9uIGNhbiBiZSByZXBsYWNlZCBieSBhIGN1c3RvbSBhbm5vdGF0aW9uIHRvIGtlZXAgdGhlIGltcGxlbWVudGF0aW9uIGluZGVwZW5kZW50IG9mIEV4dFZhbC4NCi0gKiAoc2VlIHRhcmdldFByb3BlcnR5SWRBbm5vdGF0aW9uIGluIEV4dFZhbENvcmVDb25maWd1cmF0aW9uKQ0KLSAqDQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkNvbnN0cmFpbnRTb3VyY2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSByNA0KLSAqLw0KLUBUYXJnZXQoe0ZJRUxELCBNRVRIT0R9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFRhcmdldFByb3BlcnR5SWQNCi17DQotICAgIC8qKg0KLSAgICAgKiBjbGFzcyBvZiBhbiBhbm5vdGF0aW9uIHdoaWNoIGhhcyB0byBiZSBhdmFpbGFibGUgYXQgYSBwcm9wZXJ0eSBvZiB0aGUgdGFyZ2V0IGFzIGEgdHlwZS1zYWZlIG1hcmtlci4NCi0gICAgICogdGhlIGFubm90YXRpb24gbWFya3MgdGhlIHByb3BlcnR5IHdoaWNoIHNob3VsZCBiZSB1c2VkIGFzIGNvbnN0cmFpbnQtc291cmNlLg0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIGNsYXNzIG9mIGFuIGFubm90YXRpb24gd2hpY2ggaGFzIHRvIGV4aXN0IGF0IGEgcHJvcGVydHkgb2YgdGhlIHRhcmdldC1jYXNzDQotICAgICAqLw0KLSAgICBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gdmFsdWUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL2V4Y2VwdGlvbi9SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbi5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL2V4Y2VwdGlvbi9SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTg5NDQwLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9leGNlcHRpb24vUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uZXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBKU0YgY29tcG9uZW50cyBhbGxvdyBkaWZmZXJlbnQgaW5saW5lLW1lc3NhZ2VzIGZvciByZXF1aXJlZCB2aW9sYXRpb25zIGFuZCBhbGwgb3RoZXIgdHlwZXMgb2YgdmFsaWRhdGlvbiBmYWlsdXJlcy4NCi0gKiBUaGlzIGV4Y2VwdGlvbiBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgc3BlY2lhbCByZXF1aXJlZCBlcnJvciBtZXNzYWdlIHNob3VsZCBiZSB1c2VkLiANCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbiBleHRlbmRzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ2NDYzMzE3MzY0Mjg0OTU4ODRMOw0KLQ0KLSAgICBwdWJsaWMgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIoZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIoZmFjZXNNZXNzYWdlLCB0aHJvd2FibGUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjI1MTBjLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkgaW1wbGVtZW50cyBGYWNlc01lc3NhZ2VGYWN0b3J5DQotew0KLSAgICBwdWJsaWMgRmFjZXNNZXNzYWdlIGNvbnZlcnQoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYoaXNMYWJlbGVkRmFjZXNNZXNzYWdlKGZhY2VzTWVzc2FnZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjcmVhdGUoZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCksIGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCksIGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBWaW9sYXRpb25NZXNzYWdlKHNldmVyaXR5LCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzTGFiZWxlZEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHVzZSB0aGUgaW50ZXJmYWNlIGhlcmUNCi0gICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2UgaW5zdGFuY2VvZiBWaW9sYXRpb25NZXNzYWdlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0ZhY2VzTWVzc2FnZUhvbGRlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRmFjZXNNZXNzYWdlSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMWMzNjcuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRmFjZXNNZXNzYWdlSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEZhY2VzTWVzc2FnZUhvbGRlcg0KLXsNCi0gICAgcHJpdmF0ZSBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlOw0KLSAgICBwcml2YXRlIFN0cmluZyBjbGllbnRJZDsNCi0NCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZUhvbGRlcihGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZhY2VzTWVzc2FnZSA9IGZhY2VzTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRmFjZXNNZXNzYWdlSG9sZGVyKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5mYWNlc01lc3NhZ2UgPSBmYWNlc01lc3NhZ2U7DQotICAgICAgICBzZXRDbGllbnRJZChjbGllbnRJZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBnZXRGYWNlc01lc3NhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY2xpZW50SWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50SWQoU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICBpZighIioiLmVxdWFscyhjbGllbnRJZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0xhYmVsZWRNZXNzYWdlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9MYWJlbGVkTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGE1MzNkLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0xhYmVsZWRNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdGhlIHNldHRpbmcgYW5kIHRoZSByZXRyaWV2YWwgb2YgdGhlIGxhYmVsIHRleHQgdGhhdCBnb2VzIHdpdGggYW4gaW5wdXQgY29tcG9uZW50LiBUaGlzIGxhYmVsIHRleHQgaXMgdXNlZA0KLSAqIGZvciB0aGUgdmlvbGF0aW9uIG1lc3NhZ2UgdG8gaW5kaWNhdGUgd2hlcmUgdGhlIHByb2JsZW0gb2NjdXJyZWQuDQotICoNCi0gKiBkb24ndCByZW1vdmUgKlRleHQgLSBpdCB3b3VsZCBsZWFkIHRvIGFuIG92ZXJsYXAgd2l0aCB0cmluaWRhZC4NCi0gKiBVc2VkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgRmFjZXNNZXNzYWdlIHtAbGluayBWaW9sYXRpb25NZXNzYWdlfSB0aGF0IGNhbiBob2xkIHRoZSBsYWJlbCB0ZXh0Lg0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTGFiZWxlZE1lc3NhZ2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBHZXQgdGhlIHRleHQgZm9yIG9mIHRoZSBsYWJlbCBvZiB0aGUgaW5wdXQgY29tcG9uZW50Lg0KLSAgICAgKiBAcmV0dXJuIGxhYmVsIHRleHQNCi0gICAgICovDQotICAgIFN0cmluZyBnZXRMYWJlbFRleHQoKTsNCi0NCi0gICAgLyoqDQotICAgICAqIFNldCB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsIG9mIHRoZSBpbnB1dCBjb21wb25lbnQuDQotICAgICAqIEBwYXJhbSBsYWJlbCBsYWJlbCB0ZXh0Lg0KLSAgICAgKi8NCi0gICAgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIGxhYmVsKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvVmlvbGF0aW9uTWVzc2FnZS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvVmlvbGF0aW9uTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTQ0Yzc2Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL1Zpb2xhdGlvbk1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgVmlvbGF0aW9uTWVzc2FnZSBleHRlbmRzIEZhY2VzTWVzc2FnZSBpbXBsZW1lbnRzIExhYmVsZWRNZXNzYWdlDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2OTAzOTU4OTQyOTg3NzExMjMxTDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFiZWw7DQotICAgIHByaXZhdGUgYm9vbGVhbiBzdW1tYXJ5TGFiZWxSZXBsYWNlZCA9IGZhbHNlOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGV0YWlsTGFiZWxSZXBsYWNlZCA9IGZhbHNlOw0KLQ0KLSAgICBwdWJsaWMgVmlvbGF0aW9uTWVzc2FnZShTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgdGhpcyhTRVZFUklUWV9FUlJPUiwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmlvbGF0aW9uTWVzc2FnZShTZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHNldFNldmVyaXR5KHNldmVyaXR5KTsNCi0gICAgICAgIHNldFN1bW1hcnkoc3VtbWFyeSk7DQotICAgICAgICBzZXREZXRhaWwoZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsVGV4dCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsYWJlbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIGxhYmVsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VtbWFyeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxhYmVsICE9IG51bGwgJiYgIXRoaXMuc3VtbWFyeUxhYmVsUmVwbGFjZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0U3VtbWFyeShnZXRMYWJlbGVkTWVzc3NhZ2Uoc3VwZXIuZ2V0U3VtbWFyeSgpLCBnZXRMYWJlbFRleHQoKSkpOw0KLSAgICAgICAgICAgIHRoaXMuc3VtbWFyeUxhYmVsUmVwbGFjZWQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFN1bW1hcnkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBnZXREZXRhaWwoKQ0KLSAgICB7DQotICAgICAgICBpZihsYWJlbCAhPSBudWxsICYmICF0aGlzLmRldGFpbExhYmVsUmVwbGFjZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0RGV0YWlsKGdldExhYmVsZWRNZXNzc2FnZShzdXBlci5nZXREZXRhaWwoKSwgZ2V0TGFiZWxUZXh0KCkpKTsNCi0gICAgICAgICAgICB0aGlzLmRldGFpbExhYmVsUmVwbGFjZWQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldERldGFpbCgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldExhYmVsZWRNZXNzc2FnZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGxhYmVsKQ0KLSAgICB7DQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmNvbnRhaW5zKCJ7IiArIGkgKyAifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgieyIgKyBpICsgIn0iLCBsYWJlbCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHNldFN1bW1hcnkoU3RyaW5nIHMpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFN1bW1hcnkocyk7DQotICAgICAgICB0aGlzLnN1bW1hcnlMYWJlbFJlcGxhY2VkID0gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHNldERldGFpbChTdHJpbmcgcykNCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0RGV0YWlsKHMpOw0KLSAgICAgICAgdGhpcy5kZXRhaWxMYWJlbFJlcGxhY2VkID0gZmFsc2U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZmYyNjguLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb3JlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsNCi0NCi0vKioNCi0gKiBNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggdXNlcyBwcm9wZXJ0eSBmaWxlcy4NCi0gKiBTdWJjbGFzc2VzIGp1c3QgaGF2ZSB0byBwcm92aWRlIHRoZSBwYWNrYWdlIHRvIGxvb2sgYXQuDQotICogQW4gaW1wbGVtZW50YXRpb24gY2FuIGFsc28gcHJvdmlkZSBhIGN1c3RvbSBuYW1lIHdoaWNoIGlzIGUuZy4gY29uZmlndXJlZCB2aWEgd2ViLnhtbC4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGltcGxlbWVudHMgTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX1JFU09VUkNFX01BUktFUiA9ICI/Pz8iOw0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbiA9IEV4dFZhbENvcmVDb25maWd1cmF0aW9uLmdldCgpLmRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbigpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBkZWZhdWx0QnVuZGxlID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZUJ1bmRsZUJhc2VOYW1lOw0KLSAgICAvL3dpdGgganNmIDEuMSBvbmx5IGF2YWlsYWJsZSBpZiB0aGVyZSBpcyBhIGN1c3RvbSBiZWFuDQotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VCdW5kbGVWYXJOYW1lOw0KLQ0KLSAgICBwcml2YXRlIEVMSGVscGVyIGVsSGVscGVyID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgbG9nZ2VyLmZpbmUoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICBpZiAoa2V5ID09IG51bGwgfHwga2V5LmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihrZXkuY29udGFpbnMoIiAiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihrZXkuZW5kc1dpdGgoIl9kZXRhaWwiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcoMCwga2V5Lmxlbmd0aCgpIC0gNyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBrZXk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgY3VzdG9tTWVzc2FnZSA9IG51bGw7DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gdHJ5VG9GaW5kQ3VzdG9tTWVzc2FnZShrZXksIGxvY2FsZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nDQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY3VzdG9tTWVzc2FnZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIHRyeSB0byB1c2UgdGhlIGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZQ0KLSAgICAgICAgICovDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gdHJ5VG9Vc2VNZXNzYWdlQnVuZGxlQ29udmVudGlvbihrZXksIGxvY2FsZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nDQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY3VzdG9tTWVzc2FnZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIG5vIG1lc3NhZ2UgYnVuZGxlIG9yIG1lc3NhZ2UgZm91bmQgKHdpdGggdGhlIGNvbnZlbnRpb24pPw0KLSAgICAgICAgICovDQotDQotICAgICAgICAvL3RyeSB0byBsb2FkIGN1c3RvbSBtZXNzYWdlcw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHRyeVRvRmluZEN1c3RvbU1lc3NhZ2VJbkN1c3RvbVJlc291cmNlQnVuZGxlKGtleSwgbG9jYWxlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGRldGVybWluZU1lc3NhZ2Uoa2V5LCBsb2NhbGUsIGN1c3RvbU1lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvRmluZEN1c3RvbU1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7DQotICAgICAgICBTdHJpbmcgY3VzdG9tTWVzc2FnZSA9IG51bGw7DQotDQotICAgICAgICAvL29ubHkgaW4gY2FzZSBvZiBhIFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciB3aGljaCBpcyBjb25maWd1cmVkIGFzIGJlYW4NCi0gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lLCBsb2NhbGUpOw0KLSAgICAgICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygibWVzc2FnZSBidW5kbGUgIiArIHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lICsgIiBub3QgZm91bmQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvL29ubHkgaW4gY2FzZSBvZiBhIFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciB3aGljaCBpcyBjb25maWd1cmVkIGFzIGJlYW4NCi0gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VCdW5kbGVWYXJOYW1lICE9IG51bGwgJiYgY3VzdG9tTWVzc2FnZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gKFJlc291cmNlQnVuZGxlKSB0aGlzLmVsSGVscGVyLmdldEJlYW4obWVzc2FnZUJ1bmRsZVZhck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygibWVzc2FnZSBidW5kbGUgdmFyIG5hbWUgIiArIHRoaXMubWVzc2FnZUJ1bmRsZVZhck5hbWUgKyAiIG5vdCBmb3VuZCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvVXNlTWVzc2FnZUJ1bmRsZUNvbnZlbnRpb24oU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgaWYgKCFkZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb24gJiYgaXNEZWZhdWx0TWVzc2FnZUJ1bmRsZUNvbnZlbnRpb25BY3RpdmUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZGVmYXVsdEJ1bmRsZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9CVU5ETEVfTkFNRSksIGxvY2FsZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgICAgICAgICAgICAgICAgIGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbiA9IHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGRlZmF1bHRCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0QnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvRmluZEN1c3RvbU1lc3NhZ2VJbkN1c3RvbVJlc291cmNlQnVuZGxlKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0gdHJ5VG9Mb2FkQ3VzdG9tUmVzb3VyY2VCdW5kbGUobG9jYWxlKTsNCi0NCi0gICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLkZJTkVTVCwgIm5vIGN1c3RvbSBtZXNzYWdlIGZvciAiICsga2V5ICsgIiB3aXRoaW4gIiArIGdldEN1c3RvbUJhc2VOYW1lKCksIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgUmVzb3VyY2VCdW5kbGUgdHJ5VG9Mb2FkQ3VzdG9tUmVzb3VyY2VCdW5kbGUoTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1c3RvbUJhc2VOYW1lID0gZ2V0Q3VzdG9tQmFzZU5hbWUoKTsNCi0NCi0gICAgICAgIGlmKGN1c3RvbUJhc2VOYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShjdXN0b21CYXNlTmFtZSwgbG9jYWxlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGRldGVybWluZU1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSwgU3RyaW5nIGN1c3RvbU1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIC8vdXNlIGN1c3RvbSBuYW1lIChpZiBwb3NzaWJsZSkgb3RoZXJ3aXNlOiBmYWxsYmFjayB0byBkZWZhdWx0IG1lc3NhZ2UgKGlmIHBvc3NpYmxlKQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChjdXN0b21NZXNzYWdlICE9IG51bGwpID8gY3VzdG9tTWVzc2FnZQ0KLSAgICAgICAgICAgICAgICAgICAgOiAoZ2V0QmFzZU5hbWUoKSAhPSBudWxsKSA/IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShnZXRCYXNlTmFtZSgpLCBsb2NhbGUpLmdldFN0cmluZyhrZXkpIDogbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIgKyBrZXkgKyBNSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlZmF1bHRNZXNzYWdlQnVuZGxlQ29udmVudGlvbkFjdGl2ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0QmFzZU5hbWUoKTsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21CYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VCdW5kbGVCYXNlTmFtZShTdHJpbmcgbWVzc2FnZUJ1bmRsZUJhc2VOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSA9IG1lc3NhZ2VCdW5kbGVCYXNlTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlQnVuZGxlVmFyTmFtZShTdHJpbmcgbWVzc2FnZUJ1bmRsZVZhck5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZUJ1bmRsZVZhck5hbWUgPSBtZXNzYWdlQnVuZGxlVmFyTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzZmQwOS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuTnVsbFZhbHVlQXdhcmVDb25jdXJyZW50SGFzaE1hcDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBGYWN0b3J5IHdoaWNoIGNyZWF0ZXMgYSBNZXNzYWdlUmVzb2x2ZXIgZm9yIGEgZ2l2ZW4gVmFsaWRhdGlvblN0cmF0ZWd5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdlbmVyaWMgamF2YSBhcGkgKGRlLS9yZWdpc3RlciBtYXBwaW5nKSIpDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLSAgICAgICAgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWVzc2FnZVJlc29sdmVyPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZzsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gbmFtZU1hcHBlckxpc3QgPQ0KLSAgICAgICAgICAgIG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGxvZ2dlci5maW5lKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZVJlc29sdmVyIGNyZWF0ZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgc3RyYXRlZ3lOYW1lID0gUHJveHlVdGlscy5nZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkpOw0KLQ0KLSAgICAgICAgaWYgKHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRTdGF0aWNNYXBwaW5ncygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZy5jb250YWluc0tleShzdHJhdGVneU5hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoTWVzc2FnZVJlc29sdmVyKSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgIC50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZy5nZXQoc3RyYXRlZ3lOYW1lKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOw0KLSAgICAgICAgU3RyaW5nIHJlc29sdmVyTmFtZTsNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IG5hbWVNYXBwZXIgOiBuYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2J1aWxkIGNvbnZlbnRpb24gKFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcikNCi0gICAgICAgICAgICByZXNvbHZlck5hbWUgPSBuYW1lTWFwcGVyLmNyZWF0ZU5hbWUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAvL25hbWUgd2Fzbid0IG1hcHBlZA0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlck5hbWUgPT0gbnVsbCB8fCBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSkuZXF1YWxzKHJlc29sdmVyTmFtZSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgbWVzc2FnZVJlc29sdmVyID0gKE1lc3NhZ2VSZXNvbHZlcikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHJlc29sdmVyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKG1lc3NhZ2VSZXNvbHZlciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyhzdHJhdGVneU5hbWUsIHJlc29sdmVyTmFtZSk7DQotDQotICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lc3QocmVzb2x2ZXJOYW1lICsgIiB1c2VkIGZvciAiICsgc3RyYXRlZ3lOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VSZXNvbHZlcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBhZGRNYXBwaW5nKHN0cmF0ZWd5TmFtZSwgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbml0U3RhdGljTWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICBzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmcgPSBuZXcgTnVsbFZhbHVlQXdhcmVDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oU3RyaW5nLmNsYXNzKTsNCi0NCi0gICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9DT05GSUcpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHNldHVwTWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwTWFwcGluZ3MoTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhtYXBwaW5nLmdldFNvdXJjZSgpLCBtYXBwaW5nLmdldFRhcmdldCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgU3RyaW5nIG1lc3NhZ2VSZXNvbHZlck5hbWUpDQotICAgIHsNCi0gICAgICAgIGxvZ2dlci5maW5lc3QoImFkZGluZyBzdGF0aWMgdmFsaWRhdGlvbiBzdHJhdGVneSB0byBtZXNzYWdlIHJlc29sdmVyIG1hcHBpbmc6ICINCi0gICAgICAgICAgICArIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgKyAiIC0+ICIgKyBtZXNzYWdlUmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgIHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZy5wdXQodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgbWVzc2FnZVJlc29sdmVyTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjk2ZjYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb3JlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IE1lc3NhZ2VSZXNvbHZlciB3aGljaCB1c2VzIHRoZSBkZWZhdWx0IGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gbWVzc2FnZSBidW5kbGUgdmlhIHdlYi54bWwNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CVU5ETEUgPSBFeHRWYWxDb3JlQ29uZmlndXJhdGlvbi5nZXQoKS5jdXN0b21NZXNzYWdlQnVuZGxlQmFzZU5hbWUoKTsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYmFzZU5hbWU7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5iYXNlTmFtZSA9IEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1vZHVsZU1lc3NhZ2VCdW5kbGVOYW1lKENsYXNzVXRpbHMuZ2V0UGFja2FnZU5hbWUoZ2V0Q2xhc3MoKSkpOw0KLSAgICB9DQotDQotICAgIC8vbm90IHVzZWQgYXQgdGhlIG1vbWVudCAtIGp1c3QgZm9yIGEgY29udmVudGlvbg0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuYmFzZU5hbWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21CYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBDVVNUT01fQlVORExFOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL01lc3NhZ2VSZXNvbHZlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYjQ1ODkuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi0NCi0vKioNCi0gKiBBIHtAbGluayBNZXNzYWdlUmVzb2x2ZXJ9IGlzIHJlc3BvbnNpYmxlIGZvciBsb2FkaW5nIHRoZSBtZXNzYWdlIGZvciBhIGdpdmVuIGtleSBhbmQgbG9jYWxlLg0KLSAqIFRoZSBtZXNzYWdlLXNvdXJjZSBhbmQgZm9ybWF0IGRlcGVuZHMgb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZXNvbHZlci4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICAvKioNCi0gICAgICogTG9hZHMgYSBtZXNzYWdlLXRleHQgZm9yIHRoZSBnaXZlbiBtZXNzYWdlLWtleSBhbmQgbG9jYWxlLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0ga2V5IGtleSB3aGljaCBpZGVudGlmaWVzIGEgbWVzc2FnZS10ZXh0DQotICAgICAqIEBwYXJhbSBsb2NhbGUgdGhlIHRhcmdldCBsb2NhbGUgb2YgdGhlIG1lc3NhZ2UNCi0gICAgICogQHJldHVybiBtZXNzYWdlLXRleHQNCi0gICAgICovDQotICAgIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgyNWI0OS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLQ0KLSAgICBwdWJsaWMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpDQotICAgIHsNCi0gICAgICAgIGxvZ2dlci5maW5lKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNzMxYTQuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb3JlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1lc3NhZ2VSZXNvbHZlcnMuDQotICogKGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvcmVDb25maWd1cmF0aW9uLmdldCgpLmN1c3RvbVZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzTmFtZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQzYzAxMy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgVmFsaWRhdGlvblN0cmF0ZWd5IHRvIE1lc3NhZ2VSZXNvbHZlci4NCi0gKiAoY29uZmlndXJlZCB2aWEgaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbikNCi0gKiBUaGUgYmVhbiBwcm92aWRlcyB0aGUgZGVmYXVsdCBuYW1lIChjb252ZW50aW9uKS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gZnVsbCBxdWFsaWZpZWQgbmFtZS4gKD0gY3VzdG9taXphYmxlIGNvbnZlbnRpb24pDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTVNHX1JFU09MVkVSX05BTUVfTUFQUEVSKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYmI0ZDYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIHByb3ZpZGUgYSBOYW1lTWFwcGVyIHBlciB2YWxpZGF0aW9uIG1vZHVsZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMzEwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBzdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhNDc3Yi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFwcyBFeHRWYWwgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gRXh0VmFsIE1lc3NhZ2VSZXNvbHZlcnMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MgPSBQcm94eVV0aWxzDQotICAgICAgICAgICAgICAgIC5nZXRVbnByb3hpZWRDbGFzcyh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKTsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKHN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjNkOTcwLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciB0byBwbGFjZSBWYWxpZGF0aW9uU3RyYXRlZ2llcyBhbmQgTWVzc2FnZVJlc29sdmVycyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcig0MDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VzdG9tUG9zdGZpeCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYKTsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoc3RyYXRlZ3lDbGFzc05hbWUsIGN1c3RvbVBvc3RmaXgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhOTQ5OS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7DQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuR2VuZXJpY0FycmF5VHlwZTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuV2lsZGNhcmRUeXBlOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBjbGFzcyB3aGljaCBpcyBjYXBhYmxlIG9mIGV4dHJhY3RpbmcgVmFsaWRhdGlvblBhcmFtZXRlcidzIGZyb20gYW4gYW5ub3RhdGlvbi4NCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3INCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotDQotICAgIHB1YmxpYyBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZXh0cmFjdEJ5SWQoYW5ub3RhdGlvbiwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8T2JqZWN0PiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGV4dHJhY3RCeUlkKGFubm90YXRpb24sIGtleSwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIDxUPiBMaXN0PFQ+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzczxUPiB2YWx1ZVR5cGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBleHRyYWN0QnlJZChhbm5vdGF0aW9uLCBrZXksIHZhbHVlVHlwZSwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIDxUPiBUIGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzczxUPiB2YWx1ZVR5cGUsIENsYXNzIHZhbHVlSWQpDQotICAgIHsNCi0gICAgICAgIExpc3Q8VD4gcmVzdWx0cyA9IGV4dHJhY3RCeUlkKGFubm90YXRpb24sIGtleSwgdmFsdWVUeXBlLCB2YWx1ZUlkKTsNCi0NCi0gICAgICAgIGlmKHJlc3VsdHMuaXRlcmF0b3IoKS5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMuaXRlcmF0b3IoKS5uZXh0KCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgPFQ+IExpc3Q8VD4gZXh0cmFjdEJ5SWQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzczxUPiB2YWx1ZVR5cGUsIENsYXNzIHZhbHVlSWQpDQotICAgIHsNCi0gICAgICAgIExpc3Q8T2JqZWN0PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0NCi0gICAgICAgIGZvcihPYmplY3QgZW50cnkgOiBleHRyYWN0QnlJZChhbm5vdGF0aW9uLCBrZXksIHZhbHVlSWQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbHVlVHlwZS5pc0Fzc2lnbmFibGVGcm9tKGVudHJ5LmdldENsYXNzKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChlbnRyeSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChMaXN0PFQ+KXJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGV4dHJhY3RCeUlkKEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiBmdWxsUmVzdWx0ID0gZXh0cmFjdEJ5SWQoYW5ub3RhdGlvbiwgdmFsdWVJZCk7DQotDQotICAgICAgICBpZihmdWxsUmVzdWx0LmNvbnRhaW5zS2V5KGtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZ1bGxSZXN1bHQuZ2V0KGtleSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCB3ZWIueG1sIHBhcmFtZXRlciBmb3IgcGVyZm9ybWFuY2UgdHVuaW5nIHRvIGRlYWN0aXZhdGUgdGhlIHNjYW4iKQ0KLSAgICBwdWJsaWMgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiBleHRyYWN0QnlJZChBbm5vdGF0aW9uIGFubm90YXRpb24sIENsYXNzIHZhbHVlSWQpDQotICAgIHsNCi0gICAgICAgIE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+KCk7DQotDQotICAgICAgICBmb3IoTWV0aG9kIGN1cnJlbnRBbm5vdGF0aW9uQXR0cmlidXRlIDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldERlY2xhcmVkTWV0aG9kcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoIWlzVmFsaWRhdGlvblBhcmFtZXRlcihjdXJyZW50QW5ub3RhdGlvbkF0dHJpYnV0ZS5nZXRHZW5lcmljUmV0dXJuVHlwZSgpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgT2JqZWN0IHBhcmFtZXRlclZhbHVlID0gY3VycmVudEFubm90YXRpb25BdHRyaWJ1dGUuaW52b2tlKGFubm90YXRpb24pOw0KLQ0KLSAgICAgICAgICAgICAgICBpZihwYXJhbWV0ZXJWYWx1ZSBpbnN0YW5jZW9mIENsYXNzW10pDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGZvcihDbGFzcyBjdXJyZW50UGFyYW1ldGVyVmFsdWUgOiAoQ2xhc3NbXSlwYXJhbWV0ZXJWYWx1ZSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAvL2tlZXAgY2hlY2sgc28gdGhhdCBmb2xsb3dpbmcgaXMgdHJ1ZToNCi0gICAgICAgICAgICAgICAgICAgICAgICAvL2lmIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgZm91bmQgd2hpY2ggdGVsbHMgdGhhdCBpdCBpc24ndCBhIGJsb2NraW5nIGVycm9yLCBsZXQgaXQgcGFzcw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQYXJhbWV0ZXJWYWx1ZShhbm5vdGF0aW9uLCBjdXJyZW50UGFyYW1ldGVyVmFsdWUsIHJlc3VsdCwgdmFsdWVJZCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZSBpZihwYXJhbWV0ZXJWYWx1ZSBpbnN0YW5jZW9mIENsYXNzKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2tlZXAgY2hlY2sgc28gdGhhdCBmb2xsb3dpbmcgaXMgdHJ1ZToNCi0gICAgICAgICAgICAgICAgICAgIC8vaWYgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBmb3VuZCB3aGljaCB0ZWxscyB0aGF0IGl0IGlzbid0IGEgYmxvY2tpbmcgZXJyb3IsIGxldCBpdCBwYXNzDQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUGFyYW1ldGVyVmFsdWUoYW5ub3RhdGlvbiwgKENsYXNzKXBhcmFtZXRlclZhbHVlLCByZXN1bHQsIHZhbHVlSWQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMZXZlbC5XQVJOSU5HLCAiaW52YWxpZCBtZXRob2QiLCBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGRvbid0IHVzZSB0aGUgSW50cm9zcGVjdG9yIGluIHRoaXMgY2FzZQ0KLSAgICAgKiBpZiB5b3UgaGF2ZSBhIGJldHRlciBzb2x1dGlvbiB3aGljaCBzdXBwb3J0cyBhbGwgc3VwcG9ydGVkIHBhcmFtZXRlciBzdHlsZXMgKHNlZSBleHR2YWwgd2lraSksDQotICAgICAqIHlvdSBjYW4gaW1wbC4gaXQgYW5kIHVzZSBpdCAoZXhjaGFuZ2UgdGhlIGltcGxzLiB2aWEgdGhlIEV4dFZhbENvbnRleHQpLg0KLSAgICAgKiBmdXJ0aGVybW9yZSwgeW91IGNhbiBwcm92aWRlIHRoZSBmaXggZm9yIHRoZSBjb21tdW5pdHkNCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUGFyYW1ldGVyVmFsdWUoDQotICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBDbGFzcyBwYXJhbUNsYXNzLCBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+IHJlc3VsdCwgQ2xhc3MgdmFsdWVJZCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBPYmplY3Qga2V5ID0gbnVsbDsNCi0gICAgICAgIExpc3Q8T2JqZWN0PiBwYXJhbWV0ZXJWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0NCi0gICAgICAgIGlmKFZhbGlkYXRpb25QYXJhbWV0ZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShwYXJhbUNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBMaXN0PEZpZWxkPiBwcm9jZXNzZWRGaWVsZHMgPSBuZXcgQXJyYXlMaXN0PEZpZWxkPigpOw0KLSAgICAgICAgICAgIExpc3Q8TWV0aG9kPiBwcm9jZXNzZWRNZXRob2RzID0gbmV3IEFycmF5TGlzdDxNZXRob2Q+KCk7DQotDQotICAgICAgICAgICAgQ2xhc3MgY3VycmVudFBhcmFtQ2xhc3MgPSBwYXJhbUNsYXNzOw0KLSAgICAgICAgICAgIHdoaWxlIChjdXJyZW50UGFyYW1DbGFzcyAhPSBudWxsICYmICFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjdXJyZW50UGFyYW1DbGFzcy5nZXROYW1lKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgICAgICogcHJvY2VzcyBjbGFzcw0KLSAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICAgICAgLy9zdXBwb3J0IHB1cmUgaW50ZXJmYWNlIGFwcHJvYWNoIGUuZy4gVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcw0KLSAgICAgICAgICAgICAgICBmb3IoRmllbGQgY3VycmVudEZpZWxkIDogY3VycmVudFBhcmFtQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoIXByb2Nlc3NlZEZpZWxkcy5jb250YWlucyhjdXJyZW50RmllbGQpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHByb2Nlc3NGb3VuZEZpZWxkKGFubm90YXRpb24sIGN1cnJlbnRGaWVsZCwgcGFyYW1ldGVyVmFsdWVzLCBrZXksIHZhbHVlSWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEZpZWxkcy5hZGQoY3VycmVudEZpZWxkKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAvL2luc3BlY3QgdGhlIG90aGVyIG1ldGhvZHMgb2YgdGhlIGltcGxlbWVudGluZyBjbGFzcw0KLSAgICAgICAgICAgICAgICBmb3IoTWV0aG9kIGN1cnJlbnRNZXRob2QgOiBjdXJyZW50UGFyYW1DbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoIXByb2Nlc3NlZE1ldGhvZHMuY29udGFpbnMoY3VycmVudE1ldGhvZCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcHJvY2Vzc0ZvdW5kTWV0aG9kKGN1cnJlbnRQYXJhbUNsYXNzLCBjdXJyZW50TWV0aG9kLCBwYXJhbWV0ZXJWYWx1ZXMsIGtleSwgdmFsdWVJZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkTWV0aG9kcy5hZGQoY3VycmVudE1ldGhvZCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgICAgICogcHJvY2VzcyBpbnRlcmZhY2VzDQotICAgICAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgICAgICBmb3IoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IGN1cnJlbnRQYXJhbUNsYXNzLmdldEludGVyZmFjZXMoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoIVZhbGlkYXRpb25QYXJhbWV0ZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjdXJyZW50SW50ZXJmYWNlKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIC8vc3VwcG9ydCBpbnRlcmZhY2UgKyBpbXBsLiBhcHByb2FjaCBlLmcuIE15UGFyYW1JbXBsLmNsYXNzDQotICAgICAgICAgICAgICAgICAgICAvLyhNeVBhcmFtSW1wbCBpbXBsZW1lbnRzIE15UGFyYW0NCi0gICAgICAgICAgICAgICAgICAgIC8vTXlQYXJhbSBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi0gICAgICAgICAgICAgICAgICAgIC8vbWV0aG9kcyBpbiB0aGUgaW50ZXJmYWNlIGhhdmUgdG8gYmUgbWFya2VkIHdpdGggQFBhcmFtZXRlclZhbHVlIGFuZCBAUGFyYW1ldGVyS2V5DQotICAgICAgICAgICAgICAgICAgICBmb3IoTWV0aG9kIGN1cnJlbnRNZXRob2QgOiBjdXJyZW50SW50ZXJmYWNlLmdldERlY2xhcmVkTWV0aG9kcygpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwcm9jZXNzZWRNZXRob2RzLmNvbnRhaW5zKGN1cnJlbnRNZXRob2QpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcHJvY2Vzc0ZvdW5kTWV0aG9kKGN1cnJlbnRQYXJhbUNsYXNzLCBjdXJyZW50TWV0aG9kLCBwYXJhbWV0ZXJWYWx1ZXMsIGtleSwgdmFsdWVJZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZE1ldGhvZHMuYWRkKGN1cnJlbnRNZXRob2QpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGZvcihGaWVsZCBjdXJyZW50RmllbGQgOiBjdXJyZW50SW50ZXJmYWNlLmdldERlY2xhcmVkRmllbGRzKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXByb2Nlc3NlZEZpZWxkcy5jb250YWlucyhjdXJyZW50RmllbGQpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcHJvY2Vzc0ZvdW5kRmllbGQoYW5ub3RhdGlvbiwgY3VycmVudEZpZWxkLCBwYXJhbWV0ZXJWYWx1ZXMsIGtleSwgdmFsdWVJZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEZpZWxkcy5hZGQoY3VycmVudEZpZWxkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgY3VycmVudFBhcmFtQ2xhc3MgPSBjdXJyZW50UGFyYW1DbGFzcy5nZXRTdXBlcmNsYXNzKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAga2V5ID0gY3JlYXRlRGVmYXVsdEtleShrZXksIHBhcmFtQ2xhc3MpOw0KLQ0KLSAgICAgICAgaWYocGFyYW1ldGVyVmFsdWVzLmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL0BQYXJhbWV0ZXJWYWx1ZSBpcyBvcHRpb25hbCBhcyB3ZWxsDQotICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWVzLmFkZChrZXkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYocmVzdWx0LmNvbnRhaW5zS2V5KGtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmdldChrZXkpLmFkZEFsbChwYXJhbWV0ZXJWYWx1ZXMpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5wdXQoa2V5LCBwYXJhbWV0ZXJWYWx1ZXMpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IGNyZWF0ZURlZmF1bHRLZXkoT2JqZWN0IGtleSwgQ2xhc3MgY3VycmVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZihrZXkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2NoZWNrIGZvciBzdXBlci1pbnRlcmZhY2UgKGV4Y2x1ZGUgVmFsaWRhdGlvblBhcmFtZXRlciBpdHNlbGYpDQotICAgICAgICAgICAgZm9yKENsYXNzIGludGVyZmFjZUNsYXNzIDogY3VycmVudENsYXNzLmdldEludGVyZmFjZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKFZhbGlkYXRpb25QYXJhbWV0ZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShpbnRlcmZhY2VDbGFzcykgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAoIWludGVyZmFjZUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoVmFsaWRhdGlvblBhcmFtZXRlci5jbGFzcy5nZXROYW1lKCkpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAga2V5ID0gaW50ZXJmYWNlQ2xhc3M7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGtleSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGtleSA9IGN1cnJlbnRDbGFzczsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBrZXk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgcHJvY2Vzc0ZvdW5kRmllbGQoDQotICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlLCBGaWVsZCBjdXJyZW50RmllbGQsIExpc3Q8T2JqZWN0PiBwYXJhbVZhbHVlcywgT2JqZWN0IGtleSwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IG5ld0tleSA9IG51bGw7DQotICAgICAgICBpZihrZXkgPT0gbnVsbCAmJiBjdXJyZW50RmllbGQuaXNBbm5vdGF0aW9uUHJlc2VudChQYXJhbWV0ZXJLZXkuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbmV3S2V5ID0gY3VycmVudEZpZWxkLmdldChpbnN0YW5jZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMZXZlbC5XQVJOSU5HLCAiaW52YWxpZCBmaWVsZCIsIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIC8vbm8gImVsc2UgaWYiIHRvIGFsbG93IGJvdGggYXQgb25lIGZpZWxkDQotICAgICAgICBpZihjdXJyZW50RmllbGQuaXNBbm5vdGF0aW9uUHJlc2VudChQYXJhbWV0ZXJWYWx1ZS5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodmFsdWVJZCA9PSBudWxsIHx8IHZhbHVlSWQuZXF1YWxzKGN1cnJlbnRGaWVsZC5nZXRBbm5vdGF0aW9uKFBhcmFtZXRlclZhbHVlLmNsYXNzKS5pZCgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOw0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1WYWx1ZXMuYWRkKGN1cnJlbnRGaWVsZC5nZXQoaW5zdGFuY2UpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMZXZlbC5XQVJOSU5HLCAiaW52YWxpZCBmaWVsZCIsIGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG5ld0tleSAhPSBudWxsID8gbmV3S2V5IDoga2V5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IHByb2Nlc3NGb3VuZE1ldGhvZCgNCi0gICAgICAgICAgICBDbGFzcyBwYXJhbUNsYXNzLCBNZXRob2QgY3VycmVudE1ldGhvZCwgTGlzdDxPYmplY3Q+IHBhcmFtZXRlclZhbHVlcywgT2JqZWN0IGtleSwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IG5ld0tleSA9IG51bGw7DQotICAgICAgICBpZihrZXkgPT0gbnVsbCAmJiBjdXJyZW50TWV0aG9kLmlzQW5ub3RhdGlvblByZXNlbnQoUGFyYW1ldGVyS2V5LmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKCEoTW9kaWZpZXIuaXNBYnN0cmFjdChwYXJhbUNsYXNzLmdldE1vZGlmaWVycygpKSB8fCBNb2RpZmllci5pc0ludGVyZmFjZShwYXJhbUNsYXNzLmdldE1vZGlmaWVycygpKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG5ld0tleSA9IGN1cnJlbnRNZXRob2QuaW52b2tlKHBhcmFtQ2xhc3MubmV3SW5zdGFuY2UoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExldmVsLldBUk5JTkcsICJpbnZhbGlkIG1ldGhvZCIsIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIC8vbm8gImVsc2UgaWYiIHRvIGFsbG93IGJvdGggYXQgb25lIGZpZWxkDQotICAgICAgICBpZihjdXJyZW50TWV0aG9kLmlzQW5ub3RhdGlvblByZXNlbnQoUGFyYW1ldGVyVmFsdWUuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbHVlSWQgPT0gbnVsbCB8fCB2YWx1ZUlkLmVxdWFscyhjdXJyZW50TWV0aG9kLmdldEFubm90YXRpb24oUGFyYW1ldGVyVmFsdWUuY2xhc3MpLmlkKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudE1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOw0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWVzLmFkZChjdXJyZW50TWV0aG9kLmludm9rZShwYXJhbUNsYXNzLm5ld0luc3RhbmNlKCkpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgaXQncyBhIG5vbmUtc3RhdGljIGlubmVyIGNsYXNzIC0+IHJldHVybiB0aGlzIGNsYXNzDQotICAgICAgICAgICAgICAgICAgICBpZihwYXJhbUNsYXNzLmdldEVuY2xvc2luZ0NsYXNzKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJWYWx1ZXMuYWRkKHBhcmFtQ2xhc3MpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMZXZlbC5XQVJOSU5HLCAiaW52YWxpZCBtZXRob2QiLCBlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXdLZXkgIT0gbnVsbCA/IG5ld0tleSA6IGtleTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZGF0aW9uUGFyYW1ldGVyKFR5cGUgZ2VuZXJpY1JldHVyblR5cGUpDQotICAgIHsNCi0gICAgICAgIGlmKGdlbmVyaWNSZXR1cm5UeXBlIGluc3RhbmNlb2YgR2VuZXJpY0FycmF5VHlwZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZigoKEdlbmVyaWNBcnJheVR5cGUpZ2VuZXJpY1JldHVyblR5cGUpLmdldEdlbmVyaWNDb21wb25lbnRUeXBlKCkgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBhbmFseXplUGFyYW1ldGVyaXplZFR5cGUoDQotICAgICAgICAgICAgICAgICAgICAgICAgKFBhcmFtZXRlcml6ZWRUeXBlKSgoR2VuZXJpY0FycmF5VHlwZSlnZW5lcmljUmV0dXJuVHlwZSkuZ2V0R2VuZXJpY0NvbXBvbmVudFR5cGUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihnZW5lcmljUmV0dXJuVHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhbmFseXplUGFyYW1ldGVyaXplZFR5cGUoDQotICAgICAgICAgICAgICAgICAgICAoUGFyYW1ldGVyaXplZFR5cGUpZ2VuZXJpY1JldHVyblR5cGUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBhbmFseXplUGFyYW1ldGVyaXplZFR5cGUoUGFyYW1ldGVyaXplZFR5cGUgcGFyYW1ldGVyaXplZFR5cGUpDQotICAgIHsNCi0gICAgICAgIGZvcihUeXBlIHR5cGUgOiBwYXJhbWV0ZXJpemVkVHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodHlwZSBpbnN0YW5jZW9mIFdpbGRjYXJkVHlwZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZvcihUeXBlIHVwcGVyQm91bmRzIDogKChXaWxkY2FyZFR5cGUpdHlwZSkuZ2V0VXBwZXJCb3VuZHMoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYodXBwZXJCb3VuZHMgaW5zdGFuY2VvZiBDbGFzcyAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZvciBhdHRyaWJ1dGVzIGxpa2U6IENsYXNzPD8gZXh0ZW5kcyBJbmhlcml0ZWRGcm9tVmFsaWRhdGlvblBhcmFtZXRlcj4gdmFsdWUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblBhcmFtZXRlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKChDbGFzcyl1cHBlckJvdW5kcykpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3Y2IzZTMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb3JlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkgaW1wbGVtZW50cyBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeQ0KLXsNCi0gICAgcHJpdmF0ZSBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciA9IG51bGw7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBsb2dnZXIuZmluZShnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgY3JlYXRlKCkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yQ2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAgICAgLmFkZChFeHRWYWxDb3JlQ29uZmlndXJhdGlvbi5nZXQoKS5jdXN0b21WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yQ2xhc3NOYW1lKCkpOw0KLSAgICAgICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JDbGFzc05hbWVzDQotICAgICAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1IpKTsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yQ2xhc3NOYW1lcy5hZGQoRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yQ2xhc3NOYW1lcykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgPSAoVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcikNCi0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBsb2dnZXIuZmluZXN0KHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGNyZWF0ZWQiKTsNCi0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5LmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTdhZGY5Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuTnVsbFZhbHVlQXdhcmVDb25jdXJyZW50SGFzaE1hcDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogbWFwcyBpbnRlcm5hbCBwYXJhbWV0ZXJzIHRvIG9wdGlvbmFsbHkgYXZhaWxhYmxlIGN1c3RvbSBwYXJhbWV0ZXJzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnkgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PENsYXNzLCBDbGFzcz4NCi17DQotICAgIHByaXZhdGUgTWFwPENsYXNzLCBDbGFzcz4gcGFyYW1ldGVyTWFwcGluZyA9IG5ldyBOdWxsVmFsdWVBd2FyZUNvbmN1cnJlbnRIYXNoTWFwPENsYXNzLCBDbGFzcz4oQ2xhc3MuY2xhc3MpOw0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgY3JlYXRlKENsYXNzIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHRoaXMucGFyYW1ldGVyTWFwcGluZy5jb250YWluc0tleShzb3VyY2UpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmFtZXRlck1hcHBpbmcuZ2V0KHNvdXJjZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBDbGFzcyByZXN1bHQ7DQotDQotICAgICAgICAvL2l0J3MgaW1wb3J0YW50IHRvIGxvb2sgZm9yIHRoZSBzdGF0aWMgY29uZmlncyBmaXJzdCAtIGdsb2JhbCBwYXJhbWV0ZXJzIGFyZSB1c2VkIGludGVybmFsbHkNCi0gICAgICAgIHJlc3VsdCA9IHRyeVRvRmluZFN0YXRpY0NvbmZpZyhzb3VyY2UpOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHRyeVRvRmluZEdsb2JhbFBhcmFtZXRlcihzb3VyY2UpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHNvdXJjZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGNhY2hlTWFwcGluZyhzb3VyY2UsIHJlc3VsdCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3MgdHJ5VG9GaW5kR2xvYmFsUGFyYW1ldGVyKENsYXNzIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IHRhcmdldCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KHNvdXJjZS5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIENsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoQ2xhc3MpIHRhcmdldDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3MgdHJ5VG9GaW5kU3RhdGljQ29uZmlnKENsYXNzIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgcmVzdWx0ID0gbnVsbDsNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gY29uZmlnIDogRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlZBTElEQVRJT05fUEFSQU1FVEVSX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gdHJ5VG9NYXAoc291cmNlLCBjb25maWcuZ2V0TWFwcGluZygpKTsNCi0NCi0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3MgdHJ5VG9NYXAoQ2xhc3Mgc291cmNlLCBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmcpDQotICAgIHsNCi0gICAgICAgIENsYXNzIHRhcmdldCA9IG51bGw7DQotDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBtYXBwaW5nKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscyhlbnRyeS5nZXRTb3VyY2UoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0YXJnZXQgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShlbnRyeS5nZXRUYXJnZXQoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdGFyZ2V0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjYWNoZU1hcHBpbmcoQ2xhc3Mgc291cmNlLCBDbGFzcyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFyYW1ldGVyTWFwcGluZy5wdXQoc291cmNlLCB0YXJnZXQpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2YzdmMS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogbWVjaGFuaXNtIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBleHR2YWwNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGltcGxlbWVudHMgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcg0KLXsNCi0gICAgcHVibGljIGJvb2xlYW4gc2V2ZXJpdHlCbG9ja3NOYXZpZ2F0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IuZXF1YWxzKHNldmVyaXR5KSB8fCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUwuZXF1YWxzKHNldmVyaXR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXZlcml0eUNhdXNlc1ZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLmVxdWFscyhzZXZlcml0eSkgfHwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMLmVxdWFscyhzZXZlcml0eSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gc2V2ZXJpdHlDYXVzZXNWaW9sYXRpb25NZXNzYWdlKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHNldmVyaXR5QmxvY2tzU3VibWl0KA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IuZXF1YWxzKHNldmVyaXR5KSB8fCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUwuZXF1YWxzKHNldmVyaXR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXZlcml0eVNob3dzSW5kaWNhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLmVxdWFscyhzZXZlcml0eSkgfHwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMLmVxdWFscyhzZXZlcml0eSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZDBhODUuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQSBzcGVjaWFsIHZhbGlkYXRpb25QYXJhbWV0ZXIgdG8gaW5kaWNhdGUgdGhhdCBubyBpbmZvcm1hdGlvbiB3aGF0IHNvIGV2ZXIgb2YgdGhlIHZhbGlkYXRpb24gaW5mb3JtYXRpb24gKGxpa2UgbGVuZ3RoDQotICogb3IgcmVxdWlyZWQpIHNob3VsZCBiZSBwbGFjZWQgb24gdGhlIFVJQ29tcG9uZW50IHNvIHRoYXQgY2xpZW50IHNpZGUgY291bGQgZG8gYW55IHZhbGlkYXRpb24uDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotew0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlcktleS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9QYXJhbWV0ZXJLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM5MWI1Zi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlcktleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLQ0KLS8qKg0KLSAqIE9wdGlvbmFsIGtleSB0byBpZGVudGlmeSBhDQotICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXJ9DQotICogaWYgdGhlcmUgYXJlIG11bHRpcGxlIHBhcmFtZXRlcnMgb2YgdGhlIHNhbWUgdHlwZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVGFyZ2V0KHtGSUVMRCwgTUVUSE9EfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUGFyYW1ldGVyS2V5DQotew0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlclZhbHVlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlclZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MDU1M2QuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9QYXJhbWV0ZXJWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLQ0KLS8qKg0KLSAqIE1hcmtlciBmb3IgdmFsdWVzIHdpdGhpbiBhDQotICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXJ9IGltcGxlbWVudGF0aW9uLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRhcmdldCh7RklFTEQsIE1FVEhPRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFBhcmFtZXRlclZhbHVlDQotew0KLSAgICAvKioNCi0gICAgICogSXQncyBwb3NzaWJsZSB0byBkZWZpbmUgbXVsdGlwbGUgdmFsdWVzIHdpdGhpbiB0aGUNCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXJ9IGltcGxlbWVudGF0aW9uIHdpdGgNCi0gICAgICogdGhlIHNhbWUgdHlwZS4gVGhlIG9wdGlvbmFsIGlkIGFsbG93cyB0byBpZGVudGlmeSB0aGUgdmFsdWUgb2YgaW50ZXJlc3QuDQotICAgICAqDQotICAgICAqIEByZXR1cm4gdGhlIHR5cGUtc2FmZSBpZA0KLSAgICAgKi8NCi0gICAgQ2xhc3MgaWQoKSBkZWZhdWx0IFBhcmFtZXRlclZhbHVlLmNsYXNzOw0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjcyN2VlLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBNYXJrZXIgaW50ZXJmYWNlIGZvciB2YWxpZGF0aW9uIHBhcmFtZXRlcnMuDQotICoNCi0gKiBPcHRpb25hbGx5LCBhIHBhcmFtZXRlciBoYXMgYSB7QGxpbmsgUGFyYW1ldGVyS2V5fSBhbmQgb25lIG9yIG1vcmUge0BsaW5rIFBhcmFtZXRlclZhbHVlfSBhbm5vdGF0aW9uL3MuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25QYXJhbWV0ZXINCi17DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZDJhOWUuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdGhlIGV4dHJhY3Rpb24gb2Yge0BsaW5rIFZhbGlkYXRpb25QYXJhbWV0ZXJ9cy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvcg0KLXsNCi0gICAgLyoqDQotICAgICAqIEV4dHJhY3RzIGFsbCB7QGxpbmsgVmFsaWRhdGlvblBhcmFtZXRlcn1zIGhvc3RlZCBieSB0aGUgZ2l2ZW4gYW5ub3RhdGlvbi4NCi0gICAgICogVGhlIHdpa2kgc2hvd3MgYWxsIHN1cHBvcnRlZCBzdHlsZXMuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uIHdoaWNoIG1pZ2h0IGNvbnRhaW4gdmFsaWRhdGlvbi1wYXJhbWV0ZXJzDQotICAgICAqIEByZXR1cm4ga2V5L3ZhbHVlIG1hcCBvZiB0aGUgZm91bmQgcGFyYW1ldGVycw0KLSAgICAgKi8NCi0gICAgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbik7DQotDQotICAgIC8qKg0KLSAgICAgKiBFeHRyYWN0cyBhbGwge0BsaW5rIFZhbGlkYXRpb25QYXJhbWV0ZXJ9cyBmb3IgdGhlIGdpdmVuIGtleSB3aGljaCBhcmUgaG9zdGVkIGJ5IHRoZSBnaXZlbiBhbm5vdGF0aW9uLg0KLSAgICAgKiBUaGUgd2lraSBzaG93cyBhbGwgc3VwcG9ydGVkIHN0eWxlcy4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24gZm9yIHdoaWNoIHdlIHdhbnQgdG8gZXh0cmFjdCB0aGUgaW5mb3JtYXRpb24uDQotICAgICAqIEBwYXJhbSBrZXkgVmFsdWUgZm9yIHRoZSBQYXJhbWV0ZXJLZXkgdGhhdCBpcyB1c2VkIGZvciBmaWx0ZXJpbmcgdGhlIFZhbGlkYXRpb25QYXJhbWV0ZXJzLg0KLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgdGhlIGZvdW5kIHBhcmFtZXRlcnMNCi0gICAgICovDQotICAgIExpc3Q8T2JqZWN0PiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSk7DQotDQotICAgIC8qKg0KLSAgICAgKiBFeHRyYWN0cyBhbGwge0BsaW5rIFZhbGlkYXRpb25QYXJhbWV0ZXJ9cyBmb3IgdGhlIGdpdmVuIGtleSB3aGljaCBhcmUgaG9zdGVkIGJ5IHRoZSBnaXZlbiBhbm5vdGF0aW9uLg0KLSAgICAgKiBUaGUgcmVzdWx0IGlzIGZpbHRlcmVkIGJ5IHRoZSBnaXZlbiB0eXBlIGZvciB0aGUgdmFsdWUuDQotICAgICAqIFRoZSB3aWtpIHNob3dzIGFsbCBzdXBwb3J0ZWQgc3R5bGVzLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbiB3aGljaCBtaWdodCBjb250YWluIHZhbGlkYXRpb24tcGFyYW1ldGVycw0KLSAgICAgKiBAcGFyYW0ga2V5IFZhbHVlIGZvciB0aGUgUGFyYW1ldGVyS2V5IHRoYXQgaXMgdXNlZCBmb3IgZmlsdGVyaW5nIHRoZSBWYWxpZGF0aW9uUGFyYW1ldGVycy4NCi0gICAgICogQHBhcmFtIHZhbHVlVHlwZSBQYXJhbWV0ZXJWYWx1ZSBtdXN0IGJlIGFzc2lnbmFibGUgdG8gdGhpcyB0eXBlIHRvIGJlIGFkZGVkIHRvIHRoZSByZXN1bHQuDQotICAgICAqIEBwYXJhbSA8VD4gQ2xhc3MgdHlwZSBvZiB0aGUgcmVzdWx0IHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSBjbGFzcyB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgdmFsdWVUeXBlLg0KLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgdGhlIGZvdW5kIHBhcmFtZXRlcnMNCi0gICAgICovDQotICAgIDxUPiBMaXN0PFQ+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzczxUPiB2YWx1ZVR5cGUpOw0KLQ0KLSAgICAvKioNCi0gICAgICogRXh0cmFjdHMgYWxsIHtAbGluayBWYWxpZGF0aW9uUGFyYW1ldGVyfXMgZm9yIHRoZSBnaXZlbiBrZXkgd2hpY2ggYXJlIGhvc3RlZCBieSB0aGUgZ2l2ZW4gYW5ub3RhdGlvbi4NCi0gICAgICogVGhlIHJlc3VsdCBpcyBmaWx0ZXJlZCBieSB0aGUgZ2l2ZW4gdHlwZSBmb3IgdGhlIHZhbHVlIGFuZA0KLSAgICAgKiB0aGUgZ2l2ZW4gaWQgdG8gcmVjZWl2ZSBhIHNwZWNpZmljIHZhbHVlIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBwYXJhbWV0ZXJzIG9mIHRoZSBzYW1lIHR5cGUuDQotICAgICAqIFRoZSB3aWtpIHNob3dzIGFsbCBzdXBwb3J0ZWQgc3R5bGVzLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbiB3aGljaCBtaWdodCBjb250YWluIHZhbGlkYXRpb24tcGFyYW1ldGVycw0KLSAgICAgKiBAcGFyYW0ga2V5IFZhbHVlIGZvciB0aGUgUGFyYW1ldGVyS2V5IHRoYXQgaXMgdXNlZCBmb3IgZmlsdGVyaW5nIHRoZSBWYWxpZGF0aW9uUGFyYW1ldGVycy4NCi0gICAgICogQHBhcmFtIHZhbHVlVHlwZSBQYXJhbWV0ZXJWYWx1ZSBtdXN0IGJlIGFzc2lnbmFibGUgdG8gdGhpcyB0eXBlIHRvIGJlIGFkZGVkIHRvIHRoZSByZXN1bHQuDQotICAgICAqIEBwYXJhbSB2YWx1ZUlkIG1hcmtlciB3aGljaCBpZGVudGlmaWVzIGEgc3BlY2lmaWMgdmFsdWUNCi0gICAgICogKG5lZWRlZCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgcGFyYW1ldGVycyBvZiB0aGUgc2FtZSB0eXBlKQ0KLSAgICAgKiBAcGFyYW0gPFQ+IENsYXNzIHR5cGUgb2YgdGhlIHJlc3VsdCB3aGljaCBpcyB0aGUgc2FtZSBhcyB0aGUgY2xhc3MgdHlwZSBvZiB0aGUgcGFyYW1ldGVyIHZhbHVlVHlwZS4NCi0gICAgICogQHJldHVybiBWYWx1ZSBvZiB0aGUgZm91bmQgUGFyYW1ldGVyVmFsdWUuDQotICAgICAqLw0KLSAgICA8VD4gVCBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSwgQ2xhc3M8VD4gdmFsdWVUeXBlLCBDbGFzcyB2YWx1ZUlkKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmQ3MTVlLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBhIGZhY3Rvcnkgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGEge0BsaW5rIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3J9DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5DQotew0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIGNhcGFibGUgb2YgZXh0cmFjdGluZyBWYWxpZGF0aW9uUGFyYW1ldGVyJ3MgZnJvbSBhbm5vdGF0aW9ucy4NCi0gICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB0eXBlIHtAbGluayBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yfXMgZm9yIGV4dHJhY3RpbmcgZ2VuZXJpYyBwYXJhbXMgZnJvbSBhbm5vdGF0aW9ucy4NCi0gICAgICovDQotICAgIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgY3JlYXRlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ5YWNiZi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1Zpb2xhdGlvblNldmVyaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogVmFsaWRhdGlvblBhcmFtZXRlciB0byBpbmRpY2F0ZSB0aGUgc2V2ZXJpdHkgb2YgdGhlIEZhY2VzTWVzc2FnZSBpbiBjYXNlIG9mIGEgdmFsaWRhdGlvbiBmYWlsdXJlLiBCeSBkZWZhdWx0LCB0aGUNCi0gKiBzZXZlcml0eSBpcyBFcnJvci4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmlvbGF0aW9uU2V2ZXJpdHkNCi17DQotICAgIC8qKg0KLSAgICAgKiBWaW9sYXRpb25TZXZlcml0eSBJbmZvLg0KLSAgICAgKi8NCi0gICAgaW50ZXJmYWNlIEluZm8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotICAgIHsNCi0gICAgICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgICAgIHB1YmxpYyBDbGFzcyBLRVkgPSBWaW9sYXRpb25TZXZlcml0eS5jbGFzczsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICBAUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIHB1YmxpYyBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgU0VWRVJJVFkgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfSU5GTzsNCi0NCi0gICAgICAgIC8vQFBhcmFtZXRlclZhbHVlDQotICAgICAgICAvL01lc3NhZ2VUeXBlIHBvc3RmaXggPSBNZXNzYWdlVHlwZS5JTkZPOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBWaW9sYXRpb25TZXZlcml0eSBXYXJuLg0KLSAgICAgKi8NCi0gICAgaW50ZXJmYWNlIFdhcm4gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotICAgIHsNCi0gICAgICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgICAgIHB1YmxpYyBDbGFzcyBLRVkgPSBWaW9sYXRpb25TZXZlcml0eS5jbGFzczsNCi0NCi0gICAgICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFNFVkVSSVRZID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk47DQotDQotICAgICAgICAvL0BQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgLy9NZXNzYWdlVHlwZSBwb3N0Zml4ID0gTWVzc2FnZVR5cGUuV0FSTjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVmlvbGF0aW9uU2V2ZXJpdHkgRXJyb3IuDQotICAgICAqLw0KLSAgICBpbnRlcmZhY2UgRXJyb3IgZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotICAgIHsNCi0gICAgICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgICAgIHB1YmxpYyBDbGFzcyBLRVkgPSBWaW9sYXRpb25TZXZlcml0eS5jbGFzczsNCi0NCi0gICAgICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFNFVkVSSVRZID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SOw0KLQ0KLSAgICAgICAgLy9AUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIC8vTWVzc2FnZVR5cGUgcG9zdGZpeCA9IE1lc3NhZ2VUeXBlLkVSUk9SOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBWaW9sYXRpb25TZXZlcml0eSBGYXRhbC4NCi0gICAgICovDQotICAgIGludGVyZmFjZSBGYXRhbCBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi0gICAgew0KLSAgICAgICAgQFBhcmFtZXRlcktleQ0KLSAgICAgICAgcHVibGljIENsYXNzIEtFWSA9IFZpb2xhdGlvblNldmVyaXR5LmNsYXNzOw0KLQ0KLSAgICAgICAgQFBhcmFtZXRlclZhbHVlDQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgU0VWRVJJVFkgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUw7DQotDQotICAgICAgICAvL0BQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgLy9NZXNzYWdlVHlwZSBwb3N0Zml4ID0gTWVzc2FnZVR5cGUuRkFUQUw7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1Zpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc2YmQ5NC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1Zpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBtZWNoYW5pc20gdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGV4dHZhbA0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcg0KLXsNCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHNldmVyaXR5IHNob3VsZCBibG9jayB0aGUgbmF2aWdhdGlvbg0KLSAgICAgKiBpZiAjc2V2ZXJpdHlDYXVzZXNWYWxpZGF0b3JFeGNlcHRpb24gcmV0dXJucyBmYWxscyB2YWxpZGF0aW9uIHdpbGwgYmUgY29udGludWVkIGZvciB0aGUgY3VycmVudCBwcm9wZXJ0eQ0KLSAgICAgKiBhbGwgbWVzc2FnZXMgd2hpY2ggZG9uJ3QgbGVhZCB0byBhbiBleGNlcHRpb24gc2hvdWxkIGJlIHN0b3JlZCBpbiBhbiBzdG9yYWdlIGFuZA0KLSAgICAgKiBhZGRlZCBhZnRlciB0aGUgZmlyc3QgbWVzc2FnZSB3aGljaCBnZXRzIHRocm93biBhcyBleGNlcHRpb24NCi0gICAgICogYSBnbG9iYWwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgYWRkIHRoZSBtZXNzYWdlcyBvZiB0aGUgc3RvcmFnZSBhcyBmYWNlcyBtZXNzYWdlDQotICAgICAqLw0KLSAgICBib29sZWFuIHNldmVyaXR5QmxvY2tzTmF2aWdhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KTsNCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHNldmVyaXR5IHNob3VsZCBjYXVzZSBhIHZhbGlkYXRvciBleGNlcHRpb24NCi0gICAgICovDQotICAgIGJvb2xlYW4gc2V2ZXJpdHlDYXVzZXNWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSk7DQotDQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IGN1cnJlbnQgZmFjZXMgY29udGV4dA0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgY3VycmVudCBjb21wb25lbnQNCi0gICAgICogQHBhcmFtIHNldmVyaXR5IGpzZiBzZXZlcml0eSBmb3IgZmFjZXMgbWVzc2FnZXMNCi0gICAgICogQHJldHVybiB0cnVlIGlmIGEgdmlvbGF0aW9uIG1lc3NhZ2UgbGVhZHMgdG8gYSBmYWNlcyBtZXNzYWdlDQotICAgICAqLw0KLSAgICBib29sZWFuIHNldmVyaXR5Q2F1c2VzVmlvbGF0aW9uTWVzc2FnZSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KTsNCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnN0cmFpbnQgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkgc2hvdWxkIGJlIHZhbGlkYXRlZCBvbiB0aGUgY2xpZW50IHNpZGUgKGlmIHN1cHBvcnRlZCkNCi0gICAgICovDQotICAgIGJvb2xlYW4gc2V2ZXJpdHlCbG9ja3NTdWJtaXQoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSk7DQotDQotICAgIC8qKg0KLSAgICAgKiBhdmFpbGFibGUgZm9yIGFkZC1vbnMgLSBub3QgdXNlZCBpbnRlcm5hbGx5IGR1ZSB0byBwZXJmb3JtYW5jZSByZWFzb25zDQotICAgICAqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnN0cmFpbnQgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkNCi0gICAgICogc2hvdWxkIGNhdXNlIGUuZy4gYSByZXF1aXJlZCBtYXJrZXIgaW5kZXBlbmRlbnQgb2YgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiAoaWYgc3VwcG9ydGVkKQ0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBzZXZlcml0eVNob3dzSW5kaWNhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2VkZjY2Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLk1lc3NhZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGVhc2llciBoYW5kbGluZyBvZiB2aW9sYXRpb24gbWVzc2FnZXMuCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIGEgZ29vZCBjYW5kaWRhdGUgYXMgc3VwZXItY2xhc3MgZm9yIGN1c3RvbSB2YWxpZGF0aW9uIHN0cmF0ZWdpZXMuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuUkVVU0V9KQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTxBIGV4dGVuZHMgQW5ub3RhdGlvbj4gZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQotewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYID0gIl9kZXRhaWwiOwotICAgIC8vZS5nLiBmb3IgaW5qZWN0aW5nIGEgbWVzc2FnZSByZXNvbHZlciB2aWEgc3ByaW5nCi0gICAgcHJpdmF0ZSBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOwotCi0gICAgLyoqCi0gICAgICogVXNlcyB0aGUgZ2l2ZW4gbWVzc2FnZSBrZXkgdG8gcmVzb2x2ZSB0aGUgYWN0dWFsIG1lc3NhZ2UgaW4gdGhlIGNvcnJlY3QgbGFuZ3VhZ2UuCi0gICAgICogVGhlIGN1cnJlbnQge0BsaW5rIGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290fSBwcm92aWRlcyB0aGUgdGFyZ2V0IGxvY2FsZS4KLSAgICAgKiBXaGVuIGEge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXJ9Ci0gICAgICogaXMgYXZhaWxhYmxlLCBpdCBpcyB1c2VkIHRvIHJlc29sdmUgdGhlIG1lc3NhZ2UuCi0gICAgICogT3RoZXJ3aXNlIHRoZSBkZWZhdWx0IHJ1bGVzIGFyZSB0YWtlbiB0byBkZWZpbmUgdGhlCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXJ9LgotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlscyNnZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koCi0gICAgICogb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3kpfQotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBrZXkgb2YgdGhlIGVycm9yIG1lc3NhZ2UgdGhhdCBuZWVkcyB0byBiZSByZXNvbHZlZC4KLSAgICAgKiBAcmV0dXJuIFJlc29sdmVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgTG9jYWxlIGxvY2FsZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpOwotCi0gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VSZXNvbHZlciAhPSBudWxsID8gdGhpcy5tZXNzYWdlUmVzb2x2ZXIuZ2V0TWVzc2FnZShrZXksIGxvY2FsZSkgOgotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHRoaXMpLmdldE1lc3NhZ2Uoa2V5LCBsb2NhbGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgKHRoZSBzdW1tYXJ5KSBwcm92aWRlZCBieSB0aGUgZ2l2ZW4gY29uc3RyYWludC4gVGhlIG1lc3NhZ2UgaXMgZGV0ZXJtaW5lZAotICAgICAqIGJ5IHVzaW5nIHRoZSB7QGxpbmsgI2dldFZhbGlkYXRpb25FcnJvck1zZ0tleX0gbWV0aG9kIGZvciBvYnRhaW5pbmcgdGhlIG1lc3NhZ2UtL2tleSB3aGljaCB0aGVuIGlzCi0gICAgICogcmVzb2x2ZWQgYnkgdGhlIG1ldGhvZCB7QGxpbmsgI3Jlc29sdmVNZXNzYWdlKFN0cmluZykgcmVzb2x2ZU1lc3NhZ2V9LgotICAgICAqCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneX0uCi0gICAgICogQHJldHVybiBUaGUgZXJyb3IgbWVzc2FnZSB1c2VkIGluIHRoZSBzdW1tYXJ5IHBhcnQgb2YgdGhlCi0gICAgICoge0BsaW5rIGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZSBGYWNlc01lc3NhZ2V9LgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShBIGFubm90YXRpb24pCi0gICAgewotICAgICAgICByZXR1cm4gcmVzb2x2ZU1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlICh0aGUgZGV0YWlsZWQgbWVzc2FnZSkgcHJvdmlkZWQgYnkgdGhlIGdpdmVuIGNvbnN0cmFpbnQuIFRoZSBtZXNzYWdlIGlzIGRldGVybWluZWQKLSAgICAgKiBieSB1c2luZyB0aGUge0BsaW5rICNnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXl9IG1ldGhvZCBmb3Igb2J0YWluaW5nIHRoZSBtZXNzYWdlLS9rZXkgd2hpY2ggdGhlbiBpcwotICAgICAqIHJlc29sdmVkIGJ5IHRoZSBtZXRob2Qge0BsaW5rICNyZXNvbHZlTWVzc2FnZShTdHJpbmcpIHJlc29sdmVNZXNzYWdlfS4KLSAgICAgKiBXaGVuIHRoZSBrZXkgaXNuJ3QgZm91bmQsIHRoZSByZXN1bHRpbmcgZXhjZXB0aW9uIGlzIGp1c3QgbG9nZ2VkIGJ1dCBub3QgcHJvcGFnYXRlZC4KLSAgICAgKiBTbyB0aGUgZGV0YWlsIG1lc3NhZ2UgaXNuJ3QgcmVxdWlyZWQgYW5kIG51bGwgaXMgcmV0dXJuZWQgaW5zdGVhZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3l9LgotICAgICAqIEByZXR1cm4gVGhlIGVycm9yIG1lc3NhZ2UgdXNlZCBpbiB0aGUgZGV0YWlsIHBhcnQgb2YgdGhlCi0gICAgICoge0BsaW5rIGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZSBGYWNlc01lc3NhZ2V9IG9yIG51bGwuCi0gICAgICovCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImp1c3QgbG9nIGl0IGluIGNhc2Ugb2YgcHJvamVjdCBzdGFnZSBkZXZlbG9wbWVudCIpCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQSBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gKGtleSAhPSBudWxsKSA/IHJlc29sdmVNZXNzYWdlKGtleSArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYKSA6IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLldBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHtAbGluayBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2UgRmFjZXNNZXNzYWdlfSB0aGF0Ci0gICAgICogd2lsbCBiZSB1c2VkIHRvIGluZm9ybSB0aGUgdXNlciBvZiBhIHZhbGlkYXRpb24gZXJyb3IuIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgYnkKLSAgICAgKiBzdWJjbGFzc2VzIGluIHRoZSB7QGxpbmsgI3Byb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQsIE1ldGFEYXRhRW50cnksIE9iamVjdCkgcHJvY2Vzc1ZhbGlkYXRpb259Ci0gICAgICogbWV0aG9kIHdoZW4gYSB7QGxpbmsgVmFsaWRhdG9yRXhjZXB0aW9ufSBpcyB0aHJvd24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5fS4KLSAgICAgKiBAcmV0dXJuIEZhY2VzTWVzc2FnZSBmb3IgaW5mb3JtaW5nIHVzZXIgb2YgdGhlIHByb2JsZW0uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZhY2VzTWVzc2FnZSBnZXRWYWxpZGF0aW9uRXJyb3JGYWNlc01lc3NhZ2UoQSBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZUZhY2VzTWVzc2FnZShnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24pLCBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UgdGhhdCBuZWVkcyB0byBiZSByZXNvbHZlZCBmb3IgdGhlIHZpb2xhdGlvbi1tZXNzYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneX0uCi0gICAgICogQHJldHVybiBUaGUga2V5IG9mIHRoZSBlcnJvciBtZXNzYWdlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEEgYW5ub3RhdGlvbik7Ci0KLSAgICAvKioKLSAgICAgKiBJbmplY3Rpb24gcG9pbnQgZm9yIGEKLSAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLk1lc3NhZ2VSZXNvbHZlcn0KLSAgICAgKiB0aGF0IG5lZWRzIHRvIGJlIHVzZWQgYnkgdGhpcwotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlciB0aGF0IG5lZWRzIHRvIGJlIHVzZWQgYnkgdGhpcyB2YWxpZGF0aW9uU3RyYXRlZ3kuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VSZXNvbHZlcihNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyKQotICAgIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlUmVzb2x2ZXIgPSBtZXNzYWdlUmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIEFkZHMgdGhlIGxhYmVsIG9mIHRoZSBjb21wb25lbnQgdG8gdGhlCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnl9LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQotICAgIHsKLSAgICAgICAgbWV0YURhdGFFbnRyeS5zZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCwgZ2V0TGFiZWwoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSkpOwotCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxhYmVsIG9mIHRoZSB1aUNvbXBvbmVudCBmaWVsZCB0aGF0IGNvdWxkIGJlIHVzZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2VzLiBCeSBkZWZhdWx0IGl0IHJldHVybnMgbnVsbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgVGhlIEpTRiBDb250ZXh0Ci0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IFRoZSBKU0YgY29tcG9uZW50IHRoYXQgY29udGFpbmVkIHRoZSB2YWx1ZSBlbnRlcmVkIGJ5IHRoZSB1c2VyLgotICAgICAqIEBwYXJhbSBtZXRhRGF0YUVudHJ5IFRoZSBkYXRhIGhvbGRlciB3aGljaCBzdG9yZXMgdGhlIG1ldGEtZGF0YSBhbmQgc29tZSBpbmZvcm1hdGlvbiB3aGVyZSB0aGUgbWV0YS1kYXRhIHdhcwotICAgICAqIGFyb3VuZC4KLSAgICAgKiBAcmV0dXJuIFRoZSBsYWJlbC10ZXh0IG9mIHRoZSB7QGxpbmsgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50fSB3aGljaCBjYW4gYmUgdXNlZCBpbiB0aGUgdmlvbGF0aW9uIG1zZy4KLSAgICAgKi8KLSAgICAvL2UuZy4gZm9yIGN1c3RvbSBhbm5vdGF0aW9ucyAtIG92ZXJyaWRlIGlmIG5lZWRlZAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNjJlOGIuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5leGNlcHRpb24uUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBQcm92aWRlcyB0aGUgYWJpbGl0eSB0byB1c2Uge0BsaW5rIFZhbGlkYXRvckV4Y2VwdGlvbn0gKGFzIGV4cGVjdGVkIGJ5IHRoZSB1c2VyKSBpbnN0ZWFkIG9mIHRoZSBpbnRlcm5hbGx5IG5lZWRlZA0KLSAqIHtAbGluayBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbn0uIEZ1cnRoZXJtb3JlLCB0aGlzIGJhc2UgaW1wbGVtZW50YXRpb24gaW50cm9kdWNlcyBhIGhvb2sgZm9yIHRoZQ0KLSAqIGluaXRpYWxpemF0aW9uIG9mIHZhbGlkYXRvcnMgYW5kIHRoZSBpbnRlcmNlcHRpb24gb2Yge0BsaW5rIFZhbGlkYXRvckV4Y2VwdGlvbn1zLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgbG9nZ2VyLmZpbmUoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqDQotICAgICAqIEJlZm9yZSBhY3R1YWxseSBleGVjdXRpbmcgdGhlIHZhbGlkYXRpb24gKHtAbGluayAjcHJvY2Vzc1ZhbGlkYXRpb259KSBhbnkgaW5pdGlhbGl6YXRpb24gY2FuIGJlDQotICAgICAqIHBlcmZvcm1lZCBieSBvdmVycmlkaW5nIHtAbGluayAjaW5pdFZhbGlkYXRpb259LiBJZiBhIFZhbGlkYXRpb24gZXhjZXB0aW9uIG9jY3VycywgdGhlIG1ldGhvZA0KLSAgICAgKiB7QGxpbmsgI3Byb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbn0gZXhlY3V0ZXMgdGhlIHJlZ2lzdGVyZWQNCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcn0ncy4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIGxvZ2dlci5maW5lc3QoInN0YXJ0IGluaXRWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotDQotICAgICAgICBpbml0VmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICAgICAgbG9nZ2VyLmZpbmVzdCgiaW5pdFZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmZpbmVzdCgic3RhcnQgcHJvY2Vzc1ZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgICAgICBwcm9jZXNzVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICAgICAgICAgIGxvZ2dlci5maW5lc3QoInByb2Nlc3NWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZmluZXN0KCJzdGFydCBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLSAgICAgICAgICAgIGlmKGUgaW5zdGFuY2VvZiBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbiA9IG5ldyBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb252ZXJ0RmFjZXNNZXNzYWdlKGUuZ2V0RmFjZXNNZXNzYWdlKCkpLCBlLmdldENhdXNlKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24gPSBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbnZlcnRGYWNlc01lc3NhZ2UoZS5nZXRGYWNlc01lc3NhZ2UoKSksIGUuZ2V0Q2F1c2UoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlmIChwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIuZmluZXN0KGdldENsYXNzKCkuZ2V0TmFtZSgpICsNCi0gICAgICAgICAgICAgICAgICAgICI6IHRocm93IG9yaWdpbmFsIGV4Y2VwdGlvbiBhZnRlciBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24iKTsNCi0NCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudCgNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLCB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBsb2dnZXIuZmluZXN0KGdldENsYXNzKCkuZ2V0TmFtZSgpICsNCi0gICAgICAgICAgICAgICAgIjogb3JpZ2luYWwgZXhjZXB0aW9uIGFmdGVyIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEFsbG93cyBzb21lIGluaXRpYWxpemF0aW9uIGJlZm9yZSB0aGUgYWN0dWFsIHZhbGlkYXRpb24gaXMgcGVyZm9ybWVkLiBUaGlzIGluaXRpYWxpemF0aW9uIGlzIGV4ZWN1dGVkIGJlZm9yZQ0KLSAgICAgKiBlYWNoIHZhbGlkYXRpb24gYW5kIG5vdCBvbmx5IG9uY2Ugd2hlbiB0aCBjbGFzcyBpcyBjb25zdHJ1Y3RlZC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBUaGUgSlNGIENvbnRleHQNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IFRoZSBKU0YgY29tcG9uZW50IHRoYXQgY29udGFpbmVkIHRoZSB2YWx1ZSBlbnRlcmVkIGJ5IHRoZSB1c2VyLg0KLSAgICAgKiBAcGFyYW0gbWV0YURhdGFFbnRyeSBUaGUgZGF0YSBob2xkZXIgd2hpY2ggc3RvcmVzIHRoZSBtZXRhLWRhdGEgYW5kIHNvbWUgaW5mb3JtYXRpb24gd2hlcmUgdGhlIG1ldGEtZGF0YSB3YXMNCi0gICAgICogYXJvdW5kLg0KLSAgICAgKiBAcGFyYW0gY29udmVydGVkT2JqZWN0IENvbnZlcnRlZCBvYmplY3Qgb2YgdGhlIHVzZXIgZW50ZXJlZCB2YWx1ZS4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEV4ZWN1dGVzIHRoZSByZWdpc3RlcmVkDQotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3J9DQotICAgICAqIHRvIHByb2Nlc3MgdGhlIHZhbGlkYXRpb24gZXhjZXB0aW9uLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBUaGUgSlNGIENvbnRleHQNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IFRoZSBKU0YgY29tcG9uZW50IHRoYXQgY29udGFpbmVkIHRoZSB2YWx1ZSBlbnRlcmVkIGJ5IHRoZSB1c2VyLg0KLSAgICAgKiBAcGFyYW0gbWV0YURhdGFFbnRyeSBUaGUgZGF0YSBob2xkZXIgd2hpY2ggc3RvcmVzIHRoZSBtZXRhLWRhdGEgYW5kIHNvbWUgaW5mb3JtYXRpb24gd2hlcmUgdGhlIG1ldGEtZGF0YSB3YXMNCi0gICAgICogYXJvdW5kLg0KLSAgICAgKiBAcGFyYW0gY29udmVydGVkT2JqZWN0IENvbnZlcnRlZCBvYmplY3Qgb2YgdGhlIHVzZXIgZW50ZXJlZCB2YWx1ZS4NCi0gICAgICogQHBhcmFtIHZhbGlkYXRvckV4Y2VwdGlvbiBUaGUgdmFsaWRhdGlvbiBleGNlcHRpb24gdGhhdCBvY2N1cnJlZC4NCi0gICAgICogQHJldHVybiBzaG91bGQgcmV0dXJuIHRydWUgd2hlbiB5b3UgbGlrZSB0byBoYXZlIHRoZSBWYWxpZGF0b3JFeGNlcHRpb24gdGhyb3duIGJ5IHRoZQ0KLSAgICAgKiBFeHRWYWxVdGlscyN0cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50IG1ldGhvZC4NCi0gICAgICoge0BzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHMjdHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudChqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQsIGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZSwgamF2YS5sYW5nLlRocm93YWJsZSl9DQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uLCB0aGlzKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVmFsaWRhdGVzIHRoZSBnaXZlbiB2YWx1ZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gbWV0YS1kYXRhIGVudHJ5Lg0KLSAgICAgKiBUaGUgbWV0aG9kIHRocm93cyBhIHtAbGluayBWYWxpZGF0b3JFeGNlcHRpb259IGlmIGEgdmlvbGF0aW9uIGlzIGRldGVjdGVkDQotICAgICAqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgVGhlIEpTRiBDb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBUaGUgSlNGIGNvbXBvbmVudCB0aGF0IGNvbnRhaW5lZCB0aGUgdmFsdWUgZW50ZXJlZCBieSB0aGUgdXNlci4NCi0gICAgICogQHBhcmFtIG1ldGFEYXRhRW50cnkgVGhlIGRhdGEgaG9sZGVyIHdoaWNoIHN0b3JlcyB0aGUgbWV0YS1kYXRhIGFuZCBzb21lIGluZm9ybWF0aW9uIHdoZXJlIHRoZSBtZXRhLWRhdGEgd2FzDQotICAgICAqIGFyb3VuZC4NCi0gICAgICogQHBhcmFtIGNvbnZlcnRlZE9iamVjdCBDb252ZXJ0ZWQgb2JqZWN0IG9mIHRoZSB1c2VyIGVudGVyZWQgdmFsdWUuDQotICAgICAqIEB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uIFdoZW4gdmlvbGF0aW9uIG9mIHRoZSB2YWxpZGF0aW9uIHJ1bGVzIG9jY3Vycy4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb247DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEwNDJlZC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotDQotLyoqDQotICogVG8gbWFwIGNvbnN0cmFpbnRzIGRpcmVjdGx5IHRvIGEgbWV0YS1kYXRhIHRyYW5zZm9ybWVyIGlmIHRoZXJlIGlzIG5vIHZhbGlkYXRpb24gc3RyYXRlZ3kgKHJlcXVpcmVkIGJ5IGpzciAzMDMpLg0KLSAqIFNvIHRoZSBWYWxpZGF0aW9uU3RyYXRlZ3kgaXMgb25seSB1c2VkIHRvIGhhdmUgdGhlIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbiBhbmQgaXMgbm90IHVzZWQgdG8gZG8gdGhlIGFjdHVhbA0KLSAqIHZhbGlkYXRpb24uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBJZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIFRocm93cyBhbiB1bnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB3aGVuIHRoZSBtZXRob2QgZ2V0cyBleGVjdXRlZC4gVGhpcyBWYWxpZGF0aW9uU3RyYXRlZ3kgc2hvdWxkIG5ldmVyDQotICAgICAqIGJlIHVzZWQgdG8gcGVyZm9ybSBhY3R1YWwgdmFsaWRhdGlvbnMuICANCi0gICAgICovDQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidGhpcyBpcyBqdXN0IGFuIGFkYXB0ZXIgZS5nLiBmb3IgY29tcG9uZW50IGluaXRpYWxpemF0aW9uIik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM0YWFkOC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIHRvIGNvbm5lY3QgdmFsaWRhdGlvbiBzdHJhdGVnaWVzIHdpdGggbWV0YS1kYXRhIHRyYW5zZm9ybWVycywNCi0gKiBpZiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBkZWZpbmVkIGFzIGJlYW4gYW5kIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eS4NCi0gKg0KLSAqIGl0IGlzbid0IGxpbmtlZCB0byBqc3IgMzAzLg0KLSAqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkhJR0gsIGRlc2NyaXB0aW9uID0gInNlZSBFWFRWQUwtMTE2IikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGludGVyZmFjZSBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlciBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgLy90byBnZXQgYmFjayB0aGUgaW50ZXJuYWwgY2FjaGluZw0KLSAgICAvKioNCi0gICAgICogTXVzdCByZXR1cm4gdGhlIGNsYXNzIG5hbWUgb2YgVmFsaWRhdGlvblN0cmF0ZWd5IHdyYXBwZWQgYnkgdGhpcyBhZGFwdGVyLg0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIGNsYXNzIG5hbWUgb2YgdGhlIHdyYXBwZWQgVmFsaWRhdGlvblN0cmF0ZWd5DQotICAgICAqLw0KLSAgICBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBNdXN0IHJldHVybiB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgTWV0YURhdGFUcmFuc2Zvcm1lciBmb3IgdGhlIHdyYXBwZWQgVmFsaWRhdGlvblN0cmF0ZWd5IG9mIHRoZSBhZGFwdGVyLg0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIGNsYXNzIG5hbWUgb2YgdGhlIE1ldGFEYXRhVHJhbnNmb3JtZXIgZm9yIHRoZSB3cmFwcGVkIFZhbGlkYXRpb25TdHJhdGVneS4NCi0gICAgICovDQotICAgIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3MzAxZS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIHRvIGNvbm5lY3QgdmFsaWRhdGlvbiBzdHJhdGVnaWVzIHdpdGggbWV0YS1kYXRhIHRyYW5zZm9ybWVycywNCi0gKiBpZiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBkZWZpbmVkIGFzIGJlYW4gYW5kIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eS4NCi0gKg0KLSAqIGl0IGlzbid0IGxpbmtlZCB0byBqc3IgMzAzLg0KLSAqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkhJR0gsIGRlc2NyaXB0aW9uID0gInNlZSBFWFRWQUwtMTE2IikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbCBpbXBsZW1lbnRzIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgcHJpdmF0ZSBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAvL29wdGlvbmFsIGZhbGxiYWNrIGZvciBpbnRlcm5hbCBjYWNoaW5nDQotICAgIHByaXZhdGUgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsNCi0NCi0gICAgcHVibGljIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbCgpDQotICAgIHsNCi0gICAgICAgIGxvZ2dlci5maW5lKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoge0Bpbmhlcml0RG9jfQ0KLSAgICAgKiBEZWxlZ2F0ZXMgdG8gdGhlIHZhbGlkYXRpb24gdG8gdGhlIHdyYXBwZWQgVmFsaWRhdGlvblN0cmF0ZWd5Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB7QGluaGVyaXREb2N9DQotICAgICAqIFdoZW4gYSBtZXRhRGF0YVRyYW5zZm9ybWVyIGlzIHNldCwgdGhlIGNsYXNzIG5hbWUgaXMgcmV0dXJuZWQuICBXaGVuIHRoZSBtZXRhRGF0YVRyYW5zZm9ybWVyIGlzIGFuIGFkYXB0ZXINCi0gICAgICogKEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcikgd2UgYXNrIHRoZSBhZGFwdGVyIGZvciB0aGUgbmFtZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciBpbnN0YW5jZW9mIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcikNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyKSBtZXRhRGF0YVRyYW5zZm9ybWVyICkuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgTWV0YURhdGFUcmFuc2Zvcm1lciBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFUcmFuc2Zvcm1lcihNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lciA9IG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB3cmFwcGVkIFZhbGlkYXRpb25TdHJhdGVneSBvZiB0aGlzIGFkYXB0ZXIuDQotICAgICAqIEBwYXJhbSB2YWxpZGF0aW9uU3RyYXRlZ3kgVGhlIFZhbGlkYXRpb25TdHJhdGVneSB0byB3cmFwIGJ5IHRoaXMgYWRhcHRlci4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25TdHJhdGVneShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneSA9IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGhlIGNsYXNzIG5hbWUgcmV0dXJuZWQgYnkgdGhlICB7bGluayBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoKX0gbWV0aG9kIHdoZW4gbm8gVmFsaWRhdGlvblN0cmF0ZWd5IGlzIHNldC4NCi0gICAgICogQHBhcmFtIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSAgVGhlIGNsYXNzIG5hbWUgdG8gcmV0dXJuLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3OTc2ZjMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcg0KLSAgICAuQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5OdWxsVmFsdWVBd2FyZUNvbmN1cnJlbnRIYXNoTWFwOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyB0aGUgVmFsaWRhdGlvblN0cmF0ZWd5IGZvciBhIGdpdmVuIE1ldGEtRGF0YSBLZXkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFN0cmluZz4NCi0gICAgICAgIGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxTdHJpbmcsIFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9IG51bGw7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4oKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgbG9nZ2VyLmZpbmUoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgY3JlYXRlKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgaWYgKG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcuY29udGFpbnNLZXkobWV0YURhdGFLZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lJbnN0YW5jZShtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZy5nZXQobWV0YURhdGFLZXkpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgICAgICBTdHJpbmcgc3RyYXRlZ3lOYW1lOw0KLSAgICAgICAgLy9udWxsIC0+IHVzZSBuYW1lIG1hcHBlcnMNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxTdHJpbmc+IG5hbWVNYXBwZXIgOiBuYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdHJhdGVneU5hbWUgPSBuYW1lTWFwcGVyLmNyZWF0ZU5hbWUobWV0YURhdGFLZXkpOw0KLQ0KLSAgICAgICAgICAgIGlmIChzdHJhdGVneU5hbWUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lJbnN0YW5jZShzdHJhdGVneU5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFkZE1hcHBpbmcobWV0YURhdGFLZXksIHN0cmF0ZWd5TmFtZSk7DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYWRkTWFwcGluZyhtZXRhRGF0YUtleSwgbnVsbCk7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lJbnN0YW5jZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUNCi0gICAgICAgICAgICAuc3RhcnRzV2l0aChBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5QUkVGSVhfRk9SX0JFQU5fTUFQUElORykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbih2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLlBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HLmxlbmd0aCgpKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIG1ldGFEYXRhS2V5LCBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgbG9nZ2VyLmZpbmVzdCgiYWRkaW5nIG1ldGEtZGF0YSBrZXkgdG8gdmFsaWRhdGlvbiBzdHJhdGVneSBtYXBwaW5nOiAiDQotICAgICAgICAgICAgKyBtZXRhRGF0YUtleSArICIgLT4gIiArIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcucHV0KG1ldGFEYXRhS2V5LCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcgPSBuZXcgTnVsbFZhbHVlQXdhcmVDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oU3RyaW5nLmNsYXNzKTsNCi0NCi0gICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnID0gbmV3IFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgLy90cnkgdG8gc2V0dXAgbWFwcGluZyB3aXRoIGJhc2UgbmFtZSBieSBjb252ZW50aW9uIC0gb3ZlcnJpZGVzIGRlZmF1bHQgbWFwcGluZw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgLy9idWlsZCBjb252ZW50aW9uIChzdHJhdGVneSBtYXBwaW5nKQ0KLSAgICAgICAgICAgIHN0YXRpY0NvbmZpZy5zZXRTb3VyY2VPZk1hcHBpbmcoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVRJQ19TVFJBVEVHWV9NQVBQSU5HX1NPVVJDRSkpOw0KLQ0KLSAgICAgICAgICAgIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9zZXR1cCBjdXN0b20gbWFwcGluZyAtIG92ZXJyaWRlcyBhbGwgb3RoZXIgbWFwcGluZ3MNCi0gICAgICAgIFN0cmluZyBjdXN0b21NYXBwaW5nQmFzZU5hbWUgPSBFeHRWYWxDb3JlQ29uZmlndXJhdGlvbi5nZXQoKS5jdXN0b21TdGF0aWNWYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nU291cmNlKCk7DQotICAgICAgICBpZiAoY3VzdG9tTWFwcGluZ0Jhc2VOYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzdGF0aWNDb25maWcgPSBuZXcgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAgICAgICAgIHN0YXRpY0NvbmZpZy5zZXRTb3VyY2VPZk1hcHBpbmcoY3VzdG9tTWFwcGluZ0Jhc2VOYW1lKTsNCi0gICAgICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBTdHJhdGVneU1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZyxTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWFwcGluZy5nZXRTb3VyY2UoKSwgbWFwcGluZy5nZXRUYXJnZXQoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxTdHJpbmc+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm5hbWVNYXBwZXJMaXN0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9JZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9JZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU4MjkyZC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogaWYgYW4gYWRhcHRlciAoVmFsaWRhdGlvblN0cmF0ZWd5IG9ubHkgdXNlZCBmb3IgY29tcG9uZW50IGluaXRpYWxpemF0aW9uKSBpcyB1c2VkIGZvciBzZXZlcmFsIGNvbnN0cmFpbnRzLCB0aGlzDQotICogaW50ZXJmYWNlIGFsbG93cyB0byBpZGVudGlmeSBpbnN0YW5jZXMuDQotICogRm9yIHRoZSBtb21lbnQgb25seSB1c2VkIGZvciBKU1ItMzAzIHZhbGlkYXRpb24gc3RyYXRlZ2llcy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgLyoqDQotICAgICAqIFNlcGFyYXRvciB1c2VkIGluIHRoZSB1bmlxdWUga2V5IHRoYXQgaWRlbnRpZmllcyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lIHdoZW4gbXVsdGlwbGUgY29uc3RyYWludHMgYXJlIHByb2Nlc3NlZA0KLSAgICAgKiBieSBhIE1ldGFEYXRhVHJhbnNmb3JtZXIuDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5DQotICAgICAqLw0KLSAgICBTdHJpbmcgSURfUFJFRklYID0gIjoiOw0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgdW5pcXVlIHBhcnQgb2YgdGhlIGtleSBvZiB0aGUgIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgd2hlbiBtdWx0aXBsZSBjb25zdHJhaW50cyBhcmUgcHJvY2Vzc2VkDQotICAgICAqIGJ5IGEgTWV0YURhdGFUcmFuc2Zvcm1lci4NCi0gICAgICogQHJldHVybiBVbmlxdWUgU3RyaW5nIHRvIGlkZW50aWZ5IHRoZSBWYWxpZGF0aW9uLg0KLSAgICAgKi8NCi0gICAgU3RyaW5nIGdldElkKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZmYjk0OC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQmFzZSBpbnRlcmZhY2UgZm9yIFZhbGlkYXRpb25TdHJhdGVnaWVzLiBBIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgcmVzcG9uc2libGUgZm9yIHZhbGlkYXRpbmcgYSBjZXJ0YWluIGNvbnN0cmFpbnQuDQotICogRnVydGhlcm1vcmUsIGl0IGNhbiBiZSBhbiBhZGFwdGVyIGZvciBvdGhlciB2YWxpZGF0aW9uIGZyYW1ld29ya3MgbGlrZSBiZWFuLXZhbGlkYXRpb24gYW5kIGl0J3MgdXNlZCB0byBsaW5rIGUuZy4NCi0gKiBhIGNvbnN0cmFpbnQgd2l0aCBhIG1lc3NhZ2UgcmVzb2x2ZXIuDQotICogDQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi0vLypWYWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGVhZCBvZiAqVmFsaWRhdG9yIHRvIGF2b2lkIG5hbWluZyBjb25mdXNpb24gDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIC8qKg0KLSAgICAgKiBWYWxpZGF0ZXMgdGhlIGNvbnZlcnRlZE9iamVjdCBhZ2FpbnN0IHRoZSBnaXZlbiB7QGxpbmsgTWV0YURhdGFFbnRyeX0uDQotICAgICAqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgVGhlIEpTRiBDb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBUaGUgSlNGIGNvbXBvbmVudCB0aGF0IGNvbnRhaW5lZCB0aGUgdmFsdWUgZW50ZXJlZCBieSB0aGUgdXNlci4NCi0gICAgICogQHBhcmFtIG1ldGFEYXRhRW50cnkgVGhlIGRhdGEgaG9sZGVyIHdoaWNoIHN0b3JlcyB0aGUgbWV0YS1kYXRhIGFuZCBzb21lIGluZm9ybWF0aW9uIHdoZXJlIHRoZSBtZXRhLWRhdGEgd2FzDQotICAgICAqIGFyb3VuZC4NCi0gICAgICogQHBhcmFtIGNvbnZlcnRlZE9iamVjdCBDb252ZXJ0ZWQgb2JqZWN0IG9mIHRoZSB1c2VyIGVudGVyZWQgdmFsdWUuDQotICAgICAqLw0KLSAgICB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOw0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWE1NWE3Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLQ0KLSAgICBwdWJsaWMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpDQotICAgIHsNCi0gICAgICAgIGxvZ2dlci5maW5lKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZDk0ZjcuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7DQotDQotLyoqDQotICogTmFtZSBNYXBwZXIgd2hpY2ggZGVsZWdhdGVzIHRoZSBuYW1lIG1hcHBpbmcsIGV4dHJhY3QgdGhlIG5hbWUgYW5kIGNvbnZlcnQgaXQgdG8gYSBiZWFuIG5hbWUgKyBwcmVmaXgNCi0gKiB0YXJnZXQ6IGNvbmZpZ3VyZSBhIHZhbGlkYXRpb24gc3RyYXRlZ3kgdmlhIGEgbWFuYWdlZCBiZWFuIGZhY2lsaXR5IC0+IGFsbG93cyB0byBpbmplY3Qgb3RoZXIgYmVhbnMNCi0gKiBpbnN0ZWFkIG9mIGFwaSBjYWxscyArIGhhcmRjb2RlZCBiZWFuIG5hbWVzDQotICogPHAvPg0KLSAqIGFsbG93ZWQgYmVhbiBzY29wZXM6DQotICogdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgc3RhdGVsZXNzOiBhcHBsaWNhdGlvbi9zaW5nbGV0b24NCi0gKiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBzdGF0ZWZ1bDogbm9uZS9wcm90b3R5cGUNCi0gKiBkb24ndCB1c2UgdGhlIHNlc3Npb24gb3IgYSBjb252ZXJzYXRpb24gc2NvcGUNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoNTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0ZPUl9CRUFOX01BUFBJTkcgPSAiYmVhbjoiOw0KLSAgICBwcml2YXRlIE5hbWVNYXBwZXI8U3RyaW5nPiB3cmFwcGVkOw0KLQ0KLSAgICBwdWJsaWMgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoTmFtZU1hcHBlcjxTdHJpbmc+IG5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IG5hbWVNYXBwZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuYW1lID0gd3JhcHBlZC5jcmVhdGVOYW1lKHNvdXJjZSk7DQotDQotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOw0KLSAgICAgICAgcmV0dXJuIFBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HICsgSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShuYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMmJjZmMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIEFubm90YXRpb25zIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqIChjb25maWd1cmVkIHZpYSB3ZWIueG1sKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZTsNCi0gICAgcHVibGljIEN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb24uZ2V0KCkuY3VzdG9tTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzc05hbWUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5jdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlODMwMi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgQW5ub3RhdGlvbnMgdG8gVmFsaWRhdGlvblN0cmF0ZWdpZXMuDQotICogKGNvbmZpZ3VyZWQgdmlhIGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pDQotICogVGhlIGJlYW4gcHJvdmlkZXMgdGhlIGRlZmF1bHQgbmFtZSAoY29udmVudGlvbikuDQotICogSXQncyBwb3NzaWJsZSB0byBwcm92aWRlIGEgY3VzdG9tIGZ1bGwgcXVhbGlmaWVkIG5hbWUuICg9IGN1c3RvbWl6YWJsZSBjb252ZW50aW9uKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigyMDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMzhkOGYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIG1hcHMgRXh0VmFsIEFubm90YXRpb25zIHRvIEV4dFZhbCBWYWxpZGF0aW9uU3RyYXRlZ2llcy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZShtZXRhRGF0YUtleSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4MjA1My4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgdG8gcGxhY2UgQW5ub3RhdGlvbnMgYW5kIFZhbGlkYXRpb25TdHJhdGVnaWVzIGluIHRoZSBzYW1lIHBhY2thZ2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDQwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFLZXkgKw0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvUHJpb3JpdHkuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMWFhMzMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvUHJpb3JpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1wdWJsaWMgZW51bSBQcmlvcml0eQotewotICAgIEJMT0NLSU5HLAotICAgIEhJR0gsCi0gICAgTUVESVVNLAotICAgIExPVwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQyNWEwYS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Ub0RvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuQ09OU1RSVUNUT1I7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTEQsIENPTlNUUlVDVE9SfSkKLXB1YmxpYyBAaW50ZXJmYWNlIFRvRG8KLXsKLSAgICBQcmlvcml0eSB2YWx1ZSgpOwotICAgIFN0cmluZyBkZXNjcmlwdGlvbigpIGRlZmF1bHQgIiI7Ci0KLSAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICBAaW50ZXJmYWNlIExpc3QKLSAgICB7Ci0gICAgICAgIFRvRG9bXSB2YWx1ZSgpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0N2IzODUuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VDYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi0vKioKLSAqIEFQSTo8YnIvPgotICogcGFydHMgeW91IG1pZ2h0IG5lZWQgZm9yIGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMgYW5kIHdoaWNoIGFyZSBxdWl0ZSBzdGFibGUgaW4gdmlldyBvZiBjaGFuZ2VzCi0gKiA8cC8+Ci0gKiBJTlRFUk5BTDo8YnIvPgotICogaWYgeW91IHRoaW5rIGFib3V0IHJlZmVyZW5jaW5nIGFuIGFydGlmYWN0IHdoaWNoIGlzIG1hcmtlZCBhcyBpbnRlcm5hbCwgYXNrIGZvciBzdXBwb3J0LgotICogdGhlcmUgc2hvdWxkIGJlIGEgYmV0dGVyIHNvbHV0aW9uCi0gKiA8cC8+Ci0gKiBDVVNUT01JWkFCTEU6PGJyLz4KLSAqIGEgcGxhbm5lZCBleHRlbnNpb24gcG9pbnQgd2hpY2ggY29udGFpbnMgbG9naWMgdG8gY3VzdG9taXplIHRoZSBmcmFtZXdvcmsuCi0gKiBpZiBpdCBpc24ndCBhbHNvIG1hcmtlZCBhcyBBUEkgaXQgbWlnaHQgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcy4KLSAqIGhvd2V2ZXIsIHdlIHRyeSB0byBrZWVwIGl0IGFzIHN0YWJsZSBhcyBwb3NzaWJsZSBhbmQgcmVhc29uYWJsZS4KLSAqIDxwLz4KLSAqIFJFVVNFOjxici8+Ci0gKiBhbiBhcnRpZmFjdCB3aGljaCB5b3UgY2FuIHJldXNlIGZvciBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbi4KLSAqIGlmIGl0IGlzbid0IG1hcmtlZCBhcyBBUEkgaXQgbWlnaHQgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcy4KLSAqIGhvd2V2ZXIsIHdlIHRyeSB0byBrZWVwIGl0IGFzIHN0YWJsZSBhcyBwb3NzaWJsZSBhbmQgcmVhc29uYWJsZS4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1wdWJsaWMgZW51bSBVc2FnZUNhdGVnb3J5Ci17Ci0gICAgQVBJLAotICAgIElOVEVSTkFMLAotICAgIENVU1RPTUlaQUJMRSwKLSAgICBSRVVTRQotfQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTM3ZWJjLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlSW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBpdCdzIGFuIGludGVybmFsIGFubm90YXRpb24gdG8gcHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGNvbmNlcm5pbmcgdXNhZ2UtY2F0ZWdvcmllcwotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ci0gKi8KLUBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotcHVibGljIEBpbnRlcmZhY2UgVXNhZ2VJbmZvcm1hdGlvbgotewotICAgIFVzYWdlQ2F0ZWdvcnlbXSB2YWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0NsYXNzVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RlODJjOS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0NsYXNzVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7DQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDbGFzc1V0aWxzDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihDbGFzc1V0aWxzLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgdHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbG9hZENsYXNzRm9yTmFtZShuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgbG9hZENsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gVHJ5IFdlYkFwcCBDbGFzc0xvYWRlciBmaXJzdA0KLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKG5hbWUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXANCi0gICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gZmFsbGJhY2s6IFRyeSBDbGFzc0xvYWRlciBmb3IgQ2xhc3NVdGlscyAoaS5lLiB0aGUgbXlmYWNlcy5qYXIgbGliKQ0KLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKG5hbWUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXANCi0gICAgICAgICAgICAgICAgQ2xhc3NVdGlscy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIDxUPiBUIHRyeVRvSW5zdGFudGlhdGVDbGFzcyhDbGFzczxUPiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRhcmdldENsYXNzLm5ld0luc3RhbmNlKCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoU3RyaW5nIGNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGluc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKFN0cmluZyBjbGFzc05hbWUpDQotICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXR1cm4gbG9hZENsYXNzRm9yTmFtZShjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SmFyVmVyc2lvbihDbGFzcyB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGNsYXNzRmlsZVBhdGggPSB0YXJnZXRDbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkucmVwbGFjZSgnLicsICcvJykgKyAiLmNsYXNzIjsNCi0gICAgICAgIFN0cmluZyBtYW5pZmVzdEZpbGVQYXRoID0gIi9NRVRBLUlORi9NQU5JRkVTVC5NRiI7DQotDQotICAgICAgICBTdHJpbmcgY2xhc3NMb2NhdGlvbiA9IHRhcmdldENsYXNzLmdldFJlc291cmNlKHRhcmdldENsYXNzLmdldFNpbXBsZU5hbWUoKSArICIuY2xhc3MiKS50b1N0cmluZygpOw0KLSAgICAgICAgU3RyaW5nIG1hbmlmZXN0RmlsZUxvY2F0aW9uID0gY2xhc3NMb2NhdGlvbg0KLSAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIGNsYXNzTG9jYXRpb24uaW5kZXhPZihjbGFzc0ZpbGVQYXRoKSAtIDEpICsgbWFuaWZlc3RGaWxlUGF0aDsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTWFuaWZlc3QobmV3IFVSTChtYW5pZmVzdEZpbGVMb2NhdGlvbikub3BlblN0cmVhbSgpKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldE1haW5BdHRyaWJ1dGVzKCkuZ2V0VmFsdWUoQXR0cmlidXRlcy5OYW1lLklNUExFTUVOVEFUSU9OX1ZFUlNJT04pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORVNULCAiY291bGRuJ3QgbG9hZCB2ZXJzaW9uIG9mIGphciBmaWxlIHdoaWNoIGNvbnRhaW5zICIgKyB0YXJnZXRDbGFzcy5nZXROYW1lKCksIGUpOw0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIHRoZSBwYWNrYWdlIG5hbWUuDQotICAgICAqIE5lZWRlZCBmb3IgQ2xhc3NMb2FkZXJUZXN0U3VpdGUNCi0gICAgICoNCi0gICAgICogQHBhcmFtIHRhcmdldENsYXNzIHRoZSB0aGUgY2xhc3MNCi0gICAgICogQHJldHVybiB0aGUgcGFja2FnZSBuYW1lDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZShDbGFzcyB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgUGFja2FnZSBjdXJyZW50UGFja2FnZSA9IHRhcmdldENsYXNzLmdldFBhY2thZ2UoKTsNCi0NCi0gICAgICAgIGlmKGN1cnJlbnRQYWNrYWdlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRQYWNrYWdlLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0YXJnZXRDbGFzcy5nZXROYW1lKCkuc3Vic3RyaW5nKDAsIHRhcmdldENsYXNzLmdldE5hbWUoKS5sYXN0SW5kZXhPZigiLiIpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0NvbnN0cmFpbnRTb3VyY2VVdGlscy5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Db25zdHJhaW50U291cmNlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU2ZDEyZS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0NvbnN0cmFpbnRTb3VyY2VVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsNCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5Qcm9wZXJ0eVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBDb250YWlucyBoZWxwZXIgbWV0aG9kcyB0aGF0IGRlYWwgd2l0aCBhbm5vdGF0aW9uIHVzYWdlIGluIHRoZSBjb250ZXh0IG9mIEV4dFZhbC4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSByNA0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotcHVibGljIGZpbmFsIGNsYXNzIENvbnN0cmFpbnRTb3VyY2VVdGlscw0KLXsNCi0gICAgcHJvdGVjdGVkIENvbnN0cmFpbnRTb3VyY2VVdGlscygpDQotICAgIHsNCi0gICAgICAgIC8vIFV0aWxpdHkgY2xhc3MsIGRvbid0IGFsbG93IGluc3RhbnRpYXRpb24uDQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eURldGFpbHMgcmVzb2x2ZU1hcHBlZENvbnN0cmFpbnRTb3VyY2VGb3IoU3RyaW5nIG9yaWdpbmFsS2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBvcmlnaW5hbENsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3JpZ2luYWxQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgTWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2UgbWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2UgPSBnZXRDb25zdHJhaW50U291cmNlU3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgaWYgKGlzTWFwcGVkQ29uc3RyYWludFNvdXJjZUNhY2hlZChtYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZSwgb3JpZ2luYWxDbGFzcywgb3JpZ2luYWxQcm9wZXJ0eSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldE1hcHBlZENvbnN0cmFpbnRTb3VyY2UobWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2UsIG9yaWdpbmFsQ2xhc3MsIG9yaWdpbmFsUHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgb3JpZ2luYWxDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3Mob3JpZ2luYWxDbGFzcyk7DQotDQotICAgICAgICBQcm9wZXJ0eVN0b3JhZ2UgcHJvcGVydHlTdG9yYWdlID0gUmVmbGVjdGlvblV0aWxzLmdldFByb3BlcnR5U3RvcmFnZSgpOw0KLSAgICAgICAgQ2xhc3MgbmV3Q2xhc3MgPSBmaW5kTWFwcGVkQ2xhc3MocHJvcGVydHlTdG9yYWdlLCBvcmlnaW5hbENsYXNzLCBvcmlnaW5hbFByb3BlcnR5KTsNCi0NCi0gICAgICAgIC8vbWFwcGVkIHNvdXJjZSBpcyBpZ25vcmVkIHZpYSBASWdub3JlQ29uc3RyYWludFNvdXJjZSBvciB0aGVyZSBpcyBqdXN0IG5vIG1hcHBpbmcgYW5ub3RhdGlvbiBhdCB0aGUgdGFyZ2V0DQotICAgICAgICBpZiAobmV3Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb0NhY2hlTWFwcGVkQ29uc3RyYWludFNvdXJjZU1ldGFEYXRhKA0KLSAgICAgICAgICAgICAgICAgICAgbWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2UsIG9yaWdpbmFsQ2xhc3MsIG9yaWdpbmFsUHJvcGVydHksIG51bGwpOw0KLQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIG5ld1Byb3BlcnR5ID0gZmluZE1hcHBlZFByb3BlcnR5KHByb3BlcnR5U3RvcmFnZSwgb3JpZ2luYWxDbGFzcywgbmV3Q2xhc3MsIG9yaWdpbmFsUHJvcGVydHkpOw0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eURldGFpbHMob3JpZ2luYWxLZXksIG5ld0NsYXNzLCBuZXdQcm9wZXJ0eSk7DQotDQotICAgICAgICB0cnlUb0NhY2hlTWFwcGVkQ29uc3RyYWludFNvdXJjZU1ldGFEYXRhKA0KLSAgICAgICAgICAgICAgICBtYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZSwgb3JpZ2luYWxDbGFzcywgb3JpZ2luYWxQcm9wZXJ0eSwgcmVzdWx0KTsNCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01hcHBlZENvbnN0cmFpbnRTb3VyY2VDYWNoZWQoDQotICAgICAgICAgICAgTWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2Ugc3RvcmFnZSwgQ2xhc3MgYmFzZUJlYW5DbGFzcywgU3RyaW5nIHByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3RvcmFnZS5jb250YWluc01hcHBpbmcoYmFzZUJlYW5DbGFzcywgcHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFByb3BlcnR5RGV0YWlscyBnZXRNYXBwZWRDb25zdHJhaW50U291cmNlKA0KLSAgICAgICAgICAgIE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlIHN0b3JhZ2UsIENsYXNzIGJhc2VCZWFuQ2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN0b3JhZ2UuZ2V0TWFwcGVkQ29uc3RyYWludFNvdXJjZShiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0cnlUb0NhY2hlTWFwcGVkQ29uc3RyYWludFNvdXJjZU1ldGFEYXRhKA0KLSAgICAgICAgICAgIE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlIHN0b3JhZ2UsIENsYXNzIG9yaWdpbmFsQ2xhc3MsIFN0cmluZyBvcmlnaW5hbFByb3BlcnR5LCBQcm9wZXJ0eURldGFpbHMgcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBzdG9yYWdlLnN0b3JlTWFwcGluZyhvcmlnaW5hbENsYXNzLCBvcmlnaW5hbFByb3BlcnR5LCByZXN1bHQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlIGdldENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5nZXRTdG9yYWdlKE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlLmNsYXNzLCBNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGZpbmRNYXBwZWRDbGFzcyhQcm9wZXJ0eVN0b3JhZ2Ugc3RvcmFnZSwgQ2xhc3MgYmFzZUJlYW5DbGFzcywgU3RyaW5nIHByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gY29uc3RyYWludFNvdXJjZUFubm90YXRpb25JbXBsZW1lbnRhdGlvbiA9IEV4dFZhbENvcmVDb25maWd1cmF0aW9uLmdldCgpDQotICAgICAgICAgICAgICAgIC5jb25zdHJhaW50U291cmNlQW5ub3RhdGlvbigpOw0KLQ0KLSAgICAgICAgQW5ub3RhdGlvbiBmb3VuZENvbnN0cmFpbnRTb3VyY2VBbm5vdGF0aW9uID0gdHJ5VG9HZXRBbm5vdGF0aW9uRnJvbVByb3BlcnR5KA0KLSAgICAgICAgICAgICAgICBzdG9yYWdlLCBiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eSwgY29uc3RyYWludFNvdXJjZUFubm90YXRpb25JbXBsZW1lbnRhdGlvbik7DQotDQotICAgICAgICBpZiAoZm91bmRDb25zdHJhaW50U291cmNlQW5ub3RhdGlvbiA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvdW5kQ29uc3RyYWludFNvdXJjZUFubm90YXRpb24gPSB0cnlUb0dldEFubm90YXRpb25Gcm9tRmllbGQoDQotICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLCBiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eSwgY29uc3RyYWludFNvdXJjZUFubm90YXRpb25JbXBsZW1lbnRhdGlvbik7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoZm91bmRDb25zdHJhaW50U291cmNlQW5ub3RhdGlvbiA9PSBudWxsICYmICFpc01hcHBlZENvbnN0cmFpbnRTb3VyY2VJZ25vcmVkKGJhc2VCZWFuQ2xhc3MsIHByb3BlcnR5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3VuZENvbnN0cmFpbnRTb3VyY2VBbm5vdGF0aW9uID0gdHJ5VG9HZXRDb25zdHJhaW50U291cmNlQW5ub3RhdGlvbkZyb21DbGFzcygNCi0gICAgICAgICAgICAgICAgICAgIGJhc2VCZWFuQ2xhc3MsIGNvbnN0cmFpbnRTb3VyY2VBbm5vdGF0aW9uSW1wbGVtZW50YXRpb24pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGZvdW5kQ29uc3RyYWludFNvdXJjZUFubm90YXRpb24gIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gRXh0VmFsQW5ub3RhdGlvblV0aWxzLmV4dHJhY3RWYWx1ZU9mKGZvdW5kQ29uc3RyYWludFNvdXJjZUFubm90YXRpb24sIENsYXNzLmNsYXNzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmaW5kTWFwcGVkUHJvcGVydHkoDQotICAgICAgICAgICAgUHJvcGVydHlTdG9yYWdlIHN0b3JhZ2UsIENsYXNzIGJhc2VCZWFuQ2xhc3MsIENsYXNzIG5ld0Jhc2VCZWFuQ2xhc3MsIFN0cmluZyBvcmlnaW5hbFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBBbm5vdGF0aW9uIHRhcmdldFByb3BlcnR5QW5ub3RhdGlvbiA9IGdldFRhcmdldFByb3BlcnR5TWV0YURhdGEoc3RvcmFnZSwgYmFzZUJlYW5DbGFzcywgb3JpZ2luYWxQcm9wZXJ0eSk7DQotICAgICAgICBpZiAodGFyZ2V0UHJvcGVydHlBbm5vdGF0aW9uICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3ROZXdQcm9wZXJ0eU5hbWUobmV3QmFzZUJlYW5DbGFzcywgdGFyZ2V0UHJvcGVydHlBbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBvcmlnaW5hbFByb3BlcnR5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIEFubm90YXRpb24gZ2V0VGFyZ2V0UHJvcGVydHlNZXRhRGF0YSgNCi0gICAgICAgICAgICBQcm9wZXJ0eVN0b3JhZ2Ugc3RvcmFnZSwgQ2xhc3MgYmFzZUJlYW5DbGFzcywgU3RyaW5nIG9yaWdpbmFsUHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiB0YXJnZXRQcm9wZXJ0eUFubm90YXRpb24gPSBnZXRUYXJnZXRQcm9wZXJ0eUFubm90YXRpb25JbXBsZW1lbnRhdGlvbigpOw0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHRhcmdldFByb3BlcnR5SWRBbm5vdGF0aW9uID0gZ2V0VGFyZ2V0UHJvcGVydHlJZEFubm90YXRpb25JbXBsZW1lbnRhdGlvbigpOw0KLQ0KLSAgICAgICAgQW5ub3RhdGlvbiByZXN1bHQgPSBmaW5kVGFyZ2V0UHJvcGVydHlJZEFubm90YXRpb24oDQotICAgICAgICAgICAgICAgIHN0b3JhZ2UsIGJhc2VCZWFuQ2xhc3MsIG9yaWdpbmFsUHJvcGVydHksIHRhcmdldFByb3BlcnR5SWRBbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBmaW5kVGFyZ2V0UHJvcGVydHlBbm5vdGF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgc3RvcmFnZSwgYmFzZUJlYW5DbGFzcywgb3JpZ2luYWxQcm9wZXJ0eSwgdGFyZ2V0UHJvcGVydHlBbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGdldFRhcmdldFByb3BlcnR5QW5ub3RhdGlvbkltcGxlbWVudGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvcmVDb25maWd1cmF0aW9uLmdldCgpLnRhcmdldFByb3BlcnR5QW5ub3RhdGlvbigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBnZXRUYXJnZXRQcm9wZXJ0eUlkQW5ub3RhdGlvbkltcGxlbWVudGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvcmVDb25maWd1cmF0aW9uLmdldCgpLnRhcmdldFByb3BlcnR5SWRBbm5vdGF0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGV4dHJhY3ROZXdQcm9wZXJ0eU5hbWUoQ2xhc3MgdGFyZ2V0Q2xhc3MsIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGFubm90YXRpb25WYWx1ZSA9IEV4dFZhbEFubm90YXRpb25VdGlscy5leHRyYWN0VmFsdWVPZihhbm5vdGF0aW9uLCBPYmplY3QuY2xhc3MpOw0KLQ0KLSAgICAgICAgLy9AVGFyZ2V0UHJvcGVydHkNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIGFubm90YXRpb25WYWx1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vQFRhcmdldFByb3BlcnR5SWQNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uVmFsdWUgaW5zdGFuY2VvZiBDbGFzcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmluZE5hbWVPZkFubm90YXRlZFByb3BlcnR5KHRhcmdldENsYXNzLCAoQ2xhc3MpIGFubm90YXRpb25WYWx1ZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvL0VYVFZBTC04My91c2UtY2FzZSA1DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmaW5kTmFtZU9mQW5ub3RhdGVkUHJvcGVydHkoDQotICAgICAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MsIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBjdXN0b21UYXJnZXRNYXJrZXJBbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBmb3IgKE1ldGhvZCBjdXJyZW50TWV0aG9kIDogdGFyZ2V0Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGN1cnJlbnRNZXRob2QuaXNBbm5vdGF0aW9uUHJlc2VudChjdXN0b21UYXJnZXRNYXJrZXJBbm5vdGF0aW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0TWV0aG9kVG9Qcm9wZXJ0eU5hbWUoY3VycmVudE1ldGhvZC5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAoRmllbGQgY3VycmVudEZpZWxkIDogdGFyZ2V0Q2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmlzQW5ub3RhdGlvblByZXNlbnQoY3VzdG9tVGFyZ2V0TWFya2VyQW5ub3RhdGlvbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydEZpZWxkVG9Qcm9wZXJ0eU5hbWUoY3VycmVudEZpZWxkLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRNZXRob2RUb1Byb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG5hbWU7DQotDQotICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJpcyIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IG5hbWUuc3Vic3RyaW5nKDIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKCJnZXQiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBuYW1lLnN1YnN0cmluZygzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKHJlc3VsdCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRGaWVsZFRvUHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJfIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDEpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG5hbWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvbiBmaW5kVGFyZ2V0UHJvcGVydHlJZEFubm90YXRpb24oUHJvcGVydHlTdG9yYWdlIHN0b3JhZ2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGJhc2VCZWFuQ2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHRhcmdldFByb3BlcnR5SWRBbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBBbm5vdGF0aW9uIHJlc3VsdCA9IHRyeVRvR2V0QW5ub3RhdGlvbkZyb21Qcm9wZXJ0eSgNCi0gICAgICAgICAgICAgICAgc3RvcmFnZSwgYmFzZUJlYW5DbGFzcywgcHJvcGVydHksIHRhcmdldFByb3BlcnR5SWRBbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSB0cnlUb0dldEFubm90YXRpb25Gcm9tRmllbGQoc3RvcmFnZSwgYmFzZUJlYW5DbGFzcywgcHJvcGVydHksIHRhcmdldFByb3BlcnR5SWRBbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvbiBmaW5kVGFyZ2V0UHJvcGVydHlBbm5vdGF0aW9uKFByb3BlcnR5U3RvcmFnZSBzdG9yYWdlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgYmFzZUJlYW5DbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiB0YXJnZXRQcm9wZXJ0eUFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIEFubm90YXRpb24gcmVzdWx0ID0gdHJ5VG9HZXRBbm5vdGF0aW9uRnJvbVByb3BlcnR5KHN0b3JhZ2UsIGJhc2VCZWFuQ2xhc3MsIHByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eUFubm90YXRpb24pOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHRyeVRvR2V0QW5ub3RhdGlvbkZyb21GaWVsZChzdG9yYWdlLCBiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eSwgdGFyZ2V0UHJvcGVydHlBbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01hcHBlZENvbnN0cmFpbnRTb3VyY2VJZ25vcmVkKENsYXNzIGJhc2VCZWFuQ2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlTdG9yYWdlIHN0b3JhZ2UgPSBSZWZsZWN0aW9uVXRpbHMuZ2V0UHJvcGVydHlTdG9yYWdlKCk7DQotICAgICAgICBNZXRob2QgbWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kT2ZQcm9wZXJ0eShzdG9yYWdlLCBiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eSk7DQotDQotICAgICAgICBpZiAobWV0aG9kICE9IG51bGwgJiYgbWV0aG9kLmlzQW5ub3RhdGlvblByZXNlbnQoZ2V0SWdub3JlQ29uc3RyYWludFNvdXJjZUFubm90YXRpb25JbXBsZW1lbnRhdGlvbigpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZpZWxkIGZpZWxkID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0RmllbGRPZlByb3BlcnR5KHN0b3JhZ2UsIGJhc2VCZWFuQ2xhc3MsIHByb3BlcnR5KTsNCi0NCi0gICAgICAgIGlmIChmaWVsZCAhPSBudWxsICYmIGZpZWxkLmlzQW5ub3RhdGlvblByZXNlbnQoZ2V0SWdub3JlQ29uc3RyYWludFNvdXJjZUFubm90YXRpb25JbXBsZW1lbnRhdGlvbigpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uIHRyeVRvR2V0Q29uc3RyYWludFNvdXJjZUFubm90YXRpb25Gcm9tQ2xhc3MoDQotICAgICAgICAgICAgQ2xhc3MgYmFzZUJlYW5DbGFzcywgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlQmVhbkNsYXNzLmlzQW5ub3RhdGlvblByZXNlbnQoYW5ub3RhdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGJhc2VCZWFuQ2xhc3MuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBnZXRJZ25vcmVDb25zdHJhaW50U291cmNlQW5ub3RhdGlvbkltcGxlbWVudGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvcmVDb25maWd1cmF0aW9uLmdldCgpLmlnbm9yZUNvbnN0cmFpbnRTb3VyY2VBbm5vdGF0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvbiB0cnlUb0dldEFubm90YXRpb25Gcm9tRmllbGQoDQotICAgICAgICAgICAgUHJvcGVydHlTdG9yYWdlIHN0b3JhZ2UsIENsYXNzIGJhc2VCZWFuQ2xhc3MsIFN0cmluZyBwcm9wZXJ0eSwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykNCi0gICAgew0KLSAgICAgICAgRmllbGQgZmllbGQgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRGaWVsZE9mUHJvcGVydHkoc3RvcmFnZSwgYmFzZUJlYW5DbGFzcywgcHJvcGVydHkpOw0KLQ0KLSAgICAgICAgaWYgKGZpZWxkICE9IG51bGwgJiYgZmllbGQuaXNBbm5vdGF0aW9uUHJlc2VudChhbm5vdGF0aW9uQ2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmaWVsZC5nZXRBbm5vdGF0aW9uKGFubm90YXRpb25DbGFzcyk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uIHRyeVRvR2V0QW5ub3RhdGlvbkZyb21Qcm9wZXJ0eShQcm9wZXJ0eVN0b3JhZ2Ugc3RvcmFnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgYmFzZUJlYW5DbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzKQ0KLSAgICB7DQotICAgICAgICBNZXRob2QgbWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kT2ZQcm9wZXJ0eShzdG9yYWdlLCBiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eSk7DQotDQotICAgICAgICBpZiAobWV0aG9kICE9IG51bGwgJiYgbWV0aG9kLmlzQW5ub3RhdGlvblByZXNlbnQoYW5ub3RhdGlvbkNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmdldEFubm90YXRpb24oYW5ub3RhdGlvbkNsYXNzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRGVmYXVsdFByb2plY3ROYW1lLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0RlZmF1bHRQcm9qZWN0TmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmQ2Mzk5Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRGVmYXVsdFByb2plY3ROYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuUHJvamVjdFN0YWdlTmFtZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRGVmYXVsdFByb2plY3ROYW1lIGltcGxlbWVudHMgUHJvamVjdFN0YWdlTmFtZQ0KLXsNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsNCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQ0KLSAgICBwcml2YXRlIERlZmF1bHRQcm9qZWN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmFtZSA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBEZWZhdWx0UHJvamVjdE5hbWUoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7DQotICAgIH0NCi0NCi0gICAgc3RhdGljIFByb2plY3RTdGFnZU5hbWUgY3JlYXRlUHJvamVjdFN0YWdlTmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UHJvamVjdE5hbWUobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICBpZiAodGhpcyA9PSBvKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIERlZmF1bHRQcm9qZWN0TmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRGVmYXVsdFByb2plY3ROYW1lIHRoYXQgPSAoRGVmYXVsdFByb2plY3ROYW1lKSBvOw0KLQ0KLSAgICAgICAgaWYgKCFuYW1lLmVxdWFscyh0aGF0Lm5hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5hbWUuaGFzaENvZGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbEFubm90YXRpb25VdGlscy5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxBbm5vdGF0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEzYTAyOC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbEFubm90YXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5Qcm9wZXJ0eVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi0NCi0vKioNCi0gKiBDb250YWlucyBoZWxwZXIgbWV0aG9kcyB3aGljaCBhcmUgZGVhbGluZyB3aXRoIGdlbmVyYWwgdGFza3MgbGlrZWQgdG8gYW5ub3RhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHI0DQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1AU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi1wdWJsaWMgY2xhc3MgRXh0VmFsQW5ub3RhdGlvblV0aWxzDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihFeHRWYWxBbm5vdGF0aW9uVXRpbHMuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgLyoqDQotICAgICAqIEV4dHJhY3RzIGFsbCBhbm5vdGF0aW9ucyBmb3VuZCBvbiBhIHByb3BlcnR5LiBJdCBsb29rcyBmb3IgdGhlbSBvbiBnZXR0ZXIgbWV0aG9kLCB0aGUgZmllbGQgYW5kIGFsbCBnZXR0ZXJzDQotICAgICAqIHRoYXQgYXJlIGRlZmluZWQgaW4gaW50ZXJmYWNlcy4gVGhlIG5hbWUgb2YgdGhlIHRhcmdldCBwcm9wZXJ0eSBpcyBwcm92aWRlZCBieSB0aGUgcHJvcGVydHlEZXRhaWxzIHBhcmFtZXRlci4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIGVudGl0eUNsYXNzIHRhcmdldCBjbGFzcyB3aGljaCBoYXMgdG8gYmUgc2Nhbm5lZA0KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlEZXRhaWxzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9wZXJ0eQ0KLSAgICAgKiBAcmV0dXJuIGEgZGF0YXN0cnVjdHVyZSB3aGljaCBjb250YWlucyBhbGwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhcmdldC1wcm9wZXJ0eQ0KLSAgICAgKi8NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5ISUdILCBkZXNjcmlwdGlvbiA9ICJhZGQgY2FjaGUiKQ0KLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5SW5mb3JtYXRpb24gZXh0cmFjdEFubm90YXRpb25zKENsYXNzIGVudGl0eUNsYXNzLCBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsNCi0gICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uc2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsNCi0NCi0gICAgICAgIFByb3BlcnR5U3RvcmFnZSBzdG9yYWdlID0gUmVmbGVjdGlvblV0aWxzLmdldFByb3BlcnR5U3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgd2hpbGUgKCFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhlbnRpdHlDbGFzcy5nZXROYW1lKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoc3RvcmFnZSwgZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgICAgICBhZGRGaWVsZEFjY2Vzc0Fubm90YXRpb25zKHN0b3JhZ2UsIGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgICAgICAgICAgcHJvY2Vzc0ludGVyZmFjZXMoc3RvcmFnZSwgZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscywgcHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgICAgICAgICAgZW50aXR5Q2xhc3MgPSBlbnRpdHlDbGFzcy5nZXRTdXBlcmNsYXNzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogRXh0cmFjdHMgYWxsIGFubm90YXRpb25zIGZvdW5kIGF0IHRoZSBnZXR0ZXIgbWV0aG9kIG9mIGEgcHJvcGVydHkuDQotICAgICAqIFRoZSBhbm5vdGF0aW9ucyBhcmUgYWRkZWQgdG8gdGhlIGdpdmVuIHByb3BlcnR5SW5mb3JtYXRpb24gcGFyYW1ldGVyLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gc3RvcmFnZSB7QGxpbmsgUHJvcGVydHlTdG9yYWdlfSB3aGljaCBpcyBhYmxlIHRvIGNhY2hlIGluZm9ybWF0aW9uIG9mIGEgcHJvcGVydHkNCi0gICAgICogQHBhcmFtIGVudGl0eSB0YXJnZXQgY2xhc3Mgd2hpY2ggaGFzIHRvIGJlIHNjYW5uZWQNCi0gICAgICogQHBhcmFtIHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5IHdlIGFyZSBpbnRlcmVzdGVkIGluLg0KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlJbmZvcm1hdGlvbiBXaGVyZSB0aGUgTWV0YURhdGFFbnRyaWVzIGZvciB0aGUgYW5ub3RhdGlvbnMgYXJlIGFkZGVkLg0KLSAgICAgKi8NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5ISUdILCBkZXNjcmlwdGlvbiA9ICJhZGQgY2FjaGUiKQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhQcm9wZXJ0eVN0b3JhZ2Ugc3RvcmFnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgZW50aXR5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZE9mUHJvcGVydHkoc3RvcmFnZSwgZW50aXR5LCBwcm9wZXJ0eSk7DQotDQotICAgICAgICBpZihtZXRob2QgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRBbm5vdGF0aW9uVG9Bbm5vdGF0aW9uRW50cmllcyhBcnJheXMuYXNMaXN0KG1ldGhvZC5nZXRBbm5vdGF0aW9ucygpKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEV4dHJhY3RzIGFsbCBhbm5vdGF0aW9ucyBmb3VuZCBhdCB0aGUgZmllbGQgb2YgdGhlIHByb3BlcnR5Lg0KLSAgICAgKiBBIGZpZWxkIG5hbWUgd2l0aCBhIF8gKHVuZGVyc2NvcmUpIGFzIHByZWZpeCBpcyBhbHNvIHN1cHBvcnRlZC4NCi0gICAgICogVGhlIGFubm90YXRpb25zIGFyZSBhZGRlZCB0byB0aGUgZ2l2ZW4gcHJvcGVydHlJbmZvcm1hdGlvbiBwYXJhbWV0ZXIuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBzdG9yYWdlIHtAbGluayBQcm9wZXJ0eVN0b3JhZ2V9IHdoaWNoIGlzIGFibGUgdG8gY2FjaGUgaW5mb3JtYXRpb24gb2YgYSBwcm9wZXJ0eQ0KLSAgICAgKiBAcGFyYW0gZW50aXR5IHRhcmdldCBjbGFzcyB3aGljaCBoYXMgdG8gYmUgc2Nhbm5lZA0KLSAgICAgKiBAcGFyYW0gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkgd2UgYXJlIGludGVyZXN0ZWQgaW4uDQotICAgICAqIEBwYXJhbSBwcm9wZXJ0eUluZm9ybWF0aW9uIFdoZXJlIHRoZSBNZXRhRGF0YUVudHJpZXMgZm9yIHRoZSBhbm5vdGF0aW9ucyBhcmUgYWRkZWQuDQotICAgICAqLw0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkhJR0gsIGRlc2NyaXB0aW9uID0gImFkZCBjYWNoZSIpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGaWVsZEFjY2Vzc0Fubm90YXRpb25zKFByb3BlcnR5U3RvcmFnZSBzdG9yYWdlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBlbnRpdHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBGaWVsZCBmaWVsZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldEZpZWxkT2ZQcm9wZXJ0eShzdG9yYWdlLCBlbnRpdHksIHByb3BlcnR5KTsNCi0NCi0gICAgICAgIGlmKGZpZWxkICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoQXJyYXlzLmFzTGlzdChmaWVsZC5nZXRBbm5vdGF0aW9ucygpKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzSW50ZXJmYWNlcyhQcm9wZXJ0eVN0b3JhZ2Ugc3RvcmFnZSwgQ2xhc3MgY3VycmVudENsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBmb3IgKENsYXNzIGN1cnJlbnRJbnRlcmZhY2UgOiBjdXJyZW50Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoc3RvcmFnZSwgY3VycmVudEludGVyZmFjZSwgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgICAgIHByb2Nlc3NJbnRlcmZhY2VzKHN0b3JhZ2UsIGN1cnJlbnRJbnRlcmZhY2UsIHByb3BlcnR5RGV0YWlscywgcHJvcGVydHlJbmZvcm1hdGlvbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRBbm5vdGF0aW9uVG9Bbm5vdGF0aW9uRW50cmllcyhMaXN0PEFubm90YXRpb24+IGFubm90YXRpb25zLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLmFkZE1ldGFEYXRhRW50cnkoY3JlYXRlTWV0YURhdGFFbnRyeUZvckFubm90YXRpb24oYW5ub3RhdGlvbikpOw0KLQ0KLSAgICAgICAgICAgIExPR0dFUi5maW5lc3QoYW5ub3RhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZm91bmQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRhRGF0YUVudHJ5IGNyZWF0ZU1ldGFEYXRhRW50cnlGb3JBbm5vdGF0aW9uKEFubm90YXRpb24gZm91bmRBbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUVudHJ5IGVudHJ5ID0gbmV3IE1ldGFEYXRhRW50cnkoKTsNCi0NCi0gICAgICAgIGVudHJ5LnNldEtleShmb3VuZEFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgZW50cnkuc2V0VmFsdWUoZm91bmRBbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgIHJldHVybiBlbnRyeTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogRXh0cmFjdHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBhbm5vdGF0aW9uLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgdGFyZ2V0IGFubm90YXRpb24NCi0gICAgICogQHBhcmFtIHRhcmdldENsYXNzIFR5cGUgb2YgdGhlIHZhbHVlLXByb3BlcnR5DQotICAgICAqIEBwYXJhbSA8VD4gUmVzdWx0IGNsYXNzDQotICAgICAqIEByZXR1cm4gdmFsdWUgb2YgdGhlIHZhbHVlLXByb3BlcnR5DQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGV4dHJhY3RWYWx1ZU9mKEFubm90YXRpb24gYW5ub3RhdGlvbiwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIC8vIFNpbmNlIHdlIGNhbid0IGJlIHN1cmUgb2YgdGhlIHR5cGUsIHdlIGNhbid0IHVzZSB0aGUNCi0gICAgICAgIC8vIGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKS5nZXREZWNsYXJlZE1ldGhvZChTdHJpbmcsIENsYXNzLi4uKSBtZXRob2QuDQotICAgICAgICBmb3IgKE1ldGhvZCBhbm5vdGF0aW9uTWV0aG9kIDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldERlY2xhcmVkTWV0aG9kcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICgidmFsdWUiLmVxdWFscyhhbm5vdGF0aW9uTWV0aG9kLmdldE5hbWUoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChUKSBhbm5vdGF0aW9uTWV0aG9kLmludm9rZShhbm5vdGF0aW9uKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxVdGlscy5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGQyMzAwLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvcmVDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5WYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Qcm9qZWN0U3RhZ2VOYW1lOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5BYnN0cmFjdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5OYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5GYWNlc01lc3NhZ2VTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsVXRpbHMNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEV4dFZhbFV0aWxzLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19SRVFVSVJFRCA9ICJqYXZheC5mYWNlcy5jb21wb25lbnQuVUlJbnB1dC5SRVFVSVJFRCI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19SRVFVSVJFRF9ERVRBSUwgPSAiamF2YXguZmFjZXMuY29tcG9uZW50LlVJSW5wdXQuUkVRVUlSRURfZGV0YWlsIjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX01BWElNVU0gPSAiamF2YXguZmFjZXMudmFsaWRhdG9yLkxlbmd0aFZhbGlkYXRvci5NQVhJTVVNIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX01BWElNVU1fREVUQUlMID0gImphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3IuTUFYSU1VTV9kZXRhaWwiOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKENsYXNzTWFwcGluZ0ZhY3Rvcnk8U3RyaW5nLCBWYWxpZGF0aW9uU3RyYXRlZ3k+KSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlKG1ldGFEYXRhS2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICBOYW1lTWFwcGVyPFN0cmluZz4gbWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAucmVnaXN0ZXIobWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVyZWdpc3RlcihtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVueU1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlbnkobWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1ldGFEYXRhVHJhbnNmb3JtZXI+KSBFeHRWYWxDb250ZXh0DQotICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAucmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlcmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZXJlZ2lzdGVyKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbnlWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZW55KHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksIENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JXaXRoKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlV2l0aChwcm9wZXJ0aWVzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50V2l0aE1ldGFEYXRhKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgZm9yIChDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldENvbXBvbmVudEluaXRpYWxpemVycygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyLmNvbmZpZ3VyZUNvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7DQotDQotICAgICAgICBpZiAobWV0YURhdGFFbnRyeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGFEYXRhRW50cnkgPSBuZXcgTWV0YURhdGFFbnRyeSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZm9yIChWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIDogRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIXZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5hZnRlclRocm93aW5nKA0KLSAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uLCB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3IoZmluYWwgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcmVhdGVJbnRlcmNlcHRlZE1ldGFEYXRhRXh0cmFjdG9yV2l0aChtZXRhRGF0YUV4dHJhY3RvciwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGVJbnRlcmNlcHRlZE1ldGFEYXRhRXh0cmFjdG9yRm9yKA0KLSAgICAgICAgICAgIGZpbmFsIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yLCBDbGFzcyBtb2R1bGVLZXkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgaWYobW9kdWxlS2V5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCksIG1vZHVsZUtleSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvcldpdGgobWV0YURhdGFFeHRyYWN0b3IsIHByb3BlcnRpZXMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvcldpdGgoDQotICAgICAgICAgICAgZmluYWwgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IsIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBNZXRhRGF0YUV4dHJhY3RvcigpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHVibGljIFByb3BlcnR5SW5mb3JtYXRpb24gZXh0cmFjdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBPYmplY3Qgb2JqZWN0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiByZXN1bHQgPSBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgb2JqZWN0KTsNCi0NCi0gICAgICAgICAgICAgICAgYWRkUHJvcGVydGllcyhyZXN1bHQsIHByb3BlcnRpZXMpOw0KLSAgICAgICAgICAgICAgICBpbnZva2VNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMocmVzdWx0LCBwcm9wZXJ0aWVzKTsNCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkUHJvcGVydGllcyhQcm9wZXJ0eUluZm9ybWF0aW9uIHJlc3VsdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICBpZihwcm9wZXJ0aWVzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjdXN0b21Qcm9wZXJ0aWVzID0gZ2V0Q3VzdG9tUHJvcGVydGllcyhyZXN1bHQpOw0KLSAgICAgICAgICAgIGN1c3RvbVByb3BlcnRpZXMucHV0QWxsKHByb3BlcnRpZXMpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0Q3VzdG9tUHJvcGVydGllcyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKCFwcm9wZXJ0eUluZm9ybWF0aW9uLmNvbnRhaW5zSW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuQ1VTVE9NX1BST1BFUlRJRVMpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uc2V0SW5mb3JtYXRpb24oDQotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5DVVNUT01fUFJPUEVSVElFUywgbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChNYXA8U3RyaW5nLCBPYmplY3Q+KSBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkNVU1RPTV9QUk9QRVJUSUVTKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGludm9rZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyhQcm9wZXJ0eUluZm9ybWF0aW9uIHJlc3VsdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICBmb3IgKE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIDoNCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzV2l0aChwcm9wZXJ0aWVzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5hZnRlckV4dHJhY3RpbmcocmVzdWx0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VSZXNvbHZlciBnZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1lc3NhZ2VSZXNvbHZlcj4pIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLnJlZ2lzdGVyKHZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVyZWdpc3Rlcih2YWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbnlWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IHZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlbnkodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRUxIZWxwZXIgZ2V0RUxIZWxwZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5FTF9IRUxQRVJfRkFDVE9SWSwgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuY2xhc3MpLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjZXNNZXNzYWdlIGNyZWF0ZUZhY2VzTWVzc2FnZShTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZUZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBGYWNlc01lc3NhZ2UgY3JlYXRlRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkZBQ0VTX01FU1NBR0VfRkFDVE9SWSwgRmFjZXNNZXNzYWdlRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZShzZXZlcml0eSwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY2VzTWVzc2FnZSBjb252ZXJ0RmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkZBQ0VTX01FU1NBR0VfRkFDVE9SWSwgRmFjZXNNZXNzYWdlRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNvbnZlcnQoZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5RGV0YWlscyBjcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldEV4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBiYXNlT2JqZWN0Ow0KLSAgICAgICAgaWYgKGdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKHRhcmdldEV4cHJlc3Npb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmJlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgU3RyaW5nIGV4cHJlc3Npb24gPSB2YmUuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgICAgIGJhc2VPYmplY3QgPSBnZXRFTEhlbHBlcigpLmdldFZhbHVlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgdmJlLmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlEZXRhaWxzKA0KLSAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5zdWJzdHJpbmcoMiwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpLCBiYXNlT2JqZWN0LCB2YmUuZ2V0UHJvcGVydHkoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgb3JpZ2luYWwgPSBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KA0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgU3RyaW5nIG5ld0Jhc2VLZXkgPSBvcmlnaW5hbC5nZXRLZXkoKS5zdWJzdHJpbmcoMCwgb3JpZ2luYWwuZ2V0S2V5KCkubGFzdEluZGV4T2YoIi4iKSArIDEpOw0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IG5ld0Jhc2VLZXkgKyB0YXJnZXRFeHByZXNzaW9uOw0KLQ0KLSAgICAgICAgYmFzZU9iamVjdCA9IFJlZmxlY3Rpb25VdGlscy5nZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKG9yaWdpbmFsLmdldEJhc2VPYmplY3QoKSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICAgICAgbmV3S2V5LCBiYXNlT2JqZWN0LCB0YXJnZXRFeHByZXNzaW9uLnN1YnN0cmluZyh0YXJnZXRFeHByZXNzaW9uLmxhc3RJbmRleE9mKCIuIikgKyAxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEV4cHJlc3Npb24ubGVuZ3RoKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBAVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9QbGFjZUxhYmVsKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIFN0cmluZyBsYWJlbCwgaW50IGluZGV4KQ0KLSAgICB7DQotICAgICAgICBpZiAoZmFjZXNNZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsICYmIGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkuY29udGFpbnMoInsiICsgaW5kZXggKyAifSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkucmVwbGFjZSgieyIgKyBpbmRleCArICJ9IiwgbGFiZWwpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkuY29udGFpbnMoInsiICsgaW5kZXggKyAifSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNNZXNzYWdlLmdldERldGFpbCgpLnJlcGxhY2UoInsiICsgaW5kZXggKyAifSIsIGxhYmVsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VXaXRoRGVmYXVsdE1heGltdW1NZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIGludCBtYXhMZW5ndGgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZSA9IEpzZlV0aWxzLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKEpBVkFYX0ZBQ0VTX01BWElNVU0pOw0KLSAgICAgICAgU3RyaW5nIGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsID0gZmFjZXNSZXF1aXJlZE1lc3NhZ2U7DQotDQotICAgICAgICAvL3VzZSB0cnkvY2F0Y2ggZm9yIGVhc2llciBzeW5jIGJldHdlZW4gdHJ1bmsvYnJhbmNoDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoSnNmVXRpbHMuZ2V0TWVzc2FnZUZyb21BcHBsaWNhdGlvbk1lc3NhZ2VCdW5kbGUoSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IEpzZlV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKEpBVkFYX0ZBQ0VTX01BWElNVU1fREVUQUlMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2pzZiAxLjIgZG9lc24ndCBoYXZlIGEgZGV0YWlsIG1lc3NhZ2UNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZhY2VzUmVxdWlyZWRNZXNzYWdlID0gZmFjZXNSZXF1aXJlZE1lc3NhZ2UucmVwbGFjZSgiezB9IiwgIiIgKyBtYXhMZW5ndGgpOw0KLSAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbC5yZXBsYWNlKCJ7MH0iLCAiIiArIG1heExlbmd0aCk7DQotDQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc1JlcXVpcmVkTWVzc2FnZSk7DQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBAVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZSA9IEpzZlV0aWxzLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKEpBVkFYX0ZBQ0VTX1JFUVVJUkVEKTsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlOw0KLQ0KLSAgICAgICAgLy91c2UgdHJ5L2NhdGNoIGZvciBlYXNpZXIgc3luYyBiZXR3ZWVuIHRydW5rL2JyYW5jaA0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKEpzZlV0aWxzLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKEpBVkFYX0ZBQ0VTX1JFUVVJUkVEX0RFVEFJTCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsID0gSnNmVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZUZyb21BcHBsaWNhdGlvbk1lc3NhZ2VCdW5kbGUoSkFWQVhfRkFDRVNfUkVRVUlSRURfREVUQUlMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2pzZiAxLjIgZG9lc24ndCBoYXZlIGEgZGV0YWlsIG1lc3NhZ2UNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGZhY2VzUmVxdWlyZWRNZXNzYWdlKTsNCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NraXBhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBmb3IgKENsYXNzIGN1cnJlbnRDbGFzcyA6IGdldFNraXBWYWxpZGF0aW9uU3VwcG9ydENsYXNzTGlzdCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChpc1NraXBWYWxpZGF0aW9uU3VwcG9ydGVkKGN1cnJlbnRDbGFzcywgdGFyZ2V0Q2xhc3MpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9jZXNzTWV0YURhdGFFbnRyeUFmdGVyU2tpcFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdGFyZ2V0Q2xhc3MsIE1ldGFEYXRhRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBpc1NraXBhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KHRhcmdldENsYXNzKSAmJg0KLSAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlNLSVBfVkFMSURBVElPTiwgQm9vbGVhbi5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxDbGFzcz4gZ2V0U2tpcFZhbGlkYXRpb25TdXBwb3J0Q2xhc3NMaXN0KCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gc3RhdGljQ29uZmlndXJhdGlvbkxpc3QgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0U3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuU0tJUF9WQUxJREFUSU9OX1NVUFBPUlRfQ09ORklHKTsNCi0NCi0gICAgICAgIExpc3Q8Q2xhc3M+IG1hcmtlckxpc3QgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLQ0KLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzOw0KLSAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBjdXJyZW50RW50cnkgOiBzdGF0aWNDb25maWd1cmF0aW9uTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gY3VycmVudENvbmZpZ3VyYXRpb25FbnRyeSA6IGN1cnJlbnRFbnRyeS5nZXRNYXBwaW5nKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShjdXJyZW50Q29uZmlndXJhdGlvbkVudHJ5LmdldFRhcmdldCgpKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDbGFzcyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBtYXJrZXJMaXN0LmFkZChjdXJyZW50Q2xhc3MpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgTE9HR0VSLndhcm5pbmcoImNvbmZpZ3VyYXRpb24gZW50cnkgcHJvdmlkZXMgYW4gaW52YWxpZCBlbnRyeTogIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGN1cnJlbnRDb25maWd1cmF0aW9uRW50cnkuZ2V0VGFyZ2V0KCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG1hcmtlckxpc3Q7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2tpcFZhbGlkYXRpb25TdXBwb3J0ZWQoQ2xhc3MgY3VycmVudENsYXNzLCBDbGFzcyB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYgKGN1cnJlbnRDbGFzcy5pc0Fubm90YXRpb24oKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodGFyZ2V0Q2xhc3MuaXNBbm5vdGF0aW9uUHJlc2VudChjdXJyZW50Q2xhc3MpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChjdXJyZW50Q2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0YXJnZXRDbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGdldFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKQ0KLSAgICB7DQotICAgICAgICBpZihpc1ZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0aW9uRGVhY3RpdmF0ZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKSB7DQotDQotICAgICAgICAgICAgICAgIHB1YmxpYyBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+KCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIExpc3Q8T2JqZWN0PiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHB1YmxpYyA8VD4gTGlzdDxUPiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSwgQ2xhc3M8VD4gdmFsdWVUeXBlKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxUPigpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHB1YmxpYyA8VD4gVCBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSwgQ2xhc3M8VD4gdmFsdWVUeXBlLCBDbGFzcyB2YWx1ZUlkKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH07DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpLmdldEZhY3RvcnkoDQotICAgICAgICAgICAgICAgIEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWSwgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihDbGFzcyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgICBDbGFzc01hcHBpbmdGYWN0b3J5PENsYXNzLCBDbGFzcz4gdmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnkgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1BBUkFNRVRFUl9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeS5jcmVhdGUoc291cmNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rpb25EZWFjdGl2YXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb3JlQ29uZmlndXJhdGlvbi5nZXQoKS5kZWFjdGl2YXRlVmFsaWRhdGlvblBhcmFtZXRlcnMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXhlY3V0ZUxvY2FsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5S2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcHJvcGVydGllcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPSBnZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkuZXh0cmFjdCgNCi0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbiwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKTsNCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsNCi0NCi0gICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KHByb3BlcnR5S2V5LCBwcm9wZXJ0aWVzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHByb3BlcnR5TWFwLnB1dChBbm5vdGF0aW9uLmNsYXNzLmdldE5hbWUoKSwgYW5ub3RhdGlvbik7DQotDQotICAgICAgICBmb3IgKFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIDogcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3INCi0gICAgICAgICAgICAgICAgICAgIC5iZWZvcmVWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlNYXApKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZXhlY3V0ZUxvY2FsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlLZXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHByb3BlcnRpZXMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPSBnZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkuZXh0cmFjdCgNCi0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbiwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KHByb3BlcnR5S2V5LCBwcm9wZXJ0aWVzKTsNCi0gICAgICAgICAgICBwcm9wZXJ0eU1hcC5wdXQoQW5ub3RhdGlvbi5jbGFzcy5nZXROYW1lKCksIGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZm9yIChQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA6IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5hZnRlclZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eU1hcCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImlzIHJlbmFtaW5nIG9rPyIpDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGVjdXRlR2xvYmFsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5S2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHByb3BlcnRpZXMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBtb2R1bGVLZXkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydHlNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsNCi0NCi0gICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KHByb3BlcnR5S2V5LCBwcm9wZXJ0aWVzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycyA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc0Zvcihtb2R1bGVLZXkpOw0KLQ0KLSAgICAgICAgZm9yIChQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA6IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIXByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgICAgICAgICAgICAgICAgICAuYmVmb3JlVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHByb3BlcnR5TWFwKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImlzIHJlbmFtaW5nIG9rPyIpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBleGVjdXRlR2xvYmFsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlLZXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwcm9wZXJ0aWVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBtb2R1bGVLZXkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydHlNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KHByb3BlcnR5S2V5LCBwcm9wZXJ0aWVzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycyA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc0Zvcihtb2R1bGVLZXkpOw0KLQ0KLSAgICAgICAgZm9yIChQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA6IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5hZnRlclZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eU1hcCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyA8VD4gVCBnZXRTdG9yYWdlKENsYXNzPFQ+IHN0b3JhZ2VUeXBlLCBTdHJpbmcgc3RvcmFnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIFQgc3RvcmFnZSA9IGdldENhY2hlZFN0b3JhZ2Uoc3RvcmFnZVR5cGUsIHN0b3JhZ2VOYW1lKTsNCi0NCi0gICAgICAgIGlmKHN0b3JhZ2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gc3RvcmFnZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHN0b3JhZ2UgPSAoVCkgZ2V0U3RvcmFnZU1hbmFnZXJGYWN0b3J5KCkuY3JlYXRlKHN0b3JhZ2VUeXBlKS5jcmVhdGUoc3RvcmFnZU5hbWUpOw0KLQ0KLSAgICAgICAgY2FjaGVTdG9yYWdlRm9yUmVxdWVzdChzdG9yYWdlVHlwZSwgc3RvcmFnZU5hbWUsIHN0b3JhZ2UpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHN0b3JhZ2U7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IFQgZ2V0Q2FjaGVkU3RvcmFnZShDbGFzczxUPiBzdG9yYWdlVHlwZSwgU3RyaW5nIHN0b3JhZ2VOYW1lKQ0KLSAgICB7DQotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7DQotDQotICAgICAgICBTdHJpbmcga2V5ID0gY3JlYXRlU3RvcmFnZUtleShzdG9yYWdlVHlwZS5nZXROYW1lKCksIHN0b3JhZ2VOYW1lKTsNCi0gICAgICAgIHJldHVybiAoVClyZXF1ZXN0TWFwLmdldChrZXkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIDxUPiB2b2lkIGNhY2hlU3RvcmFnZUZvclJlcXVlc3QoQ2xhc3M8VD4gc3RvcmFnZVR5cGUsIFN0cmluZyBzdG9yYWdlTmFtZSwgVCBzdG9yYWdlKQ0KLSAgICB7DQotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7DQotDQotICAgICAgICBTdHJpbmcga2V5ID0gY3JlYXRlU3RvcmFnZUtleShzdG9yYWdlVHlwZS5nZXROYW1lKCksIHN0b3JhZ2VOYW1lKTsNCi0gICAgICAgIHJlcXVlc3RNYXAucHV0KGtleSwgc3RvcmFnZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNyZWF0ZVN0b3JhZ2VLZXkoU3RyaW5nIHN0b3JhZ2VUeXBlLCBTdHJpbmcgc3RvcmFnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZ0J1aWxkZXIga2V5ID0gbmV3IFN0cmluZ0J1aWxkZXIoImNhY2hlZFN0b3JhZ2U6Iik7DQotICAgICAgICBrZXkuYXBwZW5kKHN0b3JhZ2VUeXBlKTsNCi0gICAgICAgIGtleS5hcHBlbmQoIjoiKTsNCi0gICAgICAgIGtleS5hcHBlbmQoc3RvcmFnZU5hbWUpOw0KLSAgICAgICAgcmV0dXJuIGtleS50b1N0cmluZygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldFN0b3JhZ2UoQ2xhc3Mgc3RvcmFnZVR5cGUsIFN0cmluZyBzdG9yYWdlTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmVzZXRDYWNoZWRTdG9yYWdlKHN0b3JhZ2VUeXBlLmdldE5hbWUoKSwgc3RvcmFnZU5hbWUpOw0KLQ0KLSAgICAgICAgZ2V0U3RvcmFnZU1hbmFnZXJGYWN0b3J5KCkuY3JlYXRlKHN0b3JhZ2VUeXBlKS5yZXNldChzdG9yYWdlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZXNldENhY2hlZFN0b3JhZ2UoU3RyaW5nIHN0b3JhZ2VUeXBlLCBTdHJpbmcgc3RvcmFnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBrZXkgPSBjcmVhdGVTdG9yYWdlS2V5KHN0b3JhZ2VUeXBlLCBzdG9yYWdlTmFtZSk7DQotDQotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7DQotICAgICAgICByZXF1ZXN0TWFwLnB1dChrZXksIG51bGwpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIENsYXNzTWFwcGluZ0ZhY3Rvcnk8Q2xhc3MsIFN0b3JhZ2VNYW5hZ2VyPiBnZXRTdG9yYWdlTWFuYWdlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFRyYW5zZm9ybWVkTWV0YURhdGEoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRUcmFuc2Zvcm1lZE1ldGFEYXRhRm9yKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRUcmFuc2Zvcm1lZE1ldGFEYXRhRm9yKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBDbGFzcyBtb2R1bGVLZXkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgaWYobW9kdWxlS2V5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCksIG1vZHVsZUtleSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZ2V0VHJhbnNmb3JtZWRNZXRhRGF0YVdpdGgoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgcHJvcGVydGllcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFRyYW5zZm9ybWVkTWV0YURhdGFGb3IoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uLCBDbGFzcyBtb2R1bGVLZXkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgaWYgKG1vZHVsZUtleSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpLCBtb2R1bGVLZXkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGdldFRyYW5zZm9ybWVkTWV0YURhdGFXaXRoKGZhY2VzQ29udGV4dCwgcHJvcGVydHlJbmZvcm1hdGlvbiwgcHJvcGVydGllcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFRyYW5zZm9ybWVkTWV0YURhdGFXaXRoKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotICAgICAgICBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvciBza2lwVmFsaWRhdGlvbkV2YWx1YXRvciA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKCk7DQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yV2l0aChwcm9wZXJ0aWVzKTsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGE7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhUmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGFEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gdHJhbnNmb3JtTWV0YURhdGEoDQotICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblN0cmF0ZWd5LCBza2lwVmFsaWRhdGlvbkV2YWx1YXRvciwgbWV0YURhdGEsIGVudHJ5KTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKCFpc0NvbXBvbmVudEluaXRpYWxpemF0aW9uU2tpcHBlZChtZXRhRGF0YSwgZW50cnksIHZhbGlkYXRpb25TdHJhdGVneSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vZG9uJ3QgYnJlYWsgbWF5YmUgdGhlcmUgYXJlIGNvbnN0cmFpbnRzIHdoaWNoIGRvbid0IHN1cHBvcnQgdGhlIHNraXAtbWVjaGFuaXNtDQotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YVJlc3VsdC5wdXRBbGwobWV0YURhdGEpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhUmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRUcmFuc2Zvcm1lZE1ldGFEYXRhV2l0aChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLQ0KLSAgICAgICAgLy8gVGhpcyBpcyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgTWV0YURhdGEgZXh0cmFjdGlvbiBpbiB0aGUgZGVmYXVsdCBwcm9jZXNzLiANCi0gICAgICAgIC8vIFNvIHdlIG5lZWQgdG8gZG8gaXQgaGVyZSBhbHNvIGJlZm9yZSB0aGUgdHJhbnNmb3JtYXRpb25zIGFyZSBydW4uDQotICAgICAgICBmb3IgKE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIDoNCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzV2l0aChwcm9wZXJ0aWVzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5hZnRlckV4dHJhY3RpbmcocHJvcGVydHlJbmZvcm1hdGlvbik7DQotICAgICAgICB9DQotDQotICAgICAgICBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvciBza2lwVmFsaWRhdGlvbkV2YWx1YXRvciA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKCk7DQotDQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhOw0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YVJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogcHJvcGVydHlJbmZvcm1hdGlvbi5nZXRNZXRhRGF0YUVudHJpZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IGdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKGVudHJ5LmdldEtleSgpKTsNCi0NCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IHRyYW5zZm9ybU1ldGFEYXRhKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgbnVsbCwgdmFsaWRhdGlvblN0cmF0ZWd5LCBza2lwVmFsaWRhdGlvbkV2YWx1YXRvciwgbWV0YURhdGEsIGVudHJ5KTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKCFpc0NvbXBvbmVudEluaXRpYWxpemF0aW9uU2tpcHBlZChtZXRhRGF0YSwgZW50cnksIHZhbGlkYXRpb25TdHJhdGVneSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vZG9uJ3QgYnJlYWsgbWF5YmUgdGhlcmUgYXJlIGNvbnN0cmFpbnRzIHdoaWNoIGRvbid0IHN1cHBvcnQgdGhlIHNraXAtbWVjaGFuaXNtDQotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YVJlc3VsdC5wdXRBbGwobWV0YURhdGEpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhUmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvciBza2lwVmFsaWRhdGlvbkV2YWx1YXRvciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhLCBNZXRhRGF0YUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZiAoIXNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLnNraXBWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHZhbGlkYXRpb25TdHJhdGVneSwgZW50cnkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lciA9IGdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICBpZiAobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTE9HR0VSLmZpbmUobWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotDQotICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbWV0YURhdGFUcmFuc2Zvcm1lci5jb252ZXJ0TWV0YURhdGEoZW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtZXRhRGF0YTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Ta2lwcGVkKE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEsIE1ldGFEYXRhRW50cnkgZW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhLmlzRW1wdHkoKSB8fA0KLSAgICAgICAgICAgICAgICAoQm9vbGVhbi5UUlVFLmVxdWFscyhlbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5TS0lQX1ZBTElEQVRJT04sIEJvb2xlYW4uY2xhc3MpKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlzU2tpcGFibGVWYWxpZGF0aW9uU3RyYXRlZ3koUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcygNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MpKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGludGVycHJldEVtcHR5U3RyaW5nVmFsdWVzQXNOdWxsKCkNCi0gICAgew0KLSAgICAgICAgLy90byBkZWFjdGl2YXRlOiB0aGUgcGFyYW1ldGVyIGhhcyB0byBiZSBleHBsaWNpdGx5IGZhbHNlDQotICAgICAgICByZXR1cm4gRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb24uZ2V0KCkuaW50ZXJwcmV0RW1wdHlTdHJpbmdTdWJtaXR0ZWRWYWx1ZXNBc051bGwoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVFbXB0eUZpZWxkcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb3JlQ29uZmlndXJhdGlvbi5nZXQoKS52YWxpZGF0ZUVtcHR5RmllbGRzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eURldGFpbHMgZ2V0UHJvcGVydHlEZXRhaWxzKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudElkKA0KLSAgICAgICAgICAgIFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkNCi0gICAgew0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gZmluZENvbXBvbmVudChjbGllbnRJZCk7DQotDQotICAgICAgICB0cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50KHRhcmdldENvbXBvbmVudCwgZmFjZXNNZXNzYWdlLCB0aHJvd2FibGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50KA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKQ0KLSAgICB7DQotICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGludGVycHJldGVyID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIGlmIChpbnRlcnByZXRlci5zZXZlcml0eUNhdXNlc1ZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBmYWNlc01lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHRocm93YWJsZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKGZhY2VzTWVzc2FnZSwgdGhyb3dhYmxlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50KHVpQ29tcG9uZW50LCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb0FkZFZpb2xhdGlvbk1lc3NhZ2VGb3JDb21wb25lbnRJZChTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IGZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgaWYgKHRhcmdldENvbXBvbmVudCA9PSBudWxsICYmIGNsaWVudElkICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yVGVzdENsaWVudElkKGNsaWVudElkLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIHRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudCh0YXJnZXRDb21wb25lbnQsIGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInJlcXVpcmVkIGZvciB0ZXN0IGZyYW1ld29ya3MgLSBnb2FsOiByZW1vdmUgaXQiKQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvclRlc3RDbGllbnRJZChTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgaWYgKGludGVycHJldGVyLnNldmVyaXR5Q2F1c2VzVmlvbGF0aW9uTWVzc2FnZShmYWNlc0NvbnRleHQsIG51bGwsIGZhY2VzTWVzc2FnZS5nZXRTZXZlcml0eSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRGYWNlc01lc3NhZ2UoY2xpZW50SWQsIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICB9DQotICAgICAgICB0cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnQobnVsbCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGludGVycHJldGVyID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIGlmIChpbnRlcnByZXRlci5zZXZlcml0eUNhdXNlc1Zpb2xhdGlvbk1lc3NhZ2UoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh1aUNvbXBvbmVudCAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkRmFjZXNNZXNzYWdlKHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCksIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFkZEZhY2VzTWVzc2FnZShudWxsLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHRyeVRvQmxvY2tzTmF2aWdhdGlvbkZvckNvbXBvbmVudCh1aUNvbXBvbmVudCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIGFkZEZhY2VzTWVzc2FnZShudWxsLCBmYWNlc01lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGYWNlc01lc3NhZ2UoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2VTdG9yYWdlIHN0b3JhZ2UgPSBnZXRTdG9yYWdlKEZhY2VzTWVzc2FnZVN0b3JhZ2UuY2xhc3MsIEZhY2VzTWVzc2FnZVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGlmIChzdG9yYWdlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RvcmFnZS5hZGRGYWNlc01lc3NhZ2UoY2xpZW50SWQsIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmFkZE1lc3NhZ2UoY2xpZW50SWQsIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvQmxvY2tzTmF2aWdhdGlvbkZvckNvbXBvbmVudElkKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gZmluZENvbXBvbmVudChjbGllbnRJZCk7DQotDQotICAgICAgICB0cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnQodGFyZ2V0Q29tcG9uZW50LCBmYWNlc01lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgaWYgKGludGVycHJldGVyLnNldmVyaXR5QmxvY2tzTmF2aWdhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBmYWNlc01lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNDb250ZXh0LnJlbmRlclJlc3BvbnNlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNldmVyaXR5QmxvY2tzU3VibWl0Rm9yQ29tcG9uZW50SWQoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGludGVycHJldGVyID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IGZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGludGVycHJldGVyLnNldmVyaXR5QmxvY2tzU3VibWl0KGZhY2VzQ29udGV4dCwgdGFyZ2V0Q29tcG9uZW50LCBmYWNlc01lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSk7DQotICAgIH0NCi0NCi0gICAgLy9hdmFpbGFibGUgZm9yIGFkZC1vbnMgLSBub3QgdXNlZCBpbnRlcm5hbGx5IGR1ZSB0byBwZXJmb3JtYW5jZSByZWFzb25zDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXZlcml0eVNob3dzSW5kaWNhdGlvbkZvckNvbXBvbmVudElkKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBpbnRlcnByZXRlciA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBVSUNvbXBvbmVudCB0YXJnZXRDb21wb25lbnQgPSBmaW5kQ29tcG9uZW50KGNsaWVudElkKTsNCi0NCi0gICAgICAgIHJldHVybiBpbnRlcnByZXRlci5zZXZlcml0eVNob3dzSW5kaWNhdGlvbihmYWNlc0NvbnRleHQsIHRhcmdldENvbXBvbmVudCwgZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFVJQ29tcG9uZW50IGZpbmRDb21wb25lbnQoU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICBVSUNvbXBvbmVudCB0YXJnZXRDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKGNsaWVudElkICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0Q29tcG9uZW50ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZmluZENvbXBvbmVudChjbGllbnRJZCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdGFyZ2V0Q29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgY29tcG9uZW50IGluaXRpYWxpemF0aW9uIGZvciByZXF1aXJlZCB2YWxpZGF0aW9uIGlzIGFjdGl2YXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvbkFjdGl2ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb3JlQ29uZmlndXJhdGlvbi5nZXQoKS5hY3RpdmF0ZVJlcXVpcmVkSW5pdGlhbGl6YXRpb24oKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogbmVlZGVkIGZvciBzb21lIGNvbXBvbmVudCBsaWJzIC0gaWYgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24gaXMgdXNlZCBlLmcuIGZvciB2aXN1YWwgaW5kaWNhdG9ycw0KLSAgICAgKiBidXQgZmVhdHVyZXMgbGlrZSBzZXZlcml0eSBhd2FyZSB2YWxpZGF0aW9uIGFyZW4ndCB1c2VkLg0KLSAgICAgKiBpbiBzdWNoIGEgY2FzZSBpdCdzIHBvc3NpYmxlIHRvIHVzZSB0aGUgcmVxdWlyZWQgYXR0cmlidXRlLg0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIGZhbHNlIHRvIGRlYWN0aXZhdGUgdGhlIGZpbmFsIHJlc2V0IG9mIHRoZSB2YWx1ZSBvZiB0aGUgcmVxdWlyZWQgYXR0cmlidXRlDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZXF1aXJlZFJlc2V0QWN0aXZhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvcmVDb25maWd1cmF0aW9uLmdldCgpLmRlYWN0aXZhdGVSZXF1aXJlZEF0dHJpYnV0ZVN1cHBvcnQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFByb2plY3RTdGFnZU5hbWUgZ2V0RGVmYXVsdFN0YWdlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcmVhdGVQcm9qZWN0U3RhZ2VOYW1lKCJQcm9kdWN0aW9uIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0U3RhZ2VOYW1lIGNyZWF0ZVByb2plY3RTdGFnZU5hbWUoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBEZWZhdWx0UHJvamVjdE5hbWUuY3JlYXRlUHJvamVjdFN0YWdlTmFtZShuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRWYWxEZWFjdGl2YXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShTeXN0ZW0NCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsNCi0gICAgICAgICAgICAgICAgICAgICIuREVBQ1RJVkFURV9BTEwiLCAiZmFsc2UiKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Hcm91cFV0aWxzLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0dyb3VwVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg1ZWFiMy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0dyb3VwVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgR3JvdXBVdGlscw0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R3JvdXBLZXkoU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY2xpZW50SWQgPT0gbnVsbCA/IHZpZXdJZCA6IHZpZXdJZCArICJAIiArIGNsaWVudElkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvSnNmVXRpbHMuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvSnNmVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU1OGQxYy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0pzZlV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZTsNCi1pbXBvcnQgamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZUZhY3Rvcnk7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOw0KLQ0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpzZlV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3RlclBoYXNlTGlzdGVuZXIoUGhhc2VMaXN0ZW5lciBwaGFzZUxpc3RlbmVyKQ0KLSAgICB7DQotICAgICAgICBMaWZlY3ljbGVGYWN0b3J5IGxpZmVjeWNsZUZhY3RvcnkgPSAoTGlmZWN5Y2xlRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRmFjdG9yeUZpbmRlci5MSUZFQ1lDTEVfRkFDVE9SWSk7DQotDQotICAgICAgICBTdHJpbmcgY3VycmVudElkOw0KLSAgICAgICAgTGlmZWN5Y2xlIGN1cnJlbnRMaWZlY3ljbGU7DQotICAgICAgICBJdGVyYXRvciBsaWZlY3ljbGVJZHMgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZUlkcygpOw0KLSAgICAgICAgd2hpbGUgKGxpZmVjeWNsZUlkcy5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudElkID0gKFN0cmluZykgbGlmZWN5Y2xlSWRzLm5leHQoKTsNCi0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlID0gbGlmZWN5Y2xlRmFjdG9yeS5nZXRMaWZlY3ljbGUoY3VycmVudElkKTsNCi0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlLnJlbW92ZVBoYXNlTGlzdGVuZXIocGhhc2VMaXN0ZW5lcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyUGhhc2VMaXN0ZW5lcihQaGFzZUxpc3RlbmVyIHBoYXNlTGlzdGVuZXIpDQotICAgIHsNCi0gICAgICAgIExpZmVjeWNsZUZhY3RvcnkgbGlmZWN5Y2xlRmFjdG9yeSA9IChMaWZlY3ljbGVGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShGYWN0b3J5RmluZGVyLkxJRkVDWUNMRV9GQUNUT1JZKTsNCi0NCi0gICAgICAgIFN0cmluZyBjdXJyZW50SWQ7DQotICAgICAgICBMaWZlY3ljbGUgY3VycmVudExpZmVjeWNsZTsNCi0gICAgICAgIEl0ZXJhdG9yIGxpZmVjeWNsZUlkcyA9IGxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlSWRzKCk7DQotICAgICAgICB3aGlsZSAobGlmZWN5Y2xlSWRzLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50SWQgPSAoU3RyaW5nKSBsaWZlY3ljbGVJZHMubmV4dCgpOw0KLSAgICAgICAgICAgIGN1cnJlbnRMaWZlY3ljbGUgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZShjdXJyZW50SWQpOw0KLSAgICAgICAgICAgIGN1cnJlbnRMaWZlY3ljbGUuYWRkUGhhc2VMaXN0ZW5lcihwaGFzZUxpc3RlbmVyKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShGYWNlc01lc3NhZ2UuRkFDRVNfTUVTU0FHRVMsIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldEN1c3RvbUZhY2VzTWVzc2FnZUJ1bmRsZSgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBTdHJpbmcgYnVuZGxlTmFtZSA9IGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmdldE1lc3NhZ2VCdW5kbGUoKTsNCi0NCi0gICAgICAgIGlmIChidW5kbGVOYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGJ1bmRsZU5hbWUsIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZShTdHJpbmcgbWVzc2FnZUtleSkNCi0gICAgew0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgY3VzdG9tUmVzb3VyY2VCdW5kbGUgPSBnZXRDdXN0b21GYWNlc01lc3NhZ2VCdW5kbGUoKTsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChjdXN0b21SZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbVJlc291cmNlQnVuZGxlLmdldFN0cmluZyhtZXNzYWdlS2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9ubyBjdXN0b20gbWVzc2FnZSBpcyBhdmFpbGFibGUgLSBkbyBub3RoaW5nDQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhtZXNzYWdlS2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZW5kZXJSZXNwb25zZVBoYXNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuUkVOREVSX1JFU1BPTlNFLmVxdWFscyhnZXRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZSgpLmdldEN1cnJlbnRQaGFzZUlkKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUGhhc2VJZCBnZXRDdXJyZW50UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZSgpLmdldEN1cnJlbnRQaGFzZUlkKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHNpbXBsZSB0ZXN0IGZvciBlYXJseSBjb25maWcgaW4gY2FzZSBvZiBtb2phcnJhDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUganNmIGltcGwuIGlzIGluaXRpYWxpemVkIGFuZCBpdCdzIHBvc3NpYmxlIHRvIHVzZSBpdCBhcyBleHBlY3RlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXBwbGljYXRpb25Jbml0aWFsaXplZCgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICByZXR1cm4gZmFjZXNDb250ZXh0ICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgKGZhY2VzQ29udGV4dC5nZXRDbGFzcygpLmdldE5hbWUoKS5zdGFydHNXaXRoKCJvcmcuYXBhY2hlLm15ZmFjZXMiKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkuaXNFbXB0eSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBGYWNlc0luZm9ybWF0aW9uU3RvcmFnZSBnZXRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLCBGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvTnVsbFZhbHVlQXdhcmVDb25jdXJyZW50SGFzaE1hcC5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9OdWxsVmFsdWVBd2FyZUNvbmN1cnJlbnRIYXNoTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZDU0OTMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9OdWxsVmFsdWVBd2FyZUNvbmN1cnJlbnRIYXNoTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7DQotDQotLyoqDQotICogaW4gc29tZSBjYXNlcyB3ZSBoYXZlIHRvIHN0b3JlIG51bGwgdmFsdWVzIHRvIGF2b2lkIHJlLWV2YWx1YXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBOdWxsVmFsdWVBd2FyZUNvbmN1cnJlbnRIYXNoTWFwPEssIFY+IGV4dGVuZHMgQ29uY3VycmVudEhhc2hNYXA8SywgVj4NCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03Mjk0NTI3MjEzNjIyODc5NTQzTDsNCi0NCi0gICAgcHJpdmF0ZSBWIG51bGxNYXJrZXJWYWx1ZTsNCi0NCi0gICAgcHVibGljIE51bGxWYWx1ZUF3YXJlQ29uY3VycmVudEhhc2hNYXAoViBudWxsTWFya2VyVmFsdWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubnVsbE1hcmtlclZhbHVlID0gbnVsbE1hcmtlclZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBOdWxsVmFsdWVBd2FyZUNvbmN1cnJlbnRIYXNoTWFwKENsYXNzPD8gZXh0ZW5kcyBWPiBudWxsTWFya2VyVmFsdWVDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYobnVsbE1hcmtlclZhbHVlQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhPYmplY3QuY2xhc3MuZ2V0TmFtZSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL25vaW5zcGVjdGlvbiB1bmNoZWNrZWQNCi0gICAgICAgICAgICBudWxsTWFya2VyVmFsdWUgPSAoViluZXcgRGVmYXVsdE51bGxNYXJrZXIoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYobnVsbE1hcmtlclZhbHVlQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhTdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL25vaW5zcGVjdGlvbiB1bmNoZWNrZWQNCi0gICAgICAgICAgICBudWxsTWFya2VyVmFsdWUgPSAoVikie251bGx9IjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYobnVsbE1hcmtlclZhbHVlQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhDbGFzcy5jbGFzcy5nZXROYW1lKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIHVuY2hlY2tlZA0KLSAgICAgICAgICAgIG51bGxNYXJrZXJWYWx1ZSA9IChWKVZvaWQuY2xhc3MuZ2V0Q2xhc3MoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBudWxsTWFya2VyVmFsdWUgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzcyhudWxsTWFya2VyVmFsdWVDbGFzcyk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBWIHB1dChLIGtleSwgViB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsdWUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIucHV0KGtleSwgbnVsbE1hcmtlclZhbHVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzdXBlci5wdXQoa2V5LCB2YWx1ZSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBWIGdldChPYmplY3Qga2V5KQ0KLSAgICB7DQotICAgICAgICBWIHJlc3VsdCA9IHN1cGVyLmdldChrZXkpOw0KLQ0KLSAgICAgICAgaWYobnVsbE1hcmtlclZhbHVlLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGNsYXNzIERlZmF1bHROdWxsTWFya2VyDQotICAgIHsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Byb3h5VXRpbHMuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUHJveHlVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTQ4OTUwLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUHJveHlVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5LlByb3h5SGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5EZWZhdWx0UHJveHlIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvcmVDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJveHlVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgUHJveHlIZWxwZXIgcHJveHlIZWxwZXI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IENsYXNzPFQ+IGdldFVucHJveGllZENsYXNzKENsYXNzIGN1cnJlbnRDbGFzcywgQ2xhc3M8VD4gdGFyZ2V0VHlwZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFByb3h5SGVscGVyKCkuZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudENsYXNzLCB0YXJnZXRUeXBlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldFVucHJveGllZENsYXNzKENsYXNzIGN1cnJlbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFByb3h5SGVscGVyKCkuZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudENsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGFzc05hbWUoQ2xhc3MgcHJveGllZENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UHJveHlIZWxwZXIoKS5nZXROYW1lT2ZDbGFzcyhwcm94aWVkQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsYXNzTmFtZU9mT2JqZWN0KE9iamVjdCBwcm94aWVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UHJveHlIZWxwZXIoKS5nZXRDbGFzc05hbWVPZk9iamVjdChwcm94aWVkT2JqZWN0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UHJveHlIZWxwZXIoKS5pc1Byb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb3hpZWRPYmplY3QoT2JqZWN0IHByb3hpZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRQcm94eUhlbHBlcigpLmlzUHJveGllZE9iamVjdChwcm94aWVkT2JqZWN0KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBQcm94eUhlbHBlciBnZXRQcm94eUhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmIChwcm94eUhlbHBlciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vd29ya2Fyb3VuZCBmb3IgbW9qYXJyYQ0KLSAgICAgICAgICAgIGlmKCFKc2ZVdGlscy5pc0FwcGxpY2F0aW9uSW5pdGlhbGl6ZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFByb3h5SGVscGVyKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByb3h5SGVscGVyID0gRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb24uZ2V0KCkucHJveHlIZWxwZXIoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBwcm94eUhlbHBlcjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1JlZmxlY3Rpb25VdGlscy5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9SZWZsZWN0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYzZjc4Yy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1JlZmxlY3Rpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOwotCi1pbXBvcnQgamF2YS5iZWFucy5CZWFuSW5mbzsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUHJvcGVydHlTdG9yYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGlvblV0aWxzCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoUmVmbGVjdGlvblV0aWxzLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCB0cnlUb0dldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ5VG9HZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIHRyeVRvR2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0TWV0aG9kTmFtZSwgQ2xhc3MuLi4gcGFyYW1ldGVyVHlwZXMpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldE1ldGhvZCh0YXJnZXRDbGFzcywgdGFyZ2V0TWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUpCi0gICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUsIENsYXNzLi4uIHBhcmFtZXRlclR5cGVzKQotICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSB0YXJnZXRDbGFzczsKLSAgICAgICAgTWV0aG9kIHRhcmdldE1ldGhvZCA9IG51bGw7Ci0KLSAgICAgICAgd2hpbGUgKCFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gY3VycmVudENsYXNzLmdldERlY2xhcmVkTWV0aG9kKHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGFyZ2V0TWV0aG9kID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IHRhcmdldENsYXNzLmdldEludGVyZmFjZXMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50SW50ZXJmYWNlOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRDbGFzcyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IGN1cnJlbnRDbGFzcy5nZXREZWNsYXJlZE1ldGhvZCh0YXJnZXRNZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0YXJnZXRNZXRob2QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRhcmdldE1ldGhvZDsKLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBOb1N1Y2hNZXRob2RFeGNlcHRpb24oInRoZXJlIGlzIG5vIG1ldGhvZCB3aXRoIHRoZSBuYW1lICciICsgdGFyZ2V0TWV0aG9kTmFtZSArICInIiArCi0gICAgICAgICAgICAgICAgIiBjbGFzczogIiArIHRhcmdldENsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0ludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3ModGFyZ2V0LCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZE9mQ2xhc3ModGFyZ2V0LCBtZXRob2QsIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQubmV3SW5zdGFuY2UoKSwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldC5uZXdJbnN0YW5jZSgpLCBtZXRob2QsIGFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdC4uLiBhcmdzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0LCBtZXRob2QsIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdC4uLiBhcmdzKQotICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKHRhcmdldCwgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QmFzZU9mUHJvcGVydHlDaGFpbihPYmplY3QgYmFzZU9iamVjdCwgU3RyaW5nIHByb3BlcnR5Q2hhaW4pCi0gICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcm9wZXJ0eUNoYWluLCAiLiIpOwotCi0gICAgICAgIE9iamVjdCBjdXJyZW50QmFzZSA9IGJhc2VPYmplY3Q7Ci0gICAgICAgIFN0cmluZyBjdXJyZW50UHJvcGVydHk7Ci0gICAgICAgIE1ldGhvZCBjdXJyZW50TWV0aG9kOwotCi0gICAgICAgIHdoaWxlKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQotICAgICAgICAgICAgLy9pZ25vcmUgdGhlIGxhc3QgcHJvcGVydHkKLSAgICAgICAgICAgIGlmKCF0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL25vIGlzIC0gaXQncyBvbmx5IHBvc3NpYmxlIGF0IHByb3BlcnRpZXMgbm90IGF0IGJlYW4gbGV2ZWwKLSAgICAgICAgICAgIGN1cnJlbnRNZXRob2QgPSB0cnlUb0dldE1ldGhvZChQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKGN1cnJlbnRCYXNlLmdldENsYXNzKCkpLAotICAgICAgICAgICAgICAgICJnZXQiICsgY3VycmVudFByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgY3VycmVudFByb3BlcnR5LnN1YnN0cmluZygxKSk7Ci0gICAgICAgICAgICBjdXJyZW50QmFzZSA9IHRyeVRvSW52b2tlTWV0aG9kKGN1cnJlbnRCYXNlLCBjdXJyZW50TWV0aG9kKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjdXJyZW50QmFzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5U3RvcmFnZSBnZXRQcm9wZXJ0eVN0b3JhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoUHJvcGVydHlTdG9yYWdlLmNsYXNzLCBQcm9wZXJ0eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIHRyeVRvR2V0TWV0aG9kT2ZQcm9wZXJ0eShDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0dldE1ldGhvZE9mUHJvcGVydHkoZ2V0UHJvcGVydHlTdG9yYWdlKCksIGVudGl0eSwgcHJvcGVydHkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIHRyeVRvR2V0TWV0aG9kT2ZQcm9wZXJ0eShQcm9wZXJ0eVN0b3JhZ2Ugc3RvcmFnZSwgQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICBpZiAoaXNDYWNoZWRNZXRob2Qoc3RvcmFnZSwgZW50aXR5LCBwcm9wZXJ0eSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDYWNoZWRNZXRob2Qoc3RvcmFnZSwgZW50aXR5LCBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNZXRob2QgbWV0aG9kID0gdHJ5VG9HZXRSZWFkTWV0aG9kKGVudGl0eSwgcHJvcGVydHkpOwotCi0gICAgICAgIHRyeVRvQ2FjaGVNZXRob2Qoc3RvcmFnZSwgZW50aXR5LCBwcm9wZXJ0eSwgbWV0aG9kKTsKLQotICAgICAgICByZXR1cm4gbWV0aG9kOwotICAgIH0KLQotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHN0YXRpYyBGaWVsZCB0cnlUb0dldEZpZWxkT2ZQcm9wZXJ0eShDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0dldEZpZWxkT2ZQcm9wZXJ0eShnZXRQcm9wZXJ0eVN0b3JhZ2UoKSwgZW50aXR5LCBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBGaWVsZCB0cnlUb0dldEZpZWxkT2ZQcm9wZXJ0eShQcm9wZXJ0eVN0b3JhZ2Ugc3RvcmFnZSwgQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICBpZiAoaXNDYWNoZWRGaWVsZChzdG9yYWdlLCBlbnRpdHksIHByb3BlcnR5KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldENhY2hlZEZpZWxkKHN0b3JhZ2UsIGVudGl0eSwgcHJvcGVydHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgRmllbGQgZmllbGQgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWVsZCA9IGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmllbGQgPSBlbnRpdHkuZ2V0RGVjbGFyZWRGaWVsZCgiXyIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZTEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkubGVuZ3RoKCkgPiAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHByb3BlcnR5LmNoYXJBdCgwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2UocHJvcGVydHkuY2hhckF0KDEpKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9kb24ndCB1c2UgSW50cm9zcGVjdG9yI2RlY2FwaXRhbGl6ZSBoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKHByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gZW50aXR5LmdldERlY2xhcmVkRmllbGQoSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShwcm9wZXJ0eSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORVNULCAiZmllbGQgIiArIHByb3BlcnR5ICsgIiBvciBfIiArIHByb3BlcnR5ICsgIiBub3QgZm91bmQiLCBlMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnlUb0NhY2hlRmllbGQoc3RvcmFnZSwgZW50aXR5LCBwcm9wZXJ0eSwgZmllbGQpOwotCi0gICAgICAgIHJldHVybiBmaWVsZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRyeVRvQ2FjaGVGaWVsZChQcm9wZXJ0eVN0b3JhZ2Ugc3RvcmFnZSwgQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksIEZpZWxkIGZpZWxkKQotICAgIHsKLSAgICAgICAgaWYgKCFzdG9yYWdlLmNvbnRhaW5zRmllbGQoZW50aXR5LCBwcm9wZXJ0eSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0b3JhZ2Uuc3RvcmVGaWVsZChlbnRpdHksIHByb3BlcnR5LCBmaWVsZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ2FjaGVkRmllbGQoUHJvcGVydHlTdG9yYWdlIHN0b3JhZ2UsIENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIHN0b3JhZ2UuY29udGFpbnNGaWVsZChlbnRpdHksIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRob2QgdHJ5VG9HZXRSZWFkTWV0aG9kKENsYXNzIGJhc2VCZWFuQ2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRSZWFkTWV0aG9kVmlhQmVhbkluZm8oYmFzZUJlYW5DbGFzcywgcHJvcGVydHkpOwotCi0gICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0UmVhZE1ldGhvZE1hbnVhbGx5KGJhc2VCZWFuQ2xhc3MsIHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWV0aG9kOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCB0cnlUb0dldFJlYWRNZXRob2RWaWFCZWFuSW5mbyhDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIGlmICh1c2VCZWFuSW5mbygpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCZWFuSW5mbyBiZWFuSW5mbyA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhlbnRpdHkpOwotICAgICAgICAgICAgICAgIGZvciAoUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA6IGJlYW5JbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LmVxdWFscyhwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0TmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdXNlQmVhbkluZm8oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRS5lcXVhbHMoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoQmVhbkluZm8uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIHRyeVRvR2V0UmVhZE1ldGhvZE1hbnVhbGx5KENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHByb3BlcnR5LnN1YnN0cmluZygxKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgLy9jaGFuZ2VkIHRvIG9mZmljaWFsIGJlYW4gc3BlYy4gZHVlIHRvIGNhY2hpbmcgdGhlcmUgaXMgbm8gcGVyZm9ybWFuY2UgaXNzdWUgYW55IG1vcmUKLSAgICAgICAgICAgIHJldHVybiBlbnRpdHkuZ2V0RGVjbGFyZWRNZXRob2QoImlzIiArIHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHkuZ2V0RGVjbGFyZWRNZXRob2QoImdldCIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExPR0dFUi5maW5lc3QoIm1ldGhvZCBub3QgZm91bmQgLSBjbGFzczogIiArIGVudGl0eS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtIG1ldGhvZHM6ICIgKyAiZ2V0IiArIHByb3BlcnR5ICsgIiAiICsgImlzIiArIHByb3BlcnR5KTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRmllbGQgZ2V0Q2FjaGVkRmllbGQoUHJvcGVydHlTdG9yYWdlIHN0b3JhZ2UsIENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIHN0b3JhZ2UuZ2V0RmllbGQoZW50aXR5LCBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NhY2hlZE1ldGhvZChQcm9wZXJ0eVN0b3JhZ2Ugc3RvcmFnZSwgQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICByZXR1cm4gc3RvcmFnZS5jb250YWluc01ldGhvZChlbnRpdHksIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRyeVRvQ2FjaGVNZXRob2QoUHJvcGVydHlTdG9yYWdlIHN0b3JhZ2UsIENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5LCBNZXRob2QgbWV0aG9kKQotICAgIHsKLSAgICAgICAgaWYgKCFzdG9yYWdlLmNvbnRhaW5zTWV0aG9kKGVudGl0eSwgcHJvcGVydHkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdG9yYWdlLnN0b3JlTWV0aG9kKGVudGl0eSwgcHJvcGVydHksIG1ldGhvZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRob2QgZ2V0Q2FjaGVkTWV0aG9kKFByb3BlcnR5U3RvcmFnZSBzdG9yYWdlLCBDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzdG9yYWdlLmdldE1ldGhvZChlbnRpdHksIHByb3BlcnR5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1dlYlhtbFV0aWxzLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1dlYlhtbFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MGU5ZmEuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBXZWJYbWxVdGlscw0KLXsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgZnJvbSBXRUIuWE1MIHVzaW5nIHRoZSBkZWZhdWx0IHByZWZpeCBhbmQgcmVtb3ZhbCBvZiB0aGUgc3BhY2VzLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGtleSB0aGUga2V5IG5hbWUgb2YgdGhlIHBhcmFtZXRlcg0KLSAgICAgKiANCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciwgaWYgc3BlY2lmaWVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW5pdFBhcmFtZXRlcihTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0SW5pdFBhcmFtZXRlcihFeHRWYWxJbmZvcm1hdGlvbi5XRUJYTUxfUEFSQU1fUFJFRklYLCBrZXksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIGZyb20gV0VCLlhNTCB1c2luZyB0aGUgc3BlY2lmaWVkIHByZWZpeCBhbmQgcmVtb3ZhbCBvZiB0aGUgc3BhY2VzLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHByZWZpeCB0aGUgcHJlZml4IG9mIHRoZSBwYXJhbWV0ZXINCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUNCi0gICAgICogDQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIsIGlmIHNwZWNpZmllZC4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEluaXRQYXJhbWV0ZXIoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRJbml0UGFyYW1ldGVyKHByZWZpeCwgbmFtZSwgZmFsc2UpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIGZyb20gV0VCLlhNTCB1c2luZyB0aGUgZGVmYXVsdCBwcmVmaXggYW5kIHJlbW92YWwgb2Ygc3BhY2VzIGNhbiBiZSBzcGVjaWZpZWQuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgbmFtZSBvZiB0aGUgcGFyYW1ldGVyDQotICAgICAqIEBwYXJhbSBwcmVzZXJ2ZUJsYW5rcyBzaG91bGQgYmxhbmtzIGJlIGtlcHQ/DQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyLCBpZiBzcGVjaWZpZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBrZXksIGJvb2xlYW4gcHJlc2VydmVCbGFua3MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRJbml0UGFyYW1ldGVyKEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVgsIGtleSwgcHJlc2VydmVCbGFua3MpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIGZyb20gV0VCLlhNTCB1c2luZyB0aGUgc3BlY2lmaWVkIHByZWZpeCBhbmQgcmVtb3ZhbCBvZiBzcGFjZXMgY2FuIGJlIHNwZWNpZmllZC4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBwcmVmaXggdGhlIHByZWZpeCBvZiB0aGUgcGFyYW1ldGVyDQotICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXINCi0gICAgICogQHBhcmFtIHByZXNlcnZlQmxhbmtzIGluZGljYXRlcyBpZiBibGFua3Mgc2hvdWxkIGJlIGtlcHQNCi0gICAgICogDQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIsIGlmIHNwZWNpZmllZC4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEluaXRQYXJhbWV0ZXIoU3RyaW5nIHByZWZpeCwgU3RyaW5nIGtleSwgYm9vbGVhbiBwcmVzZXJ2ZUJsYW5rcykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHBhcmFtZXRlck5hbWUgPSBrZXk7DQotICAgICAgICBpZihwcmVmaXggIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwYXJhbWV0ZXJOYW1lID0gcHJlZml4ICsgIi4iICsga2V5Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldEluaXRQYXJhbWV0ZXIocGFyYW1ldGVyTmFtZSk7DQotICAgICAgICBpZiAocHJlc2VydmVCbGFua3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZS5yZXBsYWNlKCIgIiwgIiIpLnRyaW0oKSA6IG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS50eHQgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcueG1sIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OWQwZWYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18yXzAueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMi4wIj4NCi0gICAgPGZhY3Rvcnk+DQotICAgICAgICA8cmVuZGVyLWtpdC1mYWN0b3J5Pm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXRGYWN0b3J5PC9yZW5kZXIta2l0LWZhY3Rvcnk+DQotICAgIDwvZmFjdG9yeT4NCi0NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkV4dFZhbFN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9icmFuY2hfZm9yX2pzZl8yXzAvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDA5MmZiLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9jb3JlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSBNb2R1bGUNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSBNb2R1bGUgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlIE1vZHVsZSBwcm92aWRlcyBhbiBleHRlbnNpYmxlIHZhbGlkYXRpb24gcGxhdGZvcm0gdG8gaW1wbGVtZW50IHZhbGlkYXRpb24gYmFzZWQgb24gbWV0YS1kYXRhLg0KLSAgICBCYXNlZCBvbiB0aGlzIG1vZHVsZSBpdCBpcyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgdmFsaWRhdGlvbiBtb2R1bGVzLg0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS54IGFuZCBKU0YgMi54LiBBbGwgdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbCBiL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9hc3NlbWJseS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjM4NjY0Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9hc3NlbWJseS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBFeGFtcGxlcyBBc3NlbWJseTwvbmFtZT4NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1leGFtcGxlcy1hc3NlbWJseTEyPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjIuMC40LVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRlcGVuZGVuY3ktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktd2FyPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fd29ybGQ8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4JDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWZlYXR1cmUtc2V0XzAxPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3dhcjwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1zcmM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHk8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1oZWxsb193b3JsZDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+amF2YS1zb3VyY2U8L3R5cGU+ICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+amF2YS1zb3VyY2U8L3R5cGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3NyYzwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPiAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8IS0tIEVYRUNVVEUgbXZuIHBhY2thZ2UgdG8gZ2VuZXJhdGUgYXNzZW1ibHkgZmlsZXMgLS0+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfc3JjPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hc3NlbWJseTwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+ICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sPC9kZXNjcmlwdG9yPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsLWV4YW1wbGVzLSR7cHJvamVjdC52ZXJzaW9ufS1zcmM8L2ZpbmFsTmFtZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9vdXRwdXREaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3dvcms8L3dvcmtEaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPiAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9iaW48L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmFzc2VtYmx5PC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotCSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotCSAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4gICANCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWw8L2Rlc2NyaXB0b3I+DQotCSAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+DQotCSAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwtZXhhbXBsZXMtJHtwcm9qZWN0LnZlcnNpb259PC9maW5hbE5hbWU+DQotCSAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9vdXRwdXREaXJlY3Rvcnk+DQotCSAgICAgICAgICAgICAgICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3dvcms8L3dvcmtEaXJlY3Rvcnk+DQotCSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0JICAgIA0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5tYXZlbjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+d2Fnb24tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8aWQ+bXlmYWNlcy1uaWdodGx5LWJ1aWxkczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICA8dXJsPnNjcGV4ZTovL21pbm90YXVyLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL2J1aWxkcy9teWZhY2VzL25pZ2h0bHk8L3VybD4NCi0gICAgICAgICAgICAgICAgICAgIDxpbnB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9vdXQ8L2lucHV0RGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotDQotICAgICAgICA8L3BsdWdpbnM+DQotDQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXAueG1sIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYjNlYzQuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08YXNzZW1ibHk+DQotICA8aWQ+YmluPC9pZD4NCi0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+DQotICA8Zm9ybWF0cz4NCi0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4NCi0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4NCi0gIDwvZm9ybWF0cz4JDQotICA8ZmlsZVNldHM+ICAgIA0KLSAgICA8ZmlsZVNldD4NCi0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC93YXI8L2RpcmVjdG9yeT4NCi0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgIDxpbmNsdWRlPioud2FyPC9pbmNsdWRlPg0KLSAgICAgIDwvaW5jbHVkZXM+DQotICAgIDwvZmlsZVNldD4gICAgIA0KLSAgPC9maWxlU2V0cz4NCi08L2Fzc2VtYmx5Pg0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYTU4MDMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08YXNzZW1ibHk+DQotICA8aWQ+c3JjPC9pZD4NCi0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+DQotICA8Zm9ybWF0cz4NCi0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4NCi0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4NCi0gIDwvZm9ybWF0cz4JDQotICA8ZmlsZVNldHM+ICAgIA0KLSAgICA8ZmlsZVNldD4NCi0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9zcmM8L2RpcmVjdG9yeT4NCi0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPg0KLSAgICAgIDwvaW5jbHVkZXM+DQotICAgIDwvZmlsZVNldD4NCi0gICAgPGZpbGVTZXQ+DQotICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgIDxpbmNsdWRlPioudHh0PC9pbmNsdWRlPg0KLSAgICAgIDwvaW5jbHVkZXM+DQotICAgIDwvZmlsZVNldD4NCi0gIDwvZmlsZVNldHM+DQotPC9hc3NlbWJseT4NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3BvbS54bWwgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdiY2U0Mi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmVhdHVyZS1zZXRfMDE8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgZmVhdHVyZS1zZXQgMDE8L25hbWU+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+Mi4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC40LVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDwhLS0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgLS0+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudG9tYWhhd2s8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dG9tYWhhd2s8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjY8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2N1c3RvbS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwMWRmNy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0jIHRoaXMgbWVzc2FnZSBidW5kbGUgaXMgcGlja2VkIHVwIHZpYSBjb252ZW50aW9uDQotcmVwZWF0ZWRfcGFzc3dvcmRfcmVxdWlyZWQ9cGxlYXNlIHJldHlwZSB0aGUgcGFzc3dvcmQNCi1yZXBlYXRlZF9wYXNzd29yZF9yZXF1aXJlZF9kZXRhaWw9cGxlYXNlIHJldHlwZSB0aGUgcGFzc3dvcmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOTM4ODQuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRGF0ZUlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXNUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5Ob3RFcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYmVhbi5NYW5hZ2VkQmVhbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYmVhbi5TZXNzaW9uU2NvcGVkOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlRlbXBvcmFsOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbFR5cGU7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLUBNYW5hZ2VkQmVhbihuYW1lID0gInBlcnNvbiIpDQotQFNlc3Npb25TY29wZWQNCi1wdWJsaWMgY2xhc3MgUGVyc29uDQotew0KLSAgICBATGVuZ3RoKG1pbmltdW0gPSAyKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDIwKQ0KLSAgICBATm90RXF1YWxzKCJsYXN0TmFtZSIpDQotICAgIEBQYXR0ZXJuKCJbQS1aXVthLXpdKyIpDQotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsNCi0NCi0gICAgQFJlcXVpcmVkKHBhcmFtZXRlcnMgPSBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpDQotICAgIEBMZW5ndGgobWluaW11bSA9IDIsIHBhcmFtZXRlcnMgPSBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpDQotICAgIEBDb2x1bW4obGVuZ3RoID0gMjApDQotICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsNCi0NCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcm9sZSA9ICJ1c2VyIjsNCi0NCi0gICAgQERhdGVJcyh0eXBlID0gRGF0ZUlzVHlwZS5iZWZvcmUsIHZhbHVlT2YgPSAiZmluYWxFeGFtIikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlKQ0KLSAgICBAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLkRBVEUpDQotICAgIHByaXZhdGUgRGF0ZSBiaXJ0aGRheTsNCi0NCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlKQ0KLSAgICBAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLkRBVEUpDQotICAgIHByaXZhdGUgRGF0ZSBmaW5hbEV4YW07DQotDQotICAgIEBMZW5ndGgobWluaW11bSA9IDIpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIG5pY2tOYW1lOw0KLQ0KLSAgICBATGVuZ3RoKG1pbmltdW0gPSA2KQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDYwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBlbWFpbDsNCi0NCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlKQ0KLSAgICBwcml2YXRlIGludCBudW1iZXJPZlNpYmxpbmdzOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbGFzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJvbGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcm9sZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRSb2xlKFN0cmluZyByb2xlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnJvbGUgPSByb2xlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldEJpcnRoZGF5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGJpcnRoZGF5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEJpcnRoZGF5KERhdGUgYmlydGhkYXkpDQotICAgIHsNCi0gICAgICAgIHRoaXMuYmlydGhkYXkgPSBiaXJ0aGRheTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXRGaW5hbEV4YW0oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmluYWxFeGFtOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEZpbmFsRXhhbShEYXRlIGZpbmFsRXhhbSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maW5hbEV4YW0gPSBmaW5hbEV4YW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROaWNrTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuaWNrTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROaWNrTmFtZShTdHJpbmcgbmlja05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmlja05hbWUgPSBuaWNrTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVtYWlsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKFN0cmluZyBlbWFpbCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5lbWFpbCA9IGVtYWlsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZTaWJsaW5ncygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBudW1iZXJPZlNpYmxpbmdzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlck9mU2libGluZ3MoaW50IG51bWJlck9mU2libGluZ3MpDQotICAgIHsNCi0gICAgICAgIHRoaXMubnVtYmVyT2ZTaWJsaW5ncyA9IG51bWJlck9mU2libGluZ3M7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NDBhNTAuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5ndWkuYmVhbnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uTm90RXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxvbmdSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5jdXN0b20uZW1haWx2YWxpZGF0b3IuRW1haWxWYWxpZGF0b3I7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmJlYW4uTWFuYWdlZEJlYW47DQotaW1wb3J0IGphdmF4LmZhY2VzLmJlYW4uTWFuYWdlZFByb3BlcnR5Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5iZWFuLlJlcXVlc3RTY29wZWQ7DQotDQotQE1hbmFnZWRCZWFuKG5hbWUgPSAicmVnaXN0cmF0aW9uUGFnZSIpDQotQFJlcXVlc3RTY29wZWQNCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uUGFnZQ0KLXsNCi0NCi0gICAgLy90aGUgb2xkIHBhc3N3b3JkIG9mIHRoZSBwZXJzb24gaXNuJ3QgdXNlZCB3aXRoaW4gdGhlIHBhZ2UNCi0gICAgLy8tPiB2YWxpZGF0ZSB3aXRoIHZhbHVlIG9mIHRoZSBtb2RlbA0KLSAgICBAU2tpcFZhbGlkYXRpb24oIiN7cGVyc29uLnJvbGUgZXEgJ2FkbWluJ30iKQ0KLSAgICBAUmVxdWlyZWQNCi0gICAgQEVxdWFscygicGVyc29uLnBhc3N3b3JkIikNCi0gICAgQE5vdEVxdWFscygicGFzc3dvcmQiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBvbGRQYXNzd29yZDsNCi0NCi0gICAgQEVxdWFscygicGFzc3dvcmRSZXBlYXRlZCIpDQotICAgIC8vY29tYmluZSBndWkgcmVsYXRlZCBhbm5vdGF0aW9ucyB3aXRoIHRoZSBhbm5vdGF0aW9ucyBvZiB0aGUgZG9tYWluIG1vZGVsDQotICAgIEBKb2luVmFsaWRhdGlvbih2YWx1ZSA9ICIje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLnBhc3N3b3JkfSIpDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOw0KLQ0KLSAgICBAUmVxdWlyZWQodmFsaWRhdGlvbkVycm9yTXNnS2V5ID0gInJlcGVhdGVkX3Bhc3N3b3JkX3JlcXVpcmVkIiwNCi0gICAgICAgICAgICBwYXJhbWV0ZXJzID0ge0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcywgVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzc30pDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkUmVwZWF0ZWQ7DQotDQotICAgIC8vdXNlICN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ubmlja05hbWV9LCAje3BlcnNvbi5uaWNrTmFtZX0NCi0gICAgLy91c2UgcmVnaXN0cmF0aW9uUGFnZSB0byBkaXNwbGF5IHRoZSBzZWNvbmQgZXJyb3IgbWVzc2FnZSBhdCBvbGQgbmlja25hbWUNCi0gICAgLy9vciBsb2NhbCBwcm9wZXJ0eSBjaGFpbmluZyAodG8gYXZvaWQgdGhlIHVzYWdlIG9mIHRoZSBiZWFuIG5hbWUpIC0gbGlrZToNCi0gICAgQFNraXBWYWxpZGF0aW9uKCIje3BlcnNvbi5yb2xlIGVxICdhZG1pbid9IikNCi0gICAgQE5vdEVxdWFscygicGVyc29uLm5pY2tOYW1lIikNCi0gICAgQEpvaW5WYWxpZGF0aW9uKCJwZXJzb24ubmlja05hbWUiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBuZXdOaWNrTmFtZTsNCi0NCi0gICAgQE1hbmFnZWRQcm9wZXJ0eSh2YWx1ZSA9ICIje3BlcnNvbn0iKQ0KLSAgICBwcml2YXRlIFBlcnNvbiBwZXJzb247DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZmluaXNoKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0UGFzc3dvcmQodGhpcy5wYXNzd29yZCk7DQotICAgICAgICByZXR1cm4gImhvbWUiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgdXBkYXRlTmlja05hbWUoKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXROaWNrTmFtZSh0aGlzLm5ld05pY2tOYW1lKTsNCi0gICAgICAgIHJldHVybiAiaG9tZSI7DQotICAgIH0NCi0NCi0gICAgLy9qdXN0IGEgcXVpY2sgaWxsdXN0cmF0aW9uIG9mIHNraXBWYWxpZGF0aW9uDQotICAgIHB1YmxpYyBTdHJpbmcgc3dpdGNoTW9kZSgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50Um9sZSA9IHRoaXMucGVyc29uLmdldFJvbGUoKTsNCi0NCi0gICAgICAgIGlmKGN1cnJlbnRSb2xlLmVxdWFscygiYWRtaW4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnBlcnNvbi5zZXRSb2xlKCJ1c2VyIik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5wZXJzb24uc2V0Um9sZSgiYWRtaW4iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAiIjsNCi0gICAgfQ0KLQ0KLSAgICBASm9pblZhbGlkYXRpb24oIm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb246ZW1haWwiKQ0KLSAgICBAVmFsaWRhdG9yKEVtYWlsVmFsaWRhdG9yLmNsYXNzKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uLmdldEVtYWlsKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXRFbWFpbChlbWFpbCk7DQotICAgIH0NCi0NCi0gICAgQEpvaW5WYWxpZGF0aW9uKCIje3BlcnNvbi5udW1iZXJPZlNpYmxpbmdzfSIpDQotICAgIEBMb25nUmFuZ2UobWF4aW11bSA9IDIwKQ0KLSAgICBwdWJsaWMgaW50IGdldE51bWJlck9mU2libGluZ3MoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5wZXJzb24uZ2V0TnVtYmVyT2ZTaWJsaW5ncygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlck9mU2libGluZ3MoaW50IG51bWJlck9mU2libGluZ3MpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldE51bWJlck9mU2libGluZ3MobnVtYmVyT2ZTaWJsaW5ncyk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9sZFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG9sZFBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE9sZFBhc3N3b3JkKFN0cmluZyBvbGRQYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5vbGRQYXNzd29yZCA9IG9sZFBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZFJlcGVhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkUmVwZWF0ZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRSZXBlYXRlZChTdHJpbmcgcGFzc3dvcmRSZXBlYXRlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZFJlcGVhdGVkID0gcGFzc3dvcmRSZXBlYXRlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwZXJzb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbiBwZXJzb24pDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uID0gcGVyc29uOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmV3Tmlja05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3Tmlja05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TmV3Tmlja05hbWUoU3RyaW5nIG5ld05pY2tOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm5ld05pY2tOYW1lID0gbmV3Tmlja05hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0IGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNjJlZDQuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMl8wLnhzZCIKLSAgICAgICAgICAgICAgdmVyc2lvbj0iMi4wIj4KLSAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgIDwhLS0gdHJpbmlkYWQgLS0+Ci0gICAgICAgIDxkZWZhdWx0LXJlbmRlci1raXQtaWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvcmU8L2RlZmF1bHQtcmVuZGVyLWtpdC1pZD4KLQotICAgIDwvYXBwbGljYXRpb24+Ci0KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8ZnJvbS12aWV3LWlkPi9wYWdlcy9ob21lLnhodG1sPC9mcm9tLXZpZXctaWQ+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmFkZFVzZXI8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5jaGFuZ2VOaWNrTmFtZTwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmNoYW5nZVBhc3N3b3JkPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICA8L25hdmlnYXRpb24tcnVsZT4KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8ZnJvbS12aWV3LWlkPio8L2Zyb20tdmlldy1pZD4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+aG9tZTwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL2hvbWUueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgIDwvbmF2aWdhdGlvbi1ydWxlPgotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE4M2I4MS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0JeHNpOnNjaGVtYUxvY2F0aW9uPSIKLSAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+TXlQcm9qZWN0IHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5FTkFCTEVfTElHSFRXRUlHSFRfRElBTE9HUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRElTQUJMRV9DT05URU5UX0NPTVBSRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5VU0VfQVBQTElDQVRJT05fVklFV19DQUNIRTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkNIQU5HRV9QRVJTSVNURU5DRTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnNlc3Npb248L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+U3RhdGUgc2F2aW5nIG1ldGhvZDogImNsaWVudCIgb3IgInNlcnZlciIgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIFNlZSBKU0YgU3BlY2lmaWNhdGlvbiAyLjUuMwotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRyaW5pZGFkIDIgaXNuJ3Qgd29ya2luZyB3aXRoIHRoZSBNeUZhY2VzIFBhcnRpYWwgc3RhdGUgc2F2aW5nIGZvciB0aGUgbW9tZW50LjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlBBUlRJQUxfU1RBVEVfU0FWSU5HPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5OVU1CRVJfT0ZfVklFV1NfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPjIwPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzdGF0ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbSBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uCi0gICAgICAgICAgICBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KSBhbmQgaWYKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgY29tcHJlc3NlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUKLSAgICAgICAgICAgIHJlbmRlcmVkIEhUTUwgb3V0cHV0LgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgbm90IGFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFMTE9XX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5ERVRFQ1RfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCByZW5kZXJlZCBIVE1MIGNvZGUgd2lsbCBiZSBmb3JtYXR0ZWQsIHNvIHRoYXQgaXQgaXMgImh1bWFuIHJlYWRhYmxlIi4KLSAgICAgICAgICAgIGkuZS4gYWRkaXRpb25hbCBsaW5lIHNlcGFyYXRvcnMgYW5kIHdoaXRlc3BhY2Ugd2lsbCBiZSB3cml0dGVuLCB0aGF0IGRvIG5vdAotICAgICAgICAgICAgaW5mbHVlbmNlIHRoZSBIVE1MIGNvZGUuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlBSRVRUWV9IVE1MPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlCi0gICAgICAgICAgICBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuIENvbnZlbmllbnQgZmVhdHVyZSBpZiB5b3UgaGF2ZSBwYWdlcwotICAgICAgICAgICAgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGJyb3dzZXIgcGFnZSB0byBhbHdheXMganVtcCB0byB0aGUgdG9wCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuCi0gICAgICAgICAgICBEZWZhdWx0OiAiZmFsc2UiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BVVRPX1NDUk9MTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQotICAgICAgICAgICAgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucwotICAgICAgICAgICAgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IgZGlmZmVuZW50IGVuY3J5cHRpb24gc3RyZW5ndGhzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VDUkVUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+TnpZMU5ETXlNVEE9PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmFsaWRhdGUgbWFuYWdlZCBiZWFucywgbmF2aWdhdGlvbiBydWxlcyBhbmQgZW5zdXJlIHRoYXQgZm9ybXMgYXJlIG5vdCBuZXN0ZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDwhLS0gTGlzdGVuZXIsIHRvIGFsbG93IEpldHR5IHNlcnZpbmcgTXlGYWNlcyBhcHBzIC0tPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy53ZWJhcHAuU3RhcnR1cFNlcnZsZXRDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLndlYmFwcC5SZXNvdXJjZVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPGZpbHRlcj4KLSAgICAgICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlRyaW5pZGFkRmlsdGVyPC9maWx0ZXItY2xhc3M+Ci0gICAgPC9maWx0ZXI+Ci0KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT50cmluaWRhZDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZ3MgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4vZmFjZXMvKjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPnJlc291cmNlczwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+L2FkZi8qPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbCBiL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjZDE0OC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0gICAgICAgIA0KLTxodG1sPg0KLQ0KLTxoZWFkPg0KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIwOyBVUkw9ZmFjZXMvcGFnZXMvaG9tZS54aHRtbCI+DQotPC9oZWFkPg0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbCBiL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmM5N2VjLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGY6dmlldyB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiDQotICAgICAgICB4bWxuczpjPSJodHRwOi8vamF2YS5zdW4uY29tL2pzdGwvY29yZSI+DQotICAgIDx0cjpkb2N1bWVudA0KLSAgICAgICAgICAgID4NCi0gICAgICAgIDxmOmZhY2V0IG5hbWU9Im1ldGFDb250YWluZXIiPg0KLSAgICAgICAgICAgIDx0aXRsZT5zZXYtZW4gZmVhdHVyZS1zZXQgZGVtbyAwMTwvdGl0bGU+DQotICAgICAgICA8L2Y6ZmFjZXQ+DQotDQotICAgICAgICA8dHJoOmJvZHk+DQotDQotICAgICAgICAgICAgPCEtLSBvcmlnaW5hbCAtLT4NCi0gICAgICAgICAgICA8ZGl2IGlkPSJ3cmFwIj4NCi0NCi0gICAgICAgICAgICAgICAgPHRyOmZvcm0gaWQ9ImZvcm0iIGRlZmF1bHRDb21tYW5kPSJkZWZhdWx0QnV0dG9uIj4NCi0gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1haW4iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx1aTppbnNlcnQgbmFtZT0iY29udGVudCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InVuZGVyX2NvbnN0cnVjdGlvbiI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+IXNpdGUgdW5kZXIgY29uc3RydWN0aW9uITwvaDI+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgY29udGVudCBvZiB0aGlzIHNpdGUgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgbW9tZW50LjwvcD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC91aTppbnNlcnQ+DQotICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICAgICAgICAgICAgPC90cjpmb3JtPg0KLSAgICAgICAgICAgICAgICA8dHI6bWVzc2FnZXMgZ2xvYmFsT25seT0idHJ1ZSIvPg0KLQ0KLSAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgPC90cmg6Ym9keT4NCi0NCi0NCi0gICAgPC90cjpkb2N1bWVudD4NCi08L2Y6dmlldz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbCBiL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODkzZmFlLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDx0cjpwYW5lbEZvcm1MYXlvdXQ+DQotDQotICAgICAgICAgICAgPHVpOnJlbW92ZT4NCi0gICAgICAgICAgICAgICAganVzdCBmb3IgdGhlIGRlbW8gd2UgYXJlIHVzaW5nIHR3byBpbnB1dCBjb21wb25lbnRzDQotICAgICAgICAgICAgPC91aTpyZW1vdmU+DQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ib2xkIG5pY2sgbmFtZSIgcmVhZE9ubHk9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLm5pY2tOYW1lfSIvPg0KLQ0KLSAgICAgICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im5pY2sgbmFtZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5uZXdOaWNrTmFtZX0iLz4NCi0NCi0gICAgICAgIDwvdHI6cGFuZWxGb3JtTGF5b3V0Pg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UudXBkYXRlTmlja05hbWV9Ii8+DQotDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9wYXNzd29yZC54aHRtbCBiL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTA5NzVhLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDx0YWJsZT4NCi0gICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6b3V0cHV0TGFiZWwgdmFsdWU9Im9sZCBwYXNzd29yZCIgZm9yPSJvbGRfcGFzc3dvcmQiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOmlucHV0VGV4dCBpZD0ib2xkX3Bhc3N3b3JkIiBzaW1wbGU9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2Uub2xkUGFzc3dvcmR9IiBzZWNyZXQ9InRydWUiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm1lc3NhZ2UgZm9yPSJvbGRfcGFzc3dvcmQiLz48L3RkPg0KLSAgICAgICAgICAgIDwvdHI+DQotDQotICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm91dHB1dExhYmVsIHZhbHVlPSJuZXcgcGFzc3dvcmQiIGZvcj0ibmV3X3Bhc3N3b3JkIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjppbnB1dFRleHQgaWQ9Im5ld19wYXNzd29yZCIgc2ltcGxlPSJ0cnVlIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjptZXNzYWdlIGZvcj0ibmV3X3Bhc3N3b3JkIi8+PC90ZD4NCi0gICAgICAgICAgICA8L3RyPg0KLQ0KLSAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjpvdXRwdXRMYWJlbCB2YWx1ZT0icmUtZW50ZXIgcGFzc3dvcmQiIGZvcj0icmVlbnRlcmVkIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjppbnB1dFRleHQgaWQ9InJlZW50ZXJlZCIgc2ltcGxlPSJ0cnVlIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBhc3N3b3JkUmVwZWF0ZWR9IiBzZWNyZXQ9InRydWUiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm1lc3NhZ2UgZm9yPSJyZWVudGVyZWQiLz48L3RkPg0KLSAgICAgICAgICAgIDwvdHI+DQotDQotICAgICAgICA8L3RhYmxlPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UuZmluaXNofSIvPg0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTdlYmQ5Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJhZGQgdXNlciIgYWN0aW9uPSJhZGRVc2VyIi8+PGJyLz4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9ImNoYW5nZSBuaWNrIG5hbWUiIGFjdGlvbj0iY2hhbmdlTmlja05hbWUiLz48YnIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0iY2hhbmdlIHBhc3N3b3JkIiBhY3Rpb249ImNoYW5nZVBhc3N3b3JkIi8+PGJyLz4NCi0gICAgICAgIDx0cjpjb21tYW5kTGluayB0ZXh0PSJtb2RlOiAje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLnJvbGV9Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2Uuc3dpdGNoTW9kZX0iIGltbWVkaWF0ZT0idHJ1ZSIvPg0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY5Njk5OS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6Y29tcD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29tcG9zaXRlL2NvbXBvbmVudHMiDQotICAgICAgICA+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotDQotICAgICAgICA8Y29tcDp1c2VyX2Zvcm0gYmVhbj0iI3tyZWdpc3RyYXRpb25QYWdlfSIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UuZmluaXNofSIvPg0KLQ0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9yZXNvdXJjZXMvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3Jlc291cmNlcy9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIzYTYzMy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3Jlc291cmNlcy9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiCi0gICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiCi0gICB4bWxuczpjPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2NvcmUiCi0gICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCIKLSAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIgotICAgeG1sbnM6Y29tcG9zaXRlPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb21wb3NpdGUiPgotCi08Y29tcG9zaXRlOmludGVyZmFjZSBuYW1lPSJ1c2VyX2Zvcm0iPgotICAgIDxjb21wb3NpdGU6YXR0cmlidXRlIG5hbWU9ImJlYW4iIHJlcXVpcmVkPSJ0cnVlIiAvPgotPC9jb21wb3NpdGU6aW50ZXJmYWNlPgotCi08Y29tcG9zaXRlOmltcGxlbWVudGF0aW9uPgotICAgIDx0cjpwYW5lbEZvcm1MYXlvdXQ+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibmljayBuYW1lIiB2YWx1ZT0iI3tjYy5hdHRycy5iZWFuLnBlcnNvblsgJ25pY2tOYW1lJyBdfSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJlLW1haWwiIHZhbHVlPSIje2NjLmF0dHJzLmJlYW4uZW1haWx9Ii8+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0iZmlyc3QgbmFtZSIgdmFsdWU9IiN7Y2MuYXR0cnMuYmVhbi5wZXJzb24uZmlyc3ROYW1lfSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJsYXN0IG5hbWUiIHZhbHVlPSIje2NjLmF0dHJzLmJlYW4ucGVyc29uLmxhc3ROYW1lfSIvPgotICAgICAgICA8IS0tCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Imxhc3QgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb24ubGFzdE5hbWV9IiByZXF1aXJlZE1lc3NhZ2VEZXRhaWw9InswfSBpcyByZXF1aXJlZCIvPgotICAgICAgICAtLT4KLSAgICAgICAgPHRyOmlucHV0RGF0ZSBsYWJlbD0iYmlydGhkYXkiIHZhbHVlPSIje2NjLmF0dHJzLmJlYW4ucGVyc29uLmJpcnRoZGF5fSI+Ci0gICAgICAgICAgICA8dHI6Y29udmVydERhdGVUaW1lIHR5cGU9ImRhdGUiIHBhdHRlcm49ImRkLk1NLnl5eXkiLz4KLSAgICAgICAgPC90cjppbnB1dERhdGU+Ci0gICAgICAgIDx0cjppbnB1dERhdGUgbGFiZWw9ImZpbmFsIGV4YW0iIHZhbHVlPSIje2NjLmF0dHJzLmJlYW4ucGVyc29uLmZpbmFsRXhhbX0iPgotICAgICAgICAgICAgPHRyOmNvbnZlcnREYXRlVGltZSB0eXBlPSJkYXRlIiBwYXR0ZXJuPSJkZC5NTS55eXl5Ii8+Ci0gICAgICAgIDwvdHI6aW5wdXREYXRlPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im51bWJlciBvZiBzaWJsaW5ncyIgdmFsdWU9IiN7Y2MuYXR0cnMuYmVhbi5udW1iZXJPZlNpYmxpbmdzfSIvPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9InBhc3N3b3JkIiB2YWx1ZT0iI3tjYy5hdHRycy5iZWFuLnBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9InJlLWVudGVyIHBhc3N3b3JkIiB2YWx1ZT0iI3tjYy5hdHRycy5iZWFuLnBhc3N3b3JkUmVwZWF0ZWR9IiBzZWNyZXQ9InRydWUiLz4KLQotICAgIDwvdHI6cGFuZWxGb3JtTGF5b3V0PgotPC9jb21wb3NpdGU6aW1wbGVtZW50YXRpb24+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvcG9tLnhtbCBiL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWUzNDM1Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBmZWF0dXJlLXNldCAwMjwvbmFtZT4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4yLjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC40LVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5oaWJlcm5hdGU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGliZXJuYXRlLXZhbGlkYXRvcjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj40LjAuMC5HQTwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS40LjI8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjQuMjwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8IS0tDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIC0tPg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2NvbnN0cmFpbnRzL0JpcnRoZGF5LmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9jb25zdHJhaW50cy9CaXJ0aGRheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWI0ZTcyLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2NvbnN0cmFpbnRzL0JpcnRoZGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5jb25zdHJhaW50czsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlBhc3Q7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuQU5OT1RBVElPTl9UWVBFOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotDQotQFBhc3QNCi1ATm90TnVsbA0KLQ0KLUBDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0ge30pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBUYXJnZXQoe01FVEhPRCwgRklFTEQsIEFOTk9UQVRJT05fVFlQRX0pDQotcHVibGljIEBpbnRlcmZhY2UgQmlydGhkYXkNCi17DQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAibm8gdmFsaWQgYmlydGhkYXkiOw0KLQ0KLSAgICBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQge307DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHt9Ow0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9jb25zdHJhaW50cy9OYW1lLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9jb25zdHJhaW50cy9OYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MjAwZjkuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vY29uc3RyYWludHMvTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uY29uc3RyYWludHM7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5PdmVycmlkZXNBdHRyaWJ1dGU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5BTk5PVEFUSU9OX1RZUEU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi0NCi1ATm90TnVsbA0KLUBTaXplKG1pbiA9IDIpDQotDQotQENvbnN0cmFpbnQodmFsaWRhdGVkQnkgPSB7fSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgQU5OT1RBVElPTl9UWVBFfSkNCi1wdWJsaWMgQGludGVyZmFjZSBOYW1lDQotew0KLSAgICBTdHJpbmcgbWVzc2FnZSgpIGRlZmF1bHQgImludmFsaWQgbmFtZSI7IC8vbm90IHVzZWQNCi0NCi0gICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9Ow0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsNCi0NCi0gICAgQE92ZXJyaWRlc0F0dHJpYnV0ZShjb25zdHJhaW50ID0gU2l6ZS5jbGFzcywgbmFtZSA9ICJtYXgiKQ0KLSAgICBpbnQgbWF4TGVuZ3RoKCkgZGVmYXVsdCAyMDsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTA3MGQ5Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2RvbWFpbi9QZXJzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5kb21haW47DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmNvbnN0cmFpbnRzLk5hbWU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmNvbnN0cmFpbnRzLkJpcnRoZGF5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5iZWFuLk1hbmFnZWRCZWFuOw0KLWltcG9ydCBqYXZheC5mYWNlcy5iZWFuLlNlc3Npb25TY29wZWQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlBhc3Q7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLUBNYW5hZ2VkQmVhbihuYW1lID0gInBlcnNvbiIpDQotQFNlc3Npb25TY29wZWQNCi1wdWJsaWMgY2xhc3MgUGVyc29uDQotew0KLSAgICBATmFtZShtYXhMZW5ndGggPSAzMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOw0KLQ0KLSAgICBATmFtZShtYXhMZW5ndGggPSAzMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7DQotDQotICAgIEBTaXplKG1pbiA9IDIsIG1heCA9IDEwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsNCi0NCi0gICAgQEJpcnRoZGF5DQotICAgIHByaXZhdGUgRGF0ZSBiaXJ0aGRheTsNCi0NCi0gICAgQFBhc3QNCi0gICAgcHJpdmF0ZSBEYXRlIGZpbmFsRXhhbTsNCi0NCi0gICAgQE5vdE51bGwNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmlja05hbWU7DQotDQotICAgIEBTaXplKG1pbiA9IDYsIG1heCA9IDYwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBlbWFpbDsNCi0NCi0gICAgQE5vdE51bGwNCi0gICAgcHJpdmF0ZSBpbnQgbnVtYmVyT2ZTaWJsaW5nczsNCi0NCi0gICAgQFNpemUobWluID0gMiwgbWF4ID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIHJvbGUgPSAidXNlciI7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByb2xlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFJvbGUoU3RyaW5nIHJvbGUpDQotICAgIHsNCi0gICAgICAgIHRoaXMucm9sZSA9IHJvbGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0QmlydGhkYXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmlydGhkYXk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0QmlydGhkYXkoRGF0ZSBiaXJ0aGRheSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5iaXJ0aGRheSA9IGJpcnRoZGF5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldEZpbmFsRXhhbSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmaW5hbEV4YW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RmluYWxFeGFtKERhdGUgZmluYWxFeGFtKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpbmFsRXhhbSA9IGZpbmFsRXhhbTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5pY2tOYW1lKFN0cmluZyBuaWNrTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uaWNrTmFtZSA9IG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNpYmxpbmdzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG51bWJlck9mU2libGluZ3M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyT2ZTaWJsaW5ncyhpbnQgbnVtYmVyT2ZTaWJsaW5ncykNCi0gICAgew0KLSAgICAgICAgdGhpcy5udW1iZXJPZlNpYmxpbmdzID0gbnVtYmVyT2ZTaWJsaW5nczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0ZjY4ZS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmd1aS5iZWFuczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluLlBlcnNvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwucGF5bG9hZC5EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmJlYW4uTWFuYWdlZEJlYW47DQotaW1wb3J0IGphdmF4LmZhY2VzLmJlYW4uTWFuYWdlZFByb3BlcnR5Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5iZWFuLlJlcXVlc3RTY29wZWQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOw0KLQ0KLUBNYW5hZ2VkQmVhbihuYW1lID0gInJlZ2lzdHJhdGlvblBhZ2UiKQ0KLUBSZXF1ZXN0U2NvcGVkDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvblBhZ2UNCi17DQotICAgIEBOb3ROdWxsKHBheWxvYWQgPSBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOw0KLQ0KLSAgICBATm90TnVsbChwYXlsb2FkID0gVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcykNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmRSZXBlYXRlZDsNCi0NCi0gICAgQE1hbmFnZWRQcm9wZXJ0eSh2YWx1ZSA9ICIje3BlcnNvbn0iKQ0KLSAgICBwcml2YXRlIFBlcnNvbiBwZXJzb247DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZmluaXNoKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0UGFzc3dvcmQodGhpcy5wYXNzd29yZCk7DQotICAgICAgICByZXR1cm4gImhvbWUiOw0KLSAgICB9DQotDQotICAgIEBTaXplKG1pbiA9IDYsIG1heCA9IDYwKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uLmdldEVtYWlsKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXRFbWFpbChlbWFpbCk7DQotICAgIH0NCi0NCi0gICAgQE5vdE51bGwNCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNpYmxpbmdzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uLmdldE51bWJlck9mU2libGluZ3MoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXJPZlNpYmxpbmdzKGludCBudW1iZXJPZlNpYmxpbmdzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXROdW1iZXJPZlNpYmxpbmdzKG51bWJlck9mU2libGluZ3MpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkUmVwZWF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmRSZXBlYXRlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZFJlcGVhdGVkKFN0cmluZyBwYXNzd29yZFJlcGVhdGVkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkUmVwZWF0ZWQgPSBwYXNzd29yZFJlcGVhdGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQZXJzb24gZ2V0UGVyc29uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBlcnNvbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzb24oUGVyc29uIHBlcnNvbikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24gPSBwZXJzb247DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0IGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOGMwMzYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMl8wLnhzZCIKLSAgICAgICAgICAgICAgdmVyc2lvbj0iMi4wIj4KLSAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgIDwhLS0gdHJpbmlkYWQgLS0+Ci0gICAgICAgIDxkZWZhdWx0LXJlbmRlci1raXQtaWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvcmU8L2RlZmF1bHQtcmVuZGVyLWtpdC1pZD4KLQotICAgIDwvYXBwbGljYXRpb24+Ci0KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8ZnJvbS12aWV3LWlkPi9wYWdlcy9ob21lLnhodG1sPC9mcm9tLXZpZXctaWQ+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmFkZFVzZXI8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgIDwvbmF2aWdhdGlvbi1ydWxlPgotICAgIDxuYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgICAgIDxmcm9tLXZpZXctaWQ+KjwvZnJvbS12aWV3LWlkPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5ob21lPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvaG9tZS54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgPC9uYXZpZ2F0aW9uLXJ1bGU+Ci08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWVjYWZhLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQl4c2k6c2NoZW1hTG9jYXRpb249IgotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KLQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkVOQUJMRV9MSUdIVFdFSUdIVF9ESUFMT0dTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5ESVNBQkxFX0NPTlRFTlRfQ09NUFJFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLlVTRV9BUFBMSUNBVElPTl9WSUVXX0NBQ0hFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQ0hBTkdFX1BFUlNJU1RFTkNFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+c2Vzc2lvbjwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5TdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jbGllbnQ8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRyaW5pZGFkIDIgaXNuJ3Qgd29ya2luZyB3aXRoIHRoZSBNeUZhY2VzIFBhcnRpYWwgc3RhdGUgc2F2aW5nIGZvciB0aGUgbW9tZW50LjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlBBUlRJQUxfU1RBVEVfU0FWSU5HPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgRGVmaW5lcyB0aGUgYW1vdW50IChkZWZhdWx0ID0gMjApIG9mIHRoZSBsYXRlc3Qgdmlld3MgYXJlIHN0b3JlZCBpbiBzZXNzaW9uLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuTlVNQkVSX09GX1ZJRVdTX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc3RhdGUgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0gYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLgotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkgYW5kIGlmCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04gaXMgdHJ1ZSAoPSBkZWZhdWx0KQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4gSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DT01QUkVTU19TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhpcyBwYXJhbWV0ZXIgdGVsbHMgTXlGYWNlcyBpZiBqYXZhc2NyaXB0IGNvZGUgc2hvdWxkIGJlIGFsbG93ZWQgaW4gdGhlCi0gICAgICAgICAgICByZW5kZXJlZCBIVE1MIG91dHB1dC4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgYWxsb3dlZCwgY29tbWFuZF9saW5rIGFuY2hvcnMgd2lsbCBoYXZlIGphdmFzY3JpcHQgY29kZQotICAgICAgICAgICAgdGhhdCBzdWJtaXRzIHRoZSBjb3JyZXNwb25kaW5nIGZvcm0uCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIG5vdCBhbGxvd2VkLCB0aGUgc3RhdGUgc2F2aW5nIGluZm8gYW5kIG5lc3RlZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICB3aWxsIGJlIGFkZGVkIGFzIHVybCBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BTExPV19KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuREVURUNUX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgcmVuZGVyZWQgSFRNTCBjb2RlIHdpbGwgYmUgZm9ybWF0dGVkLCBzbyB0aGF0IGl0IGlzICJodW1hbiByZWFkYWJsZSIuCi0gICAgICAgICAgICBpLmUuIGFkZGl0aW9uYWwgbGluZSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIHdpbGwgYmUgd3JpdHRlbiwgdGhhdCBkbyBub3QKLSAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgSFRNTCBjb2RlLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIGEgamF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRoYXQgaXMgYWJsZSB0byByZXN0b3JlIHRoZQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMKLSAgICAgICAgICAgIHdpdGggbG9uZyBsaXN0cyBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcAotICAgICAgICAgICAgaWYgeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZSBwYWdlLgotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQVVUT19TQ1JPTEw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlVzZWQgZm9yIGVuY3J5cHRpbmcgdmlldyBzdGF0ZS4gT25seSByZWxldmFudCBmb3IgY2xpZW50IHNpZGUKLSAgICAgICAgICAgIHN0YXRlIHNhdmluZy4gU2VlIE15RmFjZXMgd2lraS93ZWIgc2l0ZSBkb2N1bWVudGF0aW9uIGZvciBpbnN0cnVjdGlvbnMKLSAgICAgICAgICAgIG9uIGhvdyB0byBjb25maWd1cmUgYW4gYXBwbGljYXRpb24gZm9yIGRpZmZlbmVudCBlbmNyeXB0aW9uIHN0cmVuZ3Rocy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFQ1JFVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPk56WTFORE15TVRBPTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZhbGlkYXRlIG1hbmFnZWQgYmVhbnMsIG5hdmlnYXRpb24gcnVsZXMgYW5kIGVuc3VyZSB0aGF0IGZvcm1zIGFyZSBub3QgbmVzdGVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuVkFMSURBVEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8IS0tIExpc3RlbmVyLCB0byBhbGxvdyBKZXR0eSBzZXJ2aW5nIE15RmFjZXMgYXBwcyAtLT4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMud2ViYXBwLlN0YXJ0dXBTZXJ2bGV0Q29udGV4dExpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IC0tPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+cmVzb3VyY2VzPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC53ZWJhcHAuUmVzb3VyY2VTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgIDwvc2VydmxldD4KLQotICAgIDxmaWx0ZXI+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT50cmluaWRhZDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLndlYmFwcC5UcmluaWRhZEZpbHRlcjwvZmlsdGVyLWNsYXNzPgotICAgIDwvZmlsdGVyPgotCi0gICAgPGZpbHRlci1tYXBwaW5nPgotICAgICAgICA8ZmlsdGVyLW5hbWU+dHJpbmlkYWQ8L2ZpbHRlci1uYW1lPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICA8L2ZpbHRlci1tYXBwaW5nPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmdzIC0tPgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+L2ZhY2VzLyo8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9hZGYvKjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1Y2QxNDguLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotICAgICAgICANCi08aHRtbD4NCi0NCi08aGVhZD4NCi0gICAgPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDsgVVJMPWZhY2VzL3BhZ2VzL2hvbWUueGh0bWwiPg0KLTwvaGVhZD4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkxNGM3NC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTx0cjpkb2N1bWVudA0KLSAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIg0KLSAgICAgICAgeG1sbnM6Yz0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3RsL2NvcmUiPg0KLSAgICA8ZjpmYWNldCBuYW1lPSJtZXRhQ29udGFpbmVyIj4NCi0gICAgICAgIDx0aXRsZT5zZXYtZW4gZmVhdHVyZS1zZXQgZGVtbyAwMjwvdGl0bGU+DQotICAgIDwvZjpmYWNldD4NCi0NCi0gICAgPHRyaDpib2R5Pg0KLQ0KLSAgICAgICAgPCEtLSBvcmlnaW5hbCAtLT4NCi0gICAgICAgIDxkaXYgaWQ9IndyYXAiPg0KLQ0KLSAgICAgICAgICAgIDx0cjpmb3JtIGlkPSJmb3JtIiBkZWZhdWx0Q29tbWFuZD0iZGVmYXVsdEJ1dHRvbiI+DQotICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1haW4iPg0KLSAgICAgICAgICAgICAgICAgICAgPHVpOmluc2VydCBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ1bmRlcl9jb25zdHJ1Y3Rpb24iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+IXNpdGUgdW5kZXIgY29uc3RydWN0aW9uITwvaDI+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBjb250ZW50IG9mIHRoaXMgc2l0ZSBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSBtb21lbnQuPC9wPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC91aTppbnNlcnQ+DQotICAgICAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICAgIDwvdHI6Zm9ybT4NCi0gICAgICAgICAgICA8dHI6bWVzc2FnZXMgZ2xvYmFsT25seT0idHJ1ZSIvPg0KLQ0KLSAgICAgICAgPC9kaXY+DQotICAgIDwvdHJoOmJvZHk+DQotDQotDQotPC90cjpkb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxN2IxNTMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9ImFkZCB1c2VyIiBhY3Rpb249ImFkZFVzZXIiLz48YnIvPg0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjczNGNhOS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6Y29tcD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29tcG9zaXRlL2NvbXBvbmVudHMiDQotICAgICAgICA+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotICAgICAgICA8Y29tcDp1c2VyX2Zvcm0gYmVhbj0iI3tyZWdpc3RyYXRpb25QYWdlfSIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UuZmluaXNofSIvPg0KLQ0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9yZXNvdXJjZXMvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL3Jlc291cmNlcy9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIxNGFlYy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL3Jlc291cmNlcy9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiCi0gICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiCi0gICB4bWxuczpjPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2NvcmUiCi0gICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCIKLSAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIgotICAgeG1sbnM6Y29tcG9zaXRlPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb21wb3NpdGUiPgotCi08Y29tcG9zaXRlOmludGVyZmFjZSBuYW1lPSJ1c2VyX2Zvcm0iPgotICAgIDxjb21wb3NpdGU6YXR0cmlidXRlIG5hbWU9ImJlYW4iIHJlcXVpcmVkPSJ0cnVlIiAgLz4KLTwvY29tcG9zaXRlOmludGVyZmFjZT4KLQotPGNvbXBvc2l0ZTppbXBsZW1lbnRhdGlvbj4KLSAgICA8dHI6cGFuZWxGb3JtTGF5b3V0PgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im5pY2sgbmFtZSIgdmFsdWU9IiN7Y2MuYXR0cnMuYmVhbi5wZXJzb25bICduaWNrTmFtZScgXX0iLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0iZS1tYWlsIiB2YWx1ZT0iI3tjYy5hdHRycy5iZWFuLmVtYWlsfSIvPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9ImZpcnN0IG5hbWUiIHZhbHVlPSIje2NjLmF0dHJzLmJlYW4ucGVyc29uLmZpcnN0TmFtZX0iLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibGFzdCBuYW1lIiB2YWx1ZT0iI3tjYy5hdHRycy5iZWFuLnBlcnNvbi5sYXN0TmFtZX0iLz4KLSAgICAgICAgPCEtLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJsYXN0IG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uLmxhc3ROYW1lfSIgcmVxdWlyZWRNZXNzYWdlRGV0YWlsPSJ7MH0gaXMgcmVxdWlyZWQiLz4KLSAgICAgICAgLS0+Ci0gICAgICAgIDx0cjppbnB1dERhdGUgbGFiZWw9ImJpcnRoZGF5IiB2YWx1ZT0iI3tjYy5hdHRycy5iZWFuLnBlcnNvbi5iaXJ0aGRheX0iPgotICAgICAgICAgICAgPHRyOmNvbnZlcnREYXRlVGltZSB0eXBlPSJkYXRlIiBwYXR0ZXJuPSJkZC5NTS55eXl5Ii8+Ci0gICAgICAgIDwvdHI6aW5wdXREYXRlPgotICAgICAgICA8dHI6aW5wdXREYXRlIGxhYmVsPSJmaW5hbCBleGFtIiB2YWx1ZT0iI3tjYy5hdHRycy5iZWFuLnBlcnNvbi5maW5hbEV4YW19Ij4KLSAgICAgICAgICAgIDx0cjpjb252ZXJ0RGF0ZVRpbWUgdHlwZT0iZGF0ZSIgcGF0dGVybj0iZGQuTU0ueXl5eSIvPgotICAgICAgICA8L3RyOmlucHV0RGF0ZT4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJudW1iZXIgb2Ygc2libGluZ3MiIHZhbHVlPSIje2NjLmF0dHJzLmJlYW4ubnVtYmVyT2ZTaWJsaW5nc30iLz4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJwYXNzd29yZCIgdmFsdWU9IiN7Y2MuYXR0cnMuYmVhbi5wYXNzd29yZH0iIHNlY3JldD0idHJ1ZSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJyZS1lbnRlciBwYXNzd29yZCIgdmFsdWU9IiN7Y2MuYXR0cnMuYmVhbi5wYXNzd29yZFJlcGVhdGVkfSIgc2VjcmV0PSJ0cnVlIi8+Ci0KLSAgICA8L3RyOnBhbmVsRm9ybUxheW91dD4KLTwvY29tcG9zaXRlOmltcGxlbWVudGF0aW9uPgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9wb20ueG1sIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjRjZWIzLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIGhlbGxvIGJlYW4tdmFsaWRhdGlvbjwvbmFtZT4NCi0gICAgPHZlcnNpb24+Mi4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+Mi4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC40LVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC40LVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qc3RsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzdGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5oaWJlcm5hdGU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGliZXJuYXRlLXZhbGlkYXRvcjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj40LjAuMC5HQTwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS40LjI8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjQuMjwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFhY2VjMy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLmRvbWFpbi5QZXJzb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb24uZ3JvdXAuQWRtaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb24uZ3JvdXAuVXNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cC5OYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uQmVhblZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5iZWFuLk1hbmFnZWRCZWFuOwotaW1wb3J0IGphdmF4LmZhY2VzLmJlYW4uUmVxdWVzdFNjb3BlZDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmdyb3Vwcy5EZWZhdWx0OwotCi1ATWFuYWdlZEJlYW4obmFtZSA9ICJoZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIiKQotQFJlcXVlc3RTY29wZWQKLXB1YmxpYyBjbGFzcyBIZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIKLXsKLSAgICBAQmVhblZhbGlkYXRpb24uTGlzdCh7Ci0gICAgICAgICAgICBAQmVhblZhbGlkYXRpb24odXNlR3JvdXBzID0gRGVmYXVsdC5jbGFzcyksCi0gICAgICAgICAgICBAQmVhblZhbGlkYXRpb24odmlld0lkcyA9ICIvcGFnZXMvZ3JvdXBWYWxpZGF0aW9uMDEueGh0bWwiLCB1c2VHcm91cHMgPSBVc2VyLmNsYXNzKSwKLSAgICAgICAgICAgIEBCZWFuVmFsaWRhdGlvbih2aWV3SWRzID0gIi9wYWdlcy9ncm91cFZhbGlkYXRpb24wMi54aHRtbCIsIHVzZUdyb3VwcyA9IEFkbWluLmNsYXNzKSwKLSAgICAgICAgICAgIEBCZWFuVmFsaWRhdGlvbih2aWV3SWRzID0gIi9wYWdlcy9tb2RlbFZhbGlkYXRpb24wMS54aHRtbCIsIHVzZUdyb3VwcyA9IEFkbWluLmNsYXNzKSwKLSAgICAgICAgICAgIEBCZWFuVmFsaWRhdGlvbih2aWV3SWRzID0gIi9wYWdlcy9tb2RlbFZhbGlkYXRpb24wMS54aHRtbCIsIHVzZUdyb3VwcyA9IE5hbWUuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbiA9IEBNb2RlbFZhbGlkYXRpb24oaXNBY3RpdmUgPSB0cnVlKSkKLSAgICB9KQotICAgIHByaXZhdGUgUGVyc29uIHBlcnNvbiA9IG5ldyBQZXJzb24oKTsKLQotICAgIC8qKgotICAgICAqIGRlZmF1bHQgZW1wdHkgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgSGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBzZW5kKCkKLSAgICB7Ci0gICAgICAgIC8vZG8gcmVhbCBsb2dpYywgcmV0dXJuIGEgc3RyaW5nIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgdGhlIG5hdmlnYXRpb24gc3lzdGVtIG9mIEpTRgotICAgICAgICByZXR1cm4gInN1Y2Nlc3MiOwotICAgIH0KLQotICAgIHB1YmxpYyBQZXJzb24gZ2V0UGVyc29uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwZXJzb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbiBwZXJzb24pCi0gICAgewotICAgICAgICB0aGlzLnBlcnNvbiA9IHBlcnNvbjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWIwYTM5Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuazsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5kb21haW4uUGVyc29uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuYmVhbi5NYW5hZ2VkQmVhbjsKLWltcG9ydCBqYXZheC5mYWNlcy5iZWFuLlJlcXVlc3RTY29wZWQ7Ci0KLS8qKgotICogQSB0eXBpY2FsIHNpbXBsZSBiYWNraW5nIGJlYW4sIHRoYXQgaXMgYmFja2VkIHRvIDxjb2RlPmhlbGxvd29ybGQuanNwPC9jb2RlPgotICovCi1ATWFuYWdlZEJlYW4obmFtZSA9ICJoZWxsb1dvcmxkIikKLUBSZXF1ZXN0U2NvcGVkCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZENvbnRyb2xsZXIKLXsKLSAgICBwcml2YXRlIFBlcnNvbiBwZXJzb24gPSBuZXcgUGVyc29uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBkZWZhdWx0IGVtcHR5IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIEhlbGxvV29ybGRDb250cm9sbGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBzZW5kKCkKLSAgICB7Ci0gICAgICAgIC8vZG8gcmVhbCBsb2dpYywgcmV0dXJuIGEgc3RyaW5nIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgdGhlIG5hdmlnYXRpb24gc3lzdGVtIG9mIEpTRgotICAgICAgICByZXR1cm4gInN1Y2Nlc3MiOwotICAgIH0KLQotICAgIHB1YmxpYyBQZXJzb24gZ2V0UGVyc29uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwZXJzb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbiBwZXJzb24pCi0gICAgewotICAgICAgICB0aGlzLnBlcnNvbiA9IHBlcnNvbjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4OTgwYy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5kb21haW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5OYW1lQ29uc3RyYWludDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cC5BZG1pbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cC5Vc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay52YWxpZGF0aW9uLmdyb3VwLk5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwucGF5bG9hZC5WaW9sYXRpb25TZXZlcml0eTsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7Ci0KLUBOYW1lQ29uc3RyYWludChncm91cHMgPSBOYW1lLmNsYXNzKQotcHVibGljIGNsYXNzIFBlcnNvbgotewotICAgIEBOb3ROdWxsKHBheWxvYWQgPSBWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzKQotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsKLQotICAgIC8vZGVtbyBmb3IgYmVhbiB2YWxpZGF0aW9uIGJhc2VkIHZhbGlkYXRpb24gc3VwcG9ydAotICAgIEBOb3ROdWxsCi0gICAgQFNpemUuTGlzdCh7Ci0gICAgICAgICAgICBAU2l6ZShtaW4gPSAzLCBtYXggPSA2LCBncm91cHMgPSBVc2VyLmNsYXNzKSwKLSAgICAgICAgICAgIEBTaXplKG1pbiA9IDMsIG1heCA9IDEyLCBncm91cHMgPSBBZG1pbi5jbGFzcykKLSAgICB9KQotICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGxhc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vTmFtZUNvbnN0cmFpbnQuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9OYW1lQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2MzN2Y0Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9OYW1lQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb247DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi0NCi1AQ29uc3RyYWludCh2YWxpZGF0ZWRCeSA9IE5hbWVDb25zdHJhaW50VmFsaWRhdG9yLmNsYXNzKQ0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotcHVibGljIEBpbnRlcmZhY2UgTmFtZUNvbnN0cmFpbnQNCi17DQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAiaW52YWxpZCBuYW1lIjsNCi0NCi0gICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9Ow0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL05hbWVDb25zdHJhaW50VmFsaWRhdG9yLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vTmFtZUNvbnN0cmFpbnRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDViODkyYy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vTmFtZUNvbnN0cmFpbnRWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluLlBlcnNvbjsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBOYW1lQ29uc3RyYWludFZhbGlkYXRvciBpbXBsZW1lbnRzDQotICAgICAgICBDb25zdHJhaW50VmFsaWRhdG9yPE5hbWVDb25zdHJhaW50LCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluLlBlcnNvbj4NCi17DQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoTmFtZUNvbnN0cmFpbnQgZGlmZmVyZW50TmFtZSkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoUGVyc29uIHBlcnNvbiwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29uc3RyYWludFZhbGlkYXRvckNvbnRleHQpDQotICAgIHsNCi0gICAgICAgIGlmKHBlcnNvbiA9PSBudWxsIHx8IGlzRW1wdHkocGVyc29uLmdldEZpcnN0TmFtZSgpKSB8fCBpc0VtcHR5KHBlcnNvbi5nZXRMYXN0TmFtZSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAhKHBlcnNvbi5nZXRGaXJzdE5hbWUoKS5lcXVhbHMocGVyc29uLmdldExhc3ROYW1lKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFbXB0eShTdHJpbmcgdmFsdWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8ICIiLmVxdWFscyh2YWx1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL2dyb3VwL0FkbWluLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvQWRtaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EyNWZkMC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvQWRtaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay52YWxpZGF0aW9uLmdyb3VwOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgQWRtaW4NCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9OYW1lLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTE3MDM4Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9OYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cDsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWUNCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9Vc2VyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvVXNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmY4ZGQ1Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9Vc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cDsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIFVzZXINCi17DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU4OGVhNS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlcy1jb25maWcgdmVyc2lvbj0iMi4wIgotICAgIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18yXzAueHNkIj4KLQkKLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIGhlbGxvV29ybGQueGh0bWwgLS0+Ci0JPG5hdmlnYXRpb24tcnVsZT4KLQkJPGZyb20tdmlldy1pZD4qPC9mcm9tLXZpZXctaWQ+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPnN1Y2Nlc3M8L2Zyb20tb3V0Y29tZT4KLQkJCTx0by12aWV3LWlkPi9wYWdlcy9yZXN1bHQueGh0bWw8L3RvLXZpZXctaWQ+Ci0JCTwvbmF2aWdhdGlvbi1jYXNlPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5leGFtcGxlMDE8L2Zyb20tb3V0Y29tZT4KLQkJCTx0by12aWV3LWlkPi9wYWdlcy9ncm91cFZhbGlkYXRpb24wMS54aHRtbDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPmV4YW1wbGUwMjwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L3BhZ2VzL2dyb3VwVmFsaWRhdGlvbjAyLnhodG1sPC90by12aWV3LWlkPgotCQk8L25hdmlnYXRpb24tY2FzZT4KLQkJPG5hdmlnYXRpb24tY2FzZT4KLQkJCTxmcm9tLW91dGNvbWU+ZXhhbXBsZTAzPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vcGFnZXMvbW9kZWxWYWxpZGF0aW9uMDEueGh0bWw8L3RvLXZpZXctaWQ+Ci0JCTwvbmF2aWdhdGlvbi1jYXNlPgotCTwvbmF2aWdhdGlvbi1ydWxlPgotCQotCTwhLS0gbmF2aWdhdGlvbiBydWxlcyBmb3IgcmVzdWx0LnhodG1sIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L3BhZ2VzL3Jlc3VsdC54aHRtbDwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5iYWNrPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vcGFnZXMvaGVsbG9Xb3JsZC54aHRtbDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYjgxYzAuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQl4c2k6c2NoZW1hTG9jYXRpb249IgotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KLQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8IS0tb3B0aW9uYWw6IGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Db21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBVUklzIG9mIChhZGRpdGlvbmFsKSBmYWNlcyBjb25maWcgZmlsZXMuCi0gICAgICAgICAgICAoZS5nLiAvV0VCLUlORi9teS1jb25maWcueG1sKQotICAgICAgICAgICAgU2VlIEpTRiAxLjAgUFJEMiwgMTAuMy4yCi0gICAgICAgICAgICBBdHRlbnRpb246IFlvdSBkbyBub3QgbmVlZCB0byBwdXQgL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBpbiBoZXJlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5DT05GSUdfRklMRVM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0tLT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBTZWUgSlNGIFNwZWNpZmljYXRpb24gMi41LjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIGFtb3VudCAoZGVmYXVsdCA9IDIwKSBvZiB0aGUgbGF0ZXN0IHZpZXdzIGFyZSBzdG9yZWQgaW4gc2Vzc2lvbi48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuTlVNQkVSX09GX1ZJRVdTX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc3RhdGUgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0gYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLgotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KSBhbmQgaWYKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgY29tcHJlc3NlZC48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcGFyYW1ldGVyIHRlbGxzIE15RmFjZXMgaWYgamF2YXNjcmlwdCBjb2RlIHNob3VsZCBiZSBhbGxvd2VkIGluIHRoZQotICAgICAgICAgICAgcmVuZGVyZWQgSFRNTCBvdXRwdXQuCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUKLSAgICAgICAgICAgIHRoYXQgc3VibWl0cyB0aGUgY29ycmVzcG9uZGluZyBmb3JtLgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBub3QgYWxsb3dlZCwgdGhlIHN0YXRlIHNhdmluZyBpbmZvIGFuZCBuZXN0ZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BTExPV19KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuREVURUNUX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgcmVuZGVyZWQgSFRNTCBjb2RlIHdpbGwgYmUgZm9ybWF0dGVkLCBzbyB0aGF0IGl0IGlzICJodW1hbiByZWFkYWJsZSIuCi0gICAgICAgICAgICBpLmUuIGFkZGl0aW9uYWwgbGluZSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIHdpbGwgYmUgd3JpdHRlbiwgdGhhdCBkbyBub3QKLSAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgSFRNTCBjb2RlLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlBSRVRUWV9IVE1MPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlCi0gICAgICAgICAgICBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuIENvbnZlbmllbnQgZmVhdHVyZSBpZiB5b3UgaGF2ZSBwYWdlcwotICAgICAgICAgICAgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGJyb3dzZXIgcGFnZSB0byBhbHdheXMganVtcCB0byB0aGUgdG9wCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuCi0gICAgICAgICAgICBEZWZhdWx0OiAiZmFsc2UiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFVVE9fU0NST0xMPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Vc2VkIGZvciBlbmNyeXB0aW5nIHZpZXcgc3RhdGUuIE9ubHkgcmVsZXZhbnQgZm9yIGNsaWVudCBzaWRlCi0gICAgICAgICAgICBzdGF0ZSBzYXZpbmcuIFNlZSBNeUZhY2VzIHdpa2kvd2ViIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRUNSRVQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWYWxpZGF0ZSBtYW5hZ2VkIGJlYW5zLCBuYXZpZ2F0aW9uIHJ1bGVzIGFuZCBlbnN1cmUgdGhhdCBmb3JtcyBhcmUgbm90IG5lc3RlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlZBTElEQVRFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUcmVhdCByZWFkb25seSBzYW1lIGFzIGlmIGRpc2FibGVkIGF0dHJpYnV0ZSB3YXMgc2V0IGZvciBzZWxlY3QgZWxlbWVudHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5SRUFET05MWV9BU19ESVNBQkxFRF9GT1JfU0VMRUNUUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFVzZSB0aGUgZGVmaW5lZCBjbGFzcyBhcyB0aGUgY2xhc3Mgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiBhIHJlc291cmNlIGlzIGFkZGVkIHRvIHRoZQotICAgICAgICAgICAgRXh0ZW5zaW9uRmlsdGVyIGhhbmRsaW5nLiBVc2luZyBTdHJlYW1pbmdBZGRSZXNvdXJjZSBoZXJlIGhlbHBzIHdpdGggcGVyZm9ybWFuY2UuIElmIHlvdSB3YW50IHRvIGFkZAotICAgICAgICAgICAgY3VzdG9tIGNvbXBvbmVudHMgYW5kIHdhbnQgdG8gdXNlIHRoZSBFeHRlbnNpb25GaWx0ZXIsIHlvdSBuZWVkIHRvIHByb3ZpZGUgeW91ciBjdXN0b20gaW1wbGVtZW50YXRpb24gaGVyZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFERF9SRVNPVVJDRV9DTEFTUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC51dGlsLkRlZmF1bHRBZGRSZXNvdXJjZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAgICAgCi0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmlydHVhbCBwYXRoIGluIHRoZSBVUkwgd2hpY2ggdHJpZ2dlcnMgbG9hZGluZyBvZiByZXNvdXJjZXMgZm9yIHRoZSBNeUZhY2VzIGV4dGVuZGVkIGNvbXBvbmVudHMKLSAgICAgICAgICAgIGluIHRoZSBFeHRlbnNpb25GaWx0ZXIuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5SRVNPVVJDRV9WSVJUVUFMX1BBVEg8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vZmFjZXMvbXlGYWNlc0V4dGVuc2lvblJlc291cmNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIENoZWNrIGlmIHRoZSBleHRlbnNpb25zLWZpbHRlciBoYXMgYmVlbiBwcm9wZXJseSBjb25maWd1cmVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ0hFQ0tfRVhURU5TSU9OU19GSUxURVI8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIERlZmluZSBwYXJ0aWFsIHN0YXRlIHNhdmluZyBhcyB0cnVlL2ZhbHNlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5QQVJUSUFMX1NUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLQotICAgIDwhLS0gTGlzdGVuZXIsIHRvIGFsbG93IEpldHR5IHNlcnZpbmcgTXlGYWNlcyBhcHBzIC0tPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy53ZWJhcHAuU3RhcnR1cFNlcnZsZXRDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZyAtLT4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPiouanNmPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguanNwPC93ZWxjb21lLWZpbGU+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcCBiL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJjMmFjYy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCBwYWdlIHNlc3Npb249ImZhbHNlIiU+Ci08JQotcmVzcG9uc2Uuc2VuZFJlZGlyZWN0KCJwYWdlcy9oZWxsb1dvcmxkLmpzZiIpOwotJT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MzhhMmUuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgeG1sbnM6Yz0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3RsL2NvcmUiPg0KLSAgICA8ZjpmYWNldCBuYW1lPSJtZXRhQ29udGFpbmVyIj4NCi0gICAgICAgIDx0aXRsZT5zZXYtZW4gZmVhdHVyZS1zZXQgZGVtbyAwMTwvdGl0bGU+DQotICAgIDwvZjpmYWNldD4NCi0gICAgPGg6aGVhZD4NCi0gICAgICAgIDx0aXRsZT48dWk6aW5zZXJ0IG5hbWU9InRpdGxlIi8+IDwvdGl0bGU+DQotICAgIDwvaDpoZWFkPg0KLSAgICA8aDpib2R5Pg0KLQ0KLSAgICAgICAgPCEtLSBvcmlnaW5hbCAtLT4NCi0gICAgICAgIDxkaXYgaWQ9IndyYXAiPg0KLQ0KLSAgICAgICAgICAgIDxoOmZvcm0gaWQ9ImZvcm0iPg0KLSAgICAgICAgICAgICAgICA8ZGl2IGlkPSJtYWluIj4NCi0gICAgICAgICAgICAgICAgICAgIDx1aTppbnNlcnQgbmFtZT0iY29udGVudCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idW5kZXJfY29uc3RydWN0aW9uIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPiFzaXRlIHVuZGVyIGNvbnN0cnVjdGlvbiE8L2gyPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgY29udGVudCBvZiB0aGlzIHNpdGUgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgbW9tZW50LjwvcD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgICAgICAgICAgIDwvdWk6aW5zZXJ0Pg0KLSAgICAgICAgICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICAgICAgICA8L2g6Zm9ybT4NCi0gICAgICAgICAgICA8aDptZXNzYWdlcyBnbG9iYWxPbmx5PSJ0cnVlIi8+DQotDQotICAgICAgICA8L2Rpdj4NCi0gICAgPC9oOmJvZHk+DQotDQotDQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL3BhZ2VzL2dyb3VwVmFsaWRhdGlvbjAxLnhodG1sIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvZ3JvdXBWYWxpZGF0aW9uMDEueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMjRjMjUuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvZ3JvdXBWYWxpZGF0aW9uMDEueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08dWk6Y29tcG9zaXRpb24geG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgdGVtcGxhdGU9Ii9sYXlvdXQvdGVtcGxhdGUueGh0bWwiPg0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9InRpdGxlIj5IZWxsbyBXb3JsZDwvdWk6ZGVmaW5lPg0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLSAgICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMyI+DQotICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJmaXJzdF9uYW1lIiB2YWx1ZT0iRmlyc3QgbmFtZSo6Ii8+DQotICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJmaXJzdF9uYW1lIiBsYWJlbD0iRmlyc3QgbmFtZSIgdmFsdWU9IiN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyWydwZXJzb24nXS5maXJzdE5hbWV9Ii8+DQotICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9ImZpcnN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4NCi0NCi0gICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9Imxhc3RfbmFtZSIgdmFsdWU9Ikxhc3QgbmFtZSoqOiIvPg0KLSAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0ibGFzdF9uYW1lIiBsYWJlbD0iTGFzdCBuYW1lIiB2YWx1ZT0iI3toZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIucGVyc29uLmxhc3ROYW1lfSIvPg0KLSAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJsYXN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4NCi0NCi0gICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJQcmVzcyBtZSIgYWN0aW9uPSIje2hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlci5zZW5kfSIvPg0KLSAgICAgICAgICAgIDxmOnZlcmJhdGltLz4NCi0gICAgICAgICAgICA8Zjp2ZXJiYXRpbS8+DQotICAgICAgICAgIDwvaDpwYW5lbEdyaWQ+DQotICAgICAgICA8aDptZXNzYWdlcyBnbG9iYWxPbmx5PSJ0cnVlIiBzaG93RGV0YWlsPSJ0cnVlIiBzaG93U3VtbWFyeT0iZmFsc2UiLz4NCi0NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ncm91cFZhbGlkYXRpb24wMi54aHRtbCBiL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL3BhZ2VzL2dyb3VwVmFsaWRhdGlvbjAyLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTI2YTFkLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL3BhZ2VzL2dyb3VwVmFsaWRhdGlvbjAyLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHVpOmNvbXBvc2l0aW9uIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHRlbXBsYXRlPSIvbGF5b3V0L3RlbXBsYXRlLnhodG1sIj4NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJ0aXRsZSI+SGVsbG8gV29ybGQ8L3VpOmRlZmluZT4NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjMiPg0KLSAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0iZmlyc3RfbmFtZSIgdmFsdWU9IkZpcnN0IG5hbWUqOiIvPg0KLSAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0iZmlyc3RfbmFtZSIgbGFiZWw9IkZpcnN0IG5hbWUiIHZhbHVlPSIje2hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlclsncGVyc29uJ10uZmlyc3ROYW1lfSIvPg0KLSAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJmaXJzdF9uYW1lIiBzaG93U3VtbWFyeT0idHJ1ZSIgc2hvd0RldGFpbD0iZmFsc2UiIGVycm9yU3R5bGU9ImNvbG9yOiByZWQ7IiB3YXJuU3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ii8+DQotDQotICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJsYXN0X25hbWUiIHZhbHVlPSJMYXN0IG5hbWUqKjoiLz4NCi0gICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9Imxhc3RfbmFtZSIgbGFiZWw9Ikxhc3QgbmFtZSIgdmFsdWU9IiN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLnBlcnNvbi5sYXN0TmFtZX0iLz4NCi0gICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0ibGFzdF9uYW1lIiBzaG93U3VtbWFyeT0idHJ1ZSIgc2hvd0RldGFpbD0iZmFsc2UiIGVycm9yU3R5bGU9ImNvbG9yOiByZWQ7IiB3YXJuU3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ii8+DQotDQotICAgICAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiB2YWx1ZT0iUHJlc3MgbWUiIGFjdGlvbj0iI3toZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIuc2VuZH0iLz4NCi0gICAgICAgICAgICA8Zjp2ZXJiYXRpbS8+DQotICAgICAgICAgICAgPGY6dmVyYmF0aW0vPg0KLSAgICAgICAgICA8L2g6cGFuZWxHcmlkPg0KLSAgICAgICAgPGg6bWVzc2FnZXMgZ2xvYmFsT25seT0idHJ1ZSIgc2hvd0RldGFpbD0idHJ1ZSIgc2hvd1N1bW1hcnk9ImZhbHNlIi8+DQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaGVsbG9Xb3JsZC54aHRtbCBiL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hlbGxvV29ybGQueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMzAwNzkuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaGVsbG9Xb3JsZC54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTx1aTpjb21wb3NpdGlvbiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB0ZW1wbGF0ZT0iL2xheW91dC90ZW1wbGF0ZS54aHRtbCI+DQotICAgIDx1aTpkZWZpbmUgbmFtZT0idGl0bGUiPkhlbGxvIFdvcmxkPC91aTpkZWZpbmU+DQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotICAgICAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjMiPg0KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9ImZpcnN0X25hbWUiIHZhbHVlPSJGaXJzdCBuYW1lKjoiLz4NCi0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJmaXJzdF9uYW1lIiBsYWJlbD0iRmlyc3QgbmFtZSIgdmFsdWU9IiN7aGVsbG9Xb3JsZC5wZXJzb24uZmlyc3ROYW1lfSIvPg0KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0iZmlyc3RfbmFtZSIgc2hvd1N1bW1hcnk9ImZhbHNlIiBzaG93RGV0YWlsPSJ0cnVlIiBlcnJvclN0eWxlPSJjb2xvcjogcmVkOyINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuU3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ii8+DQotDQotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0ibGFzdF9uYW1lIiB2YWx1ZT0iTGFzdCBuYW1lKio6Ii8+DQotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0ibGFzdF9uYW1lIiBsYWJlbD0iTGFzdCBuYW1lIiB2YWx1ZT0iI3toZWxsb1dvcmxkLnBlcnNvbi5sYXN0TmFtZX0iLz4NCi0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9Imxhc3RfbmFtZSIgc2hvd1N1bW1hcnk9ImZhbHNlIiBzaG93RGV0YWlsPSJ0cnVlIiBlcnJvclN0eWxlPSJjb2xvcjogcmVkOyINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuU3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ii8+DQotDQotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Xb3JsZC5zZW5kfSIvPg0KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4NCi0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+DQotICAgICAgICAgICAgPC9oOnBhbmVsR3JpZD4NCi0NCi0gICAgICAgICAgICA8aHIvPg0KLSAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIHZhbHVlPSJncm91cCB2YWxpZGF0aW9uIGV4YW1wbGUgMSIgYWN0aW9uPSJleGFtcGxlMDEiIGltbWVkaWF0ZT0idHJ1ZSIvPjxici8+DQotICAgICAgICAgICAgPGg6Y29tbWFuZExpbmsgdmFsdWU9Imdyb3VwIHZhbGlkYXRpb24gZXhhbXBsZSAyIiBhY3Rpb249ImV4YW1wbGUwMiIgaW1tZWRpYXRlPSJ0cnVlIi8+PGJyLz4NCi0gICAgICAgICAgICA8aDpjb21tYW5kTGluayB2YWx1ZT0ibW9kZWwgdmFsaWRhdGlvbiBleGFtcGxlIDEiIGFjdGlvbj0iZXhhbXBsZTAzIiBpbW1lZGlhdGU9InRydWUiLz48YnIvPg0KLSAgICAgICAgPGhyLz4NCi0gICAgICAgICogbm9uIGJsb2NraW5nIHdhcm4gbW9kZTxici8+DQotICAgICAgICAqKiBibG9ja2luZyBlcnJvciBtb2RlDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9tb2RlbFZhbGlkYXRpb24wMS54aHRtbCBiL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL3BhZ2VzL21vZGVsVmFsaWRhdGlvbjAxLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTE1ZTY1Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL3BhZ2VzL21vZGVsVmFsaWRhdGlvbjAxLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHVpOmNvbXBvc2l0aW9uIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHRlbXBsYXRlPSIvbGF5b3V0L3RlbXBsYXRlLnhodG1sIj4NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJ0aXRsZSI+SGVsbG8gV29ybGQ8L3VpOmRlZmluZT4NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjMiPg0KLSAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0iZmlyc3RfbmFtZSIgdmFsdWU9IkZpcnN0IG5hbWUqOiIvPg0KLSAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0iZmlyc3RfbmFtZSIgbGFiZWw9IkZpcnN0IG5hbWUiIHZhbHVlPSIje2hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlclsncGVyc29uJ10uZmlyc3ROYW1lfSIvPg0KLSAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJmaXJzdF9uYW1lIiBzaG93U3VtbWFyeT0idHJ1ZSIgc2hvd0RldGFpbD0iZmFsc2UiIGVycm9yU3R5bGU9ImNvbG9yOiByZWQ7IiB3YXJuU3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ii8+DQotDQotICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJsYXN0X25hbWUiIHZhbHVlPSJMYXN0IG5hbWUqKjoiLz4NCi0gICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9Imxhc3RfbmFtZSIgbGFiZWw9Ikxhc3QgbmFtZSIgdmFsdWU9IiN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLnBlcnNvbi5sYXN0TmFtZX0iLz4NCi0gICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0ibGFzdF9uYW1lIiBzaG93U3VtbWFyeT0idHJ1ZSIgc2hvd0RldGFpbD0iZmFsc2UiIGVycm9yU3R5bGU9ImNvbG9yOiByZWQ7IiB3YXJuU3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ii8+DQotDQotICAgICAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiB2YWx1ZT0iUHJlc3MgbWUiIGFjdGlvbj0iI3toZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIuc2VuZH0iLz4NCi0gICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4NCi0gICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4NCi0gICAgICAgICAgPC9oOnBhbmVsR3JpZD4NCi0gICAgICAgIDxoOm1lc3NhZ2VzIGdsb2JhbE9ubHk9InRydWUiIHNob3dEZXRhaWw9InRydWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIvPg0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL3BhZ2VzL3Jlc3VsdC54aHRtbCBiL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL3BhZ2VzL3Jlc3VsdC54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJkZWI0ZS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZXN1bHQueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08dWk6Y29tcG9zaXRpb24geG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgdGVtcGxhdGU9Ii9sYXlvdXQvdGVtcGxhdGUueGh0bWwiPg0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9InRpdGxlIj5IZWxsbyBXb3JsZDwvdWk6ZGVmaW5lPg0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLSAgICAgICAgICAgIDxoMj48aDpvdXRwdXRUZXh0DQotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iSGVsbG8gI3toZWxsb1dvcmxkLnBlcnNvbi5maXJzdE5hbWV9ICN7aGVsbG9Xb3JsZC5wZXJzb24ubGFzdE5hbWV9I3toZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIucGVyc29uLmZpcnN0TmFtZX0gI3toZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIucGVyc29uLmxhc3ROYW1lfS4gV2UgaG9wZSB5b3UgZW5qb3kgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IhIi8+DQotICAgICAgICAgICAgPC9oMj4NCi0gICAgICAgICAgICA8aDpjb21tYW5kTGluayBhY3Rpb249ImJhY2siPg0KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRUZXh0IHZhbHVlPSJIb21lIi8+DQotICAgICAgICAgICAgPC9oOmNvbW1hbmRMaW5rPg0KLSAgICAgICAgPGg6bWVzc2FnZXMgZ2xvYmFsT25seT0idHJ1ZSIgc2hvd0RldGFpbD0idHJ1ZSIgc2hvd1N1bW1hcnk9ImZhbHNlIi8+DQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3BvbS54bWwgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fd29ybGQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg4MTllZi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fd29ybGQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1oZWxsb193b3JsZDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBoZWxsbyB3b3JsZDwvbmFtZT4NCi0gICAgPHZlcnNpb24+Mi4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+Mi4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC40LVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIA0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qc3RsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzdGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4gICAgICAgIA0KLQ0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NDU2ZjEuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbms7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluLlBlcnNvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmJlYW4uTWFuYWdlZEJlYW47Ci1pbXBvcnQgamF2YXguZmFjZXMuYmVhbi5SZXF1ZXN0U2NvcGVkOwotCi0vKioKLSAqIEEgdHlwaWNhbCBzaW1wbGUgYmFja2luZyBiZWFuLCB0aGF0IGlzIGJhY2tlZCB0byA8Y29kZT5oZWxsb3dvcmxkLmpzcDwvY29kZT4KLSAqIAotICovCi1ATWFuYWdlZEJlYW4obmFtZSA9ICJoZWxsb1dvcmxkIikKLUBSZXF1ZXN0U2NvcGVkCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZENvbnRyb2xsZXIKLXsKLSAgICBwcml2YXRlIFBlcnNvbiBwZXJzb24gPSBuZXcgUGVyc29uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBkZWZhdWx0IGVtcHR5IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIEhlbGxvV29ybGRDb250cm9sbGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHRoYXQgaXMgYmFja2VkIHRvIGEgc3VibWl0IGJ1dHRvbiBvZiBhIGZvcm0uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBzZW5kKCkKLSAgICB7Ci0gICAgICAgIC8vZG8gcmVhbCBsb2dpYywgcmV0dXJuIGEgc3RyaW5nIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgdGhlIG5hdmlnYXRpb24gc3lzdGVtIG9mIEpTRgotICAgICAgICByZXR1cm4gInN1Y2Nlc3MiOwotICAgIH0KLQotICAgIHB1YmxpYyBQZXJzb24gZ2V0UGVyc29uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwZXJzb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbiBwZXJzb24pCi0gICAgewotICAgICAgICB0aGlzLnBlcnNvbiA9IHBlcnNvbjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMDc2Y2MuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5kb21haW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5OwotCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOwotCi1wdWJsaWMgY2xhc3MgUGVyc29uCi17Ci0gICAgLy9oZWxsbyB3b3JsZCBkZW1vCi0gICAgQFJlcXVpcmVkKHBhcmFtZXRlcnMgPSBWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzKQotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsKLQotICAgIC8vZGVtbyBmb3IganBhIGJhc2VkIHZhbGlkYXRpb24gc3VwcG9ydAotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTAgLyouLi4qLykKLSAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaXJzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsYXN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMxNzMwOC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGZhY2VzLWNvbmZpZyB2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzJfMC54c2QiPgotCQotCTwhLS0gbmF2aWdhdGlvbiBydWxlcyBmb3IgaGVsbG9Xb3JsZC54aHRtbCAtLT4KLQk8bmF2aWdhdGlvbi1ydWxlPgotCQk8ZnJvbS12aWV3LWlkPi9wYWdlcy9oZWxsb1dvcmxkLnhodG1sPC9mcm9tLXZpZXctaWQ+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPnN1Y2Nlc3M8L2Zyb20tb3V0Y29tZT4KLQkJCTx0by12aWV3LWlkPi9wYWdlcy9wYWdlMi54aHRtbDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0JCi0JPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciBwYWdlMi54aHRtbCAtLT4KLQk8bmF2aWdhdGlvbi1ydWxlPgotCQk8ZnJvbS12aWV3LWlkPi9wYWdlcy9wYWdlMi54aHRtbDwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5iYWNrPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vcGFnZXMvaGVsbG9Xb3JsZC54aHRtbDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWI4MWMwLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQl4c2k6c2NoZW1hTG9jYXRpb249IgotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KLQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8IS0tb3B0aW9uYWw6IGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Db21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBVUklzIG9mIChhZGRpdGlvbmFsKSBmYWNlcyBjb25maWcgZmlsZXMuCi0gICAgICAgICAgICAoZS5nLiAvV0VCLUlORi9teS1jb25maWcueG1sKQotICAgICAgICAgICAgU2VlIEpTRiAxLjAgUFJEMiwgMTAuMy4yCi0gICAgICAgICAgICBBdHRlbnRpb246IFlvdSBkbyBub3QgbmVlZCB0byBwdXQgL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBpbiBoZXJlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5DT05GSUdfRklMRVM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0tLT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBTZWUgSlNGIFNwZWNpZmljYXRpb24gMi41LjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIGFtb3VudCAoZGVmYXVsdCA9IDIwKSBvZiB0aGUgbGF0ZXN0IHZpZXdzIGFyZSBzdG9yZWQgaW4gc2Vzc2lvbi48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuTlVNQkVSX09GX1ZJRVdTX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc3RhdGUgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0gYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLgotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KSBhbmQgaWYKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgY29tcHJlc3NlZC48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcGFyYW1ldGVyIHRlbGxzIE15RmFjZXMgaWYgamF2YXNjcmlwdCBjb2RlIHNob3VsZCBiZSBhbGxvd2VkIGluIHRoZQotICAgICAgICAgICAgcmVuZGVyZWQgSFRNTCBvdXRwdXQuCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUKLSAgICAgICAgICAgIHRoYXQgc3VibWl0cyB0aGUgY29ycmVzcG9uZGluZyBmb3JtLgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBub3QgYWxsb3dlZCwgdGhlIHN0YXRlIHNhdmluZyBpbmZvIGFuZCBuZXN0ZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BTExPV19KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuREVURUNUX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgcmVuZGVyZWQgSFRNTCBjb2RlIHdpbGwgYmUgZm9ybWF0dGVkLCBzbyB0aGF0IGl0IGlzICJodW1hbiByZWFkYWJsZSIuCi0gICAgICAgICAgICBpLmUuIGFkZGl0aW9uYWwgbGluZSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIHdpbGwgYmUgd3JpdHRlbiwgdGhhdCBkbyBub3QKLSAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgSFRNTCBjb2RlLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlBSRVRUWV9IVE1MPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlCi0gICAgICAgICAgICBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuIENvbnZlbmllbnQgZmVhdHVyZSBpZiB5b3UgaGF2ZSBwYWdlcwotICAgICAgICAgICAgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGJyb3dzZXIgcGFnZSB0byBhbHdheXMganVtcCB0byB0aGUgdG9wCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuCi0gICAgICAgICAgICBEZWZhdWx0OiAiZmFsc2UiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFVVE9fU0NST0xMPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Vc2VkIGZvciBlbmNyeXB0aW5nIHZpZXcgc3RhdGUuIE9ubHkgcmVsZXZhbnQgZm9yIGNsaWVudCBzaWRlCi0gICAgICAgICAgICBzdGF0ZSBzYXZpbmcuIFNlZSBNeUZhY2VzIHdpa2kvd2ViIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRUNSRVQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWYWxpZGF0ZSBtYW5hZ2VkIGJlYW5zLCBuYXZpZ2F0aW9uIHJ1bGVzIGFuZCBlbnN1cmUgdGhhdCBmb3JtcyBhcmUgbm90IG5lc3RlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlZBTElEQVRFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUcmVhdCByZWFkb25seSBzYW1lIGFzIGlmIGRpc2FibGVkIGF0dHJpYnV0ZSB3YXMgc2V0IGZvciBzZWxlY3QgZWxlbWVudHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5SRUFET05MWV9BU19ESVNBQkxFRF9GT1JfU0VMRUNUUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFVzZSB0aGUgZGVmaW5lZCBjbGFzcyBhcyB0aGUgY2xhc3Mgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiBhIHJlc291cmNlIGlzIGFkZGVkIHRvIHRoZQotICAgICAgICAgICAgRXh0ZW5zaW9uRmlsdGVyIGhhbmRsaW5nLiBVc2luZyBTdHJlYW1pbmdBZGRSZXNvdXJjZSBoZXJlIGhlbHBzIHdpdGggcGVyZm9ybWFuY2UuIElmIHlvdSB3YW50IHRvIGFkZAotICAgICAgICAgICAgY3VzdG9tIGNvbXBvbmVudHMgYW5kIHdhbnQgdG8gdXNlIHRoZSBFeHRlbnNpb25GaWx0ZXIsIHlvdSBuZWVkIHRvIHByb3ZpZGUgeW91ciBjdXN0b20gaW1wbGVtZW50YXRpb24gaGVyZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFERF9SRVNPVVJDRV9DTEFTUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC51dGlsLkRlZmF1bHRBZGRSZXNvdXJjZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAgICAgCi0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmlydHVhbCBwYXRoIGluIHRoZSBVUkwgd2hpY2ggdHJpZ2dlcnMgbG9hZGluZyBvZiByZXNvdXJjZXMgZm9yIHRoZSBNeUZhY2VzIGV4dGVuZGVkIGNvbXBvbmVudHMKLSAgICAgICAgICAgIGluIHRoZSBFeHRlbnNpb25GaWx0ZXIuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5SRVNPVVJDRV9WSVJUVUFMX1BBVEg8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vZmFjZXMvbXlGYWNlc0V4dGVuc2lvblJlc291cmNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIENoZWNrIGlmIHRoZSBleHRlbnNpb25zLWZpbHRlciBoYXMgYmVlbiBwcm9wZXJseSBjb25maWd1cmVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ0hFQ0tfRVhURU5TSU9OU19GSUxURVI8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIERlZmluZSBwYXJ0aWFsIHN0YXRlIHNhdmluZyBhcyB0cnVlL2ZhbHNlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5QQVJUSUFMX1NUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLQotICAgIDwhLS0gTGlzdGVuZXIsIHRvIGFsbG93IEpldHR5IHNlcnZpbmcgTXlGYWNlcyBhcHBzIC0tPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy53ZWJhcHAuU3RhcnR1cFNlcnZsZXRDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZyAtLT4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPiouanNmPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguanNwPC93ZWxjb21lLWZpbGU+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzJhY2MuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCBwYWdlIHNlc3Npb249ImZhbHNlIiU+Ci08JQotcmVzcG9uc2Uuc2VuZFJlZGlyZWN0KCJwYWdlcy9oZWxsb1dvcmxkLmpzZiIpOwotJT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbCBiL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTM4YTJlLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgeG1sbnM6Yz0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3RsL2NvcmUiPg0KLSAgICA8ZjpmYWNldCBuYW1lPSJtZXRhQ29udGFpbmVyIj4NCi0gICAgICAgIDx0aXRsZT5zZXYtZW4gZmVhdHVyZS1zZXQgZGVtbyAwMTwvdGl0bGU+DQotICAgIDwvZjpmYWNldD4NCi0gICAgPGg6aGVhZD4NCi0gICAgICAgIDx0aXRsZT48dWk6aW5zZXJ0IG5hbWU9InRpdGxlIi8+IDwvdGl0bGU+DQotICAgIDwvaDpoZWFkPg0KLSAgICA8aDpib2R5Pg0KLQ0KLSAgICAgICAgPCEtLSBvcmlnaW5hbCAtLT4NCi0gICAgICAgIDxkaXYgaWQ9IndyYXAiPg0KLQ0KLSAgICAgICAgICAgIDxoOmZvcm0gaWQ9ImZvcm0iPg0KLSAgICAgICAgICAgICAgICA8ZGl2IGlkPSJtYWluIj4NCi0gICAgICAgICAgICAgICAgICAgIDx1aTppbnNlcnQgbmFtZT0iY29udGVudCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idW5kZXJfY29uc3RydWN0aW9uIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPiFzaXRlIHVuZGVyIGNvbnN0cnVjdGlvbiE8L2gyPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgY29udGVudCBvZiB0aGlzIHNpdGUgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgbW9tZW50LjwvcD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgICAgICAgICAgIDwvdWk6aW5zZXJ0Pg0KLSAgICAgICAgICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICAgICAgICA8L2g6Zm9ybT4NCi0gICAgICAgICAgICA8aDptZXNzYWdlcyBnbG9iYWxPbmx5PSJ0cnVlIi8+DQotDQotICAgICAgICA8L2Rpdj4NCi0gICAgPC9oOmJvZHk+DQotDQotDQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaGVsbG9Xb3JsZC54aHRtbCBiL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaGVsbG9Xb3JsZC54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0NjFkOS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hlbGxvV29ybGQueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08dWk6Y29tcG9zaXRpb24geG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICB0ZW1wbGF0ZT0iL2xheW91dC90ZW1wbGF0ZS54aHRtbCI+DQotICAgPHVpOmRlZmluZSBuYW1lPSJ0aXRsZSI+SGVsbG8gV29ybGQ8L3VpOmRlZmluZT4NCi0gICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMyI+DQotICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJmaXJzdF9uYW1lIiB2YWx1ZT0iRmlyc3QgbmFtZSo6Ii8+DQotICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJmaXJzdF9uYW1lIiBsYWJlbD0iRmlyc3QgbmFtZSIgdmFsdWU9IiN7aGVsbG9Xb3JsZC5wZXJzb24uZmlyc3ROYW1lfSIvPg0KLSAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJmaXJzdF9uYW1lIiBzaG93U3VtbWFyeT0iZmFsc2UiIHNob3dEZXRhaWw9InRydWUiIGVycm9yU3R5bGU9ImNvbG9yOiByZWQ7IiB3YXJuU3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ii8+DQotDQotICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJsYXN0X25hbWUiIHZhbHVlPSJMYXN0IG5hbWUqKjoiLz4NCi0gICAgICAgICA8aDppbnB1dFRleHQgaWQ9Imxhc3RfbmFtZSIgbGFiZWw9Ikxhc3QgbmFtZSIgdmFsdWU9IiN7aGVsbG9Xb3JsZC5wZXJzb24ubGFzdE5hbWV9Ii8+DQotICAgICAgICAgPGg6bWVzc2FnZSBmb3I9Imxhc3RfbmFtZSIgc2hvd1N1bW1hcnk9ImZhbHNlIiBzaG93RGV0YWlsPSJ0cnVlIiBlcnJvclN0eWxlPSJjb2xvcjogcmVkOyIgd2FyblN0eWxlPSJjb2xvcjogb3JhbmdlOyIvPg0KLQ0KLSAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Xb3JsZC5zZW5kfSIvPg0KLSAgICAgICAgIDxmOnZlcmJhdGltLz4NCi0gICAgICAgICA8Zjp2ZXJiYXRpbS8+DQotICAgICAgIDwvaDpwYW5lbEdyaWQ+DQotICAgICAgICA8aHIvPg0KLSAgICAgICAgKiBub25lIGJsb2NraW5nIHdhcm4gbW9kZTxici8+DQotICAgICAgICAqKiBibG9ja2luZyBlcnJvciBtb2RlCSAgIA0KLSAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9wYWdlMi54aHRtbCBiL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcGFnZTIueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNmQ2MjIuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9wYWdlMi54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTx1aTpjb21wb3NpdGlvbiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgIHRlbXBsYXRlPSIvbGF5b3V0L3RlbXBsYXRlLnhodG1sIj4NCi0gICA8dWk6ZGVmaW5lIG5hbWU9InRpdGxlIj5IZWxsbyBXb3JsZDwvdWk6ZGVmaW5lPg0KLSAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotICAgICAgIDxoMj48aDpvdXRwdXRUZXh0IHZhbHVlPSJIZWxsbyAje2hlbGxvV29ybGQucGVyc29uLmZpcnN0TmFtZX0gI3toZWxsb1dvcmxkLnBlcnNvbi5sYXN0TmFtZX0uIFdlIGhvcGUgeW91IGVuam95IEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yISIvPjwvaDI+DQotICAgICAgIDxoOmNvbW1hbmRMaW5rIGFjdGlvbj0iYmFjayIgdmFsdWU9IkhvbWUiLz4NCi0NCi0gICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9leGFtcGxlcy9wb20ueG1sIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMjRmNzQuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgcHJvamVjdDwvbmFtZT4NCi0gICAgPHZlcnNpb24+Mi4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4yLjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxzY20+DQotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy9icmFuY2hfZm9yX2pzZl8yXzAvZXhhbXBsZXM8L2Nvbm5lY3Rpb24+DQotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzPC9kZXZlbG9wZXJDb25uZWN0aW9uPg0KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMl8wL2V4YW1wbGVzPC91cmw+DQotICAgIDwvc2NtPg0KLQ0KLSAgICA8cmVwb3NpdG9yaWVzPg0KLSAgICAgICAgPHJlcG9zaXRvcnk+DQotICAgICAgICAgICAgPGlkPmpib3NzPC9pZD4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvc2l0b3J5Lmpib3NzLmNvbS9tYXZlbjI8L3VybD4NCi0gICAgICAgICAgICA8cmVsZWFzZXM+DQotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+DQotICAgICAgICAgICAgPC9yZWxlYXNlcz4NCi0gICAgICAgICAgICA8c25hcHNob3RzPg0KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4NCi0gICAgICAgICAgICA8L3NuYXBzaG90cz4NCi0gICAgICAgIDwvcmVwb3NpdG9yeT4NCi0gICAgPC9yZXBvc2l0b3JpZXM+DQotICAgIA0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8IS0tVGhpcyBwbHVnaW4gYWxsb3dzIHRvIHJ1biB0aGUgZXhhbXBsZSB1c2luZyBtdm4gamV0dHk6cnVuIC0tPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamV0dHktcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj42LjEuODwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8c2NhbkludGVydmFsU2Vjb25kcz4xMDwvc2NhbkludGVydmFsU2Vjb25kcz4NCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLSAgICA8bW9kdWxlcz4NCi0gICAgICAgIDxtb2R1bGU+aGVsbG9fd29ybGQ8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+aGVsbG9fYmVhbi12YWxpZGF0aW9uPC9tb2R1bGU+DQotICAgICAgICA8IS0tbW9kdWxlPmZlYXR1cmUtc2V0XzAxPC9tb2R1bGUtLT4NCi0gICAgICAgIDwhLS1tb2R1bGU+ZmVhdHVyZS1zZXRfMDI8L21vZHVsZS0tPg0KLSAgICA8L21vZHVsZXM+DQotDQotICAgIDxwcm9maWxlcz4NCi0gICAgICAgIDwhLS0gVGhpcyBwcm9maWxlIGlzIGludm9rZWQgYnkgLURwcmVwYXJlUmVsZWFzZT10cnVlLiAgVGhpcyBhbGxvd3MgbXZuIHJlbGVhc2U6cHJlcGFyZSB0bw0KLSAgICAgICAgICAgIHJ1biBzdWNjZXNzZnVsbHkgb24gdGhlIGFzc2VtYmx5IHByb2plY3RzLiAtLT4NCi0gICAgICAgIDxwcm9maWxlPg0KLSAgICAgICAgICAgIDxpZD5wcmVwYXJlLXJlbGVhc2U8L2lkPg0KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPg0KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+DQotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wcmVwYXJlUmVsZWFzZTwvbmFtZT4NCi0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8L2FjdGl2YXRpb24+DQotICAgICAgICAgICAgPG1vZHVsZXM+DQotICAgICAgICAgICAgICAgIDxtb2R1bGU+YXNzZW1ibHk8L21vZHVsZT4NCi0gICAgICAgICAgICA8L21vZHVsZXM+DQotICAgICAgICAgICAgPGJ1aWxkPg0KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVsZWFzZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+LURwcmVwYXJlUmVsZWFzZTwvYXJndW1lbnRzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+DQotICAgICAgICAgICAgPC9idWlsZD4NCi0gICAgICAgIDwvcHJvZmlsZT4NCi0gICAgPC9wcm9maWxlcz4NCi0NCi0gICAgPHByb3BlcnRpZXM+DQotICAgICAgICA8dHJpbmlkYWQudmVyc2lvbj4yLjAuMC1hbHBoYS0yPC90cmluaWRhZC52ZXJzaW9uPg0KLSAgICA8L3Byb3BlcnRpZXM+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9wYXJlbnQvTElDRU5TRS50eHQgYi9icmFuY2hfZm9yX2pzZl8yXzAvcGFyZW50L0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWI1MjQ4Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9wYXJlbnQvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KLQ0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUw0KLQ0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4NCi0NCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZw0KLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSINCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQ0KLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlDQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhDQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQ0KLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcg0KLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4NCi0NCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0NCi0NCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvcGFyZW50L05PVElDRS50eHQgYi9icmFuY2hfZm9yX2pzZl8yXzAvcGFyZW50L05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3BhcmVudC9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3BhcmVudC9wb20ueG1sIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3BhcmVudC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjRiOWI4Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9wYXJlbnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPCEtLQ0KLSAgLSBQYXJlbnQgcG9tIG9mIGFsbCB0aGUgbXlmYWNlcyBleHRlbnNpb25zIHZhbGlkYXRvciBzdWJwcm9qZWN0cyANCi0gICAgdGhhdCBoZWxwIHRvIGJ1aWxkIG90aGVyIG15ZmFjZXMgcHJvamVjdHMuDQotICAtLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj45PC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQotICAgIDx2ZXJzaW9uPjIuMC40LVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBQcm9qZWN0IFBhcmVudDwvbmFtZT4NCi0gICAgPHVybD5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMjA8L3VybD4NCi0NCi0gICAgPGlzc3VlTWFuYWdlbWVudD4NCi0gICAgICAgIDxzeXN0ZW0+amlyYTwvc3lzdGVtPg0KLSAgICAgICAgPHVybD5odHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvRVhUVkFMPC91cmw+DQotICAgIDwvaXNzdWVNYW5hZ2VtZW50Pg0KLQ0KLSAgICA8Y2lNYW5hZ2VtZW50Pg0KLSAgICAgICAgPHN5c3RlbT5jb250aW51dW08L3N5c3RlbT4NCi0gICAgICAgIDx1cmw+aHR0cDovL215ZmFjZXMuem9uZXMuYXBhY2hlLm9yZzo4MDgwL2NvbnRpbnV1bTwvdXJsPg0KLSAgICAgICAgPG5vdGlmaWVycz4NCi0gICAgICAgICAgICA8bm90aWZpZXI+DQotICAgICAgICAgICAgICAgIDx0eXBlPm1haWw8L3R5cGU+DQotICAgICAgICAgICAgICAgIDxzZW5kT25TdWNjZXNzPnRydWU8L3NlbmRPblN1Y2Nlc3M+DQotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGFkZHJlc3M+Y29tbWl0c0BteWZhY2VzLmFwYWNoZS5vcmc8L2FkZHJlc3M+DQotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICA8L25vdGlmaWVyPg0KLSAgICAgICAgPC9ub3RpZmllcnM+DQotICAgIDwvY2lNYW5hZ2VtZW50Pg0KLSAgICANCi0gICAgPGluY2VwdGlvblllYXI+MjAwODwvaW5jZXB0aW9uWWVhcj4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfTwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD5NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgIDwvcmVzb3VyY2VzPg0KLQ0KLSAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+DQotICAgICAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGFyY2hpdmU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFuaWZlc3Q+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICA8L3BsdWdpbnM+DQotICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+DQotDQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8IS0tDQotICAgICAgICAgICAgICAgICAgICAtIENvcHkgTElDRU5TRS50eHQgYW5kIE5PVElDRS50eHQgc28gdGhhdCB0aGV5IGFyZSBpbmNsdWRlZA0KLSAgICAgICAgICAgICAgICAgICAgLSBpbiB0aGUgLWphdmFkb2MgamFyIGZpbGUgZm9yIHRoZSBjb21wb25lbnQuDQotICAgICAgICAgICAgICAgIC0tPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+amF2YWRvYy5yZXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1zb3VyY2VzPC9waGFzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vYXBpZG9jcy9NRVRBLUlORiI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTElDRU5TRS50eHQiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik5PVElDRS50eHQiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+amF2YWRvYy5zaXRlLmNvcHk8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5zaXRlPC9waGFzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENvcHkgamF2YWRvYyB0byBhbm90aGVyIGRpcmVjdG9yeSwgdG8ga2VlcCBqYXZhZG9jIG9mIHByZXZpb3VzIHZlcnNpb25zIG9uIHNpdGUgLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc2l0ZS9hcGlkb2NzLSR7cHJvamVjdC52ZXJzaW9ufSIgZmFpbG9uZXJyb3I9ImZhbHNlIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zaXRlL2FwaWRvY3MiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgIDwhLS0NCi0gICAgICAgICAgICAgICAgLSBNYWtlIGEgY2hlY2tzdHlsZSB2aW9sYXRpb24gYSBjb21waWxlIGVycm9yLiBOb3RlIHRoYXQgaWYgYSBjb21waWxlIGVycm9yIG9jY3VycywNCi0gICAgICAgICAgICAgICAgLSBmdXJ0aGVyIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0YXJnZXQvc2l0ZS9jaGVja3N0eWxlLmh0bWwgKHByZXNlbnQgZXZlbiB3aGVuDQotICAgICAgICAgICAgICAgIC0ganVzdCB0aGUgY29tcGlsZSBnb2FsIGFuZCBub3QgdGhlIHNpdGUgZ29hbCBoYXMgYmVlbiBydW4pLiBOb3RlIGFsc28gdGhhdCBjaGlsZA0KLSAgICAgICAgICAgICAgICAtIHByb2plY3RzIG1heSByZWRlY2xhcmUgdGhpcyBwbHVnaW4gYW5kIHByb3ZpZGUgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MNCi0gICAgICAgICAgICAgICAgLSB0byB1c2UgZGlmZmVyZW50IGNoZWNrcyAobW9yZSBvciBsZXNzIHN0cmljdCB0aGFuIHRoZSBkZWZhdWx0KS4NCi0gICAgICAgICAgICAtLT4NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+dmVyaWZ5LXN0eWxlPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNoZWNrPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxjb25maWdMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0YW5kYXJkLnhtbDwvY29uZmlnTG9jYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8aGVhZGVyTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWhlYWRlci50eHQ8L2hlYWRlckxvY2F0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICAgICAgDQotDQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPCEtLSBTZXQgY29tcGlsZSBzb3VyY2UgYXQgMS41LCBzaW5jZSB0aGUgdGFyZ2V0IEpTRiBpbXBsIGlzIDIuMCAtLT4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4NCi0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+DQotICAgICAgICAgICAgICAgICAgICA8b3B0aW1pemU+ZmFsc2U8L29wdGltaXplPg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+ICAgICAgICAgICAgDQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotICAgIDxyZXBvc2l0b3JpZXM+DQotICAgICAgICA8cmVwb3NpdG9yeT4NCi0gICAgICAgICAgICA8aWQ+bWF2ZW4yLXJlcG9zaXRvcnkuZGV2LmphdmEubmV0PC9pZD4NCi0gICAgICAgICAgICA8bmFtZT5KYXZhLm5ldCBSZXBvc2l0b3J5IGZvciBNYXZlbjwvbmFtZT4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9kb3dubG9hZC5qYXZhLm5ldC9tYXZlbi8yLzwvdXJsPg0KLSAgICAgICAgICAgIDxsYXlvdXQ+ZGVmYXVsdDwvbGF5b3V0Pg0KLSAgICAgICAgPC9yZXBvc2l0b3J5Pg0KLSAgICA8L3JlcG9zaXRvcmllcz4NCi0NCi0gICAgPHJlcG9ydGluZz4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tanhyLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXJlcG9ydC1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4zPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3QtaW5mby1yZXBvcnRzLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcG1kLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxydWxlc2V0cz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvYmFzaWMueG1sPC9ydWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxydWxlc2V0Pi9ydWxlc2V0cy91bnVzZWRjb2RlLnhtbDwvcnVsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgIDwvcnVsZXNldHM+DQotICAgICAgICAgICAgICAgICAgICA8bGlua1hyZWY+dHJ1ZTwvbGlua1hyZWY+DQotICAgICAgICAgICAgICAgICAgICA8bWluaW11bVRva2Vucz4xMDA8L21pbmltdW1Ub2tlbnM+DQotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0SmRrPjEuNTwvdGFyZ2V0SmRrPg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGVja3N0eWxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxjb25maWdMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0YW5kYXJkLnhtbDwvY29uZmlnTG9jYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8aGVhZGVyTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWhlYWRlci50eHQ8L2hlYWRlckxvY2F0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvcmVwb3J0aW5nPg0KLQ0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMl8wL3BhcmVudDwvY29ubmVjdGlvbj4NCi0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy9icmFuY2hfZm9yX2pzZl8yXzAvcGFyZW50PC9kZXZlbG9wZXJDb25uZWN0aW9uPg0KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMl8wL3BhcmVudDwvdXJsPg0KLSAgICA8L3NjbT4NCi0NCi0gICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+DQotICAgICAgICA8c2l0ZT4NCi0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPg0KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjIwPC91cmw+DQotICAgICAgICA8L3NpdGU+DQotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4NCi0NCi0gICAgPHByb2ZpbGVzPg0KLSAgICAgICAgPHByb2ZpbGU+DQotICAgICAgICAgICAgPGlkPmdlbmVyYXRlLWFzc2VtYmx5PC9pZD4NCi0gICAgICAgICAgICA8YWN0aXZhdGlvbj4NCi0gICAgICAgICAgICAgICAgPHByb3BlcnR5Pg0KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+cGVyZm9ybVJlbGVhc2U8L25hbWU+DQotICAgICAgICAgICAgICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+DQotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPg0KLSAgICAgICAgICAgIDxidWlsZD4NCi0gICAgICAgICAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvY3M8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+DQotICAgICAgICAgICAgPC9idWlsZD4NCi0gICAgICAgIDwvcHJvZmlsZT4NCi0gICAgPC9wcm9maWxlcz4NCi0NCi0gICAgPHByb3BlcnRpZXM+DQotICAgICAgICA8anNmLnZlcnNpb24+Mi4wLjE8L2pzZi52ZXJzaW9uPg0KLSAgICA8L3Byb3BlcnRpZXM+DQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL2JyYW5jaF9mb3JfanNmXzJfMC9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI1ZmJjNS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSAtLS0tLS0NCi1PdmVydmlldw0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDIuMA0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS54IGFuZCBKU0YgMi54LiBBbGwgdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsNCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvcGFyZW50L3NyYy9zaXRlL2FwdC9qYXZhZG9jLmFwdCBiL2JyYW5jaF9mb3JfanNmXzJfMC9wYXJlbnQvc3JjL3NpdGUvYXB0L2phdmFkb2MuYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTU5YzAxLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC9wYXJlbnQvc3JjL3NpdGUvYXB0L2phdmFkb2MuYXB0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0gLS0tLS0tDQotSmF2YWRvYw0KLSAtLS0tLS0NCi0NCi1KYXZhZG9jDQotDQotICAgIEhlcmUgeW91IGNhbiBmaW5kIHRoZSBqYXZhZG9jIG9mIHByZXZpb3VzIGV4dHZhbCB2ZXJzaW9ucy4NCi0NCi0gICAgKiB7e3todHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMjAvbXlmYWNlcy1leHR2YWwtY29yZS9hcGlkb2NzLTIuMC4zL2luZGV4Lmh0bWx9TXlmYWNlcyBFeHRWYWwgQ29yZSBWZXJzaW9uIDIuMC4zfX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvcGFyZW50L3NyYy9zaXRlL3NpdGUueG1sIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3BhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5ZjFmNS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvcGFyZW50L3NyYy9zaXRlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pg0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxwcm9qZWN0IG5hbWU9IkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIj4NCi0gIDxiYW5uZXJMZWZ0Pg0KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRWYWw8L25hbWU+DQotICAgIDxzcmM+aW1hZ2VzL2V4dHZhbF9sb2dvLnBuZzwvc3JjPg0KLSAgICA8aHJlZj5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2luZGV4Lmh0bWw8L2hyZWY+DQotICA8L2Jhbm5lckxlZnQ+DQotDQotICA8YmFubmVyUmlnaHQ+DQotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzPC9uYW1lPg0KLSAgICA8c3JjPmltZy9iYW5uZXJzL015RmFjZXNfbG9nby5qcGc8L3NyYz4NCi0gICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sPC9ocmVmPg0KLSAgPC9iYW5uZXJSaWdodD4NCi0NCi0gIDxwdWJsaXNoRGF0ZSBmb3JtYXQ9ImRkIE1NTSB5eXl5Ii8+DQotDQotICA8c2tpbj4NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLm1hdmVuPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLXNpdGUtc2tpbjwvYXJ0aWZhY3RJZD4NCi0gICAgPHZlcnNpb24+MS1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gIDwvc2tpbj4NCi0NCi0gIDxib2R5Pg0KLSAgICA8bGlua3M+DQotICAgICAgPGl0ZW0gbmFtZT0iQXBhY2hlIiBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmciLz4NCi0gICAgICA8aXRlbSBuYW1lPSJNeUZhY2VzIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4NCi0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCBNeWZhY2VzIEV4dFZhbCIgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9kb3dubG9hZC5odG1sIi8+DQotICAgIDwvbGlua3M+DQotDQotICAgIDxtZW51IG5hbWU9IkFwYWNoZSBNeUZhY2VzIiBpbmhlcml0PSJ0b3AiPg0KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4NCi0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9kb3dubG9hZC5odG1sIi8+DQotICAgIDwvbWVudT4NCi0NCi0gICAgPG1lbnUgbmFtZT0iQ29udGVudHMiIGluaGVyaXQ9InRvcCI+DQotICAgICAgICA8aXRlbSBuYW1lPSJNYWluIFNpdGUiICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sIi8+DQotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjEiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS9pbmRleC5odG1sIiBjb2xsYXBzZT0idHJ1ZSI+DQotICAgICAgICAgICAgPGl0ZW0gbmFtZT0iZHVtbXkiICAgICAgICBocmVmPSJkdW1teSIvPg0KLSAgICAgICAgPC9pdGVtPg0KLSAgICAgICAgPGl0ZW0gbmFtZT0iRXh0VmFsIGZvciBKU0YgMS4yIiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvaW5kZXguaHRtbCIgY29sbGFwc2U9InRydWUiPg0KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9ImR1bW15IiAgICAgICAgaHJlZj0iZHVtbXkiLz4NCi0gICAgICAgIDwvaXRlbT4NCi0gICAgICAgIDxpdGVtIG5hbWU9IkV4dFZhbCBmb3IgSlNGIDIuMCIgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMjAvaW5kZXguaHRtbCI+DQotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJDb3JlIE1vZHVsZSIgICAgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IyMC9teWZhY2VzLWV4dHZhbC1jb3JlL2luZGV4Lmh0bWwiLz4NCi0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IkJlYW4gVmFsaWRhdGlvbiIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjIwL3ZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbi9pbmRleC5odG1sIi8+DQotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJQcm9wZXJ0eSBWYWxpZGF0aW9uIiAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IyMC92YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uL2luZGV4Lmh0bWwiLz4NCi0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IlRyaW5pZGFkIFN1cHBvcnQiICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjIwL2NvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0L2luZGV4Lmh0bWwiLz4NCi0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IkdlbmVyaWMgU3VwcG9ydCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjIwL2NvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQvaW5kZXguaHRtbCIvPg0KLSAgICAgICAgPC9pdGVtPg0KLSAgICA8L21lbnU+DQotCQ0KLSAgICA8bWVudSBuYW1lPSJEb2N1bWVudGF0aW9uIj4NCi0gICAgICA8aXRlbSBuYW1lPSJXaWtpIiAgICAgICAgIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvbXlmYWNlcy9FeHRlbnNpb25zL1ZhbGlkYXRvci8iLz4NCi0gICAgICA8aXRlbSBuYW1lPSJKYXZhZG9jIiAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IyMC9qYXZhZG9jLmh0bWwiLz4NCi0gICAgPC9tZW51Pg0KLQ0KLSAgICA8bWVudSByZWY9InJlcG9ydHMiLz4NCi0NCi0gICAgPG1lbnUgbmFtZT0iRm91bmRhdGlvbiIgaW5oZXJpdD0iYm90dG9tIj4NCi0gICAgICA8aXRlbSBuYW1lPSJBU0YiICAgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIgLz4NCi0gICAgICA8aXRlbSBuYW1lPSJTcG9uc29yc2hpcCIgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vc3BvbnNvcnNoaXAuaHRtbCIgLz4NCi0gICAgICA8aXRlbSBuYW1lPSJUaGFua3MiICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vdGhhbmtzLmh0bWwiIC8+DQotICAgIDwvbWVudT4NCi0gIDwvYm9keT4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3BvbS54bWwgYi9icmFuY2hfZm9yX2pzZl8yXzAvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlMmM5OC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj45PC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1tb2R1bGU8L2FydGlmYWN0SWQ+DQotICAgIDx2ZXJzaW9uPjIuMC40LVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBNb2R1bGU8L25hbWU+DQotICAgIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjIwPC91cmw+DQotDQotICAgIDxzY20+DQotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy9icmFuY2hfZm9yX2pzZl8yXzA8L2Nvbm5lY3Rpb24+DQotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMl8wPC9kZXZlbG9wZXJDb25uZWN0aW9uPg0KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMl8wPC91cmw+DQotICAgIDwvc2NtPg0KLQ0KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4NCi0gICAgICAgIDxzaXRlPg0KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc2l0ZTwvaWQ+DQotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMjA8L3VybD4NCi0gICAgICAgIDwvc2l0ZT4NCi0gICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50Pg0KLQ0KLSAgICA8IS0tIFdBUk5JTkc6IERPIE5PVCBHRU5FUkFURSBTSVRFIEZST00gSEVSRSBESVJFQ1RMWQ0KLSAgICBTaW5jZSB0aGlzIHByb2plY3QgaGFzIGFuIGFzeW5jIHJlbGVhc2UgcHJvY2VkdXJlIChub3QNCi0gICAgYWxsIG1vZHVsZXMgc2hvdWxkIGJlIHJlbGVhc2VkIGF0IG9uY2UpLCB0aGUgcGFyZW50IHBvbS54bWwgDQotICAgIGlzIG5vdCB0aGlzICh0aGVyZSBpcyBhIG1vZHVsZSBmb3IgdGhhdCkuIFVzZSBtYXZlbiBzaXRlIA0KLSAgICBwbHVnaW4gaGVyZSBjYXVzZSBwcm9ibGVtcyB3aGVuIHRoZSBzaXRlIGlzIGdlbmVyYXRlZC4NCi0gICAgVGhlIHByb2NlZHVyZSBtdXN0IGV4ZWN1dGUgc2l0ZSBjb21tbWFuZCBmaXJzdCBvbiBwYXJlbnQgDQotICAgIG1vZHVsZSBhbmQgdGhlbiBvbiBlYWNoIG1vZHVsZSBsaXN0ZWQgYmVsb3cuIA0KLSAgICAgLS0+DQotDQotICAgIDxtb2R1bGVzPg0KLSAgICAgICAgPG1vZHVsZT5wYXJlbnQ8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+Y29yZTwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT52YWxpZGF0aW9uLW1vZHVsZXM8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+Y29tcG9uZW50LXN1cHBvcnQ8L21vZHVsZT4NCi0gICAgICAgIDwhLS1tb2R1bGU+ZXhhbXBsZXM8L21vZHVsZS0tPg0KLSAgICA8L21vZHVsZXM+DQotDQotICAgIDxwcm9maWxlcz4NCi0gICAgICAgIDwhLS0gVGhpcyBwcm9maWxlIGlzIGludm9rZWQgYnkgLURwcmVwYXJlUmVsZWFzZT10cnVlLiAgVGhpcyBhbGxvd3MgbXZuIHJlbGVhc2U6cHJlcGFyZSB0bw0KLSAgICAgICAgICAgIHJ1biBzdWNjZXNzZnVsbHkgb24gdGhlIGFzc2VtYmx5IHByb2plY3RzLiAtLT4NCi0gICAgICAgIDxwcm9maWxlPg0KLSAgICAgICAgICAgIDxpZD5wcmVwYXJlLXJlbGVhc2U8L2lkPg0KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPg0KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+DQotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wcmVwYXJlUmVsZWFzZTwvbmFtZT4NCi0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8L2FjdGl2YXRpb24+DQotICAgICAgICAgICAgPG1vZHVsZXM+DQotICAgICAgICAgICAgICAgIDxtb2R1bGU+YXNzZW1ibHk8L21vZHVsZT4NCi0gICAgICAgICAgICA8L21vZHVsZXM+DQotICAgICAgICAgICAgPGJ1aWxkPg0KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVsZWFzZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+LURwcmVwYXJlUmVsZWFzZTwvYXJndW1lbnRzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+DQotICAgICAgICAgICAgPC9idWlsZD4NCi0gICAgICAgIDwvcHJvZmlsZT4NCi0gICAgPC9wcm9maWxlcz4NCi0gICAgDQotICAgIDxwcm9wZXJ0aWVzPg0KLSAgICAgICAgPGpzZi52ZXJzaW9uPjIuMC4xPC9qc2YudmVyc2lvbj4NCi0gICAgPC9wcm9wZXJ0aWVzPg0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9wb20ueG1sIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwYjhiMi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIEJlYW4tVmFsaWRhdGlvbi1JbnRlZ3JhdGlvbi1Nb2R1bGUgKEpTUiAzMDMpPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4yLjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjIuMC40LVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPHJlcG9zaXRvcmllcz4NCi0gICAgICAgIDxyZXBvc2l0b3J5Pg0KLSAgICAgICAgICAgIDxpZD5qYm9zczwvaWQ+DQotICAgICAgICAgICAgPHVybD5odHRwOi8vcmVwb3NpdG9yeS5qYm9zcy5jb20vbWF2ZW4yPC91cmw+DQotICAgICAgICAgICAgPHJlbGVhc2VzPg0KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPg0KLSAgICAgICAgICAgIDwvcmVsZWFzZXM+DQotICAgICAgICAgICAgPHNuYXBzaG90cz4NCi0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+ZmFsc2U8L2VuYWJsZWQ+DQotICAgICAgICAgICAgPC9zbmFwc2hvdHM+DQotICAgICAgICA8L3JlcG9zaXRvcnk+DQotICAgICAgICA8cmVwb3NpdG9yeT4NCi0gICAgICAgICAgICA8aWQ+amJvc3Mtc25hcHNob3Q8L2lkPg0KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3NuYXBzaG90cy5qYm9zcy5vcmcvbWF2ZW4yPC91cmw+DQotICAgICAgICAgICAgPHJlbGVhc2VzPg0KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPg0KLSAgICAgICAgICAgIDwvcmVsZWFzZXM+DQotICAgICAgICAgICAgPHNuYXBzaG90cz4NCi0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4NCi0gICAgICAgICAgICA8L3NuYXBzaG90cz4NCi0gICAgICAgIDwvcmVwb3NpdG9yeT4NCi0gICAgPC9yZXBvc2l0b3JpZXM+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC52YWxpZGF0aW9uPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnZhbGlkYXRpb24tYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wLkdBPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotDQotDQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4yPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9BYnN0cmFjdCouamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9UZXN0VXRpbHMuamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qQmVhbi5qYXZhPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5Bd2FyZUNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5LmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5Bd2FyZUNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YTc0MDQuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuQXdhcmVDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBCZWFuQXdhcmVDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5DQotew0KLSAgICBwcml2YXRlIENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5Ow0KLQ0KLSAgICBwdWJsaWMgQmVhbkF3YXJlQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkpDQotICAgIHsNCi0gICAgICAgIHNldENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeShDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBjb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSkNCi0gICAgew0KLSAgICAgICAgaWYoY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJudWxsIGlzIG5vdCBhbGxvd2VkIGhlcmUiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRoaXMuY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgPSBjb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWxsb3cgdGhlIHJlZ2lzdHJhdGlvbiBvZiBhIGN1c3RvbSBwcmVmaXgiKQ0KLSAgICBwdWJsaWMgPFQgZXh0ZW5kcyBDb25zdHJhaW50VmFsaWRhdG9yPD8sID8+PiBUIGdldEluc3RhbmNlKENsYXNzPFQ+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsaWRhdG9yQ2xhc3NOYW1lID0gdGFyZ2V0Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbihjcmVhdGVCZWFuTmFtZSh2YWxpZGF0b3JDbGFzc05hbWUpKTsNCi0NCi0gICAgICAgIGlmKHJlc3VsdCAhPSBudWxsICYmIHRhcmdldENsYXNzLmlzQXNzaWduYWJsZUZyb20ocmVzdWx0LmdldENsYXNzKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoVClyZXN1bHQ7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeS5nZXRJbnN0YW5jZSh0YXJnZXRDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlQmVhbk5hbWUoU3RyaW5nIHZhbGlkYXRvckNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUodmFsaWRhdG9yQ2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5Bd2FyZVZhbGlkYXRvckZhY3RvcnkuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2Q3NmM2Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JDb250ZXh0Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVHJhdmVyc2FibGVSZXNvbHZlcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBCZWFuQXdhcmVWYWxpZGF0b3JGYWN0b3J5IGltcGxlbWVudHMgVmFsaWRhdG9yRmFjdG9yeQ0KLXsNCi0gICAgcHJpdmF0ZSBWYWxpZGF0b3JGYWN0b3J5IHZhbGlkYXRvckZhY3Rvcnk7DQotDQotICAgIHB1YmxpYyBCZWFuQXdhcmVWYWxpZGF0b3JGYWN0b3J5KFZhbGlkYXRvckZhY3RvcnkgdmFsaWRhdG9yRmFjdG9yeSkNCi0gICAgew0KLSAgICAgICAgc2V0VmFsaWRhdG9yRmFjdG9yeSh2YWxpZGF0b3JGYWN0b3J5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3JGYWN0b3J5KFZhbGlkYXRvckZhY3RvcnkgdmFsaWRhdG9yRmFjdG9yeSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdG9yRmFjdG9yeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm51bGwgaXMgbm90IGFsbG93ZWQgaGVyZSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdGhpcy52YWxpZGF0b3JGYWN0b3J5ID0gdmFsaWRhdG9yRmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5LmdldFZhbGlkYXRvcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWxpZGF0b3JDb250ZXh0IHVzaW5nQ29udGV4dCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5LnVzaW5nQ29udGV4dCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlSW50ZXJwb2xhdG9yIGdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeS5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFRyYXZlcnNhYmxlUmVzb2x2ZXIgZ2V0VHJhdmVyc2FibGVSZXNvbHZlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5LmdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgZ2V0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEJlYW5Bd2FyZUNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KHZhbGlkYXRvckZhY3RvcnkuZ2V0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIDxUPiBUIHVud3JhcChDbGFzczxUPiB0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5LnVud3JhcCh0Q2xhc3MpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1MzYyNy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5WYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBWYWxpZGF0aW9uTW9kdWxlS2V5DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBCZWFuVmFsaWRhdGlvbk1vZHVsZUtleQ0KLXsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTdiNzlhLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWwuQmVhblZhbGlkYXRpb25VdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzIGJ2aVV0aWxzID0NCi0gICAgICAgICAgICBuZXcgQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHModGhpcy5sb2dnZXIpOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXF1aXJlZEluaXRpYWxpemF0aW9uU3VwcG9ydGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgbG9nZ2VyLmZpbmVzdCgic3RhcnQgdG8gaW5pdCBjb21wb25lbnQgIiArIHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBidmlVdGlscy5leHRyYWN0UHJvcGVydHlEZXRhaWxzKA0KLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBnZXRQcm9wZXJ0aWVzRm9yQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IodWlDb21wb25lbnQpKTsNCi0NCi0gICAgICAgIGlmIChwcm9wZXJ0eURldGFpbHMgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0Q29tcG9uZW50V2l0aFByb3BlcnR5RGV0YWlscyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBwcm9wZXJ0eURldGFpbHMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbG9nZ2VyLmZpbmVzdCgiaW5pdCBjb21wb25lbnQgb2YgIiArIHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb21wb25lbnRXaXRoUHJvcGVydHlEZXRhaWxzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmJ2aVV0aWxzLmluaXRDb21wb25lbnRXaXRoUHJvcGVydHlEZXRhaWxzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHByb3BlcnR5RGV0YWlscyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IGdldFByb3BlcnR5SW5mb3JtYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBib29sZWFuIHZhbGlkYXRlUHJvcGVydHkgPSBoYXNCZWFuVmFsaWRhdGlvbkNvbnN0cmFpbnRzKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHZhbGlkYXRlUHJvcGVydHkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIuZmluZXN0KCJqc3IzMDMgc3RhcnQgdmFsaWRhdGlvbiIpOw0KLQ0KLSAgICAgICAgICAgICAgICBwcm9jZXNzRmllbGRWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlJbmZvcm1hdGlvbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluYWxseQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZVByb3BlcnR5KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLmZpbmVzdCgianNyMzAzIHZhbGlkYXRpb24gZmluaXNoZWQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE1ldGFEYXRhRXh0cmFjdG9yIGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGJ2aVV0aWxzLmdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKHByb3BlcnRpZXMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhc0JlYW5WYWxpZGF0aW9uQ29uc3RyYWludHMoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5idmlVdGlscy5oYXNCZWFuVmFsaWRhdGlvbkNvbnN0cmFpbnRzKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NGaWVsZFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgLypub3QgdXNlZCB5ZXQgc3VwcG9ydE11bHRpcGxlVmlvbGF0aW9uc1BlckZpZWxkKCkqLw0KLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248T2JqZWN0Pj4gdmlvbGF0aW9ucyA9IHRoaXMuYnZpVXRpbHMNCi0gICAgICAgICAgICAgICAgLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlJbmZvcm1hdGlvbiwgdHJ1ZSk7DQotDQotICAgICAgICBwcm9jZXNzQ29uc3RyYWludFZpb2xhdGlvbnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCB2aW9sYXRpb25zKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ29uc3RyYWludFZpb2xhdGlvbnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4+IHZpb2xhdGlvbnMpDQotICAgIHsNCi0gICAgICAgIGlmKHZpb2xhdGlvbnMgIT0gbnVsbCAmJiAhdmlvbGF0aW9ucy5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQmVhblZhbGlkYXRpb25VdGlscy5wcm9jZXNzQ29uc3RyYWludFZpb2xhdGlvbnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCB2aW9sYXRpb25zKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIENsYXNzIGdldE1vZHVsZUtleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBCZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYmU5N2QuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbC5CZWFuVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5ncm91cHMuRGVmYXVsdDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5FbGVtZW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzDQotew0KLSAgICBwcml2YXRlIExvZ2dlciBsb2dnZXI7DQotDQotICAgIEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzKExvZ2dlciBsb2dnZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyOw0KLSAgICB9DQotDQotICAgIFByb3BlcnR5RGV0YWlscyBleHRyYWN0UHJvcGVydHlEZXRhaWxzKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXNGb3JFeHRyYWN0aW9uKQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcmVzdWx0ID0gZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IocHJvcGVydGllc0ZvckV4dHJhY3Rpb24pDQotICAgICAgICAgICAgICAgIC5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpDQotICAgICAgICAgICAgICAgIC5nZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdC5nZXRCYXNlT2JqZWN0KCkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuaW5nKCJubyBiYXNlIG9iamVjdCBhdCAiICsgcmVzdWx0LmdldEtleSgpICsNCi0gICAgICAgICAgICAgICAgICAgICIgY29tcG9uZW50LWlkOiAiICsgdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0LmdldEJhc2VPYmplY3QoKSAhPSBudWxsID8gcmVzdWx0IDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBhbHNvIGludm9rZXMgbWV0YS1kYXRhIGV4dHJhY3Rpb24gaW50ZXJjZXB0b3JzDQotICAgICAqIChzZWUgZS5nLiBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKQ0KLSAgICAgKi8NCi0gICAgTWV0YURhdGFFeHRyYWN0b3IgZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JXaXRoKHByb3BlcnRpZXMpOw0KLSAgICB9DQotDQotICAgIHZvaWQgaW5pdENvbXBvbmVudFdpdGhQcm9wZXJ0eURldGFpbHMoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMpDQotICAgIHsNCi0gICAgICAgIENsYXNzW10gZm91bmRHcm91cHMgPSByZXNvbHZlR3JvdXBzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgaWYgKGZvdW5kR3JvdXBzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoZm91bmRHcm91cHMubGVuZ3RoID09IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgZm91bmRHcm91cHMgPSBuZXcgQ2xhc3NbXXtEZWZhdWx0LmNsYXNzfTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpOw0KLQ0KLSAgICAgICAgdGFyZ2V0Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHRhcmdldENsYXNzKTsNCi0NCi0gICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIGVsZW1lbnREZXNjcmlwdG9yID0gQmVhblZhbGlkYXRpb25VdGlscy5nZXRFbGVtZW50RGVzY3JpcHRvcigNCi0gICAgICAgICAgICAgICAgdGFyZ2V0Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpKTsNCi0NCi0gICAgICAgIGlmIChlbGVtZW50RGVzY3JpcHRvciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHByb2Nlc3NFbGVtZW50RGVzY3JpcHRvcihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBmb3VuZEdyb3VwcywgZWxlbWVudERlc2NyaXB0b3IpOw0KLSAgICB9DQotDQotICAgIHZvaWQgcHJvY2Vzc0VsZW1lbnREZXNjcmlwdG9yKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1tdIGZvdW5kR3JvdXBzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBlbGVtZW50RGVzY3JpcHRvcikNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YTsNCi0NCi0gICAgICAgIGZvciAoQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gY29uc3RyYWludERlc2NyaXB0b3IgOg0KLSAgICAgICAgICAgICAgICBlbGVtZW50RGVzY3JpcHRvci5maW5kQ29uc3RyYWludHMoKS51bm9yZGVyZWRBbmRNYXRjaGluZ0dyb3Vwcyhmb3VuZEdyb3VwcykuZ2V0Q29uc3RyYWludERlc2NyaXB0b3JzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGEgPSB0cmFuc2Zvcm1Db25zdHJhaW50RGVzY3JpcHRvclRvTWV0YURhdGEoDQotICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50RGVzY3JpcHRvciwgZWxlbWVudERlc2NyaXB0b3IuZ2V0RWxlbWVudENsYXNzKCkpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YSAhPSBudWxsICYmICFtZXRhRGF0YS5pc0VtcHR5KCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiQ29uc3RyYWludERlc2NyaXB0b3IjaXNSZXBvcnRBc1NpbmdsZVZpb2xhdGlvbiIpDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1Db25zdHJhaW50RGVzY3JpcHRvclRvTWV0YURhdGEoDQotICAgICAgICAgICAgQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gY29uc3RyYWludERlc2NyaXB0b3IsIENsYXNzIGVsZW1lbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0NCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSBFeHRWYWxVdGlscy5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KA0KLSAgICAgICAgICAgICAgICBuZXcgQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5KGNvbnN0cmFpbnREZXNjcmlwdG9yLCBlbGVtZW50Q2xhc3MpKTsNCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LnB1dEFsbCh0cmFuc2Zvcm1NZXRhRGF0YShtZXRhRGF0YVRyYW5zZm9ybWVyLCBjb25zdHJhaW50RGVzY3JpcHRvcikpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKCFjb25zdHJhaW50RGVzY3JpcHRvci5pc1JlcG9ydEFzU2luZ2xlVmlvbGF0aW9uKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgU2V0PENvbnN0cmFpbnREZXNjcmlwdG9yPD8+PiBjb21wb3NpbmdDb25zdHJhaW50cyA9IGNvbnN0cmFpbnREZXNjcmlwdG9yLmdldENvbXBvc2luZ0NvbnN0cmFpbnRzKCk7DQotICAgICAgICAgICAgaWYgKGNvbXBvc2luZ0NvbnN0cmFpbnRzICE9IG51bGwgJiYgIWNvbXBvc2luZ0NvbnN0cmFpbnRzLmlzRW1wdHkoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXRBbGwodHJhbnNmb3JtQ29tcG9zaW5nQ29uc3RyYWludHMoY29tcG9zaW5nQ29uc3RyYWludHMsIGVsZW1lbnRDbGFzcykpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybUNvbXBvc2luZ0NvbnN0cmFpbnRzKA0KLSAgICAgICAgICAgIFNldDxDb25zdHJhaW50RGVzY3JpcHRvcjw/Pj4gY29tcG9zaW5nQ29uc3RyYWludHMsIENsYXNzIGVsZW1lbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIGZvciAoQ29uc3RyYWludERlc2NyaXB0b3IgY29uc3RyYWludERlc2NyaXB0b3IgOiBjb21wb3NpbmdDb25zdHJhaW50cykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQucHV0QWxsKHRyYW5zZm9ybUNvbnN0cmFpbnREZXNjcmlwdG9yVG9NZXRhRGF0YShjb25zdHJhaW50RGVzY3JpcHRvciwgZWxlbWVudENsYXNzKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YSgNCi0gICAgICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIsIENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IGNvbnN0cmFpbnREZXNjcmlwdG9yKQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUVudHJ5IGVudHJ5Ow0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQ7DQotICAgICAgICANCi0gICAgICAgIHRoaXMubG9nZ2VyLmZpbmUobWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotDQotICAgICAgICBlbnRyeSA9IG5ldyBNZXRhRGF0YUVudHJ5KCk7DQotICAgICAgICBlbnRyeS5zZXRLZXkoY29uc3RyYWludERlc2NyaXB0b3IuZ2V0QW5ub3RhdGlvbigpLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgIGVudHJ5LnNldFZhbHVlKGNvbnN0cmFpbnREZXNjcmlwdG9yKTsNCi0NCi0gICAgICAgIHJlc3VsdCA9IG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KTsNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgYm9vbGVhbiBoYXNCZWFuVmFsaWRhdGlvbkNvbnN0cmFpbnRzKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzLmdldFByb3BlcnR5RGV0YWlscyhwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCkpOw0KLQ0KLSAgICAgICAgcmV0dXJuIEJlYW5WYWxpZGF0aW9uVXRpbHMuZ2V0RWxlbWVudERlc2NyaXB0b3IodGFyZ2V0Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpKSAhPSBudWxsOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4+IHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY2FzY2FkZWRWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBDbGFzcyBiYXNlQmVhbkNsYXNzID0gZ2V0QmFzZUNsYXNzVHlwZShwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBnZXRQcm9wZXJ0eVRvVmFsaWRhdGUocHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgICAgICBDbGFzc1tdIGdyb3VwcyA9IHJlc29sdmVHcm91cHMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBpZiAoZ3JvdXBzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gQmVhblZhbGlkYXRpb25VdGlscy52YWxpZGF0ZShiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eU5hbWUsIGNvbnZlcnRlZE9iamVjdCwgZ3JvdXBzLCBjYXNjYWRlZFZhbGlkYXRpb24pOw0KLSAgICB9DQotDQotICAgIENsYXNzIGdldEJhc2VDbGFzc1R5cGUoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBDbGFzcyByZXN1bHQgPSBFeHRWYWxVdGlscy5nZXRQcm9wZXJ0eURldGFpbHMocHJvcGVydHlJbmZvcm1hdGlvbikuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCk7DQotDQotICAgICAgICByZXR1cm4gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhyZXN1bHQpOw0KLSAgICB9DQotDQotICAgIFN0cmluZyBnZXRQcm9wZXJ0eVRvVmFsaWRhdGUoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5SW5mb3JtYXRpb24pLmdldFByb3BlcnR5KCk7DQotICAgIH0NCi0NCi0gICAgQ2xhc3NbXSByZXNvbHZlR3JvdXBzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEdyb3VwcygNCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZ2V0Vmlld0lkKCksDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvRGVmYXVsdEV4dFZhbEJlYW5WYWxpZGF0aW9uTW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9EZWZhdWx0RXh0VmFsQmVhblZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNjljNWUuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9EZWZhdWx0RXh0VmFsQmVhblZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RXh0VmFsQmVhblZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uIGV4dGVuZHMgRXh0VmFsQmVhblZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uDQotew0KLSAgICBwdWJsaWMgVmFsaWRhdG9yRmFjdG9yeSBjdXN0b21WYWxpZGF0b3JGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShWYWxpZGF0b3JGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBpZihmYWN0b3J5IGluc3RhbmNlb2YgVmFsaWRhdG9yRmFjdG9yeSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFZhbGlkYXRvckZhY3RvcnkpZmFjdG9yeTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGN1c3RvbUV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBjb250ZXh0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBpZihjb250ZXh0IGluc3RhbmNlb2YgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0KWNvbnRleHQ7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0V4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk1NzM4NS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0V4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLm1lc3NhZ2UuaW50ZXJwb2xhdG9yLkRlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLm1lc3NhZ2UuaW50ZXJwb2xhdG9yLkV4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5Nb2RlbFZhbGlkYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5Nb2RlbFZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbC5CZWFuVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5Hcm91cFN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkpzZlByb2plY3RTdGFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uTWVzc2FnZUludGVycG9sYXRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgaW1wbGVtZW50cyBHcm91cFN0b3JhZ2UsIE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVkgPSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuY2xhc3MuZ2V0TmFtZSgpICsgIjpLRVkiOw0KLQ0KLSAgICBwcm90ZWN0ZWQgVmFsaWRhdG9yRmFjdG9yeSB2YWxpZGF0b3JGYWN0b3J5Ow0KLQ0KLSAgICBwcm90ZWN0ZWQgTWVzc2FnZUludGVycG9sYXRvciBkZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcjsNCi0NCi0gICAgcHJvdGVjdGVkIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXI7DQotDQotICAgIHByb3RlY3RlZCBHcm91cFN0b3JhZ2UgZ3JvdXBTdG9yYWdlOw0KLQ0KLSAgICBwcm90ZWN0ZWQgTW9kZWxWYWxpZGF0aW9uU3RvcmFnZSBtb2RlbFZhbGlkYXRpb25TdG9yYWdlOw0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkZXZlbG9wbWVudE1vZGUgPSBmYWxzZTsNCi0NCi0gICAgcHJvdGVjdGVkIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCgpDQotICAgIHsNCi0gICAgICAgIGluaXRHcm91cFN0b3JhZ2UoKTsNCi0gICAgICAgIGluaXRNb2RlbFZhbGlkYXRpb25TdG9yYWdlKCk7DQotDQotICAgICAgICBpbml0TWVzc2FnZVJlc29sdmVyKCk7DQotICAgICAgICBpbml0TWVzc2FnZUludGVycG9sYXRvcigpOw0KLQ0KLSAgICAgICAgaWYgKEpzZlByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuRGV2ZWxvcG1lbnQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuZGV2ZWxvcG1lbnRNb2RlID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgc3RhdGljIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBnZXRDdXJyZW50SW5zdGFuY2UoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgTWFwIHJlcXVlc3RNYXAgPSBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpOw0KLQ0KLSAgICAgICAgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGN1cnJlbnRDb250ZXh0ID0gKEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dClyZXF1ZXN0TWFwLmdldChLRVkpOw0KLQ0KLSAgICAgICAgaWYoY3VycmVudENvbnRleHQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50Q29udGV4dCA9IEV4dFZhbEJlYW5WYWxpZGF0aW9uTW9kdWxlQ29uZmlndXJhdGlvbi5nZXQoKS5jdXN0b21FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQoKTsNCi0NCi0gICAgICAgICAgICBpZihjdXJyZW50Q29udGV4dCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudENvbnRleHQgPSBuZXcgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0KCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJlcXVlc3RNYXAucHV0KEtFWSwgY3VycmVudENvbnRleHQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRDb250ZXh0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWxpZGF0b3JGYWN0b3J5IGdldFZhbGlkYXRvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLnZhbGlkYXRvckZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0b3JGYWN0b3J5Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGhpcy52YWxpZGF0b3JGYWN0b3J5ID0gRXh0VmFsQmVhblZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmdldCgpLmN1c3RvbVZhbGlkYXRvckZhY3RvcnkoKTsNCi0NCi0gICAgICAgIGlmKHRoaXMudmFsaWRhdG9yRmFjdG9yeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMuZGV2ZWxvcG1lbnRNb2RlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybmluZygiZmFsbGJhY2sgdG8gdGhlIGRlZmF1bHQgYnYgdmFsaWRhdG9yIGZhY3RvcnkiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JGYWN0b3J5ID0gQmVhblZhbGlkYXRpb25VdGlscy5nZXREZWZhdWx0VmFsaWRhdG9yRmFjdG9yeSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdG9yRmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZUludGVycG9sYXRvciBnZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5tZXNzYWdlUmVzb2x2ZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IEV4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyKHRoaXMuZGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IsIHRoaXMubWVzc2FnZVJlc29sdmVyKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5ncm91cFN0b3JhZ2UuYWRkR3JvdXAoZ3JvdXBDbGFzcywgdmlld0lkLCBjbGllbnRJZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVzdHJpY3RHcm91cChDbGFzcyBncm91cENsYXNzLCBTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZ3JvdXBTdG9yYWdlLnJlc3RyaWN0R3JvdXAoZ3JvdXBDbGFzcywgdmlld0lkLCBjbGllbnRJZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENsYXNzW10gZ2V0R3JvdXBzKFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBTdG9yYWdlLmdldEdyb3Vwcyh2aWV3SWQsIGNsaWVudElkKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRNb2RlbFZhbGlkYXRpb25FbnRyeShNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tb2RlbFZhbGlkYXRpb25TdG9yYWdlLmFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KG1vZGVsVmFsaWRhdGlvbkVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllc1RvVmFsaWRhdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5tb2RlbFZhbGlkYXRpb25TdG9yYWdlLmdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXNUb1ZhbGlkYXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdEdyb3VwU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZ3JvdXBTdG9yYWdlID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmdldFN0b3JhZ2UoR3JvdXBTdG9yYWdlLmNsYXNzLCBCZWFuVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRNb2RlbFZhbGlkYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tb2RlbFZhbGlkYXRpb25TdG9yYWdlID0gRXh0VmFsVXRpbHMuDQotICAgICAgICAgICAgICAgIGdldFN0b3JhZ2UoTW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcywgTW9kZWxWYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdE1lc3NhZ2VJbnRlcnBvbGF0b3IoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZm91bmRCZWFuID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKE1lc3NhZ2VJbnRlcnBvbGF0b3IuY2xhc3MuZ2V0TmFtZSgpLnJlcGxhY2UoIi4iLCAiXyIpKTsNCi0NCi0gICAgICAgIGlmKGZvdW5kQmVhbiBpbnN0YW5jZW9mIE1lc3NhZ2VJbnRlcnBvbGF0b3IpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5kZWZhdWx0TWVzc2FnZUludGVycG9sYXRvciA9IChNZXNzYWdlSW50ZXJwb2xhdG9yKWZvdW5kQmVhbjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmRlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yID0gbmV3IERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yKA0KLSAgICAgICAgICAgICAgICBCZWFuVmFsaWRhdGlvblV0aWxzLmdldERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0TWVzc2FnZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlUmVzb2x2ZXIgPSBFeHRWYWxVdGlscy5nZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koZ2V0QmVhblZhbGlkYXRpb25TdHJhdGVneSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSBnZXRCZWFuVmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kobnVsbCwgbnVsbCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9FeHRWYWxCZWFuVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24uamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvRXh0VmFsQmVhblZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMmU4OGQuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9FeHRWYWxCZWFuVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsTW9kdWxlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7DQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBFeHRWYWwgQ29yZSBNb2R1bGUgY29uZmlndXJhdGlvbi4NCi0gKiAnY3VzdG9tJyBhcyBwcmVmaXggaXMgdXNlZCBmb3IgJ29wdGlvbmFsJyBjb25maWd1cmF0aW9ucy4gVGhhdCBtZWFucw0KLSAqIGlmIGEgbWV0aG9kIHJldHVybnMgbnVsbCBFeHRWYWwgdXNlcyBhIGRpZmZlcmVudCBhcHByb2FjaCB0byBmaW5kIGFuIGltcGxlbWVudGF0aW9uIGUuZy4gdmlhIGEgbmFtaW5nIGNvbnZlbnRpb24NCi0gKiAtPiBhbGwgb3RoZXIgbWV0aG9kcyBhcmVuJ3QgYWxsb3dlZCB0byByZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBhZGRpdGlvbmFsIHJ1bGUuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgcjQNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHRWYWxCZWFuVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBFeHRWYWxNb2R1bGVDb25maWd1cmF0aW9uDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBFeHRWYWxDb250ZXh0IGV4dFZhbENvbnRleHQgPSBudWxsOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihFeHRWYWxCZWFuVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfTU9EVUxFX0NPTkZJR19NRVNTQUdFID0NCi0gICAgICAgICAgICAibm8gY29uZmlnIGZvciAiICsgRXh0VmFsQmVhblZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmNsYXNzLmdldE5hbWUoKSArICIgZm91bmQuICIgKw0KLSAgICAgICAgICAgICJtYXliZSB0aGUgY2FsbCBvZiBFeHRWYWxCZWFuVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24jZ2V0IiArDQotICAgICAgICAgICAgIiBpcyB0cmlnZ2VyZWQgYmVmb3JlIHRoZSByZWdpc3RyYXRpb24gcHJvY2Vzcy4gdGhlIGRlZmF1bHQgY29uZmlnIGdldHMgdXNlZC4iOw0KLQ0KLSAgICBwcm90ZWN0ZWQgRXh0VmFsQmVhblZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uKCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBEb24ndCBhY2Nlc3MgRXh0VmFsQ29udGV4dCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNsYXNzLiBFLmcuIE9wZW5XZWJCZWFucyBpbml0aWFsaXplcyBhbGwgY2xhc3NlcyBkdXJpbmcNCi0gICAgICogc3RhcnR1cCBvZiB0aGUgV2ViQ29udGFpbmVyLg0KLSAgICAgKiAoe0BsaW5rIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHR9DQotICAgICAqIGNvbnN0cnVjdG9yIHRyaWVzIHRvIGFjY2VzcyBXZWIueG1sIHBhcmFtZXRlcnMgdGhyb3VnaA0KLSAgICAgKiB7QGxpbmsgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHR9IHdoaWNoIGlzbid0IGF2YWlsYWJsZSBkdXJpbmcgdGhlIGNsYXNzcGF0aC1zY2FubmluZy4pDQotICAgICAqDQotICAgICAqIEByZXR1cm4gVGhlIEV4dFZhbENvbnRleHQNCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIEV4dFZhbENvbnRleHQgZ2V0RXh0VmFsQ29udGV4dCgpDQotICAgIHsNCi0gICAgICAgIGlmIChleHRWYWxDb250ZXh0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZXh0VmFsQ29udGV4dCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGV4dFZhbENvbnRleHQ7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjb3JlLW1vZHVsZSBzdG9yZWQgaW4gdGhlIGNvbnRleHQuDQotICAgICAqIElmIHRoaXMgZG9lc24ndCBleGlzdHMgKHVzdWFsbHkgYSBzdGFydHVwLWxpc3RlbmVyIHJlZ2lzdGVycyBhIChjdXN0b20pIGltcGxlbWVudGF0aW9uKSwNCi0gICAgICogaXQgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4NCi0gICAgICoNCi0gICAgICogQHJldHVybiBUaGUgYWN0aXZlIEV4dFZhbCBDb3JlIE1vZHVsZSBDb25maWd1cmF0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIEV4dFZhbEJlYW5WYWxpZGF0aW9uTW9kdWxlQ29uZmlndXJhdGlvbiBnZXQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxCZWFuVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24gbW9kdWxlQ29uZmlnID0NCi0gICAgICAgICAgICAgICAgZ2V0RXh0VmFsQ29udGV4dCgpLmdldE1vZHVsZUNvbmZpZ3VyYXRpb24oRXh0VmFsQmVhblZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmKG1vZHVsZUNvbmZpZyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExPR0dFUi5maW5lKE1JU1NJTkdfTU9EVUxFX0NPTkZJR19NRVNTQUdFKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtb2R1bGVDb25maWcgIT0gbnVsbCA/IG1vZHVsZUNvbmZpZyA6IG5ldyBEZWZhdWx0RXh0VmFsQmVhblZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgYSBuZXcgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNvcmUtbW9kdWxlDQotICAgICAqDQotICAgICAqIEBwYXJhbSBjb25maWcgVGhlIG5ldyBjb25maWd1cmF0aW9uIGZvciB0aGUgY29yZS1tb2R1bGUNCi0gICAgICogQHBhcmFtIGZvcmNlT3ZlcnJpZGUgdXNlIHRydWUgdG8gcmVwbGFjZSBhbiBleGlzdGluZyBjb25maWd1cmF0aW9uDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmV3IGNvbmZpZyB3YXMgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHkNCi0gICAgICovDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1c2UoRXh0VmFsQmVhblZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiBmb3JjZU92ZXJyaWRlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXh0VmFsQ29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRNb2R1bGVDb25maWd1cmF0aW9uKEV4dFZhbEJlYW5WYWxpZGF0aW9uTW9kdWxlQ29uZmlndXJhdGlvbi5jbGFzcywgY29uZmlnLCBmb3JjZU92ZXJyaWRlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQWxsb3dzIHRvIGN1c3RvbWl6ZSB0aGUge0BsaW5rIFZhbGlkYXRvckZhY3Rvcnl9DQotICAgICAqDQotICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgYSBjdXN0b20ge0BsaW5rIFZhbGlkYXRvckZhY3Rvcnl9LCBudWxsIG90aGVyd2lzZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IFZhbGlkYXRvckZhY3RvcnkgY3VzdG9tVmFsaWRhdG9yRmFjdG9yeSgpOw0KLQ0KLSAgICAvKioNCi0gICAgICogQWxsb3dzIHRvIGN1c3RvbWl6ZSB0aGUge0BsaW5rIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dH0NCi0gICAgICogDQotICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgYSBjdXN0b20ge0BsaW5rIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dH0sIG51bGwgb3RoZXJ3aXNlDQotICAgICAqLw0KLSAgICBwdWJsaWMgYWJzdHJhY3QgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGN1c3RvbUV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCgpOw0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNjM5MDcuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQKLSAgICAgICAgLkFic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIHgueC4zCi0gKi8KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVSZXF1aXJlZEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZighRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoISgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuaXNSZXF1aXJlZCgpICYmCi0gICAgICAgICAgICAgICAgaXNSZXF1aXJlZEluaXRpYWxpemF0aW9uUmVxdWVzdGVkKG1ldGFEYXRhKSAmJgotICAgICAgICAgICAgICAgIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvblN1cHBvcnRlZCh1aUNvbXBvbmVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNSZXF1aXJlZEluaXRpYWxpemF0aW9uUmVxdWVzdGVkKE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkgfHwKLSAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCkpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL01hcHBlZENvbnN0cmFpbnRTb3VyY2VCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9NYXBwZWRDb25zdHJhaW50U291cmNlQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY5MTk0ZS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL01hcHBlZENvbnN0cmFpbnRTb3VyY2VCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSByNA0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIE1hcHBlZENvbnN0cmFpbnRTb3VyY2VCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLSAgICAgICAgZXh0ZW5kcyBCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgTWFwcGVkQ29uc3RyYWludFNvdXJjZUJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzIGNzYUJ2aVV0aWxzID0NCi0gICAgICAgICAgICBuZXcgTWFwcGVkQ29uc3RyYWludFNvdXJjZUJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzKHRoaXMubG9nZ2VyLCB0aGlzLmJ2aVV0aWxzKTsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb21wb25lbnRXaXRoUHJvcGVydHlEZXRhaWxzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNzYUJ2aVV0aWxzLmluaXRDb21wb25lbnRXaXRoUHJvcGVydHlEZXRhaWxzT2ZNYXBwZWRDb25zdHJhaW50U291cmNlKA0KLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBwcm9wZXJ0eURldGFpbHMpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNCZWFuVmFsaWRhdGlvbkNvbnN0cmFpbnRzKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0SW5mb3JtYXRpb24oDQotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICByZXR1cm4gdGhpcy5jc2FCdmlVdGlscy5yZXNvbHZlTWFwcGVkQ29uc3RyYWludFNvdXJjZUZvcihwcm9wZXJ0eURldGFpbHMuZ2V0S2V5KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSkgIT0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ZpZWxkVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxPYmplY3Q+PiB2aW9sYXRpb25zID0gdGhpcy5jc2FCdmlVdGlscw0KLSAgICAgICAgICAgICAgICAudmFsaWRhdGVNYXBwZWRDb25zdHJhaW50U291cmNlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlJbmZvcm1hdGlvbiwgdHJ1ZSk7DQotDQotICAgICAgICBwcm9jZXNzQ29uc3RyYWludFZpb2xhdGlvbnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCB2aW9sYXRpb25zKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL01hcHBlZENvbnN0cmFpbnRTb3VyY2VCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscy5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9NYXBwZWRDb25zdHJhaW50U291cmNlQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgzZjE0Ni4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL01hcHBlZENvbnN0cmFpbnRTb3VyY2VCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNvbnN0cmFpbnRTb3VyY2VVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbC5CZWFuVmFsaWRhdGlvblV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uZ3JvdXBzLkRlZmF1bHQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuRWxlbWVudERlc2NyaXB0b3I7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSByNA0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgTWFwcGVkQ29uc3RyYWludFNvdXJjZUJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzDQotew0KLSAgICBwcml2YXRlIExvZ2dlciBsb2dnZXI7DQotICAgIHByaXZhdGUgQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHMgYnZpVXRpbHM7DQotDQotICAgIE1hcHBlZENvbnN0cmFpbnRTb3VyY2VCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscygNCi0gICAgICAgICAgICBMb2dnZXIgbG9nZ2VyLCBCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscyBidmlVdGlscykNCi0gICAgew0KLSAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7DQotICAgICAgICB0aGlzLmJ2aVV0aWxzID0gYnZpVXRpbHM7DQotICAgIH0NCi0NCi0gICAgdm9pZCBpbml0Q29tcG9uZW50V2l0aFByb3BlcnR5RGV0YWlsc09mTWFwcGVkQ29uc3RyYWludFNvdXJjZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMpDQotICAgIHsNCi0gICAgICAgIENsYXNzW10gZm91bmRHcm91cHMgPSB0aGlzLmJ2aVV0aWxzLnJlc29sdmVHcm91cHMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBpZiAoZm91bmRHcm91cHMgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChmb3VuZEdyb3Vwcy5sZW5ndGggPT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3VuZEdyb3VwcyA9IG5ldyBDbGFzc1tde0RlZmF1bHQuY2xhc3N9Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIGNvbnN0cmFpbnRTb3VyY2VQcm9wZXJ0eURldGFpbHMgPSByZXNvbHZlTWFwcGVkQ29uc3RyYWludFNvdXJjZUZvcigNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzLmdldEtleSgpLCBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCksIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpKTsNCi0NCi0gICAgICAgIGlmKGNvbnN0cmFpbnRTb3VyY2VQcm9wZXJ0eURldGFpbHMgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBlbGVtZW50RGVzY3JpcHRvciA9DQotICAgICAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVXRpbHMuZ2V0RWxlbWVudERlc2NyaXB0b3IoKENsYXNzKSBjb25zdHJhaW50U291cmNlUHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50U291cmNlUHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCkpOw0KLQ0KLSAgICAgICAgaWYgKGVsZW1lbnREZXNjcmlwdG9yID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGhpcy5idmlVdGlscy5wcm9jZXNzRWxlbWVudERlc2NyaXB0b3IoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZm91bmRHcm91cHMsIGVsZW1lbnREZXNjcmlwdG9yKTsNCi0gICAgfQ0KLQ0KLSAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxPYmplY3Q+PiB2YWxpZGF0ZU1hcHBlZENvbnN0cmFpbnRTb3VyY2UoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNhc2NhZGVkVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgYmFzZUJlYW5DbGFzcyA9IHRoaXMuYnZpVXRpbHMuZ2V0QmFzZUNsYXNzVHlwZShwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0aGlzLmJ2aVV0aWxzLmdldFByb3BlcnR5VG9WYWxpZGF0ZShwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgIFN0cmluZyBvcmlnaW5hbEtleSA9IGdldEtleShwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBjb25zdHJhaW50U291cmNlUHJvcGVydHlEZXRhaWxzID0NCi0gICAgICAgICAgICAgICAgcmVzb2x2ZU1hcHBlZENvbnN0cmFpbnRTb3VyY2VGb3Iob3JpZ2luYWxLZXksIGJhc2VCZWFuQ2xhc3MsIHByb3BlcnR5TmFtZSk7DQotDQotICAgICAgICBpZihjb25zdHJhaW50U291cmNlUHJvcGVydHlEZXRhaWxzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7DQotICAgICAgICB9DQotDQotICAgICAgICBiYXNlQmVhbkNsYXNzID0gKENsYXNzKSBjb25zdHJhaW50U291cmNlUHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKTsNCi0gICAgICAgIHByb3BlcnR5TmFtZSA9IGNvbnN0cmFpbnRTb3VyY2VQcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKTsNCi0NCi0gICAgICAgIENsYXNzW10gZ3JvdXBzID0gdGhpcy5idmlVdGlscy5yZXNvbHZlR3JvdXBzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgaWYgKGdyb3VwcyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIEJlYW5WYWxpZGF0aW9uVXRpbHMudmFsaWRhdGUoYmFzZUJlYW5DbGFzcywgcHJvcGVydHlOYW1lLCBjb252ZXJ0ZWRPYmplY3QsIGdyb3VwcywgY2FzY2FkZWRWYWxpZGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRLZXkoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5SW5mb3JtYXRpb24pLmdldEtleSgpOw0KLSAgICB9DQotDQotICAgIFByb3BlcnR5RGV0YWlscyByZXNvbHZlTWFwcGVkQ29uc3RyYWludFNvdXJjZUZvcihTdHJpbmcgb3JpZ2luYWxLZXksIENsYXNzIGJhc2VCZWFuQ2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENvbnN0cmFpbnRTb3VyY2VVdGlscy5yZXNvbHZlTWFwcGVkQ29uc3RyYWludFNvdXJjZUZvcihvcmlnaW5hbEtleSwgYmFzZUJlYW5DbGFzcywgcHJvcGVydHkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9CZWFuVmFsaWRhdGlvbi5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL0JlYW5WYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OTMzYTkuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL0JlYW5WYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uZ3JvdXBzLkRlZmF1bHQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgVFlQRX0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLUBEb2N1bWVudGVkDQotcHVibGljIEBpbnRlcmZhY2UgQmVhblZhbGlkYXRpb24NCi17DQotICAgIFN0cmluZ1tdIHZpZXdJZHMoKSBkZWZhdWx0ICIqIjsNCi0NCi0gICAgQ2xhc3NbXSB1c2VHcm91cHMoKSBkZWZhdWx0IERlZmF1bHQuY2xhc3M7DQotDQotICAgIENsYXNzW10gcmVzdHJpY3RHcm91cHMoKSBkZWZhdWx0IHt9Ow0KLQ0KLSAgICBTdHJpbmdbXSBjb25kaXRpb25zKCkgZGVmYXVsdCAiI3t0cnVlfSI7DQotDQotICAgIE1vZGVsVmFsaWRhdGlvbiBtb2RlbFZhbGlkYXRpb24oKSBkZWZhdWx0IEBNb2RlbFZhbGlkYXRpb247DQotICAgIA0KLSAgICBAUmV0ZW50aW9uKFJVTlRJTUUpIHN0YXRpYyBAaW50ZXJmYWNlIExpc3QNCi0gICAgew0KLSAgICAgICAgQmVhblZhbGlkYXRpb25bXSB2YWx1ZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9Nb2RlbFZhbGlkYXRpb24uamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9Nb2RlbFZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjNzhkZC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vTW9kZWxWYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgVFlQRX0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLUBEb2N1bWVudGVkDQotcHVibGljIEBpbnRlcmZhY2UgTW9kZWxWYWxpZGF0aW9uDQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUID0gIiI7DQotDQotICAgIGJvb2xlYW4gaXNBY3RpdmUoKSBkZWZhdWx0IGZhbHNlOw0KLQ0KLSAgICBib29sZWFuIGRpc3BsYXlJbmxpbmUoKSBkZWZhdWx0IGZhbHNlOw0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic3VwcG9ydCBwcm9wZXJ0eSBjaGFpbiBzeW50YXgiKQ0KLSAgICBTdHJpbmdbXSB2YWxpZGF0aW9uVGFyZ2V0cygpIGRlZmF1bHQgREVGQVVMVDsNCi0NCi0gICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0IERFRkFVTFQ7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdEdyb3VwQ29udHJvbGxlclNjYW5uaW5nRXh0cmFjdG9yLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGJlYjIyLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdEdyb3VwQ29udHJvbGxlclNjYW5uaW5nRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLmV4dHJhY3RvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLkRlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxBbm5vdGF0aW9uVXRpbHMuZXh0cmFjdEFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAidXNlIG1ldGEtZGF0YSBzdG9yYWdlIC0gYnV0IGEgc3BlY2lhbCBpbXBsLiIpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEdyb3VwQ29udHJvbGxlclNjYW5uaW5nRXh0cmFjdG9yIGV4dGVuZHMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yDQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFByb3BlcnR5SW5mb3JtYXRpb24gZXh0cmFjdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBPYmplY3Qgb2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBQcm9wZXJ0eURldGFpbHMpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24ob2JqZWN0LmdldENsYXNzKCkgKyAiIGlzIG5vdCBhICIgKyBQcm9wZXJ0eURldGFpbHMuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSAoUHJvcGVydHlEZXRhaWxzKW9iamVjdDsNCi0NCi0gICAgICAgIENsYXNzIGVudGl0eUNsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCkpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGV4dHJhY3RBbm5vdGF0aW9ucyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ZhY3RvcnkvRXh0VmFsQXBwbGljYXRpb25GYWN0b3J5LmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ZhY3RvcnkvRXh0VmFsQXBwbGljYXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNWM3YzMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9mYWN0b3J5L0V4dFZhbEFwcGxpY2F0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAyLnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbEFwcGxpY2F0aW9uRmFjdG9yeSBleHRlbmRzIEFwcGxpY2F0aW9uRmFjdG9yeQ0KLXsNCi0gICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkZhY3Rvcnkgd3JhcHBlZDsNCi0NCi0gICAgcHVibGljIEV4dFZhbEFwcGxpY2F0aW9uRmFjdG9yeShBcHBsaWNhdGlvbkZhY3Rvcnkgd3JhcHBlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQXBwbGljYXRpb25GYWN0b3J5IGdldFdyYXBwZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkLmdldFdyYXBwZWQoKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkhJR0gsIGRlc2NyaXB0aW9uID0gImNvbnRleHQgcGFyYW0uIHRvIGRlYWN0aXZhdGUgdGhpcyB3cmFwcGVyIikNCi0gICAgcHVibGljIEFwcGxpY2F0aW9uIGdldEFwcGxpY2F0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxBcHBsaWNhdGlvbldyYXBwZXIodGhpcy53cmFwcGVkLmdldEFwcGxpY2F0aW9uKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQuc2V0QXBwbGljYXRpb24oYXBwbGljYXRpb24pOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvZmFjdG9yeS9FeHRWYWxBcHBsaWNhdGlvbldyYXBwZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvZmFjdG9yeS9FeHRWYWxBcHBsaWNhdGlvbldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIwMmY4YS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ZhY3RvcnkvRXh0VmFsQXBwbGljYXRpb25XcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbldyYXBwZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSByNA0KLSAqLw0KLWNsYXNzIEV4dFZhbEFwcGxpY2F0aW9uV3JhcHBlciBleHRlbmRzIEFwcGxpY2F0aW9uV3JhcHBlcg0KLXsNCi0gICAgcHJpdmF0ZSBBcHBsaWNhdGlvbiB3cmFwcGVkOw0KLQ0KLSAgICBwdWJsaWMgRXh0VmFsQXBwbGljYXRpb25XcmFwcGVyKEFwcGxpY2F0aW9uIHdyYXBwZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEFwcGxpY2F0aW9uIGdldFdyYXBwZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBhZGREZWZhdWx0VmFsaWRhdG9ySWQoU3RyaW5nIHMpDQotICAgIHsNCi0gICAgICAgIGlmKCEiamF2YXguZmFjZXMuQmVhbiIuZXF1YWxzKHMpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN1cGVyLmFkZERlZmF1bHRWYWxpZGF0b3JJZChzKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0JlYW5WYWxpZGF0aW9uVGFnQXdhcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvQmVhblZhbGlkYXRpb25UYWdBd2FyZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2YwMjgwLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvQmVhblZhbGlkYXRpb25UYWdBd2FyZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuQmVhblZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMi54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvblRhZ0F3YXJlVmFsaWRhdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyICYmIC8vImZpbHRlciIgY3Jvc3MtdmFsaWRhdGlvbiBjYWxscw0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFByb3BlcnR5SW5mb3JtYXRpb24uY2xhc3MuZ2V0TmFtZSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbnNwZWN0VmFsaWRhdG9ycyhmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5nZXRWaWV3SWQoKSwNCi0gICAgICAgICAgICAgICAgICAgIChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSwNCi0gICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuZ2V0VmFsaWRhdG9ycygpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICAvL25vdCB1c2VkDQotICAgIH0NCi0NCi0gICAgQFRvRG8uTGlzdCh7QFRvRG8odmFsdWUgPSBQcmlvcml0eS5ISUdILCBkZXNjcmlwdGlvbiA9ICJvcHRpbWl6ZSIpLA0KLSAgICAgICAgICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuSElHSCwgZGVzY3JpcHRpb24gPSAidXNlIHJlZmxlY3Rpb24gaW5zdGVhZCBvZiBCZWFuVmFsaWRhdG9yIGZvciBqc2YgMS54IHZlcnNpb25zIiksDQotICAgICAgICAgICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5ISUdILCBkZXNjcmlwdGlvbiA9ICJ0ZXN0IikNCi0gICAgfSkNCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RWYWxpZGF0b3JzKFN0cmluZyB2aWV3SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0YWJsZVZhbHVlSG9sZGVyIGVkaXRhYmxlVmFsdWVIb2xkZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xpZW50SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JbXSB2YWxpZGF0b3JzKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFN0cmluZz4gZ3JvdXBzQ2xhc3NOYW1lc09mVGFnTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yIChWYWxpZGF0b3IgdmFsaWRhdG9yIDogdmFsaWRhdG9ycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWxpZGF0b3IgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdG9yKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoKChCZWFuVmFsaWRhdG9yKSB2YWxpZGF0b3IpLmdldFZhbGlkYXRpb25Hcm91cHMoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBncm91cHNDbGFzc05hbWVzT2ZUYWdMaXN0LmFkZEFsbCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgoKEJlYW5WYWxpZGF0b3IpIHZhbGlkYXRvcikuZ2V0VmFsaWRhdGlvbkdyb3VwcygpLnNwbGl0KCIsIikpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscyhCZWFuVmFsaWRhdG9yLmNsYXNzLmdldE5hbWUoKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vcHJldmVudCBkb3VibGUtdmFsaWRhdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgZWRpdGFibGVWYWx1ZUhvbGRlci5yZW1vdmVWYWxpZGF0b3IodmFsaWRhdG9yKTsNCi0gICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlVmFsdWVIb2xkZXIuYWRkVmFsaWRhdG9yKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsQmVhblZhbGlkYXRvcigoKEJlYW5WYWxpZGF0b3IpdmFsaWRhdG9yKS5nZXRWYWxpZGF0aW9uR3JvdXBzKCkpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBiZWFuVmFsaWRhdGlvbkNvbnRleHQgPSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3M7DQotICAgICAgICBmb3IoU3RyaW5nIGdyb3VwQ2xhc3NOYW1lIDogZ3JvdXBzQ2xhc3NOYW1lc09mVGFnTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShncm91cENsYXNzTmFtZS50cmltKCkpOw0KLQ0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRDbGFzcyAhPSBudWxsICYmIGN1cnJlbnRDbGFzcy5pc0ludGVyZmFjZSgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYmVhblZhbGlkYXRpb25Db250ZXh0LmFkZEdyb3VwKGN1cnJlbnRDbGFzcywgdmlld0lkLCBjbGllbnRJZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnNldmVyZShncm91cENsYXNzTmFtZSArICIgaXMgbm8gdmFsaWQgZ3JvdXAgLSBvbmx5IGV4aXN0aW5nIGludGVyZmFjZXMgYXJlIGFsbG93ZWQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0V4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJlZDdmNy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0V4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5WYWxpZGF0aW9uTW9kdWxlQXdhcmU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuQmVhblZhbGlkYXRpb25Nb2R1bGVLZXk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWwuQmVhblZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogZXh0cmFjdHMgYW5kIGFkZHMgdGhlIGV4dHZhbCBidiBtZXRhLWRhdGEgKGUuZy4gdmFsaWRhdGlvbiBncm91cHMpIHRvIHRoZSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi0gICAgICAgIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IsIFZhbGlkYXRpb25Nb2R1bGVBd2FyZQ0KLXsNCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYocHJvcGVydHlJbmZvcm1hdGlvbi5jb250YWluc0luZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkNVU1RPTV9QUk9QRVJUSUVTKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBNYXAgcHJvcGVydGllcyA9IHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuQ1VTVE9NX1BST1BFUlRJRVMsIE1hcC5jbGFzcyk7DQotDQotICAgICAgICAgICAgaWYocHJvcGVydGllcyAhPSBudWxsICYmIHByb3BlcnRpZXMuY29udGFpbnNLZXkoVUlDb21wb25lbnQuY2xhc3MuZ2V0TmFtZSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50ID0gKFVJQ29tcG9uZW50KXByb3BlcnRpZXMuZ2V0KFVJQ29tcG9uZW50LmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscy5nZXRQcm9wZXJ0eURldGFpbHMocHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgICAgICAgICAgICAgIGlmKHByb3BlcnR5RGV0YWlscyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YSh1aUNvbXBvbmVudCwgcHJvcGVydHlEZXRhaWxzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogYWRkcyB0aGUgZXh0dmFsIGJ2IG1ldGEtZGF0YSB0byB0aGUgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0DQotICAgICAqDQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlEZXRhaWxzIHByb3BlcnR5IGRldGFpbHMgb2YgdGhlIHZhbHVlLWJpbmRpbmcNCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscykNCi0gICAgew0KLSAgICAgICAgaWYocHJvcGVydHlEZXRhaWxzLmdldEtleSgpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBpZihKc2ZVdGlscy5pc1JlbmRlclJlc3BvbnNlUGhhc2UoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBCZWFuVmFsaWRhdGlvblV0aWxzLmFkZE1ldGFEYXRhVG9Db250ZXh0KHVpQ29tcG9uZW50LCBwcm9wZXJ0eURldGFpbHMsIGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBCZWFuVmFsaWRhdGlvblV0aWxzLmFkZE1ldGFEYXRhVG9Db250ZXh0KHVpQ29tcG9uZW50LCBwcm9wZXJ0eURldGFpbHMsIHRydWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNb2R1bGVLZXlzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7QmVhblZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpfTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0V4dFZhbEJlYW5WYWxpZGF0b3IuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvRXh0VmFsQmVhblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGM5N2JjLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvRXh0VmFsQmVhblZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkJlYW5WYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotDQotLyoqDQotICogcmVwbGFjZW1lbnQgZm9yIEJlYW5WYWxpZGF0b3Igd2hpY2ggZ2V0cyBhZGRlZCBkdWUgdG8gZjp2YWxpZGF0ZUJlYW4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAyLnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbEJlYW5WYWxpZGF0b3IgZXh0ZW5kcyBCZWFuVmFsaWRhdG9yDQotew0KLSAgICBwdWJsaWMgRXh0VmFsQmVhblZhbGlkYXRvcigpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBFeHRWYWxCZWFuVmFsaWRhdG9yKFN0cmluZyB2YWxpZGF0aW9uR3JvdXBzKQ0KLSAgICB7DQotICAgICAgICBzZXRWYWxpZGF0aW9uR3JvdXBzKHZhbGlkYXRpb25Hcm91cHMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgLy9kb24ndCB2YWxpZGF0ZSAtIHRoZSBleHR2YWwgYmVhbi12YWxpZGF0aW9uIGFkYXB0ZXIgd2lsbCBkbyB0aGF0DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDNjM2ZmLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QmVhblZhbGlkYXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyPFQgZXh0ZW5kcyBBbm5vdGF0aW9uPiBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIENvbnN0cmFpbnREZXNjcmlwdG9yPD8gZXh0ZW5kcyBUPiBjb25zdHJhaW50RGVzY3JpcHRvciA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoQ29uc3RyYWludERlc2NyaXB0b3IuY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYoaXNDbGllbnRTaWRlVmFsaWRhdGlvbkVuYWJsZWQoY29uc3RyYWludERlc2NyaXB0b3IpICYmIGlzQmxvY2tpbmdDb25zdHJhaW50KGNvbnN0cmFpbnREZXNjcmlwdG9yKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtTWV0YURhdGEoKENvbnN0cmFpbnREZXNjcmlwdG9yPFQ+KWNvbnN0cmFpbnREZXNjcmlwdG9yKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ2xpZW50U2lkZVZhbGlkYXRpb25FbmFibGVkKENvbnN0cmFpbnREZXNjcmlwdG9yPD8gZXh0ZW5kcyBUPiBjb25zdHJhaW50RGVzY3JpcHRvcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICFjb25zdHJhaW50RGVzY3JpcHRvci5nZXRQYXlsb2FkKCkuY29udGFpbnMoDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Jsb2NraW5nQ29uc3RyYWludChDb25zdHJhaW50RGVzY3JpcHRvcjw/PiBjb25zdHJhaW50RGVzY3JpcHRvcikNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIHRlc3RNZXNzYWdlID0gbmV3IEZhY2VzTWVzc2FnZSgpOw0KLSAgICAgICAgdGVzdE1lc3NhZ2Uuc2V0U2V2ZXJpdHkoVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuVkFMVUUpOw0KLQ0KLSAgICAgICAgZm9yIChDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD4gcGF5bG9hZCA6IGNvbnN0cmFpbnREZXNjcmlwdG9yLmdldFBheWxvYWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MpLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0ZXN0TWVzc2FnZS5zZXRTZXZlcml0eShWaW9sYXRpb25TZXZlcml0eS5XYXJuLlZBTFVFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZihFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoVmlvbGF0aW9uU2V2ZXJpdHkuSW5mby5jbGFzcykuaXNBc3NpZ25hYmxlRnJvbShwYXlsb2FkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRlc3RNZXNzYWdlLnNldFNldmVyaXR5KFZpb2xhdGlvblNldmVyaXR5LkluZm8uVkFMVUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihWaW9sYXRpb25TZXZlcml0eS5GYXRhbC5jbGFzcykuaXNBc3NpZ25hYmxlRnJvbShwYXlsb2FkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRlc3RNZXNzYWdlLnNldFNldmVyaXR5KFZpb2xhdGlvblNldmVyaXR5LkZhdGFsLlZBTFVFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuc2V2ZXJpdHlCbG9ja3NTdWJtaXRGb3JDb21wb25lbnRJZChudWxsLCB0ZXN0TWVzc2FnZSk7DQotICAgIH0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoQ29uc3RyYWludERlc2NyaXB0b3I8VD4gY29uc3RyYWludERlc2NyaXB0b3IpOw0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL05vdE51bGxNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL05vdE51bGxNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMDhkNWEuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ob3ROdWxsTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBOb3ROdWxsTWV0YURhdGFUcmFuc2Zvcm1lciBleHRlbmRzIEFic3RyYWN0QmVhblZhbGlkYXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyPE5vdE51bGw+DQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShDb25zdHJhaW50RGVzY3JpcHRvcjxOb3ROdWxsPiBjb25zdHJhaW50RGVzY3JpcHRvcikNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBpZihFeHRWYWxVdGlscy5pbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU3RyaW5nU2l6ZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU3RyaW5nU2l6ZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE5ZmY1OC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1N0cmluZ1NpemVNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgU3RyaW5nU2l6ZU1ldGFEYXRhVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdEJlYW5WYWxpZGF0aW9uTWV0YURhdGFUcmFuc2Zvcm1lcjxTaXplPg0KLXsNCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoQ29uc3RyYWludERlc2NyaXB0b3I8U2l6ZT4gY29uc3RyYWludERlc2NyaXB0b3IpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgU2l6ZSBhbm5vdGF0aW9uID0gY29uc3RyYWludERlc2NyaXB0b3IuZ2V0QW5ub3RhdGlvbigpOw0KLQ0KLSAgICAgICAgaW50IG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbigpOw0KLQ0KLSAgICAgICAgaWYobWluaW11bSAhPSAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RILCBtaW5pbXVtKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSF9ERUZBVUxULCBtaW5pbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGludCBtYXhpbXVtID0gYW5ub3RhdGlvbi5tYXgoKTsNCi0gICAgICAgIGlmKG1heGltdW0gIT0gSW50ZWdlci5NQVhfVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIX0RFRkFVTFQsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBlMDMxYy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyDQotICAgICAgICAuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIGlmKGlzQmVhblZhbGlkYXRpb25TdHJhdGVneShzb3VyY2UpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSBiZWFuVmFsaWRhdGlvbkFkYXB0ZXIgPQ0KLSAgICAgICAgICAgICAgICAgICAgKEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSlzb3VyY2U7DQotDQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUJlYW5WYWxpZGF0aW9uVHJhbnNmb3JtZXJOYW1lKGJlYW5WYWxpZGF0aW9uQWRhcHRlcik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNCZWFuVmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzb3VyY2UgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkICBhYnN0cmFjdCBTdHJpbmcgY3JlYXRlQmVhblZhbGlkYXRpb25UcmFuc2Zvcm1lck5hbWUoDQotICAgICAgICAgICAgQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSk7DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL05vdE51bGxOYW1lTWFwcGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9Ob3ROdWxsTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzI4Nzg2Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL05vdE51bGxOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk5vdE51bGxNZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuTmVzdGVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBOZXN0ZWQNCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIE5vdE51bGxOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZUJlYW5WYWxpZGF0aW9uVHJhbnNmb3JtZXJOYW1lKEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSBhZGFwdGVyKQ0KLSAgICB7DQotICAgICAgICBpZihpc05vdE51bGxDb25zdHJhaW50KGFkYXB0ZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBOb3ROdWxsTWV0YURhdGFUcmFuc2Zvcm1lci5jbGFzcy5nZXROYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNOb3ROdWxsQ29uc3RyYWludChCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgYWRhcHRlcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIE5vdE51bGwuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscygNCi0gICAgICAgICAgICAgICAgYWRhcHRlci5nZXRDb25zdHJhaW50RGVzY3JpcHRvcigpLmdldEFubm90YXRpb24oKS5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2l6ZU5hbWVNYXBwZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpemVOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjODkwYzYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2l6ZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuTmVzdGVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyLlN0cmluZ1NpemVNZXRhRGF0YVRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQE5lc3RlZA0KLUBJbnZvY2F0aW9uT3JkZXIoMjEwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgU2l6ZU5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlQmVhblZhbGlkYXRpb25UcmFuc2Zvcm1lck5hbWUoQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5IGFkYXB0ZXIpDQotICAgIHsNCi0gICAgICAgIGlmKGlzU3RyaW5nU2l6ZUNvbnN0cmFpbnQoYWRhcHRlcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIFN0cmluZ1NpemVNZXRhRGF0YVRyYW5zZm9ybWVyLmNsYXNzLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1N0cmluZ1NpemVDb25zdHJhaW50KEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSBhZGFwdGVyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU2l6ZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKA0KLSAgICAgICAgICAgICAgICBhZGFwdGVyLmdldENvbnN0cmFpbnREZXNjcmlwdG9yKCkuZ2V0QW5ub3RhdGlvbigpLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpKSAmJg0KLSAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhhZGFwdGVyLmdldEVsZW1lbnRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wYXlsb2FkL0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wYXlsb2FkL0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjJkMjJmLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvcGF5bG9hZC9EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uIGV4dGVuZHMgUGF5bG9hZA0KLXsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wYXlsb2FkL1Zpb2xhdGlvblNldmVyaXR5LmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3BheWxvYWQvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4OGIyZC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3BheWxvYWQvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWaW9sYXRpb25TZXZlcml0eQ0KLXsNCi0gICAgaW50ZXJmYWNlIEluZm8gZXh0ZW5kcyBQYXlsb2FkDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBWQUxVRSA9IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9JTkZPOw0KLSAgICB9DQotDQotICAgIGludGVyZmFjZSBXYXJuIGV4dGVuZHMgUGF5bG9hZA0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgVkFMVUUgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfV0FSTjsNCi0gICAgfQ0KLQ0KLSAgICBpbnRlcmZhY2UgRXJyb3IgZXh0ZW5kcyBQYXlsb2FkDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBWQUxVRSA9IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUjsNCi0gICAgfQ0KLQ0KLSAgICBpbnRlcmZhY2UgRmF0YWwgZXh0ZW5kcyBQYXlsb2FkDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBWQUxVRSA9IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9GQVRBTDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0YXJ0dXAvQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RhcnR1cC9CZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzA3NjBmLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RhcnR1cC9CZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLkJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuTWFwcGVkQ29uc3RyYWludFNvdXJjZUJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLlZpb2xhdGlvblNldmVyaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbC5CZWFuVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5pbnRlcmNlcHRvci5FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLk1vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlci5TaXplTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyLk5vdE51bGxOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLkRlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5Nb2RlbFZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLm1hcHBlci5CZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UubWFwcGVyLk1vZGVsVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuR3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VySG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MDI1NzQ4Mzk5ODc2ODMzMzk0TDsNCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyVmFsaWRhdG9yRmFjdG9yeSgpOw0KLSAgICAgICAgcmVnaXN0ZXJCZWFuVmFsaWRhdGlvbkludGVyY2VwdG9ycygpOw0KLSAgICAgICAgcmVnaXN0ZXJNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpOw0KLSAgICAgICAgcmVnaXN0ZXJHcm91cFN0b3JhZ2VOYW1lTWFwcGVyKCk7DQotICAgICAgICByZWdpc3Rlck1vZGVsVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyKCk7DQotICAgICAgICByZWdpc3RlckNvbXBvbmVudEluaXRpYWxpemVycygpOw0KLSAgICAgICAgcmVnaXN0ZXJNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsNCi0gICAgICAgIHJlZ2lzdGVyUGhhc2VMaXN0ZW5lcnMoKTsNCi0gICAgICAgIHJlZ2lzdGVyVmlvbGF0aW9uU2V2ZXJpdHlQYXlsb2FkKCk7DQotICAgICAgICByZWdpc3RlckRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvblBheWxvYWQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclZhbGlkYXRvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBWYWxpZGF0b3JGYWN0b3J5IHZhbGlkYXRvckZhY3Rvcnk7DQotICAgICAgICBPYmplY3QgY29udGV4dEF3YXJlVmFsaWRhdG9yRmFjdG9yeSA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbigiY29udGV4dEF3YXJlVmFsaWRhdG9yRmFjdG9yeSIpOw0KLQ0KLSAgICAgICAgaWYoY29udGV4dEF3YXJlVmFsaWRhdG9yRmFjdG9yeSBpbnN0YW5jZW9mIFZhbGlkYXRvckZhY3RvcnkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdG9yRmFjdG9yeSA9IChWYWxpZGF0b3JGYWN0b3J5KWNvbnRleHRBd2FyZVZhbGlkYXRvckZhY3Rvcnk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdG9yRmFjdG9yeSA9IG5ldyBCZWFuQXdhcmVWYWxpZGF0b3JGYWN0b3J5KEJlYW5WYWxpZGF0aW9uVXRpbHMuZ2V0RGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eShWYWxpZGF0b3JGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSwgdmFsaWRhdG9yRmFjdG9yeSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyQmVhblZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IoDQotICAgICAgICAgICAgICAgIG5ldyBCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcigNCi0gICAgICAgICAgICAgICAgbmV3IE1hcHBlZENvbnN0cmFpbnRTb3VyY2VCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlck1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKG5ldyBTaXplTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcihuZXcgTm90TnVsbE5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJHcm91cFN0b3JhZ2VOYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgU3RvcmFnZU1hbmFnZXIgc3RvcmFnZU1hbmFnZXIgPSBnZXRTdG9yYWdlTWFuYWdlckhvbGRlcigpLmdldFN0b3JhZ2VNYW5hZ2VyKEdyb3VwU3RvcmFnZS5jbGFzcyk7DQotDQotICAgICAgICBpZiAoc3RvcmFnZU1hbmFnZXIgaW5zdGFuY2VvZiBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkpDQotICAgICAgICB7DQotICAgICAgICAgICAgKChBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8U3RyaW5nPikgc3RvcmFnZU1hbmFnZXIpDQotICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuaW5nKHN0b3JhZ2VNYW5hZ2VyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsNCi0gICAgICAgICAgICAgICAgICAgICIgaGFzIHRvIGltcGxlbWVudCBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsNCi0gICAgICAgICAgICAgICAgICAgICIgY291bGRuJ3QgcmVnaXN0ZXIgIiArIEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBEZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgbW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgPSBuZXcgRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyKCk7DQotICAgICAgICBtb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5yZWdpc3RlcihuZXcgTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBnZXRTdG9yYWdlTWFuYWdlckhvbGRlcigpLnNldFN0b3JhZ2VNYW5hZ2VyKE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MsIG1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJDb21wb25lbnRJbml0aWFsaXplcnMoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0b3JhZ2VNYW5hZ2VySG9sZGVyIGdldFN0b3JhZ2VNYW5hZ2VySG9sZGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwgU3RvcmFnZU1hbmFnZXJIb2xkZXIuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlck1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclBoYXNlTGlzdGVuZXJzKCkNCi0gICAgew0KLSAgICAgICAgSnNmVXRpbHMucmVnaXN0ZXJQaGFzZUxpc3RlbmVyKG5ldyBNb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyVmlvbGF0aW9uU2V2ZXJpdHlQYXlsb2FkKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dCBleHRWYWxDb250ZXh0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCk7DQotDQotICAgICAgICBleHRWYWxDb250ZXh0LmFkZEdsb2JhbFByb3BlcnR5KFZpb2xhdGlvblNldmVyaXR5LkluZm8uY2xhc3MuZ2V0TmFtZSgpLCBWaW9sYXRpb25TZXZlcml0eS5JbmZvLmNsYXNzLCBmYWxzZSk7DQotICAgICAgICBleHRWYWxDb250ZXh0LmFkZEdsb2JhbFByb3BlcnR5KFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MuZ2V0TmFtZSgpLCBWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzLCBmYWxzZSk7DQotICAgICAgICBleHRWYWxDb250ZXh0LmFkZEdsb2JhbFByb3BlcnR5KFZpb2xhdGlvblNldmVyaXR5LkZhdGFsLmNsYXNzLmdldE5hbWUoKSwgVmlvbGF0aW9uU2V2ZXJpdHkuRmF0YWwuY2xhc3MsIGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gbmVlZCB0byByZWdpc3RlciAiZXJyb3IiIGl0J3MgdGhlIGRlZmF1bHQNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb25QYXlsb2FkKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoDQotICAgICAgICAgICAgICAgIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCksIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcywgZmFsc2UpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RhcnR1cC9KU0YyQXdhcmVCZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdGFydHVwL0pTRjJBd2FyZUJlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZjM1MzguLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdGFydHVwL0pTRjJBd2FyZUJlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkFic3RyYWN0U3RhcnR1cExpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5pbnRlcmNlcHRvci5CZWFuVmFsaWRhdGlvblRhZ0F3YXJlVmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDIueC4zDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5ISUdILCBkZXNjcmlwdGlvbiA9ICJhZGQgb3B0aW9uYWwgd2ViLnhtbCBwYXJhbSB0byBkZWFjdGl2YXRlIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKU0YyQXdhcmVCZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTAyNTc0ODM5OTg3NjgzMzM5M0w7DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgQmVhblZhbGlkYXRpb25UYWdBd2FyZVZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MDM3NmUuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRCZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0R3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbiBmb3IgYmVhbi12YWxpZGF0aW9uIGdyb3Vwcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRCZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZSBleHRlbmRzIERlZmF1bHRHcm91cFN0b3JhZ2UNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgQ2xhc3NbXSBnZXRHcm91cHMoU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICBDbGFzc1tdIHJlc3VsdCA9IHN1cGVyLmdldEdyb3Vwcyh2aWV3SWQsIGNsaWVudElkKTsNCi0NCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vdGhlIGRlZmF1bHQgZ3JvdXAgd2lsbCBiZSB2YWxpZGF0ZWQgYXV0b21hdGljYWxseQ0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3NbXSB7fTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgwMGY4Yi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Hcm91cFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIHN0b3JhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG1vZGVsLXZhbGlkYXRpb24gZW50cmllcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlIGltcGxlbWVudHMgTW9kZWxWYWxpZGF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5Pj4gbW9kZWxWYWxpZGF0aW9uRW50cmllcyA9DQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5Pj4oKTsNCi0NCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gY29tcG9uZW50c09mUmVxdWVzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRNb2RlbFZhbGlkYXRpb25FbnRyeShNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGNsaWVudElkID0gZ2V0Q3VycmVudENsaWVudElkKG1vZGVsVmFsaWRhdGlvbkVudHJ5KTsNCi0NCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9IHJlc29sdmVNb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QoDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBjbGllbnRJZCk7DQotDQotICAgICAgICBhZGRNb2RlbFZhbGlkYXRpb25FbnRyeShtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsIG1vZGVsVmFsaWRhdGlvbkVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRDdXJyZW50Q2xpZW50SWQoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjbGllbnRJZCA9IG51bGw7DQotDQotICAgICAgICBpZihtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNsaWVudElkID0gbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKTsNCi0NCi0gICAgICAgICAgICBpZighdGhpcy5jb21wb25lbnRzT2ZSZXF1ZXN0LmNvbnRhaW5zKGNsaWVudElkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c09mUmVxdWVzdC5hZGQoY2xpZW50SWQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjbGllbnRJZDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IHJlc29sdmVNb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QoDQotICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0ID0NCi0gICAgICAgICAgICAgICAgdGhpcy5tb2RlbFZhbGlkYXRpb25FbnRyaWVzLmdldChHcm91cFV0aWxzLmdldEdyb3VwS2V5KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldFZpZXdJZCgpLCBjbGllbnRJZCkpOw0KLQ0KLSAgICAgICAgaWYobW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0ID0gbmV3IEFycmF5TGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4oKTsNCi0gICAgICAgICAgICB0aGlzLm1vZGVsVmFsaWRhdGlvbkVudHJpZXMucHV0KEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkoDQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRWaWV3SWQoKSwgY2xpZW50SWQpLCBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoDQotICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LCBNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSkNCi0gICAgew0KLSAgICAgICAgaWYoIW1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdC5jb250YWlucyhtb2RlbFZhbGlkYXRpb25FbnRyeSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LmFkZChtb2RlbFZhbGlkYXRpb25FbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXNUb1ZhbGlkYXRlKCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZpZXdJZCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldFZpZXdJZCgpOw0KLSAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4oKTsNCi0NCi0gICAgICAgIGFkZEVudHJpZXNGb3JDb21wb25lbnRzKHZpZXdJZCwgcmVzdWx0KTsNCi0NCi0gICAgICAgIGFkZEVudHJpZXNGb3JQYWdlKHZpZXdJZCwgcmVzdWx0KTsNCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEVudHJpZXNGb3JDb21wb25lbnRzKFN0cmluZyB2aWV3SWQsIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgZm9yKFN0cmluZyBjdXJyZW50Q2xpZW50SWQgOiB0aGlzLmNvbXBvbmVudHNPZlJlcXVlc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmFkZEFsbChnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzKHZpZXdJZCwgY3VycmVudENsaWVudElkKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEVudHJpZXNGb3JQYWdlKFN0cmluZyB2aWV3SWQsIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgcmVzdWx0LmFkZEFsbChnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzKHZpZXdJZCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gYnVpbGRNb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QoDQotICAgICAgICAgICAgU3RyaW5nIGtleSwgTWFwPFN0cmluZywgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4+IGdyb3VwU3RvcmFnZSkNCi0gICAgew0KLSAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbGlzdDsNCi0NCi0gICAgICAgIGlmKGtleSAhPSBudWxsICYmIGtleS5lbmRzV2l0aCgiKiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PigpOw0KLSAgICAgICAgICAgIGZvcihNYXAuRW50cnk8U3RyaW5nLExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+PiBlbnRyeSA6IGdyb3VwU3RvcmFnZS5lbnRyeVNldCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0S2V5KCkuc3Vic3RyaW5nKDAsIGVudHJ5LmdldEtleSgpLmluZGV4T2YoIkAiKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGtleS5zdWJzdHJpbmcoMCwga2V5LmluZGV4T2YoIkAiKSkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZEFsbChlbnRyeS5nZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbGlzdDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGxpc3QgPSBncm91cFN0b3JhZ2UuZ2V0KGtleSk7DQotICAgICAgICByZXR1cm4gKGxpc3QgIT0gbnVsbCkgPyBsaXN0IDogbmV3IEFycmF5TGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXMoU3RyaW5nIHZpZXdJZCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXModmlld0lkLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXMoU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLm1vZGVsVmFsaWRhdGlvbkVudHJpZXMuc2l6ZSgpIDwgMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vYWRkIGZvdW5kIGdyb3Vwcw0KLSAgICAgICAgU3RyaW5nIGtleTsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IHJlc3VsdExpc3RGb3JQYWdlID0gbnVsbDsNCi0NCi0gICAgICAgIGlmKCEiKiIuZXF1YWxzKGNsaWVudElkKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBrZXkgPSBHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgbnVsbCk7DQotICAgICAgICAgICAgcmVzdWx0TGlzdEZvclBhZ2UgPQ0KLSAgICAgICAgICAgICAgICAgICAgYnVpbGRNb2RlbFZhbGlkYXRpb25FbnRyeUxpc3Qoa2V5LCB0aGlzLm1vZGVsVmFsaWRhdGlvbkVudHJpZXMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAga2V5ID0gR3JvdXBVdGlscy5nZXRHcm91cEtleSh2aWV3SWQsIGNsaWVudElkKTsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IHJlc3VsdExpc3RGb3JDb21wb25lbnQgPQ0KLSAgICAgICAgICAgICAgICBidWlsZE1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdChrZXksIHRoaXMubW9kZWxWYWxpZGF0aW9uRW50cmllcyk7DQotDQotICAgICAgICBpZihyZXN1bHRMaXN0Rm9yUGFnZSA9PSBudWxsIHx8IHJlc3VsdExpc3RGb3JQYWdlLmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0TGlzdEZvckNvbXBvbmVudDsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYocmVzdWx0TGlzdEZvckNvbXBvbmVudC5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdExpc3RGb3JQYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG1lcmdlUmVzdWx0cyhyZXN1bHRMaXN0Rm9yUGFnZSwgcmVzdWx0TGlzdEZvckNvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtZXJnZVJlc3VsdHMoDQotICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gcmVzdWx0TGlzdEZvclBhZ2UsIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IHJlc3VsdExpc3RGb3JDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1lcmdlZFJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICBtZXJnZWRSZXN1bHQuYWRkQWxsKHJlc3VsdExpc3RGb3JQYWdlKTsNCi0gICAgICAgIG1lcmdlZFJlc3VsdC5hZGRBbGwocmVzdWx0TGlzdEZvckNvbXBvbmVudCk7DQotICAgICAgICByZXR1cm4gbWVyZ2VkUmVzdWx0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhMTY2ZS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgbW9kZWwtdmFsaWRhdGlvbiBlbnRyaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyDQotICAgICAgICBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxNb2RlbFZhbGlkYXRpb25TdG9yYWdlPg0KLXsNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcga2V5ID0gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfTU9ERUxfVkFMSURBVElPTjpLRVkiOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGtleTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvTW9kZWxWYWxpZGF0aW9uRW50cnkuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzhhOGYzLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuQVBJOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oQVBJKQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25FbnRyeQ0KLXsNCi0gICAgcHJpdmF0ZSBVSUNvbXBvbmVudCBjb21wb25lbnQ7DQotICAgIHByaXZhdGUgTGlzdDxDbGFzcz4gZ3JvdXBzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgcHJpdmF0ZSBMaXN0PE9iamVjdD4gdmFsaWRhdGlvblRhcmdldHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGRpc3BsYXlNZXNzYWdlSW5saW5lID0gZmFsc2U7DQotICAgIHByaXZhdGUgU3RyaW5nIGN1c3RvbU1lc3NhZ2UgPSBNb2RlbFZhbGlkYXRpb24uREVGQVVMVDsNCi0gICAgDQotICAgIC8vdGhlIG9yaWdpbmFsIHNvdXJjZSB3aGVyZSB0aGUgZXh0dmFsLWJ2IG1ldGEtZGF0YSBoYXMgYmVlbiBmb3VuZA0KLSAgICBwcml2YXRlIE9iamVjdCBtZXRhRGF0YVNvdXJjZU9iamVjdDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmlld0lkID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0Vmlld0lkKCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEdyb3VwKENsYXNzIGdyb3VwKQ0KLSAgICB7DQotICAgICAgICBpZighdGhpcy5ncm91cHMuY29udGFpbnMoZ3JvdXApKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCEodGhpcy5ncm91cHMgaW5zdGFuY2VvZiBBcnJheUxpc3QpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gbmV3R3JvdXBMaXN0ID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgICAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRDbGFzcyA6IHRoaXMuZ3JvdXBzKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBuZXdHcm91cExpc3QuYWRkKGN1cnJlbnRDbGFzcyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgdGhpcy5ncm91cHMgPSBuZXdHcm91cExpc3Q7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHRoaXMuZ3JvdXBzLmFkZChncm91cCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlR3JvdXAoQ2xhc3MgZ3JvdXApDQotICAgIHsNCi0gICAgICAgIHRoaXMuZ3JvdXBzLnJlbW92ZShncm91cCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkVmFsaWRhdGlvblRhcmdldChPYmplY3QgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBpZighdGhpcy52YWxpZGF0aW9uVGFyZ2V0cy5jb250YWlucyh0YXJnZXQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCEodGhpcy52YWxpZGF0aW9uVGFyZ2V0cyBpbnN0YW5jZW9mIEFycmF5TGlzdCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBMaXN0PE9iamVjdD4gdmFsaWRhdGlvblRhcmdldExpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0NCi0gICAgICAgICAgICAgICAgZm9yKE9iamVjdCBjdXJyZW50VGFyZ2V0IDogdGhpcy52YWxpZGF0aW9uVGFyZ2V0cykNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldExpc3QuYWRkKGN1cnJlbnRUYXJnZXQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvblRhcmdldHMgPSB2YWxpZGF0aW9uVGFyZ2V0TGlzdDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uVGFyZ2V0cy5hZGQodGFyZ2V0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBVSUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudChVSUNvbXBvbmVudCBjb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzc1tdIGdldEdyb3VwcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmdyb3Vwcy50b0FycmF5KG5ldyBDbGFzc1t0aGlzLmdyb3Vwcy5zaXplKCldKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRHcm91cHMoTGlzdDxDbGFzcz4gZ3JvdXBzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmdyb3VwcyA9IGdyb3VwczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGdldFZhbGlkYXRpb25UYXJnZXRzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25UYXJnZXRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0TWV0YURhdGFTb3VyY2VPYmplY3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFTb3VyY2VPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFTb3VyY2VPYmplY3QoT2JqZWN0IG1ldGFEYXRhU291cmNlT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhU291cmNlT2JqZWN0ID0gbWV0YURhdGFTb3VyY2VPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJSZWR1bmRhbnRJZlN0YXRlbWVudCJ9KQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICBpZiAodGhpcyA9PSBvKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSB0aGF0ID0gKE1vZGVsVmFsaWRhdGlvbkVudHJ5KSBvOw0KLQ0KLSAgICAgICAgaWYgKGNvbXBvbmVudCAhPSBudWxsID8gIWNvbXBvbmVudC5lcXVhbHModGhhdC5jb21wb25lbnQpIDogdGhhdC5jb21wb25lbnQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWdyb3Vwcy5lcXVhbHModGhhdC5ncm91cHMpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghdmFsaWRhdGlvblRhcmdldHMuZXF1YWxzKHRoYXQudmFsaWRhdGlvblRhcmdldHMpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRGlzcGxheU1lc3NhZ2VJbmxpbmUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGlzcGxheU1lc3NhZ2VJbmxpbmU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGlzcGxheU1lc3NhZ2VJbmxpbmUoYm9vbGVhbiBkaXNwbGF5TWVzc2FnZUlubGluZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5kaXNwbGF5TWVzc2FnZUlubGluZSA9IGRpc3BsYXlNZXNzYWdlSW5saW5lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tTWVzc2FnZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbU1lc3NhZ2UoU3RyaW5nIGN1c3RvbU1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3VzdG9tTWVzc2FnZSA9IGN1c3RvbU1lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICBpbnQgcmVzdWx0ID0gY29tcG9uZW50ICE9IG51bGwgPyBjb21wb25lbnQuaGFzaENvZGUoKSA6IDA7DQotICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGdyb3Vwcy5oYXNoQ29kZSgpOw0KLSAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyB2YWxpZGF0aW9uVGFyZ2V0cy5oYXNoQ29kZSgpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZpZXdJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2aWV3SWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Vmlld0lkKFN0cmluZyB2aWV3SWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmlld0lkID0gdmlld0lkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvTW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGJkZjkzLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIHN1Z2dlc3RlZCBpbnRlcmZhY2UgZm9yIGEgbW9kZWwtdmFsaWRhdGlvbiBzdG9yYWdlDQotICogPHAvPg0KLSAqIGl0IGFsbG93cyB0byBtYW5hZ2UgbW9kZWwtdmFsaWRhdGlvbi1lbnRyaWVzIGZvciB0aGUgY3VycmVudCByZXF1ZXN0DQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBNb2RlbFZhbGlkYXRpb25TdG9yYWdlDQotew0KLSAgICB2b2lkIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5KTsNCi0NCi0gICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllc1RvVmFsaWRhdGUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9CZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9tYXBwZXIvQmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzJlMzkuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9CZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLkRlZmF1bHRCZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChCZWFuVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGtleSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTYyMDUwLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9tYXBwZXIvTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5EZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKE1vZGVsVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGtleSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvQmVhblZhbGlkYXRpb25VdGlscy5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC91dGlsL0JlYW5WYWxpZGF0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlZDQ0YS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvQmVhblZhbGlkYXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuTW9kZWxWYWxpZGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLkV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkZhY2VzTWVzc2FnZUhvbGRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0aW9uOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkVsZW1lbnREZXNjcmlwdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLlByb3BlcnR5RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5CZWFuRGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uVXRpbHMNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEJlYW5WYWxpZGF0aW9uVXRpbHMuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgRUxIZWxwZXIgZWxIZWxwZXIgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzIGJ2bWkgPQ0KLSAgICAgICAgICAgIG5ldyBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzKExPR0dFUiwgZWxIZWxwZXIpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVE9SX0ZBQ1RPUllfS0VZID0gImphdmF4LmZhY2VzLnZhbGlkYXRvci5iZWFuVmFsaWRhdG9yLlZhbGlkYXRvckZhY3RvcnkiOw0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgc3RhdGljIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4+IHZhbGlkYXRlKENsYXNzIGJhc2VDbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3RUb1ZhbGlkYXRlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzW10gZ3JvdXBzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY2FzY2FkZWRWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBWYWxpZGF0b3JGYWN0b3J5IHZhbGlkYXRvckZhY3RvcnkgPSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0VmFsaWRhdG9yRmFjdG9yeSgpOw0KLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248T2JqZWN0Pj4gcmVzdWx0ID0NCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yRmFjdG9yeS51c2luZ0NvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAubWVzc2FnZUludGVycG9sYXRvcihFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpKQ0KLSAgICAgICAgICAgICAgICAuY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkodmFsaWRhdG9yRmFjdG9yeS5nZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpKQ0KLSAgICAgICAgICAgICAgICAudHJhdmVyc2FibGVSZXNvbHZlcih2YWxpZGF0b3JGYWN0b3J5LmdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKSkNCi0gICAgICAgICAgICAgICAgLmdldFZhbGlkYXRvcigpDQotICAgICAgICAgICAgICAgIC52YWxpZGF0ZVZhbHVlKGJhc2VDbGFzcywgcHJvcGVydHlOYW1lLCBvYmplY3RUb1ZhbGlkYXRlLCBncm91cHMpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0LmlzRW1wdHkoKSAmJiBjYXNjYWRlZFZhbGlkYXRpb24gJiYgb2JqZWN0VG9WYWxpZGF0ZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHByb2Nlc3NDYXNjYWRlZFZhbGlkYXRpb24odmFsaWRhdG9yRmFjdG9yeSwgYmFzZUNsYXNzLCBwcm9wZXJ0eU5hbWUsIG9iamVjdFRvVmFsaWRhdGUsIGdyb3Vwcyk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4+IHByb2Nlc3NDYXNjYWRlZFZhbGlkYXRpb24oVmFsaWRhdG9yRmFjdG9yeSB2YWxpZGF0b3JGYWN0b3J5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGJhc2VCZWFuQ2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0VG9WYWxpZGF0ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1tdIGdyb3VwcykNCi0gICAgew0KLSAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgZWxlbWVudERlc2NyaXB0b3IgPSBnZXRFbGVtZW50RGVzY3JpcHRvcihiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eU5hbWUpOw0KLQ0KLSAgICAgICAgaWYoZWxlbWVudERlc2NyaXB0b3IgaW5zdGFuY2VvZiBQcm9wZXJ0eURlc2NyaXB0b3IgJiYgKChQcm9wZXJ0eURlc2NyaXB0b3IpZWxlbWVudERlc2NyaXB0b3IpLmlzQ2FzY2FkZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeS51c2luZ0NvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAubWVzc2FnZUludGVycG9sYXRvcihFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpKQ0KLSAgICAgICAgICAgICAgICAuY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkodmFsaWRhdG9yRmFjdG9yeS5nZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpKQ0KLSAgICAgICAgICAgICAgICAudHJhdmVyc2FibGVSZXNvbHZlcih2YWxpZGF0b3JGYWN0b3J5LmdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKSkNCi0gICAgICAgICAgICAgICAgLmdldFZhbGlkYXRvcigpDQotICAgICAgICAgICAgICAgIC52YWxpZGF0ZShvYmplY3RUb1ZhbGlkYXRlLCBncm91cHMpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50RGVzY3JpcHRvciBnZXRFbGVtZW50RGVzY3JpcHRvcihDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBCZWFuRGVzY3JpcHRvciBiZWFuRGVzY3JpcHRvciA9IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWYWxpZGF0b3JGYWN0b3J5KCkNCi0gICAgICAgICAgICAgICAgLmdldFZhbGlkYXRvcigpLmdldENvbnN0cmFpbnRzRm9yQ2xhc3ModGFyZ2V0Q2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGJlYW5EZXNjcmlwdG9yLmdldENvbnN0cmFpbnRzRm9yUHJvcGVydHkocHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNZXRhRGF0YVRvQ29udGV4dCgNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCBjb21wb25lbnQsIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMsIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nW10ga2V5ID0gcHJvcGVydHlEZXRhaWxzLmdldEtleSgpLnNwbGl0KCJcXC4iKTsNCi0NCi0gICAgICAgIE9iamVjdCBmaXJzdEJlYW4gPSBlbEhlbHBlci5nZXRCZWFuKGtleVswXSk7DQotDQotICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgIFN0cmluZyBhY3RpdmVWaWV3SWQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRWaWV3SWQoKTsNCi0NCi0gICAgICAgIGJ2bWkuZXh0cmFjdEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGEocHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBrZXksDQotICAgICAgICAgICAgICAgIGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgYWN0aXZlVmlld0lkKTsNCi0NCi0gICAgICAgIGJ2bWkucHJvY2Vzc0V4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGEoY29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMsDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIGFjdGl2ZVZpZXdJZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByb2Nlc3NDb25zdHJhaW50VmlvbGF0aW9ucyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248T2JqZWN0Pj4gdmlvbGF0aW9ucykNCi0gICAgew0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2U7DQotICAgICAgICBmb3IgKENvbnN0cmFpbnRWaW9sYXRpb248T2JqZWN0PiB2aW9sYXRpb24gOiB2aW9sYXRpb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZSA9IGNyZWF0ZUZhY2VzTWVzc2FnZUZvckNvbnN0cmFpbnRWaW9sYXRpb24odWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgdmlvbGF0aW9uKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjZXNNZXNzYWdlID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgYnZtaS5wcm9jZXNzRmFjZXNNZXNzYWdlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGZhY2VzTWVzc2FnZUhvbGRlckxpc3QsIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBwcm9jZXNzVmlvbGF0aW9uTWVzc2FnZXMoZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBGYWNlc01lc3NhZ2UgY3JlYXRlRmFjZXNNZXNzYWdlRm9yQ29uc3RyYWludFZpb2xhdGlvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cmFpbnRWaW9sYXRpb248T2JqZWN0PiB2aW9sYXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2aW9sYXRpb25NZXNzYWdlID0gdmlvbGF0aW9uLmdldE1lc3NhZ2UoKTsNCi0NCi0gICAgICAgIFN0cmluZyBsYWJlbGVkTWVzc2FnZVN1bW1hcnkgPSBidm1pLmNyZWF0ZUxhYmVsZWRNZXNzYWdlKHZpb2xhdGlvbk1lc3NhZ2UsIGZhbHNlKTsNCi0gICAgICAgIFN0cmluZyBsYWJlbGVkTWVzc2FnZURldGFpbCA9IGJ2bWkuY3JlYXRlTGFiZWxlZE1lc3NhZ2UodmlvbGF0aW9uTWVzc2FnZSwgdHJ1ZSk7DQotDQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkgPSBidm1pLmNhbGNTZXZlcml0eSh2aW9sYXRpb24pOw0KLQ0KLSAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiA9IGJ2bWkNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvckV4Y2VwdGlvbihsYWJlbGVkTWVzc2FnZVN1bW1hcnksIGxhYmVsZWRNZXNzYWdlRGV0YWlsLCBzZXZlcml0eSk7DQotDQotICAgICAgICBpZiAoIWJ2bWkuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnModWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChidm1pLmlzTWVzc2FnZVRleHRVbmNoYW5nZWQodmFsaWRhdG9yRXhjZXB0aW9uLCBsYWJlbGVkTWVzc2FnZVN1bW1hcnksIGxhYmVsZWRNZXNzYWdlRGV0YWlsKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKHNldmVyaXR5LCB2aW9sYXRpb25NZXNzYWdlLCB2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKHNldmVyaXR5LA0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldFN1bW1hcnkoKSwNCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKS5nZXREZXRhaWwoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByb2Nlc3NWaW9sYXRpb25NZXNzYWdlcyhMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gdmlvbGF0aW9uTWVzc2FnZUhvbGRlckxpc3QpDQotICAgIHsNCi0gICAgICAgIGlmICh2aW9sYXRpb25NZXNzYWdlSG9sZGVyTGlzdCA9PSBudWxsIHx8IHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0LmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlTGlzdFdpdGhMb3dTZXZlcml0eSA9DQotICAgICAgICAgICAgICAgIGJ2bWkuZ2V0RmFjZXNNZXNzYWdlTGlzdFdpdGhMb3dTZXZlcml0eSh2aW9sYXRpb25NZXNzYWdlSG9sZGVyTGlzdCk7DQotICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlTGlzdFdpdGhIaWdoU2V2ZXJpdHkgPQ0KLSAgICAgICAgICAgICAgICBidm1pLmdldEZhY2VzTWVzc2FnZUxpc3RXaXRoSGlnaFNldmVyaXR5KHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0KTsNCi0NCi0gICAgICAgIGJ2bWkuYWRkTWVzc2FnZXMoZmFjZXNNZXNzYWdlTGlzdFdpdGhIaWdoU2V2ZXJpdHkpOw0KLSAgICAgICAgYnZtaS5hZGRNZXNzYWdlcyhmYWNlc01lc3NhZ2VMaXN0V2l0aExvd1NldmVyaXR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbGlkYXRvckZhY3RvcnkgZ2V0RGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGFwcGxpY2F0aW9uTWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uTWFwKCk7DQotICAgICAgICBWYWxpZGF0b3JGYWN0b3J5IHZhbGlkYXRvckZhY3RvcnkgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKGFwcGxpY2F0aW9uTWFwLmNvbnRhaW5zS2V5KFZBTElEQVRPUl9GQUNUT1JZX0tFWSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGFwcGxpY2F0aW9uTWFwLmdldChWQUxJREFUT1JfRkFDVE9SWV9LRVkpIGluc3RhbmNlb2YgVmFsaWRhdG9yRmFjdG9yeSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRvckZhY3RvcnkgPSAoVmFsaWRhdG9yRmFjdG9yeSkgYXBwbGljYXRpb25NYXAuZ2V0KFZBTElEQVRPUl9GQUNUT1JZX0tFWSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHZhbGlkYXRvckZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0b3JGYWN0b3J5ID0gVmFsaWRhdGlvbi5idWlsZERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCk7DQotICAgICAgICAgICAgYXBwbGljYXRpb25NYXAucHV0KFZBTElEQVRPUl9GQUNUT1JZX0tFWSwgdmFsaWRhdG9yRmFjdG9yeSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscy5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC91dGlsL0V4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFJbnRlcm5hbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NjZDJkYi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLkV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwucGF5bG9hZC5WaW9sYXRpb25TZXZlcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uZXh0cmFjdG9yLkRlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5Nb2RlbFZhbGlkYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkZhY2VzTWVzc2FnZUhvbGRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzDQotew0KLSAgICBwcml2YXRlIExvZ2dlciBsb2dnZXI7DQotICAgIHByaXZhdGUgTGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMgbGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMgPSBuZXcgTGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMoKTsNCi0gICAgcHJpdmF0ZSBFTEhlbHBlciBlbEhlbHBlcjsNCi0NCi0gICAgRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscyhMb2dnZXIgbG9nZ2VyLCBFTEhlbHBlciBlbEhlbHBlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7DQotICAgICAgICB0aGlzLmVsSGVscGVyID0gZWxIZWxwZXI7DQotICAgIH0NCi0NCi0gICAgdm9pZCBleHRyYWN0RXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YShQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBrZXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhY3RpdmVWaWV3SWQpDQotICAgIHsNCi0gICAgICAgIGluc3BlY3RGaXJzdEJlYW4ocHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgZmlyc3RCZWFuLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBhY3RpdmVWaWV3SWQpOw0KLQ0KLSAgICAgICAgaW5zcGVjdEZpcnN0UHJvcGVydHkocHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAga2V5LA0KLSAgICAgICAgICAgICAgICBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIGFjdGl2ZVZpZXdJZCwNCi0gICAgICAgICAgICAgICAga2V5Lmxlbmd0aCA9PSAyKTsNCi0NCi0gICAgICAgIGluc3BlY3RCYXNlT2ZQcm9wZXJ0eShwcm9wZXJ0eURldGFpbHMsDQotICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIGFjdGl2ZVZpZXdJZCk7DQotDQotICAgICAgICBpbnNwZWN0TGFzdFByb3BlcnR5KHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgYWN0aXZlVmlld0lkKTsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIHByb2Nlc3NFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhKFVJQ29tcG9uZW50IGNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFjdGl2ZVZpZXdJZCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCA9IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIFN0cmluZyBjbGllbnRJZCA9IGNvbXBvbmVudC5nZXRDbGllbnRJZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0ZvdW5kR3JvdXBzKGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCwgYWN0aXZlVmlld0lkLCBjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgcHJvY2Vzc1Jlc3RyaWN0ZWRHcm91cHMoZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LCBhY3RpdmVWaWV3SWQsIGNsaWVudElkLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgIGluaXRNb2RlbFZhbGlkYXRpb24oZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LCBjb21wb25lbnQsIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LCByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5zcGVjdEZpcnN0QmVhbihib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhY3RpdmVWaWV3SWQpDQotICAgIHsNCi0gICAgICAgIHByb2Nlc3NDbGFzcyhmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIGFjdGl2ZVZpZXdJZCwNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RGaXJzdFByb3BlcnR5KGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFjdGl2ZVZpZXdJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNMYXN0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHByb2Nlc3NGaWVsZHNBbmRQcm9wZXJ0aWVzKGtleVswXSArICIuIiArIGtleVsxXSwNCi0gICAgICAgICAgICAgICAgZmlyc3RCZWFuLA0KLSAgICAgICAgICAgICAgICBrZXlbMV0sDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIGFjdGl2ZVZpZXdJZCwNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgaXNMYXN0UHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbnNwZWN0QmFzZU9mUHJvcGVydHkoUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWN0aXZlVmlld0lkKQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgYWN0aXZlVmlld0lkLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5zcGVjdExhc3RQcm9wZXJ0eShQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhY3RpdmVWaWV3SWQpDQotICAgIHsNCi0gICAgICAgIHByb2Nlc3NGaWVsZHNBbmRQcm9wZXJ0aWVzKA0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMuZ2V0S2V5KCksDQotICAgICAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCksDQotICAgICAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBhY3RpdmVWaWV3SWQsDQotICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHRydWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ2xhc3MoT2JqZWN0IG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhY3RpdmVWaWV3SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBDbGFzcyBjbGFzc1RvSW5zcGVjdCA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3Mob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCkpOw0KLQ0KLSAgICAgICAgd2hpbGUgKCFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc1RvSW5zcGVjdC5nZXROYW1lKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyYW5zZmVyR3JvdXBWYWxpZGF0aW9uSW5mb3JtYXRpb25Ub0ZvdW5kR3JvdXBzKG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBhY3RpdmVWaWV3SWQsDQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhvYmplY3RUb0luc3BlY3QuZ2V0Q2xhc3MoKSwgb2JqZWN0VG9JbnNwZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVZpZXdJZCwNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgICAgIGNsYXNzVG9JbnNwZWN0ID0gY2xhc3NUb0luc3BlY3QuZ2V0U3VwZXJjbGFzcygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmllbGRzQW5kUHJvcGVydGllcyhTdHJpbmcga2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGJhc2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFjdGl2ZVZpZXdJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNMYXN0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3IoKQ0KLSAgICAgICAgICAgICAgICAuZXh0cmFjdChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIG5ldyBQcm9wZXJ0eURldGFpbHMoa2V5LCBiYXNlLCBwcm9wZXJ0eSkpOw0KLQ0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkgOiBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeVRvUHJvY2Vzc01ldGFEYXRhKChCZWFuVmFsaWRhdGlvbikgbWV0YURhdGFFbnRyeS5nZXRWYWx1ZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeVRvQ3JlYXRlTmV3VGFyZ2V0KGJhc2UsIHByb3BlcnR5LCBpc0xhc3RQcm9wZXJ0eSksDQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVWaWV3SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uLkxpc3QpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3IgKEJlYW5WYWxpZGF0aW9uIGN1cnJlbnRCZWFuVmFsaWRhdGlvbiA6ICgoQmVhblZhbGlkYXRpb24uTGlzdCkgbWV0YURhdGFFbnRyeS5nZXRWYWx1ZSgpKS52YWx1ZSgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0cnlUb1Byb2Nlc3NNZXRhRGF0YShjdXJyZW50QmVhblZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeVRvQ3JlYXRlTmV3VGFyZ2V0KGJhc2UsIHByb3BlcnR5LCBpc0xhc3RQcm9wZXJ0eSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVZpZXdJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgdHJ5VG9DcmVhdGVOZXdUYXJnZXQoT2JqZWN0IGJhc2UsIFN0cmluZyBwcm9wZXJ0eSwgYm9vbGVhbiBpc0xhc3RQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgaWYoaXNMYXN0UHJvcGVydHkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGJhc2U7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIE9iamVjdCByZXN1bHQgPSBnZXRWYWx1ZU9mUHJvcGVydHkoYmFzZSwgcHJvcGVydHkpOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBiYXNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBnZXRWYWx1ZU9mUHJvcGVydHkoT2JqZWN0IGJhc2UsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHByb3BlcnR5LnN1YnN0cmluZygxLCBwcm9wZXJ0eS5sZW5ndGgoKSk7DQotDQotICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoYmFzZS5nZXRDbGFzcygpKTsNCi0NCi0gICAgICAgIE1ldGhvZCB0YXJnZXRNZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodGFyZ2V0Q2xhc3MsICJnZXQiICsgcHJvcGVydHkpOw0KLQ0KLSAgICAgICAgaWYgKHRhcmdldE1ldGhvZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh0YXJnZXRDbGFzcywgImlzIiArIHByb3BlcnR5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgImNsYXNzICIgKyB0YXJnZXRDbGFzcyArICIgaGFzIG5vIHB1YmxpYyBnZXQvaXMgIiArIHByb3BlcnR5LnRvTG93ZXJDYXNlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZChiYXNlLCB0YXJnZXRNZXRob2QpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRm91bmRHcm91cHMoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudFZpZXdJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xpZW50SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIC8qDQotICAgICAgICAgKiBhZGQgZm91bmQgZ3JvdXBzIHRvIGNvbnRleHQNCi0gICAgICAgICAqLw0KLSAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50R3JvdXBDbGFzcyA6IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5hZGRHcm91cChjdXJyZW50R3JvdXBDbGFzcywgY3VycmVudFZpZXdJZCwgY2xpZW50SWQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUmVzdHJpY3RlZEdyb3VwcyhFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRWaWV3SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xpZW50SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICAvKg0KLSAgICAgICAgICogYWRkIHJlc3RyaWN0ZWQgZ3JvdXBzDQotICAgICAgICAgKi8NCi0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEdyb3VwQ2xhc3MgOiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5yZXN0cmljdEdyb3VwKGN1cnJlbnRHcm91cENsYXNzLCBjdXJyZW50Vmlld0lkLCBjbGllbnRJZCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRNb2RlbFZhbGlkYXRpb24oRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgY29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIC8qDQotICAgICAgICAgKiBhZGQgbW9kZWwgdmFsaWRhdGlvbiBlbnRyeSBsaXN0DQotICAgICAgICAgKi8NCi0gICAgICAgIGZvciAoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkgOiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yIChDbGFzcyByZXN0cmljdGVkR3JvdXAgOiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkucmVtb3ZlR3JvdXAocmVzdHJpY3RlZEdyb3VwKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldEdyb3VwcygpLmxlbmd0aCA+IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0VmFsaWRhdGlvblRhcmdldHMoKS5pc0VtcHR5KCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmFkZFZhbGlkYXRpb25UYXJnZXQocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuc2V0Q29tcG9uZW50KGNvbXBvbmVudCk7DQotICAgICAgICAgICAgICAgIGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5hZGRNb2RlbFZhbGlkYXRpb25FbnRyeShtb2RlbFZhbGlkYXRpb25FbnRyeSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ0ZXN0IHByb3h5IHN1cHBvcnQiKQ0KLSAgICBwcml2YXRlIHZvaWQgdHJhbnNmZXJHcm91cFZhbGlkYXRpb25JbmZvcm1hdGlvblRvRm91bmRHcm91cHMoDQotICAgICAgICAgICAgT2JqZWN0IG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgIFN0cmluZyBhY3RpdmVWaWV3SWQsDQotICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCkuaXNBbm5vdGF0aW9uUHJlc2VudChCZWFuVmFsaWRhdGlvbi5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9Qcm9jZXNzTWV0YURhdGEob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCkuZ2V0QW5ub3RhdGlvbihCZWFuVmFsaWRhdGlvbi5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICBvYmplY3RUb0luc3BlY3QsDQotICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgYWN0aXZlVmlld0lkLA0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChvYmplY3RUb0luc3BlY3QuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KEJlYW5WYWxpZGF0aW9uLkxpc3QuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvciAoQmVhblZhbGlkYXRpb24gY3VycmVudEJlYW5WYWxpZGF0aW9uIDoNCi0gICAgICAgICAgICAgICAgICAgIChvYmplY3RUb0luc3BlY3QuZ2V0Q2xhc3MoKS5nZXRBbm5vdGF0aW9uKEJlYW5WYWxpZGF0aW9uLkxpc3QuY2xhc3MpKS52YWx1ZSgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5VG9Qcm9jZXNzTWV0YURhdGEoY3VycmVudEJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVZpZXdJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbnRlcmZhY2VzKENsYXNzIGN1cnJlbnRDbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWN0aXZlVmlld0lkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBmb3IgKENsYXNzIGN1cnJlbnRJbnRlcmZhY2UgOiBjdXJyZW50Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyYW5zZmVyR3JvdXBWYWxpZGF0aW9uSW5mb3JtYXRpb25Ub0ZvdW5kR3JvdXBzKG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVZpZXdJZCwNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgICAgIHByb2Nlc3NJbnRlcmZhY2VzKGN1cnJlbnRJbnRlcmZhY2UsIG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVZpZXdJZCwNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1Byb2Nlc3NNZXRhRGF0YShCZWFuVmFsaWRhdGlvbiBiZWFuVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWN0aXZlVmlld0lkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBmb3IgKFN0cmluZyBjdXJyZW50Vmlld0lkIDogYmVhblZhbGlkYXRpb24udmlld0lkcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh1c2VNZXRhRGF0YUZvclZpZXdJZChiZWFuVmFsaWRhdGlvbiwgY3VycmVudFZpZXdJZCwgYWN0aXZlVmlld0lkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NNZXRhRGF0YShiZWFuVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZU1ldGFEYXRhRm9yVmlld0lkKEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uLCBTdHJpbmcgdmlld0lkLCBTdHJpbmcgYWN0aXZlVmlld0lkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKHZpZXdJZC5lcXVhbHMoYWN0aXZlVmlld0lkKSB8fA0KLSAgICAgICAgICAgICAgICB2aWV3SWQuZXF1YWxzKCIqIikpICYmIGlzVmFsaWRhdGlvblBlcm1pdHRlZChiZWFuVmFsaWRhdGlvbik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNZXRhRGF0YShCZWFuVmFsaWRhdGlvbiBiZWFuVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChwcm9jZXNzTW9kZWxWYWxpZGF0aW9uICYmIGlzTW9kZWxWYWxpZGF0aW9uKGJlYW5WYWxpZGF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNb2RlbFZhbGlkYXRpb25FbnRyeSgNCi0gICAgICAgICAgICAgICAgICAgIGJlYW5WYWxpZGF0aW9uLCBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmICghaXNNb2RlbFZhbGlkYXRpb24oYmVhblZhbGlkYXRpb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NHcm91cHMoDQotICAgICAgICAgICAgICAgICAgICBiZWFuVmFsaWRhdGlvbiwgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkYXRpb25QZXJtaXR0ZWQoQmVhblZhbGlkYXRpb24gYmVhblZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBmb3IgKFN0cmluZyBjb25kaXRpb24gOiBiZWFuVmFsaWRhdGlvbi5jb25kaXRpb25zKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVsSGVscGVyLmlzRUxUZXJtV2VsbEZvcm1lZChjb25kaXRpb24pICYmDQotICAgICAgICAgICAgICAgICAgICBlbEhlbHBlci5pc0VMVGVybVZhbGlkKGZhY2VzQ29udGV4dCwgY29uZGl0aW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGVsSGVscGVyLmdldFZhbHVlT2ZFeHByZXNzaW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oY29uZGl0aW9uKSkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5zZXZlcmUoImFuIGludmFsaWQgY29uZGl0aW9uIGlzIHVzZWQ6ICIgKyBjb25kaXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNNb2RlbFZhbGlkYXRpb24oQmVhblZhbGlkYXRpb24gYmVhblZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBiZWFuVmFsaWRhdGlvbi5tb2RlbFZhbGlkYXRpb24oKS5pc0FjdGl2ZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRNb2RlbFZhbGlkYXRpb25FbnRyeShCZWFuVmFsaWRhdGlvbiBiZWFuVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5ID0gbmV3IE1vZGVsVmFsaWRhdGlvbkVudHJ5KCk7DQotDQotICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5zZXRHcm91cHMoQXJyYXlzLmFzTGlzdChiZWFuVmFsaWRhdGlvbi51c2VHcm91cHMoKSkpOw0KLSAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuc2V0RGlzcGxheU1lc3NhZ2VJbmxpbmUoYmVhblZhbGlkYXRpb24ubW9kZWxWYWxpZGF0aW9uKCkuZGlzcGxheUlubGluZSgpKTsNCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LnNldEN1c3RvbU1lc3NhZ2UoYmVhblZhbGlkYXRpb24ubW9kZWxWYWxpZGF0aW9uKCkubWVzc2FnZSgpKTsNCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LnNldE1ldGFEYXRhU291cmNlT2JqZWN0KG1ldGFEYXRhU291cmNlT2JqZWN0KTsNCi0NCi0gICAgICAgIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0Ow0KLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvblRhcmdldEV4cHJlc3Npb24gOiBiZWFuVmFsaWRhdGlvbi5tb2RlbFZhbGlkYXRpb24oKS52YWxpZGF0aW9uVGFyZ2V0cygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChNb2RlbFZhbGlkYXRpb24uREVGQVVMVC5lcXVhbHModmFsaWRhdGlvblRhcmdldEV4cHJlc3Npb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQgPSB0cnlUb1Jlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RXhwcmVzc2lvbih2YWxpZGF0aW9uVGFyZ2V0RXhwcmVzc2lvbik7DQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25UYXJnZXQgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmFkZFZhbGlkYXRpb25UYXJnZXQodmFsaWRhdGlvblRhcmdldCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGJlYW5WYWxpZGF0aW9uLnJlc3RyaWN0R3JvdXBzKCkubGVuZ3RoID4gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLmFkZEFsbChBcnJheXMuYXNMaXN0KGJlYW5WYWxpZGF0aW9uLnJlc3RyaWN0R3JvdXBzKCkpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRWYWxpZGF0aW9uVGFyZ2V0cygpLmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5hZGRWYWxpZGF0aW9uVGFyZ2V0KG1ldGFEYXRhU291cmNlT2JqZWN0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdC5hZGQobW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IHRyeVRvUmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFeHByZXNzaW9uKFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0RXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsaWRhdGlvblRhcmdldEV4cHJlc3Npb24pOw0KLSAgICAgICAgcmV0dXJuIHRoaXMuZWxIZWxwZXIuZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0dyb3VwcyhCZWFuVmFsaWRhdGlvbiBiZWFuVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLmFkZEFsbChBcnJheXMuYXNMaXN0KGJlYW5WYWxpZGF0aW9uLnVzZUdyb3VwcygpKSk7DQotDQotICAgICAgICBpZiAoYmVhblZhbGlkYXRpb24ucmVzdHJpY3RHcm91cHMoKS5sZW5ndGggPiAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24uYWRkQWxsKEFycmF5cy5hc0xpc3QoYmVhblZhbGlkYXRpb24ucmVzdHJpY3RHcm91cHMoKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIFN0cmluZyBjcmVhdGVMYWJlbGVkTWVzc2FnZShTdHJpbmcgdmlvbGF0aW9uTWVzc2FnZSwgYm9vbGVhbiBpc0RldGFpbE1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmxhYmVsZWRNZXNzYWdlSW50ZXJuYWxzLmNyZWF0ZUxhYmVsZWRNZXNzYWdlKHZpb2xhdGlvbk1lc3NhZ2UsIGlzRGV0YWlsTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IGNhbGNTZXZlcml0eShDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4gdmlvbGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBmb3IgKENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPiBwYXlsb2FkIDogdmlvbGF0aW9uLmdldENvbnN0cmFpbnREZXNjcmlwdG9yKCkuZ2V0UGF5bG9hZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcykuaXNBc3NpZ25hYmxlRnJvbShwYXlsb2FkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfV0FSTjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZiAoRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoVmlvbGF0aW9uU2V2ZXJpdHkuSW5mby5jbGFzcykuaXNBc3NpZ25hYmxlRnJvbShwYXlsb2FkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfSU5GTzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZiAoRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoVmlvbGF0aW9uU2V2ZXJpdHkuRmF0YWwuY2xhc3MpLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1I7DQotICAgIH0NCi0NCi0gICAgdm9pZCBwcm9jZXNzRmFjZXNNZXNzYWdlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIgPSBuZXcgRmFjZXNNZXNzYWdlSG9sZGVyKGZhY2VzTWVzc2FnZSk7DQotDQotICAgICAgICBmYWNlc01lc3NhZ2VIb2xkZXIuc2V0Q2xpZW50SWQodWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotDQotICAgICAgICBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0LmFkZChmYWNlc01lc3NhZ2VIb2xkZXIpOw0KLSAgICB9DQotDQotICAgIGJvb2xlYW4gZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICBudWxsLA0KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgYm9vbGVhbiBpc01lc3NhZ2VUZXh0VW5jaGFuZ2VkKA0KLSAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIFN0cmluZyB2aW9sYXRpb25TdW1tYXJ5TWVzc2FnZSwgU3RyaW5nIHZpb2xhdGlvbkRldGFpbE1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2aW9sYXRpb25TdW1tYXJ5TWVzc2FnZS5lcXVhbHModmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldFN1bW1hcnkoKSkgJiYNCi0gICAgICAgICAgICAgICAgdmlvbGF0aW9uRGV0YWlsTWVzc2FnZS5lcXVhbHModmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldERldGFpbCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBWYWxpZGF0b3JFeGNlcHRpb24gY3JlYXRlVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgIFN0cmluZyB2aW9sYXRpb25TdW1tYXJ5TWVzc2FnZSwgU3RyaW5nIHZpb2xhdGlvbkRldGFpbE1lc3NhZ2UsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNyZWF0ZUZhY2VzTWVzc2FnZShzZXZlcml0eSwgdmlvbGF0aW9uU3VtbWFyeU1lc3NhZ2UsIHZpb2xhdGlvbkRldGFpbE1lc3NhZ2UpKTsNCi0gICAgfQ0KLQ0KLSAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZ2V0RmFjZXNNZXNzYWdlTGlzdFdpdGhMb3dTZXZlcml0eSgNCi0gICAgICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gdmlvbGF0aW9uTWVzc2FnZXMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgICAgIGZvciAoRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlciA6IHZpb2xhdGlvbk1lc3NhZ2VzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChGYWNlc01lc3NhZ2UuU0VWRVJJVFlfV0FSTi5lcXVhbHMoZmFjZXNNZXNzYWdlSG9sZGVyLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkpIHx8DQotICAgICAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfSU5GTy5lcXVhbHMoZmFjZXNNZXNzYWdlSG9sZGVyLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChmYWNlc01lc3NhZ2VIb2xkZXIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZUxpc3RXaXRoSGlnaFNldmVyaXR5KA0KLSAgICAgICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiB2aW9sYXRpb25NZXNzYWdlSG9sZGVyTGlzdCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPigpOw0KLQ0KLSAgICAgICAgZm9yIChGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyIDogdmlvbGF0aW9uTWVzc2FnZUhvbGRlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUi5lcXVhbHMoZmFjZXNNZXNzYWdlSG9sZGVyLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkpIHx8DQotICAgICAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUwuZXF1YWxzKGZhY2VzTWVzc2FnZUhvbGRlci5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZmFjZXNNZXNzYWdlSG9sZGVyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHZvaWQgYWRkTWVzc2FnZXMoTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3RXaXRoTG93U2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIGZvciAoRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlciA6IGZhY2VzTWVzc2FnZUhvbGRlckxpc3RXaXRoTG93U2V2ZXJpdHkpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50SWQoDQotICAgICAgICAgICAgICAgICAgICBmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0Q2xpZW50SWQoKSwgZmFjZXNNZXNzYWdlSG9sZGVyLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvTGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9MYWJlbGVkTWVzc2FnZUludGVybmFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDBiNzgzLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9MYWJlbGVkTWVzc2FnZUludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBMYWJlbGVkTWVzc2FnZUludGVybmFscw0KLXsNCi0gICAgLy90aGVyZSBpcyBubyBjb25jdXJyZW5jeSBpc3N1ZSBoZXJlIC0gaXQgYWx3YXlzIGxlYWRzIHRvIHRoZSBzYW1lIHJlc3VsdA0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZWZhdWx0U3VtbWFyeU1lc3NhZ2VUZW1wbGF0ZSA9ICJ7MX06IHswfSI7DQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRlZmF1bHREZXRhaWxNZXNzYWdlVGVtcGxhdGUgPSAiezF9OiB7MH0iOw0KLSAgICBwcml2YXRlIFN0cmluZyBzdW1tYXJ5TWVzc2FnZVRlbXBsYXRlID0gZGVmYXVsdFN1bW1hcnlNZXNzYWdlVGVtcGxhdGU7DQotICAgIHByaXZhdGUgU3RyaW5nIGRldGFpbE1lc3NhZ2VUZW1wbGF0ZSA9IGRlZmF1bHREZXRhaWxNZXNzYWdlVGVtcGxhdGU7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19WQUxJREFUT1JfQkVBTlZBTElEQVRPUl9NRVNTQUdFID0NCi0gICAgICAgICAgICAiamF2YXguZmFjZXMudmFsaWRhdG9yLkJlYW5WYWxpZGF0b3IuTUVTU0FHRSI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19WQUxJREFUT1JfQkVBTlZBTElEQVRPUl9NRVNTQUdFX0RFVEFJTCA9DQotICAgICAgICAgICAgImphdmF4LmZhY2VzLnZhbGlkYXRvci5CZWFuVmFsaWRhdG9yLk1FU1NBR0VfZGV0YWlsIjsNCi0NCi0gICAgU3RyaW5nIGNyZWF0ZUxhYmVsZWRNZXNzYWdlKFN0cmluZyB2aW9sYXRpb25NZXNzYWdlLCBib29sZWFuIGlzRGV0YWlsTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYoaXNEZXRhaWxNZXNzYWdlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnlUb1Jlc29sdmVEZXRhaWxNZXNzYWdlKHZpb2xhdGlvbk1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnlUb1Jlc29sdmVTdW1tYXJ5TWVzc2FnZSh2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb1Jlc29sdmVTdW1tYXJ5TWVzc2FnZShTdHJpbmcgdmlvbGF0aW9uTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYoc3VtbWFyeU1lc3NhZ2VUZW1wbGF0ZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRTdW1tYXJ5TWVzc2FnZVRlbXBsYXRlLnJlcGxhY2UoInswfSIsIHZpb2xhdGlvbk1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGhpcy5zdW1tYXJ5TWVzc2FnZVRlbXBsYXRlID0gbG9hZFN0YW5kYXJkTWVzc2FnZVRlbXBsYXRlKGZhbHNlKTsNCi0NCi0gICAgICAgIGlmKHN1bW1hcnlNZXNzYWdlVGVtcGxhdGUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlTGFiZWxlZE1lc3NhZ2UodmlvbGF0aW9uTWVzc2FnZSwgZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHN1bW1hcnlNZXNzYWdlVGVtcGxhdGUucmVwbGFjZSgiezB9IiwgdmlvbGF0aW9uTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHJ5VG9SZXNvbHZlRGV0YWlsTWVzc2FnZShTdHJpbmcgdmlvbGF0aW9uTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYoZGV0YWlsTWVzc2FnZVRlbXBsYXRlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdERldGFpbE1lc3NhZ2VUZW1wbGF0ZS5yZXBsYWNlKCJ7MH0iLCB2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRoaXMuZGV0YWlsTWVzc2FnZVRlbXBsYXRlID0gbG9hZFN0YW5kYXJkTWVzc2FnZVRlbXBsYXRlKHRydWUpOw0KLQ0KLSAgICAgICAgaWYoZGV0YWlsTWVzc2FnZVRlbXBsYXRlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxhYmVsZWRNZXNzYWdlKHZpb2xhdGlvbk1lc3NhZ2UsIHRydWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGRldGFpbE1lc3NhZ2VUZW1wbGF0ZS5yZXBsYWNlKCJ7MH0iLCB2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBsb2FkU3RhbmRhcmRNZXNzYWdlVGVtcGxhdGUoYm9vbGVhbiBpc0RldGFpbE1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGlzRGV0YWlsTWVzc2FnZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBKc2ZVdGlscy5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVZBWF9GQUNFU19WQUxJREFUT1JfQkVBTlZBTElEQVRPUl9NRVNTQUdFX0RFVEFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBKc2ZVdGlscy5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVZBWF9GQUNFU19WQUxJREFUT1JfQkVBTlZBTElEQVRPUl9NRVNTQUdFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ODhiMzguLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5CZWFuVmFsaWRhdGlvbk1vZHVsZUtleTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5Nb2RlbFZhbGlkYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbC5CZWFuVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5FTEhlbHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5GYWNlc01lc3NhZ2VIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5NZXNzYWdlSW50ZXJwb2xhdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBhdGg7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAicmVmYWN0b3IgaW1wbGVtZW50YXRpb24gZGV0YWlscyIpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lciBpbXBsZW1lbnRzIFBoYXNlTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zNDgyMjMzODkzMTg2NzA4ODc4TDsNCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IHBoYXNlRXZlbnQpDQotICAgIHsNCi0gICAgICAgIGxvZ2dlci5maW5lc3QoImpzcjMwMyBzdGFydCBtb2RlbCB2YWxpZGF0aW9uIik7DQotDQotICAgICAgICBNYXA8T2JqZWN0LCBMaXN0PENsYXNzPj4gcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIExpc3Q8Q2xhc3M+PigpOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+KCk7DQotDQotICAgICAgICBmb3IgKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5IDogZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllc1RvVmFsaWRhdGUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cywgcmVzdWx0cyk7DQotICAgICAgICB9DQotDQotICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uUmVzdWx0cyhyZXN1bHRzKTsNCi0NCi0gICAgICAgIGV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IocmVzdWx0cyk7DQotDQotICAgICAgICBsb2dnZXIuZmluZXN0KCJqc3IzMDMgdmFsaWRhdGlvbiBmaW5pc2hlZCIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllc1RvVmFsaWRhdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXNUb1ZhbGlkYXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24oTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxPYmplY3QsIExpc3Q8Q2xhc3M+PiBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uOw0KLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248T2JqZWN0Pj4gdmlvbGF0aW9uczsNCi0gICAgICAgIENsYXNzW10gZ3JvdXBzVG9WYWxpZGF0ZTsNCi0NCi0gICAgICAgIEVMSGVscGVyIGVsSGVscGVyID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKTsNCi0NCi0gICAgICAgIGZvciAoT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQgOiBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRWYWxpZGF0aW9uVGFyZ2V0cygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24gPSBjcmVhdGVQcm9wZXJ0eUluZm9ybWF0aW9uKG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0LCBlbEhlbHBlcik7DQotDQotICAgICAgICAgICAgaWYgKCFleGVjdXRlR2xvYmFsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCksIHZhbGlkYXRpb25UYXJnZXQsIHByb3BlcnR5SW5mb3JtYXRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmlzRGlzcGxheU1lc3NhZ2VJbmxpbmUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGdyb3Vwc1RvVmFsaWRhdGUgPSBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRHcm91cHMoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy9pZiB2aW9sYXRpb24gc2hvdWxkIGRpc3BsYXllZCBpbmxpbmUgdmFsaWRhdGlvbiBoYXMgdG8gdGFrZSBwbGFjZSB3aXRoIGFsbCBncm91cHMNCi0gICAgICAgICAgICAvL3doaWNoIG1lYW5zOiBnbG9iYWwgbWVzc2FnZXMgLT4gZmlsdGVyIGdyb3VwcyBhbHJlYWR5IHVzZWQgZm9yIHRoZSB2YWxpZGF0aW9uIHRhcmdldA0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGdyb3Vwc1RvVmFsaWRhdGUgPSBmaWx0ZXJHcm91cHNUb1ZhbGlkYXRlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0LCBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKCFzaG91bGRDb250aW51ZVZhbGlkYXRpb24obW9kZWxWYWxpZGF0aW9uRW50cnksIGdyb3Vwc1RvVmFsaWRhdGUpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGFkZFByb2Nlc3NlZFRhcmdldCh2YWxpZGF0aW9uVGFyZ2V0LCBncm91cHNUb1ZhbGlkYXRlLCBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cyk7DQotICAgICAgICAgICAgdmlvbGF0aW9ucyA9IHZhbGlkYXRlVGFyZ2V0KHZhbGlkYXRpb25UYXJnZXQsIGdyb3Vwc1RvVmFsaWRhdGUpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25zICE9IG51bGwgJiYgIXZpb2xhdGlvbnMuaXNFbXB0eSgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1Zpb2xhdGlvbnMoZmFjZXNDb250ZXh0LCBtb2RlbFZhbGlkYXRpb25FbnRyeSwgdmFsaWRhdGlvblRhcmdldCwgdmlvbGF0aW9ucywgcmVzdWx0cyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3NbXSBmaWx0ZXJHcm91cHNUb1ZhbGlkYXRlKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPE9iamVjdCwgTGlzdDxDbGFzcz4+IHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzKQ0KLSAgICB7DQotICAgICAgICBpZighcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMuY29udGFpbnNLZXkodmFsaWRhdGlvblRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldEdyb3VwcygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxDbGFzcz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IHZhbGlkYXRlZEdyb3VwcyA9IHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzLmdldCh2YWxpZGF0aW9uVGFyZ2V0KTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBncm91cCA6IG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldEdyb3VwcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCF2YWxpZGF0ZWRHcm91cHMuY29udGFpbnMoZ3JvdXApKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChncm91cCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBDbGFzc1tyZXN1bHQuc2l6ZSgpXSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZENvbnRpbnVlVmFsaWRhdGlvbihNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwgQ2xhc3NbXSBncm91cHNUb1ZhbGlkYXRlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIShncm91cHNUb1ZhbGlkYXRlID09IG51bGwgfHwgZ3JvdXBzVG9WYWxpZGF0ZS5sZW5ndGggPT0gMCkgfHwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuaXNEaXNwbGF5TWVzc2FnZUlubGluZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRQcm9jZXNzZWRUYXJnZXQoT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NbXSBncm91cHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPE9iamVjdCwgTGlzdDxDbGFzcz4+IHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzKQ0KLSAgICB7DQotICAgICAgICBpZighcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMuY29udGFpbnNLZXkodmFsaWRhdGlvblRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMucHV0KHZhbGlkYXRpb25UYXJnZXQsIG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxDbGFzcz4gdmFsaWRhdGVkR3JvdXBzID0gcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMuZ2V0KHZhbGlkYXRpb25UYXJnZXQpOw0KLQ0KLSAgICAgICAgZm9yKENsYXNzIGdyb3VwIDogZ3JvdXBzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCF2YWxpZGF0ZWRHcm91cHMuY29udGFpbnMoZ3JvdXApKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVkR3JvdXBzLmFkZChncm91cCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgUHJvcGVydHlJbmZvcm1hdGlvbiBjcmVhdGVQcm9wZXJ0eUluZm9ybWF0aW9uKA0KLSAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwgRUxIZWxwZXIgZWxIZWxwZXIpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbjsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHM7DQotICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKCk7DQotICAgICAgICBpZiAobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMgPSBlbEhlbHBlci5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzID0gbmV3IFByb3BlcnR5RGV0YWlscyhudWxsLCB2YWxpZGF0aW9uVGFyZ2V0LCBudWxsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uc2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBleGVjdXRlR2xvYmFsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmV4ZWN1dGVHbG9iYWxCZWZvcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uLCBCZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIEV4dFZhbFV0aWxzLmV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIHByb3BlcnR5SW5mb3JtYXRpb24sIEJlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4+IHZhbGlkYXRlVGFyZ2V0KE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LCBDbGFzc1tdIGdyb3VwcykNCi0gICAgew0KLSAgICAgICAgaWYoZ3JvdXBzID09IG51bGwgfHwgZ3JvdXBzLmxlbmd0aCA9PSAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVmFsaWRhdG9yRmFjdG9yeSB2YWxpZGF0b3JGYWN0b3J5ID0gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZhbGlkYXRvckZhY3RvcnkoKTsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5DQotICAgICAgICAgICAgICAgIC51c2luZ0NvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAubWVzc2FnZUludGVycG9sYXRvcihFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpKQ0KLSAgICAgICAgICAgICAgICAuY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkodmFsaWRhdG9yRmFjdG9yeS5nZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpKQ0KLSAgICAgICAgICAgICAgICAudHJhdmVyc2FibGVSZXNvbHZlcih2YWxpZGF0b3JGYWN0b3J5LmdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKSkNCi0gICAgICAgICAgICAgICAgLmdldFZhbGlkYXRvcigpDQotICAgICAgICAgICAgICAgIC52YWxpZGF0ZSh2YWxpZGF0aW9uVGFyZ2V0LCBncm91cHMpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzVmlvbGF0aW9ucyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4+IHZpb2xhdGlvbnMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMpDQotICAgIHsNCi0gICAgICAgIC8vanNmIDIuMCBpcyBhYmxlIHRvIGRpc3BsYXkgbXVsdGlwbGUgbWVzc2FnZXMgcGVyIGNvbXBvbmVudCAtIHNvIHByb2Nlc3MgYWxsIHZpb2xhdGlvbnMNCi0gICAgICAgIC8vanNmIDwgMi4wIHdpbGwganVzdCB1c2UgdGhlIGZpcnN0IG9uZSAoZm9yIGlubGluZSBtZXNzYWdlcyAtIHNvIGl0J3Mgb25seSBhIGxpdHRsZSBvdmVyaGVhZCkNCi0gICAgICAgIEl0ZXJhdG9yPENvbnN0cmFpbnRWaW9sYXRpb248T2JqZWN0Pj4gdmlvbGF0aW9uc0l0ZXJhdG9yID0gdmlvbGF0aW9ucy5pdGVyYXRvcigpOw0KLSAgICAgICAgQ29uc3RyYWludFZpb2xhdGlvbjxPYmplY3Q+IGNvbnN0cmFpbnRWaW9sYXRpb247DQotICAgICAgICBNb2RlbFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0Ow0KLSAgICAgICAgd2hpbGUgKHZpb2xhdGlvbnNJdGVyYXRvci5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9DcmVhdGVNb2RlbFZhbGlkYXRpb25SZXN1bHQoZmFjZXNDb250ZXh0LCBtb2RlbFZhbGlkYXRpb25FbnRyeSwgcmVzdWx0cyk7DQotDQotICAgICAgICAgICAgcmVzdWx0ID0gcmVzb2x2ZU1vZGVsVmFsaWRhdGlvblJlc3VsdChmYWNlc0NvbnRleHQsIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCByZXN1bHRzKTsNCi0NCi0gICAgICAgICAgICBjb25zdHJhaW50VmlvbGF0aW9uID0gdmlvbGF0aW9uc0l0ZXJhdG9yLm5leHQoKTsNCi0gICAgICAgICAgICBhZGRWaW9sYXRpb25NZXNzYWdlKG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0LCBjb25zdHJhaW50VmlvbGF0aW9uLCByZXN1bHQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0NyZWF0ZU1vZGVsVmFsaWRhdGlvblJlc3VsdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMpDQotICAgIHsNCi0gICAgICAgIE1vZGVsVmFsaWRhdGlvblJlc3VsdCByZXN1bHQ7DQotICAgICAgICBpZiAoIWlzTW9kZWxWYWxpZGF0aW9uUmVzdWx0QXZhaWxhYmxlRm9yKGZhY2VzQ29udGV4dCwgbW9kZWxWYWxpZGF0aW9uRW50cnksIHJlc3VsdHMpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBNb2RlbFZhbGlkYXRpb25SZXN1bHQoKTsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKS5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpLCByZXN1bHQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTW9kZWxWYWxpZGF0aW9uUmVzdWx0IHJlc29sdmVNb2RlbFZhbGlkYXRpb25SZXN1bHQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByZXN1bHRzLmdldChtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKS5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNNb2RlbFZhbGlkYXRpb25SZXN1bHRBdmFpbGFibGVGb3IoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcmVzdWx0cy5jb250YWluc0tleShtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKS5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkVmlvbGF0aW9uTWVzc2FnZShNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cmFpbnRWaW9sYXRpb248T2JqZWN0PiBjb25zdHJhaW50VmlvbGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBpZiAobW9kZWxWYWxpZGF0aW9uRW50cnkuaXNEaXNwbGF5TWVzc2FnZUlubGluZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRGYWNlc01lc3NhZ2VIb2xkZXIoY3JlYXRlRmFjZXNNZXNzYWdlSG9sZGVyRm9yQ29uc3RyYWludFZpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb24sIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0LCB0cnVlKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmFkZEZhY2VzTWVzc2FnZUhvbGRlcihjcmVhdGVGYWNlc01lc3NhZ2VIb2xkZXJGb3JDb25zdHJhaW50VmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludFZpb2xhdGlvbiwgbW9kZWxWYWxpZGF0aW9uRW50cnksIHZhbGlkYXRpb25UYXJnZXQsIGZhbHNlKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBGYWNlc01lc3NhZ2VIb2xkZXIgY3JlYXRlRmFjZXNNZXNzYWdlSG9sZGVyRm9yQ29uc3RyYWludFZpb2xhdGlvbihmaW5hbCBDb25zdHJhaW50VmlvbGF0aW9uIHZpb2xhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRpc3BsYXlBdENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgZmluYWwgU3RyaW5nIG5ld1Zpb2xhdGlvbk1lc3NhZ2UgPSB0cnlUb0NoYW5nZVZpb2xhdGlvbk1lc3NhZ2UoDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0LCB2aW9sYXRpb24pOw0KLQ0KLSAgICAgICAgQ29uc3RyYWludFZpb2xhdGlvbiBuZXdDb25zdHJhaW50VmlvbGF0aW9uID0gbmV3IENvbnN0cmFpbnRWaW9sYXRpb24oKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByaXZhdGUgQ29uc3RyYWludFZpb2xhdGlvbiB3cmFwcGVkID0gdmlvbGF0aW9uOw0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3VmlvbGF0aW9uTWVzc2FnZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlVGVtcGxhdGUoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0TWVzc2FnZVRlbXBsYXRlKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Um9vdEJlYW4oKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Um9vdEJlYW4oKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIENsYXNzIGdldFJvb3RCZWFuQ2xhc3MoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Um9vdEJlYW5DbGFzcygpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldExlYWZCZWFuKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldExlYWZCZWFuKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBQYXRoIGdldFByb3BlcnR5UGF0aCgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRQcm9wZXJ0eVBhdGgoKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRJbnZhbGlkVmFsdWUoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0SW52YWxpZFZhbHVlKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBDb25zdHJhaW50RGVzY3JpcHRvciBnZXRDb25zdHJhaW50RGVzY3JpcHRvcigpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRDb25zdHJhaW50RGVzY3JpcHRvcigpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH07DQotDQotDQotICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCA9IG51bGw7DQotICAgICAgICBTdHJpbmcgY2xpZW50SWQgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKGRpc3BsYXlBdENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB1aUNvbXBvbmVudCA9IG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpOw0KLSAgICAgICAgICAgIGNsaWVudElkID0gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZUhvbGRlciByZXN1bHQgPSBuZXcgRmFjZXNNZXNzYWdlSG9sZGVyKEJlYW5WYWxpZGF0aW9uVXRpbHMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZUZhY2VzTWVzc2FnZUZvckNvbnN0cmFpbnRWaW9sYXRpb24odWlDb21wb25lbnQsIHZhbGlkYXRpb25UYXJnZXQsIG5ld0NvbnN0cmFpbnRWaW9sYXRpb24pKTsNCi0gICAgICAgIHJlc3VsdC5zZXRDbGllbnRJZChjbGllbnRJZCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvQ2hhbmdlVmlvbGF0aW9uTWVzc2FnZShNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RyYWludFZpb2xhdGlvbiB2aW9sYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmICghaXNEZWZhdWx0TWVzc2FnZShtb2RlbFZhbGlkYXRpb25FbnRyeSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGludGVycG9sYXRlVmFsaWRhdGlvbkVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldEN1c3RvbU1lc3NhZ2UoKSwgdmFsaWRhdGlvblRhcmdldCwgdmlvbGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2aW9sYXRpb24uZ2V0TWVzc2FnZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHRNZXNzYWdlKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gTW9kZWxWYWxpZGF0aW9uLkRFRkFVTFQuZXF1YWxzKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldEN1c3RvbU1lc3NhZ2UoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgaW50ZXJwb2xhdGVWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKFN0cmluZyBleHRWYWxJbmxpbmVNZXNzYWdlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsIGZpbmFsIENvbnN0cmFpbnRWaW9sYXRpb24gdmlvbGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKQ0KLSAgICAgICAgICAgICAgICAuaW50ZXJwb2xhdGUoDQotICAgICAgICAgICAgICAgICAgICAgICAgZXh0VmFsSW5saW5lTWVzc2FnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWVzc2FnZUludGVycG9sYXRvci5Db250ZXh0KCkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDb25zdHJhaW50RGVzY3JpcHRvcjw/PiBnZXRDb25zdHJhaW50RGVzY3JpcHRvcigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2aW9sYXRpb24uZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFZhbGlkYXRlZFZhbHVlKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25UYXJnZXQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGVsVmFsaWRhdGlvblJlc3VsdHMoTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzKQ0KLSAgICB7DQotICAgICAgICBmb3IgKE1vZGVsVmFsaWRhdGlvblJlc3VsdCByZXN1bHQgOiByZXN1bHRzLnZhbHVlcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVXRpbHMucHJvY2Vzc1Zpb2xhdGlvbk1lc3NhZ2VzKHJlc3VsdC5nZXRGYWNlc01lc3NhZ2VIb2xkZXJMaXN0KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBleGVjdXRlR2xvYmFsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzRm9yKE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cykNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFVJQ29tcG9uZW50IGNvbXBvbmVudDsNCi0gICAgICAgIGZvciAoTW9kZWxWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA6IHJlc3VsdHMudmFsdWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yIChGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyIDogcmVzdWx0LmdldEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IG51bGw7DQotICAgICAgICAgICAgICAgIGlmIChmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0Q2xpZW50SWQoKSAhPSBudWxsICYmICFmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0Q2xpZW50SWQoKS5lcXVhbHMoIioiKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50ID0gZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZmluZENvbXBvbmVudChmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycyhmYWNlc0NvbnRleHQsIGNvbXBvbmVudCwgbnVsbCwgbnVsbCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgcGhhc2VFdmVudCkNCi0gICAgew0KLSAgICAgICAgLy9kbyBub3RoaW5nDQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLlVQREFURV9NT0RFTF9WQUxVRVM7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICBpZiAodGhpcyA9PSBvKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIE1vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvblJlc3VsdC5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvblJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2MxOThiLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25SZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkZhY2VzTWVzc2FnZUhvbGRlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gInJlZmFjdG9yIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIE1vZGVsVmFsaWRhdGlvblJlc3VsdA0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRGYWNlc01lc3NhZ2VIb2xkZXIoRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5mYWNlc01lc3NhZ2VIb2xkZXJMaXN0LmFkZChmYWNlc01lc3NhZ2VIb2xkZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZ2V0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9tZXNzYWdlL2ludGVycG9sYXRvci9EZWZhdWx0TWVzc2FnZUludGVycG9sYXRvci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0RlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNjRiMDkuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0RlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLm1lc3NhZ2UuaW50ZXJwb2xhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uTWVzc2FnZUludGVycG9sYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvciBpbXBsZW1lbnRzIE1lc3NhZ2VJbnRlcnBvbGF0b3INCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotDQotICAgIHByaXZhdGUgTWVzc2FnZUludGVycG9sYXRvciB3cmFwcGVkOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IoTWVzc2FnZUludGVycG9sYXRvciB3cmFwcGVkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgaW50ZXJwb2xhdGUoU3RyaW5nIG1lc3NhZ2VPcktleSwgQ29udGV4dCBjb250ZXh0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZU9yS2V5LCBjb250ZXh0LCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGludGVycG9sYXRlKFN0cmluZyBtZXNzYWdlT3JLZXksIENvbnRleHQgY29udGV4dCwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZC5pbnRlcnBvbGF0ZShtZXNzYWdlT3JLZXksIGNvbnRleHQsIGdldEN1cnJlbnRMb2NhbGUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExvY2FsZSBnZXRDdXJyZW50TG9jYWxlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9tZXNzYWdlL2ludGVycG9sYXRvci9FeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0V4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YWFmMGYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0V4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLm1lc3NhZ2UuaW50ZXJwb2xhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5NZXNzYWdlSW50ZXJwb2xhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyIGV4dGVuZHMgRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3INCi17DQotICAgIHByaXZhdGUgTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcjsNCi0NCi0gICAgcHVibGljIEV4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyKE1lc3NhZ2VJbnRlcnBvbGF0b3Igd3JhcHBlZCwgTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcikNCi0gICAgew0KLSAgICAgICAgc3VwZXIod3JhcHBlZCk7DQotICAgICAgICB0aGlzLm1lc3NhZ2VSZXNvbHZlciA9IG1lc3NhZ2VSZXNvbHZlcjsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBpbnRlcnBvbGF0ZShTdHJpbmcgbWVzc2FnZU9yS2V5LCBDb250ZXh0IGNvbnRleHQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShtZXNzYWdlT3JLZXksIGNvbnRleHQsIGdldEN1cnJlbnRMb2NhbGUoKSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgaW50ZXJwb2xhdGUoU3RyaW5nIG1lc3NhZ2VPcktleSwgQ29udGV4dCBjb250ZXh0LCBMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLm1lc3NhZ2VSZXNvbHZlciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGlzQmVhblZhbGlkYXRpb25NZXNzYWdlS2V5Rm9ybWF0KG1lc3NhZ2VPcktleSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbmV3TWVzc2FnZU9yS2V5ID0gdGhpcy5tZXNzYWdlUmVzb2x2ZXIuZ2V0TWVzc2FnZShleHRyYWN0S2V5KG1lc3NhZ2VPcktleSksIGdldEN1cnJlbnRMb2NhbGUoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmKGlzVmFsaWRlTWVzc2FnZShuZXdNZXNzYWdlT3JLZXkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlT3JLZXkgPSBuZXdNZXNzYWdlT3JLZXk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZmluZXN0KCJ5b3UgdHJpZWQgdG8gdXNlIGFuIGV4dHZhbCBtZXNzYWdlLXJlc29sdmVyIGZvciIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJqc3IzMDMgdmFsaWRhdGlvbiB3aXRoIGFuIGludmFsaWQga2V5IC0+IHVzaW5nIGEgZGVmYXVsdCBpbnRlcnBvbGF0b3IiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3VwZXIuaW50ZXJwb2xhdGUobWVzc2FnZU9yS2V5LCBjb250ZXh0LCBnZXRDdXJyZW50TG9jYWxlKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0JlYW5WYWxpZGF0aW9uTWVzc2FnZUtleUZvcm1hdChTdHJpbmcgbWVzc2FnZU9yS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWVzc2FnZU9yS2V5LnN0YXJ0c1dpdGgoInsiKSAmJiBtZXNzYWdlT3JLZXkuZW5kc1dpdGgoIn0iKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBleHRyYWN0S2V5KFN0cmluZyBtZXNzYWdlT3JLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXNzYWdlT3JLZXkuc3Vic3RyaW5nKDEsIG1lc3NhZ2VPcktleS5sZW5ndGgoKSAtIDEpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkZU1lc3NhZ2UoU3RyaW5nIG5ld01lc3NhZ2VPcktleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICEobmV3TWVzc2FnZU9yS2V5LnN0YXJ0c1dpdGgoQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIpICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3TWVzc2FnZU9yS2V5LmVuZHNXaXRoKEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGRlZWY2Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcml2YXRlIENvbnN0cmFpbnREZXNjcmlwdG9yIGNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLSAgICBwcml2YXRlIENsYXNzIGVsZW1lbnRDbGFzczsgLy9wcm9wZXJ0eSB0eXBlDQotDQotICAgIHB1YmxpYyBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3koQ29uc3RyYWludERlc2NyaXB0b3IgY29uc3RyYWludERlc2NyaXB0b3IsIENsYXNzIGVsZW1lbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb25zdHJhaW50RGVzY3JpcHRvciA9IGNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLSAgICAgICAgdGhpcy5lbGVtZW50Q2xhc3MgPSBlbGVtZW50Q2xhc3M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvbnN0cmFpbnREZXNjcmlwdG9yIGdldENvbnN0cmFpbnREZXNjcmlwdG9yKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzcyBnZXRFbGVtZW50Q2xhc3MoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZWxlbWVudENsYXNzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJhaW50RGVzY3JpcHRvci5nZXRBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS50eHQgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcueG1sIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MDA2MjAuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18yXzAueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMi4wIj4NCi0gICAgPGZhY3Rvcnk+DQotICAgICAgICA8YXBwbGljYXRpb24tZmFjdG9yeT5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5mYWN0b3J5LkV4dFZhbEFwcGxpY2F0aW9uRmFjdG9yeTwvYXBwbGljYXRpb24tZmFjdG9yeT4NCi0gICAgPC9mYWN0b3J5Pg0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0YXJ0dXAuSlNGMkF3YXJlQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0YXJ0dXAuQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NGMwNjkuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBWYWxpZGF0aW9uLU1vZHVsZXM8L25hbWU+DQotICAgIDx2ZXJzaW9uPjIuMC40LVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+Mi4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlczwvY29ubmVjdGlvbj4NCi0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzPC9kZXZlbG9wZXJDb25uZWN0aW9uPg0KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlczwvdXJsPg0KLSAgICA8L3NjbT4NCi0NCi0gICAgPG1vZHVsZXM+DQotICAgICAgICA8bW9kdWxlPnByb3BlcnR5LXZhbGlkYXRpb248L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+YmVhbi12YWxpZGF0aW9uPC9tb2R1bGU+DQotICAgIDwvbW9kdWxlcz4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC40LVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9wb20ueG1sIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZGM1OGQuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFByb3BlcnR5LVZhbGlkYXRpb24tTW9kdWxlPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4yLjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjIuMC40LVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC40LVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnBlcnNpc3RlbmNlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnBlcnNpc3RlbmNlLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi41PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQuanNwPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIA0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgPC9yZXNvdXJjZXM+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4yPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9BYnN0cmFjdCouamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9UZXN0VXRpbHMuamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qQmVhbi5qYXZhPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWNiYWUzLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50Ci0gICAgICAgIC5BYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlUmVxdWlyZWRBdHRyaWJ1dGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYoISgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuaXNSZXF1aXJlZCgpICYmCi0gICAgICAgICAgICAgICAgaXNSZXF1aXJlZEluaXRpYWxpemF0aW9uUmVxdWVzdGVkKG1ldGFEYXRhKSAmJgotICAgICAgICAgICAgICAgIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvblN1cHBvcnRlZCh1aUNvbXBvbmVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkgJiYKLSAgICAgICAgICAgICAgICFCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSkKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNSZXF1aXJlZEluaXRpYWxpemF0aW9uUmVxdWVzdGVkKE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQpKSB8fAotICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Kb2luVmFsaWRhdGlvbk1ldGFEYXRhU3RvcmFnZUZpbHRlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0pvaW5WYWxpZGF0aW9uTWV0YURhdGFTdG9yYWdlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNTZkMmMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0pvaW5WYWxpZGF0aW9uTWV0YURhdGFTdG9yYWdlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NZXRhRGF0YVN0b3JhZ2VGaWx0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUHJvcGVydHlTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsQW5ub3RhdGlvblV0aWxzLmFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnM7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxBbm5vdGF0aW9uVXRpbHMuYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9uczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEVYVFZBTC01OQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSm9pblZhbGlkYXRpb25NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgaW1wbGVtZW50cyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUSUNfU0VQQVJBVE9SID0gIjoiOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAocHJvcGVydHlJbmZvcm1hdGlvbiAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8TWV0YURhdGFFbnRyeT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUVudHJ5PigpOw0KLQ0KLSAgICAgICAgICAgIHJlc29sdmVKb2luVmFsaWRhdGlvbk1ldGFEYXRhKHByb3BlcnR5SW5mb3JtYXRpb24sIHJlc3VsdCk7DQotDQotICAgICAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5yZXNldE1ldGFEYXRhRW50cmllcygpOw0KLQ0KLSAgICAgICAgICAgIHNldERlZmF1bHRQcm9wZXJ0eURldGFpbHMocHJvcGVydHlJbmZvcm1hdGlvbiwgcmVzdWx0KTsNCi0NCi0gICAgICAgICAgICBpZiAoY29udGFpbnNKb2luVmFsaWRhdGlvbkNvbnN0cmFpbnQocmVzdWx0KSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZpbHRlcihwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHJlc29sdmVKb2luVmFsaWRhdGlvbk1ldGFEYXRhKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiwgTGlzdDxNZXRhRGF0YUVudHJ5PiByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5IDogcHJvcGVydHlJbmZvcm1hdGlvbi5nZXRNZXRhRGF0YUVudHJpZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRyeVRvVHJhbnNmb3JtRW50cnkobWV0YURhdGFFbnRyeSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0UHJvcGVydHlEZXRhaWxzKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiwgTGlzdDxNZXRhRGF0YUVudHJ5PiByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5IDogcmVzdWx0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGFEYXRhRW50cnkuc2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywNCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUykpOw0KLSAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uYWRkTWV0YURhdGFFbnRyeShtZXRhRGF0YUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNKb2luVmFsaWRhdGlvbkNvbnN0cmFpbnQoTGlzdDxNZXRhRGF0YUVudHJ5PiByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IHJlc3VsdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEpvaW5WYWxpZGF0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxNZXRhRGF0YUVudHJ5PiB0cnlUb1RyYW5zZm9ybUVudHJ5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTGlzdDxNZXRhRGF0YUVudHJ5PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE1ldGFEYXRhRW50cnk+KCk7DQotDQotICAgICAgICBpZiAobWV0YURhdGFFbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgSm9pblZhbGlkYXRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgSm9pblZhbGlkYXRpb24gYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoSm9pblZhbGlkYXRpb24uY2xhc3MpOw0KLQ0KLSAgICAgICAgICAgIHJlcGxhY2VNZXRhRGF0YShhbm5vdGF0aW9uLCBtZXRhRGF0YUVudHJ5LCByZXN1bHQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5hZGQobWV0YURhdGFFbnRyeSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZXBsYWNlTWV0YURhdGEoSm9pblZhbGlkYXRpb24gYW5ub3RhdGlvbiwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgZm9yIChTdHJpbmcgdGFyZ2V0IDogYW5ub3RhdGlvbi52YWx1ZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvUmVwbGFjZU1ldGFEYXRhT2ZUYXJnZXQodGFyZ2V0LCBtZXRhRGF0YUVudHJ5LCByZXN1bHQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1JlcGxhY2VNZXRhRGF0YU9mVGFyZ2V0KFN0cmluZyB0YXJnZXQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgTGlzdDxNZXRhRGF0YUVudHJ5PiByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChpc1N0YXRpY1N5bnRheCh0YXJnZXQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWV0YURhdGEocmVzdWx0LCBleHRyYWN0U3RhdGljTWV0YURhdGEodGFyZ2V0KSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFkZE1ldGFEYXRhKHJlc3VsdCwgZXh0cmFjdER5bmFtaWNNZXRhRGF0YShtZXRhRGF0YUVudHJ5LCB0YXJnZXQpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIGEgZGlmZmVyZW50IGZpbHRlciBtaWdodCBpbnRyb2R1Y2UgYSBuZXcgc3ludGF4IHdoaWNoIGNhdXNlcyB0aGUgZXhjZXB0aW9uDQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE1ldGFEYXRhKExpc3Q8TWV0YURhdGFFbnRyeT4gcmVzdWx0LCBNZXRhRGF0YUVudHJ5W10gbWV0YURhdGFFbnRyaWVzKQ0KLSAgICB7DQotICAgICAgICBDb2xsZWN0aW9ucy5hZGRBbGwocmVzdWx0LCBtZXRhRGF0YUVudHJpZXMpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1N0YXRpY1N5bnRheChTdHJpbmcgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGFyZ2V0LmNvbnRhaW5zKFNUQVRJQ19TRVBBUkFUT1IpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFFbnRyeVtdIGV4dHJhY3RTdGF0aWNNZXRhRGF0YShTdHJpbmcgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBpbnQgc2VwYXJhdG9ySW5kZXggPSB0YXJnZXQubGFzdEluZGV4T2YoU1RBVElDX1NFUEFSQVRPUik7DQotDQotICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IGxvYWRDbGFzcyh0YXJnZXQuc3Vic3RyaW5nKDAsIHNlcGFyYXRvckluZGV4KSk7DQotICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gdGFyZ2V0LnN1YnN0cmluZyhzZXBhcmF0b3JJbmRleCArIDEpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG5ldyBTdGF0aWNTeW50YXhNZXRhRGF0YUV4dHJhY3RvcigpLmV4dHJhY3QodGFyZ2V0Q2xhc3MsIHByb3BlcnR5TmFtZSkuZ2V0TWV0YURhdGFFbnRyaWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIENsYXNzVXRpbHMubG9hZENsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFFbnRyeVtdIGV4dHJhY3REeW5hbWljTWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBTdHJpbmcgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMuY3JlYXRlUHJvcGVydHlEZXRhaWxzRm9yTmV3VGFyZ2V0KG1ldGFEYXRhRW50cnksIHRhcmdldCk7DQotDQotICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpKTsNCi0gICAgICAgIHJldHVybiBuZXcgU3RhdGljU3ludGF4TWV0YURhdGFFeHRyYWN0b3IoKS5leHRyYWN0KA0KLSAgICAgICAgICAgICAgICB0YXJnZXRDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCkpLmdldE1ldGFEYXRhRW50cmllcygpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgY2xhc3MgU3RhdGljU3ludGF4TWV0YURhdGFFeHRyYWN0b3IgZXh0ZW5kcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIFByb3BlcnR5SW5mb3JtYXRpb24gZXh0cmFjdChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldFByb3BlcnR5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOw0KLQ0KLSAgICAgICAgICAgIFByb3BlcnR5U3RvcmFnZSBzdG9yYWdlID0gUmVmbGVjdGlvblV0aWxzLmdldFByb3BlcnR5U3RvcmFnZSgpOw0KLSAgICAgICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoc3RvcmFnZSwgdGFyZ2V0Q2xhc3MsIHRhcmdldFByb3BlcnR5LCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgICAgICBhZGRGaWVsZEFjY2Vzc0Fubm90YXRpb25zKHN0b3JhZ2UsIHRhcmdldENsYXNzLCB0YXJnZXRQcm9wZXJ0eSwgcHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gb2JqICE9IG51bGwgJiYgZ2V0Q2xhc3MoKS5lcXVhbHMob2JqLmdldENsYXNzKCkpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL01hcHBlZENvbnN0cmFpbnRTb3VyY2VQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9NYXBwZWRDb25zdHJhaW50U291cmNlUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYTFjZWYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL01hcHBlZENvbnN0cmFpbnRTb3VyY2VQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsQW5ub3RhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNvbnN0cmFpbnRTb3VyY2VVdGlscy5yZXNvbHZlTWFwcGVkQ29uc3RyYWludFNvdXJjZUZvcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIFJ1ZHkgRGUgQnVzc2NoZXINCi0gKiBAc2luY2UgcjQNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBNYXBwZWRDb25zdHJhaW50U291cmNlUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgICAgICBleHRlbmRzIFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFRyYW5zZm9ybWVkTWV0YURhdGFGb3IoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBvcmlnaW5hbFByb3BlcnR5RGV0YWlsID0gZ2V0RUxIZWxwZXIoKS5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBleHRyYWN0RnJvbU1hcHBlZENvbnN0cmFpbnRTb3VyY2Uob3JpZ2luYWxQcm9wZXJ0eURldGFpbCk7DQotDQotICAgICAgICBpZiAocHJvcGVydHlJbmZvcm1hdGlvbiA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIE5vIEBDb25zdHJhaW50U291cmNlIG9yIGFsaWtlIHNvIG5vdGhpbmcgdG8gZG8uDQotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0VHJhbnNmb3JtZWRNZXRhRGF0YUZvcihmYWNlc0NvbnRleHQsIHByb3BlcnR5SW5mb3JtYXRpb24sIGdldE1vZHVsZUtleSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ZpZWxkVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgb3JpZ2luYWxQcm9wZXJ0eURldGFpbCA9IEV4dFZhbFV0aWxzLmdldFByb3BlcnR5RGV0YWlscyhwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24gPSBleHRyYWN0RnJvbU1hcHBlZENvbnN0cmFpbnRTb3VyY2Uob3JpZ2luYWxQcm9wZXJ0eURldGFpbCk7DQotDQotICAgICAgICBpZiAocHJvcGVydHlJbmZvcm1hdGlvbiAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN1cGVyLnByb2Nlc3NGaWVsZFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFByb3BlcnR5SW5mb3JtYXRpb24gZXh0cmFjdEZyb21NYXBwZWRDb25zdHJhaW50U291cmNlKFByb3BlcnR5RGV0YWlscyBvcmlnaW5hbFByb3BlcnR5RGV0YWlsKQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgY29uc3RyYWludFNvdXJjZVByb3BlcnR5RGV0YWlscyA9DQotICAgICAgICAgICAgICAgIHJlc29sdmVNYXBwZWRDb25zdHJhaW50U291cmNlRm9yKG9yaWdpbmFsUHJvcGVydHlEZXRhaWwuZ2V0S2V5KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsUHJvcGVydHlEZXRhaWwuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsUHJvcGVydHlEZXRhaWwuZ2V0UHJvcGVydHkoKSk7DQotDQotICAgICAgICBpZiAoY29uc3RyYWludFNvdXJjZVByb3BlcnR5RGV0YWlscyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIEV4dFZhbEFubm90YXRpb25VdGlscy5leHRyYWN0QW5ub3RhdGlvbnMoDQotICAgICAgICAgICAgICAgIChDbGFzcykgY29uc3RyYWludFNvdXJjZVByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCksIGNvbnN0cmFpbnRTb3VyY2VQcm9wZXJ0eURldGFpbHMpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWNvcmRQcm9jZXNzZWRJbmZvcm1hdGlvbigpDQotICAgIHsNCi0gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZSwgaGFzIGFscmVhZHkgYmVlbiBkb25lLg0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDBjZGUwLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRHcm91cFN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBuYW1lIG1hcHBlciBmb3IgZ3JvdXAgaW1wbGVtZW50YXRpb25zIHZpYSB2YWxpZGF0aW9uIHBhcmFtZXRlcnMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uUGFyYW1ldGVyLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0R3JvdXBTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yjc0ODQzLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5WYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBWYWxpZGF0aW9uTW9kdWxlS2V5DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkNCi17DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkYjA4ZS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5FeHRWYWxCYXNlVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLkRlZmF1bHRFeHRWYWxCYXNlVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkFic3RyYWN0U3RhcnR1cExpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXJIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuR3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLk1ldGFEYXRhU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwucmVjb3JkZXIuQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkRlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UubWFwcGVyLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5tYXBwZXIuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5FeHRWYWxDcm9zc1ZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuRGVmYXVsdEV4dFZhbENyb3NzVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTI0NzQzNjE2MTI4NTcyMjIyODNMOw0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0TW9kdWxlQ29uZmlnKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQmFzZVZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLnVzZShuZXcgRGVmYXVsdEV4dFZhbEJhc2VWYWxpZGF0aW9uTW9kdWxlQ29uZmlndXJhdGlvbigpLCBmYWxzZSk7DQotICAgICAgICBFeHRWYWxDcm9zc1ZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLnVzZShuZXcgRGVmYXVsdEV4dFZhbENyb3NzVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24oKSwgZmFsc2UpOw0KLSAgICB9DQotICAgIA0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgaW5pdFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCk7DQotICAgICAgICBpbml0U3RhdGljU3RyYXRlZ3lNYXBwaW5ncygpOw0KLSAgICAgICAgaW5pdERlZmF1bHRDb21wb25lbnRJbml0aWFsaXplcigpOw0KLSAgICAgICAgYWRkU2tpcFZhbGlkYXRpb25TdXBwb3J0KCk7DQotICAgICAgICBhZGRNYXBwZWRDb25zdHJhaW50U291cmNlVmFsaWRhdGlvblN1cHBvcnQoKTsNCi0gICAgICAgIGluaXRTdG9yYWdlTWFuYWdlckFuZE5hbWVNYXBwZXJzKCk7DQotICAgICAgICBpbml0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKTsNCi0gICAgICAgIGluaXRNZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzKCk7DQotICAgICAgICBpbml0UGhhc2VMaXN0ZW5lcnMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcihuZXcgQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdGF0aWNTdHJhdGVneU1hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFFeHRWYWxCYXNlVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24uZ2V0KCkuZGVhY3RpdmF0ZUpwYUJhc2VkVmFsaWRhdGlvbigpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA9IG5ldyBTdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgICAgICBzdGF0aWNDb25maWcuc2V0U291cmNlT2ZNYXBwaW5nKA0KLSAgICAgICAgICAgICAgICBFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSArIi5qcGFfc3RyYXRlZ3lfbWFwcGluZ3MiKTsNCi0NCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHLCBzdGF0aWNDb25maWcpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0RGVmYXVsdENvbXBvbmVudEluaXRpYWxpemVyKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRTa2lwVmFsaWRhdGlvblN1cHBvcnQoKQ0KLSAgICB7DQotICAgICAgICBsb2dnZXIuaW5mbygiYWRkaW5nIHN1cHBvcnQgZm9yIEBTa2lwVmFsaWRhdGlvbiIpOw0KLQ0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZGVueVJlbmRlcmVySW50ZXJjZXB0b3IoVmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yKCkpOw0KLQ0KLSAgICAgICAgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgIC8vaXQncyBqdXN0IHJlcXVpcmVkIHRvIHNldCB0aGUgdGFyZ2V0DQotICAgICAgICBjb25maWcuYWRkTWFwcGluZyhDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCBTa2lwVmFsaWRhdGlvblN1cHBvcnQuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5TS0lQX1ZBTElEQVRJT05fU1VQUE9SVF9DT05GSUcsIGNvbmZpZyk7DQotDQotICAgICAgICAvL2NvbmZpZy5hZGRNYXBwaW5nKENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04sIFJlcXVpcmVkU3RyYXRlZ3kuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkTWFwcGVkQ29uc3RyYWludFNvdXJjZVZhbGlkYXRpb25TdXBwb3J0KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKA0KLSAgICAgICAgICAgICAgICBuZXcgTWFwcGVkQ29uc3RyYWludFNvdXJjZVByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFN0b3JhZ2VNYW5hZ2VyQW5kTmFtZU1hcHBlcnMoKQ0KLSAgICB7DQotICAgICAgICBTdG9yYWdlTWFuYWdlckhvbGRlciBzdG9yYWdlTWFuYWdlckhvbGRlciA9DQotICAgICAgICAgICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwgU3RvcmFnZU1hbmFnZXJIb2xkZXIuY2xhc3MpKTsNCi0NCi0gICAgICAgIC8vcHJvY2Vzc2VkLWluZm9ybWF0aW9uDQotICAgICAgICBEZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlciBwcm9jZXNzZWRJbmZvU3RvcmFnZU1hbmFnZXIgPQ0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIoKTsNCi0gICAgICAgIHByb2Nlc3NlZEluZm9TdG9yYWdlTWFuYWdlci5yZWdpc3RlcihuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIHN0b3JhZ2VNYW5hZ2VySG9sZGVyLnNldFN0b3JhZ2VNYW5hZ2VyKFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jbGFzcywgcHJvY2Vzc2VkSW5mb1N0b3JhZ2VNYW5hZ2VyLCBmYWxzZSk7DQotDQotICAgICAgICAvL2Nyb3NzLXZhbGlkYXRpb24NCi0gICAgICAgIERlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlciBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlciA9DQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIoKTsNCi0gICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLnJlZ2lzdGVyKG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIHN0b3JhZ2VNYW5hZ2VySG9sZGVyLnNldFN0b3JhZ2VNYW5hZ2VyKENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MsIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLCBmYWxzZSk7DQotDQotICAgICAgICAvL2dyb3VwLXZhbGlkYXRpb24gbGlnaHQNCi0gICAgICAgIFN0b3JhZ2VNYW5hZ2VyIHN0b3JhZ2VNYW5hZ2VyID0gc3RvcmFnZU1hbmFnZXJIb2xkZXIuZ2V0U3RvcmFnZU1hbmFnZXIoR3JvdXBTdG9yYWdlLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmKHN0b3JhZ2VNYW5hZ2VyIGluc3RhbmNlb2YgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgICgoQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFN0cmluZz4pc3RvcmFnZU1hbmFnZXIpDQotICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IFByb3BlcnR5VmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcigpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnNldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKG5ldyBQcm9wZXJ0eVZhbGlkYXRpb25Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvcigpLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRNZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzKCkNCi0gICAgew0KLSAgICAgICAgIE1ldGFEYXRhU3RvcmFnZSBtZXRhRGF0YVN0b3JhZ2UgPSBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKA0KLSAgICAgICAgICAgICAgICAgTWV0YURhdGFTdG9yYWdlLmNsYXNzLCBNZXRhRGF0YVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIG1ldGFEYXRhU3RvcmFnZS5yZWdpc3RlckZpbHRlcihuZXcgSm9pblZhbGlkYXRpb25NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIoKSk7DQotICAgICAgICAvL21ldGFEYXRhU3RvcmFnZS5yZWdpc3RlckZpbHRlcihuZXcgQ29tcG9zaXRlTWV0YURhdGFTdG9yYWdlRmlsdGVyKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0UGhhc2VMaXN0ZW5lcnMoKQ0KLSAgICB7DQotICAgICAgICBKc2ZVdGlscy5yZWdpc3RlclBoYXNlTGlzdGVuZXIobmV3IENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGM0NTI2Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci0KLS8qKgotICogdGhlIHNraXAgdmFsaWRhdGlvbiBzdXBwb3J0IHdhcyByZWZhY3RvcmVkIHRvIGFuIGluZGVwZW5kZW50IG1lY2hhbmlzbQotICogc2VlIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJjaGFuZ2UgdGhlIGFkZC1vbnMiICsKLSAgICAgICAgIm9sZCBuYW1lOiBWYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0IikKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0TW9kdWxlS2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvblNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVhNmFkYy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJvcGVydHlWYWxpZGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgeC54LjMKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvciBpbXBsZW1lbnRzIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yCi17Ci0gICAgcHVibGljIGJvb2xlYW4gc2tpcFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBpZihKc2ZVdGlscy5pc1JlbmRlclJlc3BvbnNlUGhhc2UoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gIWlzQ2xpZW50U2lkZVZhbGlkYXRpb25FbmFibGVkKG1ldGFEYXRhRW50cnkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQgfHwgUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZGF0aW9uU2tpcHBlZChmYWNlc0NvbnRleHQsIHZhbGlkYXRpb25TdHJhdGVneSwgbWV0YURhdGFFbnRyeSk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDbGllbnRTaWRlVmFsaWRhdGlvbkVuYWJsZWQoTWV0YURhdGFFbnRyeSBlbnRyeSkKLSAgICB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBrZXlzVG9EaXNhYmxlID0gZW50cnkuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbk1ldGFEYXRhS2V5cy5ESVNBQkxFX0NMSUVOVF9TSURFX1ZBTElEQVRJT04sIExpc3QuY2xhc3MpOwotCi0gICAgICAgIHJldHVybiBrZXlzVG9EaXNhYmxlID09IG51bGwgfHwgIWtleXNUb0Rpc2FibGUuY29udGFpbnMoZW50cnkuZ2V0S2V5KCkpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9EZWZhdWx0RXh0VmFsQmFzZVZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9EZWZhdWx0RXh0VmFsQmFzZVZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ODIwNWIuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvRGVmYXVsdEV4dFZhbEJhc2VWYWxpZGF0aW9uTW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgcjQNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RXh0VmFsQmFzZVZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uIGV4dGVuZHMgRXh0VmFsQmFzZVZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGpwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5WQUxJREFUSU9OX01FU1NBR0VTX0pQQTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBkZWFjdGl2YXRlSnBhQmFzZWRWYWxpZGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9FeHRWYWxCYXNlVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24uamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL0V4dFZhbEJhc2VWYWxpZGF0aW9uTW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGRlNzU1Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL0V4dFZhbEJhc2VWYWxpZGF0aW9uTW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgcjQNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHRWYWxCYXNlVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBFeHRWYWxNb2R1bGVDb25maWd1cmF0aW9uDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBFeHRWYWxDb250ZXh0IGV4dFZhbENvbnRleHQgPSBudWxsOw0KLQ0KLSAgICBwcm90ZWN0ZWQgRXh0VmFsQmFzZVZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uKCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBEb24ndCBhY2Nlc3MgRXh0VmFsQ29udGV4dCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNsYXNzLiAgT3BlbldlYkJlYW5zIGluaXRpYWxpemVzIGFsbCBjbGFzc2VzIGR1cmluZw0KLSAgICAgKiBzdGFydHVwIG9mIHRoZSBXZWJDb250YWluZXIuICBleHRWYWxDb250ZXh0IGNvbnN0cnVjdG9yIHRyaWVzIHRvIGFjY2VzcyBXZWIueG1sIHBhcmFtZXRlcnMgdGhyb3VnaCBGYWNlc0NvbnRleHQNCi0gICAgICogd2hpY2ggaXNuJ3QgYXZhaWxhYmxlIHlldC4NCi0gICAgICogQHJldHVybiBUaGUgRXh0VmFsQ29udGV4dA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgRXh0VmFsQ29udGV4dCBnZXRFeHRWYWxDb250ZXh0KCkNCi0gICAgew0KLSAgICAgICAgaWYgKGV4dFZhbENvbnRleHQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBleHRWYWxDb250ZXh0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZXh0VmFsQ29udGV4dDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBFeHRWYWxCYXNlVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24gZ2V0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEV4dFZhbENvbnRleHQoKS5nZXRNb2R1bGVDb25maWd1cmF0aW9uKEV4dFZhbEJhc2VWYWxpZGF0aW9uTW9kdWxlQ29uZmlndXJhdGlvbi5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHVzZShFeHRWYWxCYXNlVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24gY29uZmlnLCBib29sZWFuIGZvcmNlT3ZlcnJpZGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRFeHRWYWxDb250ZXh0KCkuYWRkTW9kdWxlQ29uZmlndXJhdGlvbihFeHRWYWxCYXNlVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24uY2xhc3MsIGNvbmZpZywNCi0gICAgICAgICAgICAgICAgZm9yY2VPdmVycmlkZSk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogd2ViLnhtbCBjb25maWcNCi0gICAgICovDQotDQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcganBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZXMoKTsNCi0NCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZGVhY3RpdmF0ZUpwYUJhc2VkVmFsaWRhdGlvbigpOw0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTQzZDQ1Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcm4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiZG9jdW1lbnRhdGlvbiIpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1pbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fTUVTU0FHRVNfSlBBID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMiKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9KUEFfQkFTRURfVkFMSURBVElPTiIpOw0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0RvdWJsZVJhbmdlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0RvdWJsZVJhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNGUwMmYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIERvdWJsZVJhbmdlDQotew0KLSAgICBkb3VibGUgbWluaW11bSgpIGRlZmF1bHQgRG91YmxlLk1JTl9WQUxVRTsNCi0NCi0gICAgZG91YmxlIG1heGltdW0oKSBkZWZhdWx0IERvdWJsZS5NQVhfVkFMVUU7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjOWE4OTkuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Kb2luVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgSm9pblZhbGlkYXRpb24NCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTGVuZ3RoLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xlbmd0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzQzN2QxLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTGVuZ3RoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgTGVuZ3RoDQotew0KLSAgICBpbnQgbWluaW11bSgpIGRlZmF1bHQgMDsNCi0NCi0gICAgaW50IG1heGltdW0oKSBkZWZhdWx0IEludGVnZXIuTUFYX1ZBTFVFOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Mb25nUmFuZ2UuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MjUxZWYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Mb25nUmFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBMb25nUmFuZ2UNCi17DQotICAgIGxvbmcgbWluaW11bSgpIGRlZmF1bHQgTG9uZy5NSU5fVkFMVUU7DQotDQotICAgIGxvbmcgbWF4aW11bSgpIGRlZmF1bHQgTG9uZy5NQVhfVkFMVUU7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1BhdHRlcm4uamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzc1ZDg5Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFBhdHRlcm4NCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJub19tYXRjaCI7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExY2UxMjguLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFJlcXVpcmVkDQotew0KLSAgICAvKioNCi0gICAgICogdG8gY3VzdG9taXplIHRoZSBlcnJvciBtZXNzYWdlIG9yDQotICAgICAqIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGpzZiByZXF1aXJlZCBtZXNzYWdlIHdpdGggdGhlIHVzYWdlIG9mIHRoZSBtZXNzYWdlIHJlc29sdmVyIG1lY2hhbmlzbQ0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIGFuIG9wdGlvbmFsIGVycm9yIG1lc3NhZ2Uga2V5DQotICAgICAqLw0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZmllbGRfcmVxdWlyZWQiOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvbi5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmM1MjliLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFNraXBWYWxpZGF0aW9uDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZSgpOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCB7fTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMDc2MjEuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRhcmdldChUWVBFKQotQFJldGVudGlvbihSVU5USU1FKQotQERvY3VtZW50ZWQKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIEBpbnRlcmZhY2UgU2tpcFZhbGlkYXRpb25TdXBwb3J0Ci17Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9WYWxpZGF0b3IuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMzhhY2EuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBWYWxpZGF0b3INCi17DQotICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yPltdIHZhbHVlKCk7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYTUzNTguLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlByb3BlcnR5U3RvcmFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbEFubm90YXRpb25VdGlscy5hZGRGaWVsZEFjY2Vzc0Fubm90YXRpb25zOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxBbm5vdGF0aW9uVXRpbHMuYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQERlcHJlY2F0ZWQKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvciBleHRlbmRzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcgotewotICAgIHByaXZhdGUgRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvcigpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgZ2V0SW5zdGFuY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3JGb3IoCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IoKSwgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAVG9EbyhQcmlvcml0eS5NRURJVU0pCi0gICAgcHVibGljIFByb3BlcnR5SW5mb3JtYXRpb24gZXh0cmFjdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKCk7Ci0KLSAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgUHJvcGVydHlEZXRhaWxzKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihvYmplY3QuZ2V0Q2xhc3MoKSArICIgaXMgbm90IGEgIiArIFByb3BlcnR5RGV0YWlscy5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IChQcm9wZXJ0eURldGFpbHMpb2JqZWN0OwotCi0gICAgICAgIENsYXNzIGVudGl0eUNsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCkpOwotCi0gICAgICAgIC8vVE9ETyB0ZXN0IHdpdGggY29tcGxleCBjb21wb25lbnRzCi0gICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uc2V0SW5mb3JtYXRpb24oCi0gICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBwcm9wZXJ0eURldGFpbHMpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGZpbmQgYW5kIGFkZCBhbm5vdGF0aW9ucwotICAgICAgICAgKi8KLSAgICAgICAgUHJvcGVydHlTdG9yYWdlIHN0b3JhZ2UgPSBSZWZsZWN0aW9uVXRpbHMuZ2V0UHJvcGVydHlTdG9yYWdlKCk7Ci0KLSAgICAgICAgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhzdG9yYWdlLCBlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICBhZGRGaWVsZEFjY2Vzc0Fubm90YXRpb25zKHN0b3JhZ2UsIGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU4MDEyLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1JbnZhbGlkIGZvcm1hdA0KLW5vX21hdGNoX2RldGFpbD1UaGUgcmVxdWlyZWQgZm9ybWF0ZSBpczogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2FiNTQzLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1cdTA2MjdcdTA2NDRcdTA2MzVcdTA2NGFcdTA2M2FcdTA2MjkgXHUwNjJlXHUwNjI3XHUwNjM3XHUwNjI2XHUwNjI5DQotbm9fbWF0Y2hfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYzNVx1MDY0YVx1MDYzYVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MzdcdTA2NDRcdTA2NDhcdTA2MjhcdTA2MjkgXHUwNjQ3XHUwNjQ5OiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZDY0OTAuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXQgaW52XHUwMGUwbGlkCi1ub19tYXRjaF9kZXRhaWw9RWwgZm9ybWF0IHJlcXVlcml0IFx1MDBlOXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcyBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVlNzAxYi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9VW5n/Gx0aWdlcyBGb3JtYXQNCi1ub19tYXRjaF9kZXRhaWw9RGFzIGVyZm9yZGVybGljaGUgRm9ybWF0IGlzdDogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU4MDEyLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1JbnZhbGlkIGZvcm1hdA0KLW5vX21hdGNoX2RldGFpbD1UaGUgcmVxdWlyZWQgZm9ybWF0ZSBpczogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2JiOThjLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1Gb3JtYXRvIGludlx1MDBlMWxpZG8gDQotbm9fbWF0Y2hfZGV0YWlsPUVsIGZvcm1hdG8gcmVxdWVyaWRvIGVzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMGEyMjMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUxlIGZvcm1hdCBlc3QgaW52YWxpZGUNCi1ub19tYXRjaF9kZXRhaWw9TGUgZm9ybWF0IGRvaXQgJmVjaXJjO3RyZSBkZSBsYSBmb3JtZTogezB9DQotDQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTg3NDhjLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotbm9fbWF0Y2g9Rm9ybWF0byBub24gdmFsaWRvCi1ub19tYXRjaF9kZXRhaWw9SWwgZm9ybWF0byByaWNoaWVzdG8gJmVncmF2ZTs6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcyBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0YmM3NC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9R2VcdTAwZTdlcnNpeiBiaVx1MDBlN2ltDQotbm9fbWF0Y2hfZGV0YWlsPWdlcmVrZW4gYmlcdTAwZTdpbTogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFhZTY0Yi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotICAgICAgICBleHRlbmRzDQotICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZiAoYmFzZU5hbWUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBiYXNlTmFtZSA9IHN1cGVyLmdldEJhc2VOYW1lKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gYmFzZU5hbWU7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9KcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZTE5OTUuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9KcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLkV4dFZhbEJhc2VWYWxpZGF0aW9uTW9kdWxlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotLyoNCi0gKiB0aGUganBhIHN1cHBvcnQgaXMgYW4gZXhjZXB0aW9uIGluIHZpZXcgb2Ygc29tZSBtZWNoYW5pc21zIC0gc28gdGhlcmUncyBubyBjb252ZW50aW9uIGZvciB0aGUgbWVzc2FnZSBidW5kbGUuDQotICogaW5zdGVhZCBvZiB0aGUgY29udmVudGlvbiB0aGVyZSBpcyBhIGdsb2JhbCBwcm9wZXJ0eSB0byBoYXZlIGFuIGFsdGVybmF0aXZlIHRvIHdlYi54bWwgY29uZmlndXJhdGlvbg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKUEFfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFUyA9ICJKUEFfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFUyI7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQkFTRV9OQU1FID0NCi0gICAgICAgICAgICBFeHRWYWxCYXNlVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24uZ2V0KCkuanBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZXMoKTsNCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX05BTUUgPSBDbGFzc1V0aWxzLmdldFBhY2thZ2VOYW1lKEpwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5jbGFzcykucmVwbGFjZSgNCi0gICAgICAgICAgICAiLm1lc3NhZ2UucmVzb2x2ZXIiLCAiLm1lc3NhZ2UuYnVuZGxlIikrICIuanBhX21lc3NhZ2VzIjsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21CYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKENVU1RPTV9CQVNFX05BTUUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gQ1VTVE9NX0JBU0VfTkFNRTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoU3RyaW5nKUV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KEpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEJBU0VfTkFNRTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9BYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9BYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NWNkNDQuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQWJzdHJhY3RWYWxpZGF0aW9uUGFyYW1ldGVyQXdhcmVUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uUGFyYW1ldGVyQXdhcmVUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhKQ0KLSAgICB7DQotICAgICAgICBpZiAoaXNCbG9ja2luZ01ldGFEYXRhKG1ldGFEYXRhKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtTWV0YURhdGEobWV0YURhdGEpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YSk7DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQmxvY2tpbmdNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZSB0ZXN0TWVzc2FnZSA9IG5ldyBGYWNlc01lc3NhZ2UoKTsNCi0gICAgICAgIHRlc3RNZXNzYWdlLnNldFNldmVyaXR5KEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotDQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkgPSB0cnlUb1RyYW5zZm9ybVZpb2xhdGlvblNldmVyaXR5KG1ldGFEYXRhRW50cnkpOw0KLQ0KLSAgICAgICAgaWYoc2V2ZXJpdHkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0ZXN0TWVzc2FnZS5zZXRTZXZlcml0eShzZXZlcml0eSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuc2V2ZXJpdHlCbG9ja3NTdWJtaXRGb3JDb21wb25lbnRJZChudWxsLCB0ZXN0TWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgdHJ5VG9UcmFuc2Zvcm1WaW9sYXRpb25TZXZlcml0eShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlLlNldmVyaXR5PiByZXN1bHQgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkNCi0gICAgICAgICAgICAgICAgLmV4dHJhY3QobWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eS5jbGFzcyk7DQotDQotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgIXJlc3VsdC5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5pdGVyYXRvcigpLm5leHQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTllNGUuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXINCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBEb3VibGVSYW5nZSBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShEb3VibGVSYW5nZS5jbGFzcyk7DQotDQotICAgICAgICBkb3VibGUgbWluaW11bSA9IGFubm90YXRpb24ubWluaW11bSgpOw0KLQ0KLSAgICAgICAgaWYobWluaW11bSAhPSBEb3VibGUuTUlOX1ZBTFVFKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4sIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU5fREVGQVVMVCwgbWluaW11bSk7DQotICAgICAgICB9DQotDQotICAgICAgICBkb3VibGUgbWF4aW11bSA9IGFubm90YXRpb24ubWF4aW11bSgpOw0KLQ0KLSAgICAgICAgaWYobWF4aW11bSAhPSBEb3VibGUuTUFYX1ZBTFVFKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVhfREVGQVVMVCwgbWF4aW11bSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSm9pbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUyNjBjNi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3Rvci5EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3BlcnR5VmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1ARGVwcmVjYXRlZA0KLXB1YmxpYyBjbGFzcyBKb2luTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotDQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0KG1ldGFEYXRhRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm5pbmcoInRoaXMgY2xhc3MgaXMgcmVwbGFjZWQgYnkgYSBtZXRhLWRhdGEgc3RvcmFnZSBmaWx0ZXIuICIgKw0KLSAgICAgICAgICAgICAgICAgICAgImlmIGl0IGdldHMgaW52b2tlZCBhbmQgYW4gZXhjZXB0aW9uIG9jY3VycywgYSBjdXN0b20gc3ludGF4IGlzIHVzZWQuIiArDQotICAgICAgICAgICAgICAgICAgICAidGhpcyBjbGFzcyBtaWdodCBiZSB1c2VkIGJ5IGFuIG9sZCBhZGQtb24uIHBsZWFzZSBjaGVjayBmb3IgYSBuZXdlciB2ZXJzaW9uLiIpOw0KLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgZXh0cmFjdG9yID0gRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5nZXRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgU3RyaW5nW10gdGFyZ2V0RXhwcmVzc2lvbnMgPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEpvaW5WYWxpZGF0aW9uLmNsYXNzKS52YWx1ZSgpOw0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlsczsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBmb3IgKFN0cmluZyB0YXJnZXRFeHByZXNzaW9uIDogdGFyZ2V0RXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChtZXRhRGF0YUVudHJ5LCB0YXJnZXRFeHByZXNzaW9uKTsNCi0NCi0gICAgICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBleHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHByb3BlcnR5RGV0YWlscykuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSA9PSBudWxsIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZGF0aW9uU2tpcHBlZChmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3ksIGVudHJ5KSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IEV4dFZhbFV0aWxzLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoIShlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQW5ub3RhdGlvbiAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXh0cmFjdChlbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXRlcmF0b3IoKS5oYXNOZXh0KCkpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0QWxsKG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZTEwMTEuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQmFzaWM7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpwYU1ldGFEYXRhVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiaW1wbC4gdGhlIHJlc3QiKQ0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmKGFubm90YXRpb24gaW5zdGFuY2VvZiBDb2x1bW4pDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoKCEoKENvbHVtbikgYW5ub3RhdGlvbikubnVsbGFibGUoKSkgJiYgRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RILCAoKENvbHVtbikgYW5ub3RhdGlvbikubGVuZ3RoKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihhbm5vdGF0aW9uIGluc3RhbmNlb2YgQmFzaWMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoISgoQmFzaWMpIGFubm90YXRpb24pLm9wdGlvbmFsKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIElkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotICAgICAgICAvL1RPRE8gaW1wbC4gdGhlIHJlc3QhISENCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM5MWY5YS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9MZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXINCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBMZW5ndGggYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTGVuZ3RoLmNsYXNzKTsNCi0NCi0gICAgICAgIGludCBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW5pbXVtKCk7DQotDQotICAgICAgICBpZihtaW5pbXVtICE9IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEgsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIX0RFRkFVTFQsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW50IG1heGltdW0gPSBhbm5vdGF0aW9uLm1heGltdW0oKTsNCi0gICAgICAgIGlmKG1heGltdW0gIT0gSW50ZWdlci5NQVhfVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIX0RFRkFVTFQsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGEzMzJiLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxvbmdSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTG9uZ1JhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKExvbmdSYW5nZS5jbGFzcyk7DQotDQotICAgICAgICBsb25nIG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gIT0gTG9uZy5NSU5fVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTiwgbWluaW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxULCBtaW5pbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGxvbmcgbWF4aW11bSA9IGFubm90YXRpb24ubWF4aW11bSgpOw0KLQ0KLSAgICAgICAgaWYobWF4aW11bSAhPSBMb25nLk1BWF9WQUxVRSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYLCBtYXhpbXVtKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1BhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMGJlNjUuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQYXR0ZXJuTWV0YURhdGFUcmFuc2Zvcm1lciAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgUGF0dGVybiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShQYXR0ZXJuLmNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4sIChhbm5vdGF0aW9uKS52YWx1ZSgpKTsNCi0NCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkgPSAoYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgICAgICBMb2NhbGUgY3VycmVudExvY2FsZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpOw0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSA9DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7DQotDQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnID0gRXh0VmFsVXRpbHMuZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAuZ2V0TWVzc2FnZSh2YWxpZGF0aW9uRXJyb3JNc2dLZXksIGN1cnJlbnRMb2NhbGUpOw0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFLCB2YWxpZGF0aW9uRXJyb3JNc2cpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9SZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJiZWNjOS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9SZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uUGFyYW1ldGVyQXdhcmVUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NraXBNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ta2lwTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGM2NGFiLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NraXBNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFNraXBNZXRhRGF0YVRyYW5zZm9ybWVyICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXINCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCB0cnVlKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1ZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1ZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQwNWFiMC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lciAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgVmFsaWRhdG9yIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFZhbGlkYXRvci5jbGFzcyk7DQotDQotICAgICAgICBDbGFzc1tdIHZhbGlkYXRvcnMgPSBhbm5vdGF0aW9uLnZhbHVlKCk7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBjdXJyZW50Q2xhc3MgOiB2YWxpZGF0b3JzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRDbGFzcy5nZXRTaW1wbGVOYW1lKCkudG9Mb3dlckNhc2UoKS5jb250YWlucyhDb21tb25NZXRhRGF0YUtleXMuRU1BSUwpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsdWUuYWRkKENvbW1vbk1ldGFEYXRhS2V5cy5FTUFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZhbHVlLmFkZChjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00sIHZhbHVlKTsNCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE5M2RjNy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkRvdWJsZVJhbmdlVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEb3VibGVSYW5nZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIERvdWJsZVJhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKERvdWJsZVJhbmdlLmNsYXNzKTsNCi0gICAgICAgIERvdWJsZVJhbmdlVmFsaWRhdG9yIGRvdWJsZVJhbmdlVmFsaWRhdG9yID0gKERvdWJsZVJhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5Eb3VibGVSYW5nZSIpOw0KLQ0KLSAgICAgICAgaWYoYW5ub3RhdGlvbi5taW5pbXVtKCkgIT0gRG91YmxlLk1JTl9WQUxVRSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGFubm90YXRpb24ubWF4aW11bSgpICE9IERvdWJsZS5NQVhfVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bShhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFiZjAxNy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Kb2luVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uZXh0cmFjdG9yLkRlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjZXNFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotQERlcHJlY2F0ZWQNCi1wdWJsaWMgY2xhc3MgSm9pblZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlSm9pblZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChGYWNlc0V4Y2VwdGlvbiB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IHQ7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExldmVsLldBUk5JTkcsICJ0aGlzIGNsYXNzIGlzIHJlcGxhY2VkIGJ5IGEgbWV0YS1kYXRhIHN0b3JhZ2UgZmlsdGVyLiAiICsNCi0gICAgICAgICAgICAgICAgICAgICJpZiBpdCBnZXRzIGludm9rZWQgYW5kIGFuIGV4Y2VwdGlvbiBvY2N1cnMsIGEgY3VzdG9tIHN5bnRheCBpcyB1c2VkLiIgKw0KLSAgICAgICAgICAgICAgICAgICAgInRoaXMgY2xhc3MgbWlnaHQgYmUgdXNlZCBieSBhbiBvbGQgYWRkLW9uLiBwbGVhc2UgY2hlY2sgZm9yIGEgbmV3ZXIgdmVyc2lvbi4iLCBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVKb2luVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBleHRyYWN0b3IgPSBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmdldEluc3RhbmNlKCk7DQotDQotICAgICAgICBTdHJpbmdbXSB0YXJnZXRFeHByZXNzaW9ucyA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoSm9pblZhbGlkYXRpb24uY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlsczsNCi0gICAgICAgIGZvciAoU3RyaW5nIHRhcmdldEV4cHJlc3Npb24gOiB0YXJnZXRFeHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscw0KLSAgICAgICAgICAgICAgICAuY3JlYXRlUHJvcGVydHlEZXRhaWxzRm9yTmV3VGFyZ2V0KG1ldGFEYXRhRW50cnksIHRhcmdldEV4cHJlc3Npb24pOw0KLQ0KLSAgICAgICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IGV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgcHJvcGVydHlEZXRhaWxzKS5nZXRNZXRhRGF0YUVudHJpZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKGVudHJ5LmdldEtleSgpKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihFeHRWYWxVdGlscy5wcm9jZXNzTWV0YURhdGFFbnRyeUFmdGVyU2tpcFZhbGlkYXRpb24oUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcygNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksIFZhbGlkYXRpb25TdHJhdGVneS5jbGFzcyksIGVudHJ5KSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBlbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lc3QoIm5vIHZhbGlkYXRpb24gc3RyYXRlZ3kgZm91bmQgZm9yICIgKyBlbnRyeS5nZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTQxYTkzLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uZXhjZXB0aW9uLlJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLk51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5CYXNpYzsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmU7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ATnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1ARW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRmFjZXNCdW5kbGUgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRFX0xFTkdUSCA9ICJsZW5ndGgiOw0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB2aW9sYXRpb247DQotICAgIHByaXZhdGUgaW50IG1heExlbmd0aDsNCi0NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpOw0KLSAgICAgICAgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBDb2x1bW4pDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVDb2x1bW5Bbm5vdGF0aW9uKChDb2x1bW4pIGFubm90YXRpb24sIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgQmFzaWMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVCYXNpY0Fubm90YXRpb24oKEJhc2ljKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIElkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBPbmVUb09uZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZU9uZVRvT25lQW5ub3RhdGlvbigoT25lVG9PbmUpIGFubm90YXRpb24sIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTWFueVRvT25lKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlTWFueVRvT25lQW5ub3RhdGlvbigoTWFueVRvT25lKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUNvbHVtbkFubm90YXRpb24oQ29sdW1uIGNvbHVtbiwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoIWNvbHVtbi5udWxsYWJsZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nDQotICAgICAgICAgICAgICAgICYmIGNvbHVtbi5sZW5ndGgoKSA8ICgoU3RyaW5nKSBjb252ZXJ0ZWRPYmplY3QpLmxlbmd0aCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uID0gVkFMSURBVEVfTEVOR1RIOw0KLSAgICAgICAgICAgIHRoaXMubWF4TGVuZ3RoID0gY29sdW1uLmxlbmd0aCgpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNZXNzYWdlKG51bGwpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVCYXNpY0Fubm90YXRpb24oQmFzaWMgYmFzaWMsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKCFiYXNpYy5vcHRpb25hbCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVPbmVUb09uZUFubm90YXRpb24oT25lVG9PbmUgb25lVG9PbmUsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmICghb25lVG9PbmUub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTWFueVRvT25lQW5ub3RhdGlvbihNYW55VG9PbmUgbWFueVRvT25lLCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIW1hbnlUb09uZS5vcHRpb25hbCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9EbyhQcmlvcml0eS5NRURJVU0pDQotICAgIHByaXZhdGUgdm9pZCBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCA9PSBudWxsIHx8ICgiIi5lcXVhbHMoY29udmVydGVkT2JqZWN0KSAmJiBFeHRWYWxVdGlscy5pbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbiA9IENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRDsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24oZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNZXNzYWdlKG51bGwpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChWQUxJREFURV9MRU5HVEguZXF1YWxzKHRoaXMudmlvbGF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gImZpZWxkX3Rvb19sb25nIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gImZpZWxkX3JlcXVpcmVkIjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24pOw0KLQ0KLSAgICAgICAgaWYgKFZBTElEQVRFX0xFTkdUSC5lcXVhbHModGhpcy52aW9sYXRpb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLnJlcGxhY2UoInswfSIsICIiICsgdGhpcy5tYXhMZW5ndGgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gZS5nZXRGYWNlc01lc3NhZ2UoKTsNCi0NCi0gICAgICAgIGlmKHRoaXMudXNlRmFjZXNCdW5kbGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoVkFMSURBVEVfTEVOR1RILmVxdWFscyh0aGlzLnZpb2xhdGlvbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5yZXBsYWNlV2l0aERlZmF1bHRNYXhpbXVtTWVzc2FnZShmYWNlc01lc3NhZ2UsIHRoaXMubWF4TGVuZ3RoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKGZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIGUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xlbmd0aFN0cmF0ZWd5LmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2QwNTU4Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xlbmd0aFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExlbmd0aFN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIExlbmd0aCBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMZW5ndGguY2xhc3MpOw0KLSAgICAgICAgTGVuZ3RoVmFsaWRhdG9yIGxlbmd0aFZhbGlkYXRvciA9IChMZW5ndGhWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoImphdmF4LmZhY2VzLkxlbmd0aCIpOw0KLQ0KLSAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1pbmltdW0oYW5ub3RhdGlvbi5taW5pbXVtKCkpOw0KLSAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1heGltdW0oYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTG9uZ1JhbmdlU3RyYXRlZ3kuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNTdhYzcuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTG9uZ1JhbmdlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxvbmdSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkxvbmdSYW5nZVZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTG9uZ1JhbmdlU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLQ0KLSAgICAgICAgTG9uZ1JhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKExvbmdSYW5nZS5jbGFzcyk7DQotICAgICAgICBMb25nUmFuZ2VWYWxpZGF0b3IgbG9uZ1JhbmdlVmFsaWRhdG9yID0gKExvbmdSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5Mb25nUmFuZ2UiKTsNCi0NCi0gICAgICAgIGlmKGFubm90YXRpb24ubWluaW11bSgpICE9IExvbmcuTUlOX1ZBTFVFKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGFubm90YXRpb24ubWF4aW11bSgpICE9IExvbmcuTUFYX1ZBTFVFKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUGF0dGVyblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhM2Y0ZWYuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUGF0dGVyblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5QYXR0ZXJuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQYXR0ZXJuU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k8UGF0dGVybj4NCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFBhdHRlcm4gYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoUGF0dGVybi5jbGFzcyk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBleHByZXNzaW9uIDogYW5ub3RhdGlvbi52YWx1ZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4uY29tcGlsZShleHByZXNzaW9uKS5tYXRjaGVyKGNvbnZlcnRlZE9iamVjdC50b1N0cmluZygpKS5tYXRjaGVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG5ldyBGYWNlc01lc3NhZ2UoDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiksDQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24pLnJlcGxhY2UoInswfSIsIGV4cHJlc3Npb24pKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KFBhdHRlcm4gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUmVxdWlyZWRTdHJhdGVneS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUmVxdWlyZWRTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDllNGM3Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5leGNlcHRpb24uUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFJlcXVpcmVkU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k8UmVxdWlyZWQ+DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRmFjZXNCdW5kbGUgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCA9PSBudWxsIHx8IGNvbnZlcnRlZE9iamVjdC5lcXVhbHMoIiIpIHx8DQotICAgICAgICAgICAgICAgIChjb252ZXJ0ZWRPYmplY3QgaW5zdGFuY2VvZiBDb2xsZWN0aW9uICYmICgoQ29sbGVjdGlvbiljb252ZXJ0ZWRPYmplY3QpLmlzRW1wdHkoKSkgfHwNCi0gICAgICAgICAgICAgICAgKGNvbnZlcnRlZE9iamVjdCBpbnN0YW5jZW9mIE1hcCAmJiAoKE1hcCljb252ZXJ0ZWRPYmplY3QpLmlzRW1wdHkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNZXNzYWdlKG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoUmVxdWlyZWQuY2xhc3MpKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoUmVxdWlyZWQgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHN1cGVyLnJlc29sdmVNZXNzYWdlKGtleSk7DQotICAgICAgICBTdHJpbmcgbWFya2VyID0gQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVI7DQotDQotICAgICAgICBpZigobWFya2VyICsga2V5ICsgbWFya2VyKS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnVzZUZhY2VzQnVuZGxlID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIGUpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMudXNlRmFjZXNCdW5kbGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKGUuZ2V0RmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIGUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1NraXBWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1NraXBWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYzYmE0YS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFNraXBWYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgU3RyaW5nW10gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbnMgPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFNraXBWYWxpZGF0aW9uLmNsYXNzKS52YWx1ZSgpOw0KLQ0KLSAgICAgICAgRUxIZWxwZXIgZWxIZWxwZXIgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpOw0KLSAgICAgICAgZm9yKFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uIDogdmFsdWVCaW5kaW5nRXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhlbEhlbHBlci5nZXRWYWx1ZU9mRXhwcmVzc2lvbigNCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKSkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5zZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5TS0lQX1ZBTElEQVRJT04sIHRydWUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYmViMDkuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLQ0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I+W10gdmFsaWRhdG9yQ2xhc3NlcyA9DQotICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShWYWxpZGF0b3IuY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yIHZhbGlkYXRvcjsNCi0gICAgICAgIGZvciAoQ2xhc3MgdmFsaWRhdG9yQ2xhc3NOYW1lIDogdmFsaWRhdG9yQ2xhc3NlcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0b3IgPSAoamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcikgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzcyh2YWxpZGF0b3JDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lc3QodmFsaWRhdG9yQ2xhc3NOYW1lLmdldE5hbWUoKSArICIgbm90IGZvdW5kIik7DQotDQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmMTc5ZS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneS5BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjZXNFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIFRoaXMgcGhhc2UgbGlzdGVuZXIgcHJvY2Vzc2VzIGNyb3NzIHZhbGlkYXRpb24gYXMgc29vbiBhcyBpdCBmaW5kcyBhIHNwZWNpYWwgcmVxdWVzdCBzY29wZWQgc3RvcmFnZS48YnIvPg0KLSAqIFNvIGl0J3MgcG9zc2libGUgdG8gYWRkIGluZm9ybWF0aW9uIGR1cmluZyB0aGUgcHJvY2VzcyB2YWxpZGF0aW9uIHBoYXNlLiBBdCB0aGUgZW5kIG9mIHRoaXMgcGhhc2UgaXQgZ2V0cyBwcm9jZXNzZWQuDQotICogQWZ0ZXIgdGhhdCB0aGUgc3RvcmFnZSBnZXRzIHJlc2V0ZWQuPHAvPg0KLSAqIElmIHlvdSBwcm92aWRlIGEgY3VzdG9tIGV4dGVuc2lvbiBhbmQgeW91IGFkZCB0aGUgc2FtZSBzdG9yYWdlIHR5cGUgd2l0aGluIGEgZGlmZmVyZW50IHBoYXNlLA0KLSAqIGl0IGFsc28gZ2V0cyBwcm9jZXNzZWQgYXQgdGhlIGVuZCBvZiB0aGF0IHBoYXNlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lciBpbXBsZW1lbnRzIFBoYXNlTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MzMzNDA1ODk3NjM1NzQyNzMyTDsNCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UgPSBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCk7DQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICBmb3IgKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA6IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UuZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZighRXh0VmFsVXRpbHMuZXhlY3V0ZUdsb2JhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0Q29tcG9uZW50KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuY2xhc3MuZ2V0TmFtZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIC8vY2FsbCBpbml0LW1ldGhvZA0KLSAgICAgICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkgaW5zdGFuY2VvZiBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLmdldENsYXNzKCkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5pdENyb3NzVmFsaWRhdGlvbiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAgICAgICAgICogdmFsaWRhdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICovDQotICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5wcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKGVudHJ5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhZGRNZXNzYWdlID0gdHJ1ZTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpIGluc3RhbmNlb2YgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1lc3NhZ2UgPSAoQm9vbGVhbilSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5nZXRDbGFzcygpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuY2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0Q2xhc3MoKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmKGFkZE1lc3NhZ2UpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjZXNNZXNzYWdlICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudElkKGVudHJ5LmdldENsaWVudElkKCksIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvQmxvY2tzTmF2aWdhdGlvbkZvckNvbXBvbmVudElkKGVudHJ5LmdldENsaWVudElkKCksIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZmluYWxseQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5leGVjdXRlR2xvYmFsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldENvbXBvbmVudCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmNsYXNzLmdldE5hbWUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBmaW5hbGx5DQotICAgICAgICB7DQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMucmVzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc0luaXRpYWxpemVkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChFeHRWYWxDcm9zc1ZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmdldCgpLmRlYWN0aXZhdGVDcm9zc3ZhbGlkYXRpb24oKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEpzZlV0aWxzLmRlcmVnaXN0ZXJQaGFzZUxpc3RlbmVyKHRoaXMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpc0luaXRpYWxpemVkID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLkFOWV9QSEFTRTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICBpZiAodGhpcyA9PSBvKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0RlZmF1bHRFeHRWYWxDcm9zc1ZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvRGVmYXVsdEV4dFZhbENyb3NzVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmNjI0Zi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvRGVmYXVsdEV4dFZhbENyb3NzVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSByNA0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRFeHRWYWxDcm9zc1ZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uIGV4dGVuZHMgRXh0VmFsQ3Jvc3NWYWxpZGF0aW9uTW9kdWxlQ29uZmlndXJhdGlvbg0KLXsNCi0gICAgcHVibGljIGJvb2xlYW4gZGVhY3RpdmF0ZUNyb3NzdmFsaWRhdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04pOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9FeHRWYWxDcm9zc1ZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvRXh0VmFsQ3Jvc3NWYWxpZGF0aW9uTW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWE4MTUwLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9FeHRWYWxDcm9zc1ZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgcjQNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHRWYWxDcm9zc1ZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uIGltcGxlbWVudHMgRXh0VmFsTW9kdWxlQ29uZmlndXJhdGlvbg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgRXh0VmFsQ29udGV4dCBleHRWYWxDb250ZXh0ID0gbnVsbDsNCi0NCi0gICAgcHJvdGVjdGVkIEV4dFZhbENyb3NzVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24oKQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIERvbid0IGFjY2VzcyBFeHRWYWxDb250ZXh0IGR1cmluZyBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2xhc3MuICBPcGVuV2ViQmVhbnMgaW5pdGlhbGl6ZXMgYWxsIGNsYXNzZXMgZHVyaW5nDQotICAgICAqIHN0YXJ0dXAgb2YgdGhlIFdlYkNvbnRhaW5lci4gIGV4dFZhbENvbnRleHQgY29uc3RydWN0b3IgdHJpZXMgdG8gYWNjZXNzIFdlYi54bWwgcGFyYW1ldGVycyB0aHJvdWdoIEZhY2VzQ29udGV4dA0KLSAgICAgKiB3aGljaCBpc24ndCBhdmFpbGFibGUgeWV0Lg0KLSAgICAgKiBAcmV0dXJuIFRoZSBFeHRWYWxDb250ZXh0DQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBFeHRWYWxDb250ZXh0IGdldEV4dFZhbENvbnRleHQoKQ0KLSAgICB7DQotICAgICAgICBpZiAoZXh0VmFsQ29udGV4dCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGV4dFZhbENvbnRleHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBleHRWYWxDb250ZXh0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRXh0VmFsQ3Jvc3NWYWxpZGF0aW9uTW9kdWxlQ29uZmlndXJhdGlvbiBnZXQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXh0VmFsQ29udGV4dCgpLmdldE1vZHVsZUNvbmZpZ3VyYXRpb24oRXh0VmFsQ3Jvc3NWYWxpZGF0aW9uTW9kdWxlQ29uZmlndXJhdGlvbi5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHVzZShFeHRWYWxDcm9zc1ZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiBmb3JjZU92ZXJyaWRlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXh0VmFsQ29udGV4dCgpLmFkZE1vZHVsZUNvbmZpZ3VyYXRpb24oRXh0VmFsQ3Jvc3NWYWxpZGF0aW9uTW9kdWxlQ29uZmlndXJhdGlvbi5jbGFzcywgY29uZmlnLA0KLSAgICAgICAgICAgICAgICBmb3JjZU92ZXJyaWRlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiB3ZWIueG1sIGNvbmZpZw0KLSAgICAgKi8NCi0NCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZGVhY3RpdmF0ZUNyb3NzdmFsaWRhdGlvbigpOw0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NDA4ODAuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1pbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04iKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk5NTdiZS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIERhdGVJcw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWVPZigpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBvcHRpb25hbCBzZWN0aW9uDQotICAgICAqLw0KLQ0KLSAgICBEYXRlSXNUeXBlIHR5cGUoKSBkZWZhdWx0IERhdGVJc1R5cGUuc2FtZTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgIiI7DQotDQotICAgIE1lc3NhZ2VUYXJnZXQgdmFsaWRhdGlvbkVycm9yTXNnVGFyZ2V0KCkgZGVmYXVsdCBNZXNzYWdlVGFyZ2V0LnRhcmdldDsNCi0NCi0gICAgU3RyaW5nIG5vdEJlZm9yZUVycm9yTXNnS2V5KCkgZGVmYXVsdCAid3JvbmdfZGF0ZV9ub3RfYmVmb3JlIjsNCi0NCi0gICAgU3RyaW5nIG5vdEFmdGVyRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJ3cm9uZ19kYXRlX25vdF9hZnRlciI7DQotDQotICAgIFN0cmluZyBub3RFcXVhbEVycm9yTXNnS2V5KCkgZGVmYXVsdCAid3JvbmdfZGF0ZV9ub3RfZXF1YWwiOw0KLQ0KLSAgICBpbnQgZXJyb3JNZXNzYWdlRGF0ZVN0eWxlKCkgZGVmYXVsdCBEYXRlRm9ybWF0Lk1FRElVTTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJc1R5cGUuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJc1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1ZjQ4Mi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJiZWZvcmVPclNhbWUsIGFmdGVyT3JTYW1lIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgZW51bSBEYXRlSXNUeXBlDQotew0KLSAgICBiZWZvcmUsIGFmdGVyLCBzYW1lDQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0VtcHR5SWYuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0VtcHR5SWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFmMGZiNi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FbXB0eUlmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgUnVkeSBEZSBCdXNzY2hlcg0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIEVtcHR5SWYNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlT2YoKTsNCi0NCi0gICAgLyoNCi0gICAgICAqIG9wdGlvbmFsIHNlY3Rpb24NCi0gICAgICAqLw0KLQ0KLSAgICBFbXB0eUlmVHlwZSBpcygpIGRlZmF1bHQgRW1wdHlJZlR5cGUubm90X2VtcHR5Ow0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZmllbGRfbm90X2VtcHR5IjsNCi0NCi0gICAgTWVzc2FnZVRhcmdldCB2YWxpZGF0aW9uRXJyb3JNc2dUYXJnZXQoKSBkZWZhdWx0IE1lc3NhZ2VUYXJnZXQuc291cmNlOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRW1wdHlJZlR5cGUuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0VtcHR5SWZUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNTg4NmIuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRW1wdHlJZlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZW1wdHkgbWVhbnMgYW4gZW1wdHkgdGV4dC1maWVsZCAoPSBlbXB0eSBzdHJpbmcpIG9yIGNoZWNrYm94IChCb29sZWFuLkZBTFNFKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGVudW0gRW1wdHlJZlR5cGUNCi17DQotICAgIGVtcHR5LCBub3RfZW1wdHkNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJjOTZlYi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgRXF1YWxzDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZSgpOw0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkIjsNCi0NCi0gICAgTWVzc2FnZVRhcmdldCB2YWxpZGF0aW9uRXJyb3JNc2dUYXJnZXQoKSBkZWZhdWx0IE1lc3NhZ2VUYXJnZXQuYm90aDsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL01lc3NhZ2VUYXJnZXQuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL01lc3NhZ2VUYXJnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFkYWI1YS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9NZXNzYWdlVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSByNA0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBlbnVtIE1lc3NhZ2VUYXJnZXQNCi17DQotICAgIHNvdXJjZSwgdGFyZ2V0LCBib3RoDQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL05vdEVxdWFscy5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlM2Y4YjMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIE5vdEVxdWFscw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQiOw0KLQ0KLSAgICBNZXNzYWdlVGFyZ2V0IHZhbGlkYXRpb25FcnJvck1zZ1RhcmdldCgpIGRlZmF1bHQgTWVzc2FnZVRhcmdldC5ib3RoOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjQ2MTUyLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUmVxdWlyZWRJZg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWVPZigpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBvcHRpb25hbCBzZWN0aW9uDQotICAgICAqLw0KLQ0KLSAgICBSZXF1aXJlZElmVHlwZSBpcygpIGRlZmF1bHQgUmVxdWlyZWRJZlR5cGUubm90X2VtcHR5Ow0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZW1wdHlfZmllbGQiOw0KLQ0KLSAgICBNZXNzYWdlVGFyZ2V0IHZhbGlkYXRpb25FcnJvck1zZ1RhcmdldCgpIGRlZmF1bHQgTWVzc2FnZVRhcmdldC5zb3VyY2U7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmVHlwZS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JhODViZi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBlbXB0eSBtZWFucyBhbiBlbXB0eSB0ZXh0LWZpZWxkICg9IGVtcHR5IHN0cmluZykgb3IgY2hlY2tib3ggKEJvb2xlYW4uRkFMU0UpDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGVudW0gUmVxdWlyZWRJZlR5cGUNCi17DQotICAgIGVtcHR5LCBub3RfZW1wdHkNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNjA3NTkuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9SW5wdXQgaXMgZGlmZmVyZW50DQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1JbnB1dCBpcyBkaWZmZXJlbnQNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLQ0KLXdyb25nX2RhdGU9V3JvbmcgZGF0ZQ0KLXdyb25nX2RhdGVfZGV0YWlsPVdyb25nIGRhdGUNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmY5M2M0Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPVx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDVcdTA2MmVcdTA2MmFcdTA2NDRcdTA2NDENCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDVcdTA2MmVcdTA2MmFcdTA2NDRcdTA2NDENCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPVx1MDYzYVx1MDY0YVx1MDYzMSBcdTA2NDVcdTA2MzNcdTA2NDVcdTA2NDhcdTA2MmQgXHUwNjI4XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0IFx1MDY0NiBcdTA2NDFcdTA2MzMgXHUwNjQyXHUwNjRhXHUwNjQ1XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPVx1MDYzYVx1MDY0YVx1MDYzMSBcdTA2NDVcdTA2MzNcdTA2NDVcdTA2NDhcdTA2MmQgXHUwNjI4XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0ICBcdTA2NDZcdTA2NDFcdTA2MzMgXHUwNjQyXHUwNjRhXHUwNjQ1XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NA0KLQ0KLXdyb25nX2RhdGU9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDYyZVx1MDYyN1x1MDYzN1x1MDY0OVx1MDYyMQ0KLXdyb25nX2RhdGVfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2NDlcdTA2MjENCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzXHUwNjQ4IFx1MDY0NiBcdTA2MjhcdTA2MzlcdTA2MmYgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDMgXHUwNjQ4XHUwNjQ2IFx1MDYyOFx1MDYzOVx1MDYyZiB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDNcdTA2NDggXHUwNjQ2IFx1MDY0Mlx1MDYyOFx1MDY0NCB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzIFx1MDY0OFx1MDY0NiBcdTA2NDJcdTA2MjhcdTA2NDQgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0NFx1MDYyNyBcdTA2NGFcdTA2MzNcdTA2MjdcdTA2NDhcdTA2NDkgezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NDRcdTA2MjcgXHUwNjRhXHUwNjMzXHUwNjI3XHUwNjQ4XHUwNjQ5IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODU0ZWQyLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1lbCB2YWxvciBcdTAwZTkgZGlmZXJlbnQKLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9ZWwgdmFsb3IgXHUwMGU5IGRpZmVyZW50Ci0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9bm8gZXMgcGVybWV0IGVsIG1hdGVpeCB2YWxvcgotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9bm8gZXMgcGVybWV0IGVsIG1hdGVpeCB2YWxvcgotCi13cm9uZ19kYXRlPWRhdGEgZXJyXHUwMGYybmlhCi13cm9uZ19kYXRlX2RldGFpbD1kYXRhIGVyclx1MDBmMm5pYQotCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9bGEgZGF0YSBoYSBkZSBzZXIgcG9zdGVyaW9yIGEgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotCi13cm9uZ19kYXRlX25vdF9hZnRlcj1sYSBkYXRhIGhhIGRlIHNlciBhbnRlcmlvciBhIHswfQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotCi13cm9uZ19kYXRlX25vdF9lcXVhbD1sYSBkYXRhIG5vIFx1MDAwZTlzIGlndWFsIGEgezB9Ci13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9bGEgZGF0YSBubyBcdTAwMGU5cyBpZ3VhbCBhIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDg3MjM0Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUVpbmdhYmUgaXN0IHVudGVyc2NoaWVkbGljaA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9RWluZ2FiZSBpc3QgdW50ZXJzY2hpZWRsaWNoDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1EZXIgZ2xlaWNoZSBXZXJ0IGlzdCBuaWNodCBlcmxhdWJ0DQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9RGVyIGdsZWljaGUgV2VydCBpc3QgbmljaHQgZXJsYXVidA0KLQ0KLXdyb25nX2RhdGU9RGF0dW0gaW5rb3JyZWt0DQotd3JvbmdfZGF0ZV9kZXRhaWw9RGF0dW0gaW5rb3JyZWt0DQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhcyBEYXR1bSBtdXNzIG5hY2ggZGVtIHswfSBzZWluDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1EYXMgRGF0dW0gbXVzcyBuYWNoIGRlbSB7MH0gc2Vpbg0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPURhcyBEYXR1bSBtdXNzIHZvciBkZW0gezB9IHNlaW4NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9RGFzIERhdHVtIG11c3Mgdm9yIGRlbSB7MH0gc2Vpbg0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPURhcyBEYXR1bSBlbnRzcHJpY2h0IG5pY2h0IGRlbSB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGFzIERhdHVtIGVudHNwcmljaHQgbmljaHQgZGVtIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjYwNzU5Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUlucHV0IGlzIGRpZmZlcmVudA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9SW5wdXQgaXMgZGlmZmVyZW50DQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi0NCi13cm9uZ19kYXRlPVdyb25nIGRhdGUNCi13cm9uZ19kYXRlX2RldGFpbD1Xcm9uZyBkYXRlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhOTE3MC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1sYSBlbnRyYWRhIGVzIGRpZmVyZW50ZQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9bGEgZW50cmFkYSBlcyBkaWZlcmVudGUNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPW5vIHNlIHBlcm1pdGVuIGVudHJhZGFzIGlndWFsZXMNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1ubyBzZSBwZXJtaXRlbiBlbnRyYWRhcyBpZ3VhbGVzDQotDQotd3JvbmdfZGF0ZT1mZWNoYSBlcXVpdm9jYWRhDQotd3JvbmdfZGF0ZV9kZXRhaWw9ZmVjaGEgZXF1aXZvY2FkYQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGx1ZWdvIGRlIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBsdWVnbyBkZSB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGFudGVzIGRlIHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGFudGVzIGRlIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPWxhIGZlY2hhIG5vIGVzIGlndWFsIGEgezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPWxhIGZlY2hhIG5vIGVzIGlndWFsIGEgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcyBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZjAyMTguLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9TGVzIGNoYW1wcyBzb250IGRpZmYmZWFjdXRlO3JlbnRzDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1MZXMgY2hhbXBzIHNvbnQgZGlmZiZlYWN1dGU7cmVudHMNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPUxlcyBjaGFtcHMgZG9pdmVudCAmZWNpcmM7dHJlIGRpZmYmZWFjdXRlO3JlbnRzDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9TGVzIGNoYW1wcyBkb2l2ZW50ICZlY2lyYzt0cmUgZGlmZiZlYWN1dGU7cmVudHMNCi0NCi13cm9uZ19kYXRlPUxhIGRhdGUgZXN0IGluY29ycmVjdGUNCi13cm9uZ19kYXRlX2RldGFpbD1MYSBkYXRlIGVzdCBpbmNvcnJlY3RlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGFwciZlZ3JhdmU7cyB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGFwciZlZ3JhdmU7cyB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhdmFudCB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXZhbnQgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9TGEgZGF0ZSBuJ2VzdCBwYXMgJmVhY3V0ZTtnYWxlICZhZ3JhdmU7IHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1MYSBkYXRlIG4nZXN0IHBhcyAmZWFjdXRlO2dhbGUgJmFncmF2ZTsgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcyBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNDI4MDEuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPVZhbG9yaSBub24gdWd1YWxpCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUkgdmFsb3JpIGluc2VyaXRpIG5vbiBjb2luY2lkb25vCi0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9TG8gc3Rlc3NvIHZhbG9yZSBub24gJmVncmF2ZTsgcGVybWVzc28KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPUxvIHN0ZXNzbyB2YWxvcmUgbm9uICZlZ3JhdmU7IHBlcm1lc3NvCi0KLXdyb25nX2RhdGU9RGF0YSBlcnJhdGEKLXdyb25nX2RhdGVfZGV0YWlsPURhdGEgZXJyYXRhCi0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1MYSBkYXRhIGRldmUgZXNzZXJlIGRvcG8gZGkgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPUxhIGRhdGEgZGV2ZSBlc3NlcmUgZG9wbyBkaSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9TGEgZGF0YSBkZXZlIGVzc2VyZSBwcmltYSBkaSB7MH0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1MYSBkYXRhIGRldmUgZXNzZXJlIHByaW1hIGRpIHswfQotCi13cm9uZ19kYXRlX25vdF9lcXVhbD1MYSBkYXRhIG5vbiAmZWdyYXZlOyB1Z3VhbGUgYSB7MH0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1MYSBkYXRhIG5vbiAmZWdyYXZlOyB1Z3VhbGUgYSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFmNmE5ZC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1naXJpbGVuIGRlXHUwMTFmZXIgZmFya2xcdTAxMzENCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPWdpcmlsZW4gZGVcdTAxMWZlciBmYXJrbFx1MDEzMQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9YXluXHUwMTMxIGRlXHUwMTFmZXIgZ2lyaWxlbWV6DQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9YXluXHUwMTMxIGRlXHUwMTFmZXIgZ2lyaWxlbWV6DQotDQotd3JvbmdfZGF0ZT15YW5sXHUwMTMxXHUwMTVmIHRhcmloDQotd3JvbmdfZGF0ZV9kZXRhaWw9eWFubFx1MDEzMVx1MDE1ZiB0YXJpaA0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIHNvbnJhIG9sbWFsXHUwMTMxZFx1MDEzMXINCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gc29ucmEgb2xtYWxcdTAxMzFkXHUwMTMxcg0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gXHUwMGY2bmNlIG9sbWFsXHUwMTMxZFx1MDEzMXINCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBcdTAwZjZuY2Ugb2xtYWxcdTAxMzFkXHUwMTMxcg0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPXRhcmloIHswfSBkZVx1MDExZmVyaW5lIGVcdTAxNWZpdCBkZVx1MDExZmlsDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5lIGVcdTAxNWZpdCBkZVx1MDExZmlsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDc2NTllLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLSAgICAgICAgZXh0ZW5kcw0KLSAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBiYXNlTmFtZSA9IG51bGw7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYgKGJhc2VOYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZU5hbWUgPSBzdXBlci5nZXRCYXNlTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGJhc2VOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9wYXJhbWV0ZXIvQ2FzZUluc2Vuc2l0aXZlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcGFyYW1ldGVyL0Nhc2VJbnNlbnNpdGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODEwOTk2Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9wYXJhbWV0ZXIvQ2FzZUluc2Vuc2l0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLQ0KLS8qKg0KLSAqIEFsbG93cyB0byBwZXJmb3JtIGEgY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29uIG9mIFN0cmluZ3MgaW4gRXF1YWxzIGFuZA0KLSAqIE5vdEVxdWFscy4gU3BlY2lmeSBpdCBhcyBhIHBhcmFtZXRlci4NCi0gKg0KLSAqIEBhdXRob3IgUnVkeSBEZSBCdXNzY2hlcg0KLSAqIEBzaW5jZSB4LnguNA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgQ2FzZUluc2Vuc2l0aXZlIGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcg0KLXsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlY29yZGVyL0Nyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcmVjb3JkZXIvQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQzZjMwZS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcmVjb3JkZXIvQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwucmVjb3JkZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkVMSGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlci5Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIgaW1wbGVtZW50cyBQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyDQotew0KLSAgICBwcml2YXRlIEVMSGVscGVyIGVsSGVscGVyOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZWNvcmRVc2VySW5wdXQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgaWYgKCEodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICAvL3RvIHN1cHBvcnQgbG9jYWwgY3Jvc3MtdmFsaWRhdGlvbiAod2l0aGluIHRoZSBzYW1lIGVudGl0eSkNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgPSBDcm9zc1ZhbGlkYXRpb25VdGlscw0KLSAgICAgICAgICAgIC5nZXRPckluaXRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UoKTsNCi0NCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5Ow0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IGdldEVMSGVscGVyKCkuZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgaWYocHJvcGVydHlEZXRhaWxzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBlbnRyeSA9IG5ldyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSgpOw0KLSAgICAgICAgZW50cnkuc2V0QmVhbihwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpKTsNCi0gICAgICAgIGVudHJ5LnNldENvbnZlcnRlZFZhbHVlKHZhbHVlKTsNCi0gICAgICAgIGVudHJ5LnNldENvbXBvbmVudCh1aUNvbXBvbmVudCk7DQotICAgICAgICBlbnRyeS5zZXRDbGllbnRJZCh1aUNvbXBvbmVudC5nZXRDbGllbnRJZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpKTsNCi0NCi0gICAgICAgIFN0cmluZyBrZXkgPSBwcm9wZXJ0eURldGFpbHMuZ2V0S2V5KCk7DQotDQotICAgICAgICAvL2ZvciBsb2NhbCBjcm9zcy12YWxpZGF0aW9uDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNvbnRhaW5zRW50cnkoa2V5KSAmJg0KLSAgICAgICAgICAgIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5nZXRFbnRyeShrZXkpLmdldEJlYW4oKSAhPSBudWxsICYmDQotICAgICAgICAgICAgIXByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5nZXRFbnRyeShrZXkpLmdldEJlYW4oKS5lcXVhbHMoZW50cnkuZ2V0QmVhbigpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2ZvciB0aGUgdmFsaWRhdGlvbiB3aXRoaW4gYSBjb21wbGV4IGNvbXBvbmVudCBlLmcuIGEgdGFibGUNCi0gICAgICAgICAgICAvL2Rvbid0IG92ZXJyaWRlIGV4aXN0aW5nIGV4cHJlc3Npb24gKHN0eWxlOiAje2VudHJ5LnByb3BlcnR5fSkgLSBtYWtlIGEgc3BlY2lhbCBtYXBwaW5nDQotDQotICAgICAgICAgICAgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4gZnVydGhlckVudHJpZXMgPQ0KLSAgICAgICAgICAgICAgICBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkoa2V5KS5nZXRGdXJ0aGVyRW50cmllcygpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmdXJ0aGVyRW50cmllcyA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZnVydGhlckVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5PigpOw0KLQ0KLSAgICAgICAgICAgICAgICBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkoa2V5KS5zZXRGdXJ0aGVyRW50cmllcyhmdXJ0aGVyRW50cmllcyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZ1cnRoZXJFbnRyaWVzLmFkZChlbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9mb3Igbm9ybWFsIHZhbGlkYXRpb24NCi0gICAgICAgICAgICBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2Uuc2V0RW50cnkoa2V5LCBlbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEVMSGVscGVyIGdldEVMSGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5lbEhlbHBlciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuZWxIZWxwZXIgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRoaXMuZWxIZWxwZXI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDlmYWQ2Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIG5vcm1hbGx5IGl0IHNob3VsZCBiZSBpbiB0aGUgc3RvcmFnZSBwYWNrYWdlIC0gZHVlIHRvIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaXQgaXNuJ3QgdGhlIGNhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBhZGQoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5KTsNCi0NCi0gICAgTGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+IGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOWUxZTcuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5LkNyb3NzVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi0NCi0vKioNCi0gKiBub3JtYWxseSBpdCBzaG91bGQgYmUgaW4gdGhlIHN0b3JhZ2UgcGFja2FnZSAtIGR1ZSB0byBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGl0IGlzbid0IHRoZSBjYXNlDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeQ0KLXsNCi0gICAgcHJpdmF0ZSBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnk7DQotICAgIC8vZm9yIGNvbXBsZXggY29tcG9uZW50cyAoZS5nLiBhIHRhYmxlKSBzdG9yZXMgdGhlIG9iamVjdCBvZiBlbnRyeSAoI3tlbnRyeS5wcm9wZXJ0eX0pDQotICAgIHByaXZhdGUgVUlDb21wb25lbnQgY29tcG9uZW50Ow0KLSAgICBwcml2YXRlIE9iamVjdCBjb252ZXJ0ZWRPYmplY3Q7DQotICAgIHByaXZhdGUgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAvL2p1c3QgZm9yIGlucHV0IGNvbXBvbmVudHMgd2l0aGluIGNvbXBsZXggY29tcG9uZW50cyBlLmcuIGRhdGFUYWJsZSwuLi4NCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50SWQ7DQotDQotICAgIHB1YmxpYyBNZXRhRGF0YUVudHJ5IGdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFFbnRyeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YUVudHJ5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YUVudHJ5ID0gbWV0YURhdGFFbnRyeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVUlDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnQoVUlDb21wb25lbnQgY29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldENvbnZlcnRlZE9iamVjdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkT2JqZWN0KE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29udmVydGVkT2JqZWN0ID0gY29udmVydGVkT2JqZWN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25TdHJhdGVneShDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsaWRhdGlvblN0cmF0ZWd5ID0gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY2xpZW50SWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50SWQoU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNsaWVudElkID0gY2xpZW50SWQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMTBhM2IuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGltcGxlbWVudHMgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMgPQ0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZChDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMuYWRkKGVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+IGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcykNCi0gICAgew0KLSAgICAgICAgdGhpcy5jcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNGE1ZmQuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIGNyb3NzLXZhbGlkYXRpb24gZW50cmllcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlcg0KLSAgICBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlPg0KLXsNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcga2V5ID0gQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCk7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICAvL2ZvciBiZXR0ZXIgYmFja3dhcmQgY29tcGF0aWJpbGl0eQ0KLSAgICAgICAgcmV0dXJuIGtleTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOGUxODcuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSBpbXBsZW1lbnRzIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4gcHJvY2Vzc2VkSW5mb3JtYXRpb25NYXAgPQ0KLSAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW50cnkoU3RyaW5nIGtleSwgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvY2Vzc2VkSW5mb3JtYXRpb25NYXAucHV0KGtleSwgZW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zRW50cnkoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uTWFwLmNvbnRhaW5zS2V5KGtleSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IGdldEVudHJ5KFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9jZXNzZWRJbmZvcm1hdGlvbk1hcC5nZXQoa2V5KTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU5ZmI1MS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgcHJvY2Vzc2VkIGluZm9ybWF0aW9uIGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlcg0KLSAgICBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlPg0KLXsNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcga2V5ID0gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuY2xhc3MuZ2V0TmFtZSgpOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgLy9mb3IgYmV0dGVyIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkNCi0gICAgICAgIHJldHVybiBrZXk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBiMTU2ZS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlDQotew0KLSAgICB2b2lkIHNldEVudHJ5KFN0cmluZyBrZXksIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5KTsNCi0NCi0gICAgYm9vbGVhbiBjb250YWluc0VudHJ5KFN0cmluZyBrZXkpOw0KLQ0KLSAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSBnZXRFbnRyeShTdHJpbmcga2V5KTsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZjc4OWMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogSW4gb3JkZXIgdG8gYnVpbGQgdXAgYSBtYXBwaW5nIHdoaWNoIGlzIHVzZWQgZm9yIGNyb3NzLXZhbGlkYXRpb24uCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeQotewotICAgIHByaXZhdGUgT2JqZWN0IGJlYW47Ci0gICAgcHJpdmF0ZSBPYmplY3QgY29udmVydGVkVmFsdWU7Ci0gICAgcHJpdmF0ZSBVSUNvbXBvbmVudCBjb21wb25lbnQ7Ci0gICAgLy9mb3IgY29tcGxleCBjb21wb25lbnRzIChlLmcuIGEgdGFibGUgdGhlcmUgYXJlIG11bHRpcGxlIGVudHJpZXMgd2l0aAotICAgIC8vdGhlIHNhbWUga2V5IChoZXJlIHRoZSBlbCBleHByZXNzaW9uICN7ZW50cnkucHJvcGVydHl9KQotICAgIC8vaG93ZXZlciwgZG9uJ3Qgb3ZlcnJpZGUgdGhlIHByZXZpb3VzIGVudHJ5IC0gdGhleSBhcm4ndCB0aGUgc2FtZTsKLSAgICBwcml2YXRlIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk+IGZ1cnRoZXJFbnRyaWVzOwotICAgIC8vanVzdCBmb3IgaW5wdXQgY29tcG9uZW50cyB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzIGUuZy4gZGF0YVRhYmxlLC4uLgotICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudElkOwotCi0gICAgLyoKLSAgICAgKiBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmVhbihPYmplY3QgYmVhbikKLSAgICB7Ci0gICAgICAgIHRoaXMuYmVhbiA9IGJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkVmFsdWUoT2JqZWN0IGNvbnZlcnRlZFZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy5jb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBVSUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnQoVUlDb21wb25lbnQgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gY2xpZW50SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50SWQoU3RyaW5nIGNsaWVudElkKQotICAgIHsKLSAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5PiBnZXRGdXJ0aGVyRW50cmllcygpCi0gICAgewotICAgICAgICByZXR1cm4gZnVydGhlckVudHJpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RnVydGhlckVudHJpZXMoTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4gZnVydGhlckVudHJpZXMpCi0gICAgewotICAgICAgICB0aGlzLmZ1cnRoZXJFbnRyaWVzID0gZnVydGhlckVudHJpZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvbWFwcGVyL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlYmYzYi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigyMDApDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoa2V5KSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL21hcHBlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODc1MzAzLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL21hcHBlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoa2V5KSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q29tcGFyZVN0cmF0ZWd5LmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJhOGNjNy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5NZXNzYWdlVGFyZ2V0Ow0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uTWVzc2FnZVRhcmdldC5zb3VyY2U7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5NZXNzYWdlVGFyZ2V0LmJvdGg7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5NZXNzYWdlVGFyZ2V0LnRhcmdldDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneTxBIGV4dGVuZHMgQW5ub3RhdGlvbj4gZXh0ZW5kcyBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIExpc3Q8UmVmZXJlbmNpbmdTdHJhdGVneT4gcmVmZXJlbmNpbmdTdHJhdGVnaWVzOw0KLSAgICBwcm90ZWN0ZWQgTWFwPE9iamVjdCwgT2JqZWN0PiB2aW9sYXRpb25SZXN1bHRTdG9yYWdlID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIGluaXRSZWZlcmVuY2luZ1N0cmF0ZWdpZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UmVmZXJlbmNpbmdTdHJhdGVnaWVzKCkNCi0gICAgew0KLSAgICAgICAgaWYgKHJlZmVyZW5jaW5nU3RyYXRlZ2llcyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcyA9IG5ldyBBcnJheUxpc3Q8UmVmZXJlbmNpbmdTdHJhdGVneT4oKTsNCi0NCi0gICAgICAgICAgICBTdHJpbmcgY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneUNsYXNzTmFtZSA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQkFTRV9QQUNLQUdFKSArICJSZWZlcmVuY2luZ1N0cmF0ZWd5IjsNCi0NCi0gICAgICAgICAgICBSZWZlcmVuY2luZ1N0cmF0ZWd5IGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kgPSAoUmVmZXJlbmNpbmdTdHJhdGVneSkgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneUNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IEVMQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgICAgIC8vcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgQWxpYXNDb21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgTG9jYWxDb21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9pbml0Q3Jvc3NWYWxpZGF0aW9uIGlzIGRvbmUgaW4gdGhlIENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXINCi0NCi0gICAgICAgIFN0cmluZ1tdIHZhbGlkYXRpb25UYXJnZXRzID0gZ2V0VmFsaWRhdGlvblRhcmdldHMoKEEpDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQgOiB2YWxpZGF0aW9uVGFyZ2V0cykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0ID0gdmFsaWRhdGlvblRhcmdldC50cmltKCk7DQotDQotICAgICAgICAgICAgLy9zZWxlY3QgdmFsaWRhdGlvbiBtZXRob2QNCi0gICAgICAgICAgICB0cnlUb1ZhbGlkYXRlKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwgdmFsaWRhdGlvblRhcmdldCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIHRyeVRvVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQpDQotICAgIHsNCi0gICAgICAgIGZvciAoUmVmZXJlbmNpbmdTdHJhdGVneSByZWZlcmVuY2luZ1N0cmF0ZWd5IDogcmVmZXJlbmNpbmdTdHJhdGVnaWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChyZWZlcmVuY2luZ1N0cmF0ZWd5LmV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsIHZhbGlkYXRpb25UYXJnZXQsIHRoaXMpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVGhyb3dhYmxlSW5zdGFuY2VOZXZlclRocm93biJ9KQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UsDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZUYXJnZXQpDQotICAgIHsNCi0gICAgICAgIGlmICghaGFuZGxlVGFyZ2V0VmlvbGF0aW9uKGVudHJ5T2ZTb3VyY2UsIGVudHJ5T2ZUYXJnZXQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vbm8gdGFyZ2V0IC0gYmVjYXVzZSB0aGVyZSBpcyBubyB0YXJnZXQgY29tcG9uZW50IC0gdmFsdWUgd2FzIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBtb2RlbA0KLSAgICAgICAgICAgIGlmKGVudHJ5T2ZUYXJnZXQgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NUYXJnZXRDb21wb25lbnRBc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGVudHJ5T2ZTb3VyY2UpOw0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vZ2V0IHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSB0YXJnZXQgY29tcG9uZW50DQotICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldEVycm9yTWVzc2FnZVN1bW1hcnkoKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSwgdHJ1ZSk7DQotICAgICAgICBTdHJpbmcgZGV0YWlscyA9IGdldEVycm9yTWVzc2FnZURldGFpbCgoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpLCB0cnVlKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGlvbiB0YXJnZXQgaXNuJ3QgYm91bmQgdG8gYSBjb21wb25lbnQgd2l0aGluZyB0aGUgY3VycmVudCBwYWdlIA0KLSAgICAgICAgLy8oc2VlIHZhbGlkYXRlRm91bmRFbnRyeSwgdHJ5VG9WYWxpZGF0ZUxvY2FsbHkgYW5kIHRyeVRvVmFsaWRhdGVCaW5kaW5nT25seSkNCi0gICAgICAgIGlmIChlbnRyeU9mVGFyZ2V0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZW50cnlPZlRhcmdldCA9IGVudHJ5T2ZTb3VyY2U7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZTsNCi0gICAgICAgIGlmIChlbnRyeU9mVGFyZ2V0LmdldE1ldGFEYXRhRW50cnkoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1lc3NhZ2UgPSBnZXRUYXJnZXRDb21wb25lbnRFcnJvck1lc3NhZ2UoKEEpZW50cnlPZlRhcmdldC5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9UT0RPIGRvY3VtZW50IHBvc3NpYmxlIHNpZGUgZWZmZWN0cw0KLSAgICAgICAgICAgIC8vZHVlIHRvIGEgbWlzc2luZyB0YXJnZXQgYW5ub3RhdGlvbiAoc2VlOiB0cnlUb1ZhbGlkYXRlTG9jYWxseSkNCi0gICAgICAgICAgICBtZXNzYWdlID0gZ2V0VGFyZ2V0Q29tcG9uZW50RXJyb3JNZXNzYWdlKChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCksIHN1bW1hcnksIGRldGFpbHMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKChtZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsIHx8IG1lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkgJiYNCi0gICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldENsaWVudElkKCkgIT0gbnVsbCAmJiAhZW50cnlPZlNvdXJjZS5nZXRDbGllbnRJZCgpLmVxdWFscyhlbnRyeU9mVGFyZ2V0LmdldENsaWVudElkKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24gPSBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG1lc3NhZ2UpOw0KLQ0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNTb3VyY2VNZXRhRGF0YVVzZWQgPSBmYWxzZTsNCi0NCi0gICAgICAgICAgICBpZihlbnRyeU9mVGFyZ2V0LmdldE1ldGFEYXRhRW50cnkoKSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJlcGFyZVRhcmdldE1ldGFEYXRhRm9yU2V2ZXJpdHlBd2FyZUludGVyY2VwdGlvbihlbnRyeU9mU291cmNlLCBlbnRyeU9mVGFyZ2V0KTsNCi0gICAgICAgICAgICAgICAgaXNTb3VyY2VNZXRhRGF0YVVzZWQgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBpZihFeHRWYWxVdGlscy5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5T2ZUYXJnZXQuZ2V0Q29tcG9uZW50KCksIGVudHJ5T2ZUYXJnZXQuZ2V0TWV0YURhdGFFbnRyeSgpLA0KLSAgICAgICAgICAgICAgICAgICAgZW50cnlPZlRhcmdldC5nZXRDb252ZXJ0ZWRPYmplY3QoKSwgdmFsaWRhdG9yRXhjZXB0aW9uLCB0aGlzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudElkKGVudHJ5T2ZUYXJnZXQuZ2V0Q2xpZW50SWQoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb252ZXJ0RmFjZXNNZXNzYWdlKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZihpc1NvdXJjZU1ldGFEYXRhVXNlZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc2V0VGFyZ2V0TWV0YURhdGEoZW50cnlPZlRhcmdldCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcmVwYXJlVGFyZ2V0TWV0YURhdGFGb3JTZXZlcml0eUF3YXJlSW50ZXJjZXB0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlLCBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlRhcmdldCkNCi0gICAgew0KLSAgICAgICAgZW50cnlPZlRhcmdldC5zZXRNZXRhRGF0YUVudHJ5KGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRUYXJnZXRNZXRhRGF0YShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlRhcmdldCkNCi0gICAgew0KLSAgICAgICAgZW50cnlPZlRhcmdldC5zZXRNZXRhRGF0YUVudHJ5KG51bGwpOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVGhyb3dhYmxlSW5zdGFuY2VOZXZlclRocm93biJ9KQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1RhcmdldENvbXBvbmVudEFzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UpDQotICAgIHsNCi0gICAgICAgIC8vZ2V0IHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgICAgU3RyaW5nIHN1bW1hcnkgPSBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeSgoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpKTsNCi0gICAgICAgIFN0cmluZyBkZXRhaWxzID0gZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbCgoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlID0gZ2V0U291cmNlQ29tcG9uZW50RXJyb3JNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICAoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpLCBzdW1tYXJ5LCBkZXRhaWxzKTsNCi0NCi0gICAgICAgIGlmIChtZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsIHx8IG1lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8NCi0gICAgICAgICAgICBpZihFeHRWYWxVdGlscy5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycyhlbnRyeU9mU291cmNlLmdldENvbXBvbmVudCgpLA0KLSAgICAgICAgICAgICAgICAgICAgZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCksDQotICAgICAgICAgICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihtZXNzYWdlKSwNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudChlbnRyeU9mU291cmNlLmdldENvbXBvbmVudCgpLCBtZXNzYWdlLCBudWxsKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9UT0RPIGxvZ2dpbmcNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UpDQotICAgIHsNCi0gICAgICAgIGlmIChoYW5kbGVTb3VyY2VWaW9sYXRpb24oZW50cnlPZlNvdXJjZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9nZXQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAgICAgICAgU3RyaW5nIHN1bW1hcnkgPSBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCksIGZhbHNlKTsNCi0gICAgICAgICAgICBTdHJpbmcgZGV0YWlscyA9IGdldEVycm9yTWVzc2FnZURldGFpbCgoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpLCBmYWxzZSk7DQotDQotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIG1lc3NhZ2UgPSBnZXRTb3VyY2VDb21wb25lbnRFcnJvck1lc3NhZ2UoDQotICAgICAgICAgICAgICAgIChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCksIHN1bW1hcnksIGRldGFpbHMpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsIHx8IG1lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vVE9ETw0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50KGVudHJ5T2ZTb3VyY2UuZ2V0Q29tcG9uZW50KCksIG1lc3NhZ2UsIG51bGwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vanVzdCB0aHJvdyBhIG5ldyBtZXNzYWdlIC0gdGhlIGVycm9yIG1lc3NhZ2UgaXMgYXQgdGhlIHRhcmdldA0KLSAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudCgNCi0gICAgICAgICAgICAgICAgZW50cnlPZlNvdXJjZS5nZXRDb21wb25lbnQoKSwgbmV3IEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsIG51bGwsIG51bGwpLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgRmFjZXNNZXNzYWdlIGdldFNvdXJjZUNvbXBvbmVudEVycm9yTWVzc2FnZShBIGFubm90YXRpb24sIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEZhY2VzTWVzc2FnZSBnZXRUYXJnZXRDb21wb25lbnRFcnJvck1lc3NhZ2UoQSBmb3VuZEFubm90YXRpb24sIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KEEgYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHJlc29sdmVNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKEEgYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgU3RyaW5nIGtleSA9IGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgICAgICAgICAgcmV0dXJuIChrZXkgIT0gbnVsbCkgPyByZXNvbHZlTWVzc2FnZShrZXkgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCkgOiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuV0FSTklORywgImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KChBKWFubm90YXRpb24sIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVUYXJnZXRWaW9sYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UsDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZUYXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBlbnRyeU9mVGFyZ2V0ICE9IG51bGwgJiYgZW50cnlPZlRhcmdldC5nZXRDb21wb25lbnQoKSAhPSBudWxsOw0KLSAgICB9DQotDQotICAgIEBEZXByZWNhdGVkDQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVNvdXJjZVZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHVzZVNvdXJjZUNvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKGVudHJ5T2ZTb3VyY2UpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHVzZVNvdXJjZUNvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlKQ0KLSAgICB7DQotICAgICAgICBNZXNzYWdlVGFyZ2V0IG1lc3NhZ2VUYXJnZXQgPSBnZXRNZXNzYWdlVGFyZ2V0KChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCkpOw0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VUYXJnZXQuZXF1YWxzKHNvdXJjZSkgfHwgbWVzc2FnZVRhcmdldC5lcXVhbHMoYm90aCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UpDQotICAgIHsNCi0gICAgICAgIE1lc3NhZ2VUYXJnZXQgbWVzc2FnZVRhcmdldCA9IGdldE1lc3NhZ2VUYXJnZXQoKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSk7DQotICAgICAgICByZXR1cm4gbWVzc2FnZVRhcmdldC5lcXVhbHModGFyZ2V0KSB8fCBtZXNzYWdlVGFyZ2V0LmVxdWFscyhib3RoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTWVzc2FnZVRhcmdldCBnZXRNZXNzYWdlVGFyZ2V0KEEgYW5ub3RhdGlvbik7DQotDQotICAgIC8qDQotICAgICAqIG5vIHRhcmdldCBjb21wb25lbnQgKHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbW9kZWwpIC0+IGdldCByZXZlcnNlIG1lc3NhZ2UgZm9yIHNvdXJjZSBjb21wb25lbnQNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkoQSBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICAvL2lmIHRoZSBtZXNzYWdlIGlzIG5ldXRyYWwNCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24sIHRydWUpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIG5vIHRhcmdldCBjb21wb25lbnQgKHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbW9kZWwpIC0+IGdldCByZXZlcnNlIG1lc3NhZ2UgZm9yIHNvdXJjZSBjb21wb25lbnQNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbChBIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIC8vaWYgdGhlIG1lc3NhZ2UgaXMgbmV1dHJhbA0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uLCB0cnVlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBhYnN0cmFjdCBtZXRob2RzDQotICAgICAqLw0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBpbXBsZW1lbnRzIHRoZSBzcGVjaWZpYyB2YWxpZGF0aW9uIGxvZ2ljDQotICAgICAqLw0KLQ0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEEgYW5ub3RhdGlvbik7DQotDQotICAgIC8qDQotICAgICAqIHJldHVybnMgdGhlIHJlZmVyZW5jZWQgdmFsaWRhdGlvbiB0YXJnZXRzIG9mIHRoZSBhbm5vdGF0aW9uDQotICAgICAqIGUuZy4gQERhdGVJcyh0eXBlID0gRGF0ZUlzVHlwZS5iZWZvcmUsIHZhbHVlID0gImZpbmFsRXhhbSIpDQotICAgICAqIC0+IG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IHdpdGggb25lIHZhbHVlICgiZmluYWxFeGFtIikNCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBIGFubm90YXRpb24pOw0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2MDhkNi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneTxBIGV4dGVuZHMgQW5ub3RhdGlvbj4gZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k8QT4gaW1wbGVtZW50cyBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgLy9pbml0IGNyb3NzLXZhbGlkYXRpb24NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA9DQotICAgICAgICAgICAgZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkuYWRkKGVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA9IG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoKTsNCi0NCi0gICAgICAgIGVudHJ5LnNldE1ldGFEYXRhRW50cnkobWV0YURhdGFFbnRyeSk7DQotICAgICAgICBlbnRyeS5zZXRDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgZW50cnkuc2V0Q2xpZW50SWQodWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIGVudHJ5LnNldFZhbGlkYXRpb25TdHJhdGVneSh0aGlzKTsNCi0NCi0gICAgICAgIHJldHVybiBlbnRyeTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgYXZhaWxhYmxlIGZvciBjcm9zcyB2YWxpZGF0aW9uIC0gdXNlIHByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IGF2YWlsYWJsZSBmb3IgY3Jvc3MgdmFsaWRhdGlvbiIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0VmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICAvL25vdCBhdmFpbGFibGUgZm9yIGNyb3NzIHZhbGlkYXRpb24gLSB1c2UgaW5pdENyb3NzVmFsaWRhdGlvbg0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDcm9zc1ZhbGlkYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICAvL292ZXJyaWRlIGlmIG5lZWRlZA0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLCB2YWxpZGF0b3JFeGNlcHRpb24sIHRoaXMpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25IZWxwZXIuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdkNDc2ZS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5LA0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNNb2RlbEF3YXJlVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGNvbXBhcmVTdHJhdGVneS5pc1Zpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9wcm9jZXNzIGFmdGVyIHZpb2xhdGlvbg0KLSAgICAgICAgICAgIC8vanVzdCBhZGQgbWVzc2FnZXMNCi0gICAgICAgICAgICBpZighaXNNb2RlbEF3YXJlVmFsaWRhdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NUYXJnZXRBZnRlckNyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1RhcmdldEFmdGVyTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vdGhvdyBleGNlcHRpb24NCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzVGFyZ2V0QWZ0ZXJDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5ID0gbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgpOw0KLQ0KLSAgICAgICAgaWYgKGNvbXBhcmVTdHJhdGVneS51c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb21wb25lbnQodmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q2xpZW50SWQodmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENsaWVudElkKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb21wb25lbnQoc291cmNlQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q2xpZW50SWQoc291cmNlQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENsaWVudElkKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbnZlcnRlZE9iamVjdCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSk7DQotICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0VmFsaWRhdGlvblN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSk7DQotDQotICAgICAgICAvL2FkZCBtZXNzYWdlDQotICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICBzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzVGFyZ2V0QWZ0ZXJNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICAvL25vIHRhcmdldCAtIGJlY2F1c2UgdGhlcmUgaXMgbm8gdGFyZ2V0IGNvbXBvbmVudCAtIHZhbHVlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbW9kZWwNCi0gICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBudWxsKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzI3ZGE1Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICB2b2lkIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpDQotICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0RhdGVJc1N0cmF0ZWd5LmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRGF0ZUlzU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA3NGQ5ZC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRGF0ZUlzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRGF0ZUlzVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uTWVzc2FnZVRhcmdldDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0Ow0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERhdGVJc1N0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3k8RGF0ZUlzPg0KLXsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PX0VBUkxZID0gImVhcmx5IjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PX0xBVEUgPSAibGF0ZSI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9FUVVBTF9EQVRFX1RJTUUgPSAibm90IGVxdWFsIjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWSA9ICJyZXN1bHQiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QQVJFRF9WQUxVRV9LRVkgPSAidGFyZ2V0IHZhbHVlIjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVWRVJTRV9DT01QQVJFRF9WQUxVRV9LRVkgPSAicmV2ZXJzZSB0YXJnZXQgdmFsdWUiOw0KLQ0KLSAgICBwcm90ZWN0ZWQgTWVzc2FnZVRhcmdldCBnZXRNZXNzYWdlVGFyZ2V0KERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dUYXJnZXQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHZpb2xhdGlvbkZvdW5kOw0KLQ0KLSAgICAgICAgaWYgKGFubm90YXRpb24udHlwZSgpLmVxdWFscyhEYXRlSXNUeXBlLnNhbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsICYmICFvYmplY3QxLmVxdWFscyhvYmplY3QyKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFU1VMVF9LRVksIE5PVF9FUVVBTF9EQVRFX1RJTUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24udHlwZSgpLmVxdWFscyhEYXRlSXNUeXBlLmJlZm9yZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSBvYmplY3QxICE9IG51bGwgJiYgb2JqZWN0MiAhPSBudWxsICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICghbmV3IERhdGUoKChEYXRlKSBvYmplY3QxKS5nZXRUaW1lKCkpLmJlZm9yZSgoRGF0ZSkgb2JqZWN0MikgfHwgb2JqZWN0MS5lcXVhbHMob2JqZWN0MikpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVTVUxUX0tFWSwgVE9PX0xBVEUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IG9iamVjdDEgIT0gbnVsbCAmJiBvYmplY3QyICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFuZXcgRGF0ZSgoKERhdGUpIG9iamVjdDEpLmdldFRpbWUoKSkuYWZ0ZXIoKERhdGUpIG9iamVjdDIpIHx8IG9iamVjdDEuZXF1YWxzKG9iamVjdDIpKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFU1VMVF9LRVksIFRPT19FQVJMWSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoQ09NUEFSRURfVkFMVUVfS0VZLCBvYmplY3QxKTsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFVkVSU0VfQ09NUEFSRURfVkFMVUVfS0VZLCBvYmplY3QyKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB2aW9sYXRpb25Gb3VuZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbHVlT2YoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBwcm90ZWN0ZWQNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KERhdGVJcyBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZykgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLmdldChSRVNVTFRfS0VZKTsNCi0NCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gcmV2ZXJzZVJlc3VsdChyZXN1bHQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKFRPT19FQVJMWS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0Tm90QWZ0ZXJFcnJvck1zZ0tleShhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKFRPT19MQVRFLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROb3RCZWZvcmVFcnJvck1zZ0tleShhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0Tm90RXF1YWxFcnJvck1zZ0tleShhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyByZXZlcnNlUmVzdWx0KFN0cmluZyByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIGlmIChUT09fRUFSTFkuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIFRPT19MQVRFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBUT09fRUFSTFk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShEYXRlSXMgYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCksIGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoRGF0ZUlzIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgICAgICB9DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLldBUk5JTkcsICJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBmYWxzZSksIGFubm90YXRpb24sIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsKERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBmYWxzZSkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGFubm90YXRpb24sIGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLldBUk5JTkcsICJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pDQotICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGtleSwgRGF0ZUlzIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gcmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0NCi0gICAgICAgIERhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKGFubm90YXRpb24uZXJyb3JNZXNzYWdlRGF0ZVN0eWxlKCksDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlc3VsdDsNCi0NCi0gICAgICAgIGlmKGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IG1lc3NhZ2UucmVwbGFjZSgiezB9IiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0LmZvcm1hdCgoRGF0ZSkgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLmdldChDT01QQVJFRF9WQUxVRV9LRVkpKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQuZm9ybWF0KChEYXRlKSB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UuZ2V0KFJFVkVSU0VfQ09NUEFSRURfVkFMVUVfS0VZKSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9yZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBvdGhlciBjb21wb25lbnQNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogcHJpdmF0ZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90QWZ0ZXJFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RBZnRlckVycm9yTXNnS2V5KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXROb3RCZWZvcmVFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RCZWZvcmVFcnJvck1zZ0tleSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90RXF1YWxFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RFcXVhbEVycm9yTXNnS2V5KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRUxDb21wYXJlU3RyYXRlZ3kuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTY5ODcwLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7DQotDQotLyoqDQotICogcmVmZXJlbmNpbmcgdmFsaWRhdGlvbiB0YXJnZXRzIC0gcG9zc2libGUgZm9ybWF0czoNCi0gKiAiI3tbYmVhbl9uYW1lXS5bcHJvcGVydHlfbmFtZV19IiAuLi4gY3Jvc3MtZW50aXR5IHZhbGlkYXRpb24gd2l0aCB2YWx1ZSBiaW5kaW5nDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIEVMQ29tcGFyZVN0cmF0ZWd5IGltcGxlbWVudHMgUmVmZXJlbmNpbmdTdHJhdGVneQ0KLXsNCi0gICAgcHJpdmF0ZSBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgRUxIZWxwZXIgZWxIZWxwZXIgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpOw0KLSAgICAgICAgaWYgKGVsSGVscGVyLmlzRUxUZXJtV2VsbEZvcm1lZCh2YWxpZGF0aW9uVGFyZ2V0KSAmJg0KLSAgICAgICAgICAgIGVsSGVscGVyLmlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YWxpZGF0aW9uVGFyZ2V0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb1ZhbGlkYXRlVmFsdWVCaW5kaW5nKA0KLSAgICAgICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsaWRhdGlvblRhcmdldCksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsIGNvbXBhcmVTdHJhdGVneSk7DQotDQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInRlc3QiKQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlVmFsdWVCaW5kaW5nKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9DQotICAgICAgICAgICAgICAgIHJlc29sdmVUYXJnZXRGb3JDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0NCi0gICAgICAgIGlmKHZhbGlkYXRpb25UYXJnZXRFbnRyeSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSByZXNvbHZlVGFyZ2V0Rm9yQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWxpZGF0aW9uVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlID0NCi0gICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlKCk7DQotDQotICAgICAgICByZXR1cm4gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMucmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFbnRyeSgNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5jb252ZXJ0VmFsdWVCaW5kaW5nRXhwcmVzc2lvblRvUHJvY2Vzc2VkSW5mb3JtYXRpb25LZXkodmFsaWRhdGlvblRhcmdldCksDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbGlkYXRpb25UYXJnZXQpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBPYmplY3QgdGFyZ2V0VmFsdWUgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFZhbHVlT2ZFeHByZXNzaW9uKGZhY2VzQ29udGV4dCwgdmFsaWRhdGlvblRhcmdldCk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB0YXJnZXRFbnRyeSA9IG5ldyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSgpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0QmVhbigNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRWYWx1ZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsIHZhbGlkYXRpb25UYXJnZXQuZ2V0QmFzZUV4cHJlc3Npb24oKSkpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0Q29udmVydGVkVmFsdWUodGFyZ2V0VmFsdWUpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRFbnRyeSwgdHJ1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VtcHR5SWZTdHJhdGVneS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VtcHR5SWZTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGQxZTk3Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FbXB0eUlmU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRW1wdHlJZjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRW1wdHlJZlR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLk1lc3NhZ2VUYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBSdWR5IERlIEJ1c3NjaGVyDQotICovDQotcHVibGljIGNsYXNzIEVtcHR5SWZTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5PEVtcHR5SWY+DQotew0KLSAgICBwcm90ZWN0ZWQgTWVzc2FnZVRhcmdldCBnZXRNZXNzYWdlVGFyZ2V0KEVtcHR5SWYgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnVGFyZ2V0KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEVtcHR5SWYgYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhFbXB0eUlmIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbHVlT2YoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IHNvdXJjZSwgT2JqZWN0IHRhcmdldCwgRW1wdHlJZiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHZpb2xhdGlvbkZvdW5kID0gZmFsc2U7DQotDQotICAgICAgICBpZiAoYW5ub3RhdGlvbi5pcygpLmVxdWFscyhFbXB0eUlmVHlwZS5lbXB0eSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSAoaXNUYXJnZXRFbXB0eSh0YXJnZXQpIHx8IEJvb2xlYW4uRkFMU0UuZXF1YWxzKHRhcmdldCkpICYmICFpc1NvdXJjZUVtcHR5KHNvdXJjZSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uLmlzKCkuZXF1YWxzKEVtcHR5SWZUeXBlLm5vdF9lbXB0eSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSAoIWlzU291cmNlRW1wdHkoc291cmNlKSAmJiAhaXNUYXJnZXRFbXB0eSh0YXJnZXQpICYmICEodGFyZ2V0IGluc3RhbmNlb2YgQm9vbGVhbikpIHx8DQotICAgICAgICAgICAgICAgICAgICAoQm9vbGVhbi5UUlVFLmVxdWFscyh0YXJnZXQpICYmICFpc1NvdXJjZUVtcHR5KHNvdXJjZSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZpb2xhdGlvbkZvdW5kOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1RhcmdldEVtcHR5KE9iamVjdCB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQuZXF1YWxzKCIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTb3VyY2VFbXB0eShPYmplY3Qgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc291cmNlID09IG51bGwgfHwgc291cmNlLmVxdWFscygiIik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VxdWFsc1N0cmF0ZWd5LmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIyY2M1Yi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLk51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLk1lc3NhZ2VUYXJnZXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5wYXJhbWV0ZXIuQ2FzZUluc2Vuc2l0aXZlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1ATnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1ARW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXF1YWxzU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIE1lc3NhZ2VUYXJnZXQgZ2V0TWVzc2FnZVRhcmdldChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKEVxdWFscykgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnVGFyZ2V0KCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChFcXVhbHMpIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAob2JqZWN0MSBpbnN0YW5jZW9mIFN0cmluZyAmJiBvYmplY3QyIGluc3RhbmNlb2YgU3RyaW5nKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghaXNDYXNlU2Vuc2l0aXZlQ29tcGFyZShhbm5vdGF0aW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiAhKChTdHJpbmcpIG9iamVjdDEpLmVxdWFsc0lnbm9yZUNhc2UoKFN0cmluZykgb2JqZWN0Mik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG9iamVjdDEgIT0gbnVsbCAmJiAhb2JqZWN0MS5lcXVhbHMob2JqZWN0Mik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRXF1YWxzKSBhbm5vdGF0aW9uKS52YWx1ZSgpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZUNvbXBhcmUoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIUV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKQ0KLSAgICAgICAgICAgICAgICAuZXh0cmFjdChhbm5vdGF0aW9uLCBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoQ2FzZUluc2Vuc2l0aXZlLmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLml0ZXJhdG9yKCkuaGFzTmV4dCgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbENvbXBhcmVTdHJhdGVneS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZjU3Y2EuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7DQotDQotLyoqDQotICogIltwcm9wZXJ0eV9uYW1lXSIgLi4uIGxvY2FsIHZhbGlkYXRpb24gLT4gY3Jvc3MtY29tcG9uZW50LCBidXQgbm8gY3Jvc3MtZW50aXR5IHZhbGlkYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgTG9jYWxDb21wYXJlU3RyYXRlZ3kgaW1wbGVtZW50cyBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LCBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25UYXJnZXQuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneSB3aWxsIGNvbnRpbnVlDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlTG9jYWxseSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0S2V5LA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSA9DQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgYm9vbGVhbiBpc01vZGVsQXdhcmVWYWxpZGF0aW9uID0NCi0gICAgICAgICAgICAgICAgaXNNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHRhcmdldFByb3BlcnR5ID0gdGFyZ2V0S2V5Ow0KLQ0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUtleSA9IHJlc29sdmVTb3VyY2VLZXkoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIHRhcmdldEtleSA9IHNvdXJjZUtleS5zdWJzdHJpbmcoMCwgc291cmNlS2V5Lmxhc3RJbmRleE9mKCIuIikgKyAxKSArIHRhcmdldEtleTsNCi0NCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9IENyb3NzVmFsaWRhdGlvblV0aWxzLnJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgICAgIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSwgdGFyZ2V0S2V5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLQ0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25UYXJnZXRFbnRyeSAhPSBudWxsICYmIHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb21wb25lbnQoKSAhPSBudWxsICYmICFpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICAvL25vIHRhcmdldCAtIGJlY2F1c2UgdGhlcmUgaXMgbm8gdGFyZ2V0IGNvbXBvbmVudCAtIHZhbHVlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbW9kZWwNCi0gICAgICAgIGVsc2UgaWYoaXNNb2RlbEF3YXJlVmFsaWRhdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHVuc3VwcG9ydGVkQ2FzZShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVUYXJnZXRLZXkoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgU3RyaW5nIHRhcmdldEtleSkNCi0gICAgew0KLSAgICAgICAgLy9ubyByZWFsIHZhbHVlIGJpbmRpbmcgZXhwcmVzc2lvbg0KLSAgICAgICAgLy9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGp1c3QgaGVwbHMgdG8gcmVwbGFjZSB0aGUgcHJvcGVydHkgb2YgdGhlIGtleQ0KLSAgICAgICAgLy9oZXJlIG9ubHkgZG90LW5vdGF0aW9uIGlzIGFsbG93ZWQgLT4gbm8gcHJvYmxlbQ0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBiYXNlRXhwcmVzc2lvbiA9DQotICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7IiArIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsDQotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMuY2xhc3MpLmdldEtleSgpICsgIn0iKTsNCi0NCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2VPckFkZFByb3BlcnR5KGJhc2VFeHByZXNzaW9uLCB0YXJnZXRLZXkpDQotICAgICAgICAgICAgLmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgIHJldHVybiByZXN1bHQuc3Vic3RyaW5nKDIsIHJlc3VsdC5sZW5ndGgoKSAtMSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRWYWx1ZU9mUHJvcGVydHkoT2JqZWN0IGJhc2UsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEsIHByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhiYXNlLmdldENsYXNzKCkpOw0KLSAgICAgICAgTWV0aG9kIHRhcmdldE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh0YXJnZXRDbGFzcywgImdldCIgKyBwcm9wZXJ0eSk7DQotDQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0YXJnZXRNZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodGFyZ2V0Q2xhc3MsICJpcyIgKyBwcm9wZXJ0eSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAiY2xhc3MgIiArIGJhc2UuZ2V0Q2xhc3MoKSArICIgaGFzIG5vIHB1YmxpYyBnZXQvaXMgIiArIHByb3BlcnR5LnRvTG93ZXJDYXNlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZChiYXNlLCB0YXJnZXRNZXRob2QpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2Uga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuZXdLZXkgPSBjcmVhdGVUYXJnZXRLZXkoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgcmV0dXJuICFrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcuY29udGFpbnNFbnRyeShuZXdLZXkpOw0KLQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHJlc29sdmVTb3VyY2VLZXkoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBTdHJpbmcgc291cmNlS2V5ID0gcHJvcGVydHlEZXRhaWxzLmdldEtleSgpOw0KLQ0KLSAgICAgICAgaWYoIXNvdXJjZUtleS5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNvdXJjZSBwYXRoOiAiICsgc291cmNlS2V5ICsgIiBpbnZhbGlkIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc291cmNlS2V5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB1bnN1cHBvcnRlZENhc2UoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgbG9nZ2VyLndhcm5pbmcoImNvdWxkbid0IGZpbmQgY29udmVydGVkIG9iamVjdCBmb3IgIiArICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKS5nZXRLZXkoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHRhcmdldEVudHJ5ID0gbmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5KCk7DQotDQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRCZWFuKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcykuZ2V0QmFzZU9iamVjdCgpKTsNCi0gICAgICAgIHRhcmdldEVudHJ5DQotICAgICAgICAgICAgICAgIC5zZXRDb252ZXJ0ZWRWYWx1ZShnZXRWYWx1ZU9mUHJvcGVydHkodGFyZ2V0RW50cnkuZ2V0QmVhbigpLCB0YXJnZXRQcm9wZXJ0eSkpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRFbnRyeSwgdHJ1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWI2NTZjLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqICJbbG9jYWxfcHJvcGVydHkucHJvcGVydHkxLnByb3BlcnR5Ml0iDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIExvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneSBleHRlbmRzIExvY2FsQ29tcGFyZVN0cmF0ZWd5DQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZighdmFsaWRhdGlvblRhcmdldC5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vbm90IHN1cHBvcnRlZCAtIFRPRE8gYWRkIGxvZ2dpbmcNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ5VG9WYWxpZGF0ZUxvY2FsbHkoDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlTG9jYWxseShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSA9DQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IGNyZWF0ZVRhcmdldEtleShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEtleSk7DQotDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNvbnRhaW5zRW50cnkobmV3S2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkgPSBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkobmV3S2V5KTsNCi0NCi0gICAgICAgICAgICBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9ubyB0YXJnZXQgLSBiZWNhdXNlIHRoZXJlIGlzIG5vIHRhcmdldCBjb21wb25lbnQgLSB2YWx1ZSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1vZGVsDQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEtleSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB0YXJnZXRJbmZvcm1hdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LmlzVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgIHRhcmdldEluZm9ybWF0aW9uRW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSA9IG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoKTsNCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29tcG9uZW50KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENsaWVudElkKHRhcmdldEluZm9ybWF0aW9uRW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbnZlcnRlZE9iamVjdCh0YXJnZXRJbmZvcm1hdGlvbkVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCkpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAvL3Byb2Nlc3MgYWZ0ZXIgdmlvbGF0aW9uDQotICAgICAgICAgICAgLy9qdXN0IGFkZCBtZXNzYWdlcw0KLSAgICAgICAgICAgIGlmKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBudWxsKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy90aG93IGV4Y2VwdGlvbg0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFN0cmluZyB0YXJnZXRLZXkpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBPYmplY3QgbmV3QmFzZSA9IFJlZmxlY3Rpb25VdGlscw0KLSAgICAgICAgICAgIC5nZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCksIHRhcmdldEtleSk7DQotDQotICAgICAgICBpZih0YXJnZXRLZXkuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2ZpbmQgdGhlIGxhc3QgcHJvcGVydHkNCi0gICAgICAgICAgICB0YXJnZXRLZXkgPSB0YXJnZXRLZXkuc3Vic3RyaW5nKHRhcmdldEtleS5sYXN0SW5kZXhPZigiLiIpICsgMSwgdGFyZ2V0S2V5Lmxlbmd0aCgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXRWYWx1ZSA9IGdldFZhbHVlT2ZQcm9wZXJ0eShuZXdCYXNlLCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdGFyZ2V0RW50cnkgPSBuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkoKTsNCi0gICAgICAgIHRhcmdldEVudHJ5LnNldEJlYW4obmV3QmFzZSk7DQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh0YXJnZXRWYWx1ZSk7DQotDQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEVudHJ5LCB0cnVlKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Ob3RFcXVhbHNTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDc4NTI4Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Ob3RFcXVhbHNTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5Ob3RFcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLk1lc3NhZ2VUYXJnZXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1ATnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1ARW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTm90RXF1YWxzU3RyYXRlZ3kgZXh0ZW5kcyBFcXVhbHNTdHJhdGVneQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBNZXNzYWdlVGFyZ2V0IGdldE1lc3NhZ2VUYXJnZXQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChOb3RFcXVhbHMpIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ1RhcmdldCgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKE5vdEVxdWFscykgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwNCi0gICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAhc3VwZXIuaXNWaW9sYXRpb24ob2JqZWN0MSwgb2JqZWN0MiwgYW5ub3RhdGlvbik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKE5vdEVxdWFscykgYW5ub3RhdGlvbikudmFsdWUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVmZXJlbmNpbmdTdHJhdGVneS5qYXZhIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlZmVyZW5jaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRjNTAxMS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVmZXJlbmNpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJbnRlcm5hbCBpbnRlcmZhY2UgdG8gYWxsb3cgbXVsdGlwbGUgcmVmZXJlbmNpbmcgc3RyYXRlZ2llcyBmb3IgY3Jvc3MgY29tcG9uZW50IHZhbGlkYXRpb24uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWludGVyZmFjZSBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgYWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVxdWlyZWRJZlN0cmF0ZWd5LmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVxdWlyZWRJZlN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ODNmNjEuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlcXVpcmVkSWZTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uTWVzc2FnZVRhcmdldDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLk51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBOdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBFbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZElmU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneTxSZXF1aXJlZElmPg0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUZhY2VzQnVuZGxlID0gZmFsc2U7DQotDQotICAgIHByb3RlY3RlZCBNZXNzYWdlVGFyZ2V0IGdldE1lc3NhZ2VUYXJnZXQoUmVxdWlyZWRJZiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dUYXJnZXQoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc3VwZXIucmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0gICAgICAgIFN0cmluZyBtYXJrZXIgPSBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5NSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0NCi0gICAgICAgIGlmKChtYXJrZXIgKyBrZXkgKyBtYXJrZXIpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudXNlRmFjZXNCdW5kbGUgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShSZXF1aXJlZElmIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBzb3VyY2UsIE9iamVjdCB0YXJnZXQsIFJlcXVpcmVkSWYgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiB2aW9sYXRpb25Gb3VuZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgaWYgKGFubm90YXRpb24uaXMoKS5lcXVhbHMoUmVxdWlyZWRJZlR5cGUuZW1wdHkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gKGlzVGFyZ2V0RW1wdHkodGFyZ2V0KSB8fCBCb29sZWFuLkZBTFNFLmVxdWFscyh0YXJnZXQpKSAmJiBpc1NvdXJjZUVtcHR5KHNvdXJjZSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uLmlzKCkuZXF1YWxzKFJlcXVpcmVkSWZUeXBlLm5vdF9lbXB0eSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSAoaXNUYXJnZXROb3RFbXB0eSh0YXJnZXQpICYmIGlzU291cmNlRW1wdHkoc291cmNlKSAmJiAhKHRhcmdldCBpbnN0YW5jZW9mIEJvb2xlYW4pKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgKEJvb2xlYW4uVFJVRS5lcXVhbHModGFyZ2V0KSAmJiBpc1NvdXJjZUVtcHR5KHNvdXJjZSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZpb2xhdGlvbkZvdW5kOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1RhcmdldEVtcHR5KE9iamVjdCB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQuZXF1YWxzKCIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTb3VyY2VFbXB0eShPYmplY3Qgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc291cmNlID09IG51bGwgfHwgc291cmNlLmVxdWFscygiIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVGFyZ2V0Tm90RW1wdHkoT2JqZWN0IHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldCAhPSBudWxsICYmICF0YXJnZXQuZXF1YWxzKCIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoUmVxdWlyZWRJZiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWx1ZU9mKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMudXNlRmFjZXNCdW5kbGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Dcm9zc1ZhbGlkYXRpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWY4NTJhLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgZ2V0T3JJbml0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MsIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVzZXRTdG9yYWdlKENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MsIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSBnZXRPckluaXRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZSgNCi0gICAgICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLCBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlc2V0U3RvcmFnZShQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MsIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgcmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFbnRyeSgNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXksIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgPQ0KLSAgICAgICAgICAgIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5nZXRFbnRyeSh0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgLy92YWx1ZSBub3Qgc3VibWl0dGVkIGF0IHRoaXMgcmVxdWVzdCAtIHVzZSBtb2RlbCB2YWx1ZSAodmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBtb2RlbCkNCi0gICAgICAgIGlmKHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vc2ltcGxlIGNhc2UNCi0gICAgICAgIGlmIChwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEZ1cnRoZXJFbnRyaWVzKCkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgT2JqZWN0IHRhcmdldEJlYW4gPSBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpOw0KLQ0KLSAgICAgICAgLy9wcm9jZXNzIGNvbXBsZXggY29tcG9uZW50IGVudHJpZXMgKGUuZy4gYSB0YWJsZSkNCi0gICAgICAgIC8vc3VwcG9ydGVkOiBjcm9zcy1jb21wb25lbnQgYnV0IG5vIGNyb3NzLWVudGl0eSB2YWxpZGF0aW9uICg9IGxvY2FsZSB2YWxpZGF0aW9uKQ0KLSAgICAgICAgaWYgKHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuZ2V0QmVhbigpLmVxdWFscyh0YXJnZXRCZWFuKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAoUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgZW50cnkgOiBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEZ1cnRoZXJFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LmdldEJlYW4oKS5lcXVhbHModGFyZ2V0QmVhbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInN1cHBvcnQgZm9yIG1hcCBzeW50YXgiKQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VmFsdWVCaW5kaW5nRXhwcmVzc2lvblRvUHJvY2Vzc2VkSW5mb3JtYXRpb25LZXkoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YmUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YmUuZ2V0RXhwcmVzc2lvblN0cmluZygpLnJlcGxhY2UoIiN7IiwgIiIpLnJlcGxhY2UoIn0iLCAiIik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuamF2YSBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Byb3BlcnR5VmFsaWRhdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNzRkZTMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuU2tpcFZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25VdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRhdGlvblNraXBwZWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmKEV4dFZhbFV0aWxzLmlzU2tpcGFibGVWYWxpZGF0aW9uU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgIFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3ModmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksIFZhbGlkYXRpb25TdHJhdGVneS5jbGFzcykpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEJvb2xlYW4gc2tpcFZhbGlkYXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KA0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5TS0lQX1ZBTElEQVRJT04sIEJvb2xlYW4uY2xhc3MpOw0KLQ0KLSAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMoc2tpcFZhbGlkYXRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTE9HR0VSLmZpbmVzdCgidmFsaWRhdGlvbiBvZiAiICsgdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjYW5jZWxlZCIpOw0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIFNraXBWYWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgbnVsbCwgbWV0YURhdGFFbnRyeSwgbnVsbCk7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0IGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkN2ZlZS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18yXzAueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMi4wIj4NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlODAxMi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1JbnZhbGlkIGZvcm1hdA0KLW5vX21hdGNoX2RldGFpbD1UaGUgcmVxdWlyZWQgZm9ybWF0ZSBpczogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdhYjU0My4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1cdTA2MjdcdTA2NDRcdTA2MzVcdTA2NGFcdTA2M2FcdTA2MjkgXHUwNjJlXHUwNjI3XHUwNjM3XHUwNjI2XHUwNjI5DQotbm9fbWF0Y2hfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYzNVx1MDY0YVx1MDYzYVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MzdcdTA2NDRcdTA2NDhcdTA2MjhcdTA2MjkgXHUwNjQ3XHUwNjQ5OiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcyBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGQ2NDkwLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXQgaW52XHUwMGUwbGlkCi1ub19tYXRjaF9kZXRhaWw9RWwgZm9ybWF0IHJlcXVlcml0IFx1MDBlOXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZTcwMWIuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9VW5n/Gx0aWdlcyBGb3JtYXQNCi1ub19tYXRjaF9kZXRhaWw9RGFzIGVyZm9yZGVybGljaGUgRm9ybWF0IGlzdDogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlODAxMi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1JbnZhbGlkIGZvcm1hdA0KLW5vX21hdGNoX2RldGFpbD1UaGUgcmVxdWlyZWQgZm9ybWF0ZSBpczogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiYjk4Yy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1Gb3JtYXRvIGludlx1MDBlMWxpZG8gDQotbm9fbWF0Y2hfZGV0YWlsPUVsIGZvcm1hdG8gcmVxdWVyaWRvIGVzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcyBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjBhMjIzLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUxlIGZvcm1hdCBlc3QgaW52YWxpZGUNCi1ub19tYXRjaF9kZXRhaWw9TGUgZm9ybWF0IGRvaXQgJmVjaXJjO3RyZSBkZSBsYSBmb3JtZTogezB9DQotDQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE4NzQ4Yy4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotbm9fbWF0Y2g9Rm9ybWF0byBub24gdmFsaWRvCi1ub19tYXRjaF9kZXRhaWw9SWwgZm9ybWF0byByaWNoaWVzdG8gJmVncmF2ZTs6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NGJjNzQuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9R2VcdTAwZTdlcnNpeiBiaVx1MDBlN2ltDQotbm9fbWF0Y2hfZGV0YWlsPWdlcmVrZW4gYmlcdTAwZTdpbTogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjYwNzU5Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9SW5wdXQgaXMgZGlmZmVyZW50DQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1JbnB1dCBpcyBkaWZmZXJlbnQNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLQ0KLXdyb25nX2RhdGU9V3JvbmcgZGF0ZQ0KLXdyb25nX2RhdGVfZGV0YWlsPVdyb25nIGRhdGUNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcyBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZmOTNjNC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPVx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDVcdTA2MmVcdTA2MmFcdTA2NDRcdTA2NDENCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDVcdTA2MmVcdTA2MmFcdTA2NDRcdTA2NDENCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPVx1MDYzYVx1MDY0YVx1MDYzMSBcdTA2NDVcdTA2MzNcdTA2NDVcdTA2NDhcdTA2MmQgXHUwNjI4XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0IFx1MDY0NiBcdTA2NDFcdTA2MzMgXHUwNjQyXHUwNjRhXHUwNjQ1XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPVx1MDYzYVx1MDY0YVx1MDYzMSBcdTA2NDVcdTA2MzNcdTA2NDVcdTA2NDhcdTA2MmQgXHUwNjI4XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0ICBcdTA2NDZcdTA2NDFcdTA2MzMgXHUwNjQyXHUwNjRhXHUwNjQ1XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NA0KLQ0KLXdyb25nX2RhdGU9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDYyZVx1MDYyN1x1MDYzN1x1MDY0OVx1MDYyMQ0KLXdyb25nX2RhdGVfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2NDlcdTA2MjENCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzXHUwNjQ4IFx1MDY0NiBcdTA2MjhcdTA2MzlcdTA2MmYgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDMgXHUwNjQ4XHUwNjQ2IFx1MDYyOFx1MDYzOVx1MDYyZiB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDNcdTA2NDggXHUwNjQ2IFx1MDY0Mlx1MDYyOFx1MDY0NCB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzIFx1MDY0OFx1MDY0NiBcdTA2NDJcdTA2MjhcdTA2NDQgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0NFx1MDYyNyBcdTA2NGFcdTA2MzNcdTA2MjdcdTA2NDhcdTA2NDkgezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NDRcdTA2MjcgXHUwNjRhXHUwNjMzXHUwNjI3XHUwNjQ4XHUwNjQ5IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcyBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1NGVkMi4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1lbCB2YWxvciBcdTAwZTkgZGlmZXJlbnQKLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9ZWwgdmFsb3IgXHUwMGU5IGRpZmVyZW50Ci0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9bm8gZXMgcGVybWV0IGVsIG1hdGVpeCB2YWxvcgotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9bm8gZXMgcGVybWV0IGVsIG1hdGVpeCB2YWxvcgotCi13cm9uZ19kYXRlPWRhdGEgZXJyXHUwMGYybmlhCi13cm9uZ19kYXRlX2RldGFpbD1kYXRhIGVyclx1MDBmMm5pYQotCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9bGEgZGF0YSBoYSBkZSBzZXIgcG9zdGVyaW9yIGEgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotCi13cm9uZ19kYXRlX25vdF9hZnRlcj1sYSBkYXRhIGhhIGRlIHNlciBhbnRlcmlvciBhIHswfQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotCi13cm9uZ19kYXRlX25vdF9lcXVhbD1sYSBkYXRhIG5vIFx1MDAwZTlzIGlndWFsIGEgezB9Ci13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9bGEgZGF0YSBubyBcdTAwMGU5cyBpZ3VhbCBhIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcyBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4NzIzNC4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUVpbmdhYmUgaXN0IHVudGVyc2NoaWVkbGljaA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9RWluZ2FiZSBpc3QgdW50ZXJzY2hpZWRsaWNoDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1EZXIgZ2xlaWNoZSBXZXJ0IGlzdCBuaWNodCBlcmxhdWJ0DQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9RGVyIGdsZWljaGUgV2VydCBpc3QgbmljaHQgZXJsYXVidA0KLQ0KLXdyb25nX2RhdGU9RGF0dW0gaW5rb3JyZWt0DQotd3JvbmdfZGF0ZV9kZXRhaWw9RGF0dW0gaW5rb3JyZWt0DQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhcyBEYXR1bSBtdXNzIG5hY2ggZGVtIHswfSBzZWluDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1EYXMgRGF0dW0gbXVzcyBuYWNoIGRlbSB7MH0gc2Vpbg0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPURhcyBEYXR1bSBtdXNzIHZvciBkZW0gezB9IHNlaW4NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9RGFzIERhdHVtIG11c3Mgdm9yIGRlbSB7MH0gc2Vpbg0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPURhcyBEYXR1bSBlbnRzcHJpY2h0IG5pY2h0IGRlbSB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGFzIERhdHVtIGVudHNwcmljaHQgbmljaHQgZGVtIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcyBiL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2MDc1OS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUlucHV0IGlzIGRpZmZlcmVudA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9SW5wdXQgaXMgZGlmZmVyZW50DQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi0NCi13cm9uZ19kYXRlPVdyb25nIGRhdGUNCi13cm9uZ19kYXRlX2RldGFpbD1Xcm9uZyBkYXRlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTkxNzAuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1sYSBlbnRyYWRhIGVzIGRpZmVyZW50ZQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9bGEgZW50cmFkYSBlcyBkaWZlcmVudGUNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPW5vIHNlIHBlcm1pdGVuIGVudHJhZGFzIGlndWFsZXMNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1ubyBzZSBwZXJtaXRlbiBlbnRyYWRhcyBpZ3VhbGVzDQotDQotd3JvbmdfZGF0ZT1mZWNoYSBlcXVpdm9jYWRhDQotd3JvbmdfZGF0ZV9kZXRhaWw9ZmVjaGEgZXF1aXZvY2FkYQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGx1ZWdvIGRlIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBsdWVnbyBkZSB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGFudGVzIGRlIHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGFudGVzIGRlIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPWxhIGZlY2hhIG5vIGVzIGlndWFsIGEgezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPWxhIGZlY2hhIG5vIGVzIGlndWFsIGEgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWYwMjE4Li4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9TGVzIGNoYW1wcyBzb250IGRpZmYmZWFjdXRlO3JlbnRzDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1MZXMgY2hhbXBzIHNvbnQgZGlmZiZlYWN1dGU7cmVudHMNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPUxlcyBjaGFtcHMgZG9pdmVudCAmZWNpcmM7dHJlIGRpZmYmZWFjdXRlO3JlbnRzDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9TGVzIGNoYW1wcyBkb2l2ZW50ICZlY2lyYzt0cmUgZGlmZiZlYWN1dGU7cmVudHMNCi0NCi13cm9uZ19kYXRlPUxhIGRhdGUgZXN0IGluY29ycmVjdGUNCi13cm9uZ19kYXRlX2RldGFpbD1MYSBkYXRlIGVzdCBpbmNvcnJlY3RlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGFwciZlZ3JhdmU7cyB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGFwciZlZ3JhdmU7cyB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhdmFudCB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXZhbnQgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9TGEgZGF0ZSBuJ2VzdCBwYXMgJmVhY3V0ZTtnYWxlICZhZ3JhdmU7IHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1MYSBkYXRlIG4nZXN0IHBhcyAmZWFjdXRlO2dhbGUgJmFncmF2ZTsgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzIGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDQyODAxLi4wMDAwMDAwCi0tLSBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPVZhbG9yaSBub24gdWd1YWxpCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUkgdmFsb3JpIGluc2VyaXRpIG5vbiBjb2luY2lkb25vCi0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9TG8gc3Rlc3NvIHZhbG9yZSBub24gJmVncmF2ZTsgcGVybWVzc28KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPUxvIHN0ZXNzbyB2YWxvcmUgbm9uICZlZ3JhdmU7IHBlcm1lc3NvCi0KLXdyb25nX2RhdGU9RGF0YSBlcnJhdGEKLXdyb25nX2RhdGVfZGV0YWlsPURhdGEgZXJyYXRhCi0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1MYSBkYXRhIGRldmUgZXNzZXJlIGRvcG8gZGkgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPUxhIGRhdGEgZGV2ZSBlc3NlcmUgZG9wbyBkaSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9TGEgZGF0YSBkZXZlIGVzc2VyZSBwcmltYSBkaSB7MH0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1MYSBkYXRhIGRldmUgZXNzZXJlIHByaW1hIGRpIHswfQotCi13cm9uZ19kYXRlX25vdF9lcXVhbD1MYSBkYXRhIG5vbiAmZWdyYXZlOyB1Z3VhbGUgYSB7MH0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1MYSBkYXRhIG5vbiAmZWdyYXZlOyB1Z3VhbGUgYSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZjZhOWQuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1naXJpbGVuIGRlXHUwMTFmZXIgZmFya2xcdTAxMzENCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPWdpcmlsZW4gZGVcdTAxMWZlciBmYXJrbFx1MDEzMQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9YXluXHUwMTMxIGRlXHUwMTFmZXIgZ2lyaWxlbWV6DQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9YXluXHUwMTMxIGRlXHUwMTFmZXIgZ2lyaWxlbWV6DQotDQotd3JvbmdfZGF0ZT15YW5sXHUwMTMxXHUwMTVmIHRhcmloDQotd3JvbmdfZGF0ZV9kZXRhaWw9eWFubFx1MDEzMVx1MDE1ZiB0YXJpaA0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIHNvbnJhIG9sbWFsXHUwMTMxZFx1MDEzMXINCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gc29ucmEgb2xtYWxcdTAxMzFkXHUwMTMxcg0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gXHUwMGY2bmNlIG9sbWFsXHUwMTMxZFx1MDEzMXINCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBcdTAwZjZuY2Ugb2xtYWxcdTAxMzFkXHUwMTMxcg0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPXRhcmloIHswfSBkZVx1MDExZmVyaW5lIGVcdTAxNWZpdCBkZVx1MDExZmlsDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5lIGVcdTAxNWZpdCBkZVx1MDExZmlsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMgYi9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkOTkyOS4uMDAwMDAwMAotLS0gYS9icmFuY2hfZm9yX2pzZl8yXzAvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1qYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW49b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuQmFzaWM9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuSWQ9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmU9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzJfMC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZjgyNWMuLjAwMDAwMDAKLS0tIGEvYnJhbmNoX2Zvcl9qc2ZfMl8wL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBQcm9wZXJ0eSBWYWxpZGF0aW9uIE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFByb3BlcnR5IFZhbGlkYXRpb24gTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgUHJvcGVydHkgVmFsaWRhdGlvbiBwcm92aWRlcyBhbm5vdGF0aW9uIGJhc2VkIHZhbGlkYXRpb24gZm9yIGJlYW4gcHJvcGVydGllcy4NCi0gICAgSXQgYWxzbyBwcm92aWRlcyBKUEEgMS4wIGJhc2VkIHZhbGlkYXRpb24gU3VwcG9ydC4NCi0gIA0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS54IGFuZCBKU0YgMi54LiBBbGwgdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3BvbS54bWwgYi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvcG9tLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sCnJlbmFtZSB0byBjb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvcG9tLnhtbApkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyS2l0LmphdmEgYi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJLaXQuamF2YQpyZW5hbWUgdG8gY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJLaXQuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLmphdmEgYi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIuamF2YQpyZW5hbWUgdG8gY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YSBiL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpyZW5hbWUgdG8gY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0dlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEgYi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9zdGFydHVwL0dlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3N0YXJ0dXAvR2VuZXJpY01vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCnJlbmFtZSB0byBjb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9zdGFydHVwL0dlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dApyZW5hbWUgdG8gY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dApkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dCBiL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dApyZW5hbWUgdG8gY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcueG1sIGIvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcueG1sCnJlbmFtZSB0byBjb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKcmVuYW1lIHRvIGNvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRpZmYgLS1naXQgYS9jb21wb25lbnQtc3VwcG9ydC9wb20ueG1sIGIvY29tcG9uZW50LXN1cHBvcnQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDg5NjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcG9uZW50LXN1cHBvcnQvcG9tLnhtbApAQCAtMCwwICsxLDU0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICAgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorCisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+Y29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgorCisgICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBDb21wb25lbnQtU3VwcG9ydCBNb2R1bGVzPC9uYW1lPgorICAgIDx2ZXJzaW9uPjEuMS40PC92ZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1tb2R1bGU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMS40PC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPG1vZHVsZXM+CisgICAgICAgIDxtb2R1bGU+dHJpbmlkYWQtc3VwcG9ydDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmdlbmVyaWMtc3VwcG9ydDwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS40PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHRyaW5pZGFkLnZlcnNpb24+MS4wLjk8L3RyaW5pZGFkLnZlcnNpb24+CisgICAgPC9wcm9wZXJ0aWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvcG9tLnhtbCBiL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvcG9tLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvcG9tLnhtbApyZW5hbWUgdG8gY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9wb20ueG1sCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9EZWZhdWx0RXh0VmFsVHJpbmlkYWRTdXBwb3J0TW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhIGIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9EZWZhdWx0RXh0VmFsVHJpbmlkYWRTdXBwb3J0TW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9EZWZhdWx0RXh0VmFsVHJpbmlkYWRTdXBwb3J0TW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhCnJlbmFtZSB0byBjb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0RlZmF1bHRFeHRWYWxUcmluaWRhZFN1cHBvcnRNb2R1bGVDb25maWd1cmF0aW9uLmphdmEKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIuamF2YSBiL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIuamF2YQpyZW5hbWUgdG8gY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRTdXBwb3J0TW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhIGIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZFN1cHBvcnRNb2R1bGVDb25maWd1cmF0aW9uLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkU3VwcG9ydE1vZHVsZUNvbmZpZ3VyYXRpb24uamF2YQpyZW5hbWUgdG8gY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZFN1cHBvcnRNb2R1bGVDb25maWd1cmF0aW9uLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YSBiL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKcmVuYW1lIHRvIGNvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvV2ViWG1sUGFyYW1ldGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL1dlYlhtbFBhcmFtZXRlci5qYXZhCnJlbmFtZSB0byBjb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvRG91YmxlUmFuZ2VJbml0aWFsaXplci5qYXZhIGIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvRG91YmxlUmFuZ2VJbml0aWFsaXplci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvRG91YmxlUmFuZ2VJbml0aWFsaXplci5qYXZhCnJlbmFtZSB0byBjb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9MZW5ndGhJbml0aWFsaXplci5qYXZhIGIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xlbmd0aEluaXRpYWxpemVyLmphdmEKcmVuYW1lIHRvIGNvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xlbmd0aEluaXRpYWxpemVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Mb25nUmFuZ2VJbml0aWFsaXplci5qYXZhIGIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTG9uZ1JhbmdlSW5pdGlhbGl6ZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xvbmdSYW5nZUluaXRpYWxpemVyLmphdmEKcmVuYW1lIHRvIGNvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xvbmdSYW5nZUluaXRpYWxpemVyLmphdmEKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEgYi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9QYXR0ZXJuSW5pdGlhbGl6ZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9QYXR0ZXJuSW5pdGlhbGl6ZXIuamF2YQpyZW5hbWUgdG8gY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEgYi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEKcmVuYW1lIHRvIGNvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1JlcXVpcmVkSW5pdGlhbGl6ZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1RyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1RyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1RyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQpyZW5hbWUgdG8gY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVmFsaWRhdG9ySW5pdGlhbGl6ZXIuamF2YSBiL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1ZhbGlkYXRvckluaXRpYWxpemVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhCnJlbmFtZSB0byBjb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEgYi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCnJlbmFtZSB0byBjb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpyZW5hbWUgdG8gY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpyZW5hbWUgdG8gY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LmphdmEgYi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LmphdmEKcmVuYW1lIHRvIGNvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuamF2YSBiL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5LmphdmEKcmVuYW1lIHRvIGNvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdGFydHVwL1RyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEgYi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCnJlbmFtZSB0byBjb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZS5qYXZhIGIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2UuamF2YQpyZW5hbWUgdG8gY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyLmphdmEKcmVuYW1lIHRvIGNvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU1hbmFnZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9UcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuamF2YSBiL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9UcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9UcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuamF2YQpyZW5hbWUgdG8gY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL1RyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL21hcHBlci9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTmFtZU1hcHBlci5qYXZhCnJlbmFtZSB0byBjb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC91dGlsL1RyaW5pZGFkVXRpbHMuamF2YSBiL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdXRpbC9UcmluaWRhZFV0aWxzLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3V0aWwvVHJpbmlkYWRVdGlscy5qYXZhCnJlbmFtZSB0byBjb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3V0aWwvVHJpbmlkYWRVdGlscy5qYXZhCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhIGIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKcmVuYW1lIHRvIGNvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlLmphdmEgYi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZS5qYXZhCnJlbmFtZSB0byBjb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dApyZW5hbWUgdG8gY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0IGIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS50eHQKcmVuYW1lIHRvIGNvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS50eHQKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcueG1sIGIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZXMtY29uZmlnLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VzLWNvbmZpZy54bWwKcmVuYW1lIHRvIGNvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKcmVuYW1lIHRvIGNvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkaWZmIC0tZ2l0IGEvY29yZS9wb20ueG1sIGIvY29yZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZDM1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3BvbS54bWwKQEAgLTAsMCArMSw3NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1tb2R1bGU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMS40PC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBDb3JlPC9uYW1lPgorICAgIDx2ZXJzaW9uPjEuMS40PC92ZXJzaW9uPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jb2RlYzwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29kZWM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjM8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgorCisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0N1c3RvbUluZm9ybWF0aW9uLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ3VzdG9tSW5mb3JtYXRpb24uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9DdXN0b21JbmZvcm1hdGlvbi5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ3VzdG9tSW5mb3JtYXRpb24uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9EZWZhdWx0RXh0VmFsQ29yZUNvbmZpZ3VyYXRpb24uamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9EZWZhdWx0RXh0VmFsQ29yZUNvbmZpZ3VyYXRpb24uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9EZWZhdWx0RXh0VmFsQ29yZUNvbmZpZ3VyYXRpb24uamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0RlZmF1bHRFeHRWYWxDb3JlQ29uZmlndXJhdGlvbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0RlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0RlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0RlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dC5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHQuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dEludGVybmFscy5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnRlcm5hbHMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0SW50ZXJuYWxzLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0SW50ZXJuYWxzLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0SW52b2NhdGlvbk9yZGVyQXdhcmVJbnRlcm5hbHMuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbi5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvcmVDb25maWd1cmF0aW9uLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb24uamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvcmVDb25maWd1cmF0aW9uLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsTW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbE1vZHVsZUNvbmZpZ3VyYXRpb24uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxNb2R1bGVDb25maWd1cmF0aW9uLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxNb2R1bGVDb25maWd1cmF0aW9uLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsTW9kdWxlQ29uZmlndXJhdGlvblJlc29sdmVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsTW9kdWxlQ29uZmlndXJhdGlvblJlc29sdmVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsTW9kdWxlQ29uZmlndXJhdGlvblJlc29sdmVyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxNb2R1bGVDb25maWd1cmF0aW9uUmVzb2x2ZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlckNvbXBhcmF0b3IuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlckNvbXBhcmF0b3IuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXJTdXBwb3J0LmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyU3VwcG9ydC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlclN1cHBvcnQuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlclN1cHBvcnQuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Kc2ZQcm9qZWN0U3RhZ2UuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Kc2ZQcm9qZWN0U3RhZ2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Kc2ZQcm9qZWN0U3RhZ2UuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0pzZlByb2plY3RTdGFnZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL05lc3RlZC5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL05lc3RlZC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL05lc3RlZC5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvTmVzdGVkLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUGhhc2VJZFJlY29yZGluZ1BoYXNlTGlzdGVuZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9QaGFzZUlkUmVjb3JkaW5nUGhhc2VMaXN0ZW5lci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1BoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9QaGFzZUlkUmVjb3JkaW5nUGhhc2VMaXN0ZW5lci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZS5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvamVjdFN0YWdlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvamVjdFN0YWdlTmFtZS5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZU5hbWUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VOYW1lLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VOYW1lLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvamVjdFN0YWdlUmVzb2x2ZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZVJlc29sdmVyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1ZhbGlkYXRpb25Nb2R1bGVBd2FyZS5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1ZhbGlkYXRpb25Nb2R1bGVBd2FyZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1ZhbGlkYXRpb25Nb2R1bGVBd2FyZS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvVmFsaWRhdGlvbk1vZHVsZUF3YXJlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvVmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1ZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9WYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9WYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9BYnN0cmFjdEVMSGVscGVyRmFjdG9yeS5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0Fic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0Fic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXIuamF2YQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyRmFjdG9yeS5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyRmFjdG9yeS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyRmFjdG9yeS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRUxIZWxwZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FTEhlbHBlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRUxIZWxwZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0ZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24uamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0Fic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRGVmYXVsdEZhY3RvcnlGaW5kZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0RlZmF1bHRGYWN0b3J5RmluZGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9EZWZhdWx0RmFjdG9yeUZpbmRlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9EZWZhdWx0RmFjdG9yeUZpbmRlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlGaW5kZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlOYW1lcy5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeU5hbWVzLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeU5hbWVzLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9OYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9OYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9OYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L05hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9BYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0Fic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9BYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uRW50cnkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uRW50cnkuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24uamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbi5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Db21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Db21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Db21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0NvbXBvbmVudEluaXRpYWxpemF0aW9uQXdhcmVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0ZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9GYWNlc01lc3NhZ2VQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0h0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9SZW5kZXJlckludGVyY2VwdG9yLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9SZW5kZXJlckludGVyY2VwdG9yLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvU2luZ2xlVmlvbGF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9TaW5nbGVWaW9sYXRpb25Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1NpbmdsZVZpb2xhdGlvblByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9TaW5nbGVWaW9sYXRpb25Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WaW9sYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Zpb2xhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmlvbGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Zpb2xhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmlvbGF0aW9uU2V2ZXJpdHlWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WaW9sYXRpb25TZXZlcml0eVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Zpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WaW9sYXRpb25TZXZlcml0eVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL05hbWVNYXBwZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL05hbWVNYXBwZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL1N1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9TdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9TdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL0NvbW1vbk1ldGFEYXRhS2V5cy5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL01ldGFEYXRhRW50cnkuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9NZXRhRGF0YUVudHJ5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvTWV0YURhdGFFbnRyeS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvTWV0YURhdGFFbnRyeS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9NZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbC5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9Tb3J0ZWROYW1lTWFwcGVyTGlzdC5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NvcnRlZE5hbWVNYXBwZXJMaXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU29ydGVkTmFtZU1hcHBlckxpc3QuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NvcnRlZE5hbWVNYXBwZXJMaXN0LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1ZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24uamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlEZXRhaWxzLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb24uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L0RlZmF1bHRQcm94eUhlbHBlci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L0RlZmF1bHRQcm94eUhlbHBlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L0RlZmF1bHRQcm94eUhlbHBlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJveHkvRGVmYXVsdFByb3h5SGVscGVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJveHkvUHJveHlIZWxwZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm94eS9Qcm94eUhlbHBlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L1Byb3h5SGVscGVyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm94eS9Qcm94eUhlbHBlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlY29yZGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZWNvcmRlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0Fic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0Fic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQ29udmVydGVkVmFsdWVDYWNoZS5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9Db252ZXJ0ZWRWYWx1ZUNhY2hlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0NvbnZlcnRlZFZhbHVlQ2FjaGUuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9Db252ZXJ0ZWRWYWx1ZUNhY2hlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0NvbnZlcnRlZFZhbHVlQ2FjaGVFbnRyeS5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9Db252ZXJ0ZWRWYWx1ZUNhY2hlRW50cnkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQ29udmVydGVkVmFsdWVDYWNoZUVudHJ5LmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQ29udmVydGVkVmFsdWVDYWNoZUVudHJ5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0RlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbExhenlSZW5kZXJlclByb3h5LmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbExhenlSZW5kZXJlclByb3h5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbExhenlSZW5kZXJlclByb3h5LmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXQuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXQuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0RmFjdG9yeS5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXRGYWN0b3J5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXRGYWN0b3J5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyUHJveHkuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlclByb3h5LmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyV3JhcHBlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyV3JhcHBlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9SZW5kZXJlclByb3h5LmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L1JlbmRlcmVyUHJveHkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvUmVuZGVyZXJQcm94eS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L1JlbmRlcmVyUHJveHkuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0Fic3RyYWN0U3RhcnR1cExpc3RlbmVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9FeHRWYWxTdGFydHVwTGlzdGVuZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0V4dFZhbFN0YXJ0dXBMaXN0ZW5lci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9FeHRWYWxTdGFydHVwTGlzdGVuZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0QXBwbGljYXRpb25TY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0QXBwbGljYXRpb25TY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0QXBwbGljYXRpb25TY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0U3RvcmFnZU1hbmFnZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0U3RvcmFnZU1hbmFnZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0U3RvcmFnZU1hbmFnZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RTdG9yYWdlTWFuYWdlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU1hbmFnZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTWFuYWdlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU1hbmFnZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2UuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2UuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEdyb3VwU3RvcmFnZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEdyb3VwU3RvcmFnZU1hbmFnZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2VNYW5hZ2VyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0R3JvdXBTdG9yYWdlTWFuYWdlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0R3JvdXBTdG9yYWdlTWFuYWdlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZU1hbmFnZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZU1hbmFnZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZU1hbmFnZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlTWFuYWdlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZS5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWV0YURhdGFTdG9yYWdlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWV0YURhdGFTdG9yYWdlTWFuYWdlci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU1hbmFnZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UHJvcGVydHlTdG9yYWdlLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UHJvcGVydHlTdG9yYWdlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UHJvcGVydHlTdG9yYWdlLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UHJvcGVydHlTdG9yYWdlTWFuYWdlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFByb3BlcnR5U3RvcmFnZU1hbmFnZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFByb3BlcnR5U3RvcmFnZU1hbmFnZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTWFuYWdlci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU1hbmFnZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2UuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTWFuYWdlci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTWFuYWdlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTWFuYWdlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0U3RvcmFnZU1hbmFnZXJGYWN0b3J5LmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0U3RvcmFnZU1hbmFnZXJGYWN0b3J5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0U3RvcmFnZU1hbmFnZXJGYWN0b3J5LmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VNYW5hZ2VyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VNYW5hZ2VyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU1hbmFnZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9GYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRmFjZXNNZXNzYWdlU3RvcmFnZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvR3JvdXBTdG9yYWdlLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Hcm91cFN0b3JhZ2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0dyb3VwU3RvcmFnZS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Hcm91cFN0b3JhZ2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2UuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01ldGFEYXRhU3RvcmFnZS5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWV0YURhdGFTdG9yYWdlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NZXRhRGF0YVN0b3JhZ2UuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWV0YURhdGFTdG9yYWdlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01ldGFEYXRhU3RvcmFnZUZpbHRlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWV0YURhdGFTdG9yYWdlRmlsdGVyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01ldGFEYXRhU3RvcmFnZUZpbHRlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUHJvcGVydHlTdG9yYWdlLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Qcm9wZXJ0eVN0b3JhZ2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1Byb3BlcnR5U3RvcmFnZS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Qcm9wZXJ0eVN0b3JhZ2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJQcm94eVN0b3JhZ2UuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVyUHJveHlTdG9yYWdlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeS5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9TdG9yYWdlTWFuYWdlckhvbGRlci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXJIb2xkZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VySG9sZGVyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VySG9sZGVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WYWxpZGF0aW9uUmVzdWx0LmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WYWxpZGF0aW9uUmVzdWx0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WYWxpZGF0aW9uUmVzdWx0LmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1ZhbGlkYXRpb25SZXN1bHQuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1Zpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0TWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlTmFtZU1hcHBlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0TWV0YURhdGFTdG9yYWdlTmFtZU1hcHBlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTmFtZU1hcHBlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL0NvbnN0cmFpbnRTb3VyY2UuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL0NvbnN0cmFpbnRTb3VyY2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL0NvbnN0cmFpbnRTb3VyY2UuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vQ29uc3RyYWludFNvdXJjZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL0VtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL0lnbm9yZUNvbnN0cmFpbnRTb3VyY2UuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL0lnbm9yZUNvbnN0cmFpbnRTb3VyY2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL0lnbm9yZUNvbnN0cmFpbnRTb3VyY2UuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vSWdub3JlQ29uc3RyYWludFNvdXJjZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL051bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL1NraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vVGFyZ2V0UHJvcGVydHkuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL1RhcmdldFByb3BlcnR5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9UYXJnZXRQcm9wZXJ0eS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9UYXJnZXRQcm9wZXJ0eS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vVGFyZ2V0UHJvcGVydHlJZC5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vVGFyZ2V0UHJvcGVydHlJZC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vVGFyZ2V0UHJvcGVydHlJZC5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9UYXJnZXRQcm9wZXJ0eUlkLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9leGNlcHRpb24vUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24uamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL2V4Y2VwdGlvbi9SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vZXhjZXB0aW9uL1JlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL2V4Y2VwdGlvbi9SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbi5qYXZhCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRmFjZXNNZXNzYWdlSG9sZGVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0ZhY2VzTWVzc2FnZUhvbGRlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9GYWNlc01lc3NhZ2VIb2xkZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9GYWNlc01lc3NhZ2VIb2xkZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvTGFiZWxlZE1lc3NhZ2UuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvTGFiZWxlZE1lc3NhZ2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvTGFiZWxlZE1lc3NhZ2UuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9MYWJlbGVkTWVzc2FnZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9WaW9sYXRpb25NZXNzYWdlLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL1Zpb2xhdGlvbk1lc3NhZ2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvVmlvbGF0aW9uTWVzc2FnZS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL1Zpb2xhdGlvbk1lc3NhZ2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL01lc3NhZ2VSZXNvbHZlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL01lc3NhZ2VSZXNvbHZlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeS5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvUGFyYW1ldGVyS2V5LmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvUGFyYW1ldGVyS2V5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvUGFyYW1ldGVyS2V5LmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9QYXJhbWV0ZXJLZXkuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9QYXJhbWV0ZXJWYWx1ZS5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlclZhbHVlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvUGFyYW1ldGVyVmFsdWUuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlclZhbHVlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1Zpb2xhdGlvblNldmVyaXR5LmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WaW9sYXRpb25TZXZlcml0eS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1Zpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1Zpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmlydHVhbFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmlydHVhbFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0lkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9JZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9BYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Qcmlvcml0eS5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVG9Eby5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Ub0RvLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVG9Eby5qYXZhCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VDYXRlZ29yeS5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VDYXRlZ29yeS5qYXZhCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUluZm9ybWF0aW9uLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUluZm9ybWF0aW9uLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0NsYXNzVXRpbHMuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0NvbnN0cmFpbnRTb3VyY2VVdGlscy5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0NvbnN0cmFpbnRTb3VyY2VVdGlscy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0NvbnN0cmFpbnRTb3VyY2VVdGlscy5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ29uc3RyYWludFNvdXJjZVV0aWxzLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRGVmYXVsdFByb2plY3ROYW1lLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRGVmYXVsdFByb2plY3ROYW1lLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRGVmYXVsdFByb2plY3ROYW1lLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9EZWZhdWx0UHJvamVjdE5hbWUuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxBbm5vdGF0aW9uVXRpbHMuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxBbm5vdGF0aW9uVXRpbHMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxBbm5vdGF0aW9uVXRpbHMuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbEFubm90YXRpb25VdGlscy5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxVdGlscy5qYXZhCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Hcm91cFV0aWxzLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvR3JvdXBVdGlscy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0dyb3VwVXRpbHMuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0dyb3VwVXRpbHMuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0pzZlV0aWxzLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvSnNmVXRpbHMuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0pzZlV0aWxzLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvTnVsbFZhbHVlQXdhcmVDb25jdXJyZW50SGFzaE1hcC5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL051bGxWYWx1ZUF3YXJlQ29uY3VycmVudEhhc2hNYXAuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9OdWxsVmFsdWVBd2FyZUNvbmN1cnJlbnRIYXNoTWFwLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9OdWxsVmFsdWVBd2FyZUNvbmN1cnJlbnRIYXNoTWFwLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUHJveHlVdGlscy5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Byb3h5VXRpbHMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Qcm94eVV0aWxzLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Qcm94eVV0aWxzLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEgYi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9SZWZsZWN0aW9uVXRpbHMuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhIGIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1dlYlhtbFV0aWxzLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvV2ViWG1sVXRpbHMuamF2YQpyZW5hbWUgdG8gY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1dlYlhtbFV0aWxzLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQKcmVuYW1lIHRvIGNvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dCBiL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0CnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VzLWNvbmZpZy54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcueG1sCnJlbmFtZSB0byBjb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcueG1sCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CnJlbmFtZSB0byBjb3JlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9hc3NlbWJseS9wb20ueG1sIGIvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2Fzc2VtYmx5L3BvbS54bWwKcmVuYW1lIHRvIGV4YW1wbGVzL2Fzc2VtYmx5L3BvbS54bWwKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbCBiL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHByZXBhcmUvMV8xXzIvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbApyZW5hbWUgdG8gZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbApkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sIGIvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sCnJlbmFtZSB0byBleGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKcmVuYW1lIHRvIGV4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApyZW5hbWUgdG8gZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9wb20ueG1sIGIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvcG9tLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3BvbS54bWwKcmVuYW1lIHRvIGV4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3BvbS54bWwKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2N1c3RvbS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHByZXBhcmUvMV8xXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpyZW5hbWUgdG8gZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhIGIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2RvbWFpbi9QZXJzb24uamF2YQpyZW5hbWUgdG8gZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEgYi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEKcmVuYW1lIHRvIGV4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dCBiL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CnJlbmFtZSB0byBleGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dApkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQgYi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApyZW5hbWUgdG8gZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCnJlbmFtZSB0byBleGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbCBiL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9tYWluLnRhZ2xpYi54bWwKcmVuYW1lIHRvIGV4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbApkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCnJlbmFtZSB0byBleGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sIGIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sCnJlbmFtZSB0byBleGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwgYi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApyZW5hbWUgdG8gZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbCBiL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHByZXBhcmUvMV8xXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbApyZW5hbWUgdG8gZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbApkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sIGIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sCnJlbmFtZSB0byBleGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWwgYi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWwKcmVuYW1lIHRvIGV4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWwKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwgYi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbApyZW5hbWUgdG8gZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbCBiL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHByZXBhcmUvMV8xXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbApyZW5hbWUgdG8gZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbApkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3BvbS54bWwgYi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9wb20ueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvcG9tLnhtbApyZW5hbWUgdG8gZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvcG9tLnhtbApkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vY29uc3RyYWludHMvQmlydGhkYXkuamF2YSBiL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vY29uc3RyYWludHMvQmlydGhkYXkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vY29uc3RyYWludHMvQmlydGhkYXkuamF2YQpyZW5hbWUgdG8gZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9jb25zdHJhaW50cy9CaXJ0aGRheS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9jb25zdHJhaW50cy9OYW1lLmphdmEgYi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2NvbnN0cmFpbnRzL05hbWUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vY29uc3RyYWludHMvTmFtZS5qYXZhCnJlbmFtZSB0byBleGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2NvbnN0cmFpbnRzL05hbWUuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhIGIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2RvbWFpbi9QZXJzb24uamF2YQpyZW5hbWUgdG8gZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEgYi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEKcmVuYW1lIHRvIGV4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0IGIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dApyZW5hbWUgdG8gZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0IGIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKcmVuYW1lIHRvIGV4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKcmVuYW1lIHRvIGV4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9tYWluLnRhZ2xpYi54bWwgYi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9tYWluLnRhZ2xpYi54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9tYWluLnRhZ2xpYi54bWwKcmVuYW1lIHRvIGV4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbApkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApyZW5hbWUgdG8gZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbCBiL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbApyZW5hbWUgdG8gZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwgYi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCnJlbmFtZSB0byBleGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwgYi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbApyZW5hbWUgdG8gZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbApkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sIGIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbApyZW5hbWUgdG8gZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sIGIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwKcmVuYW1lIHRvIGV4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vcG9tLnhtbCBiL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9wb20ueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3BvbS54bWwKcmVuYW1lIHRvIGV4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9wb20ueG1sCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlci5qYXZhIGIvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlci5qYXZhCnJlbmFtZSB0byBleGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YSBiL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKcmVuYW1lIHRvIGV4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YSBiL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvZG9tYWluL1BlcnNvbi5qYXZhCnJlbmFtZSB0byBleGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvZG9tYWluL1BlcnNvbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vTmFtZUNvbnN0cmFpbnQuamF2YSBiL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL05hbWVDb25zdHJhaW50LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9OYW1lQ29uc3RyYWludC5qYXZhCnJlbmFtZSB0byBleGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9OYW1lQ29uc3RyYWludC5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vTmFtZUNvbnN0cmFpbnRWYWxpZGF0b3IuamF2YSBiL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL05hbWVDb25zdHJhaW50VmFsaWRhdG9yLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9OYW1lQ29uc3RyYWludFZhbGlkYXRvci5qYXZhCnJlbmFtZSB0byBleGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9OYW1lQ29uc3RyYWludFZhbGlkYXRvci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvQWRtaW4uamF2YSBiL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL2dyb3VwL0FkbWluLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9BZG1pbi5qYXZhCnJlbmFtZSB0byBleGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9BZG1pbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvTmFtZS5qYXZhIGIvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvTmFtZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvTmFtZS5qYXZhCnJlbmFtZSB0byBleGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9OYW1lLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9Vc2VyLmphdmEgYi9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9Vc2VyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9Vc2VyLmphdmEKcmVuYW1lIHRvIGV4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL2dyb3VwL1VzZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGIvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbApyZW5hbWUgdG8gZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKcmVuYW1lIHRvIGV4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9ncm91cFZhbGlkYXRpb24wMS5qc3AgYi9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2dyb3VwVmFsaWRhdGlvbjAxLmpzcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvZ3JvdXBWYWxpZGF0aW9uMDEuanNwCnJlbmFtZSB0byBleGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2dyb3VwVmFsaWRhdGlvbjAxLmpzcApkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvZ3JvdXBWYWxpZGF0aW9uMDIuanNwIGIvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9ncm91cFZhbGlkYXRpb24wMi5qc3AKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2dyb3VwVmFsaWRhdGlvbjAyLmpzcApyZW5hbWUgdG8gZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9ncm91cFZhbGlkYXRpb24wMi5qc3AKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwIGIvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AKcmVuYW1lIHRvIGV4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcCBiL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKcmVuYW1lIHRvIGV4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9tb2RlbFZhbGlkYXRpb24wMS5qc3AgYi9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL21vZGVsVmFsaWRhdGlvbjAxLmpzcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvbW9kZWxWYWxpZGF0aW9uMDEuanNwCnJlbmFtZSB0byBleGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL21vZGVsVmFsaWRhdGlvbjAxLmpzcApkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvcmVzdWx0LmpzcCBiL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvcmVzdWx0LmpzcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvcmVzdWx0LmpzcApyZW5hbWUgdG8gZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9yZXN1bHQuanNwCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvaGVsbG9fd29ybGQvcG9tLnhtbCBiL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3BvbS54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sCnJlbmFtZSB0byBleGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEgYi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKcmVuYW1lIHRvIGV4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEgYi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKcmVuYW1lIHRvIGV4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCnJlbmFtZSB0byBleGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKcmVuYW1lIHRvIGV4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AgYi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AKcmVuYW1lIHRvIGV4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcApkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwIGIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCnJlbmFtZSB0byBleGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AgYi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AKcmVuYW1lIHRvIGV4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3BvbS54bWwgYi9leGFtcGxlcy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZjdkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9wb20ueG1sCkBAIC0wLDAgKzEsOTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPCEtLQ0KKyAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KKyAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCisgICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKw0KKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAgICB1bmRlciB0aGUgTGljZW5zZS4NCistLT4NCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCisNCisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCisNCisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KKyAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KKw0KKyAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIHByb2plY3Q8L25hbWU+DQorICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPg0KKw0KKyAgICA8cGFyZW50Pg0KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KKyAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtbW9kdWxlPC9hcnRpZmFjdElkPg0KKyAgICAgICAgPHZlcnNpb24+MS4xLjQtU05BUFNIT1Q8L3ZlcnNpb24+DQorICAgIDwvcGFyZW50Pg0KKw0KKyAgICA8YnVpbGQ+DQorICAgICAgICA8cGx1Z2lucz4NCisgICAgICAgICAgICA8cGx1Z2luPg0KKyAgICAgICAgICAgICAgICA8IS0tVGhpcyBwbHVnaW4gYWxsb3dzIHRvIHJ1biB0aGUgZXhhbXBsZSB1c2luZyBtdm4gamV0dHk6cnVuIC0tPg0KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4NCisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamV0dHktcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj42LjEuODwvdmVyc2lvbj4NCisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQorICAgICAgICAgICAgICAgICAgICA8c2NhbkludGVydmFsU2Vjb25kcz4xMDwvc2NhbkludGVydmFsU2Vjb25kcz4NCisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KKyAgICAgICAgICAgIDwvcGx1Z2luPg0KKyAgICAgICAgPC9wbHVnaW5zPg0KKyAgICA8L2J1aWxkPg0KKw0KKyAgICA8bW9kdWxlcz4NCisgICAgICAgIDxtb2R1bGU+aGVsbG9fd29ybGQ8L21vZHVsZT4NCisgICAgICAgIDxtb2R1bGU+aGVsbG9fYmVhbi12YWxpZGF0aW9uPC9tb2R1bGU+DQorICAgICAgICA8bW9kdWxlPmZlYXR1cmUtc2V0XzAxPC9tb2R1bGU+DQorICAgICAgICA8bW9kdWxlPmZlYXR1cmUtc2V0XzAyPC9tb2R1bGU+DQorICAgIDwvbW9kdWxlcz4NCisNCisgICAgPHByb2ZpbGVzPg0KKyAgICAgICAgPCEtLSBUaGlzIHByb2ZpbGUgaXMgaW52b2tlZCBieSAtRHByZXBhcmVSZWxlYXNlPXRydWUuICBUaGlzIGFsbG93cyBtdm4gcmVsZWFzZTpwcmVwYXJlIHRvDQorICAgICAgICAgICAgcnVuIHN1Y2Nlc3NmdWxseSBvbiB0aGUgYXNzZW1ibHkgcHJvamVjdHMuIC0tPg0KKyAgICAgICAgPHByb2ZpbGU+DQorICAgICAgICAgICAgPGlkPnByZXBhcmUtcmVsZWFzZTwvaWQ+DQorICAgICAgICAgICAgPGFjdGl2YXRpb24+DQorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4NCisgICAgICAgICAgICAgICAgICAgIDxuYW1lPnByZXBhcmVSZWxlYXNlPC9uYW1lPg0KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5Pg0KKyAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4NCisgICAgICAgICAgICA8bW9kdWxlcz4NCisgICAgICAgICAgICAgICAgPG1vZHVsZT5hc3NlbWJseTwvbW9kdWxlPg0KKyAgICAgICAgICAgIDwvbW9kdWxlcz4NCisgICAgICAgICAgICA8YnVpbGQ+DQorICAgICAgICAgICAgICAgIDxwbHVnaW5zPg0KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZWxlYXNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ3VtZW50cz4tRHByZXBhcmVSZWxlYXNlPC9hcmd1bWVudHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+DQorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4NCisgICAgICAgICAgICA8L2J1aWxkPg0KKyAgICAgICAgPC9wcm9maWxlPg0KKyAgICA8L3Byb2ZpbGVzPg0KKw0KKyAgICA8cHJvcGVydGllcz4NCisgICAgICAgIDx0cmluaWRhZC52ZXJzaW9uPjEuMC45PC90cmluaWRhZC52ZXJzaW9uPg0KKyAgICA8L3Byb3BlcnRpZXM+DQorDQorPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2Fzc2VtYmx5L3BvbS54bWwgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9hc3NlbWJseS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjU1ZjdkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2Fzc2VtYmx5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYXNzZW1ibHkxMjwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEFzc2VtYmx5PC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5NeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEFzc2VtYmx5IGlzIHVzZWQgdG8gZ2VuZXJhdGUgCi0gICAgLnppcCBhbmQgLnRhci5neiBkaXN0cmlidXRpb25zIDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9hc3NlbWJseTwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2Fzc2VtYmx5PC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9hc3NlbWJseTwvdXJsPgotICAgIDwvc2NtPgotICAgIAotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRlcGVuZGVuY3ktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktamF2YWRvYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZW5lcmljLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9qYXZhZG9jPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktc291cmNlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y29yZS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3NyYzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tIEVYRUNVVEUgbXZuIHBhY2thZ2UgdG8gZ2VuZXJhdGUgYXNzZW1ibHkgZmlsZXMgLS0+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfc3JjPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsMTItJHt2ZXJzaW9ufS1zcmM8L2ZpbmFsTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfYmluPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+JHtiYXNlZGlyfS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwxMi0ke3ZlcnNpb259LWJpbjwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L291dDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmF0dGFjaGVkPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y29yZS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPCEtLSBTaW5jZSBleHR2YWwgY291bGQgYmUgYXN5bmMgcmVsZWFzZWQsIGFuIGdlbmVyYXRlZCBhc3NlbWJseSBjb3VsZCBjb250YWluIGRpZmZlcmVudAotICAgICAgICAgYXJ0aWZhY3QgdmVyc2lvbnMgLS0+Ci0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxjb3JlLnZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L2NvcmUudmVyc2lvbj4KLSAgICAgICAgPHRyaW5pZGFkLXN1cHBvcnQudmVyc2lvbj4yLjAuMy1TTkFQU0hPVDwvdHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9uPgotICAgICAgICA8Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9uPgotICAgICAgICA8cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC9wcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWwgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2Nzk1Yi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPmNvcmViaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAJPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+UkVBRE1FKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+TElDRU5TRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPk5PVElDRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPlJFTEVBU0UqPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9qYXZhZG9jPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmphdmFkb2M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3Jlc3JjLnhtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTE4NmM2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+Y29yZXNyYzwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPiAgCi0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAJPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+UkVBRE1FKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+TElDRU5TRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPk5PVElDRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPlJFTEVBU0UqPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+ICAgCi0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9zcmM8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+c3JjPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgotIApkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDViM2E1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5YmRiMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IKLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWQ3ZTk4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4yLjAuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+Y29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5mYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4wLWIxMTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5jZ2xpYjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZ2xpYjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjFfMzwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cmVzb3VyY2VzPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICA8L3Jlc291cmNlcz4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDYzZTYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+DQotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMuc3RhcnR1cC5HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyDQotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJLaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZiNTU4YS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyS2l0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLQ0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kSW50ZXJjZXB0b3I7DQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5FbmhhbmNlcjsNCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZFByb3h5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbEdlbmVyaWNSZW5kZXJLaXQgZXh0ZW5kcyBFeHRWYWxSZW5kZXJLaXQgaW1wbGVtZW50cyBNZXRob2RJbnRlcmNlcHRvcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBSZW5kZXJLaXQgbmV3SW5zdGFuY2UoUmVuZGVyS2l0IHJlbmRlcktpdCkNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gcmVuZGVyS2l0LmdldENsYXNzKCk7DQotDQotICAgICAgICAvL2l0J3Mgbm90IHBvc3NpYmxlIHRvIHdyYXAgdGhlIGNvbnZlcnRlciBhZ2FpbiAtIG9jY3VycyBlLmcuIHVuZGVyIHNvbGFyaXMgKyBiZWEgd2VibG9naWMNCi0gICAgICAgIGlmIChjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCIkJEVuaGFuY2VyQnlDR0xJQiQkIikNCi0gICAgICAgICAgICB8fCBjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCIkJEZhc3RDbGFzc0J5Q0dMSUIkJCIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZW5kZXJLaXQ7DQotICAgICAgICB9DQotDQotICAgICAgICBFbmhhbmNlciBlbmhhbmNlciA9IG5ldyBFbmhhbmNlcigpOw0KLSAgICAgICAgZW5oYW5jZXIuc2V0U3VwZXJjbGFzcyhyZW5kZXJLaXQuZ2V0Q2xhc3MoKSk7DQotICAgICAgICBlbmhhbmNlci5zZXRDYWxsYmFjayhuZXcgRXh0VmFsR2VuZXJpY1JlbmRlcktpdChyZW5kZXJLaXQpKTsNCi0NCi0gICAgICAgIHJldHVybiAoUmVuZGVyS2l0KSBlbmhhbmNlci5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGludGVyY2VwdChPYmplY3Qgb2JqLCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzLCBNZXRob2RQcm94eSBwcm94eSkgdGhyb3dzIFRocm93YWJsZQ0KLSAgICB7DQotICAgICAgICBpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0UmVuZGVyZXIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZXIoKFN0cmluZylhcmdzWzBdLCAoU3RyaW5nKWFyZ3NbMV0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiYWRkUmVuZGVyZXIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRSZW5kZXJlcigoU3RyaW5nKWFyZ3NbMF0sIChTdHJpbmcpYXJnc1sxXSwgKFJlbmRlcmVyKWFyZ3NbMl0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBwcm94eS5pbnZva2VTdXBlcihvYmosIGFyZ3MpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEV4dFZhbEdlbmVyaWNSZW5kZXJLaXQoUmVuZGVyS2l0IHdyYXBwZWQpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKHdyYXBwZWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgY3JlYXRlV3JhcHBlcihSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIubmV3SW5zdGFuY2UocmVuZGVyZXIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTBkNjIyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyV3JhcHBlcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZEludGVyY2VwdG9yOwotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5FbmhhbmNlcjsKLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kUHJveHk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBmaW5hbCBjbGFzcyBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyIGV4dGVuZHMgRXh0VmFsUmVuZGVyZXJXcmFwcGVyIGltcGxlbWVudHMgTWV0aG9kSW50ZXJjZXB0b3IKLXsKLSAgICBwdWJsaWMgc3RhdGljIFJlbmRlcmVyIG5ld0luc3RhbmNlKFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gcmVuZGVyZXIuZ2V0Q2xhc3MoKTsKLQotICAgICAgICAvL3RvIGF2b2lkIHJlLXdyYXBwaW5nIC0gb2NjdXJzIGUuZy4gdW5kZXIgc29sYXJpcyArIGJlYSB3ZWJsb2dpYwotICAgICAgICBpZiAoY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRFbmhhbmNlckJ5Q0dMSUIkJCIpIHx8Ci0gICAgICAgICAgICBjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCIkJEZhc3RDbGFzc0J5Q0dMSUIkJCIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBFbmhhbmNlciBlbmhhbmNlciA9IG5ldyBFbmhhbmNlcigpOwotICAgICAgICBlbmhhbmNlci5zZXRTdXBlcmNsYXNzKHJlbmRlcmVyLmdldENsYXNzKCkpOwotICAgICAgICBlbmhhbmNlci5zZXRDYWxsYmFjayhuZXcgRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlcihyZW5kZXJlcikpOwotCi0gICAgICAgIHJldHVybiAoUmVuZGVyZXIpIGVuaGFuY2VyLmNyZWF0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgaW50ZXJjZXB0KE9iamVjdCBvYmosIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MsIE1ldGhvZFByb3h5IHByb3h5KSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldENvbnZlcnRlZFZhbHVlIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29udmVydGVkVmFsdWUoKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSwgYXJnc1syXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImRlY29kZSIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZGVjb2RlKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJlbmNvZGVCZWdpbiIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlQmVnaW4oKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImVuY29kZUNoaWxkcmVuIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGVDaGlsZHJlbigoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZW5jb2RlRW5kIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGVFbmQoKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImNvbnZlcnRDbGllbnRJZCIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0Q2xpZW50SWQoKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoU3RyaW5nKWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJnZXRSZW5kZXJzQ2hpbGRyZW4iKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJtZXRob2QgIiArIG1ldGhvZC5nZXROYW1lKCkgKyAiIGNhbGxlZCB3aXRob3V0IHJlbmRlcmluZy1pbnRlcmNlcHRvcnMiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHByb3h5Lmludm9rZVN1cGVyKG9iaiwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEV4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIoUmVuZGVyZXIgd3JhcHBlZCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKHdyYXBwZWQpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOTE3ZTYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0dlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkNCi17DQotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImV4dHZhbCByZW5kZXJraXQgd3JhcHBlciBjcmVhdGVkIGZvciAiICsgcmVuZGVyS2l0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB2aWEgY2dsaWIiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBFeHRWYWxHZW5lcmljUmVuZGVyS2l0Lm5ld0luc3RhbmNlKHJlbmRlcktpdCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9zdGFydHVwL0dlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhjN2I0MS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9zdGFydHVwL0dlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0LkdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEdlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKS5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5SRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmNsYXNzKS5hZGRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeShuZXcgR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTlhOGU4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZSBwcm92aWRlcyBnZW5lcmljIFN1cHBvcnQgZm9yIEpTRiBjb21wb25lbnQgZnJhbWV3b3JrcyB3aGljaCBoYXZlIHNwZWNpYWwgcmVxdWlyZW1lbnRzIChlLmcuIFJpY2hGYWNlcywgTXlGYWNlcyBUb2JhZ28sIC4uLikuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLjEueCBhbmQgSlNGIDEuMi54LiBCb3RoIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMzMyMDEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0NCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBDb21wb25lbnQtU3VwcG9ydCBNb2R1bGVzPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4yLjAuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPHNjbT4NCi0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvbXBvbmVudC1zdXBwb3J0PC9jb25uZWN0aW9uPg0KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvbXBvbmVudC1zdXBwb3J0PC9kZXZlbG9wZXJDb25uZWN0aW9uPg0KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvY29tcG9uZW50LXN1cHBvcnQ8L3VybD4NCi0gICAgPC9zY20+DQotDQotICAgIDxtb2R1bGVzPg0KLSAgICAgICAgPG1vZHVsZT50cmluaWRhZC1zdXBwb3J0PC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPmdlbmVyaWMtc3VwcG9ydDwvbW9kdWxlPg0KLSAgICA8L21vZHVsZXM+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjAuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8cHJvcGVydGllcz4NCi0gICAgICAgIDx0cmluaWRhZC52ZXJzaW9uPjEuMi45PC90cmluaWRhZC52ZXJzaW9uPg0KLSAgICA8L3Byb3BlcnRpZXM+DQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhjZGI5YS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZTwvbmFtZT4NCi0gICAgPHZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjAuMC1iMTE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cmVzb3VyY2VzPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICA8L3Jlc291cmNlcz4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk4YjJiYi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+DQotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0YXJ0dXAuVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXINCi0gICAgICAgIDwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLQ0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPg0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyDQotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUwZWI2OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkNsaWVudFZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotLyoqDQotICogaW4gY2FzZSBvZiBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIGEgdHJpbmlkYWQgY2xpZW50IHZhbGlkYXRvciBpcyBhZGRlZCB0byB0aGUgY29tcG9uZW50IGJhc2VkIG9uIHRoZSBtZXRhLWRhdGEuDQotICogYXQgdGhlIHBvc3RiYWNrOiB0aGUgZXh0dmFsIHZhbGlkYXRpb24gc3RyYXRlZ3kgZ2V0cyBjYWxsZWQgYW5kIGFmdGVyIHRoYXQgdGhlIGFkZGVkIHZhbGlkYXRvci4NCi0gKiB0aGlzIHdyYXBwZXIgcHJldmVudHMgc3VjaCBhIHNlcnZlci1zaWRlIGRvdWJsZSB2YWxpZGF0aW9uLg0KLSAqIGl0IGp1c3QgZGVsZWdhdGVzIHRoZSBjbGllbnQtc2lkZSBmdW5jdGlvbmFsaXR5Lg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyIGltcGxlbWVudHMgVmFsaWRhdG9yLCBDbGllbnRWYWxpZGF0b3IsIFNlcmlhbGl6YWJsZQ0KLXsNCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgQ2xpZW50VmFsaWRhdG9yIHdyYXBwZWQ7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE0MTQ1NDc4NDE3MDA2MjE0MTBMOw0KLQ0KLSAgICBwdWJsaWMgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKENsaWVudFZhbGlkYXRvciBjbGllbnRWYWxpZGF0b3IpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IGNsaWVudFZhbGlkYXRvcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCB2YWxpZGF0ZSAtIHRoZSBleHR2YWwgdmFsaWRhdGlvbiBzdHJhdGVneSB3aWxsIGRvIHRoYXQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudExpYnJhcnlTb3VyY2UoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q2xpZW50TGlicmFyeVNvdXJjZShmYWNlc0NvbnRleHQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0Q2xpZW50SW1wb3J0TmFtZXMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRDbGllbnRJbXBvcnROYW1lcygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50U2NyaXB0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRDbGllbnRTY3JpcHQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRDbGllbnRWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYmMxOTQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQuRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSB0aGlzIHBoYXNlLWxpc3RlbmVyIGluc3RlYWQgb2YgYSBFeHRWYWxUcmluaWRhZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGR1ZSB0byBhIHRyaW5pZGFkIGlzc3VlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICAgICAgaWYoZXZlbnQuZ2V0UGhhc2VJZCgpICE9IFBoYXNlSWQuQVBQTFlfUkVRVUVTVF9WQUxVRVMgJiYgZXZlbnQuZ2V0UGhhc2VJZCgpICE9IFBoYXNlSWQuUkVOREVSX1JFU1BPTlNFKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnkgPSAoUmVuZGVyS2l0RmFjdG9yeSkNCi0gICAgICAgICAgICBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRmFjdG9yeUZpbmRlci5SRU5ERVJfS0lUX0ZBQ1RPUlkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlbmRlcktpdElkID0gZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZ2V0UmVuZGVyS2l0SWQoKTsNCi0NCi0gICAgICAgIGlmKEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LklELmVxdWFscyhyZW5kZXJLaXRJZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUmVuZGVyS2l0IHJlbmRlcktpdCA9IHJlbmRlcktpdEZhY3RvcnkuZ2V0UmVuZGVyS2l0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgcmVuZGVyS2l0SWQpOw0KLSAgICAgICAgcmVuZGVyS2l0RmFjdG9yeS5hZGRSZW5kZXJLaXQoRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuSUQsIG5ldyBFeHRWYWxUcmluaWRhZFJlbmRlcktpdChyZW5kZXJLaXQpKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLnNldFJlbmRlcktpdElkKEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LklEKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuUkVOREVSX1JFU1BPTlNFOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTBjYjc0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcmVuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgLyoNCi0gICAgICogZGVhY3RpdmF0ZQ0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0NMSUVOVF9TSURFX1RSSU5JREFEX1ZBTElEQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfQ0xJRU5UX1NJREVfVFJJTklEQURfVkFMSURBVElPTiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfVFJJTklEQURfQ09SRV9PVVRQVVRfTEFCRUxfSU5JVElBTElaQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfVFJJTklEQURfQ09SRV9PVVRQVVRfTEFCRUxfSU5JVElBTElaQVRJT04iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX1RSSU5JREFEX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1RSSU5JREFEX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SIik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0RvdWJsZVJhbmdlSW5pdGlhbGl6ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0RvdWJsZVJhbmdlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIzMjlmNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuRG91YmxlUmFuZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5DbGllbnRWYWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBEb3VibGVSYW5nZUluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBib29sZWFuIGluZm9ybWF0aW9uQWRkZWQgPSBmYWxzZTsKLSAgICAgICAgRG91YmxlUmFuZ2VWYWxpZGF0b3IgZG91YmxlUmFuZ2VWYWxpZGF0b3IgPSAoRG91YmxlUmFuZ2VWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkRvdWJsZVJhbmdlIik7Ci0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTik7Ci0KLSAgICAgICAgICAgIGlmKG1pbiBpbnN0YW5jZW9mIERvdWJsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKChEb3VibGUpbWluKTsKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpOwotCi0gICAgICAgICAgICBpZihtYXhMZW5ndGggaW5zdGFuY2VvZiBEb3VibGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bSgoRG91YmxlKW1heExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKGluZm9ybWF0aW9uQWRkZWQgJiYKLSAgICAgICAgICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvciBpbnN0YW5jZW9mIENsaWVudFZhbGlkYXRvciAmJiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpZG91YmxlUmFuZ2VWYWxpZGF0b3IpKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9MZW5ndGhJbml0aWFsaXplci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0MTIyNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9MZW5ndGhJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBMZW5ndGhJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7Ci0gICAgICAgIC8vVE9ETwotICAgICAgICBMZW5ndGhWYWxpZGF0b3IgbGVuZ3RoVmFsaWRhdG9yID0gKExlbmd0aFZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTGVuZ3RoIik7Ci0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbWluID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIKTsKLQotICAgICAgICAgICAgaWYobWluIGluc3RhbmNlb2YgSW50ZWdlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWluaW11bSgoSW50ZWdlciltaW4pOwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKTsKLQotICAgICAgICAgICAgaWYobWF4TGVuZ3RoIGluc3RhbmNlb2YgSW50ZWdlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudC5nZXRDbGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldE1heGltdW1MZW5ndGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LmNsYXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhMZW5ndGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWF4aW11bSgoSW50ZWdlciltYXhMZW5ndGgpOwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9yZUluaXRWYWxpZGF0b3JzKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50LCBtZXRhRGF0YSk7IC8vc2VhcmNoIHdyYXBwZXJzIGFuZCBjYWxsIC5kZWFjdGl2YXRlCi0KLSAgICAgICAgaWYoaW5mb3JtYXRpb25BZGRlZCAmJiBsZW5ndGhWYWxpZGF0b3IgaW5zdGFuY2VvZiBDbGllbnRWYWxpZGF0b3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIoKENsaWVudFZhbGlkYXRvcilsZW5ndGhWYWxpZGF0b3IpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgQ29yZU91dHB1dExhYmVsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxlbmd0aFZhbGlkYXRvci5nZXRNaW5pbXVtKCkgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChDb3JlT3V0cHV0TGFiZWwpdWlDb21wb25lbnQpLnNldFNob3dSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Mb25nUmFuZ2VJbml0aWFsaXplci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTG9uZ1JhbmdlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVjMzRkZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Mb25nUmFuZ2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkxvbmdSYW5nZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkNsaWVudFZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJza2lwVmFsaWRhdGlvblN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24iKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIExvbmdSYW5nZUluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBib29sZWFuIGluZm9ybWF0aW9uQWRkZWQgPSBmYWxzZTsKLSAgICAgICAgTG9uZ1JhbmdlVmFsaWRhdG9yIGxvbmdSYW5nZVZhbGlkYXRvciA9IChMb25nUmFuZ2VWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkxvbmdSYW5nZSIpOwotCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbWluID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pOwotCi0gICAgICAgICAgICBpZihtaW4gaW5zdGFuY2VvZiBMb25nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKChMb25nKW1pbik7Ci0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1heExlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYKTsKLQotICAgICAgICAgICAgaWYobWF4TGVuZ3RoIGluc3RhbmNlb2YgTG9uZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bSgoTG9uZyltYXhMZW5ndGgpOwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoaW5mb3JtYXRpb25BZGRlZCAmJgotICAgICAgICAgICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvciBpbnN0YW5jZW9mIENsaWVudFZhbGlkYXRvciAmJiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIoKENsaWVudFZhbGlkYXRvcilsb25nUmFuZ2VWYWxpZGF0b3IpKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9QYXR0ZXJuSW5pdGlhbGl6ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1BhdHRlcm5Jbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmYwODhkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1BhdHRlcm5Jbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLlJlZ0V4cFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkNsaWVudFZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJza2lwVmFsaWRhdGlvblN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24iKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIFBhdHRlcm5Jbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYoIW1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gcGF0dGVybnMgPSAoU3RyaW5nW10pbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOKTsKLQotICAgICAgICBSZWdFeHBWYWxpZGF0b3IgcmVnRXhwVmFsaWRhdG9yOwotCi0gICAgICAgIGZvcihTdHJpbmcgcGF0dGVybiA6IHBhdHRlcm5zKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWdFeHBWYWxpZGF0b3IgPSAoUmVnRXhwVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuUmVnRXhwIik7Ci0KLSAgICAgICAgICAgIHJlZ0V4cFZhbGlkYXRvci5zZXRQYXR0ZXJuKHBhdHRlcm4pOwotICAgICAgICAgICAgcmVnRXhwVmFsaWRhdG9yLnNldE1lc3NhZ2VEZXRhaWxOb01hdGNoKChTdHJpbmcpbWV0YURhdGEuZ2V0KAotICAgICAgICAgICAgICAgIENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRSkpOwotCi0gICAgICAgICAgICBpZihyZWdFeHBWYWxpZGF0b3IgaW5zdGFuY2VvZiBDbGllbnRWYWxpZGF0b3IgJiYgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKXJlZ0V4cFZhbGlkYXRvcikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1JlcXVpcmVkSW5pdGlhbGl6ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1JlcXVpcmVkSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYzZDEzNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnV0aWwuVHJpbmlkYWRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBSZXF1aXJlZEluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpIHx8Ci0gICAgICAgICAgIG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKXx8Ci0gICAgICAgICAgIG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigoCi0gICAgICAgICAgICAgICAgICghQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpICYmCi0gICAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQpKSkgfHwKLSAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpCi0gICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGlzQ29tcG9uZW50UmVxdWlyZWQodWlDb21wb25lbnQpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIENvcmVPdXRwdXRMYWJlbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgoQ29yZU91dHB1dExhYmVsKXVpQ29tcG9uZW50KS5zZXRTaG93UmVxdWlyZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJgotICAgICAgICAgICAgICAgICAgICFCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBCb29sZWFuIGlzQ29tcG9uZW50UmVxdWlyZWQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIENvcmVPdXRwdXRMYWJlbCkKLSAgICAgICAgewotICAgICAgICAgICAgdWlDb21wb25lbnQgPSBUcmluaWRhZFV0aWxzLmZpbmRMYWJlbGVkRWRpdGFibGVDb21wb25lbnQoKENvcmVPdXRwdXRMYWJlbCkgdWlDb21wb25lbnQpOwotCi0gICAgICAgICAgICBpZih1aUNvbXBvbmVudCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy9jb21wYXJlIHdpdGggZmFsc2Ugc28gdHJ1ZSA9IHRydWUgb3IgbnVsbAotICAgICAgICBib29sZWFuIGlzUmVhZE9ubHkgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzUmVhZE9ubHkiKSkpOwotICAgICAgICBib29sZWFuIGlzRGlzYWJsZWQgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzRGlzYWJsZWQiKSkpOwotCi0gICAgICAgIHJldHVybiAhKGlzUmVhZE9ubHkgfHwgaXNEaXNhYmxlZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTMxMDhjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1RyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb250ZXh0LlJlcXVlc3RDb250ZXh0OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dFRleHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX0RBVEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dERhdGUiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyPiBjb21wb25lbnRJbml0aWFsaXplcnMgPQotICAgICAgICBuZXcgQXJyYXlMaXN0PFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXI+KCk7Ci0KLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFJlcXVpcmVkSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IExlbmd0aEluaXRpYWxpemVyKCkpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBMb25nUmFuZ2VJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgRG91YmxlUmFuZ2VJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgUGF0dGVybkluaXRpYWxpemVyKCkpOwotICAgICAgICAvL2NvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFZhbGlkYXRvckluaXRpYWxpemVyKCkpOwotICAgIH0KLQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTE9XLCBkZXNjcmlwdGlvbiA9ICJjaGVjayBwcHIgaXNzdWUiKQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGZvcihUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyIDogY29tcG9uZW50SW5pdGlhbGl6ZXJzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihjb21wb25lbnRJbml0aWFsaXplci5jb25maWd1cmVUcmluaWRhZENvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQ29tcG9uZW50KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVC5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpIHx8Ci0gICAgICAgICAgICAgICBUUklOSURBRF9DT1JFX0lOUFVUX0RBVEUuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYoUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuaXNQYXJ0aWFsUmVxdWVzdChmYWNlc0NvbnRleHQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXF1ZXN0Q29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5hZGRQYXJ0aWFsVGFyZ2V0KHVpQ29tcG9uZW50LmdldFBhcmVudCgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVmFsaWRhdG9ySW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4ODc4Yy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24odmFsdWUgPSBVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gImltcGwuIHRyaW5pZGFkIGUtbWFpbCB2YWxpZGF0b3IiKQotY2xhc3MgVmFsaWRhdG9ySW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCFtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuQ1VTVE9NKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00pOwotCi0gICAgICAgIGlmKCEodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKE9iamVjdCBjdXJyZW50VmFsdWUgOiAoTGlzdCl2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIShjdXJyZW50VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihDb21tb25NZXRhRGF0YUtleXMuRU1BSUwuZXF1YWxzKGN1cnJlbnRWYWx1ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9UT0RPCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU2N2NmOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudXRpbC5UcmluaWRhZFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yIGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yDQotew0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkNCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYoZmlsdGVyQ29yZU91dHB1dExhYmVsKHVpQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0Q29yZU91dHB1dExhYmVsKGZhY2VzQ29udGV4dCwgKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGZpbHRlckNvcmVPdXRwdXRMYWJlbChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIENvcmVPdXRwdXRMYWJlbCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdENvcmVPdXRwdXRMYWJlbChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBDb3JlT3V0cHV0TGFiZWwgY29yZU91dHB1dExhYmVsKQ0KLSAgICB7DQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLQ0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgYW5ub3RhdGlvbkV4dHJhY3RvciA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKS5nZXRGYWN0b3J5KA0KLSAgICAgICAgICAgIEZhY3RvcnlOYW1lcy5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLCBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuY2xhc3MpLmNyZWF0ZSgpOw0KLQ0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gVHJpbmlkYWRVdGlscy5maW5kTGFiZWxlZEVkaXRhYmxlQ29tcG9uZW50KGNvcmVPdXRwdXRMYWJlbCk7DQotDQotICAgICAgICBpZih0YXJnZXRDb21wb25lbnQgPT0gbnVsbCB8fCAhaXNDb21wb25lbnRFZGl0YWJsZSh0YXJnZXRDb21wb25lbnQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEJvb2xlYW4gc2tpcEluaXRpYWxpemF0aW9uID0gZmFsc2U7DQotDQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhOw0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogYW5ub3RhdGlvbkV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgdGFyZ2V0Q29tcG9uZW50KS5nZXRNZXRhRGF0YUVudHJpZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IEV4dFZhbFV0aWxzLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZihtZXRhRGF0YSA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vZXhlY3V0ZSBza2lwIHZhbGlkYXRpb24gc3RyYXRlZ3kgLT4gc2tpcCB2YWxpZGF0aW9uIHkvbiBpbiBlbnRyeQ0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdGFyZ2V0Q29tcG9uZW50LCBlbnRyeSwgbnVsbCk7DQotICAgICAgICAgICAgICAgICAgICBza2lwSW5pdGlhbGl6YXRpb24gPSBlbnRyeS5nZXRQcm9wZXJ0eShDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCBCb29sZWFuLmNsYXNzKTsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMoc2tpcEluaXRpYWxpemF0aW9uKSAmJiAhbWV0YURhdGEuaXNFbXB0eSgpICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuaXNTa2lwYWJsZVZhbGlkYXRpb25TdHJhdGVneSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhLnB1dChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCB0cnVlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZighbWV0YURhdGEuaXNFbXB0eSgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoZmFjZXNDb250ZXh0LCBjb3JlT3V0cHV0TGFiZWwsIG1ldGFEYXRhKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDb21wb25lbnRFZGl0YWJsZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgLy9jb21wYXJlIHdpdGggZmFsc2Ugc28gdHJ1ZSA9IHRydWUgb3IgbnVsbA0KLSAgICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNSZWFkT25seSIpKSk7DQotICAgICAgICBib29sZWFuIGlzRGlzYWJsZWQgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc0Rpc2FibGVkIikpKTsNCi0NCi0gICAgICAgIHJldHVybiAhKGlzUmVhZE9ubHkgfHwgaXNEaXNhYmxlZCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWMyNjk1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5MYWJlbGVkTWVzc2FnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbnRleHQuUmVxdWVzdENvbnRleHQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dFRleHQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUuaW5wdXQuQ29yZUlucHV0RGF0ZSI7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICB7DQotICAgICAgICByZWZyZXNoQ29tcG9uZW50KHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCk7DQotDQotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gZ2V0TGFiZWwodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgICAgIGlmKGxhYmVsID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsYWJlbCA9IHVpQ29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vb3ZlcnJpZGUgdGhlIGxhYmVsIGlmIHRoZSBhbm5vdGF0aW9uIHByb3ZpZGVzIGEgbGFiZWwNCi0gICAgICAgICAgICBpZihtZXRhRGF0YUVudHJ5ICE9IG51bGwgJiYgbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxhYmVsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCwgU3RyaW5nLmNsYXNzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYoZmFjZXNNZXNzYWdlIGluc3RhbmNlb2YgTGFiZWxlZE1lc3NhZ2UpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAoKExhYmVsZWRNZXNzYWdlKWZhY2VzTWVzc2FnZSkuc2V0TGFiZWxUZXh0KGxhYmVsKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy9pZiBzb21lb25lIHVzZXMgYSBub3JtYWwgZmFjZXMgbWVzc2FnZQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvUGxhY2VMYWJlbChmYWNlc01lc3NhZ2UsIGxhYmVsLCBpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZWZyZXNoQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZihSZXF1ZXN0Q29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5pc1BhcnRpYWxSZXF1ZXN0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuYWRkUGFydGlhbFRhcmdldCh1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVC5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpIHx8DQotICAgICAgICAgICAgICAgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFLmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGFiZWwoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoU3RyaW5nKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCh1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJnZXRMYWJlbCIpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RiNDVlOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcktpdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuUmVuZGVyS2l0RGVjb3JhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuY29yZS5Db3JlUmVuZGVyS2l0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZXNwb25zZVN0YXRlTWFuYWdlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVdyaXRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5Xcml0ZXI7DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0IGV4dGVuZHMgUmVuZGVyS2l0RGVjb3JhdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgRXh0VmFsUmVuZGVyS2l0IGV4dFZhbFJlbmRlcktpdDsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiRVhUVkFMX1RSSU5JREFEX1JFTkRFUktJVCI7DQotDQotICAgIHB1YmxpYyBFeHRWYWxUcmluaWRhZFJlbmRlcktpdChSZW5kZXJLaXQgd3JhcHBlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5leHRWYWxSZW5kZXJLaXQgPSBuZXcgRXh0VmFsUmVuZGVyS2l0KHdyYXBwZWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlLCBSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5leHRWYWxSZW5kZXJLaXQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIHJlbmRlcmVyKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFJlbmRlcmVyIGdldFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5nZXRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBSZXNwb25zZVN0YXRlTWFuYWdlciBnZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5nZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUmVzcG9uc2VXcml0ZXIgY3JlYXRlUmVzcG9uc2VXcml0ZXIoV3JpdGVyIHdyaXRlciwgU3RyaW5nIHMsIFN0cmluZyBzMSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmNyZWF0ZVJlc3BvbnNlV3JpdGVyKHdyaXRlciwgcywgczEpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdHJlYW0gY3JlYXRlUmVzcG9uc2VTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmNyZWF0ZVJlc3BvbnNlU3RyZWFtKG91dHB1dFN0cmVhbSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZWNvcmF0ZWRSZW5kZXJLaXRJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBDb3JlUmVuZGVyS2l0LkJBU0VfUkVOREVSX0tJVF9JRDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjI3MDFmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnJlbmRlcmtpdC5jb3JlLnhodG1sLnRhYmxlLlRhYmxlUmVuZGVyaW5nQ29udGV4dDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIHNvbHV0aW9uIGZvciB0cmluaWRhZCB0YWJsZSByZW5kZXJlciBpc3N1ZSAoaW4gY29ubmVjdGlvbiB3aXRoIGRvdWJsZSBjYWxsIHByZXZlbnRpb24gcHJveGllcykNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1wdWJsaWMgY2xhc3MgRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5IGV4dGVuZHMgRXh0VmFsUmVuZGVyZXJQcm94eQ0KLXsNCi0gICAgcHVibGljIEV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgc3VwZXIocmVuZGVyZXIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wdGlvbmFsS2V5KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZihUYWJsZVJlbmRlcmluZ0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gInwiICsgVGFibGVSZW5kZXJpbmdDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFJlbmRlclN0YWdlKCkuZ2V0U3RhZ2UoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAiIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmRlY2I0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQuVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnZhbGlkYXRpb24ubWVzc2FnZS5UcmluaWRhZEZhY2VzTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQuRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3IuVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvci5UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBhbHRlcm5hdGl2ZSBhcHByb2FjaCBmb3IgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFRyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBpbml0VHJpbmlkYWRTdXBwb3J0KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRUcmluaWRhZFN1cHBvcnQoKQ0KLSAgICB7DQotICAgICAgICAvL2RlYWN0aXZhdGUgZGVmYXVsdCBhcHByb2FjaA0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpLmRlYWN0aXZhdGUoKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIGRlYWN0aXZhdGVDbGllbnRTaWRlVmFsaWRhdGlvbiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NMSUVOVF9TSURFX1RSSU5JREFEX1ZBTElEQVRJT047DQotDQotICAgICAgICBpZihkZWFjdGl2YXRlQ2xpZW50U2lkZVZhbGlkYXRpb24gPT0gbnVsbCB8fCAhZGVhY3RpdmF0ZUNsaWVudFNpZGVWYWxpZGF0aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBkZWFjdGl2YXRlSW5pdENvcmVPdXRwdXRMYWJlbCA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX1RSSU5JREFEX0NPUkVfT1VUUFVUX0xBQkVMX0lOSVRJQUxJWkFUSU9OOw0KLQ0KLSAgICAgICAgaWYoZGVhY3RpdmF0ZUluaXRDb3JlT3V0cHV0TGFiZWwgPT0gbnVsbCB8fCAhZGVhY3RpdmF0ZUluaXRDb3JlT3V0cHV0TGFiZWwuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIGRlYWN0aXZhdGVUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA9DQotICAgICAgICAgICAgICAgIFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX1RSSU5JREFEX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SOw0KLQ0KLSAgICAgICAgaWYoZGVhY3RpdmF0ZVRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yID09IG51bGwgfHwNCi0gICAgICAgICAgICAgICAgIWRlYWN0aXZhdGVUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKG5ldyBUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vZGVhY3RpdmF0ZSBleHR2YWwgcmVuZGVyZXIgcHJveHkgLSBkdWUgdG8gYW4gaW5jb21wYXRpYmlsaXR5IHdpdGggdGhlIHRhYmxlIHJlbmRlcmVyDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVksIEV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY3RvcnlOYW1lcy5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkubmFtZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIGlmIHRoZXJlIGFyZSBmdXJ0aGVyIGluY29tcGF0aWJsZSByZW5kZXJlcnMgdXNlIHRoZSBmb2xsb3dpbmcgcXVpY2stZml4Og0KLSAgICAgICAgICogICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVksIG51bGwpOw0KLSAgICAgICAgICAgYXR0ZW50aW9uOiBpdCBjYXVzZXMgZGlyZWN0IGRlbGVnYXRpb24gd2l0aG91dCBhIGNoZWNrIG9mIGRvdWJsZSBpbnZvY2F0aW9ucw0KLSAgICAgICAgICovDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC91dGlsL1RyaW5pZGFkVXRpbHMuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdXRpbC9UcmluaWRhZFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1N2FlZTkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC91dGlsL1RyaW5pZGFkVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImNoZWNrIHN1YmZvcm0iKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZFV0aWxzDQotew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhUcmluaWRhZFV0aWxzLmNsYXNzKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBVSUNvbXBvbmVudCBmaW5kTGFiZWxlZEVkaXRhYmxlQ29tcG9uZW50KENvcmVPdXRwdXRMYWJlbCBjb3JlT3V0cHV0TGFiZWwpDQotICAgIHsNCi0gICAgICAgIC8vVE9ETw0KLSAgICAgICAgaWYoY29yZU91dHB1dExhYmVsLmdldEZvcigpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgVUlDb21wb25lbnQgcmVzdWx0ID0gZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZmluZENvbXBvbmVudChjb3JlT3V0cHV0TGFiZWwuZ2V0Rm9yKCkpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoTE9HLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgTE9HLnRyYWNlKGNvcmVPdXRwdXRMYWJlbC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpICsgIiBkb2Vzbid0IHJlZmVyZW5jZSBhbiBlZGl0YWJsZSBjb21wb25lbnQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYzIxY2MuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFRyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeSBleHRlbmRzIERlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5DQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNMYWJlbGVkRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2UgaW5zdGFuY2VvZiBUcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2UgY3JlYXRlKEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlKHNldmVyaXR5LCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMWFhMWMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudXRpbC5MYWJlbGVkRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5MYWJlbGVkTWVzc2FnZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBUcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UgZXh0ZW5kcyBMYWJlbGVkRmFjZXNNZXNzYWdlIGltcGxlbWVudHMgTGFiZWxlZE1lc3NhZ2UNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYzNTY4MDA2ODk5NjE1MDUxNTRMOw0KLQ0KLSAgICBwdWJsaWMgVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlKFNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgc3VwZXIoc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TGFiZWxBc1N0cmluZyhGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldExhYmVsKGxhYmVsKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzRiYThhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlIHByb3ZpZGVzIHNwZWNpYWwgVHJpbmlkYWQgU3VwcG9ydCBmb3IgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvci4NCi0gICAgRnVydGhlcm1vcmUsIGl0IGFsbG93cyB0byBqb2luIHRoZSBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIG1lY2hhbmlzbSBvZiBUcmluaWRhZC4gU2FtcGxlIHVzZS1jYXNlOiBhbm5vdGF0ZSB5b3VyIG1vZGVsIHdpdGggSlBBIDEuMCBhbm5vdGF0aW9ucywgYmluZCBwcm9wZXJ0aWVzIHRvIEpTRiBJbnB1dCBjb21wb25lbnRzIGFuZCBnZXQgYXV0b21hdGljIGNsaWVudC1zaWRlIHZhbGlkYXRpb24ganVzdCBieSBhZGRpbmcgMyBKQVIgZmlsZXMgKE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSwgUHJvcGVydHkgVmFsaWRhdGlvbiBhbmQgVHJpbmlkYWQgU3VwcG9ydCkuDQotICANCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEuMS54IGFuZCBKU0YgMS4yLnguIEJvdGggdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZlMTY5My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQ29yZTwvbmFtZT4NCi0gICAgPHZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+DQotDQotICAgIDxzY20+DQotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9jb3JlPC9jb25uZWN0aW9uPg0KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvcmU8L2RldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9jb3JlPC91cmw+DQotICAgIDwvc2NtPg0KLSAgICANCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjAuMC1iMTE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxyZXNvdXJjZXM+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgIDwvcmVzb3VyY2VzPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ0ZGM0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4NCi0gICAgPGZhY3Rvcnk+DQotICAgICAgICA8cmVuZGVyLWtpdC1mYWN0b3J5Pm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXRGYWN0b3J5PC9yZW5kZXIta2l0LWZhY3Rvcnk+DQotICAgIDwvZmFjdG9yeT4NCi0NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkV4dFZhbFN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkNWQxYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0V4dFZhbEluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi0NCi0vKioNCi0gKiBkb250J3QgbW92ZSB0byBhbiBvdGhlciBwYWNrYWdlISEhDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRXh0VmFsSW5mb3JtYXRpb24NCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgPSBFeHRWYWxJbmZvcm1hdGlvbi5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlhNTF9QQVJBTV9QUkVGSVggPSBFeHRWYWxJbmZvcm1hdGlvbi5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSBDbGFzc1V0aWxzLmdldEphclZlcnNpb24oRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MpOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ3VzdG9tSW5mb3JtYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9DdXN0b21JbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjRlMDViLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9DdXN0b21JbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQ0KLXB1YmxpYyBlbnVtIEN1c3RvbUluZm9ybWF0aW9uDQotew0KLSAgICBCQVNFX1BBQ0tBR0UsDQotICAgIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SLA0KLQ0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgsDQotICAgIFZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYLA0KLSAgICBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfUE9TVEZJWCwNCi0NCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NU0dfUkVTT0xWRVJfTkFNRV9NQVBQRVIsDQotICAgIE1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSLA0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUiwNCi0NCi0gICAgU1RBUlRVUF9MSVNURU5FUiwNCi0gICAgQ09NUE9ORU5UX0lOSVRJQUxJWkVSLA0KLSAgICBWQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgVkFMSURBVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IsDQotDQotICAgIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwNCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLA0KLSAgICBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLA0KLSAgICBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwNCi0gICAgRkFDRVNfTUVTU0FHRV9GQUNUT1JZLA0KLQ0KLSAgICBNRVNTQUdFX0JVTkRMRV9OQU1FLA0KLSAgICBTVEFUSUNfU1RSQVRFR1lfTUFQUElOR19TT1VSQ0UNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHQuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZDI3N2YuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUmVuZGVyZXJJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5RmluZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRGVmYXVsdEZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBFeHRWYWxDb250ZXh0Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBFeHRWYWxDb250ZXh0IGV4dFZhbENvbnRleHQgPSBuZXcgRXh0VmFsQ29udGV4dCgpOwotCi0gICAgcHJpdmF0ZSBGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIgPSBEZWZhdWx0RmFjdG9yeUZpbmRlci5nZXRJbnN0YW5jZSgpOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUmVuZGVyZXJJbnRlcmNlcHRvcj4gcmVuZGVyZXJJbnRlcmNlcHRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlbmRlcmVySW50ZXJjZXB0b3I+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZGVuaWVkSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI+IHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyPigpOwotCi0gICAgcHJpdmF0ZSBMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPiBjb21wb25lbnRJbml0aWFsaXplcnM7Ci0gICAgcHJpdmF0ZSBMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4gdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yczsKLSAgICBwcml2YXRlIExpc3Q8VmFsaWRhdGlvbkludGVyY2VwdG9yPiB2YWxpZGF0aW9uSW50ZXJjZXB0b3JzOwotICAgIHByaXZhdGUgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGdsb2JhbFByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgIHByaXZhdGUgTWFwPFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcywgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4+IHN0YXRpY0NvbmZpZ01hcAotICAgICAgICA9IG5ldyBIYXNoTWFwPFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcywgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4+KCk7Ci0KLQotICAgIHByaXZhdGUgdm9pZCBsYXp5SW5pdENvbXBvbmVudEluaXRpYWxpemVycygpCi0gICAgewotICAgICAgICBpZih0aGlzLmNvbXBvbmVudEluaXRpYWxpemVycyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmNvbXBvbmVudEluaXRpYWxpemVycyA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+KCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzCi0gICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9JTklUSUFMSVpFUikpOwotCi0gICAgICAgIENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyOwotICAgICAgICBmb3IgKFN0cmluZyBjb21wb25lbnRJbml0aWFsaXplck5hbWUgOiBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyID0KLSAgICAgICAgICAgICAgICAoQ29tcG9uZW50SW5pdGlhbGl6ZXIpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjb21wb25lbnRJbml0aWFsaXplck5hbWUpOwotCi0gICAgICAgICAgICBpZiAoY29tcG9uZW50SW5pdGlhbGl6ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKGNvbXBvbmVudEluaXRpYWxpemVyKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGNvbXBvbmVudEluaXRpYWxpemVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsYXp5SW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgaWYodGhpcy52YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMudmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycyA9IG5ldyBBcnJheUxpc3Q8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPigpOwotICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMKLSAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUik7Ci0gICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMKLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoCi0gICAgICAgICAgICAgICAgICAgIEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SKSk7Ci0KLSAgICAgICAgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsKLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSA6IHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA9Ci0gICAgICAgICAgICAgICAgKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lKTsKLQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMuYWRkKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcik7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxhenlJbml0VmFsaWRhdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBpZih0aGlzLnZhbGlkYXRpb25JbnRlcmNlcHRvcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxWYWxpZGF0aW9uSW50ZXJjZXB0b3I+KCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgdmFsaWRhdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fSU5URVJDRVBUT1IpOwotICAgICAgICB2YWxpZGF0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KAotICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0lOVEVSQ0VQVE9SKSk7Ci0KLSAgICAgICAgVmFsaWRhdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25JbnRlcmNlcHRvcjsKLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvbkludGVyY2VwdG9yTmFtZSA6IHZhbGlkYXRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25JbnRlcmNlcHRvciA9Ci0gICAgICAgICAgICAgICAgKFZhbGlkYXRpb25JbnRlcmNlcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uSW50ZXJjZXB0b3JOYW1lKTsKLQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25JbnRlcmNlcHRvciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25JbnRlcmNlcHRvcnMuYWRkKHZhbGlkYXRpb25JbnRlcmNlcHRvcik7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSh2YWxpZGF0aW9uSW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxhenlJbml0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMubWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4oKTsKLQotICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IpOwotICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMKLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoCi0gICAgICAgICAgICAgICAgICAgIEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SKSk7Ci0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7Ci0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUgOiBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yID0KLSAgICAgICAgICAgICAgICAoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLmFkZChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEV4dFZhbENvbnRleHQgZ2V0Q29udGV4dCgpCi0gICAgewotICAgICAgICByZXR1cm4gZXh0VmFsQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmFjdG9yeUZpbmRlciBnZXRGYWN0b3J5RmluZGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWN0b3J5RmluZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZhY3RvcnlGaW5kZXIoRmFjdG9yeUZpbmRlciBmYWN0b3J5RmluZGVyKQotICAgIHsKLSAgICAgICAgaWYoZmFjdG9yeUZpbmRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZhY3RvcnlGaW5kZXIgPSBmYWN0b3J5RmluZGVyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UmVuZGVyZXJJbnRlcmNlcHRvcj4gZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8UmVuZGVyZXJJbnRlcmNlcHRvcj4ocmVuZGVyZXJJbnRlcmNlcHRvcnMudmFsdWVzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKEV4dFZhbENvbnRleHQuY2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZW5pZWRJbnRlcmNlcHRvcnMuY29udGFpbnMocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvcnMucHV0KHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpLCByZW5kZXJlckludGVyY2VwdG9yKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihDbGFzcyByZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpCi0gICAgewotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgPQotICAgICAgICAgICAgKFJlbmRlcmVySW50ZXJjZXB0b3IpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcyk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChFeHRWYWxDb250ZXh0LmNsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9ycy5yZW1vdmUocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy9pZiBhbiBpbnRlcmNlcHRvciBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkIHNvIGZhciwgaXQgc2hvdWxkIGJlIGRlbmllZCBhdCBmdXR1cmUgcmVnaXN0cmF0aW9ucwotICAgIHB1YmxpYyB2b2lkIGRlbnlSZW5kZXJlckludGVyY2VwdG9yKENsYXNzIHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcykKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA9Ci0gICAgICAgICAgICAoUmVuZGVyZXJJbnRlcmNlcHRvcikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3MocmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKEV4dFZhbENvbnRleHQuY2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbmllZEludGVyY2VwdG9ycy5hZGQocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpOwotICAgICAgICB9Ci0gICAgICAgIGRlcmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIoQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIpCi0gICAgewotICAgICAgICBsYXp5SW5pdENvbXBvbmVudEluaXRpYWxpemVycygpOwotICAgICAgICB0aGlzLmNvbXBvbmVudEluaXRpYWxpemVycy5hZGQoY29tcG9uZW50SW5pdGlhbGl6ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPiBnZXRDb21wb25lbnRJbml0aWFsaXplcnMoKQotICAgIHsKLSAgICAgICAgbGF6eUluaXRDb21wb25lbnRJbml0aWFsaXplcnMoKTsKLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudEluaXRpYWxpemVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIGxhenlJbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICB0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMuYWRkKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPiBnZXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGxhenlJbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFZhbGlkYXRpb25JbnRlcmNlcHRvcihWYWxpZGF0aW9uSW50ZXJjZXB0b3IgdmFsaWRhdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgbGF6eUluaXRWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHRoaXMudmFsaWRhdGlvbkludGVyY2VwdG9ycy5hZGQodmFsaWRhdGlvbkludGVyY2VwdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IGdldFZhbGlkYXRpb25WYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGxhenlJbml0VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0aW9uSW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgbGF6eUluaXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLmFkZChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBsYXp5SW5pdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI+IGdldFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIgcHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcikKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMuYWRkKHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBnZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpCi0gICAgewotICAgICAgICBNYXAgYXBwbGljYXRpb25NYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25NYXAoKTsKLSAgICAgICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gYmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgYXBwbGljYXRpb25NYXAuZ2V0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSk7Ci0KLSAgICAgICAgaWYgKGJlYW4gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGluaXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbihhcHBsaWNhdGlvbk1hcCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJlYW47Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBpbml0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oTWFwIGFwcGxpY2F0aW9uTWFwKQotICAgIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9JTkZPUk1BVElPTl9QUk9WSURFUl9CRUFOKTsKLSAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzLmFkZChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5DVVNUT01fQkVBTik7Ci0KLSAgICAgICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW47Ci0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW4gPSAoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4pIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOwotCi0gICAgICAgICAgICBpZiAoaW5mb3JtYXRpb25Qcm92aWRlckJlYW4gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbk1hcC5wdXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FLCBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5VG9Jbml0Q3VzdG9tQ29uZmlndXJlZEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lKGFwcGxpY2F0aW9uTWFwKTsKLQotICAgICAgICBpZihhcHBsaWNhdGlvbk1hcC5jb250YWluc0tleShJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKWFwcGxpY2F0aW9uTWFwLmdldChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9Jbml0Q3VzdG9tQ29uZmlndXJlZEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lKE1hcCBhcHBsaWNhdGlvbk1hcCkKLSAgICB7Ci0gICAgICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGJlYW4gPSAoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4pIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkKLSAgICAgICAgICAgIC5nZXRCZWFuKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkNVU1RPTV9CRUFOLnJlcGxhY2UoIi4iLCAiXyIpKTsKLQotICAgICAgICBpZihiZWFuICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uTWFwLnB1dChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUsIGJlYW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IGdldFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzIG5hbWUpCi0gICAgewotICAgICAgICBpZighdGhpcy5zdGF0aWNDb25maWdNYXAuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IHN0YXRpY0NvbmZpZ0xpc3QgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICAgICAgdGhpcy5zdGF0aWNDb25maWdNYXAucHV0KG5hbWUsIHN0YXRpY0NvbmZpZ0xpc3QpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnN0YXRpY0NvbmZpZ01hcC5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMgbmFtZSwgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBzdGF0aWNDb25maWdMaXN0OwotICAgICAgICAgICAgaWYoIXRoaXMuc3RhdGljQ29uZmlnTWFwLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRpY0NvbmZpZ0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICAgICAgICAgIHRoaXMuc3RhdGljQ29uZmlnTWFwLnB1dChuYW1lLCBzdGF0aWNDb25maWdMaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMuc3RhdGljQ29uZmlnTWFwLmdldChuYW1lKS5hZGQoc3RhdGljQ29uZmlnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gYWRkR2xvYmFsUHJvcGVydHkobmFtZSAsIHZhbHVlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRHbG9iYWxQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIGZvcmNlT3ZlcnJpZGUpCi0gICAgewotICAgICAgICBpZih0aGlzLmdsb2JhbFByb3BlcnRpZXMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCFmb3JjZU92ZXJyaWRlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygib3ZlcnJpZGUgZ2xvYmFsIHByb3BlcnR5ICciICsgbmFtZSArICInIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5nbG9iYWxQcm9wZXJ0aWVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0R2xvYmFsUHJvcGVydHkoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5nbG9iYWxQcm9wZXJ0aWVzLmdldChuYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTgwNzI4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFyZW4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICogKyBzb21lIG9mIHRoZW0gY2FuIGJlIGN1c3RvbWl6ZWQgd2l0aGluIGEgY3VzdG9tIGltcGwuIG9mIHRoZSBiZWFuDQotICogKGV4dGVuZCB0aGlzIGNsYXNzIGFuZCBwcm92aWRlIGl0IHZpYSBjb252ZW50aW9uIG9yIHdlYi54bWwpDQotICogPHAvPg0KLSAqIHRoZSBzdGF0aWMgYXBpIHNob3VsZCBvbmx5IGJlIHVzZWQNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSSwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVBTl9OQU1FID0gRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUNCi0gICAgICAgICsgIi4iICsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICAvL2N1c3RvbSBjbGFzcyB3aGljaCBpcyBhbiBvcHRpb25hbCByZXBsYWNlbWVudCBmb3IgdGhpcyBjbGFzcyAoaGFzIHRvIGV4dGVuZCB0aGlzIGNsYXNzKQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQkVBTiA9IChFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRQ0KLSAgICAgICAgKyAiLmN1c3RvbS4iICsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsNCi0NCi0gICAgcHVibGljIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHNldHVwQ3VzdG9taXphYmxlSW5mb3JtYXRpb24oKTsNCi0gICAgICAgIGFwcGx5Q3VzdG9tVmFsdWVzKHRoaXMuY3VzdG9taXphYmxlSW5mb3MpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPEN1c3RvbUluZm9ybWF0aW9uLCBTdHJpbmc+IGN1c3RvbWl6YWJsZUluZm9zID0gbmV3IEhhc2hNYXA8Q3VzdG9tSW5mb3JtYXRpb24sIFN0cmluZz4oKTsNCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwQ3VzdG9taXphYmxlSW5mb3JtYXRpb24oKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgYmFzZVBhY2thZ2UgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0JBU0VfUEFDS0FHRTsNCi0NCi0gICAgICAgIGlmIChiYXNlUGFja2FnZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VQYWNrYWdlID0gRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgKyAiLmN1c3RvbS4iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFiYXNlUGFja2FnZS5lbmRzV2l0aCgiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VQYWNrYWdlID0gYmFzZVBhY2thZ2UgKyAiLiI7DQotICAgICAgICB9DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQkFTRV9QQUNLQUdFLCBiYXNlUGFja2FnZSk7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IsDQotICAgICAgICAgICAgICAgICJDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFUcmFuc2Zvcm1lciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX0lOSVRJQUxJWkVSLA0KLSAgICAgICAgICAgICAgICAiQ29tcG9uZW50SW5pdGlhbGl6ZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fSU5URVJDRVBUT1IsDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uSW50ZXJjZXB0b3IiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgICAgICAgICAgICAgIk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NU0dfUkVTT0xWRVJfTkFNRV9NQVBQRVIsDQotICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIsDQotICAgICAgICAgICAgIk1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIsDQotICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5TVEFSVFVQX0xJU1RFTkVSLA0KLSAgICAgICAgICAgICAgICAiU3RhcnR1cExpc3RlbmVyIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiTWVzc2FnZVJlc29sdmVyRmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkZBQ0VTX01FU1NBR0VfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIkZhY2VzTWVzc2FnZUZhY3RvcnkiKTsNCi0NCi0gICAgICAgIC8vY29udmVudGlvbnMgKHRoZSByZXN0IG9mIHRoZSBjb252ZW50aW9ucyBhcmUgYnVpbHQgd2l0aCB0aGUgaGVscCBvZiBuYW1lIG1hcHBlcnMsLi4uDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9CVU5ETEVfTkFNRSwNCi0gICAgICAgICAgICAgICAgInZhbGlkYXRpb25fbWVzc2FnZXMiKTsNCi0gICAgICAgIC8vc3RhdGljIHN0cmF0ZWd5IG1hcHBpbmdzIChuYW1lIG9mIHByb3BlcnR5IGZpbGVzKQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVRJQ19TVFJBVEVHWV9NQVBQSU5HX1NPVVJDRSwNCi0gICAgICAgICAgICAgICAgInN0cmF0ZWd5X21hcHBpbmdzIik7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlDdXN0b21WYWx1ZXMoTWFwPEN1c3RvbUluZm9ybWF0aW9uLCBTdHJpbmc+IG1hcCkNCi0gICAgew0KLSAgICAgICAgLy9vdmVycmlkZSB0byBjdXN0b21pemUgaW5mb3JtYXRpb24NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldChDdXN0b21JbmZvcm1hdGlvbiBjdXN0b21JbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gY3VzdG9taXphYmxlSW5mb3MuZ2V0KGN1c3RvbUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIHN3aXRjaCAoY3VzdG9tSW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgY2FzZSBCQVNFX1BBQ0tBR0U6DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0NCi0gICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAqIHBvc3RmaXggdXNlZCBieSB0aGUgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLSAgICAgICAgICAgICAqIHRoZSBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGlzIGZvciBjdXN0b20gc3RyYXRlZ2llcyBvbmx5DQotICAgICAgICAgICAgICogKG5vdCBmb3IgcHVibGljIHZhbGlkYXRpb24gbW9kdWxlcykNCi0gICAgICAgICAgICAgKiBzbyBpdCdzIGZpbmUgdG8gY3VzdG9taXplIGl0DQotICAgICAgICAgICAgICovDQotICAgICAgICAgICAgY2FzZSBWQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVg6DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0NCi0gICAgICAgICAgICBjYXNlIFZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgY2FzZSBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfUE9TVEZJWDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIHJldHVybiBjdXN0b21pemFibGVJbmZvcy5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQkFTRV9QQUNLQUdFKSArIHZhbHVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOWY4NjkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1vZHVsZU1lc3NhZ2VCdW5kbGVOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG5ld1BhY2thZ2VOYW1lOw0KLSAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmVuZHNXaXRoKCIucmVzb2x2ZXIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBuZXdQYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lLnJlcGxhY2UoIi5yZXNvbHZlciIsICIuYnVuZGxlIik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgbmV3UGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZS5yZXBsYWNlKCIucmVzb2x2ZXIuIiwgIi5idW5kbGUuIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbmV3UGFja2FnZU5hbWUgKyAiLnZhbGlkYXRpb25fbWVzc2FnZXMiOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB1c2UgYSBjdXN0b20gbmFtZSBtYXBwZXIgdG8gaW1wbGVtZW50IGN1c3RvbSBjb252ZW50aW9ucw0KLSAgICAgKi8NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUoDQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgU3RyaW5nIHRhcmdldENsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgIi5tZXNzYWdlLnJlc29sdmVyLiIsIHRhcmdldENsYXNzTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgNCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLCBTdHJpbmcgdGFyZ2V0Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLCAiLm1ldGFkYXRhLnRyYW5zZm9ybWVyLiIsIHRhcmdldENsYXNzTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZShDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRQYWNrYWdlTmFtZSwgU3RyaW5nIHRhcmdldENsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLmdldE5hbWUoKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5yZXBsYWNlKCIuc3RyYXRlZ3kuIiwgdGFyZ2V0UGFja2FnZU5hbWUpOw0KLQ0KLSAgICAgICAgaWYgKHRhcmdldENsYXNzTmFtZSA9PSBudWxsIHx8IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpID09IC0xKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZQ0KLSAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpKSArICIuIiArIHRhcmdldENsYXNzTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VSZXNvbHZlckNsYXNzTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCAiVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHVzZSBhIGN1c3RvbSBuYW1lIG1hcHBlciB0byBpbXBsZW1lbnQgY3VzdG9tIGNvbnZlbnRpb25zDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFLZXkucmVwbGFjZSgiLmFubm90YXRpb24uIiwgIi5zdHJhdGVneS4iKSArICJTdHJhdGVneSI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCAiTWV0YURhdGFUcmFuc2Zvcm1lciIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgU3RyaW5nIHRhcmdldFBvc3RmaXgpDQotICAgIHsNCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLmVuZHNXaXRoKCJWYWxpZGF0aW9uU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5zdWJzdHJpbmcoMCwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5sZW5ndGgoKSAtIDE4KSArIHRhcmdldFBvc3RmaXg7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLmVuZHNXaXRoKCJTdHJhdGVneSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLnN1YnN0cmluZygwLCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLmxlbmd0aCgpIC0gOCkgKyB0YXJnZXRQb3N0Zml4Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgKyB0YXJnZXRQb3N0Zml4Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ2NTlkNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcmVuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgLyoNCi0gICAgICogbWlzYw0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVTU0FHRV9CVU5ETEUgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVNTQUdFX0JVTkRMRSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX1BBQ0tBR0UgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9CQVNFX1BBQ0tBR0UiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fSU5GT1JNQVRJT05fUFJPVklERVJfQkVBTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9TVEFUSUNfVkFMSURBVElPTl9TVFJBVEVHWV9NQVBQSU5HID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORyIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DT01QT05FTlRfSU5JVElBTElaRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT01QT05FTlRfSU5JVElBTElaRVIiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9JTlRFUkNFUFRPUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SIik7DQotDQotICAgIC8qDQotICAgICAqIG5hbWUgbWFwcGVyDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfTkFNRV9NQVBQRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfTkFNRV9NQVBQRVIiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSIik7DQotDQotICAgIC8qDQotICAgICAqIGZhY3Rvcmllcw0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0ZBQ0VTX01FU1NBR0VfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0ZBQ0VTX01FU1NBR0VfRkFDVE9SWSIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBkZWFjdGl2YXRlDQotICAgICAqLw0KLSAgICBARGVwcmVjYXRlZA0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfUkVOREVSS0lUID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1JFTkRFUktJVCIpOw0KLQ0KLSAgICAvL2N1cnJlbnRseSBqdXN0IHVzZWQgYnkgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0RFRkFVTFRfQ09OVkVOVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT04iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0RFRkFVTFRfTkFNRV9NQVBQRVJTID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0RFRkFVTFRfTkFNRV9NQVBQRVJTIik7DQotICAgIA0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfRUxfUkVTT0xWRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfRUxfUkVTT0xWRVIiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0VNUFRZX1NUUklOR19JTlRFUlBSRVRBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9FTVBUWV9TVFJJTkdfSU5URVJQUkVUQVRJT04iKTsNCi0NCi0gICAgLy90aGVyZSBpcyBub3RoaW5nIGxpa2UgREVBQ1RJVkFURV9ERUZBVUxUX1ZBTElEQVRJT05fSU5URVJDRVBUT1INCi0gICAgLy91c2UgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZGVueVJlbmRlcmVySW50ZXJjZXB0b3IoLi4uKSB3aXRoaW4gYW4gZXh0dmFsLVN0YXJ0dXBMaXN0ZW5lcg0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9BYnN0cmFjdEVMSGVscGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTQzZjI1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9BYnN0cmFjdEVMSGVscGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIGRldGFpbHMNCi0gKiBAc2VlIERlZmF1bHRFTEhlbHBlcg0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkgY3VzdG9tRUxIZWxwZXJGYWN0b3J5Ow0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbUVMSGVscGVyRmFjdG9yeShBYnN0cmFjdEVMSGVscGVyRmFjdG9yeSBlbEhlbHBlckZhY3RvcnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3VzdG9tRUxIZWxwZXJGYWN0b3J5ID0gZWxIZWxwZXJGYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBmaW5hbCBFTEhlbHBlciBjcmVhdGUoKQ0KLSAgICB7DQotICAgICAgICBFTEhlbHBlciByZXN1bHQgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYodGhpcy5jdXN0b21FTEhlbHBlckZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSB0aGlzLmN1c3RvbUVMSGVscGVyRmFjdG9yeS5jcmVhdGVFTEhlbHBlcigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUVMSGVscGVyKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBFTEhlbHBlciBjcmVhdGVFTEhlbHBlcigpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMmQxZGEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsNCi1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7DQotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBpbiBvcmRlciB0byBjZW50cmFsaXplIHRoZSBqc2YgdmVyc2lvbiBkZXBlbmRlbmN5IHdpdGhpbiB0aGUgY29yZQ0KLSAqDQotICogdGhpcyBlbC1oZWxwZXIgc3VwcG9ydHMganNwIGFuZCBmYWNlbGV0cyAodGVzdGVkIHdpdGggMS4xLjE0KQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotLyoNCi0gKiB0aGVyZSBpcyBhIHNwZWNpYWwgZmFjZWxldHMgd29ya2Fyb3VuZCBmb3IgZWwtZXhwcmVzc2lvbnMgb2YgY3VzdG9tIGNvbXBvbmVudHMNCi0gKiBpdCdzIHBsdWdnYWJsZSBpbiBvcmRlciB0byBzdXBwb3J0IHNwZWNpYWwgbWVjaGFuaXNtcyBvZiBkaWZmZXJlbnQgdGVjaG5vbG9naWVzICh0aGFuIGpzcCBhbmQgZmFjZWxldHMpDQotICogc28geW91IGNhbiBwbHVnIGluIHlvdXIgb3duIGltcGwuIHdoaWNoIGltcGxlbWVudHMgYSBjdXN0b20gd29ya2Fyb3VuZCAobGlrZSB0aGUgZmFjZWxldHMgd29ya2Fyb3VuZCBvZiB0aGlzIGltcGwuKQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRFTEhlbHBlciBpbXBsZW1lbnRzIEVMSGVscGVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9FTF9SRVNPTFZFUiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0VMX1JFU09MVkVSOw0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdEVMSGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIC8vZHVlIHRvIGEgcmVzdHJpY3Rpb24gd2l0aCB0aGUgcmkNCi0gICAgICAgIE9iamVjdCBiZWFuID0gZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIHJldHVybiAoYmVhbiAhPSBudWxsKSA/IGJlYW4uZ2V0Q2xhc3MoKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRCZWFuKFN0cmluZyBiZWFuTmFtZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIHJldHVybiBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5nZXRFTFJlc29sdmVyKCkuZ2V0VmFsdWUoZmFjZXNDb250ZXh0LmdldEVMQ29udGV4dCgpLCBudWxsLCBiZWFuTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uICE9IG51bGwpID8gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZXZhbHVhdGVFeHByZXNzaW9uR2V0KA0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksIE9iamVjdC5jbGFzcykgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmV2YWx1YXRlRXhwcmVzc2lvbkdldChmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIE9iamVjdC5jbGFzcyk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQsIGJvb2xlYW4gYWxsb3dCbGFua0NoYXJhY3RlcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIC8vZm9yIGlucHV0IGNvbXBvbmVudHMgd2l0aG91dCB2YWx1ZS1iaW5kaW5nDQotICAgICAgICAvLyhlLmcuIGZvciBzcGVjaWFsIGNvbXBvbmVudCBsaWJzIC0+IGlzc3VlIHdpdGggRXh0VmFsUmVuZGVyZXJXcmFwcGVyI2VuY29kZUJlZ2luKQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudC5nZXRDbGFzcygpICsgIiBoYXMgbm8gdmFsdWUgYmluZGluZyAtIGNvbXBvbmVudCBpZDogIiArIHVpQ29tcG9uZW50LmdldElkKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKCFhbGxvd0JsYW5rQ2hhcmFjdGVycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlKCIgIiwgIiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pLmdldEJhc2VFeHByZXNzaW9uKCkpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXN1bHQgPSBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuDQotICAgICAgICAgICAgICAgIHRyeVRvQ3JlYXRlVmFsdWVCaW5kaW5nRm9yRmFjZWxldHNCaW5kaW5nKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCByZXNvbHZlIGV4cHJlc3Npb246ICIgKyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgIC5nZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgcmVzdWx0LmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLQ0KLSAgICAgICAgICAgIGlmKGVudGl0eUNsYXNzID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgcmVzb2x2ZSBleHByZXNzaW9uOiAiICsgcmVzdWx0LmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5ISUdILCBkZXNjcmlwdGlvbiA9ICJjaGVjayBpZiBpdCB3b3JrcyB3aXRoIG5lc3RlZCBjb21wb3NpdGUgY29tcG9uZW50cyIpDQotICAgIHB1YmxpYyBQcm9wZXJ0eURldGFpbHMgZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKERFQUNUSVZBVEVfRUxfUkVTT0xWRVIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eURldGFpbHNWaWFSZWZsZWN0aW9uRmFsbGJhY2sodWlDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIFZhbHVlRXhwcmVzc2lvbiB2YWx1ZUV4cHJlc3Npb24gPSB1aUNvbXBvbmVudC5nZXRWYWx1ZUV4cHJlc3Npb24oInZhbHVlIik7DQotDQotICAgICAgICBpZih2YWx1ZUV4cHJlc3Npb24gPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEV4dFZhbEVMUmVzb2x2ZXIgZWxSZXNvbHZlciA9IGNyZWF0ZVdyYXBwZWRFTENvbnRleHQoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGluc3BlY3RUYXJnZXQodmFsdWVFeHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICBFeHRWYWxFTFJlc29sdmVyLmNyZWF0ZUNvbnRleHRXcmFwcGVyKGZhY2VzQ29udGV4dC5nZXRFTENvbnRleHQoKSwgZWxSZXNvbHZlciksIGZhbHNlKTsNCi0NCi0gICAgICAgIEV4dFZhbEVMUmVzb2x2ZXIgY29tcG9zaXRlQ29tcG9uZW50RUxSZXNvbHZlciA9IG51bGw7DQotDQotICAgICAgICAvL3JlLWNoZWNrIHRvIGdldCBmdWxsIGtleSBmb3IgY3Jvc3MtdmFsaWRhdGlvbg0KLSAgICAgICAgaWYgKGVsUmVzb2x2ZXIuZ2V0Q29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbigpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgVmFsdWVFeHByZXNzaW9uIGNvbXBvc2l0ZUV4cHJlc3Npb24gPSBlbFJlc29sdmVyLmdldENvbXBvc2l0ZUNvbXBvbmVudEV4cHJlc3Npb24oKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBjb21wb3NpdGVDb21wb25lbnRFTFJlc29sdmVyID0gY3JlYXRlV3JhcHBlZEVMQ29udGV4dChmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgICAgIGluc3BlY3RUYXJnZXQoY29tcG9zaXRlRXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgIEV4dFZhbEVMUmVzb2x2ZXIuY3JlYXRlQ29udGV4dFdyYXBwZXIoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dC5nZXRFTENvbnRleHQoKSwgY29tcG9zaXRlQ29tcG9uZW50RUxSZXNvbHZlciksIHRydWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoZWxSZXNvbHZlci5nZXRQYXRoKCkgPT0gbnVsbCB8fCBlbFJlc29sdmVyLmdldEJhc2VPYmplY3QoKSA9PSBudWxsIHx8IGVsUmVzb2x2ZXIuZ2V0UHJvcGVydHkoKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIGtleTsNCi0gICAgICAgIGlmKGNvbXBvc2l0ZUNvbXBvbmVudEVMUmVzb2x2ZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBrZXkgPSBjb21wb3NpdGVDb21wb25lbnRFTFJlc29sdmVyLmdldFBhdGgoKSArDQotICAgICAgICAgICAgICAgICAgICBlbFJlc29sdmVyLmdldFBhdGgoKS5zdWJzdHJpbmcoZWxSZXNvbHZlci5nZXRQYXRoKCkuaW5kZXhPZigiLiIpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBrZXkgPSBlbFJlc29sdmVyLmdldFBhdGgoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlEZXRhaWxzKGtleSwgZWxSZXNvbHZlci5nZXRCYXNlT2JqZWN0KCksIGVsUmVzb2x2ZXIuZ2V0UHJvcGVydHkoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RUYXJnZXQoVmFsdWVFeHByZXNzaW9uIHZhbHVlRXhwcmVzc2lvbiwgRUxDb250ZXh0IGVsQ29udGV4dCwgYm9vbGVhbiBpbnNwZWN0Q29tcG9zaXRlQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWx1ZUV4cHJlc3Npb24uc2V0VmFsdWUoZWxDb250ZXh0LCBudWxsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihpbnNwZWN0Q29tcG9zaXRlQ29tcG9uZW50KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IgYXQgYmluZGluZzogIiArIHZhbHVlRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAtLSBhbiBlbC1yZXNvbHZlciBlcnJvciBvY2N1cnJlZCEgbWF5YmUgeW91IHVzZWQgYW4gaW52YWxpZCBiaW5kaW5nLiIsIHQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEV4dFZhbEVMUmVzb2x2ZXIgY3JlYXRlV3JhcHBlZEVMQ29udGV4dChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEV4dFZhbEVMUmVzb2x2ZXIoZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZ2V0RUxSZXNvbHZlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICAvL2tlZXAgaW4gc3luYyB3aXRoIERlZmF1bHRFTEhlbHBlciNnZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyBvZiBicmFuY2ghISENCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eURldGFpbHMgZ2V0UHJvcGVydHlEZXRhaWxzVmlhUmVmbGVjdGlvbkZhbGxiYWNrKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gZ2V0VmFsdWVCaW5kaW5nRXhwcmVzc2lvbih1aUNvbXBvbmVudCwgZmFsc2UpOw0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9DQotICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHBhdGggPSBudWxsOw0KLQ0KLSAgICAgICAgd2hpbGUoY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHBhdGggPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHBhdGggPSBnZXRQcm9wZXJ0eU5hbWUoY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwYXRoID0gZ2V0UHJvcGVydHlOYW1lKGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKSArICIuIiArIHBhdGg7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBhdGggPSBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpICsgIi4iICsgcGF0aDsNCi0NCi0gICAgICAgIE9iamVjdCBiYXNlT2JqZWN0ID0gZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLQ0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGUuZy46ICN7YmVhbltiZWFuLnBhc3N3b3JkUmVwZWF0ZWRQcm9wZXJ0eU5hbWVdfQ0KLSAgICAgICAgLy8tPiBiZWFuLnBhc3N3b3JkUmVwZWF0ZWRQcm9wZXJ0eU5hbWUgaXMgbm90IHRoZSBmaW5hbCBwcm9wZXJ0eSBuYW1lDQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscyhwYXRoLCBiYXNlT2JqZWN0LCBnZXRQcm9wZXJ0eU5hbWUodmFsdWVCaW5kaW5nRXhwcmVzc2lvbikpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldFByb3BlcnR5TmFtZShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCk7DQotDQotICAgICAgICBpZihwcm9wZXJ0eU5hbWUuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBleHRyYWN0UHJvcGVydHlOYW1lT2ZQcm9wZXJ0eVBhdGgocHJvcGVydHlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInN1cHBvcnQgZm9yIG1vcmUgZHluYW1pYyBiaW5kaW5ncyAtIGRldGFpbHMgc2VlIGlubGluZSIpDQotICAgIHByaXZhdGUgU3RyaW5nIGV4dHJhY3RQcm9wZXJ0eU5hbWVPZlByb3BlcnR5UGF0aChTdHJpbmcgcHJvcGVydHlDaGFpbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nW10gcHJvcGVydGllcyA9IHByb3BlcnR5Q2hhaW4uc3BsaXQoIlxcLiIpOw0KLQ0KLSAgICAgICAgT2JqZWN0IGN1cnJlbnRQcm9wZXJ0eVZhbHVlID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKHByb3BlcnRpZXNbMF0pOw0KLQ0KLSAgICAgICAgTWV0aG9kIGN1cnJlbnRNZXRob2Q7DQotICAgICAgICBTdHJpbmcgY3VycmVudFByb3BlcnR5TmFtZTsNCi0gICAgICAgIGZvcihpbnQgaSA9IDE7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0aWVzW2ldOw0KLSAgICAgICAgICAgIGN1cnJlbnRNZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoY3VycmVudFByb3BlcnR5VmFsdWUuZ2V0Q2xhc3MoKSwNCi0gICAgICAgICAgICAgICAgImdldCIgKyBjdXJyZW50UHJvcGVydHlOYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgY3VycmVudFByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMSkpOw0KLQ0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRNZXRob2QgPT0gbnVsbCAmJiBjdXJyZW50UHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIE1hcCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vaXQncyBvayBmb3IgdGhlIHNpbXBsZSBtYXAgY2FzZSAtIGJ1dCBub3QgZm9yIGUuZy46DQotICAgICAgICAgICAgICAgIC8vI3tiZWFuMVtiZWFuMi5wcm9wZXJ0eU5hbWVQcm92aWRlclsgYmVhbjMuaW5kZXhdXX0NCi0gICAgICAgICAgICAgICAgLy9vciBldmVyeSBvdGhlciBjb21wbGV4IHJlcGxhY2VtZW50IGZvciBiZWFuMy5pbmRleA0KLSAgICAgICAgICAgICAgICAvL2l0IG1pZ2h0IGFsc28gcmVxdWlyZSBhbiBhZGp1c3RtZW50IGF0IEZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlciN0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcNCi0gICAgICAgICAgICAgICAgKChNYXApY3VycmVudFByb3BlcnR5VmFsdWUpLmdldChjdXJyZW50UHJvcGVydHlOYW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudFByb3BlcnR5VmFsdWUgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoY3VycmVudFByb3BlcnR5VmFsdWUsIGN1cnJlbnRNZXRob2QpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGN1cnJlbnRQcm9wZXJ0eVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKWN1cnJlbnRQcm9wZXJ0eVZhbHVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRXJyb3JFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigidW5leHBlY3RlZCB2YWx1ZSB3aXRoaW4gbWFwIHN5bnRheDogIiArIHByb3BlcnR5Q2hhaW4gKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICIgbGFzdCBwcm9wZXJ0eSBuYW1lOiAiICsgY3VycmVudFByb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBzdGF0aWMgU3RyaW5nIGdldE9yaWdpbmFsVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgVmFsdWVFeHByZXNzaW9uIHZhbHVlRXhwcmVzc2lvbiA9IHVpQ29tcG9uZW50LmdldFZhbHVlRXhwcmVzc2lvbigidmFsdWUiKTsNCi0NCi0gICAgICAgIHJldHVybiAodmFsdWVFeHByZXNzaW9uICE9IG51bGwpID8gdmFsdWVFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFTFRlcm1XZWxsRm9ybWVkKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFZhbHVlQmluZGluZyB8fCBvIGluc3RhbmNlb2YgRXh0ZXJuYWxpemFibGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIHMgPSBvLnRvU3RyaW5nKCk7DQotICAgICAgICByZXR1cm4gKChzLmNvbnRhaW5zKCIjIikgfHwgcy5jb250YWlucygiJCIpKSAmJiBzLmNvbnRhaW5zKCJ7IikgJiYgcy5jb250YWlucygifSIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJpbmRpbmdPZkNvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudC5nZXRWYWx1ZUV4cHJlc3Npb24obmFtZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZmU1NmMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEVMSGVscGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5DQotew0KLSAgICBwcml2YXRlIEVMSGVscGVyIGVsSGVscGVyID0gbmV3IERlZmF1bHRFTEhlbHBlcigpOw0KLSAgICANCi0gICAgcHJvdGVjdGVkIEVMSGVscGVyIGNyZWF0ZUVMSGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZWxIZWxwZXI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRUxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGViMjU1My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRUxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBpbiBvcmRlciB0byBjZW50cmFsaXplIHRoZSBqc2YgdmVyc2lvbiBkZXBlbmRlbmN5IHdpdGhpbiB0aGUgY29yZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBFTEhlbHBlcg0KLXsNCi0gICAgT2JqZWN0IGdldEJlYW4oU3RyaW5nIGJlYW5OYW1lKTsNCi0NCi0gICAgT2JqZWN0IGdldFZhbHVlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIENsYXNzIGdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0NCi0gICAgUHJvcGVydHlEZXRhaWxzIGdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KTsNCi0NCi0gICAgYm9vbGVhbiBpc0VMVGVybVZhbGlkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0NCi0gICAgYm9vbGVhbiBpc0VMVGVybVdlbGxGb3JtZWQoT2JqZWN0IG8pOw0KLQ0KLSAgICBPYmplY3QgZ2V0QmluZGluZ09mQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBTdHJpbmcgbmFtZSk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FeHRWYWxFTFJlc29sdmVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRXh0VmFsRUxSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjBlY2M5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FeHRWYWxFTFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmVsLkVMUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0OwotaW1wb3J0IGphdmF4LmVsLlZhcmlhYmxlTWFwcGVyOwotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsKLWltcG9ydCBqYXZheC5lbC5GdW5jdGlvbk1hcHBlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5lbC5Db21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uSG9sZGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS5iZWFucy5GZWF0dXJlRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1wdWJsaWMgY2xhc3MgRXh0VmFsRUxSZXNvbHZlciBleHRlbmRzIEVMUmVzb2x2ZXIKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBFTFJlc29sdmVyIHdyYXBwZWQ7Ci0gICAgcHJpdmF0ZSBPYmplY3QgYmFzZU9iamVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKLSAgICAvL2Zvcm1zIHRoZSBpZCBmb3IgY3Jvc3MtdmFsaWRhdGlvbiB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXhwcmVzc2lvbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQYXRoUmVjb3JkaW5nU3RvcHBlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgQ29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbkhvbGRlciBjb21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uSG9sZGVyOwotICAgIHByaXZhdGUgU3RyaW5nIGNvbXBvc2l0ZUNvbXBvbmVudEV4cHJlc3Npb25CYXNlOwotCi0gICAgcHVibGljIEV4dFZhbEVMUmVzb2x2ZXIoRUxSZXNvbHZlciBlbFJlc29sdmVyKQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gZWxSZXNvbHZlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJhc2VPYmplY3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJhc2VPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJleHRyYWN0ZWQgcGF0aDogIiArIHRoaXMuZXhwcmVzc2lvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpCi0gICAgewotICAgICAgICB0aGlzLmJhc2VPYmplY3QgPSBudWxsOwotICAgICAgICB0aGlzLnByb3BlcnR5ID0gbnVsbDsKLSAgICAgICAgdGhpcy5leHByZXNzaW9uID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBwYXRoIHJlY29yZGluZyBpcyBwZXJmb3JtZWQgdG8gZ2V0IGEga2V5IGZvciBjcm9zcy12YWxpZGF0aW9uPGJyLz4KLSAgICAgKiBldmVyeSBiYXNlIGFmdGVyIHRoZSBmaXJzdCBjYWxsIHdoaWNoIGlzIG51bGwgc3RvcHMgcmVjb3JkaW5nPGJyLz4KLSAgICAgKiB3aXRoIGEgZHluYW1pYyBtYXAgc3ludGF4IHRoZSBsYXN0IHByb3BlcnR5IGluIHRoZSBtaWRkbGUgb2YgYW4gZXhwcmVzc2lvbiBoYXMgdG8gYmUgYSBzdHJpbmcuCi0gICAgICogc3VjaCBhIHN0cmluZyByZXN1bHQgY29udGludWVzIHRoZSBwYXRoIHJlY29yZGluZyBhdCB0aGUgbmV4dCBjYWxsIGZvciB0aGUgY3VycmVudCBleHByZXNzaW9uLgotICAgICAqIDxwLz4KLSAgICAgKiBleGFtcGxlOiAje2JlYW5bYmVhbi5wcm9wZXJ0eU5hbWVQcm92aWRlclsnbmFtZU9mUHJvcGVydHkxJ11dWydkeW5CZWFuJ10ucHJvcGVydHl9Ci0gICAgICogPHAvPgotICAgICAqIGxpbWl0YXRpb24gZm9yIGNyb3NzLXZhbGlkYXRpb246IG5hbWVPZlByb3BlcnR5MSBoYXMgdG8gYmUgb2YgdHlwZSBzdHJpbmcuCi0gICAgICogb3RoZXIga2V5IHR5cGVzIGFyZW4ndCBzdXBwb3J0ZWQgeWV0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxDb250ZXh0IHdyYXBwZWQgZWwtY29udGV4dAotICAgICAqIEBwYXJhbSBiYXNlIGN1cnJlbnQgYmFzZQotICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBwcm9wZXJ0eSB0byByZXNvbHZlCi0gICAgICogQHJldHVybiByZXN1bHQgb2YgdGhlIGRlbGVnYXRlZCBtZXRob2QgY2FsbAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoRUxDb250ZXh0IGVsQ29udGV4dCwgT2JqZWN0IGJhc2UsIE9iamVjdCBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIE9iamVjdCByZXN1bHQgPSB0aGlzLndyYXBwZWQuZ2V0VmFsdWUoZWxDb250ZXh0LCBiYXNlLCBwcm9wZXJ0eSk7Ci0KLSAgICAgICAgaWYodGhpcy5jb21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uSG9sZGVyICE9IG51bGwgJiYgdGhpcy5jb21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uQmFzZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmNvbXBvc2l0ZUNvbXBvbmVudEV4cHJlc3Npb25CYXNlID0gKFN0cmluZylwcm9wZXJ0eTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRoaXMuY29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbkhvbGRlciA9PSBudWxsICYmIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBvc2l0ZUNvbXBvbmVudEV4cHJlc3Npb25Ib2xkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuY29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbkhvbGRlciA9ICgoQ29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbkhvbGRlcilyZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy92ZXJ5IGZpcnN0IGNhbGwgZm9yIGFuIGV4cHJlc3Npb24KLSAgICAgICAgaWYodGhpcy5leHByZXNzaW9uID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IChTdHJpbmcpcHJvcGVydHk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8je2JlYW5bZHluQmFzZS5wcm9wZXJ0eU5hbWVdfSAtPiBiYXNlIG9mIGR5bkJhc2UgaXMgbnVsbCAtPiBzdG9wIHBhdGggcmVjb3JkaW5nCi0gICAgICAgIGVsc2UgaWYoYmFzZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmlzUGF0aFJlY29yZGluZ1N0b3BwZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBwcm9wZXJ0eUV4aXN0cyA9IGZhbHNlOwotICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IChTdHJpbmcpcHJvcGVydHk7Ci0gICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihiYXNlIGluc3RhbmNlb2YgTWFwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoKChNYXApYmFzZSkuY29udGFpbnNLZXkocHJvcGVydHkpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZihiYXNlLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJnZXQiICsgcHJvcGVydHlOYW1lKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGJhc2UuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImlzIiArIHByb3BlcnR5TmFtZSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZTEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpICYmICEiYXR0cnMiLmVxdWFscyhwcm9wZXJ0eSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJwcm9wZXJ0eTogIiArIHByb3BlcnR5ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpc24ndCB1c2VkIGZvciBwYXRoIC0gaXQgaXNuJ3QgYSBwcm9wZXJ0eSBvZiAiICsgYmFzZS5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2UuZy46ICN7YmVhbi5zdWJCYXNlLnByb3BlcnR5fSAtPiBoZXJlIHdlIGFyZSBhdCBzdWJCYXNlCi0gICAgICAgICAgICBpZihwcm9wZXJ0eUV4aXN0cyAmJiAhdGhpcy5pc1BhdGhSZWNvcmRpbmdTdG9wcGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbiArPSAiLiIgKyBwcm9wZXJ0eTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYocHJvcGVydHlFeGlzdHMgJiYgcmVzdWx0IGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuaXNQYXRoUmVjb3JkaW5nU3RvcHBlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgaWYodGhpcy5pc1BhdGhSZWNvcmRpbmdTdG9wcGVkICYmIHJlc3VsdCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uICs9ICIuIiArIHByb3BlcnR5OwotICAgICAgICB9Ci0gICAgICAgICovCi0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0VHlwZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbywgT2JqZWN0IG8xKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0VHlwZShlbENvbnRleHQsIG8sIG8xKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbywgT2JqZWN0IG8xLCBPYmplY3QgbzIpCi0gICAgewotICAgICAgICBleHByZXNzaW9uICs9ICIuIiArIG8xOwotICAgICAgICBwcm9wZXJ0eSA9IChTdHJpbmcpbzE7Ci0gICAgICAgIGJhc2VPYmplY3QgPSBvOwotICAgICAgICBlbENvbnRleHQuc2V0UHJvcGVydHlSZXNvbHZlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvLCBPYmplY3QgbzEpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5pc1JlYWRPbmx5KGVsQ29udGV4dCwgbywgbzEpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxGZWF0dXJlRGVzY3JpcHRvcj4gZ2V0RmVhdHVyZURlc2NyaXB0b3JzKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0RmVhdHVyZURlc2NyaXB0b3JzKGVsQ29udGV4dCwgbyk7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzPD8+IGdldENvbW1vblByb3BlcnR5VHlwZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbykKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENvbW1vblByb3BlcnR5VHlwZShlbENvbnRleHQsIG8pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRUxDb250ZXh0IGNyZWF0ZUNvbnRleHRXcmFwcGVyKGZpbmFsIEVMQ29udGV4dCBjb250ZXh0LCBmaW5hbCBFTFJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFTENvbnRleHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRMb2NhbGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVJlc29sdmVkKGJvb2xlYW4gdmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuc2V0UHJvcGVydHlSZXNvbHZlZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRQcm9wZXJ0eVJlc29sdmVkKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwdXRDb250ZXh0KENsYXNzIGNsYXp6LCBPYmplY3Qgb2JqZWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyLnB1dENvbnRleHQoY2xhenosIG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5wdXRDb250ZXh0KGNsYXp6LCBvYmplY3QpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udGV4dChDbGFzcyBjbGF6eikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRDb250ZXh0KGNsYXp6KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvY2FsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlci5zZXRMb2NhbGUobG9jYWxlKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldExvY2FsZShsb2NhbGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBFTFJlc29sdmVyIGdldEVMUmVzb2x2ZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgRnVuY3Rpb25NYXBwZXIgZ2V0RnVuY3Rpb25NYXBwZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldEZ1bmN0aW9uTWFwcGVyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFZhcmlhYmxlTWFwcGVyIGdldFZhcmlhYmxlTWFwcGVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRWYXJpYWJsZU1hcHBlcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH07Ci0gICAgfQotCi0gICAgcHVibGljIFZhbHVlRXhwcmVzc2lvbiBnZXRDb21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMuY29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbkhvbGRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uSG9sZGVyLmdldEV4cHJlc3Npb24odGhpcy5jb21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uQmFzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0ZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0ZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjJiODlmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogSGVscGVyIGNsYXNzIHRvIGdldCB0aGUgcmVhbC9mdWxsIHZhbHVlIGJpbmRpbmcgLSB0ZXN0ZWQgd2l0aCBmYWNlbGV0cyAxLjEuMTQNCi0gKiBUaGUgdGFyZ2V0IGlzIHRvIGdldCByaWQgb2YgdGhpcyBpbXBsLiAtIGN1cnJlbnRseSBpdCdzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IGN1c3RvbSBmYWNlbGV0cyBjb21wb25lbnRzLg0KLSAqIEFuIGFsdGVybmF0aXZlIHdvdWxkIGJlIGFuIEVMLVJlc29sdmVyIC0gdGhlcmUgYXJlIHN0aWxsIHNvbWUgb3BlbiBpc3N1ZXMgd2l0aCBzdWNoIGFuIGFwcHJvYWNoDQotICogKyBJdCBpc24ndCBhdmFpbGFibGUgd2l0aCBKU0YgMS4xLngNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9DcmVhdGVWYWx1ZUJpbmRpbmdGb3JGYWNlbGV0c0JpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBEZWZhdWx0RUxIZWxwZXIuZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEJpbmRpbmdzID0gZXh0cmFjdEVMVGVybXMoDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmluZGluZ09mQ29tcG9uZW50KHVpQ29tcG9uZW50LCAidmFsdWUiKSk7DQotDQotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZT0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIDEpICsgInsiICsgY3JlYXRlQmluZGluZyhmb3VuZEJpbmRpbmdzLCBtYXBwZWRGYWNlbGV0c1ZhcnMpICsgIn0iKTsNCi0NCi0gICAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YmUuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotDQotICAgICAgICAgICAgaWYoZW50aXR5Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnlUb1JlcGxhY2VWYXJzKHZiZSwgbWFwcGVkRmFjZWxldHNWYXJzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHZiZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVCaW5kaW5nKExpc3Q8U3RyaW5nPiBleHByZXNzaW9ucywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkZWRWaXJ0dWFsTmFtZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGVudHJ5IDogZXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoIlZhbHVlRXhwcmVzc2lvblsiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBmb3VuZEJpbmRpbmdEZXRhaWxzID0gZW50cnkuc3BsaXQoIiAiKTsNCi0gICAgICAgICAgICBpbmRleE9mQmluZGluZ0RldGFpbHMgPSBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKGZvdW5kQmluZGluZ0RldGFpbHMpOw0KLQ0KLSAgICAgICAgICAgIGlmIChpbmRleE9mQmluZGluZ0RldGFpbHMgPT0gLTEpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgYmluZGluZ0RldGFpbHMgPSBmb3VuZEJpbmRpbmdEZXRhaWxzW2luZGV4T2ZCaW5kaW5nRGV0YWlsc10uc3BsaXQoIj0iKTsNCi0NCi0gICAgICAgICAgICBpZiAoYmluZGluZ0RldGFpbHMubGVuZ3RoIDwgMikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGJpbmRpbmdEZXRhaWxzWzFdOw0KLQ0KLSAgICAgICAgICAgIC8vdG8gc3VwcG9ydCBibGFua3Mgd2l0aGluIGEgYmluZGluZyB3aXRoIG1hcCBzeW50YXgNCi0gICAgICAgICAgICBpZihjdXJyZW50QmluZGluZy5jb250YWlucygieyIpICYmICFjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgPSBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKGN1cnJlbnRCaW5kaW5nLCBmb3VuZEJpbmRpbmdEZXRhaWxzLCBpbmRleE9mQmluZGluZ0RldGFpbHMpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnNLZXkoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5wdXQoYmluZGluZ0RldGFpbHNbMF0sIGN1cnJlbnRCaW5kaW5nKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvL2VudHJ5IGZvciAidmlydHVhbCIgZmFjZWxldHMgdmFyDQotICAgICAgICAgICAgaWYoIShjdXJyZW50QmluZGluZy5jb250YWlucygieyIpIHx8IGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhcnMucHV0KGJpbmRpbmdEZXRhaWxzWzBdLCBiaW5kaW5nRGV0YWlsc1sxXS5zdWJzdHJpbmcoMSwgYmluZGluZ0RldGFpbHNbMV0ubGVuZ3RoKCktMikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBvcmlnaW5hbEJpbmRpbmcgPSBhZGRlZFZpcnR1YWxOYW1lcy5nZXQoInZhbHVlIik7DQotICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcuc3Vic3RyaW5nKG9yaWdpbmFsQmluZGluZy5pbmRleE9mKCJ7IikgKyAxLCBvcmlnaW5hbEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLnJlbW92ZSgidmFsdWUiKTsNCi0gICAgICAgIHJldHVybiB0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcob3JpZ2luYWxCaW5kaW5nLCBhZGRlZFZpcnR1YWxOYW1lcywgdmlydHVhbFZhcnMpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcoDQotICAgICAgICAgICAgU3RyaW5nIG9yaWdpbmFsQmluZGluZywgTWFwPFN0cmluZywgU3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gIiN7IiArIG9yaWdpbmFsQmluZGluZyArICJ9IjsNCi0gICAgICAgIEl0ZXJhdG9yIG5hbWVJdGVyYXRvciA9IGFkZGVkVmlydHVhbE5hbWVzLmtleVNldCgpLml0ZXJhdG9yKCk7DQotDQotICAgICAgICBTdHJpbmcgY3VycmVudEtleTsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50VmFsdWU7DQotICAgICAgICB3aGlsZShuYW1lSXRlcmF0b3IuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRLZXkgPSAoU3RyaW5nKSBuYW1lSXRlcmF0b3IubmV4dCgpOw0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGFkZGVkVmlydHVhbE5hbWVzLmdldChjdXJyZW50S2V5KTsNCi0gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGN1cnJlbnRWYWx1ZS5pbmRleE9mKCJ7IikgKyAxLCBjdXJyZW50VmFsdWUuaW5kZXhPZigifSIpKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIi4iLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJ7IiArIGN1cnJlbnRLZXkgKyAiWyIsICJ7IiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICIuIiwgIi4iICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiLiIgKyBjdXJyZW50S2V5ICsgIlsiLCAiLiIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiXSIsICJbJyIgKyBjdXJyZW50VmFsdWUgKyAiJ10iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIlsiLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiLiIsICJbIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICB9DQotDQotICAgICAgICBuYW1lSXRlcmF0b3IgPSB2aXJ0dWFsVmFycy5rZXlTZXQoKS5pdGVyYXRvcigpOw0KLQ0KLSAgICAgICAgd2hpbGUobmFtZUl0ZXJhdG9yLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50S2V5ID0gKFN0cmluZykgbmFtZUl0ZXJhdG9yLm5leHQoKTsNCi0NCi0gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSB2aXJ0dWFsVmFycy5nZXQoY3VycmVudEtleSk7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoInsiICsgY3VycmVudEtleSArICIuIiwgInsiICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIlsiLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCIuIiArIGN1cnJlbnRLZXkgKyAiLiIsICIuIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICJbIiwgIi4iICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIl0iLCAiWyciICsgY3VycmVudFZhbHVlICsgIiddIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIlsiICsgY3VycmVudEtleSArICJbIiwgIlsiICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIi4iLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG9yaWdpbmFsQmluZGluZy5zdWJzdHJpbmcoMiwgb3JpZ2luYWxCaW5kaW5nLmxlbmd0aCgpIC0gMSk7DQotICAgIH0NCi0NCi0gICAgLy90byBzdXBwb3J0IGJsYW5rcyAtIGUuZy4gd2l0aCBtYXAgc3ludGF4DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKFN0cmluZyBjdXJyZW50QmluZGluZywgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlscykNCi0gICAgew0KLSAgICAgICAgZm9yKGludCBpID0gaW5kZXhPZkJpbmRpbmdEZXRhaWxzICsgMTsgaSA8IGZvdW5kQmluZGluZ0RldGFpbHMubGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgKz0gZm91bmRCaW5kaW5nRGV0YWlsc1tpXTsNCi0gICAgICAgICAgICBpZihmb3VuZEJpbmRpbmdEZXRhaWxzW2ldLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEJpbmRpbmc7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRCaW5kaW5nOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBpbnQgY291bnQgPSAwOw0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBiaW5kaW5nRGV0YWlscykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuY29udGFpbnMoIj0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY291bnQrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZXh0cmFjdEVMVGVybXMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlRUxUZXJtcyhvLCBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKSwgZm91bmRFTFRlcm1zLCAwKSA+IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRFTFRlcm1zOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcmVzb2x2ZUVMVGVybXMoT2JqZWN0IG8sIE1hcDxPYmplY3QsIE9iamVjdD4gdmlzaXRlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMsIGludCBjb3VudCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAobyA9PSBudWxsIHx8IHZpc2l0ZWQuY29udGFpbnNLZXkobykgfHwgY291bnQgPiA1MCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZpc2l0ZWQucHV0KG8sIG51bGwpOw0KLQ0KLSAgICAgICAgaW50IGVsQ291bnQgPSAwOw0KLSAgICAgICAgQ2xhc3MgYyA9IG8uZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIC8vaW5zcGVjdCBtYXBzDQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1hcCkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBmb3IgKE9iamVjdCBlbnRyeSA6ICgoTWFwKSBvKS52YWx1ZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZm91bmQgZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICAgICAgaWYoZW50cnkudG9TdHJpbmcoKS5jb250YWlucygiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKGVudHJ5LnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoZW50cnksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGVsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQobykpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gKytlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9hbmFseXplIGFycmF5cw0KLSAgICAgICAgaWYgKGMuaXNBcnJheSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgobyk7DQotICAgICAgICAgICAgLy9jaGVjayBhcnJheSBbTCAtPiBubyBhcnJheSBvZiBwcmltaXRpdmUgdHlwZXMNCi0gICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMamF2YS5sYW5nLlN0cmluZyIpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChBcnJheS5nZXQobywgaSkpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKEFycmF5LmdldChvLCBpKSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxGaWVsZD4gYXR0cmlidXRlcyA9IGZpbmRBbGxBdHRyaWJ1dGVzKGMsIG5ldyBBcnJheUxpc3Q8RmllbGQ+KCkpOw0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBhdHRyaWJ1dGVzLnRvQXJyYXkobmV3IEZpZWxkW2F0dHJpYnV0ZXMuc2l6ZSgpXSk7DQotDQotICAgICAgICBBY2Nlc3NpYmxlT2JqZWN0LnNldEFjY2Vzc2libGUoZmllbGRzLCB0cnVlKTsNCi0gICAgICAgIGZvciAoRmllbGQgY3VycmVudEZpZWxkIDogZmllbGRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQuZ2V0KG8pID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5nZXRUeXBlKCkuZXF1YWxzKFN0cmluZy5jbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmdldChvKSAhPSBudWxsICYmIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKGN1cnJlbnRGaWVsZC5nZXQobykpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFjdXJyZW50RmllbGQuZ2V0VHlwZSgpLmlzUHJpbWl0aXZlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKGN1cnJlbnRGaWVsZC5nZXQobyksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZWxDb3VudDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEZpZWxkPiBmaW5kQWxsQXR0cmlidXRlcyhDbGFzcyBjLCBMaXN0PEZpZWxkPiBhdHRyaWJ1dGVzKQ0KLSAgICB7DQotICAgICAgICBpZiAoYyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluZEFsbEF0dHJpYnV0ZXMoYy5nZXRTdXBlcmNsYXNzKCksIGF0dHJpYnV0ZXMpOw0KLQ0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBjLmdldERlY2xhcmVkRmllbGRzKCk7DQotICAgICAgICBmb3IgKEZpZWxkIGN1cnJlbnRGaWVsZCA6IGZpZWxkcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzU3RhdGljKGN1cnJlbnRGaWVsZC5nZXRNb2RpZmllcnMoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChjdXJyZW50RmllbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9SZXBsYWNlVmFycyhWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eTsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0gICAgICAgIGJvb2xlYW4gbGFzdCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgd2hpbGUodHJ1ZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxhc3QgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0NCi0gICAgICAgICAgICBwcm9wZXJ0eSA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbg0KLSAgICAgICAgICAgICAgICAucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIGdldE5ld1Byb3BlcnR5KHByb3BlcnR5LCBtYXBwZWRGYWNlbGV0c1ZhcnMpKTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQubGVuZ3RoKCkgPT0gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpICsgIi4iICsgcmVzdWx0Ow0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpOw0KLQ0KLSAgICAgICAgICAgIGlmKGxhc3QpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcmVmaXgoKSArICJ7IiArIHJlc3VsdCArICJ9Iik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5ld1Byb3BlcnR5KFN0cmluZyBvbGRQcm9wZXJ0eSwgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFycyA9IGdldFBvdGVudGlhbFZpcnR1YWxWYXJzKG9sZFByb3BlcnR5KTsNCi0NCi0gICAgICAgIGZvcihTdHJpbmcgdmlydHVhbFZhciA6IHZpcnR1YWxWYXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1hcHBlZEZhY2VsZXRzVmFycy5jb250YWluc0tleSh2aXJ0dWFsVmFyKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG9sZFByb3BlcnR5ID0gcmVwbGFjZVByb3BlcnR5VmFsdWUob2xkUHJvcGVydHksIHZpcnR1YWxWYXIsIG1hcHBlZEZhY2VsZXRzVmFycy5nZXQodmlydHVhbFZhcikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvbGRQcm9wZXJ0eTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0UG90ZW50aWFsVmlydHVhbFZhcnMoU3RyaW5nIG9sZFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpbnQgc3RhcnQgPSAtMTsNCi0gICAgICAgIGludCBlbmQgPSAtMTsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG9sZFByb3BlcnR5Lmxlbmd0aCgpOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoc3RhcnQgPT0gLSAxICYmIG9sZFByb3BlcnR5LmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKChzdGFydCAhPSAtIDEgJiYgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICdbJykgfHwgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICddJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGVuZCA9IGk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKHN0YXJ0ICE9IC0xICYmIGVuZCAhPSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJMaXN0LmFkZChvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOw0KLSAgICAgICAgICAgICAgICBpZihvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbmQgPSAtMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlydHVhbFZhckxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcGxhY2VQcm9wZXJ0eVZhbHVlKFN0cmluZyBvbGRQcm9wZXJ0eSwgU3RyaW5nIHRhcmdldFZhciwgU3RyaW5nIG5ld1ZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpbnQgaW5kZXggPSBvbGRQcm9wZXJ0eS5pbmRleE9mKHRhcmdldFZhcik7DQotDQotICAgICAgICBpZihpbmRleCA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gb2xkUHJvcGVydHk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gb2xkUHJvcGVydHkuc3Vic3RyaW5nKDAsIGluZGV4KTsNCi0gICAgICAgIHJlc3VsdCArPSBuZXdWYWx1ZTsNCi0gICAgICAgIHJldHVybiByZXN1bHQgKyBvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoaW5kZXggKyB0YXJnZXRWYXIubGVuZ3RoKCksIG9sZFByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiByZXBsYWNlIHZpcnR1YWwgZmFjZWxldHMgdmFycyAobWFwIHN5bnRheCkNCi0gICAgICogdGVzdGVkIHN0eWxlcyAoc2ltcGxlIGFuZCBuZXN0ZWQpOiB0ZXN0W2l4W2l4MltpeDNdXV0NCi0gICAgICovDQotICAgIC8qDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBfY3JlYXRlQmluZGluZyhMaXN0PFN0cmluZz4gZXhwcmVzc2lvbnMsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmlydHVhbFZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0NCi0gICAgICAgIFN0cmluZyBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50QmluZGluZzsNCi0gICAgICAgIFN0cmluZyBwYXJ0T2ZCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBleHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aCgiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZvdW5kQmluZGluZ0RldGFpbHMgPSBlbnRyeS5zcGxpdCgiICIpOw0KLSAgICAgICAgICAgIGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoZm91bmRCaW5kaW5nRGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9PSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBiaW5kaW5nRGV0YWlscyA9IGZvdW5kQmluZGluZ0RldGFpbHNbaW5kZXhPZkJpbmRpbmdEZXRhaWxzXS5zcGxpdCgiPSIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nRGV0YWlscy5sZW5ndGggPCAyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYmluZGluZ0RldGFpbHNbMV07DQotDQotICAgICAgICAgICAgLy90byBzdXBwb3J0IGJsYW5rcyB3aXRoaW4gYSBiaW5kaW5nIHdpdGggbWFwIHN5bnRheA0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgJiYgIWN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoY3VycmVudEJpbmRpbmcsIGZvdW5kQmluZGluZ0RldGFpbHMsIGluZGV4T2ZCaW5kaW5nRGV0YWlscyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lICE9IG51bGwgJiYgY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnMoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBwYXJ0T2ZCaW5kaW5nID0gY3VycmVudEJpbmRpbmcuc3Vic3RyaW5nKGN1cnJlbnRCaW5kaW5nLmluZGV4T2YocHJldkZhY2VsZXRzQXR0cmlidXRlTmFtZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICArIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUubGVuZ3RoKCksIGN1cnJlbnRCaW5kaW5nLmluZGV4T2YoIn0iKSk7DQotDQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5hZGQoYmluZGluZ0RldGFpbHNbMF0pOw0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgcGFydE9mQmluZGluZzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICBlbHNlIGlmKCEoY3VycmVudEJpbmRpbmcuY29udGFpbnMoInsiKSB8fCBjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJzLnB1dChiaW5kaW5nRGV0YWlsc1swXSwgYmluZGluZ0RldGFpbHNbMV0uc3Vic3RyaW5nKDEsIGJpbmRpbmdEZXRhaWxzWzFdLmxlbmd0aCgpLTIpKTsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWlucyhiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLmFkZChiaW5kaW5nRGV0YWlsc1swXSk7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyZW50QmluZGluZy5zdWJzdHJpbmcoY3VycmVudEJpbmRpbmcuaW5kZXhPZigieyIpICsgMSwgY3VycmVudEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gYmluZGluZ0RldGFpbHNbMF07DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotICAgICovDQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzhlYjY2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRpZmZlcmVuY2UgYmV0d2VlbiBbIGFuZCBbJyAtIHRlc3Qgd2l0aCBtb3JlIGNvbnN0ZWxsYXRpb25zIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQ0KLXB1YmxpYyBjbGFzcyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotew0KLSAgICBwcml2YXRlIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYmFzZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7DQotICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdG9rZW47DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXBsYWNlT3JBZGRQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlcGxhY2VQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1Byb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICAvL1RPRE8gYWRqdXN0bWVudHMgZm9yIGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLmVuZHNXaXRoKCInXSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYWRkUHJvcGVydHkoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBzb3VyY2VFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc291cmNlRXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgc291cmNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpOw0KLQ0KLSAgICAgICAgLy9UT0RPIGFkanVzdG1lbnRzIGZvciBpc0R5bmFtaWNCYXNlQW5kUHJvcGVydHkNCi0gICAgICAgIGlmKG5ld1Byb3BlcnR5LnN0YXJ0c1dpdGgoIlsnIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHJlc3VsdCArIG5ld1Byb3BlcnR5ICsgIn0iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ocmVzdWx0ICsgIi4iICsgbmV3UHJvcGVydHkgKyAifSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKFN0cmluZyBleHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBpZighRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQoZXhwcmVzc2lvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihleHByZXNzaW9uICsgIiBpcyBubyB2YWxpZCBlbC1leHByZXNzaW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBib29sZWFuIGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSA9IGV4cHJlc3Npb24ubGFzdEluZGV4T2YoIiddIikgPT0gLTE7DQotICAgICAgICBpbnQgaW5kZXgxID0gaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5ID8gZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiXSIpIDogZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiJ10iKTsNCi0gICAgICAgIGludCBpbmRleDIgPSBleHByZXNzaW9uLmxhc3RJbmRleE9mKCIuIik7DQotDQotICAgICAgICBpZihpbmRleDEgPiBpbmRleDIpDQotICAgICAgICB7DQotICAgICAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGluZGV4MSk7DQotDQotICAgICAgICAgICAgaW50IGluZGV4MyA9IGZpbmRJbmRleE9mU3RhcnRpbmdCcmFja2V0KGV4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIGlmKGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZyhpbmRleDMgKyAxLCBpbmRleDEpOw0KLQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoaW5kZXgzICsgMiwgaW5kZXgxKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdGhpcy5iYXNlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgzKSArICJ9Iik7DQotICAgICAgICAgICAgdGhpcy50b2tlbiA9IGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSA/ICJbIiA6ICJbJyI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKCBpbmRleDIgPiBpbmRleDEpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKGluZGV4MiArIDEsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxICk7DQotICAgICAgICAgICAgdGhpcy5iYXNlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgyKSArICJ9Iik7DQotICAgICAgICAgICAgdGhpcy50b2tlbiA9ICIuIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoMiwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpOw0KLSAgICAgICAgICAgIHRoaXMucHJlZml4ID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgMSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnRyaW0oKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYoIlsiLmVxdWFscyh0aGlzLnRva2VuKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLnZhbHVlLnN0YXJ0c1dpdGgoIiciKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlLnN1YnN0cmluZygxLCB0aGlzLnZhbHVlLmxlbmd0aCgpIC0gMSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vcmV0dXJuIHRoaXMuYmFzZS52YWx1ZSArIHRoaXMudG9rZW4gKyB0aGlzLnZhbHVlLnN1YnN0cmluZygwLCB0aGlzLnZhbHVlLmxlbmd0aCgpKSArICInXSI7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gZ2V0QmFzZUV4cHJlc3Npb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmFzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4cHJlc3Npb25TdHJpbmcoKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgYmFzZUV4cHJlc3Npb24gPSB0aGlzLmJhc2UuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLQ0KLSAgICAgICAgICAgIGlmKCJbJyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAiJ119IjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZigiWyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAiXX0iOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gYmFzZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGJhc2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSkgKyB0aGlzLnRva2VuICsgdGhpcy52YWx1ZSArICJ9IjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVmaXggKyAieyIgKyB0aGlzLnZhbHVlICsgIn0iOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5iYXNlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZS5nZXRQcmVmaXgoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJlZml4Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmJhc2Uuc2V0UHJlZml4KHByZWZpeCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEV4cHJlc3Npb25TdHJpbmcoKS5oYXNoQ29kZSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gJiYgZ2V0RXhwcmVzc2lvblN0cmluZygpDQotICAgICAgICAgICAgLmVxdWFscygoKFZhbHVlQmluZGluZ0V4cHJlc3Npb24pIHRhcmdldCkuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGludCBmaW5kSW5kZXhPZlN0YXJ0aW5nQnJhY2tldChTdHJpbmcgZXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgaW50IGNsb3NlQ291bnQgPSAwOw0KLSAgICAgICAgZm9yKGludCBpID0gZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDE7IGkgPiAwOyBpLS0pDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoZXhwcmVzc2lvbi5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2xvc2VDb3VudC0tOw0KLSAgICAgICAgICAgICAgICBpZihjbG9zZUNvdW50IDwgMCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZihleHByZXNzaW9uLmNoYXJBdChpKSA9PSAnXScpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjbG9zZUNvdW50Kys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgyZTUxNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxUPiBpbXBsZW1lbnRzIE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8TmFtZU1hcHBlcjxUPj4NCi17DQotICAgIHByaXZhdGUgTGlzdDxDbGFzcz4gZGVuaWVkTmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLQ0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVnaXN0ZXIoTmFtZU1hcHBlcjxUPiBuYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICBpZighZGVuaWVkTmFtZU1hcHBlckxpc3QuY29udGFpbnMobmFtZU1hcHBlci5nZXRDbGFzcygpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBnZXROYW1lTWFwcGVyTGlzdCgpLmFkZChuYW1lTWFwcGVyKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGVyZWdpc3RlcihDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gY2xhc3NUb0RlcmVnaXN0ZXIpDQotICAgIHsNCi0gICAgICAgIEl0ZXJhdG9yPE5hbWVNYXBwZXI8VD4+IG5hbWVNYXBwZXJJdGVyYXRvciA9IGdldE5hbWVNYXBwZXJMaXN0KCkuaXRlcmF0b3IoKTsNCi0gICAgICAgIHdoaWxlKG5hbWVNYXBwZXJJdGVyYXRvci5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobmFtZU1hcHBlckl0ZXJhdG9yLm5leHQoKS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NUb0RlcmVnaXN0ZXIuZ2V0TmFtZSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG5hbWVNYXBwZXJJdGVyYXRvci5yZW1vdmUoKTsNCi0gICAgICAgICAgICAgICAgLy9kb24ndCBicmVhayAtIGUuZy4gdG8gZGVyZWdpc3RlciBhbGwgd3JhcHBlcnMuLi4NCi0gICAgICAgICAgICAgICAgLy9icmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZGVueShDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gY2xhc3NUb0RlbnkpDQotICAgIHsNCi0gICAgICAgIGRlcmVnaXN0ZXIoY2xhc3NUb0RlbnkpOw0KLQ0KLSAgICAgICAgc3luY2hyb25pemVkIChnZXRDbGFzcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGRlbmllZE5hbWVNYXBwZXJMaXN0LmFkZChjbGFzc1RvRGVueSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IExpc3Q8TmFtZU1hcHBlcjxUPj4gZ2V0TmFtZU1hcHBlckxpc3QoKTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzY2MDcwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIENsYXNzTWFwcGluZ0ZhY3Rvcnk8UCwgUj4NCi17DQotICAgIFIgY3JlYXRlKFAgc291cmNlKTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRGVmYXVsdEZhY3RvcnlGaW5kZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0RlZmF1bHRGYWN0b3J5RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MzJkYmEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRGVmYXVsdEZhY3RvcnlGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5EZWZhdWx0RUxIZWxwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkRlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vL2R5bmFtaWMgYXBwcm9hY2ggdG8gY3JlYXRlIHRoZSBmYWN0b3JpZXMgZHVyaW5nIHRoZSBmaXJzdCByZXF1ZXN0LCB3aGVuIGEgZmFjZXMtY29udGV4dCBpcyBhdmFpbGFibGUNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RmFjdG9yeUZpbmRlciBpbXBsZW1lbnRzIEZhY3RvcnlGaW5kZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotICAgIHByb3RlY3RlZCBNYXA8RmFjdG9yeU5hbWVzLCBPYmplY3Q+IGZhY3RvcnlNYXAgPSBuZXcgSGFzaE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4oKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgRmFjdG9yeUZpbmRlciBmYWN0b3J5RmluZGVyID0gbmV3IERlZmF1bHRGYWN0b3J5RmluZGVyKCk7DQotDQotICAgIHByaXZhdGUgRGVmYXVsdEZhY3RvcnlGaW5kZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjdG9yeUZpbmRlciBnZXRJbnN0YW5jZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWN0b3J5RmluZGVyOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyBmaW5hbCA8VD4gVCBnZXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIGlmKCEoZmFjdG9yeU1hcC5jb250YWluc0tleShmYWN0b3J5TmFtZSkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRGYWN0b3J5KGZhY3RvcnlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoVClmYWN0b3J5TWFwLmdldChmYWN0b3J5TmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgc3dpdGNoIChmYWN0b3J5TmFtZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjYXNlIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlTWVzc2FnZVJlc29sdmVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBSRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBFTF9IRUxQRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZUVMSGVscGVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIEZBQ0VTX01FU1NBR0VfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZUZhY2VzTWVzc2FnZUZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgZGVmYXVsdDogLy9yZXF1aXJlZCBieSBjaGVja3N0eWxlDQotICAgICAgICB9DQotDQotICAgICAgICBpZihmYWN0b3J5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IHBvc3NpYmxlIHRvIGNyZWF0ZSBmYWN0b3J5ICIgKyBmYWN0b3J5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBmYWN0b3J5TWFwLnB1dChmYWN0b3J5TmFtZSwgZmFjdG9yeSk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZKTsNCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZKSk7DQotICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkpOw0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZKSk7DQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkpOw0KLSAgICAgICAgbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZKSk7DQotICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSApOw0KLSAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZKSk7DQotICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgY3JlYXRlRmFjZXNNZXNzYWdlRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fRkFDRVNfTUVTU0FHRV9GQUNUT1JZKTsNCi0gICAgICAgIGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkZBQ0VTX01FU1NBR0VfRkFDVE9SWSkpOw0KLQ0KLSAgICAgICAgT2JqZWN0IHRhcmdldCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KEN1c3RvbUluZm9ybWF0aW9uLkZBQ0VTX01FU1NBR0VfRkFDVE9SWS5uYW1lKCkpOw0KLSAgICAgICAgaWYodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0IGluc3RhbmNlb2YgU3RyaW5nKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzLmFkZCgoU3RyaW5nKXRhcmdldCk7DQotICAgICAgICB9DQotICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgY3JlYXRlRUxIZWxwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0RUxIZWxwZXJGYWN0b3J5KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2JkOGEzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRmFjZXNNZXNzYWdlRmFjdG9yeQ0KLXsNCi0gICAgRmFjZXNNZXNzYWdlIGNvbnZlcnQoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSk7DQotDQotICAgIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlGaW5kZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmMjYyNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnlGaW5kZXIKLXsKLSAgICA8VD4gVCBnZXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpOwotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeU5hbWVzLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFmMzEzOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQotcHVibGljIGVudW0gRmFjdG9yeU5hbWVzCi17Ci0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksCi0gICAgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLAotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLAotCi0gICAgRkFDRVNfTUVTU0FHRV9GQUNUT1JZLAotCi0gICAgUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwKLSAgICBFTF9IRUxQRVJfRkFDVE9SWQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDJkMWYwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L05hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFQgZXh0ZW5kcyBOYW1lTWFwcGVyPg0KLXsNCi0gICAgdm9pZCByZWdpc3RlcihUIGNsYXNzVG9BZGQpOw0KLSAgICB2b2lkIGRlcmVnaXN0ZXIoQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IGNsYXNzVG9EZXJlZ2lzdGVyKTsNCi0gICAgdm9pZCBkZW55KENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBjbGFzc1RvRGVueSk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjliZDk3YS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gaW5pdGlhbGl6ZSBjb21wb25lbnRzIGJlZm9yZUVuY29kZUJlZ2luLjxici8+DQotICogZS5nLjogeW91IGNhbiBhZGQgaW5mb3JtYXRpb24gZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gbWVjaGFuaXNtcywuLi4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50SW5pdGlhbGl6ZXINCi17DQotICAgIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTljMDQxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBTdGF0aWNDb25maWd1cmF0aW9uPFQsIFI+DQotew0KLSAgICB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCk7DQotICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFQsIFI+PiBnZXRNYXBwaW5nKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiODRhZjUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGNsYXNzIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxULCBSPg0KLXsNCi0gICAgcHJpdmF0ZSBUIHNvdXJjZTsNCi0gICAgcHJpdmF0ZSBSIHRhcmdldDsNCi0NCi0gICAgcHVibGljIFQgZ2V0U291cmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHNvdXJjZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoVCBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSIGdldFRhcmdldCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KFIgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmJjZGM0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSX0pCi1wdWJsaWMgZW51bSBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMKLXsKLSAgICBNRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9DT05GSUcsCi0KLSAgICBTS0lQX1ZBTElEQVRJT05fU1VQUE9SVF9DT05GSUcKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGNiNmY0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3MKLSAgICAgICAgPSBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VPZk1hcHBpbmcoU3RyaW5nIHBhdGgpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGdldE1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2Uoc291cmNlKTsKLSAgICAgICAgZW50cnkuc2V0VGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgIHRoaXMubWFwcGluZ3MuYWRkKGVudHJ5KTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhNjNjNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIFN0cmluZyBwYXRoOwotICAgIHByaXZhdGUgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5nczsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCkKLSAgICB7Ci0gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgICAgIC8vZm9yY2UgcmVsb2FkCi0gICAgICAgIG1hcHBpbmdzID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBnZXRNYXBwaW5nKCkKLSAgICB7Ci0gICAgICAgIGlmKG1hcHBpbmdzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtYXBwaW5nczsKLSAgICAgICAgfQotCi0gICAgICAgIG1hcHBpbmdzID0gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotCi0gICAgICAgIFJlc291cmNlQnVuZGxlIG1hcHBpbmcgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocGF0aCk7Ci0KLSAgICAgICAgaWYgKG1hcHBpbmcgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9sb2dnaW5nCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IG1hcHBpbmcuZ2V0S2V5cygpOwotCi0gICAgICAgIFN0cmluZyBtZXRhRGF0YUtleTsKLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsKLQotICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YURhdGFLZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSBtYXBwaW5nLmdldFN0cmluZyhtZXRhRGF0YUtleSk7Ci0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWV0YURhdGFLZXksIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBtZXRhRGF0YUtleSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2UobWV0YURhdGFLZXkpOwotICAgICAgICBlbnRyeS5zZXRUYXJnZXQodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsKLSAgICAgICAgdGhpcy5tYXBwaW5ncy5hZGQoZW50cnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk5Mzk2OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yIGltcGxlbWVudHMgUmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRJbnRlcmNlcHRvcklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJldHVyblZhbHVlT25Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKAotICAgICAgICBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIHNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24sIE9iamVjdCBjdXJyZW50UmV0dXJuVmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gY3VycmVudFJldHVyblZhbHVlOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBiZWZvcmUKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJlZm9yZURlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGFmdGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhM2IxYjYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlJbmZvcm1hdGlvbiB0aGUgaW5mb3JtYXRpb24gZW50cnkgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3BlcnR5DQotICAgICAqLw0KLSAgICB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxZjA1NC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEFsbG93cyB0byBpbnRlcmNlcHQgcmVuZGVyZXIgbWV0aG9kcy48YnIvPgotICogQmFzZSBtZWNoYW5pc20gb2YgZXh0dmFsLiBJdCBhbGxvd3MgdG8gYWRkIGN1c3RvbSBpbmZyYXN0cnVjdHVyZXMuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIFJlbmRlcmVySW50ZXJjZXB0b3IKLXsKLSAgICBTdHJpbmcgZ2V0SW50ZXJjZXB0b3JJZCgpOwotCi0gICAgT2JqZWN0IGdldFJldHVyblZhbHVlT25Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKAotICAgICAgICBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIHNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24sIE9iamVjdCBjdXJyZW50UmV0dXJuVmFsdWUpOwotCi0gICAgLyoKLSAgICAgKiBiZWZvcmUKLSAgICAgKi8KLSAgICB2b2lkIGJlZm9yZURlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlRW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIC8qCi0gICAgICogYWZ0ZXIKLSAgICAgKi8KLSAgICB2b2lkIGFmdGVyRGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyRW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdjMDlhYi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEFsbG93cyB0byBpbnRlcmNlcHQgdmFsaWRhdGlvciBleGNlcHRpb25zLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAqIEBwYXJhbSBtZXRhRGF0YUVudHJ5IHRoZSBtZXRhIGRhdGEgZW50cnkgd2hpY2ggY29udGFpbnMgdGhlIG1ldGEgZGF0YSBvZiB0aGUgcHJvcGVydHkNCi0gICAgICogQHBhcmFtIGNvbnZlcnRlZE9iamVjdCB0aGUgY29udmVydGVkIHVzZXIgaW5wdXQNCi0gICAgICogQHBhcmFtIHZhbGlkYXRvckV4Y2VwdGlvbiB0aGUgY3VycmVudCBleGNlcHRpb24NCi0gICAgICogQHBhcmFtIHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IHdoaWNoIHRocmV3IHRoZSBleGNlcHRpb24NCi0gICAgICogQHJldHVybiBmYWxzZSB0byBzdG9wIHRocm93aW5nIHRoZSBleGNlcHRpb24NCi0gICAgICovDQotICAgIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlODhiMi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvbkludGVyY2VwdG9yDQotew0KLSAgICAvKioNCi0gICAgICogQHJldHVybiBmYWxzZSBpZiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzIHNob3VsZCBiZSBieXBhc3NlZA0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpOw0KLQ0KLSAgICAvKioNCi0gICAgICogcHJvY2Vzc2VkIGlmIHZhbGlkYXRpb24gd2FzIGV4ZWN1dGVkDQotICAgICAqIGluIGNvbnRyYXN0IHRvIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpdCBnZXRzIGV4ZWN1dGVkIGluIGFueSBjYXNlDQotICAgICAqLw0KLSAgICB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25SZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvblJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRiOWQyNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvblJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblJlbmRlcmVySW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW5pdENvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYoISh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCB0byBpbml0IGNvbXBvbmVudCAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsKLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOwotCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gRXh0VmFsVXRpbHMuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IG1ldGFEYXRhRXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCkuZ2V0TWV0YURhdGFFbnRyaWVzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKGVudHJ5LmdldEtleSgpKTsKLQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCFza2lwVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uU3RyYXRlZ3ksIGVudHJ5KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSBFeHRWYWxVdGlscy5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKG1ldGFEYXRhID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZighbWV0YURhdGEuaXNFbXB0eSgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlNLSVBfVkFMSURBVElPTiwgQm9vbGVhbi5jbGFzcykpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04sIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vZ2V0IGNvbXBvbmVudCBpbml0aWFsaXplciBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50IGFuZCBjb25maWd1cmUgaXQKLSAgICAgICAgICAgICAgICAvL2Fsc28gaW4gY2FzZSBvZiBza2lwcGVkIHZhbGlkYXRpb24gdG8gcmVzZXQgZS5nLiB0aGUgcmVxdWlyZWQgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgaWYoIW1ldGFEYXRhLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbmZpZ3VyZUNvbXBvbmVudFdpdGhNZXRhRGF0YShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJpbml0IGNvbXBvbmVudCBvZiAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0ID0gd3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLQotICAgICAgICAvL3JlY29yZGUgdXNlciBpbnB1dCBlLmcuIGZvciBjcm9zcy1jb21wb25lbnQgdmFsaWRhdGlvbgotICAgICAgICBmb3IoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciByZWNvcmRlciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlY29yZGVyLnJlY29yZFVzZXJJbnB1dCh1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsKLQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHJlY29yZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjYWxsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9jZXNzVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbnZlcnRlckV4Y2VwdGlvbihlLmdldEZhY2VzTWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQotICAgIHsKLSAgICAgICAgaWYgKCEodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IgPSBFeHRWYWxVdGlscy5nZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcigpOwotCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG1ldGFEYXRhRXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYoIUV4dFZhbFV0aWxzLmV4ZWN1dGVCZWZvcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uLmNsYXNzLmdldE5hbWUoKSAscHJvcGVydHlJbmZvcm1hdGlvbikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHZhbGlkYXRpb24iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJvY2Vzc0ZpZWxkVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInZhbGlkYXRpb24gZmluaXNoZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uLmNsYXNzLmdldE5hbWUoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRmllbGRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5OwotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldE1ldGFEYXRhRW50cmllcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7Ci0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihza2lwVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uU3RyYXRlZ3ksIGVudHJ5KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vcmVxdWlyZWQgaXMgYSBzcGVjaWFsIGNhc2UgLSByZXNldCBpdAotICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgidmFsaWRhdGUgIiArIGVudHJ5LmdldFZhbHVlKCkgKyAiIHdpdGggIiArIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyB2YWxpZGF0aW9uIHN0cmF0ZWd5IGZvdW5kIGZvciAiICsgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2tpcFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgZW50cnkpCi0gICAgewotICAgICAgICAvL292ZXJyaWRlIGZvciBjdXN0b20gc2tpcCB2YWxpZGF0aW9uIHN1cHBvcnQgKGlmIG5lZWRlZCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2QzODY1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbi4gU3ViY2xhc3NlcyBqdXN0IGhhdmUgdG8gbm93IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgbmFtZSBtYXBwZXIuDQotICoNCi0gKiBOYW1lTWFwcGVycyBhcmUgc3RhdGVsZXNzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFQ+IGltcGxlbWVudHMgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJpdmF0ZSBOYW1lTWFwcGVyPFQ+IGN1c3RvbU5hbWVNYXBwZXI7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShUIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGN1c3RvbU5hbWVNYXBwZXIgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpOw0KLQ0KLSAgICAgICAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU5hbWVNYXBwZXIgPSAoTmFtZU1hcHBlcjxUPikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChjdXN0b21OYW1lTWFwcGVyICE9IG51bGwpID8gY3VzdG9tTmFtZU1hcHBlci5jcmVhdGVOYW1lKHNvdXJjZSkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL05hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDYwNzhkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBuYW1lIG1hcHBlcnMuDQotICogQSBuYW1lIG1hcHBlciBjYWxjdWxhdGVzIGEgbmFtZSBmb3IgYSBnaXZlbiBzb3VyY2Ugb2JqZWN0Lg0KLSAqIGUuZy4gTWV0YS1EYXRhIEtleSAoZS5nLjogYW5ub3RhdGlvbiBjbGFzcyBuYW1lKSAtPiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgU3RyaW5nIGNyZWF0ZU5hbWUoVCBzb3VyY2UpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvQ29tbW9uTWV0YURhdGFLZXlzLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvQ29tbW9uTWV0YURhdGFLZXlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3Y2M0MzEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL0NvbW1vbk1ldGFEYXRhS2V5cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGE7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBoZWxwZXIgZm9yIGZyZXF1ZW50IG1ldGEtZGF0YSBrZXlzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIHBsYWNlZCBpbiBjb3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgaW5mb3JtYXRpb24gaW4gbXVsdGlwbGUgbW9kdWxlcyAodmFsaWRhdGlvbiBtb2R1bGUgYW5kIGNvbXBvbmVudC1zdXBwb3J0IG1vZHVsZSkNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbW9uTWV0YURhdGFLZXlzDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVJUkVEID0gInJlcXVpcmVkIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFLX1JFUVVJUkVEID0gIndlYWtfcmVxdWlyZWQiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTl9MRU5HVEggPSAibWluX2xlbmd0aCI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0xFTkdUSCA9ICJtYXhfbGVuZ3RoIjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9NSU4gPSAicmFuZ2VfbWluIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9NQVggPSAicmFuZ2VfbWF4IjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRURVJOID0gInBhdHRlcm4iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFID0gInBhdHRlcm5fdmFsaWRhdGlvbl9lcnJvcl9tZXNzYWdlIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFTUFJTCA9ICJlbWFpbCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NID0gImN1c3RvbSI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9WQUxJREFUSU9OID0gInNraXBfdmFsaWRhdGlvbiI7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9NZXRhRGF0YUVudHJ5LmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvTWV0YURhdGFFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTU0NTgyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9NZXRhRGF0YUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogRGF0YSBob2xkZXIgd2hpY2ggc3RvcmVzIHRoZSBtZXRhLWRhdGEgYW5kIHNvbWUgaW5mb3JtYXRpb24gd2hlcmUgdGhlIG1ldGEtZGF0YSB3YXMgYXJvdW5kLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIE1ldGFEYXRhRW50cnkKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcga2V5OwotICAgIHByaXZhdGUgT2JqZWN0IHZhbHVlOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gICAgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoInNldHRpbmcgbWV0YS1kYXRhIGtleTogIiArIGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0VmFsdWUoQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgic2V0dGluZyBtZXRhLWRhdGEgdmFsdWU6ICIgKyB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIDxUPiBUIGdldFByb3BlcnR5KFN0cmluZyBrZXksIENsYXNzPFQ+IHRhcmdldENsYXNzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUKWdldFByb3BlcnR5KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoIm5ldyBwcm9wZXJ0eSBhZGRlZCBrZXk6ICIgKyBrZXkgKyAiIHZhbHVlOiAiICsgdmFsdWUgKyAiIGZvciBtZXRhZGF0YS1rZXk6ICIgKyB0aGlzLmtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzJmNGE3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhbGwgZmFjdG9yaWVzIHdoaWNoIGNyZWF0ZSBtZXRhLWRhdGEgZXh0cmFjdG9ycwotICogCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ci17Ci0gICAgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlKCk7Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU4OWM5MC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBleHRyYWN0cyBtZXRhLWRhdGEgKGUuZy4gdGhlIGFubm90YXRpb25zKSBvZiB0aGUgdmFsdWUgYmluZGluZyBvZiBhIGNvbXBvbmVudC4KLSAqIEl0IGV4dHJhY3RzIHRoZSBtZXRhLWRhdGEgb2YgdGhlIGZpZWxkIGFuZCB0aGUgcHJvcGVydHkuCi0gKiAoQWxzbyB0aGUgYW5ub3RhdGlvbnMgb2Ygc3VwZXIgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcy4pCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3RvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQotICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOwotCi0gICAgICAgIC8vc2hvdWxkIG5ldmVyIG9jY3VyCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpICYmIG9iamVjdCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4ob2JqZWN0LmdldENsYXNzKCkgKyAiIGlzIG5vIHZhbGlkIGNvbXBvbmVudCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCA9IChVSUNvbXBvbmVudCkgb2JqZWN0OwotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGV4dHJhY3RpbmcgbWV0YS1kYXRhIG9mICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5RGV0YWlscyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGdldCBiZWFuIGNsYXNzIGFuZCBwcm9wZXJ0eSBuYW1lCi0gICAgICAgICAqLwotICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKTsKLQotICAgICAgICAvL2NyZWF0ZQotICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnNldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIHByb3BlcnR5RGV0YWlscyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZmluZCBhbmQgYWRkIGFubm90YXRpb25zCi0gICAgICAgICAqLwotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSBlbnRpdHlDbGFzczsKLQotICAgICAgICB3aGlsZSAoIU9iamVjdC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGN1cnJlbnRDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICAgICAgYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9ucyhjdXJyZW50Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICAgICAgcHJvY2Vzc0ludGVyZmFjZXMoY3VycmVudENsYXNzLCBwcm9wZXJ0eURldGFpbHMsIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0cmFjdCBmaW5pc2hlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbnRlcmZhY2VzKAotICAgICAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzLCBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLCBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBmb3IgKENsYXNzIGN1cnJlbnRJbnRlcmZhY2UgOiBjdXJyZW50Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGN1cnJlbnRJbnRlcmZhY2UsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICAgICAgcHJvY2Vzc0ludGVyZmFjZXMoY3VycmVudEludGVyZmFjZSwgcHJvcGVydHlEZXRhaWxzLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEpOwotCi0gICAgICAgIE1ldGhvZCBtZXRob2Q7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGhvZCA9IGVudGl0eS5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0IiArIHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1ldGhvZCA9IGVudGl0eS5nZXREZWNsYXJlZE1ldGhvZCgiaXMiICsgcHJvcGVydHkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibWV0aG9kIG5vdCBmb3VuZCAtIGNsYXNzOiAiICsgZW50aXR5LmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC0gbWV0aG9kczogIiArICJnZXQiICsgcHJvcGVydHkgKyAiICIgKyAiaXMiICsgcHJvcGVydHkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFkZEFubm90YXRpb25Ub0Fubm90YXRpb25FbnRyaWVzKEFycmF5cy5hc0xpc3QobWV0aG9kLmdldEFubm90YXRpb25zKCkpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRGaWVsZEFjY2Vzc0Fubm90YXRpb25zKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQotICAgIHsKLSAgICAgICAgRmllbGQgZmllbGQ7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpZWxkID0gZW50aXR5LmdldERlY2xhcmVkRmllbGQocHJvcGVydHkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmllbGQgPSBlbnRpdHkuZ2V0RGVjbGFyZWRGaWVsZCgiXyIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImZpZWxkICIgKyBwcm9wZXJ0eSArICIgb3IgXyIgKyBwcm9wZXJ0eSArICIgbm90IGZvdW5kIiwgZTEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFkZEFubm90YXRpb25Ub0Fubm90YXRpb25FbnRyaWVzKEFycmF5cy5hc0xpc3QoZmllbGQuZ2V0QW5ub3RhdGlvbnMoKSksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEFubm90YXRpb25Ub0Fubm90YXRpb25FbnRyaWVzKAotICAgICAgICBMaXN0PEFubm90YXRpb24+IGFubm90YXRpb25zLCBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGFubm90YXRpb25zKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLmFkZE1ldGFEYXRhRW50cnkoY3JlYXRlTWV0YURhdGFFbnRyeUZvckFubm90YXRpb24oYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoYW5ub3RhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBNZXRhRGF0YUVudHJ5IGNyZWF0ZU1ldGFEYXRhRW50cnlGb3JBbm5vdGF0aW9uKEFubm90YXRpb24gZm91bmRBbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgTWV0YURhdGFFbnRyeSBlbnRyeSA9IG5ldyBNZXRhRGF0YUVudHJ5KCk7Ci0KLSAgICAgICAgZW50cnkuc2V0S2V5KGZvdW5kQW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIGVudHJ5LnNldFZhbHVlKGZvdW5kQW5ub3RhdGlvbik7Ci0KLSAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZDcwYWQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhpcyBmYWN0b3J5IGNyZWF0ZXMgYSBtZXRhLWRhdGEgZXh0cmFjdG9yIHdoaWNoIGV4dHJhY3RzIHRoZSBtZXRhLWRhdGEKLSAqIG9mIHRoZSB2YWx1ZSBiaW5kaW5nIG9mIGEgY29tcG9uZW50LgotICogPHAvPgotICogb3JkZXI6PGJyLz4KLSAqIDxvbD4KLSAqICAgPGxpPmNvbmZpZ3VyZWQgbWV0YS1kYXRhIGV4dHJhY3RvciAod2ViLnhtbCk8L2xpPgotICogICA8bGk+Y29uZmlndXJlZCBtZXRhLWRhdGEgZXh0cmFjdG9yIChpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKTwvbGk+Ci0gKiAgIDxsaT5kZWZhdWx0IGltcGxlbWVudGF0aW9uPC9saT4KLSAqIDwvb2w+Ci0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IG51bGw7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikKLSAgICBwdWJsaWMgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlKCkKLSAgICB7Ci0gICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3RvciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUik7Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUikpOwotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yID0gKE1ldGFEYXRhRXh0cmFjdG9yKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3RvciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShtZXRhRGF0YUV4dHJhY3Rvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY3JlYXRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3IobWV0YURhdGFFeHRyYWN0b3IpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0MDUxZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL01ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci0KLS8qKgotICogQW4gbWV0YS1kYXRhIGV4dHJhY3RvciBpcyByZXNwb25zaWJsZSB0byBhbmFseXplIGFuIG9iamVjdAotICogYW5kIHJldHVybnMgYWxsIGF2YWlsYWJsZSBtZXRhLWRhdGEgaW5mb3JtYXRpb24KLSAqIAotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhRXh0cmFjdG9yCi17Ci0gICAgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njk5MTJhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgZXF1aXZhbGVudCB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0gKg0KLSAqIGlmIHRoZXJlIGlzIGFsc28gYSBwcm94eSBmb3IgdGhlIGV4dHJhY3RvciB5b3UgY2FuIHVzZSB0aGUgY2xhc3NOYW1lIHByb3BlcnR5IHRvIG1hbnVhbGx5IHJlcGVhdCB0aGUNCi0gKiBmdWxsIHF1YWxpZmllZCBjbGFzcyBuYW1lLg0KLSAqDQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGludGVyZmFjZSBCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIgZXh0ZW5kcyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbC5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlYTgxOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIGl0J3MganVzdCBhIGhlbHBlciBmb3IgcHJveGllcyAtIHlvdSBqdXN0IG5lZWQgaXQsIGlmIHlvdSBkZWZpbmUgdGhlIGVxdWl2YWxlbnQgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotICoNCi0gKiBpZiB0aGVyZSBpcyBhbHNvIGEgcHJveHkgZm9yIHRoZSB0cmFuc2Zvcm1lciB5b3UgY2FuIHVzZSB0aGUgY2xhc3NOYW1lIHByb3BlcnR5IHRvIG1hbnVhbGx5IHJlcGVhdCB0aGUNCi0gKiBmdWxsIHF1YWxpZmllZCBjbGFzcyBuYW1lLg0KLSAqDQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGNsYXNzIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyLCBCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICBwcml2YXRlIFN0cmluZyBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lOw0KLQ0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyLmNvbnZlcnRNZXRhRGF0YShtZXRhRGF0YUVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWU7DQotICAgICAgICB9DQotICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKFN0cmluZyBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUgPSBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGdldE1ldGFEYXRhVHJhbnNmb3JtZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVRyYW5zZm9ybWVyKE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyID0gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNTE2MmIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyB0aGUgTWV0YURhdGFUcmFuc2Zvcm1lciBmb3IgYSBnaXZlbiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogVmFsaWRhdGlvblN0cmF0ZWd5IC0+IE1ldGFEYXRhVHJhbnNmb3JtZXIgaW5zdGVhZCBvZiBNZXRhLURhdGEgLT4gTWV0YURhdGFUcmFuc2Zvcm1lcg0KLSAqIHRvIGF2b2lkIGEgc2Vjb25kIHN0YXRpYyBtYXBwaW5nIGUuZy4gZm9yIGpwYSBhbm5vdGF0aW9ucw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotICAgICAgICBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YVRyYW5zZm9ybWVyPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmc7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGNyZWF0ZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSA9IG51bGw7DQotDQotICAgICAgICAvL3Byb3h5IGNoZWNrDQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGEgcHJveHkgYW5kIHRoZSB1c2FnZSBvZiBhIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICAgICAgICBlbHNlIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lID0gKChCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcil2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZy5jb250YWluc0tleSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKE1ldGFEYXRhVHJhbnNmb3JtZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLmdldCh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgICAgICBTdHJpbmcgdHJhbnNmb3JtZXJOYW1lOw0KLSAgICAgICAgLy9udWxsIC0+IHVzZSBuYW1lIG1hcHBlcnMNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IG5hbWVNYXBwZXIgOiBuYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cmFuc2Zvcm1lck5hbWUgPSBuYW1lTWFwcGVyLmNyZWF0ZU5hbWUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICBpZiAodHJhbnNmb3JtZXJOYW1lID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IChNZXRhRGF0YVRyYW5zZm9ybWVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh0cmFuc2Zvcm1lck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZE1hcHBpbmcodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgdHJhbnNmb3JtZXJOYW1lKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cFN0cmF0ZWd5TWFwcGluZ3MoTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWFwcGluZy5nZXRTb3VyY2UoKSwgbWFwcGluZy5nZXRUYXJnZXQoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgdHJhbnNmb3JtZXJOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImFkZGluZyB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1ldGEtZGF0YSB0cmFuc2Zvcm1lciBtYXBwaW5nOiAiDQotICAgICAgICAgICAgICAgICsgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArICIgLT4gIiArIHRyYW5zZm9ybWVyTmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLnB1dCh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCB0cmFuc2Zvcm1lck5hbWUpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gZ2V0TmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmFtZU1hcHBlckxpc3Q7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNTA0YjIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQWxsb3dzIHRvIHRyYW5zZm9ybSBjb25jcmV0ZSBtZXRhLWRhdGEgdG8gYSBtb3JlIGFic3RyYWN0IGZvcm0uPGJyLz4NCi0gKiBlLmcuOiBAUmVxdWlyZWQsIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwuLi4pLCBATGVuZ3RoKG1pbmltdW0gPSAxKSwgLi4uIC0+IHJlcXVpcmVkID0gdHJ1ZQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLS8vKlRyYW5zZm9ybWVyIGluc3RlYWQgb2YgKkNvbnZlcnRlciB0byBhdm9pZCBuYW1pbmcgY29uZnVzaW9uIA0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YSk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGFkYzE2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ3MjJhOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgLSBpZiB0aGVyZSBpcyBhIHByb3h5IGFyb3VuZCB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKChCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcil2YWxpZGF0aW9uU3RyYXRlZ3kpLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3YjJkOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1ldGFEYXRhVHJhbnNmb3JtZXJzLg0KLSAqIChjb25maWd1cmVkIHZpYSB3ZWIueG1sKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2FjZDExLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKiAoY29uZmlndXJlZCB2aWEgaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbikNCi0gKiBUaGUgYmVhbiBwcm92aWRlcyB0aGUgZGVmYXVsdCBuYW1lIChjb252ZW50aW9uKS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gZnVsbCBxdWFsaWZpZWQgbmFtZS4gKD0gY3VzdG9taXphYmxlIGNvbnZlbnRpb24pDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyODY4Zi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFwcyBFeHRWYWwgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gTWV0YURhdGFUcmFuc2Zvcm1lcnMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgZ2V0Q2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1YjUzZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgdG8gcGxhY2UgVmFsaWRhdGlvblN0cmF0ZWdpZXMgYW5kIE1ldGFEYXRhVHJhbnNmb3JtZXJzIGluIHRoZSBzYW1lIHBhY2thZ2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBnZXRTaW1wbGVNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpICsgIi4iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTaW1wbGVNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwb3N0Zml4ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVgpOw0KLQ0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmVuZHNXaXRoKCJWYWxpZGF0aW9uU3RyYXRlZ3kiKSB8fA0KLSAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmVuZHNXaXRoKCJTdHJhdGVneSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lQYWNrYWdlTmFtZSArIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYKSAscG9zdGZpeCkNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCJWYWxpZGF0aW9uU3RyYXRlZ3kiLCBwb3N0Zml4KQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoIlN0cmF0ZWd5IiwgcG9zdGZpeCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2luIGNhc2Ugb2YgYSBzdGF0aWMgdmFsaWRhdGlvbiBzdHJhdGVneSBtYXBwaW5nDQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUgKyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgKyBwb3N0Zml4Ow0KLSAgICB9DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NWY1MjguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbiBpbXBsZW1lbnRzIFByb3BlcnR5SW5mb3JtYXRpb24KLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGluZm9ybWF0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhRW50cnk+IG1ldGFEYXRhTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFbnRyeT4oKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zSW5mb3JtYXRpb24oU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbk1hcC5jb250YWluc0tleShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbk1hcC5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpIGdldEluZm9ybWF0aW9uKGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoIm5ldyBpbmZvcm1hdGlvbiBhZGRlZCBrZXk6ICIgKyBrZXkgKyAiIHZhbHVlOiAiICsgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5mb3JtYXRpb25NYXAucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRhRGF0YUVudHJ5W10gZ2V0TWV0YURhdGFFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtZXRhRGF0YUxpc3QudG9BcnJheShuZXcgTWV0YURhdGFFbnRyeVttZXRhRGF0YUxpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpCi0gICAgewotICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnRpZXModGhpcy5pbmZvcm1hdGlvbk1hcCk7Ci0gICAgICAgIHRoaXMubWV0YURhdGFMaXN0LmFkZChtZXRhRGF0YUVudHJ5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldE1ldGFEYXRhRW50cmllcygpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgicmVzZXR0aW5nIG1ldGEtZGF0YSBlbnRyaWVzIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLm1ldGFEYXRhTGlzdC5jbGVhcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eURldGFpbHMuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eURldGFpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwMzdjZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlEZXRhaWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlEZXRhaWxzCi17Ci0gICAgLy9mb3JtcyB0aGUgaWQgZm9yIGNyb3NzLXZhbGlkYXRpb24gd2l0aGluIGNvbXBsZXggY29tcG9uZW50cwotICAgIHByaXZhdGUgU3RyaW5nIGtleTsKLSAgICBwcml2YXRlIE9iamVjdCBiYXNlT2JqZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5OwotCi0gICAgcHVibGljIFByb3BlcnR5RGV0YWlscyhTdHJpbmcga2V5LCBPYmplY3QgYmFzZU9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICAgIHRoaXMuYmFzZU9iamVjdCA9IGJhc2VPYmplY3Q7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gICAgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRCYXNlT2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VPYmplY3QoT2JqZWN0IGJhc2VPYmplY3QpCi0gICAgewotICAgICAgICB0aGlzLmJhc2VPYmplY3QgPSBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5Mjg0Zi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUluZm9ybWF0aW9uCi17Ci0gICAgYm9vbGVhbiBjb250YWluc0luZm9ybWF0aW9uKFN0cmluZyBrZXkpOwotICAgIE9iamVjdCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5KTsKLSAgICA8VD4gVCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcyk7Ci0gICAgdm9pZCBzZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpOwotCi0gICAgTWV0YURhdGFFbnRyeVtdIGdldE1ldGFEYXRhRW50cmllcygpOwotICAgIHZvaWQgYWRkTWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpOwotICAgIHZvaWQgcmVzZXRNZXRhRGF0YUVudHJpZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZTkyNWMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzCi17Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ERVRBSUxTID0gInByb3BlcnR5X2RldGFpbHMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9WQUxJREFUSU9OID0gInNraXBfdmFsaWRhdGlvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJsYWJlbCI7Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlY29yZGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwZjIzZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLQotLyoqCi0gKiBBbGxvd3MgdG8gY2FwdHVyZSBjb252ZXJ0ZWQgdmFsdWVzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyCi17Ci0gICAgdm9pZCByZWNvcmRVc2VySW5wdXQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0Fic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWRlNWM0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci0KLS8qKgotICogQmFzZSBmb3IgYWxsIFJlbmRlcktpdFdyYXBwZXJGYWN0b3JpZXMgdG8gZm9yY2UgYSBzcGVjaWZpYyBiZWhhdmlvdXIKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxSZW5kZXJLaXQsIFJlbmRlcktpdD4KLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnkgd3JhcHBlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZGVhY3RpdmF0ZWQgPSBmYWxzZTsKLQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSByZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UocmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLndyYXBwZWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy53cmFwcGVkLmFkZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZGVhY3RpdmF0ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuZGVhY3RpdmF0ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVhY3RpdmF0ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlYWN0aXZhdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBSZW5kZXJLaXQgY3JlYXRlKFJlbmRlcktpdCByZW5kZXJLaXQpCi0gICAgewotICAgICAgICBpZihpc0RlYWN0aXZhdGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVuZGVyS2l0IHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYodGhpcy53cmFwcGVkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMud3JhcHBlZC5jcmVhdGUocmVuZGVyS2l0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlV3JhcHBlcihyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgUmVuZGVyS2l0IGNyZWF0ZVdyYXBwZXIoUmVuZGVyS2l0IHJlbmRlcktpdCk7Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0RlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3ZTA1MC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0RlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeQotewotICAgIHByaXZhdGUgUmVuZGVyS2l0IHJlbmRlcktpdDsKLQotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0dmFsIHJlbmRlcmtpdCB3cmFwcGVyIGNyZWF0ZWQgZm9yICIgKyByZW5kZXJLaXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGhpcy5yZW5kZXJLaXQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5yZW5kZXJLaXQgPSBuZXcgRXh0VmFsUmVuZGVyS2l0KHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyS2l0OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbExhenlSZW5kZXJlclByb3h5LmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbExhenlSZW5kZXJlclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMzYyODcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxMYXp5UmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLQotLyoqCi0gKiB0byBzdXBwb3J0IGEgY3VzdG9tIHByb3h5Ci0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIEV4dFZhbExhenlSZW5kZXJlclByb3h5IGV4dGVuZHMgUmVuZGVyZXIKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBSZW5kZXJlciB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbExhenlSZW5kZXJlclByb3h5KFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyZXI7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic2ltcGxlIHByb3h5IGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBnZXRMYXp5UmVuZGVyZXIoKS5kZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRMYXp5UmVuZGVyZXIoKS5jb252ZXJ0Q2xpZW50SWQoZmFjZXNDb250ZXh0LCBzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldExhenlSZW5kZXJlcigpLmdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJlciBnZXRMYXp5UmVuZGVyZXIoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHByb3h5Q2xhc3NOYW1lID0gKFN0cmluZykgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVkpOwotCi0gICAgICAgIGlmKHByb3h5Q2xhc3NOYW1lICE9IG51bGwgJiYgIXByb3h5Q2xhc3NOYW1lLmVuZHNXaXRoKGdldENsYXNzKCkuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShwcm94eUNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmKHRhcmdldENsYXNzID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYSBjdXN0b20gaW52YWxpZCByZW5kZXJlciBwcm94eSBpcyBjb25maWd1cmVkOiAiICsgcHJveHlDbGFzc05hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDbGFzc1tdIGFyZ0NsYXNzZXMgPSBuZXcgQ2xhc3NbMV07Ci0gICAgICAgICAgICBhcmdDbGFzc2VzWzBdID0gUmVuZGVyZXIuY2xhc3M7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGFyZ2V0Q2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJnQ2xhc3Nlcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChSZW5kZXJlciljb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSh0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgY3JlYXRlOiAiICsgdGFyZ2V0Q2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZDsKLSAgICAgICAgfQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDdlNmY0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LlJlc3BvbnNlU3RyZWFtOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VXcml0ZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlc3BvbnNlU3RhdGVNYW5hZ2VyOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5DbGllbnRCZWhhdmlvclJlbmRlcmVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcktpdCBleHRlbmRzIFJlbmRlcktpdAotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcktpdChSZW5kZXJLaXQgd3JhcHBlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlLCBSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIGlmIChyZW5kZXJlciBpbnN0YW5jZW9mIEV4dFZhbFJlbmRlcmVyV3JhcHBlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgcmVuZGVyZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgY3JlYXRlV3JhcHBlcihyZW5kZXJlcikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFJlbmRlcmVyIGdldFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUpCi0gICAgewotICAgICAgICBSZW5kZXJlciByZW5kZXJlciA9IHdyYXBwZWQuZ2V0UmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUpOwotCi0gICAgICAgIGlmKHJlbmRlcmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJlciBpbnN0YW5jZW9mIEV4dFZhbFJlbmRlcmVyV3JhcHBlciA/IHJlbmRlcmVyIDogY3JlYXRlV3JhcHBlcihyZW5kZXJlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oIm5vIHJlbmRlcmVyIGZvdW5kIGZvciBmYW1pbHkgIiArIGZhbWlseSArICIgYW5kIHR5cGUgIiArIHJlbmRlcmVyVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVuZGVyZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlU3RhdGVNYW5hZ2VyIGdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlV3JpdGVyIGNyZWF0ZVJlc3BvbnNlV3JpdGVyKFdyaXRlciB3cml0ZXIsIFN0cmluZyBzLCBTdHJpbmcgczEpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jcmVhdGVSZXNwb25zZVdyaXRlcih3cml0ZXIsIHMsIHMxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdHJlYW0gY3JlYXRlUmVzcG9uc2VTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmNyZWF0ZVJlc3BvbnNlU3RyZWFtKG91dHB1dFN0cmVhbSk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gZ2V0Q29tcG9uZW50RmFtaWxpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q29tcG9uZW50RmFtaWxpZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBnZXRSZW5kZXJlclR5cGVzKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UmVuZGVyZXJUeXBlcyhzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDbGllbnRCZWhhdmlvclJlbmRlcmVyKFN0cmluZyBzLCBDbGllbnRCZWhhdmlvclJlbmRlcmVyIGNsaWVudEJlaGF2aW9yUmVuZGVyZXIpCi0gICAgewotICAgICAgICB3cmFwcGVkLmFkZENsaWVudEJlaGF2aW9yUmVuZGVyZXIocywgY2xpZW50QmVoYXZpb3JSZW5kZXJlcik7Ci0gICAgfQotCi0gICAgcHVibGljIENsaWVudEJlaGF2aW9yUmVuZGVyZXIgZ2V0Q2xpZW50QmVoYXZpb3JSZW5kZXJlcihTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudEJlaGF2aW9yUmVuZGVyZXIocyk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gZ2V0Q2xpZW50QmVoYXZpb3JSZW5kZXJlclR5cGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudEJlaGF2aW9yUmVuZGVyZXJUeXBlcygpOwotICAgIH0KLQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIGNyZWF0ZVdyYXBwZXIoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEV4dFZhbFJlbmRlcmVyV3JhcHBlcihyZW5kZXJlcik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjgyYmJjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIGNlbnRyYWwgbWVjaGFuaXNtIHdoaWNoIGlzIHJlc3BvbnNpYmxlIHRvIGNyZWF0ZSBhIHdyYXBwZXIgZm9yIGEgcmVuZGVyZXIgLSBzdGFydGluZyBwb2ludCBvZiBleHR2YWwuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJLaXRGYWN0b3J5IGV4dGVuZHMgUmVuZGVyS2l0RmFjdG9yeQotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0gICAgcHJpdmF0ZSBSZW5kZXJLaXRGYWN0b3J5IHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeShSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnkpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSByZW5kZXJLaXRGYWN0b3J5OwotCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyS2l0KFN0cmluZyBzLCBSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJLaXQocywgcmVuZGVyS2l0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVuZGVyS2l0IGdldFJlbmRlcktpdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIFJlbmRlcktpdCByZW5kZXJLaXQgPSB0aGlzLndyYXBwZWQuZ2V0UmVuZGVyS2l0KGZhY2VzQ29udGV4dCwgcyk7Ci0KLSAgICAgICAgLy9qc2YgcmkgKyB0cmluaWRhZAotICAgICAgICBpZihyZW5kZXJLaXQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHdyYXBwZXJGYWN0b3J5ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgLy9zb21lIGNvbXBvbmVudCBsaWJzIGUuZy4gbXlmYWNlcy10cmluaWRhZCBhcmVuJ3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgY2xlYW4gYXBwcm9hY2gKLSAgICAgICAgLy9leGFtcGxlIHNlZSBUcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lcgotICAgICAgICBpZih3cmFwcGVyRmFjdG9yeS5pc0RlYWN0aXZhdGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJLaXQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gd3JhcHBlckZhY3RvcnkuY3JlYXRlKHJlbmRlcktpdCk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gZ2V0UmVuZGVyS2l0SWRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlbmRlcktpdElkcygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MzRmZTIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiB0byBhdm9pZCBtdWx0aXBsZSBjYWxscyBvZiByZW5kZXJlciBtZXRob2RzIHdpdGhpbiByZW5kZXJlciBpbnRlcmNlcHRvcnMgKGUuZy4gZm9yIGVuY29kZSwgZGVjb2RlLC4uLikKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcmVyUHJveHkgZXh0ZW5kcyBSZW5kZXJlcgotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9IEV4dFZhbFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpICsgIjpLRVkiOwotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0gICAgCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHJlbmRlcmVyOwotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInByb3h5IGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5RW50cnkgZW50cnkgPSBnZXRPckluaXRFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRGVjb2RlQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldERlY29kZUNhbGxlZCh0cnVlKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVkLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkb3VibGUgY2FsbCBvZiBtZXRob2QgJ2RlY29kZScgZmlsdGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlFbnRyeSBlbnRyeSA9IGdldE9ySW5pdEVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNFbmNvZGVCZWdpbkNhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXRFbmNvZGVCZWdpbkNhbGxlZCh0cnVlKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlZC5lbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkb3VibGUgY2FsbCBvZiBtZXRob2QgJ2VuY29kZUJlZ2luJyBmaWx0ZXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eUVudHJ5IGVudHJ5ID0gZ2V0T3JJbml0RW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0VuY29kZUNoaWxkcmVuQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldEVuY29kZUNoaWxkcmVuQ2FsbGVkKHRydWUpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLndyYXBwZWQuZW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZG91YmxlIGNhbGwgb2YgbWV0aG9kICdlbmNvZGVDaGlsZHJlbicgZmlsdGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5RW50cnkgZW50cnkgPSBnZXRPckluaXRFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRW5jb2RlRW5kQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldEVuY29kZUVuZENhbGxlZCh0cnVlKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVkLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkb3VibGUgY2FsbCBvZiBtZXRob2QgJ2VuY29kZUVuZCcgZmlsdGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydENsaWVudElkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICB0aHJvdyByOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UmVuZGVyc0NoaWxkcmVuKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZW5kZXJzQ2hpbGRyZW4oKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgdGhyb3cgdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5RW50cnkgZW50cnkgPSBnZXRPckluaXRFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoZW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh3cmFwcGVkLmdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkb3VibGUgY2FsbCBvZiBtZXRob2QgJ2dldENvbnZlcnRlZFZhbHVlJyBmaWx0ZXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVuZGVyZXJQcm94eUVudHJ5IGdldE9ySW5pdEVudHJ5KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgU3RyaW5nIGtleSA9IHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAga2V5ICs9IGdldE9wdGlvbmFsS2V5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZ2V0T3JJbml0Q29tcG9uZW50UHJveHlNYXBwaW5nKCkuY29udGFpbnNLZXkoa2V5KSkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0T3JJbml0Q29tcG9uZW50UHJveHlNYXBwaW5nKCkucHV0KGtleSwgbmV3IFJlbmRlcmVyUHJveHlFbnRyeSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0T3JJbml0Q29tcG9uZW50UHJveHlNYXBwaW5nKCkuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcHRpb25hbEtleShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfU1RPUkFHRV9OQU1FID0gRXh0VmFsUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCkgKyAiOlNUT1JBR0UiOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5RW50cnk+IGdldE9ySW5pdENvbXBvbmVudFByb3h5TWFwcGluZygpCi0gICAgewotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7Ci0KLSAgICAgICAgaWYoIXJlcXVlc3RNYXAuY29udGFpbnNLZXkoUFJPWFlfU1RPUkFHRV9OQU1FKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVxdWVzdE1hcC5wdXQoUFJPWFlfU1RPUkFHRV9OQU1FLCBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlFbnRyeT4+KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eUVudHJ5Pj4gcHJveHlTdG9yYWdlID0KLSAgICAgICAgICAgICgoTWFwPFN0cmluZywgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eUVudHJ5Pj4pcmVxdWVzdE1hcC5nZXQoUFJPWFlfU1RPUkFHRV9OQU1FKSk7Ci0KLSAgICAgICAgU3RyaW5nIGtleSA9IHRoaXMud3JhcHBlZC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQotICAgICAgICBpZighcHJveHlTdG9yYWdlLmNvbnRhaW5zS2V5KGtleSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3h5U3RvcmFnZS5wdXQoa2V5LCBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlFbnRyeT4oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJveHlTdG9yYWdlLmdldChrZXkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpCi0gICAgewotICAgICAgICAvL3Jlc2V0IGNvbXBvbmVudCBwcm94eSBtYXBwaW5nCi0gICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucmVtb3ZlKFBST1hZX1NUT1JBR0VfTkFNRSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YzMwNWUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotCi0vKioKLSAqIERlZmF1bHQgYXBwcm9hY2ggdG8gYXZvaWQgcHJveGllcyBmb3IgY29udmVydGVycyBhbmQgdGhlIGFkYXB0ZXIgZmFsbGJhY2suCi0gKiBJdCByZXF1aXJlcyB0aGF0IGNvbXBvbmVudHMgZGVsZWdhdGUgZ2V0Q29udmVydGVkVmFsdWUgdG8gYSByZW5kZXJlci48YnIvPgotICogSWYgaXQgaXNuJ3QgdGhlIGNhc2UgZm9yIHlvdXIgY29tcG9uZW50IGxpYiB1c2U6Ci0gKiBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5FeHRWYWxBcHBsaWNhdGlvbkZhY3Rvcnk8YnIvPgotICogYW5kPGJyLz4KLSAqIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5LlByb3h5TWFwcGluZ1BoYXNlTGlzdGVuZXIKLSAqIDxwLz4KLSAqIFRoaXMgd3JhcHBlciB3aWxsIGFsc28gaW1wbGVtZW50IGNsaWVudC1zaWRlIHZhbGlkYXRpb24gYmVoYXZpb3VyCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJlcldyYXBwZXIgZXh0ZW5kcyBSZW5kZXJlcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgd3JhcHBlZDsKLSAgICBwcm90ZWN0ZWQgRXh0VmFsQ29udGV4dCBleHRWYWxDb250ZXh0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCk7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyZXJXcmFwcGVyKFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHByb3h5Q2xhc3NOYW1lID0gKFN0cmluZylFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSk7Ci0KLSAgICAgICAgaWYocHJveHlDbGFzc05hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyBleHR2YWwgcmVuZGVyZXIgcHJveHkgY29uZmlndXJlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSBuZXcgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkocmVuZGVyZXIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShwcm94eUNsYXNzTmFtZSk7Ci0KLSAgICAgICAgaWYodGFyZ2V0Q2xhc3MgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyBleHR2YWwgcmVuZGVyZXIgcHJveHkgY29uZmlndXJlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSBuZXcgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkocmVuZGVyZXIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xhc3NbXSBhcmdDbGFzc2VzID0gbmV3IENsYXNzWzFdOwotICAgICAgICBhcmdDbGFzc2VzWzBdID0gUmVuZGVyZXIuY2xhc3M7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGFyZ2V0Q2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJnQ2xhc3Nlcyk7Ci0gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSAoUmVuZGVyZXIpY29uc3RydWN0b3IubmV3SW5zdGFuY2UocmVuZGVyZXIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIud2Fybigibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVyZXIgd3JhcHBlciBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkZWNvZGUgZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRGVjb2RlIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJEZWNvZGUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckRlY29kZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImVuY29kZUJlZ2luIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUJlZ2luIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUJlZ2luIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVFbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZW5jb2RlQ2hpbGRyZW4gZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlQ2hpbGRyZW4gb2YgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUNoaWxkcmVuIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJFbmNvZGVDaGlsZHJlbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVDaGlsZHJlbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQ2hpbGRyZW4gaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJlbmNvZGVFbmQgZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUVuZCBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVFbmQgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGdldFJlbmRlcnNDaGlsZHJlbigpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZW5kZXJzQ2hpbGRyZW4oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLSAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbywgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdCA9IGUuZ2V0UmV0dXJuVmFsdWVPbkV4Y2VwdGlvbihjb252ZXJ0ZWRPYmplY3QpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImdldENvbnZlcnRlZFZhbHVlIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUdldENvbnZlcnRlZFZhbHVlIG9mICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QgPSB3cmFwcGVkLmdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8pOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyR2V0Q29udmVydGVkVmFsdWUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvLCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyR2V0Q29udmVydGVkVmFsdWUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckdldENvbnZlcnRlZFZhbHVlIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZE9iamVjdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L1JlbmRlcmVyUHJveHlFbnRyeS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9SZW5kZXJlclByb3h5RW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDllNTdmOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L1JlbmRlcmVyUHJveHlFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIFJlbmRlcmVyUHJveHlFbnRyeQotewotICAgIHByaXZhdGUgYm9vbGVhbiBkZWNvZGVDYWxsZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlQmVnaW5DYWxsZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlRW5kQ2FsbGVkID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIE9iamVjdCBjb252ZXJ0ZWRWYWx1ZSA9IG51bGw7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlY29kZUNhbGxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVjb2RlQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlY29kZUNhbGxlZChib29sZWFuIGRlY29kZUNhbGxlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVjb2RlQ2FsbGVkID0gZGVjb2RlQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlQmVnaW5DYWxsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVuY29kZUJlZ2luQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kZUJlZ2luQ2FsbGVkKGJvb2xlYW4gZW5jb2RlQmVnaW5DYWxsZWQpCi0gICAgewotICAgICAgICB0aGlzLmVuY29kZUJlZ2luQ2FsbGVkID0gZW5jb2RlQmVnaW5DYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmNvZGVDaGlsZHJlbkNhbGxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlQ2hpbGRyZW5DYWxsZWQoYm9vbGVhbiBlbmNvZGVDaGlsZHJlbkNhbGxlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZW5jb2RlQ2hpbGRyZW5DYWxsZWQgPSBlbmNvZGVDaGlsZHJlbkNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuY29kZUVuZENhbGxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZW5jb2RlRW5kQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kZUVuZENhbGxlZChib29sZWFuIGVuY29kZUVuZENhbGxlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZW5jb2RlRW5kQ2FsbGVkID0gZW5jb2RlRW5kQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlZFZhbHVlKE9iamVjdCBjb252ZXJ0ZWRWYWx1ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29udmVydGVkVmFsdWUgPSBjb252ZXJ0ZWRWYWx1ZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMyZWVmOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZTk2Y2YuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzN2M2NGEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlJlbmRlcmVySW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICAgIHByb3RlY3RlZCBSZW5kZXJlckludGVyY2VwdG9yIGV4Y2VwdGlvblNvdXJjZTsKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGluZm9ybWF0aW9uOwotICAgIGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbigpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzKQotICAgIHsKLSAgICAgICAgdGhpcy5za2lwT3RoZXJJbnRlcmNlcHRvcnMgPSBza2lwT3RoZXJJbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgcHVibGljIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oYm9vbGVhbiBza2lwT3RoZXJJbnRlcmNlcHRvcnMsIFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHRoaXMoc2tpcE90aGVySW50ZXJjZXB0b3JzKTsKLSAgICAgICAgdGhpcy5leGNlcHRpb25Tb3VyY2UgPSByZW5kZXJlckludGVyY2VwdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEluZm9ybWF0aW9uKE9iamVjdCBpbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIHRoaXMuaW5mb3JtYXRpb24gPSBpbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEluZm9ybWF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NraXBPdGhlckludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gc2tpcE90aGVySW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmV0dXJuVmFsdWVPbkV4Y2VwdGlvbihPYmplY3QgY3VycmVudFJldHVyblZhbHVlKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5leGNlcHRpb25Tb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhjZXB0aW9uU291cmNlLmdldFJldHVyblZhbHVlT25Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKHRoaXMsIGN1cnJlbnRSZXR1cm5WYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRSZXR1cm5WYWx1ZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0Fic3RyYWN0U3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMDk4YmMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIGV4ZWN1dGUgbG9naWMganVzdCBvbmNlLg0KLSAqIGUuZy4gcmVnaXN0ZXIgYXJ0aWZhY3RzIHZpYSBhcGkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgLy9kb24ndCByZW1vdmUgLSBpdCdzIGEgZmFsbGJhY2sgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggZGVyZWdpc3RyYXRpb24NCi0gICAgLy90YXJnZXQ6IGRvbid0IHByb2Nlc3MgaW5pdCBsb2dpYyBtb3JlIHRoYW4gb25jZQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENsYXNzPiBpbml0aWFsaXplZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICAgICAgc3luY2hyb25pemVkIChBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5jbGFzcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIWluaXRpYWxpemVkTGlzdGVuZXJzLmNvbnRhaW5zKGdldENsYXNzKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oInN0YXJ0IGluaXQgb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluaXQoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImluaXQgb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBKc2ZVdGlscy5kZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcih0aGlzKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBkZXJlZ2lzdGVyaW5nIHRoZSBwaGFzZS1saXN0ZW5lciINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtPiB0aGVyZSBpcyBqdXN0IGEgbGl0dGxlIG92ZXJoZWFkLCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBidXQgZXZlcnl0aGluZyBlbHNlIHdvcmtzIGNvcnJlY3RseS4iDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaG93ZXZlciwgcGxlYXNlIGluZm9ybSB0aGUgY29tbXVuaXR5IGFib3V0IHlvdXIgY29uZmlndXJhdGlvbiIsIHQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWRMaXN0ZW5lcnMuYWRkKGdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5SRVNUT1JFX1ZJRVc7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdCgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9FeHRWYWxTdGFydHVwTGlzdGVuZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0V4dFZhbFN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2RmZmFlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0V4dFZhbFN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uUmVuZGVyZXJJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIKLSAgICAgICAgLkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIKLSAgICAgICAgLkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIKLSAgICAgICAgLkRlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXIKLSAgICAgICAgLlNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIKLXsKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKEV4dFZhbEluZm9ybWF0aW9uLlZFUlNJT04gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnRpbmcgdXAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciB2IiArIEV4dFZhbEluZm9ybWF0aW9uLlZFUlNJT04pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydGluZyB1cCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFZhbGlkYXRpb25SZW5kZXJlckludGVyY2VwdG9yKCkpOwotCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZLCBFeHRWYWxSZW5kZXJlclByb3h5LmNsYXNzLmdldE5hbWUoKSwgZmFsc2UpOwotCi0gICAgICAgIGluaXROYW1lTWFwcGVycygpOwotICAgICAgICBleGVjdXRlQ3VzdG9tU3RhcnR1cExpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXROYW1lTWFwcGVycygpCi0gICAgewotICAgICAgICBTdHJpbmcgZGVhY3RpdmF0ZURlZmF1bHROYW1lTWFwcGVycyA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0RFRkFVTFRfTkFNRV9NQVBQRVJTOwotICAgICAgICBpZiAoKGRlYWN0aXZhdGVEZWZhdWx0TmFtZU1hcHBlcnMgIT0gbnVsbCAmJiBkZWFjdGl2YXRlRGVmYXVsdE5hbWVNYXBwZXJzLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vcmVnaXN0ZXIgbWV0YWRhdGEgdG8gdmFsaWRhdGlvbiBzdHJhdGVneSBuYW1lIG1hcHBlcgotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOwotCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOwotCi0gICAgICAgIC8vcmVnaXN0ZXIgdmFsaWRhdGlvbiBzdHJhdGVneSB0byBtZXNzYWdlIHJlc29sdmVyIG5hbWUgbWFwcGVyCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsKLQotICAgICAgICAvL3JlZ2lzdGVyIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWV0YWRhdGEgdHJhbnNmb3JtZXIgbmFtZSBtYXBwZXIKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleGVjdXRlQ3VzdG9tU3RhcnR1cExpc3RlbmVyKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBjdXN0b21TdGFydHVwTGlzdGVuZXJOYW1lID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5TVEFSVFVQX0xJU1RFTkVSKTsKLSAgICAgICAgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIgY3VzdG9tU3RhcnR1cExpc3RlbmVyID0KLSAgICAgICAgICAgIChBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY3VzdG9tU3RhcnR1cExpc3RlbmVyTmFtZSk7Ci0KLSAgICAgICAgaWYoY3VzdG9tU3RhcnR1cExpc3RlbmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oInN0YXJ0IGluaXQgb2YgIiArIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lci5pbml0KCk7Ci0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImluaXQgb2YgIiArIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYyNTEwYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkgaW1wbGVtZW50cyBGYWNlc01lc3NhZ2VGYWN0b3J5DQotew0KLSAgICBwdWJsaWMgRmFjZXNNZXNzYWdlIGNvbnZlcnQoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYoaXNMYWJlbGVkRmFjZXNNZXNzYWdlKGZhY2VzTWVzc2FnZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjcmVhdGUoZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCksIGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCksIGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBWaW9sYXRpb25NZXNzYWdlKHNldmVyaXR5LCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzTGFiZWxlZEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHVzZSB0aGUgaW50ZXJmYWNlIGhlcmUNCi0gICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2UgaW5zdGFuY2VvZiBWaW9sYXRpb25NZXNzYWdlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvTGFiZWxlZE1lc3NhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvTGFiZWxlZE1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RmN2FlNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0xhYmVsZWRNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBkb24ndCByZW1vdmUgKlRleHQgLSBpdCB3b3VsZCBsZWFkIHRvIGFuIG92ZXJsYXAgd2l0aCB0cmluaWRhZA0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTGFiZWxlZE1lc3NhZ2UNCi17DQotICAgIFN0cmluZyBnZXRMYWJlbFRleHQoKTsNCi0gICAgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIGxhYmVsKTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9WaW9sYXRpb25NZXNzYWdlLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL1Zpb2xhdGlvbk1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA4MTQzNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL1Zpb2xhdGlvbk1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBWaW9sYXRpb25NZXNzYWdlIGV4dGVuZHMgRmFjZXNNZXNzYWdlIGltcGxlbWVudHMgTGFiZWxlZE1lc3NhZ2UNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY5MDM5NTg5NDI5ODc3MTEyMzFMOw0KLSAgICBwcml2YXRlIFN0cmluZyBsYWJlbDsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHN1bW1hcnlMYWJlbFJlcGxhY2VkID0gZmFsc2U7DQotICAgIHByaXZhdGUgYm9vbGVhbiBkZXRhaWxMYWJlbFJlcGxhY2VkID0gZmFsc2U7DQotDQotICAgIHB1YmxpYyBWaW9sYXRpb25NZXNzYWdlKFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzKFNFVkVSSVRZX0VSUk9SLCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWaW9sYXRpb25NZXNzYWdlKFNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOw0KLSAgICAgICAgc2V0U3VtbWFyeShzdW1tYXJ5KTsNCi0gICAgICAgIHNldERldGFpbChkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxhYmVsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBnZXRTdW1tYXJ5KCkNCi0gICAgew0KLSAgICAgICAgaWYobGFiZWwgIT0gbnVsbCAmJiAhdGhpcy5zdW1tYXJ5TGFiZWxSZXBsYWNlZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXRTdW1tYXJ5KGdldExhYmVsZWRNZXNzc2FnZShzdXBlci5nZXRTdW1tYXJ5KCksIGdldExhYmVsVGV4dCgpKSk7DQotICAgICAgICAgICAgdGhpcy5zdW1tYXJ5TGFiZWxSZXBsYWNlZCA9IHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0U3VtbWFyeSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERldGFpbCgpDQotICAgIHsNCi0gICAgICAgIGlmKGxhYmVsICE9IG51bGwgJiYgIXRoaXMuZGV0YWlsTGFiZWxSZXBsYWNlZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXREZXRhaWwoZ2V0TGFiZWxlZE1lc3NzYWdlKHN1cGVyLmdldERldGFpbCgpLCBnZXRMYWJlbFRleHQoKSkpOw0KLSAgICAgICAgICAgIHRoaXMuZGV0YWlsTGFiZWxSZXBsYWNlZCA9IHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RGV0YWlsKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGFiZWxlZE1lc3NzYWdlKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UuY29udGFpbnMoInsiICsgaSArICJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCJ7IiArIGkgKyAifSIsIGxhYmVsKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YzgwNWIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7DQotDQotLyoqDQotICogTWVzc2FnZVJlc29sdmVyIHdoaWNoIHVzZXMgcHJvcGVydHkgZmlsZXMuDQotICogU3ViY2xhc3NlcyBqdXN0IGhhdmUgdG8gcHJvdmlkZSB0aGUgcGFja2FnZSB0byBsb29rIGF0Lg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIGNhbiBhbHNvIHByb3ZpZGUgYSBjdXN0b20gbmFtZSB3aGljaCBpcyBlLmcuIGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciBpbXBsZW1lbnRzIE1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIgPSAiPz8/IjsNCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0RFRkFVTFRfQ09OVkVOVElPTjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZGVmYXVsdEJ1bmRsZSA9IG51bGw7DQotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VCdW5kbGVCYXNlTmFtZTsNCi0gICAgLy93aXRoIGpzZiAxLjEgb25seSBhdmFpbGFibGUgaWYgdGhlcmUgaXMgYSBjdXN0b20gYmVhbg0KLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlQnVuZGxlVmFyTmFtZTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGtleSA9PSBudWxsIHx8IGtleS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIGN1c3RvbU1lc3NhZ2UgPSBudWxsOw0KLQ0KLSAgICAgICAgLy9vbmx5IGluIGNhc2Ugb2YgYSBWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggaXMgY29uZmlndXJlZCBhcyBiZWFuDQotICAgICAgICBpZiAodGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSh0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSwgbG9jYWxlKTsNCi0gICAgICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm1lc3NhZ2UgYnVuZGxlICIgKyB0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSArICIgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvL29ubHkgaW4gY2FzZSBvZiBhIFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciB3aGljaCBpcyBjb25maWd1cmVkIGFzIGJlYW4NCi0gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VCdW5kbGVWYXJOYW1lICE9IG51bGwgJiYgY3VzdG9tTWVzc2FnZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gKFJlc291cmNlQnVuZGxlKSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4obWVzc2FnZUJ1bmRsZVZhck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigibWVzc2FnZSBidW5kbGUgdmFyIG5hbWUgIiArIHRoaXMubWVzc2FnZUJ1bmRsZVZhck5hbWUgKyAiIG5vdCBmb3VuZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGN1c3RvbU1lc3NhZ2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qDQotICAgICAgICAgKiB0cnkgdG8gdXNlIHRoZSBjb252ZW50aW9uIGZvciB0aGUgbWVzc2FnZSBidW5kbGUNCi0gICAgICAgICAqLw0KLSAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHRyeVRvVXNlTWVzc2FnZUJ1bmRsZUNvbnZlbnRpb24oa2V5LCBsb2NhbGUpOw0KLQ0KLSAgICAgICAgaWYgKGN1c3RvbU1lc3NhZ2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qDQotICAgICAgICAgKiBubyBtZXNzYWdlIGJ1bmRsZSBvciBtZXNzYWdlIGZvdW5kICh3aXRoIHRoZSBjb252ZW50aW9uKT8NCi0gICAgICAgICAqLw0KLQ0KLSAgICAgICAgLy90cnkgdG8gbG9hZCBjdXN0b20gbWVzc2FnZXMNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEN1c3RvbUJhc2VOYW1lKCksIGxvY2FsZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyBjdXN0b20gbWVzc2FnZSBmb3IgIiArIGtleSArICIgd2l0aGluICIgKyBnZXRDdXN0b21CYXNlTmFtZSgpLCBlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vdXNlIGN1c3RvbSBuYW1lIChpZiBwb3NzaWJsZSkgb3RoZXJ3aXNlOiBmYWxsYmFjayB0byBkZWZhdWx0IG1lc3NhZ2UgKGlmIHBvc3NpYmxlKQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChjdXN0b21NZXNzYWdlICE9IG51bGwpID8gY3VzdG9tTWVzc2FnZQ0KLSAgICAgICAgICAgICAgICA6IChnZXRCYXNlTmFtZSgpICE9IG51bGwpID8gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEJhc2VOYW1lKCksIGxvY2FsZSkuZ2V0U3RyaW5nKGtleSkgOiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBNSVNTSU5HX1JFU09VUkNFX01BUktFUiArIGtleSArIE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvVXNlTWVzc2FnZUJ1bmRsZUNvbnZlbnRpb24oU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1c3RvbU1lc3NhZ2UgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKChkZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb24gPT0gbnVsbCB8fCAhZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgICAgICAmJiBpc0RlZmF1bHRNZXNzYWdlQnVuZGxlQ29udmVudGlvbkFjdGl2ZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChkZWZhdWx0QnVuZGxlID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX0JVTkRMRV9OQU1FKSwgbG9jYWxlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZw0KLSAgICAgICAgICAgICAgICAgICAgZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID0gInRydWUiOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChkZWZhdWx0QnVuZGxlICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IGRlZmF1bHRCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGVmYXVsdE1lc3NhZ2VCdW5kbGVDb252ZW50aW9uQWN0aXZlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRCYXNlTmFtZSgpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUJ1bmRsZUJhc2VOYW1lKFN0cmluZyBtZXNzYWdlQnVuZGxlQmFzZU5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lID0gbWVzc2FnZUJ1bmRsZUJhc2VOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VCdW5kbGVWYXJOYW1lKFN0cmluZyBtZXNzYWdlQnVuZGxlVmFyTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSA9IG1lc3NhZ2VCdW5kbGVWYXJOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQwZTY4Zi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyBhIE1lc3NhZ2VSZXNvbHZlciBmb3IgYSBnaXZlbiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJhZGQgZ2VuZXJpYyBqYXZhIGFwaSAoZGUtL3JlZ2lzdGVyIG1hcHBpbmcpIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotICAgICAgICBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXNzYWdlUmVzb2x2ZXI+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nOw0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBuYW1lTWFwcGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PigpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlUmVzb2x2ZXIgY3JlYXRlKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHN0cmF0ZWd5TmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChNZXNzYWdlUmVzb2x2ZXIpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmdldChzdHJhdGVneU5hbWUpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICBTdHJpbmcgcmVzb2x2ZXJOYW1lOw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vYnVpbGQgY29udmVudGlvbiAoVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKQ0KLSAgICAgICAgICAgIHJlc29sdmVyTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIC8vbmFtZSB3YXNuJ3QgbWFwcGVkDQotICAgICAgICAgICAgaWYgKHJlc29sdmVyTmFtZSA9PSBudWxsIHx8IHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMocmVzb2x2ZXJOYW1lKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtZXNzYWdlUmVzb2x2ZXIgPSAoTWVzc2FnZVJlc29sdmVyKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUocmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWVzc2FnZVJlc29sdmVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKHN0cmF0ZWd5TmFtZSwgcmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZXNvbHZlck5hbWUgKyAiIHVzZWQgZm9yICIgKyBzdHJhdGVneU5hbWUpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYWRkTWFwcGluZyhzdHJhdGVneU5hbWUsIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotDQotICAgICAgICAvL3NldHVwIGludGVybmFsIHN0YXRpYyBtYXBwaW5ncw0KLSAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgOg0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsU3RyaW5nPj4gbWFwcGluZ3MpDQotICAgIHsNCi0gICAgICAgIGZvcihTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IG1hcHBpbmcgOiBtYXBwaW5ncykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNYXBwaW5nKG1hcHBpbmcuZ2V0U291cmNlKCksIG1hcHBpbmcuZ2V0VGFyZ2V0KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgbWVzc2FnZVJlc29sdmVyTmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZGRpbmcgc3RhdGljIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWVzc2FnZSByZXNvbHZlciBtYXBwaW5nOiAiDQotICAgICAgICAgICAgICAgICsgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArICIgLT4gIiArIG1lc3NhZ2VSZXNvbHZlck5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLnB1dCh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBtZXNzYWdlUmVzb2x2ZXJOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IGdldE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5hbWVNYXBwZXJMaXN0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OWVkYzYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IE1lc3NhZ2VSZXNvbHZlciB3aGljaCB1c2VzIHRoZSBkZWZhdWx0IGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gbWVzc2FnZSBidW5kbGUgdmlhIHdlYi54bWwNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CVU5ETEUgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FU1NBR0VfQlVORExFOw0KLQ0KLSAgICAvL25vdCB1c2VkIGF0IHRoZSBtb21lbnQgLSBqdXN0IGZvciBhIGNvbnZlbnRpb24NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNb2R1bGVNZXNzYWdlQnVuZGxlTmFtZShnZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tQmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ1VTVE9NX0JVTkRMRTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL01lc3NhZ2VSZXNvbHZlci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNjYTFjMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL01lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBNZXNzYWdlUmVzb2x2ZXJzIGluZGVwZW5kZW50IG9mIHRoZSBtZXNzYWdlIHNvdXJjZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGQ0MGI2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NzQwMWEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXNzYWdlUmVzb2x2ZXJzLg0KLSAqIChjb25maWd1cmVkIHZpYSB3ZWIueG1sKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzcyMDM1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ3kgdG8gTWVzc2FnZVJlc29sdmVyLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NU0dfUkVTT0xWRVJfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYjU5YjUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIHByb3ZpZGUgYSBOYW1lTWFwcGVyIHBlciB2YWxpZGF0aW9uIG1vZHVsZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBzdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NDgzOGIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIG1hcHMgRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIEV4dFZhbCBNZXNzYWdlUmVzb2x2ZXJzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKHN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI2MDZmNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgdG8gcGxhY2UgVmFsaWRhdGlvblN0cmF0ZWdpZXMgYW5kIE1lc3NhZ2VSZXNvbHZlcnMgaW4gdGhlIHNhbWUgcGFja2FnZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBzdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1c3RvbVBvc3RmaXggPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWCk7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHN0cmF0ZWd5Q2xhc3NOYW1lLCBjdXN0b21Qb3N0Zml4KTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2QzNzllLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci0KLS8qKgotICogUHJvdmlkZXMgdGhlIGFiaWxpdHkgb2YgbWVzc2FnZSByZXNvbHZpbmcgdG8gVmFsaWRhdGlvblN0cmF0ZWdpZXMKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kKLXsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCA9ICJfZGV0YWlsIjsKLSAgICAvL2UuZy4gZm9yIGluamVjdGluZyBhIG1lc3NhZ2UgcmVzb2x2ZXIgdmlhIHNwcmluZwotICAgIHByaXZhdGUgTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcjsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIExvY2FsZSBsb2NhbGUgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKTsKLQotICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlUmVzb2x2ZXIgIT0gbnVsbCA/IHRoaXMubWVzc2FnZVJlc29sdmVyLmdldE1lc3NhZ2Uoa2V5LCBsb2NhbGUpIDoKLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldE1lc3NhZ2VSZXNvbHZlckZvclZhbGlkYXRpb25TdHJhdGVneSh0aGlzKS5nZXRNZXNzYWdlKGtleSwgbG9jYWxlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlc29sdmVNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gKGtleSAhPSBudWxsKSA/IHJlc29sdmVNZXNzYWdlKGtleSArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYKSA6IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRmFjZXNNZXNzYWdlIGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWFzc2FnZShBbm5vdGF0aW9uIGFubm90YXRpb24pCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKGdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiksIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VSZXNvbHZlcihNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyKQotICAgIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlUmVzb2x2ZXIgPSBtZXNzYWdlUmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pCi0gICAgewotICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMLCBnZXRMYWJlbChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5KSk7Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbik7Ci0gICAgfQotCi0gICAgLy9mb3IgY3VzdG9tIGFubm90YXRpb25zIC0gb3ZlcnJpZGUgaWYgbmVlZGVkCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNjk0YjMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogUHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gdXNlIFZhbGlkYXRvckV4Y2VwdGlvbiAoYXMgZXhwZWN0ZWQgYnkgdGhlIHVzZXIpIGluc3RlYWQgb2YgQ29udmVydGVyRXhjZXB0aW9uLg0KLSAqIEZ1cnRoZXJtb3JlIGl0IHByb3ZpZGVzOjxici8+DQotICogaW5pdFZhbGlkYXRpb248YnIvPg0KLSAqIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGluaXRWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpbml0VmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJpbml0VmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7DQotICAgICAgICB9DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgcHJvY2Vzc1ZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHJvY2Vzc1ZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgicHJvY2Vzc1ZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24gPSBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29udmVydEZhY2VzTWVzc2FnZShlLmdldEZhY2VzTWVzc2FnZSgpKSwgZS5nZXRDYXVzZSgpKTsNCi0gICAgICAgICAgICBpZiAocHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgIjogdGhyb3cgb3JpZ2luYWwgZXhjZXB0aW9uIGFmdGVyIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHRocm93IHZhbGlkYXRvckV4Y2VwdGlvbjsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgIjogb3JpZ2luYWwgZXhjZXB0aW9uIGFmdGVyIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbiwgdGhpcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNWRjNGUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0NCi0gKiBhZGFwdGVyIHRvIGNvbm5lY3QgdmFsaWRhdGlvbiBzdHJhdGVnaWVzIHdpdGggbWV0YS1kYXRhIHRyYW5zZm9ybWVycywNCi0gKiBpZiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBkZWZpbmVkIGFzIGJlYW4gYW5kIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBpbnRlcmZhY2UgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIgZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIC8vdG8gZ2V0IGJhY2sgdGhlIGludGVybmFsIGNhc2hpbmcNCi0gICAgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpOw0KLQ0KLSAgICBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzVjYjYzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLkJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotDQotICogYWRhcHRlciB0byBjb25uZWN0IHZhbGlkYXRpb24gc3RyYXRlZ2llcyB3aXRoIG1ldGEtZGF0YSB0cmFuc2Zvcm1lcnMsDQotICogaWYgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgZGVmaW5lZCBhcyBiZWFuIGFuZCBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIC8vb3B0aW9uYWwgZmFsbGJhY2sgZm9yIGludGVybmFsIGNhc2hpbmcNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOw0KLQ0KLSAgICBwdWJsaWMgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyIGluc3RhbmNlb2YgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIpIG1ldGFEYXRhVHJhbnNmb3JtZXIgKS5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGdldE1ldGFEYXRhVHJhbnNmb3JtZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVRyYW5zZm9ybWVyKE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyID0gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsaWRhdGlvblN0cmF0ZWd5ID0gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJhZDRmOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyDQotICAgIC5Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotDQotLyoqDQotICogRmFjdG9yeSB3aGljaCBjcmVhdGVzIHRoZSBWYWxpZGF0aW9uU3RyYXRlZ3kgZm9yIGEgZ2l2ZW4gTWV0YS1EYXRhIEtleQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkNCi0gICAgICAgIGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxTdHJpbmcsIFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9IG51bGw7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBjcmVhdGUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICBpZiAobWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljTWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZy5jb250YWluc0tleShtZXRhRGF0YUtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nLmdldChtZXRhRGF0YUtleSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWU7DQotICAgICAgICAvL251bGwgLT4gdXNlIG5hbWUgbWFwcGVycw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFN0cmluZz4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0cmF0ZWd5TmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZShtZXRhRGF0YUtleSk7DQotDQotICAgICAgICAgICAgaWYgKHN0cmF0ZWd5TmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKHN0cmF0ZWd5TmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyhtZXRhRGF0YUtleSwgc3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lJbnN0YW5jZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUNCi0gICAgICAgICAgICAuc3RhcnRzV2l0aChBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5QUkVGSVhfRk9SX0JFQU5fTUFQUElORykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbih2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLlBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HLmxlbmd0aCgpKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgbWV0YURhdGFLZXksIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImFkZGluZyBtZXRhLWRhdGEga2V5IHRvIHZhbGlkYXRpb24gc3RyYXRlZ3kgbWFwcGluZzogIg0KLSAgICAgICAgICAgICAgICArIG1ldGFEYXRhS2V5ICsgIiAtPiAiICsgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZy5wdXQobWV0YURhdGFLZXksIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbml0U3RhdGljTWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgLy9zZXR1cCBpbnRlcm5hbCBzdGF0aWMgbWFwcGluZ3MNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnIDoNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgPSBuZXcgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAvL3RyeSB0byBzZXR1cCBtYXBwaW5nIHdpdGggYmFzZSBuYW1lIGJ5IGNvbnZlbnRpb24gLSBvdmVycmlkZXMgZGVmYXVsdCBtYXBwaW5nDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2J1aWxkIGNvbnZlbnRpb24gKHN0cmF0ZWd5IG1hcHBpbmcpDQotICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZyhFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFKSk7DQotDQotICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotDQotICAgICAgICAvL3NldHVwIGN1c3RvbSBtYXBwaW5nIC0gb3ZlcnJpZGVzIGFsbCBvdGhlciBtYXBwaW5ncw0KLSAgICAgICAgU3RyaW5nIGN1c3RvbU1hcHBpbmdCYXNlTmFtZSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORzsNCi0gICAgICAgIGlmIChjdXN0b21NYXBwaW5nQmFzZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHN0YXRpY0NvbmZpZyA9IG5ldyBTdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZyhjdXN0b21NYXBwaW5nQmFzZU5hbWUpOw0KLSAgICAgICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cFN0cmF0ZWd5TWFwcGluZ3MoTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhtYXBwaW5nLmdldFNvdXJjZSgpLCBtYXBwaW5nLmdldFRhcmdldCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+IGdldE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZU1hcHBlckxpc3Q7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1NTIzZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBCYXNlIGludGVyZmFjZSBmb3IgVmFsaWRhdGlvblN0cmF0ZWdpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLS8vKlZhbGlkYXRpb25TdHJhdGVneSBpbnN0ZWFkIG9mICpWYWxpZGF0b3IgdG8gYXZvaWQgbmFtaW5nIGNvbmZ1c2lvbiANCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjliM2YwZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1ZDM2MS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIE5hbWUgTWFwcGVyIHdoaWNoIGRlbGVnYXRlcyB0aGUgbmFtZSBtYXBwaW5nLCBleHRyYWN0IHRoZSBuYW1lIGFuZCBjb252ZXJ0IGl0IHRvIGEgYmVhbiBuYW1lICsgcHJlZml4DQotICogdGFyZ2V0OiBjb25maWd1cmUgYSB2YWxpZGF0aW9uIHN0cmF0ZWd5IHZpYSBhIG1hbmFnZWQgYmVhbiBmYWNpbGl0eSAtPiBhbGxvd3MgdG8gaW5qZWN0IG90aGVyIGJlYW5zDQotICogaW5zdGVhZCBvZiBhcGkgY2FsbHMgKyBoYXJkY29kZWQgYmVhbiBuYW1lcw0KLSAqIDxwLz4NCi0gKiBhbGxvd2VkIGJlYW4gc2NvcGVzOg0KLSAqIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIHN0YXRlbGVzczogYXBwbGljYXRpb24vc2luZ2xldG9uDQotICogdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgc3RhdGVmdWw6IG5vbmUvcHJvdG90eXBlDQotICogZG9uJ3QgdXNlIHRoZSBzZXNzaW9uIG9yIGEgY29udmVyc2F0aW9uIHNjb3BlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HID0gImJlYW46IjsNCi0gICAgcHJpdmF0ZSBOYW1lTWFwcGVyPFN0cmluZz4gd3JhcHBlZDsNCi0NCi0gICAgcHVibGljIEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKE5hbWVNYXBwZXI8U3RyaW5nPiBuYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSBuYW1lTWFwcGVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbmFtZSA9IHdyYXBwZWQuY3JlYXRlTmFtZShzb3VyY2UpOw0KLQ0KLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKTsNCi0gICAgICAgIHJldHVybiBQUkVGSVhfRk9SX0JFQU5fTUFQUElORyArIG5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvTG93ZXJDYXNlKCkgKyBuYW1lLnN1YnN0cmluZygxKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmUxZjZlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgQW5ub3RhdGlvbnMgdG8gVmFsaWRhdGlvblN0cmF0ZWdpZXMuDQotICogKGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjhkZGZhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBBbm5vdGF0aW9ucyB0byBWYWxpZGF0aW9uU3RyYXRlZ2llcy4NCi0gKiAoY29uZmlndXJlZCB2aWEgaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbikNCi0gKiBUaGUgYmVhbiBwcm92aWRlcyB0aGUgZGVmYXVsdCBuYW1lIChjb252ZW50aW9uKS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gZnVsbCBxdWFsaWZpZWQgbmFtZS4gKD0gY3VzdG9taXphYmxlIGNvbnZlbnRpb24pDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MGU0MjAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIG1hcHMgRXh0VmFsIEFubm90YXRpb25zIHRvIEV4dFZhbCBWYWxpZGF0aW9uU3RyYXRlZ2llcy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZShtZXRhRGF0YUtleSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MGE2MTIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIHRvIHBsYWNlIEFubm90YXRpb25zIGFuZCBWYWxpZGF0aW9uU3RyYXRlZ2llcyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5ICsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvUHJpb3JpdHkuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvUHJpb3JpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTExYWEzMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGVudW0gUHJpb3JpdHkKLXsKLSAgICBCTE9DS0lORywKLSAgICBISUdILAotICAgIE1FRElVTSwKLSAgICBMT1cKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVG9Eby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTdmZDU3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVG9Eby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotcHVibGljIEBpbnRlcmZhY2UgVG9EbwotewotICAgIFByaW9yaXR5IHZhbHVlKCk7Ci0gICAgU3RyaW5nIGRlc2NyaXB0aW9uKCkgZGVmYXVsdCAiIjsKLQotICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgIEBpbnRlcmZhY2UgTGlzdAotICAgIHsKLSAgICAgICAgVG9Eb1tdIHZhbHVlKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VDYXRlZ29yeS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0N2IzODUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLS8qKgotICogQVBJOjxici8+Ci0gKiBwYXJ0cyB5b3UgbWlnaHQgbmVlZCBmb3IgY3VzdG9tIGltcGxlbWVudGF0aW9ucyBhbmQgd2hpY2ggYXJlIHF1aXRlIHN0YWJsZSBpbiB2aWV3IG9mIGNoYW5nZXMKLSAqIDxwLz4KLSAqIElOVEVSTkFMOjxici8+Ci0gKiBpZiB5b3UgdGhpbmsgYWJvdXQgcmVmZXJlbmNpbmcgYW4gYXJ0aWZhY3Qgd2hpY2ggaXMgbWFya2VkIGFzIGludGVybmFsLCBhc2sgZm9yIHN1cHBvcnQuCi0gKiB0aGVyZSBzaG91bGQgYmUgYSBiZXR0ZXIgc29sdXRpb24KLSAqIDxwLz4KLSAqIENVU1RPTUlaQUJMRTo8YnIvPgotICogYSBwbGFubmVkIGV4dGVuc2lvbiBwb2ludCB3aGljaCBjb250YWlucyBsb2dpYyB0byBjdXN0b21pemUgdGhlIGZyYW1ld29yay4KLSAqIGlmIGl0IGlzbid0IGFsc28gbWFya2VkIGFzIEFQSSBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotICogaG93ZXZlciwgd2UgdHJ5IHRvIGtlZXAgaXQgYXMgc3RhYmxlIGFzIHBvc3NpYmxlIGFuZCByZWFzb25hYmxlLgotICogPHAvPgotICogUkVVU0U6PGJyLz4KLSAqIGFuIGFydGlmYWN0IHdoaWNoIHlvdSBjYW4gcmV1c2UgZm9yIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uLgotICogaWYgaXQgaXNuJ3QgbWFya2VkIGFzIEFQSSBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotICogaG93ZXZlciwgd2UgdHJ5IHRvIGtlZXAgaXQgYXMgc3RhYmxlIGFzIHBvc3NpYmxlIGFuZCByZWFzb25hYmxlLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLXB1YmxpYyBlbnVtIFVzYWdlQ2F0ZWdvcnkKLXsKLSAgICBBUEksCi0gICAgSU5URVJOQUwsCi0gICAgQ1VTVE9NSVpBQkxFLAotICAgIFJFVVNFCi19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlSW5mb3JtYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTM3ZWJjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIGl0J3MgYW4gaW50ZXJuYWwgYW5ub3RhdGlvbiB0byBwcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gY29uY2VybmluZyB1c2FnZS1jYXRlZ29yaWVzCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkKLSAqLwotQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi1wdWJsaWMgQGludGVyZmFjZSBVc2FnZUluZm9ybWF0aW9uCi17Ci0gICAgVXNhZ2VDYXRlZ29yeVtdIHZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0NsYXNzVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VhNjViMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsNCi1pbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ2xhc3NVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENsYXNzVXRpbHMuY2xhc3MpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIHRyeVRvTG9hZENsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGxvYWRDbGFzc0Zvck5hbWUobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGxvYWRDbGFzc0Zvck5hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIFRyeSBXZWJBcHAgQ2xhc3NMb2FkZXIgZmlyc3QNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwDQotICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWdub3JlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIGZhbGxiYWNrOiBUcnkgQ2xhc3NMb2FkZXIgZm9yIENsYXNzVXRpbHMgKGkuZS4gdGhlIG15ZmFjZXMuamFyIGxpYikNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwDQotICAgICAgICAgICAgICAgIENsYXNzVXRpbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnN0YW50aWF0ZUNsYXNzKENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0Q2xhc3MubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoU3RyaW5nIGNsYXNzTmFtZSkNCi0gICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsb2FkQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKYXJWZXJzaW9uKENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY2xhc3NGaWxlUGF0aCA9IHRhcmdldENsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSArICIuY2xhc3MiOw0KLSAgICAgICAgU3RyaW5nIG1hbmlmZXN0RmlsZVBhdGggPSAiL01FVEEtSU5GL01BTklGRVNULk1GIjsNCi0NCi0gICAgICAgIFN0cmluZyBjbGFzc0xvY2F0aW9uID0gdGFyZ2V0Q2xhc3MuZ2V0UmVzb3VyY2UodGFyZ2V0Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi5jbGFzcyIpLnRvU3RyaW5nKCk7DQotICAgICAgICBTdHJpbmcgbWFuaWZlc3RGaWxlTG9jYXRpb24gPSBjbGFzc0xvY2F0aW9uDQotICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgY2xhc3NMb2NhdGlvbi5pbmRleE9mKGNsYXNzRmlsZVBhdGgpIC0gMSkgKyBtYW5pZmVzdEZpbGVQYXRoOw0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBNYW5pZmVzdChuZXcgVVJMKG1hbmlmZXN0RmlsZUxvY2F0aW9uKS5vcGVuU3RyZWFtKCkpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5nZXRWYWx1ZShBdHRyaWJ1dGVzLk5hbWUuSU1QTEVNRU5UQVRJT05fVkVSU0lPTik7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKExPRy5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTE9HLnRyYWNlKCJjb3VsZG4ndCBsb2FkIHZlcnNpb24gb2YgamFyIGZpbGUgd2hpY2ggY29udGFpbnMgIiArIHRhcmdldENsYXNzLmdldE5hbWUoKSwgdCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxVdGlscy5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NjFiODUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkFic3RyYWN0RUxIZWxwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5Lk5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjZXNNZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPR0dFUiA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEV4dFZhbFV0aWxzLmNsYXNzKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX1JFUVVJUkVEID0gImphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUlucHV0LlJFUVVJUkVEIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX1JFUVVJUkVEX0RFVEFJTCA9ICJqYXZheC5mYWNlcy5jb21wb25lbnQuVUlJbnB1dC5SRVFVSVJFRF9kZXRhaWwiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfTUFYSU1VTSA9ICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yLk1BWElNVU0iOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwgPSAiamF2YXguZmFjZXMudmFsaWRhdG9yLkxlbmd0aFZhbGlkYXRvci5NQVhJTVVNX2RldGFpbCI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nRmFjdG9yeTxTdHJpbmcsIFZhbGlkYXRpb25TdHJhdGVneT4pIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUobWV0YURhdGFLZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIE5hbWVNYXBwZXI8U3RyaW5nPiBtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5yZWdpc3RlcihtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlcmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gbWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZXJlZ2lzdGVyKG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZW55TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVueShtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckZvclZhbGlkYXRpb25TdHJhdGVneShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWV0YURhdGFUcmFuc2Zvcm1lcj4pIEV4dFZhbENvbnRleHQNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5yZWdpc3Rlcih2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlcmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVueVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlbnkodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKCkNCi0gICAgew0KLSAgICAgICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksIENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICB7DQotICAgICAgICBmb3IoQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRDb21wb25lbnRJbml0aWFsaXplcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjb21wb25lbnRJbml0aWFsaXplci5jb25maWd1cmVDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOw0KLQ0KLSAgICAgICAgZm9yKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCF2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJUaHJvd2luZygNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uLCB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3IoZmluYWwgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgTWV0YURhdGFFeHRyYWN0b3IoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcmVzdWx0ID0gbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIG9iamVjdCk7DQotICAgICAgICAgICAgICAgIGZvcihNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciA6DQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmFmdGVyRXh0cmFjdGluZyhyZXN1bHQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VSZXNvbHZlciBnZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1lc3NhZ2VSZXNvbHZlcj4pRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgLmNyZWF0ZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAucmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZXJlZ2lzdGVyKHZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVueVZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVueSh2YWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBFTEhlbHBlciBnZXRFTEhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRUxfSEVMUEVSX0ZBQ1RPUlksIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmNsYXNzKS5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY2VzTWVzc2FnZSBjcmVhdGVGYWNlc01lc3NhZ2UoU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcmVhdGVGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjZXNNZXNzYWdlIGNyZWF0ZUZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkZBQ0VTX01FU1NBR0VfRkFDVE9SWSwgRmFjZXNNZXNzYWdlRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZShzZXZlcml0eSwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY2VzTWVzc2FnZSBjb252ZXJ0RmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRkFDRVNfTUVTU0FHRV9GQUNUT1JZLCBGYWNlc01lc3NhZ2VGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuY29udmVydChmYWNlc01lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHlEZXRhaWxzIGNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgYmFzZU9iamVjdDsNCi0gICAgICAgIGlmKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKHRhcmdldEV4cHJlc3Npb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmJlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgU3RyaW5nIGV4cHJlc3Npb24gPSB2YmUuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgICAgIGJhc2VPYmplY3QgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YmUuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURldGFpbHMoDQotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uc3Vic3RyaW5nKDIsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKSwgYmFzZU9iamVjdCwgdmJlLmdldFByb3BlcnR5KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIG9yaWdpbmFsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eSgNCi0gICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgU3RyaW5nIG5ld0Jhc2VLZXkgPSBvcmlnaW5hbC5nZXRLZXkoKS5zdWJzdHJpbmcoMCwgb3JpZ2luYWwuZ2V0S2V5KCkubGFzdEluZGV4T2YoIi4iKSArIDEpOw0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IG5ld0Jhc2VLZXkgKyB0YXJnZXRFeHByZXNzaW9uOw0KLQ0KLSAgICAgICAgYmFzZU9iamVjdCA9IFJlZmxlY3Rpb25VdGlscy5nZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKG9yaWdpbmFsLmdldEJhc2VPYmplY3QoKSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICBuZXdLZXksIGJhc2VPYmplY3QsIHRhcmdldEV4cHJlc3Npb24uc3Vic3RyaW5nKHRhcmdldEV4cHJlc3Npb24ubGFzdEluZGV4T2YoIi4iKSArIDEsDQotICAgICAgICAgICAgdGFyZ2V0RXhwcmVzc2lvbi5sZW5ndGgoKSkpOw0KLSAgICB9DQotDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb1BsYWNlTGFiZWwoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgU3RyaW5nIGxhYmVsLCBpbnQgaW5kZXgpDQotICAgIHsNCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLmNvbnRhaW5zKCJ7IiArIGluZGV4ICsgIn0iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLnJlcGxhY2UoInsiICsgaW5kZXggKyAifSIsIGxhYmVsKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkuY29udGFpbnMoInsiICsgaW5kZXggKyAifSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNNZXNzYWdlLmdldERldGFpbCgpLnJlcGxhY2UoInsiICsgaW5kZXggKyAifSIsIGxhYmVsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VXaXRoRGVmYXVsdE1heGltdW1NZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIGludCBtYXhMZW5ndGgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZSA9IEpzZlV0aWxzLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfTUFYSU1VTSk7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZTsNCi0NCi0gICAgICAgIC8vdXNlIHRyeS9jYXRjaCBmb3IgZWFzaWVyIHN5bmMgYmV0d2VlbiB0cnVuay9icmFuY2gNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEpzZlV0aWxzLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IEpzZlV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vanNmIDEuMiBkb2Vzbid0IGhhdmUgYSBkZXRhaWwgbWVzc2FnZQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2UgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZS5yZXBsYWNlKCJ7MH0iLCAiIiArIG1heExlbmd0aCk7DQotICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsLnJlcGxhY2UoInswfSIsICIiICsgbWF4TGVuZ3RoKTsNCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGZhY2VzUmVxdWlyZWRNZXNzYWdlKTsNCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwpOw0KLSAgICB9DQotDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBsYWNlV2l0aERlZmF1bHRSZXF1aXJlZE1lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGZhY2VzUmVxdWlyZWRNZXNzYWdlID0gSnNmVXRpbHMuZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhKQVZBWF9GQUNFU19SRVFVSVJFRCk7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZTsNCi0NCi0gICAgICAgIC8vdXNlIHRyeS9jYXRjaCBmb3IgZWFzaWVyIHN5bmMgYmV0d2VlbiB0cnVuay9icmFuY2gNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEpzZlV0aWxzLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfUkVRVUlSRURfREVUQUlMKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBKc2ZVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkuZ2V0U3RyaW5nKEpBVkFYX0ZBQ0VTX1JFUVVJUkVEX0RFVEFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9qc2YgMS4yIGRvZXNuJ3QgaGF2ZSBhIGRldGFpbCBtZXNzYWdlDQotICAgICAgICB9DQotDQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc1JlcXVpcmVkTWVzc2FnZSk7DQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTa2lwYWJsZVZhbGlkYXRpb25TdHJhdGVneShDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRDbGFzcyA6IEV4dFZhbFV0aWxzLmdldFNraXBWYWxpZGF0aW9uU3VwcG9ydENsYXNzTGlzdCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLmlzU2tpcFZhbGlkYXRpb25TdXBwb3J0ZWQoY3VycmVudENsYXNzLCB0YXJnZXRDbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHByb2Nlc3NNZXRhRGF0YUVudHJ5QWZ0ZXJTa2lwVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB0YXJnZXRDbGFzcywgTWV0YURhdGFFbnRyeSBlbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmlzU2tpcGFibGVWYWxpZGF0aW9uU3RyYXRlZ3kodGFyZ2V0Q2xhc3MpICYmDQotICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMoZW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCBCb29sZWFuLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PENsYXNzPiBnZXRTa2lwVmFsaWRhdGlvblN1cHBvcnRDbGFzc0xpc3QoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBzdGF0aWNDb25maWd1cmF0aW9uTGlzdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5TS0lQX1ZBTElEQVRJT05fU1VQUE9SVF9DT05GSUcpOw0KLQ0KLSAgICAgICAgTGlzdDxDbGFzcz4gbWFya2VyTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3M7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gY3VycmVudEVudHJ5IDogc3RhdGljQ29uZmlndXJhdGlvbkxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gY3VycmVudENvbmZpZ3VyYXRpb25FbnRyeSA6IGN1cnJlbnRFbnRyeS5nZXRNYXBwaW5nKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShjdXJyZW50Q29uZmlndXJhdGlvbkVudHJ5LmdldFRhcmdldCgpKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYoY3VycmVudENsYXNzICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1hcmtlckxpc3QuYWRkKGN1cnJlbnRDbGFzcyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihMT0dHRVIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi53YXJuKCJjb25maWd1cmF0aW9uIGVudHJ5IHByb3ZpZGVzIGFuIGludmFsaWQgZW50cnk6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY3VycmVudENvbmZpZ3VyYXRpb25FbnRyeS5nZXRUYXJnZXQoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWFya2VyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTa2lwVmFsaWRhdGlvblN1cHBvcnRlZChDbGFzcyBjdXJyZW50Q2xhc3MsIENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZihjdXJyZW50Q2xhc3MuaXNBbm5vdGF0aW9uKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGFyZ2V0Q2xhc3MuaXNBbm5vdGF0aW9uUHJlc2VudChjdXJyZW50Q2xhc3MpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRhcmdldENsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXhlY3V0ZUJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBpZihwcm9wZXJ0aWVzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KHByb3BlcnR5S2V5LCBwcm9wZXJ0aWVzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgTGlzdDxWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRWYWxpZGF0aW9uVmFsaWRhdGlvbkludGVyY2VwdG9ycygpOw0KLQ0KLSAgICAgICAgZm9yKFZhbGlkYXRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uSW50ZXJjZXB0b3IgOiB2YWxpZGF0aW9uSW50ZXJjZXB0b3JzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCF2YWxpZGF0aW9uSW50ZXJjZXB0b3IuYmVmb3JlVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHByb3BlcnR5TWFwKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZXhlY3V0ZUFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5S2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgaWYocHJvcGVydGllcyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5TWFwLnB1dChwcm9wZXJ0eUtleSwgcHJvcGVydGllcyk7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PFZhbGlkYXRpb25JbnRlcmNlcHRvcj4gdmFsaWRhdGlvbkludGVyY2VwdG9ycyA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZhbGlkYXRpb25WYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7DQotDQotICAgICAgICBmb3IoVmFsaWRhdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25JbnRlcmNlcHRvciA6IHZhbGlkYXRpb25JbnRlcmNlcHRvcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvbkludGVyY2VwdG9yLmFmdGVyVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHByb3BlcnR5TWFwKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvSnNmVXRpbHMuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjUwZDg5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZTsNCi1pbXBvcnQgamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZUZhY3Rvcnk7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOw0KLQ0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpzZlV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3RlclBoYXNlTGlzdGVuZXIoUGhhc2VMaXN0ZW5lciBwaGFzZUxpc3RlbmVyKQ0KLSAgICB7DQotICAgICAgICBMaWZlY3ljbGVGYWN0b3J5IGxpZmVjeWNsZUZhY3RvcnkgPSAoTGlmZWN5Y2xlRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRmFjdG9yeUZpbmRlci5MSUZFQ1lDTEVfRkFDVE9SWSk7DQotDQotICAgICAgICBTdHJpbmcgY3VycmVudElkOw0KLSAgICAgICAgTGlmZWN5Y2xlIGN1cnJlbnRMaWZlY3ljbGU7DQotICAgICAgICBJdGVyYXRvciBsaWZlY3ljbGVJZHMgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZUlkcygpOw0KLSAgICAgICAgd2hpbGUgKGxpZmVjeWNsZUlkcy5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudElkID0gKFN0cmluZykgbGlmZWN5Y2xlSWRzLm5leHQoKTsNCi0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlID0gbGlmZWN5Y2xlRmFjdG9yeS5nZXRMaWZlY3ljbGUoY3VycmVudElkKTsNCi0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlLnJlbW92ZVBoYXNlTGlzdGVuZXIocGhhc2VMaXN0ZW5lcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFN0cmluZyBidW5kbGVOYW1lID0gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZ2V0TWVzc2FnZUJ1bmRsZSgpOw0KLQ0KLSAgICAgICAgaWYoYnVuZGxlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJ1bmRsZU5hbWUgPSBGYWNlc01lc3NhZ2UuRkFDRVNfTUVTU0FHRVM7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGJ1bmRsZU5hbWUsIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODdmN2QuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1JlZmxlY3Rpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGlvblV0aWxzCi17Ci0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgdHJ5VG9HZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvR2V0TWV0aG9kKHRhcmdldENsYXNzLCB0YXJnZXRNZXRob2ROYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCB0cnlUb0dldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUsIENsYXNzLi4uIHBhcmFtZXRlclR5cGVzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lKQotICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TWV0aG9kKHRhcmdldENsYXNzLCB0YXJnZXRNZXRob2ROYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lLCBDbGFzcy4uLiBwYXJhbWV0ZXJUeXBlcykKLSAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gdGFyZ2V0Q2xhc3M7Ci0gICAgICAgIE1ldGhvZCB0YXJnZXRNZXRob2QgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKCFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gY3VycmVudENsYXNzLmdldERlY2xhcmVkTWV0aG9kKHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGFyZ2V0TWV0aG9kID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IHRhcmdldENsYXNzLmdldEludGVyZmFjZXMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50SW50ZXJmYWNlOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRDbGFzcyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IGN1cnJlbnRDbGFzcy5nZXREZWNsYXJlZE1ldGhvZCh0YXJnZXRNZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0YXJnZXRNZXRob2QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRhcmdldE1ldGhvZDsKLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBOb1N1Y2hNZXRob2RFeGNlcHRpb24oInRoZXJlIGlzIG5vIG1ldGhvZCB3aXRoIHRoZSBuYW1lICciICsgdGFyZ2V0TWV0aG9kTmFtZSArICInIiArCi0gICAgICAgICAgICAgICAgIiBjbGFzczogIiArIHRhcmdldENsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0ludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3ModGFyZ2V0LCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZE9mQ2xhc3ModGFyZ2V0LCBtZXRob2QsIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQubmV3SW5zdGFuY2UoKSwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldC5uZXdJbnN0YW5jZSgpLCBtZXRob2QsIGFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdC4uLiBhcmdzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0LCBtZXRob2QsIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdC4uLiBhcmdzKQotICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKHRhcmdldCwgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QmFzZU9mUHJvcGVydHlDaGFpbihPYmplY3QgYmFzZU9iamVjdCwgU3RyaW5nIHByb3BlcnR5Q2hhaW4pCi0gICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcm9wZXJ0eUNoYWluLCAiLiIpOwotCi0gICAgICAgIE9iamVjdCBjdXJyZW50QmFzZSA9IGJhc2VPYmplY3Q7Ci0gICAgICAgIFN0cmluZyBjdXJyZW50UHJvcGVydHk7Ci0gICAgICAgIE1ldGhvZCBjdXJyZW50TWV0aG9kOwotCi0gICAgICAgIHdoaWxlKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQotICAgICAgICAgICAgLy9pZ25vcmUgdGhlIGxhc3QgcHJvcGVydHkKLSAgICAgICAgICAgIGlmKCF0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL25vIGlzIC0gaXQncyBvbmx5IHBvc3NpYmxlIGF0IHByb3BlcnRpZXMgbm90IGF0IGJlYW4gbGV2ZWwKLSAgICAgICAgICAgIGN1cnJlbnRNZXRob2QgPSB0cnlUb0dldE1ldGhvZChjdXJyZW50QmFzZS5nZXRDbGFzcygpLAotICAgICAgICAgICAgICAgICJnZXQiICsgY3VycmVudFByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFByb3BlcnR5LnN1YnN0cmluZygxLCBjdXJyZW50UHJvcGVydHkubGVuZ3RoKCkpKTsKLSAgICAgICAgICAgIGN1cnJlbnRCYXNlID0gdHJ5VG9JbnZva2VNZXRob2QoY3VycmVudEJhc2UsIGN1cnJlbnRNZXRob2QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRCYXNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1dlYlhtbFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYjIxN2IuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1dlYlhtbFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFdlYlhtbFV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKQ0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVggKyAiLiIgKyBrZXkpOw0KLSAgICAgICAgcmV0dXJuICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlLnJlcGxhY2UoIiAiLCAiIikudHJpbSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTIwMWQyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2NvcmUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlIE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlIE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUgTW9kdWxlIHByb3ZpZGVzIGFuIGV4dGVuc2libGUgdmFsaWRhdGlvbiBwbGF0Zm9ybSB0byBpbXBsZW1lbnQgdmFsaWRhdGlvbiBiYXNlZCBvbiBtZXRhLWRhdGEuDQotICAgIEJhc2VkIG9uIHRoaXMgbW9kdWxlIGl0IGlzIHBvc3NpYmxlIHRvIGltcGxlbWVudCB2YWxpZGF0aW9uIG1vZHVsZXMuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLjEueCBhbmQgSlNGIDEuMi54LiBCb3RoIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2Fzc2VtYmx5L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MTZhYTcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgRXhhbXBsZXMgQXNzZW1ibHk8L25hbWU+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWV4YW1wbGVzLWFzc2VtYmx5MTI8L2FydGlmYWN0SWQ+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZGVwZW5kZW5jeS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS13YXI8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1oZWxsb193b3JsZDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4JCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmVhdHVyZS1zZXRfMDE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3dhcjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LXNyYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+amF2YS1zb3VyY2U8L3R5cGU+ICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWZlYXR1cmUtc2V0XzAxPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+amF2YS1zb3VyY2U8L3R5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3NyYzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS0gRVhFQ1VURSBtdm4gcGFja2FnZSB0byBnZW5lcmF0ZSBhc3NlbWJseSBmaWxlcyAtLT4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfc3JjPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hc3NlbWJseTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsLWV4YW1wbGVzLSR7cHJvamVjdC52ZXJzaW9ufS1zcmM8L2ZpbmFsTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L291dDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X2JpbjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXNzZW1ibHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotCSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPiAgIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9kZXAueG1sPC9kZXNjcmlwdG9yPgotCSAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5teWZhY2VzLWV4dHZhbC1leGFtcGxlcy0ke3Byb2plY3QudmVyc2lvbn08L2ZpbmFsTmFtZT4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L291dDwvb3V0cHV0RGlyZWN0b3J5PgotCSAgICAgICAgICAgICAgICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0JICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotCSAgICAKLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLm1hdmVuPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPndhZ29uLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGlkPm15ZmFjZXMtbmlnaHRseS1idWlsZHM8L2lkPgotICAgICAgICAgICAgICAgICAgICA8dXJsPnNjcGV4ZTovL21pbm90YXVyLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL2J1aWxkcy9teWZhY2VzL25pZ2h0bHk8L3VybD4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L291dDwvaW5wdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgPC9wbHVnaW5zPgotCi0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZjdiODEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgkKLSAgPGZpbGVTZXRzPiAgICAKLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3dhcjwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki53YXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4gICAgIAotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWwgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTcwY2NjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08YXNzZW1ibHk+Ci0gIDxpZD5zcmM8L2lkPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4JCi0gIDxmaWxlU2V0cz4gICAgCi0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9zcmM8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki50eHQ8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNWIzYTUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDliZGIxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcgotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3BvbS54bWwgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTgxMjFlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWZlYXR1cmUtc2V0XzAxPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIGZlYXR1cmUtc2V0IDAxPC9uYW1lPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjAuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uZmFjZWxldHM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWZhY2VsZXRzPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xNDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzZi1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjAtYjExPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjAtYjExPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPCEtLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICAtLT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50b21haGF3azwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50b21haGF3azwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuNjwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2N1c3RvbS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MDFkZjcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0jIHRoaXMgbWVzc2FnZSBidW5kbGUgaXMgcGlja2VkIHVwIHZpYSBjb252ZW50aW9uDQotcmVwZWF0ZWRfcGFzc3dvcmRfcmVxdWlyZWQ9cGxlYXNlIHJldHlwZSB0aGUgcGFzc3dvcmQNCi1yZXBlYXRlZF9wYXNzd29yZF9yZXF1aXJlZF9kZXRhaWw9cGxlYXNlIHJldHlwZSB0aGUgcGFzc3dvcmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2RvbWFpbi9QZXJzb24uamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmFlNDFlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRGF0ZUlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXNUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5Ob3RFcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47DQotDQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVGVtcG9yYWw7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlRlbXBvcmFsVHlwZTsNCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotcHVibGljIGNsYXNzIFBlcnNvbg0KLXsNCi0gICAgQExlbmd0aChtaW5pbXVtID0gMikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAyMCkNCi0gICAgQE5vdEVxdWFscygibGFzdE5hbWUiKQ0KLSAgICBAUGF0dGVybigiW0EtWl1bYS16XSsiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7DQotDQotICAgIEBMZW5ndGgobWluaW11bSA9IDIpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMjApDQotICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsNCi0NCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcm9sZSA9ICJ1c2VyIjsNCi0NCi0gICAgQERhdGVJcyh0eXBlID0gRGF0ZUlzVHlwZS5iZWZvcmUsIHZhbHVlT2YgPSAiZmluYWxFeGFtIikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlKQ0KLSAgICBAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLkRBVEUpDQotICAgIHByaXZhdGUgRGF0ZSBiaXJ0aGRheTsNCi0NCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlKQ0KLSAgICBAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLkRBVEUpDQotICAgIHByaXZhdGUgRGF0ZSBmaW5hbEV4YW07DQotDQotICAgIEBMZW5ndGgobWluaW11bSA9IDIpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIG5pY2tOYW1lOw0KLQ0KLSAgICBATGVuZ3RoKG1pbmltdW0gPSA2KQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDYwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBlbWFpbDsNCi0NCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlKQ0KLSAgICBwcml2YXRlIGludCBudW1iZXJPZlNpYmxpbmdzOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbGFzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJvbGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcm9sZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRSb2xlKFN0cmluZyByb2xlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnJvbGUgPSByb2xlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldEJpcnRoZGF5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGJpcnRoZGF5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEJpcnRoZGF5KERhdGUgYmlydGhkYXkpDQotICAgIHsNCi0gICAgICAgIHRoaXMuYmlydGhkYXkgPSBiaXJ0aGRheTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXRGaW5hbEV4YW0oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmluYWxFeGFtOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEZpbmFsRXhhbShEYXRlIGZpbmFsRXhhbSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maW5hbEV4YW0gPSBmaW5hbEV4YW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROaWNrTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuaWNrTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROaWNrTmFtZShTdHJpbmcgbmlja05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmlja05hbWUgPSBuaWNrTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVtYWlsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKFN0cmluZyBlbWFpbCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5lbWFpbCA9IGVtYWlsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZTaWJsaW5ncygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBudW1iZXJPZlNpYmxpbmdzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlck9mU2libGluZ3MoaW50IG51bWJlck9mU2libGluZ3MpDQotICAgIHsNCi0gICAgICAgIHRoaXMubnVtYmVyT2ZTaWJsaW5ncyA9IG51bWJlck9mU2libGluZ3M7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmUxNGZiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5ndWkuYmVhbnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uTm90RXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxvbmdSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5jdXN0b20uZW1haWx2YWxpZGF0b3IuRW1haWxWYWxpZGF0b3I7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvblBhZ2UNCi17DQotDQotICAgIC8vdGhlIG9sZCBwYXNzd29yZCBvZiB0aGUgcGVyc29uIGlzbid0IHVzZWQgd2l0aGluIHRoZSBwYWdlDQotICAgIC8vLT4gdmFsaWRhdGUgd2l0aCB2YWx1ZSBvZiB0aGUgbW9kZWwNCi0gICAgQFNraXBWYWxpZGF0aW9uKCIje3BlcnNvbi5yb2xlIGVxICdhZG1pbid9IikNCi0gICAgQFJlcXVpcmVkDQotICAgIEBFcXVhbHMoInBlcnNvbi5wYXNzd29yZCIpDQotICAgIEBOb3RFcXVhbHMoInBhc3N3b3JkIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgb2xkUGFzc3dvcmQ7DQotDQotICAgIEBFcXVhbHMoInBhc3N3b3JkUmVwZWF0ZWQiKQ0KLSAgICAvL2NvbWJpbmUgZ3VpIHJlbGF0ZWQgYW5ub3RhdGlvbnMgd2l0aCB0aGUgYW5ub2F0aW9ucyBvZiB0aGUgZG9tYWluIG1vZGVsDQotICAgIEBKb2luVmFsaWRhdGlvbih2YWx1ZSA9ICIje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLnBhc3N3b3JkfSIpDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOw0KLQ0KLSAgICBAUmVxdWlyZWQodmFsaWRhdGlvbkVycm9yTXNnS2V5ID0gInJlcGVhdGVkX3Bhc3N3b3JkX3JlcXVpcmVkIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmRSZXBlYXRlZDsNCi0NCi0gICAgLy91c2UgI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5uaWNrTmFtZX0sICN7cGVyc29uLm5pY2tOYW1lfQ0KLSAgICAvL3VzZSByZWdpc3RyYXRpb25QYWdlIHRvIGRpc3BsYXkgdGhlIHNlY29uZCBlcnJvciBtZXNzYWdlIGF0IG9sZCBuaWNrbmFtZQ0KLSAgICAvL29yIGxvY2FsIHByb3BlcnR5IGNoYWluaW5nICh0byBhdm9pZCB0aGUgdXNhZ2Ugb2YgdGhlIGJlYW4gbmFtZSkgLSBsaWtlOg0KLSAgICBAU2tpcFZhbGlkYXRpb24oIiN7cGVyc29uLnJvbGUgZXEgJ2FkbWluJ30iKQ0KLSAgICBATm90RXF1YWxzKCJwZXJzb24ubmlja05hbWUiKQ0KLSAgICBASm9pblZhbGlkYXRpb24oInBlcnNvbi5uaWNrTmFtZSIpDQotICAgIHByaXZhdGUgU3RyaW5nIG5ld05pY2tOYW1lOw0KLQ0KLSAgICBwcml2YXRlIFBlcnNvbiBwZXJzb247DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZmluaXNoKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0UGFzc3dvcmQodGhpcy5wYXNzd29yZCk7DQotICAgICAgICByZXR1cm4gImhvbWUiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgdXBkYXRlTmlja05hbWUoKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXROaWNrTmFtZSh0aGlzLm5ld05pY2tOYW1lKTsNCi0gICAgICAgIHJldHVybiAiaG9tZSI7DQotICAgIH0NCi0NCi0gICAgLy9qdXN0IGEgcXVpY2sgaWxsdXN0cmF0aW9uIG9mIHNraXBWYWxpZGF0aW9uDQotICAgIHB1YmxpYyBTdHJpbmcgc3dpdGNoTW9kZSgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50Um9sZSA9IHRoaXMucGVyc29uLmdldFJvbGUoKTsNCi0NCi0gICAgICAgIGlmKGN1cnJlbnRSb2xlLmVxdWFscygiYWRtaW4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnBlcnNvbi5zZXRSb2xlKCJ1c2VyIik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5wZXJzb24uc2V0Um9sZSgiYWRtaW4iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAiIjsNCi0gICAgfQ0KLQ0KLSAgICBASm9pblZhbGlkYXRpb24oInBlcnNvbi5lbWFpbCIpDQotICAgIEBWYWxpZGF0b3IoRW1haWxWYWxpZGF0b3IuY2xhc3MpDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5wZXJzb24uZ2V0RW1haWwoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbWFpbChTdHJpbmcgZW1haWwpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldEVtYWlsKGVtYWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBASm9pblZhbGlkYXRpb24oIiN7cGVyc29uLm51bWJlck9mU2libGluZ3N9IikNCi0gICAgQExvbmdSYW5nZShtYXhpbXVtID0gMjApDQotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZTaWJsaW5ncygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbi5nZXROdW1iZXJPZlNpYmxpbmdzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyT2ZTaWJsaW5ncyhpbnQgbnVtYmVyT2ZTaWJsaW5ncykNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0TnVtYmVyT2ZTaWJsaW5ncyhudW1iZXJPZlNpYmxpbmdzKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2xkUGFzc3dvcmQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gb2xkUGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0T2xkUGFzc3dvcmQoU3RyaW5nIG9sZFBhc3N3b3JkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm9sZFBhc3N3b3JkID0gb2xkUGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkUmVwZWF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmRSZXBlYXRlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZFJlcGVhdGVkKFN0cmluZyBwYXNzd29yZFJlcGVhdGVkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkUmVwZWF0ZWQgPSBwYXNzd29yZFJlcGVhdGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQZXJzb24gZ2V0UGVyc29uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBlcnNvbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzb24oUGVyc29uIHBlcnNvbikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24gPSBwZXJzb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROZXdOaWNrTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXdOaWNrTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROZXdOaWNrTmFtZShTdHJpbmcgbmV3Tmlja05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmV3Tmlja05hbWUgPSBuZXdOaWNrTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MThkNjYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIgotICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjIiPgotICAgIDxhcHBsaWNhdGlvbj4KLSAgICAgICAgPCEtLSB0cmluaWRhZCAtLT4KLSAgICAgICAgPGRlZmF1bHQtcmVuZGVyLWtpdC1pZD4KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb3JlCi0gICAgICAgIDwvZGVmYXVsdC1yZW5kZXIta2l0LWlkPgotCi0gICAgPC9hcHBsaWNhdGlvbj4KLQotICAgIDxtYW5hZ2VkLWJlYW4+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tbmFtZT5yZWdpc3RyYXRpb25QYWdlPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5ndWkuYmVhbnMuUmVnaXN0cmF0aW9uUGFnZTwvbWFuYWdlZC1iZWFuLWNsYXNzPgotICAgICAgICA8bWFuYWdlZC1iZWFuLXNjb3BlPnJlcXVlc3Q8L21hbmFnZWQtYmVhbi1zY29wZT4KLQotICAgICAgICA8bWFuYWdlZC1wcm9wZXJ0eT4KLSAgICAgICAgICAgIDxwcm9wZXJ0eS1uYW1lPnBlcnNvbjwvcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDx2YWx1ZT4je3BlcnNvbn08L3ZhbHVlPgotICAgICAgICA8L21hbmFnZWQtcHJvcGVydHk+Ci0gICAgPC9tYW5hZ2VkLWJlYW4+Ci0KLSAgICA8bWFuYWdlZC1iZWFuPgotICAgICAgICA8bWFuYWdlZC1iZWFuLW5hbWU+cGVyc29uPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5kb21haW4uUGVyc29uPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tc2NvcGU+c2Vzc2lvbjwvbWFuYWdlZC1iZWFuLXNjb3BlPgotICAgIDwvbWFuYWdlZC1iZWFuPgotCi0gICAgPG5hdmlnYXRpb24tcnVsZT4KLSAgICAgICAgPGZyb20tdmlldy1pZD4vcGFnZXMvaG9tZS54aHRtbDwvZnJvbS12aWV3LWlkPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5hZGRVc2VyPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+Y2hhbmdlTmlja05hbWU8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5jaGFuZ2VQYXNzd29yZDwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL2NoYW5nZV9wYXNzd29yZC54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgPG5hdmlnYXRpb24tcnVsZT4KLSAgICAgICAgPGZyb20tdmlldy1pZD4qPC9mcm9tLXZpZXctaWQ+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmhvbWU8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9ob21lLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICA8L25hdmlnYXRpb24tcnVsZT4KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzOTM2Ni4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9tYWluLnRhZ2xpYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBmYWNlbGV0LXRhZ2xpYiBQVUJMSUMKLSAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBGYWNlbGV0IFRhZ2xpYiAxLjAvL0VOIgotICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZmFjZWxldC10YWdsaWJfMV8wLmR0ZCI+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGZhY2VsZXQtdGFnbGliPgotICAgIDxuYW1lc3BhY2U+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHR2YWwvZGVtby9jb21wb25lbnRzPC9uYW1lc3BhY2U+Ci0KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+dXNlckZvcm08L3RhZy1uYW1lPgotICAgICAgICA8c291cmNlPgotICAgICAgICAgICAgLi4vY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKLSAgICAgICAgPC9zb3VyY2U+Ci0gICAgPC90YWc+Ci0KLTwvZmFjZWxldC10YWdsaWI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YzQzYTAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgotICAgICAgICAgdmVyc2lvbj0iMi40Ij4KLQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuREVGQVVMVF9TVUZGSVg8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4ueGh0bWw8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5mYWNlbGV0cy5MSUJSQVJJRVM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9tYWluLnRhZ2xpYi54bWw8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRU5BQkxFX0xJR0hUV0VJR0hUX0RJQUxPR1M8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkRJU0FCTEVfQ09OVEVOVF9DT01QUkVTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQUxURVJOQVRFX1ZJRVdfSEFORExFUjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNvbS5zdW4uZmFjZWxldHMuRmFjZWxldFZpZXdIYW5kbGVyPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLlVTRV9BUFBMSUNBVElPTl9WSUVXX0NBQ0hFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQ0hBTkdFX1BFUlNJU1RFTkNFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+c2Vzc2lvbjwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5TdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jbGllbnQ8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgRGVmaW5lcyB0aGUgYW1vdW50IChkZWZhdWx0ID0gMjApIG9mIHRoZSBsYXRlc3Qgdmlld3MgYXJlIHN0b3JlZCBpbiBzZXNzaW9uLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuTlVNQkVSX09GX1ZJRVdTX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc3RhdGUgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0gYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLgotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkgYW5kIGlmCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04gaXMgdHJ1ZSAoPSBkZWZhdWx0KQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4gSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DT01QUkVTU19TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhpcyBwYXJhbWV0ZXIgdGVsbHMgTXlGYWNlcyBpZiBqYXZhc2NyaXB0IGNvZGUgc2hvdWxkIGJlIGFsbG93ZWQgaW4gdGhlCi0gICAgICAgICAgICByZW5kZXJlZCBIVE1MIG91dHB1dC4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgYWxsb3dlZCwgY29tbWFuZF9saW5rIGFuY2hvcnMgd2lsbCBoYXZlIGphdmFzY3JpcHQgY29kZQotICAgICAgICAgICAgdGhhdCBzdWJtaXRzIHRoZSBjb3JyZXNwb25kaW5nIGZvcm0uCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIG5vdCBhbGxvd2VkLCB0aGUgc3RhdGUgc2F2aW5nIGluZm8gYW5kIG5lc3RlZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICB3aWxsIGJlIGFkZGVkIGFzIHVybCBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BTExPV19KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuREVURUNUX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgcmVuZGVyZWQgSFRNTCBjb2RlIHdpbGwgYmUgZm9ybWF0dGVkLCBzbyB0aGF0IGl0IGlzICJodW1hbiByZWFkYWJsZSIuCi0gICAgICAgICAgICBpLmUuIGFkZGl0aW9uYWwgbGluZSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIHdpbGwgYmUgd3JpdHRlbiwgdGhhdCBkbyBub3QKLSAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgSFRNTCBjb2RlLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIGEgamF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRoYXQgaXMgYWJsZSB0byByZXN0b3JlIHRoZQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMKLSAgICAgICAgICAgIHdpdGggbG9uZyBsaXN0cyBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcAotICAgICAgICAgICAgaWYgeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZSBwYWdlLgotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQVVUT19TQ1JPTEw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlVzZWQgZm9yIGVuY3J5cHRpbmcgdmlldyBzdGF0ZS4gT25seSByZWxldmFudCBmb3IgY2xpZW50IHNpZGUKLSAgICAgICAgICAgIHN0YXRlIHNhdmluZy4gU2VlIE15RmFjZXMgd2lraS93ZWIgc2l0ZSBkb2N1bWVudGF0aW9uIGZvciBpbnN0cnVjdGlvbnMKLSAgICAgICAgICAgIG9uIGhvdyB0byBjb25maWd1cmUgYW4gYXBwbGljYXRpb24gZm9yIGRpZmZlbmVudCBlbmNyeXB0aW9uIHN0cmVuZ3Rocy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFQ1JFVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPk56WTFORE15TVRBPTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZhbGlkYXRlIG1hbmFnZWQgYmVhbnMsIG5hdmlnYXRpb24gcnVsZXMgYW5kIGVuc3VyZSB0aGF0IGZvcm1zIGFyZSBub3QgbmVzdGVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuVkFMSURBVEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLndlYmFwcC5SZXNvdXJjZVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPGZpbHRlcj4KLSAgICAgICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlRyaW5pZGFkRmlsdGVyPC9maWx0ZXItY2xhc3M+Ci0gICAgPC9maWx0ZXI+Ci0KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT50cmluaWRhZDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZ3MgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4vZmFjZXMvKjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPnJlc291cmNlczwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+L2FkZi8qPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg0ZDY0OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiCi0gICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIgotICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIKLSAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIgotICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPgotCi08dWk6Y29tcG9zaXRpb24+Ci0gICAgPHRyOnBhbmVsRm9ybUxheW91dD4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJuaWNrIG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uWyAnbmlja05hbWUnIF19Ii8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9ImUtbWFpbCIgdmFsdWU9IiN7YmVhbi5lbWFpbH0iLz4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJmaXJzdCBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5maXJzdE5hbWV9Ii8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Imxhc3QgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb24ubGFzdE5hbWV9Ii8+Ci0gICAgICAgIDx0cjppbnB1dERhdGUgbGFiZWw9ImJpcnRoZGF5IiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5iaXJ0aGRheX0iPgotICAgICAgICAgICAgPHRyOmNvbnZlcnREYXRlVGltZSB0eXBlPSJkYXRlIiBwYXR0ZXJuPSJkZC5NTS55eXl5Ii8+Ci0gICAgICAgIDwvdHI6aW5wdXREYXRlPgotICAgICAgICA8dHI6aW5wdXREYXRlIGxhYmVsPSJmaW5hbCBleGFtIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5maW5hbEV4YW19Ij4KLSAgICAgICAgICAgIDx0cjpjb252ZXJ0RGF0ZVRpbWUgdHlwZT0iZGF0ZSIgcGF0dGVybj0iZGQuTU0ueXl5eSIvPgotICAgICAgICA8L3RyOmlucHV0RGF0ZT4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJudW1iZXIgb2Ygc2libGluZ3MiIHZhbHVlPSIje2JlYW4ubnVtYmVyT2ZTaWJsaW5nc30iLz4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJwYXNzd29yZCIgdmFsdWU9IiN7YmVhbi5wYXNzd29yZH0iIHNlY3JldD0idHJ1ZSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJyZS1lbnRlciBwYXNzd29yZCIgdmFsdWU9IiN7YmVhbi5wYXNzd29yZFJlcGVhdGVkfSIgc2VjcmV0PSJ0cnVlIi8+Ci0KLSAgICA8L3RyOnBhbmVsRm9ybUxheW91dD4KLTwvdWk6Y29tcG9zaXRpb24+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWNkMTQ4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotICAgICAgICANCi08aHRtbD4NCi0NCi08aGVhZD4NCi0gICAgPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDsgVVJMPWZhY2VzL3BhZ2VzL2hvbWUueGh0bWwiPg0KLTwvaGVhZD4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYzFlYTguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTx0cjpkb2N1bWVudA0KLSAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIg0KLSAgICAgICAgeG1sbnM6Yz0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3RsL2NvcmUiPg0KLSAgICA8ZjpmYWNldCBuYW1lPSJtZXRhQ29udGFpbmVyIj4NCi0gICAgICAgIDx0aXRsZT5zZXYtZW4gZmVhdHVyZS1zZXQgZGVtbyAwMTwvdGl0bGU+DQotICAgIDwvZjpmYWNldD4NCi0NCi0gICAgPHRyaDpib2R5Pg0KLQ0KLSAgICAgICAgPCEtLSBvcmlnaW5hbCAtLT4NCi0gICAgICAgIDxkaXYgaWQ9IndyYXAiPg0KLQ0KLSAgICAgICAgICAgIDx0cjpmb3JtIGlkPSJmb3JtIiBkZWZhdWx0Q29tbWFuZD0iZGVmYXVsdEJ1dHRvbiI+DQotICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1haW4iPg0KLSAgICAgICAgICAgICAgICAgICAgPHVpOmluc2VydCBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ1bmRlcl9jb25zdHJ1Y3Rpb24iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+IXNpdGUgdW5kZXIgY29uc3RydWN0aW9uITwvaDI+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBjb250ZW50IG9mIHRoaXMgc2l0ZSBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSBtb21lbnQuPC9wPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC91aTppbnNlcnQ+DQotICAgICAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICAgIDwvdHI6Zm9ybT4NCi0gICAgICAgICAgICA8dHI6bWVzc2FnZXMgZ2xvYmFsT25seT0idHJ1ZSIvPg0KLQ0KLSAgICAgICAgPC9kaXY+DQotICAgIDwvdHJoOmJvZHk+DQotDQotDQotPC90cjpkb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg5M2ZhZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDx0cjpwYW5lbEZvcm1MYXlvdXQ+DQotDQotICAgICAgICAgICAgPHVpOnJlbW92ZT4NCi0gICAgICAgICAgICAgICAganVzdCBmb3IgdGhlIGRlbW8gd2UgYXJlIHVzaW5nIHR3byBpbnB1dCBjb21wb25lbnRzDQotICAgICAgICAgICAgPC91aTpyZW1vdmU+DQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ib2xkIG5pY2sgbmFtZSIgcmVhZE9ubHk9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLm5pY2tOYW1lfSIvPg0KLQ0KLSAgICAgICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im5pY2sgbmFtZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5uZXdOaWNrTmFtZX0iLz4NCi0NCi0gICAgICAgIDwvdHI6cGFuZWxGb3JtTGF5b3V0Pg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UudXBkYXRlTmlja05hbWV9Ii8+DQotDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9wYXNzd29yZC54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwOTc1YS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDx0YWJsZT4NCi0gICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6b3V0cHV0TGFiZWwgdmFsdWU9Im9sZCBwYXNzd29yZCIgZm9yPSJvbGRfcGFzc3dvcmQiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOmlucHV0VGV4dCBpZD0ib2xkX3Bhc3N3b3JkIiBzaW1wbGU9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2Uub2xkUGFzc3dvcmR9IiBzZWNyZXQ9InRydWUiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm1lc3NhZ2UgZm9yPSJvbGRfcGFzc3dvcmQiLz48L3RkPg0KLSAgICAgICAgICAgIDwvdHI+DQotDQotICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm91dHB1dExhYmVsIHZhbHVlPSJuZXcgcGFzc3dvcmQiIGZvcj0ibmV3X3Bhc3N3b3JkIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjppbnB1dFRleHQgaWQ9Im5ld19wYXNzd29yZCIgc2ltcGxlPSJ0cnVlIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjptZXNzYWdlIGZvcj0ibmV3X3Bhc3N3b3JkIi8+PC90ZD4NCi0gICAgICAgICAgICA8L3RyPg0KLQ0KLSAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjpvdXRwdXRMYWJlbCB2YWx1ZT0icmUtZW50ZXIgcGFzc3dvcmQiIGZvcj0icmVlbnRlcmVkIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjppbnB1dFRleHQgaWQ9InJlZW50ZXJlZCIgc2ltcGxlPSJ0cnVlIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBhc3N3b3JkUmVwZWF0ZWR9IiBzZWNyZXQ9InRydWUiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm1lc3NhZ2UgZm9yPSJyZWVudGVyZWQiLz48L3RkPg0KLSAgICAgICAgICAgIDwvdHI+DQotDQotICAgICAgICA8L3RhYmxlPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UuZmluaXNofSIvPg0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE3ZWJkOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJhZGQgdXNlciIgYWN0aW9uPSJhZGRVc2VyIi8+PGJyLz4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9ImNoYW5nZSBuaWNrIG5hbWUiIGFjdGlvbj0iY2hhbmdlTmlja05hbWUiLz48YnIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0iY2hhbmdlIHBhc3N3b3JkIiBhY3Rpb249ImNoYW5nZVBhc3N3b3JkIi8+PGJyLz4NCi0gICAgICAgIDx0cjpjb21tYW5kTGluayB0ZXh0PSJtb2RlOiAje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLnJvbGV9Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2Uuc3dpdGNoTW9kZX0iIGltbWVkaWF0ZT0idHJ1ZSIvPg0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZjZiMDYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6Yz0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHR2YWwvZGVtby9jb21wb25lbnRzIg0KLSAgICAgICAgPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgPGM6dXNlckZvcm0gYmVhbj0iI3tyZWdpc3RyYXRpb25QYWdlfSIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UuZmluaXNofSIvPg0KLQ0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyODE3ZjkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fd29ybGQ8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgaGVsbG8gd29ybGQ8L25hbWU+DQotICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjAuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjAuMC1iMTE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5mYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjAuMC1iMTE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qc3RsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzdGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4gICAgICAgIA0KLQ0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmFmYjM5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbms7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluLlBlcnNvbjsKLQotLyoqCi0gKiBBIHR5cGljYWwgc2ltcGxlIGJhY2tpbmcgYmVhbiwgdGhhdCBpcyBiYWNrZWQgdG8gPGNvZGU+aGVsbG93b3JsZC5qc3A8L2NvZGU+Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEhlbGxvV29ybGRDb250cm9sbGVyCi17Ci0gICAgcHJpdmF0ZSBQZXJzb24gcGVyc29uID0gbmV3IFBlcnNvbigpOwotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBlbXB0eSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBIZWxsb1dvcmxkQ29udHJvbGxlcigpCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB0aGF0IGlzIGJhY2tlZCB0byBhIHN1Ym1pdCBidXR0b24gb2YgYSBmb3JtLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgc2VuZCgpCi0gICAgewotICAgICAgICAvL2RvIHJlYWwgbG9naWMsIHJldHVybiBhIHN0cmluZyB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuYXZpZ2F0aW9uIHN5c3RlbSBvZiBKU0YKLSAgICAgICAgcmV0dXJuICJzdWNjZXNzIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpCi0gICAgewotICAgICAgICByZXR1cm4gcGVyc29uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNvbihQZXJzb24gcGVyc29uKQotICAgIHsKLSAgICAgICAgdGhpcy5wZXJzb24gPSBwZXJzb247Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkNGE5ZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsKLQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsKLQotcHVibGljIGNsYXNzIFBlcnNvbgotewotICAgIC8vaGVsbG8gd29ybGQgZGVtbwotICAgIEBSZXF1aXJlZAotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsKLQotICAgIC8vZGVtbyBmb3IganBhIGJhc2VkIHZhbGlkYXRpb24gc3VwcG9ydAotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTAgLyouLi4qLykKLSAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaXJzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsYXN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYmVhZTcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGZhY2VzLWNvbmZpZyB2ZXJzaW9uPSIxLjIiIAotICAgIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIj4KLQkKLQk8IS0tIG1hbmFnZWQgYmVhbnMgb2YgdGhlIHNpbXBsZSBoZWxsbyB3b3JsZCBhcHAgLS0+Ci0JPG1hbmFnZWQtYmVhbj4KLQkJPG1hbmFnZWQtYmVhbi1uYW1lPmhlbGxvV29ybGQ8L21hbmFnZWQtYmVhbi1uYW1lPgotCQk8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5IZWxsb1dvcmxkQ29udHJvbGxlcjwvbWFuYWdlZC1iZWFuLWNsYXNzPgotCQk8bWFuYWdlZC1iZWFuLXNjb3BlPnJlcXVlc3Q8L21hbmFnZWQtYmVhbi1zY29wZT4KLQk8L21hbmFnZWQtYmVhbj4KLQkKLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIGhlbGxvV29ybGQuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L2hlbGxvV29ybGQuanNwPC9mcm9tLXZpZXctaWQ+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPnN1Y2Nlc3M8L2Zyb20tb3V0Y29tZT4KLQkJCTx0by12aWV3LWlkPi9wYWdlMi5qc3A8L3RvLXZpZXctaWQ+Ci0JCTwvbmF2aWdhdGlvbi1jYXNlPgotCTwvbmF2aWdhdGlvbi1ydWxlPgotCQotCTwhLS0gbmF2aWdhdGlvbiBydWxlcyBmb3IgcGFnZTIuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L3BhZ2UyLmpzcDwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5iYWNrPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vaGVsbG9Xb3JsZC5qc3A8L3RvLXZpZXctaWQ+Ci0JCTwvbmF2aWdhdGlvbi1jYXNlPgotCTwvbmF2aWdhdGlvbi1ydWxlPgotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MGQ4NmYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgotICAgICAgICAgdmVyc2lvbj0iMi40Ij4KLQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8IS0tb3B0aW9uYWw6IGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Db21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBVUklzIG9mIChhZGRpdGlvbmFsKSBmYWNlcyBjb25maWcgZmlsZXMuCi0gICAgICAgICAgICAoZS5nLiAvV0VCLUlORi9teS1jb25maWcueG1sKQotICAgICAgICAgICAgU2VlIEpTRiAxLjAgUFJEMiwgMTAuMy4yCi0gICAgICAgICAgICBBdHRlbnRpb246IFlvdSBkbyBub3QgbmVlZCB0byBwdXQgL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBpbiBoZXJlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5DT05GSUdfRklMRVM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0tLT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBTZWUgSlNGIFNwZWNpZmljYXRpb24gMi41LjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIGFtb3VudCAoZGVmYXVsdCA9IDIwKSBvZiB0aGUgbGF0ZXN0IHZpZXdzIGFyZSBzdG9yZWQgaW4gc2Vzc2lvbi48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuTlVNQkVSX09GX1ZJRVdTX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc3RhdGUgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0gYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLgotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KSBhbmQgaWYKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgY29tcHJlc3NlZC48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcGFyYW1ldGVyIHRlbGxzIE15RmFjZXMgaWYgamF2YXNjcmlwdCBjb2RlIHNob3VsZCBiZSBhbGxvd2VkIGluIHRoZQotICAgICAgICAgICAgcmVuZGVyZWQgSFRNTCBvdXRwdXQuCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUKLSAgICAgICAgICAgIHRoYXQgc3VibWl0cyB0aGUgY29ycmVzcG9uZGluZyBmb3JtLgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBub3QgYWxsb3dlZCwgdGhlIHN0YXRlIHNhdmluZyBpbmZvIGFuZCBuZXN0ZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BTExPV19KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuREVURUNUX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgcmVuZGVyZWQgSFRNTCBjb2RlIHdpbGwgYmUgZm9ybWF0dGVkLCBzbyB0aGF0IGl0IGlzICJodW1hbiByZWFkYWJsZSIuCi0gICAgICAgICAgICBpLmUuIGFkZGl0aW9uYWwgbGluZSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIHdpbGwgYmUgd3JpdHRlbiwgdGhhdCBkbyBub3QKLSAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgSFRNTCBjb2RlLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlBSRVRUWV9IVE1MPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlCi0gICAgICAgICAgICBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuIENvbnZlbmllbnQgZmVhdHVyZSBpZiB5b3UgaGF2ZSBwYWdlcwotICAgICAgICAgICAgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGJyb3dzZXIgcGFnZSB0byBhbHdheXMganVtcCB0byB0aGUgdG9wCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuCi0gICAgICAgICAgICBEZWZhdWx0OiAiZmFsc2UiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFVVE9fU0NST0xMPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Vc2VkIGZvciBlbmNyeXB0aW5nIHZpZXcgc3RhdGUuIE9ubHkgcmVsZXZhbnQgZm9yIGNsaWVudCBzaWRlCi0gICAgICAgICAgICBzdGF0ZSBzYXZpbmcuIFNlZSBNeUZhY2VzIHdpa2kvd2ViIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRUNSRVQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWYWxpZGF0ZSBtYW5hZ2VkIGJlYW5zLCBuYXZpZ2F0aW9uIHJ1bGVzIGFuZCBlbnN1cmUgdGhhdCBmb3JtcyBhcmUgbm90IG5lc3RlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlZBTElEQVRFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUcmVhdCByZWFkb25seSBzYW1lIGFzIGlmIGRpc2FibGVkIGF0dHJpYnV0ZSB3YXMgc2V0IGZvciBzZWxlY3QgZWxlbWVudHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5SRUFET05MWV9BU19ESVNBQkxFRF9GT1JfU0VMRUNUUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFVzZSB0aGUgZGVmaW5lZCBjbGFzcyBhcyB0aGUgY2xhc3Mgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiBhIHJlc291cmNlIGlzIGFkZGVkIHRvIHRoZQotICAgICAgICAgICAgRXh0ZW5zaW9uRmlsdGVyIGhhbmRsaW5nLiBVc2luZyBTdHJlYW1pbmdBZGRSZXNvdXJjZSBoZXJlIGhlbHBzIHdpdGggcGVyZm9ybWFuY2UuIElmIHlvdSB3YW50IHRvIGFkZAotICAgICAgICAgICAgY3VzdG9tIGNvbXBvbmVudHMgYW5kIHdhbnQgdG8gdXNlIHRoZSBFeHRlbnNpb25GaWx0ZXIsIHlvdSBuZWVkIHRvIHByb3ZpZGUgeW91ciBjdXN0b20gaW1wbGVtZW50YXRpb24gaGVyZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFERF9SRVNPVVJDRV9DTEFTUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC51dGlsLkRlZmF1bHRBZGRSZXNvdXJjZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAgICAgCi0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmlydHVhbCBwYXRoIGluIHRoZSBVUkwgd2hpY2ggdHJpZ2dlcnMgbG9hZGluZyBvZiByZXNvdXJjZXMgZm9yIHRoZSBNeUZhY2VzIGV4dGVuZGVkIGNvbXBvbmVudHMKLSAgICAgICAgICAgIGluIHRoZSBFeHRlbnNpb25GaWx0ZXIuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5SRVNPVVJDRV9WSVJUVUFMX1BBVEg8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vZmFjZXMvbXlGYWNlc0V4dGVuc2lvblJlc291cmNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIENoZWNrIGlmIHRoZSBleHRlbnNpb25zLWZpbHRlciBoYXMgYmVlbiBwcm9wZXJseSBjb25maWd1cmVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ0hFQ0tfRVhURU5TSU9OU19GSUxURVI8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIERlZmluZSBwYXJ0aWFsIHN0YXRlIHNhdmluZyBhcyB0cnVlL2ZhbHNlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5QQVJUSUFMX1NUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCAtLT4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICAgIDwvc2VydmxldD4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCBNYXBwaW5nIC0tPgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+Ki5qc2Y8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPCEtLSBXZWxjb21lIGZpbGVzIC0tPgotICAgIDx3ZWxjb21lLWZpbGUtbGlzdD4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5qc3A8L3dlbGNvbWUtZmlsZT4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+Ci0gICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KLQotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2UxMGIzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwlLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tJT4KLQotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgICAgPGY6dmlldz4KLSAgICAgICAgICAgIDxoOmZvcm0gaWQ9Im1haW5Gb3JtIj4KLSAgICAgICAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjMiPgotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0iZmlyc3RfbmFtZSIgdmFsdWU9IkZpcnN0IG5hbWU6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJmaXJzdF9uYW1lIiBsYWJlbD0iRmlyc3QgbmFtZSIgdmFsdWU9IiN7aGVsbG9Xb3JsZC5wZXJzb24uZmlyc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJmaXJzdF9uYW1lIiBzaG93U3VtbWFyeT0idHJ1ZSIgc2hvd0RldGFpbD0iZmFsc2UiLz4KLQotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0ibGFzdF9uYW1lIiB2YWx1ZT0iTGFzdCBuYW1lOiIvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0ibGFzdF9uYW1lIiBsYWJlbD0iTGFzdCBuYW1lIiB2YWx1ZT0iI3toZWxsb1dvcmxkLnBlcnNvbi5sYXN0TmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0ibGFzdF9uYW1lIiBzaG93U3VtbWFyeT0idHJ1ZSIgc2hvd0RldGFpbD0iZmFsc2UiLz4KLQotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Xb3JsZC5zZW5kfSIvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgICAgICAgPC9oOmZvcm0+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDgyZDUzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCBwYWdlIHNlc3Npb249ImZhbHNlIiU+Ci08JQotcmVzcG9uc2Uuc2VuZFJlZGlyZWN0KCJoZWxsb1dvcmxkLmpzZiIpOwotJT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFjODUyMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgICA8Zjp2aWV3PgotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPgotICAgICAgICAgICAgICAgIDxoMj48aDpvdXRwdXRUZXh0IHZhbHVlPSJIZWxsbyAje2hlbGxvV29ybGQucGVyc29uLmZpcnN0TmFtZX0gI3toZWxsb1dvcmxkLnBlcnNvbi5sYXN0TmFtZX0uIFdlIGhvcGUgeW91IGVuam95IEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yISIvPjwvaDI+Ci0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZExpbmsgYWN0aW9uPSJiYWNrIj4KLSAgICAgICAgICAgICAgICAgICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iSG9tZSIvPgotICAgICAgICAgICAgICAgIDwvaDpjb21tYW5kTGluaz4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICA8L2Y6dmlldz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL2V4YW1wbGVzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNTEzMTguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvZXhhbXBsZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0NCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIHByb2plY3Q8L25hbWU+DQotICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvZXhhbXBsZXM8L2Nvbm5lY3Rpb24+DQotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvZXhhbXBsZXM8L2RldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9leGFtcGxlczwvdXJsPg0KLSAgICA8L3NjbT4NCi0gICAgDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDwhLS1UaGlzIHBsdWdpbiBhbGxvd3MgdG8gcnVuIHRoZSBleGFtcGxlIHVzaW5nIG12biBqZXR0eTpydW4gLS0+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZXR0eS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjYuMS44PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjEwPC9zY2FuSW50ZXJ2YWxTZWNvbmRzPg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotICAgIDxtb2R1bGVzPg0KLSAgICAgICAgPG1vZHVsZT5oZWxsb193b3JsZDwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5mZWF0dXJlLXNldF8wMTwvbW9kdWxlPg0KLSAgICA8L21vZHVsZXM+DQotDQotICAgIDxwcm9maWxlcz4NCi0gICAgICAgIDwhLS0gVGhpcyBwcm9maWxlIGlzIGludm9rZWQgYnkgLURwcmVwYXJlUmVsZWFzZT10cnVlLiAgVGhpcyBhbGxvd3MgbXZuIHJlbGVhc2U6cHJlcGFyZSB0bw0KLSAgICAgICAgICAgIHJ1biBzdWNjZXNzZnVsbHkgb24gdGhlIGFzc2VtYmx5IHByb2plY3RzLiAtLT4NCi0gICAgICAgIDxwcm9maWxlPg0KLSAgICAgICAgICAgIDxpZD5wcmVwYXJlLXJlbGVhc2U8L2lkPg0KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPg0KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+DQotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wcmVwYXJlUmVsZWFzZTwvbmFtZT4NCi0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8L2FjdGl2YXRpb24+DQotICAgICAgICAgICAgPG1vZHVsZXM+DQotICAgICAgICAgICAgICAgIDxtb2R1bGU+YXNzZW1ibHk8L21vZHVsZT4NCi0gICAgICAgICAgICA8L21vZHVsZXM+DQotICAgICAgICAgICAgPGJ1aWxkPg0KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVsZWFzZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+LURwcmVwYXJlUmVsZWFzZTwvYXJndW1lbnRzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+DQotICAgICAgICAgICAgPC9idWlsZD4NCi0gICAgICAgIDwvcHJvZmlsZT4NCi0gICAgPC9wcm9maWxlcz4NCi0NCi0gICAgPHByb3BlcnRpZXM+DQotICAgICAgICA8dHJpbmlkYWQudmVyc2lvbj4xLjIuOTwvdHJpbmlkYWQudmVyc2lvbj4NCi0gICAgPC9wcm9wZXJ0aWVzPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9sb2dvL0xJQ0VOU0UudHh0IGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvbG9nby9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9sb2dvL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9sb2dvL05PVElDRS50eHQgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9sb2dvL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvbG9nby9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvbG9nby9leHR2YWwtbG9nby5zdmcgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9sb2dvL2V4dHZhbC1sb2dvLnN2ZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcyYjUzOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9sb2dvL2V4dHZhbC1sb2dvLnN2ZworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPCEtLSBDcmVhdGVkIHdpdGggSW5rc2NhcGUgKGh0dHA6Ly93d3cuaW5rc2NhcGUub3JnLykgLS0+Ci0KLQotPCEtLQotCUNvcHlyaWdodCAyMDA5IEVucmljbyBCZXJ0aSAoZW5yaWNvLmJlcnRpQGdtYWlsLmNvbSkKLQotCUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotCXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLQlZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotCSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotCVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLQlkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotCVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotCVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLQlsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0KLTxzdmcKLSAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCi0gICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCi0gICB2ZXJzaW9uPSIxLjAiCi0gICB3aWR0aD0iNzQ0LjA5NDQ4IgotICAgaGVpZ2h0PSIxMDUyLjM2MjIiCi0gICBpZD0ic3ZnMiI+Ci0gIDxkZWZzCi0gICAgIGlkPSJkZWZzNCIgLz4KLSAgPGcKLSAgICAgaWQ9ImxheWVyMiI+Ci0gICAgPHJlY3QKLSAgICAgICB3aWR0aD0iMzUzLjQxOTUzIgotICAgICAgIGhlaWdodD0iMTEzLjEwODQiCi0gICAgICAgcnk9IjExIgotICAgICAgIHg9IjE4Mi4yMzAxNSIKLSAgICAgICB5PSIzODEuMzMyOTIiCi0gICAgICAgaWQ9InJlY3QyNDg0IgotICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiM2NjY2NmY7c3Ryb2tlLXdpZHRoOjAuODAxODgyNjI7c3Ryb2tlLW9wYWNpdHk6MC45NDExNzY0NyIgLz4KLSAgPC9nPgotICA8ZwotICAgICBpZD0ibGF5ZXIxIj4KLSAgICA8cGF0aAotICAgICAgIGQ9Ik0gMTA3LjE4NzUsMzkzLjU2NjM4IEwgMTIyLjMwNDY5LDM5My41NjYzOCBMIDE3Ny41LDQ2Ny4zOTQ1MSBMIDE2Mi4zODI4MSw0NjcuMzk0NTEgTCAxMDcuMTg3NSwzOTMuNTY2MzggTSAxMjIuMzA0NjksNDY3LjM5NDUxIEwgMTA3LjE4NzUsNDY3LjM5NDUxIEwgMTYyLjM4MjgxLDM5My41NjYzOCBMIDE3Ny41LDM5My41NjYzOCBMIDEyMi4zMDQ2OSw0NjcuMzk0NTEgTSAxODUuOTM3NSwzODEuNjEzMjYgTCAxOTQuMDkzNzUsMzgxLjYxMzI2IEwgMTk2LjkwNjI1LDM5My41NjYzOCBMIDIxNC4wNjI1LDM5My41NjYzOCBMIDIxNC4wNjI1LDQwNC4xMTMyNiBMIDE5OC45NDUzMSw0MDQuMTEzMjYgTCAxOTguOTQ1MzEsNDQ2LjUxMTY5IEMgMTk4Ljk0NTMsNDUzLjQwMjMzIDIwMS45MjE4Niw0NTYuODQ3NjQgMjA3Ljg3NSw0NTYuODQ3NjMgTCAyMTQuMDYyNSw0NTYuODQ3NjMgTCAyMTQuMDYyNSw0NjcuMzk0NTEgTCAyMDQuNSw0NjcuMzk0NTEgQyAxOTIuMTI0OTksNDY3LjM5NDUxIDE4NS45Mzc1LDQ2MC43NjE3IDE4NS45Mzc1LDQ0Ny40OTYwNyBMIDE4NS45Mzc1LDM4MS42MTMyNiIKLSAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNDcuNTIxNzMsMTkuMjkxOTIyKSIKLSAgICAgICBpZD0iZmxvd1Jvb3QyNDYxIgotICAgICAgIHN0eWxlPSJmb250LXNpemU6NDBweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjE7Zm9udC1mYW1pbHk6U2Fuc2F0aW9uOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246U2Fuc2F0aW9uIiAvPgotICAgIDxwYXRoCi0gICAgICAgZD0iTSA0ODQuMTU2MjUsMzM3LjkzNzUgQyA0NzkuOTUwMDcsMzQxLjE4MTA1IDQ3Ni45MDg2MSwzNDUuNjAxMjEgNDczLjcxODc1LDM0OS43ODEyNSBDIDQ2Ni4wNzE5MiwzNjAuMTU5MDIgNDU4LjM1MzQ3LDM3MC40ODQ2MSA0NTAuODM3MzksMzgwLjk1Nzk2IEMgNDQwLjk4MTIzLDM5NC40NDg3MyA0MzEuMjk1OTMsNDA4LjA2NDQ5IDQyMS44MzI5OCw0MjEuODM0MTMgQyA0MTMuNjUwMDcsNDMzLjcyNzk5IDQwNS40NTU2OCw0NDUuNjE0MTIgMzk3LjM1ODU3LDQ1Ny41NjY2NiBDIDM5Ni43NDQ2LDQ1OC4zMzMwOSAzOTYuMzUxMTksNDU5LjMwNDI3IDM5NS41OTM3NSw0NTkuOTM3NSBDIDM5NC43ODMwMyw0NjAuNTA2MjcgMzkzLjM5Njk3LDQ2MC4wNzQyNSAzOTMuMzA5OTUsNDU5LjAwNzg1IEMgMzkwLjA1NzgyLDQ0MS42NDUxNCAzODYuNzcyNTYsNDI0LjI4ODY1IDM4My4zOTc0Miw0MDYuOTQ5MzggQyAzODIuMDI2LDM5OS43NzQyMiAzODAuNjI2NDMsMzkyLjYwMzQ0IDM3OS4wNjg2NiwzODUuNDY2MjUgQyAzNzguMzMzMDIsMzgyLjEyOTI0IDM3Ny41NTc2NCwzNzguNzg4NTQgMzc2LjQ1NTYsMzc1LjU1MjMzIEMgMzc2LjA4MTg5LDM3NC42OTM3MyAzNzUuOTI4NDYsMzczLjQ4NzM5IDM3NC44NjE1MiwzNzMuMjEzMzYgQyAzNzMuOTA5NDUsMzcyLjc3MzU5IDM3Mi44NzExMywzNzMuMzUwNTQgMzcyLjM2MTIzLDM3NC4xNzkwOSBDIDM3MS40MTQ4MSwzNzUuNTU2OTEgMzcwLjYxNTcxLDM3Ny4wNTc5OCAzNzAuMTYyNjMsMzc4LjY3Mzk4IEMgMzY5LjE1OTQ2LDM4MS43MDAxOSAzNjguODUwOTcsMzg0LjkwNDkyIDM2OC43MzQ0NSwzODguMDc0ODEgQyAzNjguNjY4NzYsMzkyLjc3NDE3IDM2OS40MDg4OCwzOTcuNDMzNjkgMzcwLjEyMTYyLDQwMi4wNjQ3OSBDIDM3MS45NDUxOCw0MTMuMzMzOTMgMzc0LjMyNDE3LDQyNC41MDM3MyAzNzYuMTc0ODYsNDM1Ljc2ODEzIEMgMzc2Ljg2MDU1LDQzOS41NzEwNyAzNzcuNTAyOTcsNDQzLjM4MzMgMzc3LjkxOTczLDQ0Ny4yMjY2OSBDIDM3OC40NTgxOCw0NTIuMTg3MDggMzc4LjU3ODQ3LDQ1Ny4xODI3OSAzNzguNjI1LDQ2Mi4xNjg3MyBDIDM3OC42NDg5Myw0NzAuNzM3MDkgMzc4LjA1MDM4LDQ3OS4zMDA4NSAzNzguMjY0MzksNDg3Ljg2OTc0IEMgMzc4LjUwNjk5LDQ5MS4wNjUxNSAzNzguOTQzNjksNDk0LjM5NDI5IDM4MC42MzY3Niw0OTcuMTgxNTUgQyAzODEuNzE4MTgsNDk4LjkxNjEgMzgzLjU3NDcsNTAwLjI1Nzg2IDM4NS42NzExNyw1MDAuMjk5NjUgQyAzODcuNzk1ODQsNTAwLjM0ODAzIDM4OS44OTcwNCw0OTkuNTU5NzUgMzkxLjYzMzU0LDQ5OC4zNzA4MyBDIDM5Mi45ODAxMSw0OTcuMzQ0MjggMzk0LjEwMDQ0LDQ5Ni4wMjM2NyAzOTQuOTk4ODksNDk0LjU5MTcyIEMgMzk2LjQ5ODMxLDQ5Mi4wNTI0NiAzOTguMDYzMDcsNDg5LjUzOTEzIDM5OS4yMzAyOCw0ODYuODI3OTcgQyA0MDAuNjEzNTMsNDgzLjcyODgzIDQwMS45NjQ3Miw0ODAuNjE0IDQwMy4xNzAyNiw0NzcuNDM5ODkgQyA0MDQuNzkzMzgsNDczLjIxNjQ1IDQwNi40MjU2Nyw0NjguOTkwMTIgNDA4LjQ0MDc0LDQ2NC45MzQyIEMgNDExLjc3NzkxLDQ1Ny44NTI1MSA0MTUuMzQyNjYsNDUwLjg4MDExIDQxOS4wMDgyLDQ0My45NjM2MiBDIDQyMS4wNTA2MSw0NDAuMTMwNDIgNDIzLjIwOTIxLDQzNi4zNTYzMSA0MjUuNTU4NjUsNDMyLjcwMjkzIEMgNDI4LjQwMjU0LDQyOC41MTM0NyA0MzEuNDE2NjEsNDI0LjQ0MzE4IDQzNC40MjkxMiw0MjAuMzc0NjUgQyA0NDAuMjg2NSw0MTIuNTc0NTYgNDQ2LjMzMzY3LDQwNC45MTk2NCA0NTIuMjM2OTEsMzk3LjE1NDQ3IEMgNDU2Ljk3ODc5LDM5MC45ODYxNSA0NjEuNzUyMzUsMzg0Ljg0MDcxIDQ2Ni4zOTMxNywzNzguNTk1ODcgQyA0NjkuMzUzNzMsMzc0LjU5MTY2IDQ3Mi4yMjE2MywzNzAuNTE2MzIgNDc0Ljk0MjkzLDM2Ni4zNDU2OCBDIDQ3Ny44NDQwNiwzNjEuNzY4NDcgNDgwLjUyNzU3LDM1Ny4wMzUwNSA0ODIuNjc0MjksMzUyLjA1NDA1IEMgNDg0LjA3OTkzLDM0OC42NzM3OSA0ODUuMjcwMzYsMzQ1LjEzOSA0ODUuNDQyNzMsMzQxLjQ1Mjc5IEMgNDg1LjQ1OTkxLDM0MC41MzQxOSA0ODUuNTU4MjMsMzM5LjU4MjY5IDQ4NS4zMTI1LDMzOC42ODc1IEMgNDg1LjExNzgzLDMzOC4yMzM1OSA0ODQuNzAyNDYsMzM3Ljc4MTA5IDQ4NC4xNTYyNSwzMzcuOTM3NSB6IgotICAgICAgIGlkPSJ0ZXh0MjQ3NSIKLSAgICAgICBzdHlsZT0iZm9udC1zaXplOjQ5LjMyMTY5MzQycHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiM5OWNjMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO2ZvbnQtZmFtaWx5OlNhbnNhdGlvbjstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlNhbnNhdGlvbiIgLz4KLSAgICA8cGF0aAotICAgICAgIGQ9Ik0gMTQyLjU1NDY5LDM5My41NjYzOCBDIDE2NS4xNDgzOCwzOTMuNTY2NDYgMTc0LjI2NTU2LDQwNy4xMTMzMiAxNjkuOTA2MjUsNDM0LjIwNzAxIEwgMTIwLjE5NTMxLDQzNC4yMDcwMSBDIDEyMC4xOTUzLDQ0OS4zMDA3NyAxMjkuNzEwOTEsNDU2Ljg0NzY0IDE0OC43NDIxOSw0NTYuODQ3NjMgQyAxNTUuMjU3NzYsNDU2Ljg0NzY0IDE2MS43NzMzOCw0NTYuMTQ0NTIgMTY4LjI4OTA2LDQ1NC43MzgyNiBMIDE2OC4yODkwNiw0NjUuMjg1MTMgQyAxNjEuNzczMzgsNDY2LjY5MTM4IDE1My44NTE1Miw0NjcuMzk0NTEgMTQ0LjUyMzQ0LDQ2Ny4zOTQ1MSBDIDExOS42MzI4LDQ2Ny4zOTQ1MSAxMDcuMTg3NSw0NTQuODA4NTggMTA3LjE4NzUsNDI5LjYzNjY5IEMgMTA3LjE4NzUsNDA1LjU4OTg4IDExOC45NzY1NSwzOTMuNTY2NDYgMTQyLjU1NDY5LDM5My41NjYzOCBNIDEyMC4xOTUzMSw0MjMuMzc4ODggTCAxNTguMDIzNDQsNDIzLjM3ODg4IEMgMTU4LjY3OTY0LDQxMC40NDE0NCAxNTIuODIwMjcsNDAzLjk3MjY5IDE0MC40NDUzMSw0MDMuOTcyNjMgQyAxMjcuNzg5MDQsNDAzLjk3MjY5IDEyMS4wMzkwNSw0MTAuNDQxNDQgMTIwLjE5NTMxLDQyMy4zNzg4OCIKLSAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg4MS4wNDI1LDE5LjI5MTY3NikiCi0gICAgICAgaWQ9ImZsb3dSb290NDc4MyIKLSAgICAgICBzdHlsZT0iZm9udC1zaXplOjQwcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO2ZvbnQtZmFtaWx5OlNhbnNhdGlvbjstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlNhbnNhdGlvbiIgLz4KLSAgICA8cGF0aAotICAgICAgIGQ9Ik0gMTA3LjE4NzUsNDQ0LjQwMjMyIEMgMTA3LjE4NzUsNDI5LjI2MTczIDExNy4xNzE4Nyw0MjEuNjkxNDMgMTM3LjE0MDYyLDQyMS42OTEzOCBDIDE0NC40OTk5Niw0MjEuNjkxNDMgMTUwLjkyMTgzLDQyMi4xNjAxOCAxNTYuNDA2MjUsNDIzLjA5NzYzIEwgMTU2LjQwNjI1LDQxNi4xMzY2OSBDIDE1Ni40MDYyLDQwOC4xMjExMyAxNDkuNzczMzksNDA0LjExMzMyIDEzNi41MDc4MSw0MDQuMTEzMjYgQyAxMjguOTE0MDQsNDA0LjExMzMyIDEyMS4xMzI4LDQwNS4yODUxOSAxMTMuMTY0MDYsNDA3LjYyODg4IEwgMTEzLjE2NDA2LDM5Ny4wODIwMSBDIDEyMS4xMzI4LDM5NC43MzgzMyAxMjguOTE0MDQsMzkzLjU2NjQ2IDEzNi41MDc4MSwzOTMuNTY2MzggQyAxNTguNDQ1MjYsMzkzLjU2NjQ2IDE2OS40MTQsNDAxLjQ0MTQ1IDE2OS40MTQwNiw0MTcuMTkxMzggTCAxNjkuNDE0MDYsNDY3LjM5NDUxIEwgMTYyLjgwNDY5LDQ2Ny4zOTQ1MSBMIDE1Ny42MDE1Niw0NjIuMTkxMzggQyAxNTEuMTc5NjQsNDY1LjY2MDEzIDE0My42MzI3OCw0NjcuMzk0NTEgMTM0Ljk2MDk0LDQ2Ny4zOTQ1MSBDIDExNi40NDUzLDQ2Ny4zOTQ1MSAxMDcuMTg3NSw0NTkuNzMwNDUgMTA3LjE4NzUsNDQ0LjQwMjMyIE0gMTU2LjQwNjI1LDQzMy42NDQ1MSBDIDE1MS4yNDk5Niw0MzIuNzA3MDQgMTQ0LjgyODA5LDQzMi4yMzgyOSAxMzcuMTQwNjIsNDMyLjIzODI2IEMgMTI1Ljg0MzczLDQzMi4yMzgyOSAxMjAuMTk1Myw0MzYuMjIyNjYgMTIwLjE5NTMxLDQ0NC4xOTEzOCBDIDEyMC4xOTUzLDQ1Mi42Mjg5IDEyNS4xMTcxNyw0NTYuODQ3NjQgMTM0Ljk2MDk0LDQ1Ni44NDc2MyBDIDE0My45NjA5LDQ1Ni44NDc2NCAxNTEuMTA5MzMsNDU0LjkyNTc3IDE1Ni40MDYyNSw0NTEuMDgyMDEgTCAxNTYuNDA2MjUsNDMzLjY0NDUxIgotICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDAwMDAyLDAsMCwxLDMyOS43MzgyOSwxOS4yOTE2NzYpIgotICAgICAgIGlkPSJmbG93Um9vdDQ4MDciCi0gICAgICAgc3R5bGU9ImZvbnQtc2l6ZTo0MHB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojNjY2NjY2O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtmb250LWZhbWlseTpTYW5zYXRpb247LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpTYW5zYXRpb24iIC8+Ci0gICAgPHBhdGgKLSAgICAgICBkPSJNIDEwNy4xODc1LDM2Ni44NDc2MyBMIDEwNy4xODc1LDQ2Ny4zOTQ1MSBMIDEyMC4xOTUzMSw0NjcuMzk0NTEgTCAxMjAuMTk1MzEsMzY2Ljg0NzYzIEwgMTA3LjE4NzUsMzY2Ljg0NzYzIgotICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDAwMDAyLDAsMCwxLDQwMy43OTkyOSwxOS4yOTE2NzYpIgotICAgICAgIGlkPSJmbG93Um9vdDQ4MTkiCi0gICAgICAgc3R5bGU9ImZvbnQtc2l6ZTo0MHB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojNjY2NjY2O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtmb250LWZhbWlseTpTYW5zYXRpb247LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpTYW5zYXRpb24iIC8+Ci0gIDwvZz4KLSAgPGcKLSAgICAgaWQ9ImxheWVyMyI+Ci0gICAgPHJlY3QKLSAgICAgICB3aWR0aD0iMTEuODkxNTk3IgotICAgICAgIGhlaWdodD0iMTIuODA2MzM1IgotICAgICAgIHg9IjMzMy41NzQ1NSIKLSAgICAgICB5PSI0MDAuODczODQiCi0gICAgICAgaWQ9InJlY3Q0Njk1IgotICAgICAgIHN0eWxlPSJmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KLSAgICA8cmVjdAotICAgICAgIHdpZHRoPSIxNS4wNzE0NzMiCi0gICAgICAgaGVpZ2h0PSIyMC4xMjQxNTciCi0gICAgICAgcnk9IjAuMzE0NDQxMzIiCi0gICAgICAgeD0iMjgxLjg5MTgyIgotICAgICAgIHk9IjQzOS43OTI0OCIKLSAgICAgICBpZD0icmVjdDQ2OTciCi0gICAgICAgc3R5bGU9ImZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utb3BhY2l0eToxIiAvPgotICAgIDxyZWN0Ci0gICAgICAgd2lkdGg9IjExLjg5MTU5NyIKLSAgICAgICBoZWlnaHQ9IjEwLjUzMDY0NSIKLSAgICAgICB4PSIzMjcuNjk2OTkiCi0gICAgICAgeT0iNDEyLjg3MTU1IgotICAgICAgIGlkPSJyZWN0NDg5MSIKLSAgICAgICBzdHlsZT0iZmlsbDojNjY2NjY2O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+Ci0gIDwvZz4KLTwvc3ZnPgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvcGFyZW50L0xJQ0VOU0UudHh0IGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvcGFyZW50L0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3BhcmVudC9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvcGFyZW50L05PVElDRS50eHQgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9wYXJlbnQvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5YmRiMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9wYXJlbnQvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IKLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9wYXJlbnQvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3BhcmVudC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTQyOGM3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3BhcmVudC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0KLSAgLSBQYXJlbnQgcG9tIG9mIGFsbCB0aGUgbXlmYWNlcyBleHRlbnNpb25zIHZhbGlkYXRvciBzdWJwcm9qZWN0cyAKLSAgICB0aGF0IGhlbHAgdG8gYnVpbGQgb3RoZXIgbXlmYWNlcyBwcm9qZWN0cy4KLSAgLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+NjwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBQcm9qZWN0IFBhcmVudDwvbmFtZT4KLSAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMjwvdXJsPgotCi0gICAgPGlzc3VlTWFuYWdlbWVudD4KLSAgICAgICAgPHN5c3RlbT5qaXJhPC9zeXN0ZW0+Ci0gICAgICAgIDx1cmw+aHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0VYVFZBTDwvdXJsPgotICAgIDwvaXNzdWVNYW5hZ2VtZW50PgotCi0gICAgPGNpTWFuYWdlbWVudD4KLSAgICAgICAgPHN5c3RlbT5jb250aW51dW08L3N5c3RlbT4KLSAgICAgICAgPHVybD5odHRwOi8vbXlmYWNlcy56b25lcy5hcGFjaGUub3JnOjgwODAvY29udGludXVtPC91cmw+Ci0gICAgICAgIDxub3RpZmllcnM+Ci0gICAgICAgICAgICA8bm90aWZpZXI+Ci0gICAgICAgICAgICAgICAgPHR5cGU+bWFpbDwvdHlwZT4KLSAgICAgICAgICAgICAgICA8c2VuZE9uU3VjY2Vzcz50cnVlPC9zZW5kT25TdWNjZXNzPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8YWRkcmVzcz5jb21taXRzQG15ZmFjZXMuYXBhY2hlLm9yZzwvYWRkcmVzcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L25vdGlmaWVyPgotICAgICAgICA8L25vdGlmaWVycz4KLSAgICA8L2NpTWFuYWdlbWVudD4KLSAgICAKLSAgICA8aW5jZXB0aW9uWWVhcj4yMDA4PC9pbmNlcHRpb25ZZWFyPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfTwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0KLSAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+Ci0gICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFyY2hpdmU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmU+Ci0gICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgotCi0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgICAgICAgIC0gQ29weSBMSUNFTlNFLnR4dCBhbmQgTk9USUNFLnR4dCBzbyB0aGF0IHRoZXkgYXJlIGluY2x1ZGVkCi0gICAgICAgICAgICAgICAgICAgIC0gaW4gdGhlIC1qYXZhZG9jIGphciBmaWxlIGZvciB0aGUgY29tcG9uZW50LgotICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmphdmFkb2MucmVzb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1zb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vYXBpZG9jcy9NRVRBLUlORiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IkxJQ0VOU0UudHh0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik5PVElDRS50eHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5qYXZhZG9jLnNpdGUuY29weTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+c2l0ZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDb3B5IGphdmFkb2MgdG8gYW5vdGhlciBkaXJlY3RvcnksIHRvIGtlZXAgamF2YWRvYyBvZiBwcmV2aW91cyB2ZXJzaW9ucyBvbiBzaXRlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc2l0ZS9hcGlkb2NzLSR7cHJvamVjdC52ZXJzaW9ufSIgZmFpbG9uZXJyb3I9ImZhbHNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3NpdGUvYXBpZG9jcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgICAgLSBNYWtlIGEgY2hlY2tzdHlsZSB2aW9sYXRpb24gYSBjb21waWxlIGVycm9yLiBOb3RlIHRoYXQgaWYgYSBjb21waWxlIGVycm9yIG9jY3VycywKLSAgICAgICAgICAgICAgICAtIGZ1cnRoZXIgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRhcmdldC9zaXRlL2NoZWNrc3R5bGUuaHRtbCAocHJlc2VudCBldmVuIHdoZW4KLSAgICAgICAgICAgICAgICAtIGp1c3QgdGhlIGNvbXBpbGUgZ29hbCBhbmQgbm90IHRoZSBzaXRlIGdvYWwgaGFzIGJlZW4gcnVuKS4gTm90ZSBhbHNvIHRoYXQgY2hpbGQKLSAgICAgICAgICAgICAgICAtIHByb2plY3RzIG1heSByZWRlY2xhcmUgdGhpcyBwbHVnaW4gYW5kIHByb3ZpZGUgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MKLSAgICAgICAgICAgICAgICAtIHRvIHVzZSBkaWZmZXJlbnQgY2hlY2tzIChtb3JlIG9yIGxlc3Mgc3RyaWN0IHRoYW4gdGhlIGRlZmF1bHQpLgotICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD52ZXJpZnktc3R5bGU8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWdMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0YW5kYXJkLnhtbDwvY29uZmlnTG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxoZWFkZXJMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtaGVhZGVyLnR4dDwvaGVhZGVyTG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tIFNldCBjb21waWxlIHNvdXJjZSBhdCAxLjUsIHNpbmNlIHRoZSB0YXJnZXQgSlNGIGltcGwgaXMgMS4yIC0tPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvcHRpbWl6ZT5mYWxzZTwvb3B0aW1pemU+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+ICAgICAgICAgICAgCi0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi0gICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+bWF2ZW4yLXJlcG9zaXRvcnkuZGV2LmphdmEubmV0PC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkphdmEubmV0IFJlcG9zaXRvcnkgZm9yIE1hdmVuPC9uYW1lPgotICAgICAgICAgICAgPHVybD5odHRwOi8vZG93bmxvYWQuamF2YS5uZXQvbWF2ZW4vMi88L3VybD4KLSAgICAgICAgICAgIDxsYXlvdXQ+ZGVmYXVsdDwvbGF5b3V0PgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgPC9yZXBvc2l0b3JpZXM+Ci0KLSAgICA8cmVwb3J0aW5nPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWp4ci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXJlcG9ydC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40LjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBtZC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cnVsZXNldHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvYmFzaWMueG1sPC9ydWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL3VudXNlZGNvZGUueG1sPC9ydWxlc2V0PgotICAgICAgICAgICAgICAgICAgICA8L3J1bGVzZXRzPgotICAgICAgICAgICAgICAgICAgICA8bGlua1hyZWY+dHJ1ZTwvbGlua1hyZWY+Ci0gICAgICAgICAgICAgICAgICAgIDxtaW5pbXVtVG9rZW5zPjEwMDwvbWluaW11bVRva2Vucz4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldEpkaz4xLjU8L3RhcmdldEpkaz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1jaGVja3Mtc3RhbmRhcmQueG1sPC9jb25maWdMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGhlYWRlckxvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1oZWFkZXIudHh0PC9oZWFkZXJMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvcmVwb3J0aW5nPgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvcGFyZW50PC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvcGFyZW50PC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9wYXJlbnQ8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgICAgICA8c25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICAgICAgPHVuaXF1ZVZlcnNpb24+ZmFsc2U8L3VuaXF1ZVZlcnNpb24+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLnNuYXBzaG90czwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgTWF2ZW4gU25hcHNob3QgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgPHNpdGU+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTI8L3VybD4KLSAgICAgICAgPC9zaXRlPgotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtYXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wZXJmb3JtUmVsZWFzZTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvY3M8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxqc2YudmVyc2lvbj4xLjIuNDwvanNmLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI4NzkzMC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIC0tLS0tLQ0KLU92ZXJ2aWV3DQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4yDQotDQotICBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBwcm92aWRlcyB2ZXJzaW9ucyBmb3IgSlNGIDEuMSBhbmQgMS4yDQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvcGFyZW50L3NyYy9zaXRlL2FwdC9qYXZhZG9jLmFwdCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3BhcmVudC9zcmMvc2l0ZS9hcHQvamF2YWRvYy5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZmQzNmYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvcGFyZW50L3NyYy9zaXRlL2FwdC9qYXZhZG9jLmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSAtLS0tLS0NCi1KYXZhZG9jDQotIC0tLS0tLQ0KLQ0KLUphdmFkb2MNCi0NCi0gICAgSGVyZSB5b3UgY2FuIGZpbmQgdGhlIGphdmFkb2Mgb2YgcHJldmlvdXMgZXh0dmFsIHZlcnNpb25zLg0KLQ0KLSAgICAqIHt7e2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9teWZhY2VzLWV4dHZhbC1jb3JlL2FwaWRvY3MtMS4yLjEvaW5kZXguaHRtbH1NeWZhY2VzIEV4dFZhbCBDb3JlIFZlcnNpb24gMS4yLjF9fQ0KLQ0KLSAgICAqIHt7e2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi92YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uL2FwaWRvY3MtMS4yLjEvaW5kZXguaHRtbH1NeWZhY2VzIEV4dFZhbCBQcm9wZXJ0eSBWYWxpZGF0aW9uIFZlcnNpb24gMS4yLjF9fQ0KLQ0KLSAgICAqIHt7e2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9teWZhY2VzLWV4dHZhbC1jb3JlL2FwaWRvY3MtMS4yLjIvaW5kZXguaHRtbH1NeWZhY2VzIEV4dFZhbCBDb3JlIFZlcnNpb24gMS4yLjJ9fQ0KLQ0KLSAgICAqIHt7e2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi92YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uL2FwaWRvY3MtMS4yLjIvaW5kZXguaHRtbH1NeWZhY2VzIEV4dFZhbCBQcm9wZXJ0eSBWYWxpZGF0aW9uIFZlcnNpb24gMS4yLjJ9fQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3BhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3BhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc4NjQ5Zi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9wYXJlbnQvc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgbmFtZT0iQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IiPgotICA8YmFubmVyTGVmdD4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRWYWw8L25hbWU+Ci0gICAgPHNyYz5pbWFnZXMvZXh0dmFsX2xvZ28ucG5nPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sPC9ocmVmPgotICA8L2Jhbm5lckxlZnQ+Ci0KLSAgPGJhbm5lclJpZ2h0PgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzPC9uYW1lPgotICAgIDxzcmM+aW1nL2Jhbm5lcnMvTXlGYWNlc19sb2dvLmpwZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbDwvaHJlZj4KLSAgPC9iYW5uZXJSaWdodD4KLQotICA8cHVibGlzaERhdGUgZm9ybWF0PSJkZCBNTU0geXl5eSIvPgotCi0gIDxza2luPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5tYXZlbjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLXNpdGUtc2tpbjwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3NraW4+Ci0KLSAgPGJvZHk+Ci0gICAgPGxpbmtzPgotICAgICAgPGl0ZW0gbmFtZT0iQXBhY2hlIiBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmciLz4KLSAgICAgIDxpdGVtIG5hbWU9Ik15RmFjZXMiIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQgTXlmYWNlcyBFeHRWYWwiIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZG93bmxvYWQuaHRtbCIvPgotICAgIDwvbGlua3M+Ci0KLSAgICA8bWVudSBuYW1lPSJBcGFjaGUgTXlGYWNlcyIgaW5oZXJpdD0idG9wIj4KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkRvd25sb2FkIiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2Rvd25sb2FkLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0KLSAgICA8bWVudSBuYW1lPSJDb250ZW50cyIgaW5oZXJpdD0idG9wIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iTWFpbiBTaXRlIiAgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW5kZXguaHRtbCIvPgotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjEiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS9pbmRleC5odG1sIiBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8aXRlbSBuYW1lPSJkdW1teSIgICAgICAgIGhyZWY9ImR1bW15Ii8+Ci0gICAgICAgIDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iRXh0VmFsIGZvciBKU0YgMS4yIiAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iQ29yZSBNb2R1bGUiICAgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvbXlmYWNlcy1leHR2YWwtY29yZS9pbmRleC5odG1sIi8+Ci0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IlByb3BlcnR5IFZhbGlkYXRpb24iICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL3ZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb24vaW5kZXguaHRtbCIvPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJUcmluaWRhZCBTdXBwb3J0IiAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydC9pbmRleC5odG1sIi8+Ci0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IkdlbmVyaWMgU3VwcG9ydCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2NvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQvaW5kZXguaHRtbCIvPgotICAgICAgICA8L2l0ZW0+Ci0gICAgPC9tZW51PgotCQotICAgIDxtZW51IG5hbWU9IkRvY3VtZW50YXRpb24iPgotICAgICAgPGl0ZW0gbmFtZT0iV2lraSIgICAgICAgICBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL215ZmFjZXMvRXh0ZW5zaW9ucy9WYWxpZGF0b3IvIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJKYXZhZG9jIiAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9qYXZhZG9jLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0KLSAgICA8bWVudSByZWY9InJlcG9ydHMiLz4KLQotICAgIDxtZW51IG5hbWU9IkZvdW5kYXRpb24iIGluaGVyaXQ9ImJvdHRvbSI+Ci0gICAgICA8aXRlbSBuYW1lPSJBU0YiICAgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlNwb25zb3JzaGlwIiAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9zcG9uc29yc2hpcC5odG1sIiAvPgotICAgICAgPGl0ZW0gbmFtZT0iVGhhbmtzIiAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3RoYW5rcy5odG1sIiAvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMjBlYzIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+NjwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtbW9kdWxlPC9hcnRpZmFjdElkPg0KLSAgICA8dmVyc2lvbj4yLjAuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgTW9kdWxlPC9uYW1lPg0KLSAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMjwvdXJsPg0KLQ0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvPC9jb25uZWN0aW9uPg0KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rLzwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4NCi0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rLzwvdXJsPg0KLSAgICA8L3NjbT4NCi0NCi0gICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+DQotICAgICAgICA8c25hcHNob3RSZXBvc2l0b3J5Pg0KLSAgICAgICAgICAgIDx1bmlxdWVWZXJzaW9uPmZhbHNlPC91bmlxdWVWZXJzaW9uPg0KLSAgICAgICAgICAgIDxpZD5hcGFjaGUuc25hcHNob3RzPC9pZD4NCi0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgTWF2ZW4gU25hcHNob3QgUmVwb3NpdG9yeTwvbmFtZT4NCi0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4NCi0gICAgICAgIDwvc25hcHNob3RSZXBvc2l0b3J5Pg0KLSAgICAgICAgPHNpdGU+DQotICAgICAgICAgICAgPGlkPmFwYWNoZS1zaXRlPC9pZD4NCi0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMjwvdXJsPg0KLSAgICAgICAgPC9zaXRlPg0KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+DQotDQotICAgIDwhLS0gV0FSTklORzogRE8gTk9UIEdFTkVSQVRFIFNJVEUgRlJPTSBIRVJFIERJUkVDVExZDQotICAgIFNpbmNlIHRoaXMgcHJvamVjdCBoYXMgYW4gYXN5bmMgcmVsZWFzZSBwcm9jZWR1cmUgKG5vdA0KLSAgICBhbGwgbW9kdWxlcyBzaG91bGQgYmUgcmVsZWFzZWQgYXQgb25jZSksIHRoZSBwYXJlbnQgcG9tLnhtbCANCi0gICAgaXMgbm90IHRoaXMgKHRoZXJlIGlzIGEgbW9kdWxlIGZvciB0aGF0KS4gVXNlIG1hdmVuIHNpdGUgDQotICAgIHBsdWdpbiBoZXJlIGNhdXNlIHByb2JsZW1zIHdoZW4gdGhlIHNpdGUgaXMgZ2VuZXJhdGVkLg0KLSAgICBUaGUgcHJvY2VkdXJlIG11c3QgZXhlY3V0ZSBzaXRlIGNvbW1tYW5kIGZpcnN0IG9uIHBhcmVudCANCi0gICAgbW9kdWxlIGFuZCB0aGVuIG9uIGVhY2ggbW9kdWxlIGxpc3RlZCBiZWxvdy4gDQotICAgICAtLT4NCi0NCi0gICAgPG1vZHVsZXM+DQotICAgICAgICA8bW9kdWxlPnBhcmVudDwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5jb3JlPC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPnZhbGlkYXRpb24tbW9kdWxlczwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5jb21wb25lbnQtc3VwcG9ydDwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5leGFtcGxlczwvbW9kdWxlPg0KLSAgICA8L21vZHVsZXM+DQotDQotICAgIDxwcm9maWxlcz4NCi0gICAgICAgIDwhLS0gVGhpcyBwcm9maWxlIGlzIGludm9rZWQgYnkgLURwcmVwYXJlUmVsZWFzZT10cnVlLiAgVGhpcyBhbGxvd3MgbXZuIHJlbGVhc2U6cHJlcGFyZSB0bw0KLSAgICAgICAgICAgIHJ1biBzdWNjZXNzZnVsbHkgb24gdGhlIGFzc2VtYmx5IHByb2plY3RzLiAtLT4NCi0gICAgICAgIDxwcm9maWxlPg0KLSAgICAgICAgICAgIDxpZD5wcmVwYXJlLXJlbGVhc2U8L2lkPg0KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPg0KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+DQotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wcmVwYXJlUmVsZWFzZTwvbmFtZT4NCi0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8L2FjdGl2YXRpb24+DQotICAgICAgICAgICAgPG1vZHVsZXM+DQotICAgICAgICAgICAgICAgIDxtb2R1bGU+YXNzZW1ibHk8L21vZHVsZT4NCi0gICAgICAgICAgICA8L21vZHVsZXM+DQotICAgICAgICAgICAgPGJ1aWxkPg0KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVsZWFzZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+LURwcmVwYXJlUmVsZWFzZTwvYXJndW1lbnRzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+DQotICAgICAgICAgICAgPC9idWlsZD4NCi0gICAgICAgIDwvcHJvZmlsZT4NCi0gICAgPC9wcm9maWxlcz4NCi0gICAgDQotICAgIDxwcm9wZXJ0aWVzPg0KLSAgICAgICAgPGpzZi52ZXJzaW9uPjEuMi40PC9qc2YudmVyc2lvbj4NCi0gICAgPC9wcm9wZXJ0aWVzPg0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9zaXRlL3BvbS54bWwgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9zaXRlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMGFlM2EuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvc2l0ZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICAgICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gICAgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gICAgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAgICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgICAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgKgotICAgICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgICAqCi0gICAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXNpdGU8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvcjwvbmFtZT4KLSAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3I8L3VybD4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPGRlZmF1bHRHb2FsPnNpdGU8L2RlZmF1bHRHb2FsPgotICAgICAgICA8ZXh0ZW5zaW9ucz4KLSAgICAgICAgICA8ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi53YWdvbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPndhZ29uLXNzaC1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC1hbHBoYS01PC92ZXJzaW9uPgotICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICA8L2V4dGVuc2lvbnM+Ci0gICAgPC9idWlsZD4KLSAgICA8cmVwb3J0aW5nPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L3JlcG9ydGluZz4KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay9zaXRlPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvc2l0ZTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay9zaXRlPC91cmw+Ci0gICAgPC9zY20+Ci0gICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgICA8c2l0ZT4KLSAgICAgICAgPGlkPmFwYWNoZS1zaXRlPC9pZD4KLSAgICAgICAgPG5hbWU+QXBhY2hlIFdlYnNpdGU8L25hbWU+Ci0gICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjwvdXJsPgotICAgICAgPC9zaXRlPgotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvc2l0ZS9zcmMvc2l0ZS9hcHQvZG93bmxvYWQuYXB0IGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvc2l0ZS9zcmMvc2l0ZS9hcHQvZG93bmxvYWQuYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzUxNGUwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3NpdGUvc3JjL3NpdGUvYXB0L2Rvd25sb2FkLmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0gfn4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotIH5+IGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSB+fiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotIH5+IFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotIH5+ICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotIH5+IHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIH5+DQotIH5+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIH5+DQotIH5+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gfn4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gfn4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotIH5+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gfn4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotIA0KLSAtLS0tLS0NCi1Eb3dubG9hZCBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLSAtLS0tLS0NCi0NCi1Eb3dubG9hZCBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLQ0KLQ0KLSAgVXNlIHRoZSBsaW5rcyBiZWxvdyB0byBkb3dubG9hZCBhIGRpc3RyaWJ1dGlvbiBvZiBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmcm9tDQotICBvbmUgb2Ygb3VyIG1pcnJvcnMuIEl0IGlzIGdvb2QgcHJhY3RpY2UgdG8gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlDQotICBkaXN0cmlidXRpb24gZmlsZXMuDQotDQotICBZb3Ugd2lsbCBiZSBwcm9tcHRlZCBmb3IgYSBtaXJyb3IgLSBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQgb24geW91cnMsIHBsZWFzZSBiZSBwYXRpZW50LCBhcyBpdCBtYXkgdGFrZSAyNA0KLSAgaG91cnMgdG8gcmVhY2ggYWxsIG1pcnJvcnMuDQotDQotICBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBkaXN0cmlidXRlZCBhcyBhIDw8PHppcD4+PiBhcmNoaXZlIChmb3IgV2luZG93cykgYW5kDQotICBhcyBhIDw8PHRhci5nej4+PiBhcmNoaXZlIChmb3IgVU5JWCkuIFRoZSBjb250ZW50IGlzIHRoZSBzYW1lLiBQbGVhc2Ugbm90ZQ0KLSAgdGhhdCB0aGUgPDw8dGFyLmd6Pj4+IGFyY2hpdmVzIGNvbnRhaW4gZmlsZSBuYW1lcyBsb25nZXIgdGhhbiAxMDAgY2hhcmFjdGVycyBhbmQgaGF2ZSBiZWVuDQotICBjcmVhdGVkIHVzaW5nIEdOVSB0YXIgZXh0ZW5zaW9ucy4gVGh1cyB0aGV5IG11c3QgYmUgdW50YXJyZWQgd2l0aCBhIEdOVSBjb21wYXRpYmxlDQotICB2ZXJzaW9uIG9mIHRhci4NCi0NCi0gIDw8IEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIDEuMC4wIERpc3RyaWJ1dGlvbiA+Pg0KLQ0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgICAgICAgICAgICAgICAgICAgICAgICAgfCBNaXJyb3JzIHwgQ2hlY2tzdW0gfCBTaWduYXR1cmUgfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMSAxLjEuMiAodGFyLmd6KSAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi50YXIuZ3p9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nen19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi50YXIuZ3oubWQ1fSBteWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi50YXIuZ3oubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nei5hc2N9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nei5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4xIDEuMS4yICh6aXApICAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi56aXB9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnppcH19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi56aXAubWQ1fSBteWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi56aXAubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnppcC5hc2N9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnppcC5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4xIDEuMS4yIFNvdXJjZSAodGFyLmd6KSAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMudGFyLmd6fSBteWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy50YXIuZ3p9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnRhci5nei5tZDV9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnRhci5nei5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnRhci5nei5hc2N9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnRhci5nei5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4xIDEuMS4yIFNvdXJjZSAoemlwKSAgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnppcH0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMuemlwfX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy56aXAubWQ1fSBteWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy56aXAubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy56aXAuYXNjfSBteWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy56aXAuYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMiAxLjIuMiAodGFyLmd6KSAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDEyLTEuMi4yLWJpbi50YXIuZ3p9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnRhci5nen19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDEyLTEuMi4yLWJpbi50YXIuZ3oubWQ1fSBteWZhY2VzLWV4dHZhbDEyLTEuMi4yLWJpbi50YXIuZ3oubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnRhci5nei5hc2N9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnRhci5nei5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4yIDEuMi4yICh6aXApICAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDEyLTEuMi4yLWJpbi56aXB9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnppcH19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDEyLTEuMi4yLWJpbi56aXAubWQ1fSBteWZhY2VzLWV4dHZhbDEyLTEuMi4yLWJpbi56aXAubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnppcC5hc2N9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnppcC5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4yIDEuMi4yIFNvdXJjZSAodGFyLmd6KSAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMudGFyLmd6fSBteWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy50YXIuZ3p9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnRhci5nei5tZDV9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnRhci5nei5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnRhci5nei5hc2N9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnRhci5nei5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4yIDEuMi4yIFNvdXJjZSAoemlwKSAgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnppcH0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMuemlwfX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy56aXAubWQ1fSBteWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy56aXAubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy56aXAuYXNjfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy56aXAuYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLQ0KLUxhdGVzdCBzb3VyY2UgY29kZSBmcm9tIFNWTiByZXBvc2l0b3J5DQotDQotICAgIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgbGF0ZXN0IEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZlYXR1cmVzLCB0aGUgc291cmNlIGNvZGUgaXMgdW5kZXINCi0gICAgdmVyc2lvbiBjb250cm9sIHdpdGggU1ZOLiAgQ2xpY2sge3t7c291cmNlLXJlcG9zaXRvcnkuaHRtbH0gaGVyZSB9fQ0KLSAgICBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZSB0aGUgQVNGIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFNWTiBSZXBvc2l0b3J5Lg0KLQ0KLVZlcmlmeWluZyBjaGVja3N1bXMNCi0NCi0gICAgSXQgaXMgZXNzZW50aWFsIHRoYXQgeW91IHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIHRoZSBkb3dubG9hZGVkDQotICAgIGZpbGVzIHVzaW5nIHRoZSBQR1AgYW5kIE1ENSBzaWduYXR1cmVzLiBNRDUgdmVyaWZpY2F0aW9uIGVuc3VyZXMgdGhlDQotICAgIGZpbGUgd2FzIG5vdCBjb3JydXB0ZWQgZHVyaW5nIHRoZSBkb3dubG9hZCBwcm9jZXNzLiBQR1AgdmVyaWZpY2F0aW9uDQotICAgIGVuc3VyZXMgdGhhdCB0aGUgZmlsZSBjYW1lIGZyb20gYSBjZXJ0YWluIHBlcnNvbi4NCi0NCi0gICAgVG8gdmVyaWZ5IHRoZSBNRDUgc2lnbmF0dXJlIG9uIHRoZSBmaWxlcywgeW91IG5lZWQgdG8gdXNlIGEgcHJvZ3JhbQ0KLSAgICBjYWxsZWQgPDw8bWQ1Pj4+IG9yIDw8PG1kNXN1bT4+Piwgd2hpY2ggaXMNCi0gICAgaW5jbHVkZWQgaW4gbWFueSBVTklYIGRpc3RyaWJ1dGlvbnMuICBJdCBpcyBhbHNvIGF2YWlsYWJsZSBhcyBwYXJ0IG9mDQotICAgIHt7e2h0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS90ZXh0dXRpbHMvdGV4dHV0aWxzLmh0bWx9R05VIFRleHR1dGlsc319Lg0KLSAgICBXaW5kb3dzIHVzZXJzIGNhbiBnZXQgYmluYXJ5IG1kNSBwcm9ncmFtcyBmcm9tIHt7e2h0dHA6Ly93d3cuZm91cm1pbGFiLmNoL21kNS99aGVyZX19LA0KLSAgICB7e3todHRwOi8vd3d3LnBjLXRvb2xzLm5ldC93aW4zMi9mcmVld2FyZS9jb25zb2xlL31oZXJlfX0sIG9yDQotICAgIHt7e2h0dHA6Ly93d3cuc2xhdmFzb2Z0LmNvbS9mc3VtL31oZXJlfX0uDQotDQotVmVyaWZ5aW5nIHNpZ25hdHVyZXMNCi0NCi0gIAlQR1AgdmVyaWZpY2F0aW9uIGVuc3VyZXMgdGhhdCB0aGUgZmlsZSBjYW1lIGZyb20gYSBjZXJ0YWluIHBlcnNvbi4gIFdlIHN0cm9uZ2x5IHJlY29tbWVuZA0KLQkgIHlvdSB2ZXJpZnkgeW91ciBkb3dubG9hZHMgd2l0aCBib3RoIFBHUCBhbmQgTUQ1Lg0KLQ0KLQlUaGUgUEdQIHNpZ25hdHVyZXMgY2FuIGJlIHZlcmlmaWVkIHVzaW5nIHt7e2h0dHA6Ly93d3cucGdwaS5vcmcvfVBHUH19IG9yIA0KLQl7e3todHRwOi8vd3d3LmdudXBnLm9yZy99R1BHfX0uICBGaXJzdCBkb3dubG9hZCB0aGUgQXBhY2hlIE15RmFjZXMgDQotCXt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvS0VZU31LRVlTfX0JYXMgd2VsbCBhcyB0aGUgPDw8YXNjPj4+IHNpZ25hdHVyZSBmaWxlIA0KLQlmb3IgdGhlIHBhcnRpY3VsYXIgZGlzdHJpYnV0aW9uLiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB5b3UgZ2V0IHRoZXNlIGZpbGVzIGZyb20gdGhlIHVsdGltYXRlDQotCXRydXN0ZWQgc291cmNlIC0gdGhlIG1haW4gQVNGIGRpc3RyaWJ1dGlvbiBzaXRlLCByYXRoZXIgdGhhbiBmcm9tIGEgbWlycm9yLg0KLQlUaGVuIHZlcmlmeSB0aGUgc2lnbmF0dXJlcyB1c2luZyAuLi4NCi0NCi0JICA8PDwNCi0JICAlIHBncGsgLWEgS0VZUw0KLQkgICUgcGdwdiBteWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi50YXIuZ3ouYXNjIG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5neg0KLQkgID4+Pg0KLQ0KLQkgIDxvcj4NCi0NCi0JICA8PDwNCi0JICAlIHBncCAta2EgS0VZUw0KLQkgICUgcGdwIG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nei5hc2MgbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6DQotCSAgPj4+DQotDQotCSAgPG9yPg0KLQ0KLQkgIDw8PA0KLSAgCSUgZ3BnIC0taW1wb3J0IEtFWVMNCi0JICAlIGdwZyAtLXZlcmlmeSBteWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi50YXIuZ3ouYXNjIG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5neg0KLQkgID4+Pg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3NpdGUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3NpdGUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyNTM5Yi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi9zaXRlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBhIEpTRiBjZW50cmljIHZhbGlkYXRpb24gZnJhbWV3b3JrLg0KLSAgDQotICAgIEl0IG9mZmVycyBwb3dlcmZ1bCBhbmQgZWFzeSB0byB1c2UgZmllbGQgYmFzZWQgdmFsaWRhdGlvbiBiYXNlZCBvbiBhbm5vdGF0aW9ucy4NCi1JdCBoYXMgYSBwbHVnZ2FibGUgYXJjaGl0ZWN0dXJlLCBzbyBpdCBpcyBwb3NzaWJsZSB0byBhZGQgbmV3IHZhbGlkYXRpb24gbW9kdWxlcyBvciBzdXBwb3J0IGZvciBjb21wb25lbnQgbGlicmFyaWVzIGxpa2UgVHJpbmlkYWQgb3Igb3RoZXIgM3JkIHBhcnR5IGZyYW1ld29ya3MuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLjEueCBhbmQgSlNGIDEuMi54LiBCb3RoIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrDQotDQotICAgIEZ1cnRoZXIgaW5mb3JtYXRpb24gYXJlIGF2YWlsYWJsZSBhdCB0aGUge3t7aHR0cDovL3dpa2kuYXBhY2hlLm9yZy9teWZhY2VzL0V4dGVuc2lvbnMvVmFsaWRhdG9yL31XaWtpfX0uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvc2l0ZS9zcmMvc2l0ZS9zaXRlLnhtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3NpdGUvc3JjL3NpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYzllODUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvc2l0ZS9zcmMvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCBuYW1lPSJBcGFjaGUgTXlmYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciI+Ci0gIDxiYW5uZXJMZWZ0PgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dFZhbDwvbmFtZT4KLSAgICA8c3JjPmltYWdlcy9leHR2YWxfbG9nby5wbmc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2luZGV4Lmh0bWw8L2hyZWY+Ci0gIDwvYmFubmVyTGVmdD4KLQotICA8YmFubmVyUmlnaHQ+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXM8L25hbWU+Ci0gICAgPHNyYz5pbWcvYmFubmVycy9NeUZhY2VzX2xvZ28uanBnPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sPC9ocmVmPgotICA8L2Jhbm5lclJpZ2h0PiAKLQotICA8cHVibGlzaERhdGUgZm9ybWF0PSJkZCBNTU0geXl5eSIvPgotCi0gIDxza2luPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5tYXZlbjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLXNpdGUtc2tpbjwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3NraW4+Ci0KLSAgPGJvZHk+Ci0gICAgPGxpbmtzPgotICAgICAgPGl0ZW0gbmFtZT0iQXBhY2hlIiBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmciLz4KLSAgICAgIDxpdGVtIG5hbWU9Ik15RmFjZXMiIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQgTXlmYWNlcyBFeHRWYWwiICAgICAgIGhyZWY9ImRvd25sb2FkLmh0bWwiLz4KLSAgICA8L2xpbmtzPgotCi0gICAgPG1lbnUgbmFtZT0iQXBhY2hlIE15RmFjZXMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9kb3dubG9hZC5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgbmFtZT0iQ29udGVudHMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9Ik1haW4gU2l0ZSIgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgPGl0ZW0gbmFtZT0iRXh0VmFsIGZvciBKU0YgMS4xIiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvaW5kZXguaHRtbCIgY29sbGFwc2U9InRydWUiPgotICAgICAgICAgICAgPGl0ZW0gbmFtZT0iZHVtbXkiICAgICAgICBocmVmPSJkdW1teSIvPgotICAgICAgICA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkV4dFZhbCBmb3IgSlNGIDEuMiIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2luZGV4Lmh0bWwiIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9ImR1bW15IiAgICAgICAgaHJlZj0iZHVtbXkiLz4KLSAgICAgICAgPC9pdGVtPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IG5hbWU9IkRvY3VtZW50YXRpb24iPgotICAgICAgPGl0ZW0gbmFtZT0iV2lraSIgICAgICAgICBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL215ZmFjZXMvRXh0ZW5zaW9ucy9WYWxpZGF0b3IvIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgcmVmPSJyZXBvcnRzIi8+Ci0KLSAgICA8bWVudSBuYW1lPSJGb3VuZGF0aW9uIiBpbmhlcml0PSJ0b3AiPgotICAgICAgPGl0ZW0gbmFtZT0iQVNGIiAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iIC8+Ci0gICAgICA8aXRlbSBuYW1lPSJTcG9uc29yc2hpcCIgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vc3BvbnNvcnNoaXAuaHRtbCIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlRoYW5rcyIgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi90aGFua3MuaHRtbCIgLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxMzAxMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQmVhbi1WYWxpZGF0aW9uLUludGVncmF0aW9uLU1vZHVsZSAoSlNSIDMwMyk8L25hbWU+DQotICAgIDx2ZXJzaW9uPjIuMGJ2LVBST1RPVFlQRTwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnZhbGlkYXRpb248L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wLkJldGE0PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjAuMC1iMTE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgPC9yZXNvdXJjZXM+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4yPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9BYnN0cmFjdCouamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9UZXN0VXRpbHMuamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qQmVhbi5qYXZhPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9JTlRFUk5BTF9SRUFETUUgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9JTlRFUk5BTF9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMjZkYWUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvSU5URVJOQUxfUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotanNmIDIuMCBzcGVjaWZpYyBjaGFuZ2VzIGluIChub3QgZmluaXNoZWQpOg0KLSAtIEV4dFZhbEFwcGxpY2F0aW9uRmFjdG9yeQ0KLSAtIEV4dFZhbFJlbmRlcktpdA0KLSAtIEJlYW5WYWxpZGF0aW9uSW50ZXJjZXB0b3IgKGlzVmFsaWRhdGlvbkRpc2FibGVkLCBtZXJnZUZvdW5kR3JvdXBzV2l0aFZhbGlkYXRvckdyb3VwcykNCi0gLSBEZWZhdWx0RUxIZWxwZXINCi0gLSBFeHRWYWxFTFJlc29sdmVyDQotIC0gRXh0VmFsQmVhblZhbGlkYXRvcg0KLSAtIFJlc2V0QmVhblZhbGlkYXRpb25SZW5kZXJlckludGVyY2VwdG9yDQotIC0gQmVhblZhbGlkYXRpb25UYWdBd2FyZVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLSAtIEpTRjJBd2FyZUJlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyDQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0M2JjZjEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiDQotICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjIiPg0KLSAgICA8ZmFjdG9yeT4NCi0gICAgICAgIDxhcHBsaWNhdGlvbi1mYWN0b3J5Pm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmZhY3RvcnkuRXh0VmFsQXBwbGljYXRpb25GYWN0b3J5PC9hcHBsaWNhdGlvbi1mYWN0b3J5Pg0KLSAgICA8L2ZhY3Rvcnk+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RhcnR1cC5KU0YyQXdhcmVCZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RhcnR1cC5CZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5Nb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZGM4NTkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwucHJvcGVydHkuQmVhblZhbGlkYXRpb25Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb247DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQmVhbkRlc2NyaXB0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uRWxlbWVudERlc2NyaXB0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludERlc2NyaXB0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuSElHSCwgZGVzY3JpcHRpb24gPSAic3luYyBqc2YgMi4wIHNwZWNpZmljIGNoYW5nZXMgd2l0aCBidi1icmFuY2giKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3INCi17DQotICAgIHByaXZhdGUgVmFsaWRhdG9yRmFjdG9yeSB2YWxpZGF0aW9uRmFjdG9yeSA9IFZhbGlkYXRpb24uYnVpbGREZWZhdWx0VmFsaWRhdG9yRmFjdG9yeSgpOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpDQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5ISUdILCBkZXNjcmlwdGlvbiA9ICJjaGVjayBncm91cHMiKQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCB0byBpbml0IGNvbXBvbmVudCAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IgPSBFeHRWYWxVdGlscy5nZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcigpOw0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IG1ldGFEYXRhRXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgLmdldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBpZihwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2Fybigibm8gYmFzZSBvYmplY3QgYXQgIiArIHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgIiBjb21wb25lbnQtaWQ6ICIgKyB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLypUT0RPDQotICAgICAgICAgICAgLy9UT0RPIGV4dHJhY3QgZ3JvdXBzIC0gc2VlIFZhbGlkYXRpb25Hcm91cFByb3ZpZGVyDQotICAgICAgICAgICAgQ2xhc3NbXSBmb3VuZEdyb3VwcyA9IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRHcm91cHMoDQotICAgICAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5nZXRWaWV3SWQoKSwNCi0gICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCkpOw0KLQ0KLSAgICAgICAgICAgIGZvdW5kR3JvdXBzID0gbWVyZ2VGb3VuZEdyb3Vwc1dpdGhWYWxpZGF0b3JHcm91cHMoDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzLCAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmdldFZhbGlkYXRvcnMoKSk7DQotICAgICAgICAgKi8NCi0NCi0gICAgICAgIEJlYW5EZXNjcmlwdG9yIGJlYW5EZXNjcmlwdG9yID0gdGhpcy52YWxpZGF0aW9uRmFjdG9yeS5nZXRWYWxpZGF0b3IoKS5nZXRDb25zdHJhaW50c0ZvckNsYXNzKA0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCkvKiwgZm91bmRHcm91cHMqLyk7DQotDQotICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBlbGVtZW50RGVzY3JpcHRvciA9IGJlYW5EZXNjcmlwdG9yLmdldENvbnN0cmFpbnRzRm9yUHJvcGVydHkocHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCkpOw0KLQ0KLSAgICAgICAgaWYoZWxlbWVudERlc2NyaXB0b3IgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgICAgICBNZXRhRGF0YUVudHJ5IGVudHJ5Ow0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YTsNCi0NCi0gICAgICAgIGZvciAoQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gY29uc3RyYWludERlc2NyaXB0b3IgOiBlbGVtZW50RGVzY3JpcHRvci5nZXRDb25zdHJhaW50RGVzY3JpcHRvcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8gY2hlY2sgZ3JvdXBzDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gbmV3IEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKGNvbnN0cmFpbnREZXNjcmlwdG9yKTsNCi0NCi0gICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAqIHBlciBkZWZhdWx0DQotICAgICAgICAgICAgICogb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIuQmVhblZhbGlkYXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyDQotICAgICAgICAgICAgICogaXMgYm91bmQgdG8gQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi0gICAgICAgICAgICAgKiBkb24ndCB1c2UgaXQgZGlyZWN0bHkgLSBpdCdzIHBvc3NpYmxlIHRvIGRlYWN0aXZhdGUNCi0gICAgICAgICAgICAgKiBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXINCi0gICAgICAgICAgICAgKiAgICAuRGVmYXVsdEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotICAgICAgICAgICAgICovDQotICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IEV4dFZhbFV0aWxzLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICBpZiAobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYgKHRoaXMubG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGVudHJ5ID0gbmV3IE1ldGFEYXRhRW50cnkoKTsNCi0gICAgICAgICAgICAgICAgZW50cnkuc2V0S2V5KGNvbnN0cmFpbnREZXNjcmlwdG9yLmdldEFubm90YXRpb24oKS5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgIGVudHJ5LnNldFZhbHVlKGNvbnN0cmFpbnREZXNjcmlwdG9yKTsNCi0gICAgICAgICAgICAgICAgLy9UT0RPICg/KSBhZGQgdHlwZSBvZiBwcm9wZXJ0eSBmb3IgbWV0YS1kYXRhIHRyYW5zZm9ybWF0aW9uIChlLmcuIHNpemU6IHN0cmluZyB2cy4gbnVtYmVyKQ0KLQ0KLSAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWV0YURhdGEgPSBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAobWV0YURhdGEgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvL2dldCBjb21wb25lbnQgaW5pdGlhbGl6ZXIgZm9yIHRoZSBjdXJyZW50IGNvbXBvbmVudCBhbmQgY29uZmlndXJlIGl0DQotICAgICAgICAgICAgLy9hbHNvIGluIGNhc2Ugb2Ygc2tpcHBlZCB2YWxpZGF0aW9uIHRvIHJlc2V0IGUuZy4gdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZQ0KLSAgICAgICAgICAgIGlmICghbWV0YURhdGEuaXNFbXB0eSgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29uZmlndXJlQ29tcG9uZW50V2l0aE1ldGFEYXRhKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJpbml0IGNvbXBvbmVudCBvZiAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkNCi0gICAgICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QgPSB3cmFwcGVkLmdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8pOw0KLQ0KLSAgICAgICAgLy9yZWNvcmRlIHVzZXIgaW5wdXQgZS5nLiBmb3IgY3Jvc3MtY29tcG9uZW50IHZhbGlkYXRpb24NCi0gICAgICAgIGZvciAoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciByZWNvcmRlciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVjb3JkZXIucmVjb3JkVXNlcklucHV0KHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZWNvcmRlci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY2FsbGVkIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ29udmVydGVyRXhjZXB0aW9uKGUuZ2V0RmFjZXNNZXNzYWdlKCksIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXI7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5ISUdILCBkZXNjcmlwdGlvbiA9ICJ1c2UgRXh0VmFsVXRpbHMjY3JlYXRlRmFjZXNNZXNzYWdlIikNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmICghInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfRU1QVFlfU1RSSU5HX0lOVEVSUFJFVEFUSU9OKQ0KLSAgICAgICAgICAgICAgICAmJiAiIi5lcXVhbHMoY29udmVydGVkT2JqZWN0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QgPSBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IgPSBFeHRWYWxVdGlscy5nZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcigpOw0KLQ0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIC8vZS5nLjogZXh0cmFjdCBncm91cHMgZm9yIHZhbGlkYXRpb24NCi0gICAgICAgIGlmKCFFeHRWYWxVdGlscy5leGVjdXRlQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24uY2xhc3MuZ2V0TmFtZSgpICxwcm9wZXJ0eUluZm9ybWF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImpzcjMwMyBzdGFydCB2YWxpZGF0aW9uIik7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByb2Nlc3NGaWVsZFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImpzcjMwMyB2YWxpZGF0aW9uIGZpbmlzaGVkIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluYWxseQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NGaWVsZFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgYmFzZUJlYW5DbGFzcyA9IChwcm9wZXJ0eUluZm9ybWF0aW9uLmdldEluZm9ybWF0aW9uKA0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpKS5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSAocHJvcGVydHlJbmZvcm1hdGlvbi5nZXRJbmZvcm1hdGlvbigNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKSkuZ2V0UHJvcGVydHkoKTsNCi0NCi0gICAgICAgIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBiZWFuVmFsaWRhdGlvbkNvbnRleHQgPSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBDbGFzc1tdIGdyb3VwcyA9IGJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRHcm91cHMoDQotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldFZpZXdJZCgpLCB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpKTsNCi0NCi0gICAgICAgIGlmKGdyb3VwcyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPiB2aW9sYXRpb25zID0gdGhpcy52YWxpZGF0aW9uRmFjdG9yeS51c2luZ0NvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAubWVzc2FnZUludGVycG9sYXRvcihFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdG9yKCkNCi0gICAgICAgICAgICAgICAgLnZhbGlkYXRlVmFsdWUoYmFzZUJlYW5DbGFzcywgcHJvcGVydHlOYW1lLCBjb252ZXJ0ZWRPYmplY3QsIGdyb3Vwcyk7DQotDQotICAgICAgICBpZiAodmlvbGF0aW9ucyAhPSBudWxsICYmIHZpb2xhdGlvbnMuc2l6ZSgpID4gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8ganNmIDIuMCBzdXBwb3J0cyBtdWx0aXBsZSBtZXNzYWdlcyAtPiB1c2UgYWxsIG1lc3NhZ2VzDQotICAgICAgICAgICAgQ29uc3RyYWludFZpb2xhdGlvbiB2aW9sYXRpb24gPSAoQ29uc3RyYWludFZpb2xhdGlvbikgdmlvbGF0aW9ucy50b0FycmF5KClbMF07DQotDQotICAgICAgICAgICAgU3RyaW5nIHZpb2xhdGlvbk1lc3NhZ2UgPSB2aW9sYXRpb24uZ2V0TWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyBsYWJlbGVkTWVzc2FnZSA9ICJ7MH06ICIgKyB2aW9sYXRpb25NZXNzYWdlOw0KLSAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24gPSBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsIGxhYmVsZWRNZXNzYWdlLCBsYWJlbGVkTWVzc2FnZSkpOw0KLQ0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICBudWxsLA0KLSAgICAgICAgICAgICAgICAgICAgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7DQotDQotICAgICAgICAgICAgLy9UT0RPIGNoZWNrICYgcmVtb3ZlDQotICAgICAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5zZXRJbmZvcm1hdGlvbigNCi0gICAgICAgICAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uUHJvcGVydHlJbmZvcm1hdGlvbktleXMuQ09OU1RSQUlOVF9WSU9MQVRJT05TLCB2aW9sYXRpb25zKTsNCi0NCi0gICAgICAgICAgICBpZiAobGFiZWxlZE1lc3NhZ2UuZXF1YWxzKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTdW1tYXJ5KCkpIHx8DQotICAgICAgICAgICAgICAgICAgICBsYWJlbGVkTWVzc2FnZS5lcXVhbHModmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldERldGFpbCgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsIHZpb2xhdGlvbk1lc3NhZ2UsIHZpb2xhdGlvbk1lc3NhZ2UpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgdmFsaWRhdG9yRXhjZXB0aW9uOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0V4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0V4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGM5OWE2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5tZXNzYWdlLmludGVycG9sYXRvci5EZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5tZXNzYWdlLmludGVycG9sYXRvci5FeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5Nb2RlbFZhbGlkYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLk1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmdyb3Vwcy5EZWZhdWx0Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVkgPSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuY2xhc3MuZ2V0TmFtZSgpICsgIjpLRVkiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBNZXNzYWdlSW50ZXJwb2xhdG9yIGRlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yID0gbmV3IERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yKA0KLSAgICAgICAgICAgIFZhbGlkYXRpb24uYnVpbGREZWZhdWx0VmFsaWRhdG9yRmFjdG9yeSgpLmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKSk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXI7DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuSElHSCwgZGVzY3JpcHRpb24gPSAicmVmYWN0b3IgdG8gYSBwbHVnZ2FibGUgU3RvcmFnZSIpDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IGFkZGVkR3JvdXBzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PENsYXNzPj4oKTsNCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5ISUdILCBkZXNjcmlwdGlvbiA9ICJyZWZhY3RvciB0byBhIHBsdWdnYWJsZSBTdG9yYWdlIikNCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PENsYXNzPj4gcmVzdHJpY3RlZEdyb3VwcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+KCk7DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuSElHSCwgZGVzY3JpcHRpb24gPSAicmVmYWN0b3IgdG8gYSBwbHVnZ2FibGUgU3RvcmFnZSIpDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4+IG1vZGVsVmFsaWRhdGlvbkVudHJpZXMgPQ0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4+KCk7DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuSElHSCwgZGVzY3JpcHRpb24gPSAicmVmYWN0b3IgdG8gYSBwbHVnZ2FibGUgU3RvcmFnZSIpDQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGNvbXBvbmVudHNPZlJlcXVlc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgcHJpdmF0ZSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQoKQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHVibGljIHN0YXRpYyBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgZ2V0Q3VycmVudEluc3RhbmNlKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBjdXJyZW50Q29udGV4dCA9IChFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQpcmVxdWVzdE1hcC5nZXQoS0VZKTsNCi0NCi0gICAgICAgIGlmKGN1cnJlbnRDb250ZXh0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudENvbnRleHQgPSBuZXcgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0KCk7DQotICAgICAgICAgICAgcmVxdWVzdE1hcC5wdXQoS0VZLCBjdXJyZW50Q29udGV4dCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gY3VycmVudENvbnRleHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0R3JvdXBLZXkoU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNvbXBvbmVudElkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29tcG9uZW50SWQgPT0gbnVsbCA/IHZpZXdJZCA6IHZpZXdJZCArICJAIiArIGNvbXBvbmVudElkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIGFkZEdyb3VwKGdyb3VwQ2xhc3MsIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldFZpZXdJZCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRHcm91cChDbGFzcyBncm91cENsYXNzLCBTdHJpbmcgdmlld0lkKQ0KLSAgICB7DQotICAgICAgICBhZGRHcm91cChncm91cENsYXNzLCB2aWV3SWQsIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjb21wb25lbnRJZCkNCi0gICAgew0KLSAgICAgICAgYWRkR3JvdXBUb0dyb3VwU3RvcmFnZShncm91cENsYXNzLCB2aWV3SWQsIGNvbXBvbmVudElkLCB0aGlzLmFkZGVkR3JvdXBzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRNb2RlbFZhbGlkYXRpb25FbnRyeShNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSkNCi0gICAgew0KLSAgICAgICAgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkobW9kZWxWYWxpZGF0aW9uRW50cnksIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldFZpZXdJZCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRNb2RlbFZhbGlkYXRpb25FbnRyeShNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwgU3RyaW5nIHZpZXdJZCkNCi0gICAgew0KLSAgICAgICAgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkobW9kZWxWYWxpZGF0aW9uRW50cnksIHZpZXdJZCwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoDQotICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksIFN0cmluZyB2aWV3SWQsIFVJQ29tcG9uZW50IGNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuc2V0Q29tcG9uZW50KGNvbXBvbmVudCk7DQotDQotICAgICAgICBTdHJpbmcgY29tcG9uZW50SWQgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYoY29tcG9uZW50ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgY29tcG9uZW50SWQgPSBjb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKTsNCi0gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNPZlJlcXVlc3QuYWRkKGNvbXBvbmVudElkKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9DQotICAgICAgICAgICAgICAgIHRoaXMubW9kZWxWYWxpZGF0aW9uRW50cmllcy5nZXQoZ2V0R3JvdXBLZXkodmlld0lkLCBjb21wb25lbnRJZCkpOw0KLQ0KLSAgICAgICAgaWYobW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0ID0gbmV3IEFycmF5TGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4oKTsNCi0gICAgICAgICAgICB0aGlzLm1vZGVsVmFsaWRhdGlvbkVudHJpZXMucHV0KGdldEdyb3VwS2V5KHZpZXdJZCwgY29tcG9uZW50SWQpLCBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoIW1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdC5jb250YWlucyhtb2RlbFZhbGlkYXRpb25FbnRyeSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LmFkZChtb2RlbFZhbGlkYXRpb25FbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVzdHJpY3RHcm91cChDbGFzcyBncm91cENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXN0cmljdEdyb3VwKGdyb3VwQ2xhc3MsIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldFZpZXdJZCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZXN0cmljdEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQpDQotICAgIHsNCi0gICAgICAgIHJlc3RyaWN0R3JvdXAoZ3JvdXBDbGFzcywgdmlld0lkLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZXN0cmljdEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjb21wb25lbnRJZCkNCi0gICAgew0KLSAgICAgICAgYWRkR3JvdXBUb0dyb3VwU3RvcmFnZShncm91cENsYXNzLCB2aWV3SWQsIGNvbXBvbmVudElkLCB0aGlzLnJlc3RyaWN0ZWRHcm91cHMpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRHcm91cFRvR3JvdXBTdG9yYWdlKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjb21wb25lbnRJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IGdyb3VwU3RvcmFnZSkNCi0gICAgew0KLSAgICAgICAgTGlzdDxDbGFzcz4gZ3JvdXBMaXN0ID0gZ3JvdXBTdG9yYWdlLmdldChnZXRHcm91cEtleSh2aWV3SWQsIGNvbXBvbmVudElkKSk7DQotDQotICAgICAgICBpZihncm91cExpc3QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBncm91cExpc3QgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLSAgICAgICAgICAgIGdyb3VwU3RvcmFnZS5wdXQoZ2V0R3JvdXBLZXkodmlld0lkLCBjb21wb25lbnRJZCksIGdyb3VwTGlzdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZighZ3JvdXBMaXN0LmNvbnRhaW5zKGdyb3VwQ2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGdyb3VwTGlzdC5hZGQoZ3JvdXBDbGFzcyk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVzZXRHcm91cChTdHJpbmcgdmlld0lkKQ0KLSAgICB7DQotICAgICAgICByZXNldEdyb3Vwcyh2aWV3SWQsIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlc2V0R3JvdXBzKFN0cmluZyB2aWV3SWQsIFN0cmluZyBjb21wb25lbnRJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5hZGRlZEdyb3Vwcy5wdXQoZ2V0R3JvdXBLZXkodmlld0lkLCBjb21wb25lbnRJZCksIG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCkpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgIHB1YmxpYyBDbGFzc1tdIGdldEdyb3VwcygpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMuYWRkZWRHcm91cHMuc2l6ZSgpIDwgMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzW10ge0RlZmF1bHQuY2xhc3N9Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxDbGFzcz4gZnVsbEdyb3VwTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgICAgICBmb3IoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxDbGFzcz4+IGN1cnJlbnRHcm91cEVudHJ5IDogdGhpcy5hZGRlZEdyb3Vwcy5lbnRyeVNldCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZ1bGxHcm91cExpc3QuYWRkQWxsKGN1cnJlbnRHcm91cEVudHJ5LmdldFZhbHVlKCkpOw0KLQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIChDbGFzc1tdKSBmdWxsR3JvdXBMaXN0LnRvQXJyYXkoKTsNCi0gICAgfQ0KLSAgICAqLw0KLQ0KLSAgICBwdWJsaWMgQ2xhc3NbXSBnZXRHcm91cHMoU3RyaW5nIHZpZXdJZCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEdyb3Vwcyh2aWV3SWQsIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzc1tdIGdldEFsbEdyb3VwcyhTdHJpbmcgdmlld0lkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0R3JvdXBzKHZpZXdJZCwgIioiKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkhJR0gsIGRlc2NyaXB0aW9uID0gImNoYW5nZSBpbXBsLiBmb3IgI2dldEFsbEdyb3VwcyAtIHNlZSBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzIikNCi0gICAgcHVibGljIENsYXNzW10gZ2V0R3JvdXBzKFN0cmluZyB2aWV3SWQsIFN0cmluZyBjb21wb25lbnRJZCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5hZGRlZEdyb3Vwcy5zaXplKCkgPCAxKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCEidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9JTVBMSUNJVF9ERUZBVUxUX0dST1VQX1ZBTElEQVRJT04pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzc1tdIHtEZWZhdWx0LmNsYXNzfTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2FkZCBmb3VuZCBncm91cHMNCi0gICAgICAgIFN0cmluZyBrZXkgPSBnZXRHcm91cEtleSh2aWV3SWQsIG51bGwpOw0KLSAgICAgICAgTGlzdDxDbGFzcz4gcmVzdWx0TGlzdEZvclBhZ2UgPSBidWlsZEdyb3VwTGlzdChrZXksIHRoaXMuYWRkZWRHcm91cHMpOw0KLQ0KLSAgICAgICAga2V5ID0gZ2V0R3JvdXBLZXkodmlld0lkLCBjb21wb25lbnRJZCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN1bHRMaXN0Rm9yQ29tcG9uZW50ID0gYnVpbGRHcm91cExpc3Qoa2V5LCB0aGlzLmFkZGVkR3JvdXBzKTsNCi0NCi0gICAgICAgIC8vcmVtb3ZlIHJlc3RyaWN0ZWQgZ3JvdXBzDQotICAgICAgICBDbGFzc1tdIHJlc3VsdHNGb3JQYWdlID0gZmlsdGVyR3JvdXBMaXN0KGdldEdyb3VwS2V5KHZpZXdJZCwgbnVsbCksIHJlc3VsdExpc3RGb3JQYWdlKTsNCi0gICAgICAgIENsYXNzW10gcmVzdWx0c0ZvckNvbXBvbmVudCA9IGZpbHRlckdyb3VwTGlzdChnZXRHcm91cEtleSh2aWV3SWQsIGNvbXBvbmVudElkKSwgcmVzdWx0TGlzdEZvckNvbXBvbmVudCk7DQotDQotICAgICAgICBpZihyZXN1bHRzRm9yUGFnZS5sZW5ndGggPT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihyZXN1bHRzRm9yQ29tcG9uZW50Lmxlbmd0aCA9PSAwKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoIm5vIGdyb3VwcyBmb3IgZ3JvdXAtdmFsaWRhdGlvbiBhdmFpbGFibGUuIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXliZSB5b3UgcmVzdHJpY3RlZCBhbGwgZ3JvdXBzIG9yIHlvdSBhcmVuJ3QgdXNpbmcgZ3JvdXBzLiIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVhbiB2YWxpZGF0aW9uIHdpbGwgdXNlIHRoZSBkZWZhdWx0IGdyb3VwIGZvciB2YWxpZGF0aW9uIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNGb3JDb21wb25lbnQ7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKHJlc3VsdHNGb3JDb21wb25lbnQubGVuZ3RoID09IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNGb3JQYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG1lcmdlUmVzdWx0cyhyZXN1bHRzRm9yUGFnZSwgcmVzdWx0c0ZvckNvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXMoU3RyaW5nIHZpZXdJZCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXModmlld0lkLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gZ2V0QWxsTW9kZWxWYWxpZGF0aW9uRW50cmllcyhTdHJpbmcgdmlld0lkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllcyh2aWV3SWQsICIqIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXNPZkN1cnJlbnRSZXF1ZXN0KFN0cmluZyB2aWV3SWQpDQotICAgIHsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotDQotICAgICAgICBmb3IoU3RyaW5nIGN1cnJlbnRDbGllbnRJZCA6IHRoaXMuY29tcG9uZW50c09mUmVxdWVzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQuYWRkQWxsKGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXModmlld0lkLCBjdXJyZW50Q2xpZW50SWQpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJlc3VsdC5hZGRBbGwoZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllcyh2aWV3SWQpKTsNCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXMoU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNvbXBvbmVudElkKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLm1vZGVsVmFsaWRhdGlvbkVudHJpZXMuc2l6ZSgpIDwgMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vYWRkIGZvdW5kIGdyb3Vwcw0KLSAgICAgICAgU3RyaW5nIGtleTsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IHJlc3VsdExpc3RGb3JQYWdlID0gbnVsbDsNCi0NCi0gICAgICAgIGlmKCEiKiIuZXF1YWxzKGNvbXBvbmVudElkKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBrZXkgPSBnZXRHcm91cEtleSh2aWV3SWQsIG51bGwpOw0KLSAgICAgICAgICAgIHJlc3VsdExpc3RGb3JQYWdlID0NCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KGtleSwgdGhpcy5tb2RlbFZhbGlkYXRpb25FbnRyaWVzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGtleSA9IGdldEdyb3VwS2V5KHZpZXdJZCwgY29tcG9uZW50SWQpOw0KLSAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gcmVzdWx0TGlzdEZvckNvbXBvbmVudCA9DQotICAgICAgICAgICAgICAgIGJ1aWxkTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KGtleSwgdGhpcy5tb2RlbFZhbGlkYXRpb25FbnRyaWVzKTsNCi0NCi0gICAgICAgIGlmKHJlc3VsdExpc3RGb3JQYWdlID09IG51bGwgfHwgcmVzdWx0TGlzdEZvclBhZ2UuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRMaXN0Rm9yQ29tcG9uZW50Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihyZXN1bHRMaXN0Rm9yQ29tcG9uZW50LmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0TGlzdEZvclBhZ2U7DQotICAgICAgICB9DQotDQotICAgICAgICAvL21lcmdlIHJlc3VsdHMNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1lcmdlZFJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICBtZXJnZWRSZXN1bHQuYWRkQWxsKHJlc3VsdExpc3RGb3JQYWdlKTsNCi0gICAgICAgIG1lcmdlZFJlc3VsdC5hZGRBbGwocmVzdWx0TGlzdEZvckNvbXBvbmVudCk7DQotICAgICAgICByZXR1cm4gbWVyZ2VkUmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxDbGFzcz4gYnVpbGRHcm91cExpc3QoU3RyaW5nIGtleSwgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IGdyb3VwU3RvcmFnZSkNCi0gICAgew0KLSAgICAgICAgTGlzdDxDbGFzcz4gbGlzdCA9IGdyb3VwU3RvcmFnZS5nZXQoa2V5KTsNCi0gICAgICAgIHJldHVybiAobGlzdCAhPSBudWxsKSA/IGxpc3QgOiBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gYnVpbGRNb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QoDQotICAgICAgICAgICAgU3RyaW5nIGtleSwgTWFwPFN0cmluZywgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4+IGdyb3VwU3RvcmFnZSkNCi0gICAgew0KLSAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbGlzdDsNCi0NCi0gICAgICAgIGlmKGtleSAhPSBudWxsICYmIGtleS5lbmRzV2l0aCgiKiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PigpOw0KLSAgICAgICAgICAgIGZvcihNYXAuRW50cnk8U3RyaW5nLExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+PiBlbnRyeSA6IGdyb3VwU3RvcmFnZS5lbnRyeVNldCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0S2V5KCkuc3Vic3RyaW5nKDAsIGVudHJ5LmdldEtleSgpLmluZGV4T2YoIkAiKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGtleS5zdWJzdHJpbmcoMCwga2V5LmluZGV4T2YoIkAiKSkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZEFsbChlbnRyeS5nZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbGlzdDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGxpc3QgPSBncm91cFN0b3JhZ2UuZ2V0KGtleSk7DQotICAgICAgICByZXR1cm4gKGxpc3QgIT0gbnVsbCkgPyBsaXN0IDogbmV3IEFycmF5TGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENsYXNzW10gZmlsdGVyR3JvdXBMaXN0KFN0cmluZyBrZXksIExpc3Q8Q2xhc3M+IGFkZGVkR3JvdXBzKQ0KLSAgICB7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzID0gYnVpbGRHcm91cExpc3Qoa2V5LCB0aGlzLnJlc3RyaWN0ZWRHcm91cHMpOw0KLSAgICAgICAgTGlzdDxDbGFzcz4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgICAgICBmb3IoQ2xhc3MgY3VycmVudEdyb3VwIDogYWRkZWRHcm91cHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoIXJlc3RyaWN0ZWRHcm91cHMuY29udGFpbnMoY3VycmVudEdyb3VwKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKGN1cnJlbnRHcm91cCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHMudG9BcnJheShuZXcgQ2xhc3NbcmVzdWx0cy5zaXplKCldKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENsYXNzW10gbWVyZ2VSZXN1bHRzKENsYXNzW10gcmVzdWx0c0ZvclBhZ2UsIENsYXNzW10gcmVzdWx0c0ZvckNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgQ2xhc3NbXSBtZXJnZWRSZXN1bHQgPSBuZXcgQ2xhc3NbcmVzdWx0c0ZvclBhZ2UubGVuZ3RoICsgcmVzdWx0c0ZvckNvbXBvbmVudC5sZW5ndGhdOw0KLQ0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZXN1bHRzRm9yUGFnZSwgMCwgbWVyZ2VkUmVzdWx0LCAwLCByZXN1bHRzRm9yUGFnZS5sZW5ndGgpOw0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZXN1bHRzRm9yQ29tcG9uZW50LCAwLCBtZXJnZWRSZXN1bHQsIHJlc3VsdHNGb3JQYWdlLmxlbmd0aCwgcmVzdWx0c0ZvckNvbXBvbmVudC5sZW5ndGgpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG1lcmdlZFJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVHcm91cChDbGFzcyBncm91cENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZW1vdmVHcm91cChncm91cENsYXNzLCBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRWaWV3SWQoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlR3JvdXAoQ2xhc3MgZ3JvdXBDbGFzcywgU3RyaW5nIHZpZXdJZCkNCi0gICAgew0KLSAgICAgICAgcmVtb3ZlR3JvdXAoZ3JvdXBDbGFzcywgdmlld0lkLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9EbyhQcmlvcml0eS5ISUdIKQ0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVHcm91cChDbGFzcyBncm91cENsYXNzLCBTdHJpbmcgdmlld0lkLCBTdHJpbmcgY29tcG9uZW50SWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuYWRkZWRHcm91cHMucmVtb3ZlKGdldEdyb3VwS2V5KHZpZXdJZCwgY29tcG9uZW50SWQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZUludGVycG9sYXRvciBnZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkNCi0gICAgew0KLSAgICAgICAgaWYobWVzc2FnZVJlc29sdmVyICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlcihkZWZhdWx0TWVzc2FnZUludGVycG9sYXRvciwgbWVzc2FnZVJlc29sdmVyKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBkZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcjsNCi0gICAgfQ0KLQ0KLSAgICBAVG9EbyhQcmlvcml0eS5ISUdIKQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TWVzc2FnZVJlc29sdmVyKE1lc3NhZ2VSZXNvbHZlciBjdXN0b21NZXNzYWdlUmVzb2x2ZXIpDQotICAgIHsNCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlciA9IGN1c3RvbU1lc3NhZ2VSZXNvbHZlcjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYmVmYzMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0lNUExJQ0lUX0RFRkFVTFRfR1JPVVBfVkFMSURBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9JTVBMSUNJVF9ERUZBVUxUX0dST1VQX1ZBTElEQVRJT04iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0FERElUSU9OQUxfR1JPVVBfVkFMSURBVElPTl9BTk5PVEFUSU9OUyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9BRERJVElPTkFMX0dST1VQX1ZBTElEQVRJT05fQU5OT1RBVElPTlMiKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vQmVhblZhbGlkYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL0JlYW5WYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMzQwNTMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vQmVhblZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5ncm91cHMuRGVmYXVsdDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjMNCi0gKi8NCi0NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBUWVBFfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgQmVhblZhbGlkYXRpb24NCi17DQotICAgIFN0cmluZ1tdIHZpZXdJZHMoKSBkZWZhdWx0ICIqIjsNCi0NCi0gICAgQ2xhc3NbXSB1c2VHcm91cHMoKSBkZWZhdWx0IERlZmF1bHQuY2xhc3M7DQotDQotICAgIENsYXNzW10gcmVzdHJpY3RHcm91cHMoKSBkZWZhdWx0IE5vUmVzdHJpY3Rpb25Hcm91cC5jbGFzczsNCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5ISUdILCBkZXNjcmlwdGlvbiA9ICJzdXBwb3J0IHByb3BlcnR5IGNoYWluIHN5bnRheCIpDQotICAgIFN0cmluZ1tdIGNvbmRpdGlvbnMoKSBkZWZhdWx0ICIje3RydWV9IjsNCi0NCi0gICAgTW9kZWxWYWxpZGF0aW9uIG1vZGVsVmFsaWRhdGlvbigpIGRlZmF1bHQgQE1vZGVsVmFsaWRhdGlvbjsNCi0gICAgDQotICAgIEBSZXRlbnRpb24oUlVOVElNRSkgc3RhdGljIEBpbnRlcmZhY2UgTGlzdA0KLSAgICB7DQotICAgICAgICBCZWFuVmFsaWRhdGlvbltdIHZhbHVlKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vR3JvdXBWYWxpZGF0aW9uS2V5cy5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vR3JvdXBWYWxpZGF0aW9uS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzJhYzg2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL0dyb3VwVmFsaWRhdGlvbktleXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgR3JvdXBWYWxpZGF0aW9uS2V5cw0KLXsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUFNfVE9fVkFMSURBVEUgPSAiZ3JvdXBzX3RvX3ZhbGlkYXRlIjsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vTW9kZWxWYWxpZGF0aW9uLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9Nb2RlbFZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk1OGFlNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9Nb2RlbFZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjMNCi0gKi8NCi0NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBUWVBFfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgTW9kZWxWYWxpZGF0aW9uDQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1RBUkdFVCA9ICJiYXNlIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9NRVNTQUdFID0gIm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5idl9tZXNzYWdlIjsNCi0NCi0gICAgYm9vbGVhbiBpc0FjdGl2ZSgpIGRlZmF1bHQgZmFsc2U7DQotDQotICAgIGJvb2xlYW4gZGlzcGxheUlubGluZSgpIGRlZmF1bHQgZmFsc2U7DQotDQotICAgIFN0cmluZ1tdIHZhbGlkYXRpb25UYXJnZXRzKCkgZGVmYXVsdCBERUZBVUxUX1RBUkdFVDsNCi0NCi0gICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0IERFRkFVTFRfTUVTU0FHRTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vTm9SZXN0cmljdGlvbkdyb3VwLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9Ob1Jlc3RyaWN0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkYThmNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9Ob1Jlc3RyaWN0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IGdyb3VwIGZvciByZXN0cmljdGVkIGdyb3Vwcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4zDQotICovDQotDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIE5vUmVzdHJpY3Rpb25Hcm91cA0KLXsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3Rvci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODU1YjgzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uZXh0cmFjdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkdyb3VwVmFsaWRhdGlvbktleXM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3IgZXh0ZW5kcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3INCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFByb3BlcnR5RGV0YWlscykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihvYmplY3QuZ2V0Q2xhc3MoKSArICIgaXMgbm90IGEgIiArIFByb3BlcnR5RGV0YWlscy5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IChQcm9wZXJ0eURldGFpbHMpb2JqZWN0Ow0KLQ0KLSAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCk7DQotDQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsNCi0gICAgICAgIA0KLSAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5zZXRJbmZvcm1hdGlvbigNCi0gICAgICAgICAgICAgICAgR3JvdXBWYWxpZGF0aW9uS2V5cy5HUk9VUFNfVE9fVkFMSURBVEUsIHByb3BlcnR5RGV0YWlscyk7DQotDQotICAgICAgICAvKg0KLSAgICAgICAgICogZmluZCBhbmQgYWRkIGFubm90YXRpb25zDQotICAgICAgICAgKi8NCi0gICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9mYWN0b3J5L0V4dFZhbEFwcGxpY2F0aW9uRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ZhY3RvcnkvRXh0VmFsQXBwbGljYXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNzVkY2EuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ZhY3RvcnkvRXh0VmFsQXBwbGljYXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uV3JhcHBlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMi54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxBcHBsaWNhdGlvbkZhY3RvcnkgZXh0ZW5kcyBBcHBsaWNhdGlvbkZhY3RvcnkNCi17DQotICAgIHByaXZhdGUgQXBwbGljYXRpb25GYWN0b3J5IHdyYXBwZWQ7DQotDQotICAgIHB1YmxpYyBFeHRWYWxBcHBsaWNhdGlvbkZhY3RvcnkoQXBwbGljYXRpb25GYWN0b3J5IHdyYXBwZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEFwcGxpY2F0aW9uRmFjdG9yeSBnZXRXcmFwcGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0V3JhcHBlZCgpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuSElHSCwgZGVzY3JpcHRpb24gPSAiY29udGV4dCBwYXJhbS4gdG8gZGVhY3RpdmF0ZSB0aGlzIHdyYXBwZXIiKQ0KLSAgICBwdWJsaWMgQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uV3JhcHBlcigpIHsNCi0NCi0gICAgICAgICAgICBwdWJsaWMgQXBwbGljYXRpb24gZ2V0V3JhcHBlZCgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRBcHBsaWNhdGlvbigpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZhdWx0VmFsaWRhdG9ySWQoU3RyaW5nIHMpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZighImphdmF4LmZhY2VzLkJlYW4iLmVxdWFscyhzKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgc3VwZXIuYWRkRGVmYXVsdFZhbGlkYXRvcklkKHMpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikNCi0gICAgew0KLSAgICAgICAgd3JhcHBlZC5zZXRBcHBsaWNhdGlvbihhcHBsaWNhdGlvbik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0JlYW5WYWxpZGF0aW9uVGFnQXdhcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9CZWFuVmFsaWRhdGlvblRhZ0F3YXJlVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZDQwYTAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0JlYW5WYWxpZGF0aW9uVGFnQXdhcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLkV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkJlYW5WYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAyLnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uVGFnQXdhcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyICYmIC8vImZpbHRlciIgY3Jvc3MtdmFsaWRhdGlvbiBjYWxscw0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFByb3BlcnR5SW5mb3JtYXRpb24uY2xhc3MuZ2V0TmFtZSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbnNwZWN0VmFsaWRhdG9ycyhmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5nZXRWaWV3SWQoKSwNCi0gICAgICAgICAgICAgICAgICAgIChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSwNCi0gICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuZ2V0VmFsaWRhdG9ycygpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICAvL25vdCB1c2VkDQotICAgIH0NCi0NCi0gICAgQFRvRG8uTGlzdCh7QFRvRG8odmFsdWUgPSBQcmlvcml0eS5ISUdILCBkZXNjcmlwdGlvbiA9ICJvcHRpbWl6ZSIpLA0KLSAgICAgICAgICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuSElHSCwgZGVzY3JpcHRpb24gPSAidXNlIHJlZmxlY3Rpb24gaW5zdGVhZCBvZiBCZWFuVmFsaWRhdG9yIGZvciBqc2YgMS54IHZlcnNpb25zIiksDQotICAgICAgICAgICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5ISUdILCBkZXNjcmlwdGlvbiA9ICJ0ZXN0IikNCi0gICAgfSkNCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RWYWxpZGF0b3JzKFN0cmluZyB2aWV3SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0YWJsZVZhbHVlSG9sZGVyIGVkaXRhYmxlVmFsdWVIb2xkZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xpZW50SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JbXSB2YWxpZGF0b3JzKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdG9yc09mVGFnTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yIChWYWxpZGF0b3IgdmFsaWRhdG9yIDogdmFsaWRhdG9ycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2Rvbid0IGNoZWNrIHdpdGggaW5zdGFuY2VvZg0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKEJlYW5WYWxpZGF0b3IuY2xhc3MuZ2V0TmFtZSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRvcnNPZlRhZ0xpc3QuYWRkQWxsKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoKChCZWFuVmFsaWRhdG9yKSB2YWxpZGF0b3IpLmdldFZhbGlkYXRpb25Hcm91cHMoKS5zcGxpdCgiLCIpKSk7DQotDQotICAgICAgICAgICAgICAgIC8vcHJldmVudCBkb3VibGUtdmFsaWRhdGlvbg0KLSAgICAgICAgICAgICAgICBlZGl0YWJsZVZhbHVlSG9sZGVyLnJlbW92ZVZhbGlkYXRvcih2YWxpZGF0b3IpOw0KLSAgICAgICAgICAgICAgICBlZGl0YWJsZVZhbHVlSG9sZGVyLmFkZFZhbGlkYXRvcihuZXcgQmVhblZhbGlkYXRvcldyYXBwZXIoKEJlYW5WYWxpZGF0b3IpdmFsaWRhdG9yKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzOw0KLSAgICAgICAgZm9yKFN0cmluZyBncm91cENsYXNzTmFtZSA6IHZhbGlkYXRvcnNPZlRhZ0xpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudENsYXNzID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUoZ3JvdXBDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRDbGFzcyAhPSBudWxsICYmIGN1cnJlbnRDbGFzcy5pc0ludGVyZmFjZSgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmFkZEdyb3VwKGN1cnJlbnRDbGFzcywgdmlld0lkLCBjbGllbnRJZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRXJyb3JFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGdyb3VwQ2xhc3NOYW1lICsgIiBpcyBubyB2YWxpZCBncm91cCAtIG9ubHkgZXhpc3RpbmcgaW50ZXJmYWNlcyBhcmUgYWxsb3dlZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9CZWFuVmFsaWRhdG9yV3JhcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0JlYW5WYWxpZGF0b3JXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZWMyOTcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0JlYW5WYWxpZGF0b3JXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkJlYW5WYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotDQotLyoqDQotICogcmVwbGFjZW1lbnQgZm9yIEJlYW5WYWxpZGF0b3Igd2hpY2ggZ2V0cyBhZGRlZCBkdWUgdG8gZjp2YWxpZGF0ZUJlYW4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAyLnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgQmVhblZhbGlkYXRvcldyYXBwZXIgZXh0ZW5kcyBCZWFuVmFsaWRhdG9yDQotew0KLSAgICBwcml2YXRlIEJlYW5WYWxpZGF0b3Igd3JhcHBlZDsNCi0NCi0gICAgQmVhblZhbGlkYXRvcldyYXBwZXIoQmVhblZhbGlkYXRvciB3cmFwcGVkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCZWFuVmFsaWRhdG9yIGdldFdyYXBwZWRCZWFuVmFsaWRhdG9yKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRXcmFwcGVkKEJlYW5WYWxpZGF0b3Igd3JhcHBlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uR3JvdXBzKFN0cmluZyBzKQ0KLSAgICB7DQotICAgICAgICB3cmFwcGVkLnNldFZhbGlkYXRpb25Hcm91cHMocyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWxpZGF0aW9uR3JvdXBzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0VmFsaWRhdGlvbkdyb3VwcygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgLy9kb24ndCB2YWxpZGF0ZSAtIHRoZSBleHR2YWwgYmVhbi12YWxpZGF0aW9uIGFkYXB0ZXIgd2lsbCBkbyB0aGF0DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgcHVibGljIE9iamVjdCBzYXZlU3RhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IHJlc3VsdFtdID0gbmV3IE9iamVjdFsxXTsNCi0gICAgICAgIHJlc3VsdFswXSA9IHdyYXBwZWQuZ2V0VmFsaWRhdGlvbkdyb3VwcygpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IHN0YXRlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSBuZXcgQmVhblZhbGlkYXRvcigpOw0KLQ0KLSAgICAgICAgaWYgKHN0YXRlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgT2JqZWN0IHZhbHVlc1tdID0gKE9iamVjdFtdKSBzdGF0ZTsNCi0gICAgICAgICAgICB0aGlzLndyYXBwZWQuc2V0VmFsaWRhdGlvbkdyb3VwcygoU3RyaW5nKSB2YWx1ZXNbMF0pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgICovDQotDQotICAgIHB1YmxpYyB2b2lkIG1hcmtJbml0aWFsU3RhdGUoKQ0KLSAgICB7DQotICAgICAgICB3cmFwcGVkLm1hcmtJbml0aWFsU3RhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpbml0aWFsU3RhdGVNYXJrZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5pbml0aWFsU3RhdGVNYXJrZWQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBjbGVhckluaXRpYWxTdGF0ZSgpDQotICAgIHsNCi0gICAgICAgIHdyYXBwZWQuY2xlYXJJbml0aWFsU3RhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RyYW5zaWVudCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmlzVHJhbnNpZW50KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VHJhbnNpZW50KGJvb2xlYW4gYikNCi0gICAgew0KLSAgICAgICAgd3JhcHBlZC5zZXRUcmFuc2llbnQoYik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL1Jlc2V0QmVhblZhbGlkYXRpb25SZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvUmVzZXRCZWFuVmFsaWRhdGlvblJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIxZDEzMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvUmVzZXRCZWFuVmFsaWRhdGlvblJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5BYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotDQotLyoqDQotICogc2VwYXJhdGVkIGZvciBlYXNpZXIgc3luYw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDIueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUmVzZXRCZWFuVmFsaWRhdGlvblJlbmRlcmVySW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3INCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkNCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaEJhY2tWYWxpZGF0b3JzKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc3dpdGNoQmFja1ZhbGlkYXRvcnMoRWRpdGFibGVWYWx1ZUhvbGRlciBlZGl0YWJsZVZhbHVlSG9sZGVyKQ0KLSAgICB7DQotICAgICAgICBmb3IoVmFsaWRhdG9yIHZhbGlkYXRvciA6IGVkaXRhYmxlVmFsdWVIb2xkZXIuZ2V0VmFsaWRhdG9ycygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbGlkYXRvciBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0b3JXcmFwcGVyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZWRpdGFibGVWYWx1ZUhvbGRlci5hZGRWYWxpZGF0b3IoKChCZWFuVmFsaWRhdG9yV3JhcHBlcil2YWxpZGF0b3IpLmdldFdyYXBwZWRCZWFuVmFsaWRhdG9yKCkpOw0KLSAgICAgICAgICAgICAgICBlZGl0YWJsZVZhbHVlSG9sZGVyLnJlbW92ZVZhbGlkYXRvcih2YWxpZGF0b3IpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkdyb3VwUHJvdmlkZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9WYWxpZGF0aW9uR3JvdXBQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTE4ZmEzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9WYWxpZGF0aW9uR3JvdXBQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkVMSGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLk1vZGVsVmFsaWRhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uZXh0cmFjdG9yLkRlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTm9SZXN0cmljdGlvbkdyb3VwOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uZ3JvdXBzLkRlZmF1bHQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4zDQotICovDQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25Hcm91cFByb3ZpZGVyIGltcGxlbWVudHMgVmFsaWRhdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIGlmKHByb3BlcnRpZXMuY29udGFpbnNLZXkoUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1ldGFEYXRhVG9Db250ZXh0KA0KLSAgICAgICAgICAgICAgICAgICAgKFByb3BlcnR5SW5mb3JtYXRpb24pcHJvcGVydGllcy5nZXQoUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCkpLCB1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgLy9ub3QgdXNlZA0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGFkZE1ldGFEYXRhVG9Db250ZXh0KFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiwgVUlDb21wb25lbnQgY29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gcHJvcGVydHlJbmZvcm1hdGlvbg0KLSAgICAgICAgICAgICAgICAuZ2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIFN0cmluZ1tdIGtleSA9IHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKS5zcGxpdCgiXFwuIik7DQotDQotICAgICAgICBPYmplY3QgZmlyc3RCZWFuID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKGtleVswXSk7DQotDQotICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgIC8vZXh0cmFjdCBidi1jb250cm9sbGVyLWFubm90YXRpb24gb2YNCi0NCi0gICAgICAgIC8vZmlyc3QgYmVhbg0KLSAgICAgICAgcHJvY2Vzc0NsYXNzKGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotDQotICAgICAgICAvL2ZpcnN0IHByb3BlcnR5DQotICAgICAgICBwcm9jZXNzRmllbGRzQW5kUHJvcGVydGllcyhrZXlbMF0gKyAiLiIgKyBrZXlbMV0sDQotICAgICAgICAgICAgICAgIGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAga2V5WzFdLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgIC8vYmFzZSBvYmplY3QgKG9mIHRhcmdldCBwcm9wZXJ0eSkNCi0gICAgICAgIHByb2Nlc3NDbGFzcyhwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgIC8vbGFzdCBwcm9wZXJ0eQ0KLSAgICAgICAgcHJvY2Vzc0ZpZWxkc0FuZFByb3BlcnRpZXMoDQotICAgICAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKSwNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCA9IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50Vmlld0lkID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0Vmlld0lkKCk7DQotDQotICAgICAgICBTdHJpbmcgY2xpZW50SWQgPSBjb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKTsNCi0NCi0gICAgICAgIHByb2Nlc3NGb3VuZEdyb3VwcyhleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQsIGN1cnJlbnRWaWV3SWQsIGNsaWVudElkLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbik7DQotDQotICAgICAgICBwcm9jZXNzUmVzdHJpY3RlZEdyb3VwcyhleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQsIGN1cnJlbnRWaWV3SWQsIGNsaWVudElkLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgIGluaXRNb2RlbFZhbGlkYXRpb24oZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LCBjdXJyZW50Vmlld0lkLCBjb21wb25lbnQsIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LCByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0NsYXNzKE9iamVjdCBvYmplY3RUb0luc3BlY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgY2xhc3NUb0luc3BlY3QgPSBvYmplY3RUb0luc3BlY3QuZ2V0Q2xhc3MoKTsNCi0gICAgICAgIHdoaWxlICghT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NUb0luc3BlY3QuZ2V0TmFtZSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cmFuc2Zlckdyb3VwVmFsaWRhdGlvbkluZm9ybWF0aW9uVG9Gb3VuZEdyb3VwcyhvYmplY3RUb0luc3BlY3QsDQotICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhvYmplY3RUb0luc3BlY3QuZ2V0Q2xhc3MoKSwgb2JqZWN0VG9JbnNwZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotDQotICAgICAgICAgICAgY2xhc3NUb0luc3BlY3QgPSBjbGFzc1RvSW5zcGVjdC5nZXRTdXBlcmNsYXNzKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NGaWVsZHNBbmRQcm9wZXJ0aWVzKFN0cmluZyBrZXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYmFzZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eSwgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3RvcigpDQotICAgICAgICAgICAgICAgIC5leHRyYWN0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgbmV3IFByb3BlcnR5RGV0YWlscyhrZXksIGJhc2UsIHByb3BlcnR5KSk7DQotDQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSA6IHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01ldGFEYXRhKChCZWFuVmFsaWRhdGlvbikgbWV0YURhdGFFbnRyeS5nZXRWYWx1ZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYobWV0YURhdGFFbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQmVhblZhbGlkYXRpb24uTGlzdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZvcihCZWFuVmFsaWRhdGlvbiBjdXJyZW50QmVhblZhbGlkYXRpb24gOiAoKEJlYW5WYWxpZGF0aW9uLkxpc3QpbWV0YURhdGFFbnRyeS5nZXRWYWx1ZSgpKS52YWx1ZSgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTWV0YURhdGEoY3VycmVudEJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRm91bmRHcm91cHMoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50Vmlld0lkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsaWVudElkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIC8qDQotICAgICAgICAgKiBhZGQgZm91bmQgZ3JvdXBzIHRvIGNvbnRleHQNCi0gICAgICAgICAqLw0KLSAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50R3JvdXBDbGFzcyA6IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5hZGRHcm91cChjdXJyZW50R3JvdXBDbGFzcywgY3VycmVudFZpZXdJZCwgY2xpZW50SWQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NSZXN0cmljdGVkR3JvdXBzKEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudFZpZXdJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIC8qDQotICAgICAgICAgKiBhZGQgcmVzdHJpY3RlZCBncm91cHMNCi0gICAgICAgICAqLw0KLSAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50R3JvdXBDbGFzcyA6IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LnJlc3RyaWN0R3JvdXAoY3VycmVudEdyb3VwQ2xhc3MsIGN1cnJlbnRWaWV3SWQsIGNsaWVudElkKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0TW9kZWxWYWxpZGF0aW9uKEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50Vmlld0lkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCBjb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIGFkZCBtb2RlbCB2YWxpZGF0aW9uIGVudHJ5IGxpc3QNCi0gICAgICAgICAqLw0KLSAgICAgICAgZm9yKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5IDogbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCEidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5XZWJYbWxQYXJhbWV0ZXINCi0gICAgICAgICAgICAgICAgICAgIC5ERUFDVElWQVRFX0lNUExJQ0lUX0RFRkFVTFRfR1JPVVBfVkFMSURBVElPTikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5hZGRHcm91cChEZWZhdWx0LmNsYXNzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgZm9yKENsYXNzIHJlc3RyaWN0ZWRHcm91cCA6IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5yZW1vdmVHcm91cChyZXN0cmljdGVkR3JvdXApOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZihtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRHcm91cHMoKS5sZW5ndGggPiAwKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkVGFyZ2V0c0Zvck1vZGVsVmFsaWRhdGlvbihtb2RlbFZhbGlkYXRpb25FbnRyeSwgcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSk7DQotICAgICAgICAgICAgICAgIGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5hZGRNb2RlbFZhbGlkYXRpb25FbnRyeShtb2RlbFZhbGlkYXRpb25FbnRyeSwgY3VycmVudFZpZXdJZCwgY29tcG9uZW50KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyYW5zZmVyR3JvdXBWYWxpZGF0aW9uSW5mb3JtYXRpb25Ub0ZvdW5kR3JvdXBzKE9iamVjdCBvYmplY3RUb0luc3BlY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCkuaXNBbm5vdGF0aW9uUHJlc2VudChCZWFuVmFsaWRhdGlvbi5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc01ldGFEYXRhKG9iamVjdFRvSW5zcGVjdC5nZXRDbGFzcygpLmdldEFubm90YXRpb24oQmVhblZhbGlkYXRpb24uY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0VG9JbnNwZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChvYmplY3RUb0luc3BlY3QuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KEJlYW5WYWxpZGF0aW9uLkxpc3QuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvcihCZWFuVmFsaWRhdGlvbiBjdXJyZW50QmVhblZhbGlkYXRpb24gOg0KLSAgICAgICAgICAgICAgICAgICAgKG9iamVjdFRvSW5zcGVjdC5nZXRDbGFzcygpLmdldEFubm90YXRpb24oQmVhblZhbGlkYXRpb24uTGlzdC5jbGFzcykpLnZhbHVlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTWV0YURhdGEoY3VycmVudEJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbnRlcmZhY2VzKENsYXNzIGN1cnJlbnRDbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IGN1cnJlbnRDbGFzcy5nZXRJbnRlcmZhY2VzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJhbnNmZXJHcm91cFZhbGlkYXRpb25JbmZvcm1hdGlvblRvRm91bmRHcm91cHMobWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhjdXJyZW50SW50ZXJmYWNlLCBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NNZXRhRGF0YShCZWFuVmFsaWRhdGlvbiBiZWFuVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgZm9yIChTdHJpbmcgY3VycmVudFZpZXdJZCA6IGJlYW5WYWxpZGF0aW9uLnZpZXdJZHMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoKGN1cnJlbnRWaWV3SWQuZXF1YWxzKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldFZpZXdJZCgpKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFZpZXdJZC5lcXVhbHMoIioiKSkgJiYgaXNWYWxpZGF0aW9uUGVybWl0dGVkKGJlYW5WYWxpZGF0aW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGlzTW9kZWxWYWxpZGF0aW9uKGJlYW5WYWxpZGF0aW9uKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW5WYWxpZGF0aW9uLCBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LCByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NHcm91cHMoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW5WYWxpZGF0aW9uLCBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkVGFyZ2V0c0Zvck1vZGVsVmFsaWRhdGlvbihNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwgT2JqZWN0IGRlZmF1bHRUYXJnZXQpDQotICAgIHsNCi0gICAgICAgIGlmKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldE1ldGFEYXRhKCkudmFsaWRhdGlvblRhcmdldHMoKS5sZW5ndGggPT0gMSAmJg0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRNZXRhRGF0YSgpLnZhbGlkYXRpb25UYXJnZXRzKClbMF0uZXF1YWxzKE1vZGVsVmFsaWRhdGlvbi5ERUZBVUxUX1RBUkdFVCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuYWRkVmFsaWRhdGlvblRhcmdldChkZWZhdWx0VGFyZ2V0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBPYmplY3QgdGFyZ2V0Ow0KLSAgICAgICAgICAgIGZvcihTdHJpbmcgbW9kZWxWYWxpZGF0aW9uVGFyZ2V0IDogbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0TWV0YURhdGEoKS52YWxpZGF0aW9uVGFyZ2V0cygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGFyZ2V0ID0gcmVzb2x2ZVRhcmdldChtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRNZXRhRGF0YVNvdXJjZU9iamVjdCgpLCBtb2RlbFZhbGlkYXRpb25UYXJnZXQpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZih0YXJnZXQgPT0gbnVsbCAmJiB0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigidGFyZ2V0IHVucmVhY2hhYmxlIC0gc291cmNlIGNsYXNzOiAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0TWV0YURhdGFTb3VyY2VPYmplY3QoKS5nZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdGFyZ2V0IHRvIHJlc29sdmU6ICIgKyBtb2RlbFZhbGlkYXRpb25UYXJnZXQpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmFkZFZhbGlkYXRpb25UYXJnZXQodGFyZ2V0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRhdGlvblBlcm1pdHRlZChCZWFuVmFsaWRhdGlvbiBiZWFuVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgRUxIZWxwZXIgZWxIZWxwZXIgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpOw0KLQ0KLSAgICAgICAgZm9yKFN0cmluZyBjb25kaXRpb24gOiBiZWFuVmFsaWRhdGlvbi5jb25kaXRpb25zKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoZWxIZWxwZXIuaXNFTFRlcm1XZWxsRm9ybWVkKGNvbmRpdGlvbikgJiYNCi0gICAgICAgICAgICAgICAgICAgIGVsSGVscGVyLmlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCBjb25kaXRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoQm9vbGVhbi5UUlVFLmVxdWFscygNCi0gICAgICAgICAgICAgICAgICAgICAgICBlbEhlbHBlci5nZXRWYWx1ZU9mRXhwcmVzc2lvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oY29uZGl0aW9uKSkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigiYW4gaW52YWxpZCBjb25kaXRpb24gaXMgdXNlZDogIiArIGNvbmRpdGlvbik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTW9kZWxWYWxpZGF0aW9uKEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmVhblZhbGlkYXRpb24ubW9kZWxWYWxpZGF0aW9uKCkuaXNBY3RpdmUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoQmVhblZhbGlkYXRpb24gYmVhblZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSA9IG5ldyBNb2RlbFZhbGlkYXRpb25FbnRyeSgpOw0KLQ0KLSAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuc2V0R3JvdXBzKEFycmF5cy5hc0xpc3QoYmVhblZhbGlkYXRpb24udXNlR3JvdXBzKCkpKTsNCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LnNldE1ldGFEYXRhKGJlYW5WYWxpZGF0aW9uLm1vZGVsVmFsaWRhdGlvbigpKTsNCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LnNldE1ldGFEYXRhU291cmNlT2JqZWN0KG1ldGFEYXRhU291cmNlT2JqZWN0KTsNCi0NCi0gICAgICAgIGlmKCEoYmVhblZhbGlkYXRpb24ucmVzdHJpY3RHcm91cHMoKS5sZW5ndGggPT0gMSAmJg0KLSAgICAgICAgICAgICAgICBiZWFuVmFsaWRhdGlvbi5yZXN0cmljdEdyb3VwcygpWzBdLmVxdWFscyhOb1Jlc3RyaWN0aW9uR3JvdXAuY2xhc3MpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLmFkZEFsbChBcnJheXMuYXNMaXN0KGJlYW5WYWxpZGF0aW9uLnJlc3RyaWN0R3JvdXBzKCkpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdC5hZGQobW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzR3JvdXBzKEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLmFkZEFsbChBcnJheXMuYXNMaXN0KGJlYW5WYWxpZGF0aW9uLnVzZUdyb3VwcygpKSk7DQotDQotICAgICAgICBpZighKGJlYW5WYWxpZGF0aW9uLnJlc3RyaWN0R3JvdXBzKCkubGVuZ3RoID09IDEgJiYNCi0gICAgICAgICAgICAgICAgYmVhblZhbGlkYXRpb24ucmVzdHJpY3RHcm91cHMoKVswXS5lcXVhbHMoTm9SZXN0cmljdGlvbkdyb3VwLmNsYXNzKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChiZWFuVmFsaWRhdGlvbi5yZXN0cmljdEdyb3VwcygpKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgcmVzb2x2ZVRhcmdldChPYmplY3QgbWV0YURhdGFTb3VyY2VPYmplY3QsIFN0cmluZyBtb2RlbFZhbGlkYXRpb25UYXJnZXQpDQotICAgIHsNCi0gICAgICAgIEVMSGVscGVyIGVsSGVscGVyID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKTsNCi0NCi0gICAgICAgIGlmKGVsSGVscGVyLmlzRUxUZXJtV2VsbEZvcm1lZChtb2RlbFZhbGlkYXRpb25UYXJnZXQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGVsSGVscGVyLmlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCBtb2RlbFZhbGlkYXRpb25UYXJnZXQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVsSGVscGVyLmdldFZhbHVlT2ZFeHByZXNzaW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24obW9kZWxWYWxpZGF0aW9uVGFyZ2V0KSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRXJyb3JFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCJhbiBpbnZhbGlkIGJpbmRpbmcgaXMgdXNlZDogIiArIG1vZGVsVmFsaWRhdGlvblRhcmdldCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmdbXSBwcm9wZXJ0aWVzID0gbW9kZWxWYWxpZGF0aW9uVGFyZ2V0LnNwbGl0KCJcXC4iKTsNCi0NCi0gICAgICAgIE9iamVjdCByZXN1bHQgPSBtZXRhRGF0YVNvdXJjZU9iamVjdDsNCi0gICAgICAgIGZvcihTdHJpbmcgcHJvcGVydHkgOiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IGdldFZhbHVlT2ZQcm9wZXJ0eShyZXN1bHQsIHByb3BlcnR5KTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5ISUdILCBkZXNjcmlwdGlvbiA9ICJtb3ZlIHRvIHV0aWwgY2xhc3MgLSB0aGUgb3JpZ2luYWwgbWV0aG9kIGlzIGluIExvY2FsQ29tcGFyZVN0cmF0ZWd5IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRWYWx1ZU9mUHJvcGVydHkoT2JqZWN0IGJhc2UsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEsIHByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgICAgIE1ldGhvZCB0YXJnZXRNZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoYmFzZS5nZXRDbGFzcygpLCAiZ2V0IiArIHByb3BlcnR5KTsNCi0NCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZChiYXNlLmdldENsYXNzKCksICJpcyIgKyBwcm9wZXJ0eSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAiY2xhc3MgIiArIGJhc2UuZ2V0Q2xhc3MoKSArICIgaGFzIG5vIHB1YmxpYyBnZXQvaXMgIiArIHByb3BlcnR5LnRvTG93ZXJDYXNlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZChiYXNlLCB0YXJnZXRNZXRob2QpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q5ZDEyMC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhblZhbGlkYXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjMNCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkhJR0gsIGRlc2NyaXB0aW9uID0gInNlbGVjdCBmaW5hbCB0cmFuc2Zvcm1lciIpDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhKQ0KLSAgICB7DQotICAgICAgICBpZihpc1N1cHBvcnRlZENvbnN0cmFpbnQobWV0YURhdGEuZ2V0VmFsdWUoQ29uc3RyYWludERlc2NyaXB0b3IuY2xhc3MpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vVE9ETw0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTdXBwb3J0ZWRDb25zdHJhaW50KENvbnN0cmFpbnREZXNjcmlwdG9yIGNvbnN0cmFpbnREZXNjcmlwdG9yKQ0KLSAgICB7DQotICAgICAgICBpZighY29uc3RyYWludERlc2NyaXB0b3IuZ2V0QW5ub3RhdGlvbigpLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgc2ltcGxlTmFtZSA9IGNvbnN0cmFpbnREZXNjcmlwdG9yLmdldEFubm90YXRpb24oKS5hbm5vdGF0aW9uVHlwZSgpLmdldFNpbXBsZU5hbWUoKTsNCi0NCi0gICAgICAgIHJldHVybiBzaW1wbGVOYW1lLmVxdWFscygiU2l6ZSIpIHx8IHNpbXBsZU5hbWUuZXF1YWxzKCJQYXR0ZXJuIikgfHwgc2ltcGxlTmFtZS5lcXVhbHMoIk5vdE51bGwiKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9EZWZhdWx0QmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI5NTlmYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXINCi0gICAgICAgIC5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyLkJlYW5WYWxpZGF0aW9uTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIERlZmF1bHRCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZighKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBCZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXIuY2xhc3MuZ2V0TmFtZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wcm9wZXJ0eS9CZWFuVmFsaWRhdGlvblByb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvcHJvcGVydHkvQmVhblZhbGlkYXRpb25Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDg0OWZjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wcm9wZXJ0eS9CZWFuVmFsaWRhdGlvblByb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wcm9wZXJ0eTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBCZWFuVmFsaWRhdGlvblByb3BlcnR5SW5mb3JtYXRpb25LZXlzDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUUkFJTlRfVklPTEFUSU9OUyA9ICJjb25zdHJhaW50X3Zpb2xhdGlvbnMiOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RhcnR1cC9CZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0YXJ0dXAvQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkYzFmMi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RhcnR1cC9CZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuQmVhblZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkdyb3VwUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcg0KLSAgICAgICAgLkRlZmF1bHRCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkhJR0gsIGRlc2NyaXB0aW9uID0gImFkZCBvcHRpb25hbCB3ZWIueG1sIHBhcmFtIHRvIGRlYWN0aXZhdGUiICsNCi0gICAgICAgICJEZWZhdWx0QmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MDI1NzQ4Mzk5ODc2ODMzMzk0TDsNCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgQmVhblZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsNCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgVmFsaWRhdGlvbkdyb3VwUHJvdmlkZXIoKSk7DQotDQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0QmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0YXJ0dXAvSlNGMkF3YXJlQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdGFydHVwL0pTRjJBd2FyZUJlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YzE5ODguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0YXJ0dXAvSlNGMkF3YXJlQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yLlJlc2V0QmVhblZhbGlkYXRpb25SZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5pbnRlcmNlcHRvci5CZWFuVmFsaWRhdGlvblRhZ0F3YXJlVmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDIueC4zDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5ISUdILCBkZXNjcmlwdGlvbiA9ICJhZGQgb3B0aW9uYWwgd2ViLnhtbCBwYXJhbSB0byBkZWFjdGl2YXRlIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKU0YyQXdhcmVCZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTAyNTc0ODM5OTg3NjgzMzM5M0w7DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFJlc2V0QmVhblZhbGlkYXRpb25SZW5kZXJlckludGVyY2VwdG9yKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBCZWFuVmFsaWRhdGlvblRhZ0F3YXJlVmFsaWRhdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvbkVudHJ5LmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjIwZTEzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4zDQotICovDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvbkVudHJ5DQotew0KLSAgICBwcml2YXRlIFVJQ29tcG9uZW50IGNvbXBvbmVudDsNCi0gICAgcHJpdmF0ZSBNb2RlbFZhbGlkYXRpb24gbWV0YURhdGE7DQotICAgIHByaXZhdGUgTGlzdDxDbGFzcz4gZ3JvdXBzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgcHJpdmF0ZSBMaXN0PE9iamVjdD4gdmFsaWRhdGlvblRhcmdldHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0gICAgcHJpdmF0ZSBPYmplY3QgbWV0YURhdGFTb3VyY2VPYmplY3Q7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEdyb3VwKENsYXNzIGdyb3VwKQ0KLSAgICB7DQotICAgICAgICBpZighdGhpcy5ncm91cHMuY29udGFpbnMoZ3JvdXApKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCEodGhpcy5ncm91cHMgaW5zdGFuY2VvZiBBcnJheUxpc3QpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gbmV3R3JvdXBMaXN0ID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgICAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRDbGFzcyA6IHRoaXMuZ3JvdXBzKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBuZXdHcm91cExpc3QuYWRkKGN1cnJlbnRDbGFzcyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgdGhpcy5ncm91cHMgPSBuZXdHcm91cExpc3Q7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHRoaXMuZ3JvdXBzLmFkZChncm91cCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlR3JvdXAoQ2xhc3MgZ3JvdXApDQotICAgIHsNCi0gICAgICAgIHRoaXMuZ3JvdXBzLnJlbW92ZShncm91cCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkVmFsaWRhdGlvblRhcmdldChPYmplY3QgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBpZighdGhpcy52YWxpZGF0aW9uVGFyZ2V0cy5jb250YWlucyh0YXJnZXQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCEodGhpcy52YWxpZGF0aW9uVGFyZ2V0cyBpbnN0YW5jZW9mIEFycmF5TGlzdCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBMaXN0PE9iamVjdD4gdmFsaWRhdGlvblRhcmdldExpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0NCi0gICAgICAgICAgICAgICAgZm9yKE9iamVjdCBjdXJyZW50VGFyZ2V0IDogdGhpcy52YWxpZGF0aW9uVGFyZ2V0cykNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldExpc3QuYWRkKGN1cnJlbnRUYXJnZXQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvblRhcmdldHMgPSB2YWxpZGF0aW9uVGFyZ2V0TGlzdDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uVGFyZ2V0cy5hZGQodGFyZ2V0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBVSUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudChVSUNvbXBvbmVudCBjb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNb2RlbFZhbGlkYXRpb24gZ2V0TWV0YURhdGEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGEoTW9kZWxWYWxpZGF0aW9uIG1ldGFEYXRhKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhID0gbWV0YURhdGE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENsYXNzW10gZ2V0R3JvdXBzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzLnRvQXJyYXkobmV3IENsYXNzW3RoaXMuZ3JvdXBzLnNpemUoKV0pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwcyhMaXN0PENsYXNzPiBncm91cHMpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZ3JvdXBzID0gZ3JvdXBzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZ2V0VmFsaWRhdGlvblRhcmdldHMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblRhcmdldHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblRhcmdldHMoTGlzdDxPYmplY3Q+IHZhbGlkYXRpb25UYXJnZXRzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25UYXJnZXRzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRNZXRhRGF0YVNvdXJjZU9iamVjdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YVNvdXJjZU9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVNvdXJjZU9iamVjdChPYmplY3QgbWV0YURhdGFTb3VyY2VPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFTb3VyY2VPYmplY3QgPSBtZXRhRGF0YVNvdXJjZU9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICBpZiAodGhpcyA9PSBvKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSB0aGF0ID0gKE1vZGVsVmFsaWRhdGlvbkVudHJ5KSBvOw0KLQ0KLSAgICAgICAgaWYgKGNvbXBvbmVudCAhPSBudWxsID8gIWNvbXBvbmVudC5lcXVhbHModGhhdC5jb21wb25lbnQpIDogdGhhdC5jb21wb25lbnQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWdyb3Vwcy5lcXVhbHModGhhdC5ncm91cHMpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghdmFsaWRhdGlvblRhcmdldHMuZXF1YWxzKHRoYXQudmFsaWRhdGlvblRhcmdldHMpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgaW50IHJlc3VsdCA9IGNvbXBvbmVudCAhPSBudWxsID8gY29tcG9uZW50Lmhhc2hDb2RlKCkgOiAwOw0KLSAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBncm91cHMuaGFzaENvZGUoKTsNCi0gICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgdmFsaWRhdGlvblRhcmdldHMuaGFzaENvZGUoKTsNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTc2OWIwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLkV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0aW9uOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4zDQotICovDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzQ4MjIzMzg5MzE4NjcwODg3OEw7DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotICAgIHByaXZhdGUgVmFsaWRhdG9yRmFjdG9yeSB2YWxpZGF0aW9uRmFjdG9yeSA9IFZhbGlkYXRpb24uYnVpbGREZWZhdWx0VmFsaWRhdG9yRmFjdG9yeSgpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgcGhhc2VFdmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgianNyMzAzIHN0YXJ0IG1vZGVsIHZhbGlkYXRpb24iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJpZXMgPSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkNCi0gICAgICAgICAgICAgICAgLmdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXNPZkN1cnJlbnRSZXF1ZXN0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldFZpZXdJZCgpKTsNCi0NCi0gICAgICAgIExpc3QgcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMgPSBuZXcgQXJyYXlMaXN0KCk7DQotDQotICAgICAgICBmb3IgKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5IDogbW9kZWxWYWxpZGF0aW9uRW50cmllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cyk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJqc3IzMDMgdmFsaWRhdGlvbiBmaW5pc2hlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBMaXN0IHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzKQ0KLSAgICB7DQotICAgICAgICBmb3IgKE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0IDogbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0VmFsaWRhdGlvblRhcmdldHMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAocHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMuY29udGFpbnModmFsaWRhdGlvblRhcmdldCkgJiYNCi0gICAgICAgICAgICAgICAgICAgICFtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRNZXRhRGF0YSgpLmRpc3BsYXlJbmxpbmUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoIXByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzLmNvbnRhaW5zKHZhbGlkYXRpb25UYXJnZXQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMuYWRkKHZhbGlkYXRpb25UYXJnZXQpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxPYmplY3Q+PiB2aW9sYXRpb25zID0gdGhpcy52YWxpZGF0aW9uRmFjdG9yeS51c2luZ0NvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAgICAgLm1lc3NhZ2VJbnRlcnBvbGF0b3IoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKSkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0b3IoKQ0KLSAgICAgICAgICAgICAgICAgICAgLnZhbGlkYXRlKHZhbGlkYXRpb25UYXJnZXQsIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldEdyb3VwcygpKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9ucyAhPSBudWxsICYmIHZpb2xhdGlvbnMuc2l6ZSgpID4gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5yZW5kZXJSZXNwb25zZSgpOw0KLQ0KLSAgICAgICAgICAgICAgICAvL2pzZiAyLjAgaXMgYWJsZSB0byBkaXNwbGF5IG11bHRpcGxlIG1lc3NhZ2VzIHBlciBjb21wb25lbnQgLSBzbyBwcm9jZXNzIGFsbCB2aW9sYXRpb25zDQotICAgICAgICAgICAgICAgIC8vanNmIDwgMi4wIHdpbGwganVzdCB1c2UgdGhlIGZpcnN0IG9uZSAoaXQncyBvbmx5IGEgbGl0dGxlIG92ZXJoZWFkKQ0KLSAgICAgICAgICAgICAgICBJdGVyYXRvciB2aW9sYXRpb25zSXRlcmF0b3IgPSB2aW9sYXRpb25zLml0ZXJhdG9yKCk7DQotICAgICAgICAgICAgICAgIENvbnN0cmFpbnRWaW9sYXRpb24gY29uc3RyYWludFZpb2xhdGlvbjsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKHZpb2xhdGlvbnNJdGVyYXRvci5oYXNOZXh0KCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb24gPSAoQ29uc3RyYWludFZpb2xhdGlvbikgdmlvbGF0aW9uc0l0ZXJhdG9yLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRNZXRhRGF0YSgpLmRpc3BsYXlJbmxpbmUoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29uc3RyYWludFZpb2xhdGlvbihjb25zdHJhaW50VmlvbGF0aW9uLCBtb2RlbFZhbGlkYXRpb25FbnRyeSwgdmFsaWRhdGlvblRhcmdldCwgdHJ1ZSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnN0cmFpbnRWaW9sYXRpb24oY29uc3RyYWludFZpb2xhdGlvbiwgbW9kZWxWYWxpZGF0aW9uRW50cnksIHZhbGlkYXRpb25UYXJnZXQsIGZhbHNlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlRocm93YWJsZUluc3RhbmNlTmV2ZXJUaHJvd24ifSkNCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5ISUdILCBkZXNjcmlwdGlvbiA9ICJ1c2UgRXh0VmFsVXRpbHMjY3JlYXRlRmFjZXNNZXNzYWdlIiArDQotICAgICAgICAgICAgImNoZWNrIEV4dFZhbFV0aWxzI2V4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzIikNCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb25zdHJhaW50VmlvbGF0aW9uKENvbnN0cmFpbnRWaW9sYXRpb24gdmlvbGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGlzcGxheUF0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmlvbGF0aW9uTWVzc2FnZSA9IHZpb2xhdGlvbi5nZXRNZXNzYWdlKCk7DQotDQotICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uID0gbmV3IFZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgbmV3IEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsIHZpb2xhdGlvbk1lc3NhZ2UsIHZpb2xhdGlvbk1lc3NhZ2UpKTsNCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCA9IG51bGw7DQotICAgICAgICBTdHJpbmcgY2xpZW50SWQgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKGRpc3BsYXlBdENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB1aUNvbXBvbmVudCA9IG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpOw0KLSAgICAgICAgICAgIGNsaWVudElkID0gbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICghTW9kZWxWYWxpZGF0aW9uLkRFRkFVTFRfTUVTU0FHRS5lcXVhbHMobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0TWV0YURhdGEoKS5tZXNzYWdlKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNZXNzYWdlID0gIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkNCi0gICAgICAgICAgICAgICAgICAgIC5pbnRlcnBvbGF0ZShtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRNZXRhRGF0YSgpLm1lc3NhZ2UoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0aW9uLmdldENvbnN0cmFpbnREZXNjcmlwdG9yKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQpOw0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKS5zZXRTdW1tYXJ5KHZhbGlkYXRpb25FcnJvck1lc3NhZ2UpOw0KLSAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKS5zZXREZXRhaWwodmFsaWRhdGlvbkVycm9yTWVzc2FnZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBFeHRWYWxVdGlscy5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgIG51bGwsDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgbnVsbCk7DQotDQotICAgICAgICBpZiAodmlvbGF0aW9uTWVzc2FnZS5lcXVhbHModmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldFN1bW1hcnkoKSkgfHwNCi0gICAgICAgICAgICAgICAgdmlvbGF0aW9uTWVzc2FnZS5lcXVhbHModmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldERldGFpbCgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc0NvbnRleHQuYWRkTWVzc2FnZShjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgICAgIG5ldyBGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLCB2aW9sYXRpb25NZXNzYWdlLCB2aW9sYXRpb25NZXNzYWdlKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNDb250ZXh0LmFkZE1lc3NhZ2UoY2xpZW50SWQsIHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBwaGFzZUV2ZW50KQ0KLSAgICB7DQotICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuVVBEQVRFX01PREVMX1ZBTFVFUzsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9tZXNzYWdlL2ludGVycG9sYXRvci9EZWZhdWx0TWVzc2FnZUludGVycG9sYXRvci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vbWVzc2FnZS9pbnRlcnBvbGF0b3IvRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJhN2Q5YS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9tZXNzYWdlL2ludGVycG9sYXRvci9EZWZhdWx0TWVzc2FnZUludGVycG9sYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5tZXNzYWdlLmludGVycG9sYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludERlc2NyaXB0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvciBpbXBsZW1lbnRzIE1lc3NhZ2VJbnRlcnBvbGF0b3INCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotICAgIA0KLSAgICBwcml2YXRlIE1lc3NhZ2VJbnRlcnBvbGF0b3Igd3JhcHBlZDsNCi0NCi0gICAgcHVibGljIERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yKE1lc3NhZ2VJbnRlcnBvbGF0b3Igd3JhcHBlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGludGVycG9sYXRlKFN0cmluZyBtZXNzYWdlT3JLZXksIENvbnN0cmFpbnREZXNjcmlwdG9yIGNvbnN0cmFpbnREZXNjcmlwdG9yLCBPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGludGVycG9sYXRlKG1lc3NhZ2VPcktleSwgY29uc3RyYWludERlc2NyaXB0b3IsIG8sIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgaW50ZXJwb2xhdGUoU3RyaW5nIG1lc3NhZ2VPcktleSwgQ29uc3RyYWludERlc2NyaXB0b3IgY29uc3RyYWludERlc2NyaXB0b3IsIE9iamVjdCBvLCBMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkLmludGVycG9sYXRlKG1lc3NhZ2VPcktleSwgY29uc3RyYWludERlc2NyaXB0b3IsIG8sIGdldEN1cnJlbnRMb2NhbGUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExvY2FsZSBnZXRDdXJyZW50TG9jYWxlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0V4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9tZXNzYWdlL2ludGVycG9sYXRvci9FeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTg1YjdkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0V4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLm1lc3NhZ2UuaW50ZXJwb2xhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludERlc2NyaXB0b3I7DQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4zDQotICovDQotcHVibGljIGNsYXNzIEV4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyIGV4dGVuZHMgRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3INCi17DQotICAgIHByaXZhdGUgTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcjsNCi0NCi0gICAgcHVibGljIEV4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyKE1lc3NhZ2VJbnRlcnBvbGF0b3Igd3JhcHBlZCwgTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcikNCi0gICAgew0KLSAgICAgICAgc3VwZXIod3JhcHBlZCk7DQotICAgICAgICB0aGlzLm1lc3NhZ2VSZXNvbHZlciA9IG1lc3NhZ2VSZXNvbHZlcjsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBpbnRlcnBvbGF0ZShTdHJpbmcgbWVzc2FnZU9yS2V5LCBDb25zdHJhaW50RGVzY3JpcHRvciBjb25zdHJhaW50RGVzY3JpcHRvciwgT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShtZXNzYWdlT3JLZXksIGNvbnN0cmFpbnREZXNjcmlwdG9yLCBvLCBnZXRDdXJyZW50TG9jYWxlKCkpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGludGVycG9sYXRlKFN0cmluZyBtZXNzYWdlT3JLZXksIENvbnN0cmFpbnREZXNjcmlwdG9yIGNvbnN0cmFpbnREZXNjcmlwdG9yLCBPYmplY3QgbywgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5tZXNzYWdlUmVzb2x2ZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihtZXNzYWdlT3JLZXkuc3RhcnRzV2l0aCgieyIpICYmIG1lc3NhZ2VPcktleS5lbmRzV2l0aCgifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWVzc2FnZU9yS2V5ID0gdGhpcy5tZXNzYWdlUmVzb2x2ZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZShtZXNzYWdlT3JLZXkuc3Vic3RyaW5nKDEsIG1lc3NhZ2VPcktleS5sZW5ndGgoKSAtIDEpLCBnZXRDdXJyZW50TG9jYWxlKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCJ5b3UgdHJpZWQgdG8gdXNlIGFuIGV4dHZhbCBtZXNzYWdlLXJlc29sdmVyIGZvciIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJqc3IzMDMgdmFsaWRhdGlvbiB3aXRoIGFuIGludmFsaWQga2V5IC0+IHVzaW5nIGEgZGVmYXVsdCBpbnRlcnBvbGF0b3IiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3VwZXIuaW50ZXJwb2xhdGUobWVzc2FnZU9yS2V5LCBjb25zdHJhaW50RGVzY3JpcHRvciwgbywgZ2V0Q3VycmVudExvY2FsZSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FiYTU2OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludERlc2NyaXB0b3I7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4zDQotICovDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyIGltcGxlbWVudHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcml2YXRlIENvbnN0cmFpbnREZXNjcmlwdG9yIGNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLQ0KLSAgICBwdWJsaWMgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIoQ29uc3RyYWludERlc2NyaXB0b3IgY29uc3RyYWludERlc2NyaXB0b3IpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29uc3RyYWludERlc2NyaXB0b3IgPSBjb25zdHJhaW50RGVzY3JpcHRvcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInRoaXMgaXMganVzdCBhbiBhZGFwdGVyIGZvciBjb21wb25lbnQgaW5pdGlhbGl6YXRpb24iKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29uc3RyYWludERlc2NyaXB0b3IgZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29uc3RyYWludERlc2NyaXB0b3I7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wb20ueG1sIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMDRhMTAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotDQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPnZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFZhbGlkYXRpb24tTW9kdWxlczwvbmFtZT4NCi0gICAgPHZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4yLjAuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxzY20+DQotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy92YWxpZGF0aW9uLW1vZHVsZXM8L2Nvbm5lY3Rpb24+DQotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvdmFsaWRhdGlvbi1tb2R1bGVzPC9kZXZlbG9wZXJDb25uZWN0aW9uPg0KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvdmFsaWRhdGlvbi1tb2R1bGVzPC91cmw+DQotICAgIDwvc2NtPg0KLQ0KLSAgICA8bW9kdWxlcz4NCi0gICAgICAgIDxtb2R1bGU+cHJvcGVydHktdmFsaWRhdGlvbjwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5iZWFuLXZhbGlkYXRpb248L21vZHVsZT4NCi0gICAgPC9tb2R1bGVzPg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1OTA0MDYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgUHJvcGVydHktVmFsaWRhdGlvbi1Nb2R1bGU8L25hbWU+DQotICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPnZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgucGVyc2lzdGVuY2U8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGVyc2lzdGVuY2UtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzZi1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjAtYjExPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzZi1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4wLWIxMTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi41PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQuanNwPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc2hhbGU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2hhbGUtdGVzdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuNDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIA0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgPC9yZXNvdXJjZXM+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4yPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9BYnN0cmFjdCouamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9UZXN0VXRpbHMuamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qQmVhbi5qYXZhPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGM3NDE2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLQ0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYzQ4N2QuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFNlY3JldDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVMaXN0Ym94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVSYWRpbzsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueU1lbnU7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dGFyZWE7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBjb25maWd1cmVSZXF1aXJlZEF0dHJpYnV0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7Ci0gICAgICAgIGNvbmZpZ3VyZU1heExlbmd0aEF0dHJpYnV0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlUmVxdWlyZWRBdHRyaWJ1dGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYoIXByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZigoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQpKSB8fAotICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICAgICAgJiYKLSAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMoaXNDb21wb25lbnRSZXF1aXJlZCh1aUNvbXBvbmVudCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpICYmCi0gICAgICAgICAgICAgICAhQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lUmFkaW8gfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TGlzdGJveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpZiB0aGVyZSBpcyBubyBzcGVjaWFsIGF0dHJpYnV0ZSBhdCB0aGUgY29tcG9uZW50IHdoaWNoIHNob3VsZCBvdmVycnVsZQotICAgICAqIHRoZSBhbm5vdGF0ZWQgcHJvcGVydHkgcmV0dXJuIHRydWUhCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgY29tcG9uZW50IHdoaWNoIGltcGxlbWVudHMgdGhlIEVkaXRhYmxlVmFsdWVIb2xkZXIgaW50ZXJmYWNlCi0gICAgICogQHJldHVybiBmYWxzZSB0byBvdmVycnVsZSB0aGUgYW5ub3RhdGVkIHByb3BlcnR5IGUuZy4gaWYgY29tcG9uZW50IGlzIHJlYWRvbmx5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEJvb2xlYW4gaXNDb21wb25lbnRSZXF1aXJlZChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNSZWFkb25seSIpKSk7Ci0gICAgICAgIGJvb2xlYW4gaXNEaXNhYmxlZCA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNEaXNhYmxlZCIpKSk7Ci0KLSAgICAgICAgcmV0dXJuICEoaXNSZWFkT25seSB8fCBpc0Rpc2FibGVkKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVNYXhMZW5ndGhBdHRyaWJ1dGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1heExlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCk7Ci0KLSAgICAgICAgICAgIGlmKCEobWF4TGVuZ3RoIGluc3RhbmNlb2YgSW50ZWdlcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEh0bWxJbnB1dFRleHQgaHRtbElucHV0VGV4dCA9IChIdG1sSW5wdXRUZXh0KXVpQ29tcG9uZW50OwotICAgICAgICAgICAgICAgIGh0bWxJbnB1dFRleHQuc2V0TWF4bGVuZ3RoKChJbnRlZ2VyKW1heExlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2MyYTBlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5MYWJlbGVkTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRTZWNyZXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTWVudTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lUmFkaW87Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlDaGVja2JveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUxpc3Rib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHRhcmVhOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yCi17Ci0gICAgcHVibGljIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkKLSAgICB7Ci0gICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gRXh0VmFsVXRpbHMuY29udmVydEZhY2VzTWVzc2FnZSh2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkpOwotCi0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSAoU3RyaW5nKSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJnZXRMYWJlbCIpKTsKLQotICAgICAgICAgICAgaWYobGFiZWwgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsYWJlbCA9IHVpQ29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vb3ZlcnJpZGUgdGhlIGxhYmVsIGlmIHRoZSBhbm5vdGF0aW9uIHByb3ZpZGVzIGEgbGFiZWwKLSAgICAgICAgICAgIGlmKG1ldGFEYXRhRW50cnkgIT0gbnVsbCAmJiBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxhYmVsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCwgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoZmFjZXNNZXNzYWdlIGluc3RhbmNlb2YgTGFiZWxlZE1lc3NhZ2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChMYWJlbGVkTWVzc2FnZSlmYWNlc01lc3NhZ2UpLnNldExhYmVsVGV4dChsYWJlbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL2lmIHNvbWVvbmUgdXNlcyBhIG5vcm1hbCBmYWNlcyBtZXNzYWdlCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvUGxhY2VMYWJlbChmYWNlc01lc3NhZ2UsIGxhYmVsLCBpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lUmFkaW8gfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TGlzdGJveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWM4NjBlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uUmVuZGVyZXJJbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5yZWNvcmRlci5Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIobmV3IENyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyKCkpOw0KLQ0KLSAgICAgICAgaW5pdFN0YXRpY1N0cmF0ZWd5TWFwcGluZ3MoKTsNCi0gICAgICAgIGluaXREZWZhdWx0Q29tcG9uZW50SW5pdGlhbGl6ZXIoKTsNCi0gICAgICAgIGluaXREZWZhdWx0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCk7DQotICAgICAgICBhZGRTa2lwVmFsaWRhdGlvblN1cHBvcnQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFN0YXRpY1N0cmF0ZWd5TWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcganBhQmFzZWRWYWxpZGF0aW9uID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfSlBBX0JBU0VEX1ZBTElEQVRJT047DQotICAgICAgICBpZiAoanBhQmFzZWRWYWxpZGF0aW9uID09IG51bGwNCi0gICAgICAgICAgICAgICAgfHwgIWpwYUJhc2VkVmFsaWRhdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnID0gbmV3IFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgICAgIHN0YXRpY0NvbmZpZy5zZXRTb3VyY2VPZk1hcHBpbmcoDQotICAgICAgICAgICAgICAgIEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsiLmpwYV9zdHJhdGVneV9tYXBwaW5ncyIpOw0KLQ0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsIHN0YXRpY0NvbmZpZyk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gIndlYi54bWwgcGFyYW1ldGVyIHRvIGRlYWN0aXZhdGUgaXQiKQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdERlZmF1bHRDb21wb25lbnRJbml0aWFsaXplcigpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZENvbXBvbmVudEluaXRpYWxpemVyKG5ldyBIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAid2ViLnhtbCBwYXJhbWV0ZXIgdG8gZGVhY3RpdmF0ZSBpdCIpDQotICAgIHByaXZhdGUgdm9pZCBpbml0RGVmYXVsdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigNCi0gICAgICAgICAgICAgICAgbmV3IEh0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkU2tpcFZhbGlkYXRpb25TdXBwb3J0KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuaW5mbygiYWRkaW5nIHN1cHBvcnQgZm9yIEBTa2lwVmFsaWRhdGlvbiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZGVueVJlbmRlcmVySW50ZXJjZXB0b3IoVmFsaWRhdGlvblJlbmRlcmVySW50ZXJjZXB0b3IuY2xhc3MpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKG5ldyBWYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0KCkpOw0KLQ0KLSAgICAgICAgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgIC8vaXQncyBqdXN0IHJlcXVpcmVkIHRvIHNldCB0aGUgdGFyZ2V0DQotICAgICAgICBjb25maWcuYWRkTWFwcGluZyhDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCBTa2lwVmFsaWRhdGlvblN1cHBvcnQuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5TS0lQX1ZBTElEQVRJT05fU1VQUE9SVF9DT05GSUcsIGNvbmZpZyk7DQotDQotICAgICAgICAvL2NvbmZpZy5hZGRNYXBwaW5nKENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04sIFJlcXVpcmVkU3RyYXRlZ3kuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OWZhOGYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yV2l0aFNraXBWYWxpZGF0aW9uU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uUmVuZGVyZXJJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm9wZXJ0eVZhbGlkYXRpb25VdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25JbnRlcmNlcHRvcldpdGhTa2lwVmFsaWRhdGlvblN1cHBvcnQgZXh0ZW5kcyBWYWxpZGF0aW9uUmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIHNraXBWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpCi0gICAgewotICAgICAgICByZXR1cm4gUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZGF0aW9uU2tpcHBlZChmYWNlc0NvbnRleHQsIHZhbGlkYXRpb25TdHJhdGVneSwgbWV0YURhdGFFbnRyeSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzc3YTRlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFybid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJkb2N1bWVudGF0aW9uIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fTUVTU0FHRVNfSlBBID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMiKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9KUEFfQkFTRURfVkFMSURBVElPTiIpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vRG91YmxlUmFuZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2NkNGVmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIERvdWJsZVJhbmdlDQotew0KLSAgICBkb3VibGUgbWluaW11bSgpIGRlZmF1bHQgMDsNCi0NCi0gICAgZG91YmxlIG1heGltdW0oKSBkZWZhdWx0IERvdWJsZS5NQVhfVkFMVUU7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Kb2luVmFsaWRhdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YjUyYmYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgSm9pblZhbGlkYXRpb24NCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkNzVmYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTGVuZ3RoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgTGVuZ3RoDQotew0KLSAgICBpbnQgbWluaW11bSgpIGRlZmF1bHQgMDsNCi0NCi0gICAgaW50IG1heGltdW0oKSBkZWZhdWx0IEludGVnZXIuTUFYX1ZBTFVFOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzc1MmQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIExvbmdSYW5nZQ0KLXsNCi0gICAgbG9uZyBtaW5pbXVtKCkgZGVmYXVsdCAwOw0KLQ0KLSAgICBsb25nIG1heGltdW0oKSBkZWZhdWx0IExvbmcuTUFYX1ZBTFVFOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUGF0dGVybi5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1BhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY3N2RjOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFBhdHRlcm4NCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJub19tYXRjaCI7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZC5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNjViM2MuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUmVxdWlyZWQNCi17DQotICAgIC8qKg0KLSAgICAgKiB0byBjdXN0b21pemUgdGhlIGVycm9yIG1lc3NhZ2Ugb3INCi0gICAgICogdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQganNmIHJlcXVpcmVkIG1lc3NhZ2Ugd2l0aCB0aGUgdXNhZ2Ugb2YgdGhlIG1lc3NhZ2UgcmVzb2x2ZXIgbWVjaGFuaXNtDQotICAgICAqDQotICAgICAqIEByZXR1cm4gYW4gb3B0aW9uYWwgZXJyb3IgbWVzc2FnZSBrZXkNCi0gICAgICovDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJmaWVsZF9yZXF1aXJlZCI7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5N2VmODAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgU2tpcFZhbGlkYXRpb24NCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc5ZjY1MS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVGFyZ2V0KFRZUEUpCi1AUmV0ZW50aW9uKFJVTlRJTUUpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBAaW50ZXJmYWNlIFNraXBWYWxpZGF0aW9uU3VwcG9ydAotewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9WYWxpZGF0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0NTZkMC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgVmFsaWRhdG9yDQotew0KLSAgICBDbGFzczw/IGV4dGVuZHMgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcj5bXSB2YWx1ZSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWU4OTA1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IgZXh0ZW5kcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IKLXsKLSAgICBwcml2YXRlIERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGdldEluc3RhbmNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVJbnRlcmNlcHRlZE1ldGFEYXRhRXh0cmFjdG9yKG5ldyBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkKLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsKLQotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBQcm9wZXJ0eURldGFpbHMpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG9iamVjdC5nZXRDbGFzcygpICsgIiBpcyBub3QgYSAiICsgUHJvcGVydHlEZXRhaWxzLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gKFByb3BlcnR5RGV0YWlscylvYmplY3Q7Ci0KLSAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCk7Ci0KLSAgICAgICAgLy9UT0RPIHRlc3Qgd2l0aCBjb21wbGV4IGNvbXBvbmVudHMKLSAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5zZXRJbmZvcm1hdGlvbigKLSAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIHByb3BlcnR5RGV0YWlscyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZmluZCBhbmQgYWRkIGFubm90YXRpb25zCi0gICAgICAgICAqLwotICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU4MDEyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPVRoZSByZXF1aXJlZCBmb3JtYXRlIGlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2FiNTQzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPVx1MDYyN1x1MDY0NFx1MDYzNVx1MDY0YVx1MDYzYVx1MDYyOSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2MjZcdTA2MjkNCi1ub19tYXRjaF9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjM1XHUwNjRhXHUwNjNhXHUwNjI5IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzN1x1MDY0NFx1MDY0OFx1MDYyOFx1MDYyOSBcdTA2NDdcdTA2NDk6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZDY0OTAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW5vX21hdGNoPUZvcm1hdCBpbnZcdTAwZTBsaWQKLW5vX21hdGNoX2RldGFpbD1FbCBmb3JtYXQgcmVxdWVyaXQgXHUwMGU5czogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVlNzAxYi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1Vbmf8bHRpZ2VzIEZvcm1hdA0KLW5vX21hdGNoX2RldGFpbD1EYXMgZXJmb3JkZXJsaWNoZSBGb3JtYXQgaXN0OiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU4MDEyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPVRoZSByZXF1aXJlZCBmb3JtYXRlIGlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmIxMDc3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXRvIGludlx1MDBlMWxpZG8gCi1ub19tYXRjaF9kZXRhaWw9RWwgZm9ybWF0byByZXF1ZXJpZG8gZXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMGEyMjMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9TGUgZm9ybWF0IGVzdCBpbnZhbGlkZQ0KLW5vX21hdGNoX2RldGFpbD1MZSBmb3JtYXQgZG9pdCAmZWNpcmM7dHJlIGRlIGxhIGZvcm1lOiB7MH0NCi0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTg3NDhjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXRvIG5vbiB2YWxpZG8KLW5vX21hdGNoX2RldGFpbD1JbCBmb3JtYXRvIHJpY2hpZXN0byAmZWdyYXZlOzogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0YmM3NC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1HZVx1MDBlN2Vyc2l6IGJpXHUwMGU3aW0NCi1ub19tYXRjaF9kZXRhaWw9Z2VyZWtlbiBiaVx1MDBlN2ltOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFhZTY0Yi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgICAgIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZU5hbWUgPSBudWxsOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VOYW1lID0gc3VwZXIuZ2V0QmFzZU5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBiYXNlTmFtZTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NzZhZDkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIHRoZSBqcGEgc3VwcG9ydCBpcyBhbiBleGNlcHRpb24gaW4gdmlldyBvZiBzb21lIG1lY2hhbmlzbXMgLSBzbyB0aGVyZSdzIG5vIGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZS4NCi0gKiBpbnN0ZWFkIG9mIHRoZSBjb252ZW50aW9uIHRoZXJlIGlzIGEgZ2xvYmFsIHByb3BlcnR5IHRvIGhhdmUgYW4gYWx0ZXJuYXRpdmUgdG8gd2ViLnhtbCBjb25maWd1cmF0aW9uDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTID0gIkpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTIjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX05BTUUgPSBXZWJYbWxQYXJhbWV0ZXIuVkFMSURBVElPTl9NRVNTQUdFU19KUEE7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX05BTUUgPSBKcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MNCi0gICAgICAgICAgICAuZ2V0UGFja2FnZSgpLmdldE5hbWUoKS5yZXBsYWNlKCIubWVzc2FnZS5yZXNvbHZlciIsICIubWVzc2FnZS5idW5kbGUiKSsgIi5qcGFfbWVzc2FnZXMiOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYoQ1VTVE9NX0JBU0VfTkFNRSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBDVVNUT01fQkFTRV9OQU1FOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQkFTRV9OQU1FOw0KLSAgICB9DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWRkMThjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgRG91YmxlUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoRG91YmxlUmFuZ2UuY2xhc3MpOw0KLQ0KLSAgICAgICAgZG91YmxlIG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4sIG1pbmltdW0pOw0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCwgYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgaWYobWluaW11bSA+IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWNhNWM0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSm9pbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3Rvci5EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm9wZXJ0eVZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSm9pbk1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBleHRyYWN0b3IgPSBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmdldEluc3RhbmNlKCk7DQotDQotICAgICAgICBTdHJpbmdbXSB0YXJnZXRFeHByZXNzaW9ucyA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoSm9pblZhbGlkYXRpb24uY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdGFyZ2V0RXhwcmVzc2lvbiA6IHRhcmdldEV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogZXh0cmFjdG9yLmV4dHJhY3QoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscykuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSA9PSBudWxsIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZGF0aW9uU2tpcHBlZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3ksIGVudHJ5KSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IEV4dFZhbFV0aWxzLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXRBbGwobWV0YURhdGFUcmFuc2Zvcm1lci5jb252ZXJ0TWV0YURhdGEoZW50cnkpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYmZkYmEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkJhc2ljOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKcGFNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImltcGwuIHRoZSByZXN0IikNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGEuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyk7DQotDQotICAgICAgICBpZihhbm5vdGF0aW9uIGluc3RhbmNlb2YgQ29sdW1uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCEoKENvbHVtbikgYW5ub3RhdGlvbikubnVsbGFibGUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RILCAoKENvbHVtbikgYW5ub3RhdGlvbikubGVuZ3RoKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihhbm5vdGF0aW9uIGluc3RhbmNlb2YgQmFzaWMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoISgoQmFzaWMpIGFubm90YXRpb24pLm9wdGlvbmFsKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIElkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotICAgICAgICAvL1RPRE8gaW1wbC4gdGhlIHJlc3QhISENCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTGVuZ3RoTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9MZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYzVlZTMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9MZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBMZW5ndGggYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTGVuZ3RoLmNsYXNzKTsNCi0NCi0gICAgICAgIGludCBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW5pbXVtKCk7DQotDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSCwgbWluaW11bSk7DQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCwgYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgaWYobWluaW11bSA+IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Mb25nUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ4NWUyZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxvbmdSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIExvbmdSYW5nZSBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMb25nUmFuZ2UuY2xhc3MpOw0KLQ0KLSAgICAgICAgbG9uZyBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW5pbXVtKCk7DQotDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOLCBtaW5pbXVtKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgsIGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gPiAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0YTViNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1BhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5QYXR0ZXJuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIFBhdHRlcm4gYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoUGF0dGVybi5jbGFzcyk7DQotICAgICAgICANCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOLCAoYW5ub3RhdGlvbikudmFsdWUoKSk7DQotDQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5ID0gKGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICAgICAgTG9jYWxlIGN1cnJlbnRMb2NhbGUgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKTsNCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kgPQ0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZyA9IEV4dFZhbFV0aWxzLmdldE1lc3NhZ2VSZXNvbHZlckZvclZhbGlkYXRpb25TdHJhdGVneSh2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICAgICAgLmdldE1lc3NhZ2UodmFsaWRhdGlvbkVycm9yTXNnS2V5LCBjdXJyZW50TG9jYWxlKTsNCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRSwgdmFsaWRhdGlvbkVycm9yTXNnKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGY1YWE3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFJlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ta2lwTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ta2lwTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmI4MjU3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU2tpcE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgU2tpcE1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04sIHRydWUpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1ZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxNzQ4OS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1ZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBWYWxpZGF0b3IgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoVmFsaWRhdG9yLmNsYXNzKTsNCi0NCi0gICAgICAgIENsYXNzW10gdmFsaWRhdG9ycyA9IGFubm90YXRpb24udmFsdWUoKTsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRDbGFzcyA6IHZhbGlkYXRvcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoY3VycmVudENsYXNzLmdldFNpbXBsZU5hbWUoKS50b0xvd2VyQ2FzZSgpLmNvbnRhaW5zKENvbW1vbk1ldGFEYXRhS2V5cy5FTUFJTCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWx1ZS5hZGQoQ29tbW9uTWV0YURhdGFLZXlzLkVNQUlMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdmFsdWUuYWRkKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLkNVU1RPTSwgdmFsdWUpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3NTkzMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkRvdWJsZVJhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuRG91YmxlUmFuZ2VWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERvdWJsZVJhbmdlU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLQ0KLSAgICAgICAgRG91YmxlUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoRG91YmxlUmFuZ2UuY2xhc3MpOw0KLSAgICAgICAgRG91YmxlUmFuZ2VWYWxpZGF0b3IgZG91YmxlUmFuZ2VWYWxpZGF0b3IgPSAoRG91YmxlUmFuZ2VWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoImphdmF4LmZhY2VzLkRvdWJsZVJhbmdlIik7DQotDQotICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSm9pblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzI1NDlhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSm9pblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uZXh0cmFjdG9yLkRlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKb2luVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIGV4dHJhY3RvciA9IERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuZ2V0SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIFN0cmluZ1tdIHRhcmdldEV4cHJlc3Npb25zID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShKb2luVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdGFyZ2V0RXhwcmVzc2lvbiA6IHRhcmdldEV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogZXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCBwcm9wZXJ0eURldGFpbHMpLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLnByb2Nlc3NNZXRhRGF0YUVudHJ5QWZ0ZXJTa2lwVmFsaWRhdGlvbih2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgZW50cnkpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyB2YWxpZGF0aW9uIHN0cmF0ZWd5IGZvdW5kIGZvciAiICsgZW50cnkuZ2V0VmFsdWUoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSnBhVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MTRkOGUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkJhc2ljOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZTsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmU7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpwYVZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUZhY2VzQnVuZGxlID0gZmFsc2U7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFURV9MRU5HVEggPSAibGVuZ3RoIjsNCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmlvbGF0aW9uOw0KLSAgICBwcml2YXRlIGludCBtYXhMZW5ndGg7DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKTsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgQ29sdW1uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlQ29sdW1uQW5ub3RhdGlvbigoQ29sdW1uKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIEJhc2ljKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlQmFzaWNBbm5vdGF0aW9uKChCYXNpYykgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBJZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgT25lVG9PbmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVPbmVUb09uZUFubm90YXRpb24oKE9uZVRvT25lKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE1hbnlUb09uZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZU1hbnlUb09uZUFubm90YXRpb24oKE1hbnlUb09uZSkgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVDb2x1bW5Bbm5vdGF0aW9uKENvbHVtbiBjb2x1bW4sIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKCFjb2x1bW4ubnVsbGFibGUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCBpbnN0YW5jZW9mIFN0cmluZw0KLSAgICAgICAgICAgICAgICAmJiBjb2x1bW4ubGVuZ3RoKCkgPCAoKFN0cmluZykgY29udmVydGVkT2JqZWN0KS5sZW5ndGgoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbiA9IFZBTElEQVRFX0xFTkdUSDsNCi0gICAgICAgICAgICB0aGlzLm1heExlbmd0aCA9IGNvbHVtbi5sZW5ndGgoKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWFzc2FnZShudWxsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQmFzaWNBbm5vdGF0aW9uKEJhc2ljIGJhc2ljLCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICghYmFzaWMub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlT25lVG9PbmVBbm5vdGF0aW9uKE9uZVRvT25lIG9uZVRvT25lLCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIW9uZVRvT25lLm9wdGlvbmFsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU1hbnlUb09uZUFubm90YXRpb24oTWFueVRvT25lIG1hbnlUb09uZSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFtYW55VG9PbmUub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCB8fCBjb252ZXJ0ZWRPYmplY3QuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbiA9IENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRDsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWFzc2FnZShudWxsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoVkFMSURBVEVfTEVOR1RILmVxdWFscyh0aGlzLnZpb2xhdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJmaWVsZF90b29fbG9uZyI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJmaWVsZF9yZXF1aXJlZCI7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHN1cGVyLmdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgIGlmIChWQUxJREFURV9MRU5HVEguZXF1YWxzKHRoaXMudmlvbGF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLCAiIiArIHRoaXMubWF4TGVuZ3RoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc3VwZXIucmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0gICAgICAgIFN0cmluZyBtYXJrZXIgPSBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5NSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0NCi0gICAgICAgIGlmKChtYXJrZXIgKyBrZXkgKyBtYXJrZXIpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudXNlRmFjZXNCdW5kbGUgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IGUuZ2V0RmFjZXNNZXNzYWdlKCk7DQotDQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKFZBTElEQVRFX0xFTkdUSC5lcXVhbHModGhpcy52aW9sYXRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0TWF4aW11bU1lc3NhZ2UoZmFjZXNNZXNzYWdlLCB0aGlzLm1heExlbmd0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xlbmd0aFN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xlbmd0aFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZDA1NTguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMZW5ndGhTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBMZW5ndGggYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTGVuZ3RoLmNsYXNzKTsNCi0gICAgICAgIExlbmd0aFZhbGlkYXRvciBsZW5ndGhWYWxpZGF0b3IgPSAoTGVuZ3RoVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5MZW5ndGgiKTsNCi0NCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTG9uZ1JhbmdlU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTG9uZ1JhbmdlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM1ODIwMi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Mb25nUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5Mb25nUmFuZ2VWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExvbmdSYW5nZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIExvbmdSYW5nZSBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMb25nUmFuZ2UuY2xhc3MpOw0KLSAgICAgICAgTG9uZ1JhbmdlVmFsaWRhdG9yIGxvbmdSYW5nZVZhbGlkYXRvciA9IChMb25nUmFuZ2VWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigiamF2YXguZmFjZXMuTG9uZ1JhbmdlIik7DQotDQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bShhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9QYXR0ZXJuU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAyODM5YS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUGF0dGVyblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBQYXR0ZXJuIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFBhdHRlcm4uY2xhc3MpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZXhwcmVzc2lvbiA6IGFubm90YXRpb24udmFsdWUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0ID09IG51bGwNCi0gICAgICAgICAgICAgICAgICAgIHx8ICFqYXZhLnV0aWwucmVnZXguUGF0dGVybi5jb21waWxlKGV4cHJlc3Npb24pLm1hdGNoZXIoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdC50b1N0cmluZygpKS5tYXRjaGVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG5ldyBGYWNlc01lc3NhZ2UoDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiksDQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24pLnJlcGxhY2UoInswfSIsIGV4cHJlc3Npb24pKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoUGF0dGVybikgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZXF1aXJlZFN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4Zjk5Ni4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFJlcXVpcmVkU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VGYWNlc0J1bmRsZSA9IGZhbHNlOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0ID09IG51bGwgfHwgY29udmVydGVkT2JqZWN0LmVxdWFscygiIikgfHwNCi0gICAgICAgICAgICAgICAgKGNvbnZlcnRlZE9iamVjdCBpbnN0YW5jZW9mIENvbGxlY3Rpb24gJiYgKChDb2xsZWN0aW9uKWNvbnZlcnRlZE9iamVjdCkuaXNFbXB0eSgpKSB8fA0KLSAgICAgICAgICAgICAgICAoY29udmVydGVkT2JqZWN0IGluc3RhbmNlb2YgTWFwICYmICgoTWFwKWNvbnZlcnRlZE9iamVjdCkuaXNFbXB0eSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWFzc2FnZShtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChSZXF1aXJlZCkgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHN1cGVyLnJlc29sdmVNZXNzYWdlKGtleSk7DQotICAgICAgICBTdHJpbmcgbWFya2VyID0gQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVI7DQotDQotICAgICAgICBpZigobWFya2VyICsga2V5ICsgbWFya2VyKS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnVzZUZhY2VzQnVuZGxlID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIGUpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMudXNlRmFjZXNCdW5kbGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKGUuZ2V0RmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIGUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvU2tpcFZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlODYxMDMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFNraXBWYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgU3RyaW5nW10gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbnMgPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFNraXBWYWxpZGF0aW9uLmNsYXNzKS52YWx1ZSgpOw0KLQ0KLSAgICAgICAgZm9yKFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uIDogdmFsdWVCaW5kaW5nRXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFZhbHVlT2ZFeHByZXNzaW9uKA0KLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlNLSVBfVkFMSURBVElPTiwgdHJ1ZSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiM2NjOTEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9WYWxpZGF0b3JTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uVmFsaWRhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotDQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcj5bXSB2YWxpZGF0b3JDbGFzc2VzID0NCi0gICAgICAgICAgICBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFZhbGlkYXRvci5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3IgdmFsaWRhdG9yOw0KLSAgICAgICAgZm9yIChDbGFzcyB2YWxpZGF0b3JDbGFzc05hbWUgOiB2YWxpZGF0b3JDbGFzc2VzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRvciA9IChqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yKSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHZhbGlkYXRvckNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRvciA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSh2YWxpZGF0b3JDbGFzc05hbWUuZ2V0TmFtZSgpICsgIiBub3QgZm91bmQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTM3ZWQwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWNlc0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogVGhpcyBwaGFzZSBsaXN0ZW5lciBwcm9jZXNzZXMgY3Jvc3MgdmFsaWRhdGlvbiBhcyBzb29uIGFzIGl0IGZpbmRzIGEgc3BlY2lhbCByZXF1ZXN0IHNjb3BlZCBzdG9yYWdlLjxici8+DQotICogU28gaXQncyBwb3NzaWJsZSB0byBhZGQgaW5mb3JtYXRpb24gZHVyaW5nIHRoZSBwcm9jZXNzIHZhbGlkYXRpb24gcGhhc2UuIEF0IHRoZSBlbmQgb2YgdGhpcyBwaGFzZSBpdCBnZXRzIHByb2Nlc3NlZC4NCi0gKiBBZnRlciB0aGF0IHRoZSBzdG9yYWdlIGdldHMgcmVzZXRlZC48cC8+DQotICogSWYgeW91IHByb3ZpZGUgYSBjdXN0b20gZXh0ZW5zaW9uIGFuZCB5b3UgYWRkIHRoZSBzYW1lIHN0b3JhZ2UgdHlwZSB3aXRoaW4gYSBkaWZmZXJlbnQgcGhhc2UsDQotICogaXQgYWxzbyBnZXRzIHByb2Nlc3NlZCBhdCB0aGUgZW5kIG9mIHRoYXQgcGhhc2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UgPSBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCk7DQotICAgICAgICAgICAgZm9yIChDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkgOiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkgaW5zdGFuY2VvZiBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5nZXRDbGFzcygpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5pdENyb3NzVmFsaWRhdGlvbiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBpZighRXh0VmFsVXRpbHMuZXhlY3V0ZUJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0Q29tcG9uZW50KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuY2xhc3MuZ2V0TmFtZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5wcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKGVudHJ5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhZGRNZXNzYWdlID0gdHJ1ZTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpIGluc3RhbmNlb2YgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1lc3NhZ2UgPSAoQm9vbGVhbilSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkuZ2V0Q2xhc3MoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuY2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0Q2xhc3MoKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmKGFkZE1lc3NhZ2UpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjZXNNZXNzYWdlICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldEZhY2VzQ29udGV4dCgpLmFkZE1lc3NhZ2UoZW50cnkuZ2V0Q2xpZW50SWQoKSwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RmFjZXNDb250ZXh0KCkucmVuZGVyUmVzcG9uc2UoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBmaW5hbGx5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0Q29tcG9uZW50KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuY2xhc3MuZ2V0TmFtZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBmaW5hbGx5DQotICAgICAgICB7DQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMucmVzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc0luaXRpYWxpemVkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04gIT0gbnVsbA0KLSAgICAgICAgICAgICAgICAgICAgJiYgV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEpzZlV0aWxzLmRlcmVnaXN0ZXJQaGFzZUxpc3RlbmVyKHRoaXMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpc0luaXRpYWxpemVkID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLkFOWV9QSEFTRTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYjNkZjAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlDQotew0KLSAgICBwcml2YXRlIExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcyA9IA0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZChDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMuYWRkKGVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+IGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcykNCi0gICAgew0KLSAgICAgICAgdGhpcy5jcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNGMwNDAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneS5Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeQ0KLXsNCi0gICAgcHJpdmF0ZSBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnk7DQotICAgIC8vZm9yIGNvbXBsZXggY29tcG9uZW50cyAoZS5nLiBhIHRhYmxlKSBzdG9yZXMgdGhlIG9iamVjdCBvZiBlbnRyeSAoI3tlbnRyeS5wcm9wZXJ0eX0pDQotICAgIHByaXZhdGUgVUlDb21wb25lbnQgY29tcG9uZW50Ow0KLSAgICBwcml2YXRlIE9iamVjdCBjb252ZXJ0ZWRPYmplY3Q7DQotICAgIHByaXZhdGUgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAvL2p1c3QgZm9yIGlucHV0IGNvbXBvbmVudHMgd2l0aGluIGNvbXBsZXggY29tcG9uZW50cyBlLmcuIGRhdGFUYWJsZSwuLi4NCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50SWQ7DQotDQotICAgIHB1YmxpYyBNZXRhRGF0YUVudHJ5IGdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFFbnRyeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YUVudHJ5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YUVudHJ5ID0gbWV0YURhdGFFbnRyeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVUlDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnQoVUlDb21wb25lbnQgY29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldENvbnZlcnRlZE9iamVjdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkT2JqZWN0KE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29udmVydGVkT2JqZWN0ID0gY29udmVydGVkT2JqZWN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25TdHJhdGVneShDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsaWRhdGlvblN0cmF0ZWd5ID0gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY2xpZW50SWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50SWQoU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNsaWVudElkID0gY2xpZW50SWQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTMxM2Q4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1Byb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEluIG9yZGVyIHRvIGJ1aWxkIHVwIGEgbWFwcGluZyB3aGljaCBpcyB1c2VkIGZvciBjcm9zcy12YWxpZGF0aW9uLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeQotewotICAgIHByaXZhdGUgT2JqZWN0IGJlYW47Ci0gICAgcHJpdmF0ZSBPYmplY3QgY29udmVydGVkVmFsdWU7Ci0gICAgcHJpdmF0ZSBVSUNvbXBvbmVudCBjb21wb25lbnQ7Ci0gICAgLy9mb3IgY29tcGxleCBjb21wb25lbnRzIChlLmcuIGEgdGFibGUgdGhlcmUgYXJlIG11bHRpcGxlIGVudHJpZXMgd2l0aAotICAgIC8vdGhlIHNhbWUga2V5IChoZXJlIHRoZSBlbCBleHByZXNzaW9uICN7ZW50cnkucHJvcGVydHl9KQotICAgIC8vaG93ZXZlciwgZG9uJ3Qgb3ZlcnJpZGUgdGhlIHByZXZpb3VzIGVudHJ5IC0gdGhleSBhcm4ndCB0aGUgc2FtZTsKLSAgICBwcml2YXRlIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4gZnVydGhlckVudHJpZXM7Ci0gICAgLy9qdXN0IGZvciBpbnB1dCBjb21wb25lbnRzIHdpdGhpbiBjb21wbGV4IGNvbXBvbmVudHMgZS5nLiBkYXRhVGFibGUsLi4uCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50SWQ7Ci0KLSAgICAvKgotICAgICAqIGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmVhbigpCi0gICAgewotICAgICAgICByZXR1cm4gYmVhbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCZWFuKE9iamVjdCBiZWFuKQotICAgIHsKLSAgICAgICAgdGhpcy5iZWFuID0gYmVhbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZWRWYWx1ZShPYmplY3QgY29udmVydGVkVmFsdWUpCi0gICAgewotICAgICAgICB0aGlzLmNvbnZlcnRlZFZhbHVlID0gY29udmVydGVkVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFVJQ29tcG9uZW50IGdldENvbXBvbmVudCgpCi0gICAgewotICAgICAgICByZXR1cm4gY29tcG9uZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudChVSUNvbXBvbmVudCBjb21wb25lbnQpCi0gICAgewotICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudElkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjbGllbnRJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGllbnRJZChTdHJpbmcgY2xpZW50SWQpCi0gICAgewotICAgICAgICB0aGlzLmNsaWVudElkID0gY2xpZW50SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4gZ2V0RnVydGhlckVudHJpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZ1cnRoZXJFbnRyaWVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZ1cnRoZXJFbnRyaWVzKExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4gZnVydGhlckVudHJpZXMpCi0gICAgewotICAgICAgICB0aGlzLmZ1cnRoZXJFbnRyaWVzID0gZnVydGhlckVudHJpZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM0MDI3OS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFybid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0NST1NTVkFMSURBVElPTiIpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJcy5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzNWExZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgRGF0ZUlzDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZU9mKCk7DQotDQotICAgIC8qDQotICAgICAqIG9wdGlvbmFsIHNlY3Rpb24NCi0gICAgICovDQotDQotICAgIERhdGVJc1R5cGUgdHlwZSgpIGRlZmF1bHQgRGF0ZUlzVHlwZS5zYW1lOw0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiIjsNCi0NCi0gICAgU3RyaW5nIG5vdEJlZm9yZUVycm9yTXNnS2V5KCkgZGVmYXVsdCAid3JvbmdfZGF0ZV9ub3RfYmVmb3JlIjsNCi0NCi0gICAgU3RyaW5nIG5vdEFmdGVyRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJ3cm9uZ19kYXRlX25vdF9hZnRlciI7DQotDQotICAgIFN0cmluZyBub3RFcXVhbEVycm9yTXNnS2V5KCkgZGVmYXVsdCAid3JvbmdfZGF0ZV9ub3RfZXF1YWwiOw0KLQ0KLSAgICBpbnQgZXJyb3JNZXNzYWdlRGF0ZVN0eWxlKCkgZGVmYXVsdCBEYXRlRm9ybWF0Lk1FRElVTTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJc1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1ZjQ4Mi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJc1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImJlZm9yZU9yU2FtZSwgYWZ0ZXJPclNhbWUiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBlbnVtIERhdGVJc1R5cGUNCi17DQotICAgIGJlZm9yZSwgYWZ0ZXIsIHNhbWUNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NDc4OTguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgRXF1YWxzDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZSgpOw0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkIjsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9Ob3RFcXVhbHMuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ODE3NjIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9Ob3RFcXVhbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgTm90RXF1YWxzDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZSgpOw0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZHVwbGljYXRlZF9jb250ZW50X2RlbmllZCI7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYjZkYjEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFJlcXVpcmVkSWYNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlT2YoKTsNCi0NCi0gICAgLyoNCi0gICAgICogb3B0aW9uYWwgc2VjdGlvbg0KLSAgICAgKi8NCi0NCi0gICAgUmVxdWlyZWRJZlR5cGUgaXMoKSBkZWZhdWx0IFJlcXVpcmVkSWZUeXBlLm5vdF9lbXB0eTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImVtcHR5X2ZpZWxkIjsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmVHlwZS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWM1OGQ5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGVudW0gUmVxdWlyZWRJZlR5cGUNCi17DQotICAgIGVtcHR5LCBub3RfZW1wdHkNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjYwNzU5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9SW5wdXQgaXMgZGlmZmVyZW50DQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1JbnB1dCBpcyBkaWZmZXJlbnQNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLQ0KLXdyb25nX2RhdGU9V3JvbmcgZGF0ZQ0KLXdyb25nX2RhdGVfZGV0YWlsPVdyb25nIGRhdGUNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZmOTNjNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPVx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDVcdTA2MmVcdTA2MmFcdTA2NDRcdTA2NDENCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDVcdTA2MmVcdTA2MmFcdTA2NDRcdTA2NDENCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPVx1MDYzYVx1MDY0YVx1MDYzMSBcdTA2NDVcdTA2MzNcdTA2NDVcdTA2NDhcdTA2MmQgXHUwNjI4XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0IFx1MDY0NiBcdTA2NDFcdTA2MzMgXHUwNjQyXHUwNjRhXHUwNjQ1XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPVx1MDYzYVx1MDY0YVx1MDYzMSBcdTA2NDVcdTA2MzNcdTA2NDVcdTA2NDhcdTA2MmQgXHUwNjI4XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0ICBcdTA2NDZcdTA2NDFcdTA2MzMgXHUwNjQyXHUwNjRhXHUwNjQ1XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NA0KLQ0KLXdyb25nX2RhdGU9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDYyZVx1MDYyN1x1MDYzN1x1MDY0OVx1MDYyMQ0KLXdyb25nX2RhdGVfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2NDlcdTA2MjENCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzXHUwNjQ4IFx1MDY0NiBcdTA2MjhcdTA2MzlcdTA2MmYgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDMgXHUwNjQ4XHUwNjQ2IFx1MDYyOFx1MDYzOVx1MDYyZiB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDNcdTA2NDggXHUwNjQ2IFx1MDY0Mlx1MDYyOFx1MDY0NCB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzIFx1MDY0OFx1MDY0NiBcdTA2NDJcdTA2MjhcdTA2NDQgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0NFx1MDYyNyBcdTA2NGFcdTA2MzNcdTA2MjdcdTA2NDhcdTA2NDkgezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NDRcdTA2MjcgXHUwNjRhXHUwNjMzXHUwNjI3XHUwNjQ4XHUwNjQ5IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1NGVkMi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1lbCB2YWxvciBcdTAwZTkgZGlmZXJlbnQKLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9ZWwgdmFsb3IgXHUwMGU5IGRpZmVyZW50Ci0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9bm8gZXMgcGVybWV0IGVsIG1hdGVpeCB2YWxvcgotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9bm8gZXMgcGVybWV0IGVsIG1hdGVpeCB2YWxvcgotCi13cm9uZ19kYXRlPWRhdGEgZXJyXHUwMGYybmlhCi13cm9uZ19kYXRlX2RldGFpbD1kYXRhIGVyclx1MDBmMm5pYQotCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9bGEgZGF0YSBoYSBkZSBzZXIgcG9zdGVyaW9yIGEgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotCi13cm9uZ19kYXRlX25vdF9hZnRlcj1sYSBkYXRhIGhhIGRlIHNlciBhbnRlcmlvciBhIHswfQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotCi13cm9uZ19kYXRlX25vdF9lcXVhbD1sYSBkYXRhIG5vIFx1MDAwZTlzIGlndWFsIGEgezB9Ci13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9bGEgZGF0YSBubyBcdTAwMGU5cyBpZ3VhbCBhIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4NzIzNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUVpbmdhYmUgaXN0IHVudGVyc2NoaWVkbGljaA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9RWluZ2FiZSBpc3QgdW50ZXJzY2hpZWRsaWNoDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1EZXIgZ2xlaWNoZSBXZXJ0IGlzdCBuaWNodCBlcmxhdWJ0DQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9RGVyIGdsZWljaGUgV2VydCBpc3QgbmljaHQgZXJsYXVidA0KLQ0KLXdyb25nX2RhdGU9RGF0dW0gaW5rb3JyZWt0DQotd3JvbmdfZGF0ZV9kZXRhaWw9RGF0dW0gaW5rb3JyZWt0DQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhcyBEYXR1bSBtdXNzIG5hY2ggZGVtIHswfSBzZWluDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1EYXMgRGF0dW0gbXVzcyBuYWNoIGRlbSB7MH0gc2Vpbg0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPURhcyBEYXR1bSBtdXNzIHZvciBkZW0gezB9IHNlaW4NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9RGFzIERhdHVtIG11c3Mgdm9yIGRlbSB7MH0gc2Vpbg0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPURhcyBEYXR1bSBlbnRzcHJpY2h0IG5pY2h0IGRlbSB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGFzIERhdHVtIGVudHNwcmljaHQgbmljaHQgZGVtIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2MDc1OS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUlucHV0IGlzIGRpZmZlcmVudA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9SW5wdXQgaXMgZGlmZmVyZW50DQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi0NCi13cm9uZ19kYXRlPVdyb25nIGRhdGUNCi13cm9uZ19kYXRlX2RldGFpbD1Xcm9uZyBkYXRlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMzg1MjQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9bGEgZW50cmFkYSBlcyBkaWZlcmVudGUKLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9bGEgZW50cmFkYSBlcyBkaWZlcmVudGUKLQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1ubyBzZSBwZXJtaXRlbiBlbnRyYWRhcyBpZ3VhbGVzCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1ubyBzZSBwZXJtaXRlbiBlbnRyYWRhcyBpZ3VhbGVzCi0KLXdyb25nX2RhdGU9ZmVjaGEgZXF1aXZvY2FkYQotd3JvbmdfZGF0ZV9kZXRhaWw9ZmVjaGEgZXF1aXZvY2FkYQotCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBsdWVnbyBkZSB7MH0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBsdWVnbyBkZSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBhbnRlcyBkZSB7MH0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGFudGVzIGRlIHswfQotCi13cm9uZ19kYXRlX25vdF9lcXVhbD1sYSBmZWNoYSBubyBlcyBpZ3VhbCBhIHswfQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPWxhIGZlY2hhIG5vIGVzIGlndWFsIGEgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWYwMjE4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9TGVzIGNoYW1wcyBzb250IGRpZmYmZWFjdXRlO3JlbnRzDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1MZXMgY2hhbXBzIHNvbnQgZGlmZiZlYWN1dGU7cmVudHMNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPUxlcyBjaGFtcHMgZG9pdmVudCAmZWNpcmM7dHJlIGRpZmYmZWFjdXRlO3JlbnRzDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9TGVzIGNoYW1wcyBkb2l2ZW50ICZlY2lyYzt0cmUgZGlmZiZlYWN1dGU7cmVudHMNCi0NCi13cm9uZ19kYXRlPUxhIGRhdGUgZXN0IGluY29ycmVjdGUNCi13cm9uZ19kYXRlX2RldGFpbD1MYSBkYXRlIGVzdCBpbmNvcnJlY3RlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGFwciZlZ3JhdmU7cyB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGFwciZlZ3JhdmU7cyB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhdmFudCB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXZhbnQgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9TGEgZGF0ZSBuJ2VzdCBwYXMgJmVhY3V0ZTtnYWxlICZhZ3JhdmU7IHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1MYSBkYXRlIG4nZXN0IHBhcyAmZWFjdXRlO2dhbGUgJmFncmF2ZTsgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDQyODAxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPVZhbG9yaSBub24gdWd1YWxpCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUkgdmFsb3JpIGluc2VyaXRpIG5vbiBjb2luY2lkb25vCi0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9TG8gc3Rlc3NvIHZhbG9yZSBub24gJmVncmF2ZTsgcGVybWVzc28KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPUxvIHN0ZXNzbyB2YWxvcmUgbm9uICZlZ3JhdmU7IHBlcm1lc3NvCi0KLXdyb25nX2RhdGU9RGF0YSBlcnJhdGEKLXdyb25nX2RhdGVfZGV0YWlsPURhdGEgZXJyYXRhCi0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1MYSBkYXRhIGRldmUgZXNzZXJlIGRvcG8gZGkgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPUxhIGRhdGEgZGV2ZSBlc3NlcmUgZG9wbyBkaSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9TGEgZGF0YSBkZXZlIGVzc2VyZSBwcmltYSBkaSB7MH0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1MYSBkYXRhIGRldmUgZXNzZXJlIHByaW1hIGRpIHswfQotCi13cm9uZ19kYXRlX25vdF9lcXVhbD1MYSBkYXRhIG5vbiAmZWdyYXZlOyB1Z3VhbGUgYSB7MH0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1MYSBkYXRhIG5vbiAmZWdyYXZlOyB1Z3VhbGUgYSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZjZhOWQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1naXJpbGVuIGRlXHUwMTFmZXIgZmFya2xcdTAxMzENCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPWdpcmlsZW4gZGVcdTAxMWZlciBmYXJrbFx1MDEzMQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9YXluXHUwMTMxIGRlXHUwMTFmZXIgZ2lyaWxlbWV6DQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9YXluXHUwMTMxIGRlXHUwMTFmZXIgZ2lyaWxlbWV6DQotDQotd3JvbmdfZGF0ZT15YW5sXHUwMTMxXHUwMTVmIHRhcmloDQotd3JvbmdfZGF0ZV9kZXRhaWw9eWFubFx1MDEzMVx1MDE1ZiB0YXJpaA0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIHNvbnJhIG9sbWFsXHUwMTMxZFx1MDEzMXINCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gc29ucmEgb2xtYWxcdTAxMzFkXHUwMTMxcg0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gXHUwMGY2bmNlIG9sbWFsXHUwMTMxZFx1MDEzMXINCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBcdTAwZjZuY2Ugb2xtYWxcdTAxMzFkXHUwMTMxcg0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPXRhcmloIHswfSBkZVx1MDExZmVyaW5lIGVcdTAxNWZpdCBkZVx1MDExZmlsDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5lIGVcdTAxNWZpdCBkZVx1MDExZmlsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q3NjU5ZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLSAgICAgICAgZXh0ZW5kcw0KLSAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBiYXNlTmFtZSA9IG51bGw7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYgKGJhc2VOYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZU5hbWUgPSBzdXBlci5nZXRCYXNlTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGJhc2VOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlY29yZGVyL0Nyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWNvcmRlci9Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzQwYTAzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlY29yZGVyL0Nyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwucmVjb3JkZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLlByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIgaW1wbGVtZW50cyBQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyDQotew0KLSAgICBwdWJsaWMgdm9pZCByZWNvcmRVc2VySW5wdXQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgaWYgKCEodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICAvL3RvIHN1cHBvcnQgbG9jYWwgY3Jvc3MtdmFsaWRhdGlvbiAod2l0aGluIHRoZSBzYW1lIGVudGl0eSkNCi0gICAgICAgIE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nID0gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMNCi0gICAgICAgICAgICAuZ2V0T3JJbml0S2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcoKTsNCi0NCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgZW50cnk7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0NCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmKHByb3BlcnR5RGV0YWlscyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgZW50cnkgPSBuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSgpOw0KLSAgICAgICAgZW50cnkuc2V0QmVhbihwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpKTsNCi0gICAgICAgIGVudHJ5LnNldENvbnZlcnRlZFZhbHVlKHZhbHVlKTsNCi0gICAgICAgIGVudHJ5LnNldENvbXBvbmVudCh1aUNvbXBvbmVudCk7DQotICAgICAgICBlbnRyeS5zZXRDbGllbnRJZCh1aUNvbXBvbmVudC5nZXRDbGllbnRJZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpKTsNCi0NCi0gICAgICAgIFN0cmluZyBrZXkgPSBwcm9wZXJ0eURldGFpbHMuZ2V0S2V5KCk7DQotDQotICAgICAgICAvL2ZvciBsb2NhbCBjcm9zcy12YWxpZGF0aW9uDQotICAgICAgICBpZiAoa2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcuY29udGFpbnNLZXkoa2V5KSAmJg0KLSAgICAgICAgICAgIGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLmdldChrZXkpLmdldEJlYW4oKSAhPSBudWxsICYmDQotICAgICAgICAgICAgIWtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLmdldChrZXkpLmdldEJlYW4oKS5lcXVhbHMoZW50cnkuZ2V0QmVhbigpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2ZvciB0aGUgdmFsaWRhdGlvbiB3aXRoaW4gYSBjb21wbGV4IGNvbXBvbmVudCBlLmcuIGEgdGFibGUNCi0gICAgICAgICAgICAvL2Rvbid0IG92ZXJyaWRlIGV4aXN0aW5nIGV4cHJlc3Npb24gKHN0eWxlOiAje2VudHJ5LnByb3BlcnR5fSkgLSBtYWtlIGEgc3BlY2lhbCBtYXBwaW5nDQotDQotICAgICAgICAgICAgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBmdXJ0aGVyRW50cmllcyA9DQotICAgICAgICAgICAgICAgIGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLmdldChrZXkpLmdldEZ1cnRoZXJFbnRyaWVzKCk7DQotDQotICAgICAgICAgICAgaWYgKGZ1cnRoZXJFbnRyaWVzID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmdXJ0aGVyRW50cmllcyA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4oKTsNCi0NCi0gICAgICAgICAgICAgICAga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcuZ2V0KGtleSkuc2V0RnVydGhlckVudHJpZXMoZnVydGhlckVudHJpZXMpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBmdXJ0aGVyRW50cmllcy5hZGQoZW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZm9yIG5vcm1hbCB2YWxpZGF0aW9uDQotICAgICAgICAgICAga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcucHV0KGtleSwgZW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q29tcGFyZVN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2MxNTQ0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBzdGF0aWMgTGlzdDxSZWZlcmVuY2luZ1N0cmF0ZWd5PiByZWZlcmVuY2luZ1N0cmF0ZWdpZXM7DQotICAgIHByb3RlY3RlZCBNYXA8T2JqZWN0LCBPYmplY3Q+IHZpb2xhdGlvblJlc3VsdFN0b3JhZ2UgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgaW5pdFJlZmVyZW5jaW5nU3RyYXRlZ2llcygpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRSZWZlcmVuY2luZ1N0cmF0ZWdpZXMoKQ0KLSAgICB7DQotICAgICAgICBpZiAocmVmZXJlbmNpbmdTdHJhdGVnaWVzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzID0gbmV3IEFycmF5TGlzdDxSZWZlcmVuY2luZ1N0cmF0ZWd5PigpOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyBjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5Q2xhc3NOYW1lID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5CQVNFX1BBQ0tBR0UpICsgIlJlZmVyZW5jaW5nU3RyYXRlZ3kiOw0KLQ0KLSAgICAgICAgICAgIFJlZmVyZW5jaW5nU3RyYXRlZ3kgY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneSA9IChSZWZlcmVuY2luZ1N0cmF0ZWd5KSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5KTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgRUxDb21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICAgICAgLy9yZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBBbGlhc0NvbXBhcmVTdHJhdGVneSgpKTsNCi0gICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBMb2NhbENvbXBhcmVTdHJhdGVneSgpKTsNCi0gICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBMb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2luaXRDcm9zc1ZhbGlkYXRpb24gaXMgZG9uZSBpbiB0aGUgQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcg0KLQ0KLSAgICAgICAgU3RyaW5nW10gdmFsaWRhdGlvblRhcmdldHMgPSBnZXRWYWxpZGF0aW9uVGFyZ2V0cygNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQgOiB2YWxpZGF0aW9uVGFyZ2V0cykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0ID0gdmFsaWRhdGlvblRhcmdldC50cmltKCk7DQotDQotICAgICAgICAgICAgLy9zZWxlY3QgdmFsaWRhdGlvbiBtZXRob2QNCi0gICAgICAgICAgICB0cnlUb1ZhbGlkYXRlKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwgdmFsaWRhdGlvblRhcmdldCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIHRyeVRvVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQpDQotICAgIHsNCi0gICAgICAgIGZvciAoUmVmZXJlbmNpbmdTdHJhdGVneSByZWZlcmVuY2luZ1N0cmF0ZWd5IDogcmVmZXJlbmNpbmdTdHJhdGVnaWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChyZWZlcmVuY2luZ1N0cmF0ZWd5LmV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsIHZhbGlkYXRpb25UYXJnZXQsIHRoaXMpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVGhyb3dhYmxlSW5zdGFuY2VOZXZlclRocm93biJ9KQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UsDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZUYXJnZXQpDQotICAgIHsNCi0gICAgICAgIGlmICghaGFuZGxlVGFyZ2V0VmlvbGF0aW9uKGVudHJ5T2ZTb3VyY2UsIGVudHJ5T2ZUYXJnZXQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vbm8gdGFyZ2V0IC0gYmVjYXVzZSB0aGVyZSBpcyBubyB0YXJnZXQgY29tcG9uZW50IC0gdmFsdWUgd2FzIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBtb2RlbA0KLSAgICAgICAgICAgIGlmKGVudHJ5T2ZUYXJnZXQgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NUYXJnZXRDb21wb25lbnRBc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGVudHJ5T2ZTb3VyY2UpOw0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICAvL2dldCB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgdGFyZ2V0IGNvbXBvbmVudA0KLSAgICAgICAgU3RyaW5nIHN1bW1hcnkgPSBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCB0cnVlKTsNCi0gICAgICAgIFN0cmluZyBkZXRhaWxzID0gZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCB0cnVlKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGlvbiB0YXJnZXQgaXNuJ3QgYm91bmQgdG8gYSBjb21wb25lbnQgd2l0aGluZyB0aGUgY3VycmVudCBwYWdlIA0KLSAgICAgICAgLy8oc2VlIHZhbGlkYXRlRm91bmRFbnRyeSwgdHJ5VG9WYWxpZGF0ZUxvY2FsbHkgYW5kIHRyeVRvVmFsaWRhdGVCaW5kaW5nT25seSkNCi0gICAgICAgIGlmIChlbnRyeU9mVGFyZ2V0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZW50cnlPZlRhcmdldCA9IGVudHJ5T2ZTb3VyY2U7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZTsNCi0gICAgICAgIGlmIChlbnRyeU9mVGFyZ2V0LmdldE1ldGFEYXRhRW50cnkoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1lc3NhZ2UgPSBnZXRUYXJnZXRDb21wb25lbnRFcnJvck1lc3NhZ2UoDQotICAgICAgICAgICAgICAgIGVudHJ5T2ZUYXJnZXQuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCBzdW1tYXJ5LCBkZXRhaWxzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8gZG9jdW1lbnQgcG9zc2libGUgc2lkZSBlZmZlY3RzDQotICAgICAgICAgICAgLy9kdWUgdG8gYSBtaXNzaW5nIHRhcmdldCBhbm5vdGF0aW9uIChzZWU6IHRyeVRvVmFsaWRhdGVMb2NhbGx5KQ0KLSAgICAgICAgICAgIG1lc3NhZ2UgPSBnZXRUYXJnZXRDb21wb25lbnRFcnJvck1lc3NhZ2UoDQotICAgICAgICAgICAgICAgIGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCBzdW1tYXJ5LCBkZXRhaWxzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICgobWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCB8fCBtZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwpICYmDQotICAgICAgICAgICAgZW50cnlPZlNvdXJjZS5nZXRDbGllbnRJZCgpICE9IG51bGwgJiYgIWVudHJ5T2ZTb3VyY2UuZ2V0Q2xpZW50SWQoKS5lcXVhbHMoZW50cnlPZlRhcmdldC5nZXRDbGllbnRJZCgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uID0gbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihtZXNzYWdlKTsNCi0NCi0gICAgICAgICAgICBpZihFeHRWYWxVdGlscy5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5T2ZUYXJnZXQuZ2V0Q29tcG9uZW50KCksIGVudHJ5T2ZUYXJnZXQuZ2V0TWV0YURhdGFFbnRyeSgpLA0KLSAgICAgICAgICAgICAgICAgICAgZW50cnlPZlRhcmdldC5nZXRDb252ZXJ0ZWRPYmplY3QoKSwgdmFsaWRhdG9yRXhjZXB0aW9uLCB0aGlzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dC5hZGRNZXNzYWdlKGVudHJ5T2ZUYXJnZXQuZ2V0Q2xpZW50SWQoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb252ZXJ0RmFjZXNNZXNzYWdlKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1RhcmdldENvbXBvbmVudEFzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UpDQotICAgIHsNCi0gICAgICAgIC8vZ2V0IHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgICAgU3RyaW5nIHN1bW1hcnkgPSBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeShlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSk7DQotICAgICAgICBTdHJpbmcgZGV0YWlscyA9IGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpOw0KLQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlIG1lc3NhZ2UgPSBnZXRTb3VyY2VDb21wb25lbnRFcnJvck1lc3NhZ2UoDQotICAgICAgICAgICAgZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIHN1bW1hcnksIGRldGFpbHMpOw0KLQ0KLSAgICAgICAgaWYgKG1lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgfHwgbWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vVE9ETw0KLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24obWVzc2FnZSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9UT0RPIGxvZ2dpbmcNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UpDQotICAgIHsNCi0gICAgICAgIGlmIChoYW5kbGVTb3VyY2VWaW9sYXRpb24oZW50cnlPZlNvdXJjZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9nZXQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAgICAgICAgU3RyaW5nIHN1bW1hcnkgPSBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCBmYWxzZSk7DQotICAgICAgICAgICAgU3RyaW5nIGRldGFpbHMgPSBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIGZhbHNlKTsNCi0NCi0gICAgICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZSA9IGdldFNvdXJjZUNvbXBvbmVudEVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIHN1bW1hcnksIGRldGFpbHMpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsIHx8IG1lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vVE9ETw0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG1lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vanVzdCB0aHJvdyBhIG5ldyBtZXNzYWdlIC0gdGhlIGVycm9yIG1lc3NhZ2UgaXMgYXQgdGhlIHRhcmdldA0KLSAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihuZXcgRmFjZXNNZXNzYWdlKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBGYWNlc01lc3NhZ2UgZ2V0U291cmNlQ29tcG9uZW50RXJyb3JNZXNzYWdlKEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgRmFjZXNNZXNzYWdlIGdldFRhcmdldENvbXBvbmVudEVycm9yTWVzc2FnZShBbm5vdGF0aW9uIGZvdW5kQW5ub3RhdGlvbiwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcmVzb2x2ZU1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcga2V5ID0gZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgICAgICByZXR1cm4gKGtleSAhPSBudWxsKSA/IHJlc29sdmVNZXNzYWdlKGtleSArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYKSA6IG51bGw7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVUYXJnZXRWaW9sYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UsDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZUYXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBlbnRyeU9mVGFyZ2V0ICE9IG51bGwgJiYgZW50cnlPZlRhcmdldC5nZXRDb21wb25lbnQoKSAhPSBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVNvdXJjZVZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGhhbmRsZVRhcmdldFZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIG51bGwpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIG5vIHRhcmdldCBjb21wb25lbnQgKHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbW9kZWwpIC0+IGdldCByZXZlcnNlIG1lc3NhZ2UgZm9yIHNvdXJjZSBjb21wb25lbnQNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICAvL2lmIHRoZSBtZXNzYWdlIGlzIG5ldXRyYWwNCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24sIHRydWUpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIG5vIHRhcmdldCBjb21wb25lbnQgKHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbW9kZWwpIC0+IGdldCByZXZlcnNlIG1lc3NhZ2UgZm9yIHNvdXJjZSBjb21wb25lbnQNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIC8vaWYgdGhlIG1lc3NhZ2UgaXMgbmV1dHJhbA0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uLCB0cnVlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBhYnN0cmFjdCBtZXRob2RzDQotICAgICAqLw0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBpbXBsZW1lbnRzIHRoZSBzcGVjaWZpYyB2YWxpZGF0aW9uIGxvZ2ljDQotICAgICAqLw0KLQ0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbik7DQotDQotICAgIC8qDQotICAgICAqIHJldHVybnMgdGhlIHJlZmVyZW5jZWQgdmFsaWRhdGlvbiB0YXJnZXRzIG9mIHRoZSBhbm5vdGF0aW9uDQotICAgICAqIGUuZy4gQERhdGVJcyh0eXBlID0gRGF0ZUlzVHlwZS5iZWZvcmUsIHZhbHVlID0gImZpbmFsRXhhbSIpDQotICAgICAqIC0+IG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IHdpdGggb25lIHZhbHVlICgiZmluYWxFeGFtIikNCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YzgxYmIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgLy9pbml0IGNyb3NzLXZhbGlkYXRpb24NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA9DQotICAgICAgICAgICAgZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkuYWRkKGVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA9IG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoKTsNCi0NCi0gICAgICAgIGVudHJ5LnNldE1ldGFEYXRhRW50cnkobWV0YURhdGFFbnRyeSk7DQotICAgICAgICBlbnRyeS5zZXRDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgZW50cnkuc2V0Q2xpZW50SWQodWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIGVudHJ5LnNldFZhbGlkYXRpb25TdHJhdGVneSh0aGlzKTsNCi0NCi0gICAgICAgIHJldHVybiBlbnRyeTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgYXZhaWxhYmxlIGZvciBjcm9zcyB2YWxpZGF0aW9uIC0gdXNlIHByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IGF2YWlsYWJsZSBmb3IgY3Jvc3MgdmFsaWRhdGlvbiIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0VmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICAvL25vdCBhdmFpbGFibGUgZm9yIGNyb3NzIHZhbGlkYXRpb24gLSB1c2UgaW5pdENyb3NzVmFsaWRhdGlvbg0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDcm9zc1ZhbGlkYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICAvL292ZXJyaWRlIGlmIG5lZWRlZA0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLCB2YWxpZGF0b3JFeGNlcHRpb24sIHRoaXMpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvbkhlbHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZjdkZTMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5LA0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNNb2RlbEF3YXJlVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGNvbXBhcmVTdHJhdGVneS5pc1Zpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9wcm9jZXNzIGFmdGVyIHZpb2xhdGlvbg0KLSAgICAgICAgICAgIC8vanVzdCBhZGQgbWVzc2FnZXMNCi0gICAgICAgICAgICBpZighaXNNb2RlbEF3YXJlVmFsaWRhdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NUYXJnZXRBZnRlckNyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1RhcmdldEFmdGVyTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vdGhvdyBleGNlcHRpb24NCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzVGFyZ2V0QWZ0ZXJDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgPSBuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KCk7DQotDQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LnVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbXBvbmVudCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDbGllbnRJZCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbXBvbmVudChzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDbGllbnRJZChzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29udmVydGVkT2JqZWN0KHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpKTsNCi0gICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5KTsNCi0NCi0gICAgICAgIC8vYWRkIG1lc3NhZ2UNCi0gICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgIHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NUYXJnZXRBZnRlck1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIC8vbm8gdGFyZ2V0IC0gYmVjYXVzZSB0aGVyZSBpcyBubyB0YXJnZXQgY29tcG9uZW50IC0gdmFsdWUgd2FzIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBtb2RlbA0KLSAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIG51bGwpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzdkODcyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgdm9pZCBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlKQ0KLSAgICAgICAgICAgIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb247DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0RhdGVJc1N0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzJmYTcxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0RhdGVJc1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJc1R5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsNCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERhdGVJc1N0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT19FQVJMWSA9ICJlYXJseSI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT19MQVRFID0gImxhdGUiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRVFVQUxfREFURV9USU1FID0gIm5vdCBlcXVhbCI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVkgPSAicmVzdWx0IjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFSRURfVkFMVUVfS0VZID0gInRhcmdldCB2YWx1ZSI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVkVSU0VfQ09NUEFSRURfVkFMVUVfS0VZID0gInJldmVyc2UgdGFyZ2V0IHZhbHVlIjsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgLy9UT0RPIHRlc3QgJiByZW1vdmUNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVNvdXJjZVZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHZpb2xhdGlvbkZvdW5kOw0KLQ0KLSAgICAgICAgaWYgKCgoRGF0ZUlzKSBhbm5vdGF0aW9uKS50eXBlKCkuZXF1YWxzKERhdGVJc1R5cGUuc2FtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSBvYmplY3QxICE9IG51bGwgJiYgIW9iamVjdDEuZXF1YWxzKG9iamVjdDIpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVTVUxUX0tFWSwgTk9UX0VRVUFMX0RBVEVfVElNRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoKChEYXRlSXMpIGFubm90YXRpb24pLnR5cGUoKS5lcXVhbHMoRGF0ZUlzVHlwZS5iZWZvcmUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsICYmIG9iamVjdDIgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW5ldyBEYXRlKCgoRGF0ZSkgb2JqZWN0MSkuZ2V0VGltZSgpKS5iZWZvcmUoKERhdGUpIG9iamVjdDIpIHx8IG9iamVjdDEuZXF1YWxzKG9iamVjdDIpKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFU1VMVF9LRVksIFRPT19MQVRFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSBvYmplY3QxICE9IG51bGwgJiYgb2JqZWN0MiAhPSBudWxsICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICghbmV3IERhdGUoKChEYXRlKSBvYmplY3QxKS5nZXRUaW1lKCkpLmFmdGVyKChEYXRlKSBvYmplY3QyKSB8fCBvYmplY3QxLmVxdWFscyhvYmplY3QyKSk7DQotDQotICAgICAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVNVTFRfS0VZLCBUT09fRUFSTFkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KENPTVBBUkVEX1ZBTFVFX0tFWSwgb2JqZWN0MSk7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVZFUlNFX0NPTVBBUkVEX1ZBTFVFX0tFWSwgb2JqZWN0Mik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlvbGF0aW9uRm91bmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRGF0ZUlzKSBhbm5vdGF0aW9uKS52YWx1ZU9mKCk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogcHJvdGVjdGVkDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAoU3RyaW5nKSB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UuZ2V0KFJFU1VMVF9LRVkpOw0KLQ0KLSAgICAgICAgaWYgKCFpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSByZXZlcnNlUmVzdWx0KHJlc3VsdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoVE9PX0VBUkxZLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROb3RBZnRlckVycm9yTXNnS2V5KChEYXRlSXMpIGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoVE9PX0xBVEUuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldE5vdEJlZm9yZUVycm9yTXNnS2V5KChEYXRlSXMpIGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROb3RFcXVhbEVycm9yTXNnS2V5KChEYXRlSXMpIGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHJldmVyc2VSZXN1bHQoU3RyaW5nIHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgaWYgKFRPT19FQVJMWS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gVE9PX0xBVEU7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIFRPT19FQVJMWTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCksIGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBmYWxzZSksIGFubm90YXRpb24sIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgZmFsc2UpDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBhbm5vdGF0aW9uLCBmYWxzZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZShTdHJpbmcga2V5LCBBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gcmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0NCi0gICAgICAgIERhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCgoRGF0ZUlzKSBhbm5vdGF0aW9uKS5lcnJvck1lc3NhZ2VEYXRlU3R5bGUoKSwNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKSk7DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0Ow0KLQ0KLSAgICAgICAgaWYoaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQuZm9ybWF0KChEYXRlKSB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UuZ2V0KENPTVBBUkVEX1ZBTFVFX0tFWSkpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBtZXNzYWdlLnJlcGxhY2UoInswfSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdC5mb3JtYXQoKERhdGUpIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5nZXQoUkVWRVJTRV9DT01QQVJFRF9WQUxVRV9LRVkpKSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL3JlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIG90aGVyIGNvbXBvbmVudA0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBwcml2YXRlDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBnZXROb3RBZnRlckVycm9yTXNnS2V5KERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uLm5vdEFmdGVyRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5vdEJlZm9yZUVycm9yTXNnS2V5KERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uLm5vdEJlZm9yZUVycm9yTXNnS2V5KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXROb3RFcXVhbEVycm9yTXNnS2V5KERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uLm5vdEVxdWFsRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VMQ29tcGFyZVN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODQ2YTI2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VMQ29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIHJlZmVyZW5jaW5nIHZhbGlkYXRpb24gdGFyZ2V0cyAtIHBvc3NpYmxlIGZvcm1hdHM6DQotICogIiN7W2JlYW5fbmFtZV0uW3Byb3BlcnR5X25hbWVdfSIgLi4uIGNyb3NzLWVudGl0eSB2YWxpZGF0aW9uIHdpdGggdmFsdWUgYmluZGluZw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBFTENvbXBhcmVTdHJhdGVneSBpbXBsZW1lbnRzIFJlZmVyZW5jaW5nU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYgKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKHZhbGlkYXRpb25UYXJnZXQpICYmDQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVZhbGlkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgdmFsaWRhdGlvblRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9WYWxpZGF0ZVZhbHVlQmluZGluZygNCi0gICAgICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbGlkYXRpb25UYXJnZXQpLCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLCBjb21wYXJlU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ0ZXN0IikNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZVZhbHVlQmluZGluZygNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9DQotICAgICAgICAgICAgICAgIHJlc29sdmVUYXJnZXRGb3JDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0NCi0gICAgICAgIGlmKHZhbGlkYXRpb25UYXJnZXRFbnRyeSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHJlc29sdmVUYXJnZXRGb3JDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbGlkYXRpb25UYXJnZXQpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZyA9DQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCk7DQotDQotICAgICAgICByZXR1cm4gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMucmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFbnRyeSgNCi0gICAgICAgICAgICAgICAga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLA0KLSAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5jb252ZXJ0VmFsdWVCaW5kaW5nRXhwcmVzc2lvblRvUHJvY2Vzc2VkSW5mb3JtYXRpb25LZXkodmFsaWRhdGlvblRhcmdldCksDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5LCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsaWRhdGlvblRhcmdldCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIE9iamVjdCB0YXJnZXRWYWx1ZSA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0NCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdGFyZ2V0RW50cnkgPSBuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSgpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0QmVhbigNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRWYWx1ZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsIHZhbGlkYXRpb25UYXJnZXQuZ2V0QmFzZUV4cHJlc3Npb24oKSkpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0Q29udmVydGVkVmFsdWUodGFyZ2V0VmFsdWUpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRFbnRyeSwgdHJ1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VxdWFsc1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNDc2Y2EuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFcXVhbHNTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKEVxdWFscykgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLCBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBvYmplY3QxICE9IG51bGwgJiYgIW9iamVjdDEuZXF1YWxzKG9iamVjdDIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKEVxdWFscykgYW5ub3RhdGlvbikudmFsdWUoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbENvbXBhcmVTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxDb21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ4ZDk4Yy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbENvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLlByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLQ0KLS8qKg0KLSAqICJbcHJvcGVydHlfbmFtZV0iIC4uLiBsb2NhbCB2YWxpZGF0aW9uIC0+IGNyb3NzLWNvbXBvbmVudCwgYnV0IG5vIGNyb3NzLWVudGl0eSB2YWxpZGF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIExvY2FsQ29tcGFyZVN0cmF0ZWd5IGltcGxlbWVudHMgUmVmZXJlbmNpbmdTdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZih2YWxpZGF0aW9uVGFyZ2V0LmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kgd2lsbCBjb250aW51ZQ0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnlUb1ZhbGlkYXRlTG9jYWxseSgNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZUxvY2FsbHkoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSwNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZyA9DQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCk7DQotDQotICAgICAgICBib29sZWFuIGlzTW9kZWxBd2FyZVZhbGlkYXRpb24gPQ0KLSAgICAgICAgICAgICAgICBpc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcsIHRhcmdldEtleSk7DQotDQotICAgICAgICBTdHJpbmcgdGFyZ2V0UHJvcGVydHkgPSB0YXJnZXRLZXk7DQotDQotICAgICAgICBTdHJpbmcgc291cmNlS2V5ID0gcmVzb2x2ZVNvdXJjZUtleShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgdGFyZ2V0S2V5ID0gc291cmNlS2V5LnN1YnN0cmluZygwLCBzb3VyY2VLZXkubGFzdEluZGV4T2YoIi4iKSArIDEpICsgdGFyZ2V0S2V5Ow0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkgPSBDcm9zc1ZhbGlkYXRpb25VdGlscy5yZXNvbHZlVmFsaWRhdGlvblRhcmdldEVudHJ5KA0KLSAgICAgICAgICAgICAgICBrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcsIHRhcmdldEtleSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0NCi0gICAgICAgIGlmICh2YWxpZGF0aW9uVGFyZ2V0RW50cnkgIT0gbnVsbCAmJiB2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCAmJiAhaXNNb2RlbEF3YXJlVmFsaWRhdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9ubyB0YXJnZXQgLSBiZWNhdXNlIHRoZXJlIGlzIG5vIHRhcmdldCBjb21wb25lbnQgLSB2YWx1ZSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1vZGVsDQotICAgICAgICBlbHNlIGlmKGlzTW9kZWxBd2FyZVZhbGlkYXRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldFByb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB1bnN1cHBvcnRlZENhc2UoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlVGFyZ2V0S2V5KENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFN0cmluZyB0YXJnZXRLZXkpDQotICAgIHsNCi0gICAgICAgIC8vbm8gcmVhbCB2YWx1ZSBiaW5kaW5nIGV4cHJlc3Npb24NCi0gICAgICAgIC8vVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBqdXN0IGhlcGxzIHRvIHJlcGxhY2UgdGhlIHByb3BlcnR5IG9mIHRoZSBrZXkNCi0gICAgICAgIC8vaGVyZSBvbmx5IGRvdC1ub3RhdGlvbiBpcyBhbGxvd2VkIC0+IG5vIHByb2JsZW0NCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYmFzZUV4cHJlc3Npb24gPQ0KLSAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIjeyIgKyBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLA0KLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZXRhaWxzLmNsYXNzKS5nZXRLZXkoKSArICJ9Iik7DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlT3JBZGRQcm9wZXJ0eShiYXNlRXhwcmVzc2lvbiwgdGFyZ2V0S2V5KQ0KLSAgICAgICAgICAgIC5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0LnN1YnN0cmluZygyLCByZXN1bHQubGVuZ3RoKCkgLTEpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWVPZlByb3BlcnR5KE9iamVjdCBiYXNlLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHByb3BlcnR5ID0gcHJvcGVydHkuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSArIHByb3BlcnR5LnN1YnN0cmluZygxLCBwcm9wZXJ0eS5sZW5ndGgoKSk7DQotICAgICAgICBNZXRob2QgdGFyZ2V0TWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKGJhc2UuZ2V0Q2xhc3MoKSwgImdldCIgKyBwcm9wZXJ0eSk7DQotDQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0YXJnZXRNZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoYmFzZS5nZXRDbGFzcygpLCAiaXMiICsgcHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYodGFyZ2V0TWV0aG9kID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgImNsYXNzICIgKyBiYXNlLmdldENsYXNzKCkgKyAiIGhhcyBubyBwdWJsaWMgZ2V0L2lzICIgKyBwcm9wZXJ0eS50b0xvd2VyQ2FzZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoYmFzZSwgdGFyZ2V0TWV0aG9kKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4ga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuZXdLZXkgPSBjcmVhdGVUYXJnZXRLZXkoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgcmV0dXJuICFrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcuY29udGFpbnNLZXkobmV3S2V5KTsNCi0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyByZXNvbHZlU291cmNlS2V5KENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUtleSA9IHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKTsNCi0NCi0gICAgICAgIGlmKCFzb3VyY2VLZXkuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzb3VyY2UgcGF0aDogIiArIHNvdXJjZUtleSArICIgaW52YWxpZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHNvdXJjZUtleTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdW5zdXBwb3J0ZWRDYXNlKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQgY29udmVydGVkIG9iamVjdCBmb3IgIiArICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcykuZ2V0S2V5KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdGFyZ2V0RW50cnkgPSBuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSgpOw0KLQ0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0QmVhbigNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpLmdldEJhc2VPYmplY3QoKSk7DQotICAgICAgICB0YXJnZXRFbnRyeQ0KLSAgICAgICAgICAgICAgICAuc2V0Q29udmVydGVkVmFsdWUoZ2V0VmFsdWVPZlByb3BlcnR5KHRhcmdldEVudHJ5LmdldEJlYW4oKSwgdGFyZ2V0UHJvcGVydHkpKTsNCi0NCi0gICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneShjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0RW50cnksIHRydWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YWY0YmEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLlByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiAiW2xvY2FsX3Byb3BlcnR5LnByb3BlcnR5MS5wcm9wZXJ0eTJdIg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBMb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kgZXh0ZW5kcyBMb2NhbENvbXBhcmVTdHJhdGVneQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYoIXZhbGlkYXRpb25UYXJnZXQuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL25vdCBzdXBwb3J0ZWQgLSBUT0RPIGFkZCBsb2dnaW5nDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZUxvY2FsbHkoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0S2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZyA9DQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCk7DQotDQotICAgICAgICBTdHJpbmcgbmV3S2V5ID0gY3JlYXRlVGFyZ2V0S2V5KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIGlmIChrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcuY29udGFpbnNLZXkobmV3S2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9IGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQobmV3S2V5KTsNCi0NCi0gICAgICAgICAgICBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9ubyB0YXJnZXQgLSBiZWNhdXNlIHRoZXJlIGlzIG5vIHRhcmdldCBjb21wb25lbnQgLSB2YWx1ZSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1vZGVsDQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEtleSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHRhcmdldEluZm9ybWF0aW9uRW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmIChjb21wYXJlU3RyYXRlZ3kuaXNWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgdGFyZ2V0SW5mb3JtYXRpb25FbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5ID0gbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb21wb25lbnQoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q2xpZW50SWQodGFyZ2V0SW5mb3JtYXRpb25FbnRyeS5nZXRDbGllbnRJZCgpKTsNCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29udmVydGVkT2JqZWN0KHRhcmdldEluZm9ybWF0aW9uRW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldFZhbGlkYXRpb25TdHJhdGVneShjb21wYXJlU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIC8vcHJvY2VzcyBhZnRlciB2aW9sYXRpb24NCi0gICAgICAgICAgICAvL2p1c3QgYWRkIG1lc3NhZ2VzDQotICAgICAgICAgICAgaWYoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbXBvbmVudCgpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIG51bGwpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvL3Rob3cgZXhjZXB0aW9uDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgU3RyaW5nIHRhcmdldEtleSkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIE9iamVjdCBuZXdCYXNlID0gUmVmbGVjdGlvblV0aWxzDQotICAgICAgICAgICAgLmdldEJhc2VPZlByb3BlcnR5Q2hhaW4ocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSwgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIGlmKHRhcmdldEtleS5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZmluZCB0aGUgbGFzdCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIHRhcmdldEtleSA9IHRhcmdldEtleS5zdWJzdHJpbmcodGFyZ2V0S2V5Lmxhc3RJbmRleE9mKCIuIikgKyAxLCB0YXJnZXRLZXkubGVuZ3RoKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgT2JqZWN0IHRhcmdldFZhbHVlID0gZ2V0VmFsdWVPZlByb3BlcnR5KG5ld0Jhc2UsIHRhcmdldEtleSk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHRhcmdldEVudHJ5ID0gbmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkoKTsNCi0gICAgICAgIHRhcmdldEVudHJ5LnNldEJlYW4obmV3QmFzZSk7DQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh0YXJnZXRWYWx1ZSk7DQotDQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEVudHJ5LCB0cnVlKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Ob3RFcXVhbHNTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxNWUyMC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Ob3RFcXVhbHNTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5Ob3RFcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIE5vdEVxdWFsc1N0cmF0ZWd5IGV4dGVuZHMgRXF1YWxzU3RyYXRlZ3kNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKE5vdEVxdWFscykgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwNCi0gICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAhc3VwZXIuaXNWaW9sYXRpb24ob2JqZWN0MSwgb2JqZWN0MiwgYW5ub3RhdGlvbik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKE5vdEVxdWFscykgYW5ub3RhdGlvbikudmFsdWUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMzZkZmEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVmZXJlbmNpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEludGVybmFsIGludGVyZmFjZSB0byBhbGxvdyBtdWx0aXBsZSByZWZlcmVuY2luZyBzdHJhdGVnaWVzIGZvciBjcm9zcyBjb21wb25lbnQgdmFsaWRhdGlvbi4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotaW50ZXJmYWNlIFJlZmVyZW5jaW5nU3RyYXRlZ3kNCi17DQotICAgIGJvb2xlYW4gZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBhYnN0cmFjdENvbXBhcmVTdHJhdGVneSk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlcXVpcmVkSWZTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVxdWlyZWRJZlN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMDVhNWYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVxdWlyZWRJZlN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkSWY7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkSWZUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZElmU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneQ0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUZhY2VzQnVuZGxlID0gZmFsc2U7DQotDQotICAgIHB1YmxpYyBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc3VwZXIucmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0gICAgICAgIFN0cmluZyBtYXJrZXIgPSBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5NSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0NCi0gICAgICAgIGlmKChtYXJrZXIgKyBrZXkgKyBtYXJrZXIpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudXNlRmFjZXNCdW5kbGUgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKFJlcXVpcmVkSWYpIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHZpb2xhdGlvbkZvdW5kID0gZmFsc2U7DQotDQotICAgICAgICBpZiAoKChSZXF1aXJlZElmKSBhbm5vdGF0aW9uKS5pcygpLmVxdWFscyhSZXF1aXJlZElmVHlwZS5lbXB0eSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSAob2JqZWN0MiA9PSBudWxsIHx8IG9iamVjdDIuZXF1YWxzKCIiKSkgJiYgKG9iamVjdDEgPT0gbnVsbCB8fCBvYmplY3QxLmVxdWFscygiIikpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoKChSZXF1aXJlZElmKSBhbm5vdGF0aW9uKS5pcygpLmVxdWFscyhSZXF1aXJlZElmVHlwZS5ub3RfZW1wdHkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gKG9iamVjdDIgIT0gbnVsbCAmJiAhb2JqZWN0Mi5lcXVhbHMoIiIpKSAmJiAob2JqZWN0MSA9PSBudWxsIHx8IG9iamVjdDEuZXF1YWxzKCIiKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlvbGF0aW9uRm91bmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoUmVxdWlyZWRJZikgYW5ub3RhdGlvbikudmFsdWVPZigpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZSh2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdG9yRXhjZXB0aW9uKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2pwYV9zdHJhdGVneV9tYXBwaW5ncy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Q5OTI5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2pwYV9zdHJhdGVneV9tYXBwaW5ncy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbj1vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5KcGFWYWxpZGF0aW9uU3RyYXRlZ3kNCi1qYXZheC5wZXJzaXN0ZW5jZS5CYXNpYz1vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5KcGFWYWxpZGF0aW9uU3RyYXRlZ3kNCi1qYXZheC5wZXJzaXN0ZW5jZS5JZD1vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5KcGFWYWxpZGF0aW9uU3RyYXRlZ3kNCi1qYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZT1vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5KcGFWYWxpZGF0aW9uU3RyYXRlZ3kNCi1qYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmU9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Dcm9zc1ZhbGlkYXRpb25VdGlscy5qYXZhIGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Dcm9zc1ZhbGlkYXRpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDNjM2FkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25VdGlscw0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JPU1NfVkFMSURBVElPTl9TVE9SQUdFX0tFWSA9IENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgZ2V0T3JJbml0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIGlmICghcmVxdWVzdE1hcC5jb250YWluc0tleShDUk9TU19WQUxJREFUSU9OX1NUT1JBR0VfS0VZKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNldENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSkgcmVxdWVzdE1hcC5nZXQoQ1JPU1NfVkFMSURBVElPTl9TVE9SQUdFX0tFWSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dA0KLSAgICAgICAgICAgICAgICAuZ2V0Q3VycmVudEluc3RhbmNlKCkNCi0gICAgICAgICAgICAgICAgLmdldEV4dGVybmFsQ29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRSZXF1ZXN0TWFwKCkNCi0gICAgICAgICAgICAgICAgLnB1dChDUk9TU19WQUxJREFUSU9OX1NUT1JBR0VfS0VZLCBuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVE9fQ09OVkVSVEVEX1ZBTFVFX01BUFBJTkdfS0VZID0gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuY2xhc3MuZ2V0TmFtZSgpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGdldE9ySW5pdEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCkNCi0gICAgew0KLSAgICAgICAgTWFwIHJlcXVlc3RNYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpOw0KLQ0KLSAgICAgICAgaWYgKCFyZXF1ZXN0TWFwLmNvbnRhaW5zS2V5KEtFWV9UT19DT05WRVJURURfVkFMVUVfTUFQUElOR19LRVkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc2V0S2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4pIHJlcXVlc3RNYXAuZ2V0KEtFWV9UT19DT05WRVJURURfVkFMVUVfTUFQUElOR19LRVkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKQ0KLSAgICAgICAgICAgIC5wdXQoS0VZX1RPX0NPTlZFUlRFRF9WQUxVRV9NQVBQSU5HX0tFWSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgcmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFbnRyeSgNCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZywNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0S2V5LCBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgPQ0KLSAgICAgICAgICAgIGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLmdldCh0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgLy92YWx1ZSBub3Qgc3VibWl0dGVkIGF0IHRoaXMgcmVxdWVzdCAtIHVzZSBtb2RlbCB2YWx1ZSAodmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBtb2RlbCkNCi0gICAgICAgIGlmKHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vc2ltcGxlIGNhc2UNCi0gICAgICAgIGlmIChwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEZ1cnRoZXJFbnRyaWVzKCkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgT2JqZWN0IHRhcmdldEJlYW4gPSBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpOw0KLQ0KLSAgICAgICAgLy9wcm9jZXNzIGNvbXBsZXggY29tcG9uZW50IGVudHJpZXMgKGUuZy4gYSB0YWJsZSkNCi0gICAgICAgIC8vc3VwcG9ydGVkOiBjcm9zcy1jb21wb25lbnQgYnV0IG5vIGNyb3NzLWVudGl0eSB2YWxpZGF0aW9uICg9IGxvY2FsZSB2YWxpZGF0aW9uKQ0KLSAgICAgICAgaWYgKHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuZ2V0QmVhbigpLmVxdWFscyh0YXJnZXRCZWFuKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAoUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSBlbnRyeSA6IHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuZ2V0RnVydGhlckVudHJpZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuZ2V0QmVhbigpLmVxdWFscyh0YXJnZXRCZWFuKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic3VwcG9ydCBmb3IgbWFwIHN5bnRheCIpDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uVG9Qcm9jZXNzZWRJbmZvcm1hdGlvbktleShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZiZS5nZXRFeHByZXNzaW9uU3RyaW5nKCkucmVwbGFjZSgiI3siLCAiIikucmVwbGFjZSgifSIsICIiKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Byb3BlcnR5VmFsaWRhdGlvblV0aWxzLmphdmEgYi9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Byb3BlcnR5VmFsaWRhdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYTdhNGMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Qcm9wZXJ0eVZhbGlkYXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFByb3BlcnR5VmFsaWRhdGlvblV0aWxzDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HR0VSID0gTG9nRmFjdG9yeS5nZXRMb2coUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuY2xhc3MpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZGF0aW9uU2tpcHBlZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgaWYoRXh0VmFsVXRpbHMuaXNTa2lwYWJsZVZhbGlkYXRpb25TdHJhdGVneSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQm9vbGVhbiBza2lwVmFsaWRhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoDQotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlNLSVBfVkFMSURBVElPTiwgQm9vbGVhbi5jbGFzcyk7DQotDQotICAgICAgICAgICAgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhza2lwVmFsaWRhdGlvbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihMT0dHRVIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgTE9HR0VSLnRyYWNlKCJ2YWxpZGF0aW9uIG9mICIgKyB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGNhbmNlbGVkIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZih2YWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGFuY2VvZiBTa2lwVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIG51bGwsIG1ldGFEYXRhRW50cnksIG51bGwpOw0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC9icmFuY2hfZm9yX2pzZl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvZXhwZXJpbWVudGFsL2JyYW5jaF9mb3JfanNmXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzOTI1NS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvYnJhbmNoX2Zvcl9qc2ZfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgUHJvcGVydHkgVmFsaWRhdGlvbiBNb2R1bGUNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBQcm9wZXJ0eSBWYWxpZGF0aW9uIE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFByb3BlcnR5IFZhbGlkYXRpb24gcHJvdmlkZXMgYW5ub3RhdGlvbiBiYXNlZCB2YWxpZGF0aW9uIGZvciBiZWFuIHByb3BlcnRpZXMuDQotICAgIEl0IGFsc28gcHJvdmlkZXMgSlBBIDEuMCBiYXNlZCB2YWxpZGF0aW9uIFN1cHBvcnQuDQotICANCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEuMS54IGFuZCBKU0YgMS4yLnguIEJvdGggdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YmY5NGIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMi4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIENvcmU8L25hbWU+DQotICAgIDx2ZXJzaW9uPiR7YnVpbGQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+DQotICAgIA0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+Y2dsaWI8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2dsaWI8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4xXzM8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxyZXNvdXJjZXM+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgIDwvcmVzb3VyY2VzPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmRiODFjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4NCi0gICAgPCEtLSBvcHRpb25hbCBhcHByb2FjaCBmb3IgY29tcG9uZW50IGxpYnMgd2hpY2ggZG9uJ3QgdXNlIGRlbGVnYXRpb24gdG8gcmVuZGVyZXIgLS0+DQotICAgIDwhLS0NCi0gICAgPGZhY3Rvcnk+DQotICAgICAgICA8YXBwbGljYXRpb24tZmFjdG9yeT5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5FeHRWYWxBcHBsaWNhdGlvbkZhY3Rvcnk8L2FwcGxpY2F0aW9uLWZhY3Rvcnk+DQotICAgIDwvZmFjdG9yeT4NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5Qcm94eU1hcHBpbmdQaGFzZUxpc3RlbmVyPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotICAgIC0tPg0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotDQotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjBmZDQ2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUVudW07DQotDQotLyoqDQotICogZG9udCd0IG1vdmUgdG8gYW4gb3RoZXIgcGFja2FnZSEhIQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VFbnVtLklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRXh0VmFsSW5mb3JtYXRpb24NCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgPSBFeHRWYWxJbmZvcm1hdGlvbi5jbGFzcw0KLSAgICAgICAgICAgIC5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlhNTF9QQVJBTV9QUkVGSVggPSBFeHRWYWxJbmZvcm1hdGlvbi5jbGFzcw0KLSAgICAgICAgICAgIC5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSAiMS4yLjEiOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQWJzdHJhY3RTdGFydHVwQ29uZmlnTGlzdGVuZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9BYnN0cmFjdFN0YXJ0dXBDb25maWdMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzgyNmUyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9BYnN0cmFjdFN0YXJ0dXBDb25maWdMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0YXJ0dXBDb25maWdMaXN0ZW5lciBpbXBsZW1lbnRzIFBoYXNlTGlzdGVuZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotICAgIC8vZG9uJ3QgcmVtb3ZlIC0gaXQncyBhIGZhbGxiYWNrIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIGRlcmVnaXN0cmF0aW9uDQotICAgIC8vdGFyZ2V0OiBkb24ndCBwcm9jZXNzIGluaXQgbG9naWMgbW9yZSB0aGFuIG9uY2UNCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxDbGFzcz4gaW5pdGlhbGl6ZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKEFic3RyYWN0U3RhcnR1cENvbmZpZ0xpc3RlbmVyLmNsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZWRMaXN0ZW5lcnMuY29udGFpbnMoZ2V0Q2xhc3MoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaW5pdCgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZGVyZWdpc3RlclBoYXNlTGlzdGVuZXIodGhpcyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgIC53YXJuKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGRlcmVnaXN0ZXJpbmcgdGhlIHBoYXNlLWxpc3RlbmVyIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRDbGFzcygpLmdldE5hbWUoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC0+IHRoZXJlIGlzIGp1c3QgYSBsaXR0bGUgb3ZlcmhlYWQsIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJ1dCBldmVyeXRoaW5nIGVsc2Ugd29ya3MgY29ycmVjdGx5LiINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBob3dldmVyLCBwbGVhc2UgaW5mb3JtIHRoZSBjb21tdW5pdHkgYWJvdXQgeW91ciBjb25maWd1cmF0aW9uIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZmluYWxseQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZExpc3RlbmVycy5hZGQoZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLlJFU1RPUkVfVklFVzsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0KCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9DbGFzc01hcHBpbmdGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzQ3MzQ0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9DbGFzc01hcHBpbmdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIENsYXNzTWFwcGluZ0ZhY3Rvcnk8UCwgUj4NCi17DQotICAgIFIgY3JlYXRlKFAgc291cmNlKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbFJlbmRlcktpdC5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbFJlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzY4NGEwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlRW51bTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVN0cmVhbTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LlJlc3BvbnNlV3JpdGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZXNwb25zZVN0YXRlTWFuYWdlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VFbnVtLklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcktpdCBleHRlbmRzIFJlbmRlcktpdAotewotICAgIHByaXZhdGUgUmVuZGVyS2l0IHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJFWFRWQUxfUkVOREVSS0lUIjsKLQotICAgIHB1YmxpYyBFeHRWYWxSZW5kZXJLaXQoUmVuZGVyS2l0IHdyYXBwZWQpCi0gICAgewotICAgICAgICAvL1RPRE8gaW1wbC4gYSBob29rIHRvIHN1cHBvcnQgc2ltaWxhciBtZWNoYW5pc21zIG9mIG90aGVyIGNvbXBvbmVudCBsaWJzCi0gICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSgKLSAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuY29yZS5Db3JlUmVuZGVyaW5nQ29udGV4dCIpOwotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgaWYgKHJlbmRlcmVyIGluc3RhbmNlb2YgRXh0VmFsUmVuZGVyZXJXcmFwcGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCByZW5kZXJlcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCBuZXcgRXh0VmFsUmVuZGVyZXJXcmFwcGVyKHJlbmRlcmVyKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVuZGVyZXIgZ2V0UmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSkKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyIHJlbmRlcmVyID0gd3JhcHBlZC5nZXRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSk7Ci0gICAgICAgIHJldHVybiByZW5kZXJlciBpbnN0YW5jZW9mIEV4dFZhbFJlbmRlcmVyV3JhcHBlciA/IHJlbmRlcmVyIDogbmV3IEV4dFZhbFJlbmRlcmVyV3JhcHBlcihyZW5kZXJlcik7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlU3RhdGVNYW5hZ2VyIGdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlV3JpdGVyIGNyZWF0ZVJlc3BvbnNlV3JpdGVyKFdyaXRlciB3cml0ZXIsIFN0cmluZyBzLCBTdHJpbmcgczEpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jcmVhdGVSZXNwb25zZVdyaXRlcih3cml0ZXIsIHMsIHMxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdHJlYW0gY3JlYXRlUmVzcG9uc2VTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmNyZWF0ZVJlc3BvbnNlU3RyZWFtKG91dHB1dFN0cmVhbSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbFJlbmRlcmVyV3JhcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbFJlbmRlcmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzNiM2JjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmFubm90YXRpb24uQW5ub3RhdGlvbkVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmFubm90YXRpb24uZXh0cmFjdG9yLkFubm90YXRpb25FeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuY2xpZW50LkhUTUw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHkuRXh0VmFsQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQ2xpZW50U2lkZVZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VFbnVtOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkZhY3RvcnlVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5WYWxpZGF0aW9uVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVdyaXRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBEZWZhdWx0IGFwcHJvYWNoIHRvIGF2b2lkIHByb3hpZXMgZm9yIGNvbnZlcnRlcnMgYW5kIHRoZSBhZGFwdGVyIGZhbGxiYWNrLgotICogSXQgcmVxdWlyZXMgdGhhdCBjb21wb25lbnRzIGRlbGVnYXRlIGdldENvbnZlcnRlZFZhbHVlIHRvIGEgcmVuZGVyZXIuCi0gKiBJZiBpdCBpc24ndCB0aGUgY2FzZSBmb3IgeW91ciBjb21wb25lbnQgbGliIHVzZToKLSAqIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5LkV4dFZhbEFwcGxpY2F0aW9uRmFjdG9yeQotICogYW5kCi0gKiBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5Qcm94eU1hcHBpbmdQaGFzZUxpc3RlbmVyCi0gKiA8cC8+Ci0gKiBUaGlzIHdyYXBwZXIgd2lsbCBhbHNvIGltcGxlbWVudCBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIGJlaGF2aW91cgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUVudW0uSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyZXJXcmFwcGVyIGV4dGVuZHMgUmVuZGVyZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElEREVOX1NVQk1JVF9JTlBVVF9TVUZGSVggPSAiX0VYVFZBTCI7Ci0KLSAgICBwcml2YXRlIFJlbmRlcmVyIHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyZXJXcmFwcGVyKFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHdyYXBwZWQuZGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHdyYXBwZWQuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgd3JhcHBlZC5lbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgd3JhcHBlZC5lbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCEodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsKLSAgICAgICAgYm9vbGVhbiBmaXJzdEVudHJ5ID0gdHJ1ZTsKLQotICAgICAgICBBbm5vdGF0aW9uRXh0cmFjdG9yIGFubm90YXRpb25FeHRyYWN0b3IgPSBGYWN0b3J5VXRpbHMKLSAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uRXh0cmFjdG9yRmFjdG9yeSgpLmNyZWF0ZSgpOwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBtZXRhRGF0YSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgbWV0YURhdGEuYXBwZW5kKCJbIik7Ci0KLSAgICAgICAgZm9yIChBbm5vdGF0aW9uRW50cnkgZW50cnkgOiBhbm5vdGF0aW9uRXh0cmFjdG9yCi0gICAgICAgICAgICAuZXh0cmFjdEFubm90YXRpb25zKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBGYWN0b3J5VXRpbHMKLSAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpLmNyZWF0ZShlbnRyeS5nZXRBbm5vdGF0aW9uKCkpOwotCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5IGluc3RhbmNlb2YgQ2xpZW50U2lkZVZhbGlkYXRpb25TdHJhdGVneSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBjdXJyZW50TWV0YURhdGEgOiAoKENsaWVudFNpZGVWYWxpZGF0aW9uU3RyYXRlZ3kpIHZhbGlkYXRpb25TdHJhdGVneSkKLSAgICAgICAgICAgICAgICAgICAgLmV4dHJhY3RNZXRhRGF0YShlbnRyeS5nZXRBbm5vdGF0aW9uKCkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEuYXBwZW5kKGN1cnJlbnRNZXRhRGF0YSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdEVudHJ5KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YS5hcHBlbmQoIiwiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RW50cnkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtZXRhRGF0YS5hcHBlbmQoIl0iKTsKLQotICAgICAgICBSZXNwb25zZVdyaXRlciByZXNwb25zZVdyaXRlciA9IGZhY2VzQ29udGV4dC5nZXRSZXNwb25zZVdyaXRlcigpOwotCi0gICAgICAgIHJlc3BvbnNlV3JpdGVyLnN0YXJ0RWxlbWVudChIVE1MLklOUFVUX0VMRU0sIHVpQ29tcG9uZW50KTsKLSAgICAgICAgcmVzcG9uc2VXcml0ZXIud3JpdGVBdHRyaWJ1dGUoSFRNTC5UWVBFX0FUVFIsIEhUTUwuSU5QVVRfVFlQRV9ISURERU4sIG51bGwpOwotICAgICAgICByZXNwb25zZVdyaXRlci53cml0ZUF0dHJpYnV0ZShIVE1MLklEX0FUVFIsIHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCkKLSAgICAgICAgICAgICsgSElEREVOX1NVQk1JVF9JTlBVVF9TVUZGSVgsIG51bGwpOwotICAgICAgICByZXNwb25zZVdyaXRlci53cml0ZUF0dHJpYnV0ZShIVE1MLlZBTFVFX0FUVFIsIG1ldGFEYXRhLCBudWxsKTsKLSAgICAgICAgcmVzcG9uc2VXcml0ZXIuZW5kRWxlbWVudChIVE1MLklOUFVUX0VMRU0pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydENsaWVudElkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udmVydENsaWVudElkKGZhY2VzQ29udGV4dCwgcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UmVuZGVyc0NoaWxkcmVuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0ID0gd3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLQotICAgICAgICAvL2lmIHRoZSB1c2VyIGFjdGl2YXRlZCB0aGUgcHJveHkgbW9kZSBjYW5jZWwgaGVyZQotICAgICAgICBpZiAoRXh0VmFsQXBwbGljYXRpb25GYWN0b3J5LmlzQWN0aXZlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWRPYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBWYWxpZGF0aW9uVXRpbHMucHJvY2Vzc0V4dFZhbFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsKLQotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzAxODUxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VFbnVtOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUVudW0uSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyCi17Ci0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsKLQotICAgICAgICBSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnkgPSAoUmVuZGVyS2l0RmFjdG9yeSkKLSAgICAgICAgICAgIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShGYWN0b3J5RmluZGVyLlJFTkRFUl9LSVRfRkFDVE9SWSk7Ci0KLSAgICAgICAgU3RyaW5nIHJlbmRlcktpdElkOwotICAgICAgICBSZW5kZXJLaXQgcmVuZGVyS2l0OwotICAgICAgICByZW5kZXJLaXRJZCA9IGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldFJlbmRlcktpdElkKCk7Ci0gICAgICAgIHJlbmRlcktpdCA9IHJlbmRlcktpdEZhY3RvcnkuZ2V0UmVuZGVyS2l0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgcmVuZGVyS2l0SWQpOwotICAgICAgICByZW5kZXJLaXRGYWN0b3J5LmFkZFJlbmRlcktpdChFeHRWYWxSZW5kZXJLaXQuSUQsIG5ldyBFeHRWYWxSZW5kZXJLaXQocmVuZGVyS2l0KSk7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLnNldFJlbmRlcktpdElkKEV4dFZhbFJlbmRlcktpdC5JRCk7Ci0gICAgfQotCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gUGhhc2VJZC5SRU5ERVJfUkVTUE9OU0U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0YjNjZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcm4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICogKyBzb21lIG9mIHRoZW0gY2FuIGJlIGN1c3RvbWl6ZWQgd2l0aGluIGEgY3VzdG9tIGltcGwuIG9mIHRoZSBiZWFuDQotICogKGV4dGVuZCB0aGlzIGNsYXNzIGFuZCBwcm92aWRlIGl0IHZpYSBjb252ZW50aW9uIG9yIHdlYi54bWwpDQotICogPHAvPg0KLSAqIHRoZSBzdGF0aWMgYXBpIHNob3VsZCBvbmx5IGJlIHVzZWQNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVBTl9OQU1FID0gRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUNCi0gICAgICAgICsgIi4iICsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICAvL2N1c3RvbSBjbGFzcyB3aGljaCBpcyBhbiBvcHRpb25hbCByZXBsYWNlbWVudCBmb3IgdGhpcyBjbGFzcyAoaGFzIHRvIGV4dGVuZCB0aGlzIGNsYXNzKQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQkVBTiA9IChFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRQ0KLSAgICAgICAgKyAiLmN1c3RvbS4iICsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKQ0KLSAgICAgICAgLnJlcGxhY2UoIi4iLCAiXyIpOw0KLSAgICBwcml2YXRlIFN0cmluZyBiYXNlUGFja2FnZSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fRVhURU5TSU9OX0JBU0VfUEFDS0FHRTsNCi0NCi0gICAgcHVibGljIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgew0KLSAgICAgICAgaWYgKHRoaXMuYmFzZVBhY2thZ2UgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmJhc2VQYWNrYWdlID0gRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUNCi0gICAgICAgICAgICAgICAgKyAiLmN1c3RvbS4iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCF0aGlzLmJhc2VQYWNrYWdlLmVuZHNXaXRoKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5iYXNlUGFja2FnZSA9IHRoaXMuYmFzZVBhY2thZ2UgKyAiLiI7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRCYXNlUGFja2FnZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBiYXNlUGFja2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEN1c3RvbUFubm90YXRpb25FeHRyYWN0b3JGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVBhY2thZ2UgKyAiQW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnkiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tQW5ub3RhdGlvbkV4dHJhY3RvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmJhc2VQYWNrYWdlICsgIkFubm90YXRpb25FeHRyYWN0b3IiOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHBvc3RmaXggdXNlZCBieSB0aGUgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLSAgICAgKiB0aGUgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBpcyBmb3IgY3VzdG9tIHN0cmF0ZWdpZXMgb25seQ0KLSAgICAgKiAobm90IGZvciBwdWJsaWMgdmFsaWRhdGlvbiBtb2R1bGVzKQ0KLSAgICAgKiBzbyBpdCdzIGZpbmUgdG8gY3VzdG9taXplIGl0DQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneVBvc3RmaXgoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIlZhbGlkYXRpb25TdHJhdGVneSI7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogbmFtZSBtYXBwZXINCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5iYXNlUGFja2FnZSArICJWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDdXN0b21Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVBhY2thZ2UgKyAiQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciI7DQotICAgIH0NCi0NCi0gICAgQERlcHJlY2F0ZWQNCi0gICAgcHVibGljIFN0cmluZyBnZXRDdXN0b21BZGFwdGVyTmFtZU1hcHBlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmJhc2VQYWNrYWdlICsgIkFkYXB0ZXJOYW1lTWFwcGVyIjsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBmYWN0b3JpZXMNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tTWVzc2FnZVJlc29sdmVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmJhc2VQYWNrYWdlICsgIk1lc3NhZ2VSZXNvbHZlckZhY3RvcnkiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmJhc2VQYWNrYWdlICsgIlZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkiOw0KLSAgICB9DQotDQotICAgIEBEZXByZWNhdGVkDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tQ29udmVydGVyQWRhcHRlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5iYXNlUGFja2FnZSArICJDb252ZXJ0ZXJBZGFwdGVyRmFjdG9yeSI7DQotICAgIH0NCi0NCi0gICAgLy9UT0RPDQotICAgIC8qDQotICAgICAqIGNvbnZlbnRpb25zICh0aGUgcmVzdCBvZiB0aGUgY29udmVudGlvbnMgYXJlIGJ1aWx0IHdpdGggdGhlIGhlbHAgb2YgbmFtZSBtYXBwZXJzLC4uLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRDb252ZW50aW9uRm9yTWVzc2FnZUJ1bmRsZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmJhc2VQYWNrYWdlICsgInZhbGlkYXRpb25fbWVzc2FnZXMiOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHN0YXRpYyBzdHJhdGVneSBtYXBwaW5ncyAobmFtZSBvZiBwcm9wZXJ0eSBmaWxlcykNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tU3RhdGljU3RyYXRlZ3lNYXBwaW5nU291cmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVBhY2thZ2UgKyAic3RyYXRlZ3lfbWFwcGluZ3MiOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHN0YXRpY1N0cmF0ZWd5TWFwcGluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgLyoNCi0gICAgICogZmluYWwgbWV0aG9kcw0KLSAgICAgKi8NCi0gICAgLy9UT0RPDQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Q29udmVudGlvbkZvck1vZHVsZU1lc3NhZ2VCdW5kbGUoU3RyaW5nIHBhY2thZ2VOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbmV3UGFja2FnZU5hbWU7DQotICAgICAgICBpZiAocGFja2FnZU5hbWUuZW5kc1dpdGgoIi5yZXNvbHZlciIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5ld1BhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUucmVwbGFjZSgiLnJlc29sdmVyIiwgIi5idW5kbGUiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBuZXdQYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lLnJlcGxhY2UoIi5yZXNvbHZlci4iLCAiLmJ1bmRsZS4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXdQYWNrYWdlTmFtZSArICIudmFsaWRhdGlvbl9tZXNzYWdlcyI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXRTdGF0aWNTdHJhdGVneU1hcHBpbmdTb3VyY2VzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGljU3RyYXRlZ3lNYXBwaW5nczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBhZGRTdGF0aWNTdHJhdGVneU1hcHBpbmdTb3VyY2UoU3RyaW5nIHJlc291cmNlQnVuZGxlTmFtZSkNCi0gICAgew0KLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuc3RhdGljU3RyYXRlZ3lNYXBwaW5ncy5hZGQocmVzb3VyY2VCdW5kbGVOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBjb250YWluc1N0YXRpY1N0cmF0ZWd5TWFwcGluZ1NvdXJjZSgNCi0gICAgICAgIFN0cmluZyByZXNvdXJjZUJ1bmRsZU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnN0YXRpY1N0cmF0ZWd5TWFwcGluZ3MuY29udGFpbnMocmVzb3VyY2VCdW5kbGVOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Q29udmVudGlvbk5hbWVGb3JNZXNzYWdlUmVzb2x2ZXJQYWNrYWdlKA0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsDQotICAgICAgICBTdHJpbmcgdGFyZ2V0Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzb2x2ZXJOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0TmFtZSgpOw0KLQ0KLSAgICAgICAgcmVzb2x2ZXJOYW1lID0gcmVzb2x2ZXJOYW1lLnJlcGxhY2UoIi5zdHJhdGVneS4iLCAiLm1lc3NhZ2UucmVzb2x2ZXIuIik7DQotDQotICAgICAgICBpZiAodGFyZ2V0Q2xhc3NOYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9UT0RPDQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzb2x2ZXJOYW1lLnN1YnN0cmluZygwLCByZXNvbHZlck5hbWUubGFzdEluZGV4T2YoIi4iKSkgKyAiLiINCi0gICAgICAgICAgICArIHRhcmdldENsYXNzTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Q29udmVudGlvbk5hbWVGb3JNZXNzYWdlUmVzb2x2ZXJDbGFzcygNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHN0cmF0ZWd5Q2xhc3NOYW1lLmVuZHNXaXRoKCJWYWxpZGF0aW9uU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gc3RyYXRlZ3lDbGFzc05hbWUuc3Vic3RyaW5nKDAsDQotICAgICAgICAgICAgICAgIHN0cmF0ZWd5Q2xhc3NOYW1lLmxlbmd0aCgpIC0gMTgpDQotICAgICAgICAgICAgICAgICsgIlZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChzdHJhdGVneUNsYXNzTmFtZS5lbmRzV2l0aCgiU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gc3RyYXRlZ3lDbGFzc05hbWUuc3Vic3RyaW5nKDAsDQotICAgICAgICAgICAgICAgIHN0cmF0ZWd5Q2xhc3NOYW1lLmxlbmd0aCgpIC0gOCkNCi0gICAgICAgICAgICAgICAgKyAiVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIjsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzdHJhdGVneUNsYXNzTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Q29udmVudGlvbk5hbWVGb3JWYWxpZGF0aW9uU3RyYXRlZ3koDQotICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpLnJlcGxhY2UoIi5hbm5vdGF0aW9uLiIsDQotICAgICAgICAgICAgIi5zdHJhdGVneS4iKQ0KLSAgICAgICAgICAgICsgIlN0cmF0ZWd5IjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlmZTcwYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VFbnVtOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUVudW0uSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeQotewotICAgIHByaXZhdGUgT2JqZWN0IGJlYW47Ci0gICAgcHJpdmF0ZSBPYmplY3QgY29udmVydGVkVmFsdWU7Ci0gICAgcHJpdmF0ZSBVSUNvbXBvbmVudCBjb21wb25lbnQ7Ci0gICAgLy9mb3IgY29tcGxleCBjb21wb25lbnRzIChlLmcuIGEgdGFibGUgdGhlcmUgYXJlIG11bHRpcGxlIGVudHJpZXMgd2l0aAotICAgIC8vdGhlIHNhbWUga2V5IChoZXJlIHRoZSBlbCBleHByZXNzaW9uICN7ZW50cnkucHJvcGVydHl9KQotICAgIC8vaG93ZXZlciwgZG9uJ3Qgb3ZlcnJpZGUgdGhlIHByZXZpb3VzIGVudHJ5IC0gdGhleSBhcm4ndCB0aGUgc2FtZTsKLSAgICBwcml2YXRlIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4gZnVydGhlckVudHJpZXM7Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmVhbihPYmplY3QgYmVhbikKLSAgICB7Ci0gICAgICAgIHRoaXMuYmVhbiA9IGJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkVmFsdWUoT2JqZWN0IGNvbnZlcnRlZFZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy5jb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBVSUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnQoVUlDb21wb25lbnQgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4gZ2V0RnVydGhlckVudHJpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZ1cnRoZXJFbnRyaWVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZ1cnRoZXJFbnRyaWVzKExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4gZnVydGhlckVudHJpZXMpCi0gICAgewotICAgICAgICB0aGlzLmZ1cnRoZXJFbnRyaWVzID0gZnVydGhlckVudHJpZXM7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY5ZGU4Yy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlRW51bTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VFbnVtLklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICAvKg0KLSAgICAgKiBjdXN0b20NCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FU1NBR0VfQlVORExFID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVTU0FHRV9CVU5ETEUiKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fRVhURU5TSU9OX0JBU0VfUEFDS0FHRSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0JBU0VfUEFDS0FHRSIpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DT05WRU5USU9OX0lORk9fUFJPVklERVJfQkVBTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfTkFNRV9NQVBQRVIiKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQU5OT1RBVElPTl9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQU5OT1RBVElPTl9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSIpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkiKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQU5OT1RBVElPTl9FWFRSQUNUT1JfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0FOTk9UQVRJT05fRVhUUkFDVE9SX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQU5OT1RBVElPTl9FWFRSQUNUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9BTk5PVEFUSU9OX0VYVFJBQ1RPUiIpOw0KLQ0KLSAgICAvL1RPRE8gZG9jdW1lbnRhdGlvbg0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OU1RSQVRFR1lfTUFQUElORyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OU1RSQVRFR1lfTUFQUElORyIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBkZWFjdGl2YXRlDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfUkVTVE9SRV9QUk9YWV9QSEFTRV9MSVNURU5FUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9SRVNUT1JFX1BST1hZX1BIQVNFX0xJU1RFTkVSIik7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfREVGQVVMVF9DT05WRU5USU9OIik7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9QUk9YWV9NQVBQSU5HID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1BST1hZX01BUFBJTkciKTsNCi0NCi0gICAgLyoNCi0gICAgICogZmFsbGJhY2sgbGliIC0gaWYgdGhlIHVzYWdlIG9mIGNnbGliIGlzIGEgcHJvYmxlbQ0KLSAgICAgKi8NCi0gICAgQERlcHJlY2F0ZWQNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09OVkVSVEVSX1RPX0FEQVBURVJfTkFNRV9NQVBQRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT05WRVJURVJfVE9fQURBUFRFUl9OQU1FX01BUFBFUiIpOw0KLSAgICBARGVwcmVjYXRlZA0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DT05WRVJURVJfQURBUFRFUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09OVkVSVEVSX0FEQVBURVJfRkFDVE9SWSIpOw0KLSAgICBARGVwcmVjYXRlZA0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9BREFQVEVSUyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiVVNFX0FEQVBURVJTIik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9hZGFwdGVyL0RlZmF1bHRDb252ZXJ0ZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2FkYXB0ZXIvRGVmYXVsdENvbnZlcnRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZWVhNGUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2FkYXB0ZXIvRGVmYXVsdENvbnZlcnRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYWRhcHRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hZGFwdGVyLm1hcHBlci5DdXN0b21Db25maWd1cmVkQ29udmVydGVyVG9BZGFwdGVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYWRhcHRlci5tYXBwZXIuQ3VzdG9tQ29udmVudGlvbkNvbnZlcnRlclRvQWRhcHRlck5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmFkYXB0ZXIubWFwcGVyLkRlZmF1bHRDb252ZXJ0ZXJUb0FkYXB0ZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hZGFwdGVyLm1hcHBlci5TaW1wbGVDb252ZXJ0ZXJUb0FkYXB0ZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlRW51bTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICoganVzdCBmb3IgdGhlIGZhbGxiYWNrIHNvbHV0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUVudW0uRkFMTEJBQ0spDQotcHVibGljIGNsYXNzIERlZmF1bHRDb252ZXJ0ZXJBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzDQotICAgIENsYXNzTWFwcGluZ0ZhY3Rvcnk8Q29udmVydGVyLCBDb252ZXJ0ZXI+DQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbnZlcnRlckFkYXB0ZXJNYXBwaW5nID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8TmFtZU1hcHBlcjxDb252ZXJ0ZXI+PiBuYW1lTWFwcGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxDb252ZXJ0ZXI+PigpOw0KLQ0KLSAgICBzdGF0aWMNCi0gICAgew0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QuYWRkKG5ldyBDdXN0b21Db25maWd1cmVkQ29udmVydGVyVG9BZGFwdGVyTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIG5hbWVNYXBwZXJMaXN0LmFkZChuZXcgQ3VzdG9tQ29udmVudGlvbkNvbnZlcnRlclRvQWRhcHRlck5hbWVNYXBwZXIoKSk7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdC5hZGQobmV3IERlZmF1bHRDb252ZXJ0ZXJUb0FkYXB0ZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QuYWRkKG5ldyBTaW1wbGVDb252ZXJ0ZXJUb0FkYXB0ZXJOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBDb252ZXJ0ZXIgY3JlYXRlKENvbnZlcnRlciBjb252ZXJ0ZXIpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjb252ZXJ0ZXJOYW1lID0gY29udmVydGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLQ0KLSAgICAgICAgaWYgKGNvbnZlcnRlckFkYXB0ZXJNYXBwaW5nLmNvbnRhaW5zS2V5KGNvbnZlcnRlck5hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoQ29udmVydGVyKSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgIC50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNvbnZlcnRlckFkYXB0ZXJNYXBwaW5nDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KGNvbnZlcnRlck5hbWUpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIENvbnZlcnRlciBhZGFwdGVyOw0KLSAgICAgICAgU3RyaW5nIGFkYXB0ZXJOYW1lOw0KLQ0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPENvbnZlcnRlcj4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkYXB0ZXJOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKGNvbnZlcnRlcik7DQotICAgICAgICAgICAgYWRhcHRlciA9IChDb252ZXJ0ZXIpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoYWRhcHRlck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKGNvbnZlcnRlck5hbWUsIGFkYXB0ZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoInVzZWQgYWRhcHRlcjogIiArIGFkYXB0ZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBhZGFwdGVyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCJubyBhZGFwdGVyIGZvdW5kIGZvciAiICsgY29udmVydGVyTmFtZQ0KLSAgICAgICAgICAgICAgICArICIgLT4gY29udmVydGVyIGl0c2VsZiBpcyB1c2VkIC0+IG5vIHNldi1lbiBzdXBwb3J0Iik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY29udmVydGVyOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBzb3VyY2VDb252ZXJ0ZXIsIFN0cmluZyBhZGFwdGVyKQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKERlZmF1bHRDb252ZXJ0ZXJBZGFwdGVyRmFjdG9yeS5jbGFzcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjb252ZXJ0ZXJBZGFwdGVyTWFwcGluZy5wdXQoc291cmNlQ29udmVydGVyLCBhZGFwdGVyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vVE9ETyBsb2dnaW5nDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2FkYXB0ZXIvRXh0VmFsRmFsbGJhY2tDb252ZXJ0ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9hZGFwdGVyL0V4dFZhbEZhbGxiYWNrQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ODMwNjEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2FkYXB0ZXIvRXh0VmFsRmFsbGJhY2tDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmFkYXB0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5LkV4dFZhbENvbnZlcnRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlRW51bTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlcjsNCi0NCi0vKioNCi0gKiBqdXN0IGZvciB0aGUgZmFsbGJhY2sgc29sdXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlRW51bS5GQUxMQkFDSykNCi1wdWJsaWMgY2xhc3MgRXh0VmFsRmFsbGJhY2tDb252ZXJ0ZXIgZXh0ZW5kcyBFeHRWYWxDb252ZXJ0ZXINCi17DQotICAgIHByaXZhdGUgQ29udmVydGVyIHdyYXBwZWQ7DQotDQotICAgIHB1YmxpYyBFeHRWYWxGYWxsYmFja0NvbnZlcnRlcihDb252ZXJ0ZXIgY29udmVydGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSBjb252ZXJ0ZXI7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXNTdHJpbmcoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmICh0aGlzLndyYXBwZWQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2luZGlyZWN0IGFwcHJvYWNoIGZvciBjb21wbGV4IGNvbXBvbmVudHMNCi0gICAgICAgICAgICBDb252ZXJ0ZXIgY29udmVydGVyID0gRXh0VmFsVXRpbHMudHJ5VG9DcmVhdGVPcmlnaW5hbENvbnZlcnRlcigNCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgICAgICAgICAgaWYgKGNvbnZlcnRlciA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIChvID09IG51bGwpID8gbnVsbCA6IG8udG9TdHJpbmcoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlci5nZXRBc1N0cmluZyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZC5nZXRBc1N0cmluZyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRDb252ZXJ0ZWRPYmplY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBzKQ0KLSAgICB7DQotICAgICAgICBpZiAodGhpcy53cmFwcGVkID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9pbmRpcmVjdCBhcHByb2FjaCBmb3IgY29tcGxleCBjb21wb25lbnRzDQotICAgICAgICAgICAgLy9UT0RPDQotICAgICAgICAgICAgQ29udmVydGVyIGNvbnZlcnRlciA9IEV4dFZhbFV0aWxzLnRyeVRvQ3JlYXRlT3JpZ2luYWxDb252ZXJ0ZXIoDQotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgICAgIHJldHVybiAoY29udmVydGVyICE9IG51bGwpID8gY29udmVydGVyLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIHMpIDogczsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHMpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9hZGFwdGVyL21hcHBlci9DdXN0b21Db25maWd1cmVkQ29udmVydGVyVG9BZGFwdGVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2FkYXB0ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRDb252ZXJ0ZXJUb0FkYXB0ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMmM1MWMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2FkYXB0ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRDb252ZXJ0ZXJUb0FkYXB0ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hZGFwdGVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VFbnVtOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXI7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VFbnVtLkZBTExCQUNLKQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkQ29udmVydGVyVG9BZGFwdGVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxDb252ZXJ0ZXI+DQotew0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9DT05WRVJURVJfVE9fQURBUFRFUl9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvYWRhcHRlci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkNvbnZlcnRlclRvQWRhcHRlck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9hZGFwdGVyL21hcHBlci9DdXN0b21Db252ZW50aW9uQ29udmVydGVyVG9BZGFwdGVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTA1NTRmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9hZGFwdGVyL21hcHBlci9DdXN0b21Db252ZW50aW9uQ29udmVydGVyVG9BZGFwdGVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYWRhcHRlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUVudW07DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXI7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VFbnVtLkZBTExCQUNLKQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZW50aW9uQ29udmVydGVyVG9BZGFwdGVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxDb252ZXJ0ZXI+DQotew0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXRDdXN0b21BZGFwdGVyTmFtZU1hcHBlcigpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9hZGFwdGVyL21hcHBlci9EZWZhdWx0Q29udmVydGVyVG9BZGFwdGVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2FkYXB0ZXIvbWFwcGVyL0RlZmF1bHRDb252ZXJ0ZXJUb0FkYXB0ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYzRkZjIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2FkYXB0ZXIvbWFwcGVyL0RlZmF1bHRDb252ZXJ0ZXJUb0FkYXB0ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hZGFwdGVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUVudW07DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUVudW0uRkFMTEJBQ0spDQotcHVibGljIGNsYXNzIERlZmF1bHRDb252ZXJ0ZXJUb0FkYXB0ZXJOYW1lTWFwcGVyIGltcGxlbWVudHMNCi0gICAgTmFtZU1hcHBlcjxDb252ZXJ0ZXI+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoQ29udmVydGVyIGNvbnZlcnRlcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlci5nZXRDbGFzcygpLmdldE5hbWUoKSArICJBZGFwdGVyIjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvYWRhcHRlci9tYXBwZXIvU2ltcGxlQ29udmVydGVyVG9BZGFwdGVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2FkYXB0ZXIvbWFwcGVyL1NpbXBsZUNvbnZlcnRlclRvQWRhcHRlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhY2JhNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvYWRhcHRlci9tYXBwZXIvU2ltcGxlQ29udmVydGVyVG9BZGFwdGVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYWRhcHRlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUVudW07DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUVudW0uRkFMTEJBQ0spDQotcHVibGljIGNsYXNzIFNpbXBsZUNvbnZlcnRlclRvQWRhcHRlck5hbWVNYXBwZXIgaW1wbGVtZW50cw0KLSAgICBOYW1lTWFwcGVyPENvbnZlcnRlcj4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShDb252ZXJ0ZXIgY29udmVydGVyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUNCi0gICAgICAgICAgICArICIuYWRhcHRlci4iICsgY29udmVydGVyLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpDQotICAgICAgICAgICAgKyAiQWRhcHRlciI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2Fubm90YXRpb24vQW5ub3RhdGlvbkVudHJ5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA4NzZlNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUVudW07DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlRW51bS5BUEkpDQotcHVibGljIGNsYXNzIEFubm90YXRpb25FbnRyeQ0KLXsNCi0gICAgcHJpdmF0ZSBBbm5vdGF0aW9uIGFubm90YXRpb247DQotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotICAgIC8vZS5nLiB2YWx1ZUJpbmRpbmdOYW1lLCBEZWZhdWx0VmFsdWVCaW5kaW5nU2Nhbm5pbmdBbm5vdGF0aW9uRXh0cmFjdG9yIHVzZXMgaXQgZm9yIHRoZSB2YXJpYWJsZS0vbWV0aG9kLW5hbWUNCi0gICAgcHJpdmF0ZSBTdHJpbmcgYm91bmRUbzsNCi0gICAgcHJpdmF0ZSBDbGFzcyBlbnRpdHlDbGFzczsNCi0NCi0gICAgLy9yZXF1ZXN0ZWQgYnkgYmVybmhhcmQgaHVlbWVyDQotICAgIHB1YmxpYyA8VD4gVCBnZXRBbm5vdGF0aW9uKENsYXNzPFQ+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFQpIGFubm90YXRpb247DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0QW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHRoaXMuYW5ub3RhdGlvbiA9IGFubm90YXRpb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWVCaW5kaW5nRXhwcmVzc2lvbihTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJvdW5kVG8oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYm91bmRUbzsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRCb3VuZFRvKFN0cmluZyBib3VuZFRvKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmJvdW5kVG8gPSBib3VuZFRvOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzcyBnZXRFbnRpdHlDbGFzcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBlbnRpdHlDbGFzczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnRpdHlDbGFzcyhDbGFzcyBlbnRpdHlDbGFzcykNCi0gICAgew0KLSAgICAgICAgdGhpcy5lbnRpdHlDbGFzcyA9IGVudGl0eUNsYXNzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9hbm5vdGF0aW9uL2V4dHJhY3Rvci9Bbm5vdGF0aW9uRXh0cmFjdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvYW5ub3RhdGlvbi9leHRyYWN0b3IvQW5ub3RhdGlvbkV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzQxZDI3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9hbm5vdGF0aW9uL2V4dHJhY3Rvci9Bbm5vdGF0aW9uRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hbm5vdGF0aW9uLmV4dHJhY3RvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUVudW07DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VFbnVtLkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIEFubm90YXRpb25FeHRyYWN0b3INCi17DQotICAgIExpc3Q8QW5ub3RhdGlvbkVudHJ5PiBleHRyYWN0QW5ub3RhdGlvbnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0KTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2Fubm90YXRpb24vZXh0cmFjdG9yL0Fubm90YXRpb25FeHRyYWN0b3JGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvYW5ub3RhdGlvbi9leHRyYWN0b3IvQW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcyZTY5ZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvYW5ub3RhdGlvbi9leHRyYWN0b3IvQW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmFubm90YXRpb24uZXh0cmFjdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VFbnVtOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUVudW0uQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnkNCi17DQotICAgIEFubm90YXRpb25FeHRyYWN0b3IgY3JlYXRlKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0QW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0QW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU1YmE0OS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdEFubm90YXRpb25FeHRyYWN0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hbm5vdGF0aW9uLmV4dHJhY3RvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIERlZmF1bHRBbm5vdGF0aW9uRXh0cmFjdG9yRmFjdG9yeSBpbXBsZW1lbnRzDQotICAgIEFubm90YXRpb25FeHRyYWN0b3JGYWN0b3J5DQotew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uRXh0cmFjdG9yIGFubm90YXRpb25FeHRyYWN0b3IgPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgQW5ub3RhdGlvbkV4dHJhY3RvciBjcmVhdGUoKQ0KLSAgICB7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbkV4dHJhY3RvciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBhbm5vdGF0aW9uRXh0cmFjdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgICAgIGFubm90YXRpb25FeHRyYWN0b3JDbGFzc05hbWVzDQotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9BTk5PVEFUSU9OX0VYVFJBQ1RPUik7DQotICAgICAgICAgICAgYW5ub3RhdGlvbkV4dHJhY3RvckNsYXNzTmFtZXMuYWRkKEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXRDdXN0b21Bbm5vdGF0aW9uRXh0cmFjdG9yKCkpOw0KLSAgICAgICAgICAgIGFubm90YXRpb25FeHRyYWN0b3JDbGFzc05hbWVzDQotICAgICAgICAgICAgICAgIC5hZGQoRGVmYXVsdENvbXBvbmVudEFubm90YXRpb25FeHRyYWN0b3IuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBhbm5vdGF0aW9uRXh0cmFjdG9yQ2xhc3NOYW1lcykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFubm90YXRpb25FeHRyYWN0b3IgPSAoQW5ub3RhdGlvbkV4dHJhY3RvcikgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb25FeHRyYWN0b3IgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgLy9UT0RPIGxvZ2dpbmcNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25FeHRyYWN0b3I7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRBbm5vdGF0aW9uRXh0cmFjdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudEFubm90YXRpb25FeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg4Mzg1My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudEFubm90YXRpb25FeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hbm5vdGF0aW9uLmV4dHJhY3RvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hbm5vdGF0aW9uLkFubm90YXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRUxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIERlZmF1bHRDb21wb25lbnRBbm5vdGF0aW9uRXh0cmFjdG9yIGltcGxlbWVudHMgQW5ub3RhdGlvbkV4dHJhY3Rvcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIExpc3Q8QW5ub3RhdGlvbkVudHJ5PiBleHRyYWN0QW5ub3RhdGlvbnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCkNCi0gICAgew0KLSAgICAgICAgLy9zaG91bGQgbmV2ZXIgb2NjdXINCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8NCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uRW50cnk+KCk7DQotICAgICAgICB9DQotDQotICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCA9IChVSUNvbXBvbmVudCkgb2JqZWN0Ow0KLQ0KLSAgICAgICAgTGlzdDxBbm5vdGF0aW9uRW50cnk+IGFubm90YXRpb25FbnRyaWVzID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uRW50cnk+KCk7DQotDQotICAgICAgICBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IEVMVXRpbHMNCi0gICAgICAgICAgICAuZ2V0UmVsaWFibGVWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmICh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8QW5ub3RhdGlvbkVudHJ5PigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIGdldCBiZWFuIGNsYXNzIGFuZCBwcm9wZXJ0eSBuYW1lDQotICAgICAgICAgKi8NCi0gICAgICAgIGludCBiZWFuUHJvcGVydHlCb3JkZXIgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmxhc3RJbmRleE9mKCcuJyk7DQotDQotICAgICAgICBpZiAoYmVhblByb3BlcnR5Qm9yZGVyIDwgMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uRW50cnk+KCk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgYmVhbnMgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLnN1YnN0cmluZyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgLmluZGV4T2YoJ3snKSArIDEsIGJlYW5Qcm9wZXJ0eUJvcmRlcik7DQotDQotICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLnN1YnN0cmluZygNCi0gICAgICAgICAgICBiZWFuUHJvcGVydHlCb3JkZXIgKyAxLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmluZGV4T2YoJ30nKSk7DQotDQotICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IEVMVXRpbHMuZ2V0VHlwZU9mVmFsdWVCaW5kaW5nRm9yRXhwcmVzc2lvbigNCi0gICAgICAgICAgICBmYWNlc0NvbnRleHQsICIjeyIgKyBiZWFucyArICJ9Iik7DQotDQotICAgICAgICAvL2NyZWF0ZSB0ZW1wbGF0ZSBlbnRyeQ0KLSAgICAgICAgQW5ub3RhdGlvbkVudHJ5IHRlbXBsYXRlRW50cnkgPSBuZXcgQW5ub3RhdGlvbkVudHJ5KCk7DQotICAgICAgICAvL1RPRE8gdGVzdCB3aXRoIGNvbXBsZXggY29tcG9uZW50cw0KLSAgICAgICAgdGVtcGxhdGVFbnRyeS5zZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgdGVtcGxhdGVFbnRyeS5zZXRFbnRpdHlDbGFzcyhlbnRpdHlDbGFzcyk7DQotICAgICAgICAvL1RPRE8NCi0gICAgICAgIHRlbXBsYXRlRW50cnkuc2V0Qm91bmRUbygidmFsdWUiKTsNCi0NCi0gICAgICAgIC8qDQotICAgICAgICAgKiBmaW5kIGFuZCBhZGQgYW5ub3RhdGlvbnMNCi0gICAgICAgICAqLw0KLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gZW50aXR5Q2xhc3M7DQotDQotICAgICAgICB3aGlsZSAoIU9iamVjdC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoY3VycmVudENsYXNzLCBwcm9wZXJ0eSwNCi0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkVudHJpZXMsIHRlbXBsYXRlRW50cnkpOw0KLSAgICAgICAgICAgIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoY3VycmVudENsYXNzLCBwcm9wZXJ0eSwNCi0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkVudHJpZXMsIHRlbXBsYXRlRW50cnkpOw0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBmb3IgKENsYXNzIGN1cnJlbnRJbnRlcmZhY2UgOiBlbnRpdHlDbGFzcy5nZXRJbnRlcmZhY2VzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudEludGVyZmFjZTsNCi0NCi0gICAgICAgICAgICB3aGlsZSAoY3VycmVudENsYXNzICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGN1cnJlbnRDbGFzcywgcHJvcGVydHksDQotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRW50cmllcywgdGVtcGxhdGVFbnRyeSk7DQotDQotICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25FbnRyaWVzOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uRW50cnk+IGFubm90YXRpb25FbnRyaWVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25FbnRyeSB0ZW1wbGF0ZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpDQotICAgICAgICAgICAgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSk7DQotDQotICAgICAgICBNZXRob2QgbWV0aG9kOw0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0aG9kID0gZW50aXR5LmdldERlY2xhcmVkTWV0aG9kKCJnZXQiICsgcHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWV0aG9kID0gZW50aXR5LmdldERlY2xhcmVkTWV0aG9kKCJpcyIgKyBwcm9wZXJ0eSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZTEpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIm1ldGhvZCBub3QgZm91bmQgLSBjbGFzczogIiArIGVudGl0eS5nZXROYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICsgIiAtIG1ldGhvZHM6ICIgKyAiZ2V0IiArIHByb3BlcnR5ICsgIiAiICsgImlzIg0KLSAgICAgICAgICAgICAgICAgICAgKyBwcm9wZXJ0eSk7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBhZGRBbm5vdGF0aW9uVG9Bbm5vdGF0aW9uRW50cmllcyhhbm5vdGF0aW9uRW50cmllcywgQXJyYXlzDQotICAgICAgICAgICAgLmFzTGlzdChtZXRob2QuZ2V0QW5ub3RhdGlvbnMoKSksIHRlbXBsYXRlRW50cnkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uRW50cnk+IGFubm90YXRpb25FbnRyaWVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25FbnRyeSB0ZW1wbGF0ZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBGaWVsZCBmaWVsZDsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZpZWxkID0gZW50aXR5LmdldERlY2xhcmVkRmllbGQocHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmllbGQgPSBlbnRpdHkuZ2V0RGVjbGFyZWRGaWVsZCgiXyIgKyBwcm9wZXJ0eSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiZmllbGQgIiArIHByb3BlcnR5ICsgIiBvciBfIiArIHByb3BlcnR5DQotICAgICAgICAgICAgICAgICAgICArICIgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBhZGRBbm5vdGF0aW9uVG9Bbm5vdGF0aW9uRW50cmllcyhhbm5vdGF0aW9uRW50cmllcywgQXJyYXlzLmFzTGlzdChmaWVsZA0KLSAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9ucygpKSwgdGVtcGxhdGVFbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoDQotICAgICAgICBMaXN0PEFubm90YXRpb25FbnRyeT4gYW5ub3RhdGlvbkVudHJpZXMsDQotICAgICAgICBMaXN0PEFubm90YXRpb24+IGFubm90YXRpb25zLCBBbm5vdGF0aW9uRW50cnkgdGVtcGxhdGVFbnRyeSkNCi0gICAgew0KLSAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhbm5vdGF0aW9uRW50cmllcy5hZGQoY3JlYXRlQW5ub3RhdGlvbkVudHJ5KGFubm90YXRpb24sDQotICAgICAgICAgICAgICAgIHRlbXBsYXRlRW50cnkpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbkVudHJ5IGNyZWF0ZUFubm90YXRpb25FbnRyeShBbm5vdGF0aW9uIGZvdW5kQW5ub3RhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbkVudHJ5IHRlbXBsYXRlRW50cnkpDQotICAgIHsNCi0gICAgICAgIEFubm90YXRpb25FbnRyeSBlbnRyeSA9IG5ldyBBbm5vdGF0aW9uRW50cnkoKTsNCi0NCi0gICAgICAgIGVudHJ5LnNldEFubm90YXRpb24oZm91bmRBbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgIGVudHJ5LnNldEVudGl0eUNsYXNzKHRlbXBsYXRlRW50cnkuZ2V0RW50aXR5Q2xhc3MoKSk7DQotICAgICAgICBlbnRyeS5zZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHRlbXBsYXRlRW50cnkNCi0gICAgICAgICAgICAuZ2V0VmFsdWVCaW5kaW5nRXhwcmVzc2lvbigpKTsNCi0gICAgICAgIGVudHJ5LnNldEJvdW5kVG8odGVtcGxhdGVFbnRyeS5nZXRCb3VuZFRvKCkpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGVudHJ5Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9jbGllbnQvSFRNTC5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2NsaWVudC9IVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmNmYzEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2NsaWVudC9IVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5jbGllbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5BcnJheVV0aWxzOwotCi0KLS8qKgotICogY29waWVkIGluIG9yZGVyIHRvIHByb3ZpZGUgaXQgdG8gY3VzdG9tIGNsaWVudC1zaWRlIHZhbGlkYXRvcnMKLSAqIDxwLz4KLSAqIENvbnN0YW50IGRlY2xhcmF0aW9ucyBmb3IgSFRNTCByZW5kZXJpbmcuCi0gKgotICogQGF1dGhvciBNYW5mcmVkIEdlaWxlcgotICogQGF1dGhvciBBbnRvbiBLb2lub3YKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogNDcyNjE4ICQgJERhdGU6IDIwMDYtMTEtMDggMjA6MDY6NTQgKzAwMDAgKFdlZCwgMDggTm92IDIwMDYpICQKLSAqLwotcHVibGljIGludGVyZmFjZSBIVE1MCi17Ci0KLSAgICAvLyBDb21tb24gYXR0cmlidXRlcwotICAgIFN0cmluZyBBTElHTl9BVFRSID0gImFsaWduIjsKLSAgICBTdHJpbmcgREFUQUZMRF9BVFRSID0gImRhdGFmbGQiOwotICAgIFN0cmluZyBEQVRBU1JDX0FUVFIgPSAiZGF0YXNyYyI7Ci0gICAgU3RyaW5nIERBVEFGT1JNQVRBU19BVFRSID0gImRhdGFmb3JtYXRhcyI7Ci0gICAgU3RyaW5nIEJPUkRFUl9BVFRSID0gImJvcmRlciI7Ci0gICAgU3RyaW5nIFdJRFRIX0FUVFIgPSAid2lkdGgiOwotICAgIFN0cmluZyBSRUFET05MWV9BVFRSID0gInJlYWRvbmx5IjsKLSAgICBTdHJpbmcgRklMRV9BVFRSID0gImZpbGUiOwotICAgIFN0cmluZyBBQ0NFUFRfQVRUUiA9ICJhY2NlcHQiOwotCi0gICAgLy8gQ29tbW9uIGV2ZW50IGhhbmRsZXIgYXR0cmlidXRlcwotICAgIFN0cmluZyBPTkNMSUNLX0FUVFIgPSAib25jbGljayI7Ci0gICAgU3RyaW5nIE9OREJMQ0xJQ0tfQVRUUiA9ICJvbmRibGNsaWNrIjsKLSAgICBTdHJpbmcgT05NT1VTRURPV05fQVRUUiA9ICJvbm1vdXNlZG93biI7Ci0gICAgU3RyaW5nIE9OTU9VU0VVUF9BVFRSID0gIm9ubW91c2V1cCI7Ci0gICAgU3RyaW5nIE9OTU9VU0VPVkVSX0FUVFIgPSAib25tb3VzZW92ZXIiOwotICAgIFN0cmluZyBPTk1PVVNFTU9WRV9BVFRSID0gIm9ubW91c2Vtb3ZlIjsKLSAgICBTdHJpbmcgT05NT1VTRU9VVF9BVFRSID0gIm9ubW91c2VvdXQiOwotICAgIFN0cmluZyBPTktFWVBSRVNTX0FUVFIgPSAib25rZXlwcmVzcyI7Ci0gICAgU3RyaW5nIE9OS0VZRE9XTl9BVFRSID0gIm9ua2V5ZG93biI7Ci0gICAgU3RyaW5nIE9OS0VZVVBfQVRUUiA9ICJvbmtleXVwIjsKLSAgICBTdHJpbmdbXSBFVkVOVF9IQU5ETEVSX0FUVFJJQlVURVNfV0lUSE9VVF9PTkNMSUNLID0KLSAgICAgICAgewotICAgICAgICAgICAgT05EQkxDTElDS19BVFRSLAotICAgICAgICAgICAgT05NT1VTRURPV05fQVRUUiwKLSAgICAgICAgICAgIE9OTU9VU0VVUF9BVFRSLAotICAgICAgICAgICAgT05NT1VTRU9WRVJfQVRUUiwKLSAgICAgICAgICAgIE9OTU9VU0VNT1ZFX0FUVFIsCi0gICAgICAgICAgICBPTk1PVVNFT1VUX0FUVFIsCi0gICAgICAgICAgICBPTktFWVBSRVNTX0FUVFIsCi0gICAgICAgICAgICBPTktFWURPV05fQVRUUiwKLSAgICAgICAgICAgIE9OS0VZVVBfQVRUUgotICAgICAgICB9OwotICAgIFN0cmluZ1tdIEVWRU5UX0hBTkRMRVJfQVRUUklCVVRFUyA9Ci0gICAgICAgIChTdHJpbmdbXSkgQXJyYXlVdGlscy5jb25jYXQoCi0gICAgICAgICAgICBFVkVOVF9IQU5ETEVSX0FUVFJJQlVURVNfV0lUSE9VVF9PTkNMSUNLLAotICAgICAgICAgICAgbmV3IFN0cmluZ1tde09OQ0xJQ0tfQVRUUn0pOwotCi0gICAgLy8gSW5wdXQgZmllbGQgZXZlbnQgaGFuZGxlciBhdHRyaWJ1dGVzCi0gICAgU3RyaW5nIE9ORk9DVVNfQVRUUiA9ICJvbmZvY3VzIjsKLSAgICBTdHJpbmcgT05CTFVSX0FUVFIgPSAib25ibHVyIjsKLSAgICBTdHJpbmcgT05TRUxFQ1RfQVRUUiA9ICJvbnNlbGVjdCI7Ci0gICAgU3RyaW5nIE9OQ0hBTkdFX0FUVFIgPSAib25jaGFuZ2UiOwotICAgIFN0cmluZ1tdIENPTU1PTl9GSUVMRF9FVkVOVF9BVFRSSUJVVEVTID0KLSAgICAgICAgewotICAgICAgICAgICAgT05GT0NVU19BVFRSLAotICAgICAgICAgICAgT05CTFVSX0FUVFIsCi0gICAgICAgICAgICBPTlNFTEVDVF9BVFRSLAotICAgICAgICAgICAgT05DSEFOR0VfQVRUUgotICAgICAgICB9OwotCi0gICAgU3RyaW5nW10gQ09NTU9OX0ZJRUxEX0VWRU5UX0FUVFJJQlVURVNfV0lUSE9VVF9PTkZPQ1VTID0KLSAgICAgICAgewotICAgICAgICAgICAgT05CTFVSX0FUVFIsCi0gICAgICAgICAgICBPTlNFTEVDVF9BVFRSLAotICAgICAgICAgICAgT05DSEFOR0VfQVRUUgotICAgICAgICB9OwotCi0gICAgLy8gdW5pdmVyc2FsIGF0dHJpYnV0ZXMKLSAgICBTdHJpbmcgRElSX0FUVFIgPSAiZGlyIjsKLSAgICBTdHJpbmcgTEFOR19BVFRSID0gImxhbmciOwotICAgIFN0cmluZyBTVFlMRV9BVFRSID0gInN0eWxlIjsKLSAgICBTdHJpbmcgVElUTEVfQVRUUiA9ICJ0aXRsZSI7Ci0gICAgU3RyaW5nIFNUWUxFX0NMQVNTX0FUVFIgPSAic3R5bGVDbGFzcyI7IC8vImNsYXNzIiBjYW5ub3QgYmUgdXNlZCBhcyBwcm9wZXJ0eSBuYW1lCi0KLSAgICBTdHJpbmdbXSBVTklWRVJTQUxfQVRUUklCVVRFU19XSVRIT1VUX1NUWUxFID0KLSAgICAgICAgewotICAgICAgICAgICAgRElSX0FUVFIsCi0gICAgICAgICAgICBMQU5HX0FUVFIsCi0gICAgICAgICAgICBUSVRMRV9BVFRSLAotCi0gICAgICAgICAgICAvL05PVEU6IGlmIGNoYW5nZWQsIHBsZWFzZSB2ZXJpZnkgdW5pdmVyc2FsIGF0dHJpYnV0ZXMgaW4gSHRtbE1lc3NhZ2VSZW5kZXJlciAhCi0gICAgICAgIH07Ci0gICAgU3RyaW5nW10gVU5JVkVSU0FMX0FUVFJJQlVURVMgPQotICAgICAgICAoU3RyaW5nW10pIEFycmF5VXRpbHMuY29uY2F0KAotICAgICAgICAgICAgVU5JVkVSU0FMX0FUVFJJQlVURVNfV0lUSE9VVF9TVFlMRSwKLSAgICAgICAgICAgIG5ldyBTdHJpbmdbXXtTVFlMRV9BVFRSLCBTVFlMRV9DTEFTU19BVFRSfSk7Ci0KLSAgICAvL3VuaXZlcnNhbCwgYnV0IG5vdCB0aGUgc2FtZSBwcm9wZXJ0eS1uYW1lIC0KLSAgICAvL3N0eWxlQ2xhc3MgYXR0cmlidXRlIGlzIHJlbmRlcmVkIGFzIHN1Y2gKLSAgICBTdHJpbmcgQ0xBU1NfQVRUUiA9ICJjbGFzcyI7Ci0KLSAgICAvLyBjb21tb24gZm9ybSBmaWVsZCBhdHRyaWJ1dGVzCi0gICAgU3RyaW5nIEFDQ0VTU0tFWV9BVFRSID0gImFjY2Vzc2tleSI7Ci0gICAgU3RyaW5nIFRBQklOREVYX0FUVFIgPSAidGFiaW5kZXgiOwotICAgIFN0cmluZyBESVNBQkxFRF9BVFRSID0gImRpc2FibGVkIjsKLSAgICBTdHJpbmdbXSBDT01NT05fRklFTERfQVRUUklCVVRFU19XSVRIT1VUX0RJU0FCTEVEID0KLSAgICAgICAgewotICAgICAgICAgICAgQUNDRVNTS0VZX0FUVFIsCi0gICAgICAgICAgICBUQUJJTkRFWF9BVFRSCi0gICAgICAgIH07Ci0gICAgU3RyaW5nW10gQ09NTU9OX0ZJRUxEX0FUVFJJQlVURVMgPQotICAgICAgICAoU3RyaW5nW10pIEFycmF5VXRpbHMuY29uY2F0KAotICAgICAgICAgICAgQ09NTU9OX0ZJRUxEX0FUVFJJQlVURVNfV0lUSE9VVF9ESVNBQkxFRCwKLSAgICAgICAgICAgIG5ldyBTdHJpbmdbXXtESVNBQkxFRF9BVFRSfSk7Ci0KLSAgICAvLyBDb21tb24gQXR0cmlidXRlcwotICAgIFN0cmluZ1tdIENPTU1PTl9QQVNTVFJPVUdIX0FUVFJJQlVURVMgPQotICAgICAgICAoU3RyaW5nW10pIEFycmF5VXRpbHMuY29uY2F0KAotICAgICAgICAgICAgRVZFTlRfSEFORExFUl9BVFRSSUJVVEVTLAotICAgICAgICAgICAgVU5JVkVSU0FMX0FUVFJJQlVURVMpOwotICAgIFN0cmluZ1tdIENPTU1PTl9QQVNTVFJPVUdIX0FUVFJJQlVURVNfV0lUSE9VVF9TVFlMRSA9Ci0gICAgICAgIChTdHJpbmdbXSkgQXJyYXlVdGlscy5jb25jYXQoCi0gICAgICAgICAgICBFVkVOVF9IQU5ETEVSX0FUVFJJQlVURVMsCi0gICAgICAgICAgICBVTklWRVJTQUxfQVRUUklCVVRFU19XSVRIT1VUX1NUWUxFKTsKLSAgICBTdHJpbmdbXSBDT01NT05fUEFTU1RST1VHSF9BVFRSSUJVVEVTX1dJVEhPVVRfT05DTElDSyA9Ci0gICAgICAgIChTdHJpbmdbXSkgQXJyYXlVdGlscy5jb25jYXQoCi0gICAgICAgICAgICBFVkVOVF9IQU5ETEVSX0FUVFJJQlVURVNfV0lUSE9VVF9PTkNMSUNLLAotICAgICAgICAgICAgVU5JVkVSU0FMX0FUVFJJQlVURVMpOwotICAgIFN0cmluZ1tdIENPTU1PTl9QQVNTVFJPVUdIX0FUVFJJQlVURVNfV0lUSE9VVF9PTkNMSUNLX1dJVEhPVVRfU1RZTEUgPQotICAgICAgICAoU3RyaW5nW10pIEFycmF5VXRpbHMuY29uY2F0KAotICAgICAgICAgICAgRVZFTlRfSEFORExFUl9BVFRSSUJVVEVTX1dJVEhPVVRfT05DTElDSywKLSAgICAgICAgICAgIFVOSVZFUlNBTF9BVFRSSUJVVEVTX1dJVEhPVVRfU1RZTEUpOwotICAgIFN0cmluZ1tdIENPTU1PTl9GSUVMRF9QQVNTVFJPVUdIX0FUVFJJQlVURVNfV0lUSE9VVF9ESVNBQkxFRCA9Ci0gICAgICAgIChTdHJpbmdbXSkgQXJyYXlVdGlscy5jb25jYXQoCi0gICAgICAgICAgICBDT01NT05fUEFTU1RST1VHSF9BVFRSSUJVVEVTLAotICAgICAgICAgICAgQ09NTU9OX0ZJRUxEX0FUVFJJQlVURVNfV0lUSE9VVF9ESVNBQkxFRCwKLSAgICAgICAgICAgIENPTU1PTl9GSUVMRF9FVkVOVF9BVFRSSUJVVEVTKTsKLSAgICBTdHJpbmdbXSBDT01NT05fRklFTERfUEFTU1RST1VHSF9BVFRSSUJVVEVTX1dJVEhPVVRfRElTQUJMRURfQU5EX09ORk9DVVMgPQotICAgICAgICAoU3RyaW5nW10pIEFycmF5VXRpbHMuY29uY2F0KAotICAgICAgICAgICAgQ09NTU9OX1BBU1NUUk9VR0hfQVRUUklCVVRFUywKLSAgICAgICAgICAgIENPTU1PTl9GSUVMRF9BVFRSSUJVVEVTX1dJVEhPVVRfRElTQUJMRUQsCi0gICAgICAgICAgICBDT01NT05fRklFTERfRVZFTlRfQVRUUklCVVRFU19XSVRIT1VUX09ORk9DVVMpOwotICAgIFN0cmluZ1tdIENPTU1PTl9GSUVMRF9QQVNTVFJPVUdIX0FUVFJJQlVURVNfV0lUSE9VVF9ESVNBQkxFRF9BTkRfT05GT0NVU19BTkRfT05DTElDSyA9Ci0gICAgICAgIChTdHJpbmdbXSkgQXJyYXlVdGlscy5jb25jYXQoCi0gICAgICAgICAgICBDT01NT05fUEFTU1RST1VHSF9BVFRSSUJVVEVTX1dJVEhPVVRfT05DTElDSywKLSAgICAgICAgICAgIENPTU1PTl9GSUVMRF9BVFRSSUJVVEVTX1dJVEhPVVRfRElTQUJMRUQsCi0gICAgICAgICAgICBDT01NT05fRklFTERfRVZFTlRfQVRUUklCVVRFU19XSVRIT1VUX09ORk9DVVMpOwotICAgIFN0cmluZ1tdIENPTU1PTl9GSUVMRF9QQVNTVFJPVUdIX0FUVFJJQlVURVNfV0lUSE9VVF9ESVNBQkxFRF9BTkRfT05DTElDSyA9Ci0gICAgICAgIChTdHJpbmdbXSkgQXJyYXlVdGlscy5jb25jYXQoCi0gICAgICAgICAgICBDT01NT05fUEFTU1RST1VHSF9BVFRSSUJVVEVTX1dJVEhPVVRfT05DTElDSywKLSAgICAgICAgICAgIENPTU1PTl9GSUVMRF9BVFRSSUJVVEVTX1dJVEhPVVRfRElTQUJMRUQsCi0gICAgICAgICAgICBDT01NT05fRklFTERfRVZFTlRfQVRUUklCVVRFUyk7Ci0KLSAgICAvLyA8YT4KLSAgICBTdHJpbmcgVEFSR0VUX0FUVFIgPSAidGFyZ2V0IjsgIC8vdXNlZCBieSA8YT4gYW5kIDxmb3JtPgotICAgIFN0cmluZyBDSEFSU0VUX0FUVFIgPSAiY2hhcnNldCI7Ci0gICAgU3RyaW5nIENPT1JEU19BVFRSID0gImNvb3JkcyI7Ci0gICAgU3RyaW5nIEhSRUZfQVRUUiA9ICJocmVmIjsKLSAgICBTdHJpbmcgSFJFRkxBTkdfQVRUUiA9ICJocmVmbGFuZyI7Ci0gICAgU3RyaW5nIFJFTF9BVFRSID0gInJlbCI7Ci0gICAgU3RyaW5nIFJFVl9BVFRSID0gInJldiI7Ci0gICAgU3RyaW5nIFNIQVBFX0FUVFIgPSAic2hhcGUiOwotICAgIFN0cmluZyBUWVBFX0FUVFIgPSAidHlwZSI7Ci0gICAgU3RyaW5nW10gQU5DSE9SX0FUVFJJQlVURVMgPQotICAgICAgICB7Ci0gICAgICAgICAgICBBQ0NFU1NLRVlfQVRUUiwKLSAgICAgICAgICAgIENIQVJTRVRfQVRUUiwKLSAgICAgICAgICAgIENPT1JEU19BVFRSLAotICAgICAgICAgICAgSFJFRkxBTkdfQVRUUiwKLSAgICAgICAgICAgIFJFTF9BVFRSLAotICAgICAgICAgICAgUkVWX0FUVFIsCi0gICAgICAgICAgICBTSEFQRV9BVFRSLAotICAgICAgICAgICAgVEFCSU5ERVhfQVRUUiwKLSAgICAgICAgICAgIFRBUkdFVF9BVFRSLAotICAgICAgICAgICAgVFlQRV9BVFRSCi0gICAgICAgIH07Ci0gICAgU3RyaW5nW10gQU5DSE9SX1BBU1NUSFJPVUdIX0FUVFJJQlVURVMgPQotICAgICAgICAoU3RyaW5nW10pIEFycmF5VXRpbHMuY29uY2F0KAotICAgICAgICAgICAgQU5DSE9SX0FUVFJJQlVURVMsCi0gICAgICAgICAgICBDT01NT05fUEFTU1RST1VHSF9BVFRSSUJVVEVTKTsKLSAgICBTdHJpbmdbXSBBTkNIT1JfUEFTU1RIUk9VR0hfQVRUUklCVVRFU19XSVRIT1VUX1NUWUxFID0KLSAgICAgICAgKFN0cmluZ1tdKSBBcnJheVV0aWxzLmNvbmNhdCgKLSAgICAgICAgICAgIEFOQ0hPUl9BVFRSSUJVVEVTLAotICAgICAgICAgICAgQ09NTU9OX1BBU1NUUk9VR0hfQVRUUklCVVRFU19XSVRIT1VUX1NUWUxFKTsKLSAgICBTdHJpbmdbXSBBTkNIT1JfUEFTU1RIUk9VR0hfQVRUUklCVVRFU19XSVRIT1VUX09OQ0xJQ0tfV0lUSE9VVF9TVFlMRSA9Ci0gICAgICAgIChTdHJpbmdbXSkgQXJyYXlVdGlscy5jb25jYXQoCi0gICAgICAgICAgICBBTkNIT1JfQVRUUklCVVRFUywKLSAgICAgICAgICAgIENPTU1PTl9QQVNTVFJPVUdIX0FUVFJJQlVURVNfV0lUSE9VVF9PTkNMSUNLX1dJVEhPVVRfU1RZTEUpOwotCi0gICAgLy8gPGZvcm0+Ci0gICAgU3RyaW5nIEFDQ0VQVF9DSEFSU0VUX0FUVFIgPSAiYWNjZXB0LWNoYXJzZXQiOwotICAgIFN0cmluZyBFTkNUWVBFX0FUVFIgPSAiZW5jdHlwZSI7Ci0gICAgU3RyaW5nIE9OUkVTRVRfQVRUUiA9ICJvbnJlc2V0IjsKLSAgICBTdHJpbmcgT05TVU1CSVRfQVRUUiA9ICJvbnN1Ym1pdCI7Ci0gICAgU3RyaW5nW10gRk9STV9BVFRSSUJVVEVTID0KLSAgICAgICAgewotICAgICAgICAgICAgQUNDRVBUX0FUVFIsCi0gICAgICAgICAgICBBQ0NFUFRfQ0hBUlNFVF9BVFRSLAotICAgICAgICAgICAgRU5DVFlQRV9BVFRSLAotICAgICAgICAgICAgT05SRVNFVF9BVFRSLAotICAgICAgICAgICAgT05TVU1CSVRfQVRUUiwKLSAgICAgICAgICAgIFRBUkdFVF9BVFRSLAotICAgICAgICB9OwotICAgIFN0cmluZ1tdIEZPUk1fUEFTU1RIUk9VR0hfQVRUUklCVVRFUyA9Ci0gICAgICAgIChTdHJpbmdbXSkgQXJyYXlVdGlscy5jb25jYXQoCi0gICAgICAgICAgICBGT1JNX0FUVFJJQlVURVMsCi0gICAgICAgICAgICBDT01NT05fUEFTU1RST1VHSF9BVFRSSUJVVEVTKTsKLQotICAgIC8vIDxpbWc+Ci0gICAgU3RyaW5nIFNSQ19BVFRSID0gInNyYyI7Ci0gICAgU3RyaW5nIEFMVF9BVFRSID0gImFsdCI7Ci0gICAgU3RyaW5nIEhFSUdIVF9BVFRSID0gImhlaWdodCI7Ci0gICAgU3RyaW5nIEhTUEFDRV9BVFRSID0gImhzcGFjZSI7Ci0gICAgU3RyaW5nIElTTUFQX0FUVFIgPSAiaXNtYXAiOwotICAgIFN0cmluZyBMT05HREVTQ19BVFRSID0gImxvbmdkZXNjIjsKLSAgICBTdHJpbmcgVVNFTUFQX0FUVFIgPSAidXNlbWFwIjsKLSAgICBTdHJpbmcgVlNQQUNFX0FUVFIgPSAidnNwYWNlIjsKLQotICAgIFN0cmluZ1tdIElNR19BVFRSSUJVVEVTID0KLSAgICAgICAgewotICAgICAgICAgICAgQUxJR05fQVRUUiwKLSAgICAgICAgICAgIEFMVF9BVFRSLAotICAgICAgICAgICAgQk9SREVSX0FUVFIsCi0gICAgICAgICAgICBIRUlHSFRfQVRUUiwKLSAgICAgICAgICAgIEhTUEFDRV9BVFRSLAotICAgICAgICAgICAgSVNNQVBfQVRUUiwKLSAgICAgICAgICAgIExPTkdERVNDX0FUVFIsCi0gICAgICAgICAgICBVU0VNQVBfQVRUUiwKLSAgICAgICAgICAgIFZTUEFDRV9BVFRSLAotICAgICAgICAgICAgV0lEVEhfQVRUUgotICAgICAgICB9OwotICAgIFN0cmluZ1tdIElNR19QQVNTVEhST1VHSF9BVFRSSUJVVEVTID0KLSAgICAgICAgKFN0cmluZ1tdKSBBcnJheVV0aWxzLmNvbmNhdCgKLSAgICAgICAgICAgIElNR19BVFRSSUJVVEVTLAotICAgICAgICAgICAgQ09NTU9OX1BBU1NUUk9VR0hfQVRUUklCVVRFUyk7Ci0KLSAgICAvLyA8aW5wdXQ+Ci0gICAgU3RyaW5nIFNJWkVfQVRUUiA9ICJzaXplIjsKLSAgICBTdHJpbmcgQVVUT0NPTVBMRVRFX0FUVFIgPSAiYXV0b2NvbXBsZXRlIjsKLSAgICBTdHJpbmcgQ0hFQ0tFRF9BVFRSID0gImNoZWNrZWQiOwotICAgIFN0cmluZyBNQVhMRU5HVEhfQVRUUiA9ICJtYXhsZW5ndGgiOwotCi0gICAgU3RyaW5nW10gSU5QVVRfQVRUUklCVVRFUyA9IHsKLSAgICAgICAgQUxJR05fQVRUUiwKLSAgICAgICAgQUxUX0FUVFIsCi0gICAgICAgIENIRUNLRURfQVRUUiwKLSAgICAgICAgREFUQUZMRF9BVFRSLAotICAgICAgICBEQVRBU1JDX0FUVFIsCi0gICAgICAgIERBVEFGT1JNQVRBU19BVFRSLAotICAgICAgICBNQVhMRU5HVEhfQVRUUiwKLSAgICAgICAgUkVBRE9OTFlfQVRUUiwKLSAgICAgICAgU0laRV9BVFRSLAotICAgICAgICBBVVRPQ09NUExFVEVfQVRUUgotICAgIH07Ci0gICAgU3RyaW5nW10gSU5QVVRfUEFTU1RIUk9VR0hfQVRUUklCVVRFU19XSVRIT1VUX0RJU0FCTEVEID0KLSAgICAgICAgKFN0cmluZ1tdKSBBcnJheVV0aWxzLmNvbmNhdCgKLSAgICAgICAgICAgIElOUFVUX0FUVFJJQlVURVMsCi0gICAgICAgICAgICBDT01NT05fRklFTERfUEFTU1RST1VHSF9BVFRSSUJVVEVTX1dJVEhPVVRfRElTQUJMRUQpOwotCi0gICAgU3RyaW5nW10gSU5QVVRfUEFTU1RIUk9VR0hfQVRUUklCVVRFU19XSVRIT1VUX0RJU0FCTEVEX0FORF9PTkZPQ1VTX0FORF9PTkNMSUNLID0KLSAgICAgICAgKFN0cmluZ1tdKSBBcnJheVV0aWxzLmNvbmNhdCgKLSAgICAgICAgICAgIElOUFVUX0FUVFJJQlVURVMsCi0gICAgICAgICAgICBDT01NT05fRklFTERfUEFTU1RST1VHSF9BVFRSSUJVVEVTX1dJVEhPVVRfRElTQUJMRURfQU5EX09ORk9DVVNfQU5EX09OQ0xJQ0spOwotCi0gICAgLy92YWx1ZXMgZm9yIGlucHV0LXR5cGUgYXR0cmlidXRlCi0gICAgU3RyaW5nIElOUFVUX1RZUEVfU1VCTUlUID0gInN1Ym1pdCI7Ci0gICAgU3RyaW5nIElOUFVUX1RZUEVfSU1BR0UgPSAiaW1hZ2UiOwotICAgIFN0cmluZyBJTlBVVF9UWVBFX0hJRERFTiA9ICJoaWRkZW4iOwotICAgIFN0cmluZyBJTlBVVF9UWVBFX0NIRUNLQk9YID0gImNoZWNrYm94IjsKLSAgICBTdHJpbmcgSU5QVVRfVFlQRV9QQVNTV09SRCA9ICJwYXNzd29yZCI7Ci0gICAgU3RyaW5nIElOUFVUX1RZUEVfVEVYVCA9ICJ0ZXh0IjsKLSAgICBTdHJpbmcgSU5QVVRfVFlQRV9SQURJTyA9ICJyYWRpbyI7Ci0gICAgU3RyaW5nIElOUFVUX1RZUEVfQlVUVE9OID0gImJ1dHRvbiI7Ci0KLSAgICAvLyA8YnV0dG9uPgotICAgIFN0cmluZ1tdIEJVVFRPTl9BVFRSSUJVVEVTID0KLSAgICAgICAgewotICAgICAgICAgICAgQUxJR05fQVRUUiwKLSAgICAgICAgICAgIEFMVF9BVFRSLAotICAgICAgICAgICAgREFUQUZMRF9BVFRSLAotICAgICAgICAgICAgREFUQVNSQ19BVFRSLAotICAgICAgICAgICAgREFUQUZPUk1BVEFTX0FUVFIsCi0gICAgICAgIH07Ci0gICAgU3RyaW5nW10gQlVUVE9OX1BBU1NUSFJPVUdIX0FUVFJJQlVURVNfV0lUSE9VVF9ESVNBQkxFRCA9Ci0gICAgICAgIChTdHJpbmdbXSkgQXJyYXlVdGlscy5jb25jYXQoCi0gICAgICAgICAgICBCVVRUT05fQVRUUklCVVRFUywKLSAgICAgICAgICAgIENPTU1PTl9GSUVMRF9QQVNTVFJPVUdIX0FUVFJJQlVURVNfV0lUSE9VVF9ESVNBQkxFRCk7Ci0gICAgU3RyaW5nW10gQlVUVE9OX1BBU1NUSFJPVUdIX0FUVFJJQlVURVNfV0lUSE9VVF9ESVNBQkxFRF9BTkRfT05DTElDSyA9Ci0gICAgICAgIChTdHJpbmdbXSkgQXJyYXlVdGlscy5jb25jYXQoCi0gICAgICAgICAgICBCVVRUT05fQVRUUklCVVRFUywKLSAgICAgICAgICAgIENPTU1PTl9GSUVMRF9QQVNTVFJPVUdIX0FUVFJJQlVURVNfV0lUSE9VVF9ESVNBQkxFRF9BTkRfT05DTElDSyk7Ci0KLSAgICAvLyA8aWZyYW1lPgotICAgIFN0cmluZyBGUkFNRUJPUkRFUl9BVFRSID0gImZyYW1lYm9yZGVyIjsKLSAgICBTdHJpbmcgU0NST0xMSU5HX0FUVFIgPSAic2Nyb2xsaW5nIjsKLQotICAgIC8vIDxsYWJlbD4KLSAgICBTdHJpbmcgRk9SX0FUVFIgPSAiZm9yIjsKLSAgICBTdHJpbmdbXSBMQUJFTF9BVFRSSUJVVEVTID0KLSAgICAgICAgewotICAgICAgICAgICAgQUNDRVNTS0VZX0FUVFIsCi0gICAgICAgICAgICBPTkJMVVJfQVRUUiwKLSAgICAgICAgICAgIE9ORk9DVVNfQVRUUgotICAgICAgICAgICAgLy9GT1JfQVRUUiBpcyBubyBwYXNzIHRocm91Z2ggIQotICAgICAgICB9OwotICAgIFN0cmluZ1tdIExBQkVMX1BBU1NUSFJPVUdIX0FUVFJJQlVURVMgPQotICAgICAgICAoU3RyaW5nW10pIEFycmF5VXRpbHMuY29uY2F0KAotICAgICAgICAgICAgTEFCRUxfQVRUUklCVVRFUywKLSAgICAgICAgICAgIENPTU1PTl9QQVNTVFJPVUdIX0FUVFJJQlVURVMpOwotCi0gICAgLy8gPHNlbGVjdD4KLSAgICBTdHJpbmcgTVVMVElQTEVfQVRUUiA9ICJtdWx0aXBsZSI7Ci0KLSAgICBTdHJpbmdbXSBTRUxFQ1RfQVRUUklCVVRFUyA9Ci0gICAgICAgIHsKLSAgICAgICAgICAgIERBVEFGTERfQVRUUiwKLSAgICAgICAgICAgIERBVEFTUkNfQVRUUiwKLSAgICAgICAgICAgIERBVEFGT1JNQVRBU19BVFRSLAotICAgICAgICB9OwotICAgIFN0cmluZ1tdIFNFTEVDVF9QQVNTVEhST1VHSF9BVFRSSUJVVEVTX1dJVEhPVVRfRElTQUJMRUQgPQotICAgICAgICAoU3RyaW5nW10pIEFycmF5VXRpbHMuY29uY2F0KAotICAgICAgICAgICAgU0VMRUNUX0FUVFJJQlVURVMsCi0gICAgICAgICAgICBDT01NT05fRklFTERfUEFTU1RST1VHSF9BVFRSSUJVVEVTX1dJVEhPVVRfRElTQUJMRUQpOwotCi0gICAgLy8gPHRhYmxlPgotICAgIFN0cmluZyBCR0NPTE9SX0FUVFIgPSAiYmdjb2xvciI7Ci0gICAgU3RyaW5nIENFTExQQURESU5HX0FUVFIgPSAiY2VsbHBhZGRpbmciOwotICAgIFN0cmluZyBDRUxMU1BBQ0lOR19BVFRSID0gImNlbGxzcGFjaW5nIjsKLSAgICBTdHJpbmcgRlJBTUVfQVRUUiA9ICJmcmFtZSI7Ci0gICAgU3RyaW5nIFJVTEVTX0FUVFIgPSAicnVsZXMiOwotICAgIFN0cmluZyBTVU1NQVJZX0FUVFIgPSAic3VtbWFyeSI7Ci0gICAgU3RyaW5nW10gVEFCTEVfQVRUUklCVVRFUyA9IHsKLSAgICAgICAgQUxJR05fQVRUUiwKLSAgICAgICAgQkdDT0xPUl9BVFRSLAotICAgICAgICBCT1JERVJfQVRUUiwKLSAgICAgICAgQ0VMTFBBRERJTkdfQVRUUiwKLSAgICAgICAgQ0VMTFNQQUNJTkdfQVRUUiwKLSAgICAgICAgREFUQUZMRF9BVFRSLAotICAgICAgICBEQVRBU1JDX0FUVFIsCi0gICAgICAgIERBVEFGT1JNQVRBU19BVFRSLAotICAgICAgICBGUkFNRV9BVFRSLAotICAgICAgICBSVUxFU19BVFRSLAotICAgICAgICBTVU1NQVJZX0FUVFIsCi0gICAgICAgIFdJRFRIX0FUVFIKLSAgICB9OwotICAgIFN0cmluZ1tdIFRBQkxFX1BBU1NUSFJPVUdIX0FUVFJJQlVURVMgPQotICAgICAgICAoU3RyaW5nW10pIEFycmF5VXRpbHMuY29uY2F0KAotICAgICAgICAgICAgVEFCTEVfQVRUUklCVVRFUywKLSAgICAgICAgICAgIENPTU1PTl9QQVNTVFJPVUdIX0FUVFJJQlVURVMpOwotCi0gICAgLy8gPHRleHRhcmVhPgotICAgIFN0cmluZyBDT0xTX0FUVFIgPSAiY29scyI7Ci0gICAgU3RyaW5nIFJPV1NfQVRUUiA9ICJyb3dzIjsKLSAgICBTdHJpbmcgV1JBUF9BVFRSID0gIndyYXAiOwotICAgIFN0cmluZ1tdIFRFWFRBUkVBX0FUVFJJQlVURVMgPQotICAgICAgICB7Ci0gICAgICAgICAgICBDT0xTX0FUVFIsCi0gICAgICAgICAgICBEQVRBRkxEX0FUVFIsCi0gICAgICAgICAgICBEQVRBU1JDX0FUVFIsCi0gICAgICAgICAgICBEQVRBRk9STUFUQVNfQVRUUiwKLSAgICAgICAgICAgIFJFQURPTkxZX0FUVFIsCi0gICAgICAgICAgICBST1dTX0FUVFIsCi0gICAgICAgICAgICBXUkFQX0FUVFIKLSAgICAgICAgfTsKLSAgICBTdHJpbmdbXSBURVhUQVJFQV9QQVNTVEhST1VHSF9BVFRSSUJVVEVTX1dJVEhPVVRfRElTQUJMRUQgPQotICAgICAgICAoU3RyaW5nW10pIEFycmF5VXRpbHMuY29uY2F0KAotICAgICAgICAgICAgVEVYVEFSRUFfQVRUUklCVVRFUywKLSAgICAgICAgICAgIENPTU1PTl9GSUVMRF9QQVNTVFJPVUdIX0FUVFJJQlVURVNfV0lUSE9VVF9ESVNBQkxFRCk7Ci0KLSAgICAvLyA8aW5wdXQgdHlwZT1maWxlPgotICAgIFN0cmluZ1tdIElOUFVUX0ZJTEVfVVBMT0FEX0FUVFJJQlVURVMgPQotICAgICAgICB7Ci0gICAgICAgICAgICBBQ0NFUFRfQVRUUgotICAgICAgICB9OwotICAgIFN0cmluZ1tdIElOUFVUX0ZJTEVfUEFTU1RIUk9VR0hfQVRUUklCVVRFU19XSVRIT1VUX0RJU0FCTEVEID0KLSAgICAgICAgKFN0cmluZ1tdKSBBcnJheVV0aWxzLmNvbmNhdCgKLSAgICAgICAgICAgIElOUFVUX0ZJTEVfVVBMT0FEX0FUVFJJQlVURVMsCi0gICAgICAgICAgICBJTlBVVF9QQVNTVEhST1VHSF9BVFRSSUJVVEVTX1dJVEhPVVRfRElTQUJMRUQpOwotCi0gICAgLyoKLVN0cmluZ1tdIE1FU1NBR0VfUEFTU1RIUk9VR0hfQVRUUklCVVRFUyA9Ci0oU3RyaW5nW10pIEFycmF5VXRpbHMuY29uY2F0KAotICAgIG5ldyBTdHJpbmdbXSB7RElSX0FUVFIsIExBTkdfQVRUUiwgVElUTEVfQVRUUiwgU1RZTEVfQVRUUiwgU1RZTEVfQ0xBU1NfQVRUUn0sCi0gICAgRVZFTlRfSEFORExFUl9BVFRSSUJVVEVTKTsKLSAgICAqLwotCi0gICAgU3RyaW5nW10gTUVTU0FHRV9QQVNTVEhST1VHSF9BVFRSSUJVVEVTX1dJVEhPVVRfVElUTEVfU1RZTEVfQU5EX1NUWUxFX0NMQVNTID0KLSAgICAgICAgKFN0cmluZ1tdKSBBcnJheVV0aWxzLmNvbmNhdCgKLSAgICAgICAgICAgIG5ldyBTdHJpbmdbXXtESVJfQVRUUiwgTEFOR19BVFRSfSwKLSAgICAgICAgICAgIEVWRU5UX0hBTkRMRVJfQVRUUklCVVRFUyk7Ci0KLQotICAgIC8vIHNlbGVjdE9uZS9NYW55IHRhYmxlCi0gICAgU3RyaW5nW10gU0VMRUNUX1RBQkxFX1BBU1NUSFJPVUdIX0FUVFJJQlVURVMgPQotICAgICAgICBuZXcgU3RyaW5nW117U1RZTEVfQVRUUiwgU1RZTEVfQ0xBU1NfQVRUUiwgQk9SREVSX0FUVFJ9OwotCi0gICAgU3RyaW5nIENPTVBBQ1RfQVRUUiA9ICJjb21wYWN0IjsKLSAgICBTdHJpbmdbXSBVTF9BVFRSSUJVVEVTID0gewotICAgICAgICBDT01QQUNUX0FUVFIsCi0gICAgICAgIFRZUEVfQVRUUgotICAgIH07Ci0gICAgU3RyaW5nW10gVUxfUEFTU1RIUk9VR0hfQVRUUklCVVRFUyA9Ci0gICAgICAgIChTdHJpbmdbXSkgQXJyYXlVdGlscy5jb25jYXQoCi0gICAgICAgICAgICBVTF9BVFRSSUJVVEVTLAotICAgICAgICAgICAgQ09NTU9OX1BBU1NUUk9VR0hfQVRUUklCVVRFUyk7Ci0KLQotICAgIC8vSFRNTCBhdHRyaWJ1dGVzIG5lZWRlZCBmb3IgcmVuZGVyZGluZyBvbmx5Ci0gICAgU3RyaW5nIElEX0FUVFIgPSAiaWQiOwotICAgIFN0cmluZyBOQU1FX0FUVFIgPSAibmFtZSI7Ci0gICAgU3RyaW5nIFZBTFVFX0FUVFIgPSAidmFsdWUiOwotICAgIFN0cmluZyBNRVRIT0RfQVRUUiA9ICJtZXRob2QiOwotICAgIFN0cmluZyBBQ1RJT05fQVRUUiA9ICJhY3Rpb24iOwotICAgIFN0cmluZyBDT0xTUEFOX0FUVFIgPSAiY29sc3BhbiI7Ci0gICAgU3RyaW5nIFNDT1BFX0FUVFIgPSAic2NvcGUiOwotICAgIFN0cmluZyBMQUJFTF9BVFRSID0gImxhYmVsIjsKLSAgICBTdHJpbmcgU0VMRUNURURfQVRUUiA9ICJzZWxlY3RlZCI7Ci0KLSAgICAvL0hUTUwgYXR0cmlidXRlcyB2YWx1ZXMKLSAgICBTdHJpbmcgU0NPUEVfQ09MR1JPVVBfVkFMVUUgPSAiY29sZ3JvdXAiOwotCi0gICAgLy9IVE1MIGVsZW1lbnQgY29uc3RhbnRzCi0gICAgU3RyaW5nIFNQQU5fRUxFTSA9ICJzcGFuIjsKLSAgICBTdHJpbmcgRElWX0VMRU0gPSAiZGl2IjsKLSAgICBTdHJpbmcgSU5QVVRfRUxFTSA9ICJpbnB1dCI7Ci0gICAgU3RyaW5nIEJVVFRPTl9FTEVNID0gImJ1dHRvbiI7Ci0gICAgU3RyaW5nIFNFTEVDVF9FTEVNID0gInNlbGVjdCI7Ci0gICAgU3RyaW5nIE9QVElPTl9FTEVNID0gIm9wdGlvbiI7Ci0gICAgU3RyaW5nIE9QVEdST1VQX0VMRU0gPSAib3B0Z3JvdXAiOwotICAgIFN0cmluZyBURVhUQVJFQV9FTEVNID0gInRleHRhcmVhIjsKLSAgICBTdHJpbmcgRk9STV9FTEVNID0gImZvcm0iOwotICAgIFN0cmluZyBBTkNIT1JfRUxFTSA9ICJhIjsKLSAgICBTdHJpbmcgSDFfRUxFTSA9ICJoMSI7Ci0gICAgU3RyaW5nIEgyX0VMRU0gPSAiaDIiOwotICAgIFN0cmluZyBIM19FTEVNID0gImgzIjsKLSAgICBTdHJpbmcgSDRfRUxFTSA9ICJoNCI7Ci0gICAgU3RyaW5nIEg1X0VMRU0gPSAiaDUiOwotICAgIFN0cmluZyBINl9FTEVNID0gImg2IjsKLSAgICBTdHJpbmcgSUZSQU1FX0VMRU0gPSAiaWZyYW1lIjsKLSAgICBTdHJpbmcgSU1HX0VMRU0gPSAiaW1nIjsKLSAgICBTdHJpbmcgTEFCRUxfRUxFTSA9ICJsYWJlbCI7Ci0gICAgU3RyaW5nIFRBQkxFX0VMRU0gPSAidGFibGUiOwotICAgIFN0cmluZyBUUl9FTEVNID0gInRyIjsKLSAgICBTdHJpbmcgVEhfRUxFTSA9ICJ0aCI7Ci0gICAgU3RyaW5nIFREX0VMRU0gPSAidGQiOwotICAgIFN0cmluZyBUQk9EWV9FTEVNID0gInRib2R5IjsKLSAgICBTdHJpbmcgVEZPT1RfRUxFTSA9ICJ0Zm9vdCI7Ci0gICAgU3RyaW5nIFRIRUFEX0VMRU0gPSAidGhlYWQiOwotICAgIFN0cmluZyBTVFlMRV9FTEVNID0gInN0eWxlIjsKLSAgICBTdHJpbmcgU0NSSVBUX0VMRU0gPSAic2NyaXB0IjsKLSAgICBTdHJpbmcgU0NSSVBUX1RZUEVfQVRUUiA9ICJ0eXBlIjsKLSAgICBTdHJpbmcgU0NSSVBUX1RZUEVfVEVYVF9KQVZBU0NSSVBUID0gInRleHQvamF2YXNjcmlwdCI7Ci0gICAgU3RyaW5nIFNUWUxFX1RZUEVfVEVYVF9DU1MgPSAidGV4dC9jc3MiOwotICAgIFN0cmluZyBTQ1JJUFRfTEFOR1VBR0VfQVRUUiA9ICJsYW5ndWFnZSI7Ci0gICAgU3RyaW5nIFNDUklQVF9MQU5HVUFHRV9KQVZBU0NSSVBUID0gIkphdmFTY3JpcHQiOwotICAgIFN0cmluZyBTQ1JJUFRfRUxFTV9ERUZFUl9BVFRSID0gImRlZmVyIjsKLSAgICBTdHJpbmcgTElOS19FTEVNID0gImxpbmsiOwotICAgIFN0cmluZyBTVFlMRVNIRUVUX1ZBTFVFID0gInN0eWxlc2hlZXQiOwotICAgIFN0cmluZyBVTF9FTEVNID0gInVsIjsKLSAgICBTdHJpbmcgT0xfRUxFTSA9ICJvbCI7Ci0gICAgU3RyaW5nIExJX0VMRU0gPSAibGkiOwotCi0KLSAgICAvL0hUTUwgc2ltcGxlIGVsZW1lbnQgY29uc3RhbnRzCi0gICAgU3RyaW5nIEJSX0VMRU0gPSAiYnIiOwotCi0KLSAgICAvL0hUTUwgZW50aXRpZXMKLSAgICBTdHJpbmcgTkJTUF9FTlRJVFkgPSAiJiMxNjA7IjsKLQotICAgIFN0cmluZyBIUkVGX1BBVEhfU0VQQVJBVE9SID0gIi8iOwotICAgIFN0cmluZyBIUkVGX1BBVEhfRlJPTV9QQVJBTV9TRVBBUkFUT1IgPSAiPyI7Ci0gICAgU3RyaW5nIEhSRUZfUEFSQU1fU0VQQVJBVE9SID0gIiYiOwotICAgIFN0cmluZyBIUkVGX1BBUkFNX05BTUVfRlJPTV9WQUxVRV9TRVBBUkFUT1IgPSAiPSI7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJkYWQxZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLQ0KLS8qKg0KLSAqIE5hbWVNYXBwZXJzIGFyZSBzdGF0ZWxlc3MNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VD4gaW1wbGVtZW50cyBOYW1lTWFwcGVyPFQ+DQotew0KLSAgICBwcml2YXRlIE5hbWVNYXBwZXI8VD4gY3VzdG9tTmFtZU1hcHBlcjsNCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFQgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZiAoY3VzdG9tTmFtZU1hcHBlciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCk7DQotDQotICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTmFtZU1hcHBlciA9IChOYW1lTWFwcGVyPFQ+KSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoY3VzdG9tTmFtZU1hcHBlciAhPSBudWxsKSA/IGN1c3RvbU5hbWVNYXBwZXIuY3JlYXRlTmFtZShzb3VyY2UpDQotICAgICAgICAgICAgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL05hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzM1NjU3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VFbnVtOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUVudW0uQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgU3RyaW5nIGNyZWF0ZU5hbWUoVCBzb3VyY2UpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJveHkvRXh0VmFsQXBwbGljYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm94eS9FeHRWYWxBcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDQzYWQyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm94eS9FeHRWYWxBcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUVudW07DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRmFjdG9yeVV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5lbC5FTENvbnRleHRMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXguZWwuRUxFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmVsLkVMUmVzb2x2ZXI7DQotaW1wb3J0IGphdmF4LmVsLkV4cHJlc3Npb25GYWN0b3J5Ow0KLWltcG9ydCBqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb247DQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY2VzRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uTmF2aWdhdGlvbkhhbmRsZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLlN0YXRlTWFuYWdlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uVmlld0hhbmRsZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuZWwuTWV0aG9kQmluZGluZzsNCi1pbXBvcnQgamF2YXguZmFjZXMuZWwuUHJvcGVydHlSZXNvbHZlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuZWwuUmVmZXJlbmNlU3ludGF4RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7DQotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhcmlhYmxlUmVzb2x2ZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LkFjdGlvbkxpc3RlbmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uLHVuY2hlY2tlZCIpDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlRW51bS5BTFRFUk5BVElWRSwgVXNhZ2VFbnVtLklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsQXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBBcHBsaWNhdGlvbiB3cmFwcGVkOw0KLQ0KLSAgICBwdWJsaWMgRXh0VmFsQXBwbGljYXRpb24oKQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEV4dFZhbEFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uIHdyYXBwZWQpDQotICAgIHsNCi0gICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHdyYXBzICIgKyB3cmFwcGVkLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFVJQ29tcG9uZW50IGNyZWF0ZUNvbXBvbmVudChWYWx1ZUJpbmRpbmcgY29tcG9uZW50QmluZGluZywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWNlc0NvbnRleHQgY29udGV4dCwgU3RyaW5nIGNvbXBvbmVudFR5cGUpIHRocm93cyBGYWNlc0V4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBVSUNvbXBvbmVudCBjb21wb25lbnQgPSB0aGlzLndyYXBwZWQuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudEJpbmRpbmcsDQotICAgICAgICAgICAgY29udGV4dCwgY29tcG9uZW50VHlwZSk7DQotICAgICAgICByZXR1cm4gdHJ5VG9TZXRFeHRWYWxWYWxpZGF0aW5nQ29udmVydGVyKGNvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBVSUNvbXBvbmVudCB0cnlUb1NldEV4dFZhbFZhbGlkYXRpbmdDb252ZXJ0ZXIoVUlDb21wb25lbnQgY29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICAvL2luIG9yZGVyIHRvIGFjY2VzcyB0aGUgd3JhcHBlZCBhcHBsaWNhdGlvbiBhbmQgYW5kIHN1cHBvcnQgb3RoZXIgQXBwbGljYXRpb24gd3JhcHBlcnMNCi0gICAgICAgIEV4dFZhbFV0aWxzLnNldE9yaWdpbmFsQXBwbGljYXRpb24od3JhcHBlZCk7DQotDQotICAgICAgICAvL2lmIG5vIGNvbnZlcnRlciBpcyB1c2VkIGFkZCBzZXYtZW4gY29udmVydGVyIC0gc28gaXQgaXNuJ3QgDQotICAgICAgICAvL25lY2Vzc2FyeSB0byBhZGQgc2V2LWVuIGNvbnZlcnRlciBtYW51YWxseSB3aXRoaW4gdGhlIHBhZ2UNCi0gICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcikgY29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAuc2V0Q29udmVydGVyKG5ldyBFeHRWYWxDb252ZXJ0ZXIoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDb252ZXJ0ZXIgY3JlYXRlQ29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXJJZCkgdGhyb3dzIEZhY2VzRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIENvbnZlcnRlciBjb252ZXJ0ZXIgPSB0aGlzLndyYXBwZWQuY3JlYXRlQ29udmVydGVyKGNvbnZlcnRlcklkKTsNCi0gICAgICAgIHJldHVybiBnZXRFeHRWYWxDb252ZXJ0ZXIoY29udmVydGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29udmVydGVyIGNyZWF0ZUNvbnZlcnRlcihDbGFzcyB0YXJnZXRDbGFzcykgdGhyb3dzIEZhY2VzRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIENvbnZlcnRlciBjb252ZXJ0ZXIgPSB0aGlzLndyYXBwZWQuY3JlYXRlQ29udmVydGVyKHRhcmdldENsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiBnZXRFeHRWYWxDb252ZXJ0ZXIoY29udmVydGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENvbnZlcnRlciBnZXRFeHRWYWxDb252ZXJ0ZXIoQ29udmVydGVyIGNvbnZlcnRlcikNCi0gICAgew0KLSAgICAgICAgaWYgKGNvbnZlcnRlciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgRXh0VmFsQ29udmVydGVyKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgiY29udmVydGVyIHRvIHdyYXA6ICIgKyBjb252ZXJ0ZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKCFFeHRWYWxVdGlscy51c2VGYWxsYmFja0FkYXB0ZXJzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIEV4dFZhbENvbnZlcnRlci5uZXdJbnN0YW5jZShjb252ZXJ0ZXIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZmFsbGJhY2sgYWRhcHRlciBzb2x1dGlvbg0KLSAgICAgICAgICAgIC8vaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIGRlZmF1bHQgYXBwcm9hY2ggKHRoZSBwaGFzZS1saXN0ZW5lcikNCi0gICAgICAgICAgICAvL29yIHRoZSBhbHRlcm5hdGl2ZSAodGhlIHN0YXRlLW1hbmFnZXIpDQotICAgICAgICAgICAgcmV0dXJuIEZhY3RvcnlVdGlscy5nZXRDb252ZXJ0ZXJBZGFwdGVyRmFjdG9yeSgpLmNyZWF0ZShjb252ZXJ0ZXIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRDb252ZXJ0ZXJJZHMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkLmdldENvbnZlcnRlcklkcygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRDb252ZXJ0ZXJUeXBlcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQuZ2V0Q29udmVydGVyVHlwZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb252ZXJ0ZXIoU3RyaW5nIGNvbnZlcnRlcklkLCBTdHJpbmcgY29udmVydGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZC5hZGRDb252ZXJ0ZXIoY29udmVydGVySWQsIGNvbnZlcnRlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb252ZXJ0ZXIoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBjb252ZXJ0ZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkLmFkZENvbnZlcnRlcih0YXJnZXRDbGFzcywgY29udmVydGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRDb21wb25lbnRUeXBlcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQuZ2V0Q29tcG9uZW50VHlwZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQWN0aW9uTGlzdGVuZXIgZ2V0QWN0aW9uTGlzdGVuZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkLmdldEFjdGlvbkxpc3RlbmVyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aW9uTGlzdGVuZXIoQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZC5zZXRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExvY2FsZSBnZXREZWZhdWx0TG9jYWxlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZC5nZXREZWZhdWx0TG9jYWxlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdExvY2FsZShMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQuc2V0RGVmYXVsdExvY2FsZShsb2NhbGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFJlbmRlcktpdElkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZC5nZXREZWZhdWx0UmVuZGVyS2l0SWQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0UmVuZGVyS2l0SWQoU3RyaW5nIHJlbmRlcktpdElkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQuc2V0RGVmYXVsdFJlbmRlcktpdElkKHJlbmRlcktpdElkKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VCdW5kbGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkLmdldE1lc3NhZ2VCdW5kbGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlQnVuZGxlKFN0cmluZyBidW5kbGUpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZC5zZXRNZXNzYWdlQnVuZGxlKGJ1bmRsZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE5hdmlnYXRpb25IYW5kbGVyIGdldE5hdmlnYXRpb25IYW5kbGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZC5nZXROYXZpZ2F0aW9uSGFuZGxlcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5hdmlnYXRpb25IYW5kbGVyKE5hdmlnYXRpb25IYW5kbGVyIGhhbmRsZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZC5zZXROYXZpZ2F0aW9uSGFuZGxlcihoYW5kbGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvcGVydHlSZXNvbHZlciBnZXRQcm9wZXJ0eVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZC5nZXRQcm9wZXJ0eVJlc29sdmVyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlSZXNvbHZlcihQcm9wZXJ0eVJlc29sdmVyIHJlc29sdmVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQuc2V0UHJvcGVydHlSZXNvbHZlcihyZXNvbHZlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhcmlhYmxlUmVzb2x2ZXIgZ2V0VmFyaWFibGVSZXNvbHZlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQuZ2V0VmFyaWFibGVSZXNvbHZlcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhcmlhYmxlUmVzb2x2ZXIoVmFyaWFibGVSZXNvbHZlciByZXNvbHZlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkLnNldFZhcmlhYmxlUmVzb2x2ZXIocmVzb2x2ZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWaWV3SGFuZGxlciBnZXRWaWV3SGFuZGxlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQuZ2V0Vmlld0hhbmRsZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWaWV3SGFuZGxlcihWaWV3SGFuZGxlciBoYW5kbGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQuc2V0Vmlld0hhbmRsZXIoaGFuZGxlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0YXRlTWFuYWdlciBnZXRTdGF0ZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkLmdldFN0YXRlTWFuYWdlcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFN0YXRlTWFuYWdlcihTdGF0ZU1hbmFnZXIgbWFuYWdlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkLnNldFN0YXRlTWFuYWdlcihtYW5hZ2VyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb21wb25lbnQoU3RyaW5nIGNvbXBvbmVudFR5cGUsIFN0cmluZyBjb21wb25lbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkLmFkZENvbXBvbmVudChjb21wb25lbnRUeXBlLCBjb21wb25lbnRDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFVJQ29tcG9uZW50IGNyZWF0ZUNvbXBvbmVudChTdHJpbmcgY29tcG9uZW50VHlwZSkNCi0gICAgICAgIHRocm93cyBGYWNlc0V4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBVSUNvbXBvbmVudCBjb21wb25lbnQgPSB0aGlzLndyYXBwZWQuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudFR5cGUpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHRyeVRvU2V0RXh0VmFsVmFsaWRhdGluZ0NvbnZlcnRlcihjb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXRob2RCaW5kaW5nIGNyZWF0ZU1ldGhvZEJpbmRpbmcoU3RyaW5nIHJlZiwgQ2xhc3NbXSBwYXJhbXMpDQotICAgICAgICB0aHJvd3MgUmVmZXJlbmNlU3ludGF4RXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQuY3JlYXRlTWV0aG9kQmluZGluZyhyZWYsIHBhcmFtcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldFN1cHBvcnRlZExvY2FsZXMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkLmdldFN1cHBvcnRlZExvY2FsZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdXBwb3J0ZWRMb2NhbGVzKENvbGxlY3Rpb24gbG9jYWxlcykNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkLnNldFN1cHBvcnRlZExvY2FsZXMobG9jYWxlcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkVmFsaWRhdG9yKFN0cmluZyB2YWxpZGF0b3JJZCwgU3RyaW5nIHZhbGlkYXRvckNsYXNzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQuYWRkVmFsaWRhdG9yKHZhbGlkYXRvcklkLCB2YWxpZGF0b3JDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoU3RyaW5nIHZhbGlkYXRvcklkKSB0aHJvd3MgRmFjZXNFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZC5jcmVhdGVWYWxpZGF0b3IodmFsaWRhdG9ySWQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRWYWxpZGF0b3JJZHMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkLmdldFZhbGlkYXRvcklkcygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWx1ZUJpbmRpbmcgY3JlYXRlVmFsdWVCaW5kaW5nKFN0cmluZyByZWYpDQotICAgICAgICB0aHJvd3MgUmVmZXJlbmNlU3ludGF4RXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQuY3JlYXRlVmFsdWVCaW5kaW5nKHJlZik7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICoganNmIDEuMiBtZXRob2RzDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBhZGRFTFJlc29sdmVyKEVMUmVzb2x2ZXIgZWxSZXNvbHZlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkLmFkZEVMUmVzb2x2ZXIoZWxSZXNvbHZlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEVMUmVzb2x2ZXIgZ2V0RUxSZXNvbHZlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQuZ2V0RUxSZXNvbHZlcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykNCi0gICAgICAgIHRocm93cyBGYWNlc0V4Y2VwdGlvbiwgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZC5nZXRSZXNvdXJjZUJ1bmRsZShmYWNlc0NvbnRleHQsIHMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBVSUNvbXBvbmVudCBjcmVhdGVDb21wb25lbnQoVmFsdWVFeHByZXNzaW9uIHZhbHVlRXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykgdGhyb3dzIEZhY2VzRXhjZXB0aW9uLA0KLSAgICAgICAgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVUlDb21wb25lbnQgY29tcG9uZW50ID0gdGhpcy53cmFwcGVkLmNyZWF0ZUNvbXBvbmVudCh2YWx1ZUV4cHJlc3Npb24sDQotICAgICAgICAgICAgZmFjZXNDb250ZXh0LCBzKTsNCi0gICAgICAgIHJldHVybiB0cnlUb1NldEV4dFZhbFZhbGlkYXRpbmdDb252ZXJ0ZXIoY29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRXhwcmVzc2lvbkZhY3RvcnkgZ2V0RXhwcmVzc2lvbkZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkLmdldEV4cHJlc3Npb25GYWN0b3J5KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkRUxDb250ZXh0TGlzdGVuZXIoRUxDb250ZXh0TGlzdGVuZXIgZWxDb250ZXh0TGlzdGVuZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZC5hZGRFTENvbnRleHRMaXN0ZW5lcihlbENvbnRleHRMaXN0ZW5lcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlRUxDb250ZXh0TGlzdGVuZXIoRUxDb250ZXh0TGlzdGVuZXIgZWxDb250ZXh0TGlzdGVuZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZC5yZW1vdmVFTENvbnRleHRMaXN0ZW5lcihlbENvbnRleHRMaXN0ZW5lcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEVMQ29udGV4dExpc3RlbmVyW10gZ2V0RUxDb250ZXh0TGlzdGVuZXJzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZC5nZXRFTENvbnRleHRMaXN0ZW5lcnMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGV2YWx1YXRlRXhwcmVzc2lvbkdldChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgYUNsYXNzKSB0aHJvd3MgRUxFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZC5ldmFsdWF0ZUV4cHJlc3Npb25HZXQoZmFjZXNDb250ZXh0LCBzLCBhQ2xhc3MpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm94eS9FeHRWYWxBcHBsaWNhdGlvbkZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm94eS9FeHRWYWxBcHBsaWNhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBlZDZmMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJveHkvRXh0VmFsQXBwbGljYXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VFbnVtOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VFbnVtLkFMVEVSTkFUSVZFLCBVc2FnZUVudW0uSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxBcHBsaWNhdGlvbkZhY3RvcnkgZXh0ZW5kcyBBcHBsaWNhdGlvbkZhY3RvcnkNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gYWN0aXZlID0gZmFsc2U7DQotDQotICAgIHByaXZhdGUgQXBwbGljYXRpb25GYWN0b3J5IHdyYXBwZWQ7DQotDQotICAgIHB1YmxpYyBFeHRWYWxBcHBsaWNhdGlvbkZhY3RvcnkoQXBwbGljYXRpb25GYWN0b3J5IGFwcGxpY2F0aW9uRmFjdG9yeSkNCi0gICAgew0KLSAgICAgICAgYWN0aXZlID0gdHJ1ZTsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IGFwcGxpY2F0aW9uRmFjdG9yeTsNCi0gICAgICAgIHNldEFwcGxpY2F0aW9uKGFwcGxpY2F0aW9uRmFjdG9yeS5nZXRBcHBsaWNhdGlvbigpKTsNCi0gICAgICAgIGxvZ2dlcg0KLSAgICAgICAgICAgIC50cmFjZSgibXlmYWNlcy1leHRlbnNpb24tdmFsaWRhdG9yIGFwcGxpY2F0aW9uIGZhY3RvcnkgaW5zdGFudGlhdGVkIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEFwcGxpY2F0aW9uIGdldEFwcGxpY2F0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZC5nZXRBcHBsaWNhdGlvbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoIShhcHBsaWNhdGlvbiBpbnN0YW5jZW9mIEV4dFZhbEFwcGxpY2F0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoIm15ZmFjZXMtZXh0ZW5zaW9uLXZhbGlkYXRvciBhcHBsaWNhdGlvbiBjcmVhdGVkIik7DQotDQotICAgICAgICAgICAgdGhpcy53cmFwcGVkLnNldEFwcGxpY2F0aW9uKG5ldyBFeHRWYWxBcHBsaWNhdGlvbihhcHBsaWNhdGlvbikpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMud3JhcHBlZC5zZXRBcHBsaWNhdGlvbihhcHBsaWNhdGlvbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWN0aXZlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGFjdGl2ZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJveHkvRXh0VmFsQ29udmVydGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJveHkvRXh0VmFsQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MjkwMjUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L0V4dFZhbENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5Ow0KLQ0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuRW5oYW5jZXI7DQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RJbnRlcmNlcHRvcjsNCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZFByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUVudW07DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuVmFsaWRhdGlvblV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlcjsNCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VFbnVtLkFMVEVSTkFUSVZFLCBVc2FnZUVudW0uSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxDb252ZXJ0ZXIgaW1wbGVtZW50cyBDb252ZXJ0ZXIsIE1ldGhvZEludGVyY2VwdG9yLA0KLSAgICBTZXJpYWxpemFibGUNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgQ29udmVydGVyIG5ld0luc3RhbmNlKENvbnZlcnRlciB3cmFwcGVkQ29udmVydGVyKQ0KLSAgICB7DQotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSB3cmFwcGVkQ29udmVydGVyLmdldENsYXNzKCk7DQotDQotICAgICAgICAvL2l0J3Mgbm90IHBvc3NpYmxlIHRvIHdyYXAgdGhlIGNvbnZlcnRlciBhZ2FpbiAtIG9jY3VycyBlLmcuIHVuZGVyIHNvbGFyaXMgKyBiZWEgd2VibG9naWMNCi0gICAgICAgIGlmIChjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCIkJEVuaGFuY2VyQnlDR0xJQiQkIikNCi0gICAgICAgICAgICB8fCBjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCIkJEZhc3RDbGFzc0J5Q0dMSUIkJCIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB3cmFwcGVkQ29udmVydGVyOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRW5oYW5jZXIgZW5oYW5jZXIgPSBuZXcgRW5oYW5jZXIoKTsNCi0gICAgICAgIGVuaGFuY2VyLnNldFN1cGVyY2xhc3Mod3JhcHBlZENvbnZlcnRlci5nZXRDbGFzcygpKTsNCi0gICAgICAgIGVuaGFuY2VyLnNldEludGVyZmFjZXMobmV3IENsYXNzW117Q29udmVydGVyLmNsYXNzLA0KLSAgICAgICAgICAgIFNlcmlhbGl6YWJsZS5jbGFzc30pOw0KLSAgICAgICAgZW5oYW5jZXIuc2V0Q2FsbGJhY2sobmV3IEV4dFZhbENvbnZlcnRlcigpKTsNCi0NCi0gICAgICAgIEV4dFZhbFV0aWxzLmluY3JlYXNlUHJvY2Vzc2VkQ29udmVydGVyQ291bnQoKTsNCi0NCi0gICAgICAgIHJldHVybiAoQ29udmVydGVyKSBlbmhhbmNlci5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRXh0VmFsQ29udmVydGVyKCkNCi0gICAgew0KLSAgICAgICAgbG9nZ2VyLnRyYWNlKCJteWZhY2VzLWV4dGVuc2lvbi12YWxpZGF0b3IgY29udmVydGVyIGluc3RhbnRpYXRlZCIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QXNPYmplY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgU3RyaW5nIHMpDQotICAgIHsNCi0NCi0gICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QgPSBnZXRDb252ZXJ0ZWRPYmplY3QoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICBzKTsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFZhbGlkYXRpb25VdGlscy5wcm9jZXNzRXh0VmFsVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluYWxseQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vYnVpbGQgbWFwcGluZyB2YWx1ZS1iaW5kaW5nIC0+IHByb2Nlc3NlZCBpbmZvcm1hdGlvbiBlbnRyeQ0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNyZWF0ZVZhbHVlQmluZGluZ0NvbnZlcnRlZFZhbHVlTWFwcGluZyh1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRBc1N0cmluZyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgLy9pbmRpcmVjdCBhcHByb2FjaCBmb3IgY29tcGxleCBjb21wb25lbnRzDQotICAgICAgICBDb252ZXJ0ZXIgY29udmVydGVyID0gRXh0VmFsVXRpbHMudHJ5VG9DcmVhdGVPcmlnaW5hbENvbnZlcnRlcigNCi0gICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0gICAgICAgIHJldHVybiAoY29udmVydGVyID09IG51bGwpID8gKG8gPT0gbnVsbCkgPyBudWxsIDogby50b1N0cmluZygpDQotICAgICAgICAgICAgOiBjb252ZXJ0ZXIuZ2V0QXNTdHJpbmcoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBpbnRlcmNlcHQoT2JqZWN0IG9iaiwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kUHJveHkgcHJveHkpIHRocm93cyBUaHJvd2FibGUNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCA9IHByb3h5Lmludm9rZVN1cGVyKG9iaiwgYXJncyk7DQotDQotICAgICAgICBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldEFzT2JqZWN0IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBWYWxpZGF0aW9uVXRpbHMucHJvY2Vzc0V4dFZhbFZhbGlkYXRpb24oKEZhY2VzQ29udGV4dCkgYXJnc1swXSwNCi0gICAgICAgICAgICAgICAgICAgIChVSUNvbXBvbmVudCkgYXJnc1sxXSwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZmluYWxseQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9idWlsZCBtYXBwaW5nIHZhbHVlLWJpbmRpbmcgLT4gcHJvY2Vzc2VkIGluZm9ybWF0aW9uIGVudHJ5DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNyZWF0ZVZhbHVlQmluZGluZ0NvbnZlcnRlZFZhbHVlTWFwcGluZygoVUlDb21wb25lbnQpIGFyZ3NbMV0sIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldEFzU3RyaW5nIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RvcmVDb21wb25lbnRDb252ZXJ0ZXJNYXBwaW5nRm9yUHJveGllcygoRmFjZXNDb250ZXh0KSBhcmdzWzBdLA0KLSAgICAgICAgICAgICAgICAoVUlDb21wb25lbnQpIGFyZ3NbMV0sIChDb252ZXJ0ZXIpIG9iaik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0Q29udmVydGVkT2JqZWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBTdHJpbmcgcykNCi0gICAgew0KLSAgICAgICAgLy9pbmRpcmVjdCBhcHByb2FjaCBmb3IgY29tcGxleCBjb21wb25lbnRzDQotICAgICAgICAvL1RPRE8NCi0gICAgICAgIENvbnZlcnRlciBjb252ZXJ0ZXIgPSBFeHRWYWxVdGlscy50cnlUb0NyZWF0ZU9yaWdpbmFsQ29udmVydGVyKA0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICAgICAgcmV0dXJuIChjb252ZXJ0ZXIgIT0gbnVsbCkgPyBjb252ZXJ0ZXIuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIHVpQ29tcG9uZW50LCBzKSA6IHM7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogcHJpdmF0ZSBtZXRob2RzDQotICAgICAqLw0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc3RvcmVDb21wb25lbnRDb252ZXJ0ZXJNYXBwaW5nRm9yUHJveGllcygNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgQ29udmVydGVyIGNvbnZlcnRlcikNCi0gICAgew0KLSAgICAgICAgaWYgKEV4dFZhbFV0aWxzLnVzZVByb3h5TWFwcGluZygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldE9ySW5pdFByb3h5TWFwcGluZygpLnB1dCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSwgY29udmVydGVyKTsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5kZWNyZWFzZVByb2Nlc3NlZENvbnZlcnRlckNvdW50KCk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L1Byb3h5TWFwcGluZ1BoYXNlTGlzdGVuZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm94eS9Qcm94eU1hcHBpbmdQaGFzZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNjQ2M2IuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L1Byb3h5TWFwcGluZ1BoYXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUVudW07DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi0NCi0vKioNCi0gKiBkdWUgdG8gYSByZXN0cmljdGlvbiBhdCB0aGUgc3RhdGUgc2F2aW5nIHByb2Nlc3MNCi0gKiBhIHByb3h5IGdldHMgYSBzdXBlci1jbGFzcyB3aGljaCBtaWdodCBpbXBsLiBTdGF0ZUhvbGRlcg0KLSAqIC0+IHNhdmVTdGF0ZTogYSBTdGF0ZUhvbGRlciBpbXBsLiBnZXRzIGhhbmRsZWQgYmVmb3JlIFNlcmlhbGl6YWJsZSAtPiBjYWxsYmFjayBkb2Vzbid0IGdldCBzYXZlZA0KLSAqIC0+IHJlc3RvcmVTdGF0ZTogcmVzdG9yZVN0YXRlIG9mIHRoZSBzdXBlci1jbGFzcyBnZXRzIGNhbGxlZCAtIG5vIGNhbGxiYWNrIC0+IG5vIGludGVyY2VwdG9yIGdldHMgZXhlY3V0ZWQNCi0gKiBpZiBhIGZyYW1ld29yayAoc3VjaCBhcyB0cmluaWRhZCkgcHJvdmlkZXMgY2FjaGluZyBpdCdzIG5vIHByb2JsZW0NCi0gKiAtPiB1c2UgdGhlIHdlYi54bWwgY29udGV4dC1wYXJhbSB0byBkZWFjdGl2YXRlIHRoZSBtZWNoYW5pc20NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUVudW0uQUxURVJOQVRJVkUsIFVzYWdlRW51bS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIFByb3h5TWFwcGluZ1BoYXNlTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOw0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNJbml0aWFsaXplZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2Rvbid0IHVzZSBERUFDVElWQVRFX1BST1hZX01BUFBJTkcgaGVyZSB0byBhbGxvdyBhIGRpZmZlcmVudCBjb25jZXB0DQotICAgICAgICAgICAgU3RyaW5nIGluaXRQYXJhbSA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX1JFU1RPUkVfUFJPWFlfUEhBU0VfTElTVEVORVI7DQotICAgICAgICAgICAgU3RyaW5nIGluaXRBZGFwdGVyUGFyYW0gPSBXZWJYbWxQYXJhbWV0ZXIuVVNFX0FEQVBURVJTOw0KLQ0KLSAgICAgICAgICAgIGlmICgoaW5pdFBhcmFtICE9IG51bGwgJiYgaW5pdFBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgICAgICAgICAgfHwgKGluaXRBZGFwdGVyUGFyYW0gIT0gbnVsbCAmJiBpbml0QWRhcHRlclBhcmFtDQotICAgICAgICAgICAgICAgIC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZGVyZWdpc3RlclBoYXNlTGlzdGVuZXIodGhpcyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKCFldmVudC5nZXRQaGFzZUlkKCkuZXF1YWxzKFBoYXNlSWQuUkVOREVSX1JFU1BPTlNFKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBJbnRlZ2VyIHByb2Nlc3NlZENvbnZlcnRlckNvdW50ID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAuZ2V0UHJvY2Vzc2VkQ29udmVydGVyQ291bnQoKTsNCi0gICAgICAgIC8vZG9uJ3QgY2hhbmdlIHRoZSBjb21wYXJpc29uIHdpdGggMCAtIGluIG9yZGVyIHRvIHJlZHVjZSB0aGUgb3ZlcmhlYWQuDQotICAgICAgICAvL2lmIGV2ZXJ5dGhpbmcgd29ya3MgY29ycmVjdGx5IGl0J3Mgbm90IG5lY2Vzc2FyeSB0byBpbnNwYWN0IHRoZSBmdWxsIHRyZWUNCi0gICAgICAgIC8vaXQncyBqdXN0IGR1ZSB0byBhIHJpIGJ1ZyAtIG5vcm1hbGx5IGl0J3MgcGVyZm9ybWVkIGR1cmluZyBFeHRWYWxDb252ZXJ0ZXIjaW50ZXJjZXB0I2dldEFzU3RyaW5nDQotICAgICAgICBpZiAoRXh0VmFsVXRpbHMudXNlUHJveHlNYXBwaW5nKCkNCi0gICAgICAgICAgICAmJiAocHJvY2Vzc2VkQ29udmVydGVyQ291bnQgIT0gbnVsbCAmJiAhcHJvY2Vzc2VkQ29udmVydGVyQ291bnQNCi0gICAgICAgICAgICAuZXF1YWxzKDApKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yZUNvbXBvbmVudENvbnZlcnRlck1hcHBpbmdGb3JQcm94aWVzKGV2ZW50LmdldEZhY2VzQ29udGV4dCgpLA0KLSAgICAgICAgICAgICAgICBldmVudC5nZXRGYWNlc0NvbnRleHQoKS5nZXRWaWV3Um9vdCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWV2ZW50LmdldFBoYXNlSWQoKS5lcXVhbHMoUGhhc2VJZC5BUFBMWV9SRVFVRVNUX1ZBTFVFUykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVzdG9yZVByb3hpZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuQU5ZX1BIQVNFOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB0aGVyZSBpcyBhIHJpIGJ1ZyAoYXQgbGVhc3Qgd2l0aCBqc3AncykgLT4gc29tZXRpbWVzIGdldEFzU3RyaW5nIG9mIGNvbnZlcnRlcnMgYXJlbid0IGNhbGxlZA0KLSAgICAgKiAtPiB0aGVyZSBpcyBubyBtYXBwaW5nIC0+IGlmIGl0J3MgdGhlIGNhc2UgYW5kIHRoZXJlIGFyZQ0KLSAgICAgKiB1bmhhbmRsZWQgZWRpdGFibGUgdmFsdWUgaG9kZXIgY29tcG9uZW50cyB3aXRoaW4gdGhlIHBhZ2UNCi0gICAgICogLT4gc2VhcmNoIGFsbCB0aGVzZSBjb21wb25lbnRzIGFuZCBhZGQgdGhlIGVxdWl2YWxlbnQgY29udmVydGVyIHRvIHRoZSBtYXBwaW5nDQotICAgICAqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGZhY2VzIGNvbnRleHQNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50ICByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgc3RvcmVDb21wb25lbnRDb252ZXJ0ZXJNYXBwaW5nRm9yUHJveGllcygNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICAvL1RPRE8gdXNlIHRoZSBmb2xsb3dpbmcgYWZ0ZXIgdGhlIGltcGwuIG9mIGEgYmV0dGVyIG11bHRpLXdpbmRvdy1tb2RlIHNvbHV0aW9uDQotICAgICAgICAvL2lmKCF1aUNvbXBvbmVudC5pc1JlbmRlcmVkKCkpIHsNCi0gICAgICAgIC8vICAgIHJldHVybjsNCi0gICAgICAgIC8vfQ0KLQ0KLSAgICAgICAgZm9yIChVSUNvbXBvbmVudCBjaGlsZCA6IHVpQ29tcG9uZW50LmdldENoaWxkcmVuKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVmFsdWVIb2xkZXIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBDb252ZXJ0ZXIgY29udmVydGVyID0gKChWYWx1ZUhvbGRlcikgY2hpbGQpLmdldENvbnZlcnRlcigpOw0KLSAgICAgICAgICAgICAgICBpZiAoY29udmVydGVyICE9IG51bGwNCi0gICAgICAgICAgICAgICAgICAgICYmIGNvbnZlcnRlci5nZXRDbGFzcygpLmdldE5hbWUoKS5jb250YWlucygiJCQiKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0T3JJbml0UHJveHlNYXBwaW5nKCkucHV0KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldENsaWVudElkKGZhY2VzQ29udGV4dCksIGNvbnZlcnRlcik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgc3RvcmVDb21wb25lbnRDb252ZXJ0ZXJNYXBwaW5nRm9yUHJveGllcyhmYWNlc0NvbnRleHQsIGNoaWxkKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMTA4NTAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkVMVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGltcGxlbWVudHMNCi0gICAgTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfREVGQVVMVF9DT05WRU5USU9OOw0KLSAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBkZWZhdWx0QnVuZGxlID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZUJ1bmRsZUJhc2VOYW1lOw0KLSAgICAvL3dpdGgganNmIDEuMSBvbmx5IGF2YWlsYWJsZSBpZiB0aGVyZSBpcyBhIGN1c3RvbSBiZWFuDQotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VCdW5kbGVWYXJOYW1lOw0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGtleSA9PSBudWxsIHx8IGtleS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIGN1c3RvbU1lc3NhZ2UgPSBudWxsOw0KLQ0KLSAgICAgICAgLy9vbmx5IGluIGNhc2Ugb2YgYSBWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggaXMgY29uZmlndXJlZCBhcyBiZWFuDQotICAgICAgICBpZiAodGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSh0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSwgbG9jYWxlKTsNCi0gICAgICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm1lc3NhZ2UgYnVuZGxlICIgKyB0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSArICIgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9vbmx5IGluIGNhc2Ugb2YgYSBWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggaXMgY29uZmlndXJlZCBhcyBiZWFuDQotICAgICAgICBpZiAodGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSAhPSBudWxsICYmIGN1c3RvbU1lc3NhZ2UgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IChSZXNvdXJjZUJ1bmRsZSkgRUxVdGlscy5nZXRCZWFuKG1lc3NhZ2VCdW5kbGVWYXJOYW1lKTsNCi0gICAgICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm1lc3NhZ2UgYnVuZGxlIHZhciBuYW1lICIgKyB0aGlzLm1lc3NhZ2VCdW5kbGVWYXJOYW1lICsgIiBub3QgZm91bmQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY3VzdG9tTWVzc2FnZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIHRyeSB0byB1c2UgdGhlIGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZQ0KLSAgICAgICAgICovDQotICAgICAgICBjdXN0b21NZXNzYWdlID0gdHJ5VG9Vc2VNZXNzYWdlQnVuZGxlQ29udmVudGlvbihrZXksIGxvY2FsZSk7DQotDQotICAgICAgICBpZiAoY3VzdG9tTWVzc2FnZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIG5vIG1lc3NhZ2UgYnVuZGxlIG9yIG1lc3NhZ2UgZm91bmQgKHdpdGggdGhlIGNvbnZlbnRpb24pPw0KLSAgICAgICAgICovDQotDQotICAgICAgICAvL3RyeSB0byBsb2FkIGN1c3RvbSBtZXNzYWdlcw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoZ2V0Q3VzdG9tQmFzZU5hbWUoKSwNCi0gICAgICAgICAgICAgICAgbG9jYWxlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gY3VzdG9tIG1lc3NhZ2UgZm9yICIgKyBrZXkgKyAiIHdpdGhpbiAiDQotICAgICAgICAgICAgICAgICAgICArIGdldEN1c3RvbUJhc2VOYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vdXNlIGN1c3RvbSBuYW1lIChpZiBwb3NzaWJsZSkgb3RoZXJ3aXNlOiBmYWxsYmFjayB0byBkZWZhdWx0IG1lc3NhZ2UgKGlmIHBvc3NpYmxlKQ0KLSAgICAgICAgcmV0dXJuIChjdXN0b21NZXNzYWdlICE9IG51bGwpID8gY3VzdG9tTWVzc2FnZQ0KLSAgICAgICAgICAgIDogKGdldEJhc2VOYW1lKCkgIT0gbnVsbCkgPyBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoDQotICAgICAgICAgICAgZ2V0QmFzZU5hbWUoKSwgbG9jYWxlKS5nZXRTdHJpbmcoa2V5KSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHJ5VG9Vc2VNZXNzYWdlQnVuZGxlQ29udmVudGlvbihTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VzdG9tTWVzc2FnZSA9IG51bGw7DQotDQotICAgICAgICBpZiAoKGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbiA9PSBudWxsIHx8ICFkZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb24NCi0gICAgICAgICAgICAuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgICAgICYmIGlzRGVmYXVsdE1lc3NhZ2VCdW5kbGVDb252ZW50aW9uQWN0aXZlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGRlZmF1bHRCdW5kbGUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0QnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29udmVudGlvbkZvck1lc3NhZ2VCdW5kbGUoKSwgbG9jYWxlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZw0KLSAgICAgICAgICAgICAgICAgICAgZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID0gInRydWUiOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChkZWZhdWx0QnVuZGxlICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IGRlZmF1bHRCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGVmYXVsdE1lc3NhZ2VCdW5kbGVDb252ZW50aW9uQWN0aXZlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRCYXNlTmFtZSgpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUJ1bmRsZUJhc2VOYW1lKFN0cmluZyBtZXNzYWdlQnVuZGxlQmFzZU5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lID0gbWVzc2FnZUJ1bmRsZUJhc2VOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VCdW5kbGVWYXJOYW1lKFN0cmluZyBtZXNzYWdlQnVuZGxlVmFyTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSA9IG1lc3NhZ2VCdW5kbGVWYXJOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAwNDFjYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLg0KLSAgICAgICAgcmVzb2x2ZXIubWFwcGVyLkN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLg0KLSAgICAgICAgcmVzb2x2ZXIubWFwcGVyLkN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLg0KLSAgICAgICAgcmVzb2x2ZXIubWFwcGVyLkRlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLg0KLSAgICAgICAgcmVzb2x2ZXIubWFwcGVyLkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLg0KLSAgICAgICAgcmVzb2x2ZXIubWFwcGVyLlNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLS8vVE9ETyBhZGQgZ2VuZXJpYyBqYXZhIGFwaSAoZGUtL3JlZ2lzdGVyIG1hcHBpbmcpDQotcHVibGljIGNsYXNzIERlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5IGltcGxlbWVudHMNCi0gICAgQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1lc3NhZ2VSZXNvbHZlcj4NCi17DQotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nID0NCi0gICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gbmFtZU1hcHBlckxpc3QgPQ0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KCk7DQotDQotICAgIHN0YXRpYw0KLSAgICB7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIG5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IERlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIG5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1lc3NhZ2VSZXNvbHZlciBjcmVhdGUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHN0cmF0ZWd5TmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0NCi0gICAgICAgIGlmIChzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmcuY29udGFpbnNLZXkoc3RyYXRlZ3lOYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKE1lc3NhZ2VSZXNvbHZlcikgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmcNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoc3RyYXRlZ3lOYW1lKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOw0KLSAgICAgICAgU3RyaW5nIHJlc29sdmVyTmFtZTsNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IG5hbWVNYXBwZXIgOiBuYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2J1aWxkIGNvbnZlbnRpb24gKFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcikNCi0gICAgICAgICAgICByZXNvbHZlck5hbWUgPSBuYW1lTWFwcGVyLmNyZWF0ZU5hbWUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAvL25hbWUgd2Fzbid0IG1hcHBlZA0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKHJlc29sdmVyTmFtZSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgbWVzc2FnZVJlc29sdmVyID0gKE1lc3NhZ2VSZXNvbHZlcikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHJlc29sdmVyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKG1lc3NhZ2VSZXNvbHZlciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyhzdHJhdGVneU5hbWUsIHJlc29sdmVyTmFtZSk7DQotICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYWRkTWFwcGluZyhzdHJhdGVneU5hbWUsIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MNCi0gICAgICAgICAgICAuZ2V0TmFtZSgpKTsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBzdHJhdGVneU5hbWUsIFN0cmluZyBtZXNzYWdlUmVzb2x2ZXJOYW1lKQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKERlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZy5wdXQoc3RyYXRlZ3lOYW1lLA0KLSAgICAgICAgICAgICAgICBtZXNzYWdlUmVzb2x2ZXJOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vVE9ETyBsb2dnaW5nDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNmMTMwNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciBleHRlbmRzDQotICAgIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0JVTkRMRSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVTU0FHRV9CVU5ETEU7DQotDQotICAgIC8vbm90IHVzZWQgYXQgdGhlIG1vbWVudCAtIGp1c3QgZm9yIGEgY29udmVudGlvbg0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0Q29udmVudGlvbkZvck1vZHVsZU1lc3NhZ2VCdW5kbGUoDQotICAgICAgICAgICAgICAgIGdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21CYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBDVVNUT01fQlVORExFOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL01lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWQ3MGJjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGludGVyZmFjZSBNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmNiODA2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfTkFNRV9NQVBQRVI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk2ZTMzNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldEN1c3RvbVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMyNGZhOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi17DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgc3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjc3N2NmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGltcGxlbWVudHMNCi0gICAgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0Q29udmVudGlvbk5hbWVGb3JNZXNzYWdlUmVzb2x2ZXJQYWNrYWdlKA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwNCi0gICAgICAgICAgICAgICAgZ2V0Q2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0U2ltcGxlTmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXRDb252ZW50aW9uTmFtZUZvck1lc3NhZ2VSZXNvbHZlckNsYXNzKHN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRlODMyYi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBpbXBsZW1lbnRzDQotICAgIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXNvbHZlck5hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotDQotICAgICAgICByZXR1cm4gcmVzb2x2ZXJOYW1lLnN1YnN0cmluZygwLCByZXNvbHZlck5hbWUubGFzdEluZGV4T2YoIi4iKSkNCi0gICAgICAgICAgICArICIuRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZmZhYWEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkZhY3RvcnlVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRvckFkYXB0ZXINCi17DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYID0gIl9kZXRhaWxzIjsNCi0gICAgcHJpdmF0ZSBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIExvY2FsZSBsb2NhbGUgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKQ0KLSAgICAgICAgICAgIC5nZXRMb2NhbGUoKTsNCi0NCi0gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VSZXNvbHZlciAhPSBudWxsID8gdGhpcy5tZXNzYWdlUmVzb2x2ZXIuZ2V0TWVzc2FnZShrZXksIGxvY2FsZSkgOg0KLSAgICAgICAgICAgIEZhY3RvcnlVdGlscy5nZXRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5KCkuY3JlYXRlKHRoaXMpLmdldE1lc3NhZ2Uoa2V5LCBsb2NhbGUpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiByZXNvbHZlTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbikpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlRGV0YWlscyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbik7DQotICAgICAgICAgICAgcmV0dXJuIChrZXkgIT0gbnVsbCkgPyByZXNvbHZlTWVzc2FnZShrZXkNCi0gICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCkgOiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiDQotICAgICAgICAgICAgICAgICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pDQotICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEZhY2VzTWVzc2FnZSBnZXRWYWxpZGF0aW9uRXJyb3JGYWNlc01hc3NhZ2UoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsDQotICAgICAgICAgICAgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uKSwNCi0gICAgICAgICAgICBnZXRFcnJvck1lc3NhZ2VEZXRhaWxzKGFubm90YXRpb24pKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlUmVzb2x2ZXIoTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlUmVzb2x2ZXIgPSBtZXNzYWdlUmVzb2x2ZXI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0b3JBZGFwdGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRvckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMxN2QyNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRvckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRW50cnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRvckFkYXB0ZXIgaW1wbGVtZW50cyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uRW50cnkgYW5ub3RhdGlvbkVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpbml0VmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBhbm5vdGF0aW9uRW50cnksDQotICAgICAgICAgICAgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGFubm90YXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAocHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgIGFubm90YXRpb25FbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb252ZXJ0ZXJFeGNlcHRpb24oZS5nZXRGYWNlc01lc3NhZ2UoKSwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBBbm5vdGF0aW9uRW50cnkgYW5ub3RhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICAvL292ZXJyaWRlIGlmIG5lZWRlZA0KLSAgICB9DQotDQotICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEFubm90YXRpb25FbnRyeSBhbm5vdGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LCBWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEFubm90YXRpb25FbnRyeSBhbm5vdGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb247DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0NsaWVudFNpZGVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0NsaWVudFNpZGVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyNDA2ZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9DbGllbnRTaWRlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlRW51bTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlRW51bS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIENsaWVudFNpZGVWYWxpZGF0aW9uU3RyYXRlZ3kKLXsKLSAgICBMaXN0PFN0cmluZz4gZXh0cmFjdE1ldGFEYXRhKEFubm90YXRpb24gYW5ub3RhdGlvbik7Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc4M2JmNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyDQotICAgIC5Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXINCi0gICAgLkN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcg0KLSAgICAuQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyDQotICAgIC5EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXINCi0gICAgLlNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkVMVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOw0KLQ0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLS8vVE9ETyBhZGQgZ2VuZXJpYyBqYXZhIGFwaSAoZGUtL3JlZ2lzdGVyIG1hcHBpbmcpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5IGltcGxlbWVudHMNCi0gICAgQ2xhc3NNYXBwaW5nRmFjdG9yeTxBbm5vdGF0aW9uLCBWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGFubm90YXRpb25TdHJhdGVneU1hcHBpbmcgPSBudWxsOw0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PE5hbWVNYXBwZXI8QW5ub3RhdGlvbj4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPEFubm90YXRpb24+PigpOw0KLQ0KLSAgICBzdGF0aWMNCi0gICAgew0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsNCi0gICAgICAgIG5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IERlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgLy9UT0RPIGlmIGpzciAzMDMgZG9lc24ndCBjaGFuZ2U6DQotICAgICAgICAvL25hbWVNYXBwZXJMaXN0LmFkZChuZXcgQmVhblZhbGlkYXRpb25Bbm5vdGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsNCi0gICAgICAgIG5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdC5hZGQobmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIG5ldyBEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdC5hZGQobmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIG5ldyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGNyZWF0ZShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uU3RyYXRlZ3lNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY1N0cmF0ZWd5TWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCk7DQotDQotICAgICAgICBpZiAoYW5ub3RhdGlvblN0cmF0ZWd5TWFwcGluZy5jb250YWluc0tleShhbm5vdGF0aW9uTmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKGFubm90YXRpb25TdHJhdGVneU1hcHBpbmcNCi0gICAgICAgICAgICAgICAgLmdldChhbm5vdGF0aW9uTmFtZSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWU7DQotICAgICAgICAvL251bGwgLT4gdXNlIG5hbWUgbWFwcGVycw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPEFubm90YXRpb24+IG5hbWVNYXBwZXIgOiBuYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdHJhdGVneU5hbWUgPSBuYW1lTWFwcGVyLmNyZWF0ZU5hbWUoYW5ub3RhdGlvbik7DQotDQotICAgICAgICAgICAgaWYgKHN0cmF0ZWd5TmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKHN0cmF0ZWd5TmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyhhbm5vdGF0aW9uTmFtZSwgc3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lJbnN0YW5jZSgNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZQ0KLSAgICAgICAgICAgIC5zdGFydHNXaXRoKEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLlBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFZhbGlkYXRpb25TdHJhdGVneSkgRUxVdGlscw0KLSAgICAgICAgICAgICAgICAuZ2V0QmVhbih2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLlBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HDQotICAgICAgICAgICAgICAgICAgICAubGVuZ3RoKCkpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFZhbGlkYXRpb25TdHJhdGVneSkgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIFN0cmluZyBzdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIHN5bmNocm9uaXplZCAoRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuY2xhc3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYW5ub3RhdGlvblN0cmF0ZWd5TWFwcGluZy5wdXQoYW5ub3RhdGlvbk5hbWUsIHN0cmF0ZWd5TmFtZSk7DQotICAgICAgICB9DQotICAgICAgICAvL1RPRE8gbG9nZ2luZw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0U3RhdGljU3RyYXRlZ3lNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIHN5bmNocm9uaXplZCAoRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuY2xhc3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYW5ub3RhdGlvblN0cmF0ZWd5TWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICAgICAgZm9yIChTdHJpbmcgaW50ZXJuYWxNYXBwaW5nU291cmNlIDogRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgLmdldFN0YXRpY1N0cmF0ZWd5TWFwcGluZ1NvdXJjZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhpbnRlcm5hbE1hcHBpbmdTb3VyY2UpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvL3RyeSB0byBzZXR1cCBtYXBwaW5nIHdpdGggYmFzZSBuYW1lIGJ5IGNvbnZlbnRpb24gLSBvdmVycmlkZXMgZGVmYXVsdCBtYXBwaW5nDQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL2J1aWxkIGNvbnZlbnRpb24gKHN0cmF0ZWd5IG1hcHBpbmcpDQotICAgICAgICAgICAgICAgIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhFeHRWYWxVdGlscy5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0Q3VzdG9tU3RhdGljU3RyYXRlZ3lNYXBwaW5nU291cmNlKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvL3NldHVwIGN1c3RvbSBtYXBwaW5nIC0gb3ZlcnJpZGVzIGFsbCBvdGhlciBtYXBwaW5ncw0KLSAgICAgICAgICAgIFN0cmluZyBjdXN0b21NYXBwaW5nQmFzZU5hbWUgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05TVFJBVEVHWV9NQVBQSU5HOw0KLSAgICAgICAgICAgIGlmIChjdXN0b21NYXBwaW5nQmFzZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3MoY3VzdG9tTWFwcGluZ0Jhc2VOYW1lKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vVE9ETyBsb2dnaW5nDQotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cFN0cmF0ZWd5TWFwcGluZ3MoU3RyaW5nIGJ1bmRsZSkNCi0gICAgew0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgc3RyYXRlZ3lNYXBwaW5nID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGJ1bmRsZSk7DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IHN0cmF0ZWd5TWFwcGluZy5nZXRLZXlzKCk7DQotDQotICAgICAgICBTdHJpbmcgYW5ub3RhdGlvbkNsYXNzTmFtZTsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7DQotDQotICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhbm5vdGF0aW9uQ2xhc3NOYW1lID0gKFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpOw0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSA9IHN0cmF0ZWd5TWFwcGluZw0KLSAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKGFubm90YXRpb25DbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcoYW5ub3RhdGlvbkNsYXNzTmFtZSwgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTAwYmI2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUVudW07DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlRW51bS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbkVudHJ5IGFubm90YXRpb25FbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYzMwYzQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogICAgICAgICA8cC8+DQotICogICAgICAgICBOYW1lIE1hcHBlciB3aGljaCBkZWxlZ2F0ZXMgdGhlIG5hbWUgbWFwcGluZywgZXh0cmFjdCB0aGUgbmFtZSBhbmQgY29udmVydCBpdCB0byBhIGJlYW4gbmFtZSArIHByZWZpeA0KLSAqICAgICAgICAgdGFyZ2V0OiBjb25maWd1cmUgYSB2YWxpZGF0aW9uIHN0cmF0ZWd5IHZpYSBhIG1hbmFnZWQgYmVhbiBmYWNpbGl0eSAtPiBhbGxvd3MgdG8gaW5qZWN0IG90aGVyIGJlYW5zDQotICogICAgICAgICBpbnN0ZWFkIG9mIGFwaSBjYWxscyArIGhhcmRjb2RlZCBiZWFuIG5hbWVzDQotICogICAgICAgICA8cC8+DQotICogICAgICAgICBhbGxvd2VkIGJlYW4gc2NvcGVzOg0KLSAqICAgICAgICAgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgc3RhdGVsZXNzOiBhcHBsaWNhdGlvbi9zaW5nbGV0b24NCi0gKiAgICAgICAgIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIHN0YXRlZnVsOiBub25lL3Byb3RvdHlwZQ0KLSAqICAgICAgICAgZG9uJ3QgdXNlIHRoZSBzZXNzaW9uIG9yIGEgY29udmVyc2F0aW9uIHNjb3BlDQotICovDQotcHVibGljIGNsYXNzIEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyIGltcGxlbWVudHMNCi0gICAgTmFtZU1hcHBlcjxBbm5vdGF0aW9uPg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0ZPUl9CRUFOX01BUFBJTkcgPSAiYmVhbjoiOw0KLSAgICBwcml2YXRlIE5hbWVNYXBwZXI8QW5ub3RhdGlvbj4gd3JhcHBlZDsNCi0NCi0gICAgcHVibGljIEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKA0KLSAgICAgICAgTmFtZU1hcHBlcjxBbm5vdGF0aW9uPiBuYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSBuYW1lTWFwcGVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShBbm5vdGF0aW9uIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSB3cmFwcGVkLmNyZWF0ZU5hbWUoc291cmNlKTsNCi0NCi0gICAgICAgIGlmIChuYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7DQotICAgICAgICByZXR1cm4gUFJFRklYX0ZPUl9CRUFOX01BUFBJTkcgKyBuYW1lLnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZSgpDQotICAgICAgICAgICAgKyBuYW1lLnN1YnN0cmluZygxKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWZmMmJiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1ARGVwcmVjYXRlZA0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxBbm5vdGF0aW9uPg0KLXsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fQU5OT1RBVElPTl9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OWYzY2IuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogTmFtZU1hcHBlcnMgYXJlIHN0YXRlbGVzcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPEFubm90YXRpb24+DQotew0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXRDdXN0b21Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhY2NkZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIERlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGltcGxlbWVudHMNCi0gICAgTmFtZU1hcHBlcjxBbm5vdGF0aW9uPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0Q29udmVudGlvbk5hbWVGb3JWYWxpZGF0aW9uU3RyYXRlZ3koYW5ub3RhdGlvbik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMmRhMDEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgaW1wbGVtZW50cw0KLSAgICBOYW1lTWFwcGVyPEFubm90YXRpb24+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lQb3N0Zml4KCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUVudW0uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VFbnVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMjBlYjcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUVudW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbDsKLQotLyoqCi0gKiBBUEk6PGJyLz4KLSAqIHBhcnRzIHlvdSBtaWdodCBuZWVkIGZvciBjdXN0b20gaW1wbGVtZW50YXRpb25zIGFuZCB3aGljaCBhcmUgcXVpdGUgc3RhYmxlIGluIHZpZXcgb2YgY2hhbmdlcwotICogPHAvPgotICogSU5URVJOQUw6PGJyLz4KLSAqIGlmIHlvdSB0aGluayBhYm91dCByZWZlcmVuY2luZyBhbiBhcnRpZmFjdCB3aGljaCBpcyBtYXJrZWQgYXMgaW50ZXJuYWwsIGFzayBmb3Igc3VwcG9ydC4KLSAqIHRoZXJlIHNob3VsZCBiZSBhIGJldHRlciBzb2x1dGlvbgotICogPHAvPgotICogQ1VTVE9NSVpBQkxFOjxici8+Ci0gKiBhIHBsYW5uZWQgZXh0ZW5zaW9uIHBvaW50IHdoaWNoIGNvbnRhaW5zIGxvZ2ljIHRvIGN1c3RvbWl6ZSB0aGUgZnJhbWV3b3JrLgotICogaWYgaXQgaXNuJ3QgYWxzbyBtYXJrZWQgYXMgQVBJIGl0IG1pZ2h0IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuCi0gKiBob3dldmVyLCB3ZSB0cnkgdG8ga2VlcCBpdCBhcyBzdGFibGUgYXMgcG9zc2libGUgYW5kIHJlYXNvbmFibGUuCi0gKiA8cC8+Ci0gKiBSRVVTRTo8YnIvPgotICogYW4gYXJ0aWZhY3Qgd2hpY2ggeW91IGNhbiByZXVzZSBmb3IgYSBjdXN0b20gYXJ0aWZhY3QuCi0gKiBpZiBpdCBpc24ndCBtYXJrZWQgYXMgQVBJIGl0IG1pZ2h0IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuCi0gKiBob3dldmVyLCB3ZSB0cnkgdG8ga2VlcCBpdCBhcyBzdGFibGUgYXMgcG9zc2libGUgYW5kIHJlYXNvbmFibGUuCi0gKiA8cC8+Ci0gKiBGQUxMQkFDSyBhbmQgQUxURVJOQVRJVkUKLSAqIGUuZy46IHNvbWUgbWVjaGFuaXNtcyBhcmVuJ3QgZGVwcmVjYXRlZCwgYmVjYXVzZSBpdCBtYWtlcyBzZW5zZSB0byB1c2UgdGhlbS4KLSAqIGhvd2V2ZXIsIGl0J3Mgbm90IHRoZSBkZWZhdWx0IGFwcHJvYWNoCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKi8KLXB1YmxpYyBlbnVtIFVzYWdlRW51bQotewotICAgIEFQSSwKLSAgICBJTlRFUk5BTCwKLSAgICBDVVNUT01JWkFCTEUsCi0gICAgUkVVU0UsCi0gICAgRkFMTEJBQ0ssCi0gICAgQUxURVJOQVRJVkUKLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYjAwYmMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogaXQncyBhbiBpbnRlcm5hbCBhbm5vdGF0aW9uIHRvIHByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbgotICogPHAvPgotICogZS5nLjogc29tZSBtZWNoYW5pc21zIGFyZW4ndCBkZXByZWNhdGVkCi0gKiB0aGV5IGFyZSBlLmcuIGZhbGxiYWNrcywgYWx0ZXJuYXRpdmVzLC4uLgotICogaW4gb3JkZXIgdG8gYXZvaWQgdGhlIGRlcHJlY2F0ZWQgYW5ub3RhdGlvbiBpdCdzIHBvc3NpYmxlIHRvIHVzZSB0aGlzIG9uZS4KLSAqIHlvdSBjYW4gdGVsbCBvdGhlciBkZXZlbG9wZXJzOgotICogdGhpcyBhcnRpZmFjdCBpc24ndCB1c2VkIGZvciB0aGUgZGVzaXJlZCBhcHByb2FjaCwgaG93ZXZlciwgaXQncyBzdGlsbCBlc3NlbnRpYWwgdG8gaGF2ZSBpdCBhcyAuLi4KLSAqIDxwLz4KLSAqIGlkZWE6IHVuaWZ5IHNtYWxsIHBhcnRzIG9mIGluZm9ybWF0aW9uIHdoaWNoIGFyZSBmcmVxdWVudGx5IHVzZWQKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqLwotQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi1wdWJsaWMgQGludGVyZmFjZSBVc2FnZUluZm9ybWF0aW9uCi17Ci0gICAgVXNhZ2VFbnVtW10gdmFsdWUoKTsKLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9BcnJheVV0aWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQXJyYXlVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjYxYWJhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9BcnJheVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBtYW5hZ2luZyBhcnJheXMKLSAqCi0gKiBAYXV0aG9yIEFudG9uIEtvaW5vdiAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yOiBncmFudHNtaXRoICQpCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDQ3MjYzMCAkICREYXRlOiAyMDA2LTExLTA4IDIwOjQwOjAzICswMDAwIChXZWQsIDA4IE5vdiAyMDA2KSAkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnJheVV0aWxzCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9PQkpFQ1RfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfU1RSSU5HX0FSUkFZID0gbmV3IFN0cmluZ1swXTsKLQotICAgIC8vfiBDb25zdHJ1Y3RvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHJvdGVjdGVkIEFycmF5VXRpbHMoKQotICAgIHsKLSAgICAgICAgLy8gaGlkZSBmcm9tIHB1YmxpYyBhY2Nlc3MKLSAgICB9Ci0KLSAgICAvL34gTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgY29tbW9uQ2xhc3MoQ2xhc3MgYzEsIENsYXNzIGMyKQotICAgIHsKLSAgICAgICAgaWYgKGMxID09IGMyKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYzE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKGMxID09IE9iamVjdC5jbGFzcykgfHwgYzEuaXNBc3NpZ25hYmxlRnJvbShjMikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjMi5pc0Fzc2lnbmFibGVGcm9tKGMxKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGMyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGMxLmlzUHJpbWl0aXZlKCkgfHwgYzIuaXNQcmltaXRpdmUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gUkVWSVNJVDogd2UgY291bGQgdHJ5IHRvIGF1dG9jb252ZXJ0IHRvIE9iamVjdCBvciBzb21ldGhpbmcgYXBwcm9wcmlhdGUKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluY29tcGF0aWJsZSB0eXBlcyAiICsgYzEgKyAiIGFuZCAiICsgYzIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUkVWSVNJVDogd2UgY291bGQgdHJ5IHRvIGZpbmQgYSBjb21tb24gc3VwcGVyIGNsYXNzIG9yIGludGVyZmFjZQotICAgICAgICByZXR1cm4gT2JqZWN0LmNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbmNhdGVuYXRlcyB0d28gYXJyYXlzIGludG8gb25lLiBJZiBhcnIxIGlzIG51bGwgb3IgZW1wdHksIHJldHVybnMgYXJyMi4KLSAgICAgKiBJZiBhcnIyIGlzIG51bGwgb3IgZW1wdHksIHJldHVybnMgYXJyMS4gTWF5IHJldHVybiBudWxsIGlmIGJvdGggYXJyYXlzIGFyZSBudWxsLAotICAgICAqIG9yIG9uZSBpcyBlbXB0eSBhbmQgdGhlIG90aGVyIG51bGwuIDxicj4KLSAgICAgKiBUaGUgY29uY2F0ZW5hdGVkIGFycmF5IGhhcyBjb21wb25lbnRUeXBlIHdoaWNoIGlzIGNvbXBhdGlibGUgd2l0aCBib3RoIGlucHV0IGFycmF5cyAob3IgT2JqZWN0W10pCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJyMSBpbnB1dCBhcnJheQotICAgICAqIEBwYXJhbSBhcnIyIGlucHV0IGFycmF5Ci0gICAgICogQHJldHVybiBPYmplY3QgdGhlIGNvbmNhdGVuYXRlZCBhcnJheSwgZWxlbWVudHMgb2YgYXJyMSBmaXJzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNvbmNhdChPYmplY3QgYXJyMSwgT2JqZWN0IGFycjIpCi0gICAgewotICAgICAgICBpbnQgbGVuMSA9IChhcnIxID09IG51bGwpID8gKC0xKSA6IEFycmF5LmdldExlbmd0aChhcnIxKTsKLQotICAgICAgICBpZiAobGVuMSA8PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYXJyMjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBsZW4yID0gKGFycjIgPT0gbnVsbCkgPyAoLTEpIDogQXJyYXkuZ2V0TGVuZ3RoKGFycjIpOwotCi0gICAgICAgIGlmIChsZW4yIDw9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBhcnIxOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xhc3MgY29tbW9uQ29tcG9uZW50VHlwZSA9Ci0gICAgICAgICAgICBjb21tb25DbGFzcyhhcnIxLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpLCBhcnIyLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpKTsKLSAgICAgICAgT2JqZWN0IG5ld0FycmF5ID0gQXJyYXkubmV3SW5zdGFuY2UoY29tbW9uQ29tcG9uZW50VHlwZSwgbGVuMSArIGxlbjIpOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFycjEsIDAsIG5ld0FycmF5LCAwLCBsZW4xKTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShhcnIyLCAwLCBuZXdBcnJheSwgbGVuMSwgbGVuMik7Ci0KLSAgICAgICAgcmV0dXJuIG5ld0FycmF5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbmNhdGVuYXRlcyBhcnJheXMgaW50byBvbmUuIEFueSBudWxsIG9yIGVtcHR5IGFycmF5cyBhcmUgaWdub3JlZC4KLSAgICAgKiBJZiBhbGwgYXJyYXlzIGFyZSBudWxsIG9yIGVtcHR5LCByZXR1cm5zIG51bGwuCi0gICAgICogRWxlbWVudHMgd2lsbCBiZSBvcmRlcmVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgYXJyYXlzIGFyZSBzdXBwbGllZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcnJzIGFycmF5IG9mIGFycmF5cwotICAgICAqIEByZXR1cm4gdGhlIGNvbmNhdGVuYXRlZCBhcnJheQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNvbmNhdChPYmplY3RbXSBhcnJzKQotICAgIHsKLSAgICAgICAgaW50IHRvdGFsTGVuID0gMDsKLSAgICAgICAgQ2xhc3MgY29tbW9uQ29tcG9uZW50VHlwZSA9IG51bGw7Ci0gICAgICAgIGludCBpOwotICAgICAgICBpbnQgbGVuOwotICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBhcnJzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBza2lwIGFsbCBudWxsIGFycmF5cwotICAgICAgICAgICAgaWYgKGFycnNbaV0gPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGFycmF5TGVuID0gQXJyYXkuZ2V0TGVuZ3RoKGFycnNbaV0pOwotCi0gICAgICAgICAgICAvLyBza2lwIGFsbCBlbXB0eSBhcnJheXMKLSAgICAgICAgICAgIGlmIChhcnJheUxlbiA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0b3RhbExlbiArPSBhcnJheUxlbjsKLQotICAgICAgICAgICAgQ2xhc3MgY29tcG9uZW50VHlwZSA9IGFycnNbaV0uZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCk7Ci0gICAgICAgICAgICBjb21tb25Db21wb25lbnRUeXBlID0KLSAgICAgICAgICAgICAgICAoY29tbW9uQ29tcG9uZW50VHlwZSA9PSBudWxsKSA/IGNvbXBvbmVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgOiBjb21tb25DbGFzcyhjb21tb25Db21wb25lbnRUeXBlLCBjb21wb25lbnRUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb21tb25Db21wb25lbnRUeXBlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbmNhdChBcnJheS5uZXdJbnN0YW5jZShjb21tb25Db21wb25lbnRUeXBlLCB0b3RhbExlbiksIHRvdGFsTGVuLCBhcnJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjb25jYXQoT2JqZWN0IHRvQXJyYXksIGludCB0b3RhbExlbiwgT2JqZWN0W10gYXJycykKLSAgICB7Ci0gICAgICAgIGlmICh0b3RhbExlbiA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTaG91bGQgd2UgYWxsb2NhdGUgYW4gZW1wdHkgYXJyYXkgaW5zdGVhZD8KLSAgICAgICAgICAgIHJldHVybiB0b0FycmF5OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRvdGFsTGVuID4gQXJyYXkuZ2V0TGVuZ3RoKHRvQXJyYXkpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0b0FycmF5ID0gQXJyYXkubmV3SW5zdGFuY2UodG9BcnJheS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSwgdG90YWxMZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGludCBsZW47Ci0gICAgICAgIGludCBvZmZzZXQ7Ci0gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IGFycnMubGVuZ3RoLCBvZmZzZXQgPSAwOyBpIDwgbGVuOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCBhcnIgPSBhcnJzW2ldOwotICAgICAgICAgICAgaWYgKGFyciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBhcnJheUxlbiA9IEFycmF5LmdldExlbmd0aChhcnIpOwotICAgICAgICAgICAgICAgIGlmIChhcnJheUxlbiA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFyciwgMCwgdG9BcnJheSwgb2Zmc2V0LCBhcnJheUxlbik7Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBhcnJheUxlbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdG9BcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjb25jYXQoT2JqZWN0IGFycjEsIE9iamVjdCBhcnIyLCBPYmplY3QgYXJyMykKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb25jYXQobmV3IE9iamVjdFtde2FycjEsIGFycjIsIGFycjN9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjb25jYXQoT2JqZWN0IGFycjEsIE9iamVjdCBhcnIyLCBPYmplY3QgYXJyMywgT2JqZWN0IGFycjQpCi0gICAgewotICAgICAgICByZXR1cm4gY29uY2F0KG5ldyBPYmplY3RbXXthcnIxLCBhcnIyLCBhcnIzLCBhcnI0fSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY29uY2F0KE9iamVjdCBhcnIxLCBPYmplY3QgYXJyMiwgT2JqZWN0IGFycjMsIE9iamVjdCBhcnI0LCBPYmplY3QgYXJyNSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb25jYXQobmV3IE9iamVjdFtde2FycjEsIGFycjIsIGFycjMsIGFycjQsIGFycjV9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjb25jYXRTYW1lVHlwZShPYmplY3QgdG9BcnJheSwgT2JqZWN0W10gYXJycykKLSAgICB7Ci0gICAgICAgIGludCB0b3RhbExlbiA9IDA7Ci0gICAgICAgIGludCBpOwotICAgICAgICBpbnQgbGVuOwotICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBhcnJzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYXJyc1tpXSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRvdGFsTGVuICs9IEFycmF5LmdldExlbmd0aChhcnJzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb25jYXQodG9BcnJheSwgdG90YWxMZW4sIGFycnMpOwotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBpZiAoYXJyYXkgPT0gbnVsbCB8fCBhcnJheS5sZW5ndGggPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG8gPSBhcnJheVtpXTsKLSAgICAgICAgICAgIGlmICgobyA9PSBudWxsICYmIHZhbHVlID09IG51bGwpIHx8Ci0gICAgICAgICAgICAgICAgKG8gIT0gbnVsbCAmJiBvLmVxdWFscyh2YWx1ZSkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzIyOTVlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ2xhc3NVdGlscw0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBDbGFzcyBsb2FkQ2xhc3NGb3JOYW1lKFN0cmluZyBuYW1lKQ0KLSAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gVHJ5IFdlYkFwcCBDbGFzc0xvYWRlciBmaXJzdA0KLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKG5hbWUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXANCi0gICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gZmFsbGJhY2s6IFRyeSBDbGFzc0xvYWRlciBmb3IgQ2xhc3NVdGlscyAoaS5lLiB0aGUgbXlmYWNlcy5qYXIgbGliKQ0KLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKG5hbWUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXANCi0gICAgICAgICAgICAgICAgQ2xhc3NVdGlscy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0luc3RhbnRpYXRlQ2xhc3MoQ2xhc3MgdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0YXJnZXRDbGFzcy5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKFN0cmluZyBjbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sDQotICAgICAgICBJbnN0YW50aWF0aW9uRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsb2FkQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xpZW50U2lkZVZhbGlkYXRpb25VdGlscy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0NsaWVudFNpZGVWYWxpZGF0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThiMWJkNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xpZW50U2lkZVZhbGlkYXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGllbnRTaWRlVmFsaWRhdGlvblV0aWxzCi17Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGVTaW1wbGVLZXlWYWx1ZVBhaXIoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJ7XCIiICsga2V5ICsgIlwiIiArICI6XCIiICsgZXNjYXBlVmFsdWUodmFsdWUpICsgIlwifSI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVzY2FwZVZhbHVlKFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIC8vVE9ETwotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0VMVXRpbHMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FTFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YjA2ODQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0VMVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIGluIG9yZGVyIHRvIGNlbnRyYWxpemUgdGhlIGpzZiB2ZXJzaW9uIGRlcGVuZGVuY3kgd2l0aGluIHRoZSBjb3JlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi0vL1RPRE8NCi1wdWJsaWMgY2xhc3MgRUxVdGlscw0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBDbGFzcyBnZXRUeXBlT2ZWYWx1ZUJpbmRpbmdGb3JFeHByZXNzaW9uKA0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIC8vZHVlIHRvIGEgcmVzdHJpY3Rpb24gd2l0aCB0aGUgcmkNCi0gICAgICAgIE9iamVjdCBiZWFuID0gRUxVdGlscy5nZXRWYWx1ZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgICAgICByZXR1cm4gKGJlYW4gIT0gbnVsbCkgPyBiZWFuLmdldENsYXNzKCkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEJlYW4oU3RyaW5nIGJlYW5OYW1lKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgcmV0dXJuIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmdldEVMUmVzb2x2ZXIoKS5nZXRWYWx1ZSgNCi0gICAgICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RUxDb250ZXh0KCksIG51bGwsIGJlYW5OYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICAvL1RPRE8gcmVmYWN0b3IgLSBwcm9ibGVtIC0gc3RhdGljIHZhbHVlcyAtIGpzZiAxLjIgZS5nLjogJHt2YWx1ZX0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QmFzZU9iamVjdChTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmxhc3RJbmRleE9mKCIuIikgPT0gLTEpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHVpQ29tcG9uZW50LmdldFZhbHVlRXhwcmVzc2lvbigidmFsdWUiKS5nZXRWYWx1ZShGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RUxDb250ZXh0KCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGdldEJhc2VPYmplY3QodmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QmFzZU9iamVjdChTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG5ld0V4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLnN1YnN0cmluZygwLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmxhc3RJbmRleE9mKCIuIikpICsgIn0iOw0KLQ0KLSAgICAgICAgcmV0dXJuIGdldFZhbHVlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwNCi0gICAgICAgICAgICBuZXdFeHByZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uICE9IG51bGwpID8gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZXZhbHVhdGVFeHByZXNzaW9uR2V0KGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBPYmplY3QuY2xhc3MpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHByZXNzaW9uVmFsaWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmV2YWx1YXRlRXhwcmVzc2lvbkdldChmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIE9iamVjdC5jbGFzcyk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVsaWFibGVWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKA0KLSAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gZ2V0VmFsdWVCaW5kaW5nRXhwcmVzc2lvbih1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBTdHJpbmcgYmFzZUV4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLSAgICAgICAgaWYgKGJhc2VFeHByZXNzaW9uLmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZUV4cHJlc3Npb24gPSBiYXNlRXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiLiIpKSArICJ9IjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChnZXRUeXBlT2ZWYWx1ZUJpbmRpbmdGb3JFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgYmFzZUV4cHJlc3Npb24pID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IEZhY2VsZXRzVGFnbGliRXhwcmVzc2lvblV0aWxzLg0KLSAgICAgICAgICAgICAgICB0cnlUb0NyZWF0ZVZhbHVlQmluZGluZ0ZvckZhY2VsZXRzQmluZGluZyh1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBWYWx1ZUV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uID0gdWlDb21wb25lbnQNCi0gICAgICAgICAgICAuZ2V0VmFsdWVFeHByZXNzaW9uKCJ2YWx1ZSIpOw0KLQ0KLSAgICAgICAgcmV0dXJuICh2YWx1ZUV4cHJlc3Npb24gIT0gbnVsbCkgPyB2YWx1ZUV4cHJlc3Npb24NCi0gICAgICAgICAgICAuZ2V0RXhwcmVzc2lvblN0cmluZygpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldFR5cGVPZlZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCgNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBWYWx1ZUV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uID0gdWlDb21wb25lbnQNCi0gICAgICAgICAgICAuZ2V0VmFsdWVFeHByZXNzaW9uKCJ2YWx1ZSIpOw0KLQ0KLSAgICAgICAgcmV0dXJuICh2YWx1ZUV4cHJlc3Npb24gIT0gbnVsbCkgPyB2YWx1ZUV4cHJlc3Npb24uZ2V0VHlwZShmYWNlc0NvbnRleHQNCi0gICAgICAgICAgICAuZ2V0RUxDb250ZXh0KCkpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWRlMmFkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkluZm9ybWF0aW9uUHJvdmlkZXJCZWFuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY3RvcnlGaW5kZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlZhbHVlSG9sZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGU7DQotaW1wb3J0IGphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGVGYWN0b3J5Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRXh0VmFsVXRpbHMNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0dHRVIgPSBMb2dGYWN0b3J5LmdldExvZyhFeHRWYWxVdGlscy5jbGFzcyk7DQotDQotICAgIC8vVE9ETyB0ZXN0DQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVWYWx1ZUJpbmRpbmdDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcoDQotICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYgKCEodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICAvL3RvIHN1cHBvcnQgbG9jYWwgY3Jvc3MtdmFsaWRhdGlvbiAod2l0aGluIHRoZSBzYW1lIGVudGl0eSkNCi0gICAgICAgIE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IHZhbHVlQmluZGluZ0NvbnZlcnRlZFZhbHVlTWFwcGluZyA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgLmdldE9ySW5pdFZhbHVlQmluZGluZ0NvbnZlcnRlZFZhbHVlTWFwcGluZygpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IGVudHJ5Ow0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IEVMVXRpbHMNCi0gICAgICAgICAgICAuZ2V0UmVsaWFibGVWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmICh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZW50cnkgPSBuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSgpOw0KLSAgICAgICAgZW50cnkuc2V0QmVhbihFTFV0aWxzLmdldEJhc2VPYmplY3QodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgdWlDb21wb25lbnQpKTsNCi0gICAgICAgIGVudHJ5LnNldENvbnZlcnRlZFZhbHVlKGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICBlbnRyeS5zZXRDb21wb25lbnQodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgLy9mb3IgbG9jYWwgY3Jvc3MtdmFsaWRhdGlvbg0KLSAgICAgICAgaWYgKHZhbHVlQmluZGluZ0NvbnZlcnRlZFZhbHVlTWFwcGluZw0KLSAgICAgICAgICAgIC5jb250YWluc0tleSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKQ0KLSAgICAgICAgICAgICYmICF2YWx1ZUJpbmRpbmdDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcuZ2V0KA0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pLmdldEJlYW4oKS5lcXVhbHMoDQotICAgICAgICAgICAgZW50cnkuZ2V0QmVhbigpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2ZvciB0aGUgdmFsaWRhdGlvbiB3aXRoaW4gYSBjb21wbGV4IGNvbXBvbmVudCBlLmcuIGEgdGFibGUNCi0gICAgICAgICAgICAvL2Rvbid0IG92ZXJyaWRlIGV4aXN0aW5nIGV4cHJlc3Npb24gKHN0eWxlOiAje2VudHJ5LnByb3BlcnR5fSkgLSBtYWtlIGEgc3BlY2lhbCBtYXBwaW5nDQotDQotICAgICAgICAgICAgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBmdXJ0aGVyRW50cmllcyA9IHZhbHVlQmluZGluZ0NvbnZlcnRlZFZhbHVlTWFwcGluZw0KLSAgICAgICAgICAgICAgICAuZ2V0KHZhbHVlQmluZGluZ0V4cHJlc3Npb24pLmdldEZ1cnRoZXJFbnRyaWVzKCk7DQotICAgICAgICAgICAgaWYgKGZ1cnRoZXJFbnRyaWVzID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmdXJ0aGVyRW50cmllcyA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4oKTsNCi0NCi0gICAgICAgICAgICAgICAgdmFsdWVCaW5kaW5nQ29udmVydGVkVmFsdWVNYXBwaW5nLmdldCh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKQ0KLSAgICAgICAgICAgICAgICAgICAgLnNldEZ1cnRoZXJFbnRyaWVzKGZ1cnRoZXJFbnRyaWVzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgZnVydGhlckVudHJpZXMuYWRkKGVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2ZvciBub3JtYWwgdmFsaWRhdGlvbg0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0NvbnZlcnRlZFZhbHVlTWFwcGluZw0KLSAgICAgICAgICAgICAgICAucHV0KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIGVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCYXNlUGFja2FnZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldEJhc2VQYWNrYWdlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBnZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgIHsNCi0gICAgICAgIE1hcCBhcHBsaWNhdGlvbk1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKQ0KLSAgICAgICAgICAgIC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbk1hcCgpOw0KLSAgICAgICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gYmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgYXBwbGljYXRpb25NYXANCi0gICAgICAgICAgICAuZ2V0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSk7DQotDQotICAgICAgICBpZiAoYmVhbiA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBpbml0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oYXBwbGljYXRpb25NYXApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGJlYW47DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gaW5pdEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKA0KLSAgICAgICAgTWFwIGFwcGxpY2F0aW9uTWFwKQ0KLSAgICB7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fQ09OVkVOVElPTl9JTkZPX1BST1ZJREVSX0JFQU4pOw0KLSAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzLmFkZChFeHRWYWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRDdXN0b21JbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZSgpKTsNCi0gICAgICAgIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lcy5hZGQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MNCi0gICAgICAgICAgICAuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuOw0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgIC50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbk1hcC5wdXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FLA0KLSAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW4pOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5jbGFzcy5nZXROYW1lKCkNCi0gICAgICAgICAgICArICIgbm90IGZvdW5kIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q3VzdG9tSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBiZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBFTFV0aWxzDQotICAgICAgICAgICAgLmdldEJlYW4oSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQ1VTVE9NX0JFQU4pOw0KLQ0KLSAgICAgICAgcmV0dXJuIChiZWFuICE9IG51bGwpID8gYmVhbi5nZXRDbGFzcygpLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlcmVnaXN0ZXJQaGFzZUxpc3RlbmVyKFBoYXNlTGlzdGVuZXIgcGhhc2VMaXN0ZW5lcikNCi0gICAgew0KLSAgICAgICAgTGlmZWN5Y2xlRmFjdG9yeSBsaWZlY3ljbGVGYWN0b3J5ID0gKExpZmVjeWNsZUZhY3RvcnkpIEZhY3RvcnlGaW5kZXINCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5RmluZGVyLkxJRkVDWUNMRV9GQUNUT1JZKTsNCi0NCi0gICAgICAgIFN0cmluZyBjdXJyZW50SWQ7DQotICAgICAgICBMaWZlY3ljbGUgY3VycmVudExpZmVjeWNsZTsNCi0gICAgICAgIEl0ZXJhdG9yIGxpZmVjeWNsZUlkcyA9IGxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlSWRzKCk7DQotICAgICAgICB3aGlsZSAobGlmZWN5Y2xlSWRzLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50SWQgPSAoU3RyaW5nKSBsaWZlY3ljbGVJZHMubmV4dCgpOw0KLSAgICAgICAgICAgIGN1cnJlbnRMaWZlY3ljbGUgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZShjdXJyZW50SWQpOw0KLSAgICAgICAgICAgIGN1cnJlbnRMaWZlY3ljbGUucmVtb3ZlUGhhc2VMaXN0ZW5lcihwaGFzZUxpc3RlbmVyKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9CSU5ESU5HX0NPTlZFUlRFRF9WQUxVRV9NQVBQSU5HX0tFWSA9IEV4dFZhbFV0aWxzLmNsYXNzDQotICAgICAgICAuZ2V0TmFtZSgpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGdldE9ySW5pdFZhbHVlQmluZGluZ0NvbnZlcnRlZFZhbHVlTWFwcGluZygpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpDQotICAgICAgICAgICAgLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIGlmICghcmVxdWVzdE1hcC5jb250YWluc0tleShWQUxVRV9CSU5ESU5HX0NPTlZFUlRFRF9WQUxVRV9NQVBQSU5HX0tFWSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+KSByZXF1ZXN0TWFwDQotICAgICAgICAgICAgLmdldChWQUxVRV9CSU5ESU5HX0NPTlZFUlRFRF9WQUxVRV9NQVBQSU5HX0tFWSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkNCi0gICAgICAgICAgICAucHV0KFZBTFVFX0JJTkRJTkdfQ09OVkVSVEVEX1ZBTFVFX01BUFBJTkdfS0VZLA0KLSAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+KCkpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHdvcmthcm91bmQ6IG1hcHBpbmcgY2xpZW50SWQgLT4gcHJveHkgLT4gYWZ0ZXIgcmVzdG9yZSB2aWV3OiBmaW5kIGNvbXBvbmVudCArIHNldCBjb252ZXJ0ZXIgb2YgdGhlIG1hcHBpbmcNCi0gICAgICogVE9ETzogZmluZCBhIGJldHRlciBzb2x1dGlvbiAtIG11bHRpLXdpbmRvdy1tb2RlDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9NQVBQSU5HX0tFWSA9IFZBTFVFX0JJTkRJTkdfQ09OVkVSVEVEX1ZBTFVFX01BUFBJTkdfS0VZDQotICAgICAgICArICI6cHJveHlNYXBwaW5nIjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldE9ySW5pdFByb3h5TWFwcGluZygpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICAvL3Nlc3Npb24gc2NvcGUgaXMganVzdCB0aGUgd29yc3QgY2FzZSAtIGNsZWFudXAgYWZ0ZXIgcmVzdG9yZSB2aWV3DQotICAgICAgICBNYXAgc2Vzc2lvbk1hcCA9IGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRTZXNzaW9uTWFwKCk7DQotDQotICAgICAgICBTdHJpbmcgdmlld0lkID0gZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZ2V0Vmlld0lkKCk7DQotDQotICAgICAgICBpZiAoIXNlc3Npb25NYXAuY29udGFpbnNLZXkoUFJPWFlfTUFQUElOR19LRVkpDQotICAgICAgICAgICAgfHwgISgoTWFwKSBzZXNzaW9uTWFwLmdldChQUk9YWV9NQVBQSU5HX0tFWSkpDQotICAgICAgICAgICAgLmNvbnRhaW5zS2V5KHZpZXdJZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzZXRQcm94eU1hcHBpbmcodmlld0lkKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoTWFwPFN0cmluZywgT2JqZWN0PikgKChNYXApIHNlc3Npb25NYXAuZ2V0KFBST1hZX01BUFBJTkdfS0VZKSkNCi0gICAgICAgICAgICAuZ2V0KHZpZXdJZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0UHJveHlNYXBwaW5nKFN0cmluZyB2aWV3SWQpDQotICAgIHsNCi0gICAgICAgIE1hcCBzZXNzaW9uTWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpDQotICAgICAgICAgICAgLmdldFNlc3Npb25NYXAoKTsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIE9iamVjdD4+IHN0b3JhZ2U7DQotDQotICAgICAgICBpZiAoc2Vzc2lvbk1hcC5jb250YWluc0tleShQUk9YWV9NQVBQSU5HX0tFWSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RvcmFnZSA9IChNYXApIHNlc3Npb25NYXAuZ2V0KFBST1hZX01BUFBJTkdfS0VZKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBPYmplY3Q+PigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtYXA7DQotICAgICAgICBpZiAoIXN0b3JhZ2UuY29udGFpbnNLZXkodmlld0lkKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgICAgICBzdG9yYWdlLnB1dCh2aWV3SWQsIG1hcCk7DQotICAgICAgICB9DQotDQotICAgICAgICBzZXNzaW9uTWFwLnB1dChQUk9YWV9NQVBQSU5HX0tFWSwgc3RvcmFnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU0VEX0NPTlZFUlRFUl9DT1VOVF9LRVkgPSBWQUxVRV9CSU5ESU5HX0NPTlZFUlRFRF9WQUxVRV9NQVBQSU5HX0tFWQ0KLSAgICAgICAgKyAiOnByb2Nlc3NlZENvbnZlcnRlckNvdW50IjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBJbnRlZ2VyIGdldFByb2Nlc3NlZENvbnZlcnRlckNvdW50KCkNCi0gICAgew0KLSAgICAgICAgTWFwIHJlcXVlc3RNYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkNCi0gICAgICAgICAgICAuZ2V0UmVxdWVzdE1hcCgpOw0KLQ0KLSAgICAgICAgaWYgKCFyZXF1ZXN0TWFwLmNvbnRhaW5zS2V5KFBST0NFU1NFRF9DT05WRVJURVJfQ09VTlRfS0VZKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNldFByb2Nlc3NlZENvbnZlcnRlck1hcHBpbmcoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoSW50ZWdlcikgcmVxdWVzdE1hcC5nZXQoUFJPQ0VTU0VEX0NPTlZFUlRFUl9DT1VOVF9LRVkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9jZXNzZWRDb252ZXJ0ZXJDb3VudChJbnRlZ2VyIGNvdW50KQ0KLSAgICB7DQotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKQ0KLSAgICAgICAgICAgIC5nZXRSZXF1ZXN0TWFwKCk7DQotDQotICAgICAgICBpZiAoIXJlcXVlc3RNYXAuY29udGFpbnNLZXkoUFJPQ0VTU0VEX0NPTlZFUlRFUl9DT1VOVF9LRVkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc2V0UHJvY2Vzc2VkQ29udmVydGVyTWFwcGluZygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmVxdWVzdE1hcC5wdXQoUFJPQ0VTU0VEX0NPTlZFUlRFUl9DT1VOVF9LRVksIGNvdW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRQcm9jZXNzZWRDb252ZXJ0ZXJNYXBwaW5nKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKQ0KLSAgICAgICAgICAgIC5wdXQoUFJPQ0VTU0VEX0NPTlZFUlRFUl9DT1VOVF9LRVksIDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbmNyZWFzZVByb2Nlc3NlZENvbnZlcnRlckNvdW50KCkNCi0gICAgew0KLSAgICAgICAgc2V0UHJvY2Vzc2VkQ29udmVydGVyQ291bnQoZ2V0UHJvY2Vzc2VkQ29udmVydGVyQ291bnQoKSArIDEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWNyZWFzZVByb2Nlc3NlZENvbnZlcnRlckNvdW50KCkNCi0gICAgew0KLSAgICAgICAgc2V0UHJvY2Vzc2VkQ29udmVydGVyQ291bnQoZ2V0UHJvY2Vzc2VkQ29udmVydGVyQ291bnQoKSAtIDEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1c2VQcm94eU1hcHBpbmcoKQ0KLSAgICB7DQotDQotICAgICAgICBTdHJpbmcgaW5pdFBhcmFtID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfUFJPWFlfTUFQUElORzsNCi0gICAgICAgIGJvb2xlYW4gZGlzYWJsZVByb3h5TWFwcGluZyA9IChpbml0UGFyYW0gIT0gbnVsbCAmJiBpbml0UGFyYW0udHJpbSgpDQotICAgICAgICAgICAgLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSk7DQotDQotICAgICAgICByZXR1cm4gISh1c2VGYWxsYmFja0FkYXB0ZXJzKCkgfHwgZGlzYWJsZVByb3h5TWFwcGluZyk7DQotICAgIH0NCi0NCi0gICAgQERlcHJlY2F0ZWQNCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHVzZUZhbGxiYWNrQWRhcHRlcnMoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgaW5pdFBhcmFtID0gV2ViWG1sUGFyYW1ldGVyLlVTRV9BREFQVEVSUzsNCi0gICAgICAgIHJldHVybiAoaW5pdFBhcmFtICE9IG51bGwgJiYgaW5pdFBhcmFtLnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXN0b3JlUHJveGllcygpDQotICAgIHsNCi0gICAgICAgIFVJVmlld1Jvb3Qgdmlld1Jvb3QgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKTsNCi0NCi0gICAgICAgIGlmICh2aWV3Um9vdCAhPSBudWxsICYmIEV4dFZhbFV0aWxzLnVzZVByb3h5TWFwcGluZygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIE1hcCBjb21wb25lbnRDb252ZXJ0ZXJNYXBwaW5nID0gRXh0VmFsVXRpbHMuZ2V0T3JJbml0UHJveHlNYXBwaW5nKCk7DQotDQotICAgICAgICAgICAgSXRlcmF0b3IgY3VycmVudCA9IGNvbXBvbmVudENvbnZlcnRlck1hcHBpbmcua2V5U2V0KCkuaXRlcmF0b3IoKTsNCi0gICAgICAgICAgICBTdHJpbmcga2V5Ow0KLSAgICAgICAgICAgIENvbnZlcnRlciBjb252ZXJ0ZXI7DQotICAgICAgICAgICAgQ29udmVydGVyIGNvbnZlcnRlck9mQ29tcG9uZW50Ow0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7DQotICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQuaGFzTmV4dCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAga2V5ID0gKFN0cmluZykgY3VycmVudC5uZXh0KCk7DQotICAgICAgICAgICAgICAgIGNvbnZlcnRlciA9IChDb252ZXJ0ZXIpIGNvbXBvbmVudENvbnZlcnRlck1hcHBpbmcuZ2V0KGtleSk7DQotDQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSB2aWV3Um9vdC5maW5kQ29tcG9uZW50KGtleSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSByaSBidWcgd2l0aCBjb21wbGV4IGNvbXBvbmVudHMgLSANCi0gICAgICAgICAgICAgICAgICAgIC8vcmVzb2x2ZUNvbXBvbmVudEluQ29tcGxleENvbXBvbmVudCB3aWxsIHJldHVybiB0aGUgY29ycmVjdCBjb21wb25lbnQNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50ID09IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IHJlc29sdmVDb21wb25lbnRJbkNvbXBsZXhDb21wb25lbnQodmlld1Jvb3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LCBrZXkpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmICghKGNvbXBvbmVudCBpbnN0YW5jZW9mIFZhbHVlSG9sZGVyKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgY29udmVydGVyT2ZDb21wb25lbnQgPSAoKFZhbHVlSG9sZGVyKSBjb21wb25lbnQpLmdldENvbnZlcnRlcigpOw0KLQ0KLSAgICAgICAgICAgICAgICAvL2NvbnZlcnRlck9mQ29tcG9uZW50IGxvc3QgY2FsbGJhY2sgZHVyaW5nIHN0YXRlLXNhdmluZyAtPiBzZXQgY29udmVydGVyIG9mIHNhbWUgdHlwZQ0KLSAgICAgICAgICAgICAgICBpZiAoY29udmVydGVyT2ZDb21wb25lbnQgIT0gbnVsbA0KLSAgICAgICAgICAgICAgICAgICAgJiYgY29udmVydGVyT2ZDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXRTdXBlcmNsYXNzKCkNCi0gICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoY29udmVydGVyLmdldENsYXNzKCkuZ2V0U3VwZXJjbGFzcygpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgKChWYWx1ZUhvbGRlcikgY29tcG9uZW50KS5zZXRDb252ZXJ0ZXIoY29udmVydGVyKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChFeHRWYWxVdGlscy51c2VQcm94eU1hcHBpbmcoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5yZXNldFByb3h5TWFwcGluZyhGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkNCi0gICAgICAgICAgICAgICAgLmdldFZpZXdSb290KCkuZ2V0Vmlld0lkKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8vVE9ETw0KLSAgICBwcml2YXRlIHN0YXRpYyBVSUNvbXBvbmVudCByZXNvbHZlQ29tcG9uZW50SW5Db21wbGV4Q29tcG9uZW50KA0KLSAgICAgICAgVUlDb21wb25lbnQgdmlld1Jvb3QsIFVJQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgaW50IGluZGV4ID0ga2V5Lmxhc3RJbmRleE9mKCI6Iik7DQotDQotICAgICAgICBpZiAoaW5kZXggPT0gLTEpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgbmV3S2V5ID0ga2V5LnN1YnN0cmluZygwLCBpbmRleCk7DQotICAgICAgICBpZiAodmlld1Jvb3QuZmluZENvbXBvbmVudChuZXdLZXkpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW50IG5ld0luZGV4ID0gbmV3S2V5Lmxhc3RJbmRleE9mKCI6Iik7DQotICAgICAgICAgICAgaWYgKG5ld0luZGV4IDwgMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBuZXdLZXkgPSBuZXdLZXkuc3Vic3RyaW5nKDAsIG5ld0luZGV4KTsNCi0NCi0gICAgICAgICAgICBjb21wb25lbnQgPSB2aWV3Um9vdC5maW5kQ29tcG9uZW50KG5ld0tleSk7DQotDQotICAgICAgICAgICAgaWYgKGNvbXBvbmVudCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnlUb1Jlc29sdmVDaGlsZENvbXBvbmVudChjb21wb25lbnQsIGtleS5zdWJzdHJpbmcoa2V5DQotICAgICAgICAgICAgICAgICAgICAubGFzdEluZGV4T2YoIjoiKSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8vVE9ETw0KLSAgICBwcml2YXRlIHN0YXRpYyBVSUNvbXBvbmVudCB0cnlUb1Jlc29sdmVDaGlsZENvbXBvbmVudCgNCi0gICAgICAgIFVJQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIGVuZE9mS2V5KQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgU3RyaW5nIGNsaWVudElkID0gY29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBpZiAoY2xpZW50SWQuY29udGFpbnMoIjoiKSAmJiBjbGllbnRJZC5zdWJzdHJpbmcoY2xpZW50SWQubGFzdEluZGV4T2YoIjoiKSkuZW5kc1dpdGgoZW5kT2ZLZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQ7DQotICAgICAgICB9DQotDQotICAgICAgICBVSUNvbXBvbmVudCBmb3VuZENvbXBvbmVudDsNCi0gICAgICAgIGZvciAoVUlDb21wb25lbnQgY2hpbGQgOiAoTGlzdDxVSUNvbXBvbmVudD4pIGNvbXBvbmVudC5nZXRDaGlsZHJlbigpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvdW5kQ29tcG9uZW50ID0gdHJ5VG9SZXNvbHZlQ2hpbGRDb21wb25lbnQoY2hpbGQsIGVuZE9mS2V5KTsNCi0NCi0gICAgICAgICAgICBpZiAoZm91bmRDb21wb25lbnQgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZENvbXBvbmVudDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUklHSU5BTF9BUFBMSUNBVElPTl9LRVkgPSBWQUxVRV9CSU5ESU5HX0NPTlZFUlRFRF9WQUxVRV9NQVBQSU5HX0tFWQ0KLSAgICAgICAgKyAiOndyYXBwZWRfYXBwbGljYXRpb24iOw0KLQ0KLSAgICAvL2luIG9yZGVyIHRvIGFjY2VzcyB0aGUgd3JhcHBlZCBhcHBsaWNhdGlvbiBhbmQgc3VwcG9ydCBvdGhlciBBcHBsaWNhdGlvbiB3cmFwcGVycw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3JpZ2luYWxBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIE1hcCBhcHBsaWNhdGlvbk1hcCA9IGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKQ0KLSAgICAgICAgICAgIC5nZXRBcHBsaWNhdGlvbk1hcCgpOw0KLQ0KLSAgICAgICAgaWYgKCFhcHBsaWNhdGlvbk1hcC5jb250YWluc0tleShPUklHSU5BTF9BUFBMSUNBVElPTl9LRVkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoRXh0VmFsVXRpbHMuY2xhc3MpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbk1hcC5wdXQoT1JJR0lOQUxfQVBQTElDQVRJT05fS0VZLCBhcHBsaWNhdGlvbik7DQotDQotICAgICAgICAgICAgICAgIGlmIChMT0dHRVIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgTE9HR0VSLnRyYWNlKCJ0aGUgb3JpZ2luYWwgYXBwbGljYXRpb24gaXMgIiArIGFwcGxpY2F0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEFwcGxpY2F0aW9uIGdldE9yaWdpbmFsQXBwbGljYXRpb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEFwcGxpY2F0aW9uKSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkNCi0gICAgICAgICAgICAuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25NYXAoKS5nZXQoDQotICAgICAgICAgICAgT1JJR0lOQUxfQVBQTElDQVRJT05fS0VZKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENvbnZlcnRlciB0cnlUb0NyZWF0ZU9yaWdpbmFsQ29udmVydGVyKA0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIC8vZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IGNyb3NzLXZhbGlkYXRpb24gd29ya2Fyb3VuZCB3aXRoIGhpZGRlbiBmaWVsZCBhbmQgc3RhdGljIHZhbHVlDQotICAgICAgICBDbGFzcyB2YWx1ZUJpbmRpbmdUeXBlID0gRUxVdGlscy5nZXRUeXBlT2ZWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQoDQotICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBpZiAodmFsdWVCaW5kaW5nVHlwZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGdldE9yaWdpbmFsQXBwbGljYXRpb24oKS5jcmVhdGVDb252ZXJ0ZXIodmFsdWVCaW5kaW5nVHlwZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0ZhY2VsZXRzVGFnbGliRXhwcmVzc2lvblV0aWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U5ZDY4NS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7DQotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3Q7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5Ow0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRyeVRvQ3JlYXRlVmFsdWVCaW5kaW5nRm9yRmFjZWxldHNCaW5kaW5nKA0KLSAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBFTFV0aWxzDQotICAgICAgICAgICAgLmdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24odWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGZvdW5kQmluZGluZ3MgPSBleHRyYWN0RUxUZXJtcyh1aUNvbXBvbmVudA0KLSAgICAgICAgICAgICAgICAuZ2V0VmFsdWVFeHByZXNzaW9uKCJ2YWx1ZSIpKTsNCi0NCi0gICAgICAgICAgICByZXR1cm4gZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLnN1YnN0cmluZygwLCAxKSArICJ7Ig0KLSAgICAgICAgICAgICAgICArIGNyZWF0ZUJpbmRpbmcoZm91bmRCaW5kaW5ncykgKyAifSI7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhY2VsZXRzVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3JlYXRlQmluZGluZyhMaXN0PFN0cmluZz4gZXhwcmVzc2lvbnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0NCi0gICAgICAgIFN0cmluZyBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50QmluZGluZzsNCi0gICAgICAgIFN0cmluZyBwYXJ0T2ZCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGVudHJ5IDogZXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoIlZhbHVlRXhwcmVzc2lvblsiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvL1RPRE8gbG9nIGVudHJ5DQotDQotICAgICAgICAgICAgZm91bmRCaW5kaW5nRGV0YWlscyA9IGVudHJ5LnNwbGl0KCIgIik7DQotICAgICAgICAgICAgaW5kZXhPZkJpbmRpbmdEZXRhaWxzID0gZmluZEluZGV4T2ZCaW5kaW5nRGV0YWlscyhmb3VuZEJpbmRpbmdEZXRhaWxzKTsNCi0gICAgICAgICAgICBpZiAoaW5kZXhPZkJpbmRpbmdEZXRhaWxzID09IC0xKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGJpbmRpbmdEZXRhaWxzID0gZm91bmRCaW5kaW5nRGV0YWlsc1tpbmRleE9mQmluZGluZ0RldGFpbHNdDQotICAgICAgICAgICAgICAgIC5zcGxpdCgiPSIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nRGV0YWlscy5sZW5ndGggPCAyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYmluZGluZ0RldGFpbHNbMV07DQotICAgICAgICAgICAgaWYgKHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHBhcnRPZkJpbmRpbmcgPSBjdXJyZW50QmluZGluZy5zdWJzdHJpbmcoY3VycmVudEJpbmRpbmcNCi0gICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUpDQotICAgICAgICAgICAgICAgICAgICArIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUubGVuZ3RoKCksIGN1cnJlbnRCaW5kaW5nDQotICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZigifSIpKTsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgcGFydE9mQmluZGluZzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gY3VycmVudEJpbmRpbmcuc3Vic3RyaW5nKA0KLSAgICAgICAgICAgICAgICAgICAgY3VycmVudEJpbmRpbmcuaW5kZXhPZigieyIpICsgMSwgY3VycmVudEJpbmRpbmcNCi0gICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKCJ9IikpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gYmluZGluZ0RldGFpbHNbMF07DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBpbnQgY291bnQgPSAwOw0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBiaW5kaW5nRGV0YWlscykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuY29udGFpbnMoIj0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY291bnQrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZXh0cmFjdEVMVGVybXMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlRUxUZXJtcyhvLCBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKSwgZm91bmRFTFRlcm1zLA0KLSAgICAgICAgICAgICAgICAwKSA+IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRFTFRlcm1zOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcmVzb2x2ZUVMVGVybXMoT2JqZWN0IG8sIE1hcDxPYmplY3QsIE9iamVjdD4gdmlzaXRlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMsIGludCBjb3VudCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAobyA9PSBudWxsIHx8IHZpc2l0ZWQuY29udGFpbnNLZXkobykgfHwgY291bnQgPiA1MCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZpc2l0ZWQucHV0KG8sIG51bGwpOw0KLQ0KLSAgICAgICAgaW50IGVsQ291bnQgPSAwOw0KLSAgICAgICAgQ2xhc3MgYyA9IG8uZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIC8vaW5zcGVjdCBtYXBzDQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1hcCkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBmb3IgKE9iamVjdCBlbnRyeSA6ICgoTWFwKSBvKS52YWx1ZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoZW50cnksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywNCi0gICAgICAgICAgICAgICAgICAgIGNvdW50ICsgMSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGlzRUxUZXJtKG8pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChmb3VuZEVMVGVybXMgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZvdW5kRUxUZXJtcy5hZGQoby50b1N0cmluZygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuICsrZWxDb3VudDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vYW5hbHl6ZSBhcnJheXMNCi0gICAgICAgIGlmIChjLmlzQXJyYXkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKG8pOw0KLSAgICAgICAgICAgIC8vY2hlY2sgYXJyYXkgW0wgLT4gbm8gYXJyYXkgb2YgcHJpbWl0aXZlIHR5cGVzDQotICAgICAgICAgICAgaWYgKG8udG9TdHJpbmcoKS5zdGFydHNXaXRoKCJbTCIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG8udG9TdHJpbmcoKS5zdGFydHNXaXRoKCJbTGphdmEubGFuZy5TdHJpbmciKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNFTFRlcm0oQXJyYXkuZ2V0KG8sIGkpKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZEVMVGVybXMgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsQ291bnQrKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZWxDb3VudCArPSByZXNvbHZlRUxUZXJtcyhBcnJheS5nZXQobywgaSksIHZpc2l0ZWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gZWxDb3VudDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8RmllbGQ+IGF0dHJpYnV0ZXMgPSBmaW5kQWxsQXR0cmlidXRlcyhjLCBuZXcgQXJyYXlMaXN0PEZpZWxkPigpKTsNCi0gICAgICAgIEZpZWxkW10gZmllbGRzID0gKEZpZWxkW10pIGF0dHJpYnV0ZXMudG9BcnJheShuZXcgRmllbGRbYXR0cmlidXRlcw0KLSAgICAgICAgICAgIC5zaXplKCldKTsNCi0NCi0gICAgICAgIEFjY2Vzc2libGVPYmplY3Quc2V0QWNjZXNzaWJsZShmaWVsZHMsIHRydWUpOw0KLSAgICAgICAgZm9yIChGaWVsZCBjdXJyZW50RmllbGQgOiBmaWVsZHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5nZXQobykgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmdldFR5cGUoKS5lcXVhbHMoU3RyaW5nLmNsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQuZ2V0KG8pICE9IG51bGwNCi0gICAgICAgICAgICAgICAgICAgICYmIGlzRUxUZXJtKGN1cnJlbnRGaWVsZC5nZXQobykpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFjdXJyZW50RmllbGQuZ2V0VHlwZSgpLmlzUHJpbWl0aXZlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKGN1cnJlbnRGaWVsZC5nZXQobyksIHZpc2l0ZWQsDQotICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMsIGNvdW50ICsgMSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGVsQ291bnQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0VMVGVybShPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBWYWx1ZUJpbmRpbmcgfHwgbyBpbnN0YW5jZW9mIEV4dGVybmFsaXphYmxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBzID0gby50b1N0cmluZygpOw0KLSAgICAgICAgcmV0dXJuICgocy5jb250YWlucygiIyIpIHx8IHMuY29udGFpbnMoIiQiKSkgJiYgcy5jb250YWlucygieyIpICYmIHMNCi0gICAgICAgICAgICAuY29udGFpbnMoIn0iKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxGaWVsZD4gZmluZEFsbEF0dHJpYnV0ZXMoQ2xhc3MgYywgTGlzdDxGaWVsZD4gYXR0cmlidXRlcykNCi0gICAgew0KLSAgICAgICAgaWYgKGMgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlczsNCi0gICAgICAgIH0NCi0gICAgICAgIGZpbmRBbGxBdHRyaWJ1dGVzKGMuZ2V0U3VwZXJjbGFzcygpLCBhdHRyaWJ1dGVzKTsNCi0NCi0gICAgICAgIEZpZWxkW10gZmllbGRzID0gYy5nZXREZWNsYXJlZEZpZWxkcygpOw0KLSAgICAgICAgZm9yIChGaWVsZCBjdXJyZW50RmllbGQgOiBmaWVsZHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCFNb2RpZmllci5pc1N0YXRpYyhjdXJyZW50RmllbGQuZ2V0TW9kaWZpZXJzKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQoY3VycmVudEZpZWxkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gYXR0cmlidXRlczsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRmFjdG9yeVV0aWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRmFjdG9yeVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZDBiYTMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0ZhY3RvcnlVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmFkYXB0ZXIuRGVmYXVsdENvbnZlcnRlckFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hbm5vdGF0aW9uLmV4dHJhY3Rvci5Bbm5vdGF0aW9uRXh0cmFjdG9yRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYW5ub3RhdGlvbi5leHRyYWN0b3IuRGVmYXVsdEFubm90YXRpb25FeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlcjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotLy9UT0RPDQotcHVibGljIGNsYXNzIEZhY3RvcnlVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnkgYW5ub3RhdGlvbkV4dHJhY3RvckZhY3Rvcnk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnkgZ2V0QW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gYW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICAgICAgYW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9BTk5PVEFUSU9OX0VYVFJBQ1RPUl9GQUNUT1JZKTsNCi0gICAgICAgICAgICBhbm5vdGF0aW9uRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMuYWRkKEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXRDdXN0b21Bbm5vdGF0aW9uRXh0cmFjdG9yRmFjdG9yeSgpKTsNCi0gICAgICAgICAgICBhbm5vdGF0aW9uRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAgICAgLmFkZChEZWZhdWx0QW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBhbm5vdGF0aW9uRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRXh0cmFjdG9yRmFjdG9yeSA9IChBbm5vdGF0aW9uRXh0cmFjdG9yRmFjdG9yeSkgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb25FeHRyYWN0b3JGYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vVE9ETyBsb2dnaW5nDQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uRXh0cmFjdG9yRmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzc01hcHBpbmdGYWN0b3J5PEFubm90YXRpb24sIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBDbGFzc01hcHBpbmdGYWN0b3J5PEFubm90YXRpb24sIFZhbGlkYXRpb25TdHJhdGVneT4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSk7DQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMuYWRkKEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXRDdXN0b21WYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KCkpOw0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgICAgIC5hZGQoRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkgPSAoQ2xhc3NNYXBwaW5nRmFjdG9yeTxBbm5vdGF0aW9uLCBWYWxpZGF0aW9uU3RyYXRlZ3k+KSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL1RPRE8gbG9nZ2luZw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWVzc2FnZVJlc29sdmVyPiBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Ow0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXNzYWdlUmVzb2x2ZXI+IGdldE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZiAobWVzc2FnZVJlc29sdmVyRmFjdG9yeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkpOw0KLSAgICAgICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzLmFkZChFeHRWYWxVdGlscw0KLSAgICAgICAgICAgICAgICAuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0Q3VzdG9tTWVzc2FnZVJlc29sdmVyRmFjdG9yeSgpKTsNCi0gICAgICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKERlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5ID0gKENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXNzYWdlUmVzb2x2ZXI+KSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAobWVzc2FnZVJlc29sdmVyRmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL1RPRE8gbG9nZ2luZw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWVzc2FnZVJlc29sdmVyRmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzc01hcHBpbmdGYWN0b3J5PENvbnZlcnRlciwgQ29udmVydGVyPiBjb252ZXJ0ZXJBZGFwdGVyRmFjdG9yeTsNCi0NCi0gICAgQERlcHJlY2F0ZWQNCi0gICAgcHVibGljIHN0YXRpYyBDbGFzc01hcHBpbmdGYWN0b3J5PENvbnZlcnRlciwgQ29udmVydGVyPiBnZXRDb252ZXJ0ZXJBZGFwdGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmIChjb252ZXJ0ZXJBZGFwdGVyRmFjdG9yeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBjb252ZXJ0ZXJBZGFwdGVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgICAgICBjb252ZXJ0ZXJBZGFwdGVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTlZFUlRFUl9BREFQVEVSX0ZBQ1RPUlkpOw0KLSAgICAgICAgICAgIGNvbnZlcnRlckFkYXB0ZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgLmdldEN1c3RvbUNvbnZlcnRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KLSAgICAgICAgICAgIGNvbnZlcnRlckFkYXB0ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKERlZmF1bHRDb252ZXJ0ZXJBZGFwdGVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IGNvbnZlcnRlckFkYXB0ZXJGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnZlcnRlckFkYXB0ZXJGYWN0b3J5ID0gKENsYXNzTWFwcGluZ0ZhY3Rvcnk8Q29udmVydGVyLCBDb252ZXJ0ZXI+KSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoY29udmVydGVyQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgLy9UT0RPIGxvZ2dpbmcNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlckFkYXB0ZXJGYWN0b3J5Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9WYWxpZGF0aW9uVXRpbHMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9WYWxpZGF0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ2ZTM2Ni4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvVmFsaWRhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmFubm90YXRpb24uQW5ub3RhdGlvbkVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmFubm90YXRpb24uZXh0cmFjdG9yLkFubm90YXRpb25FeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uVXRpbHMKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HR0VSID0gTG9nRmFjdG9yeS5nZXRMb2coVmFsaWRhdGlvblV0aWxzLmNsYXNzKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcm9jZXNzRXh0VmFsVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkKLSAgICB7Ci0gICAgICAgIGlmICghKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7Ci0KLSAgICAgICAgQW5ub3RhdGlvbkV4dHJhY3RvciBhbm5vdGF0aW9uRXh0cmFjdG9yID0gRmFjdG9yeVV0aWxzCi0gICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnkoKS5jcmVhdGUoKTsKLSAgICAgICAgZm9yIChBbm5vdGF0aW9uRW50cnkgZW50cnkgOiBhbm5vdGF0aW9uRXh0cmFjdG9yCi0gICAgICAgICAgICAuZXh0cmFjdEFubm90YXRpb25zKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBGYWN0b3J5VXRpbHMKLSAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpLmNyZWF0ZSgKLSAgICAgICAgICAgICAgICBlbnRyeS5nZXRBbm5vdGF0aW9uKCkpOwotCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExPR0dFUi50cmFjZSgibm8gdmFsaWRhdGlvbiBzdHJhdGVneSBmb3VuZCBmb3IgIgotICAgICAgICAgICAgICAgICAgICArIGVudHJ5LmdldEFubm90YXRpb24oKS5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvV2ViWG1sVXRpbHMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2I0MzI1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIFdlYlhtbFV0aWxzDQotew0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKQ0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKA0KLSAgICAgICAgICAgICAgICBFeHRWYWxJbmZvcm1hdGlvbi5XRUJYTUxfUEFSQU1fUFJFRklYICsgIi4iICsga2V5KTsNCi0gICAgICAgIC8vVE9ETw0KLSAgICAgICAgcmV0dXJuICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlLnJlcGxhY2UoIiAiLCAiIikudHJpbSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9wb20ueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWYxOTVhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZhbGxiYWNrX2RlbW8vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmFsbGJhY2tfZGVtbzwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBkZW1vIHdpdGhvdXQgY2dsaWI8L25hbWU+DQotICAgIDx2ZXJzaW9uPiR7YnVpbGQudmVyc2lvbn08L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+JHtidWlsZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2J1aWxkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2J1aWxkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uZmFjZWxldHM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWZhY2VsZXRzPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xNDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudG9tYWhhd2s8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dG9tYWhhd2s8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjY8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZhbGxiYWNrX2RlbW8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvY3VzdG9tX21zZy5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9jdXN0b21fbXNnLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YjMwODMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9jdXN0b21fbXNnLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgdGhpcyBtZXNzYWdlIGJ1bmRsZSBpcyBjb25maWd1cmVkIHZpYSB3ZWIueG1sIG9yIG1hbmFnZWQgYmVhbg0KLWZpZWxkX3JlcXVpcmVkPW1pc3NpbmcgaW5wdXQNCi1maWVsZF9yZXF1aXJlZF9kZXRhaWxzPW1pc3NpbmcgaW5wdXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2N1c3RvbS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2N1c3RvbS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NTE5MWEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jdXN0b20vdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1yZXBlYXRlZF9wYXNzd29yZF9yZXF1cmllZD1wbGVhc2UgcmV0eXBlIHRoZSBwYXNzd29yZA0KLXJlcGVhdGVkX3Bhc3N3b3JkX3JlcXVyaWVkX2RldGFpbHM9cGxlYXNlIHJldHlwZSB0aGUgcGFzc3dvcmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2RvbWFpbi9QZXJzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I0Y2EzOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRGF0ZUlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXNUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5Ob3RFcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlZ2V4Ow0KLQ0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlRlbXBvcmFsOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbFR5cGU7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLXB1YmxpYyBjbGFzcyBQZXJzb24NCi17DQotICAgIEBMZW5ndGgobWluaW11bSA9IDIpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMjApDQotICAgIEBOb3RFcXVhbHMoImxhc3ROYW1lIikNCi0gICAgQFJlZ2V4KCJbQS1aXVthLXpdKyIpDQotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsNCi0NCi0gICAgQExlbmd0aChtaW5pbXVtID0gMikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAyMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7DQotDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOw0KLQ0KLSAgICBARGF0ZUlzKHR5cGUgPSBEYXRlSXNUeXBlLmJlZm9yZSwgdmFsdWVPZiA9ICJmaW5hbEV4YW0iKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIEBUZW1wb3JhbChUZW1wb3JhbFR5cGUuREFURSkNCi0gICAgcHJpdmF0ZSBEYXRlIGJpcnRoZGF5Ow0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIEBUZW1wb3JhbChUZW1wb3JhbFR5cGUuREFURSkNCi0gICAgcHJpdmF0ZSBEYXRlIGZpbmFsRXhhbTsNCi0NCi0gICAgQExlbmd0aChtaW5pbXVtID0gMikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmlja05hbWU7DQotDQotICAgIEBMZW5ndGgobWluaW11bSA9IDYpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gNjApDQotICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIHByaXZhdGUgaW50IG51bWJlck9mU2libGluZ3M7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldEJpcnRoZGF5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGJpcnRoZGF5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEJpcnRoZGF5KERhdGUgYmlydGhkYXkpDQotICAgIHsNCi0gICAgICAgIHRoaXMuYmlydGhkYXkgPSBiaXJ0aGRheTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXRGaW5hbEV4YW0oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmluYWxFeGFtOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEZpbmFsRXhhbShEYXRlIGZpbmFsRXhhbSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maW5hbEV4YW0gPSBmaW5hbEV4YW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROaWNrTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuaWNrTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROaWNrTmFtZShTdHJpbmcgbmlja05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmlja05hbWUgPSBuaWNrTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVtYWlsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKFN0cmluZyBlbWFpbCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5lbWFpbCA9IGVtYWlsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZTaWJsaW5ncygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBudW1iZXJPZlNpYmxpbmdzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlck9mU2libGluZ3MoaW50IG51bWJlck9mU2libGluZ3MpDQotICAgIHsNCi0gICAgICAgIHRoaXMubnVtYmVyT2ZTaWJsaW5ncyA9IG51bWJlck9mU2libGluZ3M7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE3MTYyMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5ndWkuYmVhbnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uTm90RXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxvbmdSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5jdXN0b20uZW1haWx2YWxpZGF0b3IuRW1haWxWYWxpZGF0b3I7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvblBhZ2UNCi17DQotDQotICAgIC8vdGhlIG9sZCBwYXNzd29yZCBvZiB0aGUgcGVyc29uIGlzbid0IHVzZWQgd2l0aGluIHRoZSBwYWdlDQotICAgIC8vLT4gdmFsaWRhdGUgd2l0aCB2YWx1ZSBvZiB0aGUgbW9kZWwNCi0gICAgQFJlcXVpcmVkDQotICAgIEBFcXVhbHMoIiN7cGVyc29uLnBhc3N3b3JkfSIpDQotICAgIEBOb3RFcXVhbHMoInBhc3N3b3JkIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgb2xkUGFzc3dvcmQ7DQotDQotICAgIEBSZXF1aXJlZA0KLSAgICBARXF1YWxzKCJwYXNzd29yZFJlcGVhdGVkIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7DQotDQotICAgIEBSZXF1aXJlZCh2YWxpZGF0aW9uRXJyb3JNc2dLZXkgPSAicmVwZWF0ZWRfcGFzc3dvcmRfcmVxdXJpZWQiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZFJlcGVhdGVkOw0KLQ0KLSAgICAvL3VzZSAje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLm5pY2tOYW1lfSwgI3twZXJzb24ubmlja05hbWV9DQotICAgIC8vb3IgYSBnbG9iYWwgYWxpYXMgaW4gY29ubmVjdGlvbiB3aXRoIHRoZSBUYXJnZXRBbGlhcyBhbm5vdGF0aW9uDQotICAgIC8vdXNlIHJlZ2lzdHJhdGlvblBhZ2UgdG8gZGlzcGxheSB0aGUgc2Vjb25kIGVycm9yIG1lc3NhZ2UgYXQgb2xkIG5pY2tuYW1lDQotICAgIEBOb3RFcXVhbHMoIiN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ubmlja05hbWV9IikNCi0gICAgQEpvaW5WYWxpZGF0aW9uKCIje3BlcnNvbi5uaWNrTmFtZX0iKQ0KLSAgICBwcml2YXRlIFN0cmluZyBuZXdOaWNrTmFtZTsNCi0NCi0gICAgcHJpdmF0ZSBQZXJzb24gcGVyc29uOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGZpbmlzaCgpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldFBhc3N3b3JkKHRoaXMucGFzc3dvcmQpOw0KLSAgICAgICAgcmV0dXJuICJob21lIjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHVwZGF0ZU5pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0Tmlja05hbWUodGhpcy5uZXdOaWNrTmFtZSk7DQotICAgICAgICByZXR1cm4gImhvbWUiOw0KLSAgICB9DQotDQotICAgIC8vY29tYmluZSBndWkgcmVsYXRlZCBhbm5vdGF0aW9ucyB3aXRoIHRoZSBhbm5vYXRpb25zIG9mIHRoZSBkb21haW4gbW9kZWwNCi0gICAgQEpvaW5WYWxpZGF0aW9uKCIje3BlcnNvbi5lbWFpbH0iKQ0KLSAgICBAVmFsaWRhdG9yKEVtYWlsVmFsaWRhdG9yLmNsYXNzKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uLmdldEVtYWlsKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXRFbWFpbChlbWFpbCk7DQotICAgIH0NCi0NCi0gICAgQEpvaW5WYWxpZGF0aW9uKCIje3BlcnNvbi5udW1iZXJPZlNpYmxpbmdzfSIpDQotICAgIEBMb25nUmFuZ2UobWF4aW11bSA9IDIwKQ0KLSAgICBwdWJsaWMgaW50IGdldE51bWJlck9mU2libGluZ3MoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5wZXJzb24uZ2V0TnVtYmVyT2ZTaWJsaW5ncygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlck9mU2libGluZ3MoaW50IG51bWJlck9mU2libGluZ3MpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldE51bWJlck9mU2libGluZ3MobnVtYmVyT2ZTaWJsaW5ncyk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9sZFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG9sZFBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE9sZFBhc3N3b3JkKFN0cmluZyBvbGRQYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5vbGRQYXNzd29yZCA9IG9sZFBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZFJlcGVhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkUmVwZWF0ZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRSZXBlYXRlZChTdHJpbmcgcGFzc3dvcmRSZXBlYXRlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZFJlcGVhdGVkID0gcGFzc3dvcmRSZXBlYXRlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwZXJzb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbiBwZXJzb24pDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uID0gcGVyc29uOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmV3Tmlja05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3Tmlja05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TmV3Tmlja05hbWUoU3RyaW5nIG5ld05pY2tOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm5ld05pY2tOYW1lID0gbmV3Tmlja05hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy90cmluaWRhZC9jb252ZXJ0L0NvbG9yQ29udmVydGVyQWRhcHRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy90cmluaWRhZC9jb252ZXJ0L0NvbG9yQ29udmVydGVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjFlMWMzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZhbGxiYWNrX2RlbW8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvdHJpbmlkYWQvY29udmVydC9Db2xvckNvbnZlcnRlckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb252ZXJ0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hZGFwdGVyLkV4dFZhbEZhbGxiYWNrQ29udmVydGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247DQotDQotLypnZW5lcmF0ZWQgY29kZSAtIGRvbid0IGNoYW5nZSEqLw0KLXB1YmxpYyBjbGFzcyBDb2xvckNvbnZlcnRlckFkYXB0ZXIgZXh0ZW5kcw0KLSAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbnZlcnQuQ29sb3JDb252ZXJ0ZXINCi17DQotICAgIHByaXZhdGUgQ29udmVydGVyIHNtYXJ0Q29udmVydGVyOw0KLQ0KLSAgICBwdWJsaWMgQ29sb3JDb252ZXJ0ZXJBZGFwdGVyKCkNCi0gICAgew0KLSAgICAgICAgdGhpcyhuZXcgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbnZlcnQuQ29sb3JDb252ZXJ0ZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvbG9yQ29udmVydGVyQWRhcHRlcihDb252ZXJ0ZXIgY29udmVydGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnNtYXJ0Q29udmVydGVyID0gbmV3IEV4dFZhbEZhbGxiYWNrQ29udmVydGVyKGNvbnZlcnRlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRBc09iamVjdChGYWNlc0NvbnRleHQgY29udGV4dCwgVUlDb21wb25lbnQgY29tcG9uZW50LA0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSkgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5zbWFydENvbnZlcnRlci5nZXRBc09iamVjdChjb250ZXh0LCBjb21wb25lbnQsIHZhbHVlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFzU3RyaW5nKEZhY2VzQ29udGV4dCBjb250ZXh0LCBVSUNvbXBvbmVudCBjb21wb25lbnQsDQotICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnNtYXJ0Q29udmVydGVyLmdldEFzU3RyaW5nKGNvbnRleHQsIGNvbXBvbmVudCwgdmFsdWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZhbGxiYWNrX2RlbW8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvdHJpbmlkYWQvY29udmVydC9EYXRlVGltZUNvbnZlcnRlckFkYXB0ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZhbGxiYWNrX2RlbW8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvdHJpbmlkYWQvY29udmVydC9EYXRlVGltZUNvbnZlcnRlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJjMGVlYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3RyaW5pZGFkL2NvbnZlcnQvRGF0ZVRpbWVDb252ZXJ0ZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29udmVydDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYWRhcHRlci5FeHRWYWxGYWxsYmFja0NvbnZlcnRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOw0KLQ0KLS8qZ2VuZXJhdGVkIGNvZGUgLSBkb24ndCBjaGFuZ2UhKi8NCi1wdWJsaWMgY2xhc3MgRGF0ZVRpbWVDb252ZXJ0ZXJBZGFwdGVyIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb252ZXJ0LkRhdGVUaW1lQ29udmVydGVyDQotew0KLSAgICBwcml2YXRlIENvbnZlcnRlciBzbWFydENvbnZlcnRlcjsNCi0NCi0gICAgcHVibGljIERhdGVUaW1lQ29udmVydGVyQWRhcHRlcigpDQotICAgIHsNCi0gICAgICAgIHRoaXMobmV3IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb252ZXJ0LkRhdGVUaW1lQ29udmVydGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlVGltZUNvbnZlcnRlckFkYXB0ZXIoQ29udmVydGVyIGNvbnZlcnRlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5zbWFydENvbnZlcnRlciA9IG5ldyBFeHRWYWxGYWxsYmFja0NvbnZlcnRlcihjb252ZXJ0ZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QXNPYmplY3QoRmFjZXNDb250ZXh0IGNvbnRleHQsIFVJQ29tcG9uZW50IGNvbXBvbmVudCwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUpIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuc21hcnRDb252ZXJ0ZXIuZ2V0QXNPYmplY3QoY29udGV4dCwgY29tcG9uZW50LCB2YWx1ZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRBc1N0cmluZyhGYWNlc0NvbnRleHQgY29udGV4dCwgVUlDb21wb25lbnQgY29tcG9uZW50LA0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSkgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5zbWFydENvbnZlcnRlci5nZXRBc1N0cmluZyhjb250ZXh0LCBjb21wb25lbnQsIHZhbHVlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3RyaW5pZGFkL2NvbnZlcnQvTnVtYmVyQ29udmVydGVyQWRhcHRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy90cmluaWRhZC9jb252ZXJ0L051bWJlckNvbnZlcnRlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJlNzEyZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3RyaW5pZGFkL2NvbnZlcnQvTnVtYmVyQ29udmVydGVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbnZlcnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmFkYXB0ZXIuRXh0VmFsRmFsbGJhY2tDb252ZXJ0ZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsNCi0NCi0vKmdlbmVyYXRlZCBjb2RlIC0gZG9uJ3QgY2hhbmdlISovDQotcHVibGljIGNsYXNzIE51bWJlckNvbnZlcnRlckFkYXB0ZXIgZXh0ZW5kcw0KLSAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbnZlcnQuTnVtYmVyQ29udmVydGVyDQotew0KLSAgICBwcml2YXRlIENvbnZlcnRlciBzbWFydENvbnZlcnRlcjsNCi0NCi0gICAgcHVibGljIE51bWJlckNvbnZlcnRlckFkYXB0ZXIoKQ0KLSAgICB7DQotICAgICAgICB0aGlzKG5ldyBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29udmVydC5OdW1iZXJDb252ZXJ0ZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE51bWJlckNvbnZlcnRlckFkYXB0ZXIoQ29udmVydGVyIGNvbnZlcnRlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5zbWFydENvbnZlcnRlciA9IG5ldyBFeHRWYWxGYWxsYmFja0NvbnZlcnRlcihjb252ZXJ0ZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QXNPYmplY3QoRmFjZXNDb250ZXh0IGNvbnRleHQsIFVJQ29tcG9uZW50IGNvbXBvbmVudCwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUpIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuc21hcnRDb252ZXJ0ZXIuZ2V0QXNPYmplY3QoY29udGV4dCwgY29tcG9uZW50LCB2YWx1ZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRBc1N0cmluZyhGYWNlc0NvbnRleHQgY29udGV4dCwgVUlDb21wb25lbnQgY29tcG9uZW50LA0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSkgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5zbWFydENvbnZlcnRlci5nZXRBc1N0cmluZyhjb250ZXh0LCBjb21wb25lbnQsIHZhbHVlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3RyaW5pZGFkaW50ZXJuYWwvY29udmVydC9CeXRlQ29udmVydGVyQWRhcHRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy90cmluaWRhZGludGVybmFsL2NvbnZlcnQvQnl0ZUNvbnZlcnRlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE1ODNiOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3RyaW5pZGFkaW50ZXJuYWwvY29udmVydC9CeXRlQ29udmVydGVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYWRhcHRlci5FeHRWYWxGYWxsYmFja0NvbnZlcnRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOw0KLQ0KLS8qZ2VuZXJhdGVkIGNvZGUgLSBkb24ndCBjaGFuZ2UhKi8NCi1wdWJsaWMgY2xhc3MgQnl0ZUNvbnZlcnRlckFkYXB0ZXIgZXh0ZW5kcw0KLSAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5CeXRlQ29udmVydGVyDQotew0KLSAgICBwcml2YXRlIENvbnZlcnRlciBzbWFydENvbnZlcnRlcjsNCi0NCi0gICAgcHVibGljIEJ5dGVDb252ZXJ0ZXJBZGFwdGVyKCkNCi0gICAgew0KLSAgICAgICAgdGhpcyhuZXcgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5CeXRlQ29udmVydGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCeXRlQ29udmVydGVyQWRhcHRlcihDb252ZXJ0ZXIgY29udmVydGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnNtYXJ0Q29udmVydGVyID0gbmV3IEV4dFZhbEZhbGxiYWNrQ29udmVydGVyKGNvbnZlcnRlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRBc09iamVjdChGYWNlc0NvbnRleHQgY29udGV4dCwgVUlDb21wb25lbnQgY29tcG9uZW50LA0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSkgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5zbWFydENvbnZlcnRlci5nZXRBc09iamVjdChjb250ZXh0LCBjb21wb25lbnQsIHZhbHVlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFzU3RyaW5nKEZhY2VzQ29udGV4dCBjb250ZXh0LCBVSUNvbXBvbmVudCBjb21wb25lbnQsDQotICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnNtYXJ0Q29udmVydGVyLmdldEFzU3RyaW5nKGNvbnRleHQsIGNvbXBvbmVudCwgdmFsdWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZhbGxiYWNrX2RlbW8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvdHJpbmlkYWRpbnRlcm5hbC9jb252ZXJ0L0NvbG9yQ29udmVydGVyQWRhcHRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy90cmluaWRhZGludGVybmFsL2NvbnZlcnQvQ29sb3JDb252ZXJ0ZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MTA1ZjUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy90cmluaWRhZGludGVybmFsL2NvbnZlcnQvQ29sb3JDb252ZXJ0ZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hZGFwdGVyLkV4dFZhbEZhbGxiYWNrQ29udmVydGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247DQotDQotLypnZW5lcmF0ZWQgY29kZSAtIGRvbid0IGNoYW5nZSEqLw0KLXB1YmxpYyBjbGFzcyBDb2xvckNvbnZlcnRlckFkYXB0ZXIgZXh0ZW5kcw0KLSAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5Db2xvckNvbnZlcnRlcg0KLXsNCi0gICAgcHJpdmF0ZSBDb252ZXJ0ZXIgc21hcnRDb252ZXJ0ZXI7DQotDQotICAgIHB1YmxpYyBDb2xvckNvbnZlcnRlckFkYXB0ZXIoKQ0KLSAgICB7DQotICAgICAgICB0aGlzKG5ldyBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LkNvbG9yQ29udmVydGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDb2xvckNvbnZlcnRlckFkYXB0ZXIoQ29udmVydGVyIGNvbnZlcnRlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5zbWFydENvbnZlcnRlciA9IG5ldyBFeHRWYWxGYWxsYmFja0NvbnZlcnRlcihjb252ZXJ0ZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QXNPYmplY3QoRmFjZXNDb250ZXh0IGNvbnRleHQsIFVJQ29tcG9uZW50IGNvbXBvbmVudCwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUpIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuc21hcnRDb252ZXJ0ZXIuZ2V0QXNPYmplY3QoY29udGV4dCwgY29tcG9uZW50LCB2YWx1ZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRBc1N0cmluZyhGYWNlc0NvbnRleHQgY29udGV4dCwgVUlDb21wb25lbnQgY29tcG9uZW50LA0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSkgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5zbWFydENvbnZlcnRlci5nZXRBc1N0cmluZyhjb250ZXh0LCBjb21wb25lbnQsIHZhbHVlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3RyaW5pZGFkaW50ZXJuYWwvY29udmVydC9EYXRlVGltZUNvbnZlcnRlckFkYXB0ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZhbGxiYWNrX2RlbW8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvdHJpbmlkYWRpbnRlcm5hbC9jb252ZXJ0L0RhdGVUaW1lQ29udmVydGVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWE0ZTg1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZhbGxiYWNrX2RlbW8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvdHJpbmlkYWRpbnRlcm5hbC9jb252ZXJ0L0RhdGVUaW1lQ29udmVydGVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYWRhcHRlci5FeHRWYWxGYWxsYmFja0NvbnZlcnRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOw0KLQ0KLS8qZ2VuZXJhdGVkIGNvZGUgLSBkb24ndCBjaGFuZ2UhKi8NCi1wdWJsaWMgY2xhc3MgRGF0ZVRpbWVDb252ZXJ0ZXJBZGFwdGVyIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuRGF0ZVRpbWVDb252ZXJ0ZXINCi17DQotICAgIHByaXZhdGUgQ29udmVydGVyIHNtYXJ0Q29udmVydGVyOw0KLQ0KLSAgICBwdWJsaWMgRGF0ZVRpbWVDb252ZXJ0ZXJBZGFwdGVyKCkNCi0gICAgew0KLSAgICAgICAgdGhpcygNCi0gICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuRGF0ZVRpbWVDb252ZXJ0ZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGVUaW1lQ29udmVydGVyQWRhcHRlcihDb252ZXJ0ZXIgY29udmVydGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnNtYXJ0Q29udmVydGVyID0gbmV3IEV4dFZhbEZhbGxiYWNrQ29udmVydGVyKGNvbnZlcnRlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRBc09iamVjdChGYWNlc0NvbnRleHQgY29udGV4dCwgVUlDb21wb25lbnQgY29tcG9uZW50LA0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSkgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5zbWFydENvbnZlcnRlci5nZXRBc09iamVjdChjb250ZXh0LCBjb21wb25lbnQsIHZhbHVlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFzU3RyaW5nKEZhY2VzQ29udGV4dCBjb250ZXh0LCBVSUNvbXBvbmVudCBjb21wb25lbnQsDQotICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnNtYXJ0Q29udmVydGVyLmdldEFzU3RyaW5nKGNvbnRleHQsIGNvbXBvbmVudCwgdmFsdWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZhbGxiYWNrX2RlbW8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvdHJpbmlkYWRpbnRlcm5hbC9jb252ZXJ0L0RvdWJsZUNvbnZlcnRlckFkYXB0ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZhbGxiYWNrX2RlbW8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvdHJpbmlkYWRpbnRlcm5hbC9jb252ZXJ0L0RvdWJsZUNvbnZlcnRlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMwMmRmNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3RyaW5pZGFkaW50ZXJuYWwvY29udmVydC9Eb3VibGVDb252ZXJ0ZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hZGFwdGVyLkV4dFZhbEZhbGxiYWNrQ29udmVydGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247DQotDQotLypnZW5lcmF0ZWQgY29kZSAtIGRvbid0IGNoYW5nZSEqLw0KLXB1YmxpYyBjbGFzcyBEb3VibGVDb252ZXJ0ZXJBZGFwdGVyIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuRG91YmxlQ29udmVydGVyDQotew0KLSAgICBwcml2YXRlIENvbnZlcnRlciBzbWFydENvbnZlcnRlcjsNCi0NCi0gICAgcHVibGljIERvdWJsZUNvbnZlcnRlckFkYXB0ZXIoKQ0KLSAgICB7DQotICAgICAgICB0aGlzKG5ldyBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LkRvdWJsZUNvbnZlcnRlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRG91YmxlQ29udmVydGVyQWRhcHRlcihDb252ZXJ0ZXIgY29udmVydGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnNtYXJ0Q29udmVydGVyID0gbmV3IEV4dFZhbEZhbGxiYWNrQ29udmVydGVyKGNvbnZlcnRlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRBc09iamVjdChGYWNlc0NvbnRleHQgY29udGV4dCwgVUlDb21wb25lbnQgY29tcG9uZW50LA0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSkgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5zbWFydENvbnZlcnRlci5nZXRBc09iamVjdChjb250ZXh0LCBjb21wb25lbnQsIHZhbHVlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFzU3RyaW5nKEZhY2VzQ29udGV4dCBjb250ZXh0LCBVSUNvbXBvbmVudCBjb21wb25lbnQsDQotICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnNtYXJ0Q29udmVydGVyLmdldEFzU3RyaW5nKGNvbnRleHQsIGNvbXBvbmVudCwgdmFsdWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZhbGxiYWNrX2RlbW8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvdHJpbmlkYWRpbnRlcm5hbC9jb252ZXJ0L0Zsb2F0Q29udmVydGVyQWRhcHRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy90cmluaWRhZGludGVybmFsL2NvbnZlcnQvRmxvYXRDb252ZXJ0ZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMGQ0N2UuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy90cmluaWRhZGludGVybmFsL2NvbnZlcnQvRmxvYXRDb252ZXJ0ZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hZGFwdGVyLkV4dFZhbEZhbGxiYWNrQ29udmVydGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247DQotDQotLypnZW5lcmF0ZWQgY29kZSAtIGRvbid0IGNoYW5nZSEqLw0KLXB1YmxpYyBjbGFzcyBGbG9hdENvbnZlcnRlckFkYXB0ZXIgZXh0ZW5kcw0KLSAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5GbG9hdENvbnZlcnRlcg0KLXsNCi0gICAgcHJpdmF0ZSBDb252ZXJ0ZXIgc21hcnRDb252ZXJ0ZXI7DQotDQotICAgIHB1YmxpYyBGbG9hdENvbnZlcnRlckFkYXB0ZXIoKQ0KLSAgICB7DQotICAgICAgICB0aGlzKG5ldyBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LkZsb2F0Q29udmVydGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGbG9hdENvbnZlcnRlckFkYXB0ZXIoQ29udmVydGVyIGNvbnZlcnRlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5zbWFydENvbnZlcnRlciA9IG5ldyBFeHRWYWxGYWxsYmFja0NvbnZlcnRlcihjb252ZXJ0ZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QXNPYmplY3QoRmFjZXNDb250ZXh0IGNvbnRleHQsIFVJQ29tcG9uZW50IGNvbXBvbmVudCwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUpIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuc21hcnRDb252ZXJ0ZXIuZ2V0QXNPYmplY3QoY29udGV4dCwgY29tcG9uZW50LCB2YWx1ZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRBc1N0cmluZyhGYWNlc0NvbnRleHQgY29udGV4dCwgVUlDb21wb25lbnQgY29tcG9uZW50LA0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSkgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5zbWFydENvbnZlcnRlci5nZXRBc1N0cmluZyhjb250ZXh0LCBjb21wb25lbnQsIHZhbHVlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3RyaW5pZGFkaW50ZXJuYWwvY29udmVydC9JbnRlZ2VyQ29udmVydGVyQWRhcHRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy90cmluaWRhZGludGVybmFsL2NvbnZlcnQvSW50ZWdlckNvbnZlcnRlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwZDkzNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3RyaW5pZGFkaW50ZXJuYWwvY29udmVydC9JbnRlZ2VyQ29udmVydGVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYWRhcHRlci5FeHRWYWxGYWxsYmFja0NvbnZlcnRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOw0KLQ0KLS8qZ2VuZXJhdGVkIGNvZGUgLSBkb24ndCBjaGFuZ2UhKi8NCi1wdWJsaWMgY2xhc3MgSW50ZWdlckNvbnZlcnRlckFkYXB0ZXIgZXh0ZW5kcw0KLSAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5JbnRlZ2VyQ29udmVydGVyDQotew0KLSAgICBwcml2YXRlIENvbnZlcnRlciBzbWFydENvbnZlcnRlcjsNCi0NCi0gICAgcHVibGljIEludGVnZXJDb252ZXJ0ZXJBZGFwdGVyKCkNCi0gICAgew0KLSAgICAgICAgdGhpcyhuZXcgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5JbnRlZ2VyQ29udmVydGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbnRlZ2VyQ29udmVydGVyQWRhcHRlcihDb252ZXJ0ZXIgY29udmVydGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnNtYXJ0Q29udmVydGVyID0gbmV3IEV4dFZhbEZhbGxiYWNrQ29udmVydGVyKGNvbnZlcnRlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRBc09iamVjdChGYWNlc0NvbnRleHQgY29udGV4dCwgVUlDb21wb25lbnQgY29tcG9uZW50LA0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSkgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5zbWFydENvbnZlcnRlci5nZXRBc09iamVjdChjb250ZXh0LCBjb21wb25lbnQsIHZhbHVlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFzU3RyaW5nKEZhY2VzQ29udGV4dCBjb250ZXh0LCBVSUNvbXBvbmVudCBjb21wb25lbnQsDQotICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnNtYXJ0Q29udmVydGVyLmdldEFzU3RyaW5nKGNvbnRleHQsIGNvbXBvbmVudCwgdmFsdWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZhbGxiYWNrX2RlbW8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvdHJpbmlkYWRpbnRlcm5hbC9jb252ZXJ0L0xvbmdDb252ZXJ0ZXJBZGFwdGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3RyaW5pZGFkaW50ZXJuYWwvY29udmVydC9Mb25nQ29udmVydGVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGU4Y2Y4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZhbGxiYWNrX2RlbW8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvdHJpbmlkYWRpbnRlcm5hbC9jb252ZXJ0L0xvbmdDb252ZXJ0ZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hZGFwdGVyLkV4dFZhbEZhbGxiYWNrQ29udmVydGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247DQotDQotLypnZW5lcmF0ZWQgY29kZSAtIGRvbid0IGNoYW5nZSEqLw0KLXB1YmxpYyBjbGFzcyBMb25nQ29udmVydGVyQWRhcHRlciBleHRlbmRzDQotICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LkxvbmdDb252ZXJ0ZXINCi17DQotICAgIHByaXZhdGUgQ29udmVydGVyIHNtYXJ0Q29udmVydGVyOw0KLQ0KLSAgICBwdWJsaWMgTG9uZ0NvbnZlcnRlckFkYXB0ZXIoKQ0KLSAgICB7DQotICAgICAgICB0aGlzKG5ldyBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LkxvbmdDb252ZXJ0ZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExvbmdDb252ZXJ0ZXJBZGFwdGVyKENvbnZlcnRlciBjb252ZXJ0ZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuc21hcnRDb252ZXJ0ZXIgPSBuZXcgRXh0VmFsRmFsbGJhY2tDb252ZXJ0ZXIoY29udmVydGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEFzT2JqZWN0KEZhY2VzQ29udGV4dCBjb250ZXh0LCBVSUNvbXBvbmVudCBjb21wb25lbnQsDQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlKSB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnNtYXJ0Q29udmVydGVyLmdldEFzT2JqZWN0KGNvbnRleHQsIGNvbXBvbmVudCwgdmFsdWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXNTdHJpbmcoRmFjZXNDb250ZXh0IGNvbnRleHQsIFVJQ29tcG9uZW50IGNvbXBvbmVudCwNCi0gICAgICAgICAgICBPYmplY3QgdmFsdWUpIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuc21hcnRDb252ZXJ0ZXIuZ2V0QXNTdHJpbmcoY29udGV4dCwgY29tcG9uZW50LCB2YWx1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy90cmluaWRhZGludGVybmFsL2NvbnZlcnQvTnVtYmVyQ29udmVydGVyQWRhcHRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy90cmluaWRhZGludGVybmFsL2NvbnZlcnQvTnVtYmVyQ29udmVydGVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjZkYjMwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZhbGxiYWNrX2RlbW8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvdHJpbmlkYWRpbnRlcm5hbC9jb252ZXJ0L051bWJlckNvbnZlcnRlckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmFkYXB0ZXIuRXh0VmFsRmFsbGJhY2tDb252ZXJ0ZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsNCi0NCi0vKmdlbmVyYXRlZCBjb2RlIC0gZG9uJ3QgY2hhbmdlISovDQotcHVibGljIGNsYXNzIE51bWJlckNvbnZlcnRlckFkYXB0ZXIgZXh0ZW5kcw0KLSAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5OdW1iZXJDb252ZXJ0ZXINCi17DQotICAgIHByaXZhdGUgQ29udmVydGVyIHNtYXJ0Q29udmVydGVyOw0KLQ0KLSAgICBwdWJsaWMgTnVtYmVyQ29udmVydGVyQWRhcHRlcigpDQotICAgIHsNCi0gICAgICAgIHRoaXMobmV3IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuTnVtYmVyQ29udmVydGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBOdW1iZXJDb252ZXJ0ZXJBZGFwdGVyKENvbnZlcnRlciBjb252ZXJ0ZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuc21hcnRDb252ZXJ0ZXIgPSBuZXcgRXh0VmFsRmFsbGJhY2tDb252ZXJ0ZXIoY29udmVydGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEFzT2JqZWN0KEZhY2VzQ29udGV4dCBjb250ZXh0LCBVSUNvbXBvbmVudCBjb21wb25lbnQsDQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlKSB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnNtYXJ0Q29udmVydGVyLmdldEFzT2JqZWN0KGNvbnRleHQsIGNvbXBvbmVudCwgdmFsdWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXNTdHJpbmcoRmFjZXNDb250ZXh0IGNvbnRleHQsIFVJQ29tcG9uZW50IGNvbXBvbmVudCwNCi0gICAgICAgICAgICBPYmplY3QgdmFsdWUpIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuc21hcnRDb252ZXJ0ZXIuZ2V0QXNTdHJpbmcoY29udGV4dCwgY29tcG9uZW50LCB2YWx1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy90cmluaWRhZGludGVybmFsL2NvbnZlcnQvU2hvcnRDb252ZXJ0ZXJBZGFwdGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3RyaW5pZGFkaW50ZXJuYWwvY29udmVydC9TaG9ydENvbnZlcnRlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMyZWE0Zi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL3RyaW5pZGFkaW50ZXJuYWwvY29udmVydC9TaG9ydENvbnZlcnRlckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmFkYXB0ZXIuRXh0VmFsRmFsbGJhY2tDb252ZXJ0ZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsNCi0NCi0vKmdlbmVyYXRlZCBjb2RlIC0gZG9uJ3QgY2hhbmdlISovDQotcHVibGljIGNsYXNzIFNob3J0Q29udmVydGVyQWRhcHRlciBleHRlbmRzDQotICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LlNob3J0Q29udmVydGVyDQotew0KLSAgICBwcml2YXRlIENvbnZlcnRlciBzbWFydENvbnZlcnRlcjsNCi0NCi0gICAgcHVibGljIFNob3J0Q29udmVydGVyQWRhcHRlcigpDQotICAgIHsNCi0gICAgICAgIHRoaXMobmV3IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuU2hvcnRDb252ZXJ0ZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFNob3J0Q29udmVydGVyQWRhcHRlcihDb252ZXJ0ZXIgY29udmVydGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnNtYXJ0Q29udmVydGVyID0gbmV3IEV4dFZhbEZhbGxiYWNrQ29udmVydGVyKGNvbnZlcnRlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRBc09iamVjdChGYWNlc0NvbnRleHQgY29udGV4dCwgVUlDb21wb25lbnQgY29tcG9uZW50LA0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSkgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5zbWFydENvbnZlcnRlci5nZXRBc09iamVjdChjb250ZXh0LCBjb21wb25lbnQsIHZhbHVlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFzU3RyaW5nKEZhY2VzQ29udGV4dCBjb250ZXh0LCBVSUNvbXBvbmVudCBjb21wb25lbnQsDQotICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnNtYXJ0Q29udmVydGVyLmdldEFzU3RyaW5nKGNvbnRleHQsIGNvbXBvbmVudCwgdmFsdWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZhbGxiYWNrX2RlbW8vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZhbGxiYWNrX2RlbW8vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZhbGxiYWNrX2RlbW8vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZhbGxiYWNrX2RlbW8vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMDczMjcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+Ci0gICAgPGFwcGxpY2F0aW9uPgotICAgICAgICA8IS0tIHRyaW5pZGFkIC0tPgotICAgICAgICA8ZGVmYXVsdC1yZW5kZXIta2l0LWlkPgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvcmUKLSAgICAgICAgPC9kZWZhdWx0LXJlbmRlci1raXQtaWQ+Ci0KLSAgICA8L2FwcGxpY2F0aW9uPgotCi0gICAgPG1hbmFnZWQtYmVhbj4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1uYW1lPnJlZ2lzdHJhdGlvblBhZ2U8L21hbmFnZWQtYmVhbi1uYW1lPgotICAgICAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmd1aS5iZWFucy5SZWdpc3RyYXRpb25QYWdlPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPgotCi0gICAgICAgIDxtYW5hZ2VkLXByb3BlcnR5PgotICAgICAgICAgICAgPHByb3BlcnR5LW5hbWU+cGVyc29uPC9wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPHZhbHVlPiN7cGVyc29ufTwvdmFsdWU+Ci0gICAgICAgIDwvbWFuYWdlZC1wcm9wZXJ0eT4KLSAgICA8L21hbmFnZWQtYmVhbj4KLQotICAgIDxtYW5hZ2VkLWJlYW4+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tbmFtZT5wZXJzb248L21hbmFnZWQtYmVhbi1uYW1lPgotICAgICAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb248L21hbmFnZWQtYmVhbi1jbGFzcz4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5zZXNzaW9uPC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0gICAgPC9tYW5hZ2VkLWJlYW4+Ci0KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8ZnJvbS12aWV3LWlkPi9wYWdlcy9ob21lLnhodG1sPC9mcm9tLXZpZXctaWQ+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmFkZFVzZXI8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5jaGFuZ2VOaWNrTmFtZTwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmNoYW5nZVBhc3N3b3JkPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICA8L25hdmlnYXRpb24tcnVsZT4KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8ZnJvbS12aWV3LWlkPio8L2Zyb20tdmlldy1pZD4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+aG9tZTwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL2hvbWUueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgIDwvbmF2aWdhdGlvbi1ydWxlPgotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDMzZDBlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZhbGxiYWNrX2RlbW8vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgotICAgICAgICAgdmVyc2lvbj0iMi40Ij4KLQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlVTRV9BREFQVEVSUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuQ1VTVE9NX01FU1NBR0VfQlVORExFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmFwYWNoZS5teWZhY2VzLmN1c3RvbV9tc2c8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuYXBhY2hlLm15ZmFjZXMuY3VzdG9tX21zZzwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkRFRkFVTFRfU1VGRklYPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+LnhodG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkVOQUJMRV9MSUdIVFdFSUdIVF9ESUFMT0dTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5ESVNBQkxFX0NPTlRFTlRfQ09NUFJFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkFMVEVSTkFURV9WSUVXX0hBTkRMRVI8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jb20uc3VuLmZhY2VsZXRzLkZhY2VsZXRWaWV3SGFuZGxlcjwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5VU0VfQVBQTElDQVRJT05fVklFV19DQUNIRTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkNIQU5HRV9QRVJTSVNURU5DRTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnNlc3Npb248L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+U3RhdGUgc2F2aW5nIG1ldGhvZDogImNsaWVudCIgb3IgInNlcnZlciIgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIFNlZSBKU0YgU3BlY2lmaWNhdGlvbiAyLjUuMwotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIGFtb3VudCAoZGVmYXVsdCA9IDIwKSBvZiB0aGUgbGF0ZXN0IHZpZXdzIGFyZSBzdG9yZWQgaW4gc2Vzc2lvbi4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLk5VTUJFUl9PRl9WSUVXU19JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpIGFuZCBpZgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OIGlzIHRydWUgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzZXJpYWxpemVkIHN0YXRlIHdpbGwgYmUgY29tcHJlc3NlZCBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBjb21wcmVzc2VkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcGFyYW1ldGVyIHRlbGxzIE15RmFjZXMgaWYgamF2YXNjcmlwdCBjb2RlIHNob3VsZCBiZSBhbGxvd2VkIGluIHRoZQotICAgICAgICAgICAgcmVuZGVyZWQgSFRNTCBvdXRwdXQuCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUKLSAgICAgICAgICAgIHRoYXQgc3VibWl0cyB0aGUgY29ycmVzcG9uZGluZyBmb3JtLgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBub3QgYWxsb3dlZCwgdGhlIHN0YXRlIHNhdmluZyBpbmZvIGFuZCBuZXN0ZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLgotICAgICAgICAgICAgaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90Ci0gICAgICAgICAgICBpbmZsdWVuY2UgdGhlIEhUTUwgY29kZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUFJFVFRZX0hUTUw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCBhIGphdmFzY3JpcHQgZnVuY3Rpb24gd2lsbCBiZSByZW5kZXJlZCB0aGF0IGlzIGFibGUgdG8gcmVzdG9yZSB0aGUKLSAgICAgICAgICAgIGZvcm1lciB2ZXJ0aWNhbCBzY3JvbGwgb24gZXZlcnkgcmVxdWVzdC4gQ29udmVuaWVudCBmZWF0dXJlIGlmIHlvdSBoYXZlIHBhZ2VzCi0gICAgICAgICAgICB3aXRoIGxvbmcgbGlzdHMgYW5kIHlvdSBkbyBub3Qgd2FudCB0aGUgYnJvd3NlciBwYWdlIHRvIGFsd2F5cyBqdW1wIHRvIHRoZSB0b3AKLSAgICAgICAgICAgIGlmIHlvdSB0cmlnZ2VyIGEgbGluayBvciBidXR0b24gYWN0aW9uIHRoYXQgc3RheXMgb24gdGhlIHNhbWUgcGFnZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJmYWxzZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFVVE9fU0NST0xMPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Vc2VkIGZvciBlbmNyeXB0aW5nIHZpZXcgc3RhdGUuIE9ubHkgcmVsZXZhbnQgZm9yIGNsaWVudCBzaWRlCi0gICAgICAgICAgICBzdGF0ZSBzYXZpbmcuIFNlZSBNeUZhY2VzIHdpa2kvd2ViIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRUNSRVQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWYWxpZGF0ZSBtYW5hZ2VkIGJlYW5zLCBuYXZpZ2F0aW9uIHJ1bGVzIGFuZCBlbnN1cmUgdGhhdCBmb3JtcyBhcmUgbm90IG5lc3RlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlZBTElEQVRFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPCEtLSBMaXN0ZW5lciwgdG8gYWxsb3cgSmV0dHkgc2VydmluZyBNeUZhY2VzIGFwcHMgLS0+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLndlYmFwcC5TdGFydHVwU2VydmxldENvbnRleHRMaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+Ci0gICAgPC9saXN0ZW5lcj4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCAtLT4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICAgIDwvc2VydmxldD4KLQotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPnJlc291cmNlczwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlJlc291cmNlU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8ZmlsdGVyPgotICAgICAgICA8ZmlsdGVyLW5hbWU+dHJpbmlkYWQ8L2ZpbHRlci1uYW1lPgotICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC53ZWJhcHAuVHJpbmlkYWRGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KLSAgICA8L2ZpbHRlcj4KLQotICAgIDxmaWx0ZXItbWFwcGluZz4KLSAgICAgICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgPC9maWx0ZXItbWFwcGluZz4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCBNYXBwaW5ncyAtLT4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPiouZmFjZXM8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9hZGYvKjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQzMjRhYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08aHRtbD4NCi0NCi08aGVhZD4NCi0gICAgPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDsgVVJMPXBhZ2VzL2hvbWUuZmFjZXMiPg0KLTwvaGVhZD4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2E0MWE1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZhbGxiYWNrX2RlbW8vc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTx0cjpkb2N1bWVudA0KLSAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIg0KLSAgICAgICAgeG1sbnM6Yz0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3RsL2NvcmUiPg0KLSAgICA8ZjpmYWNldCBuYW1lPSJtZXRhQ29udGFpbmVyIj4NCi0gICAgICAgIDx0aXRsZT5zZXYtZW4gZmVhdHVyZS1zZXQgZGVtbyAwMTwvdGl0bGU+DQotICAgIDwvZjpmYWNldD4NCi0NCi0gICAgPHRyaDpib2R5Pg0KLQ0KLSAgICAgICAgPCEtLSBvcmlnaW5hbCAtLT4NCi0gICAgICAgIDxkaXYgaWQ9IndyYXAiPg0KLQ0KLSAgICAgICAgICAgIDx0cjpmb3JtIGlkPSJmb3JtIiBkZWZhdWx0Q29tbWFuZD0iZGVmYXVsdEJ1dHRvbiI+DQotICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1haW4iPg0KLSAgICAgICAgICAgICAgICAgICAgPHVpOmluc2VydCBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ1bmRlcl9jb25zdHJ1Y3Rpb24iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+IXNpdGUgdW5kZXIgY29uc3RydWN0aW9uITwvaDI+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBjb250ZW50IG9mIHRoaXMgc2l0ZSBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSBtb21lbnQuPC9wPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC91aTppbnNlcnQ+DQotICAgICAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICAgIDwvdHI6Zm9ybT4NCi0gICAgICAgICAgICA8dHI6bWVzc2FnZXMgZ2xvYmFsT25seT0idHJ1ZSIvPg0KLQ0KLSAgICAgICAgPC9kaXY+DQotICAgIDwvdHJoOmJvZHk+DQotDQotDQotPC90cjpkb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZGNkMDMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDx0cjpwYW5lbEZvcm1MYXlvdXQ+DQotDQotICAgICAgICAgICAgPHVpOnJlbW92ZT4NCi0gICAgICAgICAgICAgICAganVzdCBmb3IgdGhlIGRlbW8gd2UgYXJlIHVzaW5nIHR3byBpbnB1dCBjb21wb25lbnRzDQotICAgICAgICAgICAgPC91aTpyZW1vdmU+DQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ib2xkIG5pY2sgbmFtZSIgcmVhZE9ubHk9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLm5pY2tOYW1lfSIvPg0KLQ0KLSAgICAgICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im5pY2sgbmFtZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5uZXdOaWNrTmFtZX0iLz4NCi0NCi0gICAgICAgIDwvdHI6cGFuZWxGb3JtTGF5b3V0Pg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UudXBkYXRlTmlja05hbWV9Ii8+DQotDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MTQ1ZjYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDx0cjpwYW5lbEZvcm1MYXlvdXQ+DQotDQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ib2xkIHBhc3N3b3JkIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLm9sZFBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+DQotDQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibmV3IHBhc3N3b3JkIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+DQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0icmUtZW50ZXIgcGFzc3dvcmQiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGFzc3dvcmRSZXBlYXRlZH0iIHNlY3JldD0idHJ1ZSIvPg0KLQ0KLSAgICAgICAgPC90cjpwYW5lbEZvcm1MYXlvdXQ+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJzYXZlIiBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS5maW5pc2h9Ii8+DQotDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmFsbGJhY2tfZGVtby9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwYjI5ZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9ImFkZCB1c2VyIiBhY3Rpb249ImFkZFVzZXIiLz48YnIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0iY2hhbmdlIG5pY2sgbmFtZSIgYWN0aW9uPSJjaGFuZ2VOaWNrTmFtZSIvPjxici8+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJjaGFuZ2UgcGFzc3dvcmQiIGFjdGlvbj0iY2hhbmdlUGFzc3dvcmQiLz4NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZhbGxiYWNrX2RlbW8vc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbCBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZhbGxiYWNrX2RlbW8vc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM0MDQxOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mYWxsYmFja19kZW1vL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgPHRyOnBhbmVsRm9ybUxheW91dD4NCi0NCi0gICAgICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJuaWNrIG5hbWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLm5pY2tOYW1lfSIvPg0KLSAgICAgICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9ImUtbWFpbCIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5lbWFpbH0iLz4NCi0NCi0gICAgICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJmaXJzdCBuYW1lIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5maXJzdE5hbWV9Ii8+DQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibGFzdCBuYW1lIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5sYXN0TmFtZX0iLz4NCi0gICAgICAgICAgICA8dHI6aW5wdXREYXRlIGxhYmVsPSJiaXJ0aGRheSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24uYmlydGhkYXl9Ij4NCi0gICAgICAgICAgICAgICAgPHRyOmNvbnZlcnREYXRlVGltZSB0eXBlPSJkYXRlIiBkYXRlU3R5bGU9InNob3J0Ii8+DQotICAgICAgICAgICAgPC90cjppbnB1dERhdGU+DQotICAgICAgICAgICAgPHRyOmlucHV0RGF0ZSBsYWJlbD0iZmluYWwgZXhhbSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24uZmluYWxFeGFtfSI+DQotICAgICAgICAgICAgICAgIDx0cjpjb252ZXJ0RGF0ZVRpbWUgdHlwZT0iZGF0ZSIgZGF0ZVN0eWxlPSJzaG9ydCIvPg0KLSAgICAgICAgICAgIDwvdHI6aW5wdXREYXRlPg0KLQ0KLSAgICAgICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im51bWJlciBvZiBzaWJsaW5ncyIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5udW1iZXJPZlNpYmxpbmdzfSIvPg0KLQ0KLSAgICAgICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9InBhc3N3b3JkIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+DQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0icmUtZW50ZXIgcGFzc3dvcmQiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGFzc3dvcmRSZXBlYXRlZH0iIHNlY3JldD0idHJ1ZSIvPg0KLQ0KLSAgICAgICAgPC90cjpwYW5lbEZvcm1MYXlvdXQ+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJzYXZlIiBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS5maW5pc2h9Ii8+DQotDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9wb20ueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwZDgyNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBmZWF0dXJlLXNldCAwMTwvbmFtZT4NCi0gICAgPHZlcnNpb24+JHtidWlsZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4ke2J1aWxkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7YnVpbGQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7YnVpbGQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5mYWNlbGV0czwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtZmFjZWxldHM8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE0PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50b21haGF3azwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50b21haGF3azwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuNjwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2N1c3RvbS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5Mjg0ZjYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyB0aGlzIG1lc3NhZ2UgYnVuZGxlIGlzIHBpY2tlZCB1cCB2aWEgY29udmVudGlvbg0KLXJlcGVhdGVkX3Bhc3N3b3JkX3JlcXVyaWVkPXBsZWFzZSByZXR5cGUgdGhlIHBhc3N3b3JkDQotcmVwZWF0ZWRfcGFzc3dvcmRfcmVxdXJpZWRfZGV0YWlscz1wbGVhc2UgcmV0eXBlIHRoZSBwYXNzd29yZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNGNhMzguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJc1R5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLk5vdEVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVnZXg7DQotDQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVGVtcG9yYWw7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlRlbXBvcmFsVHlwZTsNCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotcHVibGljIGNsYXNzIFBlcnNvbg0KLXsNCi0gICAgQExlbmd0aChtaW5pbXVtID0gMikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAyMCkNCi0gICAgQE5vdEVxdWFscygibGFzdE5hbWUiKQ0KLSAgICBAUmVnZXgoIltBLVpdW2Etel0rIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOw0KLQ0KLSAgICBATGVuZ3RoKG1pbmltdW0gPSAyKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDIwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsNCi0NCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7DQotDQotICAgIEBEYXRlSXModHlwZSA9IERhdGVJc1R5cGUuYmVmb3JlLCB2YWx1ZU9mID0gImZpbmFsRXhhbSIpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSkNCi0gICAgQFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5EQVRFKQ0KLSAgICBwcml2YXRlIERhdGUgYmlydGhkYXk7DQotDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSkNCi0gICAgQFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5EQVRFKQ0KLSAgICBwcml2YXRlIERhdGUgZmluYWxFeGFtOw0KLQ0KLSAgICBATGVuZ3RoKG1pbmltdW0gPSAyKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBuaWNrTmFtZTsNCi0NCi0gICAgQExlbmd0aChtaW5pbXVtID0gNikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSA2MCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW1haWw7DQotDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSkNCi0gICAgcHJpdmF0ZSBpbnQgbnVtYmVyT2ZTaWJsaW5nczsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxhc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0QmlydGhkYXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmlydGhkYXk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0QmlydGhkYXkoRGF0ZSBiaXJ0aGRheSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5iaXJ0aGRheSA9IGJpcnRoZGF5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldEZpbmFsRXhhbSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmaW5hbEV4YW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RmluYWxFeGFtKERhdGUgZmluYWxFeGFtKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpbmFsRXhhbSA9IGZpbmFsRXhhbTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5pY2tOYW1lKFN0cmluZyBuaWNrTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uaWNrTmFtZSA9IG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNpYmxpbmdzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG51bWJlck9mU2libGluZ3M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyT2ZTaWJsaW5ncyhpbnQgbnVtYmVyT2ZTaWJsaW5ncykNCi0gICAgew0KLSAgICAgICAgdGhpcy5udW1iZXJPZlNpYmxpbmdzID0gbnVtYmVyT2ZTaWJsaW5nczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNzE2MjMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmd1aS5iZWFuczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluLlBlcnNvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5Ob3RFcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTG9uZ1JhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmN1c3RvbS5lbWFpbHZhbGlkYXRvci5FbWFpbFZhbGlkYXRvcjsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uUGFnZQ0KLXsNCi0NCi0gICAgLy90aGUgb2xkIHBhc3N3b3JkIG9mIHRoZSBwZXJzb24gaXNuJ3QgdXNlZCB3aXRoaW4gdGhlIHBhZ2UNCi0gICAgLy8tPiB2YWxpZGF0ZSB3aXRoIHZhbHVlIG9mIHRoZSBtb2RlbA0KLSAgICBAUmVxdWlyZWQNCi0gICAgQEVxdWFscygiI3twZXJzb24ucGFzc3dvcmR9IikNCi0gICAgQE5vdEVxdWFscygicGFzc3dvcmQiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBvbGRQYXNzd29yZDsNCi0NCi0gICAgQFJlcXVpcmVkDQotICAgIEBFcXVhbHMoInBhc3N3b3JkUmVwZWF0ZWQiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsNCi0NCi0gICAgQFJlcXVpcmVkKHZhbGlkYXRpb25FcnJvck1zZ0tleSA9ICJyZXBlYXRlZF9wYXNzd29yZF9yZXF1cmllZCIpDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkUmVwZWF0ZWQ7DQotDQotICAgIC8vdXNlICN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ubmlja05hbWV9LCAje3BlcnNvbi5uaWNrTmFtZX0NCi0gICAgLy9vciBhIGdsb2JhbCBhbGlhcyBpbiBjb25uZWN0aW9uIHdpdGggdGhlIFRhcmdldEFsaWFzIGFubm90YXRpb24NCi0gICAgLy91c2UgcmVnaXN0cmF0aW9uUGFnZSB0byBkaXNwbGF5IHRoZSBzZWNvbmQgZXJyb3IgbWVzc2FnZSBhdCBvbGQgbmlja25hbWUNCi0gICAgQE5vdEVxdWFscygiI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5uaWNrTmFtZX0iKQ0KLSAgICBASm9pblZhbGlkYXRpb24oIiN7cGVyc29uLm5pY2tOYW1lfSIpDQotICAgIHByaXZhdGUgU3RyaW5nIG5ld05pY2tOYW1lOw0KLQ0KLSAgICBwcml2YXRlIFBlcnNvbiBwZXJzb247DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZmluaXNoKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0UGFzc3dvcmQodGhpcy5wYXNzd29yZCk7DQotICAgICAgICByZXR1cm4gImhvbWUiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgdXBkYXRlTmlja05hbWUoKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXROaWNrTmFtZSh0aGlzLm5ld05pY2tOYW1lKTsNCi0gICAgICAgIHJldHVybiAiaG9tZSI7DQotICAgIH0NCi0NCi0gICAgLy9jb21iaW5lIGd1aSByZWxhdGVkIGFubm90YXRpb25zIHdpdGggdGhlIGFubm9hdGlvbnMgb2YgdGhlIGRvbWFpbiBtb2RlbA0KLSAgICBASm9pblZhbGlkYXRpb24oIiN7cGVyc29uLmVtYWlsfSIpDQotICAgIEBWYWxpZGF0b3IoRW1haWxWYWxpZGF0b3IuY2xhc3MpDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5wZXJzb24uZ2V0RW1haWwoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbWFpbChTdHJpbmcgZW1haWwpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldEVtYWlsKGVtYWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBASm9pblZhbGlkYXRpb24oIiN7cGVyc29uLm51bWJlck9mU2libGluZ3N9IikNCi0gICAgQExvbmdSYW5nZShtYXhpbXVtID0gMjApDQotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZTaWJsaW5ncygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbi5nZXROdW1iZXJPZlNpYmxpbmdzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyT2ZTaWJsaW5ncyhpbnQgbnVtYmVyT2ZTaWJsaW5ncykNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0TnVtYmVyT2ZTaWJsaW5ncyhudW1iZXJPZlNpYmxpbmdzKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2xkUGFzc3dvcmQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gb2xkUGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0T2xkUGFzc3dvcmQoU3RyaW5nIG9sZFBhc3N3b3JkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm9sZFBhc3N3b3JkID0gb2xkUGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkUmVwZWF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmRSZXBlYXRlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZFJlcGVhdGVkKFN0cmluZyBwYXNzd29yZFJlcGVhdGVkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkUmVwZWF0ZWQgPSBwYXNzd29yZFJlcGVhdGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQZXJzb24gZ2V0UGVyc29uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBlcnNvbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzb24oUGVyc29uIHBlcnNvbikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24gPSBwZXJzb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROZXdOaWNrTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXdOaWNrTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROZXdOaWNrTmFtZShTdHJpbmcgbmV3Tmlja05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmV3Tmlja05hbWUgPSBuZXdOaWNrTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMDczMjcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIgotICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjIiPgotICAgIDxhcHBsaWNhdGlvbj4KLSAgICAgICAgPCEtLSB0cmluaWRhZCAtLT4KLSAgICAgICAgPGRlZmF1bHQtcmVuZGVyLWtpdC1pZD4KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb3JlCi0gICAgICAgIDwvZGVmYXVsdC1yZW5kZXIta2l0LWlkPgotCi0gICAgPC9hcHBsaWNhdGlvbj4KLQotICAgIDxtYW5hZ2VkLWJlYW4+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tbmFtZT5yZWdpc3RyYXRpb25QYWdlPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5ndWkuYmVhbnMuUmVnaXN0cmF0aW9uUGFnZTwvbWFuYWdlZC1iZWFuLWNsYXNzPgotICAgICAgICA8bWFuYWdlZC1iZWFuLXNjb3BlPnJlcXVlc3Q8L21hbmFnZWQtYmVhbi1zY29wZT4KLQotICAgICAgICA8bWFuYWdlZC1wcm9wZXJ0eT4KLSAgICAgICAgICAgIDxwcm9wZXJ0eS1uYW1lPnBlcnNvbjwvcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDx2YWx1ZT4je3BlcnNvbn08L3ZhbHVlPgotICAgICAgICA8L21hbmFnZWQtcHJvcGVydHk+Ci0gICAgPC9tYW5hZ2VkLWJlYW4+Ci0KLSAgICA8bWFuYWdlZC1iZWFuPgotICAgICAgICA8bWFuYWdlZC1iZWFuLW5hbWU+cGVyc29uPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5kb21haW4uUGVyc29uPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tc2NvcGU+c2Vzc2lvbjwvbWFuYWdlZC1iZWFuLXNjb3BlPgotICAgIDwvbWFuYWdlZC1iZWFuPgotCi0gICAgPG5hdmlnYXRpb24tcnVsZT4KLSAgICAgICAgPGZyb20tdmlldy1pZD4vcGFnZXMvaG9tZS54aHRtbDwvZnJvbS12aWV3LWlkPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5hZGRVc2VyPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+Y2hhbmdlTmlja05hbWU8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5jaGFuZ2VQYXNzd29yZDwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL2NoYW5nZV9wYXNzd29yZC54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgPG5hdmlnYXRpb24tcnVsZT4KLSAgICAgICAgPGZyb20tdmlldy1pZD4qPC9mcm9tLXZpZXctaWQ+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmhvbWU8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9ob21lLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICA8L25hdmlnYXRpb24tcnVsZT4KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjg1MmM4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLSAgICAgICAgIHZlcnNpb249IjIuNCI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+TXlQcm9qZWN0IHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkRFRkFVTFRfU1VGRklYPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+LnhodG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkVOQUJMRV9MSUdIVFdFSUdIVF9ESUFMT0dTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5ESVNBQkxFX0NPTlRFTlRfQ09NUFJFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkFMVEVSTkFURV9WSUVXX0hBTkRMRVI8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jb20uc3VuLmZhY2VsZXRzLkZhY2VsZXRWaWV3SGFuZGxlcjwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5VU0VfQVBQTElDQVRJT05fVklFV19DQUNIRTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkNIQU5HRV9QRVJTSVNURU5DRTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnNlc3Npb248L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+U3RhdGUgc2F2aW5nIG1ldGhvZDogImNsaWVudCIgb3IgInNlcnZlciIgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIFNlZSBKU0YgU3BlY2lmaWNhdGlvbiAyLjUuMwotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIGFtb3VudCAoZGVmYXVsdCA9IDIwKSBvZiB0aGUgbGF0ZXN0IHZpZXdzIGFyZSBzdG9yZWQgaW4gc2Vzc2lvbi4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLk5VTUJFUl9PRl9WSUVXU19JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpIGFuZCBpZgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OIGlzIHRydWUgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzZXJpYWxpemVkIHN0YXRlIHdpbGwgYmUgY29tcHJlc3NlZCBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBjb21wcmVzc2VkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcGFyYW1ldGVyIHRlbGxzIE15RmFjZXMgaWYgamF2YXNjcmlwdCBjb2RlIHNob3VsZCBiZSBhbGxvd2VkIGluIHRoZQotICAgICAgICAgICAgcmVuZGVyZWQgSFRNTCBvdXRwdXQuCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUKLSAgICAgICAgICAgIHRoYXQgc3VibWl0cyB0aGUgY29ycmVzcG9uZGluZyBmb3JtLgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBub3QgYWxsb3dlZCwgdGhlIHN0YXRlIHNhdmluZyBpbmZvIGFuZCBuZXN0ZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLgotICAgICAgICAgICAgaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90Ci0gICAgICAgICAgICBpbmZsdWVuY2UgdGhlIEhUTUwgY29kZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUFJFVFRZX0hUTUw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCBhIGphdmFzY3JpcHQgZnVuY3Rpb24gd2lsbCBiZSByZW5kZXJlZCB0aGF0IGlzIGFibGUgdG8gcmVzdG9yZSB0aGUKLSAgICAgICAgICAgIGZvcm1lciB2ZXJ0aWNhbCBzY3JvbGwgb24gZXZlcnkgcmVxdWVzdC4gQ29udmVuaWVudCBmZWF0dXJlIGlmIHlvdSBoYXZlIHBhZ2VzCi0gICAgICAgICAgICB3aXRoIGxvbmcgbGlzdHMgYW5kIHlvdSBkbyBub3Qgd2FudCB0aGUgYnJvd3NlciBwYWdlIHRvIGFsd2F5cyBqdW1wIHRvIHRoZSB0b3AKLSAgICAgICAgICAgIGlmIHlvdSB0cmlnZ2VyIGEgbGluayBvciBidXR0b24gYWN0aW9uIHRoYXQgc3RheXMgb24gdGhlIHNhbWUgcGFnZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJmYWxzZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFVVE9fU0NST0xMPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Vc2VkIGZvciBlbmNyeXB0aW5nIHZpZXcgc3RhdGUuIE9ubHkgcmVsZXZhbnQgZm9yIGNsaWVudCBzaWRlCi0gICAgICAgICAgICBzdGF0ZSBzYXZpbmcuIFNlZSBNeUZhY2VzIHdpa2kvd2ViIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRUNSRVQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWYWxpZGF0ZSBtYW5hZ2VkIGJlYW5zLCBuYXZpZ2F0aW9uIHJ1bGVzIGFuZCBlbnN1cmUgdGhhdCBmb3JtcyBhcmUgbm90IG5lc3RlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlZBTElEQVRFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPCEtLSBMaXN0ZW5lciwgdG8gYWxsb3cgSmV0dHkgc2VydmluZyBNeUZhY2VzIGFwcHMgLS0+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLndlYmFwcC5TdGFydHVwU2VydmxldENvbnRleHRMaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+Ci0gICAgPC9saXN0ZW5lcj4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCAtLT4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICAgIDwvc2VydmxldD4KLQotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPnJlc291cmNlczwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlJlc291cmNlU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8ZmlsdGVyPgotICAgICAgICA8ZmlsdGVyLW5hbWU+dHJpbmlkYWQ8L2ZpbHRlci1uYW1lPgotICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC53ZWJhcHAuVHJpbmlkYWRGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KLSAgICA8L2ZpbHRlcj4KLQotICAgIDxmaWx0ZXItbWFwcGluZz4KLSAgICAgICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgPC9maWx0ZXItbWFwcGluZz4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCBNYXBwaW5ncyAtLT4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPiouZmFjZXM8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9hZGYvKjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbCBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDMyNGFhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08aHRtbD4NCi0NCi08aGVhZD4NCi0gICAgPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDsgVVJMPXBhZ2VzL2hvbWUuZmFjZXMiPg0KLTwvaGVhZD4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbCBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYTQxYTUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTx0cjpkb2N1bWVudA0KLSAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIg0KLSAgICAgICAgeG1sbnM6Yz0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3RsL2NvcmUiPg0KLSAgICA8ZjpmYWNldCBuYW1lPSJtZXRhQ29udGFpbmVyIj4NCi0gICAgICAgIDx0aXRsZT5zZXYtZW4gZmVhdHVyZS1zZXQgZGVtbyAwMTwvdGl0bGU+DQotICAgIDwvZjpmYWNldD4NCi0NCi0gICAgPHRyaDpib2R5Pg0KLQ0KLSAgICAgICAgPCEtLSBvcmlnaW5hbCAtLT4NCi0gICAgICAgIDxkaXYgaWQ9IndyYXAiPg0KLQ0KLSAgICAgICAgICAgIDx0cjpmb3JtIGlkPSJmb3JtIiBkZWZhdWx0Q29tbWFuZD0iZGVmYXVsdEJ1dHRvbiI+DQotICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1haW4iPg0KLSAgICAgICAgICAgICAgICAgICAgPHVpOmluc2VydCBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ1bmRlcl9jb25zdHJ1Y3Rpb24iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+IXNpdGUgdW5kZXIgY29uc3RydWN0aW9uITwvaDI+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBjb250ZW50IG9mIHRoaXMgc2l0ZSBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSBtb21lbnQuPC9wPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC91aTppbnNlcnQ+DQotICAgICAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICAgIDwvdHI6Zm9ybT4NCi0gICAgICAgICAgICA8dHI6bWVzc2FnZXMgZ2xvYmFsT25seT0idHJ1ZSIvPg0KLQ0KLSAgICAgICAgPC9kaXY+DQotICAgIDwvdHJoOmJvZHk+DQotDQotDQotPC90cjpkb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlkY2QwMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDx0cjpwYW5lbEZvcm1MYXlvdXQ+DQotDQotICAgICAgICAgICAgPHVpOnJlbW92ZT4NCi0gICAgICAgICAgICAgICAganVzdCBmb3IgdGhlIGRlbW8gd2UgYXJlIHVzaW5nIHR3byBpbnB1dCBjb21wb25lbnRzDQotICAgICAgICAgICAgPC91aTpyZW1vdmU+DQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ib2xkIG5pY2sgbmFtZSIgcmVhZE9ubHk9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLm5pY2tOYW1lfSIvPg0KLQ0KLSAgICAgICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im5pY2sgbmFtZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5uZXdOaWNrTmFtZX0iLz4NCi0NCi0gICAgICAgIDwvdHI6cGFuZWxGb3JtTGF5b3V0Pg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UudXBkYXRlTmlja05hbWV9Ii8+DQotDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9wYXNzd29yZC54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxNDVmNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDx0cjpwYW5lbEZvcm1MYXlvdXQ+DQotDQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ib2xkIHBhc3N3b3JkIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLm9sZFBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+DQotDQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibmV3IHBhc3N3b3JkIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+DQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0icmUtZW50ZXIgcGFzc3dvcmQiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGFzc3dvcmRSZXBlYXRlZH0iIHNlY3JldD0idHJ1ZSIvPg0KLQ0KLSAgICAgICAgPC90cjpwYW5lbEZvcm1MYXlvdXQ+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJzYXZlIiBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS5maW5pc2h9Ii8+DQotDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbCBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzBiMjlkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9ImFkZCB1c2VyIiBhY3Rpb249ImFkZFVzZXIiLz48YnIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0iY2hhbmdlIG5pY2sgbmFtZSIgYWN0aW9uPSJjaGFuZ2VOaWNrTmFtZSIvPjxici8+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJjaGFuZ2UgcGFzc3dvcmQiIGFjdGlvbj0iY2hhbmdlUGFzc3dvcmQiLz4NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzQwNDE4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgPHRyOnBhbmVsRm9ybUxheW91dD4NCi0NCi0gICAgICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJuaWNrIG5hbWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLm5pY2tOYW1lfSIvPg0KLSAgICAgICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9ImUtbWFpbCIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5lbWFpbH0iLz4NCi0NCi0gICAgICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJmaXJzdCBuYW1lIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5maXJzdE5hbWV9Ii8+DQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibGFzdCBuYW1lIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5sYXN0TmFtZX0iLz4NCi0gICAgICAgICAgICA8dHI6aW5wdXREYXRlIGxhYmVsPSJiaXJ0aGRheSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24uYmlydGhkYXl9Ij4NCi0gICAgICAgICAgICAgICAgPHRyOmNvbnZlcnREYXRlVGltZSB0eXBlPSJkYXRlIiBkYXRlU3R5bGU9InNob3J0Ii8+DQotICAgICAgICAgICAgPC90cjppbnB1dERhdGU+DQotICAgICAgICAgICAgPHRyOmlucHV0RGF0ZSBsYWJlbD0iZmluYWwgZXhhbSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24uZmluYWxFeGFtfSI+DQotICAgICAgICAgICAgICAgIDx0cjpjb252ZXJ0RGF0ZVRpbWUgdHlwZT0iZGF0ZSIgZGF0ZVN0eWxlPSJzaG9ydCIvPg0KLSAgICAgICAgICAgIDwvdHI6aW5wdXREYXRlPg0KLQ0KLSAgICAgICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im51bWJlciBvZiBzaWJsaW5ncyIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5udW1iZXJPZlNpYmxpbmdzfSIvPg0KLQ0KLSAgICAgICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9InBhc3N3b3JkIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+DQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0icmUtZW50ZXIgcGFzc3dvcmQiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGFzc3dvcmRSZXBlYXRlZH0iIHNlY3JldD0idHJ1ZSIvPg0KLQ0KLSAgICAgICAgPC90cjpwYW5lbEZvcm1MYXlvdXQ+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJzYXZlIiBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS5maW5pc2h9Ii8+DQotDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9oZWxsb19qcGEvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2hlbGxvX2pwYS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTkyMGFkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2hlbGxvX2pwYS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX2pwYTwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBoZWxsbyBqcGE8L25hbWU+DQotICAgIDx2ZXJzaW9uPiR7YnVpbGQudmVyc2lvbn08L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+JHtidWlsZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2J1aWxkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2J1aWxkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIA0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qc3RsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzdGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4gICAgICAgIA0KLQ0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvaGVsbG9fanBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9oZWxsb19qcGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5NGVhNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9oZWxsb19qcGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuazsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5kb21haW4uUGVyc29uOwotCi0vKioKLSAqIEEgdHlwaWNhbCBzaW1wbGUgYmFja2luZyBiZWFuLCB0aGF0IGlzIGJhY2tlZCB0byA8Y29kZT5oZWxsb3dvcmxkLmpzcDwvY29kZT4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZENvbnRyb2xsZXIKLXsKLQotICAgIC8vcHJvcGVydGllcwotICAgIHByaXZhdGUgUGVyc29uIHBlcnNvbjsKLQotICAgIC8qKgotICAgICAqIGRlZmF1bHQgZW1wdHkgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgSGVsbG9Xb3JsZENvbnRyb2xsZXIoKQotICAgIHsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS1nZXR0ZXIgJiBzZXR0ZXIKLQotICAgIHB1YmxpYyBQZXJzb24gZ2V0UGVyc29uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwZXJzb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbiBwZXJzb24pCi0gICAgewotICAgICAgICB0aGlzLnBlcnNvbiA9IHBlcnNvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdGhhdCBpcyBiYWNrZWQgdG8gYSBzdWJtaXQgYnV0dG9uIG9mIGEgZm9ybS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHNlbmQoKQotICAgIHsKLSAgICAgICAgLy9kbyByZWFsIGxvZ2ljLCByZXR1cm4gYSBzdHJpbmcgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciB0aGUgbmF2aWdhdGlvbiBzeXN0ZW0gb2YgSlNGCi0gICAgICAgIHJldHVybiAic3VjY2VzcyI7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2hlbGxvX2pwYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9oZWxsb19qcGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvZG9tYWluL1BlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2E1MGJiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2hlbGxvX2pwYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluOw0KLQ0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47DQotDQotcHVibGljIGNsYXNzIFBlcnNvbg0KLXsNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9oZWxsb19qcGEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2hlbGxvX2pwYS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTg4YWI5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2hlbGxvX2pwYS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZmFjZXMtY29uZmlnIHZlcnNpb249IjEuMiIgCi0gICAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiPgotCQotCTwhLS0gbWFuYWdlZCBiZWFucyBvZiB0aGUgc2ltcGxlIGhlbGxvIHdvcmxkIGFwcCAtLT4KLQk8bWFuYWdlZC1iZWFuPgotCQk8bWFuYWdlZC1iZWFuLW5hbWU+aGVsbG9Xb3JsZDwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0JCTxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLkhlbGxvV29ybGRDb250cm9sbGVyPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0JCTxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPgotICAgICAgICA8bWFuYWdlZC1wcm9wZXJ0eT4KLSAgICAgICAgICAgIDxwcm9wZXJ0eS1uYW1lPnBlcnNvbjwvcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDx2YWx1ZT4je3BlcnNvbn08L3ZhbHVlPgotICAgICAgICA8L21hbmFnZWQtcHJvcGVydHk+Ci0gICAgPC9tYW5hZ2VkLWJlYW4+Ci0KLQk8bWFuYWdlZC1iZWFuPgotCQk8bWFuYWdlZC1iZWFuLW5hbWU+cGVyc29uPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLQkJPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluLlBlcnNvbjwvbWFuYWdlZC1iZWFuLWNsYXNzPgotCQk8bWFuYWdlZC1iZWFuLXNjb3BlPnNlc3Npb248L21hbmFnZWQtYmVhbi1zY29wZT4KLQk8L21hbmFnZWQtYmVhbj4KLQotCTwhLS0gbmF2aWdhdGlvbiBydWxlcyBmb3IgaGVsbG9Xb3JsZC5qc3AgLS0+Ci0JPG5hdmlnYXRpb24tcnVsZT4KLQkJPGZyb20tdmlldy1pZD4vaGVsbG9Xb3JsZC5qc3A8L2Zyb20tdmlldy1pZD4KLQkJPG5hdmlnYXRpb24tY2FzZT4KLQkJCTxmcm9tLW91dGNvbWU+c3VjY2VzczwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L3BhZ2UyLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0JCi0JPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciBwYWdlMi5qc3AgLS0+Ci0JPG5hdmlnYXRpb24tcnVsZT4KLQkJPGZyb20tdmlldy1pZD4vcGFnZTIuanNwPC9mcm9tLXZpZXctaWQ+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPmJhY2s8L2Zyb20tb3V0Y29tZT4KLQkJCTx0by12aWV3LWlkPi9oZWxsb1dvcmxkLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9oZWxsb19qcGEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2hlbGxvX2pwYS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTRhMTgzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2hlbGxvX2pwYS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCi0gICAgICAgICB2ZXJzaW9uPSIyLjQiPgotCi0gICAgPGRlc2NyaXB0aW9uPk15UHJvamVjdCB3ZWIueG1sPC9kZXNjcmlwdGlvbj4KLQotICAgIDwhLS1vcHRpb25hbDogY29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIFVSSXMgb2YgKGFkZGl0aW9uYWwpIGZhY2VzIGNvbmZpZyBmaWxlcy4KLSAgICAgICAgICAgIChlLmcuIC9XRUItSU5GL215LWNvbmZpZy54bWwpCi0gICAgICAgICAgICBTZWUgSlNGIDEuMCBQUkQyLCAxMC4zLjIKLSAgICAgICAgICAgIEF0dGVudGlvbjogWW91IGRvIG5vdCBuZWVkIHRvIHB1dCAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGluIGhlcmUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkNPTkZJR19GSUxFUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi9XRUItSU5GL2V4YW1wbGVzLWNvbmZpZy54bWw8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbS0tPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+U3RhdGUgc2F2aW5nIG1ldGhvZDogImNsaWVudCIgb3IgInNlcnZlciIgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIFNlZSBKU0YgU3BlY2lmaWNhdGlvbiAyLjUuMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jbGllbnQ8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgRGVmaW5lcyB0aGUgYW1vdW50IChkZWZhdWx0ID0gMjApIG9mIHRoZSBsYXRlc3Qgdmlld3MgYXJlIHN0b3JlZCBpbiBzZXNzaW9uLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5OVU1CRVJfT0ZfVklFV1NfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPjIwPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzdGF0ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbSBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uCi0gICAgICAgICAgICBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpIGFuZCBpZgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OIGlzIHRydWUgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzZXJpYWxpemVkIHN0YXRlIHdpbGwgYmUgY29tcHJlc3NlZCBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBjb21wcmVzc2VkLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DT01QUkVTU19TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhpcyBwYXJhbWV0ZXIgdGVsbHMgTXlGYWNlcyBpZiBqYXZhc2NyaXB0IGNvZGUgc2hvdWxkIGJlIGFsbG93ZWQgaW4gdGhlCi0gICAgICAgICAgICByZW5kZXJlZCBIVE1MIG91dHB1dC4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgYWxsb3dlZCwgY29tbWFuZF9saW5rIGFuY2hvcnMgd2lsbCBoYXZlIGphdmFzY3JpcHQgY29kZQotICAgICAgICAgICAgdGhhdCBzdWJtaXRzIHRoZSBjb3JyZXNwb25kaW5nIGZvcm0uCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIG5vdCBhbGxvd2VkLCB0aGUgc3RhdGUgc2F2aW5nIGluZm8gYW5kIG5lc3RlZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICB3aWxsIGJlIGFkZGVkIGFzIHVybCBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFMTE9XX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5ERVRFQ1RfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCByZW5kZXJlZCBIVE1MIGNvZGUgd2lsbCBiZSBmb3JtYXR0ZWQsIHNvIHRoYXQgaXQgaXMgImh1bWFuIHJlYWRhYmxlIi4KLSAgICAgICAgICAgIGkuZS4gYWRkaXRpb25hbCBsaW5lIHNlcGFyYXRvcnMgYW5kIHdoaXRlc3BhY2Ugd2lsbCBiZSB3cml0dGVuLCB0aGF0IGRvIG5vdAotICAgICAgICAgICAgaW5mbHVlbmNlIHRoZSBIVE1MIGNvZGUuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUFJFVFRZX0hUTUw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCBhIGphdmFzY3JpcHQgZnVuY3Rpb24gd2lsbCBiZSByZW5kZXJlZCB0aGF0IGlzIGFibGUgdG8gcmVzdG9yZSB0aGUKLSAgICAgICAgICAgIGZvcm1lciB2ZXJ0aWNhbCBzY3JvbGwgb24gZXZlcnkgcmVxdWVzdC4gQ29udmVuaWVudCBmZWF0dXJlIGlmIHlvdSBoYXZlIHBhZ2VzCi0gICAgICAgICAgICB3aXRoIGxvbmcgbGlzdHMgYW5kIHlvdSBkbyBub3Qgd2FudCB0aGUgYnJvd3NlciBwYWdlIHRvIGFsd2F5cyBqdW1wIHRvIHRoZSB0b3AKLSAgICAgICAgICAgIGlmIHlvdSB0cmlnZ2VyIGEgbGluayBvciBidXR0b24gYWN0aW9uIHRoYXQgc3RheXMgb24gdGhlIHNhbWUgcGFnZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJmYWxzZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQVVUT19TQ1JPTEw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlVzZWQgZm9yIGVuY3J5cHRpbmcgdmlldyBzdGF0ZS4gT25seSByZWxldmFudCBmb3IgY2xpZW50IHNpZGUKLSAgICAgICAgICAgIHN0YXRlIHNhdmluZy4gU2VlIE15RmFjZXMgd2lraS93ZWIgc2l0ZSBkb2N1bWVudGF0aW9uIGZvciBpbnN0cnVjdGlvbnMKLSAgICAgICAgICAgIG9uIGhvdyB0byBjb25maWd1cmUgYW4gYXBwbGljYXRpb24gZm9yIGRpZmZlbmVudCBlbmNyeXB0aW9uIHN0cmVuZ3Rocy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFQ1JFVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPk56WTFORE15TVRBPTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZhbGlkYXRlIG1hbmFnZWQgYmVhbnMsIG5hdmlnYXRpb24gcnVsZXMgYW5kIGVuc3VyZSB0aGF0IGZvcm1zIGFyZSBub3QgbmVzdGVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuVkFMSURBVEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRyZWF0IHJlYWRvbmx5IHNhbWUgYXMgaWYgZGlzYWJsZWQgYXR0cmlidXRlIHdhcyBzZXQgZm9yIHNlbGVjdCBlbGVtZW50cy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlJFQURPTkxZX0FTX0RJU0FCTEVEX0ZPUl9TRUxFQ1RTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVXNlIHRoZSBkZWZpbmVkIGNsYXNzIGFzIHRoZSBjbGFzcyB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgcmVzb3VyY2UgaXMgYWRkZWQgdG8gdGhlCi0gICAgICAgICAgICBFeHRlbnNpb25GaWx0ZXIgaGFuZGxpbmcuIFVzaW5nIFN0cmVhbWluZ0FkZFJlc291cmNlIGhlcmUgaGVscHMgd2l0aCBwZXJmb3JtYW5jZS4gSWYgeW91IHdhbnQgdG8gYWRkCi0gICAgICAgICAgICBjdXN0b20gY29tcG9uZW50cyBhbmQgd2FudCB0byB1c2UgdGhlIEV4dGVuc2lvbkZpbHRlciwgeW91IG5lZWQgdG8gcHJvdmlkZSB5b3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBoZXJlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUREX1JFU09VUkNFX0NMQVNTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLnV0aWwuRGVmYXVsdEFkZFJlc291cmNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgICAgICAKLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWaXJ0dWFsIHBhdGggaW4gdGhlIFVSTCB3aGljaCB0cmlnZ2VycyBsb2FkaW5nIG9mIHJlc291cmNlcyBmb3IgdGhlIE15RmFjZXMgZXh0ZW5kZWQgY29tcG9uZW50cwotICAgICAgICAgICAgaW4gdGhlIEV4dGVuc2lvbkZpbHRlci4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlJFU09VUkNFX1ZJUlRVQUxfUEFUSDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi9mYWNlcy9teUZhY2VzRXh0ZW5zaW9uUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgQ2hlY2sgaWYgdGhlIGV4dGVuc2lvbnMtZmlsdGVyIGhhcyBiZWVuIHByb3Blcmx5IGNvbmZpZ3VyZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DSEVDS19FWFRFTlNJT05TX0ZJTFRFUjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgRGVmaW5lIHBhcnRpYWwgc3RhdGUgc2F2aW5nIGFzIHRydWUvZmFsc2UuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlBBUlRJQUxfU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotCi0gICAgPCEtLSBMaXN0ZW5lciwgdG8gYWxsb3cgSmV0dHkgc2VydmluZyBNeUZhY2VzIGFwcHMgLS0+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLndlYmFwcC5TdGFydHVwU2VydmxldENvbnRleHRMaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+Ci0gICAgPC9saXN0ZW5lcj4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCAtLT4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICAgIDwvc2VydmxldD4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCBNYXBwaW5nIC0tPgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+Ki5qc2Y8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPCEtLSBXZWxjb21lIGZpbGVzIC0tPgotICAgIDx3ZWxjb21lLWZpbGUtbGlzdD4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5qc3A8L3dlbGNvbWUtZmlsZT4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+Ci0gICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KLQotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvaGVsbG9fanBhL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcCBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2hlbGxvX2pwYS9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NDljYmYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvaGVsbG9fanBhL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIzIj4KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9Im5hbWUiIHZhbHVlPSJQbGVhc2UgZW50ZXIgeW91ciBuYW1lIiAvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0ibmFtZSIgdmFsdWU9IiN7aGVsbG9Xb3JsZC5wZXJzb24ubmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0ibmFtZSIgc2hvd1N1bW1hcnk9ImZhbHNlIiBzaG93RGV0YWlsPSJ0cnVlIi8+Ci0KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJQcmVzcyBtZSIgYWN0aW9uPSIje2hlbGxvV29ybGQuc2VuZH0iLz4KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4KLSAgICAgICAgICAgICAgPC9oOnBhbmVsR3JpZD4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICA8L2Y6dmlldz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9oZWxsb19qcGEvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcCBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2hlbGxvX2pwYS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjljMjI4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2hlbGxvX2pwYS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08JUAgcGFnZSBzZXNzaW9uPSJmYWxzZSIlPgotPCUKLXJlc3BvbnNlLnNlbmRSZWRpcmVjdCgiaGVsbG9Xb3JsZC5qc2YiKTsKLSU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvaGVsbG9fanBhL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9oZWxsb19qcGEvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU2Yzc1Zi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9oZWxsb19qcGEvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgICAgPGgyPjxoOm91dHB1dFRleHQgdmFsdWU9IkhlbGxvICN7aGVsbG9Xb3JsZC5wZXJzb24ubmFtZX0uIFdlIGhvcGUgeW91IGVuam95IEFwYWNoZSBNeUZhY2VzIi8+PC9oMj4KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kTGluayBhY3Rpb249ImJhY2siPgotICAgICAgICAgICAgICAgICAgICA8aDpvdXRwdXRUZXh0IHZhbHVlPSJIb21lIi8+Ci0gICAgICAgICAgICAgICAgPC9oOmNvbW1hbmRMaW5rPgotICAgICAgICAgICAgPC9oOmZvcm0+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgIDwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvaGVsbG9fd29ybGQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcwMmI5MS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIGhlbGxvIHdvcmxkPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4ke2J1aWxkLnZlcnNpb259PC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPiR7YnVpbGQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtidWlsZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtidWlsZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIA0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIA0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+anN0bDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3RsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMjwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+ICAgICAgICANCi0NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTExOGQ0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbms7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOwotCi0vKioKLSAqIEEgdHlwaWNhbCBzaW1wbGUgYmFja2luZyBiZWFuLCB0aGF0IGlzIGJhY2tlZCB0byA8Y29kZT5oZWxsb3dvcmxkLmpzcDwvY29kZT4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZENvbnRyb2xsZXIKLXsKLQotICAgIC8vcHJvcGVydGllcwotICAgIEBSZXF1aXJlZAotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBkZWZhdWx0IGVtcHR5IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIEhlbGxvV29ybGRDb250cm9sbGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tZ2V0dGVyICYgc2V0dGVyCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB0aGF0IGlzIGJhY2tlZCB0byBhIHN1Ym1pdCBidXR0b24gb2YgYSBmb3JtLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgc2VuZCgpCi0gICAgewotICAgICAgICAvL2RvIHJlYWwgbG9naWMsIHJldHVybiBhIHN0cmluZyB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuYXZpZ2F0aW9uIHN5c3RlbSBvZiBKU0YKLSAgICAgICAgcmV0dXJuICJzdWNjZXNzIjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYmVhZTcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGZhY2VzLWNvbmZpZyB2ZXJzaW9uPSIxLjIiIAotICAgIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIj4KLQkKLQk8IS0tIG1hbmFnZWQgYmVhbnMgb2YgdGhlIHNpbXBsZSBoZWxsbyB3b3JsZCBhcHAgLS0+Ci0JPG1hbmFnZWQtYmVhbj4KLQkJPG1hbmFnZWQtYmVhbi1uYW1lPmhlbGxvV29ybGQ8L21hbmFnZWQtYmVhbi1uYW1lPgotCQk8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5IZWxsb1dvcmxkQ29udHJvbGxlcjwvbWFuYWdlZC1iZWFuLWNsYXNzPgotCQk8bWFuYWdlZC1iZWFuLXNjb3BlPnJlcXVlc3Q8L21hbmFnZWQtYmVhbi1zY29wZT4KLQk8L21hbmFnZWQtYmVhbj4KLQkKLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIGhlbGxvV29ybGQuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L2hlbGxvV29ybGQuanNwPC9mcm9tLXZpZXctaWQ+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPnN1Y2Nlc3M8L2Zyb20tb3V0Y29tZT4KLQkJCTx0by12aWV3LWlkPi9wYWdlMi5qc3A8L3RvLXZpZXctaWQ+Ci0JCTwvbmF2aWdhdGlvbi1jYXNlPgotCTwvbmF2aWdhdGlvbi1ydWxlPgotCQotCTwhLS0gbmF2aWdhdGlvbiBydWxlcyBmb3IgcGFnZTIuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L3BhZ2UyLmpzcDwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5iYWNrPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vaGVsbG9Xb3JsZC5qc3A8L3RvLXZpZXctaWQ+Ci0JCTwvbmF2aWdhdGlvbi1jYXNlPgotCTwvbmF2aWdhdGlvbi1ydWxlPgotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNGExODMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgotICAgICAgICAgdmVyc2lvbj0iMi40Ij4KLQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8IS0tb3B0aW9uYWw6IGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Db21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBVUklzIG9mIChhZGRpdGlvbmFsKSBmYWNlcyBjb25maWcgZmlsZXMuCi0gICAgICAgICAgICAoZS5nLiAvV0VCLUlORi9teS1jb25maWcueG1sKQotICAgICAgICAgICAgU2VlIEpTRiAxLjAgUFJEMiwgMTAuMy4yCi0gICAgICAgICAgICBBdHRlbnRpb246IFlvdSBkbyBub3QgbmVlZCB0byBwdXQgL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBpbiBoZXJlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5DT05GSUdfRklMRVM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0tLT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBTZWUgSlNGIFNwZWNpZmljYXRpb24gMi41LjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIGFtb3VudCAoZGVmYXVsdCA9IDIwKSBvZiB0aGUgbGF0ZXN0IHZpZXdzIGFyZSBzdG9yZWQgaW4gc2Vzc2lvbi48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuTlVNQkVSX09GX1ZJRVdTX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc3RhdGUgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0gYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLgotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KSBhbmQgaWYKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgY29tcHJlc3NlZC48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcGFyYW1ldGVyIHRlbGxzIE15RmFjZXMgaWYgamF2YXNjcmlwdCBjb2RlIHNob3VsZCBiZSBhbGxvd2VkIGluIHRoZQotICAgICAgICAgICAgcmVuZGVyZWQgSFRNTCBvdXRwdXQuCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUKLSAgICAgICAgICAgIHRoYXQgc3VibWl0cyB0aGUgY29ycmVzcG9uZGluZyBmb3JtLgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBub3QgYWxsb3dlZCwgdGhlIHN0YXRlIHNhdmluZyBpbmZvIGFuZCBuZXN0ZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BTExPV19KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuREVURUNUX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgcmVuZGVyZWQgSFRNTCBjb2RlIHdpbGwgYmUgZm9ybWF0dGVkLCBzbyB0aGF0IGl0IGlzICJodW1hbiByZWFkYWJsZSIuCi0gICAgICAgICAgICBpLmUuIGFkZGl0aW9uYWwgbGluZSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIHdpbGwgYmUgd3JpdHRlbiwgdGhhdCBkbyBub3QKLSAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgSFRNTCBjb2RlLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlBSRVRUWV9IVE1MPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlCi0gICAgICAgICAgICBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuIENvbnZlbmllbnQgZmVhdHVyZSBpZiB5b3UgaGF2ZSBwYWdlcwotICAgICAgICAgICAgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGJyb3dzZXIgcGFnZSB0byBhbHdheXMganVtcCB0byB0aGUgdG9wCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuCi0gICAgICAgICAgICBEZWZhdWx0OiAiZmFsc2UiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFVVE9fU0NST0xMPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Vc2VkIGZvciBlbmNyeXB0aW5nIHZpZXcgc3RhdGUuIE9ubHkgcmVsZXZhbnQgZm9yIGNsaWVudCBzaWRlCi0gICAgICAgICAgICBzdGF0ZSBzYXZpbmcuIFNlZSBNeUZhY2VzIHdpa2kvd2ViIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRUNSRVQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWYWxpZGF0ZSBtYW5hZ2VkIGJlYW5zLCBuYXZpZ2F0aW9uIHJ1bGVzIGFuZCBlbnN1cmUgdGhhdCBmb3JtcyBhcmUgbm90IG5lc3RlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlZBTElEQVRFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUcmVhdCByZWFkb25seSBzYW1lIGFzIGlmIGRpc2FibGVkIGF0dHJpYnV0ZSB3YXMgc2V0IGZvciBzZWxlY3QgZWxlbWVudHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5SRUFET05MWV9BU19ESVNBQkxFRF9GT1JfU0VMRUNUUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFVzZSB0aGUgZGVmaW5lZCBjbGFzcyBhcyB0aGUgY2xhc3Mgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiBhIHJlc291cmNlIGlzIGFkZGVkIHRvIHRoZQotICAgICAgICAgICAgRXh0ZW5zaW9uRmlsdGVyIGhhbmRsaW5nLiBVc2luZyBTdHJlYW1pbmdBZGRSZXNvdXJjZSBoZXJlIGhlbHBzIHdpdGggcGVyZm9ybWFuY2UuIElmIHlvdSB3YW50IHRvIGFkZAotICAgICAgICAgICAgY3VzdG9tIGNvbXBvbmVudHMgYW5kIHdhbnQgdG8gdXNlIHRoZSBFeHRlbnNpb25GaWx0ZXIsIHlvdSBuZWVkIHRvIHByb3ZpZGUgeW91ciBjdXN0b20gaW1wbGVtZW50YXRpb24gaGVyZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFERF9SRVNPVVJDRV9DTEFTUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC51dGlsLkRlZmF1bHRBZGRSZXNvdXJjZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAgICAgCi0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmlydHVhbCBwYXRoIGluIHRoZSBVUkwgd2hpY2ggdHJpZ2dlcnMgbG9hZGluZyBvZiByZXNvdXJjZXMgZm9yIHRoZSBNeUZhY2VzIGV4dGVuZGVkIGNvbXBvbmVudHMKLSAgICAgICAgICAgIGluIHRoZSBFeHRlbnNpb25GaWx0ZXIuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5SRVNPVVJDRV9WSVJUVUFMX1BBVEg8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vZmFjZXMvbXlGYWNlc0V4dGVuc2lvblJlc291cmNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIENoZWNrIGlmIHRoZSBleHRlbnNpb25zLWZpbHRlciBoYXMgYmVlbiBwcm9wZXJseSBjb25maWd1cmVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ0hFQ0tfRVhURU5TSU9OU19GSUxURVI8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIERlZmluZSBwYXJ0aWFsIHN0YXRlIHNhdmluZyBhcyB0cnVlL2ZhbHNlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5QQVJUSUFMX1NUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLQotICAgIDwhLS0gTGlzdGVuZXIsIHRvIGFsbG93IEpldHR5IHNlcnZpbmcgTXlGYWNlcyBhcHBzIC0tPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy53ZWJhcHAuU3RhcnR1cFNlcnZsZXRDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZyAtLT4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPiouanNmPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguanNwPC93ZWxjb21lLWZpbGU+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcCBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU2NWEzZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgICA8Zjp2aWV3PgotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPgotICAgICAgICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMyI+Ci0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJuYW1lIiB2YWx1ZT0iUGxlYXNlIGVudGVyIHlvdXIgbmFtZSIgLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9Im5hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQubmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0ibmFtZSIgc2hvd1N1bW1hcnk9InRydWUiIHNob3dEZXRhaWw9ImZhbHNlIi8+Ci0KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJQcmVzcyBtZSIgYWN0aW9uPSIje2hlbGxvV29ybGQuc2VuZH0iLz4KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4KLSAgICAgICAgICAgICAgPC9oOnBhbmVsR3JpZD4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICA8L2Y6dmlldz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI5YzIyOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08JUAgcGFnZSBzZXNzaW9uPSJmYWxzZSIlPgotPCUKLXJlc3BvbnNlLnNlbmRSZWRpcmVjdCgiaGVsbG9Xb3JsZC5qc2YiKTsKLSU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcCBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMTJjNDEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgICAgPGgyPjxoOm91dHB1dFRleHQgdmFsdWU9IkhlbGxvICN7aGVsbG9Xb3JsZC5uYW1lfS4gV2UgaG9wZSB5b3UgZW5qb3kgQXBhY2hlIE15RmFjZXMiLz48L2gyPgotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIGFjdGlvbj0iYmFjayI+Ci0gICAgICAgICAgICAgICAgICAgIDxoOm91dHB1dFRleHQgdmFsdWU9IkhvbWUiLz4KLSAgICAgICAgICAgICAgICA8L2g6Y29tbWFuZExpbms+Ci0gICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgPC9mOnZpZXc+Ci0gICAgPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9leGFtcGxlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjY1Y2UyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL2V4YW1wbGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotDQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBwcm9qZWN0PC9uYW1lPg0KLSAgICA8dmVyc2lvbj4ke2J1aWxkLnZlcnNpb259PC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjEtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8bW9kdWxlcz4NCi0gICAgICAgIDxtb2R1bGU+aGVsbG9fd29ybGQ8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+aGVsbG9fanBhPC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPmZlYXR1cmUtc2V0XzAxPC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPmZhbGxiYWNrX2RlbW88L21vZHVsZT4NCi0gICAgPC9tb2R1bGVzPg0KLQ0KLSAgICA8cHJvcGVydGllcz4NCi0gICAgICAgIDx0cmluaWRhZC52ZXJzaW9uPjEuMi44PC90cmluaWRhZC52ZXJzaW9uPg0KLSAgICA8L3Byb3BlcnRpZXM+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3BhcmVudC9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3BhcmVudC9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi9wYXJlbnQvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3BhcmVudC9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vcGFyZW50L05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhM2RiZDYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vcGFyZW50L05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09Ci09PSAgVmVyc2lvbiAyLjAsIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBNeUZhY2VzIE1hdmVuIFBsdWdpbnMgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOgotCi0gLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgT3JhY2xlIENvcnAsIDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vPi4KLWFuZCBhcmUgbGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIHRoZSAKLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCIKLQotU2VlIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBhbGwgbGljZW5zZXMgCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3BhcmVudC9wb20ueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vcGFyZW50L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2Y2E0ZGEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vcGFyZW50L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLQotICAtIFBhcmVudCBwb20gb2YgYWxsIHRoZSBteWZhY2VzIGV4dGVuc2lvbnMgdmFsaWRhdG9yIHN1YnByb2plY3RzIAotICAgIHRoYXQgaGVscCB0byBidWlsZCBvdGhlciBteWZhY2VzIHByb2plY3RzLgotICAtLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj42PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjIuMS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFByb2plY3QgUGFyZW50PC9uYW1lPgotCi0gICAgPGlzc3VlTWFuYWdlbWVudD4KLSAgICAgICAgPHN5c3RlbT5qaXJhPC9zeXN0ZW0+Ci0gICAgICAgIDx1cmw+aHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0VYVFZBTDwvdXJsPgotICAgIDwvaXNzdWVNYW5hZ2VtZW50PgotCi0gICAgPGNpTWFuYWdlbWVudD4KLSAgICAgICAgPHN5c3RlbT5jb250aW51dW08L3N5c3RlbT4KLSAgICAgICAgPHVybD5odHRwOi8vbXlmYWNlcy56b25lcy5hcGFjaGUub3JnOjgwODAvY29udGludXVtPC91cmw+Ci0gICAgICAgIDxub3RpZmllcnM+Ci0gICAgICAgICAgICA8bm90aWZpZXI+Ci0gICAgICAgICAgICAgICAgPHR5cGU+bWFpbDwvdHlwZT4KLSAgICAgICAgICAgICAgICA8c2VuZE9uU3VjY2Vzcz50cnVlPC9zZW5kT25TdWNjZXNzPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8YWRkcmVzcz5jb21taXRzQG15ZmFjZXMuYXBhY2hlLm9yZzwvYWRkcmVzcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L25vdGlmaWVyPgotICAgICAgICA8L25vdGlmaWVycz4KLSAgICA8L2NpTWFuYWdlbWVudD4KLSAgICAKLSAgICA8aW5jZXB0aW9uWWVhcj4yMDA4PC9pbmNlcHRpb25ZZWFyPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfTwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0KLSAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+Ci0gICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFyY2hpdmU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmU+Ci0gICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgotCi0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgICAgICAgIC0gQ29weSBMSUNFTlNFLnR4dCBhbmQgTk9USUNFLnR4dCBzbyB0aGF0IHRoZXkgYXJlIGluY2x1ZGVkCi0gICAgICAgICAgICAgICAgICAgIC0gaW4gdGhlIC1qYXZhZG9jIGphciBmaWxlIGZvciB0aGUgY29tcG9uZW50LgotICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmphdmFkb2MucmVzb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1zb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vYXBpZG9jcy9NRVRBLUlORiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IkxJQ0VOU0UudHh0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik5PVElDRS50eHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDwhLS0KLSAgICAgICAgICAgICAgICAtIE1ha2UgYSBjaGVja3N0eWxlIHZpb2xhdGlvbiBhIGNvbXBpbGUgZXJyb3IuIE5vdGUgdGhhdCBpZiBhIGNvbXBpbGUgZXJyb3Igb2NjdXJzLAotICAgICAgICAgICAgICAgIC0gZnVydGhlciBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGFyZ2V0L3NpdGUvY2hlY2tzdHlsZS5odG1sIChwcmVzZW50IGV2ZW4gd2hlbgotICAgICAgICAgICAgICAgIC0ganVzdCB0aGUgY29tcGlsZSBnb2FsIGFuZCBub3QgdGhlIHNpdGUgZ29hbCBoYXMgYmVlbiBydW4pLiBOb3RlIGFsc28gdGhhdCBjaGlsZAotICAgICAgICAgICAgICAgIC0gcHJvamVjdHMgbWF5IHJlZGVjbGFyZSB0aGlzIHBsdWdpbiBhbmQgcHJvdmlkZSBkaWZmZXJlbnQgY29uZmlndXJhdGlvbiBzZXR0aW5ncwotICAgICAgICAgICAgICAgIC0gdG8gdXNlIGRpZmZlcmVudCBjaGVja3MgKG1vcmUgb3IgbGVzcyBzdHJpY3QgdGhhbiB0aGUgZGVmYXVsdCkuCi0gICAgICAgICAgICAtLT4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY2hlY2tzdHlsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnZlcmlmeS1zdHlsZTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jaGVjazwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1jaGVja3Mtc3RhbmRhcmQueG1sPC9jb25maWdMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGhlYWRlckxvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1oZWFkZXIudHh0PC9oZWFkZXJMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS0gU2V0IGNvbXBpbGUgc291cmNlIGF0IDEuNSwgc2luY2UgdGhlIHRhcmdldCBKU0YgaW1wbCBpcyAxLjIgLS0+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4KLSAgICAgICAgICAgICAgICAgICAgPG9wdGltaXplPmZhbHNlPC9vcHRpbWl6ZT4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLSAgICA8cmVwb3NpdG9yaWVzPgotICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5tYXZlbjItcmVwb3NpdG9yeS5kZXYuamF2YS5uZXQ8L2lkPgotICAgICAgICAgICAgPG5hbWU+SmF2YS5uZXQgUmVwb3NpdG9yeSBmb3IgTWF2ZW48L25hbWU+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9kb3dubG9hZC5qYXZhLm5ldC9tYXZlbi8xLzwvdXJsPgotICAgICAgICAgICAgPGxheW91dD5sZWdhY3k8L2xheW91dD4KLSAgICAgICAgPC9yZXBvc2l0b3J5PgotICAgIDwvcmVwb3NpdG9yaWVzPgotCi0gICAgPHJlcG9ydGluZz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3QtaW5mby1yZXBvcnRzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjAuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbWQtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHJ1bGVzZXRzPgotICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL2Jhc2ljLnhtbDwvcnVsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxydWxlc2V0Pi9ydWxlc2V0cy91bnVzZWRjb2RlLnhtbDwvcnVsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgPC9ydWxlc2V0cz4KLSAgICAgICAgICAgICAgICAgICAgPGxpbmtYcmVmPnRydWU8L2xpbmtYcmVmPgotICAgICAgICAgICAgICAgICAgICA8bWluaW11bVRva2Vucz4xMDA8L21pbmltdW1Ub2tlbnM+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXRKZGs+MS41PC90YXJnZXRKZGs+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGVja3N0eWxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWdMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtY2hlY2tzLW5vcm1hbC54bWw8L2NvbmZpZ0xvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aGVhZGVyTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWhlYWRlci50eHQ8L2hlYWRlckxvY2F0aW9uPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9yZXBvcnRpbmc+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay88L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay88L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rLzwvdXJsPgotICAgIDwvc2NtPgotCi0gICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgICAgIDxzbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8dW5pcXVlVmVyc2lvbj5mYWxzZTwvdW5pcXVlVmVyc2lvbj4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUuc25hcHNob3RzPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBNYXZlbiBTbmFwc2hvdCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1zbmFwc2hvdC1yZXBvc2l0b3J5PC91cmw+Ci0gICAgICAgIDwvc25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICA8c2l0ZT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc2l0ZTwvaWQ+Ci0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3I8L3VybD4KLSAgICAgICAgPC9zaXRlPgotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+Ci0gICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgICAgTk9URTogRXhlY3V0ZSB0aGlzIHByb2ZpbGUgbGlrZQotICAgICAgICAgICAgICAgIG12biBjbGVhbiBzb3VyY2U6amFyIGluc3RhbGwgZGVwbG95IC1EYWx0RGVwbG95bWVudFJlcG9zaXRvcnk9bWF0emV3OjpkZWZhdWx0OjpmaWxlOi8vRk9MREVSIC1QcmVsZWFzZQotICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1ncGctcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wLWFscGhhLTQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+c2lnbi1hcnRpZmFjdHM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2lnbjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvY3M8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc2NtLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT52YWxpZGF0ZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5nZXR0aW5nLXNjbS5yZXZpc2lvbjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnVwZGF0ZTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotICAgIDwvcHJvZmlsZXM+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGJ1aWxkLnZlcnNpb24+MS4yLjEtU05BUFNIT1Q8L2J1aWxkLnZlcnNpb24+Ci0gICAgICAgIDxqc2YudmVyc2lvbj4xLjIuMzwvanNmLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YmM1YzUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1tb2R1bGU8L2FydGlmYWN0SWQ+DQotICAgIDx2ZXJzaW9uPiR7YnVpbGQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIE1vZHVsZTwvbmFtZT4NCi0gICAgPHVybD5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yPC91cmw+DQotDQotICAgIDxtb2R1bGVzPg0KLSAgICAgICAgPG1vZHVsZT5wYXJlbnQ8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+Y29yZTwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT52YWxpZGF0aW9uLW1vZHVsZXM8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+ZXhhbXBsZXM8L21vZHVsZT4NCi0gICAgPC9tb2R1bGVzPg0KLQ0KLSAgICA8cHJvcGVydGllcz4NCi0gICAgICAgIDxidWlsZC52ZXJzaW9uPjEuMi4xLVNOQVBTSE9UPC9idWlsZC52ZXJzaW9uPg0KLSAgICAgICAgPGpzZi52ZXJzaW9uPjEuMi4zPC9qc2YudmVyc2lvbj4NCi0gICAgPC9wcm9wZXJ0aWVzPg0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDMzNjgzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBWYWxpZGF0aW9uLU1vZHVsZXM8L25hbWU+DQotICAgIDx2ZXJzaW9uPiR7YnVpbGQudmVyc2lvbn08L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxtb2R1bGVzPg0KLSAgICAgICAgPG1vZHVsZT5wcm9wZXJ0eS12YWxpZGF0aW9uPC9tb2R1bGU+DQotICAgICAgICA8IS0tbW9kdWxlPmJlYW4tdmFsaWRhdGlvbjwvbW9kdWxlLS0+DQotICAgIDwvbW9kdWxlcz4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7YnVpbGQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYmJlYTQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBQcm9wZXJ0eS1WYWxpZGF0aW9uLU1vZHVsZTwvbmFtZT4NCi0gICAgPHZlcnNpb24+JHtidWlsZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPiR7YnVpbGQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtidWlsZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5wZXJzaXN0ZW5jZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5wZXJzaXN0ZW5jZS1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxyZXNvdXJjZXM+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgIDwvcmVzb3VyY2VzPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YzAzZGIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuSW5pdFN0YXRpY1N0cmF0ZWd5TWFwcGluZ3NQaGFzZUxpc3RlbmVyPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotDQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Jbml0U3RhdGljU3RyYXRlZ3lNYXBwaW5nc1BoYXNlTGlzdGVuZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0luaXRTdGF0aWNTdHJhdGVneU1hcHBpbmdzUGhhc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDY0N2M5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0luaXRTdGF0aWNTdHJhdGVneU1hcHBpbmdzUGhhc2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkFic3RyYWN0U3RhcnR1cENvbmZpZ0xpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSW5pdFN0YXRpY1N0cmF0ZWd5TWFwcGluZ3NQaGFzZUxpc3RlbmVyIGV4dGVuZHMNCi0gICAgICAgIEFic3RyYWN0U3RhcnR1cENvbmZpZ0xpc3RlbmVyDQotew0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGpwYUJhc2VkVmFsaWRhdGlvbiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OOw0KLSAgICAgICAgaWYgKGpwYUJhc2VkVmFsaWRhdGlvbiA9PSBudWxsDQotICAgICAgICAgICAgICAgIHx8ICFqcGFCYXNlZFZhbGlkYXRpb24uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgICAgICAuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmFkZFN0YXRpY1N0cmF0ZWd5TWFwcGluZ1NvdXJjZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuanBhX3N0cmF0ZWd5X21hcHBpbmdzIik7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4M2FlMTkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFybid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICAvL1RPRE8gZG9jdQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fTUVTU0FHRVNfSlBBID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMiKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9KUEFfQkFTRURfVkFMSURBVElPTiIpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vRG91YmxlUmFuZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODJmMDQ5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLUBUYXJnZXQoIHsgTUVUSE9ELCBGSUVMRCB9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1wdWJsaWMgQGludGVyZmFjZSBEb3VibGVSYW5nZQ0KLXsNCi0gICAgZG91YmxlIG1pbmltdW0oKSBkZWZhdWx0IDA7DQotDQotICAgIGRvdWJsZSBtYXhpbXVtKCkgZGVmYXVsdCBEb3VibGUuTUFYX1ZBTFVFOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vSm9pblZhbGlkYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Kb2luVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTY0ZjBkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Kb2luVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLUBUYXJnZXQoIHsgTUVUSE9ELCBGSUVMRCB9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1wdWJsaWMgQGludGVyZmFjZSBKb2luVmFsaWRhdGlvbg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xlbmd0aC5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xlbmd0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODlhYzY2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1AVGFyZ2V0KCB7IE1FVEhPRCwgRklFTEQgfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotcHVibGljIEBpbnRlcmZhY2UgTGVuZ3RoDQotew0KLSAgICBpbnQgbWluaW11bSgpIGRlZmF1bHQgMDsNCi0NCi0gICAgaW50IG1heGltdW0oKSBkZWZhdWx0IEludGVnZXIuTUFYX1ZBTFVFOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZDNiN2YuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLUBUYXJnZXQoIHsgTUVUSE9ELCBGSUVMRCB9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1wdWJsaWMgQGludGVyZmFjZSBMb25nUmFuZ2UNCi17DQotICAgIGxvbmcgbWluaW11bSgpIGRlZmF1bHQgMDsNCi0NCi0gICAgbG9uZyBtYXhpbXVtKCkgZGVmYXVsdCBMb25nLk1BWF9WQUxVRTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlZ2V4LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUmVnZXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRhMWE5Zi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUmVnZXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1AVGFyZ2V0KCB7IE1FVEhPRCwgRklFTEQgfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotcHVibGljIEBpbnRlcmZhY2UgUmVnZXgNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJub19tYXRjaCI7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZC5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMDY3ZWIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotQFRhcmdldCggeyBNRVRIT0QsIEZJRUxEIH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFJlcXVpcmVkDQotew0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZmllbGRfcmVxdWlyZWQiOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vVmFsaWRhdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMDhlZjAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLUBUYXJnZXQoIHsgTUVUSE9ELCBGSUVMRCB9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1wdWJsaWMgQGludGVyZmFjZSBWYWxpZGF0b3INCi17DQotICAgIENsYXNzW10gdmFsdWUoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ0Fubm90YXRpb25FeHRyYWN0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdBbm5vdGF0aW9uRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMDMwM2YuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ0Fubm90YXRpb25FeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uZXh0cmFjdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hbm5vdGF0aW9uLkFubm90YXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYW5ub3RhdGlvbi5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudEFubm90YXRpb25FeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkVMVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdBbm5vdGF0aW9uRXh0cmFjdG9yIGV4dGVuZHMNCi0gICAgICAgIERlZmF1bHRDb21wb25lbnRBbm5vdGF0aW9uRXh0cmFjdG9yDQotew0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIExpc3Q8QW5ub3RhdGlvbkVudHJ5PiBleHRyYWN0QW5ub3RhdGlvbnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0KQ0KLSAgICB7DQotICAgICAgICAvL3Nob3VsZCBuZXZlciBvY2N1cg0KLSAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uRW50cnk+KCk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9ICgoU3RyaW5nKSBvYmplY3QpLnRyaW0oKTsNCi0gICAgICAgIGludCBiZWFuUHJvcGVydHlCb3JkZXIgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmxhc3RJbmRleE9mKCIuIik7DQotDQotICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoYmVhblByb3BlcnR5Qm9yZGVyICsgMSwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5sYXN0SW5kZXhPZigifSIpKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLnN1YnN0cmluZygwLA0KLSAgICAgICAgICAgICAgICBiZWFuUHJvcGVydHlCb3JkZXIpDQotICAgICAgICAgICAgICAgICsgIn0iOw0KLQ0KLSAgICAgICAgTGlzdDxBbm5vdGF0aW9uRW50cnk+IGFubm90YXRpb25FbnRyaWVzID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uRW50cnk+KCk7DQotDQotICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IEVMVXRpbHMuZ2V0VHlwZU9mVmFsdWVCaW5kaW5nRm9yRXhwcmVzc2lvbigNCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0NCi0gICAgICAgIC8vY3JlYXRlIHRlbXBsYXRlIGVudHJ5DQotICAgICAgICBBbm5vdGF0aW9uRW50cnkgdGVtcGxhdGVFbnRyeSA9IG5ldyBBbm5vdGF0aW9uRW50cnkoKTsNCi0gICAgICAgIHRlbXBsYXRlRW50cnkuc2V0RW50aXR5Q2xhc3MoZW50aXR5Q2xhc3MpOw0KLSAgICAgICAgLy9UT0RPIGNvbXBsZXggY29tcG9uZW50cw0KLSAgICAgICAgdGVtcGxhdGVFbnRyeS5zZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgdGVtcGxhdGVFbnRyeS5zZXRCb3VuZFRvKCJ2YWx1ZSIpOw0KLQ0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIGZpbmQgYW5kIGFkZCBhbm5vdGF0aW9ucw0KLSAgICAgICAgICovDQotICAgICAgICBpZiAoZW50aXR5Q2xhc3MgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGVudGl0eUNsYXNzLCBwcm9wZXJ0eSwNCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25FbnRyaWVzLCB0ZW1wbGF0ZUVudHJ5KTsNCi0gICAgICAgICAgICBhZGRGaWVsZEFjY2Vzc0Fubm90YXRpb25zKGVudGl0eUNsYXNzLCBwcm9wZXJ0eSwgYW5ub3RhdGlvbkVudHJpZXMsDQotICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUVudHJ5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uRW50cmllczsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL2pwYV9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS9qcGFfbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVmNDU2NS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL2pwYV9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWZpZWxkX3JlcXVpcmVkPWZpZWxkIGlzIHJlcXVpcmVkDQotZmllbGRfcmVxdWlyZWRfZGV0YWlscz1maWVsZCBpcyByZXF1aXJlZA0KLQ0KLWZpZWxkX3Rvb19sb25nPWZpZWxkIHRvbyBsb25nDQotZmllbGRfdG9vX2xvbmdfZGV0YWlscz1maWVsZCB0b28gbG9uZyAobWF4LiBsZW5ndGg6IHswfSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmVmNDdiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWZpZWxkX3JlcXVpcmVkPWZpZWxkIGlzIHJlcXVpcmVkDQotZmllbGRfcmVxdWlyZWRfZGV0YWlscz1maWVsZCBpcyByZXF1aXJlZA0KLQ0KLW5vX21hdGNoPWludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlscz10aGUgcmVxdWlyZWQgZm9ybWF0ZSBpczogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZWYyOTcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgICAgIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZU5hbWUgPSBudWxsOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VOYW1lID0gc3VwZXIuZ2V0QmFzZU5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBiYXNlTmFtZTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNDYwYTguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIEpwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciBleHRlbmRzDQotICAgICAgICBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX05BTUUgPSBXZWJYbWxQYXJhbWV0ZXIuVkFMSURBVElPTl9NRVNTQUdFU19KUEE7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX05BTUUgPSBKcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MNCi0gICAgICAgICAgICAuZ2V0UGFja2FnZSgpLmdldE5hbWUoKS5yZXBsYWNlKCIubWVzc2FnZS5yZXNvbHZlciIsDQotICAgICAgICAgICAgICAgICAgICAiLm1lc3NhZ2UuYnVuZGxlIikNCi0gICAgICAgICAgICArICIuanBhX21lc3NhZ2VzIjsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21CYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBDVVNUT01fQkFTRV9OQU1FOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQkFTRV9OQU1FOw0KLSAgICB9DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvRG91YmxlUmFuZ2VTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlY2ZkNWQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0b3JBZGFwdGVyOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuRG91YmxlUmFuZ2VWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIERvdWJsZVJhbmdlU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRvckFkYXB0ZXINCi17DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEFubm90YXRpb25FbnRyeSBhbm5vdGF0aW9uRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotDQotICAgICAgICBEb3VibGVSYW5nZSBhbm5vdGF0aW9uID0gYW5ub3RhdGlvbkVudHJ5DQotICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uKERvdWJsZVJhbmdlLmNsYXNzKTsNCi0gICAgICAgIERvdWJsZVJhbmdlVmFsaWRhdG9yIGRvdWJsZVJhbmdlVmFsaWRhdG9yID0gbmV3IERvdWJsZVJhbmdlVmFsaWRhdG9yKCk7DQotDQotICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSm9pblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmJjOWNkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSm9pblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uZXh0cmFjdG9yLkRlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nQW5ub3RhdGlvbkV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmFubm90YXRpb24uZXh0cmFjdG9yLkFubm90YXRpb25FeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0b3JBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRmFjdG9yeVV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKb2luVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0b3JBZGFwdGVyDQotew0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBBbm5vdGF0aW9uRW50cnkgYW5ub3RhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgQW5ub3RhdGlvbkV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdBbm5vdGF0aW9uRXh0cmFjdG9yKCk7DQotDQotICAgICAgICBTdHJpbmdbXSB0YXJnZXRFeHByZXNzaW9ucyA9IGFubm90YXRpb25FbnRyeS5nZXRBbm5vdGF0aW9uKA0KLSAgICAgICAgICAgICAgICBKb2luVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotICAgICAgICBmb3IgKFN0cmluZyB0YXJnZXRFeHByZXNzaW9uIDogdGFyZ2V0RXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uRW50cnkgZW50cnkgOiBleHRyYWN0b3IuZXh0cmFjdEFubm90YXRpb25zKA0KLSAgICAgICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB0YXJnZXRFeHByZXNzaW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IEZhY3RvcnlVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KCkuY3JlYXRlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0QW5ub3RhdGlvbigpKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm5vIHZhbGlkYXRpb24gc3RyYXRlZ3kgZm91bmQgZm9yICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlbnRyeS5nZXRBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSnBhVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTYzNzc5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSnBhVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmFubm90YXRpb24uQW5ub3RhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5CYXNpYzsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmU7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKcGFWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRFX1JFUVVJUkVEID0gInJlcXVpcmVkIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRFX0xFTkdUSCA9ICJsZW5ndGgiOw0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB2aW9sYXRpb247DQotICAgIHByaXZhdGUgaW50IG1heExlbmd0aDsNCi0NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgQW5ub3RhdGlvbkVudHJ5IGFubm90YXRpb25FbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFubm90YXRpb25FbnRyeS5nZXRBbm5vdGF0aW9uKCk7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIENvbHVtbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZUNvbHVtbkFubm90YXRpb24oKENvbHVtbikgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBCYXNpYykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZUJhc2ljQW5ub3RhdGlvbigoQmFzaWMpIGFubm90YXRpb24sIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgT25lVG9PbmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVPbmVUb09uZUFubm90YXRpb24oKE9uZVRvT25lKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE1hbnlUb09uZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZU1hbnlUb09uZUFubm90YXRpb24oKE1hbnlUb09uZSkgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVDb2x1bW5Bbm5vdGF0aW9uKENvbHVtbiBjb2x1bW4sIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoIWNvbHVtbi5udWxsYWJsZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nDQotICAgICAgICAgICAgICAgICYmIGNvbHVtbi5sZW5ndGgoKSA8ICgoU3RyaW5nKSBjb252ZXJ0ZWRPYmplY3QpLmxlbmd0aCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uID0gVkFMSURBVEVfTEVOR1RIOw0KLSAgICAgICAgICAgIHRoaXMubWF4TGVuZ3RoID0gY29sdW1uLmxlbmd0aCgpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNYXNzYWdlKG51bGwpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVCYXNpY0Fubm90YXRpb24oQmFzaWMgYmFzaWMsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoIWJhc2ljLm9wdGlvbmFsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU9uZVRvT25lQW5ub3RhdGlvbihPbmVUb09uZSBvbmVUb09uZSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIW9uZVRvT25lLm9wdGlvbmFsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9UT0RPDQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU1hbnlUb09uZUFubm90YXRpb24oTWFueVRvT25lIG1hbnlUb09uZSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIW1hbnlUb09uZS5vcHRpb25hbCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vVE9ETw0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICAgICAgICAgIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCA9PSBudWxsIHx8IGNvbnZlcnRlZE9iamVjdC5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uID0gVkFMSURBVEVfUkVRVUlSRUQ7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihnZXRWYWxpZGF0aW9uRXJyb3JGYWNlc01hc3NhZ2UobnVsbCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKFZBTElEQVRFX0xFTkdUSC5lcXVhbHModGhpcy52aW9sYXRpb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAiZmllbGRfdG9vX2xvbmciOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAiZmllbGRfcmVxdWlyZWQiOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlRGV0YWlscyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlRGV0YWlscyhhbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgIGlmIChWQUxJREFURV9MRU5HVEguZXF1YWxzKHRoaXMudmlvbGF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLCAiIiArIHRoaXMubWF4TGVuZ3RoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xlbmd0aFN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xlbmd0aFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4N2Y0MDMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hbm5vdGF0aW9uLkFubm90YXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRvckFkYXB0ZXI7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIExlbmd0aFN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0b3JBZGFwdGVyDQotew0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBBbm5vdGF0aW9uRW50cnkgYW5ub3RhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLQ0KLSAgICAgICAgTGVuZ3RoIGFubm90YXRpb24gPSBhbm5vdGF0aW9uRW50cnkuZ2V0QW5ub3RhdGlvbihMZW5ndGguY2xhc3MpOw0KLSAgICAgICAgTGVuZ3RoVmFsaWRhdG9yIGxlbmd0aFZhbGlkYXRvciA9IG5ldyBMZW5ndGhWYWxpZGF0b3IoKTsNCi0NCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTG9uZ1JhbmdlU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTG9uZ1JhbmdlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYxY2M5Ny4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Mb25nUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmFubm90YXRpb24uQW5ub3RhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdG9yQWRhcHRlcjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkxvbmdSYW5nZVZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTG9uZ1JhbmdlU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRvckFkYXB0ZXINCi17DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEFubm90YXRpb25FbnRyeSBhbm5vdGF0aW9uRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotDQotICAgICAgICBMb25nUmFuZ2UgYW5ub3RhdGlvbiA9IGFubm90YXRpb25FbnRyeS5nZXRBbm5vdGF0aW9uKExvbmdSYW5nZS5jbGFzcyk7DQotICAgICAgICBMb25nUmFuZ2VWYWxpZGF0b3IgbG9uZ1JhbmdlVmFsaWRhdG9yID0gbmV3IExvbmdSYW5nZVZhbGlkYXRvcigpOw0KLQ0KLSAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnNldE1pbmltdW0oYW5ub3RhdGlvbi5taW5pbXVtKCkpOw0KLSAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZWdleFN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlZ2V4U3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk5ZTMyYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlZ2V4U3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlZ2V4Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hbm5vdGF0aW9uLkFubm90YXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUmVnZXhTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBBbm5vdGF0aW9uRW50cnkgYW5ub3RhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLQ0KLSAgICAgICAgUmVnZXggYW5ub3RhdGlvbiA9IGFubm90YXRpb25FbnRyeS5nZXRBbm5vdGF0aW9uKFJlZ2V4LmNsYXNzKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGV4cHJlc3Npb24gOiBhbm5vdGF0aW9uLnZhbHVlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCA9PSBudWxsDQotICAgICAgICAgICAgICAgICAgICB8fCAhUGF0dGVybi5jb21waWxlKGV4cHJlc3Npb24pLm1hdGNoZXIoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdC50b1N0cmluZygpKS5tYXRjaGVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG5ldyBGYWNlc01lc3NhZ2UoDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiksDQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RXJyb3JNZXNzYWdlRGV0YWlscyhhbm5vdGF0aW9uKS5yZXBsYWNlKCJ7MH0iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbikpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChSZWdleCkgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZXF1aXJlZFN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZiMTkzNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hbm5vdGF0aW9uLkFubm90YXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5DbGllbnRTaWRlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGllbnRTaWRlVmFsaWRhdGlvblV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgQ2xpZW50U2lkZVZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgLy9UT0RPDQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZXh0cmFjdE1ldGFEYXRhKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICAvL2Fubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKS5nZXQNCi0gICAgICAgIG1ldGFEYXRhLmFkZChDbGllbnRTaWRlVmFsaWRhdGlvblV0aWxzDQotICAgICAgICAgICAgLmdlbmVyYXRlU2ltcGxlS2V5VmFsdWVQYWlyKCJ2YWxpZGF0aW9uRXJyb3JNc2dLZXkiLCAoKFJlcXVpcmVkKWFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpKSk7DQotICAgICAgICByZXR1cm4gbWV0YURhdGE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgQW5ub3RhdGlvbkVudHJ5IGFubm90YXRpb25FbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCB8fCBjb252ZXJ0ZWRPYmplY3QuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNYXNzYWdlKGFubm90YXRpb25FbnRyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbigpKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChSZXF1aXJlZCkgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9WYWxpZGF0b3JTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9WYWxpZGF0b3JTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTc5NjQ0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0b3JBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdG9yQWRhcHRlcg0KLXsNCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgQW5ub3RhdGlvbkVudHJ5IGFubm90YXRpb25FbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIENsYXNzW10gdmFsaWRhdG9yQ2xhc3NlcyA9IGFubm90YXRpb25FbnRyeS5nZXRBbm5vdGF0aW9uKA0KLSAgICAgICAgICAgICAgICBWYWxpZGF0b3IuY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yIHZhbGlkYXRvcjsNCi0gICAgICAgIGZvciAoQ2xhc3MgdmFsaWRhdG9yQ2xhc3NOYW1lIDogdmFsaWRhdG9yQ2xhc3NlcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0b3IgPSAoamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcikgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzcyh2YWxpZGF0b3JDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKHZhbGlkYXRvckNsYXNzTmFtZS5nZXROYW1lKCkgKyAiIG5vdCBmb3VuZCIpOw0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGNmMDcwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSA9IENyb3NzVmFsaWRhdGlvblV0aWxzDQotICAgICAgICAgICAgICAgICAgICAuZ2V0T3JJbml0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpOw0KLSAgICAgICAgICAgIGZvciAoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5IDogY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkucHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbihlbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgICAgICB7DQotDQotICAgICAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gZS5nZXRGYWNlc01lc3NhZ2UoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChmYWNlc01lc3NhZ2UgIT0gbnVsbA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmFjZXNNZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgY29tcG9uZW50ID0gZW50cnkuZ2V0Q29tcG9uZW50KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsaWVudElkID0gbnVsbDsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRJZCA9IGNvbXBvbmVudC5nZXRDbGllbnRJZChldmVudA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGYWNlc0NvbnRleHQoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldEZhY2VzQ29udGV4dCgpLmFkZE1lc3NhZ2UoY2xpZW50SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RmFjZXNDb250ZXh0KCkucmVuZGVyUmVzcG9uc2UoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldEZhY2VzQ29udGV4dCgpLmFkZE1lc3NhZ2UoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjdXN0b20gdmFsaWRhdGlvbiBtZXNzYWdlIG5vdCBmb3VuZCIsIGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpKSk7DQotICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRGYWNlc0NvbnRleHQoKS5yZW5kZXJSZXNwb25zZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGZpbmFsbHkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5yZXNldENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzSW5pdGlhbGl6ZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NST1NTVkFMSURBVElPTiAhPSBudWxsDQotICAgICAgICAgICAgICAgICAgICAmJiBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmRlcmVnaXN0ZXJQaGFzZUxpc3RlbmVyKHRoaXMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpc0luaXRpYWxpemVkID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLkFOWV9QSEFTRTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMTU4NDcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMgPSANCi0gICAgICAgIG5ldyBBcnJheUxpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGQoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzLmFkZChlbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcygNCi0gICAgICAgICAgICBMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTlkMTVjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hbm5vdGF0aW9uLkFubm90YXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5LkNyb3NzVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeQ0KLXsNCi0gICAgcHJpdmF0ZSBBbm5vdGF0aW9uRW50cnkgYW5ub3RhdGlvbkVudHJ5Ow0KLSAgICAvL2ZvciBjb21wbGV4IGNvbXBvbmVudHMgKGUuZy4gYSB0YWJsZSkgc3RvcmVzIHRoZSBvYmplY3Qgb2YgZW50cnkgKCN7ZW50cnkucHJvcGVydHl9KQ0KLSAgICBwcml2YXRlIE9iamVjdCBiZWFuOw0KLSAgICBwcml2YXRlIFVJQ29tcG9uZW50IGNvbXBvbmVudDsNCi0gICAgcHJpdmF0ZSBPYmplY3QgY29udmVydGVkT2JqZWN0Ow0KLSAgICBwcml2YXRlIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi0gICAgcHVibGljIEFubm90YXRpb25FbnRyeSBnZXRBbm5vdGF0aW9uRW50cnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkVudHJ5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEFubm90YXRpb25FbnRyeShBbm5vdGF0aW9uRW50cnkgYW5ub3RhdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmFubm90YXRpb25FbnRyeSA9IGFubm90YXRpb25FbnRyeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmVhbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRCZWFuKE9iamVjdCBiZWFuKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmJlYW4gPSBiZWFuOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBVSUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudChVSUNvbXBvbmVudCBjb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkT2JqZWN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZE9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZWRPYmplY3QoT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb252ZXJ0ZWRPYmplY3QgPSBjb252ZXJ0ZWRPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblN0cmF0ZWd5KENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3kgPSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY4ZDUxMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcm4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0NST1NTVkFMSURBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OIik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTBhMmQ1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1AVGFyZ2V0KCB7IE1FVEhPRCwgRklFTEQgfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotLy9UT0RPIERhdGVJc0VudHJ5ICh2YWx1ZSwgdHlwZSkNCi1wdWJsaWMgQGludGVyZmFjZSBEYXRlSXMNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlT2YoKTsNCi0NCi0gICAgLyoNCi0gICAgICogb3B0aW9uYWwgc2VjdGlvbg0KLSAgICAgKi8NCi0NCi0gICAgRGF0ZUlzVHlwZSB0eXBlKCkgZGVmYXVsdCBEYXRlSXNUeXBlLnNhbWU7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICIiOw0KLQ0KLSAgICBTdHJpbmcgbm90QmVmb3JlRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJ3cm9uZ19kYXRlX25vdF9iZWZvcmUiOw0KLQ0KLSAgICBTdHJpbmcgbm90QWZ0ZXJFcnJvck1zZ0tleSgpIGRlZmF1bHQgIndyb25nX2RhdGVfbm90X2FmdGVyIjsNCi0NCi0gICAgU3RyaW5nIG5vdEVxdWFsRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJ3cm9uZ19kYXRlX25vdF9lcXVhbCI7DQotDQotICAgIGludCBlcnJvck1lc3NhZ2VEYXRlU3R5bGUoKSBkZWZhdWx0IERhdGVGb3JtYXQuTUVESVVNOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJc1R5cGUuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWZkOTE3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGVudW0gRGF0ZUlzVHlwZQ0KLXsNCi0gICAgYmVmb3JlLCBhZnRlciwgc2FtZQ0KLSAgICAvL1RPRE86IGJlZm9yZU9yU2FtZSwgYWZ0ZXJPclNhbWUNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MGMzNDAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotQFRhcmdldCggeyBNRVRIT0QsIEZJRUxEIH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIEVxdWFscw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZCI7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL05vdEVxdWFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTE0NjIwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLUBUYXJnZXQoIHsgTUVUSE9ELCBGSUVMRCB9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1wdWJsaWMgQGludGVyZmFjZSBOb3RFcXVhbHMNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJkdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkIjsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZkZjQ4OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotQFRhcmdldCggeyBNRVRIT0QsIEZJRUxEIH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLS8vVE9ETyBEYXRlSXNFbnRyeSAodmFsdWUsIHR5cGUpDQotcHVibGljIEBpbnRlcmZhY2UgUmVxdWlyZWRJZg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWVPZigpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBvcHRpb25hbCBzZWN0aW9uDQotICAgICAqLw0KLQ0KLSAgICBSZXF1aXJlZElmVHlwZSBpcygpIGRlZmF1bHQgUmVxdWlyZWRJZlR5cGUubm90X2VtcHR5Ow0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZW1wdHlfZmllbGQiOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWZUeXBlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWZUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwN2EyZWYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGVudW0gUmVxdWlyZWRJZlR5cGUNCi17DQotICAgIGVtcHR5LCBub3RfZW1wdHkNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9UYXJnZXRBbGlhcy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9UYXJnZXRBbGlhcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWM2NTE2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vVGFyZ2V0QWxpYXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotQFRhcmdldCggeyBNRVRIT0QsIEZJRUxEIH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFRhcmdldEFsaWFzDQotew0KLSAgICBTdHJpbmcgdmFsdWUoKSBkZWZhdWx0ICIiOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0VmFsdWVCaW5kaW5nU2Nhbm5pbmdBbm5vdGF0aW9uRXh0cmFjdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0VmFsdWVCaW5kaW5nU2Nhbm5pbmdBbm5vdGF0aW9uRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZTAzMWUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFZhbHVlQmluZGluZ1NjYW5uaW5nQW5ub3RhdGlvbkV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLmV4dHJhY3RvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmFubm90YXRpb24uZXh0cmFjdG9yLkRlZmF1bHRDb21wb25lbnRBbm5vdGF0aW9uRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FTFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogdG8gc3VwcG9ydCB0aGUgdXNhZ2Ugb2YgdmIteHByZXNzaW9ucyAodG8gcmVmZXJlbmNlIHRoZSB0YXJnZXQgYmVhbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsdWVCaW5kaW5nU2Nhbm5pbmdBbm5vdGF0aW9uRXh0cmFjdG9yIGV4dGVuZHMNCi0gICAgICAgIERlZmF1bHRDb21wb25lbnRBbm5vdGF0aW9uRXh0cmFjdG9yDQotew0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIExpc3Q8QW5ub3RhdGlvbkVudHJ5PiBleHRyYWN0QW5ub3RhdGlvbnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0KQ0KLSAgICB7DQotICAgICAgICAvL3Nob3VsZCBuZXZlciBvY2N1cg0KLSAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uRW50cnk+KCk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9ICgoU3RyaW5nKSBvYmplY3QpLnRyaW0oKTsNCi0NCi0gICAgICAgIExpc3Q8QW5ub3RhdGlvbkVudHJ5PiBhbm5vdGF0aW9uRW50cmllcyA9IG5ldyBBcnJheUxpc3Q8QW5ub3RhdGlvbkVudHJ5PigpOw0KLQ0KLSAgICAgICAgQ2xhc3MgZW50aXR5ID0gRUxVdGlscy5nZXRUeXBlT2ZWYWx1ZUJpbmRpbmdGb3JFeHByZXNzaW9uKGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgICAgICBpZiAoZW50aXR5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9maW5kIGFuZCBhZGQgYW5ub3RhdGlvbnMNCi0gICAgICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGVudGl0eSwgYW5ub3RhdGlvbkVudHJpZXMsDQotICAgICAgICAgICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgICAgICBhZGRGaWVsZEFjY2Vzc0Fubm90YXRpb25zKGVudGl0eSwgYW5ub3RhdGlvbkVudHJpZXMsDQotICAgICAgICAgICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uRW50cmllczsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKENsYXNzIGVudGl0eSwNCi0gICAgICAgICAgICBMaXN0PEFubm90YXRpb25FbnRyeT4gYW5ub3RhdGlvbkVudHJpZXMsDQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIEFubm90YXRpb25FbnRyeSB0ZW1wbGF0ZUVudHJ5Ow0KLQ0KLSAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogZW50aXR5LmdldERlY2xhcmVkTWV0aG9kcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRlbXBsYXRlRW50cnkgPSBuZXcgQW5ub3RhdGlvbkVudHJ5KCk7DQotICAgICAgICAgICAgdGVtcGxhdGVFbnRyeS5zZXRFbnRpdHlDbGFzcyhlbnRpdHkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgdGVtcGxhdGVFbnRyeS5zZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIHRlbXBsYXRlRW50cnkuc2V0Qm91bmRUbygiW21ldGhvZF06IiArIG1ldGhvZC5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgICAgIGFkZEFubm90YXRpb25Ub0Fubm90YXRpb25FbnRyaWVzKGFubm90YXRpb25FbnRyaWVzLCBBcnJheXMNCi0gICAgICAgICAgICAgICAgICAgIC5hc0xpc3QobWV0aG9kLmdldEFubm90YXRpb25zKCkpLCB0ZW1wbGF0ZUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRGaWVsZEFjY2Vzc0Fubm90YXRpb25zKENsYXNzIGVudGl0eSwNCi0gICAgICAgICAgICBMaXN0PEFubm90YXRpb25FbnRyeT4gYW5ub3RhdGlvbkVudHJpZXMsDQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIEFubm90YXRpb25FbnRyeSB0ZW1wbGF0ZUVudHJ5Ow0KLQ0KLSAgICAgICAgZm9yIChGaWVsZCBmaWVsZCA6IGVudGl0eS5nZXREZWNsYXJlZEZpZWxkcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRlbXBsYXRlRW50cnkgPSBuZXcgQW5ub3RhdGlvbkVudHJ5KCk7DQotICAgICAgICAgICAgdGVtcGxhdGVFbnRyeS5zZXRFbnRpdHlDbGFzcyhlbnRpdHkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgdGVtcGxhdGVFbnRyeS5zZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIHRlbXBsYXRlRW50cnkuc2V0Qm91bmRUbygiW2ZpZWxkXToiICsgZmllbGQuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgICAgICBhZGRBbm5vdGF0aW9uVG9Bbm5vdGF0aW9uRW50cmllcyhhbm5vdGF0aW9uRW50cmllcywgQXJyYXlzDQotICAgICAgICAgICAgICAgICAgICAuYXNMaXN0KGZpZWxkLmdldEFubm90YXRpb25zKCkpLCB0ZW1wbGF0ZUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmM2YwMTcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1pbnB1dCBpcyBkaWZmZXJlbnQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlscz1pbnB1dCBpcyBkaWZmZXJlbnQNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPXNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlscz1zYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi0NCi13cm9uZ19kYXRlPXdyb25nIGRhdGUNCi13cm9uZ19kYXRlX2RldGFpbHM9d3JvbmcgZGF0ZQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1kYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlscz1kYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1kYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlscz1kYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9ZGF0ZSBpc24ndCBlcXVhbCB0byB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWxzPWRhdGUgaXNuJ3QgZXF1YWwgdG8gezB9DQotDQotZW1wdHlfZmllbGQ9ZmllbGQgaXMgcmVxdWlyZWQNCi1lbXB0eV9maWVsZF9kZXRhaWxzPWZpZWxkIGlzIHJlcXVpcmVkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkN2MxZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotICAgICAgICBleHRlbmRzDQotICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZiAoYmFzZU5hbWUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBiYXNlTmFtZSA9IHN1cGVyLmdldEJhc2VOYW1lKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gYmFzZU5hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcmVmZXJlbmNpbmcvc3RyYXRlZ3kvQWxpYXNDb21wYXJlU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlZmVyZW5jaW5nL3N0cmF0ZWd5L0FsaWFzQ29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YTgyMDQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcmVmZXJlbmNpbmcvc3RyYXRlZ3kvQWxpYXNDb21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwucmVmZXJlbmNpbmcuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmFubm90YXRpb24uZXh0cmFjdG9yLkFubm90YXRpb25FeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5UYXJnZXRBbGlhczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uZXh0cmFjdG9yLg0KLSAgICBEZWZhdWx0VmFsdWVCaW5kaW5nU2Nhbm5pbmdBbm5vdGF0aW9uRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkVMVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsNCi0NCi0vKioNCi0gKiByZWZlcmVuY2luZyB2YWxpZGF0aW9uIHRhcmdldHMgLSBwb3NzaWJsZSBmb3JtYXRzOg0KLSAqICIje1tiZWFuX25hbWVdfTpAW2FsaWFzX25hbWVdIiAuLi4gY3Jvc3MtZW50aXR5IHZhbGlkYXRpb24gd2l0aCBAVGFyZ2V0QWxpYXMNCi0gKiBvciAiQFthbGlhc19uYW1lXSIgLi4uIGdsb2JhbCBhbGlhcyAtPiBhZGRpdGlvbmFsIGFic3RyYWN0aW9uIC0gZG9lc24ndCBkZXBlbmQgb24gYmVhbiBuYW1lcywgcHJvcGVydHkgbmFtZXMuLi4NCi0gKiBjb21wb25lbnQgd2hpY2ggaXMgYW5ub3RhdGVkIHdpdGggdGhlIEBUYXJnZXRBbGlhcyBoYXMgdG8gYmUgd2l0aGluIHRoZSBzYW1lIHBhZ2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBbGlhc0NvbXBhcmVTdHJhdGVneSBpbXBsZW1lbnRzIFJlZmVyZW5jaW5nU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGV2YWxSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblRhcmdldC5zdGFydHNXaXRoKCJAIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9WYWxpZGF0ZVdpdGhBbGlhcyhjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLCB2YWxpZGF0aW9uVGFyZ2V0LnN1YnN0cmluZygxKSwNCi0gICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSk7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmICh2YWxpZGF0aW9uVGFyZ2V0LmNvbnRhaW5zKCI6QCoiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodmFsaWRhdGVCaW5kaW5nRm9ybWF0V2l0aEFsaWFzKHZhbGlkYXRpb25UYXJnZXQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5VG9WYWxpZGF0ZUJpbmRpbmdXaXRoQWxpYXMoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQsIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBmYWxzZSk7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKHZhbGlkYXRpb25UYXJnZXQuY29udGFpbnMoIjpAIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHZhbGlkYXRlQmluZGluZ0Zvcm1hdFdpdGhBbGlhcyh2YWxpZGF0aW9uVGFyZ2V0KSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeVRvVmFsaWRhdGVCaW5kaW5nV2l0aEFsaWFzKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgdHJ1ZSk7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0cnlUb1ZhbGlkYXRlV2l0aEFsaWFzKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LCBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gdmFsaWRhdGlvbkV4ZWN1dGVkID0gZmFsc2U7DQotDQotICAgICAgICBib29sZWFuIHVzZU1vZGVsVmFsdWUgPSB0cnVlOw0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25UYXJnZXQuc3RhcnRzV2l0aCgiKiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHVzZU1vZGVsVmFsdWUgPSBmYWxzZTsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0ID0gdmFsaWRhdGlvblRhcmdldC5zdWJzdHJpbmcoMSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL3NlYXJjaCBmb3IgVGFyZ2V0QWxpYXMgYW5ub3RhdGlvbnMNCi0gICAgICAgIGZvciAoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5IDogY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZQ0KLSAgICAgICAgICAgICAgICAuZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoKSkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBpZiAoZW50cnkuZ2V0QW5ub3RhdGlvbkVudHJ5KCkuZ2V0QW5ub3RhdGlvbigpIGluc3RhbmNlb2YgVGFyZ2V0QWxpYXMpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRXhlY3V0ZWQgPSB2YWxpZGF0ZVRhcmdldFdpdGhBbGlhcyh2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgZW50cnksIHVzZU1vZGVsVmFsdWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5KTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25FeGVjdXRlZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlQmluZGluZ1dpdGhBbGlhcygNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LCBib29sZWFuIHVzZU1vZGVsVmFsdWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZ1tdIGNyb3NzRW50aXR5UmVmZXJlbmNlV2l0aEJpbmRpbmcgPSBleHRyYWN0Q3Jvc3NFbnRpdHlSZWZlcmVuY2VXaXRoQmluZGluZyh0YXJnZXRQcm9wZXJ0eSk7DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgaWYgKCFFTFV0aWxzLmlzRXhwcmVzc2lvblZhbGlkKGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgY3Jvc3NFbnRpdHlSZWZlcmVuY2VXaXRoQmluZGluZ1swXSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQW5ub3RhdGlvbkV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRGVmYXVsdFZhbHVlQmluZGluZ1NjYW5uaW5nQW5ub3RhdGlvbkV4dHJhY3RvcigpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGFsaWFzOw0KLSAgICAgICAgQW5ub3RhdGlvbkVudHJ5IGZvdW5kQW5ub3RhdGlvbkVudHJ5ID0gbnVsbDsNCi0NCi0gICAgICAgIGludCBhbGlhc1N0YXJ0SW5kZXg7DQotDQotICAgICAgICBpZiAodXNlTW9kZWxWYWx1ZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhbGlhc1N0YXJ0SW5kZXggPSBjcm9zc0VudGl0eVJlZmVyZW5jZVdpdGhCaW5kaW5nWzFdLmluZGV4T2YoJ0AnKSArIDE7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgYWxpYXNTdGFydEluZGV4ID0gY3Jvc3NFbnRpdHlSZWZlcmVuY2VXaXRoQmluZGluZ1sxXS5pbmRleE9mKCdAJykgKyAyOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU3RyaW5nIHRhcmdldEFsaWFzTmFtZSA9IGNyb3NzRW50aXR5UmVmZXJlbmNlV2l0aEJpbmRpbmdbMV0NCi0gICAgICAgICAgICAgICAgLnN1YnN0cmluZyhhbGlhc1N0YXJ0SW5kZXgpOw0KLSAgICAgICAgZm9yIChBbm5vdGF0aW9uRW50cnkgZW50cnkgOiBleHRyYWN0b3IuZXh0cmFjdEFubm90YXRpb25zKGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgY3Jvc3NFbnRpdHlSZWZlcmVuY2VXaXRoQmluZGluZ1swXSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LmdldEFubm90YXRpb24oKSBpbnN0YW5jZW9mIFRhcmdldEFsaWFzKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWxpYXMgPSAoKFRhcmdldEFsaWFzKSBlbnRyeS5nZXRBbm5vdGF0aW9uKCkpLnZhbHVlKCk7DQotICAgICAgICAgICAgICAgIGlmICh0YXJnZXRBbGlhc05hbWUuZXF1YWxzKGFsaWFzKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgZm91bmRBbm5vdGF0aW9uRW50cnkgPSBlbnRyeTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGZvdW5kQW5ub3RhdGlvbkVudHJ5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgT2JqZWN0IHJlZmVyZW5jZWRCZWFuID0gbnVsbDsNCi0gICAgICAgIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0T2JqZWN0ID0gbnVsbDsNCi0gICAgICAgIGlmICh1c2VNb2RlbFZhbHVlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlZmVyZW5jZWRCZWFuID0gRUxVdGlscy5nZXRWYWx1ZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICBjcm9zc0VudGl0eVJlZmVyZW5jZVdpdGhCaW5kaW5nWzBdKTsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0T2JqZWN0ID0gZ2V0VmFsaWRhdGlvblRhcmdldE9iamVjdCgNCi0gICAgICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgZm91bmRBbm5vdGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VkQmVhbiwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yIChDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkgOiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlDQotICAgICAgICAgICAgICAgICAgICAuZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChmb3VuZEFubm90YXRpb25FbnRyeS5nZXRBbm5vdGF0aW9uKCkgaW5zdGFuY2VvZiBUYXJnZXRBbGlhcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGVudHJ5LmdldEFubm90YXRpb25FbnRyeSgpLmdldEFubm90YXRpb24oKSAhPSBudWxsDQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZW50cnkuZ2V0QW5ub3RhdGlvbkVudHJ5KCkuZ2V0QW5ub3RhdGlvbigpIGluc3RhbmNlb2YgVGFyZ2V0QWxpYXMpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmICgoKFRhcmdldEFsaWFzKSBmb3VuZEFubm90YXRpb25FbnRyeS5nZXRBbm5vdGF0aW9uKCkpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZSgpLmVxdWFscygNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFRhcmdldEFsaWFzKSBlbnRyeS5nZXRBbm5vdGF0aW9uRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb24oKSkudmFsdWUoKSkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldE9iamVjdCA9IGVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdmFsaWRhdGVGb3VuZEVudHJ5KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgZm91bmRBbm5vdGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRCZWFuLCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLCB2YWxpZGF0aW9uVGFyZ2V0T2JqZWN0LA0KLSAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRWYWxpZGF0aW9uVGFyZ2V0T2JqZWN0KA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQW5ub3RhdGlvbkVudHJ5IGZvdW5kQW5ub3RhdGlvbkVudHJ5LCBPYmplY3QgcmVmZXJlbmNlZEJlYW4sDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlKQ0KLSAgICB7DQotICAgICAgICBpZiAoZm91bmRBbm5vdGF0aW9uRW50cnkgPT0gbnVsbA0KLSAgICAgICAgICAgICAgICB8fCBmb3VuZEFubm90YXRpb25FbnRyeS5nZXRCb3VuZFRvKCkgPT0gbnVsbA0KLSAgICAgICAgICAgICAgICB8fCBmb3VuZEFubm90YXRpb25FbnRyeS5nZXRCb3VuZFRvKCkuaW5kZXhPZigiOiIpIDwgMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8gbG9nZ2luZw0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXRPYmplY3QgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIGJvdW5kVG8gPSBmb3VuZEFubm90YXRpb25FbnRyeS5nZXRCb3VuZFRvKCk7DQotICAgICAgICBTdHJpbmcgbmFtZSA9IGJvdW5kVG8uc3Vic3RyaW5nKGJvdW5kVG8uaW5kZXhPZigiOiIpICsgMSk7DQotICAgICAgICBpZiAoYm91bmRUby5zdGFydHNXaXRoKCJbbWV0aG9kXSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBiYXNlVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IGZvdW5kQW5ub3RhdGlvbkVudHJ5DQotICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWVCaW5kaW5nRXhwcmVzc2lvbigpOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gYmFzZVZhbHVlQmluZGluZ0V4cHJlc3Npb24NCi0gICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgYmFzZVZhbHVlQmluZGluZ0V4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKQ0KLSAgICAgICAgICAgICAgICAgICAgKyAiLiIgKyBuYW1lICsgIn0iOw0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICAgICAgaWYgKEVMVXRpbHMuaXNFeHByZXNzaW9uVmFsaWQoZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VmFsdWVCaW5kaW5nRXhwcmVzc2lvbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0T2JqZWN0ID0gRUxVdGlscy5nZXRWYWx1ZU9mRXhwcmVzc2lvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHRhcmdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGJvdW5kVG8uc3RhcnRzV2l0aCgiW2ZpZWxkXSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRmllbGQgZm91bmRGaWVsZDsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kRmllbGQgPSByZWZlcmVuY2VkQmVhbi5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgZm91bmRGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOw0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldE9iamVjdCA9IGZvdW5kRmllbGQuZ2V0KHJlZmVyZW5jZWRCZWFuKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgZm91bmRGaWVsZCA9IHJlZmVyZW5jZWRCZWFuLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIl8iICsgbmFtZSk7DQotICAgICAgICAgICAgICAgICAgICBmb3VuZEZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7DQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0T2JqZWN0ID0gZm91bmRGaWVsZC5nZXQocmVmZXJlbmNlZEJlYW4pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBhY2Nlc3MgZmllbGQgIiArIG5hbWUNCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgZGV0YWlsczogYm91bmRUbz0iICsgYm91bmRUbywgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25UYXJnZXRPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVGb3VuZEVudHJ5KA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQW5ub3RhdGlvbkVudHJ5IGZvdW5kQW5ub3RhdGlvbkVudHJ5LCBPYmplY3QgcmVmZXJlbmNlZEJlYW4sDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0T2JqZWN0LA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiB2aW9sYXRpb25Gb3VuZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgaWYgKGNvbXBhcmVTdHJhdGVneS5pc1Zpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkNCi0gICAgICAgICAgICAgICAgLmdldENvbnZlcnRlZE9iamVjdCgpLCB2YWxpZGF0aW9uVGFyZ2V0T2JqZWN0LA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0QW5ub3RhdGlvbkVudHJ5KCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbigpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8gdXNlIGNvbXBhcmVTdHJhdGVneSN1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZw0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIG51bGwpOw0KLQ0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kNCi0gICAgICAgICAgICAgICAgICAgIC5wcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvL1RPRE8NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVUYXJnZXRXaXRoQWxpYXMoU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnksIGJvb2xlYW4gdXNlTW9kZWxWYWx1ZSwNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gdmFsaWRhdGlvbkV4ZWN1dGVkID0gZmFsc2U7DQotICAgICAgICBib29sZWFuIHZpb2xhdGlvbkZvdW5kID0gZmFsc2U7DQotDQotICAgICAgICBpZiAodmFsaWRhdGlvblRhcmdldC5lcXVhbHMoKChUYXJnZXRBbGlhcykgZW50cnkuZ2V0QW5ub3RhdGlvbkVudHJ5KCkNCi0gICAgICAgICAgICAgICAgLmdldEFubm90YXRpb24oKSkudmFsdWUoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9nZXQgYW4gb2JqZWN0IHRvIHN0b3JlIGFsbCByZXN1bHRzDQotDQotICAgICAgICAgICAgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXRPYmplY3Q7DQotDQotICAgICAgICAgICAgaWYgKHVzZU1vZGVsVmFsdWUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0T2JqZWN0ID0gRUxVdGlscy5nZXRWYWx1ZU9mRXhwcmVzc2lvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIGVudHJ5DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbkVudHJ5KCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0T2JqZWN0ID0gZW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChjb21wYXJlU3RyYXRlZ3kuaXNWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5DQotICAgICAgICAgICAgICAgICAgICAuZ2V0Q29udmVydGVkT2JqZWN0KCksIHZhbGlkYXRpb25UYXJnZXRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0QW5ub3RhdGlvbkVudHJ5KCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb24oKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IHRydWU7DQotDQotICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBlbnRyeSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25FeGVjdXRlZCA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICB7DQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5DQotICAgICAgICAgICAgICAgICAgICAucHJvY2Vzc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvbkV4ZWN1dGVkOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlQmluZGluZ0Zvcm1hdFdpdGhBbGlhcyhTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGludCBiaW5kaW5nU3RhcnRJbmRleCA9IHRhcmdldFByb3BlcnR5LmluZGV4T2YoIiN7Iik7DQotICAgICAgICBpbnQgYmluZGluZ0VuZEluZGV4ID0gdGFyZ2V0UHJvcGVydHkuaW5kZXhPZigifSIpOw0KLSAgICAgICAgaW50IHNlcGFyYXRvckluZGV4ID0gdGFyZ2V0UHJvcGVydHkuaW5kZXhPZigiOkAiKTsNCi0NCi0gICAgICAgIHJldHVybiAoYmluZGluZ1N0YXJ0SW5kZXggPiAtMSAmJiBiaW5kaW5nRW5kSW5kZXggPiAtMQ0KLSAgICAgICAgICAgICAgICAmJiBzZXBhcmF0b3JJbmRleCA+IC0xICYmIGJpbmRpbmdTdGFydEluZGV4IDwgYmluZGluZ0VuZEluZGV4ICYmIGJpbmRpbmdFbmRJbmRleCA8IHNlcGFyYXRvckluZGV4KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZXh0cmFjdENyb3NzRW50aXR5UmVmZXJlbmNlV2l0aEJpbmRpbmcoDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nWzJdOw0KLQ0KLSAgICAgICAgcmVzdWx0WzBdID0gdGFyZ2V0UHJvcGVydHkuc3Vic3RyaW5nKDAsIHRhcmdldFByb3BlcnR5LmluZGV4T2YoIjoiKSk7DQotICAgICAgICByZXN1bHRbMV0gPSB0YXJnZXRQcm9wZXJ0eS5zdWJzdHJpbmcodGFyZ2V0UHJvcGVydHkuaW5kZXhPZigiOiIpICsgMSk7DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlZmVyZW5jaW5nL3N0cmF0ZWd5L0VMQ29tcGFyZVN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWZlcmVuY2luZy9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmZlNmQ4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlZmVyZW5jaW5nL3N0cmF0ZWd5L0VMQ29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnJlZmVyZW5jaW5nLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkVMVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiByZWZlcmVuY2luZyB2YWxpZGF0aW9uIHRhcmdldHMgLSBwb3NzaWJsZSBmb3JtYXRzOg0KLSAqICIje1tiZWFuX25hbWVdLltwcm9wZXJ0eV9uYW1lXX0iIC4uLiBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbiB3aXRoIHZhbHVlIGJpbmRpbmcNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFTENvbXBhcmVTdHJhdGVneSBpbXBsZW1lbnRzIFJlZmVyZW5jaW5nU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGV2YWxSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblRhcmdldC5zdGFydHNXaXRoKCIjeyIpICYmIHZhbGlkYXRpb25UYXJnZXQuZW5kc1dpdGgoIn0iKQ0KLSAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZVZhbHVlQmluZGluZ0Zvcm1hdCh2YWxpZGF0aW9uVGFyZ2V0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb1ZhbGlkYXRlVmFsdWVCaW5kaW5nKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQsIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsIGNvbXBhcmVTdHJhdGVneSk7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZVZhbHVlQmluZGluZygNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gdmlvbGF0aW9uRm91bmQgPSBmYWxzZTsNCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBpZiAoIUVMVXRpbHMuaXNFeHByZXNzaW9uVmFsaWQoZmFjZXNDb250ZXh0LCB2YWxpZGF0aW9uVGFyZ2V0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LmlzVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeQ0KLSAgICAgICAgICAgICAgICAuZ2V0Q29udmVydGVkT2JqZWN0KCksIEVMVXRpbHMuZ2V0VmFsdWVPZkV4cHJlc3Npb24oDQotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdmFsaWRhdGlvblRhcmdldCksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeQ0KLSAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbkVudHJ5KCkuZ2V0QW5ub3RhdGlvbigpKSkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeTsNCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiB2YWx1ZUJpbmRpbmdDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcgPSBFeHRWYWxVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLmdldE9ySW5pdFZhbHVlQmluZGluZ0NvbnZlcnRlZFZhbHVlTWFwcGluZygpOw0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9IHZhbHVlQmluZGluZ0NvbnZlcnRlZFZhbHVlTWFwcGluZw0KLSAgICAgICAgICAgICAgICAgICAgLmdldCh2YWxpZGF0aW9uVGFyZ2V0KTsNCi0NCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5ID0gbnVsbDsNCi0NCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblRhcmdldEVudHJ5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgPSBuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KCk7DQotICAgICAgICAgICAgICAgIC8vVE9ETyB0ZXN0DQotICAgICAgICAgICAgICAgIGlmIChjb21wYXJlU3RyYXRlZ3kNCi0gICAgICAgICAgICAgICAgICAgICAgICAudXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb21wb25lbnQodmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29tcG9uZW50KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb21wb25lbnQoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5DQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnZlcnRlZE9iamVjdCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb252ZXJ0ZWRWYWx1ZSgpKTsNCi0gICAgICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5DQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZhbGlkYXRpb25TdHJhdGVneShjb21wYXJlU3RyYXRlZ3kpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kNCi0gICAgICAgICAgICAgICAgICAgIC5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0NCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICB7DQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5DQotICAgICAgICAgICAgICAgICAgICAucHJvY2Vzc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVZhbHVlQmluZGluZ0Zvcm1hdChTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGludCBiaW5kaW5nU3RhcnRJbmRleCA9IHRhcmdldFByb3BlcnR5LmluZGV4T2YoIiN7Iik7DQotICAgICAgICBpbnQgYmluZGluZ0VuZEluZGV4ID0gdGFyZ2V0UHJvcGVydHkuaW5kZXhPZigifSIpOw0KLSAgICAgICAgaW50IHNlcGFyYXRvckluZGV4ID0gdGFyZ2V0UHJvcGVydHkuaW5kZXhPZigiLiIpOw0KLQ0KLSAgICAgICAgcmV0dXJuIChiaW5kaW5nU3RhcnRJbmRleCA+IC0xICYmIGJpbmRpbmdFbmRJbmRleCA+IC0xDQotICAgICAgICAgICAgICAgICYmIHNlcGFyYXRvckluZGV4ID4gLTEgJiYgYmluZGluZ1N0YXJ0SW5kZXggPCBiaW5kaW5nRW5kSW5kZXggJiYgYmluZGluZ0VuZEluZGV4ID4gc2VwYXJhdG9ySW5kZXgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlZmVyZW5jaW5nL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWZlcmVuY2luZy9zdHJhdGVneS9Mb2NhbENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWJhZGZiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlZmVyZW5jaW5nL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnJlZmVyZW5jaW5nLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkVMVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiAiW3Byb3BlcnR5X25hbWVdIiAuLi4gbG9jYWwgdmFsaWRhdGlvbiAtPiBjcm9zcy1jb21wb25lbnQsIGJ1dCBubyBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIExvY2FsQ29tcGFyZVN0cmF0ZWd5IGltcGxlbWVudHMgUmVmZXJlbmNpbmdTdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbFJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LCBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHRyeVRvVmFsaWRhdGVMb2NhbGx5KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5KTsNCi0NCi0gICAgICAgIC8vVE9ETw0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgdHJ5VG9WYWxpZGF0ZUxvY2FsbHkoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHZpb2xhdGlvbkZvdW5kID0gZmFsc2U7DQotDQotICAgICAgICBTdHJpbmcgYmFzZVZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkNCi0gICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25FbnRyeSgpLmdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24oKTsNCi0gICAgICAgIGJhc2VWYWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gYmFzZVZhbHVlQmluZGluZ0V4cHJlc3Npb24uc3Vic3RyaW5nKDAsDQotICAgICAgICAgICAgICAgIGJhc2VWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmxhc3RJbmRleE9mKCIuIikpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHRhcmdldFZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4gdmFsdWVCaW5kaW5nQ29udmVydGVkVmFsdWVNYXBwaW5nID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmdldE9ySW5pdFZhbHVlQmluZGluZ0NvbnZlcnRlZFZhbHVlTWFwcGluZygpOw0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnk7DQotDQotICAgICAgICB0YXJnZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gYmFzZVZhbHVlQmluZGluZ0V4cHJlc3Npb24gKyAiLiINCi0gICAgICAgICAgICAgICAgKyB2YWxpZGF0aW9uVGFyZ2V0ICsgIn0iOw0KLQ0KLSAgICAgICAgaWYgKCFFTFV0aWxzLmlzRXhwcmVzc2lvblZhbGlkKGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgdGFyZ2V0VmFsdWVCaW5kaW5nRXhwcmVzc2lvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKCF2YWx1ZUJpbmRpbmdDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcNCi0gICAgICAgICAgICAgICAgLmNvbnRhaW5zS2V5KHRhcmdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9IGNvbXBhcmVTdHJhdGVneS5yZXNvbHZlVmFsaWRhdGlvblRhcmdldEVudHJ5KA0KLSAgICAgICAgICAgICAgICB2YWx1ZUJpbmRpbmdDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcsDQotICAgICAgICAgICAgICAgIHRhcmdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24sIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRCZWFuKCkpOw0KLQ0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGNvbnZlcnRlZCBvYmplY3QgZm9yICINCi0gICAgICAgICAgICAgICAgICAgICsgdGFyZ2V0VmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGNvbXBhcmVTdHJhdGVneS5pc1Zpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkNCi0gICAgICAgICAgICAgICAgLmdldENvbnZlcnRlZE9iamVjdCgpLCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkNCi0gICAgICAgICAgICAgICAgLmdldENvbnZlcnRlZFZhbHVlKCksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeQ0KLSAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbkVudHJ5KCkuZ2V0QW5ub3RhdGlvbigpKSkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5ID0gbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgpOw0KLSAgICAgICAgICAgIGlmIChjb21wYXJlU3RyYXRlZ3kNCi0gICAgICAgICAgICAgICAgICAgIC51c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5DQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbXBvbmVudCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29tcG9uZW50KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5DQotICAgICAgICAgICAgICAgICAgICAuc2V0Q29udmVydGVkT2JqZWN0KHZhbGlkYXRpb25UYXJnZXRFbnRyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29udmVydGVkVmFsdWUoKSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5DQotICAgICAgICAgICAgICAgICAgICAuc2V0VmFsaWRhdGlvblN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSk7DQotDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5DQotICAgICAgICAgICAgICAgICAgICAucHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotDQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneQ0KLSAgICAgICAgICAgICAgICAgICAgLnByb2Nlc3NTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlZmVyZW5jaW5nL3N0cmF0ZWd5L1JlZmVyZW5jaW5nU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlZmVyZW5jaW5nL3N0cmF0ZWd5L1JlZmVyZW5jaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBmMjIxNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWZlcmVuY2luZy9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwucmVmZXJlbmNpbmcuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VFbnVtOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlRW51bS5BUEkpDQotcHVibGljIGludGVyZmFjZSBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBib29sZWFuIGV2YWxSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBhYnN0cmFjdENvbXBhcmVTdHJhdGVneSk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q29tcGFyZVN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzUzOTlmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwucmVmZXJlbmNpbmcuc3RyYXRlZ3kuQWxpYXNDb21wYXJlU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5yZWZlcmVuY2luZy5zdHJhdGVneS5FTENvbXBhcmVTdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnJlZmVyZW5jaW5nLnN0cmF0ZWd5LkxvY2FsQ29tcGFyZVN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwucmVmZXJlbmNpbmcuc3RyYXRlZ3kuUmVmZXJlbmNpbmdTdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGV4dGVuZHMNCi0gICAgICAgIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBzdGF0aWMgTGlzdDxSZWZlcmVuY2luZ1N0cmF0ZWd5PiByZWZlcmVuY2luZ1N0cmF0ZWdpZXM7DQotICAgIHByb3RlY3RlZCBNYXA8T2JqZWN0LCBPYmplY3Q+IHZpb2xhdGlvblJlc3VsdFN0b3JhZ2UgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgaW5pdFJlZmVyZW5jaW5nU3RyYXRlZ2llcygpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRSZWZlcmVuY2luZ1N0cmF0ZWdpZXMoKQ0KLSAgICB7DQotICAgICAgICBpZiAocmVmZXJlbmNpbmdTdHJhdGVnaWVzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzID0gbmV3IEFycmF5TGlzdDxSZWZlcmVuY2luZ1N0cmF0ZWd5PigpOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyBjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5Q2xhc3NOYW1lID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRCYXNlUGFja2FnZSgpDQotICAgICAgICAgICAgICAgICAgICArICJSZWZlcmVuY2luZ1N0cmF0ZWd5IjsNCi0gICAgICAgICAgICBSZWZlcmVuY2luZ1N0cmF0ZWd5IGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kgPSAoUmVmZXJlbmNpbmdTdHJhdGVneSkgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneUNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IEVMQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IEFsaWFzQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IExvY2FsQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpDQotICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotDQotICAgICAgICBpbml0VmFsaWRhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgU3RyaW5nW10gdmFsaWRhdGlvblRhcmdldHMgPSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkNCi0gICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25FbnRyeSgpLmdldEFubm90YXRpb24oKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0IDogdmFsaWRhdGlvblRhcmdldHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCA9IHZhbGlkYXRpb25UYXJnZXQudHJpbSgpOw0KLQ0KLSAgICAgICAgICAgIC8vc2VsZWN0IHZhbGlkYXRpb24gbWV0aG9kDQotICAgICAgICAgICAgdHJ5VG9WYWxpZGF0ZShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCkNCi0gICAgew0KLSAgICAgICAgZm9yIChSZWZlcmVuY2luZ1N0cmF0ZWd5IHJlZmVyZW5jaW5nU3RyYXRlZ3kgOiByZWZlcmVuY2luZ1N0cmF0ZWdpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHJlZmVyZW5jaW5nU3RyYXRlZ3kuZXZhbFJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCwgdGhpcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgLy9UT0RPDQotICAgIC8vaGFzIHRvIGJlIHB1YmxpYyBmb3IgY3VzdG9tIHJlZmVyZW5jaW5nIHN0cmF0ZWdpZXMhISENCi0gICAgcHVibGljIGZpbmFsIHZvaWQgcHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlLA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWhhbmRsZVRhcmdldFZpb2xhdGlvbihlbnRyeU9mU291cmNlLCBlbnRyeU9mVGFyZ2V0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgLy9nZXQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIHRhcmdldCBjb21wb25lbnQNCi0gICAgICAgIFN0cmluZyBzdW1tYXJ5ID0gZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShlbnRyeU9mU291cmNlDQotICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uRW50cnkoKS5nZXRBbm5vdGF0aW9uKCksIHRydWUpOw0KLSAgICAgICAgU3RyaW5nIGRldGFpbHMgPSBnZXRFcnJvck1lc3NhZ2VEZXRhaWxzKGVudHJ5T2ZTb3VyY2UNCi0gICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25FbnRyeSgpLmdldEFubm90YXRpb24oKSwgdHJ1ZSk7DQotDQotICAgICAgICAvL3ZhbGlkYXRpb24gdGFyZ2V0IGlzbid0IGJvdW5kIHRvIGEgY29tcG9uZW50IHdpdGhpbmcgdGhlIGN1cnJlbnQgcGFnZSANCi0gICAgICAgIC8vKHNlZSB2YWxpZGF0ZUZvdW5kRW50cnksIHRyeVRvVmFsaWRhdGVMb2NhbGx5IGFuZCB0cnlUb1ZhbGlkYXRlQmluZGluZ09ubHkpDQotICAgICAgICBpZiAoZW50cnlPZlRhcmdldCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGVudHJ5T2ZUYXJnZXQgPSBlbnRyeU9mU291cmNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlIG1lc3NhZ2U7DQotICAgICAgICBpZiAoZW50cnlPZlRhcmdldC5nZXRBbm5vdGF0aW9uRW50cnkoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1lc3NhZ2UgPSBnZXRUYXJnZXRDb21wb25lbnRFcnJvck1lc3NhZ2UoZW50cnlPZlRhcmdldA0KLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25FbnRyeSgpLmdldEFubm90YXRpb24oKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9UT0RPIGRvY3VtZW50IHBvc3NpYmxlIHNpZGUgZWZmZWN0cw0KLSAgICAgICAgICAgIC8vZHVlIHRvIGEgbWlzc2luZyB0YXJnZXQgYW5ub3RhdGlvbiAoc2VlOiB0cnlUb1ZhbGlkYXRlTG9jYWxseSkNCi0gICAgICAgICAgICBtZXNzYWdlID0gZ2V0VGFyZ2V0Q29tcG9uZW50RXJyb3JNZXNzYWdlKGVudHJ5T2ZTb3VyY2UNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uRW50cnkoKS5nZXRBbm5vdGF0aW9uKCksIHN1bW1hcnksIGRldGFpbHMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKG1lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgfHwgbWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dC5hZGRNZXNzYWdlKGVudHJ5T2ZUYXJnZXQuZ2V0Q29tcG9uZW50KCkuZ2V0Q2xpZW50SWQoDQotICAgICAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQpLCBtZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvL2hhcyB0byBiZSBwdWJsaWMgZm9yIGN1c3RvbSByZWZlcmVuY2luZyBzdHJhdGVnaWVzISEhDQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHByb2Nlc3NTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKCFoYW5kbGVTb3VyY2VWaW9sYXRpb24oZW50cnlPZlNvdXJjZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9nZXQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldEVycm9yTWVzc2FnZVN1bW1hcnkoZW50cnlPZlNvdXJjZQ0KLSAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbkVudHJ5KCkuZ2V0QW5ub3RhdGlvbigpLCBmYWxzZSk7DQotICAgICAgICBTdHJpbmcgZGV0YWlscyA9IGdldEVycm9yTWVzc2FnZURldGFpbHMoZW50cnlPZlNvdXJjZQ0KLSAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbkVudHJ5KCkuZ2V0QW5ub3RhdGlvbigpLCBmYWxzZSk7DQotDQotICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZSA9IGdldFNvdXJjZUNvbXBvbmVudEVycm9yTWVzc2FnZShlbnRyeU9mU291cmNlDQotICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uRW50cnkoKS5nZXRBbm5vdGF0aW9uKCksIHN1bW1hcnksIGRldGFpbHMpOw0KLQ0KLSAgICAgICAgaWYgKG1lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgfHwgbWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vVE9ETw0KLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24obWVzc2FnZSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihuZXcgRmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8vaGFzIHRvIGJlIHB1YmxpYyBmb3IgY3VzdG9tIHJlZmVyZW5jaW5nIHN0cmF0ZWdpZXMhISENCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBnZXRTb3VyY2VDb21wb25lbnRFcnJvck1lc3NhZ2UoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLA0KLSAgICAgICAgICAgIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlscykNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgRmFjZXNNZXNzYWdlKCk7DQotDQotICAgICAgICBtZXNzYWdlLnNldFNldmVyaXR5KEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgICAgICBtZXNzYWdlLnNldFN1bW1hcnkoc3VtbWFyeSk7DQotICAgICAgICBtZXNzYWdlLnNldERldGFpbChkZXRhaWxzKTsNCi0NCi0gICAgICAgIHJldHVybiBtZXNzYWdlOw0KLSAgICB9DQotDQotICAgIC8vaGFzIHRvIGJlIHB1YmxpYyBmb3IgY3VzdG9tIHJlZmVyZW5jaW5nIHN0cmF0ZWdpZXMhISENCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBnZXRUYXJnZXRDb21wb25lbnRFcnJvck1lc3NhZ2UoDQotICAgICAgICAgICAgQW5ub3RhdGlvbiBmb3VuZEFubm90YXRpb24sIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlscykNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgRmFjZXNNZXNzYWdlKCk7DQotDQotICAgICAgICBtZXNzYWdlLnNldFNldmVyaXR5KEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgICAgICBtZXNzYWdlLnNldFN1bW1hcnkoc3VtbWFyeSk7DQotICAgICAgICBtZXNzYWdlLnNldERldGFpbChkZXRhaWxzKTsNCi0NCi0gICAgICAgIHJldHVybiBtZXNzYWdlOw0KLSAgICB9DQotDQotICAgIC8vaGFzIHRvIGJlIHB1YmxpYyBmb3IgY3VzdG9tIHJlZmVyZW5jaW5nIHN0cmF0ZWdpZXMhISENCi0gICAgcHVibGljIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgcmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFbnRyeSgNCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiB2YWx1ZUJpbmRpbmdDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcsDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldFZhbHVlQmluZGluZywgT2JqZWN0IGJlYW4pDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSA9IHZhbHVlQmluZGluZ0NvbnZlcnRlZFZhbHVlTWFwcGluZw0KLSAgICAgICAgICAgICAgICAuZ2V0KHRhcmdldFZhbHVlQmluZGluZyk7DQotDQotICAgICAgICAvL3NpbXBsZSBjYXNlDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5nZXRGdXJ0aGVyRW50cmllcygpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL3Byb2Nlc3MgY29tcGxleCBjb21wb25lbnQgZW50cmllcyAoZS5nLiBhIHRhYmxlKQ0KLSAgICAgICAgLy9zdXBwb3J0ZWQ6IGNyb3NzLWNvbXBvbmVudCBidXQgbm8gY3Jvc3MtZW50aXR5IHZhbGlkYXRpb24gKD0gbG9jYWxlIHZhbGlkYXRpb24pDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5nZXRCZWFuKCkuZXF1YWxzKGJlYW4pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZm9yIChQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IGVudHJ5IDogcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeQ0KLSAgICAgICAgICAgICAgICAuZ2V0RnVydGhlckVudHJpZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuZ2V0QmVhbigpLmVxdWFscyhiZWFuKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLA0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByZXNvbHZlTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwNCi0gICAgICAgICAgICAgICAgaXNUYXJnZXRDb21wb25lbnQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLA0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgICAgIHJldHVybiAoa2V5ICE9IG51bGwpID8gcmVzb2x2ZU1lc3NhZ2Uoa2V5DQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYKSA6IG51bGw7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICINCi0gICAgICAgICAgICAgICAgICAgICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIG9wdGlvbmFsIG1ldGhvZHMgLSByZWNvbW1lbmRlZCB0byBvdmVycmlkZSAtIGhhdmUgdG8gYmUgcHVibGljIGZvciBjdXN0b20gcmVmZXJlbmNpbmcgc3RyYXRlZ2llcyEhIQ0KLSAgICAgKi8NCi0gICAgLyoqDQotICAgICAqIHRoZSB1c2FnZSBvZiB0aGlzIG1ldGhvZCByZXF1aXJlcyBhIG5ldyBpbnN0YW5jZQ0KLSAgICAgKiAtPiBpbiBjYXNlIG9mIHZhbGlkYXRpb24gc3RyYXRlZ3kgYmVhbnMgYXBwbGljYXRpb24vc2luZ2xldG9uIGlzbid0IGFsbG93ZWQNCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVUYXJnZXRWaW9sYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UsDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZUYXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVNvdXJjZVZpb2xhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGhhbmRsZVRhcmdldFZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIG51bGwpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGFic3RyYWN0IG1ldGhvZHMNCi0gICAgICovDQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwNCi0gICAgICAgICAgICBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0NCi0gICAgLyoNCi0gICAgICogaW1wbGVtZW50cyB0aGUgc3BlY2lmaWMgdmFsaWRhdGlvbiBsb2dpYw0KLSAgICAgKi8NCi0NCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLA0KLSAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbik7DQotDQotICAgIC8qDQotICAgICAqIHJldHVybnMgdGhlIHJlZmVyZW5jZWQgdmFsaWRhdGlvbiB0YXJnZXRzIG9mIHRoZSBhbm5vdGF0aW9uDQotICAgICAqIGUuZy4gQERhdGVJcyh0eXBlID0gRGF0ZUlzVHlwZS5iZWZvcmUsIHZhbHVlID0gImZpbmFsRXhhbSIpDQotICAgICAqIC0+IG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IHdpdGggb25lIHZhbHVlICgiZmluYWxFeGFtIikNCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZTVkOWYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hbm5vdGF0aW9uLkFubm90YXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkVMVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcw0KLSAgICAgICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0NCi0gICAgLy9pbml0IGNyb3NzLXZhbGlkYXRpb24NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgQW5ub3RhdGlvbkVudHJ5IGFubm90YXRpb25FbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA9IGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgNCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgYW5ub3RhdGlvbkVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpLmFkZChlbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgQW5ub3RhdGlvbkVudHJ5IGFubm90YXRpb25FbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5ID0gbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgpOw0KLQ0KLSAgICAgICAgZW50cnkuc2V0QW5ub3RhdGlvbkVudHJ5KGFubm90YXRpb25FbnRyeSk7DQotICAgICAgICBlbnRyeS5zZXRCZWFuKEVMVXRpbHMuZ2V0QmFzZU9iamVjdChhbm5vdGF0aW9uRW50cnkuZ2V0VmFsdWVCaW5kaW5nRXhwcmVzc2lvbigpKSk7DQotICAgICAgICBlbnRyeS5zZXRDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgZW50cnkuc2V0Q29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICBlbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3kodGhpcyk7DQotDQotICAgICAgICByZXR1cm4gZW50cnk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NzEyMjIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUVudW07DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VFbnVtLkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgIEFubm90YXRpb25FbnRyeSBhbm5vdGF0aW9uRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICB2b2lkIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpDQotICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRGF0ZUlzU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0RhdGVJc1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYjUxOTYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRGF0ZUlzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRGF0ZUlzVHlwZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0Ow0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRGF0ZUlzU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneQ0KLXsNCi0gICAgLy9UT0RPDQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT19FQVJMWSA9ICJlYXJseSI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT19MQVRFID0gImxhdGUiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRVFVQUxfREFURV9USU1FID0gIm5vdCBlcXVhbCI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVkgPSAicmVzdWx0IjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFSRURfVkFMVUVfS0VZID0gInRhcmdldCB2YWx1ZSI7DQotDQotICAgIHB1YmxpYyBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIC8vVE9ETw0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsDQotICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHZpb2xhdGlvbkZvdW5kOw0KLQ0KLSAgICAgICAgaWYgKCgoRGF0ZUlzKSBhbm5vdGF0aW9uKS50eXBlKCkuZXF1YWxzKERhdGVJc1R5cGUuc2FtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSBvYmplY3QxICE9IG51bGwgJiYgIW9iamVjdDEuZXF1YWxzKG9iamVjdDIpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoUkVTVUxUX0tFWSwgTk9UX0VRVUFMX0RBVEVfVElNRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoKChEYXRlSXMpIGFubm90YXRpb24pLnR5cGUoKS5lcXVhbHMoRGF0ZUlzVHlwZS5iZWZvcmUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsDQotICAgICAgICAgICAgICAgICAgICAmJiBvYmplY3QyICE9IG51bGwNCi0gICAgICAgICAgICAgICAgICAgICYmICghbmV3IERhdGUoKChEYXRlKSBvYmplY3QxKS5nZXRUaW1lKCkpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5iZWZvcmUoKERhdGUpIG9iamVjdDIpIHx8IG9iamVjdDEuZXF1YWxzKG9iamVjdDIpKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFU1VMVF9LRVksIFRPT19MQVRFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSBvYmplY3QxICE9IG51bGwNCi0gICAgICAgICAgICAgICAgICAgICYmIG9iamVjdDIgIT0gbnVsbA0KLSAgICAgICAgICAgICAgICAgICAgJiYgKCFuZXcgRGF0ZSgoKERhdGUpIG9iamVjdDEpLmdldFRpbWUoKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFmdGVyKChEYXRlKSBvYmplY3QyKSB8fCBvYmplY3QxLmVxdWFscyhvYmplY3QyKSk7DQotDQotICAgICAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVNVTFRfS0VZLCBUT09fRUFSTFkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KENPTVBBUkVEX1ZBTFVFX0tFWSwgb2JqZWN0MSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlvbGF0aW9uRm91bmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRGF0ZUlzKSBhbm5vdGF0aW9uKS52YWx1ZU9mKCk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogcHJvdGVjdGVkDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24sDQotICAgICAgICAgICAgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAoU3RyaW5nKSB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UuZ2V0KFJFU1VMVF9LRVkpOw0KLSAgICAgICAgaWYgKFRPT19FQVJMWS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0Tm90QWZ0ZXJFcnJvck1zZ0tleSgoRGF0ZUlzKSBhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKFRPT19MQVRFLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROb3RCZWZvcmVFcnJvck1zZ0tleSgoRGF0ZUlzKSBhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0Tm90RXF1YWxFcnJvck1zZ0tleSgoRGF0ZUlzKSBhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KEFubm90YXRpb24gYW5ub3RhdGlvbiwNCi0gICAgICAgICAgICBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sDQotICAgICAgICAgICAgICAgIGlzVGFyZ2V0Q29tcG9uZW50KSwgYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLA0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVycm9yTWVzc2FnZURldGFpbHMoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiDQotICAgICAgICAgICAgICAgICAgICArIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLy9UT0RPDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKFN0cmluZyBrZXksIEFubm90YXRpb24gYW5ub3RhdGlvbiwNCi0gICAgICAgICAgICBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHJlc29sdmVNZXNzYWdlKGtleSk7DQotDQotICAgICAgICBEYXRlRm9ybWF0IGRhdGVGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSgNCi0gICAgICAgICAgICAgICAgKChEYXRlSXMpIGFubm90YXRpb24pLmVycm9yTWVzc2FnZURhdGVTdHlsZSgpLCBGYWNlc0NvbnRleHQNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKSk7DQotDQotICAgICAgICAvL3JlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIG90aGVyIGNvbXBvbmVudA0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgiezB9IiwgZGF0ZUZvcm1hdA0KLSAgICAgICAgICAgICAgICAuZm9ybWF0KChEYXRlKSB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KENPTVBBUkVEX1ZBTFVFX0tFWSkpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBwcml2YXRlDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBnZXROb3RBZnRlckVycm9yTXNnS2V5KERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uLm5vdEFmdGVyRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5vdEJlZm9yZUVycm9yTXNnS2V5KERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uLm5vdEJlZm9yZUVycm9yTXNnS2V5KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXROb3RFcXVhbEVycm9yTXNnS2V5KERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uLm5vdEVxdWFsRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VxdWFsc1N0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FcXVhbHNTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjZhZjc0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VxdWFsc1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRXF1YWxzU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneQ0KLXsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLA0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKEVxdWFscykgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLA0KLSAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG9iamVjdDEgIT0gbnVsbCAmJiAhb2JqZWN0MS5lcXVhbHMob2JqZWN0Mik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRXF1YWxzKSBhbm5vdGF0aW9uKS52YWx1ZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L05vdEVxdWFsc1N0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Ob3RFcXVhbHNTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTFlZGQ0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L05vdEVxdWFsc1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLk5vdEVxdWFsczsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTm90RXF1YWxzU3RyYXRlZ3kgZXh0ZW5kcyBFcXVhbHNTdHJhdGVneQ0KLXsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwNCi0gICAgICAgICAgICBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChOb3RFcXVhbHMpIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsDQotICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIXN1cGVyLmlzVmlvbGF0aW9uKG9iamVjdDEsIG9iamVjdDIsIGFubm90YXRpb24pOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChOb3RFcXVhbHMpIGFubm90YXRpb24pLnZhbHVlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVxdWlyZWRJZlN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVlNGQxYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZlR5cGU7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIFJlcXVpcmVkSWZTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5DQotew0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZygNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLA0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKFJlcXVpcmVkSWYpIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwNCi0gICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gdmlvbGF0aW9uRm91bmQgPSBmYWxzZTsNCi0NCi0gICAgICAgIGlmICgoKFJlcXVpcmVkSWYpIGFubm90YXRpb24pLmlzKCkuZXF1YWxzKFJlcXVpcmVkSWZUeXBlLmVtcHR5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IChvYmplY3QyID09IG51bGwgfHwgb2JqZWN0Mi5lcXVhbHMoIiIpKQ0KLSAgICAgICAgICAgICAgICAgICAgJiYgKG9iamVjdDEgPT0gbnVsbCB8fCBvYmplY3QxLmVxdWFscygiIikpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoKChSZXF1aXJlZElmKSBhbm5vdGF0aW9uKS5pcygpDQotICAgICAgICAgICAgICAgIC5lcXVhbHMoUmVxdWlyZWRJZlR5cGUubm90X2VtcHR5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IChvYmplY3QyICE9IG51bGwgJiYgIW9iamVjdDIuZXF1YWxzKCIiKSkNCi0gICAgICAgICAgICAgICAgICAgICYmIChvYmplY3QxID09IG51bGwgfHwgb2JqZWN0MS5lcXVhbHMoIiIpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB2aW9sYXRpb25Gb3VuZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChSZXF1aXJlZElmKSBhbm5vdGF0aW9uKS52YWx1ZU9mKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvVGFyZ2V0QWxpYXNTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvVGFyZ2V0QWxpYXNTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmM2NGYxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1RhcmdldEFsaWFzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIFRhcmdldEFsaWFzU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlKQ0KLSAgICAgICAgICAgIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgbWFya2VyIC0gdGhlIGluaGVyaXRlZCBmdW5jdGlvbmFsaXR5IGlzIHJlcXVpcmVkIGFuZCBlbm91Z2gNCi0gICAgfQ0KLQ0KLSAgICAvL1RPRE8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSBtYXJrZXIgLSB0aGUgaW5oZXJpdGVkIGZ1bmN0aW9uYWxpdHkgaXMgcmVxdWlyZWQgYW5kIGVub3VnaA0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU1MTlhZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1qYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW49b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuQmFzaWM9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmU9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRlOGQxNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25VdGlscw0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JPU1NfVkFMSURBVElPTl9TVE9SQUdFX0tFWSA9IENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MNCi0gICAgICAgICAgICAuZ2V0TmFtZSgpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgZ2V0T3JJbml0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRSZXF1ZXN0TWFwKCk7DQotDQotICAgICAgICBpZiAoIXJlcXVlc3RNYXAuY29udGFpbnNLZXkoQ1JPU1NfVkFMSURBVElPTl9TVE9SQUdFX0tFWSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKENyb3NzVmFsaWRhdGlvblN0b3JhZ2UpIHJlcXVlc3RNYXANCi0gICAgICAgICAgICAgICAgLmdldChDUk9TU19WQUxJREFUSU9OX1NUT1JBR0VfS0VZKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0DQotICAgICAgICAgICAgICAgIC5nZXRDdXJyZW50SW5zdGFuY2UoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RXh0ZXJuYWxDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldFJlcXVlc3RNYXAoKQ0KLSAgICAgICAgICAgICAgICAucHV0KENST1NTX1ZBTElEQVRJT05fU1RPUkFHRV9LRVksIG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY2xpZW50X3NpZGVfdmFsaWRhdGlvbi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jbGllbnRfc2lkZV92YWxpZGF0aW9uL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24vdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9wb20ueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNjMjQ1NS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjEtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQ29yZTwvbmFtZT4NCi0gICAgPHZlcnNpb24+JHtidWlsZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0gICAgDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgPC9yZXNvdXJjZXM+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkNGRjNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiDQotICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjIiPg0KLSAgICA8ZmFjdG9yeT4NCi0gICAgICAgIDxyZW5kZXIta2l0LWZhY3Rvcnk+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcktpdEZhY3Rvcnk8L3JlbmRlci1raXQtZmFjdG9yeT4NCi0gICAgPC9mYWN0b3J5Pg0KLQ0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuRXh0VmFsU3RhcnR1cExpc3RlbmVyPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0V4dFZhbEluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzODIxMDEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGRvbnQndCBtb3ZlIHRvIGFuIG90aGVyIHBhY2thZ2UhISENCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBFeHRWYWxJbmZvcm1hdGlvbg0KLXsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSA9IEV4dFZhbEluZm9ybWF0aW9uLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCWE1MX1BBUkFNX1BSRUZJWCA9IEV4dFZhbEluZm9ybWF0aW9uLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICIxLjIuMSI7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dC5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOWM0NDQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkRlZmF1bHRDb21wb25lbnRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5RmluZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRGVmYXVsdEZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FTFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIEV4dFZhbENvbnRleHQKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBFeHRWYWxDb250ZXh0IGV4dFZhbENvbnRleHQgPSBuZXcgRXh0VmFsQ29udGV4dCgpOwotCi0gICAgcHJpdmF0ZSBGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIgPSBuZXcgRGVmYXVsdEZhY3RvcnlGaW5kZXIoKTsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFJlbmRlcmVySW50ZXJjZXB0b3I+IHJlbmRlcmVySW50ZXJjZXB0b3JzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBSZW5kZXJlckludGVyY2VwdG9yPigpOwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGRlbmllZEludGVyY2VwdG9ycyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIHByaXZhdGUgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyPiBwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycyA9Ci0gICAgICAgIG5ldyBBcnJheUxpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcj4oKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgRXh0VmFsQ29udGV4dCBnZXRDb250ZXh0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBleHRWYWxDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBGYWN0b3J5RmluZGVyIGdldEZhY3RvcnlGaW5kZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZhY3RvcnlGaW5kZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmFjdG9yeUZpbmRlcihGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIpCi0gICAgewotICAgICAgICBpZihmYWN0b3J5RmluZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZmFjdG9yeUZpbmRlciA9IGZhY3RvcnlGaW5kZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxSZW5kZXJlckludGVyY2VwdG9yPiBnZXRSZW5kZXJlckludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxSZW5kZXJlckludGVyY2VwdG9yPihyZW5kZXJlckludGVyY2VwdG9ycy52YWx1ZXMoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoRXh0VmFsQ29udGV4dC5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlbmllZEludGVyY2VwdG9ycy5jb250YWlucyhyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9ycy5wdXQocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCksIHJlbmRlcmVySW50ZXJjZXB0b3IpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlcmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKENsYXNzIHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcykKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA9Ci0gICAgICAgICAgICAoUmVuZGVyZXJJbnRlcmNlcHRvcikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3MocmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKEV4dFZhbENvbnRleHQuY2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3JzLnJlbW92ZShyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvL2lmIGFuIGludGVyY2VwdG9yIGhhc24ndCBiZWVuIHJlZ2lzdGVyZWQgc28gZmFyLCBpdCBzaG91bGQgYmUgZGVuaWVkIGF0IGZ1dHVyZSByZWdpc3RyYXRpb25zCi0gICAgcHVibGljIHZvaWQgZGVueVJlbmRlcmVySW50ZXJjZXB0b3IoQ2xhc3MgcmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yID0KLSAgICAgICAgICAgIChSZW5kZXJlckludGVyY2VwdG9yKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzcyhyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoRXh0VmFsQ29udGV4dC5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgZGVuaWVkSW50ZXJjZXB0b3JzLmFkZChyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVyZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IocmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb21wb25lbnRJbml0aWFsaXplcihDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplcikKLSAgICB7Ci0gICAgICAgIERlZmF1bHRDb21wb25lbnRJbml0aWFsaXplci5hZGRDb21wb25lbnRJbml0aWFsaXplcihjb21wb25lbnRJbml0aWFsaXplcik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcj4gZ2V0UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciBwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycy5hZGQocHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICB7Ci0gICAgICAgIE1hcCBhcHBsaWNhdGlvbk1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbk1hcCgpOwotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBiZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBhcHBsaWNhdGlvbk1hcC5nZXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FKTsKLQotICAgICAgICBpZiAoYmVhbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW5pdEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKGFwcGxpY2F0aW9uTWFwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmVhbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGluaXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbihNYXAgYXBwbGljYXRpb25NYXApCi0gICAgewotICAgICAgICBMaXN0PFN0cmluZz4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTlZFTlRJT05fSU5GT19QUk9WSURFUl9CRUFOKTsKLSAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzLmFkZChnZXRDdXN0b21JbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZSgpKTsKLSAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzLmFkZChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuOwotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgaWYgKGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXBwbGljYXRpb25NYXAucHV0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSwgaW5mb3JtYXRpb25Qcm92aWRlckJlYW4pOwotICAgICAgICAgICAgICAgIHJldHVybiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmNsYXNzLmdldE5hbWUoKSArICIgbm90IGZvdW5kIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q3VzdG9tSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWUoKQotICAgIHsKLSAgICAgICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gYmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgRUxVdGlscy5nZXRCZWFuKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkNVU1RPTV9CRUFOKTsKLQotICAgICAgICByZXR1cm4gKGJlYW4gIT0gbnVsbCkgPyBiZWFuLmdldENsYXNzKCkuZ2V0TmFtZSgpIDogbnVsbDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDdkNWYxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFyZW4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICogKyBzb21lIG9mIHRoZW0gY2FuIGJlIGN1c3RvbWl6ZWQgd2l0aGluIGEgY3VzdG9tIGltcGwuIG9mIHRoZSBiZWFuDQotICogKGV4dGVuZCB0aGlzIGNsYXNzIGFuZCBwcm92aWRlIGl0IHZpYSBjb252ZW50aW9uIG9yIHdlYi54bWwpDQotICogPHAvPg0KLSAqIHRoZSBzdGF0aWMgYXBpIHNob3VsZCBvbmx5IGJlIHVzZWQNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSSwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVBTl9OQU1FID0gRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUNCi0gICAgICAgICsgIi4iICsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICAvL2N1c3RvbSBjbGFzcyB3aGljaCBpcyBhbiBvcHRpb25hbCByZXBsYWNlbWVudCBmb3IgdGhpcyBjbGFzcyAoaGFzIHRvIGV4dGVuZCB0aGlzIGNsYXNzKQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQkVBTiA9IChFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRQ0KLSAgICAgICAgKyAiLmN1c3RvbS4iICsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKS5yZXBsYWNlKCIuIiwgIl8iKTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgYmFzZVBhY2thZ2UgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0VYVEVOU0lPTl9CQVNFX1BBQ0tBR0U7DQotDQotICAgIHB1YmxpYyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgIHsNCi0gICAgICAgIGlmICh0aGlzLmJhc2VQYWNrYWdlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5iYXNlUGFja2FnZSA9IEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsgIi5jdXN0b20uIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghdGhpcy5iYXNlUGFja2FnZS5lbmRzV2l0aCgiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuYmFzZVBhY2thZ2UgPSB0aGlzLmJhc2VQYWNrYWdlICsgIi4iOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZVBhY2thZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmFzZVBhY2thZ2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDdXN0b21Db21wb25lbnRBbm5vdGF0aW9uRXh0cmFjdG9yKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVBhY2thZ2UgKyAiQW5ub3RhdGlvbkV4dHJhY3RvciI7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogcG9zdGZpeCB1c2VkIGJ5IHRoZSBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgICAqIHRoZSBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGlzIGZvciBjdXN0b20gc3RyYXRlZ2llcyBvbmx5DQotICAgICAqIChub3QgZm9yIHB1YmxpYyB2YWxpZGF0aW9uIG1vZHVsZXMpDQotICAgICAqIHNvIGl0J3MgZmluZSB0byBjdXN0b21pemUgaXQNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5UG9zdGZpeCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAiVmFsaWRhdGlvblN0cmF0ZWd5IjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGFEYXRhRXh0cmFjdG9yUG9zdGZpeCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAiTWV0YURhdGFFeHRyYWN0b3IiOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIG5hbWUgbWFwcGVyDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEN1c3RvbVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVBhY2thZ2UgKyAiVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmJhc2VQYWNrYWdlICsgIkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YUV4dHJhY3Rvck5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5iYXNlUGFja2FnZSArICJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhRXh0cmFjdG9yTmFtZU1hcHBlciI7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogaW5pdGlhbGl6ZXINCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tUmVuZGVyaW5nQ29udGV4dEluaXRpYWxpemVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVBhY2thZ2UgKyAiUmVuZGVyaW5nQ29udGV4dEluaXRpYWxpemVyIjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEN1c3RvbUNvbXBvbmVudEluaXRpYWxpemVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVBhY2thZ2UgKyAiQ29tcG9uZW50SW5pdGlhbGl6ZXIiOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGZhY3Rvcmllcw0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRDdXN0b21NZXNzYWdlUmVzb2x2ZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVBhY2thZ2UgKyAiTWVzc2FnZVJlc29sdmVyRmFjdG9yeSI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDdXN0b21WYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVBhY2thZ2UgKyAiVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDdXN0b21SZW5kZXJpbmdDb250ZXh0SW5pdGlhbGl6ZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVBhY2thZ2UgKyAiUmVuZGVyaW5nQ29udGV4dEluaXRpYWxpemVyRmFjdG9yeSI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDdXN0b21Db21wb25lbnRJbml0aWFsaXplckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5iYXNlUGFja2FnZSArICJDb21wb25lbnRJbml0aWFsaXplckZhY3RvcnkiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tQ29tcG9uZW50QW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5iYXNlUGFja2FnZSArICJBbm5vdGF0aW9uRXh0cmFjdG9yRmFjdG9yeSI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDdXN0b21NZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5iYXNlUGFja2FnZSArICJNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkiOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGNvbnZlbnRpb25zICh0aGUgcmVzdCBvZiB0aGUgY29udmVudGlvbnMgYXJlIGJ1aWx0IHdpdGggdGhlIGhlbHAgb2YgbmFtZSBtYXBwZXJzLC4uLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRDb252ZW50aW9uRm9yQ3VzdG9tTWVzc2FnZUJ1bmRsZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmJhc2VQYWNrYWdlICsgInZhbGlkYXRpb25fbWVzc2FnZXMiOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGluaXQgaG9vayBmb3IgY29tcG9uZW50IGxpYnMgd2hpY2ggdXNlIGEgcmVuZGVyaW5nIGNvbnRleHQgKGUuZy4gVHJpbmlkYWQpDQotICAgICAqLw0KLQ0KLSAgICAvKg0KLSAgICAgKiBzdGF0aWMgc3RyYXRlZ3kgbWFwcGluZ3MgKG5hbWUgb2YgcHJvcGVydHkgZmlsZXMpDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEN1c3RvbVN0YXRpY1N0cmF0ZWd5TWFwcGluZ1NvdXJjZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmJhc2VQYWNrYWdlICsgInN0cmF0ZWd5X21hcHBpbmdzIjsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBzdGF0aWNTdHJhdGVneU1hcHBpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgIC8qDQotICAgICAqIGZpbmFsIG1ldGhvZHMNCi0gICAgICovDQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Q29udmVudGlvbkZvck1vZHVsZU1lc3NhZ2VCdW5kbGUoU3RyaW5nIHBhY2thZ2VOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbmV3UGFja2FnZU5hbWU7DQotICAgICAgICBpZiAocGFja2FnZU5hbWUuZW5kc1dpdGgoIi5yZXNvbHZlciIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5ld1BhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUucmVwbGFjZSgiLnJlc29sdmVyIiwgIi5idW5kbGUiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBuZXdQYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lLnJlcGxhY2UoIi5yZXNvbHZlci4iLCAiLmJ1bmRsZS4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXdQYWNrYWdlTmFtZSArICIudmFsaWRhdGlvbl9tZXNzYWdlcyI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXRTdGF0aWNTdHJhdGVneU1hcHBpbmdTb3VyY2VzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGljU3RyYXRlZ3lNYXBwaW5nczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBhZGRTdGF0aWNTdHJhdGVneU1hcHBpbmdTb3VyY2UoU3RyaW5nIHJlc291cmNlQnVuZGxlTmFtZSkNCi0gICAgew0KLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuc3RhdGljU3RyYXRlZ3lNYXBwaW5ncy5hZGQocmVzb3VyY2VCdW5kbGVOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBjb250YWluc1N0YXRpY1N0cmF0ZWd5TWFwcGluZ1NvdXJjZSgNCi0gICAgICAgIFN0cmluZyByZXNvdXJjZUJ1bmRsZU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnN0YXRpY1N0cmF0ZWd5TWFwcGluZ3MuY29udGFpbnMocmVzb3VyY2VCdW5kbGVOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRDb252ZW50aW9uTmFtZUZvck1lc3NhZ2VSZXNvbHZlck5hbWUoDQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgU3RyaW5nIHRhcmdldENsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgIi5tZXNzYWdlLnJlc29sdmVyLiIsIHRhcmdldENsYXNzTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRDb252ZW50aW9uTmFtZUZvck1ldGFEYXRhRXh0cmFjdG9yTmFtZSgNCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLCBTdHJpbmcgdGFyZ2V0Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLCAiLm1ldGFkYXRhLmV4dHJhY3Rvci4iLCB0YXJnZXRDbGFzc05hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZShDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRQYWNrYWdlTmFtZSwgU3RyaW5nIHRhcmdldENsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGV4dHJhY3Rvck5hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXROYW1lKCk7DQotDQotICAgICAgICBleHRyYWN0b3JOYW1lID0gZXh0cmFjdG9yTmFtZS5yZXBsYWNlKCIuc3RyYXRlZ3kuIiwgdGFyZ2V0UGFja2FnZU5hbWUpOw0KLQ0KLSAgICAgICAgaWYgKHRhcmdldENsYXNzTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGV4dHJhY3Rvck5hbWUuc3Vic3RyaW5nKDAsIGV4dHJhY3Rvck5hbWUubGFzdEluZGV4T2YoIi4iKSkgKyAiLiIgKyB0YXJnZXRDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHVzZSBhIGN1c3RvbSBuYW1lIG1hcHBlciB0byBpbXBsZW1lbnQgY3VzdG9tIGNvbnZlbnRpb25zDQotICAgICAqLw0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldENvbnZlbnRpb25OYW1lRm9yTWVzc2FnZVJlc29sdmVyQ2xhc3MoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgIlZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB1c2UgYSBjdXN0b20gbmFtZSBtYXBwZXIgdG8gaW1wbGVtZW50IGN1c3RvbSBjb252ZW50aW9ucw0KLSAgICAgKi8NCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRDb252ZW50aW9uTmFtZUZvclZhbGlkYXRpb25TdHJhdGVneShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpLnJlcGxhY2UoIi5hbm5vdGF0aW9uLiIsICIuc3RyYXRlZ3kuIikgKyAiU3RyYXRlZ3kiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Q29udmVudGlvbk5hbWVGb3JNZXRhRGF0YUV4dHJhY3RvckNsYXNzKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneU5hbWUsICJNZXRhRGF0YUV4dHJhY3RvciIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgU3RyaW5nIHRhcmdldFBvc3RmaXgpDQotICAgIHsNCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLmVuZHNXaXRoKCJWYWxpZGF0aW9uU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5zdWJzdHJpbmcoMCwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5sZW5ndGgoKSAtIDE4KSArIHRhcmdldFBvc3RmaXg7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLmVuZHNXaXRoKCJTdHJhdGVneSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLnN1YnN0cmluZygwLCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLmxlbmd0aCgpIC0gOCkgKyB0YXJnZXRQb3N0Zml4Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNWEzYzYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJlbid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICAvKg0KLSAgICAgKiBjdXN0b20NCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FU1NBR0VfQlVORExFID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVTU0FHRV9CVU5ETEUiKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fRVhURU5TSU9OX0JBU0VfUEFDS0FHRSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0JBU0VfUEFDS0FHRSIpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DT05WRU5USU9OX0lORk9fUFJPVklERVJfQkVBTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfTkFNRV9NQVBQRVIiKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQU5OT1RBVElPTl9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQU5OT1RBVElPTl9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSIpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkiKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX0FOTk9UQVRJT05fRVhUUkFDVE9SX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT01QT05FTlRfQU5OT1RBVElPTl9FWFRSQUNUT1JfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DT01QT05FTlRfQU5OT1RBVElPTl9FWFRSQUNUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT01QT05FTlRfQU5OT1RBVElPTl9FWFRSQUNUT1IiKTsNCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRvY3VtZW50YXRpb24iKQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OU1RSQVRFR1lfTUFQUElORyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OU1RSQVRFR1lfTUFQUElORyIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9SRU5ERVJJTkdfQ09OVEVYVF9JTklUSUFMSVpFUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fUkVOREVSSU5HX0NPTlRFWFRfSU5JVElBTElaRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9SRU5ERVJJTkdfQ09OVEVYVF9JTklUSUFMSVpFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1JFTkRFUklOR19DT05URVhUX0lOSVRJQUxJWkVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NPTVBPTkVOVF9JTklUSUFMSVpFUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9FWFRSQUNUT1JfTkFNRV9NQVBQRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9FWFRSQUNUT1JfTkFNRV9NQVBQRVIiKTsNCi0NCi0gICAgLyoNCi0gICAgICogZGVhY3RpdmF0ZQ0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX1JFTkRFUktJVCA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9SRU5ERVJLSVQiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0RFRkFVTFRfQ09OVkVOVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT04iKTsNCi0NCi0gICAgLy90aGVyZSBpcyBub3RoaW5nIGxpa2UgREVBQ1RJVkFURV9ERUZBVUxUX1ZBTElEQVRJT05fSU5URVJDRVBUT1INCi0gICAgLy91c2UgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZGVueVJlbmRlcmVySW50ZXJjZXB0b3IoLi4uKSB3aXRoaW4gYW4gZXh0dmFsLVN0YXJ0dXBMaXN0ZW5lcg0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2Fubm90YXRpb24vQW5ub3RhdGlvbkVudHJ5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2Fubm90YXRpb24vQW5ub3RhdGlvbkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NzBmOTQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9hbm5vdGF0aW9uL0Fubm90YXRpb25FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIERhdGEgaG9sZGVyIHdoaWNoIHN0b3JlcyB0aGUgYW5ub3RhdGlvbiBhbmQgc29tZSBpbmZvcm1hdGlvbiB3aGVyZSB0aGUgYW5ub3RhdGlvbiB3YXMgYXJvdW5kLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGNsYXNzIEFubm90YXRpb25FbnRyeQ0KLXsNCi0gICAgcHJpdmF0ZSBBbm5vdGF0aW9uIGFubm90YXRpb247DQotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotICAgIC8vZS5nLiB2YWx1ZUJpbmRpbmdOYW1lLCBEZWZhdWx0VmFsdWVCaW5kaW5nU2Nhbm5pbmdBbm5vdGF0aW9uRXh0cmFjdG9yIHVzZXMgaXQgZm9yIHRoZSB2YXJpYWJsZS0vbWV0aG9kLW5hbWUNCi0gICAgcHJpdmF0ZSBTdHJpbmcgYm91bmRUbzsNCi0gICAgcHJpdmF0ZSBDbGFzcyBlbnRpdHlDbGFzczsNCi0NCi0gICAgLy9yZXF1ZXN0ZWQgYnkgYmVybmhhcmQgaHVlbWVyDQotICAgIHB1YmxpYyA8VD4gVCBnZXRBbm5vdGF0aW9uKENsYXNzPFQ+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFQpIGFubm90YXRpb247DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0QW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHRoaXMuYW5ub3RhdGlvbiA9IGFubm90YXRpb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWVCaW5kaW5nRXhwcmVzc2lvbihTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJvdW5kVG8oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYm91bmRUbzsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRCb3VuZFRvKFN0cmluZyBib3VuZFRvKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmJvdW5kVG8gPSBib3VuZFRvOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzcyBnZXRFbnRpdHlDbGFzcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBlbnRpdHlDbGFzczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnRpdHlDbGFzcyhDbGFzcyBlbnRpdHlDbGFzcykNCi0gICAgew0KLSAgICAgICAgdGhpcy5lbnRpdHlDbGFzcyA9IGVudGl0eUNsYXNzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvYW5ub3RhdGlvbi9leHRyYWN0b3IvQW5ub3RhdGlvbkV4dHJhY3Rvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9hbm5vdGF0aW9uL2V4dHJhY3Rvci9Bbm5vdGF0aW9uRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMTg1OWMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9hbm5vdGF0aW9uL2V4dHJhY3Rvci9Bbm5vdGF0aW9uRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hbm5vdGF0aW9uLmV4dHJhY3RvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEFuIGFubm90YXRpb24gZXh0cmFjdG9yIGlzIHJlc3BvbnNpYmxlIHRvIGFuYWx5emUgYW4gb2JqZWN0DQotICogYW5kIHJldHVybnMgYWxsIGF2YWlsYWJsZSBhbm5vdGF0aW9ucw0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQW5ub3RhdGlvbkV4dHJhY3Rvcg0KLXsNCi0gICAgTGlzdDxBbm5vdGF0aW9uRW50cnk+IGV4dHJhY3RBbm5vdGF0aW9ucyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBPYmplY3Qgb2JqZWN0KTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9hbm5vdGF0aW9uL2V4dHJhY3Rvci9Bbm5vdGF0aW9uRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9hbm5vdGF0aW9uL2V4dHJhY3Rvci9Bbm5vdGF0aW9uRXh0cmFjdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGJiNDJhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvYW5ub3RhdGlvbi9leHRyYWN0b3IvQW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmFubm90YXRpb24uZXh0cmFjdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogVGhlIGludGVyZmFjZSBmb3IgYWxsIGZhY3RvcmllcyB3aGljaCBjcmVhdGUgYW5ub3RhdGlvbiBleHRyYWN0b3JzDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBBbm5vdGF0aW9uRXh0cmFjdG9yRmFjdG9yeQ0KLXsNCi0gICAgQW5ub3RhdGlvbkV4dHJhY3RvciBjcmVhdGUoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50QW5ub3RhdGlvbkV4dHJhY3Rvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50QW5ub3RhdGlvbkV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjM2YjcyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudEFubm90YXRpb25FeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hbm5vdGF0aW9uLmV4dHJhY3RvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkVMVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkxvZ1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggZXh0cmFjdHMgdGhlIGFubm90YXRpb25zIG9mIHRoZSB2YWx1ZSBiaW5kaW5nIG9mIGEgY29tcG9uZW50Lg0KLSAqIEl0IGV4dHJhY3RzIHRoZSBhbm5vdGF0aW9uIG9mIHRoZSBmaWVsZCBhbmQgdGhlIHByb3BlcnR5Lg0KLSAqIChBbHNvIHRoZSBhbm5vdGF0aW9ucyBvZiBzdXBlciBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzLikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRDb21wb25lbnRBbm5vdGF0aW9uRXh0cmFjdG9yIGltcGxlbWVudHMgQW5ub3RhdGlvbkV4dHJhY3Rvcg0KLXsNCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQ0KLSAgICBwdWJsaWMgTGlzdDxBbm5vdGF0aW9uRW50cnk+IGV4dHJhY3RBbm5vdGF0aW9ucyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBPYmplY3Qgb2JqZWN0KQ0KLSAgICB7DQotICAgICAgICAvL3Nob3VsZCBuZXZlciBvY2N1cg0KLSAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgVUlDb21wb25lbnQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PEFubm90YXRpb25FbnRyeT4oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50ID0gKFVJQ29tcG9uZW50KSBvYmplY3Q7DQotDQotICAgICAgICBMb2dVdGlscy50cmFjZSgic3RhcnQgZXh0cmFjdGluZyBhbm5vdGF0aW9ucyBvZiAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIGdldENsYXNzKCkpOw0KLQ0KLSAgICAgICAgTGlzdDxBbm5vdGF0aW9uRW50cnk+IGFubm90YXRpb25FbnRyaWVzID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uRW50cnk+KCk7DQotDQotICAgICAgICBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IEVMVXRpbHMuZ2V0UmVsaWFibGVWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmICh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8QW5ub3RhdGlvbkVudHJ5PigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIGdldCBiZWFuIGNsYXNzIGFuZCBwcm9wZXJ0eSBuYW1lDQotICAgICAgICAgKi8NCi0gICAgICAgIGludCBiZWFuUHJvcGVydHlCb3JkZXIgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmxhc3RJbmRleE9mKCcuJyk7DQotDQotICAgICAgICBpZiAoYmVhblByb3BlcnR5Qm9yZGVyIDwgMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uRW50cnk+KCk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgYmVhbnMgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLnN1YnN0cmluZyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmluZGV4T2YoJ3snKSArIDEsIGJlYW5Qcm9wZXJ0eUJvcmRlcik7DQotDQotICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLnN1YnN0cmluZyhiZWFuUHJvcGVydHlCb3JkZXIgKyAxLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmluZGV4T2YoJ30nKSk7DQotDQotICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IEVMVXRpbHMuZ2V0VHlwZU9mVmFsdWVCaW5kaW5nRm9yRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsICIjeyIgKyBiZWFucyArICJ9Iik7DQotDQotICAgICAgICAvL2NyZWF0ZSB0ZW1wbGF0ZSBlbnRyeQ0KLSAgICAgICAgQW5ub3RhdGlvbkVudHJ5IHRlbXBsYXRlRW50cnkgPSBuZXcgQW5ub3RhdGlvbkVudHJ5KCk7DQotICAgICAgICAvL1RPRE8gdGVzdCB3aXRoIGNvbXBsZXggY29tcG9uZW50cw0KLSAgICAgICAgdGVtcGxhdGVFbnRyeS5zZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgdGVtcGxhdGVFbnRyeS5zZXRFbnRpdHlDbGFzcyhlbnRpdHlDbGFzcyk7DQotICAgICAgICB0ZW1wbGF0ZUVudHJ5LnNldEJvdW5kVG8oInZhbHVlIik7DQotDQotICAgICAgICAvKg0KLSAgICAgICAgICogZmluZCBhbmQgYWRkIGFubm90YXRpb25zDQotICAgICAgICAgKi8NCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IGVudGl0eUNsYXNzOw0KLQ0KLSAgICAgICAgd2hpbGUgKCFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGN1cnJlbnRDbGFzcywgcHJvcGVydHksIGFubm90YXRpb25FbnRyaWVzLCB0ZW1wbGF0ZUVudHJ5KTsNCi0gICAgICAgICAgICBhZGRGaWVsZEFjY2Vzc0Fubm90YXRpb25zKGN1cnJlbnRDbGFzcywgcHJvcGVydHksIGFubm90YXRpb25FbnRyaWVzLCB0ZW1wbGF0ZUVudHJ5KTsNCi0NCi0gICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50SW50ZXJmYWNlIDogZW50aXR5Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRJbnRlcmZhY2U7DQotDQotICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRDbGFzcyAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhjdXJyZW50Q2xhc3MsIHByb3BlcnR5LCBhbm5vdGF0aW9uRW50cmllcywgdGVtcGxhdGVFbnRyeSk7DQotDQotICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTG9nVXRpbHMudHJhY2UoImV4dHJhY3RBbm5vdGF0aW9ucyBmaW5pc2hlZCIsIGdldENsYXNzKCkpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25FbnRyaWVzOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uRW50cnk+IGFubm90YXRpb25FbnRyaWVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25FbnRyeSB0ZW1wbGF0ZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEpOw0KLQ0KLSAgICAgICAgTWV0aG9kIG1ldGhvZDsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGhvZCA9IGVudGl0eS5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0IiArIHByb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1ldGhvZCA9IGVudGl0eS5nZXREZWNsYXJlZE1ldGhvZCgiaXMiICsgcHJvcGVydHkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTG9nVXRpbHMudHJhY2UoIm1ldGhvZCBub3QgZm91bmQgLSBjbGFzczogIiArIGVudGl0eS5nZXROYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICsgIiAtIG1ldGhvZHM6ICIgKyAiZ2V0IiArIHByb3BlcnR5ICsgIiAiICsgImlzIiArIHByb3BlcnR5LCBnZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGFkZEFubm90YXRpb25Ub0Fubm90YXRpb25FbnRyaWVzKGFubm90YXRpb25FbnRyaWVzLCBBcnJheXMuYXNMaXN0KG1ldGhvZC5nZXRBbm5vdGF0aW9ucygpKSwgdGVtcGxhdGVFbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9ucyhDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEFubm90YXRpb25FbnRyeT4gYW5ub3RhdGlvbkVudHJpZXMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbkVudHJ5IHRlbXBsYXRlRW50cnkpDQotICAgIHsNCi0gICAgICAgIEZpZWxkIGZpZWxkOw0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgZmllbGQgPSBlbnRpdHkuZ2V0RGVjbGFyZWRGaWVsZChwcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmaWVsZCA9IGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKCJfIiArIHByb3BlcnR5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUxKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTG9nVXRpbHMudHJhY2UoImZpZWxkICIgKyBwcm9wZXJ0eSArICIgb3IgXyIgKyBwcm9wZXJ0eSArICIgbm90IGZvdW5kIiwgZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBhZGRBbm5vdGF0aW9uVG9Bbm5vdGF0aW9uRW50cmllcyhhbm5vdGF0aW9uRW50cmllcywgQXJyYXlzLmFzTGlzdChmaWVsZC5nZXRBbm5vdGF0aW9ucygpKSwgdGVtcGxhdGVFbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoDQotICAgICAgICBMaXN0PEFubm90YXRpb25FbnRyeT4gYW5ub3RhdGlvbkVudHJpZXMsDQotICAgICAgICBMaXN0PEFubm90YXRpb24+IGFubm90YXRpb25zLCBBbm5vdGF0aW9uRW50cnkgdGVtcGxhdGVFbnRyeSkNCi0gICAgew0KLSAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhbm5vdGF0aW9uRW50cmllcy5hZGQoY3JlYXRlQW5ub3RhdGlvbkVudHJ5KGFubm90YXRpb24sIHRlbXBsYXRlRW50cnkpKTsNCi0NCi0gICAgICAgICAgICBMb2dVdGlscy50cmFjZShhbm5vdGF0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmb3VuZCIsIGdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uRW50cnkgY3JlYXRlQW5ub3RhdGlvbkVudHJ5KEFubm90YXRpb24gZm91bmRBbm5vdGF0aW9uLCBBbm5vdGF0aW9uRW50cnkgdGVtcGxhdGVFbnRyeSkNCi0gICAgew0KLSAgICAgICAgQW5ub3RhdGlvbkVudHJ5IGVudHJ5ID0gbmV3IEFubm90YXRpb25FbnRyeSgpOw0KLQ0KLSAgICAgICAgZW50cnkuc2V0QW5ub3RhdGlvbihmb3VuZEFubm90YXRpb24pOw0KLQ0KLSAgICAgICAgZW50cnkuc2V0RW50aXR5Q2xhc3ModGVtcGxhdGVFbnRyeS5nZXRFbnRpdHlDbGFzcygpKTsNCi0gICAgICAgIGVudHJ5LnNldFZhbHVlQmluZGluZ0V4cHJlc3Npb24odGVtcGxhdGVFbnRyeS5nZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCkpOw0KLSAgICAgICAgZW50cnkuc2V0Qm91bmRUbyh0ZW1wbGF0ZUVudHJ5LmdldEJvdW5kVG8oKSk7DQotDQotICAgICAgICByZXR1cm4gZW50cnk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50QW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudEFubm90YXRpb25FeHRyYWN0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMjMwM2IuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50QW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmFubm90YXRpb24uZXh0cmFjdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkxvZ1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIFRoaXMgZmFjdG9yeSBjcmVhdGVzIGFuIGFubm90YXRpb24gZXh0cmFjdG9yIHdoaWNoIGV4dHJhY3RzIHRoZSBhbm5vdGF0aW9uDQotICogb2YgdGhlIHZhbHVlIGJpbmRpbmcgb2YgYSBjb21wb25lbnQuDQotICogPHAvPg0KLSAqIG9yZGVyOjxici8+DQotICogPG9sPg0KLSAqICAgPGxpPmNvbmZpZ3VyZWQgYW5ub3RhdGlvbiBleHRyYWN0b3IgKHdlYi54bWwpPC9saT4NCi0gKiAgIDxsaT5jb25maWd1cmVkIGFubm90YXRpb24gZXh0cmFjdG9yIChpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKTwvbGk+DQotICogICA8bGk+ZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjwvbGk+DQotICogPC9vbD4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRDb21wb25lbnRBbm5vdGF0aW9uRXh0cmFjdG9yRmFjdG9yeSBpbXBsZW1lbnRzIEFubm90YXRpb25FeHRyYWN0b3JGYWN0b3J5DQotew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uRXh0cmFjdG9yIGFubm90YXRpb25FeHRyYWN0b3IgPSBudWxsOw0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHB1YmxpYyBBbm5vdGF0aW9uRXh0cmFjdG9yIGNyZWF0ZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uRXh0cmFjdG9yID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGFubm90YXRpb25FeHRyYWN0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICAgICAgYW5ub3RhdGlvbkV4dHJhY3RvckNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fQ09NUE9ORU5UX0FOTk9UQVRJT05fRVhUUkFDVE9SKTsNCi0gICAgICAgICAgICBhbm5vdGF0aW9uRXh0cmFjdG9yQ2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0Q3VzdG9tQ29tcG9uZW50QW5ub3RhdGlvbkV4dHJhY3RvcigpKTsNCi0gICAgICAgICAgICBhbm5vdGF0aW9uRXh0cmFjdG9yQ2xhc3NOYW1lcy5hZGQoRGVmYXVsdENvbXBvbmVudEFubm90YXRpb25FeHRyYWN0b3IuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBhbm5vdGF0aW9uRXh0cmFjdG9yQ2xhc3NOYW1lcykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFubm90YXRpb25FeHRyYWN0b3IgPSAoQW5ub3RhdGlvbkV4dHJhY3RvcikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uRXh0cmFjdG9yICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTG9nVXRpbHMudHJhY2UoYW5ub3RhdGlvbkV4dHJhY3Rvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY3JlYXRlZCIsIGdldENsYXNzKCkpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25FeHRyYWN0b3I7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0RlZmF1bHRGYWN0b3J5RmluZGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRGVmYXVsdEZhY3RvcnlGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZiOWJlZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRGVmYXVsdEZhY3RvcnlGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmFubm90YXRpb24uZXh0cmFjdG9yLkRlZmF1bHRDb21wb25lbnRBbm5vdGF0aW9uRXh0cmFjdG9yRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5sb2dnaW5nLkRlZmF1bHRMb2dnZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuRGVmYXVsdENvbXBvbmVudEluaXRpYWxpemVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLkRlZmF1bHRNZXRhRGF0YUV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8vZHluYW1pYyBhcHByb2FjaCB0byBjcmVhdGUgdGhlIGZhY3RvcmllcyBkdXJpbmcgdGhlIGZpcnN0IHJlcXVlc3QsIHdoZW4gYSBmYWNlcy1jb250ZXh0IGlzIGF2YWlsYWJsZQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWN0b3J5RmluZGVyIGltcGxlbWVudHMgRmFjdG9yeUZpbmRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4gZmFjdG9yeU1hcCA9IG5ldyBIYXNoTWFwPEZhY3RvcnlOYW1lcywgT2JqZWN0PigpOw0KLQ0KLSAgICBwdWJsaWMgZmluYWwgPFQ+IFQgZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUsIENsYXNzPFQ+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZighKGZhY3RvcnlNYXAuY29udGFpbnNLZXkoZmFjdG9yeU5hbWUpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0RmFjdG9yeShmYWN0b3J5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKFQpZmFjdG9yeU1hcC5nZXQoZmFjdG9yeU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIHN3aXRjaCAoZmFjdG9yeU5hbWUpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2FzZSBDT01QT05FTlRfQU5OT1RBVElPTl9FWFRSQUNUT1JfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZUNvbXBvbmVudEFubm90YXRpb25FeHRyYWN0b3JGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZU1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBNRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBDT01QT05FTlRfSU5JVElBTElaRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZUNvbXBvbmVudEluaXRpYWxpemVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIFJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIExPR0dFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlTG9nZ2VyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBkZWZhdWx0OiAvL3JlcXVpcmVkIGJ5IGNoZWNrc3R5bGUNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgcG9zc2libGUgdG8gY3JlYXRlIGZhY3RvcnkgIiArIGZhY3RvcnlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZhY3RvcnlNYXAucHV0KGZhY3RvcnlOYW1lLCBmYWN0b3J5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUNvbXBvbmVudEFubm90YXRpb25FeHRyYWN0b3JGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGFubm90YXRpb25FeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgYW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9BTk5PVEFUSU9OX0VYVFJBQ1RPUl9GQUNUT1JZKTsNCi0gICAgICAgIGFubm90YXRpb25FeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0Q3VzdG9tQ29tcG9uZW50QW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnkoKSk7DQotICAgICAgICBhbm5vdGF0aW9uRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRDb21wb25lbnRBbm5vdGF0aW9uRXh0cmFjdG9yRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogYW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkpOw0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0Q3VzdG9tVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpKTsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotICAgICAgICBMaXN0PFN0cmluZz4gbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSk7DQotICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXRDdXN0b21NZXNzYWdlUmVzb2x2ZXJGYWN0b3J5KCkpOw0KLSAgICAgICAgbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKERlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlTWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZKTsNCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0Q3VzdG9tTWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCkpOw0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlQ29tcG9uZW50SW5pdGlhbGl6ZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGNvbXBvbmVudEluaXRpYWxpemVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSX0ZBQ1RPUlkpOw0KLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXRDdXN0b21Db21wb25lbnRJbml0aWFsaXplckZhY3RvcnkoKSk7DQotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplckZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0Q29tcG9uZW50SW5pdGlhbGl6ZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBjb21wb25lbnRJbml0aWFsaXplckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgY3JlYXRlTG9nZ2VyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdExvZ2dlckZhY3RvcnkoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmMjYyNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBGYWN0b3J5RmluZGVyCi17Ci0gICAgPFQ+IFQgZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUsIENsYXNzPFQ+IHRhcmdldENsYXNzKTsKLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA5NGY3Yy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLXB1YmxpYyBlbnVtIEZhY3RvcnlOYW1lcwotewotICAgIENPTVBPTkVOVF9BTk5PVEFUSU9OX0VYVFJBQ1RPUl9GQUNUT1JZLAotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwKLSAgICBNRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksCi0gICAgTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLAotICAgIENPTVBPTkVOVF9JTklUSUFMSVpFUl9GQUNUT1JZLAotICAgIFJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksCi0gICAgTE9HR0VSX0ZBQ1RPUlkKLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9Db21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGFmNWU2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvbmVudEluaXRpYWxpemVyDQotew0KLSAgICB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0RlZmF1bHRDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvRGVmYXVsdENvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNDA2YTQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvRGVmYXVsdENvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Mb2dVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29tcG9uZW50SW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+IGNvbXBvbmVudEluaXRpYWxpemVycyA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBmb3IoQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIgOiBjb21wb25lbnRJbml0aWFsaXplcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyLmNvbmZpZ3VyZUNvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7Ci0gICAgICAgICAgICBMb2dVdGlscy50cmFjZSgiY29uZmlndXJlQ29tcG9uZW50IG9mICIgKyBjb21wb25lbnRJbml0aWFsaXplci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY2FsbGVkIixnZXRDbGFzcygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZENvbXBvbmVudEluaXRpYWxpemVyKENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChEZWZhdWx0Q29tcG9uZW50SW5pdGlhbGl6ZXIuY2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQoY29tcG9uZW50SW5pdGlhbGl6ZXIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvRGVmYXVsdENvbXBvbmVudEluaXRpYWxpemVyRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvRGVmYXVsdENvbXBvbmVudEluaXRpYWxpemVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDMwMWQxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0RlZmF1bHRDb21wb25lbnRJbml0aWFsaXplckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5DbGFzc01hcHBpbmdGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuTG9nVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENvbXBvbmVudEluaXRpYWxpemVyRmFjdG9yeSBpbXBsZW1lbnRzCi0gICAgQ2xhc3NNYXBwaW5nRmFjdG9yeTxVSUNvbXBvbmVudCwgQ29tcG9uZW50SW5pdGlhbGl6ZXI+Ci17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgQ29tcG9uZW50SW5pdGlhbGl6ZXI+IGNvbXBvbmVudFRvQ29tcG9uZW50SW5pdGlhbGl6ZXJNYXBwaW5nCi0gICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb21wb25lbnRJbml0aWFsaXplcj4oKTsKLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcwotICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9JTklUSUFMSVpFUik7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcwotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldEN1c3RvbUNvbXBvbmVudEluaXRpYWxpemVyKCkpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMKLSAgICAgICAgICAgIC5hZGQoRGVmYXVsdENvbXBvbmVudEluaXRpYWxpemVyLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbXBvbmVudEluaXRpYWxpemVyIGNyZWF0ZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBjb21wb25lbnRLZXkgPSB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQotICAgICAgICBpZiAoY29tcG9uZW50VG9Db21wb25lbnRJbml0aWFsaXplck1hcHBpbmcuY29udGFpbnNLZXkoY29tcG9uZW50S2V5KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFRvQ29tcG9uZW50SW5pdGlhbGl6ZXJNYXBwaW5nLmdldChjb21wb25lbnRLZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXI7Ci0KLSAgICAgICAgZm9yIChTdHJpbmcgY29tcG9uZW50SW5pdGlhbGl6ZXJOYW1lIDogY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb21wb25lbnRJbml0aWFsaXplciA9Ci0gICAgICAgICAgICAgICAgKENvbXBvbmVudEluaXRpYWxpemVyKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY29tcG9uZW50SW5pdGlhbGl6ZXJOYW1lKTsKLQotICAgICAgICAgICAgaWYgKGNvbXBvbmVudEluaXRpYWxpemVyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50VG9Db21wb25lbnRJbml0aWFsaXplck1hcHBpbmcucHV0KGNvbXBvbmVudEtleSwgY29tcG9uZW50SW5pdGlhbGl6ZXIpOwotCi0gICAgICAgICAgICAgICAgTG9nVXRpbHMudHJhY2UoY29tcG9uZW50SW5pdGlhbGl6ZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHVzZWQgZm9yICIgKyBjb21wb25lbnRLZXksIGdldENsYXNzKCkpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudEluaXRpYWxpemVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTMyMjAyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yIGltcGxlbWVudHMgUmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0SW50ZXJjZXB0b3JJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIGJlZm9yZQotICAgICovCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIC8qCi0gICAgICogYWZ0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZnRlckRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyRW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZnRlckVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzIyZDFhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIFN0cmluZyBnZXRJbnRlcmNlcHRvcklkKCk7Ci0gICAgLyoKLSAgICAgKiBiZWZvcmUKLSAgICAgKi8KLSAgICB2b2lkIGJlZm9yZURlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpOwotCi0gICAgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlRW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbjsKLQotICAgIC8qCi0gICAgICogYWZ0ZXIKLSAgICAgKi8KLSAgICB2b2lkIGFmdGVyRGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcik7Ci0KLSAgICB2b2lkIGFmdGVyRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyRW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyRW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MTY3NDAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hbm5vdGF0aW9uLmV4dHJhY3Rvci5Bbm5vdGF0aW9uRXh0cmFjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmFubm90YXRpb24uZXh0cmFjdG9yLkFubm90YXRpb25FeHRyYWN0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmFubm90YXRpb24uQW5ub3RhdGlvbkVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXIuUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Mb2dVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkludGVyY2VwdG9yIGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW5pdENvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYoISh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBMb2dVdGlscy50cmFjZSgic3RhcnQgdG8gaW5pdCBjb21wb25lbnQgIiArIHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpLCBnZXRDbGFzcygpKTsKLQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5OwotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvcjsKLQotICAgICAgICBBbm5vdGF0aW9uRXh0cmFjdG9yIGFubm90YXRpb25FeHRyYWN0b3IgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkuZ2V0RmFjdG9yeSgKLSAgICAgICAgICAgIEZhY3RvcnlOYW1lcy5DT01QT05FTlRfQU5OT1RBVElPTl9FWFRSQUNUT1JfRkFDVE9SWSwgQW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnkuY2xhc3MpLmNyZWF0ZSgpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGE7Ci0gICAgICAgIGZvciAoQW5ub3RhdGlvbkVudHJ5IGVudHJ5IDogYW5ub3RhdGlvbkV4dHJhY3Rvci5leHRyYWN0QW5ub3RhdGlvbnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCkpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yQW5ub3RhdGlvbihlbnRyeS5nZXRBbm5vdGF0aW9uKCkpOwotCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3IgPSBFeHRWYWxVdGlscy5nZXRNZXRhRGF0YUV4dHJhY3RvckZvclZhbGlkYXRpb25TdHJhdGVneSh2YWxpZGF0aW9uU3RyYXRlZ3kpOwotCi0gICAgICAgICAgICAgICAgaWYobWV0YURhdGFFeHRyYWN0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdE1ldGFEYXRhKGVudHJ5LmdldEFubm90YXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihtZXRhRGF0YSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvL2dldCBjb21wb25lbnQgaW5pdGlhbGl6ZXIgZm9yIHRoZSBjdXJyZW50IGNvbXBvbmVudCBhbmQgY29uZmlndXJlIGl0Ci0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29uZmlndXJlQ29tcG9uZW50V2l0aE1ldGFEYXRhKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIExvZ1V0aWxzLnRyYWNlKCJpbml0IGNvbXBvbmVudCBvZiAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIiwgZ2V0Q2xhc3MoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0ID0gd3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLQotICAgICAgICAvL3JlY29yZGUgdXNlciBpbnB1dCBlLmcuIGZvciBjcm9zcy1jb21wb25lbnQgdmFsaWRhdGlvbgotICAgICAgICBmb3IoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciByZWNvcmRlciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlY29yZGVyLnJlY29yZFVzZXJJbnB1dCh1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsKLQotICAgICAgICAgICAgTG9nVXRpbHMudHJhY2UocmVjb3JkZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGNhbGxlZCIsIGdldENsYXNzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvY2Vzc1ZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkKLSAgICB7Ci0gICAgICAgIGlmICghKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBMb2dVdGlscy50cmFjZSgic3RhcnQgdmFsaWRhdGlvbiIsIGdldENsYXNzKCkpOwotCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7Ci0KLSAgICAgICAgQW5ub3RhdGlvbkV4dHJhY3RvciBhbm5vdGF0aW9uRXh0cmFjdG9yID0gRXh0VmFsVXRpbHMuZ2V0QW5ub3RhdGlvbkV4dHJhY3RvcigpOwotCi0gICAgICAgIGZvciAoQW5ub3RhdGlvbkVudHJ5IGVudHJ5IDogYW5ub3RhdGlvbkV4dHJhY3Rvci5leHRyYWN0QW5ub3RhdGlvbnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25TdHJhdGVneUZvckFubm90YXRpb24oZW50cnkuZ2V0QW5ub3RhdGlvbigpKTsKLQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExvZ1V0aWxzLnRyYWNlKCJ2YWxpZGF0ZSAiICsgZW50cnkuZ2V0QW5ub3RhdGlvbigpLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB3aXRoICIgKwotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIGdldENsYXNzKCkpOwotCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExvZ1V0aWxzLnRyYWNlKCJubyB2YWxpZGF0aW9uIHN0cmF0ZWd5IGZvdW5kIGZvciAiICsgZW50cnkuZ2V0QW5ub3RhdGlvbigpLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBnZXRDbGFzcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIExvZ1V0aWxzLnRyYWNlKCJ2YWxpZGF0aW9uIGZpbmlzaGVkIiwgZ2V0Q2xhc3MoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9sb2dnaW5nL0Fic3RyYWN0TG9nZ2VyRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9sb2dnaW5nL0Fic3RyYWN0TG9nZ2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTUyNDBkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbG9nZ2luZy9BYnN0cmFjdExvZ2dlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmxvZ2dpbmc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogdG8gaW5qZWN0IGEgY3VzdG9tIGxvZ2dlciBmYWN0b3J5IHVzZToNCi0gKiAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAqICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5MT0dHRVJfRkFDVE9SWSwgQWJzdHJhY3RMb2dnZXJGYWN0b3J5LmNsYXNzKQ0KLSAqICAgICAgICAgIC5zZXRDdXN0b21Mb2dnZXJGYWN0b3J5KG5ldyBDdXN0b21Mb2dnZXJGYWN0b3J5KCkpOw0KLSAqIGUuZy4gdmlhIGEgc3RhcnR1cC1saXN0ZW5lciAtIHNlZSBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExvZ2dlckZhY3RvcnkgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PENsYXNzLCBMb2dnZXI+DQotew0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RMb2dnZXJGYWN0b3J5IGN1c3RvbUxvZ2dlckZhY3Rvcnk7DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21Mb2dnZXJGYWN0b3J5KEFic3RyYWN0TG9nZ2VyRmFjdG9yeSBsb2dnZXJGYWN0b3J5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmN1c3RvbUxvZ2dlckZhY3RvcnkgPSBsb2dnZXJGYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBmaW5hbCBMb2dnZXIgY3JlYXRlKENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBMb2dnZXIgcmVzdWx0ID0gbnVsbDsNCi0NCi0gICAgICAgIGlmKHRoaXMuY3VzdG9tTG9nZ2VyRmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuY3VzdG9tTG9nZ2VyRmFjdG9yeS5jcmVhdGVMb2dnZXIodGFyZ2V0Q2xhc3MpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxvZ2dlcih0YXJnZXRDbGFzcyk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBMb2dnZXIgY3JlYXRlTG9nZ2VyKENsYXNzIHRhcmdldENsYXNzKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9sb2dnaW5nL0RlZmF1bHRMb2dnZXJGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2xvZ2dpbmcvRGVmYXVsdExvZ2dlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhZjBhNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2xvZ2dpbmcvRGVmYXVsdExvZ2dlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmxvZ2dpbmc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRUxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRMb2dnZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RMb2dnZXJGYWN0b3J5DQotew0KLSAgICBwcml2YXRlIE1hcDxDbGFzcywgTG9nZ2VyPiBjbGFzc1RvTG9nZ2VyTWFwcGluZyA9IG5ldyBIYXNoTWFwPENsYXNzLCBMb2dnZXI+KCk7DQotDQotICAgIHByb3RlY3RlZCBMb2dnZXIgY3JlYXRlTG9nZ2VyKENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBMb2dnZXIgY3VzdG9tTG9nZ2VyID0gbnVsbDsNCi0NCi0gICAgICAgIGlmKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1c3RvbUxvZ2dlciA9IChMb2dnZXIpIEVMVXRpbHMuZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgIiN7Y3VzdG9tRXh0VmFsTG9nZ2VyQWRhcHRlcn0iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKCF0aGlzLmNsYXNzVG9Mb2dnZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHRhcmdldENsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmNsYXNzVG9Mb2dnZXJNYXBwaW5nLnB1dCh0YXJnZXRDbGFzcywgY3VzdG9tTG9nZ2VyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBuZXcgTG9nZ2VyV3JhcHBlcihjdXN0b21Mb2dnZXIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbG9nZ2luZy9MZXZlbC5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9sb2dnaW5nL0xldmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZDA4ODYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9sb2dnaW5nL0xldmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5sb2dnaW5nOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGVudW0gTGV2ZWwNCi17DQotICAgIFRSQUNFLA0KLSAgICBERUJVRywNCi0gICAgSU5GTywNCi0gICAgV0FSTiwNCi0gICAgRVJST1IsDQotICAgIEZBVEFMDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbG9nZ2luZy9Mb2dnZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbG9nZ2luZy9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhlYjM5Yy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2xvZ2dpbmcvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5sb2dnaW5nOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBMb2dnZXINCi17DQotICAgIHZvaWQgbG9nKExldmVsIGxldmVsLCBTdHJpbmcgbWVzc2FnZSk7DQotICAgIHZvaWQgbG9nKExldmVsIGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbG9nZ2luZy9Mb2dnZXJXcmFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2xvZ2dpbmcvTG9nZ2VyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmY5MjlmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbG9nZ2luZy9Mb2dnZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5sb2dnaW5nOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTG9nZ2VyV3JhcHBlciBpbXBsZW1lbnRzIExvZ2dlcg0KLXsNCi0gICAgcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyOw0KLSAgICBwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIgamRrTG9nZ2VyOw0KLQ0KLSAgICBwdWJsaWMgTG9nZ2VyV3JhcHBlcihMb2dnZXIgbG9nZ2VyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjsNCi0NCi0gICAgICAgIGlmKGpka0xvZ2dlciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGpka0xvZ2dlciA9IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlci5nZXRMb2dnZXIoTG9nZ2VyV3JhcHBlci5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgICAgIC8vbG9nIHRoaXMgd2FybmluZyBqdXN0IG9uY2UNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlciA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgamRrTG9nZ2VyLmxvZ3AoamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwuV0FSTklORywgTG9nZ2VyV3JhcHBlci5jbGFzcy5nZXROYW1lKCksICJMb2dnZXJXcmFwcGVyKCkiLA0KLSAgICAgICAgICAgICAgICAibm8gbG9nZ2VyIGF0dGFjaGVkIC0gZS5nLjogZm9yIGNvbW1vbnMgbG9nZ2luZyBwbGVhc2UgdXNlIHRoZSBjb21tb25zLWxvZ2dpbmctc3VwcG9ydCBtb2R1bGUiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgbG9nKExldmVsIGxldmVsLCBTdHJpbmcgbWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBsb2coTGV2ZWwgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmxvZ2dlciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhsZXZlbCwgbWVzc2FnZSwgdGhyb3dhYmxlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjU3NDgyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQSBnZW5lcmljIGltcGxlbWVudGF0aW9uLiBTdWJjbGFzc2VzIGp1c3QgaGF2ZSB0byBub3cgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBuYW1lIG1hcHBlci4NCi0gKg0KLSAqIE5hbWVNYXBwZXJzIGFyZSBzdGF0ZWxlc3MuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VD4gaW1wbGVtZW50cyBOYW1lTWFwcGVyPFQ+DQotew0KLSAgICBwcml2YXRlIE5hbWVNYXBwZXI8VD4gY3VzdG9tTmFtZU1hcHBlcjsNCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFQgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZiAoY3VzdG9tTmFtZU1hcHBlciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCk7DQotDQotICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTmFtZU1hcHBlciA9IChOYW1lTWFwcGVyPFQ+KSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKGN1c3RvbU5hbWVNYXBwZXIgIT0gbnVsbCkgPyBjdXN0b21OYW1lTWFwcGVyLmNyZWF0ZU5hbWUoc291cmNlKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGExNDIzYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9DbGFzc01hcHBpbmdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIENsYXNzTWFwcGluZ0ZhY3Rvcnk8UCwgUj4NCi17DQotICAgIFIgY3JlYXRlKFAgc291cmNlKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDg0MTI0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL05hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSBmb3IgbmFtZSBtYXBwZXJzLg0KLSAqIEEgbmFtZSBtYXBwZXIgY2FsY3VsYXRlcyBhIG5hbWUgZm9yIGEgZ2l2ZW4gc291cmNlIG9iamVjdC4NCi0gKiBlLmcuIEFubm90YXRpb24gLT4gVmFsaWRhdGlvblN0cmF0ZWd5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVNYXBwZXI8VD4NCi17DQotICAgIFN0cmluZyBjcmVhdGVOYW1lKFQgc291cmNlKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvQ29tbW9uTWV0YURhdGFLZXlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMjA1ODMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhOw0KLQ0KLS8qKg0KLSAqIGhlbHBlciBmb3IgZnJlcXVlbnQgbWV0YS1kYXRhIGtleXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogcGxhY2VkIGluIGNvcmUgdG8gYXZvaWQgZHVwbGljYXRlZCBpbmZvcm1hdGlvbiBpbiBtdWx0aXBsZSBtb2R1bGVzICh2YWxpZGF0aW9uIG1vZHVsZSBhbmQgY29tcG9uZW50LXN1cHBvcnQgbW9kdWxlKQ0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbW9uTWV0YURhdGFLZXlzDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVJUkVEID0gInJlcXVpcmVkIjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5fTEVOR1RIID0gIm1pbl9sZW5ndGgiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9MRU5HVEggPSAibWF4X2xlbmd0aCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOR0VfTUlOID0gInJhbmdlX21pbiI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOR0VfTUFYID0gInJhbmdlX21heCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUVEVSTiA9ICJwYXR0ZXJuIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRURVJOX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRSA9ICJwYXR0ZXJuX3ZhbGlkYXRpb25fZXJyb3JfbWVzc2FnZSI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1BSUwgPSAiZW1haWwiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTSA9ICJjdXN0b20iOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9CZWFuTWV0YURhdGFFeHRyYWN0b3JBZGFwdGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9CZWFuTWV0YURhdGFFeHRyYWN0b3JBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkY2NjM2YuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvQmVhbk1ldGFEYXRhRXh0cmFjdG9yQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgZXF1aXZhbGVudCB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0gKg0KLSAqIGlmIHRoZXJlIGlzIGFsc28gYSBwcm94eSBmb3IgdGhlIGV4dHJhY3RvciB5b3UgY2FuIHVzZSB0aGUgY2xhc3NOYW1lIHByb3BlcnR5IHRvIG1hbnVhbGx5IHJlcGVhdCB0aGUNCi0gKiBmdWxsIHF1YWxpZmllZCBjbGFzcyBuYW1lLg0KLSAqDQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGludGVyZmFjZSBCZWFuTWV0YURhdGFFeHRyYWN0b3JBZGFwdGVyIGV4dGVuZHMgTWV0YURhdGFFeHRyYWN0b3INCi17DQotICAgIFN0cmluZyBnZXRNZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9CZWFuTWV0YURhdGFFeHRyYWN0b3JBZGFwdGVySW1wbC5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvQmVhbk1ldGFEYXRhRXh0cmFjdG9yQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNhOWU4MC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9CZWFuTWV0YURhdGFFeHRyYWN0b3JBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgZXF1aXZhbGVudCB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0gKg0KLSAqIGlmIHRoZXJlIGlzIGFsc28gYSBwcm94eSBmb3IgdGhlIGV4dHJhY3RvciB5b3UgY2FuIHVzZSB0aGUgY2xhc3NOYW1lIHByb3BlcnR5IHRvIG1hbnVhbGx5IHJlcGVhdCB0aGUNCi0gKiBmdWxsIHF1YWxpZmllZCBjbGFzcyBuYW1lLg0KLSAqDQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGNsYXNzIEJlYW5NZXRhRGF0YUV4dHJhY3RvckFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQmVhbk1ldGFEYXRhRXh0cmFjdG9yQWRhcHRlcg0KLXsNCi0gICAgcHJpdmF0ZSBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvcjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWU7DQotDQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGV4dHJhY3RNZXRhRGF0YShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm1ldGFEYXRhRXh0cmFjdG9yLmV4dHJhY3RNZXRhRGF0YShhbm5vdGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWU7DQotICAgICAgICB9DQotICAgICAgICBpZihtZXRhRGF0YUV4dHJhY3Rvci5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yLmdldENsYXNzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lKFN0cmluZyBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZSA9IG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXRhRGF0YUV4dHJhY3RvciBnZXRNZXRhRGF0YUV4dHJhY3RvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUV4dHJhY3RvcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YUV4dHJhY3RvcihNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YUV4dHJhY3RvciA9IG1ldGFEYXRhRXh0cmFjdG9yOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg2ZmQ5ZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5tYXBwZXINCi0gICAgLkN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhRXh0cmFjdG9yTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLm1hcHBlcg0KLSAgICAuQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFFeHRyYWN0b3JOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IubWFwcGVyDQotICAgIC5EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YUV4dHJhY3Rvck5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5tYXBwZXINCi0gICAgLlNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFFeHRyYWN0b3JOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IubWFwcGVyDQotICAgIC5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YUV4dHJhY3Rvck5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Mb2dVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotDQotLyoqDQotICogRmFjdG9yeSB3aGljaCBjcmVhdGVzIHRoZSBNZXRhRGF0YUV4dHJhY3RvciBmb3IgYSBnaXZlbiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogVmFsaWRhdGlvblN0cmF0ZWd5IC0+IE1ldGFEYXRhRXh0cmFjdG9yIGluc3RlYWQgb2YgQW5ub3RhdGlvbiAtPiBNZXRhRGF0YUV4dHJhY3Rvcg0KLSAqIHRvIGF2b2lkIGEgc2Vjb25kIHN0YXRpYyBtYXBwaW5nIGUuZy4gZm9yIGpwYSBhbm5vdGF0aW9ucw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkgaW1wbGVtZW50cw0KLSAgICBDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWV0YURhdGFFeHRyYWN0b3I+DQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFFeHRyYWN0b3JNYXBwaW5nID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBuYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0NCi0gICAgc3RhdGljDQotICAgIHsNCi0gICAgICAgIG5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFFeHRyYWN0b3JOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YUV4dHJhY3Rvck5hbWVNYXBwZXIoKSk7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhRXh0cmFjdG9yTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIG5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YUV4dHJhY3Rvck5hbWVNYXBwZXIoKSk7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhRXh0cmFjdG9yTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lID0gbnVsbDsNCi0NCi0gICAgICAgIC8vcHJveHkgY2hlY2sNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICAvL2luIGNhc2Ugb2YgYSBwcm94eSBhbmQgdGhlIHVzYWdlIG9mIGEgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi0gICAgICAgIGVsc2UgaWYgKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgPSAoKEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKXZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFFeHRyYWN0b3JNYXBwaW5nLmNvbnRhaW5zS2V5KHZhbGlkYXRpb25TdHJhdGVneU5hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoTWV0YURhdGFFeHRyYWN0b3IpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhRXh0cmFjdG9yTWFwcGluZy5nZXQodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3I7DQotICAgICAgICBTdHJpbmcgZXh0cmFjdG9yTmFtZTsNCi0gICAgICAgIC8vbnVsbCAtPiB1c2UgbmFtZSBtYXBwZXJzDQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiBuYW1lTWFwcGVyIDogbmFtZU1hcHBlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgZXh0cmFjdG9yTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIGlmIChleHRyYWN0b3JOYW1lID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3IgPSAoTWV0YURhdGFFeHRyYWN0b3IpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGV4dHJhY3Rvck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3RvciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhRXh0cmFjdG9yTWFwcGluZy5wdXQodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgZXh0cmFjdG9yTmFtZSk7DQotDQotICAgICAgICAgICAgICAgICAgICBMb2dVdGlscy50cmFjZShleHRyYWN0b3JOYW1lICsgIiB1c2VkIGZvciAiICsgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSAsIGdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YUV4dHJhY3RvcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9NZXRhRGF0YUV4dHJhY3Rvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBiY2Q4OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9NZXRhRGF0YUV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBNZXRhRGF0YUV4dHJhY3Rvcg0KLXsNCi0gICAgTWFwPFN0cmluZywgT2JqZWN0PiBleHRyYWN0TWV0YURhdGEoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhRXh0cmFjdG9yTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhRXh0cmFjdG9yTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGZjOTllLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL21hcHBlci9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YUV4dHJhY3Rvck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIC0gaWYgdGhlcmUgaXMgYSBwcm94eSBhcm91bmQgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5BTFRFUk5BVElWRX0pDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhRXh0cmFjdG9yTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoKEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKXZhbGlkYXRpb25TdHJhdGVneSkuZ2V0TWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YUV4dHJhY3Rvck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YUV4dHJhY3Rvck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I4YmU3NC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFFeHRyYWN0b3JOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YUV4dHJhY3RvcnMuDQotICogKGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YUV4dHJhY3Rvck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfRVhUUkFDVE9SX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YUV4dHJhY3Rvck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YUV4dHJhY3Rvck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE1NzNiMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFFeHRyYWN0b3JOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gTWV0YURhdGFFeHRyYWN0b3JzLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhRXh0cmFjdG9yTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXRDdXN0b21WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhRXh0cmFjdG9yTmFtZU1hcHBlcigpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YUV4dHJhY3Rvck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YUV4dHJhY3Rvck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4ZDQ2MS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFFeHRyYWN0b3JOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIG1hcHMgRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1ldGFEYXRhRXh0cmFjdG9ycy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhRXh0cmFjdG9yTmFtZU1hcHBlciBpbXBsZW1lbnRzDQotICAgIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldENvbnZlbnRpb25OYW1lRm9yTWV0YURhdGFFeHRyYWN0b3JOYW1lKA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgZ2V0Q2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldENvbnZlbnRpb25OYW1lRm9yTWV0YURhdGFFeHRyYWN0b3JDbGFzcyh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhRXh0cmFjdG9yTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFFeHRyYWN0b3JOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMDkzOTguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFFeHRyYWN0b3JOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciB0byBwbGFjZSBWYWxpZGF0aW9uU3RyYXRlZ2llcyBhbmQgTWV0YURhdGFFeHRyYWN0b3JzIGluIHRoZSBzYW1lIHBhY2thZ2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5BTFRFUk5BVElWRX0pDQotcHVibGljIGNsYXNzIFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFFeHRyYWN0b3JOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZ2V0U2ltcGxlTWV0YURhdGFFeHRyYWN0b3JOYW1lKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkgKyAiLiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNpbXBsZU1ldGFEYXRhRXh0cmFjdG9yTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwb3N0Zml4ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXRNZXRhRGF0YUV4dHJhY3RvclBvc3RmaXgoKTsNCi0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lQYWNrYWdlTmFtZSArIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZQ0KLSAgICAgICAgICAgICAgICAucmVwbGFjZShFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldFZhbGlkYXRpb25TdHJhdGVneVBvc3RmaXgoKSxwb3N0Zml4KQ0KLSAgICAgICAgICAgICAgICAucmVwbGFjZSgiVmFsaWRhdGlvblN0cmF0ZWd5IiwgcG9zdGZpeCkNCi0gICAgICAgICAgICAgICAgLnJlcGxhY2UoIlN0cmF0ZWd5IiwgcG9zdGZpeCk7DQotICAgIH0NCi0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZWNvcmRlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlY29yZGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI2OTAzZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlY29yZGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIKLXsKLSAgICB2b2lkIHJlY29yZFVzZXJJbnB1dChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0Fic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0Fic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI1MTk3MC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQ2xhc3NNYXBwaW5nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Mb2dVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci0KLS8qKgotICogQmFzZSBmb3IgYWxsIFJlbmRlcktpdFdyYXBwZXJGYWN0b3JpZXMgdG8gZm9yY2UgYSBzcGVjaWZpYyBiZWhhdmlvdXIKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxSZW5kZXJLaXQsIFJlbmRlcktpdD4KLXsKLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSB3cmFwcGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBkZWFjdGl2YXRlZCA9IGZhbHNlOwotCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSByZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSkKLSAgICB7Ci0gICAgICAgIExvZ1V0aWxzLnRyYWNlKHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCIsIGdldENsYXNzKCkpOwotCi0gICAgICAgIGlmKHRoaXMud3JhcHBlZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLndyYXBwZWQuYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkocmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gICAgewotICAgICAgICBMb2dVdGlscy50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZGVhY3RpdmF0ZWQiLCBnZXRDbGFzcygpKTsKLQotICAgICAgICB0aGlzLmRlYWN0aXZhdGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlYWN0aXZhdGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWFjdGl2YXRlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgUmVuZGVyS2l0IGNyZWF0ZShSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgaWYoaXNEZWFjdGl2YXRlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFJlbmRlcktpdCByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIGlmKHRoaXMud3JhcHBlZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSB0aGlzLndyYXBwZWQuY3JlYXRlKHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVdyYXBwZXIocmVuZGVyS2l0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFJlbmRlcktpdCBjcmVhdGVXcmFwcGVyKFJlbmRlcktpdCByZW5kZXJLaXQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0RlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMzUyNDMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Mb2dVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ci17Ci0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCBjcmVhdGVXcmFwcGVyKFJlbmRlcktpdCByZW5kZXJLaXQpCi0gICAgewotICAgICAgICBMb2dVdGlscy50cmFjZSgiZXh0dmFsIHJlbmRlcmtpdCB3cmFwcGVyIGNyZWF0ZWQgZm9yICIgKyByZW5kZXJLaXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIGdldENsYXNzKCkpOwotCi0gICAgICAgIHJldHVybiBuZXcgRXh0VmFsUmVuZGVyS2l0KHJlbmRlcktpdCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOWZjYjQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VTdHJlYW07Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVdyaXRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVzcG9uc2VTdGF0ZU1hbmFnZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJLaXQgZXh0ZW5kcyBSZW5kZXJLaXQKLXsKLSAgICBwcm90ZWN0ZWQgUmVuZGVyS2l0IHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyS2l0KFJlbmRlcktpdCB3cmFwcGVkKQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlLCBSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIGlmIChyZW5kZXJlciBpbnN0YW5jZW9mIEV4dFZhbFJlbmRlcmVyV3JhcHBlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgcmVuZGVyZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgY3JlYXRlV3JhcHBlcihyZW5kZXJlcikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFJlbmRlcmVyIGdldFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUpCi0gICAgewotICAgICAgICBSZW5kZXJlciByZW5kZXJlciA9IHdyYXBwZWQuZ2V0UmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUpOwotICAgICAgICByZXR1cm4gcmVuZGVyZXIgaW5zdGFuY2VvZiBFeHRWYWxSZW5kZXJlcldyYXBwZXIgPyByZW5kZXJlciA6IGNyZWF0ZVdyYXBwZXIocmVuZGVyZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZVN0YXRlTWFuYWdlciBnZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZVdyaXRlciBjcmVhdGVSZXNwb25zZVdyaXRlcihXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcywgU3RyaW5nIHMxKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY3JlYXRlUmVzcG9uc2VXcml0ZXIod3JpdGVyLCBzLCBzMSk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlU3RyZWFtIGNyZWF0ZVJlc3BvbnNlU3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jcmVhdGVSZXNwb25zZVN0cmVhbShvdXRwdXRTdHJlYW0pOwotICAgIH0KLQotICAgIEBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIGNyZWF0ZVdyYXBwZXIoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEV4dFZhbFJlbmRlcmVyV3JhcHBlcihyZW5kZXJlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0RmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWNlYzNiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeTsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBjZW50cmFsIG1lY2hhbmlzbSB3aGljaCBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgYSB3cmFwcGVyIGZvciBhIHJlbmRlcmVyIC0gc3RhcnRpbmcgcG9pbnQgb2YgZXh0dmFsLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeSBleHRlbmRzIFJlbmRlcktpdEZhY3RvcnkKLXsKLSAgICBwcml2YXRlIFJlbmRlcktpdEZhY3Rvcnkgd3JhcHBlZDsKLQotICAgIHB1YmxpYyBFeHRWYWxSZW5kZXJLaXRGYWN0b3J5KFJlbmRlcktpdEZhY3RvcnkgcmVuZGVyS2l0RmFjdG9yeSkKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHJlbmRlcktpdEZhY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyS2l0KFN0cmluZyBzLCBSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJLaXQocywgcmVuZGVyS2l0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVuZGVyS2l0IGdldFJlbmRlcktpdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIFJlbmRlcktpdCByZW5kZXJLaXQgPSB0aGlzLndyYXBwZWQuZ2V0UmVuZGVyS2l0KGZhY2VzQ29udGV4dCwgcyk7Ci0KLSAgICAgICAgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSB3cmFwcGVyRmFjdG9yeSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgIC8vc29tZSBjb21wb25lbnQgbGlicyBlLmcuIG15ZmFjZXMtdHJpbmlkYWQgYXJlbid0IGNvbXBhdGlibGUgd2l0aCB0aGlzIGNsZWFuIGFwcHJvYWNoCi0gICAgICAgIC8vZXhhbXBsZSBzZWUgVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIKLSAgICAgICAgaWYod3JhcHBlckZhY3RvcnkuaXNEZWFjdGl2YXRlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJGYWN0b3J5LmNyZWF0ZShyZW5kZXJLaXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGdldFJlbmRlcktpdElkcygpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZW5kZXJLaXRJZHMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlclByb3h5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZDU1N2IuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkxvZ1V0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogdG8gYXZvaWQgbXVsdGlwbGUgY2FsbHMgb2YgcmVuZGVyZXIgbWV0aG9kcyB3aXRoaW4gcmVuZGVyZXIgaW50ZXJjZXB0b3JzIChlLmcuIGZvciBlbmNvZGUsIGRlY29kZSwuLi4pCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJlclByb3h5IGV4dGVuZHMgUmVuZGVyZXIKLXsKLSAgICBwcml2YXRlIFJlbmRlcmVyIHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHJlbmRlcmVyOwotCi0gICAgICAgIExvZ1V0aWxzLnRyYWNlKCJwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIGdldENsYXNzKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlFbnRyeSBlbnRyeSA9IGdldE9ySW5pdEVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNEZWNvZGVDYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RGVjb2RlQ2FsbGVkKHRydWUpOwotICAgICAgICAgICAgd3JhcHBlZC5kZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5RW50cnkgZW50cnkgPSBnZXRPckluaXRFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRW5jb2RlQmVnaW5DYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RW5jb2RlQmVnaW5DYWxsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eUVudHJ5IGVudHJ5ID0gZ2V0T3JJbml0RW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0VuY29kZUNoaWxkcmVuQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldEVuY29kZUNoaWxkcmVuQ2FsbGVkKHRydWUpOwotICAgICAgICAgICAgd3JhcHBlZC5lbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5RW50cnkgZW50cnkgPSBnZXRPckluaXRFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRW5jb2RlRW5kQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldEVuY29kZUVuZENhbGxlZCh0cnVlKTsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0Q2xpZW50SWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jb252ZXJ0Q2xpZW50SWQoZmFjZXNDb250ZXh0LCBzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlFbnRyeSBlbnRyeSA9IGdldE9ySW5pdEVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmIChlbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldENvbnZlcnRlZFZhbHVlKHdyYXBwZWQuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbykpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVuZGVyZXJQcm94eUVudHJ5IGdldE9ySW5pdEVudHJ5KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgU3RyaW5nIGNsaWVudElkID0gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBpZiAoIWdldE9ySW5pdENvbXBvbmVudFByb3h5TWFwcGluZygpLmNvbnRhaW5zS2V5KGNsaWVudElkKSkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0T3JJbml0Q29tcG9uZW50UHJveHlNYXBwaW5nKCkucHV0KGNsaWVudElkLCBuZXcgUmVuZGVyZXJQcm94eUVudHJ5KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXRPckluaXRDb21wb25lbnRQcm94eU1hcHBpbmcoKS5nZXQoY2xpZW50SWQpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9TVE9SQUdFX05BTUUgPSBFeHRWYWxSZW5kZXJlclByb3h5LmNsYXNzLmdldE5hbWUoKSArICI6U1RPUkFHRSI7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlFbnRyeT4gZ2V0T3JJbml0Q29tcG9uZW50UHJveHlNYXBwaW5nKCkKLSAgICB7Ci0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsKLQotICAgICAgICBpZighcmVxdWVzdE1hcC5jb250YWluc0tleShQUk9YWV9TVE9SQUdFX05BTUUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXF1ZXN0TWFwLnB1dChQUk9YWV9TVE9SQUdFX05BTUUsIG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eUVudHJ5Pj4oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5RW50cnk+PiBwcm94eVN0b3JhZ2UgPQotICAgICAgICAgICAgKChNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5RW50cnk+PilyZXF1ZXN0TWFwLmdldChQUk9YWV9TVE9SQUdFX05BTUUpKTsKLQotICAgICAgICBTdHJpbmcga2V5ID0gdGhpcy53cmFwcGVkLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCi0gICAgICAgIGlmKCFwcm94eVN0b3JhZ2UuY29udGFpbnNLZXkoa2V5KSkKLSAgICAgICAgewotICAgICAgICAgICAgcHJveHlTdG9yYWdlLnB1dChrZXksIG5ldyBIYXNoTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eUVudHJ5PigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcm94eVN0b3JhZ2UuZ2V0KGtleSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU1MjM5OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuTG9nVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogRGVmYXVsdCBhcHByb2FjaCB0byBhdm9pZCBwcm94aWVzIGZvciBjb252ZXJ0ZXJzIGFuZCB0aGUgYWRhcHRlciBmYWxsYmFjay4KLSAqIEl0IHJlcXVpcmVzIHRoYXQgY29tcG9uZW50cyBkZWxlZ2F0ZSBnZXRDb252ZXJ0ZWRWYWx1ZSB0byBhIHJlbmRlcmVyLjxici8+Ci0gKiBJZiBpdCBpc24ndCB0aGUgY2FzZSBmb3IgeW91ciBjb21wb25lbnQgbGliIHVzZToKLSAqIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5LkV4dFZhbEFwcGxpY2F0aW9uRmFjdG9yeTxici8+Ci0gKiBhbmQ8YnIvPgotICogb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHkuUHJveHlNYXBwaW5nUGhhc2VMaXN0ZW5lcgotICogPHAvPgotICogVGhpcyB3cmFwcGVyIHdpbGwgYWxzbyBpbXBsZW1lbnQgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBiZWhhdmlvdXIKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcmVyV3JhcHBlciBleHRlbmRzIFJlbmRlcmVyCi17Ci0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIHdyYXBwZWQ7Ci0gICAgcHJvdGVjdGVkIEV4dFZhbENvbnRleHQgZXh0VmFsQ29udGV4dCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcmVyV3JhcHBlcihSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IG5ldyBFeHRWYWxSZW5kZXJlclByb3h5KHJlbmRlcmVyKTsKLQotICAgICAgICBMb2dVdGlscy50cmFjZSgiZXh0dmFsIHJlbmRlcmVyIHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBnZXRDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBMb2dVdGlscy50cmFjZSgic3RhcnQgYmVmb3JlRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgIGdldENsYXNzKCkpOwotCi0gICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZURlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICBMb2dVdGlscy50cmFjZSgiYmVmb3JlRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIsCi0gICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB3cmFwcGVkLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBMb2dVdGlscy50cmFjZSgic3RhcnQgYWZ0ZXJEZWNvZGUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKSk7Ci0KLSAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJEZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgTG9nVXRpbHMudHJhY2UoImFmdGVyRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIsCi0gICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBMb2dVdGlscy50cmFjZSgic3RhcnQgYmVmb3JlRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKSk7Ci0KLSAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgTG9nVXRpbHMudHJhY2UoImJlZm9yZUVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIsCi0gICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB3cmFwcGVkLmVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExvZ1V0aWxzLnRyYWNlKCJzdGFydCBhZnRlckVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgIGdldENsYXNzKCkpOwotCi0gICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgTG9nVXRpbHMudHJhY2UoImFmdGVyRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIiwKLSAgICAgICAgICAgICAgICBnZXRDbGFzcygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExvZ1V0aWxzLnRyYWNlKCJzdGFydCBiZWZvcmVFbmNvZGVDaGlsZHJlbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICBnZXRDbGFzcygpKTsKLQotICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVFbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICBMb2dVdGlscy50cmFjZSgiYmVmb3JlRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIiwKLSAgICAgICAgICAgICAgICBnZXRDbGFzcygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHdyYXBwZWQuZW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgTG9nVXRpbHMudHJhY2UoInN0YXJ0IGFmdGVyRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKSk7Ci0KLSAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICBMb2dVdGlscy50cmFjZSgiYWZ0ZXJFbmNvZGVDaGlsZHJlbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiLAotICAgICAgICAgICAgICAgIGdldENsYXNzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExvZ1V0aWxzLnRyYWNlKCJzdGFydCBiZWZvcmVFbmNvZGVFbmQgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKSk7Ci0KLSAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgIExvZ1V0aWxzLnRyYWNlKCJiZWZvcmVFbmNvZGVFbmQgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIiwKLSAgICAgICAgICAgICAgICBnZXRDbGFzcygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHdyYXBwZWQuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExvZ1V0aWxzLnRyYWNlKCJzdGFydCBhZnRlckVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICBnZXRDbGFzcygpKTsKLQotICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICBMb2dVdGlscy50cmFjZSgiYWZ0ZXJFbmNvZGVFbmQgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIiwKLSAgICAgICAgICAgICAgICBnZXRDbGFzcygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY29udmVydENsaWVudElkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udmVydENsaWVudElkKGZhY2VzQ29udGV4dCwgcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZ2V0UmVuZGVyc0NoaWxkcmVuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBMb2dVdGlscy50cmFjZSgic3RhcnQgYmVmb3JlR2V0Q29udmVydGVkVmFsdWUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKSk7Ci0KLSAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbywgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgTG9nVXRpbHMudHJhY2UoImJlZm9yZUdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIsCi0gICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0ID0gd3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLQotICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBMb2dVdGlscy50cmFjZSgic3RhcnQgYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICBnZXRDbGFzcygpKTsKLQotICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8sIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgIExvZ1V0aWxzLnRyYWNlKCJhZnRlckdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIsCi0gICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L1JlbmRlcmVyUHJveHlFbnRyeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvUmVuZGVyZXJQcm94eUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZTU3ZjkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvUmVuZGVyZXJQcm94eUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgUmVuZGVyZXJQcm94eUVudHJ5Ci17Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRlY29kZUNhbGxlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVCZWdpbkNhbGxlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVDaGlsZHJlbkNhbGxlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVFbmRDYWxsZWQgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgT2JqZWN0IGNvbnZlcnRlZFZhbHVlID0gbnVsbDsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVjb2RlQ2FsbGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWNvZGVDYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVjb2RlQ2FsbGVkKGJvb2xlYW4gZGVjb2RlQ2FsbGVkKQotICAgIHsKLSAgICAgICAgdGhpcy5kZWNvZGVDYWxsZWQgPSBkZWNvZGVDYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmNvZGVCZWdpbkNhbGxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZW5jb2RlQmVnaW5DYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlQmVnaW5DYWxsZWQoYm9vbGVhbiBlbmNvZGVCZWdpbkNhbGxlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZW5jb2RlQmVnaW5DYWxsZWQgPSBlbmNvZGVCZWdpbkNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuY29kZUNoaWxkcmVuQ2FsbGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbmNvZGVDaGlsZHJlbkNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVDaGlsZHJlbkNhbGxlZChib29sZWFuIGVuY29kZUNoaWxkcmVuQ2FsbGVkKQotICAgIHsKLSAgICAgICAgdGhpcy5lbmNvZGVDaGlsZHJlbkNhbGxlZCA9IGVuY29kZUNoaWxkcmVuQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlRW5kQ2FsbGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbmNvZGVFbmRDYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlRW5kQ2FsbGVkKGJvb2xlYW4gZW5jb2RlRW5kQ2FsbGVkKQotICAgIHsKLSAgICAgICAgdGhpcy5lbmNvZGVFbmRDYWxsZWQgPSBlbmNvZGVFbmRDYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkVmFsdWUoT2JqZWN0IGNvbnZlcnRlZFZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy5jb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTc1NDE1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkxvZ1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIGV4ZWN1dGUgbG9naWMganVzdCBvbmNlLg0KLSAqIGUuZy4gcmVnaXN0ZXIgYXJ0aWZhY3RzIHZpYSBhcGkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgLy9kb24ndCByZW1vdmUgLSBpdCdzIGEgZmFsbGJhY2sgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggZGVyZWdpc3RyYXRpb24NCi0gICAgLy90YXJnZXQ6IGRvbid0IHByb2Nlc3MgaW5pdCBsb2dpYyBtb3JlIHRoYW4gb25jZQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENsYXNzPiBpbml0aWFsaXplZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIHN5bmNocm9uaXplZCAoQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuY2xhc3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCFpbml0aWFsaXplZExpc3RlbmVycy5jb250YWlucyhnZXRDbGFzcygpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBMb2dVdGlscy5pbmZvKCJzdGFydCBpbml0IG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSwgZ2V0Q2xhc3MoKSk7DQotDQotICAgICAgICAgICAgICAgICAgICBpbml0KCk7DQotDQotICAgICAgICAgICAgICAgICAgICBMb2dVdGlscy5pbmZvKCJpbml0IG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiLCBnZXRDbGFzcygpKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIEpzZlV0aWxzLmRlcmVnaXN0ZXJQaGFzZUxpc3RlbmVyKHRoaXMpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgTG9nVXRpbHMud2FybigiYW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGRlcmVnaXN0ZXJpbmcgdGhlIHBoYXNlLWxpc3RlbmVyIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRDbGFzcygpLmdldE5hbWUoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC0+IHRoZXJlIGlzIGp1c3QgYSBsaXR0bGUgb3ZlcmhlYWQsIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJ1dCBldmVyeXRoaW5nIGVsc2Ugd29ya3MgY29ycmVjdGx5LiINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBob3dldmVyLCBwbGVhc2UgaW5mb3JtIHRoZSBjb21tdW5pdHkgYWJvdXQgeW91ciBjb25maWd1cmF0aW9uIiwgdCwgZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZmluYWxseQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZExpc3RlbmVycy5hZGQoZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLlJFU1RPUkVfVklFVzsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0KCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9FeHRWYWxTdGFydHVwTGlzdGVuZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9FeHRWYWxTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRlNWJhYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuTG9nVXRpbHM7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcgotewotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQotICAgIHsKLSAgICAgICAgTG9nVXRpbHMuaW5mbygic3RhcnR1cCBleHR2YWwiLCBnZXRDbGFzcygpKTsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKG5ldyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IoKSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWE5NDE2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkVMVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkxvZ1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsNCi0NCi0vKioNCi0gKiBNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggdXNlcyBwcm9wZXJ0eSBmaWxlcy4NCi0gKiBTdWJjbGFzc2VzIGp1c3QgaGF2ZSB0byBwcm92aWRlIHRoZSBwYWNrYWdlIHRvIGxvb2sgYXQuDQotICogQW4gaW1wbGVtZW50YXRpb24gY2FuIGFsc28gcHJvdmlkZSBhIGN1c3RvbSBuYW1lIHdoaWNoIGlzIGUuZy4gY29uZmlndXJlZCB2aWEgd2ViLnhtbC4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGltcGxlbWVudHMNCi0gICAgTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfREVGQVVMVF9DT05WRU5USU9OOw0KLSAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBkZWZhdWx0QnVuZGxlID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZUJ1bmRsZUJhc2VOYW1lOw0KLSAgICAvL3dpdGgganNmIDEuMSBvbmx5IGF2YWlsYWJsZSBpZiB0aGVyZSBpcyBhIGN1c3RvbSBiZWFuDQotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VCdW5kbGVWYXJOYW1lOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGtleSA9PSBudWxsIHx8IGtleS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIGN1c3RvbU1lc3NhZ2UgPSBudWxsOw0KLQ0KLSAgICAgICAgLy9vbmx5IGluIGNhc2Ugb2YgYSBWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggaXMgY29uZmlndXJlZCBhcyBiZWFuDQotICAgICAgICBpZiAodGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSh0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSwgbG9jYWxlKTsNCi0gICAgICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTG9nVXRpbHMud2FybigibWVzc2FnZSBidW5kbGUgIiArIHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lICsgIiBub3QgZm91bmQiLCBnZXRDbGFzcygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvL29ubHkgaW4gY2FzZSBvZiBhIFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciB3aGljaCBpcyBjb25maWd1cmVkIGFzIGJlYW4NCi0gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VCdW5kbGVWYXJOYW1lICE9IG51bGwgJiYgY3VzdG9tTWVzc2FnZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gKFJlc291cmNlQnVuZGxlKSBFTFV0aWxzLmdldEJlYW4obWVzc2FnZUJ1bmRsZVZhck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBMb2dVdGlscy53YXJuKCJtZXNzYWdlIGJ1bmRsZSB2YXIgbmFtZSAiICsgdGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSArICIgbm90IGZvdW5kIiwgZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGN1c3RvbU1lc3NhZ2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qDQotICAgICAgICAgKiB0cnkgdG8gdXNlIHRoZSBjb252ZW50aW9uIGZvciB0aGUgbWVzc2FnZSBidW5kbGUNCi0gICAgICAgICAqLw0KLSAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHRyeVRvVXNlTWVzc2FnZUJ1bmRsZUNvbnZlbnRpb24oa2V5LCBsb2NhbGUpOw0KLQ0KLSAgICAgICAgaWYgKGN1c3RvbU1lc3NhZ2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qDQotICAgICAgICAgKiBubyBtZXNzYWdlIGJ1bmRsZSBvciBtZXNzYWdlIGZvdW5kICh3aXRoIHRoZSBjb252ZW50aW9uKT8NCi0gICAgICAgICAqLw0KLQ0KLSAgICAgICAgLy90cnkgdG8gbG9hZCBjdXN0b20gbWVzc2FnZXMNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEN1c3RvbUJhc2VOYW1lKCksIGxvY2FsZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBMb2dVdGlscy50cmFjZSgibm8gY3VzdG9tIG1lc3NhZ2UgZm9yICIgKyBrZXkgKyAiIHdpdGhpbiAiICsgZ2V0Q3VzdG9tQmFzZU5hbWUoKSwgZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy91c2UgY3VzdG9tIG5hbWUgKGlmIHBvc3NpYmxlKSBvdGhlcndpc2U6IGZhbGxiYWNrIHRvIGRlZmF1bHQgbWVzc2FnZSAoaWYgcG9zc2libGUpDQotICAgICAgICByZXR1cm4gKGN1c3RvbU1lc3NhZ2UgIT0gbnVsbCkgPyBjdXN0b21NZXNzYWdlDQotICAgICAgICAgICAgOiAoZ2V0QmFzZU5hbWUoKSAhPSBudWxsKSA/IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShnZXRCYXNlTmFtZSgpLCBsb2NhbGUpLmdldFN0cmluZyhrZXkpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb1VzZU1lc3NhZ2VCdW5kbGVDb252ZW50aW9uKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjdXN0b21NZXNzYWdlID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICgoZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID09IG51bGwgfHwgIWRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICAgICAgJiYgaXNEZWZhdWx0TWVzc2FnZUJ1bmRsZUNvbnZlbnRpb25BY3RpdmUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZGVmYXVsdEJ1bmRsZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb252ZW50aW9uRm9yQ3VzdG9tTWVzc2FnZUJ1bmRsZSgpLCBsb2NhbGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nDQotICAgICAgICAgICAgICAgICAgICBkZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb24gPSAidHJ1ZSI7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGRlZmF1bHRCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gZGVmYXVsdEJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWZhdWx0TWVzc2FnZUJ1bmRsZUNvbnZlbnRpb25BY3RpdmUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEJhc2VOYW1lKCk7DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tQmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlQnVuZGxlQmFzZU5hbWUoU3RyaW5nIG1lc3NhZ2VCdW5kbGVCYXNlTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUgPSBtZXNzYWdlQnVuZGxlQmFzZU5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUJ1bmRsZVZhck5hbWUoU3RyaW5nIG1lc3NhZ2VCdW5kbGVWYXJOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1lc3NhZ2VCdW5kbGVWYXJOYW1lID0gbWVzc2FnZUJ1bmRsZVZhck5hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYzk2ZWUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLg0KLSAgICAgICAgcmVzb2x2ZXIubWFwcGVyLkN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLg0KLSAgICAgICAgcmVzb2x2ZXIubWFwcGVyLkN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLg0KLSAgICAgICAgcmVzb2x2ZXIubWFwcGVyLkRlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLg0KLSAgICAgICAgcmVzb2x2ZXIubWFwcGVyLkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLg0KLSAgICAgICAgcmVzb2x2ZXIubWFwcGVyLlNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuTG9nVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyBhIE1lc3NhZ2VSZXNvbHZlciBmb3IgYSBnaXZlbiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJhZGQgZ2VuZXJpYyBqYXZhIGFwaSAoZGUtL3JlZ2lzdGVyIG1hcHBpbmcpIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeSBpbXBsZW1lbnRzDQotICAgIENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXNzYWdlUmVzb2x2ZXI+DQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZyA9DQotICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IG5hbWVNYXBwZXJMaXN0ID0NCi0gICAgICAgIG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PigpOw0KLQ0KLSAgICBzdGF0aWMNCi0gICAgew0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIG5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBEZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlUmVzb2x2ZXIgY3JlYXRlKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHN0cmF0ZWd5TmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChNZXNzYWdlUmVzb2x2ZXIpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmdldChzdHJhdGVneU5hbWUpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICBTdHJpbmcgcmVzb2x2ZXJOYW1lOw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vYnVpbGQgY29udmVudGlvbiAoVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKQ0KLSAgICAgICAgICAgIHJlc29sdmVyTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIC8vbmFtZSB3YXNuJ3QgbWFwcGVkDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMocmVzb2x2ZXJOYW1lKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtZXNzYWdlUmVzb2x2ZXIgPSAoTWVzc2FnZVJlc29sdmVyKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUocmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWVzc2FnZVJlc29sdmVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKHN0cmF0ZWd5TmFtZSwgcmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgTG9nVXRpbHMudHJhY2UocmVzb2x2ZXJOYW1lICsgIiB1c2VkIGZvciAiICsgc3RyYXRlZ3lOYW1lLCBnZXRDbGFzcygpKTsNCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VSZXNvbHZlcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBhZGRNYXBwaW5nKHN0cmF0ZWd5TmFtZSwgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKCk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgc3RyYXRlZ3lOYW1lLCBTdHJpbmcgbWVzc2FnZVJlc29sdmVyTmFtZSkNCi0gICAgew0KLSAgICAgICAgc3luY2hyb25pemVkIChEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5jbGFzcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmcucHV0KHN0cmF0ZWd5TmFtZSwgbWVzc2FnZVJlc29sdmVyTmFtZSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2Q1MTZlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogRGVmYXVsdCBNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggdXNlcyB0aGUgZGVmYXVsdCBjb252ZW50aW9uIGZvciB0aGUgbWVzc2FnZSBidW5kbGUuDQotICogSXQncyBwb3NzaWJsZSB0byBwcm92aWRlIGEgY3VzdG9tIG1lc3NhZ2UgYnVuZGxlIHZpYSB3ZWIueG1sDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQlVORExFID0gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVNTQUdFX0JVTkRMRTsNCi0NCi0gICAgLy9ub3QgdXNlZCBhdCB0aGUgbW9tZW50IC0ganVzdCBmb3IgYSBjb252ZW50aW9uDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXRDb252ZW50aW9uRm9yTW9kdWxlTWVzc2FnZUJ1bmRsZShnZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tQmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ1VTVE9NX0JVTkRMRTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL01lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2NhMWMxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL01lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBNZXNzYWdlUmVzb2x2ZXJzIGluZGVwZW5kZW50IG9mIHRoZSBtZXNzYWdlIHNvdXJjZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmI3Mjk2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1lc3NhZ2VSZXNvbHZlcnMuDQotICogKGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMjdkNzAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVneSB0byBNZXNzYWdlUmVzb2x2ZXIuDQotICogKGNvbmZpZ3VyZWQgdmlhIGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pDQotICogVGhlIGJlYW4gcHJvdmlkZXMgdGhlIGRlZmF1bHQgbmFtZSAoY29udmVudGlvbikuDQotICogSXQncyBwb3NzaWJsZSB0byBwcm92aWRlIGEgY3VzdG9tIGZ1bGwgcXVhbGlmaWVkIG5hbWUuICg9IGN1c3RvbWl6YWJsZSBjb252ZW50aW9uKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldEN1c3RvbVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWI1OWI1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSW4gb3JkZXIgdG8gcHJvdmlkZSBhIE5hbWVNYXBwZXIgcGVyIHZhbGlkYXRpb24gbW9kdWxlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDM3N2JmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFwcyBFeHRWYWwgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gRXh0VmFsIE1lc3NhZ2VSZXNvbHZlcnMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgaW1wbGVtZW50cw0KLSAgICBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXRDb252ZW50aW9uTmFtZUZvck1lc3NhZ2VSZXNvbHZlck5hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXRDb252ZW50aW9uTmFtZUZvck1lc3NhZ2VSZXNvbHZlckNsYXNzKHN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjY0NWZmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgdG8gcGxhY2UgVmFsaWRhdGlvblN0cmF0ZWdpZXMgYW5kIE1lc3NhZ2VSZXNvbHZlcnMgaW4gdGhlIHNhbWUgcGFja2FnZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkFMVEVSTkFUSVZFfSkNCi1wdWJsaWMgY2xhc3MgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgaW1wbGVtZW50cw0KLSAgICBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzb2x2ZXJOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc29sdmVyTmFtZS5zdWJzdHJpbmcoMCwgcmVzb2x2ZXJOYW1lLmxhc3RJbmRleE9mKCIuIikpICsgIi5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmVkZjU3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLk1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Mb2dVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotLyoqDQotICogUHJvdmlkZXMgdGhlIGFiaWxpdHkgb2YgbWVzc2FnZSByZXNvbHZpbmcgdG8gVmFsaWRhdGlvblN0cmF0ZWdpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRvckFkYXB0ZXINCi17DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYID0gIl9kZXRhaWxzIjsNCi0gICAgcHJpdmF0ZSBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIExvY2FsZSBsb2NhbGUgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKTsNCi0NCi0gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VSZXNvbHZlciAhPSBudWxsID8gdGhpcy5tZXNzYWdlUmVzb2x2ZXIuZ2V0TWVzc2FnZShrZXksIGxvY2FsZSkgOg0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldE1lc3NhZ2VSZXNvbHZlckZvclZhbGlkYXRpb25TdHJhdGVneSh0aGlzKS5nZXRNZXNzYWdlKGtleSwgbG9jYWxlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcmVzb2x2ZU1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcga2V5ID0gZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pOw0KLSAgICAgICAgICAgIHJldHVybiAoa2V5ICE9IG51bGwpID8gcmVzb2x2ZU1lc3NhZ2Uoa2V5ICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgpIDogbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBMb2dVdGlscy53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUsDQotICAgICAgICAgICAgICAgIGdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEZhY2VzTWVzc2FnZSBnZXRWYWxpZGF0aW9uRXJyb3JGYWNlc01hc3NhZ2UoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsDQotICAgICAgICAgICAgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uKSwgZ2V0RXJyb3JNZXNzYWdlRGV0YWlscyhhbm5vdGF0aW9uKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKTsNCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZVJlc29sdmVyKE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZVJlc29sdmVyID0gbWVzc2FnZVJlc29sdmVyOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRvckFkYXB0ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRvckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyYTI5Mi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0b3JBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hbm5vdGF0aW9uLkFubm90YXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Mb2dVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogUHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gdXNlIFZhbGlkYXRvckV4Y2VwdGlvbiAoYXMgZXhwZWN0ZWQgYnkgdGhlIHVzZXIpIGluc3RlYWQgb2YgQ29udmVydGVyRXhjZXB0aW9uLg0KLSAqIEZ1cnRoZXJtb3JlIGl0IHByb3ZpZGVzOjxici8+DQotICogaW5pdFZhbGlkYXRpb248YnIvPg0KLSAqIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRvckFkYXB0ZXIgaW1wbGVtZW50cyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uRW50cnkgYW5ub3RhdGlvbkVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBMb2dVdGlscy50cmFjZSgic3RhcnQgaW5pdFZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpLCBnZXRDbGFzcygpKTsNCi0NCi0gICAgICAgIGluaXRWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGFubm90YXRpb25FbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgICAgIExvZ1V0aWxzLnRyYWNlKCJpbml0VmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIiwgZ2V0Q2xhc3MoKSk7DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBMb2dVdGlscy50cmFjZSgic3RhcnQgcHJvY2Vzc1ZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpLCBnZXRDbGFzcygpKTsNCi0NCi0gICAgICAgICAgICBwcm9jZXNzVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBhbm5vdGF0aW9uRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgICAgICAgICAgTG9nVXRpbHMudHJhY2UoInByb2Nlc3NWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiLCBnZXRDbGFzcygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBMb2dVdGlscy50cmFjZSgic3RhcnQgcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSwgZ2V0Q2xhc3MoKSk7DQotDQotICAgICAgICAgICAgaWYgKHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRW50cnksIGNvbnZlcnRlZE9iamVjdCwgZSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBMb2dVdGlscy50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAiOiB0aHJvdyBvcmlnaW5hbCBleGNlcHRpb24gYWZ0ZXIgcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uIiwgZ2V0Q2xhc3MoKSk7DQotDQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb252ZXJ0ZXJFeGNlcHRpb24oZS5nZXRGYWNlc01lc3NhZ2UoKSwgZSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIExvZ1V0aWxzLnRyYWNlKGdldENsYXNzKCkuZ2V0TmFtZSgpICsNCi0gICAgICAgICAgICAgICAgIjogb3JpZ2luYWwgZXhjZXB0aW9uIGFmdGVyIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZ2V0Q2xhc3MoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25FbnRyeSBhbm5vdGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgQW5ub3RhdGlvbkVudHJ5IGFubm90YXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgQW5ub3RhdGlvbkVudHJ5IGFubm90YXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbjsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzMzMyMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0NCi0gKiBhZGFwdGVyIHRvIGNvbm5lY3QgdmFsaWRhdGlvbiBzdHJhdGVnaWVzIHdpdGggbWV0YS1kYXRhIGV4dHJhY3RvcnMsDQotICogaWYgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgZGVmaW5lZCBhcyBiZWFuIGFuZCBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgaW50ZXJmYWNlIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyIGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICAvL3RvIGdldCBiYWNrIHRoZSBpbnRlcm5hbCBjYXNoaW5nDQotICAgIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoKTsNCi0NCi0gICAgU3RyaW5nIGdldE1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlNjVhZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLkJlYW5NZXRhRGF0YUV4dHJhY3RvckFkYXB0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0NCi0gKiBhZGFwdGVyIHRvIGNvbm5lY3QgdmFsaWRhdGlvbiBzdHJhdGVnaWVzIHdpdGggbWV0YS1kYXRhIGV4dHJhY3RvcnMsDQotICogaWYgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgZGVmaW5lZCBhcyBiZWFuIGFuZCBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi17DQotICAgIHByaXZhdGUgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3I7DQotICAgIHByaXZhdGUgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgLy9vcHRpb25hbCBmYWxsYmFjayBmb3IgaW50ZXJuYWwgY2FzaGluZw0KLSAgICBwcml2YXRlIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7DQotDQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uRW50cnkgYW5ub3RhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBhbm5vdGF0aW9uRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFFeHRyYWN0b3IgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihtZXRhRGF0YUV4dHJhY3Rvci5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhRXh0cmFjdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihtZXRhRGF0YUV4dHJhY3RvciBpbnN0YW5jZW9mIEJlYW5NZXRhRGF0YUV4dHJhY3RvckFkYXB0ZXIpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKEJlYW5NZXRhRGF0YUV4dHJhY3RvckFkYXB0ZXIpbWV0YURhdGFFeHRyYWN0b3IpLmdldE1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBNZXRhRGF0YUV4dHJhY3RvciBnZXRNZXRhRGF0YUV4dHJhY3RvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUV4dHJhY3RvcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YUV4dHJhY3RvcihNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YUV4dHJhY3RvciA9IG1ldGFEYXRhRXh0cmFjdG9yOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uU3RyYXRlZ3koVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3kgPSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YzM5MTQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyDQotICAgIC5Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXINCi0gICAgLkN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcg0KLSAgICAuQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyDQotICAgIC5EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXINCi0gICAgLlNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkVMVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsNCi0NCi0NCi0vKioNCi0gKiBGYWN0b3J5IHdoaWNoIGNyZWF0ZXMgdGhlIFZhbGlkYXRpb25TdHJhdGVneSBmb3IgYSBnaXZlbiBhbm5vdGF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdlbmVyaWMgamF2YSBhcGkgKGRlLS9yZWdpc3RlciBtYXBwaW5nKSIpDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkgaW1wbGVtZW50cw0KLSAgICBDbGFzc01hcHBpbmdGYWN0b3J5PEFubm90YXRpb24sIFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gYW5ub3RhdGlvblN0cmF0ZWd5TWFwcGluZyA9IG51bGw7DQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8TmFtZU1hcHBlcjxBbm5vdGF0aW9uPj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8QW5ub3RhdGlvbj4+KCk7DQotDQotICAgIHN0YXRpYw0KLSAgICB7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IEN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBDdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsNCi0gICAgICAgIG5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7DQotICAgICAgICAvL1RPRE8gaWYganNyIDMwMyBkb2Vzbid0IGNoYW5nZToNCi0gICAgICAgIC8vbmFtZU1hcHBlckxpc3QuYWRkKG5ldyBCZWFuVmFsaWRhdGlvbkFubm90YXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOw0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsNCi0gICAgICAgIG5hbWVNYXBwZXJMaXN0LmFkZChuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoDQotICAgICAgICAgICAgbmV3IERlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsNCi0gICAgICAgIG5hbWVNYXBwZXJMaXN0LmFkZChuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoDQotICAgICAgICAgICAgbmV3IFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgY3JlYXRlKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb25TdHJhdGVneU1hcHBpbmcgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljU3RyYXRlZ3lNYXBwaW5ncygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIGFubm90YXRpb25OYW1lID0gYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKTsNCi0NCi0gICAgICAgIGlmIChhbm5vdGF0aW9uU3RyYXRlZ3lNYXBwaW5nLmNvbnRhaW5zS2V5KGFubm90YXRpb25OYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5SW5zdGFuY2UoYW5ub3RhdGlvblN0cmF0ZWd5TWFwcGluZy5nZXQoYW5ub3RhdGlvbk5hbWUpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgICAgICBTdHJpbmcgc3RyYXRlZ3lOYW1lOw0KLSAgICAgICAgLy9udWxsIC0+IHVzZSBuYW1lIG1hcHBlcnMNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxBbm5vdGF0aW9uPiBuYW1lTWFwcGVyIDogbmFtZU1hcHBlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RyYXRlZ3lOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKGFubm90YXRpb24pOw0KLQ0KLSAgICAgICAgICAgIGlmIChzdHJhdGVneU5hbWUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lJbnN0YW5jZShzdHJhdGVneU5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFkZE1hcHBpbmcoYW5ub3RhdGlvbk5hbWUsIHN0cmF0ZWd5TmFtZSk7DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5SW5zdGFuY2UoDQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUNCi0gICAgICAgICAgICAuc3RhcnRzV2l0aChBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5QUkVGSVhfRk9SX0JFQU5fTUFQUElORykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIEVMVXRpbHMNCi0gICAgICAgICAgICAgICAgLmdldEJlYW4odmFsaWRhdGlvblN0cmF0ZWd5TmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZyhBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5QUkVGSVhfRk9SX0JFQU5fTUFQUElORy5sZW5ndGgoKSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoVmFsaWRhdGlvblN0cmF0ZWd5KSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgIC50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIGFubm90YXRpb25OYW1lLCBTdHJpbmcgc3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFubm90YXRpb25TdHJhdGVneU1hcHBpbmcucHV0KGFubm90YXRpb25OYW1lLCBzdHJhdGVneU5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdGF0aWNTdHJhdGVneU1hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgc3luY2hyb25pemVkIChEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5jbGFzcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhbm5vdGF0aW9uU3RyYXRlZ3lNYXBwaW5nID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotDQotICAgICAgICAgICAgLy9zZXR1cCBpbnRlcm5hbCBzdGF0aWMgbWFwcGluZ3MNCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBpbnRlcm5hbE1hcHBpbmdTb3VyY2UgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXRTdGF0aWNTdHJhdGVneU1hcHBpbmdTb3VyY2VzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3MoaW50ZXJuYWxNYXBwaW5nU291cmNlKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy90cnkgdG8gc2V0dXAgbWFwcGluZyB3aXRoIGJhc2UgbmFtZSBieSBjb252ZW50aW9uIC0gb3ZlcnJpZGVzIGRlZmF1bHQgbWFwcGluZw0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9idWlsZCBjb252ZW50aW9uIChzdHJhdGVneSBtYXBwaW5nKQ0KLSAgICAgICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3MoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldEN1c3RvbVN0YXRpY1N0cmF0ZWd5TWFwcGluZ1NvdXJjZSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy9zZXR1cCBjdXN0b20gbWFwcGluZyAtIG92ZXJyaWRlcyBhbGwgb3RoZXIgbWFwcGluZ3MNCi0gICAgICAgICAgICBTdHJpbmcgY3VzdG9tTWFwcGluZ0Jhc2VOYW1lID0gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OU1RSQVRFR1lfTUFQUElORzsNCi0gICAgICAgICAgICBpZiAoY3VzdG9tTWFwcGluZ0Jhc2VOYW1lICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKGN1c3RvbU1hcHBpbmdCYXNlTmFtZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cFN0cmF0ZWd5TWFwcGluZ3MoU3RyaW5nIGJ1bmRsZSkNCi0gICAgew0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgc3RyYXRlZ3lNYXBwaW5nID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGJ1bmRsZSk7DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IHN0cmF0ZWd5TWFwcGluZy5nZXRLZXlzKCk7DQotDQotICAgICAgICBTdHJpbmcgYW5ub3RhdGlvbkNsYXNzTmFtZTsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7DQotDQotICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhbm5vdGF0aW9uQ2xhc3NOYW1lID0gKFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpOw0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSA9IHN0cmF0ZWd5TWFwcGluZy5nZXRTdHJpbmcoYW5ub3RhdGlvbkNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgYWRkTWFwcGluZyhhbm5vdGF0aW9uQ2xhc3NOYW1lLCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEyMTczZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5hbm5vdGF0aW9uLkFubm90YXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEJhc2UgaW50ZXJmYWNlIGZvciBWYWxpZGF0aW9uU3RyYXRlZ2llcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbkVudHJ5IGFubm90YXRpb25FbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhlM2YyMC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBOYW1lIE1hcHBlciB3aGljaCBkZWxlZ2F0ZXMgdGhlIG5hbWUgbWFwcGluZywgZXh0cmFjdCB0aGUgbmFtZSBhbmQgY29udmVydCBpdCB0byBhIGJlYW4gbmFtZSArIHByZWZpeA0KLSAqIHRhcmdldDogY29uZmlndXJlIGEgdmFsaWRhdGlvbiBzdHJhdGVneSB2aWEgYSBtYW5hZ2VkIGJlYW4gZmFjaWxpdHkgLT4gYWxsb3dzIHRvIGluamVjdCBvdGhlciBiZWFucw0KLSAqIGluc3RlYWQgb2YgYXBpIGNhbGxzICsgaGFyZGNvZGVkIGJlYW4gbmFtZXMNCi0gKiA8cC8+DQotICogYWxsb3dlZCBiZWFuIHNjb3BlczoNCi0gKiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBzdGF0ZWxlc3M6IGFwcGxpY2F0aW9uL3NpbmdsZXRvbg0KLSAqIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIHN0YXRlZnVsOiBub25lL3Byb3RvdHlwZQ0KLSAqIGRvbid0IHVzZSB0aGUgc2Vzc2lvbiBvciBhIGNvbnZlcnNhdGlvbiBzY29wZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIgaW1wbGVtZW50cw0KLSAgICBOYW1lTWFwcGVyPEFubm90YXRpb24+DQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfRk9SX0JFQU5fTUFQUElORyA9ICJiZWFuOiI7DQotICAgIHByaXZhdGUgTmFtZU1hcHBlcjxBbm5vdGF0aW9uPiB3cmFwcGVkOw0KLQ0KLSAgICBwdWJsaWMgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoTmFtZU1hcHBlcjxBbm5vdGF0aW9uPiBuYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSBuYW1lTWFwcGVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShBbm5vdGF0aW9uIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSB3cmFwcGVkLmNyZWF0ZU5hbWUoc291cmNlKTsNCi0NCi0gICAgICAgIGlmIChuYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7DQotICAgICAgICByZXR1cm4gUFJFRklYX0ZPUl9CRUFOX01BUFBJTkcgKyBuYW1lLnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZSgpICsgbmFtZS5zdWJzdHJpbmcoMSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTU3NDk3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIEFubm90YXRpb25zIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqIChjb25maWd1cmVkIHZpYSB3ZWIueG1sKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8QW5ub3RhdGlvbj4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0FOTk9UQVRJT05fVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwODU0YmIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIEFubm90YXRpb25zIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPEFubm90YXRpb24+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXRDdXN0b21Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDQxMTI1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFwcyBFeHRWYWwgQW5ub3RhdGlvbnMgdG8gRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgaW1wbGVtZW50cw0KLSAgICBOYW1lTWFwcGVyPEFubm90YXRpb24+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXRDb252ZW50aW9uTmFtZUZvclZhbGlkYXRpb25TdHJhdGVneShhbm5vdGF0aW9uKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODZmZjRhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgdG8gcGxhY2UgQW5ub3RhdGlvbnMgYW5kIFZhbGlkYXRpb25TdHJhdGVnaWVzIGluIHRoZSBzYW1lIHBhY2thZ2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5BTFRFUk5BVElWRX0pDQotcHVibGljIGNsYXNzIFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPEFubm90YXRpb24+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lQb3N0Zml4KCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvUHJpb3JpdHkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMWFhMzMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvUHJpb3JpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1wdWJsaWMgZW51bSBQcmlvcml0eQotewotICAgIEJMT0NLSU5HLAotICAgIEhJR0gsCi0gICAgTUVESVVNLAotICAgIExPVwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0NDZmOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Ub0RvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi1wdWJsaWMgQGludGVyZmFjZSBUb0RvCi17Ci0gICAgUHJpb3JpdHkgdmFsdWUoKTsKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24oKSBkZWZhdWx0ICIiOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlQ2F0ZWdvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVjYTM4OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLS8qKgotICogQVBJOjxici8+Ci0gKiBwYXJ0cyB5b3UgbWlnaHQgbmVlZCBmb3IgY3VzdG9tIGltcGxlbWVudGF0aW9ucyBhbmQgd2hpY2ggYXJlIHF1aXRlIHN0YWJsZSBpbiB2aWV3IG9mIGNoYW5nZXMKLSAqIDxwLz4KLSAqIElOVEVSTkFMOjxici8+Ci0gKiBpZiB5b3UgdGhpbmsgYWJvdXQgcmVmZXJlbmNpbmcgYW4gYXJ0aWZhY3Qgd2hpY2ggaXMgbWFya2VkIGFzIGludGVybmFsLCBhc2sgZm9yIHN1cHBvcnQuCi0gKiB0aGVyZSBzaG91bGQgYmUgYSBiZXR0ZXIgc29sdXRpb24KLSAqIDxwLz4KLSAqIENVU1RPTUlaQUJMRTo8YnIvPgotICogYSBwbGFubmVkIGV4dGVuc2lvbiBwb2ludCB3aGljaCBjb250YWlucyBsb2dpYyB0byBjdXN0b21pemUgdGhlIGZyYW1ld29yay4KLSAqIGlmIGl0IGlzbid0IGFsc28gbWFya2VkIGFzIEFQSSBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotICogaG93ZXZlciwgd2UgdHJ5IHRvIGtlZXAgaXQgYXMgc3RhYmxlIGFzIHBvc3NpYmxlIGFuZCByZWFzb25hYmxlLgotICogPHAvPgotICogUkVVU0U6PGJyLz4KLSAqIGFuIGFydGlmYWN0IHdoaWNoIHlvdSBjYW4gcmV1c2UgZm9yIGEgY3VzdG9tIGFydGlmYWN0LgotICogaWYgaXQgaXNuJ3QgbWFya2VkIGFzIEFQSSBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotICogaG93ZXZlciwgd2UgdHJ5IHRvIGtlZXAgaXQgYXMgc3RhYmxlIGFzIHBvc3NpYmxlIGFuZCByZWFzb25hYmxlLgotICogPHAvPgotICogRkFMTEJBQ0sgYW5kIEFMVEVSTkFUSVZFCi0gKiBlLmcuOiBzb21lIG1lY2hhbmlzbXMgYXJlbid0IGRlcHJlY2F0ZWQsIGJlY2F1c2UgaXQgbWFrZXMgc2Vuc2UgdG8gdXNlIHRoZW0uCi0gKiBob3dldmVyLCBpdCdzIG5vdCB0aGUgZGVmYXVsdCBhcHByb2FjaAotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLXB1YmxpYyBlbnVtIFVzYWdlQ2F0ZWdvcnkKLXsKLSAgICBBUEksCi0gICAgSU5URVJOQUwsCi0gICAgQ1VTVE9NSVpBQkxFLAotICAgIFJFVVNFLAotICAgIEZBTExCQUNLLAotICAgIEFMVEVSTkFUSVZFCi19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUluZm9ybWF0aW9uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OTQ5NWYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIGl0J3MgYW4gaW50ZXJuYWwgYW5ub3RhdGlvbiB0byBwcm92aWRlIHNvbWUgaW5mb3JtYXRpb24KLSAqIDxwLz4KLSAqIGUuZy46IHNvbWUgbWVjaGFuaXNtcyBhcmVuJ3QgZGVwcmVjYXRlZAotICogdGhleSBhcmUgZS5nLiBmYWxsYmFja3MsIGFsdGVybmF0aXZlcywuLi4KLSAqIGluIG9yZGVyIHRvIGF2b2lkIHRoZSBkZXByZWNhdGVkIGFubm90YXRpb24gaXQncyBwb3NzaWJsZSB0byB1c2UgdGhpcyBvbmUuCi0gKiB5b3UgY2FuIHRlbGwgb3RoZXIgZGV2ZWxvcGVyczoKLSAqIHRoaXMgYXJ0aWZhY3QgaXNuJ3QgdXNlZCBmb3IgdGhlIGRlc2lyZWQgYXBwcm9hY2gsIGhvd2V2ZXIsIGl0J3Mgc3RpbGwgZXNzZW50aWFsIHRvIGhhdmUgaXQgYXMgLi4uCi0gKiA8cC8+Ci0gKiBpZGVhOiB1bmlmeSBzbWFsbCBwYXJ0cyBvZiBpbmZvcm1hdGlvbiB3aGljaCBhcmUgZnJlcXVlbnRseSB1c2VkCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi1wdWJsaWMgQGludGVyZmFjZSBVc2FnZUluZm9ybWF0aW9uCi17Ci0gICAgVXNhZ2VDYXRlZ29yeVtdIHZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0NsYXNzVXRpbHMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjI3NWVhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDbGFzc1V0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIHRyeVRvTG9hZENsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGxvYWRDbGFzc0Zvck5hbWUobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGxvYWRDbGFzc0Zvck5hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIFRyeSBXZWJBcHAgQ2xhc3NMb2FkZXIgZmlyc3QNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwDQotICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWdub3JlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIGZhbGxiYWNrOiBUcnkgQ2xhc3NMb2FkZXIgZm9yIENsYXNzVXRpbHMgKGkuZS4gdGhlIG15ZmFjZXMuamFyIGxpYikNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwDQotICAgICAgICAgICAgICAgIENsYXNzVXRpbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnN0YW50aWF0ZUNsYXNzKENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0Q2xhc3MubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoU3RyaW5nIGNsYXNzTmFtZSkNCi0gICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsb2FkQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0VMVXRpbHMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRUxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjRlNDk1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRUxVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBpbiBvcmRlciB0byBjZW50cmFsaXplIHRoZSBqc2YgdmVyc2lvbiBkZXBlbmRlbmN5IHdpdGhpbiB0aGUgY29yZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotQFRvRG8oUHJpb3JpdHkuTUVESVVNKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEVMVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0VHlwZU9mVmFsdWVCaW5kaW5nRm9yRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgLy9kdWUgdG8gYSByZXN0cmljdGlvbiB3aXRoIHRoZSByaQ0KLSAgICAgICAgT2JqZWN0IGJlYW4gPSBFTFV0aWxzLmdldFZhbHVlT2ZFeHByZXNzaW9uKGZhY2VzQ29udGV4dCwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgICAgICByZXR1cm4gKGJlYW4gIT0gbnVsbCkgPyBiZWFuLmdldENsYXNzKCkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEJlYW4oU3RyaW5nIGJlYW5OYW1lKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgcmV0dXJuIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmdldEVMUmVzb2x2ZXIoKS5nZXRWYWx1ZShmYWNlc0NvbnRleHQuZ2V0RUxDb250ZXh0KCksIG51bGwsIGJlYW5OYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAicmVmYWN0b3IgLSBwcm9ibGVtIC0gc3RhdGljIHZhbHVlcyAtIGpzZiAxLjIgZS5nLjogJHt2YWx1ZX0iKQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRCYXNlT2JqZWN0KFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbHVlQmluZGluZ0V4cHJlc3Npb24ubGFzdEluZGV4T2YoIi4iKSA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdWlDb21wb25lbnQuZ2V0VmFsdWVFeHByZXNzaW9uKCJ2YWx1ZSIpLmdldFZhbHVlKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFTENvbnRleHQoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZ2V0QmFzZU9iamVjdCh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRCYXNlT2JqZWN0KFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbmV3RXhwcmVzc2lvbiA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uc3Vic3RyaW5nKDAsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24ubGFzdEluZGV4T2YoIi4iKSkgKyAifSI7DQotDQotICAgICAgICByZXR1cm4gZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCBuZXdFeHByZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uICE9IG51bGwpID8gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZXZhbHVhdGVFeHByZXNzaW9uR2V0KA0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgT2JqZWN0LmNsYXNzKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXhwcmVzc2lvblZhbGlkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5ldmFsdWF0ZUV4cHJlc3Npb25HZXQoZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBPYmplY3QuY2xhc3MpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlbGlhYmxlVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigNCi0gICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IGdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24odWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGJhc2VFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi0NCi0gICAgICAgIC8vZm9yIGlucHV0IGNvbXBvbmVudHMgd2l0aG91dCB2YWx1ZS1iaW5kaW5nDQotICAgICAgICAvLyhlLmcuIGZvciBzcGVjaWFsIGNvbXBvbmVudCBsaWJzIC0+IGlzc3VlIHdpdGggRXh0VmFsUmVuZGVyZXJXcmFwcGVyI2VuY29kZUJlZ2luKQ0KLSAgICAgICAgaWYoYmFzZUV4cHJlc3Npb24gPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8gbG9nZ2luZw0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGJhc2VFeHByZXNzaW9uLmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZUV4cHJlc3Npb24gPSBiYXNlRXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiLiIpKSArICJ9IjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChnZXRUeXBlT2ZWYWx1ZUJpbmRpbmdGb3JFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgYmFzZUV4cHJlc3Npb24pID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IEZhY2VsZXRzVGFnbGliRXhwcmVzc2lvblV0aWxzLg0KLSAgICAgICAgICAgICAgICB0cnlUb0NyZWF0ZVZhbHVlQmluZGluZ0ZvckZhY2VsZXRzQmluZGluZyh1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBWYWx1ZUV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uID0gdWlDb21wb25lbnQuZ2V0VmFsdWVFeHByZXNzaW9uKCJ2YWx1ZSIpOw0KLQ0KLSAgICAgICAgcmV0dXJuICh2YWx1ZUV4cHJlc3Npb24gIT0gbnVsbCkgPyB2YWx1ZUV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldFR5cGVPZlZhbHVlQmluZGluZ0ZvckNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgVmFsdWVFeHByZXNzaW9uIHZhbHVlRXhwcmVzc2lvbiA9IHVpQ29tcG9uZW50LmdldFZhbHVlRXhwcmVzc2lvbigidmFsdWUiKTsNCi0NCi0gICAgICAgIHJldHVybiAodmFsdWVFeHByZXNzaW9uICE9IG51bGwpID8gdmFsdWVFeHByZXNzaW9uLmdldFR5cGUoZmFjZXNDb250ZXh0LmdldEVMQ29udGV4dCgpKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxVdGlscy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGI2N2RjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYW5ub3RhdGlvbi5leHRyYWN0b3IuQW5ub3RhdGlvbkV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuYW5ub3RhdGlvbi5leHRyYWN0b3IuQW5ub3RhdGlvbkV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxVdGlscw0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yQW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKENsYXNzTWFwcGluZ0ZhY3Rvcnk8QW5ub3RhdGlvbiwgVmFsaWRhdGlvblN0cmF0ZWd5PikgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZShhbm5vdGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGdldE1ldGFEYXRhRXh0cmFjdG9yRm9yVmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YUV4dHJhY3Rvcj4pIEV4dFZhbENvbnRleHQNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEFubm90YXRpb25FeHRyYWN0b3IgZ2V0QW5ub3RhdGlvbkV4dHJhY3RvcigpDQotICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5DT01QT05FTlRfQU5OT1RBVElPTl9FWFRSQUNUT1JfRkFDVE9SWSwgQW5ub3RhdGlvbkV4dHJhY3RvckZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50V2l0aE1ldGFEYXRhKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgKChDbGFzc01hcHBpbmdGYWN0b3J5PFVJQ29tcG9uZW50LCBDb21wb25lbnRJbml0aWFsaXplcj4pRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuQ09NUE9ORU5UX0lOSVRJQUxJWkVSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZSh1aUNvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgICAgIC5jb25maWd1cmVDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZVJlc29sdmVyIGdldE1lc3NhZ2VSZXNvbHZlckZvclZhbGlkYXRpb25TdHJhdGVneShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWVzc2FnZVJlc29sdmVyPilFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAuY3JlYXRlKHZhbGlkYXRpb25TdHJhdGVneSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25VdGlscy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzg1YWFjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsNCi1pbXBvcnQgamF2YS5pby5FeHRlcm5hbGl6YWJsZTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEZhY2VsZXRzVGFnbGliRXhwcmVzc2lvblV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0cnlUb0NyZWF0ZVZhbHVlQmluZGluZ0ZvckZhY2VsZXRzQmluZGluZygNCi0gICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gRUxVdGlscy5nZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEJpbmRpbmdzID0gZXh0cmFjdEVMVGVybXModWlDb21wb25lbnQuZ2V0VmFsdWVFeHByZXNzaW9uKCJ2YWx1ZSIpKTsNCi0NCi0gICAgICAgICAgICByZXR1cm4gZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLnN1YnN0cmluZygwLCAxKSArICJ7IiArIGNyZWF0ZUJpbmRpbmcoZm91bmRCaW5kaW5ncykgKyAifSI7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhY2VsZXRzVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVCaW5kaW5nKExpc3Q8U3RyaW5nPiBleHByZXNzaW9ucykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOw0KLQ0KLSAgICAgICAgU3RyaW5nIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRCaW5kaW5nOw0KLSAgICAgICAgU3RyaW5nIHBhcnRPZkJpbmRpbmc7DQotDQotICAgICAgICBpbnQgaW5kZXhPZkJpbmRpbmdEZXRhaWxzOw0KLSAgICAgICAgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBleHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aCgiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZvdW5kQmluZGluZ0RldGFpbHMgPSBlbnRyeS5zcGxpdCgiICIpOw0KLSAgICAgICAgICAgIGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoZm91bmRCaW5kaW5nRGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9PSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBiaW5kaW5nRGV0YWlscyA9IGZvdW5kQmluZGluZ0RldGFpbHNbaW5kZXhPZkJpbmRpbmdEZXRhaWxzXS5zcGxpdCgiPSIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nRGV0YWlscy5sZW5ndGggPCAyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYmluZGluZ0RldGFpbHNbMV07DQotICAgICAgICAgICAgaWYgKHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHBhcnRPZkJpbmRpbmcgPSBjdXJyZW50QmluZGluZy5zdWJzdHJpbmcoY3VycmVudEJpbmRpbmcuaW5kZXhPZihwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lKQ0KLSAgICAgICAgICAgICAgICAgICAgKyBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lLmxlbmd0aCgpLCBjdXJyZW50QmluZGluZy5pbmRleE9mKCJ9IikpOw0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBwYXJ0T2ZCaW5kaW5nOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyZW50QmluZGluZy5zdWJzdHJpbmcoY3VycmVudEJpbmRpbmcuaW5kZXhPZigieyIpICsgMSwgY3VycmVudEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHJldkZhY2VsZXRzQXR0cmlidXRlTmFtZSA9IGJpbmRpbmdEZXRhaWxzWzBdOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZmluZEluZGV4T2ZCaW5kaW5nRGV0YWlscyhTdHJpbmdbXSBiaW5kaW5nRGV0YWlscykNCi0gICAgew0KLSAgICAgICAgaW50IGNvdW50ID0gMDsNCi0gICAgICAgIGZvciAoU3RyaW5nIGVudHJ5IDogYmluZGluZ0RldGFpbHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LmNvbnRhaW5zKCI9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gY291bnQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNvdW50Kys7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGV4dHJhY3RFTFRlcm1zKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFN0cmluZz4gZm91bmRFTFRlcm1zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAocmVzb2x2ZUVMVGVybXMobywgbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCksIGZvdW5kRUxUZXJtcywgMCkgPiAwKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kRUxUZXJtczsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHJlc29sdmVFTFRlcm1zKE9iamVjdCBvLCBNYXA8T2JqZWN0LCBPYmplY3Q+IHZpc2l0ZWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gZm91bmRFTFRlcm1zLCBpbnQgY291bnQpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCB2aXNpdGVkLmNvbnRhaW5zS2V5KG8pIHx8IGNvdW50ID4gNTApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotDQotICAgICAgICB2aXNpdGVkLnB1dChvLCBudWxsKTsNCi0NCi0gICAgICAgIGludCBlbENvdW50ID0gMDsNCi0gICAgICAgIENsYXNzIGMgPSBvLmdldENsYXNzKCk7DQotDQotICAgICAgICAvL2luc3BlY3QgbWFwcw0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBNYXApDQotICAgICAgICB7DQotDQotICAgICAgICAgICAgZm9yIChPYmplY3QgZW50cnkgOiAoKE1hcCkgbykudmFsdWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKGVudHJ5LCB2aXNpdGVkLCBmb3VuZEVMVGVybXMsIGNvdW50ICsgMSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGlzRUxUZXJtKG8pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChmb3VuZEVMVGVybXMgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZvdW5kRUxUZXJtcy5hZGQoby50b1N0cmluZygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuICsrZWxDb3VudDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vYW5hbHl6ZSBhcnJheXMNCi0gICAgICAgIGlmIChjLmlzQXJyYXkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKG8pOw0KLSAgICAgICAgICAgIC8vY2hlY2sgYXJyYXkgW0wgLT4gbm8gYXJyYXkgb2YgcHJpbWl0aXZlIHR5cGVzDQotICAgICAgICAgICAgaWYgKG8udG9TdHJpbmcoKS5zdGFydHNXaXRoKCJbTCIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG8udG9TdHJpbmcoKS5zdGFydHNXaXRoKCJbTGphdmEubGFuZy5TdHJpbmciKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNFTFRlcm0oQXJyYXkuZ2V0KG8sIGkpKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZEVMVGVybXMgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsQ291bnQrKzsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZWxDb3VudCArPSByZXNvbHZlRUxUZXJtcyhBcnJheS5nZXQobywgaSksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gZWxDb3VudDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8RmllbGQ+IGF0dHJpYnV0ZXMgPSBmaW5kQWxsQXR0cmlidXRlcyhjLCBuZXcgQXJyYXlMaXN0PEZpZWxkPigpKTsNCi0gICAgICAgIEZpZWxkW10gZmllbGRzID0gKEZpZWxkW10pIGF0dHJpYnV0ZXMudG9BcnJheShuZXcgRmllbGRbYXR0cmlidXRlcy5zaXplKCldKTsNCi0NCi0gICAgICAgIEFjY2Vzc2libGVPYmplY3Quc2V0QWNjZXNzaWJsZShmaWVsZHMsIHRydWUpOw0KLSAgICAgICAgZm9yIChGaWVsZCBjdXJyZW50RmllbGQgOiBmaWVsZHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5nZXQobykgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmdldFR5cGUoKS5lcXVhbHMoU3RyaW5nLmNsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQuZ2V0KG8pICE9IG51bGwgJiYgaXNFTFRlcm0oY3VycmVudEZpZWxkLmdldChvKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZEVMVGVybXMgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBlbENvdW50Kys7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZiAoIWN1cnJlbnRGaWVsZC5nZXRUeXBlKCkuaXNQcmltaXRpdmUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoY3VycmVudEZpZWxkLmdldChvKSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBlbENvdW50Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFTFRlcm0oT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgVmFsdWVCaW5kaW5nIHx8IG8gaW5zdGFuY2VvZiBFeHRlcm5hbGl6YWJsZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcyA9IG8udG9TdHJpbmcoKTsNCi0gICAgICAgIHJldHVybiAoKHMuY29udGFpbnMoIiMiKSB8fCBzLmNvbnRhaW5zKCIkIikpICYmIHMuY29udGFpbnMoInsiKSAmJiBzLmNvbnRhaW5zKCJ9IikpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8RmllbGQ+IGZpbmRBbGxBdHRyaWJ1dGVzKENsYXNzIGMsIExpc3Q8RmllbGQ+IGF0dHJpYnV0ZXMpDQotICAgIHsNCi0gICAgICAgIGlmIChjID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7DQotICAgICAgICB9DQotICAgICAgICBmaW5kQWxsQXR0cmlidXRlcyhjLmdldFN1cGVyY2xhc3MoKSwgYXR0cmlidXRlcyk7DQotDQotICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGMuZ2V0RGVjbGFyZWRGaWVsZHMoKTsNCi0gICAgICAgIGZvciAoRmllbGQgY3VycmVudEZpZWxkIDogZmllbGRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghTW9kaWZpZXIuaXNTdGF0aWMoY3VycmVudEZpZWxkLmdldE1vZGlmaWVycygpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKGN1cnJlbnRGaWVsZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzUyYTNjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvSnNmVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY3RvcnlGaW5kZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGU7DQotaW1wb3J0IGphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGVGYWN0b3J5Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnNmVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcihQaGFzZUxpc3RlbmVyIHBoYXNlTGlzdGVuZXIpDQotICAgIHsNCi0gICAgICAgIExpZmVjeWNsZUZhY3RvcnkgbGlmZWN5Y2xlRmFjdG9yeSA9IChMaWZlY3ljbGVGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShGYWN0b3J5RmluZGVyLkxJRkVDWUNMRV9GQUNUT1JZKTsNCi0NCi0gICAgICAgIFN0cmluZyBjdXJyZW50SWQ7DQotICAgICAgICBMaWZlY3ljbGUgY3VycmVudExpZmVjeWNsZTsNCi0gICAgICAgIEl0ZXJhdG9yIGxpZmVjeWNsZUlkcyA9IGxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlSWRzKCk7DQotICAgICAgICB3aGlsZSAobGlmZWN5Y2xlSWRzLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50SWQgPSAoU3RyaW5nKSBsaWZlY3ljbGVJZHMubmV4dCgpOw0KLSAgICAgICAgICAgIGN1cnJlbnRMaWZlY3ljbGUgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZShjdXJyZW50SWQpOw0KLSAgICAgICAgICAgIGN1cnJlbnRMaWZlY3ljbGUucmVtb3ZlUGhhc2VMaXN0ZW5lcihwaGFzZUxpc3RlbmVyKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0xvZ1V0aWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0xvZ1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NGIzNmEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Mb2dVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5sb2dnaW5nLkxldmVsOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5sb2dnaW5nLkFic3RyYWN0TG9nZ2VyRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBoZWxwZXIgdG8gZ2V0IHNob3J0ZXIgbG9nZ2luZyBzdGF0ZW1lbnRzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMb2dVdGlscw0KLXsNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBtZXNzYWdlLCBDbGFzcyB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgdHJhY2UobWVzc2FnZSwgbnVsbCwgdGFyZ2V0Q2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSwgQ2xhc3MgdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5MT0dHRVJfRkFDVE9SWSwgQWJzdHJhY3RMb2dnZXJGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgIC5jcmVhdGUodGFyZ2V0Q2xhc3MpLmxvZyhMZXZlbC5UUkFDRSwgbWVzc2FnZSwgdGhyb3dhYmxlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVidWcoU3RyaW5nIG1lc3NhZ2UsIENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBkZWJ1ZyhtZXNzYWdlLCBudWxsLCB0YXJnZXRDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlYnVnKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlLCBDbGFzcyB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkxPR0dFUl9GQUNUT1JZLCBBYnN0cmFjdExvZ2dlckZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgLmNyZWF0ZSh0YXJnZXRDbGFzcykubG9nKExldmVsLkRFQlVHLCBtZXNzYWdlLCB0aHJvd2FibGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbmZvKFN0cmluZyBtZXNzYWdlLCBDbGFzcyB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgaW5mbyhtZXNzYWdlLCBudWxsLCB0YXJnZXRDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGluZm8oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUsIENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTE9HR0VSX0ZBQ1RPUlksIEFic3RyYWN0TG9nZ2VyRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAuY3JlYXRlKHRhcmdldENsYXNzKS5sb2coTGV2ZWwuSU5GTywgbWVzc2FnZSwgdGhyb3dhYmxlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2FybihTdHJpbmcgbWVzc2FnZSwgQ2xhc3MgdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIHdhcm4obWVzc2FnZSwgbnVsbCwgdGFyZ2V0Q2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlLCBDbGFzcyB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkxPR0dFUl9GQUNUT1JZLCBBYnN0cmFjdExvZ2dlckZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgLmNyZWF0ZSh0YXJnZXRDbGFzcykubG9nKExldmVsLldBUk4sIG1lc3NhZ2UsIHRocm93YWJsZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGVycm9yKFN0cmluZyBtZXNzYWdlLCBDbGFzcyB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgZXJyb3IobWVzc2FnZSwgbnVsbCwgdGFyZ2V0Q2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSwgQ2xhc3MgdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5MT0dHRVJfRkFDVE9SWSwgQWJzdHJhY3RMb2dnZXJGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgIC5jcmVhdGUodGFyZ2V0Q2xhc3MpLmxvZyhMZXZlbC5FUlJPUiwgbWVzc2FnZSwgdGhyb3dhYmxlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmF0YWwoU3RyaW5nIG1lc3NhZ2UsIENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBmYXRhbChtZXNzYWdlLCBudWxsLCB0YXJnZXRDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZhdGFsKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlLCBDbGFzcyB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkxPR0dFUl9GQUNUT1JZLCBBYnN0cmFjdExvZ2dlckZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgLmNyZWF0ZSh0YXJnZXRDbGFzcykubG9nKExldmVsLkZBVEFMLCBtZXNzYWdlLCB0aHJvd2FibGUpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1JlZmxlY3Rpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmIwZGYwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFJlZmxlY3Rpb25VdGlscwotewotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIHRyeVRvR2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0TWV0aG9kTmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0dldE1ldGhvZCh0YXJnZXRDbGFzcywgdGFyZ2V0TWV0aG9kTmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgdHJ5VG9HZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lLCBDbGFzc1tdIHBhcmFtZXRlclR5cGVzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lKQotICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TWV0aG9kKHRhcmdldENsYXNzLCB0YXJnZXRNZXRob2ROYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lLCBDbGFzc1tdIHBhcmFtZXRlclR5cGVzKQotICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gdGFyZ2V0Q2xhc3MuZ2V0TWV0aG9kKHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvSW52b2tlTWV0aG9kKHRhcmdldCwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvSW52b2tlTWV0aG9kT2ZDbGFzcyh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2RPZkNsYXNzQW5kTWV0aG9kTmFtZShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbWV0aG9kTmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3NBbmRNZXRob2ROYW1lKGNsYXNzTmFtZSwgbWV0aG9kTmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2RPZkNsYXNzQW5kTWV0aG9kTmFtZShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0W10gYXJncykKLSAgICB7Ci0gICAgICAgIENsYXNzW10gdGFyZ2V0QXJncyA9IG5ldyBDbGFzc1swXTsKLQotICAgICAgICBpZihhcmdzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRhcmdldEFyZ3MgPSBuZXcgQ2xhc3NbYXJncy5sZW5ndGhdOwotCi0gICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0YXJnZXRBcmdzW2ldID0gYXJnc1tpXS5nZXRDbGFzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRyeVRvSW52b2tlTWV0aG9kT2ZDbGFzc0FuZE1ldGhvZE5hbWUoY2xhc3NOYW1lLCBtZXRob2ROYW1lLCBhcmdzLCB0YXJnZXRBcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3NBbmRNZXRob2ROYW1lKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZXRob2ROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gYXJncywgQ2xhc3NbXSBhcmdUeXBlcykKLSAgICB7Ci0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsKLSAgICAgICAgTWV0aG9kIHRhcmdldE1ldGhvZCA9IHRyeVRvR2V0TWV0aG9kKHRhcmdldENsYXNzLCBtZXRob2ROYW1lLCBhcmdUeXBlcyk7Ci0gICAgICAgIHJldHVybiB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3ModGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZCwgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kT2ZDbGFzcyh0YXJnZXQsIG1ldGhvZCwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldC5uZXdJbnN0YW5jZSgpLCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzKQotICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQubmV3SW5zdGFuY2UoKSwgbWV0aG9kLCBhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKHRhcmdldCwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldCwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykKLSAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKHRhcmdldCwgYXJncyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjU5ZGRhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvV2ViWG1sVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgV2ViWG1sVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEluaXRQYXJhbWV0ZXIoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpDQotICAgICAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCArICIuIiArIGtleSk7DQotICAgICAgICByZXR1cm4gKHZhbHVlICE9IG51bGwpID8gdmFsdWUucmVwbGFjZSgiICIsICIiKS50cmltKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvaGVsbG9fd29ybGQvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjlmY2NjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIGhlbGxvIHdvcmxkPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4ke2J1aWxkLnZlcnNpb259PC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPiR7YnVpbGQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtidWlsZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmpzdGw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anN0bDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5PiAgICAgICAgDQotDQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjZmMjk2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rOwotCi0vKioKLSAqIEEgdHlwaWNhbCBzaW1wbGUgYmFja2luZyBiZWFuLCB0aGF0IGlzIGJhY2tlZCB0byA8Y29kZT5oZWxsb3dvcmxkLmpzcDwvY29kZT4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZENvbnRyb2xsZXIKLXsKLQotICAgIC8vcHJvcGVydGllcwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBkZWZhdWx0IGVtcHR5IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIEhlbGxvV29ybGRDb250cm9sbGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tZ2V0dGVyICYgc2V0dGVyCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB0aGF0IGlzIGJhY2tlZCB0byBhIHN1Ym1pdCBidXR0b24gb2YgYSBmb3JtLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgc2VuZCgpCi0gICAgewotICAgICAgICAvL2RvIHJlYWwgbG9naWMsIHJldHVybiBhIHN0cmluZyB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuYXZpZ2F0aW9uIHN5c3RlbSBvZiBKU0YKLSAgICAgICAgcmV0dXJuICJzdWNjZXNzIjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiZWFlNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGZhY2VzLWNvbmZpZyB2ZXJzaW9uPSIxLjIiIAotICAgIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIj4KLQkKLQk8IS0tIG1hbmFnZWQgYmVhbnMgb2YgdGhlIHNpbXBsZSBoZWxsbyB3b3JsZCBhcHAgLS0+Ci0JPG1hbmFnZWQtYmVhbj4KLQkJPG1hbmFnZWQtYmVhbi1uYW1lPmhlbGxvV29ybGQ8L21hbmFnZWQtYmVhbi1uYW1lPgotCQk8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5IZWxsb1dvcmxkQ29udHJvbGxlcjwvbWFuYWdlZC1iZWFuLWNsYXNzPgotCQk8bWFuYWdlZC1iZWFuLXNjb3BlPnJlcXVlc3Q8L21hbmFnZWQtYmVhbi1zY29wZT4KLQk8L21hbmFnZWQtYmVhbj4KLQkKLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIGhlbGxvV29ybGQuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L2hlbGxvV29ybGQuanNwPC9mcm9tLXZpZXctaWQ+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPnN1Y2Nlc3M8L2Zyb20tb3V0Y29tZT4KLQkJCTx0by12aWV3LWlkPi9wYWdlMi5qc3A8L3RvLXZpZXctaWQ+Ci0JCTwvbmF2aWdhdGlvbi1jYXNlPgotCTwvbmF2aWdhdGlvbi1ydWxlPgotCQotCTwhLS0gbmF2aWdhdGlvbiBydWxlcyBmb3IgcGFnZTIuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L3BhZ2UyLmpzcDwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5iYWNrPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vaGVsbG9Xb3JsZC5qc3A8L3RvLXZpZXctaWQ+Ci0JCTwvbmF2aWdhdGlvbi1jYXNlPgotCTwvbmF2aWdhdGlvbi1ydWxlPgotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE0YTE4My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgotICAgICAgICAgdmVyc2lvbj0iMi40Ij4KLQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8IS0tb3B0aW9uYWw6IGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Db21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBVUklzIG9mIChhZGRpdGlvbmFsKSBmYWNlcyBjb25maWcgZmlsZXMuCi0gICAgICAgICAgICAoZS5nLiAvV0VCLUlORi9teS1jb25maWcueG1sKQotICAgICAgICAgICAgU2VlIEpTRiAxLjAgUFJEMiwgMTAuMy4yCi0gICAgICAgICAgICBBdHRlbnRpb246IFlvdSBkbyBub3QgbmVlZCB0byBwdXQgL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBpbiBoZXJlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5DT05GSUdfRklMRVM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0tLT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBTZWUgSlNGIFNwZWNpZmljYXRpb24gMi41LjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIGFtb3VudCAoZGVmYXVsdCA9IDIwKSBvZiB0aGUgbGF0ZXN0IHZpZXdzIGFyZSBzdG9yZWQgaW4gc2Vzc2lvbi48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuTlVNQkVSX09GX1ZJRVdTX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc3RhdGUgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0gYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLgotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KSBhbmQgaWYKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgY29tcHJlc3NlZC48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcGFyYW1ldGVyIHRlbGxzIE15RmFjZXMgaWYgamF2YXNjcmlwdCBjb2RlIHNob3VsZCBiZSBhbGxvd2VkIGluIHRoZQotICAgICAgICAgICAgcmVuZGVyZWQgSFRNTCBvdXRwdXQuCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUKLSAgICAgICAgICAgIHRoYXQgc3VibWl0cyB0aGUgY29ycmVzcG9uZGluZyBmb3JtLgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBub3QgYWxsb3dlZCwgdGhlIHN0YXRlIHNhdmluZyBpbmZvIGFuZCBuZXN0ZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BTExPV19KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuREVURUNUX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgcmVuZGVyZWQgSFRNTCBjb2RlIHdpbGwgYmUgZm9ybWF0dGVkLCBzbyB0aGF0IGl0IGlzICJodW1hbiByZWFkYWJsZSIuCi0gICAgICAgICAgICBpLmUuIGFkZGl0aW9uYWwgbGluZSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIHdpbGwgYmUgd3JpdHRlbiwgdGhhdCBkbyBub3QKLSAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgSFRNTCBjb2RlLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlBSRVRUWV9IVE1MPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlCi0gICAgICAgICAgICBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuIENvbnZlbmllbnQgZmVhdHVyZSBpZiB5b3UgaGF2ZSBwYWdlcwotICAgICAgICAgICAgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGJyb3dzZXIgcGFnZSB0byBhbHdheXMganVtcCB0byB0aGUgdG9wCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuCi0gICAgICAgICAgICBEZWZhdWx0OiAiZmFsc2UiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFVVE9fU0NST0xMPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Vc2VkIGZvciBlbmNyeXB0aW5nIHZpZXcgc3RhdGUuIE9ubHkgcmVsZXZhbnQgZm9yIGNsaWVudCBzaWRlCi0gICAgICAgICAgICBzdGF0ZSBzYXZpbmcuIFNlZSBNeUZhY2VzIHdpa2kvd2ViIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRUNSRVQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWYWxpZGF0ZSBtYW5hZ2VkIGJlYW5zLCBuYXZpZ2F0aW9uIHJ1bGVzIGFuZCBlbnN1cmUgdGhhdCBmb3JtcyBhcmUgbm90IG5lc3RlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlZBTElEQVRFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUcmVhdCByZWFkb25seSBzYW1lIGFzIGlmIGRpc2FibGVkIGF0dHJpYnV0ZSB3YXMgc2V0IGZvciBzZWxlY3QgZWxlbWVudHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5SRUFET05MWV9BU19ESVNBQkxFRF9GT1JfU0VMRUNUUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFVzZSB0aGUgZGVmaW5lZCBjbGFzcyBhcyB0aGUgY2xhc3Mgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiBhIHJlc291cmNlIGlzIGFkZGVkIHRvIHRoZQotICAgICAgICAgICAgRXh0ZW5zaW9uRmlsdGVyIGhhbmRsaW5nLiBVc2luZyBTdHJlYW1pbmdBZGRSZXNvdXJjZSBoZXJlIGhlbHBzIHdpdGggcGVyZm9ybWFuY2UuIElmIHlvdSB3YW50IHRvIGFkZAotICAgICAgICAgICAgY3VzdG9tIGNvbXBvbmVudHMgYW5kIHdhbnQgdG8gdXNlIHRoZSBFeHRlbnNpb25GaWx0ZXIsIHlvdSBuZWVkIHRvIHByb3ZpZGUgeW91ciBjdXN0b20gaW1wbGVtZW50YXRpb24gaGVyZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFERF9SRVNPVVJDRV9DTEFTUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC51dGlsLkRlZmF1bHRBZGRSZXNvdXJjZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAgICAgCi0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmlydHVhbCBwYXRoIGluIHRoZSBVUkwgd2hpY2ggdHJpZ2dlcnMgbG9hZGluZyBvZiByZXNvdXJjZXMgZm9yIHRoZSBNeUZhY2VzIGV4dGVuZGVkIGNvbXBvbmVudHMKLSAgICAgICAgICAgIGluIHRoZSBFeHRlbnNpb25GaWx0ZXIuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5SRVNPVVJDRV9WSVJUVUFMX1BBVEg8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vZmFjZXMvbXlGYWNlc0V4dGVuc2lvblJlc291cmNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIENoZWNrIGlmIHRoZSBleHRlbnNpb25zLWZpbHRlciBoYXMgYmVlbiBwcm9wZXJseSBjb25maWd1cmVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ0hFQ0tfRVhURU5TSU9OU19GSUxURVI8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIERlZmluZSBwYXJ0aWFsIHN0YXRlIHNhdmluZyBhcyB0cnVlL2ZhbHNlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5QQVJUSUFMX1NUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLQotICAgIDwhLS0gTGlzdGVuZXIsIHRvIGFsbG93IEpldHR5IHNlcnZpbmcgTXlGYWNlcyBhcHBzIC0tPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy53ZWJhcHAuU3RhcnR1cFNlcnZsZXRDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZyAtLT4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPiouanNmPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguanNwPC93ZWxjb21lLWZpbGU+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTY1YTNmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgICA8Zjp2aWV3PgotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPgotICAgICAgICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMyI+Ci0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJuYW1lIiB2YWx1ZT0iUGxlYXNlIGVudGVyIHlvdXIgbmFtZSIgLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9Im5hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQubmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0ibmFtZSIgc2hvd1N1bW1hcnk9InRydWUiIHNob3dEZXRhaWw9ImZhbHNlIi8+Ci0KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJQcmVzcyBtZSIgYWN0aW9uPSIje2hlbGxvV29ybGQuc2VuZH0iLz4KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4KLSAgICAgICAgICAgICAgPC9oOnBhbmVsR3JpZD4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICA8L2Y6dmlldz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcCBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjljMjI4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08JUAgcGFnZSBzZXNzaW9uPSJmYWxzZSIlPgotPCUKLXJlc3BvbnNlLnNlbmRSZWRpcmVjdCgiaGVsbG9Xb3JsZC5qc2YiKTsKLSU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQxMmM0MS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgICAgPGgyPjxoOm91dHB1dFRleHQgdmFsdWU9IkhlbGxvICN7aGVsbG9Xb3JsZC5uYW1lfS4gV2UgaG9wZSB5b3UgZW5qb3kgQXBhY2hlIE15RmFjZXMiLz48L2gyPgotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIGFjdGlvbj0iYmFjayI+Ci0gICAgICAgICAgICAgICAgICAgIDxoOm91dHB1dFRleHQgdmFsdWU9IkhvbWUiLz4KLSAgICAgICAgICAgICAgICA8L2g6Y29tbWFuZExpbms+Ci0gICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgPC9mOnZpZXc+Ci0gICAgPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9leGFtcGxlcy9sb2dnaW5nX2V4YW1wbGUvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9leGFtcGxlcy9sb2dnaW5nX2V4YW1wbGUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiMmM2MS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvbG9nZ2luZ19leGFtcGxlL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtbG9nZ2luZ19leGFtcGxlPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIGhlbGxvIGpwYTwvbmFtZT4NCi0gICAgPHZlcnNpb24+JHtidWlsZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4ke2J1aWxkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7YnVpbGQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmxvZ2dpbmctc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvbW1vbnMtbG9nZ2luZy1zdXBwb3J0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7YnVpbGQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmpzdGw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anN0bDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2V4YW1wbGVzL2xvZ2dpbmdfZXhhbXBsZS9zcmMvbWFpbi9qYXZhL2xvZzRqLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvbG9nZ2luZ19leGFtcGxlL3NyYy9tYWluL2phdmEvbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJlNWIwZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvbG9nZ2luZ19leGFtcGxlL3NyYy9tYWluL2phdmEvbG9nNGoucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyByb290IGxvZ2dlcgotbG9nNGoucm9vdExvZ2dlcj1ERUJVRywgQ3VzdG9tQ29uc29sZUFwcGVuZGVyCi0KLWxvZzRqLmFwcGVuZGVyLkN1c3RvbUNvbnNvbGVBcHBlbmRlcj1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuQ3VzdG9tQ29uc29sZUFwcGVuZGVyLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLkN1c3RvbUNvbnNvbGVBcHBlbmRlci5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWR7eXl5eS1NTS1kZCBISDptbTpzcy5TU1N9ICU1cCBbJXRdICVtICVDezF9ICVNICVMICVuCi1sb2c0ai5jYXRlZ29yeS5vcmcuYXBhY2hlPVdBUk4KLWxvZzRqLmNhdGVnb3J5Lm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlPVRSQUNFCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvbG9nZ2luZ19leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvbG9nZ2luZ19leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOTRlYTYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2V4YW1wbGVzL2xvZ2dpbmdfZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLmRvbWFpbi5QZXJzb247Ci0KLS8qKgotICogQSB0eXBpY2FsIHNpbXBsZSBiYWNraW5nIGJlYW4sIHRoYXQgaXMgYmFja2VkIHRvIDxjb2RlPmhlbGxvd29ybGQuanNwPC9jb2RlPgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkQ29udHJvbGxlcgotewotCi0gICAgLy9wcm9wZXJ0aWVzCi0gICAgcHJpdmF0ZSBQZXJzb24gcGVyc29uOwotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBlbXB0eSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBIZWxsb1dvcmxkQ29udHJvbGxlcigpCi0gICAgewotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLWdldHRlciAmIHNldHRlcgotCi0gICAgcHVibGljIFBlcnNvbiBnZXRQZXJzb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBlcnNvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzb24oUGVyc29uIHBlcnNvbikKLSAgICB7Ci0gICAgICAgIHRoaXMucGVyc29uID0gcGVyc29uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB0aGF0IGlzIGJhY2tlZCB0byBhIHN1Ym1pdCBidXR0b24gb2YgYSBmb3JtLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgc2VuZCgpCi0gICAgewotICAgICAgICAvL2RvIHJlYWwgbG9naWMsIHJldHVybiBhIHN0cmluZyB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuYXZpZ2F0aW9uIHN5c3RlbSBvZiBKU0YKLSAgICAgICAgcmV0dXJuICJzdWNjZXNzIjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2V4YW1wbGVzL2xvZ2dpbmdfZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvbG9nZ2luZ19leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThlYzdiNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvbG9nZ2luZ19leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5kb21haW47DQotDQotcHVibGljIGNsYXNzIFBlcnNvbg0KLXsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvbG9nZ2luZ19leGFtcGxlL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvbG9nZ2luZ19leGFtcGxlL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxODhhYjkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2V4YW1wbGVzL2xvZ2dpbmdfZXhhbXBsZS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZmFjZXMtY29uZmlnIHZlcnNpb249IjEuMiIgCi0gICAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiPgotCQotCTwhLS0gbWFuYWdlZCBiZWFucyBvZiB0aGUgc2ltcGxlIGhlbGxvIHdvcmxkIGFwcCAtLT4KLQk8bWFuYWdlZC1iZWFuPgotCQk8bWFuYWdlZC1iZWFuLW5hbWU+aGVsbG9Xb3JsZDwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0JCTxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLkhlbGxvV29ybGRDb250cm9sbGVyPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0JCTxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPgotICAgICAgICA8bWFuYWdlZC1wcm9wZXJ0eT4KLSAgICAgICAgICAgIDxwcm9wZXJ0eS1uYW1lPnBlcnNvbjwvcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDx2YWx1ZT4je3BlcnNvbn08L3ZhbHVlPgotICAgICAgICA8L21hbmFnZWQtcHJvcGVydHk+Ci0gICAgPC9tYW5hZ2VkLWJlYW4+Ci0KLQk8bWFuYWdlZC1iZWFuPgotCQk8bWFuYWdlZC1iZWFuLW5hbWU+cGVyc29uPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLQkJPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluLlBlcnNvbjwvbWFuYWdlZC1iZWFuLWNsYXNzPgotCQk8bWFuYWdlZC1iZWFuLXNjb3BlPnNlc3Npb248L21hbmFnZWQtYmVhbi1zY29wZT4KLQk8L21hbmFnZWQtYmVhbj4KLQotCTwhLS0gbmF2aWdhdGlvbiBydWxlcyBmb3IgaGVsbG9Xb3JsZC5qc3AgLS0+Ci0JPG5hdmlnYXRpb24tcnVsZT4KLQkJPGZyb20tdmlldy1pZD4vaGVsbG9Xb3JsZC5qc3A8L2Zyb20tdmlldy1pZD4KLQkJPG5hdmlnYXRpb24tY2FzZT4KLQkJCTxmcm9tLW91dGNvbWU+c3VjY2VzczwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L3BhZ2UyLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0JCi0JPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciBwYWdlMi5qc3AgLS0+Ci0JPG5hdmlnYXRpb24tcnVsZT4KLQkJPGZyb20tdmlldy1pZD4vcGFnZTIuanNwPC9mcm9tLXZpZXctaWQ+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPmJhY2s8L2Zyb20tb3V0Y29tZT4KLQkJCTx0by12aWV3LWlkPi9oZWxsb1dvcmxkLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvbG9nZ2luZ19leGFtcGxlL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvbG9nZ2luZ19leGFtcGxlL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNGExODMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2V4YW1wbGVzL2xvZ2dpbmdfZXhhbXBsZS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCi0gICAgICAgICB2ZXJzaW9uPSIyLjQiPgotCi0gICAgPGRlc2NyaXB0aW9uPk15UHJvamVjdCB3ZWIueG1sPC9kZXNjcmlwdGlvbj4KLQotICAgIDwhLS1vcHRpb25hbDogY29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIFVSSXMgb2YgKGFkZGl0aW9uYWwpIGZhY2VzIGNvbmZpZyBmaWxlcy4KLSAgICAgICAgICAgIChlLmcuIC9XRUItSU5GL215LWNvbmZpZy54bWwpCi0gICAgICAgICAgICBTZWUgSlNGIDEuMCBQUkQyLCAxMC4zLjIKLSAgICAgICAgICAgIEF0dGVudGlvbjogWW91IGRvIG5vdCBuZWVkIHRvIHB1dCAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGluIGhlcmUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkNPTkZJR19GSUxFUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi9XRUItSU5GL2V4YW1wbGVzLWNvbmZpZy54bWw8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbS0tPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+U3RhdGUgc2F2aW5nIG1ldGhvZDogImNsaWVudCIgb3IgInNlcnZlciIgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIFNlZSBKU0YgU3BlY2lmaWNhdGlvbiAyLjUuMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jbGllbnQ8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgRGVmaW5lcyB0aGUgYW1vdW50IChkZWZhdWx0ID0gMjApIG9mIHRoZSBsYXRlc3Qgdmlld3MgYXJlIHN0b3JlZCBpbiBzZXNzaW9uLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5OVU1CRVJfT0ZfVklFV1NfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPjIwPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzdGF0ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbSBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uCi0gICAgICAgICAgICBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpIGFuZCBpZgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OIGlzIHRydWUgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzZXJpYWxpemVkIHN0YXRlIHdpbGwgYmUgY29tcHJlc3NlZCBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBjb21wcmVzc2VkLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DT01QUkVTU19TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhpcyBwYXJhbWV0ZXIgdGVsbHMgTXlGYWNlcyBpZiBqYXZhc2NyaXB0IGNvZGUgc2hvdWxkIGJlIGFsbG93ZWQgaW4gdGhlCi0gICAgICAgICAgICByZW5kZXJlZCBIVE1MIG91dHB1dC4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgYWxsb3dlZCwgY29tbWFuZF9saW5rIGFuY2hvcnMgd2lsbCBoYXZlIGphdmFzY3JpcHQgY29kZQotICAgICAgICAgICAgdGhhdCBzdWJtaXRzIHRoZSBjb3JyZXNwb25kaW5nIGZvcm0uCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIG5vdCBhbGxvd2VkLCB0aGUgc3RhdGUgc2F2aW5nIGluZm8gYW5kIG5lc3RlZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICB3aWxsIGJlIGFkZGVkIGFzIHVybCBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFMTE9XX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5ERVRFQ1RfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCByZW5kZXJlZCBIVE1MIGNvZGUgd2lsbCBiZSBmb3JtYXR0ZWQsIHNvIHRoYXQgaXQgaXMgImh1bWFuIHJlYWRhYmxlIi4KLSAgICAgICAgICAgIGkuZS4gYWRkaXRpb25hbCBsaW5lIHNlcGFyYXRvcnMgYW5kIHdoaXRlc3BhY2Ugd2lsbCBiZSB3cml0dGVuLCB0aGF0IGRvIG5vdAotICAgICAgICAgICAgaW5mbHVlbmNlIHRoZSBIVE1MIGNvZGUuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUFJFVFRZX0hUTUw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCBhIGphdmFzY3JpcHQgZnVuY3Rpb24gd2lsbCBiZSByZW5kZXJlZCB0aGF0IGlzIGFibGUgdG8gcmVzdG9yZSB0aGUKLSAgICAgICAgICAgIGZvcm1lciB2ZXJ0aWNhbCBzY3JvbGwgb24gZXZlcnkgcmVxdWVzdC4gQ29udmVuaWVudCBmZWF0dXJlIGlmIHlvdSBoYXZlIHBhZ2VzCi0gICAgICAgICAgICB3aXRoIGxvbmcgbGlzdHMgYW5kIHlvdSBkbyBub3Qgd2FudCB0aGUgYnJvd3NlciBwYWdlIHRvIGFsd2F5cyBqdW1wIHRvIHRoZSB0b3AKLSAgICAgICAgICAgIGlmIHlvdSB0cmlnZ2VyIGEgbGluayBvciBidXR0b24gYWN0aW9uIHRoYXQgc3RheXMgb24gdGhlIHNhbWUgcGFnZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJmYWxzZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQVVUT19TQ1JPTEw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlVzZWQgZm9yIGVuY3J5cHRpbmcgdmlldyBzdGF0ZS4gT25seSByZWxldmFudCBmb3IgY2xpZW50IHNpZGUKLSAgICAgICAgICAgIHN0YXRlIHNhdmluZy4gU2VlIE15RmFjZXMgd2lraS93ZWIgc2l0ZSBkb2N1bWVudGF0aW9uIGZvciBpbnN0cnVjdGlvbnMKLSAgICAgICAgICAgIG9uIGhvdyB0byBjb25maWd1cmUgYW4gYXBwbGljYXRpb24gZm9yIGRpZmZlbmVudCBlbmNyeXB0aW9uIHN0cmVuZ3Rocy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFQ1JFVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPk56WTFORE15TVRBPTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZhbGlkYXRlIG1hbmFnZWQgYmVhbnMsIG5hdmlnYXRpb24gcnVsZXMgYW5kIGVuc3VyZSB0aGF0IGZvcm1zIGFyZSBub3QgbmVzdGVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuVkFMSURBVEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRyZWF0IHJlYWRvbmx5IHNhbWUgYXMgaWYgZGlzYWJsZWQgYXR0cmlidXRlIHdhcyBzZXQgZm9yIHNlbGVjdCBlbGVtZW50cy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlJFQURPTkxZX0FTX0RJU0FCTEVEX0ZPUl9TRUxFQ1RTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVXNlIHRoZSBkZWZpbmVkIGNsYXNzIGFzIHRoZSBjbGFzcyB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgcmVzb3VyY2UgaXMgYWRkZWQgdG8gdGhlCi0gICAgICAgICAgICBFeHRlbnNpb25GaWx0ZXIgaGFuZGxpbmcuIFVzaW5nIFN0cmVhbWluZ0FkZFJlc291cmNlIGhlcmUgaGVscHMgd2l0aCBwZXJmb3JtYW5jZS4gSWYgeW91IHdhbnQgdG8gYWRkCi0gICAgICAgICAgICBjdXN0b20gY29tcG9uZW50cyBhbmQgd2FudCB0byB1c2UgdGhlIEV4dGVuc2lvbkZpbHRlciwgeW91IG5lZWQgdG8gcHJvdmlkZSB5b3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBoZXJlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUREX1JFU09VUkNFX0NMQVNTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLnV0aWwuRGVmYXVsdEFkZFJlc291cmNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgICAgICAKLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWaXJ0dWFsIHBhdGggaW4gdGhlIFVSTCB3aGljaCB0cmlnZ2VycyBsb2FkaW5nIG9mIHJlc291cmNlcyBmb3IgdGhlIE15RmFjZXMgZXh0ZW5kZWQgY29tcG9uZW50cwotICAgICAgICAgICAgaW4gdGhlIEV4dGVuc2lvbkZpbHRlci4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlJFU09VUkNFX1ZJUlRVQUxfUEFUSDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi9mYWNlcy9teUZhY2VzRXh0ZW5zaW9uUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgQ2hlY2sgaWYgdGhlIGV4dGVuc2lvbnMtZmlsdGVyIGhhcyBiZWVuIHByb3Blcmx5IGNvbmZpZ3VyZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DSEVDS19FWFRFTlNJT05TX0ZJTFRFUjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgRGVmaW5lIHBhcnRpYWwgc3RhdGUgc2F2aW5nIGFzIHRydWUvZmFsc2UuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlBBUlRJQUxfU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotCi0gICAgPCEtLSBMaXN0ZW5lciwgdG8gYWxsb3cgSmV0dHkgc2VydmluZyBNeUZhY2VzIGFwcHMgLS0+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLndlYmFwcC5TdGFydHVwU2VydmxldENvbnRleHRMaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+Ci0gICAgPC9saXN0ZW5lcj4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCAtLT4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICAgIDwvc2VydmxldD4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCBNYXBwaW5nIC0tPgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+Ki5qc2Y8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPCEtLSBXZWxjb21lIGZpbGVzIC0tPgotICAgIDx3ZWxjb21lLWZpbGUtbGlzdD4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5qc3A8L3dlbGNvbWUtZmlsZT4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+Ci0gICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KLQotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2V4YW1wbGVzL2xvZ2dpbmdfZXhhbXBsZS9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvbG9nZ2luZ19leGFtcGxlL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU0OWNiZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvbG9nZ2luZ19leGFtcGxlL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIzIj4KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9Im5hbWUiIHZhbHVlPSJQbGVhc2UgZW50ZXIgeW91ciBuYW1lIiAvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0ibmFtZSIgdmFsdWU9IiN7aGVsbG9Xb3JsZC5wZXJzb24ubmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0ibmFtZSIgc2hvd1N1bW1hcnk9ImZhbHNlIiBzaG93RGV0YWlsPSJ0cnVlIi8+Ci0KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJQcmVzcyBtZSIgYWN0aW9uPSIje2hlbGxvV29ybGQuc2VuZH0iLz4KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4KLSAgICAgICAgICAgICAgPC9oOnBhbmVsR3JpZD4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICA8L2Y6dmlldz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvbG9nZ2luZ19leGFtcGxlL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvbG9nZ2luZ19leGFtcGxlL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOWMyMjguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2V4YW1wbGVzL2xvZ2dpbmdfZXhhbXBsZS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08JUAgcGFnZSBzZXNzaW9uPSJmYWxzZSIlPgotPCUKLXJlc3BvbnNlLnNlbmRSZWRpcmVjdCgiaGVsbG9Xb3JsZC5qc2YiKTsKLSU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2V4YW1wbGVzL2xvZ2dpbmdfZXhhbXBsZS9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL2V4YW1wbGVzL2xvZ2dpbmdfZXhhbXBsZS9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTZjNzVmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9leGFtcGxlcy9sb2dnaW5nX2V4YW1wbGUvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgICAgPGgyPjxoOm91dHB1dFRleHQgdmFsdWU9IkhlbGxvICN7aGVsbG9Xb3JsZC5wZXJzb24ubmFtZX0uIFdlIGhvcGUgeW91IGVuam95IEFwYWNoZSBNeUZhY2VzIi8+PC9oMj4KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kTGluayBhY3Rpb249ImJhY2siPgotICAgICAgICAgICAgICAgICAgICA8aDpvdXRwdXRUZXh0IHZhbHVlPSJIb21lIi8+Ci0gICAgICAgICAgICAgICAgPC9oOmNvbW1hbmRMaW5rPgotICAgICAgICAgICAgPC9oOmZvcm0+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgIDwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvZXhhbXBsZXMvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9leGFtcGxlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTYyMTI1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9leGFtcGxlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgcHJvamVjdDwvbmFtZT4NCi0gICAgPHZlcnNpb24+JHtidWlsZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMi4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPG1vZHVsZXM+DQotICAgICAgICA8bW9kdWxlPmhlbGxvX3dvcmxkPC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPmxvZ2dpbmdfZXhhbXBsZTwvbW9kdWxlPg0KLSAgICA8L21vZHVsZXM+DQotDQotICAgIDxwcm9wZXJ0aWVzPg0KLSAgICAgICAgPHRyaW5pZGFkLnZlcnNpb24+MS4yLjg8L3RyaW5pZGFkLnZlcnNpb24+DQotICAgIDwvcHJvcGVydGllcz4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL29wdGlvbmFsLXN1cHBvcnQvbG9nZ2luZy9jb21tb25zLWxvZ2dpbmctc3VwcG9ydC9wb20ueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL29wdGlvbmFsLXN1cHBvcnQvbG9nZ2luZy9jb21tb25zLWxvZ2dpbmctc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWM1MzNhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9vcHRpb25hbC1zdXBwb3J0L2xvZ2dpbmcvY29tbW9ucy1sb2dnaW5nLXN1cHBvcnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmxvZ2dpbmctc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb21tb25zLWxvZ2dpbmctc3VwcG9ydDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBDb21tb25zLUxvZ2dpbmcgU3VwcG9ydCBNb2R1bGU8L25hbWU+DQotICAgIDx2ZXJzaW9uPiR7YnVpbGQudmVyc2lvbn08L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IubG9nZ2luZy1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5sb2dnaW5nLXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+JHtidWlsZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPg0KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+DQotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjE0PC92ZXJzaW9uPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgPC9yZXNvdXJjZXM+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL29wdGlvbmFsLXN1cHBvcnQvbG9nZ2luZy9jb21tb25zLWxvZ2dpbmctc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9vcHRpb25hbC1zdXBwb3J0L2xvZ2dpbmcvY29tbW9ucy1sb2dnaW5nLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNTJjM2IuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL29wdGlvbmFsLXN1cHBvcnQvbG9nZ2luZy9jb21tb25zLWxvZ2dpbmctc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiDQotICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjIiPg0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPg0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5zdXBwb3J0LmxvZ2dpbmcuc3RhcnR1cC5Db21tb25zTG9nZ2luZ01vZHVsZVN0YXJ0dXBMaXN0ZW5lcg0KLSAgICAgICAgPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL29wdGlvbmFsLXN1cHBvcnQvbG9nZ2luZy9jb21tb25zLWxvZ2dpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9zdXBwb3J0L2xvZ2dpbmcvY29tbW9ucy9DYWNoaW5nQ29tbW9uc0xvZ2dpbmdMb2dnZXJGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvb3B0aW9uYWwtc3VwcG9ydC9sb2dnaW5nL2NvbW1vbnMtbG9nZ2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3N1cHBvcnQvbG9nZ2luZy9jb21tb25zL0NhY2hpbmdDb21tb25zTG9nZ2luZ0xvZ2dlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwNTE4Ni4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvb3B0aW9uYWwtc3VwcG9ydC9sb2dnaW5nL2NvbW1vbnMtbG9nZ2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3N1cHBvcnQvbG9nZ2luZy9jb21tb25zL0NhY2hpbmdDb21tb25zTG9nZ2luZ0xvZ2dlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5zdXBwb3J0LmxvZ2dpbmcuY29tbW9uczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5sb2dnaW5nLkFic3RyYWN0TG9nZ2VyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubG9nZ2luZy5Mb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ2FjaGluZ0NvbW1vbnNMb2dnaW5nTG9nZ2VyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TG9nZ2VyRmFjdG9yeQ0KLXsNCi0gICAgcHJpdmF0ZSBNYXA8Q2xhc3MsIExvZz4gY2xhc3NUb0xvZ2dlck1hcHBpbmcgPSBuZXcgSGFzaE1hcDxDbGFzcywgTG9nPigpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgTG9nZ2VyIGNyZWF0ZUxvZ2dlcihDbGFzcyB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYoIXRoaXMuY2xhc3NUb0xvZ2dlck1hcHBpbmcuY29udGFpbnNLZXkodGFyZ2V0Q2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuY2xhc3NUb0xvZ2dlck1hcHBpbmcucHV0KHRhcmdldENsYXNzLCBMb2dGYWN0b3J5LmdldExvZyh0YXJnZXRDbGFzcykpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG5ldyBDb21tb25zTG9nZ2luZ0xvZ2dlckFkYXB0ZXIodGhpcy5jbGFzc1RvTG9nZ2VyTWFwcGluZy5nZXQodGFyZ2V0Q2xhc3MpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvb3B0aW9uYWwtc3VwcG9ydC9sb2dnaW5nL2NvbW1vbnMtbG9nZ2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3N1cHBvcnQvbG9nZ2luZy9jb21tb25zL0NvbW1vbnNMb2dnaW5nTG9nZ2VyQWRhcHRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL29wdGlvbmFsLXN1cHBvcnQvbG9nZ2luZy9jb21tb25zLWxvZ2dpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9zdXBwb3J0L2xvZ2dpbmcvY29tbW9ucy9Db21tb25zTG9nZ2luZ0xvZ2dlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJkNWE2Ni4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvb3B0aW9uYWwtc3VwcG9ydC9sb2dnaW5nL2NvbW1vbnMtbG9nZ2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3N1cHBvcnQvbG9nZ2luZy9jb21tb25zL0NvbW1vbnNMb2dnaW5nTG9nZ2VyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5zdXBwb3J0LmxvZ2dpbmcuY29tbW9uczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5sb2dnaW5nLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubG9nZ2luZy5MZXZlbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLkpkazE0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLkxvZzRKTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENvbW1vbnNMb2dnaW5nTG9nZ2VyQWRhcHRlciBpbXBsZW1lbnRzIExvZ2dlcg0KLXsNCi0gICAgcHJpdmF0ZSBMb2cgbG9nZ2VyOw0KLQ0KLSAgICBwdWJsaWMgQ29tbW9uc0xvZ2dpbmdMb2dnZXJBZGFwdGVyKExvZyBsb2dnZXIpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlciBpbnN0YW5jZW9mIExvZzRKTG9nZ2VyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyID0gbmV3IEV4dFZhbExvZzRKTG9nZ2VyKCgoTG9nNEpMb2dnZXIpbG9nZ2VyKS5nZXRMb2dnZXIoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihsb2dnZXIgaW5zdGFuY2VvZiBKZGsxNExvZ2dlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmxvZ2dlciA9IG5ldyBFeHRWYWxKZGsxNExvZ2dlcigoKEpkazE0TG9nZ2VyKWxvZ2dlcikuZ2V0TG9nZ2VyKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBsb2coTGV2ZWwgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBsb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGxvZyhMZXZlbCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpDQotICAgIHsNCi0gICAgICAgIHN3aXRjaCAobGV2ZWwpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2FzZSBUUkFDRToNCi0gICAgICAgICAgICAgICAgdHJhY2UobWVzc2FnZSwgdGhyb3dhYmxlKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBERUJVRzoNCi0gICAgICAgICAgICAgICAgZGVidWcobWVzc2FnZSwgdGhyb3dhYmxlKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBJTkZPOg0KLSAgICAgICAgICAgICAgICBpbmZvKG1lc3NhZ2UsIHRocm93YWJsZSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgV0FSTjoNCi0gICAgICAgICAgICAgICAgd2FybihtZXNzYWdlLCB0aHJvd2FibGUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIEVSUk9SOg0KLSAgICAgICAgICAgICAgICBlcnJvcihtZXNzYWdlLCB0aHJvd2FibGUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIEZBVEFMOg0KLSAgICAgICAgICAgICAgICBmYXRhbChtZXNzYWdlLCB0aHJvd2FibGUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cmFjZShTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aHJvd2FibGUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKG1lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShtZXNzYWdlLCB0aHJvd2FibGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgZGVidWcoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGhyb3dhYmxlID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhtZXNzYWdlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcobWVzc2FnZSwgdGhyb3dhYmxlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluZm8oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aHJvd2FibGUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8obWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8obWVzc2FnZSwgdGhyb3dhYmxlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHdhcm4oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aHJvd2FibGUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4obWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4obWVzc2FnZSwgdGhyb3dhYmxlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGVycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRocm93YWJsZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IobWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKG1lc3NhZ2UsIHRocm93YWJsZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBmYXRhbChTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNGYXRhbEVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aHJvd2FibGUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmZhdGFsKG1lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5mYXRhbChtZXNzYWdlLCB0aHJvd2FibGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvb3B0aW9uYWwtc3VwcG9ydC9sb2dnaW5nL2NvbW1vbnMtbG9nZ2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3N1cHBvcnQvbG9nZ2luZy9jb21tb25zL0V4dFZhbEpkazE0TG9nZ2VyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvb3B0aW9uYWwtc3VwcG9ydC9sb2dnaW5nL2NvbW1vbnMtbG9nZ2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3N1cHBvcnQvbG9nZ2luZy9jb21tb25zL0V4dFZhbEpkazE0TG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMWE3NzEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL29wdGlvbmFsLXN1cHBvcnQvbG9nZ2luZy9jb21tb25zLWxvZ2dpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9zdXBwb3J0L2xvZ2dpbmcvY29tbW9ucy9FeHRWYWxKZGsxNExvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5zdXBwb3J0LmxvZ2dpbmcuY29tbW9uczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotCi0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqIAotICogPHAvPgotICogb3JpZ2luYWwgaW1wbC4gd2l0aCBkaXJ0eSBoYWNrIHdhcyBpbXBsZW1lbnRlZCBieToKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNhbmRlcnNAYXBhY2hlLm9yZyI+U2NvdHQgU2FuZGVyczwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmJsb3JpdHNjaEBhcGFjaGUub3JnIj5CZXJpbiBMb3JpdHNjaDwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+UGV0ZXIgRG9uYWxkPC9hPgotICogQHZlcnNpb24gJFJldmlzaW9uOiA0MjQxMDcgJCAkRGF0ZTogMjAwNi0wNy0yMSAwMToxNTo0MiArMDIwMCAoRnIsIDIxIEp1bCAyMDA2KSAkCi0gKi8KLQotcHVibGljIGNsYXNzIEV4dFZhbEpkazE0TG9nZ2VyIGltcGxlbWVudHMgTG9nLCBTZXJpYWxpemFibGUKLXsKLQotICAgIC8qKgotICAgICAqIFRoaXMgbWVtYmVyIHZhcmlhYmxlIHNpbXBseSBlbnN1cmVzIHRoYXQgYW55IGF0dGVtcHQgdG8gaW5pdGlhbGlzZQotICAgICAqIHRoaXMgY2xhc3MgaW4gYSBwcmUtMS40IEpWTSB3aWxsIHJlc3VsdCBpbiBhbiBFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IuCi0gICAgICogSXQgbXVzdCBub3QgYmUgcHJpdmF0ZSwgYXMgYW4gb3B0aW1pc2luZyBjb21waWxlciBjb3VsZCBkZXRlY3QgdGhhdCBpdAotICAgICAqIGlzIG5vdCB1c2VkIGFuZCBvcHRpbWlzZSBpdCBhd2F5LgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTGV2ZWwgRFVNTVlfTEVWRUwgPSBMZXZlbC5GSU5FOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCi0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5hbWVkIGluc3RhbmNlIG9mIHRoaXMgTG9nZ2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgbG9nZ2VyIHRvIGJlIGNvbnN0cnVjdGVkCi0gICAgICovCi0gICAgcHVibGljIEV4dFZhbEpkazE0TG9nZ2VyKFN0cmluZyBuYW1lKQotICAgIHsKLQotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICBsb2dnZXIgPSBnZXRMb2dnZXIoKTsKLQotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcwotCi0KLSAgICAvKioKLSAgICAgKiBUaGUgdW5kZXJseWluZyBMb2dnZXIgaW1wbGVtZW50YXRpb24gd2UgYXJlIHVzaW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgTG9nZ2VyIGxvZ2dlciA9IG51bGw7Ci0KLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBsb2dnZXIgd2UgYXJlIHdyYXBwaW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IG51bGw7Ci0KLQotICAgIC8qKgotICAgICAqIGN1c3RvbWl6ZWQgbWV0aG9kCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGxvZyhMZXZlbCBsZXZlbCwgU3RyaW5nIG1zZywgVGhyb3dhYmxlIGV4KQotICAgIHsKLQotICAgICAgICBMb2dnZXIgbG9nZ2VyID0gZ2V0TG9nZ2VyKCk7Ci0gICAgICAgIGlmIChsb2dnZXIuaXNMb2dnYWJsZShsZXZlbCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vY3VzdG9taXplZDoKLSAgICAgICAgICAgIFRocm93YWJsZSBkdW1teUV4Y2VwdGlvbiA9IG5ldyBUaHJvd2FibGUoKTsKLSAgICAgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50IGxvY2F0aW9uc1tdID0gZHVtbXlFeGNlcHRpb24uZ2V0U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgLy8gQ2FsbGVyIHdpbGwgYmUgdGhlIHRoaXJkIGVsZW1lbnQKLSAgICAgICAgICAgIFN0cmluZyBjbmFtZSA9ICJ1bmtub3duIjsKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QgPSAidW5rbm93biI7Ci0gICAgICAgICAgICBpZiAobG9jYXRpb25zICE9IG51bGwgJiYgbG9jYXRpb25zLmxlbmd0aCA+IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gY2FsbGVyID0gZXh0cmFjdENhbGxlcihsb2NhdGlvbnMpOwotICAgICAgICAgICAgICAgIGNuYW1lID0gY2FsbGVyWzBdOwotICAgICAgICAgICAgICAgIG1ldGhvZCA9IGNhbGxlclsxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChleCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5sb2dwKGxldmVsLCBjbmFtZSwgbWV0aG9kLCBtc2cpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5sb2dwKGxldmVsLCBjbmFtZSwgbWV0aG9kLCBtc2csIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogbmV3IG1ldGhvZCBmb3IgZXh0dmFsCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBleHRyYWN0Q2FsbGVyKFN0YWNrVHJhY2VFbGVtZW50W10gbG9jYXRpb25zKQotICAgIHsKLSAgICAgICAgQ2xhc3MgY2xhc3NUb1Rlc3Q7Ci0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUodGhpcy5sb2dnZXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgU3RyaW5nIHJlc3VsdFtdID0gbmV3IFN0cmluZ1syXTsKLQotICAgICAgICAvL2ZhbGxiYWNrICg9IG9yaWdpbmFsIGhhY2sgb2YgY29tbW9ucyBsb2dnaW5nKQotICAgICAgICByZXN1bHRbMF0gPSBsb2NhdGlvbnNbMl0uZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgICAgIHJlc3VsdFsxXSA9IGxvY2F0aW9uc1syXS5nZXRNZXRob2ROYW1lKCk7Ci0KLSAgICAgICAgLy9uYW1lIGlzIG5vIGNsYXNzIG5hbWUgLT4gdXNlIGZhbGxiYWNrIG9mIHRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbgotICAgICAgICBpZih0YXJnZXRDbGFzcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogdGhlIHJlc3QgaXMgdG8gZmluZCB0aGUgY2FsbGVkIG1ldGhvZAotICAgICAgICAgKi8KLQotICAgICAgICAvKgotICAgICAgICAgKiBzaG9ydGN1dCBpZiBMb2dVdGlscyBhcmUgdXNlZAotICAgICAgICAgKi8KLSAgICAgICAgY2xhc3NUb1Rlc3QgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShsb2NhdGlvbnNbNl0uZ2V0Q2xhc3NOYW1lKCkpOwotCi0gICAgICAgIC8vbW9zdCBjb21tb24gY2FzZTogTG9nVXRpbHMgYW5kIHRoZXJlIGlzIG5vIGV4Y2VwdGlvbiB0byBsb2cKLSAgICAgICAgaWYoY2xhc3NUb1Rlc3QgIT0gbnVsbCAmJiBjbGFzc1RvVGVzdC5pc0Fzc2lnbmFibGVGcm9tKHRhcmdldENsYXNzKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0WzBdID0gbG9jYXRpb25zWzZdLmdldENsYXNzTmFtZSgpOwotICAgICAgICAgICAgcmVzdWx0WzFdID0gbG9jYXRpb25zWzZdLmdldE1ldGhvZE5hbWUoKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBjbGFzc1RvVGVzdCA9IENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKGxvY2F0aW9uc1s1XS5nZXRDbGFzc05hbWUoKSk7Ci0KLSAgICAgICAgLy9jb21tb24gY2FzZTogTG9nVXRpbHMgYW5kIHRoZXJlIGlzIGFuIGV4Y2VwdGlvbiB0byBsb2cKLSAgICAgICAgaWYoY2xhc3NUb1Rlc3QgIT0gbnVsbCAmJiBjbGFzc1RvVGVzdC5pc0Fzc2lnbmFibGVGcm9tKHRhcmdldENsYXNzKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0WzBdID0gbG9jYXRpb25zWzVdLmdldENsYXNzTmFtZSgpOwotICAgICAgICAgICAgcmVzdWx0WzFdID0gbG9jYXRpb25zWzVdLmdldE1ldGhvZE5hbWUoKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiB1bmNvbW1vbiBjYXNlOiBMb2dVdGlscyBhcmVuJ3QgdXNlZCAtPiB1c2UgYSBnZW5lcmljIGFwcHJvYWNoIHRvIGZpbmQgdGhlIG1ldGhvZCBuYW1lCi0gICAgICAgICAqLwotCi0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgZm9yIChTdGFja1RyYWNlRWxlbWVudCBzdGFja1RyYWNlRWxlbWVudCA6IGxvY2F0aW9ucykKLSAgICAgICAgewotICAgICAgICAgICAgY2xhc3NUb1Rlc3QgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShzdGFja1RyYWNlRWxlbWVudC5nZXRDbGFzc05hbWUoKSk7Ci0KLSAgICAgICAgICAgIGlmKGNsYXNzVG9UZXN0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKGNsYXNzVG9UZXN0LmlzQXNzaWduYWJsZUZyb20odGFyZ2V0Q2xhc3MpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdFswXSA9IGxvY2F0aW9uc1tpXS5nZXRDbGFzc05hbWUoKTsKLSAgICAgICAgICAgICAgICByZXN1bHRbMV0gPSBsb2NhdGlvbnNbaV0uZ2V0TWV0aG9kTmFtZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHRbMV0gPSAidW5rbm93biI7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9ncyBhIG1lc3NhZ2Ugd2l0aCA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5GSU5FPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRvIGxvZwotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nI2RlYnVnKE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWJ1ZyhPYmplY3QgbWVzc2FnZSkKLSAgICB7Ci0gICAgICAgIGxvZyhMZXZlbC5GSU5FLCBTdHJpbmcudmFsdWVPZihtZXNzYWdlKSwgbnVsbCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIDxjb2RlPmphdmEudXRpbC5sb2dnaW5nLkxldmVsLkZJTkU8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgICB0byBsb2cKLSAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIGxvZyB0aGlzIGNhdXNlCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cjZGVidWcoT2JqZWN0LCBUaHJvd2FibGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVidWcoT2JqZWN0IG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pCi0gICAgewotICAgICAgICBsb2coTGV2ZWwuRklORSwgU3RyaW5nLnZhbHVlT2YobWVzc2FnZSksIGV4Y2VwdGlvbik7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIDxjb2RlPmphdmEudXRpbC5sb2dnaW5nLkxldmVsLlNFVkVSRTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0byBsb2cKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyNlcnJvcihPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXJyb3IoT2JqZWN0IG1lc3NhZ2UpCi0gICAgewotICAgICAgICBsb2coTGV2ZWwuU0VWRVJFLCBTdHJpbmcudmFsdWVPZihtZXNzYWdlKSwgbnVsbCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIDxjb2RlPmphdmEudXRpbC5sb2dnaW5nLkxldmVsLlNFVkVSRTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSAgIHRvIGxvZwotICAgICAqIEBwYXJhbSBleGNlcHRpb24gbG9nIHRoaXMgY2F1c2UKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyNlcnJvcihPYmplY3QsIFRocm93YWJsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlcnJvcihPYmplY3QgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICAgIGxvZyhMZXZlbC5TRVZFUkUsIFN0cmluZy52YWx1ZU9mKG1lc3NhZ2UpLCBleGNlcHRpb24pOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogTG9ncyBhIG1lc3NhZ2Ugd2l0aCA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5TRVZFUkU8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdG8gbG9nCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cjZmF0YWwoT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZhdGFsKE9iamVjdCBtZXNzYWdlKQotICAgIHsKLSAgICAgICAgbG9nKExldmVsLlNFVkVSRSwgU3RyaW5nLnZhbHVlT2YobWVzc2FnZSksIG51bGwpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogTG9ncyBhIG1lc3NhZ2Ugd2l0aCA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5TRVZFUkU8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgICB0byBsb2cKLSAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIGxvZyB0aGlzIGNhdXNlCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cjZmF0YWwoT2JqZWN0LCBUaHJvd2FibGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmF0YWwoT2JqZWN0IG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pCi0gICAgewotICAgICAgICBsb2coTGV2ZWwuU0VWRVJFLCBTdHJpbmcudmFsdWVPZihtZXNzYWdlKSwgZXhjZXB0aW9uKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgbmF0aXZlIExvZ2dlciBpbnN0YW5jZSB3ZSBhcmUgdXNpbmcuCi0gICAgICovCi0gICAgcHVibGljIExvZ2dlciBnZXRMb2dnZXIoKQotICAgIHsKLSAgICAgICAgaWYgKGxvZ2dlciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAobG9nZ2VyKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIExvZ3MgYSBtZXNzYWdlIHdpdGggPGNvZGU+amF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwuSU5GTzwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0byBsb2cKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyNpbmZvKE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbmZvKE9iamVjdCBtZXNzYWdlKQotICAgIHsKLSAgICAgICAgbG9nKExldmVsLklORk8sIFN0cmluZy52YWx1ZU9mKG1lc3NhZ2UpLCBudWxsKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIExvZ3MgYSBtZXNzYWdlIHdpdGggPGNvZGU+amF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwuSU5GTzwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSAgIHRvIGxvZwotICAgICAqIEBwYXJhbSBleGNlcHRpb24gbG9nIHRoaXMgY2F1c2UKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyNpbmZvKE9iamVjdCwgVGhyb3dhYmxlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluZm8oT2JqZWN0IG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pCi0gICAgewotICAgICAgICBsb2coTGV2ZWwuSU5GTywgU3RyaW5nLnZhbHVlT2YobWVzc2FnZSksIGV4Y2VwdGlvbik7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBJcyBkZWJ1ZyBsb2dnaW5nIGN1cnJlbnRseSBlbmFibGVkPwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGVidWdFbmFibGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoZ2V0TG9nZ2VyKCkuaXNMb2dnYWJsZShMZXZlbC5GSU5FKSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBJcyBlcnJvciBsb2dnaW5nIGN1cnJlbnRseSBlbmFibGVkPwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRXJyb3JFbmFibGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoZ2V0TG9nZ2VyKCkuaXNMb2dnYWJsZShMZXZlbC5TRVZFUkUpKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIElzIGZhdGFsIGxvZ2dpbmcgY3VycmVudGx5IGVuYWJsZWQ/Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNGYXRhbEVuYWJsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChnZXRMb2dnZXIoKS5pc0xvZ2dhYmxlKExldmVsLlNFVkVSRSkpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogSXMgaW5mbyBsb2dnaW5nIGN1cnJlbnRseSBlbmFibGVkPwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSW5mb0VuYWJsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChnZXRMb2dnZXIoKS5pc0xvZ2dhYmxlKExldmVsLklORk8pKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIElzIHRyYWNlIGxvZ2dpbmcgY3VycmVudGx5IGVuYWJsZWQ/Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNUcmFjZUVuYWJsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChnZXRMb2dnZXIoKS5pc0xvZ2dhYmxlKExldmVsLkZJTkVTVCkpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogSXMgd2FybiBsb2dnaW5nIGN1cnJlbnRseSBlbmFibGVkPwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzV2FybkVuYWJsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChnZXRMb2dnZXIoKS5pc0xvZ2dhYmxlKExldmVsLldBUk5JTkcpKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIExvZ3MgYSBtZXNzYWdlIHdpdGggPGNvZGU+amF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwuRklORVNUPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRvIGxvZwotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nI3RyYWNlKE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0cmFjZShPYmplY3QgbWVzc2FnZSkKLSAgICB7Ci0gICAgICAgIGxvZyhMZXZlbC5GSU5FU1QsIFN0cmluZy52YWx1ZU9mKG1lc3NhZ2UpLCBudWxsKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIExvZ3MgYSBtZXNzYWdlIHdpdGggPGNvZGU+amF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwuRklORVNUPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlICAgdG8gbG9nCi0gICAgICogQHBhcmFtIGV4Y2VwdGlvbiBsb2cgdGhpcyBjYXVzZQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nI3RyYWNlKE9iamVjdCwgVGhyb3dhYmxlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRyYWNlKE9iamVjdCBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKQotICAgIHsKLSAgICAgICAgbG9nKExldmVsLkZJTkVTVCwgU3RyaW5nLnZhbHVlT2YobWVzc2FnZSksIGV4Y2VwdGlvbik7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIDxjb2RlPmphdmEudXRpbC5sb2dnaW5nLkxldmVsLldBUk5JTkc8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdG8gbG9nCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cjd2FybihPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2FybihPYmplY3QgbWVzc2FnZSkKLSAgICB7Ci0gICAgICAgIGxvZyhMZXZlbC5XQVJOSU5HLCBTdHJpbmcudmFsdWVPZihtZXNzYWdlKSwgbnVsbCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIDxjb2RlPmphdmEudXRpbC5sb2dnaW5nLkxldmVsLldBUk5JTkc8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgICB0byBsb2cKLSAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIGxvZyB0aGlzIGNhdXNlCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cjd2FybihPYmplY3QsIFRocm93YWJsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3YXJuKE9iamVjdCBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKQotICAgIHsKLSAgICAgICAgbG9nKExldmVsLldBUk5JTkcsIFN0cmluZy52YWx1ZU9mKG1lc3NhZ2UpLCBleGNlcHRpb24pOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvb3B0aW9uYWwtc3VwcG9ydC9sb2dnaW5nL2NvbW1vbnMtbG9nZ2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3N1cHBvcnQvbG9nZ2luZy9jb21tb25zL0V4dFZhbExvZzRKTG9nZ2VyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvb3B0aW9uYWwtc3VwcG9ydC9sb2dnaW5nL2NvbW1vbnMtbG9nZ2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3N1cHBvcnQvbG9nZ2luZy9jb21tb25zL0V4dFZhbExvZzRKTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlN2E0NWQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL29wdGlvbmFsLXN1cHBvcnQvbG9nZ2luZy9jb21tb25zLWxvZ2dpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9zdXBwb3J0L2xvZ2dpbmcvY29tbW9ucy9FeHRWYWxMb2c0SkxvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5zdXBwb3J0LmxvZ2dpbmcuY29tbW9uczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5MZXZlbDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Mb2dVdGlsczsKLQotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKgotICogb3JpZ2luYWwgaW1wbC4gYnk6Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzYW5kZXJzQGFwYWNoZS5vcmciPlNjb3R0IFNhbmRlcnM8L2E+Ci0gKiBAYXV0aG9yIFJvZCBXYWxkaG9mZgotICogQGF1dGhvciBSb2JlcnQgQnVycmVsbCBEb25raW4KLSAqIEB2ZXJzaW9uICRJZDogTG9nNEpMb2dnZXIuamF2YSA0Nzk3NDcgMjAwNi0xMS0yNyAyMDoxNTowMVogZGVubmlzbCAkCi0gKi8KLQotcHVibGljIGNsYXNzIEV4dFZhbExvZzRKTG9nZ2VyIGltcGxlbWVudHMgTG9nLCBTZXJpYWxpemFibGUKLXsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXR0cmlidXRlcwotCi0gICAgLyoqCi0gICAgICogVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBMb2c0SkxvZ2dlciBjbGFzcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlFDTiA9IExvZ1V0aWxzLmNsYXNzLmdldE5hbWUoKTsgLy9jdXN0b21pemVkIGZvciBleHR2YWwKLQotICAgIC8qKgotICAgICAqIExvZyB0byB0aGlzIGxvZ2dlcgotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IExvZ2dlciBsb2dnZXIgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogTG9nZ2VyIG5hbWUKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKLQotICAgIHByaXZhdGUgc3RhdGljIFByaW9yaXR5IHRyYWNlTGV2ZWw7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBTdGF0aWMgSW5pdGlhbGl6ZXIuCi0gICAgLy8KLSAgICAvLyBOb3RlIHRoYXQgdGhpcyBtdXN0IGNvbWUgYWZ0ZXIgdGhlIHN0YXRpYyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMKLSAgICAvLyBvdGhlcndpc2UgaW5pdGlhbGlzZXIgZXhwcmVzc2lvbnMgYXNzb2NpYXRlZCB3aXRoIHRob3NlIHZhcmlhYmxlcwotICAgIC8vIHdpbGwgb3ZlcnJpZGUgYW55IHNldHRpbmdzIGRvbmUgaGVyZS4KLSAgICAvLwotICAgIC8vIFZlcmlmeSB0aGF0IGxvZzRqIGlzIGF2YWlsYWJsZSwgYW5kIHRoYXQgaXQgaXMgdmVyc2lvbiAxLjIuCi0gICAgLy8gSWYgYW4gRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yIGlzIGdlbmVyYXRlZCwgdGhlbiBMb2dGYWN0b3J5SW1wbAotICAgIC8vIHdpbGwgdHJlYXQgdGhhdCBhcyBtZWFuaW5nIHRoYXQgdGhlIGFwcHJvcHJpYXRlIHVuZGVybHlpbmcgbG9nZ2luZwotICAgIC8vIGxpYnJhcnkgaXMganVzdCBub3QgcHJlc2VudCAtIGlmIGRpc2NvdmVyeSBpcyBpbiBwcm9ncmVzcyB0aGVuCi0gICAgLy8gZGlzY292ZXJ5IHdpbGwgY29udGludWUuCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIGlmICghUHJpb3JpdHkuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShMZXZlbC5jbGFzcykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIG5vcGUsIHRoaXMgaXMgbG9nNGogMS4zLCBzbyBmb3JjZSBhbiBFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXJyb3IoIkxvZzRKIDEuMiBub3QgYXZhaWxhYmxlIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWxlYXNlcyBvZiBsb2c0ajEuMiA+PSAxLjIuMTIgaGF2ZSBQcmlvcml0eS5UUkFDRSBhdmFpbGFibGUsIGVhcmxpZXIKLSAgICAgICAgLy8gdmVyc2lvbnMgZG8gbm90LiBJZiBUUkFDRSBpcyBub3QgYXZhaWxhYmxlLCB0aGVuIHdlIGhhdmUgdG8gbWFwCi0gICAgICAgIC8vIGNhbGxzIHRvIExvZy50cmFjZSguLi4pIG9udG8gdGhlIERFQlVHIGxldmVsLgotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB0cmFjZUxldmVsID0gKFByaW9yaXR5KSBMZXZlbC5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJUUkFDRSIpLmdldChudWxsKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBvaywgdHJhY2Ugbm90IGF2YWlsYWJsZQotICAgICAgICAgICAgdHJhY2VMZXZlbCA9IFByaW9yaXR5LkRFQlVHOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCi0KLSAgICBwdWJsaWMgRXh0VmFsTG9nNEpMb2dnZXIoKQotICAgIHsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEJhc2UgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIEV4dFZhbExvZzRKTG9nZ2VyKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy5sb2dnZXIgPSBnZXRMb2dnZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgdXNlIHdpdGggYSBsb2c0aiBmYWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyBFeHRWYWxMb2c0SkxvZ2dlcihMb2dnZXIgbG9nZ2VyKQotICAgIHsKLSAgICAgICAgaWYgKGxvZ2dlciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJXYXJuaW5nIC0gbnVsbCBsb2dnZXIgaW4gY29uc3RydWN0b3I7IHBvc3NpYmxlIGxvZzRqIG1pc2NvbmZpZ3VyYXRpb24uIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5uYW1lID0gbG9nZ2VyLmdldE5hbWUoKTsKLSAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gSW1wbGVtZW50YXRpb24KLSAgICAvLwotICAgIC8vIE5vdGUgdGhhdCBpbiB0aGUgbWV0aG9kcyBiZWxvdyB0aGUgUHJpb3JpdHkgY2xhc3MgaXMgdXNlZCB0byBkZWZpbmUKLSAgICAvLyBsZXZlbHMgZXZlbiB0aG91Z2ggdGhlIExldmVsIGNsYXNzIGlzIHN1cHBvcnRlZCBpbiAxLjIuIFRoaXMgaXMgZG9uZQotICAgIC8vIHNvIHRoYXQgYXQgY29tcGlsZSB0aW1lIHRoZSBjYWxsIGRlZmluaXRlbHkgcmVzb2x2ZXMgdG8gYSBjYWxsIHRvCi0gICAgLy8gYSBtZXRob2QgdGhhdCB0YWtlcyBhIFByaW9yaXR5IHJhdGhlciB0aGFuIG9uZSB0aGF0IHRha2VzIGEgTGV2ZWwuCi0gICAgLy8KLSAgICAvLyBUaGUgQ2F0ZWdvcnkgY2xhc3MgKGFuZCBoZW5jZSBpdHMgc3ViY2xhc3MgTG9nZ2VyKSBpbiB2ZXJzaW9uIDEuMiBvbmx5Ci0gICAgLy8gaGFzIG1ldGhvZHMgdGhhdCB0YWtlIFByaW9yaXR5IG9iamVjdHMuIFRoZSBDYXRlZ29yeSBjbGFzcyAoYW5kIGhlbmNlCi0gICAgLy8gTG9nZ2VyIGNsYXNzKSBpbiB2ZXJzaW9uIDEuMyBoYXMgbWV0aG9kcyB0aGF0IHRha2UgYm90aCBQcmlvcml0eSBhbmQKLSAgICAvLyBMZXZlbCBvYmplY3RzLiBUaGlzIG1lYW5zIHRoYXQgaWYgd2UgdXNlIExldmVsIGhlcmUsIGFuZCBjb21waWxlCi0gICAgLy8gYWdhaW5zdCBsb2c0aiAxLjMgdGhlbiBjYWxscyB3b3VsZCBiZSBib3VuZCB0byB0aGUgdmVyc2lvbnMgb2YKLSAgICAvLyBtZXRob2RzIHRha2luZyBMZXZlbCBvYmplY3RzIGFuZCB0aGVuIHdvdWxkIGZhaWwgdG8gcnVuIGFnYWluc3QKLSAgICAvLyB2ZXJzaW9uIDEuMiBvZiBsb2c0ai4KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0gICAgLyoqCi0gICAgICogTG9ncyBhIG1lc3NhZ2Ugd2l0aCA8Y29kZT5vcmcuYXBhY2hlLmxvZzRqLlByaW9yaXR5LlRSQUNFPC9jb2RlPi4KLSAgICAgKiBXaGVuIHVzaW5nIGEgbG9nNGogdmVyc2lvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhlIDxjb2RlPlRSQUNFPC9jb2RlPgotICAgICAqIGxldmVsLCB0aGUgbWVzc2FnZSB3aWxsIGJlIGxvZ2dlZCBhdCB0aGUgPGNvZGU+REVCVUc8L2NvZGU+IGxldmVsLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdG8gbG9nCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cjdHJhY2UoT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRyYWNlKE9iamVjdCBtZXNzYWdlKQotICAgIHsKLSAgICAgICAgZ2V0TG9nZ2VyKCkubG9nKEZRQ04sIHRyYWNlTGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogTG9ncyBhIG1lc3NhZ2Ugd2l0aCA8Y29kZT5vcmcuYXBhY2hlLmxvZzRqLlByaW9yaXR5LlRSQUNFPC9jb2RlPi4KLSAgICAgKiBXaGVuIHVzaW5nIGEgbG9nNGogdmVyc2lvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhlIDxjb2RlPlRSQUNFPC9jb2RlPgotICAgICAqIGxldmVsLCB0aGUgbWVzc2FnZSB3aWxsIGJlIGxvZ2dlZCBhdCB0aGUgPGNvZGU+REVCVUc8L2NvZGU+IGxldmVsLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdG8gbG9nCi0gICAgICogQHBhcmFtIHQgICAgICAgbG9nIHRoaXMgY2F1c2UKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyN0cmFjZShPYmplY3QsIFRocm93YWJsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0cmFjZShPYmplY3QgbWVzc2FnZSwgVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgICBnZXRMb2dnZXIoKS5sb2coRlFDTiwgdHJhY2VMZXZlbCwgbWVzc2FnZSwgdCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIDxjb2RlPm9yZy5hcGFjaGUubG9nNGouUHJpb3JpdHkuREVCVUc8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdG8gbG9nCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cjZGVidWcoT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlYnVnKE9iamVjdCBtZXNzYWdlKQotICAgIHsKLSAgICAgICAgZ2V0TG9nZ2VyKCkubG9nKEZRQ04sIFByaW9yaXR5LkRFQlVHLCBtZXNzYWdlLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIDxjb2RlPm9yZy5hcGFjaGUubG9nNGouUHJpb3JpdHkuREVCVUc8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdG8gbG9nCi0gICAgICogQHBhcmFtIHQgICAgICAgbG9nIHRoaXMgY2F1c2UKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyNkZWJ1ZyhPYmplY3QsIFRocm93YWJsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWJ1ZyhPYmplY3QgbWVzc2FnZSwgVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgICBnZXRMb2dnZXIoKS5sb2coRlFDTiwgUHJpb3JpdHkuREVCVUcsIG1lc3NhZ2UsIHQpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogTG9ncyBhIG1lc3NhZ2Ugd2l0aCA8Y29kZT5vcmcuYXBhY2hlLmxvZzRqLlByaW9yaXR5LklORk88L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdG8gbG9nCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cjaW5mbyhPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5mbyhPYmplY3QgbWVzc2FnZSkKLSAgICB7Ci0gICAgICAgIGdldExvZ2dlcigpLmxvZyhGUUNOLCBQcmlvcml0eS5JTkZPLCBtZXNzYWdlLCBudWxsKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIExvZ3MgYSBtZXNzYWdlIHdpdGggPGNvZGU+b3JnLmFwYWNoZS5sb2c0ai5Qcmlvcml0eS5JTkZPPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRvIGxvZwotICAgICAqIEBwYXJhbSB0ICAgICAgIGxvZyB0aGlzIGNhdXNlCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cjaW5mbyhPYmplY3QsIFRocm93YWJsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbmZvKE9iamVjdCBtZXNzYWdlLCBUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICAgIGdldExvZ2dlcigpLmxvZyhGUUNOLCBQcmlvcml0eS5JTkZPLCBtZXNzYWdlLCB0KTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIExvZ3MgYSBtZXNzYWdlIHdpdGggPGNvZGU+b3JnLmFwYWNoZS5sb2c0ai5Qcmlvcml0eS5XQVJOPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRvIGxvZwotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nI3dhcm4oT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdhcm4oT2JqZWN0IG1lc3NhZ2UpCi0gICAgewotICAgICAgICBnZXRMb2dnZXIoKS5sb2coRlFDTiwgUHJpb3JpdHkuV0FSTiwgbWVzc2FnZSwgbnVsbCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIDxjb2RlPm9yZy5hcGFjaGUubG9nNGouUHJpb3JpdHkuV0FSTjwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0byBsb2cKLSAgICAgKiBAcGFyYW0gdCAgICAgICBsb2cgdGhpcyBjYXVzZQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nI3dhcm4oT2JqZWN0LCBUaHJvd2FibGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2FybihPYmplY3QgbWVzc2FnZSwgVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgICBnZXRMb2dnZXIoKS5sb2coRlFDTiwgUHJpb3JpdHkuV0FSTiwgbWVzc2FnZSwgdCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIDxjb2RlPm9yZy5hcGFjaGUubG9nNGouUHJpb3JpdHkuRVJST1I8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdG8gbG9nCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cjZXJyb3IoT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVycm9yKE9iamVjdCBtZXNzYWdlKQotICAgIHsKLSAgICAgICAgZ2V0TG9nZ2VyKCkubG9nKEZRQ04sIFByaW9yaXR5LkVSUk9SLCBtZXNzYWdlLCBudWxsKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIExvZ3MgYSBtZXNzYWdlIHdpdGggPGNvZGU+b3JnLmFwYWNoZS5sb2c0ai5Qcmlvcml0eS5FUlJPUjwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0byBsb2cKLSAgICAgKiBAcGFyYW0gdCAgICAgICBsb2cgdGhpcyBjYXVzZQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nI2Vycm9yKE9iamVjdCwgVGhyb3dhYmxlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVycm9yKE9iamVjdCBtZXNzYWdlLCBUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICAgIGdldExvZ2dlcigpLmxvZyhGUUNOLCBQcmlvcml0eS5FUlJPUiwgbWVzc2FnZSwgdCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIDxjb2RlPm9yZy5hcGFjaGUubG9nNGouUHJpb3JpdHkuRkFUQUw8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdG8gbG9nCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cjZmF0YWwoT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZhdGFsKE9iamVjdCBtZXNzYWdlKQotICAgIHsKLSAgICAgICAgZ2V0TG9nZ2VyKCkubG9nKEZRQ04sIFByaW9yaXR5LkZBVEFMLCBtZXNzYWdlLCBudWxsKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIExvZ3MgYSBtZXNzYWdlIHdpdGggPGNvZGU+b3JnLmFwYWNoZS5sb2c0ai5Qcmlvcml0eS5GQVRBTDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0byBsb2cKLSAgICAgKiBAcGFyYW0gdCAgICAgICBsb2cgdGhpcyBjYXVzZQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nI2ZhdGFsKE9iamVjdCwgVGhyb3dhYmxlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZhdGFsKE9iamVjdCBtZXNzYWdlLCBUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICAgIGdldExvZ2dlcigpLmxvZyhGUUNOLCBQcmlvcml0eS5GQVRBTCwgbWVzc2FnZSwgdCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG5hdGl2ZSBMb2dnZXIgaW5zdGFuY2Ugd2UgYXJlIHVzaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBMb2dnZXIgZ2V0TG9nZ2VyKCkKLSAgICB7Ci0gICAgICAgIGlmIChsb2dnZXIgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihuYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKHRoaXMubG9nZ2VyKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIExvZzRqIExvZ2dlciB1c2VkIGlzIGVuYWJsZWQgZm9yIDxjb2RlPkRFQlVHPC9jb2RlPiBwcmlvcml0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlYnVnRW5hYmxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIExvZzRqIExvZ2dlciB1c2VkIGlzIGVuYWJsZWQgZm9yIDxjb2RlPkVSUk9SPC9jb2RlPiBwcmlvcml0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Vycm9yRW5hYmxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TG9nZ2VyKCkuaXNFbmFibGVkRm9yKFByaW9yaXR5LkVSUk9SKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIExvZzRqIExvZ2dlciB1c2VkIGlzIGVuYWJsZWQgZm9yIDxjb2RlPkZBVEFMPC9jb2RlPiBwcmlvcml0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhdGFsRW5hYmxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TG9nZ2VyKCkuaXNFbmFibGVkRm9yKFByaW9yaXR5LkZBVEFMKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIExvZzRqIExvZ2dlciB1c2VkIGlzIGVuYWJsZWQgZm9yIDxjb2RlPklORk88L2NvZGU+IHByaW9yaXR5LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSW5mb0VuYWJsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldExvZ2dlcigpLmlzSW5mb0VuYWJsZWQoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIExvZzRqIExvZ2dlciB1c2VkIGlzIGVuYWJsZWQgZm9yIDxjb2RlPlRSQUNFPC9jb2RlPiBwcmlvcml0eS4KLSAgICAgKiBXaGVuIHVzaW5nIGEgbG9nNGogdmVyc2lvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhlIFRSQUNFIGxldmVsLCB0aGlzIGNhbGwKLSAgICAgKiB3aWxsIHJlcG9ydCB3aGV0aGVyIDxjb2RlPkRFQlVHPC9jb2RlPiBpcyBlbmFibGVkIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RyYWNlRW5hYmxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TG9nZ2VyKCkuaXNFbmFibGVkRm9yKHRyYWNlTGV2ZWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIExvZzRqIExvZ2dlciB1c2VkIGlzIGVuYWJsZWQgZm9yIDxjb2RlPldBUk48L2NvZGU+IHByaW9yaXR5LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzV2FybkVuYWJsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldExvZ2dlcigpLmlzRW5hYmxlZEZvcihQcmlvcml0eS5XQVJOKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvb3B0aW9uYWwtc3VwcG9ydC9sb2dnaW5nL2NvbW1vbnMtbG9nZ2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3N1cHBvcnQvbG9nZ2luZy9zdGFydHVwL0NvbW1vbnNMb2dnaW5nTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvb3B0aW9uYWwtc3VwcG9ydC9sb2dnaW5nL2NvbW1vbnMtbG9nZ2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3N1cHBvcnQvbG9nZ2luZy9zdGFydHVwL0NvbW1vbnNMb2dnaW5nTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MTFiY2UuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL29wdGlvbmFsLXN1cHBvcnQvbG9nZ2luZy9jb21tb25zLWxvZ2dpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9zdXBwb3J0L2xvZ2dpbmcvc3RhcnR1cC9Db21tb25zTG9nZ2luZ01vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnN1cHBvcnQubG9nZ2luZy5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkFic3RyYWN0U3RhcnR1cExpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5sb2dnaW5nLkFic3RyYWN0TG9nZ2VyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5zdXBwb3J0LmxvZ2dpbmcuY29tbW9ucy5DYWNoaW5nQ29tbW9uc0xvZ2dpbmdMb2dnZXJGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIGFsdGVybmF0aXZlIGFwcHJvYWNoIGZvciBFeHRWYWxSZW5kZXJLaXRGYWN0b3J5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ29tbW9uc0xvZ2dpbmdNb2R1bGVTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTE9HR0VSX0ZBQ1RPUlksIEFic3RyYWN0TG9nZ2VyRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLnNldEN1c3RvbUxvZ2dlckZhY3RvcnkobmV3IENhY2hpbmdDb21tb25zTG9nZ2luZ0xvZ2dlckZhY3RvcnkoKSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL29wdGlvbmFsLXN1cHBvcnQvbG9nZ2luZy9jb21tb25zLWxvZ2dpbmctc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvb3B0aW9uYWwtc3VwcG9ydC9sb2dnaW5nL2NvbW1vbnMtbG9nZ2luZy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvb3B0aW9uYWwtc3VwcG9ydC9sb2dnaW5nL2NvbW1vbnMtbG9nZ2luZy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL29wdGlvbmFsLXN1cHBvcnQvbG9nZ2luZy9jb21tb25zLWxvZ2dpbmctc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9vcHRpb25hbC1zdXBwb3J0L2xvZ2dpbmcvY29tbW9ucy1sb2dnaW5nLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL29wdGlvbmFsLXN1cHBvcnQvbG9nZ2luZy9jb21tb25zLWxvZ2dpbmctc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9vcHRpb25hbC1zdXBwb3J0L2xvZ2dpbmcvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9vcHRpb25hbC1zdXBwb3J0L2xvZ2dpbmcvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM0ZTQ5Mi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvb3B0aW9uYWwtc3VwcG9ydC9sb2dnaW5nL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotDQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5sb2dnaW5nLXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bG9nZ2luZy1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBMb2dnaW5nLVN1cHBvcnQgTW9kdWxlczwvbmFtZT4NCi0gICAgPHZlcnNpb24+JHtidWlsZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5vcHRpb25hbC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5vcHRpb25hbC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPiR7YnVpbGQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8bW9kdWxlcz4NCi0gICAgICAgIDxtb2R1bGU+Y29tbW9ucy1sb2dnaW5nLXN1cHBvcnQ8L21vZHVsZT4NCi0gICAgPC9tb2R1bGVzPg0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvb3B0aW9uYWwtc3VwcG9ydC9wb20ueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL29wdGlvbmFsLXN1cHBvcnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVlYzUxMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvb3B0aW9uYWwtc3VwcG9ydC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3Iub3B0aW9uYWwtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5vcHRpb25hbC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBPcHRpb25hbC1TdXBwb3J0IE1vZHVsZXM8L25hbWU+DQotICAgIDx2ZXJzaW9uPiR7YnVpbGQudmVyc2lvbn08L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxtb2R1bGVzPg0KLSAgICAgICAgPG1vZHVsZT5sb2dnaW5nPC9tb2R1bGU+DQotICAgIDwvbW9kdWxlcz4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7YnVpbGQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL3BhcmVudC9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9wYXJlbnQvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YjUyNDguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL3BhcmVudC9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQotDQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TDQotDQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLg0KLQ0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nDQotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIg0KLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlDQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUNCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGENCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlDQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyDQotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLg0KLQ0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQ0KLQ0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9wYXJlbnQvTk9USUNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9wYXJlbnQvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkwY2EyMi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvcGFyZW50L05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gc2VjdGlvbiA0KGQpIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgICA9PQ0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSANCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6DQotDQotIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIE9yYWNsZSBDb3JwLCA8aHR0cDovL3d3dy5vcmFjbGUuY29tLz4uDQotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIA0KLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCINCi0NCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyANCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvcGFyZW50L3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvcGFyZW50L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxODMxOWMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2NvcmVfd2l0aF9wbHVnZ2FibGVfbG9nZ2VyL3BhcmVudC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08IS0tDQotICAtIFBhcmVudCBwb20gb2YgYWxsIHRoZSBteWZhY2VzIGV4dGVuc2lvbnMgdmFsaWRhdG9yIHN1YnByb2plY3RzIA0KLSAgICB0aGF0IGhlbHAgdG8gYnVpbGQgb3RoZXIgbXlmYWNlcyBwcm9qZWN0cy4NCi0gIC0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlczwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4NCi0gICAgPHZlcnNpb24+MS4yLjEtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFByb2plY3QgUGFyZW50PC9uYW1lPg0KLQ0KLSAgICA8aXNzdWVNYW5hZ2VtZW50Pg0KLSAgICAgICAgPHN5c3RlbT5qaXJhPC9zeXN0ZW0+DQotICAgICAgICA8dXJsPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9FWFRWQUw8L3VybD4NCi0gICAgPC9pc3N1ZU1hbmFnZW1lbnQ+DQotDQotICAgIDxjaU1hbmFnZW1lbnQ+DQotICAgICAgICA8c3lzdGVtPmNvbnRpbnV1bTwvc3lzdGVtPg0KLSAgICAgICAgPHVybD5odHRwOi8vbXlmYWNlcy56b25lcy5hcGFjaGUub3JnOjgwODAvY29udGludXVtPC91cmw+DQotICAgICAgICA8bm90aWZpZXJzPg0KLSAgICAgICAgICAgIDxub3RpZmllcj4NCi0gICAgICAgICAgICAgICAgPHR5cGU+bWFpbDwvdHlwZT4NCi0gICAgICAgICAgICAgICAgPHNlbmRPblN1Y2Nlc3M+dHJ1ZTwvc2VuZE9uU3VjY2Vzcz4NCi0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8YWRkcmVzcz5jb21taXRzQG15ZmFjZXMuYXBhY2hlLm9yZzwvYWRkcmVzcz4NCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgIDwvbm90aWZpZXI+DQotICAgICAgICA8L25vdGlmaWVycz4NCi0gICAgPC9jaU1hbmFnZW1lbnQ+DQotICAgIA0KLSAgICA8aW5jZXB0aW9uWWVhcj4yMDA4PC9pbmNlcHRpb25ZZWFyPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cmVzb3VyY2VzPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9PC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgPC9yZXNvdXJjZXM+DQotDQotICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4NCi0gICAgICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmU+DQotICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgIDwvcGx1Z2lucz4NCi0gICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4NCi0NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDwhLS0NCi0gICAgICAgICAgICAgICAgICAgIC0gQ29weSBMSUNFTlNFLnR4dCBhbmQgTk9USUNFLnR4dCBzbyB0aGF0IHRoZXkgYXJlIGluY2x1ZGVkDQotICAgICAgICAgICAgICAgICAgICAtIGluIHRoZSAtamF2YWRvYyBqYXIgZmlsZSBmb3IgdGhlIGNvbXBvbmVudC4NCi0gICAgICAgICAgICAgICAgLS0+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5qYXZhZG9jLnJlc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hcGlkb2NzL01FVEEtSU5GIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJMSUNFTlNFLnR4dCIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTk9USUNFLnR4dCIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICA8IS0tDQotICAgICAgICAgICAgICAgIC0gTWFrZSBhIGNoZWNrc3R5bGUgdmlvbGF0aW9uIGEgY29tcGlsZSBlcnJvci4gTm90ZSB0aGF0IGlmIGEgY29tcGlsZSBlcnJvciBvY2N1cnMsDQotICAgICAgICAgICAgICAgIC0gZnVydGhlciBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGFyZ2V0L3NpdGUvY2hlY2tzdHlsZS5odG1sIChwcmVzZW50IGV2ZW4gd2hlbg0KLSAgICAgICAgICAgICAgICAtIGp1c3QgdGhlIGNvbXBpbGUgZ29hbCBhbmQgbm90IHRoZSBzaXRlIGdvYWwgaGFzIGJlZW4gcnVuKS4gTm90ZSBhbHNvIHRoYXQgY2hpbGQNCi0gICAgICAgICAgICAgICAgLSBwcm9qZWN0cyBtYXkgcmVkZWNsYXJlIHRoaXMgcGx1Z2luIGFuZCBwcm92aWRlIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIHNldHRpbmdzDQotICAgICAgICAgICAgICAgIC0gdG8gdXNlIGRpZmZlcmVudCBjaGVja3MgKG1vcmUgb3IgbGVzcyBzdHJpY3QgdGhhbiB0aGUgZGVmYXVsdCkuDQotICAgICAgICAgICAgLS0+DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGVja3N0eWxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnZlcmlmeS1zdHlsZTwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jaGVjazwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8Y29uZmlnTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdGFuZGFyZC54bWw8L2NvbmZpZ0xvY2F0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGhlYWRlckxvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1oZWFkZXIudHh0PC9oZWFkZXJMb2NhdGlvbj4NCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgIA0KLQ0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDwhLS0gU2V0IGNvbXBpbGUgc291cmNlIGF0IDEuNSwgc2luY2UgdGhlIHRhcmdldCBKU0YgaW1wbCBpcyAxLjIgLS0+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+DQotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgPG9wdGltaXplPmZhbHNlPC9vcHRpbWl6ZT4NCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLSAgICA8cmVwb3NpdG9yaWVzPg0KLSAgICAgICAgPHJlcG9zaXRvcnk+DQotICAgICAgICAgICAgPGlkPm1hdmVuMi1yZXBvc2l0b3J5LmRldi5qYXZhLm5ldDwvaWQ+DQotICAgICAgICAgICAgPG5hbWU+SmF2YS5uZXQgUmVwb3NpdG9yeSBmb3IgTWF2ZW48L25hbWU+DQotICAgICAgICAgICAgPHVybD5odHRwOi8vZG93bmxvYWQuamF2YS5uZXQvbWF2ZW4vMS88L3VybD4NCi0gICAgICAgICAgICA8bGF5b3V0PmxlZ2FjeTwvbGF5b3V0Pg0KLSAgICAgICAgPC9yZXBvc2l0b3J5Pg0KLSAgICA8L3JlcG9zaXRvcmllcz4NCi0NCi0gICAgPHJlcG9ydGluZz4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3QtaW5mby1yZXBvcnRzLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcG1kLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxydWxlc2V0cz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvYmFzaWMueG1sPC9ydWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxydWxlc2V0Pi9ydWxlc2V0cy91bnVzZWRjb2RlLnhtbDwvcnVsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgIDwvcnVsZXNldHM+DQotICAgICAgICAgICAgICAgICAgICA8bGlua1hyZWY+dHJ1ZTwvbGlua1hyZWY+DQotICAgICAgICAgICAgICAgICAgICA8bWluaW11bVRva2Vucz4xMDA8L21pbmltdW1Ub2tlbnM+DQotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0SmRrPjEuNTwvdGFyZ2V0SmRrPg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGVja3N0eWxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxjb25maWdMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtY2hlY2tzLW5vcm1hbC54bWw8L2NvbmZpZ0xvY2F0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGhlYWRlckxvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1oZWFkZXIudHh0PC9oZWFkZXJMb2NhdGlvbj4NCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L3JlcG9ydGluZz4NCi0NCi0gICAgPHNjbT4NCi0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rLzwvY29ubmVjdGlvbj4NCi0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay88L2RldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay88L3VybD4NCi0gICAgPC9zY20+DQotDQotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50Pg0KLSAgICAgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4NCi0gICAgICAgICAgICA8dW5pcXVlVmVyc2lvbj5mYWxzZTwvdW5pcXVlVmVyc2lvbj4NCi0gICAgICAgICAgICA8aWQ+YXBhY2hlLnNuYXBzaG90czwvaWQ+DQotICAgICAgICAgICAgPG5hbWU+QXBhY2hlIE1hdmVuIFNuYXBzaG90IFJlcG9zaXRvcnk8L25hbWU+DQotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1zbmFwc2hvdC1yZXBvc2l0b3J5PC91cmw+DQotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4NCi0gICAgICAgIDxzaXRlPg0KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc2l0ZTwvaWQ+DQotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yPC91cmw+DQotICAgICAgICA8L3NpdGU+DQotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4NCi0NCi0gICAgPHByb2ZpbGVzPg0KLSAgICAgICAgPHByb2ZpbGU+DQotICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPg0KLSAgICAgICAgICAgIDwhLS0NCi0gICAgICAgICAgICAgICAgTk9URTogRXhlY3V0ZSB0aGlzIHByb2ZpbGUgbGlrZQ0KLSAgICAgICAgICAgICAgICBtdm4gY2xlYW4gc291cmNlOmphciBpbnN0YWxsIGRlcGxveSAtRGFsdERlcGxveW1lbnRSZXBvc2l0b3J5PW1hdHpldzo6ZGVmYXVsdDo6ZmlsZTovL0ZPTERFUiAtUHJlbGVhc2UNCi0gICAgICAgICAgICAtLT4NCi0gICAgICAgICAgICA8YnVpbGQ+DQotICAgICAgICAgICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1ncGctcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC1hbHBoYS00PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnNpZ24tYXJ0aWZhY3RzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnNpZ248L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1qYXZhZG9jczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNjbS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnZhbGlkYXRlPC9waGFzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5nZXR0aW5nLXNjbS5yZXZpc2lvbjwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+dXBkYXRlPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4NCi0gICAgICAgICAgICA8L2J1aWxkPg0KLSAgICAgICAgPC9wcm9maWxlPg0KLSAgICA8L3Byb2ZpbGVzPg0KLQ0KLSAgICA8cHJvcGVydGllcz4NCi0gICAgICAgIDxidWlsZC52ZXJzaW9uPjEuMi4xLVNOQVBTSE9UPC9idWlsZC52ZXJzaW9uPg0KLSAgICAgICAgPGpzZi52ZXJzaW9uPjEuMi40PC9qc2YudmVyc2lvbj4NCi0gICAgPC9wcm9wZXJ0aWVzPg0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfY29yZV93aXRoX3BsdWdnYWJsZV9sb2dnZXIvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGI3MWVmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19jb3JlX3dpdGhfcGx1Z2dhYmxlX2xvZ2dlci9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLW1vZHVsZTwvYXJ0aWZhY3RJZD4NCi0gICAgPHZlcnNpb24+JHtidWlsZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgTW9kdWxlPC9uYW1lPg0KLSAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3I8L3VybD4NCi0NCi0gICAgPG1vZHVsZXM+DQotICAgICAgICA8bW9kdWxlPnBhcmVudDwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5jb3JlPC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPm9wdGlvbmFsLXN1cHBvcnQ8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+ZXhhbXBsZXM8L21vZHVsZT4NCi0gICAgPC9tb2R1bGVzPg0KLQ0KLSAgICA8cHJvcGVydGllcz4NCi0gICAgICAgIDxidWlsZC52ZXJzaW9uPjEuMi4xLVNOQVBTSE9UPC9idWlsZC52ZXJzaW9uPg0KLSAgICAgICAgPGpzZi52ZXJzaW9uPjEuMi40PC9qc2YudmVyc2lvbj4NCi0gICAgPC9wcm9wZXJ0aWVzPg0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9hc3NlbWJseS9wb20ueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvYXNzZW1ibHkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E2NDdlNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9hc3NlbWJseS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWFzc2VtYmx5MTI8L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBBc3NlbWJseTwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+TXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBBc3NlbWJseSBpcyB1c2VkIHRvIGdlbmVyYXRlIAotICAgIC56aXAgYW5kIC50YXIuZ3ogZGlzdHJpYnV0aW9ucyA8L2Rlc2NyaXB0aW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvYXNzZW1ibHk8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9hc3NlbWJseTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvYXNzZW1ibHk8L3VybD4KLSAgICA8L3NjbT4KLSAgICAKLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5kZXBlbmRlbmN5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LWphdmFkb2M8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjb3JlLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+amF2YWRvYzwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+amF2YWRvYzwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+amF2YWRvYzwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vamF2YWRvYzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LXNvdXJjZTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZW5lcmljLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zcmM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBFWEVDVVRFIG12biBwYWNrYWdlIHRvIGdlbmVyYXRlIGFzc2VtYmx5IGZpbGVzIC0tPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X3NyYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5teWZhY2VzLWV4dHZhbDEyLSR7dmVyc2lvbn0tc3JjPC9maW5hbE5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXR0YWNoZWQ8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X2JpbjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPiR7YmFzZWRpcn0vc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsMTItJHt2ZXJzaW9ufS1iaW48L2ZpbmFsTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtnZW5lcmljLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDwhLS0gU2luY2UgZXh0dmFsIGNvdWxkIGJlIGFzeW5jIHJlbGVhc2VkLCBhbiBnZW5lcmF0ZWQgYXNzZW1ibHkgY291bGQgY29udGFpbiBkaWZmZXJlbnQKLSAgICAgICAgIGFydGlmYWN0IHZlcnNpb25zIC0tPgotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8Y29yZS52ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC9jb3JlLnZlcnNpb24+Ci0gICAgICAgIDx0cmluaWRhZC1zdXBwb3J0LnZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3RyaW5pZGFkLXN1cHBvcnQudmVyc2lvbj4KLSAgICAgICAgPGdlbmVyaWMtc3VwcG9ydC52ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC9nZW5lcmljLXN1cHBvcnQudmVyc2lvbj4KLSAgICAgICAgPHByb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvcHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9uPgotICAgIDwvcHJvcGVydGllcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmViaW4ueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNjc5NWIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08YXNzZW1ibHk+Ci0gIDxpZD5jb3JlYmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgCTxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgCTxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPlJFQURNRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5OT1RJQ0UqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5SRUxFQVNFKjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvamF2YWRvYzwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5qYXZhZG9jPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3Jlc3JjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUxODZjNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3Jlc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPmNvcmVzcmM8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4gIAotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgCTxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgCTxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPlJFQURNRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5OT1RJQ0UqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5SRUxFQVNFKjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PiAgIAotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvc3JjPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PnNyYzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLmphcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KLSAKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1YjNhNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOWJkYjEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhZjYwZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+Y29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNnbGliPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNnbGliPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMV8zPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxyZXNvdXJjZXM+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgIDwvcmVzb3VyY2VzPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg0NjNlNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj4NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5zdGFydHVwLkdlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXINCi0gICAgICAgIDwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyS2l0LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmI1NThhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyS2l0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5yZW5kZXJraXQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotDQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RJbnRlcmNlcHRvcjsNCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5LkVuaGFuY2VyOw0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kUHJveHk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsR2VuZXJpY1JlbmRlcktpdCBleHRlbmRzIEV4dFZhbFJlbmRlcktpdCBpbXBsZW1lbnRzIE1ldGhvZEludGVyY2VwdG9yDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFJlbmRlcktpdCBuZXdJbnN0YW5jZShSZW5kZXJLaXQgcmVuZGVyS2l0KQ0KLSAgICB7DQotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSByZW5kZXJLaXQuZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIC8vaXQncyBub3QgcG9zc2libGUgdG8gd3JhcCB0aGUgY29udmVydGVyIGFnYWluIC0gb2NjdXJzIGUuZy4gdW5kZXIgc29sYXJpcyArIGJlYSB3ZWJsb2dpYw0KLSAgICAgICAgaWYgKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkuY29udGFpbnMoIiQkRW5oYW5jZXJCeUNHTElCJCQiKQ0KLSAgICAgICAgICAgIHx8IGN1cnJlbnRDbGFzcy5nZXROYW1lKCkuY29udGFpbnMoIiQkRmFzdENsYXNzQnlDR0xJQiQkIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcktpdDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEVuaGFuY2VyIGVuaGFuY2VyID0gbmV3IEVuaGFuY2VyKCk7DQotICAgICAgICBlbmhhbmNlci5zZXRTdXBlcmNsYXNzKHJlbmRlcktpdC5nZXRDbGFzcygpKTsNCi0gICAgICAgIGVuaGFuY2VyLnNldENhbGxiYWNrKG5ldyBFeHRWYWxHZW5lcmljUmVuZGVyS2l0KHJlbmRlcktpdCkpOw0KLQ0KLSAgICAgICAgcmV0dXJuIChSZW5kZXJLaXQpIGVuaGFuY2VyLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgaW50ZXJjZXB0KE9iamVjdCBvYmosIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MsIE1ldGhvZFByb3h5IHByb3h5KSB0aHJvd3MgVGhyb3dhYmxlDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJnZXRSZW5kZXJlciIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRSZW5kZXJlcigoU3RyaW5nKWFyZ3NbMF0sIChTdHJpbmcpYXJnc1sxXSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJhZGRSZW5kZXJlciIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZFJlbmRlcmVyKChTdHJpbmcpYXJnc1swXSwgKFN0cmluZylhcmdzWzFdLCAoUmVuZGVyZXIpYXJnc1syXSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb3h5Lmludm9rZVN1cGVyKG9iaiwgYXJncyk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRXh0VmFsR2VuZXJpY1JlbmRlcktpdChSZW5kZXJLaXQgd3JhcHBlZCkNCi0gICAgew0KLSAgICAgICAgc3VwZXIod3JhcHBlZCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBSZW5kZXJlciBjcmVhdGVXcmFwcGVyKFJlbmRlcmVyIHJlbmRlcmVyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5uZXdJbnN0YW5jZShyZW5kZXJlcik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MGQ2MjIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJXcmFwcGVyOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kSW50ZXJjZXB0b3I7Ci1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5LkVuaGFuY2VyOwotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RQcm94eTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGZpbmFsIGNsYXNzIEV4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIgZXh0ZW5kcyBFeHRWYWxSZW5kZXJlcldyYXBwZXIgaW1wbGVtZW50cyBNZXRob2RJbnRlcmNlcHRvcgotewotICAgIHB1YmxpYyBzdGF0aWMgUmVuZGVyZXIgbmV3SW5zdGFuY2UoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSByZW5kZXJlci5nZXRDbGFzcygpOwotCi0gICAgICAgIC8vdG8gYXZvaWQgcmUtd3JhcHBpbmcgLSBvY2N1cnMgZS5nLiB1bmRlciBzb2xhcmlzICsgYmVhIHdlYmxvZ2ljCi0gICAgICAgIGlmIChjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCIkJEVuaGFuY2VyQnlDR0xJQiQkIikgfHwKLSAgICAgICAgICAgIGN1cnJlbnRDbGFzcy5nZXROYW1lKCkuY29udGFpbnMoIiQkRmFzdENsYXNzQnlDR0xJQiQkIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJlcjsKLSAgICAgICAgfQotCi0gICAgICAgIEVuaGFuY2VyIGVuaGFuY2VyID0gbmV3IEVuaGFuY2VyKCk7Ci0gICAgICAgIGVuaGFuY2VyLnNldFN1cGVyY2xhc3MocmVuZGVyZXIuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIGVuaGFuY2VyLnNldENhbGxiYWNrKG5ldyBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyKHJlbmRlcmVyKSk7Ci0KLSAgICAgICAgcmV0dXJuIChSZW5kZXJlcikgZW5oYW5jZXIuY3JlYXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBpbnRlcmNlcHQoT2JqZWN0IG9iaiwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncywgTWV0aG9kUHJveHkgcHJveHkpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0Q29udmVydGVkVmFsdWUiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDb252ZXJ0ZWRWYWx1ZSgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdLCBhcmdzWzJdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZGVjb2RlIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWNvZGUoKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImVuY29kZUJlZ2luIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGVCZWdpbigoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZW5jb2RlQ2hpbGRyZW4iKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZUNoaWxkcmVuKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJlbmNvZGVFbmQiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZUVuZCgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiY29udmVydENsaWVudElkIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRDbGllbnRJZCgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChTdHJpbmcpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldFJlbmRlcnNDaGlsZHJlbiIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm1ldGhvZCAiICsgbWV0aG9kLmdldE5hbWUoKSArICIgY2FsbGVkIHdpdGhvdXQgcmVuZGVyaW5nLWludGVyY2VwdG9ycyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcHJveHkuaW52b2tlU3VwZXIob2JqLCBhcmdzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlcihSZW5kZXJlciB3cmFwcGVkKQotICAgIHsKLSAgICAgICAgc3VwZXIod3JhcHBlZCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5MTdlNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5yZW5kZXJraXQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeQ0KLXsNCi0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCBjcmVhdGVXcmFwcGVyKFJlbmRlcktpdCByZW5kZXJLaXQpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0dmFsIHJlbmRlcmtpdCB3cmFwcGVyIGNyZWF0ZWQgZm9yICIgKyByZW5kZXJLaXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHZpYSBjZ2xpYiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIEV4dFZhbEdlbmVyaWNSZW5kZXJLaXQubmV3SW5zdGFuY2UocmVuZGVyS2l0KTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9zdGFydHVwL0dlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3N0YXJ0dXAvR2VuZXJpY01vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGM3YjQxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3N0YXJ0dXAvR2VuZXJpY01vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5yZW5kZXJraXQuR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgR2VuZXJpY01vZHVsZVN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyDQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpLmFkZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KG5ldyBHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OWE4ZTguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGUgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlIHByb3ZpZGVzIGdlbmVyaWMgU3VwcG9ydCBmb3IgSlNGIGNvbXBvbmVudCBmcmFtZXdvcmtzIHdoaWNoIGhhdmUgc3BlY2lhbCByZXF1aXJlbWVudHMgKGUuZy4gUmljaEZhY2VzLCBNeUZhY2VzIFRvYmFnbywgLi4uKS4NCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEuMS54IGFuZCBKU0YgMS4yLnguIEJvdGggdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb21wb25lbnQtc3VwcG9ydC9wb20ueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3N2IyNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb21wb25lbnQtc3VwcG9ydC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+Y29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIENvbXBvbmVudC1TdXBwb3J0IE1vZHVsZXM8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvY29tcG9uZW50LXN1cHBvcnQ8L2Nvbm5lY3Rpb24+DQotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvY29tcG9uZW50LXN1cHBvcnQ8L2RldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9jb21wb25lbnQtc3VwcG9ydDwvdXJsPg0KLSAgICA8L3NjbT4NCi0NCi0gICAgPG1vZHVsZXM+DQotICAgICAgICA8bW9kdWxlPnRyaW5pZGFkLXN1cHBvcnQ8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+Z2VuZXJpYy1zdXBwb3J0PC9tb2R1bGU+DQotICAgIDwvbW9kdWxlcz4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxwcm9wZXJ0aWVzPg0KLSAgICAgICAgPHRyaW5pZGFkLnZlcnNpb24+MS4yLjk8L3RyaW5pZGFkLnZlcnNpb24+DQotICAgIDwvcHJvcGVydGllcz4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9wb20ueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjNmNWRiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+Y29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgPC9yZXNvdXJjZXM+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OGIyYmIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiDQotICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjIiPg0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPg0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdGFydHVwLlRyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyDQotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi0NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj4NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcg0KLSAgICAgICAgPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MGViNjguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5DbGllbnRWYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLS8qKg0KLSAqIGluIGNhc2Ugb2YgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBhIHRyaW5pZGFkIGNsaWVudCB2YWxpZGF0b3IgaXMgYWRkZWQgdG8gdGhlIGNvbXBvbmVudCBiYXNlZCBvbiB0aGUgbWV0YS1kYXRhLg0KLSAqIGF0IHRoZSBwb3N0YmFjazogdGhlIGV4dHZhbCB2YWxpZGF0aW9uIHN0cmF0ZWd5IGdldHMgY2FsbGVkIGFuZCBhZnRlciB0aGF0IHRoZSBhZGRlZCB2YWxpZGF0b3IuDQotICogdGhpcyB3cmFwcGVyIHByZXZlbnRzIHN1Y2ggYSBzZXJ2ZXItc2lkZSBkb3VibGUgdmFsaWRhdGlvbi4NCi0gKiBpdCBqdXN0IGRlbGVnYXRlcyB0aGUgY2xpZW50LXNpZGUgZnVuY3Rpb25hbGl0eS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlciBpbXBsZW1lbnRzIFZhbGlkYXRvciwgQ2xpZW50VmFsaWRhdG9yLCBTZXJpYWxpemFibGUNCi17DQotICAgIHByaXZhdGUgdHJhbnNpZW50IENsaWVudFZhbGlkYXRvciB3cmFwcGVkOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxNDE0NTQ3ODQxNzAwNjIxNDEwTDsNCi0NCi0gICAgcHVibGljIEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcihDbGllbnRWYWxpZGF0b3IgY2xpZW50VmFsaWRhdG9yKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSBjbGllbnRWYWxpZGF0b3I7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgdmFsaWRhdGUgLSB0aGUgZXh0dmFsIHZhbGlkYXRpb24gc3RyYXRlZ3kgd2lsbCBkbyB0aGF0DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRMaWJyYXJ5U291cmNlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudExpYnJhcnlTb3VyY2UoZmFjZXNDb250ZXh0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldENsaWVudEltcG9ydE5hbWVzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q2xpZW50SW1wb3J0TmFtZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFNjcmlwdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q2xpZW50U2NyaXB0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50VmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q2xpZW50VmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGJjMTk0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0LkV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY3RvcnlGaW5kZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeTsNCi0NCi0vKioNCi0gKiB1c2UgdGhpcyBwaGFzZS1saXN0ZW5lciBpbnN0ZWFkIG9mIGEgRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBkdWUgdG8gYSB0cmluaWRhZCBpc3N1ZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lciBpbXBsZW1lbnRzIFBoYXNlTGlzdGVuZXINCi17DQotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIGlmKGV2ZW50LmdldFBoYXNlSWQoKSAhPSBQaGFzZUlkLkFQUExZX1JFUVVFU1RfVkFMVUVTICYmIGV2ZW50LmdldFBoYXNlSWQoKSAhPSBQaGFzZUlkLlJFTkRFUl9SRVNQT05TRSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgUmVuZGVyS2l0RmFjdG9yeSByZW5kZXJLaXRGYWN0b3J5ID0gKFJlbmRlcktpdEZhY3RvcnkpDQotICAgICAgICAgICAgRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEZhY3RvcnlGaW5kZXIuUkVOREVSX0tJVF9GQUNUT1JZKTsNCi0NCi0gICAgICAgIFN0cmluZyByZW5kZXJLaXRJZCA9IGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldFJlbmRlcktpdElkKCk7DQotDQotICAgICAgICBpZihFeHRWYWxUcmluaWRhZFJlbmRlcktpdC5JRC5lcXVhbHMocmVuZGVyS2l0SWQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFJlbmRlcktpdCByZW5kZXJLaXQgPSByZW5kZXJLaXRGYWN0b3J5LmdldFJlbmRlcktpdChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHJlbmRlcktpdElkKTsNCi0gICAgICAgIHJlbmRlcktpdEZhY3RvcnkuYWRkUmVuZGVyS2l0KEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LklELCBuZXcgRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQocmVuZGVyS2l0KSk7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5zZXRSZW5kZXJLaXRJZChFeHRWYWxUcmluaWRhZFJlbmRlcktpdC5JRCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLlJFTkRFUl9SRVNQT05TRTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUwY2I3NC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJlbid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIC8qDQotICAgICAqIGRlYWN0aXZhdGUNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9DTElFTlRfU0lERV9UUklOSURBRF9WQUxJREFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0NMSUVOVF9TSURFX1RSSU5JREFEX1ZBTElEQVRJT04iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX1RSSU5JREFEX0NPUkVfT1VUUFVUX0xBQkVMX0lOSVRJQUxJWkFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1RSSU5JREFEX0NPUkVfT1VUUFVUX0xBQkVMX0lOSVRJQUxJWkFUSU9OIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9UUklOSURBRF9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9UUklOSURBRF9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiIpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMzI5ZjYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvRG91YmxlUmFuZ2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkRvdWJsZVJhbmdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgRG91YmxlUmFuZ2VJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7Ci0gICAgICAgIERvdWJsZVJhbmdlVmFsaWRhdG9yIGRvdWJsZVJhbmdlVmFsaWRhdG9yID0gKERvdWJsZVJhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5Eb3VibGVSYW5nZSIpOwotCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbWluID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pOwotCi0gICAgICAgICAgICBpZihtaW4gaW5zdGFuY2VvZiBEb3VibGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bSgoRG91YmxlKW1pbik7Ci0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1heExlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYKTsKLQotICAgICAgICAgICAgaWYobWF4TGVuZ3RoIGluc3RhbmNlb2YgRG91YmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oKERvdWJsZSltYXhMZW5ndGgpOwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkICYmCi0gICAgICAgICAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3IgaW5zdGFuY2VvZiBDbGllbnRWYWxpZGF0b3IgJiYgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKWRvdWJsZVJhbmdlVmFsaWRhdG9yKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xlbmd0aEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDEyMjUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkNsaWVudFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgTGVuZ3RoSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW5mb3JtYXRpb25BZGRlZCA9IGZhbHNlOwotICAgICAgICAvL1RPRE8KLSAgICAgICAgTGVuZ3RoVmFsaWRhdG9yIGxlbmd0aFZhbGlkYXRvciA9IChMZW5ndGhWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkxlbmd0aCIpOwotCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSCk7Ci0KLSAgICAgICAgICAgIGlmKG1pbiBpbnN0YW5jZW9mIEludGVnZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1pbmltdW0oKEludGVnZXIpbWluKTsKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1heExlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCk7Ci0KLSAgICAgICAgICAgIGlmKG1heExlbmd0aCBpbnN0YW5jZW9mIEludGVnZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRNYXhpbXVtTGVuZ3RoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludC5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1heGltdW0oKEludGVnZXIpbWF4TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vcmVJbml0VmFsaWRhdG9ycygoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCwgbWV0YURhdGEpOyAvL3NlYXJjaCB3cmFwcGVycyBhbmQgY2FsbCAuZGVhY3RpdmF0ZQotCi0gICAgICAgIGlmKGluZm9ybWF0aW9uQWRkZWQgJiYgbGVuZ3RoVmFsaWRhdG9yIGluc3RhbmNlb2YgQ2xpZW50VmFsaWRhdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpbGVuZ3RoVmFsaWRhdG9yKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIENvcmVPdXRwdXRMYWJlbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsZW5ndGhWYWxpZGF0b3IuZ2V0TWluaW11bSgpID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgoQ29yZU91dHB1dExhYmVsKXVpQ29tcG9uZW50KS5zZXRTaG93UmVxdWlyZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChDb3JlT3V0cHV0TGFiZWwpdWlDb21wb25lbnQpLnNldFNob3dSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTG9uZ1JhbmdlSW5pdGlhbGl6ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xvbmdSYW5nZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYzM0ZGUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTG9uZ1JhbmdlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5Mb25nUmFuZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5DbGllbnRWYWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBMb25nUmFuZ2VJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7Ci0gICAgICAgIExvbmdSYW5nZVZhbGlkYXRvciBsb25nUmFuZ2VWYWxpZGF0b3IgPSAoTG9uZ1JhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5Mb25nUmFuZ2UiKTsKLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKTsKLQotICAgICAgICAgICAgaWYobWluIGluc3RhbmNlb2YgTG9uZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bSgoTG9uZyltaW4pOwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCk7Ci0KLSAgICAgICAgICAgIGlmKG1heExlbmd0aCBpbnN0YW5jZW9mIExvbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oKExvbmcpbWF4TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKGluZm9ybWF0aW9uQWRkZWQgJiYKLSAgICAgICAgICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3IgaW5zdGFuY2VvZiBDbGllbnRWYWxpZGF0b3IgJiYgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpbG9uZ1JhbmdlVmFsaWRhdG9yKSk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9QYXR0ZXJuSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZmMDg4ZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9QYXR0ZXJuSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5SZWdFeHBWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5DbGllbnRWYWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBQYXR0ZXJuSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCFtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIHBhdHRlcm5zID0gKFN0cmluZ1tdKW1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTik7Ci0KLSAgICAgICAgUmVnRXhwVmFsaWRhdG9yIHJlZ0V4cFZhbGlkYXRvcjsKLQotICAgICAgICBmb3IoU3RyaW5nIHBhdHRlcm4gOiBwYXR0ZXJucykKLSAgICAgICAgewotICAgICAgICAgICAgcmVnRXhwVmFsaWRhdG9yID0gKFJlZ0V4cFZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLlJlZ0V4cCIpOwotCi0gICAgICAgICAgICByZWdFeHBWYWxpZGF0b3Iuc2V0UGF0dGVybihwYXR0ZXJuKTsKLSAgICAgICAgICAgIHJlZ0V4cFZhbGlkYXRvci5zZXRNZXNzYWdlRGV0YWlsTm9NYXRjaCgoU3RyaW5nKW1ldGFEYXRhLmdldCgKLSAgICAgICAgICAgICAgICBDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTl9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UpKTsKLQotICAgICAgICAgICAgaWYocmVnRXhwVmFsaWRhdG9yIGluc3RhbmNlb2YgQ2xpZW50VmFsaWRhdG9yICYmIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIoKENsaWVudFZhbGlkYXRvcilyZWdFeHBWYWxpZGF0b3IpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmM2QxMzYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUmVxdWlyZWRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC51dGlsLlRyaW5pZGFkVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLm91dHB1dC5Db3JlT3V0cHV0TGFiZWw7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgUmVxdWlyZWRJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSB8fAotICAgICAgICAgICBtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCl8fAotICAgICAgICAgICBtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoKAotICAgICAgICAgICAgICAgICAoIUJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJgotICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKSkpIHx8Ci0gICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhpc0NvbXBvbmVudFJlcXVpcmVkKHVpQ29tcG9uZW50KSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkgJiYKLSAgICAgICAgICAgICAgICAgICAhQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgQ29yZU91dHB1dExhYmVsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChDb3JlT3V0cHV0TGFiZWwpdWlDb21wb25lbnQpLnNldFNob3dSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQm9vbGVhbiBpc0NvbXBvbmVudFJlcXVpcmVkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpQ29tcG9uZW50ID0gVHJpbmlkYWRVdGlscy5maW5kTGFiZWxlZEVkaXRhYmxlQ29tcG9uZW50KChDb3JlT3V0cHV0TGFiZWwpIHVpQ29tcG9uZW50KTsKLQotICAgICAgICAgICAgaWYodWlDb21wb25lbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vY29tcGFyZSB3aXRoIGZhbHNlIHNvIHRydWUgPSB0cnVlIG9yIG51bGwKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc1JlYWRPbmx5IikpKTsKLSAgICAgICAgYm9vbGVhbiBpc0Rpc2FibGVkID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc0Rpc2FibGVkIikpKTsKLQotICAgICAgICByZXR1cm4gIShpc1JlYWRPbmx5IHx8IGlzRGlzYWJsZWQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1RyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1RyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkzMTA4Yy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29udGV4dC5SZXF1ZXN0Q29udGV4dDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9URVhUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXRUZXh0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXREYXRlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8VHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcj4gY29tcG9uZW50SW5pdGlhbGl6ZXJzID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyPigpOwotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBSZXF1aXJlZEluaXRpYWxpemVyKCkpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBMZW5ndGhJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgTG9uZ1JhbmdlSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IERvdWJsZVJhbmdlSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFBhdHRlcm5Jbml0aWFsaXplcigpKTsKLSAgICAgICAgLy9jb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBWYWxpZGF0b3JJbml0aWFsaXplcigpKTsKLSAgICB9Ci0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkxPVywgZGVzY3JpcHRpb24gPSAiY2hlY2sgcHByIGlzc3VlIikKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBmb3IoVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplciA6IGNvbXBvbmVudEluaXRpYWxpemVycykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoY29tcG9uZW50SW5pdGlhbGl6ZXIuY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVwZGF0ZUNvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKSB8fAotICAgICAgICAgICAgICAgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFLmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmKFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmlzUGFydGlhbFJlcXVlc3QoZmFjZXNDb250ZXh0KSkKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuYWRkUGFydGlhbFRhcmdldCh1aUNvbXBvbmVudC5nZXRQYXJlbnQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVmFsaWRhdG9ySW5pdGlhbGl6ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1ZhbGlkYXRvckluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODg3OGMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVmFsaWRhdG9ySW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHZhbHVlID0gVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTE9XLCBkZXNjcmlwdGlvbiA9ICJpbXBsLiB0cmluaWRhZCBlLW1haWwgdmFsaWRhdG9yIikKLWNsYXNzIFZhbGlkYXRvckluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZighbWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLkNVU1RPTSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuQ1VTVE9NKTsKLQotICAgICAgICBpZighKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvcihPYmplY3QgY3VycmVudFZhbHVlIDogKExpc3QpdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCEoY3VycmVudFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoQ29tbW9uTWV0YURhdGFLZXlzLkVNQUlMLmVxdWFscyhjdXJyZW50VmFsdWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vVE9ETwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNzg5MjcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudXRpbC5UcmluaWRhZFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotcHVibGljIGNsYXNzIFRyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvciBleHRlbmRzIEFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcg0KLXsNCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpDQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmKGZpbHRlckNvcmVPdXRwdXRMYWJlbCh1aUNvbXBvbmVudCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdENvcmVPdXRwdXRMYWJlbChmYWNlc0NvbnRleHQsIChDb3JlT3V0cHV0TGFiZWwpdWlDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBmaWx0ZXJDb3JlT3V0cHV0TGFiZWwoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb3JlT3V0cHV0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgQ29yZU91dHB1dExhYmVsIGNvcmVPdXRwdXRMYWJlbCkNCi0gICAgew0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0NCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIGFubm90YXRpb25FeHRyYWN0b3IgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkuZ2V0RmFjdG9yeSgNCi0gICAgICAgICAgICBGYWN0b3J5TmFtZXMuQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmNsYXNzKS5jcmVhdGUoKTsNCi0NCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IFRyaW5pZGFkVXRpbHMuZmluZExhYmVsZWRFZGl0YWJsZUNvbXBvbmVudChjb3JlT3V0cHV0TGFiZWwpOw0KLQ0KLSAgICAgICAgaWYodGFyZ2V0Q29tcG9uZW50ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQm9vbGVhbiBza2lwSW5pdGlhbGl6YXRpb24gPSBmYWxzZTsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGE7DQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBhbm5vdGF0aW9uRXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCB0YXJnZXRDb21wb25lbnQpLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhRW50cnkoZW50cnkpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSBFeHRWYWxVdGlscy5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSk7DQotDQotICAgICAgICAgICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEgPSBtZXRhRGF0YVRyYW5zZm9ybWVyLmNvbnZlcnRNZXRhRGF0YShlbnRyeSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG51bGw7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYobWV0YURhdGEgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2V4ZWN1dGUgc2tpcCB2YWxpZGF0aW9uIHN0cmF0ZWd5IC0+IHNraXAgdmFsaWRhdGlvbiB5L24gaW4gZW50cnkNCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHRhcmdldENvbXBvbmVudCwgZW50cnksIG51bGwpOw0KLSAgICAgICAgICAgICAgICAgICAgc2tpcEluaXRpYWxpemF0aW9uID0gZW50cnkuZ2V0UHJvcGVydHkoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTiwgQm9vbGVhbi5jbGFzcyk7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZihCb29sZWFuLlRSVUUuZXF1YWxzKHNraXBJbml0aWFsaXphdGlvbikgJiYgIW1ldGFEYXRhLmlzRW1wdHkoKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlzU2tpcGFibGVWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YS5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTiwgdHJ1ZSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYoIW1ldGFEYXRhLmlzRW1wdHkoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29uZmlndXJlQ29tcG9uZW50V2l0aE1ldGFEYXRhKGZhY2VzQ29udGV4dCwgY29yZU91dHB1dExhYmVsLCBtZXRhRGF0YSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU2tpcGFibGVWYWxpZGF0aW9uU3RyYXRlZ3koQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBrZXkgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQkFTRV9QQUNLQUdFKSArIENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04udG9VcHBlckNhc2UoKTsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IG1hcmtlckxpc3QgPSAoTGlzdDxDbGFzcz4pRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoa2V5KTsNCi0NCi0gICAgICAgIGlmKG1hcmtlckxpc3QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBmb3IoQ2xhc3MgY3VycmVudENsYXNzIDogbWFya2VyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihjdXJyZW50Q2xhc3MuaXNBbm5vdGF0aW9uKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5pc0Fubm90YXRpb25QcmVzZW50KGN1cnJlbnRDbGFzcykpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGN1cnJlbnRDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2E4ZmY5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb250ZXh0LlJlcXVlc3RDb250ZXh0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXRUZXh0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dERhdGUiOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmVmcmVzaENvbXBvbmVudCh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSAmJiBtZXRhRGF0YUVudHJ5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKTsNCi0NCi0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBnZXRMYWJlbCh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICAgICAgaWYobGFiZWwgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxhYmVsID0gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy9vdmVycmlkZSB0aGUgbGFiZWwgaWYgdGhlIGFubm90YXRpb24gcHJvdmlkZXMgYSBsYWJlbA0KLSAgICAgICAgICAgIGlmKG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsYWJlbCA9IG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwsIFN0cmluZy5jbGFzcyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwoZmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmKFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmlzUGFydGlhbFJlcXVlc3QoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBSZXF1ZXN0Q29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5hZGRQYXJ0aWFsVGFyZ2V0KHVpQ29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gVFJJTklEQURfQ09SRV9JTlBVVF9URVhULmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSkgfHwNCi0gICAgICAgICAgICAgICBUUklOSURBRF9DT1JFX0lOUFVUX0RBVEUuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRMYWJlbChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldExhYmVsIikpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGI0NWU5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyS2l0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnJlbmRlcmtpdC5SZW5kZXJLaXREZWNvcmF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnJlbmRlcmtpdC5jb3JlLkNvcmVSZW5kZXJLaXQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlc3BvbnNlU3RhdGVNYW5hZ2VyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LlJlc3BvbnNlV3JpdGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LlJlc3BvbnNlU3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsNCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQgZXh0ZW5kcyBSZW5kZXJLaXREZWNvcmF0b3INCi17DQotICAgIHByb3RlY3RlZCBFeHRWYWxSZW5kZXJLaXQgZXh0VmFsUmVuZGVyS2l0Ow0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJFWFRWQUxfVFJJTklEQURfUkVOREVSS0lUIjsNCi0NCi0gICAgcHVibGljIEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0KFJlbmRlcktpdCB3cmFwcGVkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmV4dFZhbFJlbmRlcktpdCA9IG5ldyBFeHRWYWxSZW5kZXJLaXQod3JhcHBlZCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUsIFJlbmRlcmVyIHJlbmRlcmVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmV4dFZhbFJlbmRlcktpdC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgcmVuZGVyZXIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUmVuZGVyZXIgZ2V0UmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmdldFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFJlc3BvbnNlU3RhdGVNYW5hZ2VyIGdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBSZXNwb25zZVdyaXRlciBjcmVhdGVSZXNwb25zZVdyaXRlcihXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcywgU3RyaW5nIHMxKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5leHRWYWxSZW5kZXJLaXQuY3JlYXRlUmVzcG9uc2VXcml0ZXIod3JpdGVyLCBzLCBzMSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBSZXNwb25zZVN0cmVhbSBjcmVhdGVSZXNwb25zZVN0cmVhbShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5leHRWYWxSZW5kZXJLaXQuY3JlYXRlUmVzcG9uc2VTdHJlYW0ob3V0cHV0U3RyZWFtKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlY29yYXRlZFJlbmRlcktpdElkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENvcmVSZW5kZXJLaXQuQkFTRV9SRU5ERVJfS0lUX0lEOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMjcwMWYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwucmVuZGVya2l0LmNvcmUueGh0bWwudGFibGUuVGFibGVSZW5kZXJpbmdDb250ZXh0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogc29sdXRpb24gZm9yIHRyaW5pZGFkIHRhYmxlIHJlbmRlcmVyIGlzc3VlIChpbiBjb25uZWN0aW9uIHdpdGggZG91YmxlIGNhbGwgcHJldmVudGlvbiBwcm94aWVzKQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkgZXh0ZW5kcyBFeHRWYWxSZW5kZXJlclByb3h5DQotew0KLSAgICBwdWJsaWMgRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5KFJlbmRlcmVyIHJlbmRlcmVyKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihyZW5kZXJlcik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3B0aW9uYWxLZXkoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmKFRhYmxlUmVuZGVyaW5nQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAifCIgKyBUYWJsZVJlbmRlcmluZ0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0UmVuZGVyU3RhZ2UoKS5nZXRTdGFnZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuICIiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdGFydHVwL1RyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NWMyNWUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdGFydHVwL1RyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudC5UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0LkV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yLlRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3IuVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogYWx0ZXJuYXRpdmUgYXBwcm9hY2ggZm9yIEV4dFZhbFJlbmRlcktpdEZhY3RvcnkNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyDQotew0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAid2ViLnhtbCBwYXJhbWV0ZXIgdG8gZGVhY3RpdmF0ZSBpdCIpDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBpbml0VHJpbmlkYWRTdXBwb3J0KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRUcmluaWRhZFN1cHBvcnQoKQ0KLSAgICB7DQotICAgICAgICAvL2RlYWN0aXZhdGUgZGVmYXVsdCBhcHByb2FjaA0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpLmRlYWN0aXZhdGUoKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIGRlYWN0aXZhdGVDbGllbnRTaWRlVmFsaWRhdGlvbiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NMSUVOVF9TSURFX1RSSU5JREFEX1ZBTElEQVRJT047DQotDQotICAgICAgICBpZihkZWFjdGl2YXRlQ2xpZW50U2lkZVZhbGlkYXRpb24gPT0gbnVsbCB8fCAhZGVhY3RpdmF0ZUNsaWVudFNpZGVWYWxpZGF0aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBkZWFjdGl2YXRlSW5pdENvcmVPdXRwdXRMYWJlbCA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX1RSSU5JREFEX0NPUkVfT1VUUFVUX0xBQkVMX0lOSVRJQUxJWkFUSU9OOw0KLQ0KLSAgICAgICAgaWYoZGVhY3RpdmF0ZUluaXRDb3JlT3V0cHV0TGFiZWwgPT0gbnVsbCB8fCAhZGVhY3RpdmF0ZUluaXRDb3JlT3V0cHV0TGFiZWwuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIGRlYWN0aXZhdGVUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA9DQotICAgICAgICAgICAgICAgIFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX1RSSU5JREFEX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SOw0KLQ0KLSAgICAgICAgaWYoZGVhY3RpdmF0ZVRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yID09IG51bGwgfHwNCi0gICAgICAgICAgICAgICAgIWRlYWN0aXZhdGVUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKG5ldyBUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vZGVhY3RpdmF0ZSBleHR2YWwgcmVuZGVyZXIgcHJveHkgLSBkdWUgdG8gYW4gaW5jb21wYXRpYmlsaXR5IHdpdGggdGhlIHRhYmxlIHJlbmRlcmVyDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVksIEV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIGlmIHRoZXJlIGFyZSBmdXJ0aGVyIGluY29tcGF0aWJsZSByZW5kZXJlcnMgdXNlIHRoZSBmb2xsb3dpbmcgcXVpY2stZml4Og0KLSAgICAgICAgICogICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVksIG51bGwpOw0KLSAgICAgICAgICAgYXR0ZW50aW9uOiBpdCBjYXVzZXMgZGlyZWN0IGRlbGVnYXRpb24gd2l0aG91dCBhIGNoZWNrIG9mIGRvdWJsZSBpbnZvY2F0aW9ucw0KLSAgICAgICAgICovDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC91dGlsL1RyaW5pZGFkVXRpbHMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdXRpbC9UcmluaWRhZFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NWZlZTUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC91dGlsL1RyaW5pZGFkVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImNoZWNrIHN1YmZvcm0iKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZFV0aWxzDQotew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhUcmluaWRhZFV0aWxzLmNsYXNzKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBVSUNvbXBvbmVudCBmaW5kTGFiZWxlZEVkaXRhYmxlQ29tcG9uZW50KENvcmVPdXRwdXRMYWJlbCBjb3JlT3V0cHV0TGFiZWwpDQotICAgIHsNCi0gICAgICAgIC8vVE9ETw0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFVJQ29tcG9uZW50IHJlc3VsdCA9IGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmZpbmRDb21wb25lbnQoY29yZU91dHB1dExhYmVsLmdldEZvcigpKTsNCi0NCi0gICAgICAgIGlmKHJlc3VsdCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKExPRy5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExPRy50cmFjZShjb3JlT3V0cHV0TGFiZWwuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSArICIgZG9lc24ndCByZWZlcmVuY2UgYW4gZWRpdGFibGUgY29tcG9uZW50Iik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzRiYThhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlIHByb3ZpZGVzIHNwZWNpYWwgVHJpbmlkYWQgU3VwcG9ydCBmb3IgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvci4NCi0gICAgRnVydGhlcm1vcmUsIGl0IGFsbG93cyB0byBqb2luIHRoZSBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIG1lY2hhbmlzbSBvZiBUcmluaWRhZC4gU2FtcGxlIHVzZS1jYXNlOiBhbm5vdGF0ZSB5b3VyIG1vZGVsIHdpdGggSlBBIDEuMCBhbm5vdGF0aW9ucywgYmluZCBwcm9wZXJ0aWVzIHRvIEpTRiBJbnB1dCBjb21wb25lbnRzIGFuZCBnZXQgYXV0b21hdGljIGNsaWVudC1zaWRlIHZhbGlkYXRpb24ganVzdCBieSBhZGRpbmcgMyBKQVIgZmlsZXMgKE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSwgUHJvcGVydHkgVmFsaWRhdGlvbiBhbmQgVHJpbmlkYWQgU3VwcG9ydCkuDQotICANCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEuMS54IGFuZCBKU0YgMS4yLnguIEJvdGggdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ1ZjM0MC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQ29yZTwvbmFtZT4NCi0gICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+DQotDQotICAgIDxzY20+DQotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9jb3JlPC9jb25uZWN0aW9uPg0KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvcmU8L2RldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9jb3JlPC91cmw+DQotICAgIDwvc2NtPg0KLSAgICANCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgPC9yZXNvdXJjZXM+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDRkYzQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiDQotICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjIiPg0KLSAgICA8ZmFjdG9yeT4NCi0gICAgICAgIDxyZW5kZXIta2l0LWZhY3Rvcnk+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcktpdEZhY3Rvcnk8L3JlbmRlci1raXQtZmFjdG9yeT4NCi0gICAgPC9mYWN0b3J5Pg0KLQ0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuRXh0VmFsU3RhcnR1cExpc3RlbmVyPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2Q1ZDFjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLQ0KLS8qKg0KLSAqIGRvbnQndCBtb3ZlIHRvIGFuIG90aGVyIHBhY2thZ2UhISENCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBFeHRWYWxJbmZvcm1hdGlvbg0KLXsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSA9IEV4dFZhbEluZm9ybWF0aW9uLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCWE1MX1BBUkFNX1BSRUZJWCA9IEV4dFZhbEluZm9ybWF0aW9uLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9IENsYXNzVXRpbHMuZ2V0SmFyVmVyc2lvbihFeHRWYWxJbmZvcm1hdGlvbi5jbGFzcyk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9DdXN0b21JbmZvcm1hdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0N1c3RvbUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYjgzMGUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0N1c3RvbUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSX0pDQotcHVibGljIGVudW0gQ3VzdG9tSW5mb3JtYXRpb24NCi17DQotICAgIEJBU0VfUEFDS0FHRSwNCi0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IsDQotDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCwNCi0gICAgVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFX1JFU09MVkVSX1BPU1RGSVgsDQotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYLA0KLQ0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01TR19SRVNPTFZFUl9OQU1FX01BUFBFUiwNCi0gICAgTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIsDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSLA0KLQ0KLSAgICBTVEFSVFVQX0xJU1RFTkVSLA0KLSAgICBDT01QT05FTlRfSU5JVElBTElaRVIsDQotICAgIFZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SLA0KLSAgICBNRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUiwNCi0NCi0gICAgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLA0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksDQotICAgIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksDQotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLA0KLQ0KLSAgICBNRVNTQUdFX0JVTkRMRV9OQU1FLA0KLSAgICBTVEFUSUNfU1RSQVRFR1lfTUFQUElOR19TT1VSQ0UNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHQuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMTBmMDcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUmVuZGVyZXJJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXIuUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5EZWZhdWx0RmFjdG9yeUZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIEV4dFZhbENvbnRleHQKLXsKLSAgICBwcml2YXRlIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgc3RhdGljIEV4dFZhbENvbnRleHQgZXh0VmFsQ29udGV4dCA9IG5ldyBFeHRWYWxDb250ZXh0KCk7Ci0KLSAgICBwcml2YXRlIEZhY3RvcnlGaW5kZXIgZmFjdG9yeUZpbmRlciA9IERlZmF1bHRGYWN0b3J5RmluZGVyLmdldEluc3RhbmNlKCk7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZW5kZXJlckludGVyY2VwdG9yPiByZW5kZXJlckludGVyY2VwdG9ycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUmVuZGVyZXJJbnRlcmNlcHRvcj4oKTsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBkZW5pZWRJbnRlcmNlcHRvcnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICBwcml2YXRlIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcj4gcHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMgPQotICAgICAgICBuZXcgQXJyYXlMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI+KCk7Ci0KLSAgICBwcml2YXRlIExpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+IGNvbXBvbmVudEluaXRpYWxpemVyczsKLSAgICBwcml2YXRlIExpc3Q8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPiB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzOwotICAgIHByaXZhdGUgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGdsb2JhbFByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgIHByaXZhdGUgTWFwPFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcywgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4+IHN0YXRpY0NvbmZpZ01hcAotICAgICAgICA9IG5ldyBIYXNoTWFwPFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcywgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4+KCk7Ci0KLQotICAgIHByaXZhdGUgdm9pZCBsYXp5SW5pdENvbXBvbmVudEluaXRpYWxpemVycygpCi0gICAgewotICAgICAgICBpZih0aGlzLmNvbXBvbmVudEluaXRpYWxpemVycyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmNvbXBvbmVudEluaXRpYWxpemVycyA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+KCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzCi0gICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9JTklUSUFMSVpFUikpOwotCi0gICAgICAgIENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyOwotICAgICAgICBmb3IgKFN0cmluZyBjb21wb25lbnRJbml0aWFsaXplck5hbWUgOiBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyID0KLSAgICAgICAgICAgICAgICAoQ29tcG9uZW50SW5pdGlhbGl6ZXIpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjb21wb25lbnRJbml0aWFsaXplck5hbWUpOwotCi0gICAgICAgICAgICBpZiAoY29tcG9uZW50SW5pdGlhbGl6ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKGNvbXBvbmVudEluaXRpYWxpemVyKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGNvbXBvbmVudEluaXRpYWxpemVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsYXp5SW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgaWYodGhpcy52YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMudmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycyA9IG5ldyBBcnJheUxpc3Q8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPigpOwotICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMKLSAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUik7Ci0gICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMKLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoCi0gICAgICAgICAgICAgICAgICAgIEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SKSk7Ci0KLSAgICAgICAgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsKLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSA6IHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA9Ci0gICAgICAgICAgICAgICAgKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lKTsKLQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMuYWRkKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcik7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxhenlJbml0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMubWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4oKTsKLQotICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IpOwotICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMKLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoCi0gICAgICAgICAgICAgICAgICAgIEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SKSk7Ci0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7Ci0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUgOiBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yID0KLSAgICAgICAgICAgICAgICAoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLmFkZChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEV4dFZhbENvbnRleHQgZ2V0Q29udGV4dCgpCi0gICAgewotICAgICAgICByZXR1cm4gZXh0VmFsQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmFjdG9yeUZpbmRlciBnZXRGYWN0b3J5RmluZGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWN0b3J5RmluZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZhY3RvcnlGaW5kZXIoRmFjdG9yeUZpbmRlciBmYWN0b3J5RmluZGVyKQotICAgIHsKLSAgICAgICAgaWYoZmFjdG9yeUZpbmRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZhY3RvcnlGaW5kZXIgPSBmYWN0b3J5RmluZGVyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UmVuZGVyZXJJbnRlcmNlcHRvcj4gZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8UmVuZGVyZXJJbnRlcmNlcHRvcj4ocmVuZGVyZXJJbnRlcmNlcHRvcnMudmFsdWVzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKEV4dFZhbENvbnRleHQuY2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZW5pZWRJbnRlcmNlcHRvcnMuY29udGFpbnMocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvcnMucHV0KHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpLCByZW5kZXJlckludGVyY2VwdG9yKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihDbGFzcyByZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpCi0gICAgewotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgPQotICAgICAgICAgICAgKFJlbmRlcmVySW50ZXJjZXB0b3IpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcyk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChFeHRWYWxDb250ZXh0LmNsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9ycy5yZW1vdmUocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy9pZiBhbiBpbnRlcmNlcHRvciBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkIHNvIGZhciwgaXQgc2hvdWxkIGJlIGRlbmllZCBhdCBmdXR1cmUgcmVnaXN0cmF0aW9ucwotICAgIHB1YmxpYyB2b2lkIGRlbnlSZW5kZXJlckludGVyY2VwdG9yKENsYXNzIHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcykKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA9Ci0gICAgICAgICAgICAoUmVuZGVyZXJJbnRlcmNlcHRvcikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3MocmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKEV4dFZhbENvbnRleHQuY2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbmllZEludGVyY2VwdG9ycy5hZGQocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpOwotICAgICAgICB9Ci0gICAgICAgIGRlcmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIoQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIpCi0gICAgewotICAgICAgICBsYXp5SW5pdENvbXBvbmVudEluaXRpYWxpemVycygpOwotICAgICAgICB0aGlzLmNvbXBvbmVudEluaXRpYWxpemVycy5hZGQoY29tcG9uZW50SW5pdGlhbGl6ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPiBnZXRDb21wb25lbnRJbml0aWFsaXplcnMoKQotICAgIHsKLSAgICAgICAgbGF6eUluaXRDb21wb25lbnRJbml0aWFsaXplcnMoKTsKLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudEluaXRpYWxpemVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIGxhenlJbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICB0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMuYWRkKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPiBnZXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGxhenlJbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIGxhenlJbml0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5hZGQobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgbGF6eUluaXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyPiBnZXRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycygpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcihQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyIHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIpCi0gICAgewotICAgICAgICB0aGlzLnByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzLmFkZChwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQotICAgIHsKLSAgICAgICAgTWFwIGFwcGxpY2F0aW9uTWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uTWFwKCk7Ci0gICAgICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGJlYW4gPSAoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4pIGFwcGxpY2F0aW9uTWFwLmdldChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUpOwotCi0gICAgICAgIGlmIChiZWFuID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbml0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oYXBwbGljYXRpb25NYXApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotICAgIHByaXZhdGUgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gaW5pdEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKE1hcCBhcHBsaWNhdGlvbk1hcCkKLSAgICB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fSU5GT1JNQVRJT05fUFJPVklERVJfQkVBTik7Ci0gICAgICAgIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lcy5hZGQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQ1VTVE9NX0JFQU4pOwotCi0gICAgICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuOwotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgaWYgKGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXBwbGljYXRpb25NYXAucHV0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSwgaW5mb3JtYXRpb25Qcm92aWRlckJlYW4pOwotICAgICAgICAgICAgICAgIHJldHVybiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeVRvSW5pdEN1c3RvbUNvbmZpZ3VyZWRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZShhcHBsaWNhdGlvbk1hcCk7Ci0KLSAgICAgICAgaWYoYXBwbGljYXRpb25NYXAuY29udGFpbnNLZXkoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbilhcHBsaWNhdGlvbk1hcC5nZXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvSW5pdEN1c3RvbUNvbmZpZ3VyZWRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZShNYXAgYXBwbGljYXRpb25NYXApCi0gICAgewotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBiZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpCi0gICAgICAgICAgICAuZ2V0QmVhbihJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5DVVNUT01fQkVBTi5yZXBsYWNlKCIuIiwgIl8iKSk7Ci0KLSAgICAgICAgaWYoYmVhbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcHBsaWNhdGlvbk1hcC5wdXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FLCBiZWFuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBnZXRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcyBuYW1lKQotICAgIHsKLSAgICAgICAgaWYoIXRoaXMuc3RhdGljQ29uZmlnTWFwLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBzdGF0aWNDb25maWdMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4oKTsKLSAgICAgICAgICAgIHRoaXMuc3RhdGljQ29uZmlnTWFwLnB1dChuYW1lLCBzdGF0aWNDb25maWdMaXN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5zdGF0aWNDb25maWdNYXAuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzIG5hbWUsIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZykKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gc3RhdGljQ29uZmlnTGlzdDsKLSAgICAgICAgICAgIGlmKCF0aGlzLnN0YXRpY0NvbmZpZ01hcC5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0aWNDb25maWdMaXN0ID0gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4oKTsKLSAgICAgICAgICAgICAgICB0aGlzLnN0YXRpY0NvbmZpZ01hcC5wdXQobmFtZSwgc3RhdGljQ29uZmlnTGlzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLnN0YXRpY0NvbmZpZ01hcC5nZXQobmFtZSkuYWRkKHN0YXRpY0NvbmZpZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRHbG9iYWxQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFkZEdsb2JhbFByb3BlcnR5KG5hbWUgLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYWRkR2xvYmFsUHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBmb3JjZU92ZXJyaWRlKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5nbG9iYWxQcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZighZm9yY2VPdmVycmlkZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIm92ZXJyaWRlIGdsb2JhbCBwcm9wZXJ0eSAnIiArIG5hbWUgKyAiJyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuZ2xvYmFsUHJvcGVydGllcy5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2xvYmFsUHJvcGVydGllcy5nZXQobmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwYTNlMi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcmVuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqICsgc29tZSBvZiB0aGVtIGNhbiBiZSBjdXN0b21pemVkIHdpdGhpbiBhIGN1c3RvbSBpbXBsLiBvZiB0aGUgYmVhbg0KLSAqIChleHRlbmQgdGhpcyBjbGFzcyBhbmQgcHJvdmlkZSBpdCB2aWEgY29udmVudGlvbiBvciB3ZWIueG1sKQ0KLSAqIDxwLz4NCi0gKiB0aGUgc3RhdGljIGFwaSBzaG91bGQgb25seSBiZSB1c2VkDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEksIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFQU5fTkFNRSA9IEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FDQotICAgICAgICArICIuIiArIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsNCi0gICAgLy9jdXN0b20gY2xhc3Mgd2hpY2ggaXMgYW4gb3B0aW9uYWwgcmVwbGFjZW1lbnQgZm9yIHRoaXMgY2xhc3MgKGhhcyB0byBleHRlbmQgdGhpcyBjbGFzcykNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0JFQU4gPSAoRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUNCi0gICAgICAgICsgIi5jdXN0b20uIiArIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7DQotDQotICAgIHB1YmxpYyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotDQotICAgICAgICBzZXR1cEN1c3RvbWl6YWJsZUluZm9ybWF0aW9uKCk7DQotICAgICAgICBhcHBseUN1c3RvbVZhbHVlcyh0aGlzLmN1c3RvbWl6YWJsZUluZm9zKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxDdXN0b21JbmZvcm1hdGlvbiwgU3RyaW5nPiBjdXN0b21pemFibGVJbmZvcyA9IG5ldyBIYXNoTWFwPEN1c3RvbUluZm9ybWF0aW9uLCBTdHJpbmc+KCk7DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cEN1c3RvbWl6YWJsZUluZm9ybWF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGJhc2VQYWNrYWdlID0gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9CQVNFX1BBQ0tBR0U7DQotDQotICAgICAgICBpZiAoYmFzZVBhY2thZ2UgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBiYXNlUGFja2FnZSA9IEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsgIi5jdXN0b20uIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghYmFzZVBhY2thZ2UuZW5kc1dpdGgoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBiYXNlUGFja2FnZSA9IGJhc2VQYWNrYWdlICsgIi4iOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkJBU0VfUEFDS0FHRSwgYmFzZVBhY2thZ2UpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SLA0KLSAgICAgICAgICAgICAgICAiQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgsDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uU3RyYXRlZ3kiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfUE9TVEZJWCwNCi0gICAgICAgICAgICAgICAgIk1ldGFEYXRhVHJhbnNmb3JtZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWCwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9JTklUSUFMSVpFUiwNCi0gICAgICAgICAgICAgICAgIkNvbXBvbmVudEluaXRpYWxpemVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IsDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgICAgICAgICAgICAgIk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NU0dfUkVTT0xWRVJfTkFNRV9NQVBQRVIsDQotICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIsDQotICAgICAgICAgICAgIk1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIsDQotICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5TVEFSVFVQX0xJU1RFTkVSLA0KLSAgICAgICAgICAgICAgICAiU3RhcnR1cExpc3RlbmVyIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiTWVzc2FnZVJlc29sdmVyRmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSIpOw0KLQ0KLSAgICAgICAgLy9jb252ZW50aW9ucyAodGhlIHJlc3Qgb2YgdGhlIGNvbnZlbnRpb25zIGFyZSBidWlsdCB3aXRoIHRoZSBoZWxwIG9mIG5hbWUgbWFwcGVycywuLi4NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX0JVTkRMRV9OQU1FLA0KLSAgICAgICAgICAgICAgICAidmFsaWRhdGlvbl9tZXNzYWdlcyIpOw0KLSAgICAgICAgLy9zdGF0aWMgc3RyYXRlZ3kgbWFwcGluZ3MgKG5hbWUgb2YgcHJvcGVydHkgZmlsZXMpDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFLA0KLSAgICAgICAgICAgICAgICAic3RyYXRlZ3lfbWFwcGluZ3MiKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcHBseUN1c3RvbVZhbHVlcyhNYXA8Q3VzdG9tSW5mb3JtYXRpb24sIFN0cmluZz4gbWFwKQ0KLSAgICB7DQotICAgICAgICAvL292ZXJyaWRlIHRvIGN1c3RvbWl6ZSBpbmZvcm1hdGlvbg0KLSAgICB9DQotDQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0KEN1c3RvbUluZm9ybWF0aW9uIGN1c3RvbUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBjdXN0b21pemFibGVJbmZvcy5nZXQoY3VzdG9tSW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgc3dpdGNoIChjdXN0b21JbmZvcm1hdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjYXNlIEJBU0VfUEFDS0FHRToNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICogcG9zdGZpeCB1c2VkIGJ5IHRoZSBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgICAgICAgICAgICogdGhlIFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgaXMgZm9yIGN1c3RvbSBzdHJhdGVnaWVzIG9ubHkNCi0gICAgICAgICAgICAgKiAobm90IGZvciBwdWJsaWMgdmFsaWRhdGlvbiBtb2R1bGVzKQ0KLSAgICAgICAgICAgICAqIHNvIGl0J3MgZmluZSB0byBjdXN0b21pemUgaXQNCi0gICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICBjYXNlIFZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFX1JFU09MVkVSX1BPU1RGSVg6DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbWl6YWJsZUluZm9zLmdldChDdXN0b21JbmZvcm1hdGlvbi5CQVNFX1BBQ0tBR0UpICsgdmFsdWU7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5Zjg2OS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TW9kdWxlTWVzc2FnZUJ1bmRsZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbmV3UGFja2FnZU5hbWU7DQotICAgICAgICBpZiAocGFja2FnZU5hbWUuZW5kc1dpdGgoIi5yZXNvbHZlciIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5ld1BhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUucmVwbGFjZSgiLnJlc29sdmVyIiwgIi5idW5kbGUiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBuZXdQYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lLnJlcGxhY2UoIi5yZXNvbHZlci4iLCAiLmJ1bmRsZS4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXdQYWNrYWdlTmFtZSArICIudmFsaWRhdGlvbl9tZXNzYWdlcyI7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHVzZSBhIGN1c3RvbSBuYW1lIG1hcHBlciB0byBpbXBsZW1lbnQgY3VzdG9tIGNvbnZlbnRpb25zDQotICAgICAqLw0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VSZXNvbHZlckNsYXNzTmFtZSgNCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLCBTdHJpbmcgdGFyZ2V0Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLCAiLm1lc3NhZ2UucmVzb2x2ZXIuIiwgdGFyZ2V0Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKA0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsICIubWV0YWRhdGEudHJhbnNmb3JtZXIuIiwgdGFyZ2V0Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldFBhY2thZ2VOYW1lLCBTdHJpbmcgdGFyZ2V0Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0TmFtZSgpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLnJlcGxhY2UoIi5zdHJhdGVneS4iLCB0YXJnZXRQYWNrYWdlTmFtZSk7DQotDQotICAgICAgICBpZiAodGFyZ2V0Q2xhc3NOYW1lID09IG51bGwgfHwgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgPT0gLTEpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lDQotICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikpICsgIi4iICsgdGFyZ2V0Q2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB1c2UgYSBjdXN0b20gbmFtZSBtYXBwZXIgdG8gaW1wbGVtZW50IGN1c3RvbSBjb252ZW50aW9ucw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneU5hbWUsICJWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIiKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUtleS5yZXBsYWNlKCIuYW5ub3RhdGlvbi4iLCAiLnN0cmF0ZWd5LiIpICsgIlN0cmF0ZWd5IjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneU5hbWUsICJNZXRhRGF0YVRyYW5zZm9ybWVyIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgdGFyZ2V0UG9zdGZpeCkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUuZW5kc1dpdGgoIlZhbGlkYXRpb25TdHJhdGVneSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLnN1YnN0cmluZygwLCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLmxlbmd0aCgpIC0gMTgpICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUuZW5kc1dpdGgoIlN0cmF0ZWd5IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneU5hbWUuc3Vic3RyaW5nKDAsIHZhbGlkYXRpb25TdHJhdGVneU5hbWUubGVuZ3RoKCkgLSA4KSArIHRhcmdldFBvc3RmaXg7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArIHRhcmdldFBvc3RmaXg7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTczMDRjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFyZW4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICAvKg0KLSAgICAgKiBtaXNjDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVNTQUdFX0JVTkRMRSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FU1NBR0VfQlVORExFIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0JBU0VfUEFDS0FHRSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0JBU0VfUEFDS0FHRSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9JTkZPUk1BVElPTl9QUk9WSURFUl9CRUFOID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fSU5GT1JNQVRJT05fUFJPVklERVJfQkVBTiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OX1NUUkFURUdZX01BUFBJTkcgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9TVEFUSUNfVkFMSURBVElPTl9TVFJBVEVHWV9NQVBQSU5HIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NPTVBPTkVOVF9JTklUSUFMSVpFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0NPTVBPTkVOVF9JTklUSUFMSVpFUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IiKTsNCi0NCi0gICAgLyoNCi0gICAgICogbmFtZSBtYXBwZXINCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIiKTsNCi0NCi0gICAgLyoNCi0gICAgICogZmFjdG9yaWVzDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkiKTsNCi0NCi0gICAgLyoNCi0gICAgICogZGVhY3RpdmF0ZQ0KLSAgICAgKi8NCi0gICAgQERlcHJlY2F0ZWQNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX1JFTkRFUktJVCA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9SRU5ERVJLSVQiKTsNCi0NCi0gICAgLy9jdXJyZW50bHkganVzdCB1c2VkIGJ5IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfREVGQVVMVF9DT05WRU5USU9OIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9ERUZBVUxUX05BTUVfTUFQUEVSUyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9ERUZBVUxUX05BTUVfTUFQUEVSUyIpOw0KLSAgICANCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0VMX1JFU09MVkVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0VMX1JFU09MVkVSIik7DQotDQotICAgIC8vdGhlcmUgaXMgbm90aGluZyBsaWtlIERFQUNUSVZBVEVfREVGQVVMVF9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SDQotICAgIC8vdXNlIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmRlbnlSZW5kZXJlckludGVyY2VwdG9yKC4uLikgd2l0aGluIGFuIGV4dHZhbC1TdGFydHVwTGlzdGVuZXINCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0Fic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE0M2YyNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBkZXRhaWxzDQotICogQHNlZSBEZWZhdWx0RUxIZWxwZXINCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5IGN1c3RvbUVMSGVscGVyRmFjdG9yeTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21FTEhlbHBlckZhY3RvcnkoQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkgZWxIZWxwZXJGYWN0b3J5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmN1c3RvbUVMSGVscGVyRmFjdG9yeSA9IGVsSGVscGVyRmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgZmluYWwgRUxIZWxwZXIgY3JlYXRlKCkNCi0gICAgew0KLSAgICAgICAgRUxIZWxwZXIgcmVzdWx0ID0gbnVsbDsNCi0NCi0gICAgICAgIGlmKHRoaXMuY3VzdG9tRUxIZWxwZXJGYWN0b3J5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5jdXN0b21FTEhlbHBlckZhY3RvcnkuY3JlYXRlRUxIZWxwZXIoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVFTEhlbHBlcigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRUxIZWxwZXIgY3JlYXRlRUxIZWxwZXIoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjAzNjEzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb247DQotaW1wb3J0IGphdmF4LmVsLkVMQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nOw0KLWltcG9ydCBqYXZhLmlvLkV4dGVybmFsaXphYmxlOw0KLQ0KLS8qKg0KLSAqIGluIG9yZGVyIHRvIGNlbnRyYWxpemUgdGhlIGpzZiB2ZXJzaW9uIGRlcGVuZGVuY3kgd2l0aGluIHRoZSBjb3JlDQotICoNCi0gKiB0aGlzIGVsLWhlbHBlciBzdXBwb3J0cyBqc3AgYW5kIGZhY2VsZXRzICh0ZXN0ZWQgd2l0aCAxLjEuMTQpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIHRoZXJlIGlzIGEgc3BlY2lhbCBmYWNlbGV0cyB3b3JrYXJvdW5kIGZvciBlbC1leHByZXNzaW9ucyBvZiBjdXN0b20gY29tcG9uZW50cw0KLSAqIGl0J3MgcGx1Z2dhYmxlIGluIG9yZGVyIHRvIHN1cHBvcnQgc3BlY2lhbCBtZWNoYW5pc21zIG9mIGRpZmZlcmVudCB0ZWNobm9sb2dpZXMgKHRoYW4ganNwIGFuZCBmYWNlbGV0cykNCi0gKiBzbyB5b3UgY2FuIHBsdWcgaW4geW91ciBvd24gaW1wbC4gd2hpY2ggaW1wbGVtZW50cyBhIGN1c3RvbSB3b3JrYXJvdW5kIChsaWtlIHRoZSBmYWNlbGV0cyB3b3JrYXJvdW5kIG9mIHRoaXMgaW1wbC4pDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEVMSGVscGVyIGltcGxlbWVudHMgRUxIZWxwZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0VMX1JFU09MVkVSID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfRUxfUkVTT0xWRVI7DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0RUxIZWxwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgLy9kdWUgdG8gYSByZXN0cmljdGlvbiB3aXRoIHRoZSByaQ0KLSAgICAgICAgT2JqZWN0IGJlYW4gPSBnZXRWYWx1ZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgcmV0dXJuIChiZWFuICE9IG51bGwpID8gYmVhbi5nZXRDbGFzcygpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oU3RyaW5nIGJlYW5OYW1lKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgcmV0dXJuIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmdldEVMUmVzb2x2ZXIoKS5nZXRWYWx1ZShmYWNlc0NvbnRleHQuZ2V0RUxDb250ZXh0KCksIG51bGwsIGJlYW5OYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKHZhbHVlQmluZGluZ0V4cHJlc3Npb24gIT0gbnVsbCkgPyBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5ldmFsdWF0ZUV4cHJlc3Npb25HZXQoDQotICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgT2JqZWN0LmNsYXNzKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZXZhbHVhdGVFeHByZXNzaW9uR2V0KGZhY2VzQ29udGV4dCwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgT2JqZWN0LmNsYXNzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gZ2V0VmFsdWVCaW5kaW5nRXhwcmVzc2lvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgYm9vbGVhbiBhbGxvd0JsYW5rQ2hhcmFjdGVycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBnZXRPcmlnaW5hbFZhbHVlQmluZGluZ0V4cHJlc3Npb24odWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgLy9mb3IgaW5wdXQgY29tcG9uZW50cyB3aXRob3V0IHZhbHVlLWJpbmRpbmcNCi0gICAgICAgIC8vKGUuZy4gZm9yIHNwZWNpYWwgY29tcG9uZW50IGxpYnMgLT4gaXNzdWUgd2l0aCBFeHRWYWxSZW5kZXJlcldyYXBwZXIjZW5jb2RlQmVnaW4pDQotICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LmdldENsYXNzKCkgKyAiIGhhcyBubyB2YWx1ZSBiaW5kaW5nIC0gY29tcG9uZW50IGlkOiAiICsgdWlDb21wb25lbnQuZ2V0SWQoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoIWFsbG93QmxhbmtDaGFyYWN0ZXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2UoIiAiLCAiIik7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbikuZ2V0QmFzZUV4cHJlc3Npb24oKSkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlc3VsdCA9IEZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlci4NCi0gICAgICAgICAgICAgICAgdHJ5VG9DcmVhdGVWYWx1ZUJpbmRpbmdGb3JGYWNlbGV0c0JpbmRpbmcodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IHJlc29sdmUgZXhwcmVzc2lvbjogIiArIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCByZXN1bHQuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotDQotICAgICAgICAgICAgaWYoZW50aXR5Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCByZXNvbHZlIGV4cHJlc3Npb246ICIgKyByZXN1bHQuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvcGVydHlEZXRhaWxzIGdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZigidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShERUFDVElWQVRFX0VMX1JFU09MVkVSKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlEZXRhaWxzVmlhUmVmbGVjdGlvbkZhbGxiYWNrKHVpQ29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBFeHRWYWxFTFJlc29sdmVyIGVsUmVzb2x2ZXIgPSBuZXcgRXh0VmFsRUxSZXNvbHZlcihmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5nZXRFTFJlc29sdmVyKCkpOw0KLSAgICAgICAgRUxDb250ZXh0IGVsQ29udGV4dCA9IEV4dFZhbEVMUmVzb2x2ZXIuY3JlYXRlQ29udGV4dFdyYXBwZXIoZmFjZXNDb250ZXh0LmdldEVMQ29udGV4dCgpLCBlbFJlc29sdmVyKTsNCi0NCi0gICAgICAgIFZhbHVlRXhwcmVzc2lvbiB2YWx1ZUV4cHJlc3Npb24gPSB1aUNvbXBvbmVudC5nZXRWYWx1ZUV4cHJlc3Npb24oInZhbHVlIik7DQotDQotICAgICAgICBpZih2YWx1ZUV4cHJlc3Npb24gPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbHVlRXhwcmVzc2lvbi5zZXRWYWx1ZShlbENvbnRleHQsIG51bGwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICJlcnJvciBhdCBiaW5kaW5nOiAiICsgdmFsdWVFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSArDQotICAgICAgICAgICAgICAgICIgLS0gYW4gZWwtcmVzb2x2ZXIgZXJyb3Igb2NjdXJyZWQhIG1heWJlIHlvdSB1c2VkIGFuIGludmFsaWQgYmluZGluZy4gb3RoZXJ3aXNlOiAiICsNCi0gICAgICAgICAgICAgICAgInBsZWFzZSByZXBvcnQgdGhlIGlzc3VlLCBkZWFjdGl2YXRlIHRoZSBlbC1yZXNvdmxlciBvZiBleHR2YWwgdmlhIHdlYi54bWwgY29udGV4dC1wYXJhbTogIiArDQotICAgICAgICAgICAgICAgIEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVggKyAiLkRFQUNUSVZBVEVfRUxfUkVTT0xWRVIiICsNCi0gICAgICAgICAgICAgICAgIiBhbmQgdGVzdCBhZ2Fpbi4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGVsUmVzb2x2ZXIuZ2V0UGF0aCgpID09IG51bGwgfHwgZWxSZXNvbHZlci5nZXRCYXNlT2JqZWN0KCkgPT0gbnVsbCB8fCBlbFJlc29sdmVyLmdldFByb3BlcnR5KCkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlEZXRhaWxzKGVsUmVzb2x2ZXIuZ2V0UGF0aCgpLCBlbFJlc29sdmVyLmdldEJhc2VPYmplY3QoKSwgZWxSZXNvbHZlci5nZXRQcm9wZXJ0eSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNWaWFSZWZsZWN0aW9uRmFsbGJhY2soVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IGdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24odWlDb21wb25lbnQsIGZhbHNlKTsNCi0NCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24gPQ0KLSAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIFN0cmluZyBwYXRoID0gbnVsbDsNCi0NCi0gICAgICAgIHdoaWxlKGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihwYXRoID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwYXRoID0gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcGF0aCA9IGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkgKyAiLiIgKyBwYXRoOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBwYXRoID0gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSArICIuIiArIHBhdGg7DQotDQotICAgICAgICBPYmplY3QgYmFzZU9iamVjdCA9IGdldFZhbHVlT2ZFeHByZXNzaW9uKA0KLSAgICAgICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscyhwYXRoLCBiYXNlT2JqZWN0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLSAgICB9DQotDQotICAgIHN0YXRpYyBTdHJpbmcgZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBWYWx1ZUV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uID0gdWlDb21wb25lbnQuZ2V0VmFsdWVFeHByZXNzaW9uKCJ2YWx1ZSIpOw0KLQ0KLSAgICAgICAgcmV0dXJuICh2YWx1ZUV4cHJlc3Npb24gIT0gbnVsbCkgPyB2YWx1ZUV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VMVGVybVdlbGxGb3JtZWQoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgVmFsdWVCaW5kaW5nIHx8IG8gaW5zdGFuY2VvZiBFeHRlcm5hbGl6YWJsZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcyA9IG8udG9TdHJpbmcoKTsNCi0gICAgICAgIHJldHVybiAoKHMuY29udGFpbnMoIiMiKSB8fCBzLmNvbnRhaW5zKCIkIikpICYmIHMuY29udGFpbnMoInsiKSAmJiBzLmNvbnRhaW5zKCJ9IikpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmluZGluZ09mQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHVpQ29tcG9uZW50LmdldFZhbHVlRXhwcmVzc2lvbihuYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmZTU2Yy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RUxIZWxwZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkNCi17DQotICAgIHByaXZhdGUgRUxIZWxwZXIgZWxIZWxwZXIgPSBuZXcgRGVmYXVsdEVMSGVscGVyKCk7DQotICAgIA0KLSAgICBwcm90ZWN0ZWQgRUxIZWxwZXIgY3JlYXRlRUxIZWxwZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5lbEhlbHBlcjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRUxIZWxwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FTEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWIyNTUzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FTEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIGluIG9yZGVyIHRvIGNlbnRyYWxpemUgdGhlIGpzZiB2ZXJzaW9uIGRlcGVuZGVuY3kgd2l0aGluIHRoZSBjb3JlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIEVMSGVscGVyDQotew0KLSAgICBPYmplY3QgZ2V0QmVhbihTdHJpbmcgYmVhbk5hbWUpOw0KLQ0KLSAgICBPYmplY3QgZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0NCi0gICAgQ2xhc3MgZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLQ0KLSAgICBQcm9wZXJ0eURldGFpbHMgZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpOw0KLQ0KLSAgICBib29sZWFuIGlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLQ0KLSAgICBib29sZWFuIGlzRUxUZXJtV2VsbEZvcm1lZChPYmplY3Qgbyk7DQotDQotICAgIE9iamVjdCBnZXRCaW5kaW5nT2ZDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBuYW1lKTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0V4dFZhbEVMUmVzb2x2ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FeHRWYWxFTFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNmMzZDMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0V4dFZhbEVMUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsKLQotaW1wb3J0IGphdmF4LmVsLkVMUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0OwotaW1wb3J0IGphdmF4LmVsLlZhcmlhYmxlTWFwcGVyOwotaW1wb3J0IGphdmF4LmVsLkZ1bmN0aW9uTWFwcGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEuYmVhbnMuRmVhdHVyZURlc2NyaXB0b3I7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGNsYXNzIEV4dFZhbEVMUmVzb2x2ZXIgZXh0ZW5kcyBFTFJlc29sdmVyCi17Ci0gICAgcHJpdmF0ZSBFTFJlc29sdmVyIHdyYXBwZWQ7Ci0gICAgcHJpdmF0ZSBPYmplY3QgYmFzZU9iamVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKLSAgICAvL2Zvcm1zIHRoZSBpZCBmb3IgY3Jvc3MtdmFsaWRhdGlvbiB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXhwcmVzc2lvbjsKLQotICAgIHB1YmxpYyBFeHRWYWxFTFJlc29sdmVyKEVMUmVzb2x2ZXIgZWxSZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IGVsUmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRCYXNlT2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpCi0gICAgewotICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpCi0gICAgewotICAgICAgICB0aGlzLmJhc2VPYmplY3QgPSBudWxsOwotICAgICAgICB0aGlzLnByb3BlcnR5ID0gbnVsbDsKLSAgICAgICAgdGhpcy5leHByZXNzaW9uID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBiYXNlLCBPYmplY3QgcHJvcGVydHkpCi0gICAgewotICAgICAgICBpZih0aGlzLmV4cHJlc3Npb24gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uID0gKFN0cmluZylwcm9wZXJ0eTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbiArPSAiLiIgKyBwcm9wZXJ0eTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRWYWx1ZShlbENvbnRleHQsIGJhc2UsIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0VHlwZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbywgT2JqZWN0IG8xKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0VHlwZShlbENvbnRleHQsIG8sIG8xKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbywgT2JqZWN0IG8xLCBPYmplY3QgbzIpCi0gICAgewotICAgICAgICBleHByZXNzaW9uICs9ICIuIiArIG8xOwotICAgICAgICBwcm9wZXJ0eSA9IChTdHJpbmcpbzE7Ci0gICAgICAgIGJhc2VPYmplY3QgPSBvOwotICAgICAgICBlbENvbnRleHQuc2V0UHJvcGVydHlSZXNvbHZlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvLCBPYmplY3QgbzEpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5pc1JlYWRPbmx5KGVsQ29udGV4dCwgbywgbzEpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxGZWF0dXJlRGVzY3JpcHRvcj4gZ2V0RmVhdHVyZURlc2NyaXB0b3JzKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0RmVhdHVyZURlc2NyaXB0b3JzKGVsQ29udGV4dCwgbyk7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzPD8+IGdldENvbW1vblByb3BlcnR5VHlwZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbykKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENvbW1vblByb3BlcnR5VHlwZShlbENvbnRleHQsIG8pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRUxDb250ZXh0IGNyZWF0ZUNvbnRleHRXcmFwcGVyKGZpbmFsIEVMQ29udGV4dCBjb250ZXh0LCBmaW5hbCBFTFJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFTENvbnRleHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRMb2NhbGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVJlc29sdmVkKGJvb2xlYW4gdmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuc2V0UHJvcGVydHlSZXNvbHZlZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRQcm9wZXJ0eVJlc29sdmVkKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwdXRDb250ZXh0KENsYXNzIGNsYXp6LCBPYmplY3Qgb2JqZWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyLnB1dENvbnRleHQoY2xhenosIG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5wdXRDb250ZXh0KGNsYXp6LCBvYmplY3QpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udGV4dChDbGFzcyBjbGF6eikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRDb250ZXh0KGNsYXp6KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvY2FsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlci5zZXRMb2NhbGUobG9jYWxlKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldExvY2FsZShsb2NhbGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBFTFJlc29sdmVyIGdldEVMUmVzb2x2ZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgRnVuY3Rpb25NYXBwZXIgZ2V0RnVuY3Rpb25NYXBwZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldEZ1bmN0aW9uTWFwcGVyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFZhcmlhYmxlTWFwcGVyIGdldFZhcmlhYmxlTWFwcGVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRWYXJpYWJsZU1hcHBlcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0ZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0ZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjAxNDYxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogSGVscGVyIGNsYXNzIHRvIGdldCB0aGUgcmVhbC9mdWxsIHZhbHVlIGJpbmRpbmcgLSB0ZXN0ZWQgd2l0aCBmYWNlbGV0cyAxLjEuMTQNCi0gKiBUaGUgdGFyZ2V0IGlzIHRvIGdldCByaWQgb2YgdGhpcyBpbXBsLiAtIGN1cnJlbnRseSBpdCdzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IGN1c3RvbSBmYWNlbGV0cyBjb21wb25lbnRzLg0KLSAqIEFuIGFsdGVybmF0aXZlIHdvdWxkIGJlIGFuIEVMLVJlc29sdmVyIC0gdGhlcmUgYXJlIHN0aWxsIHNvbWUgb3BlbiBpc3N1ZXMgd2l0aCBzdWNoIGFuIGFwcHJvYWNoDQotICogKyBJdCBpc24ndCBhdmFpbGFibGUgd2l0aCBKU0YgMS4xLngNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9DcmVhdGVWYWx1ZUJpbmRpbmdGb3JGYWNlbGV0c0JpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBEZWZhdWx0RUxIZWxwZXIuZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEJpbmRpbmdzID0gZXh0cmFjdEVMVGVybXMoDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmluZGluZ09mQ29tcG9uZW50KHVpQ29tcG9uZW50LCAidmFsdWUiKSk7DQotDQotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZT0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIDEpICsgInsiICsgY3JlYXRlQmluZGluZyhmb3VuZEJpbmRpbmdzLCBtYXBwZWRGYWNlbGV0c1ZhcnMpICsgIn0iKTsNCi0NCi0gICAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YmUuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotDQotICAgICAgICAgICAgaWYoZW50aXR5Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnlUb1JlcGxhY2VWYXJzKHZiZSwgbWFwcGVkRmFjZWxldHNWYXJzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHZiZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVCaW5kaW5nKExpc3Q8U3RyaW5nPiBleHByZXNzaW9ucywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkZWRWaXJ0dWFsTmFtZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGVudHJ5IDogZXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoIlZhbHVlRXhwcmVzc2lvblsiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBmb3VuZEJpbmRpbmdEZXRhaWxzID0gZW50cnkuc3BsaXQoIiAiKTsNCi0gICAgICAgICAgICBpbmRleE9mQmluZGluZ0RldGFpbHMgPSBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKGZvdW5kQmluZGluZ0RldGFpbHMpOw0KLQ0KLSAgICAgICAgICAgIGlmIChpbmRleE9mQmluZGluZ0RldGFpbHMgPT0gLTEpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgYmluZGluZ0RldGFpbHMgPSBmb3VuZEJpbmRpbmdEZXRhaWxzW2luZGV4T2ZCaW5kaW5nRGV0YWlsc10uc3BsaXQoIj0iKTsNCi0NCi0gICAgICAgICAgICBpZiAoYmluZGluZ0RldGFpbHMubGVuZ3RoIDwgMikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGJpbmRpbmdEZXRhaWxzWzFdOw0KLQ0KLSAgICAgICAgICAgIC8vdG8gc3VwcG9ydCBibGFua3Mgd2l0aGluIGEgYmluZGluZyB3aXRoIG1hcCBzeW50YXgNCi0gICAgICAgICAgICBpZihjdXJyZW50QmluZGluZy5jb250YWlucygieyIpICYmICFjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgPSBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKGN1cnJlbnRCaW5kaW5nLCBmb3VuZEJpbmRpbmdEZXRhaWxzLCBpbmRleE9mQmluZGluZ0RldGFpbHMpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnNLZXkoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5wdXQoYmluZGluZ0RldGFpbHNbMF0sIGN1cnJlbnRCaW5kaW5nKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvL2VudHJ5IGZvciAidmlydHVhbCIgZmFjZWxldHMgdmFyDQotICAgICAgICAgICAgaWYoIShjdXJyZW50QmluZGluZy5jb250YWlucygieyIpIHx8IGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhcnMucHV0KGJpbmRpbmdEZXRhaWxzWzBdLCBiaW5kaW5nRGV0YWlsc1sxXS5zdWJzdHJpbmcoMSwgYmluZGluZ0RldGFpbHNbMV0ubGVuZ3RoKCktMikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBvcmlnaW5hbEJpbmRpbmcgPSBhZGRlZFZpcnR1YWxOYW1lcy5nZXQoInZhbHVlIik7DQotICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcuc3Vic3RyaW5nKG9yaWdpbmFsQmluZGluZy5pbmRleE9mKCJ7IikgKyAxLCBvcmlnaW5hbEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLnJlbW92ZSgidmFsdWUiKTsNCi0gICAgICAgIHJldHVybiB0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcob3JpZ2luYWxCaW5kaW5nLCBhZGRlZFZpcnR1YWxOYW1lcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRyeVRvVHJhbnNmb3JtVG9SZWFsQmluZGluZyhTdHJpbmcgb3JpZ2luYWxCaW5kaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZGVkVmlydHVhbE5hbWVzKQ0KLSAgICB7DQotICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSAiI3siICsgb3JpZ2luYWxCaW5kaW5nICsgIn0iOw0KLSAgICAgICAgSXRlcmF0b3IgbmFtZUl0ZXJhdG9yID0gYWRkZWRWaXJ0dWFsTmFtZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsNCi0NCi0gICAgICAgIFN0cmluZyBjdXJyZW50S2V5Ow0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRWYWx1ZTsNCi0gICAgICAgIHdoaWxlKG5hbWVJdGVyYXRvci5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudEtleSA9IChTdHJpbmcpIG5hbWVJdGVyYXRvci5uZXh0KCk7DQotICAgICAgICAgICAgY3VycmVudFZhbHVlID0gYWRkZWRWaXJ0dWFsTmFtZXMuZ2V0KGN1cnJlbnRLZXkpOw0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoY3VycmVudFZhbHVlLmluZGV4T2YoInsiKSArIDEsIGN1cnJlbnRWYWx1ZS5pbmRleE9mKCJ9IikpOw0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJ7IiArIGN1cnJlbnRLZXkgKyAiLiIsICJ7IiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICIuIiwgIi4iICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIl0iLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiXSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG9yaWdpbmFsQmluZGluZy5zdWJzdHJpbmcoMiwgb3JpZ2luYWxCaW5kaW5nLmxlbmd0aCgpIC0gMSk7DQotICAgIH0NCi0NCi0gICAgLy90byBzdXBwb3J0IGJsYW5rcyAtIGUuZy4gd2l0aCBtYXAgc3ludGF4DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKFN0cmluZyBjdXJyZW50QmluZGluZywgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlscykNCi0gICAgew0KLSAgICAgICAgZm9yKGludCBpID0gaW5kZXhPZkJpbmRpbmdEZXRhaWxzICsgMTsgaSA8IGZvdW5kQmluZGluZ0RldGFpbHMubGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgKz0gZm91bmRCaW5kaW5nRGV0YWlsc1tpXTsNCi0gICAgICAgICAgICBpZihmb3VuZEJpbmRpbmdEZXRhaWxzW2ldLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEJpbmRpbmc7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRCaW5kaW5nOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBpbnQgY291bnQgPSAwOw0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBiaW5kaW5nRGV0YWlscykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuY29udGFpbnMoIj0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY291bnQrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZXh0cmFjdEVMVGVybXMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlRUxUZXJtcyhvLCBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKSwgZm91bmRFTFRlcm1zLCAwKSA+IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRFTFRlcm1zOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcmVzb2x2ZUVMVGVybXMoT2JqZWN0IG8sIE1hcDxPYmplY3QsIE9iamVjdD4gdmlzaXRlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMsIGludCBjb3VudCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAobyA9PSBudWxsIHx8IHZpc2l0ZWQuY29udGFpbnNLZXkobykgfHwgY291bnQgPiA1MCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZpc2l0ZWQucHV0KG8sIG51bGwpOw0KLQ0KLSAgICAgICAgaW50IGVsQ291bnQgPSAwOw0KLSAgICAgICAgQ2xhc3MgYyA9IG8uZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIC8vaW5zcGVjdCBtYXBzDQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1hcCkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBmb3IgKE9iamVjdCBlbnRyeSA6ICgoTWFwKSBvKS52YWx1ZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZm91bmQgZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICAgICAgaWYoZW50cnkudG9TdHJpbmcoKS5jb250YWlucygiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKGVudHJ5LnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoZW50cnksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGVsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQobykpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gKytlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9hbmFseXplIGFycmF5cw0KLSAgICAgICAgaWYgKGMuaXNBcnJheSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgobyk7DQotICAgICAgICAgICAgLy9jaGVjayBhcnJheSBbTCAtPiBubyBhcnJheSBvZiBwcmltaXRpdmUgdHlwZXMNCi0gICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMamF2YS5sYW5nLlN0cmluZyIpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChBcnJheS5nZXQobywgaSkpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKEFycmF5LmdldChvLCBpKSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxGaWVsZD4gYXR0cmlidXRlcyA9IGZpbmRBbGxBdHRyaWJ1dGVzKGMsIG5ldyBBcnJheUxpc3Q8RmllbGQ+KCkpOw0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBhdHRyaWJ1dGVzLnRvQXJyYXkobmV3IEZpZWxkW2F0dHJpYnV0ZXMuc2l6ZSgpXSk7DQotDQotICAgICAgICBBY2Nlc3NpYmxlT2JqZWN0LnNldEFjY2Vzc2libGUoZmllbGRzLCB0cnVlKTsNCi0gICAgICAgIGZvciAoRmllbGQgY3VycmVudEZpZWxkIDogZmllbGRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQuZ2V0KG8pID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5nZXRUeXBlKCkuZXF1YWxzKFN0cmluZy5jbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmdldChvKSAhPSBudWxsICYmIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKGN1cnJlbnRGaWVsZC5nZXQobykpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFjdXJyZW50RmllbGQuZ2V0VHlwZSgpLmlzUHJpbWl0aXZlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKGN1cnJlbnRGaWVsZC5nZXQobyksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZWxDb3VudDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEZpZWxkPiBmaW5kQWxsQXR0cmlidXRlcyhDbGFzcyBjLCBMaXN0PEZpZWxkPiBhdHRyaWJ1dGVzKQ0KLSAgICB7DQotICAgICAgICBpZiAoYyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluZEFsbEF0dHJpYnV0ZXMoYy5nZXRTdXBlcmNsYXNzKCksIGF0dHJpYnV0ZXMpOw0KLQ0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBjLmdldERlY2xhcmVkRmllbGRzKCk7DQotICAgICAgICBmb3IgKEZpZWxkIGN1cnJlbnRGaWVsZCA6IGZpZWxkcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzU3RhdGljKGN1cnJlbnRGaWVsZC5nZXRNb2RpZmllcnMoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChjdXJyZW50RmllbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9SZXBsYWNlVmFycyhWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eTsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0gICAgICAgIGJvb2xlYW4gbGFzdCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgd2hpbGUodHJ1ZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxhc3QgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0NCi0gICAgICAgICAgICBwcm9wZXJ0eSA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbg0KLSAgICAgICAgICAgICAgICAucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIGdldE5ld1Byb3BlcnR5KHByb3BlcnR5LCBtYXBwZWRGYWNlbGV0c1ZhcnMpKTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQubGVuZ3RoKCkgPT0gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpICsgIi4iICsgcmVzdWx0Ow0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpOw0KLQ0KLSAgICAgICAgICAgIGlmKGxhc3QpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcmVmaXgoKSArICJ7IiArIHJlc3VsdCArICJ9Iik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5ld1Byb3BlcnR5KFN0cmluZyBvbGRQcm9wZXJ0eSwgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFycyA9IGdldFBvdGVudGlhbFZpcnR1YWxWYXJzKG9sZFByb3BlcnR5KTsNCi0NCi0gICAgICAgIGZvcihTdHJpbmcgdmlydHVhbFZhciA6IHZpcnR1YWxWYXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1hcHBlZEZhY2VsZXRzVmFycy5jb250YWluc0tleSh2aXJ0dWFsVmFyKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG9sZFByb3BlcnR5ID0gcmVwbGFjZVByb3BlcnR5VmFsdWUob2xkUHJvcGVydHksIHZpcnR1YWxWYXIsIG1hcHBlZEZhY2VsZXRzVmFycy5nZXQodmlydHVhbFZhcikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvbGRQcm9wZXJ0eTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0UG90ZW50aWFsVmlydHVhbFZhcnMoU3RyaW5nIG9sZFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpbnQgc3RhcnQgPSAtMTsNCi0gICAgICAgIGludCBlbmQgPSAtMTsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG9sZFByb3BlcnR5Lmxlbmd0aCgpOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoc3RhcnQgPT0gLSAxICYmIG9sZFByb3BlcnR5LmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKChzdGFydCAhPSAtIDEgJiYgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICdbJykgfHwgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICddJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGVuZCA9IGk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKHN0YXJ0ICE9IC0xICYmIGVuZCAhPSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJMaXN0LmFkZChvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOw0KLSAgICAgICAgICAgICAgICBpZihvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbmQgPSAtMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlydHVhbFZhckxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcGxhY2VQcm9wZXJ0eVZhbHVlKFN0cmluZyBvbGRQcm9wZXJ0eSwgU3RyaW5nIHRhcmdldFZhciwgU3RyaW5nIG5ld1ZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpbnQgaW5kZXggPSBvbGRQcm9wZXJ0eS5pbmRleE9mKHRhcmdldFZhcik7DQotDQotICAgICAgICBpZihpbmRleCA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gb2xkUHJvcGVydHk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gb2xkUHJvcGVydHkuc3Vic3RyaW5nKDAsIGluZGV4KTsNCi0gICAgICAgIHJlc3VsdCArPSBuZXdWYWx1ZTsNCi0gICAgICAgIHJldHVybiByZXN1bHQgKyBvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoaW5kZXggKyB0YXJnZXRWYXIubGVuZ3RoKCksIG9sZFByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiByZXBsYWNlIHZpcnR1YWwgZmFjZWxldHMgdmFycyAobWFwIHN5bnRheCkNCi0gICAgICogdGVzdGVkIHN0eWxlcyAoc2ltcGxlIGFuZCBuZXN0ZWQpOiB0ZXN0W2l4W2l4MltpeDNdXV0NCi0gICAgICovDQotICAgIC8qDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBfY3JlYXRlQmluZGluZyhMaXN0PFN0cmluZz4gZXhwcmVzc2lvbnMsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmlydHVhbFZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0NCi0gICAgICAgIFN0cmluZyBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50QmluZGluZzsNCi0gICAgICAgIFN0cmluZyBwYXJ0T2ZCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBleHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aCgiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZvdW5kQmluZGluZ0RldGFpbHMgPSBlbnRyeS5zcGxpdCgiICIpOw0KLSAgICAgICAgICAgIGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoZm91bmRCaW5kaW5nRGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9PSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBiaW5kaW5nRGV0YWlscyA9IGZvdW5kQmluZGluZ0RldGFpbHNbaW5kZXhPZkJpbmRpbmdEZXRhaWxzXS5zcGxpdCgiPSIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nRGV0YWlscy5sZW5ndGggPCAyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYmluZGluZ0RldGFpbHNbMV07DQotDQotICAgICAgICAgICAgLy90byBzdXBwb3J0IGJsYW5rcyB3aXRoaW4gYSBiaW5kaW5nIHdpdGggbWFwIHN5bnRheA0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgJiYgIWN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoY3VycmVudEJpbmRpbmcsIGZvdW5kQmluZGluZ0RldGFpbHMsIGluZGV4T2ZCaW5kaW5nRGV0YWlscyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lICE9IG51bGwgJiYgY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnMoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBwYXJ0T2ZCaW5kaW5nID0gY3VycmVudEJpbmRpbmcuc3Vic3RyaW5nKGN1cnJlbnRCaW5kaW5nLmluZGV4T2YocHJldkZhY2VsZXRzQXR0cmlidXRlTmFtZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICArIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUubGVuZ3RoKCksIGN1cnJlbnRCaW5kaW5nLmluZGV4T2YoIn0iKSk7DQotDQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5hZGQoYmluZGluZ0RldGFpbHNbMF0pOw0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgcGFydE9mQmluZGluZzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICBlbHNlIGlmKCEoY3VycmVudEJpbmRpbmcuY29udGFpbnMoInsiKSB8fCBjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJzLnB1dChiaW5kaW5nRGV0YWlsc1swXSwgYmluZGluZ0RldGFpbHNbMV0uc3Vic3RyaW5nKDEsIGJpbmRpbmdEZXRhaWxzWzFdLmxlbmd0aCgpLTIpKTsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWlucyhiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLmFkZChiaW5kaW5nRGV0YWlsc1swXSk7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyZW50QmluZGluZy5zdWJzdHJpbmcoY3VycmVudEJpbmRpbmcuaW5kZXhPZigieyIpICsgMSwgY3VycmVudEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gYmluZGluZ0RldGFpbHNbMF07DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotICAgICovDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzhhZmVjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRpZmZlcmVuY2UgYmV0d2VlbiBbIGFuZCBbJyAtIHRlc3Qgd2l0aCBtb3JlIGNvbnN0ZWxsYXRpb25zIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQ0KLXB1YmxpYyBjbGFzcyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotew0KLSAgICBwcml2YXRlIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYmFzZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7DQotICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdG9rZW47DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXBsYWNlT3JBZGRQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlcGxhY2VQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1Byb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkuZW5kc1dpdGgoIiddIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCksIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBhZGRQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIFN0cmluZyBuZXdQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUV4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzb3VyY2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBzb3VyY2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSk7DQotDQotICAgICAgICBpZihuZXdQcm9wZXJ0eS5zdGFydHNXaXRoKCJbJyIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihyZXN1bHQgKyBuZXdQcm9wZXJ0eSArICJ9Iik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHJlc3VsdCArICIuIiArIG5ld1Byb3BlcnR5ICsgIn0iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihTdHJpbmcgZXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgaWYoIUV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKGV4cHJlc3Npb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXhwcmVzc2lvbiArICIgaXMgbm8gdmFsaWQgZWwtZXhwcmVzc2lvbiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW50IGluZGV4MSA9IGV4cHJlc3Npb24ubGFzdEluZGV4T2YoIiddIik7DQotICAgICAgICBpbnQgaW5kZXgyID0gZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiLiIpOw0KLQ0KLSAgICAgICAgaWYoaW5kZXgxID4gaW5kZXgyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnN1YnN0cmluZygwLCBpbmRleDEpOw0KLQ0KLSAgICAgICAgICAgIGludCBpbmRleDMgPSBmaW5kSW5kZXhPZlN0YXJ0aW5nQnJhY2tldChleHByZXNzaW9uKTsNCi0gICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoaW5kZXgzICsgMiwgaW5kZXgxKTsNCi0gICAgICAgICAgICB0aGlzLmJhc2UgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihleHByZXNzaW9uLnN1YnN0cmluZygwLCBpbmRleDMpICsgIn0iKTsNCi0gICAgICAgICAgICB0aGlzLnRva2VuID0gIlsnIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoIGluZGV4MiA+IGluZGV4MSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoaW5kZXgyICsgMSwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEgKTsNCi0gICAgICAgICAgICB0aGlzLmJhc2UgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihleHByZXNzaW9uLnN1YnN0cmluZygwLCBpbmRleDIpICsgIn0iKTsNCi0gICAgICAgICAgICB0aGlzLnRva2VuID0gIi4iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZygyLCBleHByZXNzaW9uLmxlbmd0aCgpIC0gMSk7DQotICAgICAgICAgICAgdGhpcy5wcmVmaXggPSBleHByZXNzaW9uLnN1YnN0cmluZygwLCAxKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUudHJpbSgpOw0KLSAgICAgICAgDQotICAgICAgICBpZigiWyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMudmFsdWUuc3RhcnRzV2l0aCgiJyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUuc3Vic3RyaW5nKDEsIHRoaXMudmFsdWUubGVuZ3RoKCkgLSAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZS52YWx1ZSArIHRoaXMudG9rZW4gKyB0aGlzLnZhbHVlLnN1YnN0cmluZygwLCB0aGlzLnZhbHVlLmxlbmd0aCgpKSArICInXSI7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gZ2V0QmFzZUV4cHJlc3Npb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmFzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4cHJlc3Npb25TdHJpbmcoKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgYmFzZUV4cHJlc3Npb24gPSB0aGlzLmJhc2UuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLQ0KLSAgICAgICAgICAgIGlmKCJbJyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAiJ119IjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAifSI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlZml4ICsgInsiICsgdGhpcy52YWx1ZSArICJ9IjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMuYmFzZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UuZ2V0UHJlZml4KCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5iYXNlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5iYXNlLnNldFByZWZpeChwcmVmaXgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRFeHByZXNzaW9uU3RyaW5nKCkuaGFzaENvZGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uICYmIGdldEV4cHJlc3Npb25TdHJpbmcoKQ0KLSAgICAgICAgICAgIC5lcXVhbHMoKChWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKSB0YXJnZXQpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBpbnQgZmluZEluZGV4T2ZTdGFydGluZ0JyYWNrZXQoU3RyaW5nIGV4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIGludCBjbG9zZUNvdW50ID0gMDsNCi0gICAgICAgIGZvcihpbnQgaSA9IGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxOyBpID4gMDsgaS0tKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGV4cHJlc3Npb24uY2hhckF0KGkpID09ICdbJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNsb3NlQ291bnQtLTsNCi0gICAgICAgICAgICAgICAgaWYoY2xvc2VDb3VudCA8IDApDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYoZXhwcmVzc2lvbi5jaGFyQXQoaSkgPT0gJ10nKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2xvc2VDb3VudCsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0Fic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MmU1MTQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8VD4gaW1wbGVtZW50cyBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5PE5hbWVNYXBwZXI8VD4+DQotew0KLSAgICBwcml2YXRlIExpc3Q8Q2xhc3M+IGRlbmllZE5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlZ2lzdGVyKE5hbWVNYXBwZXI8VD4gbmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgaWYoIWRlbmllZE5hbWVNYXBwZXJMaXN0LmNvbnRhaW5zKG5hbWVNYXBwZXIuZ2V0Q2xhc3MoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZ2V0TmFtZU1hcHBlckxpc3QoKS5hZGQobmFtZU1hcHBlcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRlcmVnaXN0ZXIoQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IGNsYXNzVG9EZXJlZ2lzdGVyKQ0KLSAgICB7DQotICAgICAgICBJdGVyYXRvcjxOYW1lTWFwcGVyPFQ+PiBuYW1lTWFwcGVySXRlcmF0b3IgPSBnZXROYW1lTWFwcGVyTGlzdCgpLml0ZXJhdG9yKCk7DQotICAgICAgICB3aGlsZShuYW1lTWFwcGVySXRlcmF0b3IuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG5hbWVNYXBwZXJJdGVyYXRvci5uZXh0KCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKGNsYXNzVG9EZXJlZ2lzdGVyLmdldE5hbWUoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBuYW1lTWFwcGVySXRlcmF0b3IucmVtb3ZlKCk7DQotICAgICAgICAgICAgICAgIC8vZG9uJ3QgYnJlYWsgLSBlLmcuIHRvIGRlcmVnaXN0ZXIgYWxsIHdyYXBwZXJzLi4uDQotICAgICAgICAgICAgICAgIC8vYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGRlbnkoQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IGNsYXNzVG9EZW55KQ0KLSAgICB7DQotICAgICAgICBkZXJlZ2lzdGVyKGNsYXNzVG9EZW55KTsNCi0NCi0gICAgICAgIHN5bmNocm9uaXplZCAoZ2V0Q2xhc3MoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBkZW5pZWROYW1lTWFwcGVyTGlzdC5hZGQoY2xhc3NUb0RlbnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBMaXN0PE5hbWVNYXBwZXI8VD4+IGdldE5hbWVNYXBwZXJMaXN0KCk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2NjA3MC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9DbGFzc01hcHBpbmdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBDbGFzc01hcHBpbmdGYWN0b3J5PFAsIFI+DQotew0KLSAgICBSIGNyZWF0ZShQIHNvdXJjZSk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0RlZmF1bHRGYWN0b3J5RmluZGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9EZWZhdWx0RmFjdG9yeUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTZmNGY2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0RlZmF1bHRGYWN0b3J5RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRGVmYXVsdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8vZHluYW1pYyBhcHByb2FjaCB0byBjcmVhdGUgdGhlIGZhY3RvcmllcyBkdXJpbmcgdGhlIGZpcnN0IHJlcXVlc3QsIHdoZW4gYSBmYWNlcy1jb250ZXh0IGlzIGF2YWlsYWJsZQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWN0b3J5RmluZGVyIGltcGxlbWVudHMgRmFjdG9yeUZpbmRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJvdGVjdGVkIE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4gZmFjdG9yeU1hcCA9IG5ldyBIYXNoTWFwPEZhY3RvcnlOYW1lcywgT2JqZWN0PigpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIgPSBuZXcgRGVmYXVsdEZhY3RvcnlGaW5kZXIoKTsNCi0NCi0gICAgcHJpdmF0ZSBEZWZhdWx0RmFjdG9yeUZpbmRlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBGYWN0b3J5RmluZGVyIGdldEluc3RhbmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY3RvcnlGaW5kZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGZpbmFsIDxUPiBUIGdldEZhY3RvcnkoRmFjdG9yeU5hbWVzIGZhY3RvcnlOYW1lLCBDbGFzczxUPiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYoIShmYWN0b3J5TWFwLmNvbnRhaW5zS2V5KGZhY3RvcnlOYW1lKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdEZhY3RvcnkoZmFjdG9yeU5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChUKWZhY3RvcnlNYXAuZ2V0KGZhY3RvcnlOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdEZhY3RvcnkoRmFjdG9yeU5hbWVzIGZhY3RvcnlOYW1lKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotICAgICAgICBzd2l0Y2ggKGZhY3RvcnlOYW1lKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNhc2UgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZUNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIFZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZVZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIFJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIEVMX0hFTFBFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlRUxIZWxwZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6IC8vcmVxdWlyZWQgYnkgY2hlY2tzdHlsZQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoZmFjdG9yeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vdCBwb3NzaWJsZSB0byBjcmVhdGUgZmFjdG9yeSAiICsgZmFjdG9yeU5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZmFjdG9yeU1hcC5wdXQoZmFjdG9yeU5hbWUsIGZhY3RvcnkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSk7DQotICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSkpOw0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZKTsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSkpOw0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlTWVzc2FnZVJlc29sdmVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZKTsNCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSkpOw0KLSAgICAgICAgbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKERlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkgKTsNCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSkpOw0KLSAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IGNyZWF0ZUVMSGVscGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdEVMSGVscGVyRmFjdG9yeSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlGaW5kZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmMjYyNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnlGaW5kZXIKLXsKLSAgICA8VD4gVCBnZXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpOwotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeU5hbWVzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUxOWRjMi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQotcHVibGljIGVudW0gRmFjdG9yeU5hbWVzCi17Ci0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksCi0gICAgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLAotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLAotCi0gICAgUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwKLSAgICBFTF9IRUxQRVJfRkFDVE9SWQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDJkMWYwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L05hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFQgZXh0ZW5kcyBOYW1lTWFwcGVyPg0KLXsNCi0gICAgdm9pZCByZWdpc3RlcihUIGNsYXNzVG9BZGQpOw0KLSAgICB2b2lkIGRlcmVnaXN0ZXIoQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IGNsYXNzVG9EZXJlZ2lzdGVyKTsNCi0gICAgdm9pZCBkZW55KENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBjbGFzc1RvRGVueSk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjliZDk3YS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gaW5pdGlhbGl6ZSBjb21wb25lbnRzIGJlZm9yZUVuY29kZUJlZ2luLjxici8+DQotICogZS5nLjogeW91IGNhbiBhZGQgaW5mb3JtYXRpb24gZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gbWVjaGFuaXNtcywuLi4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50SW5pdGlhbGl6ZXINCi17DQotICAgIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTljMDQxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBTdGF0aWNDb25maWd1cmF0aW9uPFQsIFI+DQotew0KLSAgICB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCk7DQotICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFQsIFI+PiBnZXRNYXBwaW5nKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiODRhZjUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGNsYXNzIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxULCBSPg0KLXsNCi0gICAgcHJpdmF0ZSBUIHNvdXJjZTsNCi0gICAgcHJpdmF0ZSBSIHRhcmdldDsNCi0NCi0gICAgcHVibGljIFQgZ2V0U291cmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHNvdXJjZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoVCBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSIGdldFRhcmdldCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KFIgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjU5YjFlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSX0pCi1wdWJsaWMgZW51bSBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMKLXsKLSAgICBNRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9DT05GSUcKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGNiNmY0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3MKLSAgICAgICAgPSBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VPZk1hcHBpbmcoU3RyaW5nIHBhdGgpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGdldE1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2Uoc291cmNlKTsKLSAgICAgICAgZW50cnkuc2V0VGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgIHRoaXMubWFwcGluZ3MuYWRkKGVudHJ5KTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhNjNjNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIFN0cmluZyBwYXRoOwotICAgIHByaXZhdGUgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5nczsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCkKLSAgICB7Ci0gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgICAgIC8vZm9yY2UgcmVsb2FkCi0gICAgICAgIG1hcHBpbmdzID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBnZXRNYXBwaW5nKCkKLSAgICB7Ci0gICAgICAgIGlmKG1hcHBpbmdzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtYXBwaW5nczsKLSAgICAgICAgfQotCi0gICAgICAgIG1hcHBpbmdzID0gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotCi0gICAgICAgIFJlc291cmNlQnVuZGxlIG1hcHBpbmcgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocGF0aCk7Ci0KLSAgICAgICAgaWYgKG1hcHBpbmcgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9sb2dnaW5nCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IG1hcHBpbmcuZ2V0S2V5cygpOwotCi0gICAgICAgIFN0cmluZyBtZXRhRGF0YUtleTsKLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsKLQotICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YURhdGFLZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSBtYXBwaW5nLmdldFN0cmluZyhtZXRhRGF0YUtleSk7Ci0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWV0YURhdGFLZXksIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBtZXRhRGF0YUtleSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2UobWV0YURhdGFLZXkpOwotICAgICAgICBlbnRyeS5zZXRUYXJnZXQodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsKLSAgICAgICAgdGhpcy5tYXBwaW5ncy5hZGQoZW50cnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk5Mzk2OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yIGltcGxlbWVudHMgUmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRJbnRlcmNlcHRvcklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJldHVyblZhbHVlT25Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKAotICAgICAgICBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIHNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24sIE9iamVjdCBjdXJyZW50UmV0dXJuVmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gY3VycmVudFJldHVyblZhbHVlOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBiZWZvcmUKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJlZm9yZURlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGFmdGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhM2IxYjYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlJbmZvcm1hdGlvbiB0aGUgaW5mb3JtYXRpb24gZW50cnkgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3BlcnR5DQotICAgICAqLw0KLSAgICB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxZjA1NC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEFsbG93cyB0byBpbnRlcmNlcHQgcmVuZGVyZXIgbWV0aG9kcy48YnIvPgotICogQmFzZSBtZWNoYW5pc20gb2YgZXh0dmFsLiBJdCBhbGxvd3MgdG8gYWRkIGN1c3RvbSBpbmZyYXN0cnVjdHVyZXMuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIFJlbmRlcmVySW50ZXJjZXB0b3IKLXsKLSAgICBTdHJpbmcgZ2V0SW50ZXJjZXB0b3JJZCgpOwotCi0gICAgT2JqZWN0IGdldFJldHVyblZhbHVlT25Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKAotICAgICAgICBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIHNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24sIE9iamVjdCBjdXJyZW50UmV0dXJuVmFsdWUpOwotCi0gICAgLyoKLSAgICAgKiBiZWZvcmUKLSAgICAgKi8KLSAgICB2b2lkIGJlZm9yZURlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlRW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIC8qCi0gICAgICogYWZ0ZXIKLSAgICAgKi8KLSAgICB2b2lkIGFmdGVyRGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyRW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdjMDlhYi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEFsbG93cyB0byBpbnRlcmNlcHQgdmFsaWRhdGlvciBleGNlcHRpb25zLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAqIEBwYXJhbSBtZXRhRGF0YUVudHJ5IHRoZSBtZXRhIGRhdGEgZW50cnkgd2hpY2ggY29udGFpbnMgdGhlIG1ldGEgZGF0YSBvZiB0aGUgcHJvcGVydHkNCi0gICAgICogQHBhcmFtIGNvbnZlcnRlZE9iamVjdCB0aGUgY29udmVydGVkIHVzZXIgaW5wdXQNCi0gICAgICogQHBhcmFtIHZhbGlkYXRvckV4Y2VwdGlvbiB0aGUgY3VycmVudCBleGNlcHRpb24NCi0gICAgICogQHBhcmFtIHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IHdoaWNoIHRocmV3IHRoZSBleGNlcHRpb24NCi0gICAgICogQHJldHVybiBmYWxzZSB0byBzdG9wIHRocm93aW5nIHRoZSBleGNlcHRpb24NCi0gICAgICovDQotICAgIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIzMmNjNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXIuUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW5pdENvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYoISh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCB0byBpbml0IGNvbXBvbmVudCAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsKLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOwotCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gRXh0VmFsVXRpbHMuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IG1ldGFEYXRhRXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCkuZ2V0TWV0YURhdGFFbnRyaWVzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhRW50cnkoZW50cnkpOwotCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIXNraXBWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHZhbGlkYXRpb25TdHJhdGVneSwgZW50cnkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IEV4dFZhbFV0aWxzLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KTsKLQotICAgICAgICAgICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcobWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbWV0YURhdGFUcmFuc2Zvcm1lci5jb252ZXJ0TWV0YURhdGEoZW50cnkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYobWV0YURhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCFtZXRhRGF0YS5pc0VtcHR5KCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMoZW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCBCb29sZWFuLmNsYXNzKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YS5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9nZXQgY29tcG9uZW50IGluaXRpYWxpemVyIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQgYW5kIGNvbmZpZ3VyZSBpdAotICAgICAgICAgICAgICAgIC8vYWxzbyBpbiBjYXNlIG9mIHNraXBwZWQgdmFsaWRhdGlvbiB0byByZXNldCBlLmcuIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICBpZighbWV0YURhdGEuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29uZmlndXJlQ29tcG9uZW50V2l0aE1ldGFEYXRhKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImluaXQgY29tcG9uZW50IG9mICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QgPSB3cmFwcGVkLmdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8pOwotCi0gICAgICAgIC8vcmVjb3JkZSB1c2VyIGlucHV0IGUuZy4gZm9yIGNyb3NzLWNvbXBvbmVudCB2YWxpZGF0aW9uCi0gICAgICAgIGZvcihQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyIHJlY29yZGVyIDogRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVjb3JkZXIucmVjb3JkVXNlcklucHV0KHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOwotCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UocmVjb3JkZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGNhbGxlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHByb2Nlc3NWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFZhbGlkYXRvckV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29udmVydGVyRXhjZXB0aW9uKGUuZ2V0RmFjZXNNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpCi0gICAgewotICAgICAgICBpZiAoISh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCB2YWxpZGF0aW9uIik7Ci0gICAgICAgIH0KLQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5OwotCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gRXh0VmFsVXRpbHMuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKTsKLQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpLmdldE1ldGFEYXRhRW50cmllcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YUVudHJ5KGVudHJ5KTsKLQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHNraXBWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHZhbGlkYXRpb25TdHJhdGVneSwgZW50cnkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInZhbGlkYXRlICIgKyBlbnRyeS5nZXRWYWx1ZSgpICsgIiB3aXRoICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyB2YWxpZGF0aW9uIHN0cmF0ZWd5IGZvdW5kIGZvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJ2YWxpZGF0aW9uIGZpbmlzaGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBza2lwVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBlbnRyeSkKLSAgICB7Ci0gICAgICAgIC8vb3ZlcnJpZGUgZm9yIGN1c3RvbSBza2lwIHZhbGlkYXRpb24gc3VwcG9ydCAoaWYgbmVlZGVkKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZDM4NjUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQSBnZW5lcmljIGltcGxlbWVudGF0aW9uLiBTdWJjbGFzc2VzIGp1c3QgaGF2ZSB0byBub3cgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBuYW1lIG1hcHBlci4NCi0gKg0KLSAqIE5hbWVNYXBwZXJzIGFyZSBzdGF0ZWxlc3MuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VD4gaW1wbGVtZW50cyBOYW1lTWFwcGVyPFQ+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLSAgICBwcml2YXRlIE5hbWVNYXBwZXI8VD4gY3VzdG9tTmFtZU1hcHBlcjsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFQgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZiAoY3VzdG9tTmFtZU1hcHBlciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCk7DQotDQotICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTmFtZU1hcHBlciA9IChOYW1lTWFwcGVyPFQ+KSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKGN1c3RvbU5hbWVNYXBwZXIgIT0gbnVsbCkgPyBjdXN0b21OYW1lTWFwcGVyLmNyZWF0ZU5hbWUoc291cmNlKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNjA3OGQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgZm9yIG5hbWUgbWFwcGVycy4NCi0gKiBBIG5hbWUgbWFwcGVyIGNhbGN1bGF0ZXMgYSBuYW1lIGZvciBhIGdpdmVuIHNvdXJjZSBvYmplY3QuDQotICogZS5nLiBNZXRhLURhdGEgS2V5IChlLmcuOiBhbm5vdGF0aW9uIGNsYXNzIG5hbWUpIC0+IFZhbGlkYXRpb25TdHJhdGVneQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBOYW1lTWFwcGVyPFQ+DQotew0KLSAgICBTdHJpbmcgY3JlYXRlTmFtZShUIHNvdXJjZSk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjYzQzMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvQ29tbW9uTWV0YURhdGFLZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGhlbHBlciBmb3IgZnJlcXVlbnQgbWV0YS1kYXRhIGtleXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogcGxhY2VkIGluIGNvcmUgdG8gYXZvaWQgZHVwbGljYXRlZCBpbmZvcm1hdGlvbiBpbiBtdWx0aXBsZSBtb2R1bGVzICh2YWxpZGF0aW9uIG1vZHVsZSBhbmQgY29tcG9uZW50LXN1cHBvcnQgbW9kdWxlKQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBDb21tb25NZXRhRGF0YUtleXMNCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRUQgPSAicmVxdWlyZWQiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQUtfUkVRVUlSRUQgPSAid2Vha19yZXF1aXJlZCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOX0xFTkdUSCA9ICJtaW5fbGVuZ3RoIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfTEVOR1RIID0gIm1heF9sZW5ndGgiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01JTiA9ICJyYW5nZV9taW4iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01BWCA9ICJyYW5nZV9tYXgiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVFRFUk4gPSAicGF0dGVybiI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUVEVSTl9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UgPSAicGF0dGVybl92YWxpZGF0aW9uX2Vycm9yX21lc3NhZ2UiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQUlMID0gImVtYWlsIjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT00gPSAiY3VzdG9tIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lQX1ZBTElEQVRJT04gPSAic2tpcF92YWxpZGF0aW9uIjsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL01ldGFEYXRhRW50cnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9NZXRhRGF0YUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOTgxM2QuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL01ldGFEYXRhRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIERhdGEgaG9sZGVyIHdoaWNoIHN0b3JlcyB0aGUgbWV0YS1kYXRhIGFuZCBzb21lIGluZm9ybWF0aW9uIHdoZXJlIHRoZSBtZXRhLWRhdGEgd2FzIGFyb3VuZC4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBNZXRhRGF0YUVudHJ5Ci17Ci0gICAgcHJpdmF0ZSBTdHJpbmcga2V5OwotICAgIHByaXZhdGUgT2JqZWN0IHZhbHVlOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gICAgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIDxUPiBUIGdldFZhbHVlKENsYXNzPFQ+IHRhcmdldENsYXNzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUKWdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIDxUPiBUIGdldFByb3BlcnR5KFN0cmluZyBrZXksIENsYXNzPFQ+IHRhcmdldENsYXNzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUKWdldFByb3BlcnR5KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMyZjRhNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYWxsIGZhY3RvcmllcyB3aGljaCBjcmVhdGUgbWV0YS1kYXRhIGV4dHJhY3RvcnMKLSAqIAotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeQotewotICAgIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZSgpOwotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZjdlMzMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggZXh0cmFjdHMgbWV0YS1kYXRhIChlLmcuIHRoZSBhbm5vdGF0aW9ucykgb2YgdGhlIHZhbHVlIGJpbmRpbmcgb2YgYSBjb21wb25lbnQuCi0gKiBJdCBleHRyYWN0cyB0aGUgbWV0YS1kYXRhIG9mIHRoZSBmaWVsZCBhbmQgdGhlIHByb3BlcnR5LgotICogKEFsc28gdGhlIGFubm90YXRpb25zIG9mIHN1cGVyIGNsYXNzZXMgYW5kIGludGVyZmFjZXMuKQotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0b3IKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHVibGljIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcigpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkKLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsKLQotICAgICAgICAvL3Nob3VsZCBuZXZlciBvY2N1cgotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSAmJiBvYmplY3QgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKG9iamVjdC5nZXRDbGFzcygpICsgIiBpcyBubyB2YWxpZCBjb21wb25lbnQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQgPSAoVUlDb21wb25lbnQpIG9iamVjdDsKLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBleHRyYWN0aW5nIG1ldGEtZGF0YSBvZiAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcodWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmIChwcm9wZXJ0eURldGFpbHMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBnZXQgYmVhbiBjbGFzcyBhbmQgcHJvcGVydHkgbmFtZQotICAgICAgICAgKi8KLSAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCk7Ci0KLSAgICAgICAgLy9jcmVhdGUKLSAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5zZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBwcm9wZXJ0eURldGFpbHMpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGZpbmQgYW5kIGFkZCBhbm5vdGF0aW9ucwotICAgICAgICAgKi8KLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gZW50aXR5Q2xhc3M7Ci0KLSAgICAgICAgd2hpbGUgKCFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhjdXJyZW50Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgICAgIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoY3VycmVudENsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0KLSAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKENsYXNzIGN1cnJlbnRJbnRlcmZhY2UgOiBlbnRpdHlDbGFzcy5nZXRJbnRlcmZhY2VzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRJbnRlcmZhY2U7Ci0KLSAgICAgICAgICAgIHdoaWxlIChjdXJyZW50Q2xhc3MgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGN1cnJlbnRDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudENsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImV4dHJhY3QgZmluaXNoZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEpOwotCi0gICAgICAgIE1ldGhvZCBtZXRob2Q7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGhvZCA9IGVudGl0eS5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0IiArIHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1ldGhvZCA9IGVudGl0eS5nZXREZWNsYXJlZE1ldGhvZCgiaXMiICsgcHJvcGVydHkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibWV0aG9kIG5vdCBmb3VuZCAtIGNsYXNzOiAiICsgZW50aXR5LmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC0gbWV0aG9kczogIiArICJnZXQiICsgcHJvcGVydHkgKyAiICIgKyAiaXMiICsgcHJvcGVydHkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFkZEFubm90YXRpb25Ub0Fubm90YXRpb25FbnRyaWVzKEFycmF5cy5hc0xpc3QobWV0aG9kLmdldEFubm90YXRpb25zKCkpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRGaWVsZEFjY2Vzc0Fubm90YXRpb25zKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQotICAgIHsKLSAgICAgICAgRmllbGQgZmllbGQ7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpZWxkID0gZW50aXR5LmdldERlY2xhcmVkRmllbGQocHJvcGVydHkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmllbGQgPSBlbnRpdHkuZ2V0RGVjbGFyZWRGaWVsZCgiXyIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImZpZWxkICIgKyBwcm9wZXJ0eSArICIgb3IgXyIgKyBwcm9wZXJ0eSArICIgbm90IGZvdW5kIiwgZTEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFkZEFubm90YXRpb25Ub0Fubm90YXRpb25FbnRyaWVzKEFycmF5cy5hc0xpc3QoZmllbGQuZ2V0QW5ub3RhdGlvbnMoKSksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEFubm90YXRpb25Ub0Fubm90YXRpb25FbnRyaWVzKAotICAgICAgICBMaXN0PEFubm90YXRpb24+IGFubm90YXRpb25zLCBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGFubm90YXRpb25zKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLmFkZE1ldGFEYXRhRW50cnkoY3JlYXRlTWV0YURhdGFFbnRyeUZvckFubm90YXRpb24oYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoYW5ub3RhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBNZXRhRGF0YUVudHJ5IGNyZWF0ZU1ldGFEYXRhRW50cnlGb3JBbm5vdGF0aW9uKEFubm90YXRpb24gZm91bmRBbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgTWV0YURhdGFFbnRyeSBlbnRyeSA9IG5ldyBNZXRhRGF0YUVudHJ5KCk7Ci0KLSAgICAgICAgZW50cnkuc2V0S2V5KGZvdW5kQW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIGVudHJ5LnNldFZhbHVlKGZvdW5kQW5ub3RhdGlvbik7Ci0KLSAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZDcwYWQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhpcyBmYWN0b3J5IGNyZWF0ZXMgYSBtZXRhLWRhdGEgZXh0cmFjdG9yIHdoaWNoIGV4dHJhY3RzIHRoZSBtZXRhLWRhdGEKLSAqIG9mIHRoZSB2YWx1ZSBiaW5kaW5nIG9mIGEgY29tcG9uZW50LgotICogPHAvPgotICogb3JkZXI6PGJyLz4KLSAqIDxvbD4KLSAqICAgPGxpPmNvbmZpZ3VyZWQgbWV0YS1kYXRhIGV4dHJhY3RvciAod2ViLnhtbCk8L2xpPgotICogICA8bGk+Y29uZmlndXJlZCBtZXRhLWRhdGEgZXh0cmFjdG9yIChpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKTwvbGk+Ci0gKiAgIDxsaT5kZWZhdWx0IGltcGxlbWVudGF0aW9uPC9saT4KLSAqIDwvb2w+Ci0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IG51bGw7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikKLSAgICBwdWJsaWMgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlKCkKLSAgICB7Ci0gICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3RvciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUik7Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUikpOwotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yID0gKE1ldGFEYXRhRXh0cmFjdG9yKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3RvciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShtZXRhRGF0YUV4dHJhY3Rvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY3JlYXRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3IobWV0YURhdGFFeHRyYWN0b3IpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0MDUxZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL01ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci0KLS8qKgotICogQW4gbWV0YS1kYXRhIGV4dHJhY3RvciBpcyByZXNwb25zaWJsZSB0byBhbmFseXplIGFuIG9iamVjdAotICogYW5kIHJldHVybnMgYWxsIGF2YWlsYWJsZSBtZXRhLWRhdGEgaW5mb3JtYXRpb24KLSAqIAotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhRXh0cmFjdG9yCi17Ci0gICAgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njk5MTJhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgZXF1aXZhbGVudCB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0gKg0KLSAqIGlmIHRoZXJlIGlzIGFsc28gYSBwcm94eSBmb3IgdGhlIGV4dHJhY3RvciB5b3UgY2FuIHVzZSB0aGUgY2xhc3NOYW1lIHByb3BlcnR5IHRvIG1hbnVhbGx5IHJlcGVhdCB0aGUNCi0gKiBmdWxsIHF1YWxpZmllZCBjbGFzcyBuYW1lLg0KLSAqDQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGludGVyZmFjZSBCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIgZXh0ZW5kcyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbC5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlYTgxOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIGl0J3MganVzdCBhIGhlbHBlciBmb3IgcHJveGllcyAtIHlvdSBqdXN0IG5lZWQgaXQsIGlmIHlvdSBkZWZpbmUgdGhlIGVxdWl2YWxlbnQgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotICoNCi0gKiBpZiB0aGVyZSBpcyBhbHNvIGEgcHJveHkgZm9yIHRoZSB0cmFuc2Zvcm1lciB5b3UgY2FuIHVzZSB0aGUgY2xhc3NOYW1lIHByb3BlcnR5IHRvIG1hbnVhbGx5IHJlcGVhdCB0aGUNCi0gKiBmdWxsIHF1YWxpZmllZCBjbGFzcyBuYW1lLg0KLSAqDQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGNsYXNzIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyLCBCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICBwcml2YXRlIFN0cmluZyBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lOw0KLQ0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyLmNvbnZlcnRNZXRhRGF0YShtZXRhRGF0YUVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWU7DQotICAgICAgICB9DQotICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKFN0cmluZyBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUgPSBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGdldE1ldGFEYXRhVHJhbnNmb3JtZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVRyYW5zZm9ybWVyKE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyID0gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNTE2MmIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyB0aGUgTWV0YURhdGFUcmFuc2Zvcm1lciBmb3IgYSBnaXZlbiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogVmFsaWRhdGlvblN0cmF0ZWd5IC0+IE1ldGFEYXRhVHJhbnNmb3JtZXIgaW5zdGVhZCBvZiBNZXRhLURhdGEgLT4gTWV0YURhdGFUcmFuc2Zvcm1lcg0KLSAqIHRvIGF2b2lkIGEgc2Vjb25kIHN0YXRpYyBtYXBwaW5nIGUuZy4gZm9yIGpwYSBhbm5vdGF0aW9ucw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotICAgICAgICBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YVRyYW5zZm9ybWVyPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmc7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGNyZWF0ZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSA9IG51bGw7DQotDQotICAgICAgICAvL3Byb3h5IGNoZWNrDQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGEgcHJveHkgYW5kIHRoZSB1c2FnZSBvZiBhIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICAgICAgICBlbHNlIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lID0gKChCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcil2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZy5jb250YWluc0tleSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKE1ldGFEYXRhVHJhbnNmb3JtZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLmdldCh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgICAgICBTdHJpbmcgdHJhbnNmb3JtZXJOYW1lOw0KLSAgICAgICAgLy9udWxsIC0+IHVzZSBuYW1lIG1hcHBlcnMNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IG5hbWVNYXBwZXIgOiBuYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cmFuc2Zvcm1lck5hbWUgPSBuYW1lTWFwcGVyLmNyZWF0ZU5hbWUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICBpZiAodHJhbnNmb3JtZXJOYW1lID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IChNZXRhRGF0YVRyYW5zZm9ybWVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh0cmFuc2Zvcm1lck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZE1hcHBpbmcodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgdHJhbnNmb3JtZXJOYW1lKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cFN0cmF0ZWd5TWFwcGluZ3MoTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWFwcGluZy5nZXRTb3VyY2UoKSwgbWFwcGluZy5nZXRUYXJnZXQoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgdHJhbnNmb3JtZXJOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImFkZGluZyB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1ldGEtZGF0YSB0cmFuc2Zvcm1lciBtYXBwaW5nOiAiDQotICAgICAgICAgICAgICAgICsgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArICIgLT4gIiArIHRyYW5zZm9ybWVyTmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLnB1dCh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCB0cmFuc2Zvcm1lck5hbWUpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gZ2V0TmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmFtZU1hcHBlckxpc3Q7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNTA0YjIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQWxsb3dzIHRvIHRyYW5zZm9ybSBjb25jcmV0ZSBtZXRhLWRhdGEgdG8gYSBtb3JlIGFic3RyYWN0IGZvcm0uPGJyLz4NCi0gKiBlLmcuOiBAUmVxdWlyZWQsIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwuLi4pLCBATGVuZ3RoKG1pbmltdW0gPSAxKSwgLi4uIC0+IHJlcXVpcmVkID0gdHJ1ZQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLS8vKlRyYW5zZm9ybWVyIGluc3RlYWQgb2YgKkNvbnZlcnRlciB0byBhdm9pZCBuYW1pbmcgY29uZnVzaW9uIA0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YSk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGFkYzE2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ3MjJhOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgLSBpZiB0aGVyZSBpcyBhIHByb3h5IGFyb3VuZCB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKChCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcil2YWxpZGF0aW9uU3RyYXRlZ3kpLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3YjJkOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1ldGFEYXRhVHJhbnNmb3JtZXJzLg0KLSAqIChjb25maWd1cmVkIHZpYSB3ZWIueG1sKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2FjZDExLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKiAoY29uZmlndXJlZCB2aWEgaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbikNCi0gKiBUaGUgYmVhbiBwcm92aWRlcyB0aGUgZGVmYXVsdCBuYW1lIChjb252ZW50aW9uKS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gZnVsbCBxdWFsaWZpZWQgbmFtZS4gKD0gY3VzdG9taXphYmxlIGNvbnZlbnRpb24pDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyODY4Zi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFwcyBFeHRWYWwgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gTWV0YURhdGFUcmFuc2Zvcm1lcnMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgZ2V0Q2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1YjUzZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgdG8gcGxhY2UgVmFsaWRhdGlvblN0cmF0ZWdpZXMgYW5kIE1ldGFEYXRhVHJhbnNmb3JtZXJzIGluIHRoZSBzYW1lIHBhY2thZ2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBnZXRTaW1wbGVNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpICsgIi4iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTaW1wbGVNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwb3N0Zml4ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVgpOw0KLQ0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmVuZHNXaXRoKCJWYWxpZGF0aW9uU3RyYXRlZ3kiKSB8fA0KLSAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmVuZHNXaXRoKCJTdHJhdGVneSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lQYWNrYWdlTmFtZSArIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYKSAscG9zdGZpeCkNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCJWYWxpZGF0aW9uU3RyYXRlZ3kiLCBwb3N0Zml4KQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoIlN0cmF0ZWd5IiwgcG9zdGZpeCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2luIGNhc2Ugb2YgYSBzdGF0aWMgdmFsaWRhdGlvbiBzdHJhdGVneSBtYXBwaW5nDQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUgKyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgKyBwb3N0Zml4Ow0KLSAgICB9DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjk0OGEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbiBpbXBsZW1lbnRzIFByb3BlcnR5SW5mb3JtYXRpb24KLXsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gaW5mb3JtYXRpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICBwcml2YXRlIExpc3Q8TWV0YURhdGFFbnRyeT4gbWV0YURhdGFMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUVudHJ5PigpOwotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNJbmZvcm1hdGlvbihTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZm9ybWF0aW9uTWFwLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZm9ybWF0aW9uTWFwLmdldChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gVCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVCkgZ2V0SW5mb3JtYXRpb24oa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBpbmZvcm1hdGlvbk1hcC5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGFEYXRhRW50cnlbXSBnZXRNZXRhRGF0YUVudHJpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhTGlzdC50b0FycmF5KG5ldyBNZXRhRGF0YUVudHJ5W21ldGFEYXRhTGlzdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXRhRGF0YUVudHJ5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkKLSAgICB7Ci0gICAgICAgIG1ldGFEYXRhRW50cnkuc2V0UHJvcGVydGllcyh0aGlzLmluZm9ybWF0aW9uTWFwKTsKLSAgICAgICAgdGhpcy5tZXRhRGF0YUxpc3QuYWRkKG1ldGFEYXRhRW50cnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eURldGFpbHMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eURldGFpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwMzdjZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlEZXRhaWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlEZXRhaWxzCi17Ci0gICAgLy9mb3JtcyB0aGUgaWQgZm9yIGNyb3NzLXZhbGlkYXRpb24gd2l0aGluIGNvbXBsZXggY29tcG9uZW50cwotICAgIHByaXZhdGUgU3RyaW5nIGtleTsKLSAgICBwcml2YXRlIE9iamVjdCBiYXNlT2JqZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5OwotCi0gICAgcHVibGljIFByb3BlcnR5RGV0YWlscyhTdHJpbmcga2V5LCBPYmplY3QgYmFzZU9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICAgIHRoaXMuYmFzZU9iamVjdCA9IGJhc2VPYmplY3Q7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gICAgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRCYXNlT2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VPYmplY3QoT2JqZWN0IGJhc2VPYmplY3QpCi0gICAgewotICAgICAgICB0aGlzLmJhc2VPYmplY3QgPSBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxNzNlNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUluZm9ybWF0aW9uCi17Ci0gICAgYm9vbGVhbiBjb250YWluc0luZm9ybWF0aW9uKFN0cmluZyBrZXkpOwotICAgIE9iamVjdCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5KTsKLSAgICA8VD4gVCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcyk7Ci0gICAgdm9pZCBzZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpOwotCi0gICAgTWV0YURhdGFFbnRyeVtdIGdldE1ldGFEYXRhRW50cmllcygpOwotICAgIHZvaWQgYWRkTWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpOwotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRlOTI1Yy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlJbmZvcm1hdGlvbktleXMKLXsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFVEFJTFMgPSAicHJvcGVydHlfZGV0YWlscyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lQX1ZBTElEQVRJT04gPSAic2tpcF92YWxpZGF0aW9uIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gImxhYmVsIjsKLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZWNvcmRlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzBmMjNmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZWNvcmRlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotCi0vKioKLSAqIEFsbG93cyB0byBjYXB0dXJlIGNvbnZlcnRlZCB2YWx1ZXMuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIKLXsKLSAgICB2b2lkIHJlY29yZFVzZXJJbnB1dChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZGU1YzQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLQotLyoqCi0gKiBCYXNlIGZvciBhbGwgUmVuZGVyS2l0V3JhcHBlckZhY3RvcmllcyB0byBmb3JjZSBhIHNwZWNpZmljIGJlaGF2aW91cgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFJlbmRlcktpdCwgUmVuZGVyS2l0PgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSB3cmFwcGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBkZWFjdGl2YXRlZCA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeShBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRoaXMud3JhcHBlZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLndyYXBwZWQuYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkocmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkZWFjdGl2YXRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5kZWFjdGl2YXRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWFjdGl2YXRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVhY3RpdmF0ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFJlbmRlcktpdCBjcmVhdGUoUmVuZGVyS2l0IHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIGlmKGlzRGVhY3RpdmF0ZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBSZW5kZXJLaXQgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBpZih0aGlzLndyYXBwZWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy53cmFwcGVkLmNyZWF0ZShyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVXcmFwcGVyKHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KTsKLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0RlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDdlMDUwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ci17Ci0gICAgcHJpdmF0ZSBSZW5kZXJLaXQgcmVuZGVyS2l0OwotCi0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCBjcmVhdGVXcmFwcGVyKFJlbmRlcktpdCByZW5kZXJLaXQpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVya2l0IHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcktpdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLnJlbmRlcktpdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnJlbmRlcktpdCA9IG5ldyBFeHRWYWxSZW5kZXJLaXQocmVuZGVyS2l0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJLaXQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzNjI4Ny4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbExhenlSZW5kZXJlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotCi0vKioKLSAqIHRvIHN1cHBvcnQgYSBjdXN0b20gcHJveHkKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkgZXh0ZW5kcyBSZW5kZXJlcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIFJlbmRlcmVyIHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSByZW5kZXJlcjsKLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzaW1wbGUgcHJveHkgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZXRMYXp5UmVuZGVyZXIoKS5lbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZXRMYXp5UmVuZGVyZXIoKS5lbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydENsaWVudElkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldExhenlSZW5kZXJlcigpLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGdldFJlbmRlcnNDaGlsZHJlbigpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRMYXp5UmVuZGVyZXIoKS5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlbmRlcmVyIGdldExhenlSZW5kZXJlcigpCi0gICAgewotICAgICAgICBTdHJpbmcgcHJveHlDbGFzc05hbWUgPSAoU3RyaW5nKSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSk7Ci0KLSAgICAgICAgaWYocHJveHlDbGFzc05hbWUgIT0gbnVsbCAmJiAhcHJveHlDbGFzc05hbWUuZW5kc1dpdGgoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKHByb3h5Q2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgaWYodGFyZ2V0Q2xhc3MgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhIGN1c3RvbSBpbnZhbGlkIHJlbmRlcmVyIHByb3h5IGlzIGNvbmZpZ3VyZWQ6ICIgKyBwcm94eUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENsYXNzW10gYXJnQ2xhc3NlcyA9IG5ldyBDbGFzc1sxXTsKLSAgICAgICAgICAgIGFyZ0NsYXNzZXNbMF0gPSBSZW5kZXJlci5jbGFzczsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSB0YXJnZXRDbGFzcy5nZXRDb25zdHJ1Y3RvcihhcmdDbGFzc2VzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFJlbmRlcmVyKWNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBjcmVhdGU6ICIgKyB0YXJnZXRDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkOwotICAgICAgICB9Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXQuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMzU0ZTUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VTdHJlYW07Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVdyaXRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVzcG9uc2VTdGF0ZU1hbmFnZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJLaXQgZXh0ZW5kcyBSZW5kZXJLaXQKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgd3JhcHBlZDsKLQotICAgIHB1YmxpYyBFeHRWYWxSZW5kZXJLaXQoUmVuZGVyS2l0IHdyYXBwZWQpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOwotCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICBpZiAocmVuZGVyZXIgaW5zdGFuY2VvZiBFeHRWYWxSZW5kZXJlcldyYXBwZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIHJlbmRlcmVyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIGNyZWF0ZVdyYXBwZXIocmVuZGVyZXIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBSZW5kZXJlciBnZXRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSB3cmFwcGVkLmdldFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlKTsKLQotICAgICAgICBpZihyZW5kZXJlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyZXIgaW5zdGFuY2VvZiBFeHRWYWxSZW5kZXJlcldyYXBwZXIgPyByZW5kZXJlciA6IGNyZWF0ZVdyYXBwZXIocmVuZGVyZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCJubyByZW5kZXJlciBmb3VuZCBmb3IgZmFtaWx5ICIgKyBmYW1pbHkgKyAiIGFuZCB0eXBlICIgKyByZW5kZXJlclR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlbmRlcmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZVN0YXRlTWFuYWdlciBnZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZVdyaXRlciBjcmVhdGVSZXNwb25zZVdyaXRlcihXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcywgU3RyaW5nIHMxKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY3JlYXRlUmVzcG9uc2VXcml0ZXIod3JpdGVyLCBzLCBzMSk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlU3RyZWFtIGNyZWF0ZVJlc3BvbnNlU3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jcmVhdGVSZXNwb25zZVN0cmVhbShvdXRwdXRTdHJlYW0pOwotICAgIH0KLQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIGNyZWF0ZVdyYXBwZXIoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEV4dFZhbFJlbmRlcmVyV3JhcHBlcihyZW5kZXJlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXRGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI4MmJiYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeTsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBjZW50cmFsIG1lY2hhbmlzbSB3aGljaCBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgYSB3cmFwcGVyIGZvciBhIHJlbmRlcmVyIC0gc3RhcnRpbmcgcG9pbnQgb2YgZXh0dmFsLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeSBleHRlbmRzIFJlbmRlcktpdEZhY3RvcnkKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotICAgIHByaXZhdGUgUmVuZGVyS2l0RmFjdG9yeSB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcktpdEZhY3RvcnkoUmVuZGVyS2l0RmFjdG9yeSByZW5kZXJLaXRGYWN0b3J5KQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyS2l0RmFjdG9yeTsKLQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcktpdChTdHJpbmcgcywgUmVuZGVyS2l0IHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIHdyYXBwZWQuYWRkUmVuZGVyS2l0KHMsIHJlbmRlcktpdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlbmRlcktpdCBnZXRSZW5kZXJLaXQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICBSZW5kZXJLaXQgcmVuZGVyS2l0ID0gdGhpcy53cmFwcGVkLmdldFJlbmRlcktpdChmYWNlc0NvbnRleHQsIHMpOwotCi0gICAgICAgIC8vanNmIHJpICsgdHJpbmlkYWQKLSAgICAgICAgaWYocmVuZGVyS2l0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSB3cmFwcGVyRmFjdG9yeSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgIC8vc29tZSBjb21wb25lbnQgbGlicyBlLmcuIG15ZmFjZXMtdHJpbmlkYWQgYXJlbid0IGNvbXBhdGlibGUgd2l0aCB0aGlzIGNsZWFuIGFwcHJvYWNoCi0gICAgICAgIC8vZXhhbXBsZSBzZWUgVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIKLSAgICAgICAgaWYod3JhcHBlckZhY3RvcnkuaXNEZWFjdGl2YXRlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJGYWN0b3J5LmNyZWF0ZShyZW5kZXJLaXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGdldFJlbmRlcktpdElkcygpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZW5kZXJLaXRJZHMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyUHJveHkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg0OTk0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogdG8gYXZvaWQgbXVsdGlwbGUgY2FsbHMgb2YgcmVuZGVyZXIgbWV0aG9kcyB3aXRoaW4gcmVuZGVyZXIgaW50ZXJjZXB0b3JzIChlLmcuIGZvciBlbmNvZGUsIGRlY29kZSwuLi4pCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJlclByb3h5IGV4dGVuZHMgUmVuZGVyZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVkgPSBFeHRWYWxSZW5kZXJlclByb3h5LmNsYXNzLmdldE5hbWUoKSArICI6S0VZIjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotICAgIAotICAgIHByb3RlY3RlZCBSZW5kZXJlciB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcmVyUHJveHkoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSByZW5kZXJlcjsKLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eUVudHJ5IGVudHJ5ID0gZ2V0T3JJbml0RW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0RlY29kZUNhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXREZWNvZGVDYWxsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB3cmFwcGVkLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZG91YmxlIGNhbGwgb2YgbWV0aG9kICdkZWNvZGUnIGZpbHRlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5RW50cnkgZW50cnkgPSBnZXRPckluaXRFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRW5jb2RlQmVnaW5DYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RW5jb2RlQmVnaW5DYWxsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkb3VibGUgY2FsbCBvZiBtZXRob2QgJ2VuY29kZUJlZ2luJyBmaWx0ZXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eUVudHJ5IGVudHJ5ID0gZ2V0T3JJbml0RW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0VuY29kZUNoaWxkcmVuQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldEVuY29kZUNoaWxkcmVuQ2FsbGVkKHRydWUpOwotICAgICAgICAgICAgd3JhcHBlZC5lbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZG91YmxlIGNhbGwgb2YgbWV0aG9kICdlbmNvZGVDaGlsZHJlbicgZmlsdGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5RW50cnkgZW50cnkgPSBnZXRPckluaXRFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRW5jb2RlRW5kQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldEVuY29kZUVuZENhbGxlZCh0cnVlKTsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkb3VibGUgY2FsbCBvZiBtZXRob2QgJ2VuY29kZUVuZCcgZmlsdGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydENsaWVudElkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udmVydENsaWVudElkKGZhY2VzQ29udGV4dCwgcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UmVuZGVyc0NoaWxkcmVuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5RW50cnkgZW50cnkgPSBnZXRPckluaXRFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoZW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh3cmFwcGVkLmdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8pKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZG91YmxlIGNhbGwgb2YgbWV0aG9kICdnZXRDb252ZXJ0ZWRWYWx1ZScgZmlsdGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlbmRlcmVyUHJveHlFbnRyeSBnZXRPckluaXRFbnRyeShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGtleSArPSBnZXRPcHRpb25hbEtleShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWdldE9ySW5pdENvbXBvbmVudFByb3h5TWFwcGluZygpLmNvbnRhaW5zS2V5KGtleSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldE9ySW5pdENvbXBvbmVudFByb3h5TWFwcGluZygpLnB1dChrZXksIG5ldyBSZW5kZXJlclByb3h5RW50cnkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldE9ySW5pdENvbXBvbmVudFByb3h5TWFwcGluZygpLmdldChrZXkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3B0aW9uYWxLZXkoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX1NUT1JBR0VfTkFNRSA9IEV4dFZhbFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpICsgIjpTVE9SQUdFIjsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eUVudHJ5PiBnZXRPckluaXRDb21wb25lbnRQcm94eU1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgTWFwIHJlcXVlc3RNYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpOwotCi0gICAgICAgIGlmKCFyZXF1ZXN0TWFwLmNvbnRhaW5zS2V5KFBST1hZX1NUT1JBR0VfTkFNRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcXVlc3RNYXAucHV0KFBST1hZX1NUT1JBR0VfTkFNRSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5RW50cnk+PigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlFbnRyeT4+IHByb3h5U3RvcmFnZSA9Ci0gICAgICAgICAgICAoKE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlFbnRyeT4+KXJlcXVlc3RNYXAuZ2V0KFBST1hZX1NUT1JBR0VfTkFNRSkpOwotCi0gICAgICAgIFN0cmluZyBrZXkgPSB0aGlzLndyYXBwZWQuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0KLSAgICAgICAgaWYoIXByb3h5U3RvcmFnZS5jb250YWluc0tleShrZXkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm94eVN0b3JhZ2UucHV0KGtleSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5RW50cnk+KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByb3h5U3RvcmFnZS5nZXQoa2V5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyV3JhcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjMzA1ZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlJlbmRlcmVySW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci0KLS8qKgotICogRGVmYXVsdCBhcHByb2FjaCB0byBhdm9pZCBwcm94aWVzIGZvciBjb252ZXJ0ZXJzIGFuZCB0aGUgYWRhcHRlciBmYWxsYmFjay4KLSAqIEl0IHJlcXVpcmVzIHRoYXQgY29tcG9uZW50cyBkZWxlZ2F0ZSBnZXRDb252ZXJ0ZWRWYWx1ZSB0byBhIHJlbmRlcmVyLjxici8+Ci0gKiBJZiBpdCBpc24ndCB0aGUgY2FzZSBmb3IgeW91ciBjb21wb25lbnQgbGliIHVzZToKLSAqIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5LkV4dFZhbEFwcGxpY2F0aW9uRmFjdG9yeTxici8+Ci0gKiBhbmQ8YnIvPgotICogb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHkuUHJveHlNYXBwaW5nUGhhc2VMaXN0ZW5lcgotICogPHAvPgotICogVGhpcyB3cmFwcGVyIHdpbGwgYWxzbyBpbXBsZW1lbnQgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBiZWhhdmlvdXIKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcmVyV3JhcHBlciBleHRlbmRzIFJlbmRlcmVyCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByb3RlY3RlZCBSZW5kZXJlciB3cmFwcGVkOwotICAgIHByb3RlY3RlZCBFeHRWYWxDb250ZXh0IGV4dFZhbENvbnRleHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKTsKLQotICAgIHB1YmxpYyBFeHRWYWxSZW5kZXJlcldyYXBwZXIoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICBTdHJpbmcgcHJveHlDbGFzc05hbWUgPSAoU3RyaW5nKUV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZKTsKLQotICAgICAgICBpZihwcm94eUNsYXNzTmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm5vIGV4dHZhbCByZW5kZXJlciBwcm94eSBjb25maWd1cmVkIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRoaXMud3JhcHBlZCA9IG5ldyBFeHRWYWxMYXp5UmVuZGVyZXJQcm94eShyZW5kZXJlcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKHByb3h5Q2xhc3NOYW1lKTsKLQotICAgICAgICBpZih0YXJnZXRDbGFzcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm5vIGV4dHZhbCByZW5kZXJlciBwcm94eSBjb25maWd1cmVkIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRoaXMud3JhcHBlZCA9IG5ldyBFeHRWYWxMYXp5UmVuZGVyZXJQcm94eShyZW5kZXJlcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBDbGFzc1tdIGFyZ0NsYXNzZXMgPSBuZXcgQ2xhc3NbMV07Ci0gICAgICAgIGFyZ0NsYXNzZXNbMF0gPSBSZW5kZXJlci5jbGFzczsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSB0YXJnZXRDbGFzcy5nZXRDb25zdHJ1Y3RvcihhcmdDbGFzc2VzKTsKLSAgICAgICAgICAgIHRoaXMud3JhcHBlZCA9IChSZW5kZXJlciljb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShyZW5kZXJlcik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJubyBleHR2YWwgcmVuZGVyZXIgcHJveHkgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImV4dHZhbCByZW5kZXJlciB3cmFwcGVyIGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSB0cnVlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVEZWNvZGUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVEZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImRlY29kZSBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVEZWNvZGUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVEZWNvZGUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5kZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJEZWNvZGUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJEZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckRlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRGVjb2RlIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVFbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZW5jb2RlQmVnaW4gZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlQmVnaW4gaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5lbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQmVnaW4gaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBlbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSB0cnVlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVFbmNvZGVDaGlsZHJlbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJlbmNvZGVDaGlsZHJlbiBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVDaGlsZHJlbiBvZiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlQ2hpbGRyZW4gaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5lbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckVuY29kZUNoaWxkcmVuIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUNoaWxkcmVuIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVDaGlsZHJlbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSB0cnVlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVFbmNvZGVFbmQgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVFbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImVuY29kZUVuZCBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVFbmQgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlRW5kIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVFbmQgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUVuZCBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY29udmVydENsaWVudElkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udmVydENsaWVudElkKGZhY2VzQ29udGV4dCwgcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZ2V0UmVuZGVyc0NoaWxkcmVuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSB0cnVlOwotICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0ID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlR2V0Q29udmVydGVkVmFsdWUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvLCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udmVydGVkT2JqZWN0ID0gZS5nZXRSZXR1cm5WYWx1ZU9uRXhjZXB0aW9uKGNvbnZlcnRlZE9iamVjdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZ2V0Q29udmVydGVkVmFsdWUgZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlR2V0Q29udmVydGVkVmFsdWUgb2YgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUdldENvbnZlcnRlZFZhbHVlIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdCA9IHdyYXBwZWQuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8sIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyR2V0Q29udmVydGVkVmFsdWUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvUmVuZGVyZXJQcm94eUVudHJ5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L1JlbmRlcmVyUHJveHlFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWU1N2Y5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvUmVuZGVyZXJQcm94eUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgUmVuZGVyZXJQcm94eUVudHJ5Ci17Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRlY29kZUNhbGxlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVCZWdpbkNhbGxlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVDaGlsZHJlbkNhbGxlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVFbmRDYWxsZWQgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgT2JqZWN0IGNvbnZlcnRlZFZhbHVlID0gbnVsbDsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVjb2RlQ2FsbGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWNvZGVDYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVjb2RlQ2FsbGVkKGJvb2xlYW4gZGVjb2RlQ2FsbGVkKQotICAgIHsKLSAgICAgICAgdGhpcy5kZWNvZGVDYWxsZWQgPSBkZWNvZGVDYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmNvZGVCZWdpbkNhbGxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZW5jb2RlQmVnaW5DYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlQmVnaW5DYWxsZWQoYm9vbGVhbiBlbmNvZGVCZWdpbkNhbGxlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZW5jb2RlQmVnaW5DYWxsZWQgPSBlbmNvZGVCZWdpbkNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuY29kZUNoaWxkcmVuQ2FsbGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbmNvZGVDaGlsZHJlbkNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVDaGlsZHJlbkNhbGxlZChib29sZWFuIGVuY29kZUNoaWxkcmVuQ2FsbGVkKQotICAgIHsKLSAgICAgICAgdGhpcy5lbmNvZGVDaGlsZHJlbkNhbGxlZCA9IGVuY29kZUNoaWxkcmVuQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlRW5kQ2FsbGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbmNvZGVFbmRDYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlRW5kQ2FsbGVkKGJvb2xlYW4gZW5jb2RlRW5kQ2FsbGVkKQotICAgIHsKLSAgICAgICAgdGhpcy5lbmNvZGVFbmRDYWxsZWQgPSBlbmNvZGVFbmRDYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkVmFsdWUoT2JqZWN0IGNvbnZlcnRlZFZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy5jb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzJlZWY5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDllOTZjZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM3YzY0YS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUmVuZGVyZXJJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gICAgcHJvdGVjdGVkIFJlbmRlcmVySW50ZXJjZXB0b3IgZXhjZXB0aW9uU291cmNlOwotICAgIHByb3RlY3RlZCBPYmplY3QgaW5mb3JtYXRpb247Ci0gICAgYm9vbGVhbiBza2lwT3RoZXJJbnRlcmNlcHRvcnMgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oYm9vbGVhbiBza2lwT3RoZXJJbnRlcmNlcHRvcnMpCi0gICAgewotICAgICAgICB0aGlzLnNraXBPdGhlckludGVyY2VwdG9ycyA9IHNraXBPdGhlckludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbihib29sZWFuIHNraXBPdGhlckludGVyY2VwdG9ycywgUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgdGhpcyhza2lwT3RoZXJJbnRlcmNlcHRvcnMpOwotICAgICAgICB0aGlzLmV4Y2VwdGlvblNvdXJjZSA9IHJlbmRlcmVySW50ZXJjZXB0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5mb3JtYXRpb24oT2JqZWN0IGluZm9ybWF0aW9uKQotICAgIHsKLSAgICAgICAgdGhpcy5pbmZvcm1hdGlvbiA9IGluZm9ybWF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZm9ybWF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBza2lwT3RoZXJJbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRSZXR1cm5WYWx1ZU9uRXhjZXB0aW9uKE9iamVjdCBjdXJyZW50UmV0dXJuVmFsdWUpCi0gICAgewotICAgICAgICBpZih0aGlzLmV4Y2VwdGlvblNvdXJjZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5leGNlcHRpb25Tb3VyY2UuZ2V0UmV0dXJuVmFsdWVPblNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24odGhpcywgY3VycmVudFJldHVyblZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3VycmVudFJldHVyblZhbHVlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIwOThiYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogSW4gb3JkZXIgdG8gZXhlY3V0ZSBsb2dpYyBqdXN0IG9uY2UuDQotICogZS5nLiByZWdpc3RlciBhcnRpZmFjdHMgdmlhIGFwaQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICAvL2Rvbid0IHJlbW92ZSAtIGl0J3MgYSBmYWxsYmFjayBpZiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCBkZXJlZ2lzdHJhdGlvbg0KLSAgICAvL3RhcmdldDogZG9uJ3QgcHJvY2VzcyBpbml0IGxvZ2ljIG1vcmUgdGhhbiBvbmNlDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8Q2xhc3M+IGluaXRpYWxpemVkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKEFic3RyYWN0U3RhcnR1cExpc3RlbmVyLmNsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZWRMaXN0ZW5lcnMuY29udGFpbnMoZ2V0Q2xhc3MoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnQgaW5pdCBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiaW5pdCBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZmluYWxseQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEpzZlV0aWxzLmRlcmVnaXN0ZXJQaGFzZUxpc3RlbmVyKHRoaXMpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiYW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGRlcmVnaXN0ZXJpbmcgdGhlIHBoYXNlLWxpc3RlbmVyIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRDbGFzcygpLmdldE5hbWUoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC0+IHRoZXJlIGlzIGp1c3QgYSBsaXR0bGUgb3ZlcmhlYWQsIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJ1dCBldmVyeXRoaW5nIGVsc2Ugd29ya3MgY29ycmVjdGx5LiINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBob3dldmVyLCBwbGVhc2UgaW5mb3JtIHRoZSBjb21tdW5pdHkgYWJvdXQgeW91ciBjb25maWd1cmF0aW9uIiwgdCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZmluYWxseQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZExpc3RlbmVycy5hZGQoZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLlJFU1RPUkVfVklFVzsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0KCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0V4dFZhbFN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YzM2MGEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIKLSAgICAgICAgLkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIKLSAgICAgICAgLkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIKLSAgICAgICAgLkRlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXIKLSAgICAgICAgLlNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIKLXsKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKEV4dFZhbEluZm9ybWF0aW9uLlZFUlNJT04gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnRpbmcgdXAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciB2IiArIEV4dFZhbEluZm9ybWF0aW9uLlZFUlNJT04pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydGluZyB1cCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsKLQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSwgRXh0VmFsUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCksIGZhbHNlKTsKLQotICAgICAgICBpbml0TmFtZU1hcHBlcnMoKTsKLSAgICAgICAgZXhlY3V0ZUN1c3RvbVN0YXJ0dXBMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0TmFtZU1hcHBlcnMoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGRlYWN0aXZhdGVEZWZhdWx0TmFtZU1hcHBlcnMgPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9ERUZBVUxUX05BTUVfTUFQUEVSUzsKLSAgICAgICAgaWYgKChkZWFjdGl2YXRlRGVmYXVsdE5hbWVNYXBwZXJzICE9IG51bGwgJiYgZGVhY3RpdmF0ZURlZmF1bHROYW1lTWFwcGVycy5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvL3JlZ2lzdGVyIG1ldGFkYXRhIHRvIHZhbGlkYXRpb24gc3RyYXRlZ3kgbmFtZSBtYXBwZXIKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsKLQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsKLQotICAgICAgICAvL3JlZ2lzdGVyIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWVzc2FnZSByZXNvbHZlciBuYW1lIG1hcHBlcgotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0KLSAgICAgICAgLy9yZWdpc3RlciB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1ldGFkYXRhIHRyYW5zZm9ybWVyIG5hbWUgbWFwcGVyCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUN1c3RvbVN0YXJ0dXBMaXN0ZW5lcigpCi0gICAgewotICAgICAgICBTdHJpbmcgY3VzdG9tU3RhcnR1cExpc3RlbmVyTmFtZSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBUlRVUF9MSVNURU5FUik7Ci0gICAgICAgIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lciA9Ci0gICAgICAgICAgICAoQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGN1c3RvbVN0YXJ0dXBMaXN0ZW5lck5hbWUpOwotCi0gICAgICAgIGlmKGN1c3RvbVN0YXJ0dXBMaXN0ZW5lciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydCBpbml0IG9mICIgKyBjdXN0b21TdGFydHVwTGlzdGVuZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjdXN0b21TdGFydHVwTGlzdGVuZXIuaW5pdCgpOwotCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJpbml0IG9mICIgKyBjdXN0b21TdGFydHVwTGlzdGVuZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YzgwNWIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7DQotDQotLyoqDQotICogTWVzc2FnZVJlc29sdmVyIHdoaWNoIHVzZXMgcHJvcGVydHkgZmlsZXMuDQotICogU3ViY2xhc3NlcyBqdXN0IGhhdmUgdG8gcHJvdmlkZSB0aGUgcGFja2FnZSB0byBsb29rIGF0Lg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIGNhbiBhbHNvIHByb3ZpZGUgYSBjdXN0b20gbmFtZSB3aGljaCBpcyBlLmcuIGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciBpbXBsZW1lbnRzIE1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIgPSAiPz8/IjsNCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0RFRkFVTFRfQ09OVkVOVElPTjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZGVmYXVsdEJ1bmRsZSA9IG51bGw7DQotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VCdW5kbGVCYXNlTmFtZTsNCi0gICAgLy93aXRoIGpzZiAxLjEgb25seSBhdmFpbGFibGUgaWYgdGhlcmUgaXMgYSBjdXN0b20gYmVhbg0KLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlQnVuZGxlVmFyTmFtZTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGtleSA9PSBudWxsIHx8IGtleS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIGN1c3RvbU1lc3NhZ2UgPSBudWxsOw0KLQ0KLSAgICAgICAgLy9vbmx5IGluIGNhc2Ugb2YgYSBWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggaXMgY29uZmlndXJlZCBhcyBiZWFuDQotICAgICAgICBpZiAodGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSh0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSwgbG9jYWxlKTsNCi0gICAgICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm1lc3NhZ2UgYnVuZGxlICIgKyB0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSArICIgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvL29ubHkgaW4gY2FzZSBvZiBhIFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciB3aGljaCBpcyBjb25maWd1cmVkIGFzIGJlYW4NCi0gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VCdW5kbGVWYXJOYW1lICE9IG51bGwgJiYgY3VzdG9tTWVzc2FnZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gKFJlc291cmNlQnVuZGxlKSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4obWVzc2FnZUJ1bmRsZVZhck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigibWVzc2FnZSBidW5kbGUgdmFyIG5hbWUgIiArIHRoaXMubWVzc2FnZUJ1bmRsZVZhck5hbWUgKyAiIG5vdCBmb3VuZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGN1c3RvbU1lc3NhZ2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qDQotICAgICAgICAgKiB0cnkgdG8gdXNlIHRoZSBjb252ZW50aW9uIGZvciB0aGUgbWVzc2FnZSBidW5kbGUNCi0gICAgICAgICAqLw0KLSAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHRyeVRvVXNlTWVzc2FnZUJ1bmRsZUNvbnZlbnRpb24oa2V5LCBsb2NhbGUpOw0KLQ0KLSAgICAgICAgaWYgKGN1c3RvbU1lc3NhZ2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qDQotICAgICAgICAgKiBubyBtZXNzYWdlIGJ1bmRsZSBvciBtZXNzYWdlIGZvdW5kICh3aXRoIHRoZSBjb252ZW50aW9uKT8NCi0gICAgICAgICAqLw0KLQ0KLSAgICAgICAgLy90cnkgdG8gbG9hZCBjdXN0b20gbWVzc2FnZXMNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEN1c3RvbUJhc2VOYW1lKCksIGxvY2FsZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyBjdXN0b20gbWVzc2FnZSBmb3IgIiArIGtleSArICIgd2l0aGluICIgKyBnZXRDdXN0b21CYXNlTmFtZSgpLCBlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vdXNlIGN1c3RvbSBuYW1lIChpZiBwb3NzaWJsZSkgb3RoZXJ3aXNlOiBmYWxsYmFjayB0byBkZWZhdWx0IG1lc3NhZ2UgKGlmIHBvc3NpYmxlKQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChjdXN0b21NZXNzYWdlICE9IG51bGwpID8gY3VzdG9tTWVzc2FnZQ0KLSAgICAgICAgICAgICAgICA6IChnZXRCYXNlTmFtZSgpICE9IG51bGwpID8gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEJhc2VOYW1lKCksIGxvY2FsZSkuZ2V0U3RyaW5nKGtleSkgOiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBNSVNTSU5HX1JFU09VUkNFX01BUktFUiArIGtleSArIE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvVXNlTWVzc2FnZUJ1bmRsZUNvbnZlbnRpb24oU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1c3RvbU1lc3NhZ2UgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKChkZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb24gPT0gbnVsbCB8fCAhZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgICAgICAmJiBpc0RlZmF1bHRNZXNzYWdlQnVuZGxlQ29udmVudGlvbkFjdGl2ZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChkZWZhdWx0QnVuZGxlID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX0JVTkRMRV9OQU1FKSwgbG9jYWxlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZw0KLSAgICAgICAgICAgICAgICAgICAgZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID0gInRydWUiOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChkZWZhdWx0QnVuZGxlICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IGRlZmF1bHRCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGVmYXVsdE1lc3NhZ2VCdW5kbGVDb252ZW50aW9uQWN0aXZlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRCYXNlTmFtZSgpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUJ1bmRsZUJhc2VOYW1lKFN0cmluZyBtZXNzYWdlQnVuZGxlQmFzZU5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lID0gbWVzc2FnZUJ1bmRsZUJhc2VOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VCdW5kbGVWYXJOYW1lKFN0cmluZyBtZXNzYWdlQnVuZGxlVmFyTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSA9IG1lc3NhZ2VCdW5kbGVWYXJOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQwZTY4Zi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyBhIE1lc3NhZ2VSZXNvbHZlciBmb3IgYSBnaXZlbiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJhZGQgZ2VuZXJpYyBqYXZhIGFwaSAoZGUtL3JlZ2lzdGVyIG1hcHBpbmcpIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotICAgICAgICBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXNzYWdlUmVzb2x2ZXI+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nOw0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBuYW1lTWFwcGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PigpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlUmVzb2x2ZXIgY3JlYXRlKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHN0cmF0ZWd5TmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChNZXNzYWdlUmVzb2x2ZXIpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmdldChzdHJhdGVneU5hbWUpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICBTdHJpbmcgcmVzb2x2ZXJOYW1lOw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vYnVpbGQgY29udmVudGlvbiAoVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKQ0KLSAgICAgICAgICAgIHJlc29sdmVyTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIC8vbmFtZSB3YXNuJ3QgbWFwcGVkDQotICAgICAgICAgICAgaWYgKHJlc29sdmVyTmFtZSA9PSBudWxsIHx8IHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMocmVzb2x2ZXJOYW1lKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtZXNzYWdlUmVzb2x2ZXIgPSAoTWVzc2FnZVJlc29sdmVyKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUocmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWVzc2FnZVJlc29sdmVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKHN0cmF0ZWd5TmFtZSwgcmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZXNvbHZlck5hbWUgKyAiIHVzZWQgZm9yICIgKyBzdHJhdGVneU5hbWUpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYWRkTWFwcGluZyhzdHJhdGVneU5hbWUsIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotDQotICAgICAgICAvL3NldHVwIGludGVybmFsIHN0YXRpYyBtYXBwaW5ncw0KLSAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgOg0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsU3RyaW5nPj4gbWFwcGluZ3MpDQotICAgIHsNCi0gICAgICAgIGZvcihTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IG1hcHBpbmcgOiBtYXBwaW5ncykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNYXBwaW5nKG1hcHBpbmcuZ2V0U291cmNlKCksIG1hcHBpbmcuZ2V0VGFyZ2V0KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgbWVzc2FnZVJlc29sdmVyTmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZGRpbmcgc3RhdGljIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWVzc2FnZSByZXNvbHZlciBtYXBwaW5nOiAiDQotICAgICAgICAgICAgICAgICsgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArICIgLT4gIiArIG1lc3NhZ2VSZXNvbHZlck5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLnB1dCh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBtZXNzYWdlUmVzb2x2ZXJOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IGdldE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5hbWVNYXBwZXJMaXN0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OWVkYzYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IE1lc3NhZ2VSZXNvbHZlciB3aGljaCB1c2VzIHRoZSBkZWZhdWx0IGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gbWVzc2FnZSBidW5kbGUgdmlhIHdlYi54bWwNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CVU5ETEUgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FU1NBR0VfQlVORExFOw0KLQ0KLSAgICAvL25vdCB1c2VkIGF0IHRoZSBtb21lbnQgLSBqdXN0IGZvciBhIGNvbnZlbnRpb24NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNb2R1bGVNZXNzYWdlQnVuZGxlTmFtZShnZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tQmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ1VTVE9NX0JVTkRMRTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL01lc3NhZ2VSZXNvbHZlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNjYTFjMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL01lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBNZXNzYWdlUmVzb2x2ZXJzIGluZGVwZW5kZW50IG9mIHRoZSBtZXNzYWdlIHNvdXJjZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGQ0MGI2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NzQwMWEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXNzYWdlUmVzb2x2ZXJzLg0KLSAqIChjb25maWd1cmVkIHZpYSB3ZWIueG1sKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzcyMDM1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ3kgdG8gTWVzc2FnZVJlc29sdmVyLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NU0dfUkVTT0xWRVJfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYjU5YjUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIHByb3ZpZGUgYSBOYW1lTWFwcGVyIHBlciB2YWxpZGF0aW9uIG1vZHVsZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBzdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NDgzOGIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIG1hcHMgRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIEV4dFZhbCBNZXNzYWdlUmVzb2x2ZXJzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKHN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI2MDZmNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgdG8gcGxhY2UgVmFsaWRhdGlvblN0cmF0ZWdpZXMgYW5kIE1lc3NhZ2VSZXNvbHZlcnMgaW4gdGhlIHNhbWUgcGFja2FnZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBzdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1c3RvbVBvc3RmaXggPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWCk7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHN0cmF0ZWd5Q2xhc3NOYW1lLCBjdXN0b21Qb3N0Zml4KTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGRlYWJmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci0KLS8qKgotICogUHJvdmlkZXMgdGhlIGFiaWxpdHkgb2YgbWVzc2FnZSByZXNvbHZpbmcgdG8gVmFsaWRhdGlvblN0cmF0ZWdpZXMKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kKLXsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCA9ICJfZGV0YWlsIjsKLSAgICAvL2UuZy4gZm9yIGluamVjdGluZyBhIG1lc3NhZ2UgcmVzb2x2ZXIgdmlhIHNwcmluZwotICAgIHByaXZhdGUgTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcjsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIExvY2FsZSBsb2NhbGUgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKTsKLQotICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlUmVzb2x2ZXIgIT0gbnVsbCA/IHRoaXMubWVzc2FnZVJlc29sdmVyLmdldE1lc3NhZ2Uoa2V5LCBsb2NhbGUpIDoKLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldE1lc3NhZ2VSZXNvbHZlckZvclZhbGlkYXRpb25TdHJhdGVneSh0aGlzKS5nZXRNZXNzYWdlKGtleSwgbG9jYWxlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlc29sdmVNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gKGtleSAhPSBudWxsKSA/IHJlc29sdmVNZXNzYWdlKGtleSArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYKSA6IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRmFjZXNNZXNzYWdlIGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWFzc2FnZShBbm5vdGF0aW9uIGFubm90YXRpb24pCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsCi0gICAgICAgICAgICBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24pLCBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbikpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbik7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlUmVzb2x2ZXIoTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIHRoaXMubWVzc2FnZVJlc29sdmVyID0gbWVzc2FnZVJlc29sdmVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQotICAgIHsKLSAgICAgICAgbWV0YURhdGFFbnRyeS5zZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCwgZ2V0TGFiZWwoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSkpOwotCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24pOwotICAgIH0KLQotICAgIC8vZm9yIGN1c3RvbSBhbm5vdGF0aW9ucyAtIG92ZXJyaWRlIGlmIG5lZWRlZAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2U0NjIwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIFByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIHVzZSBWYWxpZGF0b3JFeGNlcHRpb24gKGFzIGV4cGVjdGVkIGJ5IHRoZSB1c2VyKSBpbnN0ZWFkIG9mIENvbnZlcnRlckV4Y2VwdGlvbi4NCi0gKiBGdXJ0aGVybW9yZSBpdCBwcm92aWRlczo8YnIvPg0KLSAqIGluaXRWYWxpZGF0aW9uPGJyLz4NCi0gKiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBpbml0VmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW5pdFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiaW5pdFZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHByb2Nlc3NWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByb2Nlc3NWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInByb2Nlc3NWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVmFsaWRhdG9yRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAocHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgZSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGdldENsYXNzKCkuZ2V0TmFtZSgpICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiOiB0aHJvdyBvcmlnaW5hbCBleGNlcHRpb24gYWZ0ZXIgcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgdGhyb3cgZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgIjogb3JpZ2luYWwgZXhjZXB0aW9uIGFmdGVyIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbiwgdGhpcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNWRjNGUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0NCi0gKiBhZGFwdGVyIHRvIGNvbm5lY3QgdmFsaWRhdGlvbiBzdHJhdGVnaWVzIHdpdGggbWV0YS1kYXRhIHRyYW5zZm9ybWVycywNCi0gKiBpZiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBkZWZpbmVkIGFzIGJlYW4gYW5kIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBpbnRlcmZhY2UgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIgZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIC8vdG8gZ2V0IGJhY2sgdGhlIGludGVybmFsIGNhc2hpbmcNCi0gICAgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpOw0KLQ0KLSAgICBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzVjYjYzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLkJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotDQotICogYWRhcHRlciB0byBjb25uZWN0IHZhbGlkYXRpb24gc3RyYXRlZ2llcyB3aXRoIG1ldGEtZGF0YSB0cmFuc2Zvcm1lcnMsDQotICogaWYgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgZGVmaW5lZCBhcyBiZWFuIGFuZCBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIC8vb3B0aW9uYWwgZmFsbGJhY2sgZm9yIGludGVybmFsIGNhc2hpbmcNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOw0KLQ0KLSAgICBwdWJsaWMgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyIGluc3RhbmNlb2YgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIpIG1ldGFEYXRhVHJhbnNmb3JtZXIgKS5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGdldE1ldGFEYXRhVHJhbnNmb3JtZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVRyYW5zZm9ybWVyKE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyID0gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsaWRhdGlvblN0cmF0ZWd5ID0gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMwNDQ0NC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyDQotICAgIC5Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotDQotLyoqDQotICogRmFjdG9yeSB3aGljaCBjcmVhdGVzIHRoZSBWYWxpZGF0aW9uU3RyYXRlZ3kgZm9yIGEgZ2l2ZW4gTWV0YS1EYXRhIEtleQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkNCi0gICAgICAgIGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxNZXRhRGF0YUVudHJ5LCBWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcgPSBudWxsOw0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxNZXRhRGF0YUVudHJ5Pj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8TWV0YURhdGFFbnRyeT4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBjcmVhdGUoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZiAobWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljTWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZy5jb250YWluc0tleShtZXRhRGF0YUVudHJ5LmdldEtleSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5SW5zdGFuY2UobWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcuZ2V0KG1ldGFEYXRhRW50cnkuZ2V0S2V5KCkpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgICAgICBTdHJpbmcgc3RyYXRlZ3lOYW1lOw0KLSAgICAgICAgLy9udWxsIC0+IHVzZSBuYW1lIG1hcHBlcnMNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxNZXRhRGF0YUVudHJ5PiBuYW1lTWFwcGVyIDogdGhpcy5uYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdHJhdGVneU5hbWUgPSBuYW1lTWFwcGVyLmNyZWF0ZU5hbWUobWV0YURhdGFFbnRyeSk7DQotDQotICAgICAgICAgICAgaWYgKHN0cmF0ZWd5TmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKHN0cmF0ZWd5TmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyhtZXRhRGF0YUVudHJ5LmdldEtleSgpLCBzdHJhdGVneU5hbWUpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZQ0KLSAgICAgICAgICAgIC5zdGFydHNXaXRoKEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLlBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFZhbGlkYXRpb25TdHJhdGVneSkgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKHZhbGlkYXRpb25TdHJhdGVneU5hbWUNCi0gICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuUFJFRklYX0ZPUl9CRUFOX01BUFBJTkcubGVuZ3RoKCkpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFZhbGlkYXRpb25TdHJhdGVneSkgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBtZXRhRGF0YUtleSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkaW5nIG1ldGEtZGF0YSBrZXkgdG8gdmFsaWRhdGlvbiBzdHJhdGVneSBtYXBwaW5nOiAiDQotICAgICAgICAgICAgICAgICsgbWV0YURhdGFLZXkgKyAiIC0+ICIgKyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nLnB1dChtZXRhRGF0YUtleSwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotDQotICAgICAgICAvL3NldHVwIGludGVybmFsIHN0YXRpYyBtYXBwaW5ncw0KLSAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgOg0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA9IG5ldyBTdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgIC8vdHJ5IHRvIHNldHVwIG1hcHBpbmcgd2l0aCBiYXNlIG5hbWUgYnkgY29udmVudGlvbiAtIG92ZXJyaWRlcyBkZWZhdWx0IG1hcHBpbmcNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vYnVpbGQgY29udmVudGlvbiAoc3RyYXRlZ3kgbWFwcGluZykNCi0gICAgICAgICAgICBzdGF0aWNDb25maWcuc2V0U291cmNlT2ZNYXBwaW5nKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5TVEFUSUNfU1RSQVRFR1lfTUFQUElOR19TT1VSQ0UpKTsNCi0NCi0gICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vc2V0dXAgY3VzdG9tIG1hcHBpbmcgLSBvdmVycmlkZXMgYWxsIG90aGVyIG1hcHBpbmdzDQotICAgICAgICBTdHJpbmcgY3VzdG9tTWFwcGluZ0Jhc2VOYW1lID0gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9TVEFUSUNfVkFMSURBVElPTl9TVFJBVEVHWV9NQVBQSU5HOw0KLSAgICAgICAgaWYgKGN1c3RvbU1hcHBpbmdCYXNlTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnID0gbmV3IFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgICAgICAgICBzdGF0aWNDb25maWcuc2V0U291cmNlT2ZNYXBwaW5nKGN1c3RvbU1hcHBpbmdCYXNlTmFtZSk7DQotICAgICAgICAgICAgICAgIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsU3RyaW5nPj4gbWFwcGluZ3MpDQotICAgIHsNCi0gICAgICAgIGZvcihTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IG1hcHBpbmcgOiBtYXBwaW5ncykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNYXBwaW5nKG1hcHBpbmcuZ2V0U291cmNlKCksIG1hcHBpbmcuZ2V0VGFyZ2V0KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBMaXN0PE5hbWVNYXBwZXI8TWV0YURhdGFFbnRyeT4+IGdldE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZU1hcHBlckxpc3Q7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1NTIzZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBCYXNlIGludGVyZmFjZSBmb3IgVmFsaWRhdGlvblN0cmF0ZWdpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLS8vKlZhbGlkYXRpb25TdHJhdGVneSBpbnN0ZWFkIG9mICpWYWxpZGF0b3IgdG8gYXZvaWQgbmFtaW5nIGNvbmZ1c2lvbiANCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFhNDM2NC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxNZXRhRGF0YUVudHJ5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0Njg3MGYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBOYW1lIE1hcHBlciB3aGljaCBkZWxlZ2F0ZXMgdGhlIG5hbWUgbWFwcGluZywgZXh0cmFjdCB0aGUgbmFtZSBhbmQgY29udmVydCBpdCB0byBhIGJlYW4gbmFtZSArIHByZWZpeA0KLSAqIHRhcmdldDogY29uZmlndXJlIGEgdmFsaWRhdGlvbiBzdHJhdGVneSB2aWEgYSBtYW5hZ2VkIGJlYW4gZmFjaWxpdHkgLT4gYWxsb3dzIHRvIGluamVjdCBvdGhlciBiZWFucw0KLSAqIGluc3RlYWQgb2YgYXBpIGNhbGxzICsgaGFyZGNvZGVkIGJlYW4gbmFtZXMNCi0gKiA8cC8+DQotICogYWxsb3dlZCBiZWFuIHNjb3BlczoNCi0gKiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBzdGF0ZWxlc3M6IGFwcGxpY2F0aW9uL3NpbmdsZXRvbg0KLSAqIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIHN0YXRlZnVsOiBub25lL3Byb3RvdHlwZQ0KLSAqIGRvbid0IHVzZSB0aGUgc2Vzc2lvbiBvciBhIGNvbnZlcnNhdGlvbiBzY29wZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfRk9SX0JFQU5fTUFQUElORyA9ICJiZWFuOiI7DQotICAgIHByaXZhdGUgTmFtZU1hcHBlcjxNZXRhRGF0YUVudHJ5PiB3cmFwcGVkOw0KLQ0KLSAgICBwdWJsaWMgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoTmFtZU1hcHBlcjxNZXRhRGF0YUVudHJ5PiBuYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSBuYW1lTWFwcGVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShNZXRhRGF0YUVudHJ5IHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSB3cmFwcGVkLmNyZWF0ZU5hbWUoc291cmNlKTsNCi0NCi0gICAgICAgIGlmIChuYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7DQotICAgICAgICByZXR1cm4gUFJFRklYX0ZPUl9CRUFOX01BUFBJTkcgKyBuYW1lLnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZSgpICsgbmFtZS5zdWJzdHJpbmcoMSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJiNmRjYi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIEFubm90YXRpb25zIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqIChjb25maWd1cmVkIHZpYSB3ZWIueG1sKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8TWV0YURhdGFFbnRyeT4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ODdiZmQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIEFubm90YXRpb25zIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPE1ldGFEYXRhRW50cnk+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYTM5ZTUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIG1hcHMgRXh0VmFsIEFubm90YXRpb25zIHRvIEV4dFZhbCBWYWxpZGF0aW9uU3RyYXRlZ2llcy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZShtZXRhRGF0YUVudHJ5LmdldEtleSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JlMGQ0ZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgdG8gcGxhY2UgQW5ub3RhdGlvbnMgYW5kIFZhbGlkYXRpb25TdHJhdGVnaWVzIGluIHRoZSBzYW1lIHBhY2thZ2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFFbnRyeS5nZXRLZXkoKSArDQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMWFhMzMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Qcmlvcml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLXB1YmxpYyBlbnVtIFByaW9yaXR5Ci17Ci0gICAgQkxPQ0tJTkcsCi0gICAgSElHSCwKLSAgICBNRURJVU0sCi0gICAgTE9XCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Ub0RvLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0NDZmOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLXB1YmxpYyBAaW50ZXJmYWNlIFRvRG8KLXsKLSAgICBQcmlvcml0eSB2YWx1ZSgpOwotICAgIFN0cmluZyBkZXNjcmlwdGlvbigpIGRlZmF1bHQgIiI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ3YjM4NS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbDsKLQotLyoqCi0gKiBBUEk6PGJyLz4KLSAqIHBhcnRzIHlvdSBtaWdodCBuZWVkIGZvciBjdXN0b20gaW1wbGVtZW50YXRpb25zIGFuZCB3aGljaCBhcmUgcXVpdGUgc3RhYmxlIGluIHZpZXcgb2YgY2hhbmdlcwotICogPHAvPgotICogSU5URVJOQUw6PGJyLz4KLSAqIGlmIHlvdSB0aGluayBhYm91dCByZWZlcmVuY2luZyBhbiBhcnRpZmFjdCB3aGljaCBpcyBtYXJrZWQgYXMgaW50ZXJuYWwsIGFzayBmb3Igc3VwcG9ydC4KLSAqIHRoZXJlIHNob3VsZCBiZSBhIGJldHRlciBzb2x1dGlvbgotICogPHAvPgotICogQ1VTVE9NSVpBQkxFOjxici8+Ci0gKiBhIHBsYW5uZWQgZXh0ZW5zaW9uIHBvaW50IHdoaWNoIGNvbnRhaW5zIGxvZ2ljIHRvIGN1c3RvbWl6ZSB0aGUgZnJhbWV3b3JrLgotICogaWYgaXQgaXNuJ3QgYWxzbyBtYXJrZWQgYXMgQVBJIGl0IG1pZ2h0IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuCi0gKiBob3dldmVyLCB3ZSB0cnkgdG8ga2VlcCBpdCBhcyBzdGFibGUgYXMgcG9zc2libGUgYW5kIHJlYXNvbmFibGUuCi0gKiA8cC8+Ci0gKiBSRVVTRTo8YnIvPgotICogYW4gYXJ0aWZhY3Qgd2hpY2ggeW91IGNhbiByZXVzZSBmb3IgYSBjdXN0b20gaW1wbGVtZW50YXRpb24uCi0gKiBpZiBpdCBpc24ndCBtYXJrZWQgYXMgQVBJIGl0IG1pZ2h0IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuCi0gKiBob3dldmVyLCB3ZSB0cnkgdG8ga2VlcCBpdCBhcyBzdGFibGUgYXMgcG9zc2libGUgYW5kIHJlYXNvbmFibGUuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGVudW0gVXNhZ2VDYXRlZ29yeQotewotICAgIEFQSSwKLSAgICBJTlRFUk5BTCwKLSAgICBDVVNUT01JWkFCTEUsCi0gICAgUkVVU0UKLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MzdlYmMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogaXQncyBhbiBpbnRlcm5hbCBhbm5vdGF0aW9uIHRvIHByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBjb25jZXJuaW5nIHVzYWdlLWNhdGVnb3JpZXMKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeQotICovCi1AVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLXB1YmxpYyBAaW50ZXJmYWNlIFVzYWdlSW5mb3JtYXRpb24KLXsKLSAgICBVc2FnZUNhdGVnb3J5W10gdmFsdWUoKTsKLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWE2NWIxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDbGFzc1V0aWxzDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coQ2xhc3NVdGlscy5jbGFzcyk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgdHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbG9hZENsYXNzRm9yTmFtZShuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgbG9hZENsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gVHJ5IFdlYkFwcCBDbGFzc0xvYWRlciBmaXJzdA0KLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKG5hbWUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXANCi0gICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gZmFsbGJhY2s6IFRyeSBDbGFzc0xvYWRlciBmb3IgQ2xhc3NVdGlscyAoaS5lLiB0aGUgbXlmYWNlcy5qYXIgbGliKQ0KLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKG5hbWUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXANCi0gICAgICAgICAgICAgICAgQ2xhc3NVdGlscy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0luc3RhbnRpYXRlQ2xhc3MoQ2xhc3MgdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0YXJnZXRDbGFzcy5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKFN0cmluZyBjbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxvYWRDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEphclZlcnNpb24oQ2xhc3MgdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjbGFzc0ZpbGVQYXRoID0gdGFyZ2V0Q2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyI7DQotICAgICAgICBTdHJpbmcgbWFuaWZlc3RGaWxlUGF0aCA9ICIvTUVUQS1JTkYvTUFOSUZFU1QuTUYiOw0KLQ0KLSAgICAgICAgU3RyaW5nIGNsYXNzTG9jYXRpb24gPSB0YXJnZXRDbGFzcy5nZXRSZXNvdXJjZSh0YXJnZXRDbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLmNsYXNzIikudG9TdHJpbmcoKTsNCi0gICAgICAgIFN0cmluZyBtYW5pZmVzdEZpbGVMb2NhdGlvbiA9IGNsYXNzTG9jYXRpb24NCi0gICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCBjbGFzc0xvY2F0aW9uLmluZGV4T2YoY2xhc3NGaWxlUGF0aCkgLSAxKSArIG1hbmlmZXN0RmlsZVBhdGg7DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IE1hbmlmZXN0KG5ldyBVUkwobWFuaWZlc3RGaWxlTG9jYXRpb24pLm9wZW5TdHJlYW0oKSkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNYWluQXR0cmlidXRlcygpLmdldFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5JTVBMRU1FTlRBVElPTl9WRVJTSU9OKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoTE9HLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBMT0cudHJhY2UoImNvdWxkbid0IGxvYWQgdmVyc2lvbiBvZiBqYXIgZmlsZSB3aGljaCBjb250YWlucyAiICsgdGFyZ2V0Q2xhc3MuZ2V0TmFtZSgpLCB0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRlZTkxYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLk1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkFic3RyYWN0RUxIZWxwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuTmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbFV0aWxzDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfUkVRVUlSRUQgPSAiamF2YXguZmFjZXMuY29tcG9uZW50LlVJSW5wdXQuUkVRVUlSRUQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfUkVRVUlSRURfREVUQUlMID0gImphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUlucHV0LlJFUVVJUkVEX2RldGFpbCI7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19NQVhJTVVNID0gImphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3IuTUFYSU1VTSI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19NQVhJTVVNX0RFVEFJTCA9ICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yLk1BWElNVU1fZGV0YWlsIjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKENsYXNzTWFwcGluZ0ZhY3Rvcnk8T2JqZWN0LCBWYWxpZGF0aW9uU3RyYXRlZ3k+KSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlKG1ldGFEYXRhRW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIE5hbWVNYXBwZXI8TWV0YURhdGFFbnRyeT4gbWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAucmVnaXN0ZXIobWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVyZWdpc3RlcihtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVueU1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlbnkobWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1ldGFEYXRhVHJhbnNmb3JtZXI+KSBFeHRWYWxDb250ZXh0DQotICAgICAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAucmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlcmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZXJlZ2lzdGVyKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbnlWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZW55KHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcigpDQotICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLCBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50V2l0aE1ldGFEYXRhKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgZm9yKENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyIDogRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXIuY29uZmlndXJlQ29tcG9uZW50KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsNCi0NCi0gICAgICAgIGZvcihWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIDogRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmFmdGVyVGhyb3dpbmcoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbiwgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGVJbnRlcmNlcHRlZE1ldGFEYXRhRXh0cmFjdG9yKGZpbmFsIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IE1ldGFEYXRhRXh0cmFjdG9yKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHJlc3VsdCA9IG1ldGFEYXRhRXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCBvYmplY3QpOw0KLSAgICAgICAgICAgICAgICBmb3IoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5hZnRlckV4dHJhY3RpbmcocmVzdWx0KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH07DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlUmVzb2x2ZXIgZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXNzYWdlUmVzb2x2ZXI+KUV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgIC5jcmVhdGUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLnJlZ2lzdGVyKHZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVyZWdpc3Rlcih2YWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbnlWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IHZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlbnkodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRUxIZWxwZXIgZ2V0RUxIZWxwZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkVMX0hFTFBFUl9GQUNUT1JZLCBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeS5jbGFzcykuY3JlYXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eURldGFpbHMgY3JlYXRlUHJvcGVydHlEZXRhaWxzRm9yTmV3VGFyZ2V0KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldEV4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBiYXNlT2JqZWN0Ow0KLSAgICAgICAgaWYoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQodGFyZ2V0RXhwcmVzc2lvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YmUgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih0YXJnZXRFeHByZXNzaW9uKTsNCi0NCi0gICAgICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbiA9IHZiZS5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICAgICAgYmFzZU9iamVjdCA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZiZS5nZXRCYXNlRXhwcmVzc2lvbigpKTsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5zdWJzdHJpbmcoMiwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpLCBiYXNlT2JqZWN0LCB2YmUuZ2V0UHJvcGVydHkoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgb3JpZ2luYWwgPSBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KA0KLSAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBTdHJpbmcgbmV3QmFzZUtleSA9IG9yaWdpbmFsLmdldEtleSgpLnN1YnN0cmluZygwLCBvcmlnaW5hbC5nZXRLZXkoKS5sYXN0SW5kZXhPZigiLiIpICsgMSk7DQotICAgICAgICBTdHJpbmcgbmV3S2V5ID0gbmV3QmFzZUtleSArIHRhcmdldEV4cHJlc3Npb247DQotDQotICAgICAgICBiYXNlT2JqZWN0ID0gUmVmbGVjdGlvblV0aWxzLmdldEJhc2VPZlByb3BlcnR5Q2hhaW4ob3JpZ2luYWwuZ2V0QmFzZU9iamVjdCgpLCB0YXJnZXRFeHByZXNzaW9uKTsNCi0gICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlEZXRhaWxzKA0KLSAgICAgICAgICAgIG5ld0tleSwgYmFzZU9iamVjdCwgdGFyZ2V0RXhwcmVzc2lvbi5zdWJzdHJpbmcodGFyZ2V0RXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiLiIpICsgMSwNCi0gICAgICAgICAgICB0YXJnZXRFeHByZXNzaW9uLmxlbmd0aCgpKSk7DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvUGxhY2VMYWJlbChGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBTdHJpbmcgbGFiZWwsIGludCBpbmRleCkNCi0gICAgew0KLSAgICAgICAgaWYoZmFjZXNNZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsICYmIGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkuY29udGFpbnMoInsiICsgaW5kZXggKyAifSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkucmVwbGFjZSgieyIgKyBpbmRleCArICJ9IiwgbGFiZWwpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsICYmIGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKS5jb250YWlucygieyIgKyBpbmRleCArICJ9IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldERldGFpbChmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkucmVwbGFjZSgieyIgKyBpbmRleCArICJ9IiwgbGFiZWwpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVwbGFjZVdpdGhEZWZhdWx0TWF4aW11bU1lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgaW50IG1heExlbmd0aCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGZhY2VzUmVxdWlyZWRNZXNzYWdlID0gSnNmVXRpbHMuZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhKQVZBWF9GQUNFU19NQVhJTVVNKTsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlOw0KLQ0KLSAgICAgICAgLy91c2UgdHJ5L2NhdGNoIGZvciBlYXNpZXIgc3luYyBiZXR3ZWVuIHRydW5rL2JyYW5jaA0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoSnNmVXRpbHMuZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhKQVZBWF9GQUNFU19NQVhJTVVNX0RFVEFJTCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsID0gSnNmVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhKQVZBWF9GQUNFU19NQVhJTVVNX0RFVEFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9qc2YgMS4yIGRvZXNuJ3QgaGF2ZSBhIGRldGFpbCBtZXNzYWdlDQotICAgICAgICB9DQotDQotICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZSA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlLnJlcGxhY2UoInswfSIsICIiICsgbWF4TGVuZ3RoKTsNCi0gICAgICAgIGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsID0gZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwucmVwbGFjZSgiezB9IiwgIiIgKyBtYXhMZW5ndGgpOw0KLQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoZmFjZXNSZXF1aXJlZE1lc3NhZ2UpOw0KLSAgICAgICAgZmFjZXNNZXNzYWdlLnNldERldGFpbChmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCk7DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2UgPSBKc2ZVdGlscy5nZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkuZ2V0U3RyaW5nKEpBVkFYX0ZBQ0VTX1JFUVVJUkVEKTsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlOw0KLQ0KLSAgICAgICAgLy91c2UgdHJ5L2NhdGNoIGZvciBlYXNpZXIgc3luYyBiZXR3ZWVuIHRydW5rL2JyYW5jaA0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoSnNmVXRpbHMuZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhKQVZBWF9GQUNFU19SRVFVSVJFRF9ERVRBSUwpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IEpzZlV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfUkVRVUlSRURfREVUQUlMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2pzZiAxLjIgZG9lc24ndCBoYXZlIGEgZGV0YWlsIG1lc3NhZ2UNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGZhY2VzUmVxdWlyZWRNZXNzYWdlKTsNCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0pzZlV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNTBkODkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0pzZlV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWN0b3J5RmluZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5saWZlY3ljbGUuTGlmZWN5Y2xlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5saWZlY3ljbGUuTGlmZWN5Y2xlRmFjdG9yeTsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7DQotDQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnNmVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcihQaGFzZUxpc3RlbmVyIHBoYXNlTGlzdGVuZXIpDQotICAgIHsNCi0gICAgICAgIExpZmVjeWNsZUZhY3RvcnkgbGlmZWN5Y2xlRmFjdG9yeSA9IChMaWZlY3ljbGVGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShGYWN0b3J5RmluZGVyLkxJRkVDWUNMRV9GQUNUT1JZKTsNCi0NCi0gICAgICAgIFN0cmluZyBjdXJyZW50SWQ7DQotICAgICAgICBMaWZlY3ljbGUgY3VycmVudExpZmVjeWNsZTsNCi0gICAgICAgIEl0ZXJhdG9yIGxpZmVjeWNsZUlkcyA9IGxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlSWRzKCk7DQotICAgICAgICB3aGlsZSAobGlmZWN5Y2xlSWRzLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50SWQgPSAoU3RyaW5nKSBsaWZlY3ljbGVJZHMubmV4dCgpOw0KLSAgICAgICAgICAgIGN1cnJlbnRMaWZlY3ljbGUgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZShjdXJyZW50SWQpOw0KLSAgICAgICAgICAgIGN1cnJlbnRMaWZlY3ljbGUucmVtb3ZlUGhhc2VMaXN0ZW5lcihwaGFzZUxpc3RlbmVyKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgU3RyaW5nIGJ1bmRsZU5hbWUgPSBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5nZXRNZXNzYWdlQnVuZGxlKCk7DQotDQotICAgICAgICBpZihidW5kbGVOYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgYnVuZGxlTmFtZSA9IEZhY2VzTWVzc2FnZS5GQUNFU19NRVNTQUdFUzsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoYnVuZGxlTmFtZSwgZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9SZWZsZWN0aW9uVXRpbHMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9SZWZsZWN0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4N2Y3ZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBSZWZsZWN0aW9uVXRpbHMKLXsKLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCB0cnlUb0dldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ5VG9HZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIHRyeVRvR2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0TWV0aG9kTmFtZSwgQ2xhc3MuLi4gcGFyYW1ldGVyVHlwZXMpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldE1ldGhvZCh0YXJnZXRDbGFzcywgdGFyZ2V0TWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUpCi0gICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUsIENsYXNzLi4uIHBhcmFtZXRlclR5cGVzKQotICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSB0YXJnZXRDbGFzczsKLSAgICAgICAgTWV0aG9kIHRhcmdldE1ldGhvZCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAoIU9iamVjdC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0YXJnZXRNZXRob2QgPSBjdXJyZW50Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QodGFyZ2V0TWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50SW50ZXJmYWNlIDogdGFyZ2V0Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRJbnRlcmZhY2U7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudENsYXNzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gY3VycmVudENsYXNzLmdldERlY2xhcmVkTWV0aG9kKHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudENsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0TWV0aG9kOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbigidGhlcmUgaXMgbm8gbWV0aG9kIHdpdGggdGhlIG5hbWUgJyIgKyB0YXJnZXRNZXRob2ROYW1lICsgIiciICsKLSAgICAgICAgICAgICAgICAiIGNsYXNzOiAiICsgdGFyZ2V0Q2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvSW52b2tlTWV0aG9kKHRhcmdldCwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvSW52b2tlTWV0aG9kT2ZDbGFzcyh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kT2ZDbGFzcyh0YXJnZXQsIG1ldGhvZCwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldC5uZXdJbnN0YW5jZSgpLCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kLCBPYmplY3QuLi4gYXJncykKLSAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0Lm5ld0luc3RhbmNlKCksIG1ldGhvZCwgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldCwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgewotICAgICAgICBtZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2UodGFyZ2V0LCBhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKE9iamVjdCBiYXNlT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlDaGFpbikKLSAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHByb3BlcnR5Q2hhaW4sICIuIik7Ci0KLSAgICAgICAgT2JqZWN0IGN1cnJlbnRCYXNlID0gYmFzZU9iamVjdDsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnRQcm9wZXJ0eTsKLSAgICAgICAgTWV0aG9kIGN1cnJlbnRNZXRob2Q7Ci0KLSAgICAgICAgd2hpbGUodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudFByb3BlcnR5ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCi0gICAgICAgICAgICAvL2lnbm9yZSB0aGUgbGFzdCBwcm9wZXJ0eQotICAgICAgICAgICAgaWYoIXRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vbm8gaXMgLSBpdCdzIG9ubHkgcG9zc2libGUgYXQgcHJvcGVydGllcyBub3QgYXQgYmVhbiBsZXZlbAotICAgICAgICAgICAgY3VycmVudE1ldGhvZCA9IHRyeVRvR2V0TWV0aG9kKGN1cnJlbnRCYXNlLmdldENsYXNzKCksCi0gICAgICAgICAgICAgICAgImdldCIgKyBjdXJyZW50UHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50UHJvcGVydHkuc3Vic3RyaW5nKDEsIGN1cnJlbnRQcm9wZXJ0eS5sZW5ndGgoKSkpOwotICAgICAgICAgICAgY3VycmVudEJhc2UgPSB0cnlUb0ludm9rZU1ldGhvZChjdXJyZW50QmFzZSwgY3VycmVudE1ldGhvZCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY3VycmVudEJhc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1dlYlhtbFV0aWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvV2ViWG1sVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFiMjE3Yi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvV2ViWG1sVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgV2ViWG1sVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEluaXRQYXJhbWV0ZXIoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpDQotICAgICAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCArICIuIiArIGtleSk7DQotICAgICAgICByZXR1cm4gKHZhbHVlICE9IG51bGwpID8gdmFsdWUucmVwbGFjZSgiICIsICIiKS50cmltKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9jb3JlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMjAxZDIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUgTW9kdWxlDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUgTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSBNb2R1bGUgcHJvdmlkZXMgYW4gZXh0ZW5zaWJsZSB2YWxpZGF0aW9uIHBsYXRmb3JtIHRvIGltcGxlbWVudCB2YWxpZGF0aW9uIGJhc2VkIG9uIG1ldGEtZGF0YS4NCi0gICAgQmFzZWQgb24gdGhpcyBtb2R1bGUgaXQgaXMgcG9zc2libGUgdG8gaW1wbGVtZW50IHZhbGlkYXRpb24gbW9kdWxlcy4NCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEuMS54IGFuZCBKU0YgMS4yLnguIEJvdGggdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9hc3NlbWJseS9wb20ueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1YzcwMC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9hc3NlbWJseS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBFeGFtcGxlcyBBc3NlbWJseTwvbmFtZT4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZXhhbXBsZXMtYXNzZW1ibHkxMjwvYXJ0aWZhY3RJZD4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5kZXBlbmRlbmN5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LXdhcjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd2FyPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktc3JjPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fd29ybGQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXZhLXNvdXJjZTwvdHlwZT4gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmVhdHVyZS1zZXRfMDE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXZhLXNvdXJjZTwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc3JjPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPiAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBFWEVDVVRFIG12biBwYWNrYWdlIHRvIGdlbmVyYXRlIGFzc2VtYmx5IGZpbGVzIC0tPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9zcmM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmFzc2VtYmx5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4gICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwtZXhhbXBsZXMtJHtwcm9qZWN0LnZlcnNpb259LXNyYzwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfYmluPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hc3NlbWJseTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0JICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+ICAgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWw8L2Rlc2NyaXB0b3I+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsLWV4YW1wbGVzLSR7cHJvamVjdC52ZXJzaW9ufTwvZmluYWxOYW1lPgotCSAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd29yazwvd29ya0RpcmVjdG9yeT4KLQkgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0JICAgIAotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+d2Fnb24tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aWQ+bXlmYWNlcy1uaWdodGx5LWJ1aWxkczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vbWlub3RhdXIuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvYnVpbGRzL215ZmFjZXMvbmlnaHRseTwvdXJsPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9pbnB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICA8L3BsdWdpbnM+Ci0KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXAueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBmN2I4MS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+YmluPC9pZD4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+CQotICA8ZmlsZVNldHM+ICAgIAotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvd2FyPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLndhcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PiAgICAgCi0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NzBjY2MuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPnNyYzwvaWQ+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgkKLSAgPGZpbGVTZXRzPiAgICAKLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3NyYzwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLnR4dDwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1YjNhNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOWJkYjEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YjQyYTguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmVhdHVyZS1zZXRfMDE8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgZmVhdHVyZS1zZXQgMDE8L25hbWU+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5mYWNlbGV0czwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtZmFjZWxldHM8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE0PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8IS0tDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIC0tPg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRvbWFoYXdrPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRvbWFoYXdrPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS42PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jdXN0b20vdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwMWRmNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jdXN0b20vdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLSMgdGhpcyBtZXNzYWdlIGJ1bmRsZSBpcyBwaWNrZWQgdXAgdmlhIGNvbnZlbnRpb24NCi1yZXBlYXRlZF9wYXNzd29yZF9yZXF1aXJlZD1wbGVhc2UgcmV0eXBlIHRoZSBwYXNzd29yZA0KLXJlcGVhdGVkX3Bhc3N3b3JkX3JlcXVpcmVkX2RldGFpbD1wbGVhc2UgcmV0eXBlIHRoZSBwYXNzd29yZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YWU0MWUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJc1R5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLk5vdEVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi0NCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbDsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVGVtcG9yYWxUeXBlOw0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi1wdWJsaWMgY2xhc3MgUGVyc29uDQotew0KLSAgICBATGVuZ3RoKG1pbmltdW0gPSAyKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDIwKQ0KLSAgICBATm90RXF1YWxzKCJsYXN0TmFtZSIpDQotICAgIEBQYXR0ZXJuKCJbQS1aXVthLXpdKyIpDQotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsNCi0NCi0gICAgQExlbmd0aChtaW5pbXVtID0gMikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAyMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7DQotDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwKQ0KLSAgICBwcml2YXRlIFN0cmluZyByb2xlID0gInVzZXIiOw0KLQ0KLSAgICBARGF0ZUlzKHR5cGUgPSBEYXRlSXNUeXBlLmJlZm9yZSwgdmFsdWVPZiA9ICJmaW5hbEV4YW0iKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIEBUZW1wb3JhbChUZW1wb3JhbFR5cGUuREFURSkNCi0gICAgcHJpdmF0ZSBEYXRlIGJpcnRoZGF5Ow0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIEBUZW1wb3JhbChUZW1wb3JhbFR5cGUuREFURSkNCi0gICAgcHJpdmF0ZSBEYXRlIGZpbmFsRXhhbTsNCi0NCi0gICAgQExlbmd0aChtaW5pbXVtID0gMikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmlja05hbWU7DQotDQotICAgIEBMZW5ndGgobWluaW11bSA9IDYpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gNjApDQotICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIHByaXZhdGUgaW50IG51bWJlck9mU2libGluZ3M7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByb2xlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFJvbGUoU3RyaW5nIHJvbGUpDQotICAgIHsNCi0gICAgICAgIHRoaXMucm9sZSA9IHJvbGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0QmlydGhkYXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmlydGhkYXk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0QmlydGhkYXkoRGF0ZSBiaXJ0aGRheSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5iaXJ0aGRheSA9IGJpcnRoZGF5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldEZpbmFsRXhhbSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmaW5hbEV4YW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RmluYWxFeGFtKERhdGUgZmluYWxFeGFtKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpbmFsRXhhbSA9IGZpbmFsRXhhbTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5pY2tOYW1lKFN0cmluZyBuaWNrTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uaWNrTmFtZSA9IG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNpYmxpbmdzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG51bWJlck9mU2libGluZ3M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyT2ZTaWJsaW5ncyhpbnQgbnVtYmVyT2ZTaWJsaW5ncykNCi0gICAgew0KLSAgICAgICAgdGhpcy5udW1iZXJPZlNpYmxpbmdzID0gbnVtYmVyT2ZTaWJsaW5nczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZTE0ZmIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmd1aS5iZWFuczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluLlBlcnNvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5Ob3RFcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTG9uZ1JhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmN1c3RvbS5lbWFpbHZhbGlkYXRvci5FbWFpbFZhbGlkYXRvcjsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uUGFnZQ0KLXsNCi0NCi0gICAgLy90aGUgb2xkIHBhc3N3b3JkIG9mIHRoZSBwZXJzb24gaXNuJ3QgdXNlZCB3aXRoaW4gdGhlIHBhZ2UNCi0gICAgLy8tPiB2YWxpZGF0ZSB3aXRoIHZhbHVlIG9mIHRoZSBtb2RlbA0KLSAgICBAU2tpcFZhbGlkYXRpb24oIiN7cGVyc29uLnJvbGUgZXEgJ2FkbWluJ30iKQ0KLSAgICBAUmVxdWlyZWQNCi0gICAgQEVxdWFscygicGVyc29uLnBhc3N3b3JkIikNCi0gICAgQE5vdEVxdWFscygicGFzc3dvcmQiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBvbGRQYXNzd29yZDsNCi0NCi0gICAgQEVxdWFscygicGFzc3dvcmRSZXBlYXRlZCIpDQotICAgIC8vY29tYmluZSBndWkgcmVsYXRlZCBhbm5vdGF0aW9ucyB3aXRoIHRoZSBhbm5vYXRpb25zIG9mIHRoZSBkb21haW4gbW9kZWwNCi0gICAgQEpvaW5WYWxpZGF0aW9uKHZhbHVlID0gIiN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ucGFzc3dvcmR9IikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7DQotDQotICAgIEBSZXF1aXJlZCh2YWxpZGF0aW9uRXJyb3JNc2dLZXkgPSAicmVwZWF0ZWRfcGFzc3dvcmRfcmVxdWlyZWQiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZFJlcGVhdGVkOw0KLQ0KLSAgICAvL3VzZSAje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLm5pY2tOYW1lfSwgI3twZXJzb24ubmlja05hbWV9DQotICAgIC8vdXNlIHJlZ2lzdHJhdGlvblBhZ2UgdG8gZGlzcGxheSB0aGUgc2Vjb25kIGVycm9yIG1lc3NhZ2UgYXQgb2xkIG5pY2tuYW1lDQotICAgIC8vb3IgbG9jYWwgcHJvcGVydHkgY2hhaW5pbmcgKHRvIGF2b2lkIHRoZSB1c2FnZSBvZiB0aGUgYmVhbiBuYW1lKSAtIGxpa2U6DQotICAgIEBTa2lwVmFsaWRhdGlvbigiI3twZXJzb24ucm9sZSBlcSAnYWRtaW4nfSIpDQotICAgIEBOb3RFcXVhbHMoInBlcnNvbi5uaWNrTmFtZSIpDQotICAgIEBKb2luVmFsaWRhdGlvbigicGVyc29uLm5pY2tOYW1lIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmV3Tmlja05hbWU7DQotDQotICAgIHByaXZhdGUgUGVyc29uIHBlcnNvbjsNCi0NCi0gICAgcHVibGljIFN0cmluZyBmaW5pc2goKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXRQYXNzd29yZCh0aGlzLnBhc3N3b3JkKTsNCi0gICAgICAgIHJldHVybiAiaG9tZSI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyB1cGRhdGVOaWNrTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldE5pY2tOYW1lKHRoaXMubmV3Tmlja05hbWUpOw0KLSAgICAgICAgcmV0dXJuICJob21lIjsNCi0gICAgfQ0KLQ0KLSAgICAvL2p1c3QgYSBxdWljayBpbGx1c3RyYXRpb24gb2Ygc2tpcFZhbGlkYXRpb24NCi0gICAgcHVibGljIFN0cmluZyBzd2l0Y2hNb2RlKCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRSb2xlID0gdGhpcy5wZXJzb24uZ2V0Um9sZSgpOw0KLQ0KLSAgICAgICAgaWYoY3VycmVudFJvbGUuZXF1YWxzKCJhZG1pbiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMucGVyc29uLnNldFJvbGUoInVzZXIiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnBlcnNvbi5zZXRSb2xlKCJhZG1pbiIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuICIiOw0KLSAgICB9DQotDQotICAgIEBKb2luVmFsaWRhdGlvbigicGVyc29uLmVtYWlsIikNCi0gICAgQFZhbGlkYXRvcihFbWFpbFZhbGlkYXRvci5jbGFzcykNCi0gICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbi5nZXRFbWFpbCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKFN0cmluZyBlbWFpbCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0RW1haWwoZW1haWwpOw0KLSAgICB9DQotDQotICAgIEBKb2luVmFsaWRhdGlvbigiI3twZXJzb24ubnVtYmVyT2ZTaWJsaW5nc30iKQ0KLSAgICBATG9uZ1JhbmdlKG1heGltdW0gPSAyMCkNCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNpYmxpbmdzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uLmdldE51bWJlck9mU2libGluZ3MoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXJPZlNpYmxpbmdzKGludCBudW1iZXJPZlNpYmxpbmdzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXROdW1iZXJPZlNpYmxpbmdzKG51bWJlck9mU2libGluZ3MpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRPbGRQYXNzd29yZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBvbGRQYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRPbGRQYXNzd29yZChTdHJpbmcgb2xkUGFzc3dvcmQpDQotICAgIHsNCi0gICAgICAgIHRoaXMub2xkUGFzc3dvcmQgPSBvbGRQYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmRSZXBlYXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZFJlcGVhdGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkUmVwZWF0ZWQoU3RyaW5nIHBhc3N3b3JkUmVwZWF0ZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmRSZXBlYXRlZCA9IHBhc3N3b3JkUmVwZWF0ZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBlcnNvbiBnZXRQZXJzb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGVyc29uOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNvbihQZXJzb24gcGVyc29uKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbiA9IHBlcnNvbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5ld05pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ld05pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5ld05pY2tOYW1lKFN0cmluZyBuZXdOaWNrTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uZXdOaWNrTmFtZSA9IG5ld05pY2tOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxOGQ2Ni4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+Ci0gICAgPGFwcGxpY2F0aW9uPgotICAgICAgICA8IS0tIHRyaW5pZGFkIC0tPgotICAgICAgICA8ZGVmYXVsdC1yZW5kZXIta2l0LWlkPgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvcmUKLSAgICAgICAgPC9kZWZhdWx0LXJlbmRlci1raXQtaWQ+Ci0KLSAgICA8L2FwcGxpY2F0aW9uPgotCi0gICAgPG1hbmFnZWQtYmVhbj4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1uYW1lPnJlZ2lzdHJhdGlvblBhZ2U8L21hbmFnZWQtYmVhbi1uYW1lPgotICAgICAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmd1aS5iZWFucy5SZWdpc3RyYXRpb25QYWdlPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPgotCi0gICAgICAgIDxtYW5hZ2VkLXByb3BlcnR5PgotICAgICAgICAgICAgPHByb3BlcnR5LW5hbWU+cGVyc29uPC9wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPHZhbHVlPiN7cGVyc29ufTwvdmFsdWU+Ci0gICAgICAgIDwvbWFuYWdlZC1wcm9wZXJ0eT4KLSAgICA8L21hbmFnZWQtYmVhbj4KLQotICAgIDxtYW5hZ2VkLWJlYW4+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tbmFtZT5wZXJzb248L21hbmFnZWQtYmVhbi1uYW1lPgotICAgICAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb248L21hbmFnZWQtYmVhbi1jbGFzcz4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5zZXNzaW9uPC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0gICAgPC9tYW5hZ2VkLWJlYW4+Ci0KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8ZnJvbS12aWV3LWlkPi9wYWdlcy9ob21lLnhodG1sPC9mcm9tLXZpZXctaWQ+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmFkZFVzZXI8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5jaGFuZ2VOaWNrTmFtZTwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmNoYW5nZVBhc3N3b3JkPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICA8L25hdmlnYXRpb24tcnVsZT4KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8ZnJvbS12aWV3LWlkPio8L2Zyb20tdmlldy1pZD4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+aG9tZTwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL2hvbWUueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgIDwvbmF2aWdhdGlvbi1ydWxlPgotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzM5MzY2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIGZhY2VsZXQtdGFnbGliIFBVQkxJQwotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEZhY2VsZXQgVGFnbGliIDEuMC8vRU4iCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9mYWNlbGV0LXRhZ2xpYl8xXzAuZHRkIj4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZmFjZWxldC10YWdsaWI+Ci0gICAgPG5hbWVzcGFjZT5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dHZhbC9kZW1vL2NvbXBvbmVudHM8L25hbWVzcGFjZT4KLQotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT51c2VyRm9ybTwvdGFnLW5hbWU+Ci0gICAgICAgIDxzb3VyY2U+Ci0gICAgICAgICAgICAuLi9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbAotICAgICAgICA8L3NvdXJjZT4KLSAgICA8L3RhZz4KLQotPC9mYWNlbGV0LXRhZ2xpYj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjMDFhYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCi0gICAgICAgICB2ZXJzaW9uPSIyLjQiPgotCi0gICAgPGRlc2NyaXB0aW9uPk15UHJvamVjdCB3ZWIueG1sPC9kZXNjcmlwdGlvbj4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5ERUZBVUxUX1NVRkZJWDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi54aHRtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmZhY2VsZXRzLkxJQlJBUklFUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi9XRUItSU5GL21haW4udGFnbGliLnhtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5FTkFCTEVfTElHSFRXRUlHSFRfRElBTE9HUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRElTQUJMRV9DT05URU5UX0NPTVBSRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5BTFRFUk5BVEVfVklFV19IQU5ETEVSPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y29tLnN1bi5mYWNlbGV0cy5GYWNlbGV0Vmlld0hhbmRsZXI8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuVVNFX0FQUExJQ0FUSU9OX1ZJRVdfQ0FDSEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5DSEFOR0VfUEVSU0lTVEVOQ0U8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5zZXNzaW9uPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBTZWUgSlNGIFNwZWNpZmljYXRpb24gMi41LjMKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNsaWVudDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5OVU1CRVJfT0ZfVklFV1NfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPjIwPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzdGF0ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbSBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uCi0gICAgICAgICAgICBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KSBhbmQgaWYKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgY29tcHJlc3NlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUKLSAgICAgICAgICAgIHJlbmRlcmVkIEhUTUwgb3V0cHV0LgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgbm90IGFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFMTE9XX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5ERVRFQ1RfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCByZW5kZXJlZCBIVE1MIGNvZGUgd2lsbCBiZSBmb3JtYXR0ZWQsIHNvIHRoYXQgaXQgaXMgImh1bWFuIHJlYWRhYmxlIi4KLSAgICAgICAgICAgIGkuZS4gYWRkaXRpb25hbCBsaW5lIHNlcGFyYXRvcnMgYW5kIHdoaXRlc3BhY2Ugd2lsbCBiZSB3cml0dGVuLCB0aGF0IGRvIG5vdAotICAgICAgICAgICAgaW5mbHVlbmNlIHRoZSBIVE1MIGNvZGUuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlBSRVRUWV9IVE1MPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlCi0gICAgICAgICAgICBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuIENvbnZlbmllbnQgZmVhdHVyZSBpZiB5b3UgaGF2ZSBwYWdlcwotICAgICAgICAgICAgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGJyb3dzZXIgcGFnZSB0byBhbHdheXMganVtcCB0byB0aGUgdG9wCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuCi0gICAgICAgICAgICBEZWZhdWx0OiAiZmFsc2UiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BVVRPX1NDUk9MTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQotICAgICAgICAgICAgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucwotICAgICAgICAgICAgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IgZGlmZmVuZW50IGVuY3J5cHRpb24gc3RyZW5ndGhzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VDUkVUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+TnpZMU5ETXlNVEE9PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmFsaWRhdGUgbWFuYWdlZCBiZWFucywgbmF2aWdhdGlvbiBydWxlcyBhbmQgZW5zdXJlIHRoYXQgZm9ybXMgYXJlIG5vdCBuZXN0ZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDwhLS0gTGlzdGVuZXIsIHRvIGFsbG93IEpldHR5IHNlcnZpbmcgTXlGYWNlcyBhcHBzIC0tPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy53ZWJhcHAuU3RhcnR1cFNlcnZsZXRDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLndlYmFwcC5SZXNvdXJjZVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPGZpbHRlcj4KLSAgICAgICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlRyaW5pZGFkRmlsdGVyPC9maWx0ZXItY2xhc3M+Ci0gICAgPC9maWx0ZXI+Ci0KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT50cmluaWRhZDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZ3MgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4vZmFjZXMvKjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPnJlc291cmNlczwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+L2FkZi8qPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg0ZDY0OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiCi0gICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIgotICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIKLSAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIgotICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPgotCi08dWk6Y29tcG9zaXRpb24+Ci0gICAgPHRyOnBhbmVsRm9ybUxheW91dD4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJuaWNrIG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uWyAnbmlja05hbWUnIF19Ii8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9ImUtbWFpbCIgdmFsdWU9IiN7YmVhbi5lbWFpbH0iLz4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJmaXJzdCBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5maXJzdE5hbWV9Ii8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Imxhc3QgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb24ubGFzdE5hbWV9Ii8+Ci0gICAgICAgIDx0cjppbnB1dERhdGUgbGFiZWw9ImJpcnRoZGF5IiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5iaXJ0aGRheX0iPgotICAgICAgICAgICAgPHRyOmNvbnZlcnREYXRlVGltZSB0eXBlPSJkYXRlIiBwYXR0ZXJuPSJkZC5NTS55eXl5Ii8+Ci0gICAgICAgIDwvdHI6aW5wdXREYXRlPgotICAgICAgICA8dHI6aW5wdXREYXRlIGxhYmVsPSJmaW5hbCBleGFtIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5maW5hbEV4YW19Ij4KLSAgICAgICAgICAgIDx0cjpjb252ZXJ0RGF0ZVRpbWUgdHlwZT0iZGF0ZSIgcGF0dGVybj0iZGQuTU0ueXl5eSIvPgotICAgICAgICA8L3RyOmlucHV0RGF0ZT4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJudW1iZXIgb2Ygc2libGluZ3MiIHZhbHVlPSIje2JlYW4ubnVtYmVyT2ZTaWJsaW5nc30iLz4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJwYXNzd29yZCIgdmFsdWU9IiN7YmVhbi5wYXNzd29yZH0iIHNlY3JldD0idHJ1ZSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJyZS1lbnRlciBwYXNzd29yZCIgdmFsdWU9IiN7YmVhbi5wYXNzd29yZFJlcGVhdGVkfSIgc2VjcmV0PSJ0cnVlIi8+Ci0KLSAgICA8L3RyOnBhbmVsRm9ybUxheW91dD4KLTwvdWk6Y29tcG9zaXRpb24+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWNkMTQ4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotICAgICAgICANCi08aHRtbD4NCi0NCi08aGVhZD4NCi0gICAgPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDsgVVJMPWZhY2VzL3BhZ2VzL2hvbWUueGh0bWwiPg0KLTwvaGVhZD4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYzFlYTguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTx0cjpkb2N1bWVudA0KLSAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIg0KLSAgICAgICAgeG1sbnM6Yz0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3RsL2NvcmUiPg0KLSAgICA8ZjpmYWNldCBuYW1lPSJtZXRhQ29udGFpbmVyIj4NCi0gICAgICAgIDx0aXRsZT5zZXYtZW4gZmVhdHVyZS1zZXQgZGVtbyAwMTwvdGl0bGU+DQotICAgIDwvZjpmYWNldD4NCi0NCi0gICAgPHRyaDpib2R5Pg0KLQ0KLSAgICAgICAgPCEtLSBvcmlnaW5hbCAtLT4NCi0gICAgICAgIDxkaXYgaWQ9IndyYXAiPg0KLQ0KLSAgICAgICAgICAgIDx0cjpmb3JtIGlkPSJmb3JtIiBkZWZhdWx0Q29tbWFuZD0iZGVmYXVsdEJ1dHRvbiI+DQotICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1haW4iPg0KLSAgICAgICAgICAgICAgICAgICAgPHVpOmluc2VydCBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ1bmRlcl9jb25zdHJ1Y3Rpb24iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+IXNpdGUgdW5kZXIgY29uc3RydWN0aW9uITwvaDI+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBjb250ZW50IG9mIHRoaXMgc2l0ZSBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSBtb21lbnQuPC9wPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC91aTppbnNlcnQ+DQotICAgICAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICAgIDwvdHI6Zm9ybT4NCi0gICAgICAgICAgICA8dHI6bWVzc2FnZXMgZ2xvYmFsT25seT0idHJ1ZSIvPg0KLQ0KLSAgICAgICAgPC9kaXY+DQotICAgIDwvdHJoOmJvZHk+DQotDQotDQotPC90cjpkb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg5M2ZhZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDx0cjpwYW5lbEZvcm1MYXlvdXQ+DQotDQotICAgICAgICAgICAgPHVpOnJlbW92ZT4NCi0gICAgICAgICAgICAgICAganVzdCBmb3IgdGhlIGRlbW8gd2UgYXJlIHVzaW5nIHR3byBpbnB1dCBjb21wb25lbnRzDQotICAgICAgICAgICAgPC91aTpyZW1vdmU+DQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ib2xkIG5pY2sgbmFtZSIgcmVhZE9ubHk9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLm5pY2tOYW1lfSIvPg0KLQ0KLSAgICAgICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im5pY2sgbmFtZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5uZXdOaWNrTmFtZX0iLz4NCi0NCi0gICAgICAgIDwvdHI6cGFuZWxGb3JtTGF5b3V0Pg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UudXBkYXRlTmlja05hbWV9Ii8+DQotDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9wYXNzd29yZC54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwOTc1YS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDx0YWJsZT4NCi0gICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6b3V0cHV0TGFiZWwgdmFsdWU9Im9sZCBwYXNzd29yZCIgZm9yPSJvbGRfcGFzc3dvcmQiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOmlucHV0VGV4dCBpZD0ib2xkX3Bhc3N3b3JkIiBzaW1wbGU9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2Uub2xkUGFzc3dvcmR9IiBzZWNyZXQ9InRydWUiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm1lc3NhZ2UgZm9yPSJvbGRfcGFzc3dvcmQiLz48L3RkPg0KLSAgICAgICAgICAgIDwvdHI+DQotDQotICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm91dHB1dExhYmVsIHZhbHVlPSJuZXcgcGFzc3dvcmQiIGZvcj0ibmV3X3Bhc3N3b3JkIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjppbnB1dFRleHQgaWQ9Im5ld19wYXNzd29yZCIgc2ltcGxlPSJ0cnVlIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjptZXNzYWdlIGZvcj0ibmV3X3Bhc3N3b3JkIi8+PC90ZD4NCi0gICAgICAgICAgICA8L3RyPg0KLQ0KLSAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjpvdXRwdXRMYWJlbCB2YWx1ZT0icmUtZW50ZXIgcGFzc3dvcmQiIGZvcj0icmVlbnRlcmVkIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjppbnB1dFRleHQgaWQ9InJlZW50ZXJlZCIgc2ltcGxlPSJ0cnVlIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBhc3N3b3JkUmVwZWF0ZWR9IiBzZWNyZXQ9InRydWUiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm1lc3NhZ2UgZm9yPSJyZWVudGVyZWQiLz48L3RkPg0KLSAgICAgICAgICAgIDwvdHI+DQotDQotICAgICAgICA8L3RhYmxlPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UuZmluaXNofSIvPg0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE3ZWJkOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJhZGQgdXNlciIgYWN0aW9uPSJhZGRVc2VyIi8+PGJyLz4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9ImNoYW5nZSBuaWNrIG5hbWUiIGFjdGlvbj0iY2hhbmdlTmlja05hbWUiLz48YnIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0iY2hhbmdlIHBhc3N3b3JkIiBhY3Rpb249ImNoYW5nZVBhc3N3b3JkIi8+PGJyLz4NCi0gICAgICAgIDx0cjpjb21tYW5kTGluayB0ZXh0PSJtb2RlOiAje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLnJvbGV9Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2Uuc3dpdGNoTW9kZX0iIGltbWVkaWF0ZT0idHJ1ZSIvPg0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZjZiMDYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6Yz0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHR2YWwvZGVtby9jb21wb25lbnRzIg0KLSAgICAgICAgPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgPGM6dXNlckZvcm0gYmVhbj0iI3tyZWdpc3RyYXRpb25QYWdlfSIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UuZmluaXNofSIvPg0KLQ0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvaGVsbG9fd29ybGQvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MDU5MjQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvaGVsbG9fd29ybGQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1oZWxsb193b3JsZDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBoZWxsbyB3b3JsZDwvbmFtZT4NCi0gICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIA0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qc3RsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzdGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4gICAgICAgIA0KLQ0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmFmYjM5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbms7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluLlBlcnNvbjsKLQotLyoqCi0gKiBBIHR5cGljYWwgc2ltcGxlIGJhY2tpbmcgYmVhbiwgdGhhdCBpcyBiYWNrZWQgdG8gPGNvZGU+aGVsbG93b3JsZC5qc3A8L2NvZGU+Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEhlbGxvV29ybGRDb250cm9sbGVyCi17Ci0gICAgcHJpdmF0ZSBQZXJzb24gcGVyc29uID0gbmV3IFBlcnNvbigpOwotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBlbXB0eSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBIZWxsb1dvcmxkQ29udHJvbGxlcigpCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB0aGF0IGlzIGJhY2tlZCB0byBhIHN1Ym1pdCBidXR0b24gb2YgYSBmb3JtLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgc2VuZCgpCi0gICAgewotICAgICAgICAvL2RvIHJlYWwgbG9naWMsIHJldHVybiBhIHN0cmluZyB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuYXZpZ2F0aW9uIHN5c3RlbSBvZiBKU0YKLSAgICAgICAgcmV0dXJuICJzdWNjZXNzIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpCi0gICAgewotICAgICAgICByZXR1cm4gcGVyc29uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNvbihQZXJzb24gcGVyc29uKQotICAgIHsKLSAgICAgICAgdGhpcy5wZXJzb24gPSBwZXJzb247Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkNGE5ZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsKLQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsKLQotcHVibGljIGNsYXNzIFBlcnNvbgotewotICAgIC8vaGVsbG8gd29ybGQgZGVtbwotICAgIEBSZXF1aXJlZAotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsKLQotICAgIC8vZGVtbyBmb3IganBhIGJhc2VkIHZhbGlkYXRpb24gc3VwcG9ydAotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTAgLyouLi4qLykKLSAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaXJzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsYXN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYmVhZTcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGZhY2VzLWNvbmZpZyB2ZXJzaW9uPSIxLjIiIAotICAgIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIj4KLQkKLQk8IS0tIG1hbmFnZWQgYmVhbnMgb2YgdGhlIHNpbXBsZSBoZWxsbyB3b3JsZCBhcHAgLS0+Ci0JPG1hbmFnZWQtYmVhbj4KLQkJPG1hbmFnZWQtYmVhbi1uYW1lPmhlbGxvV29ybGQ8L21hbmFnZWQtYmVhbi1uYW1lPgotCQk8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5IZWxsb1dvcmxkQ29udHJvbGxlcjwvbWFuYWdlZC1iZWFuLWNsYXNzPgotCQk8bWFuYWdlZC1iZWFuLXNjb3BlPnJlcXVlc3Q8L21hbmFnZWQtYmVhbi1zY29wZT4KLQk8L21hbmFnZWQtYmVhbj4KLQkKLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIGhlbGxvV29ybGQuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L2hlbGxvV29ybGQuanNwPC9mcm9tLXZpZXctaWQ+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPnN1Y2Nlc3M8L2Zyb20tb3V0Y29tZT4KLQkJCTx0by12aWV3LWlkPi9wYWdlMi5qc3A8L3RvLXZpZXctaWQ+Ci0JCTwvbmF2aWdhdGlvbi1jYXNlPgotCTwvbmF2aWdhdGlvbi1ydWxlPgotCQotCTwhLS0gbmF2aWdhdGlvbiBydWxlcyBmb3IgcGFnZTIuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L3BhZ2UyLmpzcDwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5iYWNrPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vaGVsbG9Xb3JsZC5qc3A8L3RvLXZpZXctaWQ+Ci0JCTwvbmF2aWdhdGlvbi1jYXNlPgotCTwvbmF2aWdhdGlvbi1ydWxlPgotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNGExODMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgotICAgICAgICAgdmVyc2lvbj0iMi40Ij4KLQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8IS0tb3B0aW9uYWw6IGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Db21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBVUklzIG9mIChhZGRpdGlvbmFsKSBmYWNlcyBjb25maWcgZmlsZXMuCi0gICAgICAgICAgICAoZS5nLiAvV0VCLUlORi9teS1jb25maWcueG1sKQotICAgICAgICAgICAgU2VlIEpTRiAxLjAgUFJEMiwgMTAuMy4yCi0gICAgICAgICAgICBBdHRlbnRpb246IFlvdSBkbyBub3QgbmVlZCB0byBwdXQgL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBpbiBoZXJlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5DT05GSUdfRklMRVM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0tLT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBTZWUgSlNGIFNwZWNpZmljYXRpb24gMi41LjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIGFtb3VudCAoZGVmYXVsdCA9IDIwKSBvZiB0aGUgbGF0ZXN0IHZpZXdzIGFyZSBzdG9yZWQgaW4gc2Vzc2lvbi48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuTlVNQkVSX09GX1ZJRVdTX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc3RhdGUgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0gYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLgotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KSBhbmQgaWYKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgY29tcHJlc3NlZC48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcGFyYW1ldGVyIHRlbGxzIE15RmFjZXMgaWYgamF2YXNjcmlwdCBjb2RlIHNob3VsZCBiZSBhbGxvd2VkIGluIHRoZQotICAgICAgICAgICAgcmVuZGVyZWQgSFRNTCBvdXRwdXQuCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUKLSAgICAgICAgICAgIHRoYXQgc3VibWl0cyB0aGUgY29ycmVzcG9uZGluZyBmb3JtLgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBub3QgYWxsb3dlZCwgdGhlIHN0YXRlIHNhdmluZyBpbmZvIGFuZCBuZXN0ZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BTExPV19KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuREVURUNUX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgcmVuZGVyZWQgSFRNTCBjb2RlIHdpbGwgYmUgZm9ybWF0dGVkLCBzbyB0aGF0IGl0IGlzICJodW1hbiByZWFkYWJsZSIuCi0gICAgICAgICAgICBpLmUuIGFkZGl0aW9uYWwgbGluZSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIHdpbGwgYmUgd3JpdHRlbiwgdGhhdCBkbyBub3QKLSAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgSFRNTCBjb2RlLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlBSRVRUWV9IVE1MPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlCi0gICAgICAgICAgICBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuIENvbnZlbmllbnQgZmVhdHVyZSBpZiB5b3UgaGF2ZSBwYWdlcwotICAgICAgICAgICAgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGJyb3dzZXIgcGFnZSB0byBhbHdheXMganVtcCB0byB0aGUgdG9wCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuCi0gICAgICAgICAgICBEZWZhdWx0OiAiZmFsc2UiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFVVE9fU0NST0xMPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Vc2VkIGZvciBlbmNyeXB0aW5nIHZpZXcgc3RhdGUuIE9ubHkgcmVsZXZhbnQgZm9yIGNsaWVudCBzaWRlCi0gICAgICAgICAgICBzdGF0ZSBzYXZpbmcuIFNlZSBNeUZhY2VzIHdpa2kvd2ViIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRUNSRVQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWYWxpZGF0ZSBtYW5hZ2VkIGJlYW5zLCBuYXZpZ2F0aW9uIHJ1bGVzIGFuZCBlbnN1cmUgdGhhdCBmb3JtcyBhcmUgbm90IG5lc3RlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlZBTElEQVRFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUcmVhdCByZWFkb25seSBzYW1lIGFzIGlmIGRpc2FibGVkIGF0dHJpYnV0ZSB3YXMgc2V0IGZvciBzZWxlY3QgZWxlbWVudHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5SRUFET05MWV9BU19ESVNBQkxFRF9GT1JfU0VMRUNUUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFVzZSB0aGUgZGVmaW5lZCBjbGFzcyBhcyB0aGUgY2xhc3Mgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiBhIHJlc291cmNlIGlzIGFkZGVkIHRvIHRoZQotICAgICAgICAgICAgRXh0ZW5zaW9uRmlsdGVyIGhhbmRsaW5nLiBVc2luZyBTdHJlYW1pbmdBZGRSZXNvdXJjZSBoZXJlIGhlbHBzIHdpdGggcGVyZm9ybWFuY2UuIElmIHlvdSB3YW50IHRvIGFkZAotICAgICAgICAgICAgY3VzdG9tIGNvbXBvbmVudHMgYW5kIHdhbnQgdG8gdXNlIHRoZSBFeHRlbnNpb25GaWx0ZXIsIHlvdSBuZWVkIHRvIHByb3ZpZGUgeW91ciBjdXN0b20gaW1wbGVtZW50YXRpb24gaGVyZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFERF9SRVNPVVJDRV9DTEFTUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC51dGlsLkRlZmF1bHRBZGRSZXNvdXJjZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAgICAgCi0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmlydHVhbCBwYXRoIGluIHRoZSBVUkwgd2hpY2ggdHJpZ2dlcnMgbG9hZGluZyBvZiByZXNvdXJjZXMgZm9yIHRoZSBNeUZhY2VzIGV4dGVuZGVkIGNvbXBvbmVudHMKLSAgICAgICAgICAgIGluIHRoZSBFeHRlbnNpb25GaWx0ZXIuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5SRVNPVVJDRV9WSVJUVUFMX1BBVEg8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vZmFjZXMvbXlGYWNlc0V4dGVuc2lvblJlc291cmNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIENoZWNrIGlmIHRoZSBleHRlbnNpb25zLWZpbHRlciBoYXMgYmVlbiBwcm9wZXJseSBjb25maWd1cmVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ0hFQ0tfRVhURU5TSU9OU19GSUxURVI8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIERlZmluZSBwYXJ0aWFsIHN0YXRlIHNhdmluZyBhcyB0cnVlL2ZhbHNlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5QQVJUSUFMX1NUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLQotICAgIDwhLS0gTGlzdGVuZXIsIHRvIGFsbG93IEpldHR5IHNlcnZpbmcgTXlGYWNlcyBhcHBzIC0tPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy53ZWJhcHAuU3RhcnR1cFNlcnZsZXRDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZyAtLT4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPiouanNmPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguanNwPC93ZWxjb21lLWZpbGU+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNlMTBiMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIzIj4KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9ImZpcnN0X25hbWUiIHZhbHVlPSJGaXJzdCBuYW1lOiIvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0iZmlyc3RfbmFtZSIgbGFiZWw9IkZpcnN0IG5hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQucGVyc29uLmZpcnN0TmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0iZmlyc3RfbmFtZSIgc2hvd1N1bW1hcnk9InRydWUiIHNob3dEZXRhaWw9ImZhbHNlIi8+Ci0KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9Imxhc3RfbmFtZSIgdmFsdWU9Ikxhc3QgbmFtZToiLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9Imxhc3RfbmFtZSIgbGFiZWw9Ikxhc3QgbmFtZSIgdmFsdWU9IiN7aGVsbG9Xb3JsZC5wZXJzb24ubGFzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9Imxhc3RfbmFtZSIgc2hvd1N1bW1hcnk9InRydWUiIHNob3dEZXRhaWw9ImZhbHNlIi8+Ci0KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJQcmVzcyBtZSIgYWN0aW9uPSIje2hlbGxvV29ybGQuc2VuZH0iLz4KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4KLSAgICAgICAgICAgICAgPC9oOnBhbmVsR3JpZD4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICA8L2Y6dmlldz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ4MmQ1My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgcGFnZSBzZXNzaW9uPSJmYWxzZSIlPgotPCUKLXJlc3BvbnNlLnNlbmRSZWRpcmVjdCgiaGVsbG9Xb3JsZC5qc2YiKTsKLSU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYzg1MjMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwlLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tJT4KLQotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgICAgPGY6dmlldz4KLSAgICAgICAgICAgIDxoOmZvcm0gaWQ9Im1haW5Gb3JtIj4KLSAgICAgICAgICAgICAgICA8aDI+PGg6b3V0cHV0VGV4dCB2YWx1ZT0iSGVsbG8gI3toZWxsb1dvcmxkLnBlcnNvbi5maXJzdE5hbWV9ICN7aGVsbG9Xb3JsZC5wZXJzb24ubGFzdE5hbWV9LiBXZSBob3BlIHlvdSBlbmpveSBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciEiLz48L2gyPgotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIGFjdGlvbj0iYmFjayI+Ci0gICAgICAgICAgICAgICAgICAgIDxoOm91dHB1dFRleHQgdmFsdWU9IkhvbWUiLz4KLSAgICAgICAgICAgICAgICA8L2g6Y29tbWFuZExpbms+Ci0gICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgPC9mOnZpZXc+Ci0gICAgPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9leGFtcGxlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjNjMGYwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2V4YW1wbGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotDQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBwcm9qZWN0PC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPHNjbT4NCi0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2V4YW1wbGVzPC9jb25uZWN0aW9uPg0KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2V4YW1wbGVzPC9kZXZlbG9wZXJDb25uZWN0aW9uPg0KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvZXhhbXBsZXM8L3VybD4NCi0gICAgPC9zY20+DQotICAgIA0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8IS0tVGhpcyBwbHVnaW4gYWxsb3dzIHRvIHJ1biB0aGUgZXhhbXBsZSB1c2luZyBtdm4gamV0dHk6cnVuIC0tPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamV0dHktcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj42LjEuODwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8c2NhbkludGVydmFsU2Vjb25kcz4xMDwvc2NhbkludGVydmFsU2Vjb25kcz4NCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLSAgICA8bW9kdWxlcz4NCi0gICAgICAgIDxtb2R1bGU+aGVsbG9fd29ybGQ8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+ZmVhdHVyZS1zZXRfMDE8L21vZHVsZT4NCi0gICAgPC9tb2R1bGVzPg0KLQ0KLSAgICA8cHJvZmlsZXM+DQotICAgICAgICA8IS0tIFRoaXMgcHJvZmlsZSBpcyBpbnZva2VkIGJ5IC1EcHJlcGFyZVJlbGVhc2U9dHJ1ZS4gIFRoaXMgYWxsb3dzIG12biByZWxlYXNlOnByZXBhcmUgdG8NCi0gICAgICAgICAgICBydW4gc3VjY2Vzc2Z1bGx5IG9uIHRoZSBhc3NlbWJseSBwcm9qZWN0cy4gLS0+DQotICAgICAgICA8cHJvZmlsZT4NCi0gICAgICAgICAgICA8aWQ+cHJlcGFyZS1yZWxlYXNlPC9pZD4NCi0gICAgICAgICAgICA8YWN0aXZhdGlvbj4NCi0gICAgICAgICAgICAgICAgPHByb3BlcnR5Pg0KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+cHJlcGFyZVJlbGVhc2U8L25hbWU+DQotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPg0KLSAgICAgICAgICAgIDxtb2R1bGVzPg0KLSAgICAgICAgICAgICAgICA8bW9kdWxlPmFzc2VtYmx5PC9tb2R1bGU+DQotICAgICAgICAgICAgPC9tb2R1bGVzPg0KLSAgICAgICAgICAgIDxidWlsZD4NCi0gICAgICAgICAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnRzPi1EcHJlcGFyZVJlbGVhc2U8L2FyZ3VtZW50cz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPg0KLSAgICAgICAgICAgIDwvYnVpbGQ+DQotICAgICAgICA8L3Byb2ZpbGU+DQotICAgIDwvcHJvZmlsZXM+DQotDQotICAgIDxwcm9wZXJ0aWVzPg0KLSAgICAgICAgPHRyaW5pZGFkLnZlcnNpb24+MS4yLjk8L3RyaW5pZGFkLnZlcnNpb24+DQotICAgIDwvcHJvcGVydGllcz4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvbG9nby9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2xvZ28vTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvbG9nby9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvbG9nby9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvbG9nby9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2xvZ28vTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL2xvZ28vZXh0dmFsLWxvZ28uc3ZnIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvbG9nby9leHR2YWwtbG9nby5zdmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MmI1MzkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvbG9nby9leHR2YWwtbG9nby5zdmcKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KLTwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgotCi0KLTwhLS0KLQlDb3B5cmlnaHQgMjAwOSBFbnJpY28gQmVydGkgKGVucmljby5iZXJ0aUBnbWFpbC5jb20pCi0KLQlMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLQl5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0JWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLQkgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLQlVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0JZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLQlXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLQlTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0JbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotCi08c3ZnCi0gICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgotICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgotICAgdmVyc2lvbj0iMS4wIgotICAgd2lkdGg9Ijc0NC4wOTQ0OCIKLSAgIGhlaWdodD0iMTA1Mi4zNjIyIgotICAgaWQ9InN2ZzIiPgotICA8ZGVmcwotICAgICBpZD0iZGVmczQiIC8+Ci0gIDxnCi0gICAgIGlkPSJsYXllcjIiPgotICAgIDxyZWN0Ci0gICAgICAgd2lkdGg9IjM1My40MTk1MyIKLSAgICAgICBoZWlnaHQ9IjExMy4xMDg0IgotICAgICAgIHJ5PSIxMSIKLSAgICAgICB4PSIxODIuMjMwMTUiCi0gICAgICAgeT0iMzgxLjMzMjkyIgotICAgICAgIGlkPSJyZWN0MjQ4NCIKLSAgICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojNjY2NjZmO3N0cm9rZS13aWR0aDowLjgwMTg4MjYyO3N0cm9rZS1vcGFjaXR5OjAuOTQxMTc2NDciIC8+Ci0gIDwvZz4KLSAgPGcKLSAgICAgaWQ9ImxheWVyMSI+Ci0gICAgPHBhdGgKLSAgICAgICBkPSJNIDEwNy4xODc1LDM5My41NjYzOCBMIDEyMi4zMDQ2OSwzOTMuNTY2MzggTCAxNzcuNSw0NjcuMzk0NTEgTCAxNjIuMzgyODEsNDY3LjM5NDUxIEwgMTA3LjE4NzUsMzkzLjU2NjM4IE0gMTIyLjMwNDY5LDQ2Ny4zOTQ1MSBMIDEwNy4xODc1LDQ2Ny4zOTQ1MSBMIDE2Mi4zODI4MSwzOTMuNTY2MzggTCAxNzcuNSwzOTMuNTY2MzggTCAxMjIuMzA0NjksNDY3LjM5NDUxIE0gMTg1LjkzNzUsMzgxLjYxMzI2IEwgMTk0LjA5Mzc1LDM4MS42MTMyNiBMIDE5Ni45MDYyNSwzOTMuNTY2MzggTCAyMTQuMDYyNSwzOTMuNTY2MzggTCAyMTQuMDYyNSw0MDQuMTEzMjYgTCAxOTguOTQ1MzEsNDA0LjExMzI2IEwgMTk4Ljk0NTMxLDQ0Ni41MTE2OSBDIDE5OC45NDUzLDQ1My40MDIzMyAyMDEuOTIxODYsNDU2Ljg0NzY0IDIwNy44NzUsNDU2Ljg0NzYzIEwgMjE0LjA2MjUsNDU2Ljg0NzYzIEwgMjE0LjA2MjUsNDY3LjM5NDUxIEwgMjA0LjUsNDY3LjM5NDUxIEMgMTkyLjEyNDk5LDQ2Ny4zOTQ1MSAxODUuOTM3NSw0NjAuNzYxNyAxODUuOTM3NSw0NDcuNDk2MDcgTCAxODUuOTM3NSwzODEuNjEzMjYiCi0gICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTQ3LjUyMTczLDE5LjI5MTkyMikiCi0gICAgICAgaWQ9ImZsb3dSb290MjQ2MSIKLSAgICAgICBzdHlsZT0iZm9udC1zaXplOjQwcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO2ZvbnQtZmFtaWx5OlNhbnNhdGlvbjstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlNhbnNhdGlvbiIgLz4KLSAgICA8cGF0aAotICAgICAgIGQ9Ik0gNDg0LjE1NjI1LDMzNy45Mzc1IEMgNDc5Ljk1MDA3LDM0MS4xODEwNSA0NzYuOTA4NjEsMzQ1LjYwMTIxIDQ3My43MTg3NSwzNDkuNzgxMjUgQyA0NjYuMDcxOTIsMzYwLjE1OTAyIDQ1OC4zNTM0NywzNzAuNDg0NjEgNDUwLjgzNzM5LDM4MC45NTc5NiBDIDQ0MC45ODEyMywzOTQuNDQ4NzMgNDMxLjI5NTkzLDQwOC4wNjQ0OSA0MjEuODMyOTgsNDIxLjgzNDEzIEMgNDEzLjY1MDA3LDQzMy43Mjc5OSA0MDUuNDU1NjgsNDQ1LjYxNDEyIDM5Ny4zNTg1Nyw0NTcuNTY2NjYgQyAzOTYuNzQ0Niw0NTguMzMzMDkgMzk2LjM1MTE5LDQ1OS4zMDQyNyAzOTUuNTkzNzUsNDU5LjkzNzUgQyAzOTQuNzgzMDMsNDYwLjUwNjI3IDM5My4zOTY5Nyw0NjAuMDc0MjUgMzkzLjMwOTk1LDQ1OS4wMDc4NSBDIDM5MC4wNTc4Miw0NDEuNjQ1MTQgMzg2Ljc3MjU2LDQyNC4yODg2NSAzODMuMzk3NDIsNDA2Ljk0OTM4IEMgMzgyLjAyNiwzOTkuNzc0MjIgMzgwLjYyNjQzLDM5Mi42MDM0NCAzNzkuMDY4NjYsMzg1LjQ2NjI1IEMgMzc4LjMzMzAyLDM4Mi4xMjkyNCAzNzcuNTU3NjQsMzc4Ljc4ODU0IDM3Ni40NTU2LDM3NS41NTIzMyBDIDM3Ni4wODE4OSwzNzQuNjkzNzMgMzc1LjkyODQ2LDM3My40ODczOSAzNzQuODYxNTIsMzczLjIxMzM2IEMgMzczLjkwOTQ1LDM3Mi43NzM1OSAzNzIuODcxMTMsMzczLjM1MDU0IDM3Mi4zNjEyMywzNzQuMTc5MDkgQyAzNzEuNDE0ODEsMzc1LjU1NjkxIDM3MC42MTU3MSwzNzcuMDU3OTggMzcwLjE2MjYzLDM3OC42NzM5OCBDIDM2OS4xNTk0NiwzODEuNzAwMTkgMzY4Ljg1MDk3LDM4NC45MDQ5MiAzNjguNzM0NDUsMzg4LjA3NDgxIEMgMzY4LjY2ODc2LDM5Mi43NzQxNyAzNjkuNDA4ODgsMzk3LjQzMzY5IDM3MC4xMjE2Miw0MDIuMDY0NzkgQyAzNzEuOTQ1MTgsNDEzLjMzMzkzIDM3NC4zMjQxNyw0MjQuNTAzNzMgMzc2LjE3NDg2LDQzNS43NjgxMyBDIDM3Ni44NjA1NSw0MzkuNTcxMDcgMzc3LjUwMjk3LDQ0My4zODMzIDM3Ny45MTk3Myw0NDcuMjI2NjkgQyAzNzguNDU4MTgsNDUyLjE4NzA4IDM3OC41Nzg0Nyw0NTcuMTgyNzkgMzc4LjYyNSw0NjIuMTY4NzMgQyAzNzguNjQ4OTMsNDcwLjczNzA5IDM3OC4wNTAzOCw0NzkuMzAwODUgMzc4LjI2NDM5LDQ4Ny44Njk3NCBDIDM3OC41MDY5OSw0OTEuMDY1MTUgMzc4Ljk0MzY5LDQ5NC4zOTQyOSAzODAuNjM2NzYsNDk3LjE4MTU1IEMgMzgxLjcxODE4LDQ5OC45MTYxIDM4My41NzQ3LDUwMC4yNTc4NiAzODUuNjcxMTcsNTAwLjI5OTY1IEMgMzg3Ljc5NTg0LDUwMC4zNDgwMyAzODkuODk3MDQsNDk5LjU1OTc1IDM5MS42MzM1NCw0OTguMzcwODMgQyAzOTIuOTgwMTEsNDk3LjM0NDI4IDM5NC4xMDA0NCw0OTYuMDIzNjcgMzk0Ljk5ODg5LDQ5NC41OTE3MiBDIDM5Ni40OTgzMSw0OTIuMDUyNDYgMzk4LjA2MzA3LDQ4OS41MzkxMyAzOTkuMjMwMjgsNDg2LjgyNzk3IEMgNDAwLjYxMzUzLDQ4My43Mjg4MyA0MDEuOTY0NzIsNDgwLjYxNCA0MDMuMTcwMjYsNDc3LjQzOTg5IEMgNDA0Ljc5MzM4LDQ3My4yMTY0NSA0MDYuNDI1NjcsNDY4Ljk5MDEyIDQwOC40NDA3NCw0NjQuOTM0MiBDIDQxMS43Nzc5MSw0NTcuODUyNTEgNDE1LjM0MjY2LDQ1MC44ODAxMSA0MTkuMDA4Miw0NDMuOTYzNjIgQyA0MjEuMDUwNjEsNDQwLjEzMDQyIDQyMy4yMDkyMSw0MzYuMzU2MzEgNDI1LjU1ODY1LDQzMi43MDI5MyBDIDQyOC40MDI1NCw0MjguNTEzNDcgNDMxLjQxNjYxLDQyNC40NDMxOCA0MzQuNDI5MTIsNDIwLjM3NDY1IEMgNDQwLjI4NjUsNDEyLjU3NDU2IDQ0Ni4zMzM2Nyw0MDQuOTE5NjQgNDUyLjIzNjkxLDM5Ny4xNTQ0NyBDIDQ1Ni45Nzg3OSwzOTAuOTg2MTUgNDYxLjc1MjM1LDM4NC44NDA3MSA0NjYuMzkzMTcsMzc4LjU5NTg3IEMgNDY5LjM1MzczLDM3NC41OTE2NiA0NzIuMjIxNjMsMzcwLjUxNjMyIDQ3NC45NDI5MywzNjYuMzQ1NjggQyA0NzcuODQ0MDYsMzYxLjc2ODQ3IDQ4MC41Mjc1NywzNTcuMDM1MDUgNDgyLjY3NDI5LDM1Mi4wNTQwNSBDIDQ4NC4wNzk5MywzNDguNjczNzkgNDg1LjI3MDM2LDM0NS4xMzkgNDg1LjQ0MjczLDM0MS40NTI3OSBDIDQ4NS40NTk5MSwzNDAuNTM0MTkgNDg1LjU1ODIzLDMzOS41ODI2OSA0ODUuMzEyNSwzMzguNjg3NSBDIDQ4NS4xMTc4MywzMzguMjMzNTkgNDg0LjcwMjQ2LDMzNy43ODEwOSA0ODQuMTU2MjUsMzM3LjkzNzUgeiIKLSAgICAgICBpZD0idGV4dDI0NzUiCi0gICAgICAgc3R5bGU9ImZvbnQtc2l6ZTo0OS4zMjE2OTM0MnB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojOTljYzAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtmb250LWZhbWlseTpTYW5zYXRpb247LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpTYW5zYXRpb24iIC8+Ci0gICAgPHBhdGgKLSAgICAgICBkPSJNIDE0Mi41NTQ2OSwzOTMuNTY2MzggQyAxNjUuMTQ4MzgsMzkzLjU2NjQ2IDE3NC4yNjU1Niw0MDcuMTEzMzIgMTY5LjkwNjI1LDQzNC4yMDcwMSBMIDEyMC4xOTUzMSw0MzQuMjA3MDEgQyAxMjAuMTk1Myw0NDkuMzAwNzcgMTI5LjcxMDkxLDQ1Ni44NDc2NCAxNDguNzQyMTksNDU2Ljg0NzYzIEMgMTU1LjI1Nzc2LDQ1Ni44NDc2NCAxNjEuNzczMzgsNDU2LjE0NDUyIDE2OC4yODkwNiw0NTQuNzM4MjYgTCAxNjguMjg5MDYsNDY1LjI4NTEzIEMgMTYxLjc3MzM4LDQ2Ni42OTEzOCAxNTMuODUxNTIsNDY3LjM5NDUxIDE0NC41MjM0NCw0NjcuMzk0NTEgQyAxMTkuNjMyOCw0NjcuMzk0NTEgMTA3LjE4NzUsNDU0LjgwODU4IDEwNy4xODc1LDQyOS42MzY2OSBDIDEwNy4xODc1LDQwNS41ODk4OCAxMTguOTc2NTUsMzkzLjU2NjQ2IDE0Mi41NTQ2OSwzOTMuNTY2MzggTSAxMjAuMTk1MzEsNDIzLjM3ODg4IEwgMTU4LjAyMzQ0LDQyMy4zNzg4OCBDIDE1OC42Nzk2NCw0MTAuNDQxNDQgMTUyLjgyMDI3LDQwMy45NzI2OSAxNDAuNDQ1MzEsNDAzLjk3MjYzIEMgMTI3Ljc4OTA0LDQwMy45NzI2OSAxMjEuMDM5MDUsNDEwLjQ0MTQ0IDEyMC4xOTUzMSw0MjMuMzc4ODgiCi0gICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoODEuMDQyNSwxOS4yOTE2NzYpIgotICAgICAgIGlkPSJmbG93Um9vdDQ3ODMiCi0gICAgICAgc3R5bGU9ImZvbnQtc2l6ZTo0MHB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojNjY2NjY2O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtmb250LWZhbWlseTpTYW5zYXRpb247LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpTYW5zYXRpb24iIC8+Ci0gICAgPHBhdGgKLSAgICAgICBkPSJNIDEwNy4xODc1LDQ0NC40MDIzMiBDIDEwNy4xODc1LDQyOS4yNjE3MyAxMTcuMTcxODcsNDIxLjY5MTQzIDEzNy4xNDA2Miw0MjEuNjkxMzggQyAxNDQuNDk5OTYsNDIxLjY5MTQzIDE1MC45MjE4Myw0MjIuMTYwMTggMTU2LjQwNjI1LDQyMy4wOTc2MyBMIDE1Ni40MDYyNSw0MTYuMTM2NjkgQyAxNTYuNDA2Miw0MDguMTIxMTMgMTQ5Ljc3MzM5LDQwNC4xMTMzMiAxMzYuNTA3ODEsNDA0LjExMzI2IEMgMTI4LjkxNDA0LDQwNC4xMTMzMiAxMjEuMTMyOCw0MDUuMjg1MTkgMTEzLjE2NDA2LDQwNy42Mjg4OCBMIDExMy4xNjQwNiwzOTcuMDgyMDEgQyAxMjEuMTMyOCwzOTQuNzM4MzMgMTI4LjkxNDA0LDM5My41NjY0NiAxMzYuNTA3ODEsMzkzLjU2NjM4IEMgMTU4LjQ0NTI2LDM5My41NjY0NiAxNjkuNDE0LDQwMS40NDE0NSAxNjkuNDE0MDYsNDE3LjE5MTM4IEwgMTY5LjQxNDA2LDQ2Ny4zOTQ1MSBMIDE2Mi44MDQ2OSw0NjcuMzk0NTEgTCAxNTcuNjAxNTYsNDYyLjE5MTM4IEMgMTUxLjE3OTY0LDQ2NS42NjAxMyAxNDMuNjMyNzgsNDY3LjM5NDUxIDEzNC45NjA5NCw0NjcuMzk0NTEgQyAxMTYuNDQ1Myw0NjcuMzk0NTEgMTA3LjE4NzUsNDU5LjczMDQ1IDEwNy4xODc1LDQ0NC40MDIzMiBNIDE1Ni40MDYyNSw0MzMuNjQ0NTEgQyAxNTEuMjQ5OTYsNDMyLjcwNzA0IDE0NC44MjgwOSw0MzIuMjM4MjkgMTM3LjE0MDYyLDQzMi4yMzgyNiBDIDEyNS44NDM3Myw0MzIuMjM4MjkgMTIwLjE5NTMsNDM2LjIyMjY2IDEyMC4xOTUzMSw0NDQuMTkxMzggQyAxMjAuMTk1Myw0NTIuNjI4OSAxMjUuMTE3MTcsNDU2Ljg0NzY0IDEzNC45NjA5NCw0NTYuODQ3NjMgQyAxNDMuOTYwOSw0NTYuODQ3NjQgMTUxLjEwOTMzLDQ1NC45MjU3NyAxNTYuNDA2MjUsNDUxLjA4MjAxIEwgMTU2LjQwNjI1LDQzMy42NDQ1MSIKLSAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAwMDAwMiwwLDAsMSwzMjkuNzM4MjksMTkuMjkxNjc2KSIKLSAgICAgICBpZD0iZmxvd1Jvb3Q0ODA3IgotICAgICAgIHN0eWxlPSJmb250LXNpemU6NDBweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjE7Zm9udC1mYW1pbHk6U2Fuc2F0aW9uOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246U2Fuc2F0aW9uIiAvPgotICAgIDxwYXRoCi0gICAgICAgZD0iTSAxMDcuMTg3NSwzNjYuODQ3NjMgTCAxMDcuMTg3NSw0NjcuMzk0NTEgTCAxMjAuMTk1MzEsNDY3LjM5NDUxIEwgMTIwLjE5NTMxLDM2Ni44NDc2MyBMIDEwNy4xODc1LDM2Ni44NDc2MyIKLSAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAwMDAwMiwwLDAsMSw0MDMuNzk5MjksMTkuMjkxNjc2KSIKLSAgICAgICBpZD0iZmxvd1Jvb3Q0ODE5IgotICAgICAgIHN0eWxlPSJmb250LXNpemU6NDBweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjE7Zm9udC1mYW1pbHk6U2Fuc2F0aW9uOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246U2Fuc2F0aW9uIiAvPgotICA8L2c+Ci0gIDxnCi0gICAgIGlkPSJsYXllcjMiPgotICAgIDxyZWN0Ci0gICAgICAgd2lkdGg9IjExLjg5MTU5NyIKLSAgICAgICBoZWlnaHQ9IjEyLjgwNjMzNSIKLSAgICAgICB4PSIzMzMuNTc0NTUiCi0gICAgICAgeT0iNDAwLjg3Mzg0IgotICAgICAgIGlkPSJyZWN0NDY5NSIKLSAgICAgICBzdHlsZT0iZmlsbDojNjY2NjY2O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+Ci0gICAgPHJlY3QKLSAgICAgICB3aWR0aD0iMTUuMDcxNDczIgotICAgICAgIGhlaWdodD0iMjAuMTI0MTU3IgotICAgICAgIHJ5PSIwLjMxNDQ0MTMyIgotICAgICAgIHg9IjI4MS44OTE4MiIKLSAgICAgICB5PSI0MzkuNzkyNDgiCi0gICAgICAgaWQ9InJlY3Q0Njk3IgotICAgICAgIHN0eWxlPSJmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KLSAgICA8cmVjdAotICAgICAgIHdpZHRoPSIxMS44OTE1OTciCi0gICAgICAgaGVpZ2h0PSIxMC41MzA2NDUiCi0gICAgICAgeD0iMzI3LjY5Njk5IgotICAgICAgIHk9IjQxMi44NzE1NSIKLSAgICAgICBpZD0icmVjdDQ4OTEiCi0gICAgICAgc3R5bGU9ImZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utb3BhY2l0eToxIiAvPgotICA8L2c+Ci08L3N2Zz4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3BhcmVudC9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3BhcmVudC9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9wYXJlbnQvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3BhcmVudC9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvcGFyZW50L05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOWJkYjEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvcGFyZW50L05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvcGFyZW50L3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9wYXJlbnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RkM2EzNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9wYXJlbnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tCi0gIC0gUGFyZW50IHBvbSBvZiBhbGwgdGhlIG15ZmFjZXMgZXh0ZW5zaW9ucyB2YWxpZGF0b3Igc3VicHJvamVjdHMgCi0gICAgdGhhdCBoZWxwIHRvIGJ1aWxkIG90aGVyIG15ZmFjZXMgcHJvamVjdHMuCi0gIC0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgUHJvamVjdCBQYXJlbnQ8L25hbWU+Ci0gICAgPHVybD5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTI8L3VybD4KLQotICAgIDxpc3N1ZU1hbmFnZW1lbnQ+Ci0gICAgICAgIDxzeXN0ZW0+amlyYTwvc3lzdGVtPgotICAgICAgICA8dXJsPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9FWFRWQUw8L3VybD4KLSAgICA8L2lzc3VlTWFuYWdlbWVudD4KLQotICAgIDxjaU1hbmFnZW1lbnQ+Ci0gICAgICAgIDxzeXN0ZW0+Y29udGludXVtPC9zeXN0ZW0+Ci0gICAgICAgIDx1cmw+aHR0cDovL215ZmFjZXMuem9uZXMuYXBhY2hlLm9yZzo4MDgwL2NvbnRpbnV1bTwvdXJsPgotICAgICAgICA8bm90aWZpZXJzPgotICAgICAgICAgICAgPG5vdGlmaWVyPgotICAgICAgICAgICAgICAgIDx0eXBlPm1haWw8L3R5cGU+Ci0gICAgICAgICAgICAgICAgPHNlbmRPblN1Y2Nlc3M+dHJ1ZTwvc2VuZE9uU3VjY2Vzcz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGFkZHJlc3M+Y29tbWl0c0BteWZhY2VzLmFwYWNoZS5vcmc8L2FkZHJlc3M+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9ub3RpZmllcj4KLSAgICAgICAgPC9ub3RpZmllcnM+Ci0gICAgPC9jaU1hbmFnZW1lbnQ+Ci0gICAgCi0gICAgPGluY2VwdGlvblllYXI+MjAwODwvaW5jZXB0aW9uWWVhcj4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn08L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD5NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotCi0gICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgotICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KLQotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLQotICAgICAgICAgICAgICAgICAgICAtIENvcHkgTElDRU5TRS50eHQgYW5kIE5PVElDRS50eHQgc28gdGhhdCB0aGV5IGFyZSBpbmNsdWRlZAotICAgICAgICAgICAgICAgICAgICAtIGluIHRoZSAtamF2YWRvYyBqYXIgZmlsZSBmb3IgdGhlIGNvbXBvbmVudC4KLSAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5qYXZhZG9jLnJlc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2FwaWRvY3MvTUVUQS1JTkYiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJMSUNFTlNFLnR4dCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJOT1RJQ0UudHh0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgICAgLSBNYWtlIGEgY2hlY2tzdHlsZSB2aW9sYXRpb24gYSBjb21waWxlIGVycm9yLiBOb3RlIHRoYXQgaWYgYSBjb21waWxlIGVycm9yIG9jY3VycywKLSAgICAgICAgICAgICAgICAtIGZ1cnRoZXIgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRhcmdldC9zaXRlL2NoZWNrc3R5bGUuaHRtbCAocHJlc2VudCBldmVuIHdoZW4KLSAgICAgICAgICAgICAgICAtIGp1c3QgdGhlIGNvbXBpbGUgZ29hbCBhbmQgbm90IHRoZSBzaXRlIGdvYWwgaGFzIGJlZW4gcnVuKS4gTm90ZSBhbHNvIHRoYXQgY2hpbGQKLSAgICAgICAgICAgICAgICAtIHByb2plY3RzIG1heSByZWRlY2xhcmUgdGhpcyBwbHVnaW4gYW5kIHByb3ZpZGUgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MKLSAgICAgICAgICAgICAgICAtIHRvIHVzZSBkaWZmZXJlbnQgY2hlY2tzIChtb3JlIG9yIGxlc3Mgc3RyaWN0IHRoYW4gdGhlIGRlZmF1bHQpLgotICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD52ZXJpZnktc3R5bGU8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWdMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0YW5kYXJkLnhtbDwvY29uZmlnTG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxoZWFkZXJMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtaGVhZGVyLnR4dDwvaGVhZGVyTG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tIFNldCBjb21waWxlIHNvdXJjZSBhdCAxLjUsIHNpbmNlIHRoZSB0YXJnZXQgSlNGIGltcGwgaXMgMS4yIC0tPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvcHRpbWl6ZT5mYWxzZTwvb3B0aW1pemU+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi0gICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+bWF2ZW4yLXJlcG9zaXRvcnkuZGV2LmphdmEubmV0PC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkphdmEubmV0IFJlcG9zaXRvcnkgZm9yIE1hdmVuPC9uYW1lPgotICAgICAgICAgICAgPHVybD5odHRwOi8vZG93bmxvYWQuamF2YS5uZXQvbWF2ZW4vMS88L3VybD4KLSAgICAgICAgICAgIDxsYXlvdXQ+bGVnYWN5PC9sYXlvdXQ+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICA8L3JlcG9zaXRvcmllcz4KLQotICAgIDxyZXBvcnRpbmc+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tanhyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcmVwb3J0LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcG1kLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxydWxlc2V0cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxydWxlc2V0Pi9ydWxlc2V0cy9iYXNpYy54bWw8L3J1bGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvdW51c2VkY29kZS54bWw8L3J1bGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvcnVsZXNldHM+Ci0gICAgICAgICAgICAgICAgICAgIDxsaW5rWHJlZj50cnVlPC9saW5rWHJlZj4KLSAgICAgICAgICAgICAgICAgICAgPG1pbmltdW1Ub2tlbnM+MTAwPC9taW5pbXVtVG9rZW5zPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0SmRrPjEuNTwvdGFyZ2V0SmRrPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY2hlY2tzdHlsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlnTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdGFuZGFyZC54bWw8L2NvbmZpZ0xvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aGVhZGVyTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWhlYWRlci50eHQ8L2hlYWRlckxvY2F0aW9uPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9yZXBvcnRpbmc+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9wYXJlbnQ8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9wYXJlbnQ8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL3BhcmVudDwvdXJsPgotICAgIDwvc2NtPgotCi0gICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgICAgIDxzbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8dW5pcXVlVmVyc2lvbj5mYWxzZTwvdW5pcXVlVmVyc2lvbj4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUuc25hcHNob3RzPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBNYXZlbiBTbmFwc2hvdCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1zbmFwc2hvdC1yZXBvc2l0b3J5PC91cmw+Ci0gICAgICAgIDwvc25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICA8c2l0ZT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc2l0ZTwvaWQ+Ci0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMjwvdXJsPgotICAgICAgICA8L3NpdGU+Ci0gICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgotCi0gICAgPHByb2ZpbGVzPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5nZW5lcmF0ZS1hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPnBlcmZvcm1SZWxlYXNlPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1qYXZhZG9jczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotICAgIDwvcHJvZmlsZXM+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGpzZi52ZXJzaW9uPjEuMi40PC9qc2YudmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3BhcmVudC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjg3OTMwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3BhcmVudC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0gLS0tLS0tDQotT3ZlcnZpZXcNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjINCi0NCi0gIEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIHByb3ZpZGVzIHZlcnNpb25zIGZvciBKU0YgMS4xIGFuZCAxLjINCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9wYXJlbnQvc3JjL3NpdGUvc2l0ZS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9wYXJlbnQvc3JjL3NpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNzYzMWMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvcGFyZW50L3NyYy9zaXRlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IG5hbWU9IkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIj4KLSAgPGJhbm5lckxlZnQ+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXM8L25hbWU+Ci0gICAgPHNyYz5pbWcvYmFubmVycy9NeUZhY2VzX2xvZ28uanBnPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sPC9ocmVmPgotICA8L2Jhbm5lckxlZnQ+Ci0KLSAgPGJhbm5lclJpZ2h0PgotICAgIDxuYW1lPkFwYWNoZSBCYW5uZXI8L25hbWU+Ci0gICAgPHNyYz5pbWcvYmFubmVycy9hcGFjaGVfYmFubmVyLnBuZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L2hyZWY+Ci0gIDwvYmFubmVyUmlnaHQ+ICAKLQotICA8cHVibGlzaERhdGUgZm9ybWF0PSJkZCBNTU0geXl5eSIvPgotCi0gIDxza2luPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5tYXZlbjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLXNpdGUtc2tpbjwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3NraW4+Ci0KLSAgPGJvZHk+Ci0gICAgPGxpbmtzPgotICAgICAgPGl0ZW0gbmFtZT0iQXBhY2hlIiBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmciLz4KLSAgICAgIDxpdGVtIG5hbWU9Ik15RmFjZXMiIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQgTXlmYWNlcyBFeHRWYWwiIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZG93bmxvYWQuaHRtbCIvPgotICAgIDwvbGlua3M+Ci0KLSAgICA8bWVudSBuYW1lPSJBcGFjaGUgTXlGYWNlcyIgaW5oZXJpdD0idG9wIj4KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkRvd25sb2FkIiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2Rvd25sb2FkLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0KLSAgICA8bWVudSBuYW1lPSJDb250ZW50cyIgaW5oZXJpdD0idG9wIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iTWFpbiBTaXRlIiAgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW5kZXguaHRtbCIvPgotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjEiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS9pbmRleC5odG1sIiBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8aXRlbSBuYW1lPSJkdW1teSIgICAgICAgIGhyZWY9ImR1bW15Ii8+Ci0gICAgICAgIDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iRXh0VmFsIGZvciBKU0YgMS4yIiAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iQ29yZSBNb2R1bGUiICAgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvbXlmYWNlcy1leHR2YWwtY29yZS9pbmRleC5odG1sIi8+Ci0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IlByb3BlcnR5IFZhbGlkYXRpb24iICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL3ZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb24vaW5kZXguaHRtbCIvPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJUcmluaWRhZCBTdXBwb3J0IiAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydC9pbmRleC5odG1sIi8+Ci0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IkdlbmVyaWMgU3VwcG9ydCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2NvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQvaW5kZXguaHRtbCIvPgotICAgICAgICA8L2l0ZW0+Ci0gICAgPC9tZW51PgotCQotICAgIDxtZW51IG5hbWU9IkRvY3VtZW50YXRpb24iPgotICAgICAgPGl0ZW0gbmFtZT0iV2lraSIgICAgICAgICBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL215ZmFjZXMvRXh0ZW5zaW9ucy9WYWxpZGF0b3IvIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgcmVmPSJyZXBvcnRzIi8+Ci0KLSAgICA8bWVudSBuYW1lPSJGb3VuZGF0aW9uIiBpbmhlcml0PSJib3R0b20iPgotICAgICAgPGl0ZW0gbmFtZT0iQVNGIiAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iIC8+Ci0gICAgICA8aXRlbSBuYW1lPSJTcG9uc29yc2hpcCIgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vc3BvbnNvcnNoaXAuaHRtbCIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlRoYW5rcyIgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi90aGFua3MuaHRtbCIgLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjg3OWQ1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlczwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLW1vZHVsZTwvYXJ0aWZhY3RJZD4NCi0gICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIE1vZHVsZTwvbmFtZT4NCi0gICAgPHVybD5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTI8L3VybD4NCi0NCi0gICAgPHNjbT4NCi0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rLzwvY29ubmVjdGlvbj4NCi0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay88L2RldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay88L3VybD4NCi0gICAgPC9zY20+DQotDQotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50Pg0KLSAgICAgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4NCi0gICAgICAgICAgICA8dW5pcXVlVmVyc2lvbj5mYWxzZTwvdW5pcXVlVmVyc2lvbj4NCi0gICAgICAgICAgICA8aWQ+YXBhY2hlLnNuYXBzaG90czwvaWQ+DQotICAgICAgICAgICAgPG5hbWU+QXBhY2hlIE1hdmVuIFNuYXBzaG90IFJlcG9zaXRvcnk8L25hbWU+DQotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1zbmFwc2hvdC1yZXBvc2l0b3J5PC91cmw+DQotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4NCi0gICAgICAgIDxzaXRlPg0KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc2l0ZTwvaWQ+DQotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTI8L3VybD4NCi0gICAgICAgIDwvc2l0ZT4NCi0gICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50Pg0KLQ0KLSAgICA8IS0tIFdBUk5JTkc6IERPIE5PVCBHRU5FUkFURSBTSVRFIEZST00gSEVSRSBESVJFQ1RMWQ0KLSAgICBTaW5jZSB0aGlzIHByb2plY3QgaGFzIGFuIGFzeW5jIHJlbGVhc2UgcHJvY2VkdXJlIChub3QNCi0gICAgYWxsIG1vZHVsZXMgc2hvdWxkIGJlIHJlbGVhc2VkIGF0IG9uY2UpLCB0aGUgcGFyZW50IHBvbS54bWwgDQotICAgIGlzIG5vdCB0aGlzICh0aGVyZSBpcyBhIG1vZHVsZSBmb3IgdGhhdCkuIFVzZSBtYXZlbiBzaXRlIA0KLSAgICBwbHVnaW4gaGVyZSBjYXVzZSBwcm9ibGVtcyB3aGVuIHRoZSBzaXRlIGlzIGdlbmVyYXRlZC4NCi0gICAgVGhlIHByb2NlZHVyZSBtdXN0IGV4ZWN1dGUgc2l0ZSBjb21tbWFuZCBmaXJzdCBvbiBwYXJlbnQgDQotICAgIG1vZHVsZSBhbmQgdGhlbiBvbiBlYWNoIG1vZHVsZSBsaXN0ZWQgYmVsb3cuIA0KLSAgICAgLS0+DQotDQotICAgIDxtb2R1bGVzPg0KLSAgICAgICAgPG1vZHVsZT5wYXJlbnQ8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+Y29yZTwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT52YWxpZGF0aW9uLW1vZHVsZXM8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+Y29tcG9uZW50LXN1cHBvcnQ8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+ZXhhbXBsZXM8L21vZHVsZT4NCi0gICAgPC9tb2R1bGVzPg0KLQ0KLSAgICA8cHJvZmlsZXM+DQotICAgICAgICA8IS0tIFRoaXMgcHJvZmlsZSBpcyBpbnZva2VkIGJ5IC1EcHJlcGFyZVJlbGVhc2U9dHJ1ZS4gIFRoaXMgYWxsb3dzIG12biByZWxlYXNlOnByZXBhcmUgdG8NCi0gICAgICAgICAgICBydW4gc3VjY2Vzc2Z1bGx5IG9uIHRoZSBhc3NlbWJseSBwcm9qZWN0cy4gLS0+DQotICAgICAgICA8cHJvZmlsZT4NCi0gICAgICAgICAgICA8aWQ+cHJlcGFyZS1yZWxlYXNlPC9pZD4NCi0gICAgICAgICAgICA8YWN0aXZhdGlvbj4NCi0gICAgICAgICAgICAgICAgPHByb3BlcnR5Pg0KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+cHJlcGFyZVJlbGVhc2U8L25hbWU+DQotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPg0KLSAgICAgICAgICAgIDxtb2R1bGVzPg0KLSAgICAgICAgICAgICAgICA8bW9kdWxlPmFzc2VtYmx5PC9tb2R1bGU+DQotICAgICAgICAgICAgPC9tb2R1bGVzPg0KLSAgICAgICAgICAgIDxidWlsZD4NCi0gICAgICAgICAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnRzPi1EcHJlcGFyZVJlbGVhc2U8L2FyZ3VtZW50cz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPg0KLSAgICAgICAgICAgIDwvYnVpbGQ+DQotICAgICAgICA8L3Byb2ZpbGU+DQotICAgIDwvcHJvZmlsZXM+DQotICAgIA0KLSAgICA8cHJvcGVydGllcz4NCi0gICAgICAgIDxqc2YudmVyc2lvbj4xLjIuNDwvanNmLnZlcnNpb24+DQotICAgIDwvcHJvcGVydGllcz4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvc2l0ZS9wb20ueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvc2l0ZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGZlMGFmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3NpdGUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgICAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICAgICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICAgICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgICAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gICAgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgICoKLSAgICAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gICAgKgotICAgICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj42PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1zaXRlPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3I8L25hbWU+Ci0gICAgPHVybD5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yPC91cmw+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxkZWZhdWx0R29hbD5zaXRlPC9kZWZhdWx0R29hbD4KLSAgICAgICAgPGV4dGVuc2lvbnM+Ci0gICAgICAgICAgPGV4dGVuc2lvbj4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ud2Fnb248L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD53YWdvbi1zc2gtZXh0ZXJuYWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtNTwvdmVyc2lvbj4KLSAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgPC9leHRlbnNpb25zPgotICAgIDwvYnVpbGQ+Ci0gICAgPHJlcG9ydGluZz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3QtaW5mby1yZXBvcnRzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9yZXBvcnRpbmc+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvc2l0ZTwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rL3NpdGU8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvc2l0ZTwvdXJsPgotICAgIDwvc2NtPgotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgICAgPHNpdGU+Ci0gICAgICAgIDxpZD5hcGFjaGUtc2l0ZTwvaWQ+Ci0gICAgICAgIDxuYW1lPkFwYWNoZSBXZWJzaXRlPC9uYW1lPgotICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3I8L3VybD4KLSAgICAgIDwvc2l0ZT4KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3NpdGUvc3JjL3NpdGUvYXB0L2Rvd25sb2FkLmFwdCBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3NpdGUvc3JjL3NpdGUvYXB0L2Rvd25sb2FkLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYxMzZhMi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9zaXRlL3NyYy9zaXRlL2FwdC9kb3dubG9hZC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotIH5+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSB+fiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gfn4gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSB+fiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSB+fiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSB+fiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSB+fg0KLSB+fiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSB+fg0KLSB+fiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIH5+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotIH5+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSB+fiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIH5+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSANCi0gLS0tLS0tDQotRG93bmxvYWQgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi0gLS0tLS0tDQotDQotRG93bmxvYWQgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi0NCi0NCi0gIFVzZSB0aGUgbGlua3MgYmVsb3cgdG8gZG93bmxvYWQgYSBkaXN0cmlidXRpb24gb2YgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZnJvbQ0KLSAgb25lIG9mIG91ciBtaXJyb3JzLiBJdCBpcyBnb29kIHByYWN0aWNlIHRvIHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIHRoZQ0KLSAgZGlzdHJpYnV0aW9uIGZpbGVzLg0KLQ0KLSAgWW91IHdpbGwgYmUgcHJvbXB0ZWQgZm9yIGEgbWlycm9yIC0gaWYgdGhlIGZpbGUgaXMgbm90IGZvdW5kIG9uIHlvdXJzLCBwbGVhc2UgYmUgcGF0aWVudCwgYXMgaXQgbWF5IHRha2UgMjQNCi0gIGhvdXJzIHRvIHJlYWNoIGFsbCBtaXJyb3JzLg0KLQ0KLSAgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgZGlzdHJpYnV0ZWQgYXMgYSA8PDx6aXA+Pj4gYXJjaGl2ZSAoZm9yIFdpbmRvd3MpIGFuZA0KLSAgYXMgYSA8PDx0YXIuZ3o+Pj4gYXJjaGl2ZSAoZm9yIFVOSVgpLiBUaGUgY29udGVudCBpcyB0aGUgc2FtZS4gUGxlYXNlIG5vdGUNCi0gIHRoYXQgdGhlIDw8PHRhci5nej4+PiBhcmNoaXZlcyBjb250YWluIGZpbGUgbmFtZXMgbG9uZ2VyIHRoYW4gMTAwIGNoYXJhY3RlcnMgYW5kIGhhdmUgYmVlbg0KLSAgY3JlYXRlZCB1c2luZyBHTlUgdGFyIGV4dGVuc2lvbnMuIFRodXMgdGhleSBtdXN0IGJlIHVudGFycmVkIHdpdGggYSBHTlUgY29tcGF0aWJsZQ0KLSAgdmVyc2lvbiBvZiB0YXIuDQotDQotICA8PCBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciAxLjAuMCBEaXN0cmlidXRpb24gPj4NCi0NCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18ICAgICAgICAgICAgICAgICAgICAgICAgIHwgTWlycm9ycyB8IENoZWNrc3VtIHwgU2lnbmF0dXJlIHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjEgMS4xLjEgKHRhci5neikgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4udGFyLmd6fSBteWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi50YXIuZ3p9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4udGFyLmd6Lm1kNX0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4udGFyLmd6Lm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi50YXIuZ3ouYXNjfSBteWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi50YXIuZ3ouYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMSAxLjEuMSAoemlwKSAgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4uemlwfSBteWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi56aXB9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4uemlwLm1kNX0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4uemlwLm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi56aXAuYXNjfSBteWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi56aXAuYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMSAxLjEuMSBTb3VyY2UgKHRhci5neikgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4xLjEtc3JjLnRhci5nen0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1zcmMudGFyLmd6fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMS4xLXNyYy50YXIuZ3oubWQ1fSBteWZhY2VzLWV4dHZhbDExLTEuMS4xLXNyYy50YXIuZ3oubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMS4xLXNyYy50YXIuZ3ouYXNjfSBteWZhY2VzLWV4dHZhbDExLTEuMS4xLXNyYy50YXIuZ3ouYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMSAxLjEuMSBTb3VyY2UgKHppcCkgICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMS4xLXNyYy56aXB9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjEtc3JjLnppcH19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1zcmMuemlwLm1kNX0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1zcmMuemlwLm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1zcmMuemlwLmFzY30gbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1zcmMuemlwLmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjIgMS4yLjEgKHRhci5neikgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4udGFyLmd6fSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi50YXIuZ3p9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4udGFyLmd6Lm1kNX0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4udGFyLmd6Lm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi50YXIuZ3ouYXNjfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi50YXIuZ3ouYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMiAxLjIuMSAoemlwKSAgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4uemlwfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi56aXB9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4uemlwLm1kNX0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4uemlwLm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi56aXAuYXNjfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi56aXAuYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMiAxLjIuMSBTb3VyY2UgKHRhci5neikgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjEtc3JjLnRhci5nen0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1zcmMudGFyLmd6fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4xLXNyYy50YXIuZ3oubWQ1fSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLXNyYy50YXIuZ3oubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4xLXNyYy50YXIuZ3ouYXNjfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLXNyYy50YXIuZ3ouYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMiAxLjIuMSBTb3VyY2UgKHppcCkgICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4xLXNyYy56aXB9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjEtc3JjLnppcH19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1zcmMuemlwLm1kNX0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1zcmMuemlwLm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1zcmMuemlwLmFzY30gbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1zcmMuemlwLmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi0NCi1MYXRlc3Qgc291cmNlIGNvZGUgZnJvbSBTVk4gcmVwb3NpdG9yeQ0KLQ0KLSAgICBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIGxhdGVzdCBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmZWF0dXJlcywgdGhlIHNvdXJjZSBjb2RlIGlzIHVuZGVyDQotICAgIHZlcnNpb24gY29udHJvbCB3aXRoIFNWTi4gIENsaWNrIHt7e3NvdXJjZS1yZXBvc2l0b3J5Lmh0bWx9IGhlcmUgfX0NCi0gICAgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byB1c2UgdGhlIEFTRiBFeHRlbnNpb25zIFZhbGlkYXRvciBTVk4gUmVwb3NpdG9yeS4NCi0NCi1WZXJpZnlpbmcgY2hlY2tzdW1zDQotDQotICAgIEl0IGlzIGVzc2VudGlhbCB0aGF0IHlvdSB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGUgZG93bmxvYWRlZA0KLSAgICBmaWxlcyB1c2luZyB0aGUgUEdQIGFuZCBNRDUgc2lnbmF0dXJlcy4gTUQ1IHZlcmlmaWNhdGlvbiBlbnN1cmVzIHRoZQ0KLSAgICBmaWxlIHdhcyBub3QgY29ycnVwdGVkIGR1cmluZyB0aGUgZG93bmxvYWQgcHJvY2Vzcy4gUEdQIHZlcmlmaWNhdGlvbg0KLSAgICBlbnN1cmVzIHRoYXQgdGhlIGZpbGUgY2FtZSBmcm9tIGEgY2VydGFpbiBwZXJzb24uDQotDQotICAgIFRvIHZlcmlmeSB0aGUgTUQ1IHNpZ25hdHVyZSBvbiB0aGUgZmlsZXMsIHlvdSBuZWVkIHRvIHVzZSBhIHByb2dyYW0NCi0gICAgY2FsbGVkIDw8PG1kNT4+PiBvciA8PDxtZDVzdW0+Pj4sIHdoaWNoIGlzDQotICAgIGluY2x1ZGVkIGluIG1hbnkgVU5JWCBkaXN0cmlidXRpb25zLiAgSXQgaXMgYWxzbyBhdmFpbGFibGUgYXMgcGFydCBvZg0KLSAgICB7e3todHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvdGV4dHV0aWxzL3RleHR1dGlscy5odG1sfUdOVSBUZXh0dXRpbHN9fS4NCi0gICAgV2luZG93cyB1c2VycyBjYW4gZ2V0IGJpbmFyeSBtZDUgcHJvZ3JhbXMgZnJvbSB7e3todHRwOi8vd3d3LmZvdXJtaWxhYi5jaC9tZDUvfWhlcmV9fSwNCi0gICAge3t7aHR0cDovL3d3dy5wYy10b29scy5uZXQvd2luMzIvZnJlZXdhcmUvY29uc29sZS99aGVyZX19LCBvcg0KLSAgICB7e3todHRwOi8vd3d3LnNsYXZhc29mdC5jb20vZnN1bS99aGVyZX19Lg0KLQ0KLVZlcmlmeWluZyBzaWduYXR1cmVzDQotDQotICAJUEdQIHZlcmlmaWNhdGlvbiBlbnN1cmVzIHRoYXQgdGhlIGZpbGUgY2FtZSBmcm9tIGEgY2VydGFpbiBwZXJzb24uICBXZSBzdHJvbmdseSByZWNvbW1lbmQNCi0JICB5b3UgdmVyaWZ5IHlvdXIgZG93bmxvYWRzIHdpdGggYm90aCBQR1AgYW5kIE1ENS4NCi0NCi0JVGhlIFBHUCBzaWduYXR1cmVzIGNhbiBiZSB2ZXJpZmllZCB1c2luZyB7e3todHRwOi8vd3d3LnBncGkub3JnL31QR1B9fSBvciANCi0Je3t7aHR0cDovL3d3dy5nbnVwZy5vcmcvfUdQR319LiAgRmlyc3QgZG93bmxvYWQgdGhlIEFwYWNoZSBNeUZhY2VzIA0KLQl7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL0tFWVN9S0VZU319CWFzIHdlbGwgYXMgdGhlIDw8PGFzYz4+PiBzaWduYXR1cmUgZmlsZSANCi0JZm9yIHRoZSBwYXJ0aWN1bGFyIGRpc3RyaWJ1dGlvbi4gSXQgaXMgaW1wb3J0YW50IHRoYXQgeW91IGdldCB0aGVzZSBmaWxlcyBmcm9tIHRoZSB1bHRpbWF0ZQ0KLQl0cnVzdGVkIHNvdXJjZSAtIHRoZSBtYWluIEFTRiBkaXN0cmlidXRpb24gc2l0ZSwgcmF0aGVyIHRoYW4gZnJvbSBhIG1pcnJvci4NCi0JVGhlbiB2ZXJpZnkgdGhlIHNpZ25hdHVyZXMgdXNpbmcgLi4uDQotDQotCSAgPDw8DQotCSAgJSBwZ3BrIC1hIEtFWVMNCi0JICAlIHBncHYgbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4udGFyLmd6LmFzYyBteWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi50YXIuZ3oNCi0JICA+Pj4NCi0NCi0JICA8b3I+DQotDQotCSAgPDw8DQotCSAgJSBwZ3AgLWthIEtFWVMNCi0JICAlIHBncCBteWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi50YXIuZ3ouYXNjIG15ZmFjZXMtZXh0dmFsMTEtMS4xLjEtYmluLnRhci5neg0KLQkgID4+Pg0KLQ0KLQkgIDxvcj4NCi0NCi0JICA8PDwNCi0gIAklIGdwZyAtLWltcG9ydCBLRVlTDQotCSAgJSBncGcgLS12ZXJpZnkgbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4udGFyLmd6LmFzYyBteWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi50YXIuZ3oNCi0JICA+Pj4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9zaXRlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9zaXRlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MjUzOWIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvc2l0ZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgYSBKU0YgY2VudHJpYyB2YWxpZGF0aW9uIGZyYW1ld29yay4NCi0gIA0KLSAgICBJdCBvZmZlcnMgcG93ZXJmdWwgYW5kIGVhc3kgdG8gdXNlIGZpZWxkIGJhc2VkIHZhbGlkYXRpb24gYmFzZWQgb24gYW5ub3RhdGlvbnMuDQotSXQgaGFzIGEgcGx1Z2dhYmxlIGFyY2hpdGVjdHVyZSwgc28gaXQgaXMgcG9zc2libGUgdG8gYWRkIG5ldyB2YWxpZGF0aW9uIG1vZHVsZXMgb3Igc3VwcG9ydCBmb3IgY29tcG9uZW50IGxpYnJhcmllcyBsaWtlIFRyaW5pZGFkIG9yIG90aGVyIDNyZCBwYXJ0eSBmcmFtZXdvcmtzLg0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS4xLnggYW5kIEpTRiAxLjIueC4gQm90aCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41Kw0KLQ0KLSAgICBGdXJ0aGVyIGluZm9ybWF0aW9uIGFyZSBhdmFpbGFibGUgYXQgdGhlIHt7e2h0dHA6Ly93aWtpLmFwYWNoZS5vcmcvbXlmYWNlcy9FeHRlbnNpb25zL1ZhbGlkYXRvci99V2lraX19LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3NpdGUvc3JjL3NpdGUvc2l0ZS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy9zaXRlL3NyYy9zaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2QwNWNhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3NpdGUvc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgbmFtZT0iQXBhY2hlIE15ZmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IiPgotICA8YmFubmVyTGVmdD4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlczwvbmFtZT4KLSAgICA8c3JjPmltZy9iYW5uZXJzL015RmFjZXNfbG9nby5qcGc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWw8L2hyZWY+Ci0gIDwvYmFubmVyTGVmdD4KLQotICA8YmFubmVyUmlnaHQ+Ci0gICAgPG5hbWU+QXBhY2hlIEJhbm5lcjwvbmFtZT4KLSAgICA8c3JjPmltZy9iYW5uZXJzL2FwYWNoZV9iYW5uZXIucG5nPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvaHJlZj4KLSAgPC9iYW5uZXJSaWdodD4gIAotCi0gIDxwdWJsaXNoRGF0ZSBmb3JtYXQ9ImRkIE1NTSB5eXl5Ii8+Ci0KLSAgPHNraW4+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLm1hdmVuPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtc2l0ZS1za2luPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvc2tpbj4KLQotICA8Ym9keT4KLSAgICA8bGlua3M+Ci0gICAgICA8aXRlbSBuYW1lPSJBcGFjaGUiIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZyIvPgotICAgICAgPGl0ZW0gbmFtZT0iTXlGYWNlcyIgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCBNeWZhY2VzIEV4dFZhbCIgICAgICAgaHJlZj0iZG93bmxvYWQuaHRtbCIvPgotICAgIDwvbGlua3M+Ci0KLSAgICA8bWVudSBuYW1lPSJBcGFjaGUgTXlGYWNlcyIgaW5oZXJpdD0idG9wIj4KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkRvd25sb2FkIiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2Rvd25sb2FkLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0KLSAgICA8bWVudSBuYW1lPSJDb250ZW50cyIgaW5oZXJpdD0idG9wIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iTWFpbiBTaXRlIiAgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW5kZXguaHRtbCIvPgotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjEiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS9pbmRleC5odG1sIiBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8aXRlbSBuYW1lPSJkdW1teSIgICAgICAgIGhyZWY9ImR1bW15Ii8+Ci0gICAgICAgIDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iRXh0VmFsIGZvciBKU0YgMS4yIiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvaW5kZXguaHRtbCIgY29sbGFwc2U9InRydWUiPgotICAgICAgICAgICAgPGl0ZW0gbmFtZT0iZHVtbXkiICAgICAgICBocmVmPSJkdW1teSIvPgotICAgICAgICA8L2l0ZW0+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgbmFtZT0iRG9jdW1lbnRhdGlvbiI+Ci0gICAgICA8aXRlbSBuYW1lPSJXaWtpIiAgICAgICAgIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvbXlmYWNlcy9FeHRlbnNpb25zL1ZhbGlkYXRvci8iLz4KLSAgICA8L21lbnU+Ci0KLSAgICA8bWVudSByZWY9InJlcG9ydHMiLz4KLQotICAgIDxtZW51IG5hbWU9IkZvdW5kYXRpb24iIGluaGVyaXQ9InRvcCI+Ci0gICAgICA8aXRlbSBuYW1lPSJBU0YiICAgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlNwb25zb3JzaGlwIiAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9zcG9uc29yc2hpcC5odG1sIiAvPgotICAgICAgPGl0ZW0gbmFtZT0iVGhhbmtzIiAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3RoYW5rcy5odG1sIiAvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMxYWQ3NS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0NCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgVmFsaWRhdGlvbi1Nb2R1bGVzPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPHNjbT4NCi0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL3ZhbGlkYXRpb24tbW9kdWxlczwvY29ubmVjdGlvbj4NCi0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy92YWxpZGF0aW9uLW1vZHVsZXM8L2RldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy92YWxpZGF0aW9uLW1vZHVsZXM8L3VybD4NCi0gICAgPC9zY20+DQotDQotICAgIDxtb2R1bGVzPg0KLSAgICAgICAgPG1vZHVsZT5wcm9wZXJ0eS12YWxpZGF0aW9uPC9tb2R1bGU+DQotICAgICAgICA8IS0tbW9kdWxlPmJlYW4tdmFsaWRhdGlvbjwvbW9kdWxlLS0+DQotICAgIDwvbW9kdWxlcz4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGY5ZTZhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFByb3BlcnR5LVZhbGlkYXRpb24tTW9kdWxlPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnBlcnNpc3RlbmNlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnBlcnNpc3RlbmNlLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIA0KLSAgICAgICAgPCEtLSBUZXN0IGRlcGVuZGVuY2llcyAtLT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuNTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0LmpzcDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3AtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnNoYWxlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNoYWxlLXRlc3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjQ8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgICAgIDxleGNsdXNpb25zPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5teWZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCi0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxyZXNvdXJjZXM+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgIDwvcmVzb3VyY2VzPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQuMjwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovQWJzdHJhY3QqLmphdmE8L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovVGVzdFV0aWxzLmphdmE8L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKkJlYW4uamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+DQotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4gICAgICAgICAgICANCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjNzQxNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiDQotICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjIiPg0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi0NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWM0ODdkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRTZWNyZXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTWVudTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lUmFkaW87Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlDaGVja2JveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUxpc3Rib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHRhcmVhOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgcHVibGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgY29uZmlndXJlUmVxdWlyZWRBdHRyaWJ1dGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOwotICAgICAgICBjb25maWd1cmVNYXhMZW5ndGhBdHRyaWJ1dGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVJlcXVpcmVkQXR0cmlidXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCFwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKSkgfHwKLSAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSkKLSAgICAgICAgICAgICYmCi0gICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGlzQ29tcG9uZW50UmVxdWlyZWQodWlDb21wb25lbnQpKSkKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJgotICAgICAgICAgICAgICAgIUJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRTZWNyZXQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVMaXN0Ym94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lTWVudSB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZVJhZGlvIHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUNoZWNrYm94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TWVudSB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0VGV4dGFyZWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaWYgdGhlcmUgaXMgbm8gc3BlY2lhbCBhdHRyaWJ1dGUgYXQgdGhlIGNvbXBvbmVudCB3aGljaCBzaG91bGQgb3ZlcnJ1bGUKLSAgICAgKiB0aGUgYW5ub3RhdGVkIHByb3BlcnR5IHJldHVybiB0cnVlIQotICAgICAqCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IGNvbXBvbmVudCB3aGljaCBpbXBsZW1lbnRzIHRoZSBFZGl0YWJsZVZhbHVlSG9sZGVyIGludGVyZmFjZQotICAgICAqIEByZXR1cm4gZmFsc2UgdG8gb3ZlcnJ1bGUgdGhlIGFubm90YXRlZCBwcm9wZXJ0eSBlLmcuIGlmIGNvbXBvbmVudCBpcyByZWFkb25seQotICAgICAqLwotICAgIHByb3RlY3RlZCBCb29sZWFuIGlzQ29tcG9uZW50UmVxdWlyZWQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBib29sZWFuIGlzUmVhZE9ubHkgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzUmVhZG9ubHkiKSkpOwotICAgICAgICBib29sZWFuIGlzRGlzYWJsZWQgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzRGlzYWJsZWQiKSkpOwotCi0gICAgICAgIHJldHVybiAhKGlzUmVhZE9ubHkgfHwgaXNEaXNhYmxlZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlTWF4TGVuZ3RoQXR0cmlidXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpOwotCi0gICAgICAgICAgICBpZighKG1heExlbmd0aCBpbnN0YW5jZW9mIEludGVnZXIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0VGV4dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBIdG1sSW5wdXRUZXh0IGh0bWxJbnB1dFRleHQgPSAoSHRtbElucHV0VGV4dCl1aUNvbXBvbmVudDsKLSAgICAgICAgICAgICAgICBodG1sSW5wdXRUZXh0LnNldE1heGxlbmd0aCgoSW50ZWdlciltYXhMZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkNmZlOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFNlY3JldDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVMaXN0Ym94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVSYWRpbzsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueU1lbnU7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dGFyZWE7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBIdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IKLXsKLSAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQotICAgIHsKLSAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkgJiYgbWV0YURhdGFFbnRyeSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpOwotCi0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSAoU3RyaW5nKSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJnZXRMYWJlbCIpKTsKLQotICAgICAgICAgICAgaWYobGFiZWwgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsYWJlbCA9IHVpQ29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vb3ZlcnJpZGUgdGhlIGxhYmVsIGlmIHRoZSBhbm5vdGF0aW9uIHByb3ZpZGVzIGEgbGFiZWwKLSAgICAgICAgICAgIGlmKG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGFiZWwgPSBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMLCBTdHJpbmcuY2xhc3MpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvUGxhY2VMYWJlbChmYWNlc01lc3NhZ2UsIGxhYmVsLCBpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0VGV4dCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0U2VjcmV0IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lTGlzdGJveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZU1lbnUgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVSYWRpbyB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlDaGVja2JveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlMaXN0Ym94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueU1lbnUgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHRhcmVhOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODM0NWQ3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwucmVjb3JkZXIuQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyDQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcihuZXcgQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIoKSk7DQotDQotICAgICAgICBpbml0U3RhdGljU3RyYXRlZ3lNYXBwaW5ncygpOw0KLSAgICAgICAgaW5pdERlZmF1bHRDb21wb25lbnRJbml0aWFsaXplcigpOw0KLSAgICAgICAgaW5pdERlZmF1bHRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKTsNCi0gICAgICAgIGFkZFNraXBWYWxpZGF0aW9uU3VwcG9ydCgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0U3RhdGljU3RyYXRlZ3lNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBqcGFCYXNlZFZhbGlkYXRpb24gPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9KUEFfQkFTRURfVkFMSURBVElPTjsNCi0gICAgICAgIGlmIChqcGFCYXNlZFZhbGlkYXRpb24gPT0gbnVsbA0KLSAgICAgICAgICAgICAgICB8fCAhanBhQmFzZWRWYWxpZGF0aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgPSBuZXcgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZygNCi0gICAgICAgICAgICAgICAgRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgKyIuanBhX3N0cmF0ZWd5X21hcHBpbmdzIik7DQotDQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkU3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRywgc3RhdGljQ29uZmlnKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAid2ViLnhtbCBwYXJhbWV0ZXIgdG8gZGVhY3RpdmF0ZSBpdCIpDQotICAgIHByaXZhdGUgdm9pZCBpbml0RGVmYXVsdENvbXBvbmVudEluaXRpYWxpemVyKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ3ZWIueG1sIHBhcmFtZXRlciB0byBkZWFjdGl2YXRlIGl0IikNCi0gICAgcHJpdmF0ZSB2b2lkIGluaXREZWZhdWx0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKA0KLSAgICAgICAgICAgICAgICBuZXcgSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRTa2lwVmFsaWRhdGlvblN1cHBvcnQoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJhZGRpbmcgc3VwcG9ydCBmb3IgQFNraXBWYWxpZGF0aW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5kZW55UmVuZGVyZXJJbnRlcmNlcHRvcihWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKG5ldyBWYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0KCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGtleSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQkFTRV9QQUNLQUdFKSArIENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04udG9VcHBlckNhc2UoKTsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IG1hcmtlckxpc3QgPSAoTGlzdDxDbGFzcz4pRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoa2V5KTsNCi0NCi0gICAgICAgIGlmKG1hcmtlckxpc3QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtYXJrZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eShrZXksIG1hcmtlckxpc3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBtYXJrZXJMaXN0LmFkZChTa2lwVmFsaWRhdGlvblN1cHBvcnQuY2xhc3MpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvcldpdGhTa2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvcldpdGhTa2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY3YjZhOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkludGVyY2VwdG9yV2l0aFNraXBWYWxpZGF0aW9uU3VwcG9ydCBleHRlbmRzIFZhbGlkYXRpb25JbnRlcmNlcHRvcgotewotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIHNraXBWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpCi0gICAgewotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KFNraXBWYWxpZGF0aW9uU3VwcG9ydC5jbGFzcykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJvb2xlYW4gc2tpcFZhbGlkYXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlNLSVBfVkFMSURBVElPTiwgQm9vbGVhbi5jbGFzcyk7Ci0KLSAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMoc2tpcFZhbGlkYXRpb24pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJ2YWxpZGF0aW9uIG9mICIgKyB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGNhbmNlbGVkIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZih2YWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGFuY2VvZiBTa2lwVmFsaWRhdGlvblN0cmF0ZWd5KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgbnVsbCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzc3YTRlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFybid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJkb2N1bWVudGF0aW9uIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fTUVTU0FHRVNfSlBBID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMiKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9KUEFfQkFTRURfVkFMSURBVElPTiIpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vRG91YmxlUmFuZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2NkNGVmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIERvdWJsZVJhbmdlDQotew0KLSAgICBkb3VibGUgbWluaW11bSgpIGRlZmF1bHQgMDsNCi0NCi0gICAgZG91YmxlIG1heGltdW0oKSBkZWZhdWx0IERvdWJsZS5NQVhfVkFMVUU7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Kb2luVmFsaWRhdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YjUyYmYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgSm9pblZhbGlkYXRpb24NCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkNzVmYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTGVuZ3RoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgTGVuZ3RoDQotew0KLSAgICBpbnQgbWluaW11bSgpIGRlZmF1bHQgMDsNCi0NCi0gICAgaW50IG1heGltdW0oKSBkZWZhdWx0IEludGVnZXIuTUFYX1ZBTFVFOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzc1MmQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIExvbmdSYW5nZQ0KLXsNCi0gICAgbG9uZyBtaW5pbXVtKCkgZGVmYXVsdCAwOw0KLQ0KLSAgICBsb25nIG1heGltdW0oKSBkZWZhdWx0IExvbmcuTUFYX1ZBTFVFOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUGF0dGVybi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1BhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY3N2RjOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFBhdHRlcm4NCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJub19tYXRjaCI7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZC5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNjViM2MuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUmVxdWlyZWQNCi17DQotICAgIC8qKg0KLSAgICAgKiB0byBjdXN0b21pemUgdGhlIGVycm9yIG1lc3NhZ2Ugb3INCi0gICAgICogdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQganNmIHJlcXVpcmVkIG1lc3NhZ2Ugd2l0aCB0aGUgdXNhZ2Ugb2YgdGhlIG1lc3NhZ2UgcmVzb2x2ZXIgbWVjaGFuaXNtDQotICAgICAqDQotICAgICAqIEByZXR1cm4gYW4gb3B0aW9uYWwgZXJyb3IgbWVzc2FnZSBrZXkNCi0gICAgICovDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJmaWVsZF9yZXF1aXJlZCI7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5N2VmODAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgU2tpcFZhbGlkYXRpb24NCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc5ZjY1MS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVGFyZ2V0KFRZUEUpCi1AUmV0ZW50aW9uKFJVTlRJTUUpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBAaW50ZXJmYWNlIFNraXBWYWxpZGF0aW9uU3VwcG9ydAotewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9WYWxpZGF0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0NTZkMC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgVmFsaWRhdG9yDQotew0KLSAgICBDbGFzczw/IGV4dGVuZHMgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcj5bXSB2YWx1ZSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWU4OTA1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IgZXh0ZW5kcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IKLXsKLSAgICBwcml2YXRlIERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGdldEluc3RhbmNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVJbnRlcmNlcHRlZE1ldGFEYXRhRXh0cmFjdG9yKG5ldyBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkKLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsKLQotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBQcm9wZXJ0eURldGFpbHMpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG9iamVjdC5nZXRDbGFzcygpICsgIiBpcyBub3QgYSAiICsgUHJvcGVydHlEZXRhaWxzLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gKFByb3BlcnR5RGV0YWlscylvYmplY3Q7Ci0KLSAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCk7Ci0KLSAgICAgICAgLy9UT0RPIHRlc3Qgd2l0aCBjb21wbGV4IGNvbXBvbmVudHMKLSAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5zZXRJbmZvcm1hdGlvbigKLSAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIHByb3BlcnR5RGV0YWlscyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZmluZCBhbmQgYWRkIGFubm90YXRpb25zCi0gICAgICAgICAqLwotICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU4MDEyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPVRoZSByZXF1aXJlZCBmb3JtYXRlIGlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2FiNTQzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPVx1MDYyN1x1MDY0NFx1MDYzNVx1MDY0YVx1MDYzYVx1MDYyOSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2MjZcdTA2MjkNCi1ub19tYXRjaF9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjM1XHUwNjRhXHUwNjNhXHUwNjI5IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzN1x1MDY0NFx1MDY0OFx1MDYyOFx1MDYyOSBcdTA2NDdcdTA2NDk6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZDY0OTAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW5vX21hdGNoPUZvcm1hdCBpbnZcdTAwZTBsaWQKLW5vX21hdGNoX2RldGFpbD1FbCBmb3JtYXQgcmVxdWVyaXQgXHUwMGU5czogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVlNzAxYi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1Vbmf8bHRpZ2VzIEZvcm1hdA0KLW5vX21hdGNoX2RldGFpbD1EYXMgZXJmb3JkZXJsaWNoZSBGb3JtYXQgaXN0OiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU4MDEyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPVRoZSByZXF1aXJlZCBmb3JtYXRlIGlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmIxMDc3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXRvIGludlx1MDBlMWxpZG8gCi1ub19tYXRjaF9kZXRhaWw9RWwgZm9ybWF0byByZXF1ZXJpZG8gZXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMGEyMjMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9TGUgZm9ybWF0IGVzdCBpbnZhbGlkZQ0KLW5vX21hdGNoX2RldGFpbD1MZSBmb3JtYXQgZG9pdCAmZWNpcmM7dHJlIGRlIGxhIGZvcm1lOiB7MH0NCi0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTg3NDhjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXRvIG5vbiB2YWxpZG8KLW5vX21hdGNoX2RldGFpbD1JbCBmb3JtYXRvIHJpY2hpZXN0byAmZWdyYXZlOzogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0YmM3NC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1HZVx1MDBlN2Vyc2l6IGJpXHUwMGU3aW0NCi1ub19tYXRjaF9kZXRhaWw9Z2VyZWtlbiBiaVx1MDBlN2ltOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFhZTY0Yi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgICAgIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZU5hbWUgPSBudWxsOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VOYW1lID0gc3VwZXIuZ2V0QmFzZU5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBiYXNlTmFtZTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NzZhZDkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIHRoZSBqcGEgc3VwcG9ydCBpcyBhbiBleGNlcHRpb24gaW4gdmlldyBvZiBzb21lIG1lY2hhbmlzbXMgLSBzbyB0aGVyZSdzIG5vIGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZS4NCi0gKiBpbnN0ZWFkIG9mIHRoZSBjb252ZW50aW9uIHRoZXJlIGlzIGEgZ2xvYmFsIHByb3BlcnR5IHRvIGhhdmUgYW4gYWx0ZXJuYXRpdmUgdG8gd2ViLnhtbCBjb25maWd1cmF0aW9uDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTID0gIkpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTIjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX05BTUUgPSBXZWJYbWxQYXJhbWV0ZXIuVkFMSURBVElPTl9NRVNTQUdFU19KUEE7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX05BTUUgPSBKcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MNCi0gICAgICAgICAgICAuZ2V0UGFja2FnZSgpLmdldE5hbWUoKS5yZXBsYWNlKCIubWVzc2FnZS5yZXNvbHZlciIsICIubWVzc2FnZS5idW5kbGUiKSsgIi5qcGFfbWVzc2FnZXMiOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYoQ1VTVE9NX0JBU0VfTkFNRSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBDVVNUT01fQkFTRV9OQU1FOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQkFTRV9OQU1FOw0KLSAgICB9DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWRkMThjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgRG91YmxlUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoRG91YmxlUmFuZ2UuY2xhc3MpOw0KLQ0KLSAgICAgICAgZG91YmxlIG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4sIG1pbmltdW0pOw0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCwgYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgaWYobWluaW11bSA+IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2VhZjVhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSm9pbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3Rvci5EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKb2luTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIGV4dHJhY3RvciA9IERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuZ2V0SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIFN0cmluZ1tdIHRhcmdldEV4cHJlc3Npb25zID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShKb2luVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotDQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHM7DQotICAgICAgICBmb3IgKFN0cmluZyB0YXJnZXRFeHByZXNzaW9uIDogdGFyZ2V0RXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChtZXRhRGF0YUVudHJ5LCB0YXJnZXRFeHByZXNzaW9uKTsNCi0NCi0gICAgICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBleHRyYWN0b3IuZXh0cmFjdChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscykuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YUVudHJ5KGVudHJ5KTsNCi0NCi0gICAgICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IEV4dFZhbFV0aWxzLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXRBbGwobWV0YURhdGFUcmFuc2Zvcm1lci5jb252ZXJ0TWV0YURhdGEoZW50cnkpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYmZkYmEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkJhc2ljOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKcGFNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImltcGwuIHRoZSByZXN0IikNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGEuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyk7DQotDQotICAgICAgICBpZihhbm5vdGF0aW9uIGluc3RhbmNlb2YgQ29sdW1uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCEoKENvbHVtbikgYW5ub3RhdGlvbikubnVsbGFibGUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RILCAoKENvbHVtbikgYW5ub3RhdGlvbikubGVuZ3RoKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihhbm5vdGF0aW9uIGluc3RhbmNlb2YgQmFzaWMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoISgoQmFzaWMpIGFubm90YXRpb24pLm9wdGlvbmFsKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIElkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotICAgICAgICAvL1RPRE8gaW1wbC4gdGhlIHJlc3QhISENCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTGVuZ3RoTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9MZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYzVlZTMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9MZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBMZW5ndGggYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTGVuZ3RoLmNsYXNzKTsNCi0NCi0gICAgICAgIGludCBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW5pbXVtKCk7DQotDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSCwgbWluaW11bSk7DQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCwgYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgaWYobWluaW11bSA+IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Mb25nUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ4NWUyZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxvbmdSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIExvbmdSYW5nZSBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMb25nUmFuZ2UuY2xhc3MpOw0KLQ0KLSAgICAgICAgbG9uZyBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW5pbXVtKCk7DQotDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOLCBtaW5pbXVtKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgsIGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gPiAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY5MTMxNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1BhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5QYXR0ZXJuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIFBhdHRlcm4gYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoUGF0dGVybi5jbGFzcyk7DQotICAgICAgICANCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOLCAoYW5ub3RhdGlvbikudmFsdWUoKSk7DQotDQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5ID0gKGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICAgICAgTG9jYWxlIGN1cnJlbnRMb2NhbGUgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKTsNCi0NCi0gICAgICAgIE1ldGFEYXRhRW50cnkgdG1wTWV0YURhdGFFbnRyeSA9IG5ldyBNZXRhRGF0YUVudHJ5KCk7DQotICAgICAgICB0bXBNZXRhRGF0YUVudHJ5LnNldEtleShhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgIHRtcE1ldGFEYXRhRW50cnkuc2V0VmFsdWUoYW5ub3RhdGlvbik7DQotICAgICAgICAvL25lZWRlZCBmb3IganNyMzAzIGludGVncmF0aW9uDQotICAgICAgICB0bXBNZXRhRGF0YUVudHJ5LnNldFByb3BlcnRpZXMobWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0aWVzKCkpOw0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSA9DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGFFbnRyeSh0bXBNZXRhRGF0YUVudHJ5KTsNCi0NCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2cgPSBFeHRWYWxVdGlscy5nZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgIC5nZXRNZXNzYWdlKHZhbGlkYXRpb25FcnJvck1zZ0tleSwgY3VycmVudExvY2FsZSk7DQotDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTl9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UsIHZhbGlkYXRpb25FcnJvck1zZyk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9SZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThmNWFhNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU2tpcE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU2tpcE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZiODI1Ny4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NraXBNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFNraXBNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCB0cnVlKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MTc0ODkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgVmFsaWRhdG9yIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFZhbGlkYXRvci5jbGFzcyk7DQotDQotICAgICAgICBDbGFzc1tdIHZhbGlkYXRvcnMgPSBhbm5vdGF0aW9uLnZhbHVlKCk7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBjdXJyZW50Q2xhc3MgOiB2YWxpZGF0b3JzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRDbGFzcy5nZXRTaW1wbGVOYW1lKCkudG9Mb3dlckNhc2UoKS5jb250YWlucyhDb21tb25NZXRhRGF0YUtleXMuRU1BSUwpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsdWUuYWRkKENvbW1vbk1ldGFEYXRhS2V5cy5FTUFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZhbHVlLmFkZChjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00sIHZhbHVlKTsNCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvRG91YmxlUmFuZ2VTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNzU5MzMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkRvdWJsZVJhbmdlVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEb3VibGVSYW5nZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIERvdWJsZVJhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKERvdWJsZVJhbmdlLmNsYXNzKTsNCi0gICAgICAgIERvdWJsZVJhbmdlVmFsaWRhdG9yIGRvdWJsZVJhbmdlVmFsaWRhdG9yID0gKERvdWJsZVJhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5Eb3VibGVSYW5nZSIpOw0KLQ0KLSAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Kb2luVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdmZTNmOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3Rvci5EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSm9pblZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBleHRyYWN0b3IgPSBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmdldEluc3RhbmNlKCk7DQotDQotICAgICAgICBTdHJpbmdbXSB0YXJnZXRFeHByZXNzaW9ucyA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoSm9pblZhbGlkYXRpb24uY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlsczsNCi0gICAgICAgIGZvciAoU3RyaW5nIHRhcmdldEV4cHJlc3Npb24gOiB0YXJnZXRFeHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscw0KLSAgICAgICAgICAgICAgICAuY3JlYXRlUHJvcGVydHlEZXRhaWxzRm9yTmV3VGFyZ2V0KG1ldGFEYXRhRW50cnksIHRhcmdldEV4cHJlc3Npb24pOw0KLQ0KLSAgICAgICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IGV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgcHJvcGVydHlEZXRhaWxzKS5nZXRNZXRhRGF0YUVudHJpZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhRW50cnkoZW50cnkpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBlbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gdmFsaWRhdGlvbiBzdHJhdGVneSBmb3VuZCBmb3IgIiArIGVudHJ5LmdldFZhbHVlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSnBhVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTE0ZDhlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSnBhVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5CYXNpYzsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmU7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKcGFWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VGYWNlc0J1bmRsZSA9IGZhbHNlOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVEVfTEVOR1RIID0gImxlbmd0aCI7DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHZpb2xhdGlvbjsNCi0gICAgcHJpdmF0ZSBpbnQgbWF4TGVuZ3RoOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyk7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIENvbHVtbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZUNvbHVtbkFubm90YXRpb24oKENvbHVtbikgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBCYXNpYykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZUJhc2ljQW5ub3RhdGlvbigoQmFzaWMpIGFubm90YXRpb24sIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgSWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE9uZVRvT25lKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlT25lVG9PbmVBbm5vdGF0aW9uKChPbmVUb09uZSkgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBNYW55VG9PbmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVNYW55VG9PbmVBbm5vdGF0aW9uKChNYW55VG9PbmUpIGFubm90YXRpb24sIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ29sdW1uQW5ub3RhdGlvbihDb2x1bW4gY29sdW1uLCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICghY29sdW1uLm51bGxhYmxlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcNCi0gICAgICAgICAgICAgICAgJiYgY29sdW1uLmxlbmd0aCgpIDwgKChTdHJpbmcpIGNvbnZlcnRlZE9iamVjdCkubGVuZ3RoKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb24gPSBWQUxJREFURV9MRU5HVEg7DQotICAgICAgICAgICAgdGhpcy5tYXhMZW5ndGggPSBjb2x1bW4ubGVuZ3RoKCk7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihnZXRWYWxpZGF0aW9uRXJyb3JGYWNlc01hc3NhZ2UobnVsbCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUJhc2ljQW5ub3RhdGlvbihCYXNpYyBiYXNpYywgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoIWJhc2ljLm9wdGlvbmFsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU9uZVRvT25lQW5ub3RhdGlvbihPbmVUb09uZSBvbmVUb09uZSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFvbmVUb09uZS5vcHRpb25hbCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVNYW55VG9PbmVBbm5vdGF0aW9uKE1hbnlUb09uZSBtYW55VG9PbmUsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmICghbWFueVRvT25lLm9wdGlvbmFsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkNCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0ID09IG51bGwgfHwgY29udmVydGVkT2JqZWN0LmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb24gPSBDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQ7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihnZXRWYWxpZGF0aW9uRXJyb3JGYWNlc01hc3NhZ2UobnVsbCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKFZBTElEQVRFX0xFTkdUSC5lcXVhbHModGhpcy52aW9sYXRpb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAiZmllbGRfdG9vX2xvbmciOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAiZmllbGRfcmVxdWlyZWQiOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBzdXBlci5nZXRFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbik7DQotDQotICAgICAgICBpZiAoVkFMSURBVEVfTEVOR1RILmVxdWFscyh0aGlzLnZpb2xhdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgiezB9IiwgIiIgKyB0aGlzLm1heExlbmd0aCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHN1cGVyLnJlc29sdmVNZXNzYWdlKGtleSk7DQotICAgICAgICBTdHJpbmcgbWFya2VyID0gQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVI7DQotDQotICAgICAgICBpZigobWFya2VyICsga2V5ICsgbWFya2VyKS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnVzZUZhY2VzQnVuZGxlID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIGUpDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSBlLmdldEZhY2VzTWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgaWYodGhpcy51c2VGYWNlc0J1bmRsZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihWQUxJREFURV9MRU5HVEguZXF1YWxzKHRoaXMudmlvbGF0aW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdE1heGltdW1NZXNzYWdlKGZhY2VzTWVzc2FnZSwgdGhpcy5tYXhMZW5ndGgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5yZXBsYWNlV2l0aERlZmF1bHRSZXF1aXJlZE1lc3NhZ2UoZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2QwNTU4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTGVuZ3RoU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxlbmd0aDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkxlbmd0aFZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTGVuZ3RoU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgTGVuZ3RoIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKExlbmd0aC5jbGFzcyk7DQotICAgICAgICBMZW5ndGhWYWxpZGF0b3IgbGVuZ3RoVmFsaWRhdG9yID0gKExlbmd0aFZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigiamF2YXguZmFjZXMuTGVuZ3RoIik7DQotDQotICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWF4aW11bShhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBsZW5ndGhWYWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNTgyMDIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTG9uZ1JhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTG9uZ1JhbmdlVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMb25nUmFuZ2VTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotDQotICAgICAgICBMb25nUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTG9uZ1JhbmdlLmNsYXNzKTsNCi0gICAgICAgIExvbmdSYW5nZVZhbGlkYXRvciBsb25nUmFuZ2VWYWxpZGF0b3IgPSAoTG9uZ1JhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoImphdmF4LmZhY2VzLkxvbmdSYW5nZSIpOw0KLQ0KLSAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnNldE1pbmltdW0oYW5ub3RhdGlvbi5taW5pbXVtKCkpOw0KLSAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9QYXR0ZXJuU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUGF0dGVyblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMjgzOWEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9QYXR0ZXJuU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFBhdHRlcm5TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgUGF0dGVybiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShQYXR0ZXJuLmNsYXNzKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGV4cHJlc3Npb24gOiBhbm5vdGF0aW9uLnZhbHVlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCA9PSBudWxsDQotICAgICAgICAgICAgICAgICAgICB8fCAhamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4uY29tcGlsZShleHByZXNzaW9uKS5tYXRjaGVyKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QudG9TdHJpbmcoKSkubWF0Y2hlcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihuZXcgRmFjZXNNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24pLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKS5yZXBsYWNlKCJ7MH0iLCBleHByZXNzaW9uKSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKFBhdHRlcm4pIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUmVxdWlyZWRTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZXF1aXJlZFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOGY5OTYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZXF1aXJlZFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZFN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRmFjZXNCdW5kbGUgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCA9PSBudWxsIHx8IGNvbnZlcnRlZE9iamVjdC5lcXVhbHMoIiIpIHx8DQotICAgICAgICAgICAgICAgIChjb252ZXJ0ZWRPYmplY3QgaW5zdGFuY2VvZiBDb2xsZWN0aW9uICYmICgoQ29sbGVjdGlvbiljb252ZXJ0ZWRPYmplY3QpLmlzRW1wdHkoKSkgfHwNCi0gICAgICAgICAgICAgICAgKGNvbnZlcnRlZE9iamVjdCBpbnN0YW5jZW9mIE1hcCAmJiAoKE1hcCljb252ZXJ0ZWRPYmplY3QpLmlzRW1wdHkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihnZXRWYWxpZGF0aW9uRXJyb3JGYWNlc01hc3NhZ2UobWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoUmVxdWlyZWQpIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShlLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1NraXBWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvU2tpcFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTg2MTAzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvU2tpcFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBTa2lwVmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFN0cmluZ1tdIHZhbHVlQmluZGluZ0V4cHJlc3Npb25zID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShTa2lwVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIGZvcihTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA6IHZhbHVlQmluZGluZ0V4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRWYWx1ZU9mRXhwcmVzc2lvbigNCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKSkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5zZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5TS0lQX1ZBTElEQVRJT04sIHRydWUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9WYWxpZGF0b3JTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9WYWxpZGF0b3JTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjNjYzkxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLQ0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I+W10gdmFsaWRhdG9yQ2xhc3NlcyA9DQotICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShWYWxpZGF0b3IuY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yIHZhbGlkYXRvcjsNCi0gICAgICAgIGZvciAoQ2xhc3MgdmFsaWRhdG9yQ2xhc3NOYW1lIDogdmFsaWRhdG9yQ2xhc3NlcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0b3IgPSAoamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcikgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzcyh2YWxpZGF0b3JDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UodmFsaWRhdG9yQ2xhc3NOYW1lLmdldE5hbWUoKSArICIgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU2NmE0MS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWNlc0V4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBUaGlzIHBoYXNlIGxpc3RlbmVyIHByb2Nlc3NlcyBjcm9zcyB2YWxpZGF0aW9uIGFzIHNvb24gYXMgaXQgZmluZHMgYSBzcGVjaWFsIHJlcXVlc3Qgc2NvcGVkIHN0b3JhZ2UuPGJyLz4NCi0gKiBTbyBpdCdzIHBvc3NpYmxlIHRvIGFkZCBpbmZvcm1hdGlvbiBkdXJpbmcgdGhlIHByb2Nlc3MgdmFsaWRhdGlvbiBwaGFzZS4gQXQgdGhlIGVuZCBvZiB0aGlzIHBoYXNlIGl0IGdldHMgcHJvY2Vzc2VkLg0KLSAqIEFmdGVyIHRoYXQgdGhlIHN0b3JhZ2UgZ2V0cyByZXNldGVkLjxwLz4NCi0gKiBJZiB5b3UgcHJvdmlkZSBhIGN1c3RvbSBleHRlbnNpb24gYW5kIHlvdSBhZGQgdGhlIHNhbWUgc3RvcmFnZSB0eXBlIHdpdGhpbiBhIGRpZmZlcmVudCBwaGFzZSwNCi0gKiBpdCBhbHNvIGdldHMgcHJvY2Vzc2VkIGF0IHRoZSBlbmQgb2YgdGhhdCBwaGFzZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSA9IENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKTsNCi0gICAgICAgICAgICBmb3IgKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA6IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UuZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKSBpbnN0YW5jZW9mIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbml0Q3Jvc3NWYWxpZGF0aW9uIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLnByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oZW50cnksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFkZE1lc3NhZ2UgPSB0cnVlOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkgaW5zdGFuY2VvZiBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWVzc2FnZSA9IChCb29sZWFuKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5nZXRDbGFzcygpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5jbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRDbGFzcygpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYoYWRkTWVzc2FnZSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWNlc01lc3NhZ2UgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsICYmIGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RmFjZXNDb250ZXh0KCkuYWRkTWVzc2FnZShlbnRyeS5nZXRDbGllbnRJZCgpLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRGYWNlc0NvbnRleHQoKS5yZW5kZXJSZXNwb25zZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluYWxseQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLnJlc2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNJbml0aWFsaXplZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OICE9IG51bGwNCi0gICAgICAgICAgICAgICAgICAgICYmIFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NST1NTVkFMSURBVElPTi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBKc2ZVdGlscy5kZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcih0aGlzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5BTllfUEhBU0U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmIzZGYwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMgPSANCi0gICAgICAgIG5ldyBBcnJheUxpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGQoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzLmFkZChlbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcyhMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDRjMDQwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkNCi17DQotICAgIHByaXZhdGUgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5Ow0KLSAgICAvL2ZvciBjb21wbGV4IGNvbXBvbmVudHMgKGUuZy4gYSB0YWJsZSkgc3RvcmVzIHRoZSBvYmplY3Qgb2YgZW50cnkgKCN7ZW50cnkucHJvcGVydHl9KQ0KLSAgICBwcml2YXRlIFVJQ29tcG9uZW50IGNvbXBvbmVudDsNCi0gICAgcHJpdmF0ZSBPYmplY3QgY29udmVydGVkT2JqZWN0Ow0KLSAgICBwcml2YXRlIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgLy9qdXN0IGZvciBpbnB1dCBjb21wb25lbnRzIHdpdGhpbiBjb21wbGV4IGNvbXBvbmVudHMgZS5nLiBkYXRhVGFibGUsLi4uDQotICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudElkOw0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeSBnZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhRW50cnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFFbnRyeSA9IG1ldGFEYXRhRW50cnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFVJQ29tcG9uZW50IGdldENvbXBvbmVudCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KFVJQ29tcG9uZW50IGNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRPYmplY3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlZE9iamVjdChPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbnZlcnRlZE9iamVjdCA9IGNvbnZlcnRlZE9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uU3RyYXRlZ3koQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneSA9IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudElkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNsaWVudElkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudElkKFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1Byb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1Byb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkzMTNkOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBJbiBvcmRlciB0byBidWlsZCB1cCBhIG1hcHBpbmcgd2hpY2ggaXMgdXNlZCBmb3IgY3Jvc3MtdmFsaWRhdGlvbi4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkKLXsKLSAgICBwcml2YXRlIE9iamVjdCBiZWFuOwotICAgIHByaXZhdGUgT2JqZWN0IGNvbnZlcnRlZFZhbHVlOwotICAgIHByaXZhdGUgVUlDb21wb25lbnQgY29tcG9uZW50OwotICAgIC8vZm9yIGNvbXBsZXggY29tcG9uZW50cyAoZS5nLiBhIHRhYmxlIHRoZXJlIGFyZSBtdWx0aXBsZSBlbnRyaWVzIHdpdGgKLSAgICAvL3RoZSBzYW1lIGtleSAoaGVyZSB0aGUgZWwgZXhwcmVzc2lvbiAje2VudHJ5LnByb3BlcnR5fSkKLSAgICAvL2hvd2V2ZXIsIGRvbid0IG92ZXJyaWRlIHRoZSBwcmV2aW91cyBlbnRyeSAtIHRoZXkgYXJuJ3QgdGhlIHNhbWU7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGZ1cnRoZXJFbnRyaWVzOwotICAgIC8vanVzdCBmb3IgaW5wdXQgY29tcG9uZW50cyB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzIGUuZy4gZGF0YVRhYmxlLC4uLgotICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudElkOwotCi0gICAgLyoKLSAgICAgKiBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmVhbihPYmplY3QgYmVhbikKLSAgICB7Ci0gICAgICAgIHRoaXMuYmVhbiA9IGJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkVmFsdWUoT2JqZWN0IGNvbnZlcnRlZFZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy5jb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBVSUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnQoVUlDb21wb25lbnQgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gY2xpZW50SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50SWQoU3RyaW5nIGNsaWVudElkKQotICAgIHsKLSAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGdldEZ1cnRoZXJFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmdXJ0aGVyRW50cmllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGdXJ0aGVyRW50cmllcyhMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGZ1cnRoZXJFbnRyaWVzKQotICAgIHsKLSAgICAgICAgdGhpcy5mdXJ0aGVyRW50cmllcyA9IGZ1cnRoZXJFbnRyaWVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNDAyNzkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcm4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04iKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NzY0MGMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJEYXRlSXNFbnRyeSAodmFsdWVPZiwgdHlwZSkiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIERhdGVJcw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWVPZigpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBvcHRpb25hbCBzZWN0aW9uDQotICAgICAqLw0KLQ0KLSAgICBEYXRlSXNUeXBlIHR5cGUoKSBkZWZhdWx0IERhdGVJc1R5cGUuc2FtZTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgIiI7DQotDQotICAgIFN0cmluZyBub3RCZWZvcmVFcnJvck1zZ0tleSgpIGRlZmF1bHQgIndyb25nX2RhdGVfbm90X2JlZm9yZSI7DQotDQotICAgIFN0cmluZyBub3RBZnRlckVycm9yTXNnS2V5KCkgZGVmYXVsdCAid3JvbmdfZGF0ZV9ub3RfYWZ0ZXIiOw0KLQ0KLSAgICBTdHJpbmcgbm90RXF1YWxFcnJvck1zZ0tleSgpIGRlZmF1bHQgIndyb25nX2RhdGVfbm90X2VxdWFsIjsNCi0NCi0gICAgaW50IGVycm9yTWVzc2FnZURhdGVTdHlsZSgpIGRlZmF1bHQgRGF0ZUZvcm1hdC5NRURJVU07DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzVHlwZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNWY0ODIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJiZWZvcmVPclNhbWUsIGFmdGVyT3JTYW1lIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgZW51bSBEYXRlSXNUeXBlDQotew0KLSAgICBiZWZvcmUsIGFmdGVyLCBzYW1lDQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0VxdWFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDQ3ODk4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIEVxdWFscw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZCI7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL05vdEVxdWFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODgxNzYyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIE5vdEVxdWFscw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQiOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmI2ZGIxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBSZXF1aXJlZElmDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZU9mKCk7DQotDQotICAgIC8qDQotICAgICAqIG9wdGlvbmFsIHNlY3Rpb24NCi0gICAgICovDQotDQotICAgIFJlcXVpcmVkSWZUeXBlIGlzKCkgZGVmYXVsdCBSZXF1aXJlZElmVHlwZS5ub3RfZW1wdHk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJlbXB0eV9maWVsZCI7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZlR5cGUuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFjNThkOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWZUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBlbnVtIFJlcXVpcmVkSWZUeXBlDQotew0KLSAgICBlbXB0eSwgbm90X2VtcHR5DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2MDc1OS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUlucHV0IGlzIGRpZmZlcmVudA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9SW5wdXQgaXMgZGlmZmVyZW50DQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi0NCi13cm9uZ19kYXRlPVdyb25nIGRhdGUNCi13cm9uZ19kYXRlX2RldGFpbD1Xcm9uZyBkYXRlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZjkzYzQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1cdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgXHUwNjQ1XHUwNjJlXHUwNjJhXHUwNjQ0XHUwNjQxDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgXHUwNjQ1XHUwNjJlXHUwNjJhXHUwNjQ0XHUwNjQxDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1cdTA2M2FcdTA2NGFcdTA2MzEgXHUwNjQ1XHUwNjMzXHUwNjQ1XHUwNjQ4XHUwNjJkIFx1MDYyOFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDYgXHUwNjQxXHUwNjMzIFx1MDY0Mlx1MDY0YVx1MDY0NVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1cdTA2M2FcdTA2NGFcdTA2MzEgXHUwNjQ1XHUwNjMzXHUwNjQ1XHUwNjQ4XHUwNjJkIFx1MDYyOFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCAgXHUwNjQ2XHUwNjQxXHUwNjMzIFx1MDY0Mlx1MDY0YVx1MDY0NVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQNCi0NCi13cm9uZ19kYXRlPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2NDlcdTA2MjENCi13cm9uZ19kYXRlX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjJlXHUwNjI3XHUwNjM3XHUwNjQ5XHUwNjIxDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0M1x1MDY0OCBcdTA2NDYgXHUwNjI4XHUwNjM5XHUwNjJmIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzIFx1MDY0OFx1MDY0NiBcdTA2MjhcdTA2MzlcdTA2MmYgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzXHUwNjQ4IFx1MDY0NiBcdTA2NDJcdTA2MjhcdTA2NDQgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0MyBcdTA2NDhcdTA2NDYgXHUwNjQyXHUwNjI4XHUwNjQ0IHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NDRcdTA2MjcgXHUwNjRhXHUwNjMzXHUwNjI3XHUwNjQ4XHUwNjQ5IHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjQ0XHUwNjI3IFx1MDY0YVx1MDYzM1x1MDYyN1x1MDY0OFx1MDY0OSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NTRlZDIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9ZWwgdmFsb3IgXHUwMGU5IGRpZmVyZW50Ci1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPWVsIHZhbG9yIFx1MDBlOSBkaWZlcmVudAotCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPW5vIGVzIHBlcm1ldCBlbCBtYXRlaXggdmFsb3IKLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPW5vIGVzIHBlcm1ldCBlbCBtYXRlaXggdmFsb3IKLQotd3JvbmdfZGF0ZT1kYXRhIGVyclx1MDBmMm5pYQotd3JvbmdfZGF0ZV9kZXRhaWw9ZGF0YSBlcnJcdTAwZjJuaWEKLQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1sYSBkYXRhIGhhIGRlIHNlciBwb3N0ZXJpb3IgYSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9bGEgZGF0YSBoYSBkZSBzZXIgYW50ZXJpb3IgYSB7MH0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1sYSBkYXRhIGhhIGRlIHNlciBwb3N0ZXJpb3IgYSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9bGEgZGF0YSBubyBcdTAwMGU5cyBpZ3VhbCBhIHswfQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPWxhIGRhdGEgbm8gXHUwMDBlOXMgaWd1YWwgYSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkODcyMzQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1FaW5nYWJlIGlzdCB1bnRlcnNjaGllZGxpY2gNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUVpbmdhYmUgaXN0IHVudGVyc2NoaWVkbGljaA0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9RGVyIGdsZWljaGUgV2VydCBpc3QgbmljaHQgZXJsYXVidA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPURlciBnbGVpY2hlIFdlcnQgaXN0IG5pY2h0IGVybGF1YnQNCi0NCi13cm9uZ19kYXRlPURhdHVtIGlua29ycmVrdA0KLXdyb25nX2RhdGVfZGV0YWlsPURhdHVtIGlua29ycmVrdA0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1EYXMgRGF0dW0gbXVzcyBuYWNoIGRlbSB7MH0gc2Vpbg0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9RGFzIERhdHVtIG11c3MgbmFjaCBkZW0gezB9IHNlaW4NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1EYXMgRGF0dW0gbXVzcyB2b3IgZGVtIHswfSBzZWluDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPURhcyBEYXR1bSBtdXNzIHZvciBkZW0gezB9IHNlaW4NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1EYXMgRGF0dW0gZW50c3ByaWNodCBuaWNodCBkZW0gezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPURhcyBEYXR1bSBlbnRzcHJpY2h0IG5pY2h0IGRlbSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNjA3NTkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1JbnB1dCBpcyBkaWZmZXJlbnQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUlucHV0IGlzIGRpZmZlcmVudA0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotDQotd3JvbmdfZGF0ZT1Xcm9uZyBkYXRlDQotd3JvbmdfZGF0ZV9kZXRhaWw9V3JvbmcgZGF0ZQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzM4NTI0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPWxhIGVudHJhZGEgZXMgZGlmZXJlbnRlCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPWxhIGVudHJhZGEgZXMgZGlmZXJlbnRlCi0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9bm8gc2UgcGVybWl0ZW4gZW50cmFkYXMgaWd1YWxlcwotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9bm8gc2UgcGVybWl0ZW4gZW50cmFkYXMgaWd1YWxlcwotCi13cm9uZ19kYXRlPWZlY2hhIGVxdWl2b2NhZGEKLXdyb25nX2RhdGVfZGV0YWlsPWZlY2hhIGVxdWl2b2NhZGEKLQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgbHVlZ28gZGUgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgbHVlZ28gZGUgezB9Ci0KLXdyb25nX2RhdGVfbm90X2FmdGVyPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgYW50ZXMgZGUgezB9Ci13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBhbnRlcyBkZSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9bGEgZmVjaGEgbm8gZXMgaWd1YWwgYSB7MH0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1sYSBmZWNoYSBubyBlcyBpZ3VhbCBhIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmMDIxOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUxlcyBjaGFtcHMgc29udCBkaWZmJmVhY3V0ZTtyZW50cw0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9TGVzIGNoYW1wcyBzb250IGRpZmYmZWFjdXRlO3JlbnRzDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1MZXMgY2hhbXBzIGRvaXZlbnQgJmVjaXJjO3RyZSBkaWZmJmVhY3V0ZTtyZW50cw0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPUxlcyBjaGFtcHMgZG9pdmVudCAmZWNpcmM7dHJlIGRpZmYmZWFjdXRlO3JlbnRzDQotDQotd3JvbmdfZGF0ZT1MYSBkYXRlIGVzdCBpbmNvcnJlY3RlDQotd3JvbmdfZGF0ZV9kZXRhaWw9TGEgZGF0ZSBlc3QgaW5jb3JyZWN0ZQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhcHImZWdyYXZlO3MgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhcHImZWdyYXZlO3MgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXZhbnQgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGF2YW50IHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPUxhIGRhdGUgbidlc3QgcGFzICZlYWN1dGU7Z2FsZSAmYWdyYXZlOyB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9TGEgZGF0ZSBuJ2VzdCBwYXMgJmVhY3V0ZTtnYWxlICZhZ3JhdmU7IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA0MjgwMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1WYWxvcmkgbm9uIHVndWFsaQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1JIHZhbG9yaSBpbnNlcml0aSBub24gY29pbmNpZG9ubwotCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPUxvIHN0ZXNzbyB2YWxvcmUgbm9uICZlZ3JhdmU7IHBlcm1lc3NvCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1MbyBzdGVzc28gdmFsb3JlIG5vbiAmZWdyYXZlOyBwZXJtZXNzbwotCi13cm9uZ19kYXRlPURhdGEgZXJyYXRhCi13cm9uZ19kYXRlX2RldGFpbD1EYXRhIGVycmF0YQotCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9TGEgZGF0YSBkZXZlIGVzc2VyZSBkb3BvIGRpIHswfQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1MYSBkYXRhIGRldmUgZXNzZXJlIGRvcG8gZGkgezB9Ci0KLXdyb25nX2RhdGVfbm90X2FmdGVyPUxhIGRhdGEgZGV2ZSBlc3NlcmUgcHJpbWEgZGkgezB9Ci13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9TGEgZGF0YSBkZXZlIGVzc2VyZSBwcmltYSBkaSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9TGEgZGF0YSBub24gJmVncmF2ZTsgdWd1YWxlIGEgezB9Ci13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9TGEgZGF0YSBub24gJmVncmF2ZTsgdWd1YWxlIGEgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWY2YTlkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9Z2lyaWxlbiBkZVx1MDExZmVyIGZhcmtsXHUwMTMxDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1naXJpbGVuIGRlXHUwMTFmZXIgZmFya2xcdTAxMzENCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPWF5blx1MDEzMSBkZVx1MDExZmVyIGdpcmlsZW1leg0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPWF5blx1MDEzMSBkZVx1MDExZmVyIGdpcmlsZW1leg0KLQ0KLXdyb25nX2RhdGU9eWFubFx1MDEzMVx1MDE1ZiB0YXJpaA0KLXdyb25nX2RhdGVfZGV0YWlsPXlhbmxcdTAxMzFcdTAxNWYgdGFyaWgNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBzb25yYSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIHNvbnJhIG9sbWFsXHUwMTMxZFx1MDEzMXINCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIFx1MDBmNm5jZSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gXHUwMGY2bmNlIG9sbWFsXHUwMTMxZFx1MDEzMXINCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZSBlXHUwMTVmaXQgZGVcdTAxMWZpbA0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZSBlXHUwMTVmaXQgZGVcdTAxMWZpbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNzY1OWUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgICAgIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZU5hbWUgPSBudWxsOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VOYW1lID0gc3VwZXIuZ2V0QmFzZU5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBiYXNlTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWNvcmRlci9Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcmVjb3JkZXIvQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0MGEwMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWNvcmRlci9Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnJlY29yZGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlci5Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyIGltcGxlbWVudHMgUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcg0KLXsNCi0gICAgcHVibGljIHZvaWQgcmVjb3JkVXNlcklucHV0KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgdmFsdWUpDQotICAgIHsNCi0gICAgICAgIGlmICghKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy90byBzdXBwb3J0IGxvY2FsIGNyb3NzLXZhbGlkYXRpb24gKHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkpDQotICAgICAgICBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZyA9IENyb3NzVmFsaWRhdGlvblV0aWxzDQotICAgICAgICAgICAgLmdldE9ySW5pdEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IGVudHJ5Ow0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBpZihwcm9wZXJ0eURldGFpbHMgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGVudHJ5ID0gbmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkoKTsNCi0gICAgICAgIGVudHJ5LnNldEJlYW4ocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSk7DQotICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh2YWx1ZSk7DQotICAgICAgICBlbnRyeS5zZXRDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgZW50cnkuc2V0Q2xpZW50SWQodWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKSk7DQotDQotICAgICAgICBTdHJpbmcga2V5ID0gcHJvcGVydHlEZXRhaWxzLmdldEtleSgpOw0KLQ0KLSAgICAgICAgLy9mb3IgbG9jYWwgY3Jvc3MtdmFsaWRhdGlvbg0KLSAgICAgICAgaWYgKGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLmNvbnRhaW5zS2V5KGtleSkgJiYNCi0gICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQoa2V5KS5nZXRCZWFuKCkgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICFrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQoa2V5KS5nZXRCZWFuKCkuZXF1YWxzKGVudHJ5LmdldEJlYW4oKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9mb3IgdGhlIHZhbGlkYXRpb24gd2l0aGluIGEgY29tcGxleCBjb21wb25lbnQgZS5nLiBhIHRhYmxlDQotICAgICAgICAgICAgLy9kb24ndCBvdmVycmlkZSBleGlzdGluZyBleHByZXNzaW9uIChzdHlsZTogI3tlbnRyeS5wcm9wZXJ0eX0pIC0gbWFrZSBhIHNwZWNpYWwgbWFwcGluZw0KLQ0KLSAgICAgICAgICAgIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4gZnVydGhlckVudHJpZXMgPQ0KLSAgICAgICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQoa2V5KS5nZXRGdXJ0aGVyRW50cmllcygpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmdXJ0aGVyRW50cmllcyA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZnVydGhlckVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+KCk7DQotDQotICAgICAgICAgICAgICAgIGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLmdldChrZXkpLnNldEZ1cnRoZXJFbnRyaWVzKGZ1cnRoZXJFbnRyaWVzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgZnVydGhlckVudHJpZXMuYWRkKGVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2ZvciBub3JtYWwgdmFsaWRhdGlvbg0KLSAgICAgICAgICAgIGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLnB1dChrZXksIGVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRlNjM3Yi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIExpc3Q8UmVmZXJlbmNpbmdTdHJhdGVneT4gcmVmZXJlbmNpbmdTdHJhdGVnaWVzOw0KLSAgICBwcm90ZWN0ZWQgTWFwPE9iamVjdCwgT2JqZWN0PiB2aW9sYXRpb25SZXN1bHRTdG9yYWdlID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIGluaXRSZWZlcmVuY2luZ1N0cmF0ZWdpZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UmVmZXJlbmNpbmdTdHJhdGVnaWVzKCkNCi0gICAgew0KLSAgICAgICAgaWYgKHJlZmVyZW5jaW5nU3RyYXRlZ2llcyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcyA9IG5ldyBBcnJheUxpc3Q8UmVmZXJlbmNpbmdTdHJhdGVneT4oKTsNCi0NCi0gICAgICAgICAgICBTdHJpbmcgY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneUNsYXNzTmFtZSA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQkFTRV9QQUNLQUdFKSArICJSZWZlcmVuY2luZ1N0cmF0ZWd5IjsNCi0NCi0gICAgICAgICAgICBSZWZlcmVuY2luZ1N0cmF0ZWd5IGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kgPSAoUmVmZXJlbmNpbmdTdHJhdGVneSkgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneUNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IEVMQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgICAgIC8vcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgQWxpYXNDb21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgTG9jYWxDb21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9pbml0Q3Jvc3NWYWxpZGF0aW9uIGlzIGRvbmUgaW4gdGhlIENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXINCi0NCi0gICAgICAgIFN0cmluZ1tdIHZhbGlkYXRpb25UYXJnZXRzID0gZ2V0VmFsaWRhdGlvblRhcmdldHMoDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0IDogdmFsaWRhdGlvblRhcmdldHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCA9IHZhbGlkYXRpb25UYXJnZXQudHJpbSgpOw0KLQ0KLSAgICAgICAgICAgIC8vc2VsZWN0IHZhbGlkYXRpb24gbWV0aG9kDQotICAgICAgICAgICAgdHJ5VG9WYWxpZGF0ZShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsIHZhbGlkYXRpb25UYXJnZXQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBmb3IgKFJlZmVyZW5jaW5nU3RyYXRlZ3kgcmVmZXJlbmNpbmdTdHJhdGVneSA6IHJlZmVyZW5jaW5nU3RyYXRlZ2llcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAocmVmZXJlbmNpbmdTdHJhdGVneS5ldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLCB2YWxpZGF0aW9uVGFyZ2V0LCB0aGlzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlRocm93YWJsZUluc3RhbmNlTmV2ZXJUaHJvd24ifSkNCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlLA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWhhbmRsZVRhcmdldFZpb2xhdGlvbihlbnRyeU9mU291cmNlLCBlbnRyeU9mVGFyZ2V0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL25vIHRhcmdldCAtIGJlY2F1c2UgdGhlcmUgaXMgbm8gdGFyZ2V0IGNvbXBvbmVudCAtIHZhbHVlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbW9kZWwNCi0gICAgICAgICAgICBpZihlbnRyeU9mVGFyZ2V0ID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzVGFyZ2V0Q29tcG9uZW50QXNTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihlbnRyeU9mU291cmNlKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgLy9nZXQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIHRhcmdldCBjb21wb25lbnQNCi0gICAgICAgIFN0cmluZyBzdW1tYXJ5ID0gZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgdHJ1ZSk7DQotICAgICAgICBTdHJpbmcgZGV0YWlscyA9IGdldEVycm9yTWVzc2FnZURldGFpbChlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgdHJ1ZSk7DQotDQotICAgICAgICAvL3ZhbGlkYXRpb24gdGFyZ2V0IGlzbid0IGJvdW5kIHRvIGEgY29tcG9uZW50IHdpdGhpbmcgdGhlIGN1cnJlbnQgcGFnZSANCi0gICAgICAgIC8vKHNlZSB2YWxpZGF0ZUZvdW5kRW50cnksIHRyeVRvVmFsaWRhdGVMb2NhbGx5IGFuZCB0cnlUb1ZhbGlkYXRlQmluZGluZ09ubHkpDQotICAgICAgICBpZiAoZW50cnlPZlRhcmdldCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGVudHJ5T2ZUYXJnZXQgPSBlbnRyeU9mU291cmNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlIG1lc3NhZ2U7DQotICAgICAgICBpZiAoZW50cnlPZlRhcmdldC5nZXRNZXRhRGF0YUVudHJ5KCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXNzYWdlID0gZ2V0VGFyZ2V0Q29tcG9uZW50RXJyb3JNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICBlbnRyeU9mVGFyZ2V0LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9UT0RPIGRvY3VtZW50IHBvc3NpYmxlIHNpZGUgZWZmZWN0cw0KLSAgICAgICAgICAgIC8vZHVlIHRvIGEgbWlzc2luZyB0YXJnZXQgYW5ub3RhdGlvbiAoc2VlOiB0cnlUb1ZhbGlkYXRlTG9jYWxseSkNCi0gICAgICAgICAgICBtZXNzYWdlID0gZ2V0VGFyZ2V0Q29tcG9uZW50RXJyb3JNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoKG1lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgfHwgbWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKSAmJg0KLSAgICAgICAgICAgIGVudHJ5T2ZTb3VyY2UuZ2V0Q2xpZW50SWQoKSAhPSBudWxsICYmICFlbnRyeU9mU291cmNlLmdldENsaWVudElkKCkuZXF1YWxzKGVudHJ5T2ZUYXJnZXQuZ2V0Q2xpZW50SWQoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiA9IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24obWVzc2FnZSk7DQotDQotICAgICAgICAgICAgaWYoRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgICAgICBlbnRyeU9mVGFyZ2V0LmdldENvbXBvbmVudCgpLCBlbnRyeU9mVGFyZ2V0LmdldE1ldGFEYXRhRW50cnkoKSwNCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5T2ZUYXJnZXQuZ2V0Q29udmVydGVkT2JqZWN0KCksIHZhbGlkYXRvckV4Y2VwdGlvbiwgdGhpcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQuYWRkTWVzc2FnZShlbnRyeU9mVGFyZ2V0LmdldENsaWVudElkKCksIHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzVGFyZ2V0Q29tcG9uZW50QXNTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgLy9nZXQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKTsNCi0gICAgICAgIFN0cmluZyBkZXRhaWxzID0gZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbChlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSk7DQotDQotICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZSA9IGdldFNvdXJjZUNvbXBvbmVudEVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotDQotICAgICAgICBpZiAobWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCB8fCBtZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9UT0RPDQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihtZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8gbG9nZ2luZw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByb2Nlc3NTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGhhbmRsZVNvdXJjZVZpb2xhdGlvbihlbnRyeU9mU291cmNlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2dldCB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQNCi0gICAgICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldEVycm9yTWVzc2FnZVN1bW1hcnkoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIGZhbHNlKTsNCi0gICAgICAgICAgICBTdHJpbmcgZGV0YWlscyA9IGdldEVycm9yTWVzc2FnZURldGFpbChlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgZmFsc2UpOw0KLQ0KLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlID0gZ2V0U291cmNlQ29tcG9uZW50RXJyb3JNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgfHwgbWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9UT0RPDQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24obWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9qdXN0IHRocm93IGEgbmV3IG1lc3NhZ2UgLSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBhdCB0aGUgdGFyZ2V0DQotICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG5ldyBGYWNlc01lc3NhZ2UoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEZhY2VzTWVzc2FnZSBnZXRTb3VyY2VDb21wb25lbnRFcnJvck1lc3NhZ2UoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgRmFjZXNNZXNzYWdlKCk7DQotDQotICAgICAgICBtZXNzYWdlLnNldFNldmVyaXR5KEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgICAgICBtZXNzYWdlLnNldFN1bW1hcnkoc3VtbWFyeSk7DQotICAgICAgICBtZXNzYWdlLnNldERldGFpbChkZXRhaWwpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEZhY2VzTWVzc2FnZSBnZXRUYXJnZXRDb21wb25lbnRFcnJvck1lc3NhZ2UoQW5ub3RhdGlvbiBmb3VuZEFubm90YXRpb24sIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZSA9IG5ldyBGYWNlc01lc3NhZ2UoKTsNCi0NCi0gICAgICAgIG1lc3NhZ2Uuc2V0U2V2ZXJpdHkoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgICAgIG1lc3NhZ2Uuc2V0U3VtbWFyeShzdW1tYXJ5KTsNCi0gICAgICAgIG1lc3NhZ2Uuc2V0RGV0YWlsKGRldGFpbCk7DQotDQotICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcmVzb2x2ZU1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcga2V5ID0gZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgICAgICByZXR1cm4gKGtleSAhPSBudWxsKSA/IHJlc29sdmVNZXNzYWdlKGtleSArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYKSA6IG51bGw7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVUYXJnZXRWaW9sYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UsDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZUYXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBlbnRyeU9mVGFyZ2V0ICE9IG51bGwgJiYgZW50cnlPZlRhcmdldC5nZXRDb21wb25lbnQoKSAhPSBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVNvdXJjZVZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGhhbmRsZVRhcmdldFZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIG51bGwpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIG5vIHRhcmdldCBjb21wb25lbnQgKHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbW9kZWwpIC0+IGdldCByZXZlcnNlIG1lc3NhZ2UgZm9yIHNvdXJjZSBjb21wb25lbnQNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICAvL2lmIHRoZSBtZXNzYWdlIGlzIG5ldXRyYWwNCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24sIHRydWUpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIG5vIHRhcmdldCBjb21wb25lbnQgKHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbW9kZWwpIC0+IGdldCByZXZlcnNlIG1lc3NhZ2UgZm9yIHNvdXJjZSBjb21wb25lbnQNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIC8vaWYgdGhlIG1lc3NhZ2UgaXMgbmV1dHJhbA0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uLCB0cnVlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBhYnN0cmFjdCBtZXRob2RzDQotICAgICAqLw0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBpbXBsZW1lbnRzIHRoZSBzcGVjaWZpYyB2YWxpZGF0aW9uIGxvZ2ljDQotICAgICAqLw0KLQ0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbik7DQotDQotICAgIC8qDQotICAgICAqIHJldHVybnMgdGhlIHJlZmVyZW5jZWQgdmFsaWRhdGlvbiB0YXJnZXRzIG9mIHRoZSBhbm5vdGF0aW9uDQotICAgICAqIGUuZy4gQERhdGVJcyh0eXBlID0gRGF0ZUlzVHlwZS5iZWZvcmUsIHZhbHVlID0gImZpbmFsRXhhbSIpDQotICAgICAqIC0+IG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IHdpdGggb25lIHZhbHVlICgiZmluYWxFeGFtIikNCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YzgxYmIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgLy9pbml0IGNyb3NzLXZhbGlkYXRpb24NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA9DQotICAgICAgICAgICAgZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkuYWRkKGVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA9IG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoKTsNCi0NCi0gICAgICAgIGVudHJ5LnNldE1ldGFEYXRhRW50cnkobWV0YURhdGFFbnRyeSk7DQotICAgICAgICBlbnRyeS5zZXRDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgZW50cnkuc2V0Q2xpZW50SWQodWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIGVudHJ5LnNldFZhbGlkYXRpb25TdHJhdGVneSh0aGlzKTsNCi0NCi0gICAgICAgIHJldHVybiBlbnRyeTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgYXZhaWxhYmxlIGZvciBjcm9zcyB2YWxpZGF0aW9uIC0gdXNlIHByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IGF2YWlsYWJsZSBmb3IgY3Jvc3MgdmFsaWRhdGlvbiIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0VmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICAvL25vdCBhdmFpbGFibGUgZm9yIGNyb3NzIHZhbGlkYXRpb24gLSB1c2UgaW5pdENyb3NzVmFsaWRhdGlvbg0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDcm9zc1ZhbGlkYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICAvL292ZXJyaWRlIGlmIG5lZWRlZA0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLCB2YWxpZGF0b3JFeGNlcHRpb24sIHRoaXMpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvbkhlbHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZjdkZTMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5LA0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNNb2RlbEF3YXJlVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGNvbXBhcmVTdHJhdGVneS5pc1Zpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9wcm9jZXNzIGFmdGVyIHZpb2xhdGlvbg0KLSAgICAgICAgICAgIC8vanVzdCBhZGQgbWVzc2FnZXMNCi0gICAgICAgICAgICBpZighaXNNb2RlbEF3YXJlVmFsaWRhdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NUYXJnZXRBZnRlckNyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1RhcmdldEFmdGVyTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vdGhvdyBleGNlcHRpb24NCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzVGFyZ2V0QWZ0ZXJDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgPSBuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KCk7DQotDQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LnVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbXBvbmVudCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDbGllbnRJZCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbXBvbmVudChzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDbGllbnRJZChzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29udmVydGVkT2JqZWN0KHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpKTsNCi0gICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5KTsNCi0NCi0gICAgICAgIC8vYWRkIG1lc3NhZ2UNCi0gICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgIHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NUYXJnZXRBZnRlck1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIC8vbm8gdGFyZ2V0IC0gYmVjYXVzZSB0aGVyZSBpcyBubyB0YXJnZXQgY29tcG9uZW50IC0gdmFsdWUgd2FzIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBtb2RlbA0KLSAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIG51bGwpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzdkODcyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgdm9pZCBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlKQ0KLSAgICAgICAgICAgIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb247DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0RhdGVJc1N0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzJmYTcxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0RhdGVJc1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJc1R5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsNCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERhdGVJc1N0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT19FQVJMWSA9ICJlYXJseSI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT19MQVRFID0gImxhdGUiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRVFVQUxfREFURV9USU1FID0gIm5vdCBlcXVhbCI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVkgPSAicmVzdWx0IjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFSRURfVkFMVUVfS0VZID0gInRhcmdldCB2YWx1ZSI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVkVSU0VfQ09NUEFSRURfVkFMVUVfS0VZID0gInJldmVyc2UgdGFyZ2V0IHZhbHVlIjsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgLy9UT0RPIHRlc3QgJiByZW1vdmUNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVNvdXJjZVZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHZpb2xhdGlvbkZvdW5kOw0KLQ0KLSAgICAgICAgaWYgKCgoRGF0ZUlzKSBhbm5vdGF0aW9uKS50eXBlKCkuZXF1YWxzKERhdGVJc1R5cGUuc2FtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSBvYmplY3QxICE9IG51bGwgJiYgIW9iamVjdDEuZXF1YWxzKG9iamVjdDIpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVTVUxUX0tFWSwgTk9UX0VRVUFMX0RBVEVfVElNRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoKChEYXRlSXMpIGFubm90YXRpb24pLnR5cGUoKS5lcXVhbHMoRGF0ZUlzVHlwZS5iZWZvcmUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsICYmIG9iamVjdDIgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW5ldyBEYXRlKCgoRGF0ZSkgb2JqZWN0MSkuZ2V0VGltZSgpKS5iZWZvcmUoKERhdGUpIG9iamVjdDIpIHx8IG9iamVjdDEuZXF1YWxzKG9iamVjdDIpKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFU1VMVF9LRVksIFRPT19MQVRFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSBvYmplY3QxICE9IG51bGwgJiYgb2JqZWN0MiAhPSBudWxsICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICghbmV3IERhdGUoKChEYXRlKSBvYmplY3QxKS5nZXRUaW1lKCkpLmFmdGVyKChEYXRlKSBvYmplY3QyKSB8fCBvYmplY3QxLmVxdWFscyhvYmplY3QyKSk7DQotDQotICAgICAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVNVTFRfS0VZLCBUT09fRUFSTFkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KENPTVBBUkVEX1ZBTFVFX0tFWSwgb2JqZWN0MSk7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVZFUlNFX0NPTVBBUkVEX1ZBTFVFX0tFWSwgb2JqZWN0Mik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlvbGF0aW9uRm91bmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRGF0ZUlzKSBhbm5vdGF0aW9uKS52YWx1ZU9mKCk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogcHJvdGVjdGVkDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAoU3RyaW5nKSB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UuZ2V0KFJFU1VMVF9LRVkpOw0KLQ0KLSAgICAgICAgaWYgKCFpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSByZXZlcnNlUmVzdWx0KHJlc3VsdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoVE9PX0VBUkxZLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROb3RBZnRlckVycm9yTXNnS2V5KChEYXRlSXMpIGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoVE9PX0xBVEUuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldE5vdEJlZm9yZUVycm9yTXNnS2V5KChEYXRlSXMpIGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROb3RFcXVhbEVycm9yTXNnS2V5KChEYXRlSXMpIGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHJldmVyc2VSZXN1bHQoU3RyaW5nIHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgaWYgKFRPT19FQVJMWS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gVE9PX0xBVEU7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIFRPT19FQVJMWTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCksIGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBmYWxzZSksIGFubm90YXRpb24sIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgZmFsc2UpDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBhbm5vdGF0aW9uLCBmYWxzZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZShTdHJpbmcga2V5LCBBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gcmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0NCi0gICAgICAgIERhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCgoRGF0ZUlzKSBhbm5vdGF0aW9uKS5lcnJvck1lc3NhZ2VEYXRlU3R5bGUoKSwNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKSk7DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0Ow0KLQ0KLSAgICAgICAgaWYoaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQuZm9ybWF0KChEYXRlKSB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UuZ2V0KENPTVBBUkVEX1ZBTFVFX0tFWSkpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBtZXNzYWdlLnJlcGxhY2UoInswfSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdC5mb3JtYXQoKERhdGUpIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5nZXQoUkVWRVJTRV9DT01QQVJFRF9WQUxVRV9LRVkpKSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL3JlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIG90aGVyIGNvbXBvbmVudA0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBwcml2YXRlDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBnZXROb3RBZnRlckVycm9yTXNnS2V5KERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uLm5vdEFmdGVyRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5vdEJlZm9yZUVycm9yTXNnS2V5KERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uLm5vdEJlZm9yZUVycm9yTXNnS2V5KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXROb3RFcXVhbEVycm9yTXNnS2V5KERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uLm5vdEVxdWFsRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VMQ29tcGFyZVN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODQ2YTI2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VMQ29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIHJlZmVyZW5jaW5nIHZhbGlkYXRpb24gdGFyZ2V0cyAtIHBvc3NpYmxlIGZvcm1hdHM6DQotICogIiN7W2JlYW5fbmFtZV0uW3Byb3BlcnR5X25hbWVdfSIgLi4uIGNyb3NzLWVudGl0eSB2YWxpZGF0aW9uIHdpdGggdmFsdWUgYmluZGluZw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBFTENvbXBhcmVTdHJhdGVneSBpbXBsZW1lbnRzIFJlZmVyZW5jaW5nU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYgKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKHZhbGlkYXRpb25UYXJnZXQpICYmDQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVZhbGlkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgdmFsaWRhdGlvblRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9WYWxpZGF0ZVZhbHVlQmluZGluZygNCi0gICAgICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbGlkYXRpb25UYXJnZXQpLCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLCBjb21wYXJlU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ0ZXN0IikNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZVZhbHVlQmluZGluZygNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9DQotICAgICAgICAgICAgICAgIHJlc29sdmVUYXJnZXRGb3JDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0NCi0gICAgICAgIGlmKHZhbGlkYXRpb25UYXJnZXRFbnRyeSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHJlc29sdmVUYXJnZXRGb3JDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbGlkYXRpb25UYXJnZXQpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZyA9DQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCk7DQotDQotICAgICAgICByZXR1cm4gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMucmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFbnRyeSgNCi0gICAgICAgICAgICAgICAga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLA0KLSAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5jb252ZXJ0VmFsdWVCaW5kaW5nRXhwcmVzc2lvblRvUHJvY2Vzc2VkSW5mb3JtYXRpb25LZXkodmFsaWRhdGlvblRhcmdldCksDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5LCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsaWRhdGlvblRhcmdldCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIE9iamVjdCB0YXJnZXRWYWx1ZSA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0NCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdGFyZ2V0RW50cnkgPSBuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSgpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0QmVhbigNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRWYWx1ZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsIHZhbGlkYXRpb25UYXJnZXQuZ2V0QmFzZUV4cHJlc3Npb24oKSkpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0Q29udmVydGVkVmFsdWUodGFyZ2V0VmFsdWUpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRFbnRyeSwgdHJ1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VxdWFsc1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNDc2Y2EuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFcXVhbHNTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKEVxdWFscykgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLCBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBvYmplY3QxICE9IG51bGwgJiYgIW9iamVjdDEuZXF1YWxzKG9iamVjdDIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKEVxdWFscykgYW5ub3RhdGlvbikudmFsdWUoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbENvbXBhcmVTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxDb21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ4ZDk4Yy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbENvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLlByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLQ0KLS8qKg0KLSAqICJbcHJvcGVydHlfbmFtZV0iIC4uLiBsb2NhbCB2YWxpZGF0aW9uIC0+IGNyb3NzLWNvbXBvbmVudCwgYnV0IG5vIGNyb3NzLWVudGl0eSB2YWxpZGF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIExvY2FsQ29tcGFyZVN0cmF0ZWd5IGltcGxlbWVudHMgUmVmZXJlbmNpbmdTdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZih2YWxpZGF0aW9uVGFyZ2V0LmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kgd2lsbCBjb250aW51ZQ0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnlUb1ZhbGlkYXRlTG9jYWxseSgNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZUxvY2FsbHkoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSwNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZyA9DQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCk7DQotDQotICAgICAgICBib29sZWFuIGlzTW9kZWxBd2FyZVZhbGlkYXRpb24gPQ0KLSAgICAgICAgICAgICAgICBpc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcsIHRhcmdldEtleSk7DQotDQotICAgICAgICBTdHJpbmcgdGFyZ2V0UHJvcGVydHkgPSB0YXJnZXRLZXk7DQotDQotICAgICAgICBTdHJpbmcgc291cmNlS2V5ID0gcmVzb2x2ZVNvdXJjZUtleShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgdGFyZ2V0S2V5ID0gc291cmNlS2V5LnN1YnN0cmluZygwLCBzb3VyY2VLZXkubGFzdEluZGV4T2YoIi4iKSArIDEpICsgdGFyZ2V0S2V5Ow0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkgPSBDcm9zc1ZhbGlkYXRpb25VdGlscy5yZXNvbHZlVmFsaWRhdGlvblRhcmdldEVudHJ5KA0KLSAgICAgICAgICAgICAgICBrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcsIHRhcmdldEtleSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0NCi0gICAgICAgIGlmICh2YWxpZGF0aW9uVGFyZ2V0RW50cnkgIT0gbnVsbCAmJiB2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCAmJiAhaXNNb2RlbEF3YXJlVmFsaWRhdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9ubyB0YXJnZXQgLSBiZWNhdXNlIHRoZXJlIGlzIG5vIHRhcmdldCBjb21wb25lbnQgLSB2YWx1ZSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1vZGVsDQotICAgICAgICBlbHNlIGlmKGlzTW9kZWxBd2FyZVZhbGlkYXRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldFByb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB1bnN1cHBvcnRlZENhc2UoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlVGFyZ2V0S2V5KENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFN0cmluZyB0YXJnZXRLZXkpDQotICAgIHsNCi0gICAgICAgIC8vbm8gcmVhbCB2YWx1ZSBiaW5kaW5nIGV4cHJlc3Npb24NCi0gICAgICAgIC8vVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBqdXN0IGhlcGxzIHRvIHJlcGxhY2UgdGhlIHByb3BlcnR5IG9mIHRoZSBrZXkNCi0gICAgICAgIC8vaGVyZSBvbmx5IGRvdC1ub3RhdGlvbiBpcyBhbGxvd2VkIC0+IG5vIHByb2JsZW0NCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYmFzZUV4cHJlc3Npb24gPQ0KLSAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIjeyIgKyBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLA0KLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZXRhaWxzLmNsYXNzKS5nZXRLZXkoKSArICJ9Iik7DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlT3JBZGRQcm9wZXJ0eShiYXNlRXhwcmVzc2lvbiwgdGFyZ2V0S2V5KQ0KLSAgICAgICAgICAgIC5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0LnN1YnN0cmluZygyLCByZXN1bHQubGVuZ3RoKCkgLTEpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWVPZlByb3BlcnR5KE9iamVjdCBiYXNlLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHByb3BlcnR5ID0gcHJvcGVydHkuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSArIHByb3BlcnR5LnN1YnN0cmluZygxLCBwcm9wZXJ0eS5sZW5ndGgoKSk7DQotICAgICAgICBNZXRob2QgdGFyZ2V0TWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKGJhc2UuZ2V0Q2xhc3MoKSwgImdldCIgKyBwcm9wZXJ0eSk7DQotDQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0YXJnZXRNZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoYmFzZS5nZXRDbGFzcygpLCAiaXMiICsgcHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYodGFyZ2V0TWV0aG9kID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgImNsYXNzICIgKyBiYXNlLmdldENsYXNzKCkgKyAiIGhhcyBubyBwdWJsaWMgZ2V0L2lzICIgKyBwcm9wZXJ0eS50b0xvd2VyQ2FzZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoYmFzZSwgdGFyZ2V0TWV0aG9kKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4ga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuZXdLZXkgPSBjcmVhdGVUYXJnZXRLZXkoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgcmV0dXJuICFrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcuY29udGFpbnNLZXkobmV3S2V5KTsNCi0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyByZXNvbHZlU291cmNlS2V5KENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUtleSA9IHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKTsNCi0NCi0gICAgICAgIGlmKCFzb3VyY2VLZXkuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzb3VyY2UgcGF0aDogIiArIHNvdXJjZUtleSArICIgaW52YWxpZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHNvdXJjZUtleTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdW5zdXBwb3J0ZWRDYXNlKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQgY29udmVydGVkIG9iamVjdCBmb3IgIiArICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcykuZ2V0S2V5KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdGFyZ2V0RW50cnkgPSBuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSgpOw0KLQ0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0QmVhbigNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpLmdldEJhc2VPYmplY3QoKSk7DQotICAgICAgICB0YXJnZXRFbnRyeQ0KLSAgICAgICAgICAgICAgICAuc2V0Q29udmVydGVkVmFsdWUoZ2V0VmFsdWVPZlByb3BlcnR5KHRhcmdldEVudHJ5LmdldEJlYW4oKSwgdGFyZ2V0UHJvcGVydHkpKTsNCi0NCi0gICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneShjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0RW50cnksIHRydWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOTE5ZDAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLlByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiAiW2xvY2FsX3Byb3BlcnR5LnByb3BlcnR5MS5wcm9wZXJ0eTJdIg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBMb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kgZXh0ZW5kcyBMb2NhbENvbXBhcmVTdHJhdGVneQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYoIXZhbGlkYXRpb25UYXJnZXQuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL25vdCBzdXBwb3J0ZWQgLSBUT0RPIGFkZCBsb2dnaW5nDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZUxvY2FsbHkoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0S2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZyA9DQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCk7DQotDQotICAgICAgICBTdHJpbmcgbmV3S2V5ID0gY3JlYXRlVGFyZ2V0S2V5KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIGlmIChrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcuY29udGFpbnNLZXkobmV3S2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9IGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQobmV3S2V5KTsNCi0gICAgICAgICAgICBPYmplY3QgdGFyZ2V0VmFsdWUgPSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKTsNCi0NCi0gICAgICAgICAgICBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRWYWx1ZSk7DQotICAgICAgICB9DQotICAgICAgICAvL25vIHRhcmdldCAtIGJlY2F1c2UgdGhlcmUgaXMgbm8gdGFyZ2V0IGNvbXBvbmVudCAtIHZhbHVlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbW9kZWwNCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0S2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCB0YXJnZXRWYWx1ZSkNCi0gICAgew0KLSAgICAgICAgLy9ubyB0YXJnZXQgLSBiZWNhdXNlIHRoZXJlIGlzIG5vIHRhcmdldCBjb21wb25lbnQgLSB2YWx1ZSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1vZGVsDQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LmlzVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFZhbHVlLCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5ID0gbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb21wb25lbnQoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q2xpZW50SWQoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENsaWVudElkKCkpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb252ZXJ0ZWRPYmplY3QodGFyZ2V0VmFsdWUpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAvL3Byb2Nlc3MgYWZ0ZXIgdmlvbGF0aW9uDQotICAgICAgICAgICAgLy9qdXN0IGFkZCBtZXNzYWdlcw0KLSAgICAgICAgICAgIGlmKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBudWxsKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy90aG93IGV4Y2VwdGlvbg0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFN0cmluZyB0YXJnZXRLZXkpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBPYmplY3QgbmV3QmFzZSA9IFJlZmxlY3Rpb25VdGlscw0KLSAgICAgICAgICAgIC5nZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCksIHRhcmdldEtleSk7DQotDQotICAgICAgICBpZih0YXJnZXRLZXkuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2ZpbmQgdGhlIGxhc3QgcHJvcGVydHkNCi0gICAgICAgICAgICB0YXJnZXRLZXkgPSB0YXJnZXRLZXkuc3Vic3RyaW5nKHRhcmdldEtleS5sYXN0SW5kZXhPZigiLiIpICsgMSwgdGFyZ2V0S2V5Lmxlbmd0aCgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXRWYWx1ZSA9IGdldFZhbHVlT2ZQcm9wZXJ0eShuZXdCYXNlLCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB0YXJnZXRFbnRyeSA9IG5ldyBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5KCk7DQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRCZWFuKG5ld0Jhc2UpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0Q29udmVydGVkVmFsdWUodGFyZ2V0VmFsdWUpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRFbnRyeSwgdHJ1ZSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L05vdEVxdWFsc1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMTVlMjAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uTm90RXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBOb3RFcXVhbHNTdHJhdGVneSBleHRlbmRzIEVxdWFsc1N0cmF0ZWd5DQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChOb3RFcXVhbHMpIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsDQotICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIXN1cGVyLmlzVmlvbGF0aW9uKG9iamVjdDEsIG9iamVjdDIsIGFubm90YXRpb24pOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChOb3RFcXVhbHMpIGFubm90YXRpb24pLnZhbHVlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVmZXJlbmNpbmdTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVmZXJlbmNpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTM2ZGZhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlZmVyZW5jaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJbnRlcm5hbCBpbnRlcmZhY2UgdG8gYWxsb3cgbXVsdGlwbGUgcmVmZXJlbmNpbmcgc3RyYXRlZ2llcyBmb3IgY3Jvc3MgY29tcG9uZW50IHZhbGlkYXRpb24uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWludGVyZmFjZSBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgYWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlcXVpcmVkSWZTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDA1YTVmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlcXVpcmVkSWZTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRJZlN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VGYWNlc0J1bmRsZSA9IGZhbHNlOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHN1cGVyLnJlc29sdmVNZXNzYWdlKGtleSk7DQotICAgICAgICBTdHJpbmcgbWFya2VyID0gQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVI7DQotDQotICAgICAgICBpZigobWFya2VyICsga2V5ICsgbWFya2VyKS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnVzZUZhY2VzQnVuZGxlID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChSZXF1aXJlZElmKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiB2aW9sYXRpb25Gb3VuZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgaWYgKCgoUmVxdWlyZWRJZikgYW5ub3RhdGlvbikuaXMoKS5lcXVhbHMoUmVxdWlyZWRJZlR5cGUuZW1wdHkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gKG9iamVjdDIgPT0gbnVsbCB8fCBvYmplY3QyLmVxdWFscygiIikpICYmIChvYmplY3QxID09IG51bGwgfHwgb2JqZWN0MS5lcXVhbHMoIiIpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKCgoUmVxdWlyZWRJZikgYW5ub3RhdGlvbikuaXMoKS5lcXVhbHMoUmVxdWlyZWRJZlR5cGUubm90X2VtcHR5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IChvYmplY3QyICE9IG51bGwgJiYgIW9iamVjdDIuZXF1YWxzKCIiKSkgJiYgKG9iamVjdDEgPT0gbnVsbCB8fCBvYmplY3QxLmVxdWFscygiIikpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZpb2xhdGlvbkZvdW5kOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKFJlcXVpcmVkSWYpIGFubm90YXRpb24pLnZhbHVlT2YoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy51c2VGYWNlc0J1bmRsZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5yZXBsYWNlV2l0aERlZmF1bHRSZXF1aXJlZE1lc3NhZ2UodmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRvckV4Y2VwdGlvbik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkOTkyOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1qYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW49b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuQmFzaWM9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuSWQ9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmU9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk2NDA0ZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENST1NTX1ZBTElEQVRJT05fU1RPUkFHRV9LRVkgPSBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7DQotDQotICAgICAgICBpZiAoIXJlcXVlc3RNYXAuY29udGFpbnNLZXkoQ1JPU1NfVkFMSURBVElPTl9TVE9SQUdFX0tFWSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKENyb3NzVmFsaWRhdGlvblN0b3JhZ2UpIHJlcXVlc3RNYXAuZ2V0KENST1NTX1ZBTElEQVRJT05fU1RPUkFHRV9LRVkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQNCi0gICAgICAgICAgICAgICAgLmdldEN1cnJlbnRJbnN0YW5jZSgpDQotICAgICAgICAgICAgICAgIC5nZXRFeHRlcm5hbENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgICAgIC5wdXQoQ1JPU1NfVkFMSURBVElPTl9TVE9SQUdFX0tFWSwgbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RPX0NPTlZFUlRFRF9WQUxVRV9NQVBQSU5HX0tFWSA9IEpzZlV0aWxzLmNsYXNzLmdldE5hbWUoKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBnZXRPckluaXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIGlmICghcmVxdWVzdE1hcC5jb250YWluc0tleShLRVlfVE9fQ09OVkVSVEVEX1ZBTFVFX01BUFBJTkdfS0VZKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNldEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+KSByZXF1ZXN0TWFwLmdldChLRVlfVE9fQ09OVkVSVEVEX1ZBTFVFX01BUFBJTkdfS0VZKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkNCi0gICAgICAgICAgICAucHV0KEtFWV9UT19DT05WRVJURURfVkFMVUVfTUFQUElOR19LRVksIG5ldyBIYXNoTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4oKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4ga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcsDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSwgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5ID0NCi0gICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQodGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIC8vdmFsdWUgbm90IHN1Ym1pdHRlZCBhdCB0aGlzIHJlcXVlc3QgLSB1c2UgbW9kZWwgdmFsdWUgKHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbW9kZWwpDQotICAgICAgICBpZihwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICAvL3NpbXBsZSBjYXNlDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5nZXRGdXJ0aGVyRW50cmllcygpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXRCZWFuID0gcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKTsNCi0NCi0gICAgICAgIC8vcHJvY2VzcyBjb21wbGV4IGNvbXBvbmVudCBlbnRyaWVzIChlLmcuIGEgdGFibGUpDQotICAgICAgICAvL3N1cHBvcnRlZDogY3Jvc3MtY29tcG9uZW50IGJ1dCBubyBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbiAoPSBsb2NhbGUgdmFsaWRhdGlvbikNCi0gICAgICAgIGlmIChwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEJlYW4oKS5lcXVhbHModGFyZ2V0QmVhbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotICAgICAgICB9DQotDQotICAgICAgICBmb3IgKFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgZW50cnkgOiBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEZ1cnRoZXJFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LmdldEJlYW4oKS5lcXVhbHModGFyZ2V0QmVhbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInN1cHBvcnQgZm9yIG1hcCBzeW50YXgiKQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VmFsdWVCaW5kaW5nRXhwcmVzc2lvblRvUHJvY2Vzc2VkSW5mb3JtYXRpb25LZXkoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YmUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YmUuZ2V0RXhwcmVzc2lvblN0cmluZygpLnJlcGxhY2UoIiN7IiwgIiIpLnJlcGxhY2UoIn0iLCAiIik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzM5MjU1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBQcm9wZXJ0eSBWYWxpZGF0aW9uIE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFByb3BlcnR5IFZhbGlkYXRpb24gTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgUHJvcGVydHkgVmFsaWRhdGlvbiBwcm92aWRlcyBhbm5vdGF0aW9uIGJhc2VkIHZhbGlkYXRpb24gZm9yIGJlYW4gcHJvcGVydGllcy4NCi0gICAgSXQgYWxzbyBwcm92aWRlcyBKUEEgMS4wIGJhc2VkIHZhbGlkYXRpb24gU3VwcG9ydC4NCi0gIA0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS4xLnggYW5kIEpTRiAxLjIueC4gQm90aCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0Fic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDlkZmQ1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0Fic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nOwotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlJbnB1dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeTsKLWltcG9ydCBqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuRXh0VmFsU3RhcnR1cExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlRlc3RVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IubW9jay5FeHRWYWxNb2NrQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWRfaW1wbC5jb25maWcuTXlmYWNlc0NvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0V4dGVybmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrRmFjZXNDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tGYWNlc0NvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tIdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0h0dHBTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tMaWZlY3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0xpZmVjeWNsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1JlbmRlcktpdDsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrUmVzcG9uc2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1NlcnZsZXRDb25maWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1NlcnZsZXRDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5lbC5Nb2NrRXhwcmVzc2lvbkZhY3Rvcnk7Ci0KLS8qKgotICogQWJzdHJhY3QgU2hhbGUgVGVzdCBiYXNlIGNsYXNzLCB3aGljaCBzZXRzIHVwIHRoZSBKU0YgZW52aXJvbm1lbnQuICBJZiB0aGUgdGVzdAotICogb3ZlcnJpZGVzIDxjb2RlPnNldFVwKCk8L2NvZGU+IGFuZC9vciA8Y29kZT50ZWFyRG93bigpPC9jb2RlPiwgdGhlbiB0aG9zZQotICogbWV0aG9kcyBidXQgY2FsbCB0aGUgb3ZlcndpdHRlbiBtZXRob2QgdG8gaW5zdXJlIGEgdmFsaWQgdGVzdCBlbnZpcm9ubWVudC4KLSAqLwotcHVibGljIGNsYXNzIEFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwcm90ZWN0ZWQgTW9ja0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uOwotICAgIHByb3RlY3RlZCBNb2NrU2VydmxldENvbmZpZyBjb25maWc7Ci0gICAgcHJvdGVjdGVkIE1vY2tFeHRlcm5hbENvbnRleHQgZXh0ZXJuYWxDb250ZXh0OwotICAgIHByb3RlY3RlZCBNb2NrRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgTW9ja0ZhY2VzQ29udGV4dEZhY3RvcnkgZmFjZXNDb250ZXh0RmFjdG9yeTsKLSAgICBwcm90ZWN0ZWQgTW9ja0xpZmVjeWNsZSBsaWZlY3ljbGU7Ci0gICAgcHJvdGVjdGVkIE1vY2tMaWZlY3ljbGVGYWN0b3J5IGxpZmVjeWNsZUZhY3Rvcnk7Ci0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCByZW5kZXJLaXQ7Ci0gICAgcHJvdGVjdGVkIE1vY2tIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdDsKLSAgICBwcm90ZWN0ZWQgTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2U7Ci0gICAgcHJvdGVjdGVkIE1vY2tTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dDsKLSAgICBwcm90ZWN0ZWQgTW9ja0h0dHBTZXNzaW9uIHNlc3Npb247Ci0gICAgcHJvdGVjdGVkIE1vY2tFeHByZXNzaW9uRmFjdG9yeSBleHByZXNzaW9uRmFjdG9yeTsKLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIHRocmVhZENvbnRleHRDbGFzc0xvYWRlcjsKLSAgICAgICAgCi0gICAgLyoqIFJlc3BvbnNlIFdyaXRlciAqLwotICAgIHByaXZhdGUgTW9ja1Jlc3BvbnNlV3JpdGVyIHdyaXRlcjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0LgotICAgICAqLwotICAgIHB1YmxpYyBBYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgICAgICBhcHBsaWNhdGlvbiA9IG51bGw7Ci0gICAgICAgIGNvbmZpZyA9IG51bGw7Ci0gICAgICAgIGV4dGVybmFsQ29udGV4dCA9IG51bGw7Ci0gICAgICAgIGZhY2VzQ29udGV4dCA9IG51bGw7Ci0gICAgICAgIGZhY2VzQ29udGV4dEZhY3RvcnkgPSBudWxsOwotICAgICAgICBsaWZlY3ljbGUgPSBudWxsOwotICAgICAgICBsaWZlY3ljbGVGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgcmVuZGVyS2l0ID0gbnVsbDsKLSAgICAgICAgcmVxdWVzdCA9IG51bGw7Ci0gICAgICAgIHJlc3BvbnNlID0gbnVsbDsKLSAgICAgICAgc2VydmxldENvbnRleHQgPSBudWxsOwotICAgICAgICBzZXNzaW9uID0gbnVsbDsKLSAgICAgICAgZXhwcmVzc2lvbkZhY3RvcnkgPSBudWxsOwotICAgICAgICB0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZXR1cCB0aGUgdGVzdCBlbnZpcm9ubWVudCwgaW5jbHVkaW5nIHRoZSBmb2xsb3dpbmc6Ci0gICAgICogIDx1bD4KLSAgICAgKiAgPGxpPlNldCB0aGUgQXBwbGljYXRpb24gTWFwLjwvbGk+Ci0gICAgICogIDxsaT5TZXQgYSByZXNwb25zZSB3cml0ZXI8L2xpPgotICAgICAqICA8bGk+QWRkIFRvbWFoYXdrJ3MgcmVuZGVyZXJzIHRvIHRoZSBmYWNlcyBjb250ZXh0LjwvbGk+Ci0gICAgICogIDwvdWw+IAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIobmV3IFVSTENsYXNzTG9hZGVyKG5ldyBVUkxbMF0sIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkpOwotICAgICAgICBzZXJ2bGV0Q29udGV4dCA9IG5ldyBNb2NrU2VydmxldENvbnRleHQoKTsKLSAgICAgICAgLy9mb3IgdGVzdGluZyB0aGUgZmFsbGJhY2sKLSAgICAgICAgLy9zZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVggKyAiLkRFQUNUSVZBVEVfRUxfUkVTT0xWRVIiLCAidHJ1ZSIpOwotICAgICAgICBjb25maWcgPSBuZXcgTW9ja1NlcnZsZXRDb25maWcoc2VydmxldENvbnRleHQpOwotICAgICAgICBzZXNzaW9uID0gbmV3IE1vY2tIdHRwU2Vzc2lvbigpOwotICAgICAgICBzZXNzaW9uLnNldFNlcnZsZXRDb250ZXh0KHNlcnZsZXRDb250ZXh0KTsKLSAgICAgICAgcmVxdWVzdCA9IG5ldyBNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0KHNlc3Npb24pOwotICAgICAgICByZXF1ZXN0LnNldFNlcnZsZXRDb250ZXh0KHNlcnZsZXRDb250ZXh0KTsKLSAgICAgICAgcmVzcG9uc2UgPSBuZXcgTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2UoKTsKLSAgICAgICAgRmFjdG9yeUZpbmRlci5yZWxlYXNlRmFjdG9yaWVzKCk7Ci0gICAgICAgIEZhY3RvcnlGaW5kZXIuc2V0RmFjdG9yeSgiamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5IiwgRXh0VmFsTW9ja0FwcGxpY2F0aW9uRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBGYWN0b3J5RmluZGVyLnNldEZhY3RvcnkoImphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0RmFjdG9yeSIsICJvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrRmFjZXNDb250ZXh0RmFjdG9yeSIpOwotICAgICAgICBGYWN0b3J5RmluZGVyLnNldEZhY3RvcnkoImphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGVGYWN0b3J5IiwgIm9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tMaWZlY3ljbGVGYWN0b3J5Iik7Ci0gICAgICAgIEZhY3RvcnlGaW5kZXIuc2V0RmFjdG9yeSgiamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3RvcnkiLCAib3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1JlbmRlcktpdEZhY3RvcnkiKTsKLSAgICAgICAgZXh0ZXJuYWxDb250ZXh0ID0gbmV3IE1vY2tFeHRlcm5hbENvbnRleHQoc2VydmxldENvbnRleHQsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgbGlmZWN5Y2xlRmFjdG9yeSA9IChNb2NrTGlmZWN5Y2xlRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoImphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGVGYWN0b3J5Iik7Ci0gICAgICAgIGxpZmVjeWNsZSA9IChNb2NrTGlmZWN5Y2xlKWxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlKCJERUZBVUxUIik7Ci0gICAgICAgIGZhY2VzQ29udGV4dEZhY3RvcnkgPSAoTW9ja0ZhY2VzQ29udGV4dEZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dEZhY3RvcnkiKTsKLSAgICAgICAgZmFjZXNDb250ZXh0ID0gKE1vY2tGYWNlc0NvbnRleHQpZmFjZXNDb250ZXh0RmFjdG9yeS5nZXRGYWNlc0NvbnRleHQoc2VydmxldENvbnRleHQsIHJlcXVlc3QsIHJlc3BvbnNlLCBsaWZlY3ljbGUpOwotICAgICAgICBleHRlcm5hbENvbnRleHQgPSAoTW9ja0V4dGVybmFsQ29udGV4dClmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCk7Ci0gICAgICAgIFVJVmlld1Jvb3Qgcm9vdCA9IG5ldyBVSVZpZXdSb290KCk7Ci0gICAgICAgIHJvb3Quc2V0Vmlld0lkKCIvdmlld0lkIik7Ci0gICAgICAgIHJvb3Quc2V0UmVuZGVyS2l0SWQoIkhUTUxfQkFTSUMiKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LnNldFZpZXdSb290KHJvb3QpOwotICAgICAgICBBcHBsaWNhdGlvbkZhY3RvcnkgYXBwbGljYXRpb25GYWN0b3J5ID0gKEFwcGxpY2F0aW9uRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoImphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeSIpOwotICAgICAgICBhcHBsaWNhdGlvbiA9IChNb2NrQXBwbGljYXRpb24pYXBwbGljYXRpb25GYWN0b3J5LmdldEFwcGxpY2F0aW9uKCk7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5zZXRBcHBsaWNhdGlvbihhcHBsaWNhdGlvbik7Ci0gICAgICAgIFJlbmRlcktpdEZhY3RvcnkgcmVuZGVyS2l0RmFjdG9yeSA9IChSZW5kZXJLaXRGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3RvcnkiKTsKLSAgICAgICAgLy9XcmFwIHJlbmRlcmVycyB3aXRoIHByb3BlciBleHZhbCB3cmFwcGVyCi0gICAgICAgIHJlbmRlcktpdCA9IG5ldyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKS5jcmVhdGUobmV3IE1vY2tSZW5kZXJLaXQoKSk7Ci0gICAgICAgIHJlbmRlcktpdEZhY3RvcnkuYWRkUmVuZGVyS2l0KCJIVE1MX0JBU0lDIiwgcmVuZGVyS2l0KTsgICAgICAgIAotICAgICAgICAKLSAgICAgICAgLy8gYWRkaXRpb25hbCBzZXR1cCBub3QgcHJvdmlkZWQgYXV0b21hdGljYWxseSBieSB0aGUgc2hhbGUgbW9jayBzdHVmZgotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25NYXAoKS5wdXQoTXlmYWNlc0NvbmZpZy5jbGFzcy5nZXROYW1lKCksIG5ldyBNeWZhY2VzQ29uZmlnKCkpOwotICAgICAgICB3cml0ZXIgPSBuZXcgTW9ja1Jlc3BvbnNlV3JpdGVyKG5ldyBTdHJpbmdXcml0ZXIoKSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5zZXRSZXNwb25zZVdyaXRlcih3cml0ZXIpOwotCi0gICAgICAgIFRlc3RVdGlscy5hZGREZWZhdWx0UmVuZGVyZXJzKGZhY2VzQ29udGV4dCk7Ci0gICAgICAgIFRlc3RVdGlscy5hZGREZWZhdWx0VmFsaWRhdG9ycyhmYWNlc0NvbnRleHQpOwotICAgICAgICAgICAgICAgIAotICAgICAgICBleHByZXNzaW9uRmFjdG9yeSA9IChNb2NrRXhwcmVzc2lvbkZhY3RvcnkpYXBwbGljYXRpb24uZ2V0RXhwcmVzc2lvbkZhY3RvcnkoKTsKLQotICAgICAgICAvL2V4ZWN1dGUgc3RhcnR1cCBsaXN0ZW5lcgotICAgICAgICBuZXcgRXh0VmFsU3RhcnR1cExpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlci5pbml0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0uaW5pdCgpOwotCi0gICAgICAgIG5ldyBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIoKS5pbml0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVhciBkb3duIHRoZSB0ZXN0IGVudmlyb25tZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYXBwbGljYXRpb24gPSBudWxsOwotICAgICAgICBjb25maWcgPSBudWxsOwotICAgICAgICBleHRlcm5hbENvbnRleHQgPSBudWxsOwotICAgICAgICBmYWNlc0NvbnRleHQucmVsZWFzZSgpOwotICAgICAgICBmYWNlc0NvbnRleHQgPSBudWxsOwotICAgICAgICBsaWZlY3ljbGUgPSBudWxsOwotICAgICAgICBsaWZlY3ljbGVGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgcmVuZGVyS2l0ID0gbnVsbDsKLSAgICAgICAgcmVxdWVzdCA9IG51bGw7Ci0gICAgICAgIHJlc3BvbnNlID0gbnVsbDsKLSAgICAgICAgc2VydmxldENvbnRleHQgPSBudWxsOwotICAgICAgICBzZXNzaW9uID0gbnVsbDsKLSAgICAgICAgRmFjdG9yeUZpbmRlci5yZWxlYXNlRmFjdG9yaWVzKCk7Ci0gICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHRocmVhZENvbnRleHRDbGFzc0xvYWRlcik7Ci0gICAgICAgIGV4cHJlc3Npb25GYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0Nyb3NzVmFsVmFsaWRhdGlvbigpCi0gICAgewotICAgICAgICBuZXcgQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcigpLmFmdGVyUGhhc2UobmV3IFBoYXNlRXZlbnQoKEZhY2VzQ29udGV4dClmYWNlc0NvbnRleHQsUGhhc2VJZC5BTllfUEhBU0UsbGlmZWN5Y2xlKSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrTWVzc2FnZUNvdW50KGludCBleHBlY3RlZCkKLSAgICB7Ci0gICAgICAgIGludCBhY3R1YWwgPSAwOwotICAgICAgICBmb3IoSXRlcmF0b3IgbWVzc2FnZXMgPSBmYWNlc0NvbnRleHQuZ2V0TWVzc2FnZXMoKTsgbWVzc2FnZXMuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgbWVzc2FnZXMubmV4dCgpOwotICAgICAgICAgICAgYWN0dWFsKys7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbXBsZXRlIG1lc3NhZ2UgY291bnQiLCBleHBlY3RlZCwgYWN0dWFsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja01lc3NhZ2VDb3VudChTdHJpbmcgY2xpZW50SWQsIGludCBleHBlY3RlZCkKLSAgICB7Ci0gICAgICAgIGludCBhY3R1YWwgPSAwOwotICAgICAgICBmb3IoSXRlcmF0b3IgbWVzc2FnZXMgPSBmYWNlc0NvbnRleHQuZ2V0TWVzc2FnZXMoY2xpZW50SWQpOyBtZXNzYWdlcy5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlcy5uZXh0KCk7Ci0gICAgICAgICAgICBhY3R1YWwrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydEVxdWFscygiQ29tcGxldGUgbWVzc2FnZSBjb3VudCIsIGV4cGVjdGVkLCBhY3R1YWwpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBWZXJpZnkgdGhlIGZvbGxvd2luZzoKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPmlkIGlzIG5vdCBudWxsPC9saT4KLSAgICAgKiA8bGk+UmVzcG9uc2UgaXMgY29tcGxldGU8L2xpPgotICAgICAqIDxsaT5SZXNwb25jZSBjb250YWlucyB0aGUgaWQ8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGlkIElEIHRvIHZlcmlmeQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydElkRXhpc3RzKFN0cmluZyBpZCkKLSAgICB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIklEIGlzIG5vdCBudWxsIiwgaWQpOwotICAgICAgICBhc3NlcnRUcnVlKCJSZXNwb25zZSBDb21wbGV0ZSIsIGZhY2VzQ29udGV4dC5nZXRSZXNwb25zZUNvbXBsZXRlKCkpOwotICAgICAgICBTdHJpbmcgb3V0cHV0ID0gd3JpdGVyLmdldFdyaXRlcigpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIkhhcyBvdXRwdXQiLCBvdXRwdXQpOwotICAgICAgICBhc3NlcnRUcnVlKCJDb250YWlucyBpZCAnIiArIGlkICsgIiciLCBvdXRwdXQuaW5kZXhPZihpZCkgIT0gLTEpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVZhbHVlQmluZGluZyhVSUlucHV0IHVpSW5wdXQsIFN0cmluZyBuYW1lLCBTdHJpbmcgZXhwcmVzc2lvbikKLSAgICB7Ci0gICAgICAgIFZhbHVlQmluZGluZyB2YWx1ZUJpbmRpbmcgPSBhcHBsaWNhdGlvbi5jcmVhdGVWYWx1ZUJpbmRpbmcoZXhwcmVzc2lvbik7Ci0gICAgICAgIFZhbHVlRXhwcmVzc2lvbiB2YWx1ZUV4cHJlc3Npb24gPSBleHByZXNzaW9uRmFjdG9yeS5jcmVhdGVWYWx1ZUV4cHJlc3Npb24oCi0gICAgICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RUxDb250ZXh0KCksIGV4cHJlc3Npb24sIE9iamVjdC5jbGFzcyk7Ci0KLSAgICAgICAgaWYodWlJbnB1dCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aUlucHV0LnNldFZhbHVlQmluZGluZyhuYW1lLCB2YWx1ZUJpbmRpbmcpOwotICAgICAgICAgICAgdWlJbnB1dC5zZXRWYWx1ZUV4cHJlc3Npb24obmFtZSwgdmFsdWVFeHByZXNzaW9uKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvQmFzZVZhbFRlc3RCZWFuLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL0Jhc2VWYWxUZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWRjOTIwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvQmFzZVZhbFRlc3RCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uRG91YmxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5QYXR0ZXJuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7Ci0KLS8qKgotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQotICovCi1wdWJsaWMgY2xhc3MgQmFzZVZhbFRlc3RCZWFuCi17Ci0gICAgQFJlcXVpcmVkCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICAKLSAgICBATGVuZ3RoKG1pbmltdW09MixtYXhpbXVtPTMpCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTE7Ci0gICAgCi0gICAgQFBhdHRlcm4oIltBLVpdW2Etel0rIikKLSAgICBwcml2YXRlIFN0cmluZyBwYXR0ZXJuTmFtZTsKLSAgICAKLSAgICBARG91YmxlUmFuZ2UobWluaW11bT0tMzAwZCkKLSAgICBwcml2YXRlIERvdWJsZSBkb3VibGVWYWx1ZTE7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lMSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmFtZTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZTEoU3RyaW5nIG5hbWUxKQotICAgIHsKLSAgICAgICAgdGhpcy5uYW1lMSA9IG5hbWUxOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0dGVybk5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBhdHRlcm5OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm5OYW1lKFN0cmluZyBwYXR0ZXJuTmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMucGF0dGVybk5hbWUgPSBwYXR0ZXJuTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG91YmxlIGdldERvdWJsZVZhbHVlMSgpCi0gICAgewotICAgICAgICByZXR1cm4gZG91YmxlVmFsdWUxOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERvdWJsZVZhbHVlMShEb3VibGUgZG91YmxlVmFsdWUxKQotICAgIHsKLSAgICAgICAgdGhpcy5kb3VibGVWYWx1ZTEgPSBkb3VibGVWYWx1ZTE7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9CYXNlVmFsVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvQmFzZVZhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwN2ExNjEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9CYXNlVmFsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlVmFsVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZQotewotCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudCA9IG51bGw7Ci0KLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOwotICAgIAotICAgIEJhc2VWYWxUZXN0QmVhbiBiZWFuID0gbnVsbDsKLQotICAgIHB1YmxpYyBCYXNlVmFsVGVzdENhc2UoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBudWxsOwotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsKLSAgICAgICAgYmVhbiA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEJhc2VWYWxUZXN0Q2FzZS5jbGFzcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBiZWFuID0gbmV3IEJhc2VWYWxUZXN0QmVhbigpOwotICAgICAgICBWYWx1ZUJpbmRpbmcgdmIgPSBhcHBsaWNhdGlvbi5jcmVhdGVWYWx1ZUJpbmRpbmcoIiN7dGVzdEJlYW59Iik7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucHV0KCJ0ZXN0QmVhbiIsIGJlYW4pOwotCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOwotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7Ci0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsKLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBuZXcgSHRtbElucHV0VGV4dCgpOwotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50KTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0SWQoImlucHV0MSIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBudWxsOwotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsKLSAgICAgICAgYmVhbiA9IG51bGw7ICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZVJlcXVpcmVkRmFpbCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZX0iKTsKLQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7Ci0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZTFMZW5naHRNYXhGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lMX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiMTIzNDUiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWUxTGVuZ2h0Q29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZTF9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lMUxlbmdodE1pbkZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWUxfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCJ4Iik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0dGVybk5hbWVGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wYXR0ZXJuTmFtZX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiUGV0ZXIxIik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0dGVybk5hbWVDb3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wYXR0ZXJuTmFtZX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiUGV0ZXIiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsKLSAgICB9ICAgIAotCi0gICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVZhbHVlRmFpbCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4uZG91YmxlVmFsdWUxfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCItMzAxIik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVWYWx1ZUNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLmRvdWJsZVZhbHVlMX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiMjAwIik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydFRydWUoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyMDBkLCBpbnB1dENvbXBvbmVudC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnVwZGF0ZU1vZGVsKGZhY2VzQ29udGV4dCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyMDBkLCBiZWFuLmdldERvdWJsZVZhbHVlMSgpKTsKLSAgICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0QmVhbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDhhZGM5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsKLQotLyoqCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlCi0gKi8KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbFRlc3RCZWFuCi17Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTE7Ci0gICAgCi0gICAgQEVxdWFscygicHJvcGVydHkxIikgICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkyOwotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eTE7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MShTdHJpbmcgcHJvcGVydHkxKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7Ci0gICAgfQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eTI7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGNhMGJjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlCi0gKi8KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbFRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UKLXsKLQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQxID0gbnVsbDsKLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MiA9IG51bGw7Ci0gICAgCi0gICAgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsKLSAgICAKLSAgICBwdWJsaWMgQ3Jvc3NWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBudWxsOwotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOwotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShDcm9zc1ZhbFRlc3RDYXNlLmNsYXNzKTsKLSAgICB9ICAgIAotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBDcm9zc1ZhbFRlc3RCZWFuIGJlYW4gPSBuZXcgQ3Jvc3NWYWxUZXN0QmVhbigpOwotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcobnVsbCwgInZhbHVlIiwgIiN7dGVzdEJlYW59Iik7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucHV0KCJ0ZXN0QmVhbiIsYmVhbik7Ci0gICAgICAgIAotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsKLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOwotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7Ci0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7ICAgICAgICAKLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbmV3IEh0bWxJbnB1dFRleHQoKTsKLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDEpOwotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0SWQoImlucHV0MSIpOwotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBuZXcgSHRtbElucHV0VGV4dCgpOwotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Mik7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRJZCgiaW5wdXQyIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsVmFsaWRhdGlvbigpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsKLQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc0ZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOwotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIjFkNCIpOwotICAgICAgICAKLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0gICAgICAgIAotCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbFZhbGlkYXRpb24oKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7Ci0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvbW9jay9FeHRWYWxNb2NrQXBwbGljYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNDQ1NDEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvbW9jay9FeHRWYWxNb2NrQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5tb2NrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0FwcGxpY2F0aW9uOwotCi1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0TGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguZWwuRUxSZXNvbHZlcjsKLWltcG9ydCBqYXZheC5lbC5FeHByZXNzaW9uRmFjdG9yeTsKLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqLwotcHVibGljIGNsYXNzIEV4dFZhbE1vY2tBcHBsaWNhdGlvbiBleHRlbmRzIE1vY2tBcHBsaWNhdGlvbgotewotICAgIHByaXZhdGUgQXBwbGljYXRpb24gd3JhcHBlZDsKLQotICAgIHB1YmxpYyBFeHRWYWxNb2NrQXBwbGljYXRpb24oKQotICAgIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXh0VmFsTW9ja0FwcGxpY2F0aW9uKEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKQotICAgIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gYXBwbGljYXRpb247Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVMQ29udGV4dExpc3RlbmVyW10gZ2V0RUxDb250ZXh0TGlzdGVuZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRUxDb250ZXh0TGlzdGVuZXJbMF07Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVMUmVzb2x2ZXIgZ2V0RUxSZXNvbHZlcigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkLmdldEVMUmVzb2x2ZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRXhwcmVzc2lvbkZhY3RvcnkgZ2V0RXhwcmVzc2lvbkZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxNb2NrRXhwcmVzc2lvbkZhY3RvcnkoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9tb2NrL0V4dFZhbE1vY2tBcHBsaWNhdGlvbkZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2YxNzk1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLm1vY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb25GYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRWYWxNb2NrQXBwbGljYXRpb25GYWN0b3J5IGV4dGVuZHMgTW9ja0FwcGxpY2F0aW9uRmFjdG9yeQotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBcHBsaWNhdGlvbiBnZXRBcHBsaWNhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEV4dFZhbE1vY2tBcHBsaWNhdGlvbihzdXBlci5nZXRBcHBsaWNhdGlvbigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9tb2NrL0V4dFZhbE1vY2tFeHByZXNzaW9uRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvbW9jay9FeHRWYWxNb2NrRXhwcmVzc2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU4OWNlMi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9tb2NrL0V4dFZhbE1vY2tFeHByZXNzaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLm1vY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QuZWwuTW9ja0V4cHJlc3Npb25GYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0OwotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqLwotcHVibGljIGNsYXNzIEV4dFZhbE1vY2tFeHByZXNzaW9uRmFjdG9yeSBleHRlbmRzIE1vY2tFeHByZXNzaW9uRmFjdG9yeQotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWYWx1ZUV4cHJlc3Npb24gY3JlYXRlVmFsdWVFeHByZXNzaW9uKEVMQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgZXhwcmVzc2lvbiwgQ2xhc3MgZXhwZWN0ZWRUeXBlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uKGV4cHJlc3Npb24sIGV4cGVjdGVkVHlwZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvbW9jay9FeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9tb2NrL0V4dFZhbE1vY2tWYWx1ZUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAzMzg3Ni4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfZHluYW1pY19jb21wb25lbnRfZmlsdGVycy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9tb2NrL0V4dFZhbE1vY2tWYWx1ZUV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IubW9jazsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkV4dFZhbEVMUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0LmVsLk1vY2tWYWx1ZUV4cHJlc3Npb247Ci0KLWltcG9ydCBqYXZheC5lbC5FTENvbnRleHQ7Ci1pbXBvcnQgamF2YXguZWwuRUxSZXNvbHZlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqLwotLy9UT0RPIGltcHJvdmUKLXB1YmxpYyBjbGFzcyBFeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uIGV4dGVuZHMgTW9ja1ZhbHVlRXhwcmVzc2lvbgotewotICAgIHByaXZhdGUgU3RyaW5nW10gZWxlbWVudHMgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIGV4cHJlc3Npb24gPSBudWxsOwotCi0gICAgcHVibGljIEV4dFZhbE1vY2tWYWx1ZUV4cHJlc3Npb24oU3RyaW5nIGV4cHJlc3Npb24sIENsYXNzIGV4cGVjdGVkVHlwZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKGV4cHJlc3Npb24sIGV4cGVjdGVkVHlwZSk7Ci0KLSAgICAgICAgaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJFeHByZXNzaW9uIHN0cmluZyBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKLSAgICAgICAgcGFyc2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKEVMQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgRUxSZXNvbHZlciByZXNvbHZlciA9IGNvbnRleHQuZ2V0RUxSZXNvbHZlcigpOwotCi0gICAgICAgIGlmIChyZXNvbHZlciBpbnN0YW5jZW9mIEV4dFZhbEVMUmVzb2x2ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRCYXNlKGNvbnRleHQsIHJlc29sdmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRWYWx1ZShjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShFTENvbnRleHQgY29udGV4dCwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKGNvbnRleHQuZ2V0RUxSZXNvbHZlcigpIGluc3RhbmNlb2YgRXh0VmFsRUxSZXNvbHZlcikKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC5nZXRFTFJlc29sdmVyKCkuc2V0VmFsdWUoY29udGV4dCwgZ2V0VmFsdWUoY29udGV4dCksIGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBiYXNlID0gZ2V0QmFzZShjb250ZXh0LCBjb250ZXh0LmdldEVMUmVzb2x2ZXIoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgc2V0dGVyID0gInNldCIgKyBjcmVhdGVQcm9wZXJ0eVN0cmluZygpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNZXRob2Qgc2V0dGVyTWV0aG9kID0gYmFzZS5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKHNldHRlciwgdmFsdWUgIT0gbnVsbCA/IHZhbHVlLmdldENsYXNzKCkgOiBPYmplY3QuY2xhc3MpOwotICAgICAgICAgICAgICAgIHNldHRlck1ldGhvZC5pbnZva2UoYmFzZSwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKEVMQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgYmFzZSA9IGdldEJhc2UoY29udGV4dCwgY29udGV4dC5nZXRFTFJlc29sdmVyKCkpOwotCi0gICAgICAgIGlmIChiYXNlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGdldHRlciA9ICJnZXQiICsgY3JlYXRlUHJvcGVydHlTdHJpbmcoKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTWV0aG9kIGdldHRlck1ldGhvZCA9IGJhc2UuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZChnZXR0ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiBnZXR0ZXJNZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwYXJzZSgpCi0gICAgewotCi0gICAgICAgIGlmIChpc0xpdGVyYWxUZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVsZW1lbnRzID0gbmV3IFN0cmluZ1swXTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHByZXNzaW9uLnN0YXJ0c1dpdGgoIiR7IikgfHwgZXhwcmVzc2lvbi5zdGFydHNXaXRoKCIjeyIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZXhwcmVzc2lvbi5lbmRzV2l0aCgifSIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExpc3QgbmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGV4cHIgPSBuZXcgU3RyaW5nQnVmZmVyKGV4cHJlc3Npb24uc3Vic3RyaW5nKDIsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKS5yZXBsYWNlQWxsKCIgIiwgIiIpKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzQmxvY2tPbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBleHByLmxlbmd0aCgpIC0gMTsgaSA+IC0xOyBpLS0pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXhwci5jaGFyQXQoaSkgPT0gJyAnKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHByLmRlbGV0ZUNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHByLmNoYXJBdChpKSA9PSAnXScpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZGVsZXRlQ2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4cHIuY2hhckF0KGkpID09ICdbJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhwci5kZWxldGVDaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhwci5jaGFyQXQoaSkgPT0gJ1wnJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Jsb2NrT24pCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwci5kZWxldGVDaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMuYWRkKDAsIGV4cHIuc3Vic3RyaW5nKGkgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwci5kZWxldGUoaSwgZXhwci5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc0Jsb2NrT24gPSAhaXNCbG9ja09uOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4cHIuY2hhckF0KGkpID09ICcuJyAmJiAhaXNCbG9ja09uKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lcy5hZGQoMCwgZXhwci5zdWJzdHJpbmcoaSArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZGVsZXRlKGksIGV4cHIubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChleHByLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZCgwLCBleHByLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGVsZW1lbnRzID0gKFN0cmluZ1tdKSBuYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbbmFtZXMuc2l6ZSgpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihleHByZXNzaW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXhwcmVzc2lvbik7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmFzZShFTENvbnRleHQgY29udGV4dCwgRUxSZXNvbHZlciByZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIE9iamVjdCBiYXNlID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGggLSAxOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJhc2UgPSByZXNvbHZlci5nZXRWYWx1ZShjb250ZXh0LCBiYXNlLCBlbGVtZW50c1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJhc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlUHJvcGVydHlTdHJpbmcoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gZWxlbWVudHNbZWxlbWVudHMubGVuZ3RoIC0gMV07Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHByb3BlcnR5LnN1YnN0cmluZygxLCBwcm9wZXJ0eS5sZW5ndGgoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9UZXN0VXRpbHMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19keW5hbWljX2NvbXBvbmVudF9maWx0ZXJzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvVGVzdFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMTdkZTMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX2R5bmFtaWNfY29tcG9uZW50X2ZpbHRlcnMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9UZXN0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWNlc0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGZpbmFsIGNsYXNzIFRlc3RVdGlscwotewotICAgIC8qKiBEZWZhdWx0IExvZ2dlciAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUZXN0VXRpbHMuY2xhc3MpOwotCi0gICAgLyoqIHV0aWxpdHkgY2xhc3MsIGRvIG5vdCBpbnN0YW50aWF0ZSAqLwotICAgIHByaXZhdGUgVGVzdFV0aWxzKCkKLSAgICB7Ci0gICAgICAgIC8vIHV0aWxpdHkgY2xhc3MsIGRpc2FibGUgaW5zdGFudGlhdGlvbgotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRGVmYXVsdFZhbGlkYXRvcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIGFkZFZhbGlkYXRvcihmYWNlc0NvbnRleHQsImphdmF4LmZhY2VzLkRvdWJsZVJhbmdlIiwgImphdmF4LmZhY2VzLnZhbGlkYXRvci5Eb3VibGVSYW5nZVZhbGlkYXRvciIpOwotICAgICAgICBhZGRWYWxpZGF0b3IoZmFjZXNDb250ZXh0LCJqYXZheC5mYWNlcy5MZW5ndGgiLCAiamF2YXguZmFjZXMudmFsaWRhdG9yLkxlbmd0aFZhbGlkYXRvciIpOwotICAgICAgICBhZGRWYWxpZGF0b3IoZmFjZXNDb250ZXh0LCJqYXZheC5mYWNlcy5Mb25nUmFuZ2UiLCAiamF2YXguZmFjZXMudmFsaWRhdG9yLkxvbmdSYW5nZVZhbGlkYXRvciIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkVmFsaWRhdG9yKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdG9ySWQsIFN0cmluZyB2YWxpZGF0b3JDbGFzcykKLSAgICB7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmFkZFZhbGlkYXRvcih2YWxpZGF0b3JJZCwgdmFsaWRhdG9yQ2xhc3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhbGwgb2YgSlNGIDEuMiBkZWZhdWx0IHJlbmRlcmVycy4gIEN1cnJlbnRseSB0aGlzIGlzIG5vdCB0aWVkIHRvIAotICAgICAqIGZhY2VzLWNvbmZpZy54bWwsIHNvIGFsbCBjaGFuZ2UgdG8gdGhlIGZpbGUgTVVTVCBhbHNvIGJlIG1hZGUgaGVyZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0Ci0gICAgICogQHRvZG8gRG8gbm90IGFkZCByZW5kZXJlciBpZiByZW5kZXJlciBpcyBhbHJlYWR5IGFkZGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGREZWZhdWx0UmVuZGVyZXJzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpCi0gICAgewotICAgICAgICAvLyBTdGFuZGFyZCBIVE1MIFJlbmRlcmVycwotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5Db21tYW5kIiwgImphdmF4LmZhY2VzLkJ1dHRvbiIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sQnV0dG9uUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RCb29sZWFuIiwKLSAgICAgICAgICAgICAgICAiamF2YXguZmFjZXMuQ2hlY2tib3giLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbENoZWNrYm94UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RNYW55IiwKLSAgICAgICAgICAgICAgICAiamF2YXguZmFjZXMuQ2hlY2tib3giLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbENoZWNrYm94UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5Gb3JtIiwgImphdmF4LmZhY2VzLkZvcm0iLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEZvcm1SZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlBhbmVsIiwgImphdmF4LmZhY2VzLkdyaWQiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEdyaWRSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlBhbmVsIiwgImphdmF4LmZhY2VzLkdyb3VwIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxHcm91cFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuSW5wdXQiLCAiamF2YXguZmFjZXMuSGlkZGVuIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxIaWRkZW5SZW5kZXJlciIpOwotICAgICAgICAKLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuR3JhcGhpYyIsICJqYXZheC5mYWNlcy5JbWFnZSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sSW1hZ2VSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5MYWJlbCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGFiZWxSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5MaW5rIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMaW5rUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5Db21tYW5kIiwgImphdmF4LmZhY2VzLkxpbmsiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbExpbmtSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkxpc3Rib3giLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbExpc3Rib3hSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE1hbnkiLAotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5MaXN0Ym94IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMaXN0Ym94UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RPbmUiLCAiamF2YXguZmFjZXMuTWVudSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTWVudVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0TWFueSIsICJqYXZheC5mYWNlcy5NZW51IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxNZW51UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5NZXNzYWdlIiwgImphdmF4LmZhY2VzLk1lc3NhZ2UiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lc3NhZ2VSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5Gb3JtYXQiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEZvcm1hdFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuTWVzc2FnZXMiLAotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5NZXNzYWdlcyIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTWVzc2FnZXNSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsICJqYXZheC5mYWNlcy5SYWRpbyIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sUmFkaW9SZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLklucHV0IiwgImphdmF4LmZhY2VzLlNlY3JldCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sU2VjcmV0UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5EYXRhIiwgImphdmF4LmZhY2VzLlRhYmxlIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxUYWJsZVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuSW5wdXQiLCAiamF2YXguZmFjZXMuVGV4dGFyZWEiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFRleHRhcmVhUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5UZXh0IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxUZXh0UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5PdXRwdXQiLCAiamF2YXguZmFjZXMuVGV4dCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGV4dFJlbmRlcmVyIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgcmVuZGVyZXIgdG8gdGhlIEZhY2VzQ29udGV4dC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IEZhY2VzIENvbnRleHQKLSAgICAgKiBAcGFyYW0gZmFtaWx5IENvbXBvbmVuZXQgRmFtaWx5Ci0gICAgICogQHBhcmFtIHJlbmRlcmVyVHlwZSBDb21wb25lbnQgVHlwZQotICAgICAqIEBwYXJhbSByZW5kZXJDbGFzc05hbWUgQ2xhc3MgTmFtZSBvZiBSZW5kZXJlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRSZW5kZXJlcihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgZmFtaWx5LAotICAgICAgICAgICAgU3RyaW5nIHJlbmRlcmVyVHlwZSwgU3RyaW5nIHJlbmRlckNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyIHJlbmRlcmVyID0gKGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcikgbmV3SW5zdGFuY2UocmVuZGVyQ2xhc3NOYW1lKTsKLSAgICAgICAgUmVuZGVyS2l0IGtpdCA9IGZhY2VzQ29udGV4dC5nZXRSZW5kZXJLaXQoKTsKLSAgICAgICAga2l0LmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCByZW5kZXJlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJpZXMgYSBDbGFzcy5sb2FkQ2xhc3Mgd2l0aCB0aGUgY29udGV4dCBjbGFzcyBsb2FkZXIgb2YgdGhlIGN1cnJlbnQgdGhyZWFkIGZpcnN0IGFuZAotICAgICAqIGF1dG9tYXRpY2FsbHkgZmFsbHMgYmFjayB0byB0aGUgQ2xhc3NVdGlscyBjbGFzcyBsb2FkZXIgKGkuZS4gdGhlIGxvYWRlciBvZiB0aGUKLSAgICAgKiBteWZhY2VzLmphciBsaWIpIGlmIG5lY2Vzc2FyeS4KLSAgICAgKiAKLSAgICAgKiBOb3RlOiBUaGlzIHdhcyBjb3BpZWQgZnJvbSBvcmcuYXBhY2hlLm15ZmFjZXMuc2hhcmVkLnV0aWwuQ2xhc3NVdGlscwotICAgICAqCi0gICAgICogQHBhcmFtIHR5cGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBub24tcHJpbWl0aXZlIG5vbi1hcnJheSBjbGFzcwotICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgQ2xhc3MKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHR5cGUgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGNsYXNzRm9yTmFtZShTdHJpbmcgdHlwZSkKLSAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAodHlwZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0eXBlIik7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUcnkgV2ViQXBwIENsYXNzTG9hZGVyIGZpcnN0Ci0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZSh0eXBlLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwCi0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlnbm9yZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZmFsbGJhY2s6IFRyeSBDbGFzc0xvYWRlciBmb3IgQ2xhc3NVdGlscyAoaS5lLiB0aGUgbXlmYWNlcy5qYXIgbGliKQotICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUodHlwZSwgZmFsc2UsIC8vIGRvIG5vdCBpbml0aWFsaXplIGZvciBmYXN0ZXIgc3RhcnR1cAotICAgICAgICAgICAgICAgICAgICBUZXN0VXRpbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYW1lIGFzIHtAbGluayAjY2xhc3NGb3JOYW1lKFN0cmluZyl9LCBidXQgdGhyb3dzIGEgUnVudGltZUV4Y2VwdGlvbgotICAgICAqIChGYWNlc0V4Y2VwdGlvbikgaW5zdGVhZCBvZiBhIENsYXNzTm90Rm91bmRFeGNlcHRpb24uCi0gICAgICoKLSAgICAgKiBOb3RlOiBUaGlzIHdhcyBjb3BpZWQgZnJvbSBvcmcuYXBhY2hlLm15ZmFjZXMuc2hhcmVkLnV0aWwuQ2xhc3NVdGlscwotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBDbGFzcwotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdHlwZSBpcyBudWxsCi0gICAgICogQHRocm93cyBGYWNlc0V4Y2VwdGlvbiBpZiBjbGFzcyBub3QgZm91bmQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBzaW1wbGVDbGFzc0Zvck5hbWUoU3RyaW5nIHR5cGUpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNsYXNzRm9yTmFtZSh0eXBlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIkNsYXNzICIgKyB0eXBlICsgIiBub3QgZm91bmQiLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBGYWNlc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3Mgd2l0aCB0aGUgdHlwZSBvZiA8Y29kZT50eXBlPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBOb3RlOiBUaGlzIHdhcyBjb3BpZWQgZnJvbSBvcmcuYXBhY2hlLm15ZmFjZXMuc2hhcmVkLnV0aWwuQ2xhc3NVdGlscwotICAgICAqCi0gICAgICogQHBhcmFtIHR5cGUgVHlwZSBvZiBuZXcgY2xhc3MuCi0gICAgICogQHJldHVybiBJbnN0YW5jZSBvZiB0aGUgY2xhc3MgPGNvZGU+dHlwZTwvY29kZT4KLSAgICAgKiBAdGhyb3dzIEZhY2VzRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyB0eXBlKSB0aHJvd3MgRmFjZXNFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKHNpbXBsZUNsYXNzRm9yTmFtZSh0eXBlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyA8Y29kZT5jbGF6ejwvY29kZT4uCi0gICAgICogCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGF6eiBDbGFzcyB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YuCi0gICAgICogQHJldHVybiBJbnN0YW5jZSBvZiB0aGUgY2xhc3MgPGNvZGU+Y2xheno8L2NvZGU+Ci0gICAgICogQHRocm93cyBGYWNlc0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShDbGFzcyBjbGF6eikgdGhyb3dzIEZhY2VzRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ2xhc3MgOiAiICsgY2xhenouZ2V0TmFtZSgpICsgIiBub3QgZm91bmQuIiwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBGYWNlc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVuZGVyZXJlZCBhIGNvbXBvbmVudCwgaW5jbHVkaW5nIGl0J3MgY2hpbGRyZW4sIHRoZW4gY29tcGxldGUgdGhlIHJlcG9uc2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRleHQgRmFjZXMgQ29udGV4dAotICAgICAqIEBwYXJhbSBjb21wb25lbnQgQ29tcG9uZW50IHRvIGJlIHJlbmRlcmVkLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gVGhyb3duIHdoaWxlIHJlbmRlcmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVuZGVyQ29tcG9uZW50KEZhY2VzQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgVUlDb21wb25lbnQgY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyIHJlbmRlcmVyID0gY29udGV4dC5nZXRSZW5kZXJLaXQoKS5nZXRSZW5kZXJlcigKLSAgICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0RmFtaWx5KCksIGNvbXBvbmVudC5nZXRSZW5kZXJlclR5cGUoKSk7Ci0gICAgICAgIHJlbmRlcmVyLmVuY29kZUJlZ2luKGNvbnRleHQsIGNvbXBvbmVudCk7Ci0gICAgICAgIHJlbmRlcmVyLmVuY29kZUNoaWxkcmVuKGNvbnRleHQsIGNvbXBvbmVudCk7Ci0gICAgICAgIHJlbmRlcmVyLmVuY29kZUVuZChjb250ZXh0LCBjb21wb25lbnQpOwotICAgICAgICBjb250ZXh0LnJlc3BvbnNlQ29tcGxldGUoKTsKLSAgICAgICAgY29udGV4dC5yZW5kZXJSZXNwb25zZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2Fzc2VtYmx5L3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9hc3NlbWJseS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGZkMmEwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2Fzc2VtYmx5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYXNzZW1ibHkxMjwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEFzc2VtYmx5PC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5NeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEFzc2VtYmx5IGlzIHVzZWQgdG8gZ2VuZXJhdGUgCi0gICAgLnppcCBhbmQgLnRhci5neiBkaXN0cmlidXRpb25zIDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9hc3NlbWJseTwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2Fzc2VtYmx5PC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9hc3NlbWJseTwvdXJsPgotICAgIDwvc2NtPgotICAgIAotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRlcGVuZGVuY3ktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktamF2YWRvYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZW5lcmljLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9qYXZhZG9jPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktc291cmNlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y29yZS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3NyYzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tIEVYRUNVVEUgbXZuIHBhY2thZ2UgdG8gZ2VuZXJhdGUgYXNzZW1ibHkgZmlsZXMgLS0+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfc3JjPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsMTItJHt2ZXJzaW9ufS1zcmM8L2ZpbmFsTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfYmluPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+JHtiYXNlZGlyfS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwxMi0ke3ZlcnNpb259LWJpbjwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L291dDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmF0dGFjaGVkPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y29yZS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPCEtLSBTaW5jZSBleHR2YWwgY291bGQgYmUgYXN5bmMgcmVsZWFzZWQsIGFuIGdlbmVyYXRlZCBhc3NlbWJseSBjb3VsZCBjb250YWluIGRpZmZlcmVudAotICAgICAgICAgYXJ0aWZhY3QgdmVyc2lvbnMgLS0+Ci0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxjb3JlLnZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L2NvcmUudmVyc2lvbj4KLSAgICAgICAgPHRyaW5pZGFkLXN1cHBvcnQudmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9uPgotICAgICAgICA8Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9uPgotICAgICAgICA8cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC9wcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2Nzk1Yi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPmNvcmViaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAJPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+UkVBRE1FKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+TElDRU5TRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPk5PVElDRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPlJFTEVBU0UqPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9qYXZhZG9jPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmphdmFkb2M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3Jlc3JjLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTE4NmM2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+Y29yZXNyYzwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPiAgCi0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAJPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+UkVBRE1FKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+TElDRU5TRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPk5PVElDRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPlJFTEVBU0UqPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+ICAgCi0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9zcmM8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+c3JjPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgotIApkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDViM2E1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5YmRiMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IKLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzk5MWM1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGU8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+Y2dsaWI8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2dsaWI8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4xXzM8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgPC9yZXNvdXJjZXM+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODQ2M2U2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiDQotICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjIiPg0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPg0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnN0YXJ0dXAuR2VuZXJpY01vZHVsZVN0YXJ0dXBMaXN0ZW5lcg0KLSAgICAgICAgPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJLaXQuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NzQ3MDguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcktpdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi0NCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZEludGVyY2VwdG9yOw0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuRW5oYW5jZXI7DQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RQcm94eTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxHZW5lcmljUmVuZGVyS2l0IGV4dGVuZHMgRXh0VmFsUmVuZGVyS2l0IGltcGxlbWVudHMgTWV0aG9kSW50ZXJjZXB0b3INCi17DQotICAgIHB1YmxpYyBzdGF0aWMgUmVuZGVyS2l0IG5ld0luc3RhbmNlKFJlbmRlcktpdCByZW5kZXJLaXQpDQotICAgIHsNCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IHJlbmRlcktpdC5nZXRDbGFzcygpOw0KLQ0KLSAgICAgICAgLy9pdCdzIG5vdCBwb3NzaWJsZSB0byB3cmFwIHRoZSBjb252ZXJ0ZXIgYWdhaW4gLSBvY2N1cnMgZS5nLiB1bmRlciBzb2xhcmlzICsgYmVhIHdlYmxvZ2ljDQotICAgICAgICBpZiAoY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRFbmhhbmNlckJ5Q0dMSUIkJCIpDQotICAgICAgICAgICAgfHwgY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRGYXN0Q2xhc3NCeUNHTElCJCQiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRW5oYW5jZXIgZW5oYW5jZXIgPSBuZXcgRW5oYW5jZXIoKTsNCi0gICAgICAgIGVuaGFuY2VyLnNldFN1cGVyY2xhc3MocmVuZGVyS2l0LmdldENsYXNzKCkpOw0KLSAgICAgICAgZW5oYW5jZXIuc2V0Q2FsbGJhY2sobmV3IEV4dFZhbEdlbmVyaWNSZW5kZXJLaXQocmVuZGVyS2l0KSk7DQotICAgICAgICBlbmhhbmNlci5zZXRDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsNCi0NCi0gICAgICAgIHJldHVybiAoUmVuZGVyS2l0KSBlbmhhbmNlci5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGludGVyY2VwdChPYmplY3Qgb2JqLCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzLCBNZXRob2RQcm94eSBwcm94eSkgdGhyb3dzIFRocm93YWJsZQ0KLSAgICB7DQotICAgICAgICBpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0UmVuZGVyZXIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZXIoKFN0cmluZylhcmdzWzBdLCAoU3RyaW5nKWFyZ3NbMV0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiYWRkUmVuZGVyZXIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRSZW5kZXJlcigoU3RyaW5nKWFyZ3NbMF0sIChTdHJpbmcpYXJnc1sxXSwgKFJlbmRlcmVyKWFyZ3NbMl0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBwcm94eS5pbnZva2VTdXBlcihvYmosIGFyZ3MpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEV4dFZhbEdlbmVyaWNSZW5kZXJLaXQoUmVuZGVyS2l0IHdyYXBwZWQpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKHdyYXBwZWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgY3JlYXRlV3JhcHBlcihSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIubmV3SW5zdGFuY2UocmVuZGVyZXIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTVkNGI3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyV3JhcHBlcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZEludGVyY2VwdG9yOwotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5FbmhhbmNlcjsKLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kUHJveHk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBmaW5hbCBjbGFzcyBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyIGV4dGVuZHMgRXh0VmFsUmVuZGVyZXJXcmFwcGVyIGltcGxlbWVudHMgTWV0aG9kSW50ZXJjZXB0b3IKLXsKLSAgICBwdWJsaWMgc3RhdGljIFJlbmRlcmVyIG5ld0luc3RhbmNlKFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gcmVuZGVyZXIuZ2V0Q2xhc3MoKTsKLQotICAgICAgICAvL3RvIGF2b2lkIHJlLXdyYXBwaW5nIC0gb2NjdXJzIGUuZy4gdW5kZXIgc29sYXJpcyArIGJlYSB3ZWJsb2dpYwotICAgICAgICBpZiAoY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRFbmhhbmNlckJ5Q0dMSUIkJCIpIHx8Ci0gICAgICAgICAgICBjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCIkJEZhc3RDbGFzc0J5Q0dMSUIkJCIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBFbmhhbmNlciBlbmhhbmNlciA9IG5ldyBFbmhhbmNlcigpOwotICAgICAgICBlbmhhbmNlci5zZXRTdXBlcmNsYXNzKHJlbmRlcmVyLmdldENsYXNzKCkpOwotICAgICAgICBlbmhhbmNlci5zZXRDYWxsYmFjayhuZXcgRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlcihyZW5kZXJlcikpOwotICAgICAgICBlbmhhbmNlci5zZXRDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLQotICAgICAgICByZXR1cm4gKFJlbmRlcmVyKSBlbmhhbmNlci5jcmVhdGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGludGVyY2VwdChPYmplY3Qgb2JqLCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzLCBNZXRob2RQcm94eSBwcm94eSkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJnZXRDb252ZXJ0ZWRWYWx1ZSIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldENvbnZlcnRlZFZhbHVlKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0sIGFyZ3NbMl0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJkZWNvZGUiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlY29kZSgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZW5jb2RlQmVnaW4iKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZUJlZ2luKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJlbmNvZGVDaGlsZHJlbiIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlQ2hpbGRyZW4oKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImVuY29kZUVuZCIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlRW5kKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJjb252ZXJ0Q2xpZW50SWQiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29udmVydENsaWVudElkKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFN0cmluZylhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0UmVuZGVyc0NoaWxkcmVuIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRSZW5kZXJzQ2hpbGRyZW4oKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibWV0aG9kICIgKyBtZXRob2QuZ2V0TmFtZSgpICsgIiBjYWxsZWQgd2l0aG91dCByZW5kZXJpbmctaW50ZXJjZXB0b3JzIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBwcm94eS5pbnZva2VTdXBlcihvYmosIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyKFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgewotICAgICAgICBzdXBlcih3cmFwcGVkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOTE3ZTYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0dlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkNCi17DQotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImV4dHZhbCByZW5kZXJraXQgd3JhcHBlciBjcmVhdGVkIGZvciAiICsgcmVuZGVyS2l0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB2aWEgY2dsaWIiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBFeHRWYWxHZW5lcmljUmVuZGVyS2l0Lm5ld0luc3RhbmNlKHJlbmRlcktpdCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9zdGFydHVwL0dlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU3MzMxNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9zdGFydHVwL0dlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0LkdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEdlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDM5MjE1NjAzMjg3NzUxOTU1Nkw7DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jbGFzcykuYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkobmV3IEdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU5YThlOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGUNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGUgcHJvdmlkZXMgZ2VuZXJpYyBTdXBwb3J0IGZvciBKU0YgY29tcG9uZW50IGZyYW1ld29ya3Mgd2hpY2ggaGF2ZSBzcGVjaWFsIHJlcXVpcmVtZW50cyAoZS5nLiBSaWNoRmFjZXMsIE15RmFjZXMgVG9iYWdvLCAuLi4pLg0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS4xLnggYW5kIEpTRiAxLjIueC4gQm90aCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGYyMGMxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotDQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQ29tcG9uZW50LVN1cHBvcnQgTW9kdWxlczwvbmFtZT4NCi0gICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxzY20+DQotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9jb21wb25lbnQtc3VwcG9ydDwvY29ubmVjdGlvbj4NCi0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9jb21wb25lbnQtc3VwcG9ydDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4NCi0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvbXBvbmVudC1zdXBwb3J0PC91cmw+DQotICAgIDwvc2NtPg0KLQ0KLSAgICA8bW9kdWxlcz4NCi0gICAgICAgIDxtb2R1bGU+dHJpbmlkYWQtc3VwcG9ydDwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5nZW5lcmljLXN1cHBvcnQ8L21vZHVsZT4NCi0gICAgPC9tb2R1bGVzPg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPHByb3BlcnRpZXM+DQotICAgICAgICA8dHJpbmlkYWQudmVyc2lvbj4xLjIuOTwvdHJpbmlkYWQudmVyc2lvbj4NCi0gICAgPC9wcm9wZXJ0aWVzPg0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYzFiM2MuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgVHJpbmlkYWQgU3VwcG9ydCBNb2R1bGU8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cmVzb3VyY2VzPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICA8L3Jlc291cmNlcz4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk4YjJiYi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+DQotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0YXJ0dXAuVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXINCi0gICAgICAgIDwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLQ0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPg0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyDQotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUwZWI2OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkNsaWVudFZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotLyoqDQotICogaW4gY2FzZSBvZiBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIGEgdHJpbmlkYWQgY2xpZW50IHZhbGlkYXRvciBpcyBhZGRlZCB0byB0aGUgY29tcG9uZW50IGJhc2VkIG9uIHRoZSBtZXRhLWRhdGEuDQotICogYXQgdGhlIHBvc3RiYWNrOiB0aGUgZXh0dmFsIHZhbGlkYXRpb24gc3RyYXRlZ3kgZ2V0cyBjYWxsZWQgYW5kIGFmdGVyIHRoYXQgdGhlIGFkZGVkIHZhbGlkYXRvci4NCi0gKiB0aGlzIHdyYXBwZXIgcHJldmVudHMgc3VjaCBhIHNlcnZlci1zaWRlIGRvdWJsZSB2YWxpZGF0aW9uLg0KLSAqIGl0IGp1c3QgZGVsZWdhdGVzIHRoZSBjbGllbnQtc2lkZSBmdW5jdGlvbmFsaXR5Lg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyIGltcGxlbWVudHMgVmFsaWRhdG9yLCBDbGllbnRWYWxpZGF0b3IsIFNlcmlhbGl6YWJsZQ0KLXsNCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgQ2xpZW50VmFsaWRhdG9yIHdyYXBwZWQ7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE0MTQ1NDc4NDE3MDA2MjE0MTBMOw0KLQ0KLSAgICBwdWJsaWMgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKENsaWVudFZhbGlkYXRvciBjbGllbnRWYWxpZGF0b3IpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IGNsaWVudFZhbGlkYXRvcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCB2YWxpZGF0ZSAtIHRoZSBleHR2YWwgdmFsaWRhdGlvbiBzdHJhdGVneSB3aWxsIGRvIHRoYXQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudExpYnJhcnlTb3VyY2UoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q2xpZW50TGlicmFyeVNvdXJjZShmYWNlc0NvbnRleHQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0Q2xpZW50SW1wb3J0TmFtZXMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRDbGllbnRJbXBvcnROYW1lcygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50U2NyaXB0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRDbGllbnRTY3JpcHQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRDbGllbnRWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YzM0MzUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQuRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLlRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSB0aGlzIHBoYXNlLWxpc3RlbmVyIGluc3RlYWQgb2YgYSBFeHRWYWxUcmluaWRhZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGR1ZSB0byBhIHRyaW5pZGFkIGlzc3VlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gOTEwOTcyMTgzMTg2NDE0NjE2NUw7DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MsIFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpDQotICAgICAgICAgICAgICAgIC5yb2xsYmFjaygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnkgPSBnZXRSZW5kZXJLaXRGYWN0b3J5KCk7DQotDQotICAgICAgICBTdHJpbmcgcmVuZGVyS2l0SWQgPSBnZXRSZW5kZXJLaXRJZChmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgaWYoaXNJbmNvbXBhdGlibGVSZW5kZXJLaXQocmVuZGVyS2l0SWQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoYW5nZVJlbmRlcktpdChmYWNlc0NvbnRleHQsIHJlbmRlcktpdEZhY3RvcnksIHJlbmRlcktpdElkKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRSZW5kZXJLaXRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZ2V0UmVuZGVyS2l0SWQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFJlbmRlcktpdEZhY3RvcnkgZ2V0UmVuZGVyS2l0RmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoUmVuZGVyS2l0RmFjdG9yeSkNCi0gICAgICAgICAgICBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRmFjdG9yeUZpbmRlci5SRU5ERVJfS0lUX0ZBQ1RPUlkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0luY29tcGF0aWJsZVJlbmRlcktpdChTdHJpbmcgcmVuZGVyS2l0SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAhRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuSUQuZXF1YWxzKHJlbmRlcktpdElkKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgY2hhbmdlUmVuZGVyS2l0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFJlbmRlcktpdEZhY3RvcnkgcmVuZGVyS2l0RmFjdG9yeSwgU3RyaW5nIHJlbmRlcktpdElkKQ0KLSAgICB7DQotICAgICAgICBSZW5kZXJLaXQgcmVuZGVyS2l0ID0gcmVuZGVyS2l0RmFjdG9yeS5nZXRSZW5kZXJLaXQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCByZW5kZXJLaXRJZCk7DQotICAgICAgICByZW5kZXJLaXRGYWN0b3J5LmFkZFJlbmRlcktpdChFeHRWYWxUcmluaWRhZFJlbmRlcktpdC5JRCwgbmV3IEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0KHJlbmRlcktpdCkpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuc2V0UmVuZGVyS2l0SWQoRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuSUQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5SRU5ERVJfUkVTUE9OU0U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMGNiNzQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFyZW4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICAvKg0KLSAgICAgKiBkZWFjdGl2YXRlDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfQ0xJRU5UX1NJREVfVFJJTklEQURfVkFMSURBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9DTElFTlRfU0lERV9UUklOSURBRF9WQUxJREFUSU9OIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9UUklOSURBRF9DT1JFX09VVFBVVF9MQUJFTF9JTklUSUFMSVpBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9UUklOSURBRF9DT1JFX09VVFBVVF9MQUJFTF9JTklUSUFMSVpBVElPTiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfVFJJTklEQURfVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfVFJJTklEQURfVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IiKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvRG91YmxlUmFuZ2VJbml0aWFsaXplci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvRG91YmxlUmFuZ2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTAwMGUzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0RvdWJsZVJhbmdlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5Eb3VibGVSYW5nZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkNsaWVudFZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJza2lwVmFsaWRhdGlvblN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24iKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIERvdWJsZVJhbmdlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW5mb3JtYXRpb25BZGRlZCA9IGZhbHNlOwotICAgICAgICBEb3VibGVSYW5nZVZhbGlkYXRvciBkb3VibGVSYW5nZVZhbGlkYXRvciA9IChEb3VibGVSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRG91YmxlUmFuZ2UiKTsKLQotICAgICAgICBPYmplY3QgbWluID0gbnVsbDsKLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU5fREVGQVVMVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOX0RFRkFVTFQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWluIGluc3RhbmNlb2YgRG91YmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKChEb3VibGUpbWluKTsKLSAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IG1heCA9IG51bGw7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWF9ERUZBVUxUKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1heCBpbnN0YW5jZW9mIERvdWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bSgoRG91YmxlKW1heCk7Ci0gICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGluZm9ybWF0aW9uQWRkZWQgJiYKLSAgICAgICAgICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvciBpbnN0YW5jZW9mIENsaWVudFZhbGlkYXRvciAmJiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpZG91YmxlUmFuZ2VWYWxpZGF0b3IpKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9MZW5ndGhJbml0aWFsaXplci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUyNmM4Zi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9MZW5ndGhJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBMZW5ndGhJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7Ci0gICAgICAgIC8vVE9ETwotICAgICAgICBMZW5ndGhWYWxpZGF0b3IgbGVuZ3RoVmFsaWRhdG9yID0gKExlbmd0aFZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTGVuZ3RoIik7Ci0KLSAgICAgICAgT2JqZWN0IG1pbkxlbmd0aCA9IG51bGw7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWluTGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIX0RFRkFVTFQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW5MZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEhfREVGQVVMVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtaW5MZW5ndGggaW5zdGFuY2VvZiBJbnRlZ2VyKQotICAgICAgICB7Ci0gICAgICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWluaW11bSgoSW50ZWdlciltaW5MZW5ndGgpOwotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbnVsbDsKLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEhfREVGQVVMVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heExlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSF9ERUZBVUxUKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1heExlbmd0aCBpbnN0YW5jZW9mIEludGVnZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudC5nZXRDbGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0TWF4aW11bUxlbmd0aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludC5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhMZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWF4aW11bSgoSW50ZWdlciltYXhMZW5ndGgpOwotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3JlSW5pdFZhbGlkYXRvcnMoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQsIG1ldGFEYXRhKTsgLy9zZWFyY2ggd3JhcHBlcnMgYW5kIGNhbGwgLmRlYWN0aXZhdGUKLQotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkICYmIGxlbmd0aFZhbGlkYXRvciBpbnN0YW5jZW9mIENsaWVudFZhbGlkYXRvcikKLSAgICAgICAgewotICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKWxlbmd0aFZhbGlkYXRvcikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobGVuZ3RoVmFsaWRhdG9yLmdldE1pbmltdW0oKSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgoQ29yZU91dHB1dExhYmVsKXVpQ29tcG9uZW50KS5zZXRTaG93UmVxdWlyZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xvbmdSYW5nZUluaXRpYWxpemVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Mb25nUmFuZ2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzllZWI4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xvbmdSYW5nZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuTG9uZ1JhbmdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgTG9uZ1JhbmdlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW5mb3JtYXRpb25BZGRlZCA9IGZhbHNlOwotICAgICAgICBMb25nUmFuZ2VWYWxpZGF0b3IgbG9uZ1JhbmdlVmFsaWRhdG9yID0gKExvbmdSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTG9uZ1JhbmdlIik7Ci0KLSAgICAgICAgT2JqZWN0IG1pbiA9IG51bGw7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pKQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOX0RFRkFVTFQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxUKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1pbiBpbnN0YW5jZW9mIExvbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKChMb25nKW1pbik7Ci0gICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBtYXggPSBudWxsOwotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4ID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWF9ERUZBVUxUKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4ID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVhfREVGQVVMVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtYXggaW5zdGFuY2VvZiBMb25nKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bSgoTG9uZyltYXgpOwotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkICYmCi0gICAgICAgICAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yIGluc3RhbmNlb2YgQ2xpZW50VmFsaWRhdG9yICYmIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikKLSAgICAgICAgewotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKWxvbmdSYW5nZVZhbGlkYXRvcikpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1BhdHRlcm5Jbml0aWFsaXplci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZjA4OGQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuUmVnRXhwVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgUGF0dGVybkluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZighbWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4pKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBwYXR0ZXJucyA9IChTdHJpbmdbXSltZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4pOwotCi0gICAgICAgIFJlZ0V4cFZhbGlkYXRvciByZWdFeHBWYWxpZGF0b3I7Ci0KLSAgICAgICAgZm9yKFN0cmluZyBwYXR0ZXJuIDogcGF0dGVybnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZ0V4cFZhbGlkYXRvciA9IChSZWdFeHBWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5SZWdFeHAiKTsKLQotICAgICAgICAgICAgcmVnRXhwVmFsaWRhdG9yLnNldFBhdHRlcm4ocGF0dGVybik7Ci0gICAgICAgICAgICByZWdFeHBWYWxpZGF0b3Iuc2V0TWVzc2FnZURldGFpbE5vTWF0Y2goKFN0cmluZyltZXRhRGF0YS5nZXQoCi0gICAgICAgICAgICAgICAgQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFKSk7Ci0KLSAgICAgICAgICAgIGlmKHJlZ0V4cFZhbGlkYXRvciBpbnN0YW5jZW9mIENsaWVudFZhbGlkYXRvciAmJiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpcmVnRXhwVmFsaWRhdG9yKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUmVxdWlyZWRJbml0aWFsaXplci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUmVxdWlyZWRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjNmOTg3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1JlcXVpcmVkSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudXRpbC5UcmluaWRhZFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIFJlcXVpcmVkSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCF2YWxpZGF0ZUVtcHR5RmllbGRzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkgfHwKLSAgICAgICAgICAgbWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQpfHwKLSAgICAgICAgICAgbWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCgKLSAgICAgICAgICAgICAgICAgKCFCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkgJiYKLSAgICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCkpKSB8fAotICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSkKLSAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMoaXNDb21wb25lbnRSZXF1aXJlZCh1aUNvbXBvbmVudCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgQ29yZU91dHB1dExhYmVsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChDb3JlT3V0cHV0TGFiZWwpdWlDb21wb25lbnQpLnNldFNob3dSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpICYmCi0gICAgICAgICAgICAgICAgICAgIUJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIENvcmVPdXRwdXRMYWJlbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgoQ29yZU91dHB1dExhYmVsKXVpQ29tcG9uZW50KS5zZXRTaG93UmVxdWlyZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVFbXB0eUZpZWxkcygpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMudmFsaWRhdGVFbXB0eUZpZWxkcygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBCb29sZWFuIGlzQ29tcG9uZW50UmVxdWlyZWQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIENvcmVPdXRwdXRMYWJlbCkKLSAgICAgICAgewotICAgICAgICAgICAgdWlDb21wb25lbnQgPSBUcmluaWRhZFV0aWxzLmZpbmRMYWJlbGVkRWRpdGFibGVDb21wb25lbnQoKENvcmVPdXRwdXRMYWJlbCkgdWlDb21wb25lbnQpOwotCi0gICAgICAgICAgICBpZih1aUNvbXBvbmVudCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy9jb21wYXJlIHdpdGggZmFsc2Ugc28gdHJ1ZSA9IHRydWUgb3IgbnVsbAotICAgICAgICBib29sZWFuIGlzUmVhZE9ubHkgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzUmVhZE9ubHkiKSkpOwotICAgICAgICBib29sZWFuIGlzRGlzYWJsZWQgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzRGlzYWJsZWQiKSkpOwotCi0gICAgICAgIHJldHVybiAhKGlzUmVhZE9ubHkgfHwgaXNEaXNhYmxlZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODYwYWI1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1RyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UuVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb250ZXh0LlJlcXVlc3RDb250ZXh0OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUuaW5wdXQuQ29yZUlucHV0VGV4dCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUuaW5wdXQuQ29yZUlucHV0RGF0ZSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXI+IGNvbXBvbmVudEluaXRpYWxpemVycyA9Ci0gICAgICAgIG5ldyBBcnJheUxpc3Q8VHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcj4oKTsKLQotICAgIHN0YXRpYwotICAgIHsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgUmVxdWlyZWRJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgTGVuZ3RoSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IExvbmdSYW5nZUluaXRpYWxpemVyKCkpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBEb3VibGVSYW5nZUluaXRpYWxpemVyKCkpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBQYXR0ZXJuSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIC8vY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgVmFsaWRhdG9ySW5pdGlhbGl6ZXIoKSk7Ci0gICAgfQotCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gImNoZWNrIHBwciBpc3N1ZSIpCi0gICAgcHVibGljIGZpbmFsIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgZm9yKFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIgOiBjb21wb25lbnRJbml0aWFsaXplcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGNvbXBvbmVudEluaXRpYWxpemVyLmNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGRDb21wb25lbnRUb1N0b3JhZ2UodWlDb21wb25lbnQpOwotICAgICAgICAgICAgICAgIHVwZGF0ZUNvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRDb21wb25lbnRUb1N0b3JhZ2UoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5jbGFzcywgVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSkKLSAgICAgICAgICAgICAgICAuYWRkQ29tcG9uZW50KHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gVFJJTklEQURfQ09SRV9JTlBVVF9URVhULmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSkgfHwKLSAgICAgICAgICAgICAgIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURS5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBpZihSZXF1ZXN0Q29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5pc1BhcnRpYWxSZXF1ZXN0KGZhY2VzQ29udGV4dCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmFkZFBhcnRpYWxUYXJnZXQodWlDb21wb25lbnQuZ2V0UGFyZW50KCkpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1ZhbGlkYXRvckluaXRpYWxpemVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzZmNGFkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1ZhbGlkYXRvckluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQEludm9jYXRpb25PcmRlcigzMDApCi1AVXNhZ2VJbmZvcm1hdGlvbih2YWx1ZSA9IFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkxPVywgZGVzY3JpcHRpb24gPSAiaW1wbC4gdHJpbmlkYWQgZS1tYWlsIHZhbGlkYXRvciIpCi1jbGFzcyBWYWxpZGF0b3JJbml0aWFsaXplciBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgcHVibGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYoIW1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00pKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgdmFsdWUgPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLkNVU1RPTSk7Ci0KLSAgICAgICAgaWYoISh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IoT2JqZWN0IGN1cnJlbnRWYWx1ZSA6IChMaXN0KXZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZighKGN1cnJlbnRWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKENvbW1vbk1ldGFEYXRhS2V5cy5FTUFJTC5lcXVhbHMoY3VycmVudFZhbHVlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL1RPRE8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZjU3MDIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigzMDApDQotcHVibGljIGNsYXNzIFRyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogcHJvcGVydHlJbmZvcm1hdGlvbi5nZXRNZXRhRGF0YUVudHJpZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb24gJiYgaXNDbGllbnRWYWxpZGF0aW9uRGlzYWJsZWQoZW50cnkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uKGVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xpZW50VmFsaWRhdGlvbkRpc2FibGVkKE1ldGFEYXRhRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkNCi0gICAgICAgICAgICAgICAgLmV4dHJhY3QoZW50cnkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykNCi0gICAgICAgICAgICAgICAgLml0ZXJhdG9yKCkuaGFzTmV4dCgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBkaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24oTWV0YURhdGFFbnRyeSBlbnRyeSkNCi0gICAgew0KLSAgICAgICAgaWYoZW50cnkuZ2V0UHJvcGVydHkoQ29tbW9uTWV0YURhdGFLZXlzLkRJU0FCTEVfQ0xJRU5UX1NJREVfVkFMSURBVElPTikgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBlbnRyeS5zZXRQcm9wZXJ0eShDb21tb25NZXRhRGF0YUtleXMuRElTQUJMRV9DTElFTlRfU0lERV9WQUxJREFUSU9OLCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PFN0cmluZz4ga2V5c1RvRGlzYWJsZSA9IGVudHJ5LmdldFByb3BlcnR5KENvbW1vbk1ldGFEYXRhS2V5cy5ESVNBQkxFX0NMSUVOVF9TSURFX1ZBTElEQVRJT04sIExpc3QuY2xhc3MpOw0KLSAgICAgICAga2V5c1RvRGlzYWJsZS5hZGQoZW50cnkuZ2V0S2V5KCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODA1YTllLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnV0aWwuVHJpbmlkYWRVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLm91dHB1dC5Db3JlT3V0cHV0TGFiZWw7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yIGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yDQotew0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkNCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYoZmlsdGVyQ29yZU91dHB1dExhYmVsKHVpQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0Q29yZU91dHB1dExhYmVsKGZhY2VzQ29udGV4dCwgKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGZpbHRlckNvcmVPdXRwdXRMYWJlbChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIENvcmVPdXRwdXRMYWJlbCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdENvcmVPdXRwdXRMYWJlbChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBDb3JlT3V0cHV0TGFiZWwgY29yZU91dHB1dExhYmVsKQ0KLSAgICB7DQotICAgICAgICBVSUNvbXBvbmVudCB0YXJnZXRDb21wb25lbnQgPSBUcmluaWRhZFV0aWxzLmZpbmRMYWJlbGVkRWRpdGFibGVDb21wb25lbnQoY29yZU91dHB1dExhYmVsKTsNCi0NCi0gICAgICAgIGlmKHRhcmdldENvbXBvbmVudCA9PSBudWxsIHx8ICFpc0NvbXBvbmVudEVkaXRhYmxlKHRhcmdldENvbXBvbmVudCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YVJlc3VsdCA9IEV4dFZhbFV0aWxzLmdldFRyYW5zZm9ybWVkTWV0YURhdGEoZmFjZXNDb250ZXh0LCB0YXJnZXRDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgLy9nZXQgY29tcG9uZW50IGluaXRpYWxpemVyIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQgYW5kIGNvbmZpZ3VyZSBpdA0KLSAgICAgICAgLy9hbHNvIGluIGNhc2Ugb2Ygc2tpcHBlZCB2YWxpZGF0aW9uIHRvIHJlc2V0IGUuZy4gdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZQ0KLSAgICAgICAgaWYoIW1ldGFEYXRhUmVzdWx0LmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5jb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoZmFjZXNDb250ZXh0LCBjb3JlT3V0cHV0TGFiZWwsIG1ldGFEYXRhUmVzdWx0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDb21wb25lbnRFZGl0YWJsZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgLy9jb21wYXJlIHdpdGggZmFsc2Ugc28gdHJ1ZSA9IHRydWUgb3IgbnVsbA0KLSAgICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNSZWFkT25seSIpKSk7DQotICAgICAgICBib29sZWFuIGlzRGlzYWJsZWQgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc0Rpc2FibGVkIikpKTsNCi0NCi0gICAgICAgIHJldHVybiAhKGlzUmVhZE9ubHkgfHwgaXNEaXNhYmxlZCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWZhNzA5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5MYWJlbGVkTWVzc2FnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5leGNlcHRpb24uUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbnRleHQuUmVxdWVzdENvbnRleHQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dFRleHQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUuaW5wdXQuQ29yZUlucHV0RGF0ZSI7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb1JlZnJlc2hDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgICAgIHRyeVRvUGxhY2VMYWJlbEluRmFjZXNNZXNzYWdlKHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvUGxhY2VMYWJlbEluRmFjZXNNZXNzYWdlKA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHRyeVRvSGFuZGxlUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24odWlDb21wb25lbnQsIHZhbGlkYXRvckV4Y2VwdGlvbik7DQotDQotICAgICAgICBTdHJpbmcgbGFiZWwgPSBkZXRlY3RMYWJlbFRleHQobWV0YURhdGFFbnRyeSwgdWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0xhYmVsKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSwgbGFiZWwpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGRldGVjdExhYmVsVGV4dChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbGFiZWwgPSBnZXRMYWJlbCh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBsYWJlbCA9IGdldENsaWVudElkQXNGYWxsYmFja0lmTmVlZGVkKHVpQ29tcG9uZW50LCBsYWJlbCk7DQotDQotICAgICAgICBsYWJlbCA9IHRyeVRvT3ZlcnJpZGVMYWJlbElmUHJvdmlkZWRNYW51YWxseShtZXRhRGF0YUVudHJ5LCBsYWJlbCk7DQotICAgICAgICByZXR1cm4gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NMYWJlbChGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIExhYmVsZWRNZXNzYWdlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgICgoTGFiZWxlZE1lc3NhZ2UpZmFjZXNNZXNzYWdlKS5zZXRMYWJlbFRleHQobGFiZWwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9pZiBzb21lb25lIHVzZXMgYSBub3JtYWwgZmFjZXMgbWVzc2FnZQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwoZmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvT3ZlcnJpZGVMYWJlbElmUHJvdmlkZWRNYW51YWxseShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwsIFN0cmluZy5jbGFzcyk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xpZW50SWRBc0ZhbGxiYWNrSWZOZWVkZWQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgaWYobGFiZWwgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBsYWJlbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9IYW5kbGVSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdG9yRXhjZXB0aW9uIGluc3RhbmNlb2YgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKTsNCi0gICAgICAgICAgICBTdHJpbmcgaW5saW5lTWVzc2FnZSA9IGdldElubGluZVJlcXVpcmVkTWVzc2FnZSh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICAgICAgaWYoaW5saW5lTWVzc2FnZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoaW5saW5lTWVzc2FnZSk7DQotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoaW5saW5lTWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1JlZnJlc2hDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmKFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmlzUGFydGlhbFJlcXVlc3QoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBSZXF1ZXN0Q29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5hZGRQYXJ0aWFsVGFyZ2V0KHVpQ29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gVFJJTklEQURfQ09SRV9JTlBVVF9URVhULmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSkgfHwNCi0gICAgICAgICAgICAgICBUUklOSURBRF9DT1JFX0lOUFVUX0RBVEUuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRMYWJlbChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldExhYmVsIikpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldElubGluZVJlcXVpcmVkTWVzc2FnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldFJlcXVpcmVkTWVzc2FnZURldGFpbCIpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RiNDVlOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcktpdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuUmVuZGVyS2l0RGVjb3JhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuY29yZS5Db3JlUmVuZGVyS2l0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZXNwb25zZVN0YXRlTWFuYWdlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVdyaXRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5Xcml0ZXI7DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0IGV4dGVuZHMgUmVuZGVyS2l0RGVjb3JhdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgRXh0VmFsUmVuZGVyS2l0IGV4dFZhbFJlbmRlcktpdDsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiRVhUVkFMX1RSSU5JREFEX1JFTkRFUktJVCI7DQotDQotICAgIHB1YmxpYyBFeHRWYWxUcmluaWRhZFJlbmRlcktpdChSZW5kZXJLaXQgd3JhcHBlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5leHRWYWxSZW5kZXJLaXQgPSBuZXcgRXh0VmFsUmVuZGVyS2l0KHdyYXBwZWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlLCBSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5leHRWYWxSZW5kZXJLaXQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIHJlbmRlcmVyKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFJlbmRlcmVyIGdldFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5nZXRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBSZXNwb25zZVN0YXRlTWFuYWdlciBnZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5nZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUmVzcG9uc2VXcml0ZXIgY3JlYXRlUmVzcG9uc2VXcml0ZXIoV3JpdGVyIHdyaXRlciwgU3RyaW5nIHMsIFN0cmluZyBzMSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmNyZWF0ZVJlc3BvbnNlV3JpdGVyKHdyaXRlciwgcywgczEpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdHJlYW0gY3JlYXRlUmVzcG9uc2VTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmNyZWF0ZVJlc3BvbnNlU3RyZWFtKG91dHB1dFN0cmVhbSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZWNvcmF0ZWRSZW5kZXJLaXRJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBDb3JlUmVuZGVyS2l0LkJBU0VfUkVOREVSX0tJVF9JRDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjI3MDFmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnJlbmRlcmtpdC5jb3JlLnhodG1sLnRhYmxlLlRhYmxlUmVuZGVyaW5nQ29udGV4dDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIHNvbHV0aW9uIGZvciB0cmluaWRhZCB0YWJsZSByZW5kZXJlciBpc3N1ZSAoaW4gY29ubmVjdGlvbiB3aXRoIGRvdWJsZSBjYWxsIHByZXZlbnRpb24gcHJveGllcykNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1wdWJsaWMgY2xhc3MgRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5IGV4dGVuZHMgRXh0VmFsUmVuZGVyZXJQcm94eQ0KLXsNCi0gICAgcHVibGljIEV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgc3VwZXIocmVuZGVyZXIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wdGlvbmFsS2V5KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZihUYWJsZVJlbmRlcmluZ0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gInwiICsgVGFibGVSZW5kZXJpbmdDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFJlbmRlclN0YWdlKCkuZ2V0U3RhZ2UoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAiIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWE2N2FiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkFic3RyYWN0U3RhcnR1cExpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VySG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50LlRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLlRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UuRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudmFsaWRhdGlvbi5tZXNzYWdlLlRyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdC5FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvci5UcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yLlRyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yLlRyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBhbHRlcm5hdGl2ZSBhcHByb2FjaCBmb3IgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFRyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04MDM0MDg5MjQ0OTAzOTY2OTk5TDsNCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIGRlYWN0aXZhdGVEZWZhdWx0RXh0VmFsUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsNCi0NCi0gICAgICAgIGluaXRDbGllbnRTaWRlVmFsaWRhdGlvblN1cHBvcnQoKTsNCi0NCi0gICAgICAgIGluaXRMYWJlbEluaXRpYWxpemF0aW9uU3VwcG9ydCgpOw0KLQ0KLSAgICAgICAgaW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRpb24oKTsNCi0NCi0gICAgICAgIHJlcGxhY2VEZWZhdWx0UHJveHlXaXRoVHJpbmlkYWRSZW5kZXJlclByb3h5KCk7DQotDQotICAgICAgICBpbml0VHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5KCk7DQotICAgICAgICAvKg0KLSAgICAgICAgICogaWYgdGhlcmUgYXJlIGZ1cnRoZXIgaW5jb21wYXRpYmxlIHJlbmRlcmVycyB1c2UgdGhlIGZvbGxvd2luZyBxdWljay1maXg6DQotICAgICAgICAgKiAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSwgbnVsbCk7DQotICAgICAgICAgICBhdHRlbnRpb246IGl0IGNhdXNlcyBkaXJlY3QgZGVsZWdhdGlvbiB3aXRob3V0IGEgY2hlY2sgb2YgZG91YmxlIGludm9jYXRpb25zDQotICAgICAgICAgKi8NCi0NCi0gICAgICAgIGluaXRUcmluaWRhZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKCk7DQotDQotICAgICAgICBpbml0VHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGRlYWN0aXZhdGVEZWZhdWx0RXh0VmFsUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jbGFzcykuZGVhY3RpdmF0ZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0Q2xpZW50U2lkZVZhbGlkYXRpb25TdXBwb3J0KCkNCi0gICAgew0KLSAgICAgICAgaWYoaXNDbGllbnRTaWRlVmFsaWRhdGlvblN1cHBvcnRFbmFibGVkKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NMSUVOVF9TSURFX1RSSU5JREFEX1ZBTElEQVRJT04pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZENvbXBvbmVudEluaXRpYWxpemVyKG5ldyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TGFiZWxJbml0aWFsaXphdGlvblN1cHBvcnQoKQ0KLSAgICB7DQotICAgICAgICBpZihpc0xhYmVsSW5pdGlhbGl6YXRpb25FbmFibGVkKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX1RSSU5JREFEX0NPUkVfT1VUUFVUX0xBQkVMX0lOSVRJQUxJWkFUSU9OKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFRyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRpb24oKQ0KLSAgICB7DQotICAgICAgICBpZih1c2VWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0aW9uKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX1RSSU5JREFEX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IobmV3IFRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZXBsYWNlRGVmYXVsdFByb3h5V2l0aFRyaW5pZGFkUmVuZGVyZXJQcm94eSgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSwgRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRUcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjdG9yeU5hbWVzLkZBQ0VTX01FU1NBR0VfRkFDVE9SWS5uYW1lKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRUcmluaWRhZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZLCBTdG9yYWdlTWFuYWdlckhvbGRlci5jbGFzcykNCi0gICAgICAgICAgICAgICAgLnNldFN0b3JhZ2VNYW5hZ2VyKFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNMYWJlbEluaXRpYWxpemF0aW9uRW5hYmxlZChTdHJpbmcgZGVhY3RpdmF0ZUluaXRDb3JlT3V0cHV0TGFiZWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkZWFjdGl2YXRlSW5pdENvcmVPdXRwdXRMYWJlbCA9PSBudWxsIHx8ICFkZWFjdGl2YXRlSW5pdENvcmVPdXRwdXRMYWJlbC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xpZW50U2lkZVZhbGlkYXRpb25TdXBwb3J0RW5hYmxlZChTdHJpbmcgZGVhY3RpdmF0ZUNsaWVudFNpZGVWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGVhY3RpdmF0ZUNsaWVudFNpZGVWYWxpZGF0aW9uID09IG51bGwgfHwgIWRlYWN0aXZhdGVDbGllbnRTaWRlVmFsaWRhdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRpb24oU3RyaW5nIGRlYWN0aXZhdGVUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRlYWN0aXZhdGVUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA9PSBudWxsIHx8DQotICAgICAgICAgICAgICAgICFkZWFjdGl2YXRlVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNTQyNTQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZSBpbXBsZW1lbnRzIFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZQ0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PFVJQ29tcG9uZW50PiBjb21wb25lbnRMaXN0ID0gbmV3IEFycmF5TGlzdDxVSUNvbXBvbmVudD4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkQ29tcG9uZW50KFVJQ29tcG9uZW50IHRyaW5pZGFkQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZighdGhpcy5jb21wb25lbnRMaXN0LmNvbnRhaW5zKHRyaW5pZGFkQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmNvbXBvbmVudExpc3QuYWRkKHRyaW5pZGFkQ29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByb2xsYmFjaygpDQotICAgIHsNCi0gICAgICAgIGZvciAoVUlDb21wb25lbnQgY29tcG9uZW50IDogdGhpcy5jb21wb25lbnRMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlbW92ZVRyaW5pZGFkVmFsaWRhdG9yV3JhcHBlcihjb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdGhpcy5jb21wb25lbnRMaXN0LmNsZWFyKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVRyaW5pZGFkVmFsaWRhdG9yV3JhcHBlcihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZW1vdmVXcmFwcGVyRnJvbUNvbXBvbmVudCh1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgLy90byBrZWVwIHRoZSBzb3VyY2UgaW4gc3luYyB3aXRoIG9sZGVyIHZlcnNpb25zDQotICAgICAgICAgICAgZm9yIChPYmplY3QgY2hpbGQgOiB1aUNvbXBvbmVudC5nZXRDaGlsZHJlbigpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVtb3ZlVHJpbmlkYWRWYWxpZGF0b3JXcmFwcGVyKChVSUNvbXBvbmVudCljaGlsZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZW1vdmVXcmFwcGVyRnJvbUNvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgZm9yIChWYWxpZGF0b3IgdmFsaWRhdG9yIDogKChFZGl0YWJsZVZhbHVlSG9sZGVyKSB1aUNvbXBvbmVudCkuZ2V0VmFsaWRhdG9ycygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpIHVpQ29tcG9uZW50KS5yZW1vdmVWYWxpZGF0b3IodmFsaWRhdG9yKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTWFuYWdlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDAxZGM1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5TdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBjb21wb25lbnQgZW50cmllcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyDQotICAgICAgICBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2U+DQotew0KLSAgICBwdWJsaWMgRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX1RSSU5JREFEX0NMSUVOVF9WQUxJREFUT1I6S0VZIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODNjYjguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL1RyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLQ0KLS8qKg0KLSAqIGV4dHZhbCBpbmplY3RzIGNsaWVudC12YWxpZGF0b3JzIGludG8gdHJpbmlkYWQgY29tcG9uZW50cyBiYXNlZCBvbiBtZXRhLWRhdGEuDQotICogc28gY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBpcyBzdXBwb3J0ZWQuIHNvbWUgYXBwLXNlcnZlcnMgc2hvdyBhIGRpZmZlcmVudCBiZWhhdmlvdXIuDQotICogdGhhdCdzIHRoZSByZWFzb24gZm9yIHN0b3JpbmcgdGhlc2UgY29tcG9uZW50cyBhbmQgcmVtb3ZlIHRoZSBpbmplY3RlZCB2YWxpZGF0b3JzIGFmdGVyIHRoZSByZW5kZXJpbmcgcGhhc2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlDQotew0KLSAgICB2b2lkIGFkZENvbXBvbmVudChVSUNvbXBvbmVudCB0cmluaWRhZENvbXBvbmVudCk7DQotICAgIHZvaWQgcm9sbGJhY2soKTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL21hcHBlci9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNWI5NmIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL21hcHBlci9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLlRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UuRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiB1c2UgYSBwdWJsaWMgY2xhc3MgdG8gYWxsb3cgb3B0aW9uYWwgZGVyZWdpc3RyYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdXRpbC9UcmluaWRhZFV0aWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3V0aWwvVHJpbmlkYWRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTYzODMyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdXRpbC9UcmluaWRhZFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJjaGVjayBzdWJmb3JtIikNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRVdGlscw0KLXsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coVHJpbmlkYWRVdGlscy5jbGFzcyk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVUlDb21wb25lbnQgZmluZExhYmVsZWRFZGl0YWJsZUNvbXBvbmVudChDb3JlT3V0cHV0TGFiZWwgY29yZU91dHB1dExhYmVsKQ0KLSAgICB7DQotICAgICAgICAvL1RPRE8NCi0gICAgICAgIGlmKGlzTGFiZWxUYXJnZXRBdmFpbGFibGUoY29yZU91dHB1dExhYmVsKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBVSUNvbXBvbmVudCByZXN1bHQgPSByZXNvbHZlTGFiZWxUYXJnZXQoZmFjZXNDb250ZXh0LCBjb3JlT3V0cHV0TGFiZWwpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoTE9HLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgTE9HLnRyYWNlKGNvcmVPdXRwdXRMYWJlbC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpICsgIiBkb2Vzbid0IHJlZmVyZW5jZSBhbiBlZGl0YWJsZSBjb21wb25lbnQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFVJQ29tcG9uZW50IHJlc29sdmVMYWJlbFRhcmdldChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBDb3JlT3V0cHV0TGFiZWwgY29yZU91dHB1dExhYmVsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZmluZENvbXBvbmVudChjb3JlT3V0cHV0TGFiZWwuZ2V0Rm9yKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMYWJlbFRhcmdldEF2YWlsYWJsZShDb3JlT3V0cHV0TGFiZWwgY29yZU91dHB1dExhYmVsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29yZU91dHB1dExhYmVsLmdldEZvcigpID09IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNjMjFjYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5IGV4dGVuZHMgRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xhYmVsZWRGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIFRyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2Uoc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZlNjkzYi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuTGFiZWxlZE1lc3NhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC51dGlsLkxhYmVsZWRGYWNlc01lc3NhZ2U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBUcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UgZXh0ZW5kcyBMYWJlbGVkRmFjZXNNZXNzYWdlIGltcGxlbWVudHMgTGFiZWxlZE1lc3NhZ2UNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYzNTY4MDA2ODk5NjE1MDUxNTRMOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX1JFU09VUkNFX01BUktFUiA9ICI/Pz8iOw0KLQ0KLSAgICBwdWJsaWMgVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlKFNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgc3VwZXIoc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TGFiZWxBc1N0cmluZyhGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN1bW1hcnkoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UgcmVzdWx0ID0gdHJ5VG9QbGFjZUxhYmVsKHN1cGVyLmdldFN1bW1hcnkoKSk7DQotDQotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3VwZXIuc2V0U3VtbWFyeShyZXN1bHQuZ2V0U3VtbWFyeSgpKTsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmdldFN1bW1hcnkoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRTdW1tYXJ5KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGV0YWlsKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIHJlc3VsdCA9IHRyeVRvUGxhY2VMYWJlbChzdXBlci5nZXREZXRhaWwoKSk7DQotDQotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3VwZXIuc2V0RGV0YWlsKHJlc3VsdC5nZXREZXRhaWwoKSk7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5nZXREZXRhaWwoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5nZXREZXRhaWwoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEZhY2VzTWVzc2FnZSB0cnlUb1BsYWNlTGFiZWwoU3RyaW5nIG9yaWdpbmFsTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGlzVmFsaWRNZXNzYWdlKG9yaWdpbmFsTWVzc2FnZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIG5ld0ZhY2VzTWVzc2FnZSA9IGNyZWF0ZU9yaWdpbmFsRmFjZXNNZXNzYWdlKCk7DQotICAgICAgICAgICAgdHJ5VG9QbGFjZUxhYmVsSW4obmV3RmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICByZXR1cm4gbmV3RmFjZXNNZXNzYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBGYWNlc01lc3NhZ2UgY3JlYXRlT3JpZ2luYWxGYWNlc01lc3NhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEZhY2VzTWVzc2FnZShzdXBlci5nZXRTZXZlcml0eSgpLCBzdXBlci5nZXRTdW1tYXJ5KCksIHN1cGVyLmdldERldGFpbCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9QbGFjZUxhYmVsSW4oRmFjZXNNZXNzYWdlIG5ld0ZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGxhYmVsID0gZ2V0TGFiZWxUZXh0KCk7DQotDQotICAgICAgICBpZihsYWJlbCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9QbGFjZUxhYmVsKG5ld0ZhY2VzTWVzc2FnZSwgbGFiZWwsIGkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZE1lc3NhZ2UoU3RyaW5nIG9yaWdpbmFsTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICEob3JpZ2luYWxNZXNzYWdlICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgb3JpZ2luYWxNZXNzYWdlLnN0YXJ0c1dpdGgoTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIpICYmDQotICAgICAgICAgICAgICAgIG9yaWdpbmFsTWVzc2FnZS5lbmRzV2l0aChNSVNTSU5HX1JFU09VUkNFX01BUktFUikpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldExhYmVsKGxhYmVsKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjQ5NTk4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlIHByb3ZpZGVzIHNwZWNpYWwgVHJpbmlkYWQgU3VwcG9ydCBmb3IgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvci4NCi0gICAgRnVydGhlcm1vcmUsIGl0IGFsbG93cyB0byBqb2luIHRoZSBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIG1lY2hhbmlzbSBvZiBUcmluaWRhZC4gU2FtcGxlIHVzZS1jYXNlOiBhbm5vdGF0ZSB5b3VyIG1vZGVsIHdpdGggSlBBIDEuMCBhbm5vdGF0aW9ucywgYmluZCBwcm9wZXJ0aWVzIHRvIEpTRiBJbnB1dCBjb21wb25lbnRzIGFuZCBnZXQgYXV0b21hdGljIGNsaWVudC1zaWRlIHZhbGlkYXRpb24ganVzdCBieSBhZGRpbmcgMyBKQVIgZmlsZXMgKE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSwgUHJvcGVydHkgVmFsaWRhdGlvbiBhbmQgVHJpbmlkYWQgU3VwcG9ydCkuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLjEueCBhbmQgSlNGIDEuMi54LiBCb3RoIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9wb20ueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjc0MDk0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBDb3JlPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPHNjbT4NCi0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvcmU8L2Nvbm5lY3Rpb24+DQotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvY29yZTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4NCi0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvcmU8L3VybD4NCi0gICAgPC9zY20+DQotICAgIA0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cmVzb3VyY2VzPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICA8L3Jlc291cmNlcz4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkNGRjNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotICAgIDxmYWN0b3J5Pg0KLSAgICAgICAgPHJlbmRlci1raXQtZmFjdG9yeT5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyS2l0RmFjdG9yeTwvcmVuZGVyLWtpdC1mYWN0b3J5Pg0KLSAgICA8L2ZhY3Rvcnk+DQotDQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5FeHRWYWxTdGFydHVwTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0V4dFZhbEluZm9ybWF0aW9uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0V4dFZhbEluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZDVkMWMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotDQotLyoqDQotICogZG9udCd0IG1vdmUgdG8gYW4gb3RoZXIgcGFja2FnZSEhIQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIEV4dFZhbEluZm9ybWF0aW9uDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FID0gRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJYTUxfUEFSQU1fUFJFRklYID0gRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gQ2xhc3NVdGlscy5nZXRKYXJWZXJzaW9uKEV4dFZhbEluZm9ybWF0aW9uLmNsYXNzKTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0N1c3RvbUluZm9ybWF0aW9uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ3VzdG9tSW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUzYWE0OS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ3VzdG9tSW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkNCi1wdWJsaWMgZW51bSBDdXN0b21JbmZvcm1hdGlvbg0KLXsNCi0gICAgQkFTRV9QQUNLQUdFLA0KLSAgICBFWFRWQUxfQ09OVEVYVCwNCi0NCi0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IsDQotICAgIFZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUiwNCi0NCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYLA0KLSAgICBWQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWCwNCi0gICAgTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVgsDQotDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfVE9fTVNHX1JFU09MVkVSX05BTUVfTUFQUEVSLA0KLSAgICBNRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUiwNCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIsDQotDQotICAgIFNUQVJUVVBfTElTVEVORVIsDQotICAgIENPTVBPTkVOVF9JTklUSUFMSVpFUiwNCi0gICAgVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IsDQotICAgIFBST1BFUlRZX1ZBTElEQVRJT05fSU5URVJDRVBUT1IsDQotICAgIE1FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SLA0KLQ0KLSAgICBNRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwNCi0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwNCi0gICAgVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlksDQotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLA0KLSAgICBGQUNFU19NRVNTQUdFX0ZBQ1RPUlksDQotICAgIFNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZLA0KLQ0KLSAgICBNRVNTQUdFX0JVTkRMRV9OQU1FLA0KLSAgICBTVEFUSUNfU1RSQVRFR1lfTUFQUElOR19TT1VSQ0UsDQotDQotICAgIE1FVEFfREFUQV9TVE9SQUdFX0ZJTFRFUg0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dC5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdjZmMyZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5EZWZhdWx0RmFjdG9yeUZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBFeHRWYWxDb250ZXh0Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBFeHRWYWxDb250ZXh0IGV4dFZhbENvbnRleHQ7Ci0KLSAgICBwcml2YXRlIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgdmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsKLSAgICBwcml2YXRlIEZhY3RvcnlGaW5kZXIgZmFjdG9yeUZpbmRlciA9IERlZmF1bHRGYWN0b3J5RmluZGVyLmdldEluc3RhbmNlKCk7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZW5kZXJlckludGVyY2VwdG9yPiByZW5kZXJlckludGVyY2VwdG9ycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUmVuZGVyZXJJbnRlcmNlcHRvcj4oKTsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBkZW5pZWRJbnRlcmNlcHRvcnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICBwcml2YXRlIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcj4gcHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMgPQotICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyPigpOwotCi0gICAgcHJpdmF0ZSBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvciBza2lwVmFsaWRhdGlvbkV2YWx1YXRvcjsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBnbG9iYWxQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLSAgICBwcml2YXRlIE1hcDxTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMsIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+PiBzdGF0aWNDb25maWdNYXAKLSAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLCBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+Pj4oKTsKLQotICAgIHByaXZhdGUgRXh0VmFsQ29udGV4dEludGVybmFscyBjb250ZXh0SGVscGVyOwotICAgIHByaXZhdGUgRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzIGludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlcjsKLQotICAgIHByaXZhdGUgRXh0VmFsQ29udGV4dCgpCi0gICAgewotICAgICAgICB0aGlzLmNvbnRleHRIZWxwZXIgPSBuZXcgRXh0VmFsQ29udGV4dEludGVybmFscygpOwotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlciA9IG5ldyBFeHRWYWxDb250ZXh0SW52b2NhdGlvbk9yZGVyQXdhcmVJbnRlcm5hbHModGhpcy5jb250ZXh0SGVscGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEV4dFZhbENvbnRleHQgZ2V0Q29udGV4dCgpCi0gICAgewotICAgICAgICBpZiAoZXh0VmFsQ29udGV4dCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBleHRWYWxDb250ZXh0ID0gbmV3IEV4dFZhbENvbnRleHQoKTsKLSAgICAgICAgICAgIE9iamVjdCBjdXN0b21FeHRWYWxDb250ZXh0ID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKAotICAgICAgICAgICAgICAgICAgICBleHRWYWxDb250ZXh0LmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkVYVFZBTF9DT05URVhUKSk7Ci0KLSAgICAgICAgICAgIGlmIChjdXN0b21FeHRWYWxDb250ZXh0IGluc3RhbmNlb2YgRXh0VmFsQ29udGV4dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleHRWYWxDb250ZXh0ID0gKEV4dFZhbENvbnRleHQpIGN1c3RvbUV4dFZhbENvbnRleHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGV4dFZhbENvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcihWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIpCi0gICAgewotICAgICAgICBzZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoCi0gICAgICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIsIGJvb2xlYW4gZm9yY2VPdmVycmlkZSkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLnZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgPT0gbnVsbCB8fCBmb3JjZU92ZXJyaWRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpICYmIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuZ2V0Q2xhc3MoKSArICIgaXMgdXNlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyID0gdmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICogRmFjdG9yeUZpbmRlcgotICAgICovCi0gICAgcHVibGljIEZhY3RvcnlGaW5kZXIgZ2V0RmFjdG9yeUZpbmRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5mYWN0b3J5RmluZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZhY3RvcnlGaW5kZXIoRmFjdG9yeUZpbmRlciBmYWN0b3J5RmluZGVyKQotICAgIHsKLSAgICAgICAgaWYgKGZhY3RvcnlGaW5kZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5mYWN0b3J5RmluZGVyID0gZmFjdG9yeUZpbmRlcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcihTa2lwVmFsaWRhdGlvbkV2YWx1YXRvciBza2lwVmFsaWRhdGlvbkV2YWx1YXRvcikKLSAgICB7Ci0gICAgICAgIHNldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcihTa2lwVmFsaWRhdGlvbkV2YWx1YXRvciBza2lwVmFsaWRhdGlvbkV2YWx1YXRvciwgYm9vbGVhbiBmb3JjZU92ZXJyaWRlKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMuc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IgPT0gbnVsbCB8fCBmb3JjZU92ZXJyaWRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpICYmIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhza2lwVmFsaWRhdGlvbkV2YWx1YXRvci5nZXRDbGFzcygpICsgIiBpcyB1c2VkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLnNraXBWYWxpZGF0aW9uRXZhbHVhdG9yID0gc2tpcFZhbGlkYXRpb25FdmFsdWF0b3I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IgZ2V0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMuc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gc2tpcFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwgTWV0YURhdGFFbnRyeSBlbnRyeSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMuc2tpcFZhbGlkYXRpb25FdmFsdWF0b3I7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZW5kZXJlckludGVyY2VwdG9ycwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFJlbmRlcmVySW50ZXJjZXB0b3I+IGdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFJlbmRlcmVySW50ZXJjZXB0b3I+KHRoaXMucmVuZGVyZXJJbnRlcmNlcHRvcnMudmFsdWVzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKEV4dFZhbENvbnRleHQuY2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmRlbmllZEludGVyY2VwdG9ycy5jb250YWlucyhyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLnJlbmRlcmVySW50ZXJjZXB0b3JzLnB1dChyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSwgcmVuZGVyZXJJbnRlcmNlcHRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVyZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IoQ2xhc3M8PyBleHRlbmRzIFJlbmRlcmVySW50ZXJjZXB0b3I+IHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcykKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcyk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChFeHRWYWxDb250ZXh0LmNsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnJlbmRlcmVySW50ZXJjZXB0b3JzLnJlbW92ZShyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvL2lmIGFuIGludGVyY2VwdG9yIGhhc24ndCBiZWVuIHJlZ2lzdGVyZWQgc28gZmFyLCBpdCBzaG91bGQgYmUgZGVuaWVkIGF0IGZ1dHVyZSByZWdpc3RyYXRpb25zCi0gICAgcHVibGljIHZvaWQgZGVueVJlbmRlcmVySW50ZXJjZXB0b3IoQ2xhc3M8PyBleHRlbmRzIFJlbmRlcmVySW50ZXJjZXB0b3I+IHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcykKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcyk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChFeHRWYWxDb250ZXh0LmNsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMuZGVuaWVkSW50ZXJjZXB0b3JzLmNvbnRhaW5zKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmRlbmllZEludGVyY2VwdG9ycy5hZGQocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRlcmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDb21wb25lbnRJbml0aWFsaXplcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDb21wb25lbnRJbml0aWFsaXplcihDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplcikKLSAgICB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmxhenlJbml0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmFkZENvbXBvbmVudEluaXRpYWxpemVyKGNvbXBvbmVudEluaXRpYWxpemVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4gZ2V0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCkKLSAgICB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmxhenlJbml0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7Ci0gICAgICAgIHJldHVybiB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5nZXRDb21wb25lbnRJbml0aWFsaXplcnMoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmxhenlJbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+IGdldFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHJldHVybiB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5nZXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmxhenlJbml0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsKLSAgICB9Ci0KLSAgICBARGVwcmVjYXRlZAotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuSElHSCwgZGVzY3JpcHRpb24gPSAibm90IHVzZWQiKQotICAgIHB1YmxpYyBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBnZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBnZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IoQ2xhc3MgbW9kdWxlS2V5KQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc0Zvcihtb2R1bGVLZXkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI+IGdldFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciBwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycy5hZGQocHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbgotICAgICAqLwotICAgIHB1YmxpYyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBnZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0SGVscGVyLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTdGF0aWNDb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IGdldFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzIG5hbWUpCi0gICAgewotICAgICAgICBpZiAoIXRoaXMuc3RhdGljQ29uZmlnTWFwLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBzdGF0aWNDb25maWdMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4oKTsKLSAgICAgICAgICAgIHRoaXMuc3RhdGljQ29uZmlnTWFwLnB1dChuYW1lLCBzdGF0aWNDb25maWdMaXN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5zdGF0aWNDb25maWdNYXAuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzIG5hbWUsIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZykKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gc3RhdGljQ29uZmlnTGlzdDsKLSAgICAgICAgICAgIGlmICghdGhpcy5zdGF0aWNDb25maWdNYXAuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5zdGF0aWNDb25maWdNYXAucHV0KG5hbWUsIHN0YXRpY0NvbmZpZ0xpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5zdGF0aWNDb25maWdNYXAuZ2V0KG5hbWUpLmFkZChzdGF0aWNDb25maWcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBHbG9iYWwgcHJvcGVydGllcwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gYWRkR2xvYmFsUHJvcGVydHkobmFtZSwgdmFsdWUsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gZm9yY2VPdmVycmlkZSkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLmdsb2JhbFByb3BlcnRpZXMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghZm9yY2VPdmVycmlkZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIm92ZXJyaWRlIGdsb2JhbCBwcm9wZXJ0eSAnIiArIG5hbWUgKyAiJyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5nbG9iYWxQcm9wZXJ0aWVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0R2xvYmFsUHJvcGVydHkoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5nbG9iYWxQcm9wZXJ0aWVzLmdldChuYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dEludGVybmFscy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnRlcm5hbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiN2JkNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dEludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIHgueC4zCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBFeHRWYWxDb250ZXh0SW50ZXJuYWxzCi17Ci0gICAgYm9vbGVhbiBpc0NvbXBvbmVudEluaXRpYWxpemF0aW9uQWN0aXZhdGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAhInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ09NUE9ORU5UX0lOSVRJQUxJWkFUSU9OKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQotICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGluaXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbihNYXAgYXBwbGljYXRpb25NYXApCi0gICAgewotICAgICAgICBMaXN0PFN0cmluZz4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4pOwotICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMuYWRkKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkNVU1RPTV9CRUFOKTsKLQotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbjsKLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChpbmZvcm1hdGlvblByb3ZpZGVyQmVhbiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uTWFwLnB1dChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUsIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnlUb0luaXRDdXN0b21Db25maWd1cmVkSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWUoYXBwbGljYXRpb25NYXApOwotCi0gICAgICAgIGlmIChhcHBsaWNhdGlvbk1hcC5jb250YWluc0tleShJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBhcHBsaWNhdGlvbk1hcC5nZXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkKLSAgICB2b2lkIHRyeVRvSW5pdEN1c3RvbUNvbmZpZ3VyZWRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZShNYXAgYXBwbGljYXRpb25NYXApCi0gICAgewotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBiZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpCi0gICAgICAgICAgICAgICAgLmdldEJlYW4oSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQ1VTVE9NX0JFQU4ucmVwbGFjZSgiLiIsICJfIikpOwotCi0gICAgICAgIGlmIChiZWFuICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uTWFwLnB1dChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUsIGJlYW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQotICAgIHsKLSAgICAgICAgTWFwIGFwcGxpY2F0aW9uTWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uTWFwKCk7Ci0gICAgICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGJlYW4gPSAoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4pIGFwcGxpY2F0aW9uTWFwLmdldChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUpOwotCi0gICAgICAgIGlmIChiZWFuID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbml0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oYXBwbGljYXRpb25NYXApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZGE1ZmEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSB4LnguMwotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4gdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPSBudWxsOwotICAgIHByaXZhdGUgTWFwPENsYXNzLCBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPj4gbW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPSBudWxsOwotICAgIHByaXZhdGUgTGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4gY29tcG9uZW50SW5pdGlhbGl6ZXJzID0gbnVsbDsKLQotICAgIHByaXZhdGUgRXh0VmFsQ29udGV4dEludGVybmFscyBjb250ZXh0SGVscGVyOwotCi0gICAgRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzKEV4dFZhbENvbnRleHRJbnRlcm5hbHMgY29udGV4dEhlbHBlcikKLSAgICB7Ci0gICAgICAgIHRoaXMuY29udGV4dEhlbHBlciA9IGNvbnRleHRIZWxwZXI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDb21wb25lbnRJbml0aWFsaXplcnMKLSAgICAgKi8KLSAgICB2b2lkIGFkZENvbXBvbmVudEluaXRpYWxpemVyKENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyKQotICAgIHsKLSAgICAgICAgdGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMuYWRkKGNvbXBvbmVudEluaXRpYWxpemVyKTsKLSAgICAgICAgc29ydENvbXBvbmVudEluaXRpYWxpemVycygpOwotICAgIH0KLQotICAgIExpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+IGdldENvbXBvbmVudEluaXRpYWxpemVycygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0SGVscGVyLmlzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25BY3RpdmF0ZWQoKSA/Ci0gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMgOiBuZXcgQXJyYXlMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPigpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycwotICAgICAqLwotICAgIHZvaWQgYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMuYWRkKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgIHNvcnRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgfQotCi0gICAgTGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+IGdldFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycwotICAgICAqLwotICAgIHZvaWQgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBpZiAocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uTW9kdWxlQXdhcmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlcyhwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciwKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMsIHRoaXMubW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUobnVsbCwgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzLCB0aGlzLm1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNvcnRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICB9Ci0KLSAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBnZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IGdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc0ZvcihDbGFzcyBtb2R1bGVLZXkpCi0gICAgewotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBnZW5lcmFsSW50ZXJjZXB0b3JzID0gZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7Ci0KLSAgICAgICAgaWYgKG1vZHVsZUtleSA9PSBudWxsIHx8ICF0aGlzLm1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzLmNvbnRhaW5zS2V5KG1vZHVsZUtleSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZW5lcmFsSW50ZXJjZXB0b3JzOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gbW9kdWxlU3BlY2lmaWNJbnRlcmNlcHRvcnMgPQotICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMuZ2V0KG1vZHVsZUtleSk7Ci0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4oKTsKLSAgICAgICAgcmVzdWx0LmFkZEFsbChnZW5lcmFsSW50ZXJjZXB0b3JzKTsKLSAgICAgICAgcmVzdWx0LmFkZEFsbChtb2R1bGVTcGVjaWZpY0ludGVyY2VwdG9ycyk7Ci0KLSAgICAgICAgc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycyhyZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckZvck1vZHVsZXMoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxDbGFzcywgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycykKLSAgICB7Ci0gICAgICAgIENsYXNzIG1vZHVsZUtleTsKLSAgICAgICAgZm9yIChTdHJpbmcgY3VycmVudE1vZHVsZUtleSA6ICgoVmFsaWRhdGlvbk1vZHVsZUF3YXJlKSBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcikuZ2V0TW9kdWxlS2V5cygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb2R1bGVLZXkgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShjdXJyZW50TW9kdWxlS2V5KTsKLQotICAgICAgICAgICAgaWYgKG1vZHVsZUtleSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckZvck1vZHVsZShtb2R1bGVLZXksCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLAotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMsCi0gICAgICAgICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckZvck1vZHVsZShDbGFzcyBtb2R1bGVLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxDbGFzcywgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKQotICAgIHsKLSAgICAgICAgaWYgKG1vZHVsZUtleSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMuYWRkKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsKLQotICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdDsKLSAgICAgICAgICAgIGlmIChtb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5jb250YWluc0tleShtb2R1bGVLZXkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdCA9IG1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzLmdldChtb2R1bGVLZXkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+KCk7Ci0gICAgICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMucHV0KG1vZHVsZUtleSwgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdC5hZGQocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICBzb3J0TW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0KTsKLQotICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQgZm9yICIgKyBtb2R1bGVLZXkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgdm9pZCBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHRoaXMubWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLmFkZChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgIHNvcnRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsKLSAgICB9Ci0KLSAgICBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogaW5pdAotICAgICAqLwotCi0gICAgdm9pZCBsYXp5SW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgaWYgKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycyA9IG5ldyBBcnJheUxpc3Q8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPigpOwotICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IpOwotICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZCh0aGlzLmNvbnRleHRIZWxwZXIuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUikpOwotCi0gICAgICAgIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7Ci0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUgOiB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgPQotICAgICAgICAgICAgICAgICAgICAoVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lKTsKLQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMuYWRkKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcik7Ci0KLSAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgbGF6eUluaXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgaWYgKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMgPSBuZXcgQXJyYXlMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPigpOwotCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IpOwotICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKHRoaXMuY29udGV4dEhlbHBlci5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SKSk7Ci0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7Ci0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUgOiBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yID0KLSAgICAgICAgICAgICAgICAgICAgKE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lKTsKLQotICAgICAgICAgICAgaWYgKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLmFkZChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0KLSAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBsYXp5SW5pdENvbXBvbmVudEluaXRpYWxpemVycygpCi0gICAgewotICAgICAgICBpZiAoY29tcG9uZW50SW5pdGlhbGl6ZXJzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycyA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+KCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9JTklUSUFMSVpFUik7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQodGhpcy5jb250ZXh0SGVscGVyLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9JTklUSUFMSVpFUikpOwotCi0gICAgICAgIENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyOwotICAgICAgICBmb3IgKFN0cmluZyBjb21wb25lbnRJbml0aWFsaXplck5hbWUgOiBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyID0KLSAgICAgICAgICAgICAgICAgICAgKENvbXBvbmVudEluaXRpYWxpemVyKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY29tcG9uZW50SW5pdGlhbGl6ZXJOYW1lKTsKLQotICAgICAgICAgICAgaWYgKGNvbXBvbmVudEluaXRpYWxpemVyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChjb21wb25lbnRJbml0aWFsaXplcik7Ci0KLSAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoY29tcG9uZW50SW5pdGlhbGl6ZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBsYXp5SW5pdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBpZiAocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+KCk7Ci0gICAgICAgIG1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0gbmV3IEhhc2hNYXA8Q2xhc3MsIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+PigpOwotCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgdmFsaWRhdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9QUk9QRVJUWV9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SKTsKLSAgICAgICAgdmFsaWRhdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQodGhpcy5jb250ZXh0SGVscGVyLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tSW5mb3JtYXRpb24uUFJPUEVSVFlfVkFMSURBVElPTl9JTlRFUkNFUFRPUikpOwotCi0gICAgICAgIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOwotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uSW50ZXJjZXB0b3JOYW1lIDogdmFsaWRhdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgPQotICAgICAgICAgICAgICAgICAgICAoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHZhbGlkYXRpb25JbnRlcmNlcHRvck5hbWUpOwotCi0gICAgICAgICAgICBpZiAocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uTW9kdWxlQXdhcmUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckZvck1vZHVsZXMocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUobnVsbCwgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHNvcnQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc29ydENvbXBvbmVudEluaXRpYWxpemVycygpCi0gICAgewotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRoaXMuY29tcG9uZW50SW5pdGlhbGl6ZXJzLCBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxDb21wb25lbnRJbml0aWFsaXplcj4oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNvcnRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcmVzdWx0KQotICAgIHsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChyZXN1bHQsIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRoaXMucHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzLAotICAgICAgICAgICAgICAgIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc29ydFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMsCi0gICAgICAgICAgICAgICAgbmV3IEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc29ydE1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKAotICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0KQotICAgIHsKLSAgICAgICAgaWYgKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdCwgbmV3IEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8T2JqZWN0PigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzb3J0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQodGhpcy5tZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMsCi0gICAgICAgICAgICAgICAgbmV3IEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+KCkpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzdjMTgwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFyZW4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICogKyBzb21lIG9mIHRoZW0gY2FuIGJlIGN1c3RvbWl6ZWQgd2l0aGluIGEgY3VzdG9tIGltcGwuIG9mIHRoZSBiZWFuDQotICogKGV4dGVuZCB0aGlzIGNsYXNzIGFuZCBwcm92aWRlIGl0IHZpYSBjb252ZW50aW9uIG9yIHdlYi54bWwpDQotICogPHAvPg0KLSAqIHRoZSBzdGF0aWMgYXBpIHNob3VsZCBvbmx5IGJlIHVzZWQNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSSwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVBTl9OQU1FID0gRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUNCi0gICAgICAgICsgIi4iICsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICAvL2N1c3RvbSBjbGFzcyB3aGljaCBpcyBhbiBvcHRpb25hbCByZXBsYWNlbWVudCBmb3IgdGhpcyBjbGFzcyAoaGFzIHRvIGV4dGVuZCB0aGlzIGNsYXNzKQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQkVBTiA9IChFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRQ0KLSAgICAgICAgKyAiLmN1c3RvbS4iICsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsNCi0NCi0gICAgcHVibGljIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHNldHVwQ3VzdG9taXphYmxlSW5mb3JtYXRpb24oKTsNCi0gICAgICAgIGFwcGx5Q3VzdG9tVmFsdWVzKHRoaXMuY3VzdG9taXphYmxlSW5mb3MpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPEN1c3RvbUluZm9ybWF0aW9uLCBTdHJpbmc+IGN1c3RvbWl6YWJsZUluZm9zID0gbmV3IEhhc2hNYXA8Q3VzdG9tSW5mb3JtYXRpb24sIFN0cmluZz4oKTsNCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwQ3VzdG9taXphYmxlSW5mb3JtYXRpb24oKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgYmFzZVBhY2thZ2UgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0JBU0VfUEFDS0FHRTsNCi0NCi0gICAgICAgIGlmIChiYXNlUGFja2FnZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VQYWNrYWdlID0gRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgKyAiLmN1c3RvbS4iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFiYXNlUGFja2FnZS5lbmRzV2l0aCgiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VQYWNrYWdlID0gYmFzZVBhY2thZ2UgKyAiLiI7DQotICAgICAgICB9DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQkFTRV9QQUNLQUdFLCBiYXNlUGFja2FnZSk7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uRVhUVkFMX0NPTlRFWFQsICJjdXN0b21FeHRWYWxDb250ZXh0Iik7DQotICAgICAgICANCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiwNCi0gICAgICAgICAgICAgICAgIkNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFUcmFuc2Zvcm1lciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX0lOSVRJQUxJWkVSLA0KLSAgICAgICAgICAgICAgICAiQ29tcG9uZW50SW5pdGlhbGl6ZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlBST1BFUlRZX1ZBTElEQVRJT05fSU5URVJDRVBUT1IsDQotICAgICAgICAgICAgICAgICJQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01TR19SRVNPTFZFUl9OQU1FX01BUFBFUiwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIsDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVJUVVBfTElTVEVORVIsDQotICAgICAgICAgICAgICAgICJTdGFydHVwTGlzdGVuZXIiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkZBQ0VTX01FU1NBR0VfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIkZhY2VzTWVzc2FnZUZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIlN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSIpOw0KLQ0KLSAgICAgICAgLy9jb252ZW50aW9ucyAodGhlIHJlc3Qgb2YgdGhlIGNvbnZlbnRpb25zIGFyZSBidWlsdCB3aXRoIHRoZSBoZWxwIG9mIG5hbWUgbWFwcGVycywuLi4NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX0JVTkRMRV9OQU1FLA0KLSAgICAgICAgICAgICAgICAidmFsaWRhdGlvbl9tZXNzYWdlcyIpOw0KLSAgICAgICAgLy9zdGF0aWMgc3RyYXRlZ3kgbWFwcGluZ3MgKG5hbWUgb2YgcHJvcGVydHkgZmlsZXMpDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFLA0KLSAgICAgICAgICAgICAgICAic3RyYXRlZ3lfbWFwcGluZ3MiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIsDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIiKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pDQotICAgIHByb3RlY3RlZCB2b2lkIGFwcGx5Q3VzdG9tVmFsdWVzKE1hcDxDdXN0b21JbmZvcm1hdGlvbiwgU3RyaW5nPiBtYXApDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgdG8gY3VzdG9taXplIGluZm9ybWF0aW9uDQotICAgIH0NCi0NCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXQoQ3VzdG9tSW5mb3JtYXRpb24gY3VzdG9tSW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGN1c3RvbWl6YWJsZUluZm9zLmdldChjdXN0b21JbmZvcm1hdGlvbik7DQotDQotICAgICAgICBzd2l0Y2ggKGN1c3RvbUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNhc2UgQkFTRV9QQUNLQUdFOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgY2FzZSBFWFRWQUxfQ09OVEVYVDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICogcG9zdGZpeCB1c2VkIGJ5IHRoZSBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgICAgICAgICAgICogdGhlIFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgaXMgZm9yIGN1c3RvbSBzdHJhdGVnaWVzIG9ubHkNCi0gICAgICAgICAgICAgKiAobm90IGZvciBwdWJsaWMgdmFsaWRhdGlvbiBtb2R1bGVzKQ0KLSAgICAgICAgICAgICAqIHNvIGl0J3MgZmluZSB0byBjdXN0b21pemUgaXQNCi0gICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICBjYXNlIFZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFX1JFU09MVkVSX1BPU1RGSVg6DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbWl6YWJsZUluZm9zLmdldChDdXN0b21JbmZvcm1hdGlvbi5CQVNFX1BBQ0tBR0UpICsgdmFsdWU7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5Zjg2OS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TW9kdWxlTWVzc2FnZUJ1bmRsZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbmV3UGFja2FnZU5hbWU7DQotICAgICAgICBpZiAocGFja2FnZU5hbWUuZW5kc1dpdGgoIi5yZXNvbHZlciIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5ld1BhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUucmVwbGFjZSgiLnJlc29sdmVyIiwgIi5idW5kbGUiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBuZXdQYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lLnJlcGxhY2UoIi5yZXNvbHZlci4iLCAiLmJ1bmRsZS4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXdQYWNrYWdlTmFtZSArICIudmFsaWRhdGlvbl9tZXNzYWdlcyI7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHVzZSBhIGN1c3RvbSBuYW1lIG1hcHBlciB0byBpbXBsZW1lbnQgY3VzdG9tIGNvbnZlbnRpb25zDQotICAgICAqLw0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VSZXNvbHZlckNsYXNzTmFtZSgNCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLCBTdHJpbmcgdGFyZ2V0Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLCAiLm1lc3NhZ2UucmVzb2x2ZXIuIiwgdGFyZ2V0Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKA0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsICIubWV0YWRhdGEudHJhbnNmb3JtZXIuIiwgdGFyZ2V0Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldFBhY2thZ2VOYW1lLCBTdHJpbmcgdGFyZ2V0Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0TmFtZSgpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLnJlcGxhY2UoIi5zdHJhdGVneS4iLCB0YXJnZXRQYWNrYWdlTmFtZSk7DQotDQotICAgICAgICBpZiAodGFyZ2V0Q2xhc3NOYW1lID09IG51bGwgfHwgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgPT0gLTEpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lDQotICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikpICsgIi4iICsgdGFyZ2V0Q2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB1c2UgYSBjdXN0b20gbmFtZSBtYXBwZXIgdG8gaW1wbGVtZW50IGN1c3RvbSBjb252ZW50aW9ucw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneU5hbWUsICJWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIiKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUtleS5yZXBsYWNlKCIuYW5ub3RhdGlvbi4iLCAiLnN0cmF0ZWd5LiIpICsgIlN0cmF0ZWd5IjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneU5hbWUsICJNZXRhRGF0YVRyYW5zZm9ybWVyIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgdGFyZ2V0UG9zdGZpeCkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUuZW5kc1dpdGgoIlZhbGlkYXRpb25TdHJhdGVneSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLnN1YnN0cmluZygwLCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLmxlbmd0aCgpIC0gMTgpICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUuZW5kc1dpdGgoIlN0cmF0ZWd5IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneU5hbWUuc3Vic3RyaW5nKDAsIHZhbGlkYXRpb25TdHJhdGVneU5hbWUubGVuZ3RoKCkgLSA4KSArIHRhcmdldFBvc3RmaXg7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArIHRhcmdldFBvc3RmaXg7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzRjYjdhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi0NCi1AVGFyZ2V0KFRZUEUpDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotLyoqDQotICogYWxsb3dlZCB0byB1c2UgZm9yIGNsYXNzZXMgd2hpY2ggaW1wbGVtZW50IGludGVyZmFjZXMgd2hpY2ggaGF2ZSB0aGUgbWFya2VyIEBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotICoNCi0gKiBzdWdnZXN0ZWQgcmFuZ2VzIChtYWlubHkgZm9yIG5hbWUtbWFwcGVycyk6DQotICogbmVnYXRpdmUgdmFsdWVzIGZvciAiZXh0cmVtZSIgY2FzZXMNCi0gKg0KLSAqIDAtNDkgZm9yIGN1c3RvbSBhcnRpZmFjdHMgd2hpY2ggc2hvdWxkIGhhdmUgdGhlIGhpZ2hlc3QgcHJpb3JpdHkNCi0gKiA1MC05OSBmb3IgYWRkLW9ucyB3aGljaCBwcm92aWRlIGFydGlmYWN0cyB3aGljaCBzaG91bGQgaGF2ZSBhIGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZSBkZWZhdWx0IGFydGlmYWN0cw0KLSAqIDEwMC05OTkgaW50ZXJuYWwgYXJ0aWZhY3RzDQotICogMTAwMCsgZm9yIGN1c3RvbSBhcnRpZmFjdHMNCi0gKg0KLSAqIHN1Z2dlc3RlZCByYW5nZXMgZm9yIGFydGlmYWN0cyBsaWtlIGludGVyY2VwdG9ycywuLi4NCi0gKiAxeHggLi4uIGFydGlmYWN0cyBvZiB0aGUgY29yZQ0KLSAqIDJ4eCAuLi4gYXJ0aWZhY3RzIG9mIHZhbGlkYXRpb24gbW9kdWxlcw0KLSAqIDN4eCAuLi4gYXJ0aWZhY3RzIG9mIGNvbXBvbmVudCBzdXBwb3J0IG1vZHVsZXMNCi0gKg0KLSAqIGEgcHJpb3JpdHkgc2hvdWxkIGJlIHVuaXF1ZSB3aXRoaW4gb25lIGFydGlmYWN0LXR5cGUgLSB0aGF0IG1lYW5zDQotICogaWYgYSBuYW1lLW1hcHBlciBoYXMgcHJpb3JpdHkgMTAwLCBpdCdzIG9rIHRoYXQgYW4gZXhjZXB0aW9uLWludGVyY2VwdG9yIGFsc28gaGFzIHByaW9yaXR5IDEwMC4NCi0gKiBidXQgYSAybmQgbmFtZS1tYXBwZXIgc2hvdWxkbid0IGhhdmUgcHJpb3JpdHkgMTAwDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1wdWJsaWMgQGludGVyZmFjZSBJbnZvY2F0aW9uT3JkZXINCi17DQotICAgIC8qKg0KLSAgICAgKiBkZWZhdWx0IHByaW9yaXR5IGZvciBjdXN0b20gYXJ0aWZhY3RzIChpZiB0aGV5IHNob3VsZCBnZXQgYWRkZWQgYWZ0ZXIgdGhlIGludGVybmFsIHZlcnNpb25zDQotICAgICAqIEByZXR1cm4gdGhlIHByaW9yaXR5IG9mIGFuIGFydGlmYWN0IGFubm90YXRlZCB3aXRoIHRoaXMgYW5ub3RhdGlvbg0KLSAgICAgKi8NCi0gICAgaW50IHZhbHVlKCkgZGVmYXVsdCAxMDAwOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlckNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NjYTFhNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPFQ+IGltcGxlbWVudHMgQ29tcGFyYXRvcjxUPg0KLXsNCi0gICAgcHVibGljIGludCBjb21wYXJlKFQgbm0xLCBUIG5tMikNCi0gICAgew0KLSAgICAgICAgaWYgKGhhc1ByaW9yaXR5KG5tMSkgJiYgaGFzUHJpb3JpdHkobm0yKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gaXNQcmlvcml0eUhpZ2hlcihubTEuZ2V0Q2xhc3MoKS5nZXRBbm5vdGF0aW9uKEludm9jYXRpb25PcmRlci5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICBubTIuZ2V0Q2xhc3MoKS5nZXRBbm5vdGF0aW9uKEludm9jYXRpb25PcmRlci5jbGFzcykpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFoYXNQcmlvcml0eShubTEpICYmICFoYXNQcmlvcml0eShubTIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGhhc1ByaW9yaXR5KG5tMSkgPyAtMSA6IDE7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBpbnQgaXNQcmlvcml0eUhpZ2hlcihJbnZvY2F0aW9uT3JkZXIgcHJpb3JpdHkxLCBJbnZvY2F0aW9uT3JkZXIgcHJpb3JpdHkyKQ0KLSAgICB7DQotICAgICAgICBpZiAocHJpb3JpdHkxLnZhbHVlKCkgPT0gcHJpb3JpdHkyLnZhbHVlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcHJpb3JpdHkxLnZhbHVlKCkgPCBwcmlvcml0eTIudmFsdWUoKSA/IC0xIDogMTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzUHJpb3JpdHkoT2JqZWN0IG5tKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbm0uZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KEludm9jYXRpb25PcmRlci5jbGFzcyk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlclN1cHBvcnQuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXJTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYjU3YWQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlclN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLQ0KLUBUYXJnZXQoVFlQRSkNCi1ARG9jdW1lbnRlZA0KLS8qKg0KLSAqIG1hcmtlciBhbm5vdGF0aW9uIGZvciBlYXNpZXIgdXNhZ2UNCi0gKiBpdCBtYXJrcyBpbnRlcmZhY2VzIC0gaW5zdGFuY2VzIG9mIGNsYXNzZXMgaW1wbGVtZW50aW5nIHRoZXNlIGludGVyZmFjZXMgd2lsbCBiZSBzb3J0ZWQNCi0gKiBAc2VlIEludm9jYXRpb25PcmRlckNvbXBhcmF0b3INCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLXB1YmxpYyBAaW50ZXJmYWNlIEludm9jYXRpb25PcmRlclN1cHBvcnQNCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9OZXN0ZWQuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9OZXN0ZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA2OTFlOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvTmVzdGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi0NCi0vKioNCi0gKiBtYXJrZXIgYW5ub3RhdGlvbiBlLmcuIHRvIG1hcmsgc3ViLW5hbWUtbWFwcGVycw0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBOZXN0ZWQNCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9WYWxpZGF0aW9uTW9kdWxlQXdhcmUuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9WYWxpZGF0aW9uTW9kdWxlQXdhcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkxNjhmYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvVmFsaWRhdGlvbk1vZHVsZUF3YXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi0vKioNCi0gKiBpZiBhbiBhcnRpZmFjdCAod2hpY2ggc3VwcG9ydHMgdGhpcyBjb25jZXB0KSBzaG91bGQgYmUgdXNlZCBqdXN0IGZvciBhL3NvbWUgc3BlY2lmaWMgbW9kdWxlKHMpLA0KLSAqIHRoZSBhcnRpZmFjdCBoYXMgdG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25Nb2R1bGVBd2FyZQ0KLXsNCi0gICAgLyoqDQotICAgICAqIGR1cmluZyB0aGUgcmVnaXN0cmF0aW9uIHByb2Nlc3MgdGhlIGluZm9ybWF0aW9uIGdldHMgZXZhbHVhdGVkPGJyLz4NCi0gICAgICogaW5zdGVhZCBvZiBhIGNsYXNzIGFycmF5IGEgc3RyaW5nIGFycmF5IGlzIHVzZWQgc28gdGhhdCBpdCdzIHBvc3NpYmxlIHRvIGltcGxlbWVudA0KLSAgICAgKiBhbiBhcnRpZmFjdCBmb3IgZGlmZmVyZW50IG1vZHVsZXMuIGlmIGFuIGFkZC1vbiByZXN0cmljdHMgYW4gYXJ0aWZhY3QgdG8gc3BlY2lmaWMgbW9kdWxlcywNCi0gICAgICogbm90IGFsbCBtb2R1bGVzIGhhdmUgdG8gYmUgdXNlZCBieSB0aGUgd2ViYXBwLiBpZiBhIG1vZHVsZSBrZXkgaXMgdW5rbm93biwgdGhlIGFydGlmYWN0IHdvbid0IGdldCByZWdpc3RlcmVkDQotICAgICAqIGZvciB0aGlzIG1vZHVsZS4gaWYgYW4gYXJ0aWZhY3QgZG9lc24ndCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UsIGl0IGdldHMgcmVnaXN0ZXJlZCBmb3IgYWxsIG1vZHVsZXMNCi0gICAgICoNCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZXMgb2YgdGhlIG1vZHVsZSBrZXlzDQotICAgICAqLw0KLSAgICBTdHJpbmdbXSBnZXRNb2R1bGVLZXlzKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE2NzRjYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcmVuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgLyoNCi0gICAgICogbWlzYw0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVTU0FHRV9CVU5ETEUgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVNTQUdFX0JVTkRMRSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX1BBQ0tBR0UgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9CQVNFX1BBQ0tBR0UiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fSU5GT1JNQVRJT05fUFJPVklERVJfQkVBTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OX1NUUkFURUdZX01BUFBJTkciKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fUFJPUEVSVFlfVkFMSURBVElPTl9JTlRFUkNFUFRPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1BST1BFUlRZX1ZBTElEQVRJT05fSU5URVJDRVBUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUiIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBuYW1lIG1hcHBlcg0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUiIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBmaWx0ZXINCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FVEFfREFUQV9TVE9SQUdFX0ZJTFRFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FVEFfREFUQV9TVE9SQUdFX0ZJTFRFUiIpOw0KLSAgICANCi0gICAgLyoNCi0gICAgICogZmFjdG9yaWVzDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1NUT1JBR0VfTUFOQUdFUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0ZBQ0VTX01FU1NBR0VfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0ZBQ0VTX01FU1NBR0VfRkFDVE9SWSIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBkZWFjdGl2YXRlDQotICAgICAqLw0KLSAgICBARGVwcmVjYXRlZA0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfUkVOREVSS0lUID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1JFTkRFUktJVCIpOw0KLQ0KLSAgICAvL2N1cnJlbnRseSBqdXN0IHVzZWQgYnkgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0RFRkFVTFRfQ09OVkVOVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT04iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0RFRkFVTFRfTkFNRV9NQVBQRVJTID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0RFRkFVTFRfTkFNRV9NQVBQRVJTIik7DQotICAgIA0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfRUxfUkVTT0xWRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfRUxfUkVTT0xWRVIiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0NPTVBPTkVOVF9JTklUSUFMSVpBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9DT01QT05FTlRfSU5JVElBTElaQVRJT04iKTsNCi0NCi0gICAgLy90aGVyZSBpcyBub3RoaW5nIGxpa2UgREVBQ1RJVkFURV9ERUZBVUxUX1ZBTElEQVRJT05fSU5URVJDRVBUT1INCi0gICAgLy91c2UgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZGVueVJlbmRlcmVySW50ZXJjZXB0b3IoLi4uKSB3aXRoaW4gYW4gZXh0dmFsLVN0YXJ0dXBMaXN0ZW5lcg0KLQ0KLSAgICAvL3RvIGRpc3BsYXkgYWxsIHZpb2xhdGlvbnMgdmlhIHRoZSBtZXNzYWdlcy10YWcgb3IgdG8gdXNlIHRoZSBuZXcganNmIDIuMCBzdXBwb3J0DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZBVEVfTVVMVElQTEVfVklPTEFUSU9OX01FU1NBR0VTX1BFUl9GSUVMRCA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQUNUSVZBVEVfTVVMVElQTEVfVklPTEFUSU9OX01FU1NBR0VTX1BFUl9GSUVMRCIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBzcGVjIHBhcmFtZXRlcnMNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJQUkVUX0VNUFRZX1NUUklOR19TVUJNSVRURURfVkFMVUVTX0FTX05VTEwgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoImphdmF4LmZhY2VzIiwgIklOVEVSUFJFVF9FTVBUWV9TVFJJTkdfU1VCTUlUVEVEX1ZBTFVFU19BU19OVUxMIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVEVfRU1QVFlfRklFTERTID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJqYXZheC5mYWNlcyIsICJWQUxJREFURV9FTVBUWV9GSUVMRFMiKTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0Fic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE0M2YyNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBkZXRhaWxzDQotICogQHNlZSBEZWZhdWx0RUxIZWxwZXINCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5IGN1c3RvbUVMSGVscGVyRmFjdG9yeTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21FTEhlbHBlckZhY3RvcnkoQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkgZWxIZWxwZXJGYWN0b3J5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmN1c3RvbUVMSGVscGVyRmFjdG9yeSA9IGVsSGVscGVyRmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgZmluYWwgRUxIZWxwZXIgY3JlYXRlKCkNCi0gICAgew0KLSAgICAgICAgRUxIZWxwZXIgcmVzdWx0ID0gbnVsbDsNCi0NCi0gICAgICAgIGlmKHRoaXMuY3VzdG9tRUxIZWxwZXJGYWN0b3J5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5jdXN0b21FTEhlbHBlckZhY3RvcnkuY3JlYXRlRUxIZWxwZXIoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVFTEhlbHBlcigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRUxIZWxwZXIgY3JlYXRlRUxIZWxwZXIoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmVjZTJkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsNCi1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7DQotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBpbiBvcmRlciB0byBjZW50cmFsaXplIHRoZSBqc2YgdmVyc2lvbiBkZXBlbmRlbmN5IHdpdGhpbiB0aGUgY29yZQ0KLSAqDQotICogdGhpcyBlbC1oZWxwZXIgc3VwcG9ydHMganNwIGFuZCBmYWNlbGV0cyAodGVzdGVkIHdpdGggMS4xLjE0KQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotLyoNCi0gKiB0aGVyZSBpcyBhIHNwZWNpYWwgZmFjZWxldHMgd29ya2Fyb3VuZCBmb3IgZWwtZXhwcmVzc2lvbnMgb2YgY3VzdG9tIGNvbXBvbmVudHMNCi0gKiBpdCdzIHBsdWdnYWJsZSBpbiBvcmRlciB0byBzdXBwb3J0IHNwZWNpYWwgbWVjaGFuaXNtcyBvZiBkaWZmZXJlbnQgdGVjaG5vbG9naWVzICh0aGFuIGpzcCBhbmQgZmFjZWxldHMpDQotICogc28geW91IGNhbiBwbHVnIGluIHlvdXIgb3duIGltcGwuIHdoaWNoIGltcGxlbWVudHMgYSBjdXN0b20gd29ya2Fyb3VuZCAobGlrZSB0aGUgZmFjZWxldHMgd29ya2Fyb3VuZCBvZiB0aGlzIGltcGwuKQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRFTEhlbHBlciBpbXBsZW1lbnRzIEVMSGVscGVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9FTF9SRVNPTFZFUiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0VMX1JFU09MVkVSOw0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdEVMSGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIC8vZHVlIHRvIGEgcmVzdHJpY3Rpb24gd2l0aCB0aGUgcmkNCi0gICAgICAgIE9iamVjdCBiZWFuID0gZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIHJldHVybiAoYmVhbiAhPSBudWxsKSA/IGJlYW4uZ2V0Q2xhc3MoKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRCZWFuKFN0cmluZyBiZWFuTmFtZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIHJldHVybiBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5nZXRFTFJlc29sdmVyKCkuZ2V0VmFsdWUoZmFjZXNDb250ZXh0LmdldEVMQ29udGV4dCgpLCBudWxsLCBiZWFuTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uICE9IG51bGwpID8gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZXZhbHVhdGVFeHByZXNzaW9uR2V0KA0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksIE9iamVjdC5jbGFzcykgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmV2YWx1YXRlRXhwcmVzc2lvbkdldChmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIE9iamVjdC5jbGFzcyk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQsIGJvb2xlYW4gYWxsb3dCbGFua0NoYXJhY3RlcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIC8vZm9yIGlucHV0IGNvbXBvbmVudHMgd2l0aG91dCB2YWx1ZS1iaW5kaW5nDQotICAgICAgICAvLyhlLmcuIGZvciBzcGVjaWFsIGNvbXBvbmVudCBsaWJzIC0+IGlzc3VlIHdpdGggRXh0VmFsUmVuZGVyZXJXcmFwcGVyI2VuY29kZUJlZ2luKQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudC5nZXRDbGFzcygpICsgIiBoYXMgbm8gdmFsdWUgYmluZGluZyAtIGNvbXBvbmVudCBpZDogIiArIHVpQ29tcG9uZW50LmdldElkKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKCFhbGxvd0JsYW5rQ2hhcmFjdGVycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlKCIgIiwgIiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pLmdldEJhc2VFeHByZXNzaW9uKCkpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXN1bHQgPSBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuDQotICAgICAgICAgICAgICAgIHRyeVRvQ3JlYXRlVmFsdWVCaW5kaW5nRm9yRmFjZWxldHNCaW5kaW5nKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCByZXNvbHZlIGV4cHJlc3Npb246ICIgKyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgIC5nZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgcmVzdWx0LmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLQ0KLSAgICAgICAgICAgIGlmKGVudGl0eUNsYXNzID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgcmVzb2x2ZSBleHByZXNzaW9uOiAiICsgcmVzdWx0LmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYoInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoREVBQ1RJVkFURV9FTF9SRVNPTFZFUikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5RGV0YWlsc1ZpYVJlZmxlY3Rpb25GYWxsYmFjayh1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgRXh0VmFsRUxSZXNvbHZlciBlbFJlc29sdmVyID0gbmV3IEV4dFZhbEVMUmVzb2x2ZXIoZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZ2V0RUxSZXNvbHZlcigpKTsNCi0gICAgICAgIEVMQ29udGV4dCBlbENvbnRleHQgPSBFeHRWYWxFTFJlc29sdmVyLmNyZWF0ZUNvbnRleHRXcmFwcGVyKGZhY2VzQ29udGV4dC5nZXRFTENvbnRleHQoKSwgZWxSZXNvbHZlcik7DQotDQotICAgICAgICBWYWx1ZUV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uID0gdWlDb21wb25lbnQuZ2V0VmFsdWVFeHByZXNzaW9uKCJ2YWx1ZSIpOw0KLQ0KLSAgICAgICAgaWYodmFsdWVFeHByZXNzaW9uID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWx1ZUV4cHJlc3Npb24uc2V0VmFsdWUoZWxDb250ZXh0LCBudWxsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAiZXJyb3IgYXQgYmluZGluZzogIiArIHZhbHVlRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkgKw0KLSAgICAgICAgICAgICAgICAiIC0tIGFuIGVsLXJlc29sdmVyIGVycm9yIG9jY3VycmVkISBtYXliZSB5b3UgdXNlZCBhbiBpbnZhbGlkIGJpbmRpbmcuIG90aGVyd2lzZTogIiArDQotICAgICAgICAgICAgICAgICJwbGVhc2UgcmVwb3J0IHRoZSBpc3N1ZSwgZGVhY3RpdmF0ZSB0aGUgZWwtcmVzb3ZsZXIgb2YgZXh0dmFsIHZpYSB3ZWIueG1sIGNvbnRleHQtcGFyYW06ICIgKw0KLSAgICAgICAgICAgICAgICBFeHRWYWxJbmZvcm1hdGlvbi5XRUJYTUxfUEFSQU1fUFJFRklYICsgIi5ERUFDVElWQVRFX0VMX1JFU09MVkVSIiArDQotICAgICAgICAgICAgICAgICIgYW5kIHRlc3QgYWdhaW4uIiwgdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihlbFJlc29sdmVyLmdldFBhdGgoKSA9PSBudWxsIHx8IGVsUmVzb2x2ZXIuZ2V0QmFzZU9iamVjdCgpID09IG51bGwgfHwgZWxSZXNvbHZlci5nZXRQcm9wZXJ0eSgpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscyhlbFJlc29sdmVyLmdldFBhdGgoKSwgZWxSZXNvbHZlci5nZXRCYXNlT2JqZWN0KCksIGVsUmVzb2x2ZXIuZ2V0UHJvcGVydHkoKSk7DQotICAgIH0NCi0NCi0gICAgLy9rZWVwIGluIHN5bmMgd2l0aCBEZWZhdWx0RUxIZWxwZXIjZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcgb2YgYnJhbmNoISEhDQotICAgIHByb3RlY3RlZCBQcm9wZXJ0eURldGFpbHMgZ2V0UHJvcGVydHlEZXRhaWxzVmlhUmVmbGVjdGlvbkZhbGxiYWNrKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gZ2V0VmFsdWVCaW5kaW5nRXhwcmVzc2lvbih1aUNvbXBvbmVudCwgZmFsc2UpOw0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9DQotICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHBhdGggPSBudWxsOw0KLQ0KLSAgICAgICAgd2hpbGUoY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHBhdGggPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHBhdGggPSBnZXRQcm9wZXJ0eU5hbWUoY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwYXRoID0gZ2V0UHJvcGVydHlOYW1lKGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKSArICIuIiArIHBhdGg7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBhdGggPSBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpICsgIi4iICsgcGF0aDsNCi0NCi0gICAgICAgIE9iamVjdCBiYXNlT2JqZWN0ID0gZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLQ0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGUuZy46ICN7YmVhbltiZWFuLnBhc3N3b3JkUmVwZWF0ZWRQcm9wZXJ0eU5hbWVdfQ0KLSAgICAgICAgLy8tPiBiZWFuLnBhc3N3b3JkUmVwZWF0ZWRQcm9wZXJ0eU5hbWUgaXMgbm90IHRoZSBmaW5hbCBwcm9wZXJ0eSBuYW1lDQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscyhwYXRoLCBiYXNlT2JqZWN0LCBnZXRQcm9wZXJ0eU5hbWUodmFsdWVCaW5kaW5nRXhwcmVzc2lvbikpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldFByb3BlcnR5TmFtZShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCk7DQotDQotICAgICAgICBpZihwcm9wZXJ0eU5hbWUuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBleHRyYWN0UHJvcGVydHlOYW1lT2ZQcm9wZXJ0eVBhdGgocHJvcGVydHlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInN1cHBvcnQgZm9yIG1vcmUgZHluYW1pYyBiaW5kaW5ncyAtIGRldGFpbHMgc2VlIGlubGluZSIpDQotICAgIHByaXZhdGUgU3RyaW5nIGV4dHJhY3RQcm9wZXJ0eU5hbWVPZlByb3BlcnR5UGF0aChTdHJpbmcgcHJvcGVydHlDaGFpbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nW10gcHJvcGVydGllcyA9IHByb3BlcnR5Q2hhaW4uc3BsaXQoIlxcLiIpOw0KLQ0KLSAgICAgICAgT2JqZWN0IGN1cnJlbnRQcm9wZXJ0eVZhbHVlID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKHByb3BlcnRpZXNbMF0pOw0KLQ0KLSAgICAgICAgTWV0aG9kIGN1cnJlbnRNZXRob2Q7DQotICAgICAgICBTdHJpbmcgY3VycmVudFByb3BlcnR5TmFtZTsNCi0gICAgICAgIGZvcihpbnQgaSA9IDE7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0aWVzW2ldOw0KLSAgICAgICAgICAgIGN1cnJlbnRNZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoY3VycmVudFByb3BlcnR5VmFsdWUuZ2V0Q2xhc3MoKSwNCi0gICAgICAgICAgICAgICAgImdldCIgKyBjdXJyZW50UHJvcGVydHlOYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgY3VycmVudFByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMSkpOw0KLQ0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRNZXRob2QgPT0gbnVsbCAmJiBjdXJyZW50UHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIE1hcCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vaXQncyBvayBmb3IgdGhlIHNpbXBsZSBtYXAgY2FzZSAtIGJ1dCBub3QgZm9yIGUuZy46DQotICAgICAgICAgICAgICAgIC8vI3tiZWFuMVtiZWFuMi5wcm9wZXJ0eU5hbWVQcm92aWRlclsgYmVhbjMuaW5kZXhdXX0NCi0gICAgICAgICAgICAgICAgLy9vciBldmVyeSBvdGhlciBjb21wbGV4IHJlcGxhY2VtZW50IGZvciBiZWFuMy5pbmRleA0KLSAgICAgICAgICAgICAgICAvL2l0IG1pZ2h0IGFsc28gcmVxdWlyZSBhbiBhZGp1c3RtZW50IGF0IEZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlciN0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcNCi0gICAgICAgICAgICAgICAgKChNYXApY3VycmVudFByb3BlcnR5VmFsdWUpLmdldChjdXJyZW50UHJvcGVydHlOYW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudFByb3BlcnR5VmFsdWUgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoY3VycmVudFByb3BlcnR5VmFsdWUsIGN1cnJlbnRNZXRob2QpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGN1cnJlbnRQcm9wZXJ0eVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKWN1cnJlbnRQcm9wZXJ0eVZhbHVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRXJyb3JFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigidW5leHBlY3RlZCB2YWx1ZSB3aXRoaW4gbWFwIHN5bnRheDogIiArIHByb3BlcnR5Q2hhaW4gKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICIgbGFzdCBwcm9wZXJ0eSBuYW1lOiAiICsgY3VycmVudFByb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBzdGF0aWMgU3RyaW5nIGdldE9yaWdpbmFsVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgVmFsdWVFeHByZXNzaW9uIHZhbHVlRXhwcmVzc2lvbiA9IHVpQ29tcG9uZW50LmdldFZhbHVlRXhwcmVzc2lvbigidmFsdWUiKTsNCi0NCi0gICAgICAgIHJldHVybiAodmFsdWVFeHByZXNzaW9uICE9IG51bGwpID8gdmFsdWVFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFTFRlcm1XZWxsRm9ybWVkKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFZhbHVlQmluZGluZyB8fCBvIGluc3RhbmNlb2YgRXh0ZXJuYWxpemFibGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIHMgPSBvLnRvU3RyaW5nKCk7DQotICAgICAgICByZXR1cm4gKChzLmNvbnRhaW5zKCIjIikgfHwgcy5jb250YWlucygiJCIpKSAmJiBzLmNvbnRhaW5zKCJ7IikgJiYgcy5jb250YWlucygifSIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJpbmRpbmdPZkNvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudC5nZXRWYWx1ZUV4cHJlc3Npb24obmFtZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZmU1NmMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEVMSGVscGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5DQotew0KLSAgICBwcml2YXRlIEVMSGVscGVyIGVsSGVscGVyID0gbmV3IERlZmF1bHRFTEhlbHBlcigpOw0KLSAgICANCi0gICAgcHJvdGVjdGVkIEVMSGVscGVyIGNyZWF0ZUVMSGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZWxIZWxwZXI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRUxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGViMjU1My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRUxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBpbiBvcmRlciB0byBjZW50cmFsaXplIHRoZSBqc2YgdmVyc2lvbiBkZXBlbmRlbmN5IHdpdGhpbiB0aGUgY29yZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBFTEhlbHBlcg0KLXsNCi0gICAgT2JqZWN0IGdldEJlYW4oU3RyaW5nIGJlYW5OYW1lKTsNCi0NCi0gICAgT2JqZWN0IGdldFZhbHVlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIENsYXNzIGdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0NCi0gICAgUHJvcGVydHlEZXRhaWxzIGdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KTsNCi0NCi0gICAgYm9vbGVhbiBpc0VMVGVybVZhbGlkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0NCi0gICAgYm9vbGVhbiBpc0VMVGVybVdlbGxGb3JtZWQoT2JqZWN0IG8pOw0KLQ0KLSAgICBPYmplY3QgZ2V0QmluZGluZ09mQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBTdHJpbmcgbmFtZSk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FeHRWYWxFTFJlc29sdmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRXh0VmFsRUxSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWEwMmM5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FeHRWYWxFTFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmVsLkVMUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0OwotaW1wb3J0IGphdmF4LmVsLlZhcmlhYmxlTWFwcGVyOwotaW1wb3J0IGphdmF4LmVsLkZ1bmN0aW9uTWFwcGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS5iZWFucy5GZWF0dXJlRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1wdWJsaWMgY2xhc3MgRXh0VmFsRUxSZXNvbHZlciBleHRlbmRzIEVMUmVzb2x2ZXIKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBFTFJlc29sdmVyIHdyYXBwZWQ7Ci0gICAgcHJpdmF0ZSBPYmplY3QgYmFzZU9iamVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKLSAgICAvL2Zvcm1zIHRoZSBpZCBmb3IgY3Jvc3MtdmFsaWRhdGlvbiB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXhwcmVzc2lvbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQYXRoUmVjb3JkaW5nU3RvcHBlZCA9IGZhbHNlOwotCi0gICAgcHVibGljIEV4dFZhbEVMUmVzb2x2ZXIoRUxSZXNvbHZlciBlbFJlc29sdmVyKQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gZWxSZXNvbHZlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJhc2VPYmplY3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJhc2VPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJleHRyYWN0ZWQgcGF0aDogIiArIHRoaXMuZXhwcmVzc2lvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpCi0gICAgewotICAgICAgICB0aGlzLmJhc2VPYmplY3QgPSBudWxsOwotICAgICAgICB0aGlzLnByb3BlcnR5ID0gbnVsbDsKLSAgICAgICAgdGhpcy5leHByZXNzaW9uID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBwYXRoIHJlY29yZGluZyBpcyBwZXJmb3JtZWQgdG8gZ2V0IGEga2V5IGZvciBjcm9zcy12YWxpZGF0aW9uPGJyLz4KLSAgICAgKiBldmVyeSBiYXNlIGFmdGVyIHRoZSBmaXJzdCBjYWxsIHdoaWNoIGlzIG51bGwgc3RvcHMgcmVjb3JkaW5nPGJyLz4KLSAgICAgKiB3aXRoIGEgZHluYW1pYyBtYXAgc3ludGF4IHRoZSBsYXN0IHByb3BlcnR5IGluIHRoZSBtaWRkbGUgb2YgYW4gZXhwcmVzc2lvbiBoYXMgdG8gYmUgYSBzdHJpbmcuCi0gICAgICogc3VjaCBhIHN0cmluZyByZXN1bHQgY29udGludWVzIHRoZSBwYXRoIHJlY29yZGluZyBhdCB0aGUgbmV4dCBjYWxsIGZvciB0aGUgY3VycmVudCBleHByZXNzaW9uLgotICAgICAqIDxwLz4KLSAgICAgKiBleGFtcGxlOiAje2JlYW5bYmVhbi5wcm9wZXJ0eU5hbWVQcm92aWRlclsnbmFtZU9mUHJvcGVydHkxJ11dWydkeW5CZWFuJ10ucHJvcGVydHl9Ci0gICAgICogPHAvPgotICAgICAqIGxpbWl0YXRpb24gZm9yIGNyb3NzLXZhbGlkYXRpb246IG5hbWVPZlByb3BlcnR5MSBoYXMgdG8gYmUgb2YgdHlwZSBzdHJpbmcuCi0gICAgICogb3RoZXIga2V5IHR5cGVzIGFyZW4ndCBzdXBwb3J0ZWQgeWV0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxDb250ZXh0IHdyYXBwZWQgZWwtY29udGV4dAotICAgICAqIEBwYXJhbSBiYXNlIGN1cnJlbnQgYmFzZQotICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBwcm9wZXJ0eSB0byByZXNvbHZlCi0gICAgICogQHJldHVybiByZXN1bHQgb2YgdGhlIGRlbGVnYXRlZCBtZXRob2QgY2FsbAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoRUxDb250ZXh0IGVsQ29udGV4dCwgT2JqZWN0IGJhc2UsIE9iamVjdCBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIE9iamVjdCByZXN1bHQgPSB0aGlzLndyYXBwZWQuZ2V0VmFsdWUoZWxDb250ZXh0LCBiYXNlLCBwcm9wZXJ0eSk7Ci0KLSAgICAgICAgLy92ZXJ5IGZpcnN0IGNhbGwgZm9yIGFuIGV4cHJlc3Npb24KLSAgICAgICAgaWYodGhpcy5leHByZXNzaW9uID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IChTdHJpbmcpcHJvcGVydHk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8je2JlYW5bZHluQmFzZS5wcm9wZXJ0eU5hbWVdfSAtPiBiYXNlIG9mIGR5bkJhc2UgaXMgbnVsbCAtPiBzdG9wIHBhdGggcmVjb3JkaW5nCi0gICAgICAgIGVsc2UgaWYoYmFzZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmlzUGF0aFJlY29yZGluZ1N0b3BwZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBwcm9wZXJ0eUV4aXN0cyA9IGZhbHNlOwotICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihiYXNlIGluc3RhbmNlb2YgTWFwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoKChNYXApYmFzZSkuY29udGFpbnNLZXkocHJvcGVydHkpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZihiYXNlLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJnZXQiICsgcHJvcGVydHlOYW1lKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGJhc2UuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImlzIiArIHByb3BlcnR5TmFtZSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZTEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgicHJvcGVydHk6ICIgKyBwcm9wZXJ0eSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaXNuJ3QgdXNlZCBmb3IgcGF0aCAtIGl0IGlzbid0IGEgcHJvcGVydHkgb2YgIiArIGJhc2UuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vZS5nLjogI3tiZWFuLnN1YkJhc2UucHJvcGVydHl9IC0+IGhlcmUgd2UgYXJlIGF0IHN1YkJhc2UKLSAgICAgICAgICAgIGlmKHByb3BlcnR5RXhpc3RzICYmICF0aGlzLmlzUGF0aFJlY29yZGluZ1N0b3BwZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uICs9ICIuIiArIHByb3BlcnR5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihwcm9wZXJ0eUV4aXN0cyAmJiByZXN1bHQgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc1BhdGhSZWNvcmRpbmdTdG9wcGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICBpZih0aGlzLmlzUGF0aFJlY29yZGluZ1N0b3BwZWQgJiYgcmVzdWx0IGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gKz0gIi4iICsgcHJvcGVydHk7Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzczw/PiBnZXRUeXBlKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvLCBPYmplY3QgbzEpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRUeXBlKGVsQ29udGV4dCwgbywgbzEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvLCBPYmplY3QgbzEsIE9iamVjdCBvMikKLSAgICB7Ci0gICAgICAgIGV4cHJlc3Npb24gKz0gIi4iICsgbzE7Ci0gICAgICAgIHByb3BlcnR5ID0gKFN0cmluZylvMTsKLSAgICAgICAgYmFzZU9iamVjdCA9IG87Ci0gICAgICAgIGVsQ29udGV4dC5zZXRQcm9wZXJ0eVJlc29sdmVkKHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoRUxDb250ZXh0IGVsQ29udGV4dCwgT2JqZWN0IG8sIE9iamVjdCBvMSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmlzUmVhZE9ubHkoZWxDb250ZXh0LCBvLCBvMSk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yPEZlYXR1cmVEZXNjcmlwdG9yPiBnZXRGZWF0dXJlRGVzY3JpcHRvcnMoRUxDb250ZXh0IGVsQ29udGV4dCwgT2JqZWN0IG8pCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRGZWF0dXJlRGVzY3JpcHRvcnMoZWxDb250ZXh0LCBvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0Q29tbW9uUHJvcGVydHlUeXBlKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q29tbW9uUHJvcGVydHlUeXBlKGVsQ29udGV4dCwgbyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFTENvbnRleHQgY3JlYXRlQ29udGV4dFdyYXBwZXIoZmluYWwgRUxDb250ZXh0IGNvbnRleHQsIGZpbmFsIEVMUmVzb2x2ZXIgcmVzb2x2ZXIpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEVMQ29udGV4dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIExvY2FsZSBnZXRMb2NhbGUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldExvY2FsZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5UmVzb2x2ZWQoYm9vbGVhbiB2YWx1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlci5zZXRQcm9wZXJ0eVJlc29sdmVkKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldFByb3BlcnR5UmVzb2x2ZWQodmFsdWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHB1dENvbnRleHQoQ2xhc3MgY2xhenosIE9iamVjdCBvYmplY3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIucHV0Q29udGV4dChjbGF6eiwgb2JqZWN0KTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnB1dENvbnRleHQoY2xhenosIG9iamVjdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRDb250ZXh0KENsYXNzIGNsYXp6KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldENvbnRleHQoY2xhenopOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jYWxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyLnNldExvY2FsZShsb2NhbGUpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0TG9jYWxlKGxvY2FsZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEVMUmVzb2x2ZXIgZ2V0RUxSZXNvbHZlcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBGdW5jdGlvbk1hcHBlciBnZXRGdW5jdGlvbk1hcHBlcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0RnVuY3Rpb25NYXBwZXIoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgVmFyaWFibGVNYXBwZXIgZ2V0VmFyaWFibGVNYXBwZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldFZhcmlhYmxlTWFwcGVyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMmI4OWYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0ZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0Ow0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi0vKioNCi0gKiBIZWxwZXIgY2xhc3MgdG8gZ2V0IHRoZSByZWFsL2Z1bGwgdmFsdWUgYmluZGluZyAtIHRlc3RlZCB3aXRoIGZhY2VsZXRzIDEuMS4xNA0KLSAqIFRoZSB0YXJnZXQgaXMgdG8gZ2V0IHJpZCBvZiB0aGlzIGltcGwuIC0gY3VycmVudGx5IGl0J3MgYSB3b3JrYXJvdW5kIHRvIHN1cHBvcnQgY3VzdG9tIGZhY2VsZXRzIGNvbXBvbmVudHMuDQotICogQW4gYWx0ZXJuYXRpdmUgd291bGQgYmUgYW4gRUwtUmVzb2x2ZXIgLSB0aGVyZSBhcmUgc3RpbGwgc29tZSBvcGVuIGlzc3VlcyB3aXRoIHN1Y2ggYW4gYXBwcm9hY2gNCi0gKiArIEl0IGlzbid0IGF2YWlsYWJsZSB3aXRoIEpTRiAxLjEueA0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB0cnlUb0NyZWF0ZVZhbHVlQmluZGluZ0ZvckZhY2VsZXRzQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGZhY2VsZXRzVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IERlZmF1bHRFTEhlbHBlci5nZXRPcmlnaW5hbFZhbHVlQmluZGluZ0V4cHJlc3Npb24odWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGZvdW5kQmluZGluZ3MgPSBleHRyYWN0RUxUZXJtcygNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCaW5kaW5nT2ZDb21wb25lbnQodWlDb21wb25lbnQsICJ2YWx1ZSIpKTsNCi0NCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcHBlZEZhY2VsZXRzVmFycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmJlPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24NCi0gICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgMSkgKyAieyIgKyBjcmVhdGVCaW5kaW5nKGZvdW5kQmluZGluZ3MsIG1hcHBlZEZhY2VsZXRzVmFycykgKyAifSIpOw0KLQ0KLSAgICAgICAgICAgIENsYXNzIGVudGl0eUNsYXNzID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZiZS5nZXRCYXNlRXhwcmVzc2lvbigpKTsNCi0NCi0gICAgICAgICAgICBpZihlbnRpdHlDbGFzcyA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRyeVRvUmVwbGFjZVZhcnModmJlLCBtYXBwZWRGYWNlbGV0c1ZhcnMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gdmJlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNyZWF0ZUJpbmRpbmcoTGlzdDxTdHJpbmc+IGV4cHJlc3Npb25zLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHZpcnR1YWxWYXJzKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VycmVudEJpbmRpbmc7DQotDQotICAgICAgICBpbnQgaW5kZXhPZkJpbmRpbmdEZXRhaWxzOw0KLSAgICAgICAgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBleHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aCgiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZvdW5kQmluZGluZ0RldGFpbHMgPSBlbnRyeS5zcGxpdCgiICIpOw0KLSAgICAgICAgICAgIGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoZm91bmRCaW5kaW5nRGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9PSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBiaW5kaW5nRGV0YWlscyA9IGZvdW5kQmluZGluZ0RldGFpbHNbaW5kZXhPZkJpbmRpbmdEZXRhaWxzXS5zcGxpdCgiPSIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nRGV0YWlscy5sZW5ndGggPCAyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYmluZGluZ0RldGFpbHNbMV07DQotDQotICAgICAgICAgICAgLy90byBzdXBwb3J0IGJsYW5rcyB3aXRoaW4gYSBiaW5kaW5nIHdpdGggbWFwIHN5bnRheA0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgJiYgIWN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoY3VycmVudEJpbmRpbmcsIGZvdW5kQmluZGluZ0RldGFpbHMsIGluZGV4T2ZCaW5kaW5nRGV0YWlscyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9lbnRyeSBmb3IgInZpcnR1YWwiIGZhY2VsZXRzIGJlYW5zDQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWluc0tleShiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLnB1dChiaW5kaW5nRGV0YWlsc1swXSwgY3VycmVudEJpbmRpbmcpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICBpZighKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgfHwgY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2aXJ0dWFsVmFycy5wdXQoYmluZGluZ0RldGFpbHNbMF0sIGJpbmRpbmdEZXRhaWxzWzFdLnN1YnN0cmluZygxLCBiaW5kaW5nRGV0YWlsc1sxXS5sZW5ndGgoKS0yKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIG9yaWdpbmFsQmluZGluZyA9IGFkZGVkVmlydHVhbE5hbWVzLmdldCgidmFsdWUiKTsNCi0gICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5zdWJzdHJpbmcob3JpZ2luYWxCaW5kaW5nLmluZGV4T2YoInsiKSArIDEsIG9yaWdpbmFsQmluZGluZy5pbmRleE9mKCJ9IikpOw0KLSAgICAgICAgYWRkZWRWaXJ0dWFsTmFtZXMucmVtb3ZlKCJ2YWx1ZSIpOw0KLSAgICAgICAgcmV0dXJuIHRyeVRvVHJhbnNmb3JtVG9SZWFsQmluZGluZyhvcmlnaW5hbEJpbmRpbmcsIGFkZGVkVmlydHVhbE5hbWVzLCB2aXJ0dWFsVmFycyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRyeVRvVHJhbnNmb3JtVG9SZWFsQmluZGluZygNCi0gICAgICAgICAgICBTdHJpbmcgb3JpZ2luYWxCaW5kaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZGVkVmlydHVhbE5hbWVzLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHZpcnR1YWxWYXJzKQ0KLSAgICB7DQotICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSAiI3siICsgb3JpZ2luYWxCaW5kaW5nICsgIn0iOw0KLSAgICAgICAgSXRlcmF0b3IgbmFtZUl0ZXJhdG9yID0gYWRkZWRWaXJ0dWFsTmFtZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsNCi0NCi0gICAgICAgIFN0cmluZyBjdXJyZW50S2V5Ow0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRWYWx1ZTsNCi0gICAgICAgIHdoaWxlKG5hbWVJdGVyYXRvci5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudEtleSA9IChTdHJpbmcpIG5hbWVJdGVyYXRvci5uZXh0KCk7DQotDQotICAgICAgICAgICAgY3VycmVudFZhbHVlID0gYWRkZWRWaXJ0dWFsTmFtZXMuZ2V0KGN1cnJlbnRLZXkpOw0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoY3VycmVudFZhbHVlLmluZGV4T2YoInsiKSArIDEsIGN1cnJlbnRWYWx1ZS5pbmRleE9mKCJ9IikpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJ7IiArIGN1cnJlbnRLZXkgKyAiLiIsICJ7IiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoInsiICsgY3VycmVudEtleSArICJbIiwgInsiICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiLiIgKyBjdXJyZW50S2V5ICsgIi4iLCAiLiIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCIuIiArIGN1cnJlbnRLZXkgKyAiWyIsICIuIiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIlsiICsgY3VycmVudEtleSArICJdIiwgIlsnIiArIGN1cnJlbnRWYWx1ZSArICInXSIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiWyIsICJbIiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIlsiICsgY3VycmVudEtleSArICIuIiwgIlsiICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG5hbWVJdGVyYXRvciA9IHZpcnR1YWxWYXJzLmtleVNldCgpLml0ZXJhdG9yKCk7DQotDQotICAgICAgICB3aGlsZShuYW1lSXRlcmF0b3IuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRLZXkgPSAoU3RyaW5nKSBuYW1lSXRlcmF0b3IubmV4dCgpOw0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IHZpcnR1YWxWYXJzLmdldChjdXJyZW50S2V5KTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIi4iLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJ7IiArIGN1cnJlbnRLZXkgKyAiWyIsICJ7IiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICIuIiwgIi4iICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiLiIgKyBjdXJyZW50S2V5ICsgIlsiLCAiLiIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiXSIsICJbJyIgKyBjdXJyZW50VmFsdWUgKyAiJ10iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIlsiLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiLiIsICJbIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gb3JpZ2luYWxCaW5kaW5nLnN1YnN0cmluZygyLCBvcmlnaW5hbEJpbmRpbmcubGVuZ3RoKCkgLSAxKTsNCi0gICAgfQ0KLQ0KLSAgICAvL3RvIHN1cHBvcnQgYmxhbmtzIC0gZS5nLiB3aXRoIG1hcCBzeW50YXgNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoU3RyaW5nIGN1cnJlbnRCaW5kaW5nLCBTdHJpbmdbXSBmb3VuZEJpbmRpbmdEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhPZkJpbmRpbmdEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBmb3IoaW50IGkgPSBpbmRleE9mQmluZGluZ0RldGFpbHMgKyAxOyBpIDwgZm91bmRCaW5kaW5nRGV0YWlscy5sZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50QmluZGluZyArPSBmb3VuZEJpbmRpbmdEZXRhaWxzW2ldOw0KLSAgICAgICAgICAgIGlmKGZvdW5kQmluZGluZ0RldGFpbHNbaV0uY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50QmluZGluZzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY3VycmVudEJpbmRpbmc7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoU3RyaW5nW10gYmluZGluZ0RldGFpbHMpDQotICAgIHsNCi0gICAgICAgIGludCBjb3VudCA9IDA7DQotICAgICAgICBmb3IgKFN0cmluZyBlbnRyeSA6IGJpbmRpbmdEZXRhaWxzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbnRyeS5jb250YWlucygiPSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjb3VudCsrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBleHRyYWN0RUxUZXJtcyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGZvdW5kRUxUZXJtcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHJlc29sdmVFTFRlcm1zKG8sIG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpLCBmb3VuZEVMVGVybXMsIDApID4gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZEVMVGVybXM7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGludCByZXNvbHZlRUxUZXJtcyhPYmplY3QgbywgTWFwPE9iamVjdCwgT2JqZWN0PiB2aXNpdGVkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGZvdW5kRUxUZXJtcywgaW50IGNvdW50KSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChvID09IG51bGwgfHwgdmlzaXRlZC5jb250YWluc0tleShvKSB8fCBjb3VudCA+IDUwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdmlzaXRlZC5wdXQobywgbnVsbCk7DQotDQotICAgICAgICBpbnQgZWxDb3VudCA9IDA7DQotICAgICAgICBDbGFzcyBjID0gby5nZXRDbGFzcygpOw0KLQ0KLSAgICAgICAgLy9pbnNwZWN0IG1hcHMNCi0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgTWFwKQ0KLSAgICAgICAgew0KLQ0KLSAgICAgICAgICAgIGZvciAoT2JqZWN0IGVudHJ5IDogKChNYXApIG8pLnZhbHVlcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9mb3VuZCBlbnRyeSBmb3IgInZpcnR1YWwiIGZhY2VsZXRzIHZhcg0KLSAgICAgICAgICAgICAgICBpZihlbnRyeS50b1N0cmluZygpLmNvbnRhaW5zKCJWYWx1ZUV4cHJlc3Npb25bIikpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kRUxUZXJtcy5hZGQoZW50cnkudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxDb3VudCArPSByZXNvbHZlRUxUZXJtcyhlbnRyeSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gZWxDb3VudDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChvKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiArK2VsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2FuYWx5emUgYXJyYXlzDQotICAgICAgICBpZiAoYy5pc0FycmF5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW50IGxlbmd0aCA9IEFycmF5LmdldExlbmd0aChvKTsNCi0gICAgICAgICAgICAvL2NoZWNrIGFycmF5IFtMIC0+IG5vIGFycmF5IG9mIHByaW1pdGl2ZSB0eXBlcw0KLSAgICAgICAgICAgIGlmIChvLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiW0wiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChvLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiW0xqYXZhLmxhbmcuU3RyaW5nIikpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKEFycmF5LmdldChvLCBpKSkpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kRUxUZXJtcy5hZGQoby50b1N0cmluZygpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbENvdW50Kys7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoQXJyYXkuZ2V0KG8sIGkpLCB2aXNpdGVkLCBmb3VuZEVMVGVybXMsIGNvdW50ICsgMSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGVsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PEZpZWxkPiBhdHRyaWJ1dGVzID0gZmluZEFsbEF0dHJpYnV0ZXMoYywgbmV3IEFycmF5TGlzdDxGaWVsZD4oKSk7DQotICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGF0dHJpYnV0ZXMudG9BcnJheShuZXcgRmllbGRbYXR0cmlidXRlcy5zaXplKCldKTsNCi0NCi0gICAgICAgIEFjY2Vzc2libGVPYmplY3Quc2V0QWNjZXNzaWJsZShmaWVsZHMsIHRydWUpOw0KLSAgICAgICAgZm9yIChGaWVsZCBjdXJyZW50RmllbGQgOiBmaWVsZHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5nZXQobykgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmdldFR5cGUoKS5lcXVhbHMoU3RyaW5nLmNsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQuZ2V0KG8pICE9IG51bGwgJiYgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQoY3VycmVudEZpZWxkLmdldChvKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZEVMVGVybXMgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBlbENvdW50Kys7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZiAoIWN1cnJlbnRGaWVsZC5nZXRUeXBlKCkuaXNQcmltaXRpdmUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoY3VycmVudEZpZWxkLmdldChvKSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBlbENvdW50Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8RmllbGQ+IGZpbmRBbGxBdHRyaWJ1dGVzKENsYXNzIGMsIExpc3Q8RmllbGQ+IGF0dHJpYnV0ZXMpDQotICAgIHsNCi0gICAgICAgIGlmIChjID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7DQotICAgICAgICB9DQotICAgICAgICBmaW5kQWxsQXR0cmlidXRlcyhjLmdldFN1cGVyY2xhc3MoKSwgYXR0cmlidXRlcyk7DQotDQotICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGMuZ2V0RGVjbGFyZWRGaWVsZHMoKTsNCi0gICAgICAgIGZvciAoRmllbGQgY3VycmVudEZpZWxkIDogZmllbGRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghTW9kaWZpZXIuaXNTdGF0aWMoY3VycmVudEZpZWxkLmdldE1vZGlmaWVycygpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKGN1cnJlbnRGaWVsZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB0cnlUb1JlcGxhY2VWYXJzKFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcHBlZEZhY2VsZXRzVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5Ow0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOw0KLSAgICAgICAgYm9vbGVhbiBsYXN0ID0gZmFsc2U7DQotDQotICAgICAgICB3aGlsZSh0cnVlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbGFzdCA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLQ0KLQ0KLSAgICAgICAgICAgIHByb3BlcnR5ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpOw0KLQ0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgIC5yZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgZ2V0TmV3UHJvcGVydHkocHJvcGVydHksIG1hcHBlZEZhY2VsZXRzVmFycykpOw0KLQ0KLSAgICAgICAgICAgIGlmKHJlc3VsdC5sZW5ndGgoKSA9PSAwKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkgKyAiLiIgKyByZXN1bHQ7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCk7DQotDQotICAgICAgICAgICAgaWYobGFzdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByZWZpeCgpICsgInsiICsgcmVzdWx0ICsgIn0iKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmV3UHJvcGVydHkoU3RyaW5nIG9sZFByb3BlcnR5LCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcHBlZEZhY2VsZXRzVmFycykNCi0gICAgew0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZpcnR1YWxWYXJzID0gZ2V0UG90ZW50aWFsVmlydHVhbFZhcnMob2xkUHJvcGVydHkpOw0KLQ0KLSAgICAgICAgZm9yKFN0cmluZyB2aXJ0dWFsVmFyIDogdmlydHVhbFZhcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobWFwcGVkRmFjZWxldHNWYXJzLmNvbnRhaW5zS2V5KHZpcnR1YWxWYXIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgb2xkUHJvcGVydHkgPSByZXBsYWNlUHJvcGVydHlWYWx1ZShvbGRQcm9wZXJ0eSwgdmlydHVhbFZhciwgbWFwcGVkRmFjZWxldHNWYXJzLmdldCh2aXJ0dWFsVmFyKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG9sZFByb3BlcnR5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRQb3RlbnRpYWxWaXJ0dWFsVmFycyhTdHJpbmcgb2xkUHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGludCBzdGFydCA9IC0xOw0KLSAgICAgICAgaW50IGVuZCA9IC0xOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZpcnR1YWxWYXJMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgb2xkUHJvcGVydHkubGVuZ3RoKCk7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihzdGFydCA9PSAtIDEgJiYgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICdbJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYoKHN0YXJ0ICE9IC0gMSAmJiBvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ1snKSB8fCBvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ10nKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZW5kID0gaTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYoc3RhcnQgIT0gLTEgJiYgZW5kICE9IC0xKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhckxpc3QuYWRkKG9sZFByb3BlcnR5LnN1YnN0cmluZyhzdGFydCwgZW5kKSk7DQotICAgICAgICAgICAgICAgIGlmKG9sZFByb3BlcnR5LmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IC0xOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVuZCA9IC0xOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB2aXJ0dWFsVmFyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVwbGFjZVByb3BlcnR5VmFsdWUoU3RyaW5nIG9sZFByb3BlcnR5LCBTdHJpbmcgdGFyZ2V0VmFyLCBTdHJpbmcgbmV3VmFsdWUpDQotICAgIHsNCi0gICAgICAgIGludCBpbmRleCA9IG9sZFByb3BlcnR5LmluZGV4T2YodGFyZ2V0VmFyKTsNCi0NCi0gICAgICAgIGlmKGluZGV4ID09IC0xKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBvbGRQcm9wZXJ0eTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoMCwgaW5kZXgpOw0KLSAgICAgICAgcmVzdWx0ICs9IG5ld1ZhbHVlOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdCArIG9sZFByb3BlcnR5LnN1YnN0cmluZyhpbmRleCArIHRhcmdldFZhci5sZW5ndGgoKSwgb2xkUHJvcGVydHkubGVuZ3RoKCkpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHJlcGxhY2UgdmlydHVhbCBmYWNlbGV0cyB2YXJzIChtYXAgc3ludGF4KQ0KLSAgICAgKiB0ZXN0ZWQgc3R5bGVzIChzaW1wbGUgYW5kIG5lc3RlZCk6IHRlc3RbaXhbaXgyW2l4M11dXQ0KLSAgICAgKi8NCi0gICAgLyoNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIF9jcmVhdGVCaW5kaW5nKExpc3Q8U3RyaW5nPiBleHByZXNzaW9ucywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOw0KLQ0KLSAgICAgICAgU3RyaW5nIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRCaW5kaW5nOw0KLSAgICAgICAgU3RyaW5nIHBhcnRPZkJpbmRpbmc7DQotDQotICAgICAgICBpbnQgaW5kZXhPZkJpbmRpbmdEZXRhaWxzOw0KLSAgICAgICAgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGFkZGVkVmlydHVhbE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBlbnRyeSA6IGV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbnRyeS5zdGFydHNXaXRoKCJWYWx1ZUV4cHJlc3Npb25bIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgZm91bmRCaW5kaW5nRGV0YWlscyA9IGVudHJ5LnNwbGl0KCIgIik7DQotICAgICAgICAgICAgaW5kZXhPZkJpbmRpbmdEZXRhaWxzID0gZmluZEluZGV4T2ZCaW5kaW5nRGV0YWlscyhmb3VuZEJpbmRpbmdEZXRhaWxzKTsNCi0NCi0gICAgICAgICAgICBpZiAoaW5kZXhPZkJpbmRpbmdEZXRhaWxzID09IC0xKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGJpbmRpbmdEZXRhaWxzID0gZm91bmRCaW5kaW5nRGV0YWlsc1tpbmRleE9mQmluZGluZ0RldGFpbHNdLnNwbGl0KCI9Iik7DQotDQotICAgICAgICAgICAgaWYgKGJpbmRpbmdEZXRhaWxzLmxlbmd0aCA8IDIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgPSBiaW5kaW5nRGV0YWlsc1sxXTsNCi0NCi0gICAgICAgICAgICAvL3RvIHN1cHBvcnQgYmxhbmtzIHdpdGhpbiBhIGJpbmRpbmcgd2l0aCBtYXAgc3ludGF4DQotICAgICAgICAgICAgaWYoY3VycmVudEJpbmRpbmcuY29udGFpbnMoInsiKSAmJiAhY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYWRkRnVydGhlckJpbmRpbmdQYXJ0cyhjdXJyZW50QmluZGluZywgZm91bmRCaW5kaW5nRGV0YWlscywgaW5kZXhPZkJpbmRpbmdEZXRhaWxzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUgIT0gbnVsbCAmJiBjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9lbnRyeSBmb3IgInZpcnR1YWwiIGZhY2VsZXRzIGJlYW5zDQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWlucyhiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHBhcnRPZkJpbmRpbmcgPSBjdXJyZW50QmluZGluZy5zdWJzdHJpbmcoY3VycmVudEJpbmRpbmcuaW5kZXhPZihwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgcHJldkZhY2VsZXRzQXR0cmlidXRlTmFtZS5sZW5ndGgoKSwgY3VycmVudEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLmFkZChiaW5kaW5nRGV0YWlsc1swXSk7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBwYXJ0T2ZCaW5kaW5nOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy9lbnRyeSBmb3IgInZpcnR1YWwiIGZhY2VsZXRzIHZhcg0KLSAgICAgICAgICAgIGVsc2UgaWYoIShjdXJyZW50QmluZGluZy5jb250YWlucygieyIpIHx8IGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhcnMucHV0KGJpbmRpbmdEZXRhaWxzWzBdLCBiaW5kaW5nRGV0YWlsc1sxXS5zdWJzdHJpbmcoMSwgYmluZGluZ0RldGFpbHNbMV0ubGVuZ3RoKCktMikpOw0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoIWFkZGVkVmlydHVhbE5hbWVzLmNvbnRhaW5zKGJpbmRpbmdEZXRhaWxzWzBdKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYWRkZWRWaXJ0dWFsTmFtZXMuYWRkKGJpbmRpbmdEZXRhaWxzWzBdKTsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGN1cnJlbnRCaW5kaW5nLnN1YnN0cmluZyhjdXJyZW50QmluZGluZy5pbmRleE9mKCJ7IikgKyAxLCBjdXJyZW50QmluZGluZy5pbmRleE9mKCJ9IikpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUgPSBiaW5kaW5nRGV0YWlsc1swXTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0gICAgKi8NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OGViNjYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiZGlmZmVyZW5jZSBiZXR3ZWVuIFsgYW5kIFsnIC0gdGVzdCB3aXRoIG1vcmUgY29uc3RlbGxhdGlvbnMiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSX0pDQotcHVibGljIGNsYXNzIFZhbHVlQmluZGluZ0V4cHJlc3Npb24NCi17DQotICAgIHByaXZhdGUgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBiYXNlOw0KLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJlZml4Ow0KLSAgICBwcml2YXRlIFN0cmluZyB0b2tlbjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlcGxhY2VPckFkZFByb3BlcnR5KFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuZXdQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gcmVwbGFjZVByb3BlcnR5KFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIC8vVE9ETyBhZGp1c3RtZW50cyBmb3IgaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5DQotICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkuZW5kc1dpdGgoIiddIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCksIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBhZGRQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIFN0cmluZyBuZXdQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUV4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzb3VyY2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBzb3VyY2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSk7DQotDQotICAgICAgICAvL1RPRE8gYWRqdXN0bWVudHMgZm9yIGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eQ0KLSAgICAgICAgaWYobmV3UHJvcGVydHkuc3RhcnRzV2l0aCgiWyciKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ocmVzdWx0ICsgbmV3UHJvcGVydHkgKyAifSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihyZXN1bHQgKyAiLiIgKyBuZXdQcm9wZXJ0eSArICJ9Iik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24oU3RyaW5nIGV4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIGlmKCFFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChleHByZXNzaW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGV4cHJlc3Npb24gKyAiIGlzIG5vIHZhbGlkIGVsLWV4cHJlc3Npb24iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGJvb2xlYW4gaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5ID0gZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiJ10iKSA9PSAtMTsNCi0gICAgICAgIGludCBpbmRleDEgPSBpc0R5bmFtaWNCYXNlQW5kUHJvcGVydHkgPyBleHByZXNzaW9uLmxhc3RJbmRleE9mKCJdIikgOiBleHByZXNzaW9uLmxhc3RJbmRleE9mKCInXSIpOw0KLSAgICAgICAgaW50IGluZGV4MiA9IGV4cHJlc3Npb24ubGFzdEluZGV4T2YoIi4iKTsNCi0NCi0gICAgICAgIGlmKGluZGV4MSA+IGluZGV4MikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgxKTsNCi0NCi0gICAgICAgICAgICBpbnQgaW5kZXgzID0gZmluZEluZGV4T2ZTdGFydGluZ0JyYWNrZXQoZXhwcmVzc2lvbik7DQotICAgICAgICAgICAgaWYoaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKGluZGV4MyArIDEsIGluZGV4MSk7DQotDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZyhpbmRleDMgKyAyLCBpbmRleDEpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB0aGlzLmJhc2UgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihleHByZXNzaW9uLnN1YnN0cmluZygwLCBpbmRleDMpICsgIn0iKTsNCi0gICAgICAgICAgICB0aGlzLnRva2VuID0gaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5ID8gIlsiIDogIlsnIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoIGluZGV4MiA+IGluZGV4MSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoaW5kZXgyICsgMSwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEgKTsNCi0gICAgICAgICAgICB0aGlzLmJhc2UgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihleHByZXNzaW9uLnN1YnN0cmluZygwLCBpbmRleDIpICsgIn0iKTsNCi0gICAgICAgICAgICB0aGlzLnRva2VuID0gIi4iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZygyLCBleHByZXNzaW9uLmxlbmd0aCgpIC0gMSk7DQotICAgICAgICAgICAgdGhpcy5wcmVmaXggPSBleHByZXNzaW9uLnN1YnN0cmluZygwLCAxKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUudHJpbSgpOw0KLSAgICAgICAgDQotICAgICAgICBpZigiWyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMudmFsdWUuc3RhcnRzV2l0aCgiJyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUuc3Vic3RyaW5nKDEsIHRoaXMudmFsdWUubGVuZ3RoKCkgLSAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy9yZXR1cm4gdGhpcy5iYXNlLnZhbHVlICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUuc3Vic3RyaW5nKDAsIHRoaXMudmFsdWUubGVuZ3RoKCkpICsgIiddIjsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBnZXRCYXNlRXhwcmVzc2lvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBiYXNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwcmVzc2lvblN0cmluZygpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMuYmFzZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBiYXNlRXhwcmVzc2lvbiA9IHRoaXMuYmFzZS5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotDQotICAgICAgICAgICAgaWYoIlsnIi5lcXVhbHModGhpcy50b2tlbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGJhc2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSkgKyB0aGlzLnRva2VuICsgdGhpcy52YWx1ZSArICInXX0iOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKCJbIi5lcXVhbHModGhpcy50b2tlbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGJhc2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSkgKyB0aGlzLnRva2VuICsgdGhpcy52YWx1ZSArICJdfSI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBiYXNlRXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgYmFzZUV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKSArIHRoaXMudG9rZW4gKyB0aGlzLnZhbHVlICsgIn0iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLnByZWZpeCArICJ7IiArIHRoaXMudmFsdWUgKyAifSI7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlLmdldFByZWZpeCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBwcmVmaXg7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMuYmFzZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuYmFzZS5zZXRQcmVmaXgocHJlZml4KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXhwcmVzc2lvblN0cmluZygpLmhhc2hDb2RlKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiAmJiBnZXRFeHByZXNzaW9uU3RyaW5nKCkNCi0gICAgICAgICAgICAuZXF1YWxzKCgoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbikgdGFyZ2V0KS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgaW50IGZpbmRJbmRleE9mU3RhcnRpbmdCcmFja2V0KFN0cmluZyBleHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBpbnQgY2xvc2VDb3VudCA9IDA7DQotICAgICAgICBmb3IoaW50IGkgPSBleHByZXNzaW9uLmxlbmd0aCgpIC0gMTsgaSA+IDA7IGktLSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihleHByZXNzaW9uLmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjbG9zZUNvdW50LS07DQotICAgICAgICAgICAgICAgIGlmKGNsb3NlQ291bnQgPCAwKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKGV4cHJlc3Npb24uY2hhckF0KGkpID09ICddJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNsb3NlQ291bnQrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0Fic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzEwMGIzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0Fic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFQ+IGltcGxlbWVudHMgTmFtZU1hcHBlckF3YXJlRmFjdG9yeTxOYW1lTWFwcGVyPFQ+Pg0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PENsYXNzPiBkZW5pZWROYW1lTWFwcGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWdpc3RlcihOYW1lTWFwcGVyPFQ+IG5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIGlmKCFkZW5pZWROYW1lTWFwcGVyTGlzdC5jb250YWlucyhuYW1lTWFwcGVyLmdldENsYXNzKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGdldE5hbWVNYXBwZXJMaXN0KCkuYWRkKG5hbWVNYXBwZXIpOw0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoZ2V0TmFtZU1hcHBlckxpc3QoKSwgZ2V0Q29tcGFyYXRvcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgQ29tcGFyYXRvcjxOYW1lTWFwcGVyPFQ+PiBnZXRDb21wYXJhdG9yKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPE5hbWVNYXBwZXI8VD4+KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRlcmVnaXN0ZXIoQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IGNsYXNzVG9EZXJlZ2lzdGVyKQ0KLSAgICB7DQotICAgICAgICBJdGVyYXRvcjxOYW1lTWFwcGVyPFQ+PiBuYW1lTWFwcGVySXRlcmF0b3IgPSBnZXROYW1lTWFwcGVyTGlzdCgpLml0ZXJhdG9yKCk7DQotICAgICAgICB3aGlsZShuYW1lTWFwcGVySXRlcmF0b3IuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG5hbWVNYXBwZXJJdGVyYXRvci5uZXh0KCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKGNsYXNzVG9EZXJlZ2lzdGVyLmdldE5hbWUoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBuYW1lTWFwcGVySXRlcmF0b3IucmVtb3ZlKCk7DQotICAgICAgICAgICAgICAgIC8vZG9uJ3QgYnJlYWsgLSBlLmcuIHRvIGRlcmVnaXN0ZXIgYWxsIHdyYXBwZXJzLi4uDQotICAgICAgICAgICAgICAgIC8vYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGRlbnkoQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IGNsYXNzVG9EZW55KQ0KLSAgICB7DQotICAgICAgICBkZXJlZ2lzdGVyKGNsYXNzVG9EZW55KTsNCi0NCi0gICAgICAgIHN5bmNocm9uaXplZCAoZ2V0Q2xhc3MoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBkZW5pZWROYW1lTWFwcGVyTGlzdC5hZGQoY2xhc3NUb0RlbnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBMaXN0PE5hbWVNYXBwZXI8VD4+IGdldE5hbWVNYXBwZXJMaXN0KCk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2NjA3MC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9DbGFzc01hcHBpbmdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBDbGFzc01hcHBpbmdGYWN0b3J5PFAsIFI+DQotew0KLSAgICBSIGNyZWF0ZShQIHNvdXJjZSk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0RlZmF1bHRGYWN0b3J5RmluZGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9EZWZhdWx0RmFjdG9yeUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTk1YzQ5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0RlZmF1bHRGYWN0b3J5RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0U3RvcmFnZU1hbmFnZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5EZWZhdWx0RUxIZWxwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkRlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8vZHluYW1pYyBhcHByb2FjaCB0byBjcmVhdGUgdGhlIGZhY3RvcmllcyBkdXJpbmcgdGhlIGZpcnN0IHJlcXVlc3QsIHdoZW4gYSBmYWNlcy1jb250ZXh0IGlzIGF2YWlsYWJsZQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWN0b3J5RmluZGVyIGltcGxlbWVudHMgRmFjdG9yeUZpbmRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJvdGVjdGVkIE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4gZmFjdG9yeU1hcCA9IG5ldyBIYXNoTWFwPEZhY3RvcnlOYW1lcywgT2JqZWN0PigpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIgPSBuZXcgRGVmYXVsdEZhY3RvcnlGaW5kZXIoKTsNCi0NCi0gICAgcHJvdGVjdGVkIERlZmF1bHRGYWN0b3J5RmluZGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY3RvcnlGaW5kZXIgZ2V0SW5zdGFuY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjdG9yeUZpbmRlcjsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgZmluYWwgPFQ+IFQgZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUsIENsYXNzPFQ+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZighKGZhY3RvcnlNYXAuY29udGFpbnNLZXkoZmFjdG9yeU5hbWUpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0RmFjdG9yeShmYWN0b3J5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKFQpZmFjdG9yeU1hcC5nZXQoZmFjdG9yeU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIHN3aXRjaCAoZmFjdG9yeU5hbWUpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2FzZSBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZU1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZU1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZVJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgRUxfSEVMUEVSX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVFTEhlbHBlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBGQUNFU19NRVNTQUdFX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVGYWNlc01lc3NhZ2VGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIFNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlU3RvcmFnZU1hbmFnZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICANCi0gICAgICAgICAgICBkZWZhdWx0OiAvL3JlcXVpcmVkIGJ5IGNoZWNrc3R5bGUNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgcG9zc2libGUgdG8gY3JlYXRlIGZhY3RvcnkgIiArIGZhY3RvcnlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZhY3RvcnlNYXAucHV0KGZhY3RvcnlOYW1lLCBmYWN0b3J5KTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkpOw0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSk7DQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotICAgICAgICBMaXN0PFN0cmluZz4gbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSk7DQotICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZICk7DQotICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUZhY2VzTWVzc2FnZUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0ZBQ0VTX01FU1NBR0VfRkFDVE9SWSk7DQotICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkpKTsNCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkubmFtZSgpKTsNCi0gICAgICAgIGlmKHRhcmdldCAhPSBudWxsICYmIHRhcmdldCBpbnN0YW5jZW9mIFN0cmluZykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoKFN0cmluZyl0YXJnZXQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlRUxIZWxwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0RUxIZWxwZXJGYWN0b3J5KCk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlkpOw0KLSAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSk7DQotICAgICAgICBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHN0b3JhZ2VNYW5hZ2VyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IHN0b3JhZ2VNYW5hZ2VyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YmQ4YTMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBGYWNlc01lc3NhZ2VGYWN0b3J5DQotew0KLSAgICBGYWNlc01lc3NhZ2UgY29udmVydChGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKTsNCi0NCi0gICAgRmFjZXNNZXNzYWdlIGNyZWF0ZShGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGYyNjI1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgRmFjdG9yeUZpbmRlcgotewotICAgIDxUPiBUIGdldEZhY3RvcnkoRmFjdG9yeU5hbWVzIGZhY3RvcnlOYW1lLCBDbGFzczxUPiB0YXJnZXRDbGFzcyk7Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTUxMDY2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSX0pCi1wdWJsaWMgZW51bSBGYWN0b3J5TmFtZXMKLXsKLSAgICBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLAotICAgIFZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZLAotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwKLSAgICBNRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksCi0gICAgTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksCi0KLSAgICBGQUNFU19NRVNTQUdFX0ZBQ1RPUlksCi0KLSAgICBSRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZLAotICAgIEVMX0hFTFBFUl9GQUNUT1JZLAotCi0gICAgU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlkKLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L05hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L05hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQyZDFmMC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9OYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZU1hcHBlckF3YXJlRmFjdG9yeTxUIGV4dGVuZHMgTmFtZU1hcHBlcj4NCi17DQotICAgIHZvaWQgcmVnaXN0ZXIoVCBjbGFzc1RvQWRkKTsNCi0gICAgdm9pZCBkZXJlZ2lzdGVyKENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBjbGFzc1RvRGVyZWdpc3Rlcik7DQotICAgIHZvaWQgZGVueShDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gY2xhc3NUb0RlbnkpOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0Fic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDMxYjY4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFNlY3JldDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZUxpc3Rib3g7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVNZW51Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lUmFkaW87DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55Q2hlY2tib3g7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TGlzdGJveDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlNZW51Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0YXJlYTsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXINCi17DQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodmFsaWRhdGVFbXB0eUZpZWxkcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29uZmlndXJlUmVxdWlyZWRBdHRyaWJ1dGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjb25maWd1cmVNYXhMZW5ndGhBdHRyaWJ1dGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlRW1wdHlGaWVsZHMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMudmFsaWRhdGVFbXB0eUZpZWxkcygpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNvbmZpZ3VyZVJlcXVpcmVkQXR0cmlidXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKTsNCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0VGV4dCB8fA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCB8fA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3ggfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lTGlzdGJveCB8fA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVNZW51IHx8DQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZVJhZGlvIHx8DQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlDaGVja2JveCB8fA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TGlzdGJveCB8fA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TWVudSB8fA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHRhcmVhOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBpZiB0aGVyZSBpcyBubyBzcGVjaWFsIGF0dHJpYnV0ZSBhdCB0aGUgY29tcG9uZW50IHdoaWNoIHNob3VsZCBvdmVycnVsZQ0KLSAgICAgKiB0aGUgYW5ub3RhdGVkIHByb3BlcnR5IHJldHVybiB0cnVlIQ0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgY29tcG9uZW50IHdoaWNoIGltcGxlbWVudHMgdGhlIEVkaXRhYmxlVmFsdWVIb2xkZXIgaW50ZXJmYWNlDQotICAgICAqIEByZXR1cm4gZmFsc2UgdG8gb3ZlcnJ1bGUgdGhlIGFubm90YXRlZCBwcm9wZXJ0eSBlLmcuIGlmIGNvbXBvbmVudCBpcyByZWFkb25seQ0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIEJvb2xlYW4gaXNDb21wb25lbnRSZXF1aXJlZChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNSZWFkb25seSIpKSk7DQotICAgICAgICBib29sZWFuIGlzRGlzYWJsZWQgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc0Rpc2FibGVkIikpKTsNCi0NCi0gICAgICAgIHJldHVybiAhKGlzUmVhZE9ubHkgfHwgaXNEaXNhYmxlZCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlTWF4TGVuZ3RoQXR0cmlidXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIE9iamVjdCBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpOw0KLQ0KLSAgICAgICAgICAgIGlmKCEobWF4TGVuZ3RoIGluc3RhbmNlb2YgSW50ZWdlcikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0VGV4dCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEh0bWxJbnB1dFRleHQgaHRtbElucHV0VGV4dCA9IChIdG1sSW5wdXRUZXh0KXVpQ29tcG9uZW50Ow0KLSAgICAgICAgICAgICAgICBodG1sSW5wdXRUZXh0LnNldE1heGxlbmd0aCgoSW50ZWdlciltYXhMZW5ndGgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOGUzNTUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9Db21wb25lbnRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlclN1cHBvcnQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQWxsb3dzIHRvIGluaXRpYWxpemUgY29tcG9uZW50cyBiZWZvcmVFbmNvZGVCZWdpbi48YnIvPg0KLSAqIGUuZy46IHlvdSBjYW4gYWRkIGluZm9ybWF0aW9uIGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIG1lY2hhbmlzbXMsLi4uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50SW5pdGlhbGl6ZXINCi17DQotICAgIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTljMDQxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBTdGF0aWNDb25maWd1cmF0aW9uPFQsIFI+DQotew0KLSAgICB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCk7DQotICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFQsIFI+PiBnZXRNYXBwaW5nKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiODRhZjUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGNsYXNzIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxULCBSPg0KLXsNCi0gICAgcHJpdmF0ZSBUIHNvdXJjZTsNCi0gICAgcHJpdmF0ZSBSIHRhcmdldDsNCi0NCi0gICAgcHVibGljIFQgZ2V0U291cmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHNvdXJjZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoVCBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSIGdldFRhcmdldCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KFIgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTEwN2QxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSX0pCi1wdWJsaWMgZW51bSBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMKLXsKLSAgICBNRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9DT05GSUcsCi0gICAgU1RPUkFHRV9UWVBFX1RPX1NUT1JBR0VfTUFOQUdFUl9DT05GSUcsCi0KLSAgICBTS0lQX1ZBTElEQVRJT05fU1VQUE9SVF9DT05GSUcKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGNiNmY0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3MKLSAgICAgICAgPSBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VPZk1hcHBpbmcoU3RyaW5nIHBhdGgpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGdldE1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2Uoc291cmNlKTsKLSAgICAgICAgZW50cnkuc2V0VGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgIHRoaXMubWFwcGluZ3MuYWRkKGVudHJ5KTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhNjNjNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIFN0cmluZyBwYXRoOwotICAgIHByaXZhdGUgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5nczsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCkKLSAgICB7Ci0gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgICAgIC8vZm9yY2UgcmVsb2FkCi0gICAgICAgIG1hcHBpbmdzID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBnZXRNYXBwaW5nKCkKLSAgICB7Ci0gICAgICAgIGlmKG1hcHBpbmdzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtYXBwaW5nczsKLSAgICAgICAgfQotCi0gICAgICAgIG1hcHBpbmdzID0gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotCi0gICAgICAgIFJlc291cmNlQnVuZGxlIG1hcHBpbmcgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocGF0aCk7Ci0KLSAgICAgICAgaWYgKG1hcHBpbmcgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9sb2dnaW5nCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IG1hcHBpbmcuZ2V0S2V5cygpOwotCi0gICAgICAgIFN0cmluZyBtZXRhRGF0YUtleTsKLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsKLQotICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YURhdGFLZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSBtYXBwaW5nLmdldFN0cmluZyhtZXRhRGF0YUtleSk7Ci0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWV0YURhdGFLZXksIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBtZXRhRGF0YUtleSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2UobWV0YURhdGFLZXkpOwotICAgICAgICBlbnRyeS5zZXRUYXJnZXQodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsKLSAgICAgICAgdGhpcy5tYXBwaW5ncy5hZGQoZW50cnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk5Mzk2OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yIGltcGxlbWVudHMgUmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRJbnRlcmNlcHRvcklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJldHVyblZhbHVlT25Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKAotICAgICAgICBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIHNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24sIE9iamVjdCBjdXJyZW50UmV0dXJuVmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gY3VycmVudFJldHVyblZhbHVlOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBiZWZvcmUKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJlZm9yZURlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGFmdGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMDdmYmMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlci5Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmVsLlByb3BlcnR5Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSB4LnguMwotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yIGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCB3ZWIueG1sIGNvbnRleHQgcGFyYW0gdG8gZGVhY3RpdmF0ZSBjb21wb25lbnQgaW5pdGlhbGl6YXRpb24iKQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdENvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgY29udmVydGVkT2JqZWN0ID0gd3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUHJvcGVydHlOb3RGb3VuZEV4Y2VwdGlvbiByKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0ZhdGFsRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmZhdGFsKCJpdCBzZWVtcyB5b3UgYXJlIHVzaW5nIGFuIGludmFsaWQgYmluZGluZy4gIiArIHdyYXBwZWQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIjogY29udmVyc2lvbiBmYWlsZWQuIG5vcm1hbGx5IHRoaXMgaXMgPm5vdDwgYSBteWZhY2VzIGV4dHZhbCBpc3N1ZSEiLCByKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHJlY29yZFByb2Nlc3NlZEluZm9ybWF0aW9uKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vcmVjb3JkZSB1c2VyIGlucHV0IGUuZy4gZm9yIGNyb3NzLWNvbXBvbmVudCB2YWxpZGF0aW9uCi0gICAgICAgICAgICBmb3IoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciByZWNvcmRlciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVjb3JkZXIucmVjb3JkVXNlcklucHV0KHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UocmVjb3JkZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGNhbGxlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QgPSB0cmFuc2Zvcm1WYWx1ZUZvclZhbGlkYXRpb24oY29udmVydGVkT2JqZWN0KTsKLQotICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRlVmFsdWUoY29udmVydGVkT2JqZWN0KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIG1pZ2h0IGRlY2lkZSB0aGF0IGl0IGlzbid0IGFuIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvVGhyb3dWYWxpZGF0b3JFeGNlcHRpb25Gb3JDb21wb25lbnQodWlDb21wb25lbnQsIGUuZ2V0RmFjZXNNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFZhbGlkYXRvckV4Y2VwdGlvbiBmaW5hbEV4Y2VwdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29udmVydGVyRXhjZXB0aW9uKGUuZ2V0RmFjZXNNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCB0cmFuc2Zvcm1WYWx1ZUZvclZhbGlkYXRpb24oT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkKLSAgICB7Ci0gICAgICAgIGlmICgiIi5lcXVhbHMoY29udmVydGVkT2JqZWN0KSAmJiBpbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRPYmplY3Q7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZShPYmplY3QgY29udmVydGVkT2JqZWN0KQotICAgIHsKLSAgICAgICAgaWYoaXNWYWx1ZVRvVmFsaWRhdGVFbXB0eShjb252ZXJ0ZWRPYmplY3QpICYmICF2YWxpZGF0ZUVtcHR5RmllbGRzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoImVtcHR5IGZpZWxkIHZhbGlkYXRpb24gaXMgZGVhY3RpdmF0ZWQgaW4gdGhlIHdlYi54bWwgLSBzZWU6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLlZBTElEQVRFX0VNUFRZX0ZJRUxEUyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbHVlVG9WYWxpZGF0ZUVtcHR5KE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpCi0gICAgewotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0ID09IG51bGwgfHwgIiIuZXF1YWxzKGNvbnZlcnRlZE9iamVjdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVFbXB0eUZpZWxkcygpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMudmFsaWRhdGVFbXB0eUZpZWxkcygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGludGVycHJldEVtcHR5U3RyaW5nVmFsdWVzQXNOdWxsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5pbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKAotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmICghKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikgfHwgaXNDb21wb25lbnRJbml0aWFsaXphdGlvbkRlYWN0aXZhdGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCkgIT0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbXBvbmVudEluaXRpYWxpemF0aW9uRGVhY3RpdmF0ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NPTVBPTkVOVF9JTklUSUFMSVpBVElPTik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVjb3JkUHJvY2Vzc2VkSW5mb3JtYXRpb24oKQotICAgIHsKLSAgICAgICAgLy9vdmVycmlkZSBpZiBuZWVkZWQKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9GYWNlc01lc3NhZ2VQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDA3NjY5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9GYWNlc01lc3NhZ2VQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5GYWNlc01lc3NhZ2VTdG9yYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgeC54LjMKLSAqLwotQEludm9jYXRpb25PcmRlcig5MDApCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHVibGljIGJvb2xlYW4gYmVmb3JlVmFsaWRhdGlvbigKLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQotICAgIHsKLSAgICAgICAgRmFjZXNNZXNzYWdlU3RvcmFnZSBmYWNlc01lc3NhZ2VTdG9yYWdlID0gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZSgKLSAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLCBGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgaWYoZmFjZXNNZXNzYWdlU3RvcmFnZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmYWNlc01lc3NhZ2VTdG9yYWdlLmFkZEFsbCgpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg5OTc0My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5MYWJlbGVkTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLmV4Y2VwdGlvbi5SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFNlY3JldDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVMaXN0Ym94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVSYWRpbzsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueU1lbnU7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dGFyZWE7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkhJR0gsIGRlc2NyaXB0aW9uID0gImNoZWNrIGNvbXBhdGliaWxpdHkgd2l0aCBidi1pbnRlZ3JhdGlvbiIpCi1wdWJsaWMgY2xhc3MgSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpCi0gICAgewotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSBFeHRWYWxVdGlscy5jb252ZXJ0RmFjZXNNZXNzYWdlKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IChTdHJpbmcpIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCh1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldExhYmVsIikpOwotCi0gICAgICAgICAgICBoYW5kbGVSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbih1aUNvbXBvbmVudCwgdmFsaWRhdG9yRXhjZXB0aW9uKTsKLQotICAgICAgICAgICAgaWYobGFiZWwgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsYWJlbCA9IHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vb3ZlcnJpZGUgdGhlIGxhYmVsIGlmIHRoZSBhbm5vdGF0aW9uIHByb3ZpZGVzIGEgbGFiZWwKLSAgICAgICAgICAgIGlmKG1ldGFEYXRhRW50cnkgIT0gbnVsbCAmJiBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxhYmVsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCwgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoZmFjZXNNZXNzYWdlIGluc3RhbmNlb2YgTGFiZWxlZE1lc3NhZ2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChMYWJlbGVkTWVzc2FnZSlmYWNlc01lc3NhZ2UpLnNldExhYmVsVGV4dChsYWJlbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL2lmIHNvbWVvbmUgdXNlcyBhIG5vcm1hbCBmYWNlcyBtZXNzYWdlCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvUGxhY2VMYWJlbChmYWNlc01lc3NhZ2UsIGxhYmVsLCBpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKG1ldGFEYXRhRW50cnkgIT0gbnVsbCAmJiBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vY29ycmVjdCBzZXZlcml0eSBpcyBlLmcuIHByb3ZpZGVkIGJ5IFZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50KHVpQ29tcG9uZW50LCBmYWNlc01lc3NhZ2UpOwotICAgICAgICAgICAgICAgIGlmKCFGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0UmVuZGVyUmVzcG9uc2UoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vaXQncyBhIHNwZWNpYWwgY2FzZSAtIHNpbmNlIHZhbGlkYXRpb24gd2lsbCBjb250aW51ZSBpdCdzIGVzc2VudGlhbCB0byByZXNldCBpdAotICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pCi0gICAgewotICAgICAgICBpZih2YWxpZGF0b3JFeGNlcHRpb24gaW5zdGFuY2VvZiBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKTsKLSAgICAgICAgICAgIFN0cmluZyBpbmxpbmVNZXNzYWdlID0gZ2V0SW5saW5lUmVxdWlyZWRNZXNzYWdlKHVpQ29tcG9uZW50KTsKLQotICAgICAgICAgICAgaWYoaW5saW5lTWVzc2FnZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGlubGluZU1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoaW5saW5lTWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRJbmxpbmVSZXF1aXJlZE1lc3NhZ2UoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gKFN0cmluZylSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJnZXRSZXF1aXJlZE1lc3NhZ2UiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lUmFkaW8gfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TGlzdGJveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWQyMWRlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlJbmZvcm1hdGlvbiB0aGUgaW5mb3JtYXRpb24gZW50cnkgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3BlcnR5DQotICAgICAqLw0KLSAgICB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGNmNTI3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotew0KLSAgICAvKioNCi0gICAgICogQHJldHVybiBmYWxzZSBpZiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzIHNob3VsZCBiZSBieXBhc3NlZA0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpOw0KLQ0KLSAgICAvKioNCi0gICAgICogcHJvY2Vzc2VkIGlmIHZhbGlkYXRpb24gd2FzIGV4ZWN1dGVkDQotICAgICAqIGluIGNvbnRyYXN0IHRvIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpdCBnZXRzIGV4ZWN1dGVkIGluIGFueSBjYXNlDQotICAgICAqLw0KLSAgICB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9SZW5kZXJlckludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMWYwNTQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbGxvd3MgdG8gaW50ZXJjZXB0IHJlbmRlcmVyIG1ldGhvZHMuPGJyLz4KLSAqIEJhc2UgbWVjaGFuaXNtIG9mIGV4dHZhbC4gSXQgYWxsb3dzIHRvIGFkZCBjdXN0b20gaW5mcmFzdHJ1Y3R1cmVzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBSZW5kZXJlckludGVyY2VwdG9yCi17Ci0gICAgU3RyaW5nIGdldEludGVyY2VwdG9ySWQoKTsKLQotICAgIE9iamVjdCBnZXRSZXR1cm5WYWx1ZU9uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBza2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLCBPYmplY3QgY3VycmVudFJldHVyblZhbHVlKTsKLQotICAgIC8qCi0gICAgICogYmVmb3JlCi0gICAgICovCi0gICAgdm9pZCBiZWZvcmVEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKgotICAgICAqIGFmdGVyCi0gICAgICovCi0gICAgdm9pZCBhZnRlckRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZWMzZDAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlclN1cHBvcnQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gaW50ZXJjZXB0IHZhbGlkYXRpb3IgZXhjZXB0aW9ucy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAqIEBwYXJhbSBtZXRhRGF0YUVudHJ5IHRoZSBtZXRhIGRhdGEgZW50cnkgd2hpY2ggY29udGFpbnMgdGhlIG1ldGEgZGF0YSBvZiB0aGUgcHJvcGVydHkNCi0gICAgICogQHBhcmFtIGNvbnZlcnRlZE9iamVjdCB0aGUgY29udmVydGVkIHVzZXIgaW5wdXQNCi0gICAgICogQHBhcmFtIHZhbGlkYXRvckV4Y2VwdGlvbiB0aGUgY3VycmVudCBleGNlcHRpb24NCi0gICAgICogQHBhcmFtIHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IHdoaWNoIHRocmV3IHRoZSBleGNlcHRpb24NCi0gICAgICogQHJldHVybiBmYWxzZSB0byBzdG9wIHRocm93aW5nIHRoZSBleGNlcHRpb24NCi0gICAgICovDQotICAgIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhmOTM3ZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25JbnRlcmNlcHRvcgotewotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCB0byBpbml0IGNvbXBvbmVudCAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YVJlc3VsdCA9IEV4dFZhbFV0aWxzLmdldFRyYW5zZm9ybWVkTWV0YURhdGEoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgLy9nZXQgY29tcG9uZW50IGluaXRpYWxpemVyIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQgYW5kIGNvbmZpZ3VyZSBpdAotICAgICAgICAvL2Fsc28gaW4gY2FzZSBvZiBza2lwcGVkIHZhbGlkYXRpb24gdG8gcmVzZXQgZS5nLiB0aGUgcmVxdWlyZWQgYXR0cmlidXRlCi0gICAgICAgIGlmKCFtZXRhRGF0YVJlc3VsdC5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbmZpZ3VyZUNvbXBvbmVudFdpdGhNZXRhRGF0YShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YVJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJpbml0IGNvbXBvbmVudCBvZiAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkKLSAgICB7Ci0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gRXh0VmFsVXRpbHMuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKTsKLQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmKCFFeHRWYWxVdGlscy5leGVjdXRlR2xvYmFsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCkgLHByb3BlcnR5SW5mb3JtYXRpb24sIGdldE1vZHVsZUtleSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgdmFsaWRhdGlvbiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcm9jZXNzRmllbGRWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInZhbGlkYXRpb24gZmluaXNoZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uLCBnZXRNb2R1bGVLZXkoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRmllbGRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5OwotICAgICAgICBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvciBza2lwVmFsaWRhdGlvbkV2YWx1YXRvciA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKCk7Ci0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0TWV0YURhdGFFbnRyaWVzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKGVudHJ5LmdldEtleSgpKTsKLQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLnNraXBWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHZhbGlkYXRpb25TdHJhdGVneSwgZW50cnkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy9yZXF1aXJlZCBpcyBhIHNwZWNpYWwgY2FzZSAtIHJlc2V0IGl0Ci0gICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQoZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vZG9uJ3QgYnJlYWsgbWF5YmUgdGhlcmUgYXJlIGNvbnN0cmFpbnRzIHdoaWNoIGRvbid0IHN1cHBvcnQgdGhlIHNraXAtbWVjaGFuaXNtCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJ2YWxpZGF0ZSAiICsgZW50cnkuZ2V0VmFsdWUoKSArICIgd2l0aCAiICsgdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZighRXh0VmFsVXRpbHMuZXhlY3V0ZUxvY2FsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uLmNsYXNzLmdldE5hbWUoKSwgcHJvcGVydHlJbmZvcm1hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogdmFsaWRhdGlvbgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQW5ub3RhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZXhlY3V0ZUxvY2FsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm5vIHZhbGlkYXRpb24gc3RyYXRlZ3kgZm91bmQgZm9yICIgKyBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICAvKioKLSAgICAgKiB0byBlbnN1cmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGludGVycHJldEVtcHR5U3RyaW5nVmFsdWVzQXNOdWxsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWNvcmRQcm9jZXNzZWRJbmZvcm1hdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0TW9kdWxlS2V5KCkKLSAgICB7Ci0gICAgICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WaW9sYXRpb25TZXZlcml0eVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Zpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMDM2NjguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Zpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIHgueC4zCi0gKi8KLUBJbnZvY2F0aW9uT3JkZXIoOTApCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5ISUdILCBkZXNjcmlwdGlvbiA9ICJjaGVjayBjb21wYXRpYmlsaXR5IHdpdGggYnYtaW50ZWdyYXRpb24iKQotcHVibGljIGNsYXNzIFZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpCi0gICAgewotICAgICAgICBpZihtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnlUb1BsYWNlU2V2ZXJpdHkodmFsaWRhdG9yRXhjZXB0aW9uLCBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9QbGFjZVNldmVyaXR5KFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIEFubm90YXRpb24gYW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICAgIGZvcihGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkgOiBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkKLSAgICAgICAgICAgICAgICAuZXh0cmFjdChhbm5vdGF0aW9uLCBWaW9sYXRpb25TZXZlcml0eS5jbGFzcywgRmFjZXNNZXNzYWdlLlNldmVyaXR5LmNsYXNzKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLnNldFNldmVyaXR5KHNldmVyaXR5KTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkMzg2NS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBBIGdlbmVyaWMgaW1wbGVtZW50YXRpb24uIFN1YmNsYXNzZXMganVzdCBoYXZlIHRvIG5vdyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIG5hbWUgbWFwcGVyLg0KLSAqDQotICogTmFtZU1hcHBlcnMgYXJlIHN0YXRlbGVzcy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxUPiBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VD4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotICAgIHByaXZhdGUgTmFtZU1hcHBlcjxUPiBjdXN0b21OYW1lTWFwcGVyOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVCBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIGlmIChjdXN0b21OYW1lTWFwcGVyID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKTsNCi0NCi0gICAgICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXN0b21OYW1lTWFwcGVyID0gKE5hbWVNYXBwZXI8VD4pIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoY3VzdG9tTmFtZU1hcHBlciAhPSBudWxsKSA/IGN1c3RvbU5hbWVNYXBwZXIuY3JlYXRlTmFtZShzb3VyY2UpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL05hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgzMWNiNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL05hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXJTdXBwb3J0Ow0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSBmb3IgbmFtZSBtYXBwZXJzLg0KLSAqIEEgbmFtZSBtYXBwZXIgY2FsY3VsYXRlcyBhIG5hbWUgZm9yIGEgZ2l2ZW4gc291cmNlIG9iamVjdC4NCi0gKiBlLmcuIE1ldGEtRGF0YSBLZXkgKGUuZy46IGFubm90YXRpb24gY2xhc3MgbmFtZSkgLT4gVmFsaWRhdGlvblN0cmF0ZWd5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgU3RyaW5nIGNyZWF0ZU5hbWUoVCBzb3VyY2UpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL1N1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9TdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U2ZGRkMi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL1N1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogaW50ZXJmYWNlIGZvciBuYW1lLW1hcHBlcnMgd2hpY2ggaGF2ZSB0byBkZWxlZ2F0ZSB0byBvdGhlciAoc3ViLSluYW1lLW1hcHBlcnMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyPFQ+IGV4dGVuZHMgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgdm9pZCBhZGROYW1lTWFwcGVyKE5hbWVNYXBwZXI8VD4gbmFtZU1hcHBlcik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiMTYxZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvQ29tbW9uTWV0YURhdGFLZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGhlbHBlciBmb3IgZnJlcXVlbnQgbWV0YS1kYXRhIGtleXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogcGxhY2VkIGluIGNvcmUgdG8gYXZvaWQgZHVwbGljYXRlZCBpbmZvcm1hdGlvbiBpbiBtdWx0aXBsZSBtb2R1bGVzICh2YWxpZGF0aW9uIG1vZHVsZSBhbmQgY29tcG9uZW50LXN1cHBvcnQgbW9kdWxlKQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBDb21tb25NZXRhRGF0YUtleXMNCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRUQgPSAicmVxdWlyZWQiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQUtfUkVRVUlSRUQgPSAid2Vha19yZXF1aXJlZCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOX0xFTkdUSCA9ICJtaW5fbGVuZ3RoIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5fTEVOR1RIX0RFRkFVTFQgPSAibWluX2xlbmd0aF9kZWZhdWx0IjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfTEVOR1RIID0gIm1heF9sZW5ndGgiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9MRU5HVEhfREVGQVVMVCA9ICJtYXhfbGVuZ3RoX2RlZmF1bHQiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01JTiA9ICJyYW5nZV9taW4iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01JTl9ERUZBVUxUID0gInJhbmdlX21pbl9kZWZhdWx0IjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9NQVggPSAicmFuZ2VfbWF4IjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9NQVhfREVGQVVMVCA9ICJyYW5nZV9tYXhfZGVmYXVsdCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUVEVSTiA9ICJwYXR0ZXJuIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRURVJOX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRSA9ICJwYXR0ZXJuX3ZhbGlkYXRpb25fZXJyb3JfbWVzc2FnZSI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1BSUwgPSAiZW1haWwiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTSA9ICJjdXN0b20iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSVBfVkFMSURBVElPTiA9ICJza2lwX3ZhbGlkYXRpb24iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfQ0xJRU5UX1NJREVfVkFMSURBVElPTiA9ICJkaXNhYmxlX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24iOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvTWV0YURhdGFFbnRyeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL01ldGFEYXRhRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU1NDU4Mi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvTWV0YURhdGFFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIERhdGEgaG9sZGVyIHdoaWNoIHN0b3JlcyB0aGUgbWV0YS1kYXRhIGFuZCBzb21lIGluZm9ybWF0aW9uIHdoZXJlIHRoZSBtZXRhLWRhdGEgd2FzIGFyb3VuZC4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBNZXRhRGF0YUVudHJ5Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGtleTsKLSAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRLZXkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJzZXR0aW5nIG1ldGEtZGF0YSBrZXk6ICIgKyBrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIDxUPiBUIGdldFZhbHVlKENsYXNzPFQ+IHRhcmdldENsYXNzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUKWdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoInNldHRpbmcgbWV0YS1kYXRhIHZhbHVlOiAiICsgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmdldChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gVCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVClnZXRQcm9wZXJ0eShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJuZXcgcHJvcGVydHkgYWRkZWQga2V5OiAiICsga2V5ICsgIiB2YWx1ZTogIiArIHZhbHVlICsgIiBmb3IgbWV0YWRhdGEta2V5OiAiICsgdGhpcy5rZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMyZjRhNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYWxsIGZhY3RvcmllcyB3aGljaCBjcmVhdGUgbWV0YS1kYXRhIGV4dHJhY3RvcnMKLSAqIAotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeQotewotICAgIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZSgpOwotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YzRlZTIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuTWV0YURhdGFTdG9yYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggZXh0cmFjdHMgbWV0YS1kYXRhIChlLmcuIHRoZSBhbm5vdGF0aW9ucykgb2YgdGhlIHZhbHVlIGJpbmRpbmcgb2YgYSBjb21wb25lbnQuCi0gKiBJdCBleHRyYWN0cyB0aGUgbWV0YS1kYXRhIG9mIHRoZSBmaWVsZCBhbmQgdGhlIHByb3BlcnR5LgotICogKEFsc28gdGhlIGFubm90YXRpb25zIG9mIHN1cGVyIGNsYXNzZXMgYW5kIGludGVyZmFjZXMuKQotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0b3IKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHVibGljIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcigpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkKLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsKLQotICAgICAgICAvL3Nob3VsZCBuZXZlciBvY2N1cgotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSAmJiBvYmplY3QgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKG9iamVjdC5nZXRDbGFzcygpICsgIiBpcyBubyB2YWxpZCBjb21wb25lbnQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQgPSAoVUlDb21wb25lbnQpIG9iamVjdDsKLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBleHRyYWN0aW5nIG1ldGEtZGF0YSBvZiAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcodWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmIChwcm9wZXJ0eURldGFpbHMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBnZXQgYmVhbiBjbGFzcyBhbmQgcHJvcGVydHkgbmFtZQotICAgICAgICAgKi8KLSAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCk7Ci0KLSAgICAgICAgLy9jcmVhdGUKLSAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5zZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBwcm9wZXJ0eURldGFpbHMpOwotCi0gICAgICAgIGlmKGlzQ2FjaGVkKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkgOiBnZXRDYWNoZWRNZXRhRGF0YShlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uYWRkTWV0YURhdGFFbnRyeShtZXRhRGF0YUVudHJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4dHJhY3RBbm5vdGF0aW9ucyhwcm9wZXJ0eUluZm9ybWF0aW9uLCBwcm9wZXJ0eURldGFpbHMsIGVudGl0eUNsYXNzKTsKLSAgICAgICAgICAgIGNhY2hlTWV0YURhdGEocHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHRyYWN0IGZpbmlzaGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDYWNoZWQoQ2xhc3MgZW50aXR5Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRNZXRhRGF0YVN0b3JhZ2UoKS5jb250YWluc01ldGFEYXRhRm9yKGVudGl0eUNsYXNzLCBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNhY2hlTWV0YURhdGEoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQotICAgIHsKLSAgICAgICAgZ2V0TWV0YURhdGFTdG9yYWdlKCkuc3RvcmVNZXRhRGF0YU9mKHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgIH0KLQotICAgIHByaXZhdGUgTWV0YURhdGFFbnRyeVtdIGdldENhY2hlZE1ldGFEYXRhKENsYXNzIGVudGl0eUNsYXNzLCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TWV0YURhdGFTdG9yYWdlKCkuZ2V0TWV0YURhdGEoZW50aXR5Q2xhc3MsIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1ldGFEYXRhU3RvcmFnZSBnZXRNZXRhRGF0YVN0b3JhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoTWV0YURhdGFTdG9yYWdlLmNsYXNzLCBNZXRhRGF0YVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXh0cmFjdEFubm90YXRpb25zKAotICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uLCBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLCBDbGFzcyBlbnRpdHlDbGFzcykKLSAgICB7Ci0gICAgICAgIHdoaWxlICghT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoZW50aXR5Q2xhc3MuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICAgICAgYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9ucyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICAgICAgZW50aXR5Q2xhc3MgPSBlbnRpdHlDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ludGVyZmFjZXMoCi0gICAgICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MsIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMsIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IGN1cnJlbnRDbGFzcy5nZXRJbnRlcmZhY2VzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoY3VycmVudEludGVyZmFjZSwgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhjdXJyZW50SW50ZXJmYWNlLCBwcm9wZXJ0eURldGFpbHMsIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIHByb3BlcnR5ID0gcHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSk7Ci0KLSAgICAgICAgTWV0aG9kIG1ldGhvZDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0aG9kID0gZW50aXR5LmdldERlY2xhcmVkTWV0aG9kKCJnZXQiICsgcHJvcGVydHkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kID0gZW50aXR5LmdldERlY2xhcmVkTWV0aG9kKCJpcyIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJtZXRob2Qgbm90IGZvdW5kIC0gY2xhc3M6ICIgKyBlbnRpdHkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgLSBtZXRob2RzOiAiICsgImdldCIgKyBwcm9wZXJ0eSArICIgIiArICJpcyIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoQXJyYXlzLmFzTGlzdChtZXRob2QuZ2V0QW5ub3RhdGlvbnMoKSksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBGaWVsZCBmaWVsZDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmllbGQgPSBlbnRpdHkuZ2V0RGVjbGFyZWRGaWVsZChwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHByb3BlcnR5Lmxlbmd0aCgpID4gMSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShwcm9wZXJ0eS5jaGFyQXQoMCkpICYmIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShwcm9wZXJ0eS5jaGFyQXQoMSkpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKHByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gZW50aXR5LmdldERlY2xhcmVkRmllbGQoIl8iICsgcHJvcGVydHkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZTEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKCJfIiArIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImZpZWxkICIgKyBwcm9wZXJ0eSArICIgb3IgXyIgKyBwcm9wZXJ0eSArICIgbm90IGZvdW5kIiwgZTEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFkZEFubm90YXRpb25Ub0Fubm90YXRpb25FbnRyaWVzKEFycmF5cy5hc0xpc3QoZmllbGQuZ2V0QW5ub3RhdGlvbnMoKSksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEFubm90YXRpb25Ub0Fubm90YXRpb25FbnRyaWVzKAotICAgICAgICBMaXN0PEFubm90YXRpb24+IGFubm90YXRpb25zLCBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGFubm90YXRpb25zKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLmFkZE1ldGFEYXRhRW50cnkoY3JlYXRlTWV0YURhdGFFbnRyeUZvckFubm90YXRpb24oYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoYW5ub3RhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBNZXRhRGF0YUVudHJ5IGNyZWF0ZU1ldGFEYXRhRW50cnlGb3JBbm5vdGF0aW9uKEFubm90YXRpb24gZm91bmRBbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgTWV0YURhdGFFbnRyeSBlbnRyeSA9IG5ldyBNZXRhRGF0YUVudHJ5KCk7Ci0KLSAgICAgICAgZW50cnkuc2V0S2V5KGZvdW5kQW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIGVudHJ5LnNldFZhbHVlKGZvdW5kQW5ub3RhdGlvbik7Ci0KLSAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZDcwYWQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhpcyBmYWN0b3J5IGNyZWF0ZXMgYSBtZXRhLWRhdGEgZXh0cmFjdG9yIHdoaWNoIGV4dHJhY3RzIHRoZSBtZXRhLWRhdGEKLSAqIG9mIHRoZSB2YWx1ZSBiaW5kaW5nIG9mIGEgY29tcG9uZW50LgotICogPHAvPgotICogb3JkZXI6PGJyLz4KLSAqIDxvbD4KLSAqICAgPGxpPmNvbmZpZ3VyZWQgbWV0YS1kYXRhIGV4dHJhY3RvciAod2ViLnhtbCk8L2xpPgotICogICA8bGk+Y29uZmlndXJlZCBtZXRhLWRhdGEgZXh0cmFjdG9yIChpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKTwvbGk+Ci0gKiAgIDxsaT5kZWZhdWx0IGltcGxlbWVudGF0aW9uPC9saT4KLSAqIDwvb2w+Ci0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IG51bGw7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikKLSAgICBwdWJsaWMgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlKCkKLSAgICB7Ci0gICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3RvciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUik7Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUikpOwotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yID0gKE1ldGFEYXRhRXh0cmFjdG9yKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3RvciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShtZXRhRGF0YUV4dHJhY3Rvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY3JlYXRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3IobWV0YURhdGFFeHRyYWN0b3IpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0MDUxZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL01ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci0KLS8qKgotICogQW4gbWV0YS1kYXRhIGV4dHJhY3RvciBpcyByZXNwb25zaWJsZSB0byBhbmFseXplIGFuIG9iamVjdAotICogYW5kIHJldHVybnMgYWxsIGF2YWlsYWJsZSBtZXRhLWRhdGEgaW5mb3JtYXRpb24KLSAqIAotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhRXh0cmFjdG9yCi17Ci0gICAgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njk5MTJhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgZXF1aXZhbGVudCB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0gKg0KLSAqIGlmIHRoZXJlIGlzIGFsc28gYSBwcm94eSBmb3IgdGhlIGV4dHJhY3RvciB5b3UgY2FuIHVzZSB0aGUgY2xhc3NOYW1lIHByb3BlcnR5IHRvIG1hbnVhbGx5IHJlcGVhdCB0aGUNCi0gKiBmdWxsIHF1YWxpZmllZCBjbGFzcyBuYW1lLg0KLSAqDQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGludGVyZmFjZSBCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIgZXh0ZW5kcyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbC5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlYTgxOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIGl0J3MganVzdCBhIGhlbHBlciBmb3IgcHJveGllcyAtIHlvdSBqdXN0IG5lZWQgaXQsIGlmIHlvdSBkZWZpbmUgdGhlIGVxdWl2YWxlbnQgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotICoNCi0gKiBpZiB0aGVyZSBpcyBhbHNvIGEgcHJveHkgZm9yIHRoZSB0cmFuc2Zvcm1lciB5b3UgY2FuIHVzZSB0aGUgY2xhc3NOYW1lIHByb3BlcnR5IHRvIG1hbnVhbGx5IHJlcGVhdCB0aGUNCi0gKiBmdWxsIHF1YWxpZmllZCBjbGFzcyBuYW1lLg0KLSAqDQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGNsYXNzIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyLCBCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICBwcml2YXRlIFN0cmluZyBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lOw0KLQ0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyLmNvbnZlcnRNZXRhRGF0YShtZXRhRGF0YUVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWU7DQotICAgICAgICB9DQotICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKFN0cmluZyBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUgPSBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGdldE1ldGFEYXRhVHJhbnNmb3JtZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVRyYW5zZm9ybWVyKE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyID0gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMWY3ZGYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5JZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5OZXN0ZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIuDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotDQotLyoqDQotICogRmFjdG9yeSB3aGljaCBjcmVhdGVzIHRoZSBNZXRhRGF0YVRyYW5zZm9ybWVyIGZvciBhIGdpdmVuIFZhbGlkYXRpb25TdHJhdGVneQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotLyoNCi0gKiBWYWxpZGF0aW9uU3RyYXRlZ3kgLT4gTWV0YURhdGFUcmFuc2Zvcm1lciBpbnN0ZWFkIG9mIE1ldGEtRGF0YSAtPiBNZXRhRGF0YVRyYW5zZm9ybWVyDQotICogdG8gYXZvaWQgYSBzZWNvbmQgc3RhdGljIG1hcHBpbmcgZS5nLiBmb3IganBhIGFubm90YXRpb25zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneT4NCi0gICAgICAgIGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1ldGFEYXRhVHJhbnNmb3JtZXI+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZzsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gc3ViTmFtZU1hcHBlckxpc3QgPQ0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PigpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vc2luY2UgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIHN0YXJ0dXAgbGlzdGVuZXIgb2YgdGhlIGNvcmUgZ2V0cyBleGVjdXRlZCBmaXJzdA0KLSAgICAgICAgcmVnaXN0ZXIobmV3IFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFUcmFuc2Zvcm1lciBjcmVhdGUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgPSBjcmVhdGVWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lKHZhbGlkYXRpb25TdHJhdGVneSk7DQotDQotICAgICAgICB0cnlUb0luaXRTdGF0aWNNYXBwaW5ncygpOw0KLQ0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyID0NCi0gICAgICAgICAgICAgICAgdHJ5VG9SZXNvbHZlQ2FjaGVkTWV0YURhdGFUcmFuc2Zvcm1lcih2YWxpZGF0aW9uU3RyYXRlZ3ksIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLQ0KLSAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZUFuZENhY2hlTWV0YURhdGFUcmFuc2Zvcm1lcih2YWxpZGF0aW9uU3RyYXRlZ3ksIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVZhbGlkYXRpb25TdHJhdGVneU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiBpc1Byb3h5RGV0ZWN0ZWQgPSBpc1Byb3h5KHZhbGlkYXRpb25TdHJhdGVneSk7DQotICAgICAgICAvL2luIGNhc2Ugb2YgYSBwcm94eSBhbmQgdGhlIHVzYWdlIG9mIGEgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi0gICAgICAgIGlmIChpc1Byb3h5RGV0ZWN0ZWQgJiYgdmFsaWRhdGlvblN0cmF0ZWd5IGluc3RhbmNlb2YgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICgoQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIpdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gIWlzUHJveHlEZXRlY3RlZCA/IHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvSW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljTWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQcm94eShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpID09IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIGNyZWF0ZUFuZENhY2hlTWV0YURhdGFUcmFuc2Zvcm1lcigNCi0gICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LCBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICAgICAgU3RyaW5nIHRyYW5zZm9ybWVyTmFtZTsNCi0gICAgICAgIC8vbnVsbCAtPiB1c2UgbmFtZSBtYXBwZXJzDQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiBuYW1lTWFwcGVyIDogbmFtZU1hcHBlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJhbnNmb3JtZXJOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKHZhbGlkYXRpb25TdHJhdGVneSk7DQotDQotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWVyTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSB0cnlUb0NyZWF0ZUFuZENhY2hlTWV0YURhdGFUcmFuc2Zvcm1lcigNCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgdHJhbnNmb3JtZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhVHJhbnNmb3JtZXIgdHJ5VG9SZXNvbHZlQ2FjaGVkTWV0YURhdGFUcmFuc2Zvcm1lcigNCi0gICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LCBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcuY29udGFpbnNLZXkodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChNZXRhRGF0YVRyYW5zZm9ybWVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSgNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZy5nZXQodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5IGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBuZXdWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArIElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneS5JRF9QUkVGSVggKw0KLSAgICAgICAgICAgICAgICAgICAgKChJZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kpdmFsaWRhdGlvblN0cmF0ZWd5KS5nZXRJZCgpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLmNvbnRhaW5zS2V5KG5ld1ZhbGlkYXRpb25TdHJhdGVneU5hbWUpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIChNZXRhRGF0YVRyYW5zZm9ybWVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSgNCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcuZ2V0KG5ld1ZhbGlkYXRpb25TdHJhdGVneU5hbWUpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhVHJhbnNmb3JtZXIgdHJ5VG9DcmVhdGVBbmRDYWNoZU1ldGFEYXRhVHJhbnNmb3JtZXIoDQotICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0cmFuc2Zvcm1lck5hbWUpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lciA9IChNZXRhRGF0YVRyYW5zZm9ybWVyKQ0KLSAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodHJhbnNmb3JtZXJOYW1lKTsNCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5IGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICs9IElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneS5JRF9QUkVGSVggKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneSl2YWxpZGF0aW9uU3RyYXRlZ3kpLmdldElkKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCB0cmFuc2Zvcm1lck5hbWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgLy9zZXR1cCBpbnRlcm5hbCBzdGF0aWMgbWFwcGluZ3MNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnIDoNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhtYXBwaW5nLmdldFNvdXJjZSgpLCBtYXBwaW5nLmdldFRhcmdldCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0cmFuc2Zvcm1lck5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkaW5nIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWV0YS1kYXRhIHRyYW5zZm9ybWVyIG1hcHBpbmc6ICINCi0gICAgICAgICAgICAgICAgKyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgIiAtPiAiICsgdHJhbnNmb3JtZXJOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcucHV0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIHRyYW5zZm9ybWVyTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgU29ydGVkTmFtZU1hcHBlckxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+Pih0aGlzLm5hbWVNYXBwZXJMaXN0LCB0aGlzLnN1Yk5hbWVNYXBwZXJMaXN0KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIHRyeVRvSW5pdE5hbWVNYXBwZXJXaXRoRXhpc3RpbmdTdWJNYXBwZXJzKHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpOw0KLSAgICAgICAgc3VwZXIucmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIGl0J3MgYSB2ZXJ5IHNwZWNpYWwgY2FzZSBkdWUgdG8gdGhlIG1pc3Npbmcgb3JkZXIgaW4gdGhlIGV4ZWN1dGlvbiBvZiBzdGFydHVwLWxpc3RlbmVycyAocGhhc2UgbGlzdGVuZXJzKQ0KLSAgICAgKiBwYWNrYWdlZCBpbiBmYWNlcy1jb25maWcueG1sIGZpbGVzIG9mIGphcnMNCi0gICAgICoNCi0gICAgICogbm9ybWFsbHkgdGhlIGRlZmF1bHQgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyIHNob3VsZCBiZSBlbm91Z2gNCi0gICAgICogYW55d2F5LCBpZiBhIG1vZHVsZSBhZGRzIGEgbmV3IFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlciwNCi0gICAgICogYWxsIHByZXZpb3VzIGFkZGVkIFN1Yk5hbWVNYXBwZXJzIGhhdmUgdG8gYmUgYWRkZWQgdG8gYXZvaWQgY29uZnVzaW9uIGluIHNwZWNpYWwgY2FzZXMuDQotICAgICAqIGlmIGEgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIGZpbmFsIGV4dGVuZCB0aGUgaW50ZXJmYWNlIGFuZCBmaWx0ZXIgaXQgaW4gYWRkTmFtZU1hcHBlcg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgd2hpY2ggaGFzIHRvIGJlIGFkZGVkDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9Jbml0TmFtZU1hcHBlcldpdGhFeGlzdGluZ1N1Yk1hcHBlcnMoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgaW5zdGFuY2VvZiBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yKE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiBuYW1lTWFwcGVyIDogdGhpcy5zdWJOYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKG5hbWVNYXBwZXIuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KE5lc3RlZC5jbGFzcykpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICgoU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4pdmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcikNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZE5hbWVNYXBwZXIobmFtZU1hcHBlcik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNTA0YjIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQWxsb3dzIHRvIHRyYW5zZm9ybSBjb25jcmV0ZSBtZXRhLWRhdGEgdG8gYSBtb3JlIGFic3RyYWN0IGZvcm0uPGJyLz4NCi0gKiBlLmcuOiBAUmVxdWlyZWQsIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwuLi4pLCBATGVuZ3RoKG1pbmltdW0gPSAxKSwgLi4uIC0+IHJlcXVpcmVkID0gdHJ1ZQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLS8vKlRyYW5zZm9ybWVyIGluc3RlYWQgb2YgKkNvbnZlcnRlciB0byBhdm9pZCBuYW1pbmcgY29uZnVzaW9uIA0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YSk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9Tb3J0ZWROYW1lTWFwcGVyTGlzdC5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NvcnRlZE5hbWVNYXBwZXJMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiY2JiNDguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NvcnRlZE5hbWVNYXBwZXJMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5OZXN0ZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7DQotDQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLWNsYXNzIFNvcnRlZE5hbWVNYXBwZXJMaXN0PFQgZXh0ZW5kcyBOYW1lTWFwcGVyPiBpbXBsZW1lbnRzIExpc3Q8VD4NCi17DQotICAgIHByaXZhdGUgTGlzdDxUPiB3cmFwcGVkOw0KLSAgICBwcml2YXRlIExpc3Q8VD4gZ2xvYmFsU3ViTmFtZU1hcHBlckxpc3Q7DQotDQotICAgIFNvcnRlZE5hbWVNYXBwZXJMaXN0KExpc3Q8VD4gd3JhcHBlZCwgTGlzdDxUPiBzdWJOYW1lTWFwcGVyTGlzdCkNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsNCi0gICAgICAgIHRoaXMuZ2xvYmFsU3ViTmFtZU1hcHBlckxpc3QgPSBzdWJOYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoVCB0KQ0KLSAgICB7DQotICAgICAgICBpZiAodCAhPSBudWxsICYmIHQuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KE5lc3RlZC5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkZFN1Yk5hbWVNYXBwZXIodCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB3cmFwcGVkLmFkZCh0KTsNCi0NCi0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHdyYXBwZWQsIG5ldyBDb21wYXJhdG9yPFQ+KCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShUIG5tMSwgVCBubTIpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChubTEgaW5zdGFuY2VvZiBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIgJiYgbm0yIGluc3RhbmNlb2YgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5tMSBpbnN0YW5jZW9mIFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlciA/IDEgOiAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHJpdmF0ZSBib29sZWFuIGFkZFN1Yk5hbWVNYXBwZXIoVCBzdWJOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyIG5hbWVNYXBwZXIgOiB0aGlzLndyYXBwZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKG5hbWVNYXBwZXIgaW5zdGFuY2VvZiBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAoKFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcikgbmFtZU1hcHBlcikuYWRkTmFtZU1hcHBlcihzdWJOYW1lTWFwcGVyKTsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICB0cnlUb0FkZE1hcHBlckFzR2xvYmFsU3ViTmFtZU1hcHBlcihzdWJOYW1lTWFwcGVyKTsNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvQWRkTWFwcGVyQXNHbG9iYWxTdWJOYW1lTWFwcGVyKFQgc3ViTmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgaWYoIXRoaXMuZ2xvYmFsU3ViTmFtZU1hcHBlckxpc3QuY29udGFpbnMoc3ViTmFtZU1hcHBlcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5nbG9iYWxTdWJOYW1lTWFwcGVyTGlzdC5hZGQoc3ViTmFtZU1hcHBlcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgaW50IHNpemUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5zaXplKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmlzRW1wdHkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udGFpbnMobyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaXRlcmF0b3IoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnRvQXJyYXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlN1c3BpY2lvdXNUb0FycmF5Q2FsbCJ9KQ0KLSAgICBwdWJsaWMgPFQ+IFRbXSB0b0FycmF5KFRbXSBhKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC50b0FycmF5KGEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVtb3ZlKG8pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udGFpbnNBbGwoYyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIFQ+IGMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmFkZEFsbChjKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUPiBjKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5hZGRBbGwoaW5kZXgsIGMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnJlbW92ZUFsbChjKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5yZXRhaW5BbGwoYyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKQ0KLSAgICB7DQotICAgICAgICB3cmFwcGVkLmNsZWFyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFQgZ2V0KGludCBpbmRleCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0KGluZGV4KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVCBzZXQoaW50IGluZGV4LCBUIGVsZW1lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnNldChpbmRleCwgZWxlbWVudCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgVCBlbGVtZW50KQ0KLSAgICB7DQotICAgICAgICB3cmFwcGVkLmFkZChpbmRleCwgZWxlbWVudCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFQgcmVtb3ZlKGludCBpbmRleCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVtb3ZlKGluZGV4KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmluZGV4T2Yobyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQubGFzdEluZGV4T2Yobyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3RJdGVyYXRvcjxUPiBsaXN0SXRlcmF0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5saXN0SXRlcmF0b3IoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yPFQ+IGxpc3RJdGVyYXRvcihpbnQgaW5kZXgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmxpc3RJdGVyYXRvcihpbmRleCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8VD4gc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuc3ViTGlzdChmcm9tSW5kZXgsIHRvSW5kZXgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGFkYzE2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg4OTRkMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciAtIGlmIHRoZXJlIGlzIGEgcHJveHkgYXJvdW5kIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5Lg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcig1MDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoKEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKXZhbGlkYXRpb25TdHJhdGVneSkuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjFhYWY5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKiAoY29uZmlndXJlZCB2aWEgd2ViLnhtbCkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZkMDgwZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKiAoY29uZmlndXJlZCB2aWEgaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbikNCi0gKiBUaGUgYmVhbiBwcm92aWRlcyB0aGUgZGVmYXVsdCBuYW1lIChjb252ZW50aW9uKS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gZnVsbCBxdWFsaWZpZWQgbmFtZS4gKD0gY3VzdG9taXphYmxlIGNvbnZlbnRpb24pDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhYTEyMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBtYXBzIEV4dFZhbCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBnZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWMzZGMyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIHRvIHBsYWNlIFZhbGlkYXRpb25TdHJhdGVnaWVzIGFuZCBNZXRhRGF0YVRyYW5zZm9ybWVycyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcig0MDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZ2V0U2ltcGxlTWV0YURhdGFUcmFuc2Zvcm1lck5hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArICIuIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTWV0YURhdGFUcmFuc2Zvcm1lck5hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneVBhY2thZ2VOYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcG9zdGZpeCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYKTsNCi0NCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5lbmRzV2l0aCgiVmFsaWRhdGlvblN0cmF0ZWd5IikgfHwNCi0gICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5lbmRzV2l0aCgiU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUgKyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCkgLHBvc3RmaXgpDQotICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgiVmFsaWRhdGlvblN0cmF0ZWd5IiwgcG9zdGZpeCkNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCJTdHJhdGVneSIsIHBvc3RmaXgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGEgc3RhdGljIHZhbGlkYXRpb24gc3RyYXRlZ3kgbWFwcGluZw0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneVBhY2thZ2VOYW1lICsgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lICsgcG9zdGZpeDsNCi0gICAgfQ0KLQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1ZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNiMTFiOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1ZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLlN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuTmVzdGVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyDQotICAgIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotICAgIGltcGxlbWVudHMgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IHN1Yk5hbWVNYXBwZXJzID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZE5hbWVNYXBwZXIoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IG5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIGlmKCF0aGlzLnN1Yk5hbWVNYXBwZXJzLmNvbnRhaW5zKG5hbWVNYXBwZXIpICYmIG5hbWVNYXBwZXIuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KE5lc3RlZC5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5zdWJOYW1lTWFwcGVycy5hZGQobmFtZU1hcHBlcik7DQotICAgICAgICAgICAgc29ydFN1Yk5hbWVNYXBwZXJzKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNvcnRTdWJOYW1lTWFwcGVycygpDQotICAgIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQodGhpcy5zdWJOYW1lTWFwcGVycywgbmV3IEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7DQotDQotICAgICAgICBmb3IoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IG1hcHBlciA6IHRoaXMuc3ViTmFtZU1hcHBlcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gbWFwcGVyLmNyZWF0ZU5hbWUoc291cmNlKTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDVmNTI4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24gaW1wbGVtZW50cyBQcm9wZXJ0eUluZm9ybWF0aW9uCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBpbmZvcm1hdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgIHByaXZhdGUgTGlzdDxNZXRhRGF0YUVudHJ5PiBtZXRhRGF0YUxpc3QgPSBuZXcgQXJyYXlMaXN0PE1ldGFEYXRhRW50cnk+KCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0luZm9ybWF0aW9uKFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gaW5mb3JtYXRpb25NYXAuY29udGFpbnNLZXkoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEluZm9ybWF0aW9uKFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gaW5mb3JtYXRpb25NYXAuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIDxUPiBUIGdldEluZm9ybWF0aW9uKFN0cmluZyBrZXksIENsYXNzPFQ+IHRhcmdldENsYXNzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUKSBnZXRJbmZvcm1hdGlvbihrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEluZm9ybWF0aW9uKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJuZXcgaW5mb3JtYXRpb24gYWRkZWQga2V5OiAiICsga2V5ICsgIiB2YWx1ZTogIiArIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGluZm9ybWF0aW9uTWFwLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeVtdIGdldE1ldGFEYXRhRW50cmllcygpCi0gICAgewotICAgICAgICByZXR1cm4gbWV0YURhdGFMaXN0LnRvQXJyYXkobmV3IE1ldGFEYXRhRW50cnlbbWV0YURhdGFMaXN0LnNpemUoKV0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1ldGFEYXRhRW50cnkoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQotICAgIHsKLSAgICAgICAgbWV0YURhdGFFbnRyeS5zZXRQcm9wZXJ0aWVzKHRoaXMuaW5mb3JtYXRpb25NYXApOwotICAgICAgICB0aGlzLm1ldGFEYXRhTGlzdC5hZGQobWV0YURhdGFFbnRyeSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXRNZXRhRGF0YUVudHJpZXMoKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoInJlc2V0dGluZyBtZXRhLWRhdGEgZW50cmllcyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5tZXRhRGF0YUxpc3QuY2xlYXIoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlEZXRhaWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlEZXRhaWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MDM3Y2YuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5RGV0YWlscwotewotICAgIC8vZm9ybXMgdGhlIGlkIGZvciBjcm9zcy12YWxpZGF0aW9uIHdpdGhpbiBjb21wbGV4IGNvbXBvbmVudHMKLSAgICBwcml2YXRlIFN0cmluZyBrZXk7Ci0gICAgcHJpdmF0ZSBPYmplY3QgYmFzZU9iamVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eURldGFpbHMoU3RyaW5nIGtleSwgT2JqZWN0IGJhc2VPYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgICAgICB0aGlzLmJhc2VPYmplY3QgPSBiYXNlT2JqZWN0OwotICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRLZXkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmFzZU9iamVjdCgpCi0gICAgewotICAgICAgICByZXR1cm4gYmFzZU9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlT2JqZWN0KE9iamVjdCBiYXNlT2JqZWN0KQotICAgIHsKLSAgICAgICAgdGhpcy5iYXNlT2JqZWN0ID0gYmFzZU9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOTI4NGYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlJbmZvcm1hdGlvbgotewotICAgIGJvb2xlYW4gY29udGFpbnNJbmZvcm1hdGlvbihTdHJpbmcga2V5KTsKLSAgICBPYmplY3QgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSk7Ci0gICAgPFQ+IFQgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpOwotICAgIHZvaWQgc2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKTsKLQotICAgIE1ldGFEYXRhRW50cnlbXSBnZXRNZXRhRGF0YUVudHJpZXMoKTsKLSAgICB2b2lkIGFkZE1ldGFEYXRhRW50cnkoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KTsKLSAgICB2b2lkIHJlc2V0TWV0YURhdGFFbnRyaWVzKCk7Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGU5MjVjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cwotewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfREVUQUlMUyA9ICJwcm9wZXJ0eV9kZXRhaWxzIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSVBfVkFMSURBVElPTiA9ICJza2lwX3ZhbGlkYXRpb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSAibGFiZWwiOwotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlY29yZGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZWNvcmRlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MGYyM2YuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlY29yZGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci0KLS8qKgotICogQWxsb3dzIHRvIGNhcHR1cmUgY29udmVydGVkIHZhbHVlcy4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcgotewotICAgIHZvaWQgcmVjb3JkVXNlcklucHV0KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0Fic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlkZTVjNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0Fic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotCi0vKioKLSAqIEJhc2UgZm9yIGFsbCBSZW5kZXJLaXRXcmFwcGVyRmFjdG9yaWVzIHRvIGZvcmNlIGEgc3BlY2lmaWMgYmVoYXZpb3VyCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8UmVuZGVyS2l0LCBSZW5kZXJLaXQ+Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHdyYXBwZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRlYWN0aXZhdGVkID0gZmFsc2U7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgcmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGhpcy53cmFwcGVkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMud3JhcHBlZC5hZGRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeShyZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLndyYXBwZWQgPSByZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGRlYWN0aXZhdGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmRlYWN0aXZhdGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlYWN0aXZhdGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWFjdGl2YXRlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgUmVuZGVyS2l0IGNyZWF0ZShSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgaWYoaXNEZWFjdGl2YXRlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFJlbmRlcktpdCByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIGlmKHRoaXMud3JhcHBlZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSB0aGlzLndyYXBwZWQuY3JlYXRlKHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVdyYXBwZXIocmVuZGVyS2l0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFJlbmRlcktpdCBjcmVhdGVXcmFwcGVyKFJlbmRlcktpdCByZW5kZXJLaXQpOwotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMjZiNzIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeQotewotICAgIHByaXZhdGUgUmVuZGVyS2l0IHJlbmRlcktpdDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJJQ19SRU5ERVJfS0lUX1dSQVBQRVJfRkFDVE9SWSA9Ci0gICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0LkdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiB1c2VHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCBjcmVhdGVXcmFwcGVyKFJlbmRlcktpdCByZW5kZXJLaXQpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVya2l0IHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcktpdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3dvcmthcm91bmQgZm9yIG1vamFycmEgKEVYVFZBTC0zOCkKLSAgICAgICAgaWYodXNlR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENsYXNzIGdlbmVyaWNGYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUoR0VORVJJQ19SRU5ERVJfS0lUX1dSQVBQRVJfRkFDVE9SWSk7Ci0gICAgICAgICAgICB1c2VHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgPSBnZW5lcmljRmFjdG9yeSAhPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodXNlR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5KQotICAgICAgICB7Ci0gICAgICAgICAgICBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID0gKEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpQ2xhc3NVdGlscwotICAgICAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShHRU5FUklDX1JFTkRFUl9LSVRfV1JBUFBFUl9GQUNUT1JZKTsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jcmVhdGVXcmFwcGVyKHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLnJlbmRlcktpdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnJlbmRlcktpdCA9IG5ldyBFeHRWYWxSZW5kZXJLaXQocmVuZGVyS2l0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJLaXQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzNjI4Ny4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbExhenlSZW5kZXJlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotCi0vKioKLSAqIHRvIHN1cHBvcnQgYSBjdXN0b20gcHJveHkKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkgZXh0ZW5kcyBSZW5kZXJlcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIFJlbmRlcmVyIHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSByZW5kZXJlcjsKLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzaW1wbGUgcHJveHkgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZXRMYXp5UmVuZGVyZXIoKS5lbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZXRMYXp5UmVuZGVyZXIoKS5lbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydENsaWVudElkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldExhenlSZW5kZXJlcigpLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGdldFJlbmRlcnNDaGlsZHJlbigpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRMYXp5UmVuZGVyZXIoKS5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlbmRlcmVyIGdldExhenlSZW5kZXJlcigpCi0gICAgewotICAgICAgICBTdHJpbmcgcHJveHlDbGFzc05hbWUgPSAoU3RyaW5nKSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSk7Ci0KLSAgICAgICAgaWYocHJveHlDbGFzc05hbWUgIT0gbnVsbCAmJiAhcHJveHlDbGFzc05hbWUuZW5kc1dpdGgoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKHByb3h5Q2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgaWYodGFyZ2V0Q2xhc3MgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhIGN1c3RvbSBpbnZhbGlkIHJlbmRlcmVyIHByb3h5IGlzIGNvbmZpZ3VyZWQ6ICIgKyBwcm94eUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENsYXNzW10gYXJnQ2xhc3NlcyA9IG5ldyBDbGFzc1sxXTsKLSAgICAgICAgICAgIGFyZ0NsYXNzZXNbMF0gPSBSZW5kZXJlci5jbGFzczsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSB0YXJnZXRDbGFzcy5nZXRDb25zdHJ1Y3RvcihhcmdDbGFzc2VzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFJlbmRlcmVyKWNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBjcmVhdGU6ICIgKyB0YXJnZXRDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkOwotICAgICAgICB9Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXQuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMzU0ZTUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VTdHJlYW07Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVdyaXRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVzcG9uc2VTdGF0ZU1hbmFnZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJLaXQgZXh0ZW5kcyBSZW5kZXJLaXQKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgd3JhcHBlZDsKLQotICAgIHB1YmxpYyBFeHRWYWxSZW5kZXJLaXQoUmVuZGVyS2l0IHdyYXBwZWQpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOwotCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICBpZiAocmVuZGVyZXIgaW5zdGFuY2VvZiBFeHRWYWxSZW5kZXJlcldyYXBwZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIHJlbmRlcmVyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIGNyZWF0ZVdyYXBwZXIocmVuZGVyZXIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBSZW5kZXJlciBnZXRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSB3cmFwcGVkLmdldFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlKTsKLQotICAgICAgICBpZihyZW5kZXJlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyZXIgaW5zdGFuY2VvZiBFeHRWYWxSZW5kZXJlcldyYXBwZXIgPyByZW5kZXJlciA6IGNyZWF0ZVdyYXBwZXIocmVuZGVyZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCJubyByZW5kZXJlciBmb3VuZCBmb3IgZmFtaWx5ICIgKyBmYW1pbHkgKyAiIGFuZCB0eXBlICIgKyByZW5kZXJlclR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlbmRlcmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZVN0YXRlTWFuYWdlciBnZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZVdyaXRlciBjcmVhdGVSZXNwb25zZVdyaXRlcihXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcywgU3RyaW5nIHMxKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY3JlYXRlUmVzcG9uc2VXcml0ZXIod3JpdGVyLCBzLCBzMSk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlU3RyZWFtIGNyZWF0ZVJlc3BvbnNlU3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jcmVhdGVSZXNwb25zZVN0cmVhbShvdXRwdXRTdHJlYW0pOwotICAgIH0KLQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIGNyZWF0ZVdyYXBwZXIoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEV4dFZhbFJlbmRlcmVyV3JhcHBlcihyZW5kZXJlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXRGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI4MmJiYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeTsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBjZW50cmFsIG1lY2hhbmlzbSB3aGljaCBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgYSB3cmFwcGVyIGZvciBhIHJlbmRlcmVyIC0gc3RhcnRpbmcgcG9pbnQgb2YgZXh0dmFsLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeSBleHRlbmRzIFJlbmRlcktpdEZhY3RvcnkKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotICAgIHByaXZhdGUgUmVuZGVyS2l0RmFjdG9yeSB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcktpdEZhY3RvcnkoUmVuZGVyS2l0RmFjdG9yeSByZW5kZXJLaXRGYWN0b3J5KQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyS2l0RmFjdG9yeTsKLQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcktpdChTdHJpbmcgcywgUmVuZGVyS2l0IHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIHdyYXBwZWQuYWRkUmVuZGVyS2l0KHMsIHJlbmRlcktpdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlbmRlcktpdCBnZXRSZW5kZXJLaXQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICBSZW5kZXJLaXQgcmVuZGVyS2l0ID0gdGhpcy53cmFwcGVkLmdldFJlbmRlcktpdChmYWNlc0NvbnRleHQsIHMpOwotCi0gICAgICAgIC8vanNmIHJpICsgdHJpbmlkYWQKLSAgICAgICAgaWYocmVuZGVyS2l0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSB3cmFwcGVyRmFjdG9yeSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgIC8vc29tZSBjb21wb25lbnQgbGlicyBlLmcuIG15ZmFjZXMtdHJpbmlkYWQgYXJlbid0IGNvbXBhdGlibGUgd2l0aCB0aGlzIGNsZWFuIGFwcHJvYWNoCi0gICAgICAgIC8vZXhhbXBsZSBzZWUgVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIKLSAgICAgICAgaWYod3JhcHBlckZhY3RvcnkuaXNEZWFjdGl2YXRlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJGYWN0b3J5LmNyZWF0ZShyZW5kZXJLaXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGdldFJlbmRlcktpdElkcygpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZW5kZXJLaXRJZHMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyUHJveHkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjYxYjllLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlJlbmRlcmVyUHJveHlTdG9yYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIHRvIGF2b2lkIG11bHRpcGxlIGNhbGxzIG9mIHJlbmRlcmVyIG1ldGhvZHMgd2l0aGluIHJlbmRlcmVyIGludGVyY2VwdG9ycyAoZS5nLiBmb3IgZW5jb2RlLCBkZWNvZGUsLi4uKQotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyZXJQcm94eSBleHRlbmRzIFJlbmRlcmVyCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZID0gRXh0VmFsUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCkgKyAiOktFWSI7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgd3JhcHBlZDsKLQotICAgIHB1YmxpYyBFeHRWYWxSZW5kZXJlclByb3h5KFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyZXI7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgicHJveHkgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkgPSBnZXRSZW5kZXJlckVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNEZWNvZGVDYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RGVjb2RlQ2FsbGVkKHRydWUpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLndyYXBwZWQuZGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImRvdWJsZSBjYWxsIG9mIG1ldGhvZCAnZGVjb2RlJyBmaWx0ZXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBlbnRyeSA9IGdldFJlbmRlcmVyRW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0VuY29kZUJlZ2luQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldEVuY29kZUJlZ2luQ2FsbGVkKHRydWUpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVkLmVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImRvdWJsZSBjYWxsIG9mIG1ldGhvZCAnZW5jb2RlQmVnaW4nIGZpbHRlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGVudHJ5ID0gZ2V0UmVuZGVyZXJFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRW5jb2RlQ2hpbGRyZW5DYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RW5jb2RlQ2hpbGRyZW5DYWxsZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlZC5lbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkb3VibGUgY2FsbCBvZiBtZXRob2QgJ2VuY29kZUNoaWxkcmVuJyBmaWx0ZXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkgPSBnZXRSZW5kZXJlckVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNFbmNvZGVFbmRDYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RW5jb2RlRW5kQ2FsbGVkKHRydWUpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLndyYXBwZWQuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImRvdWJsZSBjYWxsIG9mIG1ldGhvZCAnZW5jb2RlRW5kJyBmaWx0ZXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0Q2xpZW50SWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udmVydENsaWVudElkKGZhY2VzQ29udGV4dCwgcyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgewotICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICB0aHJvdyB0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkgPSBnZXRSZW5kZXJlckVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmIChlbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVudHJ5LnNldENvbnZlcnRlZFZhbHVlKHdyYXBwZWQuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImRvdWJsZSBjYWxsIG9mIG1ldGhvZCAnZ2V0Q29udmVydGVkVmFsdWUnIGZpbHRlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZ2V0UmVuZGVyZXJFbnRyeShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGtleSArPSBnZXRPcHRpb25hbEtleShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWdldFJlbmRlcmVyU3RvcmFnZSgpLmNvbnRhaW5zRW50cnkoZ2V0UmVuZGVyZXJLZXkoKSwga2V5KSkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0UmVuZGVyZXJTdG9yYWdlKCkuc2V0RW50cnkoZ2V0UmVuZGVyZXJLZXkoKSwga2V5LCBuZXcgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZXJTdG9yYWdlKCkuZ2V0RW50cnkoZ2V0UmVuZGVyZXJLZXkoKSwga2V5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wdGlvbmFsS2V5KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVuZGVyZXJLZXkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlbmRlcmVyUHJveHlTdG9yYWdlIGdldFJlbmRlcmVyU3RvcmFnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShSZW5kZXJlclByb3h5U3RvcmFnZS5jbGFzcywgUmVuZGVyZXJQcm94eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgLy9yZXNldCBjb21wb25lbnQgcHJveHkgbWFwcGluZwotICAgICAgICBFeHRWYWxVdGlscy5yZXNldFN0b3JhZ2UoUmVuZGVyZXJQcm94eVN0b3JhZ2UuY2xhc3MsIFJlbmRlcmVyUHJveHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YzMwNWUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotCi0vKioKLSAqIERlZmF1bHQgYXBwcm9hY2ggdG8gYXZvaWQgcHJveGllcyBmb3IgY29udmVydGVycyBhbmQgdGhlIGFkYXB0ZXIgZmFsbGJhY2suCi0gKiBJdCByZXF1aXJlcyB0aGF0IGNvbXBvbmVudHMgZGVsZWdhdGUgZ2V0Q29udmVydGVkVmFsdWUgdG8gYSByZW5kZXJlci48YnIvPgotICogSWYgaXQgaXNuJ3QgdGhlIGNhc2UgZm9yIHlvdXIgY29tcG9uZW50IGxpYiB1c2U6Ci0gKiBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5FeHRWYWxBcHBsaWNhdGlvbkZhY3Rvcnk8YnIvPgotICogYW5kPGJyLz4KLSAqIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5LlByb3h5TWFwcGluZ1BoYXNlTGlzdGVuZXIKLSAqIDxwLz4KLSAqIFRoaXMgd3JhcHBlciB3aWxsIGFsc28gaW1wbGVtZW50IGNsaWVudC1zaWRlIHZhbGlkYXRpb24gYmVoYXZpb3VyCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJlcldyYXBwZXIgZXh0ZW5kcyBSZW5kZXJlcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgd3JhcHBlZDsKLSAgICBwcm90ZWN0ZWQgRXh0VmFsQ29udGV4dCBleHRWYWxDb250ZXh0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCk7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyZXJXcmFwcGVyKFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHByb3h5Q2xhc3NOYW1lID0gKFN0cmluZylFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSk7Ci0KLSAgICAgICAgaWYocHJveHlDbGFzc05hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyBleHR2YWwgcmVuZGVyZXIgcHJveHkgY29uZmlndXJlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSBuZXcgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkocmVuZGVyZXIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShwcm94eUNsYXNzTmFtZSk7Ci0KLSAgICAgICAgaWYodGFyZ2V0Q2xhc3MgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyBleHR2YWwgcmVuZGVyZXIgcHJveHkgY29uZmlndXJlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSBuZXcgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkocmVuZGVyZXIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xhc3NbXSBhcmdDbGFzc2VzID0gbmV3IENsYXNzWzFdOwotICAgICAgICBhcmdDbGFzc2VzWzBdID0gUmVuZGVyZXIuY2xhc3M7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGFyZ2V0Q2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJnQ2xhc3Nlcyk7Ci0gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSAoUmVuZGVyZXIpY29uc3RydWN0b3IubmV3SW5zdGFuY2UocmVuZGVyZXIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIud2Fybigibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVyZXIgd3JhcHBlciBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkZWNvZGUgZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRGVjb2RlIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJEZWNvZGUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckRlY29kZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImVuY29kZUJlZ2luIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUJlZ2luIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUJlZ2luIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVFbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZW5jb2RlQ2hpbGRyZW4gZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlQ2hpbGRyZW4gb2YgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUNoaWxkcmVuIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJFbmNvZGVDaGlsZHJlbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVDaGlsZHJlbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQ2hpbGRyZW4gaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJlbmNvZGVFbmQgZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUVuZCBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVFbmQgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGdldFJlbmRlcnNDaGlsZHJlbigpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZW5kZXJzQ2hpbGRyZW4oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLSAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbywgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdCA9IGUuZ2V0UmV0dXJuVmFsdWVPbkV4Y2VwdGlvbihjb252ZXJ0ZWRPYmplY3QpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImdldENvbnZlcnRlZFZhbHVlIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUdldENvbnZlcnRlZFZhbHVlIG9mICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QgPSB3cmFwcGVkLmdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8pOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyR2V0Q29udmVydGVkVmFsdWUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvLCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyR2V0Q29udmVydGVkVmFsdWUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckdldENvbnZlcnRlZFZhbHVlIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZE9iamVjdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjJmZmRhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNDcyNzkwNDk4NzY2MjUxMzQ2TDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YzIwYTcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDE4NDI0MDUxNDY0ODE0ODg4TDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MjBmYmUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlJlbmRlcmVySW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICAgIHByb3RlY3RlZCBSZW5kZXJlckludGVyY2VwdG9yIGV4Y2VwdGlvblNvdXJjZTsKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGluZm9ybWF0aW9uOwotICAgIGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjM0MzA3NDA3NzUzMjkxNTcyMkw7Ci0KLSAgICBwdWJsaWMgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbigpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzKQotICAgIHsKLSAgICAgICAgdGhpcy5za2lwT3RoZXJJbnRlcmNlcHRvcnMgPSBza2lwT3RoZXJJbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgcHVibGljIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oYm9vbGVhbiBza2lwT3RoZXJJbnRlcmNlcHRvcnMsIFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHRoaXMoc2tpcE90aGVySW50ZXJjZXB0b3JzKTsKLSAgICAgICAgdGhpcy5leGNlcHRpb25Tb3VyY2UgPSByZW5kZXJlckludGVyY2VwdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEluZm9ybWF0aW9uKE9iamVjdCBpbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIHRoaXMuaW5mb3JtYXRpb24gPSBpbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEluZm9ybWF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NraXBPdGhlckludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gc2tpcE90aGVySW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmV0dXJuVmFsdWVPbkV4Y2VwdGlvbihPYmplY3QgY3VycmVudFJldHVyblZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMuZXhjZXB0aW9uU291cmNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmV4Y2VwdGlvblNvdXJjZS5nZXRSZXR1cm5WYWx1ZU9uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbih0aGlzLCBjdXJyZW50UmV0dXJuVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjdXJyZW50UmV0dXJuVmFsdWU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0Fic3RyYWN0U3RhcnR1cExpc3RlbmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDZmNWM0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0Fic3RyYWN0U3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogSW4gb3JkZXIgdG8gZXhlY3V0ZSBsb2dpYyBqdXN0IG9uY2UuDQotICogZS5nLiByZWdpc3RlciBhcnRpZmFjdHMgdmlhIGFwaQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICAvL2Rvbid0IHJlbW92ZSAtIGl0J3MgYSBmYWxsYmFjayBpZiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCBkZXJlZ2lzdHJhdGlvbg0KLSAgICAvL3RhcmdldDogZG9uJ3QgcHJvY2VzcyBpbml0IGxvZ2ljIG1vcmUgdGhhbiBvbmNlDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8Q2xhc3M+IGluaXRpYWxpemVkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKEFic3RyYWN0U3RhcnR1cExpc3RlbmVyLmNsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZWRMaXN0ZW5lcnMuY29udGFpbnMoZ2V0Q2xhc3MoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnQgaW5pdCBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWlzU3RhcnR1cExpc3RlbmVyRGVhY3RpdmF0ZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImluaXQgb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkZWFjdGl2YXRlZCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiaW5pdCBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZmluYWxseQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEpzZlV0aWxzLmRlcmVnaXN0ZXJQaGFzZUxpc3RlbmVyKHRoaXMpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiYW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGRlcmVnaXN0ZXJpbmcgdGhlIHBoYXNlLWxpc3RlbmVyIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRDbGFzcygpLmdldE5hbWUoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC0+IHRoZXJlIGlzIGp1c3QgYSBsaXR0bGUgb3ZlcmhlYWQsIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJ1dCBldmVyeXRoaW5nIGVsc2Ugd29ya3MgY29ycmVjdGx5LiINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBob3dldmVyLCBwbGVhc2UgaW5mb3JtIHRoZSBjb21tdW5pdHkgYWJvdXQgeW91ciBjb25maWd1cmF0aW9uIiwgdCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZmluYWxseQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZExpc3RlbmVycy5hZGQoZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLlJFU1RPUkVfVklFVzsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1N0YXJ0dXBMaXN0ZW5lckRlYWN0aXZhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFV0aWxzLmdldEluaXRQYXJhbWV0ZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOkRFQUNUSVZBVEVEIikpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXQoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9FeHRWYWxTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZhOWVmZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9FeHRWYWxTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkh0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WaW9sYXRpb25TZXZlcml0eVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5GYWNlc01lc3NhZ2VQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIKLSAgICAgICAgLkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIKLSAgICAgICAgLkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIKLSAgICAgICAgLkRlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXIKLSAgICAgICAgLlNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjUwNDgyNjQyMTA4NjU3MjAxMkw7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKEV4dFZhbEluZm9ybWF0aW9uLlZFUlNJT04gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnRpbmcgdXAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciB2IiArIEV4dFZhbEluZm9ybWF0aW9uLlZFUlNJT04pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydGluZyB1cCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsKLQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSwgRXh0VmFsUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCksIGZhbHNlKTsKLQotICAgICAgICBpbml0TmFtZU1hcHBlcnMoKTsKLSAgICAgICAgaW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgaW5pdFZpb2xhdGlvblNldmVyaXR5SW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIGluaXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgZXhlY3V0ZUN1c3RvbVN0YXJ0dXBMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0TmFtZU1hcHBlcnMoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGRlYWN0aXZhdGVEZWZhdWx0TmFtZU1hcHBlcnMgPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9ERUZBVUxUX05BTUVfTUFQUEVSUzsKLSAgICAgICAgaWYgKChkZWFjdGl2YXRlRGVmYXVsdE5hbWVNYXBwZXJzICE9IG51bGwgJiYgZGVhY3RpdmF0ZURlZmF1bHROYW1lTWFwcGVycy5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvL3JlZ2lzdGVyIG1ldGFkYXRhIHRvIHZhbGlkYXRpb24gc3RyYXRlZ3kgbmFtZSBtYXBwZXIKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsKLQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsKLQotICAgICAgICAvL3JlZ2lzdGVyIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWVzc2FnZSByZXNvbHZlciBuYW1lIG1hcHBlcgotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0KLSAgICAgICAgLy9yZWdpc3RlciB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1ldGFkYXRhIHRyYW5zZm9ybWVyIG5hbWUgbWFwcGVyCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUN1c3RvbVN0YXJ0dXBMaXN0ZW5lcigpCi0gICAgewotICAgICAgICBTdHJpbmcgY3VzdG9tU3RhcnR1cExpc3RlbmVyTmFtZSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBUlRVUF9MSVNURU5FUik7Ci0gICAgICAgIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lciA9Ci0gICAgICAgICAgICAoQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGN1c3RvbVN0YXJ0dXBMaXN0ZW5lck5hbWUpOwotCi0gICAgICAgIGlmKGN1c3RvbVN0YXJ0dXBMaXN0ZW5lciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydCBpbml0IG9mICIgKyBjdXN0b21TdGFydHVwTGlzdGVuZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjdXN0b21TdGFydHVwTGlzdGVuZXIuaW5pdCgpOwotCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJpbml0IG9mICIgKyBjdXN0b21TdGFydHVwTGlzdGVuZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKAotICAgICAgICAgICAgICAgIG5ldyBIdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigKLSAgICAgICAgICAgICAgICBuZXcgVmlvbGF0aW9uU2V2ZXJpdHlWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRWaW9sYXRpb25TZXZlcml0eUludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5zZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKG5ldyBEZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IEZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0QXBwbGljYXRpb25TY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0QXBwbGljYXRpb25TY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIzOGJkZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdEFwcGxpY2F0aW9uU2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LlJFVVNFOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogZ2VuZXJpYyBzdG9yYWdlIG1hbmFnZXIgaW1wbGVtZW50YXRpb24gd2hpY2ggc3RvcmVzIHRoZSBzdG9yYWdlIGltcGxlbWVudGF0aW9ucyBpbiB0aGUgYXBwbGljYXRpb24gc2NvcGUNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFJFVVNFKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFwcGxpY2F0aW9uU2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPFQ+IGV4dGVuZHMgQWJzdHJhY3RTdG9yYWdlTWFuYWdlcjxUPg0KLXsNCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFQ+IHJlc29sdmVTdG9yYWdlTWFwKCkNCi0gICAgew0KLSAgICAgICAgTWFwIGFwcGxpY2F0aW9uTWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uTWFwKCk7DQotICAgICAgICBNYXA8U3RyaW5nLCBUPiBzdG9yYWdlTWFwOw0KLQ0KLSAgICAgICAgaWYoIWFwcGxpY2F0aW9uTWFwLmNvbnRhaW5zS2V5KGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0b3JhZ2VNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFQ+KCk7DQotICAgICAgICAgICAgYXBwbGljYXRpb25NYXAucHV0KGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCksIHN0b3JhZ2VNYXApOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChNYXA8U3RyaW5nLCBUPilhcHBsaWNhdGlvbk1hcC5nZXQoZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY2NjE0ZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuUkVVU0U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBnZW5lcmljIHN0b3JhZ2UgbWFuYWdlciBpbXBsZW1lbnRhdGlvbiB3aGljaCBzdG9yZXMgdGhlIHN0b3JhZ2UgaW1wbGVtZW50YXRpb25zIGluIHRoZSByZXF1ZXN0IHNjb3BlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihSRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPFQ+IGV4dGVuZHMgQWJzdHJhY3RTdG9yYWdlTWFuYWdlcjxUPg0KLXsNCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFQ+IHJlc29sdmVTdG9yYWdlTWFwKCkNCi0gICAgew0KLSAgICAgICAgTWFwIHJlcXVlc3RNYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpOw0KLSAgICAgICAgTWFwPFN0cmluZywgVD4gc3RvcmFnZU1hcDsNCi0NCi0gICAgICAgIGlmKCFyZXF1ZXN0TWFwLmNvbnRhaW5zS2V5KGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0b3JhZ2VNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFQ+KCk7DQotICAgICAgICAgICAgcmVxdWVzdE1hcC5wdXQoZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKSwgc3RvcmFnZU1hcCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKE1hcDxTdHJpbmcsIFQ+KXJlcXVlc3RNYXAuZ2V0KGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0U3RvcmFnZU1hbmFnZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0U3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZlNTAxYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdFN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LlJFVVNFOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIGdlbmVyaWMgc3RvcmFnZSBtYW5hZ2VyIGltcGxlbWVudGF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihSRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdG9yYWdlTWFuYWdlcjxUPiBleHRlbmRzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxTdHJpbmc+DQotICAgICAgICBpbXBsZW1lbnRzIFN0b3JhZ2VNYW5hZ2VyPFQ+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxTdHJpbmc+PiBuYW1lTWFwcGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxTdHJpbmc+PigpOw0KLQ0KLSAgICBwdWJsaWMgQWJzdHJhY3RTdG9yYWdlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFQgY3JlYXRlKFN0cmluZyBzdG9yYWdlTmFtZSkNCi0gICAgew0KLSAgICAgICAgVCBzdG9yYWdlTWFuYWdlcjsNCi0gICAgICAgIFN0cmluZyBzdG9yYWdlQ2xhc3NOYW1lOw0KLSAgICAgICAgLy9udWxsIC0+IHVzZSBuYW1lIG1hcHBlcnMNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxTdHJpbmc+IG5hbWVNYXBwZXIgOiB0aGlzLm5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0b3JhZ2VDbGFzc05hbWUgPSBuYW1lTWFwcGVyLmNyZWF0ZU5hbWUoc3RvcmFnZU5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChzdG9yYWdlQ2xhc3NOYW1lID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgc3RvcmFnZU1hbmFnZXIgPSByZXNvbHZlU3RvcmFnZShzdG9yYWdlTmFtZSwgc3RvcmFnZUNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHN0b3JhZ2VNYW5hZ2VyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmFnZU1hbmFnZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFQgcmVzb2x2ZVN0b3JhZ2UoU3RyaW5nIHN0b3JhZ2VLZXksIFN0cmluZyBzdG9yYWdlQ2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBUPiBzdG9yYWdlTWFwID0gcmVzb2x2ZVN0b3JhZ2VNYXAoKTsNCi0NCi0gICAgICAgIGlmKCFzdG9yYWdlTWFwLmNvbnRhaW5zS2V5KHN0b3JhZ2VLZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0b3JhZ2VNYXAucHV0KHN0b3JhZ2VLZXksIChUKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShzdG9yYWdlQ2xhc3NOYW1lKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3RvcmFnZU1hcC5nZXQoc3RvcmFnZUtleSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IE1hcDxTdHJpbmcsIFQ+IHJlc29sdmVTdG9yYWdlTWFwKCk7DQotDQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KFN0cmluZyBzdG9yYWdlS2V5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBUPiBzdG9yYWdlTWFwID0gcmVzb2x2ZVN0b3JhZ2VNYXAoKTsNCi0NCi0gICAgICAgIGlmKHN0b3JhZ2VNYXAgIT0gbnVsbCAmJiBzdG9yYWdlTWFwLmNvbnRhaW5zS2V5KHN0b3JhZ2VLZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENsYXNzIHN0b3JhZ2VDbGFzcyA9IHN0b3JhZ2VNYXAuZ2V0KHN0b3JhZ2VLZXkpLmdldENsYXNzKCk7DQotICAgICAgICAgICAgc3RvcmFnZU1hcC5wdXQoc3RvcmFnZUtleSwgKFQpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3Moc3RvcmFnZUNsYXNzKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxTdHJpbmc+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm5hbWVNYXBwZXJMaXN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMjQxYjEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZSBpbXBsZW1lbnRzIEZhY2VzTWVzc2FnZVN0b3JhZ2UNCi17DQotICAgIE1hcDxTdHJpbmcsIFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFZhbGlkYXRpb25SZXN1bHQ+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEZhY2VzTWVzc2FnZShTdHJpbmcgY29tcG9uZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIGlmKGNvbXBvbmVudElkID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgY29tcG9uZW50SWQgPSAiKiI7DQotICAgICAgICB9DQotDQotICAgICAgICBpZighdGhpcy5yZXN1bHRzLmNvbnRhaW5zS2V5KGNvbXBvbmVudElkKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnJlc3VsdHMucHV0KGNvbXBvbmVudElkLCBuZXcgVmFsaWRhdGlvblJlc3VsdCgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRoaXMucmVzdWx0cy5nZXQoY29tcG9uZW50SWQpLmFkZEZhY2VzTWVzc2FnZUhvbGRlcihuZXcgRmFjZXNNZXNzYWdlSG9sZGVyKGZhY2VzTWVzc2FnZSwgY29tcG9uZW50SWQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgRmFjZXNNZXNzYWdlPiBnZXRGYWNlc01lc3NhZ2VzKCkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgRmFjZXNNZXNzYWdlPiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEZhY2VzTWVzc2FnZT4oKTsNCi0NCi0gICAgICAgIGZvcihWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRpb25SZXN1bHQgOiB0aGlzLnJlc3VsdHMudmFsdWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIgOiB2YWxpZGF0aW9uUmVzdWx0LmdldEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQoZmFjZXNNZXNzYWdlSG9sZGVyLmdldENsaWVudElkKCksIGZhY2VzTWVzc2FnZUhvbGRlci5nZXRGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRBbGwoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3Q7DQotDQotICAgICAgICBmb3IoVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0aW9uUmVzdWx0IDogdGhpcy5yZXN1bHRzLnZhbHVlcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZUhvbGRlckxpc3QgPSB2YWxpZGF0aW9uUmVzdWx0LmdldEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoKTsNCi0gICAgICAgICAgICBzb3J0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdChmYWNlc01lc3NhZ2VIb2xkZXJMaXN0KTsNCi0NCi0gICAgICAgICAgICBmb3IoRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlciA6IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQuYWRkTWVzc2FnZShmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0Q2xpZW50SWQoKSwgZmFjZXNNZXNzYWdlSG9sZGVyLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8oUHJpb3JpdHkuSElHSCkNCi0gICAgcHJpdmF0ZSB2b2lkIHNvcnRGYWNlc01lc3NhZ2VIb2xkZXJMaXN0KExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0KQ0KLSAgICB7DQotICAgICAgICAvL3NvcnQgc2V2ZXJpdGllcw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTWFuYWdlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYTlkMmYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlci5EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU5hbWVNYXBwZXI7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIGZhY2VzIG1lc3NhZ2VzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8RmFjZXNNZXNzYWdlU3RvcmFnZT4NCi17DQotICAgIERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBEZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBTdG9yYWdlTWFuYWdlci5jbGFzcy5nZXROYW1lKCkgKyAiX0ZPUl9GQUNFU19NRVNTQUdFUzpLRVkiOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRiY2ZkZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0R3JvdXBTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuR3JvdXBVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlIGltcGxlbWVudGF0aW9uIGZvciBncm91cHMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0R3JvdXBTdG9yYWdlIGltcGxlbWVudHMgR3JvdXBTdG9yYWdlDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8Q2xhc3M+PiBhZGRlZEdyb3VwcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+KCk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IHJlc3RyaWN0ZWRHcm91cHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8Q2xhc3M+PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRHcm91cChDbGFzcyBncm91cENsYXNzLCBTdHJpbmcgdmlld0lkLCBTdHJpbmcgY29tcG9uZW50SWQpDQotICAgIHsNCi0gICAgICAgIGFkZEdyb3VwVG9Hcm91cFN0b3JhZ2UoZ3JvdXBDbGFzcywgdmlld0lkLCBjb21wb25lbnRJZCwgdGhpcy5hZGRlZEdyb3Vwcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVzdHJpY3RHcm91cChDbGFzcyBncm91cENsYXNzLCBTdHJpbmcgdmlld0lkLCBTdHJpbmcgY29tcG9uZW50SWQpDQotICAgIHsNCi0gICAgICAgIGFkZEdyb3VwVG9Hcm91cFN0b3JhZ2UoZ3JvdXBDbGFzcywgdmlld0lkLCBjb21wb25lbnRJZCwgdGhpcy5yZXN0cmljdGVkR3JvdXBzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3NbXSBnZXRHcm91cHMoU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNvbXBvbmVudElkKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmFkZGVkR3JvdXBzLnNpemUoKSA8IDEpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2FkZCBmb3VuZCBncm91cHMNCi0gICAgICAgIFN0cmluZyBrZXkgPSBHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgbnVsbCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN1bHRMaXN0Rm9yUGFnZSA9IGJ1aWxkR3JvdXBMaXN0KGtleSwgdGhpcy5hZGRlZEdyb3Vwcyk7DQotDQotICAgICAgICBrZXkgPSBHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgY29tcG9uZW50SWQpOw0KLSAgICAgICAgTGlzdDxDbGFzcz4gcmVzdWx0TGlzdEZvckNvbXBvbmVudCA9IGJ1aWxkR3JvdXBMaXN0KGtleSwgdGhpcy5hZGRlZEdyb3Vwcyk7DQotDQotICAgICAgICAvL3JlbW92ZSByZXN0cmljdGVkIGdyb3Vwcw0KLSAgICAgICAgQ2xhc3NbXSByZXN1bHRzRm9yUGFnZSA9DQotICAgICAgICAgICAgICAgIGZpbHRlckdyb3VwTGlzdChHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgbnVsbCksIHJlc3VsdExpc3RGb3JQYWdlKTsNCi0gICAgICAgIENsYXNzW10gcmVzdWx0c0ZvckNvbXBvbmVudCA9DQotICAgICAgICAgICAgICAgIGZpbHRlckdyb3VwTGlzdChHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgY29tcG9uZW50SWQpLCByZXN1bHRMaXN0Rm9yQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmKHJlc3VsdHNGb3JQYWdlLmxlbmd0aCA9PSAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHJlc3VsdHNGb3JDb21wb25lbnQubGVuZ3RoID09IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1Zygibm8gZ3JvdXBzIGZvciBncm91cC12YWxpZGF0aW9uIGF2YWlsYWJsZS4iICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heWJlIHlvdSByZXN0cmljdGVkIGFsbCBncm91cHMgb3IgeW91IGFyZW4ndCB1c2luZyBncm91cHMuIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWFuIHZhbGlkYXRpb24gd2lsbCB1c2UgdGhlIGRlZmF1bHQgZ3JvdXAgZm9yIHZhbGlkYXRpb24iKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0c0ZvckNvbXBvbmVudDsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYocmVzdWx0c0ZvckNvbXBvbmVudC5sZW5ndGggPT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0c0ZvclBhZ2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWVyZ2VSZXN1bHRzKHJlc3VsdHNGb3JQYWdlLCByZXN1bHRzRm9yQ29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkR3JvdXBUb0dyb3VwU3RvcmFnZShDbGFzcyBncm91cENsYXNzLCBTdHJpbmcgdmlld0lkLCBTdHJpbmcgY29tcG9uZW50SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8Q2xhc3M+PiBncm91cFN0b3JhZ2UpDQotICAgIHsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IGdyb3VwTGlzdCA9IGdyb3VwU3RvcmFnZS5nZXQoR3JvdXBVdGlscy5nZXRHcm91cEtleSh2aWV3SWQsIGNvbXBvbmVudElkKSk7DQotDQotICAgICAgICBpZihncm91cExpc3QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBncm91cExpc3QgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLSAgICAgICAgICAgIGdyb3VwU3RvcmFnZS5wdXQoR3JvdXBVdGlscy5nZXRHcm91cEtleSh2aWV3SWQsIGNvbXBvbmVudElkKSwgZ3JvdXBMaXN0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKCFncm91cExpc3QuY29udGFpbnMoZ3JvdXBDbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgZ3JvdXBMaXN0LmFkZChncm91cENsYXNzKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8Q2xhc3M+IGJ1aWxkR3JvdXBMaXN0KFN0cmluZyBrZXksIE1hcDxTdHJpbmcsIExpc3Q8Q2xhc3M+PiBncm91cFN0b3JhZ2UpDQotICAgIHsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IGxpc3QgPSBncm91cFN0b3JhZ2UuZ2V0KGtleSk7DQotICAgICAgICByZXR1cm4gKGxpc3QgIT0gbnVsbCkgPyBsaXN0IDogbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENsYXNzW10gZmlsdGVyR3JvdXBMaXN0KFN0cmluZyBrZXksIExpc3Q8Q2xhc3M+IGFkZGVkR3JvdXBzKQ0KLSAgICB7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzID0gYnVpbGRHcm91cExpc3Qoa2V5LCB0aGlzLnJlc3RyaWN0ZWRHcm91cHMpOw0KLSAgICAgICAgTGlzdDxDbGFzcz4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgICAgICBmb3IoQ2xhc3MgY3VycmVudEdyb3VwIDogYWRkZWRHcm91cHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoIXJlc3RyaWN0ZWRHcm91cHMuY29udGFpbnMoY3VycmVudEdyb3VwKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKGN1cnJlbnRHcm91cCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHMudG9BcnJheShuZXcgQ2xhc3NbcmVzdWx0cy5zaXplKCldKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENsYXNzW10gbWVyZ2VSZXN1bHRzKENsYXNzW10gcmVzdWx0c0ZvclBhZ2UsIENsYXNzW10gcmVzdWx0c0ZvckNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgQ2xhc3NbXSBtZXJnZWRSZXN1bHQgPSBuZXcgQ2xhc3NbcmVzdWx0c0ZvclBhZ2UubGVuZ3RoICsgcmVzdWx0c0ZvckNvbXBvbmVudC5sZW5ndGhdOw0KLQ0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZXN1bHRzRm9yUGFnZSwgMCwgbWVyZ2VkUmVzdWx0LCAwLCByZXN1bHRzRm9yUGFnZS5sZW5ndGgpOw0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZXN1bHRzRm9yQ29tcG9uZW50LCAwLCBtZXJnZWRSZXN1bHQsIHJlc3VsdHNGb3JQYWdlLmxlbmd0aCwgcmVzdWx0c0ZvckNvbXBvbmVudC5sZW5ndGgpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG1lcmdlZFJlc3VsdDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0R3JvdXBTdG9yYWdlTWFuYWdlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEdyb3VwU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE2YjViYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0R3JvdXBTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgZ3JvdXBzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0R3JvdXBTdG9yYWdlTWFuYWdlciBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxHcm91cFN0b3JhZ2U+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX0dST1VQUzpLRVkiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg2MWY4YS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWV0YURhdGFTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWV0YURhdGFTdG9yYWdlIGltcGxlbWVudHMgTWV0YURhdGFTdG9yYWdlDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFByb3BlcnR5SW5mb3JtYXRpb24+IGNhY2hlZFByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5SW5mb3JtYXRpb24+KCk7DQotDQotICAgIHByaXZhdGUgTGlzdDxNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IG1ldGFEYXRhU3RvcmFnZUZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4oKTsNCi0gICAgcHJpdmF0ZSBMaXN0PENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+PiBkZW5pZWRNZXRhRGF0YUZpbHRlcnMgPQ0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8Q2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0TWV0YURhdGFTdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgaW5pdEZpbHRlcnMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdEZpbHRlcnMoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIpOw0KLSAgICAgICAgbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoDQotICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIpKTsNCi0NCi0gICAgICAgIE1ldGFEYXRhU3RvcmFnZUZpbHRlciBtZXRhRGF0YVN0b3JhZ2VGaWx0ZXI7DQotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lIDogbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgPQ0KLSAgICAgICAgICAgICAgICAoTWV0YURhdGFTdG9yYWdlRmlsdGVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWV0YURhdGFTdG9yYWdlRmlsdGVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLm1ldGFEYXRhU3RvcmFnZUZpbHRlcnMuYWRkKG1ldGFEYXRhU3RvcmFnZUZpbHRlcik7DQotDQotICAgICAgICAgICAgICAgIGxvZ0FkZGVkRmlsdGVyKG1ldGFEYXRhU3RvcmFnZUZpbHRlci5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc3RvcmVNZXRhRGF0YU9mKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgaW52b2tlRmlsdGVycyhwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvblRvU3RvcmUgPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBwcm9wZXJ0eUluZm9ybWF0aW9uDQotICAgICAgICAgICAgICAgIC5nZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgY29weU1ldGFEYXRhKHByb3BlcnR5SW5mb3JtYXRpb24sIHByb3BlcnR5SW5mb3JtYXRpb25Ub1N0b3JlKTsNCi0NCi0gICAgICAgIHRoaXMuY2FjaGVkUHJvcGVydHlJbmZvcm1hdGlvbi5wdXQoDQotICAgICAgICAgICAgICAgIGNyZWF0ZUtleShwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCksIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpKSwNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvblRvU3RvcmUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbnZva2VGaWx0ZXJzKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgZm9yKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBmaWx0ZXIgOiB0aGlzLm1ldGFEYXRhU3RvcmFnZUZpbHRlcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmlsdGVyLmZpbHRlcihwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeVtdIGdldE1ldGFEYXRhKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IHRoaXMuY2FjaGVkUHJvcGVydHlJbmZvcm1hdGlvbg0KLSAgICAgICAgICAgICAgICAuZ2V0KGNyZWF0ZUtleSh0YXJnZXRDbGFzcywgdGFyZ2V0UHJvcGVydHkpKTsNCi0NCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gY2xvbmVkUHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOw0KLSAgICAgICAgY29weU1ldGFEYXRhKHByb3BlcnR5SW5mb3JtYXRpb24sIGNsb25lZFByb3BlcnR5SW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgcmV0dXJuIGNsb25lZFByb3BlcnR5SW5mb3JtYXRpb24uZ2V0TWV0YURhdGFFbnRyaWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNNZXRhRGF0YUZvcihDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRQcm9wZXJ0eUluZm9ybWF0aW9uLmNvbnRhaW5zS2V5KGNyZWF0ZUtleSh0YXJnZXRDbGFzcywgdGFyZ2V0UHJvcGVydHkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZpbHRlcihNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgc3RvcmFnZUZpbHRlcikNCi0gICAgew0KLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCFpc0ZpbHRlckRlbmllZChzdG9yYWdlRmlsdGVyKSAmJiAhaXNGaWx0ZXJBbHJlYWR5UmVnaXN0ZXJlZChzdG9yYWdlRmlsdGVyKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubWV0YURhdGFTdG9yYWdlRmlsdGVycy5hZGQoc3RvcmFnZUZpbHRlcik7DQotICAgICAgICAgICAgICAgIGxvZ0FkZGVkRmlsdGVyKHN0b3JhZ2VGaWx0ZXIuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0ZpbHRlckRlbmllZChNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgc3RvcmFnZUZpbHRlcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGVuaWVkTWV0YURhdGFGaWx0ZXJzLmNvbnRhaW5zKHN0b3JhZ2VGaWx0ZXIuZ2V0Q2xhc3MoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRmlsdGVyQWxyZWFkeVJlZ2lzdGVyZWQoTWV0YURhdGFTdG9yYWdlRmlsdGVyIHN0b3JhZ2VGaWx0ZXIpDQotICAgIHsNCi0gICAgICAgIGZvcihNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgZmlsdGVyIDogdGhpcy5tZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGZpbHRlci5nZXRDbGFzcygpLmVxdWFscyhzdG9yYWdlRmlsdGVyLmdldENsYXNzKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGRlcmVnaXN0ZXJGaWx0ZXIoQ2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gZmlsdGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhU3RvcmFnZUZpbHRlciBzdG9yYWdlRmlsdGVyID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3MoZmlsdGVyQ2xhc3MpOw0KLQ0KLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubWV0YURhdGFTdG9yYWdlRmlsdGVycy5yZW1vdmUoc3RvcmFnZUZpbHRlcik7DQotICAgICAgICB9DQotDQotICAgICAgICBsb2dSZW1vdmVkRmlsdGVyKHN0b3JhZ2VGaWx0ZXIuZ2V0Q2xhc3MoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZGVueUZpbHRlcihDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPiBmaWx0ZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvcihDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPiBmaWx0ZXJJZCA6IHRoaXMuZGVuaWVkTWV0YURhdGFGaWx0ZXJzKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoZmlsdGVySWQuZXF1YWxzKGZpbHRlckNsYXNzKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHRoaXMuZGVuaWVkTWV0YURhdGFGaWx0ZXJzLmFkZChmaWx0ZXJDbGFzcyk7DQotICAgICAgICB9DQotDQotICAgICAgICBkZXJlZ2lzdGVyRmlsdGVyKGZpbHRlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVLZXkoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldENsYXNzLmdldE5hbWUoKSArICIjIiArIHRhcmdldFByb3BlcnR5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjb3B5TWV0YURhdGEoUHJvcGVydHlJbmZvcm1hdGlvbiBzb3VyY2UsIFByb3BlcnR5SW5mb3JtYXRpb24gdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUVudHJ5IG5ld01ldGFEYXRhRW50cnk7DQotICAgICAgICBmb3IoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5IDogc291cmNlLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5ld01ldGFEYXRhRW50cnkgPSBuZXcgTWV0YURhdGFFbnRyeSgpOw0KLSAgICAgICAgICAgIG5ld01ldGFEYXRhRW50cnkuc2V0S2V5KG1ldGFEYXRhRW50cnkuZ2V0S2V5KCkpOw0KLSAgICAgICAgICAgIG5ld01ldGFEYXRhRW50cnkuc2V0VmFsdWUobWV0YURhdGFFbnRyeS5nZXRWYWx1ZSgpKTsNCi0NCi0gICAgICAgICAgICB0YXJnZXQuYWRkTWV0YURhdGFFbnRyeShuZXdNZXRhRGF0YUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgbG9nQWRkZWRGaWx0ZXIoQ2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gZmlsdGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKGZpbHRlckNsYXNzLmdldE5hbWUoKSArICIgYWRkZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgbG9nUmVtb3ZlZEZpbHRlcihDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPiBmaWx0ZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oZmlsdGVyQ2xhc3MuZ2V0TmFtZSgpICsgIiByZW1vdmVkIik7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU1hbmFnZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMWM2MmYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRNZXRhRGF0YVN0b3JhZ2VOYW1lTWFwcGVyOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBwcm9wZXJ0eSBpbmZvcm1hdGlvbiBlbnRyaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1jbGFzcyBEZWZhdWx0TWV0YURhdGFTdG9yYWdlTWFuYWdlciBleHRlbmRzIEFic3RyYWN0QXBwbGljYXRpb25TY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8TWV0YURhdGFTdG9yYWdlPg0KLXsNCi0gICAgRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBTdG9yYWdlTWFuYWdlci5jbGFzcy5nZXROYW1lKCkgKyAiX0ZPUl9NRVRBX0RBVEFfQ0FDSEU6S0VZIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDI3ZWY4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlIGltcGxlbWVudGF0aW9uIGZvciBncm91cHMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2UgaW1wbGVtZW50cyBSZW5kZXJlclByb3h5U3RvcmFnZQ0KLXsNCi0gICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeT4+IHByb3h5U3RvcmFnZSA9DQotICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnk+PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnRyeShTdHJpbmcgcmVuZGVyZXJLZXksIFN0cmluZyBjbGllbnRJZCwgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBlbnRyeSkNCi0gICAgew0KLSAgICAgICAgZ2V0UmVuZGVyZXJTdG9yYWdlKHJlbmRlcmVyS2V5KS5wdXQoY2xpZW50SWQsIGVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0VudHJ5KFN0cmluZyByZW5kZXJlcktleSwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZXJTdG9yYWdlKHJlbmRlcmVyS2V5KS5jb250YWluc0tleShjbGllbnRJZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZ2V0RW50cnkoU3RyaW5nIHJlbmRlcmVyS2V5LCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRSZW5kZXJlclN0b3JhZ2UocmVuZGVyZXJLZXkpLmdldChjbGllbnRJZCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5PiBnZXRSZW5kZXJlclN0b3JhZ2UoU3RyaW5nIHJlbmRlcmVyS2V5KQ0KLSAgICB7DQotICAgICAgICBpZighcHJveHlTdG9yYWdlLmNvbnRhaW5zS2V5KHJlbmRlcmVyS2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm94eVN0b3JhZ2UucHV0KHJlbmRlcmVyS2V5LCBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnk+KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHByb3h5U3RvcmFnZS5nZXQocmVuZGVyZXJLZXkpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU1hbmFnZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTllYzJhNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlcjsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgcmVuZGVyZXIgcHJveHkgZW50cmllcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotY2xhc3MgRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTWFuYWdlcg0KLSAgICBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxSZW5kZXJlclByb3h5U3RvcmFnZT4NCi17DQotICAgIERlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgLy9mb3IgYmV0dGVyIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkNCi0gICAgICAgIHJldHVybiBFeHRWYWxSZW5kZXJlclByb3h5LmNsYXNzLmdldE5hbWUoKSArICI6U1RPUkFHRSI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWZhYWM5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHN0b3JhZ2UtbWFuYWdlciBjcmVhdGlvbiBhbmQgY2FjaGluZw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8Q2xhc3M+DQotICAgICAgICBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8Q2xhc3MsIFN0b3JhZ2VNYW5hZ2VyPiwgU3RvcmFnZU1hbmFnZXJIb2xkZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBsYXp5U3RhdGljTWFwcGluZ0FwcGxpZWQgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8Q2xhc3M+PiBuYW1lTWFwcGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxDbGFzcz4+KCk7DQotICAgIHByaXZhdGUgTWFwPENsYXNzLCBTdG9yYWdlTWFuYWdlcj4gc3RvcmFnZVR5cGVUb1N0b3JhZ2VNYW5hZ2VyTWFwID0gbmV3IEhhc2hNYXA8Q2xhc3MsIFN0b3JhZ2VNYW5hZ2VyPigpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotDQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihSZW5kZXJlclByb3h5U3RvcmFnZS5jbGFzcywgbmV3IERlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoR3JvdXBTdG9yYWdlLmNsYXNzLCBuZXcgRGVmYXVsdEdyb3VwU3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoTWV0YURhdGFTdG9yYWdlLmNsYXNzLCBuZXcgRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcywgbmV3IERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTWFuYWdlcigpLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0b3JhZ2VNYW5hZ2VyIGNyZWF0ZShDbGFzcyBzdG9yYWdlVHlwZSkNCi0gICAgew0KLSAgICAgICAgaWYgKCF0aGlzLmxhenlTdGF0aWNNYXBwaW5nQXBwbGllZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljTWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0b3JhZ2VNYW5hZ2VyIHN0b3JhZ2VNYW5hZ2VyOw0KLSAgICAgICAgU3RyaW5nIHN0b3JhZ2VNYW5hZ2VyTmFtZTsNCi0gICAgICAgIC8vbnVsbCAtPiB1c2UgbmFtZSBtYXBwZXJzDQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8Q2xhc3M+IG5hbWVNYXBwZXIgOiB0aGlzLm5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0b3JhZ2VNYW5hZ2VyTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZShzdG9yYWdlVHlwZSk7DQotDQotICAgICAgICAgICAgaWYgKHN0b3JhZ2VNYW5hZ2VyTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHN0b3JhZ2VNYW5hZ2VyID0gKFN0b3JhZ2VNYW5hZ2VyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShzdG9yYWdlTWFuYWdlck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChzdG9yYWdlTWFuYWdlciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyhzdG9yYWdlVHlwZSwgc3RvcmFnZU1hbmFnZXIpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmFnZU1hbmFnZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGdldFN0b3JhZ2VNYW5hZ2VyKHN0b3JhZ2VUeXBlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1hcHBpbmcoQ2xhc3Mgc3RvcmFnZVR5cGUsIFN0b3JhZ2VNYW5hZ2VyIHN0b3JhZ2VNYW5hZ2VyKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIGlzVmFsaWRFbnRyeSA9IHRydWU7DQotICAgICAgICBpZihzdG9yYWdlVHlwZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlzVmFsaWRFbnRyeSA9IGZhbHNlOw0KLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRXJyb3JFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigieW91IHRyaWVkIHRvIGFkZCBhbiBpbnZhbGlkIHN0b3JhZ2UgdHlwZSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHN0b3JhZ2VNYW5hZ2VyID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaXNWYWxpZEVudHJ5ID0gZmFsc2U7DQotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNFcnJvckVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCJ5b3UgdHJpZWQgdG8gYWRkIGFuIGludmFsaWQgc3RvcmFnZSBtYW5hZ2VyIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoIWlzVmFsaWRFbnRyeSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihzdG9yYWdlVHlwZSwgc3RvcmFnZU1hbmFnZXIsIHRydWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0U3RhdGljTWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmxhenlTdGF0aWNNYXBwaW5nQXBwbGllZCA9IHRydWU7DQotDQotICAgICAgICAvL3NldHVwIGludGVybmFsIHN0YXRpYyBtYXBwaW5ncw0KLSAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgOg0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5TVE9SQUdFX1RZUEVfVE9fU1RPUkFHRV9NQU5BR0VSX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cFN0cmF0ZWd5TWFwcGluZ3MoTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcoQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUobWFwcGluZy5nZXRTb3VyY2UoKSksDQotICAgICAgICAgICAgICAgICAgICAoU3RvcmFnZU1hbmFnZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKG1hcHBpbmcuZ2V0VGFyZ2V0KCkpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTGlzdDxOYW1lTWFwcGVyPENsYXNzPj4gZ2V0TmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5uYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdG9yYWdlTWFuYWdlcihDbGFzcyBzdG9yYWdlVHlwZSwgU3RvcmFnZU1hbmFnZXIgc3RvcmFnZU1hbmFnZXIsIGJvb2xlYW4gb3ZlcnJpZGUpDQotICAgIHsNCi0gICAgICAgIGlmKCF0aGlzLnN0b3JhZ2VUeXBlVG9TdG9yYWdlTWFuYWdlck1hcC5jb250YWluc0tleShzdG9yYWdlVHlwZSkgfHwNCi0gICAgICAgICAgICAgICAgKHRoaXMuc3RvcmFnZVR5cGVUb1N0b3JhZ2VNYW5hZ2VyTWFwLmNvbnRhaW5zS2V5KHN0b3JhZ2VUeXBlKSAmJiBvdmVycmlkZSkpDQotICAgICAgICB7DQotDQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFkZGluZyB0eXBlIHRvIHN0b3JhZ2UtbWFuYWdlciBtYXBwaW5nOiAiDQotICAgICAgICAgICAgICAgICAgICArIHN0b3JhZ2VUeXBlLmdldE5hbWUoKSArICIgLT4gIiArIHN0b3JhZ2VNYW5hZ2VyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdGhpcy5zdG9yYWdlVHlwZVRvU3RvcmFnZU1hbmFnZXJNYXAucHV0KHN0b3JhZ2VUeXBlLCBzdG9yYWdlTWFuYWdlcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0b3JhZ2VNYW5hZ2VyIGdldFN0b3JhZ2VNYW5hZ2VyKENsYXNzIHR5cGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2VUeXBlVG9TdG9yYWdlTWFuYWdlck1hcC5nZXQodHlwZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRmFjZXNNZXNzYWdlSG9sZGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9GYWNlc01lc3NhZ2VIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkwZDRmNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9GYWNlc01lc3NhZ2VIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTE9XLCBkZXNjcmlwdGlvbiA9ICJyZWZhY3RvciBpdCIpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBGYWNlc01lc3NhZ2VIb2xkZXINCi17DQotICAgIHByaXZhdGUgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50SWQ7DQotDQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2VIb2xkZXIoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5mYWNlc01lc3NhZ2UgPSBmYWNlc01lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgRmFjZXNNZXNzYWdlSG9sZGVyKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5mYWNlc01lc3NhZ2UgPSBmYWNlc01lc3NhZ2U7DQotICAgICAgICBzZXRDbGllbnRJZChjbGllbnRJZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBnZXRGYWNlc01lc3NhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY2xpZW50SWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50SWQoU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICBpZighIioiLmVxdWFscyhjbGllbnRJZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc5MGIzYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9GYWNlc01lc3NhZ2VTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIEZhY2VzTWVzc2FnZVN0b3JhZ2UNCi17DQotICAgIHZvaWQgYWRkRmFjZXNNZXNzYWdlKFN0cmluZyBjb21wb25lbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSk7DQotDQotICAgIE1hcDxTdHJpbmcsIEZhY2VzTWVzc2FnZT4gZ2V0RmFjZXNNZXNzYWdlcygpOw0KLQ0KLSAgICB2b2lkIGFkZEFsbCgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Hcm91cFN0b3JhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0dyb3VwU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTA0NDExLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0dyb3VwU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHN1Z2dlc3RlZCBpbnRlcmZhY2UgZm9yIGEgZ3JvdXAgc3RvcmFnZQ0KLSAqIHVzZWQgYnkgdGhlIGJ2aSBtb2R1bGUgYW5kIGFkZC1vbnMNCi0gKiA8cC8+DQotICogaXQgYWxsb3dzIHRvIG1hbmFnZSBncm91cHMgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIEdyb3VwU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBhZGRHcm91cChDbGFzcyBncm91cENsYXNzLCBTdHJpbmcgdmlld0lkLCBTdHJpbmcgY29tcG9uZW50SWQpOw0KLQ0KLSAgICB2b2lkIHJlc3RyaWN0R3JvdXAoQ2xhc3MgZ3JvdXBDbGFzcywgU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNvbXBvbmVudElkKTsNCi0NCi0gICAgQ2xhc3NbXSBnZXRHcm91cHMoU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNvbXBvbmVudElkKTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWV0YURhdGFTdG9yYWdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NZXRhRGF0YVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjllY2ViZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NZXRhRGF0YVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBzdG9yZU1ldGFEYXRhT2YoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgTWV0YURhdGFFbnRyeVtdIGdldE1ldGFEYXRhKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpOw0KLQ0KLSAgICBib29sZWFuIGNvbnRhaW5zTWV0YURhdGFGb3IoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSk7DQotDQotICAgIHZvaWQgcmVnaXN0ZXJGaWx0ZXIoTWV0YURhdGFTdG9yYWdlRmlsdGVyIHN0b3JhZ2VGaWx0ZXIpOw0KLQ0KLSAgICB2b2lkIGRlcmVnaXN0ZXJGaWx0ZXIoQ2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gZmlsdGVyQ2xhc3MpOw0KLQ0KLSAgICB2b2lkIGRlbnlGaWx0ZXIoQ2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gZmlsdGVyQ2xhc3MpOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01ldGFEYXRhU3RvcmFnZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjJmZGI2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01ldGFEYXRhU3RvcmFnZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFTdG9yYWdlRmlsdGVyDQotew0KLSAgICB2b2lkIGZpbHRlcihQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJQcm94eVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcxYTc1Yi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFJlbmRlcmVyUHJveHlTdG9yYWdlDQotew0KLSAgICB2b2lkIHNldEVudHJ5KFN0cmluZyByZW5kZXJlcktleSwgU3RyaW5nIGNsaWVudElkLCBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGVudHJ5KTsNCi0NCi0gICAgYm9vbGVhbiBjb250YWluc0VudHJ5KFN0cmluZyByZW5kZXJlcktleSwgU3RyaW5nIGNsaWVudElkKTsNCi0NCi0gICAgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBnZXRFbnRyeShTdHJpbmcgcmVuZGVyZXJLZXksIFN0cmluZyBjbGllbnRJZCk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkzNDc3OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5Ci17Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRlY29kZUNhbGxlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVCZWdpbkNhbGxlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVDaGlsZHJlbkNhbGxlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVFbmRDYWxsZWQgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgT2JqZWN0IGNvbnZlcnRlZFZhbHVlID0gbnVsbDsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVjb2RlQ2FsbGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWNvZGVDYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVjb2RlQ2FsbGVkKGJvb2xlYW4gZGVjb2RlQ2FsbGVkKQotICAgIHsKLSAgICAgICAgdGhpcy5kZWNvZGVDYWxsZWQgPSBkZWNvZGVDYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmNvZGVCZWdpbkNhbGxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZW5jb2RlQmVnaW5DYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlQmVnaW5DYWxsZWQoYm9vbGVhbiBlbmNvZGVCZWdpbkNhbGxlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZW5jb2RlQmVnaW5DYWxsZWQgPSBlbmNvZGVCZWdpbkNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuY29kZUNoaWxkcmVuQ2FsbGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbmNvZGVDaGlsZHJlbkNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVDaGlsZHJlbkNhbGxlZChib29sZWFuIGVuY29kZUNoaWxkcmVuQ2FsbGVkKQotICAgIHsKLSAgICAgICAgdGhpcy5lbmNvZGVDaGlsZHJlbkNhbGxlZCA9IGVuY29kZUNoaWxkcmVuQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlRW5kQ2FsbGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbmNvZGVFbmRDYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlRW5kQ2FsbGVkKGJvb2xlYW4gZW5jb2RlRW5kQ2FsbGVkKQotICAgIHsKLSAgICAgICAgdGhpcy5lbmNvZGVFbmRDYWxsZWQgPSBlbmNvZGVFbmRDYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkVmFsdWUoT2JqZWN0IGNvbnZlcnRlZFZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy5jb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBjODM5Ny4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5BUEk7DQotDQotLyoqDQotICogbWFuYWdlciB0byBjcmVhdGUgYW5kIHJlc2V0IHNwZWNpZmljIHN0b3JhZ2UgaW1wbGVtZW50YXRpb25zDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihBUEkpDQotcHVibGljIGludGVyZmFjZSBTdG9yYWdlTWFuYWdlcjxUPg0KLXsNCi0gICAgVCBjcmVhdGUoU3RyaW5nIGtleSk7DQotICAgIHZvaWQgcmVzZXQoU3RyaW5nIGtleSk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VySG9sZGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9TdG9yYWdlTWFuYWdlckhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGY5NTM4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VySG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LkFQSTsNCi0NCi0vKioNCi0gKiBpbnRlcmZhY2UgdG8gbWFuYWdlIHN0b3JhZ2UtbWFuYWdlciBpbnN0YW5jZXMNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihBUEkpDQotcHVibGljIGludGVyZmFjZSBTdG9yYWdlTWFuYWdlckhvbGRlcg0KLXsNCi0gICAgdm9pZCBzZXRTdG9yYWdlTWFuYWdlcihDbGFzcyB0eXBlLCBTdG9yYWdlTWFuYWdlciBzdG9yYWdlTWFuYWdlciwgYm9vbGVhbiBvdmVycmlkZSk7DQotICAgIFN0b3JhZ2VNYW5hZ2VyIGdldFN0b3JhZ2VNYW5hZ2VyKENsYXNzIHR5cGUpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WYWxpZGF0aW9uUmVzdWx0LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WYWxpZGF0aW9uUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYzM1MmMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvVmFsaWRhdGlvblJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkxPVywgZGVzY3JpcHRpb24gPSAicmVmYWN0b3IgaXQiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgVmFsaWRhdGlvblJlc3VsdA0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRGYWNlc01lc3NhZ2VIb2xkZXIoRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5mYWNlc01lc3NhZ2VIb2xkZXJMaXN0LmFkZChmYWNlc01lc3NhZ2VIb2xkZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZ2V0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhOGNjNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRmFjZXNNZXNzYWdlU3RvcmFnZTsNCi0NCi0vKioNCi0gKiB1c2UgYSBwdWJsaWMgY2xhc3MgdG8gYWxsb3cgb3B0aW9uYWwgZGVyZWdpc3RyYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEZhY2VzTWVzc2FnZVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZjNTFlNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NZXRhRGF0YVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdE1ldGFEYXRhU3RvcmFnZTsNCi0NCi0vKioNCi0gKiB1c2UgYSBwdWJsaWMgY2xhc3MgdG8gYWxsb3cgb3B0aW9uYWwgZGVyZWdpc3RyYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWV0YURhdGFTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoTWV0YURhdGFTdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0TWV0YURhdGFTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZWM2ZmIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUmVuZGVyZXJQcm94eVN0b3JhZ2U7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoUmVuZGVyZXJQcm94eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL1NraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjRjYWE0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL1NraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgU2tpcFZhbGlkYXRpb25FdmFsdWF0b3INCi17DQotICAgIGJvb2xlYW4gc2tpcFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwgTWV0YURhdGFFbnRyeSBlbnRyeSk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL2V4Y2VwdGlvbi9SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vZXhjZXB0aW9uL1JlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NjU3MjYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vZXhjZXB0aW9uL1JlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLmV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIHRvIGhhbmRsZSBzcGVjaWFsIGNhc2VzIGluIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbiBleHRlbmRzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ2NDYzMzE3MzY0Mjg0OTU4ODRMOw0KLQ0KLSAgICBwdWJsaWMgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIoZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIoZmFjZXNNZXNzYWdlLCB0aHJvd2FibGUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYyNTEwYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkgaW1wbGVtZW50cyBGYWNlc01lc3NhZ2VGYWN0b3J5DQotew0KLSAgICBwdWJsaWMgRmFjZXNNZXNzYWdlIGNvbnZlcnQoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYoaXNMYWJlbGVkRmFjZXNNZXNzYWdlKGZhY2VzTWVzc2FnZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjcmVhdGUoZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCksIGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCksIGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBWaW9sYXRpb25NZXNzYWdlKHNldmVyaXR5LCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzTGFiZWxlZEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHVzZSB0aGUgaW50ZXJmYWNlIGhlcmUNCi0gICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2UgaW5zdGFuY2VvZiBWaW9sYXRpb25NZXNzYWdlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvTGFiZWxlZE1lc3NhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvTGFiZWxlZE1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RmN2FlNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0xhYmVsZWRNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBkb24ndCByZW1vdmUgKlRleHQgLSBpdCB3b3VsZCBsZWFkIHRvIGFuIG92ZXJsYXAgd2l0aCB0cmluaWRhZA0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTGFiZWxlZE1lc3NhZ2UNCi17DQotICAgIFN0cmluZyBnZXRMYWJlbFRleHQoKTsNCi0gICAgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIGxhYmVsKTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9WaW9sYXRpb25NZXNzYWdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL1Zpb2xhdGlvbk1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk0NGM3Ni4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL1Zpb2xhdGlvbk1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgVmlvbGF0aW9uTWVzc2FnZSBleHRlbmRzIEZhY2VzTWVzc2FnZSBpbXBsZW1lbnRzIExhYmVsZWRNZXNzYWdlDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2OTAzOTU4OTQyOTg3NzExMjMxTDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFiZWw7DQotICAgIHByaXZhdGUgYm9vbGVhbiBzdW1tYXJ5TGFiZWxSZXBsYWNlZCA9IGZhbHNlOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGV0YWlsTGFiZWxSZXBsYWNlZCA9IGZhbHNlOw0KLQ0KLSAgICBwdWJsaWMgVmlvbGF0aW9uTWVzc2FnZShTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgdGhpcyhTRVZFUklUWV9FUlJPUiwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmlvbGF0aW9uTWVzc2FnZShTZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHNldFNldmVyaXR5KHNldmVyaXR5KTsNCi0gICAgICAgIHNldFN1bW1hcnkoc3VtbWFyeSk7DQotICAgICAgICBzZXREZXRhaWwoZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsVGV4dCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsYWJlbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIGxhYmVsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VtbWFyeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxhYmVsICE9IG51bGwgJiYgIXRoaXMuc3VtbWFyeUxhYmVsUmVwbGFjZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0U3VtbWFyeShnZXRMYWJlbGVkTWVzc3NhZ2Uoc3VwZXIuZ2V0U3VtbWFyeSgpLCBnZXRMYWJlbFRleHQoKSkpOw0KLSAgICAgICAgICAgIHRoaXMuc3VtbWFyeUxhYmVsUmVwbGFjZWQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFN1bW1hcnkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBnZXREZXRhaWwoKQ0KLSAgICB7DQotICAgICAgICBpZihsYWJlbCAhPSBudWxsICYmICF0aGlzLmRldGFpbExhYmVsUmVwbGFjZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0RGV0YWlsKGdldExhYmVsZWRNZXNzc2FnZShzdXBlci5nZXREZXRhaWwoKSwgZ2V0TGFiZWxUZXh0KCkpKTsNCi0gICAgICAgICAgICB0aGlzLmRldGFpbExhYmVsUmVwbGFjZWQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldERldGFpbCgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldExhYmVsZWRNZXNzc2FnZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGxhYmVsKQ0KLSAgICB7DQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmNvbnRhaW5zKCJ7IiArIGkgKyAifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgieyIgKyBpICsgIn0iLCBsYWJlbCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHNldFN1bW1hcnkoU3RyaW5nIHMpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFN1bW1hcnkocyk7DQotICAgICAgICB0aGlzLnN1bW1hcnlMYWJlbFJlcGxhY2VkID0gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHNldERldGFpbChTdHJpbmcgcykNCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0RGV0YWlsKHMpOw0KLSAgICAgICAgdGhpcy5kZXRhaWxMYWJlbFJlcGxhY2VkID0gZmFsc2U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjE3NmU1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOw0KLQ0KLS8qKg0KLSAqIE1lc3NhZ2VSZXNvbHZlciB3aGljaCB1c2VzIHByb3BlcnR5IGZpbGVzLg0KLSAqIFN1YmNsYXNzZXMganVzdCBoYXZlIHRvIHByb3ZpZGUgdGhlIHBhY2thZ2UgdG8gbG9vayBhdC4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBjYW4gYWxzbyBwcm92aWRlIGEgY3VzdG9tIG5hbWUgd2hpY2ggaXMgZS5nLiBjb25maWd1cmVkIHZpYSB3ZWIueG1sLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgaW1wbGVtZW50cyBNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSID0gIj8/PyI7DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb24gPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT047DQotICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGRlZmF1bHRCdW5kbGUgPSBudWxsOw0KLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlQnVuZGxlQmFzZU5hbWU7DQotICAgIC8vd2l0aCBqc2YgMS4xIG9ubHkgYXZhaWxhYmxlIGlmIHRoZXJlIGlzIGEgY3VzdG9tIGJlYW4NCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZUJ1bmRsZVZhck5hbWU7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIGlmIChrZXkgPT0gbnVsbCB8fCBrZXkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGtleS5jb250YWlucygiICIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGtleS5lbmRzV2l0aCgiX2RldGFpbCIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAga2V5ID0ga2V5LnN1YnN0cmluZygwLCBrZXkubGVuZ3RoKCkgLSA3KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGtleTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjdXN0b21NZXNzYWdlID0gbnVsbDsNCi0NCi0gICAgICAgIC8vb25seSBpbiBjYXNlIG9mIGEgVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIHdoaWNoIGlzIGNvbmZpZ3VyZWQgYXMgYmVhbg0KLSAgICAgICAgaWYgKHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUodGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUsIGxvY2FsZSk7DQotICAgICAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJtZXNzYWdlIGJ1bmRsZSAiICsgdGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUgKyAiIG5vdCBmb3VuZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9vbmx5IGluIGNhc2Ugb2YgYSBWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggaXMgY29uZmlndXJlZCBhcyBiZWFuDQotICAgICAgICBpZiAodGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSAhPSBudWxsICYmIGN1c3RvbU1lc3NhZ2UgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IChSZXNvdXJjZUJ1bmRsZSkgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKG1lc3NhZ2VCdW5kbGVWYXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm1lc3NhZ2UgYnVuZGxlIHZhciBuYW1lICIgKyB0aGlzLm1lc3NhZ2VCdW5kbGVWYXJOYW1lICsgIiBub3QgZm91bmQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChjdXN0b21NZXNzYWdlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2U7DQotICAgICAgICB9DQotDQotICAgICAgICAvKg0KLSAgICAgICAgICogdHJ5IHRvIHVzZSB0aGUgY29udmVudGlvbiBmb3IgdGhlIG1lc3NhZ2UgYnVuZGxlDQotICAgICAgICAgKi8NCi0gICAgICAgIGN1c3RvbU1lc3NhZ2UgPSB0cnlUb1VzZU1lc3NhZ2VCdW5kbGVDb252ZW50aW9uKGtleSwgbG9jYWxlKTsNCi0NCi0gICAgICAgIGlmIChjdXN0b21NZXNzYWdlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2U7DQotICAgICAgICB9DQotDQotICAgICAgICAvKg0KLSAgICAgICAgICogbm8gbWVzc2FnZSBidW5kbGUgb3IgbWVzc2FnZSBmb3VuZCAod2l0aCB0aGUgY29udmVudGlvbik/DQotICAgICAgICAgKi8NCi0NCi0gICAgICAgIC8vdHJ5IHRvIGxvYWQgY3VzdG9tIG1lc3NhZ2VzDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShnZXRDdXN0b21CYXNlTmFtZSgpLCBsb2NhbGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gY3VzdG9tIG1lc3NhZ2UgZm9yICIgKyBrZXkgKyAiIHdpdGhpbiAiICsgZ2V0Q3VzdG9tQmFzZU5hbWUoKSwgZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvL3VzZSBjdXN0b20gbmFtZSAoaWYgcG9zc2libGUpIG90aGVyd2lzZTogZmFsbGJhY2sgdG8gZGVmYXVsdCBtZXNzYWdlIChpZiBwb3NzaWJsZSkNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoY3VzdG9tTWVzc2FnZSAhPSBudWxsKSA/IGN1c3RvbU1lc3NhZ2UNCi0gICAgICAgICAgICAgICAgOiAoZ2V0QmFzZU5hbWUoKSAhPSBudWxsKSA/IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShnZXRCYXNlTmFtZSgpLCBsb2NhbGUpLmdldFN0cmluZyhrZXkpIDogbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIgKyBrZXkgKyBNSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb1VzZU1lc3NhZ2VCdW5kbGVDb252ZW50aW9uKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjdXN0b21NZXNzYWdlID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICgoZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID09IG51bGwgfHwgIWRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICAgICAgJiYgaXNEZWZhdWx0TWVzc2FnZUJ1bmRsZUNvbnZlbnRpb25BY3RpdmUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZGVmYXVsdEJ1bmRsZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9CVU5ETEVfTkFNRSksIGxvY2FsZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgICAgICAgICAgICAgICAgIGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbiA9ICJ0cnVlIjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoZGVmYXVsdEJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSBkZWZhdWx0QnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nDQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlZmF1bHRNZXNzYWdlQnVuZGxlQ29udmVudGlvbkFjdGl2ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0QmFzZU5hbWUoKTsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21CYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VCdW5kbGVCYXNlTmFtZShTdHJpbmcgbWVzc2FnZUJ1bmRsZUJhc2VOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSA9IG1lc3NhZ2VCdW5kbGVCYXNlTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlQnVuZGxlVmFyTmFtZShTdHJpbmcgbWVzc2FnZUJ1bmRsZVZhck5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZUJ1bmRsZVZhck5hbWUgPSBtZXNzYWdlQnVuZGxlVmFyTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MGU2OGYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBGYWN0b3J5IHdoaWNoIGNyZWF0ZXMgYSBNZXNzYWdlUmVzb2x2ZXIgZm9yIGEgZ2l2ZW4gVmFsaWRhdGlvblN0cmF0ZWd5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdlbmVyaWMgamF2YSBhcGkgKGRlLS9yZWdpc3RlciBtYXBwaW5nKSIpDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLSAgICAgICAgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWVzc2FnZVJlc29sdmVyPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZzsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZVJlc29sdmVyIGNyZWF0ZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgc3RyYXRlZ3lOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLQ0KLSAgICAgICAgaWYgKHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRTdGF0aWNNYXBwaW5ncygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZy5jb250YWluc0tleShzdHJhdGVneU5hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoTWVzc2FnZVJlc29sdmVyKSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgIC50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZy5nZXQoc3RyYXRlZ3lOYW1lKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOw0KLSAgICAgICAgU3RyaW5nIHJlc29sdmVyTmFtZTsNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IG5hbWVNYXBwZXIgOiBuYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2J1aWxkIGNvbnZlbnRpb24gKFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcikNCi0gICAgICAgICAgICByZXNvbHZlck5hbWUgPSBuYW1lTWFwcGVyLmNyZWF0ZU5hbWUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAvL25hbWUgd2Fzbid0IG1hcHBlZA0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlck5hbWUgPT0gbnVsbCB8fCB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKHJlc29sdmVyTmFtZSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgbWVzc2FnZVJlc29sdmVyID0gKE1lc3NhZ2VSZXNvbHZlcikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHJlc29sdmVyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKG1lc3NhZ2VSZXNvbHZlciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyhzdHJhdGVneU5hbWUsIHJlc29sdmVyTmFtZSk7DQotDQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UocmVzb2x2ZXJOYW1lICsgIiB1c2VkIGZvciAiICsgc3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZVJlc29sdmVyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGFkZE1hcHBpbmcoc3RyYXRlZ3lOYW1lLCBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgLy9zZXR1cCBpbnRlcm5hbCBzdGF0aWMgbWFwcGluZ3MNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnIDoNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cFN0cmF0ZWd5TWFwcGluZ3MoTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhtYXBwaW5nLmdldFNvdXJjZSgpLCBtYXBwaW5nLmdldFRhcmdldCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgU3RyaW5nIG1lc3NhZ2VSZXNvbHZlck5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkaW5nIHN0YXRpYyB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1lc3NhZ2UgcmVzb2x2ZXIgbWFwcGluZzogIg0KLSAgICAgICAgICAgICAgICArIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgKyAiIC0+ICIgKyBtZXNzYWdlUmVzb2x2ZXJOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZy5wdXQodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgbWVzc2FnZVJlc29sdmVyTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzllZGM2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogRGVmYXVsdCBNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggdXNlcyB0aGUgZGVmYXVsdCBjb252ZW50aW9uIGZvciB0aGUgbWVzc2FnZSBidW5kbGUuDQotICogSXQncyBwb3NzaWJsZSB0byBwcm92aWRlIGEgY3VzdG9tIG1lc3NhZ2UgYnVuZGxlIHZpYSB3ZWIueG1sDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQlVORExFID0gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVNTQUdFX0JVTkRMRTsNCi0NCi0gICAgLy9ub3QgdXNlZCBhdCB0aGUgbW9tZW50IC0ganVzdCBmb3IgYSBjb252ZW50aW9uDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TW9kdWxlTWVzc2FnZUJ1bmRsZU5hbWUoZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENVU1RPTV9CVU5ETEU7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjY2ExYzEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSBmb3IgTWVzc2FnZVJlc29sdmVycyBpbmRlcGVuZGVudCBvZiB0aGUgbWVzc2FnZSBzb3VyY2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkNDBiNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmMwOGU4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXNzYWdlUmVzb2x2ZXJzLg0KLSAqIChjb25maWd1cmVkIHZpYSB3ZWIueG1sKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDNjMDEzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVneSB0byBNZXNzYWdlUmVzb2x2ZXIuDQotICogKGNvbmZpZ3VyZWQgdmlhIGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pDQotICogVGhlIGJlYW4gcHJvdmlkZXMgdGhlIGRlZmF1bHQgbmFtZSAoY29udmVudGlvbikuDQotICogSXQncyBwb3NzaWJsZSB0byBwcm92aWRlIGEgY3VzdG9tIGZ1bGwgcXVhbGlmaWVkIG5hbWUuICg9IGN1c3RvbWl6YWJsZSBjb252ZW50aW9uKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigyMDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01TR19SRVNPTFZFUl9OQU1FX01BUFBFUik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGViYjRkNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJbiBvcmRlciB0byBwcm92aWRlIGEgTmFtZU1hcHBlciBwZXIgdmFsaWRhdGlvbiBtb2R1bGUuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMxMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgc3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjA2MzgyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIG1hcHMgRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIEV4dFZhbCBNZXNzYWdlUmVzb2x2ZXJzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigzMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKHN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYzZDk3MC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciB0byBwbGFjZSBWYWxpZGF0aW9uU3RyYXRlZ2llcyBhbmQgTWVzc2FnZVJlc29sdmVycyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcig0MDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VzdG9tUG9zdGZpeCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYKTsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoc3RyYXRlZ3lDbGFzc05hbWUsIGN1c3RvbVBvc3RmaXgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMzhmNTQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljQXJyYXlUeXBlOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5XaWxkY2FyZFR5cGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBleHRyYWN0QnlJZChhbm5vdGF0aW9uLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZXh0cmFjdEJ5SWQoYW5ub3RhdGlvbiwga2V5LCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgPFQ+IExpc3Q8VD4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGV4dHJhY3RCeUlkKGFubm90YXRpb24sIGtleSwgdmFsdWVUeXBlLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgPFQ+IFQgZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxUPiByZXN1bHRzID0gZXh0cmFjdEJ5SWQoYW5ub3RhdGlvbiwga2V5LCB2YWx1ZVR5cGUsIHZhbHVlSWQpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0cy5pdGVyYXRvcigpLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0cy5pdGVyYXRvcigpLm5leHQoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyA8VD4gTGlzdDxUPiBleHRyYWN0QnlJZChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxPYmplY3Q+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KLQ0KLSAgICAgICAgZm9yKE9iamVjdCBlbnRyeSA6IGV4dHJhY3RCeUlkKGFubm90YXRpb24sIGtleSwgdmFsdWVJZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodmFsdWVUeXBlLmlzQXNzaWduYWJsZUZyb20oZW50cnkuZ2V0Q2xhc3MoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKExpc3Q8VD4pcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZXh0cmFjdEJ5SWQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzcyB2YWx1ZUlkKQ0KLSAgICB7DQotICAgICAgICBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+IGZ1bGxSZXN1bHQgPSBleHRyYWN0QnlJZChhbm5vdGF0aW9uLCB2YWx1ZUlkKTsNCi0NCi0gICAgICAgIGlmKGZ1bGxSZXN1bHQuY29udGFpbnNLZXkoa2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZnVsbFJlc3VsdC5nZXQoa2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIHdlYi54bWwgcGFyYW1ldGVyIGZvciBwZXJmb3JtYW5jZSB0dW5pbmcgdG8gZGVhY3RpdmF0ZSB0aGUgc2NhbiIpDQotICAgIHB1YmxpYyBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+IGV4dHJhY3RCeUlkKEFubm90YXRpb24gYW5ub3RhdGlvbiwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4oKTsNCi0NCi0gICAgICAgIGZvcihNZXRob2QgY3VycmVudEFubm90YXRpb25BdHRyaWJ1dGUgOiBhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0RGVjbGFyZWRNZXRob2RzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZighaXNWYWxpZGF0aW9uUGFyYW1ldGVyKGN1cnJlbnRBbm5vdGF0aW9uQXR0cmlidXRlLmdldEdlbmVyaWNSZXR1cm5UeXBlKCkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBPYmplY3QgcGFyYW1ldGVyVmFsdWUgPSBjdXJyZW50QW5ub3RhdGlvbkF0dHJpYnV0ZS5pbnZva2UoYW5ub3RhdGlvbik7DQotDQotICAgICAgICAgICAgICAgIGlmKHBhcmFtZXRlclZhbHVlIGluc3RhbmNlb2YgQ2xhc3NbXSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRQYXJhbWV0ZXJWYWx1ZSA6IChDbGFzc1tdKXBhcmFtZXRlclZhbHVlKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8va2VlcCBjaGVjayBzbyB0aGF0IGZvbGxvd2luZyBpcyB0cnVlOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBmb3VuZCB3aGljaCB0ZWxscyB0aGF0IGl0IGlzbid0IGEgYmxvY2tpbmcgZXJyb3IsIGxldCBpdCBwYXNzDQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1BhcmFtZXRlclZhbHVlKGFubm90YXRpb24sIGN1cnJlbnRQYXJhbWV0ZXJWYWx1ZSwgcmVzdWx0LCB2YWx1ZUlkKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKHBhcmFtZXRlclZhbHVlIGluc3RhbmNlb2YgQ2xhc3MpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8va2VlcCBjaGVjayBzbyB0aGF0IGZvbGxvd2luZyBpcyB0cnVlOg0KLSAgICAgICAgICAgICAgICAgICAgLy9pZiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIGZvdW5kIHdoaWNoIHRlbGxzIHRoYXQgaXQgaXNuJ3QgYSBibG9ja2luZyBlcnJvciwgbGV0IGl0IHBhc3MNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQYXJhbWV0ZXJWYWx1ZShhbm5vdGF0aW9uLCAoQ2xhc3MpcGFyYW1ldGVyVmFsdWUsIHJlc3VsdCwgdmFsdWVJZCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBkb24ndCB1c2UgdGhlIEludHJvc3BlY3RvciBpbiB0aGlzIGNhc2UNCi0gICAgICogaWYgeW91IGhhdmUgYSBiZXR0ZXIgc29sdXRpb24gd2hpY2ggc3VwcG9ydHMgYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXIgc3R5bGVzIChzZWUgZXh0dmFsIHdpa2kpLA0KLSAgICAgKiB5b3UgY2FuIGltcGwuIGl0IGFuZCB1c2UgaXQgKGV4Y2hhbmdlIHRoZSBpbXBscy4gdmlhIHRoZSBFeHRWYWxDb250ZXh0KS4NCi0gICAgICogZnVydGhlcm1vcmUsIHlvdSBjYW4gcHJvdmlkZSB0aGUgZml4IGZvciB0aGUgY29tbXVuaXR5DQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1BhcmFtZXRlclZhbHVlKA0KLSAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiwgQ2xhc3MgcGFyYW1DbGFzcywgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiByZXN1bHQsIENsYXNzIHZhbHVlSWQpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGtleSA9IG51bGw7DQotICAgICAgICBMaXN0PE9iamVjdD4gcGFyYW1ldGVyVmFsdWVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7DQotDQotICAgICAgICBpZihWYWxpZGF0aW9uUGFyYW1ldGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocGFyYW1DbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgTGlzdDxGaWVsZD4gcHJvY2Vzc2VkRmllbGRzID0gbmV3IEFycmF5TGlzdDxGaWVsZD4oKTsNCi0gICAgICAgICAgICBMaXN0PE1ldGhvZD4gcHJvY2Vzc2VkTWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kPigpOw0KLQ0KLSAgICAgICAgICAgIENsYXNzIGN1cnJlbnRQYXJhbUNsYXNzID0gcGFyYW1DbGFzczsNCi0gICAgICAgICAgICB3aGlsZSAoY3VycmVudFBhcmFtQ2xhc3MgIT0gbnVsbCAmJiAhT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY3VycmVudFBhcmFtQ2xhc3MuZ2V0TmFtZSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICAgICAqIHByb2Nlc3MgY2xhc3MNCi0gICAgICAgICAgICAgICAgICovDQotICAgICAgICAgICAgICAgIC8vc3VwcG9ydCBwdXJlIGludGVyZmFjZSBhcHByb2FjaCBlLmcuIFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MNCi0gICAgICAgICAgICAgICAgZm9yKEZpZWxkIGN1cnJlbnRGaWVsZCA6IGN1cnJlbnRQYXJhbUNsYXNzLmdldERlY2xhcmVkRmllbGRzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFwcm9jZXNzZWRGaWVsZHMuY29udGFpbnMoY3VycmVudEZpZWxkKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBwcm9jZXNzRm91bmRGaWVsZChhbm5vdGF0aW9uLCBjdXJyZW50RmllbGQsIHBhcmFtZXRlclZhbHVlcywga2V5LCB2YWx1ZUlkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRGaWVsZHMuYWRkKGN1cnJlbnRGaWVsZCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgLy9pbnNwZWN0IHRoZSBvdGhlciBtZXRob2RzIG9mIHRoZSBpbXBsZW1lbnRpbmcgY2xhc3MNCi0gICAgICAgICAgICAgICAgZm9yKE1ldGhvZCBjdXJyZW50TWV0aG9kIDogY3VycmVudFBhcmFtQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFwcm9jZXNzZWRNZXRob2RzLmNvbnRhaW5zKGN1cnJlbnRNZXRob2QpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHByb2Nlc3NGb3VuZE1ldGhvZChjdXJyZW50UGFyYW1DbGFzcywgY3VycmVudE1ldGhvZCwgcGFyYW1ldGVyVmFsdWVzLCBrZXksIHZhbHVlSWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZE1ldGhvZHMuYWRkKGN1cnJlbnRNZXRob2QpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICAgICAqIHByb2Nlc3MgaW50ZXJmYWNlcw0KLSAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRJbnRlcmZhY2UgOiBjdXJyZW50UGFyYW1DbGFzcy5nZXRJbnRlcmZhY2VzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFWYWxpZGF0aW9uUGFyYW1ldGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY3VycmVudEludGVyZmFjZSkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAvL3N1cHBvcnQgaW50ZXJmYWNlICsgaW1wbC4gYXBwcm9hY2ggZS5nLiBNeVBhcmFtSW1wbC5jbGFzcw0KLSAgICAgICAgICAgICAgICAgICAgLy8oTXlQYXJhbUltcGwgaW1wbGVtZW50cyBNeVBhcmFtDQotICAgICAgICAgICAgICAgICAgICAvL015UGFyYW0gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotICAgICAgICAgICAgICAgICAgICAvL21ldGhvZHMgaW4gdGhlIGludGVyZmFjZSBoYXZlIHRvIGJlIG1hcmtlZCB3aXRoIEBQYXJhbWV0ZXJWYWx1ZSBhbmQgQFBhcmFtZXRlcktleQ0KLSAgICAgICAgICAgICAgICAgICAgZm9yKE1ldGhvZCBjdXJyZW50TWV0aG9kIDogY3VycmVudEludGVyZmFjZS5nZXREZWNsYXJlZE1ldGhvZHMoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZighcHJvY2Vzc2VkTWV0aG9kcy5jb250YWlucyhjdXJyZW50TWV0aG9kKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHByb2Nlc3NGb3VuZE1ldGhvZChjdXJyZW50UGFyYW1DbGFzcywgY3VycmVudE1ldGhvZCwgcGFyYW1ldGVyVmFsdWVzLCBrZXksIHZhbHVlSWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRNZXRob2RzLmFkZChjdXJyZW50TWV0aG9kKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBmb3IoRmllbGQgY3VycmVudEZpZWxkIDogY3VycmVudEludGVyZmFjZS5nZXREZWNsYXJlZEZpZWxkcygpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwcm9jZXNzZWRGaWVsZHMuY29udGFpbnMoY3VycmVudEZpZWxkKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHByb2Nlc3NGb3VuZEZpZWxkKGFubm90YXRpb24sIGN1cnJlbnRGaWVsZCwgcGFyYW1ldGVyVmFsdWVzLCBrZXksIHZhbHVlSWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRGaWVsZHMuYWRkKGN1cnJlbnRGaWVsZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGN1cnJlbnRQYXJhbUNsYXNzID0gY3VycmVudFBhcmFtQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGtleSA9IGNyZWF0ZURlZmF1bHRLZXkoa2V5LCBwYXJhbUNsYXNzKTsNCi0NCi0gICAgICAgIGlmKHBhcmFtZXRlclZhbHVlcy5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9AUGFyYW1ldGVyVmFsdWUgaXMgb3B0aW9uYWwgYXMgd2VsbA0KLSAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlcy5hZGQoa2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHJlc3VsdC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5nZXQoa2V5KS5hZGRBbGwocGFyYW1ldGVyVmFsdWVzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQucHV0KGtleSwgcGFyYW1ldGVyVmFsdWVzKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBjcmVhdGVEZWZhdWx0S2V5KE9iamVjdCBrZXksIENsYXNzIGN1cnJlbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYoa2V5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9jaGVjayBmb3Igc3VwZXItaW50ZXJmYWNlIChleGNsdWRlIFZhbGlkYXRpb25QYXJhbWV0ZXIgaXRzZWxmKQ0KLSAgICAgICAgICAgIGZvcihDbGFzcyBpbnRlcmZhY2VDbGFzcyA6IGN1cnJlbnRDbGFzcy5nZXRJbnRlcmZhY2VzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihWYWxpZGF0aW9uUGFyYW1ldGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaW50ZXJmYWNlQ2xhc3MpICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgKCFpbnRlcmZhY2VDbGFzcy5nZXROYW1lKCkuZXF1YWxzKFZhbGlkYXRpb25QYXJhbWV0ZXIuY2xhc3MuZ2V0TmFtZSgpKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGtleSA9IGludGVyZmFjZUNsYXNzOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZihrZXkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBrZXkgPSBjdXJyZW50Q2xhc3M7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4ga2V5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IHByb2Nlc3NGb3VuZEZpZWxkKA0KLSAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZSwgRmllbGQgY3VycmVudEZpZWxkLCBMaXN0PE9iamVjdD4gcGFyYW1WYWx1ZXMsIE9iamVjdCBrZXksIENsYXNzIHZhbHVlSWQpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBuZXdLZXkgPSBudWxsOw0KLSAgICAgICAgaWYoa2V5ID09IG51bGwgJiYgY3VycmVudEZpZWxkLmlzQW5ub3RhdGlvblByZXNlbnQoUGFyYW1ldGVyS2V5LmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG5ld0tleSA9IGN1cnJlbnRGaWVsZC5nZXQoaW5zdGFuY2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICAvL25vICJlbHNlIGlmIiB0byBhbGxvdyBib3RoIGF0IG9uZSBmaWVsZA0KLSAgICAgICAgaWYoY3VycmVudEZpZWxkLmlzQW5ub3RhdGlvblByZXNlbnQoUGFyYW1ldGVyVmFsdWUuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbHVlSWQgPT0gbnVsbCB8fCB2YWx1ZUlkLmVxdWFscyhjdXJyZW50RmllbGQuZ2V0QW5ub3RhdGlvbihQYXJhbWV0ZXJWYWx1ZS5jbGFzcykuaWQoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50RmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtVmFsdWVzLmFkZChjdXJyZW50RmllbGQuZ2V0KGluc3RhbmNlKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXdLZXkgIT0gbnVsbCA/IG5ld0tleSA6IGtleTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBwcm9jZXNzRm91bmRNZXRob2QoDQotICAgICAgICAgICAgQ2xhc3MgcGFyYW1DbGFzcywgTWV0aG9kIGN1cnJlbnRNZXRob2QsIExpc3Q8T2JqZWN0PiBwYXJhbWV0ZXJWYWx1ZXMsIE9iamVjdCBrZXksIENsYXNzIHZhbHVlSWQpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBuZXdLZXkgPSBudWxsOw0KLSAgICAgICAgaWYoa2V5ID09IG51bGwgJiYgY3VycmVudE1ldGhvZC5pc0Fubm90YXRpb25QcmVzZW50KFBhcmFtZXRlcktleS5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZighKE1vZGlmaWVyLmlzQWJzdHJhY3QocGFyYW1DbGFzcy5nZXRNb2RpZmllcnMoKSkgfHwgTW9kaWZpZXIuaXNJbnRlcmZhY2UocGFyYW1DbGFzcy5nZXRNb2RpZmllcnMoKSkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBuZXdLZXkgPSBjdXJyZW50TWV0aG9kLmludm9rZShwYXJhbUNsYXNzLm5ld0luc3RhbmNlKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIC8vbm8gImVsc2UgaWYiIHRvIGFsbG93IGJvdGggYXQgb25lIGZpZWxkDQotICAgICAgICBpZihjdXJyZW50TWV0aG9kLmlzQW5ub3RhdGlvblByZXNlbnQoUGFyYW1ldGVyVmFsdWUuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbHVlSWQgPT0gbnVsbCB8fCB2YWx1ZUlkLmVxdWFscyhjdXJyZW50TWV0aG9kLmdldEFubm90YXRpb24oUGFyYW1ldGVyVmFsdWUuY2xhc3MpLmlkKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudE1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOw0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWVzLmFkZChjdXJyZW50TWV0aG9kLmludm9rZShwYXJhbUNsYXNzLm5ld0luc3RhbmNlKCkpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgaXQncyBhIG5vbmUtc3RhdGljIGlubmVyIGNsYXNzIC0+IHJldHVybiB0aGlzIGNsYXNzDQotICAgICAgICAgICAgICAgICAgICBpZihwYXJhbUNsYXNzLmdldEVuY2xvc2luZ0NsYXNzKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJWYWx1ZXMuYWRkKHBhcmFtQ2xhc3MpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXdLZXkgIT0gbnVsbCA/IG5ld0tleSA6IGtleTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZGF0aW9uUGFyYW1ldGVyKFR5cGUgZ2VuZXJpY1JldHVyblR5cGUpDQotICAgIHsNCi0gICAgICAgIGlmKGdlbmVyaWNSZXR1cm5UeXBlIGluc3RhbmNlb2YgR2VuZXJpY0FycmF5VHlwZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZigoKEdlbmVyaWNBcnJheVR5cGUpZ2VuZXJpY1JldHVyblR5cGUpLmdldEdlbmVyaWNDb21wb25lbnRUeXBlKCkgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBhbmFseXplUGFyYW1ldGVyaXplZFR5cGUoDQotICAgICAgICAgICAgICAgICAgICAgICAgKFBhcmFtZXRlcml6ZWRUeXBlKSgoR2VuZXJpY0FycmF5VHlwZSlnZW5lcmljUmV0dXJuVHlwZSkuZ2V0R2VuZXJpY0NvbXBvbmVudFR5cGUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihnZW5lcmljUmV0dXJuVHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhbmFseXplUGFyYW1ldGVyaXplZFR5cGUoDQotICAgICAgICAgICAgICAgICAgICAoUGFyYW1ldGVyaXplZFR5cGUpZ2VuZXJpY1JldHVyblR5cGUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBhbmFseXplUGFyYW1ldGVyaXplZFR5cGUoUGFyYW1ldGVyaXplZFR5cGUgcGFyYW1ldGVyaXplZFR5cGUpDQotICAgIHsNCi0gICAgICAgIGZvcihUeXBlIHR5cGUgOiBwYXJhbWV0ZXJpemVkVHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodHlwZSBpbnN0YW5jZW9mIFdpbGRjYXJkVHlwZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZvcihUeXBlIHVwcGVyQm91bmRzIDogKChXaWxkY2FyZFR5cGUpdHlwZSkuZ2V0VXBwZXJCb3VuZHMoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYodXBwZXJCb3VuZHMgaW5zdGFuY2VvZiBDbGFzcyAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZvciBhdHRyaWJ1dGVzIGxpa2U6IENsYXNzPD8gZXh0ZW5kcyBJbmhlcml0ZWRGcm9tVmFsaWRhdGlvblBhcmFtZXRlcj4gdmFsdWUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblBhcmFtZXRlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKChDbGFzcyl1cHBlckJvdW5kcykpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTJhNzNjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5IGltcGxlbWVudHMgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkNCi17DQotICAgIHByaXZhdGUgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBjcmVhdGUoKQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUik7DQotICAgICAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckNsYXNzTmFtZXMNCi0gICAgICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUikpOw0KLSAgICAgICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JDbGFzc05hbWVzKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciA9IChWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSh2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjcmVhdGVkIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWRmZmMyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIG1lY2hhbmlzbSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgZXh0dmFsDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBpbXBsZW1lbnRzIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXINCi17DQotICAgIHB1YmxpYyBib29sZWFuIHNldmVyaXR5QmxvY2tzTmF2aWdhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLmVxdWFscyhzZXZlcml0eSkgfHwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMLmVxdWFscyhzZXZlcml0eSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gc2V2ZXJpdHlDYXVzZXNWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUi5lcXVhbHMoc2V2ZXJpdHkpIHx8IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9GQVRBTC5lcXVhbHMoc2V2ZXJpdHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHNldmVyaXR5Q2F1c2VzVmlvbGF0aW9uTWVzc2FnZSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXZlcml0eUJsb2Nrc1N1Ym1pdCgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLmVxdWFscyhzZXZlcml0eSkgfHwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMLmVxdWFscyhzZXZlcml0eSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gc2V2ZXJpdHlTaG93c0luZGljYXRpb24oDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUi5lcXVhbHMoc2V2ZXJpdHkpIHx8IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9GQVRBTC5lcXVhbHMoc2V2ZXJpdHkpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwMDg2Yi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uIGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcg0KLXsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlcktleS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlcktleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzAyYmJhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9QYXJhbWV0ZXJLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVGFyZ2V0KHtGSUVMRCwgTUVUSE9EfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUGFyYW1ldGVyS2V5DQotew0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvUGFyYW1ldGVyVmFsdWUuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9QYXJhbWV0ZXJWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmRjOGYzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9QYXJhbWV0ZXJWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUYXJnZXQoe0ZJRUxELCBNRVRIT0R9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBQYXJhbWV0ZXJWYWx1ZQ0KLXsNCi0gICAgQ2xhc3MgaWQoKSBkZWZhdWx0IFBhcmFtZXRlclZhbHVlLmNsYXNzOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE1OWM3Ni4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25QYXJhbWV0ZXINCi17DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjA5OTAyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3INCi17DQotICAgIE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24pOw0KLSAgICBMaXN0PE9iamVjdD4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXkpOw0KLSAgICA8VD4gTGlzdDxUPiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSwgQ2xhc3M8VD4gdmFsdWVUeXBlKTsNCi0gICAgPFQ+IFQgZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSwgQ2xhc3MgdmFsdWVJZCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkY2RkZDIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkNCi17DQotICAgIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgY3JlYXRlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WaW9sYXRpb25TZXZlcml0eS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1Zpb2xhdGlvblNldmVyaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMjg4N2MuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1Zpb2xhdGlvblNldmVyaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWaW9sYXRpb25TZXZlcml0eQ0KLXsNCi0gICAgaW50ZXJmYWNlIEluZm8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotICAgIHsNCi0gICAgICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgICAgIHB1YmxpYyBDbGFzcyBLRVkgPSBWaW9sYXRpb25TZXZlcml0eS5jbGFzczsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICBAUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIHB1YmxpYyBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgU0VWRVJJVFkgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfSU5GTzsNCi0NCi0gICAgICAgIC8vQFBhcmFtZXRlclZhbHVlDQotICAgICAgICAvL01lc3NhZ2VUeXBlIHBvc3RmaXggPSBNZXNzYWdlVHlwZS5JTkZPOw0KLSAgICB9DQotDQotICAgIGludGVyZmFjZSBXYXJuIGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcg0KLSAgICB7DQotICAgICAgICBAUGFyYW1ldGVyS2V5DQotICAgICAgICBwdWJsaWMgQ2xhc3MgS0VZID0gVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3M7DQotDQotICAgICAgICBAUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBTRVZFUklUWSA9IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOOw0KLQ0KLSAgICAgICAgLy9AUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIC8vTWVzc2FnZVR5cGUgcG9zdGZpeCA9IE1lc3NhZ2VUeXBlLldBUk47DQotICAgIH0NCi0NCi0gICAgaW50ZXJmYWNlIEVycm9yIGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcg0KLSAgICB7DQotICAgICAgICBAUGFyYW1ldGVyS2V5DQotICAgICAgICBwdWJsaWMgQ2xhc3MgS0VZID0gVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3M7DQotDQotICAgICAgICBAUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBTRVZFUklUWSA9IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUjsNCi0NCi0gICAgICAgIC8vQFBhcmFtZXRlclZhbHVlDQotICAgICAgICAvL01lc3NhZ2VUeXBlIHBvc3RmaXggPSBNZXNzYWdlVHlwZS5FUlJPUjsNCi0gICAgfQ0KLQ0KLSAgICBpbnRlcmZhY2UgRmF0YWwgZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotICAgIHsNCi0gICAgICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgICAgIHB1YmxpYyBDbGFzcyBLRVkgPSBWaW9sYXRpb25TZXZlcml0eS5jbGFzczsNCi0NCi0gICAgICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFNFVkVSSVRZID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMOw0KLQ0KLSAgICAgICAgLy9AUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIC8vTWVzc2FnZVR5cGUgcG9zdGZpeCA9IE1lc3NhZ2VUeXBlLkZBVEFMOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjY4Y2Y1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogbWVjaGFuaXNtIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBleHR2YWwNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXINCi17DQotICAgIC8qKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IGN1cnJlbnQgZmFjZXMgY29udGV4dA0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgY3VycmVudCBjb21wb25lbnQNCi0gICAgICogQHBhcmFtIHNldmVyaXR5IGpzZiBzZXZlcml0eSBmb3IgZmFjZXMgbWVzc2FnZXMNCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzZXZlcml0eSBzaG91bGQgYmxvY2sgdGhlIG5hdmlnYXRpb24NCi0gICAgICogaWYgI3NldmVyaXR5Q2F1c2VzVmFsaWRhdG9yRXhjZXB0aW9uIHJldHVybnMgZmFsbHMgdmFsaWRhdGlvbiB3aWxsIGJlIGNvbnRpbnVlZCBmb3IgdGhlIGN1cnJlbnQgcHJvcGVydHkNCi0gICAgICogYWxsIG1lc3NhZ2VzIHdoaWNoIGRvbid0IGxlYWQgdG8gYW4gZXhjZXB0aW9uIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBzdG9yYWdlIGFuZA0KLSAgICAgKiBhZGRlZCBhZnRlciB0aGUgZmlyc3QgbWVzc2FnZSB3aGljaCBnZXRzIHRocm93biBhcyBleGNlcHRpb24NCi0gICAgICogYSBnbG9iYWwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgYWRkIHRoZSBtZXNzYWdlcyBvZiB0aGUgc3RvcmFnZSBhcyBmYWNlcyBtZXNzYWdlDQotICAgICAqLw0KLSAgICBib29sZWFuIHNldmVyaXR5QmxvY2tzTmF2aWdhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KTsNCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHNldmVyaXR5IHNob3VsZCBjYXVzZSBhIHZhbGlkYXRvciBleGNlcHRpb24NCi0gICAgICovDQotICAgIGJvb2xlYW4gc2V2ZXJpdHlDYXVzZXNWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSk7DQotDQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IGN1cnJlbnQgZmFjZXMgY29udGV4dA0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgY3VycmVudCBjb21wb25lbnQNCi0gICAgICogQHBhcmFtIHNldmVyaXR5IGpzZiBzZXZlcml0eSBmb3IgZmFjZXMgbWVzc2FnZXMNCi0gICAgICogQHJldHVybiB0cnVlIGlmIGEgdmlvbGF0aW9uIG1lc3NhZ2UgbGVhZHMgdG8gYSBmYWNlcyBtZXNzYWdlDQotICAgICAqLw0KLSAgICBib29sZWFuIHNldmVyaXR5Q2F1c2VzVmlvbGF0aW9uTWVzc2FnZSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KTsNCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnN0cmFpbnQgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkgc2hvdWxkIGJlIHZhbGlkYXRlZCBvbiB0aGUgY2xpZW50IHNpZGUgKGlmIHN1cHBvcnRlZCkNCi0gICAgICovDQotICAgIGJvb2xlYW4gc2V2ZXJpdHlCbG9ja3NTdWJtaXQoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSk7DQotDQotICAgIC8qKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IGN1cnJlbnQgZmFjZXMgY29udGV4dA0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgY3VycmVudCBjb21wb25lbnQNCi0gICAgICogQHBhcmFtIHNldmVyaXR5IGpzZiBzZXZlcml0eSBmb3IgZmFjZXMgbWVzc2FnZXMNCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb25zdHJhaW50IHdpdGggdGhlIGdpdmVuIHNldmVyaXR5DQotICAgICAqIHNob3VsZCBjYXVzZSBlLmcuIGEgcmVxdWlyZWQgbWFya2VyIGluZGVwZW5kZW50IG9mIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gKGlmIHN1cHBvcnRlZCkNCi0gICAgICovDQotICAgIGJvb2xlYW4gc2V2ZXJpdHlTaG93c0luZGljYXRpb24oDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYjdjZjUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBQcm92aWRlcyB0aGUgYWJpbGl0eSBvZiBtZXNzYWdlIHJlc29sdmluZyB0byBWYWxpZGF0aW9uU3RyYXRlZ2llcwotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LlJFVVNFfSkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k8QSBleHRlbmRzIEFubm90YXRpb24+IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kKLXsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCA9ICJfZGV0YWlsIjsKLSAgICAvL2UuZy4gZm9yIGluamVjdGluZyBhIG1lc3NhZ2UgcmVzb2x2ZXIgdmlhIHNwcmluZwotICAgIHByaXZhdGUgTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcjsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIExvY2FsZSBsb2NhbGUgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKTsKLQotICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlUmVzb2x2ZXIgIT0gbnVsbCA/IHRoaXMubWVzc2FnZVJlc29sdmVyLmdldE1lc3NhZ2Uoa2V5LCBsb2NhbGUpIDoKLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldE1lc3NhZ2VSZXNvbHZlckZvclZhbGlkYXRpb25TdHJhdGVneSh0aGlzKS5nZXRNZXNzYWdlKGtleSwgbG9jYWxlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoQSBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlc29sdmVNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQSBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gKGtleSAhPSBudWxsKSA/IHJlc29sdmVNZXNzYWdlKGtleSArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYKSA6IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRmFjZXNNZXNzYWdlIGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWVzc2FnZShBIGFubm90YXRpb24pCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKGdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiksIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQSBhbm5vdGF0aW9uKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VSZXNvbHZlcihNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyKQotICAgIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlUmVzb2x2ZXIgPSBtZXNzYWdlUmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pCi0gICAgewotICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMLCBnZXRMYWJlbChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5KSk7Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbik7Ci0gICAgfQotCi0gICAgLy9mb3IgY3VzdG9tIGFubm90YXRpb25zIC0gb3ZlcnJpZGUgaWYgbmVlZGVkCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMWYzZWQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLmV4Y2VwdGlvbi5SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIFByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIHVzZSBWYWxpZGF0b3JFeGNlcHRpb24gKGFzIGV4cGVjdGVkIGJ5IHRoZSB1c2VyKSBpbnN0ZWFkIG9mIENvbnZlcnRlckV4Y2VwdGlvbi4NCi0gKiBGdXJ0aGVybW9yZSBpdCBwcm92aWRlczo8YnIvPg0KLSAqIGluaXRWYWxpZGF0aW9uPGJyLz4NCi0gKiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBpbml0VmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW5pdFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiaW5pdFZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHByb2Nlc3NWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByb2Nlc3NWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInByb2Nlc3NWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVmFsaWRhdG9yRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLSAgICAgICAgICAgIGlmKGUgaW5zdGFuY2VvZiBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbiA9IG5ldyBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb252ZXJ0RmFjZXNNZXNzYWdlKGUuZ2V0RmFjZXNNZXNzYWdlKCkpLCBlLmdldENhdXNlKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24gPSBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbnZlcnRGYWNlc01lc3NhZ2UoZS5nZXRGYWNlc01lc3NhZ2UoKSksIGUuZ2V0Q2F1c2UoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlmIChwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGdldENsYXNzKCkuZ2V0TmFtZSgpICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiOiB0aHJvdyBvcmlnaW5hbCBleGNlcHRpb24gYWZ0ZXIgcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudCgNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLCB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAiOiBvcmlnaW5hbCBleGNlcHRpb24gYWZ0ZXIgcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICAvL292ZXJyaWRlIGlmIG5lZWRlZA0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uLCB0aGlzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmlydHVhbFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmE4Y2ZlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmlydHVhbFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLQ0KLS8qKg0KLSAqIHRvIG1hcCBjb25zdHJhaW50cyBkaXJlY3RseSB0byBhIG1ldGEtZGF0YSB0cmFuc2Zvcm1lciBpZiB0aGVyZSBpcyBubyB2YWxpZGF0aW9uIHN0cmF0ZWd5IChyZXF1aXJlZCBieSBqc3IgMzAzKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInRoaXMgaXMganVzdCBhbiBhZGFwdGVyIGUuZy4gZm9yIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbiIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjVkYzRlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotDQotICogYWRhcHRlciB0byBjb25uZWN0IHZhbGlkYXRpb24gc3RyYXRlZ2llcyB3aXRoIG1ldGEtZGF0YSB0cmFuc2Zvcm1lcnMsDQotICogaWYgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgZGVmaW5lZCBhcyBiZWFuIGFuZCBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgaW50ZXJmYWNlIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyIGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICAvL3RvIGdldCBiYWNrIHRoZSBpbnRlcm5hbCBjYXNoaW5nDQotICAgIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoKTsNCi0NCi0gICAgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1Y2I2My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIGl0J3MganVzdCBhIGhlbHBlciBmb3IgcHJveGllcyAtIHlvdSBqdXN0IG5lZWQgaXQsIGlmIHlvdSBkZWZpbmUgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0Lg0KLQ0KLSAqIGFkYXB0ZXIgdG8gY29ubmVjdCB2YWxpZGF0aW9uIHN0cmF0ZWdpZXMgd2l0aCBtZXRhLWRhdGEgdHJhbnNmb3JtZXJzLA0KLSAqIGlmIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIGRlZmluZWQgYXMgYmVhbiBhbmQgZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbCBpbXBsZW1lbnRzIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgcHJpdmF0ZSBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAvL29wdGlvbmFsIGZhbGxiYWNrIGZvciBpbnRlcm5hbCBjYXNoaW5nDQotICAgIHByaXZhdGUgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsNCi0NCi0gICAgcHVibGljIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbCgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciBpbnN0YW5jZW9mIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcikNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyKSBtZXRhRGF0YVRyYW5zZm9ybWVyICkuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgTWV0YURhdGFUcmFuc2Zvcm1lciBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFUcmFuc2Zvcm1lcihNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lciA9IG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25TdHJhdGVneShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneSA9IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMGExMWQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcg0KLSAgICAuQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyB0aGUgVmFsaWRhdGlvblN0cmF0ZWd5IGZvciBhIGdpdmVuIE1ldGEtRGF0YSBLZXkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFN0cmluZz4NCi0gICAgICAgIGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxTdHJpbmcsIFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9IG51bGw7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBjcmVhdGUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICBpZiAobWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljTWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZy5jb250YWluc0tleShtZXRhRGF0YUtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nLmdldChtZXRhRGF0YUtleSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWU7DQotICAgICAgICAvL251bGwgLT4gdXNlIG5hbWUgbWFwcGVycw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFN0cmluZz4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0cmF0ZWd5TmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZShtZXRhRGF0YUtleSk7DQotDQotICAgICAgICAgICAgaWYgKHN0cmF0ZWd5TmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKHN0cmF0ZWd5TmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyhtZXRhRGF0YUtleSwgc3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lJbnN0YW5jZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUNCi0gICAgICAgICAgICAuc3RhcnRzV2l0aChBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5QUkVGSVhfRk9SX0JFQU5fTUFQUElORykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbih2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLlBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HLmxlbmd0aCgpKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIG1ldGFEYXRhS2V5LCBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZGRpbmcgbWV0YS1kYXRhIGtleSB0byB2YWxpZGF0aW9uIHN0cmF0ZWd5IG1hcHBpbmc6ICINCi0gICAgICAgICAgICAgICAgKyBtZXRhRGF0YUtleSArICIgLT4gIiArIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcucHV0KG1ldGFEYXRhS2V5LCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnID0gbmV3IFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgLy90cnkgdG8gc2V0dXAgbWFwcGluZyB3aXRoIGJhc2UgbmFtZSBieSBjb252ZW50aW9uIC0gb3ZlcnJpZGVzIGRlZmF1bHQgbWFwcGluZw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgLy9idWlsZCBjb252ZW50aW9uIChzdHJhdGVneSBtYXBwaW5nKQ0KLSAgICAgICAgICAgIHN0YXRpY0NvbmZpZy5zZXRTb3VyY2VPZk1hcHBpbmcoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVRJQ19TVFJBVEVHWV9NQVBQSU5HX1NPVVJDRSkpOw0KLQ0KLSAgICAgICAgICAgIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9zZXR1cCBjdXN0b20gbWFwcGluZyAtIG92ZXJyaWRlcyBhbGwgb3RoZXIgbWFwcGluZ3MNCi0gICAgICAgIFN0cmluZyBjdXN0b21NYXBwaW5nQmFzZU5hbWUgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OX1NUUkFURUdZX01BUFBJTkc7DQotICAgICAgICBpZiAoY3VzdG9tTWFwcGluZ0Jhc2VOYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzdGF0aWNDb25maWcgPSBuZXcgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAgICAgICAgIHN0YXRpY0NvbmZpZy5zZXRTb3VyY2VPZk1hcHBpbmcoY3VzdG9tTWFwcGluZ0Jhc2VOYW1lKTsNCi0gICAgICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBTdHJhdGVneU1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZyxTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWFwcGluZy5nZXRTb3VyY2UoKSwgbWFwcGluZy5nZXRUYXJnZXQoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxTdHJpbmc+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm5hbWVNYXBwZXJMaXN0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0lkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYmRkZGIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogaWYgYW4gYWRhcHRlciBpcyB1c2VkIGZvciBzZXZlcmFsIGNvbnN0cmFpbnRzLCB0aGlzIGludGVyZmFjZSBhbGxvd3MgdG8gaWRlbnRpZnkgaW5zdGFuY2VzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBpbnRlcmZhY2UgSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBTdHJpbmcgSURfUFJFRklYID0gIjoiOw0KLQ0KLSAgICBTdHJpbmcgZ2V0SWQoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1NTIzZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBCYXNlIGludGVyZmFjZSBmb3IgVmFsaWRhdGlvblN0cmF0ZWdpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLS8vKlZhbGlkYXRpb25TdHJhdGVneSBpbnN0ZWFkIG9mICpWYWxpZGF0b3IgdG8gYXZvaWQgbmFtaW5nIGNvbmZ1c2lvbiANCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjliM2YwZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4NDRmYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogTmFtZSBNYXBwZXIgd2hpY2ggZGVsZWdhdGVzIHRoZSBuYW1lIG1hcHBpbmcsIGV4dHJhY3QgdGhlIG5hbWUgYW5kIGNvbnZlcnQgaXQgdG8gYSBiZWFuIG5hbWUgKyBwcmVmaXgNCi0gKiB0YXJnZXQ6IGNvbmZpZ3VyZSBhIHZhbGlkYXRpb24gc3RyYXRlZ3kgdmlhIGEgbWFuYWdlZCBiZWFuIGZhY2lsaXR5IC0+IGFsbG93cyB0byBpbmplY3Qgb3RoZXIgYmVhbnMNCi0gKiBpbnN0ZWFkIG9mIGFwaSBjYWxscyArIGhhcmRjb2RlZCBiZWFuIG5hbWVzDQotICogPHAvPg0KLSAqIGFsbG93ZWQgYmVhbiBzY29wZXM6DQotICogdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgc3RhdGVsZXNzOiBhcHBsaWNhdGlvbi9zaW5nbGV0b24NCi0gKiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBzdGF0ZWZ1bDogbm9uZS9wcm90b3R5cGUNCi0gKiBkb24ndCB1c2UgdGhlIHNlc3Npb24gb3IgYSBjb252ZXJzYXRpb24gc2NvcGUNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoNTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0ZPUl9CRUFOX01BUFBJTkcgPSAiYmVhbjoiOw0KLSAgICBwcml2YXRlIE5hbWVNYXBwZXI8U3RyaW5nPiB3cmFwcGVkOw0KLQ0KLSAgICBwdWJsaWMgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoTmFtZU1hcHBlcjxTdHJpbmc+IG5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IG5hbWVNYXBwZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuYW1lID0gd3JhcHBlZC5jcmVhdGVOYW1lKHNvdXJjZSk7DQotDQotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOw0KLSAgICAgICAgcmV0dXJuIFBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HICsgbmFtZS5zdWJzdHJpbmcoMCwgMSkudG9Mb3dlckNhc2UoKSArIG5hbWUuc3Vic3RyaW5nKDEpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMDMyMDYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIEFubm90YXRpb25zIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqIChjb25maWd1cmVkIHZpYSB3ZWIueG1sKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlODMwMi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBBbm5vdGF0aW9ucyB0byBWYWxpZGF0aW9uU3RyYXRlZ2llcy4NCi0gKiAoY29uZmlndXJlZCB2aWEgaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbikNCi0gKiBUaGUgYmVhbiBwcm92aWRlcyB0aGUgZGVmYXVsdCBuYW1lIChjb252ZW50aW9uKS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gZnVsbCBxdWFsaWZpZWQgbmFtZS4gKD0gY3VzdG9taXphYmxlIGNvbnZlbnRpb24pDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMzhkOGYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFwcyBFeHRWYWwgQW5ub3RhdGlvbnMgdG8gRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigzMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKG1ldGFEYXRhS2V5KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4MjA1My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciB0byBwbGFjZSBBbm5vdGF0aW9ucyBhbmQgVmFsaWRhdGlvblN0cmF0ZWdpZXMgaW4gdGhlIHNhbWUgcGFja2FnZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoNDAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUtleSArDQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMWFhMzMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Qcmlvcml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLXB1YmxpYyBlbnVtIFByaW9yaXR5Ci17Ci0gICAgQkxPQ0tJTkcsCi0gICAgSElHSCwKLSAgICBNRURJVU0sCi0gICAgTE9XCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Ub0RvLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQyNWEwYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5DT05TVFJVQ1RPUjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRCwgQ09OU1RSVUNUT1J9KQotcHVibGljIEBpbnRlcmZhY2UgVG9EbwotewotICAgIFByaW9yaXR5IHZhbHVlKCk7Ci0gICAgU3RyaW5nIGRlc2NyaXB0aW9uKCkgZGVmYXVsdCAiIjsKLQotICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgIEBpbnRlcmZhY2UgTGlzdAotICAgIHsKLSAgICAgICAgVG9Eb1tdIHZhbHVlKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VDYXRlZ29yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0N2IzODUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLS8qKgotICogQVBJOjxici8+Ci0gKiBwYXJ0cyB5b3UgbWlnaHQgbmVlZCBmb3IgY3VzdG9tIGltcGxlbWVudGF0aW9ucyBhbmQgd2hpY2ggYXJlIHF1aXRlIHN0YWJsZSBpbiB2aWV3IG9mIGNoYW5nZXMKLSAqIDxwLz4KLSAqIElOVEVSTkFMOjxici8+Ci0gKiBpZiB5b3UgdGhpbmsgYWJvdXQgcmVmZXJlbmNpbmcgYW4gYXJ0aWZhY3Qgd2hpY2ggaXMgbWFya2VkIGFzIGludGVybmFsLCBhc2sgZm9yIHN1cHBvcnQuCi0gKiB0aGVyZSBzaG91bGQgYmUgYSBiZXR0ZXIgc29sdXRpb24KLSAqIDxwLz4KLSAqIENVU1RPTUlaQUJMRTo8YnIvPgotICogYSBwbGFubmVkIGV4dGVuc2lvbiBwb2ludCB3aGljaCBjb250YWlucyBsb2dpYyB0byBjdXN0b21pemUgdGhlIGZyYW1ld29yay4KLSAqIGlmIGl0IGlzbid0IGFsc28gbWFya2VkIGFzIEFQSSBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotICogaG93ZXZlciwgd2UgdHJ5IHRvIGtlZXAgaXQgYXMgc3RhYmxlIGFzIHBvc3NpYmxlIGFuZCByZWFzb25hYmxlLgotICogPHAvPgotICogUkVVU0U6PGJyLz4KLSAqIGFuIGFydGlmYWN0IHdoaWNoIHlvdSBjYW4gcmV1c2UgZm9yIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uLgotICogaWYgaXQgaXNuJ3QgbWFya2VkIGFzIEFQSSBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotICogaG93ZXZlciwgd2UgdHJ5IHRvIGtlZXAgaXQgYXMgc3RhYmxlIGFzIHBvc3NpYmxlIGFuZCByZWFzb25hYmxlLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLXB1YmxpYyBlbnVtIFVzYWdlQ2F0ZWdvcnkKLXsKLSAgICBBUEksCi0gICAgSU5URVJOQUwsCi0gICAgQ1VTVE9NSVpBQkxFLAotICAgIFJFVVNFCi19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlSW5mb3JtYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTM3ZWJjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIGl0J3MgYW4gaW50ZXJuYWwgYW5ub3RhdGlvbiB0byBwcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gY29uY2VybmluZyB1c2FnZS1jYXRlZ29yaWVzCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkKLSAqLwotQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi1wdWJsaWMgQGludGVyZmFjZSBVc2FnZUluZm9ybWF0aW9uCi17Ci0gICAgVXNhZ2VDYXRlZ29yeVtdIHZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0NsYXNzVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNlMjA1Ni4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsNCi1pbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ2xhc3NVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENsYXNzVXRpbHMuY2xhc3MpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIHRyeVRvTG9hZENsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGxvYWRDbGFzc0Zvck5hbWUobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGxvYWRDbGFzc0Zvck5hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIFRyeSBXZWJBcHAgQ2xhc3NMb2FkZXIgZmlyc3QNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwDQotICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWdub3JlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIGZhbGxiYWNrOiBUcnkgQ2xhc3NMb2FkZXIgZm9yIENsYXNzVXRpbHMgKGkuZS4gdGhlIG15ZmFjZXMuamFyIGxpYikNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwDQotICAgICAgICAgICAgICAgIENsYXNzVXRpbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyA8VD4gVCB0cnlUb0luc3RhbnRpYXRlQ2xhc3MoQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0YXJnZXRDbGFzcy5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKFN0cmluZyBjbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxvYWRDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEphclZlcnNpb24oQ2xhc3MgdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjbGFzc0ZpbGVQYXRoID0gdGFyZ2V0Q2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyI7DQotICAgICAgICBTdHJpbmcgbWFuaWZlc3RGaWxlUGF0aCA9ICIvTUVUQS1JTkYvTUFOSUZFU1QuTUYiOw0KLQ0KLSAgICAgICAgU3RyaW5nIGNsYXNzTG9jYXRpb24gPSB0YXJnZXRDbGFzcy5nZXRSZXNvdXJjZSh0YXJnZXRDbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLmNsYXNzIikudG9TdHJpbmcoKTsNCi0gICAgICAgIFN0cmluZyBtYW5pZmVzdEZpbGVMb2NhdGlvbiA9IGNsYXNzTG9jYXRpb24NCi0gICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCBjbGFzc0xvY2F0aW9uLmluZGV4T2YoY2xhc3NGaWxlUGF0aCkgLSAxKSArIG1hbmlmZXN0RmlsZVBhdGg7DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IE1hbmlmZXN0KG5ldyBVUkwobWFuaWZlc3RGaWxlTG9jYXRpb24pLm9wZW5TdHJlYW0oKSkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNYWluQXR0cmlidXRlcygpLmdldFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5JTVBMRU1FTlRBVElPTl9WRVJTSU9OKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoTE9HLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBMT0cudHJhY2UoImNvdWxkbid0IGxvYWQgdmVyc2lvbiBvZiBqYXIgZmlsZSB3aGljaCBjb250YWlucyAiICsgdGFyZ2V0Q2xhc3MuZ2V0TmFtZSgpLCB0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdjOGIyYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLk1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkZhY2VzTWVzc2FnZVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkFic3RyYWN0RUxIZWxwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuTmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsVXRpbHMNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0dHRVIgPSBMb2dGYWN0b3J5LmdldExvZyhFeHRWYWxVdGlscy5jbGFzcyk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19SRVFVSVJFRCA9ICJqYXZheC5mYWNlcy5jb21wb25lbnQuVUlJbnB1dC5SRVFVSVJFRCI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19SRVFVSVJFRF9ERVRBSUwgPSAiamF2YXguZmFjZXMuY29tcG9uZW50LlVJSW5wdXQuUkVRVUlSRURfZGV0YWlsIjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX01BWElNVU0gPSAiamF2YXguZmFjZXMudmFsaWRhdG9yLkxlbmd0aFZhbGlkYXRvci5NQVhJTVVNIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX01BWElNVU1fREVUQUlMID0gImphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3IuTUFYSU1VTV9kZXRhaWwiOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKENsYXNzTWFwcGluZ0ZhY3Rvcnk8U3RyaW5nLCBWYWxpZGF0aW9uU3RyYXRlZ3k+KSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlKG1ldGFEYXRhS2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICBOYW1lTWFwcGVyPFN0cmluZz4gbWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAucmVnaXN0ZXIobWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVyZWdpc3RlcihtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVueU1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlbnkobWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1ldGFEYXRhVHJhbnNmb3JtZXI+KSBFeHRWYWxDb250ZXh0DQotICAgICAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAucmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlcmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZXJlZ2lzdGVyKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbnlWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZW55KHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcigpDQotICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLCBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50V2l0aE1ldGFEYXRhKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgZm9yKENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyIDogRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXIuY29uZmlndXJlQ29tcG9uZW50KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsNCi0NCi0gICAgICAgIGlmKG1ldGFEYXRhRW50cnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YUVudHJ5ID0gbmV3IE1ldGFEYXRhRW50cnkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgZm9yKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCF2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJUaHJvd2luZygNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uLCB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3IoZmluYWwgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgTWV0YURhdGFFeHRyYWN0b3IoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcmVzdWx0ID0gbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIG9iamVjdCk7DQotICAgICAgICAgICAgICAgIGZvcihNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciA6DQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmFmdGVyRXh0cmFjdGluZyhyZXN1bHQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VSZXNvbHZlciBnZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1lc3NhZ2VSZXNvbHZlcj4pRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgLmNyZWF0ZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAucmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZXJlZ2lzdGVyKHZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVueVZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVueSh2YWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBFTEhlbHBlciBnZXRFTEhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRUxfSEVMUEVSX0ZBQ1RPUlksIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmNsYXNzKS5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY2VzTWVzc2FnZSBjcmVhdGVGYWNlc01lc3NhZ2UoU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcmVhdGVGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjZXNNZXNzYWdlIGNyZWF0ZUZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkZBQ0VTX01FU1NBR0VfRkFDVE9SWSwgRmFjZXNNZXNzYWdlRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZShzZXZlcml0eSwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY2VzTWVzc2FnZSBjb252ZXJ0RmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRkFDRVNfTUVTU0FHRV9GQUNUT1JZLCBGYWNlc01lc3NhZ2VGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuY29udmVydChmYWNlc01lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHlEZXRhaWxzIGNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgYmFzZU9iamVjdDsNCi0gICAgICAgIGlmKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKHRhcmdldEV4cHJlc3Npb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmJlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgU3RyaW5nIGV4cHJlc3Npb24gPSB2YmUuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgICAgIGJhc2VPYmplY3QgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YmUuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURldGFpbHMoDQotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uc3Vic3RyaW5nKDIsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKSwgYmFzZU9iamVjdCwgdmJlLmdldFByb3BlcnR5KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIG9yaWdpbmFsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eSgNCi0gICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgU3RyaW5nIG5ld0Jhc2VLZXkgPSBvcmlnaW5hbC5nZXRLZXkoKS5zdWJzdHJpbmcoMCwgb3JpZ2luYWwuZ2V0S2V5KCkubGFzdEluZGV4T2YoIi4iKSArIDEpOw0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IG5ld0Jhc2VLZXkgKyB0YXJnZXRFeHByZXNzaW9uOw0KLQ0KLSAgICAgICAgYmFzZU9iamVjdCA9IFJlZmxlY3Rpb25VdGlscy5nZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKG9yaWdpbmFsLmdldEJhc2VPYmplY3QoKSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICBuZXdLZXksIGJhc2VPYmplY3QsIHRhcmdldEV4cHJlc3Npb24uc3Vic3RyaW5nKHRhcmdldEV4cHJlc3Npb24ubGFzdEluZGV4T2YoIi4iKSArIDEsDQotICAgICAgICAgICAgdGFyZ2V0RXhwcmVzc2lvbi5sZW5ndGgoKSkpOw0KLSAgICB9DQotDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb1BsYWNlTGFiZWwoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgU3RyaW5nIGxhYmVsLCBpbnQgaW5kZXgpDQotICAgIHsNCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLmNvbnRhaW5zKCJ7IiArIGluZGV4ICsgIn0iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLnJlcGxhY2UoInsiICsgaW5kZXggKyAifSIsIGxhYmVsKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkuY29udGFpbnMoInsiICsgaW5kZXggKyAifSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNNZXNzYWdlLmdldERldGFpbCgpLnJlcGxhY2UoInsiICsgaW5kZXggKyAifSIsIGxhYmVsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VXaXRoRGVmYXVsdE1heGltdW1NZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIGludCBtYXhMZW5ndGgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZSA9IEpzZlV0aWxzLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfTUFYSU1VTSk7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZTsNCi0NCi0gICAgICAgIC8vdXNlIHRyeS9jYXRjaCBmb3IgZWFzaWVyIHN5bmMgYmV0d2VlbiB0cnVuay9icmFuY2gNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEpzZlV0aWxzLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IEpzZlV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vanNmIDEuMiBkb2Vzbid0IGhhdmUgYSBkZXRhaWwgbWVzc2FnZQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2UgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZS5yZXBsYWNlKCJ7MH0iLCAiIiArIG1heExlbmd0aCk7DQotICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsLnJlcGxhY2UoInswfSIsICIiICsgbWF4TGVuZ3RoKTsNCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGZhY2VzUmVxdWlyZWRNZXNzYWdlKTsNCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwpOw0KLSAgICB9DQotDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBsYWNlV2l0aERlZmF1bHRSZXF1aXJlZE1lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGZhY2VzUmVxdWlyZWRNZXNzYWdlID0gSnNmVXRpbHMuZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhKQVZBWF9GQUNFU19SRVFVSVJFRCk7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZTsNCi0NCi0gICAgICAgIC8vdXNlIHRyeS9jYXRjaCBmb3IgZWFzaWVyIHN5bmMgYmV0d2VlbiB0cnVuay9icmFuY2gNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEpzZlV0aWxzLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfUkVRVUlSRURfREVUQUlMKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBKc2ZVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkuZ2V0U3RyaW5nKEpBVkFYX0ZBQ0VTX1JFUVVJUkVEX0RFVEFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9qc2YgMS4yIGRvZXNuJ3QgaGF2ZSBhIGRldGFpbCBtZXNzYWdlDQotICAgICAgICB9DQotDQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc1JlcXVpcmVkTWVzc2FnZSk7DQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTa2lwYWJsZVZhbGlkYXRpb25TdHJhdGVneShDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRDbGFzcyA6IEV4dFZhbFV0aWxzLmdldFNraXBWYWxpZGF0aW9uU3VwcG9ydENsYXNzTGlzdCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLmlzU2tpcFZhbGlkYXRpb25TdXBwb3J0ZWQoY3VycmVudENsYXNzLCB0YXJnZXRDbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHByb2Nlc3NNZXRhRGF0YUVudHJ5QWZ0ZXJTa2lwVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB0YXJnZXRDbGFzcywgTWV0YURhdGFFbnRyeSBlbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmlzU2tpcGFibGVWYWxpZGF0aW9uU3RyYXRlZ3kodGFyZ2V0Q2xhc3MpICYmDQotICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMoZW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCBCb29sZWFuLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PENsYXNzPiBnZXRTa2lwVmFsaWRhdGlvblN1cHBvcnRDbGFzc0xpc3QoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBzdGF0aWNDb25maWd1cmF0aW9uTGlzdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5TS0lQX1ZBTElEQVRJT05fU1VQUE9SVF9DT05GSUcpOw0KLQ0KLSAgICAgICAgTGlzdDxDbGFzcz4gbWFya2VyTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3M7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gY3VycmVudEVudHJ5IDogc3RhdGljQ29uZmlndXJhdGlvbkxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gY3VycmVudENvbmZpZ3VyYXRpb25FbnRyeSA6IGN1cnJlbnRFbnRyeS5nZXRNYXBwaW5nKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShjdXJyZW50Q29uZmlndXJhdGlvbkVudHJ5LmdldFRhcmdldCgpKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYoY3VycmVudENsYXNzICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1hcmtlckxpc3QuYWRkKGN1cnJlbnRDbGFzcyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihMT0dHRVIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi53YXJuKCJjb25maWd1cmF0aW9uIGVudHJ5IHByb3ZpZGVzIGFuIGludmFsaWQgZW50cnk6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY3VycmVudENvbmZpZ3VyYXRpb25FbnRyeS5nZXRUYXJnZXQoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWFya2VyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTa2lwVmFsaWRhdGlvblN1cHBvcnRlZChDbGFzcyBjdXJyZW50Q2xhc3MsIENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZihjdXJyZW50Q2xhc3MuaXNBbm5vdGF0aW9uKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGFyZ2V0Q2xhc3MuaXNBbm5vdGF0aW9uUHJlc2VudChjdXJyZW50Q2xhc3MpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRhcmdldENsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgZ2V0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlksIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgIC5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXhlY3V0ZUxvY2FsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5S2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcHJvcGVydGllcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPSBnZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkuZXh0cmFjdCgNCi0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbiwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKTsNCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsNCi0NCi0gICAgICAgIGlmKHByb3BlcnRpZXMgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eU1hcC5wdXQocHJvcGVydHlLZXksIHByb3BlcnRpZXMpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHJvcGVydHlNYXAucHV0KEFubm90YXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBhbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgIGZvcihQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA6IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuYmVmb3JlVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHByb3BlcnR5TWFwKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGV4ZWN1dGVMb2NhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5S2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwcm9wZXJ0aWVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0gZ2V0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpLmV4dHJhY3QoDQotICAgICAgICAgICAgICAgIGFubm90YXRpb24sIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLCBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcyk7DQotDQotICAgICAgICBpZihwcm9wZXJ0aWVzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KHByb3BlcnR5S2V5LCBwcm9wZXJ0aWVzKTsNCi0gICAgICAgICAgICBwcm9wZXJ0eU1hcC5wdXQoQW5ub3RhdGlvbi5jbGFzcy5nZXROYW1lKCksIGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZm9yKFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIDogcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmFmdGVyVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHByb3BlcnR5TWFwKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkhJR0gsIGRlc2NyaXB0aW9uID0gImlzIHJlbmFtaW5nIG9rPyIpDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGVjdXRlR2xvYmFsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5S2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHByb3BlcnRpZXMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBtb2R1bGVLZXkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydHlNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsNCi0NCi0gICAgICAgIGlmKHByb3BlcnRpZXMgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eU1hcC5wdXQocHJvcGVydHlLZXksIHByb3BlcnRpZXMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzRm9yKG1vZHVsZUtleSk7DQotDQotICAgICAgICBmb3IoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgOiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoIXByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmJlZm9yZVZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eU1hcCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuSElHSCwgZGVzY3JpcHRpb24gPSAiaXMgcmVuYW1pbmcgb2s/IikNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHByb3BlcnRpZXMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIG1vZHVsZUtleSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgaWYocHJvcGVydGllcyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5TWFwLnB1dChwcm9wZXJ0eUtleSwgcHJvcGVydGllcyk7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IobW9kdWxlS2V5KTsNCi0NCi0gICAgICAgIGZvcihQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA6IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5hZnRlclZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eU1hcCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyA8VD4gVCBnZXRTdG9yYWdlKENsYXNzPFQ+IHN0b3JhZ2VUeXBlLCBTdHJpbmcgc3RvcmFnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoVClnZXRTdG9yYWdlTWFuYWdlckZhY3RvcnkoKS5jcmVhdGUoc3RvcmFnZVR5cGUpLmNyZWF0ZShzdG9yYWdlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0U3RvcmFnZShDbGFzcyBzdG9yYWdlVHlwZSwgU3RyaW5nIHN0b3JhZ2VOYW1lKQ0KLSAgICB7DQotICAgICAgICBnZXRTdG9yYWdlTWFuYWdlckZhY3RvcnkoKS5jcmVhdGUoc3RvcmFnZVR5cGUpLnJlc2V0KHN0b3JhZ2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzc01hcHBpbmdGYWN0b3J5PENsYXNzLCBTdG9yYWdlTWFuYWdlcj4gZ2V0U3RvcmFnZU1hbmFnZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRUcmFuc2Zvcm1lZE1ldGFEYXRhKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLQ0KLSAgICAgICAgU2tpcFZhbGlkYXRpb25FdmFsdWF0b3Igc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcigpOw0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IgPSBFeHRWYWxVdGlscy5nZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcigpOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YTsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGFSZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IG1ldGFEYXRhRXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCkuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoIXNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLnNraXBWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHZhbGlkYXRpb25TdHJhdGVneSwgZW50cnkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyID0gRXh0VmFsVXRpbHMuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckZvclZhbGlkYXRpb25TdHJhdGVneSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmRlYnVnKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihpc0NsaWVudFNpZGVWYWxpZGF0aW9uRW5hYmxlZChlbnRyeSkpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEgPSBudWxsOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYobWV0YURhdGEgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmKG1ldGFEYXRhLmlzRW1wdHkoKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgICAoQm9vbGVhbi5UUlVFLmVxdWFscyhlbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5TS0lQX1ZBTElEQVRJT04sIEJvb2xlYW4uY2xhc3MpKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmlzU2tpcGFibGVWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgLy9kb24ndCBicmVhayBtYXliZSB0aGVyZSBhcmUgY29uc3RyYWludHMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCB0aGUgc2tpcC1tZWNoYW5pc20NCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIG1ldGFEYXRhUmVzdWx0LnB1dEFsbChtZXRhRGF0YSk7DQotICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWV0YURhdGFSZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NsaWVudFNpZGVWYWxpZGF0aW9uRW5hYmxlZChNZXRhRGF0YUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICBMaXN0PFN0cmluZz4ga2V5c1RvRGlzYWJsZSA9IGVudHJ5LmdldFByb3BlcnR5KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uTWV0YURhdGFLZXlzLkRJU0FCTEVfQ0xJRU5UX1NJREVfVkFMSURBVElPTiwgTGlzdC5jbGFzcyk7DQotDQotICAgICAgICByZXR1cm4ga2V5c1RvRGlzYWJsZSA9PSBudWxsIHx8ICFrZXlzVG9EaXNhYmxlLmNvbnRhaW5zKGVudHJ5LmdldEtleSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKQ0KLSAgICB7DQotICAgICAgICAvL3RvIGRlYWN0aXZhdGU6IHRoZSBwYXJhbWV0ZXIgaGFzIHRvIGJlIGV4cGxpY2l0bHkgZmFsc2UNCi0gICAgICAgIHJldHVybiAhImZhbHNlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFBhcmFtZXRlci5JTlRFUlBSRVRfRU1QVFlfU1RSSU5HX1NVQk1JVFRFRF9WQUxVRVNfQVNfTlVMTCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlRW1wdHlGaWVsZHMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gISJmYWxzZSIuZXF1YWxzSWdub3JlQ2FzZShXZWJYbWxQYXJhbWV0ZXIuVkFMSURBVEVfRU1QVFlfRklFTERTKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHMoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbi5nZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50SWQoDQotICAgICAgICAgICAgU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKQ0KLSAgICB7DQotICAgICAgICBVSUNvbXBvbmVudCB0YXJnZXRDb21wb25lbnQgPSBmaW5kQ29tcG9uZW50KGNsaWVudElkKTsNCi0NCi0gICAgICAgIHRyeVRvVGhyb3dWYWxpZGF0b3JFeGNlcHRpb25Gb3JDb21wb25lbnQodGFyZ2V0Q29tcG9uZW50LCBmYWNlc01lc3NhZ2UsIHRocm93YWJsZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvVGhyb3dWYWxpZGF0b3JFeGNlcHRpb25Gb3JDb21wb25lbnQoDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpDQotICAgIHsNCi0gICAgICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgaWYoaW50ZXJwcmV0ZXIuc2V2ZXJpdHlDYXVzZXNWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRocm93YWJsZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKGZhY2VzTWVzc2FnZSwgdGhyb3dhYmxlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50KHVpQ29tcG9uZW50LCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb0FkZFZpb2xhdGlvbk1lc3NhZ2VGb3JDb21wb25lbnRJZChTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IGZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgaWYodGFyZ2V0Q29tcG9uZW50ID09IG51bGwgJiYgY2xpZW50SWQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb0FkZFZpb2xhdGlvbk1lc3NhZ2VGb3JUZXN0Q2xpZW50SWQoY2xpZW50SWQsIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50KHRhcmdldENvbXBvbmVudCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAicmVxdWlyZWQgZm9yIHRlc3QgZnJhbWV3b3JrcyAtIGdvYWw6IHJlbW92ZSBpdCIpDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yVGVzdENsaWVudElkKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBpbnRlcnByZXRlciA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBpZihpbnRlcnByZXRlci5zZXZlcml0eUNhdXNlc1Zpb2xhdGlvbk1lc3NhZ2UoZmFjZXNDb250ZXh0LCBudWxsLCBmYWNlc01lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkRmFjZXNNZXNzYWdlKGNsaWVudElkLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50KG51bGwsIGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBpbnRlcnByZXRlciA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBpZihpbnRlcnByZXRlci5zZXZlcml0eUNhdXNlc1Zpb2xhdGlvbk1lc3NhZ2UoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHVpQ29tcG9uZW50ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRGYWNlc01lc3NhZ2UodWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoTE9HR0VSLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgTE9HR0VSLndhcm4oIm5vIGNvbXBvbmVudCB3YXMgZm91bmQgdGhhdCBtaWdodCBoYXBwZW4gd2l0aCB0ZXN0LWZyYW1ld29ya3MiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBhbmQgc2hvdWxkbid0IGhhcHBlbiBpbiByZWFsIGFwcGxpY2F0aW9ucyIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgdHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50KHVpQ29tcG9uZW50LCBmYWNlc01lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgYWRkRmFjZXNNZXNzYWdlKG51bGwsIGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEZhY2VzTWVzc2FnZShTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZVN0b3JhZ2Ugc3RvcmFnZSA9IGdldFN0b3JhZ2UoRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcywgRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgaWYoc3RvcmFnZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0b3JhZ2UuYWRkRmFjZXNNZXNzYWdlKGNsaWVudElkLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5hZGRNZXNzYWdlKGNsaWVudElkLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnRJZChTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IGZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgdHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50KHRhcmdldENvbXBvbmVudCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGludGVycHJldGVyID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIGlmKGludGVycHJldGVyLnNldmVyaXR5QmxvY2tzTmF2aWdhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBmYWNlc01lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLnJlbmRlclJlc3BvbnNlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNldmVyaXR5QmxvY2tzU3VibWl0Rm9yQ29tcG9uZW50SWQoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGludGVycHJldGVyID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IGZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGludGVycHJldGVyLnNldmVyaXR5QmxvY2tzU3VibWl0KGZhY2VzQ29udGV4dCwgdGFyZ2V0Q29tcG9uZW50LCBmYWNlc01lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNldmVyaXR5U2hvd3NJbmRpY2F0aW9uRm9yQ29tcG9uZW50SWQoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGludGVycHJldGVyID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IGZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGludGVycHJldGVyLnNldmVyaXR5U2hvd3NJbmRpY2F0aW9uKGZhY2VzQ29udGV4dCwgdGFyZ2V0Q29tcG9uZW50LCBmYWNlc01lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgVUlDb21wb25lbnQgZmluZENvbXBvbmVudChTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IG51bGw7DQotDQotICAgICAgICBpZihjbGllbnRJZCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldENvbXBvbmVudCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRhcmdldENvbXBvbmVudDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvR3JvdXBVdGlscy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0dyb3VwVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE3MmE3NS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvR3JvdXBVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBHcm91cFV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHcm91cEtleShTdHJpbmcgdmlld0lkLCBTdHJpbmcgY29tcG9uZW50SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb21wb25lbnRJZCA9PSBudWxsID8gdmlld0lkIDogdmlld0lkICsgIkAiICsgY29tcG9uZW50SWQ7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0pzZlV0aWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvSnNmVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk5ZTFjYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvSnNmVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY3RvcnlGaW5kZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGU7DQotaW1wb3J0IGphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGVGYWN0b3J5Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsNCi0NCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKc2ZVdGlscw0KLXsNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlcmVnaXN0ZXJQaGFzZUxpc3RlbmVyKFBoYXNlTGlzdGVuZXIgcGhhc2VMaXN0ZW5lcikNCi0gICAgew0KLSAgICAgICAgTGlmZWN5Y2xlRmFjdG9yeSBsaWZlY3ljbGVGYWN0b3J5ID0gKExpZmVjeWNsZUZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEZhY3RvcnlGaW5kZXIuTElGRUNZQ0xFX0ZBQ1RPUlkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRJZDsNCi0gICAgICAgIExpZmVjeWNsZSBjdXJyZW50TGlmZWN5Y2xlOw0KLSAgICAgICAgSXRlcmF0b3IgbGlmZWN5Y2xlSWRzID0gbGlmZWN5Y2xlRmFjdG9yeS5nZXRMaWZlY3ljbGVJZHMoKTsNCi0gICAgICAgIHdoaWxlIChsaWZlY3ljbGVJZHMuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRJZCA9IChTdHJpbmcpIGxpZmVjeWNsZUlkcy5uZXh0KCk7DQotICAgICAgICAgICAgY3VycmVudExpZmVjeWNsZSA9IGxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlKGN1cnJlbnRJZCk7DQotICAgICAgICAgICAgY3VycmVudExpZmVjeWNsZS5yZW1vdmVQaGFzZUxpc3RlbmVyKHBoYXNlTGlzdGVuZXIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlclBoYXNlTGlzdGVuZXIoUGhhc2VMaXN0ZW5lciBwaGFzZUxpc3RlbmVyKQ0KLSAgICB7DQotICAgICAgICBMaWZlY3ljbGVGYWN0b3J5IGxpZmVjeWNsZUZhY3RvcnkgPSAoTGlmZWN5Y2xlRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRmFjdG9yeUZpbmRlci5MSUZFQ1lDTEVfRkFDVE9SWSk7DQotDQotICAgICAgICBTdHJpbmcgY3VycmVudElkOw0KLSAgICAgICAgTGlmZWN5Y2xlIGN1cnJlbnRMaWZlY3ljbGU7DQotICAgICAgICBJdGVyYXRvciBsaWZlY3ljbGVJZHMgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZUlkcygpOw0KLSAgICAgICAgd2hpbGUgKGxpZmVjeWNsZUlkcy5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudElkID0gKFN0cmluZykgbGlmZWN5Y2xlSWRzLm5leHQoKTsNCi0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlID0gbGlmZWN5Y2xlRmFjdG9yeS5nZXRMaWZlY3ljbGUoY3VycmVudElkKTsNCi0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlLmFkZFBoYXNlTGlzdGVuZXIocGhhc2VMaXN0ZW5lcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFN0cmluZyBidW5kbGVOYW1lID0gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZ2V0TWVzc2FnZUJ1bmRsZSgpOw0KLQ0KLSAgICAgICAgaWYoYnVuZGxlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJ1bmRsZU5hbWUgPSBGYWNlc01lc3NhZ2UuRkFDRVNfTUVTU0FHRVM7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGJ1bmRsZU5hbWUsIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODdmN2QuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1JlZmxlY3Rpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGlvblV0aWxzCi17Ci0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgdHJ5VG9HZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvR2V0TWV0aG9kKHRhcmdldENsYXNzLCB0YXJnZXRNZXRob2ROYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCB0cnlUb0dldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUsIENsYXNzLi4uIHBhcmFtZXRlclR5cGVzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lKQotICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TWV0aG9kKHRhcmdldENsYXNzLCB0YXJnZXRNZXRob2ROYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lLCBDbGFzcy4uLiBwYXJhbWV0ZXJUeXBlcykKLSAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gdGFyZ2V0Q2xhc3M7Ci0gICAgICAgIE1ldGhvZCB0YXJnZXRNZXRob2QgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKCFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gY3VycmVudENsYXNzLmdldERlY2xhcmVkTWV0aG9kKHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGFyZ2V0TWV0aG9kID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IHRhcmdldENsYXNzLmdldEludGVyZmFjZXMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50SW50ZXJmYWNlOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRDbGFzcyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IGN1cnJlbnRDbGFzcy5nZXREZWNsYXJlZE1ldGhvZCh0YXJnZXRNZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0YXJnZXRNZXRob2QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRhcmdldE1ldGhvZDsKLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBOb1N1Y2hNZXRob2RFeGNlcHRpb24oInRoZXJlIGlzIG5vIG1ldGhvZCB3aXRoIHRoZSBuYW1lICciICsgdGFyZ2V0TWV0aG9kTmFtZSArICInIiArCi0gICAgICAgICAgICAgICAgIiBjbGFzczogIiArIHRhcmdldENsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0ludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3ModGFyZ2V0LCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZE9mQ2xhc3ModGFyZ2V0LCBtZXRob2QsIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQubmV3SW5zdGFuY2UoKSwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldC5uZXdJbnN0YW5jZSgpLCBtZXRob2QsIGFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdC4uLiBhcmdzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0LCBtZXRob2QsIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdC4uLiBhcmdzKQotICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKHRhcmdldCwgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QmFzZU9mUHJvcGVydHlDaGFpbihPYmplY3QgYmFzZU9iamVjdCwgU3RyaW5nIHByb3BlcnR5Q2hhaW4pCi0gICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcm9wZXJ0eUNoYWluLCAiLiIpOwotCi0gICAgICAgIE9iamVjdCBjdXJyZW50QmFzZSA9IGJhc2VPYmplY3Q7Ci0gICAgICAgIFN0cmluZyBjdXJyZW50UHJvcGVydHk7Ci0gICAgICAgIE1ldGhvZCBjdXJyZW50TWV0aG9kOwotCi0gICAgICAgIHdoaWxlKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQotICAgICAgICAgICAgLy9pZ25vcmUgdGhlIGxhc3QgcHJvcGVydHkKLSAgICAgICAgICAgIGlmKCF0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL25vIGlzIC0gaXQncyBvbmx5IHBvc3NpYmxlIGF0IHByb3BlcnRpZXMgbm90IGF0IGJlYW4gbGV2ZWwKLSAgICAgICAgICAgIGN1cnJlbnRNZXRob2QgPSB0cnlUb0dldE1ldGhvZChjdXJyZW50QmFzZS5nZXRDbGFzcygpLAotICAgICAgICAgICAgICAgICJnZXQiICsgY3VycmVudFByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFByb3BlcnR5LnN1YnN0cmluZygxLCBjdXJyZW50UHJvcGVydHkubGVuZ3RoKCkpKTsKLSAgICAgICAgICAgIGN1cnJlbnRCYXNlID0gdHJ5VG9JbnZva2VNZXRob2QoY3VycmVudEJhc2UsIGN1cnJlbnRNZXRob2QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRCYXNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1dlYlhtbFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNTk3NTQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1dlYlhtbFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFdlYlhtbFV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRJbml0UGFyYW1ldGVyKEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVgsIGtleSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW5pdFBhcmFtZXRlcihTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldEluaXRQYXJhbWV0ZXIocHJlZml4ICsgIi4iICsgbmFtZSk7DQotICAgICAgICByZXR1cm4gKHZhbHVlICE9IG51bGwpID8gdmFsdWUucmVwbGFjZSgiICIsICIiKS50cmltKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9jb3JlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMjAxZDIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUgTW9kdWxlDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUgTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSBNb2R1bGUgcHJvdmlkZXMgYW4gZXh0ZW5zaWJsZSB2YWxpZGF0aW9uIHBsYXRmb3JtIHRvIGltcGxlbWVudCB2YWxpZGF0aW9uIGJhc2VkIG9uIG1ldGEtZGF0YS4NCi0gICAgQmFzZWQgb24gdGhpcyBtb2R1bGUgaXQgaXMgcG9zc2libGUgdG8gaW1wbGVtZW50IHZhbGlkYXRpb24gbW9kdWxlcy4NCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEuMS54IGFuZCBKU0YgMS4yLnguIEJvdGggdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9hc3NlbWJseS9wb20ueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI1NjZmYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9hc3NlbWJseS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBFeGFtcGxlcyBBc3NlbWJseTwvbmFtZT4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZXhhbXBsZXMtYXNzZW1ibHkxMjwvYXJ0aWZhY3RJZD4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5kZXBlbmRlbmN5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LXdhcjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd2FyPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktc3JjPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fd29ybGQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXZhLXNvdXJjZTwvdHlwZT4gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmVhdHVyZS1zZXRfMDE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXZhLXNvdXJjZTwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc3JjPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPiAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBFWEVDVVRFIG12biBwYWNrYWdlIHRvIGdlbmVyYXRlIGFzc2VtYmx5IGZpbGVzIC0tPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9zcmM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmFzc2VtYmx5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4gICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwtZXhhbXBsZXMtJHtwcm9qZWN0LnZlcnNpb259LXNyYzwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfYmluPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hc3NlbWJseTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0JICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+ICAgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWw8L2Rlc2NyaXB0b3I+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsLWV4YW1wbGVzLSR7cHJvamVjdC52ZXJzaW9ufTwvZmluYWxOYW1lPgotCSAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd29yazwvd29ya0RpcmVjdG9yeT4KLQkgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0JICAgIAotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+d2Fnb24tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aWQ+bXlmYWNlcy1uaWdodGx5LWJ1aWxkczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vbWlub3RhdXIuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvYnVpbGRzL215ZmFjZXMvbmlnaHRseTwvdXJsPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9pbnB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICA8L3BsdWdpbnM+Ci0KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXAueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBmN2I4MS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+YmluPC9pZD4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+CQotICA8ZmlsZVNldHM+ICAgIAotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvd2FyPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLndhcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PiAgICAgCi0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NzBjY2MuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPnNyYzwvaWQ+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgkKLSAgPGZpbGVTZXRzPiAgICAKLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3NyYzwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLnR4dDwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1YjNhNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOWJkYjEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNDE0Y2MuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmVhdHVyZS1zZXRfMDE8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgZmVhdHVyZS1zZXQgMDE8L25hbWU+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5mYWNlbGV0czwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtZmFjZWxldHM8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE0PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8IS0tDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIC0tPg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRvbWFoYXdrPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRvbWFoYXdrPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS42PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jdXN0b20vdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwMWRmNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jdXN0b20vdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLSMgdGhpcyBtZXNzYWdlIGJ1bmRsZSBpcyBwaWNrZWQgdXAgdmlhIGNvbnZlbnRpb24NCi1yZXBlYXRlZF9wYXNzd29yZF9yZXF1aXJlZD1wbGVhc2UgcmV0eXBlIHRoZSBwYXNzd29yZA0KLXJlcGVhdGVkX3Bhc3N3b3JkX3JlcXVpcmVkX2RldGFpbD1wbGVhc2UgcmV0eXBlIHRoZSBwYXNzd29yZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNTExZGUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJc1R5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLk5vdEVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlRlbXBvcmFsOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbFR5cGU7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLXB1YmxpYyBjbGFzcyBQZXJzb24NCi17DQotICAgIEBMZW5ndGgobWluaW11bSA9IDIpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMjApDQotICAgIEBOb3RFcXVhbHMoImxhc3ROYW1lIikNCi0gICAgQFBhdHRlcm4oIltBLVpdW2Etel0rIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOw0KLQ0KLSAgICBAUmVxdWlyZWQocGFyYW1ldGVycyA9IERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykNCi0gICAgQExlbmd0aChtaW5pbXVtID0gMiwgcGFyYW1ldGVycyA9IERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykNCi0gICAgQENvbHVtbihsZW5ndGggPSAyMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7DQotDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwKQ0KLSAgICBwcml2YXRlIFN0cmluZyByb2xlID0gInVzZXIiOw0KLQ0KLSAgICBARGF0ZUlzKHR5cGUgPSBEYXRlSXNUeXBlLmJlZm9yZSwgdmFsdWVPZiA9ICJmaW5hbEV4YW0iKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIEBUZW1wb3JhbChUZW1wb3JhbFR5cGUuREFURSkNCi0gICAgcHJpdmF0ZSBEYXRlIGJpcnRoZGF5Ow0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIEBUZW1wb3JhbChUZW1wb3JhbFR5cGUuREFURSkNCi0gICAgcHJpdmF0ZSBEYXRlIGZpbmFsRXhhbTsNCi0NCi0gICAgQExlbmd0aChtaW5pbXVtID0gMikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmlja05hbWU7DQotDQotICAgIEBMZW5ndGgobWluaW11bSA9IDYpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gNjApDQotICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIHByaXZhdGUgaW50IG51bWJlck9mU2libGluZ3M7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByb2xlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFJvbGUoU3RyaW5nIHJvbGUpDQotICAgIHsNCi0gICAgICAgIHRoaXMucm9sZSA9IHJvbGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0QmlydGhkYXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmlydGhkYXk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0QmlydGhkYXkoRGF0ZSBiaXJ0aGRheSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5iaXJ0aGRheSA9IGJpcnRoZGF5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldEZpbmFsRXhhbSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmaW5hbEV4YW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RmluYWxFeGFtKERhdGUgZmluYWxFeGFtKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpbmFsRXhhbSA9IGZpbmFsRXhhbTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5pY2tOYW1lKFN0cmluZyBuaWNrTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uaWNrTmFtZSA9IG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNpYmxpbmdzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG51bWJlck9mU2libGluZ3M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyT2ZTaWJsaW5ncyhpbnQgbnVtYmVyT2ZTaWJsaW5ncykNCi0gICAgew0KLSAgICAgICAgdGhpcy5udW1iZXJPZlNpYmxpbmdzID0gbnVtYmVyT2ZTaWJsaW5nczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ODNmM2YuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmd1aS5iZWFuczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluLlBlcnNvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5Ob3RFcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTG9uZ1JhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmN1c3RvbS5lbWFpbHZhbGlkYXRvci5FbWFpbFZhbGlkYXRvcjsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uUGFnZQ0KLXsNCi0NCi0gICAgLy90aGUgb2xkIHBhc3N3b3JkIG9mIHRoZSBwZXJzb24gaXNuJ3QgdXNlZCB3aXRoaW4gdGhlIHBhZ2UNCi0gICAgLy8tPiB2YWxpZGF0ZSB3aXRoIHZhbHVlIG9mIHRoZSBtb2RlbA0KLSAgICBAU2tpcFZhbGlkYXRpb24oIiN7cGVyc29uLnJvbGUgZXEgJ2FkbWluJ30iKQ0KLSAgICBAUmVxdWlyZWQNCi0gICAgQEVxdWFscygicGVyc29uLnBhc3N3b3JkIikNCi0gICAgQE5vdEVxdWFscygicGFzc3dvcmQiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBvbGRQYXNzd29yZDsNCi0NCi0gICAgQEVxdWFscygicGFzc3dvcmRSZXBlYXRlZCIpDQotICAgIC8vY29tYmluZSBndWkgcmVsYXRlZCBhbm5vdGF0aW9ucyB3aXRoIHRoZSBhbm5vYXRpb25zIG9mIHRoZSBkb21haW4gbW9kZWwNCi0gICAgLy9ASm9pblZhbGlkYXRpb24odmFsdWUgPSAiI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5wYXNzd29yZH0iKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsNCi0NCi0gICAgQFJlcXVpcmVkKHZhbGlkYXRpb25FcnJvck1zZ0tleSA9ICJyZXBlYXRlZF9wYXNzd29yZF9yZXF1aXJlZCIsDQotICAgICAgICAgICAgcGFyYW1ldGVycyA9IHtEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MsIFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3N9KQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZFJlcGVhdGVkOw0KLQ0KLSAgICAvL3VzZSAje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLm5pY2tOYW1lfSwgI3twZXJzb24ubmlja05hbWV9DQotICAgIC8vdXNlIHJlZ2lzdHJhdGlvblBhZ2UgdG8gZGlzcGxheSB0aGUgc2Vjb25kIGVycm9yIG1lc3NhZ2UgYXQgb2xkIG5pY2tuYW1lDQotICAgIC8vb3IgbG9jYWwgcHJvcGVydHkgY2hhaW5pbmcgKHRvIGF2b2lkIHRoZSB1c2FnZSBvZiB0aGUgYmVhbiBuYW1lKSAtIGxpa2U6DQotICAgIEBTa2lwVmFsaWRhdGlvbigiI3twZXJzb24ucm9sZSBlcSAnYWRtaW4nfSIpDQotICAgIEBOb3RFcXVhbHMoInBlcnNvbi5uaWNrTmFtZSIpDQotICAgIEBKb2luVmFsaWRhdGlvbigicGVyc29uLm5pY2tOYW1lIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmV3Tmlja05hbWU7DQotDQotICAgIHByaXZhdGUgUGVyc29uIHBlcnNvbjsNCi0NCi0gICAgcHVibGljIFN0cmluZyBmaW5pc2goKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXRQYXNzd29yZCh0aGlzLnBhc3N3b3JkKTsNCi0gICAgICAgIHJldHVybiAiaG9tZSI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyB1cGRhdGVOaWNrTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldE5pY2tOYW1lKHRoaXMubmV3Tmlja05hbWUpOw0KLSAgICAgICAgcmV0dXJuICJob21lIjsNCi0gICAgfQ0KLQ0KLSAgICAvL2p1c3QgYSBxdWljayBpbGx1c3RyYXRpb24gb2Ygc2tpcFZhbGlkYXRpb24NCi0gICAgcHVibGljIFN0cmluZyBzd2l0Y2hNb2RlKCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRSb2xlID0gdGhpcy5wZXJzb24uZ2V0Um9sZSgpOw0KLQ0KLSAgICAgICAgaWYoY3VycmVudFJvbGUuZXF1YWxzKCJhZG1pbiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMucGVyc29uLnNldFJvbGUoInVzZXIiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnBlcnNvbi5zZXRSb2xlKCJhZG1pbiIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuICIiOw0KLSAgICB9DQotDQotICAgIEBKb2luVmFsaWRhdGlvbigib3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluLlBlcnNvbjplbWFpbCIpDQotICAgIEBWYWxpZGF0b3IoRW1haWxWYWxpZGF0b3IuY2xhc3MpDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5wZXJzb24uZ2V0RW1haWwoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbWFpbChTdHJpbmcgZW1haWwpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldEVtYWlsKGVtYWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBASm9pblZhbGlkYXRpb24oIiN7cGVyc29uLm51bWJlck9mU2libGluZ3N9IikNCi0gICAgQExvbmdSYW5nZShtYXhpbXVtID0gMjApDQotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZTaWJsaW5ncygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbi5nZXROdW1iZXJPZlNpYmxpbmdzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyT2ZTaWJsaW5ncyhpbnQgbnVtYmVyT2ZTaWJsaW5ncykNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0TnVtYmVyT2ZTaWJsaW5ncyhudW1iZXJPZlNpYmxpbmdzKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2xkUGFzc3dvcmQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gb2xkUGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0T2xkUGFzc3dvcmQoU3RyaW5nIG9sZFBhc3N3b3JkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm9sZFBhc3N3b3JkID0gb2xkUGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkUmVwZWF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmRSZXBlYXRlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZFJlcGVhdGVkKFN0cmluZyBwYXNzd29yZFJlcGVhdGVkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkUmVwZWF0ZWQgPSBwYXNzd29yZFJlcGVhdGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQZXJzb24gZ2V0UGVyc29uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBlcnNvbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzb24oUGVyc29uIHBlcnNvbikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24gPSBwZXJzb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROZXdOaWNrTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXdOaWNrTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROZXdOaWNrTmFtZShTdHJpbmcgbmV3Tmlja05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmV3Tmlja05hbWUgPSBuZXdOaWNrTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MThkNjYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIgotICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjIiPgotICAgIDxhcHBsaWNhdGlvbj4KLSAgICAgICAgPCEtLSB0cmluaWRhZCAtLT4KLSAgICAgICAgPGRlZmF1bHQtcmVuZGVyLWtpdC1pZD4KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb3JlCi0gICAgICAgIDwvZGVmYXVsdC1yZW5kZXIta2l0LWlkPgotCi0gICAgPC9hcHBsaWNhdGlvbj4KLQotICAgIDxtYW5hZ2VkLWJlYW4+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tbmFtZT5yZWdpc3RyYXRpb25QYWdlPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5ndWkuYmVhbnMuUmVnaXN0cmF0aW9uUGFnZTwvbWFuYWdlZC1iZWFuLWNsYXNzPgotICAgICAgICA8bWFuYWdlZC1iZWFuLXNjb3BlPnJlcXVlc3Q8L21hbmFnZWQtYmVhbi1zY29wZT4KLQotICAgICAgICA8bWFuYWdlZC1wcm9wZXJ0eT4KLSAgICAgICAgICAgIDxwcm9wZXJ0eS1uYW1lPnBlcnNvbjwvcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDx2YWx1ZT4je3BlcnNvbn08L3ZhbHVlPgotICAgICAgICA8L21hbmFnZWQtcHJvcGVydHk+Ci0gICAgPC9tYW5hZ2VkLWJlYW4+Ci0KLSAgICA8bWFuYWdlZC1iZWFuPgotICAgICAgICA8bWFuYWdlZC1iZWFuLW5hbWU+cGVyc29uPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5kb21haW4uUGVyc29uPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tc2NvcGU+c2Vzc2lvbjwvbWFuYWdlZC1iZWFuLXNjb3BlPgotICAgIDwvbWFuYWdlZC1iZWFuPgotCi0gICAgPG5hdmlnYXRpb24tcnVsZT4KLSAgICAgICAgPGZyb20tdmlldy1pZD4vcGFnZXMvaG9tZS54aHRtbDwvZnJvbS12aWV3LWlkPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5hZGRVc2VyPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+Y2hhbmdlTmlja05hbWU8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5jaGFuZ2VQYXNzd29yZDwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL2NoYW5nZV9wYXNzd29yZC54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgPG5hdmlnYXRpb24tcnVsZT4KLSAgICAgICAgPGZyb20tdmlldy1pZD4qPC9mcm9tLXZpZXctaWQ+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmhvbWU8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9ob21lLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICA8L25hdmlnYXRpb24tcnVsZT4KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzOTM2Ni4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9tYWluLnRhZ2xpYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBmYWNlbGV0LXRhZ2xpYiBQVUJMSUMKLSAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBGYWNlbGV0IFRhZ2xpYiAxLjAvL0VOIgotICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZmFjZWxldC10YWdsaWJfMV8wLmR0ZCI+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGZhY2VsZXQtdGFnbGliPgotICAgIDxuYW1lc3BhY2U+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHR2YWwvZGVtby9jb21wb25lbnRzPC9uYW1lc3BhY2U+Ci0KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+dXNlckZvcm08L3RhZy1uYW1lPgotICAgICAgICA8c291cmNlPgotICAgICAgICAgICAgLi4vY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKLSAgICAgICAgPC9zb3VyY2U+Ci0gICAgPC90YWc+Ci0KLTwvZmFjZWxldC10YWdsaWI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YzAxYWEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgotICAgICAgICAgdmVyc2lvbj0iMi40Ij4KLQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuREVGQVVMVF9TVUZGSVg8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4ueGh0bWw8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5mYWNlbGV0cy5MSUJSQVJJRVM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9tYWluLnRhZ2xpYi54bWw8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRU5BQkxFX0xJR0hUV0VJR0hUX0RJQUxPR1M8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkRJU0FCTEVfQ09OVEVOVF9DT01QUkVTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQUxURVJOQVRFX1ZJRVdfSEFORExFUjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNvbS5zdW4uZmFjZWxldHMuRmFjZWxldFZpZXdIYW5kbGVyPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLlVTRV9BUFBMSUNBVElPTl9WSUVXX0NBQ0hFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQ0hBTkdFX1BFUlNJU1RFTkNFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+c2Vzc2lvbjwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5TdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jbGllbnQ8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgRGVmaW5lcyB0aGUgYW1vdW50IChkZWZhdWx0ID0gMjApIG9mIHRoZSBsYXRlc3Qgdmlld3MgYXJlIHN0b3JlZCBpbiBzZXNzaW9uLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuTlVNQkVSX09GX1ZJRVdTX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc3RhdGUgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0gYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLgotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkgYW5kIGlmCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04gaXMgdHJ1ZSAoPSBkZWZhdWx0KQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4gSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DT01QUkVTU19TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhpcyBwYXJhbWV0ZXIgdGVsbHMgTXlGYWNlcyBpZiBqYXZhc2NyaXB0IGNvZGUgc2hvdWxkIGJlIGFsbG93ZWQgaW4gdGhlCi0gICAgICAgICAgICByZW5kZXJlZCBIVE1MIG91dHB1dC4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgYWxsb3dlZCwgY29tbWFuZF9saW5rIGFuY2hvcnMgd2lsbCBoYXZlIGphdmFzY3JpcHQgY29kZQotICAgICAgICAgICAgdGhhdCBzdWJtaXRzIHRoZSBjb3JyZXNwb25kaW5nIGZvcm0uCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIG5vdCBhbGxvd2VkLCB0aGUgc3RhdGUgc2F2aW5nIGluZm8gYW5kIG5lc3RlZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICB3aWxsIGJlIGFkZGVkIGFzIHVybCBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BTExPV19KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuREVURUNUX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgcmVuZGVyZWQgSFRNTCBjb2RlIHdpbGwgYmUgZm9ybWF0dGVkLCBzbyB0aGF0IGl0IGlzICJodW1hbiByZWFkYWJsZSIuCi0gICAgICAgICAgICBpLmUuIGFkZGl0aW9uYWwgbGluZSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIHdpbGwgYmUgd3JpdHRlbiwgdGhhdCBkbyBub3QKLSAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgSFRNTCBjb2RlLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIGEgamF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRoYXQgaXMgYWJsZSB0byByZXN0b3JlIHRoZQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMKLSAgICAgICAgICAgIHdpdGggbG9uZyBsaXN0cyBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcAotICAgICAgICAgICAgaWYgeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZSBwYWdlLgotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQVVUT19TQ1JPTEw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlVzZWQgZm9yIGVuY3J5cHRpbmcgdmlldyBzdGF0ZS4gT25seSByZWxldmFudCBmb3IgY2xpZW50IHNpZGUKLSAgICAgICAgICAgIHN0YXRlIHNhdmluZy4gU2VlIE15RmFjZXMgd2lraS93ZWIgc2l0ZSBkb2N1bWVudGF0aW9uIGZvciBpbnN0cnVjdGlvbnMKLSAgICAgICAgICAgIG9uIGhvdyB0byBjb25maWd1cmUgYW4gYXBwbGljYXRpb24gZm9yIGRpZmZlbmVudCBlbmNyeXB0aW9uIHN0cmVuZ3Rocy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFQ1JFVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPk56WTFORE15TVRBPTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZhbGlkYXRlIG1hbmFnZWQgYmVhbnMsIG5hdmlnYXRpb24gcnVsZXMgYW5kIGVuc3VyZSB0aGF0IGZvcm1zIGFyZSBub3QgbmVzdGVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuVkFMSURBVEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8IS0tIExpc3RlbmVyLCB0byBhbGxvdyBKZXR0eSBzZXJ2aW5nIE15RmFjZXMgYXBwcyAtLT4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMud2ViYXBwLlN0YXJ0dXBTZXJ2bGV0Q29udGV4dExpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IC0tPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+cmVzb3VyY2VzPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC53ZWJhcHAuUmVzb3VyY2VTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgIDwvc2VydmxldD4KLQotICAgIDxmaWx0ZXI+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT50cmluaWRhZDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLndlYmFwcC5UcmluaWRhZEZpbHRlcjwvZmlsdGVyLWNsYXNzPgotICAgIDwvZmlsdGVyPgotCi0gICAgPGZpbHRlci1tYXBwaW5nPgotICAgICAgICA8ZmlsdGVyLW5hbWU+dHJpbmlkYWQ8L2ZpbHRlci1uYW1lPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICA8L2ZpbHRlci1tYXBwaW5nPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmdzIC0tPgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+L2ZhY2VzLyo8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9hZGYvKjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYmM5MWMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIgotICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIKLSAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiCi0gICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCIKLSAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4KLQotPHVpOmNvbXBvc2l0aW9uPgotICAgIDx0cjpwYW5lbEZvcm1MYXlvdXQ+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibmljayBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvblsgJ25pY2tOYW1lJyBdfSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJlLW1haWwiIHZhbHVlPSIje2JlYW4uZW1haWx9Ii8+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0iZmlyc3QgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb24uZmlyc3ROYW1lfSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJsYXN0IG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uLmxhc3ROYW1lfSIvPgotICAgICAgICA8IS0tCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Imxhc3QgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb24ubGFzdE5hbWV9IiByZXF1aXJlZE1lc3NhZ2VEZXRhaWw9InswfSBpcyByZXF1aXJlZCIvPgotICAgICAgICAtLT4KLSAgICAgICAgPHRyOmlucHV0RGF0ZSBsYWJlbD0iYmlydGhkYXkiIHZhbHVlPSIje2JlYW4ucGVyc29uLmJpcnRoZGF5fSI+Ci0gICAgICAgICAgICA8dHI6Y29udmVydERhdGVUaW1lIHR5cGU9ImRhdGUiIHBhdHRlcm49ImRkLk1NLnl5eXkiLz4KLSAgICAgICAgPC90cjppbnB1dERhdGU+Ci0gICAgICAgIDx0cjppbnB1dERhdGUgbGFiZWw9ImZpbmFsIGV4YW0iIHZhbHVlPSIje2JlYW4ucGVyc29uLmZpbmFsRXhhbX0iPgotICAgICAgICAgICAgPHRyOmNvbnZlcnREYXRlVGltZSB0eXBlPSJkYXRlIiBwYXR0ZXJuPSJkZC5NTS55eXl5Ii8+Ci0gICAgICAgIDwvdHI6aW5wdXREYXRlPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im51bWJlciBvZiBzaWJsaW5ncyIgdmFsdWU9IiN7YmVhbi5udW1iZXJPZlNpYmxpbmdzfSIvPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9InBhc3N3b3JkIiB2YWx1ZT0iI3tiZWFuLnBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9InJlLWVudGVyIHBhc3N3b3JkIiB2YWx1ZT0iI3tiZWFuLnBhc3N3b3JkUmVwZWF0ZWR9IiBzZWNyZXQ9InRydWUiLz4KLQotICAgIDwvdHI6cGFuZWxGb3JtTGF5b3V0PgotPC91aTpjb21wb3NpdGlvbj4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1Y2QxNDguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0gICAgICAgIA0KLTxodG1sPg0KLQ0KLTxoZWFkPg0KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIwOyBVUkw9ZmFjZXMvcGFnZXMvaG9tZS54aHRtbCI+DQotPC9oZWFkPg0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBjMWVhOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPHRyOmRvY3VtZW50DQotICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiDQotICAgICAgICB4bWxuczpjPSJodHRwOi8vamF2YS5zdW4uY29tL2pzdGwvY29yZSI+DQotICAgIDxmOmZhY2V0IG5hbWU9Im1ldGFDb250YWluZXIiPg0KLSAgICAgICAgPHRpdGxlPnNldi1lbiBmZWF0dXJlLXNldCBkZW1vIDAxPC90aXRsZT4NCi0gICAgPC9mOmZhY2V0Pg0KLQ0KLSAgICA8dHJoOmJvZHk+DQotDQotICAgICAgICA8IS0tIG9yaWdpbmFsIC0tPg0KLSAgICAgICAgPGRpdiBpZD0id3JhcCI+DQotDQotICAgICAgICAgICAgPHRyOmZvcm0gaWQ9ImZvcm0iIGRlZmF1bHRDb21tYW5kPSJkZWZhdWx0QnV0dG9uIj4NCi0gICAgICAgICAgICAgICAgPGRpdiBpZD0ibWFpbiI+DQotICAgICAgICAgICAgICAgICAgICA8dWk6aW5zZXJ0IG5hbWU9ImNvbnRlbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InVuZGVyX2NvbnN0cnVjdGlvbiI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj4hc2l0ZSB1bmRlciBjb25zdHJ1Y3Rpb24hPC9oMj4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIGNvbnRlbnQgb2YgdGhpcyBzaXRlIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhlIG1vbWVudC48L3A+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICA8L3VpOmluc2VydD4NCi0gICAgICAgICAgICAgICAgPC9kaXY+DQotDQotICAgICAgICAgICAgPC90cjpmb3JtPg0KLSAgICAgICAgICAgIDx0cjptZXNzYWdlcyBnbG9iYWxPbmx5PSJ0cnVlIi8+DQotDQotICAgICAgICA8L2Rpdj4NCi0gICAgPC90cmg6Ym9keT4NCi0NCi0NCi08L3RyOmRvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODkzZmFlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgPHRyOnBhbmVsRm9ybUxheW91dD4NCi0NCi0gICAgICAgICAgICA8dWk6cmVtb3ZlPg0KLSAgICAgICAgICAgICAgICBqdXN0IGZvciB0aGUgZGVtbyB3ZSBhcmUgdXNpbmcgdHdvIGlucHV0IGNvbXBvbmVudHMNCi0gICAgICAgICAgICA8L3VpOnJlbW92ZT4NCi0gICAgICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJvbGQgbmljayBuYW1lIiByZWFkT25seT0idHJ1ZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ubmlja05hbWV9Ii8+DQotDQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibmljayBuYW1lIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLm5ld05pY2tOYW1lfSIvPg0KLQ0KLSAgICAgICAgPC90cjpwYW5lbEZvcm1MYXlvdXQ+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJzYXZlIiBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS51cGRhdGVOaWNrTmFtZX0iLz4NCi0NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTA5NzVhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgPHRhYmxlPg0KLSAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjpvdXRwdXRMYWJlbCB2YWx1ZT0ib2xkIHBhc3N3b3JkIiBmb3I9Im9sZF9wYXNzd29yZCIvPjwvdGQ+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6aW5wdXRUZXh0IGlkPSJvbGRfcGFzc3dvcmQiIHNpbXBsZT0idHJ1ZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5vbGRQYXNzd29yZH0iIHNlY3JldD0idHJ1ZSIvPjwvdGQ+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6bWVzc2FnZSBmb3I9Im9sZF9wYXNzd29yZCIvPjwvdGQ+DQotICAgICAgICAgICAgPC90cj4NCi0NCi0gICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6b3V0cHV0TGFiZWwgdmFsdWU9Im5ldyBwYXNzd29yZCIgZm9yPSJuZXdfcGFzc3dvcmQiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOmlucHV0VGV4dCBpZD0ibmV3X3Bhc3N3b3JkIiBzaW1wbGU9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGFzc3dvcmR9IiBzZWNyZXQ9InRydWUiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm1lc3NhZ2UgZm9yPSJuZXdfcGFzc3dvcmQiLz48L3RkPg0KLSAgICAgICAgICAgIDwvdHI+DQotDQotICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm91dHB1dExhYmVsIHZhbHVlPSJyZS1lbnRlciBwYXNzd29yZCIgZm9yPSJyZWVudGVyZWQiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOmlucHV0VGV4dCBpZD0icmVlbnRlcmVkIiBzaW1wbGU9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGFzc3dvcmRSZXBlYXRlZH0iIHNlY3JldD0idHJ1ZSIvPjwvdGQ+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6bWVzc2FnZSBmb3I9InJlZW50ZXJlZCIvPjwvdGQ+DQotICAgICAgICAgICAgPC90cj4NCi0NCi0gICAgICAgIDwvdGFibGU+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJzYXZlIiBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS5maW5pc2h9Ii8+DQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTdlYmQ5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9ImFkZCB1c2VyIiBhY3Rpb249ImFkZFVzZXIiLz48YnIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0iY2hhbmdlIG5pY2sgbmFtZSIgYWN0aW9uPSJjaGFuZ2VOaWNrTmFtZSIvPjxici8+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJjaGFuZ2UgcGFzc3dvcmQiIGFjdGlvbj0iY2hhbmdlUGFzc3dvcmQiLz48YnIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRMaW5rIHRleHQ9Im1vZGU6ICN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ucm9sZX0iDQotICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS5zd2l0Y2hNb2RlfSIgaW1tZWRpYXRlPSJ0cnVlIi8+DQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmNmIwNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczpjPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dHZhbC9kZW1vL2NvbXBvbmVudHMiDQotICAgICAgICA+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotDQotICAgICAgICA8Yzp1c2VyRm9ybSBiZWFuPSIje3JlZ2lzdHJhdGlvblBhZ2V9Ii8+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJzYXZlIiBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS5maW5pc2h9Ii8+DQotDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9wb20ueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMwODE1My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBmZWF0dXJlLXNldCAwMjwvbmFtZT4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5oaWJlcm5hdGU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGliZXJuYXRlLXZhbGlkYXRvcjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj40LjAuMC5HQTwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS40LjI8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjQuMjwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uZmFjZWxldHM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWZhY2VsZXRzPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xNDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPCEtLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICAtLT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2NvbnN0cmFpbnRzL0JpcnRoZGF5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2NvbnN0cmFpbnRzL0JpcnRoZGF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYjFlMzcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9jb25zdHJhaW50cy9CaXJ0aGRheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uY29uc3RyYWludHM7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5QYXN0Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkFOTk9UQVRJT05fVFlQRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLQ0KLUBQYXN0DQotQE5vdE51bGwNCi0NCi1AQ29uc3RyYWludCh2YWxpZGF0ZWRCeSA9IHt9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBBTk5PVEFUSU9OX1RZUEV9KQ0KLXB1YmxpYyBAaW50ZXJmYWNlIEJpcnRoZGF5DQotew0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJubyB2YWxpZCBiaXJ0aGRheSI7DQotDQotICAgIHB1YmxpYyBhYnN0cmFjdCBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQge307DQotDQotICAgIHB1YmxpYyBhYnN0cmFjdCBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9jb25zdHJhaW50cy9OYW1lLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2NvbnN0cmFpbnRzL05hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkyMDBmOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2NvbnN0cmFpbnRzL05hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmNvbnN0cmFpbnRzOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uT3ZlcnJpZGVzQXR0cmlidXRlOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuQU5OT1RBVElPTl9UWVBFOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotDQotQE5vdE51bGwNCi1AU2l6ZShtaW4gPSAyKQ0KLQ0KLUBDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0ge30pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBUYXJnZXQoe01FVEhPRCwgRklFTEQsIEFOTk9UQVRJT05fVFlQRX0pDQotcHVibGljIEBpbnRlcmZhY2UgTmFtZQ0KLXsNCi0gICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJpbnZhbGlkIG5hbWUiOyAvL25vdCB1c2VkDQotDQotICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307DQotDQotICAgIEBPdmVycmlkZXNBdHRyaWJ1dGUoY29uc3RyYWludCA9IFNpemUuY2xhc3MsIG5hbWUgPSAibWF4IikNCi0gICAgaW50IG1heExlbmd0aCgpIGRlZmF1bHQgMjA7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MDczY2UuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5jb25zdHJhaW50cy5OYW1lOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5jb25zdHJhaW50cy5CaXJ0aGRheTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuUGFzdDsNCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotcHVibGljIGNsYXNzIFBlcnNvbg0KLXsNCi0gICAgQE5hbWUobWF4TGVuZ3RoID0gMzApDQotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsNCi0NCi0gICAgQE5hbWUobWF4TGVuZ3RoID0gMzApDQotICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOw0KLQ0KLSAgICBAU2l6ZShtaW4gPSAyLCBtYXggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7DQotDQotICAgIEBCaXJ0aGRheQ0KLSAgICBwcml2YXRlIERhdGUgYmlydGhkYXk7DQotDQotICAgIEBQYXN0DQotICAgIHByaXZhdGUgRGF0ZSBmaW5hbEV4YW07DQotDQotICAgIEBOb3ROdWxsDQotICAgIHByaXZhdGUgU3RyaW5nIG5pY2tOYW1lOw0KLQ0KLSAgICBAU2l6ZShtaW4gPSA2LCBtYXggPSA2MCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW1haWw7DQotDQotICAgIEBOb3ROdWxsDQotICAgIHByaXZhdGUgaW50IG51bWJlck9mU2libGluZ3M7DQotDQotICAgIEBTaXplKG1pbiA9IDIsIG1heCA9IDEwKQ0KLSAgICBwcml2YXRlIFN0cmluZyByb2xlID0gInVzZXIiOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbGFzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJvbGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcm9sZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRSb2xlKFN0cmluZyByb2xlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnJvbGUgPSByb2xlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldEJpcnRoZGF5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGJpcnRoZGF5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEJpcnRoZGF5KERhdGUgYmlydGhkYXkpDQotICAgIHsNCi0gICAgICAgIHRoaXMuYmlydGhkYXkgPSBiaXJ0aGRheTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXRGaW5hbEV4YW0oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmluYWxFeGFtOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEZpbmFsRXhhbShEYXRlIGZpbmFsRXhhbSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maW5hbEV4YW0gPSBmaW5hbEV4YW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROaWNrTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuaWNrTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROaWNrTmFtZShTdHJpbmcgbmlja05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmlja05hbWUgPSBuaWNrTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVtYWlsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKFN0cmluZyBlbWFpbCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5lbWFpbCA9IGVtYWlsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZTaWJsaW5ncygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBudW1iZXJPZlNpYmxpbmdzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlck9mU2libGluZ3MoaW50IG51bWJlck9mU2libGluZ3MpDQotICAgIHsNCi0gICAgICAgIHRoaXMubnVtYmVyT2ZTaWJsaW5ncyA9IG51bWJlck9mU2libGluZ3M7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDIwZjk0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmd1aS5iZWFuczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluLlBlcnNvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwucGF5bG9hZC5EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOw0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25QYWdlDQotew0KLSAgICBATm90TnVsbChwYXlsb2FkID0gRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsNCi0NCi0gICAgQE5vdE51bGwocGF5bG9hZCA9IFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MpDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkUmVwZWF0ZWQ7DQotDQotICAgIHByaXZhdGUgUGVyc29uIHBlcnNvbjsNCi0NCi0gICAgcHVibGljIFN0cmluZyBmaW5pc2goKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXRQYXNzd29yZCh0aGlzLnBhc3N3b3JkKTsNCi0gICAgICAgIHJldHVybiAiaG9tZSI7DQotICAgIH0NCi0NCi0gICAgQFNpemUobWluID0gNiwgbWF4ID0gNjApDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5wZXJzb24uZ2V0RW1haWwoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbWFpbChTdHJpbmcgZW1haWwpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldEVtYWlsKGVtYWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBATm90TnVsbA0KLSAgICBwdWJsaWMgaW50IGdldE51bWJlck9mU2libGluZ3MoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5wZXJzb24uZ2V0TnVtYmVyT2ZTaWJsaW5ncygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlck9mU2libGluZ3MoaW50IG51bWJlck9mU2libGluZ3MpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldE51bWJlck9mU2libGluZ3MobnVtYmVyT2ZTaWJsaW5ncyk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmRSZXBlYXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZFJlcGVhdGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkUmVwZWF0ZWQoU3RyaW5nIHBhc3N3b3JkUmVwZWF0ZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmRSZXBlYXRlZCA9IHBhc3N3b3JkUmVwZWF0ZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBlcnNvbiBnZXRQZXJzb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGVyc29uOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNvbihQZXJzb24gcGVyc29uKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbiA9IHBlcnNvbjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMTg5M2MuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIgotICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjIiPgotICAgIDxhcHBsaWNhdGlvbj4KLSAgICAgICAgPCEtLSB0cmluaWRhZCAtLT4KLSAgICAgICAgPGRlZmF1bHQtcmVuZGVyLWtpdC1pZD4KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb3JlCi0gICAgICAgIDwvZGVmYXVsdC1yZW5kZXIta2l0LWlkPgotCi0gICAgPC9hcHBsaWNhdGlvbj4KLQotICAgIDxtYW5hZ2VkLWJlYW4+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tbmFtZT5yZWdpc3RyYXRpb25QYWdlPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5ndWkuYmVhbnMuUmVnaXN0cmF0aW9uUGFnZTwvbWFuYWdlZC1iZWFuLWNsYXNzPgotICAgICAgICA8bWFuYWdlZC1iZWFuLXNjb3BlPnJlcXVlc3Q8L21hbmFnZWQtYmVhbi1zY29wZT4KLQotICAgICAgICA8bWFuYWdlZC1wcm9wZXJ0eT4KLSAgICAgICAgICAgIDxwcm9wZXJ0eS1uYW1lPnBlcnNvbjwvcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDx2YWx1ZT4je3BlcnNvbn08L3ZhbHVlPgotICAgICAgICA8L21hbmFnZWQtcHJvcGVydHk+Ci0gICAgPC9tYW5hZ2VkLWJlYW4+Ci0KLSAgICA8bWFuYWdlZC1iZWFuPgotICAgICAgICA8bWFuYWdlZC1iZWFuLW5hbWU+cGVyc29uPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5kb21haW4uUGVyc29uPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tc2NvcGU+c2Vzc2lvbjwvbWFuYWdlZC1iZWFuLXNjb3BlPgotICAgIDwvbWFuYWdlZC1iZWFuPgotCi0gICAgPG5hdmlnYXRpb24tcnVsZT4KLSAgICAgICAgPGZyb20tdmlldy1pZD4vcGFnZXMvaG9tZS54aHRtbDwvZnJvbS12aWV3LWlkPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5hZGRVc2VyPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICA8L25hdmlnYXRpb24tcnVsZT4KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8ZnJvbS12aWV3LWlkPio8L2Zyb20tdmlldy1pZD4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+aG9tZTwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL2hvbWUueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgIDwvbmF2aWdhdGlvbi1ydWxlPgotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzM5MzY2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIGZhY2VsZXQtdGFnbGliIFBVQkxJQwotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEZhY2VsZXQgVGFnbGliIDEuMC8vRU4iCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9mYWNlbGV0LXRhZ2xpYl8xXzAuZHRkIj4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZmFjZWxldC10YWdsaWI+Ci0gICAgPG5hbWVzcGFjZT5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dHZhbC9kZW1vL2NvbXBvbmVudHM8L25hbWVzcGFjZT4KLQotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT51c2VyRm9ybTwvdGFnLW5hbWU+Ci0gICAgICAgIDxzb3VyY2U+Ci0gICAgICAgICAgICAuLi9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbAotICAgICAgICA8L3NvdXJjZT4KLSAgICA8L3RhZz4KLQotPC9mYWNlbGV0LXRhZ2xpYj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjMDFhYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCi0gICAgICAgICB2ZXJzaW9uPSIyLjQiPgotCi0gICAgPGRlc2NyaXB0aW9uPk15UHJvamVjdCB3ZWIueG1sPC9kZXNjcmlwdGlvbj4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5ERUZBVUxUX1NVRkZJWDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi54aHRtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmZhY2VsZXRzLkxJQlJBUklFUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi9XRUItSU5GL21haW4udGFnbGliLnhtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5FTkFCTEVfTElHSFRXRUlHSFRfRElBTE9HUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRElTQUJMRV9DT05URU5UX0NPTVBSRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5BTFRFUk5BVEVfVklFV19IQU5ETEVSPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y29tLnN1bi5mYWNlbGV0cy5GYWNlbGV0Vmlld0hhbmRsZXI8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuVVNFX0FQUExJQ0FUSU9OX1ZJRVdfQ0FDSEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5DSEFOR0VfUEVSU0lTVEVOQ0U8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5zZXNzaW9uPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBTZWUgSlNGIFNwZWNpZmljYXRpb24gMi41LjMKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNsaWVudDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5OVU1CRVJfT0ZfVklFV1NfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPjIwPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzdGF0ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbSBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uCi0gICAgICAgICAgICBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KSBhbmQgaWYKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgY29tcHJlc3NlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUKLSAgICAgICAgICAgIHJlbmRlcmVkIEhUTUwgb3V0cHV0LgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgbm90IGFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFMTE9XX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5ERVRFQ1RfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCByZW5kZXJlZCBIVE1MIGNvZGUgd2lsbCBiZSBmb3JtYXR0ZWQsIHNvIHRoYXQgaXQgaXMgImh1bWFuIHJlYWRhYmxlIi4KLSAgICAgICAgICAgIGkuZS4gYWRkaXRpb25hbCBsaW5lIHNlcGFyYXRvcnMgYW5kIHdoaXRlc3BhY2Ugd2lsbCBiZSB3cml0dGVuLCB0aGF0IGRvIG5vdAotICAgICAgICAgICAgaW5mbHVlbmNlIHRoZSBIVE1MIGNvZGUuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlBSRVRUWV9IVE1MPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlCi0gICAgICAgICAgICBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuIENvbnZlbmllbnQgZmVhdHVyZSBpZiB5b3UgaGF2ZSBwYWdlcwotICAgICAgICAgICAgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGJyb3dzZXIgcGFnZSB0byBhbHdheXMganVtcCB0byB0aGUgdG9wCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuCi0gICAgICAgICAgICBEZWZhdWx0OiAiZmFsc2UiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BVVRPX1NDUk9MTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQotICAgICAgICAgICAgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucwotICAgICAgICAgICAgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IgZGlmZmVuZW50IGVuY3J5cHRpb24gc3RyZW5ndGhzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VDUkVUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+TnpZMU5ETXlNVEE9PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmFsaWRhdGUgbWFuYWdlZCBiZWFucywgbmF2aWdhdGlvbiBydWxlcyBhbmQgZW5zdXJlIHRoYXQgZm9ybXMgYXJlIG5vdCBuZXN0ZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDwhLS0gTGlzdGVuZXIsIHRvIGFsbG93IEpldHR5IHNlcnZpbmcgTXlGYWNlcyBhcHBzIC0tPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy53ZWJhcHAuU3RhcnR1cFNlcnZsZXRDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLndlYmFwcC5SZXNvdXJjZVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPGZpbHRlcj4KLSAgICAgICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlRyaW5pZGFkRmlsdGVyPC9maWx0ZXItY2xhc3M+Ci0gICAgPC9maWx0ZXI+Ci0KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT50cmluaWRhZDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZ3MgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4vZmFjZXMvKjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPnJlc291cmNlczwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+L2FkZi8qPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg0ZDY0OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiCi0gICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIgotICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIKLSAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIgotICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPgotCi08dWk6Y29tcG9zaXRpb24+Ci0gICAgPHRyOnBhbmVsRm9ybUxheW91dD4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJuaWNrIG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uWyAnbmlja05hbWUnIF19Ii8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9ImUtbWFpbCIgdmFsdWU9IiN7YmVhbi5lbWFpbH0iLz4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJmaXJzdCBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5maXJzdE5hbWV9Ii8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Imxhc3QgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb24ubGFzdE5hbWV9Ii8+Ci0gICAgICAgIDx0cjppbnB1dERhdGUgbGFiZWw9ImJpcnRoZGF5IiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5iaXJ0aGRheX0iPgotICAgICAgICAgICAgPHRyOmNvbnZlcnREYXRlVGltZSB0eXBlPSJkYXRlIiBwYXR0ZXJuPSJkZC5NTS55eXl5Ii8+Ci0gICAgICAgIDwvdHI6aW5wdXREYXRlPgotICAgICAgICA8dHI6aW5wdXREYXRlIGxhYmVsPSJmaW5hbCBleGFtIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5maW5hbEV4YW19Ij4KLSAgICAgICAgICAgIDx0cjpjb252ZXJ0RGF0ZVRpbWUgdHlwZT0iZGF0ZSIgcGF0dGVybj0iZGQuTU0ueXl5eSIvPgotICAgICAgICA8L3RyOmlucHV0RGF0ZT4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJudW1iZXIgb2Ygc2libGluZ3MiIHZhbHVlPSIje2JlYW4ubnVtYmVyT2ZTaWJsaW5nc30iLz4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJwYXNzd29yZCIgdmFsdWU9IiN7YmVhbi5wYXNzd29yZH0iIHNlY3JldD0idHJ1ZSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJyZS1lbnRlciBwYXNzd29yZCIgdmFsdWU9IiN7YmVhbi5wYXNzd29yZFJlcGVhdGVkfSIgc2VjcmV0PSJ0cnVlIi8+Ci0KLSAgICA8L3RyOnBhbmVsRm9ybUxheW91dD4KLTwvdWk6Y29tcG9zaXRpb24+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWNkMTQ4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotICAgICAgICANCi08aHRtbD4NCi0NCi08aGVhZD4NCi0gICAgPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDsgVVJMPWZhY2VzL3BhZ2VzL2hvbWUueGh0bWwiPg0KLTwvaGVhZD4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYzFlYTguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTx0cjpkb2N1bWVudA0KLSAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIg0KLSAgICAgICAgeG1sbnM6Yz0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3RsL2NvcmUiPg0KLSAgICA8ZjpmYWNldCBuYW1lPSJtZXRhQ29udGFpbmVyIj4NCi0gICAgICAgIDx0aXRsZT5zZXYtZW4gZmVhdHVyZS1zZXQgZGVtbyAwMTwvdGl0bGU+DQotICAgIDwvZjpmYWNldD4NCi0NCi0gICAgPHRyaDpib2R5Pg0KLQ0KLSAgICAgICAgPCEtLSBvcmlnaW5hbCAtLT4NCi0gICAgICAgIDxkaXYgaWQ9IndyYXAiPg0KLQ0KLSAgICAgICAgICAgIDx0cjpmb3JtIGlkPSJmb3JtIiBkZWZhdWx0Q29tbWFuZD0iZGVmYXVsdEJ1dHRvbiI+DQotICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1haW4iPg0KLSAgICAgICAgICAgICAgICAgICAgPHVpOmluc2VydCBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ1bmRlcl9jb25zdHJ1Y3Rpb24iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+IXNpdGUgdW5kZXIgY29uc3RydWN0aW9uITwvaDI+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBjb250ZW50IG9mIHRoaXMgc2l0ZSBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSBtb21lbnQuPC9wPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC91aTppbnNlcnQ+DQotICAgICAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICAgIDwvdHI6Zm9ybT4NCi0gICAgICAgICAgICA8dHI6bWVzc2FnZXMgZ2xvYmFsT25seT0idHJ1ZSIvPg0KLQ0KLSAgICAgICAgPC9kaXY+DQotICAgIDwvdHJoOmJvZHk+DQotDQotDQotPC90cjpkb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTdiMTUzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9ImFkZCB1c2VyIiBhY3Rpb249ImFkZFVzZXIiLz48YnIvPg0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZjZiMDYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6Yz0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHR2YWwvZGVtby9jb21wb25lbnRzIg0KLSAgICAgICAgPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgPGM6dXNlckZvcm0gYmVhbj0iI3tyZWdpc3RyYXRpb25QYWdlfSIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UuZmluaXNofSIvPg0KLQ0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3NjU2Zi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIGhlbGxvIGJlYW4tdmFsaWRhdGlvbjwvbmFtZT4NCi0gICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qc3RsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzdGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5oaWJlcm5hdGU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGliZXJuYXRlLXZhbGlkYXRvcjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj40LjAuMC5HQTwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS40LjI8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjQuMjwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDIzZGI1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLmRvbWFpbi5QZXJzb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb24uZ3JvdXAuQWRtaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb24uZ3JvdXAuVXNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cC5BZGRyZXNzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uQmVhblZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247Ci0KLS8qKgotICogQSB0eXBpY2FsIHNpbXBsZSBiYWNraW5nIGJlYW4sIHRoYXQgaXMgYmFja2VkIHRvIDxjb2RlPmhlbGxvd29ybGQuanNwPC9jb2RlPgotICovCi0KLS8vaW4gY2FzZSBvZiBkZWFjdGl2YXRlZCBkZWZhdWx0IHZhbGlkYXRpb24KLUBCZWFuVmFsaWRhdGlvbgotcHVibGljIGNsYXNzIEhlbGxvV29ybGRDb250cm9sbGVyCi17Ci0gICAgLy9AQmVhblZhbGlkYXRpb24odmlld0lkcyA9ICIvZm9ybTEuanNwIikKLSAgICBwcml2YXRlIFBlcnNvbiBwZXJzb24gPSBuZXcgUGVyc29uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBkZWZhdWx0IGVtcHR5IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIEhlbGxvV29ybGRDb250cm9sbGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHRoYXQgaXMgYmFja2VkIHRvIGEgc3VibWl0IGJ1dHRvbiBvZiBhIGZvcm0uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBzZW5kKCkKLSAgICB7Ci0gICAgICAgIC8vZG8gcmVhbCBsb2dpYywgcmV0dXJuIGEgc3RyaW5nIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgdGhlIG5hdmlnYXRpb24gc3lzdGVtIG9mIEpTRgotICAgICAgICByZXR1cm4gInN1Y2Nlc3MiOwotICAgIH0KLQotICAgIEBCZWFuVmFsaWRhdGlvbi5MaXN0KHsKLSAgICAgICAgICAgIEBCZWFuVmFsaWRhdGlvbih2aWV3SWRzID0gIi9oZWxsb1dvcmxkLmpzcCIpLAotICAgICAgICAgICAgQEJlYW5WYWxpZGF0aW9uKHZpZXdJZHMgPSAiL2Zvcm0xLmpzcCIsIHVzZUdyb3VwcyA9IFVzZXIuY2xhc3MpLAotICAgICAgICAgICAgQEJlYW5WYWxpZGF0aW9uKHZpZXdJZHMgPSAiL2Zvcm0yLmpzcCIsIHVzZUdyb3VwcyA9IEFkbWluLmNsYXNzKSwKLSAgICAgICAgICAgIEBCZWFuVmFsaWRhdGlvbih2aWV3SWRzID0gIi92aW9sYXRpb24uanNwIiwgdXNlR3JvdXBzID0gQWRtaW4uY2xhc3MpLAotICAgICAgICAgICAgQEJlYW5WYWxpZGF0aW9uKHZpZXdJZHMgPSAiL3Zpb2xhdGlvbi5qc3AiLCB1c2VHcm91cHMgPSBBZGRyZXNzLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb24gPSBATW9kZWxWYWxpZGF0aW9uKGlzQWN0aXZlID0gdHJ1ZSkpCi0gICAgfSkKLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpCi0gICAgewotICAgICAgICByZXR1cm4gcGVyc29uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNvbihQZXJzb24gcGVyc29uKQotICAgIHsKLSAgICAgICAgdGhpcy5wZXJzb24gPSBwZXJzb247Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvZG9tYWluL1BlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjIwYjFiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb24uZ3JvdXAuQWRtaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb24uZ3JvdXAuVXNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cC5BZGRyZXNzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOwotCi1wdWJsaWMgY2xhc3MgUGVyc29uCi17Ci0gICAgLy9oZWxsbyB3b3JsZCBkZW1vCi0gICAgQFJlcXVpcmVkCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOwotCi0gICAgLy9kZW1vIGZvciBiZWFuIHZhbGlkYXRpb24gYmFzZWQgdmFsaWRhdGlvbiBzdXBwb3J0Ci0gICAgQE5vdE51bGwKLSAgICBAU2l6ZS5MaXN0KHsKLSAgICAgICAgICAgIEBTaXplKG1pbiA9IDMsIG1heCA9IDYsIGdyb3VwcyA9IFVzZXIuY2xhc3MpLAotICAgICAgICAgICAgQFNpemUobWluID0gMywgbWF4ID0gMTIsIGdyb3VwcyA9IEFkbWluLmNsYXNzKQotICAgIH0pCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7Ci0KLSAgICBATm90TnVsbChncm91cHMgPSBBZGRyZXNzLmNsYXNzLCBtZXNzYWdlID0gInN0cmVldCBpcyByZXF1aXJlZCIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3RyZWV0OwotICAgIEBOb3ROdWxsKGdyb3VwcyA9IEFkZHJlc3MuY2xhc3MsIG1lc3NhZ2UgPSAiemlwIGlzIHJlcXVpcmVkIikKLSAgICBwcml2YXRlIFN0cmluZyB6aXA7Ci0gICAgQE5vdE51bGwoZ3JvdXBzID0gQWRkcmVzcy5jbGFzcywgbWVzc2FnZSA9ICJjaXR5IGlzIHJlcXVpcmVkIikKLSAgICBwcml2YXRlIFN0cmluZyBjaXR5OwotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGxhc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmVldCgpCi0gICAgewotICAgICAgICByZXR1cm4gc3RyZWV0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN0cmVldChTdHJpbmcgc3RyZWV0KQotICAgIHsKLSAgICAgICAgdGhpcy5zdHJlZXQgPSBzdHJlZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRaaXAoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHppcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRaaXAoU3RyaW5nIHppcCkKLSAgICB7Ci0gICAgICAgIHRoaXMuemlwID0gemlwOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2l0eSgpCi0gICAgewotICAgICAgICByZXR1cm4gY2l0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDaXR5KFN0cmluZyBjaXR5KQotICAgIHsKLSAgICAgICAgdGhpcy5jaXR5ID0gY2l0eTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9BZGRyZXNzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9BZGRyZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YzI4ZjYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvQWRkcmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb24uZ3JvdXA7DQotDQotcHVibGljIGludGVyZmFjZSBBZGRyZXNzDQotew0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9BZG1pbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvQWRtaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EyNWZkMC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9BZG1pbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb24uZ3JvdXA7DQotDQotcHVibGljIGludGVyZmFjZSBBZG1pbg0KLXsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvVXNlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvVXNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmY4ZGQ1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL2dyb3VwL1VzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay52YWxpZGF0aW9uLmdyb3VwOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgVXNlcg0KLXsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5MzBjNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGZhY2VzLWNvbmZpZyB2ZXJzaW9uPSIxLjIiIAotICAgIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIj4KLQkKLQk8IS0tIG1hbmFnZWQgYmVhbnMgb2YgdGhlIHNpbXBsZSBoZWxsbyB3b3JsZCBhcHAgLS0+Ci0JPG1hbmFnZWQtYmVhbj4KLQkJPG1hbmFnZWQtYmVhbi1uYW1lPmhlbGxvV29ybGQ8L21hbmFnZWQtYmVhbi1uYW1lPgotCQk8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5IZWxsb1dvcmxkQ29udHJvbGxlcjwvbWFuYWdlZC1iZWFuLWNsYXNzPgotCQk8bWFuYWdlZC1iZWFuLXNjb3BlPnJlcXVlc3Q8L21hbmFnZWQtYmVhbi1zY29wZT4KLQk8L21hbmFnZWQtYmVhbj4KLQkKLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIGhlbGxvV29ybGQuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+KjwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5zdWNjZXNzPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vcmVzdWx0LmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0JCi0JPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciByZXN1bHQuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L3Jlc3VsdC5qc3A8L2Zyb20tdmlldy1pZD4KLQkJPG5hdmlnYXRpb24tY2FzZT4KLQkJCTxmcm9tLW91dGNvbWU+YmFjazwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L2hlbGxvV29ybGQuanNwPC90by12aWV3LWlkPgotCQk8L25hdmlnYXRpb24tY2FzZT4KLQk8L25hdmlnYXRpb24tcnVsZT4KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNGExODMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLSAgICAgICAgIHZlcnNpb249IjIuNCI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+TXlQcm9qZWN0IHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0gICAgPCEtLW9wdGlvbmFsOiBjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgVVJJcyBvZiAoYWRkaXRpb25hbCkgZmFjZXMgY29uZmlnIGZpbGVzLgotICAgICAgICAgICAgKGUuZy4gL1dFQi1JTkYvbXktY29uZmlnLnhtbCkKLSAgICAgICAgICAgIFNlZSBKU0YgMS4wIFBSRDIsIDEwLjMuMgotICAgICAgICAgICAgQXR0ZW50aW9uOiBZb3UgZG8gbm90IG5lZWQgdG8gcHV0IC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgaW4gaGVyZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuQ09ORklHX0ZJTEVTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L1dFQi1JTkYvZXhhbXBsZXMtY29uZmlnLnhtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtLS0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5TdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNsaWVudDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLk5VTUJFUl9PRl9WSUVXU19JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkgYW5kIGlmCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04gaXMgdHJ1ZSAoPSBkZWZhdWx0KQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4gSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUKLSAgICAgICAgICAgIHJlbmRlcmVkIEhUTUwgb3V0cHV0LgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgbm90IGFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLgotICAgICAgICAgICAgaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90Ci0gICAgICAgICAgICBpbmZsdWVuY2UgdGhlIEhUTUwgY29kZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIGEgamF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRoYXQgaXMgYWJsZSB0byByZXN0b3JlIHRoZQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMKLSAgICAgICAgICAgIHdpdGggbG9uZyBsaXN0cyBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcAotICAgICAgICAgICAgaWYgeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZSBwYWdlLgotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BVVRPX1NDUk9MTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQotICAgICAgICAgICAgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucwotICAgICAgICAgICAgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IgZGlmZmVuZW50IGVuY3J5cHRpb24gc3RyZW5ndGhzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VDUkVUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+TnpZMU5ETXlNVEE9PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmFsaWRhdGUgbWFuYWdlZCBiZWFucywgbmF2aWdhdGlvbiBydWxlcyBhbmQgZW5zdXJlIHRoYXQgZm9ybXMgYXJlIG5vdCBuZXN0ZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVHJlYXQgcmVhZG9ubHkgc2FtZSBhcyBpZiBkaXNhYmxlZCBhdHRyaWJ1dGUgd2FzIHNldCBmb3Igc2VsZWN0IGVsZW1lbnRzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUkVBRE9OTFlfQVNfRElTQUJMRURfRk9SX1NFTEVDVFM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBVc2UgdGhlIGRlZmluZWQgY2xhc3MgYXMgdGhlIGNsYXNzIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSByZXNvdXJjZSBpcyBhZGRlZCB0byB0aGUKLSAgICAgICAgICAgIEV4dGVuc2lvbkZpbHRlciBoYW5kbGluZy4gVXNpbmcgU3RyZWFtaW5nQWRkUmVzb3VyY2UgaGVyZSBoZWxwcyB3aXRoIHBlcmZvcm1hbmNlLiBJZiB5b3Ugd2FudCB0byBhZGQKLSAgICAgICAgICAgIGN1c3RvbSBjb21wb25lbnRzIGFuZCB3YW50IHRvIHVzZSB0aGUgRXh0ZW5zaW9uRmlsdGVyLCB5b3UgbmVlZCB0byBwcm92aWRlIHlvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIGhlcmUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BRERfUkVTT1VSQ0VfQ0xBU1M8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwudXRpbC5EZWZhdWx0QWRkUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgICAgIAotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZpcnR1YWwgcGF0aCBpbiB0aGUgVVJMIHdoaWNoIHRyaWdnZXJzIGxvYWRpbmcgb2YgcmVzb3VyY2VzIGZvciB0aGUgTXlGYWNlcyBleHRlbmRlZCBjb21wb25lbnRzCi0gICAgICAgICAgICBpbiB0aGUgRXh0ZW5zaW9uRmlsdGVyLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUkVTT1VSQ0VfVklSVFVBTF9QQVRIPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L2ZhY2VzL215RmFjZXNFeHRlbnNpb25SZXNvdXJjZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBDaGVjayBpZiB0aGUgZXh0ZW5zaW9ucy1maWx0ZXIgaGFzIGJlZW4gcHJvcGVybHkgY29uZmlndXJlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNIRUNLX0VYVEVOU0lPTlNfRklMVEVSPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBEZWZpbmUgcGFydGlhbCBzdGF0ZSBzYXZpbmcgYXMgdHJ1ZS9mYWxzZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuUEFSVElBTF9TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0KLSAgICA8IS0tIExpc3RlbmVyLCB0byBhbGxvdyBKZXR0eSBzZXJ2aW5nIE15RmFjZXMgYXBwcyAtLT4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMud2ViYXBwLlN0YXJ0dXBTZXJ2bGV0Q29udGV4dExpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IC0tPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmcgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4qLmpzZjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4LmpzcDwvd2VsY29tZS1maWxlPgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2Zvcm0xLmpzcCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvZm9ybTEuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWQ2MTcwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvZm9ybTEuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgICA8Zjp2aWV3PgotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPgotICAgICAgICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMyI+Ci0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJmaXJzdF9uYW1lIiB2YWx1ZT0iRmlyc3QgbmFtZToiLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9ImZpcnN0X25hbWUiIGxhYmVsPSJGaXJzdCBuYW1lIiB2YWx1ZT0iI3toZWxsb1dvcmxkWydwZXJzb24nXS5maXJzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9ImZpcnN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIvPgotCi0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJsYXN0X25hbWUiIHZhbHVlPSJMYXN0IG5hbWU6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJsYXN0X25hbWUiIGxhYmVsPSJMYXN0IG5hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJsYXN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIvPgotCi0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiB2YWx1ZT0iUHJlc3MgbWUiIGFjdGlvbj0iI3toZWxsb1dvcmxkLnNlbmR9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+Ci0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+Ci0gICAgICAgICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0gICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgICAgIDxoOm1lc3NhZ2VzIGdsb2JhbE9ubHk9InRydWUiIHNob3dEZXRhaWw9InRydWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIvPgotICAgICAgICA8L2Y6dmlldz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2Zvcm0yLmpzcCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvZm9ybTIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWQ2MTcwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvZm9ybTIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgICA8Zjp2aWV3PgotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPgotICAgICAgICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMyI+Ci0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJmaXJzdF9uYW1lIiB2YWx1ZT0iRmlyc3QgbmFtZToiLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9ImZpcnN0X25hbWUiIGxhYmVsPSJGaXJzdCBuYW1lIiB2YWx1ZT0iI3toZWxsb1dvcmxkWydwZXJzb24nXS5maXJzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9ImZpcnN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIvPgotCi0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJsYXN0X25hbWUiIHZhbHVlPSJMYXN0IG5hbWU6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJsYXN0X25hbWUiIGxhYmVsPSJMYXN0IG5hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJsYXN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIvPgotCi0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiB2YWx1ZT0iUHJlc3MgbWUiIGFjdGlvbj0iI3toZWxsb1dvcmxkLnNlbmR9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+Ci0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+Ci0gICAgICAgICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0gICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgICAgIDxoOm1lc3NhZ2VzIGdsb2JhbE9ubHk9InRydWUiIHNob3dEZXRhaWw9InRydWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIvPgotICAgICAgICA8L2Y6dmlldz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNlMTBiMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgICA8Zjp2aWV3PgotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPgotICAgICAgICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMyI+Ci0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJmaXJzdF9uYW1lIiB2YWx1ZT0iRmlyc3QgbmFtZToiLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9ImZpcnN0X25hbWUiIGxhYmVsPSJGaXJzdCBuYW1lIiB2YWx1ZT0iI3toZWxsb1dvcmxkLnBlcnNvbi5maXJzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9ImZpcnN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIvPgotCi0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJsYXN0X25hbWUiIHZhbHVlPSJMYXN0IG5hbWU6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJsYXN0X25hbWUiIGxhYmVsPSJMYXN0IG5hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJsYXN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIvPgotCi0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiB2YWx1ZT0iUHJlc3MgbWUiIGFjdGlvbj0iI3toZWxsb1dvcmxkLnNlbmR9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+Ci0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+Ci0gICAgICAgICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0gICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgPC9mOnZpZXc+Ci0gICAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ4MmQ1My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTwlLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tJT4KLQotPCVAIHBhZ2Ugc2Vzc2lvbj0iZmFsc2UiJT4KLTwlCi1yZXNwb25zZS5zZW5kUmVkaXJlY3QoImhlbGxvV29ybGQuanNmIik7Ci0lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvcmVzdWx0LmpzcCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvcmVzdWx0LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1NzcwOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL3Jlc3VsdC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgICAgPGgyPjxoOm91dHB1dFRleHQgdmFsdWU9IkhlbGxvICN7aGVsbG9Xb3JsZC5wZXJzb24uZmlyc3ROYW1lfSAje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfS4gV2UgaG9wZSB5b3UgZW5qb3kgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IhIi8+PC9oMj4KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kTGluayBhY3Rpb249ImJhY2siPgotICAgICAgICAgICAgICAgICAgICA8aDpvdXRwdXRUZXh0IHZhbHVlPSJIb21lIi8+Ci0gICAgICAgICAgICAgICAgPC9oOmNvbW1hbmRMaW5rPgotICAgICAgICAgICAgPC9oOmZvcm0+Ci0gICAgICAgICAgICA8aDptZXNzYWdlcyBnbG9iYWxPbmx5PSJ0cnVlIiBzaG93RGV0YWlsPSJ0cnVlIiBzaG93U3VtbWFyeT0iZmFsc2UiLz4KLSAgICAgICAgPC9mOnZpZXc+Ci0gICAgPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvdmlvbGF0aW9uLmpzcCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvdmlvbGF0aW9uLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkNjE3MC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL3Zpb2xhdGlvbi5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIzIj4KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9ImZpcnN0X25hbWUiIHZhbHVlPSJGaXJzdCBuYW1lOiIvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0iZmlyc3RfbmFtZSIgbGFiZWw9IkZpcnN0IG5hbWUiIHZhbHVlPSIje2hlbGxvV29ybGRbJ3BlcnNvbiddLmZpcnN0TmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0iZmlyc3RfbmFtZSIgc2hvd1N1bW1hcnk9InRydWUiIHNob3dEZXRhaWw9ImZhbHNlIi8+Ci0KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9Imxhc3RfbmFtZSIgdmFsdWU9Ikxhc3QgbmFtZToiLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9Imxhc3RfbmFtZSIgbGFiZWw9Ikxhc3QgbmFtZSIgdmFsdWU9IiN7aGVsbG9Xb3JsZC5wZXJzb24ubGFzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9Imxhc3RfbmFtZSIgc2hvd1N1bW1hcnk9InRydWUiIHNob3dEZXRhaWw9ImZhbHNlIi8+Ci0KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJQcmVzcyBtZSIgYWN0aW9uPSIje2hlbGxvV29ybGQuc2VuZH0iLz4KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4KLSAgICAgICAgICAgICAgPC9oOnBhbmVsR3JpZD4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICAgICAgPGg6bWVzc2FnZXMgZ2xvYmFsT25seT0idHJ1ZSIgc2hvd0RldGFpbD0idHJ1ZSIgc2hvd1N1bW1hcnk9ImZhbHNlIi8+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX3dvcmxkL3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjczNWYzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX3dvcmxkL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fd29ybGQ8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgaGVsbG8gd29ybGQ8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIA0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIA0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+anN0bDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3RsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMjwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+ICAgICAgICANCi0NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhZmIzOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLmRvbWFpbi5QZXJzb247Ci0KLS8qKgotICogQSB0eXBpY2FsIHNpbXBsZSBiYWNraW5nIGJlYW4sIHRoYXQgaXMgYmFja2VkIHRvIDxjb2RlPmhlbGxvd29ybGQuanNwPC9jb2RlPgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkQ29udHJvbGxlcgotewotICAgIHByaXZhdGUgUGVyc29uIHBlcnNvbiA9IG5ldyBQZXJzb24oKTsKLQotICAgIC8qKgotICAgICAqIGRlZmF1bHQgZW1wdHkgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgSGVsbG9Xb3JsZENvbnRyb2xsZXIoKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdGhhdCBpcyBiYWNrZWQgdG8gYSBzdWJtaXQgYnV0dG9uIG9mIGEgZm9ybS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHNlbmQoKQotICAgIHsKLSAgICAgICAgLy9kbyByZWFsIGxvZ2ljLCByZXR1cm4gYSBzdHJpbmcgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciB0aGUgbmF2aWdhdGlvbiBzeXN0ZW0gb2YgSlNGCi0gICAgICAgIHJldHVybiAic3VjY2VzcyI7Ci0gICAgfQotCi0gICAgcHVibGljIFBlcnNvbiBnZXRQZXJzb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBlcnNvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzb24oUGVyc29uIHBlcnNvbikKLSAgICB7Ci0gICAgICAgIHRoaXMucGVyc29uID0gcGVyc29uOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZDRhOWUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvZG9tYWluL1BlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLmRvbWFpbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7Ci0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47Ci0KLXB1YmxpYyBjbGFzcyBQZXJzb24KLXsKLSAgICAvL2hlbGxvIHdvcmxkIGRlbW8KLSAgICBAUmVxdWlyZWQKLSAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7Ci0KLSAgICAvL2RlbW8gZm9yIGpwYSBiYXNlZCB2YWxpZGF0aW9uIHN1cHBvcnQKLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwIC8qLi4uKi8pCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbGFzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmJlYWU3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlcy1jb25maWcgdmVyc2lvbj0iMS4yIiAKLSAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIAotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCI+Ci0JCi0JPCEtLSBtYW5hZ2VkIGJlYW5zIG9mIHRoZSBzaW1wbGUgaGVsbG8gd29ybGQgYXBwIC0tPgotCTxtYW5hZ2VkLWJlYW4+Ci0JCTxtYW5hZ2VkLWJlYW4tbmFtZT5oZWxsb1dvcmxkPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLQkJPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuSGVsbG9Xb3JsZENvbnRyb2xsZXI8L21hbmFnZWQtYmVhbi1jbGFzcz4KLQkJPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0JPC9tYW5hZ2VkLWJlYW4+Ci0JCi0JPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciBoZWxsb1dvcmxkLmpzcCAtLT4KLQk8bmF2aWdhdGlvbi1ydWxlPgotCQk8ZnJvbS12aWV3LWlkPi9oZWxsb1dvcmxkLmpzcDwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5zdWNjZXNzPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vcGFnZTIuanNwPC90by12aWV3LWlkPgotCQk8L25hdmlnYXRpb24tY2FzZT4KLQk8L25hdmlnYXRpb24tcnVsZT4KLQkKLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIHBhZ2UyLmpzcCAtLT4KLQk8bmF2aWdhdGlvbi1ydWxlPgotCQk8ZnJvbS12aWV3LWlkPi9wYWdlMi5qc3A8L2Zyb20tdmlldy1pZD4KLQkJPG5hdmlnYXRpb24tY2FzZT4KLQkJCTxmcm9tLW91dGNvbWU+YmFjazwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L2hlbGxvV29ybGQuanNwPC90by12aWV3LWlkPgotCQk8L25hdmlnYXRpb24tY2FzZT4KLQk8L25hdmlnYXRpb24tcnVsZT4KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTRhMTgzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLSAgICAgICAgIHZlcnNpb249IjIuNCI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+TXlQcm9qZWN0IHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0gICAgPCEtLW9wdGlvbmFsOiBjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgVVJJcyBvZiAoYWRkaXRpb25hbCkgZmFjZXMgY29uZmlnIGZpbGVzLgotICAgICAgICAgICAgKGUuZy4gL1dFQi1JTkYvbXktY29uZmlnLnhtbCkKLSAgICAgICAgICAgIFNlZSBKU0YgMS4wIFBSRDIsIDEwLjMuMgotICAgICAgICAgICAgQXR0ZW50aW9uOiBZb3UgZG8gbm90IG5lZWQgdG8gcHV0IC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgaW4gaGVyZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuQ09ORklHX0ZJTEVTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L1dFQi1JTkYvZXhhbXBsZXMtY29uZmlnLnhtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtLS0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5TdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNsaWVudDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLk5VTUJFUl9PRl9WSUVXU19JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkgYW5kIGlmCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04gaXMgdHJ1ZSAoPSBkZWZhdWx0KQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4gSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUKLSAgICAgICAgICAgIHJlbmRlcmVkIEhUTUwgb3V0cHV0LgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgbm90IGFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLgotICAgICAgICAgICAgaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90Ci0gICAgICAgICAgICBpbmZsdWVuY2UgdGhlIEhUTUwgY29kZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIGEgamF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRoYXQgaXMgYWJsZSB0byByZXN0b3JlIHRoZQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMKLSAgICAgICAgICAgIHdpdGggbG9uZyBsaXN0cyBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcAotICAgICAgICAgICAgaWYgeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZSBwYWdlLgotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BVVRPX1NDUk9MTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQotICAgICAgICAgICAgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucwotICAgICAgICAgICAgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IgZGlmZmVuZW50IGVuY3J5cHRpb24gc3RyZW5ndGhzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VDUkVUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+TnpZMU5ETXlNVEE9PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmFsaWRhdGUgbWFuYWdlZCBiZWFucywgbmF2aWdhdGlvbiBydWxlcyBhbmQgZW5zdXJlIHRoYXQgZm9ybXMgYXJlIG5vdCBuZXN0ZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVHJlYXQgcmVhZG9ubHkgc2FtZSBhcyBpZiBkaXNhYmxlZCBhdHRyaWJ1dGUgd2FzIHNldCBmb3Igc2VsZWN0IGVsZW1lbnRzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUkVBRE9OTFlfQVNfRElTQUJMRURfRk9SX1NFTEVDVFM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBVc2UgdGhlIGRlZmluZWQgY2xhc3MgYXMgdGhlIGNsYXNzIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSByZXNvdXJjZSBpcyBhZGRlZCB0byB0aGUKLSAgICAgICAgICAgIEV4dGVuc2lvbkZpbHRlciBoYW5kbGluZy4gVXNpbmcgU3RyZWFtaW5nQWRkUmVzb3VyY2UgaGVyZSBoZWxwcyB3aXRoIHBlcmZvcm1hbmNlLiBJZiB5b3Ugd2FudCB0byBhZGQKLSAgICAgICAgICAgIGN1c3RvbSBjb21wb25lbnRzIGFuZCB3YW50IHRvIHVzZSB0aGUgRXh0ZW5zaW9uRmlsdGVyLCB5b3UgbmVlZCB0byBwcm92aWRlIHlvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIGhlcmUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BRERfUkVTT1VSQ0VfQ0xBU1M8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwudXRpbC5EZWZhdWx0QWRkUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgICAgIAotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZpcnR1YWwgcGF0aCBpbiB0aGUgVVJMIHdoaWNoIHRyaWdnZXJzIGxvYWRpbmcgb2YgcmVzb3VyY2VzIGZvciB0aGUgTXlGYWNlcyBleHRlbmRlZCBjb21wb25lbnRzCi0gICAgICAgICAgICBpbiB0aGUgRXh0ZW5zaW9uRmlsdGVyLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUkVTT1VSQ0VfVklSVFVBTF9QQVRIPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L2ZhY2VzL215RmFjZXNFeHRlbnNpb25SZXNvdXJjZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBDaGVjayBpZiB0aGUgZXh0ZW5zaW9ucy1maWx0ZXIgaGFzIGJlZW4gcHJvcGVybHkgY29uZmlndXJlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNIRUNLX0VYVEVOU0lPTlNfRklMVEVSPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBEZWZpbmUgcGFydGlhbCBzdGF0ZSBzYXZpbmcgYXMgdHJ1ZS9mYWxzZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuUEFSVElBTF9TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0KLSAgICA8IS0tIExpc3RlbmVyLCB0byBhbGxvdyBKZXR0eSBzZXJ2aW5nIE15RmFjZXMgYXBwcyAtLT4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMud2ViYXBwLlN0YXJ0dXBTZXJ2bGV0Q29udGV4dExpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IC0tPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmcgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4qLmpzZjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4LmpzcDwvd2VsY29tZS1maWxlPgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZTEwYjMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgICA8Zjp2aWV3PgotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPgotICAgICAgICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMyI+Ci0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJmaXJzdF9uYW1lIiB2YWx1ZT0iRmlyc3QgbmFtZToiLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9ImZpcnN0X25hbWUiIGxhYmVsPSJGaXJzdCBuYW1lIiB2YWx1ZT0iI3toZWxsb1dvcmxkLnBlcnNvbi5maXJzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9ImZpcnN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIvPgotCi0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJsYXN0X25hbWUiIHZhbHVlPSJMYXN0IG5hbWU6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJsYXN0X25hbWUiIGxhYmVsPSJMYXN0IG5hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJsYXN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIvPgotCi0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiB2YWx1ZT0iUHJlc3MgbWUiIGFjdGlvbj0iI3toZWxsb1dvcmxkLnNlbmR9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+Ci0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+Ci0gICAgICAgICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0gICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgPC9mOnZpZXc+Ci0gICAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ODJkNTMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTwlLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tJT4KLQotPCVAIHBhZ2Ugc2Vzc2lvbj0iZmFsc2UiJT4KLTwlCi1yZXNwb25zZS5zZW5kUmVkaXJlY3QoImhlbGxvV29ybGQuanNmIik7Ci0lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWM4NTIzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgICAgPGgyPjxoOm91dHB1dFRleHQgdmFsdWU9IkhlbGxvICN7aGVsbG9Xb3JsZC5wZXJzb24uZmlyc3ROYW1lfSAje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfS4gV2UgaG9wZSB5b3UgZW5qb3kgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IhIi8+PC9oMj4KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kTGluayBhY3Rpb249ImJhY2siPgotICAgICAgICAgICAgICAgICAgICA8aDpvdXRwdXRUZXh0IHZhbHVlPSJIb21lIi8+Ci0gICAgICAgICAgICAgICAgPC9oOmNvbW1hbmRMaW5rPgotICAgICAgICAgICAgPC9oOmZvcm0+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgIDwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9wb20ueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvZXhhbXBsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUxOGVhNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9leGFtcGxlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgcHJvamVjdDwvbmFtZT4NCi0gICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxzY20+DQotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9leGFtcGxlczwvY29ubmVjdGlvbj4NCi0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9leGFtcGxlczwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4NCi0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2V4YW1wbGVzPC91cmw+DQotICAgIDwvc2NtPg0KLSAgICANCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPCEtLVRoaXMgcGx1Z2luIGFsbG93cyB0byBydW4gdGhlIGV4YW1wbGUgdXNpbmcgbXZuIGpldHR5OnJ1biAtLT4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpldHR5LXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Ni4xLjg8L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+MTA8L3NjYW5JbnRlcnZhbFNlY29uZHM+DQotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi0gICAgPG1vZHVsZXM+DQotICAgICAgICA8bW9kdWxlPmhlbGxvX3dvcmxkPC9tb2R1bGU+DQotICAgICAgICA8IS0tbW9kdWxlPmhlbGxvX2JlYW4tdmFsaWRhdGlvbjwvbW9kdWxlLS0+DQotICAgICAgICA8bW9kdWxlPmZlYXR1cmUtc2V0XzAxPC9tb2R1bGU+DQotICAgICAgICA8IS0tbW9kdWxlPmZlYXR1cmUtc2V0XzAyPC9tb2R1bGUtLT4NCi0gICAgPC9tb2R1bGVzPg0KLQ0KLSAgICA8cHJvZmlsZXM+DQotICAgICAgICA8IS0tIFRoaXMgcHJvZmlsZSBpcyBpbnZva2VkIGJ5IC1EcHJlcGFyZVJlbGVhc2U9dHJ1ZS4gIFRoaXMgYWxsb3dzIG12biByZWxlYXNlOnByZXBhcmUgdG8NCi0gICAgICAgICAgICBydW4gc3VjY2Vzc2Z1bGx5IG9uIHRoZSBhc3NlbWJseSBwcm9qZWN0cy4gLS0+DQotICAgICAgICA8cHJvZmlsZT4NCi0gICAgICAgICAgICA8aWQ+cHJlcGFyZS1yZWxlYXNlPC9pZD4NCi0gICAgICAgICAgICA8YWN0aXZhdGlvbj4NCi0gICAgICAgICAgICAgICAgPHByb3BlcnR5Pg0KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+cHJlcGFyZVJlbGVhc2U8L25hbWU+DQotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPg0KLSAgICAgICAgICAgIDxtb2R1bGVzPg0KLSAgICAgICAgICAgICAgICA8bW9kdWxlPmFzc2VtYmx5PC9tb2R1bGU+DQotICAgICAgICAgICAgPC9tb2R1bGVzPg0KLSAgICAgICAgICAgIDxidWlsZD4NCi0gICAgICAgICAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnRzPi1EcHJlcGFyZVJlbGVhc2U8L2FyZ3VtZW50cz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPg0KLSAgICAgICAgICAgIDwvYnVpbGQ+DQotICAgICAgICA8L3Byb2ZpbGU+DQotICAgIDwvcHJvZmlsZXM+DQotDQotICAgIDxwcm9wZXJ0aWVzPg0KLSAgICAgICAgPHRyaW5pZGFkLnZlcnNpb24+MS4yLjk8L3RyaW5pZGFkLnZlcnNpb24+DQotICAgIDwvcHJvcGVydGllcz4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvbG9nby9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2xvZ28vTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvbG9nby9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvbG9nby9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvbG9nby9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2xvZ28vTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L2xvZ28vZXh0dmFsLWxvZ28uc3ZnIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvbG9nby9leHR2YWwtbG9nby5zdmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MmI1MzkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvbG9nby9leHR2YWwtbG9nby5zdmcKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KLTwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgotCi0KLTwhLS0KLQlDb3B5cmlnaHQgMjAwOSBFbnJpY28gQmVydGkgKGVucmljby5iZXJ0aUBnbWFpbC5jb20pCi0KLQlMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLQl5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0JWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLQkgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLQlVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0JZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLQlXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLQlTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0JbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotCi08c3ZnCi0gICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgotICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgotICAgdmVyc2lvbj0iMS4wIgotICAgd2lkdGg9Ijc0NC4wOTQ0OCIKLSAgIGhlaWdodD0iMTA1Mi4zNjIyIgotICAgaWQ9InN2ZzIiPgotICA8ZGVmcwotICAgICBpZD0iZGVmczQiIC8+Ci0gIDxnCi0gICAgIGlkPSJsYXllcjIiPgotICAgIDxyZWN0Ci0gICAgICAgd2lkdGg9IjM1My40MTk1MyIKLSAgICAgICBoZWlnaHQ9IjExMy4xMDg0IgotICAgICAgIHJ5PSIxMSIKLSAgICAgICB4PSIxODIuMjMwMTUiCi0gICAgICAgeT0iMzgxLjMzMjkyIgotICAgICAgIGlkPSJyZWN0MjQ4NCIKLSAgICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojNjY2NjZmO3N0cm9rZS13aWR0aDowLjgwMTg4MjYyO3N0cm9rZS1vcGFjaXR5OjAuOTQxMTc2NDciIC8+Ci0gIDwvZz4KLSAgPGcKLSAgICAgaWQ9ImxheWVyMSI+Ci0gICAgPHBhdGgKLSAgICAgICBkPSJNIDEwNy4xODc1LDM5My41NjYzOCBMIDEyMi4zMDQ2OSwzOTMuNTY2MzggTCAxNzcuNSw0NjcuMzk0NTEgTCAxNjIuMzgyODEsNDY3LjM5NDUxIEwgMTA3LjE4NzUsMzkzLjU2NjM4IE0gMTIyLjMwNDY5LDQ2Ny4zOTQ1MSBMIDEwNy4xODc1LDQ2Ny4zOTQ1MSBMIDE2Mi4zODI4MSwzOTMuNTY2MzggTCAxNzcuNSwzOTMuNTY2MzggTCAxMjIuMzA0NjksNDY3LjM5NDUxIE0gMTg1LjkzNzUsMzgxLjYxMzI2IEwgMTk0LjA5Mzc1LDM4MS42MTMyNiBMIDE5Ni45MDYyNSwzOTMuNTY2MzggTCAyMTQuMDYyNSwzOTMuNTY2MzggTCAyMTQuMDYyNSw0MDQuMTEzMjYgTCAxOTguOTQ1MzEsNDA0LjExMzI2IEwgMTk4Ljk0NTMxLDQ0Ni41MTE2OSBDIDE5OC45NDUzLDQ1My40MDIzMyAyMDEuOTIxODYsNDU2Ljg0NzY0IDIwNy44NzUsNDU2Ljg0NzYzIEwgMjE0LjA2MjUsNDU2Ljg0NzYzIEwgMjE0LjA2MjUsNDY3LjM5NDUxIEwgMjA0LjUsNDY3LjM5NDUxIEMgMTkyLjEyNDk5LDQ2Ny4zOTQ1MSAxODUuOTM3NSw0NjAuNzYxNyAxODUuOTM3NSw0NDcuNDk2MDcgTCAxODUuOTM3NSwzODEuNjEzMjYiCi0gICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTQ3LjUyMTczLDE5LjI5MTkyMikiCi0gICAgICAgaWQ9ImZsb3dSb290MjQ2MSIKLSAgICAgICBzdHlsZT0iZm9udC1zaXplOjQwcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO2ZvbnQtZmFtaWx5OlNhbnNhdGlvbjstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlNhbnNhdGlvbiIgLz4KLSAgICA8cGF0aAotICAgICAgIGQ9Ik0gNDg0LjE1NjI1LDMzNy45Mzc1IEMgNDc5Ljk1MDA3LDM0MS4xODEwNSA0NzYuOTA4NjEsMzQ1LjYwMTIxIDQ3My43MTg3NSwzNDkuNzgxMjUgQyA0NjYuMDcxOTIsMzYwLjE1OTAyIDQ1OC4zNTM0NywzNzAuNDg0NjEgNDUwLjgzNzM5LDM4MC45NTc5NiBDIDQ0MC45ODEyMywzOTQuNDQ4NzMgNDMxLjI5NTkzLDQwOC4wNjQ0OSA0MjEuODMyOTgsNDIxLjgzNDEzIEMgNDEzLjY1MDA3LDQzMy43Mjc5OSA0MDUuNDU1NjgsNDQ1LjYxNDEyIDM5Ny4zNTg1Nyw0NTcuNTY2NjYgQyAzOTYuNzQ0Niw0NTguMzMzMDkgMzk2LjM1MTE5LDQ1OS4zMDQyNyAzOTUuNTkzNzUsNDU5LjkzNzUgQyAzOTQuNzgzMDMsNDYwLjUwNjI3IDM5My4zOTY5Nyw0NjAuMDc0MjUgMzkzLjMwOTk1LDQ1OS4wMDc4NSBDIDM5MC4wNTc4Miw0NDEuNjQ1MTQgMzg2Ljc3MjU2LDQyNC4yODg2NSAzODMuMzk3NDIsNDA2Ljk0OTM4IEMgMzgyLjAyNiwzOTkuNzc0MjIgMzgwLjYyNjQzLDM5Mi42MDM0NCAzNzkuMDY4NjYsMzg1LjQ2NjI1IEMgMzc4LjMzMzAyLDM4Mi4xMjkyNCAzNzcuNTU3NjQsMzc4Ljc4ODU0IDM3Ni40NTU2LDM3NS41NTIzMyBDIDM3Ni4wODE4OSwzNzQuNjkzNzMgMzc1LjkyODQ2LDM3My40ODczOSAzNzQuODYxNTIsMzczLjIxMzM2IEMgMzczLjkwOTQ1LDM3Mi43NzM1OSAzNzIuODcxMTMsMzczLjM1MDU0IDM3Mi4zNjEyMywzNzQuMTc5MDkgQyAzNzEuNDE0ODEsMzc1LjU1NjkxIDM3MC42MTU3MSwzNzcuMDU3OTggMzcwLjE2MjYzLDM3OC42NzM5OCBDIDM2OS4xNTk0NiwzODEuNzAwMTkgMzY4Ljg1MDk3LDM4NC45MDQ5MiAzNjguNzM0NDUsMzg4LjA3NDgxIEMgMzY4LjY2ODc2LDM5Mi43NzQxNyAzNjkuNDA4ODgsMzk3LjQzMzY5IDM3MC4xMjE2Miw0MDIuMDY0NzkgQyAzNzEuOTQ1MTgsNDEzLjMzMzkzIDM3NC4zMjQxNyw0MjQuNTAzNzMgMzc2LjE3NDg2LDQzNS43NjgxMyBDIDM3Ni44NjA1NSw0MzkuNTcxMDcgMzc3LjUwMjk3LDQ0My4zODMzIDM3Ny45MTk3Myw0NDcuMjI2NjkgQyAzNzguNDU4MTgsNDUyLjE4NzA4IDM3OC41Nzg0Nyw0NTcuMTgyNzkgMzc4LjYyNSw0NjIuMTY4NzMgQyAzNzguNjQ4OTMsNDcwLjczNzA5IDM3OC4wNTAzOCw0NzkuMzAwODUgMzc4LjI2NDM5LDQ4Ny44Njk3NCBDIDM3OC41MDY5OSw0OTEuMDY1MTUgMzc4Ljk0MzY5LDQ5NC4zOTQyOSAzODAuNjM2NzYsNDk3LjE4MTU1IEMgMzgxLjcxODE4LDQ5OC45MTYxIDM4My41NzQ3LDUwMC4yNTc4NiAzODUuNjcxMTcsNTAwLjI5OTY1IEMgMzg3Ljc5NTg0LDUwMC4zNDgwMyAzODkuODk3MDQsNDk5LjU1OTc1IDM5MS42MzM1NCw0OTguMzcwODMgQyAzOTIuOTgwMTEsNDk3LjM0NDI4IDM5NC4xMDA0NCw0OTYuMDIzNjcgMzk0Ljk5ODg5LDQ5NC41OTE3MiBDIDM5Ni40OTgzMSw0OTIuMDUyNDYgMzk4LjA2MzA3LDQ4OS41MzkxMyAzOTkuMjMwMjgsNDg2LjgyNzk3IEMgNDAwLjYxMzUzLDQ4My43Mjg4MyA0MDEuOTY0NzIsNDgwLjYxNCA0MDMuMTcwMjYsNDc3LjQzOTg5IEMgNDA0Ljc5MzM4LDQ3My4yMTY0NSA0MDYuNDI1NjcsNDY4Ljk5MDEyIDQwOC40NDA3NCw0NjQuOTM0MiBDIDQxMS43Nzc5MSw0NTcuODUyNTEgNDE1LjM0MjY2LDQ1MC44ODAxMSA0MTkuMDA4Miw0NDMuOTYzNjIgQyA0MjEuMDUwNjEsNDQwLjEzMDQyIDQyMy4yMDkyMSw0MzYuMzU2MzEgNDI1LjU1ODY1LDQzMi43MDI5MyBDIDQyOC40MDI1NCw0MjguNTEzNDcgNDMxLjQxNjYxLDQyNC40NDMxOCA0MzQuNDI5MTIsNDIwLjM3NDY1IEMgNDQwLjI4NjUsNDEyLjU3NDU2IDQ0Ni4zMzM2Nyw0MDQuOTE5NjQgNDUyLjIzNjkxLDM5Ny4xNTQ0NyBDIDQ1Ni45Nzg3OSwzOTAuOTg2MTUgNDYxLjc1MjM1LDM4NC44NDA3MSA0NjYuMzkzMTcsMzc4LjU5NTg3IEMgNDY5LjM1MzczLDM3NC41OTE2NiA0NzIuMjIxNjMsMzcwLjUxNjMyIDQ3NC45NDI5MywzNjYuMzQ1NjggQyA0NzcuODQ0MDYsMzYxLjc2ODQ3IDQ4MC41Mjc1NywzNTcuMDM1MDUgNDgyLjY3NDI5LDM1Mi4wNTQwNSBDIDQ4NC4wNzk5MywzNDguNjczNzkgNDg1LjI3MDM2LDM0NS4xMzkgNDg1LjQ0MjczLDM0MS40NTI3OSBDIDQ4NS40NTk5MSwzNDAuNTM0MTkgNDg1LjU1ODIzLDMzOS41ODI2OSA0ODUuMzEyNSwzMzguNjg3NSBDIDQ4NS4xMTc4MywzMzguMjMzNTkgNDg0LjcwMjQ2LDMzNy43ODEwOSA0ODQuMTU2MjUsMzM3LjkzNzUgeiIKLSAgICAgICBpZD0idGV4dDI0NzUiCi0gICAgICAgc3R5bGU9ImZvbnQtc2l6ZTo0OS4zMjE2OTM0MnB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojOTljYzAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtmb250LWZhbWlseTpTYW5zYXRpb247LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpTYW5zYXRpb24iIC8+Ci0gICAgPHBhdGgKLSAgICAgICBkPSJNIDE0Mi41NTQ2OSwzOTMuNTY2MzggQyAxNjUuMTQ4MzgsMzkzLjU2NjQ2IDE3NC4yNjU1Niw0MDcuMTEzMzIgMTY5LjkwNjI1LDQzNC4yMDcwMSBMIDEyMC4xOTUzMSw0MzQuMjA3MDEgQyAxMjAuMTk1Myw0NDkuMzAwNzcgMTI5LjcxMDkxLDQ1Ni44NDc2NCAxNDguNzQyMTksNDU2Ljg0NzYzIEMgMTU1LjI1Nzc2LDQ1Ni44NDc2NCAxNjEuNzczMzgsNDU2LjE0NDUyIDE2OC4yODkwNiw0NTQuNzM4MjYgTCAxNjguMjg5MDYsNDY1LjI4NTEzIEMgMTYxLjc3MzM4LDQ2Ni42OTEzOCAxNTMuODUxNTIsNDY3LjM5NDUxIDE0NC41MjM0NCw0NjcuMzk0NTEgQyAxMTkuNjMyOCw0NjcuMzk0NTEgMTA3LjE4NzUsNDU0LjgwODU4IDEwNy4xODc1LDQyOS42MzY2OSBDIDEwNy4xODc1LDQwNS41ODk4OCAxMTguOTc2NTUsMzkzLjU2NjQ2IDE0Mi41NTQ2OSwzOTMuNTY2MzggTSAxMjAuMTk1MzEsNDIzLjM3ODg4IEwgMTU4LjAyMzQ0LDQyMy4zNzg4OCBDIDE1OC42Nzk2NCw0MTAuNDQxNDQgMTUyLjgyMDI3LDQwMy45NzI2OSAxNDAuNDQ1MzEsNDAzLjk3MjYzIEMgMTI3Ljc4OTA0LDQwMy45NzI2OSAxMjEuMDM5MDUsNDEwLjQ0MTQ0IDEyMC4xOTUzMSw0MjMuMzc4ODgiCi0gICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoODEuMDQyNSwxOS4yOTE2NzYpIgotICAgICAgIGlkPSJmbG93Um9vdDQ3ODMiCi0gICAgICAgc3R5bGU9ImZvbnQtc2l6ZTo0MHB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojNjY2NjY2O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtmb250LWZhbWlseTpTYW5zYXRpb247LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpTYW5zYXRpb24iIC8+Ci0gICAgPHBhdGgKLSAgICAgICBkPSJNIDEwNy4xODc1LDQ0NC40MDIzMiBDIDEwNy4xODc1LDQyOS4yNjE3MyAxMTcuMTcxODcsNDIxLjY5MTQzIDEzNy4xNDA2Miw0MjEuNjkxMzggQyAxNDQuNDk5OTYsNDIxLjY5MTQzIDE1MC45MjE4Myw0MjIuMTYwMTggMTU2LjQwNjI1LDQyMy4wOTc2MyBMIDE1Ni40MDYyNSw0MTYuMTM2NjkgQyAxNTYuNDA2Miw0MDguMTIxMTMgMTQ5Ljc3MzM5LDQwNC4xMTMzMiAxMzYuNTA3ODEsNDA0LjExMzI2IEMgMTI4LjkxNDA0LDQwNC4xMTMzMiAxMjEuMTMyOCw0MDUuMjg1MTkgMTEzLjE2NDA2LDQwNy42Mjg4OCBMIDExMy4xNjQwNiwzOTcuMDgyMDEgQyAxMjEuMTMyOCwzOTQuNzM4MzMgMTI4LjkxNDA0LDM5My41NjY0NiAxMzYuNTA3ODEsMzkzLjU2NjM4IEMgMTU4LjQ0NTI2LDM5My41NjY0NiAxNjkuNDE0LDQwMS40NDE0NSAxNjkuNDE0MDYsNDE3LjE5MTM4IEwgMTY5LjQxNDA2LDQ2Ny4zOTQ1MSBMIDE2Mi44MDQ2OSw0NjcuMzk0NTEgTCAxNTcuNjAxNTYsNDYyLjE5MTM4IEMgMTUxLjE3OTY0LDQ2NS42NjAxMyAxNDMuNjMyNzgsNDY3LjM5NDUxIDEzNC45NjA5NCw0NjcuMzk0NTEgQyAxMTYuNDQ1Myw0NjcuMzk0NTEgMTA3LjE4NzUsNDU5LjczMDQ1IDEwNy4xODc1LDQ0NC40MDIzMiBNIDE1Ni40MDYyNSw0MzMuNjQ0NTEgQyAxNTEuMjQ5OTYsNDMyLjcwNzA0IDE0NC44MjgwOSw0MzIuMjM4MjkgMTM3LjE0MDYyLDQzMi4yMzgyNiBDIDEyNS44NDM3Myw0MzIuMjM4MjkgMTIwLjE5NTMsNDM2LjIyMjY2IDEyMC4xOTUzMSw0NDQuMTkxMzggQyAxMjAuMTk1Myw0NTIuNjI4OSAxMjUuMTE3MTcsNDU2Ljg0NzY0IDEzNC45NjA5NCw0NTYuODQ3NjMgQyAxNDMuOTYwOSw0NTYuODQ3NjQgMTUxLjEwOTMzLDQ1NC45MjU3NyAxNTYuNDA2MjUsNDUxLjA4MjAxIEwgMTU2LjQwNjI1LDQzMy42NDQ1MSIKLSAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAwMDAwMiwwLDAsMSwzMjkuNzM4MjksMTkuMjkxNjc2KSIKLSAgICAgICBpZD0iZmxvd1Jvb3Q0ODA3IgotICAgICAgIHN0eWxlPSJmb250LXNpemU6NDBweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjE7Zm9udC1mYW1pbHk6U2Fuc2F0aW9uOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246U2Fuc2F0aW9uIiAvPgotICAgIDxwYXRoCi0gICAgICAgZD0iTSAxMDcuMTg3NSwzNjYuODQ3NjMgTCAxMDcuMTg3NSw0NjcuMzk0NTEgTCAxMjAuMTk1MzEsNDY3LjM5NDUxIEwgMTIwLjE5NTMxLDM2Ni44NDc2MyBMIDEwNy4xODc1LDM2Ni44NDc2MyIKLSAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAwMDAwMiwwLDAsMSw0MDMuNzk5MjksMTkuMjkxNjc2KSIKLSAgICAgICBpZD0iZmxvd1Jvb3Q0ODE5IgotICAgICAgIHN0eWxlPSJmb250LXNpemU6NDBweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjE7Zm9udC1mYW1pbHk6U2Fuc2F0aW9uOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246U2Fuc2F0aW9uIiAvPgotICA8L2c+Ci0gIDxnCi0gICAgIGlkPSJsYXllcjMiPgotICAgIDxyZWN0Ci0gICAgICAgd2lkdGg9IjExLjg5MTU5NyIKLSAgICAgICBoZWlnaHQ9IjEyLjgwNjMzNSIKLSAgICAgICB4PSIzMzMuNTc0NTUiCi0gICAgICAgeT0iNDAwLjg3Mzg0IgotICAgICAgIGlkPSJyZWN0NDY5NSIKLSAgICAgICBzdHlsZT0iZmlsbDojNjY2NjY2O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+Ci0gICAgPHJlY3QKLSAgICAgICB3aWR0aD0iMTUuMDcxNDczIgotICAgICAgIGhlaWdodD0iMjAuMTI0MTU3IgotICAgICAgIHJ5PSIwLjMxNDQ0MTMyIgotICAgICAgIHg9IjI4MS44OTE4MiIKLSAgICAgICB5PSI0MzkuNzkyNDgiCi0gICAgICAgaWQ9InJlY3Q0Njk3IgotICAgICAgIHN0eWxlPSJmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KLSAgICA8cmVjdAotICAgICAgIHdpZHRoPSIxMS44OTE1OTciCi0gICAgICAgaGVpZ2h0PSIxMC41MzA2NDUiCi0gICAgICAgeD0iMzI3LjY5Njk5IgotICAgICAgIHk9IjQxMi44NzE1NSIKLSAgICAgICBpZD0icmVjdDQ4OTEiCi0gICAgICAgc3R5bGU9ImZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utb3BhY2l0eToxIiAvPgotICA8L2c+Ci08L3N2Zz4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3BhcmVudC9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3BhcmVudC9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9wYXJlbnQvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3BhcmVudC9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvcGFyZW50L05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOWJkYjEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvcGFyZW50L05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvcGFyZW50L3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9wYXJlbnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQxMGYwNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9wYXJlbnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tCi0gIC0gUGFyZW50IHBvbSBvZiBhbGwgdGhlIG15ZmFjZXMgZXh0ZW5zaW9ucyB2YWxpZGF0b3Igc3VicHJvamVjdHMgCi0gICAgdGhhdCBoZWxwIHRvIGJ1aWxkIG90aGVyIG15ZmFjZXMgcHJvamVjdHMuCi0gIC0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgUHJvamVjdCBQYXJlbnQ8L25hbWU+Ci0gICAgPHVybD5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTI8L3VybD4KLQotICAgIDxpc3N1ZU1hbmFnZW1lbnQ+Ci0gICAgICAgIDxzeXN0ZW0+amlyYTwvc3lzdGVtPgotICAgICAgICA8dXJsPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9FWFRWQUw8L3VybD4KLSAgICA8L2lzc3VlTWFuYWdlbWVudD4KLQotICAgIDxjaU1hbmFnZW1lbnQ+Ci0gICAgICAgIDxzeXN0ZW0+Y29udGludXVtPC9zeXN0ZW0+Ci0gICAgICAgIDx1cmw+aHR0cDovL215ZmFjZXMuem9uZXMuYXBhY2hlLm9yZzo4MDgwL2NvbnRpbnV1bTwvdXJsPgotICAgICAgICA8bm90aWZpZXJzPgotICAgICAgICAgICAgPG5vdGlmaWVyPgotICAgICAgICAgICAgICAgIDx0eXBlPm1haWw8L3R5cGU+Ci0gICAgICAgICAgICAgICAgPHNlbmRPblN1Y2Nlc3M+dHJ1ZTwvc2VuZE9uU3VjY2Vzcz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGFkZHJlc3M+Y29tbWl0c0BteWZhY2VzLmFwYWNoZS5vcmc8L2FkZHJlc3M+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9ub3RpZmllcj4KLSAgICAgICAgPC9ub3RpZmllcnM+Ci0gICAgPC9jaU1hbmFnZW1lbnQ+Ci0gICAgCi0gICAgPGluY2VwdGlvblllYXI+MjAwODwvaW5jZXB0aW9uWWVhcj4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn08L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD5NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotCi0gICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgotICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KLQotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLQotICAgICAgICAgICAgICAgICAgICAtIENvcHkgTElDRU5TRS50eHQgYW5kIE5PVElDRS50eHQgc28gdGhhdCB0aGV5IGFyZSBpbmNsdWRlZAotICAgICAgICAgICAgICAgICAgICAtIGluIHRoZSAtamF2YWRvYyBqYXIgZmlsZSBmb3IgdGhlIGNvbXBvbmVudC4KLSAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5qYXZhZG9jLnJlc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2FwaWRvY3MvTUVUQS1JTkYiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJMSUNFTlNFLnR4dCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJOT1RJQ0UudHh0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+amF2YWRvYy5zaXRlLmNvcHk8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnNpdGU8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ29weSBqYXZhZG9jIHRvIGFub3RoZXIgZGlyZWN0b3J5LCB0byBrZWVwIGphdmFkb2Mgb2YgcHJldmlvdXMgdmVyc2lvbnMgb24gc2l0ZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3NpdGUvYXBpZG9jcy0ke3Byb2plY3QudmVyc2lvbn0iIGZhaWxvbmVycm9yPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zaXRlL2FwaWRvY3MiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPCEtLQotICAgICAgICAgICAgICAgIC0gTWFrZSBhIGNoZWNrc3R5bGUgdmlvbGF0aW9uIGEgY29tcGlsZSBlcnJvci4gTm90ZSB0aGF0IGlmIGEgY29tcGlsZSBlcnJvciBvY2N1cnMsCi0gICAgICAgICAgICAgICAgLSBmdXJ0aGVyIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0YXJnZXQvc2l0ZS9jaGVja3N0eWxlLmh0bWwgKHByZXNlbnQgZXZlbiB3aGVuCi0gICAgICAgICAgICAgICAgLSBqdXN0IHRoZSBjb21waWxlIGdvYWwgYW5kIG5vdCB0aGUgc2l0ZSBnb2FsIGhhcyBiZWVuIHJ1bikuIE5vdGUgYWxzbyB0aGF0IGNoaWxkCi0gICAgICAgICAgICAgICAgLSBwcm9qZWN0cyBtYXkgcmVkZWNsYXJlIHRoaXMgcGx1Z2luIGFuZCBwcm92aWRlIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIHNldHRpbmdzCi0gICAgICAgICAgICAgICAgLSB0byB1c2UgZGlmZmVyZW50IGNoZWNrcyAobW9yZSBvciBsZXNzIHN0cmljdCB0aGFuIHRoZSBkZWZhdWx0KS4KLSAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGVja3N0eWxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+dmVyaWZ5LXN0eWxlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNoZWNrPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlnTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdGFuZGFyZC54bWw8L2NvbmZpZ0xvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aGVhZGVyTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWhlYWRlci50eHQ8L2hlYWRlckxvY2F0aW9uPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBTZXQgY29tcGlsZSBzb3VyY2UgYXQgMS41LCBzaW5jZSB0aGUgdGFyZ2V0IEpTRiBpbXBsIGlzIDEuMiAtLT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgotICAgICAgICAgICAgICAgICAgICA8b3B0aW1pemU+ZmFsc2U8L29wdGltaXplPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgICAgICAgICAgIAotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotICAgIDxyZXBvc2l0b3JpZXM+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPm1hdmVuMi1yZXBvc2l0b3J5LmRldi5qYXZhLm5ldDwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5KYXZhLm5ldCBSZXBvc2l0b3J5IGZvciBNYXZlbjwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL2Rvd25sb2FkLmphdmEubmV0L21hdmVuLzEvPC91cmw+Ci0gICAgICAgICAgICA8bGF5b3V0PmxlZ2FjeTwvbGF5b3V0PgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgPC9yZXBvc2l0b3JpZXM+Ci0KLSAgICA8cmVwb3J0aW5nPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWp4ci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXJlcG9ydC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40LjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBtZC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cnVsZXNldHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvYmFzaWMueG1sPC9ydWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL3VudXNlZGNvZGUueG1sPC9ydWxlc2V0PgotICAgICAgICAgICAgICAgICAgICA8L3J1bGVzZXRzPgotICAgICAgICAgICAgICAgICAgICA8bGlua1hyZWY+dHJ1ZTwvbGlua1hyZWY+Ci0gICAgICAgICAgICAgICAgICAgIDxtaW5pbXVtVG9rZW5zPjEwMDwvbWluaW11bVRva2Vucz4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldEpkaz4xLjU8L3RhcmdldEpkaz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1jaGVja3Mtc3RhbmRhcmQueG1sPC9jb25maWdMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGhlYWRlckxvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1oZWFkZXIudHh0PC9oZWFkZXJMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvcmVwb3J0aW5nPgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvcGFyZW50PC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvcGFyZW50PC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9wYXJlbnQ8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgICAgICA8c25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICAgICAgPHVuaXF1ZVZlcnNpb24+ZmFsc2U8L3VuaXF1ZVZlcnNpb24+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLnNuYXBzaG90czwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgTWF2ZW4gU25hcHNob3QgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgPHNpdGU+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTI8L3VybD4KLSAgICAgICAgPC9zaXRlPgotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtYXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wZXJmb3JtUmVsZWFzZTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvY3M8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxqc2YudmVyc2lvbj4xLjIuNDwvanNmLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI4NzkzMC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIC0tLS0tLQ0KLU92ZXJ2aWV3DQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4yDQotDQotICBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBwcm92aWRlcyB2ZXJzaW9ucyBmb3IgSlNGIDEuMSBhbmQgMS4yDQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvcGFyZW50L3NyYy9zaXRlL2FwdC9qYXZhZG9jLmFwdCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3BhcmVudC9zcmMvc2l0ZS9hcHQvamF2YWRvYy5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZmQzNmYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvcGFyZW50L3NyYy9zaXRlL2FwdC9qYXZhZG9jLmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSAtLS0tLS0NCi1KYXZhZG9jDQotIC0tLS0tLQ0KLQ0KLUphdmFkb2MNCi0NCi0gICAgSGVyZSB5b3UgY2FuIGZpbmQgdGhlIGphdmFkb2Mgb2YgcHJldmlvdXMgZXh0dmFsIHZlcnNpb25zLg0KLQ0KLSAgICAqIHt7e2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9teWZhY2VzLWV4dHZhbC1jb3JlL2FwaWRvY3MtMS4yLjEvaW5kZXguaHRtbH1NeWZhY2VzIEV4dFZhbCBDb3JlIFZlcnNpb24gMS4yLjF9fQ0KLQ0KLSAgICAqIHt7e2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi92YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uL2FwaWRvY3MtMS4yLjEvaW5kZXguaHRtbH1NeWZhY2VzIEV4dFZhbCBQcm9wZXJ0eSBWYWxpZGF0aW9uIFZlcnNpb24gMS4yLjF9fQ0KLQ0KLSAgICAqIHt7e2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9teWZhY2VzLWV4dHZhbC1jb3JlL2FwaWRvY3MtMS4yLjIvaW5kZXguaHRtbH1NeWZhY2VzIEV4dFZhbCBDb3JlIFZlcnNpb24gMS4yLjJ9fQ0KLQ0KLSAgICAqIHt7e2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi92YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uL2FwaWRvY3MtMS4yLjIvaW5kZXguaHRtbH1NeWZhY2VzIEV4dFZhbCBQcm9wZXJ0eSBWYWxpZGF0aW9uIFZlcnNpb24gMS4yLjJ9fQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3BhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3BhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc4NjQ5Zi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9wYXJlbnQvc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgbmFtZT0iQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IiPgotICA8YmFubmVyTGVmdD4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRWYWw8L25hbWU+Ci0gICAgPHNyYz5pbWFnZXMvZXh0dmFsX2xvZ28ucG5nPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sPC9ocmVmPgotICA8L2Jhbm5lckxlZnQ+Ci0KLSAgPGJhbm5lclJpZ2h0PgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzPC9uYW1lPgotICAgIDxzcmM+aW1nL2Jhbm5lcnMvTXlGYWNlc19sb2dvLmpwZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbDwvaHJlZj4KLSAgPC9iYW5uZXJSaWdodD4KLQotICA8cHVibGlzaERhdGUgZm9ybWF0PSJkZCBNTU0geXl5eSIvPgotCi0gIDxza2luPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5tYXZlbjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLXNpdGUtc2tpbjwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3NraW4+Ci0KLSAgPGJvZHk+Ci0gICAgPGxpbmtzPgotICAgICAgPGl0ZW0gbmFtZT0iQXBhY2hlIiBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmciLz4KLSAgICAgIDxpdGVtIG5hbWU9Ik15RmFjZXMiIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQgTXlmYWNlcyBFeHRWYWwiIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZG93bmxvYWQuaHRtbCIvPgotICAgIDwvbGlua3M+Ci0KLSAgICA8bWVudSBuYW1lPSJBcGFjaGUgTXlGYWNlcyIgaW5oZXJpdD0idG9wIj4KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkRvd25sb2FkIiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2Rvd25sb2FkLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0KLSAgICA8bWVudSBuYW1lPSJDb250ZW50cyIgaW5oZXJpdD0idG9wIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iTWFpbiBTaXRlIiAgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW5kZXguaHRtbCIvPgotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjEiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS9pbmRleC5odG1sIiBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8aXRlbSBuYW1lPSJkdW1teSIgICAgICAgIGhyZWY9ImR1bW15Ii8+Ci0gICAgICAgIDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iRXh0VmFsIGZvciBKU0YgMS4yIiAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iQ29yZSBNb2R1bGUiICAgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvbXlmYWNlcy1leHR2YWwtY29yZS9pbmRleC5odG1sIi8+Ci0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IlByb3BlcnR5IFZhbGlkYXRpb24iICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL3ZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb24vaW5kZXguaHRtbCIvPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJUcmluaWRhZCBTdXBwb3J0IiAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydC9pbmRleC5odG1sIi8+Ci0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IkdlbmVyaWMgU3VwcG9ydCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2NvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQvaW5kZXguaHRtbCIvPgotICAgICAgICA8L2l0ZW0+Ci0gICAgPC9tZW51PgotCQotICAgIDxtZW51IG5hbWU9IkRvY3VtZW50YXRpb24iPgotICAgICAgPGl0ZW0gbmFtZT0iV2lraSIgICAgICAgICBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL215ZmFjZXMvRXh0ZW5zaW9ucy9WYWxpZGF0b3IvIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJKYXZhZG9jIiAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9qYXZhZG9jLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0KLSAgICA8bWVudSByZWY9InJlcG9ydHMiLz4KLQotICAgIDxtZW51IG5hbWU9IkZvdW5kYXRpb24iIGluaGVyaXQ9ImJvdHRvbSI+Ci0gICAgICA8aXRlbSBuYW1lPSJBU0YiICAgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlNwb25zb3JzaGlwIiAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9zcG9uc29yc2hpcC5odG1sIiAvPgotICAgICAgPGl0ZW0gbmFtZT0iVGhhbmtzIiAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3RoYW5rcy5odG1sIiAvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNjQ2M2QuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+NjwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtbW9kdWxlPC9hcnRpZmFjdElkPg0KLSAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgTW9kdWxlPC9uYW1lPg0KLSAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMjwvdXJsPg0KLQ0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvPC9jb25uZWN0aW9uPg0KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rLzwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4NCi0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rLzwvdXJsPg0KLSAgICA8L3NjbT4NCi0NCi0gICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+DQotICAgICAgICA8c25hcHNob3RSZXBvc2l0b3J5Pg0KLSAgICAgICAgICAgIDx1bmlxdWVWZXJzaW9uPmZhbHNlPC91bmlxdWVWZXJzaW9uPg0KLSAgICAgICAgICAgIDxpZD5hcGFjaGUuc25hcHNob3RzPC9pZD4NCi0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgTWF2ZW4gU25hcHNob3QgUmVwb3NpdG9yeTwvbmFtZT4NCi0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4NCi0gICAgICAgIDwvc25hcHNob3RSZXBvc2l0b3J5Pg0KLSAgICAgICAgPHNpdGU+DQotICAgICAgICAgICAgPGlkPmFwYWNoZS1zaXRlPC9pZD4NCi0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMjwvdXJsPg0KLSAgICAgICAgPC9zaXRlPg0KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+DQotDQotICAgIDwhLS0gV0FSTklORzogRE8gTk9UIEdFTkVSQVRFIFNJVEUgRlJPTSBIRVJFIERJUkVDVExZDQotICAgIFNpbmNlIHRoaXMgcHJvamVjdCBoYXMgYW4gYXN5bmMgcmVsZWFzZSBwcm9jZWR1cmUgKG5vdA0KLSAgICBhbGwgbW9kdWxlcyBzaG91bGQgYmUgcmVsZWFzZWQgYXQgb25jZSksIHRoZSBwYXJlbnQgcG9tLnhtbCANCi0gICAgaXMgbm90IHRoaXMgKHRoZXJlIGlzIGEgbW9kdWxlIGZvciB0aGF0KS4gVXNlIG1hdmVuIHNpdGUgDQotICAgIHBsdWdpbiBoZXJlIGNhdXNlIHByb2JsZW1zIHdoZW4gdGhlIHNpdGUgaXMgZ2VuZXJhdGVkLg0KLSAgICBUaGUgcHJvY2VkdXJlIG11c3QgZXhlY3V0ZSBzaXRlIGNvbW1tYW5kIGZpcnN0IG9uIHBhcmVudCANCi0gICAgbW9kdWxlIGFuZCB0aGVuIG9uIGVhY2ggbW9kdWxlIGxpc3RlZCBiZWxvdy4gDQotICAgICAtLT4NCi0NCi0gICAgPG1vZHVsZXM+DQotICAgICAgICA8bW9kdWxlPnBhcmVudDwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5jb3JlPC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPnZhbGlkYXRpb24tbW9kdWxlczwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5jb21wb25lbnQtc3VwcG9ydDwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5leGFtcGxlczwvbW9kdWxlPg0KLSAgICA8L21vZHVsZXM+DQotDQotICAgIDxwcm9maWxlcz4NCi0gICAgICAgIDwhLS0gVGhpcyBwcm9maWxlIGlzIGludm9rZWQgYnkgLURwcmVwYXJlUmVsZWFzZT10cnVlLiAgVGhpcyBhbGxvd3MgbXZuIHJlbGVhc2U6cHJlcGFyZSB0bw0KLSAgICAgICAgICAgIHJ1biBzdWNjZXNzZnVsbHkgb24gdGhlIGFzc2VtYmx5IHByb2plY3RzLiAtLT4NCi0gICAgICAgIDxwcm9maWxlPg0KLSAgICAgICAgICAgIDxpZD5wcmVwYXJlLXJlbGVhc2U8L2lkPg0KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPg0KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+DQotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wcmVwYXJlUmVsZWFzZTwvbmFtZT4NCi0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8L2FjdGl2YXRpb24+DQotICAgICAgICAgICAgPG1vZHVsZXM+DQotICAgICAgICAgICAgICAgIDxtb2R1bGU+YXNzZW1ibHk8L21vZHVsZT4NCi0gICAgICAgICAgICA8L21vZHVsZXM+DQotICAgICAgICAgICAgPGJ1aWxkPg0KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVsZWFzZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+LURwcmVwYXJlUmVsZWFzZTwvYXJndW1lbnRzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+DQotICAgICAgICAgICAgPC9idWlsZD4NCi0gICAgICAgIDwvcHJvZmlsZT4NCi0gICAgPC9wcm9maWxlcz4NCi0gICAgDQotICAgIDxwcm9wZXJ0aWVzPg0KLSAgICAgICAgPGpzZi52ZXJzaW9uPjEuMi40PC9qc2YudmVyc2lvbj4NCi0gICAgPC9wcm9wZXJ0aWVzPg0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9zaXRlL3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9zaXRlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NjhlMDIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3Qvc2l0ZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICAgICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gICAgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gICAgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAgICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgICAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgKgotICAgICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgICAqCi0gICAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXNpdGU8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvcjwvbmFtZT4KLSAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3I8L3VybD4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPGRlZmF1bHRHb2FsPnNpdGU8L2RlZmF1bHRHb2FsPgotICAgICAgICA8ZXh0ZW5zaW9ucz4KLSAgICAgICAgICA8ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi53YWdvbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPndhZ29uLXNzaC1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC1hbHBoYS01PC92ZXJzaW9uPgotICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICA8L2V4dGVuc2lvbnM+Ci0gICAgPC9idWlsZD4KLSAgICA8cmVwb3J0aW5nPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L3JlcG9ydGluZz4KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay9zaXRlPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvc2l0ZTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay9zaXRlPC91cmw+Ci0gICAgPC9zY20+Ci0gICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgICA8c2l0ZT4KLSAgICAgICAgPGlkPmFwYWNoZS1zaXRlPC9pZD4KLSAgICAgICAgPG5hbWU+QXBhY2hlIFdlYnNpdGU8L25hbWU+Ci0gICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjwvdXJsPgotICAgICAgPC9zaXRlPgotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3Qvc2l0ZS9zcmMvc2l0ZS9hcHQvZG93bmxvYWQuYXB0IGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3Qvc2l0ZS9zcmMvc2l0ZS9hcHQvZG93bmxvYWQuYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzUxNGUwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3NpdGUvc3JjL3NpdGUvYXB0L2Rvd25sb2FkLmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0gfn4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotIH5+IGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSB+fiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotIH5+IFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotIH5+ICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotIH5+IHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIH5+DQotIH5+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIH5+DQotIH5+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gfn4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gfn4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotIH5+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gfn4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotIA0KLSAtLS0tLS0NCi1Eb3dubG9hZCBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLSAtLS0tLS0NCi0NCi1Eb3dubG9hZCBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLQ0KLQ0KLSAgVXNlIHRoZSBsaW5rcyBiZWxvdyB0byBkb3dubG9hZCBhIGRpc3RyaWJ1dGlvbiBvZiBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmcm9tDQotICBvbmUgb2Ygb3VyIG1pcnJvcnMuIEl0IGlzIGdvb2QgcHJhY3RpY2UgdG8gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlDQotICBkaXN0cmlidXRpb24gZmlsZXMuDQotDQotICBZb3Ugd2lsbCBiZSBwcm9tcHRlZCBmb3IgYSBtaXJyb3IgLSBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQgb24geW91cnMsIHBsZWFzZSBiZSBwYXRpZW50LCBhcyBpdCBtYXkgdGFrZSAyNA0KLSAgaG91cnMgdG8gcmVhY2ggYWxsIG1pcnJvcnMuDQotDQotICBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBkaXN0cmlidXRlZCBhcyBhIDw8PHppcD4+PiBhcmNoaXZlIChmb3IgV2luZG93cykgYW5kDQotICBhcyBhIDw8PHRhci5nej4+PiBhcmNoaXZlIChmb3IgVU5JWCkuIFRoZSBjb250ZW50IGlzIHRoZSBzYW1lLiBQbGVhc2Ugbm90ZQ0KLSAgdGhhdCB0aGUgPDw8dGFyLmd6Pj4+IGFyY2hpdmVzIGNvbnRhaW4gZmlsZSBuYW1lcyBsb25nZXIgdGhhbiAxMDAgY2hhcmFjdGVycyBhbmQgaGF2ZSBiZWVuDQotICBjcmVhdGVkIHVzaW5nIEdOVSB0YXIgZXh0ZW5zaW9ucy4gVGh1cyB0aGV5IG11c3QgYmUgdW50YXJyZWQgd2l0aCBhIEdOVSBjb21wYXRpYmxlDQotICB2ZXJzaW9uIG9mIHRhci4NCi0NCi0gIDw8IEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIDEuMC4wIERpc3RyaWJ1dGlvbiA+Pg0KLQ0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgICAgICAgICAgICAgICAgICAgICAgICAgfCBNaXJyb3JzIHwgQ2hlY2tzdW0gfCBTaWduYXR1cmUgfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMSAxLjEuMiAodGFyLmd6KSAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi50YXIuZ3p9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nen19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi50YXIuZ3oubWQ1fSBteWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi50YXIuZ3oubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nei5hc2N9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nei5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4xIDEuMS4yICh6aXApICAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi56aXB9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnppcH19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi56aXAubWQ1fSBteWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi56aXAubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnppcC5hc2N9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnppcC5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4xIDEuMS4yIFNvdXJjZSAodGFyLmd6KSAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMudGFyLmd6fSBteWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy50YXIuZ3p9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnRhci5nei5tZDV9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnRhci5nei5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnRhci5nei5hc2N9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnRhci5nei5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4xIDEuMS4yIFNvdXJjZSAoemlwKSAgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnppcH0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMuemlwfX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy56aXAubWQ1fSBteWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy56aXAubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy56aXAuYXNjfSBteWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy56aXAuYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMiAxLjIuMiAodGFyLmd6KSAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDEyLTEuMi4yLWJpbi50YXIuZ3p9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnRhci5nen19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDEyLTEuMi4yLWJpbi50YXIuZ3oubWQ1fSBteWZhY2VzLWV4dHZhbDEyLTEuMi4yLWJpbi50YXIuZ3oubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnRhci5nei5hc2N9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnRhci5nei5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4yIDEuMi4yICh6aXApICAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDEyLTEuMi4yLWJpbi56aXB9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnppcH19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDEyLTEuMi4yLWJpbi56aXAubWQ1fSBteWZhY2VzLWV4dHZhbDEyLTEuMi4yLWJpbi56aXAubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnppcC5hc2N9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnppcC5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4yIDEuMi4yIFNvdXJjZSAodGFyLmd6KSAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMudGFyLmd6fSBteWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy50YXIuZ3p9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnRhci5nei5tZDV9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnRhci5nei5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnRhci5nei5hc2N9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnRhci5nei5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4yIDEuMi4yIFNvdXJjZSAoemlwKSAgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnppcH0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMuemlwfX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy56aXAubWQ1fSBteWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy56aXAubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy56aXAuYXNjfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy56aXAuYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLQ0KLUxhdGVzdCBzb3VyY2UgY29kZSBmcm9tIFNWTiByZXBvc2l0b3J5DQotDQotICAgIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgbGF0ZXN0IEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZlYXR1cmVzLCB0aGUgc291cmNlIGNvZGUgaXMgdW5kZXINCi0gICAgdmVyc2lvbiBjb250cm9sIHdpdGggU1ZOLiAgQ2xpY2sge3t7c291cmNlLXJlcG9zaXRvcnkuaHRtbH0gaGVyZSB9fQ0KLSAgICBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZSB0aGUgQVNGIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFNWTiBSZXBvc2l0b3J5Lg0KLQ0KLVZlcmlmeWluZyBjaGVja3N1bXMNCi0NCi0gICAgSXQgaXMgZXNzZW50aWFsIHRoYXQgeW91IHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIHRoZSBkb3dubG9hZGVkDQotICAgIGZpbGVzIHVzaW5nIHRoZSBQR1AgYW5kIE1ENSBzaWduYXR1cmVzLiBNRDUgdmVyaWZpY2F0aW9uIGVuc3VyZXMgdGhlDQotICAgIGZpbGUgd2FzIG5vdCBjb3JydXB0ZWQgZHVyaW5nIHRoZSBkb3dubG9hZCBwcm9jZXNzLiBQR1AgdmVyaWZpY2F0aW9uDQotICAgIGVuc3VyZXMgdGhhdCB0aGUgZmlsZSBjYW1lIGZyb20gYSBjZXJ0YWluIHBlcnNvbi4NCi0NCi0gICAgVG8gdmVyaWZ5IHRoZSBNRDUgc2lnbmF0dXJlIG9uIHRoZSBmaWxlcywgeW91IG5lZWQgdG8gdXNlIGEgcHJvZ3JhbQ0KLSAgICBjYWxsZWQgPDw8bWQ1Pj4+IG9yIDw8PG1kNXN1bT4+Piwgd2hpY2ggaXMNCi0gICAgaW5jbHVkZWQgaW4gbWFueSBVTklYIGRpc3RyaWJ1dGlvbnMuICBJdCBpcyBhbHNvIGF2YWlsYWJsZSBhcyBwYXJ0IG9mDQotICAgIHt7e2h0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS90ZXh0dXRpbHMvdGV4dHV0aWxzLmh0bWx9R05VIFRleHR1dGlsc319Lg0KLSAgICBXaW5kb3dzIHVzZXJzIGNhbiBnZXQgYmluYXJ5IG1kNSBwcm9ncmFtcyBmcm9tIHt7e2h0dHA6Ly93d3cuZm91cm1pbGFiLmNoL21kNS99aGVyZX19LA0KLSAgICB7e3todHRwOi8vd3d3LnBjLXRvb2xzLm5ldC93aW4zMi9mcmVld2FyZS9jb25zb2xlL31oZXJlfX0sIG9yDQotICAgIHt7e2h0dHA6Ly93d3cuc2xhdmFzb2Z0LmNvbS9mc3VtL31oZXJlfX0uDQotDQotVmVyaWZ5aW5nIHNpZ25hdHVyZXMNCi0NCi0gIAlQR1AgdmVyaWZpY2F0aW9uIGVuc3VyZXMgdGhhdCB0aGUgZmlsZSBjYW1lIGZyb20gYSBjZXJ0YWluIHBlcnNvbi4gIFdlIHN0cm9uZ2x5IHJlY29tbWVuZA0KLQkgIHlvdSB2ZXJpZnkgeW91ciBkb3dubG9hZHMgd2l0aCBib3RoIFBHUCBhbmQgTUQ1Lg0KLQ0KLQlUaGUgUEdQIHNpZ25hdHVyZXMgY2FuIGJlIHZlcmlmaWVkIHVzaW5nIHt7e2h0dHA6Ly93d3cucGdwaS5vcmcvfVBHUH19IG9yIA0KLQl7e3todHRwOi8vd3d3LmdudXBnLm9yZy99R1BHfX0uICBGaXJzdCBkb3dubG9hZCB0aGUgQXBhY2hlIE15RmFjZXMgDQotCXt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvS0VZU31LRVlTfX0JYXMgd2VsbCBhcyB0aGUgPDw8YXNjPj4+IHNpZ25hdHVyZSBmaWxlIA0KLQlmb3IgdGhlIHBhcnRpY3VsYXIgZGlzdHJpYnV0aW9uLiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB5b3UgZ2V0IHRoZXNlIGZpbGVzIGZyb20gdGhlIHVsdGltYXRlDQotCXRydXN0ZWQgc291cmNlIC0gdGhlIG1haW4gQVNGIGRpc3RyaWJ1dGlvbiBzaXRlLCByYXRoZXIgdGhhbiBmcm9tIGEgbWlycm9yLg0KLQlUaGVuIHZlcmlmeSB0aGUgc2lnbmF0dXJlcyB1c2luZyAuLi4NCi0NCi0JICA8PDwNCi0JICAlIHBncGsgLWEgS0VZUw0KLQkgICUgcGdwdiBteWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi50YXIuZ3ouYXNjIG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5neg0KLQkgID4+Pg0KLQ0KLQkgIDxvcj4NCi0NCi0JICA8PDwNCi0JICAlIHBncCAta2EgS0VZUw0KLQkgICUgcGdwIG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nei5hc2MgbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6DQotCSAgPj4+DQotDQotCSAgPG9yPg0KLQ0KLQkgIDw8PA0KLSAgCSUgZ3BnIC0taW1wb3J0IEtFWVMNCi0JICAlIGdwZyAtLXZlcmlmeSBteWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi50YXIuZ3ouYXNjIG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5neg0KLQkgID4+Pg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3NpdGUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3NpdGUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyNTM5Yi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC9zaXRlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBhIEpTRiBjZW50cmljIHZhbGlkYXRpb24gZnJhbWV3b3JrLg0KLSAgDQotICAgIEl0IG9mZmVycyBwb3dlcmZ1bCBhbmQgZWFzeSB0byB1c2UgZmllbGQgYmFzZWQgdmFsaWRhdGlvbiBiYXNlZCBvbiBhbm5vdGF0aW9ucy4NCi1JdCBoYXMgYSBwbHVnZ2FibGUgYXJjaGl0ZWN0dXJlLCBzbyBpdCBpcyBwb3NzaWJsZSB0byBhZGQgbmV3IHZhbGlkYXRpb24gbW9kdWxlcyBvciBzdXBwb3J0IGZvciBjb21wb25lbnQgbGlicmFyaWVzIGxpa2UgVHJpbmlkYWQgb3Igb3RoZXIgM3JkIHBhcnR5IGZyYW1ld29ya3MuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLjEueCBhbmQgSlNGIDEuMi54LiBCb3RoIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrDQotDQotICAgIEZ1cnRoZXIgaW5mb3JtYXRpb24gYXJlIGF2YWlsYWJsZSBhdCB0aGUge3t7aHR0cDovL3dpa2kuYXBhY2hlLm9yZy9teWZhY2VzL0V4dGVuc2lvbnMvVmFsaWRhdG9yL31XaWtpfX0uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3Qvc2l0ZS9zcmMvc2l0ZS9zaXRlLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3NpdGUvc3JjL3NpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYzllODUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3Qvc2l0ZS9zcmMvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCBuYW1lPSJBcGFjaGUgTXlmYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciI+Ci0gIDxiYW5uZXJMZWZ0PgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dFZhbDwvbmFtZT4KLSAgICA8c3JjPmltYWdlcy9leHR2YWxfbG9nby5wbmc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2luZGV4Lmh0bWw8L2hyZWY+Ci0gIDwvYmFubmVyTGVmdD4KLQotICA8YmFubmVyUmlnaHQ+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXM8L25hbWU+Ci0gICAgPHNyYz5pbWcvYmFubmVycy9NeUZhY2VzX2xvZ28uanBnPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sPC9ocmVmPgotICA8L2Jhbm5lclJpZ2h0PiAKLQotICA8cHVibGlzaERhdGUgZm9ybWF0PSJkZCBNTU0geXl5eSIvPgotCi0gIDxza2luPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5tYXZlbjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLXNpdGUtc2tpbjwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3NraW4+Ci0KLSAgPGJvZHk+Ci0gICAgPGxpbmtzPgotICAgICAgPGl0ZW0gbmFtZT0iQXBhY2hlIiBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmciLz4KLSAgICAgIDxpdGVtIG5hbWU9Ik15RmFjZXMiIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQgTXlmYWNlcyBFeHRWYWwiICAgICAgIGhyZWY9ImRvd25sb2FkLmh0bWwiLz4KLSAgICA8L2xpbmtzPgotCi0gICAgPG1lbnUgbmFtZT0iQXBhY2hlIE15RmFjZXMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9kb3dubG9hZC5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgbmFtZT0iQ29udGVudHMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9Ik1haW4gU2l0ZSIgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgPGl0ZW0gbmFtZT0iRXh0VmFsIGZvciBKU0YgMS4xIiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvaW5kZXguaHRtbCIgY29sbGFwc2U9InRydWUiPgotICAgICAgICAgICAgPGl0ZW0gbmFtZT0iZHVtbXkiICAgICAgICBocmVmPSJkdW1teSIvPgotICAgICAgICA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkV4dFZhbCBmb3IgSlNGIDEuMiIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2luZGV4Lmh0bWwiIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9ImR1bW15IiAgICAgICAgaHJlZj0iZHVtbXkiLz4KLSAgICAgICAgPC9pdGVtPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IG5hbWU9IkRvY3VtZW50YXRpb24iPgotICAgICAgPGl0ZW0gbmFtZT0iV2lraSIgICAgICAgICBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL215ZmFjZXMvRXh0ZW5zaW9ucy9WYWxpZGF0b3IvIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgcmVmPSJyZXBvcnRzIi8+Ci0KLSAgICA8bWVudSBuYW1lPSJGb3VuZGF0aW9uIiBpbmhlcml0PSJ0b3AiPgotICAgICAgPGl0ZW0gbmFtZT0iQVNGIiAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iIC8+Ci0gICAgICA8aXRlbSBuYW1lPSJTcG9uc29yc2hpcCIgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vc3BvbnNvcnNoaXAuaHRtbCIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlRoYW5rcyIgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi90aGFua3MuaHRtbCIgLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjYWYxMC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQmVhbi1WYWxpZGF0aW9uLUludGVncmF0aW9uLU1vZHVsZSAoSlNSIDMwMyk8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPnZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgudmFsaWRhdGlvbjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuMC5HQTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgICAgICA8IS0tIFRlc3QgZGVwZW5kZW5jaWVzIC0tPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi41PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQuanNwPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc2hhbGU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2hhbGUtdGVzdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuNDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIA0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgPC9yZXNvdXJjZXM+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4yPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9BYnN0cmFjdCouamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9UZXN0VXRpbHMuamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qQmVhbi5qYXZhPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMyOWQxOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RhcnR1cC5CZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzRkOTk2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkFic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWwuQmVhblZhbGlkYXRpb25VdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuSElHSCwgZGVzY3JpcHRpb24gPSAic3luYyBqc2YgMi4wIHNwZWNpZmljIGNoYW5nZXMgd2l0aCBidi1icmFuY2giKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgcHJpdmF0ZSBCZWFuVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzIGJ2aVV0aWxzID0gbmV3IEJlYW5WYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHModGhpcy5sb2dnZXIpOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpDQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0Q29tcG9uZW50KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHRvIGluaXQgY29tcG9uZW50ICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gYnZpVXRpbHMuZXh0cmFjdFByb3BlcnR5RGV0YWlscyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmIChwcm9wZXJ0eURldGFpbHMgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBCZWFuVmFsaWRhdGlvblV0aWxzLmFkZE1ldGFEYXRhVG9Db250ZXh0KHVpQ29tcG9uZW50LCBwcm9wZXJ0eURldGFpbHMpOw0KLSAgICAgICAgICAgIGJ2aVV0aWxzLmluaXRDb21wb25lbnRXaXRoUHJvcGVydHlEZXRhaWxzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHByb3BlcnR5RGV0YWlscyk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJpbml0IGNvbXBvbmVudCBvZiAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gRXh0VmFsVXRpbHMuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKTsNCi0NCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG1ldGFEYXRhRXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBib29sZWFuIHZhbGlkYXRlUHJvcGVydHkgPSBoYXNCZWFuVmFsaWRhdGlvbkNvbnN0cmFpbnRzKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHZhbGlkYXRlUHJvcGVydHkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgianNyMzAzIHN0YXJ0IHZhbGlkYXRpb24iKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBCZWFuVmFsaWRhdGlvblV0aWxzLmFkZE1ldGFEYXRhVG9Db250ZXh0KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBFeHRWYWxVdGlscy5nZXRQcm9wZXJ0eURldGFpbHMocHJvcGVydHlJbmZvcm1hdGlvbikpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoIWV4ZWN1dGVHbG9iYWxCZWZvcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlJbmZvcm1hdGlvbikpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBwcm9jZXNzRmllbGRWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlJbmZvcm1hdGlvbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluYWxseQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZVByb3BlcnR5KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImpzcjMwMyB2YWxpZGF0aW9uIGZpbmlzaGVkIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNCZWFuVmFsaWRhdGlvbkNvbnN0cmFpbnRzKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuYnZpVXRpbHMuaGFzQmVhblZhbGlkYXRpb25Db25zdHJhaW50cyhwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRmllbGRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIC8qbm90IHVzZWQgeWV0IHN1cHBvcnRNdWx0aXBsZVZpb2xhdGlvbnNQZXJGaWVsZCgpKi8NCi0gICAgICAgIHRoaXMuYnZpVXRpbHMudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0TXVsdGlwbGVWaW9sYXRpb25zUGVyRmllbGQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQmVhblZhbGlkYXRpb25VdGlscy5zdXBwb3J0TXVsdGlwbGVWaW9sYXRpb25zUGVyRmllbGQoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBlLmcuIGV4dHJhY3QgZ3JvdXBzIGZvciB2YWxpZGF0aW9uDQotICAgICAqLw0KLSAgICBwcml2YXRlIGJvb2xlYW4gZXhlY3V0ZUdsb2JhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmV4ZWN1dGVHbG9iYWxCZWZvcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIHByb3BlcnR5SW5mb3JtYXRpb24sIEJlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxVdGlscy5leGVjdXRlR2xvYmFsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIHByb3BlcnR5SW5mb3JtYXRpb24sIEJlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg5M2UxOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC51dGlsLkJlYW5WYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5ncm91cHMuRGVmYXVsdDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5CZWFuRGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5FbGVtZW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBCZWFuVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzDQotew0KLSAgICBwcml2YXRlIExvZyBsb2dnZXI7DQotDQotICAgIEJlYW5WYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHMoTG9nIGxvZ2dlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7DQotICAgIH0NCi0NCi0gICAgUHJvcGVydHlEZXRhaWxzIGV4dHJhY3RQcm9wZXJ0eURldGFpbHMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyByZXN1bHQgPSBFeHRWYWxVdGlscy5nZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcigpLmV4dHJhY3QoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgLmdldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBpZiAocmVzdWx0LmdldEJhc2VPYmplY3QoKSA9PSBudWxsICYmIHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCJubyBiYXNlIG9iamVjdCBhdCAiICsgcmVzdWx0LmdldEtleSgpICsNCi0gICAgICAgICAgICAgICAgICAgICIgY29tcG9uZW50LWlkOiAiICsgdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0LmdldEJhc2VPYmplY3QoKSAhPSBudWxsID8gcmVzdWx0IDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIGluaXRDb21wb25lbnRXaXRoUHJvcGVydHlEZXRhaWxzKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBDbGFzc1tdIGZvdW5kR3JvdXBzID0gcmVzb2x2ZUdyb3VwcyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmIChmb3VuZEdyb3VwcyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoZm91bmRHcm91cHMubGVuZ3RoID09IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgZm91bmRHcm91cHMgPSBuZXcgQ2xhc3NbXXtEZWZhdWx0LmNsYXNzfTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIGVsZW1lbnREZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvckZvcigNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSk7DQotDQotICAgICAgICBpZiAoZWxlbWVudERlc2NyaXB0b3IgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhOw0KLQ0KLSAgICAgICAgZm9yIChDb25zdHJhaW50RGVzY3JpcHRvcjw/PiBjb25zdHJhaW50RGVzY3JpcHRvciA6DQotICAgICAgICAgICAgICAgIGVsZW1lbnREZXNjcmlwdG9yLmZpbmRDb25zdHJhaW50cygpLnVub3JkZXJlZEFuZE1hdGNoaW5nR3JvdXBzKGZvdW5kR3JvdXBzKS5nZXRDb25zdHJhaW50RGVzY3JpcHRvcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YSA9IHRyYW5zZm9ybUNvbnN0cmFpbnREZXNjcmlwdG9yVG9NZXRhRGF0YSgNCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnREZXNjcmlwdG9yLCBlbGVtZW50RGVzY3JpcHRvci5nZXRFbGVtZW50Q2xhc3MoKSk7DQotDQotICAgICAgICAgICAgaWYgKG1ldGFEYXRhICE9IG51bGwgJiYgIW1ldGFEYXRhLmlzRW1wdHkoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbmZpZ3VyZUNvbXBvbmVudFdpdGhNZXRhRGF0YShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJDb25zdHJhaW50RGVzY3JpcHRvciNpc1JlcG9ydEFzU2luZ2xlVmlvbGF0aW9uIikNCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybUNvbnN0cmFpbnREZXNjcmlwdG9yVG9NZXRhRGF0YSgNCi0gICAgICAgICAgICBDb25zdHJhaW50RGVzY3JpcHRvcjw/PiBjb25zdHJhaW50RGVzY3JpcHRvciwgQ2xhc3MgZWxlbWVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLQ0KLSAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IEV4dFZhbFV0aWxzLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgIG5ldyBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3koY29uc3RyYWludERlc2NyaXB0b3IsIGVsZW1lbnRDbGFzcykpOw0KLQ0KLSAgICAgICAgaWYgKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQucHV0QWxsKHRyYW5zZm9ybU1ldGFEYXRhKG1ldGFEYXRhVHJhbnNmb3JtZXIsIGNvbnN0cmFpbnREZXNjcmlwdG9yKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZighY29uc3RyYWludERlc2NyaXB0b3IuaXNSZXBvcnRBc1NpbmdsZVZpb2xhdGlvbigpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFNldDxDb25zdHJhaW50RGVzY3JpcHRvcjw/Pj4gY29tcG9zaW5nQ29uc3RyYWludHMgPSBjb25zdHJhaW50RGVzY3JpcHRvci5nZXRDb21wb3NpbmdDb25zdHJhaW50cygpOw0KLSAgICAgICAgICAgIGlmKGNvbXBvc2luZ0NvbnN0cmFpbnRzICE9IG51bGwgJiYgIWNvbXBvc2luZ0NvbnN0cmFpbnRzLmlzRW1wdHkoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXRBbGwodHJhbnNmb3JtQ29tcG9zaW5nQ29uc3RyYWludHMoY29tcG9zaW5nQ29uc3RyYWludHMsIGVsZW1lbnRDbGFzcykpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybUNvbXBvc2luZ0NvbnN0cmFpbnRzKA0KLSAgICAgICAgICAgIFNldDxDb25zdHJhaW50RGVzY3JpcHRvcjw/Pj4gY29tcG9zaW5nQ29uc3RyYWludHMsIENsYXNzIGVsZW1lbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIGZvcihDb25zdHJhaW50RGVzY3JpcHRvciBjb25zdHJhaW50RGVzY3JpcHRvciA6IGNvbXBvc2luZ0NvbnN0cmFpbnRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5wdXRBbGwodHJhbnNmb3JtQ29uc3RyYWludERlc2NyaXB0b3JUb01ldGFEYXRhKGNvbnN0cmFpbnREZXNjcmlwdG9yLCBlbGVtZW50Q2xhc3MpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKA0KLSAgICAgICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lciwgQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gY29uc3RyYWludERlc2NyaXB0b3IpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRW50cnkgZW50cnk7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdDsNCi0gICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZW50cnkgPSBuZXcgTWV0YURhdGFFbnRyeSgpOw0KLSAgICAgICAgZW50cnkuc2V0S2V5KGNvbnN0cmFpbnREZXNjcmlwdG9yLmdldEFubm90YXRpb24oKS5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7DQotICAgICAgICBlbnRyeS5zZXRWYWx1ZShjb25zdHJhaW50RGVzY3JpcHRvcik7DQotDQotICAgICAgICByZXN1bHQgPSBtZXRhRGF0YVRyYW5zZm9ybWVyLmNvbnZlcnRNZXRhRGF0YShlbnRyeSk7DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIGJvb2xlYW4gaGFzQmVhblZhbGlkYXRpb25Db25zdHJhaW50cyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscy5nZXRQcm9wZXJ0eURldGFpbHMocHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgICAgICByZXR1cm4gZ2V0RGVzY3JpcHRvckZvcihwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCksIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpKSAhPSBudWxsOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgYmFzZUJlYW5DbGFzcyA9IGdldEJhc2VDbGFzc1R5cGUocHJvcGVydHlJbmZvcm1hdGlvbik7DQotICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gZ2V0UHJvcGVydHlUb1ZhbGlkYXRlKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgQ2xhc3NbXSBncm91cHMgPSByZXNvbHZlR3JvdXBzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgaWYgKGdyb3VwcyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPiB2aW9sYXRpb25zID0gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZhbGlkYXRvckZhY3RvcnkoKQ0KLSAgICAgICAgICAgICAgICAudXNpbmdDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLm1lc3NhZ2VJbnRlcnBvbGF0b3IoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKSkNCi0gICAgICAgICAgICAgICAgLmdldFZhbGlkYXRvcigpDQotICAgICAgICAgICAgICAgIC52YWxpZGF0ZVZhbHVlKGJhc2VCZWFuQ2xhc3MsIHByb3BlcnR5TmFtZSwgY29udmVydGVkT2JqZWN0LCBncm91cHMpOw0KLQ0KLSAgICAgICAgaWYodmlvbGF0aW9ucyAhPSBudWxsICYmICF2aW9sYXRpb25zLmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBCZWFuVmFsaWRhdGlvblV0aWxzDQotICAgICAgICAgICAgICAgICAgICAucHJvY2Vzc0NvbnN0cmFpbnRWaW9sYXRpb25zKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgdmlvbGF0aW9ucywgdHJ1ZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBDbGFzcyBnZXRCYXNlQ2xhc3NUeXBlKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFByb3BlcnR5RGV0YWlscyhwcm9wZXJ0eUluZm9ybWF0aW9uKS5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQcm9wZXJ0eVRvVmFsaWRhdGUoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5SW5mb3JtYXRpb24pLmdldFByb3BlcnR5KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBDbGFzc1tdIHJlc29sdmVHcm91cHMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0R3JvdXBzKA0KLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5nZXRWaWV3SWQoKSwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBFbGVtZW50RGVzY3JpcHRvciBnZXREZXNjcmlwdG9yRm9yKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIEJlYW5EZXNjcmlwdG9yIGJlYW5EZXNjcmlwdG9yID0gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZhbGlkYXRvckZhY3RvcnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdG9yKCkuZ2V0Q29uc3RyYWludHNGb3JDbGFzcyh0YXJnZXRDbGFzcyk7DQotDQotICAgICAgICByZXR1cm4gYmVhbkRlc2NyaXB0b3IuZ2V0Q29uc3RyYWludHNGb3JQcm9wZXJ0eShwcm9wZXJ0eSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkYWUxMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBCZWFuVmFsaWRhdGlvbk1vZHVsZUtleQ0KLXsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0V4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0V4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2Y2YzkyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5tZXNzYWdlLmludGVycG9sYXRvci5EZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5tZXNzYWdlLmludGVycG9sYXRvci5FeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuTW9kZWxWYWxpZGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuTW9kZWxWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkdyb3VwU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5NZXNzYWdlSW50ZXJwb2xhdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb247DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yRmFjdG9yeTsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotcHVibGljIGNsYXNzIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBpbXBsZW1lbnRzIEdyb3VwU3RvcmFnZSwgTW9kZWxWYWxpZGF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5jbGFzcy5nZXROYW1lKCkgKyAiOktFWSI7DQotDQotICAgIHByaXZhdGUgTWVzc2FnZUludGVycG9sYXRvciBkZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcjsNCi0NCi0gICAgcHJpdmF0ZSBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOw0KLQ0KLSAgICBwcml2YXRlIEdyb3VwU3RvcmFnZSBncm91cFN0b3JhZ2U7DQotDQotICAgIHByaXZhdGUgTW9kZWxWYWxpZGF0aW9uU3RvcmFnZSBtb2RlbFZhbGlkYXRpb25TdG9yYWdlOw0KLQ0KLSAgICBwcml2YXRlIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCgpDQotICAgIHsNCi0gICAgICAgIGluaXRHcm91cFN0b3JhZ2UoKTsNCi0gICAgICAgIGluaXRNb2RlbFZhbGlkYXRpb25TdG9yYWdlKCk7DQotDQotICAgICAgICBpbml0TWVzc2FnZVJlc29sdmVyKCk7DQotICAgICAgICBpbml0TWVzc2FnZUludGVycG9sYXRvcigpOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyBzdGF0aWMgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGdldEN1cnJlbnRJbnN0YW5jZSgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7DQotDQotICAgICAgICBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgY3VycmVudENvbnRleHQgPSAoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0KXJlcXVlc3RNYXAuZ2V0KEtFWSk7DQotDQotICAgICAgICBpZihjdXJyZW50Q29udGV4dCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gbmV3IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCgpOw0KLSAgICAgICAgICAgIHJlcXVlc3RNYXAucHV0KEtFWSwgY3VycmVudENvbnRleHQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRDb250ZXh0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWxpZGF0b3JGYWN0b3J5IGdldFZhbGlkYXRvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgdmFsaWRhdG9yRmFjdG9yeSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KFZhbGlkYXRvckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGlmKHZhbGlkYXRvckZhY3RvcnkgaW5zdGFuY2VvZiBWYWxpZGF0b3JGYWN0b3J5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoVmFsaWRhdG9yRmFjdG9yeSl2YWxpZGF0b3JGYWN0b3J5Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oImZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0IGJ2IHZhbGlkYXRvciBmYWN0b3J5Iik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gVmFsaWRhdGlvbi5idWlsZERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1lc3NhZ2VJbnRlcnBvbGF0b3IgZ2V0TWVzc2FnZUludGVycG9sYXRvcigpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMubWVzc2FnZVJlc29sdmVyICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlcih0aGlzLmRlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yLCB0aGlzLm1lc3NhZ2VSZXNvbHZlcik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRHcm91cChDbGFzcyBncm91cENsYXNzLCBTdHJpbmcgdmlld0lkLCBTdHJpbmcgY29tcG9uZW50SWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZ3JvdXBTdG9yYWdlLmFkZEdyb3VwKGdyb3VwQ2xhc3MsIHZpZXdJZCwgY29tcG9uZW50SWQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlc3RyaWN0R3JvdXAoQ2xhc3MgZ3JvdXBDbGFzcywgU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNvbXBvbmVudElkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmdyb3VwU3RvcmFnZS5yZXN0cmljdEdyb3VwKGdyb3VwQ2xhc3MsIHZpZXdJZCwgY29tcG9uZW50SWQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzc1tdIGdldEdyb3VwcyhTdHJpbmcgdmlld0lkLCBTdHJpbmcgY29tcG9uZW50SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmdyb3VwU3RvcmFnZS5nZXRHcm91cHModmlld0lkLCBjb21wb25lbnRJZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksIFN0cmluZyB2aWV3SWQsIFVJQ29tcG9uZW50IGNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tb2RlbFZhbGlkYXRpb25TdG9yYWdlLmFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2aWV3SWQsIGNvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXNUb1ZhbGlkYXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5nZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0R3JvdXBTdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5ncm91cFN0b3JhZ2UgPSBFeHRWYWxVdGlscw0KLSAgICAgICAgICAgICAgICAuZ2V0U3RvcmFnZShHcm91cFN0b3JhZ2UuY2xhc3MsIEJlYW5WYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRNb2RlbFZhbGlkYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tb2RlbFZhbGlkYXRpb25TdG9yYWdlID0gRXh0VmFsVXRpbHMuDQotICAgICAgICAgICAgICAgIGdldFN0b3JhZ2UoTW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcywgTW9kZWxWYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZvdW5kQmVhbiA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbihNZXNzYWdlSW50ZXJwb2xhdG9yLmNsYXNzLmdldE5hbWUoKS5yZXBsYWNlKCIuIiwgIl8iKSk7DQotDQotICAgICAgICBpZihmb3VuZEJlYW4gaW5zdGFuY2VvZiBNZXNzYWdlSW50ZXJwb2xhdG9yKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuZGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IgPSAoTWVzc2FnZUludGVycG9sYXRvcilmb3VuZEJlYW47DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5kZWZhdWx0TWVzc2FnZUludGVycG9sYXRvciA9IG5ldyBEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcigNCi0gICAgICAgICAgICAgICAgVmFsaWRhdGlvbi5idWlsZERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdE1lc3NhZ2VSZXNvbHZlcigpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZVJlc29sdmVyID0gRXh0VmFsVXRpbHMuZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KGdldEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3koKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0QmVhblZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5KG51bGwsIG51bGwpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzY5ZDMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudAotICAgICAgICAuQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgeC54LjMKLSAqLwotQEludm9jYXRpb25PcmRlcigyMDApCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVJlcXVpcmVkQXR0cmlidXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCFFeHRWYWxVdGlscy5pbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZihCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSB8fAotICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMoaXNDb21wb25lbnRSZXF1aXJlZCh1aUNvbXBvbmVudCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDk2MDNiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9BRERJVElPTkFMX0dST1VQX1ZBTElEQVRJT05fQU5OT1RBVElPTlMgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfQURESVRJT05BTF9HUk9VUF9WQUxJREFUSU9OX0FOTk9UQVRJT05TIik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL0JlYW5WYWxpZGF0aW9uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9CZWFuVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzI0MmM1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL0JlYW5WYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uZ3JvdXBzLkRlZmF1bHQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgVFlQRX0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLUBEb2N1bWVudGVkDQotcHVibGljIEBpbnRlcmZhY2UgQmVhblZhbGlkYXRpb24NCi17DQotICAgIFN0cmluZ1tdIHZpZXdJZHMoKSBkZWZhdWx0ICIqIjsNCi0NCi0gICAgQ2xhc3NbXSB1c2VHcm91cHMoKSBkZWZhdWx0IERlZmF1bHQuY2xhc3M7DQotDQotICAgIENsYXNzW10gcmVzdHJpY3RHcm91cHMoKSBkZWZhdWx0IHt9Ow0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkhJR0gsIGRlc2NyaXB0aW9uID0gInN1cHBvcnQgcHJvcGVydHkgY2hhaW4gc3ludGF4IikNCi0gICAgU3RyaW5nW10gY29uZGl0aW9ucygpIGRlZmF1bHQgIiN7dHJ1ZX0iOw0KLQ0KLSAgICBNb2RlbFZhbGlkYXRpb24gbW9kZWxWYWxpZGF0aW9uKCkgZGVmYXVsdCBATW9kZWxWYWxpZGF0aW9uOw0KLSAgICANCi0gICAgQFJldGVudGlvbihSVU5USU1FKSBzdGF0aWMgQGludGVyZmFjZSBMaXN0DQotICAgIHsNCi0gICAgICAgIEJlYW5WYWxpZGF0aW9uW10gdmFsdWUoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9Nb2RlbFZhbGlkYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL01vZGVsVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTZlNjZiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL01vZGVsVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLQ0KLUBUYXJnZXQoe01FVEhPRCwgRklFTEQsIFRZUEV9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1ARG9jdW1lbnRlZA0KLXB1YmxpYyBAaW50ZXJmYWNlIE1vZGVsVmFsaWRhdGlvbg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9UQVJHRVQgPSAiYmFzZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTUVTU0FHRSA9ICJvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYnZfbWVzc2FnZSI7DQotDQotICAgIGJvb2xlYW4gaXNBY3RpdmUoKSBkZWZhdWx0IGZhbHNlOw0KLQ0KLSAgICBib29sZWFuIGRpc3BsYXlJbmxpbmUoKSBkZWZhdWx0IGZhbHNlOw0KLQ0KLSAgICBTdHJpbmdbXSB2YWxpZGF0aW9uVGFyZ2V0cygpIGRlZmF1bHQgREVGQVVMVF9UQVJHRVQ7DQotDQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCBERUZBVUxUX01FU1NBR0U7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThmMzcyMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdEdyb3VwQ29udHJvbGxlclNjYW5uaW5nRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLmV4dHJhY3RvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLkRlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotcHVibGljIGNsYXNzIERlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3RvciBleHRlbmRzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcg0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgUHJvcGVydHlEZXRhaWxzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG9iamVjdC5nZXRDbGFzcygpICsgIiBpcyBub3QgYSAiICsgUHJvcGVydHlEZXRhaWxzLmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gKFByb3BlcnR5RGV0YWlscylvYmplY3Q7DQotDQotICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOw0KLSAgICAgICAgDQotICAgICAgICAvKg0KLSAgICAgICAgICogZmluZCBhbmQgYWRkIGFubm90YXRpb25zDQotICAgICAgICAgKi8NCi0gICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0Fic3RyYWN0QmVhblZhbGlkYXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YjNhNDguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0Fic3RyYWN0QmVhblZhbGlkYXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwucGF5bG9hZC5WaW9sYXRpb25TZXZlcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QmVhblZhbGlkYXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyPFQgZXh0ZW5kcyBBbm5vdGF0aW9uPiBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIENvbnN0cmFpbnREZXNjcmlwdG9yPD8gZXh0ZW5kcyBUPiBjb25zdHJhaW50RGVzY3JpcHRvciA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoQ29uc3RyYWludERlc2NyaXB0b3IuY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYoaXNDbGllbnRTaWRlVmFsaWRhdGlvbkVuYWJsZWQoY29uc3RyYWludERlc2NyaXB0b3IpICYmIGlzQmxvY2tpbmdDb25zdHJhaW50KGNvbnN0cmFpbnREZXNjcmlwdG9yKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY29udmVydENvbnN0cmFpbnREZXNjcmlwdG9yKChDb25zdHJhaW50RGVzY3JpcHRvcjxUPiljb25zdHJhaW50RGVzY3JpcHRvcik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDbGllbnRTaWRlVmFsaWRhdGlvbkVuYWJsZWQoQ29uc3RyYWludERlc2NyaXB0b3I8PyBleHRlbmRzIFQ+IGNvbnN0cmFpbnREZXNjcmlwdG9yKQ0KLSAgICB7DQotICAgICAgICBmb3IoQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+IHBheWxvYWQgOiBjb25zdHJhaW50RGVzY3JpcHRvci5nZXRQYXlsb2FkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNCbG9ja2luZ0NvbnN0cmFpbnQoQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gY29uc3RyYWludERlc2NyaXB0b3IpDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZSB0ZXN0TWVzc2FnZSA9IG5ldyBGYWNlc01lc3NhZ2UoKTsNCi0gICAgICAgIHRlc3RNZXNzYWdlLnNldFNldmVyaXR5KFZpb2xhdGlvblNldmVyaXR5LkVycm9yLlZBTFVFKTsNCi0NCi0gICAgICAgIGZvciAoQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+IHBheWxvYWQgOiBjb25zdHJhaW50RGVzY3JpcHRvci5nZXRQYXlsb2FkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShwYXlsb2FkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRlc3RNZXNzYWdlLnNldFNldmVyaXR5KFZpb2xhdGlvblNldmVyaXR5Lldhcm4uVkFMVUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKFZpb2xhdGlvblNldmVyaXR5LkluZm8uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShwYXlsb2FkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRlc3RNZXNzYWdlLnNldFNldmVyaXR5KFZpb2xhdGlvblNldmVyaXR5LkluZm8uVkFMVUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKFZpb2xhdGlvblNldmVyaXR5LkZhdGFsLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0ZXN0TWVzc2FnZS5zZXRTZXZlcml0eShWaW9sYXRpb25TZXZlcml0eS5GYXRhbC5WQUxVRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLnNldmVyaXR5QmxvY2tzU3VibWl0Rm9yQ29tcG9uZW50SWQobnVsbCwgdGVzdE1lc3NhZ2UpOw0KLSAgICB9DQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRDb25zdHJhaW50RGVzY3JpcHRvcihDb25zdHJhaW50RGVzY3JpcHRvcjxUPiBjb25zdHJhaW50RGVzY3JpcHRvcik7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ob3ROdWxsTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL05vdE51bGxNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYjBlNjUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL05vdE51bGxNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdEJlYW5WYWxpZGF0aW9uTWV0YURhdGFUcmFuc2Zvcm1lcjxOb3ROdWxsPg0KLXsNCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydENvbnN0cmFpbnREZXNjcmlwdG9yKENvbnN0cmFpbnREZXNjcmlwdG9yPE5vdE51bGw+IGNvbnN0cmFpbnREZXNjcmlwdG9yKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIGlmKEV4dFZhbFV0aWxzLmludGVycHJldEVtcHR5U3RyaW5nVmFsdWVzQXNOdWxsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1N0cmluZ1NpemVNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU3RyaW5nU2l6ZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhjYWVlMi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU3RyaW5nU2l6ZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotcHVibGljIGNsYXNzIFN0cmluZ1NpemVNZXRhRGF0YVRyYW5zZm9ybWVyIGV4dGVuZHMgQWJzdHJhY3RCZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXI8U2l6ZT4NCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRDb25zdHJhaW50RGVzY3JpcHRvcihDb25zdHJhaW50RGVzY3JpcHRvcjxTaXplPiBjb25zdHJhaW50RGVzY3JpcHRvcikNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBTaXplIGFubm90YXRpb24gPSBjb25zdHJhaW50RGVzY3JpcHRvci5nZXRBbm5vdGF0aW9uKCk7DQotDQotICAgICAgICBpbnQgbWluaW11bSA9IGFubm90YXRpb24ubWluKCk7DQotDQotICAgICAgICBpZihtaW5pbXVtICE9IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEgsIG1pbmltdW0pOw0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSF9ERUZBVUxULCBtaW5pbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGludCBtYXhpbXVtID0gYW5ub3RhdGlvbi5tYXgoKTsNCi0gICAgICAgIGlmKG1heGltdW0gIT0gSW50ZWdlci5NQVhfVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIX0RFRkFVTFQsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNmJkYmQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyDQotICAgICAgICAuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIGlmKHNvdXJjZSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgYmVhblZhbGlkYXRpb25BZGFwdGVyID0NCi0gICAgICAgICAgICAgICAgICAgIChCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kpc291cmNlOw0KLQ0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVCZWFuVmFsaWRhdGlvblRyYW5zZm9ybWVyTmFtZShiZWFuVmFsaWRhdGlvbkFkYXB0ZXIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkICBhYnN0cmFjdCBTdHJpbmcgY3JlYXRlQmVhblZhbGlkYXRpb25UcmFuc2Zvcm1lck5hbWUoDQotICAgICAgICAgICAgQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvTm90TnVsbE5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvTm90TnVsbE5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUxYmVmYi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL05vdE51bGxOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk5vdE51bGxNZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuTmVzdGVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBOZXN0ZWQNCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIE5vdE51bGxOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZUJlYW5WYWxpZGF0aW9uVHJhbnNmb3JtZXJOYW1lKEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSBhZGFwdGVyKQ0KLSAgICB7DQotICAgICAgICBpZihOb3ROdWxsLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoYWRhcHRlci5nZXRDb25zdHJhaW50RGVzY3JpcHRvcigpLmdldEFubm90YXRpb24oKS5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIE5vdE51bGxNZXRhRGF0YVRyYW5zZm9ybWVyLmNsYXNzLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2l6ZU5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2l6ZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhNTYxNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpemVOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLk5lc3RlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5TdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBOZXN0ZWQNCi1ASW52b2NhdGlvbk9yZGVyKDEwMSkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIFNpemVOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZUJlYW5WYWxpZGF0aW9uVHJhbnNmb3JtZXJOYW1lKEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSBhZGFwdGVyKQ0KLSAgICB7DQotICAgICAgICBpZihTaXplLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoYWRhcHRlci5nZXRDb25zdHJhaW50RGVzY3JpcHRvcigpLmdldEFubm90YXRpb24oKS5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSkgJiYNCi0gICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoYWRhcHRlci5nZXRFbGVtZW50Q2xhc3MoKS5nZXROYW1lKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBTdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lci5jbGFzcy5nZXROYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvcGF5bG9hZC9EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wYXlsb2FkL0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjJkMjJmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wYXlsb2FkL0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwucGF5bG9hZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24gZXh0ZW5kcyBQYXlsb2FkDQotew0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvcGF5bG9hZC9WaW9sYXRpb25TZXZlcml0eS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3BheWxvYWQvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4OGIyZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvcGF5bG9hZC9WaW9sYXRpb25TZXZlcml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwucGF5bG9hZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZpb2xhdGlvblNldmVyaXR5DQotew0KLSAgICBpbnRlcmZhY2UgSW5mbyBleHRlbmRzIFBheWxvYWQNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFZBTFVFID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0lORk87DQotICAgIH0NCi0NCi0gICAgaW50ZXJmYWNlIFdhcm4gZXh0ZW5kcyBQYXlsb2FkDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBWQUxVRSA9IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOOw0KLSAgICB9DQotDQotICAgIGludGVyZmFjZSBFcnJvciBleHRlbmRzIFBheWxvYWQNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFZBTFVFID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SOw0KLSAgICB9DQotDQotICAgIGludGVyZmFjZSBGYXRhbCBleHRlbmRzIFBheWxvYWQNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFZBTFVFID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdGFydHVwL0JlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RhcnR1cC9CZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzE3ZWY3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdGFydHVwL0JlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuQmVhblZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyLlNpemVOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIuTm90TnVsbE5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLk1vZGVsVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UubWFwcGVyLkJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5tYXBwZXIuTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5Hcm91cFN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXJIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTAyNTc0ODM5OTg3NjgzMzM5NEw7DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlclZhbGlkYXRvckZhY3RvcnkoKTsNCi0gICAgICAgIHJlZ2lzdGVyQmVhblZhbGlkYXRpb25JbnRlcmNlcHRvcigpOw0KLSAgICAgICAgcmVnaXN0ZXJNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpOw0KLSAgICAgICAgcmVnaXN0ZXJHcm91cFN0b3JhZ2VOYW1lTWFwcGVyKCk7DQotICAgICAgICByZWdpc3Rlck1vZGVsVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyKCk7DQotICAgICAgICByZWdpc3Rlck1vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIoKTsNCi0gICAgICAgIHJlZ2lzdGVyQ29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJWYWxpZGF0b3JGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoDQotICAgICAgICAgICAgICAgIFZhbGlkYXRvckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpLCBWYWxpZGF0aW9uLmJ1aWxkRGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyQmVhblZhbGlkYXRpb25JbnRlcmNlcHRvcigpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgQmVhblZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlck1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKG5ldyBTaXplTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcihuZXcgTm90TnVsbE5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJHcm91cFN0b3JhZ2VOYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgU3RvcmFnZU1hbmFnZXIgc3RvcmFnZU1hbmFnZXIgPSBnZXRTdG9yYWdlTWFuYWdlckhvbGRlcigpLmdldFN0b3JhZ2VNYW5hZ2VyKEdyb3VwU3RvcmFnZS5jbGFzcyk7DQotDQotICAgICAgICBpZiAoc3RvcmFnZU1hbmFnZXIgaW5zdGFuY2VvZiBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkpDQotICAgICAgICB7DQotICAgICAgICAgICAgKChBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8U3RyaW5nPikgc3RvcmFnZU1hbmFnZXIpDQotICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihzdG9yYWdlTWFuYWdlci5nZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgIiBoYXMgdG8gaW1wbGVtZW50IEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeSAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICIgY291bGRuJ3QgcmVnaXN0ZXIgIiArIEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlck1vZGVsVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyIG1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyID0gbmV3IERlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlcigpOw0KLSAgICAgICAgbW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIucmVnaXN0ZXIobmV3IE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgZ2V0U3RvcmFnZU1hbmFnZXJIb2xkZXIoKS5zZXRTdG9yYWdlTWFuYWdlcihNb2RlbFZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLCBtb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlciwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcigpDQotICAgIHsNCi0gICAgICAgIEpzZlV0aWxzLnJlZ2lzdGVyUGhhc2VMaXN0ZW5lcihuZXcgTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckNvbXBvbmVudEluaXRpYWxpemVycygpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZENvbXBvbmVudEluaXRpYWxpemVyKG5ldyBIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0b3JhZ2VNYW5hZ2VySG9sZGVyIGdldFN0b3JhZ2VNYW5hZ2VySG9sZGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwgU3RvcmFnZU1hbmFnZXJIb2xkZXIuY2xhc3MpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRCZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDVhMDZjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRCZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0R3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbiBmb3IgYmVhbi12YWxpZGF0aW9uIGdyb3Vwcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRCZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZSBleHRlbmRzIERlZmF1bHRHcm91cFN0b3JhZ2UNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgQ2xhc3NbXSBnZXRHcm91cHMoU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNvbXBvbmVudElkKQ0KLSAgICB7DQotICAgICAgICBDbGFzc1tdIHJlc3VsdCA9IHN1cGVyLmdldEdyb3Vwcyh2aWV3SWQsIGNvbXBvbmVudElkKTsNCi0NCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vdGhlIGRlZmF1bHQgZ3JvdXAgd2lsbCBiZSB2YWxpZGF0ZWQgYXV0b21hdGljYWxseQ0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3NbXSB7fTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMWY2MzMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Hcm91cFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogc3RvcmFnZSBpbXBsZW1lbnRhdGlvbiBmb3IgbW9kZWwtdmFsaWRhdGlvbiBlbnRyaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UgaW1wbGVtZW50cyBNb2RlbFZhbGlkYXRpb25TdG9yYWdlDQotew0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+PiBtb2RlbFZhbGlkYXRpb25FbnRyaWVzID0NCi0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+PigpOw0KLQ0KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBjb21wb25lbnRzT2ZSZXF1ZXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KA0KLSAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBTdHJpbmcgdmlld0lkLCBVSUNvbXBvbmVudCBjb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LnNldENvbXBvbmVudChjb21wb25lbnQpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGNvbXBvbmVudElkID0gbnVsbDsNCi0NCi0gICAgICAgIGlmKGNvbXBvbmVudCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNvbXBvbmVudElkID0gY29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzT2ZSZXF1ZXN0LmFkZChjb21wb25lbnRJZCk7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QgPQ0KLSAgICAgICAgICAgICAgICB0aGlzLm1vZGVsVmFsaWRhdGlvbkVudHJpZXMuZ2V0KEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBjb21wb25lbnRJZCkpOw0KLQ0KLSAgICAgICAgaWYobW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0ID0gbmV3IEFycmF5TGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4oKTsNCi0gICAgICAgICAgICB0aGlzLm1vZGVsVmFsaWRhdGlvbkVudHJpZXMucHV0KEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBjb21wb25lbnRJZCksIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZighbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LmNvbnRhaW5zKG1vZGVsVmFsaWRhdGlvbkVudHJ5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QuYWRkKG1vZGVsVmFsaWRhdGlvbkVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllc1RvVmFsaWRhdGUoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmlld0lkID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0Vmlld0lkKCk7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PigpOw0KLQ0KLSAgICAgICAgLy9hZGQgZW50cmllcyBmb3Igc3BlY2lmaWMgY29tcG9uZW50cw0KLSAgICAgICAgZm9yKFN0cmluZyBjdXJyZW50Q2xpZW50SWQgOiB0aGlzLmNvbXBvbmVudHNPZlJlcXVlc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmFkZEFsbChnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzKHZpZXdJZCwgY3VycmVudENsaWVudElkKSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2FkZCBlbnRyaWVzIGZvciB0aGUgd2hvbGUgcGFnZQ0KLSAgICAgICAgcmVzdWx0LmFkZEFsbChnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzKHZpZXdJZCkpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGJ1aWxkTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KA0KLSAgICAgICAgICAgIFN0cmluZyBrZXksIE1hcDxTdHJpbmcsIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+PiBncm91cFN0b3JhZ2UpDQotICAgIHsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGxpc3Q7DQotDQotICAgICAgICBpZihrZXkgIT0gbnVsbCAmJiBrZXkuZW5kc1dpdGgoIioiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4oKTsNCi0gICAgICAgICAgICBmb3IoTWFwLkVudHJ5PFN0cmluZyxMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5Pj4gZW50cnkgOiBncm91cFN0b3JhZ2UuZW50cnlTZXQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldEtleSgpLnN1YnN0cmluZygwLCBlbnRyeS5nZXRLZXkoKS5pbmRleE9mKCJAIikpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhrZXkuc3Vic3RyaW5nKDAsIGtleS5pbmRleE9mKCJAIikpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGRBbGwoZW50cnkuZ2V0VmFsdWUoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGxpc3Q7DQotICAgICAgICB9DQotDQotICAgICAgICBsaXN0ID0gZ3JvdXBTdG9yYWdlLmdldChrZXkpOw0KLSAgICAgICAgcmV0dXJuIChsaXN0ICE9IG51bGwpID8gbGlzdCA6IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzKFN0cmluZyB2aWV3SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzKHZpZXdJZCwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzKFN0cmluZyB2aWV3SWQsIFN0cmluZyBjb21wb25lbnRJZCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5tb2RlbFZhbGlkYXRpb25FbnRyaWVzLnNpemUoKSA8IDEpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2FkZCBmb3VuZCBncm91cHMNCi0gICAgICAgIFN0cmluZyBrZXk7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHRMaXN0Rm9yUGFnZSA9IG51bGw7DQotDQotICAgICAgICBpZighIioiLmVxdWFscyhjb21wb25lbnRJZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAga2V5ID0gR3JvdXBVdGlscy5nZXRHcm91cEtleSh2aWV3SWQsIG51bGwpOw0KLSAgICAgICAgICAgIHJlc3VsdExpc3RGb3JQYWdlID0NCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KGtleSwgdGhpcy5tb2RlbFZhbGlkYXRpb25FbnRyaWVzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGtleSA9IEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBjb21wb25lbnRJZCk7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHRMaXN0Rm9yQ29tcG9uZW50ID0NCi0gICAgICAgICAgICAgICAgYnVpbGRNb2RlbFZhbGlkYXRpb25FbnRyeUxpc3Qoa2V5LCB0aGlzLm1vZGVsVmFsaWRhdGlvbkVudHJpZXMpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0TGlzdEZvclBhZ2UgPT0gbnVsbCB8fCByZXN1bHRMaXN0Rm9yUGFnZS5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdExpc3RGb3JDb21wb25lbnQ7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKHJlc3VsdExpc3RGb3JDb21wb25lbnQuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRMaXN0Rm9yUGFnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vbWVyZ2UgcmVzdWx0cw0KLSAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbWVyZ2VkUmVzdWx0ID0gbmV3IEFycmF5TGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4oKTsNCi0gICAgICAgIG1lcmdlZFJlc3VsdC5hZGRBbGwocmVzdWx0TGlzdEZvclBhZ2UpOw0KLSAgICAgICAgbWVyZ2VkUmVzdWx0LmFkZEFsbChyZXN1bHRMaXN0Rm9yQ29tcG9uZW50KTsNCi0gICAgICAgIHJldHVybiBtZXJnZWRSZXN1bHQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgzMTAxMi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBtb2RlbC12YWxpZGF0aW9uIGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXINCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPE1vZGVsVmFsaWRhdGlvblN0b3JhZ2U+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX01PREVMX1ZBTElEQVRJT046S0VZIjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25FbnRyeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvTW9kZWxWYWxpZGF0aW9uRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIxOGY2Ni4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25FbnRyeQ0KLXsNCi0gICAgcHJpdmF0ZSBVSUNvbXBvbmVudCBjb21wb25lbnQ7DQotICAgIHByaXZhdGUgTW9kZWxWYWxpZGF0aW9uIG1ldGFEYXRhOw0KLSAgICBwcml2YXRlIExpc3Q8Q2xhc3M+IGdyb3VwcyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgIHByaXZhdGUgTGlzdDxPYmplY3Q+IHZhbGlkYXRpb25UYXJnZXRzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7DQotICAgIHByaXZhdGUgT2JqZWN0IG1ldGFEYXRhU291cmNlT2JqZWN0Ow0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRHcm91cChDbGFzcyBncm91cCkNCi0gICAgew0KLSAgICAgICAgaWYoIXRoaXMuZ3JvdXBzLmNvbnRhaW5zKGdyb3VwKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighKHRoaXMuZ3JvdXBzIGluc3RhbmNlb2YgQXJyYXlMaXN0KSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IG5ld0dyb3VwTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgICAgICAgICAgICAgIGZvcihDbGFzcyBjdXJyZW50Q2xhc3MgOiB0aGlzLmdyb3VwcykNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbmV3R3JvdXBMaXN0LmFkZChjdXJyZW50Q2xhc3MpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBzID0gbmV3R3JvdXBMaXN0Ow0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB0aGlzLmdyb3Vwcy5hZGQoZ3JvdXApOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUdyb3VwKENsYXNzIGdyb3VwKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmdyb3Vwcy5yZW1vdmUoZ3JvdXApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZFZhbGlkYXRpb25UYXJnZXQoT2JqZWN0IHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgaWYoIXRoaXMudmFsaWRhdGlvblRhcmdldHMuY29udGFpbnModGFyZ2V0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighKHRoaXMudmFsaWRhdGlvblRhcmdldHMgaW5zdGFuY2VvZiBBcnJheUxpc3QpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTGlzdDxPYmplY3Q+IHZhbGlkYXRpb25UYXJnZXRMaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7DQotDQotICAgICAgICAgICAgICAgIGZvcihPYmplY3QgY3VycmVudFRhcmdldCA6IHRoaXMudmFsaWRhdGlvblRhcmdldHMpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXRMaXN0LmFkZChjdXJyZW50VGFyZ2V0KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25UYXJnZXRzID0gdmFsaWRhdGlvblRhcmdldExpc3Q7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvblRhcmdldHMuYWRkKHRhcmdldCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgVUlDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnQoVUlDb21wb25lbnQgY29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uIGdldE1ldGFEYXRhKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhKE1vZGVsVmFsaWRhdGlvbiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YSA9IG1ldGFEYXRhOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzc1tdIGdldEdyb3VwcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmdyb3Vwcy50b0FycmF5KG5ldyBDbGFzc1t0aGlzLmdyb3Vwcy5zaXplKCldKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRHcm91cHMoTGlzdDxDbGFzcz4gZ3JvdXBzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmdyb3VwcyA9IGdyb3VwczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGdldFZhbGlkYXRpb25UYXJnZXRzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25UYXJnZXRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25UYXJnZXRzKExpc3Q8T2JqZWN0PiB2YWxpZGF0aW9uVGFyZ2V0cykNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uVGFyZ2V0cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0TWV0YURhdGFTb3VyY2VPYmplY3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFTb3VyY2VPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFTb3VyY2VPYmplY3QoT2JqZWN0IG1ldGFEYXRhU291cmNlT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhU291cmNlT2JqZWN0ID0gbWV0YURhdGFTb3VyY2VPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKHRoaXMgPT0gbykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgdGhhdCA9IChNb2RlbFZhbGlkYXRpb25FbnRyeSkgbzsNCi0NCi0gICAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCA/ICFjb21wb25lbnQuZXF1YWxzKHRoYXQuY29tcG9uZW50KSA6IHRoYXQuY29tcG9uZW50ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFncm91cHMuZXF1YWxzKHRoYXQuZ3JvdXBzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIXZhbGlkYXRpb25UYXJnZXRzLmVxdWFscyh0aGF0LnZhbGlkYXRpb25UYXJnZXRzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIGludCByZXN1bHQgPSBjb21wb25lbnQgIT0gbnVsbCA/IGNvbXBvbmVudC5oYXNoQ29kZSgpIDogMDsNCi0gICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgZ3JvdXBzLmhhc2hDb2RlKCk7DQotICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIHZhbGlkYXRpb25UYXJnZXRzLmhhc2hDb2RlKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY5MTc3My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogc3VnZ2VzdGVkIGludGVyZmFjZSBmb3IgYSBtb2RlbC12YWxpZGF0aW9uIHN0b3JhZ2UNCi0gKiA8cC8+DQotICogaXQgYWxsb3dzIHRvIG1hbmFnZSBtb2RlbC12YWxpZGF0aW9uLWVudHJpZXMgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHZvaWQgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoDQotICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksIFN0cmluZyB2aWV3SWQsIFVJQ29tcG9uZW50IGNvbXBvbmVudCk7DQotDQotICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXNUb1ZhbGlkYXRlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9CZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9CZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA1NWI3Zi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9tYXBwZXIvQmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uQmVhblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuRGVmYXVsdEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEJlYW5WYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoa2V5KSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9tYXBwZXIvTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzhmZmIxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5EZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKE1vZGVsVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGtleSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9CZWFuVmFsaWRhdGlvblV0aWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9CZWFuVmFsaWRhdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ODA5NzUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvQmVhblZhbGlkYXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLm1lc3NhZ2UuRmFjZXNNZXNzYWdlSG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5leHRyYWN0b3IuRGVmYXVsdEdyb3VwQ29udHJvbGxlclNjYW5uaW5nRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLlZpb2xhdGlvblNldmVyaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLk1vZGVsVmFsaWRhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkVMSGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvblV0aWxzDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coQmVhblZhbGlkYXRpb25VdGlscy5jbGFzcyk7DQotICAgIHByaXZhdGUgc3RhdGljIExhYmVsZWRNZXNzYWdlSW50ZXJuYWxzIGxhYmVsZWRNZXNzYWdlSW50ZXJuYWxzID0gbmV3IExhYmVsZWRNZXNzYWdlSW50ZXJuYWxzKCk7DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuSElHSCwgZGVzY3JpcHRpb24gPSAidXNlIGl0IC0gYWxzbyBpbiBNb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyIiArDQotICAgICAgICAgICAgImF0dGVudGlvbjogb25seSBhZGQgb25lIG1lc3NhZ2UgcGVyIGNsaWVudCBpZCIpDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdXBwb3J0TXVsdGlwbGVWaW9sYXRpb25zUGVyRmllbGQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkFDVElWQVRFX01VTFRJUExFX1ZJT0xBVElPTl9NRVNTQUdFU19QRVJfRklFTEQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNZXRhRGF0YVRvQ29udGV4dChVSUNvbXBvbmVudCBjb21wb25lbnQsIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZ1tdIGtleSA9IHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKS5zcGxpdCgiXFwuIik7DQotDQotICAgICAgICBPYmplY3QgZmlyc3RCZWFuID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKGtleVswXSk7DQotDQotICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgIC8vZXh0cmFjdCBidi1jb250cm9sbGVyLWFubm90YXRpb24gb2YNCi0NCi0gICAgICAgIC8vZmlyc3QgYmVhbg0KLSAgICAgICAgcHJvY2Vzc0NsYXNzKGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotDQotICAgICAgICAvL2ZpcnN0IHByb3BlcnR5DQotICAgICAgICBwcm9jZXNzRmllbGRzQW5kUHJvcGVydGllcyhrZXlbMF0gKyAiLiIgKyBrZXlbMV0sDQotICAgICAgICAgICAgICAgIGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAga2V5WzFdLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgIC8vYmFzZSBvYmplY3QgKG9mIHRhcmdldCBwcm9wZXJ0eSkNCi0gICAgICAgIHByb2Nlc3NDbGFzcyhwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgIC8vbGFzdCBwcm9wZXJ0eQ0KLSAgICAgICAgcHJvY2Vzc0ZpZWxkc0FuZFByb3BlcnRpZXMoDQotICAgICAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKSwNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCA9IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50Vmlld0lkID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0Vmlld0lkKCk7DQotDQotICAgICAgICBTdHJpbmcgY2xpZW50SWQgPSBjb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKTsNCi0NCi0gICAgICAgIHByb2Nlc3NGb3VuZEdyb3VwcyhleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQsIGN1cnJlbnRWaWV3SWQsIGNsaWVudElkLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbik7DQotDQotICAgICAgICBwcm9jZXNzUmVzdHJpY3RlZEdyb3VwcyhleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQsIGN1cnJlbnRWaWV3SWQsIGNsaWVudElkLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgIGluaXRNb2RlbFZhbGlkYXRpb24oZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LCBjdXJyZW50Vmlld0lkLCBjb21wb25lbnQsIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LCByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NDbGFzcyhPYmplY3Qgb2JqZWN0VG9JbnNwZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBDbGFzcyBjbGFzc1RvSW5zcGVjdCA9IG9iamVjdFRvSW5zcGVjdC5nZXRDbGFzcygpOw0KLSAgICAgICAgd2hpbGUgKCFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc1RvSW5zcGVjdC5nZXROYW1lKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyYW5zZmVyR3JvdXBWYWxpZGF0aW9uSW5mb3JtYXRpb25Ub0ZvdW5kR3JvdXBzKG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgICAgIHByb2Nlc3NJbnRlcmZhY2VzKG9iamVjdFRvSW5zcGVjdC5nZXRDbGFzcygpLCBvYmplY3RUb0luc3BlY3QsDQotICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgICAgICBjbGFzc1RvSW5zcGVjdCA9IGNsYXNzVG9JbnNwZWN0LmdldFN1cGVyY2xhc3MoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NGaWVsZHNBbmRQcm9wZXJ0aWVzKFN0cmluZyBrZXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGJhc2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5LCBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdEdyb3VwQ29udHJvbGxlclNjYW5uaW5nRXh0cmFjdG9yKCkNCi0gICAgICAgICAgICAgICAgLmV4dHJhY3QoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCBuZXcgUHJvcGVydHlEZXRhaWxzKGtleSwgYmFzZSwgcHJvcGVydHkpKTsNCi0NCi0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5IDogcHJvcGVydHlJbmZvcm1hdGlvbi5nZXRNZXRhRGF0YUVudHJpZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAobWV0YURhdGFFbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQmVhblZhbGlkYXRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTWV0YURhdGEoKEJlYW5WYWxpZGF0aW9uKSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZiAobWV0YURhdGFFbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQmVhblZhbGlkYXRpb24uTGlzdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZvciAoQmVhblZhbGlkYXRpb24gY3VycmVudEJlYW5WYWxpZGF0aW9uIDogKChCZWFuVmFsaWRhdGlvbi5MaXN0KSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkpLnZhbHVlKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNZXRhRGF0YShjdXJyZW50QmVhblZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc0ZvdW5kR3JvdXBzKEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50Vmlld0lkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xpZW50SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICAvKg0KLSAgICAgICAgICogYWRkIGZvdW5kIGdyb3VwcyB0byBjb250ZXh0DQotICAgICAgICAgKi8NCi0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEdyb3VwQ2xhc3MgOiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuYWRkR3JvdXAoY3VycmVudEdyb3VwQ2xhc3MsIGN1cnJlbnRWaWV3SWQsIGNsaWVudElkKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NSZXN0cmljdGVkR3JvdXBzKEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRWaWV3SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsaWVudElkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIC8qDQotICAgICAgICAgKiBhZGQgcmVzdHJpY3RlZCBncm91cHMNCi0gICAgICAgICAqLw0KLSAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50R3JvdXBDbGFzcyA6IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LnJlc3RyaWN0R3JvdXAoY3VycmVudEdyb3VwQ2xhc3MsIGN1cnJlbnRWaWV3SWQsIGNsaWVudElkKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRNb2RlbFZhbGlkYXRpb24oRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50Vmlld0lkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgY29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIC8qDQotICAgICAgICAgKiBhZGQgbW9kZWwgdmFsaWRhdGlvbiBlbnRyeSBsaXN0DQotICAgICAgICAgKi8NCi0gICAgICAgIGZvciAoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkgOiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yIChDbGFzcyByZXN0cmljdGVkR3JvdXAgOiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkucmVtb3ZlR3JvdXAocmVzdHJpY3RlZEdyb3VwKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldEdyb3VwcygpLmxlbmd0aCA+IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRUYXJnZXRzRm9yTW9kZWxWYWxpZGF0aW9uKG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpKTsNCi0gICAgICAgICAgICAgICAgZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBjdXJyZW50Vmlld0lkLCBjb21wb25lbnQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRyYW5zZmVyR3JvdXBWYWxpZGF0aW9uSW5mb3JtYXRpb25Ub0ZvdW5kR3JvdXBzKA0KLSAgICAgICAgICAgIE9iamVjdCBvYmplY3RUb0luc3BlY3QsDQotICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKG9iamVjdFRvSW5zcGVjdC5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoQmVhblZhbGlkYXRpb24uY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NNZXRhRGF0YShvYmplY3RUb0luc3BlY3QuZ2V0Q2xhc3MoKS5nZXRBbm5vdGF0aW9uKEJlYW5WYWxpZGF0aW9uLmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgIG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCkuaXNBbm5vdGF0aW9uUHJlc2VudChCZWFuVmFsaWRhdGlvbi5MaXN0LmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IgKEJlYW5WYWxpZGF0aW9uIGN1cnJlbnRCZWFuVmFsaWRhdGlvbiA6DQotICAgICAgICAgICAgICAgICAgICAob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCkuZ2V0QW5ub3RhdGlvbihCZWFuVmFsaWRhdGlvbi5MaXN0LmNsYXNzKSkudmFsdWUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NNZXRhRGF0YShjdXJyZW50QmVhblZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VG9JbnNwZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NJbnRlcmZhY2VzKENsYXNzIGN1cnJlbnRDbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50SW50ZXJmYWNlIDogY3VycmVudENsYXNzLmdldEludGVyZmFjZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cmFuc2Zlckdyb3VwVmFsaWRhdGlvbkluZm9ybWF0aW9uVG9Gb3VuZEdyb3VwcyhtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgICAgIHByb2Nlc3NJbnRlcmZhY2VzKGN1cnJlbnRJbnRlcmZhY2UsIG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzTWV0YURhdGEoQmVhblZhbGlkYXRpb24gYmVhblZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgZm9yIChTdHJpbmcgY3VycmVudFZpZXdJZCA6IGJlYW5WYWxpZGF0aW9uLnZpZXdJZHMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoKGN1cnJlbnRWaWV3SWQuZXF1YWxzKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldFZpZXdJZCgpKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFZpZXdJZC5lcXVhbHMoIioiKSkgJiYgaXNWYWxpZGF0aW9uUGVybWl0dGVkKGJlYW5WYWxpZGF0aW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChpc01vZGVsVmFsaWRhdGlvbihiZWFuVmFsaWRhdGlvbikpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFuVmFsaWRhdGlvbiwgbWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzR3JvdXBzKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFuVmFsaWRhdGlvbiwgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRUYXJnZXRzRm9yTW9kZWxWYWxpZGF0aW9uKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBPYmplY3QgZGVmYXVsdFRhcmdldCkNCi0gICAgew0KLSAgICAgICAgaWYgKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldE1ldGFEYXRhKCkudmFsaWRhdGlvblRhcmdldHMoKS5sZW5ndGggPT0gMSAmJg0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRNZXRhRGF0YSgpLnZhbGlkYXRpb25UYXJnZXRzKClbMF0uZXF1YWxzKE1vZGVsVmFsaWRhdGlvbi5ERUZBVUxUX1RBUkdFVCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuYWRkVmFsaWRhdGlvblRhcmdldChkZWZhdWx0VGFyZ2V0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBPYmplY3QgdGFyZ2V0Ow0KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIG1vZGVsVmFsaWRhdGlvblRhcmdldCA6IG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldE1ldGFEYXRhKCkudmFsaWRhdGlvblRhcmdldHMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRhcmdldCA9IHJlc29sdmVUYXJnZXQobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0TWV0YURhdGFTb3VyY2VPYmplY3QoKSwgbW9kZWxWYWxpZGF0aW9uVGFyZ2V0KTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsICYmIExPRy5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBMT0cuZXJyb3IoInRhcmdldCB1bnJlYWNoYWJsZSAtIHNvdXJjZSBjbGFzczogIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldE1ldGFEYXRhU291cmNlT2JqZWN0KCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRhcmdldCB0byByZXNvbHZlOiAiICsgbW9kZWxWYWxpZGF0aW9uVGFyZ2V0KTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5hZGRWYWxpZGF0aW9uVGFyZ2V0KHRhcmdldCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZGF0aW9uUGVybWl0dGVkKEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBFTEhlbHBlciBlbEhlbHBlciA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjb25kaXRpb24gOiBiZWFuVmFsaWRhdGlvbi5jb25kaXRpb25zKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVsSGVscGVyLmlzRUxUZXJtV2VsbEZvcm1lZChjb25kaXRpb24pICYmDQotICAgICAgICAgICAgICAgICAgICBlbEhlbHBlci5pc0VMVGVybVZhbGlkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgY29uZGl0aW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsSGVscGVyLmdldFZhbHVlT2ZFeHByZXNzaW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihjb25kaXRpb24pKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChMT0cuaXNFcnJvckVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgTE9HLmVycm9yKCJhbiBpbnZhbGlkIGNvbmRpdGlvbiBpcyB1c2VkOiAiICsgY29uZGl0aW9uKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTW9kZWxWYWxpZGF0aW9uKEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmVhblZhbGlkYXRpb24ubW9kZWxWYWxpZGF0aW9uKCkuaXNBY3RpdmUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkgPSBuZXcgTW9kZWxWYWxpZGF0aW9uRW50cnkoKTsNCi0NCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LnNldEdyb3VwcyhBcnJheXMuYXNMaXN0KGJlYW5WYWxpZGF0aW9uLnVzZUdyb3VwcygpKSk7DQotICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5zZXRNZXRhRGF0YShiZWFuVmFsaWRhdGlvbi5tb2RlbFZhbGlkYXRpb24oKSk7DQotICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5zZXRNZXRhRGF0YVNvdXJjZU9iamVjdChtZXRhRGF0YVNvdXJjZU9iamVjdCk7DQotDQotICAgICAgICBpZiAoYmVhblZhbGlkYXRpb24ucmVzdHJpY3RHcm91cHMoKS5sZW5ndGggPiAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24uYWRkQWxsKEFycmF5cy5hc0xpc3QoYmVhblZhbGlkYXRpb24ucmVzdHJpY3RHcm91cHMoKSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LmFkZChtb2RlbFZhbGlkYXRpb25FbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzR3JvdXBzKEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChiZWFuVmFsaWRhdGlvbi51c2VHcm91cHMoKSkpOw0KLQ0KLSAgICAgICAgaWYgKGJlYW5WYWxpZGF0aW9uLnJlc3RyaWN0R3JvdXBzKCkubGVuZ3RoID4gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLmFkZEFsbChBcnJheXMuYXNMaXN0KGJlYW5WYWxpZGF0aW9uLnJlc3RyaWN0R3JvdXBzKCkpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgcmVzb2x2ZVRhcmdldChPYmplY3QgbWV0YURhdGFTb3VyY2VPYmplY3QsIFN0cmluZyBtb2RlbFZhbGlkYXRpb25UYXJnZXQpDQotICAgIHsNCi0gICAgICAgIEVMSGVscGVyIGVsSGVscGVyID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKTsNCi0NCi0gICAgICAgIGlmIChlbEhlbHBlci5pc0VMVGVybVdlbGxGb3JtZWQobW9kZWxWYWxpZGF0aW9uVGFyZ2V0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZWxIZWxwZXIuaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIG1vZGVsVmFsaWRhdGlvblRhcmdldCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZWxIZWxwZXIuZ2V0VmFsdWVPZkV4cHJlc3Npb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihtb2RlbFZhbGlkYXRpb25UYXJnZXQpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYgKExPRy5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBMT0cuZXJyb3IoImFuIGludmFsaWQgYmluZGluZyBpcyB1c2VkOiAiICsgbW9kZWxWYWxpZGF0aW9uVGFyZ2V0KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZ1tdIHByb3BlcnRpZXMgPSBtb2RlbFZhbGlkYXRpb25UYXJnZXQuc3BsaXQoIlxcLiIpOw0KLQ0KLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG1ldGFEYXRhU291cmNlT2JqZWN0Ow0KLSAgICAgICAgZm9yIChTdHJpbmcgcHJvcGVydHkgOiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IGdldFZhbHVlT2ZQcm9wZXJ0eShyZXN1bHQsIHByb3BlcnR5KTsNCi0NCi0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBnZXRWYWx1ZU9mUHJvcGVydHkoT2JqZWN0IGJhc2UsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHByb3BlcnR5LnN1YnN0cmluZygxLCBwcm9wZXJ0eS5sZW5ndGgoKSk7DQotICAgICAgICBNZXRob2QgdGFyZ2V0TWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKGJhc2UuZ2V0Q2xhc3MoKSwgImdldCIgKyBwcm9wZXJ0eSk7DQotDQotICAgICAgICBpZiAodGFyZ2V0TWV0aG9kID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKGJhc2UuZ2V0Q2xhc3MoKSwgImlzIiArIHByb3BlcnR5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgImNsYXNzICIgKyBiYXNlLmdldENsYXNzKCkgKyAiIGhhcyBubyBwdWJsaWMgZ2V0L2lzICIgKyBwcm9wZXJ0eS50b0xvd2VyQ2FzZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoYmFzZSwgdGFyZ2V0TWV0aG9kKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc0NvbnN0cmFpbnRWaW9sYXRpb25zKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbj4gdmlvbGF0aW9ucywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZpcnN0RXJyb3JDYXVzZXNBbkV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0gICAgICAgIEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXI7DQotDQotICAgICAgICBmb3IgKENvbnN0cmFpbnRWaW9sYXRpb24gdmlvbGF0aW9uIDogdmlvbGF0aW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2VIb2xkZXIgPSBuZXcgRmFjZXNNZXNzYWdlSG9sZGVyKA0KLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlRmFjZXNNZXNzYWdlRm9yQ29uc3RyYWludFZpb2xhdGlvbih1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCB2aW9sYXRpb24pKTsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2VIb2xkZXIuc2V0Q2xpZW50SWQodWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotDQotICAgICAgICAgICAgZmFjZXNNZXNzYWdlSG9sZGVyTGlzdC5hZGQoZmFjZXNNZXNzYWdlSG9sZGVyKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHByb2Nlc3NWaW9sYXRpb25NZXNzYWdlcyhmYWNlc0NvbnRleHQsIGZhY2VzTWVzc2FnZUhvbGRlckxpc3QsIGZpcnN0RXJyb3JDYXVzZXNBbkV4Y2VwdGlvbik7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5ISUdILCBkZXNjcmlwdGlvbiA9ICJzdXBwb3J0IHNldmVyaXR5Lndhcm4gYW5kIC5pbmZvIikNCi0gICAgcHVibGljIHN0YXRpYyBGYWNlc01lc3NhZ2UgY3JlYXRlRmFjZXNNZXNzYWdlRm9yQ29uc3RyYWludFZpb2xhdGlvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cmFpbnRWaW9sYXRpb24gdmlvbGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmlvbGF0aW9uTWVzc2FnZSA9IHZpb2xhdGlvbi5nZXRNZXNzYWdlKCk7DQotDQotICAgICAgICBTdHJpbmcgbGFiZWxlZE1lc3NhZ2UgPSBjcmVhdGVMYWJlbGVkTWVzc2FnZSh2aW9sYXRpb25NZXNzYWdlKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSA9IGNhbGNTZXZlcml0eSh2aW9sYXRpb24pOw0KLQ0KLSAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiA9IGNyZWF0ZVZhbGlkYXRvckV4Y2VwdGlvbihsYWJlbGVkTWVzc2FnZSwgc2V2ZXJpdHkpOw0KLQ0KLSAgICAgICAgZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnModWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uKTsNCi0NCi0gICAgICAgIGlmIChpc01lc3NhZ2VUZXh0VW5jaGFuZ2VkKHZhbGlkYXRvckV4Y2VwdGlvbiwgbGFiZWxlZE1lc3NhZ2UpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc2V2ZXJpdHksIHZpb2xhdGlvbk1lc3NhZ2UsIHZpb2xhdGlvbk1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBuZXdNZXNzYWdlID0gdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldFN1bW1hcnkoKTsNCi0gICAgICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKHNldmVyaXR5LCBuZXdNZXNzYWdlLCBuZXdNZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3JlYXRlTGFiZWxlZE1lc3NhZ2UoU3RyaW5nIHZpb2xhdGlvbk1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsYWJlbGVkTWVzc2FnZUludGVybmFscy5jcmVhdGVMYWJlbGVkTWVzc2FnZSh2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgY2FsY1NldmVyaXR5KENvbnN0cmFpbnRWaW9sYXRpb248Pz4gdmlvbGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBmb3IgKENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPiBwYXlsb2FkIDogdmlvbGF0aW9uLmdldENvbnN0cmFpbnREZXNjcmlwdG9yKCkuZ2V0UGF5bG9hZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKFZpb2xhdGlvblNldmVyaXR5LkluZm8uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShwYXlsb2FkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfSU5GTzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZiAoVmlvbGF0aW9uU2V2ZXJpdHkuRmF0YWwuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShwYXlsb2FkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUjsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICBudWxsLA0KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01lc3NhZ2VUZXh0VW5jaGFuZ2VkKFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIFN0cmluZyB2aW9sYXRpb25NZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmlvbGF0aW9uTWVzc2FnZS5lcXVhbHModmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldFN1bW1hcnkoKSkgfHwNCi0gICAgICAgICAgICAgICAgdmlvbGF0aW9uTWVzc2FnZS5lcXVhbHModmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldERldGFpbCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBWYWxpZGF0b3JFeGNlcHRpb24gY3JlYXRlVmFsaWRhdG9yRXhjZXB0aW9uKFN0cmluZyB2aW9sYXRpb25NZXNzYWdlLCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc2V2ZXJpdHksIHZpb2xhdGlvbk1lc3NhZ2UsIHZpb2xhdGlvbk1lc3NhZ2UpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc1Zpb2xhdGlvbk1lc3NhZ2VzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlyc3RFcnJvckNhdXNlc0FuRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlTGlzdFdpdGhMb3dTZXZlcml0eSA9DQotICAgICAgICAgICAgICAgIGdldEZhY2VzTWVzc2FnZUxpc3RXaXRoTG93U2V2ZXJpdHkodmlvbGF0aW9uTWVzc2FnZUhvbGRlckxpc3QpOw0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUxpc3RXaXRoSGlnaFNldmVyaXR5ID0NCi0gICAgICAgICAgICAgICAgZ2V0RmFjZXNNZXNzYWdlTGlzdFdpdGhIaWdoU2V2ZXJpdHkodmlvbGF0aW9uTWVzc2FnZUhvbGRlckxpc3QpOw0KLQ0KLSAgICAgICAgYWRkTWVzc2FnZXNXaXRoSGlnaFNldmVyaXR5KGZhY2VzTWVzc2FnZUxpc3RXaXRoSGlnaFNldmVyaXR5LCBmaXJzdEVycm9yQ2F1c2VzQW5FeGNlcHRpb24pOw0KLSAgICAgICAgYWRkTWVzc2FnZXNXaXRoTG93U2V2ZXJpdHkoZmFjZXNNZXNzYWdlTGlzdFdpdGhMb3dTZXZlcml0eSk7DQotDQotICAgICAgICBpZiAoIWZhY2VzTWVzc2FnZUxpc3RXaXRoSGlnaFNldmVyaXR5LmlzRW1wdHkoKSAmJiBmaXJzdEVycm9yQ2F1c2VzQW5FeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlciA9IGZhY2VzTWVzc2FnZUxpc3RXaXRoSGlnaFNldmVyaXR5Lml0ZXJhdG9yKCkubmV4dCgpOw0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvVGhyb3dWYWxpZGF0b3JFeGNlcHRpb25Gb3JDb21wb25lbnRJZCgNCi0gICAgICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZUhvbGRlci5nZXRDbGllbnRJZCgpLCBmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0RmFjZXNNZXNzYWdlKCksIG51bGwpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBnZXRGYWNlc01lc3NhZ2VMaXN0V2l0aExvd1NldmVyaXR5KA0KLSAgICAgICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiB2aW9sYXRpb25NZXNzYWdlcykNCi0gICAgew0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPigpOw0KLQ0KLSAgICAgICAgZm9yIChGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyIDogdmlvbGF0aW9uTWVzc2FnZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOLmVxdWFscyhmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKSkgfHwNCi0gICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9JTkZPLmVxdWFscyhmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGZhY2VzTWVzc2FnZUhvbGRlcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZ2V0RmFjZXNNZXNzYWdlTGlzdFdpdGhIaWdoU2V2ZXJpdHkoDQotICAgICAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0KQ0KLSAgICB7DQotICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+KCk7DQotDQotICAgICAgICBmb3IgKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIgOiB2aW9sYXRpb25NZXNzYWdlSG9sZGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLmVxdWFscyhmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKSkgfHwNCi0gICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9GQVRBTC5lcXVhbHMoZmFjZXNNZXNzYWdlSG9sZGVyLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChmYWNlc01lc3NhZ2VIb2xkZXIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRNZXNzYWdlc1dpdGhIaWdoU2V2ZXJpdHkoTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3RXaXRoSGlnaFNldmVyaXR5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZpcnN0RXJyb3JDYXVzZXNBbkV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiBmaXJzdE1lc3NhZ2UgPSB0cnVlOw0KLSAgICAgICAgZm9yIChGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyIDogZmFjZXNNZXNzYWdlSG9sZGVyTGlzdFdpdGhIaWdoU2V2ZXJpdHkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGZpcnN0TWVzc2FnZSAmJiBmaXJzdEVycm9yQ2F1c2VzQW5FeGNlcHRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL3RoZSBmaXJzdCBlcnJvciB3aWxsIGJlIHRocm93biBhcyBleGNlcHRpb24NCi0gICAgICAgICAgICAgICAgZmlyc3RNZXNzYWdlID0gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudElkKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZUhvbGRlci5nZXRDbGllbnRJZCgpLCBmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0RmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZE1lc3NhZ2VzV2l0aExvd1NldmVyaXR5KExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0V2l0aExvd1NldmVyaXR5KQ0KLSAgICB7DQotICAgICAgICBmb3IgKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIgOiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0V2l0aExvd1NldmVyaXR5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudElkKA0KLSAgICAgICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlSG9sZGVyLmdldENsaWVudElkKCksIGZhY2VzTWVzc2FnZUhvbGRlci5nZXRGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvTGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC91dGlsL0xhYmVsZWRNZXNzYWdlSW50ZXJuYWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOTE0OTEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvTGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotY2xhc3MgTGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMNCi17DQotICAgIC8vdGhlcmUgaXMgbm8gY29uY3VycmVuY3kgaXNzdWUgaGVyZSAtIGl0IGFsd2F5cyBsZWFkcyB0byB0aGUgc2FtZSByZXN1bHQNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVmYXVsdExhYmVsTWVzc2FnZVRlbXBsYXRlID0gInsxfTogezB9IjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFiZWxNZXNzYWdlVGVtcGxhdGUgPSBkZWZhdWx0TGFiZWxNZXNzYWdlVGVtcGxhdGU7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19WQUxJREFUT1JfQkVBTlZBTElEQVRPUl9NRVNTQUdFID0NCi0gICAgICAgICAgICAiamF2YXguZmFjZXMudmFsaWRhdG9yLkJlYW5WYWxpZGF0b3IuTUVTU0FHRSI7DQotDQotICAgIFN0cmluZyBjcmVhdGVMYWJlbGVkTWVzc2FnZShTdHJpbmcgdmlvbGF0aW9uTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYobGFiZWxNZXNzYWdlVGVtcGxhdGUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0TGFiZWxNZXNzYWdlVGVtcGxhdGUucmVwbGFjZSgiezB9IiwgdmlvbGF0aW9uTWVzc2FnZSk7DQotICAgICAgICB9DQotDQotICAgICAgICB0aGlzLmxhYmVsTWVzc2FnZVRlbXBsYXRlID0gbG9hZFN0YW5kYXJkTWVzc2FnZVRlbXBsYXRlKCk7DQotDQotICAgICAgICBpZihsYWJlbE1lc3NhZ2VUZW1wbGF0ZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVMYWJlbGVkTWVzc2FnZSh2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBsYWJlbE1lc3NhZ2VUZW1wbGF0ZS5yZXBsYWNlKCJ7MH0iLCB2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBsb2FkU3RhbmRhcmRNZXNzYWdlVGVtcGxhdGUoKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gSnNmVXRpbHMuZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhKQVZBWF9GQUNFU19WQUxJREFUT1JfQkVBTlZBTElEQVRPUl9NRVNTQUdFKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMTQ5MmUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLm1lc3NhZ2UuRmFjZXNNZXNzYWdlSG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5Nb2RlbFZhbGlkYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbC5CZWFuVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uTWVzc2FnZUludGVycG9sYXRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXRoOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lciBpbXBsZW1lbnRzIFBoYXNlTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zNDgyMjMzODkzMTg2NzA4ODc4TDsNCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IHBoYXNlRXZlbnQpDQotICAgIHsNCi0gICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImpzcjMwMyBzdGFydCBtb2RlbCB2YWxpZGF0aW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PE9iamVjdD4gcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PigpOw0KLQ0KLSAgICAgICAgZm9yIChNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSA6IGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXNUb1ZhbGlkYXRlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbihtb2RlbFZhbGlkYXRpb25FbnRyeSwgcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMsIHJlc3VsdHMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHJvY2Vzc1Zpb2xhdGlvbnMoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCByZXN1bHRzKTsNCi0NCi0gICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImpzcjMwMyB2YWxpZGF0aW9uIGZpbmlzaGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllc1RvVmFsaWRhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbihNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxPYmplY3Q+IHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMpDQotICAgIHsNCi0gICAgICAgIGZvciAoT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQgOiBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRWYWxpZGF0aW9uVGFyZ2V0cygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cy5jb250YWlucyh2YWxpZGF0aW9uVGFyZ2V0KSAmJg0KLSAgICAgICAgICAgICAgICAgICAgIW1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldE1ldGFEYXRhKCkuZGlzcGxheUlubGluZSgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmICghcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMuY29udGFpbnModmFsaWRhdGlvblRhcmdldCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cy5hZGQodmFsaWRhdGlvblRhcmdldCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRlVGFyZ2V0KG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0LCBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRHcm91cHMoKSwgcmVzdWx0cyk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5ISUdILCBkZXNjcmlwdGlvbiA9ICJyZWZhY3RvciBhbmQgcmVtb3ZlIEZhY2VzQ29udGV4dCNyZW5kZXJSZXNwb25zZSIpDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVRhcmdldChNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NbXSBncm91cHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMpDQotICAgIHsNCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4+IHZpb2xhdGlvbnMgPSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkNCi0gICAgICAgICAgICAgICAgLmdldFZhbGlkYXRvckZhY3RvcnkoKS51c2luZ0NvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAubWVzc2FnZUludGVycG9sYXRvcihFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdG9yKCkNCi0gICAgICAgICAgICAgICAgLnZhbGlkYXRlKHZhbGlkYXRpb25UYXJnZXQsIGdyb3Vwcyk7DQotDQotICAgICAgICBpZiAodmlvbGF0aW9ucyAhPSBudWxsICYmICF2aW9sYXRpb25zLmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dC5yZW5kZXJSZXNwb25zZSgpOw0KLQ0KLSAgICAgICAgICAgIC8vanNmIDIuMCBpcyBhYmxlIHRvIGRpc3BsYXkgbXVsdGlwbGUgbWVzc2FnZXMgcGVyIGNvbXBvbmVudCAtIHNvIHByb2Nlc3MgYWxsIHZpb2xhdGlvbnMNCi0gICAgICAgICAgICAvL2pzZiA8IDIuMCB3aWxsIGp1c3QgdXNlIHRoZSBmaXJzdCBvbmUgKGl0J3Mgb25seSBhIGxpdHRsZSBvdmVyaGVhZCkNCi0gICAgICAgICAgICBJdGVyYXRvciB2aW9sYXRpb25zSXRlcmF0b3IgPSB2aW9sYXRpb25zLml0ZXJhdG9yKCk7DQotICAgICAgICAgICAgQ29uc3RyYWludFZpb2xhdGlvbiBjb25zdHJhaW50VmlvbGF0aW9uOw0KLSAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvblJlc3VsdCByZXN1bHQ7DQotICAgICAgICAgICAgd2hpbGUgKHZpb2xhdGlvbnNJdGVyYXRvci5oYXNOZXh0KCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdHMuY29udGFpbnNLZXkobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBNb2RlbFZhbGlkYXRpb25SZXN1bHQoKTsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0KG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpLmdldENsaWVudElkKGZhY2VzQ29udGV4dCksIHJlc3VsdCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0cy5nZXQobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotDQotICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb24gPSAoQ29uc3RyYWludFZpb2xhdGlvbikgdmlvbGF0aW9uc0l0ZXJhdG9yLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgaWYgKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldE1ldGFEYXRhKCkuZGlzcGxheUlubGluZSgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkRmFjZXNNZXNzYWdlSG9sZGVyKGNyZWF0ZUZhY2VzTWVzc2FnZUhvbGRlckZvckNvbnN0cmFpbnRWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb24sIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0LCB0cnVlKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkRmFjZXNNZXNzYWdlSG9sZGVyKGNyZWF0ZUZhY2VzTWVzc2FnZUhvbGRlckZvckNvbnN0cmFpbnRWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb24sIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0LCBmYWxzZSkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgRmFjZXNNZXNzYWdlSG9sZGVyIGNyZWF0ZUZhY2VzTWVzc2FnZUhvbGRlckZvckNvbnN0cmFpbnRWaW9sYXRpb24oZmluYWwgQ29uc3RyYWludFZpb2xhdGlvbiB2aW9sYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkaXNwbGF5QXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGZpbmFsIFN0cmluZyBuZXdWaW9sYXRpb25NZXNzYWdlID0gdHJ5VG9DaGFuZ2VWaW9sYXRpb25NZXNzYWdlKA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeSwgdmFsaWRhdGlvblRhcmdldCwgdmlvbGF0aW9uKTsNCi0NCi0gICAgICAgIENvbnN0cmFpbnRWaW9sYXRpb24gbmV3Q29uc3RyYWludFZpb2xhdGlvbiA9IG5ldyBDb25zdHJhaW50VmlvbGF0aW9uKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcml2YXRlIENvbnN0cmFpbnRWaW9sYXRpb24gd3JhcHBlZCA9IHZpb2xhdGlvbjsNCi0NCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ld1Zpb2xhdGlvbk1lc3NhZ2U7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZVRlbXBsYXRlKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldE1lc3NhZ2VUZW1wbGF0ZSgpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFJvb3RCZWFuKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJvb3RCZWFuKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBDbGFzcyBnZXRSb290QmVhbkNsYXNzKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJvb3RCZWFuQ2xhc3MoKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRMZWFmQmVhbigpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRMZWFmQmVhbigpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgUGF0aCBnZXRQcm9wZXJ0eVBhdGgoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UHJvcGVydHlQYXRoKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0SW52YWxpZFZhbHVlKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldEludmFsaWRWYWx1ZSgpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgQ29uc3RyYWludERlc2NyaXB0b3IgZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9Ow0KLQ0KLQ0KLSAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIGNsaWVudElkID0gbnVsbDsNCi0NCi0gICAgICAgIGlmIChkaXNwbGF5QXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgdWlDb21wb25lbnQgPSBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKTsNCi0gICAgICAgICAgICBjbGllbnRJZCA9IHVpQ29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc01lc3NhZ2VIb2xkZXIgcmVzdWx0ID0gbmV3IEZhY2VzTWVzc2FnZUhvbGRlcihCZWFuVmFsaWRhdGlvblV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVGYWNlc01lc3NhZ2VGb3JDb25zdHJhaW50VmlvbGF0aW9uKHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uVGFyZ2V0LCBuZXdDb25zdHJhaW50VmlvbGF0aW9uKSk7DQotICAgICAgICByZXN1bHQuc2V0Q2xpZW50SWQoY2xpZW50SWQpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb0NoYW5nZVZpb2xhdGlvbk1lc3NhZ2UoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cmFpbnRWaW9sYXRpb24gdmlvbGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzRGVmYXVsdE1lc3NhZ2UobW9kZWxWYWxpZGF0aW9uRW50cnkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZVZhbGlkYXRpb25FcnJvck1lc3NhZ2UoDQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRNZXRhRGF0YSgpLm1lc3NhZ2UoKSwgdmFsaWRhdGlvblRhcmdldCwgdmlvbGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2aW9sYXRpb24uZ2V0TWVzc2FnZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHRNZXNzYWdlKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gTW9kZWxWYWxpZGF0aW9uLkRFRkFVTFRfTUVTU0FHRS5lcXVhbHMobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0TWV0YURhdGEoKS5tZXNzYWdlKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGludGVycG9sYXRlVmFsaWRhdGlvbkVycm9yTWVzc2FnZShTdHJpbmcgZXh0VmFsSW5saW5lTWVzc2FnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LCBmaW5hbCBDb25zdHJhaW50VmlvbGF0aW9uIHZpb2xhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkNCi0gICAgICAgICAgICAgICAgLmludGVycG9sYXRlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dFZhbElubGluZU1lc3NhZ2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1lc3NhZ2VJbnRlcnBvbGF0b3IuQ29udGV4dCgpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlvbGF0aW9uLmdldENvbnN0cmFpbnREZXNjcmlwdG9yKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWxpZGF0ZWRWYWx1ZSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uVGFyZ2V0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICApOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzVmlvbGF0aW9ucyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMpDQotICAgIHsNCi0gICAgICAgIGZvciAoTW9kZWxWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA6IHJlc3VsdHMudmFsdWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQmVhblZhbGlkYXRpb25VdGlscy5wcm9jZXNzVmlvbGF0aW9uTWVzc2FnZXMoZmFjZXNDb250ZXh0LCByZXN1bHQuZ2V0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdCgpLCBmYWxzZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBwaGFzZUV2ZW50KQ0KLSAgICB7DQotICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuVVBEQVRFX01PREVMX1ZBTFVFUzsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25SZXN1bHQuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvblJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmZiMDU5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvblJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLm1lc3NhZ2UuRmFjZXNNZXNzYWdlSG9sZGVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIE1vZGVsVmFsaWRhdGlvblJlc3VsdA0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRGYWNlc01lc3NhZ2VIb2xkZXIoRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5mYWNlc01lc3NhZ2VIb2xkZXJMaXN0LmFkZChmYWNlc01lc3NhZ2VIb2xkZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZ2V0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvRmFjZXNNZXNzYWdlSG9sZGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9tZXNzYWdlL0ZhY2VzTWVzc2FnZUhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTMwOThhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvRmFjZXNNZXNzYWdlSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBEZXByZWNhdGVkDQotQFRvRG8oUHJpb3JpdHkuSElHSCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBGYWNlc01lc3NhZ2VIb2xkZXINCi17DQotICAgIHByaXZhdGUgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50SWQ7DQotDQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2VIb2xkZXIoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5mYWNlc01lc3NhZ2UgPSBmYWNlc01lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBnZXRGYWNlc01lc3NhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY2xpZW50SWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50SWQoU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNsaWVudElkID0gY2xpZW50SWQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vbWVzc2FnZS9pbnRlcnBvbGF0b3IvRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0RlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0Zjk0MmYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vbWVzc2FnZS9pbnRlcnBvbGF0b3IvRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24ubWVzc2FnZS5pbnRlcnBvbGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5NZXNzYWdlSW50ZXJwb2xhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IgaW1wbGVtZW50cyBNZXNzYWdlSW50ZXJwb2xhdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLSAgICANCi0gICAgcHJpdmF0ZSBNZXNzYWdlSW50ZXJwb2xhdG9yIHdyYXBwZWQ7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcihNZXNzYWdlSW50ZXJwb2xhdG9yIHdyYXBwZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBpbnRlcnBvbGF0ZShTdHJpbmcgbWVzc2FnZU9yS2V5LCBDb250ZXh0IGNvbnRleHQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShtZXNzYWdlT3JLZXksIGNvbnRleHQsIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgaW50ZXJwb2xhdGUoU3RyaW5nIG1lc3NhZ2VPcktleSwgQ29udGV4dCBjb250ZXh0LCBMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkLmludGVycG9sYXRlKG1lc3NhZ2VPcktleSwgY29udGV4dCwgZ2V0Q3VycmVudExvY2FsZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTG9jYWxlIGdldEN1cnJlbnRMb2NhbGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vbWVzc2FnZS9pbnRlcnBvbGF0b3IvRXh0VmFsTWVzc2FnZUludGVycG9sYXRvckFkYXB0ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0V4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNTExOGYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vbWVzc2FnZS9pbnRlcnBvbGF0b3IvRXh0VmFsTWVzc2FnZUludGVycG9sYXRvckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24ubWVzc2FnZS5pbnRlcnBvbGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5NZXNzYWdlSW50ZXJwb2xhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlciBleHRlbmRzIERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yDQotew0KLSAgICBwcml2YXRlIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXI7DQotDQotICAgIHB1YmxpYyBFeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlcihNZXNzYWdlSW50ZXJwb2xhdG9yIHdyYXBwZWQsIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXIpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKHdyYXBwZWQpOw0KLSAgICAgICAgdGhpcy5tZXNzYWdlUmVzb2x2ZXIgPSBtZXNzYWdlUmVzb2x2ZXI7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgaW50ZXJwb2xhdGUoU3RyaW5nIG1lc3NhZ2VPcktleSwgQ29udGV4dCBjb250ZXh0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZU9yS2V5LCBjb250ZXh0LCBnZXRDdXJyZW50TG9jYWxlKCkpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGludGVycG9sYXRlKFN0cmluZyBtZXNzYWdlT3JLZXksIENvbnRleHQgY29udGV4dCwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5tZXNzYWdlUmVzb2x2ZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihpc0JlYW5WYWxpZGF0aW9uTWVzc2FnZUtleUZvcm1hdChtZXNzYWdlT3JLZXkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld01lc3NhZ2VPcktleSA9IHRoaXMubWVzc2FnZVJlc29sdmVyLmdldE1lc3NhZ2UoZXh0cmFjdEtleShtZXNzYWdlT3JLZXkpLCBnZXRDdXJyZW50TG9jYWxlKCkpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZihpc1ZhbGlkZU1lc3NhZ2UobmV3TWVzc2FnZU9yS2V5KSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU9yS2V5ID0gbmV3TWVzc2FnZU9yS2V5Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJ5b3UgdHJpZWQgdG8gdXNlIGFuIGV4dHZhbCBtZXNzYWdlLXJlc29sdmVyIGZvciIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAianNyMzAzIHZhbGlkYXRpb24gd2l0aCBhbiBpbnZhbGlkIGtleSAtPiB1c2luZyBhIGRlZmF1bHQgaW50ZXJwb2xhdG9yIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3VwZXIuaW50ZXJwb2xhdGUobWVzc2FnZU9yS2V5LCBjb250ZXh0LCBnZXRDdXJyZW50TG9jYWxlKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0JlYW5WYWxpZGF0aW9uTWVzc2FnZUtleUZvcm1hdChTdHJpbmcgbWVzc2FnZU9yS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWVzc2FnZU9yS2V5LnN0YXJ0c1dpdGgoInsiKSAmJiBtZXNzYWdlT3JLZXkuZW5kc1dpdGgoIn0iKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBleHRyYWN0S2V5KFN0cmluZyBtZXNzYWdlT3JLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXNzYWdlT3JLZXkuc3Vic3RyaW5nKDEsIG1lc3NhZ2VPcktleS5sZW5ndGgoKSAtIDEpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkZU1lc3NhZ2UoU3RyaW5nIG5ld01lc3NhZ2VPcktleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICEobmV3TWVzc2FnZU9yS2V5LnN0YXJ0c1dpdGgoQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIpICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3TWVzc2FnZU9yS2V5LmVuZHNXaXRoKEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZhNzAwNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByaXZhdGUgQ29uc3RyYWludERlc2NyaXB0b3IgY29uc3RyYWludERlc2NyaXB0b3I7DQotICAgIHByaXZhdGUgQ2xhc3MgZWxlbWVudENsYXNzOyAvL3Byb3BlcnR5IHR5cGUNCi0NCi0gICAgcHVibGljIEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneShDb25zdHJhaW50RGVzY3JpcHRvciBjb25zdHJhaW50RGVzY3JpcHRvciwgQ2xhc3MgZWxlbWVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbnN0cmFpbnREZXNjcmlwdG9yID0gY29uc3RyYWludERlc2NyaXB0b3I7DQotICAgICAgICB0aGlzLmVsZW1lbnRDbGFzcyA9IGVsZW1lbnRDbGFzczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29uc3RyYWludERlc2NyaXB0b3IgZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29uc3RyYWludERlc2NyaXB0b3I7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENsYXNzIGdldEVsZW1lbnRDbGFzcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBlbGVtZW50Q2xhc3M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmNvbnN0cmFpbnREZXNjcmlwdG9yLmdldEFubm90YXRpb24oKS5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI2NGQ0Ni4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0NCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgVmFsaWRhdGlvbi1Nb2R1bGVzPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPHNjbT4NCi0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL3ZhbGlkYXRpb24tbW9kdWxlczwvY29ubmVjdGlvbj4NCi0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy92YWxpZGF0aW9uLW1vZHVsZXM8L2RldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy92YWxpZGF0aW9uLW1vZHVsZXM8L3VybD4NCi0gICAgPC9zY20+DQotDQotICAgIDxtb2R1bGVzPg0KLSAgICAgICAgPG1vZHVsZT5wcm9wZXJ0eS12YWxpZGF0aW9uPC9tb2R1bGU+DQotICAgICAgICA8IS0tbW9kdWxlPmJlYW4tdmFsaWRhdGlvbjwvbW9kdWxlLS0+DQotICAgIDwvbW9kdWxlcz4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmI5MmJjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFByb3BlcnR5LVZhbGlkYXRpb24tTW9kdWxlPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnBlcnNpc3RlbmNlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnBlcnNpc3RlbmNlLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIA0KLSAgICAgICAgPCEtLSBUZXN0IGRlcGVuZGVuY2llcyAtLT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuNTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0LmpzcDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3AtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnNoYWxlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNoYWxlLXRlc3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjQ8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgICAgIDxleGNsdXNpb25zPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5teWZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCi0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxyZXNvdXJjZXM+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgIDwvcmVzb3VyY2VzPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQuMjwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovQWJzdHJhY3QqLmphdmE8L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovVGVzdFV0aWxzLmphdmE8L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKkJlYW4uamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+DQotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4gICAgICAgICAgICANCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjNzQxNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiDQotICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjIiPg0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi0NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Mzc4NWQ2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQKLSAgICAgICAgLkFic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVSZXF1aXJlZEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZigoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQpKSB8fAotICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICAgICAgJiYKLSAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMoaXNDb21wb25lbnRSZXF1aXJlZCh1aUNvbXBvbmVudCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpICYmCi0gICAgICAgICAgICAgICAhQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSm9pblZhbGlkYXRpb25NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0pvaW5WYWxpZGF0aW9uTWV0YURhdGFTdG9yYWdlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MmNkZTAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSm9pblZhbGlkYXRpb25NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLk1ldGFEYXRhU3RvcmFnZUZpbHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBFWFRWQUwtNTkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpvaW5WYWxpZGF0aW9uTWV0YURhdGFTdG9yYWdlRmlsdGVyIGltcGxlbWVudHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVElDX1NFUEFSQVRPUiA9ICI6IjsNCi0NCi0gICAgcHVibGljIHZvaWQgZmlsdGVyKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKHByb3BlcnR5SW5mb3JtYXRpb24gIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFbnRyeT4oKTsNCi0NCi0gICAgICAgICAgICByZXNvbHZlSm9pblZhbGlkYXRpb25NZXRhRGF0YShwcm9wZXJ0eUluZm9ybWF0aW9uLCByZXN1bHQpOw0KLQ0KLSAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24ucmVzZXRNZXRhRGF0YUVudHJpZXMoKTsNCi0NCi0gICAgICAgICAgICBzZXREZWZhdWx0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5SW5mb3JtYXRpb24sIHJlc3VsdCk7DQotDQotICAgICAgICAgICAgaWYgKGNvbnRhaW5zSm9pblZhbGlkYXRpb25Db25zdHJhaW50KHJlc3VsdCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmaWx0ZXIocHJvcGVydHlJbmZvcm1hdGlvbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZXNvbHZlSm9pblZhbGlkYXRpb25NZXRhRGF0YShQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24sIExpc3Q8TWV0YURhdGFFbnRyeT4gcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSA6IHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0cnlUb1RyYW5zZm9ybUVudHJ5KG1ldGFEYXRhRW50cnkpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0RGVmYXVsdFByb3BlcnR5RGV0YWlscyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24sIExpc3Q8TWV0YURhdGFFbnRyeT4gcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSA6IHJlc3VsdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsDQotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMpKTsNCi0gICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLmFkZE1ldGFEYXRhRW50cnkobWV0YURhdGFFbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zSm9pblZhbGlkYXRpb25Db25zdHJhaW50KExpc3Q8TWV0YURhdGFFbnRyeT4gcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiByZXN1bHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBKb2luVmFsaWRhdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TWV0YURhdGFFbnRyeT4gdHJ5VG9UcmFuc2Zvcm1FbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIExpc3Q8TWV0YURhdGFFbnRyeT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUVudHJ5PigpOw0KLQ0KLSAgICAgICAgaWYgKG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEpvaW5WYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEpvaW5WYWxpZGF0aW9uIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEpvaW5WYWxpZGF0aW9uLmNsYXNzKTsNCi0NCi0gICAgICAgICAgICByZXBsYWNlTWV0YURhdGEoYW5ub3RhdGlvbiwgbWV0YURhdGFFbnRyeSwgcmVzdWx0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQuYWRkKG1ldGFEYXRhRW50cnkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVwbGFjZU1ldGFEYXRhKEpvaW5WYWxpZGF0aW9uIGFubm90YXRpb24sIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgTGlzdDxNZXRhRGF0YUVudHJ5PiByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIGZvciAoU3RyaW5nIHRhcmdldCA6IGFubm90YXRpb24udmFsdWUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb1JlcGxhY2VNZXRhRGF0YU9mVGFyZ2V0KHRhcmdldCwgbWV0YURhdGFFbnRyeSwgcmVzdWx0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9SZXBsYWNlTWV0YURhdGFPZlRhcmdldChTdHJpbmcgdGFyZ2V0LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIExpc3Q8TWV0YURhdGFFbnRyeT4gcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoaXNTdGF0aWNTeW50YXgodGFyZ2V0KSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFkZE1ldGFEYXRhKHJlc3VsdCwgZXh0cmFjdFN0YXRpY01ldGFEYXRhKHRhcmdldCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNZXRhRGF0YShyZXN1bHQsIGV4dHJhY3REeW5hbWljTWV0YURhdGEobWV0YURhdGFFbnRyeSwgdGFyZ2V0KSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyBhIGRpZmZlcmVudCBmaWx0ZXIgbWlnaHQgaW50cm9kdWNlIGEgbmV3IHN5bnRheCB3aGljaCBjYXVzZXMgdGhlIGV4Y2VwdGlvbg0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRNZXRhRGF0YShMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCwgTWV0YURhdGFFbnRyeVtdIG1ldGFEYXRhRW50cmllcykNCi0gICAgew0KLSAgICAgICAgQ29sbGVjdGlvbnMuYWRkQWxsKHJlc3VsdCwgbWV0YURhdGFFbnRyaWVzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTdGF0aWNTeW50YXgoU3RyaW5nIHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldC5jb250YWlucyhTVEFUSUNfU0VQQVJBVE9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhRW50cnlbXSBleHRyYWN0U3RhdGljTWV0YURhdGEoU3RyaW5nIHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgaW50IHNlcGFyYXRvckluZGV4ID0gdGFyZ2V0Lmxhc3RJbmRleE9mKFNUQVRJQ19TRVBBUkFUT1IpOw0KLQ0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBsb2FkQ2xhc3ModGFyZ2V0LnN1YnN0cmluZygwLCBzZXBhcmF0b3JJbmRleCkpOw0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRhcmdldC5zdWJzdHJpbmcoc2VwYXJhdG9ySW5kZXggKyAxKTsNCi0NCi0gICAgICAgIHJldHVybiBuZXcgU3RhdGljU3ludGF4TWV0YURhdGFFeHRyYWN0b3IoKS5leHRyYWN0KHRhcmdldENsYXNzLCBwcm9wZXJ0eU5hbWUpLmdldE1ldGFEYXRhRW50cmllcygpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBjbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBDbGFzc1V0aWxzLmxvYWRDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhRW50cnlbXSBleHRyYWN0RHluYW1pY01ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgU3RyaW5nIHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzLmNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChtZXRhRGF0YUVudHJ5LCB0YXJnZXQpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG5ldyBTdGF0aWNTeW50YXhNZXRhRGF0YUV4dHJhY3RvcigpLmV4dHJhY3QoDQotICAgICAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKSwgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCkpLmdldE1ldGFEYXRhRW50cmllcygpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgY2xhc3MgU3RhdGljU3ludGF4TWV0YURhdGFFeHRyYWN0b3IgZXh0ZW5kcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIFByb3BlcnR5SW5mb3JtYXRpb24gZXh0cmFjdChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldFByb3BlcnR5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOw0KLQ0KLSAgICAgICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnModGFyZ2V0Q2xhc3MsIHRhcmdldFByb3BlcnR5LCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgICAgICBhZGRGaWVsZEFjY2Vzc0Fubm90YXRpb25zKHRhcmdldENsYXNzLCB0YXJnZXRQcm9wZXJ0eSwgcHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gb2JqICE9IG51bGwgJiYgZ2V0Q2xhc3MoKS5lcXVhbHMob2JqLmdldENsYXNzKCkpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjFmNDM3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdEdyb3VwU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBuYW1lIG1hcHBlciBmb3IgZ3JvdXAgaW1wbGVtZW50YXRpb25zIHZpYSB2YWxpZGF0aW9uIHBhcmFtZXRlcnMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uUGFyYW1ldGVyLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0R3JvdXBTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZGIyNDkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci0KLS8qKgotICogdGhlIHNraXAgdmFsaWRhdGlvbiBzdXBwb3J0IHdhcyByZWZhY3RvcmVkIHRvIGFuIGluZGVwZW5kZW50IG1lY2hhbmlzbQotICogc2VlIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJjaGFuZ2UgdGhlIGFkZC1vbnMiICsKLSAgICAgICAgIm9sZCBuYW1lOiBWYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0IikKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBleHRlbmRzIFZhbGlkYXRpb25JbnRlcmNlcHRvcgotewotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDbGFzcyBnZXRNb2R1bGVLZXkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzczsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzYTNmZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5DQotew0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmQ1YjBiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VySG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkdyb3VwU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NZXRhRGF0YVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnJlY29yZGVyLkNyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkRlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLm1hcHBlci5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UubWFwcGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjQ3NDM2MTYxMjg1NzIyMjI4M0w7DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKG5ldyBDcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlcigpKTsNCi0NCi0gICAgICAgIGluaXRTdGF0aWNTdHJhdGVneU1hcHBpbmdzKCk7DQotICAgICAgICBpbml0RGVmYXVsdENvbXBvbmVudEluaXRpYWxpemVyKCk7DQotICAgICAgICBhZGRTa2lwVmFsaWRhdGlvblN1cHBvcnQoKTsNCi0gICAgICAgIGluaXRTdG9yYWdlTWFuYWdlckFuZE5hbWVNYXBwZXJzKCk7DQotICAgICAgICBpbml0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKTsNCi0gICAgICAgIGluaXRNZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdGF0aWNTdHJhdGVneU1hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGpwYUJhc2VkVmFsaWRhdGlvbiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OOw0KLSAgICAgICAgaWYgKGpwYUJhc2VkVmFsaWRhdGlvbiA9PSBudWxsDQotICAgICAgICAgICAgICAgIHx8ICFqcGFCYXNlZFZhbGlkYXRpb24uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA9IG5ldyBTdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgICAgICBzdGF0aWNDb25maWcuc2V0U291cmNlT2ZNYXBwaW5nKA0KLSAgICAgICAgICAgICAgICBFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSArIi5qcGFfc3RyYXRlZ3lfbWFwcGluZ3MiKTsNCi0NCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHLCBzdGF0aWNDb25maWcpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0RGVmYXVsdENvbXBvbmVudEluaXRpYWxpemVyKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRTa2lwVmFsaWRhdGlvblN1cHBvcnQoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJhZGRpbmcgc3VwcG9ydCBmb3IgQFNraXBWYWxpZGF0aW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5kZW55UmVuZGVyZXJJbnRlcmNlcHRvcihWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKG5ldyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsNCi0NCi0gICAgICAgIFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAvL2l0J3MganVzdCByZXF1aXJlZCB0byBzZXQgdGhlIHRhcmdldA0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTiwgU2tpcFZhbGlkYXRpb25TdXBwb3J0LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuU0tJUF9WQUxJREFUSU9OX1NVUFBPUlRfQ09ORklHLCBjb25maWcpOw0KLQ0KLSAgICAgICAgLy9jb25maWcuYWRkTWFwcGluZyhDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCBSZXF1aXJlZFN0cmF0ZWd5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdG9yYWdlTWFuYWdlckFuZE5hbWVNYXBwZXJzKCkNCi0gICAgew0KLSAgICAgICAgU3RvcmFnZU1hbmFnZXJIb2xkZXIgc3RvcmFnZU1hbmFnZXJIb2xkZXIgPQ0KLSAgICAgICAgICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlksIFN0b3JhZ2VNYW5hZ2VySG9sZGVyLmNsYXNzKSk7DQotDQotICAgICAgICAvL3Byb2Nlc3NlZC1pbmZvcm1hdGlvbg0KLSAgICAgICAgRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIgcHJvY2Vzc2VkSW5mb1N0b3JhZ2VNYW5hZ2VyID0NCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyKCk7DQotICAgICAgICBwcm9jZXNzZWRJbmZvU3RvcmFnZU1hbmFnZXIucmVnaXN0ZXIobmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBzdG9yYWdlTWFuYWdlckhvbGRlci5zZXRTdG9yYWdlTWFuYWdlcihQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MsIHByb2Nlc3NlZEluZm9TdG9yYWdlTWFuYWdlciwgZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9jcm9zcy12YWxpZGF0aW9uDQotICAgICAgICBEZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgPQ0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyKCk7DQotICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5yZWdpc3RlcihuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBzdG9yYWdlTWFuYWdlckhvbGRlci5zZXRTdG9yYWdlTWFuYWdlcihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlciwgZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ncm91cC12YWxpZGF0aW9uIGxpZ2h0DQotICAgICAgICBTdG9yYWdlTWFuYWdlciBzdG9yYWdlTWFuYWdlciA9IHN0b3JhZ2VNYW5hZ2VySG9sZGVyLmdldFN0b3JhZ2VNYW5hZ2VyKEdyb3VwU3RvcmFnZS5jbGFzcyk7DQotDQotICAgICAgICBpZihzdG9yYWdlTWFuYWdlciBpbnN0YW5jZW9mIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAoKEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxTdHJpbmc+KXN0b3JhZ2VNYW5hZ2VyKQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBQcm9wZXJ0eVZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5zZXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcihuZXcgUHJvcGVydHlWYWxpZGF0aW9uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TWV0YURhdGFTdG9yYWdlRmlsdGVycygpDQotICAgIHsNCi0gICAgICAgICBNZXRhRGF0YVN0b3JhZ2UgbWV0YURhdGFTdG9yYWdlID0gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZSgNCi0gICAgICAgICAgICAgICAgIE1ldGFEYXRhU3RvcmFnZS5jbGFzcywgTWV0YURhdGFTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBtZXRhRGF0YVN0b3JhZ2UucmVnaXN0ZXJGaWx0ZXIobmV3IEpvaW5WYWxpZGF0aW9uTWV0YURhdGFTdG9yYWdlRmlsdGVyKCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvblNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTVkYTU5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvblNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJvcGVydHlWYWxpZGF0aW9uVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgeC54LjMKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvciBpbXBsZW1lbnRzIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yCi17Ci0gICAgcHVibGljIGJvb2xlYW4gc2tpcFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQcm9wZXJ0eVZhbGlkYXRpb25VdGlscy5pc1ZhbGlkYXRpb25Ta2lwcGVkKGZhY2VzQ29udGV4dCwgdmFsaWRhdGlvblN0cmF0ZWd5LCBtZXRhRGF0YUVudHJ5KTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NzdhNGUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRvY3VtZW50YXRpb24iKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NRVNTQUdFU19KUEEgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJKUEFfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFUyIpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfSlBBX0JBU0VEX1ZBTElEQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OIik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0RvdWJsZVJhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNGUwMmYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0RvdWJsZVJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgRG91YmxlUmFuZ2UNCi17DQotICAgIGRvdWJsZSBtaW5pbXVtKCkgZGVmYXVsdCBEb3VibGUuTUlOX1ZBTFVFOw0KLQ0KLSAgICBkb3VibGUgbWF4aW11bSgpIGRlZmF1bHQgRG91YmxlLk1BWF9WQUxVRTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Kb2luVmFsaWRhdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjOWE4OTkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBKb2luVmFsaWRhdGlvbg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xlbmd0aC5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xlbmd0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzQzN2QxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBMZW5ndGgNCi17DQotICAgIGludCBtaW5pbXVtKCkgZGVmYXVsdCAwOw0KLQ0KLSAgICBpbnQgbWF4aW11bSgpIGRlZmF1bHQgSW50ZWdlci5NQVhfVkFMVUU7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MjUxZWYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIExvbmdSYW5nZQ0KLXsNCi0gICAgbG9uZyBtaW5pbXVtKCkgZGVmYXVsdCBMb25nLk1JTl9WQUxVRTsNCi0NCi0gICAgbG9uZyBtYXhpbXVtKCkgZGVmYXVsdCBMb25nLk1BWF9WQUxVRTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzc1ZDg5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUGF0dGVybg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgIm5vX21hdGNoIjsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZC5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExY2UxMjguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUmVxdWlyZWQNCi17DQotICAgIC8qKg0KLSAgICAgKiB0byBjdXN0b21pemUgdGhlIGVycm9yIG1lc3NhZ2Ugb3INCi0gICAgICogdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQganNmIHJlcXVpcmVkIG1lc3NhZ2Ugd2l0aCB0aGUgdXNhZ2Ugb2YgdGhlIG1lc3NhZ2UgcmVzb2x2ZXIgbWVjaGFuaXNtDQotICAgICAqDQotICAgICAqIEByZXR1cm4gYW4gb3B0aW9uYWwgZXJyb3IgbWVzc2FnZSBrZXkNCi0gICAgICovDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJmaWVsZF9yZXF1aXJlZCI7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmM1MjliLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgU2tpcFZhbGlkYXRpb24NCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IHt9Ow0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMDc2MjEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVGFyZ2V0KFRZUEUpCi1AUmV0ZW50aW9uKFJVTlRJTUUpCi1ARG9jdW1lbnRlZAotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgQGludGVyZmFjZSBTa2lwVmFsaWRhdGlvblN1cHBvcnQKLXsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vVmFsaWRhdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMzhhY2EuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFZhbGlkYXRvcg0KLXsNCi0gICAgQ2xhc3M8PyBleHRlbmRzIGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I+W10gdmFsdWUoKTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTg5MDUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvciBleHRlbmRzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcgotewotICAgIHByaXZhdGUgRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvcigpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgZ2V0SW5zdGFuY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3IobmV3IERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQotICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOwotCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFByb3BlcnR5RGV0YWlscykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24ob2JqZWN0LmdldENsYXNzKCkgKyAiIGlzIG5vdCBhICIgKyBQcm9wZXJ0eURldGFpbHMuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSAoUHJvcGVydHlEZXRhaWxzKW9iamVjdDsKLQotICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKTsKLQotICAgICAgICAvL1RPRE8gdGVzdCB3aXRoIGNvbXBsZXggY29tcG9uZW50cwotICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnNldEluZm9ybWF0aW9uKAotICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBmaW5kIGFuZCBhZGQgYW5ub3RhdGlvbnMKLSAgICAgICAgICovCi0gICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9ucyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTgwMTIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9SW52YWxpZCBmb3JtYXQNCi1ub19tYXRjaF9kZXRhaWw9VGhlIHJlcXVpcmVkIGZvcm1hdGUgaXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YWI1NDMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9XHUwNjI3XHUwNjQ0XHUwNjM1XHUwNjRhXHUwNjNhXHUwNjI5IFx1MDYyZVx1MDYyN1x1MDYzN1x1MDYyNlx1MDYyOQ0KLW5vX21hdGNoX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MzVcdTA2NGFcdTA2M2FcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjM3XHUwNjQ0XHUwNjQ4XHUwNjI4XHUwNjI5IFx1MDY0N1x1MDY0OTogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThkNjQ5MC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotbm9fbWF0Y2g9Rm9ybWF0IGludlx1MDBlMGxpZAotbm9fbWF0Y2hfZGV0YWlsPUVsIGZvcm1hdCByZXF1ZXJpdCBcdTAwZTlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWU3MDFiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPVVuZ/xsdGlnZXMgRm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPURhcyBlcmZvcmRlcmxpY2hlIEZvcm1hdCBpc3Q6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTgwMTIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9SW52YWxpZCBmb3JtYXQNCi1ub19tYXRjaF9kZXRhaWw9VGhlIHJlcXVpcmVkIGZvcm1hdGUgaXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYjEwNzcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW5vX21hdGNoPUZvcm1hdG8gaW52XHUwMGUxbGlkbyAKLW5vX21hdGNoX2RldGFpbD1FbCBmb3JtYXRvIHJlcXVlcmlkbyBlczogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwYTIyMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1MZSBmb3JtYXQgZXN0IGludmFsaWRlDQotbm9fbWF0Y2hfZGV0YWlsPUxlIGZvcm1hdCBkb2l0ICZlY2lyYzt0cmUgZGUgbGEgZm9ybWU6IHswfQ0KLQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxODc0OGMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW5vX21hdGNoPUZvcm1hdG8gbm9uIHZhbGlkbwotbm9fbWF0Y2hfZGV0YWlsPUlsIGZvcm1hdG8gcmljaGllc3RvICZlZ3JhdmU7OiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTRiYzc0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUdlXHUwMGU3ZXJzaXogYmlcdTAwZTdpbQ0KLW5vX21hdGNoX2RldGFpbD1nZXJla2VuIGJpXHUwMGU3aW06IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWFlNjRiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLSAgICAgICAgZXh0ZW5kcw0KLSAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBiYXNlTmFtZSA9IG51bGw7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYgKGJhc2VOYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZU5hbWUgPSBzdXBlci5nZXRCYXNlTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGJhc2VOYW1lOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9KcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9KcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ3NmFkOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogdGhlIGpwYSBzdXBwb3J0IGlzIGFuIGV4Y2VwdGlvbiBpbiB2aWV3IG9mIHNvbWUgbWVjaGFuaXNtcyAtIHNvIHRoZXJlJ3Mgbm8gY29udmVudGlvbiBmb3IgdGhlIG1lc3NhZ2UgYnVuZGxlLg0KLSAqIGluc3RlYWQgb2YgdGhlIGNvbnZlbnRpb24gdGhlcmUgaXMgYSBnbG9iYWwgcHJvcGVydHkgdG8gaGF2ZSBhbiBhbHRlcm5hdGl2ZSB0byB3ZWIueG1sIGNvbmZpZ3VyYXRpb24NCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMgPSAiSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0JBU0VfTkFNRSA9IFdlYlhtbFBhcmFtZXRlci5WQUxJREFUSU9OX01FU1NBR0VTX0pQQTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfTkFNRSA9IEpwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5jbGFzcw0KLSAgICAgICAgICAgIC5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLnJlcGxhY2UoIi5tZXNzYWdlLnJlc29sdmVyIiwgIi5tZXNzYWdlLmJ1bmRsZSIpKyAiLmpwYV9tZXNzYWdlcyI7DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tQmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZihDVVNUT01fQkFTRV9OQU1FICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIENVU1RPTV9CQVNFX05BTUU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKFN0cmluZylFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShKUEFfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFUyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBCQVNFX05BTUU7DQotICAgIH0NCi0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Eb3VibGVSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyODBlZDAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Eb3VibGVSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkRvdWJsZVJhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBEb3VibGVSYW5nZSBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShEb3VibGVSYW5nZS5jbGFzcyk7DQotDQotICAgICAgICBkb3VibGUgbWluaW11bSA9IGFubm90YXRpb24ubWluaW11bSgpOw0KLQ0KLSAgICAgICAgaWYobWluaW11bSAhPSBEb3VibGUuTUlOX1ZBTFVFKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4sIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU5fREVGQVVMVCwgbWluaW11bSk7DQotICAgICAgICB9DQotDQotICAgICAgICBkb3VibGUgbWF4aW11bSA9IGFubm90YXRpb24ubWF4aW11bSgpOw0KLQ0KLSAgICAgICAgaWYobWF4aW11bSAhPSBEb3VibGUuTUFYX1ZBTFVFKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVhfREVGQVVMVCwgbWF4aW11bSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pvaW5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pvaW5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZDZlOTAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3Rvci5EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3BlcnR5VmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotQERlcHJlY2F0ZWQNCi1wdWJsaWMgY2xhc3MgSm9pbk1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY29udmVydChtZXRhRGF0YUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCJ0aGlzIGNsYXNzIGlzIHJlcGxhY2VkIGJ5IGEgbWV0YS1kYXRhIHN0b3JhZ2UgZmlsdGVyLiAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiaWYgaXQgZ2V0cyBpbnZva2VkIGFuZCBhbiBleGNlcHRpb24gb2NjdXJzLCBhIGN1c3RvbSBzeW50YXggaXMgdXNlZC4iICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBjbGFzcyBtaWdodCBiZSB1c2VkIGJ5IGFuIG9sZCBhZGQtb24uIHBsZWFzZSBjaGVjayBmb3IgYSBuZXdlciB2ZXJzaW9uLiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnQoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBleHRyYWN0b3IgPSBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmdldEluc3RhbmNlKCk7DQotDQotICAgICAgICBTdHJpbmdbXSB0YXJnZXRFeHByZXNzaW9ucyA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoSm9pblZhbGlkYXRpb24uY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdGFyZ2V0RXhwcmVzc2lvbiA6IHRhcmdldEV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogZXh0cmFjdG9yLmV4dHJhY3QoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscykuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSA9PSBudWxsIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZGF0aW9uU2tpcHBlZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3ksIGVudHJ5KSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IEV4dFZhbFV0aWxzLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoIShlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQW5ub3RhdGlvbiAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXh0cmFjdChlbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pdGVyYXRvcigpLmhhc05leHQoKSkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXRBbGwobWV0YURhdGFUcmFuc2Zvcm1lci5jb252ZXJ0TWV0YURhdGEoZW50cnkpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MjQxMjAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5CYXNpYzsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJpbXBsLiB0aGUgcmVzdCIpDQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IG1ldGFEYXRhLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIENvbHVtbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZigoISgoQ29sdW1uKSBhbm5vdGF0aW9uKS5udWxsYWJsZSgpKSAmJiBFeHRWYWxVdGlscy5pbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgsICgoQ29sdW1uKSBhbm5vdGF0aW9uKS5sZW5ndGgoKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKGFubm90YXRpb24gaW5zdGFuY2VvZiBCYXNpYykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighKChCYXNpYykgYW5ub3RhdGlvbikub3B0aW9uYWwoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihhbm5vdGF0aW9uIGluc3RhbmNlb2YgSWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vVE9ETyBpbXBsLiB0aGUgcmVzdCEhIQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9MZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBlODFiYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxlbmd0aDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIExlbmd0aCBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMZW5ndGguY2xhc3MpOw0KLQ0KLSAgICAgICAgaW50IG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gIT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSCwgbWluaW11bSk7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIX0RFRkFVTFQsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW50IG1heGltdW0gPSBhbm5vdGF0aW9uLm1heGltdW0oKTsNCi0gICAgICAgIGlmKG1heGltdW0gIT0gSW50ZWdlci5NQVhfVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIX0RFRkFVTFQsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Mb25nUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYxMmE3YS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxvbmdSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIExvbmdSYW5nZSBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMb25nUmFuZ2UuY2xhc3MpOw0KLQ0KLSAgICAgICAgbG9uZyBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW5pbXVtKCk7DQotDQotICAgICAgICBpZihtaW5pbXVtICE9IExvbmcuTUlOX1ZBTFVFKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4sIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU5fREVGQVVMVCwgbWluaW11bSk7DQotICAgICAgICB9DQotDQotICAgICAgICBsb25nIG1heGltdW0gPSBhbm5vdGF0aW9uLm1heGltdW0oKTsNCi0NCi0gICAgICAgIGlmKG1heGltdW0gIT0gTG9uZy5NQVhfVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCwgbWF4aW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWF9ERUZBVUxULCBtYXhpbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0YTViNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1BhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5QYXR0ZXJuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIFBhdHRlcm4gYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoUGF0dGVybi5jbGFzcyk7DQotICAgICAgICANCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOLCAoYW5ub3RhdGlvbikudmFsdWUoKSk7DQotDQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5ID0gKGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICAgICAgTG9jYWxlIGN1cnJlbnRMb2NhbGUgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKTsNCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kgPQ0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZyA9IEV4dFZhbFV0aWxzLmdldE1lc3NhZ2VSZXNvbHZlckZvclZhbGlkYXRpb25TdHJhdGVneSh2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICAgICAgLmdldE1lc3NhZ2UodmFsaWRhdGlvbkVycm9yTXNnS2V5LCBjdXJyZW50TG9jYWxlKTsNCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRSwgdmFsaWRhdGlvbkVycm9yTXNnKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGY1YWE3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFJlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ta2lwTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ta2lwTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmI4MjU3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU2tpcE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgU2tpcE1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04sIHRydWUpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1ZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxNzQ4OS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1ZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBWYWxpZGF0b3IgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoVmFsaWRhdG9yLmNsYXNzKTsNCi0NCi0gICAgICAgIENsYXNzW10gdmFsaWRhdG9ycyA9IGFubm90YXRpb24udmFsdWUoKTsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRDbGFzcyA6IHZhbGlkYXRvcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoY3VycmVudENsYXNzLmdldFNpbXBsZU5hbWUoKS50b0xvd2VyQ2FzZSgpLmNvbnRhaW5zKENvbW1vbk1ldGFEYXRhS2V5cy5FTUFJTCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWx1ZS5hZGQoQ29tbW9uTWV0YURhdGFLZXlzLkVNQUlMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdmFsdWUuYWRkKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLkNVU1RPTSwgdmFsdWUpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3NTkzMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkRvdWJsZVJhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuRG91YmxlUmFuZ2VWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERvdWJsZVJhbmdlU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLQ0KLSAgICAgICAgRG91YmxlUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoRG91YmxlUmFuZ2UuY2xhc3MpOw0KLSAgICAgICAgRG91YmxlUmFuZ2VWYWxpZGF0b3IgZG91YmxlUmFuZ2VWYWxpZGF0b3IgPSAoRG91YmxlUmFuZ2VWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoImphdmF4LmZhY2VzLkRvdWJsZVJhbmdlIik7DQotDQotICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSm9pblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2NhMjljLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSm9pblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3Rvci5EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY2VzRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotQERlcHJlY2F0ZWQNCi1wdWJsaWMgY2xhc3MgSm9pblZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlSm9pblZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChGYWNlc0V4Y2VwdGlvbiB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IHQ7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybigidGhpcyBjbGFzcyBpcyByZXBsYWNlZCBieSBhIG1ldGEtZGF0YSBzdG9yYWdlIGZpbHRlci4gIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgImlmIGl0IGdldHMgaW52b2tlZCBhbmQgYW4gZXhjZXB0aW9uIG9jY3VycywgYSBjdXN0b20gc3ludGF4IGlzIHVzZWQuIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgY2xhc3MgbWlnaHQgYmUgdXNlZCBieSBhbiBvbGQgYWRkLW9uLiBwbGVhc2UgY2hlY2sgZm9yIGEgbmV3ZXIgdmVyc2lvbi4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlSm9pblZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgZXh0cmFjdG9yID0gRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5nZXRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgU3RyaW5nW10gdGFyZ2V0RXhwcmVzc2lvbnMgPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEpvaW5WYWxpZGF0aW9uLmNsYXNzKS52YWx1ZSgpOw0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHM7DQotICAgICAgICBmb3IgKFN0cmluZyB0YXJnZXRFeHByZXNzaW9uIDogdGFyZ2V0RXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChtZXRhRGF0YUVudHJ5LCB0YXJnZXRFeHByZXNzaW9uKTsNCi0NCi0gICAgICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBleHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHByb3BlcnR5RGV0YWlscykuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoRXh0VmFsVXRpbHMucHJvY2Vzc01ldGFEYXRhRW50cnlBZnRlclNraXBWYWxpZGF0aW9uKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBlbnRyeSkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm5vIHZhbGlkYXRpb24gc3RyYXRlZ3kgZm91bmQgZm9yICIgKyBlbnRyeS5nZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAwNDFkOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uZXhjZXB0aW9uLlJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkJhc2ljOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZTsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmU7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpwYVZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUZhY2VzQnVuZGxlID0gZmFsc2U7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFURV9MRU5HVEggPSAibGVuZ3RoIjsNCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmlvbGF0aW9uOw0KLSAgICBwcml2YXRlIGludCBtYXhMZW5ndGg7DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKTsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgQ29sdW1uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlQ29sdW1uQW5ub3RhdGlvbigoQ29sdW1uKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIEJhc2ljKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlQmFzaWNBbm5vdGF0aW9uKChCYXNpYykgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBJZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgT25lVG9PbmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVPbmVUb09uZUFubm90YXRpb24oKE9uZVRvT25lKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE1hbnlUb09uZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZU1hbnlUb09uZUFubm90YXRpb24oKE1hbnlUb09uZSkgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVDb2x1bW5Bbm5vdGF0aW9uKENvbHVtbiBjb2x1bW4sIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKCFjb2x1bW4ubnVsbGFibGUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCBpbnN0YW5jZW9mIFN0cmluZw0KLSAgICAgICAgICAgICAgICAmJiBjb2x1bW4ubGVuZ3RoKCkgPCAoKFN0cmluZykgY29udmVydGVkT2JqZWN0KS5sZW5ndGgoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbiA9IFZBTElEQVRFX0xFTkdUSDsNCi0gICAgICAgICAgICB0aGlzLm1heExlbmd0aCA9IGNvbHVtbi5sZW5ndGgoKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWVzc2FnZShudWxsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQmFzaWNBbm5vdGF0aW9uKEJhc2ljIGJhc2ljLCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICghYmFzaWMub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlT25lVG9PbmVBbm5vdGF0aW9uKE9uZVRvT25lIG9uZVRvT25lLCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIW9uZVRvT25lLm9wdGlvbmFsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU1hbnlUb09uZUFubm90YXRpb24oTWFueVRvT25lIG1hbnlUb09uZSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFtYW55VG9PbmUub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCB8fCAoIiIuZXF1YWxzKGNvbnZlcnRlZE9iamVjdCkgJiYgRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb24gPSBDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQ7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWVzc2FnZShudWxsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoVkFMSURBVEVfTEVOR1RILmVxdWFscyh0aGlzLnZpb2xhdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJmaWVsZF90b29fbG9uZyI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJmaWVsZF9yZXF1aXJlZCI7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHN1cGVyLmdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgIGlmIChWQUxJREFURV9MRU5HVEguZXF1YWxzKHRoaXMudmlvbGF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLCAiIiArIHRoaXMubWF4TGVuZ3RoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc3VwZXIucmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0gICAgICAgIFN0cmluZyBtYXJrZXIgPSBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5NSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0NCi0gICAgICAgIGlmKChtYXJrZXIgKyBrZXkgKyBtYXJrZXIpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudXNlRmFjZXNCdW5kbGUgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IGUuZ2V0RmFjZXNNZXNzYWdlKCk7DQotDQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKFZBTElEQVRFX0xFTkdUSC5lcXVhbHModGhpcy52aW9sYXRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0TWF4aW11bU1lc3NhZ2UoZmFjZXNNZXNzYWdlLCB0aGlzLm1heExlbmd0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xlbmd0aFN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xlbmd0aFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZDA1NTguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMZW5ndGhTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBMZW5ndGggYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTGVuZ3RoLmNsYXNzKTsNCi0gICAgICAgIExlbmd0aFZhbGlkYXRvciBsZW5ndGhWYWxpZGF0b3IgPSAoTGVuZ3RoVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5MZW5ndGgiKTsNCi0NCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTG9uZ1JhbmdlU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTG9uZ1JhbmdlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM1ODIwMi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Mb25nUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5Mb25nUmFuZ2VWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExvbmdSYW5nZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIExvbmdSYW5nZSBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMb25nUmFuZ2UuY2xhc3MpOw0KLSAgICAgICAgTG9uZ1JhbmdlVmFsaWRhdG9yIGxvbmdSYW5nZVZhbGlkYXRvciA9IChMb25nUmFuZ2VWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigiamF2YXguZmFjZXMuTG9uZ1JhbmdlIik7DQotDQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bShhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9QYXR0ZXJuU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBkMzY4My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUGF0dGVyblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5PFBhdHRlcm4+DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBQYXR0ZXJuIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFBhdHRlcm4uY2xhc3MpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZXhwcmVzc2lvbiA6IGFubm90YXRpb24udmFsdWUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0ID09IG51bGwNCi0gICAgICAgICAgICAgICAgICAgIHx8ICFqYXZhLnV0aWwucmVnZXguUGF0dGVybi5jb21waWxlKGV4cHJlc3Npb24pLm1hdGNoZXIoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdC50b1N0cmluZygpKS5tYXRjaGVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG5ldyBGYWNlc01lc3NhZ2UoDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiksDQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24pLnJlcGxhY2UoInswfSIsIGV4cHJlc3Npb24pKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KFBhdHRlcm4gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZXF1aXJlZFN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQzMzg0OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5leGNlcHRpb24uUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZFN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5PFJlcXVpcmVkPg0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUZhY2VzQnVuZGxlID0gZmFsc2U7DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCB8fCBjb252ZXJ0ZWRPYmplY3QuZXF1YWxzKCIiKSB8fA0KLSAgICAgICAgICAgICAgICAoY29udmVydGVkT2JqZWN0IGluc3RhbmNlb2YgQ29sbGVjdGlvbiAmJiAoKENvbGxlY3Rpb24pY29udmVydGVkT2JqZWN0KS5pc0VtcHR5KCkpIHx8DQotICAgICAgICAgICAgICAgIChjb252ZXJ0ZWRPYmplY3QgaW5zdGFuY2VvZiBNYXAgJiYgKChNYXApY29udmVydGVkT2JqZWN0KS5pc0VtcHR5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgIGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWVzc2FnZShtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFJlcXVpcmVkLmNsYXNzKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KFJlcXVpcmVkIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShlLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1NraXBWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvU2tpcFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTg2MTAzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvU2tpcFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBTa2lwVmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFN0cmluZ1tdIHZhbHVlQmluZGluZ0V4cHJlc3Npb25zID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShTa2lwVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIGZvcihTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA6IHZhbHVlQmluZGluZ0V4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRWYWx1ZU9mRXhwcmVzc2lvbigNCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKSkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5zZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5TS0lQX1ZBTElEQVRJT04sIHRydWUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9WYWxpZGF0b3JTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9WYWxpZGF0b3JTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjNjYzkxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLQ0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I+W10gdmFsaWRhdG9yQ2xhc3NlcyA9DQotICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShWYWxpZGF0b3IuY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yIHZhbGlkYXRvcjsNCi0gICAgICAgIGZvciAoQ2xhc3MgdmFsaWRhdG9yQ2xhc3NOYW1lIDogdmFsaWRhdG9yQ2xhc3NlcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0b3IgPSAoamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcikgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzcyh2YWxpZGF0b3JDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UodmFsaWRhdG9yQ2xhc3NOYW1lLmdldE5hbWUoKSArICIgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EwNDIzNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5LkFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWNlc0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogVGhpcyBwaGFzZSBsaXN0ZW5lciBwcm9jZXNzZXMgY3Jvc3MgdmFsaWRhdGlvbiBhcyBzb29uIGFzIGl0IGZpbmRzIGEgc3BlY2lhbCByZXF1ZXN0IHNjb3BlZCBzdG9yYWdlLjxici8+DQotICogU28gaXQncyBwb3NzaWJsZSB0byBhZGQgaW5mb3JtYXRpb24gZHVyaW5nIHRoZSBwcm9jZXNzIHZhbGlkYXRpb24gcGhhc2UuIEF0IHRoZSBlbmQgb2YgdGhpcyBwaGFzZSBpdCBnZXRzIHByb2Nlc3NlZC4NCi0gKiBBZnRlciB0aGF0IHRoZSBzdG9yYWdlIGdldHMgcmVzZXRlZC48cC8+DQotICogSWYgeW91IHByb3ZpZGUgYSBjdXN0b20gZXh0ZW5zaW9uIGFuZCB5b3UgYWRkIHRoZSBzYW1lIHN0b3JhZ2UgdHlwZSB3aXRoaW4gYSBkaWZmZXJlbnQgcGhhc2UsDQotICogaXQgYWxzbyBnZXRzIHByb2Nlc3NlZCBhdCB0aGUgZW5kIG9mIHRoYXQgcGhhc2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTUzMzM0MDU4OTc2MzU3NDI3MzJMOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSA9IENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKTsNCi0gICAgICAgICAgICBmb3IgKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA6IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UuZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZighRXh0VmFsVXRpbHMuZXhlY3V0ZUdsb2JhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0Q29tcG9uZW50KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuY2xhc3MuZ2V0TmFtZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIC8vY2FsbCBpbml0LW1ldGhvZA0KLSAgICAgICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkgaW5zdGFuY2VvZiBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5nZXRDbGFzcygpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5pdENyb3NzVmFsaWRhdGlvbiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAgICAgICAgICogdmFsaWRhdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICovDQotICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5wcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKGVudHJ5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhZGRNZXNzYWdlID0gdHJ1ZTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpIGluc3RhbmNlb2YgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1lc3NhZ2UgPSAoQm9vbGVhbilSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkuZ2V0Q2xhc3MoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuY2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0Q2xhc3MoKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmKGFkZE1lc3NhZ2UpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjZXNNZXNzYWdlICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudElkKGVudHJ5LmdldENsaWVudElkKCksIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvQmxvY2tzTmF2aWdhdGlvbkZvckNvbXBvbmVudElkKGVudHJ5LmdldENsaWVudElkKCksIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZmluYWxseQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5leGVjdXRlR2xvYmFsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldENvbXBvbmVudCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmNsYXNzLmdldE5hbWUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBmaW5hbGx5DQotICAgICAgICB7DQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMucmVzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc0luaXRpYWxpemVkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04gIT0gbnVsbA0KLSAgICAgICAgICAgICAgICAgICAgJiYgV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEpzZlV0aWxzLmRlcmVnaXN0ZXJQaGFzZUxpc3RlbmVyKHRoaXMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpc0luaXRpYWxpemVkID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLkFOWV9QSEFTRTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzQwMjc5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0NST1NTVkFMSURBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OIik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDRkMmE0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBEYXRlSXMNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlT2YoKTsNCi0NCi0gICAgLyoNCi0gICAgICogb3B0aW9uYWwgc2VjdGlvbg0KLSAgICAgKi8NCi0NCi0gICAgRGF0ZUlzVHlwZSB0eXBlKCkgZGVmYXVsdCBEYXRlSXNUeXBlLnNhbWU7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICIiOw0KLQ0KLSAgICBTdHJpbmcgbm90QmVmb3JlRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJ3cm9uZ19kYXRlX25vdF9iZWZvcmUiOw0KLQ0KLSAgICBTdHJpbmcgbm90QWZ0ZXJFcnJvck1zZ0tleSgpIGRlZmF1bHQgIndyb25nX2RhdGVfbm90X2FmdGVyIjsNCi0NCi0gICAgU3RyaW5nIG5vdEVxdWFsRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJ3cm9uZ19kYXRlX25vdF9lcXVhbCI7DQotDQotICAgIGludCBlcnJvck1lc3NhZ2VEYXRlU3R5bGUoKSBkZWZhdWx0IERhdGVGb3JtYXQuTUVESVVNOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJc1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1ZjQ4Mi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJc1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImJlZm9yZU9yU2FtZSwgYWZ0ZXJPclNhbWUiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBlbnVtIERhdGVJc1R5cGUNCi17DQotICAgIGJlZm9yZSwgYWZ0ZXIsIHNhbWUNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZTc2YjcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgRXF1YWxzDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZSgpOw0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkIjsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL05vdEVxdWFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjdiYzQ0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIE5vdEVxdWFscw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQiOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ1ZGIyNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUmVxdWlyZWRJZg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWVPZigpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBvcHRpb25hbCBzZWN0aW9uDQotICAgICAqLw0KLQ0KLSAgICBSZXF1aXJlZElmVHlwZSBpcygpIGRlZmF1bHQgUmVxdWlyZWRJZlR5cGUubm90X2VtcHR5Ow0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZW1wdHlfZmllbGQiOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmVHlwZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWM1OGQ5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGVudW0gUmVxdWlyZWRJZlR5cGUNCi17DQotICAgIGVtcHR5LCBub3RfZW1wdHkNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjYwNzU5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9SW5wdXQgaXMgZGlmZmVyZW50DQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1JbnB1dCBpcyBkaWZmZXJlbnQNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLQ0KLXdyb25nX2RhdGU9V3JvbmcgZGF0ZQ0KLXdyb25nX2RhdGVfZGV0YWlsPVdyb25nIGRhdGUNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZmOTNjNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPVx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDVcdTA2MmVcdTA2MmFcdTA2NDRcdTA2NDENCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDVcdTA2MmVcdTA2MmFcdTA2NDRcdTA2NDENCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPVx1MDYzYVx1MDY0YVx1MDYzMSBcdTA2NDVcdTA2MzNcdTA2NDVcdTA2NDhcdTA2MmQgXHUwNjI4XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0IFx1MDY0NiBcdTA2NDFcdTA2MzMgXHUwNjQyXHUwNjRhXHUwNjQ1XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPVx1MDYzYVx1MDY0YVx1MDYzMSBcdTA2NDVcdTA2MzNcdTA2NDVcdTA2NDhcdTA2MmQgXHUwNjI4XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0ICBcdTA2NDZcdTA2NDFcdTA2MzMgXHUwNjQyXHUwNjRhXHUwNjQ1XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NA0KLQ0KLXdyb25nX2RhdGU9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDYyZVx1MDYyN1x1MDYzN1x1MDY0OVx1MDYyMQ0KLXdyb25nX2RhdGVfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2NDlcdTA2MjENCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzXHUwNjQ4IFx1MDY0NiBcdTA2MjhcdTA2MzlcdTA2MmYgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDMgXHUwNjQ4XHUwNjQ2IFx1MDYyOFx1MDYzOVx1MDYyZiB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDNcdTA2NDggXHUwNjQ2IFx1MDY0Mlx1MDYyOFx1MDY0NCB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzIFx1MDY0OFx1MDY0NiBcdTA2NDJcdTA2MjhcdTA2NDQgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0NFx1MDYyNyBcdTA2NGFcdTA2MzNcdTA2MjdcdTA2NDhcdTA2NDkgezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NDRcdTA2MjcgXHUwNjRhXHUwNjMzXHUwNjI3XHUwNjQ4XHUwNjQ5IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1NGVkMi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1lbCB2YWxvciBcdTAwZTkgZGlmZXJlbnQKLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9ZWwgdmFsb3IgXHUwMGU5IGRpZmVyZW50Ci0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9bm8gZXMgcGVybWV0IGVsIG1hdGVpeCB2YWxvcgotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9bm8gZXMgcGVybWV0IGVsIG1hdGVpeCB2YWxvcgotCi13cm9uZ19kYXRlPWRhdGEgZXJyXHUwMGYybmlhCi13cm9uZ19kYXRlX2RldGFpbD1kYXRhIGVyclx1MDBmMm5pYQotCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9bGEgZGF0YSBoYSBkZSBzZXIgcG9zdGVyaW9yIGEgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotCi13cm9uZ19kYXRlX25vdF9hZnRlcj1sYSBkYXRhIGhhIGRlIHNlciBhbnRlcmlvciBhIHswfQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotCi13cm9uZ19kYXRlX25vdF9lcXVhbD1sYSBkYXRhIG5vIFx1MDAwZTlzIGlndWFsIGEgezB9Ci13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9bGEgZGF0YSBubyBcdTAwMGU5cyBpZ3VhbCBhIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4NzIzNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUVpbmdhYmUgaXN0IHVudGVyc2NoaWVkbGljaA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9RWluZ2FiZSBpc3QgdW50ZXJzY2hpZWRsaWNoDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1EZXIgZ2xlaWNoZSBXZXJ0IGlzdCBuaWNodCBlcmxhdWJ0DQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9RGVyIGdsZWljaGUgV2VydCBpc3QgbmljaHQgZXJsYXVidA0KLQ0KLXdyb25nX2RhdGU9RGF0dW0gaW5rb3JyZWt0DQotd3JvbmdfZGF0ZV9kZXRhaWw9RGF0dW0gaW5rb3JyZWt0DQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhcyBEYXR1bSBtdXNzIG5hY2ggZGVtIHswfSBzZWluDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1EYXMgRGF0dW0gbXVzcyBuYWNoIGRlbSB7MH0gc2Vpbg0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPURhcyBEYXR1bSBtdXNzIHZvciBkZW0gezB9IHNlaW4NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9RGFzIERhdHVtIG11c3Mgdm9yIGRlbSB7MH0gc2Vpbg0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPURhcyBEYXR1bSBlbnRzcHJpY2h0IG5pY2h0IGRlbSB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGFzIERhdHVtIGVudHNwcmljaHQgbmljaHQgZGVtIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2MDc1OS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUlucHV0IGlzIGRpZmZlcmVudA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9SW5wdXQgaXMgZGlmZmVyZW50DQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi0NCi13cm9uZ19kYXRlPVdyb25nIGRhdGUNCi13cm9uZ19kYXRlX2RldGFpbD1Xcm9uZyBkYXRlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMzg1MjQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9bGEgZW50cmFkYSBlcyBkaWZlcmVudGUKLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9bGEgZW50cmFkYSBlcyBkaWZlcmVudGUKLQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1ubyBzZSBwZXJtaXRlbiBlbnRyYWRhcyBpZ3VhbGVzCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1ubyBzZSBwZXJtaXRlbiBlbnRyYWRhcyBpZ3VhbGVzCi0KLXdyb25nX2RhdGU9ZmVjaGEgZXF1aXZvY2FkYQotd3JvbmdfZGF0ZV9kZXRhaWw9ZmVjaGEgZXF1aXZvY2FkYQotCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBsdWVnbyBkZSB7MH0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBsdWVnbyBkZSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBhbnRlcyBkZSB7MH0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGFudGVzIGRlIHswfQotCi13cm9uZ19kYXRlX25vdF9lcXVhbD1sYSBmZWNoYSBubyBlcyBpZ3VhbCBhIHswfQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPWxhIGZlY2hhIG5vIGVzIGlndWFsIGEgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWYwMjE4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9TGVzIGNoYW1wcyBzb250IGRpZmYmZWFjdXRlO3JlbnRzDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1MZXMgY2hhbXBzIHNvbnQgZGlmZiZlYWN1dGU7cmVudHMNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPUxlcyBjaGFtcHMgZG9pdmVudCAmZWNpcmM7dHJlIGRpZmYmZWFjdXRlO3JlbnRzDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9TGVzIGNoYW1wcyBkb2l2ZW50ICZlY2lyYzt0cmUgZGlmZiZlYWN1dGU7cmVudHMNCi0NCi13cm9uZ19kYXRlPUxhIGRhdGUgZXN0IGluY29ycmVjdGUNCi13cm9uZ19kYXRlX2RldGFpbD1MYSBkYXRlIGVzdCBpbmNvcnJlY3RlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGFwciZlZ3JhdmU7cyB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGFwciZlZ3JhdmU7cyB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhdmFudCB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXZhbnQgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9TGEgZGF0ZSBuJ2VzdCBwYXMgJmVhY3V0ZTtnYWxlICZhZ3JhdmU7IHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1MYSBkYXRlIG4nZXN0IHBhcyAmZWFjdXRlO2dhbGUgJmFncmF2ZTsgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDQyODAxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPVZhbG9yaSBub24gdWd1YWxpCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUkgdmFsb3JpIGluc2VyaXRpIG5vbiBjb2luY2lkb25vCi0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9TG8gc3Rlc3NvIHZhbG9yZSBub24gJmVncmF2ZTsgcGVybWVzc28KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPUxvIHN0ZXNzbyB2YWxvcmUgbm9uICZlZ3JhdmU7IHBlcm1lc3NvCi0KLXdyb25nX2RhdGU9RGF0YSBlcnJhdGEKLXdyb25nX2RhdGVfZGV0YWlsPURhdGEgZXJyYXRhCi0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1MYSBkYXRhIGRldmUgZXNzZXJlIGRvcG8gZGkgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPUxhIGRhdGEgZGV2ZSBlc3NlcmUgZG9wbyBkaSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9TGEgZGF0YSBkZXZlIGVzc2VyZSBwcmltYSBkaSB7MH0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1MYSBkYXRhIGRldmUgZXNzZXJlIHByaW1hIGRpIHswfQotCi13cm9uZ19kYXRlX25vdF9lcXVhbD1MYSBkYXRhIG5vbiAmZWdyYXZlOyB1Z3VhbGUgYSB7MH0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1MYSBkYXRhIG5vbiAmZWdyYXZlOyB1Z3VhbGUgYSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZjZhOWQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1naXJpbGVuIGRlXHUwMTFmZXIgZmFya2xcdTAxMzENCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPWdpcmlsZW4gZGVcdTAxMWZlciBmYXJrbFx1MDEzMQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9YXluXHUwMTMxIGRlXHUwMTFmZXIgZ2lyaWxlbWV6DQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9YXluXHUwMTMxIGRlXHUwMTFmZXIgZ2lyaWxlbWV6DQotDQotd3JvbmdfZGF0ZT15YW5sXHUwMTMxXHUwMTVmIHRhcmloDQotd3JvbmdfZGF0ZV9kZXRhaWw9eWFubFx1MDEzMVx1MDE1ZiB0YXJpaA0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIHNvbnJhIG9sbWFsXHUwMTMxZFx1MDEzMXINCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gc29ucmEgb2xtYWxcdTAxMzFkXHUwMTMxcg0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gXHUwMGY2bmNlIG9sbWFsXHUwMTMxZFx1MDEzMXINCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBcdTAwZjZuY2Ugb2xtYWxcdTAxMzFkXHUwMTMxcg0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPXRhcmloIHswfSBkZVx1MDExZmVyaW5lIGVcdTAxNWZpdCBkZVx1MDExZmlsDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5lIGVcdTAxNWZpdCBkZVx1MDExZmlsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q3NjU5ZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLSAgICAgICAgZXh0ZW5kcw0KLSAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBiYXNlTmFtZSA9IG51bGw7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYgKGJhc2VOYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZU5hbWUgPSBzdXBlci5nZXRCYXNlTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGJhc2VOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlY29yZGVyL0Nyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWNvcmRlci9Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNiMDhkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlY29yZGVyL0Nyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwucmVjb3JkZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlciBpbXBsZW1lbnRzIFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXINCi17DQotICAgIHB1YmxpYyB2b2lkIHJlY29yZFVzZXJJbnB1dChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IHZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpZiAoISh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vdG8gc3VwcG9ydCBsb2NhbCBjcm9zcy12YWxpZGF0aW9uICh3aXRoaW4gdGhlIHNhbWUgZW50aXR5KQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSA9IENyb3NzVmFsaWRhdGlvblV0aWxzDQotICAgICAgICAgICAgLmdldE9ySW5pdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgZW50cnk7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0NCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmKHByb3BlcnR5RGV0YWlscyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgZW50cnkgPSBuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkoKTsNCi0gICAgICAgIGVudHJ5LnNldEJlYW4ocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSk7DQotICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh2YWx1ZSk7DQotICAgICAgICBlbnRyeS5zZXRDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgZW50cnkuc2V0Q2xpZW50SWQodWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKSk7DQotDQotICAgICAgICBTdHJpbmcga2V5ID0gcHJvcGVydHlEZXRhaWxzLmdldEtleSgpOw0KLQ0KLSAgICAgICAgLy9mb3IgbG9jYWwgY3Jvc3MtdmFsaWRhdGlvbg0KLSAgICAgICAgaWYgKHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jb250YWluc0VudHJ5KGtleSkgJiYNCi0gICAgICAgICAgICBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkoa2V5KS5nZXRCZWFuKCkgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICFwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkoa2V5KS5nZXRCZWFuKCkuZXF1YWxzKGVudHJ5LmdldEJlYW4oKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9mb3IgdGhlIHZhbGlkYXRpb24gd2l0aGluIGEgY29tcGxleCBjb21wb25lbnQgZS5nLiBhIHRhYmxlDQotICAgICAgICAgICAgLy9kb24ndCBvdmVycmlkZSBleGlzdGluZyBleHByZXNzaW9uIChzdHlsZTogI3tlbnRyeS5wcm9wZXJ0eX0pIC0gbWFrZSBhIHNwZWNpYWwgbWFwcGluZw0KLQ0KLSAgICAgICAgICAgIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk+IGZ1cnRoZXJFbnRyaWVzID0NCi0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmdldEVudHJ5KGtleSkuZ2V0RnVydGhlckVudHJpZXMoKTsNCi0NCi0gICAgICAgICAgICBpZiAoZnVydGhlckVudHJpZXMgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZ1cnRoZXJFbnRyaWVzID0gbmV3IEFycmF5TGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4oKTsNCi0NCi0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmdldEVudHJ5KGtleSkuc2V0RnVydGhlckVudHJpZXMoZnVydGhlckVudHJpZXMpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBmdXJ0aGVyRW50cmllcy5hZGQoZW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZm9yIG5vcm1hbCB2YWxpZGF0aW9uDQotICAgICAgICAgICAgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLnNldEVudHJ5KGtleSwgZW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOWZhZDYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBub3JtYWxseSBpdCBzaG91bGQgYmUgaW4gdGhlIHN0b3JhZ2UgcGFja2FnZSAtIGR1ZSB0byBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGl0IGlzbid0IHRoZSBjYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHZvaWQgYWRkKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSk7DQotDQotICAgIExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcygpOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5ZTFlNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneS5Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotDQotLyoqDQotICogbm9ybWFsbHkgaXQgc2hvdWxkIGJlIGluIHRoZSBzdG9yYWdlIHBhY2thZ2UgLSBkdWUgdG8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpdCBpc24ndCB0aGUgY2FzZQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkNCi17DQotICAgIHByaXZhdGUgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5Ow0KLSAgICAvL2ZvciBjb21wbGV4IGNvbXBvbmVudHMgKGUuZy4gYSB0YWJsZSkgc3RvcmVzIHRoZSBvYmplY3Qgb2YgZW50cnkgKCN7ZW50cnkucHJvcGVydHl9KQ0KLSAgICBwcml2YXRlIFVJQ29tcG9uZW50IGNvbXBvbmVudDsNCi0gICAgcHJpdmF0ZSBPYmplY3QgY29udmVydGVkT2JqZWN0Ow0KLSAgICBwcml2YXRlIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgLy9qdXN0IGZvciBpbnB1dCBjb21wb25lbnRzIHdpdGhpbiBjb21wbGV4IGNvbXBvbmVudHMgZS5nLiBkYXRhVGFibGUsLi4uDQotICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudElkOw0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeSBnZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhRW50cnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFFbnRyeSA9IG1ldGFEYXRhRW50cnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFVJQ29tcG9uZW50IGdldENvbXBvbmVudCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KFVJQ29tcG9uZW50IGNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRPYmplY3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlZE9iamVjdChPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbnZlcnRlZE9iamVjdCA9IGNvbnZlcnRlZE9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uU3RyYXRlZ3koQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneSA9IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudElkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNsaWVudElkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudElkKFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUxMGEzYi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBpbXBsZW1lbnRzIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgTGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzID0NCi0gICAgICAgIG5ldyBBcnJheUxpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGQoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzLmFkZChlbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcyhMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA0MWM5NWQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgY3Jvc3MtdmFsaWRhdGlvbiBlbnRyaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyDQotICAgIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPENyb3NzVmFsaWRhdGlvblN0b3JhZ2U+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgLy9mb3IgYmV0dGVyIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkNCi0gICAgICAgIHJldHVybiBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjhlMTg3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSBpbXBsZW1lbnRzIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4gcHJvY2Vzc2VkSW5mb3JtYXRpb25NYXAgPQ0KLSAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW50cnkoU3RyaW5nIGtleSwgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvY2Vzc2VkSW5mb3JtYXRpb25NYXAucHV0KGtleSwgZW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zRW50cnkoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uTWFwLmNvbnRhaW5zS2V5KGtleSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IGdldEVudHJ5KFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9jZXNzZWRJbmZvcm1hdGlvbk1hcC5nZXQoa2V5KTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MTgyYzguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgcHJvY2Vzc2VkIGluZm9ybWF0aW9uIGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlcg0KLSAgICBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIC8vZm9yIGJldHRlciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5DQotICAgICAgICByZXR1cm4gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuY2xhc3MuZ2V0TmFtZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmY1ZmMwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5BUEk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlDQotew0KLSAgICB2b2lkIHNldEVudHJ5KFN0cmluZyBrZXksIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5KTsNCi0NCi0gICAgYm9vbGVhbiBjb250YWluc0VudHJ5KFN0cmluZyBrZXkpOw0KLQ0KLSAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSBnZXRFbnRyeShTdHJpbmcga2V5KTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2Y3ODljLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogSW4gb3JkZXIgdG8gYnVpbGQgdXAgYSBtYXBwaW5nIHdoaWNoIGlzIHVzZWQgZm9yIGNyb3NzLXZhbGlkYXRpb24uCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeQotewotICAgIHByaXZhdGUgT2JqZWN0IGJlYW47Ci0gICAgcHJpdmF0ZSBPYmplY3QgY29udmVydGVkVmFsdWU7Ci0gICAgcHJpdmF0ZSBVSUNvbXBvbmVudCBjb21wb25lbnQ7Ci0gICAgLy9mb3IgY29tcGxleCBjb21wb25lbnRzIChlLmcuIGEgdGFibGUgdGhlcmUgYXJlIG11bHRpcGxlIGVudHJpZXMgd2l0aAotICAgIC8vdGhlIHNhbWUga2V5IChoZXJlIHRoZSBlbCBleHByZXNzaW9uICN7ZW50cnkucHJvcGVydHl9KQotICAgIC8vaG93ZXZlciwgZG9uJ3Qgb3ZlcnJpZGUgdGhlIHByZXZpb3VzIGVudHJ5IC0gdGhleSBhcm4ndCB0aGUgc2FtZTsKLSAgICBwcml2YXRlIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk+IGZ1cnRoZXJFbnRyaWVzOwotICAgIC8vanVzdCBmb3IgaW5wdXQgY29tcG9uZW50cyB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzIGUuZy4gZGF0YVRhYmxlLC4uLgotICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudElkOwotCi0gICAgLyoKLSAgICAgKiBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmVhbihPYmplY3QgYmVhbikKLSAgICB7Ci0gICAgICAgIHRoaXMuYmVhbiA9IGJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkVmFsdWUoT2JqZWN0IGNvbnZlcnRlZFZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy5jb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBVSUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnQoVUlDb21wb25lbnQgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gY2xpZW50SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50SWQoU3RyaW5nIGNsaWVudElkKQotICAgIHsKLSAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5PiBnZXRGdXJ0aGVyRW50cmllcygpCi0gICAgewotICAgICAgICByZXR1cm4gZnVydGhlckVudHJpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RnVydGhlckVudHJpZXMoTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4gZnVydGhlckVudHJpZXMpCi0gICAgewotICAgICAgICB0aGlzLmZ1cnRoZXJFbnRyaWVzID0gZnVydGhlckVudHJpZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvbWFwcGVyL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYmVlNWEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkRlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGtleSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL21hcHBlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL21hcHBlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMDUxMTAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhrZXkpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkYjcxOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBMaXN0PFJlZmVyZW5jaW5nU3RyYXRlZ3k+IHJlZmVyZW5jaW5nU3RyYXRlZ2llczsNCi0gICAgcHJvdGVjdGVkIE1hcDxPYmplY3QsIE9iamVjdD4gdmlvbGF0aW9uUmVzdWx0U3RvcmFnZSA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOw0KLQ0KLSAgICBwdWJsaWMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICBpbml0UmVmZXJlbmNpbmdTdHJhdGVnaWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFJlZmVyZW5jaW5nU3RyYXRlZ2llcygpDQotICAgIHsNCi0gICAgICAgIGlmIChyZWZlcmVuY2luZ1N0cmF0ZWdpZXMgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMgPSBuZXcgQXJyYXlMaXN0PFJlZmVyZW5jaW5nU3RyYXRlZ3k+KCk7DQotDQotICAgICAgICAgICAgU3RyaW5nIGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3lDbGFzc05hbWUgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkJBU0VfUEFDS0FHRSkgKyAiUmVmZXJlbmNpbmdTdHJhdGVneSI7DQotDQotICAgICAgICAgICAgUmVmZXJlbmNpbmdTdHJhdGVneSBjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5ID0gKFJlZmVyZW5jaW5nU3RyYXRlZ3kpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgIC50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3lDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBFTENvbXBhcmVTdHJhdGVneSgpKTsNCi0gICAgICAgICAgICAvL3JlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IEFsaWFzQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IExvY2FsQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IExvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlKSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vaW5pdENyb3NzVmFsaWRhdGlvbiBpcyBkb25lIGluIHRoZSBDcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyDQotDQotICAgICAgICBTdHJpbmdbXSB2YWxpZGF0aW9uVGFyZ2V0cyA9IGdldFZhbGlkYXRpb25UYXJnZXRzKA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvblRhcmdldCA6IHZhbGlkYXRpb25UYXJnZXRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQgPSB2YWxpZGF0aW9uVGFyZ2V0LnRyaW0oKTsNCi0NCi0gICAgICAgICAgICAvL3NlbGVjdCB2YWxpZGF0aW9uIG1ldGhvZA0KLSAgICAgICAgICAgIHRyeVRvVmFsaWRhdGUoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCkNCi0gICAgew0KLSAgICAgICAgZm9yIChSZWZlcmVuY2luZ1N0cmF0ZWd5IHJlZmVyZW5jaW5nU3RyYXRlZ3kgOiByZWZlcmVuY2luZ1N0cmF0ZWdpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHJlZmVyZW5jaW5nU3RyYXRlZ3kuZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwgdmFsaWRhdGlvblRhcmdldCwgdGhpcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJUaHJvd2FibGVJbnN0YW5jZU5ldmVyVGhyb3duIn0pDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlRhcmdldCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFoYW5kbGVUYXJnZXRWaW9sYXRpb24oZW50cnlPZlNvdXJjZSwgZW50cnlPZlRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9ubyB0YXJnZXQgLSBiZWNhdXNlIHRoZXJlIGlzIG5vIHRhcmdldCBjb21wb25lbnQgLSB2YWx1ZSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1vZGVsDQotICAgICAgICAgICAgaWYoZW50cnlPZlRhcmdldCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1RhcmdldENvbXBvbmVudEFzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oZW50cnlPZlNvdXJjZSk7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIC8vZ2V0IHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSB0YXJnZXQgY29tcG9uZW50DQotICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldEVycm9yTWVzc2FnZVN1bW1hcnkoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIHRydWUpOw0KLSAgICAgICAgU3RyaW5nIGRldGFpbHMgPSBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIHRydWUpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0aW9uIHRhcmdldCBpc24ndCBib3VuZCB0byBhIGNvbXBvbmVudCB3aXRoaW5nIHRoZSBjdXJyZW50IHBhZ2UgDQotICAgICAgICAvLyhzZWUgdmFsaWRhdGVGb3VuZEVudHJ5LCB0cnlUb1ZhbGlkYXRlTG9jYWxseSBhbmQgdHJ5VG9WYWxpZGF0ZUJpbmRpbmdPbmx5KQ0KLSAgICAgICAgaWYgKGVudHJ5T2ZUYXJnZXQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBlbnRyeU9mVGFyZ2V0ID0gZW50cnlPZlNvdXJjZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlOw0KLSAgICAgICAgaWYgKGVudHJ5T2ZUYXJnZXQuZ2V0TWV0YURhdGFFbnRyeSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWVzc2FnZSA9IGdldFRhcmdldENvbXBvbmVudEVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgZW50cnlPZlRhcmdldC5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIHN1bW1hcnksIGRldGFpbHMpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vVE9ETyBkb2N1bWVudCBwb3NzaWJsZSBzaWRlIGVmZmVjdHMNCi0gICAgICAgICAgICAvL2R1ZSB0byBhIG1pc3NpbmcgdGFyZ2V0IGFubm90YXRpb24gKHNlZTogdHJ5VG9WYWxpZGF0ZUxvY2FsbHkpDQotICAgICAgICAgICAgbWVzc2FnZSA9IGdldFRhcmdldENvbXBvbmVudEVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIHN1bW1hcnksIGRldGFpbHMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKChtZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsIHx8IG1lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkgJiYNCi0gICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldENsaWVudElkKCkgIT0gbnVsbCAmJiAhZW50cnlPZlNvdXJjZS5nZXRDbGllbnRJZCgpLmVxdWFscyhlbnRyeU9mVGFyZ2V0LmdldENsaWVudElkKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24gPSBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG1lc3NhZ2UpOw0KLQ0KLSAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICAgICAgZW50cnlPZlRhcmdldC5nZXRDb21wb25lbnQoKSwgZW50cnlPZlRhcmdldC5nZXRNZXRhRGF0YUVudHJ5KCksDQotICAgICAgICAgICAgICAgICAgICBlbnRyeU9mVGFyZ2V0LmdldENvbnZlcnRlZE9iamVjdCgpLCB2YWxpZGF0b3JFeGNlcHRpb24sIHRoaXMpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50SWQoZW50cnlPZlRhcmdldC5nZXRDbGllbnRJZCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbnZlcnRGYWNlc01lc3NhZ2UodmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzVGFyZ2V0Q29tcG9uZW50QXNTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgLy9nZXQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKTsNCi0gICAgICAgIFN0cmluZyBkZXRhaWxzID0gZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbChlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSk7DQotDQotICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZSA9IGdldFNvdXJjZUNvbXBvbmVudEVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotDQotICAgICAgICBpZiAobWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCB8fCBtZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9UT0RPDQotICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudChlbnRyeU9mU291cmNlLmdldENvbXBvbmVudCgpLCBtZXNzYWdlLCBudWxsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8gbG9nZ2luZw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByb2Nlc3NTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGhhbmRsZVNvdXJjZVZpb2xhdGlvbihlbnRyeU9mU291cmNlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2dldCB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQNCi0gICAgICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldEVycm9yTWVzc2FnZVN1bW1hcnkoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIGZhbHNlKTsNCi0gICAgICAgICAgICBTdHJpbmcgZGV0YWlscyA9IGdldEVycm9yTWVzc2FnZURldGFpbChlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgZmFsc2UpOw0KLQ0KLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlID0gZ2V0U291cmNlQ29tcG9uZW50RXJyb3JNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgfHwgbWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9UT0RPDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvVGhyb3dWYWxpZGF0b3JFeGNlcHRpb25Gb3JDb21wb25lbnQoZW50cnlPZlNvdXJjZS5nZXRDb21wb25lbnQoKSwgbWVzc2FnZSwgbnVsbCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9qdXN0IHRocm93IGEgbmV3IG1lc3NhZ2UgLSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBhdCB0aGUgdGFyZ2V0DQotICAgICAgICBFeHRWYWxVdGlscy50cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50KA0KLSAgICAgICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldENvbXBvbmVudCgpLCBuZXcgRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwgbnVsbCwgbnVsbCksIG51bGwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBGYWNlc01lc3NhZ2UgZ2V0U291cmNlQ29tcG9uZW50RXJyb3JNZXNzYWdlKEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgRmFjZXNNZXNzYWdlIGdldFRhcmdldENvbXBvbmVudEVycm9yTWVzc2FnZShBbm5vdGF0aW9uIGZvdW5kQW5ub3RhdGlvbiwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcmVzb2x2ZU1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcga2V5ID0gZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgICAgICByZXR1cm4gKGtleSAhPSBudWxsKSA/IHJlc29sdmVNZXNzYWdlKGtleSArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYKSA6IG51bGw7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVUYXJnZXRWaW9sYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UsDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZUYXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBlbnRyeU9mVGFyZ2V0ICE9IG51bGwgJiYgZW50cnlPZlRhcmdldC5nZXRDb21wb25lbnQoKSAhPSBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVNvdXJjZVZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGhhbmRsZVRhcmdldFZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIG51bGwpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIG5vIHRhcmdldCBjb21wb25lbnQgKHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbW9kZWwpIC0+IGdldCByZXZlcnNlIG1lc3NhZ2UgZm9yIHNvdXJjZSBjb21wb25lbnQNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICAvL2lmIHRoZSBtZXNzYWdlIGlzIG5ldXRyYWwNCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24sIHRydWUpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIG5vIHRhcmdldCBjb21wb25lbnQgKHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbW9kZWwpIC0+IGdldCByZXZlcnNlIG1lc3NhZ2UgZm9yIHNvdXJjZSBjb21wb25lbnQNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIC8vaWYgdGhlIG1lc3NhZ2UgaXMgbmV1dHJhbA0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uLCB0cnVlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBhYnN0cmFjdCBtZXRob2RzDQotICAgICAqLw0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBpbXBsZW1lbnRzIHRoZSBzcGVjaWZpYyB2YWxpZGF0aW9uIGxvZ2ljDQotICAgICAqLw0KLQ0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbik7DQotDQotICAgIC8qDQotICAgICAqIHJldHVybnMgdGhlIHJlZmVyZW5jZWQgdmFsaWRhdGlvbiB0YXJnZXRzIG9mIHRoZSBhbm5vdGF0aW9uDQotICAgICAqIGUuZy4gQERhdGVJcyh0eXBlID0gRGF0ZUlzVHlwZS5iZWZvcmUsIHZhbHVlID0gImZpbmFsRXhhbSIpDQotICAgICAqIC0+IG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IHdpdGggb25lIHZhbHVlICgiZmluYWxFeGFtIikNCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1Mzc2MTIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzDQotICAgIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICAvL2luaXQgY3Jvc3MtdmFsaWRhdGlvbg0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5ID0NCi0gICAgICAgICAgICBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKS5hZGQoZW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5ID0gbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgpOw0KLQ0KLSAgICAgICAgZW50cnkuc2V0TWV0YURhdGFFbnRyeShtZXRhRGF0YUVudHJ5KTsNCi0gICAgICAgIGVudHJ5LnNldENvbXBvbmVudCh1aUNvbXBvbmVudCk7DQotICAgICAgICBlbnRyeS5zZXRDbGllbnRJZCh1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpKTsNCi0gICAgICAgIGVudHJ5LnNldENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgZW50cnkuc2V0VmFsaWRhdGlvblN0cmF0ZWd5KHRoaXMpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGVudHJ5Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vdCBhdmFpbGFibGUgZm9yIGNyb3NzIHZhbGlkYXRpb24gLSB1c2UgcHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24iKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRMYWJlbChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgYXZhaWxhYmxlIGZvciBjcm9zcyB2YWxpZGF0aW9uIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIC8vbm90IGF2YWlsYWJsZSBmb3IgY3Jvc3MgdmFsaWRhdGlvbiAtIHVzZSBpbml0Q3Jvc3NWYWxpZGF0aW9uDQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdENyb3NzVmFsaWRhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICAvL292ZXJyaWRlIGlmIG5lZWRlZA0KLSAgICB9DQotDQotICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbXBvbmVudCgpLCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksIHZhbGlkYXRvckV4Y2VwdGlvbiwgdGhpcyk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uSGVscGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdkNDc2ZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneShBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnksDQotICAgICAgICAgICAgYm9vbGVhbiBpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LmlzVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL3Byb2Nlc3MgYWZ0ZXIgdmlvbGF0aW9uDQotICAgICAgICAgICAgLy9qdXN0IGFkZCBtZXNzYWdlcw0KLSAgICAgICAgICAgIGlmKCFpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1RhcmdldEFmdGVyQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzVGFyZ2V0QWZ0ZXJNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy90aG93IGV4Y2VwdGlvbg0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NUYXJnZXRBZnRlckNyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgPSBuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KCk7DQotDQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LnVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbXBvbmVudCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDbGllbnRJZCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbXBvbmVudChzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDbGllbnRJZChzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29udmVydGVkT2JqZWN0KHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpKTsNCi0gICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5KTsNCi0NCi0gICAgICAgIC8vYWRkIG1lc3NhZ2UNCi0gICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgIHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NUYXJnZXRBZnRlck1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIC8vbm8gdGFyZ2V0IC0gYmVjYXVzZSB0aGVyZSBpcyBubyB0YXJnZXQgY29tcG9uZW50IC0gdmFsdWUgd2FzIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBtb2RlbA0KLSAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIG51bGwpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzI3ZGE1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgIHZvaWQgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSkNCi0gICAgICAgICAgICB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRGF0ZUlzU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcwMDJkNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJc1R5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsNCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERhdGVJc1N0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT19FQVJMWSA9ICJlYXJseSI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT19MQVRFID0gImxhdGUiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRVFVQUxfREFURV9USU1FID0gIm5vdCBlcXVhbCI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVkgPSAicmVzdWx0IjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFSRURfVkFMVUVfS0VZID0gInRhcmdldCB2YWx1ZSI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVkVSU0VfQ09NUEFSRURfVkFMVUVfS0VZID0gInJldmVyc2UgdGFyZ2V0IHZhbHVlIjsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIC8vVE9ETyB0ZXN0ICYgcmVtb3ZlDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVTb3VyY2VWaW9sYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiB2aW9sYXRpb25Gb3VuZDsNCi0NCi0gICAgICAgIGlmICgoKERhdGVJcykgYW5ub3RhdGlvbikudHlwZSgpLmVxdWFscyhEYXRlSXNUeXBlLnNhbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsICYmICFvYmplY3QxLmVxdWFscyhvYmplY3QyKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFU1VMVF9LRVksIE5PVF9FUVVBTF9EQVRFX1RJTUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKCgoRGF0ZUlzKSBhbm5vdGF0aW9uKS50eXBlKCkuZXF1YWxzKERhdGVJc1R5cGUuYmVmb3JlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IG9iamVjdDEgIT0gbnVsbCAmJiBvYmplY3QyICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFuZXcgRGF0ZSgoKERhdGUpIG9iamVjdDEpLmdldFRpbWUoKSkuYmVmb3JlKChEYXRlKSBvYmplY3QyKSB8fCBvYmplY3QxLmVxdWFscyhvYmplY3QyKSk7DQotDQotICAgICAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVNVTFRfS0VZLCBUT09fTEFURSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsICYmIG9iamVjdDIgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW5ldyBEYXRlKCgoRGF0ZSkgb2JqZWN0MSkuZ2V0VGltZSgpKS5hZnRlcigoRGF0ZSkgb2JqZWN0MikgfHwgb2JqZWN0MS5lcXVhbHMob2JqZWN0MikpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVTVUxUX0tFWSwgVE9PX0VBUkxZKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChDT01QQVJFRF9WQUxVRV9LRVksIG9iamVjdDEpOw0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVWRVJTRV9DT01QQVJFRF9WQUxVRV9LRVksIG9iamVjdDIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZpb2xhdGlvbkZvdW5kOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKERhdGVJcykgYW5ub3RhdGlvbikudmFsdWVPZigpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHByb3RlY3RlZA0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZykgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLmdldChSRVNVTFRfS0VZKTsNCi0NCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gcmV2ZXJzZVJlc3VsdChyZXN1bHQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKFRPT19FQVJMWS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0Tm90QWZ0ZXJFcnJvck1zZ0tleSgoRGF0ZUlzKSBhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKFRPT19MQVRFLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROb3RCZWZvcmVFcnJvck1zZ0tleSgoRGF0ZUlzKSBhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0Tm90RXF1YWxFcnJvck1zZ0tleSgoRGF0ZUlzKSBhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyByZXZlcnNlUmVzdWx0KFN0cmluZyByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIGlmIChUT09fRUFSTFkuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIFRPT19MQVRFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBUT09fRUFSTFk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpLCBhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBrZXkgIiArIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgZmFsc2UpLCBhbm5vdGF0aW9uLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGZhbHNlKQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgYW5ub3RhdGlvbiwgZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBrZXkgIiArIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGtleSwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHJlc29sdmVNZXNzYWdlKGtleSk7DQotDQotICAgICAgICBEYXRlRm9ybWF0IGRhdGVGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSgoKERhdGVJcykgYW5ub3RhdGlvbikuZXJyb3JNZXNzYWdlRGF0ZVN0eWxlKCksDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlc3VsdDsNCi0NCi0gICAgICAgIGlmKGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IG1lc3NhZ2UucmVwbGFjZSgiezB9IiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0LmZvcm1hdCgoRGF0ZSkgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLmdldChDT01QQVJFRF9WQUxVRV9LRVkpKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQuZm9ybWF0KChEYXRlKSB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UuZ2V0KFJFVkVSU0VfQ09NUEFSRURfVkFMVUVfS0VZKSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9yZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBvdGhlciBjb21wb25lbnQNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogcHJpdmF0ZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90QWZ0ZXJFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RBZnRlckVycm9yTXNnS2V5KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXROb3RCZWZvcmVFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RCZWZvcmVFcnJvck1zZ0tleSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90RXF1YWxFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RFcXVhbEVycm9yTXNnS2V5KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRUxDb21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5MTFkNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiByZWZlcmVuY2luZyB2YWxpZGF0aW9uIHRhcmdldHMgLSBwb3NzaWJsZSBmb3JtYXRzOg0KLSAqICIje1tiZWFuX25hbWVdLltwcm9wZXJ0eV9uYW1lXX0iIC4uLiBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbiB3aXRoIHZhbHVlIGJpbmRpbmcNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRUxDb21wYXJlU3RyYXRlZ3kgaW1wbGVtZW50cyBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LCBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZCh2YWxpZGF0aW9uVGFyZ2V0KSAmJg0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZhbGlkYXRpb25UYXJnZXQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvVmFsaWRhdGVWYWx1ZUJpbmRpbmcoDQotICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgICAgICAgICBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWxpZGF0aW9uVGFyZ2V0KSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwgY29tcGFyZVN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAidGVzdCIpDQotICAgIHByb3RlY3RlZCBib29sZWFuIHRyeVRvVmFsaWRhdGVWYWx1ZUJpbmRpbmcoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5ID0NCi0gICAgICAgICAgICAgICAgcmVzb2x2ZVRhcmdldEZvckNyb3NzQ29tcG9uZW50VmFsaWRhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXQpOw0KLQ0KLSAgICAgICAgaWYodmFsaWRhdGlvblRhcmdldEVudHJ5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHJlc29sdmVUYXJnZXRGb3JDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbGlkYXRpb25UYXJnZXQpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgPQ0KLSAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UoKTsNCi0NCi0gICAgICAgIHJldHVybiBDcm9zc1ZhbGlkYXRpb25VdGlscy5yZXNvbHZlVmFsaWRhdGlvblRhcmdldEVudHJ5KA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmNvbnZlcnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uVG9Qcm9jZXNzZWRJbmZvcm1hdGlvbktleSh2YWxpZGF0aW9uVGFyZ2V0KSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5LCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsaWRhdGlvblRhcmdldCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIE9iamVjdCB0YXJnZXRWYWx1ZSA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0NCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHRhcmdldEVudHJ5ID0gbmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5KCk7DQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRCZWFuKA0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFZhbHVlT2ZFeHByZXNzaW9uKGZhY2VzQ29udGV4dCwgdmFsaWRhdGlvblRhcmdldC5nZXRCYXNlRXhwcmVzc2lvbigpKSk7DQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh0YXJnZXRWYWx1ZSk7DQotDQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEVudHJ5LCB0cnVlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FcXVhbHNTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIyNWZiYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FcXVhbHNTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXF1YWxzU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRXF1YWxzKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG9iamVjdDEgIT0gbnVsbCAmJiAhb2JqZWN0MS5lcXVhbHMob2JqZWN0Mik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRXF1YWxzKSBhbm5vdGF0aW9uKS52YWx1ZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjJhZDY0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotDQotLyoqDQotICogIltwcm9wZXJ0eV9uYW1lXSIgLi4uIGxvY2FsIHZhbGlkYXRpb24gLT4gY3Jvc3MtY29tcG9uZW50LCBidXQgbm8gY3Jvc3MtZW50aXR5IHZhbGlkYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgTG9jYWxDb21wYXJlU3RyYXRlZ3kgaW1wbGVtZW50cyBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LCBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25UYXJnZXQuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneSB3aWxsIGNvbnRpbnVlDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlTG9jYWxseSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0S2V5LA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSA9DQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgYm9vbGVhbiBpc01vZGVsQXdhcmVWYWxpZGF0aW9uID0NCi0gICAgICAgICAgICAgICAgaXNNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHRhcmdldFByb3BlcnR5ID0gdGFyZ2V0S2V5Ow0KLQ0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUtleSA9IHJlc29sdmVTb3VyY2VLZXkoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIHRhcmdldEtleSA9IHNvdXJjZUtleS5zdWJzdHJpbmcoMCwgc291cmNlS2V5Lmxhc3RJbmRleE9mKCIuIikgKyAxKSArIHRhcmdldEtleTsNCi0NCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9IENyb3NzVmFsaWRhdGlvblV0aWxzLnJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgICAgIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSwgdGFyZ2V0S2V5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLQ0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25UYXJnZXRFbnRyeSAhPSBudWxsICYmIHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb21wb25lbnQoKSAhPSBudWxsICYmICFpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICAvL25vIHRhcmdldCAtIGJlY2F1c2UgdGhlcmUgaXMgbm8gdGFyZ2V0IGNvbXBvbmVudCAtIHZhbHVlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbW9kZWwNCi0gICAgICAgIGVsc2UgaWYoaXNNb2RlbEF3YXJlVmFsaWRhdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHVuc3VwcG9ydGVkQ2FzZShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVUYXJnZXRLZXkoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgU3RyaW5nIHRhcmdldEtleSkNCi0gICAgew0KLSAgICAgICAgLy9ubyByZWFsIHZhbHVlIGJpbmRpbmcgZXhwcmVzc2lvbg0KLSAgICAgICAgLy9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGp1c3QgaGVwbHMgdG8gcmVwbGFjZSB0aGUgcHJvcGVydHkgb2YgdGhlIGtleQ0KLSAgICAgICAgLy9oZXJlIG9ubHkgZG90LW5vdGF0aW9uIGlzIGFsbG93ZWQgLT4gbm8gcHJvYmxlbQ0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBiYXNlRXhwcmVzc2lvbiA9DQotICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7IiArIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsDQotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMuY2xhc3MpLmdldEtleSgpICsgIn0iKTsNCi0NCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2VPckFkZFByb3BlcnR5KGJhc2VFeHByZXNzaW9uLCB0YXJnZXRLZXkpDQotICAgICAgICAgICAgLmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgIHJldHVybiByZXN1bHQuc3Vic3RyaW5nKDIsIHJlc3VsdC5sZW5ndGgoKSAtMSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRWYWx1ZU9mUHJvcGVydHkoT2JqZWN0IGJhc2UsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEsIHByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgICAgIE1ldGhvZCB0YXJnZXRNZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoYmFzZS5nZXRDbGFzcygpLCAiZ2V0IiArIHByb3BlcnR5KTsNCi0NCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZChiYXNlLmdldENsYXNzKCksICJpcyIgKyBwcm9wZXJ0eSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAiY2xhc3MgIiArIGJhc2UuZ2V0Q2xhc3MoKSArICIgaGFzIG5vIHB1YmxpYyBnZXQvaXMgIiArIHByb3BlcnR5LnRvTG93ZXJDYXNlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZChiYXNlLCB0YXJnZXRNZXRob2QpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2Uga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuZXdLZXkgPSBjcmVhdGVUYXJnZXRLZXkoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgcmV0dXJuICFrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcuY29udGFpbnNFbnRyeShuZXdLZXkpOw0KLQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHJlc29sdmVTb3VyY2VLZXkoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBTdHJpbmcgc291cmNlS2V5ID0gcHJvcGVydHlEZXRhaWxzLmdldEtleSgpOw0KLQ0KLSAgICAgICAgaWYoIXNvdXJjZUtleS5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNvdXJjZSBwYXRoOiAiICsgc291cmNlS2V5ICsgIiBpbnZhbGlkIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc291cmNlS2V5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB1bnN1cHBvcnRlZENhc2UoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBjb252ZXJ0ZWQgb2JqZWN0IGZvciAiICsgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKS5nZXRLZXkoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHRhcmdldEVudHJ5ID0gbmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5KCk7DQotDQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRCZWFuKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcykuZ2V0QmFzZU9iamVjdCgpKTsNCi0gICAgICAgIHRhcmdldEVudHJ5DQotICAgICAgICAgICAgICAgIC5zZXRDb252ZXJ0ZWRWYWx1ZShnZXRWYWx1ZU9mUHJvcGVydHkodGFyZ2V0RW50cnkuZ2V0QmVhbigpLCB0YXJnZXRQcm9wZXJ0eSkpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRFbnRyeSwgdHJ1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGViNjU2Yy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqICJbbG9jYWxfcHJvcGVydHkucHJvcGVydHkxLnByb3BlcnR5Ml0iDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIExvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneSBleHRlbmRzIExvY2FsQ29tcGFyZVN0cmF0ZWd5DQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZighdmFsaWRhdGlvblRhcmdldC5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vbm90IHN1cHBvcnRlZCAtIFRPRE8gYWRkIGxvZ2dpbmcNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ5VG9WYWxpZGF0ZUxvY2FsbHkoDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlTG9jYWxseShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSA9DQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IGNyZWF0ZVRhcmdldEtleShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEtleSk7DQotDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNvbnRhaW5zRW50cnkobmV3S2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkgPSBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkobmV3S2V5KTsNCi0NCi0gICAgICAgICAgICBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9ubyB0YXJnZXQgLSBiZWNhdXNlIHRoZXJlIGlzIG5vIHRhcmdldCBjb21wb25lbnQgLSB2YWx1ZSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1vZGVsDQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEtleSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB0YXJnZXRJbmZvcm1hdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LmlzVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgIHRhcmdldEluZm9ybWF0aW9uRW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSA9IG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoKTsNCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29tcG9uZW50KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENsaWVudElkKHRhcmdldEluZm9ybWF0aW9uRW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbnZlcnRlZE9iamVjdCh0YXJnZXRJbmZvcm1hdGlvbkVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCkpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAvL3Byb2Nlc3MgYWZ0ZXIgdmlvbGF0aW9uDQotICAgICAgICAgICAgLy9qdXN0IGFkZCBtZXNzYWdlcw0KLSAgICAgICAgICAgIGlmKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBudWxsKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy90aG93IGV4Y2VwdGlvbg0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFN0cmluZyB0YXJnZXRLZXkpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBPYmplY3QgbmV3QmFzZSA9IFJlZmxlY3Rpb25VdGlscw0KLSAgICAgICAgICAgIC5nZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCksIHRhcmdldEtleSk7DQotDQotICAgICAgICBpZih0YXJnZXRLZXkuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2ZpbmQgdGhlIGxhc3QgcHJvcGVydHkNCi0gICAgICAgICAgICB0YXJnZXRLZXkgPSB0YXJnZXRLZXkuc3Vic3RyaW5nKHRhcmdldEtleS5sYXN0SW5kZXhPZigiLiIpICsgMSwgdGFyZ2V0S2V5Lmxlbmd0aCgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXRWYWx1ZSA9IGdldFZhbHVlT2ZQcm9wZXJ0eShuZXdCYXNlLCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdGFyZ2V0RW50cnkgPSBuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkoKTsNCi0gICAgICAgIHRhcmdldEVudHJ5LnNldEJlYW4obmV3QmFzZSk7DQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh0YXJnZXRWYWx1ZSk7DQotDQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEVudHJ5LCB0cnVlKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Ob3RFcXVhbHNTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxNWUyMC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Ob3RFcXVhbHNTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5Ob3RFcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIE5vdEVxdWFsc1N0cmF0ZWd5IGV4dGVuZHMgRXF1YWxzU3RyYXRlZ3kNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKE5vdEVxdWFscykgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwNCi0gICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAhc3VwZXIuaXNWaW9sYXRpb24ob2JqZWN0MSwgb2JqZWN0MiwgYW5ub3RhdGlvbik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKE5vdEVxdWFscykgYW5ub3RhdGlvbikudmFsdWUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYzUwMTEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVmZXJlbmNpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJbnRlcm5hbCBpbnRlcmZhY2UgdG8gYWxsb3cgbXVsdGlwbGUgcmVmZXJlbmNpbmcgc3RyYXRlZ2llcyBmb3IgY3Jvc3MgY29tcG9uZW50IHZhbGlkYXRpb24uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWludGVyZmFjZSBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgYWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlcXVpcmVkSWZTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWZlYWQyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlcXVpcmVkSWZTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRJZlN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VGYWNlc0J1bmRsZSA9IGZhbHNlOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoUmVxdWlyZWRJZikgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLCBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gdmlvbGF0aW9uRm91bmQgPSBmYWxzZTsNCi0NCi0gICAgICAgIGlmICgoKFJlcXVpcmVkSWYpIGFubm90YXRpb24pLmlzKCkuZXF1YWxzKFJlcXVpcmVkSWZUeXBlLmVtcHR5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IChvYmplY3QyID09IG51bGwgfHwgb2JqZWN0Mi5lcXVhbHMoIiIpKSAmJiAob2JqZWN0MSA9PSBudWxsIHx8IG9iamVjdDEuZXF1YWxzKCIiKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmICgoKFJlcXVpcmVkSWYpIGFubm90YXRpb24pLmlzKCkuZXF1YWxzKFJlcXVpcmVkSWZUeXBlLm5vdF9lbXB0eSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSAob2JqZWN0MiAhPSBudWxsICYmICFvYmplY3QyLmVxdWFscygiIikpICYmIChvYmplY3QxID09IG51bGwgfHwgb2JqZWN0MS5lcXVhbHMoIiIpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB2aW9sYXRpb25Gb3VuZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChSZXF1aXJlZElmKSBhbm5vdGF0aW9uKS52YWx1ZU9mKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMudXNlRmFjZXNCdW5kbGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2pwYV9zdHJhdGVneV9tYXBwaW5ncy5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZDk5MjkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLkJhc2ljPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLklkPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZT1vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5KcGFWYWxpZGF0aW9uU3RyYXRlZ3kKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5Zjg1MmEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Dcm9zc1ZhbGlkYXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25VdGlscw0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLCBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlc2V0U3RvcmFnZShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLCBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgZ2V0T3JJbml0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoDQotICAgICAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jbGFzcywgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0S2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxVdGlscy5yZXNldFN0b3JhZ2UoUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLCBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0S2V5LCBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5ID0NCi0gICAgICAgICAgICBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkodGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIC8vdmFsdWUgbm90IHN1Ym1pdHRlZCBhdCB0aGlzIHJlcXVlc3QgLSB1c2UgbW9kZWwgdmFsdWUgKHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbW9kZWwpDQotICAgICAgICBpZihwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICAvL3NpbXBsZSBjYXNlDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5nZXRGdXJ0aGVyRW50cmllcygpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXRCZWFuID0gcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKTsNCi0NCi0gICAgICAgIC8vcHJvY2VzcyBjb21wbGV4IGNvbXBvbmVudCBlbnRyaWVzIChlLmcuIGEgdGFibGUpDQotICAgICAgICAvL3N1cHBvcnRlZDogY3Jvc3MtY29tcG9uZW50IGJ1dCBubyBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbiAoPSBsb2NhbGUgdmFsaWRhdGlvbikNCi0gICAgICAgIGlmIChwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEJlYW4oKS5lcXVhbHModGFyZ2V0QmVhbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotICAgICAgICB9DQotDQotICAgICAgICBmb3IgKFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5IDogcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5nZXRGdXJ0aGVyRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbnRyeS5nZXRCZWFuKCkuZXF1YWxzKHRhcmdldEJlYW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJzdXBwb3J0IGZvciBtYXAgc3ludGF4IikNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFZhbHVlQmluZGluZ0V4cHJlc3Npb25Ub1Byb2Nlc3NlZEluZm9ybWF0aW9uS2V5KFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmJlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmJlLmdldEV4cHJlc3Npb25TdHJpbmcoKS5yZXBsYWNlKCIjeyIsICIiKS5yZXBsYWNlKCJ9IiwgIiIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQzNDU0ZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Byb3BlcnR5VmFsaWRhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LlNraXBWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0dHRVIgPSBMb2dGYWN0b3J5LmdldExvZyhQcm9wZXJ0eVZhbGlkYXRpb25VdGlscy5jbGFzcyk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkYXRpb25Ta2lwcGVkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZihFeHRWYWxVdGlscy5pc1NraXBhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBCb29sZWFuIHNraXBWYWxpZGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eSgNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCBCb29sZWFuLmNsYXNzKTsNCi0NCi0gICAgICAgICAgICBpZihCb29sZWFuLlRSVUUuZXF1YWxzKHNraXBWYWxpZGF0aW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKExPR0dFUi5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBMT0dHRVIudHJhY2UoInZhbGlkYXRpb24gb2YgIiArIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY2FuY2VsZWQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIFNraXBWYWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgbnVsbCwgbWV0YURhdGFFbnRyeSwgbnVsbCk7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzM5MjU1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBQcm9wZXJ0eSBWYWxpZGF0aW9uIE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFByb3BlcnR5IFZhbGlkYXRpb24gTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgUHJvcGVydHkgVmFsaWRhdGlvbiBwcm92aWRlcyBhbm5vdGF0aW9uIGJhc2VkIHZhbGlkYXRpb24gZm9yIGJlYW4gcHJvcGVydGllcy4NCi0gICAgSXQgYWxzbyBwcm92aWRlcyBKUEEgMS4wIGJhc2VkIHZhbGlkYXRpb24gU3VwcG9ydC4NCi0gIA0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS4xLnggYW5kIEpTRiAxLjIueC4gQm90aCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM5NmZkOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L0Fic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7Ci1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUlucHV0OwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5FeHRWYWxTdGFydHVwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkRlZmF1bHRGYWN0b3J5RmluZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsLk1vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsLk1vY2tNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsLk1vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC51dGlsLlRlc3RVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5tb2NrLkV4dFZhbE1vY2tBcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZF9pbXBsLmNvbmZpZy5NeWZhY2VzQ29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrRXh0ZXJuYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tGYWNlc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0ZhY2VzQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrSHR0cFNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0xpZmVjeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrTGlmZWN5Y2xlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrUmVuZGVyS2l0OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tSZXNwb25zZVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrU2VydmxldENvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrU2VydmxldENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0LmVsLk1vY2tFeHByZXNzaW9uRmFjdG9yeTsKLQotLyoqCi0gKiBBYnN0cmFjdCBTaGFsZSBUZXN0IGJhc2UgY2xhc3MsIHdoaWNoIHNldHMgdXAgdGhlIEpTRiBlbnZpcm9ubWVudC4gIElmIHRoZSB0ZXN0Ci0gKiBvdmVycmlkZXMgPGNvZGU+c2V0VXAoKTwvY29kZT4gYW5kL29yIDxjb2RlPnRlYXJEb3duKCk8L2NvZGU+LCB0aGVuIHRob3NlCi0gKiBtZXRob2RzIGJ1dCBjYWxsIHRoZSBvdmVyd2l0dGVuIG1ldGhvZCB0byBpbnN1cmUgYSB2YWxpZCB0ZXN0IGVudmlyb25tZW50LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHByb3RlY3RlZCBNb2NrQXBwbGljYXRpb24gYXBwbGljYXRpb247Ci0gICAgcHJvdGVjdGVkIE1vY2tTZXJ2bGV0Q29uZmlnIGNvbmZpZzsKLSAgICBwcm90ZWN0ZWQgTW9ja0V4dGVybmFsQ29udGV4dCBleHRlcm5hbENvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIE1vY2tGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0OwotICAgIHByb3RlY3RlZCBNb2NrRmFjZXNDb250ZXh0RmFjdG9yeSBmYWNlc0NvbnRleHRGYWN0b3J5OwotICAgIHByb3RlY3RlZCBNb2NrTGlmZWN5Y2xlIGxpZmVjeWNsZTsKLSAgICBwcm90ZWN0ZWQgTW9ja0xpZmVjeWNsZUZhY3RvcnkgbGlmZWN5Y2xlRmFjdG9yeTsKLSAgICBwcm90ZWN0ZWQgUmVuZGVyS2l0IHJlbmRlcktpdDsKLSAgICBwcm90ZWN0ZWQgTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0OwotICAgIHByb3RlY3RlZCBNb2NrSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZTsKLSAgICBwcm90ZWN0ZWQgTW9ja1NlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0OwotICAgIHByb3RlY3RlZCBNb2NrSHR0cFNlc3Npb24gc2Vzc2lvbjsKLSAgICBwcm90ZWN0ZWQgTW9ja0V4cHJlc3Npb25GYWN0b3J5IGV4cHJlc3Npb25GYWN0b3J5OwotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyOwotCi0gICAgLyoqIFJlc3BvbnNlIFdyaXRlciAqLwotICAgIHByaXZhdGUgTW9ja1Jlc3BvbnNlV3JpdGVyIHdyaXRlcjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0LgotICAgICAqLwotICAgIHB1YmxpYyBBYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgICAgICBhcHBsaWNhdGlvbiA9IG51bGw7Ci0gICAgICAgIGNvbmZpZyA9IG51bGw7Ci0gICAgICAgIGV4dGVybmFsQ29udGV4dCA9IG51bGw7Ci0gICAgICAgIGZhY2VzQ29udGV4dCA9IG51bGw7Ci0gICAgICAgIGZhY2VzQ29udGV4dEZhY3RvcnkgPSBudWxsOwotICAgICAgICBsaWZlY3ljbGUgPSBudWxsOwotICAgICAgICBsaWZlY3ljbGVGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgcmVuZGVyS2l0ID0gbnVsbDsKLSAgICAgICAgcmVxdWVzdCA9IG51bGw7Ci0gICAgICAgIHJlc3BvbnNlID0gbnVsbDsKLSAgICAgICAgc2VydmxldENvbnRleHQgPSBudWxsOwotICAgICAgICBzZXNzaW9uID0gbnVsbDsKLSAgICAgICAgZXhwcmVzc2lvbkZhY3RvcnkgPSBudWxsOwotICAgICAgICB0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZXR1cCB0aGUgdGVzdCBlbnZpcm9ubWVudCwgaW5jbHVkaW5nIHRoZSBmb2xsb3dpbmc6Ci0gICAgICogIDx1bD4KLSAgICAgKiAgPGxpPlNldCB0aGUgQXBwbGljYXRpb24gTWFwLjwvbGk+Ci0gICAgICogIDxsaT5TZXQgYSByZXNwb25zZSB3cml0ZXI8L2xpPgotICAgICAqICA8bGk+QWRkIFRvbWFoYXdrJ3MgcmVuZGVyZXJzIHRvIHRoZSBmYWNlcyBjb250ZXh0LjwvbGk+Ci0gICAgICogIDwvdWw+IAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIobmV3IFVSTENsYXNzTG9hZGVyKG5ldyBVUkxbMF0sIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkpOwotICAgICAgICBzZXJ2bGV0Q29udGV4dCA9IG5ldyBNb2NrU2VydmxldENvbnRleHQoKTsKLSAgICAgICAgLy9mb3IgdGVzdGluZyB0aGUgZmFsbGJhY2sKLSAgICAgICAgLy9zZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVggKyAiLkRFQUNUSVZBVEVfRUxfUkVTT0xWRVIiLCAidHJ1ZSIpOwotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVggKyAiLkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkiLCBNb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVggKyAiLkNVU1RPTV9NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkiLCBNb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVggKyAiLkNVU1RPTV9NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSIsIE1vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBjb25maWcgPSBuZXcgTW9ja1NlcnZsZXRDb25maWcoc2VydmxldENvbnRleHQpOwotICAgICAgICBzZXNzaW9uID0gbmV3IE1vY2tIdHRwU2Vzc2lvbigpOwotICAgICAgICBzZXNzaW9uLnNldFNlcnZsZXRDb250ZXh0KHNlcnZsZXRDb250ZXh0KTsKLSAgICAgICAgcmVxdWVzdCA9IG5ldyBNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0KHNlc3Npb24pOwotICAgICAgICByZXF1ZXN0LnNldFNlcnZsZXRDb250ZXh0KHNlcnZsZXRDb250ZXh0KTsKLSAgICAgICAgcmVzcG9uc2UgPSBuZXcgTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2UoKTsKLSAgICAgICAgRmFjdG9yeUZpbmRlci5yZWxlYXNlRmFjdG9yaWVzKCk7Ci0gICAgICAgIEZhY3RvcnlGaW5kZXIuc2V0RmFjdG9yeSgiamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5IiwgRXh0VmFsTW9ja0FwcGxpY2F0aW9uRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBGYWN0b3J5RmluZGVyLnNldEZhY3RvcnkoImphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0RmFjdG9yeSIsICJvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrRmFjZXNDb250ZXh0RmFjdG9yeSIpOwotICAgICAgICBGYWN0b3J5RmluZGVyLnNldEZhY3RvcnkoImphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGVGYWN0b3J5IiwgIm9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tMaWZlY3ljbGVGYWN0b3J5Iik7Ci0gICAgICAgIEZhY3RvcnlGaW5kZXIuc2V0RmFjdG9yeSgiamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3RvcnkiLCAib3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1JlbmRlcktpdEZhY3RvcnkiKTsKLSAgICAgICAgZXh0ZXJuYWxDb250ZXh0ID0gbmV3IE1vY2tFeHRlcm5hbENvbnRleHQoc2VydmxldENvbnRleHQsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgbGlmZWN5Y2xlRmFjdG9yeSA9IChNb2NrTGlmZWN5Y2xlRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoImphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGVGYWN0b3J5Iik7Ci0gICAgICAgIGxpZmVjeWNsZSA9IChNb2NrTGlmZWN5Y2xlKWxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlKCJERUZBVUxUIik7Ci0gICAgICAgIGZhY2VzQ29udGV4dEZhY3RvcnkgPSAoTW9ja0ZhY2VzQ29udGV4dEZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dEZhY3RvcnkiKTsKLSAgICAgICAgZmFjZXNDb250ZXh0ID0gKE1vY2tGYWNlc0NvbnRleHQpZmFjZXNDb250ZXh0RmFjdG9yeS5nZXRGYWNlc0NvbnRleHQoc2VydmxldENvbnRleHQsIHJlcXVlc3QsIHJlc3BvbnNlLCBsaWZlY3ljbGUpOwotICAgICAgICBleHRlcm5hbENvbnRleHQgPSAoTW9ja0V4dGVybmFsQ29udGV4dClmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCk7Ci0gICAgICAgIFVJVmlld1Jvb3Qgcm9vdCA9IG5ldyBVSVZpZXdSb290KCk7Ci0gICAgICAgIHJvb3Quc2V0Vmlld0lkKCIvdmlld0lkIik7Ci0gICAgICAgIHJvb3Quc2V0UmVuZGVyS2l0SWQoIkhUTUxfQkFTSUMiKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LnNldFZpZXdSb290KHJvb3QpOwotICAgICAgICBBcHBsaWNhdGlvbkZhY3RvcnkgYXBwbGljYXRpb25GYWN0b3J5ID0gKEFwcGxpY2F0aW9uRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoImphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeSIpOwotICAgICAgICBhcHBsaWNhdGlvbiA9IChNb2NrQXBwbGljYXRpb24pYXBwbGljYXRpb25GYWN0b3J5LmdldEFwcGxpY2F0aW9uKCk7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5zZXRBcHBsaWNhdGlvbihhcHBsaWNhdGlvbik7Ci0gICAgICAgIFJlbmRlcktpdEZhY3RvcnkgcmVuZGVyS2l0RmFjdG9yeSA9IChSZW5kZXJLaXRGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3RvcnkiKTsKLSAgICAgICAgLy9XcmFwIHJlbmRlcmVycyB3aXRoIHByb3BlciBleHZhbCB3cmFwcGVyCi0gICAgICAgIHJlbmRlcktpdCA9IG5ldyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKS5jcmVhdGUobmV3IE1vY2tSZW5kZXJLaXQoKSk7Ci0gICAgICAgIHJlbmRlcktpdEZhY3RvcnkuYWRkUmVuZGVyS2l0KCJIVE1MX0JBU0lDIiwgcmVuZGVyS2l0KTsgICAgICAgIAotICAgICAgICAKLSAgICAgICAgLy8gYWRkaXRpb25hbCBzZXR1cCBub3QgcHJvdmlkZWQgYXV0b21hdGljYWxseSBieSB0aGUgc2hhbGUgbW9jayBzdHVmZgotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25NYXAoKS5wdXQoTXlmYWNlc0NvbmZpZy5jbGFzcy5nZXROYW1lKCksIG5ldyBNeWZhY2VzQ29uZmlnKCkpOwotICAgICAgICB3cml0ZXIgPSBuZXcgTW9ja1Jlc3BvbnNlV3JpdGVyKG5ldyBTdHJpbmdXcml0ZXIoKSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5zZXRSZXNwb25zZVdyaXRlcih3cml0ZXIpOwotCi0gICAgICAgIFRlc3RVdGlscy5hZGREZWZhdWx0UmVuZGVyZXJzKGZhY2VzQ29udGV4dCk7Ci0gICAgICAgIFRlc3RVdGlscy5hZGREZWZhdWx0VmFsaWRhdG9ycyhmYWNlc0NvbnRleHQpOwotICAgICAgICAgICAgICAgIAotICAgICAgICBleHByZXNzaW9uRmFjdG9yeSA9IChNb2NrRXhwcmVzc2lvbkZhY3RvcnkpYXBwbGljYXRpb24uZ2V0RXhwcmVzc2lvbkZhY3RvcnkoKTsKLQotICAgICAgICAvL2V4ZWN1dGUgc3RhcnR1cCBsaXN0ZW5lcgotICAgICAgICBuZXcgRXh0VmFsU3RhcnR1cExpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlci5pbml0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0uaW5pdCgpOwotCi0gICAgICAgIG5ldyBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIoKXsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuaW5pdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9LmluaXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZWFyIGRvd24gdGhlIHRlc3QgZW52aXJvbm1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXNldEZhY3RvcnlGaW5kZXIoKTsKLSAgICAgICAgcmVzZXRFeHRWYWxDb250ZXh0KCk7Ci0KLSAgICAgICAgYXBwbGljYXRpb24gPSBudWxsOwotICAgICAgICBjb25maWcgPSBudWxsOwotICAgICAgICBleHRlcm5hbENvbnRleHQgPSBudWxsOwotICAgICAgICBmYWNlc0NvbnRleHQucmVsZWFzZSgpOwotICAgICAgICBmYWNlc0NvbnRleHQgPSBudWxsOwotICAgICAgICBsaWZlY3ljbGUgPSBudWxsOwotICAgICAgICBsaWZlY3ljbGVGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgcmVuZGVyS2l0ID0gbnVsbDsKLSAgICAgICAgcmVxdWVzdCA9IG51bGw7Ci0gICAgICAgIHJlc3BvbnNlID0gbnVsbDsKLSAgICAgICAgc2VydmxldENvbnRleHQgPSBudWxsOwotICAgICAgICBzZXNzaW9uID0gbnVsbDsKLSAgICAgICAgRmFjdG9yeUZpbmRlci5yZWxlYXNlRmFjdG9yaWVzKCk7Ci0gICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHRocmVhZENvbnRleHRDbGFzc0xvYWRlcik7Ci0gICAgICAgIGV4cHJlc3Npb25GYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRGYWN0b3J5RmluZGVyKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWVsZCBmYWN0b3J5TWFwID0gRGVmYXVsdEZhY3RvcnlGaW5kZXIuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgiZmFjdG9yeU1hcCIpOwotICAgICAgICAgICAgZmFjdG9yeU1hcC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgZmFjdG9yeU1hcC5zZXQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpLCBuZXcgSGFzaE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjYW5ub3QgcmVzZXQgdGhlIGZhY3RvcnkgZmluZGVyIiwgdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXNldEV4dFZhbENvbnRleHQoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEZpZWxkIGNvbnRleHQgPSBFeHRWYWxDb250ZXh0LmNsYXNzLmdldERlY2xhcmVkRmllbGQoImV4dFZhbENvbnRleHQiKTsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0KEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbm5vdCByZXNldCB0aGUgZXh0dmFsLWNvbnRleHQiLCB0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ3Jvc3NWYWxWYWxpZGF0aW9uKCkKLSAgICB7Ci0gICAgICAgIG5ldyBDcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyKCkuYWZ0ZXJQaGFzZShuZXcgUGhhc2VFdmVudChmYWNlc0NvbnRleHQsUGhhc2VJZC5BTllfUEhBU0UsbGlmZWN5Y2xlKSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrTWVzc2FnZUNvdW50KGludCBleHBlY3RlZCkKLSAgICB7Ci0gICAgICAgIGludCBhY3R1YWwgPSAwOwotICAgICAgICBmb3IoSXRlcmF0b3IgbWVzc2FnZXMgPSBmYWNlc0NvbnRleHQuZ2V0TWVzc2FnZXMoKTsgbWVzc2FnZXMuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgbWVzc2FnZXMubmV4dCgpOwotICAgICAgICAgICAgYWN0dWFsKys7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbXBsZXRlIG1lc3NhZ2UgY291bnQiLCBleHBlY3RlZCwgYWN0dWFsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja01lc3NhZ2VDb3VudChTdHJpbmcgY2xpZW50SWQsIGludCBleHBlY3RlZCkKLSAgICB7Ci0gICAgICAgIGludCBhY3R1YWwgPSAwOwotICAgICAgICBmb3IoSXRlcmF0b3IgbWVzc2FnZXMgPSBmYWNlc0NvbnRleHQuZ2V0TWVzc2FnZXMoY2xpZW50SWQpOyBtZXNzYWdlcy5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlcy5uZXh0KCk7Ci0gICAgICAgICAgICBhY3R1YWwrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydEVxdWFscygiQ29tcGxldGUgbWVzc2FnZSBjb3VudCIsIGV4cGVjdGVkLCBhY3R1YWwpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBWZXJpZnkgdGhlIGZvbGxvd2luZzoKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPmlkIGlzIG5vdCBudWxsPC9saT4KLSAgICAgKiA8bGk+UmVzcG9uc2UgaXMgY29tcGxldGU8L2xpPgotICAgICAqIDxsaT5SZXNwb25jZSBjb250YWlucyB0aGUgaWQ8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGlkIElEIHRvIHZlcmlmeQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydElkRXhpc3RzKFN0cmluZyBpZCkKLSAgICB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIklEIGlzIG5vdCBudWxsIiwgaWQpOwotICAgICAgICBhc3NlcnRUcnVlKCJSZXNwb25zZSBDb21wbGV0ZSIsIGZhY2VzQ29udGV4dC5nZXRSZXNwb25zZUNvbXBsZXRlKCkpOwotICAgICAgICBTdHJpbmcgb3V0cHV0ID0gd3JpdGVyLmdldFdyaXRlcigpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIkhhcyBvdXRwdXQiLCBvdXRwdXQpOwotICAgICAgICBhc3NlcnRUcnVlKCJDb250YWlucyBpZCAnIiArIGlkICsgIiciLCBvdXRwdXQuaW5kZXhPZihpZCkgIT0gLTEpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVZhbHVlQmluZGluZyhVSUlucHV0IHVpSW5wdXQsIFN0cmluZyBuYW1lLCBTdHJpbmcgZXhwcmVzc2lvbikKLSAgICB7Ci0gICAgICAgIFZhbHVlQmluZGluZyB2YWx1ZUJpbmRpbmcgPSBhcHBsaWNhdGlvbi5jcmVhdGVWYWx1ZUJpbmRpbmcoZXhwcmVzc2lvbik7Ci0gICAgICAgIFZhbHVlRXhwcmVzc2lvbiB2YWx1ZUV4cHJlc3Npb24gPSBleHByZXNzaW9uRmFjdG9yeS5jcmVhdGVWYWx1ZUV4cHJlc3Npb24oCi0gICAgICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RUxDb250ZXh0KCksIGV4cHJlc3Npb24sIE9iamVjdC5jbGFzcyk7Ci0KLSAgICAgICAgaWYodWlJbnB1dCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aUlucHV0LnNldFZhbHVlQmluZGluZyhuYW1lLCB2YWx1ZUJpbmRpbmcpOwotICAgICAgICAgICAgdWlJbnB1dC5zZXRWYWx1ZUV4cHJlc3Npb24obmFtZSwgdmFsdWVFeHByZXNzaW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKFN0cmluZyBuYW1lLCBPYmplY3QgaW5zdGFuY2UpCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcobnVsbCwgInZhbHVlIiwgIiN7IiArIG5hbWUgKyAifSIpOwotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dChuYW1lLCBpbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIDxUPiBUIHJlc29sdmVCZWFuKFN0cmluZyBuYW1lLCBDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVClFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4obmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNldmFsL0Jhc2VWYWxUZXN0QmVhbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNldmFsL0Jhc2VWYWxUZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmY4NDdmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9CYXNlVmFsVGVzdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2V2YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkRvdWJsZVJhbmdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOwotCi0vKioKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUKLSAqLwotcHVibGljIGNsYXNzIEJhc2VWYWxUZXN0QmVhbgotewotICAgIEBSZXF1aXJlZAotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgCi0gICAgQExlbmd0aChtaW5pbXVtPTIsbWF4aW11bT0zKQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWUxOwotICAgIAotICAgIEBQYXR0ZXJuKCJbQS1aXVthLXpdKyIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGF0dGVybk5hbWU7Ci0gICAgCi0gICAgQERvdWJsZVJhbmdlKG1pbmltdW09LTMwMGQpCi0gICAgcHJpdmF0ZSBEb3VibGUgZG91YmxlVmFsdWUxOwotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZTEoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5hbWUxOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUxKFN0cmluZyBuYW1lMSkKLSAgICB7Ci0gICAgICAgIHRoaXMubmFtZTEgPSBuYW1lMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhdHRlcm5OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwYXR0ZXJuTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuTmFtZShTdHJpbmcgcGF0dGVybk5hbWUpCi0gICAgewotICAgICAgICB0aGlzLnBhdHRlcm5OYW1lID0gcGF0dGVybk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIERvdWJsZSBnZXREb3VibGVWYWx1ZTEoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRvdWJsZVZhbHVlMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREb3VibGVWYWx1ZTEoRG91YmxlIGRvdWJsZVZhbHVlMSkKLSAgICB7Ci0gICAgICAgIHRoaXMuZG91YmxlVmFsdWUxID0gZG91YmxlVmFsdWUxOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9CYXNlVmFsVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9CYXNlVmFsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI5NThkMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2V2YWwvQmFzZVZhbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZXZhbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsKLQotLyoqCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlVmFsVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZQotewotCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudCA9IG51bGw7Ci0KLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOwotCi0gICAgQmFzZVZhbFRlc3RCZWFuIGJlYW4gPSBudWxsOwotCi0gICAgcHVibGljIEJhc2VWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgICAgICBpbnB1dENvbXBvbmVudCA9IG51bGw7Ci0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOwotICAgICAgICBiZWFuID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQmFzZVZhbFRlc3RDYXNlLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBiZWFuID0gbmV3IEJhc2VWYWxUZXN0QmVhbigpOwotICAgICAgICBWYWx1ZUJpbmRpbmcgdmIgPSBhcHBsaWNhdGlvbi5jcmVhdGVWYWx1ZUJpbmRpbmcoIiN7dGVzdEJlYW59Iik7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucHV0KCJ0ZXN0QmVhbiIsIGJlYW4pOwotCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOwotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7Ci0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsKLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBuZXcgSHRtbElucHV0VGV4dCgpOwotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50KTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0SWQoImlucHV0MSIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBudWxsOwotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsKLSAgICAgICAgYmVhbiA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWVSZXF1aXJlZEZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWV9Iik7Ci0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIiIpOwotCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWUxTGVuZ2h0TWF4RmFpbCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZTF9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIjEyMzQ1Iik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lMUxlbmdodENvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWUxfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZTFMZW5naHRNaW5GYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lMX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgieCIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0dGVybk5hbWVGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wYXR0ZXJuTmFtZX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiUGV0ZXIxIik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXR0ZXJuTmFtZUNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnBhdHRlcm5OYW1lfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCJQZXRlciIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVWYWx1ZUZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLmRvdWJsZVZhbHVlMX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiLTMwMSIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWVDb3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5kb3VibGVWYWx1ZTF9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIjIwMCIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOwotICAgICAgICBhc3NlcnRFcXVhbHMoMjAwZCwgaW5wdXRDb21wb25lbnQuZ2V0VmFsdWUoKSk7Ci0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudXBkYXRlTW9kZWwoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMGQsIGJlYW4uZ2V0RG91YmxlVmFsdWUxKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9wYXJhbWV0ZXIvQWRkaXRpb25hbFZhbGlkYXRvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNldmFsL3BhcmFtZXRlci9BZGRpdGlvbmFsVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNDY5NjAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNldmFsL3BhcmFtZXRlci9BZGRpdGlvbmFsVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNldmFsLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5QYXJhbWV0ZXJWYWx1ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgQWRkaXRpb25hbFZhbGlkYXRvciBleHRlbmRzIFRlc3RWYWxpZGF0b3JQcm92aWRlcg0KLXsNCi0gICAgQFBhcmFtZXRlclZhbHVlDQotICAgIHB1YmxpYyBDbGFzcyBnZXRQcm92aWRlckNsYXNzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEFkZGl0aW9uYWxWYWxpZGF0b3IuY2xhc3M7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiAidmFsaWRhdGlvbl9mYWlsZWQiOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH07DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNldmFsL3BhcmFtZXRlci9QYXJhbWV0ZXJUZXN0Q2FzZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNldmFsL3BhcmFtZXRlci9QYXJhbWV0ZXJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjAxN2IyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9wYXJhbWV0ZXIvUGFyYW1ldGVyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNldmFsLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotcHVibGljIGNsYXNzIFBhcmFtZXRlclRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFBhcmFtZXRlclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyU3R5bGVPbmUoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCk7DQotDQotICAgICAgICBUZXN0UGVyc29uIHBlcnNvbiA9IG5ldyBUZXN0UGVyc29uKCk7DQotICAgICAgICBSZXF1aXJlZCByZXF1aXJlZCA9IHBlcnNvbi5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoImZpcnN0TmFtZSIpLmdldEFubm90YXRpb24oUmVxdWlyZWQuY2xhc3MpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCkuY29udGFpbnNLZXkoVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MpKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFZpb2xhdGlvblNldmVyaXR5LmNsYXNzKS5pdGVyYXRvcigpLm5leHQoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFZpb2xhdGlvblNldmVyaXR5LmNsYXNzKS5pdGVyYXRvcigpLm5leHQoKSwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJTdHlsZVR3bygpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKTsNCi0NCi0gICAgICAgIFRlc3RQZXJzb24gcGVyc29uID0gbmV3IFRlc3RQZXJzb24oKTsNCi0gICAgICAgIFJlcXVpcmVkIHJlcXVpcmVkID0gcGVyc29uLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgibGFzdE5hbWUiKS5nZXRBbm5vdGF0aW9uKFJlcXVpcmVkLmNsYXNzKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQpLmNvbnRhaW5zS2V5KCJjbGllbnRfc2lkZV92YWxpZGF0aW9uX3N1cHBvcnQiKSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCAiY2xpZW50X3NpZGVfdmFsaWRhdGlvbl9zdXBwb3J0IikuaXRlcmF0b3IoKS5uZXh0KCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCAiY2xpZW50X3NpZGVfdmFsaWRhdGlvbl9zdXBwb3J0IikuaXRlcmF0b3IoKS5uZXh0KCksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyU3R5bGVUaHJlZSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKTsNCi0NCi0gICAgICAgIFRlc3RQZXJzb24gcGVyc29uID0gbmV3IFRlc3RQZXJzb24oKTsNCi0gICAgICAgIFJlcXVpcmVkIHJlcXVpcmVkID0gcGVyc29uLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgibGFzdE5hbWUiKS5nZXRBbm5vdGF0aW9uKFJlcXVpcmVkLmNsYXNzKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQpLmNvbnRhaW5zS2V5KFRlc3RQcmlvcml0eS5jbGFzcykpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgVGVzdFByaW9yaXR5LmNsYXNzKS5pdGVyYXRvcigpLm5leHQoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFRlc3RQcmlvcml0eS5jbGFzcywgSW50ZWdlci5jbGFzcykuaXRlcmF0b3IoKS5uZXh0KCksIG5ldyBJbnRlZ2VyKDEpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgVGVzdFByaW9yaXR5LmNsYXNzLCBTdHJpbmcuY2xhc3MpLnNpemUoKSwgMik7DQotICAgICAgICBhc3NlcnRFcXVhbHMoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFRlc3RQcmlvcml0eS5jbGFzcywgU3RyaW5nLmNsYXNzLCBUZXN0UHJpb3JpdHkuU2hvcnREZXNjcmlwdGlvbi5jbGFzcyksICJkbyBpdCBhc2FwIik7DQotICAgICAgICBhc3NlcnRFcXVhbHMoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFRlc3RQcmlvcml0eS5jbGFzcywgU3RyaW5nLmNsYXNzLCBUZXN0UHJpb3JpdHkuTG9uZ0Rlc2NyaXB0aW9uLmNsYXNzKSwgImRvIGl0IGltbWVkaWF0ZWx5Iik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlclN0eWxlRm91cigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKTsNCi0NCi0gICAgICAgIFRlc3RQZXJzb24gcGVyc29uID0gbmV3IFRlc3RQZXJzb24oKTsNCi0gICAgICAgIFJlcXVpcmVkIHJlcXVpcmVkID0gcGVyc29uLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgibGFzdE5hbWUiKS5nZXRBbm5vdGF0aW9uKFJlcXVpcmVkLmNsYXNzKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQpLmNvbnRhaW5zS2V5KFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcykuaXRlcmF0b3IoKS5uZXh0KCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcykuc2l6ZSgpLCAxKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKS5pdGVyYXRvcigpLm5leHQoKS5nZXRDbGFzcygpLmdldE5hbWUoKSwgVGVzdFZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJTdHlsZUZpdmUoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCk7DQotDQotICAgICAgICBUZXN0UGVyc29uIHBlcnNvbiA9IG5ldyBUZXN0UGVyc29uKCk7DQotICAgICAgICBSZXF1aXJlZCByZXF1aXJlZCA9IHBlcnNvbi5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoImxhc3ROYW1lIikuZ2V0QW5ub3RhdGlvbihSZXF1aXJlZC5jbGFzcyk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkKS5jb250YWluc0tleShEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykuaXRlcmF0b3IoKS5uZXh0KCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpLnNpemUoKSwgMSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcywgQ2xhc3MuY2xhc3MpLnNpemUoKSwgMSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcywgQ2xhc3MuY2xhc3MpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSwgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogVE9ETyB0aGVzZSB0ZXN0cyB3b3JrIGluIGFuIGlkZSBidXQgbm90IHZpYSBjb21tYW5kbGluZSAtIGl0J3MgYSBTdXJlZmlyZSBpc3N1ZQ0KLSAgICAgKi8NCi0gICAgLyoNCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlclN0eWxlU2l4KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpOw0KLQ0KLSAgICAgICAgVGVzdFBlcnNvbiBwZXJzb24gPSBuZXcgVGVzdFBlcnNvbigpOw0KLSAgICAgICAgUmVxdWlyZWQgcmVxdWlyZWQgPSBwZXJzb24uZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJsYXN0TmFtZSIpLmdldEFubm90YXRpb24oUmVxdWlyZWQuY2xhc3MpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCkuY29udGFpbnNLZXkoVGVzdFZhbGlkYXRvclByb3ZpZGVyLmNsYXNzKSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBUZXN0VmFsaWRhdG9yUHJvdmlkZXIuY2xhc3MpLml0ZXJhdG9yKCkubmV4dCgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgVGVzdFZhbGlkYXRvclByb3ZpZGVyLmNsYXNzLCBDbGFzcy5jbGFzcykuc2l6ZSgpLCAyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyU3R5bGVTZXZlbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKTsNCi0NCi0gICAgICAgIFRlc3RQZXJzb24gcGVyc29uID0gbmV3IFRlc3RQZXJzb24oKTsNCi0gICAgICAgIFJlcXVpcmVkIHJlcXVpcmVkID0gcGVyc29uLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgibGFzdE5hbWUiKS5nZXRBbm5vdGF0aW9uKFJlcXVpcmVkLmNsYXNzKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQpLmNvbnRhaW5zS2V5KFRlc3RWYWxpZGF0b3JQcm92aWRlci5jbGFzcykpOw0KLSAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50Q2xhc3MgOiBleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgVGVzdFZhbGlkYXRvclByb3ZpZGVyLmNsYXNzLCBDbGFzcy5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShUZXN0VmFsaWRhdG9yUHJvdmlkZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjdXJyZW50Q2xhc3MpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICAqLw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RBbGxvd0NsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RBbGxvd0NsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNmM1NWMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNldmFsL3BhcmFtZXRlci9UZXN0QWxsb3dDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZXZhbC5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlBhcmFtZXRlclZhbHVlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5QYXJhbWV0ZXJLZXk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotDQotcHVibGljIGludGVyZmFjZSBUZXN0QWxsb3dDbGllbnRTaWRlVmFsaWRhdGlvbiBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi17DQotICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgcHVibGljIFN0cmluZyBLRVkgPSAiY2xpZW50X3NpZGVfdmFsaWRhdGlvbl9zdXBwb3J0IjsNCi0NCi0gICAgQFBhcmFtZXRlclZhbHVlDQotICAgIGJvb2xlYW4gdmFsdWUgPSB0cnVlOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3REZW55Q2xpZW50U2lkZVZhbGlkYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdERlbnlDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODk4ZDYxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdERlbnlDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZXZhbC5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlBhcmFtZXRlclZhbHVlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5QYXJhbWV0ZXJLZXk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotDQotcHVibGljIGludGVyZmFjZSBUZXN0RGVueUNsaWVudFNpZGVWYWxpZGF0aW9uIGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcg0KLXsNCi0gICAgQFBhcmFtZXRlcktleQ0KLSAgICBwdWJsaWMgU3RyaW5nIGtleSA9ICJjbGllbnRfc2lkZV92YWxpZGF0aW9uX3N1cHBvcnQiOw0KLQ0KLSAgICBAUGFyYW1ldGVyVmFsdWUNCi0gICAgYm9vbGVhbiB2YWx1ZSA9IGZhbHNlOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQZXJzb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFBlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmEzMTU0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFBlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0UGVyc29uDQotew0KLSAgICBAUmVxdWlyZWQocGFyYW1ldGVycyA9IHtWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzLCBUZXN0QWxsb3dDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzc30pDQotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsNCi0NCi0gICAgQFJlcXVpcmVkKHBhcmFtZXRlcnMgPSB7DQotICAgICAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHkuSW5mby5jbGFzcywNCi0gICAgICAgICAgICBUZXN0RGVueUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLA0KLSAgICAgICAgICAgIFRlc3RQcmlvcml0eUhpZ2guY2xhc3MsDQotICAgICAgICAgICAgVGVzdFZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcywNCi0gICAgICAgICAgICBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MsDQotICAgICAgICAgICAgLy9Mb2dpblZhbGlkYXRvci5jbGFzcywNCi0gICAgICAgICAgICBBZGRpdGlvbmFsVmFsaWRhdG9yLmNsYXNzfSkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7DQotDQotICAgIHByaXZhdGUgaW50IGZhaWxlZExvZ2lucyA9IDA7DQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VyTG9ja2VkOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBUT0RPIHRoZXNlIHRlc3RzIHdvcmsgaW4gYW4gaWRlIGJ1dCBub3QgdmlhIGNvbW1hbmRsaW5lIC0gaXQncyBhIFN1cmVmaXJlIGlzc3VlDQotICAgICAqLw0KLSAgICAvKg0KLSAgICBwdWJsaWMgY2xhc3MgTG9naW5WYWxpZGF0b3IgZXh0ZW5kcyBUZXN0VmFsaWRhdG9yUHJvdmlkZXINCi0gICAgew0KLSAgICAgICAgQFBhcmFtZXRlclZhbHVlDQotICAgICAgICBwdWJsaWMgVGVzdFZhbGlkYXRpb25TdHJhdGVneVByb3ZpZGVyIGdldFZhbHVlKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpczsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsaWRhdGlvblN0cmF0ZWd5KCkgew0KLQ0KLSAgICAgICAgICAgICAgICBpbnQgZmFpbGVkTG9naW5zOw0KLQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZigodGhpcy5mYWlsZWRMb2dpbnMgPSBpc0xvZ2luU3VjY2Vzc2Z1bCgpKSA+IDApDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5mYWlsZWRMb2dpbnMgPiAzKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaygpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH07DQotICAgICAgICB9DQotICAgIH0NCi0gICAgKi8NCi0NCi0gICAgcHJpdmF0ZSBpbnQgaXNMb2dpblN1Y2Nlc3NmdWwoKQ0KLSAgICB7DQotICAgICAgICAvL2ZvcmNlIGFuIGV4Y2VwdGlvbg0KLSAgICAgICAgcmV0dXJuICsrdGhpcy5mYWlsZWRMb2dpbnM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNMb2NrZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdXNlckxvY2tlZDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgbG9jaygpDQotICAgIHsNCi0gICAgICAgIHRoaXMudXNlckxvY2tlZCA9IHRydWU7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbGFzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UHJpb3JpdHkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NDU3M2EuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UHJpb3JpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5QYXJhbWV0ZXJWYWx1ZTsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIFRlc3RQcmlvcml0eSBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi17DQotICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICBJbnRlZ2VyIGdldFZhbHVlKCk7DQotDQotICAgIEBQYXJhbWV0ZXJWYWx1ZShpZCA9IFNob3J0RGVzY3JpcHRpb24uY2xhc3MpDQotICAgIFN0cmluZyBnZXRTaG9ydERlc2NyaXB0aW9uKCk7DQotDQotICAgIEBQYXJhbWV0ZXJWYWx1ZShpZCA9IExvbmdEZXNjcmlwdGlvbi5jbGFzcykNCi0gICAgU3RyaW5nIGdldExvbmdEZXNjcmlwdGlvbigpOw0KLQ0KLSAgICBpbnRlcmZhY2UgU2hvcnREZXNjcmlwdGlvbnt9DQotICAgIGludGVyZmFjZSBMb25nRGVzY3JpcHRpb257fQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQcmlvcml0eUhpZ2guamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5SGlnaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDg2Y2U0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5SGlnaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZXZhbC5wYXJhbWV0ZXI7DQotDQotcHVibGljIGNsYXNzIFRlc3RQcmlvcml0eUhpZ2ggaW1wbGVtZW50cyBUZXN0UHJpb3JpdHkNCi17DQotICAgIHB1YmxpYyBJbnRlZ2VyIGdldFZhbHVlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIDE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTaG9ydERlc2NyaXB0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICJkbyBpdCBhc2FwIjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvbmdEZXNjcmlwdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAiZG8gaXQgaW1tZWRpYXRlbHkiOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5TG93LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQcmlvcml0eUxvdy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTBjMjczLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5TG93LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNldmFsLnBhcmFtZXRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdFByaW9yaXR5TG93IGltcGxlbWVudHMgVGVzdFByaW9yaXR5DQotew0KLSAgICBwdWJsaWMgSW50ZWdlciBnZXRWYWx1ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvcnREZXNjcmlwdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAibm90IHRoYXQgaW1wb3J0YW50IjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvbmdEZXNjcmlwdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAidGhlIHRvcGljIGlzIG5vdCB0aGF0IGltcG9ydGFudCI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMyNGE1MC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuUGFyYW1ldGVyVmFsdWU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1ASW52b2NhdGlvbk9yZGVyKDIxMCkNCi1wdWJsaWMgY2xhc3MgVGVzdFZhbGlkYXRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi0NCi0gICAgQFBhcmFtZXRlclZhbHVlDQotICAgIHB1YmxpYyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBnZXRJbnN0YW5jZSgpDQotICAgIHsNCi0gICAgICAgIGlmKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgPSBuZXcgVGVzdFZhbGlkYXRpb25JbnRlcmNlcHRvcigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJpdCdzIGEgdGVzdCBjbGFzcyIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIml0J3MgYSB0ZXN0IGNsYXNzIik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdGlvblN0cmF0ZWd5UHJvdmlkZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFZhbGlkYXRpb25TdHJhdGVneVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2Njc4MWEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdGlvblN0cmF0ZWd5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lQcm92aWRlcg0KLXsNCi0gICAgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0b3JQcm92aWRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdG9yUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgyM2RiZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0b3JQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZXZhbC5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5QYXJhbWV0ZXJLZXk7DQotDQotcHVibGljIGNsYXNzIFRlc3RWYWxpZGF0b3JQcm92aWRlciBpbXBsZW1lbnRzIFZhbGlkYXRpb25QYXJhbWV0ZXIsIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lQcm92aWRlcg0KLXsNCi0gICAgQFBhcmFtZXRlcktleQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0S2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFRlc3RWYWxpZGF0b3JQcm92aWRlci5jbGFzczsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogaXQgaXNuJ3QgYWxsb3dlZCB0byBoYXZlIGFuIGFic3RyYWN0IGNsYXNzIGluIHRoaXMgY2FzZSAtIHNvIHRoaXMgaW1wbC4gaXMgcmVxdWlyZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigieW91IGhhdmUgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QiKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW5pdGlhbGl6ZXIvUmVnaXN0cmF0aW9uQ29tcG9uZW50SW5pdGlhbGl6ZXJUZXN0Q2FzZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2luaXRpYWxpemVyL1JlZ2lzdHJhdGlvbkNvbXBvbmVudEluaXRpYWxpemVyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU0OGI1Yi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW5pdGlhbGl6ZXIvUmVnaXN0cmF0aW9uQ29tcG9uZW50SW5pdGlhbGl6ZXJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuaW5pdGlhbGl6ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LkFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvbkNvbXBvbmVudEluaXRpYWxpemVyVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZQ0KLXsNCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBSZWdpc3RyYXRpb25Db21wb25lbnRJbml0aWFsaXplclRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWdpc3RyYXRpb25Db21wb25lbnRJbml0aWFsaXplclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXJJbml0aWFsaXphdGlvbigpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZENvbXBvbmVudEluaXRpYWxpemVyKG5ldyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIxMDAwKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IFRlc3RDb21wb25lbnRJbml0aWFsaXplcjIoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IFRlc3RDb21wb25lbnRJbml0aWFsaXplcjMoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMSgpKTsNCi0NCi0gICAgICAgIExpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldENvbXBvbmVudEluaXRpYWxpemVycygpOw0KLQ0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDY7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5zaXplKCkgPT0gcmVzdWx0TGVuZ3RoKTsNCi0gICAgICAgIA0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjEpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjIpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjMpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDQ6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIxMDAwKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDU6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDEpDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjEgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigyKQ0KLSAgICBjbGFzcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMykNCi0gICAgY2xhc3MgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMyBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDEwMDApDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjEwMDAgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNjJhNWUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUmVnaXN0cmF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVnaXN0cmF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ySW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMCgpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IyKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RDb21wb25lbnRJbml0aWFsaXplcigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IzKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEoKSk7DQotDQotICAgICAgICBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsNCi0NCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSA1Ow0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdExlbmd0aCwgcmVzdWx0LnNpemUoKSk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjMuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEwMDAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RDb21wb25lbnRJbml0aWFsaXplci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMSkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMSBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigyKQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IyIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDMpDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjMgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTAwMCkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMCBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvbk1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25Nb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhY2M3ZWYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvbk1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5WYWxpZGF0aW9uTW9kdWxlQXdhcmU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvbk1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZQ0KLXsNCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBSZWdpc3RyYXRpb25Nb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvclRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWdpc3RyYXRpb25Nb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbml0aWFsaXphdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJlc2V0RXh0VmFsQ29udGV4dCgpOw0KLQ0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxMDAwKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjIoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgVGVzdE1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMygpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxKCkpOw0KLQ0KLSAgICAgICAgY2hlY2tHbG9iYWxPbmx5UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7DQotICAgICAgICBjaGVja01vZHVsZUF3YXJlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzV2l0aFRlc3RNb2R1bGUoKTsNCi0gICAgICAgIGNoZWNrTW9kdWxlQXdhcmVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNXaXRoUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrR2xvYmFsT25seVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpDQotICAgIHsNCi0gICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOw0KLQ0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDM7DQotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0TGVuZ3RoLCByZXN1bHQuc2l6ZSgpKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMS5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMTAwMC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjaGVja01vZHVsZUF3YXJlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzV2l0aFRlc3RNb2R1bGUoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IoVGVzdE1vZHVsZS5jbGFzcyk7DQotDQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gNTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LnNpemUoKSA9PSByZXN1bHRMZW5ndGgpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjEpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RNb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjIpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RNb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjMpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjEwMDApOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrTW9kdWxlQXdhcmVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNXaXRoUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlKCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzRm9yKFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcyk7DQotDQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gNDsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LnNpemUoKSA9PSByZXN1bHRMZW5ndGgpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhUZXN0TW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxMDAwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYmVmb3JlVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxKQ0KLSAgICBjbGFzcyBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxIGltcGxlbWVudHMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYmVmb3JlVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigyKQ0KLSAgICBjbGFzcyBUZXN0TW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IyIGltcGxlbWVudHMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IsIFZhbGlkYXRpb25Nb2R1bGVBd2FyZQ0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNb2R1bGVLZXlzKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpLCBUZXN0TW9kdWxlLmNsYXNzLmdldE5hbWUoKX07DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigzKQ0KLSAgICBjbGFzcyBUZXN0TW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IzIGltcGxlbWVudHMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IsIFZhbGlkYXRpb25Nb2R1bGVBd2FyZQ0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNb2R1bGVLZXlzKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtUZXN0TW9kdWxlLmNsYXNzLmdldE5hbWUoKX07DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdE1vZHVsZQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxMDAwKQ0KLSAgICBjbGFzcyBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxMDAwIGltcGxlbWVudHMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYmVmb3JlVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvblByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNGVlNWYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvblByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlDQotew0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlZ2lzdHJhdGlvblByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvblByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RDb21wb25lbnRJbml0aWFsaXplcigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxMDAwKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMygpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxKCkpOw0KLQ0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7DQotDQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gNjsNCi0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRMZW5ndGgsIHJlc3VsdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IzLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhGYWNlc01lc3NhZ2VQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDQ6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDU6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVGVzdENvbXBvbmVudEluaXRpYWxpemVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMSkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMSBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMikNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMiBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMykNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMyBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTAwMCkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMCBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25SZW5kZXJlckludGVyY2VwdG9yVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25SZW5kZXJlckludGVyY2VwdG9yVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM4MTNkYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uUmVuZGVyZXJJbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUmVuZGVyZXJJbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uUmVuZGVyZXJJbnRlcmNlcHRvclRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUmVnaXN0cmF0aW9uUmVuZGVyZXJJbnRlcmNlcHRvclRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWdpc3RyYXRpb25SZW5kZXJlckludGVyY2VwdG9yVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW5kZXJlckludGVyY2VwdG9ySW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFRlc3RDb21wb25lbnRJbml0aWFsaXplcigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMSgpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMigpKTsNCi0NCi0gICAgICAgIExpc3Q8UmVuZGVyZXJJbnRlcmNlcHRvcj4gcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKTsNCi0NCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSA0Ow0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdExlbmd0aCwgcmVzdWx0LnNpemUoKSk7DQotDQotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yIHRtcDsNCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0bXAgPSByZXN1bHQuZ2V0KGkpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUodG1wIGluc3RhbmNlb2YgVGVzdENvbXBvbmVudEluaXRpYWxpemVyIHx8IHRtcCBpbnN0YW5jZW9mIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3INCi0gICAgew0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjEgZXh0ZW5kcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXINCi0gICAgew0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjIgZXh0ZW5kcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXINCi0gICAgew0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YjBkNDkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WaW9sYXRpb25TZXZlcml0eVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvblZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvclRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUmVnaXN0cmF0aW9uVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvblZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ySW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IxKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcihuZXcgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjMoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IxMDAwKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkpOw0KLQ0KLSAgICAgICAgTGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsNCi0NCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSA3Ow0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdExlbmd0aCwgcmVzdWx0LnNpemUoKSk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IxLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMi5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjMuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhIdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA1Og0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IxMDAwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNjoNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLCBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMSkNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjEgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLCBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMikNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjIgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLCBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMykNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjMgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLCBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTAwMCkNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjEwMDAgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLCBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9tYXBwZXIvUmVnaXN0cmF0aW9uTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJUZXN0Q2FzZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25NZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZTlkMmEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25NZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LkFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jcm9zc3ZhbC5Nb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5OYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIuKjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlDQotew0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlZ2lzdHJhdGlvbk1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvbk1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyNjUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyMTUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyNDUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyMjUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyNTUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOTkoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIzNTAoKSk7DQotDQotICAgICAgICBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gcmVzdWx0ID0gZ2V0TmFtZU1hcHBlcnMoKTsNCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSAxNjsNCi0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRMZW5ndGgsIHJlc3VsdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjk5LmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIxNTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjI1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDU6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA2Og0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyMzUwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNzoNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgODoNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjQ1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDk6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxMDoNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDExOg0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMTI6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxMzoNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjU1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE0Og0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyNjUwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMTU6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gZ2V0TmFtZU1hcHBlcnMoKQ0KLSAgICB7DQotICAgICAgICBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcyk7DQotDQotICAgICAgICByZXR1cm4gKChNb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSlyZXN1bHQpLmdldFJlZ2lzdGVyZWROYW1lTWFwcGVyTGlzdCgpOw0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDk5KQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjk5IGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDE1MCkNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIxNTAgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMjUwKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjI1MCBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigzNTApDQotICAgIGNsYXNzIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyMzUwIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDQ1MCkNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI0NTAgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoNTUwKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjU1MCBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcig2NTApDQotICAgIGNsYXNzIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyNjUwIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlclRlc3RDYXNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYjYyNmIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWwuTW9ja01lc3NhZ2VSZXNvbHZlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5OYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyLio7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlclRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIzMDEoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyMTUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjQ1MCgpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIyNTAoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyNTUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjk5KCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjM1MCgpKTsNCi0NCi0gICAgICAgIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiByZXN1bHQgPSBnZXROYW1lTWFwcGVycygpOw0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDEzOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdExlbmd0aCwgcmVzdWx0LnNpemUoKSk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyOTkuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIxNTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDQ6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIyNTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA1Og0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDY6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIzMDEuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA3Og0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKERlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDg6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIzNTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA5Og0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMTA6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXI0NTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxMToNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjU1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDEyOg0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IGdldE5hbWVNYXBwZXJzKCkNCi0gICAgew0KLSAgICAgICAgTmFtZU1hcHBlckF3YXJlRmFjdG9yeSByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuICgoTW9ja01lc3NhZ2VSZXNvbHZlckZhY3RvcnkpcmVzdWx0KS5nZXRSZWdpc3RlcmVkTmFtZU1hcHBlckxpc3QoKTsNCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcig5OSkNCi0gICAgY2xhc3MgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXI5OSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxNTApDQotICAgIGNsYXNzIFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyMTUwIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDI1MCkNCi0gICAgY2xhc3MgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIyNTAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMzAxKQ0KLSAgICBjbGFzcyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjMwMSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigzNTApDQotICAgIGNsYXNzIFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyMzUwIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDQ1MCkNCi0gICAgY2xhc3MgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXI0NTAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoNTUwKQ0KLSAgICBjbGFzcyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjU1MCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9tYXBwZXIvUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YzlkNWYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsLk1vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5OYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIuKjsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZQ0KLXsNCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBSZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyMTUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyNDUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyMjUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyNTUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOTkoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIzNTAoKSk7DQotDQotICAgICAgICBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gcmVzdWx0ID0gZ2V0TmFtZU1hcHBlcnMoKTsNCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSAxMzsNCi0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRMZW5ndGgsIHJlc3VsdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI5OS5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjE1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjI1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDU6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA2Og0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjM1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDc6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDg6DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyNDUwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgOToNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDEwOg0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjU1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDExOg0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXROYW1lTWFwcGVycygpDQotICAgIHsNCi0gICAgICAgIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkgcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuICgoTW9ja01ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KXJlc3VsdCkuZ2V0UmVnaXN0ZXJlZE5hbWVNYXBwZXJMaXN0KCk7DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoOTkpDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjk5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTUwKQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIxNTAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigyNTApDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjI1MCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDM1MCkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyMzUwIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoNDUwKQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI0NTAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcig1NTApDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjU1MCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdEJlYW4uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjZiN2MyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7Ci0KLS8qKgotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQotICovCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxUZXN0QmVhbgotewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkxOwotICAgIAotICAgIEBFcXVhbHMoInByb3BlcnR5MSIpICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MjsKLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MSgpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvcGVydHkxOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOwotICAgIH0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MigpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvcGVydHkyOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydHkyID0gcHJvcGVydHkyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZTgwODUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LkFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUKLSAqLwotcHVibGljIGNsYXNzIENyb3NzVmFsVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZQotewotCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOwotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQyID0gbnVsbDsKLSAgICAKLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOwotICAgIAotICAgIHB1YmxpYyBDcm9zc1ZhbFRlc3RDYXNlKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG51bGw7Ci0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKENyb3NzVmFsVGVzdENhc2UuY2xhc3MpOwotICAgIH0gICAgCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIENyb3NzVmFsVGVzdEJlYW4gYmVhbiA9IG5ldyBDcm9zc1ZhbFRlc3RCZWFuKCk7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhudWxsLCAidmFsdWUiLCAiI3t0ZXN0QmVhbn0iKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKS5wdXQoInRlc3RCZWFuIixiZWFuKTsKLSAgICAgICAgCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOwotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7Ci0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsKLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsgICAgICAgIAotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOwotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50MSk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRJZCgiaW5wdXQxIik7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7Ci0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQyKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNDb3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOwotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxWYWxpZGF0aW9uKCk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOwotCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzRmFpbCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQ0Iik7Ci0gICAgICAgIAotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgCi0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsVmFsaWRhdGlvbigpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgyKTsKLQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0VMQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0VMQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMWY2NzguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9FTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QudXRpbC5NZXRob2RVdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRUxDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UgZXh0ZW5kcyBFTENyb3NzVmFsVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBFTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRUxDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0NCi0gICAgICAgIFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uKCk7DQotDQotICAgICAgICBjb25maWcuYWRkTWFwcGluZyhFcXVhbHMuY2xhc3MuZ2V0TmFtZSgpLCBNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsIGNvbmZpZyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHJldGVzdCB0aGlzIHRlc3QtY2FzZQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCByZXRlc3QgdGhpcyB0ZXN0LWNhc2UNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpOw0KLSAgICAgICAgYXNzZXJ0RmFsc2UoTWV0aG9kVXRpbHMuaXNNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIikpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCk7DQotICAgICAgICBhc3NlcnRUcnVlKE1ldGhvZFV0aWxzLmlzTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIpKTsNCi0gICAgICAgIC8vMXggZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkgYW5kIDF4IGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwNCi0gICAgICAgIGFzc2VydFRydWUoTWV0aG9kVXRpbHMuY2hlY2tNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIiwgMikpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvRUxDcm9zc1ZhbFRlc3RDYXNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2Q4OTUyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvRUxDcm9zc1ZhbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5EYXRlVGltZUNvbnZlcnRlcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LkFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRUxDcm9zc1ZhbFRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UNCi17DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLQ0KLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgRUxDcm9zc1ZhbFRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRUxDcm9zc1ZhbFRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgICAgICBjcmVhdGVSZXF1ZXN0U2NvcGVkQmVhbigiYmVhbjEiLCBnZXRFbnRpdHlJbnN0YW5jZSgpKTsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJiZWFuMiIsIGdldEVudGl0eUluc3RhbmNlKCkpOw0KLQ0KLQ0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7DQotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7DQotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7DQotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOw0KLQ0KLSAgICAgICAgLy9pbnB1dDENCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0SWQoImlucHV0MSIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldENvbnZlcnRlcihuZXcgRGF0ZVRpbWVDb252ZXJ0ZXIoKSk7DQotICAgICAgICAoKERhdGVUaW1lQ29udmVydGVyKWlucHV0Q29tcG9uZW50MS5nZXRDb252ZXJ0ZXIoKSkuc2V0UGF0dGVybigiZGQuTU0ueXl5eSIpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDEpOw0KLQ0KLSAgICAgICAgLy9pbnB1dDINCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0SWQoImlucHV0MiIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldENvbnZlcnRlcihuZXcgRGF0ZVRpbWVDb252ZXJ0ZXIoKSk7DQotICAgICAgICAoKERhdGVUaW1lQ29udmVydGVyKWlucHV0Q29tcG9uZW50Mi5nZXRDb252ZXJ0ZXIoKSkuc2V0UGF0dGVybigiZGQuTU0ueXl5eSIpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTENyb3NzQ29tcG9uZW50VmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZUVMQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTIuMTIuMjAwOCIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRUxDcm9zc0NvbXBvbmVudFZhbGlkYXRpb25Vc2VDYXNlKFN0cmluZyB2YWx1ZUJlYW4xUHJvcGVydHkxLCBTdHJpbmcgdmFsdWVCZWFuMVByb3BlcnR5MiwgU3RyaW5nIHZhbHVlQmVhbjJQcm9wZXJ0eTEsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3tiZWFuMS5kYXRlMX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje2JlYW4yLmRhdGUyfSIpOw0KLQ0KLSAgICAgICAgLy9zZXQgbW9kZWwgdmFsdWVzDQotICAgICAgICByZXNvbHZlQmVhbigiYmVhbjEiLCBnZXRFbnRpdHlJbnN0YW5jZSgpLmdldENsYXNzKCkpLnNldERhdGUyKChEYXRlKWlucHV0Q29tcG9uZW50MS5nZXRDb252ZXJ0ZXIoKS5nZXRBc09iamVjdChmYWNlc0NvbnRleHQsIGlucHV0Q29tcG9uZW50MSwgdmFsdWVCZWFuMVByb3BlcnR5MikpOw0KLSAgICAgICAgcmVzb2x2ZUJlYW4oImJlYW4yIiwgZ2V0RW50aXR5SW5zdGFuY2UoKS5nZXRDbGFzcygpKS5zZXREYXRlMSgoRGF0ZSlpbnB1dENvbXBvbmVudDIuZ2V0Q29udmVydGVyKCkuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dENvbXBvbmVudDIsIHZhbHVlQmVhbjJQcm9wZXJ0eTEpKTsNCi0NCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVCZWFuMVByb3BlcnR5MSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVCZWFuMlByb3BlcnR5Mik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZUVMTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxMi4xMi4yMDA4Iik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKFN0cmluZyB2YWx1ZUJlYW4xUHJvcGVydHkxLCBTdHJpbmcgdmFsdWVCZWFuMVByb3BlcnR5MiwgU3RyaW5nIHZhbHVlQmVhbjJQcm9wZXJ0eTEsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3tiZWFuMS5kYXRlMX0iKTsNCi0NCi0gICAgICAgIC8vc2V0IG1vZGVsIHZhbHVlcw0KLSAgICAgICAgcmVzb2x2ZUJlYW4oImJlYW4xIiwgZ2V0RW50aXR5SW5zdGFuY2UoKS5nZXRDbGFzcygpKS5zZXREYXRlMigoRGF0ZSlpbnB1dENvbXBvbmVudDEuZ2V0Q29udmVydGVyKCkuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dENvbXBvbmVudDEsIHZhbHVlQmVhbjFQcm9wZXJ0eTIpKTsNCi0gICAgICAgIHJlc29sdmVCZWFuKCJiZWFuMiIsIGdldEVudGl0eUluc3RhbmNlKCkuZ2V0Q2xhc3MoKSkuc2V0RGF0ZTEoKERhdGUpaW5wdXRDb21wb25lbnQyLmdldENvbnZlcnRlcigpLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgaW5wdXRDb21wb25lbnQyLCB2YWx1ZUJlYW4yUHJvcGVydHkxKSk7DQotICAgICAgICByZXNvbHZlQmVhbigiYmVhbjIiLCBnZXRFbnRpdHlJbnN0YW5jZSgpLmdldENsYXNzKCkpLnNldERhdGUyKChEYXRlKWlucHV0Q29tcG9uZW50Mi5nZXRDb252ZXJ0ZXIoKS5nZXRBc09iamVjdChmYWNlc0NvbnRleHQsIGlucHV0Q29tcG9uZW50MiwgdmFsdWVCZWFuMlByb3BlcnR5MikpOw0KLQ0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSh2YWx1ZUJlYW4xUHJvcGVydHkxKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEVMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4gZ2V0RW50aXR5SW5zdGFuY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEVMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4oKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvRUxDcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTVmNDRiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvRUxDcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIEVMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4NCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERhdGUgREVGQVVMVF9EQVRFID0gbmV3IERhdGUoKTsNCi0NCi0gICAgQEVxdWFscygiI3tiZWFuMi5kYXRlMn0iKQ0KLSAgICBwcml2YXRlIERhdGUgZGF0ZTEgPSBERUZBVUxUX0RBVEU7DQotDQotICAgIHByaXZhdGUgRGF0ZSBkYXRlMiA9IERFRkFVTFRfREFURTsNCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGF0ZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZTEoRGF0ZSBkYXRlMSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5kYXRlMSA9IGRhdGUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldERhdGUyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRhdGUyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERhdGUyKERhdGUgZGF0ZTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGF0ZTIgPSBkYXRlMjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTA2NWQ4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QudXRpbC5NZXRob2RVdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZSBleHRlbmRzIExvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShMb2NhbFByb3BlcnR5Q3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotDQotICAgICAgICBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbigpOw0KLQ0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoRXF1YWxzLmNsYXNzLmdldE5hbWUoKSwgTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHLCBjb25maWcpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgcmV0ZXN0IHRoaXMgdGVzdC1jYXNlDQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHJldGVzdCB0aGlzIHRlc3QtY2FzZQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpOw0KLSAgICAgICAgYXNzZXJ0RmFsc2UoTWV0aG9kVXRpbHMuaXNNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIikpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShNZXRob2RVdGlscy5pc01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiKSk7DQotICAgICAgICAvLzF4IGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5IGFuZCAxeCBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsDQotICAgICAgICBhc3NlcnRUcnVlKE1ldGhvZFV0aWxzLmNoZWNrTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIsIDIpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3RDYXNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZjEzYWIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZSBleHRlbmRzIEVMQ3Jvc3NWYWxUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBFTENyb3NzVmFsVGVzdERhdGVCZWFuIGdldEVudGl0eUluc3RhbmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4oKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFhODkwOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIExvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3REYXRlQmVhbiBleHRlbmRzIEVMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4NCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERhdGUgREVGQVVMVF9EQVRFID0gbmV3IERhdGUoKTsNCi0NCi0gICAgQEVxdWFscygiZGF0ZTIiKQ0KLSAgICBwcml2YXRlIERhdGUgZGF0ZTEgPSBERUZBVUxUX0RBVEU7DQotDQotICAgIHByaXZhdGUgRGF0ZSBkYXRlMiA9IERFRkFVTFRfREFURTsNCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGF0ZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZTEoRGF0ZSBkYXRlMSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5kYXRlMSA9IGRhdGUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldERhdGUyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRhdGUyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERhdGUyKERhdGUgZGF0ZTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGF0ZTIgPSBkYXRlMjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL01vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWY5MzM2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneS5FcXVhbHNTdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QudXRpbC5NZXRob2RVdGlsczsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEVxdWFsc1N0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIE1ldGhvZFV0aWxzLnNpZ25hbENsYXNzVXNlZChnZXRDbGFzcygpKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIE1ldGhvZFV0aWxzLnNpZ25hbE1ldGhvZENhbGxlZChnZXRDbGFzcygpLCAicmV2ZXJzZU1lc3NhZ2UiKTsNCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgTWV0aG9kVXRpbHMuc2lnbmFsTWV0aG9kQ2FsbGVkKGdldENsYXNzKCksICJyZXZlcnNlTWVzc2FnZSIpOw0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Nb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Nb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDA1NWNmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTW9ja01lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTW9ja01lc3NhZ2VSZXNvbHZlckZhY3RvcnkgZXh0ZW5kcyBEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeQ0KLXsNCi0gICAgcHVibGljIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXRSZWdpc3RlcmVkTmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TmFtZU1hcHBlckxpc3QoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL01vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Nb2NrTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE4MzZkMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL01vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTW9ja01ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5IGV4dGVuZHMgRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5DQotew0KLSAgICBwdWJsaWMgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IGdldFJlZ2lzdGVyZWROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzdXBlci5nZXROYW1lTWFwcGVyTGlzdCgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA3MWZjYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL01vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSBleHRlbmRzIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5DQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBjcmVhdGUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICAvL2ZvcmNlIGluaXQgc28gdGhhdCBldmVyeSB0ZXN0LWNhc2Ugc2V0dXAgbWV0aG9kIGNhbiBhZGQgYSBtb2NrIHZhbGlkYXRpb24gc3RyYXRlZ3kgdmlhIGV4dHZhbCBqYXZhLWFwaQ0KLSAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHRoaXMsUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKGdldENsYXNzKCksICJpbml0U3RhdGljTWFwcGluZ3MiKSk7DQotICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlKG1ldGFEYXRhS2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+IGdldFJlZ2lzdGVyZWROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzdXBlci5nZXROYW1lTWFwcGVyTGlzdCgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OTNiNGYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC51dGlsLk1ldGhvZFV0aWxzOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlIGV4dGVuZHMgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotDQotICAgICAgICBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbigpOw0KLQ0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoRXF1YWxzLmNsYXNzLmdldE5hbWUoKSwgTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHLCBjb25maWcpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCByZXRlc3QgdGhpcyB0ZXN0LWNhc2UNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgcmV0ZXN0IHRoaXMgdGVzdC1jYXNlDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKTsNCi0gICAgICAgIGFzc2VydEZhbHNlKE1ldGhvZFV0aWxzLmlzTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShNZXRob2RVdGlscy5pc01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiKSk7DQotICAgICAgICAvLzF4IGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5IGFuZCAxeCBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsDQotICAgICAgICBhc3NlcnRUcnVlKE1ldGhvZFV0aWxzLmNoZWNrTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIsIDIpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMTZkY2QuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5EYXRlVGltZUNvbnZlcnRlcjsNCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UNCi17DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLQ0KLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgY3JlYXRlUmVxdWVzdFNjb3BlZEJlYW4oImJlYW4xIiwgZ2V0RW50aXR5SW5zdGFuY2UoKSk7DQotDQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsNCi0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsNCi0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7DQotDQotICAgICAgICAvL2lucHV0MQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRJZCgiaW5wdXQxIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0Q29udmVydGVyKG5ldyBEYXRlVGltZUNvbnZlcnRlcigpKTsNCi0gICAgICAgICgoRGF0ZVRpbWVDb252ZXJ0ZXIpaW5wdXRDb21wb25lbnQxLmdldENvbnZlcnRlcigpKS5zZXRQYXR0ZXJuKCJkZC5NTS55eXl5Iik7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50MSk7DQotDQotICAgICAgICAvL2lucHV0Mg0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRJZCgiaW5wdXQyIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0Q29udmVydGVyKG5ldyBEYXRlVGltZUNvbnZlcnRlcigpKTsNCi0gICAgICAgICgoRGF0ZVRpbWVDb252ZXJ0ZXIpaW5wdXRDb21wb25lbnQyLmdldENvbnZlcnRlcigpKS5zZXRQYXR0ZXJuKCJkZC5NTS55eXl5Iik7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Mik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZWFyRG93bigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZVByb3BlcnR5Q2hhaW5Dcm9zc0NvbXBvbmVudFZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZVByb3BlcnR5Q2hhaW5Dcm9zc0NvbXBvbmVudFZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjEyLjEyLjIwMDgiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVByb3BlcnR5Q2hhaW5Dcm9zc0NvbXBvbmVudFZhbGlkYXRpb25Vc2VDYXNlKFN0cmluZyB2YWx1ZUJlYW4xUHJvcGVydHkxLCBTdHJpbmcgdmFsdWVCZWFuMlByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7YmVhbjEuZGF0ZTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3tiZWFuMS5zdWJCZWFuLmRhdGUyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSh2YWx1ZUJlYW4xUHJvcGVydHkxKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSh2YWx1ZUJlYW4yUHJvcGVydHkyKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlRUxNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlRUxNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxMi4xMi4yMDA4Iik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKFN0cmluZyB2YWx1ZUJlYW4xUHJvcGVydHkxLCBTdHJpbmcgdmFsdWVCZWFuMlByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7YmVhbjEuZGF0ZTF9Iik7DQotDQotICAgICAgICAvL3NldCBtb2RlbCB2YWx1ZXMNCi0gICAgICAgIHJlc29sdmVCZWFuKCJiZWFuMSIsIGdldEVudGl0eUluc3RhbmNlKCkuZ2V0Q2xhc3MoKSkuZ2V0U3ViQmVhbigpLnNldERhdGUyKChEYXRlKWlucHV0Q29tcG9uZW50Mi5nZXRDb252ZXJ0ZXIoKS5nZXRBc09iamVjdChmYWNlc0NvbnRleHQsIGlucHV0Q29tcG9uZW50MiwgdmFsdWVCZWFuMlByb3BlcnR5MSkpOw0KLQ0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSh2YWx1ZUJlYW4xUHJvcGVydHkxKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbiBnZXRFbnRpdHlJbnN0YW5jZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVCZWFuKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMjFmMjUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4NCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERhdGUgREVGQVVMVF9EQVRFID0gbmV3IERhdGUoKTsNCi0NCi0gICAgQEVxdWFscygic3ViQmVhbi5kYXRlMiIpDQotICAgIHByaXZhdGUgRGF0ZSBkYXRlMSA9IERFRkFVTFRfREFURTsNCi0NCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4gc3ViQmVhbiA9IG5ldyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4oKTsNCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGF0ZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZTEoRGF0ZSBkYXRlMSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5kYXRlMSA9IGRhdGUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4gZ2V0U3ViQmVhbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzdWJCZWFuOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFN1YkJlYW4oUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuIHN1YkJlYW4pDQotICAgIHsNCi0gICAgICAgIHRoaXMuc3ViQmVhbiA9IHN1YkJlYW47DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlODUzZmMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlIERFRkFVTFRfREFURSA9IG5ldyBEYXRlKCk7DQotDQotICAgIHByaXZhdGUgRGF0ZSBkYXRlMiA9IERFRkFVTFRfREFURTsNCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGF0ZTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZTIoRGF0ZSBkYXRlMikNCi0gICAgew0KLSAgICAgICAgdGhpcy5kYXRlMiA9IGRhdGUyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvblRlc3RDYXNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb25UZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDNmNWNkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvblRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LkFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1wdWJsaWMgY2xhc3MgVmFsdWVCaW5kaW5nRXhwcmVzc2lvblRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFZhbHVlQmluZGluZ0V4cHJlc3Npb25UZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhbmRhcmRTeW50YXgoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xLnByb3BlcnR5MX0iKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjEucHJvcGVydHkxfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSwgInByb3BlcnR5MSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydwcm9wZXJ0eTEnXX0iKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjFbJ3Byb3BlcnR5MSddfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSwgInByb3BlcnR5MSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydiZWFuMiddLnByb3BlcnR5MX0iKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjFbJ2JlYW4yJ10ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xWydiZWFuMiddfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLCAicHJvcGVydHkxIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YW5kYXJkU3ludGF4UmVwbGFjZVByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMS5wcm9wZXJ0eTF9Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgInByb3BlcnR5MiIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMS5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLCAicHJvcGVydHkyIik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjFbJ3Byb3BlcnR5MSddfSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sICJwcm9wZXJ0eTIiKTsNCi0NCi0gICAgICAgIC8vVE9ETyByZXN0b3JlIG9yaWdpbmFsIHN5bnRheA0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMS5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLCAicHJvcGVydHkyIik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjFbJ2JlYW4yJ10ucHJvcGVydHkxfSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sICJwcm9wZXJ0eTIiKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjFbJ2JlYW4yJ10ucHJvcGVydHkyfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xWydiZWFuMiddfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLCAicHJvcGVydHkyIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YW5kYXJkU3ludGF4QWRkUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xLmJlYW4yfSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24uYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgInByb3BlcnR5MSIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMS5iZWFuMi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjEuYmVhbjJ9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLCAicHJvcGVydHkxIik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjFbJ2JlYW4yJ119Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5hZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAicHJvcGVydHkxIik7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xWydiZWFuMiddLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMVsnYmVhbjInXX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCksICJwcm9wZXJ0eTEiKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsnYmVhbjInXS5iZWFuM30iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sICJwcm9wZXJ0eTEiKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjFbJ2JlYW4yJ10uYmVhbjMucHJvcGVydHkxfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xWydiZWFuMiddLmJlYW4zfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24NCi0gICAgICAgICAgICAgICAgLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xWydiZWFuMiddfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSwgInByb3BlcnR5MSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWNlbGV0c0N1c3RvbUNvbXBvbmVudFN5bnRheCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7ZW50aXR5W2ZpZWxkTmFtZV19Iik7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2VudGl0eVtmaWVsZE5hbWVdfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2VudGl0eX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCksICJmaWVsZE5hbWUiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFjZWxldHNDdXN0b21Db21wb25lbnRTeW50YXhSZXBsYWNlUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2VudGl0eVtmaWVsZE5hbWVdfSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sICJuZXdGaWVsZE5hbWUiKTsNCi0NCi0gICAgICAgIC8vVE9ETyByZXN0b3JlIG9yaWdpbmFsIHN5bnRheA0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tlbnRpdHkubmV3RmllbGROYW1lfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2VudGl0eX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCksICJuZXdGaWVsZE5hbWUiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxleE1hcFN5bnRheCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjFbYmVhbjJbYmVhbjNbJ2tleTEnXV1dLnByb3BlcnR5MX0iKTsNCi0NCi0gICAgICAgIC8vVE9ETw0KLSAgICAgICAgLy9hc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xW2JlYW4yW2JlYW4zWydrZXkxJ11dXS5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLCAicHJvcGVydHkxIik7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9tb2NrL0V4dFZhbE1vY2tBcHBsaWNhdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9tb2NrL0V4dFZhbE1vY2tBcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWNiY2QwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvbW9jay9FeHRWYWxNb2NrQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0Lm1vY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb247Ci0KLWltcG9ydCBqYXZheC5lbC5FTENvbnRleHRMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5lbC5FTFJlc29sdmVyOwotaW1wb3J0IGphdmF4LmVsLkV4cHJlc3Npb25GYWN0b3J5OwotaW1wb3J0IGphdmF4LmVsLkVMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICovCi1wdWJsaWMgY2xhc3MgRXh0VmFsTW9ja0FwcGxpY2F0aW9uIGV4dGVuZHMgTW9ja0FwcGxpY2F0aW9uCi17Ci0gICAgcHJpdmF0ZSBBcHBsaWNhdGlvbiB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbE1vY2tBcHBsaWNhdGlvbigpCi0gICAgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBFeHRWYWxNb2NrQXBwbGljYXRpb24oQXBwbGljYXRpb24gYXBwbGljYXRpb24pCi0gICAgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLndyYXBwZWQgPSBhcHBsaWNhdGlvbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRUxDb250ZXh0TGlzdGVuZXJbXSBnZXRFTENvbnRleHRMaXN0ZW5lcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFTENvbnRleHRMaXN0ZW5lclswXTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRUxSZXNvbHZlciBnZXRFTFJlc29sdmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQuZ2V0RUxSZXNvbHZlcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFeHByZXNzaW9uRmFjdG9yeSBnZXRFeHByZXNzaW9uRmFjdG9yeSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEV4dFZhbE1vY2tFeHByZXNzaW9uRmFjdG9yeSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGVFeHByZXNzaW9uR2V0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBleHByZXNzaW9uLCBDbGFzcyBhQ2xhc3MpIHRocm93cyBFTEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZXZhbHVhdGVFeHByZXNzaW9uR2V0KGZhY2VzQ29udGV4dCwgZXhwcmVzc2lvbiwgYUNsYXNzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9tb2NrL0V4dFZhbE1vY2tBcHBsaWNhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM4YzU3Ni4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QubW9jazsKLQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbkZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqLwotcHVibGljIGNsYXNzIEV4dFZhbE1vY2tBcHBsaWNhdGlvbkZhY3RvcnkgZXh0ZW5kcyBNb2NrQXBwbGljYXRpb25GYWN0b3J5Ci17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFwcGxpY2F0aW9uIGdldEFwcGxpY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRXh0VmFsTW9ja0FwcGxpY2F0aW9uKHN1cGVyLmdldEFwcGxpY2F0aW9uKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvbW9jay9FeHRWYWxNb2NrRXhwcmVzc2lvbkZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvbW9jay9FeHRWYWxNb2NrRXhwcmVzc2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5ZTIzMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L21vY2svRXh0VmFsTW9ja0V4cHJlc3Npb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5tb2NrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0LmVsLk1vY2tFeHByZXNzaW9uRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmVsLkVMQ29udGV4dDsKLWltcG9ydCBqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRWYWxNb2NrRXhwcmVzc2lvbkZhY3RvcnkgZXh0ZW5kcyBNb2NrRXhwcmVzc2lvbkZhY3RvcnkKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVmFsdWVFeHByZXNzaW9uIGNyZWF0ZVZhbHVlRXhwcmVzc2lvbihFTENvbnRleHQgY29udGV4dCwgU3RyaW5nIGV4cHJlc3Npb24sIENsYXNzIGV4cGVjdGVkVHlwZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRXh0VmFsTW9ja1ZhbHVlRXhwcmVzc2lvbihleHByZXNzaW9uLCBleHBlY3RlZFR5cGUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvbW9jay9FeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfc2V2ZXJpdHlfdGVzdC92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L21vY2svRXh0VmFsTW9ja1ZhbHVlRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODA3YTEyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvbW9jay9FeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QubW9jazsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkV4dFZhbEVMUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0LmVsLk1vY2tWYWx1ZUV4cHJlc3Npb247Ci0KLWltcG9ydCBqYXZheC5lbC5FTENvbnRleHQ7Ci1pbXBvcnQgamF2YXguZWwuRUxSZXNvbHZlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqLwotLy9UT0RPIGltcHJvdmUKLXB1YmxpYyBjbGFzcyBFeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uIGV4dGVuZHMgTW9ja1ZhbHVlRXhwcmVzc2lvbgotewotICAgIHByaXZhdGUgU3RyaW5nW10gZWxlbWVudHMgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIGV4cHJlc3Npb24gPSBudWxsOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04NTg4NzE2NTQ1NjE5NDIxMDQxTDsKLQotICAgIHB1YmxpYyBFeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uKFN0cmluZyBleHByZXNzaW9uLCBDbGFzcyBleHBlY3RlZFR5cGUpCi0gICAgewotICAgICAgICBzdXBlcihleHByZXNzaW9uLCBleHBlY3RlZFR5cGUpOwotCi0gICAgICAgIGlmIChleHByZXNzaW9uID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiRXhwcmVzc2lvbiBzdHJpbmcgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247Ci0gICAgICAgIHBhcnNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShFTENvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIEVMUmVzb2x2ZXIgcmVzb2x2ZXIgPSBjb250ZXh0LmdldEVMUmVzb2x2ZXIoKTsKLQotICAgICAgICBpZiAocmVzb2x2ZXIgaW5zdGFuY2VvZiBFeHRWYWxFTFJlc29sdmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QmFzZShjb250ZXh0LCByZXNvbHZlcik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VmFsdWUoY29udGV4dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoRUxDb250ZXh0IGNvbnRleHQsIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmIChjb250ZXh0LmdldEVMUmVzb2x2ZXIoKSBpbnN0YW5jZW9mIEV4dFZhbEVMUmVzb2x2ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRleHQuZ2V0RUxSZXNvbHZlcigpLnNldFZhbHVlKGNvbnRleHQsIGdldFZhbHVlKGNvbnRleHQpLCBlbGVtZW50c1tlbGVtZW50cy5sZW5ndGggLSAxXSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgYmFzZSA9IGdldEJhc2UoY29udGV4dCwgY29udGV4dC5nZXRFTFJlc29sdmVyKCkpOwotICAgICAgICAgICAgU3RyaW5nIHNldHRlciA9ICJzZXQiICsgY3JlYXRlUHJvcGVydHlTdHJpbmcoKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTWV0aG9kIHNldHRlck1ldGhvZCA9IGJhc2UuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZChzZXR0ZXIsIHZhbHVlICE9IG51bGwgPyB2YWx1ZS5nZXRDbGFzcygpIDogT2JqZWN0LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBzZXR0ZXJNZXRob2QuaW52b2tlKGJhc2UsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZShFTENvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IGJhc2UgPSBnZXRCYXNlKGNvbnRleHQsIGNvbnRleHQuZ2V0RUxSZXNvbHZlcigpKTsKLQotICAgICAgICBpZiAoYmFzZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBnZXR0ZXIgPSAiZ2V0IiArIGNyZWF0ZVByb3BlcnR5U3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1ldGhvZCBnZXR0ZXJNZXRob2QgPSBiYXNlLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2QoZ2V0dGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0dGVyTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGFyc2UoKQotICAgIHsKLQotICAgICAgICBpZiAoaXNMaXRlcmFsVGV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbGVtZW50cyA9IG5ldyBTdHJpbmdbMF07Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXhwcmVzc2lvbi5zdGFydHNXaXRoKCIkeyIpIHx8IGV4cHJlc3Npb24uc3RhcnRzV2l0aCgiI3siKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24uZW5kc1dpdGgoIn0iKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBleHByID0gbmV3IFN0cmluZ0J1ZmZlcihleHByZXNzaW9uLnN1YnN0cmluZygyLCBleHByZXNzaW9uLmxlbmd0aCgpIC0gMSkucmVwbGFjZUFsbCgiICIsICIiKSk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Jsb2NrT24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gZXhwci5sZW5ndGgoKSAtIDE7IGkgPiAtMTsgaS0tKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4cHIuY2hhckF0KGkpID09ICcgJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhwci5kZWxldGVDaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhwci5jaGFyQXQoaSkgPT0gJ10nKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHByLmRlbGV0ZUNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHByLmNoYXJBdChpKSA9PSAnWycpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZGVsZXRlQ2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4cHIuY2hhckF0KGkpID09ICdcJycpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNCbG9ja09uKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZGVsZXRlQ2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZCgwLCBleHByLnN1YnN0cmluZyhpICsgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZGVsZXRlKGksIGV4cHIubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaXNCbG9ja09uID0gIWlzQmxvY2tPbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHByLmNoYXJBdChpKSA9PSAnLicgJiYgIWlzQmxvY2tPbikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMuYWRkKDAsIGV4cHIuc3Vic3RyaW5nKGkgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHByLmRlbGV0ZShpLCBleHByLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZXhwci5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuYW1lcy5hZGQoMCwgZXhwci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlbGVtZW50cyA9IChTdHJpbmdbXSkgbmFtZXMudG9BcnJheShuZXcgU3RyaW5nW25hbWVzLnNpemUoKV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXhwcmVzc2lvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV4cHJlc3Npb24pOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJhc2UoRUxDb250ZXh0IGNvbnRleHQsIEVMUmVzb2x2ZXIgcmVzb2x2ZXIpCi0gICAgewotICAgICAgICBPYmplY3QgYmFzZSA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoIC0gMTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBiYXNlID0gcmVzb2x2ZXIuZ2V0VmFsdWUoY29udGV4dCwgYmFzZSwgZWxlbWVudHNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiYXNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVByb3BlcnR5U3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdOwotICAgICAgICByZXR1cm4gcHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSwgcHJvcGVydHkubGVuZ3RoKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdXRpbC9NZXRob2RVdGlscy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC91dGlsL01ldGhvZFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNjlmYzcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC91dGlsL01ldGhvZFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC51dGlsOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi0vL1RPRE8NCi1wdWJsaWMgY2xhc3MgTWV0aG9kVXRpbHMNCi17DQotICAgIHByaXZhdGUgTWV0aG9kVXRpbHMoKQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrTWV0aG9kQ2FsbGVkKENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIGludCBjYWxsQ291bnQpDQotICAgIHsNCi0gICAgICAgIGNoZWNrUmVxdWlyZWRDbGFzcyh1c2VkQ2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGNhbGxDb3VudCA9PSBnZXRNZXRob2RDYWxsQ291bnQodXNlZENsYXNzLCBtZXRob2ROYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZXRob2RDYWxsZWQoQ2xhc3MgdXNlZENsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkNCi0gICAgew0KLSAgICAgICAgY2hlY2tSZXF1aXJlZENsYXNzKHVzZWRDbGFzcyk7DQotDQotICAgICAgICByZXR1cm4gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKQ0KLSAgICAgICAgICAgICAgICAuY29udGFpbnNLZXkodXNlZENsYXNzLmdldE5hbWUoKSArICIjIiArIG1ldGhvZE5hbWUpOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaWduYWxNZXRob2RDYWxsZWQoQ2xhc3MgdXNlZENsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkNCi0gICAgew0KLSAgICAgICAgTWFwIHJlcXVlc3RNYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpOw0KLQ0KLSAgICAgICAgaW50IG1ldGhvZENhbGxDb3VudCA9IDA7DQotICAgICAgICBTdHJpbmcga2V5ID0gdXNlZENsYXNzLmdldE5hbWUoKSArICIjIiArIG1ldGhvZE5hbWU7DQotDQotICAgICAgICBpZihyZXF1ZXN0TWFwLmNvbnRhaW5zS2V5KGtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0aG9kQ2FsbENvdW50ID0gKEludGVnZXIpcmVxdWVzdE1hcC5nZXQoa2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJlcXVlc3RNYXAucHV0KGtleSwgKyttZXRob2RDYWxsQ291bnQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRNZXRob2RDYWxsQ291bnQoQ2xhc3MgdXNlZENsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkNCi0gICAgew0KLSAgICAgICAgTWFwIHJlcXVlc3RNYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGtleSA9IHVzZWRDbGFzcy5nZXROYW1lKCkgKyAiIyIgKyBtZXRob2ROYW1lOw0KLQ0KLSAgICAgICAgaWYocmVxdWVzdE1hcC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoSW50ZWdlcilyZXF1ZXN0TWFwLmdldChrZXkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNpZ25hbENsYXNzVXNlZChDbGFzcyBtb2NrQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkNCi0gICAgICAgICAgICAgICAgLnB1dChtb2NrQ2xhc3MuZ2V0TmFtZSgpICsgIjp1c2VkIiwgdHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2xhc3NVc2VkKENsYXNzIG1vY2tDbGFzcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkNCi0gICAgICAgICAgICAgICAgLmNvbnRhaW5zS2V5KG1vY2tDbGFzcy5nZXROYW1lKCkgKyAiOnVzZWQiKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrUmVxdWlyZWRDbGFzcyhDbGFzcyB1c2VkQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNDbGFzc1VzZWQodXNlZENsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHVzZWRDbGFzcy5nZXROYW1lKCkgKyAiIG5vdCB1c2VkIik7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC91dGlsL1Rlc3RVdGlscy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3NldmVyaXR5X3Rlc3QvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC91dGlsL1Rlc3RVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWVkMTYxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua19zZXZlcml0eV90ZXN0L3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdXRpbC9UZXN0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY2VzRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVGVzdFV0aWxzCi17Ci0gICAgLyoqIERlZmF1bHQgTG9nZ2VyICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFRlc3RVdGlscy5jbGFzcyk7Ci0KLSAgICAvKiogdXRpbGl0eSBjbGFzcywgZG8gbm90IGluc3RhbnRpYXRlICovCi0gICAgcHJpdmF0ZSBUZXN0VXRpbHMoKQotICAgIHsKLSAgICAgICAgLy8gdXRpbGl0eSBjbGFzcywgZGlzYWJsZSBpbnN0YW50aWF0aW9uCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGREZWZhdWx0VmFsaWRhdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQotICAgIHsKLSAgICAgICAgYWRkVmFsaWRhdG9yKGZhY2VzQ29udGV4dCwiamF2YXguZmFjZXMuRG91YmxlUmFuZ2UiLCAiamF2YXguZmFjZXMudmFsaWRhdG9yLkRvdWJsZVJhbmdlVmFsaWRhdG9yIik7Ci0gICAgICAgIGFkZFZhbGlkYXRvcihmYWNlc0NvbnRleHQsImphdmF4LmZhY2VzLkxlbmd0aCIsICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yIik7Ci0gICAgICAgIGFkZFZhbGlkYXRvcihmYWNlc0NvbnRleHQsImphdmF4LmZhY2VzLkxvbmdSYW5nZSIsICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTG9uZ1JhbmdlVmFsaWRhdG9yIik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRWYWxpZGF0b3IoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0b3JJZCwgU3RyaW5nIHZhbGlkYXRvckNsYXNzKQotICAgIHsKLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuYWRkVmFsaWRhdG9yKHZhbGlkYXRvcklkLCB2YWxpZGF0b3JDbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGFsbCBvZiBKU0YgMS4yIGRlZmF1bHQgcmVuZGVyZXJzLiAgQ3VycmVudGx5IHRoaXMgaXMgbm90IHRpZWQgdG8gCi0gICAgICogZmFjZXMtY29uZmlnLnhtbCwgc28gYWxsIGNoYW5nZSB0byB0aGUgZmlsZSBNVVNUIGFsc28gYmUgbWFkZSBoZXJlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQKLSAgICAgKiBAdG9kbyBEbyBub3QgYWRkIHJlbmRlcmVyIGlmIHJlbmRlcmVyIGlzIGFscmVhZHkgYWRkZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZERlZmF1bHRSZW5kZXJlcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vIFN0YW5kYXJkIEhUTUwgUmVuZGVyZXJzCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkNvbW1hbmQiLCAiamF2YXguZmFjZXMuQnV0dG9uIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxCdXR0b25SZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdEJvb2xlYW4iLAotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5DaGVja2JveCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sQ2hlY2tib3hSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE1hbnkiLAotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5DaGVja2JveCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sQ2hlY2tib3hSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkZvcm0iLCAiamF2YXguZmFjZXMuRm9ybSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sRm9ybVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuUGFuZWwiLCAiamF2YXguZmFjZXMuR3JpZCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sR3JpZFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuUGFuZWwiLCAiamF2YXguZmFjZXMuR3JvdXAiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEdyb3VwUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5IaWRkZW4iLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEhpZGRlblJlbmRlcmVyIik7Ci0gICAgICAgIAotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5HcmFwaGljIiwgImphdmF4LmZhY2VzLkltYWdlIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxJbWFnZVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuT3V0cHV0IiwgImphdmF4LmZhY2VzLkxhYmVsIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMYWJlbFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuT3V0cHV0IiwgImphdmF4LmZhY2VzLkxpbmsiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbExpbmtSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkNvbW1hbmQiLCAiamF2YXguZmFjZXMuTGluayIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlua1JlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0T25lIiwKLSAgICAgICAgICAgICAgICAiamF2YXguZmFjZXMuTGlzdGJveCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlzdGJveFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0TWFueSIsCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkxpc3Rib3giLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbExpc3Rib3hSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsICJqYXZheC5mYWNlcy5NZW51IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxNZW51UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RNYW55IiwgImphdmF4LmZhY2VzLk1lbnUiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lbnVSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk1lc3NhZ2UiLCAiamF2YXguZmFjZXMuTWVzc2FnZSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTWVzc2FnZVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuT3V0cHV0IiwgImphdmF4LmZhY2VzLkZvcm1hdCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sRm9ybWF0UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5NZXNzYWdlcyIsCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLk1lc3NhZ2VzIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxNZXNzYWdlc1JlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0T25lIiwgImphdmF4LmZhY2VzLlJhZGlvIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxSYWRpb1JlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuSW5wdXQiLCAiamF2YXguZmFjZXMuU2VjcmV0IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxTZWNyZXRSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkRhdGEiLCAiamF2YXguZmFjZXMuVGFibGUiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFRhYmxlUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5UZXh0YXJlYSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGV4dGFyZWFSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLklucHV0IiwgImphdmF4LmZhY2VzLlRleHQiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFRleHRSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5UZXh0IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxUZXh0UmVuZGVyZXIiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSByZW5kZXJlciB0byB0aGUgRmFjZXNDb250ZXh0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgRmFjZXMgQ29udGV4dAotICAgICAqIEBwYXJhbSBmYW1pbHkgQ29tcG9uZW5ldCBGYW1pbHkKLSAgICAgKiBAcGFyYW0gcmVuZGVyZXJUeXBlIENvbXBvbmVudCBUeXBlCi0gICAgICogQHBhcmFtIHJlbmRlckNsYXNzTmFtZSBDbGFzcyBOYW1lIG9mIFJlbmRlcmVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFJlbmRlcmVyKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBmYW1pbHksCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGVyZXJUeXBlLCBTdHJpbmcgcmVuZGVyQ2xhc3NOYW1lKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSAoamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyKSBuZXdJbnN0YW5jZShyZW5kZXJDbGFzc05hbWUpOwotICAgICAgICBSZW5kZXJLaXQga2l0ID0gZmFjZXNDb250ZXh0LmdldFJlbmRlcktpdCgpOwotICAgICAgICBraXQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIHJlbmRlcmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmllcyBhIENsYXNzLmxvYWRDbGFzcyB3aXRoIHRoZSBjb250ZXh0IGNsYXNzIGxvYWRlciBvZiB0aGUgY3VycmVudCB0aHJlYWQgZmlyc3QgYW5kCi0gICAgICogYXV0b21hdGljYWxseSBmYWxscyBiYWNrIHRvIHRoZSBDbGFzc1V0aWxzIGNsYXNzIGxvYWRlciAoaS5lLiB0aGUgbG9hZGVyIG9mIHRoZQotICAgICAqIG15ZmFjZXMuamFyIGxpYikgaWYgbmVjZXNzYXJ5LgotICAgICAqIAotICAgICAqIE5vdGU6IFRoaXMgd2FzIGNvcGllZCBmcm9tIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWQudXRpbC5DbGFzc1V0aWxzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHlwZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIG5vbi1wcmltaXRpdmUgbm9uLWFycmF5IGNsYXNzCi0gICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBDbGFzcwotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdHlwZSBpcyBudWxsCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgY2xhc3NGb3JOYW1lKFN0cmluZyB0eXBlKQotICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInR5cGUiKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRyeSBXZWJBcHAgQ2xhc3NMb2FkZXIgZmlyc3QKLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKHR5cGUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXAKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWdub3JlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBmYWxsYmFjazogVHJ5IENsYXNzTG9hZGVyIGZvciBDbGFzc1V0aWxzIChpLmUuIHRoZSBteWZhY2VzLmphciBsaWIpCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZSh0eXBlLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwCi0gICAgICAgICAgICAgICAgICAgIFRlc3RVdGlscy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhbWUgYXMge0BsaW5rICNjbGFzc0Zvck5hbWUoU3RyaW5nKX0sIGJ1dCB0aHJvd3MgYSBSdW50aW1lRXhjZXB0aW9uCi0gICAgICogKEZhY2VzRXhjZXB0aW9uKSBpbnN0ZWFkIG9mIGEgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIE5vdGU6IFRoaXMgd2FzIGNvcGllZCBmcm9tIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWQudXRpbC5DbGFzc1V0aWxzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIENsYXNzCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0eXBlIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIEZhY2VzRXhjZXB0aW9uIGlmIGNsYXNzIG5vdCBmb3VuZAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIHNpbXBsZUNsYXNzRm9yTmFtZShTdHJpbmcgdHlwZSkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY2xhc3NGb3JOYW1lKHR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ2xhc3MgIiArIHR5cGUgKyAiIG5vdCBmb3VuZCIsIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyB3aXRoIHRoZSB0eXBlIG9mIDxjb2RlPnR5cGU8L2NvZGU+LgotICAgICAqIAotICAgICAqIE5vdGU6IFRoaXMgd2FzIGNvcGllZCBmcm9tIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWQudXRpbC5DbGFzc1V0aWxzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHlwZSBUeXBlIG9mIG5ldyBjbGFzcy4KLSAgICAgKiBAcmV0dXJuIEluc3RhbmNlIG9mIHRoZSBjbGFzcyA8Y29kZT50eXBlPC9jb2RlPgotICAgICAqIEB0aHJvd3MgRmFjZXNFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIHR5cGUpIHRocm93cyBGYWNlc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2Uoc2ltcGxlQ2xhc3NGb3JOYW1lKHR5cGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIDxjb2RlPmNsYXp6PC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBOb3RlOiBUaGlzIHdhcyBjb3BpZWQgZnJvbSBvcmcuYXBhY2hlLm15ZmFjZXMuc2hhcmVkLnV0aWwuQ2xhc3NVdGlscwotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXp6IENsYXNzIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZi4KLSAgICAgKiBAcmV0dXJuIEluc3RhbmNlIG9mIHRoZSBjbGFzcyA8Y29kZT5jbGF6ejwvY29kZT4KLSAgICAgKiBAdGhyb3dzIEZhY2VzRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKENsYXNzIGNsYXp6KSB0aHJvd3MgRmFjZXNFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY2xhenoubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nLmVycm9yKCJDbGFzcyA6ICIgKyBjbGF6ei5nZXROYW1lKCkgKyAiIG5vdCBmb3VuZC4iLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBGYWNlc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW5kZXJlcmVkIGEgY29tcG9uZW50LCBpbmNsdWRpbmcgaXQncyBjaGlsZHJlbiwgdGhlbiBjb21wbGV0ZSB0aGUgcmVwb25zZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGV4dCBGYWNlcyBDb250ZXh0Ci0gICAgICogQHBhcmFtIGNvbXBvbmVudCBDb21wb25lbnQgdG8gYmUgcmVuZGVyZWQuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gd2hpbGUgcmVuZGVyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW5kZXJDb21wb25lbnQoRmFjZXNDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICBVSUNvbXBvbmVudCBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSBjb250ZXh0LmdldFJlbmRlcktpdCgpLmdldFJlbmRlcmVyKAotICAgICAgICAgICAgICAgIGNvbXBvbmVudC5nZXRGYW1pbHkoKSwgY29tcG9uZW50LmdldFJlbmRlcmVyVHlwZSgpKTsKLSAgICAgICAgcmVuZGVyZXIuZW5jb2RlQmVnaW4oY29udGV4dCwgY29tcG9uZW50KTsKLSAgICAgICAgcmVuZGVyZXIuZW5jb2RlQ2hpbGRyZW4oY29udGV4dCwgY29tcG9uZW50KTsKLSAgICAgICAgcmVuZGVyZXIuZW5jb2RlRW5kKGNvbnRleHQsIGNvbXBvbmVudCk7Ci0gICAgICAgIGNvbnRleHQucmVzcG9uc2VDb21wbGV0ZSgpOwotICAgICAgICBjb250ZXh0LnJlbmRlclJlc3BvbnNlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2Fzc2VtYmx5L3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvYXNzZW1ibHkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2ZjMxZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvYXNzZW1ibHkvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1hc3NlbWJseTEyPC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQXNzZW1ibHk8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPk15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQXNzZW1ibHkgaXMgdXNlZCB0byBnZW5lcmF0ZSAKLSAgICAuemlwIGFuZCAudGFyLmd6IGRpc3RyaWJ1dGlvbnMgPC9kZXNjcmlwdGlvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2Fzc2VtYmx5PC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvYXNzZW1ibHk8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2Fzc2VtYmx5PC91cmw+Ci0gICAgPC9zY20+Ci0gICAgCi0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZGVwZW5kZW5jeS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1qYXZhZG9jPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y29yZS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+amF2YWRvYzwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7YmVhbi12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+amF2YWRvYzwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vamF2YWRvYzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LXNvdXJjZTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZW5lcmljLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2JlYW4tdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3NyYzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tIEVYRUNVVEUgbXZuIHBhY2thZ2UgdG8gZ2VuZXJhdGUgYXNzZW1ibHkgZmlsZXMgLS0+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfc3JjPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsMTItJHt2ZXJzaW9ufS1zcmM8L2ZpbmFsTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfYmluPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+JHtiYXNlZGlyfS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwxMi0ke3ZlcnNpb259LWJpbjwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L291dDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmF0dGFjaGVkPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y29yZS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2JlYW4tdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtnZW5lcmljLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDwhLS0gU2luY2UgZXh0dmFsIGNvdWxkIGJlIGFzeW5jIHJlbGVhc2VkLCBhbiBnZW5lcmF0ZWQgYXNzZW1ibHkgY291bGQgY29udGFpbiBkaWZmZXJlbnQKLSAgICAgICAgIGFydGlmYWN0IHZlcnNpb25zIC0tPgotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8Y29yZS52ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC9jb3JlLnZlcnNpb24+Ci0gICAgICAgIDx0cmluaWRhZC1zdXBwb3J0LnZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3RyaW5pZGFkLXN1cHBvcnQudmVyc2lvbj4KLSAgICAgICAgPGdlbmVyaWMtc3VwcG9ydC52ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC9nZW5lcmljLXN1cHBvcnQudmVyc2lvbj4KLSAgICAgICAgPHByb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvcHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9uPgotICAgICAgICA8YmVhbi12YWxpZGF0aW9uLnZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L2JlYW4tdmFsaWRhdGlvbi52ZXJzaW9uPgotICAgIDwvcHJvcGVydGllcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2Nzk1Yi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08YXNzZW1ibHk+Ci0gIDxpZD5jb3JlYmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgCTxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgCTxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPlJFQURNRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5OT1RJQ0UqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5SRUxFQVNFKjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvamF2YWRvYzwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5qYXZhZG9jPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTE4NmM2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3Jlc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPmNvcmVzcmM8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4gIAotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgCTxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgCTxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPlJFQURNRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5OT1RJQ0UqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5SRUxFQVNFKjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PiAgIAotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvc3JjPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PnNyYzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLmphcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KLSAKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDViM2E1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5YmRiMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzk5MWM1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+Y29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNnbGliPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNnbGliPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMV8zPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxyZXNvdXJjZXM+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgIDwvcmVzb3VyY2VzPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODQ2M2U2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj4NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5zdGFydHVwLkdlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXINCi0gICAgICAgIDwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYmVkN2IuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyS2l0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5yZW5kZXJraXQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotDQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RJbnRlcmNlcHRvcjsNCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5LkVuaGFuY2VyOw0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kUHJveHk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsR2VuZXJpY1JlbmRlcktpdCBleHRlbmRzIEV4dFZhbFJlbmRlcktpdCBpbXBsZW1lbnRzIE1ldGhvZEludGVyY2VwdG9yDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFJlbmRlcktpdCBuZXdJbnN0YW5jZShSZW5kZXJLaXQgcmVuZGVyS2l0KQ0KLSAgICB7DQotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSByZW5kZXJLaXQuZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIC8vaXQncyBub3QgcG9zc2libGUgdG8gd3JhcCB0aGUgY29udmVydGVyIGFnYWluIC0gb2NjdXJzIGUuZy4gdW5kZXIgc29sYXJpcyArIGJlYSB3ZWJsb2dpYw0KLSAgICAgICAgaWYgKFByb3h5VXRpbHMuaXNQcm94aWVkQ2xhc3MoY3VycmVudENsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRW5oYW5jZXIgZW5oYW5jZXIgPSBuZXcgRW5oYW5jZXIoKTsNCi0gICAgICAgIGVuaGFuY2VyLnNldFN1cGVyY2xhc3MocmVuZGVyS2l0LmdldENsYXNzKCkpOw0KLSAgICAgICAgZW5oYW5jZXIuc2V0Q2FsbGJhY2sobmV3IEV4dFZhbEdlbmVyaWNSZW5kZXJLaXQocmVuZGVyS2l0KSk7DQotICAgICAgICBlbmhhbmNlci5zZXRDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsNCi0NCi0gICAgICAgIHJldHVybiAoUmVuZGVyS2l0KSBlbmhhbmNlci5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGludGVyY2VwdChPYmplY3Qgb2JqLCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzLCBNZXRob2RQcm94eSBwcm94eSkgdGhyb3dzIFRocm93YWJsZQ0KLSAgICB7DQotICAgICAgICBpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0UmVuZGVyZXIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZXIoKFN0cmluZylhcmdzWzBdLCAoU3RyaW5nKWFyZ3NbMV0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiYWRkUmVuZGVyZXIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRSZW5kZXJlcigoU3RyaW5nKWFyZ3NbMF0sIChTdHJpbmcpYXJnc1sxXSwgKFJlbmRlcmVyKWFyZ3NbMl0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBwcm94eS5pbnZva2VTdXBlcihvYmosIGFyZ3MpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEV4dFZhbEdlbmVyaWNSZW5kZXJLaXQoUmVuZGVyS2l0IHdyYXBwZWQpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKHdyYXBwZWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgY3JlYXRlV3JhcHBlcihSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIubmV3SW5zdGFuY2UocmVuZGVyZXIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNjU1NzUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kSW50ZXJjZXB0b3I7Ci1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5LkVuaGFuY2VyOwotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RQcm94eTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGZpbmFsIGNsYXNzIEV4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIgZXh0ZW5kcyBFeHRWYWxSZW5kZXJlcldyYXBwZXIgaW1wbGVtZW50cyBNZXRob2RJbnRlcmNlcHRvcgotewotICAgIHB1YmxpYyBzdGF0aWMgUmVuZGVyZXIgbmV3SW5zdGFuY2UoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSByZW5kZXJlci5nZXRDbGFzcygpOwotCi0gICAgICAgIC8vdG8gYXZvaWQgcmUtd3JhcHBpbmcgLSBvY2N1cnMgZS5nLiB1bmRlciBzb2xhcmlzICsgYmVhIHdlYmxvZ2ljCi0gICAgICAgIGlmIChQcm94eVV0aWxzLmlzUHJveGllZENsYXNzKGN1cnJlbnRDbGFzcykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJlcjsKLSAgICAgICAgfQotCi0gICAgICAgIEVuaGFuY2VyIGVuaGFuY2VyID0gbmV3IEVuaGFuY2VyKCk7Ci0gICAgICAgIGVuaGFuY2VyLnNldFN1cGVyY2xhc3MocmVuZGVyZXIuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIGVuaGFuY2VyLnNldENhbGxiYWNrKG5ldyBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyKHJlbmRlcmVyKSk7Ci0gICAgICAgIGVuaGFuY2VyLnNldENsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotCi0gICAgICAgIHJldHVybiAoUmVuZGVyZXIpIGVuaGFuY2VyLmNyZWF0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgaW50ZXJjZXB0KE9iamVjdCBvYmosIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MsIE1ldGhvZFByb3h5IHByb3h5KSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldENvbnZlcnRlZFZhbHVlIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29udmVydGVkVmFsdWUoKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSwgYXJnc1syXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImRlY29kZSIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZGVjb2RlKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJlbmNvZGVCZWdpbiIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlQmVnaW4oKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImVuY29kZUNoaWxkcmVuIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGVDaGlsZHJlbigoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZW5jb2RlRW5kIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGVFbmQoKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImNvbnZlcnRDbGllbnRJZCIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0Q2xpZW50SWQoKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoU3RyaW5nKWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJnZXRSZW5kZXJzQ2hpbGRyZW4iKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJtZXRob2QgIiArIG1ldGhvZC5nZXROYW1lKCkgKyAiIGNhbGxlZCB3aXRob3V0IHJlbmRlcmluZy1pbnRlcmNlcHRvcnMiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHByb3h5Lmludm9rZVN1cGVyKG9iaiwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEV4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIoUmVuZGVyZXIgd3JhcHBlZCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKHdyYXBwZWQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0dlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDkxN2U2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5yZW5kZXJraXQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeQ0KLXsNCi0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCBjcmVhdGVXcmFwcGVyKFJlbmRlcktpdCByZW5kZXJLaXQpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0dmFsIHJlbmRlcmtpdCB3cmFwcGVyIGNyZWF0ZWQgZm9yICIgKyByZW5kZXJLaXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHZpYSBjZ2xpYiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIEV4dFZhbEdlbmVyaWNSZW5kZXJLaXQubmV3SW5zdGFuY2UocmVuZGVyS2l0KTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NzMzMTQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3N0YXJ0dXAvR2VuZXJpY01vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkFic3RyYWN0U3RhcnR1cExpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5yZW5kZXJraXQuR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgR2VuZXJpY01vZHVsZVN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0MzkyMTU2MDMyODc3NTE5NTU2TDsNCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKS5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5SRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmNsYXNzKS5hZGRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeShuZXcgR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OWE4ZTguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZSBwcm92aWRlcyBnZW5lcmljIFN1cHBvcnQgZm9yIEpTRiBjb21wb25lbnQgZnJhbWV3b3JrcyB3aGljaCBoYXZlIHNwZWNpYWwgcmVxdWlyZW1lbnRzIChlLmcuIFJpY2hGYWNlcywgTXlGYWNlcyBUb2JhZ28sIC4uLikuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLjEueCBhbmQgSlNGIDEuMi54LiBCb3RoIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmMjBjMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0NCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBDb21wb25lbnQtU3VwcG9ydCBNb2R1bGVzPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPHNjbT4NCi0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvbXBvbmVudC1zdXBwb3J0PC9jb25uZWN0aW9uPg0KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvbXBvbmVudC1zdXBwb3J0PC9kZXZlbG9wZXJDb25uZWN0aW9uPg0KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvY29tcG9uZW50LXN1cHBvcnQ8L3VybD4NCi0gICAgPC9zY20+DQotDQotICAgIDxtb2R1bGVzPg0KLSAgICAgICAgPG1vZHVsZT50cmluaWRhZC1zdXBwb3J0PC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPmdlbmVyaWMtc3VwcG9ydDwvbW9kdWxlPg0KLSAgICA8L21vZHVsZXM+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8cHJvcGVydGllcz4NCi0gICAgICAgIDx0cmluaWRhZC52ZXJzaW9uPjEuMi45PC90cmluaWRhZC52ZXJzaW9uPg0KLSAgICA8L3Byb3BlcnRpZXM+DQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWMxYjNjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZTwvbmFtZT4NCi0gICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxyZXNvdXJjZXM+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgIDwvcmVzb3VyY2VzPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OGIyYmIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj4NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RhcnR1cC5UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lcg0KLSAgICAgICAgPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotDQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+DQotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXINCi0gICAgICAgIDwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MGViNjguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi0vKioNCi0gKiBpbiBjYXNlIG9mIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gYSB0cmluaWRhZCBjbGllbnQgdmFsaWRhdG9yIGlzIGFkZGVkIHRvIHRoZSBjb21wb25lbnQgYmFzZWQgb24gdGhlIG1ldGEtZGF0YS4NCi0gKiBhdCB0aGUgcG9zdGJhY2s6IHRoZSBleHR2YWwgdmFsaWRhdGlvbiBzdHJhdGVneSBnZXRzIGNhbGxlZCBhbmQgYWZ0ZXIgdGhhdCB0aGUgYWRkZWQgdmFsaWRhdG9yLg0KLSAqIHRoaXMgd3JhcHBlciBwcmV2ZW50cyBzdWNoIGEgc2VydmVyLXNpZGUgZG91YmxlIHZhbGlkYXRpb24uDQotICogaXQganVzdCBkZWxlZ2F0ZXMgdGhlIGNsaWVudC1zaWRlIGZ1bmN0aW9uYWxpdHkuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIgaW1wbGVtZW50cyBWYWxpZGF0b3IsIENsaWVudFZhbGlkYXRvciwgU2VyaWFsaXphYmxlDQotew0KLSAgICBwcml2YXRlIHRyYW5zaWVudCBDbGllbnRWYWxpZGF0b3Igd3JhcHBlZDsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTQxNDU0Nzg0MTcwMDYyMTQxMEw7DQotDQotICAgIHB1YmxpYyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIoQ2xpZW50VmFsaWRhdG9yIGNsaWVudFZhbGlkYXRvcikNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gY2xpZW50VmFsaWRhdG9yOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHZhbGlkYXRlIC0gdGhlIGV4dHZhbCB2YWxpZGF0aW9uIHN0cmF0ZWd5IHdpbGwgZG8gdGhhdA0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50TGlicmFyeVNvdXJjZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRDbGllbnRMaWJyYXJ5U291cmNlKGZhY2VzQ29udGV4dCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRDbGllbnRJbXBvcnROYW1lcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudEltcG9ydE5hbWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRTY3JpcHQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudFNjcmlwdChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzVkOWRiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdC5FeHRWYWxUcmluaWRhZFJlbmRlcktpdDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSB0aGlzIHBoYXNlLWxpc3RlbmVyIGluc3RlYWQgb2YgYSBFeHRWYWxUcmluaWRhZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGR1ZSB0byBhIHRyaW5pZGFkIGlzc3VlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gOTEwOTcyMTgzMTg2NDE0NjE2NUw7DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnkgPSBnZXRSZW5kZXJLaXRGYWN0b3J5KCk7DQotDQotICAgICAgICBTdHJpbmcgcmVuZGVyS2l0SWQgPSBnZXRSZW5kZXJLaXRJZChmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgaWYgKGlzSW5jb21wYXRpYmxlUmVuZGVyS2l0KHJlbmRlcktpdElkKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGFuZ2VSZW5kZXJLaXQoZmFjZXNDb250ZXh0LCByZW5kZXJLaXRGYWN0b3J5LCByZW5kZXJLaXRJZCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmVuZGVyS2l0SWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldFJlbmRlcktpdElkKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBSZW5kZXJLaXRGYWN0b3J5IGdldFJlbmRlcktpdEZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFJlbmRlcktpdEZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEZhY3RvcnlGaW5kZXIuUkVOREVSX0tJVF9GQUNUT1JZKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbmNvbXBhdGlibGVSZW5kZXJLaXQoU3RyaW5nIHJlbmRlcktpdElkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIUV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LklELmVxdWFscyhyZW5kZXJLaXRJZCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNoYW5nZVJlbmRlcktpdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnksIFN0cmluZyByZW5kZXJLaXRJZCkNCi0gICAgew0KLSAgICAgICAgUmVuZGVyS2l0IHJlbmRlcktpdCA9IHJlbmRlcktpdEZhY3RvcnkuZ2V0UmVuZGVyS2l0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgcmVuZGVyS2l0SWQpOw0KLSAgICAgICAgcmVuZGVyS2l0RmFjdG9yeS5hZGRSZW5kZXJLaXQoRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuSUQsIG5ldyBFeHRWYWxUcmluaWRhZFJlbmRlcktpdChyZW5kZXJLaXQpKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLnNldFJlbmRlcktpdElkKEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LklEKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuUkVOREVSX1JFU1BPTlNFOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKHRoaXMgPT0gbykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBFeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMGNiNzQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcmVuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgLyoNCi0gICAgICogZGVhY3RpdmF0ZQ0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0NMSUVOVF9TSURFX1RSSU5JREFEX1ZBTElEQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfQ0xJRU5UX1NJREVfVFJJTklEQURfVkFMSURBVElPTiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfVFJJTklEQURfQ09SRV9PVVRQVVRfTEFCRUxfSU5JVElBTElaQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfVFJJTklEQURfQ09SRV9PVVRQVVRfTEFCRUxfSU5JVElBTElaQVRJT04iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX1RSSU5JREFEX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1RSSU5JREFEX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SIik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvRG91YmxlUmFuZ2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTAwMGUzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuRG91YmxlUmFuZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5DbGllbnRWYWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBEb3VibGVSYW5nZUluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBib29sZWFuIGluZm9ybWF0aW9uQWRkZWQgPSBmYWxzZTsKLSAgICAgICAgRG91YmxlUmFuZ2VWYWxpZGF0b3IgZG91YmxlUmFuZ2VWYWxpZGF0b3IgPSAoRG91YmxlUmFuZ2VWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkRvdWJsZVJhbmdlIik7Ci0KLSAgICAgICAgT2JqZWN0IG1pbiA9IG51bGw7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pKQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOX0RFRkFVTFQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxUKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1pbiBpbnN0YW5jZW9mIERvdWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bSgoRG91YmxlKW1pbik7Ci0gICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBtYXggPSBudWxsOwotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4ID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWF9ERUZBVUxUKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4ID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVhfREVGQVVMVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtYXggaW5zdGFuY2VvZiBEb3VibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oKERvdWJsZSltYXgpOwotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkICYmCi0gICAgICAgICAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3IgaW5zdGFuY2VvZiBDbGllbnRWYWxpZGF0b3IgJiYgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKWRvdWJsZVJhbmdlVmFsaWRhdG9yKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xlbmd0aEluaXRpYWxpemVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUyNmM4Zi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkNsaWVudFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgTGVuZ3RoSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW5mb3JtYXRpb25BZGRlZCA9IGZhbHNlOwotICAgICAgICAvL1RPRE8KLSAgICAgICAgTGVuZ3RoVmFsaWRhdG9yIGxlbmd0aFZhbGlkYXRvciA9IChMZW5ndGhWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkxlbmd0aCIpOwotCi0gICAgICAgIE9iamVjdCBtaW5MZW5ndGggPSBudWxsOwotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbkxlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSF9ERUZBVUxUKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWluTGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIX0RFRkFVTFQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWluTGVuZ3RoIGluc3RhbmNlb2YgSW50ZWdlcikKLSAgICAgICAgewotICAgICAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1pbmltdW0oKEludGVnZXIpbWluTGVuZ3RoKTsKLSAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IG1heExlbmd0aCA9IG51bGw7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4TGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIX0RFRkFVTFQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEhfREVGQVVMVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtYXhMZW5ndGggaW5zdGFuY2VvZiBJbnRlZ2VyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldE1heGltdW1MZW5ndGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQuY2xhc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1heGltdW0oKEludGVnZXIpbWF4TGVuZ3RoKTsKLSAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9yZUluaXRWYWxpZGF0b3JzKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50LCBtZXRhRGF0YSk7IC8vc2VhcmNoIHdyYXBwZXJzIGFuZCBjYWxsIC5kZWFjdGl2YXRlCi0KLSAgICAgICAgaWYoaW5mb3JtYXRpb25BZGRlZCAmJiBsZW5ndGhWYWxpZGF0b3IgaW5zdGFuY2VvZiBDbGllbnRWYWxpZGF0b3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIoKENsaWVudFZhbGlkYXRvcilsZW5ndGhWYWxpZGF0b3IpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgQ29yZU91dHB1dExhYmVsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxlbmd0aFZhbGlkYXRvci5nZXRNaW5pbXVtKCkgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChDb3JlT3V0cHV0TGFiZWwpdWlDb21wb25lbnQpLnNldFNob3dSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTG9uZ1JhbmdlSW5pdGlhbGl6ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Mb25nUmFuZ2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzllZWI4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Mb25nUmFuZ2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkxvbmdSYW5nZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkNsaWVudFZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJza2lwVmFsaWRhdGlvblN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24iKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIExvbmdSYW5nZUluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBib29sZWFuIGluZm9ybWF0aW9uQWRkZWQgPSBmYWxzZTsKLSAgICAgICAgTG9uZ1JhbmdlVmFsaWRhdG9yIGxvbmdSYW5nZVZhbGlkYXRvciA9IChMb25nUmFuZ2VWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkxvbmdSYW5nZSIpOwotCi0gICAgICAgIE9iamVjdCBtaW4gPSBudWxsOwotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWluID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxUKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWluID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU5fREVGQVVMVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtaW4gaW5zdGFuY2VvZiBMb25nKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bSgoTG9uZyltaW4pOwotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgbWF4ID0gbnVsbDsKLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVhfREVGQVVMVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWF4IGluc3RhbmNlb2YgTG9uZykKLSAgICAgICAgewotICAgICAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oKExvbmcpbWF4KTsKLSAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoaW5mb3JtYXRpb25BZGRlZCAmJgotICAgICAgICAgICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvciBpbnN0YW5jZW9mIENsaWVudFZhbGlkYXRvciAmJiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIoKENsaWVudFZhbGlkYXRvcilsb25nUmFuZ2VWYWxpZGF0b3IpKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZjA4OGQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1BhdHRlcm5Jbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLlJlZ0V4cFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkNsaWVudFZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJza2lwVmFsaWRhdGlvblN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24iKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIFBhdHRlcm5Jbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYoIW1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gcGF0dGVybnMgPSAoU3RyaW5nW10pbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOKTsKLQotICAgICAgICBSZWdFeHBWYWxpZGF0b3IgcmVnRXhwVmFsaWRhdG9yOwotCi0gICAgICAgIGZvcihTdHJpbmcgcGF0dGVybiA6IHBhdHRlcm5zKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWdFeHBWYWxpZGF0b3IgPSAoUmVnRXhwVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuUmVnRXhwIik7Ci0KLSAgICAgICAgICAgIHJlZ0V4cFZhbGlkYXRvci5zZXRQYXR0ZXJuKHBhdHRlcm4pOwotICAgICAgICAgICAgcmVnRXhwVmFsaWRhdG9yLnNldE1lc3NhZ2VEZXRhaWxOb01hdGNoKChTdHJpbmcpbWV0YURhdGEuZ2V0KAotICAgICAgICAgICAgICAgIENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRSkpOwotCi0gICAgICAgICAgICBpZihyZWdFeHBWYWxpZGF0b3IgaW5zdGFuY2VvZiBDbGllbnRWYWxpZGF0b3IgJiYgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKXJlZ0V4cFZhbGlkYXRvcikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUmVxdWlyZWRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQ0ZWE3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnV0aWwuVHJpbmlkYWRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBSZXF1aXJlZEluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZighdmFsaWRhdGVFbXB0eUZpZWxkcygpIHx8ICFFeHRWYWxVdGlscy5pc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25BY3RpdmUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSB8fAotICAgICAgICAgICBtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCl8fAotICAgICAgICAgICBtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoKAotICAgICAgICAgICAgICAgICAoIUJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJgotICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKSkpIHx8Ci0gICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhpc0NvbXBvbmVudFJlcXVpcmVkKHVpQ29tcG9uZW50KSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkgJiYKLSAgICAgICAgICAgICAgICAgICAhQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyICYmIEV4dFZhbFV0aWxzLmlzUmVxdWlyZWRSZXNldEFjdGl2YXRlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgQ29yZU91dHB1dExhYmVsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChDb3JlT3V0cHV0TGFiZWwpdWlDb21wb25lbnQpLnNldFNob3dSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUVtcHR5RmllbGRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy52YWxpZGF0ZUVtcHR5RmllbGRzKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEJvb2xlYW4gaXNDb21wb25lbnRSZXF1aXJlZChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgQ29yZU91dHB1dExhYmVsKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aUNvbXBvbmVudCA9IFRyaW5pZGFkVXRpbHMuZmluZExhYmVsZWRFZGl0YWJsZUNvbXBvbmVudCgoQ29yZU91dHB1dExhYmVsKSB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgICAgIGlmKHVpQ29tcG9uZW50ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvL2NvbXBhcmUgd2l0aCBmYWxzZSBzbyB0cnVlID0gdHJ1ZSBvciBudWxsCi0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNSZWFkT25seSIpKSk7Ci0gICAgICAgIGJvb2xlYW4gaXNEaXNhYmxlZCA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNEaXNhYmxlZCIpKSk7Ci0KLSAgICAgICAgcmV0dXJuICEoaXNSZWFkT25seSB8fCBpc0Rpc2FibGVkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1RyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg2MGFiNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZS5UcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbnRleHQuUmVxdWVzdENvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9URVhUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXRUZXh0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXREYXRlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8VHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcj4gY29tcG9uZW50SW5pdGlhbGl6ZXJzID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyPigpOwotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBSZXF1aXJlZEluaXRpYWxpemVyKCkpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBMZW5ndGhJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgTG9uZ1JhbmdlSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IERvdWJsZVJhbmdlSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFBhdHRlcm5Jbml0aWFsaXplcigpKTsKLSAgICAgICAgLy9jb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBWYWxpZGF0b3JJbml0aWFsaXplcigpKTsKLSAgICB9Ci0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkxPVywgZGVzY3JpcHRpb24gPSAiY2hlY2sgcHByIGlzc3VlIikKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBmb3IoVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplciA6IGNvbXBvbmVudEluaXRpYWxpemVycykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoY29tcG9uZW50SW5pdGlhbGl6ZXIuY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZENvbXBvbmVudFRvU3RvcmFnZSh1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQ29tcG9uZW50KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZENvbXBvbmVudFRvU3RvcmFnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmNsYXNzLCBUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKQotICAgICAgICAgICAgICAgIC5hZGRDb21wb25lbnQodWlDb21wb25lbnQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKSB8fAotICAgICAgICAgICAgICAgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFLmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmKFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmlzUGFydGlhbFJlcXVlc3QoZmFjZXNDb250ZXh0KSkKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuYWRkUGFydGlhbFRhcmdldCh1aUNvbXBvbmVudC5nZXRQYXJlbnQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1ZhbGlkYXRvckluaXRpYWxpemVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVmFsaWRhdG9ySW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc2ZjRhZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVmFsaWRhdG9ySW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkKLUBVc2FnZUluZm9ybWF0aW9uKHZhbHVlID0gVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTE9XLCBkZXNjcmlwdGlvbiA9ICJpbXBsLiB0cmluaWRhZCBlLW1haWwgdmFsaWRhdG9yIikKLWNsYXNzIFZhbGlkYXRvckluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZighbWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLkNVU1RPTSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuQ1VTVE9NKTsKLQotICAgICAgICBpZighKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvcihPYmplY3QgY3VycmVudFZhbHVlIDogKExpc3QpdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCEoY3VycmVudFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoQ29tbW9uTWV0YURhdGFLZXlzLkVNQUlMLmVxdWFscyhjdXJyZW50VmFsdWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vVE9ETwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTQ2OTZiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yDQotICAgICAgICAuQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Bd2FyZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFRyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBDb21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHByb3RlY3RlZCB2b2lkIGFmdGVyRXh0cmFjdGluZ0ZvckNvbXBvbmVudEluaXRpYWxpemF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgcHJvY2Vzc01ldGFEYXRhRW50cmllcyhwcm9wZXJ0eUluZm9ybWF0aW9uLmdldE1ldGFEYXRhRW50cmllcygpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01ldGFEYXRhRW50cmllcyhNZXRhRGF0YUVudHJ5W10gbWV0YURhdGFFbnRyaWVzKQ0KLSAgICB7DQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBtZXRhRGF0YUVudHJpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHByb2Nlc3NFbnRyeShlbnRyeSkgJiYgaXNDbGllbnRWYWxpZGF0aW9uRGlzYWJsZWQoZW50cnkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uKGVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLy9lLmcuIHJldHVybnMgZmFsc2UgZm9yIGpzcjMwMyBlbnRyaWVzDQotICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzRW50cnkoTWV0YURhdGFFbnRyeSBlbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBBbm5vdGF0aW9uOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NsaWVudFZhbGlkYXRpb25EaXNhYmxlZChNZXRhRGF0YUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpDQotICAgICAgICAgICAgICAgIC5leHRyYWN0KGVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuaXRlcmF0b3IoKS5oYXNOZXh0KCk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHJpdmF0ZSB2b2lkIGRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbihNZXRhRGF0YUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZihlbnRyeS5nZXRQcm9wZXJ0eShDb21tb25NZXRhRGF0YUtleXMuRElTQUJMRV9DTElFTlRfU0lERV9WQUxJREFUSU9OKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGVudHJ5LnNldFByb3BlcnR5KENvbW1vbk1ldGFEYXRhS2V5cy5ESVNBQkxFX0NMSUVOVF9TSURFX1ZBTElEQVRJT04sIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBrZXlzVG9EaXNhYmxlID0gZW50cnkuZ2V0UHJvcGVydHkoQ29tbW9uTWV0YURhdGFLZXlzLkRJU0FCTEVfQ0xJRU5UX1NJREVfVkFMSURBVElPTiwgTGlzdC5jbGFzcyk7DQotICAgICAgICBrZXlzVG9EaXNhYmxlLmFkZChlbnRyeS5nZXRLZXkoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVlM2I2MS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLlRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnV0aWwuVHJpbmlkYWRVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLkNvcmVGb3JtOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3INCi17DQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQ0KLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoZmlsdGVyQ29yZU91dHB1dExhYmVsKHVpQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0Q29yZU91dHB1dExhYmVsKGZhY2VzQ29udGV4dCwgKENvcmVPdXRwdXRMYWJlbCkgdWlDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlckVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkNCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlRm9ybSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjbGVhbnVwRXh0VmFsQ2xpZW50VmFsaWRhdG9ycygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjbGVhbnVwRXh0VmFsQ2xpZW50VmFsaWRhdG9ycygpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmNsYXNzLCBUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKQ0KLSAgICAgICAgICAgICAgICAucm9sbGJhY2soKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gZmlsdGVyQ29yZU91dHB1dExhYmVsKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgQ29yZU91dHB1dExhYmVsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q29yZU91dHB1dExhYmVsKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIENvcmVPdXRwdXRMYWJlbCBjb3JlT3V0cHV0TGFiZWwpDQotICAgIHsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IFRyaW5pZGFkVXRpbHMuZmluZExhYmVsZWRFZGl0YWJsZUNvbXBvbmVudChjb3JlT3V0cHV0TGFiZWwpOw0KLQ0KLSAgICAgICAgaWYgKHRhcmdldENvbXBvbmVudCA9PSBudWxsIHx8ICFpc0NvbXBvbmVudEVkaXRhYmxlKHRhcmdldENvbXBvbmVudCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YVJlc3VsdCA9IEV4dFZhbFV0aWxzLmdldFRyYW5zZm9ybWVkTWV0YURhdGEoZmFjZXNDb250ZXh0LCB0YXJnZXRDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgLy9nZXQgY29tcG9uZW50IGluaXRpYWxpemVyIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQgYW5kIGNvbmZpZ3VyZSBpdA0KLSAgICAgICAgLy9hbHNvIGluIGNhc2Ugb2Ygc2tpcHBlZCB2YWxpZGF0aW9uIHRvIHJlc2V0IGUuZy4gdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZQ0KLSAgICAgICAgaWYgKCFtZXRhRGF0YVJlc3VsdC5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29uZmlndXJlQ29tcG9uZW50V2l0aE1ldGFEYXRhKGZhY2VzQ29udGV4dCwgY29yZU91dHB1dExhYmVsLCBtZXRhRGF0YVJlc3VsdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcG9uZW50RWRpdGFibGUoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIC8vY29tcGFyZSB3aXRoIGZhbHNlIHNvIHRydWUgPSB0cnVlIG9yIG51bGwNCi0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzUmVhZE9ubHkiKSkpOw0KLSAgICAgICAgYm9vbGVhbiBpc0Rpc2FibGVkID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNEaXNhYmxlZCIpKSk7DQotDQotICAgICAgICByZXR1cm4gIShpc1JlYWRPbmx5IHx8IGlzRGlzYWJsZWQpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDg1NDYxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuTGFiZWxlZE1lc3NhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uZXhjZXB0aW9uLlJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb250ZXh0LlJlcXVlc3RDb250ZXh0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigzMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXRUZXh0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dERhdGUiOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9SZWZyZXNoQ29tcG9uZW50KHVpQ29tcG9uZW50KTsNCi0gICAgICAgICAgICB0cnlUb1BsYWNlTGFiZWxJbkZhY2VzTWVzc2FnZSh1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgdmFsaWRhdG9yRXhjZXB0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1BsYWNlTGFiZWxJbkZhY2VzTWVzc2FnZSgNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICB0cnlUb0hhbmRsZVJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKHVpQ29tcG9uZW50LCB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLQ0KLSAgICAgICAgU3RyaW5nIGxhYmVsID0gZGV0ZWN0TGFiZWxUZXh0KG1ldGFEYXRhRW50cnksIHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIHByb2Nlc3NMYWJlbCh2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCksIGxhYmVsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBkZXRlY3RMYWJlbFRleHQoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGxhYmVsID0gZ2V0TGFiZWwodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgbGFiZWwgPSBnZXRDbGllbnRJZEFzRmFsbGJhY2tJZk5lZWRlZCh1aUNvbXBvbmVudCwgbGFiZWwpOw0KLQ0KLSAgICAgICAgbGFiZWwgPSB0cnlUb092ZXJyaWRlTGFiZWxJZlByb3ZpZGVkTWFudWFsbHkobWV0YURhdGFFbnRyeSwgbGFiZWwpOw0KLSAgICAgICAgcmV0dXJuIGxhYmVsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTGFiZWwoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgU3RyaW5nIGxhYmVsKQ0KLSAgICB7DQotICAgICAgICBpZihmYWNlc01lc3NhZ2UgaW5zdGFuY2VvZiBMYWJlbGVkTWVzc2FnZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAoKExhYmVsZWRNZXNzYWdlKWZhY2VzTWVzc2FnZSkuc2V0TGFiZWxUZXh0KGxhYmVsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vaWYgc29tZW9uZSB1c2VzIGEgbm9ybWFsIGZhY2VzIG1lc3NhZ2UNCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9QbGFjZUxhYmVsKGZhY2VzTWVzc2FnZSwgbGFiZWwsIGkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb092ZXJyaWRlTGFiZWxJZlByb3ZpZGVkTWFudWFsbHkoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhRW50cnkgIT0gbnVsbCAmJiBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMLCBTdHJpbmcuY2xhc3MpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGxhYmVsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldENsaWVudElkQXNGYWxsYmFja0lmTmVlZGVkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIGlmKGxhYmVsID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHVpQ29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvSGFuZGxlUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRvckV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCk7DQotICAgICAgICAgICAgU3RyaW5nIGlubGluZU1lc3NhZ2UgPSBnZXRJbmxpbmVSZXF1aXJlZE1lc3NhZ2UodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgICAgIGlmKGlubGluZU1lc3NhZ2UgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGlubGluZU1lc3NhZ2UpOw0KLSAgICAgICAgICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGlubGluZU1lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9SZWZyZXNoQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZihSZXF1ZXN0Q29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5pc1BhcnRpYWxSZXF1ZXN0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuYWRkUGFydGlhbFRhcmdldCh1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHVpQ29tcG9uZW50ICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgKFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVC5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpIHx8DQotICAgICAgICAgICAgICAgICBUUklOSURBRF9DT1JFX0lOUFVUX0RBVEUuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGFiZWwoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoU3RyaW5nKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCh1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJnZXRMYWJlbCIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRJbmxpbmVSZXF1aXJlZE1lc3NhZ2UoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoU3RyaW5nKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCh1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJnZXRSZXF1aXJlZE1lc3NhZ2VEZXRhaWwiKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RiNDVlOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwucmVuZGVya2l0LlJlbmRlcktpdERlY29yYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwucmVuZGVya2l0LmNvcmUuQ29yZVJlbmRlcktpdDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVzcG9uc2VTdGF0ZU1hbmFnZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VXcml0ZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uV3JpdGVyOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZFJlbmRlcktpdCBleHRlbmRzIFJlbmRlcktpdERlY29yYXRvcg0KLXsNCi0gICAgcHJvdGVjdGVkIEV4dFZhbFJlbmRlcktpdCBleHRWYWxSZW5kZXJLaXQ7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIkVYVFZBTF9UUklOSURBRF9SRU5ERVJLSVQiOw0KLQ0KLSAgICBwdWJsaWMgRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQoUmVuZGVyS2l0IHdyYXBwZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZXh0VmFsUmVuZGVyS2l0ID0gbmV3IEV4dFZhbFJlbmRlcktpdCh3cmFwcGVkKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSwgUmVuZGVyZXIgcmVuZGVyZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCByZW5kZXJlcik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBSZW5kZXJlciBnZXRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5leHRWYWxSZW5kZXJLaXQuZ2V0UmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdGF0ZU1hbmFnZXIgZ2V0UmVzcG9uc2VTdGF0ZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5leHRWYWxSZW5kZXJLaXQuZ2V0UmVzcG9uc2VTdGF0ZU1hbmFnZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFJlc3BvbnNlV3JpdGVyIGNyZWF0ZVJlc3BvbnNlV3JpdGVyKFdyaXRlciB3cml0ZXIsIFN0cmluZyBzLCBTdHJpbmcgczEpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5jcmVhdGVSZXNwb25zZVdyaXRlcih3cml0ZXIsIHMsIHMxKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFJlc3BvbnNlU3RyZWFtIGNyZWF0ZVJlc3BvbnNlU3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5jcmVhdGVSZXNwb25zZVN0cmVhbShvdXRwdXRTdHJlYW0pOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVjb3JhdGVkUmVuZGVyS2l0SWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ29yZVJlbmRlcktpdC5CQVNFX1JFTkRFUl9LSVRfSUQ7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjI3MDFmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuY29yZS54aHRtbC50YWJsZS5UYWJsZVJlbmRlcmluZ0NvbnRleHQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBzb2x1dGlvbiBmb3IgdHJpbmlkYWQgdGFibGUgcmVuZGVyZXIgaXNzdWUgKGluIGNvbm5lY3Rpb24gd2l0aCBkb3VibGUgY2FsbCBwcmV2ZW50aW9uIHByb3hpZXMpDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eSBleHRlbmRzIEV4dFZhbFJlbmRlcmVyUHJveHkNCi17DQotICAgIHB1YmxpYyBFeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkoUmVuZGVyZXIgcmVuZGVyZXIpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKHJlbmRlcmVyKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcHRpb25hbEtleShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYoVGFibGVSZW5kZXJpbmdDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJ8IiArIFRhYmxlUmVuZGVyaW5nQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRSZW5kZXJTdGFnZSgpLmdldFN0YWdlKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gIiI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGI3NTZiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5TdG9yYWdlTWFuYWdlckhvbGRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudC5UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZS5UcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLkRlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnZhbGlkYXRpb24ubWVzc2FnZS5UcmluaWRhZEZhY2VzTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQuRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3IuVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvci5UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvci5UcmluaWRhZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogYWx0ZXJuYXRpdmUgYXBwcm9hY2ggZm9yIEV4dFZhbFJlbmRlcktpdEZhY3RvcnkNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODAzNDA4OTI0NDkwMzk2Njk5OUw7DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBkZWFjdGl2YXRlRGVmYXVsdEV4dFZhbFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7DQotDQotICAgICAgICBpbml0Q2xpZW50U2lkZVZhbGlkYXRpb25TdXBwb3J0KCk7DQotDQotICAgICAgICBpbml0TGFiZWxJbml0aWFsaXphdGlvblN1cHBvcnQoKTsNCi0NCi0gICAgICAgIGluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0aW9uKCk7DQotDQotICAgICAgICByZXBsYWNlRGVmYXVsdFByb3h5V2l0aFRyaW5pZGFkUmVuZGVyZXJQcm94eSgpOw0KLQ0KLSAgICAgICAgaW5pdFRyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeSgpOw0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIGlmIHRoZXJlIGFyZSBmdXJ0aGVyIGluY29tcGF0aWJsZSByZW5kZXJlcnMgdXNlIHRoZSBmb2xsb3dpbmcgcXVpY2stZml4Og0KLSAgICAgICAgICogICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVksIG51bGwpOw0KLSAgICAgICAgICAgYXR0ZW50aW9uOiBpdCBjYXVzZXMgZGlyZWN0IGRlbGVnYXRpb24gd2l0aG91dCBhIGNoZWNrIG9mIGRvdWJsZSBpbnZvY2F0aW9ucw0KLSAgICAgICAgICovDQotDQotICAgICAgICBpbml0VHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcigpOw0KLQ0KLSAgICAgICAgaW5pdFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgaW5pdFJlcXVpcmVkSW5pdGlhbGl6YXRpb24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgZGVhY3RpdmF0ZURlZmF1bHRFeHRWYWxSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5SRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZLCBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmNsYXNzKS5kZWFjdGl2YXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRDbGllbnRTaWRlVmFsaWRhdGlvblN1cHBvcnQoKQ0KLSAgICB7DQotICAgICAgICBpZihpc0NsaWVudFNpZGVWYWxpZGF0aW9uU3VwcG9ydEVuYWJsZWQoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ0xJRU5UX1NJREVfVFJJTklEQURfVkFMSURBVElPTikpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRMYWJlbEluaXRpYWxpemF0aW9uU3VwcG9ydCgpDQotICAgIHsNCi0gICAgICAgIGlmKGlzTGFiZWxJbml0aWFsaXphdGlvbkVuYWJsZWQoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfVFJJTklEQURfQ09SRV9PVVRQVVRfTEFCRUxfSU5JVElBTElaQVRJT04pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdGlvbigpDQotICAgIHsNCi0gICAgICAgIGlmKHVzZVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRpb24oV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfVFJJTklEQURfVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcihuZXcgVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VEZWZhdWx0UHJveHlXaXRoVHJpbmlkYWRSZW5kZXJlclByb3h5KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZLCBFeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFRyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5TmFtZXMuRkFDRVNfTUVTU0FHRV9GQUNUT1JZLm5hbWUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBUcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFRyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlksIFN0b3JhZ2VNYW5hZ2VySG9sZGVyLmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuc2V0U3RvcmFnZU1hbmFnZXIoVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0xhYmVsSW5pdGlhbGl6YXRpb25FbmFibGVkKFN0cmluZyBkZWFjdGl2YXRlSW5pdENvcmVPdXRwdXRMYWJlbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRlYWN0aXZhdGVJbml0Q29yZU91dHB1dExhYmVsID09IG51bGwgfHwgIWRlYWN0aXZhdGVJbml0Q29yZU91dHB1dExhYmVsLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDbGllbnRTaWRlVmFsaWRhdGlvblN1cHBvcnRFbmFibGVkKFN0cmluZyBkZWFjdGl2YXRlQ2xpZW50U2lkZVZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkZWFjdGl2YXRlQ2xpZW50U2lkZVZhbGlkYXRpb24gPT0gbnVsbCB8fCAhZGVhY3RpdmF0ZUNsaWVudFNpZGVWYWxpZGF0aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdGlvbihTdHJpbmcgZGVhY3RpdmF0ZVRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGVhY3RpdmF0ZVRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yID09IG51bGwgfHwNCi0gICAgICAgICAgICAgICAgIWRlYWN0aXZhdGVUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFJlcXVpcmVkSW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBpZighaXNSZXF1aXJlZEluaXRpYWxpemF0aW9uRGVhY3RpdmF0ZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eSgibW9kZTppbml0OnJlcXVpcmVkIiwgQm9vbGVhbi5UUlVFLCB0cnVlKTsNCi0NCi0gICAgICAgICAgICAvL3RoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHNldmVyaXR5IGF3YXJlIHZhbGlkYXRpb24gLT4gZG9uJ3QgcmVzZXQgdGhlIHZhbHVlDQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoIm1vZGU6cmVzZXQ6cmVxdWlyZWQiLCBCb29sZWFuLkZBTFNFLCBmYWxzZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvbkRlYWN0aXZhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICJmYWxzZSIuZXF1YWxzSWdub3JlQ2FzZSgNCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyLkFDVElWQVRFX1JFUVVJUkVEX0lOSVRJQUxJWkFUSU9OKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNTQyNTQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2UgaW1wbGVtZW50cyBUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgTGlzdDxVSUNvbXBvbmVudD4gY29tcG9uZW50TGlzdCA9IG5ldyBBcnJheUxpc3Q8VUlDb21wb25lbnQ+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZENvbXBvbmVudChVSUNvbXBvbmVudCB0cmluaWRhZENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYoIXRoaXMuY29tcG9uZW50TGlzdC5jb250YWlucyh0cmluaWRhZENvbXBvbmVudCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5jb21wb25lbnRMaXN0LmFkZCh0cmluaWRhZENvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcm9sbGJhY2soKQ0KLSAgICB7DQotICAgICAgICBmb3IgKFVJQ29tcG9uZW50IGNvbXBvbmVudCA6IHRoaXMuY29tcG9uZW50TGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZW1vdmVUcmluaWRhZFZhbGlkYXRvcldyYXBwZXIoY29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRoaXMuY29tcG9uZW50TGlzdC5jbGVhcigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZW1vdmVUcmluaWRhZFZhbGlkYXRvcldyYXBwZXIoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVtb3ZlV3JhcHBlckZyb21Db21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vdG8ga2VlcCB0aGUgc291cmNlIGluIHN5bmMgd2l0aCBvbGRlciB2ZXJzaW9ucw0KLSAgICAgICAgICAgIGZvciAoT2JqZWN0IGNoaWxkIDogdWlDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlbW92ZVRyaW5pZGFkVmFsaWRhdG9yV3JhcHBlcigoVUlDb21wb25lbnQpY2hpbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlV3JhcHBlckZyb21Db21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGZvciAoVmFsaWRhdG9yIHZhbGlkYXRvciA6ICgoRWRpdGFibGVWYWx1ZUhvbGRlcikgdWlDb21wb25lbnQpLmdldFZhbGlkYXRvcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKSB1aUNvbXBvbmVudCkucmVtb3ZlVmFsaWRhdG9yKHZhbGlkYXRvcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDAxZGM1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLm1hcHBlci5EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgY29tcG9uZW50IGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTWFuYWdlcg0KLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8VHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlPg0KLXsNCi0gICAgcHVibGljIERlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBEZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBTdG9yYWdlTWFuYWdlci5jbGFzcy5nZXROYW1lKCkgKyAiX0ZPUl9UUklOSURBRF9DTElFTlRfVkFMSURBVE9SOktFWSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9UcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODNjYjguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9UcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi0NCi0vKioNCi0gKiBleHR2YWwgaW5qZWN0cyBjbGllbnQtdmFsaWRhdG9ycyBpbnRvIHRyaW5pZGFkIGNvbXBvbmVudHMgYmFzZWQgb24gbWV0YS1kYXRhLg0KLSAqIHNvIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gaXMgc3VwcG9ydGVkLiBzb21lIGFwcC1zZXJ2ZXJzIHNob3cgYSBkaWZmZXJlbnQgYmVoYXZpb3VyLg0KLSAqIHRoYXQncyB0aGUgcmVhc29uIGZvciBzdG9yaW5nIHRoZXNlIGNvbXBvbmVudHMgYW5kIHJlbW92ZSB0aGUgaW5qZWN0ZWQgdmFsaWRhdG9ycyBhZnRlciB0aGUgcmVuZGVyaW5nIHBoYXNlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBhZGRDb21wb25lbnQoVUlDb21wb25lbnQgdHJpbmlkYWRDb21wb25lbnQpOw0KLSAgICB2b2lkIHJvbGxiYWNrKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZTY5YjMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLlRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UuRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiB1c2UgYSBwdWJsaWMgY2xhc3MgdG8gYWxsb3cgb3B0aW9uYWwgZGVyZWdpc3RyYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3V0aWwvVHJpbmlkYWRVdGlscy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdXRpbC9UcmluaWRhZFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNjM4MzIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdXRpbC9UcmluaWRhZFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJjaGVjayBzdWJmb3JtIikNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRVdGlscw0KLXsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coVHJpbmlkYWRVdGlscy5jbGFzcyk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVUlDb21wb25lbnQgZmluZExhYmVsZWRFZGl0YWJsZUNvbXBvbmVudChDb3JlT3V0cHV0TGFiZWwgY29yZU91dHB1dExhYmVsKQ0KLSAgICB7DQotICAgICAgICAvL1RPRE8NCi0gICAgICAgIGlmKGlzTGFiZWxUYXJnZXRBdmFpbGFibGUoY29yZU91dHB1dExhYmVsKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBVSUNvbXBvbmVudCByZXN1bHQgPSByZXNvbHZlTGFiZWxUYXJnZXQoZmFjZXNDb250ZXh0LCBjb3JlT3V0cHV0TGFiZWwpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoTE9HLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgTE9HLnRyYWNlKGNvcmVPdXRwdXRMYWJlbC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpICsgIiBkb2Vzbid0IHJlZmVyZW5jZSBhbiBlZGl0YWJsZSBjb21wb25lbnQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFVJQ29tcG9uZW50IHJlc29sdmVMYWJlbFRhcmdldChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBDb3JlT3V0cHV0TGFiZWwgY29yZU91dHB1dExhYmVsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZmluZENvbXBvbmVudChjb3JlT3V0cHV0TGFiZWwuZ2V0Rm9yKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMYWJlbFRhcmdldEF2YWlsYWJsZShDb3JlT3V0cHV0TGFiZWwgY29yZU91dHB1dExhYmVsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29yZU91dHB1dExhYmVsLmdldEZvcigpID09IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2MyMWNjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5IGV4dGVuZHMgRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xhYmVsZWRGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIFRyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2Uoc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmU2OTNiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuTGFiZWxlZE1lc3NhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC51dGlsLkxhYmVsZWRGYWNlc01lc3NhZ2U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBUcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UgZXh0ZW5kcyBMYWJlbGVkRmFjZXNNZXNzYWdlIGltcGxlbWVudHMgTGFiZWxlZE1lc3NhZ2UNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYzNTY4MDA2ODk5NjE1MDUxNTRMOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX1JFU09VUkNFX01BUktFUiA9ICI/Pz8iOw0KLQ0KLSAgICBwdWJsaWMgVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlKFNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgc3VwZXIoc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TGFiZWxBc1N0cmluZyhGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN1bW1hcnkoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UgcmVzdWx0ID0gdHJ5VG9QbGFjZUxhYmVsKHN1cGVyLmdldFN1bW1hcnkoKSk7DQotDQotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3VwZXIuc2V0U3VtbWFyeShyZXN1bHQuZ2V0U3VtbWFyeSgpKTsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmdldFN1bW1hcnkoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRTdW1tYXJ5KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGV0YWlsKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIHJlc3VsdCA9IHRyeVRvUGxhY2VMYWJlbChzdXBlci5nZXREZXRhaWwoKSk7DQotDQotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3VwZXIuc2V0RGV0YWlsKHJlc3VsdC5nZXREZXRhaWwoKSk7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5nZXREZXRhaWwoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5nZXREZXRhaWwoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEZhY2VzTWVzc2FnZSB0cnlUb1BsYWNlTGFiZWwoU3RyaW5nIG9yaWdpbmFsTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGlzVmFsaWRNZXNzYWdlKG9yaWdpbmFsTWVzc2FnZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIG5ld0ZhY2VzTWVzc2FnZSA9IGNyZWF0ZU9yaWdpbmFsRmFjZXNNZXNzYWdlKCk7DQotICAgICAgICAgICAgdHJ5VG9QbGFjZUxhYmVsSW4obmV3RmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICByZXR1cm4gbmV3RmFjZXNNZXNzYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBGYWNlc01lc3NhZ2UgY3JlYXRlT3JpZ2luYWxGYWNlc01lc3NhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEZhY2VzTWVzc2FnZShzdXBlci5nZXRTZXZlcml0eSgpLCBzdXBlci5nZXRTdW1tYXJ5KCksIHN1cGVyLmdldERldGFpbCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9QbGFjZUxhYmVsSW4oRmFjZXNNZXNzYWdlIG5ld0ZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGxhYmVsID0gZ2V0TGFiZWxUZXh0KCk7DQotDQotICAgICAgICBpZihsYWJlbCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9QbGFjZUxhYmVsKG5ld0ZhY2VzTWVzc2FnZSwgbGFiZWwsIGkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZE1lc3NhZ2UoU3RyaW5nIG9yaWdpbmFsTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICEob3JpZ2luYWxNZXNzYWdlICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgb3JpZ2luYWxNZXNzYWdlLnN0YXJ0c1dpdGgoTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIpICYmDQotICAgICAgICAgICAgICAgIG9yaWdpbmFsTWVzc2FnZS5lbmRzV2l0aChNSVNTSU5HX1JFU09VUkNFX01BUktFUikpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldExhYmVsKGxhYmVsKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNDk1OTguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlIHByb3ZpZGVzIHNwZWNpYWwgVHJpbmlkYWQgU3VwcG9ydCBmb3IgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvci4NCi0gICAgRnVydGhlcm1vcmUsIGl0IGFsbG93cyB0byBqb2luIHRoZSBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIG1lY2hhbmlzbSBvZiBUcmluaWRhZC4gU2FtcGxlIHVzZS1jYXNlOiBhbm5vdGF0ZSB5b3VyIG1vZGVsIHdpdGggSlBBIDEuMCBhbm5vdGF0aW9ucywgYmluZCBwcm9wZXJ0aWVzIHRvIEpTRiBJbnB1dCBjb21wb25lbnRzIGFuZCBnZXQgYXV0b21hdGljIGNsaWVudC1zaWRlIHZhbGlkYXRpb24ganVzdCBieSBhZGRpbmcgMyBKQVIgZmlsZXMgKE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSwgUHJvcGVydHkgVmFsaWRhdGlvbiBhbmQgVHJpbmlkYWQgU3VwcG9ydCkuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLjEueCBhbmQgSlNGIDEuMi54LiBCb3RoIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNzQwOTQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBDb3JlPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPHNjbT4NCi0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvcmU8L2Nvbm5lY3Rpb24+DQotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvY29yZTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4NCi0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvcmU8L3VybD4NCi0gICAgPC9zY20+DQotICAgIA0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cmVzb3VyY2VzPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICA8L3Jlc291cmNlcz4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ0ZGM0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotICAgIDxmYWN0b3J5Pg0KLSAgICAgICAgPHJlbmRlci1raXQtZmFjdG9yeT5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyS2l0RmFjdG9yeTwvcmVuZGVyLWtpdC1mYWN0b3J5Pg0KLSAgICA8L2ZhY3Rvcnk+DQotDQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5FeHRWYWxTdGFydHVwTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkNWQxYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotDQotLyoqDQotICogZG9udCd0IG1vdmUgdG8gYW4gb3RoZXIgcGFja2FnZSEhIQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIEV4dFZhbEluZm9ybWF0aW9uDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FID0gRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJYTUxfUEFSQU1fUFJFRklYID0gRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gQ2xhc3NVdGlscy5nZXRKYXJWZXJzaW9uKEV4dFZhbEluZm9ybWF0aW9uLmNsYXNzKTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9DdXN0b21JbmZvcm1hdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9DdXN0b21JbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmRhMzllLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ3VzdG9tSW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkNCi1wdWJsaWMgZW51bSBDdXN0b21JbmZvcm1hdGlvbg0KLXsNCi0gICAgQkFTRV9QQUNLQUdFLA0KLQ0KLSAgICBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiwNCi0gICAgVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SLA0KLQ0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgsDQotICAgIFZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYLA0KLSAgICBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfUE9TVEZJWCwNCi0NCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NU0dfUkVTT0xWRVJfTkFNRV9NQVBQRVIsDQotICAgIE1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSLA0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUiwNCi0NCi0gICAgU1RBUlRVUF9MSVNURU5FUiwNCi0gICAgQ09NUE9ORU5UX0lOSVRJQUxJWkVSLA0KLSAgICBWQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgUFJPUEVSVFlfVkFMSURBVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IsDQotDQotICAgIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwNCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLA0KLSAgICBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLA0KLSAgICBWQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWSwNCi0gICAgVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWSwNCi0gICAgTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksDQotICAgIEZBQ0VTX01FU1NBR0VfRkFDVE9SWSwNCi0gICAgU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlksDQotDQotICAgIE1FU1NBR0VfQlVORExFX05BTUUsDQotICAgIFNUQVRJQ19TVFJBVEVHWV9NQVBQSU5HX1NPVVJDRSwNCi0NCi0gICAgTUVUQV9EQVRBX1NUT1JBR0VfRklMVEVSDQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0RlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGIzYzU0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyIGltcGxlbWVudHMgUHJvamVjdFN0YWdlUmVzb2x2ZXINCi17DQotICAgIHB1YmxpYyBQcm9qZWN0U3RhZ2UgZ2V0Q3VycmVudFByb2plY3RTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgdXNlIHRoZSBkZWZhdWx0IGV4dHZhbCBtZWNoYW5pc20gdG8gYXZvaWQgdG9vIGVhcmx5IGV2YWx1YXRpb24gd2l0aCBtb2phcnJhDQotICAgICAgICBTdHJpbmcgcmVzdWx0Ow0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcigiamF2YXguZmFjZXMuUFJPSkVDVF9TVEFHRSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVQcm9qZWN0U3RhZ2UoZ2V0RGVmYXVsdFByb2plY3RTdGFnZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsIHx8ICIiLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVQcm9qZWN0U3RhZ2UoZ2V0RGVmYXVsdFByb2plY3RTdGFnZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjcmVhdGVQcm9qZWN0U3RhZ2UoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShyZXN1bHQudHJpbSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFByb2plY3RTdGFnZSBjcmVhdGVQcm9qZWN0U3RhZ2UoUHJvamVjdFN0YWdlTmFtZSBwcm9qZWN0U3RhZ2VOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlKHByb2plY3RTdGFnZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgUHJvamVjdFN0YWdlTmFtZSBnZXREZWZhdWx0UHJvamVjdFN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldERlZmF1bHRTdGFnZU5hbWUoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHQuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mjg5NWJmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5EZWZhdWx0RmFjdG9yeUZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIEV4dFZhbENvbnRleHQKLXsKLSAgICBwcml2YXRlIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgc3RhdGljIEV4dFZhbENvbnRleHQgZXh0VmFsQ29udGV4dDsKLQotICAgIC8vZG9uJ3QgdHJ5IHRvIHJlc29sdmUgaXQgZHluYW1pY2FsbHkgZS5nLiB2aWEgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gLSB0aGVyZSdzIGEgbW9qYXJyYSBpc3N1ZQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fRVhUVkFMX0NPTlRFWFRfQ0xBU1NfTkFNRSA9Ci0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmNsYXNzLmdldE5hbWUoKS5yZXBsYWNlKCIuY29yZS4iLCAiLmN1c3RvbS4iKTsKLQotICAgIHByaXZhdGUgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOwotICAgIHByaXZhdGUgRmFjdG9yeUZpbmRlciBmYWN0b3J5RmluZGVyID0gRGVmYXVsdEZhY3RvcnlGaW5kZXIuZ2V0SW5zdGFuY2UoKTsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFJlbmRlcmVySW50ZXJjZXB0b3I+IHJlbmRlcmVySW50ZXJjZXB0b3JzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBSZW5kZXJlckludGVyY2VwdG9yPigpOwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGRlbmllZEludGVyY2VwdG9ycyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIHByaXZhdGUgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyPiBwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycyA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI+KCk7Ci0KLSAgICBwcml2YXRlIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGdsb2JhbFByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgIHByaXZhdGUgTWFwPFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcywgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4+IHN0YXRpY0NvbmZpZ01hcAotICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMsIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+PigpOwotCi0gICAgcHJpdmF0ZSBFeHRWYWxDb250ZXh0SW50ZXJuYWxzIGNvbnRleHRIZWxwZXI7Ci0gICAgcHJpdmF0ZSBFeHRWYWxDb250ZXh0SW52b2NhdGlvbk9yZGVyQXdhcmVJbnRlcm5hbHMgaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyOwotCi0gICAgcHJvdGVjdGVkIEV4dFZhbENvbnRleHQoKQotICAgIHsKLSAgICAgICAgdGhpcy5jb250ZXh0SGVscGVyID0gbmV3IEV4dFZhbENvbnRleHRJbnRlcm5hbHMoKTsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIgPSBuZXcgRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzKHRoaXMuY29udGV4dEhlbHBlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFeHRWYWxDb250ZXh0IGdldENvbnRleHQoKQotICAgIHsKLSAgICAgICAgaWYgKGV4dFZhbENvbnRleHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZXh0VmFsQ29udGV4dCA9IG5ldyBFeHRWYWxDb250ZXh0KCk7Ci0KLSAgICAgICAgICAgIHRyeVRvQ3JlYXRlQ3VzdG9tRXh0VmFsQ29udGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBleHRWYWxDb250ZXh0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdHJ5VG9DcmVhdGVDdXN0b21FeHRWYWxDb250ZXh0KCkKLSAgICB7Ci0gICAgICAgIE9iamVjdCBjdXN0b21FeHRWYWxDb250ZXh0ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKENVU1RPTV9FWFRWQUxfQ09OVEVYVF9DTEFTU19OQU1FKTsKLQotICAgICAgICBpZiAoY3VzdG9tRXh0VmFsQ29udGV4dCBpbnN0YW5jZW9mIEV4dFZhbENvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4dFZhbENvbnRleHQgPSAoRXh0VmFsQ29udGV4dCkgY3VzdG9tRXh0VmFsQ29udGV4dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKQotICAgIHsKLSAgICAgICAgc2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcih2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKAotICAgICAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLCBib29sZWFuIGZvcmNlT3ZlcnJpZGUpCi0gICAgewotICAgICAgICBpZiAodGhpcy52aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyID09IG51bGwgfHwgZm9yY2VPdmVycmlkZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRoaXMubG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSAmJiB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyh2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmdldENsYXNzKCkgKyAiIGlzIHVzZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciA9IHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBnZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCkKLSAgICB7Ci0gICAgICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgcmVxdWVzdFNjb3BlZEludGVycHJldGVyID0gdGhpcy5jb250ZXh0SGVscGVyCi0gICAgICAgICAgICAgICAgLmdldFJlcXVlc3RTY29wZWRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7Ci0KLSAgICAgICAgaWYocmVxdWVzdFNjb3BlZEludGVycHJldGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZXF1ZXN0U2NvcGVkSW50ZXJwcmV0ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpcy52aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBGYWN0b3J5RmluZGVyCi0gICAgKi8KLSAgICBwdWJsaWMgRmFjdG9yeUZpbmRlciBnZXRGYWN0b3J5RmluZGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZhY3RvcnlGaW5kZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmFjdG9yeUZpbmRlcihGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIpCi0gICAgewotICAgICAgICBpZiAoZmFjdG9yeUZpbmRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZhY3RvcnlGaW5kZXIgPSBmYWN0b3J5RmluZGVyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKQotICAgIHsKLSAgICAgICAgc2V0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3Ioc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLCBib29sZWFuIGZvcmNlT3ZlcnJpZGUpCi0gICAgewotICAgICAgICBpZiAodGhpcy5za2lwVmFsaWRhdGlvbkV2YWx1YXRvciA9PSBudWxsIHx8IGZvcmNlT3ZlcnJpZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc0luZm9FbmFibGVkKCkgJiYgc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmdldENsYXNzKCkgKyAiIGlzIHVzZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMuc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IgPSBza2lwVmFsaWRhdGlvbkV2YWx1YXRvcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvciBnZXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcigpCi0gICAgewotICAgICAgICBpZiAodGhpcy5za2lwVmFsaWRhdGlvbkV2YWx1YXRvciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBza2lwVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YUVudHJ5IGVudHJ5KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpcy5za2lwVmFsaWRhdGlvbkV2YWx1YXRvcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJlbmRlcmVySW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8UmVuZGVyZXJJbnRlcmNlcHRvcj4gZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8UmVuZGVyZXJJbnRlcmNlcHRvcj4odGhpcy5yZW5kZXJlckludGVyY2VwdG9ycy52YWx1ZXMoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoRXh0VmFsQ29udGV4dC5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRoaXMuZGVuaWVkSW50ZXJjZXB0b3JzLmNvbnRhaW5zKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRoaXMucmVuZGVyZXJJbnRlcmNlcHRvcnMucHV0KHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpLCByZW5kZXJlckludGVyY2VwdG9yKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihDbGFzczw/IGV4dGVuZHMgUmVuZGVyZXJJbnRlcmNlcHRvcj4gcmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3MocmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKEV4dFZhbENvbnRleHQuY2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucmVuZGVyZXJJbnRlcmNlcHRvcnMucmVtb3ZlKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vaWYgYW4gaW50ZXJjZXB0b3IgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZCBzbyBmYXIsIGl0IHNob3VsZCBiZSBkZW5pZWQgYXQgZnV0dXJlIHJlZ2lzdHJhdGlvbnMKLSAgICBwdWJsaWMgdm9pZCBkZW55UmVuZGVyZXJJbnRlcmNlcHRvcihDbGFzczw/IGV4dGVuZHMgUmVuZGVyZXJJbnRlcmNlcHRvcj4gcmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3MocmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKEV4dFZhbENvbnRleHQuY2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghdGhpcy5kZW5pZWRJbnRlcmNlcHRvcnMuY29udGFpbnMocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZGVuaWVkSW50ZXJjZXB0b3JzLmFkZChyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVyZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IocmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENvbXBvbmVudEluaXRpYWxpemVycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENvbXBvbmVudEluaXRpYWxpemVyKENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRDb21wb25lbnRJbml0aWFsaXplcnMoKTsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIoY29tcG9uZW50SW5pdGlhbGl6ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPiBnZXRDb21wb25lbnRJbml0aWFsaXplcnMoKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRDb21wb25lbnRJbml0aWFsaXplcnMoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmdldENvbXBvbmVudEluaXRpYWxpemVycygpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcihWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcih2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4gZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmdldFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYWxsIGdsb2JhbCB2YWxpZGF0aW9uIGludGVyY2VwdG9ycwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBnZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBnZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IoQ2xhc3MgbW9kdWxlS2V5KQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc0Zvcihtb2R1bGVLZXkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhbGwgZ2xvYmFsIG1ldGEtZGF0YSBleHRyYWN0aW9uIGludGVyY2VwdG9ycwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnNGb3IoQ2xhc3MgbW9kdWxlS2V5KQotICAgIHsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLSAgICAgICAgaWYobW9kdWxlS2V5ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpLCBtb2R1bGVLZXkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnNXaXRoKHByb3BlcnRpZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnNXaXRoKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmxhenlJbml0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHJldHVybiB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5nZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnNXaXRoKHByb3BlcnRpZXMpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyPiBnZXRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIgcHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcikKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMuYWRkKHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogSW5mb3JtYXRpb25Qcm92aWRlckJlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dEhlbHBlci5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogU3RhdGljQ29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBnZXRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcyBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKCF0aGlzLnN0YXRpY0NvbmZpZ01hcC5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gc3RhdGljQ29uZmlnTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgICAgICB0aGlzLnN0YXRpY0NvbmZpZ01hcC5wdXQobmFtZSwgc3RhdGljQ29uZmlnTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGljQ29uZmlnTWFwLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcyBuYW1lLCBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IHN0YXRpY0NvbmZpZ0xpc3Q7Ci0gICAgICAgICAgICBpZiAoIXRoaXMuc3RhdGljQ29uZmlnTWFwLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRpY0NvbmZpZ0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICAgICAgICAgIHRoaXMuc3RhdGljQ29uZmlnTWFwLnB1dChuYW1lLCBzdGF0aWNDb25maWdMaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMuc3RhdGljQ29uZmlnTWFwLmdldChuYW1lKS5hZGQoc3RhdGljQ29uZmlnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogR2xvYmFsIHByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRHbG9iYWxQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFkZEdsb2JhbFByb3BlcnR5KG5hbWUsIHZhbHVlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRHbG9iYWxQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIGZvcmNlT3ZlcnJpZGUpCi0gICAgewotICAgICAgICBpZiAodGhpcy5nbG9iYWxQcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWZvcmNlT3ZlcnJpZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oIm92ZXJyaWRlIGdsb2JhbCBwcm9wZXJ0eSAnIiArIG5hbWUgKyAiJyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoSnNmUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5EZXZlbG9wbWVudCkgJiYgdGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCJnbG9iYWwgcHJvcGVydHkgWyIgKyBuYW1lICsgIl0gYWRkZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuZ2xvYmFsUHJvcGVydGllcy5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2xvYmFsUHJvcGVydGllcy5nZXQobmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0SW50ZXJuYWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnRlcm5hbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJjZmQ1Yy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnRlcm5hbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIHgueC4zCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBFeHRWYWxDb250ZXh0SW50ZXJuYWxzCi17Ci0gICAgYm9vbGVhbiBpc0NvbXBvbmVudEluaXRpYWxpemF0aW9uQWN0aXZhdGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAhInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ09NUE9ORU5UX0lOSVRJQUxJWkFUSU9OKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQotICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGluaXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbihNYXAgYXBwbGljYXRpb25NYXApCi0gICAgewotICAgICAgICBMaXN0PFN0cmluZz4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4pOwotICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMuYWRkKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkNVU1RPTV9CRUFOKTsKLQotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbjsKLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChpbmZvcm1hdGlvblByb3ZpZGVyQmVhbiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uTWFwLnB1dChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUsIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnlUb0luaXRDdXN0b21Db25maWd1cmVkSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWUoYXBwbGljYXRpb25NYXApOwotCi0gICAgICAgIGlmIChhcHBsaWNhdGlvbk1hcC5jb250YWluc0tleShJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBhcHBsaWNhdGlvbk1hcC5nZXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkKLSAgICB2b2lkIHRyeVRvSW5pdEN1c3RvbUNvbmZpZ3VyZWRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZShNYXAgYXBwbGljYXRpb25NYXApCi0gICAgewotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBiZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpCi0gICAgICAgICAgICAgICAgLmdldEJlYW4oSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQ1VTVE9NX0JFQU4ucmVwbGFjZSgiLiIsICJfIikpOwotCi0gICAgICAgIGlmIChiZWFuICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uTWFwLnB1dChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUsIGJlYW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQotICAgIHsKLSAgICAgICAgTWFwIGFwcGxpY2F0aW9uTWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uTWFwKCk7Ci0gICAgICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGJlYW4gPSAoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4pIGFwcGxpY2F0aW9uTWFwLmdldChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUpOwotCi0gICAgICAgIGlmIChiZWFuID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbml0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oYXBwbGljYXRpb25NYXApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgZ2V0UmVxdWVzdFNjb3BlZFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoCi0gICAgICAgICAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuY2xhc3MsIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSkKLSAgICAgICAgICAgICAgICAuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0SW52b2NhdGlvbk9yZGVyQXdhcmVJbnRlcm5hbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5MzY2Yy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSB4LnguMwotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBNYXA8Q2xhc3MsIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+PiBtb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4gdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPSBudWxsOwotICAgIHByaXZhdGUgTWFwPENsYXNzLCBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPj4gbW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPSBudWxsOwotICAgIHByaXZhdGUgTGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4gY29tcG9uZW50SW5pdGlhbGl6ZXJzID0gbnVsbDsKLQotICAgIHByaXZhdGUgRXh0VmFsQ29udGV4dEludGVybmFscyBjb250ZXh0SGVscGVyOwotCi0gICAgRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzKEV4dFZhbENvbnRleHRJbnRlcm5hbHMgY29udGV4dEhlbHBlcikKLSAgICB7Ci0gICAgICAgIHRoaXMuY29udGV4dEhlbHBlciA9IGNvbnRleHRIZWxwZXI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDb21wb25lbnRJbml0aWFsaXplcnMKLSAgICAgKi8KLSAgICB2b2lkIGFkZENvbXBvbmVudEluaXRpYWxpemVyKENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyKQotICAgIHsKLSAgICAgICAgdGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMuYWRkKGNvbXBvbmVudEluaXRpYWxpemVyKTsKLSAgICAgICAgc29ydENvbXBvbmVudEluaXRpYWxpemVycygpOwotICAgIH0KLQotICAgIExpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+IGdldENvbXBvbmVudEluaXRpYWxpemVycygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0SGVscGVyLmlzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25BY3RpdmF0ZWQoKSA/Ci0gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMgOiBuZXcgQXJyYXlMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPigpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycwotICAgICAqLwotICAgIHZvaWQgYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMuYWRkKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgIHNvcnRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgfQotCi0gICAgTGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+IGdldFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycwotICAgICAqLwotICAgIHZvaWQgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBpZiAocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uTW9kdWxlQXdhcmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlcyhwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgICAgICBzb3J0TW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlKG51bGwsIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsKLSAgICAgICAgICAgIHNvcnRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IGdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzRm9yKENsYXNzIG1vZHVsZUtleSkKLSAgICB7Ci0gICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+KCk7Ci0KLSAgICAgICAgcmVzdWx0LmFkZEFsbChnZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKSk7Ci0KLSAgICAgICAgaWYgKG1vZHVsZUtleSAhPSBudWxsICYmIHRoaXMubW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMuY29udGFpbnNLZXkobW9kdWxlS2V5KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0aGlzLm1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzLmdldChtb2R1bGVLZXkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdChyZXN1bHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckZvck1vZHVsZXMoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBDbGFzcyBtb2R1bGVLZXk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGN1cnJlbnRNb2R1bGVLZXkgOiAoKFZhbGlkYXRpb25Nb2R1bGVBd2FyZSkgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpLmdldE1vZHVsZUtleXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbW9kdWxlS2V5ID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUoY3VycmVudE1vZHVsZUtleSk7Ci0KLSAgICAgICAgICAgIGlmIChtb2R1bGVLZXkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUobW9kdWxlS2V5LCBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUoCi0gICAgICAgICAgICBDbGFzcyBtb2R1bGVLZXksIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgaWYgKG1vZHVsZUtleSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5hZGQocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCBhcyBnbG9iYWwgaW50ZXJjZXB0b3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdDsKLSAgICAgICAgICAgIGlmICh0aGlzLm1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzLmNvbnRhaW5zS2V5KG1vZHVsZUtleSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0ID0gdGhpcy5tb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5nZXQobW9kdWxlS2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPigpOwotICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMucHV0KG1vZHVsZUtleSwgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdC5hZGQocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCBmb3IgIiArIG1vZHVsZUtleS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMKLSAgICAgKi8KLSAgICB2b2lkIGFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgaWYobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uTW9kdWxlQXdhcmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlcyhtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgICAgICBzb3J0TW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlKG51bGwsIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsKLSAgICAgICAgICAgIHNvcnRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckZvck1vZHVsZXMoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBDbGFzcyBtb2R1bGVLZXk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGN1cnJlbnRNb2R1bGVLZXkgOiAoKFZhbGlkYXRpb25Nb2R1bGVBd2FyZSkgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpLmdldE1vZHVsZUtleXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbW9kdWxlS2V5ID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUoY3VycmVudE1vZHVsZUtleSk7Ci0KLSAgICAgICAgICAgIGlmIChtb2R1bGVLZXkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUobW9kdWxlS2V5LCBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUoCi0gICAgICAgICAgICBDbGFzcyBtb2R1bGVLZXksIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgaWYgKG1vZHVsZUtleSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5hZGQobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCBhcyBnbG9iYWwgaW50ZXJjZXB0b3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdDsKLSAgICAgICAgICAgIGlmICh0aGlzLm1vZHVsZVNwZWNpZmljTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLmNvbnRhaW5zS2V5KG1vZHVsZUtleSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0ID0gdGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5nZXQobW9kdWxlS2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QgPSBuZXcgQXJyYXlMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPigpOwotICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMucHV0KG1vZHVsZUtleSwgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdC5hZGQobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCBmb3IgIiArIG1vZHVsZUtleS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnNXaXRoKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+KCk7Ci0KLSAgICAgICAgcmVzdWx0LmFkZEFsbChnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKSk7Ci0KLSAgICAgICAgQ2xhc3MgbW9kdWxlS2V5ID0gdHJ5VG9SZXNvbHZlTW9kdWxlS2V5KHByb3BlcnRpZXMpOwotICAgICAgICBpZihtb2R1bGVLZXkgIT0gbnVsbCAmJiB0aGlzLm1vZHVsZVNwZWNpZmljTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLmNvbnRhaW5zS2V5KG1vZHVsZUtleSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5nZXQobW9kdWxlS2V5KSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdChyZXN1bHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ2xhc3MgdHJ5VG9SZXNvbHZlTW9kdWxlS2V5KE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIENsYXNzIG1vZHVsZUtleSA9IG51bGw7Ci0gICAgICAgIGlmKHByb3BlcnRpZXMgIT0gbnVsbCAmJiBwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IGZvdW5kVmFsdWUgPSBwcm9wZXJ0aWVzLmdldChWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBpZihmb3VuZFZhbHVlIGluc3RhbmNlb2YgQ2xhc3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9kdWxlS2V5ID0gKENsYXNzKWZvdW5kVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1vZHVsZUtleTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGluaXQKLSAgICAgKi8KLQotICAgIHZvaWQgbGF6eUluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGlmICh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMgPSBuZXcgQXJyYXlMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4oKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SKTsKLSAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQodGhpcy5jb250ZXh0SGVscGVyLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IpKTsKLQotICAgICAgICBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lIDogdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yID0KLSAgICAgICAgICAgICAgICAgICAgKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzLmFkZCh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGxhenlJbml0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4oKTsKLSAgICAgICAgbW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMgPSBuZXcgSGFzaE1hcDxDbGFzcywgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4+KCk7Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUik7Ci0gICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQodGhpcy5jb250ZXh0SGVscGVyLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IpKTsKLQotICAgICAgICBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsKLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSA6IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgPQotICAgICAgICAgICAgICAgICAgICAoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUpOwotCi0gICAgICAgICAgICBpZiAobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGxhenlJbml0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCkKLSAgICB7Ci0gICAgICAgIGlmIChjb21wb25lbnRJbml0aWFsaXplcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4oKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZCh0aGlzLmNvbnRleHRIZWxwZXIuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX0lOSVRJQUxJWkVSKSk7Ci0KLSAgICAgICAgQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXI7Ci0gICAgICAgIGZvciAoU3RyaW5nIGNvbXBvbmVudEluaXRpYWxpemVyTmFtZSA6IGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXIgPQotICAgICAgICAgICAgICAgICAgICAoQ29tcG9uZW50SW5pdGlhbGl6ZXIpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjb21wb25lbnRJbml0aWFsaXplck5hbWUpOwotCi0gICAgICAgICAgICBpZiAoY29tcG9uZW50SW5pdGlhbGl6ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKGNvbXBvbmVudEluaXRpYWxpemVyKTsKLQotICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShjb21wb25lbnRJbml0aWFsaXplci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGxhenlJbml0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4oKTsKLSAgICAgICAgbW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPSBuZXcgSGFzaE1hcDxDbGFzcywgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4+KCk7Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICB2YWxpZGF0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1BST1BFUlRZX1ZBTElEQVRJT05fSU5URVJDRVBUT1IpOwotICAgICAgICB2YWxpZGF0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZCh0aGlzLmNvbnRleHRIZWxwZXIuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5QUk9QRVJUWV9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SKSk7Ci0KLSAgICAgICAgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25JbnRlcmNlcHRvck5hbWUgOiB2YWxpZGF0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgIChQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodmFsaWRhdGlvbkludGVyY2VwdG9yTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBpbnN0YW5jZW9mIFZhbGlkYXRpb25Nb2R1bGVBd2FyZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlcyhwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlKG51bGwsIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHNvcnQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc29ydENvbXBvbmVudEluaXRpYWxpemVycygpCi0gICAgewotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRoaXMuY29tcG9uZW50SW5pdGlhbGl6ZXJzLCBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxDb21wb25lbnRJbml0aWFsaXplcj4oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNvcnRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0aGlzLnByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycywKLSAgICAgICAgICAgICAgICBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4oKSk7Ci0gICAgfQotCi0gICAgLy9zb3J0IGFsbCAtIGl0IGlzbid0IGEgaHVnZSBvdmVyaGVhZCBzaW5jZSBpdCdzIGp1c3QgZG9uZSBkdXJpbmcgdGhlIGluaXQtcGhhc2UKLSAgICBwcml2YXRlIHZvaWQgc29ydE1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGZvcihMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QgOgotICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMudmFsdWVzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNvcnRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdCgKLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdCkKLSAgICB7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0LAotICAgICAgICAgICAgICAgICAgICBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4oKSk7Ci0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc29ydFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMsCi0gICAgICAgICAgICAgICAgbmV3IEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRoaXMubWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLAotICAgICAgICAgICAgICAgIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPigpKTsKLSAgICB9Ci0KLSAgICAvL3NvcnQgYWxsIC0gaXQgaXNuJ3QgYSBodWdlIG92ZXJoZWFkIHNpbmNlIGl0J3MganVzdCBkb25lIGR1cmluZyB0aGUgaW5pdC1waGFzZQotICAgIHByaXZhdGUgdm9pZCBzb3J0TW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgZm9yKExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdCA6Ci0gICAgICAgICAgICAgICAgdGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy52YWx1ZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBzb3J0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0KAotICAgICAgICAgICAgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0KQotICAgIHsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPigpKTsKLQotICAgICAgICByZXR1cm4gbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NTg3YTUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFyZW4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICogKyBzb21lIG9mIHRoZW0gY2FuIGJlIGN1c3RvbWl6ZWQgd2l0aGluIGEgY3VzdG9tIGltcGwuIG9mIHRoZSBiZWFuDQotICogKGV4dGVuZCB0aGlzIGNsYXNzIGFuZCBwcm92aWRlIGl0IHZpYSBjb252ZW50aW9uIG9yIHdlYi54bWwpDQotICogPHAvPg0KLSAqIHRoZSBzdGF0aWMgYXBpIHNob3VsZCBvbmx5IGJlIHVzZWQNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSSwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVBTl9OQU1FID0gRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUNCi0gICAgICAgICsgIi4iICsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICAvL2N1c3RvbSBjbGFzcyB3aGljaCBpcyBhbiBvcHRpb25hbCByZXBsYWNlbWVudCBmb3IgdGhpcyBjbGFzcyAoaGFzIHRvIGV4dGVuZCB0aGlzIGNsYXNzKQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQkVBTiA9IChFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRQ0KLSAgICAgICAgKyAiLmN1c3RvbS4iICsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsNCi0NCi0gICAgcHVibGljIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHNldHVwQ3VzdG9taXphYmxlSW5mb3JtYXRpb24oKTsNCi0gICAgICAgIGFwcGx5Q3VzdG9tVmFsdWVzKHRoaXMuY3VzdG9taXphYmxlSW5mb3MpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPEN1c3RvbUluZm9ybWF0aW9uLCBTdHJpbmc+IGN1c3RvbWl6YWJsZUluZm9zID0gbmV3IEhhc2hNYXA8Q3VzdG9tSW5mb3JtYXRpb24sIFN0cmluZz4oKTsNCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwQ3VzdG9taXphYmxlSW5mb3JtYXRpb24oKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgYmFzZVBhY2thZ2UgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0JBU0VfUEFDS0FHRTsNCi0NCi0gICAgICAgIGlmIChiYXNlUGFja2FnZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VQYWNrYWdlID0gRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgKyAiLmN1c3RvbS4iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFiYXNlUGFja2FnZS5lbmRzV2l0aCgiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VQYWNrYWdlID0gYmFzZVBhY2thZ2UgKyAiLiI7DQotICAgICAgICB9DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQkFTRV9QQUNLQUdFLCBiYXNlUGFja2FnZSk7DQotICAgICAgICANCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiwNCi0gICAgICAgICAgICAgICAgIkNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFUcmFuc2Zvcm1lciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX0lOSVRJQUxJWkVSLA0KLSAgICAgICAgICAgICAgICAiQ29tcG9uZW50SW5pdGlhbGl6ZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlBST1BFUlRZX1ZBTElEQVRJT05fSU5URVJDRVBUT1IsDQotICAgICAgICAgICAgICAgICJQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01TR19SRVNPTFZFUl9OQU1FX01BUFBFUiwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIsDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVJUVVBfTElTVEVORVIsDQotICAgICAgICAgICAgICAgICJTdGFydHVwTGlzdGVuZXIiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkZBQ0VTX01FU1NBR0VfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIkZhY2VzTWVzc2FnZUZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIlN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSIpOw0KLQ0KLSAgICAgICAgLy9jb252ZW50aW9ucyAodGhlIHJlc3Qgb2YgdGhlIGNvbnZlbnRpb25zIGFyZSBidWlsdCB3aXRoIHRoZSBoZWxwIG9mIG5hbWUgbWFwcGVycywuLi4NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX0JVTkRMRV9OQU1FLA0KLSAgICAgICAgICAgICAgICAidmFsaWRhdGlvbl9tZXNzYWdlcyIpOw0KLSAgICAgICAgLy9zdGF0aWMgc3RyYXRlZ3kgbWFwcGluZ3MgKG5hbWUgb2YgcHJvcGVydHkgZmlsZXMpDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFLA0KLSAgICAgICAgICAgICAgICAic3RyYXRlZ3lfbWFwcGluZ3MiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIsDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIiKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pDQotICAgIHByb3RlY3RlZCB2b2lkIGFwcGx5Q3VzdG9tVmFsdWVzKE1hcDxDdXN0b21JbmZvcm1hdGlvbiwgU3RyaW5nPiBtYXApDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgdG8gY3VzdG9taXplIGluZm9ybWF0aW9uDQotICAgIH0NCi0NCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXQoQ3VzdG9tSW5mb3JtYXRpb24gY3VzdG9tSW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGN1c3RvbWl6YWJsZUluZm9zLmdldChjdXN0b21JbmZvcm1hdGlvbik7DQotDQotICAgICAgICBzd2l0Y2ggKGN1c3RvbUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNhc2UgQkFTRV9QQUNLQUdFOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgKiBwb3N0Zml4IHVzZWQgYnkgdGhlIFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi0gICAgICAgICAgICAgKiB0aGUgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBpcyBmb3IgY3VzdG9tIHN0cmF0ZWdpZXMgb25seQ0KLSAgICAgICAgICAgICAqIChub3QgZm9yIHB1YmxpYyB2YWxpZGF0aW9uIG1vZHVsZXMpDQotICAgICAgICAgICAgICogc28gaXQncyBmaW5lIHRvIGN1c3RvbWl6ZSBpdA0KLSAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgY2FzZSBWQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVg6DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0NCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9taXphYmxlSW5mb3MuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkJBU0VfUEFDS0FHRSkgKyB2YWx1ZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOWY4NjkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2R1bGVNZXNzYWdlQnVuZGxlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuZXdQYWNrYWdlTmFtZTsNCi0gICAgICAgIGlmIChwYWNrYWdlTmFtZS5lbmRzV2l0aCgiLnJlc29sdmVyIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgbmV3UGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZS5yZXBsYWNlKCIucmVzb2x2ZXIiLCAiLmJ1bmRsZSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5ld1BhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUucmVwbGFjZSgiLnJlc29sdmVyLiIsICIuYnVuZGxlLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG5ld1BhY2thZ2VOYW1lICsgIi52YWxpZGF0aW9uX21lc3NhZ2VzIjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKA0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsICIubWVzc2FnZS5yZXNvbHZlci4iLCB0YXJnZXRDbGFzc05hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoDQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgU3RyaW5nIHRhcmdldENsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgIi5tZXRhZGF0YS50cmFuc2Zvcm1lci4iLCB0YXJnZXRDbGFzc05hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UGFja2FnZU5hbWUsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXROYW1lKCk7DQotDQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUucmVwbGFjZSgiLnN0cmF0ZWd5LiIsIHRhcmdldFBhY2thZ2VOYW1lKTsNCi0NCi0gICAgICAgIGlmICh0YXJnZXRDbGFzc05hbWUgPT0gbnVsbCB8fCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSkgKyAiLiIgKyB0YXJnZXRDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHVzZSBhIGN1c3RvbSBuYW1lIG1hcHBlciB0byBpbXBsZW1lbnQgY3VzdG9tIGNvbnZlbnRpb25zDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgIlZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB1c2UgYSBjdXN0b20gbmFtZSBtYXBwZXIgdG8gaW1wbGVtZW50IGN1c3RvbSBjb252ZW50aW9ucw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5LnJlcGxhY2UoIi5hbm5vdGF0aW9uLiIsICIuc3RyYXRlZ3kuIikgKyAiU3RyYXRlZ3kiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgIk1ldGFEYXRhVHJhbnNmb3JtZXIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0YXJnZXRQb3N0Zml4KQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5lbmRzV2l0aCgiVmFsaWRhdGlvblN0cmF0ZWd5IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneU5hbWUuc3Vic3RyaW5nKDAsIHZhbGlkYXRpb25TdHJhdGVneU5hbWUubGVuZ3RoKCkgLSAxOCkgKyB0YXJnZXRQb3N0Zml4Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5lbmRzV2l0aCgiU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5zdWJzdHJpbmcoMCwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5sZW5ndGgoKSAtIDgpICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VkYjlhMC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7DQotDQotQFRhcmdldChUWVBFKQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLS8qKg0KLSAqIGFsbG93ZWQgdG8gdXNlIGZvciBjbGFzc2VzIHdoaWNoIGltcGxlbWVudCBpbnRlcmZhY2VzIHdoaWNoIGhhdmUgdGhlIG1hcmtlciBASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLSAqDQotICogc3VnZ2VzdGVkIHJhbmdlcyAobWFpbmx5IGZvciBuYW1lLW1hcHBlcnMpOg0KLSAqIG5lZ2F0aXZlIHZhbHVlcyBmb3IgImV4dHJlbWUiIGNhc2VzDQotICoNCi0gKiAwLTQ5IGZvciBjdXN0b20gYXJ0aWZhY3RzIHdoaWNoIHNob3VsZCBoYXZlIHRoZSBoaWdoZXN0IHByaW9yaXR5DQotICogNTAtOTkgZm9yIGFkZC1vbnMgd2hpY2ggcHJvdmlkZSBhcnRpZmFjdHMgd2hpY2ggc2hvdWxkIGhhdmUgYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGUgZGVmYXVsdCBhcnRpZmFjdHMNCi0gKiAxMDAtOTk5IGludGVybmFsIGFydGlmYWN0cw0KLSAqIDEwMDArIGZvciBjdXN0b20gYXJ0aWZhY3RzDQotICoNCi0gKiBzdWdnZXN0ZWQgcmFuZ2VzIGZvciBhcnRpZmFjdHMgbGlrZSBpbnRlcmNlcHRvcnMsLi4uDQotICogMXh4IC4uLiBhcnRpZmFjdHMgb2YgdGhlIGNvcmUNCi0gKiAyeHggLi4uIGFydGlmYWN0cyBvZiB2YWxpZGF0aW9uIG1vZHVsZXMNCi0gKiAzeHggLi4uIGFydGlmYWN0cyBvZiBjb21wb25lbnQgc3VwcG9ydCBtb2R1bGVzDQotICoNCi0gKiBhIHByaW9yaXR5IHNob3VsZCBiZSB1bmlxdWUgd2l0aGluIG9uZSBhcnRpZmFjdC10eXBlIC0gdGhhdCBtZWFucw0KLSAqIGlmIGEgbmFtZS1tYXBwZXIgaGFzIHByaW9yaXR5IDEwMCwgaXQncyBvayB0aGF0IGFuIGV4Y2VwdGlvbi1pbnRlcmNlcHRvciBhbHNvIGhhcyBwcmlvcml0eSAxMDAuDQotICogYnV0IGEgMm5kIG5hbWUtbWFwcGVyIHNob3VsZG4ndCBoYXZlIHByaW9yaXR5IDEwMA0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgSW52b2NhdGlvbk9yZGVyDQotew0KLSAgICAvKioNCi0gICAgICogZGVmYXVsdCBwcmlvcml0eSBmb3IgY3VzdG9tIGFydGlmYWN0cyAoaWYgdGhleSBzaG91bGQgZ2V0IGFkZGVkIGFmdGVyIHRoZSBpbnRlcm5hbCB2ZXJzaW9ucw0KLSAgICAgKiBAcmV0dXJuIHRoZSBwcmlvcml0eSBvZiBhbiBhcnRpZmFjdCBhbm5vdGF0ZWQgd2l0aCB0aGlzIGFubm90YXRpb24NCi0gICAgICovDQotICAgIGludCB2YWx1ZSgpIGRlZmF1bHQgMTAwMDsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlckNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4NTUyMi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlckNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8VD4gaW1wbGVtZW50cyBDb21wYXJhdG9yPFQ+DQotew0KLSAgICBwdWJsaWMgaW50IGNvbXBhcmUoVCBubTEsIFQgbm0yKQ0KLSAgICB7DQotICAgICAgICBpZiAoaGFzUHJpb3JpdHkobm0xKSAmJiBoYXNQcmlvcml0eShubTIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBpc1ByaW9yaXR5SGlnaGVyKG5tMS5nZXRDbGFzcygpLmdldEFubm90YXRpb24oSW52b2NhdGlvbk9yZGVyLmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgIG5tMi5nZXRDbGFzcygpLmdldEFubm90YXRpb24oSW52b2NhdGlvbk9yZGVyLmNsYXNzKSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWhhc1ByaW9yaXR5KG5tMSkgJiYgIWhhc1ByaW9yaXR5KG5tMikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gaGFzUHJpb3JpdHkobm0xKSA/IC0xIDogMTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGludCBpc1ByaW9yaXR5SGlnaGVyKEludm9jYXRpb25PcmRlciBwcmlvcml0eTEsIEludm9jYXRpb25PcmRlciBwcmlvcml0eTIpDQotICAgIHsNCi0gICAgICAgIGlmIChwcmlvcml0eTEudmFsdWUoKSA9PSBwcmlvcml0eTIudmFsdWUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBwcmlvcml0eTEudmFsdWUoKSA8IHByaW9yaXR5Mi52YWx1ZSgpID8gLTEgOiAxOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNQcmlvcml0eShPYmplY3Qgbm0pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBubS5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoSW52b2NhdGlvbk9yZGVyLmNsYXNzKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlclN1cHBvcnQuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDM0ZTc5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi0NCi1AVGFyZ2V0KFRZUEUpDQotQERvY3VtZW50ZWQNCi0vKioNCi0gKiBtYXJrZXIgYW5ub3RhdGlvbiBmb3IgZWFzaWVyIHVzYWdlDQotICogaXQgbWFya3MgaW50ZXJmYWNlcyAtIGluc3RhbmNlcyBvZiBjbGFzc2VzIGltcGxlbWVudGluZyB0aGVzZSBpbnRlcmZhY2VzIHdpbGwgYmUgc29ydGVkDQotICogQHNlZSBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotew0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0pzZlByb2plY3RTdGFnZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Kc2ZQcm9qZWN0U3RhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc1ODkwYi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0pzZlByb2plY3RTdGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBwcm9qZWN0IHN0YWdlIGVxdWl2YWxlbnQgdG8ganNmIDIuMA0KLSAqIGV4dHZhbCAyLnggaGFzIGEgc3BlY2lhbCByZXNvbHZlciB3aGljaCByZWRpcmVjdHMgdGhlIGNhbGwgdG8gdGhlIG5ldyBqc2YgYXBpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBlbnVtIEpzZlByb2plY3RTdGFnZQ0KLXsNCi0gICAgRGV2ZWxvcG1lbnQoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZSgiRGV2ZWxvcG1lbnQiKSksDQotICAgIFVuaXRUZXN0KFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoIlVuaXRUZXN0IikpLA0KLSAgICBTeXN0ZW1UZXN0KFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoIlN5c3RlbVRlc3QiKSksDQotICAgIFByb2R1Y3Rpb24oUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZSgiUHJvZHVjdGlvbiIpKTsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0U3RhZ2VOYW1lIHZhbHVlOw0KLQ0KLSAgICBKc2ZQcm9qZWN0U3RhZ2UoUHJvamVjdFN0YWdlTmFtZSB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpcyhKc2ZQcm9qZWN0U3RhZ2UganNmUHJvamVjdFN0YWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUHJvamVjdFN0YWdlLmlzKGpzZlByb2plY3RTdGFnZS5nZXRWYWx1ZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvamVjdFN0YWdlTmFtZSBnZXRWYWx1ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnZhbHVlOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvTmVzdGVkLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL05lc3RlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDY5MWU4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvTmVzdGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi0NCi0vKioNCi0gKiBtYXJrZXIgYW5ub3RhdGlvbiBlLmcuIHRvIG1hcmsgc3ViLW5hbWUtbWFwcGVycw0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBOZXN0ZWQNCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUGhhc2VJZFJlY29yZGluZ1BoYXNlTGlzdGVuZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUGhhc2VJZFJlY29yZGluZ1BoYXNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY5NTU0Mi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1BoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5GYWNlc0luZm9ybWF0aW9uU3RvcmFnZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi0NCi0vKioNCi0gKiBlLmcuIHRvIGFsbG93IGluIG1ldGFkYXRhIGV4dHJhY3Rpb24gaW50ZXJjZXB0b3JzIHRvIGtub3cgaWYgdGhleSBhcmUgaW52b2tlZCBkdXJpbmcgdmFsaWRhdGlvbiBvcg0KLSAqIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbiAoaWYgbmVlZGVkKQ0KLSAqIGV4YW1wbGU6IGNsaWVudC1zaWRlIHZhbGlkYXRpb24gLSBzb21lIGZ1bmN0aW9uYWxpdHkgc2hvdWxkbid0IGJlIHByb2Nlc3NlZCBkdXJpbmcgcmVuZGVyaW5nDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQaGFzZUlkUmVjb3JkaW5nUGhhc2VMaXN0ZW5lciBpbXBsZW1lbnRzIFBoYXNlTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI3OTEyNDA1MTQwMTQ4Njc0NTdMOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgcGhhc2VFdmVudCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgcGhhc2VFdmVudCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UgZmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UgPSBFeHRWYWxVdGlscw0KLSAgICAgICAgICAgICAgICAuZ2V0U3RvcmFnZShGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5jbGFzcywgRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLnNldEN1cnJlbnRQaGFzZUlkKHBoYXNlRXZlbnQuZ2V0UGhhc2VJZCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuQU5ZX1BIQVNFOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKHRoaXMgPT0gbykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBQaGFzZUlkUmVjb3JkaW5nUGhhc2VMaXN0ZW5lcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhNDQ0ZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotLyoqDQotICogZXh0ZW5zaWJsZSBwcm9qZWN0IHN0YWdlIGltcGxlbWVudGF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0U3RhZ2UNCi17DQotICAgIHByaXZhdGUgUHJvamVjdFN0YWdlTmFtZSB2YWx1ZTsNCi0NCi0gICAgcHJpdmF0ZSBQcm9qZWN0U3RhZ2UoUHJvamVjdFN0YWdlTmFtZSB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdFN0YWdlTmFtZSBjcmVhdGVTdGFnZU5hbWUoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVQcm9qZWN0U3RhZ2VOYW1lKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdFN0YWdlIGNyZWF0ZVN0YWdlKFByb2plY3RTdGFnZU5hbWUgbmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBQcm9qZWN0U3RhZ2UobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzKFByb2plY3RTdGFnZU5hbWUgcHJvamVjdFN0YWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0Q3VycmVudFByb2plY3RTdGFnZSgpLmVxdWFscyhwcm9qZWN0U3RhZ2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFByb2plY3RTdGFnZU5hbWUgZ2V0Q3VycmVudFByb2plY3RTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIC8vc2V0IFByb2plY3RTdGFnZVJlc29sdmVyIHRvIG51bGwgdG8gdHdlYWsgdGhlIHBlcmZvcm1hbmNlDQotICAgICAgICBPYmplY3QgcHJvamVjdFN0YWdlUmVzb2x2ZXIgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0R2xvYmFsUHJvcGVydHkoUHJvamVjdFN0YWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGlmKHByb2plY3RTdGFnZVJlc29sdmVyIGluc3RhbmNlb2YgUHJvamVjdFN0YWdlUmVzb2x2ZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICgoUHJvamVjdFN0YWdlUmVzb2x2ZXIpcHJvamVjdFN0YWdlUmVzb2x2ZXIpLmdldEN1cnJlbnRQcm9qZWN0U3RhZ2UoKS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldERlZmF1bHRTdGFnZU5hbWUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvamVjdFN0YWdlTmFtZSBnZXRWYWx1ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnZhbHVlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvamVjdFN0YWdlTmFtZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VOYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMjJiODYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBQcm9qZWN0U3RhZ2VOYW1lDQotew0KLSAgICBTdHJpbmcgZ2V0TmFtZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZVJlc29sdmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NGYyN2EuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvamVjdFN0YWdlUmVzb2x2ZXINCi17DQotICAgIFByb2plY3RTdGFnZSBnZXRDdXJyZW50UHJvamVjdFN0YWdlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvVmFsaWRhdGlvbk1vZHVsZUF3YXJlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1ZhbGlkYXRpb25Nb2R1bGVBd2FyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTQyMGY1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvVmFsaWRhdGlvbk1vZHVsZUF3YXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGlmIGFuIGFydGlmYWN0ICh3aGljaCBzdXBwb3J0cyB0aGlzIGNvbmNlcHQpIHNob3VsZCBiZSB1c2VkIGp1c3QgZm9yIGEvc29tZSBzcGVjaWZpYyBtb2R1bGUocyksDQotICogdGhlIGFydGlmYWN0IGhhcyB0byBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvbk1vZHVsZUF3YXJlDQotew0KLSAgICAvKioNCi0gICAgICogZHVyaW5nIHRoZSByZWdpc3RyYXRpb24gcHJvY2VzcyB0aGUgaW5mb3JtYXRpb24gZ2V0cyBldmFsdWF0ZWQ8YnIvPg0KLSAgICAgKiBpbnN0ZWFkIG9mIGEgY2xhc3MgYXJyYXkgYSBzdHJpbmcgYXJyYXkgaXMgdXNlZCBzbyB0aGF0IGl0J3MgcG9zc2libGUgdG8gaW1wbGVtZW50DQotICAgICAqIGFuIGFydGlmYWN0IGZvciBkaWZmZXJlbnQgbW9kdWxlcy4gaWYgYW4gYWRkLW9uIHJlc3RyaWN0cyBhbiBhcnRpZmFjdCB0byBzcGVjaWZpYyBtb2R1bGVzLA0KLSAgICAgKiBub3QgYWxsIG1vZHVsZXMgaGF2ZSB0byBiZSB1c2VkIGJ5IHRoZSB3ZWJhcHAuIGlmIGEgbW9kdWxlIGtleSBpcyB1bmtub3duLCB0aGUgYXJ0aWZhY3Qgd29uJ3QgZ2V0IHJlZ2lzdGVyZWQNCi0gICAgICogZm9yIHRoaXMgbW9kdWxlLiBpZiBhbiBhcnRpZmFjdCBkb2Vzbid0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgaXQgZ2V0cyByZWdpc3RlcmVkIGZvciBhbGwgbW9kdWxlcw0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lcyBvZiB0aGUgbW9kdWxlIGtleXMNCi0gICAgICovDQotICAgIFN0cmluZ1tdIGdldE1vZHVsZUtleXMoKTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9WYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1ZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1MzQwZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1ZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLQ0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi0vKioNCi0gKiBtYXJrZXIgYW5ub3RhdGlvbiBmb3IgbW9kdWxlIGtleXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFZhbGlkYXRpb25Nb2R1bGVLZXkNCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTMxYWJlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcmVuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgLyoNCi0gICAgICogbWlzYw0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVTU0FHRV9CVU5ETEUgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVNTQUdFX0JVTkRMRSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX1BBQ0tBR0UgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9CQVNFX1BBQ0tBR0UiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fSU5GT1JNQVRJT05fUFJPVklERVJfQkVBTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OX1NUUkFURUdZX01BUFBJTkciKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fUFJPUEVSVFlfVkFMSURBVElPTl9JTlRFUkNFUFRPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1BST1BFUlRZX1ZBTElEQVRJT05fSU5URVJDRVBUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9QUk9YWV9IRUxQRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9QUk9YWV9IRUxQRVIiKTsNCi0NCi0gICAgLyoNCi0gICAgICogbmFtZSBtYXBwZXINCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIiKTsNCi0NCi0gICAgLyoNCi0gICAgICogZmlsdGVyDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIiKTsNCi0gICAgDQotICAgIC8qDQotICAgICAqIGZhY3Rvcmllcw0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9GQUNFU19NRVNTQUdFX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9GQUNFU19NRVNTQUdFX0ZBQ1RPUlkiKTsNCi0NCi0gICAgLyoNCi0gICAgICogYWN0aXZhdGUNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZBVEVfUkVRVUlSRURfSU5JVElBTElaQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkFDVElWQVRFX1JFUVVJUkVEX0lOSVRJQUxJWkFUSU9OIik7DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBkZWFjdGl2YXRlDQotICAgICAqLw0KLSAgICBARGVwcmVjYXRlZA0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfUkVOREVSS0lUID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1JFTkRFUktJVCIpOw0KLQ0KLSAgICAvL2N1cnJlbnRseSBqdXN0IHVzZWQgYnkgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0RFRkFVTFRfQ09OVkVOVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT04iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0RFRkFVTFRfTkFNRV9NQVBQRVJTID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0RFRkFVTFRfTkFNRV9NQVBQRVJTIik7DQotICAgIA0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfRUxfUkVTT0xWRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfRUxfUkVTT0xWRVIiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0NPTVBPTkVOVF9JTklUSUFMSVpBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9DT01QT05FTlRfSU5JVElBTElaQVRJT04iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX1ZBTElEQVRJT05fUEFSQU1FVEVSUyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9WQUxJREFUSU9OX1BBUkFNRVRFUlMiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX1JFTkRFUl9LSVRfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9SRU5ERVJfS0lUX0ZBQ1RPUlkiKTsNCi0NCi0gICAgLy90aGVyZSBpcyBub3RoaW5nIGxpa2UgREVBQ1RJVkFURV9ERUZBVUxUX1ZBTElEQVRJT05fSU5URVJDRVBUT1INCi0gICAgLy91c2UgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZGVueVJlbmRlcmVySW50ZXJjZXB0b3IoLi4uKSB3aXRoaW4gYW4gZXh0dmFsLVN0YXJ0dXBMaXN0ZW5lcg0KLQ0KLSAgICAvKg0KLSAgICAgKiBzcGVjIHBhcmFtZXRlcnMNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJQUkVUX0VNUFRZX1NUUklOR19TVUJNSVRURURfVkFMVUVTX0FTX05VTEwgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoImphdmF4LmZhY2VzIiwgIklOVEVSUFJFVF9FTVBUWV9TVFJJTkdfU1VCTUlUVEVEX1ZBTFVFU19BU19OVUxMIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVEVfRU1QVFlfRklFTERTID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJqYXZheC5mYWNlcyIsICJWQUxJREFURV9FTVBUWV9GSUVMRFMiKTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9BYnN0cmFjdEVMSGVscGVyRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9BYnN0cmFjdEVMSGVscGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTQzZjI1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBkZXRhaWxzDQotICogQHNlZSBEZWZhdWx0RUxIZWxwZXINCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5IGN1c3RvbUVMSGVscGVyRmFjdG9yeTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21FTEhlbHBlckZhY3RvcnkoQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkgZWxIZWxwZXJGYWN0b3J5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmN1c3RvbUVMSGVscGVyRmFjdG9yeSA9IGVsSGVscGVyRmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgZmluYWwgRUxIZWxwZXIgY3JlYXRlKCkNCi0gICAgew0KLSAgICAgICAgRUxIZWxwZXIgcmVzdWx0ID0gbnVsbDsNCi0NCi0gICAgICAgIGlmKHRoaXMuY3VzdG9tRUxIZWxwZXJGYWN0b3J5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5jdXN0b21FTEhlbHBlckZhY3RvcnkuY3JlYXRlRUxIZWxwZXIoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVFTEhlbHBlcigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRUxIZWxwZXIgY3JlYXRlRUxIZWxwZXIoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMGU4MzYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsNCi1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7DQotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBpbiBvcmRlciB0byBjZW50cmFsaXplIHRoZSBqc2YgdmVyc2lvbiBkZXBlbmRlbmN5IHdpdGhpbiB0aGUgY29yZQ0KLSAqDQotICogdGhpcyBlbC1oZWxwZXIgc3VwcG9ydHMganNwIGFuZCBmYWNlbGV0cyAodGVzdGVkIHdpdGggMS4xLjE0KQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotLyoNCi0gKiB0aGVyZSBpcyBhIHNwZWNpYWwgZmFjZWxldHMgd29ya2Fyb3VuZCBmb3IgZWwtZXhwcmVzc2lvbnMgb2YgY3VzdG9tIGNvbXBvbmVudHMNCi0gKiBpdCdzIHBsdWdnYWJsZSBpbiBvcmRlciB0byBzdXBwb3J0IHNwZWNpYWwgbWVjaGFuaXNtcyBvZiBkaWZmZXJlbnQgdGVjaG5vbG9naWVzICh0aGFuIGpzcCBhbmQgZmFjZWxldHMpDQotICogc28geW91IGNhbiBwbHVnIGluIHlvdXIgb3duIGltcGwuIHdoaWNoIGltcGxlbWVudHMgYSBjdXN0b20gd29ya2Fyb3VuZCAobGlrZSB0aGUgZmFjZWxldHMgd29ya2Fyb3VuZCBvZiB0aGlzIGltcGwuKQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRFTEhlbHBlciBpbXBsZW1lbnRzIEVMSGVscGVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9FTF9SRVNPTFZFUiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0VMX1JFU09MVkVSOw0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdEVMSGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIC8vZHVlIHRvIGEgcmVzdHJpY3Rpb24gd2l0aCB0aGUgcmkNCi0gICAgICAgIE9iamVjdCBiZWFuID0gZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIHJldHVybiAoYmVhbiAhPSBudWxsKSA/IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoYmVhbi5nZXRDbGFzcygpKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRCZWFuKFN0cmluZyBiZWFuTmFtZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIHJldHVybiBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5nZXRFTFJlc29sdmVyKCkuZ2V0VmFsdWUoZmFjZXNDb250ZXh0LmdldEVMQ29udGV4dCgpLCBudWxsLCBiZWFuTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uICE9IG51bGwpID8gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZXZhbHVhdGVFeHByZXNzaW9uR2V0KA0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksIE9iamVjdC5jbGFzcykgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmV2YWx1YXRlRXhwcmVzc2lvbkdldChmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIE9iamVjdC5jbGFzcyk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQsIGJvb2xlYW4gYWxsb3dCbGFua0NoYXJhY3RlcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIC8vZm9yIGlucHV0IGNvbXBvbmVudHMgd2l0aG91dCB2YWx1ZS1iaW5kaW5nDQotICAgICAgICAvLyhlLmcuIGZvciBzcGVjaWFsIGNvbXBvbmVudCBsaWJzIC0+IGlzc3VlIHdpdGggRXh0VmFsUmVuZGVyZXJXcmFwcGVyI2VuY29kZUJlZ2luKQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudC5nZXRDbGFzcygpICsgIiBoYXMgbm8gdmFsdWUgYmluZGluZyAtIGNvbXBvbmVudCBpZDogIiArIHVpQ29tcG9uZW50LmdldElkKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKCFhbGxvd0JsYW5rQ2hhcmFjdGVycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlKCIgIiwgIiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pLmdldEJhc2VFeHByZXNzaW9uKCkpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXN1bHQgPSBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuDQotICAgICAgICAgICAgICAgIHRyeVRvQ3JlYXRlVmFsdWVCaW5kaW5nRm9yRmFjZWxldHNCaW5kaW5nKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCByZXNvbHZlIGV4cHJlc3Npb246ICIgKyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgIC5nZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgcmVzdWx0LmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLQ0KLSAgICAgICAgICAgIGlmKGVudGl0eUNsYXNzID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgcmVzb2x2ZSBleHByZXNzaW9uOiAiICsgcmVzdWx0LmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYoInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoREVBQ1RJVkFURV9FTF9SRVNPTFZFUikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5RGV0YWlsc1ZpYVJlZmxlY3Rpb25GYWxsYmFjayh1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgRXh0VmFsRUxSZXNvbHZlciBlbFJlc29sdmVyID0gbmV3IEV4dFZhbEVMUmVzb2x2ZXIoZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZ2V0RUxSZXNvbHZlcigpKTsNCi0gICAgICAgIEVMQ29udGV4dCBlbENvbnRleHQgPSBFeHRWYWxFTFJlc29sdmVyLmNyZWF0ZUNvbnRleHRXcmFwcGVyKGZhY2VzQ29udGV4dC5nZXRFTENvbnRleHQoKSwgZWxSZXNvbHZlcik7DQotDQotICAgICAgICBWYWx1ZUV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uID0gdWlDb21wb25lbnQuZ2V0VmFsdWVFeHByZXNzaW9uKCJ2YWx1ZSIpOw0KLQ0KLSAgICAgICAgaWYodmFsdWVFeHByZXNzaW9uID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWx1ZUV4cHJlc3Npb24uc2V0VmFsdWUoZWxDb250ZXh0LCBudWxsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAiZXJyb3IgYXQgYmluZGluZzogIiArIHZhbHVlRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkgKw0KLSAgICAgICAgICAgICAgICAiIC0tIGFuIGVsLXJlc29sdmVyIGVycm9yIG9jY3VycmVkISBtYXliZSB5b3UgdXNlZCBhbiBpbnZhbGlkIGJpbmRpbmcuIG90aGVyd2lzZTogIiArDQotICAgICAgICAgICAgICAgICJwbGVhc2UgcmVwb3J0IHRoZSBpc3N1ZSwgZGVhY3RpdmF0ZSB0aGUgZWwtcmVzb3ZsZXIgb2YgZXh0dmFsIHZpYSB3ZWIueG1sIGNvbnRleHQtcGFyYW06ICIgKw0KLSAgICAgICAgICAgICAgICBFeHRWYWxJbmZvcm1hdGlvbi5XRUJYTUxfUEFSQU1fUFJFRklYICsgIi5ERUFDVElWQVRFX0VMX1JFU09MVkVSIiArDQotICAgICAgICAgICAgICAgICIgYW5kIHRlc3QgYWdhaW4uIiwgdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihlbFJlc29sdmVyLmdldFBhdGgoKSA9PSBudWxsIHx8IGVsUmVzb2x2ZXIuZ2V0QmFzZU9iamVjdCgpID09IG51bGwgfHwgZWxSZXNvbHZlci5nZXRQcm9wZXJ0eSgpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscyhlbFJlc29sdmVyLmdldFBhdGgoKSwgZWxSZXNvbHZlci5nZXRCYXNlT2JqZWN0KCksIGVsUmVzb2x2ZXIuZ2V0UHJvcGVydHkoKSk7DQotICAgIH0NCi0NCi0gICAgLy9rZWVwIGluIHN5bmMgd2l0aCBEZWZhdWx0RUxIZWxwZXIjZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcgb2YgYnJhbmNoISEhDQotICAgIHByb3RlY3RlZCBQcm9wZXJ0eURldGFpbHMgZ2V0UHJvcGVydHlEZXRhaWxzVmlhUmVmbGVjdGlvbkZhbGxiYWNrKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gZ2V0VmFsdWVCaW5kaW5nRXhwcmVzc2lvbih1aUNvbXBvbmVudCwgZmFsc2UpOw0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9DQotICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHBhdGggPSBudWxsOw0KLQ0KLSAgICAgICAgd2hpbGUoY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHBhdGggPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHBhdGggPSBnZXRQcm9wZXJ0eU5hbWUoY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwYXRoID0gZ2V0UHJvcGVydHlOYW1lKGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKSArICIuIiArIHBhdGg7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBhdGggPSBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpICsgIi4iICsgcGF0aDsNCi0NCi0gICAgICAgIE9iamVjdCBiYXNlT2JqZWN0ID0gZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLQ0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGUuZy46ICN7YmVhbltiZWFuLnBhc3N3b3JkUmVwZWF0ZWRQcm9wZXJ0eU5hbWVdfQ0KLSAgICAgICAgLy8tPiBiZWFuLnBhc3N3b3JkUmVwZWF0ZWRQcm9wZXJ0eU5hbWUgaXMgbm90IHRoZSBmaW5hbCBwcm9wZXJ0eSBuYW1lDQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscyhwYXRoLCBiYXNlT2JqZWN0LCBnZXRQcm9wZXJ0eU5hbWUodmFsdWVCaW5kaW5nRXhwcmVzc2lvbikpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldFByb3BlcnR5TmFtZShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCk7DQotDQotICAgICAgICBpZihwcm9wZXJ0eU5hbWUuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBleHRyYWN0UHJvcGVydHlOYW1lT2ZQcm9wZXJ0eVBhdGgocHJvcGVydHlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInN1cHBvcnQgZm9yIG1vcmUgZHluYW1pYyBiaW5kaW5ncyAtIGRldGFpbHMgc2VlIGlubGluZSIpDQotICAgIHByaXZhdGUgU3RyaW5nIGV4dHJhY3RQcm9wZXJ0eU5hbWVPZlByb3BlcnR5UGF0aChTdHJpbmcgcHJvcGVydHlDaGFpbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nW10gcHJvcGVydGllcyA9IHByb3BlcnR5Q2hhaW4uc3BsaXQoIlxcLiIpOw0KLQ0KLSAgICAgICAgT2JqZWN0IGN1cnJlbnRQcm9wZXJ0eVZhbHVlID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKHByb3BlcnRpZXNbMF0pOw0KLQ0KLSAgICAgICAgTWV0aG9kIGN1cnJlbnRNZXRob2Q7DQotICAgICAgICBTdHJpbmcgY3VycmVudFByb3BlcnR5TmFtZTsNCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzc09mUHJvcGVydHlWYWx1ZTsNCi0gICAgICAgIGZvcihpbnQgaSA9IDE7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0aWVzW2ldOw0KLSAgICAgICAgICAgIGN1cnJlbnRDbGFzc09mUHJvcGVydHlWYWx1ZSA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudFByb3BlcnR5VmFsdWUuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgY3VycmVudE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZChjdXJyZW50Q2xhc3NPZlByb3BlcnR5VmFsdWUsDQotICAgICAgICAgICAgICAgICJnZXQiICsgY3VycmVudFByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIGN1cnJlbnRQcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpKTsNCi0NCi0gICAgICAgICAgICBpZihjdXJyZW50TWV0aG9kID09IG51bGwgJiYgY3VycmVudFByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBNYXApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL2l0J3Mgb2sgZm9yIHRoZSBzaW1wbGUgbWFwIGNhc2UgLSBidXQgbm90IGZvciBlLmcuOg0KLSAgICAgICAgICAgICAgICAvLyN7YmVhbjFbYmVhbjIucHJvcGVydHlOYW1lUHJvdmlkZXJbIGJlYW4zLmluZGV4XV19DQotICAgICAgICAgICAgICAgIC8vb3IgZXZlcnkgb3RoZXIgY29tcGxleCByZXBsYWNlbWVudCBmb3IgYmVhbjMuaW5kZXgNCi0gICAgICAgICAgICAgICAgLy9pdCBtaWdodCBhbHNvIHJlcXVpcmUgYW4gYWRqdXN0bWVudCBhdCBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIjdHJ5VG9UcmFuc2Zvcm1Ub1JlYWxCaW5kaW5nDQotICAgICAgICAgICAgICAgICgoTWFwKWN1cnJlbnRQcm9wZXJ0eVZhbHVlKS5nZXQoY3VycmVudFByb3BlcnR5TmFtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eVZhbHVlID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKGN1cnJlbnRQcm9wZXJ0eVZhbHVlLCBjdXJyZW50TWV0aG9kKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZihjdXJyZW50UHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFN0cmluZyljdXJyZW50UHJvcGVydHlWYWx1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoInVuZXhwZWN0ZWQgdmFsdWUgd2l0aGluIG1hcCBzeW50YXg6ICIgKyBwcm9wZXJ0eUNoYWluICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGxhc3QgcHJvcGVydHkgbmFtZTogIiArIGN1cnJlbnRQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgc3RhdGljIFN0cmluZyBnZXRPcmlnaW5hbFZhbHVlQmluZGluZ0V4cHJlc3Npb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFZhbHVlRXhwcmVzc2lvbiB2YWx1ZUV4cHJlc3Npb24gPSB1aUNvbXBvbmVudC5nZXRWYWx1ZUV4cHJlc3Npb24oInZhbHVlIik7DQotDQotICAgICAgICByZXR1cm4gKHZhbHVlRXhwcmVzc2lvbiAhPSBudWxsKSA/IHZhbHVlRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtV2VsbEZvcm1lZChPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBWYWx1ZUJpbmRpbmcgfHwgbyBpbnN0YW5jZW9mIEV4dGVybmFsaXphYmxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBzID0gby50b1N0cmluZygpOw0KLSAgICAgICAgcmV0dXJuICgocy5jb250YWlucygiIyIpIHx8IHMuY29udGFpbnMoIiQiKSkgJiYgcy5jb250YWlucygieyIpICYmIHMuY29udGFpbnMoIn0iKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRCaW5kaW5nT2ZDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQuZ2V0VmFsdWVFeHByZXNzaW9uKG5hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZmU1NmMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRFTEhlbHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeQ0KLXsNCi0gICAgcHJpdmF0ZSBFTEhlbHBlciBlbEhlbHBlciA9IG5ldyBEZWZhdWx0RUxIZWxwZXIoKTsNCi0gICAgDQotICAgIHByb3RlY3RlZCBFTEhlbHBlciBjcmVhdGVFTEhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmVsSGVscGVyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRUxIZWxwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRUxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGViMjU1My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogaW4gb3JkZXIgdG8gY2VudHJhbGl6ZSB0aGUganNmIHZlcnNpb24gZGVwZW5kZW5jeSB3aXRoaW4gdGhlIGNvcmUNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRUxIZWxwZXINCi17DQotICAgIE9iamVjdCBnZXRCZWFuKFN0cmluZyBiZWFuTmFtZSk7DQotDQotICAgIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLQ0KLSAgICBDbGFzcyBnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCk7DQotDQotICAgIGJvb2xlYW4gaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIGJvb2xlYW4gaXNFTFRlcm1XZWxsRm9ybWVkKE9iamVjdCBvKTsNCi0NCi0gICAgT2JqZWN0IGdldEJpbmRpbmdPZkNvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgU3RyaW5nIG5hbWUpOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0V4dFZhbEVMUmVzb2x2ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRXh0VmFsRUxSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzk4MDUwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRXh0VmFsRUxSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsKLQotaW1wb3J0IGphdmF4LmVsLkVMUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0OwotaW1wb3J0IGphdmF4LmVsLlZhcmlhYmxlTWFwcGVyOwotaW1wb3J0IGphdmF4LmVsLkZ1bmN0aW9uTWFwcGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS5iZWFucy5GZWF0dXJlRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbEVMUmVzb2x2ZXIgZXh0ZW5kcyBFTFJlc29sdmVyCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgRUxSZXNvbHZlciB3cmFwcGVkOwotICAgIHByaXZhdGUgT2JqZWN0IGJhc2VPYmplY3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7Ci0gICAgLy9mb3JtcyB0aGUgaWQgZm9yIGNyb3NzLXZhbGlkYXRpb24gd2l0aGluIGNvbXBsZXggY29tcG9uZW50cwotICAgIHByaXZhdGUgU3RyaW5nIGV4cHJlc3Npb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGF0aFJlY29yZGluZ1N0b3BwZWQgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBFeHRWYWxFTFJlc29sdmVyKEVMUmVzb2x2ZXIgZWxSZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IGVsUmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRCYXNlT2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgiZXh0cmFjdGVkIHBhdGg6ICIgKyB0aGlzLmV4cHJlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKQotICAgIHsKLSAgICAgICAgdGhpcy5iYXNlT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IG51bGw7Ci0gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcGF0aCByZWNvcmRpbmcgaXMgcGVyZm9ybWVkIHRvIGdldCBhIGtleSBmb3IgY3Jvc3MtdmFsaWRhdGlvbjxici8+Ci0gICAgICogZXZlcnkgYmFzZSBhZnRlciB0aGUgZmlyc3QgY2FsbCB3aGljaCBpcyBudWxsIHN0b3BzIHJlY29yZGluZzxici8+Ci0gICAgICogd2l0aCBhIGR5bmFtaWMgbWFwIHN5bnRheCB0aGUgbGFzdCBwcm9wZXJ0eSBpbiB0aGUgbWlkZGxlIG9mIGFuIGV4cHJlc3Npb24gaGFzIHRvIGJlIGEgc3RyaW5nLgotICAgICAqIHN1Y2ggYSBzdHJpbmcgcmVzdWx0IGNvbnRpbnVlcyB0aGUgcGF0aCByZWNvcmRpbmcgYXQgdGhlIG5leHQgY2FsbCBmb3IgdGhlIGN1cnJlbnQgZXhwcmVzc2lvbi4KLSAgICAgKiA8cC8+Ci0gICAgICogZXhhbXBsZTogI3tiZWFuW2JlYW4ucHJvcGVydHlOYW1lUHJvdmlkZXJbJ25hbWVPZlByb3BlcnR5MSddXVsnZHluQmVhbiddLnByb3BlcnR5fQotICAgICAqIDxwLz4KLSAgICAgKiBsaW1pdGF0aW9uIGZvciBjcm9zcy12YWxpZGF0aW9uOiBuYW1lT2ZQcm9wZXJ0eTEgaGFzIHRvIGJlIG9mIHR5cGUgc3RyaW5nLgotICAgICAqIG90aGVyIGtleSB0eXBlcyBhcmVuJ3Qgc3VwcG9ydGVkIHlldAotICAgICAqCi0gICAgICogQHBhcmFtIGVsQ29udGV4dCB3cmFwcGVkIGVsLWNvbnRleHQKLSAgICAgKiBAcGFyYW0gYmFzZSBjdXJyZW50IGJhc2UKLSAgICAgKiBAcGFyYW0gcHJvcGVydHkgcHJvcGVydHkgdG8gcmVzb2x2ZQotICAgICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBkZWxlZ2F0ZWQgbWV0aG9kIGNhbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBiYXNlLCBPYmplY3QgcHJvcGVydHkpCi0gICAgewotICAgICAgICBPYmplY3QgcmVzdWx0ID0gdGhpcy53cmFwcGVkLmdldFZhbHVlKGVsQ29udGV4dCwgYmFzZSwgcHJvcGVydHkpOwotCi0gICAgICAgIC8vdmVyeSBmaXJzdCBjYWxsIGZvciBhbiBleHByZXNzaW9uCi0gICAgICAgIGlmKHRoaXMuZXhwcmVzc2lvbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSAoU3RyaW5nKXByb3BlcnR5OwotICAgICAgICB9Ci0gICAgICAgIC8vI3tiZWFuW2R5bkJhc2UucHJvcGVydHlOYW1lXX0gLT4gYmFzZSBvZiBkeW5CYXNlIGlzIG51bGwgLT4gc3RvcCBwYXRoIHJlY29yZGluZwotICAgICAgICBlbHNlIGlmKGJhc2UgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pc1BhdGhSZWNvcmRpbmdTdG9wcGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gcHJvcGVydHlFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eS50b1N0cmluZygpOwotICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHlOYW1lLnN1YnN0cmluZygxKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoYmFzZSBpbnN0YW5jZW9mIE1hcCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCgoTWFwKWJhc2UpLmNvbnRhaW5zS2V5KHByb3BlcnR5KSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhiYXNlLmdldENsYXNzKCkpLmdldE1ldGhvZCgiZ2V0IiArIHByb3BlcnR5TmFtZSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKGJhc2UuZ2V0Q2xhc3MoKSkuZ2V0TWV0aG9kKCJpcyIgKyBwcm9wZXJ0eU5hbWUpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoInByb3BlcnR5OiAiICsgcHJvcGVydHkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzbid0IHVzZWQgZm9yIHBhdGggLSBpdCBpc24ndCBhIHByb3BlcnR5IG9mICIgKyBiYXNlLmdldENsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2UuZy46ICN7YmVhbi5zdWJCYXNlLnByb3BlcnR5fSAtPiBoZXJlIHdlIGFyZSBhdCBzdWJCYXNlCi0gICAgICAgICAgICBpZihwcm9wZXJ0eUV4aXN0cyAmJiAhdGhpcy5pc1BhdGhSZWNvcmRpbmdTdG9wcGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbiArPSAiLiIgKyBwcm9wZXJ0eTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYocHJvcGVydHlFeGlzdHMgJiYgcmVzdWx0IGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuaXNQYXRoUmVjb3JkaW5nU3RvcHBlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgaWYodGhpcy5pc1BhdGhSZWNvcmRpbmdTdG9wcGVkICYmIHJlc3VsdCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uICs9ICIuIiArIHByb3BlcnR5OwotICAgICAgICB9Ci0gICAgICAgICovCi0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0VHlwZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbywgT2JqZWN0IG8xKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0VHlwZShlbENvbnRleHQsIG8sIG8xKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbywgT2JqZWN0IG8xLCBPYmplY3QgbzIpCi0gICAgewotICAgICAgICBleHByZXNzaW9uICs9ICIuIiArIG8xOwotICAgICAgICBwcm9wZXJ0eSA9IChTdHJpbmcpbzE7Ci0gICAgICAgIGJhc2VPYmplY3QgPSBvOwotICAgICAgICBlbENvbnRleHQuc2V0UHJvcGVydHlSZXNvbHZlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvLCBPYmplY3QgbzEpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5pc1JlYWRPbmx5KGVsQ29udGV4dCwgbywgbzEpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxGZWF0dXJlRGVzY3JpcHRvcj4gZ2V0RmVhdHVyZURlc2NyaXB0b3JzKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0RmVhdHVyZURlc2NyaXB0b3JzKGVsQ29udGV4dCwgbyk7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzPD8+IGdldENvbW1vblByb3BlcnR5VHlwZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbykKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENvbW1vblByb3BlcnR5VHlwZShlbENvbnRleHQsIG8pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRUxDb250ZXh0IGNyZWF0ZUNvbnRleHRXcmFwcGVyKGZpbmFsIEVMQ29udGV4dCBjb250ZXh0LCBmaW5hbCBFTFJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFTENvbnRleHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRMb2NhbGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVJlc29sdmVkKGJvb2xlYW4gdmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuc2V0UHJvcGVydHlSZXNvbHZlZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRQcm9wZXJ0eVJlc29sdmVkKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwdXRDb250ZXh0KENsYXNzIGNsYXp6LCBPYmplY3Qgb2JqZWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyLnB1dENvbnRleHQoY2xhenosIG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5wdXRDb250ZXh0KGNsYXp6LCBvYmplY3QpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udGV4dChDbGFzcyBjbGF6eikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRDb250ZXh0KGNsYXp6KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvY2FsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlci5zZXRMb2NhbGUobG9jYWxlKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldExvY2FsZShsb2NhbGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBFTFJlc29sdmVyIGdldEVMUmVzb2x2ZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgRnVuY3Rpb25NYXBwZXIgZ2V0RnVuY3Rpb25NYXBwZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldEZ1bmN0aW9uTWFwcGVyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFZhcmlhYmxlTWFwcGVyIGdldFZhcmlhYmxlTWFwcGVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRWYXJpYWJsZU1hcHBlcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMmI4OWYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogSGVscGVyIGNsYXNzIHRvIGdldCB0aGUgcmVhbC9mdWxsIHZhbHVlIGJpbmRpbmcgLSB0ZXN0ZWQgd2l0aCBmYWNlbGV0cyAxLjEuMTQNCi0gKiBUaGUgdGFyZ2V0IGlzIHRvIGdldCByaWQgb2YgdGhpcyBpbXBsLiAtIGN1cnJlbnRseSBpdCdzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IGN1c3RvbSBmYWNlbGV0cyBjb21wb25lbnRzLg0KLSAqIEFuIGFsdGVybmF0aXZlIHdvdWxkIGJlIGFuIEVMLVJlc29sdmVyIC0gdGhlcmUgYXJlIHN0aWxsIHNvbWUgb3BlbiBpc3N1ZXMgd2l0aCBzdWNoIGFuIGFwcHJvYWNoDQotICogKyBJdCBpc24ndCBhdmFpbGFibGUgd2l0aCBKU0YgMS4xLngNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9DcmVhdGVWYWx1ZUJpbmRpbmdGb3JGYWNlbGV0c0JpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBEZWZhdWx0RUxIZWxwZXIuZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEJpbmRpbmdzID0gZXh0cmFjdEVMVGVybXMoDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmluZGluZ09mQ29tcG9uZW50KHVpQ29tcG9uZW50LCAidmFsdWUiKSk7DQotDQotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZT0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIDEpICsgInsiICsgY3JlYXRlQmluZGluZyhmb3VuZEJpbmRpbmdzLCBtYXBwZWRGYWNlbGV0c1ZhcnMpICsgIn0iKTsNCi0NCi0gICAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YmUuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotDQotICAgICAgICAgICAgaWYoZW50aXR5Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnlUb1JlcGxhY2VWYXJzKHZiZSwgbWFwcGVkRmFjZWxldHNWYXJzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHZiZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVCaW5kaW5nKExpc3Q8U3RyaW5nPiBleHByZXNzaW9ucywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkZWRWaXJ0dWFsTmFtZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGVudHJ5IDogZXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoIlZhbHVlRXhwcmVzc2lvblsiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBmb3VuZEJpbmRpbmdEZXRhaWxzID0gZW50cnkuc3BsaXQoIiAiKTsNCi0gICAgICAgICAgICBpbmRleE9mQmluZGluZ0RldGFpbHMgPSBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKGZvdW5kQmluZGluZ0RldGFpbHMpOw0KLQ0KLSAgICAgICAgICAgIGlmIChpbmRleE9mQmluZGluZ0RldGFpbHMgPT0gLTEpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgYmluZGluZ0RldGFpbHMgPSBmb3VuZEJpbmRpbmdEZXRhaWxzW2luZGV4T2ZCaW5kaW5nRGV0YWlsc10uc3BsaXQoIj0iKTsNCi0NCi0gICAgICAgICAgICBpZiAoYmluZGluZ0RldGFpbHMubGVuZ3RoIDwgMikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGJpbmRpbmdEZXRhaWxzWzFdOw0KLQ0KLSAgICAgICAgICAgIC8vdG8gc3VwcG9ydCBibGFua3Mgd2l0aGluIGEgYmluZGluZyB3aXRoIG1hcCBzeW50YXgNCi0gICAgICAgICAgICBpZihjdXJyZW50QmluZGluZy5jb250YWlucygieyIpICYmICFjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgPSBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKGN1cnJlbnRCaW5kaW5nLCBmb3VuZEJpbmRpbmdEZXRhaWxzLCBpbmRleE9mQmluZGluZ0RldGFpbHMpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnNLZXkoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5wdXQoYmluZGluZ0RldGFpbHNbMF0sIGN1cnJlbnRCaW5kaW5nKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvL2VudHJ5IGZvciAidmlydHVhbCIgZmFjZWxldHMgdmFyDQotICAgICAgICAgICAgaWYoIShjdXJyZW50QmluZGluZy5jb250YWlucygieyIpIHx8IGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhcnMucHV0KGJpbmRpbmdEZXRhaWxzWzBdLCBiaW5kaW5nRGV0YWlsc1sxXS5zdWJzdHJpbmcoMSwgYmluZGluZ0RldGFpbHNbMV0ubGVuZ3RoKCktMikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBvcmlnaW5hbEJpbmRpbmcgPSBhZGRlZFZpcnR1YWxOYW1lcy5nZXQoInZhbHVlIik7DQotICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcuc3Vic3RyaW5nKG9yaWdpbmFsQmluZGluZy5pbmRleE9mKCJ7IikgKyAxLCBvcmlnaW5hbEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLnJlbW92ZSgidmFsdWUiKTsNCi0gICAgICAgIHJldHVybiB0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcob3JpZ2luYWxCaW5kaW5nLCBhZGRlZFZpcnR1YWxOYW1lcywgdmlydHVhbFZhcnMpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcoDQotICAgICAgICAgICAgU3RyaW5nIG9yaWdpbmFsQmluZGluZywgTWFwPFN0cmluZywgU3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gIiN7IiArIG9yaWdpbmFsQmluZGluZyArICJ9IjsNCi0gICAgICAgIEl0ZXJhdG9yIG5hbWVJdGVyYXRvciA9IGFkZGVkVmlydHVhbE5hbWVzLmtleVNldCgpLml0ZXJhdG9yKCk7DQotDQotICAgICAgICBTdHJpbmcgY3VycmVudEtleTsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50VmFsdWU7DQotICAgICAgICB3aGlsZShuYW1lSXRlcmF0b3IuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRLZXkgPSAoU3RyaW5nKSBuYW1lSXRlcmF0b3IubmV4dCgpOw0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGFkZGVkVmlydHVhbE5hbWVzLmdldChjdXJyZW50S2V5KTsNCi0gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGN1cnJlbnRWYWx1ZS5pbmRleE9mKCJ7IikgKyAxLCBjdXJyZW50VmFsdWUuaW5kZXhPZigifSIpKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIi4iLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJ7IiArIGN1cnJlbnRLZXkgKyAiWyIsICJ7IiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICIuIiwgIi4iICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiLiIgKyBjdXJyZW50S2V5ICsgIlsiLCAiLiIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiXSIsICJbJyIgKyBjdXJyZW50VmFsdWUgKyAiJ10iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIlsiLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiLiIsICJbIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICB9DQotDQotICAgICAgICBuYW1lSXRlcmF0b3IgPSB2aXJ0dWFsVmFycy5rZXlTZXQoKS5pdGVyYXRvcigpOw0KLQ0KLSAgICAgICAgd2hpbGUobmFtZUl0ZXJhdG9yLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50S2V5ID0gKFN0cmluZykgbmFtZUl0ZXJhdG9yLm5leHQoKTsNCi0NCi0gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSB2aXJ0dWFsVmFycy5nZXQoY3VycmVudEtleSk7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoInsiICsgY3VycmVudEtleSArICIuIiwgInsiICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIlsiLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCIuIiArIGN1cnJlbnRLZXkgKyAiLiIsICIuIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICJbIiwgIi4iICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIl0iLCAiWyciICsgY3VycmVudFZhbHVlICsgIiddIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIlsiICsgY3VycmVudEtleSArICJbIiwgIlsiICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIi4iLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG9yaWdpbmFsQmluZGluZy5zdWJzdHJpbmcoMiwgb3JpZ2luYWxCaW5kaW5nLmxlbmd0aCgpIC0gMSk7DQotICAgIH0NCi0NCi0gICAgLy90byBzdXBwb3J0IGJsYW5rcyAtIGUuZy4gd2l0aCBtYXAgc3ludGF4DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKFN0cmluZyBjdXJyZW50QmluZGluZywgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlscykNCi0gICAgew0KLSAgICAgICAgZm9yKGludCBpID0gaW5kZXhPZkJpbmRpbmdEZXRhaWxzICsgMTsgaSA8IGZvdW5kQmluZGluZ0RldGFpbHMubGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgKz0gZm91bmRCaW5kaW5nRGV0YWlsc1tpXTsNCi0gICAgICAgICAgICBpZihmb3VuZEJpbmRpbmdEZXRhaWxzW2ldLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEJpbmRpbmc7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRCaW5kaW5nOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBpbnQgY291bnQgPSAwOw0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBiaW5kaW5nRGV0YWlscykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuY29udGFpbnMoIj0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY291bnQrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZXh0cmFjdEVMVGVybXMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlRUxUZXJtcyhvLCBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKSwgZm91bmRFTFRlcm1zLCAwKSA+IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRFTFRlcm1zOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcmVzb2x2ZUVMVGVybXMoT2JqZWN0IG8sIE1hcDxPYmplY3QsIE9iamVjdD4gdmlzaXRlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMsIGludCBjb3VudCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAobyA9PSBudWxsIHx8IHZpc2l0ZWQuY29udGFpbnNLZXkobykgfHwgY291bnQgPiA1MCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZpc2l0ZWQucHV0KG8sIG51bGwpOw0KLQ0KLSAgICAgICAgaW50IGVsQ291bnQgPSAwOw0KLSAgICAgICAgQ2xhc3MgYyA9IG8uZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIC8vaW5zcGVjdCBtYXBzDQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1hcCkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBmb3IgKE9iamVjdCBlbnRyeSA6ICgoTWFwKSBvKS52YWx1ZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZm91bmQgZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICAgICAgaWYoZW50cnkudG9TdHJpbmcoKS5jb250YWlucygiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKGVudHJ5LnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoZW50cnksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGVsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQobykpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gKytlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9hbmFseXplIGFycmF5cw0KLSAgICAgICAgaWYgKGMuaXNBcnJheSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgobyk7DQotICAgICAgICAgICAgLy9jaGVjayBhcnJheSBbTCAtPiBubyBhcnJheSBvZiBwcmltaXRpdmUgdHlwZXMNCi0gICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMamF2YS5sYW5nLlN0cmluZyIpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChBcnJheS5nZXQobywgaSkpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKEFycmF5LmdldChvLCBpKSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxGaWVsZD4gYXR0cmlidXRlcyA9IGZpbmRBbGxBdHRyaWJ1dGVzKGMsIG5ldyBBcnJheUxpc3Q8RmllbGQ+KCkpOw0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBhdHRyaWJ1dGVzLnRvQXJyYXkobmV3IEZpZWxkW2F0dHJpYnV0ZXMuc2l6ZSgpXSk7DQotDQotICAgICAgICBBY2Nlc3NpYmxlT2JqZWN0LnNldEFjY2Vzc2libGUoZmllbGRzLCB0cnVlKTsNCi0gICAgICAgIGZvciAoRmllbGQgY3VycmVudEZpZWxkIDogZmllbGRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQuZ2V0KG8pID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5nZXRUeXBlKCkuZXF1YWxzKFN0cmluZy5jbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmdldChvKSAhPSBudWxsICYmIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKGN1cnJlbnRGaWVsZC5nZXQobykpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFjdXJyZW50RmllbGQuZ2V0VHlwZSgpLmlzUHJpbWl0aXZlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKGN1cnJlbnRGaWVsZC5nZXQobyksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZWxDb3VudDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEZpZWxkPiBmaW5kQWxsQXR0cmlidXRlcyhDbGFzcyBjLCBMaXN0PEZpZWxkPiBhdHRyaWJ1dGVzKQ0KLSAgICB7DQotICAgICAgICBpZiAoYyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluZEFsbEF0dHJpYnV0ZXMoYy5nZXRTdXBlcmNsYXNzKCksIGF0dHJpYnV0ZXMpOw0KLQ0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBjLmdldERlY2xhcmVkRmllbGRzKCk7DQotICAgICAgICBmb3IgKEZpZWxkIGN1cnJlbnRGaWVsZCA6IGZpZWxkcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzU3RhdGljKGN1cnJlbnRGaWVsZC5nZXRNb2RpZmllcnMoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChjdXJyZW50RmllbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9SZXBsYWNlVmFycyhWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eTsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0gICAgICAgIGJvb2xlYW4gbGFzdCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgd2hpbGUodHJ1ZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxhc3QgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0NCi0gICAgICAgICAgICBwcm9wZXJ0eSA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbg0KLSAgICAgICAgICAgICAgICAucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIGdldE5ld1Byb3BlcnR5KHByb3BlcnR5LCBtYXBwZWRGYWNlbGV0c1ZhcnMpKTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQubGVuZ3RoKCkgPT0gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpICsgIi4iICsgcmVzdWx0Ow0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpOw0KLQ0KLSAgICAgICAgICAgIGlmKGxhc3QpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcmVmaXgoKSArICJ7IiArIHJlc3VsdCArICJ9Iik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5ld1Byb3BlcnR5KFN0cmluZyBvbGRQcm9wZXJ0eSwgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFycyA9IGdldFBvdGVudGlhbFZpcnR1YWxWYXJzKG9sZFByb3BlcnR5KTsNCi0NCi0gICAgICAgIGZvcihTdHJpbmcgdmlydHVhbFZhciA6IHZpcnR1YWxWYXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1hcHBlZEZhY2VsZXRzVmFycy5jb250YWluc0tleSh2aXJ0dWFsVmFyKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG9sZFByb3BlcnR5ID0gcmVwbGFjZVByb3BlcnR5VmFsdWUob2xkUHJvcGVydHksIHZpcnR1YWxWYXIsIG1hcHBlZEZhY2VsZXRzVmFycy5nZXQodmlydHVhbFZhcikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvbGRQcm9wZXJ0eTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0UG90ZW50aWFsVmlydHVhbFZhcnMoU3RyaW5nIG9sZFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpbnQgc3RhcnQgPSAtMTsNCi0gICAgICAgIGludCBlbmQgPSAtMTsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG9sZFByb3BlcnR5Lmxlbmd0aCgpOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoc3RhcnQgPT0gLSAxICYmIG9sZFByb3BlcnR5LmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKChzdGFydCAhPSAtIDEgJiYgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICdbJykgfHwgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICddJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGVuZCA9IGk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKHN0YXJ0ICE9IC0xICYmIGVuZCAhPSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJMaXN0LmFkZChvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOw0KLSAgICAgICAgICAgICAgICBpZihvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbmQgPSAtMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlydHVhbFZhckxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcGxhY2VQcm9wZXJ0eVZhbHVlKFN0cmluZyBvbGRQcm9wZXJ0eSwgU3RyaW5nIHRhcmdldFZhciwgU3RyaW5nIG5ld1ZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpbnQgaW5kZXggPSBvbGRQcm9wZXJ0eS5pbmRleE9mKHRhcmdldFZhcik7DQotDQotICAgICAgICBpZihpbmRleCA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gb2xkUHJvcGVydHk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gb2xkUHJvcGVydHkuc3Vic3RyaW5nKDAsIGluZGV4KTsNCi0gICAgICAgIHJlc3VsdCArPSBuZXdWYWx1ZTsNCi0gICAgICAgIHJldHVybiByZXN1bHQgKyBvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoaW5kZXggKyB0YXJnZXRWYXIubGVuZ3RoKCksIG9sZFByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiByZXBsYWNlIHZpcnR1YWwgZmFjZWxldHMgdmFycyAobWFwIHN5bnRheCkNCi0gICAgICogdGVzdGVkIHN0eWxlcyAoc2ltcGxlIGFuZCBuZXN0ZWQpOiB0ZXN0W2l4W2l4MltpeDNdXV0NCi0gICAgICovDQotICAgIC8qDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBfY3JlYXRlQmluZGluZyhMaXN0PFN0cmluZz4gZXhwcmVzc2lvbnMsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmlydHVhbFZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0NCi0gICAgICAgIFN0cmluZyBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50QmluZGluZzsNCi0gICAgICAgIFN0cmluZyBwYXJ0T2ZCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBleHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aCgiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZvdW5kQmluZGluZ0RldGFpbHMgPSBlbnRyeS5zcGxpdCgiICIpOw0KLSAgICAgICAgICAgIGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoZm91bmRCaW5kaW5nRGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9PSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBiaW5kaW5nRGV0YWlscyA9IGZvdW5kQmluZGluZ0RldGFpbHNbaW5kZXhPZkJpbmRpbmdEZXRhaWxzXS5zcGxpdCgiPSIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nRGV0YWlscy5sZW5ndGggPCAyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYmluZGluZ0RldGFpbHNbMV07DQotDQotICAgICAgICAgICAgLy90byBzdXBwb3J0IGJsYW5rcyB3aXRoaW4gYSBiaW5kaW5nIHdpdGggbWFwIHN5bnRheA0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgJiYgIWN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoY3VycmVudEJpbmRpbmcsIGZvdW5kQmluZGluZ0RldGFpbHMsIGluZGV4T2ZCaW5kaW5nRGV0YWlscyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lICE9IG51bGwgJiYgY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnMoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBwYXJ0T2ZCaW5kaW5nID0gY3VycmVudEJpbmRpbmcuc3Vic3RyaW5nKGN1cnJlbnRCaW5kaW5nLmluZGV4T2YocHJldkZhY2VsZXRzQXR0cmlidXRlTmFtZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICArIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUubGVuZ3RoKCksIGN1cnJlbnRCaW5kaW5nLmluZGV4T2YoIn0iKSk7DQotDQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5hZGQoYmluZGluZ0RldGFpbHNbMF0pOw0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgcGFydE9mQmluZGluZzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICBlbHNlIGlmKCEoY3VycmVudEJpbmRpbmcuY29udGFpbnMoInsiKSB8fCBjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJzLnB1dChiaW5kaW5nRGV0YWlsc1swXSwgYmluZGluZ0RldGFpbHNbMV0uc3Vic3RyaW5nKDEsIGJpbmRpbmdEZXRhaWxzWzFdLmxlbmd0aCgpLTIpKTsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWlucyhiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLmFkZChiaW5kaW5nRGV0YWlsc1swXSk7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyZW50QmluZGluZy5zdWJzdHJpbmcoY3VycmVudEJpbmRpbmcuaW5kZXhPZigieyIpICsgMSwgY3VycmVudEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gYmluZGluZ0RldGFpbHNbMF07DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotICAgICovDQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OGViNjYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRpZmZlcmVuY2UgYmV0d2VlbiBbIGFuZCBbJyAtIHRlc3Qgd2l0aCBtb3JlIGNvbnN0ZWxsYXRpb25zIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQ0KLXB1YmxpYyBjbGFzcyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotew0KLSAgICBwcml2YXRlIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYmFzZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7DQotICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdG9rZW47DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXBsYWNlT3JBZGRQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlcGxhY2VQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1Byb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICAvL1RPRE8gYWRqdXN0bWVudHMgZm9yIGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLmVuZHNXaXRoKCInXSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYWRkUHJvcGVydHkoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBzb3VyY2VFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc291cmNlRXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgc291cmNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpOw0KLQ0KLSAgICAgICAgLy9UT0RPIGFkanVzdG1lbnRzIGZvciBpc0R5bmFtaWNCYXNlQW5kUHJvcGVydHkNCi0gICAgICAgIGlmKG5ld1Byb3BlcnR5LnN0YXJ0c1dpdGgoIlsnIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHJlc3VsdCArIG5ld1Byb3BlcnR5ICsgIn0iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ocmVzdWx0ICsgIi4iICsgbmV3UHJvcGVydHkgKyAifSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKFN0cmluZyBleHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBpZighRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQoZXhwcmVzc2lvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihleHByZXNzaW9uICsgIiBpcyBubyB2YWxpZCBlbC1leHByZXNzaW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBib29sZWFuIGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSA9IGV4cHJlc3Npb24ubGFzdEluZGV4T2YoIiddIikgPT0gLTE7DQotICAgICAgICBpbnQgaW5kZXgxID0gaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5ID8gZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiXSIpIDogZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiJ10iKTsNCi0gICAgICAgIGludCBpbmRleDIgPSBleHByZXNzaW9uLmxhc3RJbmRleE9mKCIuIik7DQotDQotICAgICAgICBpZihpbmRleDEgPiBpbmRleDIpDQotICAgICAgICB7DQotICAgICAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGluZGV4MSk7DQotDQotICAgICAgICAgICAgaW50IGluZGV4MyA9IGZpbmRJbmRleE9mU3RhcnRpbmdCcmFja2V0KGV4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIGlmKGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZyhpbmRleDMgKyAxLCBpbmRleDEpOw0KLQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoaW5kZXgzICsgMiwgaW5kZXgxKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdGhpcy5iYXNlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgzKSArICJ9Iik7DQotICAgICAgICAgICAgdGhpcy50b2tlbiA9IGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSA/ICJbIiA6ICJbJyI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKCBpbmRleDIgPiBpbmRleDEpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKGluZGV4MiArIDEsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxICk7DQotICAgICAgICAgICAgdGhpcy5iYXNlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgyKSArICJ9Iik7DQotICAgICAgICAgICAgdGhpcy50b2tlbiA9ICIuIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoMiwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpOw0KLSAgICAgICAgICAgIHRoaXMucHJlZml4ID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgMSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnRyaW0oKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYoIlsiLmVxdWFscyh0aGlzLnRva2VuKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLnZhbHVlLnN0YXJ0c1dpdGgoIiciKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlLnN1YnN0cmluZygxLCB0aGlzLnZhbHVlLmxlbmd0aCgpIC0gMSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vcmV0dXJuIHRoaXMuYmFzZS52YWx1ZSArIHRoaXMudG9rZW4gKyB0aGlzLnZhbHVlLnN1YnN0cmluZygwLCB0aGlzLnZhbHVlLmxlbmd0aCgpKSArICInXSI7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gZ2V0QmFzZUV4cHJlc3Npb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmFzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4cHJlc3Npb25TdHJpbmcoKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgYmFzZUV4cHJlc3Npb24gPSB0aGlzLmJhc2UuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLQ0KLSAgICAgICAgICAgIGlmKCJbJyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAiJ119IjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZigiWyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAiXX0iOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gYmFzZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGJhc2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSkgKyB0aGlzLnRva2VuICsgdGhpcy52YWx1ZSArICJ9IjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVmaXggKyAieyIgKyB0aGlzLnZhbHVlICsgIn0iOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5iYXNlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZS5nZXRQcmVmaXgoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJlZml4Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmJhc2Uuc2V0UHJlZml4KHByZWZpeCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEV4cHJlc3Npb25TdHJpbmcoKS5oYXNoQ29kZSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gJiYgZ2V0RXhwcmVzc2lvblN0cmluZygpDQotICAgICAgICAgICAgLmVxdWFscygoKFZhbHVlQmluZGluZ0V4cHJlc3Npb24pIHRhcmdldCkuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGludCBmaW5kSW5kZXhPZlN0YXJ0aW5nQnJhY2tldChTdHJpbmcgZXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgaW50IGNsb3NlQ291bnQgPSAwOw0KLSAgICAgICAgZm9yKGludCBpID0gZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDE7IGkgPiAwOyBpLS0pDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoZXhwcmVzc2lvbi5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2xvc2VDb3VudC0tOw0KLSAgICAgICAgICAgICAgICBpZihjbG9zZUNvdW50IDwgMCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZihleHByZXNzaW9uLmNoYXJBdChpKSA9PSAnXScpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjbG9zZUNvdW50Kys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0Fic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0Fic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzEwMGIzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlckNvbXBhcmF0b3I7DQotDQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxUPiBpbXBsZW1lbnRzIE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8TmFtZU1hcHBlcjxUPj4NCi17DQotICAgIHByaXZhdGUgTGlzdDxDbGFzcz4gZGVuaWVkTmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLQ0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVnaXN0ZXIoTmFtZU1hcHBlcjxUPiBuYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICBpZighZGVuaWVkTmFtZU1hcHBlckxpc3QuY29udGFpbnMobmFtZU1hcHBlci5nZXRDbGFzcygpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBnZXROYW1lTWFwcGVyTGlzdCgpLmFkZChuYW1lTWFwcGVyKTsNCi0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGdldE5hbWVNYXBwZXJMaXN0KCksIGdldENvbXBhcmF0b3IoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIENvbXBhcmF0b3I8TmFtZU1hcHBlcjxUPj4gZ2V0Q29tcGFyYXRvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxOYW1lTWFwcGVyPFQ+PigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkZXJlZ2lzdGVyKENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBjbGFzc1RvRGVyZWdpc3RlcikNCi0gICAgew0KLSAgICAgICAgSXRlcmF0b3I8TmFtZU1hcHBlcjxUPj4gbmFtZU1hcHBlckl0ZXJhdG9yID0gZ2V0TmFtZU1hcHBlckxpc3QoKS5pdGVyYXRvcigpOw0KLSAgICAgICAgd2hpbGUobmFtZU1hcHBlckl0ZXJhdG9yLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihuYW1lTWFwcGVySXRlcmF0b3IubmV4dCgpLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc1RvRGVyZWdpc3Rlci5nZXROYW1lKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbmFtZU1hcHBlckl0ZXJhdG9yLnJlbW92ZSgpOw0KLSAgICAgICAgICAgICAgICAvL2Rvbid0IGJyZWFrIC0gZS5nLiB0byBkZXJlZ2lzdGVyIGFsbCB3cmFwcGVycy4uLg0KLSAgICAgICAgICAgICAgICAvL2JyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBkZW55KENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBjbGFzc1RvRGVueSkNCi0gICAgew0KLSAgICAgICAgZGVyZWdpc3RlcihjbGFzc1RvRGVueSk7DQotDQotICAgICAgICBzeW5jaHJvbml6ZWQgKGdldENsYXNzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZGVuaWVkTmFtZU1hcHBlckxpc3QuYWRkKGNsYXNzVG9EZW55KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdDxOYW1lTWFwcGVyPFQ+PiBnZXROYW1lTWFwcGVyTGlzdCgpOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2NjA3MC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ2xhc3NNYXBwaW5nRmFjdG9yeTxQLCBSPg0KLXsNCi0gICAgUiBjcmVhdGUoUCBzb3VyY2UpOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRGVmYXVsdEZhY3RvcnlGaW5kZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9EZWZhdWx0RmFjdG9yeUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjk3NTVmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9EZWZhdWx0RmFjdG9yeUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLkRlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRGVmYXVsdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8vZHluYW1pYyBhcHByb2FjaCB0byBjcmVhdGUgdGhlIGZhY3RvcmllcyBkdXJpbmcgdGhlIGZpcnN0IHJlcXVlc3QsIHdoZW4gYSBmYWNlcy1jb250ZXh0IGlzIGF2YWlsYWJsZQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWN0b3J5RmluZGVyIGltcGxlbWVudHMgRmFjdG9yeUZpbmRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJvdGVjdGVkIE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4gZmFjdG9yeU1hcCA9IG5ldyBIYXNoTWFwPEZhY3RvcnlOYW1lcywgT2JqZWN0PigpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIgPSBuZXcgRGVmYXVsdEZhY3RvcnlGaW5kZXIoKTsNCi0NCi0gICAgcHJvdGVjdGVkIERlZmF1bHRGYWN0b3J5RmluZGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY3RvcnlGaW5kZXIgZ2V0SW5zdGFuY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjdG9yeUZpbmRlcjsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgZmluYWwgPFQ+IFQgZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUsIENsYXNzPFQ+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZighKGZhY3RvcnlNYXAuY29udGFpbnNLZXkoZmFjdG9yeU5hbWUpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0RmFjdG9yeShmYWN0b3J5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKFQpZmFjdG9yeU1hcC5nZXQoZmFjdG9yeU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIHN3aXRjaCAoZmFjdG9yeU5hbWUpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2FzZSBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZU1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZU1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZVJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgRUxfSEVMUEVSX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVFTEhlbHBlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBGQUNFU19NRVNTQUdFX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVGYWNlc01lc3NhZ2VGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIFNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlU3RvcmFnZU1hbmFnZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZVZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICANCi0gICAgICAgICAgICBkZWZhdWx0OiAvL3JlcXVpcmVkIGJ5IGNoZWNrc3R5bGUNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgcG9zc2libGUgdG8gY3JlYXRlIGZhY3RvcnkgIiArIGZhY3RvcnlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZhY3RvcnlNYXAucHV0KGZhY3RvcnlOYW1lLCBmYWN0b3J5KTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkpOw0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSk7DQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotICAgICAgICBMaXN0PFN0cmluZz4gbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSk7DQotICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZICk7DQotICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUZhY2VzTWVzc2FnZUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0ZBQ0VTX01FU1NBR0VfRkFDVE9SWSk7DQotICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkpKTsNCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkubmFtZSgpKTsNCi0gICAgICAgIGlmKHRhcmdldCAhPSBudWxsICYmIHRhcmdldCBpbnN0YW5jZW9mIFN0cmluZykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoKFN0cmluZyl0YXJnZXQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlRUxIZWxwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0RUxIZWxwZXJGYWN0b3J5KCk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlkpOw0KLSAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSk7DQotICAgICAgICBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHN0b3JhZ2VNYW5hZ2VyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IHN0b3JhZ2VNYW5hZ2VyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWSk7DQotICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1BBUkFNRVRFUl9GQUNUT1JZKSk7DQotICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogdmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YmQ4YTMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRmFjZXNNZXNzYWdlRmFjdG9yeQ0KLXsNCi0gICAgRmFjZXNNZXNzYWdlIGNvbnZlcnQoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSk7DQotDQotICAgIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGYyNjI1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnlGaW5kZXIKLXsKLSAgICA8VD4gVCBnZXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpOwotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlOYW1lcy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTJiMTVlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQotcHVibGljIGVudW0gRmFjdG9yeU5hbWVzCi17Ci0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwKLQotICAgIFZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZLAotICAgIFZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlksCi0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksCi0gICAgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLAotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLAotCi0gICAgRkFDRVNfTUVTU0FHRV9GQUNUT1JZLAotCi0gICAgUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwKLSAgICBFTF9IRUxQRVJfRkFDVE9SWSwKLQotICAgIFNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZCi19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L05hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQyZDFmMC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8VCBleHRlbmRzIE5hbWVNYXBwZXI+DQotew0KLSAgICB2b2lkIHJlZ2lzdGVyKFQgY2xhc3NUb0FkZCk7DQotICAgIHZvaWQgZGVyZWdpc3RlcihDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gY2xhc3NUb0RlcmVnaXN0ZXIpOw0KLSAgICB2b2lkIGRlbnkoQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IGNsYXNzVG9EZW55KTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjUwMGMzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0Fic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRTZWNyZXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3g7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVMaXN0Ym94Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTWVudTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZVJhZGlvOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUNoZWNrYm94Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUxpc3Rib3g7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TWVudTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dGFyZWE7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyDQotew0KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbGlkYXRlRW1wdHlGaWVsZHMoKSAmJiBFeHRWYWxVdGlscy5pc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25BY3RpdmUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyZVJlcXVpcmVkQXR0cmlidXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgY29uZmlndXJlTWF4TGVuZ3RoQXR0cmlidXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUVtcHR5RmllbGRzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLnZhbGlkYXRlRW1wdHlGaWVsZHMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjb25maWd1cmVSZXF1aXJlZEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSk7DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRTZWNyZXQgfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94IHx8DQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lTWVudSB8fA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVSYWRpbyB8fA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUxpc3Rib3ggfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueU1lbnUgfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogaWYgdGhlcmUgaXMgbm8gc3BlY2lhbCBhdHRyaWJ1dGUgYXQgdGhlIGNvbXBvbmVudCB3aGljaCBzaG91bGQgb3ZlcnJ1bGUNCi0gICAgICogdGhlIGFubm90YXRlZCBwcm9wZXJ0eSByZXR1cm4gdHJ1ZSENCi0gICAgICoNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IGNvbXBvbmVudCB3aGljaCBpbXBsZW1lbnRzIHRoZSBFZGl0YWJsZVZhbHVlSG9sZGVyIGludGVyZmFjZQ0KLSAgICAgKiBAcmV0dXJuIGZhbHNlIHRvIG92ZXJydWxlIHRoZSBhbm5vdGF0ZWQgcHJvcGVydHkgZS5nLiBpZiBjb21wb25lbnQgaXMgcmVhZG9ubHkNCi0gICAgICovDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJyZWZhY3RvciIpDQotICAgIHByb3RlY3RlZCBCb29sZWFuIGlzQ29tcG9uZW50UmVxdWlyZWQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzUmVhZG9ubHkiKSkpOw0KLSAgICAgICAgYm9vbGVhbiBpc0Rpc2FibGVkID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNEaXNhYmxlZCIpKSk7DQotDQotICAgICAgICByZXR1cm4gIShpc1JlYWRPbmx5IHx8IGlzRGlzYWJsZWQpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZU1heExlbmd0aEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKTsNCi0NCi0gICAgICAgICAgICBpZighKG1heExlbmd0aCBpbnN0YW5jZW9mIEludGVnZXIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBIdG1sSW5wdXRUZXh0IGh0bWxJbnB1dFRleHQgPSAoSHRtbElucHV0VGV4dCl1aUNvbXBvbmVudDsNCi0gICAgICAgICAgICAgICAgaHRtbElucHV0VGV4dC5zZXRNYXhsZW5ndGgoKEludGVnZXIpbWF4TGVuZ3RoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEh0bWxJbnB1dFNlY3JldCBodG1sSW5wdXRTZWNyZXQgPSAoSHRtbElucHV0U2VjcmV0KXVpQ29tcG9uZW50Ow0KLSAgICAgICAgICAgICAgICBodG1sSW5wdXRTZWNyZXQuc2V0TWF4bGVuZ3RoKChJbnRlZ2VyKW1heExlbmd0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9Db21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzhlMzU1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gaW5pdGlhbGl6ZSBjb21wb25lbnRzIGJlZm9yZUVuY29kZUJlZ2luLjxici8+DQotICogZS5nLjogeW91IGNhbiBhZGQgaW5mb3JtYXRpb24gZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gbWVjaGFuaXNtcywuLi4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBDb21wb25lbnRJbml0aWFsaXplcg0KLXsNCi0gICAgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5YzA0MS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXRpY0NvbmZpZ3VyYXRpb248VCwgUj4NCi17DQotICAgIHZvaWQgc2V0U291cmNlT2ZNYXBwaW5nKFN0cmluZyBwYXRoKTsNCi0gICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8VCwgUj4+IGdldE1hcHBpbmcoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjg0YWY1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgY2xhc3MgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFQsIFI+DQotew0KLSAgICBwcml2YXRlIFQgc291cmNlOw0KLSAgICBwcml2YXRlIFIgdGFyZ2V0Ow0KLQ0KLSAgICBwdWJsaWMgVCBnZXRTb3VyY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc291cmNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZShUIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFIgZ2V0VGFyZ2V0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoUiB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q3NWJmNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkKLXB1YmxpYyBlbnVtIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcwotewotICAgIE1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfQ09ORklHLAotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0NPTkZJRywKLSAgICBTVE9SQUdFX1RZUEVfVE9fU1RPUkFHRV9NQU5BR0VSX0NPTkZJRywKLQotICAgIFNLSVBfVkFMSURBVElPTl9TVVBQT1JUX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1BBUkFNRVRFUl9DT05GSUcKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwY2I2ZjQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3MKLSAgICAgICAgPSBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VPZk1hcHBpbmcoU3RyaW5nIHBhdGgpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGdldE1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2Uoc291cmNlKTsKLSAgICAgICAgZW50cnkuc2V0VGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgIHRoaXMubWFwcGluZ3MuYWRkKGVudHJ5KTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWE2M2M0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIFN0cmluZyBwYXRoOwotICAgIHByaXZhdGUgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5nczsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCkKLSAgICB7Ci0gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgICAgIC8vZm9yY2UgcmVsb2FkCi0gICAgICAgIG1hcHBpbmdzID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBnZXRNYXBwaW5nKCkKLSAgICB7Ci0gICAgICAgIGlmKG1hcHBpbmdzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtYXBwaW5nczsKLSAgICAgICAgfQotCi0gICAgICAgIG1hcHBpbmdzID0gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotCi0gICAgICAgIFJlc291cmNlQnVuZGxlIG1hcHBpbmcgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocGF0aCk7Ci0KLSAgICAgICAgaWYgKG1hcHBpbmcgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9sb2dnaW5nCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IG1hcHBpbmcuZ2V0S2V5cygpOwotCi0gICAgICAgIFN0cmluZyBtZXRhRGF0YUtleTsKLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsKLQotICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YURhdGFLZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSBtYXBwaW5nLmdldFN0cmluZyhtZXRhRGF0YUtleSk7Ci0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWV0YURhdGFLZXksIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBtZXRhRGF0YUtleSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2UobWV0YURhdGFLZXkpOwotICAgICAgICBlbnRyeS5zZXRUYXJnZXQodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsKLSAgICAgICAgdGhpcy5tYXBwaW5ncy5hZGQoZW50cnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTkzOTY4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yIGltcGxlbWVudHMgUmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRJbnRlcmNlcHRvcklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJldHVyblZhbHVlT25Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKAotICAgICAgICBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIHNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24sIE9iamVjdCBjdXJyZW50UmV0dXJuVmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gY3VycmVudFJldHVyblZhbHVlOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBiZWZvcmUKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJlZm9yZURlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGFmdGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyNzEyOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5WYWxpZGF0aW9uTW9kdWxlS2V5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZWwuUHJvcGVydHlOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgeC54LjMKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25JbnRlcmNlcHRvciBleHRlbmRzIEFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIHByb3RlY3RlZCBib29sZWFuIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvblN1cHBvcnRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgICAgICB0aHJvd3MgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBjb21wb25lbnQgaW5pdGlhbGl6YXRpb24gc2V0cyBhIGNvbXBvbmVudCB0byByZXF1aXJlZCBpZiB0aGVyZSBhcmUgY29uc3RyYWludHMgd2hpY2ggaW5kaWNhdGUgaXQKLSAgICAgICAgICogdGhlIHJlcXVpcmVkIGZsYWcgaW4gYSBjb21wb25lbnQgbGVhZHMgdG8gcHJvYmxlbXMgd2l0aCBoOm1lc3NhZ2VzIChhZGRpdGlvbmFsIG1lc3NhZ2UpIGFzIHdlbGwgYXMKLSAgICAgICAgICogaW5jb21wYXRpYmlsaXRpZXMgd2l0aCBza2lwIHZhbGlkYXRpb24gYW5kIHNldmVyaXRpZXMKLSAgICAgICAgICovCi0gICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlciAmJiBFeHRWYWxVdGlscy5pc1JlcXVpcmVkUmVzZXRBY3RpdmF0ZWQoKSAmJgotICAgICAgICAgICAgICAgIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvblN1cHBvcnRlZCgpICYmIEV4dFZhbFV0aWxzLmlzUmVxdWlyZWRJbml0aWFsaXphdGlvbkFjdGl2ZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSAmJiAhaXNDb21wb25lbnRJbml0aWFsaXphdGlvbkRlYWN0aXZhdGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0Q29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3Q7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdCA9IHdyYXBwZWQuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFByb3BlcnR5Tm90Rm91bmRFeGNlcHRpb24gcikKLSAgICAgICAgewotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNGYXRhbEVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5mYXRhbCgiaXQgc2VlbXMgeW91IGFyZSB1c2luZyBhbiBpbnZhbGlkIGJpbmRpbmcuICIgKyB3cmFwcGVkLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICI6IGNvbnZlcnNpb24gZmFpbGVkLiBub3JtYWxseSB0aGlzIGlzID5ub3Q8IGEgbXlmYWNlcyBleHR2YWwgaXNzdWUhIiwgcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydGllcyh1aUNvbXBvbmVudCk7Ci0gICAgICAgIAotICAgICAgICBpZihyZWNvcmRQcm9jZXNzZWRJbmZvcm1hdGlvbigpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL3JlY29yZGUgdXNlciBpbnB1dCBlLmcuIGZvciBjcm9zcy1jb21wb25lbnQgdmFsaWRhdGlvbgotICAgICAgICAgICAgZm9yKFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIgcmVjb3JkZXIgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlY29yZGVyLnJlY29yZFVzZXJJbnB1dCh1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHJlY29yZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjYWxsZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udmVydGVkT2JqZWN0ID0gdHJhbnNmb3JtVmFsdWVGb3JWYWxpZGF0aW9uKGNvbnZlcnRlZE9iamVjdCk7Ci0KLSAgICAgICAgICAgICAgICBpZih2YWxpZGF0ZVZhbHVlKGNvbnZlcnRlZE9iamVjdCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NCZWZvcmVWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVmFsaWRhdG9yRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBtaWdodCBkZWNpZGUgdGhhdCBpdCBpc24ndCBhbiBleGNlcHRpb24KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50KHVpQ29tcG9uZW50LCBlLmdldEZhY2VzTWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZmluYWxFeGNlcHRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbnZlcnRlckV4Y2VwdGlvbihlLmdldEZhY2VzTWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHByb2Nlc3NBZnRlclZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsKLSAgICAgICAgICAgIHJlc2V0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnRpZXModWlDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0JlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5leGVjdXRlR2xvYmFsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWx1ZSwKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uLmNsYXNzLmdldE5hbWUoKSwgZ2V0UHJvcGVydHlJbmZvcm1hdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KSwgZ2V0TW9kdWxlS2V5KCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NBZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIEV4dFZhbFV0aWxzLmV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsdWUsCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIGdldFByb3BlcnR5SW5mb3JtYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCksIGdldE1vZHVsZUtleSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUHJvcGVydHlJbmZvcm1hdGlvbiBnZXRQcm9wZXJ0eUluZm9ybWF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gZ2V0UHJvcGVydGllc0ZvckNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKHVpQ29tcG9uZW50KTsKLQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKHByb3BlcnRpZXMpOwotCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXNGb3JDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgICAgIGlmKGdldE1vZHVsZUtleSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpLCBnZXRNb2R1bGVLZXkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvcGVydGllcy5wdXQoVUlDb21wb25lbnQuY2xhc3MuZ2V0TmFtZSgpLCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpOwotCi0gICAgcHJvdGVjdGVkIE9iamVjdCB0cmFuc2Zvcm1WYWx1ZUZvclZhbGlkYXRpb24oT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkKLSAgICB7Ci0gICAgICAgIGlmICgiIi5lcXVhbHMoY29udmVydGVkT2JqZWN0KSAmJiBpbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRPYmplY3Q7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZShPYmplY3QgY29udmVydGVkT2JqZWN0KQotICAgIHsKLSAgICAgICAgaWYoaXNWYWx1ZVRvVmFsaWRhdGVFbXB0eShjb252ZXJ0ZWRPYmplY3QpICYmICF2YWxpZGF0ZUVtcHR5RmllbGRzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoImVtcHR5IGZpZWxkIHZhbGlkYXRpb24gaXMgZGVhY3RpdmF0ZWQgaW4gdGhlIHdlYi54bWwgLSBzZWU6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLlZBTElEQVRFX0VNUFRZX0ZJRUxEUyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbHVlVG9WYWxpZGF0ZUVtcHR5KE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpCi0gICAgewotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0ID09IG51bGwgfHwgIiIuZXF1YWxzKGNvbnZlcnRlZE9iamVjdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVFbXB0eUZpZWxkcygpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMudmFsaWRhdGVFbXB0eUZpZWxkcygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGludGVycHJldEVtcHR5U3RyaW5nVmFsdWVzQXNOdWxsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5pbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKAotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIgJiYgaXNWYWx1ZUJpbmRpbmdPZkNvbXBvbmVudFZhbGlkKHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWx1ZUJpbmRpbmdPZkNvbXBvbmVudFZhbGlkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKHVpQ29tcG9uZW50KSAhPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25EZWFjdGl2YXRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ09NUE9ORU5UX0lOSVRJQUxJWkFUSU9OKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWNvcmRQcm9jZXNzZWRJbmZvcm1hdGlvbigpCi0gICAgewotICAgICAgICAvL292ZXJyaWRlIGlmIG5lZWRlZAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENsYXNzIGdldE1vZHVsZUtleSgpCi0gICAgewotICAgICAgICAvL292ZXJyaWRlIGlmIG5lZWRlZAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRJbnRlcmNlcHRvclByb3BlcnRpZXMoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgICAgIGlmKGdldE1vZHVsZUtleSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5wdXQoVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCksIGdldE1vZHVsZUtleSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQucHV0KFVJQ29tcG9uZW50LmNsYXNzLmdldE5hbWUoKSwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0aWVzKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZSBpbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZSA9IGdldFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UoKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBnZXRJbnRlcmNlcHRvclByb3BlcnRpZXModWlDb21wb25lbnQpOwotICAgICAgICBmb3IoU3RyaW5nIGtleSA6IHByb3BlcnRpZXMua2V5U2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLnNldFByb3BlcnR5KGtleSwgcHJvcGVydGllcy5nZXQoa2V5KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydGllcyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UgaW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UgPSBnZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlKCk7Ci0KLSAgICAgICAgZm9yKFN0cmluZyBrZXkgOiBnZXRJbnRlcmNlcHRvclByb3BlcnRpZXModWlDb21wb25lbnQpLmtleVNldCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5yZW1vdmVQcm9wZXJ0eShrZXkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlIGdldFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5jbGFzcywKLSAgICAgICAgICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Db21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Bd2FyZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZjcxMTguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Db21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlclN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Bd2FyZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKEpzZlV0aWxzLmlzUmVuZGVyUmVzcG9uc2VQaGFzZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFmdGVyRXh0cmFjdGluZ0ZvckNvbXBvbmVudEluaXRpYWxpemF0aW9uKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFmdGVyRXh0cmFjdGluZ0ZvckNvbXBvbmVudEluaXRpYWxpemF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbik7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2YjE2My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0ZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkZhY2VzTWVzc2FnZVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDkwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBGYWNlc01lc3NhZ2VQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2VTdG9yYWdlIGZhY2VzTWVzc2FnZVN0b3JhZ2UgPSBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKA0KLSAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLCBGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBpZihmYWNlc01lc3NhZ2VTdG9yYWdlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNNZXNzYWdlU3RvcmFnZS5hZGRBbGwoKTsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5yZXNldFN0b3JhZ2UoRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcywgRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0h0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDdjOTI4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5MYWJlbGVkTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLmV4Y2VwdGlvbi5SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFNlY3JldDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVMaXN0Ym94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVSYWRpbzsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueU1lbnU7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dGFyZWE7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpCi0gICAgewotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSBFeHRWYWxVdGlscy5jb252ZXJ0RmFjZXNNZXNzYWdlKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSk7Ci0KLSAgICAgICAgICAgIHRyeVRvVXNlSW5saW5lTWVzc2FnZSh1aUNvbXBvbmVudCwgdmFsaWRhdG9yRXhjZXB0aW9uKTsKLQotICAgICAgICAgICAgdHJ5VG9Vc2VMYWJlbChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBmYWNlc01lc3NhZ2UpOwotCi0gICAgICAgICAgICB0cnlUb0Jsb2Nrc05hdmlnYXRpb24odWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGZhY2VzTWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvVXNlSW5saW5lTWVzc2FnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCk7Ci0gICAgICAgIFN0cmluZyBpbmxpbmVNZXNzYWdlOwotCi0gICAgICAgIGlmKHZhbGlkYXRvckV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmxpbmVNZXNzYWdlID0gZ2V0SW5saW5lUmVxdWlyZWRNZXNzYWdlKHVpQ29tcG9uZW50KTsKLQotICAgICAgICAgICAgaWYoaW5saW5lTWVzc2FnZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGlubGluZU1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoaW5saW5lTWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgaW5saW5lTWVzc2FnZSA9IGdldElubGluZVZhbGlkYXRvck1lc3NhZ2UodWlDb21wb25lbnQpOwotCi0gICAgICAgICAgICBpZihpbmxpbmVNZXNzYWdlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoaW5saW5lTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldERldGFpbChpbmxpbmVNZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1VzZUxhYmVsKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpCi0gICAgewotICAgICAgICBTdHJpbmcgbGFiZWwgPSAoU3RyaW5nKSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsCi0gICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldExhYmVsIikpOwotCi0gICAgICAgIGlmKGxhYmVsID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxhYmVsID0gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vb3ZlcnJpZGUgdGhlIGxhYmVsIGlmIHRoZSBhbm5vdGF0aW9uIHByb3ZpZGVzIGEgbGFiZWwKLSAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxhYmVsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCwgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIExhYmVsZWRNZXNzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKExhYmVsZWRNZXNzYWdlKWZhY2VzTWVzc2FnZSkuc2V0TGFiZWxUZXh0KGxhYmVsKTsKLSAgICAgICAgfQotICAgICAgICAvL2lmIHNvbWVvbmUgdXNlcyBhIG5vcm1hbCBmYWNlcyBtZXNzYWdlCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwoZmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiY2hlY2sgaWYgaXQgaXMgc3RpbGwgcmVxdWlyZWQgaGVyZSIpCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvQmxvY2tzTmF2aWdhdGlvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQotICAgIHsKLSAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vY29ycmVjdCBzZXZlcml0eSBpcyBlLmcuIHByb3ZpZGVkIGJ5IFZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yCi0gICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnQodWlDb21wb25lbnQsIGZhY2VzTWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRJbmxpbmVSZXF1aXJlZE1lc3NhZ2UoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gKFN0cmluZylSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJnZXRSZXF1aXJlZE1lc3NhZ2UiKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW5saW5lVmFsaWRhdG9yTWVzc2FnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCh1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldFZhbGlkYXRvck1lc3NhZ2UiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lUmFkaW8gfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TGlzdGJveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZDIxZGUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlJbmZvcm1hdGlvbiB0aGUgaW5mb3JtYXRpb24gZW50cnkgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3BlcnR5DQotICAgICAqLw0KLSAgICB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0Y2Y1MjcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotew0KLSAgICAvKioNCi0gICAgICogQHJldHVybiBmYWxzZSBpZiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzIHNob3VsZCBiZSBieXBhc3NlZA0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpOw0KLQ0KLSAgICAvKioNCi0gICAgICogcHJvY2Vzc2VkIGlmIHZhbGlkYXRpb24gd2FzIGV4ZWN1dGVkDQotICAgICAqIGluIGNvbnRyYXN0IHRvIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpdCBnZXRzIGV4ZWN1dGVkIGluIGFueSBjYXNlDQotICAgICAqLw0KLSAgICB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9SZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxZjA1NC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbGxvd3MgdG8gaW50ZXJjZXB0IHJlbmRlcmVyIG1ldGhvZHMuPGJyLz4KLSAqIEJhc2UgbWVjaGFuaXNtIG9mIGV4dHZhbC4gSXQgYWxsb3dzIHRvIGFkZCBjdXN0b20gaW5mcmFzdHJ1Y3R1cmVzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBSZW5kZXJlckludGVyY2VwdG9yCi17Ci0gICAgU3RyaW5nIGdldEludGVyY2VwdG9ySWQoKTsKLQotICAgIE9iamVjdCBnZXRSZXR1cm5WYWx1ZU9uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBza2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLCBPYmplY3QgY3VycmVudFJldHVyblZhbHVlKTsKLQotICAgIC8qCi0gICAgICogYmVmb3JlCi0gICAgICovCi0gICAgdm9pZCBiZWZvcmVEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKgotICAgICAqIGFmdGVyCi0gICAgICovCi0gICAgdm9pZCBhZnRlckRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1NpbmdsZVZpb2xhdGlvblByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1NpbmdsZVZpb2xhdGlvblByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MGY2NzQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9TaW5nbGVWaW9sYXRpb25Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguNA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTaW5nbGVWaW9sYXRpb25Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlciAmJiAhaXNDb21wb25lbnRWYWxpZCh1aUNvbXBvbmVudCkgJiYgaXNOYXZpZ2F0aW9uQmxvY2tlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbXBvbmVudFZhbGlkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5pc1ZhbGlkKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTmF2aWdhdGlvbkJsb2NrZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFJlbmRlclJlc3BvbnNlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRlYzNkMC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlclN1cHBvcnQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gaW50ZXJjZXB0IHZhbGlkYXRpb3IgZXhjZXB0aW9ucy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAqIEBwYXJhbSBtZXRhRGF0YUVudHJ5IHRoZSBtZXRhIGRhdGEgZW50cnkgd2hpY2ggY29udGFpbnMgdGhlIG1ldGEgZGF0YSBvZiB0aGUgcHJvcGVydHkNCi0gICAgICogQHBhcmFtIGNvbnZlcnRlZE9iamVjdCB0aGUgY29udmVydGVkIHVzZXIgaW5wdXQNCi0gICAgICogQHBhcmFtIHZhbGlkYXRvckV4Y2VwdGlvbiB0aGUgY3VycmVudCBleGNlcHRpb24NCi0gICAgICogQHBhcmFtIHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IHdoaWNoIHRocmV3IHRoZSBleGNlcHRpb24NCi0gICAgICogQHJldHVybiBmYWxzZSB0byBzdG9wIHRocm93aW5nIHRoZSBleGNlcHRpb24NCi0gICAgICovDQotICAgIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmUxNWUwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkludGVyY2VwdG9yIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25TdXBwb3J0ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHRvIGluaXQgY29tcG9uZW50ICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhUmVzdWx0ID0gRXh0VmFsVXRpbHMKLSAgICAgICAgICAgICAgICAuZ2V0VHJhbnNmb3JtZWRNZXRhRGF0YUZvcihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBnZXRNb2R1bGVLZXkoKSk7Ci0KLSAgICAgICAgLy9nZXQgY29tcG9uZW50IGluaXRpYWxpemVyIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQgYW5kIGNvbmZpZ3VyZSBpdAotICAgICAgICAvL2Fsc28gaW4gY2FzZSBvZiBza2lwcGVkIHZhbGlkYXRpb24gdG8gcmVzZXQgZS5nLiB0aGUgcmVxdWlyZWQgYXR0cmlidXRlCi0gICAgICAgIGlmKCFtZXRhRGF0YVJlc3VsdC5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbmZpZ3VyZUNvbXBvbmVudFdpdGhNZXRhRGF0YShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YVJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJpbml0IGNvbXBvbmVudCBvZiAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkKLSAgICB7Ci0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gRXh0VmFsVXRpbHMKLSAgICAgICAgICAgICAgICAuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JXaXRoKGdldFByb3BlcnRpZXNGb3JDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcih1aUNvbXBvbmVudCkpOwotCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG1ldGFEYXRhRXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgdmFsaWRhdGlvbiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcm9jZXNzRmllbGRWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInZhbGlkYXRpb24gZmluaXNoZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JXaXRoKHByb3BlcnRpZXMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NGaWVsZFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7Ci0gICAgICAgIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKTsKLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogcHJvcGVydHlJbmZvcm1hdGlvbi5nZXRNZXRhRGF0YUVudHJpZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOwotCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgaXNWYWxpZGF0aW9uU3RyYXRlZ3lDb21wYXRpYmxlV2l0aFZhbHVlKHZhbGlkYXRpb25TdHJhdGVneSwgIGNvbnZlcnRlZE9iamVjdCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoc2tpcFZhbGlkYXRpb25FdmFsdWF0b3Iuc2tpcFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblN0cmF0ZWd5LCBlbnRyeSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJza2lwIHZhbGlkYXRpb24gb2YgIiArIGVudHJ5LmdldFZhbHVlKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggIiArIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy9kb24ndCBicmVhayBtYXliZSB0aGVyZSBhcmUgY29uc3RyYWludHMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCB0aGUgc2tpcC1tZWNoYW5pc20KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInZhbGlkYXRlICIgKyBlbnRyeS5nZXRWYWx1ZSgpICsgIiB3aXRoICIgKyB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb24pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFFeHRWYWxVdGlscy5leGVjdXRlTG9jYWxCZWZvcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiB2YWxpZGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZW50cnksIGNvbnZlcnRlZE9iamVjdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5leGVjdXRlTG9jYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIHByb3BlcnR5SW5mb3JtYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYodmFsaWRhdGlvblN0cmF0ZWd5ID09IG51bGwgJiYgbG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyB2YWxpZGF0aW9uIHN0cmF0ZWd5IGZvdW5kIGZvciAiICsgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkYXRpb25TdHJhdGVneUNvbXBhdGlibGVXaXRoVmFsdWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3MgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5pc0Fubm90YXRpb25QcmVzZW50KE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAhIiIuZXF1YWxzKHZhbHVlKSB8fCBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpKQotICAgICAgICAgICAgICAgIC5pc0Fubm90YXRpb25QcmVzZW50KEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneS5jbGFzcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgLyoqCi0gICAgICogdG8gZW5zdXJlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVjb3JkUHJvY2Vzc2VkSW5mb3JtYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WaW9sYXRpb25TZXZlcml0eVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WaW9sYXRpb25TZXZlcml0eVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTM0YzYxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmlvbGF0aW9uU2V2ZXJpdHlWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDkwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYoaXNFeHRWYWxNZXRhRGF0YShtZXRhRGF0YUVudHJ5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb1BsYWNlU2V2ZXJpdHkodmFsaWRhdG9yRXhjZXB0aW9uLCBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0V4dFZhbE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb247DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvUGxhY2VTZXZlcml0eShWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLCBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGZvcihGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkgOiBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkNCi0gICAgICAgICAgICAgICAgLmV4dHJhY3QoYW5ub3RhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eS5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLnNldFNldmVyaXR5KHNldmVyaXR5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2QzODY1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBBIGdlbmVyaWMgaW1wbGVtZW50YXRpb24uIFN1YmNsYXNzZXMganVzdCBoYXZlIHRvIG5vdyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIG5hbWUgbWFwcGVyLg0KLSAqDQotICogTmFtZU1hcHBlcnMgYXJlIHN0YXRlbGVzcy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxUPiBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VD4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotICAgIHByaXZhdGUgTmFtZU1hcHBlcjxUPiBjdXN0b21OYW1lTWFwcGVyOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVCBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIGlmIChjdXN0b21OYW1lTWFwcGVyID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKTsNCi0NCi0gICAgICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXN0b21OYW1lTWFwcGVyID0gKE5hbWVNYXBwZXI8VD4pIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoY3VzdG9tTmFtZU1hcHBlciAhPSBudWxsKSA/IGN1c3RvbU5hbWVNYXBwZXIuY3JlYXRlTmFtZShzb3VyY2UpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODMxY2I2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL05hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXJTdXBwb3J0Ow0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSBmb3IgbmFtZSBtYXBwZXJzLg0KLSAqIEEgbmFtZSBtYXBwZXIgY2FsY3VsYXRlcyBhIG5hbWUgZm9yIGEgZ2l2ZW4gc291cmNlIG9iamVjdC4NCi0gKiBlLmcuIE1ldGEtRGF0YSBLZXkgKGUuZy46IGFubm90YXRpb24gY2xhc3MgbmFtZSkgLT4gVmFsaWRhdGlvblN0cmF0ZWd5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgU3RyaW5nIGNyZWF0ZU5hbWUoVCBzb3VyY2UpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9TdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL1N1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTZkZGQyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL1N1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogaW50ZXJmYWNlIGZvciBuYW1lLW1hcHBlcnMgd2hpY2ggaGF2ZSB0byBkZWxlZ2F0ZSB0byBvdGhlciAoc3ViLSluYW1lLW1hcHBlcnMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyPFQ+IGV4dGVuZHMgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgdm9pZCBhZGROYW1lTWFwcGVyKE5hbWVNYXBwZXI8VD4gbmFtZU1hcHBlcik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvQ29tbW9uTWV0YURhdGFLZXlzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL0NvbW1vbk1ldGFEYXRhS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWFlNjM3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvQ29tbW9uTWV0YURhdGFLZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGhlbHBlciBmb3IgZnJlcXVlbnQgbWV0YS1kYXRhIGtleXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogcGxhY2VkIGluIGNvcmUgdG8gYXZvaWQgZHVwbGljYXRlZCBpbmZvcm1hdGlvbiBpbiBtdWx0aXBsZSBtb2R1bGVzICh2YWxpZGF0aW9uIG1vZHVsZSBhbmQgY29tcG9uZW50LXN1cHBvcnQgbW9kdWxlKQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBDb21tb25NZXRhRGF0YUtleXMNCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRUQgPSAicmVxdWlyZWQiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQUtfUkVRVUlSRUQgPSAid2Vha19yZXF1aXJlZCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOX0xFTkdUSCA9ICJtaW5fbGVuZ3RoIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5fTEVOR1RIX0RFRkFVTFQgPSAibWluX2xlbmd0aF9kZWZhdWx0IjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfTEVOR1RIID0gIm1heF9sZW5ndGgiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9MRU5HVEhfREVGQVVMVCA9ICJtYXhfbGVuZ3RoX2RlZmF1bHQiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01JTiA9ICJyYW5nZV9taW4iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01JTl9ERUZBVUxUID0gInJhbmdlX21pbl9kZWZhdWx0IjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9NQVggPSAicmFuZ2VfbWF4IjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9NQVhfREVGQVVMVCA9ICJyYW5nZV9tYXhfZGVmYXVsdCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUVEVSTiA9ICJwYXR0ZXJuIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRURVJOX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRSA9ICJwYXR0ZXJuX3ZhbGlkYXRpb25fZXJyb3JfbWVzc2FnZSI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1BSUwgPSAiZW1haWwiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTSA9ICJjdXN0b20iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSVBfVkFMSURBVElPTiA9ICJza2lwX3ZhbGlkYXRpb24iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfQ0xJRU5UX1NJREVfVkFMSURBVElPTiA9ICJkaXNhYmxlX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24iOw0KLSAgICAvL2F2YWlsYWJsZSBmb3IgYWRkLW9ucyBub3QgdXNlZCBpbnRlcm5hbGx5IGR1ZSB0byBwZXJmb3JtYW5jZSByZWFzb25zDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRV9TSE9XX0lORElDQVRJT04gPSAiZGlzYWJsZV9zaG93X2luZGljYXRpb24iOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL01ldGFEYXRhRW50cnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvTWV0YURhdGFFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTU0NTgyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvTWV0YURhdGFFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIERhdGEgaG9sZGVyIHdoaWNoIHN0b3JlcyB0aGUgbWV0YS1kYXRhIGFuZCBzb21lIGluZm9ybWF0aW9uIHdoZXJlIHRoZSBtZXRhLWRhdGEgd2FzIGFyb3VuZC4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBNZXRhRGF0YUVudHJ5Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGtleTsKLSAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRLZXkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJzZXR0aW5nIG1ldGEtZGF0YSBrZXk6ICIgKyBrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIDxUPiBUIGdldFZhbHVlKENsYXNzPFQ+IHRhcmdldENsYXNzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUKWdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoInNldHRpbmcgbWV0YS1kYXRhIHZhbHVlOiAiICsgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmdldChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gVCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVClnZXRQcm9wZXJ0eShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJuZXcgcHJvcGVydHkgYWRkZWQga2V5OiAiICsga2V5ICsgIiB2YWx1ZTogIiArIHZhbHVlICsgIiBmb3IgbWV0YWRhdGEta2V5OiAiICsgdGhpcy5rZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWRjMjZkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGFsbCBmYWN0b3JpZXMgd2hpY2ggY3JlYXRlIG1ldGEtZGF0YSBleHRyYWN0b3JzCi0gKiAKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkKLXsKLSAgICBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGUoKTsKLQotICAgIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZVdpdGgoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsKLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1Mjg3NmEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuTWV0YURhdGFTdG9yYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUHJvcGVydHlTdG9yYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBleHRyYWN0cyBtZXRhLWRhdGEgKGUuZy4gdGhlIGFubm90YXRpb25zKSBvZiB0aGUgdmFsdWUgYmluZGluZyBvZiBhIGNvbXBvbmVudC4KLSAqIEl0IGV4dHJhY3RzIHRoZSBtZXRhLWRhdGEgb2YgdGhlIGZpZWxkIGFuZCB0aGUgcHJvcGVydHkuCi0gKiAoQWxzbyB0aGUgYW5ub3RhdGlvbnMgb2Ygc3VwZXIgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcy4pCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3RvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkKLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsKLQotICAgICAgICAvL3Nob3VsZCBuZXZlciBvY2N1cgotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkgJiYgb2JqZWN0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihvYmplY3QuZ2V0Q2xhc3MoKSArICIgaXMgbm8gdmFsaWQgY29tcG9uZW50Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50ID0gKFVJQ29tcG9uZW50KSBvYmplY3Q7Ci0KLSAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGV4dHJhY3RpbmcgbWV0YS1kYXRhIG9mICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5RGV0YWlscyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGdldCBiZWFuIGNsYXNzIGFuZCBwcm9wZXJ0eSBuYW1lCi0gICAgICAgICAqLwotICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpKTsKLQotICAgICAgICAvL2NyZWF0ZQotICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnNldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIHByb3BlcnR5RGV0YWlscyk7Ci0KLSAgICAgICAgaWYgKGlzQ2FjaGVkKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5IDogZ2V0Q2FjaGVkTWV0YURhdGEoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLmFkZE1ldGFEYXRhRW50cnkobWV0YURhdGFFbnRyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBleHRyYWN0QW5ub3RhdGlvbnMocHJvcGVydHlJbmZvcm1hdGlvbiwgcHJvcGVydHlEZXRhaWxzLCBlbnRpdHlDbGFzcyk7Ci0gICAgICAgICAgICBjYWNoZU1ldGFEYXRhKHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImV4dHJhY3QgZmluaXNoZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NhY2hlZChDbGFzcyBlbnRpdHlDbGFzcywgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldE1ldGFEYXRhU3RvcmFnZSgpLmNvbnRhaW5zTWV0YURhdGFGb3IoZW50aXR5Q2xhc3MsIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2FjaGVNZXRhRGF0YShQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBnZXRNZXRhRGF0YVN0b3JhZ2UoKS5zdG9yZU1ldGFEYXRhT2YocHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRhRGF0YUVudHJ5W10gZ2V0Q2FjaGVkTWV0YURhdGEoQ2xhc3MgZW50aXR5Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRNZXRhRGF0YVN0b3JhZ2UoKS5nZXRNZXRhRGF0YShlbnRpdHlDbGFzcywgcHJvcGVydHkpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWV0YURhdGFTdG9yYWdlIGdldE1ldGFEYXRhU3RvcmFnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShNZXRhRGF0YVN0b3JhZ2UuY2xhc3MsIE1ldGFEYXRhU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NhY2hlZEZpZWxkKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5U3RvcmFnZSgpLmNvbnRhaW5zRmllbGQoZW50aXR5LCBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvQ2FjaGVkRmllbGQoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksIEZpZWxkIGZpZWxkKQotICAgIHsKLSAgICAgICAgUHJvcGVydHlTdG9yYWdlIHByb3BlcnR5U3RvcmFnZSA9IGdldFByb3BlcnR5U3RvcmFnZSgpOwotICAgICAgICBpZiAoIXByb3BlcnR5U3RvcmFnZS5jb250YWluc0ZpZWxkKGVudGl0eSwgcHJvcGVydHkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVN0b3JhZ2Uuc3RvcmVGaWVsZChlbnRpdHksIHByb3BlcnR5LCBmaWVsZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpZWxkIGdldENhY2hlZEZpZWxkKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5U3RvcmFnZSgpLmdldEZpZWxkKGVudGl0eSwgcHJvcGVydHkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NhY2hlZE1ldGhvZChDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eVN0b3JhZ2UoKS5jb250YWluc01ldGhvZChlbnRpdHksIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9DYWNoZWRNZXRob2QoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksIE1ldGhvZCBtZXRob2QpCi0gICAgewotICAgICAgICBQcm9wZXJ0eVN0b3JhZ2UgcHJvcGVydHlTdG9yYWdlID0gZ2V0UHJvcGVydHlTdG9yYWdlKCk7Ci0gICAgICAgIGlmICghcHJvcGVydHlTdG9yYWdlLmNvbnRhaW5zTWV0aG9kKGVudGl0eSwgcHJvcGVydHkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVN0b3JhZ2Uuc3RvcmVNZXRob2QoZW50aXR5LCBwcm9wZXJ0eSwgbWV0aG9kKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWV0aG9kIGdldENhY2hlZE1ldGhvZChDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eVN0b3JhZ2UoKS5nZXRNZXRob2QoZW50aXR5LCBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eVN0b3JhZ2UgZ2V0UHJvcGVydHlTdG9yYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKFByb3BlcnR5U3RvcmFnZS5jbGFzcywgUHJvcGVydHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZXh0cmFjdEFubm90YXRpb25zKAotICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uLCBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLCBDbGFzcyBlbnRpdHlDbGFzcykKLSAgICB7Ci0gICAgICAgIHdoaWxlICghT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoZW50aXR5Q2xhc3MuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICAgICAgYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9ucyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICAgICAgZW50aXR5Q2xhc3MgPSBlbnRpdHlDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ludGVyZmFjZXMoCi0gICAgICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MsIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMsIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IGN1cnJlbnRDbGFzcy5nZXRJbnRlcmZhY2VzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoY3VycmVudEludGVyZmFjZSwgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhjdXJyZW50SW50ZXJmYWNlLCBwcm9wZXJ0eURldGFpbHMsIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QgPSB0cnlUb0dldFJlYWRNZXRob2QoZW50aXR5LCBwcm9wZXJ0eSk7Ci0KLSAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRob2QgPSB0cnlUb0dldFJlYWRNZXRob2RNYW51YWxseShlbnRpdHksIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DYWNoZWRNZXRob2QoZW50aXR5LCBwcm9wZXJ0eSwgbWV0aG9kKTsKLSAgICAgICAgICAgIGFkZEFubm90YXRpb25Ub0Fubm90YXRpb25FbnRyaWVzKEFycmF5cy5hc0xpc3QobWV0aG9kLmdldEFubm90YXRpb25zKCkpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWV0aG9kIHRyeVRvR2V0UmVhZE1ldGhvZChDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIGlmIChpc0NhY2hlZE1ldGhvZChlbnRpdHksIHByb3BlcnR5KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldENhY2hlZE1ldGhvZChlbnRpdHksIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh1c2VCZWFuSW5mbygpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCZWFuSW5mbyBiZWFuSW5mbyA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhlbnRpdHkpOwotICAgICAgICAgICAgICAgIGZvciAoUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA6IGJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yLmdldE5hbWUoKSkgJiYgcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUJlYW5JbmZvKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBCb29sZWFuLlRSVUUuZXF1YWxzKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KEJlYW5JbmZvLmNsYXNzLmdldE5hbWUoKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWV0aG9kIHRyeVRvR2V0UmVhZE1ldGhvZE1hbnVhbGx5KENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHByb3BlcnR5LnN1YnN0cmluZygxKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgLy9jaGFuZ2VkIHRvIG9mZmljaWFsIGJlYW4gc3BlYy4gZHVlIHRvIGNhY2hpbmcgdGhlcmUgaXMgbm8gcGVyZm9ybWFuY2UgaXNzdWUgYW55IG1vcmUKLSAgICAgICAgICAgIHJldHVybiBlbnRpdHkuZ2V0RGVjbGFyZWRNZXRob2QoImlzIiArIHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHkuZ2V0RGVjbGFyZWRNZXRob2QoImdldCIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibWV0aG9kIG5vdCBmb3VuZCAtIGNsYXNzOiAiICsgZW50aXR5LmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtIG1ldGhvZHM6ICIgKyAiZ2V0IiArIHByb3BlcnR5ICsgIiAiICsgImlzIiArIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBGaWVsZCBmaWVsZDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmllbGQgPSBnZXREZWNsYXJlZEZpZWxkKGVudGl0eSwgcHJvcGVydHkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKCJfIiArIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5sZW5ndGgoKSA+IDEgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuaXNVcHBlckNhc2UocHJvcGVydHkuY2hhckF0KDApKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShwcm9wZXJ0eS5jaGFyQXQoMSkpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2Rvbid0IHVzZSBJbnRyb3NwZWN0b3IjZGVjYXBpdGFsaXplIGhlcmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gZW50aXR5LmdldERlY2xhcmVkRmllbGQocHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvTG93ZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgPSBlbnRpdHkuZ2V0RGVjbGFyZWRGaWVsZChJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKHByb3BlcnR5KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJmaWVsZCAiICsgcHJvcGVydHkgKyAiIG9yIF8iICsgcHJvcGVydHkgKyAiIG5vdCBmb3VuZCIsIGUxKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmllbGQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DYWNoZWRGaWVsZChlbnRpdHksIHByb3BlcnR5LCBmaWVsZCk7Ci0gICAgICAgICAgICBhZGRBbm5vdGF0aW9uVG9Bbm5vdGF0aW9uRW50cmllcyhBcnJheXMuYXNMaXN0KGZpZWxkLmdldEFubm90YXRpb25zKCkpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuSElHSCwgZGVzY3JpcHRpb24gPSAiYWRkIHN1cHBvcnQgZm9yIGluc3RhbmNlcyB3cmFwcGVkIHdpdGggY2dsaWIiKQotICAgIHByaXZhdGUgRmllbGQgZ2V0RGVjbGFyZWRGaWVsZChDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoaXNDYWNoZWRGaWVsZChlbnRpdHksIHByb3BlcnR5KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldENhY2hlZEZpZWxkKGVudGl0eSwgcHJvcGVydHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uVG9Bbm5vdGF0aW9uRW50cmllcygKLSAgICAgICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMsIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uYWRkTWV0YURhdGFFbnRyeShjcmVhdGVNZXRhRGF0YUVudHJ5Rm9yQW5ub3RhdGlvbihhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoYW5ub3RhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBNZXRhRGF0YUVudHJ5IGNyZWF0ZU1ldGFEYXRhRW50cnlGb3JBbm5vdGF0aW9uKEFubm90YXRpb24gZm91bmRBbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgTWV0YURhdGFFbnRyeSBlbnRyeSA9IG5ldyBNZXRhRGF0YUVudHJ5KCk7Ci0KLSAgICAgICAgZW50cnkuc2V0S2V5KGZvdW5kQW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIGVudHJ5LnNldFZhbHVlKGZvdW5kQW5ub3RhdGlvbik7Ci0KLSAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3NjQ1Yi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyBmYWN0b3J5IGNyZWF0ZXMgYSBtZXRhLWRhdGEgZXh0cmFjdG9yIHdoaWNoIGV4dHJhY3RzIHRoZSBtZXRhLWRhdGEKLSAqIG9mIHRoZSB2YWx1ZSBiaW5kaW5nIG9mIGEgY29tcG9uZW50LgotICogPHAvPgotICogb3JkZXI6PGJyLz4KLSAqIDxvbD4KLSAqICAgPGxpPmNvbmZpZ3VyZWQgbWV0YS1kYXRhIGV4dHJhY3RvciAod2ViLnhtbCk8L2xpPgotICogICA8bGk+Y29uZmlndXJlZCBtZXRhLWRhdGEgZXh0cmFjdG9yIChpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKTwvbGk+Ci0gKiAgIDxsaT5kZWZhdWx0IGltcGxlbWVudGF0aW9uPC9saT4KLSAqIDwvb2w+Ci0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IG51bGw7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikKLSAgICBwdWJsaWMgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVXaXRoKG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGVXaXRoKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3RvciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUik7Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUikpOwotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yID0gKE1ldGFEYXRhRXh0cmFjdG9yKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3RvciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShtZXRhRGF0YUV4dHJhY3Rvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY3JlYXRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3JXaXRoKG1ldGFEYXRhRXh0cmFjdG9yLCBwcm9wZXJ0aWVzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9NZXRhRGF0YUV4dHJhY3Rvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0MDUxZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9NZXRhRGF0YUV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotCi0vKioKLSAqIEFuIG1ldGEtZGF0YSBleHRyYWN0b3IgaXMgcmVzcG9uc2libGUgdG8gYW5hbHl6ZSBhbiBvYmplY3QKLSAqIGFuZCByZXR1cm5zIGFsbCBhdmFpbGFibGUgbWV0YS1kYXRhIGluZm9ybWF0aW9uCi0gKiAKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBNZXRhRGF0YUV4dHJhY3RvcgotewotICAgIFByb3BlcnR5SW5mb3JtYXRpb24gZXh0cmFjdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njk5MTJhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIGl0J3MganVzdCBhIGhlbHBlciBmb3IgcHJveGllcyAtIHlvdSBqdXN0IG5lZWQgaXQsIGlmIHlvdSBkZWZpbmUgdGhlIGVxdWl2YWxlbnQgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotICoNCi0gKiBpZiB0aGVyZSBpcyBhbHNvIGEgcHJveHkgZm9yIHRoZSBleHRyYWN0b3IgeW91IGNhbiB1c2UgdGhlIGNsYXNzTmFtZSBwcm9wZXJ0eSB0byBtYW51YWxseSByZXBlYXQgdGhlDQotICogZnVsbCBxdWFsaWZpZWQgY2xhc3MgbmFtZS4NCi0gKg0KLSAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBpbnRlcmZhY2UgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyIGV4dGVuZHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlYTgxOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSBlcXVpdmFsZW50IHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0Lg0KLSAqDQotICogaWYgdGhlcmUgaXMgYWxzbyBhIHByb3h5IGZvciB0aGUgdHJhbnNmb3JtZXIgeW91IGNhbiB1c2UgdGhlIGNsYXNzTmFtZSBwcm9wZXJ0eSB0byBtYW51YWxseSByZXBlYXQgdGhlDQotICogZnVsbCBxdWFsaWZpZWQgY2xhc3MgbmFtZS4NCi0gKg0KLSAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBjbGFzcyBCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lciwgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZTsNCi0NCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lci5jb252ZXJ0TWV0YURhdGEobWV0YURhdGFFbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZShTdHJpbmcgbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lID0gbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFUcmFuc2Zvcm1lciBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFUcmFuc2Zvcm1lcihNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lciA9IG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYzNhZWUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLlN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuTmVzdGVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyLg0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyB0aGUgTWV0YURhdGFUcmFuc2Zvcm1lciBmb3IgYSBnaXZlbiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogVmFsaWRhdGlvblN0cmF0ZWd5IC0+IE1ldGFEYXRhVHJhbnNmb3JtZXIgaW5zdGVhZCBvZiBNZXRhLURhdGEgLT4gTWV0YURhdGFUcmFuc2Zvcm1lcg0KLSAqIHRvIGF2b2lkIGEgc2Vjb25kIHN0YXRpYyBtYXBwaW5nIGUuZy4gZm9yIGpwYSBhbm5vdGF0aW9ucw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotICAgICAgICBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YVRyYW5zZm9ybWVyPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmc7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KCk7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IHN1Yk5hbWVNYXBwZXJMaXN0ID0NCi0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotDQotICAgICAgICAvL3NpbmNlIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBzdGFydHVwIGxpc3RlbmVyIG9mIHRoZSBjb3JlIGdldHMgZXhlY3V0ZWQgZmlyc3QNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgY3JlYXRlKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lID0gY3JlYXRlVmFsaWRhdGlvblN0cmF0ZWd5TmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgdHJ5VG9Jbml0U3RhdGljTWFwcGluZ3MoKTsNCi0NCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lciA9DQotICAgICAgICAgICAgICAgIHRyeVRvUmVzb2x2ZUNhY2hlZE1ldGFEYXRhVHJhbnNmb3JtZXIodmFsaWRhdGlvblN0cmF0ZWd5LCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0NCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBjcmVhdGVBbmRDYWNoZU1ldGFEYXRhVHJhbnNmb3JtZXIodmFsaWRhdGlvblN0cmF0ZWd5LCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gaXNQcm94eURldGVjdGVkID0gaXNQcm94eSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGEgcHJveHkgYW5kIHRoZSB1c2FnZSBvZiBhIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICAgICAgICBpZiAoaXNQcm94eURldGVjdGVkICYmIHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoKEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKXZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuICFpc1Byb3h5RGV0ZWN0ZWQgPyBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0luaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUHJveHkoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSA9PSBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciBjcmVhdGVBbmRDYWNoZU1ldGFEYXRhVHJhbnNmb3JtZXIoDQotICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgIFN0cmluZyB0cmFuc2Zvcm1lck5hbWU7DQotICAgICAgICAvL251bGwgLT4gdXNlIG5hbWUgbWFwcGVycw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyYW5zZm9ybWVyTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lck5hbWUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyID0gdHJ5VG9DcmVhdGVBbmRDYWNoZU1ldGFEYXRhVHJhbnNmb3JtZXIoDQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3ksIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIHRyYW5zZm9ybWVyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIHRyeVRvUmVzb2x2ZUNhY2hlZE1ldGFEYXRhVHJhbnNmb3JtZXIoDQotICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHZhbGlkYXRpb25TdHJhdGVneU5hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoTWV0YURhdGFUcmFuc2Zvcm1lcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcuZ2V0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgbmV3VmFsaWRhdGlvblN0cmF0ZWd5TmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneU5hbWUgKyBJZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kuSURfUFJFRklYICsNCi0gICAgICAgICAgICAgICAgICAgICgoSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KXZhbGlkYXRpb25TdHJhdGVneSkuZ2V0SWQoKTsNCi0NCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZy5jb250YWluc0tleShuZXdWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiAoTWV0YURhdGFUcmFuc2Zvcm1lcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoDQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLmdldChuZXdWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIHRyeVRvQ3JlYXRlQW5kQ2FjaGVNZXRhRGF0YVRyYW5zZm9ybWVyKA0KLSAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgdHJhbnNmb3JtZXJOYW1lKQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSAoTWV0YURhdGFUcmFuc2Zvcm1lcikNCi0gICAgICAgICAgICAgICAgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHRyYW5zZm9ybWVyTmFtZSk7DQotDQotICAgICAgICBpZiAobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneU5hbWUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArPSBJZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kuSURfUFJFRklYICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kpdmFsaWRhdGlvblN0cmF0ZWd5KS5nZXRJZCgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGFkZE1hcHBpbmcodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgdHJhbnNmb3JtZXJOYW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0dXBNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBNYXBwaW5ncyhMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhtYXBwaW5nLmdldFNvdXJjZSgpLCBtYXBwaW5nLmdldFRhcmdldCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0cmFuc2Zvcm1lck5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkaW5nIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWV0YS1kYXRhIHRyYW5zZm9ybWVyIG1hcHBpbmc6ICINCi0gICAgICAgICAgICAgICAgKyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgIiAtPiAiICsgdHJhbnNmb3JtZXJOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcucHV0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIHRyYW5zZm9ybWVyTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgU29ydGVkTmFtZU1hcHBlckxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+Pih0aGlzLm5hbWVNYXBwZXJMaXN0LCB0aGlzLnN1Yk5hbWVNYXBwZXJMaXN0KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIHRyeVRvSW5pdE5hbWVNYXBwZXJXaXRoRXhpc3RpbmdTdWJNYXBwZXJzKHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpOw0KLSAgICAgICAgc3VwZXIucmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIGl0J3MgYSB2ZXJ5IHNwZWNpYWwgY2FzZSBkdWUgdG8gdGhlIG1pc3Npbmcgb3JkZXIgaW4gdGhlIGV4ZWN1dGlvbiBvZiBzdGFydHVwLWxpc3RlbmVycyAocGhhc2UgbGlzdGVuZXJzKQ0KLSAgICAgKiBwYWNrYWdlZCBpbiBmYWNlcy1jb25maWcueG1sIGZpbGVzIG9mIGphcnMNCi0gICAgICoNCi0gICAgICogbm9ybWFsbHkgdGhlIGRlZmF1bHQgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyIHNob3VsZCBiZSBlbm91Z2gNCi0gICAgICogYW55d2F5LCBpZiBhIG1vZHVsZSBhZGRzIGEgbmV3IFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlciwNCi0gICAgICogYWxsIHByZXZpb3VzIGFkZGVkIFN1Yk5hbWVNYXBwZXJzIGhhdmUgdG8gYmUgYWRkZWQgdG8gYXZvaWQgY29uZnVzaW9uIGluIHNwZWNpYWwgY2FzZXMuDQotICAgICAqIGlmIGEgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIGZpbmFsIGV4dGVuZCB0aGUgaW50ZXJmYWNlIGFuZCBmaWx0ZXIgaXQgaW4gYWRkTmFtZU1hcHBlcg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgd2hpY2ggaGFzIHRvIGJlIGFkZGVkDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9Jbml0TmFtZU1hcHBlcldpdGhFeGlzdGluZ1N1Yk1hcHBlcnMoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgaW5zdGFuY2VvZiBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yKE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiBuYW1lTWFwcGVyIDogdGhpcy5zdWJOYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKG5hbWVNYXBwZXIuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KE5lc3RlZC5jbGFzcykpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICgoU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4pdmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcikNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZE5hbWVNYXBwZXIobmFtZU1hcHBlcik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1MDRiMi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQWxsb3dzIHRvIHRyYW5zZm9ybSBjb25jcmV0ZSBtZXRhLWRhdGEgdG8gYSBtb3JlIGFic3RyYWN0IGZvcm0uPGJyLz4NCi0gKiBlLmcuOiBAUmVxdWlyZWQsIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwuLi4pLCBATGVuZ3RoKG1pbmltdW0gPSAxKSwgLi4uIC0+IHJlcXVpcmVkID0gdHJ1ZQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLS8vKlRyYW5zZm9ybWVyIGluc3RlYWQgb2YgKkNvbnZlcnRlciB0byBhdm9pZCBuYW1pbmcgY29uZnVzaW9uIA0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YSk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU29ydGVkTmFtZU1hcHBlckxpc3QuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU29ydGVkTmFtZU1hcHBlckxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjYmI0OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NvcnRlZE5hbWVNYXBwZXJMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5OZXN0ZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7DQotDQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLWNsYXNzIFNvcnRlZE5hbWVNYXBwZXJMaXN0PFQgZXh0ZW5kcyBOYW1lTWFwcGVyPiBpbXBsZW1lbnRzIExpc3Q8VD4NCi17DQotICAgIHByaXZhdGUgTGlzdDxUPiB3cmFwcGVkOw0KLSAgICBwcml2YXRlIExpc3Q8VD4gZ2xvYmFsU3ViTmFtZU1hcHBlckxpc3Q7DQotDQotICAgIFNvcnRlZE5hbWVNYXBwZXJMaXN0KExpc3Q8VD4gd3JhcHBlZCwgTGlzdDxUPiBzdWJOYW1lTWFwcGVyTGlzdCkNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsNCi0gICAgICAgIHRoaXMuZ2xvYmFsU3ViTmFtZU1hcHBlckxpc3QgPSBzdWJOYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoVCB0KQ0KLSAgICB7DQotICAgICAgICBpZiAodCAhPSBudWxsICYmIHQuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KE5lc3RlZC5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkZFN1Yk5hbWVNYXBwZXIodCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB3cmFwcGVkLmFkZCh0KTsNCi0NCi0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHdyYXBwZWQsIG5ldyBDb21wYXJhdG9yPFQ+KCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShUIG5tMSwgVCBubTIpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChubTEgaW5zdGFuY2VvZiBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIgJiYgbm0yIGluc3RhbmNlb2YgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5tMSBpbnN0YW5jZW9mIFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlciA/IDEgOiAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHJpdmF0ZSBib29sZWFuIGFkZFN1Yk5hbWVNYXBwZXIoVCBzdWJOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyIG5hbWVNYXBwZXIgOiB0aGlzLndyYXBwZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKG5hbWVNYXBwZXIgaW5zdGFuY2VvZiBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAoKFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcikgbmFtZU1hcHBlcikuYWRkTmFtZU1hcHBlcihzdWJOYW1lTWFwcGVyKTsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICB0cnlUb0FkZE1hcHBlckFzR2xvYmFsU3ViTmFtZU1hcHBlcihzdWJOYW1lTWFwcGVyKTsNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvQWRkTWFwcGVyQXNHbG9iYWxTdWJOYW1lTWFwcGVyKFQgc3ViTmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgaWYoIXRoaXMuZ2xvYmFsU3ViTmFtZU1hcHBlckxpc3QuY29udGFpbnMoc3ViTmFtZU1hcHBlcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5nbG9iYWxTdWJOYW1lTWFwcGVyTGlzdC5hZGQoc3ViTmFtZU1hcHBlcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgaW50IHNpemUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5zaXplKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmlzRW1wdHkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udGFpbnMobyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaXRlcmF0b3IoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnRvQXJyYXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlN1c3BpY2lvdXNUb0FycmF5Q2FsbCJ9KQ0KLSAgICBwdWJsaWMgPFQ+IFRbXSB0b0FycmF5KFRbXSBhKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC50b0FycmF5KGEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVtb3ZlKG8pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udGFpbnNBbGwoYyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIFQ+IGMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmFkZEFsbChjKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUPiBjKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5hZGRBbGwoaW5kZXgsIGMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnJlbW92ZUFsbChjKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5yZXRhaW5BbGwoYyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKQ0KLSAgICB7DQotICAgICAgICB3cmFwcGVkLmNsZWFyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFQgZ2V0KGludCBpbmRleCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0KGluZGV4KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVCBzZXQoaW50IGluZGV4LCBUIGVsZW1lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnNldChpbmRleCwgZWxlbWVudCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgVCBlbGVtZW50KQ0KLSAgICB7DQotICAgICAgICB3cmFwcGVkLmFkZChpbmRleCwgZWxlbWVudCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFQgcmVtb3ZlKGludCBpbmRleCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVtb3ZlKGluZGV4KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmluZGV4T2Yobyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQubGFzdEluZGV4T2Yobyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3RJdGVyYXRvcjxUPiBsaXN0SXRlcmF0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5saXN0SXRlcmF0b3IoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yPFQ+IGxpc3RJdGVyYXRvcihpbnQgaW5kZXgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmxpc3RJdGVyYXRvcihpbmRleCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8VD4gc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuc3ViTGlzdChmcm9tSW5kZXgsIHRvSW5kZXgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYWRjMTYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODg5NGQxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciAtIGlmIHRoZXJlIGlzIGEgcHJveHkgYXJvdW5kIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5Lg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcig1MDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoKEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKXZhbGlkYXRpb25TdHJhdGVneSkuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMWFhZjkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKiAoY29uZmlndXJlZCB2aWEgd2ViLnhtbCkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmQwODBmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKiAoY29uZmlndXJlZCB2aWEgaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbikNCi0gKiBUaGUgYmVhbiBwcm92aWRlcyB0aGUgZGVmYXVsdCBuYW1lIChjb252ZW50aW9uKS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gZnVsbCBxdWFsaWZpZWQgbmFtZS4gKD0gY3VzdG9taXphYmxlIGNvbnZlbnRpb24pDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDE2M2RhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotLyoqDQotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBtYXBzIEV4dFZhbCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MgPQ0KLSAgICAgICAgICAgICAgICBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLA0KLSAgICAgICAgICAgICAgICBnZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYzBiMmEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIHRvIHBsYWNlIFZhbGlkYXRpb25TdHJhdGVnaWVzIGFuZCBNZXRhRGF0YVRyYW5zZm9ybWVycyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcig0MDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MgPQ0KLSAgICAgICAgICAgICAgICBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0UGFja2FnZSgpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZ2V0U2ltcGxlTWV0YURhdGFUcmFuc2Zvcm1lck5hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArICIuIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXRTaW1wbGVOYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTWV0YURhdGFUcmFuc2Zvcm1lck5hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneVBhY2thZ2VOYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcG9zdGZpeCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYKTsNCi0NCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5lbmRzV2l0aCgiVmFsaWRhdGlvblN0cmF0ZWd5IikgfHwNCi0gICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5lbmRzV2l0aCgiU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUgKyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCkgLHBvc3RmaXgpDQotICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgiVmFsaWRhdGlvblN0cmF0ZWd5IiwgcG9zdGZpeCkNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCJTdHJhdGVneSIsIHBvc3RmaXgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGEgc3RhdGljIHZhbGlkYXRpb24gc3RyYXRlZ3kgbWFwcGluZw0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneVBhY2thZ2VOYW1lICsgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lICsgcG9zdGZpeDsNCi0gICAgfQ0KLQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1ZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmE1ODNiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1ZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLlN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuTmVzdGVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXINCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgaW1wbGVtZW50cyBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gc3ViTmFtZU1hcHBlcnMgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkTmFtZU1hcHBlcihOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgaWYoIXRoaXMuc3ViTmFtZU1hcHBlcnMuY29udGFpbnMobmFtZU1hcHBlcikgJiYgbmFtZU1hcHBlci5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoTmVzdGVkLmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnN1Yk5hbWVNYXBwZXJzLmFkZChuYW1lTWFwcGVyKTsNCi0gICAgICAgICAgICBzb3J0U3ViTmFtZU1hcHBlcnMoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc29ydFN1Yk5hbWVNYXBwZXJzKCkNCi0gICAgew0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0aGlzLnN1Yk5hbWVNYXBwZXJzLCBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsNCi0NCi0gICAgICAgIGZvcihOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbWFwcGVyIDogdGhpcy5zdWJOYW1lTWFwcGVycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBtYXBwZXIuY3JlYXRlTmFtZShzb3VyY2UpOw0KLQ0KLSAgICAgICAgICAgIGlmKHJlc3VsdCAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1ZjUyOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbiBpbXBsZW1lbnRzIFByb3BlcnR5SW5mb3JtYXRpb24KLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGluZm9ybWF0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhRW50cnk+IG1ldGFEYXRhTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFbnRyeT4oKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zSW5mb3JtYXRpb24oU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbk1hcC5jb250YWluc0tleShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbk1hcC5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpIGdldEluZm9ybWF0aW9uKGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoIm5ldyBpbmZvcm1hdGlvbiBhZGRlZCBrZXk6ICIgKyBrZXkgKyAiIHZhbHVlOiAiICsgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5mb3JtYXRpb25NYXAucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRhRGF0YUVudHJ5W10gZ2V0TWV0YURhdGFFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtZXRhRGF0YUxpc3QudG9BcnJheShuZXcgTWV0YURhdGFFbnRyeVttZXRhRGF0YUxpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpCi0gICAgewotICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnRpZXModGhpcy5pbmZvcm1hdGlvbk1hcCk7Ci0gICAgICAgIHRoaXMubWV0YURhdGFMaXN0LmFkZChtZXRhRGF0YUVudHJ5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldE1ldGFEYXRhRW50cmllcygpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgicmVzZXR0aW5nIG1ldGEtZGF0YSBlbnRyaWVzIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLm1ldGFEYXRhTGlzdC5jbGVhcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlEZXRhaWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTAzN2NmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlEZXRhaWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlEZXRhaWxzCi17Ci0gICAgLy9mb3JtcyB0aGUgaWQgZm9yIGNyb3NzLXZhbGlkYXRpb24gd2l0aGluIGNvbXBsZXggY29tcG9uZW50cwotICAgIHByaXZhdGUgU3RyaW5nIGtleTsKLSAgICBwcml2YXRlIE9iamVjdCBiYXNlT2JqZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5OwotCi0gICAgcHVibGljIFByb3BlcnR5RGV0YWlscyhTdHJpbmcga2V5LCBPYmplY3QgYmFzZU9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICAgIHRoaXMuYmFzZU9iamVjdCA9IGJhc2VPYmplY3Q7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gICAgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRCYXNlT2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VPYmplY3QoT2JqZWN0IGJhc2VPYmplY3QpCi0gICAgewotICAgICAgICB0aGlzLmJhc2VPYmplY3QgPSBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDkyODRmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUluZm9ybWF0aW9uCi17Ci0gICAgYm9vbGVhbiBjb250YWluc0luZm9ybWF0aW9uKFN0cmluZyBrZXkpOwotICAgIE9iamVjdCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5KTsKLSAgICA8VD4gVCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcyk7Ci0gICAgdm9pZCBzZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpOwotCi0gICAgTWV0YURhdGFFbnRyeVtdIGdldE1ldGFEYXRhRW50cmllcygpOwotICAgIHZvaWQgYWRkTWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpOwotICAgIHZvaWQgcmVzZXRNZXRhRGF0YUVudHJpZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZlZjQzMC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzCi17Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ERVRBSUxTID0gInByb3BlcnR5X2RldGFpbHMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9WQUxJREFUSU9OID0gInNraXBfdmFsaWRhdGlvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJsYWJlbCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fUFJPUEVSVElFUyA9ICJjdXN0b21fcHJvcGVydGllcyI7Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L0RlZmF1bHRQcm94eUhlbHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm94eS9EZWZhdWx0UHJveHlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczNTc0NC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L0RlZmF1bHRQcm94eUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRQcm94eUhlbHBlciBpbXBsZW1lbnRzIFByb3h5SGVscGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdFByb3h5SGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIDxUPiBDbGFzczxUPiBnZXRVbnByb3hpZWRDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MsIENsYXNzPFQ+IHRhcmdldFR5cGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoQ2xhc3M8VD4pZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudENsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VW5wcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZihpc1Byb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVPZkNsYXNzKENsYXNzIGN1cnJlbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYgKGlzUHJveGllZENsYXNzKGN1cnJlbnRDbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzcy5nZXROYW1lKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWVPZk9iamVjdChPYmplY3Qgb2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZihvYmplY3QgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0TmFtZU9mQ2xhc3Mob2JqZWN0LmdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRFbmhhbmNlckJ5Q0dMSUIkJCIpIHx8DQotICAgICAgICAgICAgY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRGYXN0Q2xhc3NCeUNHTElCJCQiKSB8fA0KLSAgICAgICAgICAgIGN1cnJlbnRDbGFzcy5nZXROYW1lKCkuY29udGFpbnMoIl8kJF9qYXZhc3Npc3QiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3hpZWRPYmplY3QoT2JqZWN0IHByb3hpZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm94aWVkT2JqZWN0ICE9IG51bGwgJiYgaXNQcm94aWVkQ2xhc3MocHJveGllZE9iamVjdC5nZXRDbGFzcygpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L1Byb3h5SGVscGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L1Byb3h5SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMjY5MWMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm94eS9Qcm94eUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFByb3h5SGVscGVyDQotew0KLSAgICBDbGFzcyBnZXRVbnByb3hpZWRDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MpOw0KLQ0KLSAgICA8VD4gQ2xhc3M8VD4gZ2V0VW5wcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzLCBDbGFzczxUPiB0YXJnZXRUeXBlKTsNCi0NCi0gICAgU3RyaW5nIGdldE5hbWVPZkNsYXNzKENsYXNzIHByb3hpZWRDbGFzcyk7DQotDQotICAgIFN0cmluZyBnZXRDbGFzc05hbWVPZk9iamVjdChPYmplY3QgcHJveGllZE9iamVjdCk7DQotDQotICAgIGJvb2xlYW4gaXNQcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKTsNCi0NCi0gICAgYm9vbGVhbiBpc1Byb3hpZWRPYmplY3QoT2JqZWN0IHByb3hpZWRPYmplY3QpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlY29yZGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzBmMjNmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLQotLyoqCi0gKiBBbGxvd3MgdG8gY2FwdHVyZSBjb252ZXJ0ZWQgdmFsdWVzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyCi17Ci0gICAgdm9pZCByZWNvcmRVc2VySW5wdXQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNTkyMGMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci0KLS8qKgotICogQmFzZSBmb3IgYWxsIFJlbmRlcktpdFdyYXBwZXJGYWN0b3JpZXMgdG8gZm9yY2UgYSBzcGVjaWZpYyBiZWhhdmlvdXIKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxSZW5kZXJLaXQsIFJlbmRlcktpdD4KLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnkgd3JhcHBlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZGVhY3RpdmF0ZWQgPSBmYWxzZTsKLQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSByZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UocmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLndyYXBwZWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy53cmFwcGVkLmFkZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZGVhY3RpdmF0ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuZGVhY3RpdmF0ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVhY3RpdmF0ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlYWN0aXZhdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBSZW5kZXJLaXQgY3JlYXRlKFJlbmRlcktpdCByZW5kZXJLaXQpCi0gICAgewotICAgICAgICBpZihpc0RlYWN0aXZhdGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVuZGVyS2l0IHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYodGhpcy53cmFwcGVkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMud3JhcHBlZC5jcmVhdGUocmVuZGVyS2l0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlV3JhcHBlcihyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgUmVuZGVyS2l0IGNyZWF0ZVdyYXBwZXIoUmVuZGVyS2l0IHJlbmRlcktpdCk7Ci0KLSAgICAvKioKLSAgICAgKiBzaW1wbGUgdGVzdCBmb3IgZWFybHkgY29uZmlnIGluIGNhc2Ugb2YgbW9qYXJyYSAoaW5jbC4gdGhlIGNvbWJpbmF0aW9uIHdpdGggdHJpbmlkYWQpLgotICAgICAqIHVzZSBhIGN1c3RvbSBleHR2YWwgY29udGV4dCBpbXBsLiAoc2VlIEVYVFZBTC01OCkgdG8gb3B0aW1pemUgdGhpcyBjaGVjayBmb3IgdGhlIHRhcmdldCBydW50aW1lLgotICAgICAqIHRoaXMgY2hlY2sgd29ya3MgZm9yIGFsbCBjdXJyZW50IGltcGxlbWVudGF0aW9ucyBzaW5jZSB0aGUganNmIGludGVybmFscyBhcmUgYXV0b20uIHJlYWR5IGR1cmluZyBhIHJlcXVlc3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGpzZiBpbXBsLiBpcyBpbml0aWFsaXplZCBhbmQgaXQncyBwb3NzaWJsZSB0byB1c2UgaXQgYXMgZXhwZWN0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FwcGxpY2F0aW9uSW5pdGlhbGl6ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEpzZlV0aWxzLmlzQXBwbGljYXRpb25Jbml0aWFsaXplZCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0RlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMjZiNzIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkKLXsKLSAgICBwcml2YXRlIFJlbmRlcktpdCByZW5kZXJLaXQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSSUNfUkVOREVSX0tJVF9XUkFQUEVSX0ZBQ1RPUlkgPQotICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdC5HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkiOwotICAgIHByaXZhdGUgc3RhdGljIEJvb2xlYW4gdXNlR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0dmFsIHJlbmRlcmtpdCB3cmFwcGVyIGNyZWF0ZWQgZm9yICIgKyByZW5kZXJLaXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy93b3JrYXJvdW5kIGZvciBtb2phcnJhIChFWFRWQUwtMzgpCi0gICAgICAgIGlmKHVzZUdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyBnZW5lcmljRmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKEdFTkVSSUNfUkVOREVSX0tJVF9XUkFQUEVSX0ZBQ1RPUlkpOwotICAgICAgICAgICAgdXNlR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID0gZ2VuZXJpY0ZhY3RvcnkgIT0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHVzZUdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSkKLSAgICAgICAgewotICAgICAgICAgICAgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSByZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSA9IChBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KUNsYXNzVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoR0VORVJJQ19SRU5ERVJfS0lUX1dSQVBQRVJfRkFDVE9SWSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY3JlYXRlV3JhcHBlcihyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGhpcy5yZW5kZXJLaXQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5yZW5kZXJLaXQgPSBuZXcgRXh0VmFsUmVuZGVyS2l0KHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyS2l0OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxMYXp5UmVuZGVyZXJQcm94eS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzNjI4Ny4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxMYXp5UmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLQotLyoqCi0gKiB0byBzdXBwb3J0IGEgY3VzdG9tIHByb3h5Ci0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIEV4dFZhbExhenlSZW5kZXJlclByb3h5IGV4dGVuZHMgUmVuZGVyZXIKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBSZW5kZXJlciB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbExhenlSZW5kZXJlclByb3h5KFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyZXI7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic2ltcGxlIHByb3h5IGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBnZXRMYXp5UmVuZGVyZXIoKS5kZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRMYXp5UmVuZGVyZXIoKS5jb252ZXJ0Q2xpZW50SWQoZmFjZXNDb250ZXh0LCBzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldExhenlSZW5kZXJlcigpLmdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJlciBnZXRMYXp5UmVuZGVyZXIoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHByb3h5Q2xhc3NOYW1lID0gKFN0cmluZykgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVkpOwotCi0gICAgICAgIGlmKHByb3h5Q2xhc3NOYW1lICE9IG51bGwgJiYgIXByb3h5Q2xhc3NOYW1lLmVuZHNXaXRoKGdldENsYXNzKCkuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShwcm94eUNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmKHRhcmdldENsYXNzID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYSBjdXN0b20gaW52YWxpZCByZW5kZXJlciBwcm94eSBpcyBjb25maWd1cmVkOiAiICsgcHJveHlDbGFzc05hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDbGFzc1tdIGFyZ0NsYXNzZXMgPSBuZXcgQ2xhc3NbMV07Ci0gICAgICAgICAgICBhcmdDbGFzc2VzWzBdID0gUmVuZGVyZXIuY2xhc3M7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGFyZ2V0Q2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJnQ2xhc3Nlcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChSZW5kZXJlciljb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSh0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgY3JlYXRlOiAiICsgdGFyZ2V0Q2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZDsKLSAgICAgICAgfQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMzU0ZTUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LlJlc3BvbnNlU3RyZWFtOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VXcml0ZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlc3BvbnNlU3RhdGVNYW5hZ2VyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyS2l0IGV4dGVuZHMgUmVuZGVyS2l0Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLSAgICBwcm90ZWN0ZWQgUmVuZGVyS2l0IHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyS2l0KFJlbmRlcktpdCB3cmFwcGVkKQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsKLQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgaWYgKHJlbmRlcmVyIGluc3RhbmNlb2YgRXh0VmFsUmVuZGVyZXJXcmFwcGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCByZW5kZXJlcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCBjcmVhdGVXcmFwcGVyKHJlbmRlcmVyKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVuZGVyZXIgZ2V0UmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSkKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyIHJlbmRlcmVyID0gd3JhcHBlZC5nZXRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSk7Ci0KLSAgICAgICAgaWYocmVuZGVyZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyIGluc3RhbmNlb2YgRXh0VmFsUmVuZGVyZXJXcmFwcGVyID8gcmVuZGVyZXIgOiBjcmVhdGVXcmFwcGVyKHJlbmRlcmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIud2Fybigibm8gcmVuZGVyZXIgZm91bmQgZm9yIGZhbWlseSAiICsgZmFtaWx5ICsgIiBhbmQgdHlwZSAiICsgcmVuZGVyZXJUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZW5kZXJlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdGF0ZU1hbmFnZXIgZ2V0UmVzcG9uc2VTdGF0ZU1hbmFnZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UmVzcG9uc2VTdGF0ZU1hbmFnZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2VXcml0ZXIgY3JlYXRlUmVzcG9uc2VXcml0ZXIoV3JpdGVyIHdyaXRlciwgU3RyaW5nIHMsIFN0cmluZyBzMSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmNyZWF0ZVJlc3BvbnNlV3JpdGVyKHdyaXRlciwgcywgczEpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZVN0cmVhbSBjcmVhdGVSZXNwb25zZVN0cmVhbShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY3JlYXRlUmVzcG9uc2VTdHJlYW0ob3V0cHV0U3RyZWFtKTsKLSAgICB9Ci0KLSAgICBAVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQotICAgIHByb3RlY3RlZCBSZW5kZXJlciBjcmVhdGVXcmFwcGVyKFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxSZW5kZXJlcldyYXBwZXIocmVuZGVyZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM3NmI5OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeTsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBjZW50cmFsIG1lY2hhbmlzbSB3aGljaCBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgYSB3cmFwcGVyIGZvciBhIHJlbmRlcmVyIC0gc3RhcnRpbmcgcG9pbnQgb2YgZXh0dmFsLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeSBleHRlbmRzIFJlbmRlcktpdEZhY3RvcnkKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotICAgIHByaXZhdGUgUmVuZGVyS2l0RmFjdG9yeSB3cmFwcGVkOwotICAgIHByaXZhdGUgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBkZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIGlzRGVhY3RpdmF0ZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeShSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnkpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSByZW5kZXJLaXRGYWN0b3J5OwotCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyS2l0KFN0cmluZyBzLCBSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkLmFkZFJlbmRlcktpdChzLCByZW5kZXJLaXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZW5kZXJLaXQgZ2V0UmVuZGVyS2l0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgUmVuZGVyS2l0IHJlbmRlcktpdCA9IHRoaXMud3JhcHBlZC5nZXRSZW5kZXJLaXQoZmFjZXNDb250ZXh0LCBzKTsKLQotICAgICAgICAvL2ZvciBtb2phcnJhICsgdHJpbmlkYWQKLSAgICAgICAgaWYocmVuZGVyS2l0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5VG9Jbml0RGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7Ci0KLSAgICAgICAgY2hlY2tSZW5kZXJLaXRGYWN0b3J5RGVhY3RpdmF0aW9uKCk7Ci0KLSAgICAgICAgaWYodGhpcy5pc0RlYWN0aXZhdGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy90ZXN0IGVhcmx5IGNvbmZpZyBpbiBjYXNlIG9mIG1vamFycmEKLSAgICAgICAgaWYoIXRoaXMuZGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmlzQXBwbGljYXRpb25Jbml0aWFsaXplZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY3JlYXRlV3JhcHBlcihyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRyeVRvQ3JlYXRlV3JhcHBlcldpdGhXcmFwcGVyRmFjdG9yeShyZW5kZXJLaXQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja1JlbmRlcktpdEZhY3RvcnlEZWFjdGl2YXRpb24oKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5pc0RlYWN0aXZhdGVkID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLmlzRXh0VmFsRGVhY3RpdmF0ZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmlzRGVhY3RpdmF0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYodGhpcy5kZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuaXNBcHBsaWNhdGlvbkluaXRpYWxpemVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc0RlYWN0aXZhdGVkID0gaXNSZW5kZXJLaXRGYWN0b3J5RGVhY3RpdmF0ZWRWaWFXZWJYbWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmlzRGVhY3RpdmF0ZWQgPSBpc1JlbmRlcktpdEZhY3RvcnlEZWFjdGl2YXRlZFZpYVZNUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHRyeVRvSW5pdERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpCi0gICAgewotICAgICAgICBpZih0aGlzLmRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL3dvcmthcm91bmQgZm9yIG1vamFycmEgdG8gYWxsb3cgYSBjdXN0b20gZmFjdG9yeSBkdXJpbmcgdGhlIGVhcmx5IGNvbmZpZyBwaGFzZQotICAgICAgICAgICAgLy9qdXN0IGNyZWF0ZSB0aGUgZmFjdG9yeSB3aXRoIHRoZSBnaXZlbiBuYW1lCi0gICAgICAgICAgICAvLytpdCBzaG91bGQgZXh0ZW5kIHlvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIHdoaWNoIHlvdSByZWdpc3RlciBhcyB1c3VhbAotICAgICAgICAgICAgT2JqZWN0IGN1c3RvbUZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoCi0gICAgICAgICAgICAgICAgICAgIEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsgIi5jdXN0b20uUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkiKTsKLQotICAgICAgICAgICAgaWYoY3VzdG9tRmFjdG9yeSBpbnN0YW5jZW9mIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgPSAoQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSljdXN0b21GYWN0b3J5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID0gbmV3IERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJLaXQgdHJ5VG9DcmVhdGVXcmFwcGVyV2l0aFdyYXBwZXJGYWN0b3J5KFJlbmRlcktpdCByZW5kZXJLaXQpCi0gICAgewotICAgICAgICBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHdyYXBwZXJGYWN0b3J5ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgLy9zb21lIGNvbXBvbmVudCBsaWJzIGUuZy4gbXlmYWNlcy10cmluaWRhZCBhcmVuJ3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgY2xlYW4gYXBwcm9hY2gKLSAgICAgICAgLy9leGFtcGxlIHNlZSBUcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lcgotICAgICAgICBpZih3cmFwcGVyRmFjdG9yeS5pc0RlYWN0aXZhdGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJLaXQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gd3JhcHBlckZhY3RvcnkuY3JlYXRlKHJlbmRlcktpdCk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gZ2V0UmVuZGVyS2l0SWRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQuZ2V0UmVuZGVyS2l0SWRzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVuZGVyS2l0RmFjdG9yeURlYWN0aXZhdGVkVmlhV2ViWG1sKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9SRU5ERVJfS0lUX0ZBQ1RPUlkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlbmRlcktpdEZhY3RvcnlEZWFjdGl2YXRlZFZpYVZNUGFyYW1ldGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShTeXN0ZW0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgKwotICAgICAgICAgICAgICAgICAgICAiLkRFQUNUSVZBVEVfUkVOREVSX0tJVF9GQUNUT1JZIiwgImZhbHNlIikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyUHJveHkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzNjEzYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5SZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUmVuZGVyZXJQcm94eVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSnNmUHJvamVjdFN0YWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIHRvIGF2b2lkIG11bHRpcGxlIGNhbGxzIG9mIHJlbmRlcmVyIG1ldGhvZHMgd2l0aGluIHJlbmRlcmVyIGludGVyY2VwdG9ycyAoZS5nLiBmb3IgZW5jb2RlLCBkZWNvZGUsLi4uKQotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyZXJQcm94eSBleHRlbmRzIFJlbmRlcmVyCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZID0gRXh0VmFsUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCkgKyAiOktFWSI7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgd3JhcHBlZDsKLQotICAgIHB1YmxpYyBFeHRWYWxSZW5kZXJlclByb3h5KFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyZXI7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgicHJveHkgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkgPSBnZXRSZW5kZXJlckVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNEZWNvZGVDYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RGVjb2RlQ2FsbGVkKHRydWUpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLndyYXBwZWQuZGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnlUb0NyZWF0ZU1lc3NhZ2UoImRlY29kZSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBlbnRyeSA9IGdldFJlbmRlcmVyRW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0VuY29kZUJlZ2luQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldEVuY29kZUJlZ2luQ2FsbGVkKHRydWUpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVkLmVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnlUb0NyZWF0ZU1lc3NhZ2UoImVuY29kZUJlZ2luIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGVudHJ5ID0gZ2V0UmVuZGVyZXJFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRW5jb2RlQ2hpbGRyZW5DYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RW5jb2RlQ2hpbGRyZW5DYWxsZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlZC5lbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DcmVhdGVNZXNzYWdlKCJlbmNvZGVDaGlsZHJlbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkgPSBnZXRSZW5kZXJlckVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNFbmNvZGVFbmRDYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RW5jb2RlRW5kQ2FsbGVkKHRydWUpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLndyYXBwZWQuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnlUb0NyZWF0ZU1lc3NhZ2UoImVuY29kZUVuZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0Q2xpZW50SWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udmVydENsaWVudElkKGZhY2VzQ29udGV4dCwgcyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgewotICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICB0aHJvdyB0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkgPSBnZXRSZW5kZXJlckVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmIChlbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVudHJ5LnNldENvbnZlcnRlZFZhbHVlKHdyYXBwZWQuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnlUb0NyZWF0ZU1lc3NhZ2UoImdldENvbnZlcnRlZFZhbHVlIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZ2V0UmVuZGVyZXJFbnRyeShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGtleSArPSBnZXRPcHRpb25hbEtleShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWdldFJlbmRlcmVyU3RvcmFnZSgpLmNvbnRhaW5zRW50cnkoZ2V0UmVuZGVyZXJLZXkoKSwga2V5KSkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0UmVuZGVyZXJTdG9yYWdlKCkuc2V0RW50cnkoZ2V0UmVuZGVyZXJLZXkoKSwga2V5LCBuZXcgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZXJTdG9yYWdlKCkuZ2V0RW50cnkoZ2V0UmVuZGVyZXJLZXkoKSwga2V5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wdGlvbmFsS2V5KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVuZGVyZXJLZXkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFByb3h5VXRpbHMuZ2V0Q2xhc3NOYW1lKHRoaXMud3JhcHBlZC5nZXRDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlbmRlcmVyUHJveHlTdG9yYWdlIGdldFJlbmRlcmVyU3RvcmFnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShSZW5kZXJlclByb3h5U3RvcmFnZS5jbGFzcywgUmVuZGVyZXJQcm94eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgLy9yZXNldCBjb21wb25lbnQgcHJveHkgbWFwcGluZwotICAgICAgICBFeHRWYWxVdGlscy5yZXNldFN0b3JhZ2UoUmVuZGVyZXJQcm94eVN0b3JhZ2UuY2xhc3MsIFJlbmRlcmVyUHJveHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvQ3JlYXRlTWVzc2FnZShTdHJpbmcgbWV0aG9kTmFtZSkKLSAgICB7Ci0gICAgICAgIGlmKEpzZlByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuRGV2ZWxvcG1lbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJkb3VibGUgY2FsbCBvZiAiICsgdGhpcy53cmFwcGVkLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiMiICsgbWV0aG9kTmFtZSArICIgZmlsdGVyZWQuICIgKwotICAgICAgICAgICAgICAgICAgICAidGhpcyBvcHRpbWl6YXRpb24gbWlnaHQgbGVhZCB0byBpbmNvbXBhdGliaWxpdGllcyB3aXRoIHNvbWUgY29tcG9uZW50IGxpYnMuICIgKwotICAgICAgICAgICAgICAgICAgICAiaW4gc3VjaCBhIGNhc2UgdXNlIHRoZSBzdXBwb3J0IG1vZHVsZSBmb3IgdGhlIGNvbXBvbmVudCBsaWIgb3IgdXNlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgIkV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZLCBudWxsKTsgIiArCi0gICAgICAgICAgICAgICAgICAgICJpbiBhIHN0YXJ0dXAgbGlzdGVuZXIiOwotCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgLmFkZE1lc3NhZ2UobnVsbCwgRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOLCBtZXNzYWdlLCBtZXNzYWdlKSk7Ci0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4obWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJ0dXJuIG9uIHRoZSBkZXZlbG9wbWVudCBtb2RlIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCBpZiBzb21ldGhpbmcgaXMgZGlzcGxheWVkIHdyb25nLiIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjMzA1ZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotCi0vKioKLSAqIERlZmF1bHQgYXBwcm9hY2ggdG8gYXZvaWQgcHJveGllcyBmb3IgY29udmVydGVycyBhbmQgdGhlIGFkYXB0ZXIgZmFsbGJhY2suCi0gKiBJdCByZXF1aXJlcyB0aGF0IGNvbXBvbmVudHMgZGVsZWdhdGUgZ2V0Q29udmVydGVkVmFsdWUgdG8gYSByZW5kZXJlci48YnIvPgotICogSWYgaXQgaXNuJ3QgdGhlIGNhc2UgZm9yIHlvdXIgY29tcG9uZW50IGxpYiB1c2U6Ci0gKiBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5FeHRWYWxBcHBsaWNhdGlvbkZhY3Rvcnk8YnIvPgotICogYW5kPGJyLz4KLSAqIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5LlByb3h5TWFwcGluZ1BoYXNlTGlzdGVuZXIKLSAqIDxwLz4KLSAqIFRoaXMgd3JhcHBlciB3aWxsIGFsc28gaW1wbGVtZW50IGNsaWVudC1zaWRlIHZhbGlkYXRpb24gYmVoYXZpb3VyCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJlcldyYXBwZXIgZXh0ZW5kcyBSZW5kZXJlcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgd3JhcHBlZDsKLSAgICBwcm90ZWN0ZWQgRXh0VmFsQ29udGV4dCBleHRWYWxDb250ZXh0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCk7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyZXJXcmFwcGVyKFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHByb3h5Q2xhc3NOYW1lID0gKFN0cmluZylFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSk7Ci0KLSAgICAgICAgaWYocHJveHlDbGFzc05hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyBleHR2YWwgcmVuZGVyZXIgcHJveHkgY29uZmlndXJlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSBuZXcgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkocmVuZGVyZXIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShwcm94eUNsYXNzTmFtZSk7Ci0KLSAgICAgICAgaWYodGFyZ2V0Q2xhc3MgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyBleHR2YWwgcmVuZGVyZXIgcHJveHkgY29uZmlndXJlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSBuZXcgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkocmVuZGVyZXIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xhc3NbXSBhcmdDbGFzc2VzID0gbmV3IENsYXNzWzFdOwotICAgICAgICBhcmdDbGFzc2VzWzBdID0gUmVuZGVyZXIuY2xhc3M7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGFyZ2V0Q2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJnQ2xhc3Nlcyk7Ci0gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSAoUmVuZGVyZXIpY29uc3RydWN0b3IubmV3SW5zdGFuY2UocmVuZGVyZXIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIud2Fybigibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVyZXIgd3JhcHBlciBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkZWNvZGUgZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRGVjb2RlIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJEZWNvZGUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckRlY29kZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImVuY29kZUJlZ2luIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUJlZ2luIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUJlZ2luIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVFbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZW5jb2RlQ2hpbGRyZW4gZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlQ2hpbGRyZW4gb2YgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUNoaWxkcmVuIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJFbmNvZGVDaGlsZHJlbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVDaGlsZHJlbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQ2hpbGRyZW4gaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJlbmNvZGVFbmQgZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUVuZCBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVFbmQgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGdldFJlbmRlcnNDaGlsZHJlbigpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZW5kZXJzQ2hpbGRyZW4oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLSAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbywgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdCA9IGUuZ2V0UmV0dXJuVmFsdWVPbkV4Y2VwdGlvbihjb252ZXJ0ZWRPYmplY3QpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImdldENvbnZlcnRlZFZhbHVlIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUdldENvbnZlcnRlZFZhbHVlIG9mICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QgPSB3cmFwcGVkLmdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8pOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyR2V0Q29udmVydGVkVmFsdWUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvLCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyR2V0Q29udmVydGVkVmFsdWUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckdldENvbnZlcnRlZFZhbHVlIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZE9iamVjdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMmZmZGEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNDcyNzkwNDk4NzY2MjUxMzQ2TDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThjMjBhNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDE4NDI0MDUxNDY0ODE0ODg4TDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkyMGZiZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlJlbmRlcmVySW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICAgIHByb3RlY3RlZCBSZW5kZXJlckludGVyY2VwdG9yIGV4Y2VwdGlvblNvdXJjZTsKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGluZm9ybWF0aW9uOwotICAgIGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjM0MzA3NDA3NzUzMjkxNTcyMkw7Ci0KLSAgICBwdWJsaWMgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbigpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzKQotICAgIHsKLSAgICAgICAgdGhpcy5za2lwT3RoZXJJbnRlcmNlcHRvcnMgPSBza2lwT3RoZXJJbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgcHVibGljIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oYm9vbGVhbiBza2lwT3RoZXJJbnRlcmNlcHRvcnMsIFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHRoaXMoc2tpcE90aGVySW50ZXJjZXB0b3JzKTsKLSAgICAgICAgdGhpcy5leGNlcHRpb25Tb3VyY2UgPSByZW5kZXJlckludGVyY2VwdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEluZm9ybWF0aW9uKE9iamVjdCBpbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIHRoaXMuaW5mb3JtYXRpb24gPSBpbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEluZm9ybWF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NraXBPdGhlckludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gc2tpcE90aGVySW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmV0dXJuVmFsdWVPbkV4Y2VwdGlvbihPYmplY3QgY3VycmVudFJldHVyblZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMuZXhjZXB0aW9uU291cmNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmV4Y2VwdGlvblNvdXJjZS5nZXRSZXR1cm5WYWx1ZU9uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbih0aGlzLCBjdXJyZW50UmV0dXJuVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjdXJyZW50UmV0dXJuVmFsdWU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0Fic3RyYWN0U3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYzRkNGQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0Fic3RyYWN0U3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Qcm9qZWN0U3RhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIGV4ZWN1dGUgbG9naWMganVzdCBvbmNlLg0KLSAqIGUuZy4gcmVnaXN0ZXIgYXJ0aWZhY3RzIHZpYSBhcGkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgLy9kb24ndCByZW1vdmUgLSBpdCdzIGEgZmFsbGJhY2sgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggZGVyZWdpc3RyYXRpb24NCi0gICAgLy90YXJnZXQ6IGRvbid0IHByb2Nlc3MgaW5pdCBsb2dpYyBtb3JlIHRoYW4gb25jZQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENsYXNzPiBpbml0aWFsaXplZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVySW5pdGlhbGl6ZWQgPSBmYWxzZTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKEFic3RyYWN0U3RhcnR1cExpc3RlbmVyLmNsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZWRMaXN0ZW5lcnMuY29udGFpbnMoZ2V0Q2xhc3MoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnQgaW5pdCBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWlzU3RhcnR1cExpc3RlbmVyRGVhY3RpdmF0ZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJpbml0IG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZGVhY3RpdmF0ZWQiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImluaXQgb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBKc2ZVdGlscy5kZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcih0aGlzKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBkZXJlZ2lzdGVyaW5nIHRoZSBwaGFzZS1saXN0ZW5lciINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtPiB0aGVyZSBpcyBqdXN0IGEgbGl0dGxlIG92ZXJoZWFkLCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBidXQgZXZlcnl0aGluZyBlbHNlIHdvcmtzIGNvcnJlY3RseS4iDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaG93ZXZlciwgcGxlYXNlIGluZm9ybSB0aGUgY29tbXVuaXR5IGFib3V0IHlvdXIgY29uZmlndXJhdGlvbiIsIHQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWRMaXN0ZW5lcnMuYWRkKGdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5SRVNUT1JFX1ZJRVc7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTdGFydHVwTGlzdGVuZXJEZWFjdGl2YXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5pc0V4dFZhbERlYWN0aXZhdGVkKCkgfHwNCi0gICAgICAgICAgICAgICAgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sVXRpbHMuZ2V0SW5pdFBhcmFtZXRlcihudWxsLCBnZXRDbGFzcygpLmdldE5hbWUoKSArICI6REVBQ1RJVkFURUQiKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFByb2plY3RTdGFnZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgaWYoIWRlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlckluaXRpYWxpemVkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoUHJvamVjdFN0YWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpLCBnZXRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpLCBmYWxzZSk7DQotICAgICAgICAgICAgZGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVySW5pdGlhbGl6ZWQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBQcm9qZWN0U3RhZ2VSZXNvbHZlciBnZXRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdCgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOTc3MjcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0V4dFZhbFN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlBoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXIKLSAgICAgICAgLkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uQ29uc3RyYWludFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLklnbm9yZUNvbnN0cmFpbnRTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5UYXJnZXRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlRhcmdldFByb3BlcnR5SWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yNTA0ODI2NDIxMDg2NTcyMDEyTDsKLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoRXh0VmFsSW5mb3JtYXRpb24uVkVSU0lPTiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydGluZyB1cCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIHYiICsgRXh0VmFsSW5mb3JtYXRpb24uVkVSU0lPTik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oInN0YXJ0aW5nIHVwIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgVmFsaWRhdGlvbkludGVyY2VwdG9yKCkpOwotCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZLCBFeHRWYWxSZW5kZXJlclByb3h5LmNsYXNzLmdldE5hbWUoKSwgZmFsc2UpOwotCi0gICAgICAgIGluaXROYW1lTWFwcGVycygpOwotICAgICAgICBpbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICBpbml0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOwotICAgICAgICBpbml0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIGluaXRQaGFzZUxpc3RlbmVycygpOwotICAgICAgICBpbml0VmlvbGF0aW9uU2V2ZXJpdHlLZXkoKTsKLSAgICAgICAgaW5pdERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbktleSgpOwotICAgICAgICBpbml0UmVxdWlyZWRJbml0aWFsaXphdGlvbigpOwotICAgICAgICBpbml0RGVmYXVsdENvbnN0cmFpbnRTb3VyY2VBbm5vdGF0aW9ucygpOwotCi0gICAgICAgIGV4ZWN1dGVDdXN0b21TdGFydHVwTGlzdGVuZXIoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdE5hbWVNYXBwZXJzKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBkZWFjdGl2YXRlRGVmYXVsdE5hbWVNYXBwZXJzID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfREVGQVVMVF9OQU1FX01BUFBFUlM7Ci0gICAgICAgIGlmICgoZGVhY3RpdmF0ZURlZmF1bHROYW1lTWFwcGVycyAhPSBudWxsICYmIGRlYWN0aXZhdGVEZWZhdWx0TmFtZU1hcHBlcnMuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9yZWdpc3RlciBtZXRhZGF0YSB0byB2YWxpZGF0aW9uIHN0cmF0ZWd5IG5hbWUgbWFwcGVyCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7Ci0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7Ci0KLSAgICAgICAgLy9yZWdpc3RlciB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1lc3NhZ2UgcmVzb2x2ZXIgbmFtZSBtYXBwZXIKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotCi0gICAgICAgIC8vcmVnaXN0ZXIgdmFsaWRhdGlvbiBzdHJhdGVneSB0byBtZXRhZGF0YSB0cmFuc2Zvcm1lciBuYW1lIG1hcHBlcgotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVDdXN0b21TdGFydHVwTGlzdGVuZXIoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lck5hbWUgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVJUVVBfTElTVEVORVIpOwotICAgICAgICBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lciBjdXN0b21TdGFydHVwTGlzdGVuZXIgPQotICAgICAgICAgICAgKEFic3RyYWN0U3RhcnR1cExpc3RlbmVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjdXN0b21TdGFydHVwTGlzdGVuZXJOYW1lKTsKLQotICAgICAgICBpZihjdXN0b21TdGFydHVwTGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnQgaW5pdCBvZiAiICsgY3VzdG9tU3RhcnR1cExpc3RlbmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3VzdG9tU3RhcnR1cExpc3RlbmVyLmluaXQoKTsKLQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiaW5pdCBvZiAiICsgY3VzdG9tU3RhcnR1cExpc3RlbmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigKLSAgICAgICAgICAgICAgICBuZXcgSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkpOwotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoCi0gICAgICAgICAgICAgICAgbmV3IFZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpCi0gICAgewotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5zZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKG5ldyBEZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IEZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0UGhhc2VMaXN0ZW5lcnMoKQotICAgIHsKLSAgICAgICAgSnNmVXRpbHMucmVnaXN0ZXJQaGFzZUxpc3RlbmVyKG5ldyBQaGFzZUlkUmVjb3JkaW5nUGhhc2VMaXN0ZW5lcigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFZpb2xhdGlvblNldmVyaXR5S2V5KCkKLSAgICB7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KFZpb2xhdGlvblNldmVyaXR5LmNsYXNzLmdldE5hbWUoKSwgVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbktleSgpCi0gICAgewotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFJlcXVpcmVkSW5pdGlhbGl6YXRpb24oKQotICAgIHsKLSAgICAgICAgaWYoV2ViWG1sUGFyYW1ldGVyLkFDVElWQVRFX1JFUVVJUkVEX0lOSVRJQUxJWkFUSU9OICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gcmVxdWlyZWRJbml0aWFsaXphdGlvbiA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFBhcmFtZXRlci5BQ1RJVkFURV9SRVFVSVJFRF9JTklUSUFMSVpBVElPTik7Ci0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KCJtb2RlOmluaXQ6cmVxdWlyZWQiLCByZXF1aXJlZEluaXRpYWxpemF0aW9uLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgIGlmKHJlcXVpcmVkSW5pdGlhbGl6YXRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGVhY3RpdmF0ZVJlcXVpcmVkQXR0cmlidXRlU3VwcG9ydCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXREZWZhdWx0Q29uc3RyYWludFNvdXJjZUFubm90YXRpb25zKCkKLSAgICB7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KENvbnN0cmFpbnRTb3VyY2UuY2xhc3MuZ2V0TmFtZSgpLCBDb25zdHJhaW50U291cmNlLmNsYXNzLCBmYWxzZSk7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KElnbm9yZUNvbnN0cmFpbnRTb3VyY2UuY2xhc3MuZ2V0TmFtZSgpLCBJZ25vcmVDb25zdHJhaW50U291cmNlLmNsYXNzLCBmYWxzZSk7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KFRhcmdldFByb3BlcnR5LmNsYXNzLmdldE5hbWUoKSwgVGFyZ2V0UHJvcGVydHkuY2xhc3MsIGZhbHNlKTsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkKLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoVGFyZ2V0UHJvcGVydHlJZC5jbGFzcy5nZXROYW1lKCksIFRhcmdldFByb3BlcnR5SWQuY2xhc3MsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpZiBpdCdzIGNvbmZpZ3VyZWQgdGhhdCByZXF1aXJlZCBpbml0IHNob3VsZCBoYXBwZW4sCi0gICAgICogaXQncyByZXF1aXJlZCB0byBkZWFjdGl2YXRlIHRoZSBzdXBwb3J0IGZvciB0aGUgcmVxdWlyZWQgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRlYWN0aXZhdGVSZXF1aXJlZEF0dHJpYnV0ZVN1cHBvcnQoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoIm1vZGU6cmVzZXQ6cmVxdWlyZWQiLCBCb29sZWFuLlRSVUUsIGZhbHNlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0QXBwbGljYXRpb25TY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIzOGJkZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5SRVVTRTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIGdlbmVyaWMgc3RvcmFnZSBtYW5hZ2VyIGltcGxlbWVudGF0aW9uIHdoaWNoIHN0b3JlcyB0aGUgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbnMgaW4gdGhlIGFwcGxpY2F0aW9uIHNjb3BlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihSRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxUPiBleHRlbmRzIEFic3RyYWN0U3RvcmFnZU1hbmFnZXI8VD4NCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBUPiByZXNvbHZlU3RvcmFnZU1hcCgpDQotICAgIHsNCi0gICAgICAgIE1hcCBhcHBsaWNhdGlvbk1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbk1hcCgpOw0KLSAgICAgICAgTWFwPFN0cmluZywgVD4gc3RvcmFnZU1hcDsNCi0NCi0gICAgICAgIGlmKCFhcHBsaWNhdGlvbk1hcC5jb250YWluc0tleShnZXRTdG9yYWdlTWFuYWdlcktleSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUPigpOw0KLSAgICAgICAgICAgIGFwcGxpY2F0aW9uTWFwLnB1dChnZXRTdG9yYWdlTWFuYWdlcktleSgpLCBzdG9yYWdlTWFwKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoTWFwPFN0cmluZywgVD4pYXBwbGljYXRpb25NYXAuZ2V0KGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY2NjE0ZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LlJFVVNFOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogZ2VuZXJpYyBzdG9yYWdlIG1hbmFnZXIgaW1wbGVtZW50YXRpb24gd2hpY2ggc3RvcmVzIHRoZSBzdG9yYWdlIGltcGxlbWVudGF0aW9ucyBpbiB0aGUgcmVxdWVzdCBzY29wZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxUPiBleHRlbmRzIEFic3RyYWN0U3RvcmFnZU1hbmFnZXI8VD4NCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBUPiByZXNvbHZlU3RvcmFnZU1hcCgpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFQ+IHN0b3JhZ2VNYXA7DQotDQotICAgICAgICBpZighcmVxdWVzdE1hcC5jb250YWluc0tleShnZXRTdG9yYWdlTWFuYWdlcktleSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUPigpOw0KLSAgICAgICAgICAgIHJlcXVlc3RNYXAucHV0KGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCksIHN0b3JhZ2VNYXApOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChNYXA8U3RyaW5nLCBUPilyZXF1ZXN0TWFwLmdldChnZXRTdG9yYWdlTWFuYWdlcktleSgpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RTdG9yYWdlTWFuYWdlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0U3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg5OGI5Ny4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5SRVVTRTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBnZW5lcmljIHN0b3JhZ2UgbWFuYWdlciBpbXBsZW1lbnRhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RvcmFnZU1hbmFnZXI8VD4gZXh0ZW5kcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8U3RyaW5nPg0KLSAgICAgICAgaW1wbGVtZW50cyBTdG9yYWdlTWFuYWdlcjxUPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4oKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0U3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBUIGNyZWF0ZShTdHJpbmcgc3RvcmFnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIFQgc3RvcmFnZU1hbmFnZXI7DQotICAgICAgICBTdHJpbmcgc3RvcmFnZUNsYXNzTmFtZTsNCi0gICAgICAgIC8vbnVsbCAtPiB1c2UgbmFtZSBtYXBwZXJzDQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8U3RyaW5nPiBuYW1lTWFwcGVyIDogdGhpcy5uYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlQ2xhc3NOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKHN0b3JhZ2VOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoc3RvcmFnZUNsYXNzTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHN0b3JhZ2VNYW5hZ2VyID0gcmVzb2x2ZVN0b3JhZ2Uoc3RvcmFnZU5hbWUsIHN0b3JhZ2VDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChzdG9yYWdlTWFuYWdlciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2VNYW5hZ2VyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBUIHJlc29sdmVTdG9yYWdlKFN0cmluZyBzdG9yYWdlS2V5LCBTdHJpbmcgc3RvcmFnZUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgVD4gc3RvcmFnZU1hcCA9IHJlc29sdmVTdG9yYWdlTWFwKCk7DQotDQotICAgICAgICBpZighc3RvcmFnZU1hcC5jb250YWluc0tleShzdG9yYWdlS2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlTWFwLnB1dChzdG9yYWdlS2V5LCAoVClDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoc3RvcmFnZUNsYXNzTmFtZSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHN0b3JhZ2VNYXAuZ2V0KHN0b3JhZ2VLZXkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNYXA8U3RyaW5nLCBUPiByZXNvbHZlU3RvcmFnZU1hcCgpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgc3RvcmFnZUtleSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgVD4gc3RvcmFnZU1hcCA9IHJlc29sdmVTdG9yYWdlTWFwKCk7DQotDQotICAgICAgICBpZihzdG9yYWdlTWFwICE9IG51bGwgJiYgc3RvcmFnZU1hcC5jb250YWluc0tleShzdG9yYWdlS2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDbGFzcyBzdG9yYWdlQ2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHN0b3JhZ2VNYXAuZ2V0KHN0b3JhZ2VLZXkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgIHN0b3JhZ2VNYXAucHV0KHN0b3JhZ2VLZXksIChUKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHN0b3JhZ2VDbGFzcykpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gZ2V0TmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5uYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdhZjAzMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlIGltcGxlbWVudHMgRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgUGhhc2VJZCBjdXJyZW50UGhhc2VJZDsNCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q3VycmVudFBoYXNlSWQoUGhhc2VJZCBwaGFzZUlkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmN1cnJlbnRQaGFzZUlkID0gcGhhc2VJZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRDdXJyZW50UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRQaGFzZUlkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTEzYmRmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlci5EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIGpzZiBpbmZvcm1hdGlvbiBub3QgYXZhaWxhYmxlIHZpYSBqc2YtYXBpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIgZXh0ZW5kcw0KLSAgICAgICAgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlPg0KLXsNCi0gICAgRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBEZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfRkFDRVNfSU5GT1JNQVRJT05fU1RPUkFHRTpLRVkiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDZiN2MuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuRmFjZXNNZXNzYWdlSG9sZGVyOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gIm9wdGlvbmFsIHBhcmFtZXRlciB0byBkZWFjdGl2YXRlIHNvcnRpbmciKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlIGltcGxlbWVudHMgRmFjZXNNZXNzYWdlU3RvcmFnZQ0KLXsNCi0gICAgTWFwPFN0cmluZywgVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgVmFsaWRhdGlvblJlc3VsdD4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkRmFjZXNNZXNzYWdlKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYoY2xpZW50SWQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjbGllbnRJZCA9ICIqIjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKCF0aGlzLnJlc3VsdHMuY29udGFpbnNLZXkoY2xpZW50SWQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMucmVzdWx0cy5wdXQoY2xpZW50SWQsIG5ldyBWYWxpZGF0aW9uUmVzdWx0KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGhpcy5yZXN1bHRzLmdldChjbGllbnRJZCkuYWRkRmFjZXNNZXNzYWdlSG9sZGVyKG5ldyBGYWNlc01lc3NhZ2VIb2xkZXIoZmFjZXNNZXNzYWdlLCBjbGllbnRJZCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZ2V0RmFjZXNNZXNzYWdlcygpDQotICAgIHsNCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgICAgIGZvcihWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRpb25SZXN1bHQgOiB0aGlzLnJlc3VsdHMudmFsdWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh2YWxpZGF0aW9uUmVzdWx0LmdldEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEFsbCgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdDsNCi0NCi0gICAgICAgIGZvcihWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRpb25SZXN1bHQgOiB0aGlzLnJlc3VsdHMudmFsdWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCA9IHZhbGlkYXRpb25SZXN1bHQuZ2V0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdCgpOw0KLSAgICAgICAgICAgIHNvcnRGYWNlc01lc3NhZ2VIb2xkZXJMaXN0KGZhY2VzTWVzc2FnZUhvbGRlckxpc3QpOw0KLQ0KLSAgICAgICAgICAgIGZvcihGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyIDogZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dC5hZGRNZXNzYWdlKGZhY2VzTWVzc2FnZUhvbGRlci5nZXRDbGllbnRJZCgpLCBmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0RmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc29ydEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QpDQotICAgIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCwgZ2V0RmFjZXNNZXNzYWdlQ29tcGFyYXRvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgQ29tcGFyYXRvcjxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZUNvbXBhcmF0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IENvbXBhcmF0b3I8RmFjZXNNZXNzYWdlSG9sZGVyPigpIHsNCi0gICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoRmFjZXNNZXNzYWdlSG9sZGVyIGhvbGRlcjEsIEZhY2VzTWVzc2FnZUhvbGRlciBob2xkZXIyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoaG9sZGVyMS5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpID09IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKGlzU2FtZVNldmVyaXR5KGhvbGRlcjEsIGhvbGRlcjIpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZU1lc3NhZ2VUZXh0KGhvbGRlcjEuZ2V0RmFjZXNNZXNzYWdlKCksIGhvbGRlcjIuZ2V0RmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmKGhvbGRlcjEuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKS5nZXRPcmRpbmFsKCkgPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlcjIuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKS5nZXRPcmRpbmFsKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByaXZhdGUgaW50IGNvbXBhcmVNZXNzYWdlVGV4dChGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlMSwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZTIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dDEgPSBmYWNlc01lc3NhZ2UxLmdldERldGFpbCgpOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dDIgPSBmYWNlc01lc3NhZ2UyLmdldERldGFpbCgpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZih0ZXh0MSA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0ZXh0MSA9IGZhY2VzTWVzc2FnZTEuZ2V0U3VtbWFyeSgpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmKHRleHQyID09IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRleHQyID0gZmFjZXNNZXNzYWdlMi5nZXRTdW1tYXJ5KCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYodGV4dDEgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYodGV4dDIgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0MS5jb21wYXJlVG9JZ25vcmVDYXNlKHRleHQyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NhbWVTZXZlcml0eShGYWNlc01lc3NhZ2VIb2xkZXIgaG9sZGVyMSwgRmFjZXNNZXNzYWdlSG9sZGVyIGhvbGRlcjIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBob2xkZXIxLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkuZXF1YWxzKGhvbGRlcjIuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTWFuYWdlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTIzMjZmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTmFtZU1hcHBlcjsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgZmFjZXMgbWVzc2FnZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTWFuYWdlciBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxGYWNlc01lc3NhZ2VTdG9yYWdlPg0KLXsNCi0gICAgRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX0ZBQ0VTX01FU1NBR0VTOktFWSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0R3JvdXBTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YjRkNjEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Hcm91cFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGdyb3Vwcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRHcm91cFN0b3JhZ2UgaW1wbGVtZW50cyBHcm91cFN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IGFkZGVkR3JvdXBzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PENsYXNzPj4oKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PENsYXNzPj4gcmVzdHJpY3RlZEdyb3VwcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgYWRkR3JvdXBUb0dyb3VwU3RvcmFnZShncm91cENsYXNzLCB2aWV3SWQsIGNsaWVudElkLCB0aGlzLmFkZGVkR3JvdXBzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZXN0cmljdEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgYWRkR3JvdXBUb0dyb3VwU3RvcmFnZShncm91cENsYXNzLCB2aWV3SWQsIGNsaWVudElkLCB0aGlzLnJlc3RyaWN0ZWRHcm91cHMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzc1tdIGdldEdyb3VwcyhTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMuYWRkZWRHcm91cHMuc2l6ZSgpIDwgMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vYWRkIGZvdW5kIGdyb3Vwcw0KLSAgICAgICAgU3RyaW5nIGtleSA9IEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBudWxsKTsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IHJlc3VsdExpc3RGb3JQYWdlID0gYnVpbGRHcm91cExpc3Qoa2V5LCB0aGlzLmFkZGVkR3JvdXBzKTsNCi0NCi0gICAgICAgIGtleSA9IEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBjbGllbnRJZCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN1bHRMaXN0Rm9yQ29tcG9uZW50ID0gYnVpbGRHcm91cExpc3Qoa2V5LCB0aGlzLmFkZGVkR3JvdXBzKTsNCi0NCi0gICAgICAgIC8vcmVtb3ZlIHJlc3RyaWN0ZWQgZ3JvdXBzDQotICAgICAgICBDbGFzc1tdIHJlc3VsdHNGb3JQYWdlID0NCi0gICAgICAgICAgICAgICAgZmlsdGVyR3JvdXBMaXN0KEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBudWxsKSwgcmVzdWx0TGlzdEZvclBhZ2UpOw0KLSAgICAgICAgQ2xhc3NbXSByZXN1bHRzRm9yQ29tcG9uZW50ID0NCi0gICAgICAgICAgICAgICAgZmlsdGVyR3JvdXBMaXN0KEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBjbGllbnRJZCksIHJlc3VsdExpc3RGb3JDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0c0ZvclBhZ2UubGVuZ3RoID09IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYocmVzdWx0c0ZvckNvbXBvbmVudC5sZW5ndGggPT0gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCJubyBncm91cHMgZm9yIGdyb3VwLXZhbGlkYXRpb24gYXZhaWxhYmxlLiIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF5YmUgeW91IHJlc3RyaWN0ZWQgYWxsIGdyb3VwcyBvciB5b3UgYXJlbid0IHVzaW5nIGdyb3Vwcy4iICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlYW4gdmFsaWRhdGlvbiB3aWxsIHVzZSB0aGUgZGVmYXVsdCBncm91cCBmb3IgdmFsaWRhdGlvbiIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRzRm9yQ29tcG9uZW50Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihyZXN1bHRzRm9yQ29tcG9uZW50Lmxlbmd0aCA9PSAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRzRm9yUGFnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBtZXJnZVJlc3VsdHMocmVzdWx0c0ZvclBhZ2UsIHJlc3VsdHNGb3JDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRHcm91cFRvR3JvdXBTdG9yYWdlKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IGdyb3VwU3RvcmFnZSkNCi0gICAgew0KLSAgICAgICAgTGlzdDxDbGFzcz4gZ3JvdXBMaXN0ID0gZ3JvdXBTdG9yYWdlLmdldChHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgY2xpZW50SWQpKTsNCi0NCi0gICAgICAgIGlmKGdyb3VwTGlzdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGdyb3VwTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgICAgICAgICAgZ3JvdXBTdG9yYWdlLnB1dChHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgY2xpZW50SWQpLCBncm91cExpc3QpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoIWdyb3VwTGlzdC5jb250YWlucyhncm91cENsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBncm91cExpc3QuYWRkKGdyb3VwQ2xhc3MpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxDbGFzcz4gYnVpbGRHcm91cExpc3QoU3RyaW5nIGtleSwgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IGdyb3VwU3RvcmFnZSkNCi0gICAgew0KLSAgICAgICAgTGlzdDxDbGFzcz4gbGlzdCA9IGdyb3VwU3RvcmFnZS5nZXQoa2V5KTsNCi0gICAgICAgIHJldHVybiAobGlzdCAhPSBudWxsKSA/IGxpc3QgOiBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3NbXSBmaWx0ZXJHcm91cExpc3QoU3RyaW5nIGtleSwgTGlzdDxDbGFzcz4gYWRkZWRHcm91cHMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHMgPSBidWlsZEdyb3VwTGlzdChrZXksIHRoaXMucmVzdHJpY3RlZEdyb3Vwcyk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBjdXJyZW50R3JvdXAgOiBhZGRlZEdyb3VwcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighcmVzdHJpY3RlZEdyb3Vwcy5jb250YWlucyhjdXJyZW50R3JvdXApKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoY3VycmVudEdyb3VwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0cy50b0FycmF5KG5ldyBDbGFzc1tyZXN1bHRzLnNpemUoKV0pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3NbXSBtZXJnZVJlc3VsdHMoQ2xhc3NbXSByZXN1bHRzRm9yUGFnZSwgQ2xhc3NbXSByZXN1bHRzRm9yQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBDbGFzc1tdIG1lcmdlZFJlc3VsdCA9IG5ldyBDbGFzc1tyZXN1bHRzRm9yUGFnZS5sZW5ndGggKyByZXN1bHRzRm9yQ29tcG9uZW50Lmxlbmd0aF07DQotDQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdHNGb3JQYWdlLCAwLCBtZXJnZWRSZXN1bHQsIDAsIHJlc3VsdHNGb3JQYWdlLmxlbmd0aCk7DQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdHNGb3JDb21wb25lbnQsIDAsIG1lcmdlZFJlc3VsdCwgcmVzdWx0c0ZvclBhZ2UubGVuZ3RoLCByZXN1bHRzRm9yQ29tcG9uZW50Lmxlbmd0aCk7DQotDQotICAgICAgICByZXR1cm4gbWVyZ2VkUmVzdWx0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0R3JvdXBTdG9yYWdlTWFuYWdlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNmI1YmMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBncm91cHMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRHcm91cFN0b3JhZ2VNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPEdyb3VwU3RvcmFnZT4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfR1JPVVBTOktFWSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2NiZmYzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjQNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlIGltcGxlbWVudHMgTWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWFwPFN0cmluZywgUHJvcGVydHlEZXRhaWxzPj4gcHJvcGVydHlEZXRhaWxzTWFwID0NCi0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFByb3BlcnR5RGV0YWlscz4+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIHN0b3JlTWFwcGluZyhDbGFzcyBvcmlnaW5hbENsYXNzLCBTdHJpbmcgb3JpZ2luYWxQcm9wZXJ0eSwgUHJvcGVydHlEZXRhaWxzIHRhcmdldFByb3BlcnR5RGV0YWlscykNCi0gICAgew0KLSAgICAgICAgaWYodGFyZ2V0UHJvcGVydHlEZXRhaWxzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoaXNGaWx0ZXJlZENsYXNzKG9yaWdpbmFsQ2xhc3MpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURldGFpbHM+IGNsYXNzTWFwID0gZ2V0TWFwRm9yQ2xhc3Mob3JpZ2luYWxDbGFzcyk7DQotICAgICAgICAgICAgY2xhc3NNYXAucHV0KG9yaWdpbmFsUHJvcGVydHksIG51bGwpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBuZXcgUHJvcGVydHlEZXRhaWxzKHRhcmdldFByb3BlcnR5RGV0YWlscy5nZXRLZXkoKSwNCi0gICAgICAgICAgICAgICAgdGFyZ2V0UHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSwgdGFyZ2V0UHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCkpOw0KLQ0KLSAgICAgICAgZ2V0TWFwRm9yQ2xhc3Mob3JpZ2luYWxDbGFzcykucHV0KG9yaWdpbmFsUHJvcGVydHksIHByb3BlcnR5RGV0YWlscyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNGaWx0ZXJlZENsYXNzKENsYXNzIG9yaWdpbmFsQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBSZXNvdXJjZUJ1bmRsZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG9yaWdpbmFsQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm9wZXJ0eURldGFpbHMgZ2V0TWFwcGVkQ29uc3RyYWludFNvdXJjZShDbGFzcyBvcmlnaW5hbENsYXNzLCBTdHJpbmcgb3JpZ2luYWxQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgaWYoaXNGaWx0ZXJlZENsYXNzKG9yaWdpbmFsQ2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIGZvdW5kRW50cnkgPSBnZXRNYXBGb3JDbGFzcyhvcmlnaW5hbENsYXNzKS5nZXQob3JpZ2luYWxQcm9wZXJ0eSk7DQotDQotICAgICAgICBpZihmb3VuZEVudHJ5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscyhmb3VuZEVudHJ5LmdldEtleSgpLCBmb3VuZEVudHJ5LmdldEJhc2VPYmplY3QoKSwgZm91bmRFbnRyeS5nZXRQcm9wZXJ0eSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc01hcHBpbmcoQ2xhc3Mgb3JpZ2luYWxDbGFzcywgU3RyaW5nIG9yaWdpbmFsUHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGlmKGlzRmlsdGVyZWRDbGFzcyhvcmlnaW5hbENsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2F2b2lkIHNjYW5uaW5nIHByb2Nlc3MNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBnZXRNYXBGb3JDbGFzcyhvcmlnaW5hbENsYXNzKS5jb250YWluc0tleShvcmlnaW5hbFByb3BlcnR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFByb3BlcnR5RGV0YWlscz4gZ2V0TWFwRm9yQ2xhc3MoQ2xhc3MgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcga2V5ID0gUHJveHlVdGlscy5nZXRDbGFzc05hbWUodGFyZ2V0KTsNCi0gICAgICAgIGlmKCF0aGlzLnByb3BlcnR5RGV0YWlsc01hcC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMucHJvcGVydHlEZXRhaWxzTWFwLnB1dChrZXksIG5ldyBIYXNoTWFwPFN0cmluZywgUHJvcGVydHlEZXRhaWxzPigpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnR5RGV0YWlsc01hcC5nZXQoa2V5KTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlTWFuYWdlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY1NzI5YS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgbWFwcGVkIHByb3BlcnRpZXMgaW5mb3JtYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguNA0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdEFwcGxpY2F0aW9uU2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPFByb3BlcnR5U3RvcmFnZT4NCi17DQotICAgIERlZmF1bHRNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX01BUFBFRF9DT05TVFJBSU5UX1NPVVJDRTpLRVkiOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWV0YURhdGFTdG9yYWdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmQ3YjU4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWV0YURhdGFTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWV0YURhdGFTdG9yYWdlIGltcGxlbWVudHMgTWV0YURhdGFTdG9yYWdlDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFByb3BlcnR5SW5mb3JtYXRpb24+PiBjYWNoZWRQcm9wZXJ0eUluZm9ybWF0aW9uID0NCi0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFByb3BlcnR5SW5mb3JtYXRpb24+PigpOw0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TWV0YURhdGFTdG9yYWdlRmlsdGVyPiBtZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+KCk7DQotICAgIHByaXZhdGUgTGlzdDxDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPj4gZGVuaWVkTWV0YURhdGFGaWx0ZXJzID0NCi0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+PigpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdE1ldGFEYXRhU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIGluaXRGaWx0ZXJzKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRGaWx0ZXJzKCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhU3RvcmFnZUZpbHRlckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1ldGFEYXRhU3RvcmFnZUZpbHRlckNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVUQV9EQVRBX1NUT1JBR0VfRklMVEVSKTsNCi0gICAgICAgIG1ldGFEYXRhU3RvcmFnZUZpbHRlckNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KA0KLSAgICAgICAgICAgICAgICAgICAgQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1NUT1JBR0VfRklMVEVSKSk7DQotDQotICAgICAgICBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgbWV0YURhdGFTdG9yYWdlRmlsdGVyOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSA6IG1ldGFEYXRhU3RvcmFnZUZpbHRlckNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGFTdG9yYWdlRmlsdGVyID0NCi0gICAgICAgICAgICAgICAgKE1ldGFEYXRhU3RvcmFnZUZpbHRlcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKG1ldGFEYXRhU3RvcmFnZUZpbHRlciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5tZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzLmFkZChtZXRhRGF0YVN0b3JhZ2VGaWx0ZXIpOw0KLQ0KLSAgICAgICAgICAgICAgICBsb2dBZGRlZEZpbHRlcihtZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHN0b3JlTWV0YURhdGFPZihQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGludm9rZUZpbHRlcnMocHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb25Ub1N0b3JlID0gbmV3IERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKCk7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gcHJvcGVydHlJbmZvcm1hdGlvbg0KLSAgICAgICAgICAgICAgICAuZ2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIGNvcHlNZXRhRGF0YShwcm9wZXJ0eUluZm9ybWF0aW9uLCBwcm9wZXJ0eUluZm9ybWF0aW9uVG9TdG9yZSk7DQotDQotICAgICAgICBnZXRNYXBGb3JDbGFzcyhQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKSkpDQotICAgICAgICAgICAgICAgIC5wdXQocHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb25Ub1N0b3JlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW52b2tlRmlsdGVycyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGZvcihNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgZmlsdGVyIDogdGhpcy5tZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZpbHRlci5maWx0ZXIocHJvcGVydHlJbmZvcm1hdGlvbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1ldGFEYXRhRW50cnlbXSBnZXRNZXRhRGF0YShDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBnZXRNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykuZ2V0KHRhcmdldFByb3BlcnR5KTsNCi0NCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gY2xvbmVkUHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOw0KLSAgICAgICAgY29weU1ldGFEYXRhKHByb3BlcnR5SW5mb3JtYXRpb24sIGNsb25lZFByb3BlcnR5SW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgcmV0dXJuIGNsb25lZFByb3BlcnR5SW5mb3JtYXRpb24uZ2V0TWV0YURhdGFFbnRyaWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNNZXRhRGF0YUZvcihDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0TWFwRm9yQ2xhc3ModGFyZ2V0Q2xhc3MpLmNvbnRhaW5zS2V5KHRhcmdldFByb3BlcnR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZpbHRlcihNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgc3RvcmFnZUZpbHRlcikNCi0gICAgew0KLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCFpc0ZpbHRlckRlbmllZChzdG9yYWdlRmlsdGVyKSAmJiAhaXNGaWx0ZXJBbHJlYWR5UmVnaXN0ZXJlZChzdG9yYWdlRmlsdGVyKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubWV0YURhdGFTdG9yYWdlRmlsdGVycy5hZGQoc3RvcmFnZUZpbHRlcik7DQotICAgICAgICAgICAgICAgIGxvZ0FkZGVkRmlsdGVyKHN0b3JhZ2VGaWx0ZXIuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0ZpbHRlckRlbmllZChNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgc3RvcmFnZUZpbHRlcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGVuaWVkTWV0YURhdGFGaWx0ZXJzLmNvbnRhaW5zKGdldFN0b3JhZ2VGaWx0ZXJDbGFzcyhzdG9yYWdlRmlsdGVyKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRmlsdGVyQWxyZWFkeVJlZ2lzdGVyZWQoTWV0YURhdGFTdG9yYWdlRmlsdGVyIHN0b3JhZ2VGaWx0ZXIpDQotICAgIHsNCi0gICAgICAgIGZvcihNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgZmlsdGVyIDogdGhpcy5tZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGZpbHRlci5nZXRDbGFzcygpLmVxdWFscyhnZXRTdG9yYWdlRmlsdGVyQ2xhc3Moc3RvcmFnZUZpbHRlcikpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGRlcmVnaXN0ZXJGaWx0ZXIoQ2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gZmlsdGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhU3RvcmFnZUZpbHRlciBzdG9yYWdlRmlsdGVyID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3MoZmlsdGVyQ2xhc3MpOw0KLQ0KLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubWV0YURhdGFTdG9yYWdlRmlsdGVycy5yZW1vdmUoc3RvcmFnZUZpbHRlcik7DQotICAgICAgICB9DQotDQotICAgICAgICBsb2dSZW1vdmVkRmlsdGVyKHN0b3JhZ2VGaWx0ZXIuZ2V0Q2xhc3MoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZGVueUZpbHRlcihDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPiBmaWx0ZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvcihDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPiBmaWx0ZXJJZCA6IHRoaXMuZGVuaWVkTWV0YURhdGFGaWx0ZXJzKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoZmlsdGVySWQuZXF1YWxzKGZpbHRlckNsYXNzKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHRoaXMuZGVuaWVkTWV0YURhdGFGaWx0ZXJzLmFkZChmaWx0ZXJDbGFzcyk7DQotICAgICAgICB9DQotDQotICAgICAgICBkZXJlZ2lzdGVyRmlsdGVyKGZpbHRlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9EbyhQcmlvcml0eS5NRURJVU0pDQotICAgIHByaXZhdGUgdm9pZCBjb3B5TWV0YURhdGEoUHJvcGVydHlJbmZvcm1hdGlvbiBzb3VyY2UsIFByb3BlcnR5SW5mb3JtYXRpb24gdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUVudHJ5IG5ld01ldGFEYXRhRW50cnk7DQotICAgICAgICBmb3IoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5IDogc291cmNlLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5ld01ldGFEYXRhRW50cnkgPSBuZXcgTWV0YURhdGFFbnRyeSgpOw0KLSAgICAgICAgICAgIG5ld01ldGFEYXRhRW50cnkuc2V0S2V5KG1ldGFEYXRhRW50cnkuZ2V0S2V5KCkpOw0KLSAgICAgICAgICAgIG5ld01ldGFEYXRhRW50cnkuc2V0VmFsdWUobWV0YURhdGFFbnRyeS5nZXRWYWx1ZSgpKTsNCi0NCi0gICAgICAgICAgICB0YXJnZXQuYWRkTWV0YURhdGFFbnRyeShuZXdNZXRhRGF0YUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgbG9nQWRkZWRGaWx0ZXIoQ2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gZmlsdGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKGZpbHRlckNsYXNzLmdldE5hbWUoKSArICIgYWRkZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgbG9nUmVtb3ZlZEZpbHRlcihDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPiBmaWx0ZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oZmlsdGVyQ2xhc3MuZ2V0TmFtZSgpICsgIiByZW1vdmVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBQcm9wZXJ0eUluZm9ybWF0aW9uPiBnZXRNYXBGb3JDbGFzcyhDbGFzcyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBrZXkgPSBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh0YXJnZXQpOw0KLSAgICAgICAgaWYoIXRoaXMuY2FjaGVkUHJvcGVydHlJbmZvcm1hdGlvbi5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuY2FjaGVkUHJvcGVydHlJbmZvcm1hdGlvbi5wdXQoa2V5LCBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5SW5mb3JtYXRpb24+KCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkUHJvcGVydHlJbmZvcm1hdGlvbi5nZXQoa2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGdldFN0b3JhZ2VGaWx0ZXJDbGFzcyhNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgc3RvcmFnZUZpbHRlcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3Moc3RvcmFnZUZpbHRlci5nZXRDbGFzcygpLCBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuY2xhc3MpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWV0YURhdGFTdG9yYWdlTWFuYWdlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYzY5YmUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlci5EZWZhdWx0TWV0YURhdGFTdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBwcm9wZXJ0eSBpbmZvcm1hdGlvbiBlbnRyaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxNZXRhRGF0YVN0b3JhZ2U+DQotew0KLSAgICBEZWZhdWx0TWV0YURhdGFTdG9yYWdlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBEZWZhdWx0TWV0YURhdGFTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX01FVEFfREFUQV9DQUNIRTpLRVkiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UHJvcGVydHlTdG9yYWdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFByb3BlcnR5U3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWVlNjBhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UHJvcGVydHlTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlTdG9yYWdlIGltcGxlbWVudHMgUHJvcGVydHlTdG9yYWdlDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEZpZWxkPj4gZmllbGRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEZpZWxkPj4oKTsNCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBNZXRob2Q+PiBtZXRob2RNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIE1ldGhvZD4+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIHN0b3JlRmllbGQoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSwgRmllbGQgZmllbGQpDQotICAgIHsNCi0gICAgICAgIGdldEZpZWxkTWFwRm9yQ2xhc3ModGFyZ2V0Q2xhc3MpLnB1dChwcm9wZXJ0eSwgZmllbGQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHN0b3JlTWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHksIE1ldGhvZCBtZXRob2QpDQotICAgIHsNCi0gICAgICAgIGdldE1ldGhvZE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5wdXQocHJvcGVydHksICBtZXRob2QpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGaWVsZCBnZXRGaWVsZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RmllbGRNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykuZ2V0KHByb3BlcnR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWV0aG9kIGdldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0TWV0aG9kTWFwRm9yQ2xhc3ModGFyZ2V0Q2xhc3MpLmdldChwcm9wZXJ0eSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNGaWVsZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RmllbGRNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykuY29udGFpbnNLZXkocHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zTWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRNZXRob2RNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykuY29udGFpbnNLZXkocHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgRmllbGQ+IGdldEZpZWxkTWFwRm9yQ2xhc3MoQ2xhc3MgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcga2V5ID0gUHJveHlVdGlscy5nZXRDbGFzc05hbWUodGFyZ2V0KTsNCi0gICAgICAgIGlmICghdGhpcy5maWVsZE1hcC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuZmllbGRNYXAucHV0KGtleSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBGaWVsZD4oKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdGhpcy5maWVsZE1hcC5nZXQoa2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1ldGhvZD4gZ2V0TWV0aG9kTWFwRm9yQ2xhc3MoQ2xhc3MgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcga2V5ID0gUHJveHlVdGlscy5nZXRDbGFzc05hbWUodGFyZ2V0KTsNCi0gICAgICAgIGlmICghdGhpcy5tZXRob2RNYXAuY29udGFpbnNLZXkoa2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLm1ldGhvZE1hcC5wdXQoa2V5LCBuZXcgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZD4oKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdGhpcy5tZXRob2RNYXAuZ2V0KGtleSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFByb3BlcnR5U3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1YTEwNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFByb3BlcnR5U3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBwcm9wZXJ0eSBpbmZvcm1hdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotY2xhc3MgRGVmYXVsdFByb3BlcnR5U3RvcmFnZU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdEFwcGxpY2F0aW9uU2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPFByb3BlcnR5U3RvcmFnZT4NCi17DQotICAgIERlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfUFJPUEVSVFk6S0VZIjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzM0Y2UzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UgaW1wbGVtZW50cyBSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmdldChrZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyA8VD4gVCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChUKXRoaXMucHJvcGVydGllcy5nZXQoa2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnRpZXMucmVtb3ZlKGtleSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTWFuYWdlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjViYzMwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlcjsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgcmVuZGVyZXIgaW50ZXJjZXB0b3IgcHJvcGVydGllcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotY2xhc3MgRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyDQotICAgICAgICBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlPg0KLXsNCi0gICAgRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX1JFTkRFUkVSX0lOVEVSQ0VQVE9SX1BST1BFUlRZOktFWSI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDI3ZWY4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbiBmb3IgZ3JvdXBzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlIGltcGxlbWVudHMgUmVuZGVyZXJQcm94eVN0b3JhZ2UNCi17DQotICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnk+PiBwcm94eVN0b3JhZ2UgPQ0KLSAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5Pj4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW50cnkoU3RyaW5nIHJlbmRlcmVyS2V5LCBTdHJpbmcgY2xpZW50SWQsIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIGdldFJlbmRlcmVyU3RvcmFnZShyZW5kZXJlcktleSkucHV0KGNsaWVudElkLCBlbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNFbnRyeShTdHJpbmcgcmVuZGVyZXJLZXksIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFJlbmRlcmVyU3RvcmFnZShyZW5kZXJlcktleSkuY29udGFpbnNLZXkoY2xpZW50SWQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGdldEVudHJ5KFN0cmluZyByZW5kZXJlcktleSwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZXJTdG9yYWdlKHJlbmRlcmVyS2V5KS5nZXQoY2xpZW50SWQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeT4gZ2V0UmVuZGVyZXJTdG9yYWdlKFN0cmluZyByZW5kZXJlcktleSkNCi0gICAgew0KLSAgICAgICAgaWYoIXByb3h5U3RvcmFnZS5jb250YWluc0tleShyZW5kZXJlcktleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJveHlTdG9yYWdlLnB1dChyZW5kZXJlcktleSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5PigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBwcm94eVN0b3JhZ2UuZ2V0KHJlbmRlcmVyS2V5KTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTWFuYWdlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNkM2FjZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgcmVuZGVyZXIgcHJveHkgZW50cmllcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyDQotICAgIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPFJlbmRlcmVyUHJveHlTdG9yYWdlPg0KLXsNCi0gICAgRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICAvL2ZvciBiZXR0ZXIgYmFja3dhcmQgY29tcGF0aWJpbGl0eQ0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpICsgIjpTVE9SQUdFIjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI2MGU0Ni4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3Igc3RvcmFnZS1tYW5hZ2VyIGNyZWF0aW9uIGFuZCBjYWNoaW5nDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxDbGFzcz4NCi0gICAgICAgIGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxDbGFzcywgU3RvcmFnZU1hbmFnZXI+LCBTdG9yYWdlTWFuYWdlckhvbGRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGxhenlTdGF0aWNNYXBwaW5nQXBwbGllZCA9IGZhbHNlOw0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxDbGFzcz4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPENsYXNzPj4oKTsNCi0gICAgcHJpdmF0ZSBNYXA8Q2xhc3MsIFN0b3JhZ2VNYW5hZ2VyPiBzdG9yYWdlVHlwZVRvU3RvcmFnZU1hbmFnZXJNYXAgPSBuZXcgSGFzaE1hcDxDbGFzcywgU3RvcmFnZU1hbmFnZXI+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0U3RvcmFnZU1hbmFnZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKFJlbmRlcmVyUHJveHlTdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTWFuYWdlcigpLCBmYWxzZSk7DQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihHcm91cFN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0R3JvdXBTdG9yYWdlTWFuYWdlcigpLCBmYWxzZSk7DQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihNZXRhRGF0YVN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0TWV0YURhdGFTdG9yYWdlTWFuYWdlcigpLCBmYWxzZSk7DQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKFByb3BlcnR5U3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlTWFuYWdlcigpLCBmYWxzZSk7DQotDQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdG9yYWdlTWFuYWdlciBjcmVhdGUoQ2xhc3Mgc3RvcmFnZVR5cGUpDQotICAgIHsNCi0gICAgICAgIGlmICghdGhpcy5sYXp5U3RhdGljTWFwcGluZ0FwcGxpZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdG9yYWdlTWFuYWdlciBzdG9yYWdlTWFuYWdlcjsNCi0gICAgICAgIFN0cmluZyBzdG9yYWdlTWFuYWdlck5hbWU7DQotICAgICAgICAvL251bGwgLT4gdXNlIG5hbWUgbWFwcGVycw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPENsYXNzPiBuYW1lTWFwcGVyIDogdGhpcy5uYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlTWFuYWdlck5hbWUgPSBuYW1lTWFwcGVyLmNyZWF0ZU5hbWUoc3RvcmFnZVR5cGUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChzdG9yYWdlTWFuYWdlck5hbWUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBzdG9yYWdlTWFuYWdlciA9IChTdG9yYWdlTWFuYWdlcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoc3RvcmFnZU1hbmFnZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoc3RvcmFnZU1hbmFnZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFkZE1hcHBpbmcoc3RvcmFnZVR5cGUsIHN0b3JhZ2VNYW5hZ2VyKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2VNYW5hZ2VyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBnZXRTdG9yYWdlTWFuYWdlcihzdG9yYWdlVHlwZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNYXBwaW5nKENsYXNzIHN0b3JhZ2VUeXBlLCBTdG9yYWdlTWFuYWdlciBzdG9yYWdlTWFuYWdlcikNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiBpc1ZhbGlkRW50cnkgPSB0cnVlOw0KLSAgICAgICAgaWYoc3RvcmFnZVR5cGUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpc1ZhbGlkRW50cnkgPSBmYWxzZTsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoInlvdSB0cmllZCB0byBhZGQgYW4gaW52YWxpZCBzdG9yYWdlIHR5cGUiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZihzdG9yYWdlTWFuYWdlciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlzVmFsaWRFbnRyeSA9IGZhbHNlOw0KLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRXJyb3JFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigieW91IHRyaWVkIHRvIGFkZCBhbiBpbnZhbGlkIHN0b3JhZ2UgbWFuYWdlciIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKCFpc1ZhbGlkRW50cnkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoc3RvcmFnZVR5cGUsIHN0b3JhZ2VNYW5hZ2VyLCB0cnVlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5sYXp5U3RhdGljTWFwcGluZ0FwcGxpZWQgPSB0cnVlOw0KLQ0KLSAgICAgICAgLy9zZXR1cCBpbnRlcm5hbCBzdGF0aWMgbWFwcGluZ3MNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnIDoNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuU1RPUkFHRV9UWVBFX1RPX1NUT1JBR0VfTUFOQUdFUl9DT05GSUcpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHNldHVwTWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwTWFwcGluZ3MoTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcoQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUobWFwcGluZy5nZXRTb3VyY2UoKSksDQotICAgICAgICAgICAgICAgICAgICAoU3RvcmFnZU1hbmFnZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKG1hcHBpbmcuZ2V0VGFyZ2V0KCkpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTGlzdDxOYW1lTWFwcGVyPENsYXNzPj4gZ2V0TmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5uYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdG9yYWdlTWFuYWdlcihDbGFzcyBzdG9yYWdlVHlwZSwgU3RvcmFnZU1hbmFnZXIgc3RvcmFnZU1hbmFnZXIsIGJvb2xlYW4gb3ZlcnJpZGUpDQotICAgIHsNCi0gICAgICAgIGlmKCF0aGlzLnN0b3JhZ2VUeXBlVG9TdG9yYWdlTWFuYWdlck1hcC5jb250YWluc0tleShzdG9yYWdlVHlwZSkgfHwNCi0gICAgICAgICAgICAgICAgKHRoaXMuc3RvcmFnZVR5cGVUb1N0b3JhZ2VNYW5hZ2VyTWFwLmNvbnRhaW5zS2V5KHN0b3JhZ2VUeXBlKSAmJiBvdmVycmlkZSkpDQotICAgICAgICB7DQotDQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFkZGluZyB0eXBlIHRvIHN0b3JhZ2UtbWFuYWdlciBtYXBwaW5nOiAiDQotICAgICAgICAgICAgICAgICAgICArIHN0b3JhZ2VUeXBlLmdldE5hbWUoKSArICIgLT4gIiArIHN0b3JhZ2VNYW5hZ2VyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdGhpcy5zdG9yYWdlVHlwZVRvU3RvcmFnZU1hbmFnZXJNYXAucHV0KHN0b3JhZ2VUeXBlLCBzdG9yYWdlTWFuYWdlcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0b3JhZ2VNYW5hZ2VyIGdldFN0b3JhZ2VNYW5hZ2VyKENsYXNzIHR5cGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2VUeXBlVG9TdG9yYWdlTWFuYWdlck1hcC5nZXQodHlwZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjA2OWQ0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlIGltcGxlbWVudHMgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgdmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy52aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyID0gdmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBnZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMudmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTWFuYWdlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRmNzdmZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBhIGN1c3RvbSBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU1hbmFnZXIgZXh0ZW5kcw0KLSAgICAgICAgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlPg0KLXsNCi0gICAgRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBEZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfVklPTEFUSU9OU0VWRVJJVFlfSU5URVJQUkVURVI6S0VZIjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9GYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjAxODM0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9GYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLQ0KLS8qKg0KLSAqIHN0b3JhZ2UgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgZmFjZXMgcmVxdWVzdA0KLSAqIGZvciBub3cgaXQganVzdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBwaGFzZSBvZiB0aGUgbGlmZWN5Y2xlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UNCi17DQotICAgIHZvaWQgc2V0Q3VycmVudFBoYXNlSWQoUGhhc2VJZCBwaGFzZUlkKTsNCi0NCi0gICAgUGhhc2VJZCBnZXRDdXJyZW50UGhhc2VJZCgpOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRmFjZXNNZXNzYWdlU3RvcmFnZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwMDk1YS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRmFjZXNNZXNzYWdlU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuRmFjZXNNZXNzYWdlSG9sZGVyOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBGYWNlc01lc3NhZ2VTdG9yYWdlDQotew0KLSAgICB2b2lkIGFkZEZhY2VzTWVzc2FnZShTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpOw0KLQ0KLSAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZ2V0RmFjZXNNZXNzYWdlcygpOw0KLQ0KLSAgICB2b2lkIGFkZEFsbCgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvR3JvdXBTdG9yYWdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvR3JvdXBTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYzAxNGIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0dyb3VwU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHN1Z2dlc3RlZCBpbnRlcmZhY2UgZm9yIGEgZ3JvdXAgc3RvcmFnZQ0KLSAqIHVzZWQgYnkgdGhlIGJ2aSBtb2R1bGUgYW5kIGFkZC1vbnMNCi0gKiA8cC8+DQotICogaXQgYWxsb3dzIHRvIG1hbmFnZSBncm91cHMgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIEdyb3VwU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBhZGRHcm91cChDbGFzcyBncm91cENsYXNzLCBTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQpOw0KLQ0KLSAgICB2b2lkIHJlc3RyaWN0R3JvdXAoQ2xhc3MgZ3JvdXBDbGFzcywgU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKTsNCi0NCi0gICAgQ2xhc3NbXSBnZXRHcm91cHMoU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU4ZjNmZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguNA0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBzdG9yZU1hcHBpbmcoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSwgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyk7DQotDQotICAgIFByb3BlcnR5RGV0YWlscyBnZXRNYXBwZWRDb25zdHJhaW50U291cmNlKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpOw0KLQ0KLSAgICBib29sZWFuIGNvbnRhaW5zTWFwcGluZyhDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5KTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01ldGFEYXRhU3RvcmFnZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01ldGFEYXRhU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWVjZWJkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NZXRhRGF0YVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBzdG9yZU1ldGFEYXRhT2YoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgTWV0YURhdGFFbnRyeVtdIGdldE1ldGFEYXRhKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpOw0KLQ0KLSAgICBib29sZWFuIGNvbnRhaW5zTWV0YURhdGFGb3IoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSk7DQotDQotICAgIHZvaWQgcmVnaXN0ZXJGaWx0ZXIoTWV0YURhdGFTdG9yYWdlRmlsdGVyIHN0b3JhZ2VGaWx0ZXIpOw0KLQ0KLSAgICB2b2lkIGRlcmVnaXN0ZXJGaWx0ZXIoQ2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gZmlsdGVyQ2xhc3MpOw0KLQ0KLSAgICB2b2lkIGRlbnlGaWx0ZXIoQ2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gZmlsdGVyQ2xhc3MpOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWV0YURhdGFTdG9yYWdlRmlsdGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWV0YURhdGFTdG9yYWdlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMmZkYjYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01ldGFEYXRhU3RvcmFnZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFTdG9yYWdlRmlsdGVyDQotew0KLSAgICB2b2lkIGZpbHRlcihQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUHJvcGVydHlTdG9yYWdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUHJvcGVydHlTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NzMyN2QuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1Byb3BlcnR5U3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eVN0b3JhZ2UNCi17DQotICAgIHZvaWQgc3RvcmVGaWVsZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5LCBGaWVsZCBmaWVsZCk7DQotDQotICAgIHZvaWQgc3RvcmVNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSwgTWV0aG9kIG1ldGhvZCk7DQotDQotICAgIEZpZWxkIGdldEZpZWxkKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpOw0KLQ0KLSAgICBNZXRob2QgZ2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpOw0KLQ0KLSAgICBib29sZWFuIGNvbnRhaW5zRmllbGQoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSk7DQotDQotICAgIGJvb2xlYW4gY29udGFpbnNNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGZhYTkwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogYSBzdG9yYWdlIHdoaWNoIGlzbid0IHVzZWQgaW50ZXJuYWxseS4gaXQncyBmb3IgYWRkLW9ucyB0byBlYXNpbHkgc3RvcmUgcHJvcGVydGllcyBvZiBpbnRlcmNlcHRvcnMuDQotICogd2l0aG91dCBicmFraW5nIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGl0J3MgcG9zc2libGUgdG8gdXNlIHRoZXNlIHByb3BlcnRpZXMgaW4gY3VzdG9tIGFydGlmYWN0cy4NCi0gKiByZW5kZXJpbmcgaW50ZXJjZXB0aW9uIGlzIGFuIGludGVybmFsIGNvbmNlcHQuIHNvIHByb3BlcnRpZXMsLi4uIG9mIGl0IHdvbid0IGdldCBpbnRvIHRoZSBhcGkuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpOw0KLQ0KLSAgICBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSk7DQotDQotICAgIDxUPiBUIGdldFByb3BlcnR5KFN0cmluZyBrZXksIENsYXNzPFQ+IHRhcmdldENsYXNzKTsNCi0NCi0gICAgdm9pZCByZW1vdmVQcm9wZXJ0eShTdHJpbmcga2V5KTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVyUHJveHlTdG9yYWdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJQcm94eVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcxYTc1Yi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJQcm94eVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBSZW5kZXJlclByb3h5U3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBzZXRFbnRyeShTdHJpbmcgcmVuZGVyZXJLZXksIFN0cmluZyBjbGllbnRJZCwgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBlbnRyeSk7DQotDQotICAgIGJvb2xlYW4gY29udGFpbnNFbnRyeShTdHJpbmcgcmVuZGVyZXJLZXksIFN0cmluZyBjbGllbnRJZCk7DQotDQotICAgIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZ2V0RW50cnkoU3RyaW5nIHJlbmRlcmVyS2V5LCBTdHJpbmcgY2xpZW50SWQpOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkzNDc3OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeQotewotICAgIHByaXZhdGUgYm9vbGVhbiBkZWNvZGVDYWxsZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlQmVnaW5DYWxsZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlRW5kQ2FsbGVkID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIE9iamVjdCBjb252ZXJ0ZWRWYWx1ZSA9IG51bGw7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlY29kZUNhbGxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVjb2RlQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlY29kZUNhbGxlZChib29sZWFuIGRlY29kZUNhbGxlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVjb2RlQ2FsbGVkID0gZGVjb2RlQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlQmVnaW5DYWxsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVuY29kZUJlZ2luQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kZUJlZ2luQ2FsbGVkKGJvb2xlYW4gZW5jb2RlQmVnaW5DYWxsZWQpCi0gICAgewotICAgICAgICB0aGlzLmVuY29kZUJlZ2luQ2FsbGVkID0gZW5jb2RlQmVnaW5DYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmNvZGVDaGlsZHJlbkNhbGxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlQ2hpbGRyZW5DYWxsZWQoYm9vbGVhbiBlbmNvZGVDaGlsZHJlbkNhbGxlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZW5jb2RlQ2hpbGRyZW5DYWxsZWQgPSBlbmNvZGVDaGlsZHJlbkNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuY29kZUVuZENhbGxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZW5jb2RlRW5kQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kZUVuZENhbGxlZChib29sZWFuIGVuY29kZUVuZENhbGxlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZW5jb2RlRW5kQ2FsbGVkID0gZW5jb2RlRW5kQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlZFZhbHVlKE9iamVjdCBjb252ZXJ0ZWRWYWx1ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29udmVydGVkVmFsdWUgPSBjb252ZXJ0ZWRWYWx1ZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBjODM5Ny4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuQVBJOw0KLQ0KLS8qKg0KLSAqIG1hbmFnZXIgdG8gY3JlYXRlIGFuZCByZXNldCBzcGVjaWZpYyBzdG9yYWdlIGltcGxlbWVudGF0aW9ucw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgU3RvcmFnZU1hbmFnZXI8VD4NCi17DQotICAgIFQgY3JlYXRlKFN0cmluZyBrZXkpOw0KLSAgICB2b2lkIHJlc2V0KFN0cmluZyBrZXkpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXJIb2xkZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9TdG9yYWdlTWFuYWdlckhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGY5NTM4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9TdG9yYWdlTWFuYWdlckhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5BUEk7DQotDQotLyoqDQotICogaW50ZXJmYWNlIHRvIG1hbmFnZSBzdG9yYWdlLW1hbmFnZXIgaW5zdGFuY2VzDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgU3RvcmFnZU1hbmFnZXJIb2xkZXINCi17DQotICAgIHZvaWQgc2V0U3RvcmFnZU1hbmFnZXIoQ2xhc3MgdHlwZSwgU3RvcmFnZU1hbmFnZXIgc3RvcmFnZU1hbmFnZXIsIGJvb2xlYW4gb3ZlcnJpZGUpOw0KLSAgICBTdG9yYWdlTWFuYWdlciBnZXRTdG9yYWdlTWFuYWdlcihDbGFzcyB0eXBlKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1ZhbGlkYXRpb25SZXN1bHQuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WYWxpZGF0aW9uUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3OTMyN2MuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1ZhbGlkYXRpb25SZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkZhY2VzTWVzc2FnZUhvbGRlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gInJlZmFjdG9yIGl0IikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIFZhbGlkYXRpb25SZXN1bHQNCi17DQotICAgIHByaXZhdGUgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkRmFjZXNNZXNzYWdlSG9sZGVyKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmFjZXNNZXNzYWdlSG9sZGVyTGlzdC5hZGQoZmFjZXNNZXNzYWdlSG9sZGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWFjMTFjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOw0KLQ0KLS8qKg0KLSAqIHN1Z2dlc3RlZCBpbnRlcmZhY2UgZm9yIGEgdmlvbGF0aW9uLXNldmVyaXR5LWludGVycHJldGVyIHN0b3JhZ2UNCi0gKiB1c2VkIGJ5IGFkZC1vbnMgdG8gY2hhbmdlIHRoZSBpbnRlcnByZXRlciBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdA0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UNCi17DQotICAgIHZvaWQgc2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcihWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIpOw0KLQ0KLSAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExMDI5Ni4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5GYWNlc0luZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGU5N2YyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRmFjZXNNZXNzYWdlU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEZhY2VzTWVzc2FnZVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0TWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI5YjBhOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLk1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC40DQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoTWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRNYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDViZmU5Ny4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuTWV0YURhdGFTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRNZXRhRGF0YVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKE1ldGFEYXRhU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdE1ldGFEYXRhU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEyMjY0MS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdFByb3BlcnR5U3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5Qcm9wZXJ0eVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFByb3BlcnR5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdFByb3BlcnR5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTQ3NTI4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQyNGYzYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUmVuZGVyZXJQcm94eVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoUmVuZGVyZXJQcm94eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZWM4ZDcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiB1c2UgYSBwdWJsaWMgY2xhc3MgdG8gYWxsb3cgb3B0aW9uYWwgZGVyZWdpc3RyYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vQ29uc3RyYWludFNvdXJjZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL0NvbnN0cmFpbnRTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFiMzk5Yi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vQ29uc3RyYWludFNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSB4LnguNAotICovCi1AVGFyZ2V0KHtUWVBFLCBGSUVMRCwgTUVUSE9EfSkKLUBSZXRlbnRpb24oUlVOVElNRSkKLUBEb2N1bWVudGVkCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBAaW50ZXJmYWNlIENvbnN0cmFpbnRTb3VyY2UKLXsKLSAgICBDbGFzcyB2YWx1ZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE0ZWEyZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIHgueC4zCi0gKi8KLUBUYXJnZXQoVFlQRSkKLUBSZXRlbnRpb24oUlVOVElNRSkKLUBEb2N1bWVudGVkCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBAaW50ZXJmYWNlIEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQotewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9JZ25vcmVDb25zdHJhaW50U291cmNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vSWdub3JlQ29uc3RyYWludFNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWRlNzM2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9JZ25vcmVDb25zdHJhaW50U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIHgueC40Ci0gKi8KLUBUYXJnZXQoe0ZJRUxELCBNRVRIT0R9KQotQFJldGVudGlvbihSVU5USU1FKQotQERvY3VtZW50ZWQKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIEBpbnRlcmZhY2UgSWdub3JlQ29uc3RyYWludFNvdXJjZQotewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL051bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZDQ2OWIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL051bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIHgueC4zCi0gKi8KLUBUYXJnZXQoVFlQRSkKLUBSZXRlbnRpb24oUlVOVElNRSkKLUBEb2N1bWVudGVkCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBAaW50ZXJmYWNlIE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ci17Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL1NraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI0Y2FhNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcg0KLXsNCi0gICAgYm9vbGVhbiBza2lwVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YUVudHJ5IGVudHJ5KTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL1RhcmdldFByb3BlcnR5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vVGFyZ2V0UHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYwY2RlZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vVGFyZ2V0UHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgeC54LjQKLSAqLwotQFRhcmdldCh7RklFTEQsIE1FVEhPRH0pCi1AUmV0ZW50aW9uKFJVTlRJTUUpCi1ARG9jdW1lbnRlZAotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgQGludGVyZmFjZSBUYXJnZXRQcm9wZXJ0eQotewotICAgIFN0cmluZyB2YWx1ZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9UYXJnZXRQcm9wZXJ0eUlkLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vVGFyZ2V0UHJvcGVydHlJZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDYzZTExLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9UYXJnZXRQcm9wZXJ0eUlkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgeC54LjQKLSAqLwotQFRhcmdldCh7RklFTEQsIE1FVEhPRH0pCi1AUmV0ZW50aW9uKFJVTlRJTUUpCi1ARG9jdW1lbnRlZAotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgQGludGVyZmFjZSBUYXJnZXRQcm9wZXJ0eUlkCi17Ci0gICAgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHZhbHVlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL2V4Y2VwdGlvbi9SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL2V4Y2VwdGlvbi9SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmIyYmIwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9leGNlcHRpb24vUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uZXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiB0byBoYW5kbGUgc3BlY2lhbCBjYXNlcyBpbiBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24gZXh0ZW5kcyBWYWxpZGF0b3JFeGNlcHRpb24NCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NjQ2MzMxNzM2NDI4NDk1ODg0TDsNCi0NCi0gICAgcHVibGljIFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKGZhY2VzTWVzc2FnZSwgdGhyb3dhYmxlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYyNTEwYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjZXNNZXNzYWdlRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5IGltcGxlbWVudHMgRmFjZXNNZXNzYWdlRmFjdG9yeQ0KLXsNCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBjb252ZXJ0KEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIGlmKGlzTGFiZWxlZEZhY2VzTWVzc2FnZShmYWNlc01lc3NhZ2UpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2U7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY3JlYXRlKGZhY2VzTWVzc2FnZS5nZXRTZXZlcml0eSgpLCBmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLCBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2UgY3JlYXRlKEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVmlvbGF0aW9uTWVzc2FnZShzZXZlcml0eSwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xhYmVsZWRGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgLy9kb24ndCB1c2UgdGhlIGludGVyZmFjZSBoZXJlDQotICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlIGluc3RhbmNlb2YgVmlvbGF0aW9uTWVzc2FnZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9GYWNlc01lc3NhZ2VIb2xkZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0ZhY2VzTWVzc2FnZUhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzFjMzY3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0ZhY2VzTWVzc2FnZUhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBGYWNlc01lc3NhZ2VIb2xkZXINCi17DQotICAgIHByaXZhdGUgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50SWQ7DQotDQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2VIb2xkZXIoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5mYWNlc01lc3NhZ2UgPSBmYWNlc01lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZUhvbGRlcihGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmFjZXNNZXNzYWdlID0gZmFjZXNNZXNzYWdlOw0KLSAgICAgICAgc2V0Q2xpZW50SWQoY2xpZW50SWQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2UgZ2V0RmFjZXNNZXNzYWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudElkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNsaWVudElkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudElkKFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgaWYoISIqIi5lcXVhbHMoY2xpZW50SWQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9MYWJlbGVkTWVzc2FnZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvTGFiZWxlZE1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RmN2FlNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9MYWJlbGVkTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZG9uJ3QgcmVtb3ZlICpUZXh0IC0gaXQgd291bGQgbGVhZCB0byBhbiBvdmVybGFwIHdpdGggdHJpbmlkYWQNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIExhYmVsZWRNZXNzYWdlDQotew0KLSAgICBTdHJpbmcgZ2V0TGFiZWxUZXh0KCk7DQotICAgIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyBsYWJlbCk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL1Zpb2xhdGlvbk1lc3NhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL1Zpb2xhdGlvbk1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk0NGM3Ni4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9WaW9sYXRpb25NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIFZpb2xhdGlvbk1lc3NhZ2UgZXh0ZW5kcyBGYWNlc01lc3NhZ2UgaW1wbGVtZW50cyBMYWJlbGVkTWVzc2FnZQ0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjkwMzk1ODk0Mjk4NzcxMTIzMUw7DQotICAgIHByaXZhdGUgU3RyaW5nIGxhYmVsOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gc3VtbWFyeUxhYmVsUmVwbGFjZWQgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGRldGFpbExhYmVsUmVwbGFjZWQgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIFZpb2xhdGlvbk1lc3NhZ2UoU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHRoaXMoU0VWRVJJVFlfRVJST1IsIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZpb2xhdGlvbk1lc3NhZ2UoU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICBzZXRTZXZlcml0eShzZXZlcml0eSk7DQotICAgICAgICBzZXRTdW1tYXJ5KHN1bW1hcnkpOw0KLSAgICAgICAgc2V0RGV0YWlsKGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN1bW1hcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsYWJlbCAhPSBudWxsICYmICF0aGlzLnN1bW1hcnlMYWJlbFJlcGxhY2VkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHNldFN1bW1hcnkoZ2V0TGFiZWxlZE1lc3NzYWdlKHN1cGVyLmdldFN1bW1hcnkoKSwgZ2V0TGFiZWxUZXh0KCkpKTsNCi0gICAgICAgICAgICB0aGlzLnN1bW1hcnlMYWJlbFJlcGxhY2VkID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRTdW1tYXJ5KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGV0YWlsKCkNCi0gICAgew0KLSAgICAgICAgaWYobGFiZWwgIT0gbnVsbCAmJiAhdGhpcy5kZXRhaWxMYWJlbFJlcGxhY2VkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHNldERldGFpbChnZXRMYWJlbGVkTWVzc3NhZ2Uoc3VwZXIuZ2V0RGV0YWlsKCksIGdldExhYmVsVGV4dCgpKSk7DQotICAgICAgICAgICAgdGhpcy5kZXRhaWxMYWJlbFJlcGxhY2VkID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzdXBlci5nZXREZXRhaWwoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRMYWJlbGVkTWVzc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5jb250YWlucygieyIgKyBpICsgIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoInsiICsgaSArICJ9IiwgbGFiZWwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBtZXNzYWdlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdW1tYXJ5KFN0cmluZyBzKQ0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRTdW1tYXJ5KHMpOw0KLSAgICAgICAgdGhpcy5zdW1tYXJ5TGFiZWxSZXBsYWNlZCA9IGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXRhaWwoU3RyaW5nIHMpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldERldGFpbChzKTsNCi0gICAgICAgIHRoaXMuZGV0YWlsTGFiZWxSZXBsYWNlZCA9IGZhbHNlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjM5NmQ0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotDQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsNCi0NCi0vKioNCi0gKiBNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggdXNlcyBwcm9wZXJ0eSBmaWxlcy4NCi0gKiBTdWJjbGFzc2VzIGp1c3QgaGF2ZSB0byBwcm92aWRlIHRoZSBwYWNrYWdlIHRvIGxvb2sgYXQuDQotICogQW4gaW1wbGVtZW50YXRpb24gY2FuIGFsc28gcHJvdmlkZSBhIGN1c3RvbSBuYW1lIHdoaWNoIGlzIGUuZy4gY29uZmlndXJlZCB2aWEgd2ViLnhtbC4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGltcGxlbWVudHMgTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX1JFU09VUkNFX01BUktFUiA9ICI/Pz8iOw0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfREVGQVVMVF9DT05WRU5USU9OOw0KLSAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBkZWZhdWx0QnVuZGxlID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZUJ1bmRsZUJhc2VOYW1lOw0KLSAgICAvL3dpdGgganNmIDEuMSBvbmx5IGF2YWlsYWJsZSBpZiB0aGVyZSBpcyBhIGN1c3RvbSBiZWFuDQotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VCdW5kbGVWYXJOYW1lOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICBpZiAoa2V5ID09IG51bGwgfHwga2V5LmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihrZXkuY29udGFpbnMoIiAiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihrZXkuZW5kc1dpdGgoIl9kZXRhaWwiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcoMCwga2V5Lmxlbmd0aCgpIC0gNyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBrZXk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgY3VzdG9tTWVzc2FnZSA9IG51bGw7DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gdHJ5VG9GaW5kQ3VzdG9tTWVzc2FnZShrZXksIGxvY2FsZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nDQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY3VzdG9tTWVzc2FnZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIHRyeSB0byB1c2UgdGhlIGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZQ0KLSAgICAgICAgICovDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gdHJ5VG9Vc2VNZXNzYWdlQnVuZGxlQ29udmVudGlvbihrZXksIGxvY2FsZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nDQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY3VzdG9tTWVzc2FnZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIG5vIG1lc3NhZ2UgYnVuZGxlIG9yIG1lc3NhZ2UgZm91bmQgKHdpdGggdGhlIGNvbnZlbnRpb24pPw0KLSAgICAgICAgICovDQotDQotICAgICAgICAvL3RyeSB0byBsb2FkIGN1c3RvbSBtZXNzYWdlcw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHRyeVRvRmluZEN1c3RvbU1lc3NhZ2VJbkN1c3RvbVJlc291cmNlQnVuZGxlKGtleSwgbG9jYWxlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGRldGVybWluZU1lc3NhZ2Uoa2V5LCBsb2NhbGUsIGN1c3RvbU1lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvRmluZEN1c3RvbU1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7DQotICAgICAgICBTdHJpbmcgY3VzdG9tTWVzc2FnZSA9IG51bGw7DQotDQotICAgICAgICAvL29ubHkgaW4gY2FzZSBvZiBhIFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciB3aGljaCBpcyBjb25maWd1cmVkIGFzIGJlYW4NCi0gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lLCBsb2NhbGUpOw0KLSAgICAgICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigibWVzc2FnZSBidW5kbGUgIiArIHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lICsgIiBub3QgZm91bmQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vb25seSBpbiBjYXNlIG9mIGEgVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIHdoaWNoIGlzIGNvbmZpZ3VyZWQgYXMgYmVhbg0KLSAgICAgICAgaWYgKHRoaXMubWVzc2FnZUJ1bmRsZVZhck5hbWUgIT0gbnVsbCAmJiBjdXN0b21NZXNzYWdlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSAoUmVzb3VyY2VCdW5kbGUpIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbihtZXNzYWdlQnVuZGxlVmFyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJtZXNzYWdlIGJ1bmRsZSB2YXIgbmFtZSAiICsgdGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSArICIgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb1VzZU1lc3NhZ2VCdW5kbGVDb252ZW50aW9uKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIGlmICgoZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID09IG51bGwgfHwgIWRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICAgICAgJiYgaXNEZWZhdWx0TWVzc2FnZUJ1bmRsZUNvbnZlbnRpb25BY3RpdmUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZGVmYXVsdEJ1bmRsZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9CVU5ETEVfTkFNRSksIGxvY2FsZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgICAgICAgICAgICAgICAgIGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbiA9ICJ0cnVlIjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoZGVmYXVsdEJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHJ5VG9GaW5kQ3VzdG9tTWVzc2FnZUluQ3VzdG9tUmVzb3VyY2VCdW5kbGUoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSB0cnlUb0xvYWRDdXN0b21SZXNvdXJjZUJ1bmRsZShsb2NhbGUpOw0KLQ0KLSAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm5vIGN1c3RvbSBtZXNzYWdlIGZvciAiICsga2V5ICsgIiB3aXRoaW4gIiArIGdldEN1c3RvbUJhc2VOYW1lKCksIGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSB0cnlUb0xvYWRDdXN0b21SZXNvdXJjZUJ1bmRsZShMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VzdG9tQmFzZU5hbWUgPSBnZXRDdXN0b21CYXNlTmFtZSgpOw0KLQ0KLSAgICAgICAgaWYoY3VzdG9tQmFzZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGN1c3RvbUJhc2VOYW1lLCBsb2NhbGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGV0ZXJtaW5lTWVzc2FnZShTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlLCBTdHJpbmcgY3VzdG9tTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgLy91c2UgY3VzdG9tIG5hbWUgKGlmIHBvc3NpYmxlKSBvdGhlcndpc2U6IGZhbGxiYWNrIHRvIGRlZmF1bHQgbWVzc2FnZSAoaWYgcG9zc2libGUpDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKGN1c3RvbU1lc3NhZ2UgIT0gbnVsbCkgPyBjdXN0b21NZXNzYWdlDQotICAgICAgICAgICAgICAgICAgICA6IChnZXRCYXNlTmFtZSgpICE9IG51bGwpID8gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEJhc2VOYW1lKCksIGxvY2FsZSkuZ2V0U3RyaW5nKGtleSkgOiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBNSVNTSU5HX1JFU09VUkNFX01BUktFUiArIGtleSArIE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGVmYXVsdE1lc3NhZ2VCdW5kbGVDb252ZW50aW9uQWN0aXZlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRCYXNlTmFtZSgpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUJ1bmRsZUJhc2VOYW1lKFN0cmluZyBtZXNzYWdlQnVuZGxlQmFzZU5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lID0gbWVzc2FnZUJ1bmRsZUJhc2VOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VCdW5kbGVWYXJOYW1lKFN0cmluZyBtZXNzYWdlQnVuZGxlVmFyTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSA9IG1lc3NhZ2VCdW5kbGVWYXJOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODE4MDM3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyBhIE1lc3NhZ2VSZXNvbHZlciBmb3IgYSBnaXZlbiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJhZGQgZ2VuZXJpYyBqYXZhIGFwaSAoZGUtL3JlZ2lzdGVyIG1hcHBpbmcpIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotICAgICAgICBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXNzYWdlUmVzb2x2ZXI+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nOw0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBuYW1lTWFwcGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PigpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlUmVzb2x2ZXIgY3JlYXRlKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWUgPSBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSk7DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHN0cmF0ZWd5TmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChNZXNzYWdlUmVzb2x2ZXIpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmdldChzdHJhdGVneU5hbWUpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICBTdHJpbmcgcmVzb2x2ZXJOYW1lOw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vYnVpbGQgY29udmVudGlvbiAoVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKQ0KLSAgICAgICAgICAgIHJlc29sdmVyTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIC8vbmFtZSB3YXNuJ3QgbWFwcGVkDQotICAgICAgICAgICAgaWYgKHJlc29sdmVyTmFtZSA9PSBudWxsIHx8IFByb3h5VXRpbHMuZ2V0Q2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpKS5lcXVhbHMocmVzb2x2ZXJOYW1lKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtZXNzYWdlUmVzb2x2ZXIgPSAoTWVzc2FnZVJlc29sdmVyKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUocmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWVzc2FnZVJlc29sdmVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKHN0cmF0ZWd5TmFtZSwgcmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZXNvbHZlck5hbWUgKyAiIHVzZWQgZm9yICIgKyBzdHJhdGVneU5hbWUpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYWRkTWFwcGluZyhzdHJhdGVneU5hbWUsIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotDQotICAgICAgICAvL3NldHVwIGludGVybmFsIHN0YXRpYyBtYXBwaW5ncw0KLSAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgOg0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cE1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cE1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZyxTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWFwcGluZy5nZXRTb3VyY2UoKSwgbWFwcGluZy5nZXRUYXJnZXQoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyBtZXNzYWdlUmVzb2x2ZXJOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImFkZGluZyBzdGF0aWMgdmFsaWRhdGlvbiBzdHJhdGVneSB0byBtZXNzYWdlIHJlc29sdmVyIG1hcHBpbmc6ICINCi0gICAgICAgICAgICAgICAgKyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgIiAtPiAiICsgbWVzc2FnZVJlc29sdmVyTmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmcucHV0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIG1lc3NhZ2VSZXNvbHZlck5hbWUpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gZ2V0TmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmFtZU1hcHBlckxpc3Q7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzllZGM2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgTWVzc2FnZVJlc29sdmVyIHdoaWNoIHVzZXMgdGhlIGRlZmF1bHQgY29udmVudGlvbiBmb3IgdGhlIG1lc3NhZ2UgYnVuZGxlLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBtZXNzYWdlIGJ1bmRsZSB2aWEgd2ViLnhtbA0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0JVTkRMRSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVTU0FHRV9CVU5ETEU7DQotDQotICAgIC8vbm90IHVzZWQgYXQgdGhlIG1vbWVudCAtIGp1c3QgZm9yIGEgY29udmVudGlvbg0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1vZHVsZU1lc3NhZ2VCdW5kbGVOYW1lKGdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21CYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBDVVNUT01fQlVORExFOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL01lc3NhZ2VSZXNvbHZlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjY2ExYzEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgZm9yIE1lc3NhZ2VSZXNvbHZlcnMgaW5kZXBlbmRlbnQgb2YgdGhlIG1lc3NhZ2Ugc291cmNlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkNDBiNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmMwOGU4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gTWVzc2FnZVJlc29sdmVycy4NCi0gKiAoY29uZmlndXJlZCB2aWEgd2ViLnhtbCkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfTkFNRV9NQVBQRVI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDNjMDEzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ3kgdG8gTWVzc2FnZVJlc29sdmVyLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NU0dfUkVTT0xWRVJfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGViYjRkNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSW4gb3JkZXIgdG8gcHJvdmlkZSBhIE5hbWVNYXBwZXIgcGVyIHZhbGlkYXRpb24gbW9kdWxlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigzMTApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODA0ZDQxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotLyoqDQotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBtYXBzIEV4dFZhbCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBFeHRWYWwgTWVzc2FnZVJlc29sdmVycy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcyA9IFByb3h5VXRpbHMNCi0gICAgICAgICAgICAgICAgLmdldFVucHJveGllZENsYXNzKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MpOw0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1lc3NhZ2VSZXNvbHZlckNsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXRTaW1wbGVOYW1lKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgc3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUoc3RyYXRlZ3lDbGFzc05hbWUpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2M2Q5NzAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIHRvIHBsYWNlIFZhbGlkYXRpb25TdHJhdGVnaWVzIGFuZCBNZXNzYWdlUmVzb2x2ZXJzIGluIHRoZSBzYW1lIHBhY2thZ2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDQwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgc3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjdXN0b21Qb3N0Zml4ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFX1JFU09MVkVSX1BPU1RGSVgpOw0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZShzdHJhdGVneUNsYXNzTmFtZSwgY3VzdG9tUG9zdGZpeCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDM4ZjU0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkdlbmVyaWNBcnJheVR5cGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LldpbGRjYXJkVHlwZTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGV4dHJhY3RCeUlkKGFubm90YXRpb24sIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBleHRyYWN0QnlJZChhbm5vdGF0aW9uLCBrZXksIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyA8VD4gTGlzdDxUPiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSwgQ2xhc3M8VD4gdmFsdWVUeXBlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZXh0cmFjdEJ5SWQoYW5ub3RhdGlvbiwga2V5LCB2YWx1ZVR5cGUsIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyA8VD4gVCBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSwgQ2xhc3M8VD4gdmFsdWVUeXBlLCBDbGFzcyB2YWx1ZUlkKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFQ+IHJlc3VsdHMgPSBleHRyYWN0QnlJZChhbm5vdGF0aW9uLCBrZXksIHZhbHVlVHlwZSwgdmFsdWVJZCk7DQotDQotICAgICAgICBpZihyZXN1bHRzLml0ZXJhdG9yKCkuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRzLml0ZXJhdG9yKCkubmV4dCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHVibGljIDxUPiBMaXN0PFQ+IGV4dHJhY3RCeUlkKEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSwgQ2xhc3M8VD4gdmFsdWVUeXBlLCBDbGFzcyB2YWx1ZUlkKQ0KLSAgICB7DQotICAgICAgICBMaXN0PE9iamVjdD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7DQotDQotICAgICAgICBmb3IoT2JqZWN0IGVudHJ5IDogZXh0cmFjdEJ5SWQoYW5ub3RhdGlvbiwga2V5LCB2YWx1ZUlkKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWx1ZVR5cGUuaXNBc3NpZ25hYmxlRnJvbShlbnRyeS5nZXRDbGFzcygpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoTGlzdDxUPilyZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8T2JqZWN0PiBleHRyYWN0QnlJZChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzIHZhbHVlSWQpDQotICAgIHsNCi0gICAgICAgIE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4gZnVsbFJlc3VsdCA9IGV4dHJhY3RCeUlkKGFubm90YXRpb24sIHZhbHVlSWQpOw0KLQ0KLSAgICAgICAgaWYoZnVsbFJlc3VsdC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmdWxsUmVzdWx0LmdldChrZXkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJhZGQgd2ViLnhtbCBwYXJhbWV0ZXIgZm9yIHBlcmZvcm1hbmNlIHR1bmluZyB0byBkZWFjdGl2YXRlIHRoZSBzY2FuIikNCi0gICAgcHVibGljIE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4gZXh0cmFjdEJ5SWQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBDbGFzcyB2YWx1ZUlkKQ0KLSAgICB7DQotICAgICAgICBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PigpOw0KLQ0KLSAgICAgICAgZm9yKE1ldGhvZCBjdXJyZW50QW5ub3RhdGlvbkF0dHJpYnV0ZSA6IGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKS5nZXREZWNsYXJlZE1ldGhvZHMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKCFpc1ZhbGlkYXRpb25QYXJhbWV0ZXIoY3VycmVudEFubm90YXRpb25BdHRyaWJ1dGUuZ2V0R2VuZXJpY1JldHVyblR5cGUoKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIE9iamVjdCBwYXJhbWV0ZXJWYWx1ZSA9IGN1cnJlbnRBbm5vdGF0aW9uQXR0cmlidXRlLmludm9rZShhbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYocGFyYW1ldGVyVmFsdWUgaW5zdGFuY2VvZiBDbGFzc1tdKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBmb3IoQ2xhc3MgY3VycmVudFBhcmFtZXRlclZhbHVlIDogKENsYXNzW10pcGFyYW1ldGVyVmFsdWUpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgLy9rZWVwIGNoZWNrIHNvIHRoYXQgZm9sbG93aW5nIGlzIHRydWU6DQotICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIGZvdW5kIHdoaWNoIHRlbGxzIHRoYXQgaXQgaXNuJ3QgYSBibG9ja2luZyBlcnJvciwgbGV0IGl0IHBhc3MNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUGFyYW1ldGVyVmFsdWUoYW5ub3RhdGlvbiwgY3VycmVudFBhcmFtZXRlclZhbHVlLCByZXN1bHQsIHZhbHVlSWQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UgaWYocGFyYW1ldGVyVmFsdWUgaW5zdGFuY2VvZiBDbGFzcykNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgLy9rZWVwIGNoZWNrIHNvIHRoYXQgZm9sbG93aW5nIGlzIHRydWU6DQotICAgICAgICAgICAgICAgICAgICAvL2lmIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgZm91bmQgd2hpY2ggdGVsbHMgdGhhdCBpdCBpc24ndCBhIGJsb2NraW5nIGVycm9yLCBsZXQgaXQgcGFzcw0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1BhcmFtZXRlclZhbHVlKGFubm90YXRpb24sIChDbGFzcylwYXJhbWV0ZXJWYWx1ZSwgcmVzdWx0LCB2YWx1ZUlkKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGRvbid0IHVzZSB0aGUgSW50cm9zcGVjdG9yIGluIHRoaXMgY2FzZQ0KLSAgICAgKiBpZiB5b3UgaGF2ZSBhIGJldHRlciBzb2x1dGlvbiB3aGljaCBzdXBwb3J0cyBhbGwgc3VwcG9ydGVkIHBhcmFtZXRlciBzdHlsZXMgKHNlZSBleHR2YWwgd2lraSksDQotICAgICAqIHlvdSBjYW4gaW1wbC4gaXQgYW5kIHVzZSBpdCAoZXhjaGFuZ2UgdGhlIGltcGxzLiB2aWEgdGhlIEV4dFZhbENvbnRleHQpLg0KLSAgICAgKiBmdXJ0aGVybW9yZSwgeW91IGNhbiBwcm92aWRlIHRoZSBmaXggZm9yIHRoZSBjb21tdW5pdHkNCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUGFyYW1ldGVyVmFsdWUoDQotICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBDbGFzcyBwYXJhbUNsYXNzLCBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+IHJlc3VsdCwgQ2xhc3MgdmFsdWVJZCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBPYmplY3Qga2V5ID0gbnVsbDsNCi0gICAgICAgIExpc3Q8T2JqZWN0PiBwYXJhbWV0ZXJWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0NCi0gICAgICAgIGlmKFZhbGlkYXRpb25QYXJhbWV0ZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShwYXJhbUNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBMaXN0PEZpZWxkPiBwcm9jZXNzZWRGaWVsZHMgPSBuZXcgQXJyYXlMaXN0PEZpZWxkPigpOw0KLSAgICAgICAgICAgIExpc3Q8TWV0aG9kPiBwcm9jZXNzZWRNZXRob2RzID0gbmV3IEFycmF5TGlzdDxNZXRob2Q+KCk7DQotDQotICAgICAgICAgICAgQ2xhc3MgY3VycmVudFBhcmFtQ2xhc3MgPSBwYXJhbUNsYXNzOw0KLSAgICAgICAgICAgIHdoaWxlIChjdXJyZW50UGFyYW1DbGFzcyAhPSBudWxsICYmICFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjdXJyZW50UGFyYW1DbGFzcy5nZXROYW1lKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgICAgICogcHJvY2VzcyBjbGFzcw0KLSAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICAgICAgLy9zdXBwb3J0IHB1cmUgaW50ZXJmYWNlIGFwcHJvYWNoIGUuZy4gVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcw0KLSAgICAgICAgICAgICAgICBmb3IoRmllbGQgY3VycmVudEZpZWxkIDogY3VycmVudFBhcmFtQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoIXByb2Nlc3NlZEZpZWxkcy5jb250YWlucyhjdXJyZW50RmllbGQpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHByb2Nlc3NGb3VuZEZpZWxkKGFubm90YXRpb24sIGN1cnJlbnRGaWVsZCwgcGFyYW1ldGVyVmFsdWVzLCBrZXksIHZhbHVlSWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEZpZWxkcy5hZGQoY3VycmVudEZpZWxkKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAvL2luc3BlY3QgdGhlIG90aGVyIG1ldGhvZHMgb2YgdGhlIGltcGxlbWVudGluZyBjbGFzcw0KLSAgICAgICAgICAgICAgICBmb3IoTWV0aG9kIGN1cnJlbnRNZXRob2QgOiBjdXJyZW50UGFyYW1DbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoIXByb2Nlc3NlZE1ldGhvZHMuY29udGFpbnMoY3VycmVudE1ldGhvZCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcHJvY2Vzc0ZvdW5kTWV0aG9kKGN1cnJlbnRQYXJhbUNsYXNzLCBjdXJyZW50TWV0aG9kLCBwYXJhbWV0ZXJWYWx1ZXMsIGtleSwgdmFsdWVJZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkTWV0aG9kcy5hZGQoY3VycmVudE1ldGhvZCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgICAgICogcHJvY2VzcyBpbnRlcmZhY2VzDQotICAgICAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgICAgICBmb3IoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IGN1cnJlbnRQYXJhbUNsYXNzLmdldEludGVyZmFjZXMoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoIVZhbGlkYXRpb25QYXJhbWV0ZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjdXJyZW50SW50ZXJmYWNlKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIC8vc3VwcG9ydCBpbnRlcmZhY2UgKyBpbXBsLiBhcHByb2FjaCBlLmcuIE15UGFyYW1JbXBsLmNsYXNzDQotICAgICAgICAgICAgICAgICAgICAvLyhNeVBhcmFtSW1wbCBpbXBsZW1lbnRzIE15UGFyYW0NCi0gICAgICAgICAgICAgICAgICAgIC8vTXlQYXJhbSBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi0gICAgICAgICAgICAgICAgICAgIC8vbWV0aG9kcyBpbiB0aGUgaW50ZXJmYWNlIGhhdmUgdG8gYmUgbWFya2VkIHdpdGggQFBhcmFtZXRlclZhbHVlIGFuZCBAUGFyYW1ldGVyS2V5DQotICAgICAgICAgICAgICAgICAgICBmb3IoTWV0aG9kIGN1cnJlbnRNZXRob2QgOiBjdXJyZW50SW50ZXJmYWNlLmdldERlY2xhcmVkTWV0aG9kcygpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwcm9jZXNzZWRNZXRob2RzLmNvbnRhaW5zKGN1cnJlbnRNZXRob2QpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcHJvY2Vzc0ZvdW5kTWV0aG9kKGN1cnJlbnRQYXJhbUNsYXNzLCBjdXJyZW50TWV0aG9kLCBwYXJhbWV0ZXJWYWx1ZXMsIGtleSwgdmFsdWVJZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZE1ldGhvZHMuYWRkKGN1cnJlbnRNZXRob2QpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGZvcihGaWVsZCBjdXJyZW50RmllbGQgOiBjdXJyZW50SW50ZXJmYWNlLmdldERlY2xhcmVkRmllbGRzKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXByb2Nlc3NlZEZpZWxkcy5jb250YWlucyhjdXJyZW50RmllbGQpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcHJvY2Vzc0ZvdW5kRmllbGQoYW5ub3RhdGlvbiwgY3VycmVudEZpZWxkLCBwYXJhbWV0ZXJWYWx1ZXMsIGtleSwgdmFsdWVJZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEZpZWxkcy5hZGQoY3VycmVudEZpZWxkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgY3VycmVudFBhcmFtQ2xhc3MgPSBjdXJyZW50UGFyYW1DbGFzcy5nZXRTdXBlcmNsYXNzKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAga2V5ID0gY3JlYXRlRGVmYXVsdEtleShrZXksIHBhcmFtQ2xhc3MpOw0KLQ0KLSAgICAgICAgaWYocGFyYW1ldGVyVmFsdWVzLmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL0BQYXJhbWV0ZXJWYWx1ZSBpcyBvcHRpb25hbCBhcyB3ZWxsDQotICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWVzLmFkZChrZXkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYocmVzdWx0LmNvbnRhaW5zS2V5KGtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmdldChrZXkpLmFkZEFsbChwYXJhbWV0ZXJWYWx1ZXMpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5wdXQoa2V5LCBwYXJhbWV0ZXJWYWx1ZXMpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IGNyZWF0ZURlZmF1bHRLZXkoT2JqZWN0IGtleSwgQ2xhc3MgY3VycmVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZihrZXkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2NoZWNrIGZvciBzdXBlci1pbnRlcmZhY2UgKGV4Y2x1ZGUgVmFsaWRhdGlvblBhcmFtZXRlciBpdHNlbGYpDQotICAgICAgICAgICAgZm9yKENsYXNzIGludGVyZmFjZUNsYXNzIDogY3VycmVudENsYXNzLmdldEludGVyZmFjZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKFZhbGlkYXRpb25QYXJhbWV0ZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShpbnRlcmZhY2VDbGFzcykgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAoIWludGVyZmFjZUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoVmFsaWRhdGlvblBhcmFtZXRlci5jbGFzcy5nZXROYW1lKCkpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAga2V5ID0gaW50ZXJmYWNlQ2xhc3M7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGtleSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGtleSA9IGN1cnJlbnRDbGFzczsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBrZXk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgcHJvY2Vzc0ZvdW5kRmllbGQoDQotICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlLCBGaWVsZCBjdXJyZW50RmllbGQsIExpc3Q8T2JqZWN0PiBwYXJhbVZhbHVlcywgT2JqZWN0IGtleSwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IG5ld0tleSA9IG51bGw7DQotICAgICAgICBpZihrZXkgPT0gbnVsbCAmJiBjdXJyZW50RmllbGQuaXNBbm5vdGF0aW9uUHJlc2VudChQYXJhbWV0ZXJLZXkuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbmV3S2V5ID0gY3VycmVudEZpZWxkLmdldChpbnN0YW5jZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIC8vbm8gImVsc2UgaWYiIHRvIGFsbG93IGJvdGggYXQgb25lIGZpZWxkDQotICAgICAgICBpZihjdXJyZW50RmllbGQuaXNBbm5vdGF0aW9uUHJlc2VudChQYXJhbWV0ZXJWYWx1ZS5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodmFsdWVJZCA9PSBudWxsIHx8IHZhbHVlSWQuZXF1YWxzKGN1cnJlbnRGaWVsZC5nZXRBbm5vdGF0aW9uKFBhcmFtZXRlclZhbHVlLmNsYXNzKS5pZCgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOw0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1WYWx1ZXMuYWRkKGN1cnJlbnRGaWVsZC5nZXQoaW5zdGFuY2UpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG5ld0tleSAhPSBudWxsID8gbmV3S2V5IDoga2V5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IHByb2Nlc3NGb3VuZE1ldGhvZCgNCi0gICAgICAgICAgICBDbGFzcyBwYXJhbUNsYXNzLCBNZXRob2QgY3VycmVudE1ldGhvZCwgTGlzdDxPYmplY3Q+IHBhcmFtZXRlclZhbHVlcywgT2JqZWN0IGtleSwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IG5ld0tleSA9IG51bGw7DQotICAgICAgICBpZihrZXkgPT0gbnVsbCAmJiBjdXJyZW50TWV0aG9kLmlzQW5ub3RhdGlvblByZXNlbnQoUGFyYW1ldGVyS2V5LmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKCEoTW9kaWZpZXIuaXNBYnN0cmFjdChwYXJhbUNsYXNzLmdldE1vZGlmaWVycygpKSB8fCBNb2RpZmllci5pc0ludGVyZmFjZShwYXJhbUNsYXNzLmdldE1vZGlmaWVycygpKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG5ld0tleSA9IGN1cnJlbnRNZXRob2QuaW52b2tlKHBhcmFtQ2xhc3MubmV3SW5zdGFuY2UoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9ubyAiZWxzZSBpZiIgdG8gYWxsb3cgYm90aCBhdCBvbmUgZmllbGQNCi0gICAgICAgIGlmKGN1cnJlbnRNZXRob2QuaXNBbm5vdGF0aW9uUHJlc2VudChQYXJhbWV0ZXJWYWx1ZS5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodmFsdWVJZCA9PSBudWxsIHx8IHZhbHVlSWQuZXF1YWxzKGN1cnJlbnRNZXRob2QuZ2V0QW5ub3RhdGlvbihQYXJhbWV0ZXJWYWx1ZS5jbGFzcykuaWQoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50TWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJWYWx1ZXMuYWRkKGN1cnJlbnRNZXRob2QuaW52b2tlKHBhcmFtQ2xhc3MubmV3SW5zdGFuY2UoKSkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBpZiBpdCdzIGEgbm9uZS1zdGF0aWMgaW5uZXIgY2xhc3MgLT4gcmV0dXJuIHRoaXMgY2xhc3MNCi0gICAgICAgICAgICAgICAgICAgIGlmKHBhcmFtQ2xhc3MuZ2V0RW5jbG9zaW5nQ2xhc3MoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlcy5hZGQocGFyYW1DbGFzcyk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG5ld0tleSAhPSBudWxsID8gbmV3S2V5IDoga2V5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkYXRpb25QYXJhbWV0ZXIoVHlwZSBnZW5lcmljUmV0dXJuVHlwZSkNCi0gICAgew0KLSAgICAgICAgaWYoZ2VuZXJpY1JldHVyblR5cGUgaW5zdGFuY2VvZiBHZW5lcmljQXJyYXlUeXBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCgoR2VuZXJpY0FycmF5VHlwZSlnZW5lcmljUmV0dXJuVHlwZSkuZ2V0R2VuZXJpY0NvbXBvbmVudFR5cGUoKSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGFuYWx5emVQYXJhbWV0ZXJpemVkVHlwZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICAoUGFyYW1ldGVyaXplZFR5cGUpKChHZW5lcmljQXJyYXlUeXBlKWdlbmVyaWNSZXR1cm5UeXBlKS5nZXRHZW5lcmljQ29tcG9uZW50VHlwZSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKGdlbmVyaWNSZXR1cm5UeXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFuYWx5emVQYXJhbWV0ZXJpemVkVHlwZSgNCi0gICAgICAgICAgICAgICAgICAgIChQYXJhbWV0ZXJpemVkVHlwZSlnZW5lcmljUmV0dXJuVHlwZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGFuYWx5emVQYXJhbWV0ZXJpemVkVHlwZShQYXJhbWV0ZXJpemVkVHlwZSBwYXJhbWV0ZXJpemVkVHlwZSkNCi0gICAgew0KLSAgICAgICAgZm9yKFR5cGUgdHlwZSA6IHBhcmFtZXRlcml6ZWRUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0eXBlIGluc3RhbmNlb2YgV2lsZGNhcmRUeXBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm9yKFR5cGUgdXBwZXJCb3VuZHMgOiAoKFdpbGRjYXJkVHlwZSl0eXBlKS5nZXRVcHBlckJvdW5kcygpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZih1cHBlckJvdW5kcyBpbnN0YW5jZW9mIENsYXNzICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZm9yIGF0dHJpYnV0ZXMgbGlrZTogQ2xhc3M8PyBleHRlbmRzIEluaGVyaXRlZEZyb21WYWxpZGF0aW9uUGFyYW1ldGVyPiB2YWx1ZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uUGFyYW1ldGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oKENsYXNzKXVwcGVyQm91bmRzKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyYTczYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkgaW1wbGVtZW50cyBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeQ0KLXsNCi0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciA9IG51bGw7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGNyZWF0ZSgpDQotICAgIHsNCi0gICAgICAgIGlmICh2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SKTsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yQ2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SKSk7DQotICAgICAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckNsYXNzTmFtZXMuYWRkKERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckNsYXNzTmFtZXMpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yID0gKFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IpDQotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGNyZWF0ZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjdhZTkzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIG1hcHMgaW50ZXJuYWwgcGFyYW1ldGVycyB0byBvcHRpb25hbGx5IGF2YWlsYWJsZSBjdXN0b20gcGFyYW1ldGVycw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxDbGFzcywgQ2xhc3M+DQotew0KLSAgICBwcml2YXRlIE1hcDxDbGFzcywgQ2xhc3M+IHBhcmFtZXRlck1hcHBpbmcgPSBuZXcgSGFzaE1hcDxDbGFzcywgQ2xhc3M+KCk7DQotDQotICAgIHB1YmxpYyBDbGFzcyBjcmVhdGUoQ2xhc3Mgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZiAodGhpcy5wYXJhbWV0ZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHNvdXJjZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1ldGVyTWFwcGluZy5nZXQoc291cmNlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIENsYXNzIHJlc3VsdDsNCi0NCi0gICAgICAgIC8vaXQncyBpbXBvcnRhbnQgdG8gbG9vayBmb3IgdGhlIHN0YXRpYyBjb25maWdzIGZpcnN0IC0gZ2xvYmFsIHBhcmFtZXRlcnMgYXJlIHVzZWQgaW50ZXJuYWxseQ0KLSAgICAgICAgcmVzdWx0ID0gdHJ5VG9GaW5kU3RhdGljQ29uZmlnKHNvdXJjZSk7DQotDQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gdHJ5VG9GaW5kR2xvYmFsUGFyYW1ldGVyKHNvdXJjZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gc291cmNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgY2FjaGVNYXBwaW5nKHNvdXJjZSwgcmVzdWx0KTsNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBDbGFzcyB0cnlUb0ZpbmRHbG9iYWxQYXJhbWV0ZXIoQ2xhc3Mgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgdGFyZ2V0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoc291cmNlLmdldE5hbWUoKSk7DQotDQotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQ2xhc3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChDbGFzcykgdGFyZ2V0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBDbGFzcyB0cnlUb0ZpbmRTdGF0aWNDb25maWcoQ2xhc3Mgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBDbGFzcyByZXN1bHQgPSBudWxsOw0KLSAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBjb25maWcgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0U3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuVkFMSURBVElPTl9QQVJBTUVURVJfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSB0cnlUb01hcChzb3VyY2UsIGNvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLQ0KLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBDbGFzcyB0cnlUb01hcChDbGFzcyBzb3VyY2UsIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZykNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0ID0gbnVsbDsNCi0NCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IG1hcHBpbmcpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHNvdXJjZS5nZXROYW1lKCkuZXF1YWxzKGVudHJ5LmdldFNvdXJjZSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRhcmdldCA9IENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKGVudHJ5LmdldFRhcmdldCgpKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0YXJnZXQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNhY2hlTWFwcGluZyhDbGFzcyBzb3VyY2UsIENsYXNzIHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJNYXBwaW5nLnB1dChzb3VyY2UsIHRhcmdldCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjZjN2YxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBtZWNoYW5pc20gdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGV4dHZhbA0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgaW1wbGVtZW50cyBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyDQotew0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXZlcml0eUJsb2Nrc05hdmlnYXRpb24oDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUi5lcXVhbHMoc2V2ZXJpdHkpIHx8IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9GQVRBTC5lcXVhbHMoc2V2ZXJpdHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHNldmVyaXR5Q2F1c2VzVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IuZXF1YWxzKHNldmVyaXR5KSB8fCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUwuZXF1YWxzKHNldmVyaXR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXZlcml0eUNhdXNlc1Zpb2xhdGlvbk1lc3NhZ2UoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gc2V2ZXJpdHlCbG9ja3NTdWJtaXQoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUi5lcXVhbHMoc2V2ZXJpdHkpIHx8IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9GQVRBTC5lcXVhbHMoc2V2ZXJpdHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHNldmVyaXR5U2hvd3NJbmRpY2F0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IuZXF1YWxzKHNldmVyaXR5KSB8fCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUwuZXF1YWxzKHNldmVyaXR5KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwMDg2Yi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbiBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvUGFyYW1ldGVyS2V5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlcktleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzAyYmJhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvUGFyYW1ldGVyS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRhcmdldCh7RklFTEQsIE1FVEhPRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFBhcmFtZXRlcktleQ0KLXsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9QYXJhbWV0ZXJWYWx1ZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9QYXJhbWV0ZXJWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmRjOGYzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvUGFyYW1ldGVyVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVGFyZ2V0KHtGSUVMRCwgTUVUSE9EfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUGFyYW1ldGVyVmFsdWUNCi17DQotICAgIENsYXNzIGlkKCkgZGVmYXVsdCBQYXJhbWV0ZXJWYWx1ZS5jbGFzczsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE1OWM3Ni4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uUGFyYW1ldGVyDQotew0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjA5OTAyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yDQotew0KLSAgICBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKTsNCi0gICAgTGlzdDxPYmplY3Q+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5KTsNCi0gICAgPFQ+IExpc3Q8VD4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSk7DQotICAgIDxUPiBUIGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzczxUPiB2YWx1ZVR5cGUsIENsYXNzIHZhbHVlSWQpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkY2RkZDIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5DQotew0KLSAgICBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGNyZWF0ZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1Zpb2xhdGlvblNldmVyaXR5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1Zpb2xhdGlvblNldmVyaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMjg4N2MuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WaW9sYXRpb25TZXZlcml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmlvbGF0aW9uU2V2ZXJpdHkNCi17DQotICAgIGludGVyZmFjZSBJbmZvIGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcg0KLSAgICB7DQotICAgICAgICBAUGFyYW1ldGVyS2V5DQotICAgICAgICBwdWJsaWMgQ2xhc3MgS0VZID0gVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3M7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgQFBhcmFtZXRlclZhbHVlDQotICAgICAgICBwdWJsaWMgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFNFVkVSSVRZID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0lORk87DQotDQotICAgICAgICAvL0BQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgLy9NZXNzYWdlVHlwZSBwb3N0Zml4ID0gTWVzc2FnZVR5cGUuSU5GTzsNCi0gICAgfQ0KLQ0KLSAgICBpbnRlcmZhY2UgV2FybiBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi0gICAgew0KLSAgICAgICAgQFBhcmFtZXRlcktleQ0KLSAgICAgICAgcHVibGljIENsYXNzIEtFWSA9IFZpb2xhdGlvblNldmVyaXR5LmNsYXNzOw0KLQ0KLSAgICAgICAgQFBhcmFtZXRlclZhbHVlDQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgU0VWRVJJVFkgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfV0FSTjsNCi0NCi0gICAgICAgIC8vQFBhcmFtZXRlclZhbHVlDQotICAgICAgICAvL01lc3NhZ2VUeXBlIHBvc3RmaXggPSBNZXNzYWdlVHlwZS5XQVJOOw0KLSAgICB9DQotDQotICAgIGludGVyZmFjZSBFcnJvciBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi0gICAgew0KLSAgICAgICAgQFBhcmFtZXRlcktleQ0KLSAgICAgICAgcHVibGljIENsYXNzIEtFWSA9IFZpb2xhdGlvblNldmVyaXR5LmNsYXNzOw0KLQ0KLSAgICAgICAgQFBhcmFtZXRlclZhbHVlDQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgU0VWRVJJVFkgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1I7DQotDQotICAgICAgICAvL0BQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgLy9NZXNzYWdlVHlwZSBwb3N0Zml4ID0gTWVzc2FnZVR5cGUuRVJST1I7DQotICAgIH0NCi0NCi0gICAgaW50ZXJmYWNlIEZhdGFsIGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcg0KLSAgICB7DQotICAgICAgICBAUGFyYW1ldGVyS2V5DQotICAgICAgICBwdWJsaWMgQ2xhc3MgS0VZID0gVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3M7DQotDQotICAgICAgICBAUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBTRVZFUklUWSA9IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9GQVRBTDsNCi0NCi0gICAgICAgIC8vQFBhcmFtZXRlclZhbHVlDQotICAgICAgICAvL01lc3NhZ2VUeXBlIHBvc3RmaXggPSBNZXNzYWdlVHlwZS5GQVRBTDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1Zpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzZiZDk0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIG1lY2hhbmlzbSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgZXh0dmFsDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyDQotew0KLSAgICAvKioNCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBjdXJyZW50IGZhY2VzIGNvbnRleHQNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IGN1cnJlbnQgY29tcG9uZW50DQotICAgICAqIEBwYXJhbSBzZXZlcml0eSBqc2Ygc2V2ZXJpdHkgZm9yIGZhY2VzIG1lc3NhZ2VzDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2V2ZXJpdHkgc2hvdWxkIGJsb2NrIHRoZSBuYXZpZ2F0aW9uDQotICAgICAqIGlmICNzZXZlcml0eUNhdXNlc1ZhbGlkYXRvckV4Y2VwdGlvbiByZXR1cm5zIGZhbGxzIHZhbGlkYXRpb24gd2lsbCBiZSBjb250aW51ZWQgZm9yIHRoZSBjdXJyZW50IHByb3BlcnR5DQotICAgICAqIGFsbCBtZXNzYWdlcyB3aGljaCBkb24ndCBsZWFkIHRvIGFuIGV4Y2VwdGlvbiBzaG91bGQgYmUgc3RvcmVkIGluIGFuIHN0b3JhZ2UgYW5kDQotICAgICAqIGFkZGVkIGFmdGVyIHRoZSBmaXJzdCBtZXNzYWdlIHdoaWNoIGdldHMgdGhyb3duIGFzIGV4Y2VwdGlvbg0KLSAgICAgKiBhIGdsb2JhbCBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBhZGQgdGhlIG1lc3NhZ2VzIG9mIHRoZSBzdG9yYWdlIGFzIGZhY2VzIG1lc3NhZ2UNCi0gICAgICovDQotICAgIGJvb2xlYW4gc2V2ZXJpdHlCbG9ja3NOYXZpZ2F0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpOw0KLQ0KLSAgICAvKioNCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBjdXJyZW50IGZhY2VzIGNvbnRleHQNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IGN1cnJlbnQgY29tcG9uZW50DQotICAgICAqIEBwYXJhbSBzZXZlcml0eSBqc2Ygc2V2ZXJpdHkgZm9yIGZhY2VzIG1lc3NhZ2VzDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2V2ZXJpdHkgc2hvdWxkIGNhdXNlIGEgdmFsaWRhdG9yIGV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBzZXZlcml0eUNhdXNlc1ZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KTsNCi0NCi0gICAgLyoqDQotICAgICAqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSB2aW9sYXRpb24gbWVzc2FnZSBsZWFkcyB0byBhIGZhY2VzIG1lc3NhZ2UNCi0gICAgICovDQotICAgIGJvb2xlYW4gc2V2ZXJpdHlDYXVzZXNWaW9sYXRpb25NZXNzYWdlKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpOw0KLQ0KLSAgICAvKioNCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBjdXJyZW50IGZhY2VzIGNvbnRleHQNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IGN1cnJlbnQgY29tcG9uZW50DQotICAgICAqIEBwYXJhbSBzZXZlcml0eSBqc2Ygc2V2ZXJpdHkgZm9yIGZhY2VzIG1lc3NhZ2VzDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29uc3RyYWludCB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSBzaG91bGQgYmUgdmFsaWRhdGVkIG9uIHRoZSBjbGllbnQgc2lkZSAoaWYgc3VwcG9ydGVkKQ0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBzZXZlcml0eUJsb2Nrc1N1Ym1pdCgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KTsNCi0NCi0gICAgLyoqDQotICAgICAqIGF2YWlsYWJsZSBmb3IgYWRkLW9ucyAtIG5vdCB1c2VkIGludGVybmFsbHkgZHVlIHRvIHBlcmZvcm1hbmNlIHJlYXNvbnMNCi0gICAgICoNCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBjdXJyZW50IGZhY2VzIGNvbnRleHQNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IGN1cnJlbnQgY29tcG9uZW50DQotICAgICAqIEBwYXJhbSBzZXZlcml0eSBqc2Ygc2V2ZXJpdHkgZm9yIGZhY2VzIG1lc3NhZ2VzDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29uc3RyYWludCB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eQ0KLSAgICAgKiBzaG91bGQgY2F1c2UgZS5nLiBhIHJlcXVpcmVkIG1hcmtlciBpbmRlcGVuZGVudCBvZiBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIChpZiBzdXBwb3J0ZWQpDQotICAgICAqLw0KLSAgICBib29sZWFuIHNldmVyaXR5U2hvd3NJbmRpY2F0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1OWM5MzQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci0KLS8qKgotICogUHJvdmlkZXMgdGhlIGFiaWxpdHkgb2YgbWVzc2FnZSByZXNvbHZpbmcgdG8gVmFsaWRhdGlvblN0cmF0ZWdpZXMKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5PEEgZXh0ZW5kcyBBbm5vdGF0aW9uPiBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ci17Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVggPSAiX2RldGFpbCI7Ci0gICAgLy9lLmcuIGZvciBpbmplY3RpbmcgYSBtZXNzYWdlIHJlc29sdmVyIHZpYSBzcHJpbmcKLSAgICBwcml2YXRlIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXI7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICBMb2NhbGUgbG9jYWxlID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCk7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZVJlc29sdmVyICE9IG51bGwgPyB0aGlzLm1lc3NhZ2VSZXNvbHZlci5nZXRNZXNzYWdlKGtleSwgbG9jYWxlKSA6Ci0gICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodGhpcykuZ2V0TWVzc2FnZShrZXksIGxvY2FsZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KEEgYW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiByZXNvbHZlTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbikpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKEEgYW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pOwotICAgICAgICAgICAgcmV0dXJuIChrZXkgIT0gbnVsbCkgPyByZXNvbHZlTWVzc2FnZShrZXkgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCkgOiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBrZXkgIiArIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKSArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLAotICAgICAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEZhY2VzTWVzc2FnZSBnZXRWYWxpZGF0aW9uRXJyb3JGYWNlc01lc3NhZ2UoQSBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZUZhY2VzTWVzc2FnZShnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24pLCBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbikpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEEgYW5ub3RhdGlvbik7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlUmVzb2x2ZXIoTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIHRoaXMubWVzc2FnZVJlc29sdmVyID0gbWVzc2FnZVJlc29sdmVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQotICAgIHsKLSAgICAgICAgbWV0YURhdGFFbnRyeS5zZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCwgZ2V0TGFiZWwoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSkpOwotCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24pOwotICAgIH0KLQotICAgIC8vZS5nLiBmb3IgY3VzdG9tIGFubm90YXRpb25zIC0gb3ZlcnJpZGUgaWYgbmVlZGVkCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxZjNlZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLmV4Y2VwdGlvbi5SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIFByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIHVzZSBWYWxpZGF0b3JFeGNlcHRpb24gKGFzIGV4cGVjdGVkIGJ5IHRoZSB1c2VyKSBpbnN0ZWFkIG9mIENvbnZlcnRlckV4Y2VwdGlvbi4NCi0gKiBGdXJ0aGVybW9yZSBpdCBwcm92aWRlczo8YnIvPg0KLSAqIGluaXRWYWxpZGF0aW9uPGJyLz4NCi0gKiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBpbml0VmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW5pdFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiaW5pdFZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHByb2Nlc3NWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByb2Nlc3NWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInByb2Nlc3NWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVmFsaWRhdG9yRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLSAgICAgICAgICAgIGlmKGUgaW5zdGFuY2VvZiBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbiA9IG5ldyBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb252ZXJ0RmFjZXNNZXNzYWdlKGUuZ2V0RmFjZXNNZXNzYWdlKCkpLCBlLmdldENhdXNlKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24gPSBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbnZlcnRGYWNlc01lc3NhZ2UoZS5nZXRGYWNlc01lc3NhZ2UoKSksIGUuZ2V0Q2F1c2UoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlmIChwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGdldENsYXNzKCkuZ2V0TmFtZSgpICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiOiB0aHJvdyBvcmlnaW5hbCBleGNlcHRpb24gYWZ0ZXIgcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudCgNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLCB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAiOiBvcmlnaW5hbCBleGNlcHRpb24gYWZ0ZXIgcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICAvL292ZXJyaWRlIGlmIG5lZWRlZA0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uLCB0aGlzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YThjZmUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmlydHVhbFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLQ0KLS8qKg0KLSAqIHRvIG1hcCBjb25zdHJhaW50cyBkaXJlY3RseSB0byBhIG1ldGEtZGF0YSB0cmFuc2Zvcm1lciBpZiB0aGVyZSBpcyBubyB2YWxpZGF0aW9uIHN0cmF0ZWd5IChyZXF1aXJlZCBieSBqc3IgMzAzKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInRoaXMgaXMganVzdCBhbiBhZGFwdGVyIGUuZy4gZm9yIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbiIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjM2Q1OTAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogaXQgaXNuJ3QgbGlua2VkIHRvIGpzciAzMDMNCi0gKg0KLSAqIGl0J3MganVzdCBhIGhlbHBlciBmb3IgcHJveGllcyAtIHlvdSBqdXN0IG5lZWQgaXQsIGlmIHlvdSBkZWZpbmUgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0Lg0KLQ0KLSAqIGFkYXB0ZXIgdG8gY29ubmVjdCB2YWxpZGF0aW9uIHN0cmF0ZWdpZXMgd2l0aCBtZXRhLWRhdGEgdHJhbnNmb3JtZXJzLA0KLSAqIGlmIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIGRlZmluZWQgYXMgYmVhbiBhbmQgZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGludGVyZmFjZSBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlciBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgLy90byBnZXQgYmFjayB0aGUgaW50ZXJuYWwgY2FzaGluZw0KLSAgICBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKCk7DQotDQotICAgIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMxMTZmMi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBpdCBpc24ndCBsaW5rZWQgdG8ganNyIDMwMw0KLSAqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotDQotICogYWRhcHRlciB0byBjb25uZWN0IHZhbGlkYXRpb24gc3RyYXRlZ2llcyB3aXRoIG1ldGEtZGF0YSB0cmFuc2Zvcm1lcnMsDQotICogaWYgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgZGVmaW5lZCBhcyBiZWFuIGFuZCBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIC8vb3B0aW9uYWwgZmFsbGJhY2sgZm9yIGludGVybmFsIGNhc2hpbmcNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOw0KLQ0KLSAgICBwdWJsaWMgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyIGluc3RhbmNlb2YgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIpIG1ldGFEYXRhVHJhbnNmb3JtZXIgKS5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGdldE1ldGFEYXRhVHJhbnNmb3JtZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVRyYW5zZm9ybWVyKE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyID0gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsaWRhdGlvblN0cmF0ZWd5ID0gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTBhMTFkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyDQotICAgIC5Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotDQotLyoqDQotICogRmFjdG9yeSB3aGljaCBjcmVhdGVzIHRoZSBWYWxpZGF0aW9uU3RyYXRlZ3kgZm9yIGEgZ2l2ZW4gTWV0YS1EYXRhIEtleQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8U3RyaW5nPg0KLSAgICAgICAgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFN0cmluZywgVmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4oKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGNyZWF0ZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIGlmIChtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRTdGF0aWNNYXBwaW5ncygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nLmNvbnRhaW5zS2V5KG1ldGFEYXRhS2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5SW5zdGFuY2UobWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcuZ2V0KG1ldGFEYXRhS2V5KSk7DQotICAgICAgICB9DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgU3RyaW5nIHN0cmF0ZWd5TmFtZTsNCi0gICAgICAgIC8vbnVsbCAtPiB1c2UgbmFtZSBtYXBwZXJzDQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8U3RyaW5nPiBuYW1lTWFwcGVyIDogbmFtZU1hcHBlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RyYXRlZ3lOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKG1ldGFEYXRhS2V5KTsNCi0NCi0gICAgICAgICAgICBpZiAoc3RyYXRlZ3lOYW1lID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5SW5zdGFuY2Uoc3RyYXRlZ3lOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKG1ldGFEYXRhS2V5LCBzdHJhdGVneU5hbWUpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZQ0KLSAgICAgICAgICAgIC5zdGFydHNXaXRoKEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLlBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFZhbGlkYXRpb25TdHJhdGVneSkgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKHZhbGlkYXRpb25TdHJhdGVneU5hbWUNCi0gICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuUFJFRklYX0ZPUl9CRUFOX01BUFBJTkcubGVuZ3RoKCkpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFZhbGlkYXRpb25TdHJhdGVneSkgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgbWV0YURhdGFLZXksIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImFkZGluZyBtZXRhLWRhdGEga2V5IHRvIHZhbGlkYXRpb24gc3RyYXRlZ3kgbWFwcGluZzogIg0KLSAgICAgICAgICAgICAgICArIG1ldGFEYXRhS2V5ICsgIiAtPiAiICsgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZy5wdXQobWV0YURhdGFLZXksIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbml0U3RhdGljTWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgLy9zZXR1cCBpbnRlcm5hbCBzdGF0aWMgbWFwcGluZ3MNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnIDoNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgPSBuZXcgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAvL3RyeSB0byBzZXR1cCBtYXBwaW5nIHdpdGggYmFzZSBuYW1lIGJ5IGNvbnZlbnRpb24gLSBvdmVycmlkZXMgZGVmYXVsdCBtYXBwaW5nDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2J1aWxkIGNvbnZlbnRpb24gKHN0cmF0ZWd5IG1hcHBpbmcpDQotICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZyhFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFKSk7DQotDQotICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotDQotICAgICAgICAvL3NldHVwIGN1c3RvbSBtYXBwaW5nIC0gb3ZlcnJpZGVzIGFsbCBvdGhlciBtYXBwaW5ncw0KLSAgICAgICAgU3RyaW5nIGN1c3RvbU1hcHBpbmdCYXNlTmFtZSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORzsNCi0gICAgICAgIGlmIChjdXN0b21NYXBwaW5nQmFzZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHN0YXRpY0NvbmZpZyA9IG5ldyBTdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZyhjdXN0b21NYXBwaW5nQmFzZU5hbWUpOw0KLSAgICAgICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cFN0cmF0ZWd5TWFwcGluZ3MoTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhtYXBwaW5nLmdldFNvdXJjZSgpLCBtYXBwaW5nLmdldFRhcmdldCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+IGdldE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZU1hcHBlckxpc3Q7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0lkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0lkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjNhMmFiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9JZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBpZiBhbiBhZGFwdGVyIGlzIHVzZWQgZm9yIHNldmVyYWwgY29uc3RyYWludHMsIHRoaXMgaW50ZXJmYWNlIGFsbG93cyB0byBpZGVudGlmeSBpbnN0YW5jZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBTdHJpbmcgSURfUFJFRklYID0gIjoiOw0KLQ0KLSAgICBTdHJpbmcgZ2V0SWQoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTU1MjNkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBCYXNlIGludGVyZmFjZSBmb3IgVmFsaWRhdGlvblN0cmF0ZWdpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLS8vKlZhbGlkYXRpb25TdHJhdGVneSBpbnN0ZWFkIG9mICpWYWxpZGF0b3IgdG8gYXZvaWQgbmFtaW5nIGNvbmZ1c2lvbiANCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWIzZjBkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGQ5NGY3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOw0KLQ0KLS8qKg0KLSAqIE5hbWUgTWFwcGVyIHdoaWNoIGRlbGVnYXRlcyB0aGUgbmFtZSBtYXBwaW5nLCBleHRyYWN0IHRoZSBuYW1lIGFuZCBjb252ZXJ0IGl0IHRvIGEgYmVhbiBuYW1lICsgcHJlZml4DQotICogdGFyZ2V0OiBjb25maWd1cmUgYSB2YWxpZGF0aW9uIHN0cmF0ZWd5IHZpYSBhIG1hbmFnZWQgYmVhbiBmYWNpbGl0eSAtPiBhbGxvd3MgdG8gaW5qZWN0IG90aGVyIGJlYW5zDQotICogaW5zdGVhZCBvZiBhcGkgY2FsbHMgKyBoYXJkY29kZWQgYmVhbiBuYW1lcw0KLSAqIDxwLz4NCi0gKiBhbGxvd2VkIGJlYW4gc2NvcGVzOg0KLSAqIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIHN0YXRlbGVzczogYXBwbGljYXRpb24vc2luZ2xldG9uDQotICogdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgc3RhdGVmdWw6IG5vbmUvcHJvdG90eXBlDQotICogZG9uJ3QgdXNlIHRoZSBzZXNzaW9uIG9yIGEgY29udmVyc2F0aW9uIHNjb3BlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDUwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HID0gImJlYW46IjsNCi0gICAgcHJpdmF0ZSBOYW1lTWFwcGVyPFN0cmluZz4gd3JhcHBlZDsNCi0NCi0gICAgcHVibGljIEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKE5hbWVNYXBwZXI8U3RyaW5nPiBuYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSBuYW1lTWFwcGVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbmFtZSA9IHdyYXBwZWQuY3JlYXRlTmFtZShzb3VyY2UpOw0KLQ0KLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKTsNCi0gICAgICAgIHJldHVybiBQUkVGSVhfRk9SX0JFQU5fTUFQUElORyArIEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUobmFtZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDAzMjA2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgQW5ub3RhdGlvbnMgdG8gVmFsaWRhdGlvblN0cmF0ZWdpZXMuDQotICogKGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZTgzMDIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIEFubm90YXRpb25zIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzM4ZDhmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBtYXBzIEV4dFZhbCBBbm5vdGF0aW9ucyB0byBFeHRWYWwgVmFsaWRhdGlvblN0cmF0ZWdpZXMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUobWV0YURhdGFLZXkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzODIwNTMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIHRvIHBsYWNlIEFubm90YXRpb25zIGFuZCBWYWxpZGF0aW9uU3RyYXRlZ2llcyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcig0MDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5ICsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Qcmlvcml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTFhYTMzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGVudW0gUHJpb3JpdHkKLXsKLSAgICBCTE9DS0lORywKLSAgICBISUdILAotICAgIE1FRElVTSwKLSAgICBMT1cKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Ub0RvLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Ub0RvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMjVhMGEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVG9Eby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkNPTlNUUlVDVE9SOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxELCBDT05TVFJVQ1RPUn0pCi1wdWJsaWMgQGludGVyZmFjZSBUb0RvCi17Ci0gICAgUHJpb3JpdHkgdmFsdWUoKTsKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24oKSBkZWZhdWx0ICIiOwotCi0gICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgQGludGVyZmFjZSBMaXN0Ci0gICAgewotICAgICAgICBUb0RvW10gdmFsdWUoKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VDYXRlZ29yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VDYXRlZ29yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDdiMzg1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbDsKLQotLyoqCi0gKiBBUEk6PGJyLz4KLSAqIHBhcnRzIHlvdSBtaWdodCBuZWVkIGZvciBjdXN0b20gaW1wbGVtZW50YXRpb25zIGFuZCB3aGljaCBhcmUgcXVpdGUgc3RhYmxlIGluIHZpZXcgb2YgY2hhbmdlcwotICogPHAvPgotICogSU5URVJOQUw6PGJyLz4KLSAqIGlmIHlvdSB0aGluayBhYm91dCByZWZlcmVuY2luZyBhbiBhcnRpZmFjdCB3aGljaCBpcyBtYXJrZWQgYXMgaW50ZXJuYWwsIGFzayBmb3Igc3VwcG9ydC4KLSAqIHRoZXJlIHNob3VsZCBiZSBhIGJldHRlciBzb2x1dGlvbgotICogPHAvPgotICogQ1VTVE9NSVpBQkxFOjxici8+Ci0gKiBhIHBsYW5uZWQgZXh0ZW5zaW9uIHBvaW50IHdoaWNoIGNvbnRhaW5zIGxvZ2ljIHRvIGN1c3RvbWl6ZSB0aGUgZnJhbWV3b3JrLgotICogaWYgaXQgaXNuJ3QgYWxzbyBtYXJrZWQgYXMgQVBJIGl0IG1pZ2h0IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuCi0gKiBob3dldmVyLCB3ZSB0cnkgdG8ga2VlcCBpdCBhcyBzdGFibGUgYXMgcG9zc2libGUgYW5kIHJlYXNvbmFibGUuCi0gKiA8cC8+Ci0gKiBSRVVTRTo8YnIvPgotICogYW4gYXJ0aWZhY3Qgd2hpY2ggeW91IGNhbiByZXVzZSBmb3IgYSBjdXN0b20gaW1wbGVtZW50YXRpb24uCi0gKiBpZiBpdCBpc24ndCBtYXJrZWQgYXMgQVBJIGl0IG1pZ2h0IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuCi0gKiBob3dldmVyLCB3ZSB0cnkgdG8ga2VlcCBpdCBhcyBzdGFibGUgYXMgcG9zc2libGUgYW5kIHJlYXNvbmFibGUuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGVudW0gVXNhZ2VDYXRlZ29yeQotewotICAgIEFQSSwKLSAgICBJTlRFUk5BTCwKLSAgICBDVVNUT01JWkFCTEUsCi0gICAgUkVVU0UKLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlSW5mb3JtYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlSW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzN2ViYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogaXQncyBhbiBpbnRlcm5hbCBhbm5vdGF0aW9uIHRvIHByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBjb25jZXJuaW5nIHVzYWdlLWNhdGVnb3JpZXMKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeQotICovCi1AVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLXB1YmxpYyBAaW50ZXJmYWNlIFVzYWdlSW5mb3JtYXRpb24KLXsKLSAgICBVc2FnZUNhdGVnb3J5W10gdmFsdWUoKTsKLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZTIwNTYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDbGFzc1V0aWxzDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coQ2xhc3NVdGlscy5jbGFzcyk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgdHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbG9hZENsYXNzRm9yTmFtZShuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgbG9hZENsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gVHJ5IFdlYkFwcCBDbGFzc0xvYWRlciBmaXJzdA0KLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKG5hbWUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXANCi0gICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gZmFsbGJhY2s6IFRyeSBDbGFzc0xvYWRlciBmb3IgQ2xhc3NVdGlscyAoaS5lLiB0aGUgbXlmYWNlcy5qYXIgbGliKQ0KLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKG5hbWUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXANCi0gICAgICAgICAgICAgICAgQ2xhc3NVdGlscy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIDxUPiBUIHRyeVRvSW5zdGFudGlhdGVDbGFzcyhDbGFzczxUPiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRhcmdldENsYXNzLm5ld0luc3RhbmNlKCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoU3RyaW5nIGNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGluc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKFN0cmluZyBjbGFzc05hbWUpDQotICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXR1cm4gbG9hZENsYXNzRm9yTmFtZShjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SmFyVmVyc2lvbihDbGFzcyB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGNsYXNzRmlsZVBhdGggPSB0YXJnZXRDbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkucmVwbGFjZSgnLicsICcvJykgKyAiLmNsYXNzIjsNCi0gICAgICAgIFN0cmluZyBtYW5pZmVzdEZpbGVQYXRoID0gIi9NRVRBLUlORi9NQU5JRkVTVC5NRiI7DQotDQotICAgICAgICBTdHJpbmcgY2xhc3NMb2NhdGlvbiA9IHRhcmdldENsYXNzLmdldFJlc291cmNlKHRhcmdldENsYXNzLmdldFNpbXBsZU5hbWUoKSArICIuY2xhc3MiKS50b1N0cmluZygpOw0KLSAgICAgICAgU3RyaW5nIG1hbmlmZXN0RmlsZUxvY2F0aW9uID0gY2xhc3NMb2NhdGlvbg0KLSAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIGNsYXNzTG9jYXRpb24uaW5kZXhPZihjbGFzc0ZpbGVQYXRoKSAtIDEpICsgbWFuaWZlc3RGaWxlUGF0aDsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTWFuaWZlc3QobmV3IFVSTChtYW5pZmVzdEZpbGVMb2NhdGlvbikub3BlblN0cmVhbSgpKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldE1haW5BdHRyaWJ1dGVzKCkuZ2V0VmFsdWUoQXR0cmlidXRlcy5OYW1lLklNUExFTUVOVEFUSU9OX1ZFUlNJT04pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChMT0cuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIExPRy50cmFjZSgiY291bGRuJ3QgbG9hZCB2ZXJzaW9uIG9mIGphciBmaWxlIHdoaWNoIGNvbnRhaW5zICIgKyB0YXJnZXRDbGFzcy5nZXROYW1lKCksIHQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0RlZmF1bHRQcm9qZWN0TmFtZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9EZWZhdWx0UHJvamVjdE5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkNjM5OS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0RlZmF1bHRQcm9qZWN0TmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlByb2plY3RTdGFnZU5hbWU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRQcm9qZWN0TmFtZSBpbXBsZW1lbnRzIFByb2plY3RTdGFnZU5hbWUNCi17DQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkNCi0gICAgcHJpdmF0ZSBEZWZhdWx0UHJvamVjdE5hbWUoKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm5hbWUgPSBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgRGVmYXVsdFByb2plY3ROYW1lKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOw0KLSAgICB9DQotDQotICAgIHN0YXRpYyBQcm9qZWN0U3RhZ2VOYW1lIGNyZWF0ZVByb2plY3RTdGFnZU5hbWUoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFByb2plY3ROYW1lKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm5hbWU7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKHRoaXMgPT0gbykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBEZWZhdWx0UHJvamVjdE5hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIERlZmF1bHRQcm9qZWN0TmFtZSB0aGF0ID0gKERlZmF1bHRQcm9qZWN0TmFtZSkgbzsNCi0NCi0gICAgICAgIGlmICghbmFtZS5lcXVhbHModGhhdC5uYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuYW1lLmhhc2hDb2RlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxVdGlscy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmVlM2RhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlZhbGlkYXRpb25Nb2R1bGVLZXk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlByb2plY3RTdGFnZU5hbWU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkFic3RyYWN0RUxIZWxwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5FTEhlbHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY2VzTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5Lk5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLkNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkZhY2VzTWVzc2FnZVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsVXRpbHMNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0dHRVIgPSBMb2dGYWN0b3J5LmdldExvZyhFeHRWYWxVdGlscy5jbGFzcyk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19SRVFVSVJFRCA9ICJqYXZheC5mYWNlcy5jb21wb25lbnQuVUlJbnB1dC5SRVFVSVJFRCI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19SRVFVSVJFRF9ERVRBSUwgPSAiamF2YXguZmFjZXMuY29tcG9uZW50LlVJSW5wdXQuUkVRVUlSRURfZGV0YWlsIjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX01BWElNVU0gPSAiamF2YXguZmFjZXMudmFsaWRhdG9yLkxlbmd0aFZhbGlkYXRvci5NQVhJTVVNIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX01BWElNVU1fREVUQUlMID0gImphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3IuTUFYSU1VTV9kZXRhaWwiOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKENsYXNzTWFwcGluZ0ZhY3Rvcnk8U3RyaW5nLCBWYWxpZGF0aW9uU3RyYXRlZ3k+KSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlKG1ldGFEYXRhS2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICBOYW1lTWFwcGVyPFN0cmluZz4gbWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAucmVnaXN0ZXIobWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVyZWdpc3RlcihtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVueU1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlbnkobWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1ldGFEYXRhVHJhbnNmb3JtZXI+KSBFeHRWYWxDb250ZXh0DQotICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAucmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlcmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZXJlZ2lzdGVyKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbnlWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZW55KHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksIENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JXaXRoKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlV2l0aChwcm9wZXJ0aWVzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50V2l0aE1ldGFEYXRhKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgZm9yIChDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldENvbXBvbmVudEluaXRpYWxpemVycygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyLmNvbmZpZ3VyZUNvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7DQotDQotICAgICAgICBpZiAobWV0YURhdGFFbnRyeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGFEYXRhRW50cnkgPSBuZXcgTWV0YURhdGFFbnRyeSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZm9yIChWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIDogRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIXZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5hZnRlclRocm93aW5nKA0KLSAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uLCB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3IoZmluYWwgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcmVhdGVJbnRlcmNlcHRlZE1ldGFEYXRhRXh0cmFjdG9yV2l0aChtZXRhRGF0YUV4dHJhY3RvciwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGVJbnRlcmNlcHRlZE1ldGFEYXRhRXh0cmFjdG9yRm9yKA0KLSAgICAgICAgICAgIGZpbmFsIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yLCBDbGFzcyBtb2R1bGVLZXkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgaWYobW9kdWxlS2V5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCksIG1vZHVsZUtleSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvcldpdGgobWV0YURhdGFFeHRyYWN0b3IsIHByb3BlcnRpZXMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvcldpdGgoDQotICAgICAgICAgICAgZmluYWwgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IsIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBNZXRhRGF0YUV4dHJhY3RvcigpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHVibGljIFByb3BlcnR5SW5mb3JtYXRpb24gZXh0cmFjdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBPYmplY3Qgb2JqZWN0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiByZXN1bHQgPSBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgb2JqZWN0KTsNCi0NCi0gICAgICAgICAgICAgICAgYWRkUHJvcGVydGllcyhyZXN1bHQsIHByb3BlcnRpZXMpOw0KLSAgICAgICAgICAgICAgICBpbnZva2VNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMocmVzdWx0LCBwcm9wZXJ0aWVzKTsNCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkUHJvcGVydGllcyhQcm9wZXJ0eUluZm9ybWF0aW9uIHJlc3VsdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICBpZihwcm9wZXJ0aWVzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjdXN0b21Qcm9wZXJ0aWVzID0gZ2V0Q3VzdG9tUHJvcGVydGllcyhyZXN1bHQpOw0KLSAgICAgICAgICAgIGN1c3RvbVByb3BlcnRpZXMucHV0QWxsKHByb3BlcnRpZXMpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0Q3VzdG9tUHJvcGVydGllcyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKCFwcm9wZXJ0eUluZm9ybWF0aW9uLmNvbnRhaW5zSW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuQ1VTVE9NX1BST1BFUlRJRVMpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uc2V0SW5mb3JtYXRpb24oDQotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5DVVNUT01fUFJPUEVSVElFUywgbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChNYXA8U3RyaW5nLCBPYmplY3Q+KSBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkNVU1RPTV9QUk9QRVJUSUVTKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGludm9rZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyhQcm9wZXJ0eUluZm9ybWF0aW9uIHJlc3VsdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICBmb3IgKE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIDoNCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzV2l0aChwcm9wZXJ0aWVzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5hZnRlckV4dHJhY3RpbmcocmVzdWx0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VSZXNvbHZlciBnZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1lc3NhZ2VSZXNvbHZlcj4pIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLnJlZ2lzdGVyKHZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVyZWdpc3Rlcih2YWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbnlWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IHZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlbnkodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRUxIZWxwZXIgZ2V0RUxIZWxwZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5FTF9IRUxQRVJfRkFDVE9SWSwgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuY2xhc3MpLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjZXNNZXNzYWdlIGNyZWF0ZUZhY2VzTWVzc2FnZShTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZUZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBGYWNlc01lc3NhZ2UgY3JlYXRlRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkZBQ0VTX01FU1NBR0VfRkFDVE9SWSwgRmFjZXNNZXNzYWdlRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZShzZXZlcml0eSwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY2VzTWVzc2FnZSBjb252ZXJ0RmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkZBQ0VTX01FU1NBR0VfRkFDVE9SWSwgRmFjZXNNZXNzYWdlRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNvbnZlcnQoZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5RGV0YWlscyBjcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldEV4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBiYXNlT2JqZWN0Ow0KLSAgICAgICAgaWYgKGdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKHRhcmdldEV4cHJlc3Npb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmJlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgU3RyaW5nIGV4cHJlc3Npb24gPSB2YmUuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgICAgIGJhc2VPYmplY3QgPSBnZXRFTEhlbHBlcigpLmdldFZhbHVlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgdmJlLmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlEZXRhaWxzKA0KLSAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5zdWJzdHJpbmcoMiwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpLCBiYXNlT2JqZWN0LCB2YmUuZ2V0UHJvcGVydHkoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgb3JpZ2luYWwgPSBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KA0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgU3RyaW5nIG5ld0Jhc2VLZXkgPSBvcmlnaW5hbC5nZXRLZXkoKS5zdWJzdHJpbmcoMCwgb3JpZ2luYWwuZ2V0S2V5KCkubGFzdEluZGV4T2YoIi4iKSArIDEpOw0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IG5ld0Jhc2VLZXkgKyB0YXJnZXRFeHByZXNzaW9uOw0KLQ0KLSAgICAgICAgYmFzZU9iamVjdCA9IFJlZmxlY3Rpb25VdGlscy5nZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKG9yaWdpbmFsLmdldEJhc2VPYmplY3QoKSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICAgICAgbmV3S2V5LCBiYXNlT2JqZWN0LCB0YXJnZXRFeHByZXNzaW9uLnN1YnN0cmluZyh0YXJnZXRFeHByZXNzaW9uLmxhc3RJbmRleE9mKCIuIikgKyAxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEV4cHJlc3Npb24ubGVuZ3RoKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBAVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9QbGFjZUxhYmVsKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIFN0cmluZyBsYWJlbCwgaW50IGluZGV4KQ0KLSAgICB7DQotICAgICAgICBpZiAoZmFjZXNNZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsICYmIGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkuY29udGFpbnMoInsiICsgaW5kZXggKyAifSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkucmVwbGFjZSgieyIgKyBpbmRleCArICJ9IiwgbGFiZWwpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkuY29udGFpbnMoInsiICsgaW5kZXggKyAifSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNNZXNzYWdlLmdldERldGFpbCgpLnJlcGxhY2UoInsiICsgaW5kZXggKyAifSIsIGxhYmVsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VXaXRoRGVmYXVsdE1heGltdW1NZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIGludCBtYXhMZW5ndGgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZSA9IEpzZlV0aWxzLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKEpBVkFYX0ZBQ0VTX01BWElNVU0pOw0KLSAgICAgICAgU3RyaW5nIGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsID0gZmFjZXNSZXF1aXJlZE1lc3NhZ2U7DQotDQotICAgICAgICAvL3VzZSB0cnkvY2F0Y2ggZm9yIGVhc2llciBzeW5jIGJldHdlZW4gdHJ1bmsvYnJhbmNoDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoSnNmVXRpbHMuZ2V0TWVzc2FnZUZyb21BcHBsaWNhdGlvbk1lc3NhZ2VCdW5kbGUoSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IEpzZlV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKEpBVkFYX0ZBQ0VTX01BWElNVU1fREVUQUlMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2pzZiAxLjIgZG9lc24ndCBoYXZlIGEgZGV0YWlsIG1lc3NhZ2UNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZhY2VzUmVxdWlyZWRNZXNzYWdlID0gZmFjZXNSZXF1aXJlZE1lc3NhZ2UucmVwbGFjZSgiezB9IiwgIiIgKyBtYXhMZW5ndGgpOw0KLSAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbC5yZXBsYWNlKCJ7MH0iLCAiIiArIG1heExlbmd0aCk7DQotDQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc1JlcXVpcmVkTWVzc2FnZSk7DQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBAVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZSA9IEpzZlV0aWxzLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKEpBVkFYX0ZBQ0VTX1JFUVVJUkVEKTsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlOw0KLQ0KLSAgICAgICAgLy91c2UgdHJ5L2NhdGNoIGZvciBlYXNpZXIgc3luYyBiZXR3ZWVuIHRydW5rL2JyYW5jaA0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKEpzZlV0aWxzLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKEpBVkFYX0ZBQ0VTX1JFUVVJUkVEX0RFVEFJTCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsID0gSnNmVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZUZyb21BcHBsaWNhdGlvbk1lc3NhZ2VCdW5kbGUoSkFWQVhfRkFDRVNfUkVRVUlSRURfREVUQUlMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2pzZiAxLjIgZG9lc24ndCBoYXZlIGEgZGV0YWlsIG1lc3NhZ2UNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGZhY2VzUmVxdWlyZWRNZXNzYWdlKTsNCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NraXBhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBmb3IgKENsYXNzIGN1cnJlbnRDbGFzcyA6IGdldFNraXBWYWxpZGF0aW9uU3VwcG9ydENsYXNzTGlzdCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChpc1NraXBWYWxpZGF0aW9uU3VwcG9ydGVkKGN1cnJlbnRDbGFzcywgdGFyZ2V0Q2xhc3MpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9jZXNzTWV0YURhdGFFbnRyeUFmdGVyU2tpcFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdGFyZ2V0Q2xhc3MsIE1ldGFEYXRhRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBpc1NraXBhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KHRhcmdldENsYXNzKSAmJg0KLSAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlNLSVBfVkFMSURBVElPTiwgQm9vbGVhbi5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxDbGFzcz4gZ2V0U2tpcFZhbGlkYXRpb25TdXBwb3J0Q2xhc3NMaXN0KCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gc3RhdGljQ29uZmlndXJhdGlvbkxpc3QgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0U3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuU0tJUF9WQUxJREFUSU9OX1NVUFBPUlRfQ09ORklHKTsNCi0NCi0gICAgICAgIExpc3Q8Q2xhc3M+IG1hcmtlckxpc3QgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLQ0KLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzOw0KLSAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBjdXJyZW50RW50cnkgOiBzdGF0aWNDb25maWd1cmF0aW9uTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gY3VycmVudENvbmZpZ3VyYXRpb25FbnRyeSA6IGN1cnJlbnRFbnRyeS5nZXRNYXBwaW5nKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShjdXJyZW50Q29uZmlndXJhdGlvbkVudHJ5LmdldFRhcmdldCgpKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDbGFzcyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBtYXJrZXJMaXN0LmFkZChjdXJyZW50Q2xhc3MpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLndhcm4oImNvbmZpZ3VyYXRpb24gZW50cnkgcHJvdmlkZXMgYW4gaW52YWxpZCBlbnRyeTogIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjdXJyZW50Q29uZmlndXJhdGlvbkVudHJ5LmdldFRhcmdldCgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBtYXJrZXJMaXN0Ow0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NraXBWYWxpZGF0aW9uU3VwcG9ydGVkKENsYXNzIGN1cnJlbnRDbGFzcywgQ2xhc3MgdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIGlmIChjdXJyZW50Q2xhc3MuaXNBbm5vdGF0aW9uKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHRhcmdldENsYXNzLmlzQW5ub3RhdGlvblByZXNlbnQoY3VycmVudENsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoY3VycmVudENsYXNzLmlzQXNzaWduYWJsZUZyb20odGFyZ2V0Q2xhc3MpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBnZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkNCi0gICAgew0KLSAgICAgICAgaWYoaXNWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdGlvbkRlYWN0aXZhdGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkgew0KLQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNoTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PigpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgPFQ+IExpc3Q8VD4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8VD4oKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgPFQ+IFQgZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKS5nZXRGYWN0b3J5KA0KLSAgICAgICAgICAgICAgICBGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlksIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBDbGFzcyBnZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoQ2xhc3Mgc291cmNlKQ0KLSAgICB7DQotICAgICAgICAgQ2xhc3NNYXBwaW5nRmFjdG9yeTxDbGFzcywgQ2xhc3M+IHZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcyk7DQotDQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnkuY3JlYXRlKHNvdXJjZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0aW9uRGVhY3RpdmF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfVkFMSURBVElPTl9QQVJBTUVURVJTKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXhlY3V0ZUxvY2FsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5S2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcHJvcGVydGllcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPSBnZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkuZXh0cmFjdCgNCi0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbiwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKTsNCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsNCi0NCi0gICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KHByb3BlcnR5S2V5LCBwcm9wZXJ0aWVzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHByb3BlcnR5TWFwLnB1dChBbm5vdGF0aW9uLmNsYXNzLmdldE5hbWUoKSwgYW5ub3RhdGlvbik7DQotDQotICAgICAgICBmb3IgKFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIDogcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3INCi0gICAgICAgICAgICAgICAgICAgIC5iZWZvcmVWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlNYXApKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZXhlY3V0ZUxvY2FsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlLZXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHByb3BlcnRpZXMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPSBnZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkuZXh0cmFjdCgNCi0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbiwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KHByb3BlcnR5S2V5LCBwcm9wZXJ0aWVzKTsNCi0gICAgICAgICAgICBwcm9wZXJ0eU1hcC5wdXQoQW5ub3RhdGlvbi5jbGFzcy5nZXROYW1lKCksIGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZm9yIChQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA6IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5hZnRlclZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eU1hcCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImlzIHJlbmFtaW5nIG9rPyIpDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGVjdXRlR2xvYmFsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5S2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHByb3BlcnRpZXMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBtb2R1bGVLZXkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydHlNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsNCi0NCi0gICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KHByb3BlcnR5S2V5LCBwcm9wZXJ0aWVzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycyA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc0Zvcihtb2R1bGVLZXkpOw0KLQ0KLSAgICAgICAgZm9yIChQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA6IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIXByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgICAgICAgICAgICAgICAgICAuYmVmb3JlVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHByb3BlcnR5TWFwKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImlzIHJlbmFtaW5nIG9rPyIpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBleGVjdXRlR2xvYmFsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlLZXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwcm9wZXJ0aWVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBtb2R1bGVLZXkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydHlNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KHByb3BlcnR5S2V5LCBwcm9wZXJ0aWVzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycyA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc0Zvcihtb2R1bGVLZXkpOw0KLQ0KLSAgICAgICAgZm9yIChQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA6IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5hZnRlclZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eU1hcCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyA8VD4gVCBnZXRTdG9yYWdlKENsYXNzPFQ+IHN0b3JhZ2VUeXBlLCBTdHJpbmcgc3RvcmFnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoVCkgZ2V0U3RvcmFnZU1hbmFnZXJGYWN0b3J5KCkuY3JlYXRlKHN0b3JhZ2VUeXBlKS5jcmVhdGUoc3RvcmFnZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldFN0b3JhZ2UoQ2xhc3Mgc3RvcmFnZVR5cGUsIFN0cmluZyBzdG9yYWdlTmFtZSkNCi0gICAgew0KLSAgICAgICAgZ2V0U3RvcmFnZU1hbmFnZXJGYWN0b3J5KCkuY3JlYXRlKHN0b3JhZ2VUeXBlKS5yZXNldChzdG9yYWdlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxDbGFzcywgU3RvcmFnZU1hbmFnZXI+IGdldFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0VHJhbnNmb3JtZWRNZXRhRGF0YShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFRyYW5zZm9ybWVkTWV0YURhdGFGb3IoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFRyYW5zZm9ybWVkTWV0YURhdGFGb3IoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIENsYXNzIG1vZHVsZUtleSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBpZihtb2R1bGVLZXkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzLmdldE5hbWUoKSwgbW9kdWxlS2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBnZXRUcmFuc2Zvcm1lZE1ldGFEYXRhV2l0aChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBwcm9wZXJ0aWVzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0VHJhbnNmb3JtZWRNZXRhRGF0YVdpdGgoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi0gICAgICAgIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKTsNCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JXaXRoKHByb3BlcnRpZXMpOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YTsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGFSZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IG1ldGFEYXRhRXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCkuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWV0YURhdGEgPSB0cmFuc2Zvcm1NZXRhRGF0YSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uU3RyYXRlZ3ksIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLCBtZXRhRGF0YSwgZW50cnkpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoIWlzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Ta2lwcGVkKG1ldGFEYXRhLCBlbnRyeSwgdmFsaWRhdGlvblN0cmF0ZWd5KSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgLy9kb24ndCBicmVhayBtYXliZSB0aGVyZSBhcmUgY29uc3RyYWludHMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCB0aGUgc2tpcC1tZWNoYW5pc20NCi0gICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhUmVzdWx0LnB1dEFsbChtZXRhRGF0YSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWV0YURhdGFSZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpcFZhbGlkYXRpb25FdmFsdWF0b3Igc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSwgTWV0YURhdGFFbnRyeSBlbnRyeSkNCi0gICAgew0KLSAgICAgICAgaWYgKCFza2lwVmFsaWRhdGlvbkV2YWx1YXRvci5za2lwVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uU3RyYXRlZ3ksIGVudHJ5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSk7DQotDQotICAgICAgICAgICAgaWYgKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmRlYnVnKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbWV0YURhdGFUcmFuc2Zvcm1lci5jb252ZXJ0TWV0YURhdGEoZW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtZXRhRGF0YTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Ta2lwcGVkKE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEsIE1ldGFEYXRhRW50cnkgZW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhLmlzRW1wdHkoKSB8fA0KLSAgICAgICAgICAgICAgICAoQm9vbGVhbi5UUlVFLmVxdWFscyhlbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5TS0lQX1ZBTElEQVRJT04sIEJvb2xlYW4uY2xhc3MpKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlzU2tpcGFibGVWYWxpZGF0aW9uU3RyYXRlZ3koUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcygNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MpKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGludGVycHJldEVtcHR5U3RyaW5nVmFsdWVzQXNOdWxsKCkNCi0gICAgew0KLSAgICAgICAgLy90byBkZWFjdGl2YXRlOiB0aGUgcGFyYW1ldGVyIGhhcyB0byBiZSBleHBsaWNpdGx5IGZhbHNlDQotICAgICAgICByZXR1cm4gISJmYWxzZSIuZXF1YWxzSWdub3JlQ2FzZShXZWJYbWxQYXJhbWV0ZXIuSU5URVJQUkVUX0VNUFRZX1NUUklOR19TVUJNSVRURURfVkFMVUVTX0FTX05VTEwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZUVtcHR5RmllbGRzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICEiZmFsc2UiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLlZBTElEQVRFX0VNUFRZX0ZJRUxEUyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eURldGFpbHMgZ2V0UHJvcGVydHlEZXRhaWxzKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudElkKA0KLSAgICAgICAgICAgIFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkNCi0gICAgew0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gZmluZENvbXBvbmVudChjbGllbnRJZCk7DQotDQotICAgICAgICB0cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50KHRhcmdldENvbXBvbmVudCwgZmFjZXNNZXNzYWdlLCB0aHJvd2FibGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50KA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKQ0KLSAgICB7DQotICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGludGVycHJldGVyID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIGlmIChpbnRlcnByZXRlci5zZXZlcml0eUNhdXNlc1ZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBmYWNlc01lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHRocm93YWJsZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKGZhY2VzTWVzc2FnZSwgdGhyb3dhYmxlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50KHVpQ29tcG9uZW50LCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb0FkZFZpb2xhdGlvbk1lc3NhZ2VGb3JDb21wb25lbnRJZChTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IGZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgaWYgKHRhcmdldENvbXBvbmVudCA9PSBudWxsICYmIGNsaWVudElkICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yVGVzdENsaWVudElkKGNsaWVudElkLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIHRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudCh0YXJnZXRDb21wb25lbnQsIGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInJlcXVpcmVkIGZvciB0ZXN0IGZyYW1ld29ya3MgLSBnb2FsOiByZW1vdmUgaXQiKQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvclRlc3RDbGllbnRJZChTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgaWYgKGludGVycHJldGVyLnNldmVyaXR5Q2F1c2VzVmlvbGF0aW9uTWVzc2FnZShmYWNlc0NvbnRleHQsIG51bGwsIGZhY2VzTWVzc2FnZS5nZXRTZXZlcml0eSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRGYWNlc01lc3NhZ2UoY2xpZW50SWQsIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICB9DQotICAgICAgICB0cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnQobnVsbCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGludGVycHJldGVyID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIGlmIChpbnRlcnByZXRlci5zZXZlcml0eUNhdXNlc1Zpb2xhdGlvbk1lc3NhZ2UoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh1aUNvbXBvbmVudCAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkRmFjZXNNZXNzYWdlKHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCksIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFkZEZhY2VzTWVzc2FnZShudWxsLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHRyeVRvQmxvY2tzTmF2aWdhdGlvbkZvckNvbXBvbmVudCh1aUNvbXBvbmVudCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIGFkZEZhY2VzTWVzc2FnZShudWxsLCBmYWNlc01lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGYWNlc01lc3NhZ2UoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2VTdG9yYWdlIHN0b3JhZ2UgPSBnZXRTdG9yYWdlKEZhY2VzTWVzc2FnZVN0b3JhZ2UuY2xhc3MsIEZhY2VzTWVzc2FnZVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGlmIChzdG9yYWdlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RvcmFnZS5hZGRGYWNlc01lc3NhZ2UoY2xpZW50SWQsIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmFkZE1lc3NhZ2UoY2xpZW50SWQsIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvQmxvY2tzTmF2aWdhdGlvbkZvckNvbXBvbmVudElkKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gZmluZENvbXBvbmVudChjbGllbnRJZCk7DQotDQotICAgICAgICB0cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnQodGFyZ2V0Q29tcG9uZW50LCBmYWNlc01lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgaWYgKGludGVycHJldGVyLnNldmVyaXR5QmxvY2tzTmF2aWdhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBmYWNlc01lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLnJlbmRlclJlc3BvbnNlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNldmVyaXR5QmxvY2tzU3VibWl0Rm9yQ29tcG9uZW50SWQoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGludGVycHJldGVyID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IGZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGludGVycHJldGVyLnNldmVyaXR5QmxvY2tzU3VibWl0KGZhY2VzQ29udGV4dCwgdGFyZ2V0Q29tcG9uZW50LCBmYWNlc01lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSk7DQotICAgIH0NCi0NCi0gICAgLy9hdmFpbGFibGUgZm9yIGFkZC1vbnMgLSBub3QgdXNlZCBpbnRlcm5hbGx5IGR1ZSB0byBwZXJmb3JtYW5jZSByZWFzb25zDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXZlcml0eVNob3dzSW5kaWNhdGlvbkZvckNvbXBvbmVudElkKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBpbnRlcnByZXRlciA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBVSUNvbXBvbmVudCB0YXJnZXRDb21wb25lbnQgPSBmaW5kQ29tcG9uZW50KGNsaWVudElkKTsNCi0NCi0gICAgICAgIHJldHVybiBpbnRlcnByZXRlci5zZXZlcml0eVNob3dzSW5kaWNhdGlvbihmYWNlc0NvbnRleHQsIHRhcmdldENvbXBvbmVudCwgZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFVJQ29tcG9uZW50IGZpbmRDb21wb25lbnQoU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICBVSUNvbXBvbmVudCB0YXJnZXRDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKGNsaWVudElkICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0Q29tcG9uZW50ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZmluZENvbXBvbmVudChjbGllbnRJZCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdGFyZ2V0Q29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgY29tcG9uZW50IGluaXRpYWxpemF0aW9uIGZvciByZXF1aXJlZCB2YWxpZGF0aW9uIGlzIGFjdGl2YXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvbkFjdGl2ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBCb29sZWFuLlRSVUUuZXF1YWxzKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KCJtb2RlOmluaXQ6cmVxdWlyZWQiKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIG5lZWRlZCBmb3Igc29tZSBjb21wb25lbnQgbGlicyAtIGlmIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIGlzIHVzZWQgZS5nLiBmb3IgdmlzdWFsIGluZGljYXRvcnMNCi0gICAgICogYnV0IGZlYXR1cmVzIGxpa2Ugc2V2ZXJpdHkgYXdhcmUgdmFsaWRhdGlvbiBhcmVuJ3QgdXNlZC4NCi0gICAgICogaW4gc3VjaCBhIGNhc2UgaXQncyBwb3NzaWJsZSB0byB1c2UgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZS4NCi0gICAgICogDQotICAgICAqIEByZXR1cm4gZmFsc2UgdG8gZGVhY3RpdmF0ZSB0aGUgZmluYWwgcmVzZXQgb2YgdGhlIHZhbHVlIG9mIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGUNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlcXVpcmVkUmVzZXRBY3RpdmF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFLmVxdWFscyhFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eSgibW9kZTpyZXNldDpyZXF1aXJlZCIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFByb2plY3RTdGFnZU5hbWUgZ2V0RGVmYXVsdFN0YWdlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcmVhdGVQcm9qZWN0U3RhZ2VOYW1lKCJQcm9kdWN0aW9uIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0U3RhZ2VOYW1lIGNyZWF0ZVByb2plY3RTdGFnZU5hbWUoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBEZWZhdWx0UHJvamVjdE5hbWUuY3JlYXRlUHJvamVjdFN0YWdlTmFtZShuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRWYWxEZWFjdGl2YXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShTeXN0ZW0NCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsNCi0gICAgICAgICAgICAgICAgICAgICIuREVBQ1RJVkFURV9BTEwiLCAiZmFsc2UiKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Hcm91cFV0aWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0dyb3VwVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwOTI4MS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0dyb3VwVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgR3JvdXBVdGlscw0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R3JvdXBLZXkoU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY2xpZW50SWQgPT0gbnVsbCA/IHZpZXdJZCA6IHZpZXdJZCArICJAIiArIGNsaWVudElkOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvSnNmVXRpbHMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvSnNmVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3NmVjYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0pzZlV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZTsNCi1pbXBvcnQgamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZUZhY3Rvcnk7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOw0KLQ0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpzZlV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3RlclBoYXNlTGlzdGVuZXIoUGhhc2VMaXN0ZW5lciBwaGFzZUxpc3RlbmVyKQ0KLSAgICB7DQotICAgICAgICBMaWZlY3ljbGVGYWN0b3J5IGxpZmVjeWNsZUZhY3RvcnkgPSAoTGlmZWN5Y2xlRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRmFjdG9yeUZpbmRlci5MSUZFQ1lDTEVfRkFDVE9SWSk7DQotDQotICAgICAgICBTdHJpbmcgY3VycmVudElkOw0KLSAgICAgICAgTGlmZWN5Y2xlIGN1cnJlbnRMaWZlY3ljbGU7DQotICAgICAgICBJdGVyYXRvciBsaWZlY3ljbGVJZHMgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZUlkcygpOw0KLSAgICAgICAgd2hpbGUgKGxpZmVjeWNsZUlkcy5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudElkID0gKFN0cmluZykgbGlmZWN5Y2xlSWRzLm5leHQoKTsNCi0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlID0gbGlmZWN5Y2xlRmFjdG9yeS5nZXRMaWZlY3ljbGUoY3VycmVudElkKTsNCi0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlLnJlbW92ZVBoYXNlTGlzdGVuZXIocGhhc2VMaXN0ZW5lcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyUGhhc2VMaXN0ZW5lcihQaGFzZUxpc3RlbmVyIHBoYXNlTGlzdGVuZXIpDQotICAgIHsNCi0gICAgICAgIExpZmVjeWNsZUZhY3RvcnkgbGlmZWN5Y2xlRmFjdG9yeSA9IChMaWZlY3ljbGVGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShGYWN0b3J5RmluZGVyLkxJRkVDWUNMRV9GQUNUT1JZKTsNCi0NCi0gICAgICAgIFN0cmluZyBjdXJyZW50SWQ7DQotICAgICAgICBMaWZlY3ljbGUgY3VycmVudExpZmVjeWNsZTsNCi0gICAgICAgIEl0ZXJhdG9yIGxpZmVjeWNsZUlkcyA9IGxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlSWRzKCk7DQotICAgICAgICB3aGlsZSAobGlmZWN5Y2xlSWRzLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50SWQgPSAoU3RyaW5nKSBsaWZlY3ljbGVJZHMubmV4dCgpOw0KLSAgICAgICAgICAgIGN1cnJlbnRMaWZlY3ljbGUgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZShjdXJyZW50SWQpOw0KLSAgICAgICAgICAgIGN1cnJlbnRMaWZlY3ljbGUuYWRkUGhhc2VMaXN0ZW5lcihwaGFzZUxpc3RlbmVyKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShGYWNlc01lc3NhZ2UuRkFDRVNfTUVTU0FHRVMsIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldEN1c3RvbUZhY2VzTWVzc2FnZUJ1bmRsZSgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBTdHJpbmcgYnVuZGxlTmFtZSA9IGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmdldE1lc3NhZ2VCdW5kbGUoKTsNCi0NCi0gICAgICAgIGlmIChidW5kbGVOYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGJ1bmRsZU5hbWUsIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZShTdHJpbmcgbWVzc2FnZUtleSkNCi0gICAgew0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgY3VzdG9tUmVzb3VyY2VCdW5kbGUgPSBnZXRDdXN0b21GYWNlc01lc3NhZ2VCdW5kbGUoKTsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChjdXN0b21SZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbVJlc291cmNlQnVuZGxlLmdldFN0cmluZyhtZXNzYWdlS2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9ubyBjdXN0b20gbWVzc2FnZSBpcyBhdmFpbGFibGUgLSBkbyBub3RoaW5nDQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhtZXNzYWdlS2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZW5kZXJSZXNwb25zZVBoYXNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuUkVOREVSX1JFU1BPTlNFLmVxdWFscyhnZXRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZSgpLmdldEN1cnJlbnRQaGFzZUlkKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUGhhc2VJZCBnZXRDdXJyZW50UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZSgpLmdldEN1cnJlbnRQaGFzZUlkKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHNpbXBsZSB0ZXN0IGZvciBlYXJseSBjb25maWcgaW4gY2FzZSBvZiBtb2phcnJhDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUganNmIGltcGwuIGlzIGluaXRpYWxpemVkIGFuZCBpdCdzIHBvc3NpYmxlIHRvIHVzZSBpdCBhcyBleHBlY3RlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXBwbGljYXRpb25Jbml0aWFsaXplZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuc3RhcnRzV2l0aCgib3JnLmFwYWNoZS5teWZhY2VzIikgfHwNCi0gICAgICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKSAhPSBudWxsICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgIUZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkuaXNFbXB0eSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlIGdldEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MsIEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Qcm94eVV0aWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Byb3h5VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc1YzIzZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Byb3h5VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5Qcm94eUhlbHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHkuRGVmYXVsdFByb3h5SGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQcm94eVV0aWxzDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBQcm94eUhlbHBlciBwcm94eUhlbHBlcjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyA8VD4gQ2xhc3M8VD4gZ2V0VW5wcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzLCBDbGFzczxUPiB0YXJnZXRUeXBlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UHJveHlIZWxwZXIoKS5nZXRVbnByb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MsIHRhcmdldFR5cGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0VW5wcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UHJveHlIZWxwZXIoKS5nZXRVbnByb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsYXNzTmFtZShDbGFzcyBwcm94aWVkQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRQcm94eUhlbHBlcigpLmdldE5hbWVPZkNsYXNzKHByb3hpZWRDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lT2ZPYmplY3QoT2JqZWN0IHByb3hpZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRQcm94eUhlbHBlcigpLmdldENsYXNzTmFtZU9mT2JqZWN0KHByb3hpZWRPYmplY3QpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb3hpZWRDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRQcm94eUhlbHBlcigpLmlzUHJveGllZENsYXNzKGN1cnJlbnRDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJveGllZE9iamVjdChPYmplY3QgcHJveGllZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFByb3h5SGVscGVyKCkuaXNQcm94aWVkT2JqZWN0KHByb3hpZWRPYmplY3QpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFByb3h5SGVscGVyIGdldFByb3h5SGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYgKHByb3h5SGVscGVyID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy93b3JrYXJvdW5kIGZvciBtb2phcnJhDQotICAgICAgICAgICAgaWYoIUpzZlV0aWxzLmlzQXBwbGljYXRpb25Jbml0aWFsaXplZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UHJveHlIZWxwZXIoKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHJveHlIZWxwZXIgPSBjcmVhdGVQcm94eUhlbHBlcigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHByb3h5SGVscGVyOw0KLSAgICB9DQotDQotICAgIC8vZG9uJ3QgdXNlIHRoZSBkZWZhdWx0IGFwcHJvYWNoIChmYWN0b3J5IGZpbmRlcikgLSBQcm94eUhlbHBlciBpcyBjYWxsZWQgdG9vIG9mdGVuLi4uDQotICAgIHByaXZhdGUgc3RhdGljIFByb3h5SGVscGVyIGNyZWF0ZVByb3h5SGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1c3RvbVByb3h5SGVscGVyQ2xhc3NOYW1lID0gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9QUk9YWV9IRUxQRVI7DQotDQotICAgICAgICBQcm94eUhlbHBlciByZXN1bHQgPSBudWxsOw0KLSAgICAgICAgaWYoY3VzdG9tUHJveHlIZWxwZXJDbGFzc05hbWUgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKGN1c3RvbVByb3h5SGVscGVyQ2xhc3NOYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSAoUHJveHlIZWxwZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGN1c3RvbVByb3h5SGVscGVyQ2xhc3NOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBEZWZhdWx0UHJveHlIZWxwZXIoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9SZWZsZWN0aW9uVXRpbHMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMDYyYmYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9SZWZsZWN0aW9uVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFJlZmxlY3Rpb25VdGlscwotewotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIHRyeVRvR2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0TWV0aG9kTmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0dldE1ldGhvZCh0YXJnZXRDbGFzcywgdGFyZ2V0TWV0aG9kTmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgdHJ5VG9HZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lLCBDbGFzcy4uLiBwYXJhbWV0ZXJUeXBlcykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0TWV0aG9kKHRhcmdldENsYXNzLCB0YXJnZXRNZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0TWV0aG9kTmFtZSkKLSAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldE1ldGhvZCh0YXJnZXRDbGFzcywgdGFyZ2V0TWV0aG9kTmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0TWV0aG9kTmFtZSwgQ2xhc3MuLi4gcGFyYW1ldGVyVHlwZXMpCi0gICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IHRhcmdldENsYXNzOwotICAgICAgICBNZXRob2QgdGFyZ2V0TWV0aG9kID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlICghT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY3VycmVudENsYXNzLmdldE5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IGN1cnJlbnRDbGFzcy5nZXREZWNsYXJlZE1ldGhvZCh0YXJnZXRNZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudENsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKENsYXNzIGN1cnJlbnRJbnRlcmZhY2UgOiB0YXJnZXRDbGFzcy5nZXRJbnRlcmZhY2VzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudEludGVyZmFjZTsKLQotICAgICAgICAgICAgICAgIHdoaWxlIChjdXJyZW50Q2xhc3MgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNZXRob2QgPSBjdXJyZW50Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QodGFyZ2V0TWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGFyZ2V0TWV0aG9kICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0YXJnZXRNZXRob2Q7Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKCJ0aGVyZSBpcyBubyBtZXRob2Qgd2l0aCB0aGUgbmFtZSAnIiArIHRhcmdldE1ldGhvZE5hbWUgKyAiJyIgKwotICAgICAgICAgICAgICAgICIgY2xhc3M6ICIgKyB0YXJnZXRDbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ5VG9JbnZva2VNZXRob2QodGFyZ2V0LCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ5VG9JbnZva2VNZXRob2RPZkNsYXNzKHRhcmdldCwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbnZva2VNZXRob2RPZkNsYXNzKHRhcmdldCwgbWV0aG9kLCBhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0Lm5ld0luc3RhbmNlKCksIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdC4uLiBhcmdzKQotICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQubmV3SW5zdGFuY2UoKSwgbWV0aG9kLCBhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kLCBPYmplY3QuLi4gYXJncykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldCwgbWV0aG9kLCBhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0LCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kLCBPYmplY3QuLi4gYXJncykKLSAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICByZXR1cm4gbWV0aG9kLmludm9rZSh0YXJnZXQsIGFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEJhc2VPZlByb3BlcnR5Q2hhaW4oT2JqZWN0IGJhc2VPYmplY3QsIFN0cmluZyBwcm9wZXJ0eUNoYWluKQotICAgIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocHJvcGVydHlDaGFpbiwgIi4iKTsKLQotICAgICAgICBPYmplY3QgY3VycmVudEJhc2UgPSBiYXNlT2JqZWN0OwotICAgICAgICBTdHJpbmcgY3VycmVudFByb3BlcnR5OwotICAgICAgICBNZXRob2QgY3VycmVudE1ldGhvZDsKLQotICAgICAgICB3aGlsZSh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjdXJyZW50UHJvcGVydHkgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0KLSAgICAgICAgICAgIC8vaWdub3JlIHRoZSBsYXN0IHByb3BlcnR5Ci0gICAgICAgICAgICBpZighdG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9ubyBpcyAtIGl0J3Mgb25seSBwb3NzaWJsZSBhdCBwcm9wZXJ0aWVzIG5vdCBhdCBiZWFuIGxldmVsCi0gICAgICAgICAgICBjdXJyZW50TWV0aG9kID0gdHJ5VG9HZXRNZXRob2QoUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhjdXJyZW50QmFzZS5nZXRDbGFzcygpKSwKLSAgICAgICAgICAgICAgICAiZ2V0IiArIGN1cnJlbnRQcm9wZXJ0eS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eS5zdWJzdHJpbmcoMSwgY3VycmVudFByb3BlcnR5Lmxlbmd0aCgpKSk7Ci0gICAgICAgICAgICBjdXJyZW50QmFzZSA9IHRyeVRvSW52b2tlTWV0aG9kKGN1cnJlbnRCYXNlLCBjdXJyZW50TWV0aG9kKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjdXJyZW50QmFzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1dlYlhtbFV0aWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1dlYlhtbFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMDc2OWMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBXZWJYbWxVdGlscw0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW5pdFBhcmFtZXRlcihTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0SW5pdFBhcmFtZXRlcihFeHRWYWxJbmZvcm1hdGlvbi5XRUJYTUxfUEFSQU1fUFJFRklYLCBrZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEluaXRQYXJhbWV0ZXIoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwYXJhbWV0ZXJOYW1lID0gbmFtZTsNCi0gICAgICAgIGlmKHByZWZpeCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHBhcmFtZXRlck5hbWUgPSBwcmVmaXggKyAiLiIgKyBuYW1lOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldEluaXRQYXJhbWV0ZXIocGFyYW1ldGVyTmFtZSk7DQotICAgICAgICByZXR1cm4gKHZhbHVlICE9IG51bGwpID8gdmFsdWUucmVwbGFjZSgiICIsICIiKS50cmltKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2NvcmUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyMDFkMi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUgTW9kdWxlDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUgTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSBNb2R1bGUgcHJvdmlkZXMgYW4gZXh0ZW5zaWJsZSB2YWxpZGF0aW9uIHBsYXRmb3JtIHRvIGltcGxlbWVudCB2YWxpZGF0aW9uIGJhc2VkIG9uIG1ldGEtZGF0YS4NCi0gICAgQmFzZWQgb24gdGhpcyBtb2R1bGUgaXQgaXMgcG9zc2libGUgdG8gaW1wbGVtZW50IHZhbGlkYXRpb24gbW9kdWxlcy4NCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEuMS54IGFuZCBKU0YgMS4yLnguIEJvdGggdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9hc3NlbWJseS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjU2NmZhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9hc3NlbWJseS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBFeGFtcGxlcyBBc3NlbWJseTwvbmFtZT4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZXhhbXBsZXMtYXNzZW1ibHkxMjwvYXJ0aWZhY3RJZD4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5kZXBlbmRlbmN5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LXdhcjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd2FyPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktc3JjPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fd29ybGQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXZhLXNvdXJjZTwvdHlwZT4gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmVhdHVyZS1zZXRfMDE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXZhLXNvdXJjZTwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc3JjPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPiAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBFWEVDVVRFIG12biBwYWNrYWdlIHRvIGdlbmVyYXRlIGFzc2VtYmx5IGZpbGVzIC0tPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9zcmM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmFzc2VtYmx5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4gICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwtZXhhbXBsZXMtJHtwcm9qZWN0LnZlcnNpb259LXNyYzwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfYmluPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hc3NlbWJseTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0JICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+ICAgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWw8L2Rlc2NyaXB0b3I+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsLWV4YW1wbGVzLSR7cHJvamVjdC52ZXJzaW9ufTwvZmluYWxOYW1lPgotCSAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd29yazwvd29ya0RpcmVjdG9yeT4KLQkgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0JICAgIAotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+d2Fnb24tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aWQ+bXlmYWNlcy1uaWdodGx5LWJ1aWxkczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vbWlub3RhdXIuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvYnVpbGRzL215ZmFjZXMvbmlnaHRseTwvdXJsPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9pbnB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICA8L3BsdWdpbnM+Ci0KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGY3YjgxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+YmluPC9pZD4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+CQotICA8ZmlsZVNldHM+ICAgIAotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvd2FyPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLndhcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PiAgICAgCi0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU3MGNjYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPnNyYzwvaWQ+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgkKLSAgPGZpbGVTZXRzPiAgICAKLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3NyYzwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLnR4dDwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDViM2E1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5YmRiMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE0MTRjYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmVhdHVyZS1zZXRfMDE8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgZmVhdHVyZS1zZXQgMDE8L25hbWU+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5mYWNlbGV0czwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtZmFjZWxldHM8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE0PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8IS0tDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIC0tPg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRvbWFoYXdrPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRvbWFoYXdrPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS42PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jdXN0b20vdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDAxZGY3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jdXN0b20vdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLSMgdGhpcyBtZXNzYWdlIGJ1bmRsZSBpcyBwaWNrZWQgdXAgdmlhIGNvbnZlbnRpb24NCi1yZXBlYXRlZF9wYXNzd29yZF9yZXF1aXJlZD1wbGVhc2UgcmV0eXBlIHRoZSBwYXNzd29yZA0KLXJlcGVhdGVkX3Bhc3N3b3JkX3JlcXVpcmVkX2RldGFpbD1wbGVhc2UgcmV0eXBlIHRoZSBwYXNzd29yZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2RvbWFpbi9QZXJzb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2RvbWFpbi9QZXJzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI1MTFkZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJc1R5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLk5vdEVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlRlbXBvcmFsOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbFR5cGU7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLXB1YmxpYyBjbGFzcyBQZXJzb24NCi17DQotICAgIEBMZW5ndGgobWluaW11bSA9IDIpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMjApDQotICAgIEBOb3RFcXVhbHMoImxhc3ROYW1lIikNCi0gICAgQFBhdHRlcm4oIltBLVpdW2Etel0rIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOw0KLQ0KLSAgICBAUmVxdWlyZWQocGFyYW1ldGVycyA9IERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykNCi0gICAgQExlbmd0aChtaW5pbXVtID0gMiwgcGFyYW1ldGVycyA9IERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykNCi0gICAgQENvbHVtbihsZW5ndGggPSAyMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7DQotDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwKQ0KLSAgICBwcml2YXRlIFN0cmluZyByb2xlID0gInVzZXIiOw0KLQ0KLSAgICBARGF0ZUlzKHR5cGUgPSBEYXRlSXNUeXBlLmJlZm9yZSwgdmFsdWVPZiA9ICJmaW5hbEV4YW0iKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIEBUZW1wb3JhbChUZW1wb3JhbFR5cGUuREFURSkNCi0gICAgcHJpdmF0ZSBEYXRlIGJpcnRoZGF5Ow0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIEBUZW1wb3JhbChUZW1wb3JhbFR5cGUuREFURSkNCi0gICAgcHJpdmF0ZSBEYXRlIGZpbmFsRXhhbTsNCi0NCi0gICAgQExlbmd0aChtaW5pbXVtID0gMikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmlja05hbWU7DQotDQotICAgIEBMZW5ndGgobWluaW11bSA9IDYpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gNjApDQotICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIHByaXZhdGUgaW50IG51bWJlck9mU2libGluZ3M7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByb2xlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFJvbGUoU3RyaW5nIHJvbGUpDQotICAgIHsNCi0gICAgICAgIHRoaXMucm9sZSA9IHJvbGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0QmlydGhkYXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmlydGhkYXk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0QmlydGhkYXkoRGF0ZSBiaXJ0aGRheSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5iaXJ0aGRheSA9IGJpcnRoZGF5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldEZpbmFsRXhhbSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmaW5hbEV4YW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RmluYWxFeGFtKERhdGUgZmluYWxFeGFtKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpbmFsRXhhbSA9IGZpbmFsRXhhbTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5pY2tOYW1lKFN0cmluZyBuaWNrTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uaWNrTmFtZSA9IG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNpYmxpbmdzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG51bWJlck9mU2libGluZ3M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyT2ZTaWJsaW5ncyhpbnQgbnVtYmVyT2ZTaWJsaW5ncykNCi0gICAgew0KLSAgICAgICAgdGhpcy5udW1iZXJPZlNpYmxpbmdzID0gbnVtYmVyT2ZTaWJsaW5nczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI3NDQyMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmd1aS5iZWFuczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluLlBlcnNvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5Ob3RFcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTG9uZ1JhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmN1c3RvbS5lbWFpbHZhbGlkYXRvci5FbWFpbFZhbGlkYXRvcjsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uUGFnZQ0KLXsNCi0NCi0gICAgLy90aGUgb2xkIHBhc3N3b3JkIG9mIHRoZSBwZXJzb24gaXNuJ3QgdXNlZCB3aXRoaW4gdGhlIHBhZ2UNCi0gICAgLy8tPiB2YWxpZGF0ZSB3aXRoIHZhbHVlIG9mIHRoZSBtb2RlbA0KLSAgICBAU2tpcFZhbGlkYXRpb24oIiN7cGVyc29uLnJvbGUgZXEgJ2FkbWluJ30iKQ0KLSAgICBAUmVxdWlyZWQNCi0gICAgQEVxdWFscygicGVyc29uLnBhc3N3b3JkIikNCi0gICAgQE5vdEVxdWFscygicGFzc3dvcmQiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBvbGRQYXNzd29yZDsNCi0NCi0gICAgQEVxdWFscygicGFzc3dvcmRSZXBlYXRlZCIpDQotICAgIC8vY29tYmluZSBndWkgcmVsYXRlZCBhbm5vdGF0aW9ucyB3aXRoIHRoZSBhbm5vYXRpb25zIG9mIHRoZSBkb21haW4gbW9kZWwNCi0gICAgQEpvaW5WYWxpZGF0aW9uKHZhbHVlID0gIiN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ucGFzc3dvcmR9IikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7DQotDQotICAgIEBSZXF1aXJlZCh2YWxpZGF0aW9uRXJyb3JNc2dLZXkgPSAicmVwZWF0ZWRfcGFzc3dvcmRfcmVxdWlyZWQiLA0KLSAgICAgICAgICAgIHBhcmFtZXRlcnMgPSB7RGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLCBWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzfSkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmRSZXBlYXRlZDsNCi0NCi0gICAgLy91c2UgI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5uaWNrTmFtZX0sICN7cGVyc29uLm5pY2tOYW1lfQ0KLSAgICAvL3VzZSByZWdpc3RyYXRpb25QYWdlIHRvIGRpc3BsYXkgdGhlIHNlY29uZCBlcnJvciBtZXNzYWdlIGF0IG9sZCBuaWNrbmFtZQ0KLSAgICAvL29yIGxvY2FsIHByb3BlcnR5IGNoYWluaW5nICh0byBhdm9pZCB0aGUgdXNhZ2Ugb2YgdGhlIGJlYW4gbmFtZSkgLSBsaWtlOg0KLSAgICBAU2tpcFZhbGlkYXRpb24oIiN7cGVyc29uLnJvbGUgZXEgJ2FkbWluJ30iKQ0KLSAgICBATm90RXF1YWxzKCJwZXJzb24ubmlja05hbWUiKQ0KLSAgICBASm9pblZhbGlkYXRpb24oInBlcnNvbi5uaWNrTmFtZSIpDQotICAgIHByaXZhdGUgU3RyaW5nIG5ld05pY2tOYW1lOw0KLQ0KLSAgICBwcml2YXRlIFBlcnNvbiBwZXJzb247DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZmluaXNoKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0UGFzc3dvcmQodGhpcy5wYXNzd29yZCk7DQotICAgICAgICByZXR1cm4gImhvbWUiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgdXBkYXRlTmlja05hbWUoKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXROaWNrTmFtZSh0aGlzLm5ld05pY2tOYW1lKTsNCi0gICAgICAgIHJldHVybiAiaG9tZSI7DQotICAgIH0NCi0NCi0gICAgLy9qdXN0IGEgcXVpY2sgaWxsdXN0cmF0aW9uIG9mIHNraXBWYWxpZGF0aW9uDQotICAgIHB1YmxpYyBTdHJpbmcgc3dpdGNoTW9kZSgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50Um9sZSA9IHRoaXMucGVyc29uLmdldFJvbGUoKTsNCi0NCi0gICAgICAgIGlmKGN1cnJlbnRSb2xlLmVxdWFscygiYWRtaW4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnBlcnNvbi5zZXRSb2xlKCJ1c2VyIik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5wZXJzb24uc2V0Um9sZSgiYWRtaW4iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAiIjsNCi0gICAgfQ0KLQ0KLSAgICBASm9pblZhbGlkYXRpb24oIm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb246ZW1haWwiKQ0KLSAgICBAVmFsaWRhdG9yKEVtYWlsVmFsaWRhdG9yLmNsYXNzKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uLmdldEVtYWlsKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXRFbWFpbChlbWFpbCk7DQotICAgIH0NCi0NCi0gICAgQEpvaW5WYWxpZGF0aW9uKCIje3BlcnNvbi5udW1iZXJPZlNpYmxpbmdzfSIpDQotICAgIEBMb25nUmFuZ2UobWF4aW11bSA9IDIwKQ0KLSAgICBwdWJsaWMgaW50IGdldE51bWJlck9mU2libGluZ3MoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5wZXJzb24uZ2V0TnVtYmVyT2ZTaWJsaW5ncygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlck9mU2libGluZ3MoaW50IG51bWJlck9mU2libGluZ3MpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldE51bWJlck9mU2libGluZ3MobnVtYmVyT2ZTaWJsaW5ncyk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9sZFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG9sZFBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE9sZFBhc3N3b3JkKFN0cmluZyBvbGRQYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5vbGRQYXNzd29yZCA9IG9sZFBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZFJlcGVhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkUmVwZWF0ZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRSZXBlYXRlZChTdHJpbmcgcGFzc3dvcmRSZXBlYXRlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZFJlcGVhdGVkID0gcGFzc3dvcmRSZXBlYXRlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwZXJzb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbiBwZXJzb24pDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uID0gcGVyc29uOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmV3Tmlja05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3Tmlja05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TmV3Tmlja05hbWUoU3RyaW5nIG5ld05pY2tOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm5ld05pY2tOYW1lID0gbmV3Tmlja05hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MThkNjYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCIKLSAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4KLSAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgIDwhLS0gdHJpbmlkYWQgLS0+Ci0gICAgICAgIDxkZWZhdWx0LXJlbmRlci1raXQtaWQ+Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29yZQotICAgICAgICA8L2RlZmF1bHQtcmVuZGVyLWtpdC1pZD4KLQotICAgIDwvYXBwbGljYXRpb24+Ci0KLSAgICA8bWFuYWdlZC1iZWFuPgotICAgICAgICA8bWFuYWdlZC1iZWFuLW5hbWU+cmVnaXN0cmF0aW9uUGFnZTwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZ3VpLmJlYW5zLlJlZ2lzdHJhdGlvblBhZ2U8L21hbmFnZWQtYmVhbi1jbGFzcz4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0KLSAgICAgICAgPG1hbmFnZWQtcHJvcGVydHk+Ci0gICAgICAgICAgICA8cHJvcGVydHktbmFtZT5wZXJzb248L3Byb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8dmFsdWU+I3twZXJzb259PC92YWx1ZT4KLSAgICAgICAgPC9tYW5hZ2VkLXByb3BlcnR5PgotICAgIDwvbWFuYWdlZC1iZWFuPgotCi0gICAgPG1hbmFnZWQtYmVhbj4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1uYW1lPnBlcnNvbjwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluLlBlcnNvbjwvbWFuYWdlZC1iZWFuLWNsYXNzPgotICAgICAgICA8bWFuYWdlZC1iZWFuLXNjb3BlPnNlc3Npb248L21hbmFnZWQtYmVhbi1zY29wZT4KLSAgICA8L21hbmFnZWQtYmVhbj4KLQotICAgIDxuYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgICAgIDxmcm9tLXZpZXctaWQ+L3BhZ2VzL2hvbWUueGh0bWw8L2Zyb20tdmlldy1pZD4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+YWRkVXNlcjwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmNoYW5nZU5pY2tOYW1lPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+Y2hhbmdlUGFzc3dvcmQ8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgIDwvbmF2aWdhdGlvbi1ydWxlPgotICAgIDxuYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgICAgIDxmcm9tLXZpZXctaWQ+KjwvZnJvbS12aWV3LWlkPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5ob21lPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvaG9tZS54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgPC9uYXZpZ2F0aW9uLXJ1bGU+Ci08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzOTM2Ni4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgZmFjZWxldC10YWdsaWIgUFVCTElDCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRmFjZWxldCBUYWdsaWIgMS4wLy9FTiIKLSAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2ZhY2VsZXQtdGFnbGliXzFfMC5kdGQiPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlbGV0LXRhZ2xpYj4KLSAgICA8bmFtZXNwYWNlPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0dmFsL2RlbW8vY29tcG9uZW50czwvbmFtZXNwYWNlPgotCi0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPnVzZXJGb3JtPC90YWctbmFtZT4KLSAgICAgICAgPHNvdXJjZT4KLSAgICAgICAgICAgIC4uL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sCi0gICAgICAgIDwvc291cmNlPgotICAgIDwvdGFnPgotCi08L2ZhY2VsZXQtdGFnbGliPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YzAxYWEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLSAgICAgICAgIHZlcnNpb249IjIuNCI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+TXlQcm9qZWN0IHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkRFRkFVTFRfU1VGRklYPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+LnhodG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+ZmFjZWxldHMuTElCUkFSSUVTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L1dFQi1JTkYvbWFpbi50YWdsaWIueG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkVOQUJMRV9MSUdIVFdFSUdIVF9ESUFMT0dTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5ESVNBQkxFX0NPTlRFTlRfQ09NUFJFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkFMVEVSTkFURV9WSUVXX0hBTkRMRVI8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jb20uc3VuLmZhY2VsZXRzLkZhY2VsZXRWaWV3SGFuZGxlcjwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5VU0VfQVBQTElDQVRJT05fVklFV19DQUNIRTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkNIQU5HRV9QRVJTSVNURU5DRTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnNlc3Npb248L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+U3RhdGUgc2F2aW5nIG1ldGhvZDogImNsaWVudCIgb3IgInNlcnZlciIgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIFNlZSBKU0YgU3BlY2lmaWNhdGlvbiAyLjUuMwotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIGFtb3VudCAoZGVmYXVsdCA9IDIwKSBvZiB0aGUgbGF0ZXN0IHZpZXdzIGFyZSBzdG9yZWQgaW4gc2Vzc2lvbi4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLk5VTUJFUl9PRl9WSUVXU19JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpIGFuZCBpZgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OIGlzIHRydWUgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzZXJpYWxpemVkIHN0YXRlIHdpbGwgYmUgY29tcHJlc3NlZCBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBjb21wcmVzc2VkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcGFyYW1ldGVyIHRlbGxzIE15RmFjZXMgaWYgamF2YXNjcmlwdCBjb2RlIHNob3VsZCBiZSBhbGxvd2VkIGluIHRoZQotICAgICAgICAgICAgcmVuZGVyZWQgSFRNTCBvdXRwdXQuCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUKLSAgICAgICAgICAgIHRoYXQgc3VibWl0cyB0aGUgY29ycmVzcG9uZGluZyBmb3JtLgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBub3QgYWxsb3dlZCwgdGhlIHN0YXRlIHNhdmluZyBpbmZvIGFuZCBuZXN0ZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLgotICAgICAgICAgICAgaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90Ci0gICAgICAgICAgICBpbmZsdWVuY2UgdGhlIEhUTUwgY29kZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUFJFVFRZX0hUTUw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCBhIGphdmFzY3JpcHQgZnVuY3Rpb24gd2lsbCBiZSByZW5kZXJlZCB0aGF0IGlzIGFibGUgdG8gcmVzdG9yZSB0aGUKLSAgICAgICAgICAgIGZvcm1lciB2ZXJ0aWNhbCBzY3JvbGwgb24gZXZlcnkgcmVxdWVzdC4gQ29udmVuaWVudCBmZWF0dXJlIGlmIHlvdSBoYXZlIHBhZ2VzCi0gICAgICAgICAgICB3aXRoIGxvbmcgbGlzdHMgYW5kIHlvdSBkbyBub3Qgd2FudCB0aGUgYnJvd3NlciBwYWdlIHRvIGFsd2F5cyBqdW1wIHRvIHRoZSB0b3AKLSAgICAgICAgICAgIGlmIHlvdSB0cmlnZ2VyIGEgbGluayBvciBidXR0b24gYWN0aW9uIHRoYXQgc3RheXMgb24gdGhlIHNhbWUgcGFnZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJmYWxzZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFVVE9fU0NST0xMPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Vc2VkIGZvciBlbmNyeXB0aW5nIHZpZXcgc3RhdGUuIE9ubHkgcmVsZXZhbnQgZm9yIGNsaWVudCBzaWRlCi0gICAgICAgICAgICBzdGF0ZSBzYXZpbmcuIFNlZSBNeUZhY2VzIHdpa2kvd2ViIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRUNSRVQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWYWxpZGF0ZSBtYW5hZ2VkIGJlYW5zLCBuYXZpZ2F0aW9uIHJ1bGVzIGFuZCBlbnN1cmUgdGhhdCBmb3JtcyBhcmUgbm90IG5lc3RlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlZBTElEQVRFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPCEtLSBMaXN0ZW5lciwgdG8gYWxsb3cgSmV0dHkgc2VydmluZyBNeUZhY2VzIGFwcHMgLS0+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLndlYmFwcC5TdGFydHVwU2VydmxldENvbnRleHRMaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+Ci0gICAgPC9saXN0ZW5lcj4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCAtLT4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICAgIDwvc2VydmxldD4KLQotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPnJlc291cmNlczwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlJlc291cmNlU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8ZmlsdGVyPgotICAgICAgICA8ZmlsdGVyLW5hbWU+dHJpbmlkYWQ8L2ZpbHRlci1uYW1lPgotICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC53ZWJhcHAuVHJpbmlkYWRGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KLSAgICA8L2ZpbHRlcj4KLQotICAgIDxmaWx0ZXItbWFwcGluZz4KLSAgICAgICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgPC9maWx0ZXItbWFwcGluZz4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCBNYXBwaW5ncyAtLT4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9mYWNlcy8qPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+cmVzb3VyY2VzPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4vYWRmLyo8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPCEtLSBXZWxjb21lIGZpbGVzIC0tPgotICAgIDx3ZWxjb21lLWZpbGUtbGlzdD4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+Ci0gICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KLQotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYmM5MWMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyIKLSAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiCi0gICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIgotICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiCi0gICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+Ci0KLTx1aTpjb21wb3NpdGlvbj4KLSAgICA8dHI6cGFuZWxGb3JtTGF5b3V0PgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im5pY2sgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb25bICduaWNrTmFtZScgXX0iLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0iZS1tYWlsIiB2YWx1ZT0iI3tiZWFuLmVtYWlsfSIvPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9ImZpcnN0IG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uLmZpcnN0TmFtZX0iLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibGFzdCBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5sYXN0TmFtZX0iLz4KLSAgICAgICAgPCEtLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJsYXN0IG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uLmxhc3ROYW1lfSIgcmVxdWlyZWRNZXNzYWdlRGV0YWlsPSJ7MH0gaXMgcmVxdWlyZWQiLz4KLSAgICAgICAgLS0+Ci0gICAgICAgIDx0cjppbnB1dERhdGUgbGFiZWw9ImJpcnRoZGF5IiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5iaXJ0aGRheX0iPgotICAgICAgICAgICAgPHRyOmNvbnZlcnREYXRlVGltZSB0eXBlPSJkYXRlIiBwYXR0ZXJuPSJkZC5NTS55eXl5Ii8+Ci0gICAgICAgIDwvdHI6aW5wdXREYXRlPgotICAgICAgICA8dHI6aW5wdXREYXRlIGxhYmVsPSJmaW5hbCBleGFtIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5maW5hbEV4YW19Ij4KLSAgICAgICAgICAgIDx0cjpjb252ZXJ0RGF0ZVRpbWUgdHlwZT0iZGF0ZSIgcGF0dGVybj0iZGQuTU0ueXl5eSIvPgotICAgICAgICA8L3RyOmlucHV0RGF0ZT4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJudW1iZXIgb2Ygc2libGluZ3MiIHZhbHVlPSIje2JlYW4ubnVtYmVyT2ZTaWJsaW5nc30iLz4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJwYXNzd29yZCIgdmFsdWU9IiN7YmVhbi5wYXNzd29yZH0iIHNlY3JldD0idHJ1ZSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJyZS1lbnRlciBwYXNzd29yZCIgdmFsdWU9IiN7YmVhbi5wYXNzd29yZFJlcGVhdGVkfSIgc2VjcmV0PSJ0cnVlIi8+Ci0KLSAgICA8L3RyOnBhbmVsRm9ybUxheW91dD4KLTwvdWk6Y29tcG9zaXRpb24+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1Y2QxNDguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotICAgICAgICANCi08aHRtbD4NCi0NCi08aGVhZD4NCi0gICAgPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDsgVVJMPWZhY2VzL3BhZ2VzL2hvbWUueGh0bWwiPg0KLTwvaGVhZD4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBjMWVhOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTx0cjpkb2N1bWVudA0KLSAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIg0KLSAgICAgICAgeG1sbnM6Yz0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3RsL2NvcmUiPg0KLSAgICA8ZjpmYWNldCBuYW1lPSJtZXRhQ29udGFpbmVyIj4NCi0gICAgICAgIDx0aXRsZT5zZXYtZW4gZmVhdHVyZS1zZXQgZGVtbyAwMTwvdGl0bGU+DQotICAgIDwvZjpmYWNldD4NCi0NCi0gICAgPHRyaDpib2R5Pg0KLQ0KLSAgICAgICAgPCEtLSBvcmlnaW5hbCAtLT4NCi0gICAgICAgIDxkaXYgaWQ9IndyYXAiPg0KLQ0KLSAgICAgICAgICAgIDx0cjpmb3JtIGlkPSJmb3JtIiBkZWZhdWx0Q29tbWFuZD0iZGVmYXVsdEJ1dHRvbiI+DQotICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1haW4iPg0KLSAgICAgICAgICAgICAgICAgICAgPHVpOmluc2VydCBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ1bmRlcl9jb25zdHJ1Y3Rpb24iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+IXNpdGUgdW5kZXIgY29uc3RydWN0aW9uITwvaDI+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBjb250ZW50IG9mIHRoaXMgc2l0ZSBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSBtb21lbnQuPC9wPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC91aTppbnNlcnQ+DQotICAgICAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICAgIDwvdHI6Zm9ybT4NCi0gICAgICAgICAgICA8dHI6bWVzc2FnZXMgZ2xvYmFsT25seT0idHJ1ZSIvPg0KLQ0KLSAgICAgICAgPC9kaXY+DQotICAgIDwvdHJoOmJvZHk+DQotDQotDQotPC90cjpkb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODkzZmFlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDx0cjpwYW5lbEZvcm1MYXlvdXQ+DQotDQotICAgICAgICAgICAgPHVpOnJlbW92ZT4NCi0gICAgICAgICAgICAgICAganVzdCBmb3IgdGhlIGRlbW8gd2UgYXJlIHVzaW5nIHR3byBpbnB1dCBjb21wb25lbnRzDQotICAgICAgICAgICAgPC91aTpyZW1vdmU+DQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ib2xkIG5pY2sgbmFtZSIgcmVhZE9ubHk9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLm5pY2tOYW1lfSIvPg0KLQ0KLSAgICAgICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im5pY2sgbmFtZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5uZXdOaWNrTmFtZX0iLz4NCi0NCi0gICAgICAgIDwvdHI6cGFuZWxGb3JtTGF5b3V0Pg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UudXBkYXRlTmlja05hbWV9Ii8+DQotDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9wYXNzd29yZC54aHRtbCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTA5NzVhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDx0YWJsZT4NCi0gICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6b3V0cHV0TGFiZWwgdmFsdWU9Im9sZCBwYXNzd29yZCIgZm9yPSJvbGRfcGFzc3dvcmQiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOmlucHV0VGV4dCBpZD0ib2xkX3Bhc3N3b3JkIiBzaW1wbGU9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2Uub2xkUGFzc3dvcmR9IiBzZWNyZXQ9InRydWUiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm1lc3NhZ2UgZm9yPSJvbGRfcGFzc3dvcmQiLz48L3RkPg0KLSAgICAgICAgICAgIDwvdHI+DQotDQotICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm91dHB1dExhYmVsIHZhbHVlPSJuZXcgcGFzc3dvcmQiIGZvcj0ibmV3X3Bhc3N3b3JkIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjppbnB1dFRleHQgaWQ9Im5ld19wYXNzd29yZCIgc2ltcGxlPSJ0cnVlIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjptZXNzYWdlIGZvcj0ibmV3X3Bhc3N3b3JkIi8+PC90ZD4NCi0gICAgICAgICAgICA8L3RyPg0KLQ0KLSAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjpvdXRwdXRMYWJlbCB2YWx1ZT0icmUtZW50ZXIgcGFzc3dvcmQiIGZvcj0icmVlbnRlcmVkIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjppbnB1dFRleHQgaWQ9InJlZW50ZXJlZCIgc2ltcGxlPSJ0cnVlIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBhc3N3b3JkUmVwZWF0ZWR9IiBzZWNyZXQ9InRydWUiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm1lc3NhZ2UgZm9yPSJyZWVudGVyZWQiLz48L3RkPg0KLSAgICAgICAgICAgIDwvdHI+DQotDQotICAgICAgICA8L3RhYmxlPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UuZmluaXNofSIvPg0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTdlYmQ5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJhZGQgdXNlciIgYWN0aW9uPSJhZGRVc2VyIi8+PGJyLz4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9ImNoYW5nZSBuaWNrIG5hbWUiIGFjdGlvbj0iY2hhbmdlTmlja05hbWUiLz48YnIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0iY2hhbmdlIHBhc3N3b3JkIiBhY3Rpb249ImNoYW5nZVBhc3N3b3JkIi8+PGJyLz4NCi0gICAgICAgIDx0cjpjb21tYW5kTGluayB0ZXh0PSJtb2RlOiAje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLnJvbGV9Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2Uuc3dpdGNoTW9kZX0iIGltbWVkaWF0ZT0idHJ1ZSIvPg0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmNmIwNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6Yz0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHR2YWwvZGVtby9jb21wb25lbnRzIg0KLSAgICAgICAgPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgPGM6dXNlckZvcm0gYmVhbj0iI3tyZWdpc3RyYXRpb25QYWdlfSIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UuZmluaXNofSIvPg0KLQ0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMwODE1My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmVhdHVyZS1zZXRfMDI8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgZmVhdHVyZS1zZXQgMDI8L25hbWU+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGliZXJuYXRlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmhpYmVybmF0ZS12YWxpZGF0b3I8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+NC4wLjAuR0E8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuNC4yPC92ZXJzaW9uPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS40LjI8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmZhY2VsZXRzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzZi1mYWNlbGV0czwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMTQ8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDwhLS0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgLS0+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vY29uc3RyYWludHMvQmlydGhkYXkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2NvbnN0cmFpbnRzL0JpcnRoZGF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYjRlNzIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vY29uc3RyYWludHMvQmlydGhkYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmNvbnN0cmFpbnRzOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuUGFzdDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5BTk5PVEFUSU9OX1RZUEU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi0NCi1AUGFzdA0KLUBOb3ROdWxsDQotDQotQENvbnN0cmFpbnQodmFsaWRhdGVkQnkgPSB7fSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgQU5OT1RBVElPTl9UWVBFfSkNCi1wdWJsaWMgQGludGVyZmFjZSBCaXJ0aGRheQ0KLXsNCi0gICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJubyB2YWxpZCBiaXJ0aGRheSI7DQotDQotICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2NvbnN0cmFpbnRzL05hbWUuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2NvbnN0cmFpbnRzL05hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkyMDBmOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9jb25zdHJhaW50cy9OYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5jb25zdHJhaW50czsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk92ZXJyaWRlc0F0dHJpYnV0ZTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkFOTk9UQVRJT05fVFlQRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLQ0KLUBOb3ROdWxsDQotQFNpemUobWluID0gMikNCi0NCi1AQ29uc3RyYWludCh2YWxpZGF0ZWRCeSA9IHt9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBBTk5PVEFUSU9OX1RZUEV9KQ0KLXB1YmxpYyBAaW50ZXJmYWNlIE5hbWUNCi17DQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAiaW52YWxpZCBuYW1lIjsgLy9ub3QgdXNlZA0KLQ0KLSAgICBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQge307DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHt9Ow0KLQ0KLSAgICBAT3ZlcnJpZGVzQXR0cmlidXRlKGNvbnN0cmFpbnQgPSBTaXplLmNsYXNzLCBuYW1lID0gIm1heCIpDQotICAgIGludCBtYXhMZW5ndGgoKSBkZWZhdWx0IDIwOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MDczY2UuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uY29uc3RyYWludHMuTmFtZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uY29uc3RyYWludHMuQmlydGhkYXk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlBhc3Q7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLXB1YmxpYyBjbGFzcyBQZXJzb24NCi17DQotICAgIEBOYW1lKG1heExlbmd0aCA9IDMwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7DQotDQotICAgIEBOYW1lKG1heExlbmd0aCA9IDMwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsNCi0NCi0gICAgQFNpemUobWluID0gMiwgbWF4ID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOw0KLQ0KLSAgICBAQmlydGhkYXkNCi0gICAgcHJpdmF0ZSBEYXRlIGJpcnRoZGF5Ow0KLQ0KLSAgICBAUGFzdA0KLSAgICBwcml2YXRlIERhdGUgZmluYWxFeGFtOw0KLQ0KLSAgICBATm90TnVsbA0KLSAgICBwcml2YXRlIFN0cmluZyBuaWNrTmFtZTsNCi0NCi0gICAgQFNpemUobWluID0gNiwgbWF4ID0gNjApDQotICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOw0KLQ0KLSAgICBATm90TnVsbA0KLSAgICBwcml2YXRlIGludCBudW1iZXJPZlNpYmxpbmdzOw0KLQ0KLSAgICBAU2l6ZShtaW4gPSAyLCBtYXggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcm9sZSA9ICJ1c2VyIjsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxhc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRSb2xlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHJvbGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Um9sZShTdHJpbmcgcm9sZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5yb2xlID0gcm9sZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXRCaXJ0aGRheSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBiaXJ0aGRheTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRCaXJ0aGRheShEYXRlIGJpcnRoZGF5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmJpcnRoZGF5ID0gYmlydGhkYXk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RmluYWxFeGFtKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZpbmFsRXhhbTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaW5hbEV4YW0oRGF0ZSBmaW5hbEV4YW0pDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmluYWxFeGFtID0gZmluYWxFeGFtOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tmlja05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmlja05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Tmlja05hbWUoU3RyaW5nIG5pY2tOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm5pY2tOYW1lID0gbmlja05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBlbWFpbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbWFpbChTdHJpbmcgZW1haWwpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZW1haWwgPSBlbWFpbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGdldE51bWJlck9mU2libGluZ3MoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbnVtYmVyT2ZTaWJsaW5nczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXJPZlNpYmxpbmdzKGludCBudW1iZXJPZlNpYmxpbmdzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm51bWJlck9mU2libGluZ3MgPSBudW1iZXJPZlNpYmxpbmdzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDIwZjk0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5ndWkuYmVhbnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uUGFnZQ0KLXsNCi0gICAgQE5vdE51bGwocGF5bG9hZCA9IERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7DQotDQotICAgIEBOb3ROdWxsKHBheWxvYWQgPSBWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZFJlcGVhdGVkOw0KLQ0KLSAgICBwcml2YXRlIFBlcnNvbiBwZXJzb247DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZmluaXNoKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0UGFzc3dvcmQodGhpcy5wYXNzd29yZCk7DQotICAgICAgICByZXR1cm4gImhvbWUiOw0KLSAgICB9DQotDQotICAgIEBTaXplKG1pbiA9IDYsIG1heCA9IDYwKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uLmdldEVtYWlsKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXRFbWFpbChlbWFpbCk7DQotICAgIH0NCi0NCi0gICAgQE5vdE51bGwNCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNpYmxpbmdzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uLmdldE51bWJlck9mU2libGluZ3MoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXJPZlNpYmxpbmdzKGludCBudW1iZXJPZlNpYmxpbmdzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXROdW1iZXJPZlNpYmxpbmdzKG51bWJlck9mU2libGluZ3MpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkUmVwZWF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmRSZXBlYXRlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZFJlcGVhdGVkKFN0cmluZyBwYXNzd29yZFJlcGVhdGVkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkUmVwZWF0ZWQgPSBwYXNzd29yZFJlcGVhdGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQZXJzb24gZ2V0UGVyc29uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBlcnNvbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzb24oUGVyc29uIHBlcnNvbikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24gPSBwZXJzb247DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMTg5M2MuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCIKLSAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4KLSAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgIDwhLS0gdHJpbmlkYWQgLS0+Ci0gICAgICAgIDxkZWZhdWx0LXJlbmRlci1raXQtaWQ+Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29yZQotICAgICAgICA8L2RlZmF1bHQtcmVuZGVyLWtpdC1pZD4KLQotICAgIDwvYXBwbGljYXRpb24+Ci0KLSAgICA8bWFuYWdlZC1iZWFuPgotICAgICAgICA8bWFuYWdlZC1iZWFuLW5hbWU+cmVnaXN0cmF0aW9uUGFnZTwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZ3VpLmJlYW5zLlJlZ2lzdHJhdGlvblBhZ2U8L21hbmFnZWQtYmVhbi1jbGFzcz4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0KLSAgICAgICAgPG1hbmFnZWQtcHJvcGVydHk+Ci0gICAgICAgICAgICA8cHJvcGVydHktbmFtZT5wZXJzb248L3Byb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8dmFsdWU+I3twZXJzb259PC92YWx1ZT4KLSAgICAgICAgPC9tYW5hZ2VkLXByb3BlcnR5PgotICAgIDwvbWFuYWdlZC1iZWFuPgotCi0gICAgPG1hbmFnZWQtYmVhbj4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1uYW1lPnBlcnNvbjwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluLlBlcnNvbjwvbWFuYWdlZC1iZWFuLWNsYXNzPgotICAgICAgICA8bWFuYWdlZC1iZWFuLXNjb3BlPnNlc3Npb248L21hbmFnZWQtYmVhbi1zY29wZT4KLSAgICA8L21hbmFnZWQtYmVhbj4KLQotICAgIDxuYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgICAgIDxmcm9tLXZpZXctaWQ+L3BhZ2VzL2hvbWUueGh0bWw8L2Zyb20tdmlldy1pZD4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+YWRkVXNlcjwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgPG5hdmlnYXRpb24tcnVsZT4KLSAgICAgICAgPGZyb20tdmlldy1pZD4qPC9mcm9tLXZpZXctaWQ+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmhvbWU8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9ob21lLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICA8L25hdmlnYXRpb24tcnVsZT4KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9tYWluLnRhZ2xpYi54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzM5MzY2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9tYWluLnRhZ2xpYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBmYWNlbGV0LXRhZ2xpYiBQVUJMSUMKLSAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBGYWNlbGV0IFRhZ2xpYiAxLjAvL0VOIgotICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZmFjZWxldC10YWdsaWJfMV8wLmR0ZCI+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGZhY2VsZXQtdGFnbGliPgotICAgIDxuYW1lc3BhY2U+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHR2YWwvZGVtby9jb21wb25lbnRzPC9uYW1lc3BhY2U+Ci0KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+dXNlckZvcm08L3RhZy1uYW1lPgotICAgICAgICA8c291cmNlPgotICAgICAgICAgICAgLi4vY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKLSAgICAgICAgPC9zb3VyY2U+Ci0gICAgPC90YWc+Ci0KLTwvZmFjZWxldC10YWdsaWI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjMDFhYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgotICAgICAgICAgdmVyc2lvbj0iMi40Ij4KLQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuREVGQVVMVF9TVUZGSVg8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4ueGh0bWw8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5mYWNlbGV0cy5MSUJSQVJJRVM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9tYWluLnRhZ2xpYi54bWw8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRU5BQkxFX0xJR0hUV0VJR0hUX0RJQUxPR1M8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkRJU0FCTEVfQ09OVEVOVF9DT01QUkVTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQUxURVJOQVRFX1ZJRVdfSEFORExFUjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNvbS5zdW4uZmFjZWxldHMuRmFjZWxldFZpZXdIYW5kbGVyPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLlVTRV9BUFBMSUNBVElPTl9WSUVXX0NBQ0hFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQ0hBTkdFX1BFUlNJU1RFTkNFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+c2Vzc2lvbjwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5TdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jbGllbnQ8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgRGVmaW5lcyB0aGUgYW1vdW50IChkZWZhdWx0ID0gMjApIG9mIHRoZSBsYXRlc3Qgdmlld3MgYXJlIHN0b3JlZCBpbiBzZXNzaW9uLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuTlVNQkVSX09GX1ZJRVdTX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc3RhdGUgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0gYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLgotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkgYW5kIGlmCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04gaXMgdHJ1ZSAoPSBkZWZhdWx0KQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4gSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DT01QUkVTU19TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhpcyBwYXJhbWV0ZXIgdGVsbHMgTXlGYWNlcyBpZiBqYXZhc2NyaXB0IGNvZGUgc2hvdWxkIGJlIGFsbG93ZWQgaW4gdGhlCi0gICAgICAgICAgICByZW5kZXJlZCBIVE1MIG91dHB1dC4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgYWxsb3dlZCwgY29tbWFuZF9saW5rIGFuY2hvcnMgd2lsbCBoYXZlIGphdmFzY3JpcHQgY29kZQotICAgICAgICAgICAgdGhhdCBzdWJtaXRzIHRoZSBjb3JyZXNwb25kaW5nIGZvcm0uCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIG5vdCBhbGxvd2VkLCB0aGUgc3RhdGUgc2F2aW5nIGluZm8gYW5kIG5lc3RlZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICB3aWxsIGJlIGFkZGVkIGFzIHVybCBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BTExPV19KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuREVURUNUX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgcmVuZGVyZWQgSFRNTCBjb2RlIHdpbGwgYmUgZm9ybWF0dGVkLCBzbyB0aGF0IGl0IGlzICJodW1hbiByZWFkYWJsZSIuCi0gICAgICAgICAgICBpLmUuIGFkZGl0aW9uYWwgbGluZSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIHdpbGwgYmUgd3JpdHRlbiwgdGhhdCBkbyBub3QKLSAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgSFRNTCBjb2RlLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIGEgamF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRoYXQgaXMgYWJsZSB0byByZXN0b3JlIHRoZQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMKLSAgICAgICAgICAgIHdpdGggbG9uZyBsaXN0cyBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcAotICAgICAgICAgICAgaWYgeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZSBwYWdlLgotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQVVUT19TQ1JPTEw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlVzZWQgZm9yIGVuY3J5cHRpbmcgdmlldyBzdGF0ZS4gT25seSByZWxldmFudCBmb3IgY2xpZW50IHNpZGUKLSAgICAgICAgICAgIHN0YXRlIHNhdmluZy4gU2VlIE15RmFjZXMgd2lraS93ZWIgc2l0ZSBkb2N1bWVudGF0aW9uIGZvciBpbnN0cnVjdGlvbnMKLSAgICAgICAgICAgIG9uIGhvdyB0byBjb25maWd1cmUgYW4gYXBwbGljYXRpb24gZm9yIGRpZmZlbmVudCBlbmNyeXB0aW9uIHN0cmVuZ3Rocy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFQ1JFVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPk56WTFORE15TVRBPTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZhbGlkYXRlIG1hbmFnZWQgYmVhbnMsIG5hdmlnYXRpb24gcnVsZXMgYW5kIGVuc3VyZSB0aGF0IGZvcm1zIGFyZSBub3QgbmVzdGVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuVkFMSURBVEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8IS0tIExpc3RlbmVyLCB0byBhbGxvdyBKZXR0eSBzZXJ2aW5nIE15RmFjZXMgYXBwcyAtLT4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMud2ViYXBwLlN0YXJ0dXBTZXJ2bGV0Q29udGV4dExpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IC0tPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+cmVzb3VyY2VzPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC53ZWJhcHAuUmVzb3VyY2VTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgIDwvc2VydmxldD4KLQotICAgIDxmaWx0ZXI+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT50cmluaWRhZDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLndlYmFwcC5UcmluaWRhZEZpbHRlcjwvZmlsdGVyLWNsYXNzPgotICAgIDwvZmlsdGVyPgotCi0gICAgPGZpbHRlci1tYXBwaW5nPgotICAgICAgICA8ZmlsdGVyLW5hbWU+dHJpbmlkYWQ8L2ZpbHRlci1uYW1lPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICA8L2ZpbHRlci1tYXBwaW5nPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmdzIC0tPgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+L2ZhY2VzLyo8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9hZGYvKjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg0ZDY0OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIgotICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIKLSAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiCi0gICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCIKLSAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4KLQotPHVpOmNvbXBvc2l0aW9uPgotICAgIDx0cjpwYW5lbEZvcm1MYXlvdXQ+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibmljayBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvblsgJ25pY2tOYW1lJyBdfSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJlLW1haWwiIHZhbHVlPSIje2JlYW4uZW1haWx9Ii8+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0iZmlyc3QgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb24uZmlyc3ROYW1lfSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJsYXN0IG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uLmxhc3ROYW1lfSIvPgotICAgICAgICA8dHI6aW5wdXREYXRlIGxhYmVsPSJiaXJ0aGRheSIgdmFsdWU9IiN7YmVhbi5wZXJzb24uYmlydGhkYXl9Ij4KLSAgICAgICAgICAgIDx0cjpjb252ZXJ0RGF0ZVRpbWUgdHlwZT0iZGF0ZSIgcGF0dGVybj0iZGQuTU0ueXl5eSIvPgotICAgICAgICA8L3RyOmlucHV0RGF0ZT4KLSAgICAgICAgPHRyOmlucHV0RGF0ZSBsYWJlbD0iZmluYWwgZXhhbSIgdmFsdWU9IiN7YmVhbi5wZXJzb24uZmluYWxFeGFtfSI+Ci0gICAgICAgICAgICA8dHI6Y29udmVydERhdGVUaW1lIHR5cGU9ImRhdGUiIHBhdHRlcm49ImRkLk1NLnl5eXkiLz4KLSAgICAgICAgPC90cjppbnB1dERhdGU+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibnVtYmVyIG9mIHNpYmxpbmdzIiB2YWx1ZT0iI3tiZWFuLm51bWJlck9mU2libGluZ3N9Ii8+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0icGFzc3dvcmQiIHZhbHVlPSIje2JlYW4ucGFzc3dvcmR9IiBzZWNyZXQ9InRydWUiLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0icmUtZW50ZXIgcGFzc3dvcmQiIHZhbHVlPSIje2JlYW4ucGFzc3dvcmRSZXBlYXRlZH0iIHNlY3JldD0idHJ1ZSIvPgotCi0gICAgPC90cjpwYW5lbEZvcm1MYXlvdXQ+Ci08L3VpOmNvbXBvc2l0aW9uPgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWNkMTQ4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLSAgICAgICAgDQotPGh0bWw+DQotDQotPGhlYWQ+DQotICAgIDxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjA7IFVSTD1mYWNlcy9wYWdlcy9ob21lLnhodG1sIj4NCi08L2hlYWQ+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYzFlYTguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08dHI6ZG9jdW1lbnQNCi0gICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCINCi0gICAgICAgIHhtbG5zOmM9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanN0bC9jb3JlIj4NCi0gICAgPGY6ZmFjZXQgbmFtZT0ibWV0YUNvbnRhaW5lciI+DQotICAgICAgICA8dGl0bGU+c2V2LWVuIGZlYXR1cmUtc2V0IGRlbW8gMDE8L3RpdGxlPg0KLSAgICA8L2Y6ZmFjZXQ+DQotDQotICAgIDx0cmg6Ym9keT4NCi0NCi0gICAgICAgIDwhLS0gb3JpZ2luYWwgLS0+DQotICAgICAgICA8ZGl2IGlkPSJ3cmFwIj4NCi0NCi0gICAgICAgICAgICA8dHI6Zm9ybSBpZD0iZm9ybSIgZGVmYXVsdENvbW1hbmQ9ImRlZmF1bHRCdXR0b24iPg0KLSAgICAgICAgICAgICAgICA8ZGl2IGlkPSJtYWluIj4NCi0gICAgICAgICAgICAgICAgICAgIDx1aTppbnNlcnQgbmFtZT0iY29udGVudCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idW5kZXJfY29uc3RydWN0aW9uIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPiFzaXRlIHVuZGVyIGNvbnN0cnVjdGlvbiE8L2gyPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgY29udGVudCBvZiB0aGlzIHNpdGUgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgbW9tZW50LjwvcD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgICAgICAgICAgIDwvdWk6aW5zZXJ0Pg0KLSAgICAgICAgICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICAgICAgICA8L3RyOmZvcm0+DQotICAgICAgICAgICAgPHRyOm1lc3NhZ2VzIGdsb2JhbE9ubHk9InRydWUiLz4NCi0NCi0gICAgICAgIDwvZGl2Pg0KLSAgICA8L3RyaDpib2R5Pg0KLQ0KLQ0KLTwvdHI6ZG9jdW1lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTdiMTUzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJhZGQgdXNlciIgYWN0aW9uPSJhZGRVc2VyIi8+PGJyLz4NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZjZiMDYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOmM9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0dmFsL2RlbW8vY29tcG9uZW50cyINCi0gICAgICAgID4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDxjOnVzZXJGb3JtIGJlYW49IiN7cmVnaXN0cmF0aW9uUGFnZX0iLz4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9InNhdmUiIGFjdGlvbj0iI3tyZWdpc3RyYXRpb25QYWdlLmZpbmlzaH0iLz4NCi0NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3NjU2Zi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX2JlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBoZWxsbyBiZWFuLXZhbGlkYXRpb248L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+anN0bDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3RsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMjwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGliZXJuYXRlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmhpYmVybmF0ZS12YWxpZGF0b3I8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+NC4wLjAuR0E8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuNC4yPC92ZXJzaW9uPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS40LjI8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzhmNzguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuazsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5kb21haW4uUGVyc29uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay52YWxpZGF0aW9uLmdyb3VwLkFkbWluOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay52YWxpZGF0aW9uLmdyb3VwLlVzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb24uZ3JvdXAuTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5ncm91cHMuRGVmYXVsdDsKLQotcHVibGljIGNsYXNzIEhlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlcgotewotICAgIEBCZWFuVmFsaWRhdGlvbi5MaXN0KHsKLSAgICAgICAgICAgIEBCZWFuVmFsaWRhdGlvbih1c2VHcm91cHMgPSBEZWZhdWx0LmNsYXNzKSwKLSAgICAgICAgICAgIEBCZWFuVmFsaWRhdGlvbih2aWV3SWRzID0gIi9ncm91cFZhbGlkYXRpb24wMS5qc3AiLCB1c2VHcm91cHMgPSBVc2VyLmNsYXNzKSwKLSAgICAgICAgICAgIEBCZWFuVmFsaWRhdGlvbih2aWV3SWRzID0gIi9ncm91cFZhbGlkYXRpb24wMi5qc3AiLCB1c2VHcm91cHMgPSBBZG1pbi5jbGFzcyksCi0gICAgICAgICAgICBAQmVhblZhbGlkYXRpb24odmlld0lkcyA9ICIvbW9kZWxWYWxpZGF0aW9uMDEuanNwIiwgdXNlR3JvdXBzID0gQWRtaW4uY2xhc3MpLAotICAgICAgICAgICAgQEJlYW5WYWxpZGF0aW9uKHZpZXdJZHMgPSAiL21vZGVsVmFsaWRhdGlvbjAxLmpzcCIsIHVzZUdyb3VwcyA9IE5hbWUuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbiA9IEBNb2RlbFZhbGlkYXRpb24oaXNBY3RpdmUgPSB0cnVlKSkKLSAgICB9KQotICAgIHByaXZhdGUgUGVyc29uIHBlcnNvbiA9IG5ldyBQZXJzb24oKTsKLQotICAgIC8qKgotICAgICAqIGRlZmF1bHQgZW1wdHkgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgSGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBzZW5kKCkKLSAgICB7Ci0gICAgICAgIC8vZG8gcmVhbCBsb2dpYywgcmV0dXJuIGEgc3RyaW5nIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgdGhlIG5hdmlnYXRpb24gc3lzdGVtIG9mIEpTRgotICAgICAgICByZXR1cm4gInN1Y2Nlc3MiOwotICAgIH0KLQotICAgIHB1YmxpYyBQZXJzb24gZ2V0UGVyc29uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwZXJzb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbiBwZXJzb24pCi0gICAgewotICAgICAgICB0aGlzLnBlcnNvbiA9IHBlcnNvbjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjRlNjhiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuazsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5kb21haW4uUGVyc29uOwotCi0vKioKLSAqIEEgdHlwaWNhbCBzaW1wbGUgYmFja2luZyBiZWFuLCB0aGF0IGlzIGJhY2tlZCB0byA8Y29kZT5oZWxsb3dvcmxkLmpzcDwvY29kZT4KLSAqLwotcHVibGljIGNsYXNzIEhlbGxvV29ybGRDb250cm9sbGVyCi17Ci0gICAgcHJpdmF0ZSBQZXJzb24gcGVyc29uID0gbmV3IFBlcnNvbigpOwotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBlbXB0eSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBIZWxsb1dvcmxkQ29udHJvbGxlcigpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgc2VuZCgpCi0gICAgewotICAgICAgICAvL2RvIHJlYWwgbG9naWMsIHJldHVybiBhIHN0cmluZyB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuYXZpZ2F0aW9uIHN5c3RlbSBvZiBKU0YKLSAgICAgICAgcmV0dXJuICJzdWNjZXNzIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpCi0gICAgewotICAgICAgICByZXR1cm4gcGVyc29uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNvbihQZXJzb24gcGVyc29uKQotICAgIHsKLSAgICAgICAgdGhpcy5wZXJzb24gPSBwZXJzb247Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvZG9tYWluL1BlcnNvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODk4MGMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb24uTmFtZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb24uZ3JvdXAuQWRtaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb24uZ3JvdXAuVXNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cC5OYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOwotCi1ATmFtZUNvbnN0cmFpbnQoZ3JvdXBzID0gTmFtZS5jbGFzcykKLXB1YmxpYyBjbGFzcyBQZXJzb24KLXsKLSAgICBATm90TnVsbChwYXlsb2FkID0gVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcykKLSAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7Ci0KLSAgICAvL2RlbW8gZm9yIGJlYW4gdmFsaWRhdGlvbiBiYXNlZCB2YWxpZGF0aW9uIHN1cHBvcnQKLSAgICBATm90TnVsbAotICAgIEBTaXplLkxpc3QoewotICAgICAgICAgICAgQFNpemUobWluID0gMywgbWF4ID0gNiwgZ3JvdXBzID0gVXNlci5jbGFzcyksCi0gICAgICAgICAgICBAU2l6ZShtaW4gPSAzLCBtYXggPSAxMiwgZ3JvdXBzID0gQWRtaW4uY2xhc3MpCi0gICAgfSkKLSAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaXJzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsYXN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL05hbWVDb25zdHJhaW50LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vTmFtZUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNjMzdmNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vTmFtZUNvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7DQotDQotQENvbnN0cmFpbnQodmFsaWRhdGVkQnkgPSBOYW1lQ29uc3RyYWludFZhbGlkYXRvci5jbGFzcykNCi1AVGFyZ2V0KFRZUEUpDQotQFJldGVudGlvbihSVU5USU1FKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIE5hbWVDb25zdHJhaW50DQotew0KLSAgICBTdHJpbmcgbWVzc2FnZSgpIGRlZmF1bHQgImludmFsaWQgbmFtZSI7DQotDQotICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9OYW1lQ29uc3RyYWludFZhbGlkYXRvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL05hbWVDb25zdHJhaW50VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1Yjg5MmMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL05hbWVDb25zdHJhaW50VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLmRvbWFpbi5QZXJzb247DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgTmFtZUNvbnN0cmFpbnRWYWxpZGF0b3IgaW1wbGVtZW50cw0KLSAgICAgICAgQ29uc3RyYWludFZhbGlkYXRvcjxOYW1lQ29uc3RyYWludCwgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLmRvbWFpbi5QZXJzb24+DQotew0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKE5hbWVDb25zdHJhaW50IGRpZmZlcmVudE5hbWUpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKFBlcnNvbiBwZXJzb24sIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0KQ0KLSAgICB7DQotICAgICAgICBpZihwZXJzb24gPT0gbnVsbCB8fCBpc0VtcHR5KHBlcnNvbi5nZXRGaXJzdE5hbWUoKSkgfHwgaXNFbXB0eShwZXJzb24uZ2V0TGFzdE5hbWUoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gIShwZXJzb24uZ2V0Rmlyc3ROYW1lKCkuZXF1YWxzKHBlcnNvbi5nZXRMYXN0TmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRW1wdHkoU3RyaW5nIHZhbHVlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCAiIi5lcXVhbHModmFsdWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9BZG1pbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL2dyb3VwL0FkbWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMjVmZDAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL2dyb3VwL0FkbWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cDsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIEFkbWluDQotew0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvTmFtZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL2dyb3VwL05hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTExNzAzOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb24uZ3JvdXA7DQotDQotcHVibGljIGludGVyZmFjZSBOYW1lDQotew0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvVXNlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL2dyb3VwL1VzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJmOGRkNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvVXNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb24uZ3JvdXA7DQotDQotcHVibGljIGludGVyZmFjZSBVc2VyDQotew0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4OGMyOWEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZmFjZXMtY29uZmlnIHZlcnNpb249IjEuMiIgCi0gICAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiPgotCQotCTwhLS0gbWFuYWdlZCBiZWFucyBvZiB0aGUgc2ltcGxlIGhlbGxvIHdvcmxkIGFwcCAtLT4KLQk8bWFuYWdlZC1iZWFuPgotCQk8bWFuYWdlZC1iZWFuLW5hbWU+aGVsbG9Xb3JsZDwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0JCTxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLkhlbGxvV29ybGRDb250cm9sbGVyPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0JCTxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPgotCTwvbWFuYWdlZC1iZWFuPgotCQotCTxtYW5hZ2VkLWJlYW4+Ci0JCTxtYW5hZ2VkLWJlYW4tbmFtZT5oZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXI8L21hbmFnZWQtYmVhbi1uYW1lPgotCQk8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5IZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXI8L21hbmFnZWQtYmVhbi1jbGFzcz4KLQkJPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0JPC9tYW5hZ2VkLWJlYW4+Ci0KLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIGhlbGxvV29ybGQuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+KjwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5zdWNjZXNzPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vcmVzdWx0LmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPmV4YW1wbGUwMTwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L2dyb3VwVmFsaWRhdGlvbjAxLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPmV4YW1wbGUwMjwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L2dyb3VwVmFsaWRhdGlvbjAyLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPmV4YW1wbGUwMzwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L21vZGVsVmFsaWRhdGlvbjAxLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0JCi0JPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciByZXN1bHQuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L3Jlc3VsdC5qc3A8L2Zyb20tdmlldy1pZD4KLQkJPG5hdmlnYXRpb24tY2FzZT4KLQkJCTxmcm9tLW91dGNvbWU+YmFjazwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L2hlbGxvV29ybGQuanNwPC90by12aWV3LWlkPgotCQk8L25hdmlnYXRpb24tY2FzZT4KLQk8L25hdmlnYXRpb24tcnVsZT4KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE0YTE4My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLSAgICAgICAgIHZlcnNpb249IjIuNCI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+TXlQcm9qZWN0IHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0gICAgPCEtLW9wdGlvbmFsOiBjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgVVJJcyBvZiAoYWRkaXRpb25hbCkgZmFjZXMgY29uZmlnIGZpbGVzLgotICAgICAgICAgICAgKGUuZy4gL1dFQi1JTkYvbXktY29uZmlnLnhtbCkKLSAgICAgICAgICAgIFNlZSBKU0YgMS4wIFBSRDIsIDEwLjMuMgotICAgICAgICAgICAgQXR0ZW50aW9uOiBZb3UgZG8gbm90IG5lZWQgdG8gcHV0IC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgaW4gaGVyZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuQ09ORklHX0ZJTEVTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L1dFQi1JTkYvZXhhbXBsZXMtY29uZmlnLnhtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtLS0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5TdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNsaWVudDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLk5VTUJFUl9PRl9WSUVXU19JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkgYW5kIGlmCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04gaXMgdHJ1ZSAoPSBkZWZhdWx0KQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4gSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUKLSAgICAgICAgICAgIHJlbmRlcmVkIEhUTUwgb3V0cHV0LgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgbm90IGFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLgotICAgICAgICAgICAgaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90Ci0gICAgICAgICAgICBpbmZsdWVuY2UgdGhlIEhUTUwgY29kZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIGEgamF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRoYXQgaXMgYWJsZSB0byByZXN0b3JlIHRoZQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMKLSAgICAgICAgICAgIHdpdGggbG9uZyBsaXN0cyBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcAotICAgICAgICAgICAgaWYgeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZSBwYWdlLgotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BVVRPX1NDUk9MTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQotICAgICAgICAgICAgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucwotICAgICAgICAgICAgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IgZGlmZmVuZW50IGVuY3J5cHRpb24gc3RyZW5ndGhzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VDUkVUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+TnpZMU5ETXlNVEE9PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmFsaWRhdGUgbWFuYWdlZCBiZWFucywgbmF2aWdhdGlvbiBydWxlcyBhbmQgZW5zdXJlIHRoYXQgZm9ybXMgYXJlIG5vdCBuZXN0ZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVHJlYXQgcmVhZG9ubHkgc2FtZSBhcyBpZiBkaXNhYmxlZCBhdHRyaWJ1dGUgd2FzIHNldCBmb3Igc2VsZWN0IGVsZW1lbnRzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUkVBRE9OTFlfQVNfRElTQUJMRURfRk9SX1NFTEVDVFM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBVc2UgdGhlIGRlZmluZWQgY2xhc3MgYXMgdGhlIGNsYXNzIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSByZXNvdXJjZSBpcyBhZGRlZCB0byB0aGUKLSAgICAgICAgICAgIEV4dGVuc2lvbkZpbHRlciBoYW5kbGluZy4gVXNpbmcgU3RyZWFtaW5nQWRkUmVzb3VyY2UgaGVyZSBoZWxwcyB3aXRoIHBlcmZvcm1hbmNlLiBJZiB5b3Ugd2FudCB0byBhZGQKLSAgICAgICAgICAgIGN1c3RvbSBjb21wb25lbnRzIGFuZCB3YW50IHRvIHVzZSB0aGUgRXh0ZW5zaW9uRmlsdGVyLCB5b3UgbmVlZCB0byBwcm92aWRlIHlvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIGhlcmUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BRERfUkVTT1VSQ0VfQ0xBU1M8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwudXRpbC5EZWZhdWx0QWRkUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgICAgIAotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZpcnR1YWwgcGF0aCBpbiB0aGUgVVJMIHdoaWNoIHRyaWdnZXJzIGxvYWRpbmcgb2YgcmVzb3VyY2VzIGZvciB0aGUgTXlGYWNlcyBleHRlbmRlZCBjb21wb25lbnRzCi0gICAgICAgICAgICBpbiB0aGUgRXh0ZW5zaW9uRmlsdGVyLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUkVTT1VSQ0VfVklSVFVBTF9QQVRIPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L2ZhY2VzL215RmFjZXNFeHRlbnNpb25SZXNvdXJjZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBDaGVjayBpZiB0aGUgZXh0ZW5zaW9ucy1maWx0ZXIgaGFzIGJlZW4gcHJvcGVybHkgY29uZmlndXJlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNIRUNLX0VYVEVOU0lPTlNfRklMVEVSPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBEZWZpbmUgcGFydGlhbCBzdGF0ZSBzYXZpbmcgYXMgdHJ1ZS9mYWxzZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuUEFSVElBTF9TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0KLSAgICA8IS0tIExpc3RlbmVyLCB0byBhbGxvdyBKZXR0eSBzZXJ2aW5nIE15RmFjZXMgYXBwcyAtLT4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMud2ViYXBwLlN0YXJ0dXBTZXJ2bGV0Q29udGV4dExpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IC0tPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmcgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4qLmpzZjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4LmpzcDwvd2VsY29tZS1maWxlPgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9ncm91cFZhbGlkYXRpb24wMS5qc3AgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9ncm91cFZhbGlkYXRpb24wMS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZjAzOWQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvZ3JvdXBWYWxpZGF0aW9uMDEuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgICA8Zjp2aWV3PgotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPgotICAgICAgICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMyI+Ci0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJmaXJzdF9uYW1lIiB2YWx1ZT0iRmlyc3QgbmFtZSo6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJmaXJzdF9uYW1lIiBsYWJlbD0iRmlyc3QgbmFtZSIgdmFsdWU9IiN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyWydwZXJzb24nXS5maXJzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9ImZpcnN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4KLQotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0ibGFzdF9uYW1lIiB2YWx1ZT0iTGFzdCBuYW1lKio6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJsYXN0X25hbWUiIGxhYmVsPSJMYXN0IG5hbWUiIHZhbHVlPSIje2hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlci5wZXJzb24ubGFzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9Imxhc3RfbmFtZSIgc2hvd1N1bW1hcnk9InRydWUiIHNob3dEZXRhaWw9ImZhbHNlIiBlcnJvclN0eWxlPSJjb2xvcjogcmVkOyIgd2FyblN0eWxlPSJjb2xvcjogb3JhbmdlOyIvPgotCi0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiB2YWx1ZT0iUHJlc3MgbWUiIGFjdGlvbj0iI3toZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIuc2VuZH0iLz4KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4KLSAgICAgICAgICAgICAgPC9oOnBhbmVsR3JpZD4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICAgICAgPGg6bWVzc2FnZXMgZ2xvYmFsT25seT0idHJ1ZSIgc2hvd0RldGFpbD0idHJ1ZSIgc2hvd1N1bW1hcnk9ImZhbHNlIi8+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgICAgICA8aHIvPgotCi0gICAgICAgICogcmVxdWlyZWQ8YnIvPgotICAgICAgICAqKiByZXF1aXJlZDsgbGVuZ3RoOiAzLTYgY2hhcmFjdGVycwotICAgIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2dyb3VwVmFsaWRhdGlvbjAyLmpzcCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2dyb3VwVmFsaWRhdGlvbjAyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VmYTA0Ni4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9ncm91cFZhbGlkYXRpb24wMi5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIzIj4KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9ImZpcnN0X25hbWUiIHZhbHVlPSJGaXJzdCBuYW1lKjoiLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9ImZpcnN0X25hbWUiIGxhYmVsPSJGaXJzdCBuYW1lIiB2YWx1ZT0iI3toZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXJbJ3BlcnNvbiddLmZpcnN0TmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0iZmlyc3RfbmFtZSIgc2hvd1N1bW1hcnk9InRydWUiIHNob3dEZXRhaWw9ImZhbHNlIiBlcnJvclN0eWxlPSJjb2xvcjogcmVkOyIgd2FyblN0eWxlPSJjb2xvcjogb3JhbmdlOyIvPgotCi0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJsYXN0X25hbWUiIHZhbHVlPSJMYXN0IG5hbWUqKjoiLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9Imxhc3RfbmFtZSIgbGFiZWw9Ikxhc3QgbmFtZSIgdmFsdWU9IiN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLnBlcnNvbi5sYXN0TmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0ibGFzdF9uYW1lIiBzaG93U3VtbWFyeT0idHJ1ZSIgc2hvd0RldGFpbD0iZmFsc2UiIGVycm9yU3R5bGU9ImNvbG9yOiByZWQ7IiB3YXJuU3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ii8+Ci0KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJQcmVzcyBtZSIgYWN0aW9uPSIje2hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlci5zZW5kfSIvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgICAgICAgPC9oOmZvcm0+Ci0gICAgICAgICAgICA8aDptZXNzYWdlcyBnbG9iYWxPbmx5PSJ0cnVlIiBzaG93RGV0YWlsPSJ0cnVlIiBzaG93U3VtbWFyeT0iZmFsc2UiLz4KLSAgICAgICAgPC9mOnZpZXc+Ci0gICAgICAgIDxoci8+Ci0KLSAgICAgICAgKiByZXF1aXJlZDxici8+Ci0gICAgICAgICoqIHJlcXVpcmVkOyBsZW5ndGg6IDMtMTIgY2hhcmFjdGVycwotICAgIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNDk3MzMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIzIj4KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9ImZpcnN0X25hbWUiIHZhbHVlPSJGaXJzdCBuYW1lKjoiLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9ImZpcnN0X25hbWUiIGxhYmVsPSJGaXJzdCBuYW1lIiB2YWx1ZT0iI3toZWxsb1dvcmxkLnBlcnNvbi5maXJzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9ImZpcnN0X25hbWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIgc2hvd0RldGFpbD0idHJ1ZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4KLQotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0ibGFzdF9uYW1lIiB2YWx1ZT0iTGFzdCBuYW1lKio6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJsYXN0X25hbWUiIGxhYmVsPSJMYXN0IG5hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJsYXN0X25hbWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIgc2hvd0RldGFpbD0idHJ1ZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4KLQotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Xb3JsZC5zZW5kfSIvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICA8L2g6cGFuZWxHcmlkPgotCi0gICAgICAgICAgICAgIDxoci8+Ci0gICAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIHZhbHVlPSJncm91cCB2YWxpZGF0aW9uIGV4YW1wbGUgMSIgYWN0aW9uPSJleGFtcGxlMDEiIGltbWVkaWF0ZT0idHJ1ZSIvPjxici8+Ci0gICAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIHZhbHVlPSJncm91cCB2YWxpZGF0aW9uIGV4YW1wbGUgMiIgYWN0aW9uPSJleGFtcGxlMDIiIGltbWVkaWF0ZT0idHJ1ZSIvPjxici8+Ci0gICAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIHZhbHVlPSJtb2RlbCB2YWxpZGF0aW9uIGV4YW1wbGUgMSIgYWN0aW9uPSJleGFtcGxlMDMiIGltbWVkaWF0ZT0idHJ1ZSIvPjxici8+Ci0gICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgPC9mOnZpZXc+Ci0gICAgICAgIDxoci8+Ci0gICAgICAgICogbm9uIGJsb2NraW5nIHdhcm4gbW9kZTxici8+Ci0gICAgICAgICoqIGJsb2NraW5nIGVycm9yIG1vZGUKLSAgICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ODJkNTMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgcGFnZSBzZXNzaW9uPSJmYWxzZSIlPgotPCUKLXJlc3BvbnNlLnNlbmRSZWRpcmVjdCgiaGVsbG9Xb3JsZC5qc2YiKTsKLSU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvbW9kZWxWYWxpZGF0aW9uMDEuanNwIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvbW9kZWxWYWxpZGF0aW9uMDEuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODFmN2RlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL21vZGVsVmFsaWRhdGlvbjAxLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwlLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tJT4KLQotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgICAgPGY6dmlldz4KLSAgICAgICAgICAgIDxoOmZvcm0gaWQ9Im1haW5Gb3JtIj4KLSAgICAgICAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjMiPgotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0iZmlyc3RfbmFtZSIgdmFsdWU9IkZpcnN0IG5hbWUqOiIvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0iZmlyc3RfbmFtZSIgbGFiZWw9IkZpcnN0IG5hbWUiIHZhbHVlPSIje2hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlclsncGVyc29uJ10uZmlyc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJmaXJzdF9uYW1lIiBzaG93U3VtbWFyeT0idHJ1ZSIgc2hvd0RldGFpbD0iZmFsc2UiIGVycm9yU3R5bGU9ImNvbG9yOiByZWQ7IiB3YXJuU3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ii8+Ci0KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9Imxhc3RfbmFtZSIgdmFsdWU9Ikxhc3QgbmFtZSoqOiIvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0ibGFzdF9uYW1lIiBsYWJlbD0iTGFzdCBuYW1lIiB2YWx1ZT0iI3toZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIucGVyc29uLmxhc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJsYXN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4KLQotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLnNlbmR9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+Ci0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+Ci0gICAgICAgICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0gICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgICAgIDxoOm1lc3NhZ2VzIGdsb2JhbE9ubHk9InRydWUiIHNob3dEZXRhaWw9InRydWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIvPgotICAgICAgICA8L2Y6dmlldz4KLSAgICAgICAgPGhyLz4KLSAgICAgICAgbW9kZWwgdmFsaWRhdGlvbjogZmlyc3QgYW5kIGxhc3QgbmFtZSBoYXZlIHRvIGJlIGRpZmZlcmVudDxici8+Ci0KLSAgICAgICAgKiByZXF1aXJlZDxici8+Ci0gICAgICAgICoqIHJlcXVpcmVkOyBsZW5ndGggb2YgcHJvdmlkZWQgdmFsdWU6IDMtMTIgY2hhcmFjdGVycwotICAgIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL3Jlc3VsdC5qc3AgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9yZXN1bHQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZThiMWVjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL3Jlc3VsdC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgICAgPGgyPjxoOm91dHB1dFRleHQgdmFsdWU9IkhlbGxvICN7aGVsbG9Xb3JsZC5wZXJzb24uZmlyc3ROYW1lfSAje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfSN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLnBlcnNvbi5maXJzdE5hbWV9ICN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLnBlcnNvbi5sYXN0TmFtZX0uIFdlIGhvcGUgeW91IGVuam95IEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yISIvPjwvaDI+Ci0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZExpbmsgYWN0aW9uPSJiYWNrIj4KLSAgICAgICAgICAgICAgICAgICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iSG9tZSIvPgotICAgICAgICAgICAgICAgIDwvaDpjb21tYW5kTGluaz4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICAgICAgPGg6bWVzc2FnZXMgZ2xvYmFsT25seT0idHJ1ZSIgc2hvd0RldGFpbD0idHJ1ZSIgc2hvd1N1bW1hcnk9ImZhbHNlIi8+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgIDwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fd29ybGQvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjczNWYzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIGhlbGxvIHdvcmxkPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmpzdGw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anN0bDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5PiAgICAgICAgDQotDQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhZmIzOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuazsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5kb21haW4uUGVyc29uOwotCi0vKioKLSAqIEEgdHlwaWNhbCBzaW1wbGUgYmFja2luZyBiZWFuLCB0aGF0IGlzIGJhY2tlZCB0byA8Y29kZT5oZWxsb3dvcmxkLmpzcDwvY29kZT4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZENvbnRyb2xsZXIKLXsKLSAgICBwcml2YXRlIFBlcnNvbiBwZXJzb24gPSBuZXcgUGVyc29uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBkZWZhdWx0IGVtcHR5IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIEhlbGxvV29ybGRDb250cm9sbGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHRoYXQgaXMgYmFja2VkIHRvIGEgc3VibWl0IGJ1dHRvbiBvZiBhIGZvcm0uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBzZW5kKCkKLSAgICB7Ci0gICAgICAgIC8vZG8gcmVhbCBsb2dpYywgcmV0dXJuIGEgc3RyaW5nIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgdGhlIG5hdmlnYXRpb24gc3lzdGVtIG9mIEpTRgotICAgICAgICByZXR1cm4gInN1Y2Nlc3MiOwotICAgIH0KLQotICAgIHB1YmxpYyBQZXJzb24gZ2V0UGVyc29uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwZXJzb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbiBwZXJzb24pCi0gICAgewotICAgICAgICB0aGlzLnBlcnNvbiA9IHBlcnNvbjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMDc2Y2MuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5kb21haW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5OwotCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOwotCi1wdWJsaWMgY2xhc3MgUGVyc29uCi17Ci0gICAgLy9oZWxsbyB3b3JsZCBkZW1vCi0gICAgQFJlcXVpcmVkKHBhcmFtZXRlcnMgPSBWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzKQotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsKLQotICAgIC8vZGVtbyBmb3IganBhIGJhc2VkIHZhbGlkYXRpb24gc3VwcG9ydAotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTAgLyouLi4qLykKLSAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaXJzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsYXN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiZWFlNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGZhY2VzLWNvbmZpZyB2ZXJzaW9uPSIxLjIiIAotICAgIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIj4KLQkKLQk8IS0tIG1hbmFnZWQgYmVhbnMgb2YgdGhlIHNpbXBsZSBoZWxsbyB3b3JsZCBhcHAgLS0+Ci0JPG1hbmFnZWQtYmVhbj4KLQkJPG1hbmFnZWQtYmVhbi1uYW1lPmhlbGxvV29ybGQ8L21hbmFnZWQtYmVhbi1uYW1lPgotCQk8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5IZWxsb1dvcmxkQ29udHJvbGxlcjwvbWFuYWdlZC1iZWFuLWNsYXNzPgotCQk8bWFuYWdlZC1iZWFuLXNjb3BlPnJlcXVlc3Q8L21hbmFnZWQtYmVhbi1zY29wZT4KLQk8L21hbmFnZWQtYmVhbj4KLQkKLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIGhlbGxvV29ybGQuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L2hlbGxvV29ybGQuanNwPC9mcm9tLXZpZXctaWQ+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPnN1Y2Nlc3M8L2Zyb20tb3V0Y29tZT4KLQkJCTx0by12aWV3LWlkPi9wYWdlMi5qc3A8L3RvLXZpZXctaWQ+Ci0JCTwvbmF2aWdhdGlvbi1jYXNlPgotCTwvbmF2aWdhdGlvbi1ydWxlPgotCQotCTwhLS0gbmF2aWdhdGlvbiBydWxlcyBmb3IgcGFnZTIuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L3BhZ2UyLmpzcDwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5iYWNrPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vaGVsbG9Xb3JsZC5qc3A8L3RvLXZpZXctaWQ+Ci0JCTwvbmF2aWdhdGlvbi1jYXNlPgotCTwvbmF2aWdhdGlvbi1ydWxlPgotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE0YTE4My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgotICAgICAgICAgdmVyc2lvbj0iMi40Ij4KLQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8IS0tb3B0aW9uYWw6IGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Db21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBVUklzIG9mIChhZGRpdGlvbmFsKSBmYWNlcyBjb25maWcgZmlsZXMuCi0gICAgICAgICAgICAoZS5nLiAvV0VCLUlORi9teS1jb25maWcueG1sKQotICAgICAgICAgICAgU2VlIEpTRiAxLjAgUFJEMiwgMTAuMy4yCi0gICAgICAgICAgICBBdHRlbnRpb246IFlvdSBkbyBub3QgbmVlZCB0byBwdXQgL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBpbiBoZXJlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5DT05GSUdfRklMRVM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0tLT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBTZWUgSlNGIFNwZWNpZmljYXRpb24gMi41LjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIGFtb3VudCAoZGVmYXVsdCA9IDIwKSBvZiB0aGUgbGF0ZXN0IHZpZXdzIGFyZSBzdG9yZWQgaW4gc2Vzc2lvbi48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuTlVNQkVSX09GX1ZJRVdTX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc3RhdGUgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0gYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLgotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KSBhbmQgaWYKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgY29tcHJlc3NlZC48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcGFyYW1ldGVyIHRlbGxzIE15RmFjZXMgaWYgamF2YXNjcmlwdCBjb2RlIHNob3VsZCBiZSBhbGxvd2VkIGluIHRoZQotICAgICAgICAgICAgcmVuZGVyZWQgSFRNTCBvdXRwdXQuCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUKLSAgICAgICAgICAgIHRoYXQgc3VibWl0cyB0aGUgY29ycmVzcG9uZGluZyBmb3JtLgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBub3QgYWxsb3dlZCwgdGhlIHN0YXRlIHNhdmluZyBpbmZvIGFuZCBuZXN0ZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BTExPV19KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuREVURUNUX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgcmVuZGVyZWQgSFRNTCBjb2RlIHdpbGwgYmUgZm9ybWF0dGVkLCBzbyB0aGF0IGl0IGlzICJodW1hbiByZWFkYWJsZSIuCi0gICAgICAgICAgICBpLmUuIGFkZGl0aW9uYWwgbGluZSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIHdpbGwgYmUgd3JpdHRlbiwgdGhhdCBkbyBub3QKLSAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgSFRNTCBjb2RlLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlBSRVRUWV9IVE1MPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlCi0gICAgICAgICAgICBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuIENvbnZlbmllbnQgZmVhdHVyZSBpZiB5b3UgaGF2ZSBwYWdlcwotICAgICAgICAgICAgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGJyb3dzZXIgcGFnZSB0byBhbHdheXMganVtcCB0byB0aGUgdG9wCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuCi0gICAgICAgICAgICBEZWZhdWx0OiAiZmFsc2UiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFVVE9fU0NST0xMPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Vc2VkIGZvciBlbmNyeXB0aW5nIHZpZXcgc3RhdGUuIE9ubHkgcmVsZXZhbnQgZm9yIGNsaWVudCBzaWRlCi0gICAgICAgICAgICBzdGF0ZSBzYXZpbmcuIFNlZSBNeUZhY2VzIHdpa2kvd2ViIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRUNSRVQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWYWxpZGF0ZSBtYW5hZ2VkIGJlYW5zLCBuYXZpZ2F0aW9uIHJ1bGVzIGFuZCBlbnN1cmUgdGhhdCBmb3JtcyBhcmUgbm90IG5lc3RlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlZBTElEQVRFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUcmVhdCByZWFkb25seSBzYW1lIGFzIGlmIGRpc2FibGVkIGF0dHJpYnV0ZSB3YXMgc2V0IGZvciBzZWxlY3QgZWxlbWVudHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5SRUFET05MWV9BU19ESVNBQkxFRF9GT1JfU0VMRUNUUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFVzZSB0aGUgZGVmaW5lZCBjbGFzcyBhcyB0aGUgY2xhc3Mgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiBhIHJlc291cmNlIGlzIGFkZGVkIHRvIHRoZQotICAgICAgICAgICAgRXh0ZW5zaW9uRmlsdGVyIGhhbmRsaW5nLiBVc2luZyBTdHJlYW1pbmdBZGRSZXNvdXJjZSBoZXJlIGhlbHBzIHdpdGggcGVyZm9ybWFuY2UuIElmIHlvdSB3YW50IHRvIGFkZAotICAgICAgICAgICAgY3VzdG9tIGNvbXBvbmVudHMgYW5kIHdhbnQgdG8gdXNlIHRoZSBFeHRlbnNpb25GaWx0ZXIsIHlvdSBuZWVkIHRvIHByb3ZpZGUgeW91ciBjdXN0b20gaW1wbGVtZW50YXRpb24gaGVyZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFERF9SRVNPVVJDRV9DTEFTUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC51dGlsLkRlZmF1bHRBZGRSZXNvdXJjZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAgICAgCi0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmlydHVhbCBwYXRoIGluIHRoZSBVUkwgd2hpY2ggdHJpZ2dlcnMgbG9hZGluZyBvZiByZXNvdXJjZXMgZm9yIHRoZSBNeUZhY2VzIGV4dGVuZGVkIGNvbXBvbmVudHMKLSAgICAgICAgICAgIGluIHRoZSBFeHRlbnNpb25GaWx0ZXIuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5SRVNPVVJDRV9WSVJUVUFMX1BBVEg8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vZmFjZXMvbXlGYWNlc0V4dGVuc2lvblJlc291cmNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIENoZWNrIGlmIHRoZSBleHRlbnNpb25zLWZpbHRlciBoYXMgYmVlbiBwcm9wZXJseSBjb25maWd1cmVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ0hFQ0tfRVhURU5TSU9OU19GSUxURVI8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIERlZmluZSBwYXJ0aWFsIHN0YXRlIHNhdmluZyBhcyB0cnVlL2ZhbHNlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5QQVJUSUFMX1NUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLQotICAgIDwhLS0gTGlzdGVuZXIsIHRvIGFsbG93IEpldHR5IHNlcnZpbmcgTXlGYWNlcyBhcHBzIC0tPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy53ZWJhcHAuU3RhcnR1cFNlcnZsZXRDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZyAtLT4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPiouanNmPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguanNwPC93ZWxjb21lLWZpbGU+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmQ5YjU1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIzIj4KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9ImZpcnN0X25hbWUiIHZhbHVlPSJGaXJzdCBuYW1lKjoiLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9ImZpcnN0X25hbWUiIGxhYmVsPSJGaXJzdCBuYW1lIiB2YWx1ZT0iI3toZWxsb1dvcmxkLnBlcnNvbi5maXJzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9ImZpcnN0X25hbWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIgc2hvd0RldGFpbD0idHJ1ZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4KLQotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0ibGFzdF9uYW1lIiB2YWx1ZT0iTGFzdCBuYW1lKio6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJsYXN0X25hbWUiIGxhYmVsPSJMYXN0IG5hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJsYXN0X25hbWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIgc2hvd0RldGFpbD0idHJ1ZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4KLQotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Xb3JsZC5zZW5kfSIvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgICAgICAgPC9oOmZvcm0+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgICAgICA8aHIvPgotICAgICAgICAqIG5vbmUgYmxvY2tpbmcgd2FybiBtb2RlPGJyLz4KLSAgICAgICAgKiogYmxvY2tpbmcgZXJyb3IgbW9kZQotICAgIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ODJkNTMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCBwYWdlIHNlc3Npb249ImZhbHNlIiU+Ci08JQotcmVzcG9uc2Uuc2VuZFJlZGlyZWN0KCJoZWxsb1dvcmxkLmpzZiIpOwotJT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWM4NTIzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgICA8Zjp2aWV3PgotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPgotICAgICAgICAgICAgICAgIDxoMj48aDpvdXRwdXRUZXh0IHZhbHVlPSJIZWxsbyAje2hlbGxvV29ybGQucGVyc29uLmZpcnN0TmFtZX0gI3toZWxsb1dvcmxkLnBlcnNvbi5sYXN0TmFtZX0uIFdlIGhvcGUgeW91IGVuam95IEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yISIvPjwvaDI+Ci0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZExpbmsgYWN0aW9uPSJiYWNrIj4KLSAgICAgICAgICAgICAgICAgICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iSG9tZSIvPgotICAgICAgICAgICAgICAgIDwvaDpjb21tYW5kTGluaz4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICA8L2Y6dmlldz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2V4YW1wbGVzL3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJhMWM5OS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvZXhhbXBsZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0NCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIHByb2plY3Q8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvZXhhbXBsZXM8L2Nvbm5lY3Rpb24+DQotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvZXhhbXBsZXM8L2RldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9leGFtcGxlczwvdXJsPg0KLSAgICA8L3NjbT4NCi0gICAgDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDwhLS1UaGlzIHBsdWdpbiBhbGxvd3MgdG8gcnVuIHRoZSBleGFtcGxlIHVzaW5nIG12biBqZXR0eTpydW4gLS0+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZXR0eS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjYuMS44PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjEwPC9zY2FuSW50ZXJ2YWxTZWNvbmRzPg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotICAgIDxtb2R1bGVzPg0KLSAgICAgICAgPG1vZHVsZT5oZWxsb193b3JsZDwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5oZWxsb19iZWFuLXZhbGlkYXRpb248L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+ZmVhdHVyZS1zZXRfMDE8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+ZmVhdHVyZS1zZXRfMDI8L21vZHVsZT4NCi0gICAgPC9tb2R1bGVzPg0KLQ0KLSAgICA8cHJvZmlsZXM+DQotICAgICAgICA8IS0tIFRoaXMgcHJvZmlsZSBpcyBpbnZva2VkIGJ5IC1EcHJlcGFyZVJlbGVhc2U9dHJ1ZS4gIFRoaXMgYWxsb3dzIG12biByZWxlYXNlOnByZXBhcmUgdG8NCi0gICAgICAgICAgICBydW4gc3VjY2Vzc2Z1bGx5IG9uIHRoZSBhc3NlbWJseSBwcm9qZWN0cy4gLS0+DQotICAgICAgICA8cHJvZmlsZT4NCi0gICAgICAgICAgICA8aWQ+cHJlcGFyZS1yZWxlYXNlPC9pZD4NCi0gICAgICAgICAgICA8YWN0aXZhdGlvbj4NCi0gICAgICAgICAgICAgICAgPHByb3BlcnR5Pg0KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+cHJlcGFyZVJlbGVhc2U8L25hbWU+DQotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPg0KLSAgICAgICAgICAgIDxtb2R1bGVzPg0KLSAgICAgICAgICAgICAgICA8bW9kdWxlPmFzc2VtYmx5PC9tb2R1bGU+DQotICAgICAgICAgICAgPC9tb2R1bGVzPg0KLSAgICAgICAgICAgIDxidWlsZD4NCi0gICAgICAgICAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnRzPi1EcHJlcGFyZVJlbGVhc2U8L2FyZ3VtZW50cz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPg0KLSAgICAgICAgICAgIDwvYnVpbGQ+DQotICAgICAgICA8L3Byb2ZpbGU+DQotICAgIDwvcHJvZmlsZXM+DQotDQotICAgIDxwcm9wZXJ0aWVzPg0KLSAgICAgICAgPHRyaW5pZGFkLnZlcnNpb24+MS4yLjk8L3RyaW5pZGFkLnZlcnNpb24+DQotICAgIDwvcHJvcGVydGllcz4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2xvZ28vTElDRU5TRS50eHQgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvbG9nby9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvbG9nby9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2xvZ28vTk9USUNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9sb2dvL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL2xvZ28vTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9sb2dvL2V4dHZhbC1sb2dvLnN2ZyBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9sb2dvL2V4dHZhbC1sb2dvLnN2ZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcyYjUzOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvbG9nby9leHR2YWwtbG9nby5zdmcKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KLTwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgotCi0KLTwhLS0KLQlDb3B5cmlnaHQgMjAwOSBFbnJpY28gQmVydGkgKGVucmljby5iZXJ0aUBnbWFpbC5jb20pCi0KLQlMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLQl5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0JWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLQkgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLQlVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0JZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLQlXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLQlTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0JbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotCi08c3ZnCi0gICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgotICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgotICAgdmVyc2lvbj0iMS4wIgotICAgd2lkdGg9Ijc0NC4wOTQ0OCIKLSAgIGhlaWdodD0iMTA1Mi4zNjIyIgotICAgaWQ9InN2ZzIiPgotICA8ZGVmcwotICAgICBpZD0iZGVmczQiIC8+Ci0gIDxnCi0gICAgIGlkPSJsYXllcjIiPgotICAgIDxyZWN0Ci0gICAgICAgd2lkdGg9IjM1My40MTk1MyIKLSAgICAgICBoZWlnaHQ9IjExMy4xMDg0IgotICAgICAgIHJ5PSIxMSIKLSAgICAgICB4PSIxODIuMjMwMTUiCi0gICAgICAgeT0iMzgxLjMzMjkyIgotICAgICAgIGlkPSJyZWN0MjQ4NCIKLSAgICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojNjY2NjZmO3N0cm9rZS13aWR0aDowLjgwMTg4MjYyO3N0cm9rZS1vcGFjaXR5OjAuOTQxMTc2NDciIC8+Ci0gIDwvZz4KLSAgPGcKLSAgICAgaWQ9ImxheWVyMSI+Ci0gICAgPHBhdGgKLSAgICAgICBkPSJNIDEwNy4xODc1LDM5My41NjYzOCBMIDEyMi4zMDQ2OSwzOTMuNTY2MzggTCAxNzcuNSw0NjcuMzk0NTEgTCAxNjIuMzgyODEsNDY3LjM5NDUxIEwgMTA3LjE4NzUsMzkzLjU2NjM4IE0gMTIyLjMwNDY5LDQ2Ny4zOTQ1MSBMIDEwNy4xODc1LDQ2Ny4zOTQ1MSBMIDE2Mi4zODI4MSwzOTMuNTY2MzggTCAxNzcuNSwzOTMuNTY2MzggTCAxMjIuMzA0NjksNDY3LjM5NDUxIE0gMTg1LjkzNzUsMzgxLjYxMzI2IEwgMTk0LjA5Mzc1LDM4MS42MTMyNiBMIDE5Ni45MDYyNSwzOTMuNTY2MzggTCAyMTQuMDYyNSwzOTMuNTY2MzggTCAyMTQuMDYyNSw0MDQuMTEzMjYgTCAxOTguOTQ1MzEsNDA0LjExMzI2IEwgMTk4Ljk0NTMxLDQ0Ni41MTE2OSBDIDE5OC45NDUzLDQ1My40MDIzMyAyMDEuOTIxODYsNDU2Ljg0NzY0IDIwNy44NzUsNDU2Ljg0NzYzIEwgMjE0LjA2MjUsNDU2Ljg0NzYzIEwgMjE0LjA2MjUsNDY3LjM5NDUxIEwgMjA0LjUsNDY3LjM5NDUxIEMgMTkyLjEyNDk5LDQ2Ny4zOTQ1MSAxODUuOTM3NSw0NjAuNzYxNyAxODUuOTM3NSw0NDcuNDk2MDcgTCAxODUuOTM3NSwzODEuNjEzMjYiCi0gICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTQ3LjUyMTczLDE5LjI5MTkyMikiCi0gICAgICAgaWQ9ImZsb3dSb290MjQ2MSIKLSAgICAgICBzdHlsZT0iZm9udC1zaXplOjQwcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO2ZvbnQtZmFtaWx5OlNhbnNhdGlvbjstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlNhbnNhdGlvbiIgLz4KLSAgICA8cGF0aAotICAgICAgIGQ9Ik0gNDg0LjE1NjI1LDMzNy45Mzc1IEMgNDc5Ljk1MDA3LDM0MS4xODEwNSA0NzYuOTA4NjEsMzQ1LjYwMTIxIDQ3My43MTg3NSwzNDkuNzgxMjUgQyA0NjYuMDcxOTIsMzYwLjE1OTAyIDQ1OC4zNTM0NywzNzAuNDg0NjEgNDUwLjgzNzM5LDM4MC45NTc5NiBDIDQ0MC45ODEyMywzOTQuNDQ4NzMgNDMxLjI5NTkzLDQwOC4wNjQ0OSA0MjEuODMyOTgsNDIxLjgzNDEzIEMgNDEzLjY1MDA3LDQzMy43Mjc5OSA0MDUuNDU1NjgsNDQ1LjYxNDEyIDM5Ny4zNTg1Nyw0NTcuNTY2NjYgQyAzOTYuNzQ0Niw0NTguMzMzMDkgMzk2LjM1MTE5LDQ1OS4zMDQyNyAzOTUuNTkzNzUsNDU5LjkzNzUgQyAzOTQuNzgzMDMsNDYwLjUwNjI3IDM5My4zOTY5Nyw0NjAuMDc0MjUgMzkzLjMwOTk1LDQ1OS4wMDc4NSBDIDM5MC4wNTc4Miw0NDEuNjQ1MTQgMzg2Ljc3MjU2LDQyNC4yODg2NSAzODMuMzk3NDIsNDA2Ljk0OTM4IEMgMzgyLjAyNiwzOTkuNzc0MjIgMzgwLjYyNjQzLDM5Mi42MDM0NCAzNzkuMDY4NjYsMzg1LjQ2NjI1IEMgMzc4LjMzMzAyLDM4Mi4xMjkyNCAzNzcuNTU3NjQsMzc4Ljc4ODU0IDM3Ni40NTU2LDM3NS41NTIzMyBDIDM3Ni4wODE4OSwzNzQuNjkzNzMgMzc1LjkyODQ2LDM3My40ODczOSAzNzQuODYxNTIsMzczLjIxMzM2IEMgMzczLjkwOTQ1LDM3Mi43NzM1OSAzNzIuODcxMTMsMzczLjM1MDU0IDM3Mi4zNjEyMywzNzQuMTc5MDkgQyAzNzEuNDE0ODEsMzc1LjU1NjkxIDM3MC42MTU3MSwzNzcuMDU3OTggMzcwLjE2MjYzLDM3OC42NzM5OCBDIDM2OS4xNTk0NiwzODEuNzAwMTkgMzY4Ljg1MDk3LDM4NC45MDQ5MiAzNjguNzM0NDUsMzg4LjA3NDgxIEMgMzY4LjY2ODc2LDM5Mi43NzQxNyAzNjkuNDA4ODgsMzk3LjQzMzY5IDM3MC4xMjE2Miw0MDIuMDY0NzkgQyAzNzEuOTQ1MTgsNDEzLjMzMzkzIDM3NC4zMjQxNyw0MjQuNTAzNzMgMzc2LjE3NDg2LDQzNS43NjgxMyBDIDM3Ni44NjA1NSw0MzkuNTcxMDcgMzc3LjUwMjk3LDQ0My4zODMzIDM3Ny45MTk3Myw0NDcuMjI2NjkgQyAzNzguNDU4MTgsNDUyLjE4NzA4IDM3OC41Nzg0Nyw0NTcuMTgyNzkgMzc4LjYyNSw0NjIuMTY4NzMgQyAzNzguNjQ4OTMsNDcwLjczNzA5IDM3OC4wNTAzOCw0NzkuMzAwODUgMzc4LjI2NDM5LDQ4Ny44Njk3NCBDIDM3OC41MDY5OSw0OTEuMDY1MTUgMzc4Ljk0MzY5LDQ5NC4zOTQyOSAzODAuNjM2NzYsNDk3LjE4MTU1IEMgMzgxLjcxODE4LDQ5OC45MTYxIDM4My41NzQ3LDUwMC4yNTc4NiAzODUuNjcxMTcsNTAwLjI5OTY1IEMgMzg3Ljc5NTg0LDUwMC4zNDgwMyAzODkuODk3MDQsNDk5LjU1OTc1IDM5MS42MzM1NCw0OTguMzcwODMgQyAzOTIuOTgwMTEsNDk3LjM0NDI4IDM5NC4xMDA0NCw0OTYuMDIzNjcgMzk0Ljk5ODg5LDQ5NC41OTE3MiBDIDM5Ni40OTgzMSw0OTIuMDUyNDYgMzk4LjA2MzA3LDQ4OS41MzkxMyAzOTkuMjMwMjgsNDg2LjgyNzk3IEMgNDAwLjYxMzUzLDQ4My43Mjg4MyA0MDEuOTY0NzIsNDgwLjYxNCA0MDMuMTcwMjYsNDc3LjQzOTg5IEMgNDA0Ljc5MzM4LDQ3My4yMTY0NSA0MDYuNDI1NjcsNDY4Ljk5MDEyIDQwOC40NDA3NCw0NjQuOTM0MiBDIDQxMS43Nzc5MSw0NTcuODUyNTEgNDE1LjM0MjY2LDQ1MC44ODAxMSA0MTkuMDA4Miw0NDMuOTYzNjIgQyA0MjEuMDUwNjEsNDQwLjEzMDQyIDQyMy4yMDkyMSw0MzYuMzU2MzEgNDI1LjU1ODY1LDQzMi43MDI5MyBDIDQyOC40MDI1NCw0MjguNTEzNDcgNDMxLjQxNjYxLDQyNC40NDMxOCA0MzQuNDI5MTIsNDIwLjM3NDY1IEMgNDQwLjI4NjUsNDEyLjU3NDU2IDQ0Ni4zMzM2Nyw0MDQuOTE5NjQgNDUyLjIzNjkxLDM5Ny4xNTQ0NyBDIDQ1Ni45Nzg3OSwzOTAuOTg2MTUgNDYxLjc1MjM1LDM4NC44NDA3MSA0NjYuMzkzMTcsMzc4LjU5NTg3IEMgNDY5LjM1MzczLDM3NC41OTE2NiA0NzIuMjIxNjMsMzcwLjUxNjMyIDQ3NC45NDI5MywzNjYuMzQ1NjggQyA0NzcuODQ0MDYsMzYxLjc2ODQ3IDQ4MC41Mjc1NywzNTcuMDM1MDUgNDgyLjY3NDI5LDM1Mi4wNTQwNSBDIDQ4NC4wNzk5MywzNDguNjczNzkgNDg1LjI3MDM2LDM0NS4xMzkgNDg1LjQ0MjczLDM0MS40NTI3OSBDIDQ4NS40NTk5MSwzNDAuNTM0MTkgNDg1LjU1ODIzLDMzOS41ODI2OSA0ODUuMzEyNSwzMzguNjg3NSBDIDQ4NS4xMTc4MywzMzguMjMzNTkgNDg0LjcwMjQ2LDMzNy43ODEwOSA0ODQuMTU2MjUsMzM3LjkzNzUgeiIKLSAgICAgICBpZD0idGV4dDI0NzUiCi0gICAgICAgc3R5bGU9ImZvbnQtc2l6ZTo0OS4zMjE2OTM0MnB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojOTljYzAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtmb250LWZhbWlseTpTYW5zYXRpb247LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpTYW5zYXRpb24iIC8+Ci0gICAgPHBhdGgKLSAgICAgICBkPSJNIDE0Mi41NTQ2OSwzOTMuNTY2MzggQyAxNjUuMTQ4MzgsMzkzLjU2NjQ2IDE3NC4yNjU1Niw0MDcuMTEzMzIgMTY5LjkwNjI1LDQzNC4yMDcwMSBMIDEyMC4xOTUzMSw0MzQuMjA3MDEgQyAxMjAuMTk1Myw0NDkuMzAwNzcgMTI5LjcxMDkxLDQ1Ni44NDc2NCAxNDguNzQyMTksNDU2Ljg0NzYzIEMgMTU1LjI1Nzc2LDQ1Ni44NDc2NCAxNjEuNzczMzgsNDU2LjE0NDUyIDE2OC4yODkwNiw0NTQuNzM4MjYgTCAxNjguMjg5MDYsNDY1LjI4NTEzIEMgMTYxLjc3MzM4LDQ2Ni42OTEzOCAxNTMuODUxNTIsNDY3LjM5NDUxIDE0NC41MjM0NCw0NjcuMzk0NTEgQyAxMTkuNjMyOCw0NjcuMzk0NTEgMTA3LjE4NzUsNDU0LjgwODU4IDEwNy4xODc1LDQyOS42MzY2OSBDIDEwNy4xODc1LDQwNS41ODk4OCAxMTguOTc2NTUsMzkzLjU2NjQ2IDE0Mi41NTQ2OSwzOTMuNTY2MzggTSAxMjAuMTk1MzEsNDIzLjM3ODg4IEwgMTU4LjAyMzQ0LDQyMy4zNzg4OCBDIDE1OC42Nzk2NCw0MTAuNDQxNDQgMTUyLjgyMDI3LDQwMy45NzI2OSAxNDAuNDQ1MzEsNDAzLjk3MjYzIEMgMTI3Ljc4OTA0LDQwMy45NzI2OSAxMjEuMDM5MDUsNDEwLjQ0MTQ0IDEyMC4xOTUzMSw0MjMuMzc4ODgiCi0gICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoODEuMDQyNSwxOS4yOTE2NzYpIgotICAgICAgIGlkPSJmbG93Um9vdDQ3ODMiCi0gICAgICAgc3R5bGU9ImZvbnQtc2l6ZTo0MHB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojNjY2NjY2O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtmb250LWZhbWlseTpTYW5zYXRpb247LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpTYW5zYXRpb24iIC8+Ci0gICAgPHBhdGgKLSAgICAgICBkPSJNIDEwNy4xODc1LDQ0NC40MDIzMiBDIDEwNy4xODc1LDQyOS4yNjE3MyAxMTcuMTcxODcsNDIxLjY5MTQzIDEzNy4xNDA2Miw0MjEuNjkxMzggQyAxNDQuNDk5OTYsNDIxLjY5MTQzIDE1MC45MjE4Myw0MjIuMTYwMTggMTU2LjQwNjI1LDQyMy4wOTc2MyBMIDE1Ni40MDYyNSw0MTYuMTM2NjkgQyAxNTYuNDA2Miw0MDguMTIxMTMgMTQ5Ljc3MzM5LDQwNC4xMTMzMiAxMzYuNTA3ODEsNDA0LjExMzI2IEMgMTI4LjkxNDA0LDQwNC4xMTMzMiAxMjEuMTMyOCw0MDUuMjg1MTkgMTEzLjE2NDA2LDQwNy42Mjg4OCBMIDExMy4xNjQwNiwzOTcuMDgyMDEgQyAxMjEuMTMyOCwzOTQuNzM4MzMgMTI4LjkxNDA0LDM5My41NjY0NiAxMzYuNTA3ODEsMzkzLjU2NjM4IEMgMTU4LjQ0NTI2LDM5My41NjY0NiAxNjkuNDE0LDQwMS40NDE0NSAxNjkuNDE0MDYsNDE3LjE5MTM4IEwgMTY5LjQxNDA2LDQ2Ny4zOTQ1MSBMIDE2Mi44MDQ2OSw0NjcuMzk0NTEgTCAxNTcuNjAxNTYsNDYyLjE5MTM4IEMgMTUxLjE3OTY0LDQ2NS42NjAxMyAxNDMuNjMyNzgsNDY3LjM5NDUxIDEzNC45NjA5NCw0NjcuMzk0NTEgQyAxMTYuNDQ1Myw0NjcuMzk0NTEgMTA3LjE4NzUsNDU5LjczMDQ1IDEwNy4xODc1LDQ0NC40MDIzMiBNIDE1Ni40MDYyNSw0MzMuNjQ0NTEgQyAxNTEuMjQ5OTYsNDMyLjcwNzA0IDE0NC44MjgwOSw0MzIuMjM4MjkgMTM3LjE0MDYyLDQzMi4yMzgyNiBDIDEyNS44NDM3Myw0MzIuMjM4MjkgMTIwLjE5NTMsNDM2LjIyMjY2IDEyMC4xOTUzMSw0NDQuMTkxMzggQyAxMjAuMTk1Myw0NTIuNjI4OSAxMjUuMTE3MTcsNDU2Ljg0NzY0IDEzNC45NjA5NCw0NTYuODQ3NjMgQyAxNDMuOTYwOSw0NTYuODQ3NjQgMTUxLjEwOTMzLDQ1NC45MjU3NyAxNTYuNDA2MjUsNDUxLjA4MjAxIEwgMTU2LjQwNjI1LDQzMy42NDQ1MSIKLSAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAwMDAwMiwwLDAsMSwzMjkuNzM4MjksMTkuMjkxNjc2KSIKLSAgICAgICBpZD0iZmxvd1Jvb3Q0ODA3IgotICAgICAgIHN0eWxlPSJmb250LXNpemU6NDBweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjE7Zm9udC1mYW1pbHk6U2Fuc2F0aW9uOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246U2Fuc2F0aW9uIiAvPgotICAgIDxwYXRoCi0gICAgICAgZD0iTSAxMDcuMTg3NSwzNjYuODQ3NjMgTCAxMDcuMTg3NSw0NjcuMzk0NTEgTCAxMjAuMTk1MzEsNDY3LjM5NDUxIEwgMTIwLjE5NTMxLDM2Ni44NDc2MyBMIDEwNy4xODc1LDM2Ni44NDc2MyIKLSAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgxLjAwMDAwMiwwLDAsMSw0MDMuNzk5MjksMTkuMjkxNjc2KSIKLSAgICAgICBpZD0iZmxvd1Jvb3Q0ODE5IgotICAgICAgIHN0eWxlPSJmb250LXNpemU6NDBweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjE7Zm9udC1mYW1pbHk6U2Fuc2F0aW9uOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246U2Fuc2F0aW9uIiAvPgotICA8L2c+Ci0gIDxnCi0gICAgIGlkPSJsYXllcjMiPgotICAgIDxyZWN0Ci0gICAgICAgd2lkdGg9IjExLjg5MTU5NyIKLSAgICAgICBoZWlnaHQ9IjEyLjgwNjMzNSIKLSAgICAgICB4PSIzMzMuNTc0NTUiCi0gICAgICAgeT0iNDAwLjg3Mzg0IgotICAgICAgIGlkPSJyZWN0NDY5NSIKLSAgICAgICBzdHlsZT0iZmlsbDojNjY2NjY2O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+Ci0gICAgPHJlY3QKLSAgICAgICB3aWR0aD0iMTUuMDcxNDczIgotICAgICAgIGhlaWdodD0iMjAuMTI0MTU3IgotICAgICAgIHJ5PSIwLjMxNDQ0MTMyIgotICAgICAgIHg9IjI4MS44OTE4MiIKLSAgICAgICB5PSI0MzkuNzkyNDgiCi0gICAgICAgaWQ9InJlY3Q0Njk3IgotICAgICAgIHN0eWxlPSJmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KLSAgICA8cmVjdAotICAgICAgIHdpZHRoPSIxMS44OTE1OTciCi0gICAgICAgaGVpZ2h0PSIxMC41MzA2NDUiCi0gICAgICAgeD0iMzI3LjY5Njk5IgotICAgICAgIHk9IjQxMi44NzE1NSIKLSAgICAgICBpZD0icmVjdDQ4OTEiCi0gICAgICAgc3R5bGU9ImZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utb3BhY2l0eToxIiAvPgotICA8L2c+Ci08L3N2Zz4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9wYXJlbnQvTElDRU5TRS50eHQgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvcGFyZW50L0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9wYXJlbnQvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9wYXJlbnQvTk9USUNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9wYXJlbnQvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5YmRiMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvcGFyZW50L05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3BhcmVudC9wb20ueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3BhcmVudC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDEwZjA1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9wYXJlbnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tCi0gIC0gUGFyZW50IHBvbSBvZiBhbGwgdGhlIG15ZmFjZXMgZXh0ZW5zaW9ucyB2YWxpZGF0b3Igc3VicHJvamVjdHMgCi0gICAgdGhhdCBoZWxwIHRvIGJ1aWxkIG90aGVyIG15ZmFjZXMgcHJvamVjdHMuCi0gIC0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgUHJvamVjdCBQYXJlbnQ8L25hbWU+Ci0gICAgPHVybD5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTI8L3VybD4KLQotICAgIDxpc3N1ZU1hbmFnZW1lbnQ+Ci0gICAgICAgIDxzeXN0ZW0+amlyYTwvc3lzdGVtPgotICAgICAgICA8dXJsPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9FWFRWQUw8L3VybD4KLSAgICA8L2lzc3VlTWFuYWdlbWVudD4KLQotICAgIDxjaU1hbmFnZW1lbnQ+Ci0gICAgICAgIDxzeXN0ZW0+Y29udGludXVtPC9zeXN0ZW0+Ci0gICAgICAgIDx1cmw+aHR0cDovL215ZmFjZXMuem9uZXMuYXBhY2hlLm9yZzo4MDgwL2NvbnRpbnV1bTwvdXJsPgotICAgICAgICA8bm90aWZpZXJzPgotICAgICAgICAgICAgPG5vdGlmaWVyPgotICAgICAgICAgICAgICAgIDx0eXBlPm1haWw8L3R5cGU+Ci0gICAgICAgICAgICAgICAgPHNlbmRPblN1Y2Nlc3M+dHJ1ZTwvc2VuZE9uU3VjY2Vzcz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGFkZHJlc3M+Y29tbWl0c0BteWZhY2VzLmFwYWNoZS5vcmc8L2FkZHJlc3M+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9ub3RpZmllcj4KLSAgICAgICAgPC9ub3RpZmllcnM+Ci0gICAgPC9jaU1hbmFnZW1lbnQ+Ci0gICAgCi0gICAgPGluY2VwdGlvblllYXI+MjAwODwvaW5jZXB0aW9uWWVhcj4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn08L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD5NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotCi0gICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgotICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KLQotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLQotICAgICAgICAgICAgICAgICAgICAtIENvcHkgTElDRU5TRS50eHQgYW5kIE5PVElDRS50eHQgc28gdGhhdCB0aGV5IGFyZSBpbmNsdWRlZAotICAgICAgICAgICAgICAgICAgICAtIGluIHRoZSAtamF2YWRvYyBqYXIgZmlsZSBmb3IgdGhlIGNvbXBvbmVudC4KLSAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5qYXZhZG9jLnJlc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2FwaWRvY3MvTUVUQS1JTkYiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJMSUNFTlNFLnR4dCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJOT1RJQ0UudHh0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+amF2YWRvYy5zaXRlLmNvcHk8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnNpdGU8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ29weSBqYXZhZG9jIHRvIGFub3RoZXIgZGlyZWN0b3J5LCB0byBrZWVwIGphdmFkb2Mgb2YgcHJldmlvdXMgdmVyc2lvbnMgb24gc2l0ZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3NpdGUvYXBpZG9jcy0ke3Byb2plY3QudmVyc2lvbn0iIGZhaWxvbmVycm9yPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zaXRlL2FwaWRvY3MiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPCEtLQotICAgICAgICAgICAgICAgIC0gTWFrZSBhIGNoZWNrc3R5bGUgdmlvbGF0aW9uIGEgY29tcGlsZSBlcnJvci4gTm90ZSB0aGF0IGlmIGEgY29tcGlsZSBlcnJvciBvY2N1cnMsCi0gICAgICAgICAgICAgICAgLSBmdXJ0aGVyIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0YXJnZXQvc2l0ZS9jaGVja3N0eWxlLmh0bWwgKHByZXNlbnQgZXZlbiB3aGVuCi0gICAgICAgICAgICAgICAgLSBqdXN0IHRoZSBjb21waWxlIGdvYWwgYW5kIG5vdCB0aGUgc2l0ZSBnb2FsIGhhcyBiZWVuIHJ1bikuIE5vdGUgYWxzbyB0aGF0IGNoaWxkCi0gICAgICAgICAgICAgICAgLSBwcm9qZWN0cyBtYXkgcmVkZWNsYXJlIHRoaXMgcGx1Z2luIGFuZCBwcm92aWRlIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIHNldHRpbmdzCi0gICAgICAgICAgICAgICAgLSB0byB1c2UgZGlmZmVyZW50IGNoZWNrcyAobW9yZSBvciBsZXNzIHN0cmljdCB0aGFuIHRoZSBkZWZhdWx0KS4KLSAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGVja3N0eWxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+dmVyaWZ5LXN0eWxlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNoZWNrPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlnTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdGFuZGFyZC54bWw8L2NvbmZpZ0xvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aGVhZGVyTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWhlYWRlci50eHQ8L2hlYWRlckxvY2F0aW9uPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBTZXQgY29tcGlsZSBzb3VyY2UgYXQgMS41LCBzaW5jZSB0aGUgdGFyZ2V0IEpTRiBpbXBsIGlzIDEuMiAtLT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgotICAgICAgICAgICAgICAgICAgICA8b3B0aW1pemU+ZmFsc2U8L29wdGltaXplPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgICAgICAgICAgIAotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotICAgIDxyZXBvc2l0b3JpZXM+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPm1hdmVuMi1yZXBvc2l0b3J5LmRldi5qYXZhLm5ldDwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5KYXZhLm5ldCBSZXBvc2l0b3J5IGZvciBNYXZlbjwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL2Rvd25sb2FkLmphdmEubmV0L21hdmVuLzEvPC91cmw+Ci0gICAgICAgICAgICA8bGF5b3V0PmxlZ2FjeTwvbGF5b3V0PgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgPC9yZXBvc2l0b3JpZXM+Ci0KLSAgICA8cmVwb3J0aW5nPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWp4ci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXJlcG9ydC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40LjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBtZC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cnVsZXNldHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvYmFzaWMueG1sPC9ydWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL3VudXNlZGNvZGUueG1sPC9ydWxlc2V0PgotICAgICAgICAgICAgICAgICAgICA8L3J1bGVzZXRzPgotICAgICAgICAgICAgICAgICAgICA8bGlua1hyZWY+dHJ1ZTwvbGlua1hyZWY+Ci0gICAgICAgICAgICAgICAgICAgIDxtaW5pbXVtVG9rZW5zPjEwMDwvbWluaW11bVRva2Vucz4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldEpkaz4xLjU8L3RhcmdldEpkaz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1jaGVja3Mtc3RhbmRhcmQueG1sPC9jb25maWdMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGhlYWRlckxvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1oZWFkZXIudHh0PC9oZWFkZXJMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvcmVwb3J0aW5nPgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvcGFyZW50PC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvcGFyZW50PC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9wYXJlbnQ8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgICAgICA8c25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICAgICAgPHVuaXF1ZVZlcnNpb24+ZmFsc2U8L3VuaXF1ZVZlcnNpb24+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLnNuYXBzaG90czwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgTWF2ZW4gU25hcHNob3QgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgPHNpdGU+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTI8L3VybD4KLSAgICAgICAgPC9zaXRlPgotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtYXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wZXJmb3JtUmVsZWFzZTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvY3M8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxqc2YudmVyc2lvbj4xLjIuNDwvanNmLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3BhcmVudC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3BhcmVudC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjg3OTMwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIC0tLS0tLQ0KLU92ZXJ2aWV3DQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4yDQotDQotICBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBwcm92aWRlcyB2ZXJzaW9ucyBmb3IgSlNGIDEuMSBhbmQgMS4yDQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3BhcmVudC9zcmMvc2l0ZS9hcHQvamF2YWRvYy5hcHQgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvcGFyZW50L3NyYy9zaXRlL2FwdC9qYXZhZG9jLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmZDM2Zi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvcGFyZW50L3NyYy9zaXRlL2FwdC9qYXZhZG9jLmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSAtLS0tLS0NCi1KYXZhZG9jDQotIC0tLS0tLQ0KLQ0KLUphdmFkb2MNCi0NCi0gICAgSGVyZSB5b3UgY2FuIGZpbmQgdGhlIGphdmFkb2Mgb2YgcHJldmlvdXMgZXh0dmFsIHZlcnNpb25zLg0KLQ0KLSAgICAqIHt7e2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9teWZhY2VzLWV4dHZhbC1jb3JlL2FwaWRvY3MtMS4yLjEvaW5kZXguaHRtbH1NeWZhY2VzIEV4dFZhbCBDb3JlIFZlcnNpb24gMS4yLjF9fQ0KLQ0KLSAgICAqIHt7e2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi92YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uL2FwaWRvY3MtMS4yLjEvaW5kZXguaHRtbH1NeWZhY2VzIEV4dFZhbCBQcm9wZXJ0eSBWYWxpZGF0aW9uIFZlcnNpb24gMS4yLjF9fQ0KLQ0KLSAgICAqIHt7e2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9teWZhY2VzLWV4dHZhbC1jb3JlL2FwaWRvY3MtMS4yLjIvaW5kZXguaHRtbH1NeWZhY2VzIEV4dFZhbCBDb3JlIFZlcnNpb24gMS4yLjJ9fQ0KLQ0KLSAgICAqIHt7e2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi92YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uL2FwaWRvY3MtMS4yLjIvaW5kZXguaHRtbH1NeWZhY2VzIEV4dFZhbCBQcm9wZXJ0eSBWYWxpZGF0aW9uIFZlcnNpb24gMS4yLjJ9fQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9wYXJlbnQvc3JjL3NpdGUvc2l0ZS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvcGFyZW50L3NyYy9zaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Nzg2NDlmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9wYXJlbnQvc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgbmFtZT0iQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IiPgotICA8YmFubmVyTGVmdD4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRWYWw8L25hbWU+Ci0gICAgPHNyYz5pbWFnZXMvZXh0dmFsX2xvZ28ucG5nPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sPC9ocmVmPgotICA8L2Jhbm5lckxlZnQ+Ci0KLSAgPGJhbm5lclJpZ2h0PgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzPC9uYW1lPgotICAgIDxzcmM+aW1nL2Jhbm5lcnMvTXlGYWNlc19sb2dvLmpwZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbDwvaHJlZj4KLSAgPC9iYW5uZXJSaWdodD4KLQotICA8cHVibGlzaERhdGUgZm9ybWF0PSJkZCBNTU0geXl5eSIvPgotCi0gIDxza2luPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5tYXZlbjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLXNpdGUtc2tpbjwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3NraW4+Ci0KLSAgPGJvZHk+Ci0gICAgPGxpbmtzPgotICAgICAgPGl0ZW0gbmFtZT0iQXBhY2hlIiBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmciLz4KLSAgICAgIDxpdGVtIG5hbWU9Ik15RmFjZXMiIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQgTXlmYWNlcyBFeHRWYWwiIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZG93bmxvYWQuaHRtbCIvPgotICAgIDwvbGlua3M+Ci0KLSAgICA8bWVudSBuYW1lPSJBcGFjaGUgTXlGYWNlcyIgaW5oZXJpdD0idG9wIj4KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkRvd25sb2FkIiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2Rvd25sb2FkLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0KLSAgICA8bWVudSBuYW1lPSJDb250ZW50cyIgaW5oZXJpdD0idG9wIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iTWFpbiBTaXRlIiAgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW5kZXguaHRtbCIvPgotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjEiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS9pbmRleC5odG1sIiBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8aXRlbSBuYW1lPSJkdW1teSIgICAgICAgIGhyZWY9ImR1bW15Ii8+Ci0gICAgICAgIDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iRXh0VmFsIGZvciBKU0YgMS4yIiAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iQ29yZSBNb2R1bGUiICAgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvbXlmYWNlcy1leHR2YWwtY29yZS9pbmRleC5odG1sIi8+Ci0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IlByb3BlcnR5IFZhbGlkYXRpb24iICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL3ZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb24vaW5kZXguaHRtbCIvPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJUcmluaWRhZCBTdXBwb3J0IiAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydC9pbmRleC5odG1sIi8+Ci0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IkdlbmVyaWMgU3VwcG9ydCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2NvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQvaW5kZXguaHRtbCIvPgotICAgICAgICA8L2l0ZW0+Ci0gICAgPC9tZW51PgotCQotICAgIDxtZW51IG5hbWU9IkRvY3VtZW50YXRpb24iPgotICAgICAgPGl0ZW0gbmFtZT0iV2lraSIgICAgICAgICBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL215ZmFjZXMvRXh0ZW5zaW9ucy9WYWxpZGF0b3IvIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJKYXZhZG9jIiAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9qYXZhZG9jLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0KLSAgICA8bWVudSByZWY9InJlcG9ydHMiLz4KLQotICAgIDxtZW51IG5hbWU9IkZvdW5kYXRpb24iIGluaGVyaXQ9ImJvdHRvbSI+Ci0gICAgICA8aXRlbSBuYW1lPSJBU0YiICAgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlNwb25zb3JzaGlwIiAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9zcG9uc29yc2hpcC5odG1sIiAvPgotICAgICAgPGl0ZW0gbmFtZT0iVGhhbmtzIiAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3RoYW5rcy5odG1sIiAvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RjZThmYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+NjwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtbW9kdWxlPC9hcnRpZmFjdElkPg0KLSAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgTW9kdWxlPC9uYW1lPg0KLSAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMjwvdXJsPg0KLQ0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvPC9jb25uZWN0aW9uPg0KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rLzwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4NCi0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rLzwvdXJsPg0KLSAgICA8L3NjbT4NCi0NCi0gICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+DQotICAgICAgICA8c25hcHNob3RSZXBvc2l0b3J5Pg0KLSAgICAgICAgICAgIDx1bmlxdWVWZXJzaW9uPmZhbHNlPC91bmlxdWVWZXJzaW9uPg0KLSAgICAgICAgICAgIDxpZD5hcGFjaGUuc25hcHNob3RzPC9pZD4NCi0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgTWF2ZW4gU25hcHNob3QgUmVwb3NpdG9yeTwvbmFtZT4NCi0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4NCi0gICAgICAgIDwvc25hcHNob3RSZXBvc2l0b3J5Pg0KLSAgICAgICAgPHNpdGU+DQotICAgICAgICAgICAgPGlkPmFwYWNoZS1zaXRlPC9pZD4NCi0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMjwvdXJsPg0KLSAgICAgICAgPC9zaXRlPg0KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+DQotDQotICAgIDwhLS0gV0FSTklORzogRE8gTk9UIEdFTkVSQVRFIFNJVEUgRlJPTSBIRVJFIERJUkVDVExZDQotICAgIFNpbmNlIHRoaXMgcHJvamVjdCBoYXMgYW4gYXN5bmMgcmVsZWFzZSBwcm9jZWR1cmUgKG5vdA0KLSAgICBhbGwgbW9kdWxlcyBzaG91bGQgYmUgcmVsZWFzZWQgYXQgb25jZSksIHRoZSBwYXJlbnQgcG9tLnhtbCANCi0gICAgaXMgbm90IHRoaXMgKHRoZXJlIGlzIGEgbW9kdWxlIGZvciB0aGF0KS4gVXNlIG1hdmVuIHNpdGUgDQotICAgIHBsdWdpbiBoZXJlIGNhdXNlIHByb2JsZW1zIHdoZW4gdGhlIHNpdGUgaXMgZ2VuZXJhdGVkLg0KLSAgICBUaGUgcHJvY2VkdXJlIG11c3QgZXhlY3V0ZSBzaXRlIGNvbW1tYW5kIGZpcnN0IG9uIHBhcmVudCANCi0gICAgbW9kdWxlIGFuZCB0aGVuIG9uIGVhY2ggbW9kdWxlIGxpc3RlZCBiZWxvdy4gDQotICAgICAtLT4NCi0NCi0gICAgPG1vZHVsZXM+DQotICAgICAgICA8bW9kdWxlPnBhcmVudDwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5jb3JlPC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPnZhbGlkYXRpb24tbW9kdWxlczwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5jb21wb25lbnQtc3VwcG9ydDwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT50ZXN0LW1vZHVsZXM8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+ZXhhbXBsZXM8L21vZHVsZT4NCi0gICAgPC9tb2R1bGVzPg0KLQ0KLSAgICA8cHJvZmlsZXM+DQotICAgICAgICA8IS0tIFRoaXMgcHJvZmlsZSBpcyBpbnZva2VkIGJ5IC1EcHJlcGFyZVJlbGVhc2U9dHJ1ZS4gIFRoaXMgYWxsb3dzIG12biByZWxlYXNlOnByZXBhcmUgdG8NCi0gICAgICAgICAgICBydW4gc3VjY2Vzc2Z1bGx5IG9uIHRoZSBhc3NlbWJseSBwcm9qZWN0cy4gLS0+DQotICAgICAgICA8cHJvZmlsZT4NCi0gICAgICAgICAgICA8aWQ+cHJlcGFyZS1yZWxlYXNlPC9pZD4NCi0gICAgICAgICAgICA8YWN0aXZhdGlvbj4NCi0gICAgICAgICAgICAgICAgPHByb3BlcnR5Pg0KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+cHJlcGFyZVJlbGVhc2U8L25hbWU+DQotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPg0KLSAgICAgICAgICAgIDxtb2R1bGVzPg0KLSAgICAgICAgICAgICAgICA8bW9kdWxlPmFzc2VtYmx5PC9tb2R1bGU+DQotICAgICAgICAgICAgPC9tb2R1bGVzPg0KLSAgICAgICAgICAgIDxidWlsZD4NCi0gICAgICAgICAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnRzPi1EcHJlcGFyZVJlbGVhc2U8L2FyZ3VtZW50cz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPg0KLSAgICAgICAgICAgIDwvYnVpbGQ+DQotICAgICAgICA8L3Byb2ZpbGU+DQotICAgIDwvcHJvZmlsZXM+DQotDQotICAgIDxyZXBvcnRpbmc+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRvYXAtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGNhdGVnb3J5PndlYi1mcmFtZXdvcmssIHZhbGlkYXRpb248L2NhdGVnb3J5Pg0KLSAgICAgICAgICAgICAgICAgICAgPGxhbmd1YWdlPkphdmE8L2xhbmd1YWdlPg0KLSAgICAgICAgICAgICAgICAgICAgPHNob3J0ZGVzYz5KU0YgY2VudHJpYyB2YWxpZGF0aW9uIGZyYW1ld29yayBmb3IgbWV0YWRhdGEgYmFzZWQgdmFsaWRhdGlvbi48L3Nob3J0ZGVzYz4NCi0gICAgICAgICAgICAgICAgICAgIDxwbWM+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZzwvcG1jPg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvcmVwb3J0aW5nPg0KLQ0KLSAgICA8cHJvcGVydGllcz4NCi0gICAgICAgIDxqc2YudmVyc2lvbj4xLjIuNDwvanNmLnZlcnNpb24+DQotICAgIDwvcHJvcGVydGllcz4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3NpdGUvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9zaXRlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NjhlMDIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3NpdGUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgICAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICAgICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICAgICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgICAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gICAgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgICoKLSAgICAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gICAgKgotICAgICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj42PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1zaXRlPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3I8L25hbWU+Ci0gICAgPHVybD5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yPC91cmw+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxkZWZhdWx0R29hbD5zaXRlPC9kZWZhdWx0R29hbD4KLSAgICAgICAgPGV4dGVuc2lvbnM+Ci0gICAgICAgICAgPGV4dGVuc2lvbj4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ud2Fnb248L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD53YWdvbi1zc2gtZXh0ZXJuYWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtNTwvdmVyc2lvbj4KLSAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgPC9leHRlbnNpb25zPgotICAgIDwvYnVpbGQ+Ci0gICAgPHJlcG9ydGluZz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3QtaW5mby1yZXBvcnRzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9yZXBvcnRpbmc+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvc2l0ZTwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rL3NpdGU8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvc2l0ZTwvdXJsPgotICAgIDwvc2NtPgotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgICAgPHNpdGU+Ci0gICAgICAgIDxpZD5hcGFjaGUtc2l0ZTwvaWQ+Ci0gICAgICAgIDxuYW1lPkFwYWNoZSBXZWJzaXRlPC9uYW1lPgotICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3I8L3VybD4KLSAgICAgIDwvc2l0ZT4KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9zaXRlL3NyYy9zaXRlL2FwdC9kb3dubG9hZC5hcHQgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvc2l0ZS9zcmMvc2l0ZS9hcHQvZG93bmxvYWQuYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzUxNGUwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9zaXRlL3NyYy9zaXRlL2FwdC9kb3dubG9hZC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotIH5+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSB+fiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gfn4gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSB+fiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSB+fiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSB+fiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSB+fg0KLSB+fiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSB+fg0KLSB+fiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIH5+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotIH5+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSB+fiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIH5+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSANCi0gLS0tLS0tDQotRG93bmxvYWQgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi0gLS0tLS0tDQotDQotRG93bmxvYWQgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi0NCi0NCi0gIFVzZSB0aGUgbGlua3MgYmVsb3cgdG8gZG93bmxvYWQgYSBkaXN0cmlidXRpb24gb2YgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZnJvbQ0KLSAgb25lIG9mIG91ciBtaXJyb3JzLiBJdCBpcyBnb29kIHByYWN0aWNlIHRvIHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIHRoZQ0KLSAgZGlzdHJpYnV0aW9uIGZpbGVzLg0KLQ0KLSAgWW91IHdpbGwgYmUgcHJvbXB0ZWQgZm9yIGEgbWlycm9yIC0gaWYgdGhlIGZpbGUgaXMgbm90IGZvdW5kIG9uIHlvdXJzLCBwbGVhc2UgYmUgcGF0aWVudCwgYXMgaXQgbWF5IHRha2UgMjQNCi0gIGhvdXJzIHRvIHJlYWNoIGFsbCBtaXJyb3JzLg0KLQ0KLSAgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgZGlzdHJpYnV0ZWQgYXMgYSA8PDx6aXA+Pj4gYXJjaGl2ZSAoZm9yIFdpbmRvd3MpIGFuZA0KLSAgYXMgYSA8PDx0YXIuZ3o+Pj4gYXJjaGl2ZSAoZm9yIFVOSVgpLiBUaGUgY29udGVudCBpcyB0aGUgc2FtZS4gUGxlYXNlIG5vdGUNCi0gIHRoYXQgdGhlIDw8PHRhci5nej4+PiBhcmNoaXZlcyBjb250YWluIGZpbGUgbmFtZXMgbG9uZ2VyIHRoYW4gMTAwIGNoYXJhY3RlcnMgYW5kIGhhdmUgYmVlbg0KLSAgY3JlYXRlZCB1c2luZyBHTlUgdGFyIGV4dGVuc2lvbnMuIFRodXMgdGhleSBtdXN0IGJlIHVudGFycmVkIHdpdGggYSBHTlUgY29tcGF0aWJsZQ0KLSAgdmVyc2lvbiBvZiB0YXIuDQotDQotICA8PCBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciAxLjAuMCBEaXN0cmlidXRpb24gPj4NCi0NCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18ICAgICAgICAgICAgICAgICAgICAgICAgIHwgTWlycm9ycyB8IENoZWNrc3VtIHwgU2lnbmF0dXJlIHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjEgMS4xLjIgKHRhci5neikgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6fSBteWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi50YXIuZ3p9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6Lm1kNX0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6Lm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi50YXIuZ3ouYXNjfSBteWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi50YXIuZ3ouYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMSAxLjEuMiAoemlwKSAgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4uemlwfSBteWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi56aXB9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4uemlwLm1kNX0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4uemlwLm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi56aXAuYXNjfSBteWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi56aXAuYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMSAxLjEuMiBTb3VyY2UgKHRhci5neikgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnRhci5nen0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMudGFyLmd6fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy50YXIuZ3oubWQ1fSBteWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy50YXIuZ3oubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy50YXIuZ3ouYXNjfSBteWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy50YXIuZ3ouYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMSAxLjEuMiBTb3VyY2UgKHppcCkgICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy56aXB9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnppcH19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMuemlwLm1kNX0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMuemlwLm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMuemlwLmFzY30gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMuemlwLmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjIgMS4yLjIgKHRhci5neikgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4udGFyLmd6fSBteWZhY2VzLWV4dHZhbDEyLTEuMi4yLWJpbi50YXIuZ3p9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4udGFyLmd6Lm1kNX0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4udGFyLmd6Lm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDEyLTEuMi4yLWJpbi50YXIuZ3ouYXNjfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4yLWJpbi50YXIuZ3ouYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMiAxLjIuMiAoemlwKSAgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4uemlwfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4yLWJpbi56aXB9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4uemlwLm1kNX0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4uemlwLm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDEyLTEuMi4yLWJpbi56aXAuYXNjfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4yLWJpbi56aXAuYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMiAxLjIuMiBTb3VyY2UgKHRhci5neikgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnRhci5nen0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMudGFyLmd6fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy50YXIuZ3oubWQ1fSBteWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy50YXIuZ3oubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy50YXIuZ3ouYXNjfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy50YXIuZ3ouYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMiAxLjIuMiBTb3VyY2UgKHppcCkgICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy56aXB9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnppcH19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMuemlwLm1kNX0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMuemlwLm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMuemlwLmFzY30gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMuemlwLmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi0NCi1MYXRlc3Qgc291cmNlIGNvZGUgZnJvbSBTVk4gcmVwb3NpdG9yeQ0KLQ0KLSAgICBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIGxhdGVzdCBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmZWF0dXJlcywgdGhlIHNvdXJjZSBjb2RlIGlzIHVuZGVyDQotICAgIHZlcnNpb24gY29udHJvbCB3aXRoIFNWTi4gIENsaWNrIHt7e3NvdXJjZS1yZXBvc2l0b3J5Lmh0bWx9IGhlcmUgfX0NCi0gICAgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byB1c2UgdGhlIEFTRiBFeHRlbnNpb25zIFZhbGlkYXRvciBTVk4gUmVwb3NpdG9yeS4NCi0NCi1WZXJpZnlpbmcgY2hlY2tzdW1zDQotDQotICAgIEl0IGlzIGVzc2VudGlhbCB0aGF0IHlvdSB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGUgZG93bmxvYWRlZA0KLSAgICBmaWxlcyB1c2luZyB0aGUgUEdQIGFuZCBNRDUgc2lnbmF0dXJlcy4gTUQ1IHZlcmlmaWNhdGlvbiBlbnN1cmVzIHRoZQ0KLSAgICBmaWxlIHdhcyBub3QgY29ycnVwdGVkIGR1cmluZyB0aGUgZG93bmxvYWQgcHJvY2Vzcy4gUEdQIHZlcmlmaWNhdGlvbg0KLSAgICBlbnN1cmVzIHRoYXQgdGhlIGZpbGUgY2FtZSBmcm9tIGEgY2VydGFpbiBwZXJzb24uDQotDQotICAgIFRvIHZlcmlmeSB0aGUgTUQ1IHNpZ25hdHVyZSBvbiB0aGUgZmlsZXMsIHlvdSBuZWVkIHRvIHVzZSBhIHByb2dyYW0NCi0gICAgY2FsbGVkIDw8PG1kNT4+PiBvciA8PDxtZDVzdW0+Pj4sIHdoaWNoIGlzDQotICAgIGluY2x1ZGVkIGluIG1hbnkgVU5JWCBkaXN0cmlidXRpb25zLiAgSXQgaXMgYWxzbyBhdmFpbGFibGUgYXMgcGFydCBvZg0KLSAgICB7e3todHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvdGV4dHV0aWxzL3RleHR1dGlscy5odG1sfUdOVSBUZXh0dXRpbHN9fS4NCi0gICAgV2luZG93cyB1c2VycyBjYW4gZ2V0IGJpbmFyeSBtZDUgcHJvZ3JhbXMgZnJvbSB7e3todHRwOi8vd3d3LmZvdXJtaWxhYi5jaC9tZDUvfWhlcmV9fSwNCi0gICAge3t7aHR0cDovL3d3dy5wYy10b29scy5uZXQvd2luMzIvZnJlZXdhcmUvY29uc29sZS99aGVyZX19LCBvcg0KLSAgICB7e3todHRwOi8vd3d3LnNsYXZhc29mdC5jb20vZnN1bS99aGVyZX19Lg0KLQ0KLVZlcmlmeWluZyBzaWduYXR1cmVzDQotDQotICAJUEdQIHZlcmlmaWNhdGlvbiBlbnN1cmVzIHRoYXQgdGhlIGZpbGUgY2FtZSBmcm9tIGEgY2VydGFpbiBwZXJzb24uICBXZSBzdHJvbmdseSByZWNvbW1lbmQNCi0JICB5b3UgdmVyaWZ5IHlvdXIgZG93bmxvYWRzIHdpdGggYm90aCBQR1AgYW5kIE1ENS4NCi0NCi0JVGhlIFBHUCBzaWduYXR1cmVzIGNhbiBiZSB2ZXJpZmllZCB1c2luZyB7e3todHRwOi8vd3d3LnBncGkub3JnL31QR1B9fSBvciANCi0Je3t7aHR0cDovL3d3dy5nbnVwZy5vcmcvfUdQR319LiAgRmlyc3QgZG93bmxvYWQgdGhlIEFwYWNoZSBNeUZhY2VzIA0KLQl7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL0tFWVN9S0VZU319CWFzIHdlbGwgYXMgdGhlIDw8PGFzYz4+PiBzaWduYXR1cmUgZmlsZSANCi0JZm9yIHRoZSBwYXJ0aWN1bGFyIGRpc3RyaWJ1dGlvbi4gSXQgaXMgaW1wb3J0YW50IHRoYXQgeW91IGdldCB0aGVzZSBmaWxlcyBmcm9tIHRoZSB1bHRpbWF0ZQ0KLQl0cnVzdGVkIHNvdXJjZSAtIHRoZSBtYWluIEFTRiBkaXN0cmlidXRpb24gc2l0ZSwgcmF0aGVyIHRoYW4gZnJvbSBhIG1pcnJvci4NCi0JVGhlbiB2ZXJpZnkgdGhlIHNpZ25hdHVyZXMgdXNpbmcgLi4uDQotDQotCSAgPDw8DQotCSAgJSBwZ3BrIC1hIEtFWVMNCi0JICAlIHBncHYgbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6LmFzYyBteWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi50YXIuZ3oNCi0JICA+Pj4NCi0NCi0JICA8b3I+DQotDQotCSAgPDw8DQotCSAgJSBwZ3AgLWthIEtFWVMNCi0JICAlIHBncCBteWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi50YXIuZ3ouYXNjIG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5neg0KLQkgID4+Pg0KLQ0KLQkgIDxvcj4NCi0NCi0JICA8PDwNCi0gIAklIGdwZyAtLWltcG9ydCBLRVlTDQotCSAgJSBncGcgLS12ZXJpZnkgbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6LmFzYyBteWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi50YXIuZ3oNCi0JICA+Pj4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvc2l0ZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3NpdGUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyNTM5Yi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvc2l0ZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgYSBKU0YgY2VudHJpYyB2YWxpZGF0aW9uIGZyYW1ld29yay4NCi0gIA0KLSAgICBJdCBvZmZlcnMgcG93ZXJmdWwgYW5kIGVhc3kgdG8gdXNlIGZpZWxkIGJhc2VkIHZhbGlkYXRpb24gYmFzZWQgb24gYW5ub3RhdGlvbnMuDQotSXQgaGFzIGEgcGx1Z2dhYmxlIGFyY2hpdGVjdHVyZSwgc28gaXQgaXMgcG9zc2libGUgdG8gYWRkIG5ldyB2YWxpZGF0aW9uIG1vZHVsZXMgb3Igc3VwcG9ydCBmb3IgY29tcG9uZW50IGxpYnJhcmllcyBsaWtlIFRyaW5pZGFkIG9yIG90aGVyIDNyZCBwYXJ0eSBmcmFtZXdvcmtzLg0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS4xLnggYW5kIEpTRiAxLjIueC4gQm90aCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41Kw0KLQ0KLSAgICBGdXJ0aGVyIGluZm9ybWF0aW9uIGFyZSBhdmFpbGFibGUgYXQgdGhlIHt7e2h0dHA6Ly93aWtpLmFwYWNoZS5vcmcvbXlmYWNlcy9FeHRlbnNpb25zL1ZhbGlkYXRvci99V2lraX19LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My9zaXRlL3NyYy9zaXRlL3NpdGUueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3NpdGUvc3JjL3NpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYzllODUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3NpdGUvc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgbmFtZT0iQXBhY2hlIE15ZmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IiPgotICA8YmFubmVyTGVmdD4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRWYWw8L25hbWU+Ci0gICAgPHNyYz5pbWFnZXMvZXh0dmFsX2xvZ28ucG5nPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sPC9ocmVmPgotICA8L2Jhbm5lckxlZnQ+Ci0KLSAgPGJhbm5lclJpZ2h0PgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzPC9uYW1lPgotICAgIDxzcmM+aW1nL2Jhbm5lcnMvTXlGYWNlc19sb2dvLmpwZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbDwvaHJlZj4KLSAgPC9iYW5uZXJSaWdodD4gCi0KLSAgPHB1Ymxpc2hEYXRlIGZvcm1hdD0iZGQgTU1NIHl5eXkiLz4KLQotICA8c2tpbj4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1zaXRlLXNraW48L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9za2luPgotCi0gIDxib2R5PgotICAgIDxsaW5rcz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSIgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJNeUZhY2VzIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkRvd25sb2FkIE15ZmFjZXMgRXh0VmFsIiAgICAgICBocmVmPSJkb3dubG9hZC5odG1sIi8+Ci0gICAgPC9saW5rcz4KLQotICAgIDxtZW51IG5hbWU9IkFwYWNoZSBNeUZhY2VzIiBpbmhlcml0PSJ0b3AiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZG93bmxvYWQuaHRtbCIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IG5hbWU9IkNvbnRlbnRzIiBpbmhlcml0PSJ0b3AiPgotICAgICAgICA8aXRlbSBuYW1lPSJNYWluIFNpdGUiICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sIi8+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkV4dFZhbCBmb3IgSlNGIDEuMSIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExL2luZGV4Lmh0bWwiIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9ImR1bW15IiAgICAgICAgaHJlZj0iZHVtbXkiLz4KLSAgICAgICAgPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjIiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9pbmRleC5odG1sIiBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8aXRlbSBuYW1lPSJkdW1teSIgICAgICAgIGhyZWY9ImR1bW15Ii8+Ci0gICAgICAgIDwvaXRlbT4KLSAgICA8L21lbnU+Ci0KLSAgICA8bWVudSBuYW1lPSJEb2N1bWVudGF0aW9uIj4KLSAgICAgIDxpdGVtIG5hbWU9Ildpa2kiICAgICAgICAgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9teWZhY2VzL0V4dGVuc2lvbnMvVmFsaWRhdG9yLyIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IHJlZj0icmVwb3J0cyIvPgotCi0gICAgPG1lbnUgbmFtZT0iRm91bmRhdGlvbiIgaW5oZXJpdD0idG9wIj4KLSAgICAgIDxpdGVtIG5hbWU9IkFTRiIgICAgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIiAvPgotICAgICAgPGl0ZW0gbmFtZT0iU3BvbnNvcnNoaXAiICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3Nwb25zb3JzaGlwLmh0bWwiIC8+Ci0gICAgICA8aXRlbSBuYW1lPSJUaGFua3MiICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vdGhhbmtzLmh0bWwiIC8+Ci0gICAgPC9tZW51PgotICA8L2JvZHk+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9wb20ueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk5OTFiZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmU8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQmFzZS1UZXN0LUluZnJhc3RydWN0dXJlPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD50ZXN0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL0Fic3RyYWN0RXhWYWxUZXN0Q2FzZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL0Fic3RyYWN0RXhWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjI3YjE2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9BYnN0cmFjdEV4VmFsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLio7DQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5lbC5Nb2NrRXhwcmVzc2lvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrLio7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UudXRpbC5UZXN0VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkV4dFZhbFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5EZWZhdWx0RmFjdG9yeUZpbmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlByb2plY3RTdGFnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5BYnN0cmFjdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWRfaW1wbC5jb25maWcuTXlmYWNlc0NvbmZpZzsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY3RvcnlGaW5kZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlJbnB1dDsNCi1pbXBvcnQgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogQWJzdHJhY3QgU2hhbGUgVGVzdCBiYXNlIGNsYXNzLCB3aGljaCBzZXRzIHVwIHRoZSBKU0YgZW52aXJvbm1lbnQuICBJZiB0aGUgdGVzdA0KLSAqIG92ZXJyaWRlcyA8Y29kZT5zZXRVcCgpPC9jb2RlPiBhbmQvb3IgPGNvZGU+dGVhckRvd24oKTwvY29kZT4sIHRoZW4gdGhvc2UNCi0gKiBtZXRob2RzIGJ1dCBjYWxsIHRoZSBvdmVyd2l0dGVuIG1ldGhvZCB0byBpbnN1cmUgYSB2YWxpZCB0ZXN0IGVudmlyb25tZW50Lg0KLSAqLw0KLUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RXhWYWxUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlDQotew0KLSAgICBwcm90ZWN0ZWQgTW9ja0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uOw0KLSAgICBwcm90ZWN0ZWQgTW9ja1NlcnZsZXRDb25maWcgY29uZmlnOw0KLSAgICBwcm90ZWN0ZWQgTW9ja0V4dGVybmFsQ29udGV4dCBleHRlcm5hbENvbnRleHQ7DQotICAgIHByb3RlY3RlZCBNb2NrRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dDsNCi0gICAgcHJvdGVjdGVkIE1vY2tGYWNlc0NvbnRleHRGYWN0b3J5IGZhY2VzQ29udGV4dEZhY3Rvcnk7DQotICAgIHByb3RlY3RlZCBNb2NrTGlmZWN5Y2xlIGxpZmVjeWNsZTsNCi0gICAgcHJvdGVjdGVkIE1vY2tMaWZlY3ljbGVGYWN0b3J5IGxpZmVjeWNsZUZhY3Rvcnk7DQotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgcmVuZGVyS2l0Ow0KLSAgICBwcm90ZWN0ZWQgTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0Ow0KLSAgICBwcm90ZWN0ZWQgTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2U7DQotICAgIHByb3RlY3RlZCBNb2NrU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQ7DQotICAgIHByb3RlY3RlZCBNb2NrSHR0cFNlc3Npb24gc2Vzc2lvbjsNCi0gICAgcHJvdGVjdGVkIE1vY2tFeHByZXNzaW9uRmFjdG9yeSBleHByZXNzaW9uRmFjdG9yeTsNCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciB0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXI7DQotDQotICAgIC8qKiBSZXNwb25zZSBXcml0ZXIgKi8NCi0gICAgcHJpdmF0ZSBNb2NrUmVzcG9uc2VXcml0ZXIgd3JpdGVyOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIEFic3RyYWN0RXhWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgICAgICBhcHBsaWNhdGlvbiA9IG51bGw7DQotICAgICAgICBjb25maWcgPSBudWxsOw0KLSAgICAgICAgZXh0ZXJuYWxDb250ZXh0ID0gbnVsbDsNCi0gICAgICAgIGZhY2VzQ29udGV4dCA9IG51bGw7DQotICAgICAgICBmYWNlc0NvbnRleHRGYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIGxpZmVjeWNsZSA9IG51bGw7DQotICAgICAgICBsaWZlY3ljbGVGYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIHJlbmRlcktpdCA9IG51bGw7DQotICAgICAgICByZXF1ZXN0ID0gbnVsbDsNCi0gICAgICAgIHJlc3BvbnNlID0gbnVsbDsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0ID0gbnVsbDsNCi0gICAgICAgIHNlc3Npb24gPSBudWxsOw0KLSAgICAgICAgZXhwcmVzc2lvbkZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogIFNldHVwIHRoZSB0ZXN0IGVudmlyb25tZW50LCBpbmNsdWRpbmcgdGhlIGZvbGxvd2luZzoNCi0gICAgICogIDx1bD4NCi0gICAgICogIDxsaT5TZXQgdGhlIEFwcGxpY2F0aW9uIE1hcC48L2xpPg0KLSAgICAgKiAgPGxpPlNldCBhIHJlc3BvbnNlIHdyaXRlcjwvbGk+DQotICAgICAqICA8bGk+QWRkIFRvbWFoYXdrJ3MgcmVuZGVyZXJzIHRvIHRoZSBmYWNlcyBjb250ZXh0LjwvbGk+DQotICAgICAqICA8L3VsPg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHRocmVhZENvbnRleHRDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7DQotICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFswXSwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKSk7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dCA9IG5ldyBNb2NrU2VydmxldENvbnRleHQoKTsNCi0gICAgICAgIC8vZm9yIHRlc3RpbmcgdGhlIGZhbGxiYWNrDQotICAgICAgICAvL3NlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCArICIuREVBQ1RJVkFURV9FTF9SRVNPTFZFUiIsICJ0cnVlIik7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVggKyAiLkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkiLCBNb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihFeHRWYWxJbmZvcm1hdGlvbi5XRUJYTUxfUEFSQU1fUFJFRklYICsgIi5DVVNUT01fTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZIiwgTW9ja01lc3NhZ2VSZXNvbHZlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCArICIuQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZIiwgTW9ja01ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICBjb25maWcgPSBuZXcgTW9ja1NlcnZsZXRDb25maWcoc2VydmxldENvbnRleHQpOw0KLSAgICAgICAgc2Vzc2lvbiA9IG5ldyBNb2NrSHR0cFNlc3Npb24oKTsNCi0gICAgICAgIHNlc3Npb24uc2V0U2VydmxldENvbnRleHQoc2VydmxldENvbnRleHQpOw0KLSAgICAgICAgcmVxdWVzdCA9IG5ldyBNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0KHNlc3Npb24pOw0KLSAgICAgICAgcmVxdWVzdC5zZXRTZXJ2bGV0Q29udGV4dChzZXJ2bGV0Q29udGV4dCk7DQotICAgICAgICByZXNwb25zZSA9IG5ldyBNb2NrSHR0cFNlcnZsZXRSZXNwb25zZSgpOw0KLSAgICAgICAgRmFjdG9yeUZpbmRlci5yZWxlYXNlRmFjdG9yaWVzKCk7DQotICAgICAgICBGYWN0b3J5RmluZGVyLnNldEZhY3RvcnkoImphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeSIsIEV4dFZhbE1vY2tBcHBsaWNhdGlvbkZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIEZhY3RvcnlGaW5kZXIuc2V0RmFjdG9yeSgiamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHRGYWN0b3J5IiwgIm9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tGYWNlc0NvbnRleHRGYWN0b3J5Iik7DQotICAgICAgICBGYWN0b3J5RmluZGVyLnNldEZhY3RvcnkoImphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGVGYWN0b3J5IiwgIm9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tMaWZlY3ljbGVGYWN0b3J5Iik7DQotICAgICAgICBGYWN0b3J5RmluZGVyLnNldEZhY3RvcnkoImphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5IiwgIm9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tSZW5kZXJLaXRGYWN0b3J5Iik7DQotICAgICAgICBleHRlcm5hbENvbnRleHQgPSBuZXcgTW9ja0V4dGVybmFsQ29udGV4dChzZXJ2bGV0Q29udGV4dCwgcmVxdWVzdCwgcmVzcG9uc2UpOw0KLSAgICAgICAgbGlmZWN5Y2xlRmFjdG9yeSA9IChNb2NrTGlmZWN5Y2xlRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoImphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGVGYWN0b3J5Iik7DQotICAgICAgICBsaWZlY3ljbGUgPSAoTW9ja0xpZmVjeWNsZSlsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZSgiREVGQVVMVCIpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0RmFjdG9yeSA9IChNb2NrRmFjZXNDb250ZXh0RmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoImphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0RmFjdG9yeSIpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0ID0gKE1vY2tGYWNlc0NvbnRleHQpZmFjZXNDb250ZXh0RmFjdG9yeS5nZXRGYWNlc0NvbnRleHQoc2VydmxldENvbnRleHQsIHJlcXVlc3QsIHJlc3BvbnNlLCBsaWZlY3ljbGUpOw0KLSAgICAgICAgZXh0ZXJuYWxDb250ZXh0ID0gKE1vY2tFeHRlcm5hbENvbnRleHQpZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpOw0KLSAgICAgICAgVUlWaWV3Um9vdCByb290ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIHJvb3Quc2V0Vmlld0lkKCIvdmlld0lkIik7DQotICAgICAgICByb290LnNldFJlbmRlcktpdElkKCJIVE1MX0JBU0lDIik7DQotICAgICAgICBmYWNlc0NvbnRleHQuc2V0Vmlld1Jvb3Qocm9vdCk7DQotICAgICAgICBBcHBsaWNhdGlvbkZhY3RvcnkgYXBwbGljYXRpb25GYWN0b3J5ID0gKEFwcGxpY2F0aW9uRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoImphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeSIpOw0KLSAgICAgICAgYXBwbGljYXRpb24gPSAoTW9ja0FwcGxpY2F0aW9uKWFwcGxpY2F0aW9uRmFjdG9yeS5nZXRBcHBsaWNhdGlvbigpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0LnNldEFwcGxpY2F0aW9uKGFwcGxpY2F0aW9uKTsNCi0gICAgICAgIFJlbmRlcktpdEZhY3RvcnkgcmVuZGVyS2l0RmFjdG9yeSA9IChSZW5kZXJLaXRGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3RvcnkiKTsNCi0gICAgICAgIC8vV3JhcCByZW5kZXJlcnMgd2l0aCBwcm9wZXIgZXh2YWwgd3JhcHBlcg0KLSAgICAgICAgcmVuZGVyS2l0ID0gbmV3IERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpLmNyZWF0ZShuZXcgTW9ja1JlbmRlcktpdCgpKTsNCi0gICAgICAgIHJlbmRlcktpdEZhY3RvcnkuYWRkUmVuZGVyS2l0KCJIVE1MX0JBU0lDIiwgcmVuZGVyS2l0KTsNCi0NCi0gICAgICAgIC8vIGFkZGl0aW9uYWwgc2V0dXAgbm90IHByb3ZpZGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHNoYWxlIG1vY2sgc3R1ZmYNCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbk1hcCgpLnB1dChNeWZhY2VzQ29uZmlnLmNsYXNzLmdldE5hbWUoKSwgbmV3IE15ZmFjZXNDb25maWcoKSk7DQotICAgICAgICB3cml0ZXIgPSBuZXcgTW9ja1Jlc3BvbnNlV3JpdGVyKG5ldyBTdHJpbmdXcml0ZXIoKSwgbnVsbCwgbnVsbCk7DQotICAgICAgICBmYWNlc0NvbnRleHQuc2V0UmVzcG9uc2VXcml0ZXIod3JpdGVyKTsNCi0NCi0gICAgICAgIFRlc3RVdGlscy5hZGREZWZhdWx0UmVuZGVyZXJzKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBUZXN0VXRpbHMuYWRkRGVmYXVsdFZhbGlkYXRvcnMoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGV4cHJlc3Npb25GYWN0b3J5ID0gKE1vY2tFeHByZXNzaW9uRmFjdG9yeSlhcHBsaWNhdGlvbi5nZXRFeHByZXNzaW9uRmFjdG9yeSgpOw0KLQ0KLSAgICAgICAgZmluYWwgRUxIZWxwZXIgZGVmYXVsdEVsSGVscGVyID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRUxfSEVMUEVSX0ZBQ1RPUlksIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuc2V0Q3VzdG9tRUxIZWxwZXJGYWN0b3J5KG5ldyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeSgpIHsNCi0NCi0gICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBFTEhlbHBlciBjcmVhdGVFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2NrRUxIZWxwZXIoZGVmYXVsdEVsSGVscGVyKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSk7DQotDQotICAgICAgICAvL2V4ZWN1dGUgc3RhcnR1cCBsaXN0ZW5lcg0KLSAgICAgICAgbmV3IEV4dFZhbFN0YXJ0dXBMaXN0ZW5lcigpIHsNCi0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzg2MTgxMDYwNTE2MDI4MTg4NEw7DQotDQotICAgICAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShQcm9qZWN0U3RhZ2VSZXNvbHZlci5jbGFzcy5nZXROYW1lKCksIGdldFByb2plY3RTdGFnZVJlc29sdmVyKCksIGZhbHNlKTsNCi0gICAgICAgICAgICAgICAgc3VwZXIuaW5pdCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0uaW5pdCgpOw0KLQ0KLSAgICAgICAgaW52b2tlU3RhcnR1cExpc3RlbmVycygpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGludm9rZVN0YXJ0dXBMaXN0ZW5lcnMoKTsNCi0NCi0gICAgLyoqDQotICAgICAqIFRlYXIgZG93biB0aGUgdGVzdCBlbnZpcm9ubWVudC4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXNldEZhY3RvcnlGaW5kZXIoKTsNCi0gICAgICAgIHJlc2V0RXh0VmFsQ29udGV4dCgpOw0KLQ0KLSAgICAgICAgYXBwbGljYXRpb24gPSBudWxsOw0KLSAgICAgICAgY29uZmlnID0gbnVsbDsNCi0gICAgICAgIGV4dGVybmFsQ29udGV4dCA9IG51bGw7DQotICAgICAgICBmYWNlc0NvbnRleHQucmVsZWFzZSgpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0ID0gbnVsbDsNCi0gICAgICAgIGxpZmVjeWNsZSA9IG51bGw7DQotICAgICAgICBsaWZlY3ljbGVGYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIHJlbmRlcktpdCA9IG51bGw7DQotICAgICAgICByZXF1ZXN0ID0gbnVsbDsNCi0gICAgICAgIHJlc3BvbnNlID0gbnVsbDsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0ID0gbnVsbDsNCi0gICAgICAgIHNlc3Npb24gPSBudWxsOw0KLSAgICAgICAgRmFjdG9yeUZpbmRlci5yZWxlYXNlRmFjdG9yaWVzKCk7DQotICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcih0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIpOw0KLSAgICAgICAgZXhwcmVzc2lvbkZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgRmllbGQgZmFjdG9yeU1hcCA9IERlZmF1bHRGYWN0b3J5RmluZGVyLmNsYXNzLmdldERlY2xhcmVkRmllbGQoImZhY3RvcnlNYXAiKTsNCi0gICAgICAgICAgICBmYWN0b3J5TWFwLnNldEFjY2Vzc2libGUodHJ1ZSk7DQotICAgICAgICAgICAgZmFjdG9yeU1hcC5zZXQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpLCBuZXcgSGFzaE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4oKSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY2Fubm90IHJlc2V0IHRoZSBmYWN0b3J5IGZpbmRlciIsIHQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlc2V0RXh0VmFsQ29udGV4dCgpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZpZWxkIGNvbnRleHQgPSBFeHRWYWxDb250ZXh0LmNsYXNzLmdldERlY2xhcmVkRmllbGQoImV4dFZhbENvbnRleHQiKTsNCi0gICAgICAgICAgICBjb250ZXh0LnNldEFjY2Vzc2libGUodHJ1ZSk7DQotICAgICAgICAgICAgY29udGV4dC5zZXQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCksIG51bGwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbm5vdCByZXNldCB0aGUgZXh0dmFsLWNvbnRleHQiLCB0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja01lc3NhZ2VDb3VudChpbnQgZXhwZWN0ZWQpDQotICAgIHsNCi0gICAgICAgIGludCBpID0gMDsNCi0gICAgICAgIGZvcihJdGVyYXRvciBtZXNzYWdlcyA9IGZhY2VzQ29udGV4dC5nZXRNZXNzYWdlcygpOyBtZXNzYWdlcy5oYXNOZXh0KCk7KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1lc3NhZ2VzLm5leHQoKTsNCi0gICAgICAgICAgICBpKys7DQotICAgICAgICB9DQotDQotICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbXBsZXRlIG1lc3NhZ2UgY291bnQiLCBleHBlY3RlZCwgaSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tNZXNzYWdlQ291bnQoU3RyaW5nIGNsaWVudElkLCBpbnQgZXhwZWN0ZWQpDQotICAgIHsNCi0gICAgICAgIGludCBpID0gMDsNCi0gICAgICAgIGZvcihJdGVyYXRvciBtZXNzYWdlcyA9IGZhY2VzQ29udGV4dC5nZXRNZXNzYWdlcyhjbGllbnRJZCk7IG1lc3NhZ2VzLmhhc05leHQoKTspDQotICAgICAgICB7DQotICAgICAgICAgICAgbWVzc2FnZXMubmV4dCgpOw0KLSAgICAgICAgICAgIGkrKzsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGFzc2VydEVxdWFscygiQ29tcGxldGUgbWVzc2FnZSBjb3VudCIsIGV4cGVjdGVkLCBpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TZXZlcml0eS4uLiBzZXZlcml0aWVzKQ0KLSAgICB7DQotICAgICAgICBpbnQgaSA9IDA7DQotICAgICAgICBmb3IoSXRlcmF0b3IgbWVzc2FnZXMgPSBmYWNlc0NvbnRleHQuZ2V0TWVzc2FnZXMoKTsgbWVzc2FnZXMuaGFzTmV4dCgpOykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc2V2ZXJpdGllc1tpXSwgKChGYWNlc01lc3NhZ2UpbWVzc2FnZXMubmV4dCgpKS5nZXRTZXZlcml0eSgpKTsNCi0gICAgICAgICAgICBpKys7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoYm9vbGVhbiBpc0Jsb2NrZWQpDQotICAgIHsNCi0gICAgICAgIGFzc2VydEVxdWFscyhpc0Jsb2NrZWQsIHRoaXMuZmFjZXNDb250ZXh0LmdldFJlbmRlclJlc3BvbnNlKCkpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBWZXJpZnkgdGhlIGZvbGxvd2luZzoNCi0gICAgICogPHVsPg0KLSAgICAgKiA8bGk+aWQgaXMgbm90IG51bGw8L2xpPg0KLSAgICAgKiA8bGk+UmVzcG9uc2UgaXMgY29tcGxldGU8L2xpPg0KLSAgICAgKiA8bGk+UmVzcG9uY2UgY29udGFpbnMgdGhlIGlkPC9saT4NCi0gICAgICogPC91bD4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIGlkIElEIHRvIHZlcmlmeQ0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0SWRFeGlzdHMoU3RyaW5nIGlkKQ0KLSAgICB7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJJRCBpcyBub3QgbnVsbCIsIGlkKTsNCi0gICAgICAgIGFzc2VydFRydWUoIlJlc3BvbnNlIENvbXBsZXRlIiwgZmFjZXNDb250ZXh0LmdldFJlc3BvbnNlQ29tcGxldGUoKSk7DQotICAgICAgICBTdHJpbmcgb3V0cHV0ID0gd3JpdGVyLmdldFdyaXRlcigpLnRvU3RyaW5nKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJIYXMgb3V0cHV0Iiwgb3V0cHV0KTsNCi0gICAgICAgIGFzc2VydFRydWUoIkNvbnRhaW5zIGlkICciICsgaWQgKyAiJyIsIG91dHB1dC5pbmRleE9mKGlkKSAhPSAtMSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmFsdWVCaW5kaW5nKFVJSW5wdXQgdWlJbnB1dCwgU3RyaW5nIG5hbWUsIFN0cmluZyBleHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmcgdmFsdWVCaW5kaW5nID0gYXBwbGljYXRpb24uY3JlYXRlVmFsdWVCaW5kaW5nKGV4cHJlc3Npb24pOw0KLSAgICAgICAgVmFsdWVFeHByZXNzaW9uIHZhbHVlRXhwcmVzc2lvbiA9IGV4cHJlc3Npb25GYWN0b3J5LmNyZWF0ZVZhbHVlRXhwcmVzc2lvbigNCi0gICAgICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RUxDb250ZXh0KCksIGV4cHJlc3Npb24sIE9iamVjdC5jbGFzcyk7DQotDQotICAgICAgICBpZih1aUlucHV0ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdWlJbnB1dC5zZXRWYWx1ZUJpbmRpbmcobmFtZSwgdmFsdWVCaW5kaW5nKTsNCi0gICAgICAgICAgICB1aUlucHV0LnNldFZhbHVlRXhwcmVzc2lvbihuYW1lLCB2YWx1ZUV4cHJlc3Npb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKFN0cmluZyBuYW1lLCBPYmplY3QgaW5zdGFuY2UpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhudWxsLCAidmFsdWUiLCAiI3siICsgbmFtZSArICJ9Iik7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dChuYW1lLCBpbnN0YW5jZSk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiIsICJ1bmNoZWNrZWQifSkNCi0gICAgcHJvdGVjdGVkIDxUPiBUIHJlc29sdmVCZWFuKFN0cmluZyBuYW1lLCBDbGFzczxUPiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChUKSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4obmFtZSk7DQotICAgIH0NCi19DQotDQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9FeHRWYWxNb2NrQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI1YjNlMC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9FeHRWYWxNb2NrQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UubW9jazsKLQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbjsKLQotaW1wb3J0IGphdmF4LmVsLkVMQ29udGV4dExpc3RlbmVyOwotaW1wb3J0IGphdmF4LmVsLkVMUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXguZWwuRXhwcmVzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguZWwuRUxFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRWYWxNb2NrQXBwbGljYXRpb24gZXh0ZW5kcyBNb2NrQXBwbGljYXRpb24KLXsKLSAgICBwcml2YXRlIEFwcGxpY2F0aW9uIHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsTW9ja0FwcGxpY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEV4dFZhbE1vY2tBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IGFwcGxpY2F0aW9uOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFTENvbnRleHRMaXN0ZW5lcltdIGdldEVMQ29udGV4dExpc3RlbmVycygpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEVMQ29udGV4dExpc3RlbmVyWzBdOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFTFJlc29sdmVyIGdldEVMUmVzb2x2ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZC5nZXRFTFJlc29sdmVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEV4cHJlc3Npb25GYWN0b3J5IGdldEV4cHJlc3Npb25GYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRXh0VmFsTW9ja0V4cHJlc3Npb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBldmFsdWF0ZUV4cHJlc3Npb25HZXQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIGV4cHJlc3Npb24sIENsYXNzIGFDbGFzcykgdGhyb3dzIEVMRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5ldmFsdWF0ZUV4cHJlc3Npb25HZXQoZmFjZXNDb250ZXh0LCBleHByZXNzaW9uLCBhQ2xhc3MpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9FeHRWYWxNb2NrQXBwbGljYXRpb25GYWN0b3J5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9FeHRWYWxNb2NrQXBwbGljYXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjJjMzguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0FwcGxpY2F0aW9uRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICovCi1wdWJsaWMgY2xhc3MgRXh0VmFsTW9ja0FwcGxpY2F0aW9uRmFjdG9yeSBleHRlbmRzIE1vY2tBcHBsaWNhdGlvbkZhY3RvcnkKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxNb2NrQXBwbGljYXRpb24oc3VwZXIuZ2V0QXBwbGljYXRpb24oKSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL0V4dFZhbE1vY2tFeHByZXNzaW9uRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svRXh0VmFsTW9ja0V4cHJlc3Npb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NTgxMTYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svRXh0VmFsTW9ja0V4cHJlc3Npb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLm1vY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QuZWwuTW9ja0V4cHJlc3Npb25GYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0OwotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqLwotcHVibGljIGNsYXNzIEV4dFZhbE1vY2tFeHByZXNzaW9uRmFjdG9yeSBleHRlbmRzIE1vY2tFeHByZXNzaW9uRmFjdG9yeQotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWYWx1ZUV4cHJlc3Npb24gY3JlYXRlVmFsdWVFeHByZXNzaW9uKEVMQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgZXhwcmVzc2lvbiwgQ2xhc3MgZXhwZWN0ZWRUeXBlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uKGV4cHJlc3Npb24sIGV4cGVjdGVkVHlwZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL0V4dFZhbE1vY2tWYWx1ZUV4cHJlc3Npb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL0V4dFZhbE1vY2tWYWx1ZUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4MmQ4OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9FeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRXh0VmFsRUxSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QuZWwuTW9ja1ZhbHVlRXhwcmVzc2lvbjsKLQotaW1wb3J0IGphdmF4LmVsLkVMQ29udGV4dDsKLWltcG9ydCBqYXZheC5lbC5FTFJlc29sdmVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICovCi0vL1RPRE8gaW1wcm92ZQotcHVibGljIGNsYXNzIEV4dFZhbE1vY2tWYWx1ZUV4cHJlc3Npb24gZXh0ZW5kcyBNb2NrVmFsdWVFeHByZXNzaW9uCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBlbGVtZW50cyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZXhwcmVzc2lvbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTg1ODg3MTY1NDU2MTk0MjEwNDFMOwotCi0gICAgcHVibGljIEV4dFZhbE1vY2tWYWx1ZUV4cHJlc3Npb24oU3RyaW5nIGV4cHJlc3Npb24sIENsYXNzIGV4cGVjdGVkVHlwZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKGV4cHJlc3Npb24sIGV4cGVjdGVkVHlwZSk7Ci0KLSAgICAgICAgaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJFeHByZXNzaW9uIHN0cmluZyBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKLSAgICAgICAgcGFyc2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKEVMQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgRUxSZXNvbHZlciByZXNvbHZlciA9IGNvbnRleHQuZ2V0RUxSZXNvbHZlcigpOwotCi0gICAgICAgIGlmIChyZXNvbHZlciBpbnN0YW5jZW9mIEV4dFZhbEVMUmVzb2x2ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRCYXNlKGNvbnRleHQsIHJlc29sdmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRWYWx1ZShjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShFTENvbnRleHQgY29udGV4dCwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKGNvbnRleHQuZ2V0RUxSZXNvbHZlcigpIGluc3RhbmNlb2YgRXh0VmFsRUxSZXNvbHZlcikKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC5nZXRFTFJlc29sdmVyKCkuc2V0VmFsdWUoY29udGV4dCwgZ2V0VmFsdWUoY29udGV4dCksIGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBiYXNlID0gZ2V0QmFzZShjb250ZXh0LCBjb250ZXh0LmdldEVMUmVzb2x2ZXIoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgc2V0dGVyID0gInNldCIgKyBjcmVhdGVQcm9wZXJ0eVN0cmluZygpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNZXRob2Qgc2V0dGVyTWV0aG9kID0gYmFzZS5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKHNldHRlciwgdmFsdWUgIT0gbnVsbCA/IHZhbHVlLmdldENsYXNzKCkgOiBPYmplY3QuY2xhc3MpOwotICAgICAgICAgICAgICAgIHNldHRlck1ldGhvZC5pbnZva2UoYmFzZSwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKEVMQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgYmFzZSA9IGdldEJhc2UoY29udGV4dCwgY29udGV4dC5nZXRFTFJlc29sdmVyKCkpOwotCi0gICAgICAgIGlmIChiYXNlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGdldHRlciA9ICJnZXQiICsgY3JlYXRlUHJvcGVydHlTdHJpbmcoKTsKLQotICAgICAgICAgICAgTWV0aG9kIGdldHRlck1ldGhvZDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldHRlck1ldGhvZCA9IGJhc2UuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZChnZXR0ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiBnZXR0ZXJNZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldHRlciA9ICJpcyIgKyBjcmVhdGVQcm9wZXJ0eVN0cmluZygpOwotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBnZXR0ZXJNZXRob2QgPSBiYXNlLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2QoZ2V0dGVyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldHRlck1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZTEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlKCkKLSAgICB7Ci0KLSAgICAgICAgaWYgKGlzTGl0ZXJhbFRleHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZWxlbWVudHMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4cHJlc3Npb24uc3RhcnRzV2l0aCgiJHsiKSB8fCBleHByZXNzaW9uLnN0YXJ0c1dpdGgoIiN7IikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChleHByZXNzaW9uLmVuZHNXaXRoKCJ9IikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgZXhwciA9IG5ldyBTdHJpbmdCdWZmZXIoZXhwcmVzc2lvbi5zdWJzdHJpbmcoMiwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpLnJlcGxhY2VBbGwoIiAiLCAiIikpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNCbG9ja09uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGV4cHIubGVuZ3RoKCkgLSAxOyBpID4gLTE7IGktLSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChleHByLmNoYXJBdChpKSA9PSAnICcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZGVsZXRlQ2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4cHIuY2hhckF0KGkpID09ICddJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhwci5kZWxldGVDaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhwci5jaGFyQXQoaSkgPT0gJ1snKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHByLmRlbGV0ZUNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHByLmNoYXJBdChpKSA9PSAnXCcnKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQmxvY2tPbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLmRlbGV0ZUNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcy5hZGQoMCwgZXhwci5zdWJzdHJpbmcoaSArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLmRlbGV0ZShpLCBleHByLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlzQmxvY2tPbiA9ICFpc0Jsb2NrT247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhwci5jaGFyQXQoaSkgPT0gJy4nICYmICFpc0Jsb2NrT24pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZCgwLCBleHByLnN1YnN0cmluZyhpICsgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXhwci5kZWxldGUoaSwgZXhwci5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGV4cHIubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXMuYWRkKDAsIGV4cHIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZWxlbWVudHMgPSAoU3RyaW5nW10pIG5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tuYW1lcy5zaXplKCldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV4cHJlc3Npb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihleHByZXNzaW9uKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRCYXNlKEVMQ29udGV4dCBjb250ZXh0LCBFTFJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgT2JqZWN0IGJhc2UgPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aCAtIDE7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgYmFzZSA9IHJlc29sdmVyLmdldFZhbHVlKGNvbnRleHQsIGJhc2UsIGVsZW1lbnRzW2ldKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmFzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVQcm9wZXJ0eVN0cmluZygpCi0gICAgewotICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBlbGVtZW50c1tlbGVtZW50cy5sZW5ndGggLSAxXTsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEsIHByb3BlcnR5Lmxlbmd0aCgpKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svTW9ja0VMSGVscGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrRUxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGViMjFlMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrRUxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UubW9jazsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi0NCi1wdWJsaWMgY2xhc3MgTW9ja0VMSGVscGVyIGltcGxlbWVudHMgRUxIZWxwZXINCi17DQotICAgIHByaXZhdGUgRUxIZWxwZXIgd3JhcHBlZDsNCi0NCi0gICAgcHVibGljIE1vY2tFTEhlbHBlcihFTEhlbHBlciB3cmFwcGVkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmVhbihTdHJpbmcgYmVhbk5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldEJlYW4oYmVhbk5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBpZigiI3t0cnVlfSIuZXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFR5cGVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvcGVydHlEZXRhaWxzIGdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaXNFTFRlcm1WYWxpZChmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtV2VsbEZvcm1lZChPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaXNFTFRlcm1XZWxsRm9ybWVkKG8pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmluZGluZ09mQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0QmluZGluZ09mQ29tcG9uZW50KHVpQ29tcG9uZW50LCBuYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svTW9ja01lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q1Mzg5Yi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTW9ja01lc3NhZ2VSZXNvbHZlckZhY3RvcnkgZXh0ZW5kcyBEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeQ0KLXsNCi0gICAgcHVibGljIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXRSZWdpc3RlcmVkTmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TmFtZU1hcHBlckxpc3QoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL01vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTBkNWQ4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL01vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIE1vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSBleHRlbmRzIERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeQ0KLXsNCi0gICAgcHVibGljIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXRSZWdpc3RlcmVkTmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TmFtZU1hcHBlckxpc3QoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk2NDJiYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIE1vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5IGV4dGVuZHMgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGNyZWF0ZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIC8vZm9yY2UgaW5pdCBzbyB0aGF0IGV2ZXJ5IHRlc3QtY2FzZSBzZXR1cCBtZXRob2QgY2FuIGFkZCBhIG1vY2sgdmFsaWRhdGlvbiBzdHJhdGVneSB2aWEgZXh0dmFsIGphdmEtYXBpDQotICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodGhpcyxSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoZ2V0Q2xhc3MoKSwgImluaXRTdGF0aWNNYXBwaW5ncyIpKTsNCi0gICAgICAgIHJldHVybiBzdXBlci5jcmVhdGUobWV0YURhdGFLZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gZ2V0UmVnaXN0ZXJlZE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldE5hbWVNYXBwZXJMaXN0KCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvTWV0aG9kVXRpbHMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS91dGlsL01ldGhvZFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZjJlMjQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvTWV0aG9kVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UudXRpbDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotLy9UT0RPDQotcHVibGljIGNsYXNzIE1ldGhvZFV0aWxzDQotew0KLSAgICBwcml2YXRlIE1ldGhvZFV0aWxzKCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja01ldGhvZENhbGxlZChDbGFzcyB1c2VkQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBpbnQgY2FsbENvdW50KQ0KLSAgICB7DQotICAgICAgICBjaGVja1JlcXVpcmVkQ2xhc3ModXNlZENsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiBjYWxsQ291bnQgPT0gZ2V0TWV0aG9kQ2FsbENvdW50KHVzZWRDbGFzcywgbWV0aG9kTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWV0aG9kQ2FsbGVkKENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpDQotICAgIHsNCi0gICAgICAgIGNoZWNrUmVxdWlyZWRDbGFzcyh1c2VkQ2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkNCi0gICAgICAgICAgICAgICAgLmNvbnRhaW5zS2V5KHVzZWRDbGFzcy5nZXROYW1lKCkgKyAiIyIgKyBtZXRob2ROYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2lnbmFsTWV0aG9kQ2FsbGVkKENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIGludCBtZXRob2RDYWxsQ291bnQgPSAwOw0KLSAgICAgICAgU3RyaW5nIGtleSA9IHVzZWRDbGFzcy5nZXROYW1lKCkgKyAiIyIgKyBtZXRob2ROYW1lOw0KLQ0KLSAgICAgICAgaWYocmVxdWVzdE1hcC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGhvZENhbGxDb3VudCA9IChJbnRlZ2VyKXJlcXVlc3RNYXAuZ2V0KGtleSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXF1ZXN0TWFwLnB1dChrZXksICsrbWV0aG9kQ2FsbENvdW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TWV0aG9kQ2FsbENvdW50KENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIFN0cmluZyBrZXkgPSB1c2VkQ2xhc3MuZ2V0TmFtZSgpICsgIiMiICsgbWV0aG9kTmFtZTsNCi0NCi0gICAgICAgIGlmKHJlcXVlc3RNYXAuY29udGFpbnNLZXkoa2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKEludGVnZXIpcmVxdWVzdE1hcC5nZXQoa2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaWduYWxDbGFzc1VzZWQoQ2xhc3MgbW9ja0NsYXNzKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgICAgIC5wdXQobW9ja0NsYXNzLmdldE5hbWUoKSArICI6dXNlZCIsIHRydWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NsYXNzVXNlZChDbGFzcyBtb2NrQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgICAgIC5jb250YWluc0tleShtb2NrQ2xhc3MuZ2V0TmFtZSgpICsgIjp1c2VkIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1JlcXVpcmVkQ2xhc3MoQ2xhc3MgdXNlZENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzQ2xhc3NVc2VkKHVzZWRDbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbih1c2VkQ2xhc3MuZ2V0TmFtZSgpICsgIiBub3QgdXNlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS91dGlsL1Rlc3RVdGlscy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvVGVzdFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNGYxNDkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvVGVzdFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS51dGlsOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWNlc0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotcHVibGljIGZpbmFsIGNsYXNzIFRlc3RVdGlscw0KLXsNCi0gICAgLyoqIERlZmF1bHQgTG9nZ2VyICovDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUZXN0VXRpbHMuY2xhc3MpOw0KLQ0KLSAgICAvKiogdXRpbGl0eSBjbGFzcywgZG8gbm90IGluc3RhbnRpYXRlICovDQotICAgIHByaXZhdGUgVGVzdFV0aWxzKCkNCi0gICAgew0KLSAgICAgICAgLy8gdXRpbGl0eSBjbGFzcywgZGlzYWJsZSBpbnN0YW50aWF0aW9uDQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZERlZmF1bHRWYWxpZGF0b3JzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpDQotICAgIHsNCi0gICAgICAgIGFkZFZhbGlkYXRvcihmYWNlc0NvbnRleHQsImphdmF4LmZhY2VzLkRvdWJsZVJhbmdlIiwgImphdmF4LmZhY2VzLnZhbGlkYXRvci5Eb3VibGVSYW5nZVZhbGlkYXRvciIpOw0KLSAgICAgICAgYWRkVmFsaWRhdG9yKGZhY2VzQ29udGV4dCwiamF2YXguZmFjZXMuTGVuZ3RoIiwgImphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3IiKTsNCi0gICAgICAgIGFkZFZhbGlkYXRvcihmYWNlc0NvbnRleHQsImphdmF4LmZhY2VzLkxvbmdSYW5nZSIsICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTG9uZ1JhbmdlVmFsaWRhdG9yIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFZhbGlkYXRvcihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0b3JJZCwgU3RyaW5nIHZhbGlkYXRvckNsYXNzKQ0KLSAgICB7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5hZGRWYWxpZGF0b3IodmFsaWRhdG9ySWQsIHZhbGlkYXRvckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQWRkIGFsbCBvZiBKU0YgMS4yIGRlZmF1bHQgcmVuZGVyZXJzLiAgQ3VycmVudGx5IHRoaXMgaXMgbm90IHRpZWQgdG8NCi0gICAgICogZmFjZXMtY29uZmlnLnhtbCwgc28gYWxsIGNoYW5nZSB0byB0aGUgZmlsZSBNVVNUIGFsc28gYmUgbWFkZSBoZXJlLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0DQotICAgICAqIEB0b2RvIERvIG5vdCBhZGQgcmVuZGVyZXIgaWYgcmVuZGVyZXIgaXMgYWxyZWFkeSBhZGRlZC4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGREZWZhdWx0UmVuZGVyZXJzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpDQotICAgIHsNCi0gICAgICAgIC8vIFN0YW5kYXJkIEhUTUwgUmVuZGVyZXJzDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5Db21tYW5kIiwgImphdmF4LmZhY2VzLkJ1dHRvbiIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEJ1dHRvblJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RCb29sZWFuIiwNCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkNoZWNrYm94IiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sQ2hlY2tib3hSZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0TWFueSIsDQotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5DaGVja2JveCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbENoZWNrYm94UmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkZvcm0iLCAiamF2YXguZmFjZXMuRm9ybSIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEZvcm1SZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuUGFuZWwiLCAiamF2YXguZmFjZXMuR3JpZCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEdyaWRSZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuUGFuZWwiLCAiamF2YXguZmFjZXMuR3JvdXAiLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxHcm91cFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5IaWRkZW4iLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxIaWRkZW5SZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuR3JhcGhpYyIsICJqYXZheC5mYWNlcy5JbWFnZSIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEltYWdlUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5MYWJlbCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbExhYmVsUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5MaW5rIiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlua1JlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5Db21tYW5kIiwgImphdmF4LmZhY2VzLkxpbmsiLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMaW5rUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsDQotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5MaXN0Ym94IiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlzdGJveFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RNYW55IiwNCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkxpc3Rib3giLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMaXN0Ym94UmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsICJqYXZheC5mYWNlcy5NZW51IiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTWVudVJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RNYW55IiwgImphdmF4LmZhY2VzLk1lbnUiLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxNZW51UmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk1lc3NhZ2UiLCAiamF2YXguZmFjZXMuTWVzc2FnZSIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lc3NhZ2VSZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuT3V0cHV0IiwgImphdmF4LmZhY2VzLkZvcm1hdCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEZvcm1hdFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5NZXNzYWdlcyIsDQotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5NZXNzYWdlcyIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lc3NhZ2VzUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsICJqYXZheC5mYWNlcy5SYWRpbyIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFJhZGlvUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLklucHV0IiwgImphdmF4LmZhY2VzLlNlY3JldCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFNlY3JldFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5EYXRhIiwgImphdmF4LmZhY2VzLlRhYmxlIiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGFibGVSZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuSW5wdXQiLCAiamF2YXguZmFjZXMuVGV4dGFyZWEiLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxUZXh0YXJlYVJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5UZXh0IiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGV4dFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5PdXRwdXQiLCAiamF2YXguZmFjZXMuVGV4dCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFRleHRSZW5kZXJlciIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBZGQgYSByZW5kZXJlciB0byB0aGUgRmFjZXNDb250ZXh0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IEZhY2VzIENvbnRleHQNCi0gICAgICogQHBhcmFtIGZhbWlseSBDb21wb25lbmV0IEZhbWlseQ0KLSAgICAgKiBAcGFyYW0gcmVuZGVyZXJUeXBlIENvbXBvbmVudCBUeXBlDQotICAgICAqIEBwYXJhbSByZW5kZXJDbGFzc05hbWUgQ2xhc3MgTmFtZSBvZiBSZW5kZXJlcg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFJlbmRlcmVyKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBmYW1pbHksDQotICAgICAgICAgICAgU3RyaW5nIHJlbmRlcmVyVHlwZSwgU3RyaW5nIHJlbmRlckNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSAoUmVuZGVyZXIpIG5ld0luc3RhbmNlKHJlbmRlckNsYXNzTmFtZSk7DQotICAgICAgICBSZW5kZXJLaXQga2l0ID0gZmFjZXNDb250ZXh0LmdldFJlbmRlcktpdCgpOw0KLSAgICAgICAga2l0LmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCByZW5kZXJlcik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRyaWVzIGEgQ2xhc3MubG9hZENsYXNzIHdpdGggdGhlIGNvbnRleHQgY2xhc3MgbG9hZGVyIG9mIHRoZSBjdXJyZW50IHRocmVhZCBmaXJzdCBhbmQNCi0gICAgICogYXV0b21hdGljYWxseSBmYWxscyBiYWNrIHRvIHRoZSBDbGFzc1V0aWxzIGNsYXNzIGxvYWRlciAoaS5lLiB0aGUgbG9hZGVyIG9mIHRoZQ0KLSAgICAgKiBteWZhY2VzLmphciBsaWIpIGlmIG5lY2Vzc2FyeS4NCi0gICAgICoNCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMNCi0gICAgICoNCi0gICAgICogQHBhcmFtIHR5cGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBub24tcHJpbWl0aXZlIG5vbi1hcnJheSBjbGFzcw0KLSAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIENsYXNzDQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdHlwZSBpcyBudWxsDQotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgY2xhc3NGb3JOYW1lKFN0cmluZyB0eXBlKQ0KLSAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpDQotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0eXBlIik7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvLyBUcnkgV2ViQXBwIENsYXNzTG9hZGVyIGZpcnN0DQotICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUodHlwZSwgZmFsc2UsIC8vIGRvIG5vdCBpbml0aWFsaXplIGZvciBmYXN0ZXIgc3RhcnR1cA0KLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gZmFsbGJhY2s6IFRyeSBDbGFzc0xvYWRlciBmb3IgQ2xhc3NVdGlscyAoaS5lLiB0aGUgbXlmYWNlcy5qYXIgbGliKQ0KLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKHR5cGUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXANCi0gICAgICAgICAgICAgICAgICAgIFRlc3RVdGlscy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2FtZSBhcyB7QGxpbmsgI2NsYXNzRm9yTmFtZShTdHJpbmcpfSwgYnV0IHRocm93cyBhIFJ1bnRpbWVFeGNlcHRpb24NCi0gICAgICogKEZhY2VzRXhjZXB0aW9uKSBpbnN0ZWFkIG9mIGEgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi4NCi0gICAgICoNCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMNCi0gICAgICoNCi0gICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBDbGFzcw0KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHR5cGUgaXMgbnVsbA0KLSAgICAgKiBAdGhyb3dzIGphdmF4LmZhY2VzLkZhY2VzRXhjZXB0aW9uIGlmIGNsYXNzIG5vdCBmb3VuZA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3Mgc2ltcGxlQ2xhc3NGb3JOYW1lKFN0cmluZyB0eXBlKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY2xhc3NGb3JOYW1lKHR5cGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2cuZXJyb3IoIkNsYXNzICIgKyB0eXBlICsgIiBub3QgZm91bmQiLCBlKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3Mgd2l0aCB0aGUgdHlwZSBvZiA8Y29kZT50eXBlPC9jb2RlPi4NCi0gICAgICoNCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMNCi0gICAgICoNCi0gICAgICogQHBhcmFtIHR5cGUgVHlwZSBvZiBuZXcgY2xhc3MuDQotICAgICAqIEByZXR1cm4gSW5zdGFuY2Ugb2YgdGhlIGNsYXNzIDxjb2RlPnR5cGU8L2NvZGU+DQotICAgICAqIEB0aHJvd3MgamF2YXguZmFjZXMuRmFjZXNFeGNlcHRpb24NCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgdHlwZSkgdGhyb3dzIEZhY2VzRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpDQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2Uoc2ltcGxlQ2xhc3NGb3JOYW1lKHR5cGUpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyA8Y29kZT5jbGF6ejwvY29kZT4uDQotICAgICAqDQotICAgICAqIE5vdGU6IFRoaXMgd2FzIGNvcGllZCBmcm9tIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWQudXRpbC5DbGFzc1V0aWxzDQotICAgICAqDQotICAgICAqIEBwYXJhbSBjbGF6eiBDbGFzcyB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YuDQotICAgICAqIEByZXR1cm4gSW5zdGFuY2Ugb2YgdGhlIGNsYXNzIDxjb2RlPmNsYXp6PC9jb2RlPg0KLSAgICAgKiBAdGhyb3dzIGphdmF4LmZhY2VzLkZhY2VzRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoQ2xhc3MgY2xhenopIHRocm93cyBGYWNlc0V4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY2xhenoubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ2xhc3MgOiAiICsgY2xhenouZ2V0TmFtZSgpICsgIiBub3QgZm91bmQuIiwgZSk7DQotICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBGYWNlc0V4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJlbmRlcmVyZWQgYSBjb21wb25lbnQsIGluY2x1ZGluZyBpdCdzIGNoaWxkcmVuLCB0aGVuIGNvbXBsZXRlIHRoZSByZXBvbnNlLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gY29udGV4dCBGYWNlcyBDb250ZXh0DQotICAgICAqIEBwYXJhbSBjb21wb25lbnQgQ29tcG9uZW50IHRvIGJlIHJlbmRlcmVkLg0KLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gVGhyb3duIHdoaWxlIHJlbmRlcmluZy4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW5kZXJDb21wb25lbnQoRmFjZXNDb250ZXh0IGNvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSBjb250ZXh0LmdldFJlbmRlcktpdCgpLmdldFJlbmRlcmVyKA0KLSAgICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0RmFtaWx5KCksIGNvbXBvbmVudC5nZXRSZW5kZXJlclR5cGUoKSk7DQotICAgICAgICByZW5kZXJlci5lbmNvZGVCZWdpbihjb250ZXh0LCBjb21wb25lbnQpOw0KLSAgICAgICAgcmVuZGVyZXIuZW5jb2RlQ2hpbGRyZW4oY29udGV4dCwgY29tcG9uZW50KTsNCi0gICAgICAgIHJlbmRlcmVyLmVuY29kZUVuZChjb250ZXh0LCBjb21wb25lbnQpOw0KLSAgICAgICAgY29udGV4dC5yZXNwb25zZUNvbXBsZXRlKCk7DQotICAgICAgICBjb250ZXh0LnJlbmRlclJlc3BvbnNlKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNjE4MmMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbi10ZXN0czwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBCZWFuLVZhbGlkYXRpb24tSW50ZWdyYXRpb24tVGVzdHM8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPnRlc3QtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8cmVwb3NpdG9yaWVzPg0KLSAgICAgICAgPHJlcG9zaXRvcnk+DQotICAgICAgICAgICAgPGlkPmpib3NzPC9pZD4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvc2l0b3J5Lmpib3NzLmNvbS9tYXZlbjI8L3VybD4NCi0gICAgICAgICAgICA8cmVsZWFzZXM+DQotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+DQotICAgICAgICAgICAgPC9yZWxlYXNlcz4NCi0gICAgICAgICAgICA8c25hcHNob3RzPg0KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4NCi0gICAgICAgICAgICA8L3NuYXBzaG90cz4NCi0gICAgICAgIDwvcmVwb3NpdG9yeT4NCi0gICAgICAgIDxyZXBvc2l0b3J5Pg0KLSAgICAgICAgICAgIDxpZD5qYm9zcy1zbmFwc2hvdDwvaWQ+DQotICAgICAgICAgICAgPHVybD5odHRwOi8vc25hcHNob3RzLmpib3NzLm9yZy9tYXZlbjI8L3VybD4NCi0gICAgICAgICAgICA8cmVsZWFzZXM+DQotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+DQotICAgICAgICAgICAgPC9yZWxlYXNlcz4NCi0gICAgICAgICAgICA8c25hcHNob3RzPg0KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPg0KLSAgICAgICAgICAgIDwvc25hcHNob3RzPg0KLSAgICAgICAgPC9yZXBvc2l0b3J5Pg0KLSAgICA8L3JlcG9zaXRvcmllcz4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnZhbGlkYXRpb248L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjAuR0E8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlLXRlc3RzPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5oaWJlcm5hdGU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGliZXJuYXRlLXZhbGlkYXRvcjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj40LjAuMC5HQTwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS40LjI8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjQuMjwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThjNGI3ZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQWJzdHJhY3RCZWFuVmFsaWRhdGlvblRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLkFic3RyYWN0RXhWYWxUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RhcnR1cC5CZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5Nb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLQ0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdEJlYW5WYWxpZGF0aW9uVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBBYnN0cmFjdEJlYW5WYWxpZGF0aW9uVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGludm9rZVN0YXJ0dXBMaXN0ZW5lcnMoKQ0KLSAgICB7DQotICAgICAgICBuZXcgQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXIoKSB7DQotDQotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTMxMjQxODIzNTU0NDQ3NTQ0OTdMOw0KLQ0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgc3VwZXIuaW5pdCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0uaW5pdCgpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24oKQ0KLSAgICB7DQotICAgICAgICBuZXcgTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcigpLmFmdGVyUGhhc2UobmV3IFBoYXNlRXZlbnQoZmFjZXNDb250ZXh0LCBQaGFzZUlkLlVQREFURV9NT0RFTF9WQUxVRVMsIGxpZmVjeWNsZSkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9CYXNlQmVhblZhbFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGFhMzFkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9CYXNlQmVhblZhbFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuU2luZ2xlVmlvbGF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJSW5wdXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTxUPiBleHRlbmRzIEFic3RyYWN0QmVhblZhbGlkYXRpb25UZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDMgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgICAgICBiZWFuID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICBwcm90ZWN0ZWQgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICBwcm90ZWN0ZWQgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDMgPSBudWxsOw0KLQ0KLSAgICBwcml2YXRlIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHByb3RlY3RlZCBUIGJlYW47DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgYmVhbiA9IGdldEJlYW5Ub1Rlc3QoKTsNCi0gICAgICAgIGJpbmRCZWFuVG9FeHByZXNzaW9uKCk7DQotDQotICAgICAgICBjcmVhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgU2luZ2xlVmlvbGF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbXBvbmVudHMoKQ0KLSAgICB7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsNCi0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsNCi0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MyA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Myk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0SWQoImlucHV0MSIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50My5zZXRJZCgiaW5wdXQzIik7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQ0KLSAgICBwcml2YXRlIHZvaWQgYmluZEJlYW5Ub0V4cHJlc3Npb24oKQ0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmcgdmIgPSBhcHBsaWNhdGlvbi5jcmVhdGVWYWx1ZUJpbmRpbmcoIiN7dGVzdEJlYW59Iik7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dCgidGVzdEJlYW4iLCBiZWFuKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVCBnZXRCZWFuVG9UZXN0KCk7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQzID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgYmVhbiA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KFVJSW5wdXQgdWlDb21wb25lbnQsIFN0cmluZyB2YWx1ZUJpbmRpbmcpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyh1aUNvbXBvbmVudCwgInZhbHVlIiwgdmFsdWVCaW5kaW5nKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZVRvVmFsaWRhdGUoVUlJbnB1dCB1aUNvbXBvbmVudCwgU3RyaW5nIHZhbHVlVG9WYWxpZGF0ZSkNCi0gICAgew0KLSAgICAgICAgdWlDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVUb1ZhbGlkYXRlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbXBvbmVudHMoKQ0KLSAgICB7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEucHJvY2Vzc1ZhbGlkYXRvcnMoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5wcm9jZXNzVmFsaWRhdG9ycyhmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQzLnByb2Nlc3NWYWxpZGF0b3JzKGZhY2VzQ29udGV4dCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29tcG9uZW50cygpDQotICAgIHsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5wcm9jZXNzVXBkYXRlcyhmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnByb2Nlc3NVcGRhdGVzKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDMucHJvY2Vzc1VwZGF0ZXMoZmFjZXNDb250ZXh0KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRDb21wb25lbnRWYWxpZChVSUlucHV0IHVpSW5wdXQpDQotICAgIHsNCi0gICAgICAgIGFzc2VydFRydWUoaXNDb21wb25lbnRWYWxpZCh1aUlucHV0KSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Q29tcG9uZW50SW52YWxpZChVSUlucHV0IHVpSW5wdXQpDQotICAgIHsNCi0gICAgICAgIGFzc2VydEZhbHNlKGlzQ29tcG9uZW50VmFsaWQodWlJbnB1dCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbXBvbmVudFZhbGlkKFVJSW5wdXQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudC5pc1ZhbGlkKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb24xVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Db25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uMVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjE1ZmIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb24xVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLkNvbnN0cmFpbnRTb3VyY2VBd2FyZTFCZWFuOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogRVhUVkFMLTgzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjFUZXN0Q2FzZSBleHRlbmRzIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8Q29uc3RyYWludFNvdXJjZUF3YXJlMUJlYW4+DQotew0KLSAgICBwdWJsaWMgQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjFUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjFUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIENvbnN0cmFpbnRTb3VyY2VBd2FyZTFCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IENvbnN0cmFpbnRTb3VyY2VBd2FyZTFCZWFuKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEltcGxlY2l0RmllbGRNYXBwaW5nKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsZWNpdE1ldGhvZE1hcHBpbmcoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb24yVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Db25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uMlRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNDkzMGYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb24yVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLkNvbnN0cmFpbnRTb3VyY2VBd2FyZTJCZWFuOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogRVhUVkFMLTgzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjJUZXN0Q2FzZSBleHRlbmRzIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8Q29uc3RyYWludFNvdXJjZUF3YXJlMkJlYW4+DQotew0KLSAgICBwdWJsaWMgQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjJUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjJUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIENvbnN0cmFpbnRTb3VyY2VBd2FyZTJCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IENvbnN0cmFpbnRTb3VyY2VBd2FyZTJCZWFuKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdElnbm9yZUNvbnN0cmFpbnRTb3VyY2UoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQmFzZWRUYXJnZXRQcm9wZXJ0eSgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjNUZXN0Q2FzZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb24zVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJhNGI5ZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjNUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuQ29uc3RyYWludFNvdXJjZUF3YXJlM0JlYW47DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBFWFRWQUwtODMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBDb25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uM1Rlc3RDYXNlIGV4dGVuZHMgQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTxDb25zdHJhaW50U291cmNlQXdhcmUzQmVhbj4NCi17DQotICAgIHB1YmxpYyBDb25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uM1Rlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShDb25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uM1Rlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgQ29uc3RyYWludFNvdXJjZUF3YXJlM0JlYW4gZ2V0QmVhblRvVGVzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgQ29uc3RyYWludFNvdXJjZUF3YXJlM0JlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ0Jhc2VkQ29uc3RyYWludFNvdXJjZSgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWVsZEJhc2VkQ29uc3RyYWludFNvdXJjZSgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjRUZXN0Q2FzZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb240VGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMxYjdlYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjRUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuQ29uc3RyYWludFNvdXJjZUF3YXJlNEJlYW47DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBFWFRWQUwtODMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBDb25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uNFRlc3RDYXNlIGV4dGVuZHMgQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTxDb25zdHJhaW50U291cmNlQXdhcmU0QmVhbj4NCi17DQotICAgIHB1YmxpYyBDb25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uNFRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShDb25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uNFRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgQ29uc3RyYWludFNvdXJjZUF3YXJlNEJlYW4gZ2V0QmVhblRvVGVzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgQ29uc3RyYWludFNvdXJjZUF3YXJlNEJlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kQmFzZWRDb25zdHJhaW50U291cmNlQW5kVGFyZ2V0UHJvcGVydHlBbm5vdGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nQmFzZWRDb25zdHJhaW50U291cmNlKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb241VGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Db25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uNVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZTU0NjAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb241VGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLkNvbnN0cmFpbnRTb3VyY2VBd2FyZTVCZWFuOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogRVhUVkFMLTgzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjVUZXN0Q2FzZSBleHRlbmRzIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8Q29uc3RyYWludFNvdXJjZUF3YXJlNUJlYW4+DQotew0KLSAgICBwdWJsaWMgQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjVUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjVUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIENvbnN0cmFpbnRTb3VyY2VBd2FyZTVCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IENvbnN0cmFpbnRTb3VyY2VBd2FyZTVCZWFuKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZEJhc2VkVGFyZ2V0UHJvcGVydHlJZEFubm90YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEZpZWxkQmFzZWRUYXJnZXRQcm9wZXJ0eUlkQW5ub3RhdGlvbigpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjZUZXN0Q2FzZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb242VGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBjMDYxYi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjZUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLkNvbnN0cmFpbnRTb3VyY2VBd2FyZTZCZWFuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLmN1c3RvbS5DdXN0b21Db25zdHJhaW50U291cmNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLmN1c3RvbS5DdXN0b21JZ25vcmVDb25zdHJhaW50U291cmNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLmN1c3RvbS5DdXN0b21UYXJnZXRQcm9wZXJ0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5jdXN0b20uQ3VzdG9tVGFyZ2V0UHJvcGVydHlJZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5Db25zdHJhaW50U291cmNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLklnbm9yZUNvbnN0cmFpbnRTb3VyY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uVGFyZ2V0UHJvcGVydHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uVGFyZ2V0UHJvcGVydHlJZDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEVYVFZBTC04Mw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIENvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb242VGVzdENhc2UgZXh0ZW5kcyBCYXNlQmVhblZhbFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlPENvbnN0cmFpbnRTb3VyY2VBd2FyZTZCZWFuPg0KLXsNCi0gICAgcHVibGljIENvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb242VGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKENvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb242VGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBDb25zdHJhaW50U291cmNlQXdhcmU2QmVhbiBnZXRCZWFuVG9UZXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBDb25zdHJhaW50U291cmNlQXdhcmU2QmVhbigpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQgZXh0VmFsQ29udGV4dCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpOw0KLQ0KLSAgICAgICAgZXh0VmFsQ29udGV4dC5hZGRHbG9iYWxQcm9wZXJ0eShDb25zdHJhaW50U291cmNlLmNsYXNzLmdldE5hbWUoKSwgQ3VzdG9tQ29uc3RyYWludFNvdXJjZS5jbGFzcyk7DQotICAgICAgICBleHRWYWxDb250ZXh0LmFkZEdsb2JhbFByb3BlcnR5KElnbm9yZUNvbnN0cmFpbnRTb3VyY2UuY2xhc3MuZ2V0TmFtZSgpLCBDdXN0b21JZ25vcmVDb25zdHJhaW50U291cmNlLmNsYXNzKTsNCi0gICAgICAgIGV4dFZhbENvbnRleHQuYWRkR2xvYmFsUHJvcGVydHkoVGFyZ2V0UHJvcGVydHkuY2xhc3MuZ2V0TmFtZSgpLCBDdXN0b21UYXJnZXRQcm9wZXJ0eS5jbGFzcyk7DQotICAgICAgICBleHRWYWxDb250ZXh0LmFkZEdsb2JhbFByb3BlcnR5KFRhcmdldFByb3BlcnR5SWQuY2xhc3MuZ2V0TmFtZSgpLCBDdXN0b21UYXJnZXRQcm9wZXJ0eUlkLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQW5ub3RhdGlvbnMxKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21Bbm5vdGF0aW9uczIoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUFubm90YXRpb25zMygpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MywgIiN7dGVzdEJlYW4ucHJvcGVydHkzfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQzLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQzKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9DdXN0b21TZXZlcml0eTFUZXN0Q2FzZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0N1c3RvbVNldmVyaXR5MVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZGVhZTAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0N1c3RvbVNldmVyaXR5MVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52aWV3LkN1c3RvbVNldmVyaXR5VGVzdENhc2UxUGFnZUJlYW47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwuY3VzdG9tLkN1c3RvbVZpb2xhdGlvblNldmVyaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLlZpb2xhdGlvblNldmVyaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi1wdWJsaWMgY2xhc3MgQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UgZXh0ZW5kcyBCYXNlQmVhblZhbFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlPEN1c3RvbVNldmVyaXR5VGVzdENhc2UxUGFnZUJlYW4+DQotew0KLSAgICBwdWJsaWMgQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEN1c3RvbVNldmVyaXR5MVRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgQ3VzdG9tU2V2ZXJpdHlUZXN0Q2FzZTFQYWdlQmVhbiBnZXRCZWFuVG9UZXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBDdXN0b21TZXZlcml0eVRlc3RDYXNlMVBhZ2VCZWFuKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbVBheWxvYWRWaWFHbG9iYWxQcm9wZXJ0eSgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzLmdldE5hbWUoKSwgQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHkuV2FybmluZy5jbGFzcyk7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21QYXlsb2FkVmlhU3RhdGljQ29uZmlnKCkNCi0gICAgew0KLSAgICAgICAgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgIGNvbmZpZy5hZGRNYXBwaW5nKFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MuZ2V0TmFtZSgpLCBDdXN0b21WaW9sYXRpb25TZXZlcml0eS5XYXJuaW5nLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuVkFMSURBVElPTl9QQVJBTUVURVJfQ09ORklHLCBjb25maWcpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5rbm93blBheWxvYWQoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0RlZmF1bHRHcm91cFRlc3RDYXNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvRGVmYXVsdEdyb3VwVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmM2M2MS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvRGVmYXVsdEdyb3VwVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuVGVzdENhc2UxQmVhbjsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEdyb3VwVGVzdENhc2UgZXh0ZW5kcyBCYXNlQmVhblZhbFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlPFRlc3RDYXNlMUJlYW4+DQotew0KLSAgICBwdWJsaWMgRGVmYXVsdEdyb3VwVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKERlZmF1bHRHcm91cFRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgVGVzdENhc2UxQmVhbiBnZXRCZWFuVG9UZXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0Q2FzZTFCZWFuKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE5vdE51bGxTZXZlcml0eUVycm9yKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb3ROdWxsU2V2ZXJpdHlXYXJuKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V2ZXJpdHlPcmRlcigpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ucHJvcGVydHkzfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiYWIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDIpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTGFiZWxSZXBsYWNlbWVudFRlc3RDYXNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTGFiZWxSZXBsYWNlbWVudFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYzVlM2IuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0xhYmVsUmVwbGFjZW1lbnRUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5UZXN0Q2FzZTFCZWFuOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBMYWJlbFJlcGxhY2VtZW50VGVzdENhc2UgZXh0ZW5kcyBCYXNlQmVhblZhbFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlPFRlc3RDYXNlMUJlYW4+DQotew0KLSAgICBwdWJsaWMgTGFiZWxSZXBsYWNlbWVudFRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShMYWJlbFJlcGxhY2VtZW50VGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBUZXN0Q2FzZTFCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RDYXNlMUJlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGFiZWxSZXBsYWNlbWVudCgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBsYWJlbFRleHQgPSAicHJvcGVydHkxIjsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgdGhpcy5pbnB1dENvbXBvbmVudDEuc2V0TGFiZWwobGFiZWxUZXh0KTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSAoKEZhY2VzTWVzc2FnZSlmYWNlc0NvbnRleHQuZ2V0TWVzc2FnZXMoKS5uZXh0KCkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLnN0YXJ0c1dpdGgobGFiZWxUZXh0KSk7DQotICAgICAgICBhc3NlcnRUcnVlKGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKS5zdGFydHNXaXRoKGxhYmVsVGV4dCkpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24xVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24xVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcyZDE1My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uMVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52aWV3Lk1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLlNpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbjsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi1wdWJsaWMgY2xhc3MgTW9kZWxWYWxpZGF0aW9uMVRlc3RDYXNlIGV4dGVuZHMNCi0gICAgICAgIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8TW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4+DQotew0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uMVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShNb2RlbFZhbGlkYXRpb24xVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbiBnZXRCZWFuVG9UZXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFZhbGlkYXRpb24oKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMS5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIxMjMiKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwxLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIjEyMyIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICB1cGRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxWaW9sYXRpb25XaXRoR2xvYmFsVmlvbGF0aW9uTWVzc2FnZVZpYVByb3BlcnR5KCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDEucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiMTIzIik7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMS5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICI0NTYiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgdXBkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxWaW9sYXRpb25XaXRoSW5saW5lVmlvbGF0aW9uTWVzc2FnZVZpYVByb3BlcnR5KCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDIucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiMTIzIik7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMi5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICI0NTYiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgdXBkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgLy9kdWUgdG8gZGlzcGxheU1lc3NhZ2VJbmxpbmUNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDIpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmlvbGF0aW9uV2l0aEdsb2JhbFZpb2xhdGlvbk1lc3NhZ2VWaWFGaWVsZCgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwzLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIjEyMyIpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDMucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiNDU2Iik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHVwZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmlvbGF0aW9uV2l0aElubGluZVZpb2xhdGlvbk1lc3NhZ2VWaWFGaWVsZCgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWw0LnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIjEyMyIpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiNDU2Iik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHVwZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIC8vZHVlIHRvIGRpc3BsYXlNZXNzYWdlSW5saW5lDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgyKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFZpb2xhdGlvbldpdGhBZG1pblJvbGUoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVSZXF1ZXN0U2NvcGVkQmVhbigiY3VycmVudFVzZXIiLCBuZXcgU2ltdWxhdGVkVXNlckluZm9ybWF0aW9uKCJhZG1pbiIpKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWw1LnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIjEyMyIpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDUucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiNDU2Iik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHVwZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFZpb2xhdGlvbldpdGhVc2VyUm9sZSgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJjdXJyZW50VXNlciIsIG5ldyBTaW11bGF0ZWRVc2VySW5mb3JtYXRpb24oInVzZXIiKSk7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsNS5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIxMjMiKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWw1LnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIjQ1NiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICB1cGRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24yVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24yVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM0MTI1ZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uMlRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXcuTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW47DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvbjJUZXN0Q2FzZSBleHRlbmRzDQotICAgICAgICBCYXNlQmVhblZhbFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlPE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuPg0KLXsNCi0gICAgcHVibGljIE1vZGVsVmFsaWRhdGlvbjJUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTW9kZWxWYWxpZGF0aW9uMlRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4gZ2V0QmVhblRvVGVzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxWYWxpZGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbC5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIxMjMiKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiMTIzIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHVwZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFZpb2xhdGlvbldpdGhHbG9iYWxWaW9sYXRpb25NZXNzYWdlQ2xhc3NMZXZlbCgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiMTIzIik7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIjQ1NiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICB1cGRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24zVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24zVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhMzZlNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uM1Rlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXcuTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UzUGFnZUJlYW47DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb24zVGVzdENhc2UgZXh0ZW5kcw0KLSAgICAgICAgQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTxNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTNQYWdlQmVhbj4NCi17DQotICAgIHB1YmxpYyBNb2RlbFZhbGlkYXRpb24zVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKE1vZGVsVmFsaWRhdGlvbjNUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlM1BhZ2VCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlM1BhZ2VCZWFuKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmFsaWRhdGlvbk5vVmlld0lkTWF0Y2goKQ0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZSgpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmFsaWRhdGlvblZpZXdJZE1hdGNoKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuc2V0Vmlld0lkKCIvcGFnZXMvbW9kZWxWYWxpZGF0aW9uQXdhcmVQYWdlLnhodG1sIik7DQotDQotICAgICAgICB2YWxpZGF0ZSgpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIjEyMyIpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbC5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICI0NTYiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgdXBkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbigpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb240VGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb240VGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBkMzM3OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uNFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXcuTW9kZWxWYWxpZGF0aW9uVGVzdENhc2U0UGFnZUJlYW47DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb240VGVzdENhc2UgZXh0ZW5kcw0KLSAgICAgICAgQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTxNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTRQYWdlQmVhbj4NCi17DQotICAgIHB1YmxpYyBNb2RlbFZhbGlkYXRpb240VGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKE1vZGVsVmFsaWRhdGlvbjRUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlNFBhZ2VCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlNFBhZ2VCZWFuKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmFsaWRhdGlvbk5vVmlld0lkTWF0Y2goKQ0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZSgpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmFsaWRhdGlvblZpZXdJZE1hdGNoKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuc2V0Vmlld0lkKCIvcGFnZXMvbW9kZWxWYWxpZGF0aW9uQXdhcmVQYWdlLnhodG1sIik7DQotDQotICAgICAgICB2YWxpZGF0ZSgpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIjEyMyIpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbC5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICI0NTYiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgdXBkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbigpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9SZXN0cmljdEdyb3Vwc1Rlc3RDYXNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvUmVzdHJpY3RHcm91cHNUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2Q5NjkwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9SZXN0cmljdEdyb3Vwc1Rlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52aWV3LlJlc3RyaWN0R3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuU2ltdWxhdGVkVXNlckluZm9ybWF0aW9uOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVzdHJpY3RHcm91cHNUZXN0Q2FzZSBleHRlbmRzIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8UmVzdHJpY3RHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbj4NCi17DQotICAgIHB1YmxpYyBSZXN0cmljdEdyb3Vwc1Rlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZXN0cmljdEdyb3Vwc1Rlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgUmVzdHJpY3RHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbiBnZXRCZWFuVG9UZXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBSZXN0cmljdEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc3RyaWN0ZWRHcm91cCgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwxLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdHJpY3RlZEdyb3VwV2l0aEFkbWluUm9sZSgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJjdXJyZW50VXNlciIsIG5ldyBTaW11bGF0ZWRVc2VySW5mb3JtYXRpb24oImFkbWluIikpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDIucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDIucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc3RyaWN0ZWRHcm91cFdpdGhVc2VyUm9sZSgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJjdXJyZW50VXNlciIsIG5ldyBTaW11bGF0ZWRVc2VySW5mb3JtYXRpb24oInVzZXIiKSk7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMi5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIiKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc3RyaWN0ZWRHcm91cFdpdGhDb3JyZWN0Vmlld0lkKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuc2V0Vmlld0lkKCIvcGFnZXMvZ3JvdXBWYWxpZGF0aW9uQXdhcmVQYWdlLnhodG1sIik7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMy5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMy5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIiKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdHJpY3RlZEdyb3VwV2l0aFdyb25nVmlld0lkKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDMucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDMucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VkQW5kUmVzdHJpY3RlZEdyb3VwKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Vc2VHcm91cFZhbGlkYXRpb24xVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Vc2VHcm91cFZhbGlkYXRpb24xVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhmZjJmNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvVXNlR3JvdXBWYWxpZGF0aW9uMVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldy5Vc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5TaW11bGF0ZWRVc2VySW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIFVzZUdyb3VwVmFsaWRhdGlvbjFUZXN0Q2FzZSBleHRlbmRzIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8VXNlR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4+DQotew0KLSAgICBwdWJsaWMgVXNlR3JvdXBWYWxpZGF0aW9uMVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShVc2VHcm91cFZhbGlkYXRpb24xVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBVc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbiBnZXRCZWFuVG9UZXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBVc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcm91cDFBd2FyZVZhbGlkYXRpb24oKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMS5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMS5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIiKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEdyb3VwMUFuZEdyb3VwMkF3YXJlVmFsaWRhdGlvbigpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwyLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwyLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDIpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEdyb3VwMkFuZEdyb3VwM0F3YXJlVmFsaWRhdGlvbldpdGhXcm9uZ1ZpZXdJZCgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwzLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwzLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgImciKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgInAiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEdyb3VwMkFuZEdyb3VwM0F3YXJlVmFsaWRhdGlvbldpdGhDb3JyZWN0Vmlld0lkMSgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLnNldFZpZXdJZCgiL3BhZ2VzL3BhZ2UxLnhodG1sIik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMy5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMy5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICJnIik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICJwIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgyKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcm91cDJBbmRHcm91cDNBd2FyZVZhbGlkYXRpb25XaXRoQ29ycmVjdFZpZXdJZDIoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5zZXRWaWV3SWQoIi9wYWdlcy9wYWdlMi54aHRtbCIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDMucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDMucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiZyIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAicCIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXAyQXdhcmVWYWxpZGF0aW9uV2l0aFJvbGVBZG1pbigpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJjdXJyZW50VXNlciIsIG5ldyBTaW11bGF0ZWRVc2VySW5mb3JtYXRpb24oImFkbWluIikpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiZyIpOyAvL2Rvbid0IGZvcmNlIGEgdmlvbGF0aW9uIHdpdGggR3JvdXAxDQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcm91cDJBbmRHcm91cDNBd2FyZVZhbGlkYXRpb25XaXRoUm9sZVVzZXIoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVSZXF1ZXN0U2NvcGVkQmVhbigiY3VycmVudFVzZXIiLCBuZXcgU2ltdWxhdGVkVXNlckluZm9ybWF0aW9uKCJ1c2VyIikpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiZyIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAicCIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvVXNlR3JvdXBWYWxpZGF0aW9uMlRlc3RDYXNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvVXNlR3JvdXBWYWxpZGF0aW9uMlRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmN2YxMmUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL1VzZUdyb3VwVmFsaWRhdGlvbjJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldy5Vc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBVc2VHcm91cFZhbGlkYXRpb24yVGVzdENhc2UgZXh0ZW5kcyBCYXNlQmVhblZhbFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlPFVzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuPg0KLXsNCi0gICAgcHVibGljIFVzZUdyb3VwVmFsaWRhdGlvbjJUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVXNlR3JvdXBWYWxpZGF0aW9uMlRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgVXNlR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4gZ2V0QmVhblRvVGVzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVXNlR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXAxQXdhcmVWYWxpZGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbC5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvY3VzdG9tL0N1c3RvbUNvbnN0cmFpbnRTb3VyY2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9jdXN0b20vQ3VzdG9tQ29uc3RyYWludFNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjkzZWFmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9jdXN0b20vQ3VzdG9tQ29uc3RyYWludFNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5jdXN0b207Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS4qOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi1AVGFyZ2V0KHtUWVBFLCBGSUVMRCwgTUVUSE9EfSkKLUBSZXRlbnRpb24oUlVOVElNRSkKLUBEb2N1bWVudGVkCi1wdWJsaWMgQGludGVyZmFjZSBDdXN0b21Db25zdHJhaW50U291cmNlCi17Ci0gICAgcHVibGljIGFic3RyYWN0IENsYXNzIHZhbHVlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL2N1c3RvbS9DdXN0b21JZ25vcmVDb25zdHJhaW50U291cmNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvY3VzdG9tL0N1c3RvbUlnbm9yZUNvbnN0cmFpbnRTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwM2I2Zi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvY3VzdG9tL0N1c3RvbUlnbm9yZUNvbnN0cmFpbnRTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwuY3VzdG9tOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotQFRhcmdldCh7RklFTEQsIE1FVEhPRH0pCi1AUmV0ZW50aW9uKFJVTlRJTUUpCi1ARG9jdW1lbnRlZAotcHVibGljIEBpbnRlcmZhY2UgQ3VzdG9tSWdub3JlQ29uc3RyYWludFNvdXJjZQotewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9jdXN0b20vQ3VzdG9tVGFyZ2V0UHJvcGVydHkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9jdXN0b20vQ3VzdG9tVGFyZ2V0UHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJiZjMwYi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvY3VzdG9tL0N1c3RvbVRhcmdldFByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLmN1c3RvbTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLUBUYXJnZXQoe0ZJRUxELCBNRVRIT0R9KQotQFJldGVudGlvbihSVU5USU1FKQotQERvY3VtZW50ZWQKLXB1YmxpYyBAaW50ZXJmYWNlIEN1c3RvbVRhcmdldFByb3BlcnR5Ci17Ci0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyB2YWx1ZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9jdXN0b20vQ3VzdG9tVGFyZ2V0UHJvcGVydHlJZC5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL2N1c3RvbS9DdXN0b21UYXJnZXRQcm9wZXJ0eUlkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MmU5ODYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL2N1c3RvbS9DdXN0b21UYXJnZXRQcm9wZXJ0eUlkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLmN1c3RvbTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotQFRhcmdldCh7RklFTEQsIE1FVEhPRH0pCi1AUmV0ZW50aW9uKFJVTlRJTUUpCi1ARG9jdW1lbnRlZAotcHVibGljIEBpbnRlcmZhY2UgQ3VzdG9tVGFyZ2V0UHJvcGVydHlJZAotewotICAgIHB1YmxpYyBhYnN0cmFjdCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gdmFsdWUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvY3VzdG9tL0N1c3RvbVZpb2xhdGlvblNldmVyaXR5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvY3VzdG9tL0N1c3RvbVZpb2xhdGlvblNldmVyaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwODMwNzYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL2N1c3RvbS9DdXN0b21WaW9sYXRpb25TZXZlcml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5jdXN0b207DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIEN1c3RvbVZpb2xhdGlvblNldmVyaXR5DQotew0KLSAgICBpbnRlcmZhY2UgV2FybmluZyBleHRlbmRzIFBheWxvYWQNCi0gICAgew0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmUxQmVhbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTFCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlOTUyNWIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTFCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkNvbnN0cmFpbnRTb3VyY2U7DQotDQotQENvbnN0cmFpbnRTb3VyY2UoQ29uc3RyYWludFNvdXJjZUF3YXJlMU1ldGFEYXRhQmVhbi5jbGFzcykNCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludFNvdXJjZUF3YXJlMUJlYW4NCi17DQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkyOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKFN0cmluZyBwcm9wZXJ0eTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTFNZXRhRGF0YUJlYW4uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmUxTWV0YURhdGFCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZThkOGUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTFNZXRhRGF0YUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWw7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi0NCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludFNvdXJjZUF3YXJlMU1ldGFEYXRhQmVhbg0KLXsNCi0gICAgQE5vdE51bGwNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkxOw0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7DQotDQotICAgIEBOb3ROdWxsDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTJCZWFuLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlMkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMyOWJjOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlMkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uQ29uc3RyYWludFNvdXJjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5JZ25vcmVDb25zdHJhaW50U291cmNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlRhcmdldFByb3BlcnR5Ow0KLQ0KLUBDb25zdHJhaW50U291cmNlKENvbnN0cmFpbnRTb3VyY2VBd2FyZTJNZXRhRGF0YUJlYW4uY2xhc3MpDQotcHVibGljIGNsYXNzIENvbnN0cmFpbnRTb3VyY2VBd2FyZTJCZWFuDQotew0KLSAgICBASWdub3JlQ29uc3RyYWludFNvdXJjZQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTE7DQotDQotICAgIEBUYXJnZXRQcm9wZXJ0eSgicHJvcGVydHkzIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkyOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKFN0cmluZyBwcm9wZXJ0eTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTJNZXRhRGF0YUJlYW4uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmUyTWV0YURhdGFCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YTRjZGIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTJNZXRhRGF0YUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWw7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi0NCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludFNvdXJjZUF3YXJlMk1ldGFEYXRhQmVhbg0KLXsNCi0gICAgQE5vdE51bGwNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkxOw0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTM7DQotDQotICAgIEBOb3ROdWxsDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MzsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTMoU3RyaW5nIHByb3BlcnR5MykNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTMgPSBwcm9wZXJ0eTM7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTNCZWFuLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlM0JlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJhNmU0Ni4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlM0JlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uQ29uc3RyYWludFNvdXJjZTsNCi0NCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludFNvdXJjZUF3YXJlM0JlYW4NCi17DQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0NCi0gICAgQENvbnN0cmFpbnRTb3VyY2UoQ29uc3RyYWludFNvdXJjZUF3YXJlM01ldGFEYXRhQmVhbi5jbGFzcykNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkyOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKFN0cmluZyBwcm9wZXJ0eTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTNNZXRhRGF0YUJlYW4uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmUzTWV0YURhdGFCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYTk2ODAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTNNZXRhRGF0YUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWw7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi0NCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludFNvdXJjZUF3YXJlM01ldGFEYXRhQmVhbg0KLXsNCi0gICAgQE5vdE51bGwNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkxOw0KLQ0KLSAgICBATm90TnVsbA0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmU0QmVhbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTRCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhOTdmN2UuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTRCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkNvbnN0cmFpbnRTb3VyY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uVGFyZ2V0UHJvcGVydHk7DQotDQotcHVibGljIGNsYXNzIENvbnN0cmFpbnRTb3VyY2VBd2FyZTRCZWFuDQotew0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTE7DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MjsNCi0NCi0gICAgQFRhcmdldFByb3BlcnR5KCJwcm9wZXJ0eSIpDQotICAgIEBDb25zdHJhaW50U291cmNlKENvbnN0cmFpbnRTb3VyY2VBd2FyZTRNZXRhRGF0YUJlYW4uY2xhc3MpDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlNE1ldGFEYXRhQmVhbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTRNZXRhRGF0YUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyOTQ1YS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlNE1ldGFEYXRhQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbDsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLQ0KLXB1YmxpYyBjbGFzcyBDb25zdHJhaW50U291cmNlQXdhcmU0TWV0YURhdGFCZWFuDQotew0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsNCi0NCi0gICAgQE5vdE51bGwNCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlNUJlYW4uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmU1QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzdiOTY2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmU1QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5Db25zdHJhaW50U291cmNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlRhcmdldFByb3BlcnR5SWQ7DQotDQotQENvbnN0cmFpbnRTb3VyY2UoQ29uc3RyYWludFNvdXJjZUF3YXJlNU1ldGFEYXRhQmVhbi5jbGFzcykNCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludFNvdXJjZUF3YXJlNUJlYW4NCi17DQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0NCi0gICAgQFRhcmdldFByb3BlcnR5SWQoVGFyZ2V0NC5jbGFzcykNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkyOw0KLQ0KLSAgICBAVGFyZ2V0UHJvcGVydHlJZChUYXJnZXQzLmNsYXNzKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKFN0cmluZyBwcm9wZXJ0eTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTVNZXRhRGF0YUJlYW4uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmU1TWV0YURhdGFCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZTI2ZjEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTVNZXRhRGF0YUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWw7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi0NCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludFNvdXJjZUF3YXJlNU1ldGFEYXRhQmVhbg0KLXsNCi0gICAgQE5vdE51bGwNCi0gICAgQFRhcmdldDMNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkzOw0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTQ7DQotDQotICAgIEBOb3ROdWxsDQotICAgIEBUYXJnZXQ0DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHk0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5NDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTQoU3RyaW5nIHByb3BlcnR5NCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTQgPSBwcm9wZXJ0eTQ7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTZCZWFuLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlNkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJmODNmYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlNkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwuY3VzdG9tLkN1c3RvbUNvbnN0cmFpbnRTb3VyY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwuY3VzdG9tLkN1c3RvbVRhcmdldFByb3BlcnR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLmN1c3RvbS5DdXN0b21UYXJnZXRQcm9wZXJ0eUlkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLmN1c3RvbS5DdXN0b21JZ25vcmVDb25zdHJhaW50U291cmNlOw0KLQ0KLUBDdXN0b21Db25zdHJhaW50U291cmNlKENvbnN0cmFpbnRTb3VyY2VBd2FyZTZNZXRhRGF0YUJlYW4uY2xhc3MpDQotcHVibGljIGNsYXNzIENvbnN0cmFpbnRTb3VyY2VBd2FyZTZCZWFuDQotew0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTE7DQotDQotICAgIEBDdXN0b21UYXJnZXRQcm9wZXJ0eUlkKFRhcmdldDQuY2xhc3MpDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MjsNCi0NCi0gICAgQEN1c3RvbUlnbm9yZUNvbnN0cmFpbnRTb3VyY2UNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkzOw0KLQ0KLSAgICBAQ3VzdG9tVGFyZ2V0UHJvcGVydHkoInByb3BlcnR5MyIpDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkzKFN0cmluZyBwcm9wZXJ0eTMpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkzID0gcHJvcGVydHkzOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmU2TWV0YURhdGFCZWFuLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlNk1ldGFEYXRhQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2JiYzVhLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmU2TWV0YURhdGFCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotDQotcHVibGljIGNsYXNzIENvbnN0cmFpbnRTb3VyY2VBd2FyZTZNZXRhRGF0YUJlYW4NCi17DQotICAgIEBOb3ROdWxsDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MzsNCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk0Ow0KLQ0KLSAgICBATm90TnVsbA0KLSAgICBAVGFyZ2V0NA0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5NCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHk0KFN0cmluZyBwcm9wZXJ0eTQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHk0ID0gcHJvcGVydHk0Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Hcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzUzYzE1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Hcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAxOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAzOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5QYXR0ZXJuOw0KLQ0KLXB1YmxpYyBjbGFzcyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuDQotew0KLSAgICBATm90TnVsbChncm91cHMgPSBHcm91cDEuY2xhc3MpDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0NCi0gICAgQFBhdHRlcm4ocmVnZXhwID0gIltBLVpdW2Etel0iLCBncm91cHMgPSBHcm91cDMuY2xhc3MpDQotICAgIEBTaXplKG1pbiA9IDMsIGdyb3VwcyA9IEdyb3VwMi5jbGFzcykNCi0gICAgQE5vdE51bGwoZ3JvdXBzID0gR3JvdXAyLmNsYXNzKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyQmVhbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0dyb3VwVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdmMjlkOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uLkdyb3VwMTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uLkdyb3VwMjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLQ0KLXB1YmxpYyBjbGFzcyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuDQotew0KLSAgICBAQmVhblZhbGlkYXRpb24odXNlR3JvdXBzID0gR3JvdXAxLmNsYXNzKQ0KLSAgICBATm90TnVsbChncm91cHMgPSBHcm91cDEuY2xhc3MpDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0NCi0gICAgQE5vdE51bGwoZ3JvdXBzID0gR3JvdXAyLmNsYXNzKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRjZGIyMi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uLkNsYXNzTGV2ZWxFcXVhbDsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLQ0KLUBDbGFzc0xldmVsRXF1YWwNCi1wdWJsaWMgY2xhc3MgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbg0KLXsNCi0gICAgQE5vdE51bGwNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkxOw0KLQ0KLSAgICBATm90TnVsbA0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyQmVhbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk1NDMyMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uLkNsYXNzTGV2ZWxFcXVhbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi0NCi1AQ2xhc3NMZXZlbEVxdWFsDQotQEJlYW5WYWxpZGF0aW9uKHZpZXdJZHMgPSAiL3BhZ2VzL21vZGVsVmFsaWRhdGlvbkF3YXJlUGFnZS54aHRtbCIsDQotICAgICAgICBtb2RlbFZhbGlkYXRpb24gPSBATW9kZWxWYWxpZGF0aW9uKGlzQWN0aXZlID0gdHJ1ZSkpDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4NCi17DQotICAgIEBOb3ROdWxsDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0NCi0gICAgQE5vdE51bGwNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkyOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKFN0cmluZyBwcm9wZXJ0eTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1NpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1NpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzBlZDFjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9TaW11bGF0ZWRVc2VySW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWw7DQotDQotcHVibGljIGNsYXNzIFNpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbg0KLXsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7DQotDQotICAgIHB1YmxpYyBTaW11bGF0ZWRVc2VySW5mb3JtYXRpb24oU3RyaW5nIHZhbHVlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZG1pblJvbGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gImFkbWluIi5lcXVhbHModmFsdWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVXNlclJvbGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gInVzZXIiLmVxdWFscyh2YWx1ZSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1RhcmdldDMuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9UYXJnZXQzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZTdlOWIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1RhcmdldDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi1AVGFyZ2V0KHtGSUVMRCwgTUVUSE9EfSkKLUBSZXRlbnRpb24oUlVOVElNRSkKLUBEb2N1bWVudGVkCi1wdWJsaWMgQGludGVyZmFjZSBUYXJnZXQzCi17Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1RhcmdldDQuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9UYXJnZXQ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5OWIzOGYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1RhcmdldDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi1AVGFyZ2V0KHtGSUVMRCwgTUVUSE9EfSkKLUBSZXRlbnRpb24oUlVOVElNRSkKLUBEb2N1bWVudGVkCi1wdWJsaWMgQGludGVyZmFjZSBUYXJnZXQ0Ci17Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1Rlc3RDYXNlMUJlYW4uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9UZXN0Q2FzZTFCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYmJjZGQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1Rlc3RDYXNlMUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5QYXR0ZXJuOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7DQotDQotcHVibGljIGNsYXNzIFRlc3RDYXNlMUJlYW4NCi17DQotICAgIEBOb3ROdWxsDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0NCi0gICAgQE5vdE51bGwocGF5bG9hZCA9IFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MpDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MjsNCi0NCi0gICAgQFNpemUobWluID0gMywgcGF5bG9hZCA9IFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MpDQotICAgIEBQYXR0ZXJuKHJlZ2V4cCA9ICJbQS1aXVthLXpdKyIsIHBheWxvYWQgPSBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzcykNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkzOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKFN0cmluZyBwcm9wZXJ0eTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MyhTdHJpbmcgcHJvcGVydHkzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MyA9IHByb3BlcnR5MzsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9DbGFzc0xldmVsRXF1YWwuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0NsYXNzTGV2ZWxFcXVhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDYwZmZmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0NsYXNzTGV2ZWxFcXVhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotDQotQGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldChUWVBFKQ0KLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb24oUlVOVElNRSkNCi1AamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZA0KLUBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQodmFsaWRhdGVkQnkgPSB7Q2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjEuY2xhc3MsIENsYXNzTGV2ZWxFcXVhbHNWYWxpZGF0b3IyLmNsYXNzfSkNCi1wdWJsaWMgQGludGVyZmFjZSBDbGFzc0xldmVsRXF1YWwNCi17DQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAiY2xhc3MtbGV2ZWwgZXF1YWwgdmlvbGF0aW9uIjsNCi0NCi0gICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9Ow0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vQ2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjEuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0NsYXNzTGV2ZWxFcXVhbHNWYWxpZGF0b3IxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MWUxNDguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vQ2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIENsYXNzTGV2ZWxFcXVhbHNWYWxpZGF0b3IxIGltcGxlbWVudHMNCi0gICAgICAgIENvbnN0cmFpbnRWYWxpZGF0b3I8Q2xhc3NMZXZlbEVxdWFsLCBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuPg0KLXsNCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDbGFzc0xldmVsRXF1YWwgcGFyYW1ldGVycykNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBwYWdlQmVhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5MSA9IHBhZ2VCZWFuLmdldFByb3BlcnR5MSgpOw0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5MiA9IHBhZ2VCZWFuLmdldFByb3BlcnR5MigpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MSA9PSBudWxsICYmIHByb3BlcnR5MiA9PSBudWxsIHx8IHByb3BlcnR5MSAhPSBudWxsICYmIHByb3BlcnR5MS5lcXVhbHMocHJvcGVydHkyKTsNCi0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9DbGFzc0xldmVsRXF1YWxzVmFsaWRhdG9yMi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vQ2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhZDkxZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9DbGFzc0xldmVsRXF1YWxzVmFsaWRhdG9yMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLk1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW47DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgQ2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjIgaW1wbGVtZW50cw0KLSAgICAgICAgQ29uc3RyYWludFZhbGlkYXRvcjxDbGFzc0xldmVsRXF1YWwsIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4+DQotew0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKENsYXNzTGV2ZWxFcXVhbCBwYXJhbWV0ZXJzKQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuIHBhZ2VCZWFuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcHJvcGVydHkxID0gcGFnZUJlYW4uZ2V0UHJvcGVydHkxKCk7DQotICAgICAgICBTdHJpbmcgcHJvcGVydHkyID0gcGFnZUJlYW4uZ2V0UHJvcGVydHkyKCk7DQotDQotICAgICAgICByZXR1cm4gcHJvcGVydHkxID09IG51bGwgJiYgcHJvcGVydHkyID09IG51bGwgfHwgcHJvcGVydHkxICE9IG51bGwgJiYgcHJvcGVydHkxLmVxdWFscyhwcm9wZXJ0eTIpOw0KLQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0dyb3VwMS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViODk0ODAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb247DQotDQotcHVibGljIGludGVyZmFjZSBHcm91cDENCi17DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0dyb3VwMi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNjViNTMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb247DQotDQotcHVibGljIGludGVyZmFjZSBHcm91cDINCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0dyb3VwMy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYmFjZmIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb247DQotDQotcHVibGljIGludGVyZmFjZSBHcm91cDMNCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L0N1c3RvbVNldmVyaXR5VGVzdENhc2UxUGFnZUJlYW4uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L0N1c3RvbVNldmVyaXR5VGVzdENhc2UxUGFnZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgwOWNmMC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9DdXN0b21TZXZlcml0eVRlc3RDYXNlMVBhZ2VCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwuY3VzdG9tLkN1c3RvbVZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIEN1c3RvbVNldmVyaXR5VGVzdENhc2UxUGFnZUJlYW4NCi17DQotICAgIEBOb3ROdWxsKHBheWxvYWQgPSBDdXN0b21WaW9sYXRpb25TZXZlcml0eS5XYXJuaW5nLmNsYXNzKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTE7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYTA3MzYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbjsNCi0NCi1wdWJsaWMgY2xhc3MgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4NCi17DQotICAgIHByaXZhdGUgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDEgPSBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBwcml2YXRlIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gbW9kZWwyID0gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgQEJlYW5WYWxpZGF0aW9uKG1vZGVsVmFsaWRhdGlvbiA9IEBNb2RlbFZhbGlkYXRpb24oaXNBY3RpdmUgPSB0cnVlKSkNCi0gICAgcHJpdmF0ZSBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsMyA9IG5ldyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIEBCZWFuVmFsaWRhdGlvbihtb2RlbFZhbGlkYXRpb24gPSBATW9kZWxWYWxpZGF0aW9uKGlzQWN0aXZlID0gdHJ1ZSwgZGlzcGxheUlubGluZSA9IHRydWUpKQ0KLSAgICBwcml2YXRlIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gbW9kZWw0ID0gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgQEJlYW5WYWxpZGF0aW9uKGNvbmRpdGlvbnMgPSAiI3tjdXJyZW50VXNlci51c2VyUm9sZX0iLCBtb2RlbFZhbGlkYXRpb24gPSBATW9kZWxWYWxpZGF0aW9uKGlzQWN0aXZlID0gdHJ1ZSkpDQotICAgIHByaXZhdGUgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDUgPSBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24obW9kZWxWYWxpZGF0aW9uID0gQE1vZGVsVmFsaWRhdGlvbihpc0FjdGl2ZSA9IHRydWUpKQ0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWwxOw0KLSAgICB9DQotDQotICAgIEBCZWFuVmFsaWRhdGlvbihtb2RlbFZhbGlkYXRpb24gPSBATW9kZWxWYWxpZGF0aW9uKGlzQWN0aXZlID0gdHJ1ZSwgZGlzcGxheUlubGluZSA9IHRydWUpKQ0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWwyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIGdldE1vZGVsMygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWw0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1vZGVsNDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWw1Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWU0OTI0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uQmVhblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLk1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW47DQotDQotQEJlYW5WYWxpZGF0aW9uKG1vZGVsVmFsaWRhdGlvbiA9IEBNb2RlbFZhbGlkYXRpb24oaXNBY3RpdmUgPSB0cnVlLCB2YWxpZGF0aW9uVGFyZ2V0cyA9ICIje3Rlc3RCZWFuLm1vZGVsfSIpKQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsID0gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgcHVibGljIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWw7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UzUGFnZUJlYW4uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L01vZGVsVmFsaWRhdGlvblRlc3RDYXNlM1BhZ2VCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNmNjMGUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UzUGFnZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbjsNCi0NCi1AQmVhblZhbGlkYXRpb24odmlld0lkcyA9ICIvcGFnZXMvbW9kZWxWYWxpZGF0aW9uQXdhcmVQYWdlLnhodG1sIiwNCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbiA9IEBNb2RlbFZhbGlkYXRpb24oaXNBY3RpdmUgPSB0cnVlLCB2YWxpZGF0aW9uVGFyZ2V0cyA9ICIje3Rlc3RCZWFuLm1vZGVsfSIpKQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTNQYWdlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsID0gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgcHVibGljIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWw7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2U0UGFnZUJlYW4uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L01vZGVsVmFsaWRhdGlvblRlc3RDYXNlNFBhZ2VCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3Yzc0YzAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2U0UGFnZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuOw0KLQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTRQYWdlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuIG1vZGVsID0gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4oKTsNCi0NCi0gICAgcHVibGljIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4gZ2V0TW9kZWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWw7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvUmVzdHJpY3RHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvUmVzdHJpY3RHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTcyNGVkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L1Jlc3RyaWN0R3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5Hcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAxOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLQ0KLUBCZWFuVmFsaWRhdGlvbih1c2VHcm91cHMgPSBHcm91cDEuY2xhc3MpDQotcHVibGljIGNsYXNzIFJlc3RyaWN0R3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4NCi17DQotICAgIEBCZWFuVmFsaWRhdGlvbihyZXN0cmljdEdyb3VwcyA9IEdyb3VwMS5jbGFzcykNCi0gICAgcHJpdmF0ZSBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsMSA9IG5ldyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIHByaXZhdGUgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDIgPSBuZXcgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24odmlld0lkcyA9ICIvcGFnZXMvZ3JvdXBWYWxpZGF0aW9uQXdhcmVQYWdlLnhodG1sIiwgcmVzdHJpY3RHcm91cHMgPSBHcm91cDEuY2xhc3MpDQotICAgIHByaXZhdGUgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDMgPSBuZXcgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24ocmVzdHJpY3RHcm91cHMgPSBHcm91cDEuY2xhc3MsIHVzZUdyb3VwcyA9IEdyb3VwMi5jbGFzcykNCi0gICAgcHJpdmF0ZSBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsNCA9IG5ldyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIHB1YmxpYyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIGdldE1vZGVsMSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDE7DQotICAgIH0NCi0NCi0gICAgQEJlYW5WYWxpZGF0aW9uKGNvbmRpdGlvbnMgPSAiI3tjdXJyZW50VXNlci5hZG1pblJvbGV9IiwgcmVzdHJpY3RHcm91cHMgPSBHcm91cDEuY2xhc3MpDQotICAgIHB1YmxpYyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIGdldE1vZGVsMigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWwzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1vZGVsMzsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWw0Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L1VzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Vc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODJlNWVjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L1VzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uLkdyb3VwMTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uLkdyb3VwMjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uLkdyb3VwMzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi0NCi1AQmVhblZhbGlkYXRpb24odXNlR3JvdXBzID0gR3JvdXAxLmNsYXNzKQ0KLXB1YmxpYyBjbGFzcyBVc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsMSA9IG5ldyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIHByaXZhdGUgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDIgPSBuZXcgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24odmlld0lkcyA9IHsiL3BhZ2VzL3BhZ2UxLnhodG1sIiwgIi9wYWdlcy9wYWdlMi54aHRtbCJ9LHVzZUdyb3VwcyA9IHtHcm91cDIuY2xhc3MsIEdyb3VwMy5jbGFzc30pDQotICAgIHByaXZhdGUgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDMgPSBuZXcgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24uTGlzdCh7DQotICAgICAgICBAQmVhblZhbGlkYXRpb24odXNlR3JvdXBzID0gR3JvdXAyLmNsYXNzLCBjb25kaXRpb25zID0gIiN7Y3VycmVudFVzZXIuYWRtaW5Sb2xlfSIpLA0KLSAgICAgICAgQEJlYW5WYWxpZGF0aW9uKHVzZUdyb3VwcyA9IHtHcm91cDIuY2xhc3MsIEdyb3VwMy5jbGFzc30sIGNvbmRpdGlvbnMgPSAiI3tjdXJyZW50VXNlci51c2VyUm9sZX0iKQ0KLSAgICB9KQ0KLSAgICBwcml2YXRlIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gbW9kZWw0ID0gbmV3IEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgcHVibGljIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWwxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1vZGVsMTsNCi0gICAgfQ0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24odXNlR3JvdXBzID0gR3JvdXAyLmNsYXNzKQ0KLSAgICBwdWJsaWMgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWwyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIGdldE1vZGVsMygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWw0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1vZGVsNDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Vc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvVXNlR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmODVkZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Vc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52aWV3Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLkdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMkJlYW47DQotDQotcHVibGljIGNsYXNzIFVzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuDQotew0KLSAgICBwcml2YXRlIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4gbW9kZWwgPSBuZXcgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyQmVhbigpOw0KLQ0KLSAgICBwdWJsaWMgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyQmVhbiBnZXRNb2RlbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWZiZjViLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlLXRlc3RzPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIENvcmUtVGVzdHM8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPnRlc3QtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL0Fic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRmMDc5My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL0Fic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UuQWJzdHJhY3RFeFZhbFRlc3RDYXNlOw0KLQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW52b2tlU3RhcnR1cExpc3RlbmVycygpDQotICAgIHsNCi0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb25UZXN0Q2FzZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjZmVlMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb25UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotcHVibGljIGNsYXNzIFZhbHVlQmluZGluZ0V4cHJlc3Npb25UZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFZhbHVlQmluZGluZ0V4cHJlc3Npb25UZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhbmRhcmRTeW50YXgoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xLnByb3BlcnR5MX0iKTsNCi0NCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjEucHJvcGVydHkxfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjF9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTEiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydwcm9wZXJ0eTEnXX0iKTsNCi0NCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjFbJ3Byb3BlcnR5MSddfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjF9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTEiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydiZWFuMiddLnByb3BlcnR5MX0iKTsNCi0NCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjFbJ2JlYW4yJ10ucHJvcGVydHkxfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjFbJ2JlYW4yJ119IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTEiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFyZFN5bnRheFJlcGxhY2VQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjEucHJvcGVydHkxfSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sICJwcm9wZXJ0eTIiKTsNCi0NCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjEucHJvcGVydHkyfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjF9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTIiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydwcm9wZXJ0eTEnXX0iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2VQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAicHJvcGVydHkyIik7DQotDQotICAgICAgICAvL1RPRE8gcmVzdG9yZSBvcmlnaW5hbCBzeW50YXgNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjEucHJvcGVydHkyfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjF9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTIiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydiZWFuMiddLnByb3BlcnR5MX0iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2VQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAicHJvcGVydHkyIik7DQotDQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xWydiZWFuMiddLnByb3BlcnR5Mn0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xWydiZWFuMiddfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tiZWFuMX0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygicHJvcGVydHkyIiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhbmRhcmRTeW50YXhBZGRQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjEuYmVhbjJ9Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5hZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAicHJvcGVydHkxIik7DQotDQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xLmJlYW4yLnByb3BlcnR5MX0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xLmJlYW4yfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygicHJvcGVydHkxIiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsnYmVhbjInXX0iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sICJwcm9wZXJ0eTEiKTsNCi0NCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjFbJ2JlYW4yJ10ucHJvcGVydHkxfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjFbJ2JlYW4yJ119IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTEiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydiZWFuMiddLmJlYW4zfSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24uYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgInByb3BlcnR5MSIpOw0KLQ0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tiZWFuMVsnYmVhbjInXS5iZWFuMy5wcm9wZXJ0eTF9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tiZWFuMVsnYmVhbjInXS5iZWFuM30iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjFbJ2JlYW4yJ119IiwNCi0gICAgICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInByb3BlcnR5MSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhY2VsZXRzQ3VzdG9tQ29tcG9uZW50U3ludGF4KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tlbnRpdHlbZmllbGROYW1lXX0iKTsNCi0NCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7ZW50aXR5W2ZpZWxkTmFtZV19IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tlbnRpdHl9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJmaWVsZE5hbWUiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWNlbGV0c0N1c3RvbUNvbXBvbmVudFN5bnRheFJlcGxhY2VQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7ZW50aXR5W2ZpZWxkTmFtZV19Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgIm5ld0ZpZWxkTmFtZSIpOw0KLQ0KLSAgICAgICAgLy9UT0RPIHJlc3RvcmUgb3JpZ2luYWwgc3ludGF4DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2VudGl0eS5uZXdGaWVsZE5hbWV9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tlbnRpdHl9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJuZXdGaWVsZE5hbWUiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wbGV4TWFwU3ludGF4KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24NCi0gICAgICAgICAgICAgICAgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVtiZWFuMltiZWFuM1sna2V5MSddXV0ucHJvcGVydHkxfSIpOw0KLQ0KLSAgICAgICAgLy9UT0RPDQotICAgICAgICAvL2Fzc2VydEVxdWFscygiI3tiZWFuMVtiZWFuMltiZWFuM1sna2V5MSddXV0ucHJvcGVydHkxfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInByb3BlcnR5MSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbml0aWFsaXplci9SZWdpc3RyYXRpb25Db21wb25lbnRJbml0aWFsaXplclRlc3RDYXNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2luaXRpYWxpemVyL1JlZ2lzdHJhdGlvbkNvbXBvbmVudEluaXRpYWxpemVyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM5ZjRjMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2luaXRpYWxpemVyL1JlZ2lzdHJhdGlvbkNvbXBvbmVudEluaXRpYWxpemVyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLmluaXRpYWxpemVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvbkNvbXBvbmVudEluaXRpYWxpemVyVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlZ2lzdHJhdGlvbkNvbXBvbmVudEluaXRpYWxpemVyVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvbkNvbXBvbmVudEluaXRpYWxpemVyVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wb25lbnRJbml0aWFsaXplckluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IFRlc3RDb21wb25lbnRJbml0aWFsaXplcjEwMDAoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZENvbXBvbmVudEluaXRpYWxpemVyKG5ldyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMygpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZENvbXBvbmVudEluaXRpYWxpemVyKG5ldyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIxKCkpOw0KLQ0KLSAgICAgICAgTGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4gcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7DQotDQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gNTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5zaXplKCkgPT0gcmVzdWx0TGVuZ3RoKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjIpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIzKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMTAwMCk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RDb21wb25lbnRJbml0aWFsaXplcik7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdENvbXBvbmVudEluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMSkNCi0gICAgY2xhc3MgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMSBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDIpDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjIgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigzKQ0KLSAgICBjbGFzcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIzIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTAwMCkNCi0gICAgY2xhc3MgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMTAwMCBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTc4NTgwLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZQ0KLXsNCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBSZWdpc3RyYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWdpc3RyYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JJbml0aWFsaXphdGlvbigpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxMDAwKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjMoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMSgpKTsNCi0NCi0gICAgICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOw0KLQ0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDU7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3VsdExlbmd0aCwgcmVzdWx0LnNpemUoKSk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMi5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjMuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxMDAwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdENvbXBvbmVudEluaXRpYWxpemVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxKQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDIpDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMykNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMyBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxMDAwKQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxMDAwIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvblByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTBkMzI4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUmVnaXN0cmF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVnaXN0cmF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ySW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEwMDAoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IzKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEoKSk7DQotDQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsNCi0NCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSA2Ow0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHRMZW5ndGgsIHJlc3VsdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMS5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IzLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxMDAwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdENvbXBvbmVudEluaXRpYWxpemVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMSkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMSBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMikNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMiBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMykNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMyBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTAwMCkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMCBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU0ZDM2OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUmVnaXN0cmF0aW9uVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvblZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ySW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IxKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcihuZXcgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjMoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IxMDAwKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkpOw0KLQ0KLSAgICAgICAgTGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsNCi0NCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSA3Ow0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHRMZW5ndGgsIHJlc3VsdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjEuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMi5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IzLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVmlvbGF0aW9uU2V2ZXJpdHlWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhIdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA1Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMTAwMC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDY6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMSBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigyKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMiBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigzKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMyBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxMDAwKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMTAwMCBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9tYXBwZXIvUmVnaXN0cmF0aW9uTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJUZXN0Q2FzZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9tYXBwZXIvUmVnaXN0cmF0aW9uTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTAxYjAxLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvbk1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5OYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIuKjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrLk1vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvbk1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlZ2lzdHJhdGlvbk1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvbk1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyNjUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyMTUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyNDUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyMjUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyNTUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOTkoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIzNTAoKSk7DQotDQotICAgICAgICBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gcmVzdWx0ID0gZ2V0TmFtZU1hcHBlcnMoKTsNCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSAxNjsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0TGVuZ3RoLCByZXN1bHQuc2l6ZSgpKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOTkuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyMTUwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjI1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDU6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKERlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIzNTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA3Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgODoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI0NTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA5Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDEwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDExOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDEyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDEzOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjU1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjY1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE1Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxTdHJpbmc+PiBnZXROYW1lTWFwcGVycygpDQotICAgIHsNCi0gICAgICAgIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkgcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiAoKE1vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KXJlc3VsdCkuZ2V0UmVnaXN0ZXJlZE5hbWVNYXBwZXJMaXN0KCk7DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoOTkpDQotICAgIGNsYXNzIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOTkgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTUwKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjE1MCBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigyNTApDQotICAgIGNsYXNzIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyMjUwIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDM1MCkNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIzNTAgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoNDUwKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjQ1MCBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcig1NTApDQotICAgIGNsYXNzIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyNTUwIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDY1MCkNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI2NTAgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlclRlc3RDYXNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTY3YjQzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5OYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyLio7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UubW9jay5Nb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVySW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjMwMSgpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIxNTAoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyNDUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjI1MCgpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXI1NTAoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyOTkoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyMzUwKCkpOw0KLQ0KLSAgICAgICAgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IHJlc3VsdCA9IGdldE5hbWVNYXBwZXJzKCk7DQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gMTM7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3VsdExlbmd0aCwgcmVzdWx0LnNpemUoKSk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjk5LmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIxNTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjI1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDU6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDY6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyMzAxLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgODoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIzNTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA5Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDEwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjQ1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDExOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjU1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDEyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXROYW1lTWFwcGVycygpDQotICAgIHsNCi0gICAgICAgIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkgcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiAoKE1vY2tNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5KXJlc3VsdCkuZ2V0UmVnaXN0ZXJlZE5hbWVNYXBwZXJMaXN0KCk7DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoOTkpDQotICAgIGNsYXNzIFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyOTkgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTUwKQ0KLSAgICBjbGFzcyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjE1MCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigyNTApDQotICAgIGNsYXNzIFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyMjUwIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDMwMSkNCi0gICAgY2xhc3MgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIzMDEgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMzUwKQ0KLSAgICBjbGFzcyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjM1MCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcig0NTApDQotICAgIGNsYXNzIFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyNDUwIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDU1MCkNCi0gICAgY2xhc3MgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXI1NTAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJUZXN0Q2FzZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9tYXBwZXIvUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZGNlMzMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9tYXBwZXIvUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuTmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyLio7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrLk1vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGVySW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIxNTAoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI0NTAoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIyNTAoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI1NTAoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI5OSgpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjM1MCgpKTsNCi0NCi0gICAgICAgIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiByZXN1bHQgPSBnZXROYW1lTWFwcGVycygpOw0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDEzOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHRMZW5ndGgsIHJlc3VsdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOTkuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjE1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDQ6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyMjUwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA3Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIzNTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA4Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgOToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyNDUwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMTA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMTE6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjU1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDEyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gZ2V0TmFtZU1hcHBlcnMoKQ0KLSAgICB7DQotICAgICAgICBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiAoKE1vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSlyZXN1bHQpLmdldFJlZ2lzdGVyZWROYW1lTWFwcGVyTGlzdCgpOw0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDk5KQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI5OSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDE1MCkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyMTUwIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMjUwKQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIyNTAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigzNTApDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjM1MCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDQ1MCkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyNDUwIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoNTUwKQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI1NTAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9DdXN0b21Qcm9qZWN0U3RhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvQ3VzdG9tUHJvamVjdFN0YWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZjE2YjMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9DdXN0b21Qcm9qZWN0U3RhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuc3RhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuUHJvamVjdFN0YWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Qcm9qZWN0U3RhZ2VOYW1lOw0KLQ0KLS8qKg0KLSAqIGN1c3RvbSBwcm9qZWN0IHN0YWdlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWVudW0gQ3VzdG9tUHJvamVjdFN0YWdlDQotew0KLSAgICBEZXYoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZSgiRGV2IikpLA0KLSAgICBUZXN0KFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoIlRlc3QiKSksDQotICAgIFByb2QoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZSgiUHJvZCIpKTsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0U3RhZ2VOYW1lIHZhbHVlOw0KLQ0KLSAgICBDdXN0b21Qcm9qZWN0U3RhZ2UoUHJvamVjdFN0YWdlTmFtZSB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpcyhDdXN0b21Qcm9qZWN0U3RhZ2UgY3VzdG9tUHJvamVjdFN0YWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUHJvamVjdFN0YWdlLmlzKGN1c3RvbVByb2plY3RTdGFnZS5nZXRWYWx1ZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvamVjdFN0YWdlTmFtZSBnZXRWYWx1ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnZhbHVlOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvQ3VzdG9tUHJvamVjdFN0YWdlVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvQ3VzdG9tUHJvamVjdFN0YWdlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEyMzlkOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0N1c3RvbVByb2plY3RTdGFnZVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLnN0YWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Kc2ZQcm9qZWN0U3RhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlByb2plY3RTdGFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1wdWJsaWMgY2xhc3MgQ3VzdG9tUHJvamVjdFN0YWdlVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9TVEFHRSA9ICJqYXZheC5mYWNlcy5QUk9KRUNUX1NUQUdFIjsNCi0gICAgDQotICAgIHB1YmxpYyBDdXN0b21Qcm9qZWN0U3RhZ2VUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ3VzdG9tUHJvamVjdFN0YWdlVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3REZXZlbG9wbWVudFN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihQUk9KRUNUX1NUQUdFLCAiRGV2Iik7DQotICAgICAgICBhc3NlcnRUcnVlKEN1c3RvbVByb2plY3RTdGFnZS5pcyhDdXN0b21Qcm9qZWN0U3RhZ2UuRGV2KSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFRlc3RTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoUFJPSkVDVF9TVEFHRSwgIlRlc3QiKTsNCi0gICAgICAgIGFzc2VydFRydWUoQ3VzdG9tUHJvamVjdFN0YWdlLmlzKEN1c3RvbVByb2plY3RTdGFnZS5UZXN0KSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFByb2R1Y3Rpb25TdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoUFJPSkVDVF9TVEFHRSwgIlByb2QiKTsNCi0gICAgICAgIGFzc2VydFRydWUoQ3VzdG9tUHJvamVjdFN0YWdlLmlzKEN1c3RvbVByb2plY3RTdGFnZS5Qcm9kKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIGFzc2VydFRydWUoUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5Qcm9kdWN0aW9uLmdldFZhbHVlKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdEZWZhdWx0U3RhZ2UxKCkNCi0gICAgew0KLSAgICAgICAgYXNzZXJ0RmFsc2UoQ3VzdG9tUHJvamVjdFN0YWdlLmlzKEN1c3RvbVByb2plY3RTdGFnZS5EZXYpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdEZWZhdWx0U3RhZ2UyKCkNCi0gICAgew0KLSAgICAgICAgYXNzZXJ0RmFsc2UoQ3VzdG9tUHJvamVjdFN0YWdlLmlzKEN1c3RvbVByb2plY3RTdGFnZS5UZXN0KSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9JbmRlcGVuZGVudFByb2plY3RTdGFnZVRlc3RDYXNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0luZGVwZW5kZW50UHJvamVjdFN0YWdlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY2YTRmOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0luZGVwZW5kZW50UHJvamVjdFN0YWdlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLnN0YWdlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgSW5kZXBlbmRlbnRQcm9qZWN0U3RhZ2VUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFUEVOREVOVF9QUk9KRUNUX1NUQUdFID0gImN1c3RvbS5QUk9KRUNUX1NUQUdFIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTRl9QUk9KRUNUX1NUQUdFID0gImphdmF4LmZhY2VzLlBST0pFQ1RfU1RBR0UiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0RFViA9ICJjdXN0b21fZGV2IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9QUk9EID0gImN1c3RvbV9wcm9kIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9URVNUID0gImN1c3RvbV90ZXN0IjsNCi0NCi0gICAgcHVibGljIEluZGVwZW5kZW50UHJvamVjdFN0YWdlVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEluZGVwZW5kZW50UHJvamVjdFN0YWdlVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KFByb2plY3RTdGFnZVJlc29sdmVyLmNsYXNzLmdldE5hbWUoKSwgbmV3IERlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpDQotICAgICAgICB7DQotICAgICAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICAgICAgcHVibGljIFByb2plY3RTdGFnZSBnZXRDdXJyZW50UHJvamVjdFN0YWdlKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFN0cmluZyBqc2ZQcm9qZWN0U3RhZ2VOYW1lID0gcmVzb2x2ZVByb2plY3RTdGFnZU5hbWUoImphdmF4LmZhY2VzLlBST0pFQ1RfU1RBR0UiKTsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIGluZGVwZW5kZW50UHJvamVjdFN0YWdlTmFtZSA9IHJlc29sdmVQcm9qZWN0U3RhZ2VOYW1lKElOREVQRU5ERU5UX1BST0pFQ1RfU1RBR0UpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoIShqc2ZQcm9qZWN0U3RhZ2VOYW1lID09IG51bGwgfHwgIiIuZXF1YWxzKGpzZlByb2plY3RTdGFnZU5hbWUpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgUHJvamVjdFN0YWdlTmFtZSByZXN1bHQgPSBQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKGpzZlByb2plY3RTdGFnZU5hbWUudHJpbSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIGZvcihKc2ZQcm9qZWN0U3RhZ2UganNmUHJvamVjdFN0YWdlIDogSnNmUHJvamVjdFN0YWdlLnZhbHVlcygpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGpzZlByb2plY3RTdGFnZS5nZXRWYWx1ZSgpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZShyZXN1bHQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZighKGluZGVwZW5kZW50UHJvamVjdFN0YWdlTmFtZSA9PSBudWxsIHx8ICIiLmVxdWFscyhpbmRlcGVuZGVudFByb2plY3RTdGFnZU5hbWUpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgUHJvamVjdFN0YWdlTmFtZSBpbmRlcGVuZGVudFJlc3VsdCA9IFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoaW5kZXBlbmRlbnRQcm9qZWN0U3RhZ2VOYW1lLnRyaW0oKSk7DQotDQotICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGpzZiBzdGFnZSB2YWx1ZXMgZmlyc3QNCi0gICAgICAgICAgICAgICAgICAgIFByb2plY3RTdGFnZU5hbWUgcmVzdWx0ID0gUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShpbmRlcGVuZGVudFByb2plY3RTdGFnZU5hbWUudHJpbSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIGZvcihKc2ZQcm9qZWN0U3RhZ2UganNmUHJvamVjdFN0YWdlIDogSnNmUHJvamVjdFN0YWdlLnZhbHVlcygpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGpzZlByb2plY3RTdGFnZS5nZXRWYWx1ZSgpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZShyZXN1bHQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgY3VzdG9tIHN0YWdlIHZhbHVlcw0KLSAgICAgICAgICAgICAgICAgICAgaWYoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShDVVNUT01fREVWKS5lcXVhbHMoaW5kZXBlbmRlbnRSZXN1bHQpIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoQ1VTVE9NX1RFU1QpLmVxdWFscyhpbmRlcGVuZGVudFJlc3VsdCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZShpbmRlcGVuZGVudFJlc3VsdCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVByb2plY3RTdGFnZShQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKENVU1RPTV9QUk9EKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZVByb2plY3RTdGFnZU5hbWUoU3RyaW5nIHBhcmFtZXRlck5hbWUpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRJbml0UGFyYW1ldGVyKHBhcmFtZXRlck5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KFByb2plY3RTdGFnZVJlc29sdmVyLmNsYXNzLmdldE5hbWUoKSwgbmV3IERlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGV2ZWxvcG1lbnRTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoSU5ERVBFTkRFTlRfUFJPSkVDVF9TVEFHRSwgQ1VTVE9NX0RFVik7DQotICAgICAgICBhc3NlcnRUcnVlKFByb2plY3RTdGFnZS5pcyhQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKENVU1RPTV9ERVYpKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFRlc3RTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoSU5ERVBFTkRFTlRfUFJPSkVDVF9TVEFHRSwgQ1VTVE9NX1RFU1QpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQcm9qZWN0U3RhZ2UuaXMoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShDVVNUT01fVEVTVCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFsbGJhY2tTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoSU5ERVBFTkRFTlRfUFJPSkVDVF9TVEFHRSwgIlN5c3RlbVRlc3QiKTsNCi0gICAgICAgIGFzc2VydFRydWUoSnNmUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5TeXN0ZW1UZXN0KSk7DQotICAgICAgICBhc3NlcnRUcnVlKFByb2plY3RTdGFnZS5pcyhQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKCJTeXN0ZW1UZXN0IikpKTsNCi0gICAgICAgIGFzc2VydFRydWUoUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5TeXN0ZW1UZXN0LmdldFZhbHVlKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGVKc2ZTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoSU5ERVBFTkRFTlRfUFJPSkVDVF9TVEFHRSwgQ1VTVE9NX0RFVik7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKEpTRl9QUk9KRUNUX1NUQUdFLCAiU3lzdGVtVGVzdCIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLlN5c3RlbVRlc3QpKTsNCi0gICAgICAgIGFzc2VydFRydWUoUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5TeXN0ZW1UZXN0LmdldFZhbHVlKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZHVjdGlvblN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihJTkRFUEVOREVOVF9QUk9KRUNUX1NUQUdFLCBDVVNUT01fUFJPRCk7DQotICAgICAgICBhc3NlcnRUcnVlKFByb2plY3RTdGFnZS5pcyhQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKENVU1RPTV9QUk9EKSkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICBhc3NlcnRUcnVlKFByb2plY3RTdGFnZS5pcyhQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKENVU1RPTV9QUk9EKSkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ0RlZmF1bHRTdGFnZTEoKQ0KLSAgICB7DQotICAgICAgICBhc3NlcnRGYWxzZShQcm9qZWN0U3RhZ2UuaXMoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShDVVNUT01fREVWKSkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ0RlZmF1bHRTdGFnZTIoKQ0KLSAgICB7DQotICAgICAgICBhc3NlcnRGYWxzZShQcm9qZWN0U3RhZ2UuaXMoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShDVVNUT01fVEVTVCkpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0pzZlByb2plY3RTdGFnZVRlc3RDYXNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0pzZlByb2plY3RTdGFnZVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MDE1NWEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9Kc2ZQcm9qZWN0U3RhZ2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5zdGFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSnNmUHJvamVjdFN0YWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLXB1YmxpYyBjbGFzcyBKc2ZQcm9qZWN0U3RhZ2VUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX1NUQUdFID0gImphdmF4LmZhY2VzLlBST0pFQ1RfU1RBR0UiOw0KLSAgICBwdWJsaWMgSnNmUHJvamVjdFN0YWdlVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEpzZlByb2plY3RTdGFnZVRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGV2ZWxvcG1lbnRTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoUFJPSkVDVF9TVEFHRSwgIkRldmVsb3BtZW50Iik7DQotICAgICAgICBhc3NlcnRUcnVlKEpzZlByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuRGV2ZWxvcG1lbnQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pdFRlc3RTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoUFJPSkVDVF9TVEFHRSwgIlVuaXRUZXN0Iik7DQotICAgICAgICBhc3NlcnRUcnVlKEpzZlByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuVW5pdFRlc3QpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3lzdGVtVGVzdFN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihQUk9KRUNUX1NUQUdFLCAiU3lzdGVtVGVzdCIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLlN5c3RlbVRlc3QpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZHVjdGlvblN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihQUk9KRUNUX1NUQUdFLCAiUHJvZHVjdGlvbiIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLlByb2R1Y3Rpb24pKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgYXNzZXJ0VHJ1ZShKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLlByb2R1Y3Rpb24pKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdEZWZhdWx0U3RhZ2UxKCkNCi0gICAgew0KLSAgICAgICAgYXNzZXJ0RmFsc2UoSnNmUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5EZXZlbG9wbWVudCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ0RlZmF1bHRTdGFnZTIoKQ0KLSAgICB7DQotICAgICAgICBhc3NlcnRGYWxzZShKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLlVuaXRUZXN0KSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFdyb25nRGVmYXVsdFN0YWdlMygpDQotICAgIHsNCi0gICAgICAgIGFzc2VydEZhbHNlKEpzZlByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuU3lzdGVtVGVzdCkpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1NGQwYi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD50ZXN0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBUZXN0LU1vZHVsZXM8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+DQotICAgICAgICAgICAgc2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvdmFsaWRhdGlvbi1tb2R1bGVzDQotICAgICAgICA8L2Nvbm5lY3Rpb24+DQotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj4NCi0gICAgICAgICAgICBzY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvdmFsaWRhdGlvbi1tb2R1bGVzDQotICAgICAgICA8L2RldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy92YWxpZGF0aW9uLW1vZHVsZXM8L3VybD4NCi0gICAgPC9zY20+DQotDQotICAgIDxtb2R1bGVzPg0KLSAgICAgICAgPG1vZHVsZT5iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmU8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+Y29yZS10ZXN0czwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzPC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPmJlYW4tdmFsaWRhdGlvbi10ZXN0czwvbW9kdWxlPg0KLSAgICA8L21vZHVsZXM+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjU8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldC5qc3A8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNwLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zaGFsZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zaGFsZS10ZXN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC40PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4NCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5teWZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgPC9leGNsdXNpb25zPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgPC9yZXNvdXJjZXM+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+dGVzdC1qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotDQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQuMjwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovQWJzdHJhY3QqLmphdmE8L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovQmFzZSouamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9UZXN0VXRpbHMuamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qQmVhbi5qYXZhPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjI0MzBkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFByb3BlcnR5LVZhbGlkYXRpb24tVGVzdHM8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPnRlc3QtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlLXRlc3RzPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL0Fic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk1M2Q2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5BYnN0cmFjdEV4VmFsVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW52b2tlU3RhcnR1cExpc3RlbmVycygpDQotICAgIHsNCi0gICAgICAgIG5ldyBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIoKXsNCi0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0MjMwNzY5MjA5MjY3NTI2NDZMOw0KLQ0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgc3VwZXIuaW5pdCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0uaW5pdCgpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKQ0KLSAgICB7DQotICAgICAgICBuZXcgQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcigpLmFmdGVyUGhhc2UobmV3IFBoYXNlRXZlbnQoZmFjZXNDb250ZXh0LCBQaGFzZUlkLkFOWV9QSEFTRSxsaWZlY3ljbGUpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL0Jhc2VWYWxUZXN0QmVhbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9CYXNlVmFsVGVzdEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg1NDNmOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL0Jhc2VWYWxUZXN0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlDQotICovDQotcHVibGljIGNsYXNzIEJhc2VWYWxUZXN0QmVhbg0KLXsNCi0gICAgQFJlcXVpcmVkDQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7DQotDQotICAgIEBMZW5ndGgobWluaW11bT0yLG1heGltdW09MykNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTE7DQotDQotICAgIEBQYXR0ZXJuKCJbQS1aXVthLXpdKyIpDQotICAgIHByaXZhdGUgU3RyaW5nIHBhdHRlcm5OYW1lOw0KLQ0KLSAgICBARG91YmxlUmFuZ2UobWluaW11bT0tMzAwZCkNCi0gICAgcHJpdmF0ZSBEb3VibGUgZG91YmxlVmFsdWUxOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmFtZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZTEoU3RyaW5nIG5hbWUxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm5hbWUxID0gbmFtZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXR0ZXJuTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuTmFtZShTdHJpbmcgcGF0dGVybk5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGF0dGVybk5hbWUgPSBwYXR0ZXJuTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRG91YmxlIGdldERvdWJsZVZhbHVlMSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkb3VibGVWYWx1ZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RG91YmxlVmFsdWUxKERvdWJsZSBkb3VibGVWYWx1ZTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZG91YmxlVmFsdWUxID0gZG91YmxlVmFsdWUxOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvQ3VzdG9tU2V2ZXJpdHlUZXN0QmVhbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9DdXN0b21TZXZlcml0eVRlc3RCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NzdmZmUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9DdXN0b21TZXZlcml0eVRlc3RCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmN1c3RvbS5DdXN0b21WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1wdWJsaWMgY2xhc3MgQ3VzdG9tU2V2ZXJpdHlUZXN0QmVhbg0KLXsNCi0gICAgQFJlcXVpcmVkKHBhcmFtZXRlcnMgPSBDdXN0b21WaW9sYXRpb25TZXZlcml0eS5XYXJuaW5nLmNsYXNzKQ0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9CYXNlVmFsVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9CYXNlVmFsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhkMDc2MS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvQmFzZVZhbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5iYXNldmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5CYXNlVmFsVGVzdEJlYW47DQotDQotLyoqDQotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBCYXNlVmFsVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlDQotew0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgQmFzZVZhbFRlc3RCZWFuIGJlYW4gPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgQmFzZVZhbFRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgYmVhbiA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQmFzZVZhbFRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0gICAgICAgIGJlYW4gPSBuZXcgQmFzZVZhbFRlc3RCZWFuKCk7DQotICAgICAgICBWYWx1ZUJpbmRpbmcgdmIgPSBhcHBsaWNhdGlvbi5jcmVhdGVWYWx1ZUJpbmRpbmcoIiN7dGVzdEJlYW59Iik7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dCgidGVzdEJlYW4iLCBiZWFuKTsNCi0NCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOw0KLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOw0KLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOw0KLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50ID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0SWQoImlucHV0MSIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgYmVhbiA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWVSZXF1aXJlZEZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZX0iKTsNCi0NCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWUxTGVuZ2h0TWF4RmFpbCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lMX0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiMTIzNDUiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWUxTGVuZ2h0Q29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lMX0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWUxTGVuZ2h0TWluRmFpbCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lMX0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgieCIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZTFOb0xlbmdodCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lMX0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFBhdHRlcm5OYW1lRmFpbCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wYXR0ZXJuTmFtZX0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiUGV0ZXIxIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXR0ZXJuTm9OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnBhdHRlcm5OYW1lfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0dGVybk5hbWVDb3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnBhdHRlcm5OYW1lfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCJQZXRlciIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVWYWx1ZUZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4uZG91YmxlVmFsdWUxfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCItMzAxIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVWYWx1ZUNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4uZG91YmxlVmFsdWUxfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIyMDAiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyMDBkLCBpbnB1dENvbXBvbmVudC5nZXRWYWx1ZSgpKTsNCi0NCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnVwZGF0ZU1vZGVsKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMjAwZCwgYmVhbi5nZXREb3VibGVWYWx1ZTEoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdERvdWJsZU5vVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4uZG91YmxlVmFsdWUxfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9DdXN0b21TZXZlcml0eTFUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzZhOGNiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9DdXN0b21TZXZlcml0eTFUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuYmFzZXZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5DdXN0b21TZXZlcml0eVRlc3RCZWFuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmN1c3RvbS5DdXN0b21WaW9sYXRpb25TZXZlcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1wdWJsaWMgY2xhc3MgQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlDQotew0KLSAgICBwcml2YXRlIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICBwcml2YXRlIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHByaXZhdGUgQ3VzdG9tU2V2ZXJpdHlUZXN0QmVhbiBiZWFuID0gbnVsbDsNCi0NCi0gICAgcHVibGljIEN1c3RvbVNldmVyaXR5MVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgYmVhbiA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgYmVhbiA9IG5ldyBDdXN0b21TZXZlcml0eVRlc3RCZWFuKCk7DQotICAgICAgICBWYWx1ZUJpbmRpbmcgdmIgPSBhcHBsaWNhdGlvbi5jcmVhdGVWYWx1ZUJpbmRpbmcoIiN7dGVzdEJlYW59Iik7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dCgidGVzdEJlYW4iLCBiZWFuKTsNCi0NCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOw0KLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOw0KLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOw0KLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50ID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0SWQoImlucHV0MSIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgYmVhbiA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbVZhbGlkYXRpb25QYXJhbWV0ZXJWaWFHbG9iYWxQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KFZpb2xhdGlvblNldmVyaXR5LmNsYXNzLmdldE5hbWUoKSwgQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lfSIpOw0KLQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfV0FSTik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbVZhbGlkYXRpb25QYXJhbWV0ZXJWaWFTdGF0aWNDb25maWcoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uKCk7DQotICAgICAgICBjb25maWcuYWRkTWFwcGluZyhWaW9sYXRpb25TZXZlcml0eS5jbGFzcy5nZXROYW1lKCksIEN1c3RvbVZpb2xhdGlvblNldmVyaXR5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuVkFMSURBVElPTl9QQVJBTUVURVJfQ09ORklHLCBjb25maWcpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lfSIpOw0KLQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfV0FSTik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFVua25vd25WYWxpZGF0aW9uUGFyYW1ldGVyKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWV9Iik7DQotDQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9BZGRpdGlvbmFsVmFsaWRhdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL0FkZGl0aW9uYWxWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM0MmQyMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL0FkZGl0aW9uYWxWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuYmFzZXZhbC5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuUGFyYW1ldGVyVmFsdWU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotcHVibGljIGNsYXNzIEFkZGl0aW9uYWxWYWxpZGF0b3IgZXh0ZW5kcyBUZXN0VmFsaWRhdG9yUHJvdmlkZXINCi17DQotICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0UHJvdmlkZXJDbGFzcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBBZGRpdGlvbmFsVmFsaWRhdG9yLmNsYXNzOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gInZhbGlkYXRpb25fZmFpbGVkIjsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvUGFyYW1ldGVyVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvUGFyYW1ldGVyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxMzE4NS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1BhcmFtZXRlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5iYXNldmFsLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotcHVibGljIGNsYXNzIFBhcmFtZXRlclRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFBhcmFtZXRlclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyU3R5bGVPbmUoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCk7DQotDQotICAgICAgICBUZXN0UGVyc29uIHBlcnNvbiA9IG5ldyBUZXN0UGVyc29uKCk7DQotICAgICAgICBSZXF1aXJlZCByZXF1aXJlZCA9IHBlcnNvbi5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoImZpcnN0TmFtZSIpLmdldEFubm90YXRpb24oUmVxdWlyZWQuY2xhc3MpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCkuY29udGFpbnNLZXkoVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MpKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFZpb2xhdGlvblNldmVyaXR5LmNsYXNzKS5pdGVyYXRvcigpLm5leHQoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4sIGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBWaW9sYXRpb25TZXZlcml0eS5jbGFzcykuaXRlcmF0b3IoKS5uZXh0KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJTdHlsZVR3bygpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKTsNCi0NCi0gICAgICAgIFRlc3RQZXJzb24gcGVyc29uID0gbmV3IFRlc3RQZXJzb24oKTsNCi0gICAgICAgIFJlcXVpcmVkIHJlcXVpcmVkID0gcGVyc29uLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgibGFzdE5hbWUiKS5nZXRBbm5vdGF0aW9uKFJlcXVpcmVkLmNsYXNzKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQpLmNvbnRhaW5zS2V5KCJjbGllbnRfc2lkZV92YWxpZGF0aW9uX3N1cHBvcnQiKSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCAiY2xpZW50X3NpZGVfdmFsaWRhdGlvbl9zdXBwb3J0IikuaXRlcmF0b3IoKS5uZXh0KCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgImNsaWVudF9zaWRlX3ZhbGlkYXRpb25fc3VwcG9ydCIpLml0ZXJhdG9yKCkubmV4dCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyU3R5bGVUaHJlZSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKTsNCi0NCi0gICAgICAgIFRlc3RQZXJzb24gcGVyc29uID0gbmV3IFRlc3RQZXJzb24oKTsNCi0gICAgICAgIFJlcXVpcmVkIHJlcXVpcmVkID0gcGVyc29uLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgibGFzdE5hbWUiKS5nZXRBbm5vdGF0aW9uKFJlcXVpcmVkLmNsYXNzKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQpLmNvbnRhaW5zS2V5KFRlc3RQcmlvcml0eS5jbGFzcykpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgVGVzdFByaW9yaXR5LmNsYXNzKS5pdGVyYXRvcigpLm5leHQoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMSksIGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBUZXN0UHJpb3JpdHkuY2xhc3MsIEludGVnZXIuY2xhc3MpLml0ZXJhdG9yKCkubmV4dCgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgVGVzdFByaW9yaXR5LmNsYXNzLCBTdHJpbmcuY2xhc3MpLnNpemUoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoImRvIGl0IGFzYXAiLCBleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgVGVzdFByaW9yaXR5LmNsYXNzLCBTdHJpbmcuY2xhc3MsIFRlc3RQcmlvcml0eS5TaG9ydERlc2NyaXB0aW9uLmNsYXNzKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoImRvIGl0IGltbWVkaWF0ZWx5IiwgZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFRlc3RQcmlvcml0eS5jbGFzcywgU3RyaW5nLmNsYXNzLCBUZXN0UHJpb3JpdHkuTG9uZ0Rlc2NyaXB0aW9uLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlclN0eWxlRm91cigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKTsNCi0NCi0gICAgICAgIFRlc3RQZXJzb24gcGVyc29uID0gbmV3IFRlc3RQZXJzb24oKTsNCi0gICAgICAgIFJlcXVpcmVkIHJlcXVpcmVkID0gcGVyc29uLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgibGFzdE5hbWUiKS5nZXRBbm5vdGF0aW9uKFJlcXVpcmVkLmNsYXNzKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQpLmNvbnRhaW5zS2V5KFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcykuaXRlcmF0b3IoKS5uZXh0KCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcykuc2l6ZSgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLmdldE5hbWUoKSwgZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLCBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcykuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJTdHlsZUZpdmUoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCk7DQotDQotICAgICAgICBUZXN0UGVyc29uIHBlcnNvbiA9IG5ldyBUZXN0UGVyc29uKCk7DQotICAgICAgICBSZXF1aXJlZCByZXF1aXJlZCA9IHBlcnNvbi5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoImxhc3ROYW1lIikuZ2V0QW5ub3RhdGlvbihSZXF1aXJlZC5jbGFzcyk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkKS5jb250YWluc0tleShEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykuaXRlcmF0b3IoKS5uZXh0KCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpLnNpemUoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcywgQ2xhc3MuY2xhc3MpLnNpemUoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKSwgZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcywgQ2xhc3MuY2xhc3MpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogVE9ETyB0aGVzZSB0ZXN0cyB3b3JrIGluIGFuIGlkZSBidXQgbm90IHZpYSBjb21tYW5kbGluZSAtIGl0J3MgYSBTdXJlZmlyZSBpc3N1ZQ0KLSAgICAgKi8NCi0gICAgLyoNCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlclN0eWxlU2l4KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpOw0KLQ0KLSAgICAgICAgVGVzdFBlcnNvbiBwZXJzb24gPSBuZXcgVGVzdFBlcnNvbigpOw0KLSAgICAgICAgUmVxdWlyZWQgcmVxdWlyZWQgPSBwZXJzb24uZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJsYXN0TmFtZSIpLmdldEFubm90YXRpb24oUmVxdWlyZWQuY2xhc3MpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCkuY29udGFpbnNLZXkoVGVzdFZhbGlkYXRvclByb3ZpZGVyLmNsYXNzKSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBUZXN0VmFsaWRhdG9yUHJvdmlkZXIuY2xhc3MpLml0ZXJhdG9yKCkubmV4dCgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgVGVzdFZhbGlkYXRvclByb3ZpZGVyLmNsYXNzLCBDbGFzcy5jbGFzcykuc2l6ZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyU3R5bGVTZXZlbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKTsNCi0NCi0gICAgICAgIFRlc3RQZXJzb24gcGVyc29uID0gbmV3IFRlc3RQZXJzb24oKTsNCi0gICAgICAgIFJlcXVpcmVkIHJlcXVpcmVkID0gcGVyc29uLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgibGFzdE5hbWUiKS5nZXRBbm5vdGF0aW9uKFJlcXVpcmVkLmNsYXNzKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQpLmNvbnRhaW5zS2V5KFRlc3RWYWxpZGF0b3JQcm92aWRlci5jbGFzcykpOw0KLSAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50Q2xhc3MgOiBleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgVGVzdFZhbGlkYXRvclByb3ZpZGVyLmNsYXNzLCBDbGFzcy5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShUZXN0VmFsaWRhdG9yUHJvdmlkZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjdXJyZW50Q2xhc3MpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICAqLw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RBbGxvd0NsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RBbGxvd0NsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiM2I5NzMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0QWxsb3dDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5iYXNldmFsLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuUGFyYW1ldGVyVmFsdWU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlBhcmFtZXRlcktleTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIFRlc3RBbGxvd0NsaWVudFNpZGVWYWxpZGF0aW9uIGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcg0KLXsNCi0gICAgQFBhcmFtZXRlcktleQ0KLSAgICBwdWJsaWMgU3RyaW5nIEtFWSA9ICJjbGllbnRfc2lkZV92YWxpZGF0aW9uX3N1cHBvcnQiOw0KLQ0KLSAgICBAUGFyYW1ldGVyVmFsdWUNCi0gICAgYm9vbGVhbiB2YWx1ZSA9IHRydWU7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdERlbnlDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0RGVueUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyOTNkY2QuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0RGVueUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5QYXJhbWV0ZXJWYWx1ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuUGFyYW1ldGVyS2V5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgVGVzdERlbnlDbGllbnRTaWRlVmFsaWRhdGlvbiBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi17DQotICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgcHVibGljIFN0cmluZyBrZXkgPSAiY2xpZW50X3NpZGVfdmFsaWRhdGlvbl9zdXBwb3J0IjsNCi0NCi0gICAgQFBhcmFtZXRlclZhbHVlDQotICAgIGJvb2xlYW4gdmFsdWUgPSBmYWxzZTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UGVyc29uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQZXJzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4MzQ5NC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQZXJzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0UGVyc29uDQotew0KLSAgICBAUmVxdWlyZWQocGFyYW1ldGVycyA9IHtWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzLCBUZXN0QWxsb3dDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzc30pDQotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsNCi0NCi0gICAgQFJlcXVpcmVkKHBhcmFtZXRlcnMgPSB7DQotICAgICAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHkuSW5mby5jbGFzcywNCi0gICAgICAgICAgICBUZXN0RGVueUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLA0KLSAgICAgICAgICAgIFRlc3RQcmlvcml0eUhpZ2guY2xhc3MsDQotICAgICAgICAgICAgVGVzdFZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcywNCi0gICAgICAgICAgICBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MsDQotICAgICAgICAgICAgLy9Mb2dpblZhbGlkYXRvci5jbGFzcywNCi0gICAgICAgICAgICBBZGRpdGlvbmFsVmFsaWRhdG9yLmNsYXNzfSkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7DQotDQotICAgIHByaXZhdGUgaW50IGZhaWxlZExvZ2lucyA9IDA7DQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VyTG9ja2VkOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBUT0RPIHRoZXNlIHRlc3RzIHdvcmsgaW4gYW4gaWRlIGJ1dCBub3QgdmlhIGNvbW1hbmRsaW5lIC0gaXQncyBhIFN1cmVmaXJlIGlzc3VlDQotICAgICAqLw0KLSAgICAvKg0KLSAgICBwdWJsaWMgY2xhc3MgTG9naW5WYWxpZGF0b3IgZXh0ZW5kcyBUZXN0VmFsaWRhdG9yUHJvdmlkZXINCi0gICAgew0KLSAgICAgICAgQFBhcmFtZXRlclZhbHVlDQotICAgICAgICBwdWJsaWMgVGVzdFZhbGlkYXRpb25TdHJhdGVneVByb3ZpZGVyIGdldFZhbHVlKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpczsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsaWRhdGlvblN0cmF0ZWd5KCkgew0KLQ0KLSAgICAgICAgICAgICAgICBpbnQgZmFpbGVkTG9naW5zOw0KLQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZigodGhpcy5mYWlsZWRMb2dpbnMgPSBpc0xvZ2luU3VjY2Vzc2Z1bCgpKSA+IDApDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5mYWlsZWRMb2dpbnMgPiAzKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaygpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH07DQotICAgICAgICB9DQotICAgIH0NCi0gICAgKi8NCi0NCi0gICAgcHJpdmF0ZSBpbnQgaXNMb2dpblN1Y2Nlc3NmdWwoKQ0KLSAgICB7DQotICAgICAgICAvL2ZvcmNlIGFuIGV4Y2VwdGlvbg0KLSAgICAgICAgcmV0dXJuICsrdGhpcy5mYWlsZWRMb2dpbnM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNMb2NrZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdXNlckxvY2tlZDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgbG9jaygpDQotICAgIHsNCi0gICAgICAgIHRoaXMudXNlckxvY2tlZCA9IHRydWU7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbGFzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UHJpb3JpdHkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxOWU4YzQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UHJpb3JpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuYmFzZXZhbC5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlBhcmFtZXRlclZhbHVlOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgVGVzdFByaW9yaXR5IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcg0KLXsNCi0gICAgQFBhcmFtZXRlclZhbHVlDQotICAgIEludGVnZXIgZ2V0VmFsdWUoKTsNCi0NCi0gICAgQFBhcmFtZXRlclZhbHVlKGlkID0gU2hvcnREZXNjcmlwdGlvbi5jbGFzcykNCi0gICAgU3RyaW5nIGdldFNob3J0RGVzY3JpcHRpb24oKTsNCi0NCi0gICAgQFBhcmFtZXRlclZhbHVlKGlkID0gTG9uZ0Rlc2NyaXB0aW9uLmNsYXNzKQ0KLSAgICBTdHJpbmcgZ2V0TG9uZ0Rlc2NyaXB0aW9uKCk7DQotDQotICAgIGludGVyZmFjZSBTaG9ydERlc2NyaXB0aW9ue30NCi0gICAgaW50ZXJmYWNlIExvbmdEZXNjcmlwdGlvbnt9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5SGlnaC5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UHJpb3JpdHlIaWdoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZmEyZGEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UHJpb3JpdHlIaWdoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0UHJpb3JpdHlIaWdoIGltcGxlbWVudHMgVGVzdFByaW9yaXR5DQotew0KLSAgICBwdWJsaWMgSW50ZWdlciBnZXRWYWx1ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvcnREZXNjcmlwdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAiZG8gaXQgYXNhcCI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMb25nRGVzY3JpcHRpb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gImRvIGl0IGltbWVkaWF0ZWx5IjsNCi0gICAgfQ0KLQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQcmlvcml0eUxvdy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UHJpb3JpdHlMb3cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyZjVlZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQcmlvcml0eUxvdy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5iYXNldmFsLnBhcmFtZXRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdFByaW9yaXR5TG93IGltcGxlbWVudHMgVGVzdFByaW9yaXR5DQotew0KLSAgICBwdWJsaWMgSW50ZWdlciBnZXRWYWx1ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvcnREZXNjcmlwdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAibm90IHRoYXQgaW1wb3J0YW50IjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvbmdEZXNjcmlwdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAidGhlIHRvcGljIGlzIG5vdCB0aGF0IGltcG9ydGFudCI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcxMjI4My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuYmFzZXZhbC5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5QYXJhbWV0ZXJWYWx1ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLUBJbnZvY2F0aW9uT3JkZXIoMjEwKQ0KLXB1YmxpYyBjbGFzcyBUZXN0VmFsaWRhdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHByaXZhdGUgc3RhdGljIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLQ0KLSAgICBAUGFyYW1ldGVyVmFsdWUNCi0gICAgcHVibGljIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIGdldEluc3RhbmNlKCkNCi0gICAgew0KLSAgICAgICAgaWYocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA9IG5ldyBUZXN0VmFsaWRhdGlvbkludGVyY2VwdG9yKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gYmVmb3JlVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIml0J3MgYSB0ZXN0IGNsYXNzIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiaXQncyBhIHRlc3QgY2xhc3MiKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0aW9uU3RyYXRlZ3lQcm92aWRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdGlvblN0cmF0ZWd5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3OWUyZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0aW9uU3RyYXRlZ3lQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5iYXNldmFsLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotcHVibGljIGludGVyZmFjZSBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5UHJvdmlkZXINCi17DQotICAgIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3koKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdG9yUHJvdmlkZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFZhbGlkYXRvclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNjU4ZTkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdG9yUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuYmFzZXZhbC5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5QYXJhbWV0ZXJLZXk7DQotDQotcHVibGljIGNsYXNzIFRlc3RWYWxpZGF0b3JQcm92aWRlciBpbXBsZW1lbnRzIFZhbGlkYXRpb25QYXJhbWV0ZXIsIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lQcm92aWRlcg0KLXsNCi0gICAgQFBhcmFtZXRlcktleQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0S2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFRlc3RWYWxpZGF0b3JQcm92aWRlci5jbGFzczsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogaXQgaXNuJ3QgYWxsb3dlZCB0byBoYXZlIGFuIGFic3RyYWN0IGNsYXNzIGluIHRoaXMgY2FzZSAtIHNvIHRoaXMgaW1wbC4gaXMgcmVxdWlyZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigieW91IGhhdmUgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QiKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdEJlYW4uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWYyNzM4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxUZXN0QmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkxOw0KLQ0KLSAgICBARXF1YWxzKCJwcm9wZXJ0eTEiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTA0N2VmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlDQotICovDQotcHVibGljIGNsYXNzIENyb3NzVmFsVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlDQotew0KLQ0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0NCi0gICAgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgcHVibGljIENyb3NzVmFsVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShDcm9zc1ZhbFRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgICAgICBDcm9zc1ZhbFRlc3RCZWFuIGJlYW4gPSBuZXcgQ3Jvc3NWYWxUZXN0QmVhbigpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKG51bGwsICJ2YWx1ZSIsICIje3Rlc3RCZWFufSIpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKS5wdXQoInRlc3RCZWFuIixiZWFuKTsNCi0NCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOw0KLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOw0KLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOw0KLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0SWQoImlucHV0MSIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRJZCgiaW5wdXQyIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZWFyRG93bigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNDb3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzRmFpbCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIjFkNCIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDIpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmJjZDExLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRUxDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbC5tb2NrLk1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UudXRpbC5NZXRob2RVdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRUxDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UgZXh0ZW5kcyBFTENyb3NzVmFsVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBFTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRUxDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0NCi0gICAgICAgIFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uKCk7DQotDQotICAgICAgICBjb25maWcuYWRkTWFwcGluZyhFcXVhbHMuY2xhc3MuZ2V0TmFtZSgpLCBNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsIGNvbmZpZyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHJldGVzdCB0aGlzIHRlc3QtY2FzZQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCByZXRlc3QgdGhpcyB0ZXN0LWNhc2UNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpOw0KLSAgICAgICAgYXNzZXJ0RmFsc2UoTWV0aG9kVXRpbHMuaXNNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIikpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCk7DQotICAgICAgICBhc3NlcnRUcnVlKE1ldGhvZFV0aWxzLmlzTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIpKTsNCi0gICAgICAgIC8vMXggZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkgYW5kIDF4IGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwNCi0gICAgICAgIGFzc2VydFRydWUoTWV0aG9kVXRpbHMuY2hlY2tNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIiwgMikpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRUxDcm9zc1ZhbFRlc3RDYXNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDhlOTMzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRUxDcm9zc1ZhbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkRhdGVUaW1lQ29udmVydGVyOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5BYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRUxDcm9zc1ZhbFRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZQ0KLXsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotDQotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHB1YmxpYyBFTENyb3NzVmFsVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShFTENyb3NzVmFsVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJiZWFuMSIsIGdldEVudGl0eUluc3RhbmNlKCkpOw0KLSAgICAgICAgY3JlYXRlUmVxdWVzdFNjb3BlZEJlYW4oImJlYW4yIiwgZ2V0RW50aXR5SW5zdGFuY2UoKSk7DQotDQotDQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsNCi0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsNCi0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7DQotDQotICAgICAgICAvL2lucHV0MQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRJZCgiaW5wdXQxIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0Q29udmVydGVyKG5ldyBEYXRlVGltZUNvbnZlcnRlcigpKTsNCi0gICAgICAgICgoRGF0ZVRpbWVDb252ZXJ0ZXIpaW5wdXRDb21wb25lbnQxLmdldENvbnZlcnRlcigpKS5zZXRQYXR0ZXJuKCJkZC5NTS55eXl5Iik7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50MSk7DQotDQotICAgICAgICAvL2lucHV0Mg0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRJZCgiaW5wdXQyIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0Q29udmVydGVyKG5ldyBEYXRlVGltZUNvbnZlcnRlcigpKTsNCi0gICAgICAgICgoRGF0ZVRpbWVDb252ZXJ0ZXIpaW5wdXRDb21wb25lbnQyLmdldENvbnZlcnRlcigpKS5zZXRQYXR0ZXJuKCJkZC5NTS55eXl5Iik7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Mik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZWFyRG93bigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZUVMQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlRUxDcm9zc0NvbXBvbmVudFZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxMi4xMi4yMDA4Iik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgyKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVFTENyb3NzQ29tcG9uZW50VmFsaWRhdGlvblVzZUNhc2UoU3RyaW5nIHZhbHVlQmVhbjFQcm9wZXJ0eTEsIFN0cmluZyB2YWx1ZUJlYW4xUHJvcGVydHkyLCBTdHJpbmcgdmFsdWVCZWFuMlByb3BlcnR5MSwgU3RyaW5nIHZhbHVlQmVhbjJQcm9wZXJ0eTIpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje2JlYW4xLmRhdGUxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7YmVhbjIuZGF0ZTJ9Iik7DQotDQotICAgICAgICAvL3NldCBtb2RlbCB2YWx1ZXMNCi0gICAgICAgIHJlc29sdmVCZWFuKCJiZWFuMSIsIGdldEVudGl0eUluc3RhbmNlKCkuZ2V0Q2xhc3MoKSkuc2V0RGF0ZTIoKERhdGUpaW5wdXRDb21wb25lbnQxLmdldENvbnZlcnRlcigpLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgaW5wdXRDb21wb25lbnQxLCB2YWx1ZUJlYW4xUHJvcGVydHkyKSk7DQotICAgICAgICByZXNvbHZlQmVhbigiYmVhbjIiLCBnZXRFbnRpdHlJbnN0YW5jZSgpLmdldENsYXNzKCkpLnNldERhdGUxKChEYXRlKWlucHV0Q29tcG9uZW50Mi5nZXRDb252ZXJ0ZXIoKS5nZXRBc09iamVjdChmYWNlc0NvbnRleHQsIGlucHV0Q29tcG9uZW50MiwgdmFsdWVCZWFuMlByb3BlcnR5MSkpOw0KLQ0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSh2YWx1ZUJlYW4xUHJvcGVydHkxKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSh2YWx1ZUJlYW4yUHJvcGVydHkyKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlRUxNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZUVMTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjEyLjEyLjIwMDgiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUVMTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvblVzZUNhc2UoU3RyaW5nIHZhbHVlQmVhbjFQcm9wZXJ0eTEsIFN0cmluZyB2YWx1ZUJlYW4xUHJvcGVydHkyLCBTdHJpbmcgdmFsdWVCZWFuMlByb3BlcnR5MSwgU3RyaW5nIHZhbHVlQmVhbjJQcm9wZXJ0eTIpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje2JlYW4xLmRhdGUxfSIpOw0KLQ0KLSAgICAgICAgLy9zZXQgbW9kZWwgdmFsdWVzDQotICAgICAgICByZXNvbHZlQmVhbigiYmVhbjEiLCBnZXRFbnRpdHlJbnN0YW5jZSgpLmdldENsYXNzKCkpLnNldERhdGUyKChEYXRlKWlucHV0Q29tcG9uZW50MS5nZXRDb252ZXJ0ZXIoKS5nZXRBc09iamVjdChmYWNlc0NvbnRleHQsIGlucHV0Q29tcG9uZW50MSwgdmFsdWVCZWFuMVByb3BlcnR5MikpOw0KLSAgICAgICAgcmVzb2x2ZUJlYW4oImJlYW4yIiwgZ2V0RW50aXR5SW5zdGFuY2UoKS5nZXRDbGFzcygpKS5zZXREYXRlMSgoRGF0ZSlpbnB1dENvbXBvbmVudDIuZ2V0Q29udmVydGVyKCkuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dENvbXBvbmVudDIsIHZhbHVlQmVhbjJQcm9wZXJ0eTEpKTsNCi0gICAgICAgIHJlc29sdmVCZWFuKCJiZWFuMiIsIGdldEVudGl0eUluc3RhbmNlKCkuZ2V0Q2xhc3MoKSkuc2V0RGF0ZTIoKERhdGUpaW5wdXRDb21wb25lbnQyLmdldENvbnZlcnRlcigpLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgaW5wdXRDb21wb25lbnQyLCB2YWx1ZUJlYW4yUHJvcGVydHkyKSk7DQotDQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKHZhbHVlQmVhbjFQcm9wZXJ0eTEpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgRUxDcm9zc1ZhbFRlc3REYXRlQmVhbiBnZXRFbnRpdHlJbnN0YW5jZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRUxDcm9zc1ZhbFRlc3REYXRlQmVhbigpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRUxDcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FTENyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NzNkMTIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FTENyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFTENyb3NzVmFsVGVzdERhdGVCZWFuDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlIERFRkFVTFRfREFURSA9IG5ldyBEYXRlKCk7DQotDQotICAgIEBFcXVhbHMoIiN7YmVhbjIuZGF0ZTJ9IikNCi0gICAgcHJpdmF0ZSBEYXRlIGRhdGUxID0gREVGQVVMVF9EQVRFOw0KLQ0KLSAgICBwcml2YXRlIERhdGUgZGF0ZTIgPSBERUZBVUxUX0RBVEU7DQotDQotICAgIHB1YmxpYyBEYXRlIGdldERhdGUxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRhdGUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERhdGUxKERhdGUgZGF0ZTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGF0ZTEgPSBkYXRlMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlMigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkYXRlMjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlMihEYXRlIGRhdGUyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRhdGUyID0gZGF0ZTI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFjYTRlZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbC5tb2NrLk1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UudXRpbC5NZXRob2RVdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZSBleHRlbmRzIExvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShMb2NhbFByb3BlcnR5Q3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotDQotICAgICAgICBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbigpOw0KLQ0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoRXF1YWxzLmNsYXNzLmdldE5hbWUoKSwgTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHLCBjb25maWcpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgcmV0ZXN0IHRoaXMgdGVzdC1jYXNlDQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHJldGVzdCB0aGlzIHRlc3QtY2FzZQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpOw0KLSAgICAgICAgYXNzZXJ0RmFsc2UoTWV0aG9kVXRpbHMuaXNNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIikpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShNZXRob2RVdGlscy5pc01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiKSk7DQotICAgICAgICAvLzF4IGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5IGFuZCAxeCBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsDQotICAgICAgICBhc3NlcnRUcnVlKE1ldGhvZFV0aWxzLmNoZWNrTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIsIDIpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3RDYXNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YzdmOWIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIExvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3RDYXNlIGV4dGVuZHMgRUxDcm9zc1ZhbFRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShMb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIEVMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4gZ2V0RW50aXR5SW5zdGFuY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IExvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3REYXRlQmVhbigpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTdlMjE3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4gZXh0ZW5kcyBFTENyb3NzVmFsVGVzdERhdGVCZWFuDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlIERFRkFVTFRfREFURSA9IG5ldyBEYXRlKCk7DQotDQotICAgIEBFcXVhbHMoImRhdGUyIikNCi0gICAgcHJpdmF0ZSBEYXRlIGRhdGUxID0gREVGQVVMVF9EQVRFOw0KLQ0KLSAgICBwcml2YXRlIERhdGUgZGF0ZTIgPSBERUZBVUxUX0RBVEU7DQotDQotICAgIHB1YmxpYyBEYXRlIGdldERhdGUxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRhdGUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERhdGUxKERhdGUgZGF0ZTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGF0ZTEgPSBkYXRlMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlMigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkYXRlMjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlMihEYXRlIGRhdGUyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRhdGUyID0gZGF0ZTI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M4YjBhNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbC5tb2NrLk1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UudXRpbC5NZXRob2RVdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFpbkNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZSBleHRlbmRzIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvcGVydHlDaGFpbkNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLQ0KLSAgICAgICAgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24oKTsNCi0NCi0gICAgICAgIGNvbmZpZy5hZGRNYXBwaW5nKEVxdWFscy5jbGFzcy5nZXROYW1lKCksIE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRywgY29uZmlnKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgcmV0ZXN0IHRoaXMgdGVzdC1jYXNlDQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHJldGVzdCB0aGlzIHRlc3QtY2FzZQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCk7DQotICAgICAgICBhc3NlcnRGYWxzZShNZXRob2RVdGlscy5pc01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKTsNCi0gICAgICAgIGFzc2VydFRydWUoTWV0aG9kVXRpbHMuaXNNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIikpOw0KLSAgICAgICAgLy8xeCBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeSBhbmQgMXggZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShNZXRob2RVdGlscy5jaGVja01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiLCAyKSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzU4YzBlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5BYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuRGF0ZVRpbWVDb252ZXJ0ZXI7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UNCi17DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLQ0KLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgY3JlYXRlUmVxdWVzdFNjb3BlZEJlYW4oImJlYW4xIiwgZ2V0RW50aXR5SW5zdGFuY2UoKSk7DQotDQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsNCi0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsNCi0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7DQotDQotICAgICAgICAvL2lucHV0MQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRJZCgiaW5wdXQxIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0Q29udmVydGVyKG5ldyBEYXRlVGltZUNvbnZlcnRlcigpKTsNCi0gICAgICAgICgoRGF0ZVRpbWVDb252ZXJ0ZXIpaW5wdXRDb21wb25lbnQxLmdldENvbnZlcnRlcigpKS5zZXRQYXR0ZXJuKCJkZC5NTS55eXl5Iik7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50MSk7DQotDQotICAgICAgICAvL2lucHV0Mg0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRJZCgiaW5wdXQyIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0Q29udmVydGVyKG5ldyBEYXRlVGltZUNvbnZlcnRlcigpKTsNCi0gICAgICAgICgoRGF0ZVRpbWVDb252ZXJ0ZXIpaW5wdXRDb21wb25lbnQyLmdldENvbnZlcnRlcigpKS5zZXRQYXR0ZXJuKCJkZC5NTS55eXl5Iik7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Mik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZWFyRG93bigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZVByb3BlcnR5Q2hhaW5Dcm9zc0NvbXBvbmVudFZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZVByb3BlcnR5Q2hhaW5Dcm9zc0NvbXBvbmVudFZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjEyLjEyLjIwMDgiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVByb3BlcnR5Q2hhaW5Dcm9zc0NvbXBvbmVudFZhbGlkYXRpb25Vc2VDYXNlKFN0cmluZyB2YWx1ZUJlYW4xUHJvcGVydHkxLCBTdHJpbmcgdmFsdWVCZWFuMlByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7YmVhbjEuZGF0ZTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3tiZWFuMS5zdWJCZWFuLmRhdGUyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSh2YWx1ZUJlYW4xUHJvcGVydHkxKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSh2YWx1ZUJlYW4yUHJvcGVydHkyKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlRUxNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlRUxNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxMi4xMi4yMDA4Iik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKFN0cmluZyB2YWx1ZUJlYW4xUHJvcGVydHkxLCBTdHJpbmcgdmFsdWVCZWFuMlByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7YmVhbjEuZGF0ZTF9Iik7DQotDQotICAgICAgICAvL3NldCBtb2RlbCB2YWx1ZXMNCi0gICAgICAgIHJlc29sdmVCZWFuKCJiZWFuMSIsIGdldEVudGl0eUluc3RhbmNlKCkuZ2V0Q2xhc3MoKSkuZ2V0U3ViQmVhbigpLnNldERhdGUyKChEYXRlKWlucHV0Q29tcG9uZW50Mi5nZXRDb252ZXJ0ZXIoKS5nZXRBc09iamVjdChmYWNlc0NvbnRleHQsIGlucHV0Q29tcG9uZW50MiwgdmFsdWVCZWFuMlByb3BlcnR5MSkpOw0KLQ0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSh2YWx1ZUJlYW4xUHJvcGVydHkxKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbiBnZXRFbnRpdHlJbnN0YW5jZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVCZWFuKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NTVjMTIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZSBERUZBVUxUX0RBVEUgPSBuZXcgRGF0ZSgpOw0KLQ0KLSAgICBARXF1YWxzKCJzdWJCZWFuLmRhdGUyIikNCi0gICAgcHJpdmF0ZSBEYXRlIGRhdGUxID0gREVGQVVMVF9EQVRFOw0KLQ0KLSAgICBwcml2YXRlIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbiBzdWJCZWFuID0gbmV3IFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbigpOw0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlMSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkYXRlMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlMShEYXRlIGRhdGUxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRhdGUxID0gZGF0ZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbiBnZXRTdWJCZWFuKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1YkJlYW47DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0U3ViQmVhbihQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4gc3ViQmVhbikNCi0gICAgew0KLSAgICAgICAgdGhpcy5zdWJCZWFuID0gc3ViQmVhbjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJjMmEyZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZSBERUZBVUxUX0RBVEUgPSBuZXcgRGF0ZSgpOw0KLQ0KLSAgICBwcml2YXRlIERhdGUgZGF0ZTIgPSBERUZBVUxUX0RBVEU7DQotDQotICAgIHB1YmxpYyBEYXRlIGdldERhdGUyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRhdGUyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERhdGUyKERhdGUgZGF0ZTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGF0ZTIgPSBkYXRlMjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYxVGVzdEJlYW4uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjFUZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWU1OGU4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjFUZXN0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZjsNCi0NCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRJZjFUZXN0QmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkxOw0KLQ0KLSAgICBAUmVxdWlyZWRJZih2YWx1ZU9mID0gInByb3BlcnR5MSIpDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MjsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MShTdHJpbmcgcHJvcGVydHkxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MSA9IHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkyKFN0cmluZyBwcm9wZXJ0eTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkyID0gcHJvcGVydHkyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjFUZXN0Q2FzZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NGI2ZWEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotcHVibGljIGNsYXNzIFJlcXVpcmVkSWYxVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlDQotew0KLQ0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0NCi0gICAgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgcHVibGljIFJlcXVpcmVkSWYxVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZXF1aXJlZElmMVRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgICAgICBSZXF1aXJlZElmMVRlc3RCZWFuIGJlYW4gPSBuZXcgUmVxdWlyZWRJZjFUZXN0QmVhbigpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKG51bGwsICJ2YWx1ZSIsICIje3Rlc3RCZWFufSIpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKS5wdXQoInRlc3RCZWFuIiwgYmVhbik7DQotDQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsNCi0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsNCi0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldElkKCJpbnB1dDEiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0SWQoImlucHV0MiIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZlRhcmdldE5vdEVtcHR5RmFpbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmVGFyZ2V0Tm90RW1wdHlDb3JyZWN0MSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZUYXJnZXROb3RFbXB0eUNvcnJlY3QyKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZlRhcmdldE5vdEVtcHR5Q29ycmVjdDMoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjJUZXN0QmVhbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMlRlc3RCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZTJmOWMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMlRlc3RCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZlR5cGUuKjsNCi0NCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRJZjJUZXN0QmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkxOw0KLSAgICBAUmVxdWlyZWRJZih2YWx1ZU9mID0gInByb3BlcnR5MSIsIGlzID0gZW1wdHkpDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MjsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MShTdHJpbmcgcHJvcGVydHkxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MSA9IHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkyKFN0cmluZyBwcm9wZXJ0eTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkyID0gcHJvcGVydHkyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjJUZXN0Q2FzZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMlRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZGIyMWIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMlRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotcHVibGljIGNsYXNzIFJlcXVpcmVkSWYyVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlDQotew0KLQ0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0NCi0gICAgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgcHVibGljIFJlcXVpcmVkSWYyVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZXF1aXJlZElmMlRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgICAgICBSZXF1aXJlZElmMlRlc3RCZWFuIGJlYW4gPSBuZXcgUmVxdWlyZWRJZjJUZXN0QmVhbigpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKG51bGwsICJ2YWx1ZSIsICIje3Rlc3RCZWFufSIpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKS5wdXQoInRlc3RCZWFuIiwgYmVhbik7DQotDQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsNCi0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsNCi0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldElkKCJpbnB1dDEiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0SWQoImlucHV0MiIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZlRhcmdldEVtcHR5RmFpbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmVGFyZ2V0RW1wdHlDb3JyZWN0MSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZUYXJnZXRFbXB0eUNvcnJlY3QyKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZlRhcmdldEVtcHR5Q29ycmVjdDMoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjNUZXN0QmVhbi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmM1Rlc3RCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MzQ0ZGYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmM1Rlc3RCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmOw0KLQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZElmM1Rlc3RCZWFuDQotew0KLSAgICBwcml2YXRlIEJvb2xlYW4gcHJvcGVydHkxOw0KLSAgICBAUmVxdWlyZWRJZih2YWx1ZU9mID0gInByb3BlcnR5MSIpDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MjsNCi0NCi0gICAgcHVibGljIEJvb2xlYW4gZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoQm9vbGVhbiBwcm9wZXJ0eTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmM1Rlc3RDYXNlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYzVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkODAzZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYzVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5BYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRJZjNUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UNCi17DQotDQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLQ0KLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgUmVxdWlyZWRJZjNUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlcXVpcmVkSWYzVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0gICAgICAgIFJlcXVpcmVkSWYzVGVzdEJlYW4gYmVhbiA9IG5ldyBSZXF1aXJlZElmM1Rlc3RCZWFuKCk7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcobnVsbCwgInZhbHVlIiwgIiN7dGVzdEJlYW59Iik7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dCgidGVzdEJlYW4iLCBiZWFuKTsNCi0NCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOw0KLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOw0KLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOw0KLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0SWQoImlucHV0MSIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRJZCgiaW5wdXQyIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZWFyRG93bigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmQm9vbGVhblRhcmdldE5vdEVtcHR5RmFpbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmQm9vbGVhblRhcmdldE5vdEVtcHR5Q29ycmVjdDEoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmQm9vbGVhblRhcmdldE5vdEVtcHR5Q29ycmVjdDIoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoQm9vbGVhbi5GQUxTRS50b1N0cmluZygpKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZkJvb2xlYW5UYXJnZXROb3RFbXB0eUNvcnJlY3QzKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKEJvb2xlYW4uRkFMU0UudG9TdHJpbmcoKSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmNFRlc3RCZWFuLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWY0VGVzdEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzYjY5ZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWY0VGVzdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkSWY7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmVHlwZS4qOw0KLQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZElmNFRlc3RCZWFuDQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gcHJvcGVydHkxOw0KLSAgICBAUmVxdWlyZWRJZih2YWx1ZU9mID0gInByb3BlcnR5MSIsIGlzID0gZW1wdHkpDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MjsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MShib29sZWFuIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWY0VGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjRUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWZhYWNkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjRUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLkFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRJZjRUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UNCi17DQotDQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLQ0KLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgUmVxdWlyZWRJZjRUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlcXVpcmVkSWY0VGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0gICAgICAgIFJlcXVpcmVkSWY0VGVzdEJlYW4gYmVhbiA9IG5ldyBSZXF1aXJlZElmNFRlc3RCZWFuKCk7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcobnVsbCwgInZhbHVlIiwgIiN7dGVzdEJlYW59Iik7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dCgidGVzdEJlYW4iLCBiZWFuKTsNCi0NCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOw0KLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOw0KLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOw0KLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0SWQoImlucHV0MSIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRJZCgiaW5wdXQyIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZWFyRG93bigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmQm9vbGVhblRhcmdldEVtcHR5RmFpbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKEJvb2xlYW4uRkFMU0UudG9TdHJpbmcoKSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZkJvb2xlYW5UYXJnZXRFbXB0eUNvcnJlY3QxKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKEJvb2xlYW4uRkFMU0UudG9TdHJpbmcoKSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZCb29sZWFuVGFyZ2V0RW1wdHlDb3JyZWN0MigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZShCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZCb29sZWFuVGFyZ2V0RW1wdHlDb3JyZWN0MygpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZShCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9tb2NrL01vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvbW9jay9Nb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNWQ0ODIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9tb2NrL01vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWwubW9jazsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5LkVxdWFsc1N0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLnV0aWwuTWV0aG9kVXRpbHM7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBFcXVhbHNTdHJhdGVneQ0KLXsNCi0gICAgcHVibGljIE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICBNZXRob2RVdGlscy5zaWduYWxDbGFzc1VzZWQoZ2V0Q2xhc3MoKSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBNZXRob2RVdGlscy5zaWduYWxNZXRob2RDYWxsZWQoZ2V0Q2xhc3MoKSwgInJldmVyc2VNZXNzYWdlIik7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIE1ldGhvZFV0aWxzLnNpZ25hbE1ldGhvZENhbGxlZChnZXRDbGFzcygpLCAicmV2ZXJzZU1lc3NhZ2UiKTsNCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24pOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3VzdG9tL0N1c3RvbVZpb2xhdGlvblNldmVyaXR5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2N1c3RvbS9DdXN0b21WaW9sYXRpb25TZXZlcml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWQwNDdlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3VzdG9tL0N1c3RvbVZpb2xhdGlvblNldmVyaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmN1c3RvbTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuUGFyYW1ldGVyS2V5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5QYXJhbWV0ZXJWYWx1ZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHkNCi17DQotICAgIGludGVyZmFjZSBXYXJuaW5nIGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcg0KLSAgICB7DQotICAgICAgICBAUGFyYW1ldGVyS2V5DQotICAgICAgICBwdWJsaWMgQ2xhc3MgS0VZID0gQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3M7DQotDQotICAgICAgICBAUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBTRVZFUklUWSA9IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uTW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25Nb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNTgwYWYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25Nb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5WYWxpZGF0aW9uTW9kdWxlQXdhcmU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uTW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUmVnaXN0cmF0aW9uTW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVnaXN0cmF0aW9uTW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ySW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICByZXNldEV4dFZhbENvbnRleHQoKTsNCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgVGVzdEdsb2JhbE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMCgpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IyKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjMoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgVGVzdEdsb2JhbE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMSgpKTsNCi0NCi0gICAgICAgIGNoZWNrR2xvYmFsT25seVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOw0KLSAgICAgICAgY2hlY2tNb2R1bGVBd2FyZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc1dpdGhUZXN0TW9kdWxlKCk7DQotICAgICAgICBjaGVja01vZHVsZUF3YXJlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzV2l0aFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjaGVja0dsb2JhbE9ubHlQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsNCi0NCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSAzOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHRMZW5ndGgsIHJlc3VsdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEdsb2JhbE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMS5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RHbG9iYWxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEwMDAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrTW9kdWxlQXdhcmVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNXaXRoVGVzdE1vZHVsZSgpDQotICAgIHsNCi0gICAgICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc0ZvcihUZXN0TW9kdWxlLmNsYXNzKTsNCi0NCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSA1Ow0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LnNpemUoKSA9PSByZXN1bHRMZW5ndGgpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0R2xvYmFsTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdE1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMik7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RNb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjMpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0R2xvYmFsTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxMDAwKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDQ6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tNb2R1bGVBd2FyZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc1dpdGhQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGUoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnNGb3IoUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzKTsNCi0NCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSA0Ow0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LnNpemUoKSA9PSByZXN1bHRMZW5ndGgpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEdsb2JhbE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMS5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0R2xvYmFsTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxMDAwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxKQ0KLSAgICBjbGFzcyBUZXN0R2xvYmFsTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDIpDQotICAgIGNsYXNzIFRlc3RNb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciwgVmFsaWRhdGlvbk1vZHVsZUF3YXJlDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TW9kdWxlS2V5cygpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7UHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzLmdldE5hbWUoKSwgVGVzdE1vZHVsZS5jbGFzcy5nZXROYW1lKCl9Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMykNCi0gICAgY2xhc3MgVGVzdE1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMyBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLCBWYWxpZGF0aW9uTW9kdWxlQXdhcmUNCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNb2R1bGVLZXlzKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtUZXN0TW9kdWxlLmNsYXNzLmdldE5hbWUoKX07DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdE1vZHVsZQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxMDAwKQ0KLSAgICBjbGFzcyBUZXN0R2xvYmFsTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxMDAwIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvbk1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uTW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjQ1ODQ1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uTW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuVmFsaWRhdGlvbk1vZHVsZUF3YXJlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvbk1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlZ2lzdHJhdGlvbk1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvbk1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmVzZXRFeHRWYWxDb250ZXh0KCk7DQotDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjEwMDAoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgVGVzdE1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IzKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjEoKSk7DQotDQotICAgICAgICBjaGVja0dsb2JhbE9ubHlQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsNCi0gICAgICAgIGNoZWNrTW9kdWxlQXdhcmVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNXaXRoVGVzdE1vZHVsZSgpOw0KLSAgICAgICAgY2hlY2tNb2R1bGVBd2FyZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc1dpdGhQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tHbG9iYWxPbmx5UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7DQotDQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gMzsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0TGVuZ3RoLCByZXN1bHQuc2l6ZSgpKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjEuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxMDAwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjaGVja01vZHVsZUF3YXJlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzV2l0aFRlc3RNb2R1bGUoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IoVGVzdE1vZHVsZS5jbGFzcyk7DQotDQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gNTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5zaXplKCkgPT0gcmVzdWx0TGVuZ3RoKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RNb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjIpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0TW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IzKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMTAwMCk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrTW9kdWxlQXdhcmVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNXaXRoUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlKCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzRm9yKFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcyk7DQotDQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gNDsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5zaXplKCkgPT0gcmVzdWx0TGVuZ3RoKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjEuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMTAwMC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDEpDQotICAgIGNsYXNzIFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjEgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDIpDQotICAgIGNsYXNzIFRlc3RNb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjIgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciwgVmFsaWRhdGlvbk1vZHVsZUF3YXJlDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldE1vZHVsZUtleXMoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCksIFRlc3RNb2R1bGUuY2xhc3MuZ2V0TmFtZSgpfTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDMpDQotICAgIGNsYXNzIFRlc3RNb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjMgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciwgVmFsaWRhdGlvbk1vZHVsZUF3YXJlDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldE1vZHVsZUtleXMoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge1Rlc3RNb2R1bGUuY2xhc3MuZ2V0TmFtZSgpfTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBUZXN0TW9kdWxlDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDEwMDApDQotICAgIGNsYXNzIFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjEwMDAgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvblJlbmRlcmVySW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25SZW5kZXJlckludGVyY2VwdG9yVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ3NDc0ZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvblJlbmRlcmVySW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUmVuZGVyZXJJbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25SZW5kZXJlckludGVyY2VwdG9yVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlZ2lzdHJhdGlvblJlbmRlcmVySW50ZXJjZXB0b3JUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVnaXN0cmF0aW9uUmVuZGVyZXJJbnRlcmNlcHRvclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkNvbnN0YW50Q29uZGl0aW9ucyJ9KQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVuZGVyZXJJbnRlcmNlcHRvckluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKG5ldyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFRlc3RDb21wb25lbnRJbml0aWFsaXplcjEoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFRlc3RDb21wb25lbnRJbml0aWFsaXplcjIoKSk7DQotDQotICAgICAgICBMaXN0PFJlbmRlcmVySW50ZXJjZXB0b3I+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCk7DQotDQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gNDsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0TGVuZ3RoLCByZXN1bHQuc2l6ZSgpKTsNCi0NCi0gICAgICAgIFJlbmRlcmVySW50ZXJjZXB0b3IgdG1wOw0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRtcCA9IHJlc3VsdC5nZXQoaSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0bXAgaW5zdGFuY2VvZiBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIgfHwNCi0gICAgICAgICAgICAgICAgICAgIHRtcCBpbnN0YW5jZW9mIFZhbGlkYXRpb25JbnRlcmNlcHRvciB8fCAgLypkdWUgdG8gYSBqdW5pdCBpc3N1ZSovDQotICAgICAgICAgICAgICAgICAgICB0bXAgaW5zdGFuY2VvZiBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcg0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMSBleHRlbmRzIFRlc3RDb21wb25lbnRJbml0aWFsaXplcg0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMiBleHRlbmRzIFRlc3RDb21wb25lbnRJbml0aWFsaXplcg0KLSAgICB7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vcG9tLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjFkNmYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBCZWFuLVZhbGlkYXRpb24tSW50ZWdyYXRpb24tTW9kdWxlIChKU1IgMzAzKTwvbmFtZT4NCi0gICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxyZXBvc2l0b3JpZXM+DQotICAgICAgICA8cmVwb3NpdG9yeT4NCi0gICAgICAgICAgICA8aWQ+amJvc3M8L2lkPg0KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3JlcG9zaXRvcnkuamJvc3MuY29tL21hdmVuMjwvdXJsPg0KLSAgICAgICAgICAgIDxyZWxlYXNlcz4NCi0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4NCi0gICAgICAgICAgICA8L3JlbGVhc2VzPg0KLSAgICAgICAgICAgIDxzbmFwc2hvdHM+DQotICAgICAgICAgICAgICAgIDxlbmFibGVkPmZhbHNlPC9lbmFibGVkPg0KLSAgICAgICAgICAgIDwvc25hcHNob3RzPg0KLSAgICAgICAgPC9yZXBvc2l0b3J5Pg0KLSAgICAgICAgPHJlcG9zaXRvcnk+DQotICAgICAgICAgICAgPGlkPmpib3NzLXNuYXBzaG90PC9pZD4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9zbmFwc2hvdHMuamJvc3Mub3JnL21hdmVuMjwvdXJsPg0KLSAgICAgICAgICAgIDxyZWxlYXNlcz4NCi0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4NCi0gICAgICAgICAgICA8L3JlbGVhc2VzPg0KLSAgICAgICAgICAgIDxzbmFwc2hvdHM+DQotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+DQotICAgICAgICAgICAgPC9zbmFwc2hvdHM+DQotICAgICAgICA8L3JlcG9zaXRvcnk+DQotICAgIDwvcmVwb3NpdG9yaWVzPg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgudmFsaWRhdGlvbjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuMC5HQTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgICAgICA8IS0tIFRlc3QgZGVwZW5kZW5jaWVzIC0tPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi41PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQuanNwPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc2hhbGU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2hhbGUtdGVzdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuNDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIA0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgPC9yZXNvdXJjZXM+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4yPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9BYnN0cmFjdCouamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9UZXN0VXRpbHMuamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qQmVhbi5qYXZhPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzI5ZDE4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RhcnR1cC5CZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhbkF3YXJlQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhbkF3YXJlQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdhNzQwNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5Bd2FyZUNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOw0KLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIEJlYW5Bd2FyZUNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkNCi17DQotICAgIHByaXZhdGUgQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgY29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk7DQotDQotICAgIHB1YmxpYyBCZWFuQXdhcmVDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeShDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBjb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSkNCi0gICAgew0KLSAgICAgICAgc2V0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KQ0KLSAgICB7DQotICAgICAgICBpZihjb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm51bGwgaXMgbm90IGFsbG93ZWQgaGVyZSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdGhpcy5jb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSA9IGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJhbGxvdyB0aGUgcmVnaXN0cmF0aW9uIG9mIGEgY3VzdG9tIHByZWZpeCIpDQotICAgIHB1YmxpYyA8VCBleHRlbmRzIENvbnN0cmFpbnRWYWxpZGF0b3I8PywgPz4+IFQgZ2V0SW5zdGFuY2UoQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUgPSB0YXJnZXRDbGFzcy5nZXRTaW1wbGVOYW1lKCk7DQotICAgICAgICBPYmplY3QgcmVzdWx0ID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKGNyZWF0ZUJlYW5OYW1lKHZhbGlkYXRvckNsYXNzTmFtZSkpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0ICE9IG51bGwgJiYgdGFyZ2V0Q2xhc3MuaXNBc3NpZ25hYmxlRnJvbShyZXN1bHQuZ2V0Q2xhc3MoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChUKXJlc3VsdDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0aGlzLmNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5LmdldEluc3RhbmNlKHRhcmdldENsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVCZWFuTmFtZShTdHJpbmcgdmFsaWRhdG9yQ2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZSh2YWxpZGF0b3JDbGFzc05hbWUpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuQXdhcmVWYWxpZGF0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMTA3ZDMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuQXdhcmVWYWxpZGF0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uTWVzc2FnZUludGVycG9sYXRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5UcmF2ZXJzYWJsZVJlc29sdmVyOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEJlYW5Bd2FyZVZhbGlkYXRvckZhY3RvcnkgaW1wbGVtZW50cyBWYWxpZGF0b3JGYWN0b3J5DQotew0KLSAgICBwcml2YXRlIFZhbGlkYXRvckZhY3RvcnkgdmFsaWRhdG9yRmFjdG9yeTsNCi0NCi0gICAgcHVibGljIEJlYW5Bd2FyZVZhbGlkYXRvckZhY3RvcnkoVmFsaWRhdG9yRmFjdG9yeSB2YWxpZGF0b3JGYWN0b3J5KQ0KLSAgICB7DQotICAgICAgICBzZXRWYWxpZGF0b3JGYWN0b3J5KHZhbGlkYXRvckZhY3RvcnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRvckZhY3RvcnkoVmFsaWRhdG9yRmFjdG9yeSB2YWxpZGF0b3JGYWN0b3J5KQ0KLSAgICB7DQotICAgICAgICBpZih2YWxpZGF0b3JGYWN0b3J5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibnVsbCBpcyBub3QgYWxsb3dlZCBoZXJlIik7DQotICAgICAgICB9DQotICAgICAgICB0aGlzLnZhbGlkYXRvckZhY3RvcnkgPSB2YWxpZGF0b3JGYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRvckZhY3RvcnkuZ2V0VmFsaWRhdG9yKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRvckNvbnRleHQgdXNpbmdDb250ZXh0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRvckZhY3RvcnkudXNpbmdDb250ZXh0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1lc3NhZ2VJbnRlcnBvbGF0b3IgZ2V0TWVzc2FnZUludGVycG9sYXRvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5LmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVHJhdmVyc2FibGVSZXNvbHZlciBnZXRUcmF2ZXJzYWJsZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRvckZhY3RvcnkuZ2V0VHJhdmVyc2FibGVSZXNvbHZlcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBnZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgQmVhbkF3YXJlQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkodmFsaWRhdG9yRmFjdG9yeS5nZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgPFQ+IFQgdW53cmFwKENsYXNzPFQ+IHRDbGFzcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRvckZhY3RvcnkudW53cmFwKHRDbGFzcyk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDUzNjI3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlZhbGlkYXRpb25Nb2R1bGVLZXk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFZhbGlkYXRpb25Nb2R1bGVLZXkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIEJlYW5WYWxpZGF0aW9uTW9kdWxlS2V5DQotew0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OGM5MTAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5BYnN0cmFjdFZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbC5CZWFuVmFsaWRhdGlvblV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHMgYnZpVXRpbHMgPQ0KLSAgICAgICAgICAgIG5ldyBCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscyh0aGlzLmxvZ2dlcik7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25TdXBwb3J0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCB0byBpbml0IGNvbXBvbmVudCAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IGJ2aVV0aWxzLmV4dHJhY3RQcm9wZXJ0eURldGFpbHMoDQotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGdldFByb3BlcnRpZXNGb3JDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcih1aUNvbXBvbmVudCkpOw0KLQ0KLSAgICAgICAgaWYgKHByb3BlcnR5RGV0YWlscyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRDb21wb25lbnRXaXRoUHJvcGVydHlEZXRhaWxzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHByb3BlcnR5RGV0YWlscyk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJpbml0IGNvbXBvbmVudCBvZiAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdENvbXBvbmVudFdpdGhQcm9wZXJ0eURldGFpbHMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMpDQotICAgIHsNCi0gICAgICAgIHRoaXMuYnZpVXRpbHMuaW5pdENvbXBvbmVudFdpdGhQcm9wZXJ0eURldGFpbHMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgcHJvcGVydHlEZXRhaWxzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gZ2V0UHJvcGVydHlJbmZvcm1hdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGJvb2xlYW4gdmFsaWRhdGVQcm9wZXJ0eSA9IGhhc0JlYW5WYWxpZGF0aW9uQ29uc3RyYWludHMocHJvcGVydHlJbmZvcm1hdGlvbik7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodmFsaWRhdGVQcm9wZXJ0eSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJqc3IzMDMgc3RhcnQgdmFsaWRhdGlvbiIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHByb2Nlc3NGaWVsZFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBmaW5hbGx5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHZhbGlkYXRlUHJvcGVydHkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgianNyMzAzIHZhbGlkYXRpb24gZmluaXNoZWQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTWV0YURhdGFFeHRyYWN0b3IgZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYnZpVXRpbHMuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IocHJvcGVydGllcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzQmVhblZhbGlkYXRpb25Db25zdHJhaW50cyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmJ2aVV0aWxzLmhhc0JlYW5WYWxpZGF0aW9uQ29uc3RyYWludHMocHJvcGVydHlJbmZvcm1hdGlvbik7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ZpZWxkVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICAvKm5vdCB1c2VkIHlldCBzdXBwb3J0TXVsdGlwbGVWaW9sYXRpb25zUGVyRmllbGQoKSovDQotICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbj4gdmlvbGF0aW9ucyA9IHRoaXMuYnZpVXRpbHMNCi0gICAgICAgICAgICAgICAgLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgICAgICBwcm9jZXNzQ29uc3RyYWludFZpb2xhdGlvbnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCB2aW9sYXRpb25zKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ29uc3RyYWludFZpb2xhdGlvbnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPiB2aW9sYXRpb25zKQ0KLSAgICB7DQotICAgICAgICBpZih2aW9sYXRpb25zICE9IG51bGwgJiYgIXZpb2xhdGlvbnMuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVXRpbHMucHJvY2Vzc0NvbnN0cmFpbnRWaW9sYXRpb25zKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgdmlvbGF0aW9ucyk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBDbGFzcyBnZXRNb2R1bGVLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQmVhblZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3M7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGY4YTdiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5ncm91cHMuRGVmYXVsdDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5CZWFuRGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5FbGVtZW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscw0KLXsNCi0gICAgcHJpdmF0ZSBMb2cgbG9nZ2VyOw0KLQ0KLSAgICBCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscyhMb2cgbG9nZ2VyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjsNCi0gICAgfQ0KLQ0KLSAgICBQcm9wZXJ0eURldGFpbHMgZXh0cmFjdFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzRm9yRXh0cmFjdGlvbikNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHJlc3VsdCA9IGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKHByb3BlcnRpZXNGb3JFeHRyYWN0aW9uKQ0KLSAgICAgICAgICAgICAgICAuZXh0cmFjdChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAuZ2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmIChyZXN1bHQuZ2V0QmFzZU9iamVjdCgpID09IG51bGwgJiYgdGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oIm5vIGJhc2Ugb2JqZWN0IGF0ICIgKyByZXN1bHQuZ2V0S2V5KCkgKw0KLSAgICAgICAgICAgICAgICAgICAgIiBjb21wb25lbnQtaWQ6ICIgKyB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQuZ2V0QmFzZU9iamVjdCgpICE9IG51bGwgPyByZXN1bHQgOiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGFsc28gaW52b2tlcyBtZXRhLWRhdGEgZXh0cmFjdGlvbiBpbnRlcmNlcHRvcnMNCi0gICAgICogKHNlZSBlLmcuIEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpDQotICAgICAqLw0KLSAgICBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcldpdGgocHJvcGVydGllcyk7DQotICAgIH0NCi0NCi0gICAgdm9pZCBpbml0Q29tcG9uZW50V2l0aFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscykNCi0gICAgew0KLSAgICAgICAgQ2xhc3NbXSBmb3VuZEdyb3VwcyA9IHJlc29sdmVHcm91cHMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBpZiAoZm91bmRHcm91cHMgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChmb3VuZEdyb3Vwcy5sZW5ndGggPT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3VuZEdyb3VwcyA9IG5ldyBDbGFzc1tde0RlZmF1bHQuY2xhc3N9Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCk7DQotDQotICAgICAgICB0YXJnZXRDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3ModGFyZ2V0Q2xhc3MpOw0KLQ0KLSAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgZWxlbWVudERlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yRm9yKHRhcmdldENsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSk7DQotDQotICAgICAgICBpZiAoZWxlbWVudERlc2NyaXB0b3IgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBwcm9jZXNzRWxlbWVudERlc2NyaXB0b3IoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZm91bmRHcm91cHMsIGVsZW1lbnREZXNjcmlwdG9yKTsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIHByb2Nlc3NFbGVtZW50RGVzY3JpcHRvcihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NbXSBmb3VuZEdyb3VwcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgZWxlbWVudERlc2NyaXB0b3IpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGE7DQotDQotICAgICAgICBmb3IgKENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IGNvbnN0cmFpbnREZXNjcmlwdG9yIDoNCi0gICAgICAgICAgICAgICAgZWxlbWVudERlc2NyaXB0b3IuZmluZENvbnN0cmFpbnRzKCkudW5vcmRlcmVkQW5kTWF0Y2hpbmdHcm91cHMoZm91bmRHcm91cHMpLmdldENvbnN0cmFpbnREZXNjcmlwdG9ycygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGFEYXRhID0gdHJhbnNmb3JtQ29uc3RyYWludERlc2NyaXB0b3JUb01ldGFEYXRhKA0KLSAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludERlc2NyaXB0b3IsIGVsZW1lbnREZXNjcmlwdG9yLmdldEVsZW1lbnRDbGFzcygpKTsNCi0NCi0gICAgICAgICAgICBpZiAobWV0YURhdGEgIT0gbnVsbCAmJiAhbWV0YURhdGEuaXNFbXB0eSgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29uZmlndXJlQ29tcG9uZW50V2l0aE1ldGFEYXRhKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gIkNvbnN0cmFpbnREZXNjcmlwdG9yI2lzUmVwb3J0QXNTaW5nbGVWaW9sYXRpb24iKQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtQ29uc3RyYWludERlc2NyaXB0b3JUb01ldGFEYXRhKA0KLSAgICAgICAgICAgIENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IGNvbnN0cmFpbnREZXNjcmlwdG9yLCBDbGFzcyBlbGVtZW50Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotDQotICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyID0gRXh0VmFsVXRpbHMuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckZvclZhbGlkYXRpb25TdHJhdGVneSgNCi0gICAgICAgICAgICAgICAgbmV3IEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneShjb25zdHJhaW50RGVzY3JpcHRvciwgZWxlbWVudENsYXNzKSk7DQotDQotICAgICAgICBpZiAobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5wdXRBbGwodHJhbnNmb3JtTWV0YURhdGEobWV0YURhdGFUcmFuc2Zvcm1lciwgY29uc3RyYWludERlc2NyaXB0b3IpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICghY29uc3RyYWludERlc2NyaXB0b3IuaXNSZXBvcnRBc1NpbmdsZVZpb2xhdGlvbigpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFNldDxDb25zdHJhaW50RGVzY3JpcHRvcjw/Pj4gY29tcG9zaW5nQ29uc3RyYWludHMgPSBjb25zdHJhaW50RGVzY3JpcHRvci5nZXRDb21wb3NpbmdDb25zdHJhaW50cygpOw0KLSAgICAgICAgICAgIGlmIChjb21wb3NpbmdDb25zdHJhaW50cyAhPSBudWxsICYmICFjb21wb3NpbmdDb25zdHJhaW50cy5pc0VtcHR5KCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQucHV0QWxsKHRyYW5zZm9ybUNvbXBvc2luZ0NvbnN0cmFpbnRzKGNvbXBvc2luZ0NvbnN0cmFpbnRzLCBlbGVtZW50Q2xhc3MpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1Db21wb3NpbmdDb25zdHJhaW50cygNCi0gICAgICAgICAgICBTZXQ8Q29uc3RyYWludERlc2NyaXB0b3I8Pz4+IGNvbXBvc2luZ0NvbnN0cmFpbnRzLCBDbGFzcyBlbGVtZW50Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBmb3IgKENvbnN0cmFpbnREZXNjcmlwdG9yIGNvbnN0cmFpbnREZXNjcmlwdG9yIDogY29tcG9zaW5nQ29uc3RyYWludHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LnB1dEFsbCh0cmFuc2Zvcm1Db25zdHJhaW50RGVzY3JpcHRvclRvTWV0YURhdGEoY29uc3RyYWludERlc2NyaXB0b3IsIGVsZW1lbnRDbGFzcykpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoDQotICAgICAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyLCBDb25zdHJhaW50RGVzY3JpcHRvcjw/PiBjb25zdHJhaW50RGVzY3JpcHRvcikNCi0gICAgew0KLSAgICAgICAgTWV0YURhdGFFbnRyeSBlbnRyeTsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0Ow0KLSAgICAgICAgaWYgKHRoaXMubG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcobWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotDQotICAgICAgICBlbnRyeSA9IG5ldyBNZXRhRGF0YUVudHJ5KCk7DQotICAgICAgICBlbnRyeS5zZXRLZXkoY29uc3RyYWludERlc2NyaXB0b3IuZ2V0QW5ub3RhdGlvbigpLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgIGVudHJ5LnNldFZhbHVlKGNvbnN0cmFpbnREZXNjcmlwdG9yKTsNCi0NCi0gICAgICAgIHJlc3VsdCA9IG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KTsNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgYm9vbGVhbiBoYXNCZWFuVmFsaWRhdGlvbkNvbnN0cmFpbnRzKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzLmdldFByb3BlcnR5RGV0YWlscyhwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCkpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGdldERlc2NyaXB0b3JGb3IodGFyZ2V0Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpKSAhPSBudWxsOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPiB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBDbGFzcyBiYXNlQmVhbkNsYXNzID0gZ2V0QmFzZUNsYXNzVHlwZShwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBnZXRQcm9wZXJ0eVRvVmFsaWRhdGUocHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgICAgICBDbGFzc1tdIGdyb3VwcyA9IHJlc29sdmVHcm91cHMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBpZiAoZ3JvdXBzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBWYWxpZGF0b3JGYWN0b3J5IHZhbGlkYXRvckZhY3RvcnkgPSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0VmFsaWRhdG9yRmFjdG9yeSgpOw0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRvckZhY3RvcnkNCi0gICAgICAgICAgICAgICAgLnVzaW5nQ29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5tZXNzYWdlSW50ZXJwb2xhdG9yKEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkpDQotICAgICAgICAgICAgICAgIC5jb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSh2YWxpZGF0b3JGYWN0b3J5LmdldENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KCkpDQotICAgICAgICAgICAgICAgIC50cmF2ZXJzYWJsZVJlc29sdmVyKHZhbGlkYXRvckZhY3RvcnkuZ2V0VHJhdmVyc2FibGVSZXNvbHZlcigpKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdG9yKCkNCi0gICAgICAgICAgICAgICAgLnZhbGlkYXRlVmFsdWUoYmFzZUJlYW5DbGFzcywgcHJvcGVydHlOYW1lLCBjb252ZXJ0ZWRPYmplY3QsIGdyb3Vwcyk7DQotICAgIH0NCi0NCi0gICAgQ2xhc3MgZ2V0QmFzZUNsYXNzVHlwZShQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIENsYXNzIHJlc3VsdCA9IEV4dFZhbFV0aWxzLmdldFByb3BlcnR5RGV0YWlscyhwcm9wZXJ0eUluZm9ybWF0aW9uKS5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIHJldHVybiBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHJlc3VsdCk7DQotICAgIH0NCi0NCi0gICAgU3RyaW5nIGdldFByb3BlcnR5VG9WYWxpZGF0ZShQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRQcm9wZXJ0eURldGFpbHMocHJvcGVydHlJbmZvcm1hdGlvbikuZ2V0UHJvcGVydHkoKTsNCi0gICAgfQ0KLQ0KLSAgICBDbGFzc1tdIHJlc29sdmVHcm91cHMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0R3JvdXBzKA0KLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5nZXRWaWV3SWQoKSwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotICAgIH0NCi0NCi0gICAgRWxlbWVudERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvckZvcihDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBCZWFuRGVzY3JpcHRvciBiZWFuRGVzY3JpcHRvciA9IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWYWxpZGF0b3JGYWN0b3J5KCkNCi0gICAgICAgICAgICAgICAgLmdldFZhbGlkYXRvcigpLmdldENvbnN0cmFpbnRzRm9yQ2xhc3ModGFyZ2V0Q2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGJlYW5EZXNjcmlwdG9yLmdldENvbnN0cmFpbnRzRm9yUHJvcGVydHkocHJvcGVydHkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0V4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGY1YmIyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24ubWVzc2FnZS5pbnRlcnBvbGF0b3IuRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24ubWVzc2FnZS5pbnRlcnBvbGF0b3IuRXh0VmFsTWVzc2FnZUludGVycG9sYXRvckFkYXB0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLk1vZGVsVmFsaWRhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLk1vZGVsVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uQmVhblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC51dGlsLkJlYW5WYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkdyb3VwU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5NZXNzYWdlSW50ZXJwb2xhdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgaW1wbGVtZW50cyBHcm91cFN0b3JhZ2UsIE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVkgPSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuY2xhc3MuZ2V0TmFtZSgpICsgIjpLRVkiOw0KLQ0KLSAgICBwcml2YXRlIE1lc3NhZ2VJbnRlcnBvbGF0b3IgZGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotDQotICAgIHByaXZhdGUgTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcjsNCi0NCi0gICAgcHJpdmF0ZSBHcm91cFN0b3JhZ2UgZ3JvdXBTdG9yYWdlOw0KLQ0KLSAgICBwcml2YXRlIE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UgbW9kZWxWYWxpZGF0aW9uU3RvcmFnZTsNCi0NCi0gICAgcHJpdmF0ZSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQoKQ0KLSAgICB7DQotICAgICAgICBpbml0R3JvdXBTdG9yYWdlKCk7DQotICAgICAgICBpbml0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgaW5pdE1lc3NhZ2VSZXNvbHZlcigpOw0KLSAgICAgICAgaW5pdE1lc3NhZ2VJbnRlcnBvbGF0b3IoKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgc3RhdGljIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBnZXRDdXJyZW50SW5zdGFuY2UoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgTWFwIHJlcXVlc3RNYXAgPSBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpOw0KLQ0KLSAgICAgICAgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGN1cnJlbnRDb250ZXh0ID0gKEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dClyZXF1ZXN0TWFwLmdldChLRVkpOw0KLQ0KLSAgICAgICAgaWYoY3VycmVudENvbnRleHQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50Q29udGV4dCA9IG5ldyBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQoKTsNCi0gICAgICAgICAgICByZXF1ZXN0TWFwLnB1dChLRVksIGN1cnJlbnRDb250ZXh0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBjdXJyZW50Q29udGV4dDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdG9yRmFjdG9yeSBnZXRWYWxpZGF0b3JGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IHZhbGlkYXRvckZhY3RvcnkgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShWYWxpZGF0b3JGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBpZih2YWxpZGF0b3JGYWN0b3J5IGluc3RhbmNlb2YgVmFsaWRhdG9yRmFjdG9yeSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFZhbGlkYXRvckZhY3RvcnkpdmFsaWRhdG9yRmFjdG9yeTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCJmYWxsYmFjayB0byB0aGUgZGVmYXVsdCBidiB2YWxpZGF0b3IgZmFjdG9yeSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEJlYW5WYWxpZGF0aW9uVXRpbHMuZ2V0RGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZUludGVycG9sYXRvciBnZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5tZXNzYWdlUmVzb2x2ZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IEV4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyKHRoaXMuZGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IsIHRoaXMubWVzc2FnZVJlc29sdmVyKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5ncm91cFN0b3JhZ2UuYWRkR3JvdXAoZ3JvdXBDbGFzcywgdmlld0lkLCBjbGllbnRJZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVzdHJpY3RHcm91cChDbGFzcyBncm91cENsYXNzLCBTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZ3JvdXBTdG9yYWdlLnJlc3RyaWN0R3JvdXAoZ3JvdXBDbGFzcywgdmlld0lkLCBjbGllbnRJZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENsYXNzW10gZ2V0R3JvdXBzKFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBTdG9yYWdlLmdldEdyb3Vwcyh2aWV3SWQsIGNsaWVudElkKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRNb2RlbFZhbGlkYXRpb25FbnRyeShNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tb2RlbFZhbGlkYXRpb25TdG9yYWdlLmFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KG1vZGVsVmFsaWRhdGlvbkVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllc1RvVmFsaWRhdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5tb2RlbFZhbGlkYXRpb25TdG9yYWdlLmdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXNUb1ZhbGlkYXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRHcm91cFN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmdyb3VwU3RvcmFnZSA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5nZXRTdG9yYWdlKEdyb3VwU3RvcmFnZS5jbGFzcywgQmVhblZhbGlkYXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1vZGVsVmFsaWRhdGlvblN0b3JhZ2UgPSBFeHRWYWxVdGlscy4NCi0gICAgICAgICAgICAgICAgZ2V0U3RvcmFnZShNb2RlbFZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLCBNb2RlbFZhbGlkYXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9EbyhQcmlvcml0eS5ISUdIKQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdE1lc3NhZ2VJbnRlcnBvbGF0b3IoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZm91bmRCZWFuID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKE1lc3NhZ2VJbnRlcnBvbGF0b3IuY2xhc3MuZ2V0TmFtZSgpLnJlcGxhY2UoIi4iLCAiXyIpKTsNCi0NCi0gICAgICAgIGlmKGZvdW5kQmVhbiBpbnN0YW5jZW9mIE1lc3NhZ2VJbnRlcnBvbGF0b3IpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5kZWZhdWx0TWVzc2FnZUludGVycG9sYXRvciA9IChNZXNzYWdlSW50ZXJwb2xhdG9yKWZvdW5kQmVhbjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmRlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yID0gbmV3IERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yKA0KLSAgICAgICAgICAgICAgICBCZWFuVmFsaWRhdGlvblV0aWxzLmdldERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdE1lc3NhZ2VSZXNvbHZlcigpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZVJlc29sdmVyID0gRXh0VmFsVXRpbHMuZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KGdldEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3koKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0QmVhblZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5KG51bGwsIG51bGwpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNjlkMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudAotICAgICAgICAuQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgeC54LjMKLSAqLwotQEludm9jYXRpb25PcmRlcigyMDApCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVJlcXVpcmVkQXR0cmlidXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCFFeHRWYWxVdGlscy5pbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZihCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSB8fAotICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMoaXNDb21wb25lbnRSZXF1aXJlZCh1aUNvbXBvbmVudCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9NYXBwZWRDb25zdHJhaW50U291cmNlQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvTWFwcGVkQ29uc3RyYWludFNvdXJjZUJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NTc3OWYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9NYXBwZWRDb25zdHJhaW50U291cmNlQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjQNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBNYXBwZWRDb25zdHJhaW50U291cmNlQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3INCi0gICAgICAgIGV4dGVuZHMgQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIE1hcHBlZENvbnN0cmFpbnRTb3VyY2VCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscyBjc2FCdmlVdGlscyA9DQotICAgICAgICAgICAgbmV3IE1hcHBlZENvbnN0cmFpbnRTb3VyY2VCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscyh0aGlzLmxvZ2dlciwgdGhpcy5idmlVdGlscyk7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q29tcG9uZW50V2l0aFByb3BlcnR5RGV0YWlscyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscykNCi0gICAgew0KLSAgICAgICAgdGhpcy5jc2FCdmlVdGlscy5pbml0Q29tcG9uZW50V2l0aFByb3BlcnR5RGV0YWlsc09mTWFwcGVkQ29uc3RyYWludFNvdXJjZSgNCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgcHJvcGVydHlEZXRhaWxzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzQmVhblZhbGlkYXRpb25Db25zdHJhaW50cyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldEluZm9ybWF0aW9uKA0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHRoaXMuY3NhQnZpVXRpbHMucmVzb2x2ZU1hcHBlZENvbnN0cmFpbnRTb3VyY2VGb3IocHJvcGVydHlEZXRhaWxzLmdldEtleSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCkpICE9IG51bGw7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NGaWVsZFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb24+IHZpb2xhdGlvbnMgPSB0aGlzLmNzYUJ2aVV0aWxzDQotICAgICAgICAgICAgICAgIC52YWxpZGF0ZU1hcHBlZENvbnN0cmFpbnRTb3VyY2UoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIHByb2Nlc3NDb25zdHJhaW50VmlvbGF0aW9ucyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHZpb2xhdGlvbnMpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvTWFwcGVkQ29uc3RyYWludFNvdXJjZUJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL01hcHBlZENvbnN0cmFpbnRTb3VyY2VCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTgwYjBmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvTWFwcGVkQ29uc3RyYWludFNvdXJjZUJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NYXBwZWRDb25zdHJhaW50U291cmNlU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkNvbnN0cmFpbnRTb3VyY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uSWdub3JlQ29uc3RyYWludFNvdXJjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5UYXJnZXRQcm9wZXJ0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5UYXJnZXRQcm9wZXJ0eUlkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5ncm91cHMuRGVmYXVsdDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5FbGVtZW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YS5iZWFucy5CZWFuSW5mbzsNCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsNCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjQNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIE1hcHBlZENvbnN0cmFpbnRTb3VyY2VCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscw0KLXsNCi0gICAgcHJpdmF0ZSBMb2cgbG9nZ2VyOw0KLSAgICBwcml2YXRlIEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzIGJ2aVV0aWxzOw0KLQ0KLSAgICBNYXBwZWRDb25zdHJhaW50U291cmNlQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHMoDQotICAgICAgICAgICAgTG9nIGxvZ2dlciwgQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHMgYnZpVXRpbHMpDQotICAgIHsNCi0gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyOw0KLSAgICAgICAgdGhpcy5idmlVdGlscyA9IGJ2aVV0aWxzOw0KLSAgICB9DQotDQotICAgIHZvaWQgaW5pdENvbXBvbmVudFdpdGhQcm9wZXJ0eURldGFpbHNPZk1hcHBlZENvbnN0cmFpbnRTb3VyY2UoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBDbGFzc1tdIGZvdW5kR3JvdXBzID0gdGhpcy5idmlVdGlscy5yZXNvbHZlR3JvdXBzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgaWYgKGZvdW5kR3JvdXBzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoZm91bmRHcm91cHMubGVuZ3RoID09IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgZm91bmRHcm91cHMgPSBuZXcgQ2xhc3NbXXtEZWZhdWx0LmNsYXNzfTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBjb25zdHJhaW50U291cmNlUHJvcGVydHlEZXRhaWxzID0gcmVzb2x2ZU1hcHBlZENvbnN0cmFpbnRTb3VyY2VGb3IoDQotICAgICAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKSwgcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSk7DQotDQotICAgICAgICBpZihjb25zdHJhaW50U291cmNlUHJvcGVydHlEZXRhaWxzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRWxlbWVudERlc2NyaXB0b3IgZWxlbWVudERlc2NyaXB0b3IgPQ0KLSAgICAgICAgICAgICAgICB0aGlzLmJ2aVV0aWxzLmdldERlc2NyaXB0b3JGb3IoKENsYXNzKSBjb25zdHJhaW50U291cmNlUHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50U291cmNlUHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCkpOw0KLQ0KLSAgICAgICAgaWYgKGVsZW1lbnREZXNjcmlwdG9yID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGhpcy5idmlVdGlscy5wcm9jZXNzRWxlbWVudERlc2NyaXB0b3IoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZm91bmRHcm91cHMsIGVsZW1lbnREZXNjcmlwdG9yKTsNCi0gICAgfQ0KLQ0KLSAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbj4gdmFsaWRhdGVNYXBwZWRDb25zdHJhaW50U291cmNlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIENsYXNzIGJhc2VCZWFuQ2xhc3MgPSB0aGlzLmJ2aVV0aWxzLmdldEJhc2VDbGFzc1R5cGUocHJvcGVydHlJbmZvcm1hdGlvbik7DQotICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5idmlVdGlscy5nZXRQcm9wZXJ0eVRvVmFsaWRhdGUocHJvcGVydHlJbmZvcm1hdGlvbik7DQotICAgICAgICBTdHJpbmcgb3JpZ2luYWxLZXkgPSBnZXRLZXkocHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgY29uc3RyYWludFNvdXJjZVByb3BlcnR5RGV0YWlscyA9DQotICAgICAgICAgICAgICAgIHJlc29sdmVNYXBwZWRDb25zdHJhaW50U291cmNlRm9yKG9yaWdpbmFsS2V5LCBiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eU5hbWUpOw0KLQ0KLSAgICAgICAgaWYoY29uc3RyYWludFNvdXJjZVByb3BlcnR5RGV0YWlscyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYmFzZUJlYW5DbGFzcyA9IChDbGFzcykgY29uc3RyYWludFNvdXJjZVByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCk7DQotICAgICAgICBwcm9wZXJ0eU5hbWUgPSBjb25zdHJhaW50U291cmNlUHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCk7DQotDQotICAgICAgICBDbGFzc1tdIGdyb3VwcyA9IHRoaXMuYnZpVXRpbHMucmVzb2x2ZUdyb3VwcyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmIChncm91cHMgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFZhbGlkYXRvckZhY3RvcnkgdmFsaWRhdG9yRmFjdG9yeSA9IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWYWxpZGF0b3JGYWN0b3J5KCk7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeQ0KLSAgICAgICAgICAgICAgICAudXNpbmdDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLm1lc3NhZ2VJbnRlcnBvbGF0b3IoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKSkNCi0gICAgICAgICAgICAgICAgLmNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KHZhbGlkYXRvckZhY3RvcnkuZ2V0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoKSkNCi0gICAgICAgICAgICAgICAgLnRyYXZlcnNhYmxlUmVzb2x2ZXIodmFsaWRhdG9yRmFjdG9yeS5nZXRUcmF2ZXJzYWJsZVJlc29sdmVyKCkpDQotICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0b3IoKQ0KLSAgICAgICAgICAgICAgICAudmFsaWRhdGVWYWx1ZShiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eU5hbWUsIGNvbnZlcnRlZE9iamVjdCwgZ3JvdXBzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRLZXkoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5SW5mb3JtYXRpb24pLmdldEtleSgpOw0KLSAgICB9DQotDQotICAgIC8vdXNlIHRoZSBQcm9wZXJ0eURldGFpbHMgdG8gYXZvaWQgYSBuZXcgZGF0YS1zdHJ1Y3R1cmUNCi0gICAgLy9hbiBpbnN0YW5jZSBvZiB0aGUgdGFyZ2V0IGNsYXNzIGlzbid0IHJlcXVpcmVkIGluIGZvciB0aGlzIHVzZS1jYXNlIHNvIHRoZSBjbGFzcyBpdHNlbGYgaXMgc3RvcmVkIGRpcmVjdGx5DQotICAgIC8vYSBjbGVhbiBhcHByb2FjaCB3b3VsZCByZXF1aXJlIGFuIGFkZGl0aW9uYWwgYXBpDQotICAgIC8vaG93ZXZlciwgc2luY2UgaXQncyBvbmx5IHVzZWQgaW4gdGhpcyBjbGFzcyBpdCdzIG9rIHRvIHVzZSBjYXN0aW5nIGluc3RlYWQNCi0gICAgUHJvcGVydHlEZXRhaWxzIHJlc29sdmVNYXBwZWRDb25zdHJhaW50U291cmNlRm9yKFN0cmluZyBvcmlnaW5hbEtleSwgQ2xhc3MgYmFzZUJlYW5DbGFzcywgU3RyaW5nIHByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpZiAoaXNNYXBwZWRDb25zdHJhaW50U291cmNlQ2FjaGVkKGJhc2VCZWFuQ2xhc3MsIHByb3BlcnR5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0TWFwcGVkQ29uc3RyYWludFNvdXJjZShiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eSk7DQotICAgICAgICB9DQotDQotICAgICAgICBiYXNlQmVhbkNsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhiYXNlQmVhbkNsYXNzKTsNCi0NCi0gICAgICAgIENsYXNzIG5ld0Jhc2VCZWFuQ2xhc3MgPSBmaW5kTWFwcGVkQ2xhc3MoYmFzZUJlYW5DbGFzcywgcHJvcGVydHkpOw0KLQ0KLSAgICAgICAgLy9tYXBwZWQgc291cmNlIGlzIGlnbm9yZWQgdmlhIEBJZ25vcmVDb25zdHJhaW50U291cmNlIG9yIHRoZXJlIGlzIGp1c3Qgbm8gbWFwcGluZyBhbm5vdGF0aW9uIGF0IHRoZSB0YXJnZXQNCi0gICAgICAgIGlmKG5ld0Jhc2VCZWFuQ2xhc3MgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb0NhY2hlTWFwcGVkQ29uc3RyYWludFNvdXJjZU1ldGFEYXRhKGJhc2VCZWFuQ2xhc3MsIHByb3BlcnR5LCBudWxsKTsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBuZXdQcm9wZXJ0eSA9IGZpbmRNYXBwZWRQcm9wZXJ0eShiYXNlQmVhbkNsYXNzLCBuZXdCYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eSk7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcmVzdWx0ID0gbmV3IFByb3BlcnR5RGV0YWlscyhvcmlnaW5hbEtleSwgbmV3QmFzZUJlYW5DbGFzcywgbmV3UHJvcGVydHkpOw0KLQ0KLSAgICAgICAgdHJ5VG9DYWNoZU1hcHBlZENvbnN0cmFpbnRTb3VyY2VNZXRhRGF0YShiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eSwgcmVzdWx0KTsNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTWFwcGVkQ29uc3RyYWludFNvdXJjZUNhY2hlZChDbGFzcyBiYXNlQmVhbkNsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRDb25zdHJhaW50U291cmNlU3RvcmFnZSgpLmNvbnRhaW5zTWFwcGluZyhiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eURldGFpbHMgZ2V0TWFwcGVkQ29uc3RyYWludFNvdXJjZShDbGFzcyBiYXNlQmVhbkNsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRDb25zdHJhaW50U291cmNlU3RvcmFnZSgpLmdldE1hcHBlZENvbnN0cmFpbnRTb3VyY2UoYmFzZUJlYW5DbGFzcywgcHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0NhY2hlTWFwcGVkQ29uc3RyYWludFNvdXJjZU1ldGFEYXRhKA0KLSAgICAgICAgICAgIENsYXNzIG9yaWdpbmFsQ2xhc3MsIFN0cmluZyBvcmlnaW5hbFByb3BlcnR5LCBQcm9wZXJ0eURldGFpbHMgcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBnZXRDb25zdHJhaW50U291cmNlU3RvcmFnZSgpLnN0b3JlTWFwcGluZyhvcmlnaW5hbENsYXNzLCBvcmlnaW5hbFByb3BlcnR5LCByZXN1bHQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2UgZ2V0Q29uc3RyYWludFNvdXJjZVN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmdldFN0b3JhZ2UoTWFwcGVkQ29uc3RyYWludFNvdXJjZVN0b3JhZ2UuY2xhc3MsIE1hcHBlZENvbnN0cmFpbnRTb3VyY2VTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBDbGFzcyBmaW5kTWFwcGVkQ2xhc3MoQ2xhc3MgYmFzZUJlYW5DbGFzcywgU3RyaW5nIHByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gY29uc3RyYWludFNvdXJjZUFubm90YXRpb25JbXBsZW1lbnRhdGlvbiA9IChDbGFzcykgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEdsb2JhbFByb3BlcnR5KENvbnN0cmFpbnRTb3VyY2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIEFubm90YXRpb24gZm91bmRDb25zdHJhaW50U291cmNlQW5ub3RhdGlvbiA9IHRyeVRvR2V0QW5ub3RhdGlvbkZyb21Qcm9wZXJ0eSgNCi0gICAgICAgICAgICAgICAgYmFzZUJlYW5DbGFzcywgcHJvcGVydHksIGNvbnN0cmFpbnRTb3VyY2VBbm5vdGF0aW9uSW1wbGVtZW50YXRpb24pOw0KLQ0KLSAgICAgICAgaWYgKGZvdW5kQ29uc3RyYWludFNvdXJjZUFubm90YXRpb24gPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3VuZENvbnN0cmFpbnRTb3VyY2VBbm5vdGF0aW9uID0gdHJ5VG9HZXRBbm5vdGF0aW9uRnJvbUZpZWxkKA0KLSAgICAgICAgICAgICAgICAgICAgYmFzZUJlYW5DbGFzcywgcHJvcGVydHksIGNvbnN0cmFpbnRTb3VyY2VBbm5vdGF0aW9uSW1wbGVtZW50YXRpb24pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGZvdW5kQ29uc3RyYWludFNvdXJjZUFubm90YXRpb24gPT0gbnVsbCAmJiAhaXNNYXBwZWRDb25zdHJhaW50U291cmNlSWdub3JlZChiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm91bmRDb25zdHJhaW50U291cmNlQW5ub3RhdGlvbiA9IHRyeVRvR2V0Q29uc3RyYWludFNvdXJjZUFubm90YXRpb25Gcm9tQ2xhc3MoDQotICAgICAgICAgICAgICAgICAgICBiYXNlQmVhbkNsYXNzLCBjb25zdHJhaW50U291cmNlQW5ub3RhdGlvbkltcGxlbWVudGF0aW9uKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChmb3VuZENvbnN0cmFpbnRTb3VyY2VBbm5vdGF0aW9uICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RWYWx1ZU9mKGZvdW5kQ29uc3RyYWludFNvdXJjZUFubm90YXRpb24sIENsYXNzLmNsYXNzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWV0aG9kIHRyeVRvR2V0TWV0aG9kKENsYXNzIGJhc2VCZWFuQ2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IHRyeVRvR2V0UmVhZE1ldGhvZChiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eSk7DQotDQotICAgICAgICBpZiAobWV0aG9kID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0aG9kID0gdHJ5VG9HZXRSZWFkTWV0aG9kTWFudWFsbHkoYmFzZUJlYW5DbGFzcywgcHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG1ldGhvZDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1ldGhvZCB0cnlUb0dldFJlYWRNZXRob2QoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGlmICh1c2VCZWFuSW5mbygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgQmVhbkluZm8gYmVhbkluZm8gPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oZW50aXR5KTsNCi0gICAgICAgICAgICAgICAgZm9yIChQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlEZXNjcmlwdG9yIDogYmVhbkluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkuZXF1YWxzKHByb3BlcnR5RGVzY3JpcHRvci5nZXROYW1lKCkpICYmIHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUJlYW5JbmZvKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRS5lcXVhbHMoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoQmVhbkluZm8uY2xhc3MuZ2V0TmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInJlZmFjdG9yIC0gaXQncyBhbHNvIHVzZWQgaW4gRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yIikNCi0gICAgcHJpdmF0ZSBNZXRob2QgdHJ5VG9HZXRSZWFkTWV0aG9kTWFudWFsbHkoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHByb3BlcnR5ID0gcHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSk7DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2NoYW5nZWQgdG8gb2ZmaWNpYWwgYmVhbiBzcGVjLiBkdWUgdG8gY2FjaGluZyB0aGVyZSBpcyBubyBwZXJmb3JtYW5jZSBpc3N1ZSBhbnkgbW9yZQ0KLSAgICAgICAgICAgIHJldHVybiBlbnRpdHkuZ2V0RGVjbGFyZWRNZXRob2QoImlzIiArIHByb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHkuZ2V0RGVjbGFyZWRNZXRob2QoImdldCIgKyBwcm9wZXJ0eSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZTEpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibWV0aG9kIG5vdCBmb3VuZCAtIGNsYXNzOiAiICsgZW50aXR5LmdldE5hbWUoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgLSBtZXRob2RzOiAiICsgImdldCIgKyBwcm9wZXJ0eSArICIgIiArICJpcyIgKyBwcm9wZXJ0eSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJyZWZhY3RvciAtIGl0J3MgYWxzbyB1c2VkIGluIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvciIpDQotICAgIHByaXZhdGUgRmllbGQgdHJ5VG9HZXRGaWVsZChDbGFzcyBiYXNlQmVhbkNsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIEZpZWxkIGZpZWxkOw0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgZmllbGQgPSBnZXREZWNsYXJlZEZpZWxkKGJhc2VCZWFuQ2xhc3MsIHByb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IGJhc2VCZWFuQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgiXyIgKyBwcm9wZXJ0eSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlMSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Lmxlbmd0aCgpID4gMSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuaXNVcHBlckNhc2UocHJvcGVydHkuY2hhckF0KDApKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuaXNVcHBlckNhc2UocHJvcGVydHkuY2hhckF0KDEpKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAvL2Rvbid0IHVzZSBJbnRyb3NwZWN0b3IjZGVjYXBpdGFsaXplIGhlcmUNCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IGJhc2VCZWFuQ2xhc3MNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWNsYXJlZEZpZWxkKHByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IGJhc2VCZWFuQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZChJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKHByb3BlcnR5KSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUxKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImZpZWxkICIgKyBwcm9wZXJ0eSArICIgb3IgXyIgKyBwcm9wZXJ0eSArICIgbm90IGZvdW5kIiwgZTEpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmaWVsZDsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Eby5MaXN0KHsNCi0gICAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkhJR0gsIGRlc2NyaXB0aW9uID0gImFkZCBzdXBwb3J0IGZvciBpbnN0YW5jZXMgd3JhcHBlZCB3aXRoIGNnbGliIiksDQotICAgICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5CTE9DS0lORywgZGVzY3JpcHRpb24gPSAicmVmYWN0b3IgLSBpdCdzIGFsc28gdXNlZCBpbiBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IiKQ0KLSAgICB9KQ0KLSAgICBwcml2YXRlIEZpZWxkIGdldERlY2xhcmVkRmllbGQoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHkpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW50aXR5LmdldERlY2xhcmVkRmllbGQocHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc01hcHBlZENvbnN0cmFpbnRTb3VyY2VJZ25vcmVkKENsYXNzIGJhc2VCZWFuQ2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IHRyeVRvR2V0TWV0aG9kKGJhc2VCZWFuQ2xhc3MsIHByb3BlcnR5KTsNCi0NCi0gICAgICAgIGlmKG1ldGhvZCAhPSBudWxsICYmIG1ldGhvZC5pc0Fubm90YXRpb25QcmVzZW50KGdldElnbm9yZUNvbnN0cmFpbnRTb3VyY2VBbm5vdGF0aW9uSW1wbGVtZW50YXRpb24oKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBGaWVsZCBmaWVsZCA9IHRyeVRvR2V0RmllbGQoYmFzZUJlYW5DbGFzcywgcHJvcGVydHkpOw0KLQ0KLSAgICAgICAgaWYoZmllbGQgIT0gbnVsbCAmJiBmaWVsZC5pc0Fubm90YXRpb25QcmVzZW50KGdldElnbm9yZUNvbnN0cmFpbnRTb3VyY2VBbm5vdGF0aW9uSW1wbGVtZW50YXRpb24oKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBBbm5vdGF0aW9uIHRyeVRvR2V0Q29uc3RyYWludFNvdXJjZUFubm90YXRpb25Gcm9tQ2xhc3MoDQotICAgICAgICAgICAgQ2xhc3MgYmFzZUJlYW5DbGFzcywgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlQmVhbkNsYXNzLmlzQW5ub3RhdGlvblByZXNlbnQoYW5ub3RhdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGJhc2VCZWFuQ2xhc3MuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGdldElnbm9yZUNvbnN0cmFpbnRTb3VyY2VBbm5vdGF0aW9uSW1wbGVtZW50YXRpb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKENsYXNzKSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShJZ25vcmVDb25zdHJhaW50U291cmNlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmluZE1hcHBlZFByb3BlcnR5KENsYXNzIGJhc2VCZWFuQ2xhc3MsIENsYXNzIG5ld0Jhc2VCZWFuQ2xhc3MsIFN0cmluZyBvcmlnaW5hbFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBBbm5vdGF0aW9uIHRhcmdldFByb3BlcnR5QW5ub3RhdGlvbiA9IGdldFRhcmdldFByb3BlcnR5TWV0YURhdGEoYmFzZUJlYW5DbGFzcywgb3JpZ2luYWxQcm9wZXJ0eSk7DQotICAgICAgICBpZiAodGFyZ2V0UHJvcGVydHlBbm5vdGF0aW9uICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3ROZXdQcm9wZXJ0eU5hbWUobmV3QmFzZUJlYW5DbGFzcywgdGFyZ2V0UHJvcGVydHlBbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBvcmlnaW5hbFByb3BlcnR5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQW5ub3RhdGlvbiBnZXRUYXJnZXRQcm9wZXJ0eU1ldGFEYXRhKENsYXNzIGJhc2VCZWFuQ2xhc3MsIFN0cmluZyBvcmlnaW5hbFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gdGFyZ2V0UHJvcGVydHlBbm5vdGF0aW9uID0gZ2V0VGFyZ2V0UHJvcGVydHlBbm5vdGF0aW9uSW1wbGVtZW50YXRpb24oKTsNCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiB0YXJnZXRQcm9wZXJ0eUlkQW5ub3RhdGlvbiA9IGdldFRhcmdldFByb3BlcnR5SWRBbm5vdGF0aW9uSW1wbGVtZW50YXRpb24oKTsNCi0NCi0gICAgICAgIEFubm90YXRpb24gcmVzdWx0ID0gZmluZFRhcmdldFByb3BlcnR5SWRBbm5vdGF0aW9uKGJhc2VCZWFuQ2xhc3MsIG9yaWdpbmFsUHJvcGVydHksIHRhcmdldFByb3BlcnR5SWRBbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBmaW5kVGFyZ2V0UHJvcGVydHlBbm5vdGF0aW9uKGJhc2VCZWFuQ2xhc3MsIG9yaWdpbmFsUHJvcGVydHksIHRhcmdldFByb3BlcnR5QW5ub3RhdGlvbik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQW5ub3RhdGlvbiBmaW5kVGFyZ2V0UHJvcGVydHlJZEFubm90YXRpb24oQ2xhc3MgYmFzZUJlYW5DbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHRhcmdldFByb3BlcnR5SWRBbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBBbm5vdGF0aW9uIHJlc3VsdCA9IHRyeVRvR2V0QW5ub3RhdGlvbkZyb21Qcm9wZXJ0eShiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eSwgdGFyZ2V0UHJvcGVydHlJZEFubm90YXRpb24pOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHRyeVRvR2V0QW5ub3RhdGlvbkZyb21GaWVsZChiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eSwgdGFyZ2V0UHJvcGVydHlJZEFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEFubm90YXRpb24gZmluZFRhcmdldFByb3BlcnR5QW5ub3RhdGlvbihDbGFzcyBiYXNlQmVhbkNsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiB0YXJnZXRQcm9wZXJ0eUFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIEFubm90YXRpb24gcmVzdWx0ID0gdHJ5VG9HZXRBbm5vdGF0aW9uRnJvbVByb3BlcnR5KGJhc2VCZWFuQ2xhc3MsIHByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eUFubm90YXRpb24pOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHRyeVRvR2V0QW5ub3RhdGlvbkZyb21GaWVsZChiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eSwgdGFyZ2V0UHJvcGVydHlBbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBBbm5vdGF0aW9uIHRyeVRvR2V0QW5ub3RhdGlvbkZyb21Qcm9wZXJ0eSgNCi0gICAgICAgICAgICBDbGFzcyBiYXNlQmVhbkNsYXNzLCBTdHJpbmcgcHJvcGVydHksIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIE1ldGhvZCBtZXRob2QgPSB0cnlUb0dldE1ldGhvZChiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eSk7DQotDQotICAgICAgICBpZiAobWV0aG9kICE9IG51bGwgJiYgbWV0aG9kLmlzQW5ub3RhdGlvblByZXNlbnQoYW5ub3RhdGlvbkNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmdldEFubm90YXRpb24oYW5ub3RhdGlvbkNsYXNzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQW5ub3RhdGlvbiB0cnlUb0dldEFubm90YXRpb25Gcm9tRmllbGQoDQotICAgICAgICAgICAgQ2xhc3MgYmFzZUJlYW5DbGFzcywgU3RyaW5nIHByb3BlcnR5LCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzKQ0KLSAgICB7DQotICAgICAgICBGaWVsZCBmaWVsZCA9IHRyeVRvR2V0RmllbGQoYmFzZUJlYW5DbGFzcywgcHJvcGVydHkpOw0KLQ0KLSAgICAgICAgaWYgKGZpZWxkICE9IG51bGwgJiYgZmllbGQuaXNBbm5vdGF0aW9uUHJlc2VudChhbm5vdGF0aW9uQ2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmaWVsZC5nZXRBbm5vdGF0aW9uKGFubm90YXRpb25DbGFzcyk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBnZXRUYXJnZXRQcm9wZXJ0eUFubm90YXRpb25JbXBsZW1lbnRhdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoQ2xhc3MpIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KFRhcmdldFByb3BlcnR5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gZ2V0VGFyZ2V0UHJvcGVydHlJZEFubm90YXRpb25JbXBsZW1lbnRhdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoQ2xhc3MpIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KFRhcmdldFByb3BlcnR5SWQuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBleHRyYWN0TmV3UHJvcGVydHlOYW1lKENsYXNzIHRhcmdldENsYXNzLCBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBhbm5vdGF0aW9uVmFsdWUgPSBleHRyYWN0VmFsdWVPZihhbm5vdGF0aW9uLCBPYmplY3QuY2xhc3MpOw0KLQ0KLSAgICAgICAgLy9AVGFyZ2V0UHJvcGVydHkNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIGFubm90YXRpb25WYWx1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vQFRhcmdldFByb3BlcnR5SWQNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uVmFsdWUgaW5zdGFuY2VvZiBDbGFzcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmluZE5hbWVPZkFubm90YXRlZFByb3BlcnR5KHRhcmdldENsYXNzLCAoQ2xhc3MpIGFubm90YXRpb25WYWx1ZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvL0VYVFZBTC04My91c2UtY2FzZSA1DQotICAgIHByaXZhdGUgU3RyaW5nIGZpbmROYW1lT2ZBbm5vdGF0ZWRQcm9wZXJ0eSgNCi0gICAgICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcywgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGN1c3RvbVRhcmdldE1hcmtlckFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGZvcihNZXRob2QgY3VycmVudE1ldGhvZCA6IHRhcmdldENsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRNZXRob2QuaXNBbm5vdGF0aW9uUHJlc2VudChjdXN0b21UYXJnZXRNYXJrZXJBbm5vdGF0aW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0TWV0aG9kVG9Qcm9wZXJ0eU5hbWUoY3VycmVudE1ldGhvZC5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvcihGaWVsZCBjdXJyZW50RmllbGQgOiB0YXJnZXRDbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRGaWVsZC5pc0Fubm90YXRpb25QcmVzZW50KGN1c3RvbVRhcmdldE1hcmtlckFubm90YXRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRGaWVsZFRvUHJvcGVydHlOYW1lKGN1cnJlbnRGaWVsZC5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGNvbnZlcnRNZXRob2RUb1Byb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG5hbWU7DQotDQotICAgICAgICBpZihuYW1lLnN0YXJ0c1dpdGgoImlzIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gbmFtZS5zdWJzdHJpbmcoMik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKG5hbWUuc3RhcnRzV2l0aCgiZ2V0IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gbmFtZS5zdWJzdHJpbmcoMyk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShyZXN1bHQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGNvbnZlcnRGaWVsZFRvUHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBpZihuYW1lLnN0YXJ0c1dpdGgoIl8iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmFtZS5zdWJzdHJpbmcoMSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIDxUPiBUIGV4dHJhY3RWYWx1ZU9mKEFubm90YXRpb24gYW5ub3RhdGlvbiwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIGZvciAoTWV0aG9kIGFubm90YXRpb25NZXRob2QgOiBhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0RGVjbGFyZWRNZXRob2RzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCJ2YWx1ZSIuZXF1YWxzKGFubm90YXRpb25NZXRob2QuZ2V0TmFtZSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFQpIGFubm90YXRpb25NZXRob2QuaW52b2tlKGFubm90YXRpb24pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nDQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vQmVhblZhbGlkYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9CZWFuVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjkzM2E5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9CZWFuVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmdyb3Vwcy5EZWZhdWx0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLQ0KLUBUYXJnZXQoe01FVEhPRCwgRklFTEQsIFRZUEV9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1ARG9jdW1lbnRlZA0KLXB1YmxpYyBAaW50ZXJmYWNlIEJlYW5WYWxpZGF0aW9uDQotew0KLSAgICBTdHJpbmdbXSB2aWV3SWRzKCkgZGVmYXVsdCAiKiI7DQotDQotICAgIENsYXNzW10gdXNlR3JvdXBzKCkgZGVmYXVsdCBEZWZhdWx0LmNsYXNzOw0KLQ0KLSAgICBDbGFzc1tdIHJlc3RyaWN0R3JvdXBzKCkgZGVmYXVsdCB7fTsNCi0NCi0gICAgU3RyaW5nW10gY29uZGl0aW9ucygpIGRlZmF1bHQgIiN7dHJ1ZX0iOw0KLQ0KLSAgICBNb2RlbFZhbGlkYXRpb24gbW9kZWxWYWxpZGF0aW9uKCkgZGVmYXVsdCBATW9kZWxWYWxpZGF0aW9uOw0KLSAgICANCi0gICAgQFJldGVudGlvbihSVU5USU1FKSBzdGF0aWMgQGludGVyZmFjZSBMaXN0DQotICAgIHsNCi0gICAgICAgIEJlYW5WYWxpZGF0aW9uW10gdmFsdWUoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vTW9kZWxWYWxpZGF0aW9uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vTW9kZWxWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2Yzc4ZGQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL01vZGVsVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLQ0KLUBUYXJnZXQoe01FVEhPRCwgRklFTEQsIFRZUEV9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1ARG9jdW1lbnRlZA0KLXB1YmxpYyBAaW50ZXJmYWNlIE1vZGVsVmFsaWRhdGlvbg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVCA9ICIiOw0KLQ0KLSAgICBib29sZWFuIGlzQWN0aXZlKCkgZGVmYXVsdCBmYWxzZTsNCi0NCi0gICAgYm9vbGVhbiBkaXNwbGF5SW5saW5lKCkgZGVmYXVsdCBmYWxzZTsNCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInN1cHBvcnQgcHJvcGVydHkgY2hhaW4gc3ludGF4IikNCi0gICAgU3RyaW5nW10gdmFsaWRhdGlvblRhcmdldHMoKSBkZWZhdWx0IERFRkFVTFQ7DQotDQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCBERUZBVUxUOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3Rvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2ZjEzNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5leHRyYWN0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ1c2UgbWV0YS1kYXRhIHN0b3JhZ2UgLSBidXQgYSBzcGVjaWFsIGltcGwuIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3IgZXh0ZW5kcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3INCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFByb3BlcnR5RGV0YWlscykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihvYmplY3QuZ2V0Q2xhc3MoKSArICIgaXMgbm90IGEgIiArIFByb3BlcnR5RGV0YWlscy5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IChQcm9wZXJ0eURldGFpbHMpb2JqZWN0Ow0KLQ0KLSAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKSk7DQotDQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsNCi0gICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uc2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsNCi0NCi0gICAgICAgIGV4dHJhY3RBbm5vdGF0aW9ucyhwcm9wZXJ0eUluZm9ybWF0aW9uLCBwcm9wZXJ0eURldGFpbHMsIGVudGl0eUNsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvQmVhblZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9CZWFuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNzc1YzcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9CZWFuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIGV4dHJhY3RzIGFuZCBhZGRzIHRoZSBleHR2YWwgYnYgbWV0YS1kYXRhIChlLmcuIHZhbGlkYXRpb24gZ3JvdXBzKSB0byB0aGUgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yDQotew0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyICYmIGlzQmxvY2tpbmdFeGNlcHRpb24odWlDb21wb25lbnQsIHZhbGlkYXRvckV4Y2VwdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9idiBpbnRlZ3JhdGlvbiBkb2Vzbid0IHRocm93IGV4Y2VwdGlvbnMgdG8gc3VwcG9ydCBtdWx0aXBsZSBtZXNzYWdlcyAtPiBzZXQgY29tcG9uZW50IHN0YXRlDQotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRWYWxpZChmYWxzZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNCbG9ja2luZ0V4Y2VwdGlvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKS5zZXZlcml0eUNhdXNlc1ZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmY2Y3MGYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuVmFsaWRhdGlvbk1vZHVsZUF3YXJlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLkJlYW5WYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC51dGlsLkJlYW5WYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIGV4dHJhY3RzIGFuZCBhZGRzIHRoZSBleHR2YWwgYnYgbWV0YS1kYXRhIChlLmcuIHZhbGlkYXRpb24gZ3JvdXBzKSB0byB0aGUgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotICAgICAgICBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLCBWYWxpZGF0aW9uTW9kdWxlQXdhcmUNCi17DQotICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKHByb3BlcnR5SW5mb3JtYXRpb24uY29udGFpbnNJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5DVVNUT01fUFJPUEVSVElFUykpDQotICAgICAgICB7DQotICAgICAgICAgICAgTWFwIHByb3BlcnRpZXMgPSBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkNVU1RPTV9QUk9QRVJUSUVTLCBNYXAuY2xhc3MpOw0KLQ0KLSAgICAgICAgICAgIGlmKHByb3BlcnRpZXMgIT0gbnVsbCAmJiBwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFVJQ29tcG9uZW50LmNsYXNzLmdldE5hbWUoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCA9IChVSUNvbXBvbmVudClwcm9wZXJ0aWVzLmdldChVSUNvbXBvbmVudC5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMuZ2V0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgICAgICAgICBwcm9jZXNzRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YSh1aUNvbXBvbmVudCwgcHJvcGVydHlEZXRhaWxzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIGFkZHMgdGhlIGV4dHZhbCBidiBtZXRhLWRhdGEgdG8gdGhlIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dA0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgY3VycmVudCBjb21wb25lbnQNCi0gICAgICogQHBhcmFtIHByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eSBkZXRhaWxzIG9mIHRoZSB2YWx1ZS1iaW5kaW5nDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0V4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGEoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMpDQotICAgIHsNCi0gICAgICAgIGlmKEpzZlV0aWxzLmlzUmVuZGVyUmVzcG9uc2VQaGFzZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVXRpbHMuYWRkTWV0YURhdGFUb0NvbnRleHQodWlDb21wb25lbnQsIHByb3BlcnR5RGV0YWlscywgZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVXRpbHMuYWRkTWV0YURhdGFUb0NvbnRleHQodWlDb21wb25lbnQsIHByb3BlcnR5RGV0YWlscywgdHJ1ZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldE1vZHVsZUtleXMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtCZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCl9Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJmZGEwZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0Fic3RyYWN0QmVhblZhbGlkYXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLlZpb2xhdGlvblNldmVyaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEJlYW5WYWxpZGF0aW9uTWV0YURhdGFUcmFuc2Zvcm1lcjxUIGV4dGVuZHMgQW5ub3RhdGlvbj4gaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBDb25zdHJhaW50RGVzY3JpcHRvcjw/IGV4dGVuZHMgVD4gY29uc3RyYWludERlc2NyaXB0b3IgPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKENvbnN0cmFpbnREZXNjcmlwdG9yLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmKGlzQ2xpZW50U2lkZVZhbGlkYXRpb25FbmFibGVkKGNvbnN0cmFpbnREZXNjcmlwdG9yKSAmJiBpc0Jsb2NraW5nQ29uc3RyYWludChjb25zdHJhaW50RGVzY3JpcHRvcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybU1ldGFEYXRhKChDb25zdHJhaW50RGVzY3JpcHRvcjxUPiljb25zdHJhaW50RGVzY3JpcHRvcik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NsaWVudFNpZGVWYWxpZGF0aW9uRW5hYmxlZChDb25zdHJhaW50RGVzY3JpcHRvcjw/IGV4dGVuZHMgVD4gY29uc3RyYWludERlc2NyaXB0b3IpDQotICAgIHsNCi0gICAgICAgIGZvcihDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD4gcGF5bG9hZCA6IGNvbnN0cmFpbnREZXNjcmlwdG9yLmdldFBheWxvYWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzKS5pc0Fzc2lnbmFibGVGcm9tKHBheWxvYWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQmxvY2tpbmdDb25zdHJhaW50KENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IGNvbnN0cmFpbnREZXNjcmlwdG9yKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UgdGVzdE1lc3NhZ2UgPSBuZXcgRmFjZXNNZXNzYWdlKCk7DQotICAgICAgICB0ZXN0TWVzc2FnZS5zZXRTZXZlcml0eShWaW9sYXRpb25TZXZlcml0eS5FcnJvci5WQUxVRSk7DQotDQotICAgICAgICBmb3IgKENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPiBwYXlsb2FkIDogY29uc3RyYWludERlc2NyaXB0b3IuZ2V0UGF5bG9hZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcykuaXNBc3NpZ25hYmxlRnJvbShwYXlsb2FkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRlc3RNZXNzYWdlLnNldFNldmVyaXR5KFZpb2xhdGlvblNldmVyaXR5Lldhcm4uVkFMVUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihWaW9sYXRpb25TZXZlcml0eS5JbmZvLmNsYXNzKS5pc0Fzc2lnbmFibGVGcm9tKHBheWxvYWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGVzdE1lc3NhZ2Uuc2V0U2V2ZXJpdHkoVmlvbGF0aW9uU2V2ZXJpdHkuSW5mby5WQUxVRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYoRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKFZpb2xhdGlvblNldmVyaXR5LkZhdGFsLmNsYXNzKS5pc0Fzc2lnbmFibGVGcm9tKHBheWxvYWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGVzdE1lc3NhZ2Uuc2V0U2V2ZXJpdHkoVmlvbGF0aW9uU2V2ZXJpdHkuRmF0YWwuVkFMVUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5zZXZlcml0eUJsb2Nrc1N1Ym1pdEZvckNvbXBvbmVudElkKG51bGwsIHRlc3RNZXNzYWdlKTsNCi0gICAgfQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShDb25zdHJhaW50RGVzY3JpcHRvcjxUPiBjb25zdHJhaW50RGVzY3JpcHRvcik7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZjNzVlZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL05vdE51bGxNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIE5vdE51bGxNZXRhRGF0YVRyYW5zZm9ybWVyIGV4dGVuZHMgQWJzdHJhY3RCZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXI8Tm90TnVsbD4NCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKENvbnN0cmFpbnREZXNjcmlwdG9yPE5vdE51bGw+IGNvbnN0cmFpbnREZXNjcmlwdG9yKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIGlmKEV4dFZhbFV0aWxzLmludGVycHJldEVtcHR5U3RyaW5nVmFsdWVzQXNOdWxsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9TdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9TdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTlmZjU4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU3RyaW5nU2l6ZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBTdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lciBleHRlbmRzIEFic3RyYWN0QmVhblZhbGlkYXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyPFNpemU+DQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShDb25zdHJhaW50RGVzY3JpcHRvcjxTaXplPiBjb25zdHJhaW50RGVzY3JpcHRvcikNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBTaXplIGFubm90YXRpb24gPSBjb25zdHJhaW50RGVzY3JpcHRvci5nZXRBbm5vdGF0aW9uKCk7DQotDQotICAgICAgICBpbnQgbWluaW11bSA9IGFubm90YXRpb24ubWluKCk7DQotDQotICAgICAgICBpZihtaW5pbXVtICE9IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEgsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIX0RFRkFVTFQsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW50IG1heGltdW0gPSBhbm5vdGF0aW9uLm1heCgpOw0KLSAgICAgICAgaWYobWF4aW11bSAhPSBJbnRlZ2VyLk1BWF9WQUxVRSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCwgbWF4aW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEhfREVGQVVMVCwgbWF4aW11bSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0QmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGUwMzFjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0QmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXINCi0gICAgICAgIC5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotICAgIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYoaXNCZWFuVmFsaWRhdGlvblN0cmF0ZWd5KHNvdXJjZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5IGJlYW5WYWxpZGF0aW9uQWRhcHRlciA9DQotICAgICAgICAgICAgICAgICAgICAoQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5KXNvdXJjZTsNCi0NCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlQmVhblZhbGlkYXRpb25UcmFuc2Zvcm1lck5hbWUoYmVhblZhbGlkYXRpb25BZGFwdGVyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3koVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgIGFic3RyYWN0IFN0cmluZyBjcmVhdGVCZWFuVmFsaWRhdGlvblRyYW5zZm9ybWVyTmFtZSgNCi0gICAgICAgICAgICBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvTm90TnVsbE5hbWVNYXBwZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL05vdE51bGxOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMjg3ODYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvTm90TnVsbE5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIuTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5OZXN0ZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQE5lc3RlZA0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgTm90TnVsbE5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlQmVhblZhbGlkYXRpb25UcmFuc2Zvcm1lck5hbWUoQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5IGFkYXB0ZXIpDQotICAgIHsNCi0gICAgICAgIGlmKGlzTm90TnVsbENvbnN0cmFpbnQoYWRhcHRlcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIE5vdE51bGxNZXRhRGF0YVRyYW5zZm9ybWVyLmNsYXNzLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc05vdE51bGxDb25zdHJhaW50KEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSBhZGFwdGVyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gTm90TnVsbC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKA0KLSAgICAgICAgICAgICAgICBhZGFwdGVyLmdldENvbnN0cmFpbnREZXNjcmlwdG9yKCkuZ2V0QW5ub3RhdGlvbigpLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaXplTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2l6ZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM4OTBjNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaXplTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5OZXN0ZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIuU3RyaW5nU2l6ZU1ldGFEYXRhVHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ATmVzdGVkDQotQEludm9jYXRpb25PcmRlcigyMTApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaXplTmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0QmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVCZWFuVmFsaWRhdGlvblRyYW5zZm9ybWVyTmFtZShCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgYWRhcHRlcikNCi0gICAgew0KLSAgICAgICAgaWYoaXNTdHJpbmdTaXplQ29uc3RyYWludChhZGFwdGVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gU3RyaW5nU2l6ZU1ldGFEYXRhVHJhbnNmb3JtZXIuY2xhc3MuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3RyaW5nU2l6ZUNvbnN0cmFpbnQoQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5IGFkYXB0ZXIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBTaXplLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoDQotICAgICAgICAgICAgICAgIGFkYXB0ZXIuZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKS5nZXRBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCkpICYmDQotICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGFkYXB0ZXIuZ2V0RWxlbWVudENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3BheWxvYWQvRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3BheWxvYWQvRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMmQyMmYuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wYXlsb2FkL0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwucGF5bG9hZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24gZXh0ZW5kcyBQYXlsb2FkDQotew0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3BheWxvYWQvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvcGF5bG9hZC9WaW9sYXRpb25TZXZlcml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzg4YjJkLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvcGF5bG9hZC9WaW9sYXRpb25TZXZlcml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwucGF5bG9hZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZpb2xhdGlvblNldmVyaXR5DQotew0KLSAgICBpbnRlcmZhY2UgSW5mbyBleHRlbmRzIFBheWxvYWQNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFZBTFVFID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0lORk87DQotICAgIH0NCi0NCi0gICAgaW50ZXJmYWNlIFdhcm4gZXh0ZW5kcyBQYXlsb2FkDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBWQUxVRSA9IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOOw0KLSAgICB9DQotDQotICAgIGludGVyZmFjZSBFcnJvciBleHRlbmRzIFBheWxvYWQNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFZBTFVFID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SOw0KLSAgICB9DQotDQotICAgIGludGVyZmFjZSBGYXRhbCBleHRlbmRzIFBheWxvYWQNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFZBTFVFID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RhcnR1cC9CZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdGFydHVwL0JlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZWEyMGMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdGFydHVwL0JlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLkh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5CZWFuQXdhcmVWYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5NYXBwZWRDb25zdHJhaW50U291cmNlQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC51dGlsLkJlYW5WYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yLkV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yLkJlYW5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyLlNpemVOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIuTm90TnVsbE5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLk1vZGVsVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UubWFwcGVyLkJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5tYXBwZXIuTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5Hcm91cFN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXJIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTUwMjU3NDgzOTk4NzY4MzMzOTRMOw0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXJWYWxpZGF0b3JGYWN0b3J5KCk7DQotICAgICAgICByZWdpc3RlckJlYW5WYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7DQotICAgICAgICByZWdpc3Rlck1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCk7DQotICAgICAgICByZWdpc3Rlckdyb3VwU3RvcmFnZU5hbWVNYXBwZXIoKTsNCi0gICAgICAgIHJlZ2lzdGVyTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKTsNCi0gICAgICAgIHJlZ2lzdGVyQ29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7DQotICAgICAgICByZWdpc3Rlck1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOw0KLSAgICAgICAgcmVnaXN0ZXJQaGFzZUxpc3RlbmVycygpOw0KLSAgICAgICAgcmVnaXN0ZXJFeGNlcHRpb25JbnRlcmNlcHRvcigpOw0KLSAgICAgICAgcmVnaXN0ZXJWaW9sYXRpb25TZXZlcml0eVBheWxvYWQoKTsNCi0gICAgICAgIHJlZ2lzdGVyRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uUGF5bG9hZCgpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyVmFsaWRhdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KFZhbGlkYXRvckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpLA0KLSAgICAgICAgICAgICAgICBuZXcgQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeShCZWFuVmFsaWRhdGlvblV0aWxzLmdldERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCkpLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJCZWFuVmFsaWRhdGlvbkludGVyY2VwdG9ycygpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcigNCi0gICAgICAgICAgICAgICAgbmV3IEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKA0KLSAgICAgICAgICAgICAgICBuZXcgTWFwcGVkQ29uc3RyYWludFNvdXJjZUJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIobmV3IFNpemVOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKG5ldyBOb3ROdWxsTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlckdyb3VwU3RvcmFnZU5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBTdG9yYWdlTWFuYWdlciBzdG9yYWdlTWFuYWdlciA9IGdldFN0b3JhZ2VNYW5hZ2VySG9sZGVyKCkuZ2V0U3RvcmFnZU1hbmFnZXIoR3JvdXBTdG9yYWdlLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmIChzdG9yYWdlTWFuYWdlciBpbnN0YW5jZW9mIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAoKEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxTdHJpbmc+KSBzdG9yYWdlTWFuYWdlcikNCi0gICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgQmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKHN0b3JhZ2VNYW5hZ2VyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGhhcyB0byBpbXBsZW1lbnQgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5ICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgIiBjb3VsZG4ndCByZWdpc3RlciAiICsgQmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyLmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBEZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgbW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgPSBuZXcgRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyKCk7DQotICAgICAgICBtb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5yZWdpc3RlcihuZXcgTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBnZXRTdG9yYWdlTWFuYWdlckhvbGRlcigpLnNldFN0b3JhZ2VNYW5hZ2VyKE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MsIG1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJDb21wb25lbnRJbml0aWFsaXplcnMoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0b3JhZ2VNYW5hZ2VySG9sZGVyIGdldFN0b3JhZ2VNYW5hZ2VySG9sZGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwgU3RvcmFnZU1hbmFnZXJIb2xkZXIuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlck1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclBoYXNlTGlzdGVuZXJzKCkNCi0gICAgew0KLSAgICAgICAgSnNmVXRpbHMucmVnaXN0ZXJQaGFzZUxpc3RlbmVyKG5ldyBNb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyRXhjZXB0aW9uSW50ZXJjZXB0b3IoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IobmV3IEJlYW5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJWaW9sYXRpb25TZXZlcml0eVBheWxvYWQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0IGV4dFZhbENvbnRleHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKTsNCi0NCi0gICAgICAgIGV4dFZhbENvbnRleHQuYWRkR2xvYmFsUHJvcGVydHkoVmlvbGF0aW9uU2V2ZXJpdHkuSW5mby5jbGFzcy5nZXROYW1lKCksIFZpb2xhdGlvblNldmVyaXR5LkluZm8uY2xhc3MsIGZhbHNlKTsNCi0gICAgICAgIGV4dFZhbENvbnRleHQuYWRkR2xvYmFsUHJvcGVydHkoVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcy5nZXROYW1lKCksIFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MsIGZhbHNlKTsNCi0gICAgICAgIGV4dFZhbENvbnRleHQuYWRkR2xvYmFsUHJvcGVydHkoVmlvbGF0aW9uU2V2ZXJpdHkuRmF0YWwuY2xhc3MuZ2V0TmFtZSgpLCBWaW9sYXRpb25TZXZlcml0eS5GYXRhbC5jbGFzcywgZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyBuZWVkIHRvIHJlZ2lzdGVyICJlcnJvciIgaXQncyB0aGUgZGVmYXVsdA0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvblBheWxvYWQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eSgNCi0gICAgICAgICAgICAgICAgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKSwgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLCBmYWxzZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRCZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRCZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjAzNzZlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdEdyb3VwU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGJlYW4tdmFsaWRhdGlvbiBncm91cHMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UgZXh0ZW5kcyBEZWZhdWx0R3JvdXBTdG9yYWdlDQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIENsYXNzW10gZ2V0R3JvdXBzKFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgQ2xhc3NbXSByZXN1bHQgPSBzdXBlci5nZXRHcm91cHModmlld0lkLCBjbGllbnRJZCk7DQotDQotICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL3RoZSBkZWZhdWx0IGdyb3VwIHdpbGwgYmUgdmFsaWRhdGVkIGF1dG9tYXRpY2FsbHkNCi0gICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzW10ge307DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MDBmOGIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuR3JvdXBVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBzdG9yYWdlIGltcGxlbWVudGF0aW9uIGZvciBtb2RlbC12YWxpZGF0aW9uIGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZSBpbXBsZW1lbnRzIE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4+IG1vZGVsVmFsaWRhdGlvbkVudHJpZXMgPQ0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4+KCk7DQotDQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGNvbXBvbmVudHNPZlJlcXVlc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjbGllbnRJZCA9IGdldEN1cnJlbnRDbGllbnRJZChtb2RlbFZhbGlkYXRpb25FbnRyeSk7DQotDQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QgPSByZXNvbHZlTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeSwgY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkobW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LCBtb2RlbFZhbGlkYXRpb25FbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q3VycmVudENsaWVudElkKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY2xpZW50SWQgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjbGllbnRJZCA9IG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpLmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotDQotICAgICAgICAgICAgaWYoIXRoaXMuY29tcG9uZW50c09mUmVxdWVzdC5jb250YWlucyhjbGllbnRJZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNPZlJlcXVlc3QuYWRkKGNsaWVudElkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY2xpZW50SWQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXNvbHZlTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KA0KLSAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9DQotICAgICAgICAgICAgICAgIHRoaXMubW9kZWxWYWxpZGF0aW9uRW50cmllcy5nZXQoR3JvdXBVdGlscy5nZXRHcm91cEtleSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRWaWV3SWQoKSwgY2xpZW50SWQpKTsNCi0NCi0gICAgICAgIGlmKG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICAgICAgdGhpcy5tb2RlbFZhbGlkYXRpb25FbnRyaWVzLnB1dChHcm91cFV0aWxzLmdldEdyb3VwS2V5KA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Vmlld0lkKCksIGNsaWVudElkKSwgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KA0KLSAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmKCFtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QuY29udGFpbnMobW9kZWxWYWxpZGF0aW9uRW50cnkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdC5hZGQobW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2aWV3SWQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRWaWV3SWQoKTsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotDQotICAgICAgICBhZGRFbnRyaWVzRm9yQ29tcG9uZW50cyh2aWV3SWQsIHJlc3VsdCk7DQotDQotICAgICAgICBhZGRFbnRyaWVzRm9yUGFnZSh2aWV3SWQsIHJlc3VsdCk7DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRFbnRyaWVzRm9yQ29tcG9uZW50cyhTdHJpbmcgdmlld0lkLCBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIGZvcihTdHJpbmcgY3VycmVudENsaWVudElkIDogdGhpcy5jb21wb25lbnRzT2ZSZXF1ZXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwoZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllcyh2aWV3SWQsIGN1cnJlbnRDbGllbnRJZCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRFbnRyaWVzRm9yUGFnZShTdHJpbmcgdmlld0lkLCBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIHJlc3VsdC5hZGRBbGwoZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllcyh2aWV3SWQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGJ1aWxkTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KA0KLSAgICAgICAgICAgIFN0cmluZyBrZXksIE1hcDxTdHJpbmcsIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+PiBncm91cFN0b3JhZ2UpDQotICAgIHsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGxpc3Q7DQotDQotICAgICAgICBpZihrZXkgIT0gbnVsbCAmJiBrZXkuZW5kc1dpdGgoIioiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4oKTsNCi0gICAgICAgICAgICBmb3IoTWFwLkVudHJ5PFN0cmluZyxMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5Pj4gZW50cnkgOiBncm91cFN0b3JhZ2UuZW50cnlTZXQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldEtleSgpLnN1YnN0cmluZygwLCBlbnRyeS5nZXRLZXkoKS5pbmRleE9mKCJAIikpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhrZXkuc3Vic3RyaW5nKDAsIGtleS5pbmRleE9mKCJAIikpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGRBbGwoZW50cnkuZ2V0VmFsdWUoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGxpc3Q7DQotICAgICAgICB9DQotDQotICAgICAgICBsaXN0ID0gZ3JvdXBTdG9yYWdlLmdldChrZXkpOw0KLSAgICAgICAgcmV0dXJuIChsaXN0ICE9IG51bGwpID8gbGlzdCA6IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzKFN0cmluZyB2aWV3SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzKHZpZXdJZCwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzKFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5tb2RlbFZhbGlkYXRpb25FbnRyaWVzLnNpemUoKSA8IDEpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2FkZCBmb3VuZCBncm91cHMNCi0gICAgICAgIFN0cmluZyBrZXk7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHRMaXN0Rm9yUGFnZSA9IG51bGw7DQotDQotICAgICAgICBpZighIioiLmVxdWFscyhjbGllbnRJZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAga2V5ID0gR3JvdXBVdGlscy5nZXRHcm91cEtleSh2aWV3SWQsIG51bGwpOw0KLSAgICAgICAgICAgIHJlc3VsdExpc3RGb3JQYWdlID0NCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KGtleSwgdGhpcy5tb2RlbFZhbGlkYXRpb25FbnRyaWVzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGtleSA9IEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBjbGllbnRJZCk7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHRMaXN0Rm9yQ29tcG9uZW50ID0NCi0gICAgICAgICAgICAgICAgYnVpbGRNb2RlbFZhbGlkYXRpb25FbnRyeUxpc3Qoa2V5LCB0aGlzLm1vZGVsVmFsaWRhdGlvbkVudHJpZXMpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0TGlzdEZvclBhZ2UgPT0gbnVsbCB8fCByZXN1bHRMaXN0Rm9yUGFnZS5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdExpc3RGb3JDb21wb25lbnQ7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKHJlc3VsdExpc3RGb3JDb21wb25lbnQuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRMaXN0Rm9yUGFnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBtZXJnZVJlc3VsdHMocmVzdWx0TGlzdEZvclBhZ2UsIHJlc3VsdExpc3RGb3JDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbWVyZ2VSZXN1bHRzKA0KLSAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IHJlc3VsdExpc3RGb3JQYWdlLCBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHRMaXN0Rm9yQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtZXJnZWRSZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PigpOw0KLSAgICAgICAgbWVyZ2VkUmVzdWx0LmFkZEFsbChyZXN1bHRMaXN0Rm9yUGFnZSk7DQotICAgICAgICBtZXJnZWRSZXN1bHQuYWRkQWxsKHJlc3VsdExpc3RGb3JDb21wb25lbnQpOw0KLSAgICAgICAgcmV0dXJuIG1lcmdlZFJlc3VsdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MzEwMTIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5TdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIG1vZGVsLXZhbGlkYXRpb24gZW50cmllcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlcg0KLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8TW9kZWxWYWxpZGF0aW9uU3RvcmFnZT4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfTU9ERUxfVkFMSURBVElPTjpLRVkiOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25FbnRyeS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvbkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OGE4ZjMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5BUEk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihBUEkpDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvbkVudHJ5DQotew0KLSAgICBwcml2YXRlIFVJQ29tcG9uZW50IGNvbXBvbmVudDsNCi0gICAgcHJpdmF0ZSBMaXN0PENsYXNzPiBncm91cHMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLSAgICBwcml2YXRlIExpc3Q8T2JqZWN0PiB2YWxpZGF0aW9uVGFyZ2V0cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGlzcGxheU1lc3NhZ2VJbmxpbmUgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgY3VzdG9tTWVzc2FnZSA9IE1vZGVsVmFsaWRhdGlvbi5ERUZBVUxUOw0KLSAgICANCi0gICAgLy90aGUgb3JpZ2luYWwgc291cmNlIHdoZXJlIHRoZSBleHR2YWwtYnYgbWV0YS1kYXRhIGhhcyBiZWVuIGZvdW5kDQotICAgIHByaXZhdGUgT2JqZWN0IG1ldGFEYXRhU291cmNlT2JqZWN0Ow0KLSAgICBwcml2YXRlIFN0cmluZyB2aWV3SWQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRWaWV3SWQoKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkR3JvdXAoQ2xhc3MgZ3JvdXApDQotICAgIHsNCi0gICAgICAgIGlmKCF0aGlzLmdyb3Vwcy5jb250YWlucyhncm91cCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoISh0aGlzLmdyb3VwcyBpbnN0YW5jZW9mIEFycmF5TGlzdCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBuZXdHcm91cExpc3QgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLQ0KLSAgICAgICAgICAgICAgICBmb3IoQ2xhc3MgY3VycmVudENsYXNzIDogdGhpcy5ncm91cHMpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG5ld0dyb3VwTGlzdC5hZGQoY3VycmVudENsYXNzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB0aGlzLmdyb3VwcyA9IG5ld0dyb3VwTGlzdDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdGhpcy5ncm91cHMuYWRkKGdyb3VwKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVHcm91cChDbGFzcyBncm91cCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5ncm91cHMucmVtb3ZlKGdyb3VwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRWYWxpZGF0aW9uVGFyZ2V0KE9iamVjdCB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIGlmKCF0aGlzLnZhbGlkYXRpb25UYXJnZXRzLmNvbnRhaW5zKHRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoISh0aGlzLnZhbGlkYXRpb25UYXJnZXRzIGluc3RhbmNlb2YgQXJyYXlMaXN0KSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIExpc3Q8T2JqZWN0PiB2YWxpZGF0aW9uVGFyZ2V0TGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KLQ0KLSAgICAgICAgICAgICAgICBmb3IoT2JqZWN0IGN1cnJlbnRUYXJnZXQgOiB0aGlzLnZhbGlkYXRpb25UYXJnZXRzKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0TGlzdC5hZGQoY3VycmVudFRhcmdldCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uVGFyZ2V0cyA9IHZhbGlkYXRpb25UYXJnZXRMaXN0Ow0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25UYXJnZXRzLmFkZCh0YXJnZXQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIFVJQ29tcG9uZW50IGdldENvbXBvbmVudCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KFVJQ29tcG9uZW50IGNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENsYXNzW10gZ2V0R3JvdXBzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzLnRvQXJyYXkobmV3IENsYXNzW3RoaXMuZ3JvdXBzLnNpemUoKV0pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwcyhMaXN0PENsYXNzPiBncm91cHMpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZ3JvdXBzID0gZ3JvdXBzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZ2V0VmFsaWRhdGlvblRhcmdldHMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblRhcmdldHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRNZXRhRGF0YVNvdXJjZU9iamVjdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YVNvdXJjZU9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVNvdXJjZU9iamVjdChPYmplY3QgbWV0YURhdGFTb3VyY2VPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFTb3VyY2VPYmplY3QgPSBtZXRhRGF0YVNvdXJjZU9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlJlZHVuZGFudElmU3RhdGVtZW50In0pDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmICh0aGlzID09IG8pDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IHRoYXQgPSAoTW9kZWxWYWxpZGF0aW9uRW50cnkpIG87DQotDQotICAgICAgICBpZiAoY29tcG9uZW50ICE9IG51bGwgPyAhY29tcG9uZW50LmVxdWFscyh0aGF0LmNvbXBvbmVudCkgOiB0aGF0LmNvbXBvbmVudCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghZ3JvdXBzLmVxdWFscyh0aGF0Lmdyb3VwcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCF2YWxpZGF0aW9uVGFyZ2V0cy5lcXVhbHModGhhdC52YWxpZGF0aW9uVGFyZ2V0cykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNEaXNwbGF5TWVzc2FnZUlubGluZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkaXNwbGF5TWVzc2FnZUlubGluZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TWVzc2FnZUlubGluZShib29sZWFuIGRpc3BsYXlNZXNzYWdlSW5saW5lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRpc3BsYXlNZXNzYWdlSW5saW5lID0gZGlzcGxheU1lc3NhZ2VJbmxpbmU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDdXN0b21NZXNzYWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tTWVzc2FnZShTdHJpbmcgY3VzdG9tTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jdXN0b21NZXNzYWdlID0gY3VzdG9tTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIGludCByZXN1bHQgPSBjb21wb25lbnQgIT0gbnVsbCA/IGNvbXBvbmVudC5oYXNoQ29kZSgpIDogMDsNCi0gICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgZ3JvdXBzLmhhc2hDb2RlKCk7DQotICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIHZhbGlkYXRpb25UYXJnZXRzLmhhc2hDb2RlKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Vmlld0lkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZpZXdJZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWaWV3SWQoU3RyaW5nIHZpZXdJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy52aWV3SWQgPSB2aWV3SWQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmRmOTMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogc3VnZ2VzdGVkIGludGVyZmFjZSBmb3IgYSBtb2RlbC12YWxpZGF0aW9uIHN0b3JhZ2UNCi0gKiA8cC8+DQotICogaXQgYWxsb3dzIHRvIG1hbmFnZSBtb2RlbC12YWxpZGF0aW9uLWVudHJpZXMgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHZvaWQgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLQ0KLSAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvbWFwcGVyL0JlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9CZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjMmUzOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvbWFwcGVyL0JlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uQmVhblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuRGVmYXVsdEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEJlYW5WYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoa2V5KSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvbWFwcGVyL01vZGVsVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvbWFwcGVyL01vZGVsVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNjIwNTAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLkRlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoTW9kZWxWYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoa2V5KSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9CZWFuVmFsaWRhdGlvblV0aWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvQmVhblZhbGlkYXRpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzZkMTczLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9CZWFuVmFsaWRhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLk1vZGVsVmFsaWRhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5GYWNlc01lc3NhZ2VIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25VdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPR0dFUiA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEJlYW5WYWxpZGF0aW9uVXRpbHMuY2xhc3MpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzIGJ2bWkgPSBuZXcgRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscyhMT0dHRVIpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVE9SX0ZBQ1RPUllfS0VZID0gImphdmF4LmZhY2VzLnZhbGlkYXRvci5iZWFuVmFsaWRhdG9yLlZhbGlkYXRvckZhY3RvcnkiOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTWV0YURhdGFUb0NvbnRleHQoDQotICAgICAgICAgICAgVUlDb21wb25lbnQgY29tcG9uZW50LCBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLCBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZ1tdIGtleSA9IHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKS5zcGxpdCgiXFwuIik7DQotDQotICAgICAgICBPYmplY3QgZmlyc3RCZWFuID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKGtleVswXSk7DQotDQotICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgIGJ2bWkuZXh0cmFjdEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGEocHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBrZXksDQotICAgICAgICAgICAgICAgIGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotDQotICAgICAgICBidm1pLnByb2Nlc3NFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhKGNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc0NvbnN0cmFpbnRWaW9sYXRpb25zKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbj4gdmlvbGF0aW9ucykNCi0gICAgew0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2U7DQotICAgICAgICBmb3IgKENvbnN0cmFpbnRWaW9sYXRpb24gdmlvbGF0aW9uIDogdmlvbGF0aW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2UgPSBjcmVhdGVGYWNlc01lc3NhZ2VGb3JDb25zdHJhaW50VmlvbGF0aW9uKHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHZpb2xhdGlvbik7DQotDQotICAgICAgICAgICAgaWYgKGZhY2VzTWVzc2FnZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGJ2bWkucHJvY2Vzc0ZhY2VzTWVzc2FnZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0LCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHJvY2Vzc1Zpb2xhdGlvbk1lc3NhZ2VzKGZhY2VzTWVzc2FnZUhvbGRlckxpc3QpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjZXNNZXNzYWdlIGNyZWF0ZUZhY2VzTWVzc2FnZUZvckNvbnN0cmFpbnRWaW9sYXRpb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJhaW50VmlvbGF0aW9uIHZpb2xhdGlvbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZpb2xhdGlvbk1lc3NhZ2UgPSB2aW9sYXRpb24uZ2V0TWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGxhYmVsZWRNZXNzYWdlU3VtbWFyeSA9IGJ2bWkuY3JlYXRlTGFiZWxlZE1lc3NhZ2UodmlvbGF0aW9uTWVzc2FnZSwgZmFsc2UpOw0KLSAgICAgICAgU3RyaW5nIGxhYmVsZWRNZXNzYWdlRGV0YWlsID0gYnZtaS5jcmVhdGVMYWJlbGVkTWVzc2FnZSh2aW9sYXRpb25NZXNzYWdlLCB0cnVlKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSA9IGJ2bWkuY2FsY1NldmVyaXR5KHZpb2xhdGlvbik7DQotDQotICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uID0gYnZtaQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yRXhjZXB0aW9uKGxhYmVsZWRNZXNzYWdlU3VtbWFyeSwgbGFiZWxlZE1lc3NhZ2VEZXRhaWwsIHNldmVyaXR5KTsNCi0NCi0gICAgICAgIGlmICghYnZtaS5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycyh1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGJ2bWkuaXNNZXNzYWdlVGV4dFVuY2hhbmdlZCh2YWxpZGF0b3JFeGNlcHRpb24sIGxhYmVsZWRNZXNzYWdlU3VtbWFyeSwgbGFiZWxlZE1lc3NhZ2VEZXRhaWwpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc2V2ZXJpdHksIHZpb2xhdGlvbk1lc3NhZ2UsIHZpb2xhdGlvbk1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc2V2ZXJpdHksDQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U3VtbWFyeSgpLA0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldERldGFpbCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc1Zpb2xhdGlvbk1lc3NhZ2VzKExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiB2aW9sYXRpb25NZXNzYWdlSG9sZGVyTGlzdCkNCi0gICAgew0KLSAgICAgICAgaWYgKHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0ID09IG51bGwgfHwgdmlvbGF0aW9uTWVzc2FnZUhvbGRlckxpc3QuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VMaXN0V2l0aExvd1NldmVyaXR5ID0NCi0gICAgICAgICAgICAgICAgYnZtaS5nZXRGYWNlc01lc3NhZ2VMaXN0V2l0aExvd1NldmVyaXR5KHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0KTsNCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VMaXN0V2l0aEhpZ2hTZXZlcml0eSA9DQotICAgICAgICAgICAgICAgIGJ2bWkuZ2V0RmFjZXNNZXNzYWdlTGlzdFdpdGhIaWdoU2V2ZXJpdHkodmlvbGF0aW9uTWVzc2FnZUhvbGRlckxpc3QpOw0KLQ0KLSAgICAgICAgYnZtaS5hZGRNZXNzYWdlcyhmYWNlc01lc3NhZ2VMaXN0V2l0aEhpZ2hTZXZlcml0eSk7DQotICAgICAgICBidm1pLmFkZE1lc3NhZ2VzKGZhY2VzTWVzc2FnZUxpc3RXaXRoTG93U2V2ZXJpdHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yRmFjdG9yeSBnZXREZWZhdWx0VmFsaWRhdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gYXBwbGljYXRpb25NYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25NYXAoKTsNCi0gICAgICAgIFZhbGlkYXRvckZhY3RvcnkgdmFsaWRhdG9yRmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBpZiAoYXBwbGljYXRpb25NYXAuY29udGFpbnNLZXkoVkFMSURBVE9SX0ZBQ1RPUllfS0VZKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoYXBwbGljYXRpb25NYXAuZ2V0KFZBTElEQVRPUl9GQUNUT1JZX0tFWSkgaW5zdGFuY2VvZiBWYWxpZGF0b3JGYWN0b3J5KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yRmFjdG9yeSA9IChWYWxpZGF0b3JGYWN0b3J5KSBhcHBsaWNhdGlvbk1hcC5nZXQoVkFMSURBVE9SX0ZBQ1RPUllfS0VZKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmFsaWRhdG9yRmFjdG9yeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRvckZhY3RvcnkgPSBWYWxpZGF0aW9uLmJ1aWxkRGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKTsNCi0gICAgICAgICAgICBhcHBsaWNhdGlvbk1hcC5wdXQoVkFMSURBVE9SX0ZBQ1RPUllfS0VZLCB2YWxpZGF0b3JGYWN0b3J5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjRkNTU4Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uQmVhblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLmV4dHJhY3Rvci5EZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuTW9kZWxWYWxpZGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkVMSGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5GYWNlc01lc3NhZ2VIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFJbnRlcm5hbHMNCi17DQotICAgIHByaXZhdGUgTG9nIGxvZ2dlcjsNCi0gICAgcHJpdmF0ZSBMYWJlbGVkTWVzc2FnZUludGVybmFscyBsYWJlbGVkTWVzc2FnZUludGVybmFscyA9IG5ldyBMYWJlbGVkTWVzc2FnZUludGVybmFscygpOw0KLQ0KLSAgICBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzKExvZyBsb2dnZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyOw0KLSAgICB9DQotDQotICAgIHZvaWQgZXh0cmFjdEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGEoUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10ga2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgaW5zcGVjdEZpcnN0QmVhbihwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgaW5zcGVjdEZpcnN0UHJvcGVydHkocHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAga2V5LA0KLSAgICAgICAgICAgICAgICBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIGtleS5sZW5ndGggPT0gMik7DQotDQotICAgICAgICBpbnNwZWN0QmFzZU9mUHJvcGVydHkocHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgIGluc3BlY3RMYXN0UHJvcGVydHkocHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIHByb2Nlc3NFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhKFVJQ29tcG9uZW50IGNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgPSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBTdHJpbmcgY3VycmVudFZpZXdJZCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldFZpZXdJZCgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGNsaWVudElkID0gY29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotDQotICAgICAgICBwcm9jZXNzRm91bmRHcm91cHMoZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LCBjdXJyZW50Vmlld0lkLCBjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgcHJvY2Vzc1Jlc3RyaWN0ZWRHcm91cHMoZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LCBjdXJyZW50Vmlld0lkLCBjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbik7DQotDQotICAgICAgICBpbml0TW9kZWxWYWxpZGF0aW9uKGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCwgY29tcG9uZW50LCBwcm9wZXJ0eURldGFpbHMsDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RGaXJzdEJlYW4oYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgZmlyc3RCZWFuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzQ2xhc3MoZmlyc3RCZWFuLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5zcGVjdEZpcnN0UHJvcGVydHkoYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10ga2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzTGFzdFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzRmllbGRzQW5kUHJvcGVydGllcyhrZXlbMF0gKyAiLiIgKyBrZXlbMV0sDQotICAgICAgICAgICAgICAgIGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAga2V5WzFdLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBpc0xhc3RQcm9wZXJ0eSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RCYXNlT2ZQcm9wZXJ0eShQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RMYXN0UHJvcGVydHkoUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzRmllbGRzQW5kUHJvcGVydGllcygNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzLmdldEtleSgpLA0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgdHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDbGFzcyhPYmplY3Qgb2JqZWN0VG9JbnNwZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBDbGFzcyBjbGFzc1RvSW5zcGVjdCA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3Mob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCkpOw0KLQ0KLSAgICAgICAgd2hpbGUgKCFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc1RvSW5zcGVjdC5nZXROYW1lKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyYW5zZmVyR3JvdXBWYWxpZGF0aW9uSW5mb3JtYXRpb25Ub0ZvdW5kR3JvdXBzKG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhvYmplY3RUb0luc3BlY3QuZ2V0Q2xhc3MoKSwgb2JqZWN0VG9JbnNwZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgICAgIGNsYXNzVG9JbnNwZWN0ID0gY2xhc3NUb0luc3BlY3QuZ2V0U3VwZXJjbGFzcygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmllbGRzQW5kUHJvcGVydGllcyhTdHJpbmcga2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGJhc2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0xhc3RQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3RvcigpDQotICAgICAgICAgICAgICAgIC5leHRyYWN0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgbmV3IFByb3BlcnR5RGV0YWlscyhrZXksIGJhc2UsIHByb3BlcnR5KSk7DQotDQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSA6IHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5VG9Qcm9jZXNzTWV0YURhdGEoKEJlYW5WYWxpZGF0aW9uKSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5VG9DcmVhdGVOZXdUYXJnZXQoYmFzZSwgcHJvcGVydHksIGlzTGFzdFByb3BlcnR5KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmIChtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdGlvbi5MaXN0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm9yIChCZWFuVmFsaWRhdGlvbiBjdXJyZW50QmVhblZhbGlkYXRpb24gOiAoKEJlYW5WYWxpZGF0aW9uLkxpc3QpIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSkudmFsdWUoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdHJ5VG9Qcm9jZXNzTWV0YURhdGEoY3VycmVudEJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlUb0NyZWF0ZU5ld1RhcmdldChiYXNlLCBwcm9wZXJ0eSwgaXNMYXN0UHJvcGVydHkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCB0cnlUb0NyZWF0ZU5ld1RhcmdldChPYmplY3QgYmFzZSwgU3RyaW5nIHByb3BlcnR5LCBib29sZWFuIGlzTGFzdFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpZihpc0xhc3RQcm9wZXJ0eSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYmFzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE9iamVjdCByZXN1bHQgPSBnZXRWYWx1ZU9mUHJvcGVydHkoYmFzZSwgcHJvcGVydHkpOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBiYXNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBnZXRWYWx1ZU9mUHJvcGVydHkoT2JqZWN0IGJhc2UsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHByb3BlcnR5LnN1YnN0cmluZygxLCBwcm9wZXJ0eS5sZW5ndGgoKSk7DQotDQotICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoYmFzZS5nZXRDbGFzcygpKTsNCi0NCi0gICAgICAgIE1ldGhvZCB0YXJnZXRNZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodGFyZ2V0Q2xhc3MsICJnZXQiICsgcHJvcGVydHkpOw0KLQ0KLSAgICAgICAgaWYgKHRhcmdldE1ldGhvZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh0YXJnZXRDbGFzcywgImlzIiArIHByb3BlcnR5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgImNsYXNzICIgKyB0YXJnZXRDbGFzcyArICIgaGFzIG5vIHB1YmxpYyBnZXQvaXMgIiArIHByb3BlcnR5LnRvTG93ZXJDYXNlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZChiYXNlLCB0YXJnZXRNZXRob2QpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRm91bmRHcm91cHMoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudFZpZXdJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xpZW50SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIC8qDQotICAgICAgICAgKiBhZGQgZm91bmQgZ3JvdXBzIHRvIGNvbnRleHQNCi0gICAgICAgICAqLw0KLSAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50R3JvdXBDbGFzcyA6IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5hZGRHcm91cChjdXJyZW50R3JvdXBDbGFzcywgY3VycmVudFZpZXdJZCwgY2xpZW50SWQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUmVzdHJpY3RlZEdyb3VwcyhFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRWaWV3SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xpZW50SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICAvKg0KLSAgICAgICAgICogYWRkIHJlc3RyaWN0ZWQgZ3JvdXBzDQotICAgICAgICAgKi8NCi0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEdyb3VwQ2xhc3MgOiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5yZXN0cmljdEdyb3VwKGN1cnJlbnRHcm91cENsYXNzLCBjdXJyZW50Vmlld0lkLCBjbGllbnRJZCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRNb2RlbFZhbGlkYXRpb24oRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgY29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIC8qDQotICAgICAgICAgKiBhZGQgbW9kZWwgdmFsaWRhdGlvbiBlbnRyeSBsaXN0DQotICAgICAgICAgKi8NCi0gICAgICAgIGZvciAoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkgOiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yIChDbGFzcyByZXN0cmljdGVkR3JvdXAgOiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkucmVtb3ZlR3JvdXAocmVzdHJpY3RlZEdyb3VwKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldEdyb3VwcygpLmxlbmd0aCA+IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0VmFsaWRhdGlvblRhcmdldHMoKS5pc0VtcHR5KCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmFkZFZhbGlkYXRpb25UYXJnZXQocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuc2V0Q29tcG9uZW50KGNvbXBvbmVudCk7DQotICAgICAgICAgICAgICAgIGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5hZGRNb2RlbFZhbGlkYXRpb25FbnRyeShtb2RlbFZhbGlkYXRpb25FbnRyeSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ0ZXN0IHByb3h5IHN1cHBvcnQiKQ0KLSAgICBwcml2YXRlIHZvaWQgdHJhbnNmZXJHcm91cFZhbGlkYXRpb25JbmZvcm1hdGlvblRvRm91bmRHcm91cHMoDQotICAgICAgICAgICAgT2JqZWN0IG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKG9iamVjdFRvSW5zcGVjdC5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoQmVhblZhbGlkYXRpb24uY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvUHJvY2Vzc01ldGFEYXRhKG9iamVjdFRvSW5zcGVjdC5nZXRDbGFzcygpLmdldEFubm90YXRpb24oQmVhblZhbGlkYXRpb24uY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0VG9JbnNwZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCkuaXNBbm5vdGF0aW9uUHJlc2VudChCZWFuVmFsaWRhdGlvbi5MaXN0LmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IgKEJlYW5WYWxpZGF0aW9uIGN1cnJlbnRCZWFuVmFsaWRhdGlvbiA6DQotICAgICAgICAgICAgICAgICAgICAob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCkuZ2V0QW5ub3RhdGlvbihCZWFuVmFsaWRhdGlvbi5MaXN0LmNsYXNzKSkudmFsdWUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeVRvUHJvY2Vzc01ldGFEYXRhKGN1cnJlbnRCZWFuVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUb0luc3BlY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbnRlcmZhY2VzKENsYXNzIGN1cnJlbnRDbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IGN1cnJlbnRDbGFzcy5nZXRJbnRlcmZhY2VzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJhbnNmZXJHcm91cFZhbGlkYXRpb25JbmZvcm1hdGlvblRvRm91bmRHcm91cHMobWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotDQotICAgICAgICAgICAgcHJvY2Vzc0ludGVyZmFjZXMoY3VycmVudEludGVyZmFjZSwgbWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvUHJvY2Vzc01ldGFEYXRhKEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgZm9yIChTdHJpbmcgY3VycmVudFZpZXdJZCA6IGJlYW5WYWxpZGF0aW9uLnZpZXdJZHMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodXNlTWV0YURhdGFGb3JWaWV3SWQoYmVhblZhbGlkYXRpb24sIGN1cnJlbnRWaWV3SWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01ldGFEYXRhKGJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlTWV0YURhdGFGb3JWaWV3SWQoQmVhblZhbGlkYXRpb24gYmVhblZhbGlkYXRpb24sIFN0cmluZyBjdXJyZW50Vmlld0lkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKGN1cnJlbnRWaWV3SWQuZXF1YWxzKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldFZpZXdJZCgpKSB8fA0KLSAgICAgICAgICAgICAgICBjdXJyZW50Vmlld0lkLmVxdWFscygiKiIpKSAmJiBpc1ZhbGlkYXRpb25QZXJtaXR0ZWQoYmVhblZhbGlkYXRpb24pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTWV0YURhdGEoQmVhblZhbGlkYXRpb24gYmVhblZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAocHJvY2Vzc01vZGVsVmFsaWRhdGlvbiAmJiBpc01vZGVsVmFsaWRhdGlvbihiZWFuVmFsaWRhdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoDQotICAgICAgICAgICAgICAgICAgICBiZWFuVmFsaWRhdGlvbiwgbWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoIWlzTW9kZWxWYWxpZGF0aW9uKGJlYW5WYWxpZGF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzR3JvdXBzKA0KLSAgICAgICAgICAgICAgICAgICAgYmVhblZhbGlkYXRpb24sIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLCByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZGF0aW9uUGVybWl0dGVkKEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBFTEhlbHBlciBlbEhlbHBlciA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjb25kaXRpb24gOiBiZWFuVmFsaWRhdGlvbi5jb25kaXRpb25zKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVsSGVscGVyLmlzRUxUZXJtV2VsbEZvcm1lZChjb25kaXRpb24pICYmDQotICAgICAgICAgICAgICAgICAgICBlbEhlbHBlci5pc0VMVGVybVZhbGlkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgY29uZGl0aW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGVsSGVscGVyLmdldFZhbHVlT2ZFeHByZXNzaW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oY29uZGl0aW9uKSkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAodGhpcy5sb2dnZXIuaXNFcnJvckVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoImFuIGludmFsaWQgY29uZGl0aW9uIGlzIHVzZWQ6ICIgKyBjb25kaXRpb24pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc01vZGVsVmFsaWRhdGlvbihCZWFuVmFsaWRhdGlvbiBiZWFuVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGJlYW5WYWxpZGF0aW9uLm1vZGVsVmFsaWRhdGlvbigpLmlzQWN0aXZlKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkgPSBuZXcgTW9kZWxWYWxpZGF0aW9uRW50cnkoKTsNCi0NCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LnNldEdyb3VwcyhBcnJheXMuYXNMaXN0KGJlYW5WYWxpZGF0aW9uLnVzZUdyb3VwcygpKSk7DQotICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5zZXREaXNwbGF5TWVzc2FnZUlubGluZShiZWFuVmFsaWRhdGlvbi5tb2RlbFZhbGlkYXRpb24oKS5kaXNwbGF5SW5saW5lKCkpOw0KLSAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuc2V0Q3VzdG9tTWVzc2FnZShiZWFuVmFsaWRhdGlvbi5tb2RlbFZhbGlkYXRpb24oKS5tZXNzYWdlKCkpOw0KLSAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuc2V0TWV0YURhdGFTb3VyY2VPYmplY3QobWV0YURhdGFTb3VyY2VPYmplY3QpOw0KLQ0KLSAgICAgICAgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQ7DQotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0RXhwcmVzc2lvbiA6IGJlYW5WYWxpZGF0aW9uLm1vZGVsVmFsaWRhdGlvbigpLnZhbGlkYXRpb25UYXJnZXRzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKE1vZGVsVmFsaWRhdGlvbi5ERUZBVUxULmVxdWFscyh2YWxpZGF0aW9uVGFyZ2V0RXhwcmVzc2lvbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCA9IHRyeVRvUmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFeHByZXNzaW9uKHZhbGlkYXRpb25UYXJnZXRFeHByZXNzaW9uKTsNCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblRhcmdldCAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuYWRkVmFsaWRhdGlvblRhcmdldCh2YWxpZGF0aW9uVGFyZ2V0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoYmVhblZhbGlkYXRpb24ucmVzdHJpY3RHcm91cHMoKS5sZW5ndGggPiAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24uYWRkQWxsKEFycmF5cy5hc0xpc3QoYmVhblZhbGlkYXRpb24ucmVzdHJpY3RHcm91cHMoKSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldFZhbGlkYXRpb25UYXJnZXRzKCkuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmFkZFZhbGlkYXRpb25UYXJnZXQobWV0YURhdGFTb3VyY2VPYmplY3QpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LmFkZChtb2RlbFZhbGlkYXRpb25FbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgdHJ5VG9SZXNvbHZlVmFsaWRhdGlvblRhcmdldEV4cHJlc3Npb24oU3RyaW5nIHZhbGlkYXRpb25UYXJnZXRFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWxpZGF0aW9uVGFyZ2V0RXhwcmVzc2lvbik7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0dyb3VwcyhCZWFuVmFsaWRhdGlvbiBiZWFuVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLmFkZEFsbChBcnJheXMuYXNMaXN0KGJlYW5WYWxpZGF0aW9uLnVzZUdyb3VwcygpKSk7DQotDQotICAgICAgICBpZiAoYmVhblZhbGlkYXRpb24ucmVzdHJpY3RHcm91cHMoKS5sZW5ndGggPiAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24uYWRkQWxsKEFycmF5cy5hc0xpc3QoYmVhblZhbGlkYXRpb24ucmVzdHJpY3RHcm91cHMoKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIFN0cmluZyBjcmVhdGVMYWJlbGVkTWVzc2FnZShTdHJpbmcgdmlvbGF0aW9uTWVzc2FnZSwgYm9vbGVhbiBpc0RldGFpbE1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmxhYmVsZWRNZXNzYWdlSW50ZXJuYWxzLmNyZWF0ZUxhYmVsZWRNZXNzYWdlKHZpb2xhdGlvbk1lc3NhZ2UsIGlzRGV0YWlsTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IGNhbGNTZXZlcml0eShDb25zdHJhaW50VmlvbGF0aW9uPD8+IHZpb2xhdGlvbikNCi0gICAgew0KLSAgICAgICAgZm9yIChDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD4gcGF5bG9hZCA6IHZpb2xhdGlvbi5nZXRDb25zdHJhaW50RGVzY3JpcHRvcigpLmdldFBheWxvYWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MpLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKFZpb2xhdGlvblNldmVyaXR5LkluZm8uY2xhc3MpLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0lORk87DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKFZpb2xhdGlvblNldmVyaXR5LkZhdGFsLmNsYXNzKS5pc0Fzc2lnbmFibGVGcm9tKHBheWxvYWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9GQVRBTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SOw0KLSAgICB9DQotDQotICAgIHZvaWQgcHJvY2Vzc0ZhY2VzTWVzc2FnZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0LCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyID0gbmV3IEZhY2VzTWVzc2FnZUhvbGRlcihmYWNlc01lc3NhZ2UpOw0KLQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlSG9sZGVyLnNldENsaWVudElkKHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCkpOw0KLQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlSG9sZGVyTGlzdC5hZGQoZmFjZXNNZXNzYWdlSG9sZGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBib29sZWFuIGV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgbnVsbCwNCi0gICAgICAgICAgICAgICAgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgIG51bGwpOw0KLSAgICB9DQotDQotICAgIGJvb2xlYW4gaXNNZXNzYWdlVGV4dFVuY2hhbmdlZCgNCi0gICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLCBTdHJpbmcgdmlvbGF0aW9uU3VtbWFyeU1lc3NhZ2UsIFN0cmluZyB2aW9sYXRpb25EZXRhaWxNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmlvbGF0aW9uU3VtbWFyeU1lc3NhZ2UuZXF1YWxzKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTdW1tYXJ5KCkpICYmDQotICAgICAgICAgICAgICAgIHZpb2xhdGlvbkRldGFpbE1lc3NhZ2UuZXF1YWxzKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKS5nZXREZXRhaWwoKSk7DQotICAgIH0NCi0NCi0gICAgVmFsaWRhdG9yRXhjZXB0aW9uIGNyZWF0ZVZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICBTdHJpbmcgdmlvbGF0aW9uU3VtbWFyeU1lc3NhZ2UsIFN0cmluZyB2aW9sYXRpb25EZXRhaWxNZXNzYWdlLCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc2V2ZXJpdHksIHZpb2xhdGlvblN1bW1hcnlNZXNzYWdlLCB2aW9sYXRpb25EZXRhaWxNZXNzYWdlKSk7DQotICAgIH0NCi0NCi0gICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZUxpc3RXaXRoTG93U2V2ZXJpdHkoDQotICAgICAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IHZpb2xhdGlvbk1lc3NhZ2VzKQ0KLSAgICB7DQotICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+KCk7DQotDQotICAgICAgICBmb3IgKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIgOiB2aW9sYXRpb25NZXNzYWdlcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4uZXF1YWxzKGZhY2VzTWVzc2FnZUhvbGRlci5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0lORk8uZXF1YWxzKGZhY2VzTWVzc2FnZUhvbGRlci5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZmFjZXNNZXNzYWdlSG9sZGVyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBnZXRGYWNlc01lc3NhZ2VMaXN0V2l0aEhpZ2hTZXZlcml0eSgNCi0gICAgICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gdmlvbGF0aW9uTWVzc2FnZUhvbGRlckxpc3QpDQotICAgIHsNCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgICAgIGZvciAoRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlciA6IHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IuZXF1YWxzKGZhY2VzTWVzc2FnZUhvbGRlci5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMLmVxdWFscyhmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGZhY2VzTWVzc2FnZUhvbGRlcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIGFkZE1lc3NhZ2VzKExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0V2l0aExvd1NldmVyaXR5KQ0KLSAgICB7DQotICAgICAgICBmb3IgKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIgOiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0V2l0aExvd1NldmVyaXR5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudElkKA0KLSAgICAgICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlSG9sZGVyLmdldENsaWVudElkKCksIGZhY2VzTWVzc2FnZUhvbGRlci5nZXRGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC91dGlsL0xhYmVsZWRNZXNzYWdlSW50ZXJuYWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvTGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwYjc4My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvTGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgTGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMNCi17DQotICAgIC8vdGhlcmUgaXMgbm8gY29uY3VycmVuY3kgaXNzdWUgaGVyZSAtIGl0IGFsd2F5cyBsZWFkcyB0byB0aGUgc2FtZSByZXN1bHQNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVmYXVsdFN1bW1hcnlNZXNzYWdlVGVtcGxhdGUgPSAiezF9OiB7MH0iOw0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZWZhdWx0RGV0YWlsTWVzc2FnZVRlbXBsYXRlID0gInsxfTogezB9IjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3VtbWFyeU1lc3NhZ2VUZW1wbGF0ZSA9IGRlZmF1bHRTdW1tYXJ5TWVzc2FnZVRlbXBsYXRlOw0KLSAgICBwcml2YXRlIFN0cmluZyBkZXRhaWxNZXNzYWdlVGVtcGxhdGUgPSBkZWZhdWx0RGV0YWlsTWVzc2FnZVRlbXBsYXRlOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfVkFMSURBVE9SX0JFQU5WQUxJREFUT1JfTUVTU0FHRSA9DQotICAgICAgICAgICAgImphdmF4LmZhY2VzLnZhbGlkYXRvci5CZWFuVmFsaWRhdG9yLk1FU1NBR0UiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfVkFMSURBVE9SX0JFQU5WQUxJREFUT1JfTUVTU0FHRV9ERVRBSUwgPQ0KLSAgICAgICAgICAgICJqYXZheC5mYWNlcy52YWxpZGF0b3IuQmVhblZhbGlkYXRvci5NRVNTQUdFX2RldGFpbCI7DQotDQotICAgIFN0cmluZyBjcmVhdGVMYWJlbGVkTWVzc2FnZShTdHJpbmcgdmlvbGF0aW9uTWVzc2FnZSwgYm9vbGVhbiBpc0RldGFpbE1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIGlmKGlzRGV0YWlsTWVzc2FnZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ5VG9SZXNvbHZlRGV0YWlsTWVzc2FnZSh2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ5VG9SZXNvbHZlU3VtbWFyeU1lc3NhZ2UodmlvbGF0aW9uTWVzc2FnZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHJ5VG9SZXNvbHZlU3VtbWFyeU1lc3NhZ2UoU3RyaW5nIHZpb2xhdGlvbk1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIGlmKHN1bW1hcnlNZXNzYWdlVGVtcGxhdGUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0U3VtbWFyeU1lc3NhZ2VUZW1wbGF0ZS5yZXBsYWNlKCJ7MH0iLCB2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRoaXMuc3VtbWFyeU1lc3NhZ2VUZW1wbGF0ZSA9IGxvYWRTdGFuZGFyZE1lc3NhZ2VUZW1wbGF0ZShmYWxzZSk7DQotDQotICAgICAgICBpZihzdW1tYXJ5TWVzc2FnZVRlbXBsYXRlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxhYmVsZWRNZXNzYWdlKHZpb2xhdGlvbk1lc3NhZ2UsIGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzdW1tYXJ5TWVzc2FnZVRlbXBsYXRlLnJlcGxhY2UoInswfSIsIHZpb2xhdGlvbk1lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvUmVzb2x2ZURldGFpbE1lc3NhZ2UoU3RyaW5nIHZpb2xhdGlvbk1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIGlmKGRldGFpbE1lc3NhZ2VUZW1wbGF0ZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHREZXRhaWxNZXNzYWdlVGVtcGxhdGUucmVwbGFjZSgiezB9IiwgdmlvbGF0aW9uTWVzc2FnZSk7DQotICAgICAgICB9DQotDQotICAgICAgICB0aGlzLmRldGFpbE1lc3NhZ2VUZW1wbGF0ZSA9IGxvYWRTdGFuZGFyZE1lc3NhZ2VUZW1wbGF0ZSh0cnVlKTsNCi0NCi0gICAgICAgIGlmKGRldGFpbE1lc3NhZ2VUZW1wbGF0ZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVMYWJlbGVkTWVzc2FnZSh2aW9sYXRpb25NZXNzYWdlLCB0cnVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBkZXRhaWxNZXNzYWdlVGVtcGxhdGUucmVwbGFjZSgiezB9IiwgdmlvbGF0aW9uTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgbG9hZFN0YW5kYXJkTWVzc2FnZVRlbXBsYXRlKGJvb2xlYW4gaXNEZXRhaWxNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihpc0RldGFpbE1lc3NhZ2UpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gSnNmVXRpbHMuZ2V0TWVzc2FnZUZyb21BcHBsaWNhdGlvbk1lc3NhZ2VCdW5kbGUoDQotICAgICAgICAgICAgICAgICAgICAgICAgSkFWQVhfRkFDRVNfVkFMSURBVE9SX0JFQU5WQUxJREFUT1JfTUVTU0FHRV9ERVRBSUwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gSnNmVXRpbHMuZ2V0TWVzc2FnZUZyb21BcHBsaWNhdGlvbk1lc3NhZ2VCdW5kbGUoDQotICAgICAgICAgICAgICAgICAgICAgICAgSkFWQVhfRkFDRVNfVkFMSURBVE9SX0JFQU5WQUxJREFUT1JfTUVTU0FHRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjZjYjNmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5CZWFuVmFsaWRhdGlvbk1vZHVsZUtleTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5Nb2RlbFZhbGlkYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbC5CZWFuVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkZhY2VzTWVzc2FnZUhvbGRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF0aDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInJlZmFjdG9yIGltcGxlbWVudGF0aW9uIGRldGFpbHMiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzQ4MjIzMzg5MzE4NjcwODg3OEw7DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBwaGFzZUV2ZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJqc3IzMDMgc3RhcnQgbW9kZWwgdmFsaWRhdGlvbiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWFwPE9iamVjdCwgTGlzdDxDbGFzcz4+IHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBMaXN0PENsYXNzPj4oKTsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PigpOw0KLQ0KLSAgICAgICAgZm9yIChNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSA6IGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXNUb1ZhbGlkYXRlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbihtb2RlbFZhbGlkYXRpb25FbnRyeSwgcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMsIHJlc3VsdHMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvblJlc3VsdHMocmVzdWx0cyk7DQotDQotICAgICAgICBleGVjdXRlR2xvYmFsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzRm9yKHJlc3VsdHMpOw0KLQ0KLSAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgianNyMzAzIHZhbGlkYXRpb24gZmluaXNoZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXNUb1ZhbGlkYXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8T2JqZWN0LCBMaXN0PENsYXNzPj4gcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cykNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbjsNCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4+IHZpb2xhdGlvbnM7DQotICAgICAgICBDbGFzc1tdIGdyb3Vwc1RvVmFsaWRhdGU7DQotDQotICAgICAgICBmb3IgKE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0IDogbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0VmFsaWRhdGlvblRhcmdldHMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uID0gY3JlYXRlUHJvcGVydHlJbmZvcm1hdGlvbihtb2RlbFZhbGlkYXRpb25FbnRyeSwgdmFsaWRhdGlvblRhcmdldCk7DQotDQotICAgICAgICAgICAgaWYgKCFleGVjdXRlR2xvYmFsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCksIHZhbGlkYXRpb25UYXJnZXQsIHByb3BlcnR5SW5mb3JtYXRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmlzRGlzcGxheU1lc3NhZ2VJbmxpbmUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGdyb3Vwc1RvVmFsaWRhdGUgPSBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRHcm91cHMoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy9pZiB2aW9sYXRpb24gc2hvdWxkIGRpc3BsYXllZCBpbmxpbmUgdmFsaWRhdGlvbiBoYXMgdG8gdGFrZSBwbGFjZSB3aXRoIGFsbCBncm91cHMNCi0gICAgICAgICAgICAvL3doaWNoIG1lYW5zOiBnbG9iYWwgbWVzc2FnZXMgLT4gZmlsdGVyIGdyb3VwcyBhbHJlYWR5IHVzZWQgZm9yIHRoZSB2YWxpZGF0aW9uIHRhcmdldA0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGdyb3Vwc1RvVmFsaWRhdGUgPSBmaWx0ZXJHcm91cHNUb1ZhbGlkYXRlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0LCBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKCFzaG91bGRDb250aW51ZVZhbGlkYXRpb24obW9kZWxWYWxpZGF0aW9uRW50cnksIGdyb3Vwc1RvVmFsaWRhdGUpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGFkZFByb2Nlc3NlZFRhcmdldCh2YWxpZGF0aW9uVGFyZ2V0LCBncm91cHNUb1ZhbGlkYXRlLCBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cyk7DQotICAgICAgICAgICAgdmlvbGF0aW9ucyA9IHZhbGlkYXRlVGFyZ2V0KHZhbGlkYXRpb25UYXJnZXQsIGdyb3Vwc1RvVmFsaWRhdGUpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25zICE9IG51bGwgJiYgIXZpb2xhdGlvbnMuaXNFbXB0eSgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1Zpb2xhdGlvbnMoZmFjZXNDb250ZXh0LCBtb2RlbFZhbGlkYXRpb25FbnRyeSwgdmFsaWRhdGlvblRhcmdldCwgdmlvbGF0aW9ucywgcmVzdWx0cyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3NbXSBmaWx0ZXJHcm91cHNUb1ZhbGlkYXRlKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPE9iamVjdCwgTGlzdDxDbGFzcz4+IHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzKQ0KLSAgICB7DQotICAgICAgICBpZighcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMuY29udGFpbnNLZXkodmFsaWRhdGlvblRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldEdyb3VwcygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxDbGFzcz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IHZhbGlkYXRlZEdyb3VwcyA9IHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzLmdldCh2YWxpZGF0aW9uVGFyZ2V0KTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBncm91cCA6IG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldEdyb3VwcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCF2YWxpZGF0ZWRHcm91cHMuY29udGFpbnMoZ3JvdXApKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChncm91cCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBDbGFzc1tyZXN1bHQuc2l6ZSgpXSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZENvbnRpbnVlVmFsaWRhdGlvbihNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwgQ2xhc3NbXSBncm91cHNUb1ZhbGlkYXRlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIShncm91cHNUb1ZhbGlkYXRlID09IG51bGwgfHwgZ3JvdXBzVG9WYWxpZGF0ZS5sZW5ndGggPT0gMCkgfHwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuaXNEaXNwbGF5TWVzc2FnZUlubGluZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRQcm9jZXNzZWRUYXJnZXQoT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NbXSBncm91cHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPE9iamVjdCwgTGlzdDxDbGFzcz4+IHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzKQ0KLSAgICB7DQotICAgICAgICBpZighcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMuY29udGFpbnNLZXkodmFsaWRhdGlvblRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMucHV0KHZhbGlkYXRpb25UYXJnZXQsIG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxDbGFzcz4gdmFsaWRhdGVkR3JvdXBzID0gcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMuZ2V0KHZhbGlkYXRpb25UYXJnZXQpOw0KLQ0KLSAgICAgICAgZm9yKENsYXNzIGdyb3VwIDogZ3JvdXBzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCF2YWxpZGF0ZWRHcm91cHMuY29udGFpbnMoZ3JvdXApKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVkR3JvdXBzLmFkZChncm91cCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgUHJvcGVydHlJbmZvcm1hdGlvbiBjcmVhdGVQcm9wZXJ0eUluZm9ybWF0aW9uKA0KLSAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBPYmplY3QgdmFsaWRhdGlvblRhcmdldCkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uOw0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlsczsNCi0gICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsNCi0gICAgICAgIGlmIChtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzID0gbmV3IFByb3BlcnR5RGV0YWlscyhudWxsLCB2YWxpZGF0aW9uVGFyZ2V0LCBudWxsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uc2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBleGVjdXRlR2xvYmFsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmV4ZWN1dGVHbG9iYWxCZWZvcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uLCBCZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIEV4dFZhbFV0aWxzLmV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIHByb3BlcnR5SW5mb3JtYXRpb24sIEJlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4+IHZhbGlkYXRlVGFyZ2V0KE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LCBDbGFzc1tdIGdyb3VwcykNCi0gICAgew0KLSAgICAgICAgaWYoZ3JvdXBzID09IG51bGwgfHwgZ3JvdXBzLmxlbmd0aCA9PSAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdG9yRmFjdG9yeSgpLnVzaW5nQ29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5tZXNzYWdlSW50ZXJwb2xhdG9yKEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkpDQotICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0b3IoKQ0KLSAgICAgICAgICAgICAgICAudmFsaWRhdGUodmFsaWRhdGlvblRhcmdldCwgZ3JvdXBzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1Zpb2xhdGlvbnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxPYmplY3Q+PiB2aW9sYXRpb25zLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzKQ0KLSAgICB7DQotICAgICAgICAvL2pzZiAyLjAgaXMgYWJsZSB0byBkaXNwbGF5IG11bHRpcGxlIG1lc3NhZ2VzIHBlciBjb21wb25lbnQgLSBzbyBwcm9jZXNzIGFsbCB2aW9sYXRpb25zDQotICAgICAgICAvL2pzZiA8IDIuMCB3aWxsIGp1c3QgdXNlIHRoZSBmaXJzdCBvbmUgKGZvciBpbmxpbmUgbWVzc2FnZXMgLSBzbyBpdCdzIG9ubHkgYSBsaXR0bGUgb3ZlcmhlYWQpDQotICAgICAgICBJdGVyYXRvcjxDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4+IHZpb2xhdGlvbnNJdGVyYXRvciA9IHZpb2xhdGlvbnMuaXRlcmF0b3IoKTsNCi0gICAgICAgIENvbnN0cmFpbnRWaW9sYXRpb248T2JqZWN0PiBjb25zdHJhaW50VmlvbGF0aW9uOw0KLSAgICAgICAgTW9kZWxWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdDsNCi0gICAgICAgIHdoaWxlICh2aW9sYXRpb25zSXRlcmF0b3IuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvQ3JlYXRlTW9kZWxWYWxpZGF0aW9uUmVzdWx0KGZhY2VzQ29udGV4dCwgbW9kZWxWYWxpZGF0aW9uRW50cnksIHJlc3VsdHMpOw0KLQ0KLSAgICAgICAgICAgIHJlc3VsdCA9IHJlc29sdmVNb2RlbFZhbGlkYXRpb25SZXN1bHQoZmFjZXNDb250ZXh0LCBtb2RlbFZhbGlkYXRpb25FbnRyeSwgcmVzdWx0cyk7DQotDQotICAgICAgICAgICAgY29uc3RyYWludFZpb2xhdGlvbiA9IHZpb2xhdGlvbnNJdGVyYXRvci5uZXh0KCk7DQotICAgICAgICAgICAgYWRkVmlvbGF0aW9uTWVzc2FnZShtb2RlbFZhbGlkYXRpb25FbnRyeSwgdmFsaWRhdGlvblRhcmdldCwgY29uc3RyYWludFZpb2xhdGlvbiwgcmVzdWx0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9DcmVhdGVNb2RlbFZhbGlkYXRpb25SZXN1bHQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzKQ0KLSAgICB7DQotICAgICAgICBNb2RlbFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0Ow0KLSAgICAgICAgaWYgKCFpc01vZGVsVmFsaWRhdGlvblJlc3VsdEF2YWlsYWJsZUZvcihmYWNlc0NvbnRleHQsIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCByZXN1bHRzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBuZXcgTW9kZWxWYWxpZGF0aW9uUmVzdWx0KCk7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSwgcmVzdWx0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1vZGVsVmFsaWRhdGlvblJlc3VsdCByZXNvbHZlTW9kZWxWYWxpZGF0aW9uUmVzdWx0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcmVzdWx0cy5nZXQobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTW9kZWxWYWxpZGF0aW9uUmVzdWx0QXZhaWxhYmxlRm9yKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHMuY29udGFpbnNLZXkobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFZpb2xhdGlvbk1lc3NhZ2UoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4gY29uc3RyYWludFZpb2xhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgaWYgKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmlzRGlzcGxheU1lc3NhZ2VJbmxpbmUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQuYWRkRmFjZXNNZXNzYWdlSG9sZGVyKGNyZWF0ZUZhY2VzTWVzc2FnZUhvbGRlckZvckNvbnN0cmFpbnRWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50VmlvbGF0aW9uLCBtb2RlbFZhbGlkYXRpb25FbnRyeSwgdmFsaWRhdGlvblRhcmdldCwgdHJ1ZSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRGYWNlc01lc3NhZ2VIb2xkZXIoY3JlYXRlRmFjZXNNZXNzYWdlSG9sZGVyRm9yQ29uc3RyYWludFZpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb24sIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0LCBmYWxzZSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgRmFjZXNNZXNzYWdlSG9sZGVyIGNyZWF0ZUZhY2VzTWVzc2FnZUhvbGRlckZvckNvbnN0cmFpbnRWaW9sYXRpb24oZmluYWwgQ29uc3RyYWludFZpb2xhdGlvbiB2aW9sYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkaXNwbGF5QXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGZpbmFsIFN0cmluZyBuZXdWaW9sYXRpb25NZXNzYWdlID0gdHJ5VG9DaGFuZ2VWaW9sYXRpb25NZXNzYWdlKA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeSwgdmFsaWRhdGlvblRhcmdldCwgdmlvbGF0aW9uKTsNCi0NCi0gICAgICAgIENvbnN0cmFpbnRWaW9sYXRpb24gbmV3Q29uc3RyYWludFZpb2xhdGlvbiA9IG5ldyBDb25zdHJhaW50VmlvbGF0aW9uKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcml2YXRlIENvbnN0cmFpbnRWaW9sYXRpb24gd3JhcHBlZCA9IHZpb2xhdGlvbjsNCi0NCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ld1Zpb2xhdGlvbk1lc3NhZ2U7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZVRlbXBsYXRlKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldE1lc3NhZ2VUZW1wbGF0ZSgpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFJvb3RCZWFuKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJvb3RCZWFuKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBDbGFzcyBnZXRSb290QmVhbkNsYXNzKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJvb3RCZWFuQ2xhc3MoKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRMZWFmQmVhbigpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRMZWFmQmVhbigpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgUGF0aCBnZXRQcm9wZXJ0eVBhdGgoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UHJvcGVydHlQYXRoKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0SW52YWxpZFZhbHVlKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldEludmFsaWRWYWx1ZSgpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgQ29uc3RyYWludERlc2NyaXB0b3IgZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9Ow0KLQ0KLQ0KLSAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIGNsaWVudElkID0gbnVsbDsNCi0NCi0gICAgICAgIGlmIChkaXNwbGF5QXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgdWlDb21wb25lbnQgPSBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKTsNCi0gICAgICAgICAgICBjbGllbnRJZCA9IHVpQ29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc01lc3NhZ2VIb2xkZXIgcmVzdWx0ID0gbmV3IEZhY2VzTWVzc2FnZUhvbGRlcihCZWFuVmFsaWRhdGlvblV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVGYWNlc01lc3NhZ2VGb3JDb25zdHJhaW50VmlvbGF0aW9uKHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uVGFyZ2V0LCBuZXdDb25zdHJhaW50VmlvbGF0aW9uKSk7DQotICAgICAgICByZXN1bHQuc2V0Q2xpZW50SWQoY2xpZW50SWQpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb0NoYW5nZVZpb2xhdGlvbk1lc3NhZ2UoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cmFpbnRWaW9sYXRpb24gdmlvbGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzRGVmYXVsdE1lc3NhZ2UobW9kZWxWYWxpZGF0aW9uRW50cnkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZVZhbGlkYXRpb25FcnJvck1lc3NhZ2UoDQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDdXN0b21NZXNzYWdlKCksIHZhbGlkYXRpb25UYXJnZXQsIHZpb2xhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmlvbGF0aW9uLmdldE1lc3NhZ2UoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0TWVzc2FnZShNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIE1vZGVsVmFsaWRhdGlvbi5ERUZBVUxULmVxdWFscyhtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDdXN0b21NZXNzYWdlKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGludGVycG9sYXRlVmFsaWRhdGlvbkVycm9yTWVzc2FnZShTdHJpbmcgZXh0VmFsSW5saW5lTWVzc2FnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LCBmaW5hbCBDb25zdHJhaW50VmlvbGF0aW9uIHZpb2xhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkNCi0gICAgICAgICAgICAgICAgLmludGVycG9sYXRlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dFZhbElubGluZU1lc3NhZ2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1lc3NhZ2VJbnRlcnBvbGF0b3IuQ29udGV4dCgpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlvbGF0aW9uLmdldENvbnN0cmFpbnREZXNjcmlwdG9yKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWxpZGF0ZWRWYWx1ZSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uVGFyZ2V0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICApOw0KLSAgICB9DQotDQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkNCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb2RlbFZhbGlkYXRpb25SZXN1bHRzKE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cykNCi0gICAgew0KLSAgICAgICAgZm9yIChNb2RlbFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0IDogcmVzdWx0cy52YWx1ZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBCZWFuVmFsaWRhdGlvblV0aWxzLnByb2Nlc3NWaW9sYXRpb25NZXNzYWdlcyhyZXN1bHQuZ2V0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9yc0ZvcihNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBVSUNvbXBvbmVudCBjb21wb25lbnQ7DQotICAgICAgICBmb3IgKE1vZGVsVmFsaWRhdGlvblJlc3VsdCByZXN1bHQgOiByZXN1bHRzLnZhbHVlcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvciAoRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlciA6IHJlc3VsdC5nZXRGYWNlc01lc3NhZ2VIb2xkZXJMaXN0KCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgICAgICAgICBpZiAoZmFjZXNNZXNzYWdlSG9sZGVyLmdldENsaWVudElkKCkgIT0gbnVsbCAmJiAhZmFjZXNNZXNzYWdlSG9sZGVyLmdldENsaWVudElkKCkuZXF1YWxzKCIqIikpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmZpbmRDb21wb25lbnQoZmFjZXNNZXNzYWdlSG9sZGVyLmdldENsaWVudElkKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoZmFjZXNDb250ZXh0LCBjb21wb25lbnQsIG51bGwsIG51bGwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IHBoYXNlRXZlbnQpDQotICAgIHsNCi0gICAgICAgIC8vZG8gbm90aGluZw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5VUERBVEVfTU9ERUxfVkFMVUVTOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKHRoaXMgPT0gbykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25SZXN1bHQuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25SZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjMTk4Yi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vTW9kZWxWYWxpZGF0aW9uUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5GYWNlc01lc3NhZ2VIb2xkZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTE9XLCBkZXNjcmlwdGlvbiA9ICJyZWZhY3RvciIpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBNb2RlbFZhbGlkYXRpb25SZXN1bHQNCi17DQotICAgIHByaXZhdGUgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkRmFjZXNNZXNzYWdlSG9sZGVyKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmFjZXNNZXNzYWdlSG9sZGVyTGlzdC5hZGQoZmFjZXNNZXNzYWdlSG9sZGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vbWVzc2FnZS9pbnRlcnBvbGF0b3IvRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9tZXNzYWdlL2ludGVycG9sYXRvci9EZWZhdWx0TWVzc2FnZUludGVycG9sYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTkzMmYyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9tZXNzYWdlL2ludGVycG9sYXRvci9EZWZhdWx0TWVzc2FnZUludGVycG9sYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5tZXNzYWdlLmludGVycG9sYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uTWVzc2FnZUludGVycG9sYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IgaW1wbGVtZW50cyBNZXNzYWdlSW50ZXJwb2xhdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLSAgICANCi0gICAgcHJpdmF0ZSBNZXNzYWdlSW50ZXJwb2xhdG9yIHdyYXBwZWQ7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcihNZXNzYWdlSW50ZXJwb2xhdG9yIHdyYXBwZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBpbnRlcnBvbGF0ZShTdHJpbmcgbWVzc2FnZU9yS2V5LCBDb250ZXh0IGNvbnRleHQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShtZXNzYWdlT3JLZXksIGNvbnRleHQsIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgaW50ZXJwb2xhdGUoU3RyaW5nIG1lc3NhZ2VPcktleSwgQ29udGV4dCBjb250ZXh0LCBMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkLmludGVycG9sYXRlKG1lc3NhZ2VPcktleSwgY29udGV4dCwgZ2V0Q3VycmVudExvY2FsZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTG9jYWxlIGdldEN1cnJlbnRMb2NhbGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0V4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vbWVzc2FnZS9pbnRlcnBvbGF0b3IvRXh0VmFsTWVzc2FnZUludGVycG9sYXRvckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZlOWYzMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vbWVzc2FnZS9pbnRlcnBvbGF0b3IvRXh0VmFsTWVzc2FnZUludGVycG9sYXRvckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24ubWVzc2FnZS5pbnRlcnBvbGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsTWVzc2FnZUludGVycG9sYXRvckFkYXB0ZXIgZXh0ZW5kcyBEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcg0KLXsNCi0gICAgcHJpdmF0ZSBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOw0KLQ0KLSAgICBwdWJsaWMgRXh0VmFsTWVzc2FnZUludGVycG9sYXRvckFkYXB0ZXIoTWVzc2FnZUludGVycG9sYXRvciB3cmFwcGVkLCBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyKQ0KLSAgICB7DQotICAgICAgICBzdXBlcih3cmFwcGVkKTsNCi0gICAgICAgIHRoaXMubWVzc2FnZVJlc29sdmVyID0gbWVzc2FnZVJlc29sdmVyOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGludGVycG9sYXRlKFN0cmluZyBtZXNzYWdlT3JLZXksIENvbnRleHQgY29udGV4dCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGludGVycG9sYXRlKG1lc3NhZ2VPcktleSwgY29udGV4dCwgZ2V0Q3VycmVudExvY2FsZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBpbnRlcnBvbGF0ZShTdHJpbmcgbWVzc2FnZU9yS2V5LCBDb250ZXh0IGNvbnRleHQsIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMubWVzc2FnZVJlc29sdmVyICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoaXNCZWFuVmFsaWRhdGlvbk1lc3NhZ2VLZXlGb3JtYXQobWVzc2FnZU9yS2V5KSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFN0cmluZyBuZXdNZXNzYWdlT3JLZXkgPSB0aGlzLm1lc3NhZ2VSZXNvbHZlci5nZXRNZXNzYWdlKGV4dHJhY3RLZXkobWVzc2FnZU9yS2V5KSwgZ2V0Q3VycmVudExvY2FsZSgpKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYoaXNWYWxpZGVNZXNzYWdlKG5ld01lc3NhZ2VPcktleSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VPcktleSA9IG5ld01lc3NhZ2VPcktleTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgieW91IHRyaWVkIHRvIHVzZSBhbiBleHR2YWwgbWVzc2FnZS1yZXNvbHZlciBmb3IiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcjMwMyB2YWxpZGF0aW9uIHdpdGggYW4gaW52YWxpZCBrZXkgLT4gdXNpbmcgYSBkZWZhdWx0IGludGVycG9sYXRvciIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmludGVycG9sYXRlKG1lc3NhZ2VPcktleSwgY29udGV4dCwgZ2V0Q3VycmVudExvY2FsZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNCZWFuVmFsaWRhdGlvbk1lc3NhZ2VLZXlGb3JtYXQoU3RyaW5nIG1lc3NhZ2VPcktleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VPcktleS5zdGFydHNXaXRoKCJ7IikgJiYgbWVzc2FnZU9yS2V5LmVuZHNXaXRoKCJ9Iik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXh0cmFjdEtleShTdHJpbmcgbWVzc2FnZU9yS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWVzc2FnZU9yS2V5LnN1YnN0cmluZygxLCBtZXNzYWdlT3JLZXkubGVuZ3RoKCkgLSAxKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZGVNZXNzYWdlKFN0cmluZyBuZXdNZXNzYWdlT3JLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAhKG5ld01lc3NhZ2VPcktleS5zdGFydHNXaXRoKEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld01lc3NhZ2VPcktleS5lbmRzV2l0aChBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5NSVNTSU5HX1JFU09VUkNFX01BUktFUikpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRkZWVmNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmlydHVhbFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmlydHVhbFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJpdmF0ZSBDb25zdHJhaW50RGVzY3JpcHRvciBjb25zdHJhaW50RGVzY3JpcHRvcjsNCi0gICAgcHJpdmF0ZSBDbGFzcyBlbGVtZW50Q2xhc3M7IC8vcHJvcGVydHkgdHlwZQ0KLQ0KLSAgICBwdWJsaWMgQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5KENvbnN0cmFpbnREZXNjcmlwdG9yIGNvbnN0cmFpbnREZXNjcmlwdG9yLCBDbGFzcyBlbGVtZW50Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29uc3RyYWludERlc2NyaXB0b3IgPSBjb25zdHJhaW50RGVzY3JpcHRvcjsNCi0gICAgICAgIHRoaXMuZWxlbWVudENsYXNzID0gZWxlbWVudENsYXNzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDb25zdHJhaW50RGVzY3JpcHRvciBnZXRDb25zdHJhaW50RGVzY3JpcHRvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb25zdHJhaW50RGVzY3JpcHRvcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0RWxlbWVudENsYXNzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVsZW1lbnRDbGFzczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RyYWludERlc2NyaXB0b3IuZ2V0QW5ub3RhdGlvbigpLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZjMyNWQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBWYWxpZGF0aW9uLU1vZHVsZXM8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvdmFsaWRhdGlvbi1tb2R1bGVzPC9jb25uZWN0aW9uPg0KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL3ZhbGlkYXRpb24tbW9kdWxlczwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4NCi0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL3ZhbGlkYXRpb24tbW9kdWxlczwvdXJsPg0KLSAgICA8L3NjbT4NCi0NCi0gICAgPG1vZHVsZXM+DQotICAgICAgICA8bW9kdWxlPnByb3BlcnR5LXZhbGlkYXRpb248L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+YmVhbi12YWxpZGF0aW9uPC9tb2R1bGU+DQotICAgIDwvbW9kdWxlcz4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9wb20ueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YjkyYmMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFByb3BlcnR5LVZhbGlkYXRpb24tTW9kdWxlPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnBlcnNpc3RlbmNlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnBlcnNpc3RlbmNlLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIA0KLSAgICAgICAgPCEtLSBUZXN0IGRlcGVuZGVuY2llcyAtLT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuNTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0LmpzcDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3AtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnNoYWxlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNoYWxlLXRlc3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjQ8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgICAgIDxleGNsdXNpb25zPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5teWZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCi0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxyZXNvdXJjZXM+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgIDwvcmVzb3VyY2VzPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQuMjwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovQWJzdHJhY3QqLmphdmE8L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovVGVzdFV0aWxzLmphdmE8L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKkJlYW4uamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+DQotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4gICAgICAgICAgICANCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTZiZWVjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiDQotICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjIiPg0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Mzc4NWQ2Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50Ci0gICAgICAgIC5BYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlUmVxdWlyZWRBdHRyaWJ1dGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYoKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKSkgfHwKLSAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSkKLSAgICAgICAgICAgICYmCi0gICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGlzQ29tcG9uZW50UmVxdWlyZWQodWlDb21wb25lbnQpKSkKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJgotICAgICAgICAgICAgICAgIUJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Kb2luVmFsaWRhdGlvbk1ldGFEYXRhU3RvcmFnZUZpbHRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0pvaW5WYWxpZGF0aW9uTWV0YURhdGFTdG9yYWdlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMTIzY2QuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0pvaW5WYWxpZGF0aW9uTWV0YURhdGFTdG9yYWdlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NZXRhRGF0YVN0b3JhZ2VGaWx0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogRVhUVkFMLTU5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKb2luVmFsaWRhdGlvbk1ldGFEYXRhU3RvcmFnZUZpbHRlciBpbXBsZW1lbnRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRJQ19TRVBBUkFUT1IgPSAiOiI7DQotDQotICAgIHB1YmxpYyB2b2lkIGZpbHRlcihQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChwcm9wZXJ0eUluZm9ybWF0aW9uICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgTGlzdDxNZXRhRGF0YUVudHJ5PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE1ldGFEYXRhRW50cnk+KCk7DQotDQotICAgICAgICAgICAgcmVzb2x2ZUpvaW5WYWxpZGF0aW9uTWV0YURhdGEocHJvcGVydHlJbmZvcm1hdGlvbiwgcmVzdWx0KTsNCi0NCi0gICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnJlc2V0TWV0YURhdGFFbnRyaWVzKCk7DQotDQotICAgICAgICAgICAgc2V0RGVmYXVsdFByb3BlcnR5RGV0YWlscyhwcm9wZXJ0eUluZm9ybWF0aW9uLCByZXN1bHQpOw0KLQ0KLSAgICAgICAgICAgIGlmIChjb250YWluc0pvaW5WYWxpZGF0aW9uQ29uc3RyYWludChyZXN1bHQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmlsdGVyKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVzb2x2ZUpvaW5WYWxpZGF0aW9uTWV0YURhdGEoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uLCBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkgOiBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodHJ5VG9UcmFuc2Zvcm1FbnRyeShtZXRhRGF0YUVudHJ5KSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRQcm9wZXJ0eURldGFpbHMoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uLCBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkgOiByZXN1bHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5zZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLA0KLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5nZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTKSk7DQotICAgICAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5hZGRNZXRhRGF0YUVudHJ5KG1ldGFEYXRhRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc0pvaW5WYWxpZGF0aW9uQ29uc3RyYWludChMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogcmVzdWx0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgSm9pblZhbGlkYXRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhRW50cnk+IHRyeVRvVHJhbnNmb3JtRW50cnkoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFbnRyeT4oKTsNCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBKb2luVmFsaWRhdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBKb2luVmFsaWRhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShKb2luVmFsaWRhdGlvbi5jbGFzcyk7DQotDQotICAgICAgICAgICAgcmVwbGFjZU1ldGFEYXRhKGFubm90YXRpb24sIG1ldGFEYXRhRW50cnksIHJlc3VsdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmFkZChtZXRhRGF0YUVudHJ5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VNZXRhRGF0YShKb2luVmFsaWRhdGlvbiBhbm5vdGF0aW9uLCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIExpc3Q8TWV0YURhdGFFbnRyeT4gcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBmb3IgKFN0cmluZyB0YXJnZXQgOiBhbm5vdGF0aW9uLnZhbHVlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9SZXBsYWNlTWV0YURhdGFPZlRhcmdldCh0YXJnZXQsIG1ldGFEYXRhRW50cnksIHJlc3VsdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvUmVwbGFjZU1ldGFEYXRhT2ZUYXJnZXQoU3RyaW5nIHRhcmdldCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGlzU3RhdGljU3ludGF4KHRhcmdldCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNZXRhRGF0YShyZXN1bHQsIGV4dHJhY3RTdGF0aWNNZXRhRGF0YSh0YXJnZXQpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWV0YURhdGEocmVzdWx0LCBleHRyYWN0RHluYW1pY01ldGFEYXRhKG1ldGFEYXRhRW50cnksIHRhcmdldCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgYSBkaWZmZXJlbnQgZmlsdGVyIG1pZ2h0IGludHJvZHVjZSBhIG5ldyBzeW50YXggd2hpY2ggY2F1c2VzIHRoZSBleGNlcHRpb24NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkTWV0YURhdGEoTGlzdDxNZXRhRGF0YUVudHJ5PiByZXN1bHQsIE1ldGFEYXRhRW50cnlbXSBtZXRhRGF0YUVudHJpZXMpDQotICAgIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLmFkZEFsbChyZXN1bHQsIG1ldGFEYXRhRW50cmllcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3RhdGljU3ludGF4KFN0cmluZyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQuY29udGFpbnMoU1RBVElDX1NFUEFSQVRPUik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YUVudHJ5W10gZXh0cmFjdFN0YXRpY01ldGFEYXRhKFN0cmluZyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIGludCBzZXBhcmF0b3JJbmRleCA9IHRhcmdldC5sYXN0SW5kZXhPZihTVEFUSUNfU0VQQVJBVE9SKTsNCi0NCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gbG9hZENsYXNzKHRhcmdldC5zdWJzdHJpbmcoMCwgc2VwYXJhdG9ySW5kZXgpKTsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0YXJnZXQuc3Vic3RyaW5nKHNlcGFyYXRvckluZGV4ICsgMSk7DQotDQotICAgICAgICByZXR1cm4gbmV3IFN0YXRpY1N5bnRheE1ldGFEYXRhRXh0cmFjdG9yKCkuZXh0cmFjdCh0YXJnZXRDbGFzcywgcHJvcGVydHlOYW1lKS5nZXRNZXRhRGF0YUVudHJpZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3NVdGlscy5sb2FkQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YUVudHJ5W10gZXh0cmFjdER5bmFtaWNNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFN0cmluZyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscy5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0KTsNCi0NCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCkpOw0KLSAgICAgICAgcmV0dXJuIG5ldyBTdGF0aWNTeW50YXhNZXRhRGF0YUV4dHJhY3RvcigpLmV4dHJhY3QoDQotICAgICAgICAgICAgICAgIHRhcmdldENsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSkuZ2V0TWV0YURhdGFFbnRyaWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBjbGFzcyBTdGF0aWNTeW50YXhNZXRhRGF0YUV4dHJhY3RvciBleHRlbmRzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgICAgICB7DQotICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKCk7DQotDQotICAgICAgICAgICAgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyh0YXJnZXRDbGFzcywgdGFyZ2V0UHJvcGVydHksIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgICAgIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnModGFyZ2V0Q2xhc3MsIHRhcmdldFByb3BlcnR5LCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopDQotICAgIHsNCi0gICAgICAgIHJldHVybiBvYmogIT0gbnVsbCAmJiBnZXRDbGFzcygpLmVxdWFscyhvYmouZ2V0Q2xhc3MoKSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwY2RlMC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0R3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotLyoqDQotICogbmFtZSBtYXBwZXIgZm9yIGdyb3VwIGltcGxlbWVudGF0aW9ucyB2aWEgdmFsaWRhdGlvbiBwYXJhbWV0ZXJzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoVmFsaWRhdGlvblBhcmFtZXRlci5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdEdyb3VwU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI3NDg0My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuVmFsaWRhdGlvbk1vZHVsZUtleTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVmFsaWRhdGlvbk1vZHVsZUtleQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5DQotew0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MDczNDIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VySG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkdyb3VwU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NZXRhRGF0YVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnJlY29yZGVyLkNyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkRlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLm1hcHBlci5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UubWFwcGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yNDc0MzYxNjEyODU3MjIyMjgzTDsNCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIGluaXRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycygpOw0KLSAgICAgICAgaW5pdFN0YXRpY1N0cmF0ZWd5TWFwcGluZ3MoKTsNCi0gICAgICAgIGluaXREZWZhdWx0Q29tcG9uZW50SW5pdGlhbGl6ZXIoKTsNCi0gICAgICAgIGFkZFNraXBWYWxpZGF0aW9uU3VwcG9ydCgpOw0KLSAgICAgICAgaW5pdFN0b3JhZ2VNYW5hZ2VyQW5kTmFtZU1hcHBlcnMoKTsNCi0gICAgICAgIGluaXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcigpOw0KLSAgICAgICAgaW5pdE1ldGFEYXRhU3RvcmFnZUZpbHRlcnMoKTsNCi0gICAgICAgIGluaXRQaGFzZUxpc3RlbmVycygpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKG5ldyBDcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFN0YXRpY1N0cmF0ZWd5TWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcganBhQmFzZWRWYWxpZGF0aW9uID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfSlBBX0JBU0VEX1ZBTElEQVRJT047DQotICAgICAgICBpZiAoanBhQmFzZWRWYWxpZGF0aW9uID09IG51bGwNCi0gICAgICAgICAgICAgICAgfHwgIWpwYUJhc2VkVmFsaWRhdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnID0gbmV3IFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgICAgIHN0YXRpY0NvbmZpZy5zZXRTb3VyY2VPZk1hcHBpbmcoDQotICAgICAgICAgICAgICAgIEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsiLmpwYV9zdHJhdGVneV9tYXBwaW5ncyIpOw0KLQ0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsIHN0YXRpY0NvbmZpZyk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXREZWZhdWx0Q29tcG9uZW50SW5pdGlhbGl6ZXIoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFNraXBWYWxpZGF0aW9uU3VwcG9ydCgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmluZm8oImFkZGluZyBzdXBwb3J0IGZvciBAU2tpcFZhbGlkYXRpb24iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmRlbnlSZW5kZXJlckludGVyY2VwdG9yKFZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcyk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsNCi0NCi0gICAgICAgIFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAvL2l0J3MganVzdCByZXF1aXJlZCB0byBzZXQgdGhlIHRhcmdldA0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTiwgU2tpcFZhbGlkYXRpb25TdXBwb3J0LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuU0tJUF9WQUxJREFUSU9OX1NVUFBPUlRfQ09ORklHLCBjb25maWcpOw0KLQ0KLSAgICAgICAgLy9jb25maWcuYWRkTWFwcGluZyhDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCBSZXF1aXJlZFN0cmF0ZWd5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdG9yYWdlTWFuYWdlckFuZE5hbWVNYXBwZXJzKCkNCi0gICAgew0KLSAgICAgICAgU3RvcmFnZU1hbmFnZXJIb2xkZXIgc3RvcmFnZU1hbmFnZXJIb2xkZXIgPQ0KLSAgICAgICAgICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlksIFN0b3JhZ2VNYW5hZ2VySG9sZGVyLmNsYXNzKSk7DQotDQotICAgICAgICAvL3Byb2Nlc3NlZC1pbmZvcm1hdGlvbg0KLSAgICAgICAgRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIgcHJvY2Vzc2VkSW5mb1N0b3JhZ2VNYW5hZ2VyID0NCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyKCk7DQotICAgICAgICBwcm9jZXNzZWRJbmZvU3RvcmFnZU1hbmFnZXIucmVnaXN0ZXIobmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBzdG9yYWdlTWFuYWdlckhvbGRlci5zZXRTdG9yYWdlTWFuYWdlcihQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MsIHByb2Nlc3NlZEluZm9TdG9yYWdlTWFuYWdlciwgZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9jcm9zcy12YWxpZGF0aW9uDQotICAgICAgICBEZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgPQ0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyKCk7DQotICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5yZWdpc3RlcihuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBzdG9yYWdlTWFuYWdlckhvbGRlci5zZXRTdG9yYWdlTWFuYWdlcihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlciwgZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ncm91cC12YWxpZGF0aW9uIGxpZ2h0DQotICAgICAgICBTdG9yYWdlTWFuYWdlciBzdG9yYWdlTWFuYWdlciA9IHN0b3JhZ2VNYW5hZ2VySG9sZGVyLmdldFN0b3JhZ2VNYW5hZ2VyKEdyb3VwU3RvcmFnZS5jbGFzcyk7DQotDQotICAgICAgICBpZihzdG9yYWdlTWFuYWdlciBpbnN0YW5jZW9mIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAoKEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxTdHJpbmc+KXN0b3JhZ2VNYW5hZ2VyKQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBQcm9wZXJ0eVZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5zZXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcihuZXcgUHJvcGVydHlWYWxpZGF0aW9uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TWV0YURhdGFTdG9yYWdlRmlsdGVycygpDQotICAgIHsNCi0gICAgICAgICBNZXRhRGF0YVN0b3JhZ2UgbWV0YURhdGFTdG9yYWdlID0gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZSgNCi0gICAgICAgICAgICAgICAgIE1ldGFEYXRhU3RvcmFnZS5jbGFzcywgTWV0YURhdGFTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBtZXRhRGF0YVN0b3JhZ2UucmVnaXN0ZXJGaWx0ZXIobmV3IEpvaW5WYWxpZGF0aW9uTWV0YURhdGFTdG9yYWdlRmlsdGVyKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0UGhhc2VMaXN0ZW5lcnMoKQ0KLSAgICB7DQotICAgICAgICBKc2ZVdGlscy5yZWdpc3RlclBoYXNlTGlzdGVuZXIobmV3IENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWZhMjQ3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci0KLS8qKgotICogdGhlIHNraXAgdmFsaWRhdGlvbiBzdXBwb3J0IHdhcyByZWZhY3RvcmVkIHRvIGFuIGluZGVwZW5kZW50IG1lY2hhbmlzbQotICogc2VlIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJjaGFuZ2UgdGhlIGFkZC1vbnMiICsKLSAgICAgICAgIm9sZCBuYW1lOiBWYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0IikKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0TW9kdWxlS2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3M7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvblNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YTZhZGMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvblNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3BlcnR5VmFsaWRhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIHgueC4zCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0aW9uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IgaW1wbGVtZW50cyBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcgotewotICAgIHB1YmxpYyBib29sZWFuIHNraXBWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpCi0gICAgewotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgaWYoSnNmVXRpbHMuaXNSZW5kZXJSZXNwb25zZVBoYXNlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9ICFpc0NsaWVudFNpZGVWYWxpZGF0aW9uRW5hYmxlZChtZXRhRGF0YUVudHJ5KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0IHx8IFByb3BlcnR5VmFsaWRhdGlvblV0aWxzLmlzVmFsaWRhdGlvblNraXBwZWQoZmFjZXNDb250ZXh0LCB2YWxpZGF0aW9uU3RyYXRlZ3ksIG1ldGFEYXRhRW50cnkpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xpZW50U2lkZVZhbGlkYXRpb25FbmFibGVkKE1ldGFEYXRhRW50cnkgZW50cnkpCi0gICAgewotICAgICAgICBMaXN0PFN0cmluZz4ga2V5c1RvRGlzYWJsZSA9IGVudHJ5LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25NZXRhRGF0YUtleXMuRElTQUJMRV9DTElFTlRfU0lERV9WQUxJREFUSU9OLCBMaXN0LmNsYXNzKTsKLQotICAgICAgICByZXR1cm4ga2V5c1RvRGlzYWJsZSA9PSBudWxsIHx8ICFrZXlzVG9EaXNhYmxlLmNvbnRhaW5zKGVudHJ5LmdldEtleSgpKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc3N2E0ZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRvY3VtZW50YXRpb24iKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NRVNTQUdFU19KUEEgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJKUEFfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFUyIpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfSlBBX0JBU0VEX1ZBTElEQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OIik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vRG91YmxlUmFuZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vRG91YmxlUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I0ZTAyZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0RvdWJsZVJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgRG91YmxlUmFuZ2UNCi17DQotICAgIGRvdWJsZSBtaW5pbXVtKCkgZGVmYXVsdCBEb3VibGUuTUlOX1ZBTFVFOw0KLQ0KLSAgICBkb3VibGUgbWF4aW11bSgpIGRlZmF1bHQgRG91YmxlLk1BWF9WQUxVRTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vSm9pblZhbGlkYXRpb24uamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vSm9pblZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM5YTg5OS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBKb2luVmFsaWRhdGlvbg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTGVuZ3RoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNDM3ZDEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBMZW5ndGgNCi17DQotICAgIGludCBtaW5pbXVtKCkgZGVmYXVsdCAwOw0KLQ0KLSAgICBpbnQgbWF4aW11bSgpIGRlZmF1bHQgSW50ZWdlci5NQVhfVkFMVUU7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Mb25nUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyNTFlZi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIExvbmdSYW5nZQ0KLXsNCi0gICAgbG9uZyBtaW5pbXVtKCkgZGVmYXVsdCBMb25nLk1JTl9WQUxVRTsNCi0NCi0gICAgbG9uZyBtYXhpbXVtKCkgZGVmYXVsdCBMb25nLk1BWF9WQUxVRTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUGF0dGVybi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NzVkODkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUGF0dGVybg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgIm5vX21hdGNoIjsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUmVxdWlyZWQuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUmVxdWlyZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFjZTEyOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUmVxdWlyZWQNCi17DQotICAgIC8qKg0KLSAgICAgKiB0byBjdXN0b21pemUgdGhlIGVycm9yIG1lc3NhZ2Ugb3INCi0gICAgICogdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQganNmIHJlcXVpcmVkIG1lc3NhZ2Ugd2l0aCB0aGUgdXNhZ2Ugb2YgdGhlIG1lc3NhZ2UgcmVzb2x2ZXIgbWVjaGFuaXNtDQotICAgICAqDQotICAgICAqIEByZXR1cm4gYW4gb3B0aW9uYWwgZXJyb3IgbWVzc2FnZSBrZXkNCi0gICAgICovDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJmaWVsZF9yZXF1aXJlZCI7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYzUyOWIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgU2tpcFZhbGlkYXRpb24NCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IHt9Ow0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uU3VwcG9ydC5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEwNzYyMS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVGFyZ2V0KFRZUEUpCi1AUmV0ZW50aW9uKFJVTlRJTUUpCi1ARG9jdW1lbnRlZAotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgQGludGVyZmFjZSBTa2lwVmFsaWRhdGlvblN1cHBvcnQKLXsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1ZhbGlkYXRvci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzOGFjYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFZhbGlkYXRvcg0KLXsNCi0gICAgQ2xhc3M8PyBleHRlbmRzIGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I+W10gdmFsdWUoKTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEwZWViYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ARGVwcmVjYXRlZAotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yIGV4dGVuZHMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yCi17Ci0gICAgcHJpdmF0ZSBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBnZXRJbnN0YW5jZSgpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvckZvcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvcigpLCBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkKLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsKLQotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBQcm9wZXJ0eURldGFpbHMpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG9iamVjdC5nZXRDbGFzcygpICsgIiBpcyBub3QgYSAiICsgUHJvcGVydHlEZXRhaWxzLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gKFByb3BlcnR5RGV0YWlscylvYmplY3Q7Ci0KLSAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKSk7Ci0KLSAgICAgICAgLy9UT0RPIHRlc3Qgd2l0aCBjb21wbGV4IGNvbXBvbmVudHMKLSAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5zZXRJbmZvcm1hdGlvbigKLSAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIHByb3BlcnR5RGV0YWlscyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZmluZCBhbmQgYWRkIGFubm90YXRpb25zCi0gICAgICAgICAqLwotICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTgwMTIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPVRoZSByZXF1aXJlZCBmb3JtYXRlIGlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YWI1NDMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPVx1MDYyN1x1MDY0NFx1MDYzNVx1MDY0YVx1MDYzYVx1MDYyOSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2MjZcdTA2MjkNCi1ub19tYXRjaF9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjM1XHUwNjRhXHUwNjNhXHUwNjI5IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzN1x1MDY0NFx1MDY0OFx1MDYyOFx1MDYyOSBcdTA2NDdcdTA2NDk6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThkNjQ5MC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW5vX21hdGNoPUZvcm1hdCBpbnZcdTAwZTBsaWQKLW5vX21hdGNoX2RldGFpbD1FbCBmb3JtYXQgcmVxdWVyaXQgXHUwMGU5czogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWU3MDFiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1Vbmf8bHRpZ2VzIEZvcm1hdA0KLW5vX21hdGNoX2RldGFpbD1EYXMgZXJmb3JkZXJsaWNoZSBGb3JtYXQgaXN0OiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTgwMTIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPVRoZSByZXF1aXJlZCBmb3JtYXRlIGlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYjEwNzcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXRvIGludlx1MDBlMWxpZG8gCi1ub19tYXRjaF9kZXRhaWw9RWwgZm9ybWF0byByZXF1ZXJpZG8gZXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwYTIyMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9TGUgZm9ybWF0IGVzdCBpbnZhbGlkZQ0KLW5vX21hdGNoX2RldGFpbD1MZSBmb3JtYXQgZG9pdCAmZWNpcmM7dHJlIGRlIGxhIGZvcm1lOiB7MH0NCi0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxODc0OGMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXRvIG5vbiB2YWxpZG8KLW5vX21hdGNoX2RldGFpbD1JbCBmb3JtYXRvIHJpY2hpZXN0byAmZWdyYXZlOzogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTRiYzc0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1HZVx1MDBlN2Vyc2l6IGJpXHUwMGU3aW0NCi1ub19tYXRjaF9kZXRhaWw9Z2VyZWtlbiBiaVx1MDBlN2ltOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWFlNjRiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgICAgIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZU5hbWUgPSBudWxsOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VOYW1lID0gc3VwZXIuZ2V0QmFzZU5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBiYXNlTmFtZTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9KcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ3NmFkOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIHRoZSBqcGEgc3VwcG9ydCBpcyBhbiBleGNlcHRpb24gaW4gdmlldyBvZiBzb21lIG1lY2hhbmlzbXMgLSBzbyB0aGVyZSdzIG5vIGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZS4NCi0gKiBpbnN0ZWFkIG9mIHRoZSBjb252ZW50aW9uIHRoZXJlIGlzIGEgZ2xvYmFsIHByb3BlcnR5IHRvIGhhdmUgYW4gYWx0ZXJuYXRpdmUgdG8gd2ViLnhtbCBjb25maWd1cmF0aW9uDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTID0gIkpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTIjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX05BTUUgPSBXZWJYbWxQYXJhbWV0ZXIuVkFMSURBVElPTl9NRVNTQUdFU19KUEE7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX05BTUUgPSBKcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MNCi0gICAgICAgICAgICAuZ2V0UGFja2FnZSgpLmdldE5hbWUoKS5yZXBsYWNlKCIubWVzc2FnZS5yZXNvbHZlciIsICIubWVzc2FnZS5idW5kbGUiKSsgIi5qcGFfbWVzc2FnZXMiOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYoQ1VTVE9NX0JBU0VfTkFNRSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBDVVNUT01fQkFTRV9OQU1FOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQkFTRV9OQU1FOw0KLSAgICB9DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0Fic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0Fic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1Y2Q0NC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9BYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGlmIChpc0Jsb2NraW5nTWV0YURhdGEobWV0YURhdGEpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1NZXRhRGF0YShtZXRhRGF0YSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhKTsNCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNCbG9ja2luZ01ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIHRlc3RNZXNzYWdlID0gbmV3IEZhY2VzTWVzc2FnZSgpOw0KLSAgICAgICAgdGVzdE1lc3NhZ2Uuc2V0U2V2ZXJpdHkoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSA9IHRyeVRvVHJhbnNmb3JtVmlvbGF0aW9uU2V2ZXJpdHkobWV0YURhdGFFbnRyeSk7DQotDQotICAgICAgICBpZihzZXZlcml0eSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRlc3RNZXNzYWdlLnNldFNldmVyaXR5KHNldmVyaXR5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5zZXZlcml0eUJsb2Nrc1N1Ym1pdEZvckNvbXBvbmVudElkKG51bGwsIHRlc3RNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEZhY2VzTWVzc2FnZS5TZXZlcml0eSB0cnlUb1RyYW5zZm9ybVZpb2xhdGlvblNldmVyaXR5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2UuU2V2ZXJpdHk+IHJlc3VsdCA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKQ0KLSAgICAgICAgICAgICAgICAuZXh0cmFjdChtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihWaW9sYXRpb25TZXZlcml0eS5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5LmNsYXNzKTsNCi0NCi0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiAhcmVzdWx0LmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Lml0ZXJhdG9yKCkubmV4dCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Eb3VibGVSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlOWU0ZS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Eb3VibGVSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkRvdWJsZVJhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uUGFyYW1ldGVyQXdhcmVUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIERvdWJsZVJhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKERvdWJsZVJhbmdlLmNsYXNzKTsNCi0NCi0gICAgICAgIGRvdWJsZSBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW5pbXVtKCk7DQotDQotICAgICAgICBpZihtaW5pbXVtICE9IERvdWJsZS5NSU5fVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTiwgbWluaW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxULCBtaW5pbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGRvdWJsZSBtYXhpbXVtID0gYW5ub3RhdGlvbi5tYXhpbXVtKCk7DQotDQotICAgICAgICBpZihtYXhpbXVtICE9IERvdWJsZS5NQVhfVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCwgbWF4aW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWF9ERUZBVUxULCBtYXhpbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pvaW5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjM1MzI0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pvaW5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uZXh0cmFjdG9yLkRlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJvcGVydHlWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLUBEZXByZWNhdGVkDQotcHVibGljIGNsYXNzIEpvaW5NZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnQobWV0YURhdGFFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybigidGhpcyBjbGFzcyBpcyByZXBsYWNlZCBieSBhIG1ldGEtZGF0YSBzdG9yYWdlIGZpbHRlci4gIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgImlmIGl0IGdldHMgaW52b2tlZCBhbmQgYW4gZXhjZXB0aW9uIG9jY3VycywgYSBjdXN0b20gc3ludGF4IGlzIHVzZWQuIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgY2xhc3MgbWlnaHQgYmUgdXNlZCBieSBhbiBvbGQgYWRkLW9uLiBwbGVhc2UgY2hlY2sgZm9yIGEgbmV3ZXIgdmVyc2lvbi4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnQoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBleHRyYWN0b3IgPSBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmdldEluc3RhbmNlKCk7DQotDQotICAgICAgICBTdHJpbmdbXSB0YXJnZXRFeHByZXNzaW9ucyA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoSm9pblZhbGlkYXRpb24uY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdGFyZ2V0RXhwcmVzc2lvbiA6IHRhcmdldEV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogZXh0cmFjdG9yLmV4dHJhY3QoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscykuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSA9PSBudWxsIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZGF0aW9uU2tpcHBlZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3ksIGVudHJ5KSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IEV4dFZhbFV0aWxzLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoIShlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQW5ub3RhdGlvbiAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXh0cmFjdChlbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXRlcmF0b3IoKS5oYXNOZXh0KCkpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0QWxsKG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZTEwMTEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQmFzaWM7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpwYU1ldGFEYXRhVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiaW1wbC4gdGhlIHJlc3QiKQ0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmKGFubm90YXRpb24gaW5zdGFuY2VvZiBDb2x1bW4pDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoKCEoKENvbHVtbikgYW5ub3RhdGlvbikubnVsbGFibGUoKSkgJiYgRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RILCAoKENvbHVtbikgYW5ub3RhdGlvbikubGVuZ3RoKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihhbm5vdGF0aW9uIGluc3RhbmNlb2YgQmFzaWMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoISgoQmFzaWMpIGFubm90YXRpb24pLm9wdGlvbmFsKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIElkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotICAgICAgICAvL1RPRE8gaW1wbC4gdGhlIHJlc3QhISENCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM5MWY5YS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9MZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXINCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBMZW5ndGggYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTGVuZ3RoLmNsYXNzKTsNCi0NCi0gICAgICAgIGludCBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW5pbXVtKCk7DQotDQotICAgICAgICBpZihtaW5pbXVtICE9IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEgsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIX0RFRkFVTFQsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW50IG1heGltdW0gPSBhbm5vdGF0aW9uLm1heGltdW0oKTsNCi0gICAgICAgIGlmKG1heGltdW0gIT0gSW50ZWdlci5NQVhfVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIX0RFRkFVTFQsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGEzMzJiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxvbmdSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTG9uZ1JhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKExvbmdSYW5nZS5jbGFzcyk7DQotDQotICAgICAgICBsb25nIG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gIT0gTG9uZy5NSU5fVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTiwgbWluaW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxULCBtaW5pbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGxvbmcgbWF4aW11bSA9IGFubm90YXRpb24ubWF4aW11bSgpOw0KLQ0KLSAgICAgICAgaWYobWF4aW11bSAhPSBMb25nLk1BWF9WQUxVRSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYLCBtYXhpbXVtKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1BhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMGJlNjUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQYXR0ZXJuTWV0YURhdGFUcmFuc2Zvcm1lciAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgUGF0dGVybiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShQYXR0ZXJuLmNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4sIChhbm5vdGF0aW9uKS52YWx1ZSgpKTsNCi0NCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkgPSAoYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgICAgICBMb2NhbGUgY3VycmVudExvY2FsZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpOw0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSA9DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7DQotDQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnID0gRXh0VmFsVXRpbHMuZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAuZ2V0TWVzc2FnZSh2YWxpZGF0aW9uRXJyb3JNc2dLZXksIGN1cnJlbnRMb2NhbGUpOw0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFLCB2YWxpZGF0aW9uRXJyb3JNc2cpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9SZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJiZWNjOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9SZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uUGFyYW1ldGVyQXdhcmVUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NraXBNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ta2lwTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGM2NGFiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NraXBNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFNraXBNZXRhRGF0YVRyYW5zZm9ybWVyICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXINCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCB0cnVlKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1ZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1ZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQwNWFiMC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lciAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgVmFsaWRhdG9yIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFZhbGlkYXRvci5jbGFzcyk7DQotDQotICAgICAgICBDbGFzc1tdIHZhbGlkYXRvcnMgPSBhbm5vdGF0aW9uLnZhbHVlKCk7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBjdXJyZW50Q2xhc3MgOiB2YWxpZGF0b3JzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRDbGFzcy5nZXRTaW1wbGVOYW1lKCkudG9Mb3dlckNhc2UoKS5jb250YWlucyhDb21tb25NZXRhRGF0YUtleXMuRU1BSUwpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsdWUuYWRkKENvbW1vbk1ldGFEYXRhS2V5cy5FTUFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZhbHVlLmFkZChjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00sIHZhbHVlKTsNCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3NTkzMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkRvdWJsZVJhbmdlVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEb3VibGVSYW5nZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIERvdWJsZVJhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKERvdWJsZVJhbmdlLmNsYXNzKTsNCi0gICAgICAgIERvdWJsZVJhbmdlVmFsaWRhdG9yIGRvdWJsZVJhbmdlVmFsaWRhdG9yID0gKERvdWJsZVJhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5Eb3VibGVSYW5nZSIpOw0KLQ0KLSAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSm9pblZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSm9pblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGRhMWFjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Kb2luVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5leHRyYWN0b3IuRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWNlc0V4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLUBEZXByZWNhdGVkDQotcHVibGljIGNsYXNzIEpvaW5WYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZUpvaW5WYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRmFjZXNFeGNlcHRpb24gdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyB0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oInRoaXMgY2xhc3MgaXMgcmVwbGFjZWQgYnkgYSBtZXRhLWRhdGEgc3RvcmFnZSBmaWx0ZXIuICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJpZiBpdCBnZXRzIGludm9rZWQgYW5kIGFuIGV4Y2VwdGlvbiBvY2N1cnMsIGEgY3VzdG9tIHN5bnRheCBpcyB1c2VkLiIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIGNsYXNzIG1pZ2h0IGJlIHVzZWQgYnkgYW4gb2xkIGFkZC1vbi4gcGxlYXNlIGNoZWNrIGZvciBhIG5ld2VyIHZlcnNpb24uIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUpvaW5WYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIGV4dHJhY3RvciA9IERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuZ2V0SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIFN0cmluZ1tdIHRhcmdldEV4cHJlc3Npb25zID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShKb2luVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdGFyZ2V0RXhwcmVzc2lvbiA6IHRhcmdldEV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogZXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCBwcm9wZXJ0eURldGFpbHMpLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLnByb2Nlc3NNZXRhRGF0YUVudHJ5QWZ0ZXJTa2lwVmFsaWRhdGlvbihQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKSwgZW50cnkpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyB2YWxpZGF0aW9uIHN0cmF0ZWd5IGZvdW5kIGZvciAiICsgZW50cnkuZ2V0VmFsdWUoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSnBhVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0MWE5My4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLmV4Y2VwdGlvbi5SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQmFzaWM7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZTsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpwYVZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUZhY2VzQnVuZGxlID0gZmFsc2U7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFURV9MRU5HVEggPSAibGVuZ3RoIjsNCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmlvbGF0aW9uOw0KLSAgICBwcml2YXRlIGludCBtYXhMZW5ndGg7DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKTsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgQ29sdW1uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlQ29sdW1uQW5ub3RhdGlvbigoQ29sdW1uKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIEJhc2ljKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlQmFzaWNBbm5vdGF0aW9uKChCYXNpYykgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBJZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgT25lVG9PbmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVPbmVUb09uZUFubm90YXRpb24oKE9uZVRvT25lKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE1hbnlUb09uZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZU1hbnlUb09uZUFubm90YXRpb24oKE1hbnlUb09uZSkgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVDb2x1bW5Bbm5vdGF0aW9uKENvbHVtbiBjb2x1bW4sIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKCFjb2x1bW4ubnVsbGFibGUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCBpbnN0YW5jZW9mIFN0cmluZw0KLSAgICAgICAgICAgICAgICAmJiBjb2x1bW4ubGVuZ3RoKCkgPCAoKFN0cmluZykgY29udmVydGVkT2JqZWN0KS5sZW5ndGgoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbiA9IFZBTElEQVRFX0xFTkdUSDsNCi0gICAgICAgICAgICB0aGlzLm1heExlbmd0aCA9IGNvbHVtbi5sZW5ndGgoKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWVzc2FnZShudWxsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQmFzaWNBbm5vdGF0aW9uKEJhc2ljIGJhc2ljLCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICghYmFzaWMub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlT25lVG9PbmVBbm5vdGF0aW9uKE9uZVRvT25lIG9uZVRvT25lLCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIW9uZVRvT25lLm9wdGlvbmFsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU1hbnlUb09uZUFubm90YXRpb24oTWFueVRvT25lIG1hbnlUb09uZSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFtYW55VG9PbmUub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCB8fCAoIiIuZXF1YWxzKGNvbnZlcnRlZE9iamVjdCkgJiYgRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb24gPSBDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQ7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWVzc2FnZShudWxsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoVkFMSURBVEVfTEVOR1RILmVxdWFscyh0aGlzLnZpb2xhdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJmaWVsZF90b29fbG9uZyI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJmaWVsZF9yZXF1aXJlZCI7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHN1cGVyLmdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgIGlmIChWQUxJREFURV9MRU5HVEguZXF1YWxzKHRoaXMudmlvbGF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLCAiIiArIHRoaXMubWF4TGVuZ3RoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc3VwZXIucmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0gICAgICAgIFN0cmluZyBtYXJrZXIgPSBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5NSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0NCi0gICAgICAgIGlmKChtYXJrZXIgKyBrZXkgKyBtYXJrZXIpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudXNlRmFjZXNCdW5kbGUgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IGUuZ2V0RmFjZXNNZXNzYWdlKCk7DQotDQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKFZBTElEQVRFX0xFTkdUSC5lcXVhbHModGhpcy52aW9sYXRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0TWF4aW11bU1lc3NhZ2UoZmFjZXNNZXNzYWdlLCB0aGlzLm1heExlbmd0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTGVuZ3RoU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkMDU1OC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMZW5ndGhTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBMZW5ndGggYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTGVuZ3RoLmNsYXNzKTsNCi0gICAgICAgIExlbmd0aFZhbGlkYXRvciBsZW5ndGhWYWxpZGF0b3IgPSAoTGVuZ3RoVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5MZW5ndGgiKTsNCi0NCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzU4MjAyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Mb25nUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5Mb25nUmFuZ2VWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExvbmdSYW5nZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIExvbmdSYW5nZSBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMb25nUmFuZ2UuY2xhc3MpOw0KLSAgICAgICAgTG9uZ1JhbmdlVmFsaWRhdG9yIGxvbmdSYW5nZVZhbGlkYXRvciA9IChMb25nUmFuZ2VWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigiamF2YXguZmFjZXMuTG9uZ1JhbmdlIik7DQotDQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bShhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9QYXR0ZXJuU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTNmNGVmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUGF0dGVyblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5PFBhdHRlcm4+DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBQYXR0ZXJuIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFBhdHRlcm4uY2xhc3MpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZXhwcmVzc2lvbiA6IGFubm90YXRpb24udmFsdWUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIWphdmEudXRpbC5yZWdleC5QYXR0ZXJuLmNvbXBpbGUoZXhwcmVzc2lvbikubWF0Y2hlcihjb252ZXJ0ZWRPYmplY3QudG9TdHJpbmcoKSkubWF0Y2hlcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihuZXcgRmFjZXNNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24pLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKS5yZXBsYWNlKCJ7MH0iLCBleHByZXNzaW9uKSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShQYXR0ZXJuIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5ZTRjNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZXF1aXJlZFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uZXhjZXB0aW9uLlJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLk51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBOdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBFbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZFN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5PFJlcXVpcmVkPg0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUZhY2VzQnVuZGxlID0gZmFsc2U7DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCB8fCBjb252ZXJ0ZWRPYmplY3QuZXF1YWxzKCIiKSB8fA0KLSAgICAgICAgICAgICAgICAoY29udmVydGVkT2JqZWN0IGluc3RhbmNlb2YgQ29sbGVjdGlvbiAmJiAoKENvbGxlY3Rpb24pY29udmVydGVkT2JqZWN0KS5pc0VtcHR5KCkpIHx8DQotICAgICAgICAgICAgICAgIChjb252ZXJ0ZWRPYmplY3QgaW5zdGFuY2VvZiBNYXAgJiYgKChNYXApY29udmVydGVkT2JqZWN0KS5pc0VtcHR5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgIGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWVzc2FnZShtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFJlcXVpcmVkLmNsYXNzKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KFJlcXVpcmVkIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShlLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MjViNzAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvU2tpcFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFNraXBWYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgU3RyaW5nW10gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbnMgPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFNraXBWYWxpZGF0aW9uLmNsYXNzKS52YWx1ZSgpOw0KLQ0KLSAgICAgICAgZm9yKFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uIDogdmFsdWVCaW5kaW5nRXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFZhbHVlT2ZFeHByZXNzaW9uKA0KLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlNLSVBfVkFMSURBVElPTiwgdHJ1ZSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9WYWxpZGF0b3JTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIzY2M5MS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9WYWxpZGF0b3JTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uVmFsaWRhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotDQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcj5bXSB2YWxpZGF0b3JDbGFzc2VzID0NCi0gICAgICAgICAgICBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFZhbGlkYXRvci5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3IgdmFsaWRhdG9yOw0KLSAgICAgICAgZm9yIChDbGFzcyB2YWxpZGF0b3JDbGFzc05hbWUgOiB2YWxpZGF0b3JDbGFzc2VzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRvciA9IChqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yKSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHZhbGlkYXRvckNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRvciA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSh2YWxpZGF0b3JDbGFzc05hbWUuZ2V0TmFtZSgpICsgIiBub3QgZm91bmQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NmFjNjAuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY2VzRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBUaGlzIHBoYXNlIGxpc3RlbmVyIHByb2Nlc3NlcyBjcm9zcyB2YWxpZGF0aW9uIGFzIHNvb24gYXMgaXQgZmluZHMgYSBzcGVjaWFsIHJlcXVlc3Qgc2NvcGVkIHN0b3JhZ2UuPGJyLz4NCi0gKiBTbyBpdCdzIHBvc3NpYmxlIHRvIGFkZCBpbmZvcm1hdGlvbiBkdXJpbmcgdGhlIHByb2Nlc3MgdmFsaWRhdGlvbiBwaGFzZS4gQXQgdGhlIGVuZCBvZiB0aGlzIHBoYXNlIGl0IGdldHMgcHJvY2Vzc2VkLg0KLSAqIEFmdGVyIHRoYXQgdGhlIHN0b3JhZ2UgZ2V0cyByZXNldGVkLjxwLz4NCi0gKiBJZiB5b3UgcHJvdmlkZSBhIGN1c3RvbSBleHRlbnNpb24gYW5kIHlvdSBhZGQgdGhlIHNhbWUgc3RvcmFnZSB0eXBlIHdpdGhpbiBhIGRpZmZlcmVudCBwaGFzZSwNCi0gKiBpdCBhbHNvIGdldHMgcHJvY2Vzc2VkIGF0IHRoZSBlbmQgb2YgdGhhdCBwaGFzZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTMzMzQwNTg5NzYzNTc0MjczMkw7DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlID0gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpOw0KLSAgICAgICAgICAgIGZvciAoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5IDogY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5nZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFFeHRWYWxVdGlscy5leGVjdXRlR2xvYmFsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRDb21wb25lbnQoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5jbGFzcy5nZXROYW1lKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgLy9jYWxsIGluaXQtbWV0aG9kDQotICAgICAgICAgICAgICAgICAgICBpZihlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKSBpbnN0YW5jZW9mIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkuZ2V0Q2xhc3MoKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbml0Q3Jvc3NWYWxpZGF0aW9uIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICAgICAgICAgKiB2YWxpZGF0aW9uDQotICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLnByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oZW50cnksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFkZE1lc3NhZ2UgPSB0cnVlOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkgaW5zdGFuY2VvZiBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWVzc2FnZSA9IChCb29sZWFuKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLmdldENsYXNzKCkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5jbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRDbGFzcygpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYoYWRkTWVzc2FnZSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWNlc01lc3NhZ2UgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsICYmIGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50SWQoZW50cnkuZ2V0Q2xpZW50SWQoKSwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50SWQoZW50cnkuZ2V0Q2xpZW50SWQoKSwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBmaW5hbGx5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0Q29tcG9uZW50KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuY2xhc3MuZ2V0TmFtZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGZpbmFsbHkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5yZXNldENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzSW5pdGlhbGl6ZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NST1NTVkFMSURBVElPTiAhPSBudWxsDQotICAgICAgICAgICAgICAgICAgICAmJiBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgSnNmVXRpbHMuZGVyZWdpc3RlclBoYXNlTGlzdGVuZXIodGhpcyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuQU5ZX1BIQVNFOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmICh0aGlzID09IG8pDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNDAyNzkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0NST1NTVkFMSURBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OIik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJcy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NGQyYTQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBEYXRlSXMNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlT2YoKTsNCi0NCi0gICAgLyoNCi0gICAgICogb3B0aW9uYWwgc2VjdGlvbg0KLSAgICAgKi8NCi0NCi0gICAgRGF0ZUlzVHlwZSB0eXBlKCkgZGVmYXVsdCBEYXRlSXNUeXBlLnNhbWU7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICIiOw0KLQ0KLSAgICBTdHJpbmcgbm90QmVmb3JlRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJ3cm9uZ19kYXRlX25vdF9iZWZvcmUiOw0KLQ0KLSAgICBTdHJpbmcgbm90QWZ0ZXJFcnJvck1zZ0tleSgpIGRlZmF1bHQgIndyb25nX2RhdGVfbm90X2FmdGVyIjsNCi0NCi0gICAgU3RyaW5nIG5vdEVxdWFsRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJ3cm9uZ19kYXRlX25vdF9lcXVhbCI7DQotDQotICAgIGludCBlcnJvck1lc3NhZ2VEYXRlU3R5bGUoKSBkZWZhdWx0IERhdGVGb3JtYXQuTUVESVVNOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzVHlwZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzVmNDgyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJc1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImJlZm9yZU9yU2FtZSwgYWZ0ZXJPclNhbWUiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBlbnVtIERhdGVJc1R5cGUNCi17DQotICAgIGJlZm9yZSwgYWZ0ZXIsIHNhbWUNCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlNzZiNy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgRXF1YWxzDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZSgpOw0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkIjsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL05vdEVxdWFscy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyN2JjNDQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIE5vdEVxdWFscw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQiOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDVkYjI0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUmVxdWlyZWRJZg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWVPZigpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBvcHRpb25hbCBzZWN0aW9uDQotICAgICAqLw0KLQ0KLSAgICBSZXF1aXJlZElmVHlwZSBpcygpIGRlZmF1bHQgUmVxdWlyZWRJZlR5cGUubm90X2VtcHR5Ow0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZW1wdHlfZmllbGQiOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZlR5cGUuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWZUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYzU4ZDkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGVudW0gUmVxdWlyZWRJZlR5cGUNCi17DQotICAgIGVtcHR5LCBub3RfZW1wdHkNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNjA3NTkuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9SW5wdXQgaXMgZGlmZmVyZW50DQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1JbnB1dCBpcyBkaWZmZXJlbnQNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLQ0KLXdyb25nX2RhdGU9V3JvbmcgZGF0ZQ0KLXdyb25nX2RhdGVfZGV0YWlsPVdyb25nIGRhdGUNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmY5M2M0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPVx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDVcdTA2MmVcdTA2MmFcdTA2NDRcdTA2NDENCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDVcdTA2MmVcdTA2MmFcdTA2NDRcdTA2NDENCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPVx1MDYzYVx1MDY0YVx1MDYzMSBcdTA2NDVcdTA2MzNcdTA2NDVcdTA2NDhcdTA2MmQgXHUwNjI4XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0IFx1MDY0NiBcdTA2NDFcdTA2MzMgXHUwNjQyXHUwNjRhXHUwNjQ1XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPVx1MDYzYVx1MDY0YVx1MDYzMSBcdTA2NDVcdTA2MzNcdTA2NDVcdTA2NDhcdTA2MmQgXHUwNjI4XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0ICBcdTA2NDZcdTA2NDFcdTA2MzMgXHUwNjQyXHUwNjRhXHUwNjQ1XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NA0KLQ0KLXdyb25nX2RhdGU9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDYyZVx1MDYyN1x1MDYzN1x1MDY0OVx1MDYyMQ0KLXdyb25nX2RhdGVfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2NDlcdTA2MjENCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzXHUwNjQ4IFx1MDY0NiBcdTA2MjhcdTA2MzlcdTA2MmYgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDMgXHUwNjQ4XHUwNjQ2IFx1MDYyOFx1MDYzOVx1MDYyZiB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDNcdTA2NDggXHUwNjQ2IFx1MDY0Mlx1MDYyOFx1MDY0NCB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzIFx1MDY0OFx1MDY0NiBcdTA2NDJcdTA2MjhcdTA2NDQgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0NFx1MDYyNyBcdTA2NGFcdTA2MzNcdTA2MjdcdTA2NDhcdTA2NDkgezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NDRcdTA2MjcgXHUwNjRhXHUwNjMzXHUwNjI3XHUwNjQ4XHUwNjQ5IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODU0ZWQyLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1lbCB2YWxvciBcdTAwZTkgZGlmZXJlbnQKLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9ZWwgdmFsb3IgXHUwMGU5IGRpZmVyZW50Ci0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9bm8gZXMgcGVybWV0IGVsIG1hdGVpeCB2YWxvcgotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9bm8gZXMgcGVybWV0IGVsIG1hdGVpeCB2YWxvcgotCi13cm9uZ19kYXRlPWRhdGEgZXJyXHUwMGYybmlhCi13cm9uZ19kYXRlX2RldGFpbD1kYXRhIGVyclx1MDBmMm5pYQotCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9bGEgZGF0YSBoYSBkZSBzZXIgcG9zdGVyaW9yIGEgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotCi13cm9uZ19kYXRlX25vdF9hZnRlcj1sYSBkYXRhIGhhIGRlIHNlciBhbnRlcmlvciBhIHswfQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotCi13cm9uZ19kYXRlX25vdF9lcXVhbD1sYSBkYXRhIG5vIFx1MDAwZTlzIGlndWFsIGEgezB9Ci13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9bGEgZGF0YSBubyBcdTAwMGU5cyBpZ3VhbCBhIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDg3MjM0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUVpbmdhYmUgaXN0IHVudGVyc2NoaWVkbGljaA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9RWluZ2FiZSBpc3QgdW50ZXJzY2hpZWRsaWNoDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1EZXIgZ2xlaWNoZSBXZXJ0IGlzdCBuaWNodCBlcmxhdWJ0DQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9RGVyIGdsZWljaGUgV2VydCBpc3QgbmljaHQgZXJsYXVidA0KLQ0KLXdyb25nX2RhdGU9RGF0dW0gaW5rb3JyZWt0DQotd3JvbmdfZGF0ZV9kZXRhaWw9RGF0dW0gaW5rb3JyZWt0DQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhcyBEYXR1bSBtdXNzIG5hY2ggZGVtIHswfSBzZWluDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1EYXMgRGF0dW0gbXVzcyBuYWNoIGRlbSB7MH0gc2Vpbg0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPURhcyBEYXR1bSBtdXNzIHZvciBkZW0gezB9IHNlaW4NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9RGFzIERhdHVtIG11c3Mgdm9yIGRlbSB7MH0gc2Vpbg0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPURhcyBEYXR1bSBlbnRzcHJpY2h0IG5pY2h0IGRlbSB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGFzIERhdHVtIGVudHNwcmljaHQgbmljaHQgZGVtIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjYwNzU5Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUlucHV0IGlzIGRpZmZlcmVudA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9SW5wdXQgaXMgZGlmZmVyZW50DQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi0NCi13cm9uZ19kYXRlPVdyb25nIGRhdGUNCi13cm9uZ19kYXRlX2RldGFpbD1Xcm9uZyBkYXRlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzODUyNC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9bGEgZW50cmFkYSBlcyBkaWZlcmVudGUKLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9bGEgZW50cmFkYSBlcyBkaWZlcmVudGUKLQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1ubyBzZSBwZXJtaXRlbiBlbnRyYWRhcyBpZ3VhbGVzCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1ubyBzZSBwZXJtaXRlbiBlbnRyYWRhcyBpZ3VhbGVzCi0KLXdyb25nX2RhdGU9ZmVjaGEgZXF1aXZvY2FkYQotd3JvbmdfZGF0ZV9kZXRhaWw9ZmVjaGEgZXF1aXZvY2FkYQotCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBsdWVnbyBkZSB7MH0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBsdWVnbyBkZSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBhbnRlcyBkZSB7MH0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGFudGVzIGRlIHswfQotCi13cm9uZ19kYXRlX25vdF9lcXVhbD1sYSBmZWNoYSBubyBlcyBpZ3VhbCBhIHswfQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPWxhIGZlY2hhIG5vIGVzIGlndWFsIGEgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZjAyMTguLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9TGVzIGNoYW1wcyBzb250IGRpZmYmZWFjdXRlO3JlbnRzDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1MZXMgY2hhbXBzIHNvbnQgZGlmZiZlYWN1dGU7cmVudHMNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPUxlcyBjaGFtcHMgZG9pdmVudCAmZWNpcmM7dHJlIGRpZmYmZWFjdXRlO3JlbnRzDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9TGVzIGNoYW1wcyBkb2l2ZW50ICZlY2lyYzt0cmUgZGlmZiZlYWN1dGU7cmVudHMNCi0NCi13cm9uZ19kYXRlPUxhIGRhdGUgZXN0IGluY29ycmVjdGUNCi13cm9uZ19kYXRlX2RldGFpbD1MYSBkYXRlIGVzdCBpbmNvcnJlY3RlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGFwciZlZ3JhdmU7cyB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGFwciZlZ3JhdmU7cyB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhdmFudCB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXZhbnQgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9TGEgZGF0ZSBuJ2VzdCBwYXMgJmVhY3V0ZTtnYWxlICZhZ3JhdmU7IHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1MYSBkYXRlIG4nZXN0IHBhcyAmZWFjdXRlO2dhbGUgJmFncmF2ZTsgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNDI4MDEuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPVZhbG9yaSBub24gdWd1YWxpCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUkgdmFsb3JpIGluc2VyaXRpIG5vbiBjb2luY2lkb25vCi0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9TG8gc3Rlc3NvIHZhbG9yZSBub24gJmVncmF2ZTsgcGVybWVzc28KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPUxvIHN0ZXNzbyB2YWxvcmUgbm9uICZlZ3JhdmU7IHBlcm1lc3NvCi0KLXdyb25nX2RhdGU9RGF0YSBlcnJhdGEKLXdyb25nX2RhdGVfZGV0YWlsPURhdGEgZXJyYXRhCi0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1MYSBkYXRhIGRldmUgZXNzZXJlIGRvcG8gZGkgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPUxhIGRhdGEgZGV2ZSBlc3NlcmUgZG9wbyBkaSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9TGEgZGF0YSBkZXZlIGVzc2VyZSBwcmltYSBkaSB7MH0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1MYSBkYXRhIGRldmUgZXNzZXJlIHByaW1hIGRpIHswfQotCi13cm9uZ19kYXRlX25vdF9lcXVhbD1MYSBkYXRhIG5vbiAmZWdyYXZlOyB1Z3VhbGUgYSB7MH0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1MYSBkYXRhIG5vbiAmZWdyYXZlOyB1Z3VhbGUgYSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFmNmE5ZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1naXJpbGVuIGRlXHUwMTFmZXIgZmFya2xcdTAxMzENCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPWdpcmlsZW4gZGVcdTAxMWZlciBmYXJrbFx1MDEzMQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9YXluXHUwMTMxIGRlXHUwMTFmZXIgZ2lyaWxlbWV6DQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9YXluXHUwMTMxIGRlXHUwMTFmZXIgZ2lyaWxlbWV6DQotDQotd3JvbmdfZGF0ZT15YW5sXHUwMTMxXHUwMTVmIHRhcmloDQotd3JvbmdfZGF0ZV9kZXRhaWw9eWFubFx1MDEzMVx1MDE1ZiB0YXJpaA0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIHNvbnJhIG9sbWFsXHUwMTMxZFx1MDEzMXINCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gc29ucmEgb2xtYWxcdTAxMzFkXHUwMTMxcg0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gXHUwMGY2bmNlIG9sbWFsXHUwMTMxZFx1MDEzMXINCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBcdTAwZjZuY2Ugb2xtYWxcdTAxMzFkXHUwMTMxcg0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPXRhcmloIHswfSBkZVx1MDExZmVyaW5lIGVcdTAxNWZpdCBkZVx1MDExZmlsDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5lIGVcdTAxNWZpdCBkZVx1MDExZmlsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDc2NTllLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLSAgICAgICAgZXh0ZW5kcw0KLSAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBiYXNlTmFtZSA9IG51bGw7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYgKGJhc2VOYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZU5hbWUgPSBzdXBlci5nZXRCYXNlTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGJhc2VOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWNvcmRlci9Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlY29yZGVyL0Nyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkM2IwOGQuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlY29yZGVyL0Nyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwucmVjb3JkZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlciBpbXBsZW1lbnRzIFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXINCi17DQotICAgIHB1YmxpYyB2b2lkIHJlY29yZFVzZXJJbnB1dChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IHZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpZiAoISh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vdG8gc3VwcG9ydCBsb2NhbCBjcm9zcy12YWxpZGF0aW9uICh3aXRoaW4gdGhlIHNhbWUgZW50aXR5KQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSA9IENyb3NzVmFsaWRhdGlvblV0aWxzDQotICAgICAgICAgICAgLmdldE9ySW5pdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgZW50cnk7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0NCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmKHByb3BlcnR5RGV0YWlscyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgZW50cnkgPSBuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkoKTsNCi0gICAgICAgIGVudHJ5LnNldEJlYW4ocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSk7DQotICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh2YWx1ZSk7DQotICAgICAgICBlbnRyeS5zZXRDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgZW50cnkuc2V0Q2xpZW50SWQodWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKSk7DQotDQotICAgICAgICBTdHJpbmcga2V5ID0gcHJvcGVydHlEZXRhaWxzLmdldEtleSgpOw0KLQ0KLSAgICAgICAgLy9mb3IgbG9jYWwgY3Jvc3MtdmFsaWRhdGlvbg0KLSAgICAgICAgaWYgKHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jb250YWluc0VudHJ5KGtleSkgJiYNCi0gICAgICAgICAgICBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkoa2V5KS5nZXRCZWFuKCkgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICFwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkoa2V5KS5nZXRCZWFuKCkuZXF1YWxzKGVudHJ5LmdldEJlYW4oKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9mb3IgdGhlIHZhbGlkYXRpb24gd2l0aGluIGEgY29tcGxleCBjb21wb25lbnQgZS5nLiBhIHRhYmxlDQotICAgICAgICAgICAgLy9kb24ndCBvdmVycmlkZSBleGlzdGluZyBleHByZXNzaW9uIChzdHlsZTogI3tlbnRyeS5wcm9wZXJ0eX0pIC0gbWFrZSBhIHNwZWNpYWwgbWFwcGluZw0KLQ0KLSAgICAgICAgICAgIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk+IGZ1cnRoZXJFbnRyaWVzID0NCi0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmdldEVudHJ5KGtleSkuZ2V0RnVydGhlckVudHJpZXMoKTsNCi0NCi0gICAgICAgICAgICBpZiAoZnVydGhlckVudHJpZXMgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZ1cnRoZXJFbnRyaWVzID0gbmV3IEFycmF5TGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4oKTsNCi0NCi0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmdldEVudHJ5KGtleSkuc2V0RnVydGhlckVudHJpZXMoZnVydGhlckVudHJpZXMpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBmdXJ0aGVyRW50cmllcy5hZGQoZW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZm9yIG5vcm1hbCB2YWxpZGF0aW9uDQotICAgICAgICAgICAgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLnNldEVudHJ5KGtleSwgZW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5ZmFkNi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBub3JtYWxseSBpdCBzaG91bGQgYmUgaW4gdGhlIHN0b3JhZ2UgcGFja2FnZSAtIGR1ZSB0byBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGl0IGlzbid0IHRoZSBjYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHZvaWQgYWRkKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSk7DQotDQotICAgIExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcygpOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDllMWU3Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneS5Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotDQotLyoqDQotICogbm9ybWFsbHkgaXQgc2hvdWxkIGJlIGluIHRoZSBzdG9yYWdlIHBhY2thZ2UgLSBkdWUgdG8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpdCBpc24ndCB0aGUgY2FzZQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkNCi17DQotICAgIHByaXZhdGUgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5Ow0KLSAgICAvL2ZvciBjb21wbGV4IGNvbXBvbmVudHMgKGUuZy4gYSB0YWJsZSkgc3RvcmVzIHRoZSBvYmplY3Qgb2YgZW50cnkgKCN7ZW50cnkucHJvcGVydHl9KQ0KLSAgICBwcml2YXRlIFVJQ29tcG9uZW50IGNvbXBvbmVudDsNCi0gICAgcHJpdmF0ZSBPYmplY3QgY29udmVydGVkT2JqZWN0Ow0KLSAgICBwcml2YXRlIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgLy9qdXN0IGZvciBpbnB1dCBjb21wb25lbnRzIHdpdGhpbiBjb21wbGV4IGNvbXBvbmVudHMgZS5nLiBkYXRhVGFibGUsLi4uDQotICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudElkOw0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeSBnZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhRW50cnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFFbnRyeSA9IG1ldGFEYXRhRW50cnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFVJQ29tcG9uZW50IGdldENvbXBvbmVudCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KFVJQ29tcG9uZW50IGNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRPYmplY3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlZE9iamVjdChPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbnZlcnRlZE9iamVjdCA9IGNvbnZlcnRlZE9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uU3RyYXRlZ3koQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneSA9IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudElkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNsaWVudElkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudElkKFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTEwYTNiLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBpbXBsZW1lbnRzIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgTGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzID0NCi0gICAgICAgIG5ldyBBcnJheUxpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGQoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzLmFkZChlbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcyhMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDQxYzk1ZC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgY3Jvc3MtdmFsaWRhdGlvbiBlbnRyaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyDQotICAgIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPENyb3NzVmFsaWRhdGlvblN0b3JhZ2U+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgLy9mb3IgYmV0dGVyIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkNCi0gICAgICAgIHJldHVybiBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOGUxODcuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSBpbXBsZW1lbnRzIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4gcHJvY2Vzc2VkSW5mb3JtYXRpb25NYXAgPQ0KLSAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW50cnkoU3RyaW5nIGtleSwgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvY2Vzc2VkSW5mb3JtYXRpb25NYXAucHV0KGtleSwgZW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zRW50cnkoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uTWFwLmNvbnRhaW5zS2V5KGtleSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IGdldEVudHJ5KFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9jZXNzZWRJbmZvcm1hdGlvbk1hcC5nZXQoa2V5KTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxODJjOC4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgcHJvY2Vzc2VkIGluZm9ybWF0aW9uIGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlcg0KLSAgICBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIC8vZm9yIGJldHRlciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5DQotICAgICAgICByZXR1cm4gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuY2xhc3MuZ2V0TmFtZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYjE1NmUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBzZXRFbnRyeShTdHJpbmcga2V5LCBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSk7DQotDQotICAgIGJvb2xlYW4gY29udGFpbnNFbnRyeShTdHJpbmcga2V5KTsNCi0NCi0gICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgZ2V0RW50cnkoU3RyaW5nIGtleSk7DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2Y3ODljLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEluIG9yZGVyIHRvIGJ1aWxkIHVwIGEgbWFwcGluZyB3aGljaCBpcyB1c2VkIGZvciBjcm9zcy12YWxpZGF0aW9uLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkKLXsKLSAgICBwcml2YXRlIE9iamVjdCBiZWFuOwotICAgIHByaXZhdGUgT2JqZWN0IGNvbnZlcnRlZFZhbHVlOwotICAgIHByaXZhdGUgVUlDb21wb25lbnQgY29tcG9uZW50OwotICAgIC8vZm9yIGNvbXBsZXggY29tcG9uZW50cyAoZS5nLiBhIHRhYmxlIHRoZXJlIGFyZSBtdWx0aXBsZSBlbnRyaWVzIHdpdGgKLSAgICAvL3RoZSBzYW1lIGtleSAoaGVyZSB0aGUgZWwgZXhwcmVzc2lvbiAje2VudHJ5LnByb3BlcnR5fSkKLSAgICAvL2hvd2V2ZXIsIGRvbid0IG92ZXJyaWRlIHRoZSBwcmV2aW91cyBlbnRyeSAtIHRoZXkgYXJuJ3QgdGhlIHNhbWU7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5PiBmdXJ0aGVyRW50cmllczsKLSAgICAvL2p1c3QgZm9yIGlucHV0IGNvbXBvbmVudHMgd2l0aGluIGNvbXBsZXggY29tcG9uZW50cyBlLmcuIGRhdGFUYWJsZSwuLi4KLSAgICBwcml2YXRlIFN0cmluZyBjbGllbnRJZDsKLQotICAgIC8qCi0gICAgICogZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRCZWFuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJlYW4oT2JqZWN0IGJlYW4pCi0gICAgewotICAgICAgICB0aGlzLmJlYW4gPSBiZWFuOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlZFZhbHVlKE9iamVjdCBjb252ZXJ0ZWRWYWx1ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29udmVydGVkVmFsdWUgPSBjb252ZXJ0ZWRWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVUlDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21wb25lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KFVJQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNsaWVudElkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudElkKFN0cmluZyBjbGllbnRJZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4gZ2V0RnVydGhlckVudHJpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZ1cnRoZXJFbnRyaWVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZ1cnRoZXJFbnRyaWVzKExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk+IGZ1cnRoZXJFbnRyaWVzKQotICAgIHsKLSAgICAgICAgdGhpcy5mdXJ0aGVyRW50cmllcyA9IGZ1cnRoZXJFbnRyaWVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL21hcHBlci9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvbWFwcGVyL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZWJmM2IuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvbWFwcGVyL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkRlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGtleSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvbWFwcGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg3NTMwMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkRlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigyMDApDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGtleSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMDIwMmIuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5PEEgZXh0ZW5kcyBBbm5vdGF0aW9uPiBleHRlbmRzIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBzdGF0aWMgTGlzdDxSZWZlcmVuY2luZ1N0cmF0ZWd5PiByZWZlcmVuY2luZ1N0cmF0ZWdpZXM7DQotICAgIHByb3RlY3RlZCBNYXA8T2JqZWN0LCBPYmplY3Q+IHZpb2xhdGlvblJlc3VsdFN0b3JhZ2UgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgaW5pdFJlZmVyZW5jaW5nU3RyYXRlZ2llcygpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRSZWZlcmVuY2luZ1N0cmF0ZWdpZXMoKQ0KLSAgICB7DQotICAgICAgICBpZiAocmVmZXJlbmNpbmdTdHJhdGVnaWVzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzID0gbmV3IEFycmF5TGlzdDxSZWZlcmVuY2luZ1N0cmF0ZWd5PigpOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyBjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5Q2xhc3NOYW1lID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5CQVNFX1BBQ0tBR0UpICsgIlJlZmVyZW5jaW5nU3RyYXRlZ3kiOw0KLQ0KLSAgICAgICAgICAgIFJlZmVyZW5jaW5nU3RyYXRlZ3kgY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneSA9IChSZWZlcmVuY2luZ1N0cmF0ZWd5KSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5KTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgRUxDb21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICAgICAgLy9yZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBBbGlhc0NvbXBhcmVTdHJhdGVneSgpKTsNCi0gICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBMb2NhbENvbXBhcmVTdHJhdGVneSgpKTsNCi0gICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBMb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2luaXRDcm9zc1ZhbGlkYXRpb24gaXMgZG9uZSBpbiB0aGUgQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcg0KLQ0KLSAgICAgICAgU3RyaW5nW10gdmFsaWRhdGlvblRhcmdldHMgPSBnZXRWYWxpZGF0aW9uVGFyZ2V0cygoQSkNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvblRhcmdldCA6IHZhbGlkYXRpb25UYXJnZXRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQgPSB2YWxpZGF0aW9uVGFyZ2V0LnRyaW0oKTsNCi0NCi0gICAgICAgICAgICAvL3NlbGVjdCB2YWxpZGF0aW9uIG1ldGhvZA0KLSAgICAgICAgICAgIHRyeVRvVmFsaWRhdGUoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCkNCi0gICAgew0KLSAgICAgICAgZm9yIChSZWZlcmVuY2luZ1N0cmF0ZWd5IHJlZmVyZW5jaW5nU3RyYXRlZ3kgOiByZWZlcmVuY2luZ1N0cmF0ZWdpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHJlZmVyZW5jaW5nU3RyYXRlZ3kuZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwgdmFsaWRhdGlvblRhcmdldCwgdGhpcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJUaHJvd2FibGVJbnN0YW5jZU5ldmVyVGhyb3duIn0pDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlRhcmdldCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFoYW5kbGVUYXJnZXRWaW9sYXRpb24oZW50cnlPZlNvdXJjZSwgZW50cnlPZlRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9ubyB0YXJnZXQgLSBiZWNhdXNlIHRoZXJlIGlzIG5vIHRhcmdldCBjb21wb25lbnQgLSB2YWx1ZSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1vZGVsDQotICAgICAgICAgICAgaWYoZW50cnlPZlRhcmdldCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1RhcmdldENvbXBvbmVudEFzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oZW50cnlPZlNvdXJjZSk7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9nZXQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIHRhcmdldCBjb21wb25lbnQNCi0gICAgICAgIFN0cmluZyBzdW1tYXJ5ID0gZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeSgoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpLCB0cnVlKTsNCi0gICAgICAgIFN0cmluZyBkZXRhaWxzID0gZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCksIHRydWUpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0aW9uIHRhcmdldCBpc24ndCBib3VuZCB0byBhIGNvbXBvbmVudCB3aXRoaW5nIHRoZSBjdXJyZW50IHBhZ2UgDQotICAgICAgICAvLyhzZWUgdmFsaWRhdGVGb3VuZEVudHJ5LCB0cnlUb1ZhbGlkYXRlTG9jYWxseSBhbmQgdHJ5VG9WYWxpZGF0ZUJpbmRpbmdPbmx5KQ0KLSAgICAgICAgaWYgKGVudHJ5T2ZUYXJnZXQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBlbnRyeU9mVGFyZ2V0ID0gZW50cnlPZlNvdXJjZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlOw0KLSAgICAgICAgaWYgKGVudHJ5T2ZUYXJnZXQuZ2V0TWV0YURhdGFFbnRyeSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWVzc2FnZSA9IGdldFRhcmdldENvbXBvbmVudEVycm9yTWVzc2FnZSgoQSllbnRyeU9mVGFyZ2V0LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpLCBzdW1tYXJ5LCBkZXRhaWxzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8gZG9jdW1lbnQgcG9zc2libGUgc2lkZSBlZmZlY3RzDQotICAgICAgICAgICAgLy9kdWUgdG8gYSBtaXNzaW5nIHRhcmdldCBhbm5vdGF0aW9uIChzZWU6IHRyeVRvVmFsaWRhdGVMb2NhbGx5KQ0KLSAgICAgICAgICAgIG1lc3NhZ2UgPSBnZXRUYXJnZXRDb21wb25lbnRFcnJvck1lc3NhZ2UoKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoKG1lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgfHwgbWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKSAmJg0KLSAgICAgICAgICAgIGVudHJ5T2ZTb3VyY2UuZ2V0Q2xpZW50SWQoKSAhPSBudWxsICYmICFlbnRyeU9mU291cmNlLmdldENsaWVudElkKCkuZXF1YWxzKGVudHJ5T2ZUYXJnZXQuZ2V0Q2xpZW50SWQoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiA9IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24obWVzc2FnZSk7DQotDQotICAgICAgICAgICAgYm9vbGVhbiBpc1NvdXJjZU1ldGFEYXRhVXNlZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgICAgIGlmKGVudHJ5T2ZUYXJnZXQuZ2V0TWV0YURhdGFFbnRyeSgpID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcmVwYXJlVGFyZ2V0TWV0YURhdGFGb3JTZXZlcml0eUF3YXJlSW50ZXJjZXB0aW9uKGVudHJ5T2ZTb3VyY2UsIGVudHJ5T2ZUYXJnZXQpOw0KLSAgICAgICAgICAgICAgICBpc1NvdXJjZU1ldGFEYXRhVXNlZCA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICAgICAgZW50cnlPZlRhcmdldC5nZXRDb21wb25lbnQoKSwgZW50cnlPZlRhcmdldC5nZXRNZXRhRGF0YUVudHJ5KCksDQotICAgICAgICAgICAgICAgICAgICBlbnRyeU9mVGFyZ2V0LmdldENvbnZlcnRlZE9iamVjdCgpLCB2YWxpZGF0b3JFeGNlcHRpb24sIHRoaXMpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50SWQoZW50cnlPZlRhcmdldC5nZXRDbGllbnRJZCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbnZlcnRGYWNlc01lc3NhZ2UodmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKGlzU291cmNlTWV0YURhdGFVc2VkKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzZXRUYXJnZXRNZXRhRGF0YShlbnRyeU9mVGFyZ2V0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVUYXJnZXRNZXRhRGF0YUZvclNldmVyaXR5QXdhcmVJbnRlcmNlcHRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UsIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBlbnRyeU9mVGFyZ2V0LnNldE1ldGFEYXRhRW50cnkoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZXNldFRhcmdldE1ldGFEYXRhKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBlbnRyeU9mVGFyZ2V0LnNldE1ldGFEYXRhRW50cnkobnVsbCk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJUaHJvd2FibGVJbnN0YW5jZU5ldmVyVGhyb3duIn0pDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzVGFyZ2V0Q29tcG9uZW50QXNTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgLy9nZXQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCkpOw0KLSAgICAgICAgU3RyaW5nIGRldGFpbHMgPSBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsKChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCkpOw0KLQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlIG1lc3NhZ2UgPSBnZXRTb3VyY2VDb21wb25lbnRFcnJvck1lc3NhZ2UoDQotICAgICAgICAgICAgICAgIChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCksIHN1bW1hcnksIGRldGFpbHMpOw0KLQ0KLSAgICAgICAgaWYgKG1lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgfHwgbWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vVE9ETw0KLSAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKGVudHJ5T2ZTb3VyY2UuZ2V0Q29tcG9uZW50KCksDQotICAgICAgICAgICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKSwNCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5T2ZTb3VyY2UuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgICAgICBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG1lc3NhZ2UpLA0KLSAgICAgICAgICAgICAgICAgICAgdGhpcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50KGVudHJ5T2ZTb3VyY2UuZ2V0Q29tcG9uZW50KCksIG1lc3NhZ2UsIG51bGwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8gbG9nZ2luZw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByb2Nlc3NTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGhhbmRsZVNvdXJjZVZpb2xhdGlvbihlbnRyeU9mU291cmNlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2dldCB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQNCi0gICAgICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldEVycm9yTWVzc2FnZVN1bW1hcnkoKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSwgZmFsc2UpOw0KLSAgICAgICAgICAgIFN0cmluZyBkZXRhaWxzID0gZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCksIGZhbHNlKTsNCi0NCi0gICAgICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZSA9IGdldFNvdXJjZUNvbXBvbmVudEVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgfHwgbWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9UT0RPDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvVGhyb3dWYWxpZGF0b3JFeGNlcHRpb25Gb3JDb21wb25lbnQoZW50cnlPZlNvdXJjZS5nZXRDb21wb25lbnQoKSwgbWVzc2FnZSwgbnVsbCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9qdXN0IHRocm93IGEgbmV3IG1lc3NhZ2UgLSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBhdCB0aGUgdGFyZ2V0DQotICAgICAgICBFeHRWYWxVdGlscy50cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50KA0KLSAgICAgICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldENvbXBvbmVudCgpLCBuZXcgRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwgbnVsbCwgbnVsbCksIG51bGwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBGYWNlc01lc3NhZ2UgZ2V0U291cmNlQ29tcG9uZW50RXJyb3JNZXNzYWdlKEEgYW5ub3RhdGlvbiwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgRmFjZXNNZXNzYWdlIGdldFRhcmdldENvbXBvbmVudEVycm9yTWVzc2FnZShBIGZvdW5kQW5ub3RhdGlvbiwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoQSBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcmVzb2x2ZU1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQSBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcga2V5ID0gZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgICAgICByZXR1cm4gKGtleSAhPSBudWxsKSA/IHJlc29sdmVNZXNzYWdlKGtleSArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYKSA6IG51bGw7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KChBKWFubm90YXRpb24sIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVUYXJnZXRWaW9sYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UsDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZUYXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBlbnRyeU9mVGFyZ2V0ICE9IG51bGwgJiYgZW50cnlPZlRhcmdldC5nZXRDb21wb25lbnQoKSAhPSBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVNvdXJjZVZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGhhbmRsZVRhcmdldFZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIG51bGwpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIG5vIHRhcmdldCBjb21wb25lbnQgKHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbW9kZWwpIC0+IGdldCByZXZlcnNlIG1lc3NhZ2UgZm9yIHNvdXJjZSBjb21wb25lbnQNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkoQSBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICAvL2lmIHRoZSBtZXNzYWdlIGlzIG5ldXRyYWwNCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24sIHRydWUpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIG5vIHRhcmdldCBjb21wb25lbnQgKHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbW9kZWwpIC0+IGdldCByZXZlcnNlIG1lc3NhZ2UgZm9yIHNvdXJjZSBjb21wb25lbnQNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbChBIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIC8vaWYgdGhlIG1lc3NhZ2UgaXMgbmV1dHJhbA0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uLCB0cnVlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBhYnN0cmFjdCBtZXRob2RzDQotICAgICAqLw0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBpbXBsZW1lbnRzIHRoZSBzcGVjaWZpYyB2YWxpZGF0aW9uIGxvZ2ljDQotICAgICAqLw0KLQ0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEEgYW5ub3RhdGlvbik7DQotDQotICAgIC8qDQotICAgICAqIHJldHVybnMgdGhlIHJlZmVyZW5jZWQgdmFsaWRhdGlvbiB0YXJnZXRzIG9mIHRoZSBhbm5vdGF0aW9uDQotICAgICAqIGUuZy4gQERhdGVJcyh0eXBlID0gRGF0ZUlzVHlwZS5iZWZvcmUsIHZhbHVlID0gImZpbmFsRXhhbSIpDQotICAgICAqIC0+IG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IHdpdGggb25lIHZhbHVlICgiZmluYWxFeGFtIikNCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBIGFubm90YXRpb24pOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUzNzYxMi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzDQotICAgIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICAvL2luaXQgY3Jvc3MtdmFsaWRhdGlvbg0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5ID0NCi0gICAgICAgICAgICBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKS5hZGQoZW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5ID0gbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgpOw0KLQ0KLSAgICAgICAgZW50cnkuc2V0TWV0YURhdGFFbnRyeShtZXRhRGF0YUVudHJ5KTsNCi0gICAgICAgIGVudHJ5LnNldENvbXBvbmVudCh1aUNvbXBvbmVudCk7DQotICAgICAgICBlbnRyeS5zZXRDbGllbnRJZCh1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpKTsNCi0gICAgICAgIGVudHJ5LnNldENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgZW50cnkuc2V0VmFsaWRhdGlvblN0cmF0ZWd5KHRoaXMpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGVudHJ5Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vdCBhdmFpbGFibGUgZm9yIGNyb3NzIHZhbGlkYXRpb24gLSB1c2UgcHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24iKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRMYWJlbChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgYXZhaWxhYmxlIGZvciBjcm9zcyB2YWxpZGF0aW9uIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIC8vbm90IGF2YWlsYWJsZSBmb3IgY3Jvc3MgdmFsaWRhdGlvbiAtIHVzZSBpbml0Q3Jvc3NWYWxpZGF0aW9uDQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdENyb3NzVmFsaWRhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICAvL292ZXJyaWRlIGlmIG5lZWRlZA0KLSAgICB9DQotDQotICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbXBvbmVudCgpLCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksIHZhbGlkYXRvckV4Y2VwdGlvbiwgdGhpcyk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvbkhlbHBlci5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2Q0NzZlLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneShBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnksDQotICAgICAgICAgICAgYm9vbGVhbiBpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LmlzVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL3Byb2Nlc3MgYWZ0ZXIgdmlvbGF0aW9uDQotICAgICAgICAgICAgLy9qdXN0IGFkZCBtZXNzYWdlcw0KLSAgICAgICAgICAgIGlmKCFpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1RhcmdldEFmdGVyQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzVGFyZ2V0QWZ0ZXJNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy90aG93IGV4Y2VwdGlvbg0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NUYXJnZXRBZnRlckNyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgPSBuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KCk7DQotDQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LnVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbXBvbmVudCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDbGllbnRJZCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbXBvbmVudChzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDbGllbnRJZChzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29udmVydGVkT2JqZWN0KHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpKTsNCi0gICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5KTsNCi0NCi0gICAgICAgIC8vYWRkIG1lc3NhZ2UNCi0gICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgIHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NUYXJnZXRBZnRlck1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIC8vbm8gdGFyZ2V0IC0gYmVjYXVzZSB0aGVyZSBpcyBubyB0YXJnZXQgY29tcG9uZW50IC0gdmFsdWUgd2FzIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBtb2RlbA0KLSAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIG51bGwpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMjdkYTUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgIHZvaWQgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSkNCi0gICAgICAgICAgICB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRGF0ZUlzU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGFmYzhmLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJc1R5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsNCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERhdGVJc1N0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3k8RGF0ZUlzPg0KLXsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PX0VBUkxZID0gImVhcmx5IjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PX0xBVEUgPSAibGF0ZSI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9FUVVBTF9EQVRFX1RJTUUgPSAibm90IGVxdWFsIjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWSA9ICJyZXN1bHQiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QQVJFRF9WQUxVRV9LRVkgPSAidGFyZ2V0IHZhbHVlIjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVWRVJTRV9DT01QQVJFRF9WQUxVRV9LRVkgPSAicmV2ZXJzZSB0YXJnZXQgdmFsdWUiOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgLy9UT0RPIHRlc3QgJiByZW1vdmUNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVNvdXJjZVZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwgRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gdmlvbGF0aW9uRm91bmQ7DQotDQotICAgICAgICBpZiAoYW5ub3RhdGlvbi50eXBlKCkuZXF1YWxzKERhdGVJc1R5cGUuc2FtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSBvYmplY3QxICE9IG51bGwgJiYgIW9iamVjdDEuZXF1YWxzKG9iamVjdDIpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVTVUxUX0tFWSwgTk9UX0VRVUFMX0RBVEVfVElNRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbi50eXBlKCkuZXF1YWxzKERhdGVJc1R5cGUuYmVmb3JlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IG9iamVjdDEgIT0gbnVsbCAmJiBvYmplY3QyICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFuZXcgRGF0ZSgoKERhdGUpIG9iamVjdDEpLmdldFRpbWUoKSkuYmVmb3JlKChEYXRlKSBvYmplY3QyKSB8fCBvYmplY3QxLmVxdWFscyhvYmplY3QyKSk7DQotDQotICAgICAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVNVTFRfS0VZLCBUT09fTEFURSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsICYmIG9iamVjdDIgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW5ldyBEYXRlKCgoRGF0ZSkgb2JqZWN0MSkuZ2V0VGltZSgpKS5hZnRlcigoRGF0ZSkgb2JqZWN0MikgfHwgb2JqZWN0MS5lcXVhbHMob2JqZWN0MikpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVTVUxUX0tFWSwgVE9PX0VBUkxZKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChDT01QQVJFRF9WQUxVRV9LRVksIG9iamVjdDEpOw0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVWRVJTRV9DT01QQVJFRF9WQUxVRV9LRVksIG9iamVjdDIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZpb2xhdGlvbkZvdW5kOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsdWVPZigpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHByb3RlY3RlZA0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAoU3RyaW5nKSB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UuZ2V0KFJFU1VMVF9LRVkpOw0KLQ0KLSAgICAgICAgaWYgKCFpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSByZXZlcnNlUmVzdWx0KHJlc3VsdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoVE9PX0VBUkxZLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROb3RBZnRlckVycm9yTXNnS2V5KGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoVE9PX0xBVEUuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldE5vdEJlZm9yZUVycm9yTXNnS2V5KGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROb3RFcXVhbEVycm9yTXNnS2V5KGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHJldmVyc2VSZXN1bHQoU3RyaW5nIHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgaWYgKFRPT19FQVJMWS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gVE9PX0xBVEU7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIFRPT19FQVJMWTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KERhdGVJcyBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KSwgYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChEYXRlSXMgYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBrZXkgIiArIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBmYWxzZSksIGFubm90YXRpb24sIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsKERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBmYWxzZSkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGFubm90YXRpb24sIGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbikNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKFN0cmluZyBrZXksIERhdGVJcyBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHJlc29sdmVNZXNzYWdlKGtleSk7DQotDQotICAgICAgICBEYXRlRm9ybWF0IGRhdGVGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZShhbm5vdGF0aW9uLmVycm9yTWVzc2FnZURhdGVTdHlsZSgpLA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpKTsNCi0NCi0gICAgICAgIFN0cmluZyByZXN1bHQ7DQotDQotICAgICAgICBpZihpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBtZXNzYWdlLnJlcGxhY2UoInswfSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdC5mb3JtYXQoKERhdGUpIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5nZXQoQ09NUEFSRURfVkFMVUVfS0VZKSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IG1lc3NhZ2UucmVwbGFjZSgiezB9IiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0LmZvcm1hdCgoRGF0ZSkgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLmdldChSRVZFUlNFX0NPTVBBUkVEX1ZBTFVFX0tFWSkpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vcmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgb3RoZXIgY29tcG9uZW50DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHByaXZhdGUNCi0gICAgICovDQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5vdEFmdGVyRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpLmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24ubm90QWZ0ZXJFcnJvck1zZ0tleSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90QmVmb3JlRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpLmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24ubm90QmVmb3JlRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5vdEVxdWFsRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpLmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24ubm90RXF1YWxFcnJvck1zZ0tleSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VMQ29tcGFyZVN0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRUxDb21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5MTFkNS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRUxDb21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogcmVmZXJlbmNpbmcgdmFsaWRhdGlvbiB0YXJnZXRzIC0gcG9zc2libGUgZm9ybWF0czoNCi0gKiAiI3tbYmVhbl9uYW1lXS5bcHJvcGVydHlfbmFtZV19IiAuLi4gY3Jvc3MtZW50aXR5IHZhbGlkYXRpb24gd2l0aCB2YWx1ZSBiaW5kaW5nDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIEVMQ29tcGFyZVN0cmF0ZWd5IGltcGxlbWVudHMgUmVmZXJlbmNpbmdTdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQodmFsaWRhdGlvblRhcmdldCkgJiYNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YWxpZGF0aW9uVGFyZ2V0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb1ZhbGlkYXRlVmFsdWVCaW5kaW5nKA0KLSAgICAgICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsaWRhdGlvblRhcmdldCksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsIGNvbXBhcmVTdHJhdGVneSk7DQotDQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInRlc3QiKQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlVmFsdWVCaW5kaW5nKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9DQotICAgICAgICAgICAgICAgIHJlc29sdmVUYXJnZXRGb3JDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0NCi0gICAgICAgIGlmKHZhbGlkYXRpb25UYXJnZXRFbnRyeSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSByZXNvbHZlVGFyZ2V0Rm9yQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWxpZGF0aW9uVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlID0NCi0gICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlKCk7DQotDQotICAgICAgICByZXR1cm4gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMucmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFbnRyeSgNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5jb252ZXJ0VmFsdWVCaW5kaW5nRXhwcmVzc2lvblRvUHJvY2Vzc2VkSW5mb3JtYXRpb25LZXkodmFsaWRhdGlvblRhcmdldCksDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbGlkYXRpb25UYXJnZXQpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBPYmplY3QgdGFyZ2V0VmFsdWUgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFZhbHVlT2ZFeHByZXNzaW9uKGZhY2VzQ29udGV4dCwgdmFsaWRhdGlvblRhcmdldCk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB0YXJnZXRFbnRyeSA9IG5ldyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSgpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0QmVhbigNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRWYWx1ZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsIHZhbGlkYXRpb25UYXJnZXQuZ2V0QmFzZUV4cHJlc3Npb24oKSkpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0Q29udmVydGVkVmFsdWUodGFyZ2V0VmFsdWUpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRFbnRyeSwgdHJ1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VxdWFsc1N0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlOTc1Zi4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1ATnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1ARW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXF1YWxzU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRXF1YWxzKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG9iamVjdDEgIT0gbnVsbCAmJiAhb2JqZWN0MS5lcXVhbHMob2JqZWN0Mik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRXF1YWxzKSBhbm5vdGF0aW9uKS52YWx1ZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbENvbXBhcmVTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NTJmM2MuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotDQotLyoqDQotICogIltwcm9wZXJ0eV9uYW1lXSIgLi4uIGxvY2FsIHZhbGlkYXRpb24gLT4gY3Jvc3MtY29tcG9uZW50LCBidXQgbm8gY3Jvc3MtZW50aXR5IHZhbGlkYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgTG9jYWxDb21wYXJlU3RyYXRlZ3kgaW1wbGVtZW50cyBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LCBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25UYXJnZXQuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneSB3aWxsIGNvbnRpbnVlDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlTG9jYWxseSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0S2V5LA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSA9DQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgYm9vbGVhbiBpc01vZGVsQXdhcmVWYWxpZGF0aW9uID0NCi0gICAgICAgICAgICAgICAgaXNNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHRhcmdldFByb3BlcnR5ID0gdGFyZ2V0S2V5Ow0KLQ0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUtleSA9IHJlc29sdmVTb3VyY2VLZXkoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIHRhcmdldEtleSA9IHNvdXJjZUtleS5zdWJzdHJpbmcoMCwgc291cmNlS2V5Lmxhc3RJbmRleE9mKCIuIikgKyAxKSArIHRhcmdldEtleTsNCi0NCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9IENyb3NzVmFsaWRhdGlvblV0aWxzLnJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgICAgIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSwgdGFyZ2V0S2V5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLQ0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25UYXJnZXRFbnRyeSAhPSBudWxsICYmIHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb21wb25lbnQoKSAhPSBudWxsICYmICFpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICAvL25vIHRhcmdldCAtIGJlY2F1c2UgdGhlcmUgaXMgbm8gdGFyZ2V0IGNvbXBvbmVudCAtIHZhbHVlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbW9kZWwNCi0gICAgICAgIGVsc2UgaWYoaXNNb2RlbEF3YXJlVmFsaWRhdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHVuc3VwcG9ydGVkQ2FzZShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVUYXJnZXRLZXkoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgU3RyaW5nIHRhcmdldEtleSkNCi0gICAgew0KLSAgICAgICAgLy9ubyByZWFsIHZhbHVlIGJpbmRpbmcgZXhwcmVzc2lvbg0KLSAgICAgICAgLy9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGp1c3QgaGVwbHMgdG8gcmVwbGFjZSB0aGUgcHJvcGVydHkgb2YgdGhlIGtleQ0KLSAgICAgICAgLy9oZXJlIG9ubHkgZG90LW5vdGF0aW9uIGlzIGFsbG93ZWQgLT4gbm8gcHJvYmxlbQ0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBiYXNlRXhwcmVzc2lvbiA9DQotICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7IiArIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsDQotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMuY2xhc3MpLmdldEtleSgpICsgIn0iKTsNCi0NCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2VPckFkZFByb3BlcnR5KGJhc2VFeHByZXNzaW9uLCB0YXJnZXRLZXkpDQotICAgICAgICAgICAgLmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgIHJldHVybiByZXN1bHQuc3Vic3RyaW5nKDIsIHJlc3VsdC5sZW5ndGgoKSAtMSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRWYWx1ZU9mUHJvcGVydHkoT2JqZWN0IGJhc2UsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEsIHByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhiYXNlLmdldENsYXNzKCkpOw0KLSAgICAgICAgTWV0aG9kIHRhcmdldE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh0YXJnZXRDbGFzcywgImdldCIgKyBwcm9wZXJ0eSk7DQotDQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0YXJnZXRNZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodGFyZ2V0Q2xhc3MsICJpcyIgKyBwcm9wZXJ0eSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAiY2xhc3MgIiArIGJhc2UuZ2V0Q2xhc3MoKSArICIgaGFzIG5vIHB1YmxpYyBnZXQvaXMgIiArIHByb3BlcnR5LnRvTG93ZXJDYXNlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZChiYXNlLCB0YXJnZXRNZXRob2QpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2Uga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuZXdLZXkgPSBjcmVhdGVUYXJnZXRLZXkoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgcmV0dXJuICFrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcuY29udGFpbnNFbnRyeShuZXdLZXkpOw0KLQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHJlc29sdmVTb3VyY2VLZXkoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBTdHJpbmcgc291cmNlS2V5ID0gcHJvcGVydHlEZXRhaWxzLmdldEtleSgpOw0KLQ0KLSAgICAgICAgaWYoIXNvdXJjZUtleS5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNvdXJjZSBwYXRoOiAiICsgc291cmNlS2V5ICsgIiBpbnZhbGlkIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc291cmNlS2V5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB1bnN1cHBvcnRlZENhc2UoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBjb252ZXJ0ZWQgb2JqZWN0IGZvciAiICsgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKS5nZXRLZXkoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHRhcmdldEVudHJ5ID0gbmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5KCk7DQotDQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRCZWFuKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcykuZ2V0QmFzZU9iamVjdCgpKTsNCi0gICAgICAgIHRhcmdldEVudHJ5DQotICAgICAgICAgICAgICAgIC5zZXRDb252ZXJ0ZWRWYWx1ZShnZXRWYWx1ZU9mUHJvcGVydHkodGFyZ2V0RW50cnkuZ2V0QmVhbigpLCB0YXJnZXRQcm9wZXJ0eSkpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRFbnRyeSwgdHJ1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneS5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWI2NTZjLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqICJbbG9jYWxfcHJvcGVydHkucHJvcGVydHkxLnByb3BlcnR5Ml0iDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIExvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneSBleHRlbmRzIExvY2FsQ29tcGFyZVN0cmF0ZWd5DQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZighdmFsaWRhdGlvblRhcmdldC5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vbm90IHN1cHBvcnRlZCAtIFRPRE8gYWRkIGxvZ2dpbmcNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ5VG9WYWxpZGF0ZUxvY2FsbHkoDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlTG9jYWxseShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSA9DQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IGNyZWF0ZVRhcmdldEtleShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEtleSk7DQotDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNvbnRhaW5zRW50cnkobmV3S2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkgPSBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkobmV3S2V5KTsNCi0NCi0gICAgICAgICAgICBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9ubyB0YXJnZXQgLSBiZWNhdXNlIHRoZXJlIGlzIG5vIHRhcmdldCBjb21wb25lbnQgLSB2YWx1ZSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1vZGVsDQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEtleSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB0YXJnZXRJbmZvcm1hdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LmlzVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgIHRhcmdldEluZm9ybWF0aW9uRW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSA9IG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoKTsNCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29tcG9uZW50KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENsaWVudElkKHRhcmdldEluZm9ybWF0aW9uRW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbnZlcnRlZE9iamVjdCh0YXJnZXRJbmZvcm1hdGlvbkVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCkpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAvL3Byb2Nlc3MgYWZ0ZXIgdmlvbGF0aW9uDQotICAgICAgICAgICAgLy9qdXN0IGFkZCBtZXNzYWdlcw0KLSAgICAgICAgICAgIGlmKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBudWxsKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy90aG93IGV4Y2VwdGlvbg0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFN0cmluZyB0YXJnZXRLZXkpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBPYmplY3QgbmV3QmFzZSA9IFJlZmxlY3Rpb25VdGlscw0KLSAgICAgICAgICAgIC5nZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCksIHRhcmdldEtleSk7DQotDQotICAgICAgICBpZih0YXJnZXRLZXkuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2ZpbmQgdGhlIGxhc3QgcHJvcGVydHkNCi0gICAgICAgICAgICB0YXJnZXRLZXkgPSB0YXJnZXRLZXkuc3Vic3RyaW5nKHRhcmdldEtleS5sYXN0SW5kZXhPZigiLiIpICsgMSwgdGFyZ2V0S2V5Lmxlbmd0aCgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXRWYWx1ZSA9IGdldFZhbHVlT2ZQcm9wZXJ0eShuZXdCYXNlLCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdGFyZ2V0RW50cnkgPSBuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkoKTsNCi0gICAgICAgIHRhcmdldEVudHJ5LnNldEJlYW4obmV3QmFzZSk7DQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh0YXJnZXRWYWx1ZSk7DQotDQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEVudHJ5LCB0cnVlKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Ob3RFcXVhbHNTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTA5ZTg0Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Ob3RFcXVhbHNTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5Ob3RFcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1ATnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1ARW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTm90RXF1YWxzU3RyYXRlZ3kgZXh0ZW5kcyBFcXVhbHNTdHJhdGVneQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoTm90RXF1YWxzKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLA0KLSAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICFzdXBlci5pc1Zpb2xhdGlvbihvYmplY3QxLCBvYmplY3QyLCBhbm5vdGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoTm90RXF1YWxzKSBhbm5vdGF0aW9uKS52YWx1ZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVmZXJlbmNpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGM1MDExLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEludGVybmFsIGludGVyZmFjZSB0byBhbGxvdyBtdWx0aXBsZSByZWZlcmVuY2luZyBzdHJhdGVnaWVzIGZvciBjcm9zcyBjb21wb25lbnQgdmFsaWRhdGlvbi4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotaW50ZXJmYWNlIFJlZmVyZW5jaW5nU3RyYXRlZ3kNCi17DQotICAgIGJvb2xlYW4gZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBhYnN0cmFjdENvbXBhcmVTdHJhdGVneSk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YSBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg3NTBiMy4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVxdWlyZWRJZlN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkSWY7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkSWZUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFJlcXVpcmVkSWZTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5PFJlcXVpcmVkSWY+DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRmFjZXNCdW5kbGUgPSBmYWxzZTsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc3VwZXIucmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0gICAgICAgIFN0cmluZyBtYXJrZXIgPSBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5NSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0NCi0gICAgICAgIGlmKChtYXJrZXIgKyBrZXkgKyBtYXJrZXIpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudXNlRmFjZXNCdW5kbGUgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShSZXF1aXJlZElmIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBzb3VyY2UsIE9iamVjdCB0YXJnZXQsIFJlcXVpcmVkSWYgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiB2aW9sYXRpb25Gb3VuZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgaWYgKGFubm90YXRpb24uaXMoKS5lcXVhbHMoUmVxdWlyZWRJZlR5cGUuZW1wdHkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gKGlzVGFyZ2V0RW1wdHkodGFyZ2V0KSB8fCBCb29sZWFuLkZBTFNFLmVxdWFscyh0YXJnZXQpKSAmJiBpc1NvdXJjZUVtcHR5KHNvdXJjZSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uLmlzKCkuZXF1YWxzKFJlcXVpcmVkSWZUeXBlLm5vdF9lbXB0eSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSAoaXNUYXJnZXROb3RFbXB0eSh0YXJnZXQpICYmIGlzU291cmNlRW1wdHkoc291cmNlKSAmJiAhKHRhcmdldCBpbnN0YW5jZW9mIEJvb2xlYW4pKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgKEJvb2xlYW4uVFJVRS5lcXVhbHModGFyZ2V0KSAmJiBpc1NvdXJjZUVtcHR5KHNvdXJjZSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZpb2xhdGlvbkZvdW5kOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1RhcmdldEVtcHR5KE9iamVjdCB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQuZXF1YWxzKCIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTb3VyY2VFbXB0eShPYmplY3Qgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc291cmNlID09IG51bGwgfHwgc291cmNlLmVxdWFscygiIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVGFyZ2V0Tm90RW1wdHkoT2JqZWN0IHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldCAhPSBudWxsICYmICF0YXJnZXQuZXF1YWxzKCIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoUmVxdWlyZWRJZiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWx1ZU9mKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMudXNlRmFjZXNCdW5kbGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcyBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkOTkyOS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLkJhc2ljPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLklkPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZT1vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5KcGFWYWxpZGF0aW9uU3RyYXRlZ3kKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Dcm9zc1ZhbGlkYXRpb25VdGlscy5qYXZhIGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlmODUyYS4uMDAwMDAwMAotLS0gYS9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Dcm9zc1ZhbGlkYXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25VdGlscw0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLCBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlc2V0U3RvcmFnZShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLCBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgZ2V0T3JJbml0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoDQotICAgICAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jbGFzcywgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0S2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxVdGlscy5yZXNldFN0b3JhZ2UoUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLCBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0S2V5LCBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5ID0NCi0gICAgICAgICAgICBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkodGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIC8vdmFsdWUgbm90IHN1Ym1pdHRlZCBhdCB0aGlzIHJlcXVlc3QgLSB1c2UgbW9kZWwgdmFsdWUgKHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbW9kZWwpDQotICAgICAgICBpZihwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICAvL3NpbXBsZSBjYXNlDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5nZXRGdXJ0aGVyRW50cmllcygpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXRCZWFuID0gcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKTsNCi0NCi0gICAgICAgIC8vcHJvY2VzcyBjb21wbGV4IGNvbXBvbmVudCBlbnRyaWVzIChlLmcuIGEgdGFibGUpDQotICAgICAgICAvL3N1cHBvcnRlZDogY3Jvc3MtY29tcG9uZW50IGJ1dCBubyBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbiAoPSBsb2NhbGUgdmFsaWRhdGlvbikNCi0gICAgICAgIGlmIChwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEJlYW4oKS5lcXVhbHModGFyZ2V0QmVhbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotICAgICAgICB9DQotDQotICAgICAgICBmb3IgKFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5IDogcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5nZXRGdXJ0aGVyRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbnRyeS5nZXRCZWFuKCkuZXF1YWxzKHRhcmdldEJlYW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJzdXBwb3J0IGZvciBtYXAgc3ludGF4IikNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFZhbHVlQmluZGluZ0V4cHJlc3Npb25Ub1Byb2Nlc3NlZEluZm9ybWF0aW9uS2V5KFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmJlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmJlLmdldEV4cHJlc3Npb25TdHJpbmcoKS5yZXBsYWNlKCIjeyIsICIiKS5yZXBsYWNlKCJ9IiwgIiIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Byb3BlcnR5VmFsaWRhdGlvblV0aWxzLmphdmEgYi9leHBlcmltZW50YWwvdHJ1bmtfd2l0aF9leHR2YWwtODMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Qcm9wZXJ0eVZhbGlkYXRpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2M0YTA1Li4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Byb3BlcnR5VmFsaWRhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LlNraXBWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0dHRVIgPSBMb2dGYWN0b3J5LmdldExvZyhQcm9wZXJ0eVZhbGlkYXRpb25VdGlscy5jbGFzcyk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkYXRpb25Ta2lwcGVkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZihFeHRWYWxVdGlscy5pc1NraXBhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KA0KLSAgICAgICAgICAgICAgICBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBCb29sZWFuIHNraXBWYWxpZGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eSgNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCBCb29sZWFuLmNsYXNzKTsNCi0NCi0gICAgICAgICAgICBpZihCb29sZWFuLlRSVUUuZXF1YWxzKHNraXBWYWxpZGF0aW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKExPR0dFUi5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBMT0dHRVIudHJhY2UoInZhbGlkYXRpb24gb2YgIiArIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY2FuY2VsZWQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIFNraXBWYWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgbnVsbCwgbWV0YURhdGFFbnRyeSwgbnVsbCk7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGVyaW1lbnRhbC90cnVua193aXRoX2V4dHZhbC04My92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMzkyNTUuLjAwMDAwMDAKLS0tIGEvZXhwZXJpbWVudGFsL3RydW5rX3dpdGhfZXh0dmFsLTgzL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBQcm9wZXJ0eSBWYWxpZGF0aW9uIE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFByb3BlcnR5IFZhbGlkYXRpb24gTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgUHJvcGVydHkgVmFsaWRhdGlvbiBwcm92aWRlcyBhbm5vdGF0aW9uIGJhc2VkIHZhbGlkYXRpb24gZm9yIGJlYW4gcHJvcGVydGllcy4NCi0gICAgSXQgYWxzbyBwcm92aWRlcyBKUEEgMS4wIGJhc2VkIHZhbGlkYXRpb24gU3VwcG9ydC4NCi0gIA0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS4xLnggYW5kIEpTRiAxLjIueC4gQm90aCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BvbS54bWwgYi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMjI4YzIKLS0tIC9kZXYvbnVsbAorKysgYi9wb20ueG1sCkBAIC0wLDAgKzEsMjcwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICAgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjk8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtbW9kdWxlPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMS40PC92ZXJzaW9uPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgTW9kdWxlPC9uYW1lPgorICAgIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExPC91cmw+CisgICAgCisgICAgPHNjbT4KKyAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGFncy9leHR2YWwtMS4xLjQ8L2Nvbm5lY3Rpb24+CisgICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90YWdzL2V4dHZhbC0xLjEuNDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KKyAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGFncy9leHR2YWwtMS4xLjQ8L3VybD4KKyAgICA8L3NjbT4KKworICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgorICAgICAgICA8c2l0ZT4KKyAgICAgICAgICAgIDxpZD5hcGFjaGUud2Vic2l0ZTwvaWQ+CisgICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMjwvdXJsPgorICAgICAgICA8L3NpdGU+CisgICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgorCisgICAgPGlzc3VlTWFuYWdlbWVudD4KKyAgICAgICAgPHN5c3RlbT5qaXJhPC9zeXN0ZW0+CisgICAgICAgIDx1cmw+aHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0VYVFZBTDwvdXJsPgorICAgIDwvaXNzdWVNYW5hZ2VtZW50PgorCisgICAgPGNpTWFuYWdlbWVudD4KKyAgICAgICAgPHN5c3RlbT5jb250aW51dW08L3N5c3RlbT4KKyAgICAgICAgPHVybD5odHRwOi8vbXlmYWNlcy56b25lcy5hcGFjaGUub3JnOjgwODAvY29udGludXVtPC91cmw+CisgICAgICAgIDxub3RpZmllcnM+CisgICAgICAgICAgICA8bm90aWZpZXI+CisgICAgICAgICAgICAgICAgPHR5cGU+bWFpbDwvdHlwZT4KKyAgICAgICAgICAgICAgICA8c2VuZE9uU3VjY2Vzcz50cnVlPC9zZW5kT25TdWNjZXNzPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8YWRkcmVzcz5jb21taXRzQG15ZmFjZXMuYXBhY2hlLm9yZzwvYWRkcmVzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L25vdGlmaWVyPgorICAgICAgICA8L25vdGlmaWVycz4KKyAgICA8L2NpTWFuYWdlbWVudD4KKworICAgIDxpbmNlcHRpb25ZZWFyPjIwMDg8L2luY2VwdGlvblllYXI+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5jb3JlPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+dmFsaWRhdGlvbi1tb2R1bGVzPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+Y29tcG9uZW50LXN1cHBvcnQ8L21vZHVsZT4KKworICAgICAgICA8IS0tbW9kdWxlPnRlc3QtbW9kdWxlczwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmV4YW1wbGVzPC9tb2R1bGUtLT4KKyAgICA8L21vZHVsZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICA8cmVzb3VyY2U+CisgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9PC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+TUVUQS1JTkY8L3RhcmdldFBhdGg+CisgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgICAgPC9yZXNvdXJjZT4KKyAgICAgICAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICA8L3Jlc291cmNlcz4KKworICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4KKyAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisKKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgICAgICAgLSBDb3B5IExJQ0VOU0UudHh0IGFuZCBOT1RJQ0UudHh0IHNvIHRoYXQgdGhleSBhcmUgaW5jbHVkZWQKKyAgICAgICAgICAgICAgICAgICAgLSBpbiB0aGUgLWphdmFkb2MgamFyIGZpbGUgZm9yIHRoZSBjb21wb25lbnQuCisgICAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+amF2YWRvYy5yZXNvdXJjZXM8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hcGlkb2NzL01FVEEtSU5GIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTElDRU5TRS50eHQiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTk9USUNFLnR4dCIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmphdmFkb2Muc2l0ZS5jb3B5PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5zaXRlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENvcHkgamF2YWRvYyB0byBhbm90aGVyIGRpcmVjdG9yeSwgdG8ga2VlcCBqYXZhZG9jIG9mIHByZXZpb3VzIHZlcnNpb25zIG9uIHNpdGUgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zaXRlL2FwaWRvY3MtJHtwcm9qZWN0LnZlcnNpb259IiBmYWlsb25lcnJvcj0iZmFsc2UiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc2l0ZS9hcGlkb2NzIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8IS0tCisgICAgICAgICAgICAgICAgLSBNYWtlIGEgY2hlY2tzdHlsZSB2aW9sYXRpb24gYSBjb21waWxlIGVycm9yLiBOb3RlIHRoYXQgaWYgYSBjb21waWxlIGVycm9yIG9jY3VycywKKyAgICAgICAgICAgICAgICAtIGZ1cnRoZXIgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRhcmdldC9zaXRlL2NoZWNrc3R5bGUuaHRtbCAocHJlc2VudCBldmVuIHdoZW4KKyAgICAgICAgICAgICAgICAtIGp1c3QgdGhlIGNvbXBpbGUgZ29hbCBhbmQgbm90IHRoZSBzaXRlIGdvYWwgaGFzIGJlZW4gcnVuKS4gTm90ZSBhbHNvIHRoYXQgY2hpbGQKKyAgICAgICAgICAgICAgICAtIHByb2plY3RzIG1heSByZWRlY2xhcmUgdGhpcyBwbHVnaW4gYW5kIHByb3ZpZGUgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MKKyAgICAgICAgICAgICAgICAtIHRvIHVzZSBkaWZmZXJlbnQgY2hlY2tzIChtb3JlIG9yIGxlc3Mgc3RyaWN0IHRoYW4gdGhlIGRlZmF1bHQpLgorICAgICAgICAgICAgLS0+CisKKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD52ZXJpZnktc3R5bGU8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxjb25maWdMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0YW5kYXJkLnhtbDwvY29uZmlnTG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxoZWFkZXJMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtaGVhZGVyLnR4dDwvaGVhZGVyTG9jYXRpb24+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisKKworICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8IS0tIFNldCBjb21waWxlIHNvdXJjZSBhdCAxLjUsIHNpbmNlIHRoZSB0YXJnZXQgSlNGIGltcGwgaXMgMS4yIC0tPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+CisgICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+CisgICAgICAgICAgICAgICAgICAgIDxvcHRpbWl6ZT5mYWxzZTwvb3B0aW1pemU+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8IS0tIEFkZCB0aGUgYXNzZW1ibHkgbW9kdWxlIHdoZW4gcGVyZm9ybWluZyBhbiBhcGFjaGUtcmVsZWFzZSAtLT4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+YXBhY2hlLXJlbGVhc2U8L2lkPgorCisgICAgICAgICAgICA8bW9kdWxlcz4KKyAgICAgICAgICAgICAgICA8bW9kdWxlPmFzc2VtYmx5PC9tb2R1bGU+CisgICAgICAgICAgICA8L21vZHVsZXM+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCisgICAgPHJlcG9ydGluZz4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWp4ci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXJlcG9ydC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40LjM8L3ZlcnNpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4xPC92ZXJzaW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBtZC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8cnVsZXNldHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvYmFzaWMueG1sPC9ydWxlc2V0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL3VudXNlZGNvZGUueG1sPC9ydWxlc2V0PgorICAgICAgICAgICAgICAgICAgICA8L3J1bGVzZXRzPgorICAgICAgICAgICAgICAgICAgICA8bGlua1hyZWY+dHJ1ZTwvbGlua1hyZWY+CisgICAgICAgICAgICAgICAgICAgIDxtaW5pbXVtVG9rZW5zPjEwMDwvbWluaW11bVRva2Vucz4KKyAgICAgICAgICAgICAgICAgICAgPHRhcmdldEpkaz4xLjU8L3RhcmdldEpkaz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1jaGVja3Mtc3RhbmRhcmQueG1sPC9jb25maWdMb2NhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGhlYWRlckxvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1oZWFkZXIudHh0PC9oZWFkZXJMb2NhdGlvbj4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRvYXAtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGNhdGVnb3J5PndlYi1mcmFtZXdvcmssIHZhbGlkYXRpb248L2NhdGVnb3J5PgorICAgICAgICAgICAgICAgICAgICA8bGFuZ3VhZ2U+SmF2YTwvbGFuZ3VhZ2U+CisgICAgICAgICAgICAgICAgICAgIDxzaG9ydGRlc2M+SlNGIGNlbnRyaWMgdmFsaWRhdGlvbiBmcmFtZXdvcmsgZm9yIG1ldGFkYXRhIGJhc2VkIHZhbGlkYXRpb24uPC9zaG9ydGRlc2M+CisgICAgICAgICAgICAgICAgICAgIDxwbWM+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZzwvcG1jPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9yZXBvcnRpbmc+CisKKyAgICA8cmVwb3NpdG9yaWVzPgorICAgICAgICA8cmVwb3NpdG9yeT4KKyAgICAgICAgICAgIDxpZD5tYXZlbjItcmVwb3NpdG9yeS5kZXYuamF2YS5uZXQ8L2lkPgorICAgICAgICAgICAgPG5hbWU+SmF2YS5uZXQgUmVwb3NpdG9yeSBmb3IgTWF2ZW48L25hbWU+CisgICAgICAgICAgICA8dXJsPmh0dHA6Ly9kb3dubG9hZC5qYXZhLm5ldC9tYXZlbi8yLzwvdXJsPgorICAgICAgICAgICAgPGxheW91dD5kZWZhdWx0PC9sYXlvdXQ+CisgICAgICAgIDwvcmVwb3NpdG9yeT4KKyAgICA8L3JlcG9zaXRvcmllcz4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8anNmLnZlcnNpb24+MS4xLjU8L2pzZi52ZXJzaW9uPgorICAgIDwvcHJvcGVydGllcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9hc3NlbWJseS9wb20ueG1sIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2Fzc2VtYmx5L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNjY1NDguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2Fzc2VtYmx5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWFzc2VtYmx5MTE8L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBBc3NlbWJseTwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+TXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBBc3NlbWJseSBpcyB1c2VkIHRvIGdlbmVyYXRlIAotICAgIC56aXAgYW5kIC50YXIuZ3ogZGlzdHJpYnV0aW9ucyA8L2Rlc2NyaXB0aW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMV8xL2Fzc2VtYmx5LzwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzFfMS9hc3NlbWJseS88L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzFfMS9hc3NlbWJseS88L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRlcGVuZGVuY3ktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktamF2YWRvYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZW5lcmljLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9qYXZhZG9jPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktc291cmNlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y29yZS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3NyYzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tIEVYRUNVVEUgbXZuIHBhY2thZ2UgdG8gZ2VuZXJhdGUgYXNzZW1ibHkgZmlsZXMgLS0+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfc3JjPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsMTEtJHt2ZXJzaW9ufS1zcmM8L2ZpbmFsTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfYmluPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+JHtiYXNlZGlyfS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwxMS0ke3ZlcnNpb259LWJpbjwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L291dDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmF0dGFjaGVkPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y29yZS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPCEtLSBTaW5jZSBleHR2YWwgY291bGQgYmUgYXN5bmMgcmVsZWFzZWQsIGFuIGdlbmVyYXRlZCBhc3NlbWJseSBjb3VsZCBjb250YWluIGRpZmZlcmVudAotICAgICAgICAgYXJ0aWZhY3QgdmVyc2lvbnMgLS0+Ci0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxjb3JlLnZlcnNpb24+MS4xLjE8L2NvcmUudmVyc2lvbj4KLSAgICAgICAgPHRyaW5pZGFkLXN1cHBvcnQudmVyc2lvbj4xLjEuMTwvdHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9uPgotICAgICAgICA8Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb24+MS4xLjE8L2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9uPgotICAgICAgICA8cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9uPjEuMS4xPC9wcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmViaW4ueG1sIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmViaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjY3OTViLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPmNvcmViaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAJPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+UkVBRE1FKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+TElDRU5TRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPk5PVElDRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPlJFTEVBU0UqPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9qYXZhZG9jPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmphdmFkb2M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWwgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMTg2YzYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+Y29yZXNyYzwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPiAgCi0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAJPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+UkVBRE1FKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+TElDRU5TRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPk5PVElDRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPlJFTEVBU0UqPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+ICAgCi0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9zcmM8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+c3JjPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgotIApkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNWIzYTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDliZmU2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieToKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0Ci1TZWUgbGljZW5zZXMgZm9yIGFjY29tcGFueWluZyBwcm9kdWN0cyBpbiB0aGUgIi9saWNlbnNlcyIgc3ViZGlyZWN0b3J5LgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvcG9tLnhtbCBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBkOWFlYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZTwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jZ2xpYjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNnbGliPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4xXzM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWVjZTU1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQw0KLSAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKYXZhU2VydmVyIEZhY2VzIENvbmZpZyAxLjAvL0VOIg0KLSAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzEuZHRkIiA+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGZhY2VzLWNvbmZpZz4NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj4NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5zdGFydHVwLkdlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXINCi0gICAgICAgIDwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkY2VjNzYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyS2l0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5yZW5kZXJraXQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotDQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RJbnRlcmNlcHRvcjsNCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5LkVuaGFuY2VyOw0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kUHJveHk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsR2VuZXJpY1JlbmRlcktpdCBleHRlbmRzIEV4dFZhbFJlbmRlcktpdCBpbXBsZW1lbnRzIE1ldGhvZEludGVyY2VwdG9yDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFJlbmRlcktpdCBuZXdJbnN0YW5jZShSZW5kZXJLaXQgcmVuZGVyS2l0KQ0KLSAgICB7DQotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSByZW5kZXJLaXQuZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIC8vaXQncyBub3QgcG9zc2libGUgdG8gd3JhcCB0aGUgY29udmVydGVyIGFnYWluIC0gb2NjdXJzIGUuZy4gdW5kZXIgc29sYXJpcyArIGJlYSB3ZWJsb2dpYw0KLSAgICAgICAgaWYgKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkuY29udGFpbnMoIiQkRW5oYW5jZXJCeUNHTElCJCQiKQ0KLSAgICAgICAgICAgIHx8IGN1cnJlbnRDbGFzcy5nZXROYW1lKCkuY29udGFpbnMoIiQkRmFzdENsYXNzQnlDR0xJQiQkIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcktpdDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEVuaGFuY2VyIGVuaGFuY2VyID0gbmV3IEVuaGFuY2VyKCk7DQotICAgICAgICBlbmhhbmNlci5zZXRTdXBlcmNsYXNzKHJlbmRlcktpdC5nZXRDbGFzcygpKTsNCi0gICAgICAgIGVuaGFuY2VyLnNldENhbGxiYWNrKG5ldyBFeHRWYWxHZW5lcmljUmVuZGVyS2l0KHJlbmRlcktpdCkpOw0KLQ0KLSAgICAgICAgcmV0dXJuIChSZW5kZXJLaXQpIGVuaGFuY2VyLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgaW50ZXJjZXB0KE9iamVjdCBvYmosIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MsIE1ldGhvZFByb3h5IHByb3h5KSB0aHJvd3MgVGhyb3dhYmxlDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJnZXRSZW5kZXJlciIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRSZW5kZXJlcigoU3RyaW5nKWFyZ3NbMF0sIChTdHJpbmcpYXJnc1sxXSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJhZGRSZW5kZXJlciIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZFJlbmRlcmVyKChTdHJpbmcpYXJnc1swXSwgKFN0cmluZylhcmdzWzFdLCAoUmVuZGVyZXIpYXJnc1syXSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb3h5Lmludm9rZVN1cGVyKG9iaiwgYXJncyk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRXh0VmFsR2VuZXJpY1JlbmRlcktpdChSZW5kZXJLaXQgd3JhcHBlZCkNCi0gICAgew0KLSAgICAgICAgc3VwZXIod3JhcHBlZCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBSZW5kZXJlciBjcmVhdGVXcmFwcGVyKFJlbmRlcmVyIHJlbmRlcmVyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5uZXdJbnN0YW5jZShyZW5kZXJlcik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUyNDE3Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJXcmFwcGVyOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kSW50ZXJjZXB0b3I7Ci1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5LkVuaGFuY2VyOwotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RQcm94eTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGZpbmFsIGNsYXNzIEV4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIgZXh0ZW5kcyBFeHRWYWxSZW5kZXJlcldyYXBwZXIgaW1wbGVtZW50cyBNZXRob2RJbnRlcmNlcHRvcgotewotICAgIHB1YmxpYyBzdGF0aWMgUmVuZGVyZXIgbmV3SW5zdGFuY2UoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSByZW5kZXJlci5nZXRDbGFzcygpOwotCi0gICAgICAgIC8vdG8gYXZvaWQgcmUtd3JhcHBpbmcgLSBvY2N1cnMgZS5nLiB1bmRlciBzb2xhcmlzICsgYmVhIHdlYmxvZ2ljCi0gICAgICAgIGlmIChjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCIkJEVuaGFuY2VyQnlDR0xJQiQkIikgfHwKLSAgICAgICAgICAgIGN1cnJlbnRDbGFzcy5nZXROYW1lKCkuY29udGFpbnMoIiQkRmFzdENsYXNzQnlDR0xJQiQkIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJlcjsKLSAgICAgICAgfQotCi0gICAgICAgIEVuaGFuY2VyIGVuaGFuY2VyID0gbmV3IEVuaGFuY2VyKCk7Ci0gICAgICAgIGVuaGFuY2VyLnNldFN1cGVyY2xhc3MocmVuZGVyZXIuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIGVuaGFuY2VyLnNldENhbGxiYWNrKG5ldyBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyKHJlbmRlcmVyKSk7Ci0KLSAgICAgICAgcmV0dXJuIChSZW5kZXJlcikgZW5oYW5jZXIuY3JlYXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBpbnRlcmNlcHQoT2JqZWN0IG9iaiwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncywgTWV0aG9kUHJveHkgcHJveHkpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0Q29udmVydGVkVmFsdWUiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDb252ZXJ0ZWRWYWx1ZSgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdLCBhcmdzWzJdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZGVjb2RlIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWNvZGUoKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImVuY29kZUJlZ2luIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGVCZWdpbigoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZW5jb2RlQ2hpbGRyZW4iKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZUNoaWxkcmVuKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJlbmNvZGVFbmQiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZUVuZCgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiY29udmVydENsaWVudElkIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRDbGllbnRJZCgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChTdHJpbmcpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldFJlbmRlcnNDaGlsZHJlbiIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm1ldGhvZCAiICsgbWV0aG9kLmdldE5hbWUoKSArICIgY2FsbGVkIHdpdGhvdXQgcmVuZGVyaW5nLWludGVyY2VwdG9ycyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcHJveHkuaW52b2tlU3VwZXIob2JqLCBhcmdzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlcihSZW5kZXJlciB3cmFwcGVkKQotICAgIHsKLSAgICAgICAgc3VwZXIod3JhcHBlZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NWQyOGIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5DQotew0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyS2l0IGNyZWF0ZVdyYXBwZXIoUmVuZGVyS2l0IHJlbmRlcktpdCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVya2l0IHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcktpdC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgdmlhIGNnbGliIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5uZXdJbnN0YW5jZShyZW5kZXJLaXQpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9zdGFydHVwL0dlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9zdGFydHVwL0dlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhjN2I0MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkFic3RyYWN0U3RhcnR1cExpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdC5HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBHZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jbGFzcykuYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkobmV3IEdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjljMzllLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGUgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlIHByb3ZpZGVzIGdlbmVyaWMgU3VwcG9ydCBmb3IgSlNGIGNvbXBvbmVudCBmcmFtZXdvcmtzIHdoaWNoIGhhdmUgc3BlY2lhbCByZXF1aXJlbWVudHMgKGUuZy4gUmljaEZhY2VzLCBNeUZhY2VzIFRvYmFnbywgLi4uKS4NCi0gIA0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS4xLnggYW5kIEpTRiAxLjIueC4gQm90aCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41Kw0KLSAgDQotICAgIA0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC9wb20ueG1sIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMjEwNjcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+Y29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBDb21wb25lbnQtU3VwcG9ydCBNb2R1bGVzPC9uYW1lPgotICAgIDx2ZXJzaW9uPjEuMS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMV8xL2NvbXBvbmVudC1zdXBwb3J0LzwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC88L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzFfMS9jb21wb25lbnQtc3VwcG9ydC88L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxtb2R1bGVzPgotICAgICAgICA8bW9kdWxlPnRyaW5pZGFkLXN1cHBvcnQ8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5nZW5lcmljLXN1cHBvcnQ8L21vZHVsZT4KLSAgICA8L21vZHVsZXM+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDx0cmluaWRhZC52ZXJzaW9uPjEuMC41PC90cmluaWRhZC52ZXJzaW9uPgotICAgIDwvcHJvcGVydGllcz4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9wb20ueG1sIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg3NTQ0ZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPgotCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZTwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmVlMzg1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQwotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMC8vRU4iCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlcy1jb25maWc+Ci0gICAgPGxpZmVjeWNsZT4KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0YXJ0dXAuVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIKLSAgICAgICAgPC9waGFzZS1saXN0ZW5lcj4KLSAgICA8L2xpZmVjeWNsZT4KLQotICAgIDxsaWZlY3ljbGU+Ci0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj4KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyCi0gICAgICAgIDwvcGhhc2UtbGlzdGVuZXI+Ci0gICAgPC9saWZlY3ljbGU+Ci08L2ZhY2VzLWNvbmZpZz4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNiNGRiYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0LkV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5OwotCi0vKioKLSAqIHVzZSB0aGlzIHBoYXNlLWxpc3RlbmVyIGluc3RlYWQgb2YgYSBFeHRWYWxUcmluaWRhZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGR1ZSB0byBhIHRyaW5pZGFkIGlzc3VlCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcgotewotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBldmVudCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICAgIGlmKGV2ZW50LmdldFBoYXNlSWQoKSAhPSBQaGFzZUlkLkFQUExZX1JFUVVFU1RfVkFMVUVTICYmIGV2ZW50LmdldFBoYXNlSWQoKSAhPSBQaGFzZUlkLlJFTkRFUl9SRVNQT05TRSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsKLQotICAgICAgICBSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnkgPSAoUmVuZGVyS2l0RmFjdG9yeSkKLSAgICAgICAgICAgIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShGYWN0b3J5RmluZGVyLlJFTkRFUl9LSVRfRkFDVE9SWSk7Ci0KLSAgICAgICAgU3RyaW5nIHJlbmRlcktpdElkID0gZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZ2V0UmVuZGVyS2l0SWQoKTsKLQotICAgICAgICBpZihFeHRWYWxUcmluaWRhZFJlbmRlcktpdC5JRC5lcXVhbHMocmVuZGVyS2l0SWQpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBSZW5kZXJLaXQgcmVuZGVyS2l0ID0gcmVuZGVyS2l0RmFjdG9yeS5nZXRSZW5kZXJLaXQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCByZW5kZXJLaXRJZCk7Ci0gICAgICAgIHJlbmRlcktpdEZhY3RvcnkuYWRkUmVuZGVyS2l0KEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LklELCBuZXcgRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQocmVuZGVyS2l0KSk7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLnNldFJlbmRlcktpdElkKEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LklEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQaGFzZUlkLlJFTkRFUl9SRVNQT05TRTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzhhMWUzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJlbid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIC8qDQotICAgICAqIGRlYWN0aXZhdGUNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9DTElFTlRfU0lERV9UUklOSURBRF9WQUxJREFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0NMSUVOVF9TSURFX1RSSU5JREFEX1ZBTElEQVRJT04iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX1RSSU5JREFEX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1RSSU5JREFEX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SIik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvRG91YmxlUmFuZ2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2RiZjEyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkRvdWJsZVJhbmdlVmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERvdWJsZVJhbmdlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW5mb3JtYXRpb25BZGRlZCA9IGZhbHNlOwotICAgICAgICBEb3VibGVSYW5nZVZhbGlkYXRvciBsZW5ndGhWYWxpZGF0b3IgPSAoRG91YmxlUmFuZ2VWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkRvdWJsZVJhbmdlIik7Ci0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTik7Ci0KLSAgICAgICAgICAgIGlmKG1pbiBpbnN0YW5jZW9mIERvdWJsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWluaW11bSgoRG91YmxlKW1pbik7Ci0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1heExlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYKTsKLQotICAgICAgICAgICAgaWYobWF4TGVuZ3RoIGluc3RhbmNlb2YgRG91YmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNYXhpbXVtKChEb3VibGUpbWF4TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcihsZW5ndGhWYWxpZGF0b3IpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9MZW5ndGhJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xlbmd0aEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMTkxZjguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xlbmd0aEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkxlbmd0aFZhbGlkYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJza2lwVmFsaWRhdGlvblN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24iKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBMZW5ndGhJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7Ci0gICAgICAgIC8vVE9ETwotICAgICAgICBMZW5ndGhWYWxpZGF0b3IgbGVuZ3RoVmFsaWRhdG9yID0gKExlbmd0aFZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTGVuZ3RoIik7Ci0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbWluID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIKTsKLQotICAgICAgICAgICAgaWYobWluIGluc3RhbmNlb2YgSW50ZWdlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWluaW11bSgoSW50ZWdlciltaW4pOwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKTsKLQotICAgICAgICAgICAgaWYobWF4TGVuZ3RoIGluc3RhbmNlb2YgSW50ZWdlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudC5nZXRDbGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldE1heGltdW1MZW5ndGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LmNsYXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhMZW5ndGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWF4aW11bSgoSW50ZWdlciltYXhMZW5ndGgpOwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9yZUluaXRWYWxpZGF0b3JzKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50LCBtZXRhRGF0YSk7IC8vc2VhcmNoIHdyYXBwZXJzIGFuZCBjYWxsIC5kZWFjdGl2YXRlCi0KLSAgICAgICAgaWYoaW5mb3JtYXRpb25BZGRlZCkKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IobGVuZ3RoVmFsaWRhdG9yKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTG9uZ1JhbmdlSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Mb25nUmFuZ2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzI5MDc1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Mb25nUmFuZ2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5Mb25nUmFuZ2VWYWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgTG9uZ1JhbmdlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW5mb3JtYXRpb25BZGRlZCA9IGZhbHNlOwotICAgICAgICBMb25nUmFuZ2VWYWxpZGF0b3IgbGVuZ3RoVmFsaWRhdG9yID0gKExvbmdSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTG9uZ1JhbmdlIik7Ci0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTik7Ci0KLSAgICAgICAgICAgIGlmKG1pbiBpbnN0YW5jZW9mIExvbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1pbmltdW0oKExvbmcpbWluKTsKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpOwotCi0gICAgICAgICAgICBpZihtYXhMZW5ndGggaW5zdGFuY2VvZiBMb25nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNYXhpbXVtKChMb25nKW1heExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYoaW5mb3JtYXRpb25BZGRlZCkKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IobGVuZ3RoVmFsaWRhdG9yKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MDc5OWQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1BhdHRlcm5Jbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5SZWdFeHBWYWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUGF0dGVybkluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZighbWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4pKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBwYXR0ZXJucyA9IChTdHJpbmdbXSltZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4pOwotCi0gICAgICAgIFJlZ0V4cFZhbGlkYXRvciByZWdFeHBWYWxpZGF0b3I7Ci0KLSAgICAgICAgZm9yKFN0cmluZyBwYXR0ZXJuIDogcGF0dGVybnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZ0V4cFZhbGlkYXRvciA9IChSZWdFeHBWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5SZWdFeHAiKTsKLQotICAgICAgICAgICAgcmVnRXhwVmFsaWRhdG9yLnNldFBhdHRlcm4ocGF0dGVybik7Ci0gICAgICAgICAgICByZWdFeHBWYWxpZGF0b3Iuc2V0TWVzc2FnZURldGFpbE5vTWF0Y2goKFN0cmluZyltZXRhRGF0YS5nZXQoCi0gICAgICAgICAgICAgICAgQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFKSk7Ci0KLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKHJlZ0V4cFZhbGlkYXRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1JlcXVpcmVkSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MWU5MGEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1JlcXVpcmVkSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBSZXF1aXJlZEluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpIHx8Ci0gICAgICAgICAgIG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKXx8Ci0gICAgICAgICAgIG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQpKSB8fAotICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSkKLSAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMoaXNDb21wb25lbnRSZXF1aXJlZCh1aUNvbXBvbmVudCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJgotICAgICAgICAgICAgICAgICAgICFCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEJvb2xlYW4gaXNDb21wb25lbnRSZXF1aXJlZChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIC8vY29tcGFyZSB3aXRoIGZhbHNlIHNvIHRydWUgPSB0cnVlIG9yIG51bGwKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc1JlYWRPbmx5IikpKTsKLSAgICAgICAgYm9vbGVhbiBpc0Rpc2FibGVkID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc0Rpc2FibGVkIikpKTsKLQotICAgICAgICByZXR1cm4gIShpc1JlYWRPbmx5IHx8IGlzRGlzYWJsZWQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDY0Y2UxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29udGV4dC5SZXF1ZXN0Q29udGV4dDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9URVhUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXRUZXh0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXREYXRlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8VHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcj4gY29tcG9uZW50SW5pdGlhbGl6ZXJzID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyPigpOwotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBSZXF1aXJlZEluaXRpYWxpemVyKCkpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBMZW5ndGhJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgTG9uZ1JhbmdlSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IERvdWJsZVJhbmdlSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFBhdHRlcm5Jbml0aWFsaXplcigpKTsKLSAgICAgICAgLy9jb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBWYWxpZGF0b3JJbml0aWFsaXplcigpKTsKLSAgICB9Ci0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkxPVywgZGVzY3JpcHRpb24gPSAiY2hlY2sgcHByIGlzc3VlIikKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBmb3IoVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplciA6IGNvbXBvbmVudEluaXRpYWxpemVycykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoY29tcG9uZW50SW5pdGlhbGl6ZXIuY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVwZGF0ZUNvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKSB8fAotICAgICAgICAgICAgICAgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFLmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmKFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmlzUGFydGlhbFJlcXVlc3QoZmFjZXNDb250ZXh0KSkKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuYWRkUGFydGlhbFRhcmdldCh1aUNvbXBvbmVudC5nZXRQYXJlbnQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVmFsaWRhdG9ySW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGJjZDBjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24odmFsdWUgPSBVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gImltcGwuIHRyaW5pZGFkIGUtbWFpbCB2YWxpZGF0b3IiKQotcHVibGljIGNsYXNzIFZhbGlkYXRvckluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZighbWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLkNVU1RPTSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuQ1VTVE9NKTsKLQotICAgICAgICBpZighKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvcihPYmplY3QgY3VycmVudFZhbHVlIDogKExpc3QpdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCEoY3VycmVudFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoQ29tbW9uTWV0YURhdGFLZXlzLkVNQUlMLmVxdWFscyhjdXJyZW50VmFsdWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vVE9ETwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjIxMjhkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dFRleHQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUuaW5wdXQuQ29yZUlucHV0RGF0ZSI7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IGdldExhYmVsKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgICAgICBpZihsYWJlbCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbGFiZWwgPSB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvL292ZXJyaWRlIHRoZSBsYWJlbCBpZiB0aGUgYW5ub3RhdGlvbiBwcm92aWRlcyBhIGxhYmVsDQotICAgICAgICAgICAgaWYobWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxhYmVsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCwgU3RyaW5nLmNsYXNzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvUGxhY2VMYWJlbChmYWNlc01lc3NhZ2UsIGxhYmVsLCBpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gVFJJTklEQURfQ09SRV9JTlBVVF9URVhULmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSkgfHwNCi0gICAgICAgICAgICAgICBUUklOSURBRF9DT1JFX0lOUFVUX0RBVEUuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRMYWJlbChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldExhYmVsIikpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlY2EyMWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcktpdDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuUmVuZGVyS2l0RGVjb3JhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnJlbmRlcmtpdC5jb3JlLkNvcmVSZW5kZXJLaXQ7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVzcG9uc2VTdGF0ZU1hbmFnZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVdyaXRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LlJlc3BvbnNlU3RyZWFtOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQgZXh0ZW5kcyBSZW5kZXJLaXREZWNvcmF0b3IKLXsKLSAgICBwcm90ZWN0ZWQgRXh0VmFsUmVuZGVyS2l0IGV4dFZhbFJlbmRlcktpdDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIkVYVFZBTF9UUklOSURBRF9SRU5ERVJLSVQiOwotCi0gICAgcHVibGljIEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0KFJlbmRlcktpdCB3cmFwcGVkKQotICAgIHsKLSAgICAgICAgdGhpcy5leHRWYWxSZW5kZXJLaXQgPSBuZXcgRXh0VmFsUmVuZGVyS2l0KHdyYXBwZWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgdGhpcy5leHRWYWxSZW5kZXJLaXQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIHJlbmRlcmVyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVuZGVyZXIgZ2V0UmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5nZXRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlc3BvbnNlU3RhdGVNYW5hZ2VyIGdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5nZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZXNwb25zZVdyaXRlciBjcmVhdGVSZXNwb25zZVdyaXRlcihXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcywgU3RyaW5nIHMxKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmNyZWF0ZVJlc3BvbnNlV3JpdGVyKHdyaXRlciwgcywgczEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZXNwb25zZVN0cmVhbSBjcmVhdGVSZXNwb25zZVN0cmVhbShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmNyZWF0ZVJlc3BvbnNlU3RyZWFtKG91dHB1dFN0cmVhbSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZWNvcmF0ZWRSZW5kZXJLaXRJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gQ29yZVJlbmRlcktpdC5CQVNFX1JFTkRFUl9LSVRfSUQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjI3MDFmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuY29yZS54aHRtbC50YWJsZS5UYWJsZVJlbmRlcmluZ0NvbnRleHQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBzb2x1dGlvbiBmb3IgdHJpbmlkYWQgdGFibGUgcmVuZGVyZXIgaXNzdWUgKGluIGNvbm5lY3Rpb24gd2l0aCBkb3VibGUgY2FsbCBwcmV2ZW50aW9uIHByb3hpZXMpDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eSBleHRlbmRzIEV4dFZhbFJlbmRlcmVyUHJveHkNCi17DQotICAgIHB1YmxpYyBFeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkoUmVuZGVyZXIgcmVuZGVyZXIpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKHJlbmRlcmVyKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcHRpb25hbEtleShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYoVGFibGVSZW5kZXJpbmdDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJ8IiArIFRhYmxlUmVuZGVyaW5nQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRSZW5kZXJTdGFnZSgpLmdldFN0YWdlKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gIiI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDYxZjRmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkFic3RyYWN0U3RhcnR1cExpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50LlRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQuRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3IuVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBhbHRlcm5hdGl2ZSBhcHByb2FjaCBmb3IgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFRyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ3ZWIueG1sIHBhcmFtZXRlciB0byBkZWFjdGl2YXRlIGl0IikNCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIGluaXRUcmluaWRhZFN1cHBvcnQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFRyaW5pZGFkU3VwcG9ydCgpDQotICAgIHsNCi0gICAgICAgIC8vZGVhY3RpdmF0ZSBkZWZhdWx0IGFwcHJvYWNoDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jbGFzcykuZGVhY3RpdmF0ZSgpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgZGVhY3RpdmF0ZUNsaWVudFNpZGVWYWxpZGF0aW9uID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ0xJRU5UX1NJREVfVFJJTklEQURfVkFMSURBVElPTjsNCi0NCi0gICAgICAgIGlmKGRlYWN0aXZhdGVDbGllbnRTaWRlVmFsaWRhdGlvbiA9PSBudWxsIHx8ICFkZWFjdGl2YXRlQ2xpZW50U2lkZVZhbGlkYXRpb24uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZENvbXBvbmVudEluaXRpYWxpemVyKG5ldyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIGRlYWN0aXZhdGVUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA9DQotICAgICAgICAgICAgICAgIFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX1RSSU5JREFEX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SOw0KLQ0KLSAgICAgICAgaWYoZGVhY3RpdmF0ZVRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yID09IG51bGwgfHwNCi0gICAgICAgICAgICAgICAgIWRlYWN0aXZhdGVUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKG5ldyBUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vZGVhY3RpdmF0ZSBleHR2YWwgcmVuZGVyZXIgcHJveHkgLSBkdWUgdG8gYW4gaW5jb21wYXRpYmlsaXR5IHdpdGggdGhlIHRhYmxlIHJlbmRlcmVyDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVksIEV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIGlmIHRoZXJlIGFyZSBmdXJ0aGVyIGluY29tcGF0aWJsZSByZW5kZXJlcnMgdXNlIHRoZSBmb2xsb3dpbmcgcXVpY2stZml4Og0KLSAgICAgICAgICogICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVksIG51bGwpOw0KLSAgICAgICAgICAgYXR0ZW50aW9uOiBpdCBjYXVzZXMgZGlyZWN0IGRlbGVnYXRpb24gd2l0aG91dCBhIGNoZWNrIG9mIGRvdWJsZSBpbnZvY2F0aW9ucw0KLSAgICAgICAgICovDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDViM2E1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRhYWU2NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IKLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjQ5NTk4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgVHJpbmlkYWQgU3VwcG9ydCBNb2R1bGUNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgVHJpbmlkYWQgU3VwcG9ydCBNb2R1bGUgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZSBwcm92aWRlcyBzcGVjaWFsIFRyaW5pZGFkIFN1cHBvcnQgZm9yIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IuDQotICAgIEZ1cnRoZXJtb3JlLCBpdCBhbGxvd3MgdG8gam9pbiB0aGUgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBtZWNoYW5pc20gb2YgVHJpbmlkYWQuIFNhbXBsZSB1c2UtY2FzZTogYW5ub3RhdGUgeW91ciBtb2RlbCB3aXRoIEpQQSAxLjAgYW5ub3RhdGlvbnMsIGJpbmQgcHJvcGVydGllcyB0byBKU0YgSW5wdXQgY29tcG9uZW50cyBhbmQgZ2V0IGF1dG9tYXRpYyBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIGp1c3QgYnkgYWRkaW5nIDMgSkFSIGZpbGVzIChNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUsIFByb3BlcnR5IFZhbGlkYXRpb24gYW5kIFRyaW5pZGFkIFN1cHBvcnQpLg0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS4xLnggYW5kIEpTRiAxLjIueC4gQm90aCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3BvbS54bWwgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTdlZGJiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4xLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIENvcmU8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4xLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgICAKLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS88L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy9icmFuY2hfZm9yX2pzZl8xXzEvY29yZS88L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzFfMS9jb3JlLzwvdXJsPgotICAgIDwvc2NtPgotICAgIAotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtY29kZWM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvZGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzA0NDc2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCFET0NUWVBFIGZhY2VzLWNvbmZpZyBQVUJMSUMNCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiINCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxmYWNlcy1jb25maWc+DQotICAgIDxmYWN0b3J5Pg0KLSAgICAgICAgPHJlbmRlci1raXQtZmFjdG9yeT5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyS2l0RmFjdG9yeTwvcmVuZGVyLWtpdC1mYWN0b3J5Pg0KLSAgICA8L2ZhY3Rvcnk+DQotDQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5FeHRWYWxTdGFydHVwTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM5ZjM1Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZG9udCd0IG1vdmUgdG8gYW4gb3RoZXIgcGFja2FnZSEhIQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIEV4dFZhbEluZm9ybWF0aW9uDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FID0gRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJYTUxfUEFSQU1fUFJFRklYID0gRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gIjEuMS4xIjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9DdXN0b21JbmZvcm1hdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9DdXN0b21JbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzI4ODFjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ3VzdG9tSW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkNCi1wdWJsaWMgZW51bSBDdXN0b21JbmZvcm1hdGlvbg0KLXsNCi0gICAgQkFTRV9QQUNLQUdFLA0KLSAgICBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiwNCi0NCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYLA0KLSAgICBWQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWCwNCi0gICAgTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVgsDQotDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfVE9fTVNHX1JFU09MVkVSX05BTUVfTUFQUEVSLA0KLSAgICBNRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUiwNCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIsDQotDQotICAgIFNUQVJUVVBfTElTVEVORVIsDQotICAgIENPTVBPTkVOVF9JTklUSUFMSVpFUiwNCi0gICAgVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IsDQotDQotICAgIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwNCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLA0KLSAgICBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLA0KLSAgICBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwNCi0NCi0gICAgTUVTU0FHRV9CVU5ETEVfTkFNRSwNCi0gICAgU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dC5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NmM0NjcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlJlbmRlcmVySW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5RmluZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRGVmYXVsdEZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBFeHRWYWxDb250ZXh0Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBFeHRWYWxDb250ZXh0IGV4dFZhbENvbnRleHQgPSBuZXcgRXh0VmFsQ29udGV4dCgpOwotCi0gICAgcHJpdmF0ZSBGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIgPSBuZXcgRGVmYXVsdEZhY3RvcnlGaW5kZXIoKTsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFJlbmRlcmVySW50ZXJjZXB0b3I+IHJlbmRlcmVySW50ZXJjZXB0b3JzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBSZW5kZXJlckludGVyY2VwdG9yPigpOwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGRlbmllZEludGVyY2VwdG9ycyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIHByaXZhdGUgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyPiBwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycyA9Ci0gICAgICAgIG5ldyBBcnJheUxpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcj4oKTsKLQotICAgIHByaXZhdGUgTGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4gY29tcG9uZW50SW5pdGlhbGl6ZXJzOwotICAgIHByaXZhdGUgTGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+IHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnM7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2xvYmFsUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLCBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+Pj4gc3RhdGljQ29uZmlnTWFwCi0gICAgICAgID0gbmV3IEhhc2hNYXA8U3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLCBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+Pj4oKTsKLQotCi0gICAgcHJpdmF0ZSB2b2lkIGxhenlJbml0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMuY29tcG9uZW50SW5pdGlhbGl6ZXJzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuY29tcG9uZW50SW5pdGlhbGl6ZXJzID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4oKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMKLSAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9DT01QT05FTlRfSU5JVElBTElaRVIpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMKLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX0lOSVRJQUxJWkVSKSk7Ci0KLSAgICAgICAgQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXI7Ci0gICAgICAgIGZvciAoU3RyaW5nIGNvbXBvbmVudEluaXRpYWxpemVyTmFtZSA6IGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXIgPQotICAgICAgICAgICAgICAgIChDb21wb25lbnRJbml0aWFsaXplcikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNvbXBvbmVudEluaXRpYWxpemVyTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChjb21wb25lbnRJbml0aWFsaXplciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQoY29tcG9uZW50SW5pdGlhbGl6ZXIpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoY29tcG9uZW50SW5pdGlhbGl6ZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxhenlJbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBpZih0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+KCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SKTsKLSAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldCgKLSAgICAgICAgICAgICAgICAgICAgQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IpKTsKLQotICAgICAgICBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lIDogdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yID0KLSAgICAgICAgICAgICAgICAoVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUpOwotCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycy5hZGQodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEV4dFZhbENvbnRleHQgZ2V0Q29udGV4dCgpCi0gICAgewotICAgICAgICByZXR1cm4gZXh0VmFsQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmFjdG9yeUZpbmRlciBnZXRGYWN0b3J5RmluZGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWN0b3J5RmluZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZhY3RvcnlGaW5kZXIoRmFjdG9yeUZpbmRlciBmYWN0b3J5RmluZGVyKQotICAgIHsKLSAgICAgICAgaWYoZmFjdG9yeUZpbmRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZhY3RvcnlGaW5kZXIgPSBmYWN0b3J5RmluZGVyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UmVuZGVyZXJJbnRlcmNlcHRvcj4gZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8UmVuZGVyZXJJbnRlcmNlcHRvcj4ocmVuZGVyZXJJbnRlcmNlcHRvcnMudmFsdWVzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKEV4dFZhbENvbnRleHQuY2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZW5pZWRJbnRlcmNlcHRvcnMuY29udGFpbnMocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvcnMucHV0KHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpLCByZW5kZXJlckludGVyY2VwdG9yKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihDbGFzcyByZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpCi0gICAgewotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgPQotICAgICAgICAgICAgKFJlbmRlcmVySW50ZXJjZXB0b3IpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcyk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChFeHRWYWxDb250ZXh0LmNsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9ycy5yZW1vdmUocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy9pZiBhbiBpbnRlcmNlcHRvciBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkIHNvIGZhciwgaXQgc2hvdWxkIGJlIGRlbmllZCBhdCBmdXR1cmUgcmVnaXN0cmF0aW9ucwotICAgIHB1YmxpYyB2b2lkIGRlbnlSZW5kZXJlckludGVyY2VwdG9yKENsYXNzIHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcykKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA9Ci0gICAgICAgICAgICAoUmVuZGVyZXJJbnRlcmNlcHRvcikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3MocmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKEV4dFZhbENvbnRleHQuY2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbmllZEludGVyY2VwdG9ycy5hZGQocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpOwotICAgICAgICB9Ci0gICAgICAgIGRlcmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIoQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIpCi0gICAgewotICAgICAgICBsYXp5SW5pdENvbXBvbmVudEluaXRpYWxpemVycygpOwotICAgICAgICB0aGlzLmNvbXBvbmVudEluaXRpYWxpemVycy5hZGQoY29tcG9uZW50SW5pdGlhbGl6ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPiBnZXRDb21wb25lbnRJbml0aWFsaXplcnMoKQotICAgIHsKLSAgICAgICAgbGF6eUluaXRDb21wb25lbnRJbml0aWFsaXplcnMoKTsKLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudEluaXRpYWxpemVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIGxhenlJbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICB0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMuYWRkKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPiBnZXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGxhenlJbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyPiBnZXRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycygpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcihQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyIHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIpCi0gICAgewotICAgICAgICB0aGlzLnByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzLmFkZChwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQotICAgIHsKLSAgICAgICAgTWFwIGFwcGxpY2F0aW9uTWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uTWFwKCk7Ci0gICAgICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGJlYW4gPSAoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4pIGFwcGxpY2F0aW9uTWFwLmdldChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUpOwotCi0gICAgICAgIGlmIChiZWFuID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbml0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oYXBwbGljYXRpb25NYXApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotICAgIHByaXZhdGUgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gaW5pdEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKE1hcCBhcHBsaWNhdGlvbk1hcCkKLSAgICB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fSU5GT1JNQVRJT05fUFJPVklERVJfQkVBTik7Ci0gICAgICAgIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lcy5hZGQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQ1VTVE9NX0JFQU4pOwotCi0gICAgICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuOwotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgaWYgKGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXBwbGljYXRpb25NYXAucHV0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSwgaW5mb3JtYXRpb25Qcm92aWRlckJlYW4pOwotICAgICAgICAgICAgICAgIHJldHVybiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeVRvSW5pdEN1c3RvbUNvbmZpZ3VyZWRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZShhcHBsaWNhdGlvbk1hcCk7Ci0KLSAgICAgICAgaWYoYXBwbGljYXRpb25NYXAuY29udGFpbnNLZXkoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbilhcHBsaWNhdGlvbk1hcC5nZXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvSW5pdEN1c3RvbUNvbmZpZ3VyZWRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZShNYXAgYXBwbGljYXRpb25NYXApCi0gICAgewotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBiZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpCi0gICAgICAgICAgICAuZ2V0QmVhbihJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5DVVNUT01fQkVBTi5yZXBsYWNlKCIuIiwgIl8iKSk7Ci0KLSAgICAgICAgaWYoYmVhbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcHBsaWNhdGlvbk1hcC5wdXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FLCBiZWFuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBnZXRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcyBuYW1lKQotICAgIHsKLSAgICAgICAgaWYoIXRoaXMuc3RhdGljQ29uZmlnTWFwLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBzdGF0aWNDb25maWdMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4oKTsKLSAgICAgICAgICAgIHRoaXMuc3RhdGljQ29uZmlnTWFwLnB1dChuYW1lLCBzdGF0aWNDb25maWdMaXN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5zdGF0aWNDb25maWdNYXAuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzIG5hbWUsIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZykKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gc3RhdGljQ29uZmlnTGlzdDsKLSAgICAgICAgICAgIGlmKCF0aGlzLnN0YXRpY0NvbmZpZ01hcC5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0aWNDb25maWdMaXN0ID0gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4oKTsKLSAgICAgICAgICAgICAgICB0aGlzLnN0YXRpY0NvbmZpZ01hcC5wdXQobmFtZSwgc3RhdGljQ29uZmlnTGlzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLnN0YXRpY0NvbmZpZ01hcC5nZXQobmFtZSkuYWRkKHN0YXRpY0NvbmZpZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRHbG9iYWxQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFkZEdsb2JhbFByb3BlcnR5KG5hbWUgLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYWRkR2xvYmFsUHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBmb3JjZU92ZXJyaWRlKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5nbG9iYWxQcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZighZm9yY2VPdmVycmlkZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIm92ZXJyaWRlIGdsb2JhbCBwcm9wZXJ0eSAnIiArIG5hbWUgKyAiJyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuZ2xvYmFsUHJvcGVydGllcy5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2xvYmFsUHJvcGVydGllcy5nZXQobmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmMzMTE2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcmVuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqICsgc29tZSBvZiB0aGVtIGNhbiBiZSBjdXN0b21pemVkIHdpdGhpbiBhIGN1c3RvbSBpbXBsLiBvZiB0aGUgYmVhbg0KLSAqIChleHRlbmQgdGhpcyBjbGFzcyBhbmQgcHJvdmlkZSBpdCB2aWEgY29udmVudGlvbiBvciB3ZWIueG1sKQ0KLSAqIDxwLz4NCi0gKiB0aGUgc3RhdGljIGFwaSBzaG91bGQgb25seSBiZSB1c2VkDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEksIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFQU5fTkFNRSA9IEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FDQotICAgICAgICArICIuIiArIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsNCi0gICAgLy9jdXN0b20gY2xhc3Mgd2hpY2ggaXMgYW4gb3B0aW9uYWwgcmVwbGFjZW1lbnQgZm9yIHRoaXMgY2xhc3MgKGhhcyB0byBleHRlbmQgdGhpcyBjbGFzcykNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0JFQU4gPSAoRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUNCi0gICAgICAgICsgIi5jdXN0b20uIiArIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7DQotDQotICAgIHB1YmxpYyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotDQotICAgICAgICBzZXR1cEN1c3RvbWl6YWJsZUluZm9ybWF0aW9uKCk7DQotICAgICAgICBhcHBseUN1c3RvbVZhbHVlcyh0aGlzLmN1c3RvbWl6YWJsZUluZm9zKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxDdXN0b21JbmZvcm1hdGlvbiwgU3RyaW5nPiBjdXN0b21pemFibGVJbmZvcyA9IG5ldyBIYXNoTWFwPEN1c3RvbUluZm9ybWF0aW9uLCBTdHJpbmc+KCk7DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cEN1c3RvbWl6YWJsZUluZm9ybWF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGJhc2VQYWNrYWdlID0gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9CQVNFX1BBQ0tBR0U7DQotDQotICAgICAgICBpZiAoYmFzZVBhY2thZ2UgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBiYXNlUGFja2FnZSA9IEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsgIi5jdXN0b20uIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghYmFzZVBhY2thZ2UuZW5kc1dpdGgoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBiYXNlUGFja2FnZSA9IGJhc2VQYWNrYWdlICsgIi4iOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkJBU0VfUEFDS0FHRSwgYmFzZVBhY2thZ2UpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SLA0KLSAgICAgICAgICAgICAgICAiQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgsDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uU3RyYXRlZ3kiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfUE9TVEZJWCwNCi0gICAgICAgICAgICAgICAgIk1ldGFEYXRhVHJhbnNmb3JtZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWCwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9JTklUSUFMSVpFUiwNCi0gICAgICAgICAgICAgICAgIkNvbXBvbmVudEluaXRpYWxpemVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IsDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01TR19SRVNPTFZFUl9OQU1FX01BUFBFUiwNCi0gICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUiwNCi0gICAgICAgICAgICAiTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUiwNCi0gICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVJUVVBfTElTVEVORVIsDQotICAgICAgICAgICAgICAgICJTdGFydHVwTGlzdGVuZXIiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIk1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Iik7DQotDQotICAgICAgICAvL2NvbnZlbnRpb25zICh0aGUgcmVzdCBvZiB0aGUgY29udmVudGlvbnMgYXJlIGJ1aWx0IHdpdGggdGhlIGhlbHAgb2YgbmFtZSBtYXBwZXJzLC4uLg0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FU1NBR0VfQlVORExFX05BTUUsDQotICAgICAgICAgICAgICAgICJ2YWxpZGF0aW9uX21lc3NhZ2VzIik7DQotICAgICAgICAvL3N0YXRpYyBzdHJhdGVneSBtYXBwaW5ncyAobmFtZSBvZiBwcm9wZXJ0eSBmaWxlcykNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5TVEFUSUNfU1RSQVRFR1lfTUFQUElOR19TT1VSQ0UsDQotICAgICAgICAgICAgICAgICJzdHJhdGVneV9tYXBwaW5ncyIpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGFwcGx5Q3VzdG9tVmFsdWVzKE1hcDxDdXN0b21JbmZvcm1hdGlvbiwgU3RyaW5nPiBtYXApDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgdG8gY3VzdG9taXplIGluZm9ybWF0aW9uDQotICAgIH0NCi0NCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXQoQ3VzdG9tSW5mb3JtYXRpb24gY3VzdG9tSW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGN1c3RvbWl6YWJsZUluZm9zLmdldChjdXN0b21JbmZvcm1hdGlvbik7DQotDQotICAgICAgICBzd2l0Y2ggKGN1c3RvbUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNhc2UgQkFTRV9QQUNLQUdFOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgKiBwb3N0Zml4IHVzZWQgYnkgdGhlIFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi0gICAgICAgICAgICAgKiB0aGUgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBpcyBmb3IgY3VzdG9tIHN0cmF0ZWdpZXMgb25seQ0KLSAgICAgICAgICAgICAqIChub3QgZm9yIHB1YmxpYyB2YWxpZGF0aW9uIG1vZHVsZXMpDQotICAgICAgICAgICAgICogc28gaXQncyBmaW5lIHRvIGN1c3RvbWl6ZSBpdA0KLSAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgY2FzZSBWQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVg6DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0NCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9taXphYmxlSW5mb3MuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkJBU0VfUEFDS0FHRSkgKyB2YWx1ZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOWY4NjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2R1bGVNZXNzYWdlQnVuZGxlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuZXdQYWNrYWdlTmFtZTsNCi0gICAgICAgIGlmIChwYWNrYWdlTmFtZS5lbmRzV2l0aCgiLnJlc29sdmVyIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgbmV3UGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZS5yZXBsYWNlKCIucmVzb2x2ZXIiLCAiLmJ1bmRsZSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5ld1BhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUucmVwbGFjZSgiLnJlc29sdmVyLiIsICIuYnVuZGxlLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG5ld1BhY2thZ2VOYW1lICsgIi52YWxpZGF0aW9uX21lc3NhZ2VzIjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKA0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsICIubWVzc2FnZS5yZXNvbHZlci4iLCB0YXJnZXRDbGFzc05hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoDQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgU3RyaW5nIHRhcmdldENsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgIi5tZXRhZGF0YS50cmFuc2Zvcm1lci4iLCB0YXJnZXRDbGFzc05hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UGFja2FnZU5hbWUsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXROYW1lKCk7DQotDQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUucmVwbGFjZSgiLnN0cmF0ZWd5LiIsIHRhcmdldFBhY2thZ2VOYW1lKTsNCi0NCi0gICAgICAgIGlmICh0YXJnZXRDbGFzc05hbWUgPT0gbnVsbCB8fCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSkgKyAiLiIgKyB0YXJnZXRDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHVzZSBhIGN1c3RvbSBuYW1lIG1hcHBlciB0byBpbXBsZW1lbnQgY3VzdG9tIGNvbnZlbnRpb25zDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgIlZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB1c2UgYSBjdXN0b20gbmFtZSBtYXBwZXIgdG8gaW1wbGVtZW50IGN1c3RvbSBjb252ZW50aW9ucw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5LnJlcGxhY2UoIi5hbm5vdGF0aW9uLiIsICIuc3RyYXRlZ3kuIikgKyAiU3RyYXRlZ3kiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgIk1ldGFEYXRhVHJhbnNmb3JtZXIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0YXJnZXRQb3N0Zml4KQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5lbmRzV2l0aCgiVmFsaWRhdGlvblN0cmF0ZWd5IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneU5hbWUuc3Vic3RyaW5nKDAsIHZhbGlkYXRpb25TdHJhdGVneU5hbWUubGVuZ3RoKCkgLSAxOCkgKyB0YXJnZXRQb3N0Zml4Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5lbmRzV2l0aCgiU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5zdWJzdHJpbmcoMCwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5sZW5ndGgoKSAtIDgpICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI5NjE4My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcmVuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgLyoNCi0gICAgICogbWlzYw0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVTU0FHRV9CVU5ETEUgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVNTQUdFX0JVTkRMRSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX1BBQ0tBR0UgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9CQVNFX1BBQ0tBR0UiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fSU5GT1JNQVRJT05fUFJPVklERVJfQkVBTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9TVEFUSUNfVkFMSURBVElPTl9TVFJBVEVHWV9NQVBQSU5HID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORyIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DT01QT05FTlRfSU5JVElBTElaRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT01QT05FTlRfSU5JVElBTElaRVIiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBuYW1lIG1hcHBlcg0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUiIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBmYWN0b3JpZXMNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBkZWFjdGl2YXRlDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfUkVOREVSS0lUID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1JFTkRFUktJVCIpOw0KLQ0KLSAgICAvL2N1cnJlbnRseSBqdXN0IHVzZWQgYnkgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0RFRkFVTFRfQ09OVkVOVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT04iKTsNCi0NCi0gICAgLy90aGVyZSBpcyBub3RoaW5nIGxpa2UgREVBQ1RJVkFURV9ERUZBVUxUX1ZBTElEQVRJT05fSU5URVJDRVBUT1INCi0gICAgLy91c2UgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZGVueVJlbmRlcmVySW50ZXJjZXB0b3IoLi4uKSB3aXRoaW4gYW4gZXh0dmFsLVN0YXJ0dXBMaXN0ZW5lcg0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0Fic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0Fic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNDA1YjAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9BYnN0cmFjdEVMSGVscGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIGRldGFpbHMNCi0gKiBAc2VlIERlZmF1bHRFTEhlbHBlcg0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkgY3VzdG9tRUxIZWxwZXJGYWN0b3J5Ow0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbUVMSGVscGVyRmFjdG9yeShBYnN0cmFjdEVMSGVscGVyRmFjdG9yeSBlbEhlbHBlckZhY3RvcnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3VzdG9tRUxIZWxwZXJGYWN0b3J5ID0gZWxIZWxwZXJGYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBmaW5hbCBFTEhlbHBlciBjcmVhdGUoKQ0KLSAgICB7DQotICAgICAgICBFTEhlbHBlciByZXN1bHQgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYodGhpcy5jdXN0b21FTEhlbHBlckZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSB0aGlzLmN1c3RvbUVMSGVscGVyRmFjdG9yeS5jcmVhdGVFTEhlbHBlcigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUVMSGVscGVyKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBFTEhlbHBlciBjcmVhdGVFTEhlbHBlcigpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBhMTM4YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nOw0KLWltcG9ydCBqYXZhLmlvLkV4dGVybmFsaXphYmxlOw0KLQ0KLS8qKg0KLSAqIGluIG9yZGVyIHRvIGNlbnRyYWxpemUgdGhlIGpzZiB2ZXJzaW9uIGRlcGVuZGVuY3kgd2l0aGluIHRoZSBjb3JlDQotICoNCi0gKiB0aGlzIGVsLWhlbHBlciBzdXBwb3J0cyBqc3AgYW5kIGZhY2VsZXRzICh0ZXN0ZWQgd2l0aCAxLjEuMTQpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIHRoZXJlIGlzIGEgc3BlY2lhbCBmYWNlbGV0cyB3b3JrYXJvdW5kIGZvciBlbC1leHByZXNzaW9ucyBvZiBjdXN0b20gY29tcG9uZW50cw0KLSAqIGl0J3MgcGx1Z2dhYmxlIGluIG9yZGVyIHRvIHN1cHBvcnQgc3BlY2lhbCBtZWNoYW5pc21zIG9mIGRpZmZlcmVudCB0ZWNobm9sb2dpZXMgKHRoYW4ganNwIGFuZCBmYWNlbGV0cykNCi0gKiBzbyB5b3UgY2FuIHBsdWcgaW4geW91ciBvd24gaW1wbC4gd2hpY2ggaW1wbGVtZW50cyBhIGN1c3RvbSB3b3JrYXJvdW5kIChsaWtlIHRoZSBmYWNlbGV0cyB3b3JrYXJvdW5kIG9mIHRoaXMgaW1wbC4pDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEVMSGVscGVyIGltcGxlbWVudHMgRUxIZWxwZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0RUxIZWxwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgLy9kdWUgdG8gYSByZXN0cmljdGlvbiB3aXRoIHRoZSByaQ0KLSAgICAgICAgT2JqZWN0IGJlYW4gPSBnZXRWYWx1ZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgcmV0dXJuIChiZWFuICE9IG51bGwpID8gYmVhbi5nZXRDbGFzcygpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oU3RyaW5nIGJlYW5OYW1lKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgcmV0dXJuIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmdldFZhcmlhYmxlUmVzb2x2ZXIoKS5yZXNvbHZlVmFyaWFibGUoZmFjZXNDb250ZXh0LCBiZWFuTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiAhPSBudWxsKSA/IGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgLmNyZWF0ZVZhbHVlQmluZGluZyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSkuZ2V0VmFsdWUoZmFjZXNDb250ZXh0KSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmNyZWF0ZVZhbHVlQmluZGluZyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKSAhPSBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBnZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBib29sZWFuIGFsbG93QmxhbmtDaGFyYWN0ZXJzKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IGdldE9yaWdpbmFsVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih1aUNvbXBvbmVudCk7DQotDQotICAgICAgICAvL2ZvciBpbnB1dCBjb21wb25lbnRzIHdpdGhvdXQgdmFsdWUtYmluZGluZw0KLSAgICAgICAgLy8oZS5nLiBmb3Igc3BlY2lhbCBjb21wb25lbnQgbGlicyAtPiBpc3N1ZSB3aXRoIEV4dFZhbFJlbmRlcmVyV3JhcHBlciNlbmNvZGVCZWdpbikNCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoDQotICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKSArICIgaGFzIG5vIHZhbHVlIGJpbmRpbmcgLSBjb21wb25lbnQgaWQ6ICIgKyB1aUNvbXBvbmVudC5nZXRJZCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBpZighYWxsb3dCbGFua0NoYXJhY3RlcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZSgiICIsICIiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwNCi0gICAgICAgICAgICBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKS5nZXRCYXNlRXhwcmVzc2lvbigpKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gcmVzdWx0ID0gRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyLg0KLSAgICAgICAgICAgICAgICB0cnlUb0NyZWF0ZVZhbHVlQmluZGluZ0ZvckZhY2VsZXRzQmluZGluZyh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICAgICAgaWYocmVzdWx0ID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgcmVzb2x2ZSBleHByZXNzaW9uOiAiICsgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIENsYXNzIGVudGl0eUNsYXNzID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHJlc3VsdC5nZXRCYXNlRXhwcmVzc2lvbigpKTsNCi0NCi0gICAgICAgICAgICBpZihlbnRpdHlDbGFzcyA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IHJlc29sdmUgZXhwcmVzc2lvbjogIiArIHJlc3VsdC5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm9wZXJ0eURldGFpbHMgZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IGdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24odWlDb21wb25lbnQsIGZhbHNlKTsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24gPQ0KLSAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0NCi0gICAgICAgIFN0cmluZyBwYXRoID0gbnVsbDsNCi0NCi0gICAgICAgIHdoaWxlKGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihwYXRoID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwYXRoID0gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcGF0aCA9IGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkgKyAiLiIgKyBwYXRoOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBwYXRoID0gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSArICIuIiArIHBhdGg7DQotDQotICAgICAgICBPYmplY3QgYmFzZU9iamVjdCA9IGdldFZhbHVlT2ZFeHByZXNzaW9uKA0KLSAgICAgICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscyhwYXRoLCBiYXNlT2JqZWN0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLSAgICB9DQotDQotICAgIHN0YXRpYyBTdHJpbmcgZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmcgdmFsdWVFeHByZXNzaW9uID0gdWlDb21wb25lbnQuZ2V0VmFsdWVCaW5kaW5nKCJ2YWx1ZSIpOw0KLQ0KLSAgICAgICAgcmV0dXJuICh2YWx1ZUV4cHJlc3Npb24gIT0gbnVsbCkgPyB2YWx1ZUV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VMVGVybVdlbGxGb3JtZWQoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgVmFsdWVCaW5kaW5nIHx8IG8gaW5zdGFuY2VvZiBFeHRlcm5hbGl6YWJsZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcyA9IG8udG9TdHJpbmcoKTsNCi0gICAgICAgIHJldHVybiAoKHMuY29udGFpbnMoIiMiKSB8fCBzLmNvbnRhaW5zKCIkIikpICYmIHMuY29udGFpbnMoInsiKSAmJiBzLmNvbnRhaW5zKCJ9IikpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmluZGluZ09mQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHVpQ29tcG9uZW50LmdldFZhbHVlQmluZGluZyhuYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2ZlNTZjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RUxIZWxwZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkNCi17DQotICAgIHByaXZhdGUgRUxIZWxwZXIgZWxIZWxwZXIgPSBuZXcgRGVmYXVsdEVMSGVscGVyKCk7DQotICAgIA0KLSAgICBwcm90ZWN0ZWQgRUxIZWxwZXIgY3JlYXRlRUxIZWxwZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5lbEhlbHBlcjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYjI1NTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FTEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIGluIG9yZGVyIHRvIGNlbnRyYWxpemUgdGhlIGpzZiB2ZXJzaW9uIGRlcGVuZGVuY3kgd2l0aGluIHRoZSBjb3JlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIEVMSGVscGVyDQotew0KLSAgICBPYmplY3QgZ2V0QmVhbihTdHJpbmcgYmVhbk5hbWUpOw0KLQ0KLSAgICBPYmplY3QgZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0NCi0gICAgQ2xhc3MgZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLQ0KLSAgICBQcm9wZXJ0eURldGFpbHMgZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpOw0KLQ0KLSAgICBib29sZWFuIGlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLQ0KLSAgICBib29sZWFuIGlzRUxUZXJtV2VsbEZvcm1lZChPYmplY3Qgbyk7DQotDQotICAgIE9iamVjdCBnZXRCaW5kaW5nT2ZDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBuYW1lKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMDE0NjEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogSGVscGVyIGNsYXNzIHRvIGdldCB0aGUgcmVhbC9mdWxsIHZhbHVlIGJpbmRpbmcgLSB0ZXN0ZWQgd2l0aCBmYWNlbGV0cyAxLjEuMTQNCi0gKiBUaGUgdGFyZ2V0IGlzIHRvIGdldCByaWQgb2YgdGhpcyBpbXBsLiAtIGN1cnJlbnRseSBpdCdzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IGN1c3RvbSBmYWNlbGV0cyBjb21wb25lbnRzLg0KLSAqIEFuIGFsdGVybmF0aXZlIHdvdWxkIGJlIGFuIEVMLVJlc29sdmVyIC0gdGhlcmUgYXJlIHN0aWxsIHNvbWUgb3BlbiBpc3N1ZXMgd2l0aCBzdWNoIGFuIGFwcHJvYWNoDQotICogKyBJdCBpc24ndCBhdmFpbGFibGUgd2l0aCBKU0YgMS4xLngNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9DcmVhdGVWYWx1ZUJpbmRpbmdGb3JGYWNlbGV0c0JpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBEZWZhdWx0RUxIZWxwZXIuZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEJpbmRpbmdzID0gZXh0cmFjdEVMVGVybXMoDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmluZGluZ09mQ29tcG9uZW50KHVpQ29tcG9uZW50LCAidmFsdWUiKSk7DQotDQotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZT0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIDEpICsgInsiICsgY3JlYXRlQmluZGluZyhmb3VuZEJpbmRpbmdzLCBtYXBwZWRGYWNlbGV0c1ZhcnMpICsgIn0iKTsNCi0NCi0gICAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YmUuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotDQotICAgICAgICAgICAgaWYoZW50aXR5Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnlUb1JlcGxhY2VWYXJzKHZiZSwgbWFwcGVkRmFjZWxldHNWYXJzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHZiZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVCaW5kaW5nKExpc3Q8U3RyaW5nPiBleHByZXNzaW9ucywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkZWRWaXJ0dWFsTmFtZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGVudHJ5IDogZXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoIlZhbHVlRXhwcmVzc2lvblsiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBmb3VuZEJpbmRpbmdEZXRhaWxzID0gZW50cnkuc3BsaXQoIiAiKTsNCi0gICAgICAgICAgICBpbmRleE9mQmluZGluZ0RldGFpbHMgPSBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKGZvdW5kQmluZGluZ0RldGFpbHMpOw0KLQ0KLSAgICAgICAgICAgIGlmIChpbmRleE9mQmluZGluZ0RldGFpbHMgPT0gLTEpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgYmluZGluZ0RldGFpbHMgPSBmb3VuZEJpbmRpbmdEZXRhaWxzW2luZGV4T2ZCaW5kaW5nRGV0YWlsc10uc3BsaXQoIj0iKTsNCi0NCi0gICAgICAgICAgICBpZiAoYmluZGluZ0RldGFpbHMubGVuZ3RoIDwgMikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGJpbmRpbmdEZXRhaWxzWzFdOw0KLQ0KLSAgICAgICAgICAgIC8vdG8gc3VwcG9ydCBibGFua3Mgd2l0aGluIGEgYmluZGluZyB3aXRoIG1hcCBzeW50YXgNCi0gICAgICAgICAgICBpZihjdXJyZW50QmluZGluZy5jb250YWlucygieyIpICYmICFjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgPSBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKGN1cnJlbnRCaW5kaW5nLCBmb3VuZEJpbmRpbmdEZXRhaWxzLCBpbmRleE9mQmluZGluZ0RldGFpbHMpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnNLZXkoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5wdXQoYmluZGluZ0RldGFpbHNbMF0sIGN1cnJlbnRCaW5kaW5nKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvL2VudHJ5IGZvciAidmlydHVhbCIgZmFjZWxldHMgdmFyDQotICAgICAgICAgICAgaWYoIShjdXJyZW50QmluZGluZy5jb250YWlucygieyIpIHx8IGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhcnMucHV0KGJpbmRpbmdEZXRhaWxzWzBdLCBiaW5kaW5nRGV0YWlsc1sxXS5zdWJzdHJpbmcoMSwgYmluZGluZ0RldGFpbHNbMV0ubGVuZ3RoKCktMikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBvcmlnaW5hbEJpbmRpbmcgPSBhZGRlZFZpcnR1YWxOYW1lcy5nZXQoInZhbHVlIik7DQotICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcuc3Vic3RyaW5nKG9yaWdpbmFsQmluZGluZy5pbmRleE9mKCJ7IikgKyAxLCBvcmlnaW5hbEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLnJlbW92ZSgidmFsdWUiKTsNCi0gICAgICAgIHJldHVybiB0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcob3JpZ2luYWxCaW5kaW5nLCBhZGRlZFZpcnR1YWxOYW1lcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRyeVRvVHJhbnNmb3JtVG9SZWFsQmluZGluZyhTdHJpbmcgb3JpZ2luYWxCaW5kaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZGVkVmlydHVhbE5hbWVzKQ0KLSAgICB7DQotICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSAiI3siICsgb3JpZ2luYWxCaW5kaW5nICsgIn0iOw0KLSAgICAgICAgSXRlcmF0b3IgbmFtZUl0ZXJhdG9yID0gYWRkZWRWaXJ0dWFsTmFtZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsNCi0NCi0gICAgICAgIFN0cmluZyBjdXJyZW50S2V5Ow0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRWYWx1ZTsNCi0gICAgICAgIHdoaWxlKG5hbWVJdGVyYXRvci5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudEtleSA9IChTdHJpbmcpIG5hbWVJdGVyYXRvci5uZXh0KCk7DQotICAgICAgICAgICAgY3VycmVudFZhbHVlID0gYWRkZWRWaXJ0dWFsTmFtZXMuZ2V0KGN1cnJlbnRLZXkpOw0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoY3VycmVudFZhbHVlLmluZGV4T2YoInsiKSArIDEsIGN1cnJlbnRWYWx1ZS5pbmRleE9mKCJ9IikpOw0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJ7IiArIGN1cnJlbnRLZXkgKyAiLiIsICJ7IiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICIuIiwgIi4iICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIl0iLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiXSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG9yaWdpbmFsQmluZGluZy5zdWJzdHJpbmcoMiwgb3JpZ2luYWxCaW5kaW5nLmxlbmd0aCgpIC0gMSk7DQotICAgIH0NCi0NCi0gICAgLy90byBzdXBwb3J0IGJsYW5rcyAtIGUuZy4gd2l0aCBtYXAgc3ludGF4DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKFN0cmluZyBjdXJyZW50QmluZGluZywgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlscykNCi0gICAgew0KLSAgICAgICAgZm9yKGludCBpID0gaW5kZXhPZkJpbmRpbmdEZXRhaWxzICsgMTsgaSA8IGZvdW5kQmluZGluZ0RldGFpbHMubGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgKz0gZm91bmRCaW5kaW5nRGV0YWlsc1tpXTsNCi0gICAgICAgICAgICBpZihmb3VuZEJpbmRpbmdEZXRhaWxzW2ldLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEJpbmRpbmc7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRCaW5kaW5nOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBpbnQgY291bnQgPSAwOw0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBiaW5kaW5nRGV0YWlscykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuY29udGFpbnMoIj0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY291bnQrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZXh0cmFjdEVMVGVybXMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlRUxUZXJtcyhvLCBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKSwgZm91bmRFTFRlcm1zLCAwKSA+IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRFTFRlcm1zOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcmVzb2x2ZUVMVGVybXMoT2JqZWN0IG8sIE1hcDxPYmplY3QsIE9iamVjdD4gdmlzaXRlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMsIGludCBjb3VudCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAobyA9PSBudWxsIHx8IHZpc2l0ZWQuY29udGFpbnNLZXkobykgfHwgY291bnQgPiA1MCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZpc2l0ZWQucHV0KG8sIG51bGwpOw0KLQ0KLSAgICAgICAgaW50IGVsQ291bnQgPSAwOw0KLSAgICAgICAgQ2xhc3MgYyA9IG8uZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIC8vaW5zcGVjdCBtYXBzDQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1hcCkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBmb3IgKE9iamVjdCBlbnRyeSA6ICgoTWFwKSBvKS52YWx1ZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZm91bmQgZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICAgICAgaWYoZW50cnkudG9TdHJpbmcoKS5jb250YWlucygiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKGVudHJ5LnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoZW50cnksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGVsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQobykpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gKytlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9hbmFseXplIGFycmF5cw0KLSAgICAgICAgaWYgKGMuaXNBcnJheSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgobyk7DQotICAgICAgICAgICAgLy9jaGVjayBhcnJheSBbTCAtPiBubyBhcnJheSBvZiBwcmltaXRpdmUgdHlwZXMNCi0gICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMamF2YS5sYW5nLlN0cmluZyIpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChBcnJheS5nZXQobywgaSkpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKEFycmF5LmdldChvLCBpKSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxGaWVsZD4gYXR0cmlidXRlcyA9IGZpbmRBbGxBdHRyaWJ1dGVzKGMsIG5ldyBBcnJheUxpc3Q8RmllbGQ+KCkpOw0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBhdHRyaWJ1dGVzLnRvQXJyYXkobmV3IEZpZWxkW2F0dHJpYnV0ZXMuc2l6ZSgpXSk7DQotDQotICAgICAgICBBY2Nlc3NpYmxlT2JqZWN0LnNldEFjY2Vzc2libGUoZmllbGRzLCB0cnVlKTsNCi0gICAgICAgIGZvciAoRmllbGQgY3VycmVudEZpZWxkIDogZmllbGRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQuZ2V0KG8pID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5nZXRUeXBlKCkuZXF1YWxzKFN0cmluZy5jbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmdldChvKSAhPSBudWxsICYmIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKGN1cnJlbnRGaWVsZC5nZXQobykpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFjdXJyZW50RmllbGQuZ2V0VHlwZSgpLmlzUHJpbWl0aXZlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKGN1cnJlbnRGaWVsZC5nZXQobyksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZWxDb3VudDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEZpZWxkPiBmaW5kQWxsQXR0cmlidXRlcyhDbGFzcyBjLCBMaXN0PEZpZWxkPiBhdHRyaWJ1dGVzKQ0KLSAgICB7DQotICAgICAgICBpZiAoYyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluZEFsbEF0dHJpYnV0ZXMoYy5nZXRTdXBlcmNsYXNzKCksIGF0dHJpYnV0ZXMpOw0KLQ0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBjLmdldERlY2xhcmVkRmllbGRzKCk7DQotICAgICAgICBmb3IgKEZpZWxkIGN1cnJlbnRGaWVsZCA6IGZpZWxkcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzU3RhdGljKGN1cnJlbnRGaWVsZC5nZXRNb2RpZmllcnMoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChjdXJyZW50RmllbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9SZXBsYWNlVmFycyhWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eTsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0gICAgICAgIGJvb2xlYW4gbGFzdCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgd2hpbGUodHJ1ZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxhc3QgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0NCi0gICAgICAgICAgICBwcm9wZXJ0eSA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbg0KLSAgICAgICAgICAgICAgICAucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIGdldE5ld1Byb3BlcnR5KHByb3BlcnR5LCBtYXBwZWRGYWNlbGV0c1ZhcnMpKTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQubGVuZ3RoKCkgPT0gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpICsgIi4iICsgcmVzdWx0Ow0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpOw0KLQ0KLSAgICAgICAgICAgIGlmKGxhc3QpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcmVmaXgoKSArICJ7IiArIHJlc3VsdCArICJ9Iik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5ld1Byb3BlcnR5KFN0cmluZyBvbGRQcm9wZXJ0eSwgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFycyA9IGdldFBvdGVudGlhbFZpcnR1YWxWYXJzKG9sZFByb3BlcnR5KTsNCi0NCi0gICAgICAgIGZvcihTdHJpbmcgdmlydHVhbFZhciA6IHZpcnR1YWxWYXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1hcHBlZEZhY2VsZXRzVmFycy5jb250YWluc0tleSh2aXJ0dWFsVmFyKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG9sZFByb3BlcnR5ID0gcmVwbGFjZVByb3BlcnR5VmFsdWUob2xkUHJvcGVydHksIHZpcnR1YWxWYXIsIG1hcHBlZEZhY2VsZXRzVmFycy5nZXQodmlydHVhbFZhcikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvbGRQcm9wZXJ0eTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0UG90ZW50aWFsVmlydHVhbFZhcnMoU3RyaW5nIG9sZFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpbnQgc3RhcnQgPSAtMTsNCi0gICAgICAgIGludCBlbmQgPSAtMTsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG9sZFByb3BlcnR5Lmxlbmd0aCgpOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoc3RhcnQgPT0gLSAxICYmIG9sZFByb3BlcnR5LmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKChzdGFydCAhPSAtIDEgJiYgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICdbJykgfHwgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICddJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGVuZCA9IGk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKHN0YXJ0ICE9IC0xICYmIGVuZCAhPSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJMaXN0LmFkZChvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOw0KLSAgICAgICAgICAgICAgICBpZihvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbmQgPSAtMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlydHVhbFZhckxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcGxhY2VQcm9wZXJ0eVZhbHVlKFN0cmluZyBvbGRQcm9wZXJ0eSwgU3RyaW5nIHRhcmdldFZhciwgU3RyaW5nIG5ld1ZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpbnQgaW5kZXggPSBvbGRQcm9wZXJ0eS5pbmRleE9mKHRhcmdldFZhcik7DQotDQotICAgICAgICBpZihpbmRleCA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gb2xkUHJvcGVydHk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gb2xkUHJvcGVydHkuc3Vic3RyaW5nKDAsIGluZGV4KTsNCi0gICAgICAgIHJlc3VsdCArPSBuZXdWYWx1ZTsNCi0gICAgICAgIHJldHVybiByZXN1bHQgKyBvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoaW5kZXggKyB0YXJnZXRWYXIubGVuZ3RoKCksIG9sZFByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiByZXBsYWNlIHZpcnR1YWwgZmFjZWxldHMgdmFycyAobWFwIHN5bnRheCkNCi0gICAgICogdGVzdGVkIHN0eWxlcyAoc2ltcGxlIGFuZCBuZXN0ZWQpOiB0ZXN0W2l4W2l4MltpeDNdXV0NCi0gICAgICovDQotICAgIC8qDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBfY3JlYXRlQmluZGluZyhMaXN0PFN0cmluZz4gZXhwcmVzc2lvbnMsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmlydHVhbFZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0NCi0gICAgICAgIFN0cmluZyBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50QmluZGluZzsNCi0gICAgICAgIFN0cmluZyBwYXJ0T2ZCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBleHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aCgiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZvdW5kQmluZGluZ0RldGFpbHMgPSBlbnRyeS5zcGxpdCgiICIpOw0KLSAgICAgICAgICAgIGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoZm91bmRCaW5kaW5nRGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9PSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBiaW5kaW5nRGV0YWlscyA9IGZvdW5kQmluZGluZ0RldGFpbHNbaW5kZXhPZkJpbmRpbmdEZXRhaWxzXS5zcGxpdCgiPSIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nRGV0YWlscy5sZW5ndGggPCAyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYmluZGluZ0RldGFpbHNbMV07DQotDQotICAgICAgICAgICAgLy90byBzdXBwb3J0IGJsYW5rcyB3aXRoaW4gYSBiaW5kaW5nIHdpdGggbWFwIHN5bnRheA0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgJiYgIWN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoY3VycmVudEJpbmRpbmcsIGZvdW5kQmluZGluZ0RldGFpbHMsIGluZGV4T2ZCaW5kaW5nRGV0YWlscyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lICE9IG51bGwgJiYgY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnMoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBwYXJ0T2ZCaW5kaW5nID0gY3VycmVudEJpbmRpbmcuc3Vic3RyaW5nKGN1cnJlbnRCaW5kaW5nLmluZGV4T2YocHJldkZhY2VsZXRzQXR0cmlidXRlTmFtZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICArIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUubGVuZ3RoKCksIGN1cnJlbnRCaW5kaW5nLmluZGV4T2YoIn0iKSk7DQotDQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5hZGQoYmluZGluZ0RldGFpbHNbMF0pOw0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgcGFydE9mQmluZGluZzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICBlbHNlIGlmKCEoY3VycmVudEJpbmRpbmcuY29udGFpbnMoInsiKSB8fCBjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJzLnB1dChiaW5kaW5nRGV0YWlsc1swXSwgYmluZGluZ0RldGFpbHNbMV0uc3Vic3RyaW5nKDEsIGJpbmRpbmdEZXRhaWxzWzFdLmxlbmd0aCgpLTIpKTsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWlucyhiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLmFkZChiaW5kaW5nRGV0YWlsc1swXSk7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyZW50QmluZGluZy5zdWJzdHJpbmcoY3VycmVudEJpbmRpbmcuaW5kZXhPZigieyIpICsgMSwgY3VycmVudEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gYmluZGluZ0RldGFpbHNbMF07DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotICAgICovDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOGFmZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRpZmZlcmVuY2UgYmV0d2VlbiBbIGFuZCBbJyAtIHRlc3Qgd2l0aCBtb3JlIGNvbnN0ZWxsYXRpb25zIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQ0KLXB1YmxpYyBjbGFzcyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotew0KLSAgICBwcml2YXRlIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYmFzZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7DQotICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdG9rZW47DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXBsYWNlT3JBZGRQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlcGxhY2VQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1Byb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkuZW5kc1dpdGgoIiddIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCksIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBhZGRQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIFN0cmluZyBuZXdQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUV4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzb3VyY2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBzb3VyY2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSk7DQotDQotICAgICAgICBpZihuZXdQcm9wZXJ0eS5zdGFydHNXaXRoKCJbJyIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihyZXN1bHQgKyBuZXdQcm9wZXJ0eSArICJ9Iik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHJlc3VsdCArICIuIiArIG5ld1Byb3BlcnR5ICsgIn0iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihTdHJpbmcgZXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgaWYoIUV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKGV4cHJlc3Npb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXhwcmVzc2lvbiArICIgaXMgbm8gdmFsaWQgZWwtZXhwcmVzc2lvbiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW50IGluZGV4MSA9IGV4cHJlc3Npb24ubGFzdEluZGV4T2YoIiddIik7DQotICAgICAgICBpbnQgaW5kZXgyID0gZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiLiIpOw0KLQ0KLSAgICAgICAgaWYoaW5kZXgxID4gaW5kZXgyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnN1YnN0cmluZygwLCBpbmRleDEpOw0KLQ0KLSAgICAgICAgICAgIGludCBpbmRleDMgPSBmaW5kSW5kZXhPZlN0YXJ0aW5nQnJhY2tldChleHByZXNzaW9uKTsNCi0gICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoaW5kZXgzICsgMiwgaW5kZXgxKTsNCi0gICAgICAgICAgICB0aGlzLmJhc2UgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihleHByZXNzaW9uLnN1YnN0cmluZygwLCBpbmRleDMpICsgIn0iKTsNCi0gICAgICAgICAgICB0aGlzLnRva2VuID0gIlsnIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoIGluZGV4MiA+IGluZGV4MSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoaW5kZXgyICsgMSwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEgKTsNCi0gICAgICAgICAgICB0aGlzLmJhc2UgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihleHByZXNzaW9uLnN1YnN0cmluZygwLCBpbmRleDIpICsgIn0iKTsNCi0gICAgICAgICAgICB0aGlzLnRva2VuID0gIi4iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZygyLCBleHByZXNzaW9uLmxlbmd0aCgpIC0gMSk7DQotICAgICAgICAgICAgdGhpcy5wcmVmaXggPSBleHByZXNzaW9uLnN1YnN0cmluZygwLCAxKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUudHJpbSgpOw0KLSAgICAgICAgDQotICAgICAgICBpZigiWyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMudmFsdWUuc3RhcnRzV2l0aCgiJyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUuc3Vic3RyaW5nKDEsIHRoaXMudmFsdWUubGVuZ3RoKCkgLSAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZS52YWx1ZSArIHRoaXMudG9rZW4gKyB0aGlzLnZhbHVlLnN1YnN0cmluZygwLCB0aGlzLnZhbHVlLmxlbmd0aCgpKSArICInXSI7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gZ2V0QmFzZUV4cHJlc3Npb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmFzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4cHJlc3Npb25TdHJpbmcoKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgYmFzZUV4cHJlc3Npb24gPSB0aGlzLmJhc2UuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLQ0KLSAgICAgICAgICAgIGlmKCJbJyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAiJ119IjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAifSI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlZml4ICsgInsiICsgdGhpcy52YWx1ZSArICJ9IjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMuYmFzZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UuZ2V0UHJlZml4KCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5iYXNlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5iYXNlLnNldFByZWZpeChwcmVmaXgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRFeHByZXNzaW9uU3RyaW5nKCkuaGFzaENvZGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uICYmIGdldEV4cHJlc3Npb25TdHJpbmcoKQ0KLSAgICAgICAgICAgIC5lcXVhbHMoKChWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKSB0YXJnZXQpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBpbnQgZmluZEluZGV4T2ZTdGFydGluZ0JyYWNrZXQoU3RyaW5nIGV4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIGludCBjbG9zZUNvdW50ID0gMDsNCi0gICAgICAgIGZvcihpbnQgaSA9IGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxOyBpID4gMDsgaS0tKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGV4cHJlc3Npb24uY2hhckF0KGkpID09ICdbJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNsb3NlQ291bnQtLTsNCi0gICAgICAgICAgICAgICAgaWYoY2xvc2VDb3VudCA8IDApDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYoZXhwcmVzc2lvbi5jaGFyQXQoaSkgPT0gJ10nKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2xvc2VDb3VudCsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9EZWZhdWx0RmFjdG9yeUZpbmRlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0RlZmF1bHRGYWN0b3J5RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZjcxNzcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0RlZmF1bHRGYWN0b3J5RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRGVmYXVsdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8vZHluYW1pYyBhcHByb2FjaCB0byBjcmVhdGUgdGhlIGZhY3RvcmllcyBkdXJpbmcgdGhlIGZpcnN0IHJlcXVlc3QsIHdoZW4gYSBmYWNlcy1jb250ZXh0IGlzIGF2YWlsYWJsZQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWN0b3J5RmluZGVyIGltcGxlbWVudHMgRmFjdG9yeUZpbmRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJvdGVjdGVkIE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4gZmFjdG9yeU1hcCA9IG5ldyBIYXNoTWFwPEZhY3RvcnlOYW1lcywgT2JqZWN0PigpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdEZhY3RvcnlGaW5kZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBmaW5hbCA8VD4gVCBnZXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIGlmKCEoZmFjdG9yeU1hcC5jb250YWluc0tleShmYWN0b3J5TmFtZSkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRGYWN0b3J5KGZhY3RvcnlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoVClmYWN0b3J5TWFwLmdldChmYWN0b3J5TmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgc3dpdGNoIChmYWN0b3J5TmFtZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjYXNlIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlTWVzc2FnZVJlc29sdmVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBSRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBFTF9IRUxQRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZUVMSGVscGVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0OiAvL3JlcXVpcmVkIGJ5IGNoZWNrc3R5bGUNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgcG9zc2libGUgdG8gY3JlYXRlIGZhY3RvcnkgIiArIGZhY3RvcnlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZhY3RvcnlNYXAucHV0KGZhY3RvcnlOYW1lLCBmYWN0b3J5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkpOw0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSk7DQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotICAgICAgICBMaXN0PFN0cmluZz4gbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSk7DQotICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZICk7DQotICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBjcmVhdGVFTEhlbHBlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRFTEhlbHBlckZhY3RvcnkoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmMjYyNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBGYWN0b3J5RmluZGVyCi17Ci0gICAgPFQ+IFQgZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUsIENsYXNzPFQ+IHRhcmdldENsYXNzKTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUxOWRjMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkKLXB1YmxpYyBlbnVtIEZhY3RvcnlOYW1lcwotewotICAgIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLAotICAgIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwKLSAgICBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwKLQotICAgIFJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksCi0gICAgRUxfSEVMUEVSX0ZBQ1RPUlkKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9Db21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDBjZTIyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEFsbG93cyB0byBpbml0aWFsaXplIGNvbXBvbmVudHMgYmVmb3JlRW5jb2RlQmVnaW4uPGJyLz4KLSAqIGUuZy46IHlvdSBjYW4gYWRkIGluZm9ybWF0aW9uIGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIG1lY2hhbmlzbXMsLi4uCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NzE1NDAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBTdGF0aWNDb25maWd1cmF0aW9uPFQsIFI+Ci17Ci0gICAgdm9pZCBzZXRTb3VyY2VPZk1hcHBpbmcoU3RyaW5nIHBhdGgpOwotICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFQsIFI+PiBnZXRNYXBwaW5nKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzMxMGY0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8VCwgUj4KLXsKLSAgICBwcml2YXRlIFQgc291cmNlOwotICAgIHByaXZhdGUgUiB0YXJnZXQ7Ci0KLSAgICBwdWJsaWMgVCBnZXRTb3VyY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoVCBzb3VyY2UpCi0gICAgewotICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUiBnZXRUYXJnZXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRhcmdldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoUiB0YXJnZXQpCi0gICAgewotICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZGE3ZDguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSX0pCi1wdWJsaWMgZW51bSBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMKLXsKLSAgICBNRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9DT05GSUcKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24uamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA4N2QwZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LlJFVVNFfSkKLXB1YmxpYyBjbGFzcyBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPgotewotICAgIHByaXZhdGUgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5ncwotICAgICAgICA9IG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4oKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gZ2V0TWFwcGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gbWFwcGluZ3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgc291cmNlLCBTdHJpbmcgdGFyZ2V0KQotICAgIHsKLSAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA9IG5ldyBTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIGVudHJ5LnNldFNvdXJjZShzb3VyY2UpOwotICAgICAgICBlbnRyeS5zZXRUYXJnZXQodGFyZ2V0KTsKLSAgICAgICAgdGhpcy5tYXBwaW5ncy5hZGQoZW50cnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhNjNjNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuUkVVU0V9KQotcHVibGljIGNsYXNzIFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+Ci17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGF0aDsKLSAgICBwcml2YXRlIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3M7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VPZk1hcHBpbmcoU3RyaW5nIHBhdGgpCi0gICAgewotICAgICAgICB0aGlzLnBhdGggPSBwYXRoOwotICAgICAgICAvL2ZvcmNlIHJlbG9hZAotICAgICAgICBtYXBwaW5ncyA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gZ2V0TWFwcGluZygpCi0gICAgewotICAgICAgICBpZihtYXBwaW5ncyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbWFwcGluZ3M7Ci0gICAgICAgIH0KLQotICAgICAgICBtYXBwaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4oKTsKLQotICAgICAgICBSZXNvdXJjZUJ1bmRsZSBtYXBwaW5nID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHBhdGgpOwotCi0gICAgICAgIGlmIChtYXBwaW5nID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vbG9nZ2luZwotICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIEVudW1lcmF0aW9uIGtleXMgPSBtYXBwaW5nLmdldEtleXMoKTsKLQotICAgICAgICBTdHJpbmcgbWV0YURhdGFLZXk7Ci0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7Ci0KLSAgICAgICAgd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFEYXRhS2V5ID0gKFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lID0gbWFwcGluZy5nZXRTdHJpbmcobWV0YURhdGFLZXkpOwotCi0gICAgICAgICAgICBhZGRNYXBwaW5nKG1ldGFEYXRhS2V5LCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXBwaW5nczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgbWV0YURhdGFLZXksIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpCi0gICAgewotICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5ID0gbmV3IFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgZW50cnkuc2V0U291cmNlKG1ldGFEYXRhS2V5KTsKLSAgICAgICAgZW50cnkuc2V0VGFyZ2V0KHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSk7Ci0gICAgICAgIHRoaXMubWFwcGluZ3MuYWRkKGVudHJ5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkM2YwNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFJlbmRlcmVySW50ZXJjZXB0b3IKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcigpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0SW50ZXJjZXB0b3JJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRSZXR1cm5WYWx1ZU9uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBza2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLCBPYmplY3QgY3VycmVudFJldHVyblZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnRSZXR1cm5WYWx1ZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICogYmVmb3JlCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBhZnRlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFmdGVyRGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyRW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyRW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZnRlckdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9SZW5kZXJlckludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZjI3NTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9SZW5kZXJlckludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogQWxsb3dzIHRvIGludGVyY2VwdCByZW5kZXJlciBtZXRob2RzLjxici8+Ci0gKiBCYXNlIG1lY2hhbmlzbSBvZiBleHR2YWwuIEl0IGFsbG93cyB0byBhZGQgY3VzdG9tIGluZnJhc3RydWN0dXJlcy4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIFN0cmluZyBnZXRJbnRlcmNlcHRvcklkKCk7Ci0KLSAgICBPYmplY3QgZ2V0UmV0dXJuVmFsdWVPblNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oCi0gICAgICAgIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gc2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiwgT2JqZWN0IGN1cnJlbnRSZXR1cm5WYWx1ZSk7Ci0KLSAgICAvKgotICAgICAqIGJlZm9yZQotICAgICAqLwotICAgIHZvaWQgYmVmb3JlRGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlRW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgLyoKLSAgICAgKiBhZnRlcgotICAgICAqLwotICAgIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyRW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdjMDlhYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gaW50ZXJjZXB0IHZhbGlkYXRpb3IgZXhjZXB0aW9ucy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yDQotew0KLSAgICAvKioNCi0gICAgICoNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IHRoZSBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gbWV0YURhdGFFbnRyeSB0aGUgbWV0YSBkYXRhIGVudHJ5IHdoaWNoIGNvbnRhaW5zIHRoZSBtZXRhIGRhdGEgb2YgdGhlIHByb3BlcnR5DQotICAgICAqIEBwYXJhbSBjb252ZXJ0ZWRPYmplY3QgdGhlIGNvbnZlcnRlZCB1c2VyIGlucHV0DQotICAgICAqIEBwYXJhbSB2YWxpZGF0b3JFeGNlcHRpb24gdGhlIGN1cnJlbnQgZXhjZXB0aW9uDQotICAgICAqIEBwYXJhbSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UgdmFsaWRhdGlvbiBzdHJhdGVneSB3aGljaCB0aHJldyB0aGUgZXhjZXB0aW9uDQotICAgICAqIEByZXR1cm4gZmFsc2UgdG8gc3RvcCB0aHJvd2luZyB0aGUgZXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFmY2M0Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlci5Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpbml0Q29tcG9uZW50KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBpZighKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHRvIGluaXQgY29tcG9uZW50ICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5OwotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7Ci0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IgPSBFeHRWYWxVdGlscy5nZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcigpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KS5nZXRNZXRhRGF0YUVudHJpZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOwotCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIXNraXBWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHZhbGlkYXRpb25TdHJhdGVneSwgZW50cnkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IEV4dFZhbFV0aWxzLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KTsKLQotICAgICAgICAgICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcobWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbWV0YURhdGFUcmFuc2Zvcm1lci5jb252ZXJ0TWV0YURhdGEoZW50cnkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYobWV0YURhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMoZW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCBCb29sZWFuLmNsYXNzKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YS5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9nZXQgY29tcG9uZW50IGluaXRpYWxpemVyIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQgYW5kIGNvbmZpZ3VyZSBpdAotICAgICAgICAgICAgICAgIC8vYWxzbyBpbiBjYXNlIG9mIHNraXBwZWQgdmFsaWRhdGlvbiB0byByZXNldCBlLmcuIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiaW5pdCBjb21wb25lbnQgb2YgIiArIHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0ID0gd3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLQotICAgICAgICAvL3JlY29yZGUgdXNlciBpbnB1dCBlLmcuIGZvciBjcm9zcy1jb21wb25lbnQgdmFsaWRhdGlvbgotICAgICAgICBmb3IoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciByZWNvcmRlciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlY29yZGVyLnJlY29yZFVzZXJJbnB1dCh1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsKLQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHJlY29yZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjYWxsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb2Nlc3NWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpCi0gICAgewotICAgICAgICBpZiAoISh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCB2YWxpZGF0aW9uIik7Ci0gICAgICAgIH0KLQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5OwotCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gRXh0VmFsVXRpbHMuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKTsKLQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpLmdldE1ldGFEYXRhRW50cmllcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7Ci0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihza2lwVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uU3RyYXRlZ3ksIGVudHJ5KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJ2YWxpZGF0ZSAiICsgZW50cnkuZ2V0VmFsdWUoKSArICIgd2l0aCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBlbnRyeSwgY29udmVydGVkT2JqZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gdmFsaWRhdGlvbiBzdHJhdGVneSBmb3VuZCBmb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgidmFsaWRhdGlvbiBmaW5pc2hlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2tpcFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgZW50cnkpCi0gICAgewotICAgICAgICAvL292ZXJyaWRlIGZvciBjdXN0b20gc2tpcCB2YWxpZGF0aW9uIHN1cHBvcnQgKGlmIG5lZWRlZCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNTc4YzUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbi4gU3ViY2xhc3NlcyBqdXN0IGhhdmUgdG8gbm93IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgbmFtZSBtYXBwZXIuDQotICoNCi0gKiBOYW1lTWFwcGVycyBhcmUgc3RhdGVsZXNzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFQ+IGltcGxlbWVudHMgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJpdmF0ZSBOYW1lTWFwcGVyPFQ+IGN1c3RvbU5hbWVNYXBwZXI7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShUIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGN1c3RvbU5hbWVNYXBwZXIgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpOw0KLQ0KLSAgICAgICAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU5hbWVNYXBwZXIgPSAoTmFtZU1hcHBlcjxUPikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChjdXN0b21OYW1lTWFwcGVyICE9IG51bGwpID8gY3VzdG9tTmFtZU1hcHBlci5jcmVhdGVOYW1lKHNvdXJjZSkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9DbGFzc01hcHBpbmdGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9DbGFzc01hcHBpbmdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OGQ3M2MuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIENsYXNzTWFwcGluZ0ZhY3Rvcnk8UCwgUj4KLXsKLSAgICBSIGNyZWF0ZShQIHNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YjZkNDMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBuYW1lIG1hcHBlcnMuDQotICogQSBuYW1lIG1hcHBlciBjYWxjdWxhdGVzIGEgbmFtZSBmb3IgYSBnaXZlbiBzb3VyY2Ugb2JqZWN0Lg0KLSAqIGUuZy4gTWV0YS1EYXRhIEtleSAoZS5nLjogYW5ub3RhdGlvbiBjbGFzcyBuYW1lKSAtPiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgU3RyaW5nIGNyZWF0ZU5hbWUoVCBzb3VyY2UpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL0NvbW1vbk1ldGFEYXRhS2V5cy5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyOGJhZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL0NvbW1vbk1ldGFEYXRhS2V5cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBoZWxwZXIgZm9yIGZyZXF1ZW50IG1ldGEtZGF0YSBrZXlzCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotLyoKLSAqIHBsYWNlZCBpbiBjb3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgaW5mb3JtYXRpb24gaW4gbXVsdGlwbGUgbW9kdWxlcyAodmFsaWRhdGlvbiBtb2R1bGUgYW5kIGNvbXBvbmVudC1zdXBwb3J0IG1vZHVsZSkKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBpbnRlcmZhY2UgQ29tbW9uTWV0YURhdGFLZXlzCi17Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRCA9ICJyZXF1aXJlZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFLX1JFUVVJUkVEID0gIndlYWtfcmVxdWlyZWQiOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5fTEVOR1RIID0gIm1pbl9sZW5ndGgiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0xFTkdUSCA9ICJtYXhfbGVuZ3RoIjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOR0VfTUlOID0gInJhbmdlX21pbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9NQVggPSAicmFuZ2VfbWF4IjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUVEVSTiA9ICJwYXR0ZXJuIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFID0gInBhdHRlcm5fdmFsaWRhdGlvbl9lcnJvcl9tZXNzYWdlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQUlMID0gImVtYWlsIjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NID0gImN1c3RvbSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lQX1ZBTElEQVRJT04gPSAic2tpcF92YWxpZGF0aW9uIjsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvTWV0YURhdGFFbnRyeS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9NZXRhRGF0YUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyY2I1OGYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9NZXRhRGF0YUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBEYXRhIGhvbGRlciB3aGljaCBzdG9yZXMgdGhlIG1ldGEtZGF0YSBhbmQgc29tZSBpbmZvcm1hdGlvbiB3aGVyZSB0aGUgbWV0YS1kYXRhIHdhcyBhcm91bmQuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgTWV0YURhdGFFbnRyeQotewotICAgIHByaXZhdGUgU3RyaW5nIGtleTsKLSAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRLZXkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gVCBnZXRWYWx1ZShDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVClnZXRWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpZ2V0UHJvcGVydHkoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMmY0YTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhbGwgZmFjdG9yaWVzIHdoaWNoIGNyZWF0ZSBtZXRhLWRhdGEgZXh0cmFjdG9ycwotICogCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ci17Ci0gICAgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlKCk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGY3ZTMzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBleHRyYWN0cyBtZXRhLWRhdGEgKGUuZy4gdGhlIGFubm90YXRpb25zKSBvZiB0aGUgdmFsdWUgYmluZGluZyBvZiBhIGNvbXBvbmVudC4KLSAqIEl0IGV4dHJhY3RzIHRoZSBtZXRhLWRhdGEgb2YgdGhlIGZpZWxkIGFuZCB0aGUgcHJvcGVydHkuCi0gKiAoQWxzbyB0aGUgYW5ub3RhdGlvbnMgb2Ygc3VwZXIgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcy4pCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3RvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQotICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOwotCi0gICAgICAgIC8vc2hvdWxkIG5ldmVyIG9jY3VyCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpICYmIG9iamVjdCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4ob2JqZWN0LmdldENsYXNzKCkgKyAiIGlzIG5vIHZhbGlkIGNvbXBvbmVudCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCA9IChVSUNvbXBvbmVudCkgb2JqZWN0OwotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGV4dHJhY3RpbmcgbWV0YS1kYXRhIG9mICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5RGV0YWlscyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGdldCBiZWFuIGNsYXNzIGFuZCBwcm9wZXJ0eSBuYW1lCi0gICAgICAgICAqLwotICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKTsKLQotICAgICAgICAvL2NyZWF0ZQotICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnNldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIHByb3BlcnR5RGV0YWlscyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZmluZCBhbmQgYWRkIGFubm90YXRpb25zCi0gICAgICAgICAqLwotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSBlbnRpdHlDbGFzczsKLQotICAgICAgICB3aGlsZSAoIU9iamVjdC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGN1cnJlbnRDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICAgICAgYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9ucyhjdXJyZW50Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudENsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IGVudGl0eUNsYXNzLmdldEludGVyZmFjZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudEludGVyZmFjZTsKLQotICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRDbGFzcyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoY3VycmVudENsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0KLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0cmFjdCBmaW5pc2hlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIHByb3BlcnR5ID0gcHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSk7Ci0KLSAgICAgICAgTWV0aG9kIG1ldGhvZDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0aG9kID0gZW50aXR5LmdldERlY2xhcmVkTWV0aG9kKCJnZXQiICsgcHJvcGVydHkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kID0gZW50aXR5LmdldERlY2xhcmVkTWV0aG9kKCJpcyIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJtZXRob2Qgbm90IGZvdW5kIC0gY2xhc3M6ICIgKyBlbnRpdHkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgLSBtZXRob2RzOiAiICsgImdldCIgKyBwcm9wZXJ0eSArICIgIiArICJpcyIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoQXJyYXlzLmFzTGlzdChtZXRob2QuZ2V0QW5ub3RhdGlvbnMoKSksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBGaWVsZCBmaWVsZDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmllbGQgPSBlbnRpdHkuZ2V0RGVjbGFyZWRGaWVsZChwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWVsZCA9IGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKCJfIiArIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZmllbGQgIiArIHByb3BlcnR5ICsgIiBvciBfIiArIHByb3BlcnR5ICsgIiBub3QgZm91bmQiLCBlMSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoQXJyYXlzLmFzTGlzdChmaWVsZC5nZXRBbm5vdGF0aW9ucygpKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoCi0gICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMsIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uYWRkTWV0YURhdGFFbnRyeShjcmVhdGVNZXRhRGF0YUVudHJ5Rm9yQW5ub3RhdGlvbihhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShhbm5vdGF0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmb3VuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1ldGFEYXRhRW50cnkgY3JlYXRlTWV0YURhdGFFbnRyeUZvckFubm90YXRpb24oQW5ub3RhdGlvbiBmb3VuZEFubm90YXRpb24pCi0gICAgewotICAgICAgICBNZXRhRGF0YUVudHJ5IGVudHJ5ID0gbmV3IE1ldGFEYXRhRW50cnkoKTsKLQotICAgICAgICBlbnRyeS5zZXRLZXkoZm91bmRBbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgZW50cnkuc2V0VmFsdWUoZm91bmRBbm5vdGF0aW9uKTsKLQotICAgICAgICByZXR1cm4gZW50cnk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDgwZDc5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGlzIGZhY3RvcnkgY3JlYXRlcyBhIG1ldGEtZGF0YSBleHRyYWN0b3Igd2hpY2ggZXh0cmFjdHMgdGhlIG1ldGEtZGF0YQotICogb2YgdGhlIHZhbHVlIGJpbmRpbmcgb2YgYSBjb21wb25lbnQuCi0gKiA8cC8+Ci0gKiBvcmRlcjo8YnIvPgotICogPG9sPgotICogICA8bGk+Y29uZmlndXJlZCBtZXRhLWRhdGEgZXh0cmFjdG9yICh3ZWIueG1sKTwvbGk+Ci0gKiAgIDxsaT5jb25maWd1cmVkIG1ldGEtZGF0YSBleHRyYWN0b3IgKGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pPC9saT4KLSAqICAgPGxpPmRlZmF1bHQgaW1wbGVtZW50YXRpb248L2xpPgotICogPC9vbD4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkKLXsKLSAgICBwcml2YXRlIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gbnVsbDsKLQotICAgIHB1YmxpYyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQotICAgIHB1YmxpYyBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGUoKQotICAgIHsKLSAgICAgICAgaWYgKG1ldGFEYXRhRXh0cmFjdG9yID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SKTsKLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SKSk7Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMuYWRkKERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3IgPSAoTWV0YURhdGFFeHRyYWN0b3IpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1ldGFEYXRhRXh0cmFjdG9yICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKG1ldGFEYXRhRXh0cmFjdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjcmVhdGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWV0YURhdGFFeHRyYWN0b3I7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL01ldGFEYXRhRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNDA1MWQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLQotLyoqCi0gKiBBbiBtZXRhLWRhdGEgZXh0cmFjdG9yIGlzIHJlc3BvbnNpYmxlIHRvIGFuYWx5emUgYW4gb2JqZWN0Ci0gKiBhbmQgcmV0dXJucyBhbGwgYXZhaWxhYmxlIG1ldGEtZGF0YSBpbmZvcm1hdGlvbgotICogCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFFeHRyYWN0b3IKLXsKLSAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5OTEyYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSBlcXVpdmFsZW50IHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0Lg0KLSAqDQotICogaWYgdGhlcmUgaXMgYWxzbyBhIHByb3h5IGZvciB0aGUgZXh0cmFjdG9yIHlvdSBjYW4gdXNlIHRoZSBjbGFzc05hbWUgcHJvcGVydHkgdG8gbWFudWFsbHkgcmVwZWF0IHRoZQ0KLSAqIGZ1bGwgcXVhbGlmaWVkIGNsYXNzIG5hbWUuDQotICoNCi0gKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgaW50ZXJmYWNlIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlciBleHRlbmRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbC5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZWE4MTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgZXF1aXZhbGVudCB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0gKg0KLSAqIGlmIHRoZXJlIGlzIGFsc28gYSBwcm94eSBmb3IgdGhlIHRyYW5zZm9ybWVyIHlvdSBjYW4gdXNlIHRoZSBjbGFzc05hbWUgcHJvcGVydHkgdG8gbWFudWFsbHkgcmVwZWF0IHRoZQ0KLSAqIGZ1bGwgcXVhbGlmaWVkIGNsYXNzIG5hbWUuDQotICoNCi0gKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgY2xhc3MgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbCBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXIsIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIHByaXZhdGUgU3RyaW5nIG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWU7DQotDQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKG1ldGFEYXRhRW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoU3RyaW5nIG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSA9IG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhVHJhbnNmb3JtZXIoTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXIgPSBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODliYzM4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyDQotICAgICAgICAuQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcg0KLSAgICAgICAgLkN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXINCi0gICAgICAgIC5EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyDQotICAgICAgICAuU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyDQotICAgICAgICAuQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0NCi0vKioNCi0gKiBGYWN0b3J5IHdoaWNoIGNyZWF0ZXMgdGhlIE1ldGFEYXRhVHJhbnNmb3JtZXIgZm9yIGEgZ2l2ZW4gVmFsaWRhdGlvblN0cmF0ZWd5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIFZhbGlkYXRpb25TdHJhdGVneSAtPiBNZXRhRGF0YVRyYW5zZm9ybWVyIGluc3RlYWQgb2YgTWV0YS1EYXRhIC0+IE1ldGFEYXRhVHJhbnNmb3JtZXINCi0gKiB0byBhdm9pZCBhIHNlY29uZCBzdGF0aWMgbWFwcGluZyBlLmcuIGZvciBqcGEgYW5ub3RhdGlvbnMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWV0YURhdGFUcmFuc2Zvcm1lcj4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZzsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IG5hbWVNYXBwZXJMaXN0DQotICAgICAgICA9IG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PigpOw0KLQ0KLSAgICBzdGF0aWMNCi0gICAgew0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIG5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFUcmFuc2Zvcm1lciBjcmVhdGUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgPSBudWxsOw0KLQ0KLSAgICAgICAgLy9wcm94eSBjaGVjaw0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vaW4gY2FzZSBvZiBhIHByb3h5IGFuZCB0aGUgdXNhZ2Ugb2YgYSBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcg0KLSAgICAgICAgZWxzZSBpZiAodmFsaWRhdGlvblN0cmF0ZWd5IGluc3RhbmNlb2YgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSA9ICgoQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIpdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRTdGF0aWNNYXBwaW5ncygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcuY29udGFpbnNLZXkodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChNZXRhRGF0YVRyYW5zZm9ybWVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSgNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZy5nZXQodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICAgICAgU3RyaW5nIHRyYW5zZm9ybWVyTmFtZTsNCi0gICAgICAgIC8vbnVsbCAtPiB1c2UgbmFtZSBtYXBwZXJzDQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiBuYW1lTWFwcGVyIDogbmFtZU1hcHBlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJhbnNmb3JtZXJOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKHZhbGlkYXRpb25TdHJhdGVneSk7DQotDQotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWVyTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSAoTWV0YURhdGFUcmFuc2Zvcm1lcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodHJhbnNmb3JtZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIHRyYW5zZm9ybWVyTmFtZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIHN5bmNocm9uaXplZCAoRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgICAgICAvL3NldHVwIGludGVybmFsIHN0YXRpYyBtYXBwaW5ncw0KLSAgICAgICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnIDoNCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9DT05GSUcpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBTdHJhdGVneU1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3MpDQotICAgIHsNCi0gICAgICAgIGZvcihTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IG1hcHBpbmcgOiBtYXBwaW5ncykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNYXBwaW5nKG1hcHBpbmcuZ2V0U291cmNlKCksIG1hcHBpbmcuZ2V0VGFyZ2V0KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgdHJhbnNmb3JtZXJOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImFkZGluZyB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1ldGEtZGF0YSB0cmFuc2Zvcm1lciBtYXBwaW5nOiAiDQotICAgICAgICAgICAgICAgICsgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArICIgLT4gIiArIHRyYW5zZm9ybWVyTmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBzeW5jaHJvbml6ZWQgKERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5jbGFzcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLnB1dCh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCB0cmFuc2Zvcm1lck5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNTA0YjIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEFsbG93cyB0byB0cmFuc2Zvcm0gY29uY3JldGUgbWV0YS1kYXRhIHRvIGEgbW9yZSBhYnN0cmFjdCBmb3JtLjxici8+DQotICogZS5nLjogQFJlcXVpcmVkLCBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsLi4uKSwgQExlbmd0aChtaW5pbXVtID0gMSksIC4uLiAtPiByZXF1aXJlZCA9IHRydWUNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi0vLypUcmFuc2Zvcm1lciBpbnN0ZWFkIG9mICpDb252ZXJ0ZXIgdG8gYXZvaWQgbmFtaW5nIGNvbmZ1c2lvbiANCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGEpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTM0ZmYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcgotICAgIGltcGxlbWVudHMgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzMzFlMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIC0gaWYgdGhlcmUgaXMgYSBwcm94eSBhcm91bmQgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5IGluc3RhbmNlb2YgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICgoQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIpdmFsaWRhdGlvblN0cmF0ZWd5KS5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3YjJkOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKiAoY29uZmlndXJlZCB2aWEgd2ViLnhtbCkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2FjZDExLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gTWV0YURhdGFUcmFuc2Zvcm1lcnMuDQotICogKGNvbmZpZ3VyZWQgdmlhIGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pDQotICogVGhlIGJlYW4gcHJvdmlkZXMgdGhlIGRlZmF1bHQgbmFtZSAoY29udmVudGlvbikuDQotICogSXQncyBwb3NzaWJsZSB0byBwcm92aWRlIGEgY3VzdG9tIGZ1bGwgcXVhbGlmaWVkIG5hbWUuICg9IGN1c3RvbWl6YWJsZSBjb252ZW50aW9uKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViZWRiMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIG1hcHMgRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1ldGFEYXRhVHJhbnNmb3JtZXJzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksIGdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwOWVmMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIHRvIHBsYWNlIFZhbGlkYXRpb25TdHJhdGVnaWVzIGFuZCBNZXRhRGF0YVRyYW5zZm9ybWVycyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZ2V0U2ltcGxlTWV0YURhdGFUcmFuc2Zvcm1lck5hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArICIuIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTWV0YURhdGFUcmFuc2Zvcm1lck5hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneVBhY2thZ2VOYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcG9zdGZpeCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYKTsNCi0NCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5lbmRzV2l0aCgiVmFsaWRhdGlvblN0cmF0ZWd5IikgfHwNCi0gICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5lbmRzV2l0aCgiU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUgKyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCkgLHBvc3RmaXgpDQotICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgiVmFsaWRhdGlvblN0cmF0ZWd5IiwgcG9zdGZpeCkNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCJTdHJhdGVneSIsIHBvc3RmaXgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGEgc3RhdGljIHZhbGlkYXRpb24gc3RyYXRlZ3kgbWFwcGluZw0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneVBhY2thZ2VOYW1lICsgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lICsgcG9zdGZpeDsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjk0OGEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24gaW1wbGVtZW50cyBQcm9wZXJ0eUluZm9ybWF0aW9uCi17Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGluZm9ybWF0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhRW50cnk+IG1ldGFEYXRhTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFbnRyeT4oKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zSW5mb3JtYXRpb24oU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbk1hcC5jb250YWluc0tleShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbk1hcC5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpIGdldEluZm9ybWF0aW9uKGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaW5mb3JtYXRpb25NYXAucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRhRGF0YUVudHJ5W10gZ2V0TWV0YURhdGFFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtZXRhRGF0YUxpc3QudG9BcnJheShuZXcgTWV0YURhdGFFbnRyeVttZXRhRGF0YUxpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpCi0gICAgewotICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnRpZXModGhpcy5pbmZvcm1hdGlvbk1hcCk7Ci0gICAgICAgIHRoaXMubWV0YURhdGFMaXN0LmFkZChtZXRhRGF0YUVudHJ5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eURldGFpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwMzdjZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5RGV0YWlscwotewotICAgIC8vZm9ybXMgdGhlIGlkIGZvciBjcm9zcy12YWxpZGF0aW9uIHdpdGhpbiBjb21wbGV4IGNvbXBvbmVudHMKLSAgICBwcml2YXRlIFN0cmluZyBrZXk7Ci0gICAgcHJpdmF0ZSBPYmplY3QgYmFzZU9iamVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eURldGFpbHMoU3RyaW5nIGtleSwgT2JqZWN0IGJhc2VPYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgICAgICB0aGlzLmJhc2VPYmplY3QgPSBiYXNlT2JqZWN0OwotICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRLZXkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmFzZU9iamVjdCgpCi0gICAgewotICAgICAgICByZXR1cm4gYmFzZU9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlT2JqZWN0KE9iamVjdCBiYXNlT2JqZWN0KQotICAgIHsKLSAgICAgICAgdGhpcy5iYXNlT2JqZWN0ID0gYmFzZU9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxNzNlNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlJbmZvcm1hdGlvbgotewotICAgIGJvb2xlYW4gY29udGFpbnNJbmZvcm1hdGlvbihTdHJpbmcga2V5KTsKLSAgICBPYmplY3QgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSk7Ci0gICAgPFQ+IFQgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpOwotICAgIHZvaWQgc2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKTsKLQotICAgIE1ldGFEYXRhRW50cnlbXSBnZXRNZXRhRGF0YUVudHJpZXMoKTsKLSAgICB2b2lkIGFkZE1ldGFEYXRhRW50cnkoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRlOTI1Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzCi17Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ERVRBSUxTID0gInByb3BlcnR5X2RldGFpbHMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9WQUxJREFUSU9OID0gInNraXBfdmFsaWRhdGlvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJsYWJlbCI7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlY29yZGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzBmMjNmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLQotLyoqCi0gKiBBbGxvd3MgdG8gY2FwdHVyZSBjb252ZXJ0ZWQgdmFsdWVzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyCi17Ci0gICAgdm9pZCByZWNvcmRVc2VySW5wdXQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MjVhNjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5DbGFzc01hcHBpbmdGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLQotLyoqCi0gKiBCYXNlIGZvciBhbGwgUmVuZGVyS2l0V3JhcHBlckZhY3RvcmllcyB0byBmb3JjZSBhIHNwZWNpZmljIGJlaGF2aW91cgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFJlbmRlcktpdCwgUmVuZGVyS2l0PgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSB3cmFwcGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBkZWFjdGl2YXRlZCA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeShBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRoaXMud3JhcHBlZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLndyYXBwZWQuYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkocmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkZWFjdGl2YXRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5kZWFjdGl2YXRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWFjdGl2YXRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVhY3RpdmF0ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFJlbmRlcktpdCBjcmVhdGUoUmVuZGVyS2l0IHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIGlmKGlzRGVhY3RpdmF0ZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBSZW5kZXJLaXQgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBpZih0aGlzLndyYXBwZWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy53cmFwcGVkLmNyZWF0ZShyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVXcmFwcGVyKHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0RlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0N2UwNTAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ci17Ci0gICAgcHJpdmF0ZSBSZW5kZXJLaXQgcmVuZGVyS2l0OwotCi0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCBjcmVhdGVXcmFwcGVyKFJlbmRlcktpdCByZW5kZXJLaXQpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVya2l0IHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcktpdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLnJlbmRlcktpdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnJlbmRlcktpdCA9IG5ldyBFeHRWYWxSZW5kZXJLaXQocmVuZGVyS2l0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJLaXQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbExhenlSZW5kZXJlclByb3h5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxMYXp5UmVuZGVyZXJQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzZhYmQyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbExhenlSZW5kZXJlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7DQotDQotLyoqDQotICogdG8gc3VwcG9ydCBhIGN1c3RvbSBwcm94eQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBFeHRWYWxMYXp5UmVuZGVyZXJQcm94eSBleHRlbmRzIFJlbmRlcmVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIFJlbmRlcmVyIHdyYXBwZWQ7DQotDQotICAgIHB1YmxpYyBFeHRWYWxMYXp5UmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyZXI7DQotDQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInNpbXBsZSBwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldExhenlSZW5kZXJlcigpLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQ0KLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBSZW5kZXJlciBnZXRMYXp5UmVuZGVyZXIoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcHJveHlDbGFzc05hbWUgPSAoU3RyaW5nKSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSk7DQotDQotICAgICAgICBpZihwcm94eUNsYXNzTmFtZSAhPSBudWxsICYmICFwcm94eUNsYXNzTmFtZS5lbmRzV2l0aChnZXRDbGFzcygpLmdldE5hbWUoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShwcm94eUNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYodGFyZ2V0Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImEgY3VzdG9tIGludmFsaWQgcmVuZGVyZXIgcHJveHkgaXMgY29uZmlndXJlZDogIiArIHByb3h5Q2xhc3NOYW1lKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgQ2xhc3NbXSBhcmdDbGFzc2VzID0gbmV3IENsYXNzWzFdOw0KLSAgICAgICAgICAgIGFyZ0NsYXNzZXNbMF0gPSBSZW5kZXJlci5jbGFzczsNCi0NCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGFyZ2V0Q2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJnQ2xhc3Nlcyk7DQotICAgICAgICAgICAgICAgIHJldHVybiAoUmVuZGVyZXIpY29uc3RydWN0b3IubmV3SW5zdGFuY2UodGhpcy53cmFwcGVkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGNyZWF0ZTogIiArIHRhcmdldENsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXQuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjM1NGU1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVN0cmVhbTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LlJlc3BvbnNlV3JpdGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZXNwb25zZVN0YXRlTWFuYWdlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcktpdCBleHRlbmRzIFJlbmRlcktpdAotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcktpdChSZW5kZXJLaXQgd3JhcHBlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlLCBSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIGlmIChyZW5kZXJlciBpbnN0YW5jZW9mIEV4dFZhbFJlbmRlcmVyV3JhcHBlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgcmVuZGVyZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgY3JlYXRlV3JhcHBlcihyZW5kZXJlcikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFJlbmRlcmVyIGdldFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUpCi0gICAgewotICAgICAgICBSZW5kZXJlciByZW5kZXJlciA9IHdyYXBwZWQuZ2V0UmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUpOwotCi0gICAgICAgIGlmKHJlbmRlcmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJlciBpbnN0YW5jZW9mIEV4dFZhbFJlbmRlcmVyV3JhcHBlciA/IHJlbmRlcmVyIDogY3JlYXRlV3JhcHBlcihyZW5kZXJlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oIm5vIHJlbmRlcmVyIGZvdW5kIGZvciBmYW1pbHkgIiArIGZhbWlseSArICIgYW5kIHR5cGUgIiArIHJlbmRlcmVyVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVuZGVyZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlU3RhdGVNYW5hZ2VyIGdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlV3JpdGVyIGNyZWF0ZVJlc3BvbnNlV3JpdGVyKFdyaXRlciB3cml0ZXIsIFN0cmluZyBzLCBTdHJpbmcgczEpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jcmVhdGVSZXNwb25zZVdyaXRlcih3cml0ZXIsIHMsIHMxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdHJlYW0gY3JlYXRlUmVzcG9uc2VTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmNyZWF0ZVJlc3BvbnNlU3RyZWFtKG91dHB1dFN0cmVhbSk7Ci0gICAgfQotCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkKLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgY3JlYXRlV3JhcHBlcihSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRXh0VmFsUmVuZGVyZXJXcmFwcGVyKHJlbmRlcmVyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXRGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyODJiYmMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIGNlbnRyYWwgbWVjaGFuaXNtIHdoaWNoIGlzIHJlc3BvbnNpYmxlIHRvIGNyZWF0ZSBhIHdyYXBwZXIgZm9yIGEgcmVuZGVyZXIgLSBzdGFydGluZyBwb2ludCBvZiBleHR2YWwuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJLaXRGYWN0b3J5IGV4dGVuZHMgUmVuZGVyS2l0RmFjdG9yeQotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0gICAgcHJpdmF0ZSBSZW5kZXJLaXRGYWN0b3J5IHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeShSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnkpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSByZW5kZXJLaXRGYWN0b3J5OwotCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyS2l0KFN0cmluZyBzLCBSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJLaXQocywgcmVuZGVyS2l0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVuZGVyS2l0IGdldFJlbmRlcktpdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIFJlbmRlcktpdCByZW5kZXJLaXQgPSB0aGlzLndyYXBwZWQuZ2V0UmVuZGVyS2l0KGZhY2VzQ29udGV4dCwgcyk7Ci0KLSAgICAgICAgLy9qc2YgcmkgKyB0cmluaWRhZAotICAgICAgICBpZihyZW5kZXJLaXQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHdyYXBwZXJGYWN0b3J5ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgLy9zb21lIGNvbXBvbmVudCBsaWJzIGUuZy4gbXlmYWNlcy10cmluaWRhZCBhcmVuJ3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgY2xlYW4gYXBwcm9hY2gKLSAgICAgICAgLy9leGFtcGxlIHNlZSBUcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lcgotICAgICAgICBpZih3cmFwcGVyRmFjdG9yeS5pc0RlYWN0aXZhdGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJLaXQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gd3JhcHBlckZhY3RvcnkuY3JlYXRlKHJlbmRlcktpdCk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gZ2V0UmVuZGVyS2l0SWRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlbmRlcktpdElkcygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyUHJveHkuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NDk5NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiB0byBhdm9pZCBtdWx0aXBsZSBjYWxscyBvZiByZW5kZXJlciBtZXRob2RzIHdpdGhpbiByZW5kZXJlciBpbnRlcmNlcHRvcnMgKGUuZy4gZm9yIGVuY29kZSwgZGVjb2RlLC4uLikKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcmVyUHJveHkgZXh0ZW5kcyBSZW5kZXJlcgotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9IEV4dFZhbFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpICsgIjpLRVkiOwotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0gICAgCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHJlbmRlcmVyOwotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInByb3h5IGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5RW50cnkgZW50cnkgPSBnZXRPckluaXRFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRGVjb2RlQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldERlY29kZUNhbGxlZCh0cnVlKTsKLSAgICAgICAgICAgIHdyYXBwZWQuZGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkb3VibGUgY2FsbCBvZiBtZXRob2QgJ2RlY29kZScgZmlsdGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlFbnRyeSBlbnRyeSA9IGdldE9ySW5pdEVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNFbmNvZGVCZWdpbkNhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXRFbmNvZGVCZWdpbkNhbGxlZCh0cnVlKTsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImRvdWJsZSBjYWxsIG9mIG1ldGhvZCAnZW5jb2RlQmVnaW4nIGZpbHRlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5RW50cnkgZW50cnkgPSBnZXRPckluaXRFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRW5jb2RlQ2hpbGRyZW5DYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RW5jb2RlQ2hpbGRyZW5DYWxsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkb3VibGUgY2FsbCBvZiBtZXRob2QgJ2VuY29kZUNoaWxkcmVuJyBmaWx0ZXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlFbnRyeSBlbnRyeSA9IGdldE9ySW5pdEVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNFbmNvZGVFbmRDYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RW5jb2RlRW5kQ2FsbGVkKHRydWUpOwotICAgICAgICAgICAgd3JhcHBlZC5lbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImRvdWJsZSBjYWxsIG9mIG1ldGhvZCAnZW5jb2RlRW5kJyBmaWx0ZXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0Q2xpZW50SWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jb252ZXJ0Q2xpZW50SWQoZmFjZXNDb250ZXh0LCBzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlFbnRyeSBlbnRyeSA9IGdldE9ySW5pdEVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmIChlbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldENvbnZlcnRlZFZhbHVlKHdyYXBwZWQuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbykpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkb3VibGUgY2FsbCBvZiBtZXRob2QgJ2dldENvbnZlcnRlZFZhbHVlJyBmaWx0ZXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVuZGVyZXJQcm94eUVudHJ5IGdldE9ySW5pdEVudHJ5KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgU3RyaW5nIGtleSA9IHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAga2V5ICs9IGdldE9wdGlvbmFsS2V5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZ2V0T3JJbml0Q29tcG9uZW50UHJveHlNYXBwaW5nKCkuY29udGFpbnNLZXkoa2V5KSkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0T3JJbml0Q29tcG9uZW50UHJveHlNYXBwaW5nKCkucHV0KGtleSwgbmV3IFJlbmRlcmVyUHJveHlFbnRyeSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0T3JJbml0Q29tcG9uZW50UHJveHlNYXBwaW5nKCkuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcHRpb25hbEtleShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfU1RPUkFHRV9OQU1FID0gRXh0VmFsUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCkgKyAiOlNUT1JBR0UiOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5RW50cnk+IGdldE9ySW5pdENvbXBvbmVudFByb3h5TWFwcGluZygpCi0gICAgewotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7Ci0KLSAgICAgICAgaWYoIXJlcXVlc3RNYXAuY29udGFpbnNLZXkoUFJPWFlfU1RPUkFHRV9OQU1FKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVxdWVzdE1hcC5wdXQoUFJPWFlfU1RPUkFHRV9OQU1FLCBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlFbnRyeT4+KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eUVudHJ5Pj4gcHJveHlTdG9yYWdlID0KLSAgICAgICAgICAgICgoTWFwPFN0cmluZywgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eUVudHJ5Pj4pcmVxdWVzdE1hcC5nZXQoUFJPWFlfU1RPUkFHRV9OQU1FKSk7Ci0KLSAgICAgICAgU3RyaW5nIGtleSA9IHRoaXMud3JhcHBlZC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQotICAgICAgICBpZighcHJveHlTdG9yYWdlLmNvbnRhaW5zS2V5KGtleSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3h5U3RvcmFnZS5wdXQoa2V5LCBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlFbnRyeT4oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJveHlTdG9yYWdlLmdldChrZXkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyV3JhcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YzMwNWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUmVuZGVyZXJJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLQotLyoqCi0gKiBEZWZhdWx0IGFwcHJvYWNoIHRvIGF2b2lkIHByb3hpZXMgZm9yIGNvbnZlcnRlcnMgYW5kIHRoZSBhZGFwdGVyIGZhbGxiYWNrLgotICogSXQgcmVxdWlyZXMgdGhhdCBjb21wb25lbnRzIGRlbGVnYXRlIGdldENvbnZlcnRlZFZhbHVlIHRvIGEgcmVuZGVyZXIuPGJyLz4KLSAqIElmIGl0IGlzbid0IHRoZSBjYXNlIGZvciB5b3VyIGNvbXBvbmVudCBsaWIgdXNlOgotICogb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHkuRXh0VmFsQXBwbGljYXRpb25GYWN0b3J5PGJyLz4KLSAqIGFuZDxici8+Ci0gKiBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5Qcm94eU1hcHBpbmdQaGFzZUxpc3RlbmVyCi0gKiA8cC8+Ci0gKiBUaGlzIHdyYXBwZXIgd2lsbCBhbHNvIGltcGxlbWVudCBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIGJlaGF2aW91cgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyZXJXcmFwcGVyIGV4dGVuZHMgUmVuZGVyZXIKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIHdyYXBwZWQ7Ci0gICAgcHJvdGVjdGVkIEV4dFZhbENvbnRleHQgZXh0VmFsQ29udGV4dCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcmVyV3JhcHBlcihSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwcm94eUNsYXNzTmFtZSA9IChTdHJpbmcpRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVkpOwotCi0gICAgICAgIGlmKHByb3h5Q2xhc3NOYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNvbmZpZ3VyZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gbmV3IEV4dFZhbExhenlSZW5kZXJlclByb3h5KHJlbmRlcmVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUocHJveHlDbGFzc05hbWUpOwotCi0gICAgICAgIGlmKHRhcmdldENsYXNzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNvbmZpZ3VyZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gbmV3IEV4dFZhbExhenlSZW5kZXJlclByb3h5KHJlbmRlcmVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzW10gYXJnQ2xhc3NlcyA9IG5ldyBDbGFzc1sxXTsKLSAgICAgICAgYXJnQ2xhc3Nlc1swXSA9IFJlbmRlcmVyLmNsYXNzOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHRhcmdldENsYXNzLmdldENvbnN0cnVjdG9yKGFyZ0NsYXNzZXMpOwotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gKFJlbmRlcmVyKWNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHJlbmRlcmVyKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm5vIGV4dHZhbCByZW5kZXJlciBwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0dmFsIHJlbmRlcmVyIHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZURlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZURlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZGVjb2RlIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZURlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZURlY29kZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckRlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJEZWNvZGUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSB0cnVlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJlbmNvZGVCZWdpbiBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVCZWdpbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVCZWdpbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUNoaWxkcmVuIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImVuY29kZUNoaWxkcmVuIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUNoaWxkcmVuIG9mICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVDaGlsZHJlbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUNoaWxkcmVuIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZW5jb2RlRW5kIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVFbmQgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5lbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJFbmNvZGVFbmQgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlRW5kIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBjb252ZXJ0Q2xpZW50SWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jb252ZXJ0Q2xpZW50SWQoZmFjZXNDb250ZXh0LCBzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0gICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8sIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QgPSBlLmdldFJldHVyblZhbHVlT25FeGNlcHRpb24oY29udmVydGVkT2JqZWN0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJnZXRDb252ZXJ0ZWRWYWx1ZSBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlR2V0Q29udmVydGVkVmFsdWUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgY29udmVydGVkT2JqZWN0ID0gd3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyR2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbywgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRPYmplY3Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvUmVuZGVyZXJQcm94eUVudHJ5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9SZW5kZXJlclByb3h5RW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2MzkxMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9SZW5kZXJlclByb3h5RW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgUmVuZGVyZXJQcm94eUVudHJ5DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGVjb2RlQ2FsbGVkID0gZmFsc2U7DQotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVCZWdpbkNhbGxlZCA9IGZhbHNlOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGVuY29kZUVuZENhbGxlZCA9IGZhbHNlOw0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBjb252ZXJ0ZWRWYWx1ZSA9IG51bGw7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVjb2RlQ2FsbGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRlY29kZUNhbGxlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWNvZGVDYWxsZWQoYm9vbGVhbiBkZWNvZGVDYWxsZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGVjb2RlQ2FsbGVkID0gZGVjb2RlQ2FsbGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlQmVnaW5DYWxsZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW5jb2RlQmVnaW5DYWxsZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlQmVnaW5DYWxsZWQoYm9vbGVhbiBlbmNvZGVCZWdpbkNhbGxlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5lbmNvZGVCZWdpbkNhbGxlZCA9IGVuY29kZUJlZ2luQ2FsbGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlQ2hpbGRyZW5DYWxsZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlQ2hpbGRyZW5DYWxsZWQoYm9vbGVhbiBlbmNvZGVDaGlsZHJlbkNhbGxlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5lbmNvZGVDaGlsZHJlbkNhbGxlZCA9IGVuY29kZUNoaWxkcmVuQ2FsbGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlRW5kQ2FsbGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVuY29kZUVuZENhbGxlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVFbmRDYWxsZWQoYm9vbGVhbiBlbmNvZGVFbmRDYWxsZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZW5jb2RlRW5kQ2FsbGVkID0gZW5jb2RlRW5kQ2FsbGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkVmFsdWUoT2JqZWN0IGNvbnZlcnRlZFZhbHVlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbnZlcnRlZFZhbHVlID0gY29udmVydGVkVmFsdWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmZmZDQ2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjA5NDBhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExODBmZmIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXJJbnRlcmNlcHRvciBleGNlcHRpb25Tb3VyY2U7Ci0gICAgcHJvdGVjdGVkIE9iamVjdCBpbmZvcm1hdGlvbjsKLSAgICBib29sZWFuIHNraXBPdGhlckludGVyY2VwdG9ycyA9IGZhbHNlOwotCi0gICAgcHVibGljIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbihib29sZWFuIHNraXBPdGhlckludGVyY2VwdG9ycykKLSAgICB7Ci0gICAgICAgIHRoaXMuc2tpcE90aGVySW50ZXJjZXB0b3JzID0gc2tpcE90aGVySW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzLCBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzKHNraXBPdGhlckludGVyY2VwdG9ycyk7Ci0gICAgICAgIHRoaXMuZXhjZXB0aW9uU291cmNlID0gcmVuZGVyZXJJbnRlcmNlcHRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvbihPYmplY3QgaW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICB0aGlzLmluZm9ybWF0aW9uID0gaW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gaW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNraXBPdGhlckludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJldHVyblZhbHVlT25FeGNlcHRpb24oT2JqZWN0IGN1cnJlbnRSZXR1cm5WYWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMuZXhjZXB0aW9uU291cmNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmV4Y2VwdGlvblNvdXJjZS5nZXRSZXR1cm5WYWx1ZU9uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbih0aGlzLCBjdXJyZW50UmV0dXJuVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjdXJyZW50UmV0dXJuVmFsdWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0Fic3RyYWN0U3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNiN2FiYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIGV4ZWN1dGUgbG9naWMganVzdCBvbmNlLg0KLSAqIGUuZy4gcmVnaXN0ZXIgYXJ0aWZhY3RzIHZpYSBhcGkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgLy9kb24ndCByZW1vdmUgLSBpdCdzIGEgZmFsbGJhY2sgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggZGVyZWdpc3RyYXRpb24NCi0gICAgLy90YXJnZXQ6IGRvbid0IHByb2Nlc3MgaW5pdCBsb2dpYyBtb3JlIHRoYW4gb25jZQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENsYXNzPiBpbml0aWFsaXplZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICAgICAgc3luY2hyb25pemVkIChBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5jbGFzcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIWluaXRpYWxpemVkTGlzdGVuZXJzLmNvbnRhaW5zKGdldENsYXNzKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oInN0YXJ0IGluaXQgb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluaXQoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImluaXQgb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBKc2ZVdGlscy5kZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcih0aGlzKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBkZXJlZ2lzdGVyaW5nIHRoZSBwaGFzZS1saXN0ZW5lciINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtPiB0aGVyZSBpcyBqdXN0IGEgbGl0dGxlIG92ZXJoZWFkLCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBidXQgZXZlcnl0aGluZyBlbHNlIHdvcmtzIGNvcnJlY3RseS4iDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaG93ZXZlciwgcGxlYXNlIGluZm9ybSB0aGUgY29tbXVuaXR5IGFib3V0IHlvdXIgY29uZmlndXJhdGlvbiIsIHQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWRMaXN0ZW5lcnMuYWRkKGdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5SRVNUT1JFX1ZJRVc7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdCgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYWE3MjcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0V4dFZhbFN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIKLXsKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydGluZyB1cCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIHYiICsgRXh0VmFsSW5mb3JtYXRpb24uVkVSU0lPTik7Ci0gICAgICAgIH0KLQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsKLQotICAgICAgICBleGVjdXRlQ3VzdG9tU3RhcnR1cExpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVDdXN0b21TdGFydHVwTGlzdGVuZXIoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkKLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVksIEV4dFZhbFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpLCBmYWxzZSk7Ci0KLSAgICAgICAgU3RyaW5nIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lck5hbWUgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVJUVVBfTElTVEVORVIpOwotICAgICAgICBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lciBjdXN0b21TdGFydHVwTGlzdGVuZXIgPQotICAgICAgICAgICAgKEFic3RyYWN0U3RhcnR1cExpc3RlbmVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjdXN0b21TdGFydHVwTGlzdGVuZXJOYW1lKTsKLQotICAgICAgICBpZihjdXN0b21TdGFydHVwTGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnQgaW5pdCBvZiAiICsgY3VzdG9tU3RhcnR1cExpc3RlbmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3VzdG9tU3RhcnR1cExpc3RlbmVyLmluaXQoKTsKLQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiaW5pdCBvZiAiICsgY3VzdG9tU3RhcnR1cExpc3RlbmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YzgwNWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOw0KLQ0KLS8qKg0KLSAqIE1lc3NhZ2VSZXNvbHZlciB3aGljaCB1c2VzIHByb3BlcnR5IGZpbGVzLg0KLSAqIFN1YmNsYXNzZXMganVzdCBoYXZlIHRvIHByb3ZpZGUgdGhlIHBhY2thZ2UgdG8gbG9vayBhdC4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBjYW4gYWxzbyBwcm92aWRlIGEgY3VzdG9tIG5hbWUgd2hpY2ggaXMgZS5nLiBjb25maWd1cmVkIHZpYSB3ZWIueG1sLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgaW1wbGVtZW50cyBNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSID0gIj8/PyI7DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb24gPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT047DQotICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGRlZmF1bHRCdW5kbGUgPSBudWxsOw0KLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlQnVuZGxlQmFzZU5hbWU7DQotICAgIC8vd2l0aCBqc2YgMS4xIG9ubHkgYXZhaWxhYmxlIGlmIHRoZXJlIGlzIGEgY3VzdG9tIGJlYW4NCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZUJ1bmRsZVZhck5hbWU7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIGlmIChrZXkgPT0gbnVsbCB8fCBrZXkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjdXN0b21NZXNzYWdlID0gbnVsbDsNCi0NCi0gICAgICAgIC8vb25seSBpbiBjYXNlIG9mIGEgVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIHdoaWNoIGlzIGNvbmZpZ3VyZWQgYXMgYmVhbg0KLSAgICAgICAgaWYgKHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUodGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUsIGxvY2FsZSk7DQotICAgICAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJtZXNzYWdlIGJ1bmRsZSAiICsgdGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUgKyAiIG5vdCBmb3VuZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9vbmx5IGluIGNhc2Ugb2YgYSBWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggaXMgY29uZmlndXJlZCBhcyBiZWFuDQotICAgICAgICBpZiAodGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSAhPSBudWxsICYmIGN1c3RvbU1lc3NhZ2UgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IChSZXNvdXJjZUJ1bmRsZSkgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKG1lc3NhZ2VCdW5kbGVWYXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm1lc3NhZ2UgYnVuZGxlIHZhciBuYW1lICIgKyB0aGlzLm1lc3NhZ2VCdW5kbGVWYXJOYW1lICsgIiBub3QgZm91bmQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChjdXN0b21NZXNzYWdlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2U7DQotICAgICAgICB9DQotDQotICAgICAgICAvKg0KLSAgICAgICAgICogdHJ5IHRvIHVzZSB0aGUgY29udmVudGlvbiBmb3IgdGhlIG1lc3NhZ2UgYnVuZGxlDQotICAgICAgICAgKi8NCi0gICAgICAgIGN1c3RvbU1lc3NhZ2UgPSB0cnlUb1VzZU1lc3NhZ2VCdW5kbGVDb252ZW50aW9uKGtleSwgbG9jYWxlKTsNCi0NCi0gICAgICAgIGlmIChjdXN0b21NZXNzYWdlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2U7DQotICAgICAgICB9DQotDQotICAgICAgICAvKg0KLSAgICAgICAgICogbm8gbWVzc2FnZSBidW5kbGUgb3IgbWVzc2FnZSBmb3VuZCAod2l0aCB0aGUgY29udmVudGlvbik/DQotICAgICAgICAgKi8NCi0NCi0gICAgICAgIC8vdHJ5IHRvIGxvYWQgY3VzdG9tIG1lc3NhZ2VzDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShnZXRDdXN0b21CYXNlTmFtZSgpLCBsb2NhbGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gY3VzdG9tIG1lc3NhZ2UgZm9yICIgKyBrZXkgKyAiIHdpdGhpbiAiICsgZ2V0Q3VzdG9tQmFzZU5hbWUoKSwgZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvL3VzZSBjdXN0b20gbmFtZSAoaWYgcG9zc2libGUpIG90aGVyd2lzZTogZmFsbGJhY2sgdG8gZGVmYXVsdCBtZXNzYWdlIChpZiBwb3NzaWJsZSkNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoY3VzdG9tTWVzc2FnZSAhPSBudWxsKSA/IGN1c3RvbU1lc3NhZ2UNCi0gICAgICAgICAgICAgICAgOiAoZ2V0QmFzZU5hbWUoKSAhPSBudWxsKSA/IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShnZXRCYXNlTmFtZSgpLCBsb2NhbGUpLmdldFN0cmluZyhrZXkpIDogbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIgKyBrZXkgKyBNSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb1VzZU1lc3NhZ2VCdW5kbGVDb252ZW50aW9uKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjdXN0b21NZXNzYWdlID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICgoZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID09IG51bGwgfHwgIWRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICAgICAgJiYgaXNEZWZhdWx0TWVzc2FnZUJ1bmRsZUNvbnZlbnRpb25BY3RpdmUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZGVmYXVsdEJ1bmRsZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9CVU5ETEVfTkFNRSksIGxvY2FsZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgICAgICAgICAgICAgICAgIGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbiA9ICJ0cnVlIjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoZGVmYXVsdEJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSBkZWZhdWx0QnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nDQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlZmF1bHRNZXNzYWdlQnVuZGxlQ29udmVudGlvbkFjdGl2ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0QmFzZU5hbWUoKTsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21CYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VCdW5kbGVCYXNlTmFtZShTdHJpbmcgbWVzc2FnZUJ1bmRsZUJhc2VOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSA9IG1lc3NhZ2VCdW5kbGVCYXNlTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlQnVuZGxlVmFyTmFtZShTdHJpbmcgbWVzc2FnZUJ1bmRsZVZhck5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZUJ1bmRsZVZhck5hbWUgPSBtZXNzYWdlQnVuZGxlVmFyTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI4MTBhYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuDQotICAgICAgICByZXNvbHZlci5tYXBwZXIuQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuDQotICAgICAgICByZXNvbHZlci5tYXBwZXIuQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuDQotICAgICAgICByZXNvbHZlci5tYXBwZXIuRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuDQotICAgICAgICByZXNvbHZlci5tYXBwZXIuRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuDQotICAgICAgICByZXNvbHZlci5tYXBwZXIuU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBGYWN0b3J5IHdoaWNoIGNyZWF0ZXMgYSBNZXNzYWdlUmVzb2x2ZXIgZm9yIGEgZ2l2ZW4gVmFsaWRhdGlvblN0cmF0ZWd5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdlbmVyaWMgamF2YSBhcGkgKGRlLS9yZWdpc3RlciBtYXBwaW5nKSIpDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkgaW1wbGVtZW50cw0KLSAgICBDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWVzc2FnZVJlc29sdmVyPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmc7DQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBuYW1lTWFwcGVyTGlzdCA9DQotICAgICAgICBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0NCi0gICAgc3RhdGljDQotICAgIHsNCi0gICAgICAgIG5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIG5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlUmVzb2x2ZXIgY3JlYXRlKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHN0cmF0ZWd5TmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChNZXNzYWdlUmVzb2x2ZXIpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmdldChzdHJhdGVneU5hbWUpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICBTdHJpbmcgcmVzb2x2ZXJOYW1lOw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vYnVpbGQgY29udmVudGlvbiAoVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKQ0KLSAgICAgICAgICAgIHJlc29sdmVyTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIC8vbmFtZSB3YXNuJ3QgbWFwcGVkDQotICAgICAgICAgICAgaWYgKHJlc29sdmVyTmFtZSA9PSBudWxsIHx8IHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMocmVzb2x2ZXJOYW1lKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtZXNzYWdlUmVzb2x2ZXIgPSAoTWVzc2FnZVJlc29sdmVyKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUocmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWVzc2FnZVJlc29sdmVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKHN0cmF0ZWd5TmFtZSwgcmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZXNvbHZlck5hbWUgKyAiIHVzZWQgZm9yICIgKyBzdHJhdGVneU5hbWUpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYWRkTWFwcGluZyhzdHJhdGVneU5hbWUsIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0U3RhdGljTWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKERlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgOg0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9DT05GSUcpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBTdHJhdGVneU1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZyxTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWFwcGluZy5nZXRTb3VyY2UoKSwgbWFwcGluZy5nZXRUYXJnZXQoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgU3RyaW5nIG1lc3NhZ2VSZXNvbHZlck5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkaW5nIHN0YXRpYyB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1lc3NhZ2UgcmVzb2x2ZXIgbWFwcGluZzogIg0KLSAgICAgICAgICAgICAgICArIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgKyAiIC0+ICIgKyBtZXNzYWdlUmVzb2x2ZXJOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHN5bmNocm9uaXplZCAoRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuY2xhc3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLnB1dCh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBtZXNzYWdlUmVzb2x2ZXJOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYTk3MWYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogRGVmYXVsdCBNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggdXNlcyB0aGUgZGVmYXVsdCBjb252ZW50aW9uIGZvciB0aGUgbWVzc2FnZSBidW5kbGUuDQotICogSXQncyBwb3NzaWJsZSB0byBwcm92aWRlIGEgY3VzdG9tIG1lc3NhZ2UgYnVuZGxlIHZpYSB3ZWIueG1sDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQlVORExFID0gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVNTQUdFX0JVTkRMRTsNCi0NCi0gICAgLy9ub3QgdXNlZCBhdCB0aGUgbW9tZW50IC0ganVzdCBmb3IgYSBjb252ZW50aW9uDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TW9kdWxlTWVzc2FnZUJ1bmRsZU5hbWUoZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENVU1RPTV9CVU5ETEU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM0Zjg2My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSBmb3IgTWVzc2FnZVJlc29sdmVycyBpbmRlcGVuZGVudCBvZiB0aGUgbWVzc2FnZSBzb3VyY2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTRjNGQ2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDc0MDFhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1lc3NhZ2VSZXNvbHZlcnMuDQotICogKGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM3MjAzNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVneSB0byBNZXNzYWdlUmVzb2x2ZXIuDQotICogKGNvbmZpZ3VyZWQgdmlhIGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pDQotICogVGhlIGJlYW4gcHJvdmlkZXMgdGhlIGRlZmF1bHQgbmFtZSAoY29udmVudGlvbikuDQotICogSXQncyBwb3NzaWJsZSB0byBwcm92aWRlIGEgY3VzdG9tIGZ1bGwgcXVhbGlmaWVkIG5hbWUuICg9IGN1c3RvbWl6YWJsZSBjb252ZW50aW9uKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01TR19SRVNPTFZFUl9OQU1FX01BUFBFUik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2RmNDJiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSW4gb3JkZXIgdG8gcHJvdmlkZSBhIE5hbWVNYXBwZXIgcGVyIHZhbGlkYXRpb24gbW9kdWxlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTVjMTE3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFwcyBFeHRWYWwgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gRXh0VmFsIE1lc3NhZ2VSZXNvbHZlcnMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1lc3NhZ2VSZXNvbHZlckNsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgc3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUoc3RyYXRlZ3lDbGFzc05hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNjA2ZjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciB0byBwbGFjZSBWYWxpZGF0aW9uU3RyYXRlZ2llcyBhbmQgTWVzc2FnZVJlc29sdmVycyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VzdG9tUG9zdGZpeCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYKTsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoc3RyYXRlZ3lDbGFzc05hbWUsIGN1c3RvbVBvc3RmaXgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRkZWFiZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBQcm92aWRlcyB0aGUgYWJpbGl0eSBvZiBtZXNzYWdlIHJlc29sdmluZyB0byBWYWxpZGF0aW9uU3RyYXRlZ2llcwotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LlJFVVNFfSkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQotewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYID0gIl9kZXRhaWwiOwotICAgIC8vZS5nLiBmb3IgaW5qZWN0aW5nIGEgbWVzc2FnZSByZXNvbHZlciB2aWEgc3ByaW5nCi0gICAgcHJpdmF0ZSBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgTG9jYWxlIGxvY2FsZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpOwotCi0gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VSZXNvbHZlciAhPSBudWxsID8gdGhpcy5tZXNzYWdlUmVzb2x2ZXIuZ2V0TWVzc2FnZShrZXksIGxvY2FsZSkgOgotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHRoaXMpLmdldE1lc3NhZ2Uoa2V5LCBsb2NhbGUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShBbm5vdGF0aW9uIGFubm90YXRpb24pCi0gICAgewotICAgICAgICByZXR1cm4gcmVzb2x2ZU1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24pCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiAoa2V5ICE9IG51bGwpID8gcmVzb2x2ZU1lc3NhZ2Uoa2V5ICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgpIDogbnVsbDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbikgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBGYWNlc01lc3NhZ2UgZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNYXNzYWdlKEFubm90YXRpb24gYW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwKLSAgICAgICAgICAgIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiksIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VSZXNvbHZlcihNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyKQotICAgIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlUmVzb2x2ZXIgPSBtZXNzYWdlUmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pCi0gICAgewotICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMLCBnZXRMYWJlbChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5KSk7Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbik7Ci0gICAgfQotCi0gICAgLy9mb3IgY3VzdG9tIGFubm90YXRpb25zIC0gb3ZlcnJpZGUgaWYgbmVlZGVkCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5NDZiMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIFByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIHVzZSBWYWxpZGF0b3JFeGNlcHRpb24gKGFzIGV4cGVjdGVkIGJ5IHRoZSB1c2VyKSBpbnN0ZWFkIG9mIENvbnZlcnRlckV4Y2VwdGlvbi4NCi0gKiBGdXJ0aGVybW9yZSBpdCBwcm92aWRlczo8YnIvPg0KLSAqIGluaXRWYWxpZGF0aW9uPGJyLz4NCi0gKiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBpbml0VmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW5pdFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiaW5pdFZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHByb2Nlc3NWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByb2Nlc3NWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInByb2Nlc3NWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVmFsaWRhdG9yRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAocHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgZSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGdldENsYXNzKCkuZ2V0TmFtZSgpICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiOiB0aHJvdyBvcmlnaW5hbCBleGNlcHRpb24gYWZ0ZXIgcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbnZlcnRlckV4Y2VwdGlvbihlLmdldEZhY2VzTWVzc2FnZSgpLCBlKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgIjogb3JpZ2luYWwgZXhjZXB0aW9uIGFmdGVyIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbiwgdGhpcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI1ZGM0ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0NCi0gKiBhZGFwdGVyIHRvIGNvbm5lY3QgdmFsaWRhdGlvbiBzdHJhdGVnaWVzIHdpdGggbWV0YS1kYXRhIHRyYW5zZm9ybWVycywNCi0gKiBpZiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBkZWZpbmVkIGFzIGJlYW4gYW5kIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBpbnRlcmZhY2UgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIgZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIC8vdG8gZ2V0IGJhY2sgdGhlIGludGVybmFsIGNhc2hpbmcNCi0gICAgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpOw0KLQ0KLSAgICBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NWNiNjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLkJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotDQotICogYWRhcHRlciB0byBjb25uZWN0IHZhbGlkYXRpb24gc3RyYXRlZ2llcyB3aXRoIG1ldGEtZGF0YSB0cmFuc2Zvcm1lcnMsDQotICogaWYgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgZGVmaW5lZCBhcyBiZWFuIGFuZCBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIC8vb3B0aW9uYWwgZmFsbGJhY2sgZm9yIGludGVybmFsIGNhc2hpbmcNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOw0KLQ0KLSAgICBwdWJsaWMgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyIGluc3RhbmNlb2YgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIpIG1ldGFEYXRhVHJhbnNmb3JtZXIgKS5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGdldE1ldGFEYXRhVHJhbnNmb3JtZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVRyYW5zZm9ybWVyKE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyID0gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsaWRhdGlvblN0cmF0ZWd5ID0gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDhhM2U2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcg0KLSAgICAuQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyDQotICAgIC5DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXINCi0gICAgLkN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcg0KLSAgICAuRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyDQotICAgIC5TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi0NCi0NCi0vKioNCi0gKiBGYWN0b3J5IHdoaWNoIGNyZWF0ZXMgdGhlIFZhbGlkYXRpb25TdHJhdGVneSBmb3IgYSBnaXZlbiBNZXRhLURhdGEgS2V5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdlbmVyaWMgamF2YSBhcGkgKGRlLS9yZWdpc3RlciBtYXBwaW5nKSIpDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFN0cmluZywgVmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9IG51bGw7DQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8TmFtZU1hcHBlcjxTdHJpbmc+PiBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckxpc3QgPQ0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+KCk7DQotDQotICAgIHN0YXRpYw0KLSAgICB7DQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsNCi0gICAgICAgIG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7DQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsNCi0gICAgICAgIG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyTGlzdC5hZGQobmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIG5ldyBEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7DQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckxpc3QuYWRkKG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBuZXcgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGNyZWF0ZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIGlmIChtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRTdGF0aWNNYXBwaW5ncygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nLmNvbnRhaW5zS2V5KG1ldGFEYXRhS2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5SW5zdGFuY2UobWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcuZ2V0KG1ldGFEYXRhS2V5KSk7DQotICAgICAgICB9DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgU3RyaW5nIHN0cmF0ZWd5TmFtZTsNCi0gICAgICAgIC8vbnVsbCAtPiB1c2UgbmFtZSBtYXBwZXJzDQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8U3RyaW5nPiBuYW1lTWFwcGVyIDogbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0cmF0ZWd5TmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZShtZXRhRGF0YUtleSk7DQotDQotICAgICAgICAgICAgaWYgKHN0cmF0ZWd5TmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKHN0cmF0ZWd5TmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyhtZXRhRGF0YUtleSwgc3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lJbnN0YW5jZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUNCi0gICAgICAgICAgICAuc3RhcnRzV2l0aChBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5QUkVGSVhfRk9SX0JFQU5fTUFQUElORykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbih2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLlBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HLmxlbmd0aCgpKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBtZXRhRGF0YUtleSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkaW5nIG1ldGEtZGF0YSBrZXkgdG8gdmFsaWRhdGlvbiBzdHJhdGVneSBtYXBwaW5nOiAiDQotICAgICAgICAgICAgICAgICsgbWV0YURhdGFLZXkgKyAiIC0+ICIgKyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHN5bmNocm9uaXplZCAoRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuY2xhc3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcucHV0KG1ldGFEYXRhS2V5LCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgdm9pZCBpbml0U3RhdGljTWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotDQotICAgICAgICAgICAgLy9zZXR1cCBpbnRlcm5hbCBzdGF0aWMgbWFwcGluZ3MNCi0gICAgICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnID0gbmV3IFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgICAgIC8vdHJ5IHRvIHNldHVwIG1hcHBpbmcgd2l0aCBiYXNlIG5hbWUgYnkgY29udmVudGlvbiAtIG92ZXJyaWRlcyBkZWZhdWx0IG1hcHBpbmcNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vYnVpbGQgY29udmVudGlvbiAoc3RyYXRlZ3kgbWFwcGluZykNCi0gICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZyhFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVRJQ19TVFJBVEVHWV9NQVBQSU5HX1NPVVJDRSkpOw0KLQ0KLSAgICAgICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vc2V0dXAgY3VzdG9tIG1hcHBpbmcgLSBvdmVycmlkZXMgYWxsIG90aGVyIG1hcHBpbmdzDQotICAgICAgICAgICAgU3RyaW5nIGN1c3RvbU1hcHBpbmdCYXNlTmFtZSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORzsNCi0gICAgICAgICAgICBpZiAoY3VzdG9tTWFwcGluZ0Jhc2VOYW1lICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnID0gbmV3IFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZyhjdXN0b21NYXBwaW5nQmFzZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBTdHJhdGVneU1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZyxTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWFwcGluZy5nZXRTb3VyY2UoKSwgbWFwcGluZy5nZXRUYXJnZXQoKSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTU1MjNkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBCYXNlIGludGVyZmFjZSBmb3IgVmFsaWRhdGlvblN0cmF0ZWdpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLS8vKlZhbGlkYXRpb25TdHJhdGVneSBpbnN0ZWFkIG9mICpWYWxpZGF0b3IgdG8gYXZvaWQgbmFtaW5nIGNvbmZ1c2lvbiANCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fic3RyYWN0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9BYnN0cmFjdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI1MmQ0OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fic3RyYWN0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3RBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWEzYjYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIE5hbWUgTWFwcGVyIHdoaWNoIGRlbGVnYXRlcyB0aGUgbmFtZSBtYXBwaW5nLCBleHRyYWN0IHRoZSBuYW1lIGFuZCBjb252ZXJ0IGl0IHRvIGEgYmVhbiBuYW1lICsgcHJlZml4DQotICogdGFyZ2V0OiBjb25maWd1cmUgYSB2YWxpZGF0aW9uIHN0cmF0ZWd5IHZpYSBhIG1hbmFnZWQgYmVhbiBmYWNpbGl0eSAtPiBhbGxvd3MgdG8gaW5qZWN0IG90aGVyIGJlYW5zDQotICogaW5zdGVhZCBvZiBhcGkgY2FsbHMgKyBoYXJkY29kZWQgYmVhbiBuYW1lcw0KLSAqIDxwLz4NCi0gKiBhbGxvd2VkIGJlYW4gc2NvcGVzOg0KLSAqIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIHN0YXRlbGVzczogYXBwbGljYXRpb24vc2luZ2xldG9uDQotICogdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgc3RhdGVmdWw6IG5vbmUvcHJvdG90eXBlDQotICogZG9uJ3QgdXNlIHRoZSBzZXNzaW9uIG9yIGEgY29udmVyc2F0aW9uIHNjb3BlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0ZPUl9CRUFOX01BUFBJTkcgPSAiYmVhbjoiOw0KLSAgICBwcml2YXRlIE5hbWVNYXBwZXI8U3RyaW5nPiB3cmFwcGVkOw0KLQ0KLSAgICBwdWJsaWMgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoTmFtZU1hcHBlcjxTdHJpbmc+IG5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IG5hbWVNYXBwZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuYW1lID0gd3JhcHBlZC5jcmVhdGVOYW1lKHNvdXJjZSk7DQotDQotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOw0KLSAgICAgICAgcmV0dXJuIFBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HICsgbmFtZS5zdWJzdHJpbmcoMCwgMSkudG9Mb3dlckNhc2UoKSArIG5hbWUuc3Vic3RyaW5nKDEpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZlMWY2ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBBbm5vdGF0aW9ucyB0byBWYWxpZGF0aW9uU3RyYXRlZ2llcy4NCi0gKiAoY29uZmlndXJlZCB2aWEgd2ViLnhtbCkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y4ZGRmYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIEFubm90YXRpb25zIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYThkZjU5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFwcyBFeHRWYWwgQW5ub3RhdGlvbnMgdG8gRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUobWV0YURhdGFLZXkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZjQ1YmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciB0byBwbGFjZSBBbm5vdGF0aW9ucyBhbmQgVmFsaWRhdGlvblN0cmF0ZWdpZXMgaW4gdGhlIHNhbWUgcGFja2FnZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5ICsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Qcmlvcml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzk0N2Q1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGVudW0gUHJpb3JpdHkKLXsKLSAgICBCTE9DS0lORywKLSAgICBISUdILAotICAgIE1FRElVTSwKLSAgICBMT1cKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUzYjA5NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Ub0RvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi1wdWJsaWMgQGludGVyZmFjZSBUb0RvCi17Ci0gICAgUHJpb3JpdHkgdmFsdWUoKTsKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24oKSBkZWZhdWx0ICIiOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VDYXRlZ29yeS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VDYXRlZ29yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDdiMzg1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbDsKLQotLyoqCi0gKiBBUEk6PGJyLz4KLSAqIHBhcnRzIHlvdSBtaWdodCBuZWVkIGZvciBjdXN0b20gaW1wbGVtZW50YXRpb25zIGFuZCB3aGljaCBhcmUgcXVpdGUgc3RhYmxlIGluIHZpZXcgb2YgY2hhbmdlcwotICogPHAvPgotICogSU5URVJOQUw6PGJyLz4KLSAqIGlmIHlvdSB0aGluayBhYm91dCByZWZlcmVuY2luZyBhbiBhcnRpZmFjdCB3aGljaCBpcyBtYXJrZWQgYXMgaW50ZXJuYWwsIGFzayBmb3Igc3VwcG9ydC4KLSAqIHRoZXJlIHNob3VsZCBiZSBhIGJldHRlciBzb2x1dGlvbgotICogPHAvPgotICogQ1VTVE9NSVpBQkxFOjxici8+Ci0gKiBhIHBsYW5uZWQgZXh0ZW5zaW9uIHBvaW50IHdoaWNoIGNvbnRhaW5zIGxvZ2ljIHRvIGN1c3RvbWl6ZSB0aGUgZnJhbWV3b3JrLgotICogaWYgaXQgaXNuJ3QgYWxzbyBtYXJrZWQgYXMgQVBJIGl0IG1pZ2h0IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuCi0gKiBob3dldmVyLCB3ZSB0cnkgdG8ga2VlcCBpdCBhcyBzdGFibGUgYXMgcG9zc2libGUgYW5kIHJlYXNvbmFibGUuCi0gKiA8cC8+Ci0gKiBSRVVTRTo8YnIvPgotICogYW4gYXJ0aWZhY3Qgd2hpY2ggeW91IGNhbiByZXVzZSBmb3IgYSBjdXN0b20gaW1wbGVtZW50YXRpb24uCi0gKiBpZiBpdCBpc24ndCBtYXJrZWQgYXMgQVBJIGl0IG1pZ2h0IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuCi0gKiBob3dldmVyLCB3ZSB0cnkgdG8ga2VlcCBpdCBhcyBzdGFibGUgYXMgcG9zc2libGUgYW5kIHJlYXNvbmFibGUuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGVudW0gVXNhZ2VDYXRlZ29yeQotewotICAgIEFQSSwKLSAgICBJTlRFUk5BTCwKLSAgICBDVVNUT01JWkFCTEUsCi0gICAgUkVVU0UKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlSW5mb3JtYXRpb24uamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlSW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk5NDk1Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogaXQncyBhbiBpbnRlcm5hbCBhbm5vdGF0aW9uIHRvIHByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbgotICogPHAvPgotICogZS5nLjogc29tZSBtZWNoYW5pc21zIGFyZW4ndCBkZXByZWNhdGVkCi0gKiB0aGV5IGFyZSBlLmcuIGZhbGxiYWNrcywgYWx0ZXJuYXRpdmVzLC4uLgotICogaW4gb3JkZXIgdG8gYXZvaWQgdGhlIGRlcHJlY2F0ZWQgYW5ub3RhdGlvbiBpdCdzIHBvc3NpYmxlIHRvIHVzZSB0aGlzIG9uZS4KLSAqIHlvdSBjYW4gdGVsbCBvdGhlciBkZXZlbG9wZXJzOgotICogdGhpcyBhcnRpZmFjdCBpc24ndCB1c2VkIGZvciB0aGUgZGVzaXJlZCBhcHByb2FjaCwgaG93ZXZlciwgaXQncyBzdGlsbCBlc3NlbnRpYWwgdG8gaGF2ZSBpdCBhcyAuLi4KLSAqIDxwLz4KLSAqIGlkZWE6IHVuaWZ5IHNtYWxsIHBhcnRzIG9mIGluZm9ybWF0aW9uIHdoaWNoIGFyZSBmcmVxdWVudGx5IHVzZWQKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLXB1YmxpYyBAaW50ZXJmYWNlIFVzYWdlSW5mb3JtYXRpb24KLXsKLSAgICBVc2FnZUNhdGVnb3J5W10gdmFsdWUoKTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMjc1ZWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENsYXNzVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgdHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbG9hZENsYXNzRm9yTmFtZShuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgbG9hZENsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gVHJ5IFdlYkFwcCBDbGFzc0xvYWRlciBmaXJzdA0KLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKG5hbWUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXANCi0gICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gZmFsbGJhY2s6IFRyeSBDbGFzc0xvYWRlciBmb3IgQ2xhc3NVdGlscyAoaS5lLiB0aGUgbXlmYWNlcy5qYXIgbGliKQ0KLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKG5hbWUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXANCi0gICAgICAgICAgICAgICAgQ2xhc3NVdGlscy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0luc3RhbnRpYXRlQ2xhc3MoQ2xhc3MgdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0YXJnZXRDbGFzcy5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKFN0cmluZyBjbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxvYWRDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFiZGIyNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkVMSGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5BYnN0cmFjdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsVXRpbHMNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19SRVFVSVJFRCA9ICJqYXZheC5mYWNlcy5jb21wb25lbnQuVUlJbnB1dC5SRVFVSVJFRCI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19SRVFVSVJFRF9ERVRBSUwgPSAiamF2YXguZmFjZXMuY29tcG9uZW50LlVJSW5wdXQuUkVRVUlSRURfZGV0YWlsIjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX01BWElNVU0gPSAiamF2YXguZmFjZXMudmFsaWRhdG9yLkxlbmd0aFZhbGlkYXRvci5NQVhJTVVNIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX01BWElNVU1fREVUQUlMID0gImphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3IuTUFYSU1VTV9kZXRhaWwiOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKENsYXNzTWFwcGluZ0ZhY3Rvcnk8T2JqZWN0LCBWYWxpZGF0aW9uU3RyYXRlZ3k+KSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlKG1ldGFEYXRhS2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckZvclZhbGlkYXRpb25TdHJhdGVneShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWV0YURhdGFUcmFuc2Zvcm1lcj4pIEV4dFZhbENvbnRleHQNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKQ0KLSAgICB7DQotICAgICAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudFdpdGhNZXRhRGF0YShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGZvcihDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldENvbXBvbmVudEluaXRpYWxpemVycygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyLmNvbmZpZ3VyZUNvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7DQotDQotICAgICAgICBmb3IoVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoIXZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5hZnRlclRocm93aW5nKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24sIHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZVJlc29sdmVyIGdldE1lc3NhZ2VSZXNvbHZlckZvclZhbGlkYXRpb25TdHJhdGVneShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWVzc2FnZVJlc29sdmVyPilFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAuY3JlYXRlKHZhbGlkYXRpb25TdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBFTEhlbHBlciBnZXRFTEhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRUxfSEVMUEVSX0ZBQ1RPUlksIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmNsYXNzKS5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5RGV0YWlscyBjcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0RXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGJhc2VPYmplY3Q7DQotICAgICAgICBpZihFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZCh0YXJnZXRFeHByZXNzaW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZSA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHRhcmdldEV4cHJlc3Npb24pOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyBleHByZXNzaW9uID0gdmJlLmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgICAgICBiYXNlT2JqZWN0ID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldFZhbHVlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgdmJlLmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlEZXRhaWxzKA0KLSAgICAgICAgICAgICAgICBleHByZXNzaW9uLnN1YnN0cmluZygyLCBleHByZXNzaW9uLmxlbmd0aCgpIC0gMSksIGJhc2VPYmplY3QsIHZiZS5nZXRQcm9wZXJ0eSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBvcmlnaW5hbCA9IG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoDQotICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIFN0cmluZyBuZXdCYXNlS2V5ID0gb3JpZ2luYWwuZ2V0S2V5KCkuc3Vic3RyaW5nKDAsIG9yaWdpbmFsLmdldEtleSgpLmxhc3RJbmRleE9mKCIuIikgKyAxKTsNCi0gICAgICAgIFN0cmluZyBuZXdLZXkgPSBuZXdCYXNlS2V5ICsgdGFyZ2V0RXhwcmVzc2lvbjsNCi0NCi0gICAgICAgIGJhc2VPYmplY3QgPSBSZWZsZWN0aW9uVXRpbHMuZ2V0QmFzZU9mUHJvcGVydHlDaGFpbihvcmlnaW5hbC5nZXRCYXNlT2JqZWN0KCksIHRhcmdldEV4cHJlc3Npb24pOw0KLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURldGFpbHMoDQotICAgICAgICAgICAgbmV3S2V5LCBiYXNlT2JqZWN0LCB0YXJnZXRFeHByZXNzaW9uLnN1YnN0cmluZyh0YXJnZXRFeHByZXNzaW9uLmxhc3RJbmRleE9mKCIuIikgKyAxLA0KLSAgICAgICAgICAgIHRhcmdldEV4cHJlc3Npb24ubGVuZ3RoKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBAVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9QbGFjZUxhYmVsKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIFN0cmluZyBsYWJlbCwgaW50IGluZGV4KQ0KLSAgICB7DQotICAgICAgICBpZihmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgJiYgZmFjZXNNZXNzYWdlLmdldFN1bW1hcnkoKS5jb250YWlucygieyIgKyBpbmRleCArICJ9IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoZmFjZXNNZXNzYWdlLmdldFN1bW1hcnkoKS5yZXBsYWNlKCJ7IiArIGluZGV4ICsgIn0iLCBsYWJlbCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoZmFjZXNNZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwgJiYgZmFjZXNNZXNzYWdlLmdldERldGFpbCgpLmNvbnRhaW5zKCJ7IiArIGluZGV4ICsgIn0iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKS5yZXBsYWNlKCJ7IiArIGluZGV4ICsgIn0iLCBsYWJlbCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBsYWNlV2l0aERlZmF1bHRNYXhpbXVtTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBpbnQgbWF4TGVuZ3RoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2UgPSBKc2ZVdGlscy5nZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkuZ2V0U3RyaW5nKEpBVkFYX0ZBQ0VTX01BWElNVU0pOw0KLSAgICAgICAgU3RyaW5nIGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsID0gZmFjZXNSZXF1aXJlZE1lc3NhZ2U7DQotDQotICAgICAgICAvL3VzZSB0cnkvY2F0Y2ggZm9yIGVhc2llciBzeW5jIGJldHdlZW4gdHJ1bmsvYnJhbmNoDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihKc2ZVdGlscy5nZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkuZ2V0U3RyaW5nKEpBVkFYX0ZBQ0VTX01BWElNVU1fREVUQUlMKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBKc2ZVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkuZ2V0U3RyaW5nKEpBVkFYX0ZBQ0VTX01BWElNVU1fREVUQUlMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2pzZiAxLjIgZG9lc24ndCBoYXZlIGEgZGV0YWlsIG1lc3NhZ2UNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZhY2VzUmVxdWlyZWRNZXNzYWdlID0gZmFjZXNSZXF1aXJlZE1lc3NhZ2UucmVwbGFjZSgiezB9IiwgIiIgKyBtYXhMZW5ndGgpOw0KLSAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbC5yZXBsYWNlKCJ7MH0iLCAiIiArIG1heExlbmd0aCk7DQotDQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc1JlcXVpcmVkTWVzc2FnZSk7DQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBAVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZSA9IEpzZlV0aWxzLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfUkVRVUlSRUQpOw0KLSAgICAgICAgU3RyaW5nIGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsID0gZmFjZXNSZXF1aXJlZE1lc3NhZ2U7DQotDQotICAgICAgICAvL3VzZSB0cnkvY2F0Y2ggZm9yIGVhc2llciBzeW5jIGJldHdlZW4gdHJ1bmsvYnJhbmNoDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihKc2ZVdGlscy5nZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkuZ2V0U3RyaW5nKEpBVkFYX0ZBQ0VTX1JFUVVJUkVEX0RFVEFJTCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsID0gSnNmVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhKQVZBWF9GQUNFU19SRVFVSVJFRF9ERVRBSUwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vanNmIDEuMiBkb2Vzbid0IGhhdmUgYSBkZXRhaWwgbWVzc2FnZQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoZmFjZXNSZXF1aXJlZE1lc3NhZ2UpOw0KLSAgICAgICAgZmFjZXNNZXNzYWdlLnNldERldGFpbChmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDA0MDU0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvSnNmVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWN0b3J5RmluZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGU7Ci1pbXBvcnQgamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZUZhY3Rvcnk7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgSnNmVXRpbHMKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3RlclBoYXNlTGlzdGVuZXIoUGhhc2VMaXN0ZW5lciBwaGFzZUxpc3RlbmVyKQotICAgIHsKLSAgICAgICAgTGlmZWN5Y2xlRmFjdG9yeSBsaWZlY3ljbGVGYWN0b3J5ID0gKExpZmVjeWNsZUZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEZhY3RvcnlGaW5kZXIuTElGRUNZQ0xFX0ZBQ1RPUlkpOwotCi0gICAgICAgIFN0cmluZyBjdXJyZW50SWQ7Ci0gICAgICAgIExpZmVjeWNsZSBjdXJyZW50TGlmZWN5Y2xlOwotICAgICAgICBJdGVyYXRvciBsaWZlY3ljbGVJZHMgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZUlkcygpOwotICAgICAgICB3aGlsZSAobGlmZWN5Y2xlSWRzLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudElkID0gKFN0cmluZykgbGlmZWN5Y2xlSWRzLm5leHQoKTsKLSAgICAgICAgICAgIGN1cnJlbnRMaWZlY3ljbGUgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZShjdXJyZW50SWQpOwotICAgICAgICAgICAgY3VycmVudExpZmVjeWNsZS5yZW1vdmVQaGFzZUxpc3RlbmVyKHBoYXNlTGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkKLSAgICB7Ci0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBidW5kbGVOYW1lID0gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZ2V0TWVzc2FnZUJ1bmRsZSgpOwotCi0gICAgICAgIGlmKGJ1bmRsZU5hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYnVuZGxlTmFtZSA9IEZhY2VzTWVzc2FnZS5GQUNFU19NRVNTQUdFUzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoYnVuZGxlTmFtZSwgZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1JlZmxlY3Rpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg3ZjdkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBSZWZsZWN0aW9uVXRpbHMKLXsKLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCB0cnlUb0dldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ5VG9HZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIHRyeVRvR2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0TWV0aG9kTmFtZSwgQ2xhc3MuLi4gcGFyYW1ldGVyVHlwZXMpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldE1ldGhvZCh0YXJnZXRDbGFzcywgdGFyZ2V0TWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUpCi0gICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUsIENsYXNzLi4uIHBhcmFtZXRlclR5cGVzKQotICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSB0YXJnZXRDbGFzczsKLSAgICAgICAgTWV0aG9kIHRhcmdldE1ldGhvZCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAoIU9iamVjdC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0YXJnZXRNZXRob2QgPSBjdXJyZW50Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QodGFyZ2V0TWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50SW50ZXJmYWNlIDogdGFyZ2V0Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRJbnRlcmZhY2U7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudENsYXNzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gY3VycmVudENsYXNzLmdldERlY2xhcmVkTWV0aG9kKHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudENsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0TWV0aG9kOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbigidGhlcmUgaXMgbm8gbWV0aG9kIHdpdGggdGhlIG5hbWUgJyIgKyB0YXJnZXRNZXRob2ROYW1lICsgIiciICsKLSAgICAgICAgICAgICAgICAiIGNsYXNzOiAiICsgdGFyZ2V0Q2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvSW52b2tlTWV0aG9kKHRhcmdldCwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvSW52b2tlTWV0aG9kT2ZDbGFzcyh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kT2ZDbGFzcyh0YXJnZXQsIG1ldGhvZCwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldC5uZXdJbnN0YW5jZSgpLCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kLCBPYmplY3QuLi4gYXJncykKLSAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0Lm5ld0luc3RhbmNlKCksIG1ldGhvZCwgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldCwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgewotICAgICAgICBtZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2UodGFyZ2V0LCBhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKE9iamVjdCBiYXNlT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlDaGFpbikKLSAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHByb3BlcnR5Q2hhaW4sICIuIik7Ci0KLSAgICAgICAgT2JqZWN0IGN1cnJlbnRCYXNlID0gYmFzZU9iamVjdDsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnRQcm9wZXJ0eTsKLSAgICAgICAgTWV0aG9kIGN1cnJlbnRNZXRob2Q7Ci0KLSAgICAgICAgd2hpbGUodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudFByb3BlcnR5ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCi0gICAgICAgICAgICAvL2lnbm9yZSB0aGUgbGFzdCBwcm9wZXJ0eQotICAgICAgICAgICAgaWYoIXRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vbm8gaXMgLSBpdCdzIG9ubHkgcG9zc2libGUgYXQgcHJvcGVydGllcyBub3QgYXQgYmVhbiBsZXZlbAotICAgICAgICAgICAgY3VycmVudE1ldGhvZCA9IHRyeVRvR2V0TWV0aG9kKGN1cnJlbnRCYXNlLmdldENsYXNzKCksCi0gICAgICAgICAgICAgICAgImdldCIgKyBjdXJyZW50UHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50UHJvcGVydHkuc3Vic3RyaW5nKDEsIGN1cnJlbnRQcm9wZXJ0eS5sZW5ndGgoKSkpOwotICAgICAgICAgICAgY3VycmVudEJhc2UgPSB0cnlUb0ludm9rZU1ldGhvZChjdXJyZW50QmFzZSwgY3VycmVudE1ldGhvZCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY3VycmVudEJhc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWIyMTdiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvV2ViWG1sVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgV2ViWG1sVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEluaXRQYXJhbWV0ZXIoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpDQotICAgICAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCArICIuIiArIGtleSk7DQotICAgICAgICByZXR1cm4gKHZhbHVlICE9IG51bGwpID8gdmFsdWUucmVwbGFjZSgiICIsICIiKS50cmltKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyMDFkMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUgTW9kdWxlDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUgTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSBNb2R1bGUgcHJvdmlkZXMgYW4gZXh0ZW5zaWJsZSB2YWxpZGF0aW9uIHBsYXRmb3JtIHRvIGltcGxlbWVudCB2YWxpZGF0aW9uIGJhc2VkIG9uIG1ldGEtZGF0YS4NCi0gICAgQmFzZWQgb24gdGhpcyBtb2R1bGUgaXQgaXMgcG9zc2libGUgdG8gaW1wbGVtZW50IHZhbGlkYXRpb24gbW9kdWxlcy4NCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEuMS54IGFuZCBKU0YgMS4yLnguIEJvdGggdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbCBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9hc3NlbWJseS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmYyZDlkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9hc3NlbWJseS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEV4YW1wbGVzIEFzc2VtYmx5PC9uYW1lPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1leGFtcGxlcy1hc3NlbWJseTEyPC9hcnRpZmFjdElkPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy9hc3NlbWJseS88L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvYXNzZW1ibHkvPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvYXNzZW1ibHkvPC91cmw+Ci0gICAgPC9zY20+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5kZXBlbmRlbmN5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LXdhcjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd2FyPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktc3JjPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fd29ybGQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXZhLXNvdXJjZTwvdHlwZT4gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmVhdHVyZS1zZXRfMDE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXZhLXNvdXJjZTwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc3JjPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPiAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBFWEVDVVRFIG12biBwYWNrYWdlIHRvIGdlbmVyYXRlIGFzc2VtYmx5IGZpbGVzIC0tPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9zcmM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmFzc2VtYmx5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4gICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwtZXhhbXBsZXMtJHtwcm9qZWN0LnZlcnNpb259LXNyYzwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfYmluPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hc3NlbWJseTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0JICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+ICAgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWw8L2Rlc2NyaXB0b3I+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsLWV4YW1wbGVzLSR7cHJvamVjdC52ZXJzaW9ufTwvZmluYWxOYW1lPgotCSAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd29yazwvd29ya0RpcmVjdG9yeT4KLQkgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0JICAgIAotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+d2Fnb24tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aWQ+bXlmYWNlcy1uaWdodGx5LWJ1aWxkczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vbWlub3RhdXIuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvYnVpbGRzL215ZmFjZXMvbmlnaHRseTwvdXJsPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9pbnB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICA8L3BsdWdpbnM+Ci0KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBmN2I4MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgkKLSAgPGZpbGVTZXRzPiAgICAKLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3dhcjwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki53YXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4gICAgIAotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NzBjY2MuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08YXNzZW1ibHk+Ci0gIDxpZD5zcmM8L2lkPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4JCi0gIDxmaWxlU2V0cz4gICAgCi0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9zcmM8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki50eHQ8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1YjNhNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMWI5ZjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMKLUNvcHlyaWdodCAyMDA0LTIwMDcgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnk6Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dAotU2VlIGxpY2Vuc2VzIGZvciBhY2NvbXBhbnlpbmcgcHJvZHVjdHMgaW4gdGhlICIvbGljZW5zZXMiIHN1YmRpcmVjdG9yeS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEhlbmcgWXVhbgotaHR0cDovL3d3dy5jcy51Y2xhLmVkdS9+aGVuZy9KU0Nvb2tNZW51Ci0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgU2FtIFN0ZXBoZW5zb24gKHRoZSBQcm90b1R5cGUgbGlicmFyeSkKLWh0dHA6Ly9jb25pby5uZXQvCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgVGhvbWFzIEZ1Y2hzICh0aGUgUnVieSBvbiBSYWlscyBBamF4IGphdmFzY3JpcHQgZXh0ZW5zaW9ucykKLWh0dHA6Ly9zY3JpcHQuYWN1bG8udXMvCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvcG9tLnhtbCBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODJlMjgzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWZlYXR1cmUtc2V0XzAxPC9hcnRpZmFjdElkPgotCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBmZWF0dXJlLXNldCAwMTwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4xLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uZmFjZWxldHM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtZmFjZWxldHM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMTQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5lbC1pbXBsPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRvbWFoYXdrPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dG9tYWhhd2s8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuNjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2N1c3RvbS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZhMjJhNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyB0aGlzIG1lc3NhZ2UgYnVuZGxlIGlzIHBpY2tlZCB1cCB2aWEgY29udmVudGlvbg0KLXJlcGVhdGVkX3Bhc3N3b3JkX3JlcXVpcmVkPXBsZWFzZSByZXR5cGUgdGhlIHBhc3N3b3JkDQotcmVwZWF0ZWRfcGFzc3dvcmRfcmVxdWlyZWRfZGV0YWlsPXBsZWFzZSByZXR5cGUgdGhlIHBhc3N3b3JkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmFlNDFlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2RvbWFpbi9QZXJzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5kb21haW47DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRGF0ZUlzVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uTm90RXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxlbmd0aDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5QYXR0ZXJuOw0KLQ0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlRlbXBvcmFsOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbFR5cGU7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLXB1YmxpYyBjbGFzcyBQZXJzb24NCi17DQotICAgIEBMZW5ndGgobWluaW11bSA9IDIpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMjApDQotICAgIEBOb3RFcXVhbHMoImxhc3ROYW1lIikNCi0gICAgQFBhdHRlcm4oIltBLVpdW2Etel0rIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOw0KLQ0KLSAgICBATGVuZ3RoKG1pbmltdW0gPSAyKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDIwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsNCi0NCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7DQotDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIHJvbGUgPSAidXNlciI7DQotDQotICAgIEBEYXRlSXModHlwZSA9IERhdGVJc1R5cGUuYmVmb3JlLCB2YWx1ZU9mID0gImZpbmFsRXhhbSIpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSkNCi0gICAgQFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5EQVRFKQ0KLSAgICBwcml2YXRlIERhdGUgYmlydGhkYXk7DQotDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSkNCi0gICAgQFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5EQVRFKQ0KLSAgICBwcml2YXRlIERhdGUgZmluYWxFeGFtOw0KLQ0KLSAgICBATGVuZ3RoKG1pbmltdW0gPSAyKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBuaWNrTmFtZTsNCi0NCi0gICAgQExlbmd0aChtaW5pbXVtID0gNikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSA2MCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW1haWw7DQotDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSkNCi0gICAgcHJpdmF0ZSBpbnQgbnVtYmVyT2ZTaWJsaW5nczsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxhc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRSb2xlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHJvbGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Um9sZShTdHJpbmcgcm9sZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5yb2xlID0gcm9sZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXRCaXJ0aGRheSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBiaXJ0aGRheTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRCaXJ0aGRheShEYXRlIGJpcnRoZGF5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmJpcnRoZGF5ID0gYmlydGhkYXk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RmluYWxFeGFtKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZpbmFsRXhhbTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaW5hbEV4YW0oRGF0ZSBmaW5hbEV4YW0pDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmluYWxFeGFtID0gZmluYWxFeGFtOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tmlja05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmlja05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Tmlja05hbWUoU3RyaW5nIG5pY2tOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm5pY2tOYW1lID0gbmlja05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBlbWFpbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbWFpbChTdHJpbmcgZW1haWwpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZW1haWwgPSBlbWFpbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGdldE51bWJlck9mU2libGluZ3MoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbnVtYmVyT2ZTaWJsaW5nczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXJPZlNpYmxpbmdzKGludCBudW1iZXJPZlNpYmxpbmdzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm51bWJlck9mU2libGluZ3MgPSBudW1iZXJPZlNpYmxpbmdzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmUxNGZiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZ3VpLmJlYW5zOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5kb21haW4uUGVyc29uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLk5vdEVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Kb2luVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Mb25nUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uVmFsaWRhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuY3VzdG9tLmVtYWlsdmFsaWRhdG9yLkVtYWlsVmFsaWRhdG9yOw0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25QYWdlDQotew0KLQ0KLSAgICAvL3RoZSBvbGQgcGFzc3dvcmQgb2YgdGhlIHBlcnNvbiBpc24ndCB1c2VkIHdpdGhpbiB0aGUgcGFnZQ0KLSAgICAvLy0+IHZhbGlkYXRlIHdpdGggdmFsdWUgb2YgdGhlIG1vZGVsDQotICAgIEBTa2lwVmFsaWRhdGlvbigiI3twZXJzb24ucm9sZSBlcSAnYWRtaW4nfSIpDQotICAgIEBSZXF1aXJlZA0KLSAgICBARXF1YWxzKCJwZXJzb24ucGFzc3dvcmQiKQ0KLSAgICBATm90RXF1YWxzKCJwYXNzd29yZCIpDQotICAgIHByaXZhdGUgU3RyaW5nIG9sZFBhc3N3b3JkOw0KLQ0KLSAgICBARXF1YWxzKCJwYXNzd29yZFJlcGVhdGVkIikNCi0gICAgLy9jb21iaW5lIGd1aSByZWxhdGVkIGFubm90YXRpb25zIHdpdGggdGhlIGFubm9hdGlvbnMgb2YgdGhlIGRvbWFpbiBtb2RlbA0KLSAgICBASm9pblZhbGlkYXRpb24odmFsdWUgPSAiI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5wYXNzd29yZH0iKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsNCi0NCi0gICAgQFJlcXVpcmVkKHZhbGlkYXRpb25FcnJvck1zZ0tleSA9ICJyZXBlYXRlZF9wYXNzd29yZF9yZXF1aXJlZCIpDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkUmVwZWF0ZWQ7DQotDQotICAgIC8vdXNlICN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ubmlja05hbWV9LCAje3BlcnNvbi5uaWNrTmFtZX0NCi0gICAgLy91c2UgcmVnaXN0cmF0aW9uUGFnZSB0byBkaXNwbGF5IHRoZSBzZWNvbmQgZXJyb3IgbWVzc2FnZSBhdCBvbGQgbmlja25hbWUNCi0gICAgLy9vciBsb2NhbCBwcm9wZXJ0eSBjaGFpbmluZyAodG8gYXZvaWQgdGhlIHVzYWdlIG9mIHRoZSBiZWFuIG5hbWUpIC0gbGlrZToNCi0gICAgQFNraXBWYWxpZGF0aW9uKCIje3BlcnNvbi5yb2xlIGVxICdhZG1pbid9IikNCi0gICAgQE5vdEVxdWFscygicGVyc29uLm5pY2tOYW1lIikNCi0gICAgQEpvaW5WYWxpZGF0aW9uKCJwZXJzb24ubmlja05hbWUiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBuZXdOaWNrTmFtZTsNCi0NCi0gICAgcHJpdmF0ZSBQZXJzb24gcGVyc29uOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGZpbmlzaCgpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldFBhc3N3b3JkKHRoaXMucGFzc3dvcmQpOw0KLSAgICAgICAgcmV0dXJuICJob21lIjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHVwZGF0ZU5pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0Tmlja05hbWUodGhpcy5uZXdOaWNrTmFtZSk7DQotICAgICAgICByZXR1cm4gImhvbWUiOw0KLSAgICB9DQotDQotICAgIC8vanVzdCBhIHF1aWNrIGlsbHVzdHJhdGlvbiBvZiBza2lwVmFsaWRhdGlvbg0KLSAgICBwdWJsaWMgU3RyaW5nIHN3aXRjaE1vZGUoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VycmVudFJvbGUgPSB0aGlzLnBlcnNvbi5nZXRSb2xlKCk7DQotDQotICAgICAgICBpZihjdXJyZW50Um9sZS5lcXVhbHMoImFkbWluIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5wZXJzb24uc2V0Um9sZSgidXNlciIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMucGVyc29uLnNldFJvbGUoImFkbWluIik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gIiI7DQotICAgIH0NCi0NCi0gICAgQEpvaW5WYWxpZGF0aW9uKCJwZXJzb24uZW1haWwiKQ0KLSAgICBAVmFsaWRhdG9yKEVtYWlsVmFsaWRhdG9yLmNsYXNzKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uLmdldEVtYWlsKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXRFbWFpbChlbWFpbCk7DQotICAgIH0NCi0NCi0gICAgQEpvaW5WYWxpZGF0aW9uKCIje3BlcnNvbi5udW1iZXJPZlNpYmxpbmdzfSIpDQotICAgIEBMb25nUmFuZ2UobWF4aW11bSA9IDIwKQ0KLSAgICBwdWJsaWMgaW50IGdldE51bWJlck9mU2libGluZ3MoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5wZXJzb24uZ2V0TnVtYmVyT2ZTaWJsaW5ncygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlck9mU2libGluZ3MoaW50IG51bWJlck9mU2libGluZ3MpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldE51bWJlck9mU2libGluZ3MobnVtYmVyT2ZTaWJsaW5ncyk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9sZFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG9sZFBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE9sZFBhc3N3b3JkKFN0cmluZyBvbGRQYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5vbGRQYXNzd29yZCA9IG9sZFBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZFJlcGVhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkUmVwZWF0ZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRSZXBlYXRlZChTdHJpbmcgcGFzc3dvcmRSZXBlYXRlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZFJlcGVhdGVkID0gcGFzc3dvcmRSZXBlYXRlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwZXJzb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbiBwZXJzb24pDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uID0gcGVyc29uOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmV3Tmlja05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3Tmlja05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TmV3Tmlja05hbWUoU3RyaW5nIG5ld05pY2tOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm5ld05pY2tOYW1lID0gbmV3Tmlja05hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OWRmNGYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiIKLSAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzEuZHRkIiA+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGZhY2VzLWNvbmZpZz4KLSAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgIDwhLS0gdHJpbmlkYWQgLS0+Ci0gICAgICAgIDxkZWZhdWx0LXJlbmRlci1raXQtaWQ+Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29yZQotICAgICAgICA8L2RlZmF1bHQtcmVuZGVyLWtpdC1pZD4KLQotICAgIDwvYXBwbGljYXRpb24+Ci0KLSAgICA8bWFuYWdlZC1iZWFuPgotICAgICAgICA8bWFuYWdlZC1iZWFuLW5hbWU+cmVnaXN0cmF0aW9uUGFnZTwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZ3VpLmJlYW5zLlJlZ2lzdHJhdGlvblBhZ2U8L21hbmFnZWQtYmVhbi1jbGFzcz4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0KLSAgICAgICAgPG1hbmFnZWQtcHJvcGVydHk+Ci0gICAgICAgICAgICA8cHJvcGVydHktbmFtZT5wZXJzb248L3Byb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8dmFsdWU+I3twZXJzb259PC92YWx1ZT4KLSAgICAgICAgPC9tYW5hZ2VkLXByb3BlcnR5PgotICAgIDwvbWFuYWdlZC1iZWFuPgotCi0gICAgPG1hbmFnZWQtYmVhbj4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1uYW1lPnBlcnNvbjwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluLlBlcnNvbjwvbWFuYWdlZC1iZWFuLWNsYXNzPgotICAgICAgICA8bWFuYWdlZC1iZWFuLXNjb3BlPnNlc3Npb248L21hbmFnZWQtYmVhbi1zY29wZT4KLSAgICA8L21hbmFnZWQtYmVhbj4KLQotICAgIDxuYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgICAgIDxmcm9tLXZpZXctaWQ+L3BhZ2VzL2hvbWUueGh0bWw8L2Zyb20tdmlldy1pZD4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+YWRkVXNlcjwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmNoYW5nZU5pY2tOYW1lPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+Y2hhbmdlUGFzc3dvcmQ8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgIDwvbmF2aWdhdGlvbi1ydWxlPgotICAgIDxuYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgICAgIDxmcm9tLXZpZXctaWQ+KjwvZnJvbS12aWV3LWlkPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5ob21lPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvaG9tZS54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgPC9uYXZpZ2F0aW9uLXJ1bGU+Ci08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTljMGM1MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgZmFjZWxldC10YWdsaWIgUFVCTElDCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRmFjZWxldCBUYWdsaWIgMS4wLy9FTiIKLSAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2ZhY2VsZXQtdGFnbGliXzFfMC5kdGQiPgotPGZhY2VsZXQtdGFnbGliPgotICAgIDxuYW1lc3BhY2U+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHR2YWwvZGVtby9jb21wb25lbnRzPC9uYW1lc3BhY2U+Ci0KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+dXNlckZvcm08L3RhZy1uYW1lPgotICAgICAgICA8c291cmNlPgotICAgICAgICAgICAgLi4vY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKLSAgICAgICAgPC9zb3VyY2U+Ci0gICAgPC90YWc+Ci0KLTwvZmFjZWxldC10YWdsaWI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjMDFhYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgotICAgICAgICAgdmVyc2lvbj0iMi40Ij4KLQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuREVGQVVMVF9TVUZGSVg8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4ueGh0bWw8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5mYWNlbGV0cy5MSUJSQVJJRVM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9tYWluLnRhZ2xpYi54bWw8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRU5BQkxFX0xJR0hUV0VJR0hUX0RJQUxPR1M8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkRJU0FCTEVfQ09OVEVOVF9DT01QUkVTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQUxURVJOQVRFX1ZJRVdfSEFORExFUjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNvbS5zdW4uZmFjZWxldHMuRmFjZWxldFZpZXdIYW5kbGVyPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLlVTRV9BUFBMSUNBVElPTl9WSUVXX0NBQ0hFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQ0hBTkdFX1BFUlNJU1RFTkNFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+c2Vzc2lvbjwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5TdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jbGllbnQ8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgRGVmaW5lcyB0aGUgYW1vdW50IChkZWZhdWx0ID0gMjApIG9mIHRoZSBsYXRlc3Qgdmlld3MgYXJlIHN0b3JlZCBpbiBzZXNzaW9uLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuTlVNQkVSX09GX1ZJRVdTX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc3RhdGUgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0gYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLgotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkgYW5kIGlmCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04gaXMgdHJ1ZSAoPSBkZWZhdWx0KQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4gSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DT01QUkVTU19TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhpcyBwYXJhbWV0ZXIgdGVsbHMgTXlGYWNlcyBpZiBqYXZhc2NyaXB0IGNvZGUgc2hvdWxkIGJlIGFsbG93ZWQgaW4gdGhlCi0gICAgICAgICAgICByZW5kZXJlZCBIVE1MIG91dHB1dC4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgYWxsb3dlZCwgY29tbWFuZF9saW5rIGFuY2hvcnMgd2lsbCBoYXZlIGphdmFzY3JpcHQgY29kZQotICAgICAgICAgICAgdGhhdCBzdWJtaXRzIHRoZSBjb3JyZXNwb25kaW5nIGZvcm0uCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIG5vdCBhbGxvd2VkLCB0aGUgc3RhdGUgc2F2aW5nIGluZm8gYW5kIG5lc3RlZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICB3aWxsIGJlIGFkZGVkIGFzIHVybCBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BTExPV19KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuREVURUNUX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgcmVuZGVyZWQgSFRNTCBjb2RlIHdpbGwgYmUgZm9ybWF0dGVkLCBzbyB0aGF0IGl0IGlzICJodW1hbiByZWFkYWJsZSIuCi0gICAgICAgICAgICBpLmUuIGFkZGl0aW9uYWwgbGluZSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIHdpbGwgYmUgd3JpdHRlbiwgdGhhdCBkbyBub3QKLSAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgSFRNTCBjb2RlLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIGEgamF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRoYXQgaXMgYWJsZSB0byByZXN0b3JlIHRoZQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMKLSAgICAgICAgICAgIHdpdGggbG9uZyBsaXN0cyBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcAotICAgICAgICAgICAgaWYgeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZSBwYWdlLgotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQVVUT19TQ1JPTEw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlVzZWQgZm9yIGVuY3J5cHRpbmcgdmlldyBzdGF0ZS4gT25seSByZWxldmFudCBmb3IgY2xpZW50IHNpZGUKLSAgICAgICAgICAgIHN0YXRlIHNhdmluZy4gU2VlIE15RmFjZXMgd2lraS93ZWIgc2l0ZSBkb2N1bWVudGF0aW9uIGZvciBpbnN0cnVjdGlvbnMKLSAgICAgICAgICAgIG9uIGhvdyB0byBjb25maWd1cmUgYW4gYXBwbGljYXRpb24gZm9yIGRpZmZlbmVudCBlbmNyeXB0aW9uIHN0cmVuZ3Rocy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFQ1JFVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPk56WTFORE15TVRBPTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZhbGlkYXRlIG1hbmFnZWQgYmVhbnMsIG5hdmlnYXRpb24gcnVsZXMgYW5kIGVuc3VyZSB0aGF0IGZvcm1zIGFyZSBub3QgbmVzdGVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuVkFMSURBVEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8IS0tIExpc3RlbmVyLCB0byBhbGxvdyBKZXR0eSBzZXJ2aW5nIE15RmFjZXMgYXBwcyAtLT4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMud2ViYXBwLlN0YXJ0dXBTZXJ2bGV0Q29udGV4dExpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IC0tPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+cmVzb3VyY2VzPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC53ZWJhcHAuUmVzb3VyY2VTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgIDwvc2VydmxldD4KLQotICAgIDxmaWx0ZXI+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT50cmluaWRhZDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLndlYmFwcC5UcmluaWRhZEZpbHRlcjwvZmlsdGVyLWNsYXNzPgotICAgIDwvZmlsdGVyPgotCi0gICAgPGZpbHRlci1tYXBwaW5nPgotICAgICAgICA8ZmlsdGVyLW5hbWU+dHJpbmlkYWQ8L2ZpbHRlci1uYW1lPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICA8L2ZpbHRlci1tYXBwaW5nPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmdzIC0tPgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+L2ZhY2VzLyo8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9hZGYvKjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE4OTk5Mi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiCi0gICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIgotICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIKLSAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIgotICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPgotCi08dWk6Y29tcG9zaXRpb24+Ci0gICAgPHRyOnBhbmVsRm9ybUxheW91dD4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJuaWNrIG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uWyAnbmlja05hbWUnIF19Ii8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9ImUtbWFpbCIgdmFsdWU9IiN7YmVhbi5lbWFpbH0iLz4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJmaXJzdCBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5maXJzdE5hbWV9Ii8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Imxhc3QgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb24ubGFzdE5hbWV9Ii8+Ci0gICAgICAgIDx0cjppbnB1dERhdGUgbGFiZWw9ImJpcnRoZGF5IiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5iaXJ0aGRheX0iPgotICAgICAgICAgICAgPHRyOmNvbnZlcnREYXRlVGltZSB0eXBlPSJkYXRlIiBwYXR0ZXJuPSJkZC5NTS55eXl5Ii8+Ci0gICAgICAgIDwvdHI6aW5wdXREYXRlPgotICAgICAgICA8dHI6aW5wdXREYXRlIGxhYmVsPSJmaW5hbCBleGFtIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5maW5hbEV4YW19Ij4KLSAgICAgICAgICAgIDx0cjpjb252ZXJ0RGF0ZVRpbWUgdHlwZT0iZGF0ZSIgcGF0dGVybj0iZGQuTU0ueXl5eSIvPgotICAgICAgICA8L3RyOmlucHV0RGF0ZT4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJudW1iZXIgb2Ygc2libGluZ3MiIHZhbHVlPSIje2JlYW4ubnVtYmVyT2ZTaWJsaW5nc30iLz4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJwYXNzd29yZCIgdmFsdWU9IiN7YmVhbi5wYXNzd29yZH0iIHNlY3JldD0idHJ1ZSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJyZS1lbnRlciBwYXNzd29yZCIgdmFsdWU9IiN7YmVhbi5wYXNzd29yZFJlcGVhdGVkfSIgc2VjcmV0PSJ0cnVlIi8+Ci0KLSAgICA8L3RyOnBhbmVsRm9ybUxheW91dD4KLTwvdWk6Y29tcG9zaXRpb24+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZDNlNjcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08aHRtbD4NCi0NCi08aGVhZD4NCi0gICAgPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDsgVVJMPWZhY2VzL3BhZ2VzL2hvbWUueGh0bWwiPg0KLTwvaGVhZD4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNhNDFhNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTx0cjpkb2N1bWVudA0KLSAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIg0KLSAgICAgICAgeG1sbnM6Yz0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3RsL2NvcmUiPg0KLSAgICA8ZjpmYWNldCBuYW1lPSJtZXRhQ29udGFpbmVyIj4NCi0gICAgICAgIDx0aXRsZT5zZXYtZW4gZmVhdHVyZS1zZXQgZGVtbyAwMTwvdGl0bGU+DQotICAgIDwvZjpmYWNldD4NCi0NCi0gICAgPHRyaDpib2R5Pg0KLQ0KLSAgICAgICAgPCEtLSBvcmlnaW5hbCAtLT4NCi0gICAgICAgIDxkaXYgaWQ9IndyYXAiPg0KLQ0KLSAgICAgICAgICAgIDx0cjpmb3JtIGlkPSJmb3JtIiBkZWZhdWx0Q29tbWFuZD0iZGVmYXVsdEJ1dHRvbiI+DQotICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1haW4iPg0KLSAgICAgICAgICAgICAgICAgICAgPHVpOmluc2VydCBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ1bmRlcl9jb25zdHJ1Y3Rpb24iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+IXNpdGUgdW5kZXIgY29uc3RydWN0aW9uITwvaDI+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBjb250ZW50IG9mIHRoaXMgc2l0ZSBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSBtb21lbnQuPC9wPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC91aTppbnNlcnQ+DQotICAgICAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICAgIDwvdHI6Zm9ybT4NCi0gICAgICAgICAgICA8dHI6bWVzc2FnZXMgZ2xvYmFsT25seT0idHJ1ZSIvPg0KLQ0KLSAgICAgICAgPC9kaXY+DQotICAgIDwvdHJoOmJvZHk+DQotDQotDQotPC90cjpkb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbCBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWRjZDAzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDx0cjpwYW5lbEZvcm1MYXlvdXQ+DQotDQotICAgICAgICAgICAgPHVpOnJlbW92ZT4NCi0gICAgICAgICAgICAgICAganVzdCBmb3IgdGhlIGRlbW8gd2UgYXJlIHVzaW5nIHR3byBpbnB1dCBjb21wb25lbnRzDQotICAgICAgICAgICAgPC91aTpyZW1vdmU+DQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ib2xkIG5pY2sgbmFtZSIgcmVhZE9ubHk9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLm5pY2tOYW1lfSIvPg0KLQ0KLSAgICAgICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im5pY2sgbmFtZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5uZXdOaWNrTmFtZX0iLz4NCi0NCi0gICAgICAgIDwvdHI6cGFuZWxGb3JtTGF5b3V0Pg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UudXBkYXRlTmlja05hbWV9Ii8+DQotDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9wYXNzd29yZC54aHRtbCBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTc5MzU5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDx0cjpwYW5lbEZvcm1MYXlvdXQ+DQotDQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ib2xkIHBhc3N3b3JkIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLm9sZFBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+DQotDQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibmV3IHBhc3N3b3JkIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+DQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0icmUtZW50ZXIgcGFzc3dvcmQiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGFzc3dvcmRSZXBlYXRlZH0iIHNlY3JldD0idHJ1ZSIvPg0KLQ0KLSAgICAgICAgPC90cjpwYW5lbEZvcm1MYXlvdXQ+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJzYXZlIiBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS5maW5pc2h9Ii8+DQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OGEyYzkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9ImFkZCB1c2VyIiBhY3Rpb249ImFkZFVzZXIiLz48YnIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0iY2hhbmdlIG5pY2sgbmFtZSIgYWN0aW9uPSJjaGFuZ2VOaWNrTmFtZSIvPjxici8+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJjaGFuZ2UgcGFzc3dvcmQiIGFjdGlvbj0iY2hhbmdlUGFzc3dvcmQiLz48YnIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRMaW5rIHRleHQ9Im1vZGU6ICN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ucm9sZX0iDQotICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS5zd2l0Y2hNb2RlfSIgaW1tZWRpYXRlPSJ0cnVlIi8+DQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbCBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDUzNWM3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczpjPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dHZhbC9kZW1vL2NvbXBvbmVudHMiDQotICAgICAgICA+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotDQotICAgICAgICA8Yzp1c2VyRm9ybSBiZWFuPSIje3JlZ2lzdHJhdGlvblBhZ2V9Ii8+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJzYXZlIiBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS5maW5pc2h9Ii8+DQotDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvcG9tLnhtbCBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGI0ODRhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fd29ybGQ8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIGhlbGxvIHdvcmxkPC9uYW1lPgotICAgIDx2ZXJzaW9uPjEuMS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5lbC1pbXBsPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhZmIzOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuazsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5kb21haW4uUGVyc29uOwotCi0vKioKLSAqIEEgdHlwaWNhbCBzaW1wbGUgYmFja2luZyBiZWFuLCB0aGF0IGlzIGJhY2tlZCB0byA8Y29kZT5oZWxsb3dvcmxkLmpzcDwvY29kZT4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZENvbnRyb2xsZXIKLXsKLSAgICBwcml2YXRlIFBlcnNvbiBwZXJzb24gPSBuZXcgUGVyc29uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBkZWZhdWx0IGVtcHR5IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIEhlbGxvV29ybGRDb250cm9sbGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHRoYXQgaXMgYmFja2VkIHRvIGEgc3VibWl0IGJ1dHRvbiBvZiBhIGZvcm0uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBzZW5kKCkKLSAgICB7Ci0gICAgICAgIC8vZG8gcmVhbCBsb2dpYywgcmV0dXJuIGEgc3RyaW5nIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgdGhlIG5hdmlnYXRpb24gc3lzdGVtIG9mIEpTRgotICAgICAgICByZXR1cm4gInN1Y2Nlc3MiOwotICAgIH0KLQotICAgIHB1YmxpYyBQZXJzb24gZ2V0UGVyc29uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwZXJzb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbiBwZXJzb24pCi0gICAgewotICAgICAgICB0aGlzLnBlcnNvbiA9IHBlcnNvbjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZDRhOWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5kb21haW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOwotCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOwotCi1wdWJsaWMgY2xhc3MgUGVyc29uCi17Ci0gICAgLy9oZWxsbyB3b3JsZCBkZW1vCi0gICAgQFJlcXVpcmVkCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOwotCi0gICAgLy9kZW1vIGZvciBqcGEgYmFzZWQgdmFsaWRhdGlvbiBzdXBwb3J0Ci0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxMCAvKi4uLiovKQotICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGxhc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjY0NGQwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQwotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMC8vRU4iCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlcy1jb25maWc+Ci0JCi0JPCEtLSBtYW5hZ2VkIGJlYW5zIG9mIHRoZSBzaW1wbGUgaGVsbG8gd29ybGQgYXBwIC0tPgotCTxtYW5hZ2VkLWJlYW4+Ci0JCTxtYW5hZ2VkLWJlYW4tbmFtZT5oZWxsb1dvcmxkPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLQkJPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuSGVsbG9Xb3JsZENvbnRyb2xsZXI8L21hbmFnZWQtYmVhbi1jbGFzcz4KLQkJPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0JPC9tYW5hZ2VkLWJlYW4+Ci0JCi0JPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciBoZWxsb1dvcmxkLmpzcCAtLT4KLQk8bmF2aWdhdGlvbi1ydWxlPgotCQk8ZnJvbS12aWV3LWlkPi9oZWxsb1dvcmxkLmpzcDwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5zdWNjZXNzPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vcGFnZTIuanNwPC90by12aWV3LWlkPgotCQk8L25hdmlnYXRpb24tY2FzZT4KLQk8L25hdmlnYXRpb24tcnVsZT4KLQkKLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIHBhZ2UyLmpzcCAtLT4KLQk8bmF2aWdhdGlvbi1ydWxlPgotCQk8ZnJvbS12aWV3LWlkPi9wYWdlMi5qc3A8L2Zyb20tdmlldy1pZD4KLQkJPG5hdmlnYXRpb24tY2FzZT4KLQkJCTxmcm9tLW91dGNvbWU+YmFjazwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L2hlbGxvV29ybGQuanNwPC90by12aWV3LWlkPgotCQk8L25hdmlnYXRpb24tY2FzZT4KLQk8L25hdmlnYXRpb24tcnVsZT4KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNGExODMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLSAgICAgICAgIHZlcnNpb249IjIuNCI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+TXlQcm9qZWN0IHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0gICAgPCEtLW9wdGlvbmFsOiBjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgVVJJcyBvZiAoYWRkaXRpb25hbCkgZmFjZXMgY29uZmlnIGZpbGVzLgotICAgICAgICAgICAgKGUuZy4gL1dFQi1JTkYvbXktY29uZmlnLnhtbCkKLSAgICAgICAgICAgIFNlZSBKU0YgMS4wIFBSRDIsIDEwLjMuMgotICAgICAgICAgICAgQXR0ZW50aW9uOiBZb3UgZG8gbm90IG5lZWQgdG8gcHV0IC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgaW4gaGVyZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuQ09ORklHX0ZJTEVTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L1dFQi1JTkYvZXhhbXBsZXMtY29uZmlnLnhtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtLS0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5TdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNsaWVudDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLk5VTUJFUl9PRl9WSUVXU19JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkgYW5kIGlmCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04gaXMgdHJ1ZSAoPSBkZWZhdWx0KQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4gSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUKLSAgICAgICAgICAgIHJlbmRlcmVkIEhUTUwgb3V0cHV0LgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgbm90IGFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLgotICAgICAgICAgICAgaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90Ci0gICAgICAgICAgICBpbmZsdWVuY2UgdGhlIEhUTUwgY29kZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIGEgamF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRoYXQgaXMgYWJsZSB0byByZXN0b3JlIHRoZQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMKLSAgICAgICAgICAgIHdpdGggbG9uZyBsaXN0cyBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcAotICAgICAgICAgICAgaWYgeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZSBwYWdlLgotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BVVRPX1NDUk9MTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQotICAgICAgICAgICAgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucwotICAgICAgICAgICAgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IgZGlmZmVuZW50IGVuY3J5cHRpb24gc3RyZW5ndGhzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VDUkVUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+TnpZMU5ETXlNVEE9PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmFsaWRhdGUgbWFuYWdlZCBiZWFucywgbmF2aWdhdGlvbiBydWxlcyBhbmQgZW5zdXJlIHRoYXQgZm9ybXMgYXJlIG5vdCBuZXN0ZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVHJlYXQgcmVhZG9ubHkgc2FtZSBhcyBpZiBkaXNhYmxlZCBhdHRyaWJ1dGUgd2FzIHNldCBmb3Igc2VsZWN0IGVsZW1lbnRzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUkVBRE9OTFlfQVNfRElTQUJMRURfRk9SX1NFTEVDVFM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBVc2UgdGhlIGRlZmluZWQgY2xhc3MgYXMgdGhlIGNsYXNzIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSByZXNvdXJjZSBpcyBhZGRlZCB0byB0aGUKLSAgICAgICAgICAgIEV4dGVuc2lvbkZpbHRlciBoYW5kbGluZy4gVXNpbmcgU3RyZWFtaW5nQWRkUmVzb3VyY2UgaGVyZSBoZWxwcyB3aXRoIHBlcmZvcm1hbmNlLiBJZiB5b3Ugd2FudCB0byBhZGQKLSAgICAgICAgICAgIGN1c3RvbSBjb21wb25lbnRzIGFuZCB3YW50IHRvIHVzZSB0aGUgRXh0ZW5zaW9uRmlsdGVyLCB5b3UgbmVlZCB0byBwcm92aWRlIHlvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIGhlcmUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BRERfUkVTT1VSQ0VfQ0xBU1M8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwudXRpbC5EZWZhdWx0QWRkUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgICAgIAotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZpcnR1YWwgcGF0aCBpbiB0aGUgVVJMIHdoaWNoIHRyaWdnZXJzIGxvYWRpbmcgb2YgcmVzb3VyY2VzIGZvciB0aGUgTXlGYWNlcyBleHRlbmRlZCBjb21wb25lbnRzCi0gICAgICAgICAgICBpbiB0aGUgRXh0ZW5zaW9uRmlsdGVyLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUkVTT1VSQ0VfVklSVFVBTF9QQVRIPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L2ZhY2VzL215RmFjZXNFeHRlbnNpb25SZXNvdXJjZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBDaGVjayBpZiB0aGUgZXh0ZW5zaW9ucy1maWx0ZXIgaGFzIGJlZW4gcHJvcGVybHkgY29uZmlndXJlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNIRUNLX0VYVEVOU0lPTlNfRklMVEVSPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBEZWZpbmUgcGFydGlhbCBzdGF0ZSBzYXZpbmcgYXMgdHJ1ZS9mYWxzZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuUEFSVElBTF9TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0KLSAgICA8IS0tIExpc3RlbmVyLCB0byBhbGxvdyBKZXR0eSBzZXJ2aW5nIE15RmFjZXMgYXBwcyAtLT4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMud2ViYXBwLlN0YXJ0dXBTZXJ2bGV0Q29udGV4dExpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IC0tPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmcgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4qLmpzZjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4LmpzcDwvd2VsY29tZS1maWxlPgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhZWUwZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgICAgPGY6dmlldz4KLSAgICAgICAgICAgIDxoOmZvcm0gaWQ9Im1haW5Gb3JtIj4KLSAgICAgICAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjMiPgotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0iZmlyc3RfbmFtZSIgdmFsdWU9IkZpcnN0IG5hbWU6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJmaXJzdF9uYW1lIiB2YWx1ZT0iI3toZWxsb1dvcmxkLnBlcnNvbi5maXJzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9ImZpcnN0X25hbWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIgc2hvd0RldGFpbD0idHJ1ZSIvPgotCi0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJsYXN0X25hbWUiIHZhbHVlPSJMYXN0IG5hbWU6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJsYXN0X25hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJsYXN0X25hbWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIgc2hvd0RldGFpbD0idHJ1ZSIvPgotCi0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiB2YWx1ZT0iUHJlc3MgbWUiIGFjdGlvbj0iI3toZWxsb1dvcmxkLnNlbmR9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+Ci0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+Ci0gICAgICAgICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0gICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgPC9mOnZpZXc+Ci0gICAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI5YzIyOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPCVAIHBhZ2Ugc2Vzc2lvbj0iZmFsc2UiJT4KLTwlCi1yZXNwb25zZS5zZW5kUmVkaXJlY3QoImhlbGxvV29ybGQuanNmIik7Ci0lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNDRkZDIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgICA8Zjp2aWV3PgotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPgotICAgICAgICAgICAgICAgIDxoMj48aDpvdXRwdXRUZXh0IHZhbHVlPSJIZWxsbyAje2hlbGxvV29ybGQucGVyc29uLmZpcnN0TmFtZX0gI3toZWxsb1dvcmxkLnBlcnNvbi5sYXN0TmFtZX0uIFdlIGhvcGUgeW91IGVuam95IEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yISIvPjwvaDI+Ci0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZExpbmsgYWN0aW9uPSJiYWNrIj4KLSAgICAgICAgICAgICAgICAgICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iSG9tZSIvPgotICAgICAgICAgICAgICAgIDwvaDpjb21tYW5kTGluaz4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICA8L2Y6dmlldz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL3BvbS54bWwgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk1Y2FmNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgcHJvamVjdDwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzFfMS9leGFtcGxlcy88L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy9icmFuY2hfZm9yX2pzZl8xXzEvZXhhbXBsZXMvPC91cmw+Ci0gICAgPC9zY20+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tVGhpcyBwbHVnaW4gYWxsb3dzIHRvIHJ1biB0aGUgZXhhbXBsZSB1c2luZyBtdm4gamV0dHk6cnVuIC0tPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpldHR5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj42LjEuODwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+MTA8L3NjYW5JbnRlcnZhbFNlY29uZHM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi0gICAgPG1vZHVsZXM+Ci0gICAgICAgIDxtb2R1bGU+aGVsbG9fd29ybGQ8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5mZWF0dXJlLXNldF8wMTwvbW9kdWxlPgotICAgIDwvbW9kdWxlcz4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPCEtLSBUaGlzIHByb2ZpbGUgaXMgaW52b2tlZCBieSAtRHByZXBhcmVSZWxlYXNlPXRydWUuICBUaGlzIGFsbG93cyBtdm4gcmVsZWFzZTpwcmVwYXJlIHRvCi0gICAgICAgICAgICBydW4gc3VjY2Vzc2Z1bGx5IG9uIHRoZSBhc3NlbWJseSBwcm9qZWN0cy4gLS0+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPnByZXBhcmUtcmVsZWFzZTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPnByZXBhcmVSZWxlYXNlPC9uYW1lPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8bW9kdWxlcz4KLSAgICAgICAgICAgICAgICA8bW9kdWxlPmFzc2VtYmx5PC9tb2R1bGU+Ci0gICAgICAgICAgICA8L21vZHVsZXM+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZWxlYXNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+LURwcmVwYXJlUmVsZWFzZTwvYXJndW1lbnRzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLQotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8dHJpbmlkYWQudmVyc2lvbj4xLjAuNTwvdHJpbmlkYWQudmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvcGFyZW50L0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3BhcmVudC9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvcGFyZW50L0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvcGFyZW50L05PVElDRS50eHQgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvcGFyZW50L05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhM2RiZDYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3BhcmVudC9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gc2VjdGlvbiA0KGQpIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgICA9PQotPT0gIFZlcnNpb24gMi4wLCBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgTXlGYWNlcyBNYXZlbiBQbHVnaW5zICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoKLQotIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIE9yYWNsZSBDb3JwLCA8aHR0cDovL3d3dy5vcmFjbGUuY29tLz4uCi1hbmQgYXJlIGxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciB0aGUgCi0iU29mdHdhcmUgR3JhbnQgYW5kIENvcnBvcmF0ZSBDb250cmlidXRpb24gTGljZW5zZSBBZ3JlZW1lbnQiCi0KLVNlZSB0aGUgTElDRU5TRS50eHQgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gYWxsIGxpY2Vuc2VzIAotYXNzb2NpYXRlZCB3aXRoIHRoaXMgc29mdHdhcmUuCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvcGFyZW50L3BvbS54bWwgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvcGFyZW50L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMTkyMmUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3BhcmVudC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+NjwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4xLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBQcm9qZWN0IFBhcmVudDwvbmFtZT4KLSAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMTwvdXJsPgotCi0gICAgPGlzc3VlTWFuYWdlbWVudD4KLSAgICAgICAgPHN5c3RlbT5qaXJhPC9zeXN0ZW0+Ci0gICAgICAgIDx1cmw+aHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0VYVFZBTDwvdXJsPgotICAgIDwvaXNzdWVNYW5hZ2VtZW50PgotCi0gICAgPGNpTWFuYWdlbWVudD4KLSAgICAgICAgPHN5c3RlbT5jb250aW51dW08L3N5c3RlbT4KLSAgICAgICAgPHVybD5odHRwOi8vbXlmYWNlcy56b25lcy5hcGFjaGUub3JnOjgwODAvY29udGludXVtPC91cmw+Ci0gICAgICAgIDxub3RpZmllcnM+Ci0gICAgICAgICAgICA8bm90aWZpZXI+Ci0gICAgICAgICAgICAgICAgPHR5cGU+bWFpbDwvdHlwZT4KLSAgICAgICAgICAgICAgICA8c2VuZE9uU3VjY2Vzcz50cnVlPC9zZW5kT25TdWNjZXNzPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8YWRkcmVzcz5jb21taXRzQG15ZmFjZXMuYXBhY2hlLm9yZzwvYWRkcmVzcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L25vdGlmaWVyPgotICAgICAgICA8L25vdGlmaWVycz4KLSAgICA8L2NpTWFuYWdlbWVudD4KLSAgICAKLSAgICA8aW5jZXB0aW9uWWVhcj4yMDA4PC9pbmNlcHRpb25ZZWFyPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfTwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0KLSAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+Ci0gICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFyY2hpdmU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmU+Ci0gICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgotCi0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgICAgICAgIC0gQ29weSBMSUNFTlNFLnR4dCBhbmQgTk9USUNFLnR4dCBzbyB0aGF0IHRoZXkgYXJlIGluY2x1ZGVkCi0gICAgICAgICAgICAgICAgICAgIC0gaW4gdGhlIC1qYXZhZG9jIGphciBmaWxlIGZvciB0aGUgY29tcG9uZW50LgotICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmphdmFkb2MucmVzb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1zb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vYXBpZG9jcy9NRVRBLUlORiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IkxJQ0VOU0UudHh0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik5PVElDRS50eHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDwhLS0KLSAgICAgICAgICAgICAgICAtIE1ha2UgYSBjaGVja3N0eWxlIHZpb2xhdGlvbiBhIGNvbXBpbGUgZXJyb3IuIE5vdGUgdGhhdCBpZiBhIGNvbXBpbGUgZXJyb3Igb2NjdXJzLAotICAgICAgICAgICAgICAgIC0gZnVydGhlciBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGFyZ2V0L3NpdGUvY2hlY2tzdHlsZS5odG1sIChwcmVzZW50IGV2ZW4gd2hlbgotICAgICAgICAgICAgICAgIC0ganVzdCB0aGUgY29tcGlsZSBnb2FsIGFuZCBub3QgdGhlIHNpdGUgZ29hbCBoYXMgYmVlbiBydW4pLiBOb3RlIGFsc28gdGhhdCBjaGlsZAotICAgICAgICAgICAgICAgIC0gcHJvamVjdHMgbWF5IHJlZGVjbGFyZSB0aGlzIHBsdWdpbiBhbmQgcHJvdmlkZSBkaWZmZXJlbnQgY29uZmlndXJhdGlvbiBzZXR0aW5ncwotICAgICAgICAgICAgICAgIC0gdG8gdXNlIGRpZmZlcmVudCBjaGVja3MgKG1vcmUgb3IgbGVzcyBzdHJpY3QgdGhhbiB0aGUgZGVmYXVsdCkuCi0gICAgICAgICAgICAtLT4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY2hlY2tzdHlsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnZlcmlmeS1zdHlsZTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jaGVjazwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1jaGVja3Mtc3RhbmRhcmQueG1sPC9jb25maWdMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGhlYWRlckxvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1oZWFkZXIudHh0PC9oZWFkZXJMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS0gU2V0IGNvbXBpbGUgc291cmNlIGF0IDEuNSwgc2luY2UgdGhlIHRhcmdldCBKU0YgaW1wbCBpcyAxLjIgLS0+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4KLSAgICAgICAgICAgICAgICAgICAgPG9wdGltaXplPmZhbHNlPC9vcHRpbWl6ZT4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLSAgICA8cmVwb3NpdG9yaWVzPgotICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5tYXZlbjItcmVwb3NpdG9yeS5kZXYuamF2YS5uZXQ8L2lkPgotICAgICAgICAgICAgPG5hbWU+SmF2YS5uZXQgUmVwb3NpdG9yeSBmb3IgTWF2ZW48L25hbWU+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9kb3dubG9hZC5qYXZhLm5ldC9tYXZlbi8xLzwvdXJsPgotICAgICAgICAgICAgPGxheW91dD5sZWdhY3k8L2xheW91dD4KLSAgICAgICAgPC9yZXBvc2l0b3J5PgotICAgIDwvcmVwb3NpdG9yaWVzPgotCi0gICAgPHJlcG9ydGluZz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qeHItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1yZXBvcnQtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4zPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3QtaW5mby1yZXBvcnRzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjAuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbWQtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHJ1bGVzZXRzPgotICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL2Jhc2ljLnhtbDwvcnVsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxydWxlc2V0Pi9ydWxlc2V0cy91bnVzZWRjb2RlLnhtbDwvcnVsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgPC9ydWxlc2V0cz4KLSAgICAgICAgICAgICAgICAgICAgPGxpbmtYcmVmPnRydWU8L2xpbmtYcmVmPgotICAgICAgICAgICAgICAgICAgICA8bWluaW11bVRva2Vucz4xMDA8L21pbmltdW1Ub2tlbnM+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXRKZGs+MS41PC90YXJnZXRKZGs+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGVja3N0eWxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWdMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0YW5kYXJkLnhtbDwvY29uZmlnTG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxoZWFkZXJMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtaGVhZGVyLnR4dDwvaGVhZGVyTG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L3JlcG9ydGluZz4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzFfMS9wYXJlbnQvPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMV8xL3BhcmVudC88L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzFfMS9wYXJlbnQvPC91cmw+Ci0gICAgPC9zY20+Ci0KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDx1bmlxdWVWZXJzaW9uPmZhbHNlPC91bmlxdWVWZXJzaW9uPgotICAgICAgICAgICAgPGlkPmFwYWNoZS5zbmFwc2hvdHM8L2lkPgotICAgICAgICAgICAgPG5hbWU+QXBhY2hlIE1hdmVuIFNuYXBzaG90IFJlcG9zaXRvcnk8L25hbWU+Ci0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4KLSAgICAgICAgPC9zbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgICAgIDxzaXRlPgotICAgICAgICAgICAgPGlkPmFwYWNoZS1zaXRlPC9pZD4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExPC91cmw+Ci0gICAgICAgIDwvc2l0ZT4KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0KLSAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmdlbmVyYXRlLWFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+cGVyZm9ybVJlbGVhc2U8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDx2YWx1ZT50cnVlPC92YWx1ZT4KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLWphdmFkb2NzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLQotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8anNmLnZlcnNpb24+MS4xLjU8L2pzZi52ZXJzaW9uPgotICAgIDwvcHJvcGVydGllcz4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4M2NhNjcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3BhcmVudC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0gLS0tLS0tDQotT3ZlcnZpZXcNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjENCi0NCi0gIEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIHByb3ZpZGVzIHZlcnNpb25zIGZvciBKU0YgMS4xIGFuZCAxLjINCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvcGFyZW50L3NyYy9zaXRlL3NpdGUueG1sIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3BhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVhNGI0Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvcGFyZW50L3NyYy9zaXRlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IG5hbWU9IkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIj4KLSAgPGJhbm5lckxlZnQ+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXM8L25hbWU+Ci0gICAgPHNyYz5pbWcvYmFubmVycy9NeUZhY2VzX2xvZ28uanBnPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sPC9ocmVmPgotICA8L2Jhbm5lckxlZnQ+Ci0KLSAgPGJhbm5lclJpZ2h0PgotICAgIDxuYW1lPkFwYWNoZSBCYW5uZXI8L25hbWU+Ci0gICAgPHNyYz5pbWcvYmFubmVycy9hcGFjaGVfYmFubmVyLnBuZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L2hyZWY+Ci0gIDwvYmFubmVyUmlnaHQ+ICAKLQotICA8cHVibGlzaERhdGUgZm9ybWF0PSJkZCBNTU0geXl5eSIvPgotCi0gIDxza2luPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5tYXZlbjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLXNpdGUtc2tpbjwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3NraW4+Ci0KLSAgPGJvZHk+Ci0gICAgPGxpbmtzPgotICAgICAgPGl0ZW0gbmFtZT0iQXBhY2hlIiBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmciLz4KLSAgICAgIDxpdGVtIG5hbWU9Ik15RmFjZXMiIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQgTXlmYWNlcyBFeHRWYWwiIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZG93bmxvYWQuaHRtbCIvPgotICAgIDwvbGlua3M+Ci0KLSAgICA8bWVudSBuYW1lPSJBcGFjaGUgTXlGYWNlcyIgaW5oZXJpdD0idG9wIj4KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkRvd25sb2FkIiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2Rvd25sb2FkLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0KLSAgICA8bWVudSBuYW1lPSJDb250ZW50cyIgaW5oZXJpdD0idG9wIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iTWFpbiBTaXRlIiAgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW5kZXguaHRtbCIvPgotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjEiICAgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iQ29yZSBNb2R1bGUiICAgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvbXlmYWNlcy1leHR2YWwtY29yZS9pbmRleC5odG1sIi8+Ci0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IlByb3BlcnR5IFZhbGlkYXRpb24iICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExL3ZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb24vaW5kZXguaHRtbCIvPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJUcmluaWRhZCBTdXBwb3J0IiAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS9jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydC9pbmRleC5odG1sIi8+Ci0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IkdlbmVyaWMgU3VwcG9ydCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExL2NvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQvaW5kZXguaHRtbCIvPgotICAgICAgICA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Ik15ZmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjIiICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2luZGV4Lmh0bWwiIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9ImR1bW15IiAgICAgICAgaHJlZj0iZHVtbXkiLz4KLSAgICAgICAgPC9pdGVtPgotICAgIDwvbWVudT4KLQkKLSAgICA8bWVudSBuYW1lPSJEb2N1bWVudGF0aW9uIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iV2lraSIgICAgICAgICBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL215ZmFjZXMvRXh0ZW5zaW9ucy9WYWxpZGF0b3IvIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgcmVmPSJyZXBvcnRzIi8+Ci0KLSAgICA8bWVudSBuYW1lPSJGb3VuZGF0aW9uIiBpbmhlcml0PSJib3R0b20iPgotICAgICAgPGl0ZW0gbmFtZT0iQVNGIiAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iIC8+Ci0gICAgICA8aXRlbSBuYW1lPSJTcG9uc29yc2hpcCIgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vc3BvbnNvcnNoaXAuaHRtbCIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlRoYW5rcyIgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi90aGFua3MuaHRtbCIgLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy9wb20ueG1sIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZjQ1OWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtbW9kdWxlPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgTW9kdWxlPC9uYW1lPgotICAgIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExPC91cmw+Ci0gICAgCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMV8xLzwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzFfMS88L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzFfMS88L3VybD4KLSAgICA8L3NjbT4gICAgCi0KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDx1bmlxdWVWZXJzaW9uPmZhbHNlPC91bmlxdWVWZXJzaW9uPgotICAgICAgICAgICAgPGlkPmFwYWNoZS5zbmFwc2hvdHM8L2lkPgotICAgICAgICAgICAgPG5hbWU+QXBhY2hlIE1hdmVuIFNuYXBzaG90IFJlcG9zaXRvcnk8L25hbWU+Ci0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4KLSAgICAgICAgPC9zbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgICAgIDxzaXRlPgotICAgICAgICAgICAgPGlkPmFwYWNoZS1zaXRlPC9pZD4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyPC91cmw+Ci0gICAgICAgIDwvc2l0ZT4KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0KLSAgICA8IS0tIFdBUk5JTkc6IERPIE5PVCBHRU5FUkFURSBTSVRFIEZST00gSEVSRSBESVJFQ1RMWQotICAgIFNpbmNlIHRoaXMgcHJvamVjdCBoYXMgYW4gYXN5bmMgcmVsZWFzZSBwcm9jZWR1cmUgKG5vdAotICAgIGFsbCBtb2R1bGVzIHNob3VsZCBiZSByZWxlYXNlZCBhdCBvbmNlKSwgdGhlIHBhcmVudCBwb20ueG1sIAotICAgIGlzIG5vdCB0aGlzICh0aGVyZSBpcyBhIG1vZHVsZSBmb3IgdGhhdCkuIFVzZSBtYXZlbiBzaXRlIAotICAgIHBsdWdpbiBoZXJlIGNhdXNlIHByb2JsZW1zIHdoZW4gdGhlIHNpdGUgaXMgZ2VuZXJhdGVkLgotICAgIFRoZSBwcm9jZWR1cmUgbXVzdCBleGVjdXRlIHNpdGUgY29tbW1hbmQgZmlyc3Qgb24gcGFyZW50IAotICAgIG1vZHVsZSBhbmQgdGhlbiBvbiBlYWNoIG1vZHVsZSBsaXN0ZWQgYmVsb3cuIAotICAgICAtLT4KLQotICAgIDxtb2R1bGVzPgotICAgICAgICA8bW9kdWxlPnBhcmVudDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmNvcmU8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT52YWxpZGF0aW9uLW1vZHVsZXM8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5jb21wb25lbnQtc3VwcG9ydDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmV4YW1wbGVzPC9tb2R1bGU+Ci0gICAgPC9tb2R1bGVzPgotCi0gICAgPHByb2ZpbGVzPgotICAgICAgICA8IS0tIFRoaXMgcHJvZmlsZSBpcyBpbnZva2VkIGJ5IC1EcHJlcGFyZVJlbGVhc2U9dHJ1ZS4gIFRoaXMgYWxsb3dzIG12biByZWxlYXNlOnByZXBhcmUgdG8KLSAgICAgICAgICAgIHJ1biBzdWNjZXNzZnVsbHkgb24gdGhlIGFzc2VtYmx5IHByb2plY3RzLiAtLT4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+cHJlcGFyZS1yZWxlYXNlPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+cHJlcGFyZVJlbGVhc2U8L25hbWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxtb2R1bGVzPgotICAgICAgICAgICAgICAgIDxtb2R1bGU+YXNzZW1ibHk8L21vZHVsZT4KLSAgICAgICAgICAgIDwvbW9kdWxlcz4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ3VtZW50cz4tRHByZXBhcmVSZWxlYXNlPC9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotICAgIAotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8anNmLnZlcnNpb24+MS4xLjU8L2pzZi52ZXJzaW9uPgotICAgIDwvcHJvcGVydGllcz4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZTY5NzIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFZhbGlkYXRpb24tTW9kdWxlczwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy88L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvPC91cmw+Ci0gICAgPC9zY20+Ci0KLSAgICA8bW9kdWxlcz4KLSAgICAgICAgPG1vZHVsZT5wcm9wZXJ0eS12YWxpZGF0aW9uPC9tb2R1bGU+Ci0gICAgICAgIDwhLS1tb2R1bGU+YmVhbi12YWxpZGF0aW9uPC9tb2R1bGUtLT4KLSAgICA8L21vZHVsZXM+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY1MzBiZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgUHJvcGVydHktVmFsaWRhdGlvbi1Nb2R1bGU8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4xLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4xLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnBlcnNpc3RlbmNlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGVyc2lzdGVuY2UtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICAgICAgPCEtLSBUZXN0IGRlcGVuZGVuY2llcyAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldC5qc3A8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3AtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zaGFsZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNoYWxlLXRlc3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuNDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPgotICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9BYnN0cmFjdCouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL1Rlc3RVdGlscy5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKkJlYW4uamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4gICAgICAgICAgICAKLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NTRiZjYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCFET0NUWVBFIGZhY2VzLWNvbmZpZyBQVUJMSUMNCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiINCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxmYWNlcy1jb25maWc+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLQ0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFjNDg3ZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFNlY3JldDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVMaXN0Ym94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVSYWRpbzsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueU1lbnU7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dGFyZWE7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBjb25maWd1cmVSZXF1aXJlZEF0dHJpYnV0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7Ci0gICAgICAgIGNvbmZpZ3VyZU1heExlbmd0aEF0dHJpYnV0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlUmVxdWlyZWRBdHRyaWJ1dGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYoIXByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZigoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQpKSB8fAotICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICAgICAgJiYKLSAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMoaXNDb21wb25lbnRSZXF1aXJlZCh1aUNvbXBvbmVudCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpICYmCi0gICAgICAgICAgICAgICAhQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lUmFkaW8gfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TGlzdGJveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpZiB0aGVyZSBpcyBubyBzcGVjaWFsIGF0dHJpYnV0ZSBhdCB0aGUgY29tcG9uZW50IHdoaWNoIHNob3VsZCBvdmVycnVsZQotICAgICAqIHRoZSBhbm5vdGF0ZWQgcHJvcGVydHkgcmV0dXJuIHRydWUhCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgY29tcG9uZW50IHdoaWNoIGltcGxlbWVudHMgdGhlIEVkaXRhYmxlVmFsdWVIb2xkZXIgaW50ZXJmYWNlCi0gICAgICogQHJldHVybiBmYWxzZSB0byBvdmVycnVsZSB0aGUgYW5ub3RhdGVkIHByb3BlcnR5IGUuZy4gaWYgY29tcG9uZW50IGlzIHJlYWRvbmx5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEJvb2xlYW4gaXNDb21wb25lbnRSZXF1aXJlZChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNSZWFkb25seSIpKSk7Ci0gICAgICAgIGJvb2xlYW4gaXNEaXNhYmxlZCA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNEaXNhYmxlZCIpKSk7Ci0KLSAgICAgICAgcmV0dXJuICEoaXNSZWFkT25seSB8fCBpc0Rpc2FibGVkKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVNYXhMZW5ndGhBdHRyaWJ1dGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1heExlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCk7Ci0KLSAgICAgICAgICAgIGlmKCEobWF4TGVuZ3RoIGluc3RhbmNlb2YgSW50ZWdlcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEh0bWxJbnB1dFRleHQgaHRtbElucHV0VGV4dCA9IChIdG1sSW5wdXRUZXh0KXVpQ29tcG9uZW50OwotICAgICAgICAgICAgICAgIGh0bWxJbnB1dFRleHQuc2V0TWF4bGVuZ3RoKChJbnRlZ2VyKW1heExlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODQzZjIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0U2VjcmV0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZUxpc3Rib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZU1lbnU7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZVJhZGlvOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55Q2hlY2tib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlMaXN0Ym94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TWVudTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0YXJlYTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEh0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcgotewotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpCi0gICAgewotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKTsKLQotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gKFN0cmluZykgUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiZ2V0TGFiZWwiKSk7Ci0KLSAgICAgICAgICAgIGlmKGxhYmVsID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGFiZWwgPSB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL292ZXJyaWRlIHRoZSBsYWJlbCBpZiB0aGUgYW5ub3RhdGlvbiBwcm92aWRlcyBhIGxhYmVsCi0gICAgICAgICAgICBpZihtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxhYmVsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCwgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwoZmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lUmFkaW8gfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TGlzdGJveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MWY4NGIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnJlY29yZGVyLkNyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyDQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcihuZXcgQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIoKSk7DQotDQotICAgICAgICBpbml0U3RhdGljU3RyYXRlZ3lNYXBwaW5ncygpOw0KLSAgICAgICAgaW5pdERlZmF1bHRDb21wb25lbnRJbml0aWFsaXplcigpOw0KLSAgICAgICAgaW5pdERlZmF1bHRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKTsNCi0gICAgICAgIGFkZFNraXBWYWxpZGF0aW9uU3VwcG9ydCgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0U3RhdGljU3RyYXRlZ3lNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBqcGFCYXNlZFZhbGlkYXRpb24gPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9KUEFfQkFTRURfVkFMSURBVElPTjsNCi0gICAgICAgIGlmIChqcGFCYXNlZFZhbGlkYXRpb24gPT0gbnVsbA0KLSAgICAgICAgICAgICAgICB8fCAhanBhQmFzZWRWYWxpZGF0aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgPSBuZXcgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZygNCi0gICAgICAgICAgICAgICAgRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgKyIuanBhX3N0cmF0ZWd5X21hcHBpbmdzIik7DQotDQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkU3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRywgc3RhdGljQ29uZmlnKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAid2ViLnhtbCBwYXJhbWV0ZXIgdG8gZGVhY3RpdmF0ZSBpdCIpDQotICAgIHByaXZhdGUgdm9pZCBpbml0RGVmYXVsdENvbXBvbmVudEluaXRpYWxpemVyKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ3ZWIueG1sIHBhcmFtZXRlciB0byBkZWFjdGl2YXRlIGl0IikNCi0gICAgcHJpdmF0ZSB2b2lkIGluaXREZWZhdWx0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKA0KLSAgICAgICAgICAgICAgICBuZXcgSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRTa2lwVmFsaWRhdGlvblN1cHBvcnQoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJhZGRpbmcgc3VwcG9ydCBmb3IgQFNraXBWYWxpZGF0aW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5kZW55UmVuZGVyZXJJbnRlcmNlcHRvcihWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKG5ldyBWYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0KCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yV2l0aFNraXBWYWxpZGF0aW9uU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTZhNzIxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkludGVyY2VwdG9yV2l0aFNraXBWYWxpZGF0aW9uU3VwcG9ydCBleHRlbmRzIFZhbGlkYXRpb25JbnRlcmNlcHRvcgotewotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIHNraXBWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpCi0gICAgewotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KFNraXBWYWxpZGF0aW9uU3VwcG9ydC5jbGFzcykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJvb2xlYW4gc2tpcFZhbGlkYXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlNLSVBfVkFMSURBVElPTiwgQm9vbGVhbi5jbGFzcyk7Ci0KLSAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMoc2tpcFZhbGlkYXRpb24pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJ2YWxpZGF0aW9uIG9mICIgKyB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGNhbmNlbGVkIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZih2YWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGFuY2VvZiBTa2lwVmFsaWRhdGlvblN0cmF0ZWd5KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgbnVsbCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlZWIyOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRvY3VtZW50YXRpb24iKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NRVNTQUdFU19KUEEgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJKUEFfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFUyIpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfSlBBX0JBU0VEX1ZBTElEQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OIik7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vRG91YmxlUmFuZ2UuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vRG91YmxlUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2MWMxYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0RvdWJsZVJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgRG91YmxlUmFuZ2UNCi17DQotICAgIGRvdWJsZSBtaW5pbXVtKCkgZGVmYXVsdCAwOw0KLQ0KLSAgICBkb3VibGUgbWF4aW11bSgpIGRlZmF1bHQgRG91YmxlLk1BWF9WQUxVRTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Kb2luVmFsaWRhdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Kb2luVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGI1MmJmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vSm9pblZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBKb2luVmFsaWRhdGlvbg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTGVuZ3RoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNTJmZmMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBMZW5ndGgNCi17DQotICAgIGludCBtaW5pbXVtKCkgZGVmYXVsdCAwOw0KLQ0KLSAgICBpbnQgbWF4aW11bSgpIGRlZmF1bHQgSW50ZWdlci5NQVhfVkFMVUU7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTkyOTQ0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgTG9uZ1JhbmdlDQotew0KLSAgICBsb25nIG1pbmltdW0oKSBkZWZhdWx0IDA7DQotDQotICAgIGxvbmcgbWF4aW11bSgpIGRlZmF1bHQgTG9uZy5NQVhfVkFMVUU7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUGF0dGVybi5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NDliOWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLUBSZXRlbnRpb24oUlVOVElNRSkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIEBpbnRlcmZhY2UgUGF0dGVybgotewotICAgIFN0cmluZ1tdIHZhbHVlKCk7Ci0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAibm9fbWF0Y2giOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZC5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjY1YjNjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUmVxdWlyZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBSZXF1aXJlZA0KLXsNCi0gICAgLyoqDQotICAgICAqIHRvIGN1c3RvbWl6ZSB0aGUgZXJyb3IgbWVzc2FnZSBvcg0KLSAgICAgKiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBqc2YgcmVxdWlyZWQgbWVzc2FnZSB3aXRoIHRoZSB1c2FnZSBvZiB0aGUgbWVzc2FnZSByZXNvbHZlciBtZWNoYW5pc20NCi0gICAgICoNCi0gICAgICogQHJldHVybiBhbiBvcHRpb25hbCBlcnJvciBtZXNzYWdlIGtleQ0KLSAgICAgKi8NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImZpZWxkX3JlcXVpcmVkIjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzY3NmI2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotQFJldGVudGlvbihSVU5USU1FKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgQGludGVyZmFjZSBTa2lwVmFsaWRhdGlvbgotewotICAgIFN0cmluZ1tdIHZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uU3VwcG9ydC5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE5OTViYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRhcmdldChUWVBFKQotQFJldGVudGlvbihSVU5USU1FKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgQGludGVyZmFjZSBTa2lwVmFsaWRhdGlvblN1cHBvcnQKLXsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vVmFsaWRhdG9yLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDk0MGM2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgVmFsaWRhdG9yDQotew0KLSAgICBDbGFzczw/IGV4dGVuZHMgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcj5bXSB2YWx1ZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YTNkYjcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvciBleHRlbmRzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcgotewotICAgIEBPdmVycmlkZQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkKLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsKLQotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBQcm9wZXJ0eURldGFpbHMpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG9iamVjdC5nZXRDbGFzcygpICsgIiBpcyBub3QgYSAiICsgUHJvcGVydHlEZXRhaWxzLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gKFByb3BlcnR5RGV0YWlscylvYmplY3Q7Ci0KLSAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCk7Ci0KLSAgICAgICAgLy9UT0RPIHRlc3Qgd2l0aCBjb21wbGV4IGNvbXBvbmVudHMKLSAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5zZXRJbmZvcm1hdGlvbigKLSAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIHByb3BlcnR5RGV0YWlscyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZmluZCBhbmQgYWRkIGFubm90YXRpb25zCi0gICAgICAgICAqLwotICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTgwMTIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPVRoZSByZXF1aXJlZCBmb3JtYXRlIGlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YWI1NDMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPVx1MDYyN1x1MDY0NFx1MDYzNVx1MDY0YVx1MDYzYVx1MDYyOSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2MjZcdTA2MjkNCi1ub19tYXRjaF9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjM1XHUwNjRhXHUwNjNhXHUwNjI5IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzN1x1MDY0NFx1MDY0OFx1MDYyOFx1MDYyOSBcdTA2NDdcdTA2NDk6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThkNjQ5MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW5vX21hdGNoPUZvcm1hdCBpbnZcdTAwZTBsaWQKLW5vX21hdGNoX2RldGFpbD1FbCBmb3JtYXQgcmVxdWVyaXQgXHUwMGU5czogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWU3MDFiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1Vbmf8bHRpZ2VzIEZvcm1hdA0KLW5vX21hdGNoX2RldGFpbD1EYXMgZXJmb3JkZXJsaWNoZSBGb3JtYXQgaXN0OiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTgwMTIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPVRoZSByZXF1aXJlZCBmb3JtYXRlIGlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYjEwNzcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXRvIGludlx1MDBlMWxpZG8gCi1ub19tYXRjaF9kZXRhaWw9RWwgZm9ybWF0byByZXF1ZXJpZG8gZXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwYTIyMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9TGUgZm9ybWF0IGVzdCBpbnZhbGlkZQ0KLW5vX21hdGNoX2RldGFpbD1MZSBmb3JtYXQgZG9pdCAmZWNpcmM7dHJlIGRlIGxhIGZvcm1lOiB7MH0NCi0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxODc0OGMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXRvIG5vbiB2YWxpZG8KLW5vX21hdGNoX2RldGFpbD1JbCBmb3JtYXRvIHJpY2hpZXN0byAmZWdyYXZlOzogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTRiYzc0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1HZVx1MDBlN2Vyc2l6IGJpXHUwMGU3aW0NCi1ub19tYXRjaF9kZXRhaWw9Z2VyZWtlbiBiaVx1MDBlN2ltOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWU5NjdhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgICAgIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZU5hbWUgPSBudWxsOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VOYW1lID0gc3VwZXIuZ2V0QmFzZU5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBiYXNlTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9KcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk0ZWNlMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIHRoZSBqcGEgc3VwcG9ydCBpcyBhbiBleGNlcHRpb24gaW4gdmlldyBvZiBzb21lIG1lY2hhbmlzbXMgLSBzbyB0aGVyZSdzIG5vIGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZS4NCi0gKiBpbnN0ZWFkIG9mIHRoZSBjb252ZW50aW9uIHRoZXJlIGlzIGEgZ2xvYmFsIHByb3BlcnR5IHRvIGhhdmUgYW4gYWx0ZXJuYXRpdmUgdG8gd2ViLnhtbCBjb25maWd1cmF0aW9uDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTID0gIkpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTIjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX05BTUUgPSBXZWJYbWxQYXJhbWV0ZXIuVkFMSURBVElPTl9NRVNTQUdFU19KUEE7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX05BTUUgPSBKcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MNCi0gICAgICAgICAgICAuZ2V0UGFja2FnZSgpLmdldE5hbWUoKS5yZXBsYWNlKCIubWVzc2FnZS5yZXNvbHZlciIsICIubWVzc2FnZS5idW5kbGUiKSsgIi5qcGFfbWVzc2FnZXMiOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYoQ1VTVE9NX0JBU0VfTkFNRSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBDVVNUT01fQkFTRV9OQU1FOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQkFTRV9OQU1FOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZGQxOGMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgRG91YmxlUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoRG91YmxlUmFuZ2UuY2xhc3MpOw0KLQ0KLSAgICAgICAgZG91YmxlIG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4sIG1pbmltdW0pOw0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCwgYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgaWYobWluaW11bSA+IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSm9pbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pvaW5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMDg4MmUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSm9pbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3Rvci5EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKb2luTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yKCk7DQotDQotICAgICAgICBTdHJpbmdbXSB0YXJnZXRFeHByZXNzaW9ucyA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoSm9pblZhbGlkYXRpb24uY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdGFyZ2V0RXhwcmVzc2lvbiA6IHRhcmdldEV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogZXh0cmFjdG9yLmV4dHJhY3QoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMpLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOw0KLQ0KLSAgICAgICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyID0gRXh0VmFsVXRpbHMuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckZvclZhbGlkYXRpb25TdHJhdGVneSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1dEFsbChtZXRhRGF0YVRyYW5zZm9ybWVyLmNvbnZlcnRNZXRhRGF0YShlbnRyeSkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGJmZGJhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pwYU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQmFzaWM7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpwYU1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiaW1wbC4gdGhlIHJlc3QiKQ0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBtZXRhRGF0YS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmKGFubm90YXRpb24gaW5zdGFuY2VvZiBDb2x1bW4pDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoISgoQ29sdW1uKSBhbm5vdGF0aW9uKS5udWxsYWJsZSgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgsICgoQ29sdW1uKSBhbm5vdGF0aW9uKS5sZW5ndGgoKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKGFubm90YXRpb24gaW5zdGFuY2VvZiBCYXNpYykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighKChCYXNpYykgYW5ub3RhdGlvbikub3B0aW9uYWwoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihhbm5vdGF0aW9uIGluc3RhbmNlb2YgSWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vVE9ETyBpbXBsLiB0aGUgcmVzdCEhIQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTGVuZ3RoTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTGVuZ3RoTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2M1ZWUzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxlbmd0aDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIExlbmd0aCBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMZW5ndGguY2xhc3MpOw0KLQ0KLSAgICAgICAgaW50IG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RILCBtaW5pbXVtKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RILCBhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBpZihtaW5pbXVtID4gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Mb25nUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Mb25nUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ODVlMmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTG9uZ1JhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTG9uZ1JhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKExvbmdSYW5nZS5jbGFzcyk7DQotDQotICAgICAgICBsb25nIG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4sIG1pbmltdW0pOw0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCwgYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgaWYobWluaW11bSA+IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1BhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NGE1YjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQYXR0ZXJuTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgUGF0dGVybiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShQYXR0ZXJuLmNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4sIChhbm5vdGF0aW9uKS52YWx1ZSgpKTsNCi0NCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkgPSAoYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgICAgICBMb2NhbGUgY3VycmVudExvY2FsZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpOw0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSA9DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7DQotDQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnID0gRXh0VmFsVXRpbHMuZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAuZ2V0TWVzc2FnZSh2YWxpZGF0aW9uRXJyb3JNc2dLZXksIGN1cnJlbnRMb2NhbGUpOw0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFLCB2YWxpZGF0aW9uRXJyb3JNc2cpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9SZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThmNWFhNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9SZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MTc0ODkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uVmFsaWRhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIFZhbGlkYXRvciBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShWYWxpZGF0b3IuY2xhc3MpOw0KLQ0KLSAgICAgICAgQ2xhc3NbXSB2YWxpZGF0b3JzID0gYW5ub3RhdGlvbi52YWx1ZSgpOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBmb3IoQ2xhc3MgY3VycmVudENsYXNzIDogdmFsaWRhdG9ycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihjdXJyZW50Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpLnRvTG93ZXJDYXNlKCkuY29udGFpbnMoQ29tbW9uTWV0YURhdGFLZXlzLkVNQUlMKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbHVlLmFkZChDb21tb25NZXRhRGF0YUtleXMuRU1BSUwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB2YWx1ZS5hZGQoY3VycmVudENsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuQ1VTVE9NLCB2YWx1ZSk7DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNzU5MzMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvRG91YmxlUmFuZ2VTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uRG91YmxlUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5Eb3VibGVSYW5nZVZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRG91YmxlUmFuZ2VTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotDQotICAgICAgICBEb3VibGVSYW5nZSBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShEb3VibGVSYW5nZS5jbGFzcyk7DQotICAgICAgICBEb3VibGVSYW5nZVZhbGlkYXRvciBkb3VibGVSYW5nZVZhbGlkYXRvciA9IChEb3VibGVSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigiamF2YXguZmFjZXMuRG91YmxlUmFuZ2UiKTsNCi0NCi0gICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnNldE1pbmltdW0oYW5ub3RhdGlvbi5taW5pbXVtKCkpOw0KLSAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bShhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkNGE5MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Kb2luVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Kb2luVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5leHRyYWN0b3IuRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpvaW5WYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IoKTsNCi0NCi0gICAgICAgIFN0cmluZ1tdIHRhcmdldEV4cHJlc3Npb25zID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShKb2luVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdGFyZ2V0RXhwcmVzc2lvbiA6IHRhcmdldEV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogZXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCBwcm9wZXJ0eURldGFpbHMpLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBlbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gdmFsaWRhdGlvbiBzdHJhdGVneSBmb3VuZCBmb3IgIiArIGVudHJ5LmdldFZhbHVlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSnBhVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MTRkOGUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSnBhVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5CYXNpYzsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmU7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKcGFWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VGYWNlc0J1bmRsZSA9IGZhbHNlOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVEVfTEVOR1RIID0gImxlbmd0aCI7DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHZpb2xhdGlvbjsNCi0gICAgcHJpdmF0ZSBpbnQgbWF4TGVuZ3RoOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyk7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIENvbHVtbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZUNvbHVtbkFubm90YXRpb24oKENvbHVtbikgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBCYXNpYykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZUJhc2ljQW5ub3RhdGlvbigoQmFzaWMpIGFubm90YXRpb24sIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgSWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE9uZVRvT25lKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlT25lVG9PbmVBbm5vdGF0aW9uKChPbmVUb09uZSkgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBNYW55VG9PbmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVNYW55VG9PbmVBbm5vdGF0aW9uKChNYW55VG9PbmUpIGFubm90YXRpb24sIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ29sdW1uQW5ub3RhdGlvbihDb2x1bW4gY29sdW1uLCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICghY29sdW1uLm51bGxhYmxlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcNCi0gICAgICAgICAgICAgICAgJiYgY29sdW1uLmxlbmd0aCgpIDwgKChTdHJpbmcpIGNvbnZlcnRlZE9iamVjdCkubGVuZ3RoKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb24gPSBWQUxJREFURV9MRU5HVEg7DQotICAgICAgICAgICAgdGhpcy5tYXhMZW5ndGggPSBjb2x1bW4ubGVuZ3RoKCk7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihnZXRWYWxpZGF0aW9uRXJyb3JGYWNlc01hc3NhZ2UobnVsbCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUJhc2ljQW5ub3RhdGlvbihCYXNpYyBiYXNpYywgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoIWJhc2ljLm9wdGlvbmFsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU9uZVRvT25lQW5ub3RhdGlvbihPbmVUb09uZSBvbmVUb09uZSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFvbmVUb09uZS5vcHRpb25hbCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVNYW55VG9PbmVBbm5vdGF0aW9uKE1hbnlUb09uZSBtYW55VG9PbmUsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmICghbWFueVRvT25lLm9wdGlvbmFsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkNCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0ID09IG51bGwgfHwgY29udmVydGVkT2JqZWN0LmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb24gPSBDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQ7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihnZXRWYWxpZGF0aW9uRXJyb3JGYWNlc01hc3NhZ2UobnVsbCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKFZBTElEQVRFX0xFTkdUSC5lcXVhbHModGhpcy52aW9sYXRpb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAiZmllbGRfdG9vX2xvbmciOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAiZmllbGRfcmVxdWlyZWQiOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBzdXBlci5nZXRFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbik7DQotDQotICAgICAgICBpZiAoVkFMSURBVEVfTEVOR1RILmVxdWFscyh0aGlzLnZpb2xhdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgiezB9IiwgIiIgKyB0aGlzLm1heExlbmd0aCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHN1cGVyLnJlc29sdmVNZXNzYWdlKGtleSk7DQotICAgICAgICBTdHJpbmcgbWFya2VyID0gQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVI7DQotDQotICAgICAgICBpZigobWFya2VyICsga2V5ICsgbWFya2VyKS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnVzZUZhY2VzQnVuZGxlID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIGUpDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSBlLmdldEZhY2VzTWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgaWYodGhpcy51c2VGYWNlc0J1bmRsZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihWQUxJREFURV9MRU5HVEguZXF1YWxzKHRoaXMudmlvbGF0aW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdE1heGltdW1NZXNzYWdlKGZhY2VzTWVzc2FnZSwgdGhpcy5tYXhMZW5ndGgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5yZXBsYWNlV2l0aERlZmF1bHRSZXF1aXJlZE1lc3NhZ2UoZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTGVuZ3RoU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xlbmd0aFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZDA1NTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTGVuZ3RoU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxlbmd0aDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkxlbmd0aFZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTGVuZ3RoU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgTGVuZ3RoIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKExlbmd0aC5jbGFzcyk7DQotICAgICAgICBMZW5ndGhWYWxpZGF0b3IgbGVuZ3RoVmFsaWRhdG9yID0gKExlbmd0aFZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigiamF2YXguZmFjZXMuTGVuZ3RoIik7DQotDQotICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWF4aW11bShhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBsZW5ndGhWYWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTG9uZ1JhbmdlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM1ODIwMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTG9uZ1JhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTG9uZ1JhbmdlVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMb25nUmFuZ2VTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotDQotICAgICAgICBMb25nUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTG9uZ1JhbmdlLmNsYXNzKTsNCi0gICAgICAgIExvbmdSYW5nZVZhbGlkYXRvciBsb25nUmFuZ2VWYWxpZGF0b3IgPSAoTG9uZ1JhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoImphdmF4LmZhY2VzLkxvbmdSYW5nZSIpOw0KLQ0KLSAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnNldE1pbmltdW0oYW5ub3RhdGlvbi5taW5pbXVtKCkpOw0KLSAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUGF0dGVyblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9QYXR0ZXJuU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE1N2JmZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9QYXR0ZXJuU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5QYXR0ZXJuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0Ci1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFBhdHRlcm5TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneQotewotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LAotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbgotICAgIHsKLQotICAgICAgICBQYXR0ZXJuIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFBhdHRlcm4uY2xhc3MpOwotCi0gICAgICAgIGZvciAoU3RyaW5nIGV4cHJlc3Npb24gOiBhbm5vdGF0aW9uLnZhbHVlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICB8fCAhamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4uY29tcGlsZShleHByZXNzaW9uKS5tYXRjaGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdC50b1N0cmluZygpKS5tYXRjaGVzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihuZXcgRmFjZXNNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKS5yZXBsYWNlKCJ7MH0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoUGF0dGVybikgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUmVxdWlyZWRTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUmVxdWlyZWRTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzhmOTk2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFJlcXVpcmVkU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VGYWNlc0J1bmRsZSA9IGZhbHNlOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0ID09IG51bGwgfHwgY29udmVydGVkT2JqZWN0LmVxdWFscygiIikgfHwNCi0gICAgICAgICAgICAgICAgKGNvbnZlcnRlZE9iamVjdCBpbnN0YW5jZW9mIENvbGxlY3Rpb24gJiYgKChDb2xsZWN0aW9uKWNvbnZlcnRlZE9iamVjdCkuaXNFbXB0eSgpKSB8fA0KLSAgICAgICAgICAgICAgICAoY29udmVydGVkT2JqZWN0IGluc3RhbmNlb2YgTWFwICYmICgoTWFwKWNvbnZlcnRlZE9iamVjdCkuaXNFbXB0eSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWFzc2FnZShtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChSZXF1aXJlZCkgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHN1cGVyLnJlc29sdmVNZXNzYWdlKGtleSk7DQotICAgICAgICBTdHJpbmcgbWFya2VyID0gQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVI7DQotDQotICAgICAgICBpZigobWFya2VyICsga2V5ICsgbWFya2VyKS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnVzZUZhY2VzQnVuZGxlID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIGUpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMudXNlRmFjZXNCdW5kbGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKGUuZ2V0RmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIGUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1NraXBWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1NraXBWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhZGFjNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBTa2lwVmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgVmFsaWRhdGlvblN0cmF0ZWd5Ci17Ci0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nW10gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbnMgPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFNraXBWYWxpZGF0aW9uLmNsYXNzKS52YWx1ZSgpOwotCi0gICAgICAgIGZvcihTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA6IHZhbHVlQmluZGluZ0V4cHJlc3Npb25zKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihCb29sZWFuLlRSVUUuZXF1YWxzKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0VmFsdWVPZkV4cHJlc3Npb24oCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKSkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1ldGFEYXRhRW50cnkuc2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9WYWxpZGF0b3JTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjNjYzkxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFZhbGlkYXRvclN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yPltdIHZhbGlkYXRvckNsYXNzZXMgPQ0KLSAgICAgICAgICAgIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoVmFsaWRhdG9yLmNsYXNzKS52YWx1ZSgpOw0KLQ0KLSAgICAgICAgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvciB2YWxpZGF0b3I7DQotICAgICAgICBmb3IgKENsYXNzIHZhbGlkYXRvckNsYXNzTmFtZSA6IHZhbGlkYXRvckNsYXNzZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdG9yID0gKGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3IpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgIC50cnlUb0luc3RhbnRpYXRlQ2xhc3ModmFsaWRhdG9yQ2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAodmFsaWRhdG9yID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHZhbGlkYXRvckNsYXNzTmFtZS5nZXROYW1lKCkgKyAiIG5vdCBmb3VuZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU2NmE0MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5LkFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjZXNFeGNlcHRpb247DQotDQotLyoqDQotICogVGhpcyBwaGFzZSBsaXN0ZW5lciBwcm9jZXNzZXMgY3Jvc3MgdmFsaWRhdGlvbiBhcyBzb29uIGFzIGl0IGZpbmRzIGEgc3BlY2lhbCByZXF1ZXN0IHNjb3BlZCBzdG9yYWdlLjxici8+DQotICogU28gaXQncyBwb3NzaWJsZSB0byBhZGQgaW5mb3JtYXRpb24gZHVyaW5nIHRoZSBwcm9jZXNzIHZhbGlkYXRpb24gcGhhc2UuIEF0IHRoZSBlbmQgb2YgdGhpcyBwaGFzZSBpdCBnZXRzIHByb2Nlc3NlZC4NCi0gKiBBZnRlciB0aGF0IHRoZSBzdG9yYWdlIGdldHMgcmVzZXRlZC48cC8+DQotICogSWYgeW91IHByb3ZpZGUgYSBjdXN0b20gZXh0ZW5zaW9uIGFuZCB5b3UgYWRkIHRoZSBzYW1lIHN0b3JhZ2UgdHlwZSB3aXRoaW4gYSBkaWZmZXJlbnQgcGhhc2UsDQotICogaXQgYWxzbyBnZXRzIHByb2Nlc3NlZCBhdCB0aGUgZW5kIG9mIHRoYXQgcGhhc2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UgPSBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCk7DQotICAgICAgICAgICAgZm9yIChDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkgOiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkgaW5zdGFuY2VvZiBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5nZXRDbGFzcygpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5pdENyb3NzVmFsaWRhdGlvbiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5wcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKGVudHJ5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhZGRNZXNzYWdlID0gdHJ1ZTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpIGluc3RhbmNlb2YgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1lc3NhZ2UgPSAoQm9vbGVhbilSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkuZ2V0Q2xhc3MoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuY2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0Q2xhc3MoKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmKGFkZE1lc3NhZ2UpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjZXNNZXNzYWdlICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldEZhY2VzQ29udGV4dCgpLmFkZE1lc3NhZ2UoZW50cnkuZ2V0Q2xpZW50SWQoKSwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RmFjZXNDb250ZXh0KCkucmVuZGVyUmVzcG9uc2UoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGZpbmFsbHkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5yZXNldENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzSW5pdGlhbGl6ZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NST1NTVkFMSURBVElPTiAhPSBudWxsDQotICAgICAgICAgICAgICAgICAgICAmJiBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgSnNmVXRpbHMuZGVyZWdpc3RlclBoYXNlTGlzdGVuZXIodGhpcyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuQU5ZX1BIQVNFOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmIzZGYwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgTGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzID0gDQotICAgICAgICBuZXcgQXJyYXlMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcy5hZGQoZW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoTGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDRjMDQwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5LkNyb3NzVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5DQotew0KLSAgICBwcml2YXRlIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeTsNCi0gICAgLy9mb3IgY29tcGxleCBjb21wb25lbnRzIChlLmcuIGEgdGFibGUpIHN0b3JlcyB0aGUgb2JqZWN0IG9mIGVudHJ5ICgje2VudHJ5LnByb3BlcnR5fSkNCi0gICAgcHJpdmF0ZSBVSUNvbXBvbmVudCBjb21wb25lbnQ7DQotICAgIHByaXZhdGUgT2JqZWN0IGNvbnZlcnRlZE9iamVjdDsNCi0gICAgcHJpdmF0ZSBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIC8vanVzdCBmb3IgaW5wdXQgY29tcG9uZW50cyB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzIGUuZy4gZGF0YVRhYmxlLC4uLg0KLSAgICBwcml2YXRlIFN0cmluZyBjbGllbnRJZDsNCi0NCi0gICAgcHVibGljIE1ldGFEYXRhRW50cnkgZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUVudHJ5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhRW50cnkoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhRW50cnkgPSBtZXRhRGF0YUVudHJ5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBVSUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudChVSUNvbXBvbmVudCBjb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkT2JqZWN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZE9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZWRPYmplY3QoT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb252ZXJ0ZWRPYmplY3QgPSBjb252ZXJ0ZWRPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblN0cmF0ZWd5KENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3kgPSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjbGllbnRJZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGllbnRJZChTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1Byb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkzMTNkOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogSW4gb3JkZXIgdG8gYnVpbGQgdXAgYSBtYXBwaW5nIHdoaWNoIGlzIHVzZWQgZm9yIGNyb3NzLXZhbGlkYXRpb24uCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ci17Ci0gICAgcHJpdmF0ZSBPYmplY3QgYmVhbjsKLSAgICBwcml2YXRlIE9iamVjdCBjb252ZXJ0ZWRWYWx1ZTsKLSAgICBwcml2YXRlIFVJQ29tcG9uZW50IGNvbXBvbmVudDsKLSAgICAvL2ZvciBjb21wbGV4IGNvbXBvbmVudHMgKGUuZy4gYSB0YWJsZSB0aGVyZSBhcmUgbXVsdGlwbGUgZW50cmllcyB3aXRoCi0gICAgLy90aGUgc2FtZSBrZXkgKGhlcmUgdGhlIGVsIGV4cHJlc3Npb24gI3tlbnRyeS5wcm9wZXJ0eX0pCi0gICAgLy9ob3dldmVyLCBkb24ndCBvdmVycmlkZSB0aGUgcHJldmlvdXMgZW50cnkgLSB0aGV5IGFybid0IHRoZSBzYW1lOwotICAgIHByaXZhdGUgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBmdXJ0aGVyRW50cmllczsKLSAgICAvL2p1c3QgZm9yIGlucHV0IGNvbXBvbmVudHMgd2l0aGluIGNvbXBsZXggY29tcG9uZW50cyBlLmcuIGRhdGFUYWJsZSwuLi4KLSAgICBwcml2YXRlIFN0cmluZyBjbGllbnRJZDsKLQotICAgIC8qCi0gICAgICogZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRCZWFuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJlYW4oT2JqZWN0IGJlYW4pCi0gICAgewotICAgICAgICB0aGlzLmJlYW4gPSBiZWFuOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlZFZhbHVlKE9iamVjdCBjb252ZXJ0ZWRWYWx1ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29udmVydGVkVmFsdWUgPSBjb252ZXJ0ZWRWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVUlDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21wb25lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KFVJQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNsaWVudElkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudElkKFN0cmluZyBjbGllbnRJZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBnZXRGdXJ0aGVyRW50cmllcygpCi0gICAgewotICAgICAgICByZXR1cm4gZnVydGhlckVudHJpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RnVydGhlckVudHJpZXMoTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBmdXJ0aGVyRW50cmllcykKLSAgICB7Ci0gICAgICAgIHRoaXMuZnVydGhlckVudHJpZXMgPSBmdXJ0aGVyRW50cmllczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiN2Y4OWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0NST1NTVkFMSURBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OIik7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJcy5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MTkxYzMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiRGF0ZUlzRW50cnkgKHZhbHVlT2YsIHR5cGUpIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBEYXRlSXMNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlT2YoKTsNCi0NCi0gICAgLyoNCi0gICAgICogb3B0aW9uYWwgc2VjdGlvbg0KLSAgICAgKi8NCi0NCi0gICAgRGF0ZUlzVHlwZSB0eXBlKCkgZGVmYXVsdCBEYXRlSXNUeXBlLnNhbWU7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICIiOw0KLQ0KLSAgICBTdHJpbmcgbm90QmVmb3JlRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJ3cm9uZ19kYXRlX25vdF9iZWZvcmUiOw0KLQ0KLSAgICBTdHJpbmcgbm90QWZ0ZXJFcnJvck1zZ0tleSgpIGRlZmF1bHQgIndyb25nX2RhdGVfbm90X2FmdGVyIjsNCi0NCi0gICAgU3RyaW5nIG5vdEVxdWFsRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJ3cm9uZ19kYXRlX25vdF9lcXVhbCI7DQotDQotICAgIGludCBlcnJvck1lc3NhZ2VEYXRlU3R5bGUoKSBkZWZhdWx0IERhdGVGb3JtYXQuTUVESVVNOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNWY0ODIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYmVmb3JlT3JTYW1lLCBhZnRlck9yU2FtZSIpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGVudW0gRGF0ZUlzVHlwZQ0KLXsNCi0gICAgYmVmb3JlLCBhZnRlciwgc2FtZQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0VxdWFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTQyNDA5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0VxdWFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBFcXVhbHMNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJkdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQiOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9Ob3RFcXVhbHMuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL05vdEVxdWFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTYxNmEwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL05vdEVxdWFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBOb3RFcXVhbHMNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJkdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkIjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWIwMTlkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUmVxdWlyZWRJZg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWVPZigpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBvcHRpb25hbCBzZWN0aW9uDQotICAgICAqLw0KLQ0KLSAgICBSZXF1aXJlZElmVHlwZSBpcygpIGRlZmF1bHQgUmVxdWlyZWRJZlR5cGUubm90X2VtcHR5Ow0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZW1wdHlfZmllbGQiOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmVHlwZS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkwYWM5MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgZW51bSBSZXF1aXJlZElmVHlwZQ0KLXsNCi0gICAgZW1wdHksIG5vdF9lbXB0eQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2MDc1OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1JbnB1dCBpcyBkaWZmZXJlbnQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUlucHV0IGlzIGRpZmZlcmVudA0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotDQotd3JvbmdfZGF0ZT1Xcm9uZyBkYXRlDQotd3JvbmdfZGF0ZV9kZXRhaWw9V3JvbmcgZGF0ZQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZjkzYzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9XHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0IFx1MDY0NVx1MDYyZVx1MDYyYVx1MDY0NFx1MDY0MQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0IFx1MDY0NVx1MDYyZVx1MDYyYVx1MDY0NFx1MDY0MQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9XHUwNjNhXHUwNjRhXHUwNjMxIFx1MDY0NVx1MDYzM1x1MDY0NVx1MDY0OFx1MDYyZCBcdTA2MjhcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgXHUwNjQ2IFx1MDY0MVx1MDYzMyBcdTA2NDJcdTA2NGFcdTA2NDVcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0DQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9XHUwNjNhXHUwNjRhXHUwNjMxIFx1MDY0NVx1MDYzM1x1MDY0NVx1MDY0OFx1MDYyZCBcdTA2MjhcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgIFx1MDY0Nlx1MDY0MVx1MDYzMyBcdTA2NDJcdTA2NGFcdTA2NDVcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0DQotDQotd3JvbmdfZGF0ZT1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjJlXHUwNjI3XHUwNjM3XHUwNjQ5XHUwNjIxDQotd3JvbmdfZGF0ZV9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDYyZVx1MDYyN1x1MDYzN1x1MDY0OVx1MDYyMQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDNcdTA2NDggXHUwNjQ2IFx1MDYyOFx1MDYzOVx1MDYyZiB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0MyBcdTA2NDhcdTA2NDYgXHUwNjI4XHUwNjM5XHUwNjJmIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0M1x1MDY0OCBcdTA2NDYgXHUwNjQyXHUwNjI4XHUwNjQ0IHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDMgXHUwNjQ4XHUwNjQ2IFx1MDY0Mlx1MDYyOFx1MDY0NCB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjQ0XHUwNjI3IFx1MDY0YVx1MDYzM1x1MDYyN1x1MDY0OFx1MDY0OSB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0NFx1MDYyNyBcdTA2NGFcdTA2MzNcdTA2MjdcdTA2NDhcdTA2NDkgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NTRlZDIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPWVsIHZhbG9yIFx1MDBlOSBkaWZlcmVudAotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1lbCB2YWxvciBcdTAwZTkgZGlmZXJlbnQKLQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1ubyBlcyBwZXJtZXQgZWwgbWF0ZWl4IHZhbG9yCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1ubyBlcyBwZXJtZXQgZWwgbWF0ZWl4IHZhbG9yCi0KLXdyb25nX2RhdGU9ZGF0YSBlcnJcdTAwZjJuaWEKLXdyb25nX2RhdGVfZGV0YWlsPWRhdGEgZXJyXHUwMGYybmlhCi0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1sYSBkYXRhIGhhIGRlIHNlciBwb3N0ZXJpb3IgYSB7MH0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9bGEgZGF0YSBoYSBkZSBzZXIgcG9zdGVyaW9yIGEgezB9Ci0KLXdyb25nX2RhdGVfbm90X2FmdGVyPWxhIGRhdGEgaGEgZGUgc2VyIGFudGVyaW9yIGEgezB9Ci13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9bGEgZGF0YSBoYSBkZSBzZXIgcG9zdGVyaW9yIGEgezB9Ci0KLXdyb25nX2RhdGVfbm90X2VxdWFsPWxhIGRhdGEgbm8gXHUwMDBlOXMgaWd1YWwgYSB7MH0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1sYSBkYXRhIG5vIFx1MDAwZTlzIGlndWFsIGEgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkODcyMzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9RWluZ2FiZSBpc3QgdW50ZXJzY2hpZWRsaWNoDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1FaW5nYWJlIGlzdCB1bnRlcnNjaGllZGxpY2gNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPURlciBnbGVpY2hlIFdlcnQgaXN0IG5pY2h0IGVybGF1YnQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1EZXIgZ2xlaWNoZSBXZXJ0IGlzdCBuaWNodCBlcmxhdWJ0DQotDQotd3JvbmdfZGF0ZT1EYXR1bSBpbmtvcnJla3QNCi13cm9uZ19kYXRlX2RldGFpbD1EYXR1bSBpbmtvcnJla3QNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9RGFzIERhdHVtIG11c3MgbmFjaCBkZW0gezB9IHNlaW4NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPURhcyBEYXR1bSBtdXNzIG5hY2ggZGVtIHswfSBzZWluDQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9RGFzIERhdHVtIG11c3Mgdm9yIGRlbSB7MH0gc2Vpbg0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1EYXMgRGF0dW0gbXVzcyB2b3IgZGVtIHswfSBzZWluDQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9RGFzIERhdHVtIGVudHNwcmljaHQgbmljaHQgZGVtIHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1EYXMgRGF0dW0gZW50c3ByaWNodCBuaWNodCBkZW0gezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNjA3NTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9SW5wdXQgaXMgZGlmZmVyZW50DQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1JbnB1dCBpcyBkaWZmZXJlbnQNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLQ0KLXdyb25nX2RhdGU9V3JvbmcgZGF0ZQ0KLXdyb25nX2RhdGVfZGV0YWlsPVdyb25nIGRhdGUNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzM4NTI0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1sYSBlbnRyYWRhIGVzIGRpZmVyZW50ZQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1sYSBlbnRyYWRhIGVzIGRpZmVyZW50ZQotCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPW5vIHNlIHBlcm1pdGVuIGVudHJhZGFzIGlndWFsZXMKLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPW5vIHNlIHBlcm1pdGVuIGVudHJhZGFzIGlndWFsZXMKLQotd3JvbmdfZGF0ZT1mZWNoYSBlcXVpdm9jYWRhCi13cm9uZ19kYXRlX2RldGFpbD1mZWNoYSBlcXVpdm9jYWRhCi0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGx1ZWdvIGRlIHswfQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGx1ZWdvIGRlIHswfQotCi13cm9uZ19kYXRlX25vdF9hZnRlcj1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGFudGVzIGRlIHswfQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgYW50ZXMgZGUgezB9Ci0KLXdyb25nX2RhdGVfbm90X2VxdWFsPWxhIGZlY2hhIG5vIGVzIGlndWFsIGEgezB9Ci13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9bGEgZmVjaGEgbm8gZXMgaWd1YWwgYSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmMDIxOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1MZXMgY2hhbXBzIHNvbnQgZGlmZiZlYWN1dGU7cmVudHMNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUxlcyBjaGFtcHMgc29udCBkaWZmJmVhY3V0ZTtyZW50cw0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9TGVzIGNoYW1wcyBkb2l2ZW50ICZlY2lyYzt0cmUgZGlmZiZlYWN1dGU7cmVudHMNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1MZXMgY2hhbXBzIGRvaXZlbnQgJmVjaXJjO3RyZSBkaWZmJmVhY3V0ZTtyZW50cw0KLQ0KLXdyb25nX2RhdGU9TGEgZGF0ZSBlc3QgaW5jb3JyZWN0ZQ0KLXdyb25nX2RhdGVfZGV0YWlsPUxhIGRhdGUgZXN0IGluY29ycmVjdGUNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXByJmVncmF2ZTtzIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXByJmVncmF2ZTtzIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGF2YW50IHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhdmFudCB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1MYSBkYXRlIG4nZXN0IHBhcyAmZWFjdXRlO2dhbGUgJmFncmF2ZTsgezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPUxhIGRhdGUgbidlc3QgcGFzICZlYWN1dGU7Z2FsZSAmYWdyYXZlOyB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA0MjgwMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9VmFsb3JpIG5vbiB1Z3VhbGkKLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9SSB2YWxvcmkgaW5zZXJpdGkgbm9uIGNvaW5jaWRvbm8KLQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1MbyBzdGVzc28gdmFsb3JlIG5vbiAmZWdyYXZlOyBwZXJtZXNzbwotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9TG8gc3Rlc3NvIHZhbG9yZSBub24gJmVncmF2ZTsgcGVybWVzc28KLQotd3JvbmdfZGF0ZT1EYXRhIGVycmF0YQotd3JvbmdfZGF0ZV9kZXRhaWw9RGF0YSBlcnJhdGEKLQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPUxhIGRhdGEgZGV2ZSBlc3NlcmUgZG9wbyBkaSB7MH0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9TGEgZGF0YSBkZXZlIGVzc2VyZSBkb3BvIGRpIHswfQotCi13cm9uZ19kYXRlX25vdF9hZnRlcj1MYSBkYXRhIGRldmUgZXNzZXJlIHByaW1hIGRpIHswfQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPUxhIGRhdGEgZGV2ZSBlc3NlcmUgcHJpbWEgZGkgezB9Ci0KLXdyb25nX2RhdGVfbm90X2VxdWFsPUxhIGRhdGEgbm9uICZlZ3JhdmU7IHVndWFsZSBhIHswfQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPUxhIGRhdGEgbm9uICZlZ3JhdmU7IHVndWFsZSBhIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWY2YTlkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPWdpcmlsZW4gZGVcdTAxMWZlciBmYXJrbFx1MDEzMQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9Z2lyaWxlbiBkZVx1MDExZmVyIGZhcmtsXHUwMTMxDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1heW5cdTAxMzEgZGVcdTAxMWZlciBnaXJpbGVtZXoNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1heW5cdTAxMzEgZGVcdTAxMWZlciBnaXJpbGVtZXoNCi0NCi13cm9uZ19kYXRlPXlhbmxcdTAxMzFcdTAxNWYgdGFyaWgNCi13cm9uZ19kYXRlX2RldGFpbD15YW5sXHUwMTMxXHUwMTVmIHRhcmloDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gc29ucmEgb2xtYWxcdTAxMzFkXHUwMTMxcg0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBzb25yYSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBcdTAwZjZuY2Ugb2xtYWxcdTAxMzFkXHUwMTMxcg0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIFx1MDBmNm5jZSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmUgZVx1MDE1Zml0IGRlXHUwMTFmaWwNCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmUgZVx1MDE1Zml0IGRlXHUwMTFmaWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNzY1OWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotICAgICAgICBleHRlbmRzDQotICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZiAoYmFzZU5hbWUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBiYXNlTmFtZSA9IHN1cGVyLmdldEJhc2VOYW1lKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gYmFzZU5hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlY29yZGVyL0Nyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcmVjb3JkZXIvQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0MGEwMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcmVjb3JkZXIvQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5yZWNvcmRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXIuUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlciBpbXBsZW1lbnRzIFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXINCi17DQotICAgIHB1YmxpYyB2b2lkIHJlY29yZFVzZXJJbnB1dChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IHZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpZiAoISh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vdG8gc3VwcG9ydCBsb2NhbCBjcm9zcy12YWxpZGF0aW9uICh3aXRoaW4gdGhlIHNhbWUgZW50aXR5KQ0KLSAgICAgICAgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4ga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcgPSBDcm9zc1ZhbGlkYXRpb25VdGlscw0KLSAgICAgICAgICAgIC5nZXRPckluaXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpOw0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSBlbnRyeTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPQ0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgaWYocHJvcGVydHlEZXRhaWxzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBlbnRyeSA9IG5ldyBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5KCk7DQotICAgICAgICBlbnRyeS5zZXRCZWFuKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkpOw0KLSAgICAgICAgZW50cnkuc2V0Q29udmVydGVkVmFsdWUodmFsdWUpOw0KLSAgICAgICAgZW50cnkuc2V0Q29tcG9uZW50KHVpQ29tcG9uZW50KTsNCi0gICAgICAgIGVudHJ5LnNldENsaWVudElkKHVpQ29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGtleSA9IHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKTsNCi0NCi0gICAgICAgIC8vZm9yIGxvY2FsIGNyb3NzLXZhbGlkYXRpb24NCi0gICAgICAgIGlmIChrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5jb250YWluc0tleShrZXkpICYmDQotICAgICAgICAgICAga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcuZ2V0KGtleSkuZ2V0QmVhbigpICE9IG51bGwgJiYNCi0gICAgICAgICAgICAha2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcuZ2V0KGtleSkuZ2V0QmVhbigpLmVxdWFscyhlbnRyeS5nZXRCZWFuKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZm9yIHRoZSB2YWxpZGF0aW9uIHdpdGhpbiBhIGNvbXBsZXggY29tcG9uZW50IGUuZy4gYSB0YWJsZQ0KLSAgICAgICAgICAgIC8vZG9uJ3Qgb3ZlcnJpZGUgZXhpc3RpbmcgZXhwcmVzc2lvbiAoc3R5bGU6ICN7ZW50cnkucHJvcGVydHl9KSAtIG1ha2UgYSBzcGVjaWFsIG1hcHBpbmcNCi0NCi0gICAgICAgICAgICBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGZ1cnRoZXJFbnRyaWVzID0NCi0gICAgICAgICAgICAgICAga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcuZ2V0KGtleSkuZ2V0RnVydGhlckVudHJpZXMoKTsNCi0NCi0gICAgICAgICAgICBpZiAoZnVydGhlckVudHJpZXMgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZ1cnRoZXJFbnRyaWVzID0gbmV3IEFycmF5TGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PigpOw0KLQ0KLSAgICAgICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQoa2V5KS5zZXRGdXJ0aGVyRW50cmllcyhmdXJ0aGVyRW50cmllcyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZ1cnRoZXJFbnRyaWVzLmFkZChlbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9mb3Igbm9ybWFsIHZhbGlkYXRpb24NCi0gICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5wdXQoa2V5LCBlbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q29tcGFyZVN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FlYTUwOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIExpc3Q8UmVmZXJlbmNpbmdTdHJhdGVneT4gcmVmZXJlbmNpbmdTdHJhdGVnaWVzOw0KLSAgICBwcm90ZWN0ZWQgTWFwPE9iamVjdCwgT2JqZWN0PiB2aW9sYXRpb25SZXN1bHRTdG9yYWdlID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIGluaXRSZWZlcmVuY2luZ1N0cmF0ZWdpZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UmVmZXJlbmNpbmdTdHJhdGVnaWVzKCkNCi0gICAgew0KLSAgICAgICAgaWYgKHJlZmVyZW5jaW5nU3RyYXRlZ2llcyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcyA9IG5ldyBBcnJheUxpc3Q8UmVmZXJlbmNpbmdTdHJhdGVneT4oKTsNCi0NCi0gICAgICAgICAgICBTdHJpbmcgY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneUNsYXNzTmFtZSA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQkFTRV9QQUNLQUdFKSArICJSZWZlcmVuY2luZ1N0cmF0ZWd5IjsNCi0NCi0gICAgICAgICAgICBSZWZlcmVuY2luZ1N0cmF0ZWd5IGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kgPSAoUmVmZXJlbmNpbmdTdHJhdGVneSkgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneUNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IEVMQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgICAgIC8vcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgQWxpYXNDb21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgTG9jYWxDb21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaW5pdFZhbGlkYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIFN0cmluZ1tdIHZhbGlkYXRpb25UYXJnZXRzID0gZ2V0VmFsaWRhdGlvblRhcmdldHMoDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0IDogdmFsaWRhdGlvblRhcmdldHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCA9IHZhbGlkYXRpb25UYXJnZXQudHJpbSgpOw0KLQ0KLSAgICAgICAgICAgIC8vc2VsZWN0IHZhbGlkYXRpb24gbWV0aG9kDQotICAgICAgICAgICAgdHJ5VG9WYWxpZGF0ZShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsIHZhbGlkYXRpb25UYXJnZXQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBmb3IgKFJlZmVyZW5jaW5nU3RyYXRlZ3kgcmVmZXJlbmNpbmdTdHJhdGVneSA6IHJlZmVyZW5jaW5nU3RyYXRlZ2llcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAocmVmZXJlbmNpbmdTdHJhdGVneS5ldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLCB2YWxpZGF0aW9uVGFyZ2V0LCB0aGlzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UsDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZUYXJnZXQpDQotICAgIHsNCi0gICAgICAgIGlmICghaGFuZGxlVGFyZ2V0VmlvbGF0aW9uKGVudHJ5T2ZTb3VyY2UsIGVudHJ5T2ZUYXJnZXQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICAvL2dldCB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgdGFyZ2V0IGNvbXBvbmVudA0KLSAgICAgICAgU3RyaW5nIHN1bW1hcnkgPSBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCB0cnVlKTsNCi0gICAgICAgIFN0cmluZyBkZXRhaWxzID0gZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCB0cnVlKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGlvbiB0YXJnZXQgaXNuJ3QgYm91bmQgdG8gYSBjb21wb25lbnQgd2l0aGluZyB0aGUgY3VycmVudCBwYWdlIA0KLSAgICAgICAgLy8oc2VlIHZhbGlkYXRlRm91bmRFbnRyeSwgdHJ5VG9WYWxpZGF0ZUxvY2FsbHkgYW5kIHRyeVRvVmFsaWRhdGVCaW5kaW5nT25seSkNCi0gICAgICAgIGlmIChlbnRyeU9mVGFyZ2V0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZW50cnlPZlRhcmdldCA9IGVudHJ5T2ZTb3VyY2U7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZTsNCi0gICAgICAgIGlmIChlbnRyeU9mVGFyZ2V0LmdldE1ldGFEYXRhRW50cnkoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1lc3NhZ2UgPSBnZXRUYXJnZXRDb21wb25lbnRFcnJvck1lc3NhZ2UoDQotICAgICAgICAgICAgICAgIGVudHJ5T2ZUYXJnZXQuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCBzdW1tYXJ5LCBkZXRhaWxzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8gZG9jdW1lbnQgcG9zc2libGUgc2lkZSBlZmZlY3RzDQotICAgICAgICAgICAgLy9kdWUgdG8gYSBtaXNzaW5nIHRhcmdldCBhbm5vdGF0aW9uIChzZWU6IHRyeVRvVmFsaWRhdGVMb2NhbGx5KQ0KLSAgICAgICAgICAgIG1lc3NhZ2UgPSBnZXRUYXJnZXRDb21wb25lbnRFcnJvck1lc3NhZ2UoDQotICAgICAgICAgICAgICAgIGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCBzdW1tYXJ5LCBkZXRhaWxzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICgobWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCB8fCBtZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwpICYmDQotICAgICAgICAgICAgZW50cnlPZlNvdXJjZS5nZXRDbGllbnRJZCgpICE9IG51bGwgJiYgIWVudHJ5T2ZTb3VyY2UuZ2V0Q2xpZW50SWQoKS5lcXVhbHMoZW50cnlPZlRhcmdldC5nZXRDbGllbnRJZCgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc0NvbnRleHQuYWRkTWVzc2FnZShlbnRyeU9mVGFyZ2V0LmdldENsaWVudElkKCksIG1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByb2Nlc3NTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKCFoYW5kbGVTb3VyY2VWaW9sYXRpb24oZW50cnlPZlNvdXJjZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9nZXQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldEVycm9yTWVzc2FnZVN1bW1hcnkoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIGZhbHNlKTsNCi0gICAgICAgIFN0cmluZyBkZXRhaWxzID0gZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCBmYWxzZSk7DQotDQotICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZSA9IGdldFNvdXJjZUNvbXBvbmVudEVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotDQotICAgICAgICBpZiAobWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCB8fCBtZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9UT0RPDQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihtZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG5ldyBGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEZhY2VzTWVzc2FnZSBnZXRTb3VyY2VDb21wb25lbnRFcnJvck1lc3NhZ2UoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgRmFjZXNNZXNzYWdlKCk7DQotDQotICAgICAgICBtZXNzYWdlLnNldFNldmVyaXR5KEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgICAgICBtZXNzYWdlLnNldFN1bW1hcnkoc3VtbWFyeSk7DQotICAgICAgICBtZXNzYWdlLnNldERldGFpbChkZXRhaWwpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEZhY2VzTWVzc2FnZSBnZXRUYXJnZXRDb21wb25lbnRFcnJvck1lc3NhZ2UoQW5ub3RhdGlvbiBmb3VuZEFubm90YXRpb24sIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZSA9IG5ldyBGYWNlc01lc3NhZ2UoKTsNCi0NCi0gICAgICAgIG1lc3NhZ2Uuc2V0U2V2ZXJpdHkoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgICAgIG1lc3NhZ2Uuc2V0U3VtbWFyeShzdW1tYXJ5KTsNCi0gICAgICAgIG1lc3NhZ2Uuc2V0RGV0YWlsKGRldGFpbCk7DQotDQotICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcmVzb2x2ZU1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcga2V5ID0gZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgICAgICByZXR1cm4gKGtleSAhPSBudWxsKSA/IHJlc29sdmVNZXNzYWdlKGtleSArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYKSA6IG51bGw7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdGhlIHVzYWdlIG9mIHRoaXMgbWV0aG9kIHJlcXVpcmVzIGEgbmV3IGluc3RhbmNlDQotICAgICAqIC0+IGluIGNhc2Ugb2YgdmFsaWRhdGlvbiBzdHJhdGVneSBiZWFucyBhcHBsaWNhdGlvbi9zaW5nbGV0b24gaXNuJ3QgYWxsb3dlZA0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFZhbGlkYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVRhcmdldFZpb2xhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlU291cmNlVmlvbGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gaGFuZGxlVGFyZ2V0VmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogYWJzdHJhY3QgbWV0aG9kcw0KLSAgICAgKi8NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0NCi0gICAgLyoNCi0gICAgICogaW1wbGVtZW50cyB0aGUgc3BlY2lmaWMgdmFsaWRhdGlvbiBsb2dpYw0KLSAgICAgKi8NCi0NCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLCBBbm5vdGF0aW9uIGFubm90YXRpb24pOw0KLQ0KLSAgICAvKg0KLSAgICAgKiByZXR1cm5zIHRoZSByZWZlcmVuY2VkIHZhbGlkYXRpb24gdGFyZ2V0cyBvZiB0aGUgYW5ub3RhdGlvbg0KLSAgICAgKiBlLmcuIEBEYXRlSXModHlwZSA9IERhdGVJc1R5cGUuYmVmb3JlLCB2YWx1ZSA9ICJmaW5hbEV4YW0iKQ0KLSAgICAgKiAtPiBtZXRob2QgcmV0dXJucyBhbiBhcnJheSB3aXRoIG9uZSB2YWx1ZSAoImZpbmFsRXhhbSIpDQotICAgICAqLw0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YzgxYmIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMNCi0gICAgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIC8vaW5pdCBjcm9zcy12YWxpZGF0aW9uDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkgPQ0KLSAgICAgICAgICAgIGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpLmFkZChlbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkgPSBuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KCk7DQotDQotICAgICAgICBlbnRyeS5zZXRNZXRhRGF0YUVudHJ5KG1ldGFEYXRhRW50cnkpOw0KLSAgICAgICAgZW50cnkuc2V0Q29tcG9uZW50KHVpQ29tcG9uZW50KTsNCi0gICAgICAgIGVudHJ5LnNldENsaWVudElkKHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCkpOw0KLSAgICAgICAgZW50cnkuc2V0Q29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICBlbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3kodGhpcyk7DQotDQotICAgICAgICByZXR1cm4gZW50cnk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IGF2YWlsYWJsZSBmb3IgY3Jvc3MgdmFsaWRhdGlvbiAtIHVzZSBwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbiIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldExhYmVsKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vdCBhdmFpbGFibGUgZm9yIGNyb3NzIHZhbGlkYXRpb24iKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgLy9ub3QgYXZhaWxhYmxlIGZvciBjcm9zcyB2YWxpZGF0aW9uIC0gdXNlIGluaXRDcm9zc1ZhbGlkYXRpb24NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q3Jvc3NWYWxpZGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCksDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwgdmFsaWRhdG9yRXhjZXB0aW9uLCB0aGlzKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uSGVscGVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YTEwODkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneShBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSkNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiB2aW9sYXRpb25Gb3VuZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgaWYgKGNvbXBhcmVTdHJhdGVneS5pc1Zpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpDQotICAgICAgICB7DQotDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSA9IG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoKTsNCi0gICAgICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LnVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29tcG9uZW50KHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb21wb25lbnQoKSk7DQotICAgICAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDbGllbnRJZCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb21wb25lbnQoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENsaWVudElkKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDbGllbnRJZCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbnZlcnRlZE9iamVjdCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldFZhbGlkYXRpb25TdHJhdGVneShjb21wYXJlU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneQ0KLSAgICAgICAgICAgICAgICAgICAgLnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotDQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzdkODcyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgIHZvaWQgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSkNCi0gICAgICAgICAgICB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRGF0ZUlzU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzMyZDIwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRGF0ZUlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXNUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEYXRlSXNTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUT09fRUFSTFkgPSAiZWFybHkiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUT09fTEFURSA9ICJsYXRlIjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UX0VRVUFMX0RBVEVfVElNRSA9ICJub3QgZXF1YWwiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfS0VZID0gInJlc3VsdCI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBUkVEX1ZBTFVFX0tFWSA9ICJ0YXJnZXQgdmFsdWUiOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZygNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiB2aW9sYXRpb25Gb3VuZDsNCi0NCi0gICAgICAgIGlmICgoKERhdGVJcykgYW5ub3RhdGlvbikudHlwZSgpLmVxdWFscyhEYXRlSXNUeXBlLnNhbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsICYmICFvYmplY3QxLmVxdWFscyhvYmplY3QyKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFU1VMVF9LRVksIE5PVF9FUVVBTF9EQVRFX1RJTUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKCgoRGF0ZUlzKSBhbm5vdGF0aW9uKS50eXBlKCkuZXF1YWxzKERhdGVJc1R5cGUuYmVmb3JlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IG9iamVjdDEgIT0gbnVsbCAmJiBvYmplY3QyICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFuZXcgRGF0ZSgoKERhdGUpIG9iamVjdDEpLmdldFRpbWUoKSkuYmVmb3JlKChEYXRlKSBvYmplY3QyKSB8fCBvYmplY3QxLmVxdWFscyhvYmplY3QyKSk7DQotDQotICAgICAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVNVTFRfS0VZLCBUT09fTEFURSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsICYmIG9iamVjdDIgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW5ldyBEYXRlKCgoRGF0ZSkgb2JqZWN0MSkuZ2V0VGltZSgpKS5hZnRlcigoRGF0ZSkgb2JqZWN0MikgfHwgb2JqZWN0MS5lcXVhbHMob2JqZWN0MikpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVTVUxUX0tFWSwgVE9PX0VBUkxZKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChDT01QQVJFRF9WQUxVRV9LRVksIG9iamVjdDEpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZpb2xhdGlvbkZvdW5kOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKERhdGVJcykgYW5ub3RhdGlvbikudmFsdWVPZigpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHByb3RlY3RlZA0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IChTdHJpbmcpIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5nZXQoUkVTVUxUX0tFWSk7DQotICAgICAgICBpZiAoVE9PX0VBUkxZLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROb3RBZnRlckVycm9yTXNnS2V5KChEYXRlSXMpIGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoVE9PX0xBVEUuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldE5vdEJlZm9yZUVycm9yTXNnS2V5KChEYXRlSXMpIGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROb3RFcXVhbEVycm9yTXNnS2V5KChEYXRlSXMpIGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KSwgYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgICAgICB9DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZShTdHJpbmcga2V5LCBBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gcmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0NCi0gICAgICAgIERhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCgoRGF0ZUlzKSBhbm5vdGF0aW9uKS5lcnJvck1lc3NhZ2VEYXRlU3R5bGUoKSwNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKSk7DQotDQotICAgICAgICAvL3JlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIG90aGVyIGNvbXBvbmVudA0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgiezB9IiwgZGF0ZUZvcm1hdC5mb3JtYXQoKERhdGUpIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5nZXQoQ09NUEFSRURfVkFMVUVfS0VZKSkpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHByaXZhdGUNCi0gICAgICovDQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5vdEFmdGVyRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpLmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24ubm90QWZ0ZXJFcnJvck1zZ0tleSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90QmVmb3JlRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpLmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24ubm90QmVmb3JlRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5vdEVxdWFsRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpLmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24ubm90RXF1YWxFcnJvck1zZ0tleSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VMQ29tcGFyZVN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRUxDb21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NlNWY5Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRUxDb21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLlByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiByZWZlcmVuY2luZyB2YWxpZGF0aW9uIHRhcmdldHMgLSBwb3NzaWJsZSBmb3JtYXRzOg0KLSAqICIje1tiZWFuX25hbWVdLltwcm9wZXJ0eV9uYW1lXX0iIC4uLiBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbiB3aXRoIHZhbHVlIGJpbmRpbmcNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRUxDb21wYXJlU3RyYXRlZ3kgaW1wbGVtZW50cyBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LCBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZCh2YWxpZGF0aW9uVGFyZ2V0KSAmJg0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZhbGlkYXRpb25UYXJnZXQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvVmFsaWRhdGVWYWx1ZUJpbmRpbmcoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWxpZGF0aW9uVGFyZ2V0KSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwgY29tcGFyZVN0cmF0ZWd5KTsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAidGVzdCIpDQotICAgIHByb3RlY3RlZCBib29sZWFuIHRyeVRvVmFsaWRhdGVWYWx1ZUJpbmRpbmcoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4ga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nID0gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMNCi0gICAgICAgICAgICAgICAgLmdldE9ySW5pdEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9IENyb3NzVmFsaWRhdGlvblV0aWxzLnJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgICAgIGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZywNCi0gICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuY29udmVydFZhbHVlQmluZGluZ0V4cHJlc3Npb25Ub1Byb2Nlc3NlZEluZm9ybWF0aW9uS2V5KHZhbGlkYXRpb25UYXJnZXQpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLQ0KLSAgICAgICAgaWYodmFsaWRhdGlvblRhcmdldEVudHJ5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneShjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQgY29udmVydGVkIG9iamVjdCBmb3IgIiArIHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VxdWFsc1N0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxZTRiYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFcXVhbHNTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKEVxdWFscykgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLCBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBvYmplY3QxICE9IG51bGwgJiYgIW9iamVjdDEuZXF1YWxzKG9iamVjdDIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKEVxdWFscykgYW5ub3RhdGlvbikudmFsdWUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxDb21wYXJlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWViNTQxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbENvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLlByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogIltwcm9wZXJ0eV9uYW1lXSIgLi4uIGxvY2FsIHZhbGlkYXRpb24gLT4gY3Jvc3MtY29tcG9uZW50LCBidXQgbm8gY3Jvc3MtZW50aXR5IHZhbGlkYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgTG9jYWxDb21wYXJlU3RyYXRlZ3kgaW1wbGVtZW50cyBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LCBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnlUb1ZhbGlkYXRlTG9jYWxseSgNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZUxvY2FsbHkoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSwNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZyA9IENyb3NzVmFsaWRhdGlvblV0aWxzDQotICAgICAgICAgICAgICAgIC5nZXRPckluaXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpOw0KLQ0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IGNyZWF0ZVRhcmdldEtleShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEtleSk7DQotICAgICAgICBpZiAoIWtleUNvbnZlcnRlZFZhbHVlTWFwcGluZy5jb250YWluc0tleShuZXdLZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUtleSA9IHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKTsNCi0NCi0gICAgICAgIGlmKCFzb3VyY2VLZXkuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzb3VyY2UgcGF0aDogIiArIHNvdXJjZUtleSArICIgaW52YWxpZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGFyZ2V0S2V5ID0gc291cmNlS2V5LnN1YnN0cmluZygwLCBzb3VyY2VLZXkubGFzdEluZGV4T2YoIi4iKSArIDEpICsgdGFyZ2V0S2V5Ow0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkgPSBDcm9zc1ZhbGlkYXRpb25VdGlscy5yZXNvbHZlVmFsaWRhdGlvblRhcmdldEVudHJ5KA0KLSAgICAgICAgICAgICAgICBrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcsIHRhcmdldEtleSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0NCi0gICAgICAgIGlmICh2YWxpZGF0aW9uVGFyZ2V0RW50cnkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBjb252ZXJ0ZWQgb2JqZWN0IGZvciAiICsgcHJvcGVydHlEZXRhaWxzLmdldEtleSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZVRhcmdldEtleShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBTdHJpbmcgdGFyZ2V0S2V5KQ0KLSAgICB7DQotICAgICAgICAvL25vIHJlYWwgdmFsdWUgYmluZGluZyBleHByZXNzaW9uDQotICAgICAgICAvL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24ganVzdCBoZXBscyB0byByZXBsYWNlIHRoZSBwcm9wZXJ0eSBvZiB0aGUga2V5DQotICAgICAgICAvL2hlcmUgb25seSBkb3Qtbm90YXRpb24gaXMgYWxsb3dlZCAtPiBubyBwcm9ibGVtDQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGJhc2VFeHByZXNzaW9uID0NCi0gICAgICAgICAgICBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3siICsgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywNCi0gICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGV0YWlscy5jbGFzcykuZ2V0S2V5KCkgKyAifSIpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZU9yQWRkUHJvcGVydHkoYmFzZUV4cHJlc3Npb24sIHRhcmdldEtleSkNCi0gICAgICAgICAgICAuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC5zdWJzdHJpbmcoMiwgcmVzdWx0Lmxlbmd0aCgpIC0xKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ODg4MzguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotDQotLyoqDQotICogIltsb2NhbF9wcm9wZXJ0eS5wcm9wZXJ0eTEucHJvcGVydHkyXSINCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5IGV4dGVuZHMgTG9jYWxDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlTG9jYWxseShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIE9iamVjdCBuZXdCYXNlID0gUmVmbGVjdGlvblV0aWxzDQotICAgICAgICAgICAgLmdldEJhc2VPZlByb3BlcnR5Q2hhaW4ocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSwgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIGlmKHRhcmdldEtleS5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZmluZCB0aGUgbGFzdCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIHRhcmdldEtleSA9IHRhcmdldEtleS5zdWJzdHJpbmcodGFyZ2V0S2V5Lmxhc3RJbmRleE9mKCIuIikgKyAxLCB0YXJnZXRLZXkubGVuZ3RoKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgT2JqZWN0IHRhcmdldFZhbHVlID0gZ2V0VmFsdWVPZlByb3BlcnR5KG5ld0Jhc2UsIHRhcmdldEtleSk7DQotDQotICAgICAgICBib29sZWFuIHZpb2xhdGlvbkZvdW5kID0gZmFsc2U7DQotDQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LmlzVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFZhbHVlLCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKSkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5ID0gbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb21wb25lbnQoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q2xpZW50SWQoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENsaWVudElkKCkpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb252ZXJ0ZWRPYmplY3QodGFyZ2V0VmFsdWUpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kNCi0gICAgICAgICAgICAgICAgICAgIC5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLQ0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBnZXRWYWx1ZU9mUHJvcGVydHkoT2JqZWN0IGJhc2UsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEsIHByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgICAgIE1ldGhvZCB0YXJnZXRNZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoYmFzZS5nZXRDbGFzcygpLCAiZ2V0IiArIHByb3BlcnR5KTsNCi0NCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZChiYXNlLmdldENsYXNzKCksICJpcyIgKyBwcm9wZXJ0eSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAiY2xhc3MgIiArIGJhc2UuZ2V0Q2xhc3MoKSArICIgaGFzIG5vIHB1YmxpYyBnZXQvaXMgIiArIHByb3BlcnR5LnRvTG93ZXJDYXNlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZChiYXNlLCB0YXJnZXRNZXRob2QpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Ob3RFcXVhbHNTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L05vdEVxdWFsc1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMTVlMjAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L05vdEVxdWFsc1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLk5vdEVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTm90RXF1YWxzU3RyYXRlZ3kgZXh0ZW5kcyBFcXVhbHNTdHJhdGVneQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoTm90RXF1YWxzKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLA0KLSAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICFzdXBlci5pc1Zpb2xhdGlvbihvYmplY3QxLCBvYmplY3QyLCBhbm5vdGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoTm90RXF1YWxzKSBhbm5vdGF0aW9uKS52YWx1ZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVmZXJlbmNpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDZkM2ZhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSW50ZXJuYWwgaW50ZXJmYWNlIHRvIGFsbG93IG11bHRpcGxlIHJlZmVyZW5jaW5nIHN0cmF0ZWdpZXMgZm9yIGNyb3NzIGNvbXBvbmVudCB2YWxpZGF0aW9uLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1pbnRlcmZhY2UgUmVmZXJlbmNpbmdTdHJhdGVneQ0KLXsNCi0gICAgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5KTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlcXVpcmVkSWZTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlcXVpcmVkSWZTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDA1YTVmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZlR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFJlcXVpcmVkSWZTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRmFjZXNCdW5kbGUgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoUmVxdWlyZWRJZikgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLCBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gdmlvbGF0aW9uRm91bmQgPSBmYWxzZTsNCi0NCi0gICAgICAgIGlmICgoKFJlcXVpcmVkSWYpIGFubm90YXRpb24pLmlzKCkuZXF1YWxzKFJlcXVpcmVkSWZUeXBlLmVtcHR5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IChvYmplY3QyID09IG51bGwgfHwgb2JqZWN0Mi5lcXVhbHMoIiIpKSAmJiAob2JqZWN0MSA9PSBudWxsIHx8IG9iamVjdDEuZXF1YWxzKCIiKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmICgoKFJlcXVpcmVkSWYpIGFubm90YXRpb24pLmlzKCkuZXF1YWxzKFJlcXVpcmVkSWZUeXBlLm5vdF9lbXB0eSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSAob2JqZWN0MiAhPSBudWxsICYmICFvYmplY3QyLmVxdWFscygiIikpICYmIChvYmplY3QxID09IG51bGwgfHwgb2JqZWN0MS5lcXVhbHMoIiIpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB2aW9sYXRpb25Gb3VuZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChSZXF1aXJlZElmKSBhbm5vdGF0aW9uKS52YWx1ZU9mKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMudXNlRmFjZXNCdW5kbGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkOTkyOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLkJhc2ljPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLklkPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZT1vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5KcGFWYWxpZGF0aW9uU3RyYXRlZ3kKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Dcm9zc1ZhbGlkYXRpb25VdGlscy5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU0YmNkOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Dcm9zc1ZhbGlkYXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLlByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUk9TU19WQUxJREFUSU9OX1NUT1JBR0VfS0VZID0gQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBnZXRPckluaXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgTWFwIHJlcXVlc3RNYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpOw0KLQ0KLSAgICAgICAgaWYgKCFyZXF1ZXN0TWFwLmNvbnRhaW5zS2V5KENST1NTX1ZBTElEQVRJT05fU1RPUkFHRV9LRVkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKSByZXF1ZXN0TWFwLmdldChDUk9TU19WQUxJREFUSU9OX1NUT1JBR0VfS0VZKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0DQotICAgICAgICAgICAgICAgIC5nZXRDdXJyZW50SW5zdGFuY2UoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RXh0ZXJuYWxDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldFJlcXVlc3RNYXAoKQ0KLSAgICAgICAgICAgICAgICAucHV0KENST1NTX1ZBTElEQVRJT05fU1RPUkFHRV9LRVksIG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UT19DT05WRVJURURfVkFMVUVfTUFQUElOR19LRVkgPSBKc2ZVdGlscy5jbGFzcy5nZXROYW1lKCk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4gZ2V0T3JJbml0S2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcoKQ0KLSAgICB7DQotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7DQotDQotICAgICAgICBpZiAoIXJlcXVlc3RNYXAuY29udGFpbnNLZXkoS0VZX1RPX0NPTlZFUlRFRF9WQUxVRV9NQVBQSU5HX0tFWSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzZXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PikgcmVxdWVzdE1hcC5nZXQoS0VZX1RPX0NPTlZFUlRFRF9WQUxVRV9NQVBQSU5HX0tFWSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0S2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgLnB1dChLRVlfVE9fQ09OVkVSVEVEX1ZBTFVFX01BUFBJTkdfS0VZLCBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSByZXNvbHZlVmFsaWRhdGlvblRhcmdldEVudHJ5KA0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXksIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSA9DQotICAgICAgICAgICAga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcuZ2V0KHRhcmdldEtleSk7DQotDQotICAgICAgICAvL3NpbXBsZSBjYXNlDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5nZXRGdXJ0aGVyRW50cmllcygpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXRCZWFuID0gcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKTsNCi0NCi0gICAgICAgIC8vcHJvY2VzcyBjb21wbGV4IGNvbXBvbmVudCBlbnRyaWVzIChlLmcuIGEgdGFibGUpDQotICAgICAgICAvL3N1cHBvcnRlZDogY3Jvc3MtY29tcG9uZW50IGJ1dCBubyBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbiAoPSBsb2NhbGUgdmFsaWRhdGlvbikNCi0gICAgICAgIGlmIChwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEJlYW4oKS5lcXVhbHModGFyZ2V0QmVhbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotICAgICAgICB9DQotDQotICAgICAgICBmb3IgKFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgZW50cnkgOiBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEZ1cnRoZXJFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LmdldEJlYW4oKS5lcXVhbHModGFyZ2V0QmVhbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInN1cHBvcnQgZm9yIG1hcCBzeW50YXgiKQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VmFsdWVCaW5kaW5nRXhwcmVzc2lvblRvUHJvY2Vzc2VkSW5mb3JtYXRpb25LZXkoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YmUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YmUuZ2V0RXhwcmVzc2lvblN0cmluZygpLnJlcGxhY2UoIiN7IiwgIiIpLnJlcGxhY2UoIn0iLCAiIik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMzkyNTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBQcm9wZXJ0eSBWYWxpZGF0aW9uIE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFByb3BlcnR5IFZhbGlkYXRpb24gTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgUHJvcGVydHkgVmFsaWRhdGlvbiBwcm92aWRlcyBhbm5vdGF0aW9uIGJhc2VkIHZhbGlkYXRpb24gZm9yIGJlYW4gcHJvcGVydGllcy4NCi0gICAgSXQgYWxzbyBwcm92aWRlcyBKUEEgMS4wIGJhc2VkIHZhbGlkYXRpb24gU3VwcG9ydC4NCi0gIA0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS4xLnggYW5kIEpTRiAxLjIueC4gQm90aCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0Fic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NjBmZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0Fic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nOwotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlJbnB1dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuVGVzdFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWRfaW1wbC5jb25maWcuTXlmYWNlc0NvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0V4dGVybmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrRmFjZXNDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tGYWNlc0NvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tIdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0h0dHBTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tMaWZlY3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0xpZmVjeWNsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1JlbmRlcktpdDsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrUmVzcG9uc2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1NlcnZsZXRDb25maWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1NlcnZsZXRDb250ZXh0OwotCi0vKioKLSAqIEFic3RyYWN0IFNoYWxlIFRlc3QgYmFzZSBjbGFzcywgd2hpY2ggc2V0cyB1cCB0aGUgSlNGIGVudmlyb25tZW50LiAgSWYgdGhlIHRlc3QKLSAqIG92ZXJyaWRlcyA8Y29kZT5zZXRVcCgpPC9jb2RlPiBhbmQvb3IgPGNvZGU+dGVhckRvd24oKTwvY29kZT4sIHRoZW4gdGhvc2UKLSAqIG1ldGhvZHMgYnV0IGNhbGwgdGhlIG92ZXJ3aXR0ZW4gbWV0aG9kIHRvIGluc3VyZSBhIHZhbGlkIHRlc3QgZW52aXJvbm1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHJvdGVjdGVkIE1vY2tBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbjsKLSAgICBwcm90ZWN0ZWQgTW9ja1NlcnZsZXRDb25maWcgY29uZmlnOwotICAgIHByb3RlY3RlZCBNb2NrRXh0ZXJuYWxDb250ZXh0IGV4dGVybmFsQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgTW9ja0ZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIE1vY2tGYWNlc0NvbnRleHRGYWN0b3J5IGZhY2VzQ29udGV4dEZhY3Rvcnk7Ci0gICAgcHJvdGVjdGVkIE1vY2tMaWZlY3ljbGUgbGlmZWN5Y2xlOwotICAgIHByb3RlY3RlZCBNb2NrTGlmZWN5Y2xlRmFjdG9yeSBsaWZlY3ljbGVGYWN0b3J5OwotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgcmVuZGVyS2l0OwotICAgIHByb3RlY3RlZCBNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3Q7Ci0gICAgcHJvdGVjdGVkIE1vY2tIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlOwotICAgIHByb3RlY3RlZCBNb2NrU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIE1vY2tIdHRwU2Vzc2lvbiBzZXNzaW9uOwotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyOwotICAgICAgICAKLSAgICAvKiogUmVzcG9uc2UgV3JpdGVyICovCi0gICAgcHJpdmF0ZSBNb2NrUmVzcG9uc2VXcml0ZXIgd3JpdGVyOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuCi0gICAgICovCi0gICAgcHVibGljIEFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgICAgIGFwcGxpY2F0aW9uID0gbnVsbDsKLSAgICAgICAgY29uZmlnID0gbnVsbDsKLSAgICAgICAgZXh0ZXJuYWxDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgZmFjZXNDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgZmFjZXNDb250ZXh0RmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIGxpZmVjeWNsZSA9IG51bGw7Ci0gICAgICAgIGxpZmVjeWNsZUZhY3RvcnkgPSBudWxsOwotICAgICAgICByZW5kZXJLaXQgPSBudWxsOwotICAgICAgICByZXF1ZXN0ID0gbnVsbDsKLSAgICAgICAgcmVzcG9uc2UgPSBudWxsOwotICAgICAgICBzZXJ2bGV0Q29udGV4dCA9IG51bGw7Ci0gICAgICAgIHNlc3Npb24gPSBudWxsOwotICAgICAgICB0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZXR1cCB0aGUgdGVzdCBlbnZpcm9ubWVudCwgaW5jbHVkaW5nIHRoZSBmb2xsb3dpbmc6Ci0gICAgICogIDx1bD4KLSAgICAgKiAgPGxpPlNldCB0aGUgQXBwbGljYXRpb24gTWFwLjwvbGk+Ci0gICAgICogIDxsaT5TZXQgYSByZXNwb25zZSB3cml0ZXI8L2xpPgotICAgICAqICA8bGk+QWRkIFRvbWFoYXdrJ3MgcmVuZGVyZXJzIHRvIHRoZSBmYWNlcyBjb250ZXh0LjwvbGk+Ci0gICAgICogIDwvdWw+IAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIobmV3IFVSTENsYXNzTG9hZGVyKG5ldyBVUkxbMF0sIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkpOwotICAgICAgICBzZXJ2bGV0Q29udGV4dCA9IG5ldyBNb2NrU2VydmxldENvbnRleHQoKTsKLSAgICAgICAgLy9mb3IgdGVzdGluZyB0aGUgZmFsbGJhY2sKLSAgICAgICAgLy9zZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVggKyAiLkRFQUNUSVZBVEVfRUxfUkVTT0xWRVIiLCAidHJ1ZSIpOwotICAgICAgICBjb25maWcgPSBuZXcgTW9ja1NlcnZsZXRDb25maWcoc2VydmxldENvbnRleHQpOwotICAgICAgICBzZXNzaW9uID0gbmV3IE1vY2tIdHRwU2Vzc2lvbigpOwotICAgICAgICBzZXNzaW9uLnNldFNlcnZsZXRDb250ZXh0KHNlcnZsZXRDb250ZXh0KTsKLSAgICAgICAgcmVxdWVzdCA9IG5ldyBNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0KHNlc3Npb24pOwotICAgICAgICByZXF1ZXN0LnNldFNlcnZsZXRDb250ZXh0KHNlcnZsZXRDb250ZXh0KTsKLSAgICAgICAgcmVzcG9uc2UgPSBuZXcgTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2UoKTsKLSAgICAgICAgRmFjdG9yeUZpbmRlci5yZWxlYXNlRmFjdG9yaWVzKCk7Ci0gICAgICAgIEZhY3RvcnlGaW5kZXIuc2V0RmFjdG9yeSgiamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5IiwgIm9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbkZhY3RvcnkiKTsKLSAgICAgICAgRmFjdG9yeUZpbmRlci5zZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dEZhY3RvcnkiLCAib3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0ZhY2VzQ29udGV4dEZhY3RvcnkiKTsKLSAgICAgICAgRmFjdG9yeUZpbmRlci5zZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5saWZlY3ljbGUuTGlmZWN5Y2xlRmFjdG9yeSIsICJvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrTGlmZWN5Y2xlRmFjdG9yeSIpOwotICAgICAgICBGYWN0b3J5RmluZGVyLnNldEZhY3RvcnkoImphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5IiwgIm9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tSZW5kZXJLaXRGYWN0b3J5Iik7Ci0gICAgICAgIGV4dGVybmFsQ29udGV4dCA9IG5ldyBNb2NrRXh0ZXJuYWxDb250ZXh0KHNlcnZsZXRDb250ZXh0LCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgIGxpZmVjeWNsZUZhY3RvcnkgPSAoTW9ja0xpZmVjeWNsZUZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5saWZlY3ljbGUuTGlmZWN5Y2xlRmFjdG9yeSIpOwotICAgICAgICBsaWZlY3ljbGUgPSAoTW9ja0xpZmVjeWNsZSlsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZSgiREVGQVVMVCIpOwotICAgICAgICBmYWNlc0NvbnRleHRGYWN0b3J5ID0gKE1vY2tGYWNlc0NvbnRleHRGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHRGYWN0b3J5Iik7Ci0gICAgICAgIGZhY2VzQ29udGV4dCA9IChNb2NrRmFjZXNDb250ZXh0KWZhY2VzQ29udGV4dEZhY3RvcnkuZ2V0RmFjZXNDb250ZXh0KHNlcnZsZXRDb250ZXh0LCByZXF1ZXN0LCByZXNwb25zZSwgbGlmZWN5Y2xlKTsKLSAgICAgICAgZXh0ZXJuYWxDb250ZXh0ID0gKE1vY2tFeHRlcm5hbENvbnRleHQpZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpOwotICAgICAgICBVSVZpZXdSb290IHJvb3QgPSBuZXcgVUlWaWV3Um9vdCgpOwotICAgICAgICByb290LnNldFZpZXdJZCgiL3ZpZXdJZCIpOwotICAgICAgICByb290LnNldFJlbmRlcktpdElkKCJIVE1MX0JBU0lDIik7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5zZXRWaWV3Um9vdChyb290KTsKLSAgICAgICAgQXBwbGljYXRpb25GYWN0b3J5IGFwcGxpY2F0aW9uRmFjdG9yeSA9IChBcHBsaWNhdGlvbkZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3RvcnkiKTsKLSAgICAgICAgYXBwbGljYXRpb24gPSAoTW9ja0FwcGxpY2F0aW9uKWFwcGxpY2F0aW9uRmFjdG9yeS5nZXRBcHBsaWNhdGlvbigpOwotICAgICAgICBmYWNlc0NvbnRleHQuc2V0QXBwbGljYXRpb24oYXBwbGljYXRpb24pOwotICAgICAgICBSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnkgPSAoUmVuZGVyS2l0RmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoImphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5Iik7Ci0gICAgICAgIC8vV3JhcCByZW5kZXJlcnMgd2l0aCBwcm9wZXIgZXh2YWwgd3JhcHBlcgotICAgICAgICByZW5kZXJLaXQgPSBuZXcgRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkuY3JlYXRlKG5ldyBNb2NrUmVuZGVyS2l0KCkpOwotICAgICAgICByZW5kZXJLaXRGYWN0b3J5LmFkZFJlbmRlcktpdCgiSFRNTF9CQVNJQyIsIHJlbmRlcktpdCk7ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vIGFkZGl0aW9uYWwgc2V0dXAgbm90IHByb3ZpZGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHNoYWxlIG1vY2sgc3R1ZmYKLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uTWFwKCkucHV0KAotICAgICAgICAgICAgICAgIE15ZmFjZXNDb25maWcuY2xhc3MuZ2V0TmFtZSgpLCBuZXcgTXlmYWNlc0NvbmZpZygpKTsKLSAgICAgICAgd3JpdGVyID0gbmV3IE1vY2tSZXNwb25zZVdyaXRlcihuZXcgU3RyaW5nV3JpdGVyKCksIG51bGwsIG51bGwpOwotICAgICAgICBmYWNlc0NvbnRleHQuc2V0UmVzcG9uc2VXcml0ZXIod3JpdGVyKTsKLQotICAgICAgICBUZXN0VXRpbHMuYWRkRGVmYXVsdFJlbmRlcmVycyhmYWNlc0NvbnRleHQpOwotICAgICAgICBUZXN0VXRpbHMuYWRkRGVmYXVsdFZhbGlkYXRvcnMoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgbmV3IFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lcigpLmluaXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZWFyIGRvd24gdGhlIHRlc3QgZW52aXJvbm1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBhcHBsaWNhdGlvbiA9IG51bGw7Ci0gICAgICAgIGNvbmZpZyA9IG51bGw7Ci0gICAgICAgIGV4dGVybmFsQ29udGV4dCA9IG51bGw7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5yZWxlYXNlKCk7Ci0gICAgICAgIGZhY2VzQ29udGV4dCA9IG51bGw7Ci0gICAgICAgIGxpZmVjeWNsZSA9IG51bGw7Ci0gICAgICAgIGxpZmVjeWNsZUZhY3RvcnkgPSBudWxsOwotICAgICAgICByZW5kZXJLaXQgPSBudWxsOwotICAgICAgICByZXF1ZXN0ID0gbnVsbDsKLSAgICAgICAgcmVzcG9uc2UgPSBudWxsOwotICAgICAgICBzZXJ2bGV0Q29udGV4dCA9IG51bGw7Ci0gICAgICAgIHNlc3Npb24gPSBudWxsOwotICAgICAgICBGYWN0b3J5RmluZGVyLnJlbGVhc2VGYWN0b3JpZXMoKTsKLSAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIodGhyZWFkQ29udGV4dENsYXNzTG9hZGVyKTsKLSAgICAgICAgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0Nyb3NzVmFsVmFsaWRhdGlvbigpCi0gICAgewotICAgICAgICBuZXcgQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcigpLmFmdGVyUGhhc2UobmV3IFBoYXNlRXZlbnQoKEZhY2VzQ29udGV4dClmYWNlc0NvbnRleHQsUGhhc2VJZC5BTllfUEhBU0UsbGlmZWN5Y2xlKSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrTWVzc2FnZUNvdW50KGludCBleHBlY3RlZCkKLSAgICB7Ci0gICAgICAgIGludCBhY3R1YWwgPSAwOwotICAgICAgICBmb3IoSXRlcmF0b3IgbWVzc2FnZXMgPSBmYWNlc0NvbnRleHQuZ2V0TWVzc2FnZXMoKTsgbWVzc2FnZXMuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgbWVzc2FnZXMubmV4dCgpOwotICAgICAgICAgICAgYWN0dWFsKys7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbXBsZXRlIG1lc3NhZ2UgY291bnQiLCBleHBlY3RlZCwgYWN0dWFsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja01lc3NhZ2VDb3VudChTdHJpbmcgY2xpZW50SWQsIGludCBleHBlY3RlZCkKLSAgICB7Ci0gICAgICAgIGludCBhY3R1YWwgPSAwOwotICAgICAgICBmb3IoSXRlcmF0b3IgbWVzc2FnZXMgPSBmYWNlc0NvbnRleHQuZ2V0TWVzc2FnZXMoY2xpZW50SWQpOyBtZXNzYWdlcy5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlcy5uZXh0KCk7Ci0gICAgICAgICAgICBhY3R1YWwrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydEVxdWFscygiQ29tcGxldGUgbWVzc2FnZSBjb3VudCIsIGV4cGVjdGVkLCBhY3R1YWwpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBWZXJpZnkgdGhlIGZvbGxvd2luZzoKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPmlkIGlzIG5vdCBudWxsPC9saT4KLSAgICAgKiA8bGk+UmVzcG9uc2UgaXMgY29tcGxldGU8L2xpPgotICAgICAqIDxsaT5SZXNwb25jZSBjb250YWlucyB0aGUgaWQ8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGlkIElEIHRvIHZlcmlmeQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydElkRXhpc3RzKFN0cmluZyBpZCkKLSAgICB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIklEIGlzIG5vdCBudWxsIiwgaWQpOwotICAgICAgICBhc3NlcnRUcnVlKCJSZXNwb25zZSBDb21wbGV0ZSIsIGZhY2VzQ29udGV4dC5nZXRSZXNwb25zZUNvbXBsZXRlKCkpOwotICAgICAgICBTdHJpbmcgb3V0cHV0ID0gd3JpdGVyLmdldFdyaXRlcigpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIkhhcyBvdXRwdXQiLCBvdXRwdXQpOwotICAgICAgICBhc3NlcnRUcnVlKCJDb250YWlucyBpZCAnIiArIGlkICsgIiciLCBvdXRwdXQuaW5kZXhPZihpZCkgIT0gLTEpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVZhbHVlQmluZGluZyhVSUlucHV0IHVpSW5wdXQsIFN0cmluZyBuYW1lLCBTdHJpbmcgZXhwcmVzc2lvbikKLSAgICB7Ci0gICAgICAgIFZhbHVlQmluZGluZyB2YWx1ZUJpbmRpbmcgPSBhcHBsaWNhdGlvbi5jcmVhdGVWYWx1ZUJpbmRpbmcoZXhwcmVzc2lvbik7Ci0KLSAgICAgICAgaWYodWlJbnB1dCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aUlucHV0LnNldFZhbHVlQmluZGluZyhuYW1lLCB2YWx1ZUJpbmRpbmcpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvQmFzZVZhbFRlc3RCZWFuLmphdmEgYi9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9CYXNlVmFsVGVzdEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVkYzkyMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9CYXNlVmFsVGVzdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxlbmd0aDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsKLQotLyoqCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlVmFsVGVzdEJlYW4KLXsKLSAgICBAUmVxdWlyZWQKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIAotICAgIEBMZW5ndGgobWluaW11bT0yLG1heGltdW09MykKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lMTsKLSAgICAKLSAgICBAUGF0dGVybigiW0EtWl1bYS16XSsiKQotICAgIHByaXZhdGUgU3RyaW5nIHBhdHRlcm5OYW1lOwotICAgIAotICAgIEBEb3VibGVSYW5nZShtaW5pbXVtPS0zMDBkKQotICAgIHByaXZhdGUgRG91YmxlIGRvdWJsZVZhbHVlMTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUxKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYW1lMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lMShTdHJpbmcgbmFtZTEpCi0gICAgewotICAgICAgICB0aGlzLm5hbWUxID0gbmFtZTE7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gcGF0dGVybk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGF0dGVybk5hbWUoU3RyaW5nIHBhdHRlcm5OYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5wYXR0ZXJuTmFtZSA9IHBhdHRlcm5OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBEb3VibGUgZ2V0RG91YmxlVmFsdWUxKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkb3VibGVWYWx1ZTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RG91YmxlVmFsdWUxKERvdWJsZSBkb3VibGVWYWx1ZTEpCi0gICAgewotICAgICAgICB0aGlzLmRvdWJsZVZhbHVlMSA9IGRvdWJsZVZhbHVlMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9CYXNlVmFsVGVzdENhc2UuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL0Jhc2VWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDdhMTYxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL0Jhc2VWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUKLSAqLwotcHVibGljIGNsYXNzIEJhc2VWYWxUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlCi17Ci0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50ID0gbnVsbDsKLQotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7Ci0gICAgCi0gICAgQmFzZVZhbFRlc3RCZWFuIGJlYW4gPSBudWxsOwotCi0gICAgcHVibGljIEJhc2VWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgICAgICBpbnB1dENvbXBvbmVudCA9IG51bGw7Ci0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOwotICAgICAgICBiZWFuID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQmFzZVZhbFRlc3RDYXNlLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIGJlYW4gPSBuZXcgQmFzZVZhbFRlc3RCZWFuKCk7Ci0gICAgICAgIFZhbHVlQmluZGluZyB2YiA9IGFwcGxpY2F0aW9uLmNyZWF0ZVZhbHVlQmluZGluZygiI3t0ZXN0QmVhbn0iKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKS5wdXQoInRlc3RCZWFuIiwgYmVhbik7Ci0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7Ci0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsKLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOwotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOwotICAgICAgICBpbnB1dENvbXBvbmVudCA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7Ci0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQpOwotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRJZCgiaW5wdXQxIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgICAgICBpbnB1dENvbXBvbmVudCA9IG51bGw7Ci0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOwotICAgICAgICBiZWFuID0gbnVsbDsgICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lUmVxdWlyZWRGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lfSIpOwotCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsKLQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lMUxlbmdodE1heEZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWUxfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIxMjM0NSIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZTFMZW5naHRDb3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lMX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydFRydWUoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWUxTGVuZ2h0TWluRmFpbCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZTF9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIngiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXR0ZXJuTmFtZUZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnBhdHRlcm5OYW1lfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCJQZXRlcjEiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXR0ZXJuTmFtZUNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnBhdHRlcm5OYW1lfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCJQZXRlciIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOwotICAgIH0gICAgCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWVGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5kb3VibGVWYWx1ZTF9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIi0zMDEiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVZhbHVlQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4uZG91YmxlVmFsdWUxfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIyMDAiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMGQsIGlucHV0Q29tcG9uZW50LmdldFZhbHVlKCkpOwotICAgICAgICAKLSAgICAgICAgaW5wdXRDb21wb25lbnQudXBkYXRlTW9kZWwoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMGQsIGJlYW4uZ2V0RG91YmxlVmFsdWUxKCkpOwotICAgIH0gICAgCi19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0QmVhbi5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ4YWRjOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOwotCi0vKioKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUKLSAqLwotcHVibGljIGNsYXNzIENyb3NzVmFsVGVzdEJlYW4KLXsKLQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsKLSAgICAKLSAgICBARXF1YWxzKCJwcm9wZXJ0eTEiKSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTEoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKFN0cmluZyBwcm9wZXJ0eTEpCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnR5MSA9IHByb3BlcnR5MTsKLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkyKFN0cmluZyBwcm9wZXJ0eTIpCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhjYTBiYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUKLSAqLwotcHVibGljIGNsYXNzIENyb3NzVmFsVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZQotewotCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOwotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQyID0gbnVsbDsKLSAgICAKLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOwotICAgIAotICAgIHB1YmxpYyBDcm9zc1ZhbFRlc3RDYXNlKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG51bGw7Ci0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKENyb3NzVmFsVGVzdENhc2UuY2xhc3MpOwotICAgIH0gICAgCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIENyb3NzVmFsVGVzdEJlYW4gYmVhbiA9IG5ldyBDcm9zc1ZhbFRlc3RCZWFuKCk7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhudWxsLCAidmFsdWUiLCAiI3t0ZXN0QmVhbn0iKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKS5wdXQoInRlc3RCZWFuIixiZWFuKTsKLSAgICAgICAgCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOwotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7Ci0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsKLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsgICAgICAgIAotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOwotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50MSk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRJZCgiaW5wdXQxIik7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7Ci0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQyKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNDb3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOwotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxWYWxpZGF0aW9uKCk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOwotCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzRmFpbCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQ0Iik7Ci0gICAgICAgIAotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgCi0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsVmFsaWRhdGlvbigpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgyKTsKLQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9UZXN0VXRpbHMuamF2YSBiL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Rlc3RVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDE3ZGUzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Rlc3RVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY2VzRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVGVzdFV0aWxzCi17Ci0gICAgLyoqIERlZmF1bHQgTG9nZ2VyICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFRlc3RVdGlscy5jbGFzcyk7Ci0KLSAgICAvKiogdXRpbGl0eSBjbGFzcywgZG8gbm90IGluc3RhbnRpYXRlICovCi0gICAgcHJpdmF0ZSBUZXN0VXRpbHMoKQotICAgIHsKLSAgICAgICAgLy8gdXRpbGl0eSBjbGFzcywgZGlzYWJsZSBpbnN0YW50aWF0aW9uCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGREZWZhdWx0VmFsaWRhdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQotICAgIHsKLSAgICAgICAgYWRkVmFsaWRhdG9yKGZhY2VzQ29udGV4dCwiamF2YXguZmFjZXMuRG91YmxlUmFuZ2UiLCAiamF2YXguZmFjZXMudmFsaWRhdG9yLkRvdWJsZVJhbmdlVmFsaWRhdG9yIik7Ci0gICAgICAgIGFkZFZhbGlkYXRvcihmYWNlc0NvbnRleHQsImphdmF4LmZhY2VzLkxlbmd0aCIsICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yIik7Ci0gICAgICAgIGFkZFZhbGlkYXRvcihmYWNlc0NvbnRleHQsImphdmF4LmZhY2VzLkxvbmdSYW5nZSIsICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTG9uZ1JhbmdlVmFsaWRhdG9yIik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRWYWxpZGF0b3IoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0b3JJZCwgU3RyaW5nIHZhbGlkYXRvckNsYXNzKQotICAgIHsKLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuYWRkVmFsaWRhdG9yKHZhbGlkYXRvcklkLCB2YWxpZGF0b3JDbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGFsbCBvZiBKU0YgMS4yIGRlZmF1bHQgcmVuZGVyZXJzLiAgQ3VycmVudGx5IHRoaXMgaXMgbm90IHRpZWQgdG8gCi0gICAgICogZmFjZXMtY29uZmlnLnhtbCwgc28gYWxsIGNoYW5nZSB0byB0aGUgZmlsZSBNVVNUIGFsc28gYmUgbWFkZSBoZXJlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQKLSAgICAgKiBAdG9kbyBEbyBub3QgYWRkIHJlbmRlcmVyIGlmIHJlbmRlcmVyIGlzIGFscmVhZHkgYWRkZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZERlZmF1bHRSZW5kZXJlcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vIFN0YW5kYXJkIEhUTUwgUmVuZGVyZXJzCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkNvbW1hbmQiLCAiamF2YXguZmFjZXMuQnV0dG9uIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxCdXR0b25SZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdEJvb2xlYW4iLAotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5DaGVja2JveCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sQ2hlY2tib3hSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE1hbnkiLAotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5DaGVja2JveCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sQ2hlY2tib3hSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkZvcm0iLCAiamF2YXguZmFjZXMuRm9ybSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sRm9ybVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuUGFuZWwiLCAiamF2YXguZmFjZXMuR3JpZCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sR3JpZFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuUGFuZWwiLCAiamF2YXguZmFjZXMuR3JvdXAiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEdyb3VwUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5IaWRkZW4iLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEhpZGRlblJlbmRlcmVyIik7Ci0gICAgICAgIAotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5HcmFwaGljIiwgImphdmF4LmZhY2VzLkltYWdlIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxJbWFnZVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuT3V0cHV0IiwgImphdmF4LmZhY2VzLkxhYmVsIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMYWJlbFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuT3V0cHV0IiwgImphdmF4LmZhY2VzLkxpbmsiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbExpbmtSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkNvbW1hbmQiLCAiamF2YXguZmFjZXMuTGluayIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlua1JlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0T25lIiwKLSAgICAgICAgICAgICAgICAiamF2YXguZmFjZXMuTGlzdGJveCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlzdGJveFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0TWFueSIsCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkxpc3Rib3giLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbExpc3Rib3hSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsICJqYXZheC5mYWNlcy5NZW51IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxNZW51UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RNYW55IiwgImphdmF4LmZhY2VzLk1lbnUiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lbnVSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk1lc3NhZ2UiLCAiamF2YXguZmFjZXMuTWVzc2FnZSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTWVzc2FnZVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuT3V0cHV0IiwgImphdmF4LmZhY2VzLkZvcm1hdCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sRm9ybWF0UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5NZXNzYWdlcyIsCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLk1lc3NhZ2VzIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxNZXNzYWdlc1JlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0T25lIiwgImphdmF4LmZhY2VzLlJhZGlvIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxSYWRpb1JlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuSW5wdXQiLCAiamF2YXguZmFjZXMuU2VjcmV0IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxTZWNyZXRSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkRhdGEiLCAiamF2YXguZmFjZXMuVGFibGUiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFRhYmxlUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5UZXh0YXJlYSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGV4dGFyZWFSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLklucHV0IiwgImphdmF4LmZhY2VzLlRleHQiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFRleHRSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5UZXh0IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxUZXh0UmVuZGVyZXIiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSByZW5kZXJlciB0byB0aGUgRmFjZXNDb250ZXh0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgRmFjZXMgQ29udGV4dAotICAgICAqIEBwYXJhbSBmYW1pbHkgQ29tcG9uZW5ldCBGYW1pbHkKLSAgICAgKiBAcGFyYW0gcmVuZGVyZXJUeXBlIENvbXBvbmVudCBUeXBlCi0gICAgICogQHBhcmFtIHJlbmRlckNsYXNzTmFtZSBDbGFzcyBOYW1lIG9mIFJlbmRlcmVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFJlbmRlcmVyKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBmYW1pbHksCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGVyZXJUeXBlLCBTdHJpbmcgcmVuZGVyQ2xhc3NOYW1lKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSAoamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyKSBuZXdJbnN0YW5jZShyZW5kZXJDbGFzc05hbWUpOwotICAgICAgICBSZW5kZXJLaXQga2l0ID0gZmFjZXNDb250ZXh0LmdldFJlbmRlcktpdCgpOwotICAgICAgICBraXQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIHJlbmRlcmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmllcyBhIENsYXNzLmxvYWRDbGFzcyB3aXRoIHRoZSBjb250ZXh0IGNsYXNzIGxvYWRlciBvZiB0aGUgY3VycmVudCB0aHJlYWQgZmlyc3QgYW5kCi0gICAgICogYXV0b21hdGljYWxseSBmYWxscyBiYWNrIHRvIHRoZSBDbGFzc1V0aWxzIGNsYXNzIGxvYWRlciAoaS5lLiB0aGUgbG9hZGVyIG9mIHRoZQotICAgICAqIG15ZmFjZXMuamFyIGxpYikgaWYgbmVjZXNzYXJ5LgotICAgICAqIAotICAgICAqIE5vdGU6IFRoaXMgd2FzIGNvcGllZCBmcm9tIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWQudXRpbC5DbGFzc1V0aWxzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHlwZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIG5vbi1wcmltaXRpdmUgbm9uLWFycmF5IGNsYXNzCi0gICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBDbGFzcwotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdHlwZSBpcyBudWxsCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgY2xhc3NGb3JOYW1lKFN0cmluZyB0eXBlKQotICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInR5cGUiKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRyeSBXZWJBcHAgQ2xhc3NMb2FkZXIgZmlyc3QKLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKHR5cGUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXAKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWdub3JlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBmYWxsYmFjazogVHJ5IENsYXNzTG9hZGVyIGZvciBDbGFzc1V0aWxzIChpLmUuIHRoZSBteWZhY2VzLmphciBsaWIpCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZSh0eXBlLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwCi0gICAgICAgICAgICAgICAgICAgIFRlc3RVdGlscy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhbWUgYXMge0BsaW5rICNjbGFzc0Zvck5hbWUoU3RyaW5nKX0sIGJ1dCB0aHJvd3MgYSBSdW50aW1lRXhjZXB0aW9uCi0gICAgICogKEZhY2VzRXhjZXB0aW9uKSBpbnN0ZWFkIG9mIGEgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIE5vdGU6IFRoaXMgd2FzIGNvcGllZCBmcm9tIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWQudXRpbC5DbGFzc1V0aWxzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIENsYXNzCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0eXBlIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIEZhY2VzRXhjZXB0aW9uIGlmIGNsYXNzIG5vdCBmb3VuZAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIHNpbXBsZUNsYXNzRm9yTmFtZShTdHJpbmcgdHlwZSkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY2xhc3NGb3JOYW1lKHR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ2xhc3MgIiArIHR5cGUgKyAiIG5vdCBmb3VuZCIsIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyB3aXRoIHRoZSB0eXBlIG9mIDxjb2RlPnR5cGU8L2NvZGU+LgotICAgICAqIAotICAgICAqIE5vdGU6IFRoaXMgd2FzIGNvcGllZCBmcm9tIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWQudXRpbC5DbGFzc1V0aWxzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHlwZSBUeXBlIG9mIG5ldyBjbGFzcy4KLSAgICAgKiBAcmV0dXJuIEluc3RhbmNlIG9mIHRoZSBjbGFzcyA8Y29kZT50eXBlPC9jb2RlPgotICAgICAqIEB0aHJvd3MgRmFjZXNFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIHR5cGUpIHRocm93cyBGYWNlc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2Uoc2ltcGxlQ2xhc3NGb3JOYW1lKHR5cGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIDxjb2RlPmNsYXp6PC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBOb3RlOiBUaGlzIHdhcyBjb3BpZWQgZnJvbSBvcmcuYXBhY2hlLm15ZmFjZXMuc2hhcmVkLnV0aWwuQ2xhc3NVdGlscwotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXp6IENsYXNzIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZi4KLSAgICAgKiBAcmV0dXJuIEluc3RhbmNlIG9mIHRoZSBjbGFzcyA8Y29kZT5jbGF6ejwvY29kZT4KLSAgICAgKiBAdGhyb3dzIEZhY2VzRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKENsYXNzIGNsYXp6KSB0aHJvd3MgRmFjZXNFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY2xhenoubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nLmVycm9yKCJDbGFzcyA6ICIgKyBjbGF6ei5nZXROYW1lKCkgKyAiIG5vdCBmb3VuZC4iLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBGYWNlc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW5kZXJlcmVkIGEgY29tcG9uZW50LCBpbmNsdWRpbmcgaXQncyBjaGlsZHJlbiwgdGhlbiBjb21wbGV0ZSB0aGUgcmVwb25zZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGV4dCBGYWNlcyBDb250ZXh0Ci0gICAgICogQHBhcmFtIGNvbXBvbmVudCBDb21wb25lbnQgdG8gYmUgcmVuZGVyZWQuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gd2hpbGUgcmVuZGVyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW5kZXJDb21wb25lbnQoRmFjZXNDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICBVSUNvbXBvbmVudCBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSBjb250ZXh0LmdldFJlbmRlcktpdCgpLmdldFJlbmRlcmVyKAotICAgICAgICAgICAgICAgIGNvbXBvbmVudC5nZXRGYW1pbHkoKSwgY29tcG9uZW50LmdldFJlbmRlcmVyVHlwZSgpKTsKLSAgICAgICAgcmVuZGVyZXIuZW5jb2RlQmVnaW4oY29udGV4dCwgY29tcG9uZW50KTsKLSAgICAgICAgcmVuZGVyZXIuZW5jb2RlQ2hpbGRyZW4oY29udGV4dCwgY29tcG9uZW50KTsKLSAgICAgICAgcmVuZGVyZXIuZW5jb2RlRW5kKGNvbnRleHQsIGNvbXBvbmVudCk7Ci0gICAgICAgIGNvbnRleHQucmVzcG9uc2VDb21wbGV0ZSgpOwotICAgICAgICBjb250ZXh0LnJlbmRlclJlc3BvbnNlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9hc3NlbWJseS9wb20ueG1sIGIvcHJlcGFyZS8xXzFfMV9yYy9hc3NlbWJseS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWFhNzQyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvYXNzZW1ibHkvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYXNzZW1ibHkxMTwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEFzc2VtYmx5PC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5NeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEFzc2VtYmx5IGlzIHVzZWQgdG8gZ2VuZXJhdGUgCi0gICAgLnppcCBhbmQgLnRhci5neiBkaXN0cmlidXRpb25zIDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4xLjE8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMV9yY2Fzc2VtYmx5PC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzFfcmNhc3NlbWJseTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzFfcmNhc3NlbWJseTwvdXJsPgotICAgIDwvc2NtPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZGVwZW5kZW5jeS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1qYXZhZG9jPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y29yZS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+amF2YWRvYzwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2phdmFkb2M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1zb3VyY2U8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjb3JlLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc3JjPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS0gRVhFQ1VURSBtdm4gcGFja2FnZSB0byBnZW5lcmF0ZSBhc3NlbWJseSBmaWxlcyAtLT4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9zcmM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9jb3Jlc3JjLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwxMS0ke3ZlcnNpb259LXNyYzwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L291dDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmF0dGFjaGVkPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9iaW48L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj4ke2Jhc2VkaXJ9L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmViaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5teWZhY2VzLWV4dHZhbDExLSR7dmVyc2lvbn0tYmluPC9maW5hbE5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXR0YWNoZWQ8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtjb3JlLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8IS0tIFNpbmNlIGV4dHZhbCBjb3VsZCBiZSBhc3luYyByZWxlYXNlZCwgYW4gZ2VuZXJhdGVkIGFzc2VtYmx5IGNvdWxkIGNvbnRhaW4gZGlmZmVyZW50Ci0gICAgICAgICBhcnRpZmFjdCB2ZXJzaW9ucyAtLT4KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGNvcmUudmVyc2lvbj4xLjEuMTwvY29yZS52ZXJzaW9uPgotICAgICAgICA8dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9uPjEuMS4xPC90cmluaWRhZC1zdXBwb3J0LnZlcnNpb24+Ci0gICAgICAgIDxnZW5lcmljLXN1cHBvcnQudmVyc2lvbj4xLjEuMTwvZ2VuZXJpYy1zdXBwb3J0LnZlcnNpb24+Ci0gICAgICAgIDxwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb24+MS4xLjE8L3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmViaW4ueG1sIGIvcHJlcGFyZS8xXzFfMV9yYy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2Nzk1Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmViaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+Y29yZWJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgIAk8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgIAk8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5SRUFETUUqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5MSUNFTlNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+Tk9USUNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+UkVMRUFTRSo8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L2phdmFkb2M8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+amF2YWRvYzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLmphcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWwgYi9wcmVwYXJlLzFfMV8xX3JjL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTE4NmM2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08YXNzZW1ibHk+Ci0gIDxpZD5jb3Jlc3JjPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+ICAKLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgIAk8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgIAk8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5SRUFETUUqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5MSUNFTlNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+Tk9USUNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+UkVMRUFTRSo8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4gICAKLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3NyYzwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5zcmM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+Ci0gCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzFfcmMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDViM2E1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMV9yYy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5YmRiMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcgotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3BvbS54bWwgYi9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTA0NzRlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZTwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jZ2xpYjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNnbGliPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4xXzM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZWNlNTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQw0KLSAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKYXZhU2VydmVyIEZhY2VzIENvbmZpZyAxLjAvL0VOIg0KLSAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzEuZHRkIiA+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGZhY2VzLWNvbmZpZz4NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj4NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5zdGFydHVwLkdlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXINCi0gICAgICAgIDwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyS2l0LmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkY2VjNzYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyS2l0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLQ0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kSW50ZXJjZXB0b3I7DQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5FbmhhbmNlcjsNCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZFByb3h5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbEdlbmVyaWNSZW5kZXJLaXQgZXh0ZW5kcyBFeHRWYWxSZW5kZXJLaXQgaW1wbGVtZW50cyBNZXRob2RJbnRlcmNlcHRvcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBSZW5kZXJLaXQgbmV3SW5zdGFuY2UoUmVuZGVyS2l0IHJlbmRlcktpdCkNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gcmVuZGVyS2l0LmdldENsYXNzKCk7DQotDQotICAgICAgICAvL2l0J3Mgbm90IHBvc3NpYmxlIHRvIHdyYXAgdGhlIGNvbnZlcnRlciBhZ2FpbiAtIG9jY3VycyBlLmcuIHVuZGVyIHNvbGFyaXMgKyBiZWEgd2VibG9naWMNCi0gICAgICAgIGlmIChjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCIkJEVuaGFuY2VyQnlDR0xJQiQkIikNCi0gICAgICAgICAgICB8fCBjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCIkJEZhc3RDbGFzc0J5Q0dMSUIkJCIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZW5kZXJLaXQ7DQotICAgICAgICB9DQotDQotICAgICAgICBFbmhhbmNlciBlbmhhbmNlciA9IG5ldyBFbmhhbmNlcigpOw0KLSAgICAgICAgZW5oYW5jZXIuc2V0U3VwZXJjbGFzcyhyZW5kZXJLaXQuZ2V0Q2xhc3MoKSk7DQotICAgICAgICBlbmhhbmNlci5zZXRDYWxsYmFjayhuZXcgRXh0VmFsR2VuZXJpY1JlbmRlcktpdChyZW5kZXJLaXQpKTsNCi0NCi0gICAgICAgIHJldHVybiAoUmVuZGVyS2l0KSBlbmhhbmNlci5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGludGVyY2VwdChPYmplY3Qgb2JqLCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzLCBNZXRob2RQcm94eSBwcm94eSkgdGhyb3dzIFRocm93YWJsZQ0KLSAgICB7DQotICAgICAgICBpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0UmVuZGVyZXIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZXIoKFN0cmluZylhcmdzWzBdLCAoU3RyaW5nKWFyZ3NbMV0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiYWRkUmVuZGVyZXIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRSZW5kZXJlcigoU3RyaW5nKWFyZ3NbMF0sIChTdHJpbmcpYXJnc1sxXSwgKFJlbmRlcmVyKWFyZ3NbMl0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBwcm94eS5pbnZva2VTdXBlcihvYmosIGFyZ3MpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEV4dFZhbEdlbmVyaWNSZW5kZXJLaXQoUmVuZGVyS2l0IHdyYXBwZWQpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKHdyYXBwZWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgY3JlYXRlV3JhcHBlcihSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIubmV3SW5zdGFuY2UocmVuZGVyZXIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUyNDE3Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyV3JhcHBlcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZEludGVyY2VwdG9yOwotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5FbmhhbmNlcjsKLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kUHJveHk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBmaW5hbCBjbGFzcyBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyIGV4dGVuZHMgRXh0VmFsUmVuZGVyZXJXcmFwcGVyIGltcGxlbWVudHMgTWV0aG9kSW50ZXJjZXB0b3IKLXsKLSAgICBwdWJsaWMgc3RhdGljIFJlbmRlcmVyIG5ld0luc3RhbmNlKFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gcmVuZGVyZXIuZ2V0Q2xhc3MoKTsKLQotICAgICAgICAvL3RvIGF2b2lkIHJlLXdyYXBwaW5nIC0gb2NjdXJzIGUuZy4gdW5kZXIgc29sYXJpcyArIGJlYSB3ZWJsb2dpYwotICAgICAgICBpZiAoY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRFbmhhbmNlckJ5Q0dMSUIkJCIpIHx8Ci0gICAgICAgICAgICBjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCIkJEZhc3RDbGFzc0J5Q0dMSUIkJCIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBFbmhhbmNlciBlbmhhbmNlciA9IG5ldyBFbmhhbmNlcigpOwotICAgICAgICBlbmhhbmNlci5zZXRTdXBlcmNsYXNzKHJlbmRlcmVyLmdldENsYXNzKCkpOwotICAgICAgICBlbmhhbmNlci5zZXRDYWxsYmFjayhuZXcgRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlcihyZW5kZXJlcikpOwotCi0gICAgICAgIHJldHVybiAoUmVuZGVyZXIpIGVuaGFuY2VyLmNyZWF0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgaW50ZXJjZXB0KE9iamVjdCBvYmosIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MsIE1ldGhvZFByb3h5IHByb3h5KSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldENvbnZlcnRlZFZhbHVlIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29udmVydGVkVmFsdWUoKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSwgYXJnc1syXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImRlY29kZSIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZGVjb2RlKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJlbmNvZGVCZWdpbiIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlQmVnaW4oKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImVuY29kZUNoaWxkcmVuIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGVDaGlsZHJlbigoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZW5jb2RlRW5kIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGVFbmQoKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImNvbnZlcnRDbGllbnRJZCIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0Q2xpZW50SWQoKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoU3RyaW5nKWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJnZXRSZW5kZXJzQ2hpbGRyZW4iKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJtZXRob2QgIiArIG1ldGhvZC5nZXROYW1lKCkgKyAiIGNhbGxlZCB3aXRob3V0IHJlbmRlcmluZy1pbnRlcmNlcHRvcnMiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHByb3h5Lmludm9rZVN1cGVyKG9iaiwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEV4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIoUmVuZGVyZXIgd3JhcHBlZCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKHdyYXBwZWQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0dlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NWQyOGIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5yZW5kZXJraXQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeQ0KLXsNCi0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCBjcmVhdGVXcmFwcGVyKFJlbmRlcktpdCByZW5kZXJLaXQpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0dmFsIHJlbmRlcmtpdCB3cmFwcGVyIGNyZWF0ZWQgZm9yICIgKyByZW5kZXJLaXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHZpYSBjZ2xpYiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIEV4dFZhbEdlbmVyaWNSZW5kZXJLaXQubmV3SW5zdGFuY2UocmVuZGVyS2l0KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3N0YXJ0dXAvR2VuZXJpY01vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9zdGFydHVwL0dlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhjN2I0MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3N0YXJ0dXAvR2VuZXJpY01vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5yZW5kZXJraXQuR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgR2VuZXJpY01vZHVsZVN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyDQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpLmFkZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KG5ldyBHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjljMzllLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZSBwcm92aWRlcyBnZW5lcmljIFN1cHBvcnQgZm9yIEpTRiBjb21wb25lbnQgZnJhbWV3b3JrcyB3aGljaCBoYXZlIHNwZWNpYWwgcmVxdWlyZW1lbnRzIChlLmcuIFJpY2hGYWNlcywgTXlGYWNlcyBUb2JhZ28sIC4uLikuDQotICANCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEuMS54IGFuZCBKU0YgMS4yLnguIEJvdGggdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsNCi0gIA0KLSAgICANCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3BvbS54bWwgYi9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MTc0YzYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQ29tcG9uZW50LVN1cHBvcnQgTW9kdWxlczwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8xX3JjY29tcG9uZW50LXN1cHBvcnQ8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMV9yY2NvbXBvbmVudC1zdXBwb3J0PC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMV9yY2NvbXBvbmVudC1zdXBwb3J0PC91cmw+Ci0gICAgPC9zY20+Ci0KLSAgICA8bW9kdWxlcz4KLSAgICAgICAgPG1vZHVsZT50cmluaWRhZC1zdXBwb3J0PC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+Z2VuZXJpYy1zdXBwb3J0PC9tb2R1bGU+Ci0gICAgPC9tb2R1bGVzPgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8dHJpbmlkYWQudmVyc2lvbj4xLjAuNTwvdHJpbmlkYWQudmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwgYi9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU1OTVkMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgVHJpbmlkYWQgU3VwcG9ydCBNb2R1bGU8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4xLjE8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+Y29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmVlMzg1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIGZhY2VzLWNvbmZpZyBQVUJMSUMKLSAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKYXZhU2VydmVyIEZhY2VzIENvbmZpZyAxLjAvL0VOIgotICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWZhY2VzY29uZmlnXzFfMS5kdGQiID4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZmFjZXMtY29uZmlnPgotICAgIDxsaWZlY3ljbGU+Ci0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj4KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdGFydHVwLlRyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyCi0gICAgICAgIDwvcGhhc2UtbGlzdGVuZXI+Ci0gICAgPC9saWZlY3ljbGU+Ci0KLSAgICA8bGlmZWN5Y2xlPgotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcgotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPgotICAgIDwvbGlmZWN5Y2xlPgotPC9mYWNlcy1jb25maWc+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYjRkYmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQuRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWN0b3J5RmluZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsKLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3Rvcnk7Ci0KLS8qKgotICogdXNlIHRoaXMgcGhhc2UtbGlzdGVuZXIgaW5zdGVhZCBvZiBhIEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZHVlIHRvIGEgdHJpbmlkYWQgaXNzdWUKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyCi17Ci0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgICAgaWYoZXZlbnQuZ2V0UGhhc2VJZCgpICE9IFBoYXNlSWQuQVBQTFlfUkVRVUVTVF9WQUxVRVMgJiYgZXZlbnQuZ2V0UGhhc2VJZCgpICE9IFBoYXNlSWQuUkVOREVSX1JFU1BPTlNFKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOwotCi0gICAgICAgIFJlbmRlcktpdEZhY3RvcnkgcmVuZGVyS2l0RmFjdG9yeSA9IChSZW5kZXJLaXRGYWN0b3J5KQotICAgICAgICAgICAgRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEZhY3RvcnlGaW5kZXIuUkVOREVSX0tJVF9GQUNUT1JZKTsKLQotICAgICAgICBTdHJpbmcgcmVuZGVyS2l0SWQgPSBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5nZXRSZW5kZXJLaXRJZCgpOwotCi0gICAgICAgIGlmKEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LklELmVxdWFscyhyZW5kZXJLaXRJZCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFJlbmRlcktpdCByZW5kZXJLaXQgPSByZW5kZXJLaXRGYWN0b3J5LmdldFJlbmRlcktpdChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHJlbmRlcktpdElkKTsKLSAgICAgICAgcmVuZGVyS2l0RmFjdG9yeS5hZGRSZW5kZXJLaXQoRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuSUQsIG5ldyBFeHRWYWxUcmluaWRhZFJlbmRlcktpdChyZW5kZXJLaXQpKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuc2V0UmVuZGVyS2l0SWQoRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuSUQpOwotICAgIH0KLQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuUkVOREVSX1JFU1BPTlNFOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc4YTFlMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcmVuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgLyoNCi0gICAgICogZGVhY3RpdmF0ZQ0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0NMSUVOVF9TSURFX1RSSU5JREFEX1ZBTElEQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfQ0xJRU5UX1NJREVfVFJJTklEQURfVkFMSURBVElPTiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfVFJJTklEQURfVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfVFJJTklEQURfVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IiKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0RvdWJsZVJhbmdlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdkYmYxMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0RvdWJsZVJhbmdlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuRG91YmxlUmFuZ2VWYWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRG91YmxlUmFuZ2VJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7Ci0gICAgICAgIERvdWJsZVJhbmdlVmFsaWRhdG9yIGxlbmd0aFZhbGlkYXRvciA9IChEb3VibGVSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRG91YmxlUmFuZ2UiKTsKLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKTsKLQotICAgICAgICAgICAgaWYobWluIGluc3RhbmNlb2YgRG91YmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNaW5pbXVtKChEb3VibGUpbWluKTsKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpOwotCi0gICAgICAgICAgICBpZihtYXhMZW5ndGggaW5zdGFuY2VvZiBEb3VibGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1heGltdW0oKERvdWJsZSltYXhMZW5ndGgpOwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKGluZm9ybWF0aW9uQWRkZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKGxlbmd0aFZhbGlkYXRvcik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9MZW5ndGhJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9MZW5ndGhJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjE5MWY4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIExlbmd0aEluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBib29sZWFuIGluZm9ybWF0aW9uQWRkZWQgPSBmYWxzZTsKLSAgICAgICAgLy9UT0RPCi0gICAgICAgIExlbmd0aFZhbGlkYXRvciBsZW5ndGhWYWxpZGF0b3IgPSAoTGVuZ3RoVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5MZW5ndGgiKTsKLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEgpOwotCi0gICAgICAgICAgICBpZihtaW4gaW5zdGFuY2VvZiBJbnRlZ2VyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNaW5pbXVtKChJbnRlZ2VyKW1pbik7Ci0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpOwotCi0gICAgICAgICAgICBpZihtYXhMZW5ndGggaW5zdGFuY2VvZiBJbnRlZ2VyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LmdldENsYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0TWF4aW11bUxlbmd0aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQuY2xhc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNYXhpbXVtKChJbnRlZ2VyKW1heExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL3JlSW5pdFZhbGlkYXRvcnMoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQsIG1ldGFEYXRhKTsgLy9zZWFyY2ggd3JhcHBlcnMgYW5kIGNhbGwgLmRlYWN0aXZhdGUKLQotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcihsZW5ndGhWYWxpZGF0b3IpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTG9uZ1JhbmdlSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTG9uZ1JhbmdlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMyOTA3NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xvbmdSYW5nZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkxvbmdSYW5nZVZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJza2lwVmFsaWRhdGlvblN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24iKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBMb25nUmFuZ2VJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7Ci0gICAgICAgIExvbmdSYW5nZVZhbGlkYXRvciBsZW5ndGhWYWxpZGF0b3IgPSAoTG9uZ1JhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5Mb25nUmFuZ2UiKTsKLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKTsKLQotICAgICAgICAgICAgaWYobWluIGluc3RhbmNlb2YgTG9uZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWluaW11bSgoTG9uZyltaW4pOwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCk7Ci0KLSAgICAgICAgICAgIGlmKG1heExlbmd0aCBpbnN0YW5jZW9mIExvbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1heGltdW0oKExvbmcpbWF4TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcihsZW5ndGhWYWxpZGF0b3IpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1BhdHRlcm5Jbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDA3OTlkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLlJlZ0V4cFZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJza2lwVmFsaWRhdGlvblN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24iKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBQYXR0ZXJuSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCFtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIHBhdHRlcm5zID0gKFN0cmluZ1tdKW1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTik7Ci0KLSAgICAgICAgUmVnRXhwVmFsaWRhdG9yIHJlZ0V4cFZhbGlkYXRvcjsKLQotICAgICAgICBmb3IoU3RyaW5nIHBhdHRlcm4gOiBwYXR0ZXJucykKLSAgICAgICAgewotICAgICAgICAgICAgcmVnRXhwVmFsaWRhdG9yID0gKFJlZ0V4cFZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLlJlZ0V4cCIpOwotCi0gICAgICAgICAgICByZWdFeHBWYWxpZGF0b3Iuc2V0UGF0dGVybihwYXR0ZXJuKTsKLSAgICAgICAgICAgIHJlZ0V4cFZhbGlkYXRvci5zZXRNZXNzYWdlRGV0YWlsTm9NYXRjaCgoU3RyaW5nKW1ldGFEYXRhLmdldCgKLSAgICAgICAgICAgICAgICBDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTl9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UpKTsKLQotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IocmVnRXhwVmFsaWRhdG9yKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1JlcXVpcmVkSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUmVxdWlyZWRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTFlOTBhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUmVxdWlyZWRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFJlcXVpcmVkSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkgfHwKLSAgICAgICAgICAgbWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQpfHwKLSAgICAgICAgICAgbWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKChCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCkpIHx8Ci0gICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhpc0NvbXBvbmVudFJlcXVpcmVkKHVpQ29tcG9uZW50KSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpICYmCi0gICAgICAgICAgICAgICAgICAgIUJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQm9vbGVhbiBpc0NvbXBvbmVudFJlcXVpcmVkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgLy9jb21wYXJlIHdpdGggZmFsc2Ugc28gdHJ1ZSA9IHRydWUgb3IgbnVsbAotICAgICAgICBib29sZWFuIGlzUmVhZE9ubHkgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzUmVhZE9ubHkiKSkpOwotICAgICAgICBib29sZWFuIGlzRGlzYWJsZWQgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzRGlzYWJsZWQiKSkpOwotCi0gICAgICAgIHJldHVybiAhKGlzUmVhZE9ubHkgfHwgaXNEaXNhYmxlZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1RyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ2NGNlMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1RyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb250ZXh0LlJlcXVlc3RDb250ZXh0OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dFRleHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX0RBVEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dERhdGUiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyPiBjb21wb25lbnRJbml0aWFsaXplcnMgPQotICAgICAgICBuZXcgQXJyYXlMaXN0PFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXI+KCk7Ci0KLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFJlcXVpcmVkSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IExlbmd0aEluaXRpYWxpemVyKCkpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBMb25nUmFuZ2VJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgRG91YmxlUmFuZ2VJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgUGF0dGVybkluaXRpYWxpemVyKCkpOwotICAgICAgICAvL2NvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFZhbGlkYXRvckluaXRpYWxpemVyKCkpOwotICAgIH0KLQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTE9XLCBkZXNjcmlwdGlvbiA9ICJjaGVjayBwcHIgaXNzdWUiKQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGZvcihUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyIDogY29tcG9uZW50SW5pdGlhbGl6ZXJzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihjb21wb25lbnRJbml0aWFsaXplci5jb25maWd1cmVUcmluaWRhZENvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQ29tcG9uZW50KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVC5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpIHx8Ci0gICAgICAgICAgICAgICBUUklOSURBRF9DT1JFX0lOUFVUX0RBVEUuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYoUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuaXNQYXJ0aWFsUmVxdWVzdChmYWNlc0NvbnRleHQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXF1ZXN0Q29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5hZGRQYXJ0aWFsVGFyZ2V0KHVpQ29tcG9uZW50LmdldFBhcmVudCgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVmFsaWRhdG9ySW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVmFsaWRhdG9ySW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RiY2QwYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1ZhbGlkYXRvckluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih2YWx1ZSA9IFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkxPVywgZGVzY3JpcHRpb24gPSAiaW1wbC4gdHJpbmlkYWQgZS1tYWlsIHZhbGlkYXRvciIpCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9ySW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCFtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuQ1VTVE9NKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00pOwotCi0gICAgICAgIGlmKCEodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKE9iamVjdCBjdXJyZW50VmFsdWUgOiAoTGlzdCl2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIShjdXJyZW50VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihDb21tb25NZXRhRGF0YUtleXMuRU1BSUwuZXF1YWxzKGN1cnJlbnRWYWx1ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9UT0RPCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIyMTI4ZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9URVhUDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUuaW5wdXQuQ29yZUlucHV0VGV4dCI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX0RBVEUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXREYXRlIjsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgIHsNCi0gICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCk7DQotDQotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gZ2V0TGFiZWwodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgICAgIGlmKGxhYmVsID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsYWJlbCA9IHVpQ29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vb3ZlcnJpZGUgdGhlIGxhYmVsIGlmIHRoZSBhbm5vdGF0aW9uIHByb3ZpZGVzIGEgbGFiZWwNCi0gICAgICAgICAgICBpZihtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbGFiZWwgPSBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMLCBTdHJpbmcuY2xhc3MpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9QbGFjZUxhYmVsKGZhY2VzTWVzc2FnZSwgbGFiZWwsIGkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKSB8fA0KLSAgICAgICAgICAgICAgIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURS5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldExhYmVsKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFN0cmluZylSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiZ2V0TGFiZWwiKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWNhMjFlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyS2l0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnJlbmRlcmtpdC5SZW5kZXJLaXREZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwucmVuZGVya2l0LmNvcmUuQ29yZVJlbmRlcktpdDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZXNwb25zZVN0YXRlTWFuYWdlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LlJlc3BvbnNlV3JpdGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZFJlbmRlcktpdCBleHRlbmRzIFJlbmRlcktpdERlY29yYXRvcgotewotICAgIHByb3RlY3RlZCBFeHRWYWxSZW5kZXJLaXQgZXh0VmFsUmVuZGVyS2l0OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiRVhUVkFMX1RSSU5JREFEX1JFTkRFUktJVCI7Ci0KLSAgICBwdWJsaWMgRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQoUmVuZGVyS2l0IHdyYXBwZWQpCi0gICAgewotICAgICAgICB0aGlzLmV4dFZhbFJlbmRlcktpdCA9IG5ldyBFeHRWYWxSZW5kZXJLaXQod3JhcHBlZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICB0aGlzLmV4dFZhbFJlbmRlcktpdC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgcmVuZGVyZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZW5kZXJlciBnZXRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmdldFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVzcG9uc2VTdGF0ZU1hbmFnZXIgZ2V0UmVzcG9uc2VTdGF0ZU1hbmFnZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlc3BvbnNlV3JpdGVyIGNyZWF0ZVJlc3BvbnNlV3JpdGVyKFdyaXRlciB3cml0ZXIsIFN0cmluZyBzLCBTdHJpbmcgczEpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5leHRWYWxSZW5kZXJLaXQuY3JlYXRlUmVzcG9uc2VXcml0ZXIod3JpdGVyLCBzLCBzMSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlc3BvbnNlU3RyZWFtIGNyZWF0ZVJlc3BvbnNlU3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5leHRWYWxSZW5kZXJLaXQuY3JlYXRlUmVzcG9uc2VTdHJlYW0ob3V0cHV0U3RyZWFtKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlY29yYXRlZFJlbmRlcktpdElkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBDb3JlUmVuZGVyS2l0LkJBU0VfUkVOREVSX0tJVF9JRDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYyNzAxZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnJlbmRlcmtpdC5jb3JlLnhodG1sLnRhYmxlLlRhYmxlUmVuZGVyaW5nQ29udGV4dDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIHNvbHV0aW9uIGZvciB0cmluaWRhZCB0YWJsZSByZW5kZXJlciBpc3N1ZSAoaW4gY29ubmVjdGlvbiB3aXRoIGRvdWJsZSBjYWxsIHByZXZlbnRpb24gcHJveGllcykNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1wdWJsaWMgY2xhc3MgRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5IGV4dGVuZHMgRXh0VmFsUmVuZGVyZXJQcm94eQ0KLXsNCi0gICAgcHVibGljIEV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgc3VwZXIocmVuZGVyZXIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wdGlvbmFsS2V5KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZihUYWJsZVJlbmRlcmluZ0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gInwiICsgVGFibGVSZW5kZXJpbmdDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFJlbmRlclN0YWdlKCkuZ2V0U3RhZ2UoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAiIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ2MWY0Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQuVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdC5FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvci5UcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGFsdGVybmF0aXZlIGFwcHJvYWNoIGZvciBFeHRWYWxSZW5kZXJLaXRGYWN0b3J5DQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gIndlYi54bWwgcGFyYW1ldGVyIHRvIGRlYWN0aXZhdGUgaXQiKQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgaW5pdFRyaW5pZGFkU3VwcG9ydCgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0VHJpbmlkYWRTdXBwb3J0KCkNCi0gICAgew0KLSAgICAgICAgLy9kZWFjdGl2YXRlIGRlZmF1bHQgYXBwcm9hY2gNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5SRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZLCBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmNsYXNzKS5kZWFjdGl2YXRlKCk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBkZWFjdGl2YXRlQ2xpZW50U2lkZVZhbGlkYXRpb24gPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DTElFTlRfU0lERV9UUklOSURBRF9WQUxJREFUSU9OOw0KLQ0KLSAgICAgICAgaWYoZGVhY3RpdmF0ZUNsaWVudFNpZGVWYWxpZGF0aW9uID09IG51bGwgfHwgIWRlYWN0aXZhdGVDbGllbnRTaWRlVmFsaWRhdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgZGVhY3RpdmF0ZVRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yID0NCi0gICAgICAgICAgICAgICAgV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfVFJJTklEQURfVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1I7DQotDQotICAgICAgICBpZihkZWFjdGl2YXRlVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgPT0gbnVsbCB8fA0KLSAgICAgICAgICAgICAgICAhZGVhY3RpdmF0ZVRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IobmV3IFRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9kZWFjdGl2YXRlIGV4dHZhbCByZW5kZXJlciBwcm94eSAtIGR1ZSB0byBhbiBpbmNvbXBhdGliaWxpdHkgd2l0aCB0aGUgdGFibGUgcmVuZGVyZXINCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSwgRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICAvKg0KLSAgICAgICAgICogaWYgdGhlcmUgYXJlIGZ1cnRoZXIgaW5jb21wYXRpYmxlIHJlbmRlcmVycyB1c2UgdGhlIGZvbGxvd2luZyBxdWljay1maXg6DQotICAgICAgICAgKiAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSwgbnVsbCk7DQotICAgICAgICAgICBhdHRlbnRpb246IGl0IGNhdXNlcyBkaXJlY3QgZGVsZWdhdGlvbiB3aXRob3V0IGEgY2hlY2sgb2YgZG91YmxlIGludm9jYXRpb25zDQotICAgICAgICAgKi8NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1YjNhNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI0OTU5OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlIHByb3ZpZGVzIHNwZWNpYWwgVHJpbmlkYWQgU3VwcG9ydCBmb3IgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvci4NCi0gICAgRnVydGhlcm1vcmUsIGl0IGFsbG93cyB0byBqb2luIHRoZSBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIG1lY2hhbmlzbSBvZiBUcmluaWRhZC4gU2FtcGxlIHVzZS1jYXNlOiBhbm5vdGF0ZSB5b3VyIG1vZGVsIHdpdGggSlBBIDEuMCBhbm5vdGF0aW9ucywgYmluZCBwcm9wZXJ0aWVzIHRvIEpTRiBJbnB1dCBjb21wb25lbnRzIGFuZCBnZXQgYXV0b21hdGljIGNsaWVudC1zaWRlIHZhbGlkYXRpb24ganVzdCBieSBhZGRpbmcgMyBKQVIgZmlsZXMgKE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSwgUHJvcGVydHkgVmFsaWRhdGlvbiBhbmQgVHJpbmlkYWQgU3VwcG9ydCkuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLjEueCBhbmQgSlNGIDEuMi54LiBCb3RoIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3BvbS54bWwgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlhOTg4YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQ29yZTwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICAgIAotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8xX3JjY29yZTwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8xX3JjY29yZTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzFfcmNjb3JlPC91cmw+Ci0gICAgPC9zY20+Ci0gICAgCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jb2RlYzwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29kZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjM8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMwNDQ3Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQw0KLSAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKYXZhU2VydmVyIEZhY2VzIENvbmZpZyAxLjAvL0VOIg0KLSAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzEuZHRkIiA+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGZhY2VzLWNvbmZpZz4NCi0gICAgPGZhY3Rvcnk+DQotICAgICAgICA8cmVuZGVyLWtpdC1mYWN0b3J5Pm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXRGYWN0b3J5PC9yZW5kZXIta2l0LWZhY3Rvcnk+DQotICAgIDwvZmFjdG9yeT4NCi0NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkV4dFZhbFN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzlmMzVmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZG9udCd0IG1vdmUgdG8gYW4gb3RoZXIgcGFja2FnZSEhIQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIEV4dFZhbEluZm9ybWF0aW9uDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FID0gRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJYTUxfUEFSQU1fUFJFRklYID0gRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gIjEuMS4xIjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ3VzdG9tSW5mb3JtYXRpb24uamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0N1c3RvbUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3Mjg4MWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ3VzdG9tSW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkNCi1wdWJsaWMgZW51bSBDdXN0b21JbmZvcm1hdGlvbg0KLXsNCi0gICAgQkFTRV9QQUNLQUdFLA0KLSAgICBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiwNCi0NCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYLA0KLSAgICBWQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWCwNCi0gICAgTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVgsDQotDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfVE9fTVNHX1JFU09MVkVSX05BTUVfTUFQUEVSLA0KLSAgICBNRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUiwNCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIsDQotDQotICAgIFNUQVJUVVBfTElTVEVORVIsDQotICAgIENPTVBPTkVOVF9JTklUSUFMSVpFUiwNCi0gICAgVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IsDQotDQotICAgIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwNCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLA0KLSAgICBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLA0KLSAgICBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwNCi0NCi0gICAgTUVTU0FHRV9CVU5ETEVfTkFNRSwNCi0gICAgU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHQuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2YzQ2Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlJlbmRlcmVySW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5RmluZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRGVmYXVsdEZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBFeHRWYWxDb250ZXh0Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBFeHRWYWxDb250ZXh0IGV4dFZhbENvbnRleHQgPSBuZXcgRXh0VmFsQ29udGV4dCgpOwotCi0gICAgcHJpdmF0ZSBGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIgPSBuZXcgRGVmYXVsdEZhY3RvcnlGaW5kZXIoKTsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFJlbmRlcmVySW50ZXJjZXB0b3I+IHJlbmRlcmVySW50ZXJjZXB0b3JzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBSZW5kZXJlckludGVyY2VwdG9yPigpOwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGRlbmllZEludGVyY2VwdG9ycyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIHByaXZhdGUgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyPiBwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycyA9Ci0gICAgICAgIG5ldyBBcnJheUxpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcj4oKTsKLQotICAgIHByaXZhdGUgTGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4gY29tcG9uZW50SW5pdGlhbGl6ZXJzOwotICAgIHByaXZhdGUgTGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+IHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnM7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2xvYmFsUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLCBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+Pj4gc3RhdGljQ29uZmlnTWFwCi0gICAgICAgID0gbmV3IEhhc2hNYXA8U3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLCBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+Pj4oKTsKLQotCi0gICAgcHJpdmF0ZSB2b2lkIGxhenlJbml0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMuY29tcG9uZW50SW5pdGlhbGl6ZXJzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuY29tcG9uZW50SW5pdGlhbGl6ZXJzID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4oKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMKLSAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9DT01QT05FTlRfSU5JVElBTElaRVIpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMKLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX0lOSVRJQUxJWkVSKSk7Ci0KLSAgICAgICAgQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXI7Ci0gICAgICAgIGZvciAoU3RyaW5nIGNvbXBvbmVudEluaXRpYWxpemVyTmFtZSA6IGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXIgPQotICAgICAgICAgICAgICAgIChDb21wb25lbnRJbml0aWFsaXplcikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNvbXBvbmVudEluaXRpYWxpemVyTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChjb21wb25lbnRJbml0aWFsaXplciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQoY29tcG9uZW50SW5pdGlhbGl6ZXIpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoY29tcG9uZW50SW5pdGlhbGl6ZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxhenlJbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBpZih0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+KCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SKTsKLSAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldCgKLSAgICAgICAgICAgICAgICAgICAgQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IpKTsKLQotICAgICAgICBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lIDogdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yID0KLSAgICAgICAgICAgICAgICAoVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUpOwotCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycy5hZGQodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEV4dFZhbENvbnRleHQgZ2V0Q29udGV4dCgpCi0gICAgewotICAgICAgICByZXR1cm4gZXh0VmFsQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmFjdG9yeUZpbmRlciBnZXRGYWN0b3J5RmluZGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWN0b3J5RmluZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZhY3RvcnlGaW5kZXIoRmFjdG9yeUZpbmRlciBmYWN0b3J5RmluZGVyKQotICAgIHsKLSAgICAgICAgaWYoZmFjdG9yeUZpbmRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZhY3RvcnlGaW5kZXIgPSBmYWN0b3J5RmluZGVyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UmVuZGVyZXJJbnRlcmNlcHRvcj4gZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8UmVuZGVyZXJJbnRlcmNlcHRvcj4ocmVuZGVyZXJJbnRlcmNlcHRvcnMudmFsdWVzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKEV4dFZhbENvbnRleHQuY2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZW5pZWRJbnRlcmNlcHRvcnMuY29udGFpbnMocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvcnMucHV0KHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpLCByZW5kZXJlckludGVyY2VwdG9yKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihDbGFzcyByZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpCi0gICAgewotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgPQotICAgICAgICAgICAgKFJlbmRlcmVySW50ZXJjZXB0b3IpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcyk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChFeHRWYWxDb250ZXh0LmNsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9ycy5yZW1vdmUocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy9pZiBhbiBpbnRlcmNlcHRvciBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkIHNvIGZhciwgaXQgc2hvdWxkIGJlIGRlbmllZCBhdCBmdXR1cmUgcmVnaXN0cmF0aW9ucwotICAgIHB1YmxpYyB2b2lkIGRlbnlSZW5kZXJlckludGVyY2VwdG9yKENsYXNzIHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcykKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA9Ci0gICAgICAgICAgICAoUmVuZGVyZXJJbnRlcmNlcHRvcikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3MocmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKEV4dFZhbENvbnRleHQuY2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbmllZEludGVyY2VwdG9ycy5hZGQocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpOwotICAgICAgICB9Ci0gICAgICAgIGRlcmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIoQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIpCi0gICAgewotICAgICAgICBsYXp5SW5pdENvbXBvbmVudEluaXRpYWxpemVycygpOwotICAgICAgICB0aGlzLmNvbXBvbmVudEluaXRpYWxpemVycy5hZGQoY29tcG9uZW50SW5pdGlhbGl6ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPiBnZXRDb21wb25lbnRJbml0aWFsaXplcnMoKQotICAgIHsKLSAgICAgICAgbGF6eUluaXRDb21wb25lbnRJbml0aWFsaXplcnMoKTsKLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudEluaXRpYWxpemVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIGxhenlJbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICB0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMuYWRkKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPiBnZXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGxhenlJbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyPiBnZXRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycygpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcihQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyIHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIpCi0gICAgewotICAgICAgICB0aGlzLnByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzLmFkZChwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQotICAgIHsKLSAgICAgICAgTWFwIGFwcGxpY2F0aW9uTWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uTWFwKCk7Ci0gICAgICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGJlYW4gPSAoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4pIGFwcGxpY2F0aW9uTWFwLmdldChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUpOwotCi0gICAgICAgIGlmIChiZWFuID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbml0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oYXBwbGljYXRpb25NYXApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotICAgIHByaXZhdGUgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gaW5pdEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKE1hcCBhcHBsaWNhdGlvbk1hcCkKLSAgICB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fSU5GT1JNQVRJT05fUFJPVklERVJfQkVBTik7Ci0gICAgICAgIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lcy5hZGQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQ1VTVE9NX0JFQU4pOwotCi0gICAgICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuOwotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgaWYgKGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXBwbGljYXRpb25NYXAucHV0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSwgaW5mb3JtYXRpb25Qcm92aWRlckJlYW4pOwotICAgICAgICAgICAgICAgIHJldHVybiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeVRvSW5pdEN1c3RvbUNvbmZpZ3VyZWRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZShhcHBsaWNhdGlvbk1hcCk7Ci0KLSAgICAgICAgaWYoYXBwbGljYXRpb25NYXAuY29udGFpbnNLZXkoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbilhcHBsaWNhdGlvbk1hcC5nZXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvSW5pdEN1c3RvbUNvbmZpZ3VyZWRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZShNYXAgYXBwbGljYXRpb25NYXApCi0gICAgewotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBiZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpCi0gICAgICAgICAgICAuZ2V0QmVhbihJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5DVVNUT01fQkVBTi5yZXBsYWNlKCIuIiwgIl8iKSk7Ci0KLSAgICAgICAgaWYoYmVhbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcHBsaWNhdGlvbk1hcC5wdXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FLCBiZWFuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBnZXRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcyBuYW1lKQotICAgIHsKLSAgICAgICAgaWYoIXRoaXMuc3RhdGljQ29uZmlnTWFwLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBzdGF0aWNDb25maWdMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4oKTsKLSAgICAgICAgICAgIHRoaXMuc3RhdGljQ29uZmlnTWFwLnB1dChuYW1lLCBzdGF0aWNDb25maWdMaXN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5zdGF0aWNDb25maWdNYXAuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzIG5hbWUsIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZykKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gc3RhdGljQ29uZmlnTGlzdDsKLSAgICAgICAgICAgIGlmKCF0aGlzLnN0YXRpY0NvbmZpZ01hcC5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0aWNDb25maWdMaXN0ID0gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4oKTsKLSAgICAgICAgICAgICAgICB0aGlzLnN0YXRpY0NvbmZpZ01hcC5wdXQobmFtZSwgc3RhdGljQ29uZmlnTGlzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLnN0YXRpY0NvbmZpZ01hcC5nZXQobmFtZSkuYWRkKHN0YXRpY0NvbmZpZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRHbG9iYWxQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFkZEdsb2JhbFByb3BlcnR5KG5hbWUgLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYWRkR2xvYmFsUHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBmb3JjZU92ZXJyaWRlKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5nbG9iYWxQcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZighZm9yY2VPdmVycmlkZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIm92ZXJyaWRlIGdsb2JhbCBwcm9wZXJ0eSAnIiArIG5hbWUgKyAiJyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuZ2xvYmFsUHJvcGVydGllcy5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2xvYmFsUHJvcGVydGllcy5nZXQobmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYzMxMTYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcmVuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqICsgc29tZSBvZiB0aGVtIGNhbiBiZSBjdXN0b21pemVkIHdpdGhpbiBhIGN1c3RvbSBpbXBsLiBvZiB0aGUgYmVhbg0KLSAqIChleHRlbmQgdGhpcyBjbGFzcyBhbmQgcHJvdmlkZSBpdCB2aWEgY29udmVudGlvbiBvciB3ZWIueG1sKQ0KLSAqIDxwLz4NCi0gKiB0aGUgc3RhdGljIGFwaSBzaG91bGQgb25seSBiZSB1c2VkDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEksIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFQU5fTkFNRSA9IEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FDQotICAgICAgICArICIuIiArIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsNCi0gICAgLy9jdXN0b20gY2xhc3Mgd2hpY2ggaXMgYW4gb3B0aW9uYWwgcmVwbGFjZW1lbnQgZm9yIHRoaXMgY2xhc3MgKGhhcyB0byBleHRlbmQgdGhpcyBjbGFzcykNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0JFQU4gPSAoRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUNCi0gICAgICAgICsgIi5jdXN0b20uIiArIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7DQotDQotICAgIHB1YmxpYyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotDQotICAgICAgICBzZXR1cEN1c3RvbWl6YWJsZUluZm9ybWF0aW9uKCk7DQotICAgICAgICBhcHBseUN1c3RvbVZhbHVlcyh0aGlzLmN1c3RvbWl6YWJsZUluZm9zKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxDdXN0b21JbmZvcm1hdGlvbiwgU3RyaW5nPiBjdXN0b21pemFibGVJbmZvcyA9IG5ldyBIYXNoTWFwPEN1c3RvbUluZm9ybWF0aW9uLCBTdHJpbmc+KCk7DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cEN1c3RvbWl6YWJsZUluZm9ybWF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGJhc2VQYWNrYWdlID0gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9CQVNFX1BBQ0tBR0U7DQotDQotICAgICAgICBpZiAoYmFzZVBhY2thZ2UgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBiYXNlUGFja2FnZSA9IEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsgIi5jdXN0b20uIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghYmFzZVBhY2thZ2UuZW5kc1dpdGgoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBiYXNlUGFja2FnZSA9IGJhc2VQYWNrYWdlICsgIi4iOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkJBU0VfUEFDS0FHRSwgYmFzZVBhY2thZ2UpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SLA0KLSAgICAgICAgICAgICAgICAiQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgsDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uU3RyYXRlZ3kiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfUE9TVEZJWCwNCi0gICAgICAgICAgICAgICAgIk1ldGFEYXRhVHJhbnNmb3JtZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWCwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9JTklUSUFMSVpFUiwNCi0gICAgICAgICAgICAgICAgIkNvbXBvbmVudEluaXRpYWxpemVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IsDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01TR19SRVNPTFZFUl9OQU1FX01BUFBFUiwNCi0gICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUiwNCi0gICAgICAgICAgICAiTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUiwNCi0gICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVJUVVBfTElTVEVORVIsDQotICAgICAgICAgICAgICAgICJTdGFydHVwTGlzdGVuZXIiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIk1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Iik7DQotDQotICAgICAgICAvL2NvbnZlbnRpb25zICh0aGUgcmVzdCBvZiB0aGUgY29udmVudGlvbnMgYXJlIGJ1aWx0IHdpdGggdGhlIGhlbHAgb2YgbmFtZSBtYXBwZXJzLC4uLg0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FU1NBR0VfQlVORExFX05BTUUsDQotICAgICAgICAgICAgICAgICJ2YWxpZGF0aW9uX21lc3NhZ2VzIik7DQotICAgICAgICAvL3N0YXRpYyBzdHJhdGVneSBtYXBwaW5ncyAobmFtZSBvZiBwcm9wZXJ0eSBmaWxlcykNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5TVEFUSUNfU1RSQVRFR1lfTUFQUElOR19TT1VSQ0UsDQotICAgICAgICAgICAgICAgICJzdHJhdGVneV9tYXBwaW5ncyIpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGFwcGx5Q3VzdG9tVmFsdWVzKE1hcDxDdXN0b21JbmZvcm1hdGlvbiwgU3RyaW5nPiBtYXApDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgdG8gY3VzdG9taXplIGluZm9ybWF0aW9uDQotICAgIH0NCi0NCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXQoQ3VzdG9tSW5mb3JtYXRpb24gY3VzdG9tSW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGN1c3RvbWl6YWJsZUluZm9zLmdldChjdXN0b21JbmZvcm1hdGlvbik7DQotDQotICAgICAgICBzd2l0Y2ggKGN1c3RvbUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNhc2UgQkFTRV9QQUNLQUdFOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgKiBwb3N0Zml4IHVzZWQgYnkgdGhlIFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi0gICAgICAgICAgICAgKiB0aGUgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBpcyBmb3IgY3VzdG9tIHN0cmF0ZWdpZXMgb25seQ0KLSAgICAgICAgICAgICAqIChub3QgZm9yIHB1YmxpYyB2YWxpZGF0aW9uIG1vZHVsZXMpDQotICAgICAgICAgICAgICogc28gaXQncyBmaW5lIHRvIGN1c3RvbWl6ZSBpdA0KLSAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgY2FzZSBWQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVg6DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0NCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9taXphYmxlSW5mb3MuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkJBU0VfUEFDS0FHRSkgKyB2YWx1ZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5Zjg2OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2R1bGVNZXNzYWdlQnVuZGxlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuZXdQYWNrYWdlTmFtZTsNCi0gICAgICAgIGlmIChwYWNrYWdlTmFtZS5lbmRzV2l0aCgiLnJlc29sdmVyIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgbmV3UGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZS5yZXBsYWNlKCIucmVzb2x2ZXIiLCAiLmJ1bmRsZSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5ld1BhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUucmVwbGFjZSgiLnJlc29sdmVyLiIsICIuYnVuZGxlLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG5ld1BhY2thZ2VOYW1lICsgIi52YWxpZGF0aW9uX21lc3NhZ2VzIjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKA0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsICIubWVzc2FnZS5yZXNvbHZlci4iLCB0YXJnZXRDbGFzc05hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoDQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgU3RyaW5nIHRhcmdldENsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgIi5tZXRhZGF0YS50cmFuc2Zvcm1lci4iLCB0YXJnZXRDbGFzc05hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UGFja2FnZU5hbWUsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXROYW1lKCk7DQotDQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUucmVwbGFjZSgiLnN0cmF0ZWd5LiIsIHRhcmdldFBhY2thZ2VOYW1lKTsNCi0NCi0gICAgICAgIGlmICh0YXJnZXRDbGFzc05hbWUgPT0gbnVsbCB8fCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSkgKyAiLiIgKyB0YXJnZXRDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHVzZSBhIGN1c3RvbSBuYW1lIG1hcHBlciB0byBpbXBsZW1lbnQgY3VzdG9tIGNvbnZlbnRpb25zDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgIlZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB1c2UgYSBjdXN0b20gbmFtZSBtYXBwZXIgdG8gaW1wbGVtZW50IGN1c3RvbSBjb252ZW50aW9ucw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5LnJlcGxhY2UoIi5hbm5vdGF0aW9uLiIsICIuc3RyYXRlZ3kuIikgKyAiU3RyYXRlZ3kiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgIk1ldGFEYXRhVHJhbnNmb3JtZXIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0YXJnZXRQb3N0Zml4KQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5lbmRzV2l0aCgiVmFsaWRhdGlvblN0cmF0ZWd5IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneU5hbWUuc3Vic3RyaW5nKDAsIHZhbGlkYXRpb25TdHJhdGVneU5hbWUubGVuZ3RoKCkgLSAxOCkgKyB0YXJnZXRQb3N0Zml4Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5lbmRzV2l0aCgiU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5zdWJzdHJpbmcoMCwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5sZW5ndGgoKSAtIDgpICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjk2MTgzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcmVuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgLyoNCi0gICAgICogbWlzYw0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVTU0FHRV9CVU5ETEUgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVNTQUdFX0JVTkRMRSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX1BBQ0tBR0UgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9CQVNFX1BBQ0tBR0UiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fSU5GT1JNQVRJT05fUFJPVklERVJfQkVBTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9TVEFUSUNfVkFMSURBVElPTl9TVFJBVEVHWV9NQVBQSU5HID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORyIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DT01QT05FTlRfSU5JVElBTElaRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT01QT05FTlRfSU5JVElBTElaRVIiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBuYW1lIG1hcHBlcg0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUiIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBmYWN0b3JpZXMNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBkZWFjdGl2YXRlDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfUkVOREVSS0lUID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1JFTkRFUktJVCIpOw0KLQ0KLSAgICAvL2N1cnJlbnRseSBqdXN0IHVzZWQgYnkgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0RFRkFVTFRfQ09OVkVOVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT04iKTsNCi0NCi0gICAgLy90aGVyZSBpcyBub3RoaW5nIGxpa2UgREVBQ1RJVkFURV9ERUZBVUxUX1ZBTElEQVRJT05fSU5URVJDRVBUT1INCi0gICAgLy91c2UgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZGVueVJlbmRlcmVySW50ZXJjZXB0b3IoLi4uKSB3aXRoaW4gYW4gZXh0dmFsLVN0YXJ0dXBMaXN0ZW5lcg0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9BYnN0cmFjdEVMSGVscGVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY0MDViMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9BYnN0cmFjdEVMSGVscGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIGRldGFpbHMNCi0gKiBAc2VlIERlZmF1bHRFTEhlbHBlcg0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkgY3VzdG9tRUxIZWxwZXJGYWN0b3J5Ow0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbUVMSGVscGVyRmFjdG9yeShBYnN0cmFjdEVMSGVscGVyRmFjdG9yeSBlbEhlbHBlckZhY3RvcnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3VzdG9tRUxIZWxwZXJGYWN0b3J5ID0gZWxIZWxwZXJGYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBmaW5hbCBFTEhlbHBlciBjcmVhdGUoKQ0KLSAgICB7DQotICAgICAgICBFTEhlbHBlciByZXN1bHQgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYodGhpcy5jdXN0b21FTEhlbHBlckZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSB0aGlzLmN1c3RvbUVMSGVscGVyRmFjdG9yeS5jcmVhdGVFTEhlbHBlcigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUVMSGVscGVyKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBFTEhlbHBlciBjcmVhdGVFTEhlbHBlcigpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGExMzhhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nOw0KLWltcG9ydCBqYXZhLmlvLkV4dGVybmFsaXphYmxlOw0KLQ0KLS8qKg0KLSAqIGluIG9yZGVyIHRvIGNlbnRyYWxpemUgdGhlIGpzZiB2ZXJzaW9uIGRlcGVuZGVuY3kgd2l0aGluIHRoZSBjb3JlDQotICoNCi0gKiB0aGlzIGVsLWhlbHBlciBzdXBwb3J0cyBqc3AgYW5kIGZhY2VsZXRzICh0ZXN0ZWQgd2l0aCAxLjEuMTQpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIHRoZXJlIGlzIGEgc3BlY2lhbCBmYWNlbGV0cyB3b3JrYXJvdW5kIGZvciBlbC1leHByZXNzaW9ucyBvZiBjdXN0b20gY29tcG9uZW50cw0KLSAqIGl0J3MgcGx1Z2dhYmxlIGluIG9yZGVyIHRvIHN1cHBvcnQgc3BlY2lhbCBtZWNoYW5pc21zIG9mIGRpZmZlcmVudCB0ZWNobm9sb2dpZXMgKHRoYW4ganNwIGFuZCBmYWNlbGV0cykNCi0gKiBzbyB5b3UgY2FuIHBsdWcgaW4geW91ciBvd24gaW1wbC4gd2hpY2ggaW1wbGVtZW50cyBhIGN1c3RvbSB3b3JrYXJvdW5kIChsaWtlIHRoZSBmYWNlbGV0cyB3b3JrYXJvdW5kIG9mIHRoaXMgaW1wbC4pDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEVMSGVscGVyIGltcGxlbWVudHMgRUxIZWxwZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0RUxIZWxwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgLy9kdWUgdG8gYSByZXN0cmljdGlvbiB3aXRoIHRoZSByaQ0KLSAgICAgICAgT2JqZWN0IGJlYW4gPSBnZXRWYWx1ZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgcmV0dXJuIChiZWFuICE9IG51bGwpID8gYmVhbi5nZXRDbGFzcygpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oU3RyaW5nIGJlYW5OYW1lKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgcmV0dXJuIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmdldFZhcmlhYmxlUmVzb2x2ZXIoKS5yZXNvbHZlVmFyaWFibGUoZmFjZXNDb250ZXh0LCBiZWFuTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiAhPSBudWxsKSA/IGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgLmNyZWF0ZVZhbHVlQmluZGluZyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSkuZ2V0VmFsdWUoZmFjZXNDb250ZXh0KSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmNyZWF0ZVZhbHVlQmluZGluZyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKSAhPSBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBnZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBib29sZWFuIGFsbG93QmxhbmtDaGFyYWN0ZXJzKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IGdldE9yaWdpbmFsVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih1aUNvbXBvbmVudCk7DQotDQotICAgICAgICAvL2ZvciBpbnB1dCBjb21wb25lbnRzIHdpdGhvdXQgdmFsdWUtYmluZGluZw0KLSAgICAgICAgLy8oZS5nLiBmb3Igc3BlY2lhbCBjb21wb25lbnQgbGlicyAtPiBpc3N1ZSB3aXRoIEV4dFZhbFJlbmRlcmVyV3JhcHBlciNlbmNvZGVCZWdpbikNCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoDQotICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKSArICIgaGFzIG5vIHZhbHVlIGJpbmRpbmcgLSBjb21wb25lbnQgaWQ6ICIgKyB1aUNvbXBvbmVudC5nZXRJZCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBpZighYWxsb3dCbGFua0NoYXJhY3RlcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZSgiICIsICIiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwNCi0gICAgICAgICAgICBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKS5nZXRCYXNlRXhwcmVzc2lvbigpKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gcmVzdWx0ID0gRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyLg0KLSAgICAgICAgICAgICAgICB0cnlUb0NyZWF0ZVZhbHVlQmluZGluZ0ZvckZhY2VsZXRzQmluZGluZyh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICAgICAgaWYocmVzdWx0ID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgcmVzb2x2ZSBleHByZXNzaW9uOiAiICsgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIENsYXNzIGVudGl0eUNsYXNzID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHJlc3VsdC5nZXRCYXNlRXhwcmVzc2lvbigpKTsNCi0NCi0gICAgICAgICAgICBpZihlbnRpdHlDbGFzcyA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IHJlc29sdmUgZXhwcmVzc2lvbjogIiArIHJlc3VsdC5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm9wZXJ0eURldGFpbHMgZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IGdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24odWlDb21wb25lbnQsIGZhbHNlKTsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24gPQ0KLSAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0NCi0gICAgICAgIFN0cmluZyBwYXRoID0gbnVsbDsNCi0NCi0gICAgICAgIHdoaWxlKGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihwYXRoID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwYXRoID0gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcGF0aCA9IGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkgKyAiLiIgKyBwYXRoOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBwYXRoID0gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSArICIuIiArIHBhdGg7DQotDQotICAgICAgICBPYmplY3QgYmFzZU9iamVjdCA9IGdldFZhbHVlT2ZFeHByZXNzaW9uKA0KLSAgICAgICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscyhwYXRoLCBiYXNlT2JqZWN0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLSAgICB9DQotDQotICAgIHN0YXRpYyBTdHJpbmcgZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmcgdmFsdWVFeHByZXNzaW9uID0gdWlDb21wb25lbnQuZ2V0VmFsdWVCaW5kaW5nKCJ2YWx1ZSIpOw0KLQ0KLSAgICAgICAgcmV0dXJuICh2YWx1ZUV4cHJlc3Npb24gIT0gbnVsbCkgPyB2YWx1ZUV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VMVGVybVdlbGxGb3JtZWQoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgVmFsdWVCaW5kaW5nIHx8IG8gaW5zdGFuY2VvZiBFeHRlcm5hbGl6YWJsZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcyA9IG8udG9TdHJpbmcoKTsNCi0gICAgICAgIHJldHVybiAoKHMuY29udGFpbnMoIiMiKSB8fCBzLmNvbnRhaW5zKCIkIikpICYmIHMuY29udGFpbnMoInsiKSAmJiBzLmNvbnRhaW5zKCJ9IikpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmluZGluZ09mQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHVpQ29tcG9uZW50LmdldFZhbHVlQmluZGluZyhuYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZmU1NmMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RUxIZWxwZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkNCi17DQotICAgIHByaXZhdGUgRUxIZWxwZXIgZWxIZWxwZXIgPSBuZXcgRGVmYXVsdEVMSGVscGVyKCk7DQotICAgIA0KLSAgICBwcm90ZWN0ZWQgRUxIZWxwZXIgY3JlYXRlRUxIZWxwZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5lbEhlbHBlcjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FTEhlbHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRUxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGViMjU1My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FTEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIGluIG9yZGVyIHRvIGNlbnRyYWxpemUgdGhlIGpzZiB2ZXJzaW9uIGRlcGVuZGVuY3kgd2l0aGluIHRoZSBjb3JlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIEVMSGVscGVyDQotew0KLSAgICBPYmplY3QgZ2V0QmVhbihTdHJpbmcgYmVhbk5hbWUpOw0KLQ0KLSAgICBPYmplY3QgZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0NCi0gICAgQ2xhc3MgZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLQ0KLSAgICBQcm9wZXJ0eURldGFpbHMgZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpOw0KLQ0KLSAgICBib29sZWFuIGlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLQ0KLSAgICBib29sZWFuIGlzRUxUZXJtV2VsbEZvcm1lZChPYmplY3Qgbyk7DQotDQotICAgIE9iamVjdCBnZXRCaW5kaW5nT2ZDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBuYW1lKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwMTQ2MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogSGVscGVyIGNsYXNzIHRvIGdldCB0aGUgcmVhbC9mdWxsIHZhbHVlIGJpbmRpbmcgLSB0ZXN0ZWQgd2l0aCBmYWNlbGV0cyAxLjEuMTQNCi0gKiBUaGUgdGFyZ2V0IGlzIHRvIGdldCByaWQgb2YgdGhpcyBpbXBsLiAtIGN1cnJlbnRseSBpdCdzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IGN1c3RvbSBmYWNlbGV0cyBjb21wb25lbnRzLg0KLSAqIEFuIGFsdGVybmF0aXZlIHdvdWxkIGJlIGFuIEVMLVJlc29sdmVyIC0gdGhlcmUgYXJlIHN0aWxsIHNvbWUgb3BlbiBpc3N1ZXMgd2l0aCBzdWNoIGFuIGFwcHJvYWNoDQotICogKyBJdCBpc24ndCBhdmFpbGFibGUgd2l0aCBKU0YgMS4xLngNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9DcmVhdGVWYWx1ZUJpbmRpbmdGb3JGYWNlbGV0c0JpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBEZWZhdWx0RUxIZWxwZXIuZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEJpbmRpbmdzID0gZXh0cmFjdEVMVGVybXMoDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmluZGluZ09mQ29tcG9uZW50KHVpQ29tcG9uZW50LCAidmFsdWUiKSk7DQotDQotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZT0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIDEpICsgInsiICsgY3JlYXRlQmluZGluZyhmb3VuZEJpbmRpbmdzLCBtYXBwZWRGYWNlbGV0c1ZhcnMpICsgIn0iKTsNCi0NCi0gICAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YmUuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotDQotICAgICAgICAgICAgaWYoZW50aXR5Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnlUb1JlcGxhY2VWYXJzKHZiZSwgbWFwcGVkRmFjZWxldHNWYXJzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHZiZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVCaW5kaW5nKExpc3Q8U3RyaW5nPiBleHByZXNzaW9ucywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkZWRWaXJ0dWFsTmFtZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGVudHJ5IDogZXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoIlZhbHVlRXhwcmVzc2lvblsiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBmb3VuZEJpbmRpbmdEZXRhaWxzID0gZW50cnkuc3BsaXQoIiAiKTsNCi0gICAgICAgICAgICBpbmRleE9mQmluZGluZ0RldGFpbHMgPSBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKGZvdW5kQmluZGluZ0RldGFpbHMpOw0KLQ0KLSAgICAgICAgICAgIGlmIChpbmRleE9mQmluZGluZ0RldGFpbHMgPT0gLTEpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgYmluZGluZ0RldGFpbHMgPSBmb3VuZEJpbmRpbmdEZXRhaWxzW2luZGV4T2ZCaW5kaW5nRGV0YWlsc10uc3BsaXQoIj0iKTsNCi0NCi0gICAgICAgICAgICBpZiAoYmluZGluZ0RldGFpbHMubGVuZ3RoIDwgMikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGJpbmRpbmdEZXRhaWxzWzFdOw0KLQ0KLSAgICAgICAgICAgIC8vdG8gc3VwcG9ydCBibGFua3Mgd2l0aGluIGEgYmluZGluZyB3aXRoIG1hcCBzeW50YXgNCi0gICAgICAgICAgICBpZihjdXJyZW50QmluZGluZy5jb250YWlucygieyIpICYmICFjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgPSBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKGN1cnJlbnRCaW5kaW5nLCBmb3VuZEJpbmRpbmdEZXRhaWxzLCBpbmRleE9mQmluZGluZ0RldGFpbHMpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnNLZXkoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5wdXQoYmluZGluZ0RldGFpbHNbMF0sIGN1cnJlbnRCaW5kaW5nKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvL2VudHJ5IGZvciAidmlydHVhbCIgZmFjZWxldHMgdmFyDQotICAgICAgICAgICAgaWYoIShjdXJyZW50QmluZGluZy5jb250YWlucygieyIpIHx8IGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhcnMucHV0KGJpbmRpbmdEZXRhaWxzWzBdLCBiaW5kaW5nRGV0YWlsc1sxXS5zdWJzdHJpbmcoMSwgYmluZGluZ0RldGFpbHNbMV0ubGVuZ3RoKCktMikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBvcmlnaW5hbEJpbmRpbmcgPSBhZGRlZFZpcnR1YWxOYW1lcy5nZXQoInZhbHVlIik7DQotICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcuc3Vic3RyaW5nKG9yaWdpbmFsQmluZGluZy5pbmRleE9mKCJ7IikgKyAxLCBvcmlnaW5hbEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLnJlbW92ZSgidmFsdWUiKTsNCi0gICAgICAgIHJldHVybiB0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcob3JpZ2luYWxCaW5kaW5nLCBhZGRlZFZpcnR1YWxOYW1lcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRyeVRvVHJhbnNmb3JtVG9SZWFsQmluZGluZyhTdHJpbmcgb3JpZ2luYWxCaW5kaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZGVkVmlydHVhbE5hbWVzKQ0KLSAgICB7DQotICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSAiI3siICsgb3JpZ2luYWxCaW5kaW5nICsgIn0iOw0KLSAgICAgICAgSXRlcmF0b3IgbmFtZUl0ZXJhdG9yID0gYWRkZWRWaXJ0dWFsTmFtZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsNCi0NCi0gICAgICAgIFN0cmluZyBjdXJyZW50S2V5Ow0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRWYWx1ZTsNCi0gICAgICAgIHdoaWxlKG5hbWVJdGVyYXRvci5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudEtleSA9IChTdHJpbmcpIG5hbWVJdGVyYXRvci5uZXh0KCk7DQotICAgICAgICAgICAgY3VycmVudFZhbHVlID0gYWRkZWRWaXJ0dWFsTmFtZXMuZ2V0KGN1cnJlbnRLZXkpOw0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoY3VycmVudFZhbHVlLmluZGV4T2YoInsiKSArIDEsIGN1cnJlbnRWYWx1ZS5pbmRleE9mKCJ9IikpOw0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJ7IiArIGN1cnJlbnRLZXkgKyAiLiIsICJ7IiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICIuIiwgIi4iICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIl0iLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiXSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG9yaWdpbmFsQmluZGluZy5zdWJzdHJpbmcoMiwgb3JpZ2luYWxCaW5kaW5nLmxlbmd0aCgpIC0gMSk7DQotICAgIH0NCi0NCi0gICAgLy90byBzdXBwb3J0IGJsYW5rcyAtIGUuZy4gd2l0aCBtYXAgc3ludGF4DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKFN0cmluZyBjdXJyZW50QmluZGluZywgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlscykNCi0gICAgew0KLSAgICAgICAgZm9yKGludCBpID0gaW5kZXhPZkJpbmRpbmdEZXRhaWxzICsgMTsgaSA8IGZvdW5kQmluZGluZ0RldGFpbHMubGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgKz0gZm91bmRCaW5kaW5nRGV0YWlsc1tpXTsNCi0gICAgICAgICAgICBpZihmb3VuZEJpbmRpbmdEZXRhaWxzW2ldLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEJpbmRpbmc7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRCaW5kaW5nOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBpbnQgY291bnQgPSAwOw0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBiaW5kaW5nRGV0YWlscykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuY29udGFpbnMoIj0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY291bnQrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZXh0cmFjdEVMVGVybXMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlRUxUZXJtcyhvLCBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKSwgZm91bmRFTFRlcm1zLCAwKSA+IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRFTFRlcm1zOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcmVzb2x2ZUVMVGVybXMoT2JqZWN0IG8sIE1hcDxPYmplY3QsIE9iamVjdD4gdmlzaXRlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMsIGludCBjb3VudCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAobyA9PSBudWxsIHx8IHZpc2l0ZWQuY29udGFpbnNLZXkobykgfHwgY291bnQgPiA1MCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZpc2l0ZWQucHV0KG8sIG51bGwpOw0KLQ0KLSAgICAgICAgaW50IGVsQ291bnQgPSAwOw0KLSAgICAgICAgQ2xhc3MgYyA9IG8uZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIC8vaW5zcGVjdCBtYXBzDQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1hcCkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBmb3IgKE9iamVjdCBlbnRyeSA6ICgoTWFwKSBvKS52YWx1ZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZm91bmQgZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICAgICAgaWYoZW50cnkudG9TdHJpbmcoKS5jb250YWlucygiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKGVudHJ5LnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoZW50cnksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGVsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQobykpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gKytlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9hbmFseXplIGFycmF5cw0KLSAgICAgICAgaWYgKGMuaXNBcnJheSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgobyk7DQotICAgICAgICAgICAgLy9jaGVjayBhcnJheSBbTCAtPiBubyBhcnJheSBvZiBwcmltaXRpdmUgdHlwZXMNCi0gICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMamF2YS5sYW5nLlN0cmluZyIpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChBcnJheS5nZXQobywgaSkpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKEFycmF5LmdldChvLCBpKSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxGaWVsZD4gYXR0cmlidXRlcyA9IGZpbmRBbGxBdHRyaWJ1dGVzKGMsIG5ldyBBcnJheUxpc3Q8RmllbGQ+KCkpOw0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBhdHRyaWJ1dGVzLnRvQXJyYXkobmV3IEZpZWxkW2F0dHJpYnV0ZXMuc2l6ZSgpXSk7DQotDQotICAgICAgICBBY2Nlc3NpYmxlT2JqZWN0LnNldEFjY2Vzc2libGUoZmllbGRzLCB0cnVlKTsNCi0gICAgICAgIGZvciAoRmllbGQgY3VycmVudEZpZWxkIDogZmllbGRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQuZ2V0KG8pID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5nZXRUeXBlKCkuZXF1YWxzKFN0cmluZy5jbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmdldChvKSAhPSBudWxsICYmIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKGN1cnJlbnRGaWVsZC5nZXQobykpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFjdXJyZW50RmllbGQuZ2V0VHlwZSgpLmlzUHJpbWl0aXZlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKGN1cnJlbnRGaWVsZC5nZXQobyksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZWxDb3VudDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEZpZWxkPiBmaW5kQWxsQXR0cmlidXRlcyhDbGFzcyBjLCBMaXN0PEZpZWxkPiBhdHRyaWJ1dGVzKQ0KLSAgICB7DQotICAgICAgICBpZiAoYyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluZEFsbEF0dHJpYnV0ZXMoYy5nZXRTdXBlcmNsYXNzKCksIGF0dHJpYnV0ZXMpOw0KLQ0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBjLmdldERlY2xhcmVkRmllbGRzKCk7DQotICAgICAgICBmb3IgKEZpZWxkIGN1cnJlbnRGaWVsZCA6IGZpZWxkcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzU3RhdGljKGN1cnJlbnRGaWVsZC5nZXRNb2RpZmllcnMoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChjdXJyZW50RmllbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9SZXBsYWNlVmFycyhWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eTsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0gICAgICAgIGJvb2xlYW4gbGFzdCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgd2hpbGUodHJ1ZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxhc3QgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0NCi0gICAgICAgICAgICBwcm9wZXJ0eSA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbg0KLSAgICAgICAgICAgICAgICAucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIGdldE5ld1Byb3BlcnR5KHByb3BlcnR5LCBtYXBwZWRGYWNlbGV0c1ZhcnMpKTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQubGVuZ3RoKCkgPT0gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpICsgIi4iICsgcmVzdWx0Ow0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpOw0KLQ0KLSAgICAgICAgICAgIGlmKGxhc3QpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcmVmaXgoKSArICJ7IiArIHJlc3VsdCArICJ9Iik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5ld1Byb3BlcnR5KFN0cmluZyBvbGRQcm9wZXJ0eSwgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFycyA9IGdldFBvdGVudGlhbFZpcnR1YWxWYXJzKG9sZFByb3BlcnR5KTsNCi0NCi0gICAgICAgIGZvcihTdHJpbmcgdmlydHVhbFZhciA6IHZpcnR1YWxWYXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1hcHBlZEZhY2VsZXRzVmFycy5jb250YWluc0tleSh2aXJ0dWFsVmFyKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG9sZFByb3BlcnR5ID0gcmVwbGFjZVByb3BlcnR5VmFsdWUob2xkUHJvcGVydHksIHZpcnR1YWxWYXIsIG1hcHBlZEZhY2VsZXRzVmFycy5nZXQodmlydHVhbFZhcikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvbGRQcm9wZXJ0eTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0UG90ZW50aWFsVmlydHVhbFZhcnMoU3RyaW5nIG9sZFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpbnQgc3RhcnQgPSAtMTsNCi0gICAgICAgIGludCBlbmQgPSAtMTsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG9sZFByb3BlcnR5Lmxlbmd0aCgpOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoc3RhcnQgPT0gLSAxICYmIG9sZFByb3BlcnR5LmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKChzdGFydCAhPSAtIDEgJiYgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICdbJykgfHwgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICddJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGVuZCA9IGk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKHN0YXJ0ICE9IC0xICYmIGVuZCAhPSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJMaXN0LmFkZChvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOw0KLSAgICAgICAgICAgICAgICBpZihvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbmQgPSAtMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlydHVhbFZhckxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcGxhY2VQcm9wZXJ0eVZhbHVlKFN0cmluZyBvbGRQcm9wZXJ0eSwgU3RyaW5nIHRhcmdldFZhciwgU3RyaW5nIG5ld1ZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpbnQgaW5kZXggPSBvbGRQcm9wZXJ0eS5pbmRleE9mKHRhcmdldFZhcik7DQotDQotICAgICAgICBpZihpbmRleCA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gb2xkUHJvcGVydHk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gb2xkUHJvcGVydHkuc3Vic3RyaW5nKDAsIGluZGV4KTsNCi0gICAgICAgIHJlc3VsdCArPSBuZXdWYWx1ZTsNCi0gICAgICAgIHJldHVybiByZXN1bHQgKyBvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoaW5kZXggKyB0YXJnZXRWYXIubGVuZ3RoKCksIG9sZFByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiByZXBsYWNlIHZpcnR1YWwgZmFjZWxldHMgdmFycyAobWFwIHN5bnRheCkNCi0gICAgICogdGVzdGVkIHN0eWxlcyAoc2ltcGxlIGFuZCBuZXN0ZWQpOiB0ZXN0W2l4W2l4MltpeDNdXV0NCi0gICAgICovDQotICAgIC8qDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBfY3JlYXRlQmluZGluZyhMaXN0PFN0cmluZz4gZXhwcmVzc2lvbnMsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmlydHVhbFZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0NCi0gICAgICAgIFN0cmluZyBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50QmluZGluZzsNCi0gICAgICAgIFN0cmluZyBwYXJ0T2ZCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBleHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aCgiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZvdW5kQmluZGluZ0RldGFpbHMgPSBlbnRyeS5zcGxpdCgiICIpOw0KLSAgICAgICAgICAgIGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoZm91bmRCaW5kaW5nRGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9PSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBiaW5kaW5nRGV0YWlscyA9IGZvdW5kQmluZGluZ0RldGFpbHNbaW5kZXhPZkJpbmRpbmdEZXRhaWxzXS5zcGxpdCgiPSIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nRGV0YWlscy5sZW5ndGggPCAyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYmluZGluZ0RldGFpbHNbMV07DQotDQotICAgICAgICAgICAgLy90byBzdXBwb3J0IGJsYW5rcyB3aXRoaW4gYSBiaW5kaW5nIHdpdGggbWFwIHN5bnRheA0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgJiYgIWN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoY3VycmVudEJpbmRpbmcsIGZvdW5kQmluZGluZ0RldGFpbHMsIGluZGV4T2ZCaW5kaW5nRGV0YWlscyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lICE9IG51bGwgJiYgY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnMoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBwYXJ0T2ZCaW5kaW5nID0gY3VycmVudEJpbmRpbmcuc3Vic3RyaW5nKGN1cnJlbnRCaW5kaW5nLmluZGV4T2YocHJldkZhY2VsZXRzQXR0cmlidXRlTmFtZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICArIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUubGVuZ3RoKCksIGN1cnJlbnRCaW5kaW5nLmluZGV4T2YoIn0iKSk7DQotDQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5hZGQoYmluZGluZ0RldGFpbHNbMF0pOw0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgcGFydE9mQmluZGluZzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICBlbHNlIGlmKCEoY3VycmVudEJpbmRpbmcuY29udGFpbnMoInsiKSB8fCBjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJzLnB1dChiaW5kaW5nRGV0YWlsc1swXSwgYmluZGluZ0RldGFpbHNbMV0uc3Vic3RyaW5nKDEsIGJpbmRpbmdEZXRhaWxzWzFdLmxlbmd0aCgpLTIpKTsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWlucyhiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLmFkZChiaW5kaW5nRGV0YWlsc1swXSk7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyZW50QmluZGluZy5zdWJzdHJpbmcoY3VycmVudEJpbmRpbmcuaW5kZXhPZigieyIpICsgMSwgY3VycmVudEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gYmluZGluZ0RldGFpbHNbMF07DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotICAgICovDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24uamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M4YWZlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRpZmZlcmVuY2UgYmV0d2VlbiBbIGFuZCBbJyAtIHRlc3Qgd2l0aCBtb3JlIGNvbnN0ZWxsYXRpb25zIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQ0KLXB1YmxpYyBjbGFzcyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotew0KLSAgICBwcml2YXRlIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYmFzZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7DQotICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdG9rZW47DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXBsYWNlT3JBZGRQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlcGxhY2VQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1Byb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkuZW5kc1dpdGgoIiddIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCksIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBhZGRQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIFN0cmluZyBuZXdQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUV4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzb3VyY2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBzb3VyY2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSk7DQotDQotICAgICAgICBpZihuZXdQcm9wZXJ0eS5zdGFydHNXaXRoKCJbJyIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihyZXN1bHQgKyBuZXdQcm9wZXJ0eSArICJ9Iik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHJlc3VsdCArICIuIiArIG5ld1Byb3BlcnR5ICsgIn0iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihTdHJpbmcgZXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgaWYoIUV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKGV4cHJlc3Npb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXhwcmVzc2lvbiArICIgaXMgbm8gdmFsaWQgZWwtZXhwcmVzc2lvbiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW50IGluZGV4MSA9IGV4cHJlc3Npb24ubGFzdEluZGV4T2YoIiddIik7DQotICAgICAgICBpbnQgaW5kZXgyID0gZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiLiIpOw0KLQ0KLSAgICAgICAgaWYoaW5kZXgxID4gaW5kZXgyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnN1YnN0cmluZygwLCBpbmRleDEpOw0KLQ0KLSAgICAgICAgICAgIGludCBpbmRleDMgPSBmaW5kSW5kZXhPZlN0YXJ0aW5nQnJhY2tldChleHByZXNzaW9uKTsNCi0gICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoaW5kZXgzICsgMiwgaW5kZXgxKTsNCi0gICAgICAgICAgICB0aGlzLmJhc2UgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihleHByZXNzaW9uLnN1YnN0cmluZygwLCBpbmRleDMpICsgIn0iKTsNCi0gICAgICAgICAgICB0aGlzLnRva2VuID0gIlsnIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoIGluZGV4MiA+IGluZGV4MSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoaW5kZXgyICsgMSwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEgKTsNCi0gICAgICAgICAgICB0aGlzLmJhc2UgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihleHByZXNzaW9uLnN1YnN0cmluZygwLCBpbmRleDIpICsgIn0iKTsNCi0gICAgICAgICAgICB0aGlzLnRva2VuID0gIi4iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZygyLCBleHByZXNzaW9uLmxlbmd0aCgpIC0gMSk7DQotICAgICAgICAgICAgdGhpcy5wcmVmaXggPSBleHByZXNzaW9uLnN1YnN0cmluZygwLCAxKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUudHJpbSgpOw0KLSAgICAgICAgDQotICAgICAgICBpZigiWyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMudmFsdWUuc3RhcnRzV2l0aCgiJyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUuc3Vic3RyaW5nKDEsIHRoaXMudmFsdWUubGVuZ3RoKCkgLSAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZS52YWx1ZSArIHRoaXMudG9rZW4gKyB0aGlzLnZhbHVlLnN1YnN0cmluZygwLCB0aGlzLnZhbHVlLmxlbmd0aCgpKSArICInXSI7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gZ2V0QmFzZUV4cHJlc3Npb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmFzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4cHJlc3Npb25TdHJpbmcoKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgYmFzZUV4cHJlc3Npb24gPSB0aGlzLmJhc2UuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLQ0KLSAgICAgICAgICAgIGlmKCJbJyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAiJ119IjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAifSI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlZml4ICsgInsiICsgdGhpcy52YWx1ZSArICJ9IjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMuYmFzZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UuZ2V0UHJlZml4KCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5iYXNlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5iYXNlLnNldFByZWZpeChwcmVmaXgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRFeHByZXNzaW9uU3RyaW5nKCkuaGFzaENvZGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uICYmIGdldEV4cHJlc3Npb25TdHJpbmcoKQ0KLSAgICAgICAgICAgIC5lcXVhbHMoKChWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKSB0YXJnZXQpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBpbnQgZmluZEluZGV4T2ZTdGFydGluZ0JyYWNrZXQoU3RyaW5nIGV4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIGludCBjbG9zZUNvdW50ID0gMDsNCi0gICAgICAgIGZvcihpbnQgaSA9IGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxOyBpID4gMDsgaS0tKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGV4cHJlc3Npb24uY2hhckF0KGkpID09ICdbJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNsb3NlQ291bnQtLTsNCi0gICAgICAgICAgICAgICAgaWYoY2xvc2VDb3VudCA8IDApDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYoZXhwcmVzc2lvbi5jaGFyQXQoaSkgPT0gJ10nKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2xvc2VDb3VudCsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRGVmYXVsdEZhY3RvcnlGaW5kZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRGVmYXVsdEZhY3RvcnlGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhmNzE3Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0RlZmF1bHRGYWN0b3J5RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRGVmYXVsdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8vZHluYW1pYyBhcHByb2FjaCB0byBjcmVhdGUgdGhlIGZhY3RvcmllcyBkdXJpbmcgdGhlIGZpcnN0IHJlcXVlc3QsIHdoZW4gYSBmYWNlcy1jb250ZXh0IGlzIGF2YWlsYWJsZQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWN0b3J5RmluZGVyIGltcGxlbWVudHMgRmFjdG9yeUZpbmRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJvdGVjdGVkIE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4gZmFjdG9yeU1hcCA9IG5ldyBIYXNoTWFwPEZhY3RvcnlOYW1lcywgT2JqZWN0PigpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdEZhY3RvcnlGaW5kZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBmaW5hbCA8VD4gVCBnZXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIGlmKCEoZmFjdG9yeU1hcC5jb250YWluc0tleShmYWN0b3J5TmFtZSkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRGYWN0b3J5KGZhY3RvcnlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoVClmYWN0b3J5TWFwLmdldChmYWN0b3J5TmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgc3dpdGNoIChmYWN0b3J5TmFtZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjYXNlIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlTWVzc2FnZVJlc29sdmVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBSRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBFTF9IRUxQRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZUVMSGVscGVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0OiAvL3JlcXVpcmVkIGJ5IGNoZWNrc3R5bGUNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgcG9zc2libGUgdG8gY3JlYXRlIGZhY3RvcnkgIiArIGZhY3RvcnlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZhY3RvcnlNYXAucHV0KGZhY3RvcnlOYW1lLCBmYWN0b3J5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkpOw0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSk7DQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotICAgICAgICBMaXN0PFN0cmluZz4gbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSk7DQotICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZICk7DQotICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBjcmVhdGVFTEhlbHBlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRFTEhlbHBlckZhY3RvcnkoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlGaW5kZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGYyNjI1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBGYWN0b3J5RmluZGVyCi17Ci0gICAgPFQ+IFQgZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUsIENsYXNzPFQ+IHRhcmdldENsYXNzKTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeU5hbWVzLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTE5ZGMyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkKLXB1YmxpYyBlbnVtIEZhY3RvcnlOYW1lcwotewotICAgIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLAotICAgIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwKLSAgICBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwKLQotICAgIFJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksCi0gICAgRUxfSEVMUEVSX0ZBQ1RPUlkKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9Db21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MGNlMjIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEFsbG93cyB0byBpbml0aWFsaXplIGNvbXBvbmVudHMgYmVmb3JlRW5jb2RlQmVnaW4uPGJyLz4KLSAqIGUuZy46IHlvdSBjYW4gYWRkIGluZm9ybWF0aW9uIGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIG1lY2hhbmlzbXMsLi4uCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU3MTU0MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBTdGF0aWNDb25maWd1cmF0aW9uPFQsIFI+Ci17Ci0gICAgdm9pZCBzZXRTb3VyY2VPZk1hcHBpbmcoU3RyaW5nIHBhdGgpOwotICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFQsIFI+PiBnZXRNYXBwaW5nKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uRW50cnkuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMzEwZjQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8VCwgUj4KLXsKLSAgICBwcml2YXRlIFQgc291cmNlOwotICAgIHByaXZhdGUgUiB0YXJnZXQ7Ci0KLSAgICBwdWJsaWMgVCBnZXRTb3VyY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoVCBzb3VyY2UpCi0gICAgewotICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUiBnZXRUYXJnZXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRhcmdldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoUiB0YXJnZXQpCi0gICAgewotICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FkYTdkOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSX0pCi1wdWJsaWMgZW51bSBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMKLXsKLSAgICBNRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9DT05GSUcKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDg3ZDBkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LlJFVVNFfSkKLXB1YmxpYyBjbGFzcyBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPgotewotICAgIHByaXZhdGUgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5ncwotICAgICAgICA9IG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4oKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gZ2V0TWFwcGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gbWFwcGluZ3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgc291cmNlLCBTdHJpbmcgdGFyZ2V0KQotICAgIHsKLSAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA9IG5ldyBTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIGVudHJ5LnNldFNvdXJjZShzb3VyY2UpOwotICAgICAgICBlbnRyeS5zZXRUYXJnZXQodGFyZ2V0KTsKLSAgICAgICAgdGhpcy5tYXBwaW5ncy5hZGQoZW50cnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWE2M2M0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuUkVVU0V9KQotcHVibGljIGNsYXNzIFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+Ci17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGF0aDsKLSAgICBwcml2YXRlIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3M7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VPZk1hcHBpbmcoU3RyaW5nIHBhdGgpCi0gICAgewotICAgICAgICB0aGlzLnBhdGggPSBwYXRoOwotICAgICAgICAvL2ZvcmNlIHJlbG9hZAotICAgICAgICBtYXBwaW5ncyA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gZ2V0TWFwcGluZygpCi0gICAgewotICAgICAgICBpZihtYXBwaW5ncyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbWFwcGluZ3M7Ci0gICAgICAgIH0KLQotICAgICAgICBtYXBwaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4oKTsKLQotICAgICAgICBSZXNvdXJjZUJ1bmRsZSBtYXBwaW5nID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHBhdGgpOwotCi0gICAgICAgIGlmIChtYXBwaW5nID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vbG9nZ2luZwotICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIEVudW1lcmF0aW9uIGtleXMgPSBtYXBwaW5nLmdldEtleXMoKTsKLQotICAgICAgICBTdHJpbmcgbWV0YURhdGFLZXk7Ci0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7Ci0KLSAgICAgICAgd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFEYXRhS2V5ID0gKFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lID0gbWFwcGluZy5nZXRTdHJpbmcobWV0YURhdGFLZXkpOwotCi0gICAgICAgICAgICBhZGRNYXBwaW5nKG1ldGFEYXRhS2V5LCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXBwaW5nczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgbWV0YURhdGFLZXksIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpCi0gICAgewotICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5ID0gbmV3IFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgZW50cnkuc2V0U291cmNlKG1ldGFEYXRhS2V5KTsKLSAgICAgICAgZW50cnkuc2V0VGFyZ2V0KHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSk7Ci0gICAgICAgIHRoaXMubWFwcGluZ3MuYWRkKGVudHJ5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGQzZjA3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFJlbmRlcmVySW50ZXJjZXB0b3IKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcigpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0SW50ZXJjZXB0b3JJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRSZXR1cm5WYWx1ZU9uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBza2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLCBPYmplY3QgY3VycmVudFJldHVyblZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnRSZXR1cm5WYWx1ZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICogYmVmb3JlCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBhZnRlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFmdGVyRGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyRW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyRW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZnRlckdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVmMjc1OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9SZW5kZXJlckludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogQWxsb3dzIHRvIGludGVyY2VwdCByZW5kZXJlciBtZXRob2RzLjxici8+Ci0gKiBCYXNlIG1lY2hhbmlzbSBvZiBleHR2YWwuIEl0IGFsbG93cyB0byBhZGQgY3VzdG9tIGluZnJhc3RydWN0dXJlcy4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIFN0cmluZyBnZXRJbnRlcmNlcHRvcklkKCk7Ci0KLSAgICBPYmplY3QgZ2V0UmV0dXJuVmFsdWVPblNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oCi0gICAgICAgIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gc2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiwgT2JqZWN0IGN1cnJlbnRSZXR1cm5WYWx1ZSk7Ci0KLSAgICAvKgotICAgICAqIGJlZm9yZQotICAgICAqLwotICAgIHZvaWQgYmVmb3JlRGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlRW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgLyoKLSAgICAgKiBhZnRlcgotICAgICAqLwotICAgIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyRW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2MwOWFiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gaW50ZXJjZXB0IHZhbGlkYXRpb3IgZXhjZXB0aW9ucy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yDQotew0KLSAgICAvKioNCi0gICAgICoNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IHRoZSBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gbWV0YURhdGFFbnRyeSB0aGUgbWV0YSBkYXRhIGVudHJ5IHdoaWNoIGNvbnRhaW5zIHRoZSBtZXRhIGRhdGEgb2YgdGhlIHByb3BlcnR5DQotICAgICAqIEBwYXJhbSBjb252ZXJ0ZWRPYmplY3QgdGhlIGNvbnZlcnRlZCB1c2VyIGlucHV0DQotICAgICAqIEBwYXJhbSB2YWxpZGF0b3JFeGNlcHRpb24gdGhlIGN1cnJlbnQgZXhjZXB0aW9uDQotICAgICAqIEBwYXJhbSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UgdmFsaWRhdGlvbiBzdHJhdGVneSB3aGljaCB0aHJldyB0aGUgZXhjZXB0aW9uDQotICAgICAqIEByZXR1cm4gZmFsc2UgdG8gc3RvcCB0aHJvd2luZyB0aGUgZXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWZjYzRmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlci5Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpbml0Q29tcG9uZW50KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBpZighKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHRvIGluaXQgY29tcG9uZW50ICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5OwotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7Ci0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IgPSBFeHRWYWxVdGlscy5nZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcigpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KS5nZXRNZXRhRGF0YUVudHJpZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOwotCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIXNraXBWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHZhbGlkYXRpb25TdHJhdGVneSwgZW50cnkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IEV4dFZhbFV0aWxzLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KTsKLQotICAgICAgICAgICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcobWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbWV0YURhdGFUcmFuc2Zvcm1lci5jb252ZXJ0TWV0YURhdGEoZW50cnkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYobWV0YURhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMoZW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCBCb29sZWFuLmNsYXNzKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YS5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9nZXQgY29tcG9uZW50IGluaXRpYWxpemVyIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQgYW5kIGNvbmZpZ3VyZSBpdAotICAgICAgICAgICAgICAgIC8vYWxzbyBpbiBjYXNlIG9mIHNraXBwZWQgdmFsaWRhdGlvbiB0byByZXNldCBlLmcuIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiaW5pdCBjb21wb25lbnQgb2YgIiArIHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0ID0gd3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLQotICAgICAgICAvL3JlY29yZGUgdXNlciBpbnB1dCBlLmcuIGZvciBjcm9zcy1jb21wb25lbnQgdmFsaWRhdGlvbgotICAgICAgICBmb3IoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciByZWNvcmRlciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlY29yZGVyLnJlY29yZFVzZXJJbnB1dCh1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsKLQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHJlY29yZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjYWxsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb2Nlc3NWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpCi0gICAgewotICAgICAgICBpZiAoISh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCB2YWxpZGF0aW9uIik7Ci0gICAgICAgIH0KLQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5OwotCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gRXh0VmFsVXRpbHMuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKTsKLQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpLmdldE1ldGFEYXRhRW50cmllcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7Ci0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihza2lwVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uU3RyYXRlZ3ksIGVudHJ5KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJ2YWxpZGF0ZSAiICsgZW50cnkuZ2V0VmFsdWUoKSArICIgd2l0aCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBlbnRyeSwgY29udmVydGVkT2JqZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gdmFsaWRhdGlvbiBzdHJhdGVneSBmb3VuZCBmb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgidmFsaWRhdGlvbiBmaW5pc2hlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2tpcFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgZW50cnkpCi0gICAgewotICAgICAgICAvL292ZXJyaWRlIGZvciBjdXN0b20gc2tpcCB2YWxpZGF0aW9uIHN1cHBvcnQgKGlmIG5lZWRlZCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1NzhjNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbi4gU3ViY2xhc3NlcyBqdXN0IGhhdmUgdG8gbm93IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgbmFtZSBtYXBwZXIuDQotICoNCi0gKiBOYW1lTWFwcGVycyBhcmUgc3RhdGVsZXNzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFQ+IGltcGxlbWVudHMgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJpdmF0ZSBOYW1lTWFwcGVyPFQ+IGN1c3RvbU5hbWVNYXBwZXI7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShUIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGN1c3RvbU5hbWVNYXBwZXIgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpOw0KLQ0KLSAgICAgICAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU5hbWVNYXBwZXIgPSAoTmFtZU1hcHBlcjxUPikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChjdXN0b21OYW1lTWFwcGVyICE9IG51bGwpID8gY3VzdG9tTmFtZU1hcHBlci5jcmVhdGVOYW1lKHNvdXJjZSkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY4ZDczYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIENsYXNzTWFwcGluZ0ZhY3Rvcnk8UCwgUj4KLXsKLSAgICBSIGNyZWF0ZShQIHNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL05hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiNmQ0My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBuYW1lIG1hcHBlcnMuDQotICogQSBuYW1lIG1hcHBlciBjYWxjdWxhdGVzIGEgbmFtZSBmb3IgYSBnaXZlbiBzb3VyY2Ugb2JqZWN0Lg0KLSAqIGUuZy4gTWV0YS1EYXRhIEtleSAoZS5nLjogYW5ub3RhdGlvbiBjbGFzcyBuYW1lKSAtPiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgU3RyaW5nIGNyZWF0ZU5hbWUoVCBzb3VyY2UpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL0NvbW1vbk1ldGFEYXRhS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTI4YmFlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL0NvbW1vbk1ldGFEYXRhS2V5cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBoZWxwZXIgZm9yIGZyZXF1ZW50IG1ldGEtZGF0YSBrZXlzCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotLyoKLSAqIHBsYWNlZCBpbiBjb3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgaW5mb3JtYXRpb24gaW4gbXVsdGlwbGUgbW9kdWxlcyAodmFsaWRhdGlvbiBtb2R1bGUgYW5kIGNvbXBvbmVudC1zdXBwb3J0IG1vZHVsZSkKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBpbnRlcmZhY2UgQ29tbW9uTWV0YURhdGFLZXlzCi17Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRCA9ICJyZXF1aXJlZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFLX1JFUVVJUkVEID0gIndlYWtfcmVxdWlyZWQiOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5fTEVOR1RIID0gIm1pbl9sZW5ndGgiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0xFTkdUSCA9ICJtYXhfbGVuZ3RoIjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOR0VfTUlOID0gInJhbmdlX21pbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9NQVggPSAicmFuZ2VfbWF4IjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUVEVSTiA9ICJwYXR0ZXJuIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFID0gInBhdHRlcm5fdmFsaWRhdGlvbl9lcnJvcl9tZXNzYWdlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQUlMID0gImVtYWlsIjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NID0gImN1c3RvbSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lQX1ZBTElEQVRJT04gPSAic2tpcF92YWxpZGF0aW9uIjsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL01ldGFEYXRhRW50cnkuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL01ldGFEYXRhRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJjYjU4Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9NZXRhRGF0YUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBEYXRhIGhvbGRlciB3aGljaCBzdG9yZXMgdGhlIG1ldGEtZGF0YSBhbmQgc29tZSBpbmZvcm1hdGlvbiB3aGVyZSB0aGUgbWV0YS1kYXRhIHdhcyBhcm91bmQuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgTWV0YURhdGFFbnRyeQotewotICAgIHByaXZhdGUgU3RyaW5nIGtleTsKLSAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRLZXkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gVCBnZXRWYWx1ZShDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVClnZXRWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpZ2V0UHJvcGVydHkoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMyZjRhNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhbGwgZmFjdG9yaWVzIHdoaWNoIGNyZWF0ZSBtZXRhLWRhdGEgZXh0cmFjdG9ycwotICogCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ci17Ci0gICAgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlKCk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZjdlMzMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBleHRyYWN0cyBtZXRhLWRhdGEgKGUuZy4gdGhlIGFubm90YXRpb25zKSBvZiB0aGUgdmFsdWUgYmluZGluZyBvZiBhIGNvbXBvbmVudC4KLSAqIEl0IGV4dHJhY3RzIHRoZSBtZXRhLWRhdGEgb2YgdGhlIGZpZWxkIGFuZCB0aGUgcHJvcGVydHkuCi0gKiAoQWxzbyB0aGUgYW5ub3RhdGlvbnMgb2Ygc3VwZXIgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcy4pCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3RvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQotICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOwotCi0gICAgICAgIC8vc2hvdWxkIG5ldmVyIG9jY3VyCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpICYmIG9iamVjdCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4ob2JqZWN0LmdldENsYXNzKCkgKyAiIGlzIG5vIHZhbGlkIGNvbXBvbmVudCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCA9IChVSUNvbXBvbmVudCkgb2JqZWN0OwotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGV4dHJhY3RpbmcgbWV0YS1kYXRhIG9mICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5RGV0YWlscyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGdldCBiZWFuIGNsYXNzIGFuZCBwcm9wZXJ0eSBuYW1lCi0gICAgICAgICAqLwotICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKTsKLQotICAgICAgICAvL2NyZWF0ZQotICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnNldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIHByb3BlcnR5RGV0YWlscyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZmluZCBhbmQgYWRkIGFubm90YXRpb25zCi0gICAgICAgICAqLwotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSBlbnRpdHlDbGFzczsKLQotICAgICAgICB3aGlsZSAoIU9iamVjdC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGN1cnJlbnRDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICAgICAgYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9ucyhjdXJyZW50Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudENsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IGVudGl0eUNsYXNzLmdldEludGVyZmFjZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudEludGVyZmFjZTsKLQotICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRDbGFzcyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoY3VycmVudENsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0KLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0cmFjdCBmaW5pc2hlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIHByb3BlcnR5ID0gcHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSk7Ci0KLSAgICAgICAgTWV0aG9kIG1ldGhvZDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0aG9kID0gZW50aXR5LmdldERlY2xhcmVkTWV0aG9kKCJnZXQiICsgcHJvcGVydHkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kID0gZW50aXR5LmdldERlY2xhcmVkTWV0aG9kKCJpcyIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJtZXRob2Qgbm90IGZvdW5kIC0gY2xhc3M6ICIgKyBlbnRpdHkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgLSBtZXRob2RzOiAiICsgImdldCIgKyBwcm9wZXJ0eSArICIgIiArICJpcyIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoQXJyYXlzLmFzTGlzdChtZXRob2QuZ2V0QW5ub3RhdGlvbnMoKSksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBGaWVsZCBmaWVsZDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmllbGQgPSBlbnRpdHkuZ2V0RGVjbGFyZWRGaWVsZChwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWVsZCA9IGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKCJfIiArIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZmllbGQgIiArIHByb3BlcnR5ICsgIiBvciBfIiArIHByb3BlcnR5ICsgIiBub3QgZm91bmQiLCBlMSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoQXJyYXlzLmFzTGlzdChmaWVsZC5nZXRBbm5vdGF0aW9ucygpKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoCi0gICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMsIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uYWRkTWV0YURhdGFFbnRyeShjcmVhdGVNZXRhRGF0YUVudHJ5Rm9yQW5ub3RhdGlvbihhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShhbm5vdGF0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmb3VuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1ldGFEYXRhRW50cnkgY3JlYXRlTWV0YURhdGFFbnRyeUZvckFubm90YXRpb24oQW5ub3RhdGlvbiBmb3VuZEFubm90YXRpb24pCi0gICAgewotICAgICAgICBNZXRhRGF0YUVudHJ5IGVudHJ5ID0gbmV3IE1ldGFEYXRhRW50cnkoKTsKLQotICAgICAgICBlbnRyeS5zZXRLZXkoZm91bmRBbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgZW50cnkuc2V0VmFsdWUoZm91bmRBbm5vdGF0aW9uKTsKLQotICAgICAgICByZXR1cm4gZW50cnk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkODBkNzkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGlzIGZhY3RvcnkgY3JlYXRlcyBhIG1ldGEtZGF0YSBleHRyYWN0b3Igd2hpY2ggZXh0cmFjdHMgdGhlIG1ldGEtZGF0YQotICogb2YgdGhlIHZhbHVlIGJpbmRpbmcgb2YgYSBjb21wb25lbnQuCi0gKiA8cC8+Ci0gKiBvcmRlcjo8YnIvPgotICogPG9sPgotICogICA8bGk+Y29uZmlndXJlZCBtZXRhLWRhdGEgZXh0cmFjdG9yICh3ZWIueG1sKTwvbGk+Ci0gKiAgIDxsaT5jb25maWd1cmVkIG1ldGEtZGF0YSBleHRyYWN0b3IgKGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pPC9saT4KLSAqICAgPGxpPmRlZmF1bHQgaW1wbGVtZW50YXRpb248L2xpPgotICogPC9vbD4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkKLXsKLSAgICBwcml2YXRlIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gbnVsbDsKLQotICAgIHB1YmxpYyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQotICAgIHB1YmxpYyBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGUoKQotICAgIHsKLSAgICAgICAgaWYgKG1ldGFEYXRhRXh0cmFjdG9yID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SKTsKLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SKSk7Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMuYWRkKERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3IgPSAoTWV0YURhdGFFeHRyYWN0b3IpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1ldGFEYXRhRXh0cmFjdG9yICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKG1ldGFEYXRhRXh0cmFjdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjcmVhdGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWV0YURhdGFFeHRyYWN0b3I7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL01ldGFEYXRhRXh0cmFjdG9yLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0MDUxZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLQotLyoqCi0gKiBBbiBtZXRhLWRhdGEgZXh0cmFjdG9yIGlzIHJlc3BvbnNpYmxlIHRvIGFuYWx5emUgYW4gb2JqZWN0Ci0gKiBhbmQgcmV0dXJucyBhbGwgYXZhaWxhYmxlIG1ldGEtZGF0YSBpbmZvcm1hdGlvbgotICogCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFFeHRyYWN0b3IKLXsKLSAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njk5MTJhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSBlcXVpdmFsZW50IHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0Lg0KLSAqDQotICogaWYgdGhlcmUgaXMgYWxzbyBhIHByb3h5IGZvciB0aGUgZXh0cmFjdG9yIHlvdSBjYW4gdXNlIHRoZSBjbGFzc05hbWUgcHJvcGVydHkgdG8gbWFudWFsbHkgcmVwZWF0IHRoZQ0KLSAqIGZ1bGwgcXVhbGlmaWVkIGNsYXNzIG5hbWUuDQotICoNCi0gKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgaW50ZXJmYWNlIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlciBleHRlbmRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlYTgxOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgZXF1aXZhbGVudCB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0gKg0KLSAqIGlmIHRoZXJlIGlzIGFsc28gYSBwcm94eSBmb3IgdGhlIHRyYW5zZm9ybWVyIHlvdSBjYW4gdXNlIHRoZSBjbGFzc05hbWUgcHJvcGVydHkgdG8gbWFudWFsbHkgcmVwZWF0IHRoZQ0KLSAqIGZ1bGwgcXVhbGlmaWVkIGNsYXNzIG5hbWUuDQotICoNCi0gKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgY2xhc3MgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbCBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXIsIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIHByaXZhdGUgU3RyaW5nIG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWU7DQotDQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKG1ldGFEYXRhRW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoU3RyaW5nIG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSA9IG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhVHJhbnNmb3JtZXIoTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXIgPSBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4OWJjMzguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyDQotICAgICAgICAuQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcg0KLSAgICAgICAgLkN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXINCi0gICAgICAgIC5EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyDQotICAgICAgICAuU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyDQotICAgICAgICAuQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0NCi0vKioNCi0gKiBGYWN0b3J5IHdoaWNoIGNyZWF0ZXMgdGhlIE1ldGFEYXRhVHJhbnNmb3JtZXIgZm9yIGEgZ2l2ZW4gVmFsaWRhdGlvblN0cmF0ZWd5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIFZhbGlkYXRpb25TdHJhdGVneSAtPiBNZXRhRGF0YVRyYW5zZm9ybWVyIGluc3RlYWQgb2YgTWV0YS1EYXRhIC0+IE1ldGFEYXRhVHJhbnNmb3JtZXINCi0gKiB0byBhdm9pZCBhIHNlY29uZCBzdGF0aWMgbWFwcGluZyBlLmcuIGZvciBqcGEgYW5ub3RhdGlvbnMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWV0YURhdGFUcmFuc2Zvcm1lcj4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZzsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IG5hbWVNYXBwZXJMaXN0DQotICAgICAgICA9IG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PigpOw0KLQ0KLSAgICBzdGF0aWMNCi0gICAgew0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIG5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFUcmFuc2Zvcm1lciBjcmVhdGUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgPSBudWxsOw0KLQ0KLSAgICAgICAgLy9wcm94eSBjaGVjaw0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vaW4gY2FzZSBvZiBhIHByb3h5IGFuZCB0aGUgdXNhZ2Ugb2YgYSBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcg0KLSAgICAgICAgZWxzZSBpZiAodmFsaWRhdGlvblN0cmF0ZWd5IGluc3RhbmNlb2YgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSA9ICgoQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIpdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRTdGF0aWNNYXBwaW5ncygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcuY29udGFpbnNLZXkodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChNZXRhRGF0YVRyYW5zZm9ybWVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSgNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZy5nZXQodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICAgICAgU3RyaW5nIHRyYW5zZm9ybWVyTmFtZTsNCi0gICAgICAgIC8vbnVsbCAtPiB1c2UgbmFtZSBtYXBwZXJzDQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiBuYW1lTWFwcGVyIDogbmFtZU1hcHBlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJhbnNmb3JtZXJOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKHZhbGlkYXRpb25TdHJhdGVneSk7DQotDQotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWVyTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSAoTWV0YURhdGFUcmFuc2Zvcm1lcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodHJhbnNmb3JtZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIHRyYW5zZm9ybWVyTmFtZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIHN5bmNocm9uaXplZCAoRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgICAgICAvL3NldHVwIGludGVybmFsIHN0YXRpYyBtYXBwaW5ncw0KLSAgICAgICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnIDoNCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9DT05GSUcpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBTdHJhdGVneU1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3MpDQotICAgIHsNCi0gICAgICAgIGZvcihTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IG1hcHBpbmcgOiBtYXBwaW5ncykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNYXBwaW5nKG1hcHBpbmcuZ2V0U291cmNlKCksIG1hcHBpbmcuZ2V0VGFyZ2V0KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgdHJhbnNmb3JtZXJOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImFkZGluZyB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1ldGEtZGF0YSB0cmFuc2Zvcm1lciBtYXBwaW5nOiAiDQotICAgICAgICAgICAgICAgICsgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArICIgLT4gIiArIHRyYW5zZm9ybWVyTmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBzeW5jaHJvbml6ZWQgKERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5jbGFzcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLnB1dCh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCB0cmFuc2Zvcm1lck5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1MDRiMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEFsbG93cyB0byB0cmFuc2Zvcm0gY29uY3JldGUgbWV0YS1kYXRhIHRvIGEgbW9yZSBhYnN0cmFjdCBmb3JtLjxici8+DQotICogZS5nLjogQFJlcXVpcmVkLCBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsLi4uKSwgQExlbmd0aChtaW5pbXVtID0gMSksIC4uLiAtPiByZXF1aXJlZCA9IHRydWUNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi0vLypUcmFuc2Zvcm1lciBpbnN0ZWFkIG9mICpDb252ZXJ0ZXIgdG8gYXZvaWQgbmFtaW5nIGNvbmZ1c2lvbiANCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGEpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMzRmZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcgotICAgIGltcGxlbWVudHMgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjMzMWUyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIC0gaWYgdGhlcmUgaXMgYSBwcm94eSBhcm91bmQgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5IGluc3RhbmNlb2YgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICgoQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIpdmFsaWRhdGlvblN0cmF0ZWd5KS5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTdiMmQ5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKiAoY29uZmlndXJlZCB2aWEgd2ViLnhtbCkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYWNkMTEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gTWV0YURhdGFUcmFuc2Zvcm1lcnMuDQotICogKGNvbmZpZ3VyZWQgdmlhIGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pDQotICogVGhlIGJlYW4gcHJvdmlkZXMgdGhlIGRlZmF1bHQgbmFtZSAoY29udmVudGlvbikuDQotICogSXQncyBwb3NzaWJsZSB0byBwcm92aWRlIGEgY3VzdG9tIGZ1bGwgcXVhbGlmaWVkIG5hbWUuICg9IGN1c3RvbWl6YWJsZSBjb252ZW50aW9uKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWJlZGIwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIG1hcHMgRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1ldGFEYXRhVHJhbnNmb3JtZXJzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksIGdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzA5ZWYxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIHRvIHBsYWNlIFZhbGlkYXRpb25TdHJhdGVnaWVzIGFuZCBNZXRhRGF0YVRyYW5zZm9ybWVycyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZ2V0U2ltcGxlTWV0YURhdGFUcmFuc2Zvcm1lck5hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArICIuIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTWV0YURhdGFUcmFuc2Zvcm1lck5hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneVBhY2thZ2VOYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcG9zdGZpeCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYKTsNCi0NCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5lbmRzV2l0aCgiVmFsaWRhdGlvblN0cmF0ZWd5IikgfHwNCi0gICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5lbmRzV2l0aCgiU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUgKyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCkgLHBvc3RmaXgpDQotICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgiVmFsaWRhdGlvblN0cmF0ZWd5IiwgcG9zdGZpeCkNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCJTdHJhdGVneSIsIHBvc3RmaXgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGEgc3RhdGljIHZhbGlkYXRpb24gc3RyYXRlZ3kgbWFwcGluZw0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneVBhY2thZ2VOYW1lICsgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lICsgcG9zdGZpeDsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmOTQ4YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24gaW1wbGVtZW50cyBQcm9wZXJ0eUluZm9ybWF0aW9uCi17Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGluZm9ybWF0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhRW50cnk+IG1ldGFEYXRhTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFbnRyeT4oKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zSW5mb3JtYXRpb24oU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbk1hcC5jb250YWluc0tleShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbk1hcC5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpIGdldEluZm9ybWF0aW9uKGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaW5mb3JtYXRpb25NYXAucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRhRGF0YUVudHJ5W10gZ2V0TWV0YURhdGFFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtZXRhRGF0YUxpc3QudG9BcnJheShuZXcgTWV0YURhdGFFbnRyeVttZXRhRGF0YUxpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpCi0gICAgewotICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnRpZXModGhpcy5pbmZvcm1hdGlvbk1hcCk7Ci0gICAgICAgIHRoaXMubWV0YURhdGFMaXN0LmFkZChtZXRhRGF0YUVudHJ5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eURldGFpbHMuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTAzN2NmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5RGV0YWlscwotewotICAgIC8vZm9ybXMgdGhlIGlkIGZvciBjcm9zcy12YWxpZGF0aW9uIHdpdGhpbiBjb21wbGV4IGNvbXBvbmVudHMKLSAgICBwcml2YXRlIFN0cmluZyBrZXk7Ci0gICAgcHJpdmF0ZSBPYmplY3QgYmFzZU9iamVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eURldGFpbHMoU3RyaW5nIGtleSwgT2JqZWN0IGJhc2VPYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgICAgICB0aGlzLmJhc2VPYmplY3QgPSBiYXNlT2JqZWN0OwotICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRLZXkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmFzZU9iamVjdCgpCi0gICAgewotICAgICAgICByZXR1cm4gYmFzZU9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlT2JqZWN0KE9iamVjdCBiYXNlT2JqZWN0KQotICAgIHsKLSAgICAgICAgdGhpcy5iYXNlT2JqZWN0ID0gYmFzZU9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDE3M2U1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlJbmZvcm1hdGlvbgotewotICAgIGJvb2xlYW4gY29udGFpbnNJbmZvcm1hdGlvbihTdHJpbmcga2V5KTsKLSAgICBPYmplY3QgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSk7Ci0gICAgPFQ+IFQgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpOwotICAgIHZvaWQgc2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKTsKLQotICAgIE1ldGFEYXRhRW50cnlbXSBnZXRNZXRhRGF0YUVudHJpZXMoKTsKLSAgICB2b2lkIGFkZE1ldGFEYXRhRW50cnkoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGU5MjVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzCi17Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ERVRBSUxTID0gInByb3BlcnR5X2RldGFpbHMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9WQUxJREFUSU9OID0gInNraXBfdmFsaWRhdGlvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJsYWJlbCI7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZWNvcmRlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZWNvcmRlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MGYyM2YuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLQotLyoqCi0gKiBBbGxvd3MgdG8gY2FwdHVyZSBjb252ZXJ0ZWQgdmFsdWVzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyCi17Ci0gICAgdm9pZCByZWNvcmRVc2VySW5wdXQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0Fic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyNWE2OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5DbGFzc01hcHBpbmdGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLQotLyoqCi0gKiBCYXNlIGZvciBhbGwgUmVuZGVyS2l0V3JhcHBlckZhY3RvcmllcyB0byBmb3JjZSBhIHNwZWNpZmljIGJlaGF2aW91cgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFJlbmRlcktpdCwgUmVuZGVyS2l0PgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSB3cmFwcGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBkZWFjdGl2YXRlZCA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeShBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRoaXMud3JhcHBlZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLndyYXBwZWQuYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkocmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkZWFjdGl2YXRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5kZWFjdGl2YXRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWFjdGl2YXRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVhY3RpdmF0ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFJlbmRlcktpdCBjcmVhdGUoUmVuZGVyS2l0IHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIGlmKGlzRGVhY3RpdmF0ZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBSZW5kZXJLaXQgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBpZih0aGlzLndyYXBwZWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy53cmFwcGVkLmNyZWF0ZShyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVXcmFwcGVyKHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3ZTA1MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ci17Ci0gICAgcHJpdmF0ZSBSZW5kZXJLaXQgcmVuZGVyS2l0OwotCi0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCBjcmVhdGVXcmFwcGVyKFJlbmRlcktpdCByZW5kZXJLaXQpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVya2l0IHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcktpdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLnJlbmRlcktpdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnJlbmRlcktpdCA9IG5ldyBFeHRWYWxSZW5kZXJLaXQocmVuZGVyS2l0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJLaXQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxMYXp5UmVuZGVyZXJQcm94eS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbExhenlSZW5kZXJlclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNmFiZDIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbExhenlSZW5kZXJlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7DQotDQotLyoqDQotICogdG8gc3VwcG9ydCBhIGN1c3RvbSBwcm94eQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBFeHRWYWxMYXp5UmVuZGVyZXJQcm94eSBleHRlbmRzIFJlbmRlcmVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIFJlbmRlcmVyIHdyYXBwZWQ7DQotDQotICAgIHB1YmxpYyBFeHRWYWxMYXp5UmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyZXI7DQotDQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInNpbXBsZSBwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldExhenlSZW5kZXJlcigpLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQ0KLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBSZW5kZXJlciBnZXRMYXp5UmVuZGVyZXIoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcHJveHlDbGFzc05hbWUgPSAoU3RyaW5nKSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSk7DQotDQotICAgICAgICBpZihwcm94eUNsYXNzTmFtZSAhPSBudWxsICYmICFwcm94eUNsYXNzTmFtZS5lbmRzV2l0aChnZXRDbGFzcygpLmdldE5hbWUoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShwcm94eUNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYodGFyZ2V0Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImEgY3VzdG9tIGludmFsaWQgcmVuZGVyZXIgcHJveHkgaXMgY29uZmlndXJlZDogIiArIHByb3h5Q2xhc3NOYW1lKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgQ2xhc3NbXSBhcmdDbGFzc2VzID0gbmV3IENsYXNzWzFdOw0KLSAgICAgICAgICAgIGFyZ0NsYXNzZXNbMF0gPSBSZW5kZXJlci5jbGFzczsNCi0NCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGFyZ2V0Q2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJnQ2xhc3Nlcyk7DQotICAgICAgICAgICAgICAgIHJldHVybiAoUmVuZGVyZXIpY29uc3RydWN0b3IubmV3SW5zdGFuY2UodGhpcy53cmFwcGVkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGNyZWF0ZTogIiArIHRhcmdldENsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMzU0ZTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVN0cmVhbTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LlJlc3BvbnNlV3JpdGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZXNwb25zZVN0YXRlTWFuYWdlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcktpdCBleHRlbmRzIFJlbmRlcktpdAotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcktpdChSZW5kZXJLaXQgd3JhcHBlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlLCBSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIGlmIChyZW5kZXJlciBpbnN0YW5jZW9mIEV4dFZhbFJlbmRlcmVyV3JhcHBlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgcmVuZGVyZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgY3JlYXRlV3JhcHBlcihyZW5kZXJlcikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFJlbmRlcmVyIGdldFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUpCi0gICAgewotICAgICAgICBSZW5kZXJlciByZW5kZXJlciA9IHdyYXBwZWQuZ2V0UmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUpOwotCi0gICAgICAgIGlmKHJlbmRlcmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJlciBpbnN0YW5jZW9mIEV4dFZhbFJlbmRlcmVyV3JhcHBlciA/IHJlbmRlcmVyIDogY3JlYXRlV3JhcHBlcihyZW5kZXJlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oIm5vIHJlbmRlcmVyIGZvdW5kIGZvciBmYW1pbHkgIiArIGZhbWlseSArICIgYW5kIHR5cGUgIiArIHJlbmRlcmVyVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVuZGVyZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlU3RhdGVNYW5hZ2VyIGdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlV3JpdGVyIGNyZWF0ZVJlc3BvbnNlV3JpdGVyKFdyaXRlciB3cml0ZXIsIFN0cmluZyBzLCBTdHJpbmcgczEpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jcmVhdGVSZXNwb25zZVdyaXRlcih3cml0ZXIsIHMsIHMxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdHJlYW0gY3JlYXRlUmVzcG9uc2VTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmNyZWF0ZVJlc3BvbnNlU3RyZWFtKG91dHB1dFN0cmVhbSk7Ci0gICAgfQotCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkKLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgY3JlYXRlV3JhcHBlcihSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRXh0VmFsUmVuZGVyZXJXcmFwcGVyKHJlbmRlcmVyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0RmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI4MmJiYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIGNlbnRyYWwgbWVjaGFuaXNtIHdoaWNoIGlzIHJlc3BvbnNpYmxlIHRvIGNyZWF0ZSBhIHdyYXBwZXIgZm9yIGEgcmVuZGVyZXIgLSBzdGFydGluZyBwb2ludCBvZiBleHR2YWwuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJLaXRGYWN0b3J5IGV4dGVuZHMgUmVuZGVyS2l0RmFjdG9yeQotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0gICAgcHJpdmF0ZSBSZW5kZXJLaXRGYWN0b3J5IHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeShSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnkpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSByZW5kZXJLaXRGYWN0b3J5OwotCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyS2l0KFN0cmluZyBzLCBSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJLaXQocywgcmVuZGVyS2l0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVuZGVyS2l0IGdldFJlbmRlcktpdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIFJlbmRlcktpdCByZW5kZXJLaXQgPSB0aGlzLndyYXBwZWQuZ2V0UmVuZGVyS2l0KGZhY2VzQ29udGV4dCwgcyk7Ci0KLSAgICAgICAgLy9qc2YgcmkgKyB0cmluaWRhZAotICAgICAgICBpZihyZW5kZXJLaXQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHdyYXBwZXJGYWN0b3J5ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgLy9zb21lIGNvbXBvbmVudCBsaWJzIGUuZy4gbXlmYWNlcy10cmluaWRhZCBhcmVuJ3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgY2xlYW4gYXBwcm9hY2gKLSAgICAgICAgLy9leGFtcGxlIHNlZSBUcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lcgotICAgICAgICBpZih3cmFwcGVyRmFjdG9yeS5pc0RlYWN0aXZhdGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJLaXQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gd3JhcHBlckZhY3RvcnkuY3JlYXRlKHJlbmRlcktpdCk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gZ2V0UmVuZGVyS2l0SWRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlbmRlcktpdElkcygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlclByb3h5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg0OTk0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiB0byBhdm9pZCBtdWx0aXBsZSBjYWxscyBvZiByZW5kZXJlciBtZXRob2RzIHdpdGhpbiByZW5kZXJlciBpbnRlcmNlcHRvcnMgKGUuZy4gZm9yIGVuY29kZSwgZGVjb2RlLC4uLikKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcmVyUHJveHkgZXh0ZW5kcyBSZW5kZXJlcgotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9IEV4dFZhbFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpICsgIjpLRVkiOwotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0gICAgCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHJlbmRlcmVyOwotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInByb3h5IGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5RW50cnkgZW50cnkgPSBnZXRPckluaXRFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRGVjb2RlQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldERlY29kZUNhbGxlZCh0cnVlKTsKLSAgICAgICAgICAgIHdyYXBwZWQuZGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkb3VibGUgY2FsbCBvZiBtZXRob2QgJ2RlY29kZScgZmlsdGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlFbnRyeSBlbnRyeSA9IGdldE9ySW5pdEVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNFbmNvZGVCZWdpbkNhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXRFbmNvZGVCZWdpbkNhbGxlZCh0cnVlKTsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImRvdWJsZSBjYWxsIG9mIG1ldGhvZCAnZW5jb2RlQmVnaW4nIGZpbHRlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5RW50cnkgZW50cnkgPSBnZXRPckluaXRFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRW5jb2RlQ2hpbGRyZW5DYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RW5jb2RlQ2hpbGRyZW5DYWxsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkb3VibGUgY2FsbCBvZiBtZXRob2QgJ2VuY29kZUNoaWxkcmVuJyBmaWx0ZXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlFbnRyeSBlbnRyeSA9IGdldE9ySW5pdEVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNFbmNvZGVFbmRDYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RW5jb2RlRW5kQ2FsbGVkKHRydWUpOwotICAgICAgICAgICAgd3JhcHBlZC5lbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImRvdWJsZSBjYWxsIG9mIG1ldGhvZCAnZW5jb2RlRW5kJyBmaWx0ZXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0Q2xpZW50SWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jb252ZXJ0Q2xpZW50SWQoZmFjZXNDb250ZXh0LCBzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlFbnRyeSBlbnRyeSA9IGdldE9ySW5pdEVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmIChlbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldENvbnZlcnRlZFZhbHVlKHdyYXBwZWQuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbykpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkb3VibGUgY2FsbCBvZiBtZXRob2QgJ2dldENvbnZlcnRlZFZhbHVlJyBmaWx0ZXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVuZGVyZXJQcm94eUVudHJ5IGdldE9ySW5pdEVudHJ5KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgU3RyaW5nIGtleSA9IHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAga2V5ICs9IGdldE9wdGlvbmFsS2V5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZ2V0T3JJbml0Q29tcG9uZW50UHJveHlNYXBwaW5nKCkuY29udGFpbnNLZXkoa2V5KSkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0T3JJbml0Q29tcG9uZW50UHJveHlNYXBwaW5nKCkucHV0KGtleSwgbmV3IFJlbmRlcmVyUHJveHlFbnRyeSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0T3JJbml0Q29tcG9uZW50UHJveHlNYXBwaW5nKCkuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcHRpb25hbEtleShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfU1RPUkFHRV9OQU1FID0gRXh0VmFsUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCkgKyAiOlNUT1JBR0UiOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5RW50cnk+IGdldE9ySW5pdENvbXBvbmVudFByb3h5TWFwcGluZygpCi0gICAgewotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7Ci0KLSAgICAgICAgaWYoIXJlcXVlc3RNYXAuY29udGFpbnNLZXkoUFJPWFlfU1RPUkFHRV9OQU1FKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVxdWVzdE1hcC5wdXQoUFJPWFlfU1RPUkFHRV9OQU1FLCBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlFbnRyeT4+KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eUVudHJ5Pj4gcHJveHlTdG9yYWdlID0KLSAgICAgICAgICAgICgoTWFwPFN0cmluZywgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eUVudHJ5Pj4pcmVxdWVzdE1hcC5nZXQoUFJPWFlfU1RPUkFHRV9OQU1FKSk7Ci0KLSAgICAgICAgU3RyaW5nIGtleSA9IHRoaXMud3JhcHBlZC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQotICAgICAgICBpZighcHJveHlTdG9yYWdlLmNvbnRhaW5zS2V5KGtleSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3h5U3RvcmFnZS5wdXQoa2V5LCBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlFbnRyeT4oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJveHlTdG9yYWdlLmdldChrZXkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjMzA1ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUmVuZGVyZXJJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLQotLyoqCi0gKiBEZWZhdWx0IGFwcHJvYWNoIHRvIGF2b2lkIHByb3hpZXMgZm9yIGNvbnZlcnRlcnMgYW5kIHRoZSBhZGFwdGVyIGZhbGxiYWNrLgotICogSXQgcmVxdWlyZXMgdGhhdCBjb21wb25lbnRzIGRlbGVnYXRlIGdldENvbnZlcnRlZFZhbHVlIHRvIGEgcmVuZGVyZXIuPGJyLz4KLSAqIElmIGl0IGlzbid0IHRoZSBjYXNlIGZvciB5b3VyIGNvbXBvbmVudCBsaWIgdXNlOgotICogb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHkuRXh0VmFsQXBwbGljYXRpb25GYWN0b3J5PGJyLz4KLSAqIGFuZDxici8+Ci0gKiBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5Qcm94eU1hcHBpbmdQaGFzZUxpc3RlbmVyCi0gKiA8cC8+Ci0gKiBUaGlzIHdyYXBwZXIgd2lsbCBhbHNvIGltcGxlbWVudCBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIGJlaGF2aW91cgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyZXJXcmFwcGVyIGV4dGVuZHMgUmVuZGVyZXIKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIHdyYXBwZWQ7Ci0gICAgcHJvdGVjdGVkIEV4dFZhbENvbnRleHQgZXh0VmFsQ29udGV4dCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcmVyV3JhcHBlcihSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwcm94eUNsYXNzTmFtZSA9IChTdHJpbmcpRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVkpOwotCi0gICAgICAgIGlmKHByb3h5Q2xhc3NOYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNvbmZpZ3VyZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gbmV3IEV4dFZhbExhenlSZW5kZXJlclByb3h5KHJlbmRlcmVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUocHJveHlDbGFzc05hbWUpOwotCi0gICAgICAgIGlmKHRhcmdldENsYXNzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNvbmZpZ3VyZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gbmV3IEV4dFZhbExhenlSZW5kZXJlclByb3h5KHJlbmRlcmVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzW10gYXJnQ2xhc3NlcyA9IG5ldyBDbGFzc1sxXTsKLSAgICAgICAgYXJnQ2xhc3Nlc1swXSA9IFJlbmRlcmVyLmNsYXNzOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHRhcmdldENsYXNzLmdldENvbnN0cnVjdG9yKGFyZ0NsYXNzZXMpOwotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gKFJlbmRlcmVyKWNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHJlbmRlcmVyKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm5vIGV4dHZhbCByZW5kZXJlciBwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0dmFsIHJlbmRlcmVyIHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZURlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZURlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZGVjb2RlIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZURlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZURlY29kZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckRlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJEZWNvZGUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSB0cnVlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJlbmNvZGVCZWdpbiBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVCZWdpbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVCZWdpbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUNoaWxkcmVuIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImVuY29kZUNoaWxkcmVuIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUNoaWxkcmVuIG9mICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVDaGlsZHJlbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUNoaWxkcmVuIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZW5jb2RlRW5kIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVFbmQgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5lbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJFbmNvZGVFbmQgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlRW5kIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBjb252ZXJ0Q2xpZW50SWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jb252ZXJ0Q2xpZW50SWQoZmFjZXNDb250ZXh0LCBzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0gICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8sIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QgPSBlLmdldFJldHVyblZhbHVlT25FeGNlcHRpb24oY29udmVydGVkT2JqZWN0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJnZXRDb252ZXJ0ZWRWYWx1ZSBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlR2V0Q29udmVydGVkVmFsdWUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgY29udmVydGVkT2JqZWN0ID0gd3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyR2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbywgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRPYmplY3Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L1JlbmRlcmVyUHJveHlFbnRyeS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L1JlbmRlcmVyUHJveHlFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTYzOTEwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9SZW5kZXJlclByb3h5RW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgUmVuZGVyZXJQcm94eUVudHJ5DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGVjb2RlQ2FsbGVkID0gZmFsc2U7DQotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVCZWdpbkNhbGxlZCA9IGZhbHNlOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGVuY29kZUVuZENhbGxlZCA9IGZhbHNlOw0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBjb252ZXJ0ZWRWYWx1ZSA9IG51bGw7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVjb2RlQ2FsbGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRlY29kZUNhbGxlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWNvZGVDYWxsZWQoYm9vbGVhbiBkZWNvZGVDYWxsZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGVjb2RlQ2FsbGVkID0gZGVjb2RlQ2FsbGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlQmVnaW5DYWxsZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW5jb2RlQmVnaW5DYWxsZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlQmVnaW5DYWxsZWQoYm9vbGVhbiBlbmNvZGVCZWdpbkNhbGxlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5lbmNvZGVCZWdpbkNhbGxlZCA9IGVuY29kZUJlZ2luQ2FsbGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlQ2hpbGRyZW5DYWxsZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlQ2hpbGRyZW5DYWxsZWQoYm9vbGVhbiBlbmNvZGVDaGlsZHJlbkNhbGxlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5lbmNvZGVDaGlsZHJlbkNhbGxlZCA9IGVuY29kZUNoaWxkcmVuQ2FsbGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlRW5kQ2FsbGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVuY29kZUVuZENhbGxlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVFbmRDYWxsZWQoYm9vbGVhbiBlbmNvZGVFbmRDYWxsZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZW5jb2RlRW5kQ2FsbGVkID0gZW5jb2RlRW5kQ2FsbGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkVmFsdWUoT2JqZWN0IGNvbnZlcnRlZFZhbHVlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbnZlcnRlZFZhbHVlID0gY29udmVydGVkVmFsdWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZmZkNDYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMDk0MGEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4MGZmYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXJJbnRlcmNlcHRvciBleGNlcHRpb25Tb3VyY2U7Ci0gICAgcHJvdGVjdGVkIE9iamVjdCBpbmZvcm1hdGlvbjsKLSAgICBib29sZWFuIHNraXBPdGhlckludGVyY2VwdG9ycyA9IGZhbHNlOwotCi0gICAgcHVibGljIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbihib29sZWFuIHNraXBPdGhlckludGVyY2VwdG9ycykKLSAgICB7Ci0gICAgICAgIHRoaXMuc2tpcE90aGVySW50ZXJjZXB0b3JzID0gc2tpcE90aGVySW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzLCBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzKHNraXBPdGhlckludGVyY2VwdG9ycyk7Ci0gICAgICAgIHRoaXMuZXhjZXB0aW9uU291cmNlID0gcmVuZGVyZXJJbnRlcmNlcHRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvbihPYmplY3QgaW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICB0aGlzLmluZm9ybWF0aW9uID0gaW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gaW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNraXBPdGhlckludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJldHVyblZhbHVlT25FeGNlcHRpb24oT2JqZWN0IGN1cnJlbnRSZXR1cm5WYWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMuZXhjZXB0aW9uU291cmNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmV4Y2VwdGlvblNvdXJjZS5nZXRSZXR1cm5WYWx1ZU9uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbih0aGlzLCBjdXJyZW50UmV0dXJuVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjdXJyZW50UmV0dXJuVmFsdWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2I3YWJhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIGV4ZWN1dGUgbG9naWMganVzdCBvbmNlLg0KLSAqIGUuZy4gcmVnaXN0ZXIgYXJ0aWZhY3RzIHZpYSBhcGkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgLy9kb24ndCByZW1vdmUgLSBpdCdzIGEgZmFsbGJhY2sgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggZGVyZWdpc3RyYXRpb24NCi0gICAgLy90YXJnZXQ6IGRvbid0IHByb2Nlc3MgaW5pdCBsb2dpYyBtb3JlIHRoYW4gb25jZQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENsYXNzPiBpbml0aWFsaXplZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICAgICAgc3luY2hyb25pemVkIChBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5jbGFzcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIWluaXRpYWxpemVkTGlzdGVuZXJzLmNvbnRhaW5zKGdldENsYXNzKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oInN0YXJ0IGluaXQgb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluaXQoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImluaXQgb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBKc2ZVdGlscy5kZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcih0aGlzKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBkZXJlZ2lzdGVyaW5nIHRoZSBwaGFzZS1saXN0ZW5lciINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtPiB0aGVyZSBpcyBqdXN0IGEgbGl0dGxlIG92ZXJoZWFkLCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBidXQgZXZlcnl0aGluZyBlbHNlIHdvcmtzIGNvcnJlY3RseS4iDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaG93ZXZlciwgcGxlYXNlIGluZm9ybSB0aGUgY29tbXVuaXR5IGFib3V0IHlvdXIgY29uZmlndXJhdGlvbiIsIHQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWRMaXN0ZW5lcnMuYWRkKGdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5SRVNUT1JFX1ZJRVc7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdCgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0V4dFZhbFN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9FeHRWYWxTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhYTcyNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0V4dFZhbFN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIKLXsKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydGluZyB1cCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIHYiICsgRXh0VmFsSW5mb3JtYXRpb24uVkVSU0lPTik7Ci0gICAgICAgIH0KLQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsKLQotICAgICAgICBleGVjdXRlQ3VzdG9tU3RhcnR1cExpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVDdXN0b21TdGFydHVwTGlzdGVuZXIoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkKLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVksIEV4dFZhbFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpLCBmYWxzZSk7Ci0KLSAgICAgICAgU3RyaW5nIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lck5hbWUgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVJUVVBfTElTVEVORVIpOwotICAgICAgICBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lciBjdXN0b21TdGFydHVwTGlzdGVuZXIgPQotICAgICAgICAgICAgKEFic3RyYWN0U3RhcnR1cExpc3RlbmVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjdXN0b21TdGFydHVwTGlzdGVuZXJOYW1lKTsKLQotICAgICAgICBpZihjdXN0b21TdGFydHVwTGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnQgaW5pdCBvZiAiICsgY3VzdG9tU3RhcnR1cExpc3RlbmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3VzdG9tU3RhcnR1cExpc3RlbmVyLmluaXQoKTsKLQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiaW5pdCBvZiAiICsgY3VzdG9tU3RhcnR1cExpc3RlbmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjODA1Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOw0KLQ0KLS8qKg0KLSAqIE1lc3NhZ2VSZXNvbHZlciB3aGljaCB1c2VzIHByb3BlcnR5IGZpbGVzLg0KLSAqIFN1YmNsYXNzZXMganVzdCBoYXZlIHRvIHByb3ZpZGUgdGhlIHBhY2thZ2UgdG8gbG9vayBhdC4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBjYW4gYWxzbyBwcm92aWRlIGEgY3VzdG9tIG5hbWUgd2hpY2ggaXMgZS5nLiBjb25maWd1cmVkIHZpYSB3ZWIueG1sLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgaW1wbGVtZW50cyBNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSID0gIj8/PyI7DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb24gPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT047DQotICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGRlZmF1bHRCdW5kbGUgPSBudWxsOw0KLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlQnVuZGxlQmFzZU5hbWU7DQotICAgIC8vd2l0aCBqc2YgMS4xIG9ubHkgYXZhaWxhYmxlIGlmIHRoZXJlIGlzIGEgY3VzdG9tIGJlYW4NCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZUJ1bmRsZVZhck5hbWU7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIGlmIChrZXkgPT0gbnVsbCB8fCBrZXkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjdXN0b21NZXNzYWdlID0gbnVsbDsNCi0NCi0gICAgICAgIC8vb25seSBpbiBjYXNlIG9mIGEgVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIHdoaWNoIGlzIGNvbmZpZ3VyZWQgYXMgYmVhbg0KLSAgICAgICAgaWYgKHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUodGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUsIGxvY2FsZSk7DQotICAgICAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJtZXNzYWdlIGJ1bmRsZSAiICsgdGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUgKyAiIG5vdCBmb3VuZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9vbmx5IGluIGNhc2Ugb2YgYSBWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggaXMgY29uZmlndXJlZCBhcyBiZWFuDQotICAgICAgICBpZiAodGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSAhPSBudWxsICYmIGN1c3RvbU1lc3NhZ2UgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IChSZXNvdXJjZUJ1bmRsZSkgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKG1lc3NhZ2VCdW5kbGVWYXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm1lc3NhZ2UgYnVuZGxlIHZhciBuYW1lICIgKyB0aGlzLm1lc3NhZ2VCdW5kbGVWYXJOYW1lICsgIiBub3QgZm91bmQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChjdXN0b21NZXNzYWdlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2U7DQotICAgICAgICB9DQotDQotICAgICAgICAvKg0KLSAgICAgICAgICogdHJ5IHRvIHVzZSB0aGUgY29udmVudGlvbiBmb3IgdGhlIG1lc3NhZ2UgYnVuZGxlDQotICAgICAgICAgKi8NCi0gICAgICAgIGN1c3RvbU1lc3NhZ2UgPSB0cnlUb1VzZU1lc3NhZ2VCdW5kbGVDb252ZW50aW9uKGtleSwgbG9jYWxlKTsNCi0NCi0gICAgICAgIGlmIChjdXN0b21NZXNzYWdlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2U7DQotICAgICAgICB9DQotDQotICAgICAgICAvKg0KLSAgICAgICAgICogbm8gbWVzc2FnZSBidW5kbGUgb3IgbWVzc2FnZSBmb3VuZCAod2l0aCB0aGUgY29udmVudGlvbik/DQotICAgICAgICAgKi8NCi0NCi0gICAgICAgIC8vdHJ5IHRvIGxvYWQgY3VzdG9tIG1lc3NhZ2VzDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShnZXRDdXN0b21CYXNlTmFtZSgpLCBsb2NhbGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gY3VzdG9tIG1lc3NhZ2UgZm9yICIgKyBrZXkgKyAiIHdpdGhpbiAiICsgZ2V0Q3VzdG9tQmFzZU5hbWUoKSwgZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvL3VzZSBjdXN0b20gbmFtZSAoaWYgcG9zc2libGUpIG90aGVyd2lzZTogZmFsbGJhY2sgdG8gZGVmYXVsdCBtZXNzYWdlIChpZiBwb3NzaWJsZSkNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoY3VzdG9tTWVzc2FnZSAhPSBudWxsKSA/IGN1c3RvbU1lc3NhZ2UNCi0gICAgICAgICAgICAgICAgOiAoZ2V0QmFzZU5hbWUoKSAhPSBudWxsKSA/IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShnZXRCYXNlTmFtZSgpLCBsb2NhbGUpLmdldFN0cmluZyhrZXkpIDogbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIgKyBrZXkgKyBNSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb1VzZU1lc3NhZ2VCdW5kbGVDb252ZW50aW9uKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjdXN0b21NZXNzYWdlID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICgoZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID09IG51bGwgfHwgIWRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICAgICAgJiYgaXNEZWZhdWx0TWVzc2FnZUJ1bmRsZUNvbnZlbnRpb25BY3RpdmUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZGVmYXVsdEJ1bmRsZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9CVU5ETEVfTkFNRSksIGxvY2FsZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgICAgICAgICAgICAgICAgIGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbiA9ICJ0cnVlIjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoZGVmYXVsdEJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSBkZWZhdWx0QnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nDQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlZmF1bHRNZXNzYWdlQnVuZGxlQ29udmVudGlvbkFjdGl2ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0QmFzZU5hbWUoKTsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21CYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VCdW5kbGVCYXNlTmFtZShTdHJpbmcgbWVzc2FnZUJ1bmRsZUJhc2VOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSA9IG1lc3NhZ2VCdW5kbGVCYXNlTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlQnVuZGxlVmFyTmFtZShTdHJpbmcgbWVzc2FnZUJ1bmRsZVZhck5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZUJ1bmRsZVZhck5hbWUgPSBtZXNzYWdlQnVuZGxlVmFyTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjgxMGFjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuDQotICAgICAgICByZXNvbHZlci5tYXBwZXIuQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuDQotICAgICAgICByZXNvbHZlci5tYXBwZXIuQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuDQotICAgICAgICByZXNvbHZlci5tYXBwZXIuRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuDQotICAgICAgICByZXNvbHZlci5tYXBwZXIuRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuDQotICAgICAgICByZXNvbHZlci5tYXBwZXIuU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBGYWN0b3J5IHdoaWNoIGNyZWF0ZXMgYSBNZXNzYWdlUmVzb2x2ZXIgZm9yIGEgZ2l2ZW4gVmFsaWRhdGlvblN0cmF0ZWd5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdlbmVyaWMgamF2YSBhcGkgKGRlLS9yZWdpc3RlciBtYXBwaW5nKSIpDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkgaW1wbGVtZW50cw0KLSAgICBDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWVzc2FnZVJlc29sdmVyPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmc7DQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBuYW1lTWFwcGVyTGlzdCA9DQotICAgICAgICBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0NCi0gICAgc3RhdGljDQotICAgIHsNCi0gICAgICAgIG5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIG5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlUmVzb2x2ZXIgY3JlYXRlKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHN0cmF0ZWd5TmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChNZXNzYWdlUmVzb2x2ZXIpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmdldChzdHJhdGVneU5hbWUpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICBTdHJpbmcgcmVzb2x2ZXJOYW1lOw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vYnVpbGQgY29udmVudGlvbiAoVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKQ0KLSAgICAgICAgICAgIHJlc29sdmVyTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIC8vbmFtZSB3YXNuJ3QgbWFwcGVkDQotICAgICAgICAgICAgaWYgKHJlc29sdmVyTmFtZSA9PSBudWxsIHx8IHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMocmVzb2x2ZXJOYW1lKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtZXNzYWdlUmVzb2x2ZXIgPSAoTWVzc2FnZVJlc29sdmVyKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUocmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWVzc2FnZVJlc29sdmVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKHN0cmF0ZWd5TmFtZSwgcmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZXNvbHZlck5hbWUgKyAiIHVzZWQgZm9yICIgKyBzdHJhdGVneU5hbWUpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYWRkTWFwcGluZyhzdHJhdGVneU5hbWUsIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0U3RhdGljTWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKERlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgOg0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9DT05GSUcpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBTdHJhdGVneU1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZyxTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWFwcGluZy5nZXRTb3VyY2UoKSwgbWFwcGluZy5nZXRUYXJnZXQoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgU3RyaW5nIG1lc3NhZ2VSZXNvbHZlck5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkaW5nIHN0YXRpYyB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1lc3NhZ2UgcmVzb2x2ZXIgbWFwcGluZzogIg0KLSAgICAgICAgICAgICAgICArIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgKyAiIC0+ICIgKyBtZXNzYWdlUmVzb2x2ZXJOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHN5bmNocm9uaXplZCAoRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuY2xhc3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLnB1dCh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBtZXNzYWdlUmVzb2x2ZXJOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FhOTcxZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogRGVmYXVsdCBNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggdXNlcyB0aGUgZGVmYXVsdCBjb252ZW50aW9uIGZvciB0aGUgbWVzc2FnZSBidW5kbGUuDQotICogSXQncyBwb3NzaWJsZSB0byBwcm92aWRlIGEgY3VzdG9tIG1lc3NhZ2UgYnVuZGxlIHZpYSB3ZWIueG1sDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQlVORExFID0gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVNTQUdFX0JVTkRMRTsNCi0NCi0gICAgLy9ub3QgdXNlZCBhdCB0aGUgbW9tZW50IC0ganVzdCBmb3IgYSBjb252ZW50aW9uDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TW9kdWxlTWVzc2FnZUJ1bmRsZU5hbWUoZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENVU1RPTV9CVU5ETEU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL01lc3NhZ2VSZXNvbHZlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL01lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzRmODYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSBmb3IgTWVzc2FnZVJlc29sdmVycyBpbmRlcGVuZGVudCBvZiB0aGUgbWVzc2FnZSBzb3VyY2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NGM0ZDYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NzQwMWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1lc3NhZ2VSZXNvbHZlcnMuDQotICogKGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzcyMDM1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVneSB0byBNZXNzYWdlUmVzb2x2ZXIuDQotICogKGNvbmZpZ3VyZWQgdmlhIGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pDQotICogVGhlIGJlYW4gcHJvdmlkZXMgdGhlIGRlZmF1bHQgbmFtZSAoY29udmVudGlvbikuDQotICogSXQncyBwb3NzaWJsZSB0byBwcm92aWRlIGEgY3VzdG9tIGZ1bGwgcXVhbGlmaWVkIG5hbWUuICg9IGN1c3RvbWl6YWJsZSBjb252ZW50aW9uKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01TR19SRVNPTFZFUl9OQU1FX01BUFBFUik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZGY0MmIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSW4gb3JkZXIgdG8gcHJvdmlkZSBhIE5hbWVNYXBwZXIgcGVyIHZhbGlkYXRpb24gbW9kdWxlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNWMxMTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFwcyBFeHRWYWwgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gRXh0VmFsIE1lc3NhZ2VSZXNvbHZlcnMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1lc3NhZ2VSZXNvbHZlckNsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgc3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUoc3RyYXRlZ3lDbGFzc05hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI2MDZmNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciB0byBwbGFjZSBWYWxpZGF0aW9uU3RyYXRlZ2llcyBhbmQgTWVzc2FnZVJlc29sdmVycyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VzdG9tUG9zdGZpeCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYKTsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoc3RyYXRlZ3lDbGFzc05hbWUsIGN1c3RvbVBvc3RmaXgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGRlYWJmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBQcm92aWRlcyB0aGUgYWJpbGl0eSBvZiBtZXNzYWdlIHJlc29sdmluZyB0byBWYWxpZGF0aW9uU3RyYXRlZ2llcwotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LlJFVVNFfSkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQotewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYID0gIl9kZXRhaWwiOwotICAgIC8vZS5nLiBmb3IgaW5qZWN0aW5nIGEgbWVzc2FnZSByZXNvbHZlciB2aWEgc3ByaW5nCi0gICAgcHJpdmF0ZSBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgTG9jYWxlIGxvY2FsZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpOwotCi0gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VSZXNvbHZlciAhPSBudWxsID8gdGhpcy5tZXNzYWdlUmVzb2x2ZXIuZ2V0TWVzc2FnZShrZXksIGxvY2FsZSkgOgotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHRoaXMpLmdldE1lc3NhZ2Uoa2V5LCBsb2NhbGUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShBbm5vdGF0aW9uIGFubm90YXRpb24pCi0gICAgewotICAgICAgICByZXR1cm4gcmVzb2x2ZU1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24pCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiAoa2V5ICE9IG51bGwpID8gcmVzb2x2ZU1lc3NhZ2Uoa2V5ICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgpIDogbnVsbDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbikgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBGYWNlc01lc3NhZ2UgZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNYXNzYWdlKEFubm90YXRpb24gYW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwKLSAgICAgICAgICAgIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiksIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VSZXNvbHZlcihNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyKQotICAgIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlUmVzb2x2ZXIgPSBtZXNzYWdlUmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pCi0gICAgewotICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMLCBnZXRMYWJlbChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5KSk7Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbik7Ci0gICAgfQotCi0gICAgLy9mb3IgY3VzdG9tIGFubm90YXRpb25zIC0gb3ZlcnJpZGUgaWYgbmVlZGVkCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODk0NmIxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIFByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIHVzZSBWYWxpZGF0b3JFeGNlcHRpb24gKGFzIGV4cGVjdGVkIGJ5IHRoZSB1c2VyKSBpbnN0ZWFkIG9mIENvbnZlcnRlckV4Y2VwdGlvbi4NCi0gKiBGdXJ0aGVybW9yZSBpdCBwcm92aWRlczo8YnIvPg0KLSAqIGluaXRWYWxpZGF0aW9uPGJyLz4NCi0gKiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBpbml0VmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW5pdFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiaW5pdFZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHByb2Nlc3NWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByb2Nlc3NWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInByb2Nlc3NWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVmFsaWRhdG9yRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAocHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgZSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGdldENsYXNzKCkuZ2V0TmFtZSgpICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiOiB0aHJvdyBvcmlnaW5hbCBleGNlcHRpb24gYWZ0ZXIgcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbnZlcnRlckV4Y2VwdGlvbihlLmdldEZhY2VzTWVzc2FnZSgpLCBlKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgIjogb3JpZ2luYWwgZXhjZXB0aW9uIGFmdGVyIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbiwgdGhpcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjVkYzRlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0NCi0gKiBhZGFwdGVyIHRvIGNvbm5lY3QgdmFsaWRhdGlvbiBzdHJhdGVnaWVzIHdpdGggbWV0YS1kYXRhIHRyYW5zZm9ybWVycywNCi0gKiBpZiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBkZWZpbmVkIGFzIGJlYW4gYW5kIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBpbnRlcmZhY2UgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIgZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIC8vdG8gZ2V0IGJhY2sgdGhlIGludGVybmFsIGNhc2hpbmcNCi0gICAgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpOw0KLQ0KLSAgICBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1Y2I2My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLkJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotDQotICogYWRhcHRlciB0byBjb25uZWN0IHZhbGlkYXRpb24gc3RyYXRlZ2llcyB3aXRoIG1ldGEtZGF0YSB0cmFuc2Zvcm1lcnMsDQotICogaWYgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgZGVmaW5lZCBhcyBiZWFuIGFuZCBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIC8vb3B0aW9uYWwgZmFsbGJhY2sgZm9yIGludGVybmFsIGNhc2hpbmcNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOw0KLQ0KLSAgICBwdWJsaWMgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyIGluc3RhbmNlb2YgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIpIG1ldGFEYXRhVHJhbnNmb3JtZXIgKS5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGdldE1ldGFEYXRhVHJhbnNmb3JtZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVRyYW5zZm9ybWVyKE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyID0gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsaWRhdGlvblN0cmF0ZWd5ID0gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOGEzZTYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcg0KLSAgICAuQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyDQotICAgIC5DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXINCi0gICAgLkN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcg0KLSAgICAuRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyDQotICAgIC5TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi0NCi0NCi0vKioNCi0gKiBGYWN0b3J5IHdoaWNoIGNyZWF0ZXMgdGhlIFZhbGlkYXRpb25TdHJhdGVneSBmb3IgYSBnaXZlbiBNZXRhLURhdGEgS2V5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdlbmVyaWMgamF2YSBhcGkgKGRlLS9yZWdpc3RlciBtYXBwaW5nKSIpDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFN0cmluZywgVmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9IG51bGw7DQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8TmFtZU1hcHBlcjxTdHJpbmc+PiBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckxpc3QgPQ0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+KCk7DQotDQotICAgIHN0YXRpYw0KLSAgICB7DQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsNCi0gICAgICAgIG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7DQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsNCi0gICAgICAgIG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyTGlzdC5hZGQobmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIG5ldyBEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7DQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckxpc3QuYWRkKG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBuZXcgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGNyZWF0ZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIGlmIChtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRTdGF0aWNNYXBwaW5ncygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nLmNvbnRhaW5zS2V5KG1ldGFEYXRhS2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5SW5zdGFuY2UobWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcuZ2V0KG1ldGFEYXRhS2V5KSk7DQotICAgICAgICB9DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgU3RyaW5nIHN0cmF0ZWd5TmFtZTsNCi0gICAgICAgIC8vbnVsbCAtPiB1c2UgbmFtZSBtYXBwZXJzDQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8U3RyaW5nPiBuYW1lTWFwcGVyIDogbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0cmF0ZWd5TmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZShtZXRhRGF0YUtleSk7DQotDQotICAgICAgICAgICAgaWYgKHN0cmF0ZWd5TmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKHN0cmF0ZWd5TmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyhtZXRhRGF0YUtleSwgc3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lJbnN0YW5jZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUNCi0gICAgICAgICAgICAuc3RhcnRzV2l0aChBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5QUkVGSVhfRk9SX0JFQU5fTUFQUElORykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbih2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLlBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HLmxlbmd0aCgpKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBtZXRhRGF0YUtleSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkaW5nIG1ldGEtZGF0YSBrZXkgdG8gdmFsaWRhdGlvbiBzdHJhdGVneSBtYXBwaW5nOiAiDQotICAgICAgICAgICAgICAgICsgbWV0YURhdGFLZXkgKyAiIC0+ICIgKyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHN5bmNocm9uaXplZCAoRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuY2xhc3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcucHV0KG1ldGFEYXRhS2V5LCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgdm9pZCBpbml0U3RhdGljTWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotDQotICAgICAgICAgICAgLy9zZXR1cCBpbnRlcm5hbCBzdGF0aWMgbWFwcGluZ3MNCi0gICAgICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnID0gbmV3IFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgICAgIC8vdHJ5IHRvIHNldHVwIG1hcHBpbmcgd2l0aCBiYXNlIG5hbWUgYnkgY29udmVudGlvbiAtIG92ZXJyaWRlcyBkZWZhdWx0IG1hcHBpbmcNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vYnVpbGQgY29udmVudGlvbiAoc3RyYXRlZ3kgbWFwcGluZykNCi0gICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZyhFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVRJQ19TVFJBVEVHWV9NQVBQSU5HX1NPVVJDRSkpOw0KLQ0KLSAgICAgICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vc2V0dXAgY3VzdG9tIG1hcHBpbmcgLSBvdmVycmlkZXMgYWxsIG90aGVyIG1hcHBpbmdzDQotICAgICAgICAgICAgU3RyaW5nIGN1c3RvbU1hcHBpbmdCYXNlTmFtZSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORzsNCi0gICAgICAgICAgICBpZiAoY3VzdG9tTWFwcGluZ0Jhc2VOYW1lICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnID0gbmV3IFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZyhjdXN0b21NYXBwaW5nQmFzZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBTdHJhdGVneU1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZyxTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWFwcGluZy5nZXRTb3VyY2UoKSwgbWFwcGluZy5nZXRUYXJnZXQoKSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NTUyM2QuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBCYXNlIGludGVyZmFjZSBmb3IgVmFsaWRhdGlvblN0cmF0ZWdpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLS8vKlZhbGlkYXRpb25TdHJhdGVneSBpbnN0ZWFkIG9mICpWYWxpZGF0b3IgdG8gYXZvaWQgbmFtaW5nIGNvbmZ1c2lvbiANCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9BYnN0cmFjdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fic3RyYWN0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjUyZDQ5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fic3RyYWN0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3RBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYTNiNjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIE5hbWUgTWFwcGVyIHdoaWNoIGRlbGVnYXRlcyB0aGUgbmFtZSBtYXBwaW5nLCBleHRyYWN0IHRoZSBuYW1lIGFuZCBjb252ZXJ0IGl0IHRvIGEgYmVhbiBuYW1lICsgcHJlZml4DQotICogdGFyZ2V0OiBjb25maWd1cmUgYSB2YWxpZGF0aW9uIHN0cmF0ZWd5IHZpYSBhIG1hbmFnZWQgYmVhbiBmYWNpbGl0eSAtPiBhbGxvd3MgdG8gaW5qZWN0IG90aGVyIGJlYW5zDQotICogaW5zdGVhZCBvZiBhcGkgY2FsbHMgKyBoYXJkY29kZWQgYmVhbiBuYW1lcw0KLSAqIDxwLz4NCi0gKiBhbGxvd2VkIGJlYW4gc2NvcGVzOg0KLSAqIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIHN0YXRlbGVzczogYXBwbGljYXRpb24vc2luZ2xldG9uDQotICogdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgc3RhdGVmdWw6IG5vbmUvcHJvdG90eXBlDQotICogZG9uJ3QgdXNlIHRoZSBzZXNzaW9uIG9yIGEgY29udmVyc2F0aW9uIHNjb3BlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0ZPUl9CRUFOX01BUFBJTkcgPSAiYmVhbjoiOw0KLSAgICBwcml2YXRlIE5hbWVNYXBwZXI8U3RyaW5nPiB3cmFwcGVkOw0KLQ0KLSAgICBwdWJsaWMgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoTmFtZU1hcHBlcjxTdHJpbmc+IG5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IG5hbWVNYXBwZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuYW1lID0gd3JhcHBlZC5jcmVhdGVOYW1lKHNvdXJjZSk7DQotDQotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOw0KLSAgICAgICAgcmV0dXJuIFBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HICsgbmFtZS5zdWJzdHJpbmcoMCwgMSkudG9Mb3dlckNhc2UoKSArIG5hbWUuc3Vic3RyaW5nKDEpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmUxZjZlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBBbm5vdGF0aW9ucyB0byBWYWxpZGF0aW9uU3RyYXRlZ2llcy4NCi0gKiAoY29uZmlndXJlZCB2aWEgd2ViLnhtbCkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjhkZGZhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIEFubm90YXRpb25zIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOGRmNTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFwcyBFeHRWYWwgQW5ub3RhdGlvbnMgdG8gRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUobWV0YURhdGFLZXkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmNDViZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciB0byBwbGFjZSBBbm5vdGF0aW9ucyBhbmQgVmFsaWRhdGlvblN0cmF0ZWdpZXMgaW4gdGhlIHNhbWUgcGFja2FnZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5ICsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Ub0RvLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVG9Eby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTNiMDk0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Ub0RvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi1wdWJsaWMgQGludGVyZmFjZSBUb0RvCi17Ci0gICAgUHJpb3JpdHkgdmFsdWUoKTsKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24oKSBkZWZhdWx0ICIiOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlSW5mb3JtYXRpb24uamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OTQ5NWYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlSW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBpdCdzIGFuIGludGVybmFsIGFubm90YXRpb24gdG8gcHJvdmlkZSBzb21lIGluZm9ybWF0aW9uCi0gKiA8cC8+Ci0gKiBlLmcuOiBzb21lIG1lY2hhbmlzbXMgYXJlbid0IGRlcHJlY2F0ZWQKLSAqIHRoZXkgYXJlIGUuZy4gZmFsbGJhY2tzLCBhbHRlcm5hdGl2ZXMsLi4uCi0gKiBpbiBvcmRlciB0byBhdm9pZCB0aGUgZGVwcmVjYXRlZCBhbm5vdGF0aW9uIGl0J3MgcG9zc2libGUgdG8gdXNlIHRoaXMgb25lLgotICogeW91IGNhbiB0ZWxsIG90aGVyIGRldmVsb3BlcnM6Ci0gKiB0aGlzIGFydGlmYWN0IGlzbid0IHVzZWQgZm9yIHRoZSBkZXNpcmVkIGFwcHJvYWNoLCBob3dldmVyLCBpdCdzIHN0aWxsIGVzc2VudGlhbCB0byBoYXZlIGl0IGFzIC4uLgotICogPHAvPgotICogaWRlYTogdW5pZnkgc21hbGwgcGFydHMgb2YgaW5mb3JtYXRpb24gd2hpY2ggYXJlIGZyZXF1ZW50bHkgdXNlZAotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotcHVibGljIEBpbnRlcmZhY2UgVXNhZ2VJbmZvcm1hdGlvbgotewotICAgIFVzYWdlQ2F0ZWdvcnlbXSB2YWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjI3NWVhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0NsYXNzVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ2xhc3NVdGlscw0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBDbGFzcyB0cnlUb0xvYWRDbGFzc0Zvck5hbWUoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBsb2FkQ2xhc3NGb3JOYW1lKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBDbGFzcyBsb2FkQ2xhc3NGb3JOYW1lKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvLyBUcnkgV2ViQXBwIENsYXNzTG9hZGVyIGZpcnN0DQotICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUobmFtZSwgZmFsc2UsIC8vIGRvIG5vdCBpbml0aWFsaXplIGZvciBmYXN0ZXIgc3RhcnR1cA0KLSAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlnbm9yZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvLyBmYWxsYmFjazogVHJ5IENsYXNzTG9hZGVyIGZvciBDbGFzc1V0aWxzIChpLmUuIHRoZSBteWZhY2VzLmphciBsaWIpDQotICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUobmFtZSwgZmFsc2UsIC8vIGRvIG5vdCBpbml0aWFsaXplIGZvciBmYXN0ZXIgc3RhcnR1cA0KLSAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW5zdGFudGlhdGVDbGFzcyhDbGFzcyB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRhcmdldENsYXNzLm5ld0luc3RhbmNlKCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoU3RyaW5nIGNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGluc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKFN0cmluZyBjbGFzc05hbWUpDQotICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXR1cm4gbG9hZENsYXNzRm9yTmFtZShjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYmRiMjcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLk1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkFic3RyYWN0RUxIZWxwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi0NCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX1JFUVVJUkVEID0gImphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUlucHV0LlJFUVVJUkVEIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX1JFUVVJUkVEX0RFVEFJTCA9ICJqYXZheC5mYWNlcy5jb21wb25lbnQuVUlJbnB1dC5SRVFVSVJFRF9kZXRhaWwiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfTUFYSU1VTSA9ICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yLk1BWElNVU0iOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwgPSAiamF2YXguZmFjZXMudmFsaWRhdG9yLkxlbmd0aFZhbGlkYXRvci5NQVhJTVVNX2RldGFpbCI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nRmFjdG9yeTxPYmplY3QsIFZhbGlkYXRpb25TdHJhdGVneT4pIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUobWV0YURhdGFLZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFUcmFuc2Zvcm1lciBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YVRyYW5zZm9ybWVyPikgRXh0VmFsQ29udGV4dA0KLSAgICAgICAgICAgICAgICAgICAgLmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlKHZhbGlkYXRpb25TdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcigpDQotICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLCBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50V2l0aE1ldGFEYXRhKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgZm9yKENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyIDogRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXIuY29uZmlndXJlQ29tcG9uZW50KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsNCi0NCi0gICAgICAgIGZvcihWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIDogRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmFmdGVyVGhyb3dpbmcoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbiwgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlUmVzb2x2ZXIgZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXNzYWdlUmVzb2x2ZXI+KUV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgIC5jcmVhdGUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEVMSGVscGVyIGdldEVMSGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5FTF9IRUxQRVJfRkFDVE9SWSwgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuY2xhc3MpLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHlEZXRhaWxzIGNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgYmFzZU9iamVjdDsNCi0gICAgICAgIGlmKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKHRhcmdldEV4cHJlc3Npb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmJlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgU3RyaW5nIGV4cHJlc3Npb24gPSB2YmUuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgICAgIGJhc2VPYmplY3QgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YmUuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURldGFpbHMoDQotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uc3Vic3RyaW5nKDIsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKSwgYmFzZU9iamVjdCwgdmJlLmdldFByb3BlcnR5KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIG9yaWdpbmFsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eSgNCi0gICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgU3RyaW5nIG5ld0Jhc2VLZXkgPSBvcmlnaW5hbC5nZXRLZXkoKS5zdWJzdHJpbmcoMCwgb3JpZ2luYWwuZ2V0S2V5KCkubGFzdEluZGV4T2YoIi4iKSArIDEpOw0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IG5ld0Jhc2VLZXkgKyB0YXJnZXRFeHByZXNzaW9uOw0KLQ0KLSAgICAgICAgYmFzZU9iamVjdCA9IFJlZmxlY3Rpb25VdGlscy5nZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKG9yaWdpbmFsLmdldEJhc2VPYmplY3QoKSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICBuZXdLZXksIGJhc2VPYmplY3QsIHRhcmdldEV4cHJlc3Npb24uc3Vic3RyaW5nKHRhcmdldEV4cHJlc3Npb24ubGFzdEluZGV4T2YoIi4iKSArIDEsDQotICAgICAgICAgICAgdGFyZ2V0RXhwcmVzc2lvbi5sZW5ndGgoKSkpOw0KLSAgICB9DQotDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb1BsYWNlTGFiZWwoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgU3RyaW5nIGxhYmVsLCBpbnQgaW5kZXgpDQotICAgIHsNCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLmNvbnRhaW5zKCJ7IiArIGluZGV4ICsgIn0iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLnJlcGxhY2UoInsiICsgaW5kZXggKyAifSIsIGxhYmVsKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkuY29udGFpbnMoInsiICsgaW5kZXggKyAifSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNNZXNzYWdlLmdldERldGFpbCgpLnJlcGxhY2UoInsiICsgaW5kZXggKyAifSIsIGxhYmVsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VXaXRoRGVmYXVsdE1heGltdW1NZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIGludCBtYXhMZW5ndGgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZSA9IEpzZlV0aWxzLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfTUFYSU1VTSk7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZTsNCi0NCi0gICAgICAgIC8vdXNlIHRyeS9jYXRjaCBmb3IgZWFzaWVyIHN5bmMgYmV0d2VlbiB0cnVuay9icmFuY2gNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEpzZlV0aWxzLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IEpzZlV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vanNmIDEuMiBkb2Vzbid0IGhhdmUgYSBkZXRhaWwgbWVzc2FnZQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2UgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZS5yZXBsYWNlKCJ7MH0iLCAiIiArIG1heExlbmd0aCk7DQotICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsLnJlcGxhY2UoInswfSIsICIiICsgbWF4TGVuZ3RoKTsNCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGZhY2VzUmVxdWlyZWRNZXNzYWdlKTsNCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwpOw0KLSAgICB9DQotDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBsYWNlV2l0aERlZmF1bHRSZXF1aXJlZE1lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGZhY2VzUmVxdWlyZWRNZXNzYWdlID0gSnNmVXRpbHMuZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhKQVZBWF9GQUNFU19SRVFVSVJFRCk7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZTsNCi0NCi0gICAgICAgIC8vdXNlIHRyeS9jYXRjaCBmb3IgZWFzaWVyIHN5bmMgYmV0d2VlbiB0cnVuay9icmFuY2gNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEpzZlV0aWxzLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfUkVRVUlSRURfREVUQUlMKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBKc2ZVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkuZ2V0U3RyaW5nKEpBVkFYX0ZBQ0VTX1JFUVVJUkVEX0RFVEFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9qc2YgMS4yIGRvZXNuJ3QgaGF2ZSBhIGRldGFpbCBtZXNzYWdlDQotICAgICAgICB9DQotDQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc1JlcXVpcmVkTWVzc2FnZSk7DQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvSnNmVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwNDA1NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZTsKLWltcG9ydCBqYXZheC5mYWNlcy5saWZlY3ljbGUuTGlmZWN5Y2xlRmFjdG9yeTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBKc2ZVdGlscwotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcihQaGFzZUxpc3RlbmVyIHBoYXNlTGlzdGVuZXIpCi0gICAgewotICAgICAgICBMaWZlY3ljbGVGYWN0b3J5IGxpZmVjeWNsZUZhY3RvcnkgPSAoTGlmZWN5Y2xlRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRmFjdG9yeUZpbmRlci5MSUZFQ1lDTEVfRkFDVE9SWSk7Ci0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRJZDsKLSAgICAgICAgTGlmZWN5Y2xlIGN1cnJlbnRMaWZlY3ljbGU7Ci0gICAgICAgIEl0ZXJhdG9yIGxpZmVjeWNsZUlkcyA9IGxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlSWRzKCk7Ci0gICAgICAgIHdoaWxlIChsaWZlY3ljbGVJZHMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjdXJyZW50SWQgPSAoU3RyaW5nKSBsaWZlY3ljbGVJZHMubmV4dCgpOwotICAgICAgICAgICAgY3VycmVudExpZmVjeWNsZSA9IGxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlKGN1cnJlbnRJZCk7Ci0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlLnJlbW92ZVBoYXNlTGlzdGVuZXIocGhhc2VMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKQotICAgIHsKLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIGJ1bmRsZU5hbWUgPSBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5nZXRNZXNzYWdlQnVuZGxlKCk7Ci0KLSAgICAgICAgaWYoYnVuZGxlTmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBidW5kbGVOYW1lID0gRmFjZXNNZXNzYWdlLkZBQ0VTX01FU1NBR0VTOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShidW5kbGVOYW1lLCBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9SZWZsZWN0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4N2Y3ZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9SZWZsZWN0aW9uVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFJlZmxlY3Rpb25VdGlscwotewotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIHRyeVRvR2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0TWV0aG9kTmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0dldE1ldGhvZCh0YXJnZXRDbGFzcywgdGFyZ2V0TWV0aG9kTmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgdHJ5VG9HZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lLCBDbGFzcy4uLiBwYXJhbWV0ZXJUeXBlcykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0TWV0aG9kKHRhcmdldENsYXNzLCB0YXJnZXRNZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0TWV0aG9kTmFtZSkKLSAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldE1ldGhvZCh0YXJnZXRDbGFzcywgdGFyZ2V0TWV0aG9kTmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0TWV0aG9kTmFtZSwgQ2xhc3MuLi4gcGFyYW1ldGVyVHlwZXMpCi0gICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IHRhcmdldENsYXNzOwotICAgICAgICBNZXRob2QgdGFyZ2V0TWV0aG9kID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlICghT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY3VycmVudENsYXNzLmdldE5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IGN1cnJlbnRDbGFzcy5nZXREZWNsYXJlZE1ldGhvZCh0YXJnZXRNZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudENsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKENsYXNzIGN1cnJlbnRJbnRlcmZhY2UgOiB0YXJnZXRDbGFzcy5nZXRJbnRlcmZhY2VzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudEludGVyZmFjZTsKLQotICAgICAgICAgICAgICAgIHdoaWxlIChjdXJyZW50Q2xhc3MgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNZXRob2QgPSBjdXJyZW50Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QodGFyZ2V0TWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGFyZ2V0TWV0aG9kICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0YXJnZXRNZXRob2Q7Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKCJ0aGVyZSBpcyBubyBtZXRob2Qgd2l0aCB0aGUgbmFtZSAnIiArIHRhcmdldE1ldGhvZE5hbWUgKyAiJyIgKwotICAgICAgICAgICAgICAgICIgY2xhc3M6ICIgKyB0YXJnZXRDbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ5VG9JbnZva2VNZXRob2QodGFyZ2V0LCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ5VG9JbnZva2VNZXRob2RPZkNsYXNzKHRhcmdldCwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbnZva2VNZXRob2RPZkNsYXNzKHRhcmdldCwgbWV0aG9kLCBhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0Lm5ld0luc3RhbmNlKCksIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdC4uLiBhcmdzKQotICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQubmV3SW5zdGFuY2UoKSwgbWV0aG9kLCBhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kLCBPYmplY3QuLi4gYXJncykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldCwgbWV0aG9kLCBhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0LCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kLCBPYmplY3QuLi4gYXJncykKLSAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICByZXR1cm4gbWV0aG9kLmludm9rZSh0YXJnZXQsIGFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEJhc2VPZlByb3BlcnR5Q2hhaW4oT2JqZWN0IGJhc2VPYmplY3QsIFN0cmluZyBwcm9wZXJ0eUNoYWluKQotICAgIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocHJvcGVydHlDaGFpbiwgIi4iKTsKLQotICAgICAgICBPYmplY3QgY3VycmVudEJhc2UgPSBiYXNlT2JqZWN0OwotICAgICAgICBTdHJpbmcgY3VycmVudFByb3BlcnR5OwotICAgICAgICBNZXRob2QgY3VycmVudE1ldGhvZDsKLQotICAgICAgICB3aGlsZSh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjdXJyZW50UHJvcGVydHkgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0KLSAgICAgICAgICAgIC8vaWdub3JlIHRoZSBsYXN0IHByb3BlcnR5Ci0gICAgICAgICAgICBpZighdG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9ubyBpcyAtIGl0J3Mgb25seSBwb3NzaWJsZSBhdCBwcm9wZXJ0aWVzIG5vdCBhdCBiZWFuIGxldmVsCi0gICAgICAgICAgICBjdXJyZW50TWV0aG9kID0gdHJ5VG9HZXRNZXRob2QoY3VycmVudEJhc2UuZ2V0Q2xhc3MoKSwKLSAgICAgICAgICAgICAgICAiZ2V0IiArIGN1cnJlbnRQcm9wZXJ0eS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eS5zdWJzdHJpbmcoMSwgY3VycmVudFByb3BlcnR5Lmxlbmd0aCgpKSk7Ci0gICAgICAgICAgICBjdXJyZW50QmFzZSA9IHRyeVRvSW52b2tlTWV0aG9kKGN1cnJlbnRCYXNlLCBjdXJyZW50TWV0aG9kKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjdXJyZW50QmFzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvV2ViWG1sVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFiMjE3Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBXZWJYbWxVdGlscw0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW5pdFBhcmFtZXRlcihTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcihFeHRWYWxJbmZvcm1hdGlvbi5XRUJYTUxfUEFSQU1fUFJFRklYICsgIi4iICsga2V5KTsNCi0gICAgICAgIHJldHVybiAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZS5yZXBsYWNlKCIgIiwgIiIpLnRyaW0oKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMjAxZDIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9jb3JlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSBNb2R1bGUNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSBNb2R1bGUgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlIE1vZHVsZSBwcm92aWRlcyBhbiBleHRlbnNpYmxlIHZhbGlkYXRpb24gcGxhdGZvcm0gdG8gaW1wbGVtZW50IHZhbGlkYXRpb24gYmFzZWQgb24gbWV0YS1kYXRhLg0KLSAgICBCYXNlZCBvbiB0aGlzIG1vZHVsZSBpdCBpcyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgdmFsaWRhdGlvbiBtb2R1bGVzLg0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS4xLnggYW5kIEpTRiAxLjIueC4gQm90aCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbCBiL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFjMDZkYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2Fzc2VtYmx5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgRXhhbXBsZXMgQXNzZW1ibHk8L25hbWU+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWV4YW1wbGVzLWFzc2VtYmx5MTI8L2FydGlmYWN0SWQ+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzFfcmNleGFtcGxlcy9hc3NlbWJseTwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8xX3JjZXhhbXBsZXMvYXNzZW1ibHk8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8xX3JjZXhhbXBsZXMvYXNzZW1ibHk8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRlcGVuZGVuY3ktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktd2FyPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fd29ybGQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+CQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWZlYXR1cmUtc2V0XzAxPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS93YXI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1zcmM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1oZWxsb193b3JsZDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPmphdmEtc291cmNlPC90eXBlPiAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPmphdmEtc291cmNlPC90eXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zcmM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tIEVYRUNVVEUgbXZuIHBhY2thZ2UgdG8gZ2VuZXJhdGUgYXNzZW1ibHkgZmlsZXMgLS0+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X3NyYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXNzZW1ibHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPiAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5teWZhY2VzLWV4dHZhbC1leGFtcGxlcy0ke3Byb2plY3QudmVyc2lvbn0tc3JjPC9maW5hbE5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9iaW48L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmFzc2VtYmx5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLQkgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotCSAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4gICAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbDwvZGVzY3JpcHRvcj4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotCSAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwtZXhhbXBsZXMtJHtwcm9qZWN0LnZlcnNpb259PC9maW5hbE5hbWU+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS93b3JrPC93b3JrRGlyZWN0b3J5PgotCSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQkgICAgCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD53YWdvbi1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxpZD5teWZhY2VzLW5pZ2h0bHktYnVpbGRzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9taW5vdGF1ci5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9idWlsZHMvbXlmYWNlcy9uaWdodGx5PC91cmw+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9vdXQ8L2lucHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotCi0gICAgICAgIDwvcGx1Z2lucz4KLQotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwgYi9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZjdiODEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+YmluPC9pZD4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+CQotICA8ZmlsZVNldHM+ICAgIAotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvd2FyPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLndhcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PiAgICAgCi0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sIGIvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTcwY2NjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPnNyYzwvaWQ+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgkKLSAgPGZpbGVTZXRzPiAgICAKLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3NyYzwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLnR4dDwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNWIzYTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDliZGIxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9wb20ueG1sIGIvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDcwMTZhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgZmVhdHVyZS1zZXQgMDE8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4xLjE8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmZhY2VsZXRzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWZhY2VsZXRzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE0PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+ZWwtaW1wbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50b21haGF3azwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRvbWFoYXdrPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjY8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2N1c3RvbS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2N1c3RvbS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MDFkZjcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jdXN0b20vdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLSMgdGhpcyBtZXNzYWdlIGJ1bmRsZSBpcyBwaWNrZWQgdXAgdmlhIGNvbnZlbnRpb24NCi1yZXBlYXRlZF9wYXNzd29yZF9yZXF1aXJlZD1wbGVhc2UgcmV0eXBlIHRoZSBwYXNzd29yZA0KLXJlcGVhdGVkX3Bhc3N3b3JkX3JlcXVpcmVkX2RldGFpbD1wbGVhc2UgcmV0eXBlIHRoZSBwYXNzd29yZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmFlNDFlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJc1R5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLk5vdEVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi0NCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbDsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVGVtcG9yYWxUeXBlOw0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi1wdWJsaWMgY2xhc3MgUGVyc29uDQotew0KLSAgICBATGVuZ3RoKG1pbmltdW0gPSAyKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDIwKQ0KLSAgICBATm90RXF1YWxzKCJsYXN0TmFtZSIpDQotICAgIEBQYXR0ZXJuKCJbQS1aXVthLXpdKyIpDQotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsNCi0NCi0gICAgQExlbmd0aChtaW5pbXVtID0gMikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAyMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7DQotDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwKQ0KLSAgICBwcml2YXRlIFN0cmluZyByb2xlID0gInVzZXIiOw0KLQ0KLSAgICBARGF0ZUlzKHR5cGUgPSBEYXRlSXNUeXBlLmJlZm9yZSwgdmFsdWVPZiA9ICJmaW5hbEV4YW0iKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIEBUZW1wb3JhbChUZW1wb3JhbFR5cGUuREFURSkNCi0gICAgcHJpdmF0ZSBEYXRlIGJpcnRoZGF5Ow0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIEBUZW1wb3JhbChUZW1wb3JhbFR5cGUuREFURSkNCi0gICAgcHJpdmF0ZSBEYXRlIGZpbmFsRXhhbTsNCi0NCi0gICAgQExlbmd0aChtaW5pbXVtID0gMikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmlja05hbWU7DQotDQotICAgIEBMZW5ndGgobWluaW11bSA9IDYpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gNjApDQotICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIHByaXZhdGUgaW50IG51bWJlck9mU2libGluZ3M7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByb2xlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFJvbGUoU3RyaW5nIHJvbGUpDQotICAgIHsNCi0gICAgICAgIHRoaXMucm9sZSA9IHJvbGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0QmlydGhkYXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmlydGhkYXk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0QmlydGhkYXkoRGF0ZSBiaXJ0aGRheSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5iaXJ0aGRheSA9IGJpcnRoZGF5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldEZpbmFsRXhhbSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmaW5hbEV4YW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RmluYWxFeGFtKERhdGUgZmluYWxFeGFtKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpbmFsRXhhbSA9IGZpbmFsRXhhbTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5pY2tOYW1lKFN0cmluZyBuaWNrTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uaWNrTmFtZSA9IG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNpYmxpbmdzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG51bWJlck9mU2libGluZ3M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyT2ZTaWJsaW5ncyhpbnQgbnVtYmVyT2ZTaWJsaW5ncykNCi0gICAgew0KLSAgICAgICAgdGhpcy5udW1iZXJPZlNpYmxpbmdzID0gbnVtYmVyT2ZTaWJsaW5nczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmUxNGZiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmd1aS5iZWFuczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluLlBlcnNvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5Ob3RFcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTG9uZ1JhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmN1c3RvbS5lbWFpbHZhbGlkYXRvci5FbWFpbFZhbGlkYXRvcjsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uUGFnZQ0KLXsNCi0NCi0gICAgLy90aGUgb2xkIHBhc3N3b3JkIG9mIHRoZSBwZXJzb24gaXNuJ3QgdXNlZCB3aXRoaW4gdGhlIHBhZ2UNCi0gICAgLy8tPiB2YWxpZGF0ZSB3aXRoIHZhbHVlIG9mIHRoZSBtb2RlbA0KLSAgICBAU2tpcFZhbGlkYXRpb24oIiN7cGVyc29uLnJvbGUgZXEgJ2FkbWluJ30iKQ0KLSAgICBAUmVxdWlyZWQNCi0gICAgQEVxdWFscygicGVyc29uLnBhc3N3b3JkIikNCi0gICAgQE5vdEVxdWFscygicGFzc3dvcmQiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBvbGRQYXNzd29yZDsNCi0NCi0gICAgQEVxdWFscygicGFzc3dvcmRSZXBlYXRlZCIpDQotICAgIC8vY29tYmluZSBndWkgcmVsYXRlZCBhbm5vdGF0aW9ucyB3aXRoIHRoZSBhbm5vYXRpb25zIG9mIHRoZSBkb21haW4gbW9kZWwNCi0gICAgQEpvaW5WYWxpZGF0aW9uKHZhbHVlID0gIiN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ucGFzc3dvcmR9IikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7DQotDQotICAgIEBSZXF1aXJlZCh2YWxpZGF0aW9uRXJyb3JNc2dLZXkgPSAicmVwZWF0ZWRfcGFzc3dvcmRfcmVxdWlyZWQiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZFJlcGVhdGVkOw0KLQ0KLSAgICAvL3VzZSAje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLm5pY2tOYW1lfSwgI3twZXJzb24ubmlja05hbWV9DQotICAgIC8vdXNlIHJlZ2lzdHJhdGlvblBhZ2UgdG8gZGlzcGxheSB0aGUgc2Vjb25kIGVycm9yIG1lc3NhZ2UgYXQgb2xkIG5pY2tuYW1lDQotICAgIC8vb3IgbG9jYWwgcHJvcGVydHkgY2hhaW5pbmcgKHRvIGF2b2lkIHRoZSB1c2FnZSBvZiB0aGUgYmVhbiBuYW1lKSAtIGxpa2U6DQotICAgIEBTa2lwVmFsaWRhdGlvbigiI3twZXJzb24ucm9sZSBlcSAnYWRtaW4nfSIpDQotICAgIEBOb3RFcXVhbHMoInBlcnNvbi5uaWNrTmFtZSIpDQotICAgIEBKb2luVmFsaWRhdGlvbigicGVyc29uLm5pY2tOYW1lIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmV3Tmlja05hbWU7DQotDQotICAgIHByaXZhdGUgUGVyc29uIHBlcnNvbjsNCi0NCi0gICAgcHVibGljIFN0cmluZyBmaW5pc2goKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXRQYXNzd29yZCh0aGlzLnBhc3N3b3JkKTsNCi0gICAgICAgIHJldHVybiAiaG9tZSI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyB1cGRhdGVOaWNrTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldE5pY2tOYW1lKHRoaXMubmV3Tmlja05hbWUpOw0KLSAgICAgICAgcmV0dXJuICJob21lIjsNCi0gICAgfQ0KLQ0KLSAgICAvL2p1c3QgYSBxdWljayBpbGx1c3RyYXRpb24gb2Ygc2tpcFZhbGlkYXRpb24NCi0gICAgcHVibGljIFN0cmluZyBzd2l0Y2hNb2RlKCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRSb2xlID0gdGhpcy5wZXJzb24uZ2V0Um9sZSgpOw0KLQ0KLSAgICAgICAgaWYoY3VycmVudFJvbGUuZXF1YWxzKCJhZG1pbiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMucGVyc29uLnNldFJvbGUoInVzZXIiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnBlcnNvbi5zZXRSb2xlKCJhZG1pbiIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuICIiOw0KLSAgICB9DQotDQotICAgIEBKb2luVmFsaWRhdGlvbigicGVyc29uLmVtYWlsIikNCi0gICAgQFZhbGlkYXRvcihFbWFpbFZhbGlkYXRvci5jbGFzcykNCi0gICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbi5nZXRFbWFpbCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKFN0cmluZyBlbWFpbCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0RW1haWwoZW1haWwpOw0KLSAgICB9DQotDQotICAgIEBKb2luVmFsaWRhdGlvbigiI3twZXJzb24ubnVtYmVyT2ZTaWJsaW5nc30iKQ0KLSAgICBATG9uZ1JhbmdlKG1heGltdW0gPSAyMCkNCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNpYmxpbmdzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uLmdldE51bWJlck9mU2libGluZ3MoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXJPZlNpYmxpbmdzKGludCBudW1iZXJPZlNpYmxpbmdzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXROdW1iZXJPZlNpYmxpbmdzKG51bWJlck9mU2libGluZ3MpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRPbGRQYXNzd29yZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBvbGRQYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRPbGRQYXNzd29yZChTdHJpbmcgb2xkUGFzc3dvcmQpDQotICAgIHsNCi0gICAgICAgIHRoaXMub2xkUGFzc3dvcmQgPSBvbGRQYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmRSZXBlYXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZFJlcGVhdGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkUmVwZWF0ZWQoU3RyaW5nIHBhc3N3b3JkUmVwZWF0ZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmRSZXBlYXRlZCA9IHBhc3N3b3JkUmVwZWF0ZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBlcnNvbiBnZXRQZXJzb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGVyc29uOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNvbihQZXJzb24gcGVyc29uKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbiA9IHBlcnNvbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5ld05pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ld05pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5ld05pY2tOYW1lKFN0cmluZyBuZXdOaWNrTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uZXdOaWNrTmFtZSA9IG5ld05pY2tOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OWRmNGYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQwotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMC8vRU4iCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlcy1jb25maWc+Ci0gICAgPGFwcGxpY2F0aW9uPgotICAgICAgICA8IS0tIHRyaW5pZGFkIC0tPgotICAgICAgICA8ZGVmYXVsdC1yZW5kZXIta2l0LWlkPgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvcmUKLSAgICAgICAgPC9kZWZhdWx0LXJlbmRlci1raXQtaWQ+Ci0KLSAgICA8L2FwcGxpY2F0aW9uPgotCi0gICAgPG1hbmFnZWQtYmVhbj4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1uYW1lPnJlZ2lzdHJhdGlvblBhZ2U8L21hbmFnZWQtYmVhbi1uYW1lPgotICAgICAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmd1aS5iZWFucy5SZWdpc3RyYXRpb25QYWdlPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPgotCi0gICAgICAgIDxtYW5hZ2VkLXByb3BlcnR5PgotICAgICAgICAgICAgPHByb3BlcnR5LW5hbWU+cGVyc29uPC9wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPHZhbHVlPiN7cGVyc29ufTwvdmFsdWU+Ci0gICAgICAgIDwvbWFuYWdlZC1wcm9wZXJ0eT4KLSAgICA8L21hbmFnZWQtYmVhbj4KLQotICAgIDxtYW5hZ2VkLWJlYW4+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tbmFtZT5wZXJzb248L21hbmFnZWQtYmVhbi1uYW1lPgotICAgICAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb248L21hbmFnZWQtYmVhbi1jbGFzcz4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5zZXNzaW9uPC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0gICAgPC9tYW5hZ2VkLWJlYW4+Ci0KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8ZnJvbS12aWV3LWlkPi9wYWdlcy9ob21lLnhodG1sPC9mcm9tLXZpZXctaWQ+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmFkZFVzZXI8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5jaGFuZ2VOaWNrTmFtZTwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmNoYW5nZVBhc3N3b3JkPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICA8L25hdmlnYXRpb24tcnVsZT4KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8ZnJvbS12aWV3LWlkPio8L2Zyb20tdmlldy1pZD4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+aG9tZTwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL2hvbWUueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgIDwvbmF2aWdhdGlvbi1ydWxlPgotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9tYWluLnRhZ2xpYi54bWwgYi9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzOTM2Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIGZhY2VsZXQtdGFnbGliIFBVQkxJQwotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEZhY2VsZXQgVGFnbGliIDEuMC8vRU4iCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9mYWNlbGV0LXRhZ2xpYl8xXzAuZHRkIj4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZmFjZWxldC10YWdsaWI+Ci0gICAgPG5hbWVzcGFjZT5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dHZhbC9kZW1vL2NvbXBvbmVudHM8L25hbWVzcGFjZT4KLQotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT51c2VyRm9ybTwvdGFnLW5hbWU+Ci0gICAgICAgIDxzb3VyY2U+Ci0gICAgICAgICAgICAuLi9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbAotICAgICAgICA8L3NvdXJjZT4KLSAgICA8L3RhZz4KLQotPC9mYWNlbGV0LXRhZ2xpYj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YzAxYWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCi0gICAgICAgICB2ZXJzaW9uPSIyLjQiPgotCi0gICAgPGRlc2NyaXB0aW9uPk15UHJvamVjdCB3ZWIueG1sPC9kZXNjcmlwdGlvbj4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5ERUZBVUxUX1NVRkZJWDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi54aHRtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmZhY2VsZXRzLkxJQlJBUklFUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi9XRUItSU5GL21haW4udGFnbGliLnhtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5FTkFCTEVfTElHSFRXRUlHSFRfRElBTE9HUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRElTQUJMRV9DT05URU5UX0NPTVBSRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5BTFRFUk5BVEVfVklFV19IQU5ETEVSPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y29tLnN1bi5mYWNlbGV0cy5GYWNlbGV0Vmlld0hhbmRsZXI8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuVVNFX0FQUExJQ0FUSU9OX1ZJRVdfQ0FDSEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5DSEFOR0VfUEVSU0lTVEVOQ0U8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5zZXNzaW9uPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBTZWUgSlNGIFNwZWNpZmljYXRpb24gMi41LjMKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNsaWVudDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5OVU1CRVJfT0ZfVklFV1NfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPjIwPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzdGF0ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbSBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uCi0gICAgICAgICAgICBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KSBhbmQgaWYKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgY29tcHJlc3NlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUKLSAgICAgICAgICAgIHJlbmRlcmVkIEhUTUwgb3V0cHV0LgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgbm90IGFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFMTE9XX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5ERVRFQ1RfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCByZW5kZXJlZCBIVE1MIGNvZGUgd2lsbCBiZSBmb3JtYXR0ZWQsIHNvIHRoYXQgaXQgaXMgImh1bWFuIHJlYWRhYmxlIi4KLSAgICAgICAgICAgIGkuZS4gYWRkaXRpb25hbCBsaW5lIHNlcGFyYXRvcnMgYW5kIHdoaXRlc3BhY2Ugd2lsbCBiZSB3cml0dGVuLCB0aGF0IGRvIG5vdAotICAgICAgICAgICAgaW5mbHVlbmNlIHRoZSBIVE1MIGNvZGUuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlBSRVRUWV9IVE1MPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlCi0gICAgICAgICAgICBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuIENvbnZlbmllbnQgZmVhdHVyZSBpZiB5b3UgaGF2ZSBwYWdlcwotICAgICAgICAgICAgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGJyb3dzZXIgcGFnZSB0byBhbHdheXMganVtcCB0byB0aGUgdG9wCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuCi0gICAgICAgICAgICBEZWZhdWx0OiAiZmFsc2UiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BVVRPX1NDUk9MTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQotICAgICAgICAgICAgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucwotICAgICAgICAgICAgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IgZGlmZmVuZW50IGVuY3J5cHRpb24gc3RyZW5ndGhzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VDUkVUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+TnpZMU5ETXlNVEE9PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmFsaWRhdGUgbWFuYWdlZCBiZWFucywgbmF2aWdhdGlvbiBydWxlcyBhbmQgZW5zdXJlIHRoYXQgZm9ybXMgYXJlIG5vdCBuZXN0ZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDwhLS0gTGlzdGVuZXIsIHRvIGFsbG93IEpldHR5IHNlcnZpbmcgTXlGYWNlcyBhcHBzIC0tPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy53ZWJhcHAuU3RhcnR1cFNlcnZsZXRDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLndlYmFwcC5SZXNvdXJjZVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPGZpbHRlcj4KLSAgICAgICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlRyaW5pZGFkRmlsdGVyPC9maWx0ZXItY2xhc3M+Ci0gICAgPC9maWx0ZXI+Ci0KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT50cmluaWRhZDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZ3MgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4vZmFjZXMvKjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPnJlc291cmNlczwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+L2FkZi8qPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sIGIvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NGQ2NDguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiCi0gICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIgotICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIKLSAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIgotICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPgotCi08dWk6Y29tcG9zaXRpb24+Ci0gICAgPHRyOnBhbmVsRm9ybUxheW91dD4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJuaWNrIG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uWyAnbmlja05hbWUnIF19Ii8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9ImUtbWFpbCIgdmFsdWU9IiN7YmVhbi5lbWFpbH0iLz4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJmaXJzdCBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5maXJzdE5hbWV9Ii8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Imxhc3QgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb24ubGFzdE5hbWV9Ii8+Ci0gICAgICAgIDx0cjppbnB1dERhdGUgbGFiZWw9ImJpcnRoZGF5IiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5iaXJ0aGRheX0iPgotICAgICAgICAgICAgPHRyOmNvbnZlcnREYXRlVGltZSB0eXBlPSJkYXRlIiBwYXR0ZXJuPSJkZC5NTS55eXl5Ii8+Ci0gICAgICAgIDwvdHI6aW5wdXREYXRlPgotICAgICAgICA8dHI6aW5wdXREYXRlIGxhYmVsPSJmaW5hbCBleGFtIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5maW5hbEV4YW19Ij4KLSAgICAgICAgICAgIDx0cjpjb252ZXJ0RGF0ZVRpbWUgdHlwZT0iZGF0ZSIgcGF0dGVybj0iZGQuTU0ueXl5eSIvPgotICAgICAgICA8L3RyOmlucHV0RGF0ZT4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJudW1iZXIgb2Ygc2libGluZ3MiIHZhbHVlPSIje2JlYW4ubnVtYmVyT2ZTaWJsaW5nc30iLz4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJwYXNzd29yZCIgdmFsdWU9IiN7YmVhbi5wYXNzd29yZH0iIHNlY3JldD0idHJ1ZSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJyZS1lbnRlciBwYXNzd29yZCIgdmFsdWU9IiN7YmVhbi5wYXNzd29yZFJlcGVhdGVkfSIgc2VjcmV0PSJ0cnVlIi8+Ci0KLSAgICA8L3RyOnBhbmVsRm9ybUxheW91dD4KLTwvdWk6Y29tcG9zaXRpb24+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sIGIvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjZDE0OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotICAgICAgICANCi08aHRtbD4NCi0NCi08aGVhZD4NCi0gICAgPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDsgVVJMPWZhY2VzL3BhZ2VzL2hvbWUueGh0bWwiPg0KLTwvaGVhZD4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sIGIvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGMxZWE4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTx0cjpkb2N1bWVudA0KLSAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIg0KLSAgICAgICAgeG1sbnM6Yz0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3RsL2NvcmUiPg0KLSAgICA8ZjpmYWNldCBuYW1lPSJtZXRhQ29udGFpbmVyIj4NCi0gICAgICAgIDx0aXRsZT5zZXYtZW4gZmVhdHVyZS1zZXQgZGVtbyAwMTwvdGl0bGU+DQotICAgIDwvZjpmYWNldD4NCi0NCi0gICAgPHRyaDpib2R5Pg0KLQ0KLSAgICAgICAgPCEtLSBvcmlnaW5hbCAtLT4NCi0gICAgICAgIDxkaXYgaWQ9IndyYXAiPg0KLQ0KLSAgICAgICAgICAgIDx0cjpmb3JtIGlkPSJmb3JtIiBkZWZhdWx0Q29tbWFuZD0iZGVmYXVsdEJ1dHRvbiI+DQotICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1haW4iPg0KLSAgICAgICAgICAgICAgICAgICAgPHVpOmluc2VydCBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ1bmRlcl9jb25zdHJ1Y3Rpb24iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+IXNpdGUgdW5kZXIgY29uc3RydWN0aW9uITwvaDI+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBjb250ZW50IG9mIHRoaXMgc2l0ZSBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSBtb21lbnQuPC9wPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC91aTppbnNlcnQ+DQotICAgICAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICAgIDwvdHI6Zm9ybT4NCi0gICAgICAgICAgICA8dHI6bWVzc2FnZXMgZ2xvYmFsT25seT0idHJ1ZSIvPg0KLQ0KLSAgICAgICAgPC9kaXY+DQotICAgIDwvdHJoOmJvZHk+DQotDQotDQotPC90cjpkb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWwgYi9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OTNmYWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDx0cjpwYW5lbEZvcm1MYXlvdXQ+DQotDQotICAgICAgICAgICAgPHVpOnJlbW92ZT4NCi0gICAgICAgICAgICAgICAganVzdCBmb3IgdGhlIGRlbW8gd2UgYXJlIHVzaW5nIHR3byBpbnB1dCBjb21wb25lbnRzDQotICAgICAgICAgICAgPC91aTpyZW1vdmU+DQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ib2xkIG5pY2sgbmFtZSIgcmVhZE9ubHk9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLm5pY2tOYW1lfSIvPg0KLQ0KLSAgICAgICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im5pY2sgbmFtZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5uZXdOaWNrTmFtZX0iLz4NCi0NCi0gICAgICAgIDwvdHI6cGFuZWxGb3JtTGF5b3V0Pg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UudXBkYXRlTmlja05hbWV9Ii8+DQotDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWwgYi9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0Njg5ODcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDx0cjpwYW5lbEZvcm1MYXlvdXQ+DQotDQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ib2xkIHBhc3N3b3JkIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLm9sZFBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+DQotDQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibmV3IHBhc3N3b3JkIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+DQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0icmUtZW50ZXIgcGFzc3dvcmQiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGFzc3dvcmRSZXBlYXRlZH0iIHNlY3JldD0idHJ1ZSIvPg0KLQ0KLSAgICAgICAgPC90cjpwYW5lbEZvcm1MYXlvdXQ+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJzYXZlIiBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS5maW5pc2h9Ii8+DQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sIGIvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE3ZWJkOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9ImFkZCB1c2VyIiBhY3Rpb249ImFkZFVzZXIiLz48YnIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0iY2hhbmdlIG5pY2sgbmFtZSIgYWN0aW9uPSJjaGFuZ2VOaWNrTmFtZSIvPjxici8+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJjaGFuZ2UgcGFzc3dvcmQiIGFjdGlvbj0iY2hhbmdlUGFzc3dvcmQiLz48YnIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRMaW5rIHRleHQ9Im1vZGU6ICN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ucm9sZX0iDQotICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS5zd2l0Y2hNb2RlfSIgaW1tZWRpYXRlPSJ0cnVlIi8+DQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwgYi9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZjZiMDYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczpjPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dHZhbC9kZW1vL2NvbXBvbmVudHMiDQotICAgICAgICA+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotDQotICAgICAgICA8Yzp1c2VyRm9ybSBiZWFuPSIje3JlZ2lzdHJhdGlvblBhZ2V9Ii8+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJzYXZlIiBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS5maW5pc2h9Ii8+DQotDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3BvbS54bWwgYi9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjN2M2NGYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fd29ybGQ8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIGhlbGxvIHdvcmxkPC9uYW1lPgotICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5lbC1pbXBsPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhZmIzOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbms7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluLlBlcnNvbjsKLQotLyoqCi0gKiBBIHR5cGljYWwgc2ltcGxlIGJhY2tpbmcgYmVhbiwgdGhhdCBpcyBiYWNrZWQgdG8gPGNvZGU+aGVsbG93b3JsZC5qc3A8L2NvZGU+Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEhlbGxvV29ybGRDb250cm9sbGVyCi17Ci0gICAgcHJpdmF0ZSBQZXJzb24gcGVyc29uID0gbmV3IFBlcnNvbigpOwotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBlbXB0eSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBIZWxsb1dvcmxkQ29udHJvbGxlcigpCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB0aGF0IGlzIGJhY2tlZCB0byBhIHN1Ym1pdCBidXR0b24gb2YgYSBmb3JtLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgc2VuZCgpCi0gICAgewotICAgICAgICAvL2RvIHJlYWwgbG9naWMsIHJldHVybiBhIHN0cmluZyB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuYXZpZ2F0aW9uIHN5c3RlbSBvZiBKU0YKLSAgICAgICAgcmV0dXJuICJzdWNjZXNzIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpCi0gICAgewotICAgICAgICByZXR1cm4gcGVyc29uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNvbihQZXJzb24gcGVyc29uKQotICAgIHsKLSAgICAgICAgdGhpcy5wZXJzb24gPSBwZXJzb247Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvZG9tYWluL1BlcnNvbi5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZDRhOWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsKLQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsKLQotcHVibGljIGNsYXNzIFBlcnNvbgotewotICAgIC8vaGVsbG8gd29ybGQgZGVtbwotICAgIEBSZXF1aXJlZAotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsKLQotICAgIC8vZGVtbyBmb3IganBhIGJhc2VkIHZhbGlkYXRpb24gc3VwcG9ydAotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTAgLyouLi4qLykKLSAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaXJzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsYXN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY2NDRkMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiIKLSAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzEuZHRkIiA+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGZhY2VzLWNvbmZpZz4KLQkKLQk8IS0tIG1hbmFnZWQgYmVhbnMgb2YgdGhlIHNpbXBsZSBoZWxsbyB3b3JsZCBhcHAgLS0+Ci0JPG1hbmFnZWQtYmVhbj4KLQkJPG1hbmFnZWQtYmVhbi1uYW1lPmhlbGxvV29ybGQ8L21hbmFnZWQtYmVhbi1uYW1lPgotCQk8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5IZWxsb1dvcmxkQ29udHJvbGxlcjwvbWFuYWdlZC1iZWFuLWNsYXNzPgotCQk8bWFuYWdlZC1iZWFuLXNjb3BlPnJlcXVlc3Q8L21hbmFnZWQtYmVhbi1zY29wZT4KLQk8L21hbmFnZWQtYmVhbj4KLQkKLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIGhlbGxvV29ybGQuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L2hlbGxvV29ybGQuanNwPC9mcm9tLXZpZXctaWQ+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPnN1Y2Nlc3M8L2Zyb20tb3V0Y29tZT4KLQkJCTx0by12aWV3LWlkPi9wYWdlMi5qc3A8L3RvLXZpZXctaWQ+Ci0JCTwvbmF2aWdhdGlvbi1jYXNlPgotCTwvbmF2aWdhdGlvbi1ydWxlPgotCQotCTwhLS0gbmF2aWdhdGlvbiBydWxlcyBmb3IgcGFnZTIuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L3BhZ2UyLmpzcDwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5iYWNrPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vaGVsbG9Xb3JsZC5qc3A8L3RvLXZpZXctaWQ+Ci0JCTwvbmF2aWdhdGlvbi1jYXNlPgotCTwvbmF2aWdhdGlvbi1ydWxlPgotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTRhMTgzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgotICAgICAgICAgdmVyc2lvbj0iMi40Ij4KLQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8IS0tb3B0aW9uYWw6IGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Db21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBVUklzIG9mIChhZGRpdGlvbmFsKSBmYWNlcyBjb25maWcgZmlsZXMuCi0gICAgICAgICAgICAoZS5nLiAvV0VCLUlORi9teS1jb25maWcueG1sKQotICAgICAgICAgICAgU2VlIEpTRiAxLjAgUFJEMiwgMTAuMy4yCi0gICAgICAgICAgICBBdHRlbnRpb246IFlvdSBkbyBub3QgbmVlZCB0byBwdXQgL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBpbiBoZXJlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5DT05GSUdfRklMRVM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0tLT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBTZWUgSlNGIFNwZWNpZmljYXRpb24gMi41LjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIGFtb3VudCAoZGVmYXVsdCA9IDIwKSBvZiB0aGUgbGF0ZXN0IHZpZXdzIGFyZSBzdG9yZWQgaW4gc2Vzc2lvbi48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuTlVNQkVSX09GX1ZJRVdTX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc3RhdGUgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0gYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLgotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KSBhbmQgaWYKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgY29tcHJlc3NlZC48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcGFyYW1ldGVyIHRlbGxzIE15RmFjZXMgaWYgamF2YXNjcmlwdCBjb2RlIHNob3VsZCBiZSBhbGxvd2VkIGluIHRoZQotICAgICAgICAgICAgcmVuZGVyZWQgSFRNTCBvdXRwdXQuCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUKLSAgICAgICAgICAgIHRoYXQgc3VibWl0cyB0aGUgY29ycmVzcG9uZGluZyBmb3JtLgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBub3QgYWxsb3dlZCwgdGhlIHN0YXRlIHNhdmluZyBpbmZvIGFuZCBuZXN0ZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BTExPV19KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuREVURUNUX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgcmVuZGVyZWQgSFRNTCBjb2RlIHdpbGwgYmUgZm9ybWF0dGVkLCBzbyB0aGF0IGl0IGlzICJodW1hbiByZWFkYWJsZSIuCi0gICAgICAgICAgICBpLmUuIGFkZGl0aW9uYWwgbGluZSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIHdpbGwgYmUgd3JpdHRlbiwgdGhhdCBkbyBub3QKLSAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgSFRNTCBjb2RlLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlBSRVRUWV9IVE1MPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlCi0gICAgICAgICAgICBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuIENvbnZlbmllbnQgZmVhdHVyZSBpZiB5b3UgaGF2ZSBwYWdlcwotICAgICAgICAgICAgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGJyb3dzZXIgcGFnZSB0byBhbHdheXMganVtcCB0byB0aGUgdG9wCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuCi0gICAgICAgICAgICBEZWZhdWx0OiAiZmFsc2UiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFVVE9fU0NST0xMPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Vc2VkIGZvciBlbmNyeXB0aW5nIHZpZXcgc3RhdGUuIE9ubHkgcmVsZXZhbnQgZm9yIGNsaWVudCBzaWRlCi0gICAgICAgICAgICBzdGF0ZSBzYXZpbmcuIFNlZSBNeUZhY2VzIHdpa2kvd2ViIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRUNSRVQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWYWxpZGF0ZSBtYW5hZ2VkIGJlYW5zLCBuYXZpZ2F0aW9uIHJ1bGVzIGFuZCBlbnN1cmUgdGhhdCBmb3JtcyBhcmUgbm90IG5lc3RlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlZBTElEQVRFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUcmVhdCByZWFkb25seSBzYW1lIGFzIGlmIGRpc2FibGVkIGF0dHJpYnV0ZSB3YXMgc2V0IGZvciBzZWxlY3QgZWxlbWVudHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5SRUFET05MWV9BU19ESVNBQkxFRF9GT1JfU0VMRUNUUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFVzZSB0aGUgZGVmaW5lZCBjbGFzcyBhcyB0aGUgY2xhc3Mgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiBhIHJlc291cmNlIGlzIGFkZGVkIHRvIHRoZQotICAgICAgICAgICAgRXh0ZW5zaW9uRmlsdGVyIGhhbmRsaW5nLiBVc2luZyBTdHJlYW1pbmdBZGRSZXNvdXJjZSBoZXJlIGhlbHBzIHdpdGggcGVyZm9ybWFuY2UuIElmIHlvdSB3YW50IHRvIGFkZAotICAgICAgICAgICAgY3VzdG9tIGNvbXBvbmVudHMgYW5kIHdhbnQgdG8gdXNlIHRoZSBFeHRlbnNpb25GaWx0ZXIsIHlvdSBuZWVkIHRvIHByb3ZpZGUgeW91ciBjdXN0b20gaW1wbGVtZW50YXRpb24gaGVyZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFERF9SRVNPVVJDRV9DTEFTUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC51dGlsLkRlZmF1bHRBZGRSZXNvdXJjZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAgICAgCi0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmlydHVhbCBwYXRoIGluIHRoZSBVUkwgd2hpY2ggdHJpZ2dlcnMgbG9hZGluZyBvZiByZXNvdXJjZXMgZm9yIHRoZSBNeUZhY2VzIGV4dGVuZGVkIGNvbXBvbmVudHMKLSAgICAgICAgICAgIGluIHRoZSBFeHRlbnNpb25GaWx0ZXIuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5SRVNPVVJDRV9WSVJUVUFMX1BBVEg8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vZmFjZXMvbXlGYWNlc0V4dGVuc2lvblJlc291cmNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIENoZWNrIGlmIHRoZSBleHRlbnNpb25zLWZpbHRlciBoYXMgYmVlbiBwcm9wZXJseSBjb25maWd1cmVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ0hFQ0tfRVhURU5TSU9OU19GSUxURVI8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIERlZmluZSBwYXJ0aWFsIHN0YXRlIHNhdmluZyBhcyB0cnVlL2ZhbHNlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5QQVJUSUFMX1NUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLQotICAgIDwhLS0gTGlzdGVuZXIsIHRvIGFsbG93IEpldHR5IHNlcnZpbmcgTXlGYWNlcyBhcHBzIC0tPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy53ZWJhcHAuU3RhcnR1cFNlcnZsZXRDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZyAtLT4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPiouanNmPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguanNwPC93ZWxjb21lLWZpbGU+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwIGIvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MDhlMDIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIzIj4KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9ImZpcnN0X25hbWUiIHZhbHVlPSJGaXJzdCBuYW1lOiIvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0iZmlyc3RfbmFtZSIgdmFsdWU9IiN7aGVsbG9Xb3JsZC5wZXJzb24uZmlyc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJmaXJzdF9uYW1lIiBzaG93U3VtbWFyeT0iZmFsc2UiIHNob3dEZXRhaWw9InRydWUiLz4KLQotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0ibGFzdF9uYW1lIiB2YWx1ZT0iTGFzdCBuYW1lOiIvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0ibGFzdF9uYW1lIiB2YWx1ZT0iI3toZWxsb1dvcmxkLnBlcnNvbi5sYXN0TmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0ibGFzdF9uYW1lIiBzaG93U3VtbWFyeT0iZmFsc2UiIHNob3dEZXRhaWw9InRydWUiLz4KLQotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Xb3JsZC5zZW5kfSIvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgICAgICAgPC9oOmZvcm0+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcCBiL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ4MmQ1My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCBwYWdlIHNlc3Npb249ImZhbHNlIiU+Ci08JQotcmVzcG9uc2Uuc2VuZFJlZGlyZWN0KCJoZWxsb1dvcmxkLmpzZiIpOwotJT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AgYi9wcmVwYXJlLzFfMV8xX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYzg1MjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgICA8Zjp2aWV3PgotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPgotICAgICAgICAgICAgICAgIDxoMj48aDpvdXRwdXRUZXh0IHZhbHVlPSJIZWxsbyAje2hlbGxvV29ybGQucGVyc29uLmZpcnN0TmFtZX0gI3toZWxsb1dvcmxkLnBlcnNvbi5sYXN0TmFtZX0uIFdlIGhvcGUgeW91IGVuam95IEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yISIvPjwvaDI+Ci0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZExpbmsgYWN0aW9uPSJiYWNrIj4KLSAgICAgICAgICAgICAgICAgICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iSG9tZSIvPgotICAgICAgICAgICAgICAgIDwvaDpjb21tYW5kTGluaz4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICA8L2Y6dmlldz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9wb20ueG1sIGIvcHJlcGFyZS8xXzFfMV9yYy9leGFtcGxlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzY2MmQzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvZXhhbXBsZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgcHJvamVjdDwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8xX3JjZXhhbXBsZXM8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMV9yY2V4YW1wbGVzPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMV9yY2V4YW1wbGVzPC91cmw+Ci0gICAgPC9zY20+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tVGhpcyBwbHVnaW4gYWxsb3dzIHRvIHJ1biB0aGUgZXhhbXBsZSB1c2luZyBtdm4gamV0dHk6cnVuIC0tPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpldHR5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj42LjEuODwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+MTA8L3NjYW5JbnRlcnZhbFNlY29uZHM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi0gICAgPG1vZHVsZXM+Ci0gICAgICAgIDxtb2R1bGU+aGVsbG9fd29ybGQ8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5mZWF0dXJlLXNldF8wMTwvbW9kdWxlPgotICAgIDwvbW9kdWxlcz4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPCEtLSBUaGlzIHByb2ZpbGUgaXMgaW52b2tlZCBieSAtRHByZXBhcmVSZWxlYXNlPXRydWUuICBUaGlzIGFsbG93cyBtdm4gcmVsZWFzZTpwcmVwYXJlIHRvCi0gICAgICAgICAgICBydW4gc3VjY2Vzc2Z1bGx5IG9uIHRoZSBhc3NlbWJseSBwcm9qZWN0cy4gLS0+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPnByZXBhcmUtcmVsZWFzZTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPnByZXBhcmVSZWxlYXNlPC9uYW1lPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8bW9kdWxlcz4KLSAgICAgICAgICAgICAgICA8bW9kdWxlPmFzc2VtYmx5PC9tb2R1bGU+Ci0gICAgICAgICAgICA8L21vZHVsZXM+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZWxlYXNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+LURwcmVwYXJlUmVsZWFzZTwvYXJndW1lbnRzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLQotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8dHJpbmlkYWQudmVyc2lvbj4xLjAuNTwvdHJpbmlkYWQudmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3BhcmVudC9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzFfcmMvcGFyZW50L0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvcGFyZW50L0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3BhcmVudC9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMV9yYy9wYXJlbnQvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5YmRiMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3BhcmVudC9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcgotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvcGFyZW50L3BvbS54bWwgYi9wcmVwYXJlLzFfMV8xX3JjL3BhcmVudC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2QzODlmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvcGFyZW50L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj42PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFByb2plY3QgUGFyZW50PC9uYW1lPgotICAgIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExPC91cmw+Ci0KLSAgICA8aXNzdWVNYW5hZ2VtZW50PgotICAgICAgICA8c3lzdGVtPmppcmE8L3N5c3RlbT4KLSAgICAgICAgPHVybD5odHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvRVhUVkFMPC91cmw+Ci0gICAgPC9pc3N1ZU1hbmFnZW1lbnQ+Ci0KLSAgICA8Y2lNYW5hZ2VtZW50PgotICAgICAgICA8c3lzdGVtPmNvbnRpbnV1bTwvc3lzdGVtPgotICAgICAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLnpvbmVzLmFwYWNoZS5vcmc6ODA4MC9jb250aW51dW08L3VybD4KLSAgICAgICAgPG5vdGlmaWVycz4KLSAgICAgICAgICAgIDxub3RpZmllcj4KLSAgICAgICAgICAgICAgICA8dHlwZT5tYWlsPC90eXBlPgotICAgICAgICAgICAgICAgIDxzZW5kT25TdWNjZXNzPnRydWU8L3NlbmRPblN1Y2Nlc3M+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhZGRyZXNzPmNvbW1pdHNAbXlmYWNlcy5hcGFjaGUub3JnPC9hZGRyZXNzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvbm90aWZpZXI+Ci0gICAgICAgIDwvbm90aWZpZXJzPgotICAgIDwvY2lNYW5hZ2VtZW50PgotICAgIAotICAgIDxpbmNlcHRpb25ZZWFyPjIwMDg8L2luY2VwdGlvblllYXI+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+TUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLQotICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KLSAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+Ci0KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS0KLSAgICAgICAgICAgICAgICAgICAgLSBDb3B5IExJQ0VOU0UudHh0IGFuZCBOT1RJQ0UudHh0IHNvIHRoYXQgdGhleSBhcmUgaW5jbHVkZWQKLSAgICAgICAgICAgICAgICAgICAgLSBpbiB0aGUgLWphdmFkb2MgamFyIGZpbGUgZm9yIHRoZSBjb21wb25lbnQuCi0gICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+amF2YWRvYy5yZXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hcGlkb2NzL01FVEEtSU5GIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTElDRU5TRS50eHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTk9USUNFLnR4dCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPCEtLQotICAgICAgICAgICAgICAgIC0gTWFrZSBhIGNoZWNrc3R5bGUgdmlvbGF0aW9uIGEgY29tcGlsZSBlcnJvci4gTm90ZSB0aGF0IGlmIGEgY29tcGlsZSBlcnJvciBvY2N1cnMsCi0gICAgICAgICAgICAgICAgLSBmdXJ0aGVyIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0YXJnZXQvc2l0ZS9jaGVja3N0eWxlLmh0bWwgKHByZXNlbnQgZXZlbiB3aGVuCi0gICAgICAgICAgICAgICAgLSBqdXN0IHRoZSBjb21waWxlIGdvYWwgYW5kIG5vdCB0aGUgc2l0ZSBnb2FsIGhhcyBiZWVuIHJ1bikuIE5vdGUgYWxzbyB0aGF0IGNoaWxkCi0gICAgICAgICAgICAgICAgLSBwcm9qZWN0cyBtYXkgcmVkZWNsYXJlIHRoaXMgcGx1Z2luIGFuZCBwcm92aWRlIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIHNldHRpbmdzCi0gICAgICAgICAgICAgICAgLSB0byB1c2UgZGlmZmVyZW50IGNoZWNrcyAobW9yZSBvciBsZXNzIHN0cmljdCB0aGFuIHRoZSBkZWZhdWx0KS4KLSAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGVja3N0eWxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+dmVyaWZ5LXN0eWxlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNoZWNrPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlnTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdGFuZGFyZC54bWw8L2NvbmZpZ0xvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aGVhZGVyTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWhlYWRlci50eHQ8L2hlYWRlckxvY2F0aW9uPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBTZXQgY29tcGlsZSBzb3VyY2UgYXQgMS41LCBzaW5jZSB0aGUgdGFyZ2V0IEpTRiBpbXBsIGlzIDEuMiAtLT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgotICAgICAgICAgICAgICAgICAgICA8b3B0aW1pemU+ZmFsc2U8L29wdGltaXplPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotICAgIDxyZXBvc2l0b3JpZXM+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPm1hdmVuMi1yZXBvc2l0b3J5LmRldi5qYXZhLm5ldDwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5KYXZhLm5ldCBSZXBvc2l0b3J5IGZvciBNYXZlbjwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL2Rvd25sb2FkLmphdmEubmV0L21hdmVuLzEvPC91cmw+Ci0gICAgICAgICAgICA8bGF5b3V0PmxlZ2FjeTwvbGF5b3V0PgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgPC9yZXBvc2l0b3JpZXM+Ci0KLSAgICA8cmVwb3J0aW5nPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWp4ci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXJlcG9ydC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40LjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBtZC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cnVsZXNldHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvYmFzaWMueG1sPC9ydWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL3VudXNlZGNvZGUueG1sPC9ydWxlc2V0PgotICAgICAgICAgICAgICAgICAgICA8L3J1bGVzZXRzPgotICAgICAgICAgICAgICAgICAgICA8bGlua1hyZWY+dHJ1ZTwvbGlua1hyZWY+Ci0gICAgICAgICAgICAgICAgICAgIDxtaW5pbXVtVG9rZW5zPjEwMDwvbWluaW11bVRva2Vucz4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldEpkaz4xLjU8L3RhcmdldEpkaz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1jaGVja3Mtc3RhbmRhcmQueG1sPC9jb25maWdMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGhlYWRlckxvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1oZWFkZXIudHh0PC9oZWFkZXJMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvcmVwb3J0aW5nPgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzFfcmNwYXJlbnQ8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMV9yY3BhcmVudDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzFfcmNwYXJlbnQ8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgICAgICA8c25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICAgICAgPHVuaXF1ZVZlcnNpb24+ZmFsc2U8L3VuaXF1ZVZlcnNpb24+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLnNuYXBzaG90czwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgTWF2ZW4gU25hcHNob3QgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgPHNpdGU+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTE8L3VybD4KLSAgICAgICAgPC9zaXRlPgotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtYXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wZXJmb3JtUmVsZWFzZTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvY3M8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxqc2YudmVyc2lvbj4xLjEuNTwvanNmLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlLzFfMV8xX3JjL3BhcmVudC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODNjYTY3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSAtLS0tLS0NCi1PdmVydmlldw0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMQ0KLQ0KLSAgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgcHJvdmlkZXMgdmVyc2lvbnMgZm9yIEpTRiAxLjEgYW5kIDEuMg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvcGFyZW50L3NyYy9zaXRlL3NpdGUueG1sIGIvcHJlcGFyZS8xXzFfMV9yYy9wYXJlbnQvc3JjL3NpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YTRiNGIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy9wYXJlbnQvc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgbmFtZT0iQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IiPgotICA8YmFubmVyTGVmdD4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlczwvbmFtZT4KLSAgICA8c3JjPmltZy9iYW5uZXJzL015RmFjZXNfbG9nby5qcGc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWw8L2hyZWY+Ci0gIDwvYmFubmVyTGVmdD4KLQotICA8YmFubmVyUmlnaHQ+Ci0gICAgPG5hbWU+QXBhY2hlIEJhbm5lcjwvbmFtZT4KLSAgICA8c3JjPmltZy9iYW5uZXJzL2FwYWNoZV9iYW5uZXIucG5nPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvaHJlZj4KLSAgPC9iYW5uZXJSaWdodD4gIAotCi0gIDxwdWJsaXNoRGF0ZSBmb3JtYXQ9ImRkIE1NTSB5eXl5Ii8+Ci0KLSAgPHNraW4+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLm1hdmVuPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtc2l0ZS1za2luPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvc2tpbj4KLQotICA8Ym9keT4KLSAgICA8bGlua3M+Ci0gICAgICA8aXRlbSBuYW1lPSJBcGFjaGUiIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZyIvPgotICAgICAgPGl0ZW0gbmFtZT0iTXlGYWNlcyIgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCBNeWZhY2VzIEV4dFZhbCIgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9kb3dubG9hZC5odG1sIi8+Ci0gICAgPC9saW5rcz4KLQotICAgIDxtZW51IG5hbWU9IkFwYWNoZSBNeUZhY2VzIiBpbmhlcml0PSJ0b3AiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZG93bmxvYWQuaHRtbCIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IG5hbWU9IkNvbnRlbnRzIiBpbmhlcml0PSJ0b3AiPgotICAgICAgICA8aXRlbSBuYW1lPSJNYWluIFNpdGUiICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sIi8+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkV4dFZhbCBmb3IgSlNGIDEuMSIgICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJDb3JlIE1vZHVsZSIgICAgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS9teWZhY2VzLWV4dHZhbC1jb3JlL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iUHJvcGVydHkgVmFsaWRhdGlvbiIgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvdmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbi9pbmRleC5odG1sIi8+Ci0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IlRyaW5pZGFkIFN1cHBvcnQiICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExL2NvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0L2luZGV4Lmh0bWwiLz4KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iR2VuZXJpYyBTdXBwb3J0IiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydC9pbmRleC5odG1sIi8+Ci0gICAgICAgIDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iTXlmYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMiIgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvaW5kZXguaHRtbCIgY29sbGFwc2U9InRydWUiPgotICAgICAgICAgICAgPGl0ZW0gbmFtZT0iZHVtbXkiICAgICAgICBocmVmPSJkdW1teSIvPgotICAgICAgICA8L2l0ZW0+Ci0gICAgPC9tZW51PgotCQotICAgIDxtZW51IG5hbWU9IkRvY3VtZW50YXRpb24iPgotICAgICAgICA8aXRlbSBuYW1lPSJXaWtpIiAgICAgICAgIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvbXlmYWNlcy9FeHRlbnNpb25zL1ZhbGlkYXRvci8iLz4KLSAgICA8L21lbnU+Ci0KLSAgICA8bWVudSByZWY9InJlcG9ydHMiLz4KLQotICAgIDxtZW51IG5hbWU9IkZvdW5kYXRpb24iIGluaGVyaXQ9ImJvdHRvbSI+Ci0gICAgICA8aXRlbSBuYW1lPSJBU0YiICAgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlNwb25zb3JzaGlwIiAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9zcG9uc29yc2hpcC5odG1sIiAvPgotICAgICAgPGl0ZW0gbmFtZT0iVGhhbmtzIiAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3RoYW5rcy5odG1sIiAvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy9wb20ueG1sIGIvcHJlcGFyZS8xXzFfMV9yYy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWQ3NzMxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+NjwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1tb2R1bGU8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4xLjE8L3ZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBNb2R1bGU8L25hbWU+Ci0gICAgPHVybD5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTE8L3VybD4KLSAgICAKLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMV9yYzwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8xX3JjPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMV9yYzwvdXJsPgotICAgIDwvc2NtPiAgICAKLQotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgICAgICA8c25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICAgICAgPHVuaXF1ZVZlcnNpb24+ZmFsc2U8L3VuaXF1ZVZlcnNpb24+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLnNuYXBzaG90czwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgTWF2ZW4gU25hcHNob3QgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgPHNpdGU+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTI8L3VybD4KLSAgICAgICAgPC9zaXRlPgotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotICAgIDwhLS0gV0FSTklORzogRE8gTk9UIEdFTkVSQVRFIFNJVEUgRlJPTSBIRVJFIERJUkVDVExZCi0gICAgU2luY2UgdGhpcyBwcm9qZWN0IGhhcyBhbiBhc3luYyByZWxlYXNlIHByb2NlZHVyZSAobm90Ci0gICAgYWxsIG1vZHVsZXMgc2hvdWxkIGJlIHJlbGVhc2VkIGF0IG9uY2UpLCB0aGUgcGFyZW50IHBvbS54bWwgCi0gICAgaXMgbm90IHRoaXMgKHRoZXJlIGlzIGEgbW9kdWxlIGZvciB0aGF0KS4gVXNlIG1hdmVuIHNpdGUgCi0gICAgcGx1Z2luIGhlcmUgY2F1c2UgcHJvYmxlbXMgd2hlbiB0aGUgc2l0ZSBpcyBnZW5lcmF0ZWQuCi0gICAgVGhlIHByb2NlZHVyZSBtdXN0IGV4ZWN1dGUgc2l0ZSBjb21tbWFuZCBmaXJzdCBvbiBwYXJlbnQgCi0gICAgbW9kdWxlIGFuZCB0aGVuIG9uIGVhY2ggbW9kdWxlIGxpc3RlZCBiZWxvdy4gCi0gICAgIC0tPgotCi0gICAgPG1vZHVsZXM+Ci0gICAgICAgIDxtb2R1bGU+cGFyZW50PC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+Y29yZTwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPnZhbGlkYXRpb24tbW9kdWxlczwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmNvbXBvbmVudC1zdXBwb3J0PC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+ZXhhbXBsZXM8L21vZHVsZT4KLSAgICA8L21vZHVsZXM+Ci0KLSAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDwhLS0gVGhpcyBwcm9maWxlIGlzIGludm9rZWQgYnkgLURwcmVwYXJlUmVsZWFzZT10cnVlLiAgVGhpcyBhbGxvd3MgbXZuIHJlbGVhc2U6cHJlcGFyZSB0bwotICAgICAgICAgICAgcnVuIHN1Y2Nlc3NmdWxseSBvbiB0aGUgYXNzZW1ibHkgcHJvamVjdHMuIC0tPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5wcmVwYXJlLXJlbGVhc2U8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wcmVwYXJlUmVsZWFzZTwvbmFtZT4KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPG1vZHVsZXM+Ci0gICAgICAgICAgICAgICAgPG1vZHVsZT5hc3NlbWJseTwvbW9kdWxlPgotICAgICAgICAgICAgPC9tb2R1bGVzPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVsZWFzZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnRzPi1EcHJlcGFyZVJlbGVhc2U8L2FyZ3VtZW50cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotICAgIDwvcHJvZmlsZXM+Ci0gICAgCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxqc2YudmVyc2lvbj4xLjEuNTwvanNmLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTFkYTM2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgVmFsaWRhdGlvbi1Nb2R1bGVzPC9uYW1lPgotICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzFfcmN2YWxpZGF0aW9uLW1vZHVsZXM8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMV9yY3ZhbGlkYXRpb24tbW9kdWxlczwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzFfcmN2YWxpZGF0aW9uLW1vZHVsZXM8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxtb2R1bGVzPgotICAgICAgICA8bW9kdWxlPnByb3BlcnR5LXZhbGlkYXRpb248L21vZHVsZT4KLSAgICAgICAgPCEtLW1vZHVsZT5iZWFuLXZhbGlkYXRpb248L21vZHVsZS0tPgotICAgIDwvbW9kdWxlcz4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyY2YyYmMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBQcm9wZXJ0eS1WYWxpZGF0aW9uLU1vZHVsZTwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPnZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgucGVyc2lzdGVuY2U8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5wZXJzaXN0ZW5jZS1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgICAgICA8IS0tIFRlc3QgZGVwZW5kZW5jaWVzIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0LmpzcDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnNoYWxlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2hhbGUtdGVzdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC40PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40LjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL0Fic3RyYWN0Ki5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovVGVzdFV0aWxzLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qQmVhbi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgICAgICAgICAgIAotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODU0YmY2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQw0KLSAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKYXZhU2VydmVyIEZhY2VzIENvbmZpZyAxLjAvL0VOIg0KLSAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzEuZHRkIiA+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGZhY2VzLWNvbmZpZz4NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotDQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWM0ODdkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFNlY3JldDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVMaXN0Ym94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVSYWRpbzsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueU1lbnU7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dGFyZWE7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBjb25maWd1cmVSZXF1aXJlZEF0dHJpYnV0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7Ci0gICAgICAgIGNvbmZpZ3VyZU1heExlbmd0aEF0dHJpYnV0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlUmVxdWlyZWRBdHRyaWJ1dGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYoIXByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZigoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQpKSB8fAotICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICAgICAgJiYKLSAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMoaXNDb21wb25lbnRSZXF1aXJlZCh1aUNvbXBvbmVudCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpICYmCi0gICAgICAgICAgICAgICAhQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lUmFkaW8gfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TGlzdGJveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpZiB0aGVyZSBpcyBubyBzcGVjaWFsIGF0dHJpYnV0ZSBhdCB0aGUgY29tcG9uZW50IHdoaWNoIHNob3VsZCBvdmVycnVsZQotICAgICAqIHRoZSBhbm5vdGF0ZWQgcHJvcGVydHkgcmV0dXJuIHRydWUhCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgY29tcG9uZW50IHdoaWNoIGltcGxlbWVudHMgdGhlIEVkaXRhYmxlVmFsdWVIb2xkZXIgaW50ZXJmYWNlCi0gICAgICogQHJldHVybiBmYWxzZSB0byBvdmVycnVsZSB0aGUgYW5ub3RhdGVkIHByb3BlcnR5IGUuZy4gaWYgY29tcG9uZW50IGlzIHJlYWRvbmx5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEJvb2xlYW4gaXNDb21wb25lbnRSZXF1aXJlZChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNSZWFkb25seSIpKSk7Ci0gICAgICAgIGJvb2xlYW4gaXNEaXNhYmxlZCA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNEaXNhYmxlZCIpKSk7Ci0KLSAgICAgICAgcmV0dXJuICEoaXNSZWFkT25seSB8fCBpc0Rpc2FibGVkKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVNYXhMZW5ndGhBdHRyaWJ1dGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1heExlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCk7Ci0KLSAgICAgICAgICAgIGlmKCEobWF4TGVuZ3RoIGluc3RhbmNlb2YgSW50ZWdlcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEh0bWxJbnB1dFRleHQgaHRtbElucHV0VGV4dCA9IChIdG1sSW5wdXRUZXh0KXVpQ29tcG9uZW50OwotICAgICAgICAgICAgICAgIGh0bWxJbnB1dFRleHQuc2V0TWF4bGVuZ3RoKChJbnRlZ2VyKW1heExlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4NDNmMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0U2VjcmV0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZUxpc3Rib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZU1lbnU7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZVJhZGlvOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55Q2hlY2tib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlMaXN0Ym94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TWVudTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0YXJlYTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEh0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcgotewotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpCi0gICAgewotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKTsKLQotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gKFN0cmluZykgUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiZ2V0TGFiZWwiKSk7Ci0KLSAgICAgICAgICAgIGlmKGxhYmVsID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGFiZWwgPSB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL292ZXJyaWRlIHRoZSBsYWJlbCBpZiB0aGUgYW5ub3RhdGlvbiBwcm92aWRlcyBhIGxhYmVsCi0gICAgICAgICAgICBpZihtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxhYmVsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCwgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwoZmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lUmFkaW8gfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TGlzdGJveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxZjg0Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnJlY29yZGVyLkNyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyDQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcihuZXcgQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIoKSk7DQotDQotICAgICAgICBpbml0U3RhdGljU3RyYXRlZ3lNYXBwaW5ncygpOw0KLSAgICAgICAgaW5pdERlZmF1bHRDb21wb25lbnRJbml0aWFsaXplcigpOw0KLSAgICAgICAgaW5pdERlZmF1bHRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKTsNCi0gICAgICAgIGFkZFNraXBWYWxpZGF0aW9uU3VwcG9ydCgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0U3RhdGljU3RyYXRlZ3lNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBqcGFCYXNlZFZhbGlkYXRpb24gPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9KUEFfQkFTRURfVkFMSURBVElPTjsNCi0gICAgICAgIGlmIChqcGFCYXNlZFZhbGlkYXRpb24gPT0gbnVsbA0KLSAgICAgICAgICAgICAgICB8fCAhanBhQmFzZWRWYWxpZGF0aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgPSBuZXcgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZygNCi0gICAgICAgICAgICAgICAgRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgKyIuanBhX3N0cmF0ZWd5X21hcHBpbmdzIik7DQotDQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkU3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRywgc3RhdGljQ29uZmlnKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAid2ViLnhtbCBwYXJhbWV0ZXIgdG8gZGVhY3RpdmF0ZSBpdCIpDQotICAgIHByaXZhdGUgdm9pZCBpbml0RGVmYXVsdENvbXBvbmVudEluaXRpYWxpemVyKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ3ZWIueG1sIHBhcmFtZXRlciB0byBkZWFjdGl2YXRlIGl0IikNCi0gICAgcHJpdmF0ZSB2b2lkIGluaXREZWZhdWx0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKA0KLSAgICAgICAgICAgICAgICBuZXcgSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRTa2lwVmFsaWRhdGlvblN1cHBvcnQoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJhZGRpbmcgc3VwcG9ydCBmb3IgQFNraXBWYWxpZGF0aW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5kZW55UmVuZGVyZXJJbnRlcmNlcHRvcihWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKG5ldyBWYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0KCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yV2l0aFNraXBWYWxpZGF0aW9uU3VwcG9ydC5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNmE3MjEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkludGVyY2VwdG9yV2l0aFNraXBWYWxpZGF0aW9uU3VwcG9ydCBleHRlbmRzIFZhbGlkYXRpb25JbnRlcmNlcHRvcgotewotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIHNraXBWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpCi0gICAgewotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KFNraXBWYWxpZGF0aW9uU3VwcG9ydC5jbGFzcykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJvb2xlYW4gc2tpcFZhbGlkYXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlNLSVBfVkFMSURBVElPTiwgQm9vbGVhbi5jbGFzcyk7Ci0KLSAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMoc2tpcFZhbGlkYXRpb24pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJ2YWxpZGF0aW9uIG9mICIgKyB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGNhbmNlbGVkIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZih2YWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGFuY2VvZiBTa2lwVmFsaWRhdGlvblN0cmF0ZWd5KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgbnVsbCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmVlYjI4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRvY3VtZW50YXRpb24iKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NRVNTQUdFU19KUEEgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJKUEFfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFUyIpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfSlBBX0JBU0VEX1ZBTElEQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OIik7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0RvdWJsZVJhbmdlLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTYxYzFjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0RvdWJsZVJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgRG91YmxlUmFuZ2UNCi17DQotICAgIGRvdWJsZSBtaW5pbXVtKCkgZGVmYXVsdCAwOw0KLQ0KLSAgICBkb3VibGUgbWF4aW11bSgpIGRlZmF1bHQgRG91YmxlLk1BWF9WQUxVRTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vSm9pblZhbGlkYXRpb24uamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YjUyYmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vSm9pblZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBKb2luVmFsaWRhdGlvbg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTGVuZ3RoLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1MmZmYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBMZW5ndGgNCi17DQotICAgIGludCBtaW5pbXVtKCkgZGVmYXVsdCAwOw0KLQ0KLSAgICBpbnQgbWF4aW11bSgpIGRlZmF1bHQgSW50ZWdlci5NQVhfVkFMVUU7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlOTI5NDQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgTG9uZ1JhbmdlDQotew0KLSAgICBsb25nIG1pbmltdW0oKSBkZWZhdWx0IDA7DQotDQotICAgIGxvbmcgbWF4aW11bSgpIGRlZmF1bHQgTG9uZy5NQVhfVkFMVUU7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1BhdHRlcm4uamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1BhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU0OWI5YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLUBSZXRlbnRpb24oUlVOVElNRSkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIEBpbnRlcmZhY2UgUGF0dGVybgotewotICAgIFN0cmluZ1tdIHZhbHVlKCk7Ci0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAibm9fbWF0Y2giOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUmVxdWlyZWQuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNjViM2MuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUmVxdWlyZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBSZXF1aXJlZA0KLXsNCi0gICAgLyoqDQotICAgICAqIHRvIGN1c3RvbWl6ZSB0aGUgZXJyb3IgbWVzc2FnZSBvcg0KLSAgICAgKiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBqc2YgcmVxdWlyZWQgbWVzc2FnZSB3aXRoIHRoZSB1c2FnZSBvZiB0aGUgbWVzc2FnZSByZXNvbHZlciBtZWNoYW5pc20NCi0gICAgICoNCi0gICAgICogQHJldHVybiBhbiBvcHRpb25hbCBlcnJvciBtZXNzYWdlIGtleQ0KLSAgICAgKi8NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImZpZWxkX3JlcXVpcmVkIjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb24uamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNjc2YjYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotQFJldGVudGlvbihSVU5USU1FKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgQGludGVyZmFjZSBTa2lwVmFsaWRhdGlvbgotewotICAgIFN0cmluZ1tdIHZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTk5NWJhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRhcmdldChUWVBFKQotQFJldGVudGlvbihSVU5USU1FKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgQGludGVyZmFjZSBTa2lwVmFsaWRhdGlvblN1cHBvcnQKLXsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1ZhbGlkYXRvci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OTQwYzYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgVmFsaWRhdG9yDQotew0KLSAgICBDbGFzczw/IGV4dGVuZHMgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcj5bXSB2YWx1ZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhM2RiNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvciBleHRlbmRzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcgotewotICAgIEBPdmVycmlkZQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkKLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsKLQotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBQcm9wZXJ0eURldGFpbHMpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG9iamVjdC5nZXRDbGFzcygpICsgIiBpcyBub3QgYSAiICsgUHJvcGVydHlEZXRhaWxzLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gKFByb3BlcnR5RGV0YWlscylvYmplY3Q7Ci0KLSAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCk7Ci0KLSAgICAgICAgLy9UT0RPIHRlc3Qgd2l0aCBjb21wbGV4IGNvbXBvbmVudHMKLSAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5zZXRJbmZvcm1hdGlvbigKLSAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIHByb3BlcnR5RGV0YWlscyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZmluZCBhbmQgYWRkIGFubm90YXRpb25zCi0gICAgICAgICAqLwotICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlODAxMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPVRoZSByZXF1aXJlZCBmb3JtYXRlIGlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdhYjU0My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPVx1MDYyN1x1MDY0NFx1MDYzNVx1MDY0YVx1MDYzYVx1MDYyOSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2MjZcdTA2MjkNCi1ub19tYXRjaF9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjM1XHUwNjRhXHUwNjNhXHUwNjI5IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzN1x1MDY0NFx1MDY0OFx1MDYyOFx1MDYyOSBcdTA2NDdcdTA2NDk6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGQ2NDkwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW5vX21hdGNoPUZvcm1hdCBpbnZcdTAwZTBsaWQKLW5vX21hdGNoX2RldGFpbD1FbCBmb3JtYXQgcmVxdWVyaXQgXHUwMGU5czogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZTcwMWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1Vbmf8bHRpZ2VzIEZvcm1hdA0KLW5vX21hdGNoX2RldGFpbD1EYXMgZXJmb3JkZXJsaWNoZSBGb3JtYXQgaXN0OiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlODAxMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPVRoZSByZXF1aXJlZCBmb3JtYXRlIGlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiMTA3Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXRvIGludlx1MDBlMWxpZG8gCi1ub19tYXRjaF9kZXRhaWw9RWwgZm9ybWF0byByZXF1ZXJpZG8gZXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjBhMjIzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9TGUgZm9ybWF0IGVzdCBpbnZhbGlkZQ0KLW5vX21hdGNoX2RldGFpbD1MZSBmb3JtYXQgZG9pdCAmZWNpcmM7dHJlIGRlIGxhIGZvcm1lOiB7MH0NCi0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE4NzQ4Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXRvIG5vbiB2YWxpZG8KLW5vX21hdGNoX2RldGFpbD1JbCBmb3JtYXRvIHJpY2hpZXN0byAmZWdyYXZlOzogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NGJjNzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1HZVx1MDBlN2Vyc2l6IGJpXHUwMGU3aW0NCi1ub19tYXRjaF9kZXRhaWw9Z2VyZWtlbiBiaVx1MDBlN2ltOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZTk2N2EuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgICAgIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZU5hbWUgPSBudWxsOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VOYW1lID0gc3VwZXIuZ2V0QmFzZU5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBiYXNlTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9KcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTRlY2UzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIHRoZSBqcGEgc3VwcG9ydCBpcyBhbiBleGNlcHRpb24gaW4gdmlldyBvZiBzb21lIG1lY2hhbmlzbXMgLSBzbyB0aGVyZSdzIG5vIGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZS4NCi0gKiBpbnN0ZWFkIG9mIHRoZSBjb252ZW50aW9uIHRoZXJlIGlzIGEgZ2xvYmFsIHByb3BlcnR5IHRvIGhhdmUgYW4gYWx0ZXJuYXRpdmUgdG8gd2ViLnhtbCBjb25maWd1cmF0aW9uDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTID0gIkpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTIjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX05BTUUgPSBXZWJYbWxQYXJhbWV0ZXIuVkFMSURBVElPTl9NRVNTQUdFU19KUEE7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX05BTUUgPSBKcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MNCi0gICAgICAgICAgICAuZ2V0UGFja2FnZSgpLmdldE5hbWUoKS5yZXBsYWNlKCIubWVzc2FnZS5yZXNvbHZlciIsICIubWVzc2FnZS5idW5kbGUiKSsgIi5qcGFfbWVzc2FnZXMiOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYoQ1VTVE9NX0JBU0VfTkFNRSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBDVVNUT01fQkFTRV9OQU1FOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQkFTRV9OQU1FOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Eb3VibGVSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Eb3VibGVSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVkZDE4Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgRG91YmxlUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoRG91YmxlUmFuZ2UuY2xhc3MpOw0KLQ0KLSAgICAgICAgZG91YmxlIG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4sIG1pbmltdW0pOw0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCwgYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgaWYobWluaW11bSA+IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pvaW5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSm9pbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMwODgyZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSm9pbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3Rvci5EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKb2luTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yKCk7DQotDQotICAgICAgICBTdHJpbmdbXSB0YXJnZXRFeHByZXNzaW9ucyA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoSm9pblZhbGlkYXRpb24uY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdGFyZ2V0RXhwcmVzc2lvbiA6IHRhcmdldEV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogZXh0cmFjdG9yLmV4dHJhY3QoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMpLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOw0KLQ0KLSAgICAgICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyID0gRXh0VmFsVXRpbHMuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckZvclZhbGlkYXRpb25TdHJhdGVneSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1dEFsbChtZXRhRGF0YVRyYW5zZm9ybWVyLmNvbnZlcnRNZXRhRGF0YShlbnRyeSkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pwYU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYmZkYmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pwYU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQmFzaWM7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpwYU1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiaW1wbC4gdGhlIHJlc3QiKQ0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBtZXRhRGF0YS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmKGFubm90YXRpb24gaW5zdGFuY2VvZiBDb2x1bW4pDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoISgoQ29sdW1uKSBhbm5vdGF0aW9uKS5udWxsYWJsZSgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgsICgoQ29sdW1uKSBhbm5vdGF0aW9uKS5sZW5ndGgoKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKGFubm90YXRpb24gaW5zdGFuY2VvZiBCYXNpYykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighKChCYXNpYykgYW5ub3RhdGlvbikub3B0aW9uYWwoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihhbm5vdGF0aW9uIGluc3RhbmNlb2YgSWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vVE9ETyBpbXBsLiB0aGUgcmVzdCEhIQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9MZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYzVlZTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxlbmd0aDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIExlbmd0aCBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMZW5ndGguY2xhc3MpOw0KLQ0KLSAgICAgICAgaW50IG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RILCBtaW5pbXVtKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RILCBhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBpZihtaW5pbXVtID4gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ4NWUyZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTG9uZ1JhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTG9uZ1JhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKExvbmdSYW5nZS5jbGFzcyk7DQotDQotICAgICAgICBsb25nIG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4sIG1pbmltdW0pOw0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCwgYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgaWYobWluaW11bSA+IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1BhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0YTViNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQYXR0ZXJuTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgUGF0dGVybiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShQYXR0ZXJuLmNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4sIChhbm5vdGF0aW9uKS52YWx1ZSgpKTsNCi0NCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkgPSAoYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgICAgICBMb2NhbGUgY3VycmVudExvY2FsZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpOw0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSA9DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7DQotDQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnID0gRXh0VmFsVXRpbHMuZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAuZ2V0TWVzc2FnZSh2YWxpZGF0aW9uRXJyb3JNc2dLZXksIGN1cnJlbnRMb2NhbGUpOw0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFLCB2YWxpZGF0aW9uRXJyb3JNc2cpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGY1YWE3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9SZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1ZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxNzQ4OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uVmFsaWRhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIFZhbGlkYXRvciBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShWYWxpZGF0b3IuY2xhc3MpOw0KLQ0KLSAgICAgICAgQ2xhc3NbXSB2YWxpZGF0b3JzID0gYW5ub3RhdGlvbi52YWx1ZSgpOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBmb3IoQ2xhc3MgY3VycmVudENsYXNzIDogdmFsaWRhdG9ycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihjdXJyZW50Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpLnRvTG93ZXJDYXNlKCkuY29udGFpbnMoQ29tbW9uTWV0YURhdGFLZXlzLkVNQUlMKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbHVlLmFkZChDb21tb25NZXRhRGF0YUtleXMuRU1BSUwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB2YWx1ZS5hZGQoY3VycmVudENsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuQ1VTVE9NLCB2YWx1ZSk7DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvRG91YmxlUmFuZ2VTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3NTkzMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvRG91YmxlUmFuZ2VTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uRG91YmxlUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5Eb3VibGVSYW5nZVZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRG91YmxlUmFuZ2VTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotDQotICAgICAgICBEb3VibGVSYW5nZSBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShEb3VibGVSYW5nZS5jbGFzcyk7DQotICAgICAgICBEb3VibGVSYW5nZVZhbGlkYXRvciBkb3VibGVSYW5nZVZhbGlkYXRvciA9IChEb3VibGVSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigiamF2YXguZmFjZXMuRG91YmxlUmFuZ2UiKTsNCi0NCi0gICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnNldE1pbmltdW0oYW5ub3RhdGlvbi5taW5pbXVtKCkpOw0KLSAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bShhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Kb2luVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSm9pblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmQ0YTkxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Kb2luVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Kb2luVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5leHRyYWN0b3IuRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpvaW5WYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IoKTsNCi0NCi0gICAgICAgIFN0cmluZ1tdIHRhcmdldEV4cHJlc3Npb25zID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShKb2luVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdGFyZ2V0RXhwcmVzc2lvbiA6IHRhcmdldEV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogZXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCBwcm9wZXJ0eURldGFpbHMpLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBlbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gdmFsaWRhdGlvbiBzdHJhdGVneSBmb3VuZCBmb3IgIiArIGVudHJ5LmdldFZhbHVlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxNGQ4ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSnBhVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5CYXNpYzsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmU7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKcGFWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VGYWNlc0J1bmRsZSA9IGZhbHNlOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVEVfTEVOR1RIID0gImxlbmd0aCI7DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHZpb2xhdGlvbjsNCi0gICAgcHJpdmF0ZSBpbnQgbWF4TGVuZ3RoOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyk7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIENvbHVtbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZUNvbHVtbkFubm90YXRpb24oKENvbHVtbikgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBCYXNpYykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZUJhc2ljQW5ub3RhdGlvbigoQmFzaWMpIGFubm90YXRpb24sIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgSWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE9uZVRvT25lKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlT25lVG9PbmVBbm5vdGF0aW9uKChPbmVUb09uZSkgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBNYW55VG9PbmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVNYW55VG9PbmVBbm5vdGF0aW9uKChNYW55VG9PbmUpIGFubm90YXRpb24sIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ29sdW1uQW5ub3RhdGlvbihDb2x1bW4gY29sdW1uLCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICghY29sdW1uLm51bGxhYmxlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcNCi0gICAgICAgICAgICAgICAgJiYgY29sdW1uLmxlbmd0aCgpIDwgKChTdHJpbmcpIGNvbnZlcnRlZE9iamVjdCkubGVuZ3RoKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb24gPSBWQUxJREFURV9MRU5HVEg7DQotICAgICAgICAgICAgdGhpcy5tYXhMZW5ndGggPSBjb2x1bW4ubGVuZ3RoKCk7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihnZXRWYWxpZGF0aW9uRXJyb3JGYWNlc01hc3NhZ2UobnVsbCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUJhc2ljQW5ub3RhdGlvbihCYXNpYyBiYXNpYywgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoIWJhc2ljLm9wdGlvbmFsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU9uZVRvT25lQW5ub3RhdGlvbihPbmVUb09uZSBvbmVUb09uZSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFvbmVUb09uZS5vcHRpb25hbCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVNYW55VG9PbmVBbm5vdGF0aW9uKE1hbnlUb09uZSBtYW55VG9PbmUsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmICghbWFueVRvT25lLm9wdGlvbmFsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkNCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0ID09IG51bGwgfHwgY29udmVydGVkT2JqZWN0LmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb24gPSBDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQ7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihnZXRWYWxpZGF0aW9uRXJyb3JGYWNlc01hc3NhZ2UobnVsbCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKFZBTElEQVRFX0xFTkdUSC5lcXVhbHModGhpcy52aW9sYXRpb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAiZmllbGRfdG9vX2xvbmciOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAiZmllbGRfcmVxdWlyZWQiOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBzdXBlci5nZXRFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbik7DQotDQotICAgICAgICBpZiAoVkFMSURBVEVfTEVOR1RILmVxdWFscyh0aGlzLnZpb2xhdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgiezB9IiwgIiIgKyB0aGlzLm1heExlbmd0aCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHN1cGVyLnJlc29sdmVNZXNzYWdlKGtleSk7DQotICAgICAgICBTdHJpbmcgbWFya2VyID0gQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVI7DQotDQotICAgICAgICBpZigobWFya2VyICsga2V5ICsgbWFya2VyKS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnVzZUZhY2VzQnVuZGxlID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIGUpDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSBlLmdldEZhY2VzTWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgaWYodGhpcy51c2VGYWNlc0J1bmRsZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihWQUxJREFURV9MRU5HVEguZXF1YWxzKHRoaXMudmlvbGF0aW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdE1heGltdW1NZXNzYWdlKGZhY2VzTWVzc2FnZSwgdGhpcy5tYXhMZW5ndGgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5yZXBsYWNlV2l0aERlZmF1bHRSZXF1aXJlZE1lc3NhZ2UoZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xlbmd0aFN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTGVuZ3RoU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkMDU1OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTGVuZ3RoU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxlbmd0aDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkxlbmd0aFZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTGVuZ3RoU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgTGVuZ3RoIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKExlbmd0aC5jbGFzcyk7DQotICAgICAgICBMZW5ndGhWYWxpZGF0b3IgbGVuZ3RoVmFsaWRhdG9yID0gKExlbmd0aFZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigiamF2YXguZmFjZXMuTGVuZ3RoIik7DQotDQotICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWF4aW11bShhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBsZW5ndGhWYWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTG9uZ1JhbmdlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzU4MjAyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTG9uZ1JhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTG9uZ1JhbmdlVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMb25nUmFuZ2VTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotDQotICAgICAgICBMb25nUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTG9uZ1JhbmdlLmNsYXNzKTsNCi0gICAgICAgIExvbmdSYW5nZVZhbGlkYXRvciBsb25nUmFuZ2VWYWxpZGF0b3IgPSAoTG9uZ1JhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoImphdmF4LmZhY2VzLkxvbmdSYW5nZSIpOw0KLQ0KLSAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnNldE1pbmltdW0oYW5ub3RhdGlvbi5taW5pbXVtKCkpOw0KLSAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTU3YmZmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9QYXR0ZXJuU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5QYXR0ZXJuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0Ci1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFBhdHRlcm5TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneQotewotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LAotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbgotICAgIHsKLQotICAgICAgICBQYXR0ZXJuIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFBhdHRlcm4uY2xhc3MpOwotCi0gICAgICAgIGZvciAoU3RyaW5nIGV4cHJlc3Npb24gOiBhbm5vdGF0aW9uLnZhbHVlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICB8fCAhamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4uY29tcGlsZShleHByZXNzaW9uKS5tYXRjaGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdC50b1N0cmluZygpKS5tYXRjaGVzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihuZXcgRmFjZXNNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKS5yZXBsYWNlKCJ7MH0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgcmV0dXJuICgoUGF0dGVybikgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZXF1aXJlZFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOGY5OTYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFJlcXVpcmVkU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VGYWNlc0J1bmRsZSA9IGZhbHNlOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0ID09IG51bGwgfHwgY29udmVydGVkT2JqZWN0LmVxdWFscygiIikgfHwNCi0gICAgICAgICAgICAgICAgKGNvbnZlcnRlZE9iamVjdCBpbnN0YW5jZW9mIENvbGxlY3Rpb24gJiYgKChDb2xsZWN0aW9uKWNvbnZlcnRlZE9iamVjdCkuaXNFbXB0eSgpKSB8fA0KLSAgICAgICAgICAgICAgICAoY29udmVydGVkT2JqZWN0IGluc3RhbmNlb2YgTWFwICYmICgoTWFwKWNvbnZlcnRlZE9iamVjdCkuaXNFbXB0eSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWFzc2FnZShtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChSZXF1aXJlZCkgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHN1cGVyLnJlc29sdmVNZXNzYWdlKGtleSk7DQotICAgICAgICBTdHJpbmcgbWFya2VyID0gQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVI7DQotDQotICAgICAgICBpZigobWFya2VyICsga2V5ICsgbWFya2VyKS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnVzZUZhY2VzQnVuZGxlID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIGUpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMudXNlRmFjZXNCdW5kbGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKGUuZ2V0RmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIGUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvU2tpcFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGFkYWM2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBTa2lwVmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgVmFsaWRhdGlvblN0cmF0ZWd5Ci17Ci0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nW10gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbnMgPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFNraXBWYWxpZGF0aW9uLmNsYXNzKS52YWx1ZSgpOwotCi0gICAgICAgIGZvcihTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA6IHZhbHVlQmluZGluZ0V4cHJlc3Npb25zKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihCb29sZWFuLlRSVUUuZXF1YWxzKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0VmFsdWVPZkV4cHJlc3Npb24oCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKSkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1ldGFEYXRhRW50cnkuc2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9WYWxpZGF0b3JTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiM2NjOTEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFZhbGlkYXRvclN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yPltdIHZhbGlkYXRvckNsYXNzZXMgPQ0KLSAgICAgICAgICAgIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoVmFsaWRhdG9yLmNsYXNzKS52YWx1ZSgpOw0KLQ0KLSAgICAgICAgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvciB2YWxpZGF0b3I7DQotICAgICAgICBmb3IgKENsYXNzIHZhbGlkYXRvckNsYXNzTmFtZSA6IHZhbGlkYXRvckNsYXNzZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdG9yID0gKGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3IpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgIC50cnlUb0luc3RhbnRpYXRlQ2xhc3ModmFsaWRhdG9yQ2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAodmFsaWRhdG9yID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHZhbGlkYXRvckNsYXNzTmFtZS5nZXROYW1lKCkgKyAiIG5vdCBmb3VuZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTY2YTQxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5LkFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjZXNFeGNlcHRpb247DQotDQotLyoqDQotICogVGhpcyBwaGFzZSBsaXN0ZW5lciBwcm9jZXNzZXMgY3Jvc3MgdmFsaWRhdGlvbiBhcyBzb29uIGFzIGl0IGZpbmRzIGEgc3BlY2lhbCByZXF1ZXN0IHNjb3BlZCBzdG9yYWdlLjxici8+DQotICogU28gaXQncyBwb3NzaWJsZSB0byBhZGQgaW5mb3JtYXRpb24gZHVyaW5nIHRoZSBwcm9jZXNzIHZhbGlkYXRpb24gcGhhc2UuIEF0IHRoZSBlbmQgb2YgdGhpcyBwaGFzZSBpdCBnZXRzIHByb2Nlc3NlZC4NCi0gKiBBZnRlciB0aGF0IHRoZSBzdG9yYWdlIGdldHMgcmVzZXRlZC48cC8+DQotICogSWYgeW91IHByb3ZpZGUgYSBjdXN0b20gZXh0ZW5zaW9uIGFuZCB5b3UgYWRkIHRoZSBzYW1lIHN0b3JhZ2UgdHlwZSB3aXRoaW4gYSBkaWZmZXJlbnQgcGhhc2UsDQotICogaXQgYWxzbyBnZXRzIHByb2Nlc3NlZCBhdCB0aGUgZW5kIG9mIHRoYXQgcGhhc2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UgPSBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCk7DQotICAgICAgICAgICAgZm9yIChDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkgOiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkgaW5zdGFuY2VvZiBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5nZXRDbGFzcygpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5pdENyb3NzVmFsaWRhdGlvbiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5wcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKGVudHJ5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhZGRNZXNzYWdlID0gdHJ1ZTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpIGluc3RhbmNlb2YgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1lc3NhZ2UgPSAoQm9vbGVhbilSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkuZ2V0Q2xhc3MoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuY2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0Q2xhc3MoKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmKGFkZE1lc3NhZ2UpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjZXNNZXNzYWdlICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldEZhY2VzQ29udGV4dCgpLmFkZE1lc3NhZ2UoZW50cnkuZ2V0Q2xpZW50SWQoKSwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RmFjZXNDb250ZXh0KCkucmVuZGVyUmVzcG9uc2UoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGZpbmFsbHkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5yZXNldENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzSW5pdGlhbGl6ZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NST1NTVkFMSURBVElPTiAhPSBudWxsDQotICAgICAgICAgICAgICAgICAgICAmJiBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgSnNmVXRpbHMuZGVyZWdpc3RlclBoYXNlTGlzdGVuZXIodGhpcyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuQU5ZX1BIQVNFOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYjNkZjAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgTGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzID0gDQotICAgICAgICBuZXcgQXJyYXlMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcy5hZGQoZW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoTGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNGMwNDAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5LkNyb3NzVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5DQotew0KLSAgICBwcml2YXRlIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeTsNCi0gICAgLy9mb3IgY29tcGxleCBjb21wb25lbnRzIChlLmcuIGEgdGFibGUpIHN0b3JlcyB0aGUgb2JqZWN0IG9mIGVudHJ5ICgje2VudHJ5LnByb3BlcnR5fSkNCi0gICAgcHJpdmF0ZSBVSUNvbXBvbmVudCBjb21wb25lbnQ7DQotICAgIHByaXZhdGUgT2JqZWN0IGNvbnZlcnRlZE9iamVjdDsNCi0gICAgcHJpdmF0ZSBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIC8vanVzdCBmb3IgaW5wdXQgY29tcG9uZW50cyB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzIGUuZy4gZGF0YVRhYmxlLC4uLg0KLSAgICBwcml2YXRlIFN0cmluZyBjbGllbnRJZDsNCi0NCi0gICAgcHVibGljIE1ldGFEYXRhRW50cnkgZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUVudHJ5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhRW50cnkoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhRW50cnkgPSBtZXRhRGF0YUVudHJ5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBVSUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudChVSUNvbXBvbmVudCBjb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkT2JqZWN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZE9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZWRPYmplY3QoT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb252ZXJ0ZWRPYmplY3QgPSBjb252ZXJ0ZWRPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblN0cmF0ZWd5KENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3kgPSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjbGllbnRJZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGllbnRJZChTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1Byb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTMxM2Q4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogSW4gb3JkZXIgdG8gYnVpbGQgdXAgYSBtYXBwaW5nIHdoaWNoIGlzIHVzZWQgZm9yIGNyb3NzLXZhbGlkYXRpb24uCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ci17Ci0gICAgcHJpdmF0ZSBPYmplY3QgYmVhbjsKLSAgICBwcml2YXRlIE9iamVjdCBjb252ZXJ0ZWRWYWx1ZTsKLSAgICBwcml2YXRlIFVJQ29tcG9uZW50IGNvbXBvbmVudDsKLSAgICAvL2ZvciBjb21wbGV4IGNvbXBvbmVudHMgKGUuZy4gYSB0YWJsZSB0aGVyZSBhcmUgbXVsdGlwbGUgZW50cmllcyB3aXRoCi0gICAgLy90aGUgc2FtZSBrZXkgKGhlcmUgdGhlIGVsIGV4cHJlc3Npb24gI3tlbnRyeS5wcm9wZXJ0eX0pCi0gICAgLy9ob3dldmVyLCBkb24ndCBvdmVycmlkZSB0aGUgcHJldmlvdXMgZW50cnkgLSB0aGV5IGFybid0IHRoZSBzYW1lOwotICAgIHByaXZhdGUgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBmdXJ0aGVyRW50cmllczsKLSAgICAvL2p1c3QgZm9yIGlucHV0IGNvbXBvbmVudHMgd2l0aGluIGNvbXBsZXggY29tcG9uZW50cyBlLmcuIGRhdGFUYWJsZSwuLi4KLSAgICBwcml2YXRlIFN0cmluZyBjbGllbnRJZDsKLQotICAgIC8qCi0gICAgICogZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRCZWFuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJlYW4oT2JqZWN0IGJlYW4pCi0gICAgewotICAgICAgICB0aGlzLmJlYW4gPSBiZWFuOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlZFZhbHVlKE9iamVjdCBjb252ZXJ0ZWRWYWx1ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29udmVydGVkVmFsdWUgPSBjb252ZXJ0ZWRWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVUlDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21wb25lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KFVJQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNsaWVudElkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudElkKFN0cmluZyBjbGllbnRJZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBnZXRGdXJ0aGVyRW50cmllcygpCi0gICAgewotICAgICAgICByZXR1cm4gZnVydGhlckVudHJpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RnVydGhlckVudHJpZXMoTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBmdXJ0aGVyRW50cmllcykKLSAgICB7Ci0gICAgICAgIHRoaXMuZnVydGhlckVudHJpZXMgPSBmdXJ0aGVyRW50cmllczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3Zjg5Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0NST1NTVkFMSURBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OIik7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXMuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgxOTFjMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiRGF0ZUlzRW50cnkgKHZhbHVlT2YsIHR5cGUpIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBEYXRlSXMNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlT2YoKTsNCi0NCi0gICAgLyoNCi0gICAgICogb3B0aW9uYWwgc2VjdGlvbg0KLSAgICAgKi8NCi0NCi0gICAgRGF0ZUlzVHlwZSB0eXBlKCkgZGVmYXVsdCBEYXRlSXNUeXBlLnNhbWU7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICIiOw0KLQ0KLSAgICBTdHJpbmcgbm90QmVmb3JlRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJ3cm9uZ19kYXRlX25vdF9iZWZvcmUiOw0KLQ0KLSAgICBTdHJpbmcgbm90QWZ0ZXJFcnJvck1zZ0tleSgpIGRlZmF1bHQgIndyb25nX2RhdGVfbm90X2FmdGVyIjsNCi0NCi0gICAgU3RyaW5nIG5vdEVxdWFsRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJ3cm9uZ19kYXRlX25vdF9lcXVhbCI7DQotDQotICAgIGludCBlcnJvck1lc3NhZ2VEYXRlU3R5bGUoKSBkZWZhdWx0IERhdGVGb3JtYXQuTUVESVVNOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzVHlwZS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJc1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1ZjQ4Mi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYmVmb3JlT3JTYW1lLCBhZnRlck9yU2FtZSIpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGVudW0gRGF0ZUlzVHlwZQ0KLXsNCi0gICAgYmVmb3JlLCBhZnRlciwgc2FtZQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNDI0MDkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0VxdWFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBFcXVhbHMNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJkdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQiOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNjE2YTAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL05vdEVxdWFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBOb3RFcXVhbHMNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJkdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkIjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYjAxOWQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUmVxdWlyZWRJZg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWVPZigpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBvcHRpb25hbCBzZWN0aW9uDQotICAgICAqLw0KLQ0KLSAgICBSZXF1aXJlZElmVHlwZSBpcygpIGRlZmF1bHQgUmVxdWlyZWRJZlR5cGUubm90X2VtcHR5Ow0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZW1wdHlfZmllbGQiOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZlR5cGUuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTBhYzkwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgZW51bSBSZXF1aXJlZElmVHlwZQ0KLXsNCi0gICAgZW1wdHksIG5vdF9lbXB0eQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjYwNzU5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1JbnB1dCBpcyBkaWZmZXJlbnQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUlucHV0IGlzIGRpZmZlcmVudA0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotDQotd3JvbmdfZGF0ZT1Xcm9uZyBkYXRlDQotd3JvbmdfZGF0ZV9kZXRhaWw9V3JvbmcgZGF0ZQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZmOTNjNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9XHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0IFx1MDY0NVx1MDYyZVx1MDYyYVx1MDY0NFx1MDY0MQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0IFx1MDY0NVx1MDYyZVx1MDYyYVx1MDY0NFx1MDY0MQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9XHUwNjNhXHUwNjRhXHUwNjMxIFx1MDY0NVx1MDYzM1x1MDY0NVx1MDY0OFx1MDYyZCBcdTA2MjhcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgXHUwNjQ2IFx1MDY0MVx1MDYzMyBcdTA2NDJcdTA2NGFcdTA2NDVcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0DQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9XHUwNjNhXHUwNjRhXHUwNjMxIFx1MDY0NVx1MDYzM1x1MDY0NVx1MDY0OFx1MDYyZCBcdTA2MjhcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgIFx1MDY0Nlx1MDY0MVx1MDYzMyBcdTA2NDJcdTA2NGFcdTA2NDVcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0DQotDQotd3JvbmdfZGF0ZT1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjJlXHUwNjI3XHUwNjM3XHUwNjQ5XHUwNjIxDQotd3JvbmdfZGF0ZV9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDYyZVx1MDYyN1x1MDYzN1x1MDY0OVx1MDYyMQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDNcdTA2NDggXHUwNjQ2IFx1MDYyOFx1MDYzOVx1MDYyZiB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0MyBcdTA2NDhcdTA2NDYgXHUwNjI4XHUwNjM5XHUwNjJmIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0M1x1MDY0OCBcdTA2NDYgXHUwNjQyXHUwNjI4XHUwNjQ0IHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDMgXHUwNjQ4XHUwNjQ2IFx1MDY0Mlx1MDYyOFx1MDY0NCB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjQ0XHUwNjI3IFx1MDY0YVx1MDYzM1x1MDYyN1x1MDY0OFx1MDY0OSB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0NFx1MDYyNyBcdTA2NGFcdTA2MzNcdTA2MjdcdTA2NDhcdTA2NDkgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1NGVkMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPWVsIHZhbG9yIFx1MDBlOSBkaWZlcmVudAotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1lbCB2YWxvciBcdTAwZTkgZGlmZXJlbnQKLQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1ubyBlcyBwZXJtZXQgZWwgbWF0ZWl4IHZhbG9yCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1ubyBlcyBwZXJtZXQgZWwgbWF0ZWl4IHZhbG9yCi0KLXdyb25nX2RhdGU9ZGF0YSBlcnJcdTAwZjJuaWEKLXdyb25nX2RhdGVfZGV0YWlsPWRhdGEgZXJyXHUwMGYybmlhCi0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1sYSBkYXRhIGhhIGRlIHNlciBwb3N0ZXJpb3IgYSB7MH0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9bGEgZGF0YSBoYSBkZSBzZXIgcG9zdGVyaW9yIGEgezB9Ci0KLXdyb25nX2RhdGVfbm90X2FmdGVyPWxhIGRhdGEgaGEgZGUgc2VyIGFudGVyaW9yIGEgezB9Ci13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9bGEgZGF0YSBoYSBkZSBzZXIgcG9zdGVyaW9yIGEgezB9Ci0KLXdyb25nX2RhdGVfbm90X2VxdWFsPWxhIGRhdGEgbm8gXHUwMDBlOXMgaWd1YWwgYSB7MH0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1sYSBkYXRhIG5vIFx1MDAwZTlzIGlndWFsIGEgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4NzIzNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9RWluZ2FiZSBpc3QgdW50ZXJzY2hpZWRsaWNoDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1FaW5nYWJlIGlzdCB1bnRlcnNjaGllZGxpY2gNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPURlciBnbGVpY2hlIFdlcnQgaXN0IG5pY2h0IGVybGF1YnQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1EZXIgZ2xlaWNoZSBXZXJ0IGlzdCBuaWNodCBlcmxhdWJ0DQotDQotd3JvbmdfZGF0ZT1EYXR1bSBpbmtvcnJla3QNCi13cm9uZ19kYXRlX2RldGFpbD1EYXR1bSBpbmtvcnJla3QNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9RGFzIERhdHVtIG11c3MgbmFjaCBkZW0gezB9IHNlaW4NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPURhcyBEYXR1bSBtdXNzIG5hY2ggZGVtIHswfSBzZWluDQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9RGFzIERhdHVtIG11c3Mgdm9yIGRlbSB7MH0gc2Vpbg0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1EYXMgRGF0dW0gbXVzcyB2b3IgZGVtIHswfSBzZWluDQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9RGFzIERhdHVtIGVudHNwcmljaHQgbmljaHQgZGVtIHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1EYXMgRGF0dW0gZW50c3ByaWNodCBuaWNodCBkZW0gezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2MDc1OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9SW5wdXQgaXMgZGlmZmVyZW50DQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1JbnB1dCBpcyBkaWZmZXJlbnQNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLQ0KLXdyb25nX2RhdGU9V3JvbmcgZGF0ZQ0KLXdyb25nX2RhdGVfZGV0YWlsPVdyb25nIGRhdGUNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMzg1MjQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1sYSBlbnRyYWRhIGVzIGRpZmVyZW50ZQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1sYSBlbnRyYWRhIGVzIGRpZmVyZW50ZQotCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPW5vIHNlIHBlcm1pdGVuIGVudHJhZGFzIGlndWFsZXMKLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPW5vIHNlIHBlcm1pdGVuIGVudHJhZGFzIGlndWFsZXMKLQotd3JvbmdfZGF0ZT1mZWNoYSBlcXVpdm9jYWRhCi13cm9uZ19kYXRlX2RldGFpbD1mZWNoYSBlcXVpdm9jYWRhCi0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGx1ZWdvIGRlIHswfQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGx1ZWdvIGRlIHswfQotCi13cm9uZ19kYXRlX25vdF9hZnRlcj1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGFudGVzIGRlIHswfQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgYW50ZXMgZGUgezB9Ci0KLXdyb25nX2RhdGVfbm90X2VxdWFsPWxhIGZlY2hhIG5vIGVzIGlndWFsIGEgezB9Ci13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9bGEgZmVjaGEgbm8gZXMgaWd1YWwgYSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWYwMjE4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1MZXMgY2hhbXBzIHNvbnQgZGlmZiZlYWN1dGU7cmVudHMNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUxlcyBjaGFtcHMgc29udCBkaWZmJmVhY3V0ZTtyZW50cw0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9TGVzIGNoYW1wcyBkb2l2ZW50ICZlY2lyYzt0cmUgZGlmZiZlYWN1dGU7cmVudHMNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1MZXMgY2hhbXBzIGRvaXZlbnQgJmVjaXJjO3RyZSBkaWZmJmVhY3V0ZTtyZW50cw0KLQ0KLXdyb25nX2RhdGU9TGEgZGF0ZSBlc3QgaW5jb3JyZWN0ZQ0KLXdyb25nX2RhdGVfZGV0YWlsPUxhIGRhdGUgZXN0IGluY29ycmVjdGUNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXByJmVncmF2ZTtzIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXByJmVncmF2ZTtzIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGF2YW50IHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhdmFudCB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1MYSBkYXRlIG4nZXN0IHBhcyAmZWFjdXRlO2dhbGUgJmFncmF2ZTsgezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPUxhIGRhdGUgbidlc3QgcGFzICZlYWN1dGU7Z2FsZSAmYWdyYXZlOyB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDQyODAxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9VmFsb3JpIG5vbiB1Z3VhbGkKLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9SSB2YWxvcmkgaW5zZXJpdGkgbm9uIGNvaW5jaWRvbm8KLQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1MbyBzdGVzc28gdmFsb3JlIG5vbiAmZWdyYXZlOyBwZXJtZXNzbwotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9TG8gc3Rlc3NvIHZhbG9yZSBub24gJmVncmF2ZTsgcGVybWVzc28KLQotd3JvbmdfZGF0ZT1EYXRhIGVycmF0YQotd3JvbmdfZGF0ZV9kZXRhaWw9RGF0YSBlcnJhdGEKLQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPUxhIGRhdGEgZGV2ZSBlc3NlcmUgZG9wbyBkaSB7MH0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9TGEgZGF0YSBkZXZlIGVzc2VyZSBkb3BvIGRpIHswfQotCi13cm9uZ19kYXRlX25vdF9hZnRlcj1MYSBkYXRhIGRldmUgZXNzZXJlIHByaW1hIGRpIHswfQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPUxhIGRhdGEgZGV2ZSBlc3NlcmUgcHJpbWEgZGkgezB9Ci0KLXdyb25nX2RhdGVfbm90X2VxdWFsPUxhIGRhdGEgbm9uICZlZ3JhdmU7IHVndWFsZSBhIHswfQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPUxhIGRhdGEgbm9uICZlZ3JhdmU7IHVndWFsZSBhIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZjZhOWQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPWdpcmlsZW4gZGVcdTAxMWZlciBmYXJrbFx1MDEzMQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9Z2lyaWxlbiBkZVx1MDExZmVyIGZhcmtsXHUwMTMxDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1heW5cdTAxMzEgZGVcdTAxMWZlciBnaXJpbGVtZXoNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1heW5cdTAxMzEgZGVcdTAxMWZlciBnaXJpbGVtZXoNCi0NCi13cm9uZ19kYXRlPXlhbmxcdTAxMzFcdTAxNWYgdGFyaWgNCi13cm9uZ19kYXRlX2RldGFpbD15YW5sXHUwMTMxXHUwMTVmIHRhcmloDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gc29ucmEgb2xtYWxcdTAxMzFkXHUwMTMxcg0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBzb25yYSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBcdTAwZjZuY2Ugb2xtYWxcdTAxMzFkXHUwMTMxcg0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIFx1MDBmNm5jZSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmUgZVx1MDE1Zml0IGRlXHUwMTFmaWwNCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmUgZVx1MDE1Zml0IGRlXHUwMTFmaWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q3NjU5ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotICAgICAgICBleHRlbmRzDQotICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZiAoYmFzZU5hbWUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBiYXNlTmFtZSA9IHN1cGVyLmdldEJhc2VOYW1lKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gYmFzZU5hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWNvcmRlci9Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWNvcmRlci9Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzQwYTAzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcmVjb3JkZXIvQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5yZWNvcmRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXIuUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlciBpbXBsZW1lbnRzIFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXINCi17DQotICAgIHB1YmxpYyB2b2lkIHJlY29yZFVzZXJJbnB1dChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IHZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpZiAoISh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vdG8gc3VwcG9ydCBsb2NhbCBjcm9zcy12YWxpZGF0aW9uICh3aXRoaW4gdGhlIHNhbWUgZW50aXR5KQ0KLSAgICAgICAgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4ga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcgPSBDcm9zc1ZhbGlkYXRpb25VdGlscw0KLSAgICAgICAgICAgIC5nZXRPckluaXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpOw0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSBlbnRyeTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPQ0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgaWYocHJvcGVydHlEZXRhaWxzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBlbnRyeSA9IG5ldyBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5KCk7DQotICAgICAgICBlbnRyeS5zZXRCZWFuKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkpOw0KLSAgICAgICAgZW50cnkuc2V0Q29udmVydGVkVmFsdWUodmFsdWUpOw0KLSAgICAgICAgZW50cnkuc2V0Q29tcG9uZW50KHVpQ29tcG9uZW50KTsNCi0gICAgICAgIGVudHJ5LnNldENsaWVudElkKHVpQ29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGtleSA9IHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKTsNCi0NCi0gICAgICAgIC8vZm9yIGxvY2FsIGNyb3NzLXZhbGlkYXRpb24NCi0gICAgICAgIGlmIChrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5jb250YWluc0tleShrZXkpICYmDQotICAgICAgICAgICAga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcuZ2V0KGtleSkuZ2V0QmVhbigpICE9IG51bGwgJiYNCi0gICAgICAgICAgICAha2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcuZ2V0KGtleSkuZ2V0QmVhbigpLmVxdWFscyhlbnRyeS5nZXRCZWFuKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZm9yIHRoZSB2YWxpZGF0aW9uIHdpdGhpbiBhIGNvbXBsZXggY29tcG9uZW50IGUuZy4gYSB0YWJsZQ0KLSAgICAgICAgICAgIC8vZG9uJ3Qgb3ZlcnJpZGUgZXhpc3RpbmcgZXhwcmVzc2lvbiAoc3R5bGU6ICN7ZW50cnkucHJvcGVydHl9KSAtIG1ha2UgYSBzcGVjaWFsIG1hcHBpbmcNCi0NCi0gICAgICAgICAgICBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGZ1cnRoZXJFbnRyaWVzID0NCi0gICAgICAgICAgICAgICAga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcuZ2V0KGtleSkuZ2V0RnVydGhlckVudHJpZXMoKTsNCi0NCi0gICAgICAgICAgICBpZiAoZnVydGhlckVudHJpZXMgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZ1cnRoZXJFbnRyaWVzID0gbmV3IEFycmF5TGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PigpOw0KLQ0KLSAgICAgICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQoa2V5KS5zZXRGdXJ0aGVyRW50cmllcyhmdXJ0aGVyRW50cmllcyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZ1cnRoZXJFbnRyaWVzLmFkZChlbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9mb3Igbm9ybWFsIHZhbGlkYXRpb24NCi0gICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5wdXQoa2V5LCBlbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWVhNTA4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIExpc3Q8UmVmZXJlbmNpbmdTdHJhdGVneT4gcmVmZXJlbmNpbmdTdHJhdGVnaWVzOw0KLSAgICBwcm90ZWN0ZWQgTWFwPE9iamVjdCwgT2JqZWN0PiB2aW9sYXRpb25SZXN1bHRTdG9yYWdlID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIGluaXRSZWZlcmVuY2luZ1N0cmF0ZWdpZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UmVmZXJlbmNpbmdTdHJhdGVnaWVzKCkNCi0gICAgew0KLSAgICAgICAgaWYgKHJlZmVyZW5jaW5nU3RyYXRlZ2llcyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcyA9IG5ldyBBcnJheUxpc3Q8UmVmZXJlbmNpbmdTdHJhdGVneT4oKTsNCi0NCi0gICAgICAgICAgICBTdHJpbmcgY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneUNsYXNzTmFtZSA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQkFTRV9QQUNLQUdFKSArICJSZWZlcmVuY2luZ1N0cmF0ZWd5IjsNCi0NCi0gICAgICAgICAgICBSZWZlcmVuY2luZ1N0cmF0ZWd5IGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kgPSAoUmVmZXJlbmNpbmdTdHJhdGVneSkgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneUNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IEVMQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgICAgIC8vcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgQWxpYXNDb21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgTG9jYWxDb21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaW5pdFZhbGlkYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIFN0cmluZ1tdIHZhbGlkYXRpb25UYXJnZXRzID0gZ2V0VmFsaWRhdGlvblRhcmdldHMoDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0IDogdmFsaWRhdGlvblRhcmdldHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCA9IHZhbGlkYXRpb25UYXJnZXQudHJpbSgpOw0KLQ0KLSAgICAgICAgICAgIC8vc2VsZWN0IHZhbGlkYXRpb24gbWV0aG9kDQotICAgICAgICAgICAgdHJ5VG9WYWxpZGF0ZShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsIHZhbGlkYXRpb25UYXJnZXQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBmb3IgKFJlZmVyZW5jaW5nU3RyYXRlZ3kgcmVmZXJlbmNpbmdTdHJhdGVneSA6IHJlZmVyZW5jaW5nU3RyYXRlZ2llcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAocmVmZXJlbmNpbmdTdHJhdGVneS5ldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLCB2YWxpZGF0aW9uVGFyZ2V0LCB0aGlzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UsDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZUYXJnZXQpDQotICAgIHsNCi0gICAgICAgIGlmICghaGFuZGxlVGFyZ2V0VmlvbGF0aW9uKGVudHJ5T2ZTb3VyY2UsIGVudHJ5T2ZUYXJnZXQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICAvL2dldCB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgdGFyZ2V0IGNvbXBvbmVudA0KLSAgICAgICAgU3RyaW5nIHN1bW1hcnkgPSBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCB0cnVlKTsNCi0gICAgICAgIFN0cmluZyBkZXRhaWxzID0gZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCB0cnVlKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGlvbiB0YXJnZXQgaXNuJ3QgYm91bmQgdG8gYSBjb21wb25lbnQgd2l0aGluZyB0aGUgY3VycmVudCBwYWdlIA0KLSAgICAgICAgLy8oc2VlIHZhbGlkYXRlRm91bmRFbnRyeSwgdHJ5VG9WYWxpZGF0ZUxvY2FsbHkgYW5kIHRyeVRvVmFsaWRhdGVCaW5kaW5nT25seSkNCi0gICAgICAgIGlmIChlbnRyeU9mVGFyZ2V0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZW50cnlPZlRhcmdldCA9IGVudHJ5T2ZTb3VyY2U7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZTsNCi0gICAgICAgIGlmIChlbnRyeU9mVGFyZ2V0LmdldE1ldGFEYXRhRW50cnkoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1lc3NhZ2UgPSBnZXRUYXJnZXRDb21wb25lbnRFcnJvck1lc3NhZ2UoDQotICAgICAgICAgICAgICAgIGVudHJ5T2ZUYXJnZXQuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCBzdW1tYXJ5LCBkZXRhaWxzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8gZG9jdW1lbnQgcG9zc2libGUgc2lkZSBlZmZlY3RzDQotICAgICAgICAgICAgLy9kdWUgdG8gYSBtaXNzaW5nIHRhcmdldCBhbm5vdGF0aW9uIChzZWU6IHRyeVRvVmFsaWRhdGVMb2NhbGx5KQ0KLSAgICAgICAgICAgIG1lc3NhZ2UgPSBnZXRUYXJnZXRDb21wb25lbnRFcnJvck1lc3NhZ2UoDQotICAgICAgICAgICAgICAgIGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCBzdW1tYXJ5LCBkZXRhaWxzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICgobWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCB8fCBtZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwpICYmDQotICAgICAgICAgICAgZW50cnlPZlNvdXJjZS5nZXRDbGllbnRJZCgpICE9IG51bGwgJiYgIWVudHJ5T2ZTb3VyY2UuZ2V0Q2xpZW50SWQoKS5lcXVhbHMoZW50cnlPZlRhcmdldC5nZXRDbGllbnRJZCgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc0NvbnRleHQuYWRkTWVzc2FnZShlbnRyeU9mVGFyZ2V0LmdldENsaWVudElkKCksIG1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByb2Nlc3NTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKCFoYW5kbGVTb3VyY2VWaW9sYXRpb24oZW50cnlPZlNvdXJjZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9nZXQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldEVycm9yTWVzc2FnZVN1bW1hcnkoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIGZhbHNlKTsNCi0gICAgICAgIFN0cmluZyBkZXRhaWxzID0gZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCBmYWxzZSk7DQotDQotICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZSA9IGdldFNvdXJjZUNvbXBvbmVudEVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotDQotICAgICAgICBpZiAobWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCB8fCBtZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9UT0RPDQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihtZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG5ldyBGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEZhY2VzTWVzc2FnZSBnZXRTb3VyY2VDb21wb25lbnRFcnJvck1lc3NhZ2UoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgRmFjZXNNZXNzYWdlKCk7DQotDQotICAgICAgICBtZXNzYWdlLnNldFNldmVyaXR5KEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgICAgICBtZXNzYWdlLnNldFN1bW1hcnkoc3VtbWFyeSk7DQotICAgICAgICBtZXNzYWdlLnNldERldGFpbChkZXRhaWwpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEZhY2VzTWVzc2FnZSBnZXRUYXJnZXRDb21wb25lbnRFcnJvck1lc3NhZ2UoQW5ub3RhdGlvbiBmb3VuZEFubm90YXRpb24sIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZSA9IG5ldyBGYWNlc01lc3NhZ2UoKTsNCi0NCi0gICAgICAgIG1lc3NhZ2Uuc2V0U2V2ZXJpdHkoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgICAgIG1lc3NhZ2Uuc2V0U3VtbWFyeShzdW1tYXJ5KTsNCi0gICAgICAgIG1lc3NhZ2Uuc2V0RGV0YWlsKGRldGFpbCk7DQotDQotICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcmVzb2x2ZU1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcga2V5ID0gZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgICAgICByZXR1cm4gKGtleSAhPSBudWxsKSA/IHJlc29sdmVNZXNzYWdlKGtleSArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYKSA6IG51bGw7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdGhlIHVzYWdlIG9mIHRoaXMgbWV0aG9kIHJlcXVpcmVzIGEgbmV3IGluc3RhbmNlDQotICAgICAqIC0+IGluIGNhc2Ugb2YgdmFsaWRhdGlvbiBzdHJhdGVneSBiZWFucyBhcHBsaWNhdGlvbi9zaW5nbGV0b24gaXNuJ3QgYWxsb3dlZA0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFZhbGlkYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVRhcmdldFZpb2xhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlU291cmNlVmlvbGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gaGFuZGxlVGFyZ2V0VmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogYWJzdHJhY3QgbWV0aG9kcw0KLSAgICAgKi8NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0NCi0gICAgLyoNCi0gICAgICogaW1wbGVtZW50cyB0aGUgc3BlY2lmaWMgdmFsaWRhdGlvbiBsb2dpYw0KLSAgICAgKi8NCi0NCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLCBBbm5vdGF0aW9uIGFubm90YXRpb24pOw0KLQ0KLSAgICAvKg0KLSAgICAgKiByZXR1cm5zIHRoZSByZWZlcmVuY2VkIHZhbGlkYXRpb24gdGFyZ2V0cyBvZiB0aGUgYW5ub3RhdGlvbg0KLSAgICAgKiBlLmcuIEBEYXRlSXModHlwZSA9IERhdGVJc1R5cGUuYmVmb3JlLCB2YWx1ZSA9ICJmaW5hbEV4YW0iKQ0KLSAgICAgKiAtPiBtZXRob2QgcmV0dXJucyBhbiBhcnJheSB3aXRoIG9uZSB2YWx1ZSAoImZpbmFsRXhhbSIpDQotICAgICAqLw0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjODFiYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMNCi0gICAgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIC8vaW5pdCBjcm9zcy12YWxpZGF0aW9uDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkgPQ0KLSAgICAgICAgICAgIGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpLmFkZChlbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkgPSBuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KCk7DQotDQotICAgICAgICBlbnRyeS5zZXRNZXRhRGF0YUVudHJ5KG1ldGFEYXRhRW50cnkpOw0KLSAgICAgICAgZW50cnkuc2V0Q29tcG9uZW50KHVpQ29tcG9uZW50KTsNCi0gICAgICAgIGVudHJ5LnNldENsaWVudElkKHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCkpOw0KLSAgICAgICAgZW50cnkuc2V0Q29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICBlbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3kodGhpcyk7DQotDQotICAgICAgICByZXR1cm4gZW50cnk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IGF2YWlsYWJsZSBmb3IgY3Jvc3MgdmFsaWRhdGlvbiAtIHVzZSBwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbiIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldExhYmVsKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vdCBhdmFpbGFibGUgZm9yIGNyb3NzIHZhbGlkYXRpb24iKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgLy9ub3QgYXZhaWxhYmxlIGZvciBjcm9zcyB2YWxpZGF0aW9uIC0gdXNlIGluaXRDcm9zc1ZhbGlkYXRpb24NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q3Jvc3NWYWxpZGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCksDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwgdmFsaWRhdG9yRXhjZXB0aW9uLCB0aGlzKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvbkhlbHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZhMTA4OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneShBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSkNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiB2aW9sYXRpb25Gb3VuZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgaWYgKGNvbXBhcmVTdHJhdGVneS5pc1Zpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpDQotICAgICAgICB7DQotDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSA9IG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoKTsNCi0gICAgICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LnVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29tcG9uZW50KHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb21wb25lbnQoKSk7DQotICAgICAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDbGllbnRJZCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb21wb25lbnQoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENsaWVudElkKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDbGllbnRJZCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbnZlcnRlZE9iamVjdCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldFZhbGlkYXRpb25TdHJhdGVneShjb21wYXJlU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneQ0KLSAgICAgICAgICAgICAgICAgICAgLnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotDQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjN2Q4NzIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgIHZvaWQgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSkNCi0gICAgICAgICAgICB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0RhdGVJc1N0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0RhdGVJc1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzJkMjAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRGF0ZUlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXNUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEYXRlSXNTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUT09fRUFSTFkgPSAiZWFybHkiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUT09fTEFURSA9ICJsYXRlIjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UX0VRVUFMX0RBVEVfVElNRSA9ICJub3QgZXF1YWwiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfS0VZID0gInJlc3VsdCI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBUkVEX1ZBTFVFX0tFWSA9ICJ0YXJnZXQgdmFsdWUiOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZygNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiB2aW9sYXRpb25Gb3VuZDsNCi0NCi0gICAgICAgIGlmICgoKERhdGVJcykgYW5ub3RhdGlvbikudHlwZSgpLmVxdWFscyhEYXRlSXNUeXBlLnNhbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsICYmICFvYmplY3QxLmVxdWFscyhvYmplY3QyKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFU1VMVF9LRVksIE5PVF9FUVVBTF9EQVRFX1RJTUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKCgoRGF0ZUlzKSBhbm5vdGF0aW9uKS50eXBlKCkuZXF1YWxzKERhdGVJc1R5cGUuYmVmb3JlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IG9iamVjdDEgIT0gbnVsbCAmJiBvYmplY3QyICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFuZXcgRGF0ZSgoKERhdGUpIG9iamVjdDEpLmdldFRpbWUoKSkuYmVmb3JlKChEYXRlKSBvYmplY3QyKSB8fCBvYmplY3QxLmVxdWFscyhvYmplY3QyKSk7DQotDQotICAgICAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVNVTFRfS0VZLCBUT09fTEFURSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsICYmIG9iamVjdDIgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW5ldyBEYXRlKCgoRGF0ZSkgb2JqZWN0MSkuZ2V0VGltZSgpKS5hZnRlcigoRGF0ZSkgb2JqZWN0MikgfHwgb2JqZWN0MS5lcXVhbHMob2JqZWN0MikpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVTVUxUX0tFWSwgVE9PX0VBUkxZKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChDT01QQVJFRF9WQUxVRV9LRVksIG9iamVjdDEpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZpb2xhdGlvbkZvdW5kOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKERhdGVJcykgYW5ub3RhdGlvbikudmFsdWVPZigpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHByb3RlY3RlZA0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IChTdHJpbmcpIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5nZXQoUkVTVUxUX0tFWSk7DQotICAgICAgICBpZiAoVE9PX0VBUkxZLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROb3RBZnRlckVycm9yTXNnS2V5KChEYXRlSXMpIGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoVE9PX0xBVEUuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldE5vdEJlZm9yZUVycm9yTXNnS2V5KChEYXRlSXMpIGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROb3RFcXVhbEVycm9yTXNnS2V5KChEYXRlSXMpIGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KSwgYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgICAgICB9DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZShTdHJpbmcga2V5LCBBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gcmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0NCi0gICAgICAgIERhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCgoRGF0ZUlzKSBhbm5vdGF0aW9uKS5lcnJvck1lc3NhZ2VEYXRlU3R5bGUoKSwNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKSk7DQotDQotICAgICAgICAvL3JlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIG90aGVyIGNvbXBvbmVudA0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgiezB9IiwgZGF0ZUZvcm1hdC5mb3JtYXQoKERhdGUpIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5nZXQoQ09NUEFSRURfVkFMVUVfS0VZKSkpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHByaXZhdGUNCi0gICAgICovDQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5vdEFmdGVyRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpLmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24ubm90QWZ0ZXJFcnJvck1zZ0tleSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90QmVmb3JlRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpLmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24ubm90QmVmb3JlRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5vdEVxdWFsRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpLmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24ubm90RXF1YWxFcnJvck1zZ0tleSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2U1ZjlmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRUxDb21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLlByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiByZWZlcmVuY2luZyB2YWxpZGF0aW9uIHRhcmdldHMgLSBwb3NzaWJsZSBmb3JtYXRzOg0KLSAqICIje1tiZWFuX25hbWVdLltwcm9wZXJ0eV9uYW1lXX0iIC4uLiBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbiB3aXRoIHZhbHVlIGJpbmRpbmcNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRUxDb21wYXJlU3RyYXRlZ3kgaW1wbGVtZW50cyBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LCBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZCh2YWxpZGF0aW9uVGFyZ2V0KSAmJg0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZhbGlkYXRpb25UYXJnZXQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvVmFsaWRhdGVWYWx1ZUJpbmRpbmcoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWxpZGF0aW9uVGFyZ2V0KSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwgY29tcGFyZVN0cmF0ZWd5KTsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAidGVzdCIpDQotICAgIHByb3RlY3RlZCBib29sZWFuIHRyeVRvVmFsaWRhdGVWYWx1ZUJpbmRpbmcoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4ga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nID0gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMNCi0gICAgICAgICAgICAgICAgLmdldE9ySW5pdEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9IENyb3NzVmFsaWRhdGlvblV0aWxzLnJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgICAgIGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZywNCi0gICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuY29udmVydFZhbHVlQmluZGluZ0V4cHJlc3Npb25Ub1Byb2Nlc3NlZEluZm9ybWF0aW9uS2V5KHZhbGlkYXRpb25UYXJnZXQpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLQ0KLSAgICAgICAgaWYodmFsaWRhdGlvblRhcmdldEVudHJ5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneShjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQgY29udmVydGVkIG9iamVjdCBmb3IgIiArIHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FcXVhbHNTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FcXVhbHNTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjFlNGJhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFcXVhbHNTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKEVxdWFscykgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLCBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBvYmplY3QxICE9IG51bGwgJiYgIW9iamVjdDEuZXF1YWxzKG9iamVjdDIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKEVxdWFscykgYW5ub3RhdGlvbikudmFsdWUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZWI1NDEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbENvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLlByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogIltwcm9wZXJ0eV9uYW1lXSIgLi4uIGxvY2FsIHZhbGlkYXRpb24gLT4gY3Jvc3MtY29tcG9uZW50LCBidXQgbm8gY3Jvc3MtZW50aXR5IHZhbGlkYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgTG9jYWxDb21wYXJlU3RyYXRlZ3kgaW1wbGVtZW50cyBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LCBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnlUb1ZhbGlkYXRlTG9jYWxseSgNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZUxvY2FsbHkoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSwNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZyA9IENyb3NzVmFsaWRhdGlvblV0aWxzDQotICAgICAgICAgICAgICAgIC5nZXRPckluaXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpOw0KLQ0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IGNyZWF0ZVRhcmdldEtleShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEtleSk7DQotICAgICAgICBpZiAoIWtleUNvbnZlcnRlZFZhbHVlTWFwcGluZy5jb250YWluc0tleShuZXdLZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUtleSA9IHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKTsNCi0NCi0gICAgICAgIGlmKCFzb3VyY2VLZXkuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzb3VyY2UgcGF0aDogIiArIHNvdXJjZUtleSArICIgaW52YWxpZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGFyZ2V0S2V5ID0gc291cmNlS2V5LnN1YnN0cmluZygwLCBzb3VyY2VLZXkubGFzdEluZGV4T2YoIi4iKSArIDEpICsgdGFyZ2V0S2V5Ow0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkgPSBDcm9zc1ZhbGlkYXRpb25VdGlscy5yZXNvbHZlVmFsaWRhdGlvblRhcmdldEVudHJ5KA0KLSAgICAgICAgICAgICAgICBrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcsIHRhcmdldEtleSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0NCi0gICAgICAgIGlmICh2YWxpZGF0aW9uVGFyZ2V0RW50cnkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBjb252ZXJ0ZWQgb2JqZWN0IGZvciAiICsgcHJvcGVydHlEZXRhaWxzLmdldEtleSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZVRhcmdldEtleShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBTdHJpbmcgdGFyZ2V0S2V5KQ0KLSAgICB7DQotICAgICAgICAvL25vIHJlYWwgdmFsdWUgYmluZGluZyBleHByZXNzaW9uDQotICAgICAgICAvL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24ganVzdCBoZXBscyB0byByZXBsYWNlIHRoZSBwcm9wZXJ0eSBvZiB0aGUga2V5DQotICAgICAgICAvL2hlcmUgb25seSBkb3Qtbm90YXRpb24gaXMgYWxsb3dlZCAtPiBubyBwcm9ibGVtDQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGJhc2VFeHByZXNzaW9uID0NCi0gICAgICAgICAgICBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3siICsgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywNCi0gICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGV0YWlscy5jbGFzcykuZ2V0S2V5KCkgKyAifSIpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZU9yQWRkUHJvcGVydHkoYmFzZUV4cHJlc3Npb24sIHRhcmdldEtleSkNCi0gICAgICAgICAgICAuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC5zdWJzdHJpbmcoMiwgcmVzdWx0Lmxlbmd0aCgpIC0xKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc4ODgzOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotDQotLyoqDQotICogIltsb2NhbF9wcm9wZXJ0eS5wcm9wZXJ0eTEucHJvcGVydHkyXSINCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5IGV4dGVuZHMgTG9jYWxDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlTG9jYWxseShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIE9iamVjdCBuZXdCYXNlID0gUmVmbGVjdGlvblV0aWxzDQotICAgICAgICAgICAgLmdldEJhc2VPZlByb3BlcnR5Q2hhaW4ocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSwgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIGlmKHRhcmdldEtleS5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZmluZCB0aGUgbGFzdCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIHRhcmdldEtleSA9IHRhcmdldEtleS5zdWJzdHJpbmcodGFyZ2V0S2V5Lmxhc3RJbmRleE9mKCIuIikgKyAxLCB0YXJnZXRLZXkubGVuZ3RoKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgT2JqZWN0IHRhcmdldFZhbHVlID0gZ2V0VmFsdWVPZlByb3BlcnR5KG5ld0Jhc2UsIHRhcmdldEtleSk7DQotDQotICAgICAgICBib29sZWFuIHZpb2xhdGlvbkZvdW5kID0gZmFsc2U7DQotDQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LmlzVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFZhbHVlLCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKSkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5ID0gbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb21wb25lbnQoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q2xpZW50SWQoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENsaWVudElkKCkpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb252ZXJ0ZWRPYmplY3QodGFyZ2V0VmFsdWUpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kNCi0gICAgICAgICAgICAgICAgICAgIC5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLQ0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBnZXRWYWx1ZU9mUHJvcGVydHkoT2JqZWN0IGJhc2UsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEsIHByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgICAgIE1ldGhvZCB0YXJnZXRNZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoYmFzZS5nZXRDbGFzcygpLCAiZ2V0IiArIHByb3BlcnR5KTsNCi0NCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZChiYXNlLmdldENsYXNzKCksICJpcyIgKyBwcm9wZXJ0eSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAiY2xhc3MgIiArIGJhc2UuZ2V0Q2xhc3MoKSArICIgaGFzIG5vIHB1YmxpYyBnZXQvaXMgIiArIHByb3BlcnR5LnRvTG93ZXJDYXNlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZChiYXNlLCB0YXJnZXRNZXRob2QpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxNWUyMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L05vdEVxdWFsc1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLk5vdEVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTm90RXF1YWxzU3RyYXRlZ3kgZXh0ZW5kcyBFcXVhbHNTdHJhdGVneQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoTm90RXF1YWxzKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLA0KLSAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICFzdXBlci5pc1Zpb2xhdGlvbihvYmplY3QxLCBvYmplY3QyLCBhbm5vdGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoTm90RXF1YWxzKSBhbm5vdGF0aW9uKS52YWx1ZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVmZXJlbmNpbmdTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NmQzZmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSW50ZXJuYWwgaW50ZXJmYWNlIHRvIGFsbG93IG11bHRpcGxlIHJlZmVyZW5jaW5nIHN0cmF0ZWdpZXMgZm9yIGNyb3NzIGNvbXBvbmVudCB2YWxpZGF0aW9uLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1pbnRlcmZhY2UgUmVmZXJlbmNpbmdTdHJhdGVneQ0KLXsNCi0gICAgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5KTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVxdWlyZWRJZlN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMDVhNWYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZlR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFJlcXVpcmVkSWZTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRmFjZXNCdW5kbGUgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoUmVxdWlyZWRJZikgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLCBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gdmlvbGF0aW9uRm91bmQgPSBmYWxzZTsNCi0NCi0gICAgICAgIGlmICgoKFJlcXVpcmVkSWYpIGFubm90YXRpb24pLmlzKCkuZXF1YWxzKFJlcXVpcmVkSWZUeXBlLmVtcHR5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IChvYmplY3QyID09IG51bGwgfHwgb2JqZWN0Mi5lcXVhbHMoIiIpKSAmJiAob2JqZWN0MSA9PSBudWxsIHx8IG9iamVjdDEuZXF1YWxzKCIiKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmICgoKFJlcXVpcmVkSWYpIGFubm90YXRpb24pLmlzKCkuZXF1YWxzKFJlcXVpcmVkSWZUeXBlLm5vdF9lbXB0eSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSAob2JqZWN0MiAhPSBudWxsICYmICFvYmplY3QyLmVxdWFscygiIikpICYmIChvYmplY3QxID09IG51bGwgfHwgb2JqZWN0MS5lcXVhbHMoIiIpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB2aW9sYXRpb25Gb3VuZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChSZXF1aXJlZElmKSBhbm5vdGF0aW9uKS52YWx1ZU9mKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMudXNlRmFjZXNCdW5kbGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2pwYV9zdHJhdGVneV9tYXBwaW5ncy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Q5OTI5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLkJhc2ljPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLklkPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZT1vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5KcGFWYWxpZGF0aW9uU3RyYXRlZ3kKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Dcm9zc1ZhbGlkYXRpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTRiY2Q4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Dcm9zc1ZhbGlkYXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLlByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUk9TU19WQUxJREFUSU9OX1NUT1JBR0VfS0VZID0gQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBnZXRPckluaXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgTWFwIHJlcXVlc3RNYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpOw0KLQ0KLSAgICAgICAgaWYgKCFyZXF1ZXN0TWFwLmNvbnRhaW5zS2V5KENST1NTX1ZBTElEQVRJT05fU1RPUkFHRV9LRVkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKSByZXF1ZXN0TWFwLmdldChDUk9TU19WQUxJREFUSU9OX1NUT1JBR0VfS0VZKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0DQotICAgICAgICAgICAgICAgIC5nZXRDdXJyZW50SW5zdGFuY2UoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RXh0ZXJuYWxDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldFJlcXVlc3RNYXAoKQ0KLSAgICAgICAgICAgICAgICAucHV0KENST1NTX1ZBTElEQVRJT05fU1RPUkFHRV9LRVksIG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UT19DT05WRVJURURfVkFMVUVfTUFQUElOR19LRVkgPSBKc2ZVdGlscy5jbGFzcy5nZXROYW1lKCk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4gZ2V0T3JJbml0S2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcoKQ0KLSAgICB7DQotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7DQotDQotICAgICAgICBpZiAoIXJlcXVlc3RNYXAuY29udGFpbnNLZXkoS0VZX1RPX0NPTlZFUlRFRF9WQUxVRV9NQVBQSU5HX0tFWSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzZXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PikgcmVxdWVzdE1hcC5nZXQoS0VZX1RPX0NPTlZFUlRFRF9WQUxVRV9NQVBQSU5HX0tFWSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0S2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgLnB1dChLRVlfVE9fQ09OVkVSVEVEX1ZBTFVFX01BUFBJTkdfS0VZLCBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSByZXNvbHZlVmFsaWRhdGlvblRhcmdldEVudHJ5KA0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXksIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSA9DQotICAgICAgICAgICAga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcuZ2V0KHRhcmdldEtleSk7DQotDQotICAgICAgICAvL3NpbXBsZSBjYXNlDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5nZXRGdXJ0aGVyRW50cmllcygpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXRCZWFuID0gcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKTsNCi0NCi0gICAgICAgIC8vcHJvY2VzcyBjb21wbGV4IGNvbXBvbmVudCBlbnRyaWVzIChlLmcuIGEgdGFibGUpDQotICAgICAgICAvL3N1cHBvcnRlZDogY3Jvc3MtY29tcG9uZW50IGJ1dCBubyBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbiAoPSBsb2NhbGUgdmFsaWRhdGlvbikNCi0gICAgICAgIGlmIChwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEJlYW4oKS5lcXVhbHModGFyZ2V0QmVhbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotICAgICAgICB9DQotDQotICAgICAgICBmb3IgKFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgZW50cnkgOiBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEZ1cnRoZXJFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LmdldEJlYW4oKS5lcXVhbHModGFyZ2V0QmVhbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInN1cHBvcnQgZm9yIG1hcCBzeW50YXgiKQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VmFsdWVCaW5kaW5nRXhwcmVzc2lvblRvUHJvY2Vzc2VkSW5mb3JtYXRpb25LZXkoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YmUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YmUuZ2V0RXhwcmVzc2lvblN0cmluZygpLnJlcGxhY2UoIiN7IiwgIiIpLnJlcGxhY2UoIn0iLCAiIik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzOTI1NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBQcm9wZXJ0eSBWYWxpZGF0aW9uIE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFByb3BlcnR5IFZhbGlkYXRpb24gTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgUHJvcGVydHkgVmFsaWRhdGlvbiBwcm92aWRlcyBhbm5vdGF0aW9uIGJhc2VkIHZhbGlkYXRpb24gZm9yIGJlYW4gcHJvcGVydGllcy4NCi0gICAgSXQgYWxzbyBwcm92aWRlcyBKUEEgMS4wIGJhc2VkIHZhbGlkYXRpb24gU3VwcG9ydC4NCi0gIA0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS4xLnggYW5kIEpTRiAxLjIueC4gQm90aCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ2MGZmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0Fic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nOwotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlJbnB1dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuVGVzdFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWRfaW1wbC5jb25maWcuTXlmYWNlc0NvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0V4dGVybmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrRmFjZXNDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tGYWNlc0NvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tIdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0h0dHBTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tMaWZlY3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0xpZmVjeWNsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1JlbmRlcktpdDsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrUmVzcG9uc2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1NlcnZsZXRDb25maWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1NlcnZsZXRDb250ZXh0OwotCi0vKioKLSAqIEFic3RyYWN0IFNoYWxlIFRlc3QgYmFzZSBjbGFzcywgd2hpY2ggc2V0cyB1cCB0aGUgSlNGIGVudmlyb25tZW50LiAgSWYgdGhlIHRlc3QKLSAqIG92ZXJyaWRlcyA8Y29kZT5zZXRVcCgpPC9jb2RlPiBhbmQvb3IgPGNvZGU+dGVhckRvd24oKTwvY29kZT4sIHRoZW4gdGhvc2UKLSAqIG1ldGhvZHMgYnV0IGNhbGwgdGhlIG92ZXJ3aXR0ZW4gbWV0aG9kIHRvIGluc3VyZSBhIHZhbGlkIHRlc3QgZW52aXJvbm1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHJvdGVjdGVkIE1vY2tBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbjsKLSAgICBwcm90ZWN0ZWQgTW9ja1NlcnZsZXRDb25maWcgY29uZmlnOwotICAgIHByb3RlY3RlZCBNb2NrRXh0ZXJuYWxDb250ZXh0IGV4dGVybmFsQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgTW9ja0ZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIE1vY2tGYWNlc0NvbnRleHRGYWN0b3J5IGZhY2VzQ29udGV4dEZhY3Rvcnk7Ci0gICAgcHJvdGVjdGVkIE1vY2tMaWZlY3ljbGUgbGlmZWN5Y2xlOwotICAgIHByb3RlY3RlZCBNb2NrTGlmZWN5Y2xlRmFjdG9yeSBsaWZlY3ljbGVGYWN0b3J5OwotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgcmVuZGVyS2l0OwotICAgIHByb3RlY3RlZCBNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3Q7Ci0gICAgcHJvdGVjdGVkIE1vY2tIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlOwotICAgIHByb3RlY3RlZCBNb2NrU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIE1vY2tIdHRwU2Vzc2lvbiBzZXNzaW9uOwotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyOwotICAgICAgICAKLSAgICAvKiogUmVzcG9uc2UgV3JpdGVyICovCi0gICAgcHJpdmF0ZSBNb2NrUmVzcG9uc2VXcml0ZXIgd3JpdGVyOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuCi0gICAgICovCi0gICAgcHVibGljIEFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgICAgIGFwcGxpY2F0aW9uID0gbnVsbDsKLSAgICAgICAgY29uZmlnID0gbnVsbDsKLSAgICAgICAgZXh0ZXJuYWxDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgZmFjZXNDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgZmFjZXNDb250ZXh0RmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIGxpZmVjeWNsZSA9IG51bGw7Ci0gICAgICAgIGxpZmVjeWNsZUZhY3RvcnkgPSBudWxsOwotICAgICAgICByZW5kZXJLaXQgPSBudWxsOwotICAgICAgICByZXF1ZXN0ID0gbnVsbDsKLSAgICAgICAgcmVzcG9uc2UgPSBudWxsOwotICAgICAgICBzZXJ2bGV0Q29udGV4dCA9IG51bGw7Ci0gICAgICAgIHNlc3Npb24gPSBudWxsOwotICAgICAgICB0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZXR1cCB0aGUgdGVzdCBlbnZpcm9ubWVudCwgaW5jbHVkaW5nIHRoZSBmb2xsb3dpbmc6Ci0gICAgICogIDx1bD4KLSAgICAgKiAgPGxpPlNldCB0aGUgQXBwbGljYXRpb24gTWFwLjwvbGk+Ci0gICAgICogIDxsaT5TZXQgYSByZXNwb25zZSB3cml0ZXI8L2xpPgotICAgICAqICA8bGk+QWRkIFRvbWFoYXdrJ3MgcmVuZGVyZXJzIHRvIHRoZSBmYWNlcyBjb250ZXh0LjwvbGk+Ci0gICAgICogIDwvdWw+IAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIobmV3IFVSTENsYXNzTG9hZGVyKG5ldyBVUkxbMF0sIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkpOwotICAgICAgICBzZXJ2bGV0Q29udGV4dCA9IG5ldyBNb2NrU2VydmxldENvbnRleHQoKTsKLSAgICAgICAgLy9mb3IgdGVzdGluZyB0aGUgZmFsbGJhY2sKLSAgICAgICAgLy9zZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVggKyAiLkRFQUNUSVZBVEVfRUxfUkVTT0xWRVIiLCAidHJ1ZSIpOwotICAgICAgICBjb25maWcgPSBuZXcgTW9ja1NlcnZsZXRDb25maWcoc2VydmxldENvbnRleHQpOwotICAgICAgICBzZXNzaW9uID0gbmV3IE1vY2tIdHRwU2Vzc2lvbigpOwotICAgICAgICBzZXNzaW9uLnNldFNlcnZsZXRDb250ZXh0KHNlcnZsZXRDb250ZXh0KTsKLSAgICAgICAgcmVxdWVzdCA9IG5ldyBNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0KHNlc3Npb24pOwotICAgICAgICByZXF1ZXN0LnNldFNlcnZsZXRDb250ZXh0KHNlcnZsZXRDb250ZXh0KTsKLSAgICAgICAgcmVzcG9uc2UgPSBuZXcgTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2UoKTsKLSAgICAgICAgRmFjdG9yeUZpbmRlci5yZWxlYXNlRmFjdG9yaWVzKCk7Ci0gICAgICAgIEZhY3RvcnlGaW5kZXIuc2V0RmFjdG9yeSgiamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5IiwgIm9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbkZhY3RvcnkiKTsKLSAgICAgICAgRmFjdG9yeUZpbmRlci5zZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dEZhY3RvcnkiLCAib3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0ZhY2VzQ29udGV4dEZhY3RvcnkiKTsKLSAgICAgICAgRmFjdG9yeUZpbmRlci5zZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5saWZlY3ljbGUuTGlmZWN5Y2xlRmFjdG9yeSIsICJvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrTGlmZWN5Y2xlRmFjdG9yeSIpOwotICAgICAgICBGYWN0b3J5RmluZGVyLnNldEZhY3RvcnkoImphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5IiwgIm9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tSZW5kZXJLaXRGYWN0b3J5Iik7Ci0gICAgICAgIGV4dGVybmFsQ29udGV4dCA9IG5ldyBNb2NrRXh0ZXJuYWxDb250ZXh0KHNlcnZsZXRDb250ZXh0LCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgIGxpZmVjeWNsZUZhY3RvcnkgPSAoTW9ja0xpZmVjeWNsZUZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5saWZlY3ljbGUuTGlmZWN5Y2xlRmFjdG9yeSIpOwotICAgICAgICBsaWZlY3ljbGUgPSAoTW9ja0xpZmVjeWNsZSlsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZSgiREVGQVVMVCIpOwotICAgICAgICBmYWNlc0NvbnRleHRGYWN0b3J5ID0gKE1vY2tGYWNlc0NvbnRleHRGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHRGYWN0b3J5Iik7Ci0gICAgICAgIGZhY2VzQ29udGV4dCA9IChNb2NrRmFjZXNDb250ZXh0KWZhY2VzQ29udGV4dEZhY3RvcnkuZ2V0RmFjZXNDb250ZXh0KHNlcnZsZXRDb250ZXh0LCByZXF1ZXN0LCByZXNwb25zZSwgbGlmZWN5Y2xlKTsKLSAgICAgICAgZXh0ZXJuYWxDb250ZXh0ID0gKE1vY2tFeHRlcm5hbENvbnRleHQpZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpOwotICAgICAgICBVSVZpZXdSb290IHJvb3QgPSBuZXcgVUlWaWV3Um9vdCgpOwotICAgICAgICByb290LnNldFZpZXdJZCgiL3ZpZXdJZCIpOwotICAgICAgICByb290LnNldFJlbmRlcktpdElkKCJIVE1MX0JBU0lDIik7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5zZXRWaWV3Um9vdChyb290KTsKLSAgICAgICAgQXBwbGljYXRpb25GYWN0b3J5IGFwcGxpY2F0aW9uRmFjdG9yeSA9IChBcHBsaWNhdGlvbkZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3RvcnkiKTsKLSAgICAgICAgYXBwbGljYXRpb24gPSAoTW9ja0FwcGxpY2F0aW9uKWFwcGxpY2F0aW9uRmFjdG9yeS5nZXRBcHBsaWNhdGlvbigpOwotICAgICAgICBmYWNlc0NvbnRleHQuc2V0QXBwbGljYXRpb24oYXBwbGljYXRpb24pOwotICAgICAgICBSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnkgPSAoUmVuZGVyS2l0RmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoImphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5Iik7Ci0gICAgICAgIC8vV3JhcCByZW5kZXJlcnMgd2l0aCBwcm9wZXIgZXh2YWwgd3JhcHBlcgotICAgICAgICByZW5kZXJLaXQgPSBuZXcgRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkuY3JlYXRlKG5ldyBNb2NrUmVuZGVyS2l0KCkpOwotICAgICAgICByZW5kZXJLaXRGYWN0b3J5LmFkZFJlbmRlcktpdCgiSFRNTF9CQVNJQyIsIHJlbmRlcktpdCk7ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vIGFkZGl0aW9uYWwgc2V0dXAgbm90IHByb3ZpZGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHNoYWxlIG1vY2sgc3R1ZmYKLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uTWFwKCkucHV0KAotICAgICAgICAgICAgICAgIE15ZmFjZXNDb25maWcuY2xhc3MuZ2V0TmFtZSgpLCBuZXcgTXlmYWNlc0NvbmZpZygpKTsKLSAgICAgICAgd3JpdGVyID0gbmV3IE1vY2tSZXNwb25zZVdyaXRlcihuZXcgU3RyaW5nV3JpdGVyKCksIG51bGwsIG51bGwpOwotICAgICAgICBmYWNlc0NvbnRleHQuc2V0UmVzcG9uc2VXcml0ZXIod3JpdGVyKTsKLQotICAgICAgICBUZXN0VXRpbHMuYWRkRGVmYXVsdFJlbmRlcmVycyhmYWNlc0NvbnRleHQpOwotICAgICAgICBUZXN0VXRpbHMuYWRkRGVmYXVsdFZhbGlkYXRvcnMoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgbmV3IFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lcigpLmluaXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZWFyIGRvd24gdGhlIHRlc3QgZW52aXJvbm1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBhcHBsaWNhdGlvbiA9IG51bGw7Ci0gICAgICAgIGNvbmZpZyA9IG51bGw7Ci0gICAgICAgIGV4dGVybmFsQ29udGV4dCA9IG51bGw7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5yZWxlYXNlKCk7Ci0gICAgICAgIGZhY2VzQ29udGV4dCA9IG51bGw7Ci0gICAgICAgIGxpZmVjeWNsZSA9IG51bGw7Ci0gICAgICAgIGxpZmVjeWNsZUZhY3RvcnkgPSBudWxsOwotICAgICAgICByZW5kZXJLaXQgPSBudWxsOwotICAgICAgICByZXF1ZXN0ID0gbnVsbDsKLSAgICAgICAgcmVzcG9uc2UgPSBudWxsOwotICAgICAgICBzZXJ2bGV0Q29udGV4dCA9IG51bGw7Ci0gICAgICAgIHNlc3Npb24gPSBudWxsOwotICAgICAgICBGYWN0b3J5RmluZGVyLnJlbGVhc2VGYWN0b3JpZXMoKTsKLSAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIodGhyZWFkQ29udGV4dENsYXNzTG9hZGVyKTsKLSAgICAgICAgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0Nyb3NzVmFsVmFsaWRhdGlvbigpCi0gICAgewotICAgICAgICBuZXcgQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcigpLmFmdGVyUGhhc2UobmV3IFBoYXNlRXZlbnQoKEZhY2VzQ29udGV4dClmYWNlc0NvbnRleHQsUGhhc2VJZC5BTllfUEhBU0UsbGlmZWN5Y2xlKSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrTWVzc2FnZUNvdW50KGludCBleHBlY3RlZCkKLSAgICB7Ci0gICAgICAgIGludCBhY3R1YWwgPSAwOwotICAgICAgICBmb3IoSXRlcmF0b3IgbWVzc2FnZXMgPSBmYWNlc0NvbnRleHQuZ2V0TWVzc2FnZXMoKTsgbWVzc2FnZXMuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgbWVzc2FnZXMubmV4dCgpOwotICAgICAgICAgICAgYWN0dWFsKys7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbXBsZXRlIG1lc3NhZ2UgY291bnQiLCBleHBlY3RlZCwgYWN0dWFsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja01lc3NhZ2VDb3VudChTdHJpbmcgY2xpZW50SWQsIGludCBleHBlY3RlZCkKLSAgICB7Ci0gICAgICAgIGludCBhY3R1YWwgPSAwOwotICAgICAgICBmb3IoSXRlcmF0b3IgbWVzc2FnZXMgPSBmYWNlc0NvbnRleHQuZ2V0TWVzc2FnZXMoY2xpZW50SWQpOyBtZXNzYWdlcy5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlcy5uZXh0KCk7Ci0gICAgICAgICAgICBhY3R1YWwrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydEVxdWFscygiQ29tcGxldGUgbWVzc2FnZSBjb3VudCIsIGV4cGVjdGVkLCBhY3R1YWwpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBWZXJpZnkgdGhlIGZvbGxvd2luZzoKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPmlkIGlzIG5vdCBudWxsPC9saT4KLSAgICAgKiA8bGk+UmVzcG9uc2UgaXMgY29tcGxldGU8L2xpPgotICAgICAqIDxsaT5SZXNwb25jZSBjb250YWlucyB0aGUgaWQ8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGlkIElEIHRvIHZlcmlmeQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydElkRXhpc3RzKFN0cmluZyBpZCkKLSAgICB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIklEIGlzIG5vdCBudWxsIiwgaWQpOwotICAgICAgICBhc3NlcnRUcnVlKCJSZXNwb25zZSBDb21wbGV0ZSIsIGZhY2VzQ29udGV4dC5nZXRSZXNwb25zZUNvbXBsZXRlKCkpOwotICAgICAgICBTdHJpbmcgb3V0cHV0ID0gd3JpdGVyLmdldFdyaXRlcigpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIkhhcyBvdXRwdXQiLCBvdXRwdXQpOwotICAgICAgICBhc3NlcnRUcnVlKCJDb250YWlucyBpZCAnIiArIGlkICsgIiciLCBvdXRwdXQuaW5kZXhPZihpZCkgIT0gLTEpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVZhbHVlQmluZGluZyhVSUlucHV0IHVpSW5wdXQsIFN0cmluZyBuYW1lLCBTdHJpbmcgZXhwcmVzc2lvbikKLSAgICB7Ci0gICAgICAgIFZhbHVlQmluZGluZyB2YWx1ZUJpbmRpbmcgPSBhcHBsaWNhdGlvbi5jcmVhdGVWYWx1ZUJpbmRpbmcoZXhwcmVzc2lvbik7Ci0KLSAgICAgICAgaWYodWlJbnB1dCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aUlucHV0LnNldFZhbHVlQmluZGluZyhuYW1lLCB2YWx1ZUJpbmRpbmcpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL0Jhc2VWYWxUZXN0QmVhbi5qYXZhIGIvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL0Jhc2VWYWxUZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWRjOTIwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9CYXNlVmFsVGVzdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxlbmd0aDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsKLQotLyoqCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlVmFsVGVzdEJlYW4KLXsKLSAgICBAUmVxdWlyZWQKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIAotICAgIEBMZW5ndGgobWluaW11bT0yLG1heGltdW09MykKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lMTsKLSAgICAKLSAgICBAUGF0dGVybigiW0EtWl1bYS16XSsiKQotICAgIHByaXZhdGUgU3RyaW5nIHBhdHRlcm5OYW1lOwotICAgIAotICAgIEBEb3VibGVSYW5nZShtaW5pbXVtPS0zMDBkKQotICAgIHByaXZhdGUgRG91YmxlIGRvdWJsZVZhbHVlMTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUxKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYW1lMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lMShTdHJpbmcgbmFtZTEpCi0gICAgewotICAgICAgICB0aGlzLm5hbWUxID0gbmFtZTE7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gcGF0dGVybk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGF0dGVybk5hbWUoU3RyaW5nIHBhdHRlcm5OYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5wYXR0ZXJuTmFtZSA9IHBhdHRlcm5OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBEb3VibGUgZ2V0RG91YmxlVmFsdWUxKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkb3VibGVWYWx1ZTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RG91YmxlVmFsdWUxKERvdWJsZSBkb3VibGVWYWx1ZTEpCi0gICAgewotICAgICAgICB0aGlzLmRvdWJsZVZhbHVlMSA9IGRvdWJsZVZhbHVlMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvQmFzZVZhbFRlc3RDYXNlLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvQmFzZVZhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwN2ExNjEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL0Jhc2VWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUKLSAqLwotcHVibGljIGNsYXNzIEJhc2VWYWxUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlCi17Ci0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50ID0gbnVsbDsKLQotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7Ci0gICAgCi0gICAgQmFzZVZhbFRlc3RCZWFuIGJlYW4gPSBudWxsOwotCi0gICAgcHVibGljIEJhc2VWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgICAgICBpbnB1dENvbXBvbmVudCA9IG51bGw7Ci0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOwotICAgICAgICBiZWFuID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQmFzZVZhbFRlc3RDYXNlLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIGJlYW4gPSBuZXcgQmFzZVZhbFRlc3RCZWFuKCk7Ci0gICAgICAgIFZhbHVlQmluZGluZyB2YiA9IGFwcGxpY2F0aW9uLmNyZWF0ZVZhbHVlQmluZGluZygiI3t0ZXN0QmVhbn0iKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKS5wdXQoInRlc3RCZWFuIiwgYmVhbik7Ci0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7Ci0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsKLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOwotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOwotICAgICAgICBpbnB1dENvbXBvbmVudCA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7Ci0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQpOwotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRJZCgiaW5wdXQxIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgICAgICBpbnB1dENvbXBvbmVudCA9IG51bGw7Ci0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOwotICAgICAgICBiZWFuID0gbnVsbDsgICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lUmVxdWlyZWRGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lfSIpOwotCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsKLQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lMUxlbmdodE1heEZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWUxfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIxMjM0NSIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZTFMZW5naHRDb3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lMX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydFRydWUoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWUxTGVuZ2h0TWluRmFpbCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZTF9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIngiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXR0ZXJuTmFtZUZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnBhdHRlcm5OYW1lfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCJQZXRlcjEiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXR0ZXJuTmFtZUNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnBhdHRlcm5OYW1lfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCJQZXRlciIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOwotICAgIH0gICAgCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWVGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5kb3VibGVWYWx1ZTF9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIi0zMDEiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVZhbHVlQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4uZG91YmxlVmFsdWUxfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIyMDAiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMGQsIGlucHV0Q29tcG9uZW50LmdldFZhbHVlKCkpOwotICAgICAgICAKLSAgICAgICAgaW5wdXRDb21wb25lbnQudXBkYXRlTW9kZWwoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMGQsIGJlYW4uZ2V0RG91YmxlVmFsdWUxKCkpOwotICAgIH0gICAgCi19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdEJlYW4uamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDhhZGM5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOwotCi0vKioKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUKLSAqLwotcHVibGljIGNsYXNzIENyb3NzVmFsVGVzdEJlYW4KLXsKLQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsKLSAgICAKLSAgICBARXF1YWxzKCJwcm9wZXJ0eTEiKSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTEoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKFN0cmluZyBwcm9wZXJ0eTEpCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnR5MSA9IHByb3BlcnR5MTsKLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkyKFN0cmluZyBwcm9wZXJ0eTIpCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdENhc2UuamF2YSBiL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGNhMGJjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUKLSAqLwotcHVibGljIGNsYXNzIENyb3NzVmFsVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZQotewotCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOwotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQyID0gbnVsbDsKLSAgICAKLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOwotICAgIAotICAgIHB1YmxpYyBDcm9zc1ZhbFRlc3RDYXNlKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG51bGw7Ci0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKENyb3NzVmFsVGVzdENhc2UuY2xhc3MpOwotICAgIH0gICAgCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIENyb3NzVmFsVGVzdEJlYW4gYmVhbiA9IG5ldyBDcm9zc1ZhbFRlc3RCZWFuKCk7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhudWxsLCAidmFsdWUiLCAiI3t0ZXN0QmVhbn0iKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKS5wdXQoInRlc3RCZWFuIixiZWFuKTsKLSAgICAgICAgCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOwotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7Ci0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsKLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsgICAgICAgIAotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOwotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50MSk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRJZCgiaW5wdXQxIik7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7Ci0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQyKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNDb3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOwotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxWYWxpZGF0aW9uKCk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOwotCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzRmFpbCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQ0Iik7Ci0gICAgICAgIAotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgCi0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsVmFsaWRhdGlvbigpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgyKTsKLQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvVGVzdFV0aWxzLmphdmEgYi9wcmVwYXJlLzFfMV8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvVGVzdFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMTdkZTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Rlc3RVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY2VzRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVGVzdFV0aWxzCi17Ci0gICAgLyoqIERlZmF1bHQgTG9nZ2VyICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFRlc3RVdGlscy5jbGFzcyk7Ci0KLSAgICAvKiogdXRpbGl0eSBjbGFzcywgZG8gbm90IGluc3RhbnRpYXRlICovCi0gICAgcHJpdmF0ZSBUZXN0VXRpbHMoKQotICAgIHsKLSAgICAgICAgLy8gdXRpbGl0eSBjbGFzcywgZGlzYWJsZSBpbnN0YW50aWF0aW9uCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGREZWZhdWx0VmFsaWRhdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQotICAgIHsKLSAgICAgICAgYWRkVmFsaWRhdG9yKGZhY2VzQ29udGV4dCwiamF2YXguZmFjZXMuRG91YmxlUmFuZ2UiLCAiamF2YXguZmFjZXMudmFsaWRhdG9yLkRvdWJsZVJhbmdlVmFsaWRhdG9yIik7Ci0gICAgICAgIGFkZFZhbGlkYXRvcihmYWNlc0NvbnRleHQsImphdmF4LmZhY2VzLkxlbmd0aCIsICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yIik7Ci0gICAgICAgIGFkZFZhbGlkYXRvcihmYWNlc0NvbnRleHQsImphdmF4LmZhY2VzLkxvbmdSYW5nZSIsICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTG9uZ1JhbmdlVmFsaWRhdG9yIik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRWYWxpZGF0b3IoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0b3JJZCwgU3RyaW5nIHZhbGlkYXRvckNsYXNzKQotICAgIHsKLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuYWRkVmFsaWRhdG9yKHZhbGlkYXRvcklkLCB2YWxpZGF0b3JDbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGFsbCBvZiBKU0YgMS4yIGRlZmF1bHQgcmVuZGVyZXJzLiAgQ3VycmVudGx5IHRoaXMgaXMgbm90IHRpZWQgdG8gCi0gICAgICogZmFjZXMtY29uZmlnLnhtbCwgc28gYWxsIGNoYW5nZSB0byB0aGUgZmlsZSBNVVNUIGFsc28gYmUgbWFkZSBoZXJlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQKLSAgICAgKiBAdG9kbyBEbyBub3QgYWRkIHJlbmRlcmVyIGlmIHJlbmRlcmVyIGlzIGFscmVhZHkgYWRkZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZERlZmF1bHRSZW5kZXJlcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vIFN0YW5kYXJkIEhUTUwgUmVuZGVyZXJzCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkNvbW1hbmQiLCAiamF2YXguZmFjZXMuQnV0dG9uIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxCdXR0b25SZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdEJvb2xlYW4iLAotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5DaGVja2JveCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sQ2hlY2tib3hSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE1hbnkiLAotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5DaGVja2JveCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sQ2hlY2tib3hSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkZvcm0iLCAiamF2YXguZmFjZXMuRm9ybSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sRm9ybVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuUGFuZWwiLCAiamF2YXguZmFjZXMuR3JpZCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sR3JpZFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuUGFuZWwiLCAiamF2YXguZmFjZXMuR3JvdXAiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEdyb3VwUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5IaWRkZW4iLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEhpZGRlblJlbmRlcmVyIik7Ci0gICAgICAgIAotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5HcmFwaGljIiwgImphdmF4LmZhY2VzLkltYWdlIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxJbWFnZVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuT3V0cHV0IiwgImphdmF4LmZhY2VzLkxhYmVsIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMYWJlbFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuT3V0cHV0IiwgImphdmF4LmZhY2VzLkxpbmsiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbExpbmtSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkNvbW1hbmQiLCAiamF2YXguZmFjZXMuTGluayIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlua1JlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0T25lIiwKLSAgICAgICAgICAgICAgICAiamF2YXguZmFjZXMuTGlzdGJveCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlzdGJveFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0TWFueSIsCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkxpc3Rib3giLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbExpc3Rib3hSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsICJqYXZheC5mYWNlcy5NZW51IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxNZW51UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RNYW55IiwgImphdmF4LmZhY2VzLk1lbnUiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lbnVSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk1lc3NhZ2UiLCAiamF2YXguZmFjZXMuTWVzc2FnZSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTWVzc2FnZVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuT3V0cHV0IiwgImphdmF4LmZhY2VzLkZvcm1hdCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sRm9ybWF0UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5NZXNzYWdlcyIsCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLk1lc3NhZ2VzIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxNZXNzYWdlc1JlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0T25lIiwgImphdmF4LmZhY2VzLlJhZGlvIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxSYWRpb1JlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuSW5wdXQiLCAiamF2YXguZmFjZXMuU2VjcmV0IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxTZWNyZXRSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkRhdGEiLCAiamF2YXguZmFjZXMuVGFibGUiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFRhYmxlUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5UZXh0YXJlYSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGV4dGFyZWFSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLklucHV0IiwgImphdmF4LmZhY2VzLlRleHQiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFRleHRSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5UZXh0IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxUZXh0UmVuZGVyZXIiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSByZW5kZXJlciB0byB0aGUgRmFjZXNDb250ZXh0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgRmFjZXMgQ29udGV4dAotICAgICAqIEBwYXJhbSBmYW1pbHkgQ29tcG9uZW5ldCBGYW1pbHkKLSAgICAgKiBAcGFyYW0gcmVuZGVyZXJUeXBlIENvbXBvbmVudCBUeXBlCi0gICAgICogQHBhcmFtIHJlbmRlckNsYXNzTmFtZSBDbGFzcyBOYW1lIG9mIFJlbmRlcmVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFJlbmRlcmVyKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBmYW1pbHksCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGVyZXJUeXBlLCBTdHJpbmcgcmVuZGVyQ2xhc3NOYW1lKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSAoamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyKSBuZXdJbnN0YW5jZShyZW5kZXJDbGFzc05hbWUpOwotICAgICAgICBSZW5kZXJLaXQga2l0ID0gZmFjZXNDb250ZXh0LmdldFJlbmRlcktpdCgpOwotICAgICAgICBraXQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIHJlbmRlcmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmllcyBhIENsYXNzLmxvYWRDbGFzcyB3aXRoIHRoZSBjb250ZXh0IGNsYXNzIGxvYWRlciBvZiB0aGUgY3VycmVudCB0aHJlYWQgZmlyc3QgYW5kCi0gICAgICogYXV0b21hdGljYWxseSBmYWxscyBiYWNrIHRvIHRoZSBDbGFzc1V0aWxzIGNsYXNzIGxvYWRlciAoaS5lLiB0aGUgbG9hZGVyIG9mIHRoZQotICAgICAqIG15ZmFjZXMuamFyIGxpYikgaWYgbmVjZXNzYXJ5LgotICAgICAqIAotICAgICAqIE5vdGU6IFRoaXMgd2FzIGNvcGllZCBmcm9tIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWQudXRpbC5DbGFzc1V0aWxzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHlwZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIG5vbi1wcmltaXRpdmUgbm9uLWFycmF5IGNsYXNzCi0gICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBDbGFzcwotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdHlwZSBpcyBudWxsCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgY2xhc3NGb3JOYW1lKFN0cmluZyB0eXBlKQotICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInR5cGUiKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRyeSBXZWJBcHAgQ2xhc3NMb2FkZXIgZmlyc3QKLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKHR5cGUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXAKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWdub3JlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBmYWxsYmFjazogVHJ5IENsYXNzTG9hZGVyIGZvciBDbGFzc1V0aWxzIChpLmUuIHRoZSBteWZhY2VzLmphciBsaWIpCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZSh0eXBlLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwCi0gICAgICAgICAgICAgICAgICAgIFRlc3RVdGlscy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhbWUgYXMge0BsaW5rICNjbGFzc0Zvck5hbWUoU3RyaW5nKX0sIGJ1dCB0aHJvd3MgYSBSdW50aW1lRXhjZXB0aW9uCi0gICAgICogKEZhY2VzRXhjZXB0aW9uKSBpbnN0ZWFkIG9mIGEgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIE5vdGU6IFRoaXMgd2FzIGNvcGllZCBmcm9tIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWQudXRpbC5DbGFzc1V0aWxzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIENsYXNzCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0eXBlIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIEZhY2VzRXhjZXB0aW9uIGlmIGNsYXNzIG5vdCBmb3VuZAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIHNpbXBsZUNsYXNzRm9yTmFtZShTdHJpbmcgdHlwZSkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY2xhc3NGb3JOYW1lKHR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ2xhc3MgIiArIHR5cGUgKyAiIG5vdCBmb3VuZCIsIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyB3aXRoIHRoZSB0eXBlIG9mIDxjb2RlPnR5cGU8L2NvZGU+LgotICAgICAqIAotICAgICAqIE5vdGU6IFRoaXMgd2FzIGNvcGllZCBmcm9tIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWQudXRpbC5DbGFzc1V0aWxzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHlwZSBUeXBlIG9mIG5ldyBjbGFzcy4KLSAgICAgKiBAcmV0dXJuIEluc3RhbmNlIG9mIHRoZSBjbGFzcyA8Y29kZT50eXBlPC9jb2RlPgotICAgICAqIEB0aHJvd3MgRmFjZXNFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIHR5cGUpIHRocm93cyBGYWNlc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2Uoc2ltcGxlQ2xhc3NGb3JOYW1lKHR5cGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIDxjb2RlPmNsYXp6PC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBOb3RlOiBUaGlzIHdhcyBjb3BpZWQgZnJvbSBvcmcuYXBhY2hlLm15ZmFjZXMuc2hhcmVkLnV0aWwuQ2xhc3NVdGlscwotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXp6IENsYXNzIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZi4KLSAgICAgKiBAcmV0dXJuIEluc3RhbmNlIG9mIHRoZSBjbGFzcyA8Y29kZT5jbGF6ejwvY29kZT4KLSAgICAgKiBAdGhyb3dzIEZhY2VzRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKENsYXNzIGNsYXp6KSB0aHJvd3MgRmFjZXNFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY2xhenoubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nLmVycm9yKCJDbGFzcyA6ICIgKyBjbGF6ei5nZXROYW1lKCkgKyAiIG5vdCBmb3VuZC4iLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBGYWNlc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW5kZXJlcmVkIGEgY29tcG9uZW50LCBpbmNsdWRpbmcgaXQncyBjaGlsZHJlbiwgdGhlbiBjb21wbGV0ZSB0aGUgcmVwb25zZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGV4dCBGYWNlcyBDb250ZXh0Ci0gICAgICogQHBhcmFtIGNvbXBvbmVudCBDb21wb25lbnQgdG8gYmUgcmVuZGVyZWQuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gd2hpbGUgcmVuZGVyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW5kZXJDb21wb25lbnQoRmFjZXNDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICBVSUNvbXBvbmVudCBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSBjb250ZXh0LmdldFJlbmRlcktpdCgpLmdldFJlbmRlcmVyKAotICAgICAgICAgICAgICAgIGNvbXBvbmVudC5nZXRGYW1pbHkoKSwgY29tcG9uZW50LmdldFJlbmRlcmVyVHlwZSgpKTsKLSAgICAgICAgcmVuZGVyZXIuZW5jb2RlQmVnaW4oY29udGV4dCwgY29tcG9uZW50KTsKLSAgICAgICAgcmVuZGVyZXIuZW5jb2RlQ2hpbGRyZW4oY29udGV4dCwgY29tcG9uZW50KTsKLSAgICAgICAgcmVuZGVyZXIuZW5jb2RlRW5kKGNvbnRleHQsIGNvbXBvbmVudCk7Ci0gICAgICAgIGNvbnRleHQucmVzcG9uc2VDb21wbGV0ZSgpOwotICAgICAgICBjb250ZXh0LnJlbmRlclJlc3BvbnNlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9hc3NlbWJseS9wb20ueG1sIGIvcHJlcGFyZS8xXzFfMi9hc3NlbWJseS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzQwZjNmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvYXNzZW1ibHkvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYXNzZW1ibHkxMTwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEFzc2VtYmx5PC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5NeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEFzc2VtYmx5IGlzIHVzZWQgdG8gZ2VuZXJhdGUgCi0gICAgLnppcCBhbmQgLnRhci5neiBkaXN0cmlidXRpb25zIDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4xLjI8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90YWdzLzFfMV8yPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzI8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RhZ3MvMV8xXzI8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRlcGVuZGVuY3ktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktamF2YWRvYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZW5lcmljLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9qYXZhZG9jPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktc291cmNlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y29yZS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3NyYzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tIEVYRUNVVEUgbXZuIHBhY2thZ2UgdG8gZ2VuZXJhdGUgYXNzZW1ibHkgZmlsZXMgLS0+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfc3JjPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsMTEtJHt2ZXJzaW9ufS1zcmM8L2ZpbmFsTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfYmluPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+JHtiYXNlZGlyfS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwxMS0ke3ZlcnNpb259LWJpbjwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L291dDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmF0dGFjaGVkPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y29yZS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPCEtLSBTaW5jZSBleHR2YWwgY291bGQgYmUgYXN5bmMgcmVsZWFzZWQsIGFuIGdlbmVyYXRlZCBhc3NlbWJseSBjb3VsZCBjb250YWluIGRpZmZlcmVudAotICAgICAgICAgYXJ0aWZhY3QgdmVyc2lvbnMgLS0+Ci0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxjb3JlLnZlcnNpb24+MS4xLjI8L2NvcmUudmVyc2lvbj4KLSAgICAgICAgPHRyaW5pZGFkLXN1cHBvcnQudmVyc2lvbj4xLjEuMjwvdHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9uPgotICAgICAgICA8Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb24+MS4xLjI8L2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9uPgotICAgICAgICA8cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9uPjEuMS4yPC9wcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbCBiL3ByZXBhcmUvMV8xXzIvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNjc5NWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPmNvcmViaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAJPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+UkVBRE1FKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+TElDRU5TRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPk5PVElDRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPlJFTEVBU0UqPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9qYXZhZG9jPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmphdmFkb2M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sIGIvcHJlcGFyZS8xXzFfMi9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3Jlc3JjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUxODZjNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+Y29yZXNyYzwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPiAgCi0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAJPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+UkVBRE1FKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+TElDRU5TRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPk5PVElDRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPlJFTEVBU0UqPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+ICAgCi0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9zcmM8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+c3JjPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgotIApkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8xXzIvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NGUxYTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IKLUNvcHlyaWdodCAyMDA3LTIwMDkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sIGIvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE5YTNhNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGU8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4xLjI8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+Y29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjEuMjwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y2dsaWI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZ2xpYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMV8zPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWVjZTU1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCFET0NUWVBFIGZhY2VzLWNvbmZpZyBQVUJMSUMNCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiINCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxmYWNlcy1jb25maWc+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+DQotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMuc3RhcnR1cC5HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyDQotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OTNiZmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGNlYzc2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcktpdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi0NCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZEludGVyY2VwdG9yOw0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuRW5oYW5jZXI7DQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RQcm94eTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxHZW5lcmljUmVuZGVyS2l0IGV4dGVuZHMgRXh0VmFsUmVuZGVyS2l0IGltcGxlbWVudHMgTWV0aG9kSW50ZXJjZXB0b3INCi17DQotICAgIHB1YmxpYyBzdGF0aWMgUmVuZGVyS2l0IG5ld0luc3RhbmNlKFJlbmRlcktpdCByZW5kZXJLaXQpDQotICAgIHsNCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IHJlbmRlcktpdC5nZXRDbGFzcygpOw0KLQ0KLSAgICAgICAgLy9pdCdzIG5vdCBwb3NzaWJsZSB0byB3cmFwIHRoZSBjb252ZXJ0ZXIgYWdhaW4gLSBvY2N1cnMgZS5nLiB1bmRlciBzb2xhcmlzICsgYmVhIHdlYmxvZ2ljDQotICAgICAgICBpZiAoY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRFbmhhbmNlckJ5Q0dMSUIkJCIpDQotICAgICAgICAgICAgfHwgY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRGYXN0Q2xhc3NCeUNHTElCJCQiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRW5oYW5jZXIgZW5oYW5jZXIgPSBuZXcgRW5oYW5jZXIoKTsNCi0gICAgICAgIGVuaGFuY2VyLnNldFN1cGVyY2xhc3MocmVuZGVyS2l0LmdldENsYXNzKCkpOw0KLSAgICAgICAgZW5oYW5jZXIuc2V0Q2FsbGJhY2sobmV3IEV4dFZhbEdlbmVyaWNSZW5kZXJLaXQocmVuZGVyS2l0KSk7DQotDQotICAgICAgICByZXR1cm4gKFJlbmRlcktpdCkgZW5oYW5jZXIuY3JlYXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBpbnRlcmNlcHQoT2JqZWN0IG9iaiwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncywgTWV0aG9kUHJveHkgcHJveHkpIHRocm93cyBUaHJvd2FibGUNCi0gICAgew0KLSAgICAgICAgaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldFJlbmRlcmVyIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFJlbmRlcmVyKChTdHJpbmcpYXJnc1swXSwgKFN0cmluZylhcmdzWzFdKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImFkZFJlbmRlcmVyIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkUmVuZGVyZXIoKFN0cmluZylhcmdzWzBdLCAoU3RyaW5nKWFyZ3NbMV0sIChSZW5kZXJlcilhcmdzWzJdKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJveHkuaW52b2tlU3VwZXIob2JqLCBhcmdzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBFeHRWYWxHZW5lcmljUmVuZGVyS2l0KFJlbmRlcktpdCB3cmFwcGVkKQ0KLSAgICB7DQotICAgICAgICBzdXBlcih3cmFwcGVkKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIGNyZWF0ZVdyYXBwZXIoUmVuZGVyZXIgcmVuZGVyZXIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLm5ld0luc3RhbmNlKHJlbmRlcmVyKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MjQxNzcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlcldyYXBwZXI7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RJbnRlcmNlcHRvcjsKLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuRW5oYW5jZXI7Ci1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZFByb3h5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgZmluYWwgY2xhc3MgRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlciBleHRlbmRzIEV4dFZhbFJlbmRlcmVyV3JhcHBlciBpbXBsZW1lbnRzIE1ldGhvZEludGVyY2VwdG9yCi17Ci0gICAgcHVibGljIHN0YXRpYyBSZW5kZXJlciBuZXdJbnN0YW5jZShSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IHJlbmRlcmVyLmdldENsYXNzKCk7Ci0KLSAgICAgICAgLy90byBhdm9pZCByZS13cmFwcGluZyAtIG9jY3VycyBlLmcuIHVuZGVyIHNvbGFyaXMgKyBiZWEgd2VibG9naWMKLSAgICAgICAgaWYgKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkuY29udGFpbnMoIiQkRW5oYW5jZXJCeUNHTElCJCQiKSB8fAotICAgICAgICAgICAgY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRGYXN0Q2xhc3NCeUNHTElCJCQiKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgRW5oYW5jZXIgZW5oYW5jZXIgPSBuZXcgRW5oYW5jZXIoKTsKLSAgICAgICAgZW5oYW5jZXIuc2V0U3VwZXJjbGFzcyhyZW5kZXJlci5nZXRDbGFzcygpKTsKLSAgICAgICAgZW5oYW5jZXIuc2V0Q2FsbGJhY2sobmV3IEV4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIocmVuZGVyZXIpKTsKLQotICAgICAgICByZXR1cm4gKFJlbmRlcmVyKSBlbmhhbmNlci5jcmVhdGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGludGVyY2VwdChPYmplY3Qgb2JqLCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzLCBNZXRob2RQcm94eSBwcm94eSkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJnZXRDb252ZXJ0ZWRWYWx1ZSIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldENvbnZlcnRlZFZhbHVlKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0sIGFyZ3NbMl0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJkZWNvZGUiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlY29kZSgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZW5jb2RlQmVnaW4iKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZUJlZ2luKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJlbmNvZGVDaGlsZHJlbiIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlQ2hpbGRyZW4oKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImVuY29kZUVuZCIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlRW5kKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJjb252ZXJ0Q2xpZW50SWQiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29udmVydENsaWVudElkKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFN0cmluZylhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0UmVuZGVyc0NoaWxkcmVuIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRSZW5kZXJzQ2hpbGRyZW4oKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibWV0aG9kICIgKyBtZXRob2QuZ2V0TmFtZSgpICsgIiBjYWxsZWQgd2l0aG91dCByZW5kZXJpbmctaW50ZXJjZXB0b3JzIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBwcm94eS5pbnZva2VTdXBlcihvYmosIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyKFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgewotICAgICAgICBzdXBlcih3cmFwcGVkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0dlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzVkMjhiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0dlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkNCi17DQotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImV4dHZhbCByZW5kZXJraXQgd3JhcHBlciBjcmVhdGVkIGZvciAiICsgcmVuZGVyS2l0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB2aWEgY2dsaWIiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBFeHRWYWxHZW5lcmljUmVuZGVyS2l0Lm5ld0luc3RhbmNlKHJlbmRlcktpdCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9zdGFydHVwL0dlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YzdiNDEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9zdGFydHVwL0dlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0LkdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEdlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKS5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5SRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmNsYXNzKS5hZGRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeShuZXcgR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OTNiZmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI5YzM5ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGUNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGUgcHJvdmlkZXMgZ2VuZXJpYyBTdXBwb3J0IGZvciBKU0YgY29tcG9uZW50IGZyYW1ld29ya3Mgd2hpY2ggaGF2ZSBzcGVjaWFsIHJlcXVpcmVtZW50cyAoZS5nLiBSaWNoRmFjZXMsIE15RmFjZXMgVG9iYWdvLCAuLi4pLg0KLSAgDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLjEueCBhbmQgSlNGIDEuMi54LiBCb3RoIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrDQotICANCi0gICAgDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC9wb20ueG1sIGIvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTEyOWZiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIENvbXBvbmVudC1TdXBwb3J0IE1vZHVsZXM8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4xLjI8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4xLjI8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90YWdzLzFfMV8yPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzI8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RhZ3MvMV8xXzI8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxtb2R1bGVzPgotICAgICAgICA8bW9kdWxlPnRyaW5pZGFkLXN1cHBvcnQ8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5nZW5lcmljLXN1cHBvcnQ8L21vZHVsZT4KLSAgICA8L21vZHVsZXM+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDx0cmluaWRhZC52ZXJzaW9uPjEuMC41PC90cmluaWRhZC52ZXJzaW9uPgotICAgIDwvcHJvcGVydGllcz4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvcG9tLnhtbCBiL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWJkNDE5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPgotCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZTwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjEuMjwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS4yPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZWUzODUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQwotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMC8vRU4iCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlcy1jb25maWc+Ci0gICAgPGxpZmVjeWNsZT4KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0YXJ0dXAuVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIKLSAgICAgICAgPC9waGFzZS1saXN0ZW5lcj4KLSAgICA8L2xpZmVjeWNsZT4KLQotICAgIDxsaWZlY3ljbGU+Ci0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj4KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyCi0gICAgICAgIDwvcGhhc2UtbGlzdGVuZXI+Ci0gICAgPC9saWZlY3ljbGU+Ci08L2ZhY2VzLWNvbmZpZz4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODkzYmZmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNiNGRiYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdC5FeHRWYWxUcmluaWRhZFJlbmRlcktpdDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeTsKLQotLyoqCi0gKiB1c2UgdGhpcyBwaGFzZS1saXN0ZW5lciBpbnN0ZWFkIG9mIGEgRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBkdWUgdG8gYSB0cmluaWRhZCBpc3N1ZQotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lciBpbXBsZW1lbnRzIFBoYXNlTGlzdGVuZXIKLXsKLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgICBpZihldmVudC5nZXRQaGFzZUlkKCkgIT0gUGhhc2VJZC5BUFBMWV9SRVFVRVNUX1ZBTFVFUyAmJiBldmVudC5nZXRQaGFzZUlkKCkgIT0gUGhhc2VJZC5SRU5ERVJfUkVTUE9OU0UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7Ci0KLSAgICAgICAgUmVuZGVyS2l0RmFjdG9yeSByZW5kZXJLaXRGYWN0b3J5ID0gKFJlbmRlcktpdEZhY3RvcnkpCi0gICAgICAgICAgICBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRmFjdG9yeUZpbmRlci5SRU5ERVJfS0lUX0ZBQ1RPUlkpOwotCi0gICAgICAgIFN0cmluZyByZW5kZXJLaXRJZCA9IGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldFJlbmRlcktpdElkKCk7Ci0KLSAgICAgICAgaWYoRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuSUQuZXF1YWxzKHJlbmRlcktpdElkKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVuZGVyS2l0IHJlbmRlcktpdCA9IHJlbmRlcktpdEZhY3RvcnkuZ2V0UmVuZGVyS2l0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgcmVuZGVyS2l0SWQpOwotICAgICAgICByZW5kZXJLaXRGYWN0b3J5LmFkZFJlbmRlcktpdChFeHRWYWxUcmluaWRhZFJlbmRlcktpdC5JRCwgbmV3IEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0KHJlbmRlcktpdCkpOwotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5zZXRSZW5kZXJLaXRJZChFeHRWYWxUcmluaWRhZFJlbmRlcktpdC5JRCk7Ci0gICAgfQotCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gUGhhc2VJZC5SRU5ERVJfUkVTUE9OU0U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTBjYjc0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFyZW4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICAvKg0KLSAgICAgKiBkZWFjdGl2YXRlDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfQ0xJRU5UX1NJREVfVFJJTklEQURfVkFMSURBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9DTElFTlRfU0lERV9UUklOSURBRF9WQUxJREFUSU9OIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9UUklOSURBRF9DT1JFX09VVFBVVF9MQUJFTF9JTklUSUFMSVpBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9UUklOSURBRF9DT1JFX09VVFBVVF9MQUJFTF9JTklUSUFMSVpBVElPTiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfVFJJTklEQURfVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfVFJJTklEQURfVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IiKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0RvdWJsZVJhbmdlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIzMjlmNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0RvdWJsZVJhbmdlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5Eb3VibGVSYW5nZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkNsaWVudFZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJza2lwVmFsaWRhdGlvblN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24iKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIERvdWJsZVJhbmdlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW5mb3JtYXRpb25BZGRlZCA9IGZhbHNlOwotICAgICAgICBEb3VibGVSYW5nZVZhbGlkYXRvciBkb3VibGVSYW5nZVZhbGlkYXRvciA9IChEb3VibGVSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRG91YmxlUmFuZ2UiKTsKLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKTsKLQotICAgICAgICAgICAgaWYobWluIGluc3RhbmNlb2YgRG91YmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnNldE1pbmltdW0oKERvdWJsZSltaW4pOwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCk7Ci0KLSAgICAgICAgICAgIGlmKG1heExlbmd0aCBpbnN0YW5jZW9mIERvdWJsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNYXhpbXVtKChEb3VibGUpbWF4TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoaW5mb3JtYXRpb25BZGRlZCAmJgotICAgICAgICAgICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yIGluc3RhbmNlb2YgQ2xpZW50VmFsaWRhdG9yICYmIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIoKENsaWVudFZhbGlkYXRvcilkb3VibGVSYW5nZVZhbGlkYXRvcikpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0MTIyNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xlbmd0aEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5DbGllbnRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLm91dHB1dC5Db3JlT3V0cHV0TGFiZWw7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkxlbmd0aFZhbGlkYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJza2lwVmFsaWRhdGlvblN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24iKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIExlbmd0aEluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBib29sZWFuIGluZm9ybWF0aW9uQWRkZWQgPSBmYWxzZTsKLSAgICAgICAgLy9UT0RPCi0gICAgICAgIExlbmd0aFZhbGlkYXRvciBsZW5ndGhWYWxpZGF0b3IgPSAoTGVuZ3RoVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5MZW5ndGgiKTsKLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEgpOwotCi0gICAgICAgICAgICBpZihtaW4gaW5zdGFuY2VvZiBJbnRlZ2VyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNaW5pbXVtKChJbnRlZ2VyKW1pbik7Ci0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpOwotCi0gICAgICAgICAgICBpZihtYXhMZW5ndGggaW5zdGFuY2VvZiBJbnRlZ2VyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LmdldENsYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0TWF4aW11bUxlbmd0aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQuY2xhc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNYXhpbXVtKChJbnRlZ2VyKW1heExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL3JlSW5pdFZhbGlkYXRvcnMoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQsIG1ldGFEYXRhKTsgLy9zZWFyY2ggd3JhcHBlcnMgYW5kIGNhbGwgLmRlYWN0aXZhdGUKLQotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkICYmIGxlbmd0aFZhbGlkYXRvciBpbnN0YW5jZW9mIENsaWVudFZhbGlkYXRvcikKLSAgICAgICAgewotICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKWxlbmd0aFZhbGlkYXRvcikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobGVuZ3RoVmFsaWRhdG9yLmdldE1pbmltdW0oKSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgoQ29yZU91dHB1dExhYmVsKXVpQ29tcG9uZW50KS5zZXRTaG93UmVxdWlyZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTG9uZ1JhbmdlSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTG9uZ1JhbmdlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVjMzRkZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xvbmdSYW5nZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuTG9uZ1JhbmdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgTG9uZ1JhbmdlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW5mb3JtYXRpb25BZGRlZCA9IGZhbHNlOwotICAgICAgICBMb25nUmFuZ2VWYWxpZGF0b3IgbG9uZ1JhbmdlVmFsaWRhdG9yID0gKExvbmdSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTG9uZ1JhbmdlIik7Ci0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTik7Ci0KLSAgICAgICAgICAgIGlmKG1pbiBpbnN0YW5jZW9mIExvbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnNldE1pbmltdW0oKExvbmcpbWluKTsKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpOwotCi0gICAgICAgICAgICBpZihtYXhMZW5ndGggaW5zdGFuY2VvZiBMb25nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvci5zZXRNYXhpbXVtKChMb25nKW1heExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkICYmCi0gICAgICAgICAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yIGluc3RhbmNlb2YgQ2xpZW50VmFsaWRhdG9yICYmIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikKLSAgICAgICAgewotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKWxvbmdSYW5nZVZhbGlkYXRvcikpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUmVxdWlyZWRJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OTlmZTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnV0aWwuVHJpbmlkYWRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBSZXF1aXJlZEluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpIHx8Ci0gICAgICAgICAgIG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKXx8Ci0gICAgICAgICAgIG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigoCi0gICAgICAgICAgICAgICAgICAgICghQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpICYmCi0gICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKSkpIHx8Ci0gICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhpc0NvbXBvbmVudFJlcXVpcmVkKHVpQ29tcG9uZW50KSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkgJiYKLSAgICAgICAgICAgICAgICAgICAhQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgQ29yZU91dHB1dExhYmVsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChDb3JlT3V0cHV0TGFiZWwpdWlDb21wb25lbnQpLnNldFNob3dSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQm9vbGVhbiBpc0NvbXBvbmVudFJlcXVpcmVkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpQ29tcG9uZW50ID0gVHJpbmlkYWRVdGlscy5maW5kTGFiZWxlZEVkaXRhYmxlQ29tcG9uZW50KChDb3JlT3V0cHV0TGFiZWwpIHVpQ29tcG9uZW50KTsKLQotICAgICAgICAgICAgaWYodWlDb21wb25lbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vY29tcGFyZSB3aXRoIGZhbHNlIHNvIHRydWUgPSB0cnVlIG9yIG51bGwKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc1JlYWRPbmx5IikpKTsKLSAgICAgICAgYm9vbGVhbiBpc0Rpc2FibGVkID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc0Rpc2FibGVkIikpKTsKLQotICAgICAgICByZXR1cm4gIShpc1JlYWRPbmx5IHx8IGlzRGlzYWJsZWQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NjRjZTEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29udGV4dC5SZXF1ZXN0Q29udGV4dDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9URVhUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXRUZXh0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXREYXRlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8VHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcj4gY29tcG9uZW50SW5pdGlhbGl6ZXJzID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyPigpOwotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBSZXF1aXJlZEluaXRpYWxpemVyKCkpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBMZW5ndGhJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgTG9uZ1JhbmdlSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IERvdWJsZVJhbmdlSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFBhdHRlcm5Jbml0aWFsaXplcigpKTsKLSAgICAgICAgLy9jb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBWYWxpZGF0b3JJbml0aWFsaXplcigpKTsKLSAgICB9Ci0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkxPVywgZGVzY3JpcHRpb24gPSAiY2hlY2sgcHByIGlzc3VlIikKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBmb3IoVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplciA6IGNvbXBvbmVudEluaXRpYWxpemVycykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoY29tcG9uZW50SW5pdGlhbGl6ZXIuY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVwZGF0ZUNvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKSB8fAotICAgICAgICAgICAgICAgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFLmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmKFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmlzUGFydGlhbFJlcXVlc3QoZmFjZXNDb250ZXh0KSkKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuYWRkUGFydGlhbFRhcmdldCh1aUNvbXBvbmVudC5nZXRQYXJlbnQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1ZhbGlkYXRvckluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1ZhbGlkYXRvckluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODg3OGMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24odmFsdWUgPSBVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gImltcGwuIHRyaW5pZGFkIGUtbWFpbCB2YWxpZGF0b3IiKQotY2xhc3MgVmFsaWRhdG9ySW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCFtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuQ1VTVE9NKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00pOwotCi0gICAgICAgIGlmKCEodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKE9iamVjdCBjdXJyZW50VmFsdWUgOiAoTGlzdCl2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIShjdXJyZW50VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihDb21tb25NZXRhRGF0YUtleXMuRU1BSUwuZXF1YWxzKGN1cnJlbnRWYWx1ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9UT0RPCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNjdjZjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudXRpbC5UcmluaWRhZFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yIGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yDQotew0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkNCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYoZmlsdGVyQ29yZU91dHB1dExhYmVsKHVpQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0Q29yZU91dHB1dExhYmVsKGZhY2VzQ29udGV4dCwgKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGZpbHRlckNvcmVPdXRwdXRMYWJlbChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIENvcmVPdXRwdXRMYWJlbCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdENvcmVPdXRwdXRMYWJlbChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBDb3JlT3V0cHV0TGFiZWwgY29yZU91dHB1dExhYmVsKQ0KLSAgICB7DQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLQ0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgYW5ub3RhdGlvbkV4dHJhY3RvciA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKS5nZXRGYWN0b3J5KA0KLSAgICAgICAgICAgIEZhY3RvcnlOYW1lcy5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLCBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuY2xhc3MpLmNyZWF0ZSgpOw0KLQ0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gVHJpbmlkYWRVdGlscy5maW5kTGFiZWxlZEVkaXRhYmxlQ29tcG9uZW50KGNvcmVPdXRwdXRMYWJlbCk7DQotDQotICAgICAgICBpZih0YXJnZXRDb21wb25lbnQgPT0gbnVsbCB8fCAhaXNDb21wb25lbnRFZGl0YWJsZSh0YXJnZXRDb21wb25lbnQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEJvb2xlYW4gc2tpcEluaXRpYWxpemF0aW9uID0gZmFsc2U7DQotDQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhOw0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogYW5ub3RhdGlvbkV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgdGFyZ2V0Q29tcG9uZW50KS5nZXRNZXRhRGF0YUVudHJpZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IEV4dFZhbFV0aWxzLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZihtZXRhRGF0YSA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vZXhlY3V0ZSBza2lwIHZhbGlkYXRpb24gc3RyYXRlZ3kgLT4gc2tpcCB2YWxpZGF0aW9uIHkvbiBpbiBlbnRyeQ0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdGFyZ2V0Q29tcG9uZW50LCBlbnRyeSwgbnVsbCk7DQotICAgICAgICAgICAgICAgICAgICBza2lwSW5pdGlhbGl6YXRpb24gPSBlbnRyeS5nZXRQcm9wZXJ0eShDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCBCb29sZWFuLmNsYXNzKTsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMoc2tpcEluaXRpYWxpemF0aW9uKSAmJiAhbWV0YURhdGEuaXNFbXB0eSgpICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuaXNTa2lwYWJsZVZhbGlkYXRpb25TdHJhdGVneSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhLnB1dChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCB0cnVlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZighbWV0YURhdGEuaXNFbXB0eSgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoZmFjZXNDb250ZXh0LCBjb3JlT3V0cHV0TGFiZWwsIG1ldGFEYXRhKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDb21wb25lbnRFZGl0YWJsZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgLy9jb21wYXJlIHdpdGggZmFsc2Ugc28gdHJ1ZSA9IHRydWUgb3IgbnVsbA0KLSAgICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNSZWFkT25seSIpKSk7DQotICAgICAgICBib29sZWFuIGlzRGlzYWJsZWQgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc0Rpc2FibGVkIikpKTsNCi0NCi0gICAgICAgIHJldHVybiAhKGlzUmVhZE9ubHkgfHwgaXNEaXNhYmxlZCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVjMjY5NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5MYWJlbGVkTWVzc2FnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbnRleHQuUmVxdWVzdENvbnRleHQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dFRleHQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUuaW5wdXQuQ29yZUlucHV0RGF0ZSI7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICB7DQotICAgICAgICByZWZyZXNoQ29tcG9uZW50KHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCk7DQotDQotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gZ2V0TGFiZWwodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgICAgIGlmKGxhYmVsID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsYWJlbCA9IHVpQ29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vb3ZlcnJpZGUgdGhlIGxhYmVsIGlmIHRoZSBhbm5vdGF0aW9uIHByb3ZpZGVzIGEgbGFiZWwNCi0gICAgICAgICAgICBpZihtZXRhRGF0YUVudHJ5ICE9IG51bGwgJiYgbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxhYmVsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCwgU3RyaW5nLmNsYXNzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYoZmFjZXNNZXNzYWdlIGluc3RhbmNlb2YgTGFiZWxlZE1lc3NhZ2UpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAoKExhYmVsZWRNZXNzYWdlKWZhY2VzTWVzc2FnZSkuc2V0TGFiZWxUZXh0KGxhYmVsKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy9pZiBzb21lb25lIHVzZXMgYSBub3JtYWwgZmFjZXMgbWVzc2FnZQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvUGxhY2VMYWJlbChmYWNlc01lc3NhZ2UsIGxhYmVsLCBpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZWZyZXNoQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZihSZXF1ZXN0Q29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5pc1BhcnRpYWxSZXF1ZXN0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuYWRkUGFydGlhbFRhcmdldCh1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVC5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpIHx8DQotICAgICAgICAgICAgICAgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFLmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGFiZWwoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoU3RyaW5nKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCh1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJnZXRMYWJlbCIpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYyNzAxZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnJlbmRlcmtpdC5jb3JlLnhodG1sLnRhYmxlLlRhYmxlUmVuZGVyaW5nQ29udGV4dDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIHNvbHV0aW9uIGZvciB0cmluaWRhZCB0YWJsZSByZW5kZXJlciBpc3N1ZSAoaW4gY29ubmVjdGlvbiB3aXRoIGRvdWJsZSBjYWxsIHByZXZlbnRpb24gcHJveGllcykNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1wdWJsaWMgY2xhc3MgRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5IGV4dGVuZHMgRXh0VmFsUmVuZGVyZXJQcm94eQ0KLXsNCi0gICAgcHVibGljIEV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgc3VwZXIocmVuZGVyZXIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wdGlvbmFsS2V5KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZihUYWJsZVJlbmRlcmluZ0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gInwiICsgVGFibGVSZW5kZXJpbmdDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFJlbmRlclN0YWdlKCkuZ2V0U3RhZ2UoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAiIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJkZWNiNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQuVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnZhbGlkYXRpb24ubWVzc2FnZS5UcmluaWRhZEZhY2VzTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQuRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3IuVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvci5UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBhbHRlcm5hdGl2ZSBhcHByb2FjaCBmb3IgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFRyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBpbml0VHJpbmlkYWRTdXBwb3J0KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRUcmluaWRhZFN1cHBvcnQoKQ0KLSAgICB7DQotICAgICAgICAvL2RlYWN0aXZhdGUgZGVmYXVsdCBhcHByb2FjaA0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpLmRlYWN0aXZhdGUoKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIGRlYWN0aXZhdGVDbGllbnRTaWRlVmFsaWRhdGlvbiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NMSUVOVF9TSURFX1RSSU5JREFEX1ZBTElEQVRJT047DQotDQotICAgICAgICBpZihkZWFjdGl2YXRlQ2xpZW50U2lkZVZhbGlkYXRpb24gPT0gbnVsbCB8fCAhZGVhY3RpdmF0ZUNsaWVudFNpZGVWYWxpZGF0aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBkZWFjdGl2YXRlSW5pdENvcmVPdXRwdXRMYWJlbCA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX1RSSU5JREFEX0NPUkVfT1VUUFVUX0xBQkVMX0lOSVRJQUxJWkFUSU9OOw0KLQ0KLSAgICAgICAgaWYoZGVhY3RpdmF0ZUluaXRDb3JlT3V0cHV0TGFiZWwgPT0gbnVsbCB8fCAhZGVhY3RpdmF0ZUluaXRDb3JlT3V0cHV0TGFiZWwuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIGRlYWN0aXZhdGVUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA9DQotICAgICAgICAgICAgICAgIFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX1RSSU5JREFEX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SOw0KLQ0KLSAgICAgICAgaWYoZGVhY3RpdmF0ZVRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yID09IG51bGwgfHwNCi0gICAgICAgICAgICAgICAgIWRlYWN0aXZhdGVUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKG5ldyBUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vZGVhY3RpdmF0ZSBleHR2YWwgcmVuZGVyZXIgcHJveHkgLSBkdWUgdG8gYW4gaW5jb21wYXRpYmlsaXR5IHdpdGggdGhlIHRhYmxlIHJlbmRlcmVyDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVksIEV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY3RvcnlOYW1lcy5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkubmFtZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIGlmIHRoZXJlIGFyZSBmdXJ0aGVyIGluY29tcGF0aWJsZSByZW5kZXJlcnMgdXNlIHRoZSBmb2xsb3dpbmcgcXVpY2stZml4Og0KLSAgICAgICAgICogICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVksIG51bGwpOw0KLSAgICAgICAgICAgYXR0ZW50aW9uOiBpdCBjYXVzZXMgZGlyZWN0IGRlbGVnYXRpb24gd2l0aG91dCBhIGNoZWNrIG9mIGRvdWJsZSBpbnZvY2F0aW9ucw0KLSAgICAgICAgICovDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3V0aWwvVHJpbmlkYWRVdGlscy5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3V0aWwvVHJpbmlkYWRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTdhZWU5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC91dGlsL1RyaW5pZGFkVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImNoZWNrIHN1YmZvcm0iKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZFV0aWxzDQotew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhUcmluaWRhZFV0aWxzLmNsYXNzKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBVSUNvbXBvbmVudCBmaW5kTGFiZWxlZEVkaXRhYmxlQ29tcG9uZW50KENvcmVPdXRwdXRMYWJlbCBjb3JlT3V0cHV0TGFiZWwpDQotICAgIHsNCi0gICAgICAgIC8vVE9ETw0KLSAgICAgICAgaWYoY29yZU91dHB1dExhYmVsLmdldEZvcigpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgVUlDb21wb25lbnQgcmVzdWx0ID0gZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZmluZENvbXBvbmVudChjb3JlT3V0cHV0TGFiZWwuZ2V0Rm9yKCkpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoTE9HLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgTE9HLnRyYWNlKGNvcmVPdXRwdXRMYWJlbC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpICsgIiBkb2Vzbid0IHJlZmVyZW5jZSBhbiBlZGl0YWJsZSBjb21wb25lbnQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDFhYTFjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudXRpbC5MYWJlbGVkRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5MYWJlbGVkTWVzc2FnZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBUcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UgZXh0ZW5kcyBMYWJlbGVkRmFjZXNNZXNzYWdlIGltcGxlbWVudHMgTGFiZWxlZE1lc3NhZ2UNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYzNTY4MDA2ODk5NjE1MDUxNTRMOw0KLQ0KLSAgICBwdWJsaWMgVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlKFNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgc3VwZXIoc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TGFiZWxBc1N0cmluZyhGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldExhYmVsKGxhYmVsKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1YjNhNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWVmNmUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcgotQ29weXJpZ2h0IDIwMDctMjAwOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI0OTU5OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlIHByb3ZpZGVzIHNwZWNpYWwgVHJpbmlkYWQgU3VwcG9ydCBmb3IgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvci4NCi0gICAgRnVydGhlcm1vcmUsIGl0IGFsbG93cyB0byBqb2luIHRoZSBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIG1lY2hhbmlzbSBvZiBUcmluaWRhZC4gU2FtcGxlIHVzZS1jYXNlOiBhbm5vdGF0ZSB5b3VyIG1vZGVsIHdpdGggSlBBIDEuMCBhbm5vdGF0aW9ucywgYmluZCBwcm9wZXJ0aWVzIHRvIEpTRiBJbnB1dCBjb21wb25lbnRzIGFuZCBnZXQgYXV0b21hdGljIGNsaWVudC1zaWRlIHZhbGlkYXRpb24ganVzdCBieSBhZGRpbmcgMyBKQVIgZmlsZXMgKE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSwgUHJvcGVydHkgVmFsaWRhdGlvbiBhbmQgVHJpbmlkYWQgU3VwcG9ydCkuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLjEueCBhbmQgSlNGIDEuMi54LiBCb3RoIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3BvbS54bWwgYi9wcmVwYXJlLzFfMV8yL2NvcmUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE1ODEzNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjEuMjwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQ29yZTwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjEuMjwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICAgIAotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RhZ3MvMV8xXzI8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGFncy8xXzFfMjwvdXJsPgotICAgIDwvc2NtPgotICAgIAotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtY29kZWM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvZGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMDQ0NzYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCFET0NUWVBFIGZhY2VzLWNvbmZpZyBQVUJMSUMNCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiINCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxmYWNlcy1jb25maWc+DQotICAgIDxmYWN0b3J5Pg0KLSAgICAgICAgPHJlbmRlci1raXQtZmFjdG9yeT5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyS2l0RmFjdG9yeTwvcmVuZGVyLWtpdC1mYWN0b3J5Pg0KLSAgICA8L2ZhY3Rvcnk+DQotDQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5FeHRWYWxTdGFydHVwTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg5M2JmZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0V4dFZhbEluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkNWQxYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLQ0KLS8qKg0KLSAqIGRvbnQndCBtb3ZlIHRvIGFuIG90aGVyIHBhY2thZ2UhISENCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBFeHRWYWxJbmZvcm1hdGlvbg0KLXsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSA9IEV4dFZhbEluZm9ybWF0aW9uLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCWE1MX1BBUkFNX1BSRUZJWCA9IEV4dFZhbEluZm9ybWF0aW9uLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9IENsYXNzVXRpbHMuZ2V0SmFyVmVyc2lvbihFeHRWYWxJbmZvcm1hdGlvbi5jbGFzcyk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0N1c3RvbUluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9DdXN0b21JbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTkwY2U1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0N1c3RvbUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSX0pDQotcHVibGljIGVudW0gQ3VzdG9tSW5mb3JtYXRpb24NCi17DQotICAgIEJBU0VfUEFDS0FHRSwNCi0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IsDQotDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCwNCi0gICAgVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFX1JFU09MVkVSX1BPU1RGSVgsDQotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYLA0KLQ0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01TR19SRVNPTFZFUl9OQU1FX01BUFBFUiwNCi0gICAgTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIsDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSLA0KLQ0KLSAgICBTVEFSVFVQX0xJU1RFTkVSLA0KLSAgICBDT01QT05FTlRfSU5JVElBTElaRVIsDQotICAgIFZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SLA0KLSAgICBNRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUiwNCi0NCi0gICAgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLA0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksDQotICAgIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksDQotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLA0KLSAgICBGQUNFU19NRVNTQUdFX0ZBQ1RPUlksDQotDQotICAgIE1FU1NBR0VfQlVORExFX05BTUUsDQotICAgIFNUQVRJQ19TVFJBVEVHWV9NQVBQSU5HX1NPVVJDRQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMTBmMDcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlci5Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeUZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkRlZmF1bHRGYWN0b3J5RmluZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgRXh0VmFsQ29udGV4dAotewotICAgIHByaXZhdGUgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRXh0VmFsQ29udGV4dCBleHRWYWxDb250ZXh0ID0gbmV3IEV4dFZhbENvbnRleHQoKTsKLQotICAgIHByaXZhdGUgRmFjdG9yeUZpbmRlciBmYWN0b3J5RmluZGVyID0gRGVmYXVsdEZhY3RvcnlGaW5kZXIuZ2V0SW5zdGFuY2UoKTsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFJlbmRlcmVySW50ZXJjZXB0b3I+IHJlbmRlcmVySW50ZXJjZXB0b3JzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBSZW5kZXJlckludGVyY2VwdG9yPigpOwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGRlbmllZEludGVyY2VwdG9ycyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIHByaXZhdGUgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyPiBwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycyA9Ci0gICAgICAgIG5ldyBBcnJheUxpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcj4oKTsKLQotICAgIHByaXZhdGUgTGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4gY29tcG9uZW50SW5pdGlhbGl6ZXJzOwotICAgIHByaXZhdGUgTGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+IHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnM7Ci0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnM7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2xvYmFsUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLCBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+Pj4gc3RhdGljQ29uZmlnTWFwCi0gICAgICAgID0gbmV3IEhhc2hNYXA8U3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLCBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+Pj4oKTsKLQotCi0gICAgcHJpdmF0ZSB2b2lkIGxhenlJbml0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMuY29tcG9uZW50SW5pdGlhbGl6ZXJzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuY29tcG9uZW50SW5pdGlhbGl6ZXJzID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4oKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMKLSAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9DT01QT05FTlRfSU5JVElBTElaRVIpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMKLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX0lOSVRJQUxJWkVSKSk7Ci0KLSAgICAgICAgQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXI7Ci0gICAgICAgIGZvciAoU3RyaW5nIGNvbXBvbmVudEluaXRpYWxpemVyTmFtZSA6IGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXIgPQotICAgICAgICAgICAgICAgIChDb21wb25lbnRJbml0aWFsaXplcikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNvbXBvbmVudEluaXRpYWxpemVyTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChjb21wb25lbnRJbml0aWFsaXplciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQoY29tcG9uZW50SW5pdGlhbGl6ZXIpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoY29tcG9uZW50SW5pdGlhbGl6ZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxhenlJbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBpZih0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+KCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SKTsKLSAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldCgKLSAgICAgICAgICAgICAgICAgICAgQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IpKTsKLQotICAgICAgICBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lIDogdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yID0KLSAgICAgICAgICAgICAgICAoVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUpOwotCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycy5hZGQodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbGF6eUluaXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5tZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5tZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMgPSBuZXcgQXJyYXlMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPigpOwotCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMKLSAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUik7Ci0gICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldCgKLSAgICAgICAgICAgICAgICAgICAgQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IpKTsKLQotICAgICAgICBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsKLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSA6IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgPQotICAgICAgICAgICAgICAgIChNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lKTsKLQotICAgICAgICAgICAgaWYgKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMuYWRkKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRXh0VmFsQ29udGV4dCBnZXRDb250ZXh0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBleHRWYWxDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBGYWN0b3J5RmluZGVyIGdldEZhY3RvcnlGaW5kZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZhY3RvcnlGaW5kZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmFjdG9yeUZpbmRlcihGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIpCi0gICAgewotICAgICAgICBpZihmYWN0b3J5RmluZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZmFjdG9yeUZpbmRlciA9IGZhY3RvcnlGaW5kZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxSZW5kZXJlckludGVyY2VwdG9yPiBnZXRSZW5kZXJlckludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxSZW5kZXJlckludGVyY2VwdG9yPihyZW5kZXJlckludGVyY2VwdG9ycy52YWx1ZXMoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoRXh0VmFsQ29udGV4dC5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlbmllZEludGVyY2VwdG9ycy5jb250YWlucyhyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9ycy5wdXQocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCksIHJlbmRlcmVySW50ZXJjZXB0b3IpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlcmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKENsYXNzIHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcykKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA9Ci0gICAgICAgICAgICAoUmVuZGVyZXJJbnRlcmNlcHRvcikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3MocmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKEV4dFZhbENvbnRleHQuY2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3JzLnJlbW92ZShyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvL2lmIGFuIGludGVyY2VwdG9yIGhhc24ndCBiZWVuIHJlZ2lzdGVyZWQgc28gZmFyLCBpdCBzaG91bGQgYmUgZGVuaWVkIGF0IGZ1dHVyZSByZWdpc3RyYXRpb25zCi0gICAgcHVibGljIHZvaWQgZGVueVJlbmRlcmVySW50ZXJjZXB0b3IoQ2xhc3MgcmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yID0KLSAgICAgICAgICAgIChSZW5kZXJlckludGVyY2VwdG9yKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzcyhyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoRXh0VmFsQ29udGV4dC5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgZGVuaWVkSW50ZXJjZXB0b3JzLmFkZChyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVyZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IocmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb21wb25lbnRJbml0aWFsaXplcihDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplcikKLSAgICB7Ci0gICAgICAgIGxhenlJbml0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7Ci0gICAgICAgIHRoaXMuY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChjb21wb25lbnRJbml0aWFsaXplcik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+IGdldENvbXBvbmVudEluaXRpYWxpemVycygpCi0gICAgewotICAgICAgICBsYXp5SW5pdENvbXBvbmVudEluaXRpYWxpemVycygpOwotICAgICAgICByZXR1cm4gY29tcG9uZW50SW5pdGlhbGl6ZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcihWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgbGF6eUluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHRoaXMudmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycy5hZGQodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+IGdldFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgbGF6eUluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgbGF6eUluaXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLmFkZChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBsYXp5SW5pdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI+IGdldFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIgcHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcikKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMuYWRkKHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBnZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpCi0gICAgewotICAgICAgICBNYXAgYXBwbGljYXRpb25NYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25NYXAoKTsKLSAgICAgICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gYmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgYXBwbGljYXRpb25NYXAuZ2V0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSk7Ci0KLSAgICAgICAgaWYgKGJlYW4gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGluaXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbihhcHBsaWNhdGlvbk1hcCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJlYW47Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBpbml0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oTWFwIGFwcGxpY2F0aW9uTWFwKQotICAgIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9JTkZPUk1BVElPTl9QUk9WSURFUl9CRUFOKTsKLSAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzLmFkZChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5DVVNUT01fQkVBTik7Ci0KLSAgICAgICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW47Ci0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW4gPSAoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4pIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOwotCi0gICAgICAgICAgICBpZiAoaW5mb3JtYXRpb25Qcm92aWRlckJlYW4gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbk1hcC5wdXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FLCBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5VG9Jbml0Q3VzdG9tQ29uZmlndXJlZEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lKGFwcGxpY2F0aW9uTWFwKTsKLQotICAgICAgICBpZihhcHBsaWNhdGlvbk1hcC5jb250YWluc0tleShJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKWFwcGxpY2F0aW9uTWFwLmdldChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9Jbml0Q3VzdG9tQ29uZmlndXJlZEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lKE1hcCBhcHBsaWNhdGlvbk1hcCkKLSAgICB7Ci0gICAgICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGJlYW4gPSAoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4pIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkKLSAgICAgICAgICAgIC5nZXRCZWFuKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkNVU1RPTV9CRUFOLnJlcGxhY2UoIi4iLCAiXyIpKTsKLQotICAgICAgICBpZihiZWFuICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uTWFwLnB1dChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUsIGJlYW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IGdldFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzIG5hbWUpCi0gICAgewotICAgICAgICBpZighdGhpcy5zdGF0aWNDb25maWdNYXAuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IHN0YXRpY0NvbmZpZ0xpc3QgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICAgICAgdGhpcy5zdGF0aWNDb25maWdNYXAucHV0KG5hbWUsIHN0YXRpY0NvbmZpZ0xpc3QpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnN0YXRpY0NvbmZpZ01hcC5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMgbmFtZSwgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBzdGF0aWNDb25maWdMaXN0OwotICAgICAgICAgICAgaWYoIXRoaXMuc3RhdGljQ29uZmlnTWFwLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRpY0NvbmZpZ0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICAgICAgICAgIHRoaXMuc3RhdGljQ29uZmlnTWFwLnB1dChuYW1lLCBzdGF0aWNDb25maWdMaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMuc3RhdGljQ29uZmlnTWFwLmdldChuYW1lKS5hZGQoc3RhdGljQ29uZmlnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gYWRkR2xvYmFsUHJvcGVydHkobmFtZSAsIHZhbHVlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRHbG9iYWxQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIGZvcmNlT3ZlcnJpZGUpCi0gICAgewotICAgICAgICBpZih0aGlzLmdsb2JhbFByb3BlcnRpZXMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCFmb3JjZU92ZXJyaWRlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygib3ZlcnJpZGUgZ2xvYmFsIHByb3BlcnR5ICciICsgbmFtZSArICInIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5nbG9iYWxQcm9wZXJ0aWVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0R2xvYmFsUHJvcGVydHkoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5nbG9iYWxQcm9wZXJ0aWVzLmdldChuYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRlZmE2YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFyZW4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICogKyBzb21lIG9mIHRoZW0gY2FuIGJlIGN1c3RvbWl6ZWQgd2l0aGluIGEgY3VzdG9tIGltcGwuIG9mIHRoZSBiZWFuDQotICogKGV4dGVuZCB0aGlzIGNsYXNzIGFuZCBwcm92aWRlIGl0IHZpYSBjb252ZW50aW9uIG9yIHdlYi54bWwpDQotICogPHAvPg0KLSAqIHRoZSBzdGF0aWMgYXBpIHNob3VsZCBvbmx5IGJlIHVzZWQNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSSwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVBTl9OQU1FID0gRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUNCi0gICAgICAgICsgIi4iICsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICAvL2N1c3RvbSBjbGFzcyB3aGljaCBpcyBhbiBvcHRpb25hbCByZXBsYWNlbWVudCBmb3IgdGhpcyBjbGFzcyAoaGFzIHRvIGV4dGVuZCB0aGlzIGNsYXNzKQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQkVBTiA9IChFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRQ0KLSAgICAgICAgKyAiLmN1c3RvbS4iICsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsNCi0NCi0gICAgcHVibGljIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHNldHVwQ3VzdG9taXphYmxlSW5mb3JtYXRpb24oKTsNCi0gICAgICAgIGFwcGx5Q3VzdG9tVmFsdWVzKHRoaXMuY3VzdG9taXphYmxlSW5mb3MpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPEN1c3RvbUluZm9ybWF0aW9uLCBTdHJpbmc+IGN1c3RvbWl6YWJsZUluZm9zID0gbmV3IEhhc2hNYXA8Q3VzdG9tSW5mb3JtYXRpb24sIFN0cmluZz4oKTsNCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwQ3VzdG9taXphYmxlSW5mb3JtYXRpb24oKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgYmFzZVBhY2thZ2UgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0JBU0VfUEFDS0FHRTsNCi0NCi0gICAgICAgIGlmIChiYXNlUGFja2FnZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VQYWNrYWdlID0gRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgKyAiLmN1c3RvbS4iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFiYXNlUGFja2FnZS5lbmRzV2l0aCgiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VQYWNrYWdlID0gYmFzZVBhY2thZ2UgKyAiLiI7DQotICAgICAgICB9DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQkFTRV9QQUNLQUdFLCBiYXNlUGFja2FnZSk7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IsDQotICAgICAgICAgICAgICAgICJDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFUcmFuc2Zvcm1lciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX0lOSVRJQUxJWkVSLA0KLSAgICAgICAgICAgICAgICAiQ29tcG9uZW50SW5pdGlhbGl6ZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01TR19SRVNPTFZFUl9OQU1FX01BUFBFUiwNCi0gICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUiwNCi0gICAgICAgICAgICAiTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUiwNCi0gICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVJUVVBfTElTVEVORVIsDQotICAgICAgICAgICAgICAgICJTdGFydHVwTGlzdGVuZXIiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIk1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uRkFDRVNfTUVTU0FHRV9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiRmFjZXNNZXNzYWdlRmFjdG9yeSIpOw0KLQ0KLSAgICAgICAgLy9jb252ZW50aW9ucyAodGhlIHJlc3Qgb2YgdGhlIGNvbnZlbnRpb25zIGFyZSBidWlsdCB3aXRoIHRoZSBoZWxwIG9mIG5hbWUgbWFwcGVycywuLi4NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX0JVTkRMRV9OQU1FLA0KLSAgICAgICAgICAgICAgICAidmFsaWRhdGlvbl9tZXNzYWdlcyIpOw0KLSAgICAgICAgLy9zdGF0aWMgc3RyYXRlZ3kgbWFwcGluZ3MgKG5hbWUgb2YgcHJvcGVydHkgZmlsZXMpDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFLA0KLSAgICAgICAgICAgICAgICAic3RyYXRlZ3lfbWFwcGluZ3MiKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcHBseUN1c3RvbVZhbHVlcyhNYXA8Q3VzdG9tSW5mb3JtYXRpb24sIFN0cmluZz4gbWFwKQ0KLSAgICB7DQotICAgICAgICAvL292ZXJyaWRlIHRvIGN1c3RvbWl6ZSBpbmZvcm1hdGlvbg0KLSAgICB9DQotDQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0KEN1c3RvbUluZm9ybWF0aW9uIGN1c3RvbUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBjdXN0b21pemFibGVJbmZvcy5nZXQoY3VzdG9tSW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgc3dpdGNoIChjdXN0b21JbmZvcm1hdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjYXNlIEJBU0VfUEFDS0FHRToNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICogcG9zdGZpeCB1c2VkIGJ5IHRoZSBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgICAgICAgICAgICogdGhlIFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgaXMgZm9yIGN1c3RvbSBzdHJhdGVnaWVzIG9ubHkNCi0gICAgICAgICAgICAgKiAobm90IGZvciBwdWJsaWMgdmFsaWRhdGlvbiBtb2R1bGVzKQ0KLSAgICAgICAgICAgICAqIHNvIGl0J3MgZmluZSB0byBjdXN0b21pemUgaXQNCi0gICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICBjYXNlIFZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFX1JFU09MVkVSX1BPU1RGSVg6DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbWl6YWJsZUluZm9zLmdldChDdXN0b21JbmZvcm1hdGlvbi5CQVNFX1BBQ0tBR0UpICsgdmFsdWU7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRhY2IwZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFyZW4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICAvKg0KLSAgICAgKiBtaXNjDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVNTQUdFX0JVTkRMRSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FU1NBR0VfQlVORExFIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0JBU0VfUEFDS0FHRSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0JBU0VfUEFDS0FHRSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9JTkZPUk1BVElPTl9QUk9WSURFUl9CRUFOID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fSU5GT1JNQVRJT05fUFJPVklERVJfQkVBTiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OX1NUUkFURUdZX01BUFBJTkcgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9TVEFUSUNfVkFMSURBVElPTl9TVFJBVEVHWV9NQVBQSU5HIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NPTVBPTkVOVF9JTklUSUFMSVpFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0NPTVBPTkVOVF9JTklUSUFMSVpFUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IiKTsNCi0NCi0gICAgLyoNCi0gICAgICogbmFtZSBtYXBwZXINCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIiKTsNCi0NCi0gICAgLyoNCi0gICAgICogZmFjdG9yaWVzDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fRkFDRVNfTUVTU0FHRV9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fRkFDRVNfTUVTU0FHRV9GQUNUT1JZIik7DQotDQotICAgIC8qDQotICAgICAqIGRlYWN0aXZhdGUNCi0gICAgICovDQotICAgIEBEZXByZWNhdGVkDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9SRU5ERVJLSVQgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfUkVOREVSS0lUIik7DQotDQotICAgIC8vY3VycmVudGx5IGp1c3QgdXNlZCBieSBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfREVGQVVMVF9DT05WRU5USU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0RFRkFVTFRfQ09OVkVOVElPTiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfREVGQVVMVF9OQU1FX01BUFBFUlMgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfREVGQVVMVF9OQU1FX01BUFBFUlMiKTsNCi0gICAgDQotICAgIC8vdGhlcmUgaXMgbm90aGluZyBsaWtlIERFQUNUSVZBVEVfREVGQVVMVF9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SDQotICAgIC8vdXNlIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmRlbnlSZW5kZXJlckludGVyY2VwdG9yKC4uLikgd2l0aGluIGFuIGV4dHZhbC1TdGFydHVwTGlzdGVuZXINCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0Fic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNDA1YjAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBkZXRhaWxzDQotICogQHNlZSBEZWZhdWx0RUxIZWxwZXINCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5IGN1c3RvbUVMSGVscGVyRmFjdG9yeTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21FTEhlbHBlckZhY3RvcnkoQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkgZWxIZWxwZXJGYWN0b3J5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmN1c3RvbUVMSGVscGVyRmFjdG9yeSA9IGVsSGVscGVyRmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgZmluYWwgRUxIZWxwZXIgY3JlYXRlKCkNCi0gICAgew0KLSAgICAgICAgRUxIZWxwZXIgcmVzdWx0ID0gbnVsbDsNCi0NCi0gICAgICAgIGlmKHRoaXMuY3VzdG9tRUxIZWxwZXJGYWN0b3J5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5jdXN0b21FTEhlbHBlckZhY3RvcnkuY3JlYXRlRUxIZWxwZXIoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVFTEhlbHBlcigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRUxIZWxwZXIgY3JlYXRlRUxIZWxwZXIoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcxNWViYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nOw0KLWltcG9ydCBqYXZhLmlvLkV4dGVybmFsaXphYmxlOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogaW4gb3JkZXIgdG8gY2VudHJhbGl6ZSB0aGUganNmIHZlcnNpb24gZGVwZW5kZW5jeSB3aXRoaW4gdGhlIGNvcmUNCi0gKg0KLSAqIHRoaXMgZWwtaGVscGVyIHN1cHBvcnRzIGpzcCBhbmQgZmFjZWxldHMgKHRlc3RlZCB3aXRoIDEuMS4xNCkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogdGhlcmUgaXMgYSBzcGVjaWFsIGZhY2VsZXRzIHdvcmthcm91bmQgZm9yIGVsLWV4cHJlc3Npb25zIG9mIGN1c3RvbSBjb21wb25lbnRzDQotICogaXQncyBwbHVnZ2FibGUgaW4gb3JkZXIgdG8gc3VwcG9ydCBzcGVjaWFsIG1lY2hhbmlzbXMgb2YgZGlmZmVyZW50IHRlY2hub2xvZ2llcyAodGhhbiBqc3AgYW5kIGZhY2VsZXRzKQ0KLSAqIHNvIHlvdSBjYW4gcGx1ZyBpbiB5b3VyIG93biBpbXBsLiB3aGljaCBpbXBsZW1lbnRzIGEgY3VzdG9tIHdvcmthcm91bmQgKGxpa2UgdGhlIGZhY2VsZXRzIHdvcmthcm91bmQgb2YgdGhpcyBpbXBsLikNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RUxIZWxwZXIgaW1wbGVtZW50cyBFTEhlbHBlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRFTEhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIENsYXNzIGdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICAvL2R1ZSB0byBhIHJlc3RyaWN0aW9uIHdpdGggdGhlIHJpDQotICAgICAgICBPYmplY3QgYmVhbiA9IGdldFZhbHVlT2ZFeHByZXNzaW9uKGZhY2VzQ29udGV4dCwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgICAgICByZXR1cm4gKGJlYW4gIT0gbnVsbCkgPyBiZWFuLmdldENsYXNzKCkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmVhbihTdHJpbmcgYmVhbk5hbWUpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICByZXR1cm4gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZ2V0VmFyaWFibGVSZXNvbHZlcigpLnJlc29sdmVWYXJpYWJsZShmYWNlc0NvbnRleHQsIGJlYW5OYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uICE9IG51bGwpID8gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkNCi0gICAgICAgICAgICAuY3JlYXRlVmFsdWVCaW5kaW5nKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKS5nZXRWYWx1ZShmYWNlc0NvbnRleHQpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VMVGVybVZhbGlkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuY3JlYXRlVmFsdWVCaW5kaW5nKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pICE9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQsIGJvb2xlYW4gYWxsb3dCbGFua0NoYXJhY3RlcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIC8vZm9yIGlucHV0IGNvbXBvbmVudHMgd2l0aG91dCB2YWx1ZS1iaW5kaW5nDQotICAgICAgICAvLyhlLmcuIGZvciBzcGVjaWFsIGNvbXBvbmVudCBsaWJzIC0+IGlzc3VlIHdpdGggRXh0VmFsUmVuZGVyZXJXcmFwcGVyI2VuY29kZUJlZ2luKQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudC5nZXRDbGFzcygpICsgIiBoYXMgbm8gdmFsdWUgYmluZGluZyAtIGNvbXBvbmVudCBpZDogIiArIHVpQ29tcG9uZW50LmdldElkKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKCFhbGxvd0JsYW5rQ2hhcmFjdGVycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlKCIgIiwgIiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pLmdldEJhc2VFeHByZXNzaW9uKCkpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXN1bHQgPSBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuDQotICAgICAgICAgICAgICAgIHRyeVRvQ3JlYXRlVmFsdWVCaW5kaW5nRm9yRmFjZWxldHNCaW5kaW5nKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCByZXNvbHZlIGV4cHJlc3Npb246ICIgKyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgIC5nZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgcmVzdWx0LmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLQ0KLSAgICAgICAgICAgIGlmKGVudGl0eUNsYXNzID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgcmVzb2x2ZSBleHByZXNzaW9uOiAiICsgcmVzdWx0LmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgIH0NCi0NCi0gICAgLy9rZWVwIGluIHN5bmMgd2l0aCBEZWZhdWx0RUxIZWxwZXIjZ2V0UHJvcGVydHlEZXRhaWxzVmlhUmVmbGVjdGlvbkZhbGxiYWNrIG9mIHRydW5rISEhDQotICAgIHB1YmxpYyBQcm9wZXJ0eURldGFpbHMgZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBnZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50LCBmYWxzZSk7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uID0NCi0gICAgICAgICAgICBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotDQotICAgICAgICBTdHJpbmcgcGF0aCA9IG51bGw7DQotDQotICAgICAgICB3aGlsZShjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYocGF0aCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcGF0aCA9IGdldFByb3BlcnR5TmFtZShjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHBhdGggPSBnZXRQcm9wZXJ0eU5hbWUoY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24pICsgIi4iICsgcGF0aDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcGF0aCA9IGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkgKyAiLiIgKyBwYXRoOw0KLQ0KLSAgICAgICAgT2JqZWN0IGJhc2VPYmplY3QgPSBnZXRWYWx1ZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotDQotICAgICAgICAvL2luIGNhc2Ugb2YgZS5nLjogI3tiZWFuW2JlYW4ucGFzc3dvcmRSZXBlYXRlZFByb3BlcnR5TmFtZV19DQotICAgICAgICAvLy0+IGJlYW4ucGFzc3dvcmRSZXBlYXRlZFByb3BlcnR5TmFtZSBpcyBub3QgdGhlIGZpbmFsIHByb3BlcnR5IG5hbWUNCi0gICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlEZXRhaWxzKHBhdGgsIGJhc2VPYmplY3QsIGdldFByb3BlcnR5TmFtZSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0NCi0gICAgICAgIGlmKHByb3BlcnR5TmFtZS5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IGV4dHJhY3RQcm9wZXJ0eU5hbWVPZlByb3BlcnR5UGF0aChwcm9wZXJ0eU5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic3VwcG9ydCBmb3IgbW9yZSBkeW5hbWljIGJpbmRpbmdzIC0gZGV0YWlscyBzZWUgaW5saW5lIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXh0cmFjdFByb3BlcnR5TmFtZU9mUHJvcGVydHlQYXRoKFN0cmluZyBwcm9wZXJ0eUNoYWluKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmdbXSBwcm9wZXJ0aWVzID0gcHJvcGVydHlDaGFpbi5zcGxpdCgiXFwuIik7DQotDQotICAgICAgICBPYmplY3QgY3VycmVudFByb3BlcnR5VmFsdWUgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4ocHJvcGVydGllc1swXSk7DQotDQotICAgICAgICBNZXRob2QgY3VycmVudE1ldGhvZDsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50UHJvcGVydHlOYW1lOw0KLSAgICAgICAgZm9yKGludCBpID0gMTsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudFByb3BlcnR5TmFtZSA9IHByb3BlcnRpZXNbaV07DQotICAgICAgICAgICAgY3VycmVudE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZChjdXJyZW50UHJvcGVydHlWYWx1ZS5nZXRDbGFzcygpLA0KLSAgICAgICAgICAgICAgICAiZ2V0IiArIGN1cnJlbnRQcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBjdXJyZW50UHJvcGVydHlOYW1lLnN1YnN0cmluZygxKSk7DQotDQotICAgICAgICAgICAgaWYoY3VycmVudE1ldGhvZCA9PSBudWxsICYmIGN1cnJlbnRQcm9wZXJ0eVZhbHVlIGluc3RhbmNlb2YgTWFwKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9pdCdzIG9rIGZvciB0aGUgc2ltcGxlIG1hcCBjYXNlIC0gYnV0IG5vdCBmb3IgZS5nLjoNCi0gICAgICAgICAgICAgICAgLy8je2JlYW4xW2JlYW4yLnByb3BlcnR5TmFtZVByb3ZpZGVyWyBiZWFuMy5pbmRleF1dfQ0KLSAgICAgICAgICAgICAgICAvL29yIGV2ZXJ5IG90aGVyIGNvbXBsZXggcmVwbGFjZW1lbnQgZm9yIGJlYW4zLmluZGV4DQotICAgICAgICAgICAgICAgIC8vaXQgbWlnaHQgYWxzbyByZXF1aXJlIGFuIGFkanVzdG1lbnQgYXQgRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyI3RyeVRvVHJhbnNmb3JtVG9SZWFsQmluZGluZw0KLSAgICAgICAgICAgICAgICAoKE1hcCljdXJyZW50UHJvcGVydHlWYWx1ZSkuZ2V0KGN1cnJlbnRQcm9wZXJ0eU5hbWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50UHJvcGVydHlWYWx1ZSA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZChjdXJyZW50UHJvcGVydHlWYWx1ZSwgY3VycmVudE1ldGhvZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoY3VycmVudFByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpY3VycmVudFByb3BlcnR5VmFsdWU7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNFcnJvckVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCJ1bmV4cGVjdGVkIHZhbHVlIHdpdGhpbiBtYXAgc3ludGF4OiAiICsgcHJvcGVydHlDaGFpbiArDQotICAgICAgICAgICAgICAgICAgICAgICAgIiBsYXN0IHByb3BlcnR5IG5hbWU6ICIgKyBjdXJyZW50UHJvcGVydHlWYWx1ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHN0YXRpYyBTdHJpbmcgZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmcgdmFsdWVFeHByZXNzaW9uID0gdWlDb21wb25lbnQuZ2V0VmFsdWVCaW5kaW5nKCJ2YWx1ZSIpOw0KLQ0KLSAgICAgICAgcmV0dXJuICh2YWx1ZUV4cHJlc3Npb24gIT0gbnVsbCkgPyB2YWx1ZUV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VMVGVybVdlbGxGb3JtZWQoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgVmFsdWVCaW5kaW5nIHx8IG8gaW5zdGFuY2VvZiBFeHRlcm5hbGl6YWJsZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcyA9IG8udG9TdHJpbmcoKTsNCi0gICAgICAgIHJldHVybiAoKHMuY29udGFpbnMoIiMiKSB8fCBzLmNvbnRhaW5zKCIkIikpICYmIHMuY29udGFpbnMoInsiKSAmJiBzLmNvbnRhaW5zKCJ9IikpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmluZGluZ09mQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHVpQ29tcG9uZW50LmdldFZhbHVlQmluZGluZyhuYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FTEhlbHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRUxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGViMjU1My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FTEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIGluIG9yZGVyIHRvIGNlbnRyYWxpemUgdGhlIGpzZiB2ZXJzaW9uIGRlcGVuZGVuY3kgd2l0aGluIHRoZSBjb3JlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIEVMSGVscGVyDQotew0KLSAgICBPYmplY3QgZ2V0QmVhbihTdHJpbmcgYmVhbk5hbWUpOw0KLQ0KLSAgICBPYmplY3QgZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0NCi0gICAgQ2xhc3MgZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLQ0KLSAgICBQcm9wZXJ0eURldGFpbHMgZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpOw0KLQ0KLSAgICBib29sZWFuIGlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLQ0KLSAgICBib29sZWFuIGlzRUxUZXJtV2VsbEZvcm1lZChPYmplY3Qgbyk7DQotDQotICAgIE9iamVjdCBnZXRCaW5kaW5nT2ZDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBuYW1lKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIxNjFiMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogSGVscGVyIGNsYXNzIHRvIGdldCB0aGUgcmVhbC9mdWxsIHZhbHVlIGJpbmRpbmcgLSB0ZXN0ZWQgd2l0aCBmYWNlbGV0cyAxLjEuMTQNCi0gKiBUaGUgdGFyZ2V0IGlzIHRvIGdldCByaWQgb2YgdGhpcyBpbXBsLiAtIGN1cnJlbnRseSBpdCdzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IGN1c3RvbSBmYWNlbGV0cyBjb21wb25lbnRzLg0KLSAqIEFuIGFsdGVybmF0aXZlIHdvdWxkIGJlIGFuIEVMLVJlc29sdmVyIC0gdGhlcmUgYXJlIHN0aWxsIHNvbWUgb3BlbiBpc3N1ZXMgd2l0aCBzdWNoIGFuIGFwcHJvYWNoDQotICogKyBJdCBpc24ndCBhdmFpbGFibGUgd2l0aCBKU0YgMS4xLngNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9DcmVhdGVWYWx1ZUJpbmRpbmdGb3JGYWNlbGV0c0JpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBEZWZhdWx0RUxIZWxwZXIuZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEJpbmRpbmdzID0gZXh0cmFjdEVMVGVybXMoDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmluZGluZ09mQ29tcG9uZW50KHVpQ29tcG9uZW50LCAidmFsdWUiKSk7DQotDQotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZT0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIDEpICsgInsiICsgY3JlYXRlQmluZGluZyhmb3VuZEJpbmRpbmdzLCBtYXBwZWRGYWNlbGV0c1ZhcnMpICsgIn0iKTsNCi0NCi0gICAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YmUuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotDQotICAgICAgICAgICAgaWYoZW50aXR5Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnlUb1JlcGxhY2VWYXJzKHZiZSwgbWFwcGVkRmFjZWxldHNWYXJzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHZiZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVCaW5kaW5nKExpc3Q8U3RyaW5nPiBleHByZXNzaW9ucywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkZWRWaXJ0dWFsTmFtZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGVudHJ5IDogZXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoIlZhbHVlRXhwcmVzc2lvblsiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBmb3VuZEJpbmRpbmdEZXRhaWxzID0gZW50cnkuc3BsaXQoIiAiKTsNCi0gICAgICAgICAgICBpbmRleE9mQmluZGluZ0RldGFpbHMgPSBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKGZvdW5kQmluZGluZ0RldGFpbHMpOw0KLQ0KLSAgICAgICAgICAgIGlmIChpbmRleE9mQmluZGluZ0RldGFpbHMgPT0gLTEpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgYmluZGluZ0RldGFpbHMgPSBmb3VuZEJpbmRpbmdEZXRhaWxzW2luZGV4T2ZCaW5kaW5nRGV0YWlsc10uc3BsaXQoIj0iKTsNCi0NCi0gICAgICAgICAgICBpZiAoYmluZGluZ0RldGFpbHMubGVuZ3RoIDwgMikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGJpbmRpbmdEZXRhaWxzWzFdOw0KLQ0KLSAgICAgICAgICAgIC8vdG8gc3VwcG9ydCBibGFua3Mgd2l0aGluIGEgYmluZGluZyB3aXRoIG1hcCBzeW50YXgNCi0gICAgICAgICAgICBpZihjdXJyZW50QmluZGluZy5jb250YWlucygieyIpICYmICFjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgPSBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKGN1cnJlbnRCaW5kaW5nLCBmb3VuZEJpbmRpbmdEZXRhaWxzLCBpbmRleE9mQmluZGluZ0RldGFpbHMpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnNLZXkoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5wdXQoYmluZGluZ0RldGFpbHNbMF0sIGN1cnJlbnRCaW5kaW5nKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvL2VudHJ5IGZvciAidmlydHVhbCIgZmFjZWxldHMgdmFyDQotICAgICAgICAgICAgaWYoIShjdXJyZW50QmluZGluZy5jb250YWlucygieyIpIHx8IGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhcnMucHV0KGJpbmRpbmdEZXRhaWxzWzBdLCBiaW5kaW5nRGV0YWlsc1sxXS5zdWJzdHJpbmcoMSwgYmluZGluZ0RldGFpbHNbMV0ubGVuZ3RoKCktMikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBvcmlnaW5hbEJpbmRpbmcgPSBhZGRlZFZpcnR1YWxOYW1lcy5nZXQoInZhbHVlIik7DQotICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcuc3Vic3RyaW5nKG9yaWdpbmFsQmluZGluZy5pbmRleE9mKCJ7IikgKyAxLCBvcmlnaW5hbEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLnJlbW92ZSgidmFsdWUiKTsNCi0gICAgICAgIHJldHVybiB0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcob3JpZ2luYWxCaW5kaW5nLCBhZGRlZFZpcnR1YWxOYW1lcywgdmlydHVhbFZhcnMpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcoDQotICAgICAgICAgICAgU3RyaW5nIG9yaWdpbmFsQmluZGluZywgTWFwPFN0cmluZywgU3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gIiN7IiArIG9yaWdpbmFsQmluZGluZyArICJ9IjsNCi0gICAgICAgIEl0ZXJhdG9yIG5hbWVJdGVyYXRvciA9IGFkZGVkVmlydHVhbE5hbWVzLmtleVNldCgpLml0ZXJhdG9yKCk7DQotDQotICAgICAgICBTdHJpbmcgY3VycmVudEtleTsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50VmFsdWU7DQotICAgICAgICB3aGlsZShuYW1lSXRlcmF0b3IuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRLZXkgPSAoU3RyaW5nKSBuYW1lSXRlcmF0b3IubmV4dCgpOw0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGFkZGVkVmlydHVhbE5hbWVzLmdldChjdXJyZW50S2V5KTsNCi0gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGN1cnJlbnRWYWx1ZS5pbmRleE9mKCJ7IikgKyAxLCBjdXJyZW50VmFsdWUuaW5kZXhPZigifSIpKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIi4iLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJ7IiArIGN1cnJlbnRLZXkgKyAiWyIsICJ7IiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICIuIiwgIi4iICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiLiIgKyBjdXJyZW50S2V5ICsgIlsiLCAiLiIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiXSIsICJbJyIgKyBjdXJyZW50VmFsdWUgKyAiJ10iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIlsiLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiLiIsICJbIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICB9DQotDQotICAgICAgICBuYW1lSXRlcmF0b3IgPSB2aXJ0dWFsVmFycy5rZXlTZXQoKS5pdGVyYXRvcigpOw0KLQ0KLSAgICAgICAgd2hpbGUobmFtZUl0ZXJhdG9yLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50S2V5ID0gKFN0cmluZykgbmFtZUl0ZXJhdG9yLm5leHQoKTsNCi0NCi0gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSB2aXJ0dWFsVmFycy5nZXQoY3VycmVudEtleSk7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoInsiICsgY3VycmVudEtleSArICIuIiwgInsiICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIlsiLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCIuIiArIGN1cnJlbnRLZXkgKyAiLiIsICIuIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICJbIiwgIi4iICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIl0iLCAiWyciICsgY3VycmVudFZhbHVlICsgIiddIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIlsiICsgY3VycmVudEtleSArICJbIiwgIlsiICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIi4iLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG9yaWdpbmFsQmluZGluZy5zdWJzdHJpbmcoMiwgb3JpZ2luYWxCaW5kaW5nLmxlbmd0aCgpIC0gMSk7DQotICAgIH0NCi0NCi0gICAgLy90byBzdXBwb3J0IGJsYW5rcyAtIGUuZy4gd2l0aCBtYXAgc3ludGF4DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKFN0cmluZyBjdXJyZW50QmluZGluZywgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlscykNCi0gICAgew0KLSAgICAgICAgZm9yKGludCBpID0gaW5kZXhPZkJpbmRpbmdEZXRhaWxzICsgMTsgaSA8IGZvdW5kQmluZGluZ0RldGFpbHMubGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgKz0gZm91bmRCaW5kaW5nRGV0YWlsc1tpXTsNCi0gICAgICAgICAgICBpZihmb3VuZEJpbmRpbmdEZXRhaWxzW2ldLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEJpbmRpbmc7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRCaW5kaW5nOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBpbnQgY291bnQgPSAwOw0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBiaW5kaW5nRGV0YWlscykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuY29udGFpbnMoIj0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY291bnQrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZXh0cmFjdEVMVGVybXMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlRUxUZXJtcyhvLCBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKSwgZm91bmRFTFRlcm1zLCAwKSA+IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRFTFRlcm1zOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcmVzb2x2ZUVMVGVybXMoT2JqZWN0IG8sIE1hcDxPYmplY3QsIE9iamVjdD4gdmlzaXRlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMsIGludCBjb3VudCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAobyA9PSBudWxsIHx8IHZpc2l0ZWQuY29udGFpbnNLZXkobykgfHwgY291bnQgPiA1MCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZpc2l0ZWQucHV0KG8sIG51bGwpOw0KLQ0KLSAgICAgICAgaW50IGVsQ291bnQgPSAwOw0KLSAgICAgICAgQ2xhc3MgYyA9IG8uZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIC8vaW5zcGVjdCBtYXBzDQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1hcCkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBmb3IgKE9iamVjdCBlbnRyeSA6ICgoTWFwKSBvKS52YWx1ZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZm91bmQgZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICAgICAgaWYoZW50cnkudG9TdHJpbmcoKS5jb250YWlucygiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKGVudHJ5LnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoZW50cnksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGVsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQobykpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gKytlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9hbmFseXplIGFycmF5cw0KLSAgICAgICAgaWYgKGMuaXNBcnJheSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgobyk7DQotICAgICAgICAgICAgLy9jaGVjayBhcnJheSBbTCAtPiBubyBhcnJheSBvZiBwcmltaXRpdmUgdHlwZXMNCi0gICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMamF2YS5sYW5nLlN0cmluZyIpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChBcnJheS5nZXQobywgaSkpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKEFycmF5LmdldChvLCBpKSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxGaWVsZD4gYXR0cmlidXRlcyA9IGZpbmRBbGxBdHRyaWJ1dGVzKGMsIG5ldyBBcnJheUxpc3Q8RmllbGQ+KCkpOw0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBhdHRyaWJ1dGVzLnRvQXJyYXkobmV3IEZpZWxkW2F0dHJpYnV0ZXMuc2l6ZSgpXSk7DQotDQotICAgICAgICBBY2Nlc3NpYmxlT2JqZWN0LnNldEFjY2Vzc2libGUoZmllbGRzLCB0cnVlKTsNCi0gICAgICAgIGZvciAoRmllbGQgY3VycmVudEZpZWxkIDogZmllbGRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQuZ2V0KG8pID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5nZXRUeXBlKCkuZXF1YWxzKFN0cmluZy5jbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmdldChvKSAhPSBudWxsICYmIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKGN1cnJlbnRGaWVsZC5nZXQobykpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFjdXJyZW50RmllbGQuZ2V0VHlwZSgpLmlzUHJpbWl0aXZlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKGN1cnJlbnRGaWVsZC5nZXQobyksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZWxDb3VudDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEZpZWxkPiBmaW5kQWxsQXR0cmlidXRlcyhDbGFzcyBjLCBMaXN0PEZpZWxkPiBhdHRyaWJ1dGVzKQ0KLSAgICB7DQotICAgICAgICBpZiAoYyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluZEFsbEF0dHJpYnV0ZXMoYy5nZXRTdXBlcmNsYXNzKCksIGF0dHJpYnV0ZXMpOw0KLQ0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBjLmdldERlY2xhcmVkRmllbGRzKCk7DQotICAgICAgICBmb3IgKEZpZWxkIGN1cnJlbnRGaWVsZCA6IGZpZWxkcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzU3RhdGljKGN1cnJlbnRGaWVsZC5nZXRNb2RpZmllcnMoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChjdXJyZW50RmllbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9SZXBsYWNlVmFycyhWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eTsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0gICAgICAgIGJvb2xlYW4gbGFzdCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgd2hpbGUodHJ1ZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxhc3QgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0NCi0gICAgICAgICAgICBwcm9wZXJ0eSA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbg0KLSAgICAgICAgICAgICAgICAucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIGdldE5ld1Byb3BlcnR5KHByb3BlcnR5LCBtYXBwZWRGYWNlbGV0c1ZhcnMpKTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQubGVuZ3RoKCkgPT0gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpICsgIi4iICsgcmVzdWx0Ow0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpOw0KLQ0KLSAgICAgICAgICAgIGlmKGxhc3QpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcmVmaXgoKSArICJ7IiArIHJlc3VsdCArICJ9Iik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5ld1Byb3BlcnR5KFN0cmluZyBvbGRQcm9wZXJ0eSwgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFycyA9IGdldFBvdGVudGlhbFZpcnR1YWxWYXJzKG9sZFByb3BlcnR5KTsNCi0NCi0gICAgICAgIGZvcihTdHJpbmcgdmlydHVhbFZhciA6IHZpcnR1YWxWYXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1hcHBlZEZhY2VsZXRzVmFycy5jb250YWluc0tleSh2aXJ0dWFsVmFyKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG9sZFByb3BlcnR5ID0gcmVwbGFjZVByb3BlcnR5VmFsdWUob2xkUHJvcGVydHksIHZpcnR1YWxWYXIsIG1hcHBlZEZhY2VsZXRzVmFycy5nZXQodmlydHVhbFZhcikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvbGRQcm9wZXJ0eTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0UG90ZW50aWFsVmlydHVhbFZhcnMoU3RyaW5nIG9sZFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpbnQgc3RhcnQgPSAtMTsNCi0gICAgICAgIGludCBlbmQgPSAtMTsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG9sZFByb3BlcnR5Lmxlbmd0aCgpOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoc3RhcnQgPT0gLSAxICYmIG9sZFByb3BlcnR5LmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKChzdGFydCAhPSAtIDEgJiYgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICdbJykgfHwgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICddJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGVuZCA9IGk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKHN0YXJ0ICE9IC0xICYmIGVuZCAhPSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJMaXN0LmFkZChvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOw0KLSAgICAgICAgICAgICAgICBpZihvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbmQgPSAtMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlydHVhbFZhckxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcGxhY2VQcm9wZXJ0eVZhbHVlKFN0cmluZyBvbGRQcm9wZXJ0eSwgU3RyaW5nIHRhcmdldFZhciwgU3RyaW5nIG5ld1ZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpbnQgaW5kZXggPSBvbGRQcm9wZXJ0eS5pbmRleE9mKHRhcmdldFZhcik7DQotDQotICAgICAgICBpZihpbmRleCA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gb2xkUHJvcGVydHk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gb2xkUHJvcGVydHkuc3Vic3RyaW5nKDAsIGluZGV4KTsNCi0gICAgICAgIHJlc3VsdCArPSBuZXdWYWx1ZTsNCi0gICAgICAgIHJldHVybiByZXN1bHQgKyBvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoaW5kZXggKyB0YXJnZXRWYXIubGVuZ3RoKCksIG9sZFByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiByZXBsYWNlIHZpcnR1YWwgZmFjZWxldHMgdmFycyAobWFwIHN5bnRheCkNCi0gICAgICogdGVzdGVkIHN0eWxlcyAoc2ltcGxlIGFuZCBuZXN0ZWQpOiB0ZXN0W2l4W2l4MltpeDNdXV0NCi0gICAgICovDQotICAgIC8qDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBfY3JlYXRlQmluZGluZyhMaXN0PFN0cmluZz4gZXhwcmVzc2lvbnMsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmlydHVhbFZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0NCi0gICAgICAgIFN0cmluZyBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50QmluZGluZzsNCi0gICAgICAgIFN0cmluZyBwYXJ0T2ZCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBleHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aCgiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZvdW5kQmluZGluZ0RldGFpbHMgPSBlbnRyeS5zcGxpdCgiICIpOw0KLSAgICAgICAgICAgIGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoZm91bmRCaW5kaW5nRGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9PSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBiaW5kaW5nRGV0YWlscyA9IGZvdW5kQmluZGluZ0RldGFpbHNbaW5kZXhPZkJpbmRpbmdEZXRhaWxzXS5zcGxpdCgiPSIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nRGV0YWlscy5sZW5ndGggPCAyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYmluZGluZ0RldGFpbHNbMV07DQotDQotICAgICAgICAgICAgLy90byBzdXBwb3J0IGJsYW5rcyB3aXRoaW4gYSBiaW5kaW5nIHdpdGggbWFwIHN5bnRheA0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgJiYgIWN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoY3VycmVudEJpbmRpbmcsIGZvdW5kQmluZGluZ0RldGFpbHMsIGluZGV4T2ZCaW5kaW5nRGV0YWlscyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lICE9IG51bGwgJiYgY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnMoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBwYXJ0T2ZCaW5kaW5nID0gY3VycmVudEJpbmRpbmcuc3Vic3RyaW5nKGN1cnJlbnRCaW5kaW5nLmluZGV4T2YocHJldkZhY2VsZXRzQXR0cmlidXRlTmFtZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICArIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUubGVuZ3RoKCksIGN1cnJlbnRCaW5kaW5nLmluZGV4T2YoIn0iKSk7DQotDQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5hZGQoYmluZGluZ0RldGFpbHNbMF0pOw0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgcGFydE9mQmluZGluZzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICBlbHNlIGlmKCEoY3VycmVudEJpbmRpbmcuY29udGFpbnMoInsiKSB8fCBjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJzLnB1dChiaW5kaW5nRGV0YWlsc1swXSwgYmluZGluZ0RldGFpbHNbMV0uc3Vic3RyaW5nKDEsIGJpbmRpbmdEZXRhaWxzWzFdLmxlbmd0aCgpLTIpKTsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWlucyhiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLmFkZChiaW5kaW5nRGV0YWlsc1swXSk7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyZW50QmluZGluZy5zdWJzdHJpbmcoY3VycmVudEJpbmRpbmcuaW5kZXhPZigieyIpICsgMSwgY3VycmVudEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gYmluZGluZ0RldGFpbHNbMF07DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotICAgICovDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24uamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc4ZWI2Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRpZmZlcmVuY2UgYmV0d2VlbiBbIGFuZCBbJyAtIHRlc3Qgd2l0aCBtb3JlIGNvbnN0ZWxsYXRpb25zIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQ0KLXB1YmxpYyBjbGFzcyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotew0KLSAgICBwcml2YXRlIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYmFzZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7DQotICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdG9rZW47DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXBsYWNlT3JBZGRQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlcGxhY2VQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1Byb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICAvL1RPRE8gYWRqdXN0bWVudHMgZm9yIGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLmVuZHNXaXRoKCInXSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYWRkUHJvcGVydHkoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBzb3VyY2VFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc291cmNlRXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgc291cmNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpOw0KLQ0KLSAgICAgICAgLy9UT0RPIGFkanVzdG1lbnRzIGZvciBpc0R5bmFtaWNCYXNlQW5kUHJvcGVydHkNCi0gICAgICAgIGlmKG5ld1Byb3BlcnR5LnN0YXJ0c1dpdGgoIlsnIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHJlc3VsdCArIG5ld1Byb3BlcnR5ICsgIn0iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ocmVzdWx0ICsgIi4iICsgbmV3UHJvcGVydHkgKyAifSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKFN0cmluZyBleHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBpZighRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQoZXhwcmVzc2lvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihleHByZXNzaW9uICsgIiBpcyBubyB2YWxpZCBlbC1leHByZXNzaW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBib29sZWFuIGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSA9IGV4cHJlc3Npb24ubGFzdEluZGV4T2YoIiddIikgPT0gLTE7DQotICAgICAgICBpbnQgaW5kZXgxID0gaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5ID8gZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiXSIpIDogZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiJ10iKTsNCi0gICAgICAgIGludCBpbmRleDIgPSBleHByZXNzaW9uLmxhc3RJbmRleE9mKCIuIik7DQotDQotICAgICAgICBpZihpbmRleDEgPiBpbmRleDIpDQotICAgICAgICB7DQotICAgICAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGluZGV4MSk7DQotDQotICAgICAgICAgICAgaW50IGluZGV4MyA9IGZpbmRJbmRleE9mU3RhcnRpbmdCcmFja2V0KGV4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIGlmKGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZyhpbmRleDMgKyAxLCBpbmRleDEpOw0KLQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoaW5kZXgzICsgMiwgaW5kZXgxKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdGhpcy5iYXNlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgzKSArICJ9Iik7DQotICAgICAgICAgICAgdGhpcy50b2tlbiA9IGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSA/ICJbIiA6ICJbJyI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKCBpbmRleDIgPiBpbmRleDEpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKGluZGV4MiArIDEsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxICk7DQotICAgICAgICAgICAgdGhpcy5iYXNlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgyKSArICJ9Iik7DQotICAgICAgICAgICAgdGhpcy50b2tlbiA9ICIuIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoMiwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpOw0KLSAgICAgICAgICAgIHRoaXMucHJlZml4ID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgMSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnRyaW0oKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYoIlsiLmVxdWFscyh0aGlzLnRva2VuKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLnZhbHVlLnN0YXJ0c1dpdGgoIiciKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlLnN1YnN0cmluZygxLCB0aGlzLnZhbHVlLmxlbmd0aCgpIC0gMSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vcmV0dXJuIHRoaXMuYmFzZS52YWx1ZSArIHRoaXMudG9rZW4gKyB0aGlzLnZhbHVlLnN1YnN0cmluZygwLCB0aGlzLnZhbHVlLmxlbmd0aCgpKSArICInXSI7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gZ2V0QmFzZUV4cHJlc3Npb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmFzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4cHJlc3Npb25TdHJpbmcoKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgYmFzZUV4cHJlc3Npb24gPSB0aGlzLmJhc2UuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLQ0KLSAgICAgICAgICAgIGlmKCJbJyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAiJ119IjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZigiWyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAiXX0iOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gYmFzZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGJhc2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSkgKyB0aGlzLnRva2VuICsgdGhpcy52YWx1ZSArICJ9IjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVmaXggKyAieyIgKyB0aGlzLnZhbHVlICsgIn0iOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5iYXNlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZS5nZXRQcmVmaXgoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJlZml4Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmJhc2Uuc2V0UHJlZml4KHByZWZpeCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEV4cHJlc3Npb25TdHJpbmcoKS5oYXNoQ29kZSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gJiYgZ2V0RXhwcmVzc2lvblN0cmluZygpDQotICAgICAgICAgICAgLmVxdWFscygoKFZhbHVlQmluZGluZ0V4cHJlc3Npb24pIHRhcmdldCkuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGludCBmaW5kSW5kZXhPZlN0YXJ0aW5nQnJhY2tldChTdHJpbmcgZXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgaW50IGNsb3NlQ291bnQgPSAwOw0KLSAgICAgICAgZm9yKGludCBpID0gZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDE7IGkgPiAwOyBpLS0pDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoZXhwcmVzc2lvbi5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2xvc2VDb3VudC0tOw0KLSAgICAgICAgICAgICAgICBpZihjbG9zZUNvdW50IDwgMCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZihleHByZXNzaW9uLmNoYXJBdChpKSA9PSAnXScpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjbG9zZUNvdW50Kys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MmU1MTQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxUPiBpbXBsZW1lbnRzIE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8TmFtZU1hcHBlcjxUPj4NCi17DQotICAgIHByaXZhdGUgTGlzdDxDbGFzcz4gZGVuaWVkTmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLQ0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVnaXN0ZXIoTmFtZU1hcHBlcjxUPiBuYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICBpZighZGVuaWVkTmFtZU1hcHBlckxpc3QuY29udGFpbnMobmFtZU1hcHBlci5nZXRDbGFzcygpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBnZXROYW1lTWFwcGVyTGlzdCgpLmFkZChuYW1lTWFwcGVyKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGVyZWdpc3RlcihDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gY2xhc3NUb0RlcmVnaXN0ZXIpDQotICAgIHsNCi0gICAgICAgIEl0ZXJhdG9yPE5hbWVNYXBwZXI8VD4+IG5hbWVNYXBwZXJJdGVyYXRvciA9IGdldE5hbWVNYXBwZXJMaXN0KCkuaXRlcmF0b3IoKTsNCi0gICAgICAgIHdoaWxlKG5hbWVNYXBwZXJJdGVyYXRvci5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobmFtZU1hcHBlckl0ZXJhdG9yLm5leHQoKS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NUb0RlcmVnaXN0ZXIuZ2V0TmFtZSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG5hbWVNYXBwZXJJdGVyYXRvci5yZW1vdmUoKTsNCi0gICAgICAgICAgICAgICAgLy9kb24ndCBicmVhayAtIGUuZy4gdG8gZGVyZWdpc3RlciBhbGwgd3JhcHBlcnMuLi4NCi0gICAgICAgICAgICAgICAgLy9icmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZGVueShDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gY2xhc3NUb0RlbnkpDQotICAgIHsNCi0gICAgICAgIGRlcmVnaXN0ZXIoY2xhc3NUb0RlbnkpOw0KLQ0KLSAgICAgICAgc3luY2hyb25pemVkIChnZXRDbGFzcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGRlbmllZE5hbWVNYXBwZXJMaXN0LmFkZChjbGFzc1RvRGVueSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IExpc3Q8TmFtZU1hcHBlcjxUPj4gZ2V0TmFtZU1hcHBlckxpc3QoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9DbGFzc01hcHBpbmdGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUyN2UwYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgQ2xhc3NNYXBwaW5nRmFjdG9yeTxQLCBSPgotewotICAgIFIgY3JlYXRlKFAgc291cmNlKTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRGVmYXVsdEZhY3RvcnlGaW5kZXIuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRGVmYXVsdEZhY3RvcnlGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgzMmRiYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0RlZmF1bHRGYWN0b3J5RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRGVmYXVsdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotLy9keW5hbWljIGFwcHJvYWNoIHRvIGNyZWF0ZSB0aGUgZmFjdG9yaWVzIGR1cmluZyB0aGUgZmlyc3QgcmVxdWVzdCwgd2hlbiBhIGZhY2VzLWNvbnRleHQgaXMgYXZhaWxhYmxlDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZhY3RvcnlGaW5kZXIgaW1wbGVtZW50cyBGYWN0b3J5RmluZGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLSAgICBwcm90ZWN0ZWQgTWFwPEZhY3RvcnlOYW1lcywgT2JqZWN0PiBmYWN0b3J5TWFwID0gbmV3IEhhc2hNYXA8RmFjdG9yeU5hbWVzLCBPYmplY3Q+KCk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIEZhY3RvcnlGaW5kZXIgZmFjdG9yeUZpbmRlciA9IG5ldyBEZWZhdWx0RmFjdG9yeUZpbmRlcigpOw0KLQ0KLSAgICBwcml2YXRlIERlZmF1bHRGYWN0b3J5RmluZGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY3RvcnlGaW5kZXIgZ2V0SW5zdGFuY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjdG9yeUZpbmRlcjsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgZmluYWwgPFQ+IFQgZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUsIENsYXNzPFQ+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZighKGZhY3RvcnlNYXAuY29udGFpbnNLZXkoZmFjdG9yeU5hbWUpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0RmFjdG9yeShmYWN0b3J5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKFQpZmFjdG9yeU1hcC5nZXQoZmFjdG9yeU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIHN3aXRjaCAoZmFjdG9yeU5hbWUpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2FzZSBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZU1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZU1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZVJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgRUxfSEVMUEVSX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVFTEhlbHBlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBGQUNFU19NRVNTQUdFX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVGYWNlc01lc3NhZ2VGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGRlZmF1bHQ6IC8vcmVxdWlyZWQgYnkgY2hlY2tzdHlsZQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoZmFjdG9yeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vdCBwb3NzaWJsZSB0byBjcmVhdGUgZmFjdG9yeSAiICsgZmFjdG9yeU5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZmFjdG9yeU1hcC5wdXQoZmFjdG9yeU5hbWUsIGZhY3RvcnkpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJhZGQgZ2xvYmFsIHByb3BlcnR5IGV4dGVuc2lvbiBwb2ludCIpDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSk7DQotICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSkpOw0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJhZGQgZ2xvYmFsIHByb3BlcnR5IGV4dGVuc2lvbiBwb2ludCIpDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZKTsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSkpOw0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJhZGQgZ2xvYmFsIHByb3BlcnR5IGV4dGVuc2lvbiBwb2ludCIpDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlTWVzc2FnZVJlc29sdmVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZKTsNCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSkpOw0KLSAgICAgICAgbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKERlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJhZGQgZ2xvYmFsIHByb3BlcnR5IGV4dGVuc2lvbiBwb2ludCIpDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkgKTsNCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSkpOw0KLSAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IGNyZWF0ZUZhY2VzTWVzc2FnZUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0ZBQ0VTX01FU1NBR0VfRkFDVE9SWSk7DQotICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkpKTsNCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkubmFtZSgpKTsNCi0gICAgICAgIGlmKHRhcmdldCAhPSBudWxsICYmIHRhcmdldCBpbnN0YW5jZW9mIFN0cmluZykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoKFN0cmluZyl0YXJnZXQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IGNyZWF0ZUVMSGVscGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdEVMSGVscGVyRmFjdG9yeSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YmQ4YTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIEZhY2VzTWVzc2FnZUZhY3RvcnkNCi17DQotICAgIEZhY2VzTWVzc2FnZSBjb252ZXJ0KEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpOw0KLQ0KLSAgICBGYWNlc01lc3NhZ2UgY3JlYXRlKEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlGaW5kZXIuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGYyNjI1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBGYWN0b3J5RmluZGVyCi17Ci0gICAgPFQ+IFQgZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUsIENsYXNzPFQ+IHRhcmdldENsYXNzKTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeU5hbWVzLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWYzMTM5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkKLXB1YmxpYyBlbnVtIEZhY3RvcnlOYW1lcwotewotICAgIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLAotICAgIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwKLSAgICBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwKLQotICAgIEZBQ0VTX01FU1NBR0VfRkFDVE9SWSwKLQotICAgIFJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksCi0gICAgRUxfSEVMUEVSX0ZBQ1RPUlkKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9OYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMmQxZjAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9OYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZU1hcHBlckF3YXJlRmFjdG9yeTxUIGV4dGVuZHMgTmFtZU1hcHBlcj4NCi17DQotICAgIHZvaWQgcmVnaXN0ZXIoVCBjbGFzc1RvQWRkKTsNCi0gICAgdm9pZCBkZXJlZ2lzdGVyKENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBjbGFzc1RvRGVyZWdpc3Rlcik7DQotICAgIHZvaWQgZGVueShDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gY2xhc3NUb0RlbnkpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9Db21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDBjZTIyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9Db21wb25lbnRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBBbGxvd3MgdG8gaW5pdGlhbGl6ZSBjb21wb25lbnRzIGJlZm9yZUVuY29kZUJlZ2luLjxici8+Ci0gKiBlLmcuOiB5b3UgY2FuIGFkZCBpbmZvcm1hdGlvbiBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBtZWNoYW5pc21zLC4uLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NzE1NDAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgU3RhdGljQ29uZmlndXJhdGlvbjxULCBSPgotewotICAgIHZvaWQgc2V0U291cmNlT2ZNYXBwaW5nKFN0cmluZyBwYXRoKTsKLSAgICBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxULCBSPj4gZ2V0TWFwcGluZygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzMxMGY0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFQsIFI+Ci17Ci0gICAgcHJpdmF0ZSBUIHNvdXJjZTsKLSAgICBwcml2YXRlIFIgdGFyZ2V0OwotCi0gICAgcHVibGljIFQgZ2V0U291cmNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzb3VyY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlKFQgc291cmNlKQotICAgIHsKLSAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFIgZ2V0VGFyZ2V0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0YXJnZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KFIgdGFyZ2V0KQotICAgIHsKLSAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYmNkYzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQotcHVibGljIGVudW0gU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzCi17Ci0gICAgTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHLAotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9DT05GSUcsCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfQ09ORklHLAotCi0gICAgU0tJUF9WQUxJREFUSU9OX1NVUFBPUlRfQ09ORklHCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24uamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwODdkMGQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuUkVVU0V9KQotcHVibGljIGNsYXNzIFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+Ci17Ci0gICAgcHJpdmF0ZSBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmdzCi0gICAgICAgID0gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlT2ZNYXBwaW5nKFN0cmluZyBwYXRoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBnZXRNYXBwaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtYXBwaW5nczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBzb3VyY2UsIFN0cmluZyB0YXJnZXQpCi0gICAgewotICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5ID0gbmV3IFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgZW50cnkuc2V0U291cmNlKHNvdXJjZSk7Ci0gICAgICAgIGVudHJ5LnNldFRhcmdldCh0YXJnZXQpOwotICAgICAgICB0aGlzLm1hcHBpbmdzLmFkZChlbnRyeSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYTYzYzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIFN0cmluZyBwYXRoOwotICAgIHByaXZhdGUgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5nczsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCkKLSAgICB7Ci0gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgICAgIC8vZm9yY2UgcmVsb2FkCi0gICAgICAgIG1hcHBpbmdzID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBnZXRNYXBwaW5nKCkKLSAgICB7Ci0gICAgICAgIGlmKG1hcHBpbmdzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtYXBwaW5nczsKLSAgICAgICAgfQotCi0gICAgICAgIG1hcHBpbmdzID0gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotCi0gICAgICAgIFJlc291cmNlQnVuZGxlIG1hcHBpbmcgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocGF0aCk7Ci0KLSAgICAgICAgaWYgKG1hcHBpbmcgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9sb2dnaW5nCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IG1hcHBpbmcuZ2V0S2V5cygpOwotCi0gICAgICAgIFN0cmluZyBtZXRhRGF0YUtleTsKLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsKLQotICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YURhdGFLZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSBtYXBwaW5nLmdldFN0cmluZyhtZXRhRGF0YUtleSk7Ci0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWV0YURhdGFLZXksIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBtZXRhRGF0YUtleSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2UobWV0YURhdGFLZXkpOwotICAgICAgICBlbnRyeS5zZXRUYXJnZXQodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsKLSAgICAgICAgdGhpcy5tYXBwaW5ncy5hZGQoZW50cnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZDNmMDcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yIGltcGxlbWVudHMgUmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRJbnRlcmNlcHRvcklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJldHVyblZhbHVlT25Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKAotICAgICAgICBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIHNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24sIE9iamVjdCBjdXJyZW50UmV0dXJuVmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gY3VycmVudFJldHVyblZhbHVlOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBiZWZvcmUKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJlZm9yZURlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGFmdGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYTUwYTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgLyoqDQotICAgICAqDQotICAgICAqIEBwYXJhbSBwcm9wZXJ0eUluZm9ybWF0aW9uIHRoZSBpbmZvcm1hdGlvbiBlbnRyeSB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvcGVydHkNCi0gICAgICovDQotICAgIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbik7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVmMjc1OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9SZW5kZXJlckludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogQWxsb3dzIHRvIGludGVyY2VwdCByZW5kZXJlciBtZXRob2RzLjxici8+Ci0gKiBCYXNlIG1lY2hhbmlzbSBvZiBleHR2YWwuIEl0IGFsbG93cyB0byBhZGQgY3VzdG9tIGluZnJhc3RydWN0dXJlcy4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIFN0cmluZyBnZXRJbnRlcmNlcHRvcklkKCk7Ci0KLSAgICBPYmplY3QgZ2V0UmV0dXJuVmFsdWVPblNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oCi0gICAgICAgIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gc2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiwgT2JqZWN0IGN1cnJlbnRSZXR1cm5WYWx1ZSk7Ci0KLSAgICAvKgotICAgICAqIGJlZm9yZQotICAgICAqLwotICAgIHZvaWQgYmVmb3JlRGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlRW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgLyoKLSAgICAgKiBhZnRlcgotICAgICAqLwotICAgIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyRW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2MwOWFiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gaW50ZXJjZXB0IHZhbGlkYXRpb3IgZXhjZXB0aW9ucy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yDQotew0KLSAgICAvKioNCi0gICAgICoNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IHRoZSBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gbWV0YURhdGFFbnRyeSB0aGUgbWV0YSBkYXRhIGVudHJ5IHdoaWNoIGNvbnRhaW5zIHRoZSBtZXRhIGRhdGEgb2YgdGhlIHByb3BlcnR5DQotICAgICAqIEBwYXJhbSBjb252ZXJ0ZWRPYmplY3QgdGhlIGNvbnZlcnRlZCB1c2VyIGlucHV0DQotICAgICAqIEBwYXJhbSB2YWxpZGF0b3JFeGNlcHRpb24gdGhlIGN1cnJlbnQgZXhjZXB0aW9uDQotICAgICAqIEBwYXJhbSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UgdmFsaWRhdGlvbiBzdHJhdGVneSB3aGljaCB0aHJldyB0aGUgZXhjZXB0aW9uDQotICAgICAqIEByZXR1cm4gZmFsc2UgdG8gc3RvcCB0aHJvd2luZyB0aGUgZXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTU2OTQ5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkludGVyY2VwdG9yIGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGluaXRDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmKCEodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgdG8gaW5pdCBjb21wb25lbnQgIiArIHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7Ci0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsKLQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IEV4dFZhbFV0aWxzLmdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKCk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpLmdldE1ldGFEYXRhRW50cmllcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7Ci0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZighc2tpcFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblN0cmF0ZWd5LCBlbnRyeSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyID0gRXh0VmFsVXRpbHMuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckZvclZhbGlkYXRpb25TdHJhdGVneSh2YWxpZGF0aW9uU3RyYXRlZ3kpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEgPSBtZXRhRGF0YVRyYW5zZm9ybWVyLmNvbnZlcnRNZXRhRGF0YShlbnRyeSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZihtZXRhRGF0YSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoIW1ldGFEYXRhLmlzRW1wdHkoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhlbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5TS0lQX1ZBTElEQVRJT04sIEJvb2xlYW4uY2xhc3MpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhLnB1dChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvL2dldCBjb21wb25lbnQgaW5pdGlhbGl6ZXIgZm9yIHRoZSBjdXJyZW50IGNvbXBvbmVudCBhbmQgY29uZmlndXJlIGl0Ci0gICAgICAgICAgICAgICAgLy9hbHNvIGluIGNhc2Ugb2Ygc2tpcHBlZCB2YWxpZGF0aW9uIHRvIHJlc2V0IGUuZy4gdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgIGlmKCFtZXRhRGF0YS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiaW5pdCBjb21wb25lbnQgb2YgIiArIHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCA9IHdyYXBwZWQuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7Ci0KLSAgICAgICAgLy9yZWNvcmRlIHVzZXIgaW5wdXQgZS5nLiBmb3IgY3Jvc3MtY29tcG9uZW50IHZhbGlkYXRpb24KLSAgICAgICAgZm9yKFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIgcmVjb3JkZXIgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycygpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWNvcmRlci5yZWNvcmRVc2VySW5wdXQodWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7Ci0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZWNvcmRlci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY2FsbGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvY2Vzc1ZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVmFsaWRhdG9yRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb252ZXJ0ZXJFeGNlcHRpb24oZS5nZXRGYWNlc01lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkKLSAgICB7Ci0gICAgICAgIGlmICghKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHZhbGlkYXRpb24iKTsKLSAgICAgICAgfQotCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7Ci0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IgPSBFeHRWYWxVdGlscy5nZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcigpOwotCi0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IG1ldGFEYXRhRXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCkuZ2V0TWV0YURhdGFFbnRyaWVzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKGVudHJ5LmdldEtleSgpKTsKLQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHNraXBWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHZhbGlkYXRpb25TdHJhdGVneSwgZW50cnkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy9yZXF1aXJlZCBpcyBhIHNwZWNpYWwgY2FzZSAtIHJlc2V0IGl0Ci0gICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQoZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJ2YWxpZGF0ZSAiICsgZW50cnkuZ2V0VmFsdWUoKSArICIgd2l0aCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBlbnRyeSwgY29udmVydGVkT2JqZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gdmFsaWRhdGlvbiBzdHJhdGVneSBmb3VuZCBmb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgidmFsaWRhdGlvbiBmaW5pc2hlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2tpcFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgZW50cnkpCi0gICAgewotICAgICAgICAvL292ZXJyaWRlIGZvciBjdXN0b20gc2tpcCB2YWxpZGF0aW9uIHN1cHBvcnQgKGlmIG5lZWRlZCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1NzhjNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbi4gU3ViY2xhc3NlcyBqdXN0IGhhdmUgdG8gbm93IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgbmFtZSBtYXBwZXIuDQotICoNCi0gKiBOYW1lTWFwcGVycyBhcmUgc3RhdGVsZXNzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFQ+IGltcGxlbWVudHMgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJpdmF0ZSBOYW1lTWFwcGVyPFQ+IGN1c3RvbU5hbWVNYXBwZXI7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShUIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGN1c3RvbU5hbWVNYXBwZXIgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpOw0KLQ0KLSAgICAgICAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU5hbWVNYXBwZXIgPSAoTmFtZU1hcHBlcjxUPikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChjdXN0b21OYW1lTWFwcGVyICE9IG51bGwpID8gY3VzdG9tTmFtZU1hcHBlci5jcmVhdGVOYW1lKHNvdXJjZSkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL05hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiNmQ0My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBuYW1lIG1hcHBlcnMuDQotICogQSBuYW1lIG1hcHBlciBjYWxjdWxhdGVzIGEgbmFtZSBmb3IgYSBnaXZlbiBzb3VyY2Ugb2JqZWN0Lg0KLSAqIGUuZy4gTWV0YS1EYXRhIEtleSAoZS5nLjogYW5ub3RhdGlvbiBjbGFzcyBuYW1lKSAtPiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgU3RyaW5nIGNyZWF0ZU5hbWUoVCBzb3VyY2UpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL0NvbW1vbk1ldGFEYXRhS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTI4YmFlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL0NvbW1vbk1ldGFEYXRhS2V5cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBoZWxwZXIgZm9yIGZyZXF1ZW50IG1ldGEtZGF0YSBrZXlzCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotLyoKLSAqIHBsYWNlZCBpbiBjb3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgaW5mb3JtYXRpb24gaW4gbXVsdGlwbGUgbW9kdWxlcyAodmFsaWRhdGlvbiBtb2R1bGUgYW5kIGNvbXBvbmVudC1zdXBwb3J0IG1vZHVsZSkKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBpbnRlcmZhY2UgQ29tbW9uTWV0YURhdGFLZXlzCi17Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRCA9ICJyZXF1aXJlZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFLX1JFUVVJUkVEID0gIndlYWtfcmVxdWlyZWQiOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5fTEVOR1RIID0gIm1pbl9sZW5ndGgiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0xFTkdUSCA9ICJtYXhfbGVuZ3RoIjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOR0VfTUlOID0gInJhbmdlX21pbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9NQVggPSAicmFuZ2VfbWF4IjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUVEVSTiA9ICJwYXR0ZXJuIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFID0gInBhdHRlcm5fdmFsaWRhdGlvbl9lcnJvcl9tZXNzYWdlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQUlMID0gImVtYWlsIjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NID0gImN1c3RvbSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lQX1ZBTElEQVRJT04gPSAic2tpcF92YWxpZGF0aW9uIjsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL01ldGFEYXRhRW50cnkuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL01ldGFEYXRhRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU1NDU4Mi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9NZXRhRGF0YUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogRGF0YSBob2xkZXIgd2hpY2ggc3RvcmVzIHRoZSBtZXRhLWRhdGEgYW5kIHNvbWUgaW5mb3JtYXRpb24gd2hlcmUgdGhlIG1ldGEtZGF0YSB3YXMgYXJvdW5kLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIE1ldGFEYXRhRW50cnkKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcga2V5OwotICAgIHByaXZhdGUgT2JqZWN0IHZhbHVlOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gICAgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoInNldHRpbmcgbWV0YS1kYXRhIGtleTogIiArIGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0VmFsdWUoQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgic2V0dGluZyBtZXRhLWRhdGEgdmFsdWU6ICIgKyB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIDxUPiBUIGdldFByb3BlcnR5KFN0cmluZyBrZXksIENsYXNzPFQ+IHRhcmdldENsYXNzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUKWdldFByb3BlcnR5KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoIm5ldyBwcm9wZXJ0eSBhZGRlZCBrZXk6ICIgKyBrZXkgKyAiIHZhbHVlOiAiICsgdmFsdWUgKyAiIGZvciBtZXRhZGF0YS1rZXk6ICIgKyB0aGlzLmtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMyZjRhNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhbGwgZmFjdG9yaWVzIHdoaWNoIGNyZWF0ZSBtZXRhLWRhdGEgZXh0cmFjdG9ycwotICogCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ci17Ci0gICAgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlKCk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ODljOTAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBleHRyYWN0cyBtZXRhLWRhdGEgKGUuZy4gdGhlIGFubm90YXRpb25zKSBvZiB0aGUgdmFsdWUgYmluZGluZyBvZiBhIGNvbXBvbmVudC4KLSAqIEl0IGV4dHJhY3RzIHRoZSBtZXRhLWRhdGEgb2YgdGhlIGZpZWxkIGFuZCB0aGUgcHJvcGVydHkuCi0gKiAoQWxzbyB0aGUgYW5ub3RhdGlvbnMgb2Ygc3VwZXIgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcy4pCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3RvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQotICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOwotCi0gICAgICAgIC8vc2hvdWxkIG5ldmVyIG9jY3VyCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpICYmIG9iamVjdCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4ob2JqZWN0LmdldENsYXNzKCkgKyAiIGlzIG5vIHZhbGlkIGNvbXBvbmVudCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCA9IChVSUNvbXBvbmVudCkgb2JqZWN0OwotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGV4dHJhY3RpbmcgbWV0YS1kYXRhIG9mICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5RGV0YWlscyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGdldCBiZWFuIGNsYXNzIGFuZCBwcm9wZXJ0eSBuYW1lCi0gICAgICAgICAqLwotICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKTsKLQotICAgICAgICAvL2NyZWF0ZQotICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnNldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIHByb3BlcnR5RGV0YWlscyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZmluZCBhbmQgYWRkIGFubm90YXRpb25zCi0gICAgICAgICAqLwotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSBlbnRpdHlDbGFzczsKLQotICAgICAgICB3aGlsZSAoIU9iamVjdC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGN1cnJlbnRDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICAgICAgYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9ucyhjdXJyZW50Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICAgICAgcHJvY2Vzc0ludGVyZmFjZXMoY3VycmVudENsYXNzLCBwcm9wZXJ0eURldGFpbHMsIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0cmFjdCBmaW5pc2hlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbnRlcmZhY2VzKAotICAgICAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzLCBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLCBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBmb3IgKENsYXNzIGN1cnJlbnRJbnRlcmZhY2UgOiBjdXJyZW50Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGN1cnJlbnRJbnRlcmZhY2UsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICAgICAgcHJvY2Vzc0ludGVyZmFjZXMoY3VycmVudEludGVyZmFjZSwgcHJvcGVydHlEZXRhaWxzLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEpOwotCi0gICAgICAgIE1ldGhvZCBtZXRob2Q7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGhvZCA9IGVudGl0eS5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0IiArIHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1ldGhvZCA9IGVudGl0eS5nZXREZWNsYXJlZE1ldGhvZCgiaXMiICsgcHJvcGVydHkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibWV0aG9kIG5vdCBmb3VuZCAtIGNsYXNzOiAiICsgZW50aXR5LmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC0gbWV0aG9kczogIiArICJnZXQiICsgcHJvcGVydHkgKyAiICIgKyAiaXMiICsgcHJvcGVydHkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFkZEFubm90YXRpb25Ub0Fubm90YXRpb25FbnRyaWVzKEFycmF5cy5hc0xpc3QobWV0aG9kLmdldEFubm90YXRpb25zKCkpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRGaWVsZEFjY2Vzc0Fubm90YXRpb25zKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQotICAgIHsKLSAgICAgICAgRmllbGQgZmllbGQ7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpZWxkID0gZW50aXR5LmdldERlY2xhcmVkRmllbGQocHJvcGVydHkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmllbGQgPSBlbnRpdHkuZ2V0RGVjbGFyZWRGaWVsZCgiXyIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImZpZWxkICIgKyBwcm9wZXJ0eSArICIgb3IgXyIgKyBwcm9wZXJ0eSArICIgbm90IGZvdW5kIiwgZTEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFkZEFubm90YXRpb25Ub0Fubm90YXRpb25FbnRyaWVzKEFycmF5cy5hc0xpc3QoZmllbGQuZ2V0QW5ub3RhdGlvbnMoKSksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEFubm90YXRpb25Ub0Fubm90YXRpb25FbnRyaWVzKAotICAgICAgICBMaXN0PEFubm90YXRpb24+IGFubm90YXRpb25zLCBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGFubm90YXRpb25zKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLmFkZE1ldGFEYXRhRW50cnkoY3JlYXRlTWV0YURhdGFFbnRyeUZvckFubm90YXRpb24oYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoYW5ub3RhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBNZXRhRGF0YUVudHJ5IGNyZWF0ZU1ldGFEYXRhRW50cnlGb3JBbm5vdGF0aW9uKEFubm90YXRpb24gZm91bmRBbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgTWV0YURhdGFFbnRyeSBlbnRyeSA9IG5ldyBNZXRhRGF0YUVudHJ5KCk7Ci0KLSAgICAgICAgZW50cnkuc2V0S2V5KGZvdW5kQW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIGVudHJ5LnNldFZhbHVlKGZvdW5kQW5ub3RhdGlvbik7Ci0KLSAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmQ3MGFkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhpcyBmYWN0b3J5IGNyZWF0ZXMgYSBtZXRhLWRhdGEgZXh0cmFjdG9yIHdoaWNoIGV4dHJhY3RzIHRoZSBtZXRhLWRhdGEKLSAqIG9mIHRoZSB2YWx1ZSBiaW5kaW5nIG9mIGEgY29tcG9uZW50LgotICogPHAvPgotICogb3JkZXI6PGJyLz4KLSAqIDxvbD4KLSAqICAgPGxpPmNvbmZpZ3VyZWQgbWV0YS1kYXRhIGV4dHJhY3RvciAod2ViLnhtbCk8L2xpPgotICogICA8bGk+Y29uZmlndXJlZCBtZXRhLWRhdGEgZXh0cmFjdG9yIChpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKTwvbGk+Ci0gKiAgIDxsaT5kZWZhdWx0IGltcGxlbWVudGF0aW9uPC9saT4KLSAqIDwvb2w+Ci0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IG51bGw7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikKLSAgICBwdWJsaWMgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlKCkKLSAgICB7Ci0gICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3RvciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUik7Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUikpOwotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yID0gKE1ldGFEYXRhRXh0cmFjdG9yKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3RvciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShtZXRhRGF0YUV4dHJhY3Rvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY3JlYXRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3IobWV0YURhdGFFeHRyYWN0b3IpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9NZXRhRGF0YUV4dHJhY3Rvci5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL01ldGFEYXRhRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNDA1MWQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL01ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci0KLS8qKgotICogQW4gbWV0YS1kYXRhIGV4dHJhY3RvciBpcyByZXNwb25zaWJsZSB0byBhbmFseXplIGFuIG9iamVjdAotICogYW5kIHJldHVybnMgYWxsIGF2YWlsYWJsZSBtZXRhLWRhdGEgaW5mb3JtYXRpb24KLSAqIAotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhRXh0cmFjdG9yCi17Ci0gICAgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5OTEyYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgZXF1aXZhbGVudCB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0gKg0KLSAqIGlmIHRoZXJlIGlzIGFsc28gYSBwcm94eSBmb3IgdGhlIGV4dHJhY3RvciB5b3UgY2FuIHVzZSB0aGUgY2xhc3NOYW1lIHByb3BlcnR5IHRvIG1hbnVhbGx5IHJlcGVhdCB0aGUNCi0gKiBmdWxsIHF1YWxpZmllZCBjbGFzcyBuYW1lLg0KLSAqDQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGludGVyZmFjZSBCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIgZXh0ZW5kcyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZWE4MTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIGl0J3MganVzdCBhIGhlbHBlciBmb3IgcHJveGllcyAtIHlvdSBqdXN0IG5lZWQgaXQsIGlmIHlvdSBkZWZpbmUgdGhlIGVxdWl2YWxlbnQgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotICoNCi0gKiBpZiB0aGVyZSBpcyBhbHNvIGEgcHJveHkgZm9yIHRoZSB0cmFuc2Zvcm1lciB5b3UgY2FuIHVzZSB0aGUgY2xhc3NOYW1lIHByb3BlcnR5IHRvIG1hbnVhbGx5IHJlcGVhdCB0aGUNCi0gKiBmdWxsIHF1YWxpZmllZCBjbGFzcyBuYW1lLg0KLSAqDQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGNsYXNzIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyLCBCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICBwcml2YXRlIFN0cmluZyBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lOw0KLQ0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyLmNvbnZlcnRNZXRhRGF0YShtZXRhRGF0YUVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWU7DQotICAgICAgICB9DQotICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKFN0cmluZyBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUgPSBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGdldE1ldGFEYXRhVHJhbnNmb3JtZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVRyYW5zZm9ybWVyKE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyID0gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjUxNjJiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyB0aGUgTWV0YURhdGFUcmFuc2Zvcm1lciBmb3IgYSBnaXZlbiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogVmFsaWRhdGlvblN0cmF0ZWd5IC0+IE1ldGFEYXRhVHJhbnNmb3JtZXIgaW5zdGVhZCBvZiBNZXRhLURhdGEgLT4gTWV0YURhdGFUcmFuc2Zvcm1lcg0KLSAqIHRvIGF2b2lkIGEgc2Vjb25kIHN0YXRpYyBtYXBwaW5nIGUuZy4gZm9yIGpwYSBhbm5vdGF0aW9ucw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotICAgICAgICBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YVRyYW5zZm9ybWVyPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmc7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGNyZWF0ZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSA9IG51bGw7DQotDQotICAgICAgICAvL3Byb3h5IGNoZWNrDQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGEgcHJveHkgYW5kIHRoZSB1c2FnZSBvZiBhIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICAgICAgICBlbHNlIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lID0gKChCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcil2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZy5jb250YWluc0tleSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKE1ldGFEYXRhVHJhbnNmb3JtZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLmdldCh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgICAgICBTdHJpbmcgdHJhbnNmb3JtZXJOYW1lOw0KLSAgICAgICAgLy9udWxsIC0+IHVzZSBuYW1lIG1hcHBlcnMNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IG5hbWVNYXBwZXIgOiBuYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cmFuc2Zvcm1lck5hbWUgPSBuYW1lTWFwcGVyLmNyZWF0ZU5hbWUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICBpZiAodHJhbnNmb3JtZXJOYW1lID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IChNZXRhRGF0YVRyYW5zZm9ybWVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh0cmFuc2Zvcm1lck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZE1hcHBpbmcodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgdHJhbnNmb3JtZXJOYW1lKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cFN0cmF0ZWd5TWFwcGluZ3MoTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWFwcGluZy5nZXRTb3VyY2UoKSwgbWFwcGluZy5nZXRUYXJnZXQoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgdHJhbnNmb3JtZXJOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImFkZGluZyB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1ldGEtZGF0YSB0cmFuc2Zvcm1lciBtYXBwaW5nOiAiDQotICAgICAgICAgICAgICAgICsgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArICIgLT4gIiArIHRyYW5zZm9ybWVyTmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLnB1dCh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCB0cmFuc2Zvcm1lck5hbWUpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gZ2V0TmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmFtZU1hcHBlckxpc3Q7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTUwNGIyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQWxsb3dzIHRvIHRyYW5zZm9ybSBjb25jcmV0ZSBtZXRhLWRhdGEgdG8gYSBtb3JlIGFic3RyYWN0IGZvcm0uPGJyLz4NCi0gKiBlLmcuOiBAUmVxdWlyZWQsIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwuLi4pLCBATGVuZ3RoKG1pbmltdW0gPSAxKSwgLi4uIC0+IHJlcXVpcmVkID0gdHJ1ZQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLS8vKlRyYW5zZm9ybWVyIGluc3RlYWQgb2YgKkNvbnZlcnRlciB0byBhdm9pZCBuYW1pbmcgY29uZnVzaW9uIA0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YSk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEzNGZmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyCi0gICAgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4KLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHVibGljIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MzMxZTIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgLSBpZiB0aGVyZSBpcyBhIHByb3h5IGFyb3VuZCB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKChCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcil2YWxpZGF0aW9uU3RyYXRlZ3kpLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1N2IyZDkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1ldGFEYXRhVHJhbnNmb3JtZXJzLg0KLSAqIChjb25maWd1cmVkIHZpYSB3ZWIueG1sKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNhY2QxMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKiAoY29uZmlndXJlZCB2aWEgaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbikNCi0gKiBUaGUgYmVhbiBwcm92aWRlcyB0aGUgZGVmYXVsdCBuYW1lIChjb252ZW50aW9uKS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gZnVsbCBxdWFsaWZpZWQgbmFtZS4gKD0gY3VzdG9taXphYmxlIGNvbnZlbnRpb24pDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYmVkYjAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFwcyBFeHRWYWwgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gTWV0YURhdGFUcmFuc2Zvcm1lcnMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgZ2V0Q2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMDllZjEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgdG8gcGxhY2UgVmFsaWRhdGlvblN0cmF0ZWdpZXMgYW5kIE1ldGFEYXRhVHJhbnNmb3JtZXJzIGluIHRoZSBzYW1lIHBhY2thZ2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBnZXRTaW1wbGVNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpICsgIi4iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTaW1wbGVNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwb3N0Zml4ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVgpOw0KLQ0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmVuZHNXaXRoKCJWYWxpZGF0aW9uU3RyYXRlZ3kiKSB8fA0KLSAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmVuZHNXaXRoKCJTdHJhdGVneSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lQYWNrYWdlTmFtZSArIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYKSAscG9zdGZpeCkNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCJWYWxpZGF0aW9uU3RyYXRlZ3kiLCBwb3N0Zml4KQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoIlN0cmF0ZWd5IiwgcG9zdGZpeCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2luIGNhc2Ugb2YgYSBzdGF0aWMgdmFsaWRhdGlvbiBzdHJhdGVneSBtYXBwaW5nDQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUgKyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgKyBwb3N0Zml4Ow0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDVmNTI4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbiBpbXBsZW1lbnRzIFByb3BlcnR5SW5mb3JtYXRpb24KLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGluZm9ybWF0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhRW50cnk+IG1ldGFEYXRhTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFbnRyeT4oKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zSW5mb3JtYXRpb24oU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbk1hcC5jb250YWluc0tleShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbk1hcC5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpIGdldEluZm9ybWF0aW9uKGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoIm5ldyBpbmZvcm1hdGlvbiBhZGRlZCBrZXk6ICIgKyBrZXkgKyAiIHZhbHVlOiAiICsgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5mb3JtYXRpb25NYXAucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRhRGF0YUVudHJ5W10gZ2V0TWV0YURhdGFFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtZXRhRGF0YUxpc3QudG9BcnJheShuZXcgTWV0YURhdGFFbnRyeVttZXRhRGF0YUxpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpCi0gICAgewotICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnRpZXModGhpcy5pbmZvcm1hdGlvbk1hcCk7Ci0gICAgICAgIHRoaXMubWV0YURhdGFMaXN0LmFkZChtZXRhRGF0YUVudHJ5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldE1ldGFEYXRhRW50cmllcygpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgicmVzZXR0aW5nIG1ldGEtZGF0YSBlbnRyaWVzIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLm1ldGFEYXRhTGlzdC5jbGVhcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlEZXRhaWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MDM3Y2YuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlEZXRhaWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlEZXRhaWxzCi17Ci0gICAgLy9mb3JtcyB0aGUgaWQgZm9yIGNyb3NzLXZhbGlkYXRpb24gd2l0aGluIGNvbXBsZXggY29tcG9uZW50cwotICAgIHByaXZhdGUgU3RyaW5nIGtleTsKLSAgICBwcml2YXRlIE9iamVjdCBiYXNlT2JqZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5OwotCi0gICAgcHVibGljIFByb3BlcnR5RGV0YWlscyhTdHJpbmcga2V5LCBPYmplY3QgYmFzZU9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICAgIHRoaXMuYmFzZU9iamVjdCA9IGJhc2VPYmplY3Q7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gICAgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRCYXNlT2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VPYmplY3QoT2JqZWN0IGJhc2VPYmplY3QpCi0gICAgewotICAgICAgICB0aGlzLmJhc2VPYmplY3QgPSBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOTI4NGYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUluZm9ybWF0aW9uCi17Ci0gICAgYm9vbGVhbiBjb250YWluc0luZm9ybWF0aW9uKFN0cmluZyBrZXkpOwotICAgIE9iamVjdCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5KTsKLSAgICA8VD4gVCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcyk7Ci0gICAgdm9pZCBzZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpOwotCi0gICAgTWV0YURhdGFFbnRyeVtdIGdldE1ldGFEYXRhRW50cmllcygpOwotICAgIHZvaWQgYWRkTWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpOwotICAgIHZvaWQgcmVzZXRNZXRhRGF0YUVudHJpZXMoKTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGU5MjVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzCi17Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ERVRBSUxTID0gInByb3BlcnR5X2RldGFpbHMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9WQUxJREFUSU9OID0gInNraXBfdmFsaWRhdGlvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJsYWJlbCI7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZWNvcmRlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZWNvcmRlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MGYyM2YuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLQotLyoqCi0gKiBBbGxvd3MgdG8gY2FwdHVyZSBjb252ZXJ0ZWQgdmFsdWVzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyCi17Ci0gICAgdm9pZCByZWNvcmRVc2VySW5wdXQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0Fic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlkZTVjNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci0KLS8qKgotICogQmFzZSBmb3IgYWxsIFJlbmRlcktpdFdyYXBwZXJGYWN0b3JpZXMgdG8gZm9yY2UgYSBzcGVjaWZpYyBiZWhhdmlvdXIKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxSZW5kZXJLaXQsIFJlbmRlcktpdD4KLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnkgd3JhcHBlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZGVhY3RpdmF0ZWQgPSBmYWxzZTsKLQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSByZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UocmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLndyYXBwZWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy53cmFwcGVkLmFkZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZGVhY3RpdmF0ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuZGVhY3RpdmF0ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVhY3RpdmF0ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlYWN0aXZhdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBSZW5kZXJLaXQgY3JlYXRlKFJlbmRlcktpdCByZW5kZXJLaXQpCi0gICAgewotICAgICAgICBpZihpc0RlYWN0aXZhdGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVuZGVyS2l0IHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYodGhpcy53cmFwcGVkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMud3JhcHBlZC5jcmVhdGUocmVuZGVyS2l0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlV3JhcHBlcihyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgUmVuZGVyS2l0IGNyZWF0ZVdyYXBwZXIoUmVuZGVyS2l0IHJlbmRlcktpdCk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0N2UwNTAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0RlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeQotewotICAgIHByaXZhdGUgUmVuZGVyS2l0IHJlbmRlcktpdDsKLQotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0dmFsIHJlbmRlcmtpdCB3cmFwcGVyIGNyZWF0ZWQgZm9yICIgKyByZW5kZXJLaXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGhpcy5yZW5kZXJLaXQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5yZW5kZXJLaXQgPSBuZXcgRXh0VmFsUmVuZGVyS2l0KHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyS2l0OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxMYXp5UmVuZGVyZXJQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzZhYmQyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxMYXp5UmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOw0KLQ0KLS8qKg0KLSAqIHRvIHN1cHBvcnQgYSBjdXN0b20gcHJveHkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkgZXh0ZW5kcyBSZW5kZXJlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBSZW5kZXJlciB3cmFwcGVkOw0KLQ0KLSAgICBwdWJsaWMgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkoUmVuZGVyZXIgcmVuZGVyZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IHJlbmRlcmVyOw0KLQ0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzaW1wbGUgcHJveHkgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgZGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBnZXRMYXp5UmVuZGVyZXIoKS5kZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBnZXRMYXp5UmVuZGVyZXIoKS5lbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0Q2xpZW50SWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRMYXp5UmVuZGVyZXIoKS5jb252ZXJ0Q2xpZW50SWQoZmFjZXNDb250ZXh0LCBzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UmVuZGVyc0NoaWxkcmVuKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldExhenlSZW5kZXJlcigpLmdldFJlbmRlcnNDaGlsZHJlbigpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykNCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldExhenlSZW5kZXJlcigpLmdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgUmVuZGVyZXIgZ2V0TGF6eVJlbmRlcmVyKCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHByb3h5Q2xhc3NOYW1lID0gKFN0cmluZykgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVkpOw0KLQ0KLSAgICAgICAgaWYocHJveHlDbGFzc05hbWUgIT0gbnVsbCAmJiAhcHJveHlDbGFzc05hbWUuZW5kc1dpdGgoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUocHJveHlDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmKHRhcmdldENsYXNzID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhIGN1c3RvbSBpbnZhbGlkIHJlbmRlcmVyIHByb3h5IGlzIGNvbmZpZ3VyZWQ6ICIgKyBwcm94eUNsYXNzTmFtZSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIENsYXNzW10gYXJnQ2xhc3NlcyA9IG5ldyBDbGFzc1sxXTsNCi0gICAgICAgICAgICBhcmdDbGFzc2VzWzBdID0gUmVuZGVyZXIuY2xhc3M7DQotDQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHRhcmdldENsYXNzLmdldENvbnN0cnVjdG9yKGFyZ0NsYXNzZXMpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gKFJlbmRlcmVyKWNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHRoaXMud3JhcHBlZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBjcmVhdGU6ICIgKyB0YXJnZXRDbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQ7DQotICAgICAgICB9DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjM1NGU1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VTdHJlYW07Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVdyaXRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVzcG9uc2VTdGF0ZU1hbmFnZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJLaXQgZXh0ZW5kcyBSZW5kZXJLaXQKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgd3JhcHBlZDsKLQotICAgIHB1YmxpYyBFeHRWYWxSZW5kZXJLaXQoUmVuZGVyS2l0IHdyYXBwZWQpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOwotCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICBpZiAocmVuZGVyZXIgaW5zdGFuY2VvZiBFeHRWYWxSZW5kZXJlcldyYXBwZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIHJlbmRlcmVyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIGNyZWF0ZVdyYXBwZXIocmVuZGVyZXIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBSZW5kZXJlciBnZXRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSB3cmFwcGVkLmdldFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlKTsKLQotICAgICAgICBpZihyZW5kZXJlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyZXIgaW5zdGFuY2VvZiBFeHRWYWxSZW5kZXJlcldyYXBwZXIgPyByZW5kZXJlciA6IGNyZWF0ZVdyYXBwZXIocmVuZGVyZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCJubyByZW5kZXJlciBmb3VuZCBmb3IgZmFtaWx5ICIgKyBmYW1pbHkgKyAiIGFuZCB0eXBlICIgKyByZW5kZXJlclR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlbmRlcmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZVN0YXRlTWFuYWdlciBnZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZVdyaXRlciBjcmVhdGVSZXNwb25zZVdyaXRlcihXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcywgU3RyaW5nIHMxKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY3JlYXRlUmVzcG9uc2VXcml0ZXIod3JpdGVyLCBzLCBzMSk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlU3RyZWFtIGNyZWF0ZVJlc3BvbnNlU3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jcmVhdGVSZXNwb25zZVN0cmVhbShvdXRwdXRTdHJlYW0pOwotICAgIH0KLQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIGNyZWF0ZVdyYXBwZXIoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEV4dFZhbFJlbmRlcmVyV3JhcHBlcihyZW5kZXJlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyODJiYmMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeTsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBjZW50cmFsIG1lY2hhbmlzbSB3aGljaCBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgYSB3cmFwcGVyIGZvciBhIHJlbmRlcmVyIC0gc3RhcnRpbmcgcG9pbnQgb2YgZXh0dmFsLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeSBleHRlbmRzIFJlbmRlcktpdEZhY3RvcnkKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotICAgIHByaXZhdGUgUmVuZGVyS2l0RmFjdG9yeSB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcktpdEZhY3RvcnkoUmVuZGVyS2l0RmFjdG9yeSByZW5kZXJLaXRGYWN0b3J5KQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyS2l0RmFjdG9yeTsKLQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcktpdChTdHJpbmcgcywgUmVuZGVyS2l0IHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIHdyYXBwZWQuYWRkUmVuZGVyS2l0KHMsIHJlbmRlcktpdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlbmRlcktpdCBnZXRSZW5kZXJLaXQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICBSZW5kZXJLaXQgcmVuZGVyS2l0ID0gdGhpcy53cmFwcGVkLmdldFJlbmRlcktpdChmYWNlc0NvbnRleHQsIHMpOwotCi0gICAgICAgIC8vanNmIHJpICsgdHJpbmlkYWQKLSAgICAgICAgaWYocmVuZGVyS2l0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSB3cmFwcGVyRmFjdG9yeSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgIC8vc29tZSBjb21wb25lbnQgbGlicyBlLmcuIG15ZmFjZXMtdHJpbmlkYWQgYXJlbid0IGNvbXBhdGlibGUgd2l0aCB0aGlzIGNsZWFuIGFwcHJvYWNoCi0gICAgICAgIC8vZXhhbXBsZSBzZWUgVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIKLSAgICAgICAgaWYod3JhcHBlckZhY3RvcnkuaXNEZWFjdGl2YXRlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJGYWN0b3J5LmNyZWF0ZShyZW5kZXJLaXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGdldFJlbmRlcktpdElkcygpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZW5kZXJLaXRJZHMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkzNGZlMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogdG8gYXZvaWQgbXVsdGlwbGUgY2FsbHMgb2YgcmVuZGVyZXIgbWV0aG9kcyB3aXRoaW4gcmVuZGVyZXIgaW50ZXJjZXB0b3JzIChlLmcuIGZvciBlbmNvZGUsIGRlY29kZSwuLi4pCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJlclByb3h5IGV4dGVuZHMgUmVuZGVyZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVkgPSBFeHRWYWxSZW5kZXJlclByb3h5LmNsYXNzLmdldE5hbWUoKSArICI6S0VZIjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotICAgIAotICAgIHByb3RlY3RlZCBSZW5kZXJlciB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcmVyUHJveHkoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSByZW5kZXJlcjsKLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eUVudHJ5IGVudHJ5ID0gZ2V0T3JJbml0RW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0RlY29kZUNhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXREZWNvZGVDYWxsZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlZC5kZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZG91YmxlIGNhbGwgb2YgbWV0aG9kICdkZWNvZGUnIGZpbHRlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5RW50cnkgZW50cnkgPSBnZXRPckluaXRFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRW5jb2RlQmVnaW5DYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RW5jb2RlQmVnaW5DYWxsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLndyYXBwZWQuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZG91YmxlIGNhbGwgb2YgbWV0aG9kICdlbmNvZGVCZWdpbicgZmlsdGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlFbnRyeSBlbnRyeSA9IGdldE9ySW5pdEVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNFbmNvZGVDaGlsZHJlbkNhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXRFbmNvZGVDaGlsZHJlbkNhbGxlZCh0cnVlKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVkLmVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImRvdWJsZSBjYWxsIG9mIG1ldGhvZCAnZW5jb2RlQ2hpbGRyZW4nIGZpbHRlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eUVudHJ5IGVudHJ5ID0gZ2V0T3JJbml0RW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0VuY29kZUVuZENhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXRFbmNvZGVFbmRDYWxsZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlZC5lbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZG91YmxlIGNhbGwgb2YgbWV0aG9kICdlbmNvZGVFbmQnIGZpbHRlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5jb252ZXJ0Q2xpZW50SWQoZmFjZXNDb250ZXh0LCBzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGdldFJlbmRlcnNDaGlsZHJlbigpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gdCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgIHRocm93IHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eUVudHJ5IGVudHJ5ID0gZ2V0T3JJbml0RW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKGVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW50cnkuc2V0Q29udmVydGVkVmFsdWUod3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZG91YmxlIGNhbGwgb2YgbWV0aG9kICdnZXRDb252ZXJ0ZWRWYWx1ZScgZmlsdGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlbmRlcmVyUHJveHlFbnRyeSBnZXRPckluaXRFbnRyeShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGtleSArPSBnZXRPcHRpb25hbEtleShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWdldE9ySW5pdENvbXBvbmVudFByb3h5TWFwcGluZygpLmNvbnRhaW5zS2V5KGtleSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldE9ySW5pdENvbXBvbmVudFByb3h5TWFwcGluZygpLnB1dChrZXksIG5ldyBSZW5kZXJlclByb3h5RW50cnkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldE9ySW5pdENvbXBvbmVudFByb3h5TWFwcGluZygpLmdldChrZXkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3B0aW9uYWxLZXkoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX1NUT1JBR0VfTkFNRSA9IEV4dFZhbFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpICsgIjpTVE9SQUdFIjsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eUVudHJ5PiBnZXRPckluaXRDb21wb25lbnRQcm94eU1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgTWFwIHJlcXVlc3RNYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpOwotCi0gICAgICAgIGlmKCFyZXF1ZXN0TWFwLmNvbnRhaW5zS2V5KFBST1hZX1NUT1JBR0VfTkFNRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcXVlc3RNYXAucHV0KFBST1hZX1NUT1JBR0VfTkFNRSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5RW50cnk+PigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlFbnRyeT4+IHByb3h5U3RvcmFnZSA9Ci0gICAgICAgICAgICAoKE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlFbnRyeT4+KXJlcXVlc3RNYXAuZ2V0KFBST1hZX1NUT1JBR0VfTkFNRSkpOwotCi0gICAgICAgIFN0cmluZyBrZXkgPSB0aGlzLndyYXBwZWQuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0KLSAgICAgICAgaWYoIXByb3h5U3RvcmFnZS5jb250YWluc0tleShrZXkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm94eVN0b3JhZ2UucHV0KGtleSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5RW50cnk+KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByb3h5U3RvcmFnZS5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgLy9yZXNldCBjb21wb25lbnQgcHJveHkgbWFwcGluZwotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnJlbW92ZShQUk9YWV9TVE9SQUdFX05BTUUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjMzA1ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUmVuZGVyZXJJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLQotLyoqCi0gKiBEZWZhdWx0IGFwcHJvYWNoIHRvIGF2b2lkIHByb3hpZXMgZm9yIGNvbnZlcnRlcnMgYW5kIHRoZSBhZGFwdGVyIGZhbGxiYWNrLgotICogSXQgcmVxdWlyZXMgdGhhdCBjb21wb25lbnRzIGRlbGVnYXRlIGdldENvbnZlcnRlZFZhbHVlIHRvIGEgcmVuZGVyZXIuPGJyLz4KLSAqIElmIGl0IGlzbid0IHRoZSBjYXNlIGZvciB5b3VyIGNvbXBvbmVudCBsaWIgdXNlOgotICogb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHkuRXh0VmFsQXBwbGljYXRpb25GYWN0b3J5PGJyLz4KLSAqIGFuZDxici8+Ci0gKiBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5Qcm94eU1hcHBpbmdQaGFzZUxpc3RlbmVyCi0gKiA8cC8+Ci0gKiBUaGlzIHdyYXBwZXIgd2lsbCBhbHNvIGltcGxlbWVudCBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIGJlaGF2aW91cgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyZXJXcmFwcGVyIGV4dGVuZHMgUmVuZGVyZXIKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIHdyYXBwZWQ7Ci0gICAgcHJvdGVjdGVkIEV4dFZhbENvbnRleHQgZXh0VmFsQ29udGV4dCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcmVyV3JhcHBlcihSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwcm94eUNsYXNzTmFtZSA9IChTdHJpbmcpRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVkpOwotCi0gICAgICAgIGlmKHByb3h5Q2xhc3NOYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNvbmZpZ3VyZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gbmV3IEV4dFZhbExhenlSZW5kZXJlclByb3h5KHJlbmRlcmVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUocHJveHlDbGFzc05hbWUpOwotCi0gICAgICAgIGlmKHRhcmdldENsYXNzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNvbmZpZ3VyZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gbmV3IEV4dFZhbExhenlSZW5kZXJlclByb3h5KHJlbmRlcmVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzW10gYXJnQ2xhc3NlcyA9IG5ldyBDbGFzc1sxXTsKLSAgICAgICAgYXJnQ2xhc3Nlc1swXSA9IFJlbmRlcmVyLmNsYXNzOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHRhcmdldENsYXNzLmdldENvbnN0cnVjdG9yKGFyZ0NsYXNzZXMpOwotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gKFJlbmRlcmVyKWNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHJlbmRlcmVyKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm5vIGV4dHZhbCByZW5kZXJlciBwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0dmFsIHJlbmRlcmVyIHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZURlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZURlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZGVjb2RlIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZURlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZURlY29kZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckRlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJEZWNvZGUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSB0cnVlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJlbmNvZGVCZWdpbiBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVCZWdpbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVCZWdpbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUNoaWxkcmVuIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImVuY29kZUNoaWxkcmVuIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUNoaWxkcmVuIG9mICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVDaGlsZHJlbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUNoaWxkcmVuIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZW5jb2RlRW5kIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVFbmQgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5lbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJFbmNvZGVFbmQgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlRW5kIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBjb252ZXJ0Q2xpZW50SWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jb252ZXJ0Q2xpZW50SWQoZmFjZXNDb250ZXh0LCBzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0gICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8sIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QgPSBlLmdldFJldHVyblZhbHVlT25FeGNlcHRpb24oY29udmVydGVkT2JqZWN0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJnZXRDb252ZXJ0ZWRWYWx1ZSBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlR2V0Q29udmVydGVkVmFsdWUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgY29udmVydGVkT2JqZWN0ID0gd3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyR2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbywgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRPYmplY3Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L1JlbmRlcmVyUHJveHlFbnRyeS5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L1JlbmRlcmVyUHJveHlFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTYzOTEwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9SZW5kZXJlclByb3h5RW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgUmVuZGVyZXJQcm94eUVudHJ5DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGVjb2RlQ2FsbGVkID0gZmFsc2U7DQotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVCZWdpbkNhbGxlZCA9IGZhbHNlOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGVuY29kZUVuZENhbGxlZCA9IGZhbHNlOw0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBjb252ZXJ0ZWRWYWx1ZSA9IG51bGw7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVjb2RlQ2FsbGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRlY29kZUNhbGxlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWNvZGVDYWxsZWQoYm9vbGVhbiBkZWNvZGVDYWxsZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGVjb2RlQ2FsbGVkID0gZGVjb2RlQ2FsbGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlQmVnaW5DYWxsZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW5jb2RlQmVnaW5DYWxsZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlQmVnaW5DYWxsZWQoYm9vbGVhbiBlbmNvZGVCZWdpbkNhbGxlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5lbmNvZGVCZWdpbkNhbGxlZCA9IGVuY29kZUJlZ2luQ2FsbGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlQ2hpbGRyZW5DYWxsZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlQ2hpbGRyZW5DYWxsZWQoYm9vbGVhbiBlbmNvZGVDaGlsZHJlbkNhbGxlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5lbmNvZGVDaGlsZHJlbkNhbGxlZCA9IGVuY29kZUNoaWxkcmVuQ2FsbGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlRW5kQ2FsbGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVuY29kZUVuZENhbGxlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVFbmRDYWxsZWQoYm9vbGVhbiBlbmNvZGVFbmRDYWxsZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZW5jb2RlRW5kQ2FsbGVkID0gZW5jb2RlRW5kQ2FsbGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkVmFsdWUoT2JqZWN0IGNvbnZlcnRlZFZhbHVlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbnZlcnRlZFZhbHVlID0gY29udmVydGVkVmFsdWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZmZkNDYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMDk0MGEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4MGZmYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXJJbnRlcmNlcHRvciBleGNlcHRpb25Tb3VyY2U7Ci0gICAgcHJvdGVjdGVkIE9iamVjdCBpbmZvcm1hdGlvbjsKLSAgICBib29sZWFuIHNraXBPdGhlckludGVyY2VwdG9ycyA9IGZhbHNlOwotCi0gICAgcHVibGljIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbihib29sZWFuIHNraXBPdGhlckludGVyY2VwdG9ycykKLSAgICB7Ci0gICAgICAgIHRoaXMuc2tpcE90aGVySW50ZXJjZXB0b3JzID0gc2tpcE90aGVySW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzLCBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzKHNraXBPdGhlckludGVyY2VwdG9ycyk7Ci0gICAgICAgIHRoaXMuZXhjZXB0aW9uU291cmNlID0gcmVuZGVyZXJJbnRlcmNlcHRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvbihPYmplY3QgaW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICB0aGlzLmluZm9ybWF0aW9uID0gaW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gaW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNraXBPdGhlckludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJldHVyblZhbHVlT25FeGNlcHRpb24oT2JqZWN0IGN1cnJlbnRSZXR1cm5WYWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMuZXhjZXB0aW9uU291cmNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmV4Y2VwdGlvblNvdXJjZS5nZXRSZXR1cm5WYWx1ZU9uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbih0aGlzLCBjdXJyZW50UmV0dXJuVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjdXJyZW50UmV0dXJuVmFsdWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2I3YWJhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIGV4ZWN1dGUgbG9naWMganVzdCBvbmNlLg0KLSAqIGUuZy4gcmVnaXN0ZXIgYXJ0aWZhY3RzIHZpYSBhcGkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgLy9kb24ndCByZW1vdmUgLSBpdCdzIGEgZmFsbGJhY2sgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggZGVyZWdpc3RyYXRpb24NCi0gICAgLy90YXJnZXQ6IGRvbid0IHByb2Nlc3MgaW5pdCBsb2dpYyBtb3JlIHRoYW4gb25jZQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENsYXNzPiBpbml0aWFsaXplZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICAgICAgc3luY2hyb25pemVkIChBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5jbGFzcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIWluaXRpYWxpemVkTGlzdGVuZXJzLmNvbnRhaW5zKGdldENsYXNzKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oInN0YXJ0IGluaXQgb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluaXQoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImluaXQgb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBKc2ZVdGlscy5kZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcih0aGlzKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBkZXJlZ2lzdGVyaW5nIHRoZSBwaGFzZS1saXN0ZW5lciINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtPiB0aGVyZSBpcyBqdXN0IGEgbGl0dGxlIG92ZXJoZWFkLCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBidXQgZXZlcnl0aGluZyBlbHNlIHdvcmtzIGNvcnJlY3RseS4iDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaG93ZXZlciwgcGxlYXNlIGluZm9ybSB0aGUgY29tbXVuaXR5IGFib3V0IHlvdXIgY29uZmlndXJhdGlvbiIsIHQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWRMaXN0ZW5lcnMuYWRkKGdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5SRVNUT1JFX1ZJRVc7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdCgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0V4dFZhbFN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9FeHRWYWxTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjMzYwYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0V4dFZhbFN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIKLSAgICAgICAgLlNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIKLSAgICAgICAgLlNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIKLSAgICAgICAgLkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXIKLSAgICAgICAgLkRlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJQcm94eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyCi17Ci0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihFeHRWYWxJbmZvcm1hdGlvbi5WRVJTSU9OICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oInN0YXJ0aW5nIHVwIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgdiIgKyBFeHRWYWxJbmZvcm1hdGlvbi5WRVJTSU9OKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnRpbmcgdXAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKG5ldyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IoKSk7Ci0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkKLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVksIEV4dFZhbFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpLCBmYWxzZSk7Ci0KLSAgICAgICAgaW5pdE5hbWVNYXBwZXJzKCk7Ci0gICAgICAgIGV4ZWN1dGVDdXN0b21TdGFydHVwTGlzdGVuZXIoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdE5hbWVNYXBwZXJzKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBkZWFjdGl2YXRlRGVmYXVsdE5hbWVNYXBwZXJzID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfREVGQVVMVF9OQU1FX01BUFBFUlM7Ci0gICAgICAgIGlmICgoZGVhY3RpdmF0ZURlZmF1bHROYW1lTWFwcGVycyAhPSBudWxsICYmIGRlYWN0aXZhdGVEZWZhdWx0TmFtZU1hcHBlcnMuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9yZWdpc3RlciBtZXRhZGF0YSB0byB2YWxpZGF0aW9uIHN0cmF0ZWd5IG5hbWUgbWFwcGVyCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7Ci0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7Ci0KLSAgICAgICAgLy9yZWdpc3RlciB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1lc3NhZ2UgcmVzb2x2ZXIgbmFtZSBtYXBwZXIKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotCi0gICAgICAgIC8vcmVnaXN0ZXIgdmFsaWRhdGlvbiBzdHJhdGVneSB0byBtZXRhZGF0YSB0cmFuc2Zvcm1lciBuYW1lIG1hcHBlcgotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVDdXN0b21TdGFydHVwTGlzdGVuZXIoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lck5hbWUgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVJUVVBfTElTVEVORVIpOwotICAgICAgICBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lciBjdXN0b21TdGFydHVwTGlzdGVuZXIgPQotICAgICAgICAgICAgKEFic3RyYWN0U3RhcnR1cExpc3RlbmVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjdXN0b21TdGFydHVwTGlzdGVuZXJOYW1lKTsKLQotICAgICAgICBpZihjdXN0b21TdGFydHVwTGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnQgaW5pdCBvZiAiICsgY3VzdG9tU3RhcnR1cExpc3RlbmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3VzdG9tU3RhcnR1cExpc3RlbmVyLmluaXQoKTsKLQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiaW5pdCBvZiAiICsgY3VzdG9tU3RhcnR1cExpc3RlbmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0xhYmVsZWRNZXNzYWdlLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvTGFiZWxlZE1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RmN2FlNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvTGFiZWxlZE1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGRvbid0IHJlbW92ZSAqVGV4dCAtIGl0IHdvdWxkIGxlYWQgdG8gYW4gb3ZlcmxhcCB3aXRoIHRyaW5pZGFkDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBMYWJlbGVkTWVzc2FnZQ0KLXsNCi0gICAgU3RyaW5nIGdldExhYmVsVGV4dCgpOw0KLSAgICB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgbGFiZWwpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvVmlvbGF0aW9uTWVzc2FnZS5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL1Zpb2xhdGlvbk1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA4MTQzNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvVmlvbGF0aW9uTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIFZpb2xhdGlvbk1lc3NhZ2UgZXh0ZW5kcyBGYWNlc01lc3NhZ2UgaW1wbGVtZW50cyBMYWJlbGVkTWVzc2FnZQ0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjkwMzk1ODk0Mjk4NzcxMTIzMUw7DQotICAgIHByaXZhdGUgU3RyaW5nIGxhYmVsOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gc3VtbWFyeUxhYmVsUmVwbGFjZWQgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGRldGFpbExhYmVsUmVwbGFjZWQgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIFZpb2xhdGlvbk1lc3NhZ2UoU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHRoaXMoU0VWRVJJVFlfRVJST1IsIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZpb2xhdGlvbk1lc3NhZ2UoU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICBzZXRTZXZlcml0eShzZXZlcml0eSk7DQotICAgICAgICBzZXRTdW1tYXJ5KHN1bW1hcnkpOw0KLSAgICAgICAgc2V0RGV0YWlsKGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN1bW1hcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsYWJlbCAhPSBudWxsICYmICF0aGlzLnN1bW1hcnlMYWJlbFJlcGxhY2VkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHNldFN1bW1hcnkoZ2V0TGFiZWxlZE1lc3NzYWdlKHN1cGVyLmdldFN1bW1hcnkoKSwgZ2V0TGFiZWxUZXh0KCkpKTsNCi0gICAgICAgICAgICB0aGlzLnN1bW1hcnlMYWJlbFJlcGxhY2VkID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRTdW1tYXJ5KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGV0YWlsKCkNCi0gICAgew0KLSAgICAgICAgaWYobGFiZWwgIT0gbnVsbCAmJiAhdGhpcy5kZXRhaWxMYWJlbFJlcGxhY2VkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHNldERldGFpbChnZXRMYWJlbGVkTWVzc3NhZ2Uoc3VwZXIuZ2V0RGV0YWlsKCksIGdldExhYmVsVGV4dCgpKSk7DQotICAgICAgICAgICAgdGhpcy5kZXRhaWxMYWJlbFJlcGxhY2VkID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzdXBlci5nZXREZXRhaWwoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRMYWJlbGVkTWVzc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5jb250YWlucygieyIgKyBpICsgIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoInsiICsgaSArICJ9IiwgbGFiZWwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBtZXNzYWdlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YzgwNWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotDQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsNCi0NCi0vKioNCi0gKiBNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggdXNlcyBwcm9wZXJ0eSBmaWxlcy4NCi0gKiBTdWJjbGFzc2VzIGp1c3QgaGF2ZSB0byBwcm92aWRlIHRoZSBwYWNrYWdlIHRvIGxvb2sgYXQuDQotICogQW4gaW1wbGVtZW50YXRpb24gY2FuIGFsc28gcHJvdmlkZSBhIGN1c3RvbSBuYW1lIHdoaWNoIGlzIGUuZy4gY29uZmlndXJlZCB2aWEgd2ViLnhtbC4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGltcGxlbWVudHMgTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX1JFU09VUkNFX01BUktFUiA9ICI/Pz8iOw0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfREVGQVVMVF9DT05WRU5USU9OOw0KLSAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBkZWZhdWx0QnVuZGxlID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZUJ1bmRsZUJhc2VOYW1lOw0KLSAgICAvL3dpdGgganNmIDEuMSBvbmx5IGF2YWlsYWJsZSBpZiB0aGVyZSBpcyBhIGN1c3RvbSBiZWFuDQotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VCdW5kbGVWYXJOYW1lOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICBpZiAoa2V5ID09IG51bGwgfHwga2V5LmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IG51bGw7DQotICAgICAgICBTdHJpbmcgY3VzdG9tTWVzc2FnZSA9IG51bGw7DQotDQotICAgICAgICAvL29ubHkgaW4gY2FzZSBvZiBhIFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciB3aGljaCBpcyBjb25maWd1cmVkIGFzIGJlYW4NCi0gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lLCBsb2NhbGUpOw0KLSAgICAgICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigibWVzc2FnZSBidW5kbGUgIiArIHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lICsgIiBub3QgZm91bmQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vb25seSBpbiBjYXNlIG9mIGEgVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIHdoaWNoIGlzIGNvbmZpZ3VyZWQgYXMgYmVhbg0KLSAgICAgICAgaWYgKHRoaXMubWVzc2FnZUJ1bmRsZVZhck5hbWUgIT0gbnVsbCAmJiBjdXN0b21NZXNzYWdlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSAoUmVzb3VyY2VCdW5kbGUpIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbihtZXNzYWdlQnVuZGxlVmFyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJtZXNzYWdlIGJ1bmRsZSB2YXIgbmFtZSAiICsgdGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSArICIgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY3VzdG9tTWVzc2FnZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIHRyeSB0byB1c2UgdGhlIGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZQ0KLSAgICAgICAgICovDQotICAgICAgICBjdXN0b21NZXNzYWdlID0gdHJ5VG9Vc2VNZXNzYWdlQnVuZGxlQ29udmVudGlvbihrZXksIGxvY2FsZSk7DQotDQotICAgICAgICBpZiAoY3VzdG9tTWVzc2FnZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIG5vIG1lc3NhZ2UgYnVuZGxlIG9yIG1lc3NhZ2UgZm91bmQgKHdpdGggdGhlIGNvbnZlbnRpb24pPw0KLSAgICAgICAgICovDQotDQotICAgICAgICAvL3RyeSB0byBsb2FkIGN1c3RvbSBtZXNzYWdlcw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoZ2V0Q3VzdG9tQmFzZU5hbWUoKSwgbG9jYWxlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm5vIGN1c3RvbSBtZXNzYWdlIGZvciAiICsga2V5ICsgIiB3aXRoaW4gIiArIGdldEN1c3RvbUJhc2VOYW1lKCksIGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy91c2UgY3VzdG9tIG5hbWUgKGlmIHBvc3NpYmxlKSBvdGhlcndpc2U6IGZhbGxiYWNrIHRvIGRlZmF1bHQgbWVzc2FnZSAoaWYgcG9zc2libGUpDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKGN1c3RvbU1lc3NhZ2UgIT0gbnVsbCkgPyBjdXN0b21NZXNzYWdlDQotICAgICAgICAgICAgICAgIDogKGdldEJhc2VOYW1lKCkgIT0gbnVsbCkgPyBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoZ2V0QmFzZU5hbWUoKSwgbG9jYWxlKS5nZXRTdHJpbmcoa2V5KSA6IG51bGw7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSICsga2V5ICsgTUlTU0lOR19SRVNPVVJDRV9NQVJLRVI7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHJ5VG9Vc2VNZXNzYWdlQnVuZGxlQ29udmVudGlvbihTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VzdG9tTWVzc2FnZSA9IG51bGw7DQotDQotICAgICAgICBpZiAoKGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbiA9PSBudWxsIHx8ICFkZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb24uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgICAgICYmIGlzRGVmYXVsdE1lc3NhZ2VCdW5kbGVDb252ZW50aW9uQWN0aXZlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGRlZmF1bHRCdW5kbGUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0QnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FU1NBR0VfQlVORExFX05BTUUpLCBsb2NhbGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nDQotICAgICAgICAgICAgICAgICAgICBkZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb24gPSAidHJ1ZSI7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGRlZmF1bHRCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gZGVmYXVsdEJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWZhdWx0TWVzc2FnZUJ1bmRsZUNvbnZlbnRpb25BY3RpdmUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEJhc2VOYW1lKCk7DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tQmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlQnVuZGxlQmFzZU5hbWUoU3RyaW5nIG1lc3NhZ2VCdW5kbGVCYXNlTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUgPSBtZXNzYWdlQnVuZGxlQmFzZU5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUJ1bmRsZVZhck5hbWUoU3RyaW5nIG1lc3NhZ2VCdW5kbGVWYXJOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1lc3NhZ2VCdW5kbGVWYXJOYW1lID0gbWVzc2FnZUJ1bmRsZVZhck5hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQwZTY4Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogRmFjdG9yeSB3aGljaCBjcmVhdGVzIGEgTWVzc2FnZVJlc29sdmVyIGZvciBhIGdpdmVuIFZhbGlkYXRpb25TdHJhdGVneQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnZW5lcmljIGphdmEgYXBpIChkZS0vcmVnaXN0ZXIgbWFwcGluZykiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneT4NCi0gICAgICAgIGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1lc3NhZ2VSZXNvbHZlcj4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmc7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1lc3NhZ2VSZXNvbHZlciBjcmVhdGUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHN0cmF0ZWd5TmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0NCi0gICAgICAgIGlmIChzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmcgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljTWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmcuY29udGFpbnNLZXkoc3RyYXRlZ3lOYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKE1lc3NhZ2VSZXNvbHZlcikgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmcuZ2V0KHN0cmF0ZWd5TmFtZSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcjsNCi0gICAgICAgIFN0cmluZyByZXNvbHZlck5hbWU7DQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiBuYW1lTWFwcGVyIDogbmFtZU1hcHBlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9idWlsZCBjb252ZW50aW9uIChWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIpDQotICAgICAgICAgICAgcmVzb2x2ZXJOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKHZhbGlkYXRpb25TdHJhdGVneSk7DQotDQotICAgICAgICAgICAgLy9uYW1lIHdhc24ndCBtYXBwZWQNCi0gICAgICAgICAgICBpZiAocmVzb2x2ZXJOYW1lID09IG51bGwgfHwgdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscyhyZXNvbHZlck5hbWUpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIG1lc3NhZ2VSZXNvbHZlciA9IChNZXNzYWdlUmVzb2x2ZXIpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShyZXNvbHZlck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtZXNzYWdlUmVzb2x2ZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFkZE1hcHBpbmcoc3RyYXRlZ3lOYW1lLCByZXNvbHZlck5hbWUpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHJlc29sdmVyTmFtZSArICIgdXNlZCBmb3IgIiArIHN0cmF0ZWd5TmFtZSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VSZXNvbHZlcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBhZGRNYXBwaW5nKHN0cmF0ZWd5TmFtZSwgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbml0U3RhdGljTWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICBzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9DT05GSUcpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBTdHJhdGVneU1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZyxTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWFwcGluZy5nZXRTb3VyY2UoKSwgbWFwcGluZy5nZXRUYXJnZXQoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyBtZXNzYWdlUmVzb2x2ZXJOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImFkZGluZyBzdGF0aWMgdmFsaWRhdGlvbiBzdHJhdGVneSB0byBtZXNzYWdlIHJlc29sdmVyIG1hcHBpbmc6ICINCi0gICAgICAgICAgICAgICAgKyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgIiAtPiAiICsgbWVzc2FnZVJlc29sdmVyTmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmcucHV0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIG1lc3NhZ2VSZXNvbHZlck5hbWUpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gZ2V0TmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmFtZU1hcHBlckxpc3Q7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYTk3MWYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgTWVzc2FnZVJlc29sdmVyIHdoaWNoIHVzZXMgdGhlIGRlZmF1bHQgY29udmVudGlvbiBmb3IgdGhlIG1lc3NhZ2UgYnVuZGxlLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBtZXNzYWdlIGJ1bmRsZSB2aWEgd2ViLnhtbA0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0JVTkRMRSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVTU0FHRV9CVU5ETEU7DQotDQotICAgIC8vbm90IHVzZWQgYXQgdGhlIG1vbWVudCAtIGp1c3QgZm9yIGEgY29udmVudGlvbg0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1vZHVsZU1lc3NhZ2VCdW5kbGVOYW1lKGdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21CYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBDVVNUT01fQlVORExFOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM0Zjg2My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgZm9yIE1lc3NhZ2VSZXNvbHZlcnMgaW5kZXBlbmRlbnQgb2YgdGhlIG1lc3NhZ2Ugc291cmNlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTRjNGQ2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDc0MDFhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXNzYWdlUmVzb2x2ZXJzLg0KLSAqIChjb25maWd1cmVkIHZpYSB3ZWIueG1sKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM3MjAzNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ3kgdG8gTWVzc2FnZVJlc29sdmVyLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NU0dfUkVTT0xWRVJfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2RmNDJiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIHByb3ZpZGUgYSBOYW1lTWFwcGVyIHBlciB2YWxpZGF0aW9uIG1vZHVsZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBzdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTVjMTE3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIG1hcHMgRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIEV4dFZhbCBNZXNzYWdlUmVzb2x2ZXJzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKHN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNjA2ZjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgdG8gcGxhY2UgVmFsaWRhdGlvblN0cmF0ZWdpZXMgYW5kIE1lc3NhZ2VSZXNvbHZlcnMgaW4gdGhlIHNhbWUgcGFja2FnZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBzdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1c3RvbVBvc3RmaXggPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWCk7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHN0cmF0ZWd5Q2xhc3NOYW1lLCBjdXN0b21Qb3N0Zml4KTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdkMzc5ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci0KLS8qKgotICogUHJvdmlkZXMgdGhlIGFiaWxpdHkgb2YgbWVzc2FnZSByZXNvbHZpbmcgdG8gVmFsaWRhdGlvblN0cmF0ZWdpZXMKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kKLXsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCA9ICJfZGV0YWlsIjsKLSAgICAvL2UuZy4gZm9yIGluamVjdGluZyBhIG1lc3NhZ2UgcmVzb2x2ZXIgdmlhIHNwcmluZwotICAgIHByaXZhdGUgTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcjsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIExvY2FsZSBsb2NhbGUgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKTsKLQotICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlUmVzb2x2ZXIgIT0gbnVsbCA/IHRoaXMubWVzc2FnZVJlc29sdmVyLmdldE1lc3NhZ2Uoa2V5LCBsb2NhbGUpIDoKLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldE1lc3NhZ2VSZXNvbHZlckZvclZhbGlkYXRpb25TdHJhdGVneSh0aGlzKS5nZXRNZXNzYWdlKGtleSwgbG9jYWxlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlc29sdmVNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gKGtleSAhPSBudWxsKSA/IHJlc29sdmVNZXNzYWdlKGtleSArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYKSA6IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRmFjZXNNZXNzYWdlIGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWFzc2FnZShBbm5vdGF0aW9uIGFubm90YXRpb24pCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKGdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiksIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VSZXNvbHZlcihNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyKQotICAgIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlUmVzb2x2ZXIgPSBtZXNzYWdlUmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pCi0gICAgewotICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMLCBnZXRMYWJlbChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5KSk7Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbik7Ci0gICAgfQotCi0gICAgLy9mb3IgY3VzdG9tIGFubm90YXRpb25zIC0gb3ZlcnJpZGUgaWYgbmVlZGVkCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjY5NGIzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogUHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gdXNlIFZhbGlkYXRvckV4Y2VwdGlvbiAoYXMgZXhwZWN0ZWQgYnkgdGhlIHVzZXIpIGluc3RlYWQgb2YgQ29udmVydGVyRXhjZXB0aW9uLg0KLSAqIEZ1cnRoZXJtb3JlIGl0IHByb3ZpZGVzOjxici8+DQotICogaW5pdFZhbGlkYXRpb248YnIvPg0KLSAqIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGluaXRWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpbml0VmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJpbml0VmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7DQotICAgICAgICB9DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgcHJvY2Vzc1ZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHJvY2Vzc1ZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgicHJvY2Vzc1ZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24gPSBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29udmVydEZhY2VzTWVzc2FnZShlLmdldEZhY2VzTWVzc2FnZSgpKSwgZS5nZXRDYXVzZSgpKTsNCi0gICAgICAgICAgICBpZiAocHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgIjogdGhyb3cgb3JpZ2luYWwgZXhjZXB0aW9uIGFmdGVyIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHRocm93IHZhbGlkYXRvckV4Y2VwdGlvbjsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgIjogb3JpZ2luYWwgZXhjZXB0aW9uIGFmdGVyIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbiwgdGhpcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlci5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjVkYzRlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0NCi0gKiBhZGFwdGVyIHRvIGNvbm5lY3QgdmFsaWRhdGlvbiBzdHJhdGVnaWVzIHdpdGggbWV0YS1kYXRhIHRyYW5zZm9ybWVycywNCi0gKiBpZiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBkZWZpbmVkIGFzIGJlYW4gYW5kIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBpbnRlcmZhY2UgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIgZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIC8vdG8gZ2V0IGJhY2sgdGhlIGludGVybmFsIGNhc2hpbmcNCi0gICAgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpOw0KLQ0KLSAgICBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1Y2I2My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLkJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotDQotICogYWRhcHRlciB0byBjb25uZWN0IHZhbGlkYXRpb24gc3RyYXRlZ2llcyB3aXRoIG1ldGEtZGF0YSB0cmFuc2Zvcm1lcnMsDQotICogaWYgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgZGVmaW5lZCBhcyBiZWFuIGFuZCBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIC8vb3B0aW9uYWwgZmFsbGJhY2sgZm9yIGludGVybmFsIGNhc2hpbmcNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOw0KLQ0KLSAgICBwdWJsaWMgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyIGluc3RhbmNlb2YgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIpIG1ldGFEYXRhVHJhbnNmb3JtZXIgKS5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGdldE1ldGFEYXRhVHJhbnNmb3JtZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVRyYW5zZm9ybWVyKE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyID0gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsaWRhdGlvblN0cmF0ZWd5ID0gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYWQ0ZjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyDQotICAgIC5Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotDQotLyoqDQotICogRmFjdG9yeSB3aGljaCBjcmVhdGVzIHRoZSBWYWxpZGF0aW9uU3RyYXRlZ3kgZm9yIGEgZ2l2ZW4gTWV0YS1EYXRhIEtleQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkNCi0gICAgICAgIGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxTdHJpbmcsIFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9IG51bGw7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBjcmVhdGUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICBpZiAobWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljTWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZy5jb250YWluc0tleShtZXRhRGF0YUtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nLmdldChtZXRhRGF0YUtleSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWU7DQotICAgICAgICAvL251bGwgLT4gdXNlIG5hbWUgbWFwcGVycw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFN0cmluZz4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0cmF0ZWd5TmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZShtZXRhRGF0YUtleSk7DQotDQotICAgICAgICAgICAgaWYgKHN0cmF0ZWd5TmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKHN0cmF0ZWd5TmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyhtZXRhRGF0YUtleSwgc3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lJbnN0YW5jZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUNCi0gICAgICAgICAgICAuc3RhcnRzV2l0aChBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5QUkVGSVhfRk9SX0JFQU5fTUFQUElORykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbih2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLlBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HLmxlbmd0aCgpKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgbWV0YURhdGFLZXksIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImFkZGluZyBtZXRhLWRhdGEga2V5IHRvIHZhbGlkYXRpb24gc3RyYXRlZ3kgbWFwcGluZzogIg0KLSAgICAgICAgICAgICAgICArIG1ldGFEYXRhS2V5ICsgIiAtPiAiICsgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZy5wdXQobWV0YURhdGFLZXksIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbml0U3RhdGljTWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgLy9zZXR1cCBpbnRlcm5hbCBzdGF0aWMgbWFwcGluZ3MNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnIDoNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgPSBuZXcgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAvL3RyeSB0byBzZXR1cCBtYXBwaW5nIHdpdGggYmFzZSBuYW1lIGJ5IGNvbnZlbnRpb24gLSBvdmVycmlkZXMgZGVmYXVsdCBtYXBwaW5nDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2J1aWxkIGNvbnZlbnRpb24gKHN0cmF0ZWd5IG1hcHBpbmcpDQotICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZyhFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFKSk7DQotDQotICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotDQotICAgICAgICAvL3NldHVwIGN1c3RvbSBtYXBwaW5nIC0gb3ZlcnJpZGVzIGFsbCBvdGhlciBtYXBwaW5ncw0KLSAgICAgICAgU3RyaW5nIGN1c3RvbU1hcHBpbmdCYXNlTmFtZSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORzsNCi0gICAgICAgIGlmIChjdXN0b21NYXBwaW5nQmFzZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHN0YXRpY0NvbmZpZyA9IG5ldyBTdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZyhjdXN0b21NYXBwaW5nQmFzZU5hbWUpOw0KLSAgICAgICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cFN0cmF0ZWd5TWFwcGluZ3MoTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhtYXBwaW5nLmdldFNvdXJjZSgpLCBtYXBwaW5nLmdldFRhcmdldCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+IGdldE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZU1hcHBlckxpc3Q7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NTUyM2QuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBCYXNlIGludGVyZmFjZSBmb3IgVmFsaWRhdGlvblN0cmF0ZWdpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLS8vKlZhbGlkYXRpb25TdHJhdGVneSBpbnN0ZWFkIG9mICpWYWxpZGF0b3IgdG8gYXZvaWQgbmFtaW5nIGNvbmZ1c2lvbiANCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9BYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9BYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiY2U3OTEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4KLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHVibGljIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1ZDM2MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogTmFtZSBNYXBwZXIgd2hpY2ggZGVsZWdhdGVzIHRoZSBuYW1lIG1hcHBpbmcsIGV4dHJhY3QgdGhlIG5hbWUgYW5kIGNvbnZlcnQgaXQgdG8gYSBiZWFuIG5hbWUgKyBwcmVmaXgNCi0gKiB0YXJnZXQ6IGNvbmZpZ3VyZSBhIHZhbGlkYXRpb24gc3RyYXRlZ3kgdmlhIGEgbWFuYWdlZCBiZWFuIGZhY2lsaXR5IC0+IGFsbG93cyB0byBpbmplY3Qgb3RoZXIgYmVhbnMNCi0gKiBpbnN0ZWFkIG9mIGFwaSBjYWxscyArIGhhcmRjb2RlZCBiZWFuIG5hbWVzDQotICogPHAvPg0KLSAqIGFsbG93ZWQgYmVhbiBzY29wZXM6DQotICogdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgc3RhdGVsZXNzOiBhcHBsaWNhdGlvbi9zaW5nbGV0b24NCi0gKiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBzdGF0ZWZ1bDogbm9uZS9wcm90b3R5cGUNCi0gKiBkb24ndCB1c2UgdGhlIHNlc3Npb24gb3IgYSBjb252ZXJzYXRpb24gc2NvcGUNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0ZPUl9CRUFOX01BUFBJTkcgPSAiYmVhbjoiOw0KLSAgICBwcml2YXRlIE5hbWVNYXBwZXI8U3RyaW5nPiB3cmFwcGVkOw0KLQ0KLSAgICBwdWJsaWMgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoTmFtZU1hcHBlcjxTdHJpbmc+IG5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IG5hbWVNYXBwZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuYW1lID0gd3JhcHBlZC5jcmVhdGVOYW1lKHNvdXJjZSk7DQotDQotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOw0KLSAgICAgICAgcmV0dXJuIFBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HICsgbmFtZS5zdWJzdHJpbmcoMCwgMSkudG9Mb3dlckNhc2UoKSArIG5hbWUuc3Vic3RyaW5nKDEpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmUxZjZlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBBbm5vdGF0aW9ucyB0byBWYWxpZGF0aW9uU3RyYXRlZ2llcy4NCi0gKiAoY29uZmlndXJlZCB2aWEgd2ViLnhtbCkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjhkZGZhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIEFubm90YXRpb25zIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MGU0MjAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFwcyBFeHRWYWwgQW5ub3RhdGlvbnMgdG8gRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKG1ldGFEYXRhS2V5KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MGE2MTIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgdG8gcGxhY2UgQW5ub3RhdGlvbnMgYW5kIFZhbGlkYXRpb25TdHJhdGVnaWVzIGluIHRoZSBzYW1lIHBhY2thZ2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFLZXkgKw0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvUHJpb3JpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc5NDdkNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvUHJpb3JpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1wdWJsaWMgZW51bSBQcmlvcml0eQotewotICAgIEJMT0NLSU5HLAotICAgIEhJR0gsCi0gICAgTUVESVVNLAotICAgIExPVwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YSBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Ub0RvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NDk2MjYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLXB1YmxpYyBAaW50ZXJmYWNlIFRvRG8KLXsKLSAgICBQcmlvcml0eSB2YWx1ZSgpOwotICAgIFN0cmluZyBkZXNjcmlwdGlvbigpIGRlZmF1bHQgIiI7Ci0KLSAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICBAaW50ZXJmYWNlIExpc3QKLSAgICB7Ci0gICAgICAgIFRvRG9bXSB2YWx1ZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VDYXRlZ29yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDdiMzg1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLS8qKgotICogQVBJOjxici8+Ci0gKiBwYXJ0cyB5b3UgbWlnaHQgbmVlZCBmb3IgY3VzdG9tIGltcGxlbWVudGF0aW9ucyBhbmQgd2hpY2ggYXJlIHF1aXRlIHN0YWJsZSBpbiB2aWV3IG9mIGNoYW5nZXMKLSAqIDxwLz4KLSAqIElOVEVSTkFMOjxici8+Ci0gKiBpZiB5b3UgdGhpbmsgYWJvdXQgcmVmZXJlbmNpbmcgYW4gYXJ0aWZhY3Qgd2hpY2ggaXMgbWFya2VkIGFzIGludGVybmFsLCBhc2sgZm9yIHN1cHBvcnQuCi0gKiB0aGVyZSBzaG91bGQgYmUgYSBiZXR0ZXIgc29sdXRpb24KLSAqIDxwLz4KLSAqIENVU1RPTUlaQUJMRTo8YnIvPgotICogYSBwbGFubmVkIGV4dGVuc2lvbiBwb2ludCB3aGljaCBjb250YWlucyBsb2dpYyB0byBjdXN0b21pemUgdGhlIGZyYW1ld29yay4KLSAqIGlmIGl0IGlzbid0IGFsc28gbWFya2VkIGFzIEFQSSBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotICogaG93ZXZlciwgd2UgdHJ5IHRvIGtlZXAgaXQgYXMgc3RhYmxlIGFzIHBvc3NpYmxlIGFuZCByZWFzb25hYmxlLgotICogPHAvPgotICogUkVVU0U6PGJyLz4KLSAqIGFuIGFydGlmYWN0IHdoaWNoIHlvdSBjYW4gcmV1c2UgZm9yIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uLgotICogaWYgaXQgaXNuJ3QgbWFya2VkIGFzIEFQSSBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotICogaG93ZXZlciwgd2UgdHJ5IHRvIGtlZXAgaXQgYXMgc3RhYmxlIGFzIHBvc3NpYmxlIGFuZCByZWFzb25hYmxlLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLXB1YmxpYyBlbnVtIFVzYWdlQ2F0ZWdvcnkKLXsKLSAgICBBUEksCi0gICAgSU5URVJOQUwsCi0gICAgQ1VTVE9NSVpBQkxFLAotICAgIFJFVVNFCi19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTY1YjEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsNCi1pbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ2xhc3NVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENsYXNzVXRpbHMuY2xhc3MpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIHRyeVRvTG9hZENsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGxvYWRDbGFzc0Zvck5hbWUobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGxvYWRDbGFzc0Zvck5hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIFRyeSBXZWJBcHAgQ2xhc3NMb2FkZXIgZmlyc3QNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwDQotICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWdub3JlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIGZhbGxiYWNrOiBUcnkgQ2xhc3NMb2FkZXIgZm9yIENsYXNzVXRpbHMgKGkuZS4gdGhlIG15ZmFjZXMuamFyIGxpYikNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwDQotICAgICAgICAgICAgICAgIENsYXNzVXRpbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnN0YW50aWF0ZUNsYXNzKENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0Q2xhc3MubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoU3RyaW5nIGNsYXNzTmFtZSkNCi0gICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsb2FkQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKYXJWZXJzaW9uKENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY2xhc3NGaWxlUGF0aCA9IHRhcmdldENsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSArICIuY2xhc3MiOw0KLSAgICAgICAgU3RyaW5nIG1hbmlmZXN0RmlsZVBhdGggPSAiL01FVEEtSU5GL01BTklGRVNULk1GIjsNCi0NCi0gICAgICAgIFN0cmluZyBjbGFzc0xvY2F0aW9uID0gdGFyZ2V0Q2xhc3MuZ2V0UmVzb3VyY2UodGFyZ2V0Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi5jbGFzcyIpLnRvU3RyaW5nKCk7DQotICAgICAgICBTdHJpbmcgbWFuaWZlc3RGaWxlTG9jYXRpb24gPSBjbGFzc0xvY2F0aW9uDQotICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgY2xhc3NMb2NhdGlvbi5pbmRleE9mKGNsYXNzRmlsZVBhdGgpIC0gMSkgKyBtYW5pZmVzdEZpbGVQYXRoOw0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBNYW5pZmVzdChuZXcgVVJMKG1hbmlmZXN0RmlsZUxvY2F0aW9uKS5vcGVuU3RyZWFtKCkpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5nZXRWYWx1ZShBdHRyaWJ1dGVzLk5hbWUuSU1QTEVNRU5UQVRJT05fVkVSU0lPTik7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKExPRy5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTE9HLnRyYWNlKCJjb3VsZG4ndCBsb2FkIHZlcnNpb24gb2YgamFyIGZpbGUgd2hpY2ggY29udGFpbnMgIiArIHRhcmdldENsYXNzLmdldE5hbWUoKSwgdCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGU3MzkyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkVMSGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5BYnN0cmFjdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5OYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY2VzTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPR0dFUiA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEV4dFZhbFV0aWxzLmNsYXNzKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX1JFUVVJUkVEID0gImphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUlucHV0LlJFUVVJUkVEIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX1JFUVVJUkVEX0RFVEFJTCA9ICJqYXZheC5mYWNlcy5jb21wb25lbnQuVUlJbnB1dC5SRVFVSVJFRF9kZXRhaWwiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfTUFYSU1VTSA9ICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yLk1BWElNVU0iOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwgPSAiamF2YXguZmFjZXMudmFsaWRhdG9yLkxlbmd0aFZhbGlkYXRvci5NQVhJTVVNX2RldGFpbCI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nRmFjdG9yeTxTdHJpbmcsIFZhbGlkYXRpb25TdHJhdGVneT4pIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUobWV0YURhdGFLZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIE5hbWVNYXBwZXI8U3RyaW5nPiBtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5yZWdpc3RlcihtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlcmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gbWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZXJlZ2lzdGVyKG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZW55TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVueShtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckZvclZhbGlkYXRpb25TdHJhdGVneShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWV0YURhdGFUcmFuc2Zvcm1lcj4pIEV4dFZhbENvbnRleHQNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5yZWdpc3Rlcih2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlcmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVueVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlbnkodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKCkNCi0gICAgew0KLSAgICAgICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksIENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICB7DQotICAgICAgICBmb3IoQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRDb21wb25lbnRJbml0aWFsaXplcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjb21wb25lbnRJbml0aWFsaXplci5jb25maWd1cmVDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOw0KLQ0KLSAgICAgICAgZm9yKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCF2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJUaHJvd2luZygNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uLCB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3IoZmluYWwgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgTWV0YURhdGFFeHRyYWN0b3IoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcmVzdWx0ID0gbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIG9iamVjdCk7DQotICAgICAgICAgICAgICAgIGZvcihNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciA6DQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmFmdGVyRXh0cmFjdGluZyhyZXN1bHQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VSZXNvbHZlciBnZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1lc3NhZ2VSZXNvbHZlcj4pRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgLmNyZWF0ZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAucmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZXJlZ2lzdGVyKHZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVueVZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVueSh2YWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBFTEhlbHBlciBnZXRFTEhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRUxfSEVMUEVSX0ZBQ1RPUlksIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmNsYXNzKS5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY2VzTWVzc2FnZSBjcmVhdGVGYWNlc01lc3NhZ2UoU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcmVhdGVGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjZXNNZXNzYWdlIGNyZWF0ZUZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkZBQ0VTX01FU1NBR0VfRkFDVE9SWSwgRmFjZXNNZXNzYWdlRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZShzZXZlcml0eSwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY2VzTWVzc2FnZSBjb252ZXJ0RmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRkFDRVNfTUVTU0FHRV9GQUNUT1JZLCBGYWNlc01lc3NhZ2VGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuY29udmVydChmYWNlc01lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHlEZXRhaWxzIGNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgYmFzZU9iamVjdDsNCi0gICAgICAgIGlmKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKHRhcmdldEV4cHJlc3Npb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmJlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgU3RyaW5nIGV4cHJlc3Npb24gPSB2YmUuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgICAgIGJhc2VPYmplY3QgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YmUuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURldGFpbHMoDQotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uc3Vic3RyaW5nKDIsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKSwgYmFzZU9iamVjdCwgdmJlLmdldFByb3BlcnR5KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIG9yaWdpbmFsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eSgNCi0gICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgU3RyaW5nIG5ld0Jhc2VLZXkgPSBvcmlnaW5hbC5nZXRLZXkoKS5zdWJzdHJpbmcoMCwgb3JpZ2luYWwuZ2V0S2V5KCkubGFzdEluZGV4T2YoIi4iKSArIDEpOw0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IG5ld0Jhc2VLZXkgKyB0YXJnZXRFeHByZXNzaW9uOw0KLQ0KLSAgICAgICAgYmFzZU9iamVjdCA9IFJlZmxlY3Rpb25VdGlscy5nZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKG9yaWdpbmFsLmdldEJhc2VPYmplY3QoKSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICBuZXdLZXksIGJhc2VPYmplY3QsIHRhcmdldEV4cHJlc3Npb24uc3Vic3RyaW5nKHRhcmdldEV4cHJlc3Npb24ubGFzdEluZGV4T2YoIi4iKSArIDEsDQotICAgICAgICAgICAgdGFyZ2V0RXhwcmVzc2lvbi5sZW5ndGgoKSkpOw0KLSAgICB9DQotDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb1BsYWNlTGFiZWwoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgU3RyaW5nIGxhYmVsLCBpbnQgaW5kZXgpDQotICAgIHsNCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLmNvbnRhaW5zKCJ7IiArIGluZGV4ICsgIn0iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLnJlcGxhY2UoInsiICsgaW5kZXggKyAifSIsIGxhYmVsKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkuY29udGFpbnMoInsiICsgaW5kZXggKyAifSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNNZXNzYWdlLmdldERldGFpbCgpLnJlcGxhY2UoInsiICsgaW5kZXggKyAifSIsIGxhYmVsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VXaXRoRGVmYXVsdE1heGltdW1NZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIGludCBtYXhMZW5ndGgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZSA9IEpzZlV0aWxzLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfTUFYSU1VTSk7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZTsNCi0NCi0gICAgICAgIC8vdXNlIHRyeS9jYXRjaCBmb3IgZWFzaWVyIHN5bmMgYmV0d2VlbiB0cnVuay9icmFuY2gNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEpzZlV0aWxzLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IEpzZlV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vanNmIDEuMiBkb2Vzbid0IGhhdmUgYSBkZXRhaWwgbWVzc2FnZQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2UgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZS5yZXBsYWNlKCJ7MH0iLCAiIiArIG1heExlbmd0aCk7DQotICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsLnJlcGxhY2UoInswfSIsICIiICsgbWF4TGVuZ3RoKTsNCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGZhY2VzUmVxdWlyZWRNZXNzYWdlKTsNCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwpOw0KLSAgICB9DQotDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBsYWNlV2l0aERlZmF1bHRSZXF1aXJlZE1lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGZhY2VzUmVxdWlyZWRNZXNzYWdlID0gSnNmVXRpbHMuZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhKQVZBWF9GQUNFU19SRVFVSVJFRCk7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZTsNCi0NCi0gICAgICAgIC8vdXNlIHRyeS9jYXRjaCBmb3IgZWFzaWVyIHN5bmMgYmV0d2VlbiB0cnVuay9icmFuY2gNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEpzZlV0aWxzLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfUkVRVUlSRURfREVUQUlMKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBKc2ZVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkuZ2V0U3RyaW5nKEpBVkFYX0ZBQ0VTX1JFUVVJUkVEX0RFVEFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9qc2YgMS4yIGRvZXNuJ3QgaGF2ZSBhIGRldGFpbCBtZXNzYWdlDQotICAgICAgICB9DQotDQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc1JlcXVpcmVkTWVzc2FnZSk7DQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTa2lwYWJsZVZhbGlkYXRpb25TdHJhdGVneShDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRDbGFzcyA6IEV4dFZhbFV0aWxzLmdldFNraXBWYWxpZGF0aW9uU3VwcG9ydENsYXNzTGlzdCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLmlzU2tpcFZhbGlkYXRpb25TdXBwb3J0ZWQoY3VycmVudENsYXNzLCB0YXJnZXRDbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PENsYXNzPiBnZXRTa2lwVmFsaWRhdGlvblN1cHBvcnRDbGFzc0xpc3QoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBzdGF0aWNDb25maWd1cmF0aW9uTGlzdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5TS0lQX1ZBTElEQVRJT05fU1VQUE9SVF9DT05GSUcpOw0KLQ0KLSAgICAgICAgTGlzdDxDbGFzcz4gbWFya2VyTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3M7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gY3VycmVudEVudHJ5IDogc3RhdGljQ29uZmlndXJhdGlvbkxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gY3VycmVudENvbmZpZ3VyYXRpb25FbnRyeSA6IGN1cnJlbnRFbnRyeS5nZXRNYXBwaW5nKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShjdXJyZW50Q29uZmlndXJhdGlvbkVudHJ5LmdldFRhcmdldCgpKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYoY3VycmVudENsYXNzICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1hcmtlckxpc3QuYWRkKGN1cnJlbnRDbGFzcyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihMT0dHRVIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi53YXJuKCJjb25maWd1cmF0aW9uIGVudHJ5IHByb3ZpZGVzIGFuIGludmFsaWQgZW50cnk6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY3VycmVudENvbmZpZ3VyYXRpb25FbnRyeS5nZXRUYXJnZXQoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWFya2VyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTa2lwVmFsaWRhdGlvblN1cHBvcnRlZChDbGFzcyBjdXJyZW50Q2xhc3MsIENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZihjdXJyZW50Q2xhc3MuaXNBbm5vdGF0aW9uKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGFyZ2V0Q2xhc3MuaXNBbm5vdGF0aW9uUHJlc2VudChjdXJyZW50Q2xhc3MpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRhcmdldENsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvSnNmVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwNDA1NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZTsKLWltcG9ydCBqYXZheC5mYWNlcy5saWZlY3ljbGUuTGlmZWN5Y2xlRmFjdG9yeTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBKc2ZVdGlscwotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcihQaGFzZUxpc3RlbmVyIHBoYXNlTGlzdGVuZXIpCi0gICAgewotICAgICAgICBMaWZlY3ljbGVGYWN0b3J5IGxpZmVjeWNsZUZhY3RvcnkgPSAoTGlmZWN5Y2xlRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRmFjdG9yeUZpbmRlci5MSUZFQ1lDTEVfRkFDVE9SWSk7Ci0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRJZDsKLSAgICAgICAgTGlmZWN5Y2xlIGN1cnJlbnRMaWZlY3ljbGU7Ci0gICAgICAgIEl0ZXJhdG9yIGxpZmVjeWNsZUlkcyA9IGxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlSWRzKCk7Ci0gICAgICAgIHdoaWxlIChsaWZlY3ljbGVJZHMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjdXJyZW50SWQgPSAoU3RyaW5nKSBsaWZlY3ljbGVJZHMubmV4dCgpOwotICAgICAgICAgICAgY3VycmVudExpZmVjeWNsZSA9IGxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlKGN1cnJlbnRJZCk7Ci0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlLnJlbW92ZVBoYXNlTGlzdGVuZXIocGhhc2VMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKQotICAgIHsKLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIGJ1bmRsZU5hbWUgPSBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5nZXRNZXNzYWdlQnVuZGxlKCk7Ci0KLSAgICAgICAgaWYoYnVuZGxlTmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBidW5kbGVOYW1lID0gRmFjZXNNZXNzYWdlLkZBQ0VTX01FU1NBR0VTOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShidW5kbGVOYW1lLCBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEgYi9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9SZWZsZWN0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4N2Y3ZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9SZWZsZWN0aW9uVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFJlZmxlY3Rpb25VdGlscwotewotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIHRyeVRvR2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0TWV0aG9kTmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0dldE1ldGhvZCh0YXJnZXRDbGFzcywgdGFyZ2V0TWV0aG9kTmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgdHJ5VG9HZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lLCBDbGFzcy4uLiBwYXJhbWV0ZXJUeXBlcykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0TWV0aG9kKHRhcmdldENsYXNzLCB0YXJnZXRNZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0TWV0aG9kTmFtZSkKLSAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldE1ldGhvZCh0YXJnZXRDbGFzcywgdGFyZ2V0TWV0aG9kTmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0TWV0aG9kTmFtZSwgQ2xhc3MuLi4gcGFyYW1ldGVyVHlwZXMpCi0gICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IHRhcmdldENsYXNzOwotICAgICAgICBNZXRob2QgdGFyZ2V0TWV0aG9kID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlICghT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY3VycmVudENsYXNzLmdldE5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IGN1cnJlbnRDbGFzcy5nZXREZWNsYXJlZE1ldGhvZCh0YXJnZXRNZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudENsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKENsYXNzIGN1cnJlbnRJbnRlcmZhY2UgOiB0YXJnZXRDbGFzcy5nZXRJbnRlcmZhY2VzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudEludGVyZmFjZTsKLQotICAgICAgICAgICAgICAgIHdoaWxlIChjdXJyZW50Q2xhc3MgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNZXRob2QgPSBjdXJyZW50Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QodGFyZ2V0TWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGFyZ2V0TWV0aG9kICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0YXJnZXRNZXRob2Q7Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKCJ0aGVyZSBpcyBubyBtZXRob2Qgd2l0aCB0aGUgbmFtZSAnIiArIHRhcmdldE1ldGhvZE5hbWUgKyAiJyIgKwotICAgICAgICAgICAgICAgICIgY2xhc3M6ICIgKyB0YXJnZXRDbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ5VG9JbnZva2VNZXRob2QodGFyZ2V0LCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ5VG9JbnZva2VNZXRob2RPZkNsYXNzKHRhcmdldCwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbnZva2VNZXRob2RPZkNsYXNzKHRhcmdldCwgbWV0aG9kLCBhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0Lm5ld0luc3RhbmNlKCksIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdC4uLiBhcmdzKQotICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQubmV3SW5zdGFuY2UoKSwgbWV0aG9kLCBhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kLCBPYmplY3QuLi4gYXJncykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldCwgbWV0aG9kLCBhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0LCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kLCBPYmplY3QuLi4gYXJncykKLSAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICByZXR1cm4gbWV0aG9kLmludm9rZSh0YXJnZXQsIGFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEJhc2VPZlByb3BlcnR5Q2hhaW4oT2JqZWN0IGJhc2VPYmplY3QsIFN0cmluZyBwcm9wZXJ0eUNoYWluKQotICAgIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocHJvcGVydHlDaGFpbiwgIi4iKTsKLQotICAgICAgICBPYmplY3QgY3VycmVudEJhc2UgPSBiYXNlT2JqZWN0OwotICAgICAgICBTdHJpbmcgY3VycmVudFByb3BlcnR5OwotICAgICAgICBNZXRob2QgY3VycmVudE1ldGhvZDsKLQotICAgICAgICB3aGlsZSh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjdXJyZW50UHJvcGVydHkgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0KLSAgICAgICAgICAgIC8vaWdub3JlIHRoZSBsYXN0IHByb3BlcnR5Ci0gICAgICAgICAgICBpZighdG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9ubyBpcyAtIGl0J3Mgb25seSBwb3NzaWJsZSBhdCBwcm9wZXJ0aWVzIG5vdCBhdCBiZWFuIGxldmVsCi0gICAgICAgICAgICBjdXJyZW50TWV0aG9kID0gdHJ5VG9HZXRNZXRob2QoY3VycmVudEJhc2UuZ2V0Q2xhc3MoKSwKLSAgICAgICAgICAgICAgICAiZ2V0IiArIGN1cnJlbnRQcm9wZXJ0eS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eS5zdWJzdHJpbmcoMSwgY3VycmVudFByb3BlcnR5Lmxlbmd0aCgpKSk7Ci0gICAgICAgICAgICBjdXJyZW50QmFzZSA9IHRyeVRvSW52b2tlTWV0aG9kKGN1cnJlbnRCYXNlLCBjdXJyZW50TWV0aG9kKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjdXJyZW50QmFzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhIGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvV2ViWG1sVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFiMjE3Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBXZWJYbWxVdGlscw0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW5pdFBhcmFtZXRlcihTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcihFeHRWYWxJbmZvcm1hdGlvbi5XRUJYTUxfUEFSQU1fUFJFRklYICsgIi4iICsga2V5KTsNCi0gICAgICAgIHJldHVybiAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZS5yZXBsYWNlKCIgIiwgIiIpLnRyaW0oKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODkzYmZmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMjAxZDIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9jb3JlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSBNb2R1bGUNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSBNb2R1bGUgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlIE1vZHVsZSBwcm92aWRlcyBhbiBleHRlbnNpYmxlIHZhbGlkYXRpb24gcGxhdGZvcm0gdG8gaW1wbGVtZW50IHZhbGlkYXRpb24gYmFzZWQgb24gbWV0YS1kYXRhLg0KLSAgICBCYXNlZCBvbiB0aGlzIG1vZHVsZSBpdCBpcyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgdmFsaWRhdGlvbiBtb2R1bGVzLg0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS4xLnggYW5kIEpTRiAxLjIueC4gQm90aCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbCBiL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg5NGJkMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2Fzc2VtYmx5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgRXhhbXBsZXMgQXNzZW1ibHk8L25hbWU+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWV4YW1wbGVzLWFzc2VtYmx5MTI8L2FydGlmYWN0SWQ+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS4yPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGFncy8xXzFfMjwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8yPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90YWdzLzFfMV8yPC91cmw+Ci0gICAgPC9zY20+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5kZXBlbmRlbmN5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LXdhcjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd2FyPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktc3JjPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fd29ybGQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXZhLXNvdXJjZTwvdHlwZT4gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmVhdHVyZS1zZXRfMDE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXZhLXNvdXJjZTwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc3JjPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPiAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBFWEVDVVRFIG12biBwYWNrYWdlIHRvIGdlbmVyYXRlIGFzc2VtYmx5IGZpbGVzIC0tPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9zcmM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmFzc2VtYmx5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4gICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwtZXhhbXBsZXMtJHtwcm9qZWN0LnZlcnNpb259LXNyYzwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfYmluPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hc3NlbWJseTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0JICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+ICAgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWw8L2Rlc2NyaXB0b3I+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsLWV4YW1wbGVzLSR7cHJvamVjdC52ZXJzaW9ufTwvZmluYWxOYW1lPgotCSAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd29yazwvd29ya0RpcmVjdG9yeT4KLQkgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0JICAgIAotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+d2Fnb24tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aWQ+bXlmYWNlcy1uaWdodGx5LWJ1aWxkczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vbWlub3RhdXIuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvYnVpbGRzL215ZmFjZXMvbmlnaHRseTwvdXJsPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9pbnB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICA8L3BsdWdpbnM+Ci0KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NGUxYTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IKLUNvcHlyaWdodCAyMDA3LTIwMDkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3BvbS54bWwgYi9wcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MmQ0YmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWZlYXR1cmUtc2V0XzAxPC9hcnRpZmFjdElkPgotCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBmZWF0dXJlLXNldCAwMTwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjEuMjwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4xLjI8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uZmFjZWxldHM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtZmFjZWxldHM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMTQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5lbC1pbXBsPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRvbWFoYXdrPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dG9tYWhhd2s8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuNjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg5M2JmZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEgYi9wcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmFlNDFlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJc1R5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLk5vdEVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi0NCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbDsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVGVtcG9yYWxUeXBlOw0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi1wdWJsaWMgY2xhc3MgUGVyc29uDQotew0KLSAgICBATGVuZ3RoKG1pbmltdW0gPSAyKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDIwKQ0KLSAgICBATm90RXF1YWxzKCJsYXN0TmFtZSIpDQotICAgIEBQYXR0ZXJuKCJbQS1aXVthLXpdKyIpDQotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsNCi0NCi0gICAgQExlbmd0aChtaW5pbXVtID0gMikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAyMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7DQotDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwKQ0KLSAgICBwcml2YXRlIFN0cmluZyByb2xlID0gInVzZXIiOw0KLQ0KLSAgICBARGF0ZUlzKHR5cGUgPSBEYXRlSXNUeXBlLmJlZm9yZSwgdmFsdWVPZiA9ICJmaW5hbEV4YW0iKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIEBUZW1wb3JhbChUZW1wb3JhbFR5cGUuREFURSkNCi0gICAgcHJpdmF0ZSBEYXRlIGJpcnRoZGF5Ow0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIEBUZW1wb3JhbChUZW1wb3JhbFR5cGUuREFURSkNCi0gICAgcHJpdmF0ZSBEYXRlIGZpbmFsRXhhbTsNCi0NCi0gICAgQExlbmd0aChtaW5pbXVtID0gMikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmlja05hbWU7DQotDQotICAgIEBMZW5ndGgobWluaW11bSA9IDYpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gNjApDQotICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIHByaXZhdGUgaW50IG51bWJlck9mU2libGluZ3M7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByb2xlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFJvbGUoU3RyaW5nIHJvbGUpDQotICAgIHsNCi0gICAgICAgIHRoaXMucm9sZSA9IHJvbGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0QmlydGhkYXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmlydGhkYXk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0QmlydGhkYXkoRGF0ZSBiaXJ0aGRheSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5iaXJ0aGRheSA9IGJpcnRoZGF5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldEZpbmFsRXhhbSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmaW5hbEV4YW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RmluYWxFeGFtKERhdGUgZmluYWxFeGFtKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpbmFsRXhhbSA9IGZpbmFsRXhhbTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5pY2tOYW1lKFN0cmluZyBuaWNrTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uaWNrTmFtZSA9IG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNpYmxpbmdzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG51bWJlck9mU2libGluZ3M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyT2ZTaWJsaW5ncyhpbnQgbnVtYmVyT2ZTaWJsaW5ncykNCi0gICAgew0KLSAgICAgICAgdGhpcy5udW1iZXJPZlNpYmxpbmdzID0gbnVtYmVyT2ZTaWJsaW5nczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YSBiL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmUxNGZiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmd1aS5iZWFuczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluLlBlcnNvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5Ob3RFcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTG9uZ1JhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmN1c3RvbS5lbWFpbHZhbGlkYXRvci5FbWFpbFZhbGlkYXRvcjsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uUGFnZQ0KLXsNCi0NCi0gICAgLy90aGUgb2xkIHBhc3N3b3JkIG9mIHRoZSBwZXJzb24gaXNuJ3QgdXNlZCB3aXRoaW4gdGhlIHBhZ2UNCi0gICAgLy8tPiB2YWxpZGF0ZSB3aXRoIHZhbHVlIG9mIHRoZSBtb2RlbA0KLSAgICBAU2tpcFZhbGlkYXRpb24oIiN7cGVyc29uLnJvbGUgZXEgJ2FkbWluJ30iKQ0KLSAgICBAUmVxdWlyZWQNCi0gICAgQEVxdWFscygicGVyc29uLnBhc3N3b3JkIikNCi0gICAgQE5vdEVxdWFscygicGFzc3dvcmQiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBvbGRQYXNzd29yZDsNCi0NCi0gICAgQEVxdWFscygicGFzc3dvcmRSZXBlYXRlZCIpDQotICAgIC8vY29tYmluZSBndWkgcmVsYXRlZCBhbm5vdGF0aW9ucyB3aXRoIHRoZSBhbm5vYXRpb25zIG9mIHRoZSBkb21haW4gbW9kZWwNCi0gICAgQEpvaW5WYWxpZGF0aW9uKHZhbHVlID0gIiN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ucGFzc3dvcmR9IikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7DQotDQotICAgIEBSZXF1aXJlZCh2YWxpZGF0aW9uRXJyb3JNc2dLZXkgPSAicmVwZWF0ZWRfcGFzc3dvcmRfcmVxdWlyZWQiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZFJlcGVhdGVkOw0KLQ0KLSAgICAvL3VzZSAje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLm5pY2tOYW1lfSwgI3twZXJzb24ubmlja05hbWV9DQotICAgIC8vdXNlIHJlZ2lzdHJhdGlvblBhZ2UgdG8gZGlzcGxheSB0aGUgc2Vjb25kIGVycm9yIG1lc3NhZ2UgYXQgb2xkIG5pY2tuYW1lDQotICAgIC8vb3IgbG9jYWwgcHJvcGVydHkgY2hhaW5pbmcgKHRvIGF2b2lkIHRoZSB1c2FnZSBvZiB0aGUgYmVhbiBuYW1lKSAtIGxpa2U6DQotICAgIEBTa2lwVmFsaWRhdGlvbigiI3twZXJzb24ucm9sZSBlcSAnYWRtaW4nfSIpDQotICAgIEBOb3RFcXVhbHMoInBlcnNvbi5uaWNrTmFtZSIpDQotICAgIEBKb2luVmFsaWRhdGlvbigicGVyc29uLm5pY2tOYW1lIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmV3Tmlja05hbWU7DQotDQotICAgIHByaXZhdGUgUGVyc29uIHBlcnNvbjsNCi0NCi0gICAgcHVibGljIFN0cmluZyBmaW5pc2goKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXRQYXNzd29yZCh0aGlzLnBhc3N3b3JkKTsNCi0gICAgICAgIHJldHVybiAiaG9tZSI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyB1cGRhdGVOaWNrTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldE5pY2tOYW1lKHRoaXMubmV3Tmlja05hbWUpOw0KLSAgICAgICAgcmV0dXJuICJob21lIjsNCi0gICAgfQ0KLQ0KLSAgICAvL2p1c3QgYSBxdWljayBpbGx1c3RyYXRpb24gb2Ygc2tpcFZhbGlkYXRpb24NCi0gICAgcHVibGljIFN0cmluZyBzd2l0Y2hNb2RlKCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRSb2xlID0gdGhpcy5wZXJzb24uZ2V0Um9sZSgpOw0KLQ0KLSAgICAgICAgaWYoY3VycmVudFJvbGUuZXF1YWxzKCJhZG1pbiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMucGVyc29uLnNldFJvbGUoInVzZXIiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnBlcnNvbi5zZXRSb2xlKCJhZG1pbiIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuICIiOw0KLSAgICB9DQotDQotICAgIEBKb2luVmFsaWRhdGlvbigicGVyc29uLmVtYWlsIikNCi0gICAgQFZhbGlkYXRvcihFbWFpbFZhbGlkYXRvci5jbGFzcykNCi0gICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbi5nZXRFbWFpbCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKFN0cmluZyBlbWFpbCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0RW1haWwoZW1haWwpOw0KLSAgICB9DQotDQotICAgIEBKb2luVmFsaWRhdGlvbigiI3twZXJzb24ubnVtYmVyT2ZTaWJsaW5nc30iKQ0KLSAgICBATG9uZ1JhbmdlKG1heGltdW0gPSAyMCkNCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNpYmxpbmdzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uLmdldE51bWJlck9mU2libGluZ3MoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXJPZlNpYmxpbmdzKGludCBudW1iZXJPZlNpYmxpbmdzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXROdW1iZXJPZlNpYmxpbmdzKG51bWJlck9mU2libGluZ3MpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRPbGRQYXNzd29yZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBvbGRQYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRPbGRQYXNzd29yZChTdHJpbmcgb2xkUGFzc3dvcmQpDQotICAgIHsNCi0gICAgICAgIHRoaXMub2xkUGFzc3dvcmQgPSBvbGRQYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmRSZXBlYXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZFJlcGVhdGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkUmVwZWF0ZWQoU3RyaW5nIHBhc3N3b3JkUmVwZWF0ZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmRSZXBlYXRlZCA9IHBhc3N3b3JkUmVwZWF0ZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBlcnNvbiBnZXRQZXJzb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGVyc29uOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNvbihQZXJzb24gcGVyc29uKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbiA9IHBlcnNvbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5ld05pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ld05pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5ld05pY2tOYW1lKFN0cmluZyBuZXdOaWNrTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uZXdOaWNrTmFtZSA9IG5ld05pY2tOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg5M2JmZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbCBiL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODRkNjQ4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIgotICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIKLSAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiCi0gICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCIKLSAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4KLQotPHVpOmNvbXBvc2l0aW9uPgotICAgIDx0cjpwYW5lbEZvcm1MYXlvdXQ+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibmljayBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvblsgJ25pY2tOYW1lJyBdfSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJlLW1haWwiIHZhbHVlPSIje2JlYW4uZW1haWx9Ii8+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0iZmlyc3QgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb24uZmlyc3ROYW1lfSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJsYXN0IG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uLmxhc3ROYW1lfSIvPgotICAgICAgICA8dHI6aW5wdXREYXRlIGxhYmVsPSJiaXJ0aGRheSIgdmFsdWU9IiN7YmVhbi5wZXJzb24uYmlydGhkYXl9Ij4KLSAgICAgICAgICAgIDx0cjpjb252ZXJ0RGF0ZVRpbWUgdHlwZT0iZGF0ZSIgcGF0dGVybj0iZGQuTU0ueXl5eSIvPgotICAgICAgICA8L3RyOmlucHV0RGF0ZT4KLSAgICAgICAgPHRyOmlucHV0RGF0ZSBsYWJlbD0iZmluYWwgZXhhbSIgdmFsdWU9IiN7YmVhbi5wZXJzb24uZmluYWxFeGFtfSI+Ci0gICAgICAgICAgICA8dHI6Y29udmVydERhdGVUaW1lIHR5cGU9ImRhdGUiIHBhdHRlcm49ImRkLk1NLnl5eXkiLz4KLSAgICAgICAgPC90cjppbnB1dERhdGU+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibnVtYmVyIG9mIHNpYmxpbmdzIiB2YWx1ZT0iI3tiZWFuLm51bWJlck9mU2libGluZ3N9Ii8+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0icGFzc3dvcmQiIHZhbHVlPSIje2JlYW4ucGFzc3dvcmR9IiBzZWNyZXQ9InRydWUiLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0icmUtZW50ZXIgcGFzc3dvcmQiIHZhbHVlPSIje2JlYW4ucGFzc3dvcmRSZXBlYXRlZH0iIHNlY3JldD0idHJ1ZSIvPgotCi0gICAgPC90cjpwYW5lbEZvcm1MYXlvdXQ+Ci08L3VpOmNvbXBvc2l0aW9uPgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sIGIvcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWYxYWEwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPgotCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBoZWxsbyB3b3JsZDwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjEuMjwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4xLjI8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+ZWwtaW1wbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OTNiZmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YSBiL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvZG9tYWluL1BlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmQ0YTllLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvZG9tYWluL1BlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLmRvbWFpbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7Ci0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47Ci0KLXB1YmxpYyBjbGFzcyBQZXJzb24KLXsKLSAgICAvL2hlbGxvIHdvcmxkIGRlbW8KLSAgICBAUmVxdWlyZWQKLSAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7Ci0KLSAgICAvL2RlbW8gZm9yIGpwYSBiYXNlZCB2YWxpZGF0aW9uIHN1cHBvcnQKLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwIC8qLi4uKi8pCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbGFzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg5M2JmZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcCBiL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTA4ZTAyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgICA8Zjp2aWV3PgotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPgotICAgICAgICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMyI+Ci0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJmaXJzdF9uYW1lIiB2YWx1ZT0iRmlyc3QgbmFtZToiLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9ImZpcnN0X25hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQucGVyc29uLmZpcnN0TmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0iZmlyc3RfbmFtZSIgc2hvd1N1bW1hcnk9ImZhbHNlIiBzaG93RGV0YWlsPSJ0cnVlIi8+Ci0KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9Imxhc3RfbmFtZSIgdmFsdWU9Ikxhc3QgbmFtZToiLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9Imxhc3RfbmFtZSIgdmFsdWU9IiN7aGVsbG9Xb3JsZC5wZXJzb24ubGFzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9Imxhc3RfbmFtZSIgc2hvd1N1bW1hcnk9ImZhbHNlIiBzaG93RGV0YWlsPSJ0cnVlIi8+Ci0KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJQcmVzcyBtZSIgYWN0aW9uPSIje2hlbGxvV29ybGQuc2VuZH0iLz4KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4KLSAgICAgICAgICAgICAgPC9oOnBhbmVsR3JpZD4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICA8L2Y6dmlldz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL2V4YW1wbGVzL3BvbS54bWwgYi9wcmVwYXJlLzFfMV8yL2V4YW1wbGVzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNTMwYjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi9leGFtcGxlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBwcm9qZWN0PC9uYW1lPgotICAgIDx2ZXJzaW9uPjEuMS4yPC92ZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS4yPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGFncy8xXzFfMjwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8yPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90YWdzLzFfMV8yPC91cmw+Ci0gICAgPC9zY20+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tVGhpcyBwbHVnaW4gYWxsb3dzIHRvIHJ1biB0aGUgZXhhbXBsZSB1c2luZyBtdm4gamV0dHk6cnVuIC0tPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpldHR5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj42LjEuODwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+MTA8L3NjYW5JbnRlcnZhbFNlY29uZHM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi0gICAgPG1vZHVsZXM+Ci0gICAgICAgIDxtb2R1bGU+aGVsbG9fd29ybGQ8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5mZWF0dXJlLXNldF8wMTwvbW9kdWxlPgotICAgIDwvbW9kdWxlcz4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPCEtLSBUaGlzIHByb2ZpbGUgaXMgaW52b2tlZCBieSAtRHByZXBhcmVSZWxlYXNlPXRydWUuICBUaGlzIGFsbG93cyBtdm4gcmVsZWFzZTpwcmVwYXJlIHRvCi0gICAgICAgICAgICBydW4gc3VjY2Vzc2Z1bGx5IG9uIHRoZSBhc3NlbWJseSBwcm9qZWN0cy4gLS0+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPnByZXBhcmUtcmVsZWFzZTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPnByZXBhcmVSZWxlYXNlPC9uYW1lPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8bW9kdWxlcz4KLSAgICAgICAgICAgICAgICA8bW9kdWxlPmFzc2VtYmx5PC9tb2R1bGU+Ci0gICAgICAgICAgICA8L21vZHVsZXM+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZWxlYXNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+LURwcmVwYXJlUmVsZWFzZTwvYXJndW1lbnRzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLQotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8dHJpbmlkYWQudmVyc2lvbj4xLjAuNTwvdHJpbmlkYWQudmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3BhcmVudC9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzIvcGFyZW50L0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvcGFyZW50L0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3BhcmVudC9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMi9wYXJlbnQvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY0ZTFhOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3BhcmVudC9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcgotQ29weXJpZ2h0IDIwMDctMjAwOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvcGFyZW50L3BvbS54bWwgYi9wcmVwYXJlLzFfMV8yL3BhcmVudC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzJmYmYwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvcGFyZW50L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj42PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjEuMjwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFByb2plY3QgUGFyZW50PC9uYW1lPgotICAgIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExPC91cmw+Ci0KLSAgICA8aXNzdWVNYW5hZ2VtZW50PgotICAgICAgICA8c3lzdGVtPmppcmE8L3N5c3RlbT4KLSAgICAgICAgPHVybD5odHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvRVhUVkFMPC91cmw+Ci0gICAgPC9pc3N1ZU1hbmFnZW1lbnQ+Ci0KLSAgICA8Y2lNYW5hZ2VtZW50PgotICAgICAgICA8c3lzdGVtPmNvbnRpbnV1bTwvc3lzdGVtPgotICAgICAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLnpvbmVzLmFwYWNoZS5vcmc6ODA4MC9jb250aW51dW08L3VybD4KLSAgICAgICAgPG5vdGlmaWVycz4KLSAgICAgICAgICAgIDxub3RpZmllcj4KLSAgICAgICAgICAgICAgICA8dHlwZT5tYWlsPC90eXBlPgotICAgICAgICAgICAgICAgIDxzZW5kT25TdWNjZXNzPnRydWU8L3NlbmRPblN1Y2Nlc3M+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhZGRyZXNzPmNvbW1pdHNAbXlmYWNlcy5hcGFjaGUub3JnPC9hZGRyZXNzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvbm90aWZpZXI+Ci0gICAgICAgIDwvbm90aWZpZXJzPgotICAgIDwvY2lNYW5hZ2VtZW50PgotICAgIAotICAgIDxpbmNlcHRpb25ZZWFyPjIwMDg8L2luY2VwdGlvblllYXI+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+TUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLQotICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KLSAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+Ci0KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS0KLSAgICAgICAgICAgICAgICAgICAgLSBDb3B5IExJQ0VOU0UudHh0IGFuZCBOT1RJQ0UudHh0IHNvIHRoYXQgdGhleSBhcmUgaW5jbHVkZWQKLSAgICAgICAgICAgICAgICAgICAgLSBpbiB0aGUgLWphdmFkb2MgamFyIGZpbGUgZm9yIHRoZSBjb21wb25lbnQuCi0gICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+amF2YWRvYy5yZXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hcGlkb2NzL01FVEEtSU5GIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTElDRU5TRS50eHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTk9USUNFLnR4dCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmphdmFkb2Muc2l0ZS5jb3B5PC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5zaXRlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENvcHkgamF2YWRvYyB0byBhbm90aGVyIGRpcmVjdG9yeSwgdG8ga2VlcCBqYXZhZG9jIG9mIHByZXZpb3VzIHZlcnNpb25zIG9uIHNpdGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zaXRlL2FwaWRvY3MtJHtwcm9qZWN0LnZlcnNpb259IiBmYWlsb25lcnJvcj0iZmFsc2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc2l0ZS9hcGlkb2NzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgICAgLSBNYWtlIGEgY2hlY2tzdHlsZSB2aW9sYXRpb24gYSBjb21waWxlIGVycm9yLiBOb3RlIHRoYXQgaWYgYSBjb21waWxlIGVycm9yIG9jY3VycywKLSAgICAgICAgICAgICAgICAtIGZ1cnRoZXIgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRhcmdldC9zaXRlL2NoZWNrc3R5bGUuaHRtbCAocHJlc2VudCBldmVuIHdoZW4KLSAgICAgICAgICAgICAgICAtIGp1c3QgdGhlIGNvbXBpbGUgZ29hbCBhbmQgbm90IHRoZSBzaXRlIGdvYWwgaGFzIGJlZW4gcnVuKS4gTm90ZSBhbHNvIHRoYXQgY2hpbGQKLSAgICAgICAgICAgICAgICAtIHByb2plY3RzIG1heSByZWRlY2xhcmUgdGhpcyBwbHVnaW4gYW5kIHByb3ZpZGUgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MKLSAgICAgICAgICAgICAgICAtIHRvIHVzZSBkaWZmZXJlbnQgY2hlY2tzIChtb3JlIG9yIGxlc3Mgc3RyaWN0IHRoYW4gdGhlIGRlZmF1bHQpLgotICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD52ZXJpZnktc3R5bGU8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWdMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0YW5kYXJkLnhtbDwvY29uZmlnTG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxoZWFkZXJMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtaGVhZGVyLnR4dDwvaGVhZGVyTG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tIFNldCBjb21waWxlIHNvdXJjZSBhdCAxLjUsIHNpbmNlIHRoZSB0YXJnZXQgSlNGIGltcGwgaXMgMS4yIC0tPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvcHRpbWl6ZT5mYWxzZTwvb3B0aW1pemU+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+ICAgICAgICAgICAgCi0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi0gICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+bWF2ZW4yLXJlcG9zaXRvcnkuZGV2LmphdmEubmV0PC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkphdmEubmV0IFJlcG9zaXRvcnkgZm9yIE1hdmVuPC9uYW1lPgotICAgICAgICAgICAgPHVybD5odHRwOi8vZG93bmxvYWQuamF2YS5uZXQvbWF2ZW4vMS88L3VybD4KLSAgICAgICAgICAgIDxsYXlvdXQ+bGVnYWN5PC9sYXlvdXQ+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICA8L3JlcG9zaXRvcmllcz4KLQotICAgIDxyZXBvcnRpbmc+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tanhyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcmVwb3J0LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcG1kLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxydWxlc2V0cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxydWxlc2V0Pi9ydWxlc2V0cy9iYXNpYy54bWw8L3J1bGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvdW51c2VkY29kZS54bWw8L3J1bGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvcnVsZXNldHM+Ci0gICAgICAgICAgICAgICAgICAgIDxsaW5rWHJlZj50cnVlPC9saW5rWHJlZj4KLSAgICAgICAgICAgICAgICAgICAgPG1pbmltdW1Ub2tlbnM+MTAwPC9taW5pbXVtVG9rZW5zPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0SmRrPjEuNTwvdGFyZ2V0SmRrPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY2hlY2tzdHlsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlnTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdGFuZGFyZC54bWw8L2NvbmZpZ0xvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aGVhZGVyTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWhlYWRlci50eHQ8L2hlYWRlckxvY2F0aW9uPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9yZXBvcnRpbmc+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90YWdzLzFfMV8yPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzI8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RhZ3MvMV8xXzI8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgICAgICA8c25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICAgICAgPHVuaXF1ZVZlcnNpb24+ZmFsc2U8L3VuaXF1ZVZlcnNpb24+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLnNuYXBzaG90czwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgTWF2ZW4gU25hcHNob3QgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgPHNpdGU+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTE8L3VybD4KLSAgICAgICAgPC9zaXRlPgotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtYXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wZXJmb3JtUmVsZWFzZTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvY3M8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxqc2YudmVyc2lvbj4xLjEuNTwvanNmLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlLzFfMV8yL3BhcmVudC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODNjYTY3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSAtLS0tLS0NCi1PdmVydmlldw0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMQ0KLQ0KLSAgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgcHJvdmlkZXMgdmVyc2lvbnMgZm9yIEpTRiAxLjEgYW5kIDEuMg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvcGFyZW50L3NyYy9zaXRlL2FwdC9qYXZhZG9jLmFwdCBiL3ByZXBhcmUvMV8xXzIvcGFyZW50L3NyYy9zaXRlL2FwdC9qYXZhZG9jLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFiMTk1MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3BhcmVudC9zcmMvc2l0ZS9hcHQvamF2YWRvYy5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0gLS0tLS0tDQotSmF2YWRvYw0KLSAtLS0tLS0NCi0NCi1KYXZhZG9jDQotDQotICAgIEhlcmUgeW91IGNhbiBmaW5kIHRoZSBqYXZhZG9jIG9mIHByZXZpb3VzIGV4dHZhbCB2ZXJzaW9ucy4NCi0NCi0gICAgKiB7e3todHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvbXlmYWNlcy1leHR2YWwtY29yZS9hcGlkb2NzLTEuMS4xL2luZGV4Lmh0bWx9TXlmYWNlcyBFeHRWYWwgQ29yZSBWZXJzaW9uIDEuMS4xfX0NCi0NCi0gICAgKiB7e3todHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvdmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbi9hcGlkb2NzLTEuMS4xL2luZGV4Lmh0bWx9TXlmYWNlcyBFeHRWYWwgUHJvcGVydHkgVmFsaWRhdGlvbiBWZXJzaW9uIDEuMS4xfX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3BhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbCBiL3ByZXBhcmUvMV8xXzIvcGFyZW50L3NyYy9zaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTJhYmY2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvcGFyZW50L3NyYy9zaXRlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IG5hbWU9IkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIj4KLSAgPGJhbm5lckxlZnQ+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0VmFsPC9uYW1lPgotICAgIDxzcmM+aW1hZ2VzL2V4dHZhbF9sb2dvLnBuZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW5kZXguaHRtbDwvaHJlZj4KLSAgPC9iYW5uZXJMZWZ0PgotCi0gIDxiYW5uZXJSaWdodD4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlczwvbmFtZT4KLSAgICA8c3JjPmltZy9iYW5uZXJzL015RmFjZXNfbG9nby5qcGc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWw8L2hyZWY+Ci0gIDwvYmFubmVyUmlnaHQ+Ci0KLSAgPHB1Ymxpc2hEYXRlIGZvcm1hdD0iZGQgTU1NIHl5eXkiLz4KLQotICA8c2tpbj4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1zaXRlLXNraW48L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9za2luPgotCi0gIDxib2R5PgotICAgIDxsaW5rcz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSIgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJNeUZhY2VzIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkRvd25sb2FkIE15ZmFjZXMgRXh0VmFsIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Rvd25sb2FkLmh0bWwiLz4KLSAgICA8L2xpbmtzPgotCi0gICAgPG1lbnUgbmFtZT0iQXBhY2hlIE15RmFjZXMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9kb3dubG9hZC5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgbmFtZT0iQ29udGVudHMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9Ik1haW4gU2l0ZSIgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgPGl0ZW0gbmFtZT0iRXh0VmFsIGZvciBKU0YgMS4xIiAgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IkNvcmUgTW9kdWxlIiAgICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExL215ZmFjZXMtZXh0dmFsLWNvcmUvaW5kZXguaHRtbCIvPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJQcm9wZXJ0eSBWYWxpZGF0aW9uIiAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS92YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iVHJpbmlkYWQgU3VwcG9ydCIgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQvaW5kZXguaHRtbCIvPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJHZW5lcmljIFN1cHBvcnQiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS9jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0L2luZGV4Lmh0bWwiLz4KLSAgICAgICAgPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjIiICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2luZGV4Lmh0bWwiIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9ImR1bW15IiAgICAgICAgaHJlZj0iZHVtbXkiLz4KLSAgICAgICAgPC9pdGVtPgotICAgIDwvbWVudT4KLQkKLSAgICA8bWVudSBuYW1lPSJEb2N1bWVudGF0aW9uIj4KLSAgICAgIDxpdGVtIG5hbWU9Ildpa2kiICAgICAgICAgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9teWZhY2VzL0V4dGVuc2lvbnMvVmFsaWRhdG9yLyIvPgotICAgICAgPGl0ZW0gbmFtZT0iSmF2YWRvYyIgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvamF2YWRvYy5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgcmVmPSJyZXBvcnRzIi8+Ci0KLSAgICA8bWVudSBuYW1lPSJGb3VuZGF0aW9uIiBpbmhlcml0PSJib3R0b20iPgotICAgICAgPGl0ZW0gbmFtZT0iQVNGIiAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iIC8+Ci0gICAgICA8aXRlbSBuYW1lPSJTcG9uc29yc2hpcCIgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vc3BvbnNvcnNoaXAuaHRtbCIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlRoYW5rcyIgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi90aGFua3MuaHRtbCIgLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvcG9tLnhtbCBiL3ByZXBhcmUvMV8xXzIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdlZDc4My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtbW9kdWxlPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMS4yPC92ZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgTW9kdWxlPC9uYW1lPgotICAgIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExPC91cmw+Ci0gICAgCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzI8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzI8L3VybD4KLSAgICA8L3NjbT4gICAgCi0KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDx1bmlxdWVWZXJzaW9uPmZhbHNlPC91bmlxdWVWZXJzaW9uPgotICAgICAgICAgICAgPGlkPmFwYWNoZS5zbmFwc2hvdHM8L2lkPgotICAgICAgICAgICAgPG5hbWU+QXBhY2hlIE1hdmVuIFNuYXBzaG90IFJlcG9zaXRvcnk8L25hbWU+Ci0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4KLSAgICAgICAgPC9zbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgICAgIDxzaXRlPgotICAgICAgICAgICAgPGlkPmFwYWNoZS1zaXRlPC9pZD4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyPC91cmw+Ci0gICAgICAgIDwvc2l0ZT4KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0KLSAgICA8IS0tIFdBUk5JTkc6IERPIE5PVCBHRU5FUkFURSBTSVRFIEZST00gSEVSRSBESVJFQ1RMWQotICAgIFNpbmNlIHRoaXMgcHJvamVjdCBoYXMgYW4gYXN5bmMgcmVsZWFzZSBwcm9jZWR1cmUgKG5vdAotICAgIGFsbCBtb2R1bGVzIHNob3VsZCBiZSByZWxlYXNlZCBhdCBvbmNlKSwgdGhlIHBhcmVudCBwb20ueG1sIAotICAgIGlzIG5vdCB0aGlzICh0aGVyZSBpcyBhIG1vZHVsZSBmb3IgdGhhdCkuIFVzZSBtYXZlbiBzaXRlIAotICAgIHBsdWdpbiBoZXJlIGNhdXNlIHByb2JsZW1zIHdoZW4gdGhlIHNpdGUgaXMgZ2VuZXJhdGVkLgotICAgIFRoZSBwcm9jZWR1cmUgbXVzdCBleGVjdXRlIHNpdGUgY29tbW1hbmQgZmlyc3Qgb24gcGFyZW50IAotICAgIG1vZHVsZSBhbmQgdGhlbiBvbiBlYWNoIG1vZHVsZSBsaXN0ZWQgYmVsb3cuIAotICAgICAtLT4KLQotICAgIDxtb2R1bGVzPgotICAgICAgICA8bW9kdWxlPnBhcmVudDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmNvcmU8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT52YWxpZGF0aW9uLW1vZHVsZXM8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5jb21wb25lbnQtc3VwcG9ydDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmV4YW1wbGVzPC9tb2R1bGU+Ci0gICAgPC9tb2R1bGVzPgotCi0gICAgPHByb2ZpbGVzPgotICAgICAgICA8IS0tIFRoaXMgcHJvZmlsZSBpcyBpbnZva2VkIGJ5IC1EcHJlcGFyZVJlbGVhc2U9dHJ1ZS4gIFRoaXMgYWxsb3dzIG12biByZWxlYXNlOnByZXBhcmUgdG8KLSAgICAgICAgICAgIHJ1biBzdWNjZXNzZnVsbHkgb24gdGhlIGFzc2VtYmx5IHByb2plY3RzLiAtLT4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+cHJlcGFyZS1yZWxlYXNlPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+cHJlcGFyZVJlbGVhc2U8L25hbWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxtb2R1bGVzPgotICAgICAgICAgICAgICAgIDxtb2R1bGU+YXNzZW1ibHk8L21vZHVsZT4KLSAgICAgICAgICAgIDwvbW9kdWxlcz4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ3VtZW50cz4tRHByZXBhcmVSZWxlYXNlPC9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotICAgIAotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8anNmLnZlcnNpb24+MS4xLjU8L2pzZi52ZXJzaW9uPgotICAgIDwvcHJvcGVydGllcz4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wb20ueG1sIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIxZmI1OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFZhbGlkYXRpb24tTW9kdWxlczwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjEuMjwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjEuMjwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RhZ3MvMV8xXzI8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGFncy8xXzFfMjwvdXJsPgotICAgIDwvc2NtPgotCi0gICAgPG1vZHVsZXM+Ci0gICAgICAgIDxtb2R1bGU+cHJvcGVydHktdmFsaWRhdGlvbjwvbW9kdWxlPgotICAgICAgICA8IS0tbW9kdWxlPmJlYW4tdmFsaWRhdGlvbjwvbW9kdWxlLS0+Ci0gICAgPC9tb2R1bGVzPgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbCBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2YmU3Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFByb3BlcnR5LVZhbGlkYXRpb24tTW9kdWxlPC9uYW1lPgotICAgIDx2ZXJzaW9uPjEuMS4yPC92ZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS4yPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5wZXJzaXN0ZW5jZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnBlcnNpc3RlbmNlLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gVGVzdCBkZXBlbmRlbmNpZXMgLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQuanNwPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNwLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc2hhbGU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zaGFsZS10ZXN0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovQWJzdHJhY3QqLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9UZXN0VXRpbHMuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypCZWFuLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+ICAgICAgICAgICAgCi0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NTRiZjYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDDQotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMC8vRU4iDQotICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWZhY2VzY29uZmlnXzFfMS5kdGQiID4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08ZmFjZXMtY29uZmlnPg0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi0NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OTNiZmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYzQ4N2QuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0U2VjcmV0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZUxpc3Rib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZU1lbnU7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZVJhZGlvOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55Q2hlY2tib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlMaXN0Ym94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TWVudTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0YXJlYTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGNvbmZpZ3VyZVJlcXVpcmVkQXR0cmlidXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsKLSAgICAgICAgY29uZmlndXJlTWF4TGVuZ3RoQXR0cmlidXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVSZXF1aXJlZEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZighcHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKChCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCkpIHx8Ci0gICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpCi0gICAgICAgICAgICAmJgotICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhpc0NvbXBvbmVudFJlcXVpcmVkKHVpQ29tcG9uZW50KSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkgJiYKLSAgICAgICAgICAgICAgICFCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSkKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0VGV4dCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0U2VjcmV0IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lTGlzdGJveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZU1lbnUgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVSYWRpbyB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlDaGVja2JveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlMaXN0Ym94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueU1lbnUgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHRhcmVhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGlmIHRoZXJlIGlzIG5vIHNwZWNpYWwgYXR0cmlidXRlIGF0IHRoZSBjb21wb25lbnQgd2hpY2ggc2hvdWxkIG92ZXJydWxlCi0gICAgICogdGhlIGFubm90YXRlZCBwcm9wZXJ0eSByZXR1cm4gdHJ1ZSEKLSAgICAgKgotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjb21wb25lbnQgd2hpY2ggaW1wbGVtZW50cyB0aGUgRWRpdGFibGVWYWx1ZUhvbGRlciBpbnRlcmZhY2UKLSAgICAgKiBAcmV0dXJuIGZhbHNlIHRvIG92ZXJydWxlIHRoZSBhbm5vdGF0ZWQgcHJvcGVydHkgZS5nLiBpZiBjb21wb25lbnQgaXMgcmVhZG9ubHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQm9vbGVhbiBpc0NvbXBvbmVudFJlcXVpcmVkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc1JlYWRvbmx5IikpKTsKLSAgICAgICAgYm9vbGVhbiBpc0Rpc2FibGVkID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc0Rpc2FibGVkIikpKTsKLQotICAgICAgICByZXR1cm4gIShpc1JlYWRPbmx5IHx8IGlzRGlzYWJsZWQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZU1heExlbmd0aEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKTsKLQotICAgICAgICAgICAgaWYoIShtYXhMZW5ndGggaW5zdGFuY2VvZiBJbnRlZ2VyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSHRtbElucHV0VGV4dCBodG1sSW5wdXRUZXh0ID0gKEh0bWxJbnB1dFRleHQpdWlDb21wb25lbnQ7Ci0gICAgICAgICAgICAgICAgaHRtbElucHV0VGV4dC5zZXRNYXhsZW5ndGgoKEludGVnZXIpbWF4TGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2MyYTBlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkxhYmVsZWRNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFNlY3JldDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVMaXN0Ym94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVSYWRpbzsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueU1lbnU7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dGFyZWE7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBIdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IKLXsKLSAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQotICAgIHsKLSAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSBFeHRWYWxVdGlscy5jb252ZXJ0RmFjZXNNZXNzYWdlKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IChTdHJpbmcpIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCh1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldExhYmVsIikpOwotCi0gICAgICAgICAgICBpZihsYWJlbCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxhYmVsID0gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9vdmVycmlkZSB0aGUgbGFiZWwgaWYgdGhlIGFubm90YXRpb24gcHJvdmlkZXMgYSBsYWJlbAotICAgICAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGFiZWwgPSBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMLCBTdHJpbmcuY2xhc3MpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihmYWNlc01lc3NhZ2UgaW5zdGFuY2VvZiBMYWJlbGVkTWVzc2FnZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKExhYmVsZWRNZXNzYWdlKWZhY2VzTWVzc2FnZSkuc2V0TGFiZWxUZXh0KGxhYmVsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vaWYgc29tZW9uZSB1c2VzIGEgbm9ybWFsIGZhY2VzIG1lc3NhZ2UKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9QbGFjZUxhYmVsKGZhY2VzTWVzc2FnZSwgbGFiZWwsIGkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0VGV4dCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0U2VjcmV0IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lTGlzdGJveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZU1lbnUgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVSYWRpbyB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlDaGVja2JveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlMaXN0Ym94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueU1lbnUgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHRhcmVhOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODM2MGJkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkFic3RyYWN0U3RhcnR1cExpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5yZWNvcmRlci5Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIobmV3IENyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyKCkpOw0KLQ0KLSAgICAgICAgaW5pdFN0YXRpY1N0cmF0ZWd5TWFwcGluZ3MoKTsNCi0gICAgICAgIGluaXREZWZhdWx0Q29tcG9uZW50SW5pdGlhbGl6ZXIoKTsNCi0gICAgICAgIGluaXREZWZhdWx0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCk7DQotICAgICAgICBhZGRTa2lwVmFsaWRhdGlvblN1cHBvcnQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFN0YXRpY1N0cmF0ZWd5TWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcganBhQmFzZWRWYWxpZGF0aW9uID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfSlBBX0JBU0VEX1ZBTElEQVRJT047DQotICAgICAgICBpZiAoanBhQmFzZWRWYWxpZGF0aW9uID09IG51bGwNCi0gICAgICAgICAgICAgICAgfHwgIWpwYUJhc2VkVmFsaWRhdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnID0gbmV3IFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgICAgIHN0YXRpY0NvbmZpZy5zZXRTb3VyY2VPZk1hcHBpbmcoDQotICAgICAgICAgICAgICAgIEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsiLmpwYV9zdHJhdGVneV9tYXBwaW5ncyIpOw0KLQ0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsIHN0YXRpY0NvbmZpZyk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gIndlYi54bWwgcGFyYW1ldGVyIHRvIGRlYWN0aXZhdGUgaXQiKQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdERlZmF1bHRDb21wb25lbnRJbml0aWFsaXplcigpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZENvbXBvbmVudEluaXRpYWxpemVyKG5ldyBIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAid2ViLnhtbCBwYXJhbWV0ZXIgdG8gZGVhY3RpdmF0ZSBpdCIpDQotICAgIHByaXZhdGUgdm9pZCBpbml0RGVmYXVsdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigNCi0gICAgICAgICAgICAgICAgbmV3IEh0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkU2tpcFZhbGlkYXRpb25TdXBwb3J0KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuaW5mbygiYWRkaW5nIHN1cHBvcnQgZm9yIEBTa2lwVmFsaWRhdGlvbiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZGVueVJlbmRlcmVySW50ZXJjZXB0b3IoVmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgVmFsaWRhdGlvbkludGVyY2VwdG9yV2l0aFNraXBWYWxpZGF0aW9uU3VwcG9ydCgpKTsNCi0NCi0gICAgICAgIFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAvL2l0J3MganVzdCByZXF1aXJlZCB0byBzZXQgdGhlIHRhcmdldA0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTiwgU2tpcFZhbGlkYXRpb25TdXBwb3J0LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuU0tJUF9WQUxJREFUSU9OX1NVUFBPUlRfQ09ORklHLCBjb25maWcpOw0KLQ0KLSAgICAgICAgLy9jb25maWcuYWRkTWFwcGluZyhDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCBSZXF1aXJlZFN0cmF0ZWd5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvcldpdGhTa2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhYTdjMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvcldpdGhTa2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LlNraXBWYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0IGV4dGVuZHMgVmFsaWRhdGlvbkludGVyY2VwdG9yCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2tpcFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkKLSAgICB7Ci0gICAgICAgIGlmKEV4dFZhbFV0aWxzLmlzU2tpcGFibGVWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBCb29sZWFuIHNraXBWYWxpZGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5TS0lQX1ZBTElEQVRJT04sIEJvb2xlYW4uY2xhc3MpOwotCi0gICAgICAgICAgICBpZihCb29sZWFuLlRSVUUuZXF1YWxzKHNraXBWYWxpZGF0aW9uKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgidmFsaWRhdGlvbiBvZiAiICsgdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjYW5jZWxlZCIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYodmFsaWRhdGlvblN0cmF0ZWd5IGluc3RhbmNlb2YgU2tpcFZhbGlkYXRpb25TdHJhdGVneSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIG51bGwpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlZWIyOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFybid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJkb2N1bWVudGF0aW9uIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fTUVTU0FHRVNfSlBBID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMiKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9KUEFfQkFTRURfVkFMSURBVElPTiIpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vRG91YmxlUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2MWMxYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIERvdWJsZVJhbmdlDQotew0KLSAgICBkb3VibGUgbWluaW11bSgpIGRlZmF1bHQgMDsNCi0NCi0gICAgZG91YmxlIG1heGltdW0oKSBkZWZhdWx0IERvdWJsZS5NQVhfVkFMVUU7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Kb2luVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGI1MmJmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgSm9pblZhbGlkYXRpb24NCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xlbmd0aC5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTGVuZ3RoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNTJmZmMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTGVuZ3RoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgTGVuZ3RoDQotew0KLSAgICBpbnQgbWluaW11bSgpIGRlZmF1bHQgMDsNCi0NCi0gICAgaW50IG1heGltdW0oKSBkZWZhdWx0IEludGVnZXIuTUFYX1ZBTFVFOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Mb25nUmFuZ2UuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTkyOTQ0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIExvbmdSYW5nZQ0KLXsNCi0gICAgbG9uZyBtaW5pbXVtKCkgZGVmYXVsdCAwOw0KLQ0KLSAgICBsb25nIG1heGltdW0oKSBkZWZhdWx0IExvbmcuTUFYX1ZBTFVFOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NDliOWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi1AUmV0ZW50aW9uKFJVTlRJTUUpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBAaW50ZXJmYWNlIFBhdHRlcm4KLXsKLSAgICBTdHJpbmdbXSB2YWx1ZSgpOwotCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgIm5vX21hdGNoIjsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjY1YjNjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUmVxdWlyZWQNCi17DQotICAgIC8qKg0KLSAgICAgKiB0byBjdXN0b21pemUgdGhlIGVycm9yIG1lc3NhZ2Ugb3INCi0gICAgICogdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQganNmIHJlcXVpcmVkIG1lc3NhZ2Ugd2l0aCB0aGUgdXNhZ2Ugb2YgdGhlIG1lc3NhZ2UgcmVzb2x2ZXIgbWVjaGFuaXNtDQotICAgICAqDQotICAgICAqIEByZXR1cm4gYW4gb3B0aW9uYWwgZXJyb3IgbWVzc2FnZSBrZXkNCi0gICAgICovDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJmaWVsZF9yZXF1aXJlZCI7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzY3NmI2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLUBSZXRlbnRpb24oUlVOVElNRSkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIEBpbnRlcmZhY2UgU2tpcFZhbGlkYXRpb24KLXsKLSAgICBTdHJpbmdbXSB2YWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE5OTViYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUYXJnZXQoVFlQRSkKLUBSZXRlbnRpb24oUlVOVElNRSkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIEBpbnRlcmZhY2UgU2tpcFZhbGlkYXRpb25TdXBwb3J0Ci17Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9WYWxpZGF0b3IuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDk0MGM2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFZhbGlkYXRvcg0KLXsNCi0gICAgQ2xhc3M8PyBleHRlbmRzIGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I+W10gdmFsdWUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTg5MDUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLkRlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yIGV4dGVuZHMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yCi17Ci0gICAgcHJpdmF0ZSBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBnZXRJbnN0YW5jZSgpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvcihuZXcgRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvcigpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAVG9EbyhQcmlvcml0eS5NRURJVU0pCi0gICAgcHVibGljIFByb3BlcnR5SW5mb3JtYXRpb24gZXh0cmFjdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKCk7Ci0KLSAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgUHJvcGVydHlEZXRhaWxzKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihvYmplY3QuZ2V0Q2xhc3MoKSArICIgaXMgbm90IGEgIiArIFByb3BlcnR5RGV0YWlscy5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IChQcm9wZXJ0eURldGFpbHMpb2JqZWN0OwotCi0gICAgICAgIENsYXNzIGVudGl0eUNsYXNzID0gcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpOwotCi0gICAgICAgIC8vVE9ETyB0ZXN0IHdpdGggY29tcGxleCBjb21wb25lbnRzCi0gICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uc2V0SW5mb3JtYXRpb24oCi0gICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBwcm9wZXJ0eURldGFpbHMpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGZpbmQgYW5kIGFkZCBhbm5vdGF0aW9ucwotICAgICAgICAgKi8KLSAgICAgICAgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICBhZGRGaWVsZEFjY2Vzc0Fubm90YXRpb25zKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTgwMTIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1JbnZhbGlkIGZvcm1hdA0KLW5vX21hdGNoX2RldGFpbD1UaGUgcmVxdWlyZWQgZm9ybWF0ZSBpczogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YWI1NDMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1cdTA2MjdcdTA2NDRcdTA2MzVcdTA2NGFcdTA2M2FcdTA2MjkgXHUwNjJlXHUwNjI3XHUwNjM3XHUwNjI2XHUwNjI5DQotbm9fbWF0Y2hfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYzNVx1MDY0YVx1MDYzYVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MzdcdTA2NDRcdTA2NDhcdTA2MjhcdTA2MjkgXHUwNjQ3XHUwNjQ5OiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThkNjQ5MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXQgaW52XHUwMGUwbGlkCi1ub19tYXRjaF9kZXRhaWw9RWwgZm9ybWF0IHJlcXVlcml0IFx1MDBlOXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWU3MDFiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9VW5n/Gx0aWdlcyBGb3JtYXQNCi1ub19tYXRjaF9kZXRhaWw9RGFzIGVyZm9yZGVybGljaGUgRm9ybWF0IGlzdDogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTgwMTIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1JbnZhbGlkIGZvcm1hdA0KLW5vX21hdGNoX2RldGFpbD1UaGUgcmVxdWlyZWQgZm9ybWF0ZSBpczogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYjEwNzcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotbm9fbWF0Y2g9Rm9ybWF0byBpbnZcdTAwZTFsaWRvIAotbm9fbWF0Y2hfZGV0YWlsPUVsIGZvcm1hdG8gcmVxdWVyaWRvIGVzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwYTIyMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUxlIGZvcm1hdCBlc3QgaW52YWxpZGUNCi1ub19tYXRjaF9kZXRhaWw9TGUgZm9ybWF0IGRvaXQgJmVjaXJjO3RyZSBkZSBsYSBmb3JtZTogezB9DQotDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxODc0OGMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotbm9fbWF0Y2g9Rm9ybWF0byBub24gdmFsaWRvCi1ub19tYXRjaF9kZXRhaWw9SWwgZm9ybWF0byByaWNoaWVzdG8gJmVncmF2ZTs6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTRiYzc0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9R2VcdTAwZTdlcnNpeiBiaVx1MDBlN2ltDQotbm9fbWF0Y2hfZGV0YWlsPWdlcmVrZW4gYmlcdTAwZTdpbTogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9KcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk0ZWNlMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9KcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotLyoNCi0gKiB0aGUganBhIHN1cHBvcnQgaXMgYW4gZXhjZXB0aW9uIGluIHZpZXcgb2Ygc29tZSBtZWNoYW5pc21zIC0gc28gdGhlcmUncyBubyBjb252ZW50aW9uIGZvciB0aGUgbWVzc2FnZSBidW5kbGUuDQotICogaW5zdGVhZCBvZiB0aGUgY29udmVudGlvbiB0aGVyZSBpcyBhIGdsb2JhbCBwcm9wZXJ0eSB0byBoYXZlIGFuIGFsdGVybmF0aXZlIHRvIHdlYi54bWwgY29uZmlndXJhdGlvbg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKUEFfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFUyA9ICJKUEFfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFUyI7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQkFTRV9OQU1FID0gV2ViWG1sUGFyYW1ldGVyLlZBTElEQVRJT05fTUVTU0FHRVNfSlBBOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9OQU1FID0gSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmNsYXNzDQotICAgICAgICAgICAgLmdldFBhY2thZ2UoKS5nZXROYW1lKCkucmVwbGFjZSgiLm1lc3NhZ2UucmVzb2x2ZXIiLCAiLm1lc3NhZ2UuYnVuZGxlIikrICIuanBhX21lc3NhZ2VzIjsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21CYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKENVU1RPTV9CQVNFX05BTUUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gQ1VTVE9NX0JBU0VfTkFNRTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoU3RyaW5nKUV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KEpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEJBU0VfTkFNRTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZGQxOGMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uRG91YmxlUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEb3VibGVSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIERvdWJsZVJhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKERvdWJsZVJhbmdlLmNsYXNzKTsNCi0NCi0gICAgICAgIGRvdWJsZSBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW5pbXVtKCk7DQotDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOLCBtaW5pbXVtKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgsIGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gPiAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pvaW5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NWExNTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pvaW5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Kb2luVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5leHRyYWN0b3IuRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSm9pbk1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBleHRyYWN0b3IgPSBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmdldEluc3RhbmNlKCk7DQotDQotICAgICAgICBTdHJpbmdbXSB0YXJnZXRFeHByZXNzaW9ucyA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoSm9pblZhbGlkYXRpb24uY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdGFyZ2V0RXhwcmVzc2lvbiA6IHRhcmdldEV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogZXh0cmFjdG9yLmV4dHJhY3QoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMpLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOw0KLQ0KLSAgICAgICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyID0gRXh0VmFsVXRpbHMuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckZvclZhbGlkYXRpb25TdHJhdGVneSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1dEFsbChtZXRhRGF0YVRyYW5zZm9ybWVyLmNvbnZlcnRNZXRhRGF0YShlbnRyeSkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pwYU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYmZkYmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pwYU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQmFzaWM7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpwYU1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiaW1wbC4gdGhlIHJlc3QiKQ0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBtZXRhRGF0YS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmKGFubm90YXRpb24gaW5zdGFuY2VvZiBDb2x1bW4pDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoISgoQ29sdW1uKSBhbm5vdGF0aW9uKS5udWxsYWJsZSgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgsICgoQ29sdW1uKSBhbm5vdGF0aW9uKS5sZW5ndGgoKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKGFubm90YXRpb24gaW5zdGFuY2VvZiBCYXNpYykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighKChCYXNpYykgYW5ub3RhdGlvbikub3B0aW9uYWwoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihhbm5vdGF0aW9uIGluc3RhbmNlb2YgSWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vVE9ETyBpbXBsLiB0aGUgcmVzdCEhIQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9MZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYzVlZTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxlbmd0aDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIExlbmd0aCBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMZW5ndGguY2xhc3MpOw0KLQ0KLSAgICAgICAgaW50IG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RILCBtaW5pbXVtKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RILCBhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBpZihtaW5pbXVtID4gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ4NWUyZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTG9uZ1JhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTG9uZ1JhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKExvbmdSYW5nZS5jbGFzcyk7DQotDQotICAgICAgICBsb25nIG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4sIG1pbmltdW0pOw0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCwgYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgaWYobWluaW11bSA+IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1BhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0YTViNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQYXR0ZXJuTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgUGF0dGVybiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShQYXR0ZXJuLmNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4sIChhbm5vdGF0aW9uKS52YWx1ZSgpKTsNCi0NCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkgPSAoYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgICAgICBMb2NhbGUgY3VycmVudExvY2FsZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpOw0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSA9DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7DQotDQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnID0gRXh0VmFsVXRpbHMuZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAuZ2V0TWVzc2FnZSh2YWxpZGF0aW9uRXJyb3JNc2dLZXksIGN1cnJlbnRMb2NhbGUpOw0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFLCB2YWxpZGF0aW9uRXJyb3JNc2cpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGY1YWE3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9SZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU2tpcE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ta2lwTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmI4MjU3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ta2lwTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBTa2lwTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTiwgdHJ1ZSk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1ZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxNzQ4OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uVmFsaWRhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIFZhbGlkYXRvciBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShWYWxpZGF0b3IuY2xhc3MpOw0KLQ0KLSAgICAgICAgQ2xhc3NbXSB2YWxpZGF0b3JzID0gYW5ub3RhdGlvbi52YWx1ZSgpOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBmb3IoQ2xhc3MgY3VycmVudENsYXNzIDogdmFsaWRhdG9ycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihjdXJyZW50Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpLnRvTG93ZXJDYXNlKCkuY29udGFpbnMoQ29tbW9uTWV0YURhdGFLZXlzLkVNQUlMKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbHVlLmFkZChDb21tb25NZXRhRGF0YUtleXMuRU1BSUwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB2YWx1ZS5hZGQoY3VycmVudENsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuQ1VTVE9NLCB2YWx1ZSk7DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvRG91YmxlUmFuZ2VTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3NTkzMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvRG91YmxlUmFuZ2VTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uRG91YmxlUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5Eb3VibGVSYW5nZVZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRG91YmxlUmFuZ2VTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotDQotICAgICAgICBEb3VibGVSYW5nZSBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShEb3VibGVSYW5nZS5jbGFzcyk7DQotICAgICAgICBEb3VibGVSYW5nZVZhbGlkYXRvciBkb3VibGVSYW5nZVZhbGlkYXRvciA9IChEb3VibGVSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigiamF2YXguZmFjZXMuRG91YmxlUmFuZ2UiKTsNCi0NCi0gICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnNldE1pbmltdW0oYW5ub3RhdGlvbi5taW5pbXVtKCkpOw0KLSAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bShhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Kb2luVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSm9pblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTVkNGU3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Kb2luVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Kb2luVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5leHRyYWN0b3IuRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpvaW5WYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgZXh0cmFjdG9yID0gRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5nZXRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgU3RyaW5nW10gdGFyZ2V0RXhwcmVzc2lvbnMgPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEpvaW5WYWxpZGF0aW9uLmNsYXNzKS52YWx1ZSgpOw0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHM7DQotICAgICAgICBmb3IgKFN0cmluZyB0YXJnZXRFeHByZXNzaW9uIDogdGFyZ2V0RXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChtZXRhRGF0YUVudHJ5LCB0YXJnZXRFeHByZXNzaW9uKTsNCi0NCi0gICAgICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBleHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHByb3BlcnR5RGV0YWlscykuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyB2YWxpZGF0aW9uIHN0cmF0ZWd5IGZvdW5kIGZvciAiICsgZW50cnkuZ2V0VmFsdWUoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTE0ZDhlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkJhc2ljOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZTsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmU7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpwYVZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUZhY2VzQnVuZGxlID0gZmFsc2U7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFURV9MRU5HVEggPSAibGVuZ3RoIjsNCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmlvbGF0aW9uOw0KLSAgICBwcml2YXRlIGludCBtYXhMZW5ndGg7DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKTsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgQ29sdW1uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlQ29sdW1uQW5ub3RhdGlvbigoQ29sdW1uKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIEJhc2ljKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlQmFzaWNBbm5vdGF0aW9uKChCYXNpYykgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBJZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgT25lVG9PbmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVPbmVUb09uZUFubm90YXRpb24oKE9uZVRvT25lKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE1hbnlUb09uZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZU1hbnlUb09uZUFubm90YXRpb24oKE1hbnlUb09uZSkgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVDb2x1bW5Bbm5vdGF0aW9uKENvbHVtbiBjb2x1bW4sIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKCFjb2x1bW4ubnVsbGFibGUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCBpbnN0YW5jZW9mIFN0cmluZw0KLSAgICAgICAgICAgICAgICAmJiBjb2x1bW4ubGVuZ3RoKCkgPCAoKFN0cmluZykgY29udmVydGVkT2JqZWN0KS5sZW5ndGgoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbiA9IFZBTElEQVRFX0xFTkdUSDsNCi0gICAgICAgICAgICB0aGlzLm1heExlbmd0aCA9IGNvbHVtbi5sZW5ndGgoKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWFzc2FnZShudWxsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQmFzaWNBbm5vdGF0aW9uKEJhc2ljIGJhc2ljLCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICghYmFzaWMub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlT25lVG9PbmVBbm5vdGF0aW9uKE9uZVRvT25lIG9uZVRvT25lLCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIW9uZVRvT25lLm9wdGlvbmFsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU1hbnlUb09uZUFubm90YXRpb24oTWFueVRvT25lIG1hbnlUb09uZSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFtYW55VG9PbmUub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCB8fCBjb252ZXJ0ZWRPYmplY3QuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbiA9IENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRDsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWFzc2FnZShudWxsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoVkFMSURBVEVfTEVOR1RILmVxdWFscyh0aGlzLnZpb2xhdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJmaWVsZF90b29fbG9uZyI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJmaWVsZF9yZXF1aXJlZCI7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHN1cGVyLmdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgIGlmIChWQUxJREFURV9MRU5HVEguZXF1YWxzKHRoaXMudmlvbGF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLCAiIiArIHRoaXMubWF4TGVuZ3RoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc3VwZXIucmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0gICAgICAgIFN0cmluZyBtYXJrZXIgPSBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5NSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0NCi0gICAgICAgIGlmKChtYXJrZXIgKyBrZXkgKyBtYXJrZXIpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudXNlRmFjZXNCdW5kbGUgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IGUuZ2V0RmFjZXNNZXNzYWdlKCk7DQotDQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKFZBTElEQVRFX0xFTkdUSC5lcXVhbHModGhpcy52aW9sYXRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0TWF4aW11bU1lc3NhZ2UoZmFjZXNNZXNzYWdlLCB0aGlzLm1heExlbmd0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTG9uZ1JhbmdlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzU4MjAyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTG9uZ1JhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTG9uZ1JhbmdlVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMb25nUmFuZ2VTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotDQotICAgICAgICBMb25nUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTG9uZ1JhbmdlLmNsYXNzKTsNCi0gICAgICAgIExvbmdSYW5nZVZhbGlkYXRvciBsb25nUmFuZ2VWYWxpZGF0b3IgPSAoTG9uZ1JhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoImphdmF4LmZhY2VzLkxvbmdSYW5nZSIpOw0KLQ0KLSAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnNldE1pbmltdW0oYW5ub3RhdGlvbi5taW5pbXVtKCkpOw0KLSAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2VlN2YzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9QYXR0ZXJuU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5QYXR0ZXJuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0Ci1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFBhdHRlcm5TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneQotewotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LAotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUGF0dGVybiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShQYXR0ZXJuLmNsYXNzKTsKLQotICAgICAgICBmb3IgKFN0cmluZyBleHByZXNzaW9uIDogYW5ub3RhdGlvbi52YWx1ZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0ID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgfHwgIWphdmEudXRpbC5yZWdleC5QYXR0ZXJuLmNvbXBpbGUoZXhwcmVzc2lvbikubWF0Y2hlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QudG9TdHJpbmcoKSkubWF0Y2hlcygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24obmV3IEZhY2VzTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbikucmVwbGFjZSgiezB9IiwgZXhwcmVzc2lvbikpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKFBhdHRlcm4pIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZXF1aXJlZFN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUmVxdWlyZWRTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzhmOTk2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZXF1aXJlZFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZFN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRmFjZXNCdW5kbGUgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCA9PSBudWxsIHx8IGNvbnZlcnRlZE9iamVjdC5lcXVhbHMoIiIpIHx8DQotICAgICAgICAgICAgICAgIChjb252ZXJ0ZWRPYmplY3QgaW5zdGFuY2VvZiBDb2xsZWN0aW9uICYmICgoQ29sbGVjdGlvbiljb252ZXJ0ZWRPYmplY3QpLmlzRW1wdHkoKSkgfHwNCi0gICAgICAgICAgICAgICAgKGNvbnZlcnRlZE9iamVjdCBpbnN0YW5jZW9mIE1hcCAmJiAoKE1hcCljb252ZXJ0ZWRPYmplY3QpLmlzRW1wdHkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihnZXRWYWxpZGF0aW9uRXJyb3JGYWNlc01hc3NhZ2UobWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoUmVxdWlyZWQpIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShlLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvU2tpcFZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1NraXBWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhZGFjNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvU2tpcFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgU2tpcFZhbGlkYXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIFZhbGlkYXRpb25TdHJhdGVneQotewotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZ1tdIHZhbHVlQmluZGluZ0V4cHJlc3Npb25zID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShTa2lwVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsKLQotICAgICAgICBmb3IoU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gOiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9ucykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFZhbHVlT2ZFeHByZXNzaW9uKAotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbikpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlNLSVBfVkFMSURBVElPTiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9WYWxpZGF0b3JTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjNjYzkxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9WYWxpZGF0b3JTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uVmFsaWRhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotDQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcj5bXSB2YWxpZGF0b3JDbGFzc2VzID0NCi0gICAgICAgICAgICBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFZhbGlkYXRvci5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3IgdmFsaWRhdG9yOw0KLSAgICAgICAgZm9yIChDbGFzcyB2YWxpZGF0b3JDbGFzc05hbWUgOiB2YWxpZGF0b3JDbGFzc2VzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRvciA9IChqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yKSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHZhbGlkYXRvckNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRvciA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSh2YWxpZGF0b3JDbGFzc05hbWUuZ2V0TmFtZSgpICsgIiBub3QgZm91bmQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU2NmE0MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneS5BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY2VzRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIFRoaXMgcGhhc2UgbGlzdGVuZXIgcHJvY2Vzc2VzIGNyb3NzIHZhbGlkYXRpb24gYXMgc29vbiBhcyBpdCBmaW5kcyBhIHNwZWNpYWwgcmVxdWVzdCBzY29wZWQgc3RvcmFnZS48YnIvPg0KLSAqIFNvIGl0J3MgcG9zc2libGUgdG8gYWRkIGluZm9ybWF0aW9uIGR1cmluZyB0aGUgcHJvY2VzcyB2YWxpZGF0aW9uIHBoYXNlLiBBdCB0aGUgZW5kIG9mIHRoaXMgcGhhc2UgaXQgZ2V0cyBwcm9jZXNzZWQuDQotICogQWZ0ZXIgdGhhdCB0aGUgc3RvcmFnZSBnZXRzIHJlc2V0ZWQuPHAvPg0KLSAqIElmIHlvdSBwcm92aWRlIGEgY3VzdG9tIGV4dGVuc2lvbiBhbmQgeW91IGFkZCB0aGUgc2FtZSBzdG9yYWdlIHR5cGUgd2l0aGluIGEgZGlmZmVyZW50IHBoYXNlLA0KLSAqIGl0IGFsc28gZ2V0cyBwcm9jZXNzZWQgYXQgdGhlIGVuZCBvZiB0aGF0IHBoYXNlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lciBpbXBsZW1lbnRzIFBoYXNlTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlID0gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpOw0KLSAgICAgICAgICAgIGZvciAoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5IDogY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5nZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpIGluc3RhbmNlb2YgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkuZ2V0Q2xhc3MoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluaXRDcm9zc1ZhbGlkYXRpb24iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkucHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbihlbnRyeSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWRkTWVzc2FnZSA9IHRydWU7DQotDQotICAgICAgICAgICAgICAgICAgICBpZihlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKSBpbnN0YW5jZW9mIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRNZXNzYWdlID0gKEJvb2xlYW4pUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmNsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uLmdldENsYXNzKCkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbik7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGYWNlc0V4Y2VwdGlvbihlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBpZihhZGRNZXNzYWdlKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhY2VzTWVzc2FnZSAhPSBudWxsICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgJiYgZmFjZXNNZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRGYWNlc0NvbnRleHQoKS5hZGRNZXNzYWdlKGVudHJ5LmdldENsaWVudElkKCksIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldEZhY2VzQ29udGV4dCgpLnJlbmRlclJlc3BvbnNlKCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBmaW5hbGx5DQotICAgICAgICB7DQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMucmVzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc0luaXRpYWxpemVkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04gIT0gbnVsbA0KLSAgICAgICAgICAgICAgICAgICAgJiYgV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEpzZlV0aWxzLmRlcmVnaXN0ZXJQaGFzZUxpc3RlbmVyKHRoaXMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpc0luaXRpYWxpemVkID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLkFOWV9QSEFTRTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmIzZGYwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlDQotew0KLSAgICBwcml2YXRlIExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcyA9IA0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZChDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMuYWRkKGVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+IGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcykNCi0gICAgew0KLSAgICAgICAgdGhpcy5jcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDRjMDQwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneS5Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeQ0KLXsNCi0gICAgcHJpdmF0ZSBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnk7DQotICAgIC8vZm9yIGNvbXBsZXggY29tcG9uZW50cyAoZS5nLiBhIHRhYmxlKSBzdG9yZXMgdGhlIG9iamVjdCBvZiBlbnRyeSAoI3tlbnRyeS5wcm9wZXJ0eX0pDQotICAgIHByaXZhdGUgVUlDb21wb25lbnQgY29tcG9uZW50Ow0KLSAgICBwcml2YXRlIE9iamVjdCBjb252ZXJ0ZWRPYmplY3Q7DQotICAgIHByaXZhdGUgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAvL2p1c3QgZm9yIGlucHV0IGNvbXBvbmVudHMgd2l0aGluIGNvbXBsZXggY29tcG9uZW50cyBlLmcuIGRhdGFUYWJsZSwuLi4NCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50SWQ7DQotDQotICAgIHB1YmxpYyBNZXRhRGF0YUVudHJ5IGdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFFbnRyeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YUVudHJ5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YUVudHJ5ID0gbWV0YURhdGFFbnRyeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVUlDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnQoVUlDb21wb25lbnQgY29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldENvbnZlcnRlZE9iamVjdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkT2JqZWN0KE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29udmVydGVkT2JqZWN0ID0gY29udmVydGVkT2JqZWN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25TdHJhdGVneShDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsaWRhdGlvblN0cmF0ZWd5ID0gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY2xpZW50SWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50SWQoU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNsaWVudElkID0gY2xpZW50SWQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1Byb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkzMTNkOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1Byb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEluIG9yZGVyIHRvIGJ1aWxkIHVwIGEgbWFwcGluZyB3aGljaCBpcyB1c2VkIGZvciBjcm9zcy12YWxpZGF0aW9uLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeQotewotICAgIHByaXZhdGUgT2JqZWN0IGJlYW47Ci0gICAgcHJpdmF0ZSBPYmplY3QgY29udmVydGVkVmFsdWU7Ci0gICAgcHJpdmF0ZSBVSUNvbXBvbmVudCBjb21wb25lbnQ7Ci0gICAgLy9mb3IgY29tcGxleCBjb21wb25lbnRzIChlLmcuIGEgdGFibGUgdGhlcmUgYXJlIG11bHRpcGxlIGVudHJpZXMgd2l0aAotICAgIC8vdGhlIHNhbWUga2V5IChoZXJlIHRoZSBlbCBleHByZXNzaW9uICN7ZW50cnkucHJvcGVydHl9KQotICAgIC8vaG93ZXZlciwgZG9uJ3Qgb3ZlcnJpZGUgdGhlIHByZXZpb3VzIGVudHJ5IC0gdGhleSBhcm4ndCB0aGUgc2FtZTsKLSAgICBwcml2YXRlIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4gZnVydGhlckVudHJpZXM7Ci0gICAgLy9qdXN0IGZvciBpbnB1dCBjb21wb25lbnRzIHdpdGhpbiBjb21wbGV4IGNvbXBvbmVudHMgZS5nLiBkYXRhVGFibGUsLi4uCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50SWQ7Ci0KLSAgICAvKgotICAgICAqIGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmVhbigpCi0gICAgewotICAgICAgICByZXR1cm4gYmVhbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCZWFuKE9iamVjdCBiZWFuKQotICAgIHsKLSAgICAgICAgdGhpcy5iZWFuID0gYmVhbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZWRWYWx1ZShPYmplY3QgY29udmVydGVkVmFsdWUpCi0gICAgewotICAgICAgICB0aGlzLmNvbnZlcnRlZFZhbHVlID0gY29udmVydGVkVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFVJQ29tcG9uZW50IGdldENvbXBvbmVudCgpCi0gICAgewotICAgICAgICByZXR1cm4gY29tcG9uZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudChVSUNvbXBvbmVudCBjb21wb25lbnQpCi0gICAgewotICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudElkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjbGllbnRJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGllbnRJZChTdHJpbmcgY2xpZW50SWQpCi0gICAgewotICAgICAgICB0aGlzLmNsaWVudElkID0gY2xpZW50SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4gZ2V0RnVydGhlckVudHJpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZ1cnRoZXJFbnRyaWVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZ1cnRoZXJFbnRyaWVzKExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4gZnVydGhlckVudHJpZXMpCi0gICAgewotICAgICAgICB0aGlzLmZ1cnRoZXJFbnRyaWVzID0gZnVydGhlckVudHJpZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiN2Y4OWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFybid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0NST1NTVkFMSURBVElPTiIpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZjgzY2YuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgRGF0ZUlzDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZU9mKCk7DQotDQotICAgIC8qDQotICAgICAqIG9wdGlvbmFsIHNlY3Rpb24NCi0gICAgICovDQotDQotICAgIERhdGVJc1R5cGUgdHlwZSgpIGRlZmF1bHQgRGF0ZUlzVHlwZS5zYW1lOw0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiIjsNCi0NCi0gICAgU3RyaW5nIG5vdEJlZm9yZUVycm9yTXNnS2V5KCkgZGVmYXVsdCAid3JvbmdfZGF0ZV9ub3RfYmVmb3JlIjsNCi0NCi0gICAgU3RyaW5nIG5vdEFmdGVyRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJ3cm9uZ19kYXRlX25vdF9hZnRlciI7DQotDQotICAgIFN0cmluZyBub3RFcXVhbEVycm9yTXNnS2V5KCkgZGVmYXVsdCAid3JvbmdfZGF0ZV9ub3RfZXF1YWwiOw0KLQ0KLSAgICBpbnQgZXJyb3JNZXNzYWdlRGF0ZVN0eWxlKCkgZGVmYXVsdCBEYXRlRm9ybWF0Lk1FRElVTTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0VxdWFscy5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0VxdWFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTQyNDA5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgRXF1YWxzDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZSgpOw0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkIjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL05vdEVxdWFscy5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL05vdEVxdWFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTYxNmEwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9Ob3RFcXVhbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgTm90RXF1YWxzDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZSgpOw0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZHVwbGljYXRlZF9jb250ZW50X2RlbmllZCI7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmLmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWIwMTlkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFJlcXVpcmVkSWYNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlT2YoKTsNCi0NCi0gICAgLyoNCi0gICAgICogb3B0aW9uYWwgc2VjdGlvbg0KLSAgICAgKi8NCi0NCi0gICAgUmVxdWlyZWRJZlR5cGUgaXMoKSBkZWZhdWx0IFJlcXVpcmVkSWZUeXBlLm5vdF9lbXB0eTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImVtcHR5X2ZpZWxkIjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWZUeXBlLmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkwYWM5MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGVudW0gUmVxdWlyZWRJZlR5cGUNCi17DQotICAgIGVtcHR5LCBub3RfZW1wdHkNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2MDc1OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9SW5wdXQgaXMgZGlmZmVyZW50DQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1JbnB1dCBpcyBkaWZmZXJlbnQNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLQ0KLXdyb25nX2RhdGU9V3JvbmcgZGF0ZQ0KLXdyb25nX2RhdGVfZGV0YWlsPVdyb25nIGRhdGUNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZjkzYzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPVx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDVcdTA2MmVcdTA2MmFcdTA2NDRcdTA2NDENCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDVcdTA2MmVcdTA2MmFcdTA2NDRcdTA2NDENCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPVx1MDYzYVx1MDY0YVx1MDYzMSBcdTA2NDVcdTA2MzNcdTA2NDVcdTA2NDhcdTA2MmQgXHUwNjI4XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0IFx1MDY0NiBcdTA2NDFcdTA2MzMgXHUwNjQyXHUwNjRhXHUwNjQ1XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPVx1MDYzYVx1MDY0YVx1MDYzMSBcdTA2NDVcdTA2MzNcdTA2NDVcdTA2NDhcdTA2MmQgXHUwNjI4XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0ICBcdTA2NDZcdTA2NDFcdTA2MzMgXHUwNjQyXHUwNjRhXHUwNjQ1XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NA0KLQ0KLXdyb25nX2RhdGU9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDYyZVx1MDYyN1x1MDYzN1x1MDY0OVx1MDYyMQ0KLXdyb25nX2RhdGVfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2NDlcdTA2MjENCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzXHUwNjQ4IFx1MDY0NiBcdTA2MjhcdTA2MzlcdTA2MmYgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDMgXHUwNjQ4XHUwNjQ2IFx1MDYyOFx1MDYzOVx1MDYyZiB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDNcdTA2NDggXHUwNjQ2IFx1MDY0Mlx1MDYyOFx1MDY0NCB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzIFx1MDY0OFx1MDY0NiBcdTA2NDJcdTA2MjhcdTA2NDQgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0NFx1MDYyNyBcdTA2NGFcdTA2MzNcdTA2MjdcdTA2NDhcdTA2NDkgezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NDRcdTA2MjcgXHUwNjRhXHUwNjMzXHUwNjI3XHUwNjQ4XHUwNjQ5IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NTRlZDIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1lbCB2YWxvciBcdTAwZTkgZGlmZXJlbnQKLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9ZWwgdmFsb3IgXHUwMGU5IGRpZmVyZW50Ci0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9bm8gZXMgcGVybWV0IGVsIG1hdGVpeCB2YWxvcgotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9bm8gZXMgcGVybWV0IGVsIG1hdGVpeCB2YWxvcgotCi13cm9uZ19kYXRlPWRhdGEgZXJyXHUwMGYybmlhCi13cm9uZ19kYXRlX2RldGFpbD1kYXRhIGVyclx1MDBmMm5pYQotCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9bGEgZGF0YSBoYSBkZSBzZXIgcG9zdGVyaW9yIGEgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotCi13cm9uZ19kYXRlX25vdF9hZnRlcj1sYSBkYXRhIGhhIGRlIHNlciBhbnRlcmlvciBhIHswfQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotCi13cm9uZ19kYXRlX25vdF9lcXVhbD1sYSBkYXRhIG5vIFx1MDAwZTlzIGlndWFsIGEgezB9Ci13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9bGEgZGF0YSBubyBcdTAwMGU5cyBpZ3VhbCBhIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkODcyMzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUVpbmdhYmUgaXN0IHVudGVyc2NoaWVkbGljaA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9RWluZ2FiZSBpc3QgdW50ZXJzY2hpZWRsaWNoDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1EZXIgZ2xlaWNoZSBXZXJ0IGlzdCBuaWNodCBlcmxhdWJ0DQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9RGVyIGdsZWljaGUgV2VydCBpc3QgbmljaHQgZXJsYXVidA0KLQ0KLXdyb25nX2RhdGU9RGF0dW0gaW5rb3JyZWt0DQotd3JvbmdfZGF0ZV9kZXRhaWw9RGF0dW0gaW5rb3JyZWt0DQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhcyBEYXR1bSBtdXNzIG5hY2ggZGVtIHswfSBzZWluDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1EYXMgRGF0dW0gbXVzcyBuYWNoIGRlbSB7MH0gc2Vpbg0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPURhcyBEYXR1bSBtdXNzIHZvciBkZW0gezB9IHNlaW4NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9RGFzIERhdHVtIG11c3Mgdm9yIGRlbSB7MH0gc2Vpbg0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPURhcyBEYXR1bSBlbnRzcHJpY2h0IG5pY2h0IGRlbSB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGFzIERhdHVtIGVudHNwcmljaHQgbmljaHQgZGVtIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNjA3NTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUlucHV0IGlzIGRpZmZlcmVudA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9SW5wdXQgaXMgZGlmZmVyZW50DQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi0NCi13cm9uZ19kYXRlPVdyb25nIGRhdGUNCi13cm9uZ19kYXRlX2RldGFpbD1Xcm9uZyBkYXRlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzM4NTI0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9bGEgZW50cmFkYSBlcyBkaWZlcmVudGUKLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9bGEgZW50cmFkYSBlcyBkaWZlcmVudGUKLQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1ubyBzZSBwZXJtaXRlbiBlbnRyYWRhcyBpZ3VhbGVzCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1ubyBzZSBwZXJtaXRlbiBlbnRyYWRhcyBpZ3VhbGVzCi0KLXdyb25nX2RhdGU9ZmVjaGEgZXF1aXZvY2FkYQotd3JvbmdfZGF0ZV9kZXRhaWw9ZmVjaGEgZXF1aXZvY2FkYQotCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBsdWVnbyBkZSB7MH0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBsdWVnbyBkZSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBhbnRlcyBkZSB7MH0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGFudGVzIGRlIHswfQotCi13cm9uZ19kYXRlX25vdF9lcXVhbD1sYSBmZWNoYSBubyBlcyBpZ3VhbCBhIHswfQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPWxhIGZlY2hhIG5vIGVzIGlndWFsIGEgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmMDIxOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9TGVzIGNoYW1wcyBzb250IGRpZmYmZWFjdXRlO3JlbnRzDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1MZXMgY2hhbXBzIHNvbnQgZGlmZiZlYWN1dGU7cmVudHMNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPUxlcyBjaGFtcHMgZG9pdmVudCAmZWNpcmM7dHJlIGRpZmYmZWFjdXRlO3JlbnRzDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9TGVzIGNoYW1wcyBkb2l2ZW50ICZlY2lyYzt0cmUgZGlmZiZlYWN1dGU7cmVudHMNCi0NCi13cm9uZ19kYXRlPUxhIGRhdGUgZXN0IGluY29ycmVjdGUNCi13cm9uZ19kYXRlX2RldGFpbD1MYSBkYXRlIGVzdCBpbmNvcnJlY3RlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGFwciZlZ3JhdmU7cyB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGFwciZlZ3JhdmU7cyB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhdmFudCB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXZhbnQgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9TGEgZGF0ZSBuJ2VzdCBwYXMgJmVhY3V0ZTtnYWxlICZhZ3JhdmU7IHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1MYSBkYXRlIG4nZXN0IHBhcyAmZWFjdXRlO2dhbGUgJmFncmF2ZTsgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA0MjgwMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPVZhbG9yaSBub24gdWd1YWxpCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUkgdmFsb3JpIGluc2VyaXRpIG5vbiBjb2luY2lkb25vCi0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9TG8gc3Rlc3NvIHZhbG9yZSBub24gJmVncmF2ZTsgcGVybWVzc28KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPUxvIHN0ZXNzbyB2YWxvcmUgbm9uICZlZ3JhdmU7IHBlcm1lc3NvCi0KLXdyb25nX2RhdGU9RGF0YSBlcnJhdGEKLXdyb25nX2RhdGVfZGV0YWlsPURhdGEgZXJyYXRhCi0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1MYSBkYXRhIGRldmUgZXNzZXJlIGRvcG8gZGkgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPUxhIGRhdGEgZGV2ZSBlc3NlcmUgZG9wbyBkaSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9TGEgZGF0YSBkZXZlIGVzc2VyZSBwcmltYSBkaSB7MH0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1MYSBkYXRhIGRldmUgZXNzZXJlIHByaW1hIGRpIHswfQotCi13cm9uZ19kYXRlX25vdF9lcXVhbD1MYSBkYXRhIG5vbiAmZWdyYXZlOyB1Z3VhbGUgYSB7MH0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1MYSBkYXRhIG5vbiAmZWdyYXZlOyB1Z3VhbGUgYSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWY2YTlkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1naXJpbGVuIGRlXHUwMTFmZXIgZmFya2xcdTAxMzENCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPWdpcmlsZW4gZGVcdTAxMWZlciBmYXJrbFx1MDEzMQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9YXluXHUwMTMxIGRlXHUwMTFmZXIgZ2lyaWxlbWV6DQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9YXluXHUwMTMxIGRlXHUwMTFmZXIgZ2lyaWxlbWV6DQotDQotd3JvbmdfZGF0ZT15YW5sXHUwMTMxXHUwMTVmIHRhcmloDQotd3JvbmdfZGF0ZV9kZXRhaWw9eWFubFx1MDEzMVx1MDE1ZiB0YXJpaA0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIHNvbnJhIG9sbWFsXHUwMTMxZFx1MDEzMXINCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gc29ucmEgb2xtYWxcdTAxMzFkXHUwMTMxcg0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gXHUwMGY2bmNlIG9sbWFsXHUwMTMxZFx1MDEzMXINCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBcdTAwZjZuY2Ugb2xtYWxcdTAxMzFkXHUwMTMxcg0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPXRhcmloIHswfSBkZVx1MDExZmVyaW5lIGVcdTAxNWZpdCBkZVx1MDExZmlsDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5lIGVcdTAxNWZpdCBkZVx1MDExZmlsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWNvcmRlci9Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlci5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWNvcmRlci9Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzQwYTAzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcmVjb3JkZXIvQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5yZWNvcmRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXIuUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlciBpbXBsZW1lbnRzIFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXINCi17DQotICAgIHB1YmxpYyB2b2lkIHJlY29yZFVzZXJJbnB1dChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IHZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpZiAoISh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vdG8gc3VwcG9ydCBsb2NhbCBjcm9zcy12YWxpZGF0aW9uICh3aXRoaW4gdGhlIHNhbWUgZW50aXR5KQ0KLSAgICAgICAgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4ga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcgPSBDcm9zc1ZhbGlkYXRpb25VdGlscw0KLSAgICAgICAgICAgIC5nZXRPckluaXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpOw0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSBlbnRyeTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPQ0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgaWYocHJvcGVydHlEZXRhaWxzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBlbnRyeSA9IG5ldyBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5KCk7DQotICAgICAgICBlbnRyeS5zZXRCZWFuKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkpOw0KLSAgICAgICAgZW50cnkuc2V0Q29udmVydGVkVmFsdWUodmFsdWUpOw0KLSAgICAgICAgZW50cnkuc2V0Q29tcG9uZW50KHVpQ29tcG9uZW50KTsNCi0gICAgICAgIGVudHJ5LnNldENsaWVudElkKHVpQ29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGtleSA9IHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKTsNCi0NCi0gICAgICAgIC8vZm9yIGxvY2FsIGNyb3NzLXZhbGlkYXRpb24NCi0gICAgICAgIGlmIChrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5jb250YWluc0tleShrZXkpICYmDQotICAgICAgICAgICAga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcuZ2V0KGtleSkuZ2V0QmVhbigpICE9IG51bGwgJiYNCi0gICAgICAgICAgICAha2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcuZ2V0KGtleSkuZ2V0QmVhbigpLmVxdWFscyhlbnRyeS5nZXRCZWFuKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZm9yIHRoZSB2YWxpZGF0aW9uIHdpdGhpbiBhIGNvbXBsZXggY29tcG9uZW50IGUuZy4gYSB0YWJsZQ0KLSAgICAgICAgICAgIC8vZG9uJ3Qgb3ZlcnJpZGUgZXhpc3RpbmcgZXhwcmVzc2lvbiAoc3R5bGU6ICN7ZW50cnkucHJvcGVydHl9KSAtIG1ha2UgYSBzcGVjaWFsIG1hcHBpbmcNCi0NCi0gICAgICAgICAgICBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGZ1cnRoZXJFbnRyaWVzID0NCi0gICAgICAgICAgICAgICAga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcuZ2V0KGtleSkuZ2V0RnVydGhlckVudHJpZXMoKTsNCi0NCi0gICAgICAgICAgICBpZiAoZnVydGhlckVudHJpZXMgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZ1cnRoZXJFbnRyaWVzID0gbmV3IEFycmF5TGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PigpOw0KLQ0KLSAgICAgICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQoa2V5KS5zZXRGdXJ0aGVyRW50cmllcyhmdXJ0aGVyRW50cmllcyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZ1cnRoZXJFbnRyaWVzLmFkZChlbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9mb3Igbm9ybWFsIHZhbGlkYXRpb24NCi0gICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5wdXQoa2V5LCBlbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2MxNTQ0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBMaXN0PFJlZmVyZW5jaW5nU3RyYXRlZ3k+IHJlZmVyZW5jaW5nU3RyYXRlZ2llczsNCi0gICAgcHJvdGVjdGVkIE1hcDxPYmplY3QsIE9iamVjdD4gdmlvbGF0aW9uUmVzdWx0U3RvcmFnZSA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOw0KLQ0KLSAgICBwdWJsaWMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICBpbml0UmVmZXJlbmNpbmdTdHJhdGVnaWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFJlZmVyZW5jaW5nU3RyYXRlZ2llcygpDQotICAgIHsNCi0gICAgICAgIGlmIChyZWZlcmVuY2luZ1N0cmF0ZWdpZXMgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMgPSBuZXcgQXJyYXlMaXN0PFJlZmVyZW5jaW5nU3RyYXRlZ3k+KCk7DQotDQotICAgICAgICAgICAgU3RyaW5nIGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3lDbGFzc05hbWUgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkJBU0VfUEFDS0FHRSkgKyAiUmVmZXJlbmNpbmdTdHJhdGVneSI7DQotDQotICAgICAgICAgICAgUmVmZXJlbmNpbmdTdHJhdGVneSBjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5ID0gKFJlZmVyZW5jaW5nU3RyYXRlZ3kpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgIC50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3lDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBFTENvbXBhcmVTdHJhdGVneSgpKTsNCi0gICAgICAgICAgICAvL3JlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IEFsaWFzQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IExvY2FsQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IExvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlKSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vaW5pdENyb3NzVmFsaWRhdGlvbiBpcyBkb25lIGluIHRoZSBDcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyDQotDQotICAgICAgICBTdHJpbmdbXSB2YWxpZGF0aW9uVGFyZ2V0cyA9IGdldFZhbGlkYXRpb25UYXJnZXRzKA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvblRhcmdldCA6IHZhbGlkYXRpb25UYXJnZXRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQgPSB2YWxpZGF0aW9uVGFyZ2V0LnRyaW0oKTsNCi0NCi0gICAgICAgICAgICAvL3NlbGVjdCB2YWxpZGF0aW9uIG1ldGhvZA0KLSAgICAgICAgICAgIHRyeVRvVmFsaWRhdGUoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCkNCi0gICAgew0KLSAgICAgICAgZm9yIChSZWZlcmVuY2luZ1N0cmF0ZWd5IHJlZmVyZW5jaW5nU3RyYXRlZ3kgOiByZWZlcmVuY2luZ1N0cmF0ZWdpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHJlZmVyZW5jaW5nU3RyYXRlZ3kuZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwgdmFsaWRhdGlvblRhcmdldCwgdGhpcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJUaHJvd2FibGVJbnN0YW5jZU5ldmVyVGhyb3duIn0pDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlRhcmdldCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFoYW5kbGVUYXJnZXRWaW9sYXRpb24oZW50cnlPZlNvdXJjZSwgZW50cnlPZlRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9ubyB0YXJnZXQgLSBiZWNhdXNlIHRoZXJlIGlzIG5vIHRhcmdldCBjb21wb25lbnQgLSB2YWx1ZSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1vZGVsDQotICAgICAgICAgICAgaWYoZW50cnlPZlRhcmdldCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1RhcmdldENvbXBvbmVudEFzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oZW50cnlPZlNvdXJjZSk7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIC8vZ2V0IHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSB0YXJnZXQgY29tcG9uZW50DQotICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldEVycm9yTWVzc2FnZVN1bW1hcnkoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIHRydWUpOw0KLSAgICAgICAgU3RyaW5nIGRldGFpbHMgPSBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIHRydWUpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0aW9uIHRhcmdldCBpc24ndCBib3VuZCB0byBhIGNvbXBvbmVudCB3aXRoaW5nIHRoZSBjdXJyZW50IHBhZ2UgDQotICAgICAgICAvLyhzZWUgdmFsaWRhdGVGb3VuZEVudHJ5LCB0cnlUb1ZhbGlkYXRlTG9jYWxseSBhbmQgdHJ5VG9WYWxpZGF0ZUJpbmRpbmdPbmx5KQ0KLSAgICAgICAgaWYgKGVudHJ5T2ZUYXJnZXQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBlbnRyeU9mVGFyZ2V0ID0gZW50cnlPZlNvdXJjZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlOw0KLSAgICAgICAgaWYgKGVudHJ5T2ZUYXJnZXQuZ2V0TWV0YURhdGFFbnRyeSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWVzc2FnZSA9IGdldFRhcmdldENvbXBvbmVudEVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgZW50cnlPZlRhcmdldC5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIHN1bW1hcnksIGRldGFpbHMpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vVE9ETyBkb2N1bWVudCBwb3NzaWJsZSBzaWRlIGVmZmVjdHMNCi0gICAgICAgICAgICAvL2R1ZSB0byBhIG1pc3NpbmcgdGFyZ2V0IGFubm90YXRpb24gKHNlZTogdHJ5VG9WYWxpZGF0ZUxvY2FsbHkpDQotICAgICAgICAgICAgbWVzc2FnZSA9IGdldFRhcmdldENvbXBvbmVudEVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIHN1bW1hcnksIGRldGFpbHMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKChtZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsIHx8IG1lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkgJiYNCi0gICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldENsaWVudElkKCkgIT0gbnVsbCAmJiAhZW50cnlPZlNvdXJjZS5nZXRDbGllbnRJZCgpLmVxdWFscyhlbnRyeU9mVGFyZ2V0LmdldENsaWVudElkKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24gPSBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG1lc3NhZ2UpOw0KLQ0KLSAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICAgICAgZW50cnlPZlRhcmdldC5nZXRDb21wb25lbnQoKSwgZW50cnlPZlRhcmdldC5nZXRNZXRhRGF0YUVudHJ5KCksDQotICAgICAgICAgICAgICAgICAgICBlbnRyeU9mVGFyZ2V0LmdldENvbnZlcnRlZE9iamVjdCgpLCB2YWxpZGF0b3JFeGNlcHRpb24sIHRoaXMpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LmFkZE1lc3NhZ2UoZW50cnlPZlRhcmdldC5nZXRDbGllbnRJZCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbnZlcnRGYWNlc01lc3NhZ2UodmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzVGFyZ2V0Q29tcG9uZW50QXNTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgLy9nZXQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKTsNCi0gICAgICAgIFN0cmluZyBkZXRhaWxzID0gZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbChlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSk7DQotDQotICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZSA9IGdldFNvdXJjZUNvbXBvbmVudEVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotDQotICAgICAgICBpZiAobWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCB8fCBtZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9UT0RPDQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihtZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8gbG9nZ2luZw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByb2Nlc3NTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGhhbmRsZVNvdXJjZVZpb2xhdGlvbihlbnRyeU9mU291cmNlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2dldCB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQNCi0gICAgICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldEVycm9yTWVzc2FnZVN1bW1hcnkoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIGZhbHNlKTsNCi0gICAgICAgICAgICBTdHJpbmcgZGV0YWlscyA9IGdldEVycm9yTWVzc2FnZURldGFpbChlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgZmFsc2UpOw0KLQ0KLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlID0gZ2V0U291cmNlQ29tcG9uZW50RXJyb3JNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgfHwgbWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9UT0RPDQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24obWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9qdXN0IHRocm93IGEgbmV3IG1lc3NhZ2UgLSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBhdCB0aGUgdGFyZ2V0DQotICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG5ldyBGYWNlc01lc3NhZ2UoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEZhY2VzTWVzc2FnZSBnZXRTb3VyY2VDb21wb25lbnRFcnJvck1lc3NhZ2UoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZUZhY2VzTWVzc2FnZShzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBGYWNlc01lc3NhZ2UgZ2V0VGFyZ2V0Q29tcG9uZW50RXJyb3JNZXNzYWdlKEFubm90YXRpb24gZm91bmRBbm5vdGF0aW9uLCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZUZhY2VzTWVzc2FnZShzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByZXNvbHZlTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgICAgIHJldHVybiAoa2V5ICE9IG51bGwpID8gcmVzb2x2ZU1lc3NhZ2Uoa2V5ICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgpIDogbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVRhcmdldFZpb2xhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVudHJ5T2ZUYXJnZXQgIT0gbnVsbCAmJiBlbnRyeU9mVGFyZ2V0LmdldENvbXBvbmVudCgpICE9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlU291cmNlVmlvbGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gaGFuZGxlVGFyZ2V0VmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogbm8gdGFyZ2V0IGNvbXBvbmVudCAodmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBtb2RlbCkgLT4gZ2V0IHJldmVyc2UgbWVzc2FnZSBmb3Igc291cmNlIGNvbXBvbmVudA0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIC8vaWYgdGhlIG1lc3NhZ2UgaXMgbmV1dHJhbA0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiwgdHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogbm8gdGFyZ2V0IGNvbXBvbmVudCAodmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBtb2RlbCkgLT4gZ2V0IHJldmVyc2UgbWVzc2FnZSBmb3Igc291cmNlIGNvbXBvbmVudA0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgLy9pZiB0aGUgbWVzc2FnZSBpcyBuZXV0cmFsDQotICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24sIHRydWUpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGFic3RyYWN0IG1ldGhvZHMNCi0gICAgICovDQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCk7DQotDQotICAgIC8qDQotICAgICAqIGltcGxlbWVudHMgdGhlIHNwZWNpZmljIHZhbGlkYXRpb24gbG9naWMNCi0gICAgICovDQotDQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKTsNCi0NCi0gICAgLyoNCi0gICAgICogcmV0dXJucyB0aGUgcmVmZXJlbmNlZCB2YWxpZGF0aW9uIHRhcmdldHMgb2YgdGhlIGFubm90YXRpb24NCi0gICAgICogZS5nLiBARGF0ZUlzKHR5cGUgPSBEYXRlSXNUeXBlLmJlZm9yZSwgdmFsdWUgPSAiZmluYWxFeGFtIikNCi0gICAgICogLT4gbWV0aG9kIHJldHVybnMgYW4gYXJyYXkgd2l0aCBvbmUgdmFsdWUgKCJmaW5hbEV4YW0iKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbik7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YzgxYmIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzDQotICAgIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICAvL2luaXQgY3Jvc3MtdmFsaWRhdGlvbg0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5ID0NCi0gICAgICAgICAgICBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKS5hZGQoZW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5ID0gbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgpOw0KLQ0KLSAgICAgICAgZW50cnkuc2V0TWV0YURhdGFFbnRyeShtZXRhRGF0YUVudHJ5KTsNCi0gICAgICAgIGVudHJ5LnNldENvbXBvbmVudCh1aUNvbXBvbmVudCk7DQotICAgICAgICBlbnRyeS5zZXRDbGllbnRJZCh1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpKTsNCi0gICAgICAgIGVudHJ5LnNldENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgZW50cnkuc2V0VmFsaWRhdGlvblN0cmF0ZWd5KHRoaXMpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGVudHJ5Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vdCBhdmFpbGFibGUgZm9yIGNyb3NzIHZhbGlkYXRpb24gLSB1c2UgcHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24iKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRMYWJlbChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgYXZhaWxhYmxlIGZvciBjcm9zcyB2YWxpZGF0aW9uIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIC8vbm90IGF2YWlsYWJsZSBmb3IgY3Jvc3MgdmFsaWRhdGlvbiAtIHVzZSBpbml0Q3Jvc3NWYWxpZGF0aW9uDQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdENyb3NzVmFsaWRhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICAvL292ZXJyaWRlIGlmIG5lZWRlZA0KLSAgICB9DQotDQotICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbXBvbmVudCgpLCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksIHZhbGlkYXRvckV4Y2VwdGlvbiwgdGhpcyk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25IZWxwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOTA4OWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLlByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnksDQotICAgICAgICAgICAgYm9vbGVhbiBpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LmlzVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL3Byb2Nlc3MgYWZ0ZXIgdmlvbGF0aW9uDQotICAgICAgICAgICAgLy9qdXN0IGFkZCBtZXNzYWdlcw0KLSAgICAgICAgICAgIGlmKCFpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1RhcmdldEFmdGVyQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzVGFyZ2V0QWZ0ZXJNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy90aG93IGV4Y2VwdGlvbg0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NUYXJnZXRBZnRlckNyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSkNCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSA9IG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoKTsNCi0NCi0gICAgICAgIGlmIChjb21wYXJlU3RyYXRlZ3kudXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coc291cmNlQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29tcG9uZW50KHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb21wb25lbnQoKSk7DQotICAgICAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENsaWVudElkKHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDbGllbnRJZCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29tcG9uZW50KHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSk7DQotICAgICAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENsaWVudElkKHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDbGllbnRJZCgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb252ZXJ0ZWRPYmplY3QodmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCkpOw0KLSAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldFZhbGlkYXRpb25TdHJhdGVneShjb21wYXJlU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgLy9hZGQgbWVzc2FnZQ0KLSAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgc291cmNlQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc1RhcmdldEFmdGVyTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgLy9ubyB0YXJnZXQgLSBiZWNhdXNlIHRoZXJlIGlzIG5vIHRhcmdldCBjb21wb25lbnQgLSB2YWx1ZSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1vZGVsDQotICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgbnVsbCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzdkODcyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICB2b2lkIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpDQotICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzJmYTcxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRGF0ZUlzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRGF0ZUlzVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0Ow0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGF0ZUlzU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PX0VBUkxZID0gImVhcmx5IjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PX0xBVEUgPSAibGF0ZSI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9FUVVBTF9EQVRFX1RJTUUgPSAibm90IGVxdWFsIjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWSA9ICJyZXN1bHQiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QQVJFRF9WQUxVRV9LRVkgPSAidGFyZ2V0IHZhbHVlIjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVWRVJTRV9DT01QQVJFRF9WQUxVRV9LRVkgPSAicmV2ZXJzZSB0YXJnZXQgdmFsdWUiOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZygNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICAvL1RPRE8gdGVzdCAmIHJlbW92ZQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlU291cmNlVmlvbGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLCBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gdmlvbGF0aW9uRm91bmQ7DQotDQotICAgICAgICBpZiAoKChEYXRlSXMpIGFubm90YXRpb24pLnR5cGUoKS5lcXVhbHMoRGF0ZUlzVHlwZS5zYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IG9iamVjdDEgIT0gbnVsbCAmJiAhb2JqZWN0MS5lcXVhbHMob2JqZWN0Mik7DQotDQotICAgICAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVNVTFRfS0VZLCBOT1RfRVFVQUxfREFURV9USU1FKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmICgoKERhdGVJcykgYW5ub3RhdGlvbikudHlwZSgpLmVxdWFscyhEYXRlSXNUeXBlLmJlZm9yZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSBvYmplY3QxICE9IG51bGwgJiYgb2JqZWN0MiAhPSBudWxsICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICghbmV3IERhdGUoKChEYXRlKSBvYmplY3QxKS5nZXRUaW1lKCkpLmJlZm9yZSgoRGF0ZSkgb2JqZWN0MikgfHwgb2JqZWN0MS5lcXVhbHMob2JqZWN0MikpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVTVUxUX0tFWSwgVE9PX0xBVEUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IG9iamVjdDEgIT0gbnVsbCAmJiBvYmplY3QyICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFuZXcgRGF0ZSgoKERhdGUpIG9iamVjdDEpLmdldFRpbWUoKSkuYWZ0ZXIoKERhdGUpIG9iamVjdDIpIHx8IG9iamVjdDEuZXF1YWxzKG9iamVjdDIpKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFU1VMVF9LRVksIFRPT19FQVJMWSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoQ09NUEFSRURfVkFMVUVfS0VZLCBvYmplY3QxKTsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFVkVSU0VfQ09NUEFSRURfVkFMVUVfS0VZLCBvYmplY3QyKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB2aW9sYXRpb25Gb3VuZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChEYXRlSXMpIGFubm90YXRpb24pLnZhbHVlT2YoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBwcm90ZWN0ZWQNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IChTdHJpbmcpIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5nZXQoUkVTVUxUX0tFWSk7DQotDQotICAgICAgICBpZiAoIWlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHJldmVyc2VSZXN1bHQocmVzdWx0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChUT09fRUFSTFkuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldE5vdEFmdGVyRXJyb3JNc2dLZXkoKERhdGVJcykgYW5ub3RhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChUT09fTEFURS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0Tm90QmVmb3JlRXJyb3JNc2dLZXkoKERhdGVJcykgYW5ub3RhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldE5vdEVxdWFsRXJyb3JNc2dLZXkoKERhdGVJcykgYW5ub3RhdGlvbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmV2ZXJzZVJlc3VsdChTdHJpbmcgcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBpZiAoVE9PX0VBUkxZLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBUT09fTEFURTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gVE9PX0VBUkxZOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KSwgYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgICAgICB9DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGZhbHNlKSwgYW5ub3RhdGlvbiwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBmYWxzZSkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGFubm90YXRpb24sIGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbikNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKFN0cmluZyBrZXksIEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSByZXNvbHZlTWVzc2FnZShrZXkpOw0KLQ0KLSAgICAgICAgRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKChEYXRlSXMpIGFubm90YXRpb24pLmVycm9yTWVzc2FnZURhdGVTdHlsZSgpLA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpKTsNCi0NCi0gICAgICAgIFN0cmluZyByZXN1bHQ7DQotDQotICAgICAgICBpZihpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBtZXNzYWdlLnJlcGxhY2UoInswfSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdC5mb3JtYXQoKERhdGUpIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5nZXQoQ09NUEFSRURfVkFMVUVfS0VZKSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IG1lc3NhZ2UucmVwbGFjZSgiezB9IiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0LmZvcm1hdCgoRGF0ZSkgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLmdldChSRVZFUlNFX0NPTVBBUkVEX1ZBTFVFX0tFWSkpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vcmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgb3RoZXIgY29tcG9uZW50DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHByaXZhdGUNCi0gICAgICovDQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5vdEFmdGVyRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpLmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24ubm90QWZ0ZXJFcnJvck1zZ0tleSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90QmVmb3JlRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpLmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24ubm90QmVmb3JlRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5vdEVxdWFsRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpLmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24ubm90RXF1YWxFcnJvck1zZ0tleSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODQ2YTI2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRUxDb21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogcmVmZXJlbmNpbmcgdmFsaWRhdGlvbiB0YXJnZXRzIC0gcG9zc2libGUgZm9ybWF0czoNCi0gKiAiI3tbYmVhbl9uYW1lXS5bcHJvcGVydHlfbmFtZV19IiAuLi4gY3Jvc3MtZW50aXR5IHZhbGlkYXRpb24gd2l0aCB2YWx1ZSBiaW5kaW5nDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIEVMQ29tcGFyZVN0cmF0ZWd5IGltcGxlbWVudHMgUmVmZXJlbmNpbmdTdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQodmFsaWRhdGlvblRhcmdldCkgJiYNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YWxpZGF0aW9uVGFyZ2V0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb1ZhbGlkYXRlVmFsdWVCaW5kaW5nKA0KLSAgICAgICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsaWRhdGlvblRhcmdldCksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsIGNvbXBhcmVTdHJhdGVneSk7DQotDQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInRlc3QiKQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlVmFsdWVCaW5kaW5nKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5ID0NCi0gICAgICAgICAgICAgICAgcmVzb2x2ZVRhcmdldEZvckNyb3NzQ29tcG9uZW50VmFsaWRhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXQpOw0KLQ0KLSAgICAgICAgaWYodmFsaWRhdGlvblRhcmdldEVudHJ5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgcmVzb2x2ZVRhcmdldEZvckNyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsaWRhdGlvblRhcmdldCkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4ga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nID0NCi0gICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0S2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcoKTsNCi0NCi0gICAgICAgIHJldHVybiBDcm9zc1ZhbGlkYXRpb25VdGlscy5yZXNvbHZlVmFsaWRhdGlvblRhcmdldEVudHJ5KA0KLSAgICAgICAgICAgICAgICBrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcsDQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmNvbnZlcnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uVG9Qcm9jZXNzZWRJbmZvcm1hdGlvbktleSh2YWxpZGF0aW9uVGFyZ2V0KSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSkNCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWxpZGF0aW9uVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgT2JqZWN0IHRhcmdldFZhbHVlID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRWYWx1ZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsIHZhbGlkYXRpb25UYXJnZXQpOw0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB0YXJnZXRFbnRyeSA9IG5ldyBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5KCk7DQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRCZWFuKA0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFZhbHVlT2ZFeHByZXNzaW9uKGZhY2VzQ29udGV4dCwgdmFsaWRhdGlvblRhcmdldC5nZXRCYXNlRXhwcmVzc2lvbigpKSk7DQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh0YXJnZXRWYWx1ZSk7DQotDQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEVudHJ5LCB0cnVlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VxdWFsc1N0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VxdWFsc1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMWU0YmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FcXVhbHNTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEVxdWFsc1N0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIHB1YmxpYyBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRXF1YWxzKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG9iamVjdDEgIT0gbnVsbCAmJiAhb2JqZWN0MS5lcXVhbHMob2JqZWN0Mik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRXF1YWxzKSBhbm5vdGF0aW9uKS52YWx1ZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxDb21wYXJlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxDb21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ4ZDk4Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotDQotLyoqDQotICogIltwcm9wZXJ0eV9uYW1lXSIgLi4uIGxvY2FsIHZhbGlkYXRpb24gLT4gY3Jvc3MtY29tcG9uZW50LCBidXQgbm8gY3Jvc3MtZW50aXR5IHZhbGlkYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgTG9jYWxDb21wYXJlU3RyYXRlZ3kgaW1wbGVtZW50cyBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LCBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25UYXJnZXQuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneSB3aWxsIGNvbnRpbnVlDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlTG9jYWxseSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0S2V5LA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4ga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nID0NCi0gICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0S2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcoKTsNCi0NCi0gICAgICAgIGJvb2xlYW4gaXNNb2RlbEF3YXJlVmFsaWRhdGlvbiA9DQotICAgICAgICAgICAgICAgIGlzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZywgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldEtleTsNCi0NCi0gICAgICAgIFN0cmluZyBzb3VyY2VLZXkgPSByZXNvbHZlU291cmNlS2V5KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICB0YXJnZXRLZXkgPSBzb3VyY2VLZXkuc3Vic3RyaW5nKDAsIHNvdXJjZUtleS5sYXN0SW5kZXhPZigiLiIpICsgMSkgKyB0YXJnZXRLZXk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9IENyb3NzVmFsaWRhdGlvblV0aWxzLnJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgICAgIGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZywgdGFyZ2V0S2V5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLQ0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25UYXJnZXRFbnRyeSAhPSBudWxsICYmIHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb21wb25lbnQoKSAhPSBudWxsICYmICFpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICAvL25vIHRhcmdldCAtIGJlY2F1c2UgdGhlcmUgaXMgbm8gdGFyZ2V0IGNvbXBvbmVudCAtIHZhbHVlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbW9kZWwNCi0gICAgICAgIGVsc2UgaWYoaXNNb2RlbEF3YXJlVmFsaWRhdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHVuc3VwcG9ydGVkQ2FzZShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVUYXJnZXRLZXkoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgU3RyaW5nIHRhcmdldEtleSkNCi0gICAgew0KLSAgICAgICAgLy9ubyByZWFsIHZhbHVlIGJpbmRpbmcgZXhwcmVzc2lvbg0KLSAgICAgICAgLy9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGp1c3QgaGVwbHMgdG8gcmVwbGFjZSB0aGUgcHJvcGVydHkgb2YgdGhlIGtleQ0KLSAgICAgICAgLy9oZXJlIG9ubHkgZG90LW5vdGF0aW9uIGlzIGFsbG93ZWQgLT4gbm8gcHJvYmxlbQ0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBiYXNlRXhwcmVzc2lvbiA9DQotICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7IiArIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsDQotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMuY2xhc3MpLmdldEtleSgpICsgIn0iKTsNCi0NCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2VPckFkZFByb3BlcnR5KGJhc2VFeHByZXNzaW9uLCB0YXJnZXRLZXkpDQotICAgICAgICAgICAgLmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgIHJldHVybiByZXN1bHQuc3Vic3RyaW5nKDIsIHJlc3VsdC5sZW5ndGgoKSAtMSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRWYWx1ZU9mUHJvcGVydHkoT2JqZWN0IGJhc2UsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEsIHByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgICAgIE1ldGhvZCB0YXJnZXRNZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoYmFzZS5nZXRDbGFzcygpLCAiZ2V0IiArIHByb3BlcnR5KTsNCi0NCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZChiYXNlLmdldENsYXNzKCksICJpcyIgKyBwcm9wZXJ0eSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAiY2xhc3MgIiArIGJhc2UuZ2V0Q2xhc3MoKSArICIgaGFzIG5vIHB1YmxpYyBnZXQvaXMgIiArIHByb3BlcnR5LnRvTG93ZXJDYXNlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZChiYXNlLCB0YXJnZXRNZXRob2QpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcsDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IGNyZWF0ZVRhcmdldEtleShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEtleSk7DQotDQotICAgICAgICByZXR1cm4gIWtleUNvbnZlcnRlZFZhbHVlTWFwcGluZy5jb250YWluc0tleShuZXdLZXkpOw0KLQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHJlc29sdmVTb3VyY2VLZXkoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBTdHJpbmcgc291cmNlS2V5ID0gcHJvcGVydHlEZXRhaWxzLmdldEtleSgpOw0KLQ0KLSAgICAgICAgaWYoIXNvdXJjZUtleS5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNvdXJjZSBwYXRoOiAiICsgc291cmNlS2V5ICsgIiBpbnZhbGlkIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc291cmNlS2V5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB1bnN1cHBvcnRlZENhc2UoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBjb252ZXJ0ZWQgb2JqZWN0IGZvciAiICsgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKS5nZXRLZXkoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5LCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB0YXJnZXRFbnRyeSA9IG5ldyBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5KCk7DQotDQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRCZWFuKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcykuZ2V0QmFzZU9iamVjdCgpKTsNCi0gICAgICAgIHRhcmdldEVudHJ5DQotICAgICAgICAgICAgICAgIC5zZXRDb252ZXJ0ZWRWYWx1ZShnZXRWYWx1ZU9mUHJvcGVydHkodGFyZ2V0RW50cnkuZ2V0QmVhbigpLCB0YXJnZXRQcm9wZXJ0eSkpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRFbnRyeSwgdHJ1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MzUyYTEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqICJbbG9jYWxfcHJvcGVydHkucHJvcGVydHkxLnByb3BlcnR5Ml0iDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIExvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneSBleHRlbmRzIExvY2FsQ29tcGFyZVN0cmF0ZWd5DQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZighdmFsaWRhdGlvblRhcmdldC5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vbm90IHN1cHBvcnRlZCAtIFRPRE8gYWRkIGxvZ2dpbmcNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ5VG9WYWxpZGF0ZUxvY2FsbHkoDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlTG9jYWxseShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4ga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nID0NCi0gICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0S2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcoKTsNCi0NCi0gICAgICAgIFN0cmluZyBuZXdLZXkgPSBjcmVhdGVUYXJnZXRLZXkoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgaWYgKGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZy5jb250YWluc0tleShuZXdLZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5ID0ga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLmdldChuZXdLZXkpOw0KLQ0KLSAgICAgICAgICAgIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICAvL25vIHRhcmdldCAtIGJlY2F1c2UgdGhlcmUgaXMgbm8gdGFyZ2V0IGNvbXBvbmVudCAtIHZhbHVlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbW9kZWwNCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0S2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdGFyZ2V0SW5mb3JtYXRpb25FbnRyeSkNCi0gICAgew0KLSAgICAgICAgaWYgKGNvbXBhcmVTdHJhdGVneS5pc1Zpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICB0YXJnZXRJbmZvcm1hdGlvbkVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCksDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgPSBuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KCk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbXBvbmVudChjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDbGllbnRJZCh0YXJnZXRJbmZvcm1hdGlvbkVudHJ5LmdldENsaWVudElkKCkpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb252ZXJ0ZWRPYmplY3QodGFyZ2V0SW5mb3JtYXRpb25FbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpKTsNCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0VmFsaWRhdGlvblN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSk7DQotDQotICAgICAgICAgICAgLy9wcm9jZXNzIGFmdGVyIHZpb2xhdGlvbg0KLSAgICAgICAgICAgIC8vanVzdCBhZGQgbWVzc2FnZXMNCi0gICAgICAgICAgICBpZihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgbnVsbCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vdGhvdyBleGNlcHRpb24NCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBTdHJpbmcgdGFyZ2V0S2V5KQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgT2JqZWN0IG5ld0Jhc2UgPSBSZWZsZWN0aW9uVXRpbHMNCi0gICAgICAgICAgICAuZ2V0QmFzZU9mUHJvcGVydHlDaGFpbihwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgaWYodGFyZ2V0S2V5LmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9maW5kIHRoZSBsYXN0IHByb3BlcnR5DQotICAgICAgICAgICAgdGFyZ2V0S2V5ID0gdGFyZ2V0S2V5LnN1YnN0cmluZyh0YXJnZXRLZXkubGFzdEluZGV4T2YoIi4iKSArIDEsIHRhcmdldEtleS5sZW5ndGgoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBPYmplY3QgdGFyZ2V0VmFsdWUgPSBnZXRWYWx1ZU9mUHJvcGVydHkobmV3QmFzZSwgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdGFyZ2V0RW50cnkgPSBuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSgpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0QmVhbihuZXdCYXNlKTsNCi0gICAgICAgIHRhcmdldEVudHJ5LnNldENvbnZlcnRlZFZhbHVlKHRhcmdldFZhbHVlKTsNCi0NCi0gICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0RW50cnksIHRydWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxNWUyMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L05vdEVxdWFsc1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLk5vdEVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTm90RXF1YWxzU3RyYXRlZ3kgZXh0ZW5kcyBFcXVhbHNTdHJhdGVneQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoTm90RXF1YWxzKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLA0KLSAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICFzdXBlci5pc1Zpb2xhdGlvbihvYmplY3QxLCBvYmplY3QyLCBhbm5vdGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoTm90RXF1YWxzKSBhbm5vdGF0aW9uKS52YWx1ZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVmZXJlbmNpbmdTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NmQzZmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSW50ZXJuYWwgaW50ZXJmYWNlIHRvIGFsbG93IG11bHRpcGxlIHJlZmVyZW5jaW5nIHN0cmF0ZWdpZXMgZm9yIGNyb3NzIGNvbXBvbmVudCB2YWxpZGF0aW9uLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1pbnRlcmZhY2UgUmVmZXJlbmNpbmdTdHJhdGVneQ0KLXsNCi0gICAgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5KTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVxdWlyZWRJZlN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMDVhNWYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZlR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFJlcXVpcmVkSWZTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRmFjZXNCdW5kbGUgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoUmVxdWlyZWRJZikgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLCBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gdmlvbGF0aW9uRm91bmQgPSBmYWxzZTsNCi0NCi0gICAgICAgIGlmICgoKFJlcXVpcmVkSWYpIGFubm90YXRpb24pLmlzKCkuZXF1YWxzKFJlcXVpcmVkSWZUeXBlLmVtcHR5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IChvYmplY3QyID09IG51bGwgfHwgb2JqZWN0Mi5lcXVhbHMoIiIpKSAmJiAob2JqZWN0MSA9PSBudWxsIHx8IG9iamVjdDEuZXF1YWxzKCIiKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmICgoKFJlcXVpcmVkSWYpIGFubm90YXRpb24pLmlzKCkuZXF1YWxzKFJlcXVpcmVkSWZUeXBlLm5vdF9lbXB0eSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSAob2JqZWN0MiAhPSBudWxsICYmICFvYmplY3QyLmVxdWFscygiIikpICYmIChvYmplY3QxID09IG51bGwgfHwgb2JqZWN0MS5lcXVhbHMoIiIpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB2aW9sYXRpb25Gb3VuZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChSZXF1aXJlZElmKSBhbm5vdGF0aW9uKS52YWx1ZU9mKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMudXNlRmFjZXNCdW5kbGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2pwYV9zdHJhdGVneV9tYXBwaW5ncy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Q5OTI5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLkJhc2ljPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLklkPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZT1vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5KcGFWYWxpZGF0aW9uU3RyYXRlZ3kKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Dcm9zc1ZhbGlkYXRpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDNjM2FkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Dcm9zc1ZhbGlkYXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLlByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUk9TU19WQUxJREFUSU9OX1NUT1JBR0VfS0VZID0gQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBnZXRPckluaXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgTWFwIHJlcXVlc3RNYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpOw0KLQ0KLSAgICAgICAgaWYgKCFyZXF1ZXN0TWFwLmNvbnRhaW5zS2V5KENST1NTX1ZBTElEQVRJT05fU1RPUkFHRV9LRVkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKSByZXF1ZXN0TWFwLmdldChDUk9TU19WQUxJREFUSU9OX1NUT1JBR0VfS0VZKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0DQotICAgICAgICAgICAgICAgIC5nZXRDdXJyZW50SW5zdGFuY2UoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RXh0ZXJuYWxDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldFJlcXVlc3RNYXAoKQ0KLSAgICAgICAgICAgICAgICAucHV0KENST1NTX1ZBTElEQVRJT05fU1RPUkFHRV9LRVksIG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UT19DT05WRVJURURfVkFMVUVfTUFQUElOR19LRVkgPSBDcm9zc1ZhbGlkYXRpb25VdGlscy5jbGFzcy5nZXROYW1lKCk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4gZ2V0T3JJbml0S2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcoKQ0KLSAgICB7DQotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7DQotDQotICAgICAgICBpZiAoIXJlcXVlc3RNYXAuY29udGFpbnNLZXkoS0VZX1RPX0NPTlZFUlRFRF9WQUxVRV9NQVBQSU5HX0tFWSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzZXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PikgcmVxdWVzdE1hcC5nZXQoS0VZX1RPX0NPTlZFUlRFRF9WQUxVRV9NQVBQSU5HX0tFWSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0S2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgLnB1dChLRVlfVE9fQ09OVkVSVEVEX1ZBTFVFX01BUFBJTkdfS0VZLCBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSByZXNvbHZlVmFsaWRhdGlvblRhcmdldEVudHJ5KA0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXksIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSA9DQotICAgICAgICAgICAga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcuZ2V0KHRhcmdldEtleSk7DQotDQotICAgICAgICAvL3ZhbHVlIG5vdCBzdWJtaXR0ZWQgYXQgdGhpcyByZXF1ZXN0IC0gdXNlIG1vZGVsIHZhbHVlICh2YWxpZGF0aW9uIGFnYWluc3QgdGhlIG1vZGVsKQ0KLSAgICAgICAgaWYocHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9zaW1wbGUgY2FzZQ0KLSAgICAgICAgaWYgKHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuZ2V0RnVydGhlckVudHJpZXMoKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBPYmplY3QgdGFyZ2V0QmVhbiA9IHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCk7DQotDQotICAgICAgICAvL3Byb2Nlc3MgY29tcGxleCBjb21wb25lbnQgZW50cmllcyAoZS5nLiBhIHRhYmxlKQ0KLSAgICAgICAgLy9zdXBwb3J0ZWQ6IGNyb3NzLWNvbXBvbmVudCBidXQgbm8gY3Jvc3MtZW50aXR5IHZhbGlkYXRpb24gKD0gbG9jYWxlIHZhbGlkYXRpb24pDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5nZXRCZWFuKCkuZXF1YWxzKHRhcmdldEJlYW4pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZm9yIChQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IGVudHJ5IDogcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5nZXRGdXJ0aGVyRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbnRyeS5nZXRCZWFuKCkuZXF1YWxzKHRhcmdldEJlYW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJzdXBwb3J0IGZvciBtYXAgc3ludGF4IikNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFZhbHVlQmluZGluZ0V4cHJlc3Npb25Ub1Byb2Nlc3NlZEluZm9ybWF0aW9uS2V5KFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmJlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmJlLmdldEV4cHJlc3Npb25TdHJpbmcoKS5yZXBsYWNlKCIjeyIsICIiKS5yZXBsYWNlKCJ9IiwgIiIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODkzYmZmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMzkyNTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgUHJvcGVydHkgVmFsaWRhdGlvbiBNb2R1bGUNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBQcm9wZXJ0eSBWYWxpZGF0aW9uIE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFByb3BlcnR5IFZhbGlkYXRpb24gcHJvdmlkZXMgYW5ub3RhdGlvbiBiYXNlZCB2YWxpZGF0aW9uIGZvciBiZWFuIHByb3BlcnRpZXMuDQotICAgIEl0IGFsc28gcHJvdmlkZXMgSlBBIDEuMCBiYXNlZCB2YWxpZGF0aW9uIFN1cHBvcnQuDQotICANCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEuMS54IGFuZCBKU0YgMS4yLnguIEJvdGggdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzk1ZmU1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0OwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nOwotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlJbnB1dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5FeHRWYWxTdGFydHVwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWwuTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QudXRpbC5UZXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZF9pbXBsLmNvbmZpZy5NeWZhY2VzQ29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrRXh0ZXJuYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tGYWNlc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0ZhY2VzQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrSHR0cFNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0xpZmVjeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrTGlmZWN5Y2xlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrUmVuZGVyS2l0OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tSZXNwb25zZVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrU2VydmxldENvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrU2VydmxldENvbnRleHQ7Ci0KLS8qKgotICogQWJzdHJhY3QgU2hhbGUgVGVzdCBiYXNlIGNsYXNzLCB3aGljaCBzZXRzIHVwIHRoZSBKU0YgZW52aXJvbm1lbnQuICBJZiB0aGUgdGVzdAotICogb3ZlcnJpZGVzIDxjb2RlPnNldFVwKCk8L2NvZGU+IGFuZC9vciA8Y29kZT50ZWFyRG93bigpPC9jb2RlPiwgdGhlbiB0aG9zZQotICogbWV0aG9kcyBidXQgY2FsbCB0aGUgb3ZlcndpdHRlbiBtZXRob2QgdG8gaW5zdXJlIGEgdmFsaWQgdGVzdCBlbnZpcm9ubWVudC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwcm90ZWN0ZWQgTW9ja0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uOwotICAgIHByb3RlY3RlZCBNb2NrU2VydmxldENvbmZpZyBjb25maWc7Ci0gICAgcHJvdGVjdGVkIE1vY2tFeHRlcm5hbENvbnRleHQgZXh0ZXJuYWxDb250ZXh0OwotICAgIHByb3RlY3RlZCBNb2NrRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgTW9ja0ZhY2VzQ29udGV4dEZhY3RvcnkgZmFjZXNDb250ZXh0RmFjdG9yeTsKLSAgICBwcm90ZWN0ZWQgTW9ja0xpZmVjeWNsZSBsaWZlY3ljbGU7Ci0gICAgcHJvdGVjdGVkIE1vY2tMaWZlY3ljbGVGYWN0b3J5IGxpZmVjeWNsZUZhY3Rvcnk7Ci0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCByZW5kZXJLaXQ7Ci0gICAgcHJvdGVjdGVkIE1vY2tIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdDsKLSAgICBwcm90ZWN0ZWQgTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2U7Ci0gICAgcHJvdGVjdGVkIE1vY2tTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dDsKLSAgICBwcm90ZWN0ZWQgTW9ja0h0dHBTZXNzaW9uIHNlc3Npb247Ci0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciB0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXI7Ci0gICAgICAgIAotICAgIC8qKiBSZXNwb25zZSBXcml0ZXIgKi8KLSAgICBwcml2YXRlIE1vY2tSZXNwb25zZVdyaXRlciB3cml0ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICAgICAgYXBwbGljYXRpb24gPSBudWxsOwotICAgICAgICBjb25maWcgPSBudWxsOwotICAgICAgICBleHRlcm5hbENvbnRleHQgPSBudWxsOwotICAgICAgICBmYWNlc0NvbnRleHQgPSBudWxsOwotICAgICAgICBmYWNlc0NvbnRleHRGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgbGlmZWN5Y2xlID0gbnVsbDsKLSAgICAgICAgbGlmZWN5Y2xlRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIHJlbmRlcktpdCA9IG51bGw7Ci0gICAgICAgIHJlcXVlc3QgPSBudWxsOwotICAgICAgICByZXNwb25zZSA9IG51bGw7Ci0gICAgICAgIHNlcnZsZXRDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgc2Vzc2lvbiA9IG51bGw7Ci0gICAgICAgIHRocmVhZENvbnRleHRDbGFzc0xvYWRlciA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFNldHVwIHRoZSB0ZXN0IGVudmlyb25tZW50LCBpbmNsdWRpbmcgdGhlIGZvbGxvd2luZzoKLSAgICAgKiAgPHVsPgotICAgICAqICA8bGk+U2V0IHRoZSBBcHBsaWNhdGlvbiBNYXAuPC9saT4KLSAgICAgKiAgPGxpPlNldCBhIHJlc3BvbnNlIHdyaXRlcjwvbGk+Ci0gICAgICogIDxsaT5BZGQgVG9tYWhhd2sncyByZW5kZXJlcnMgdG8gdGhlIGZhY2VzIGNvbnRleHQuPC9saT4KLSAgICAgKiAgPC91bD4gCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFswXSwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKSk7Ci0gICAgICAgIHNlcnZsZXRDb250ZXh0ID0gbmV3IE1vY2tTZXJ2bGV0Q29udGV4dCgpOwotICAgICAgICAvL2ZvciB0ZXN0aW5nIHRoZSBmYWxsYmFjawotICAgICAgICAvL3NlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCArICIuREVBQ1RJVkFURV9FTF9SRVNPTFZFUiIsICJ0cnVlIik7Ci0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCArICIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSIsIE1vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGNvbmZpZyA9IG5ldyBNb2NrU2VydmxldENvbmZpZyhzZXJ2bGV0Q29udGV4dCk7Ci0gICAgICAgIHNlc3Npb24gPSBuZXcgTW9ja0h0dHBTZXNzaW9uKCk7Ci0gICAgICAgIHNlc3Npb24uc2V0U2VydmxldENvbnRleHQoc2VydmxldENvbnRleHQpOwotICAgICAgICByZXF1ZXN0ID0gbmV3IE1vY2tIdHRwU2VydmxldFJlcXVlc3Qoc2Vzc2lvbik7Ci0gICAgICAgIHJlcXVlc3Quc2V0U2VydmxldENvbnRleHQoc2VydmxldENvbnRleHQpOwotICAgICAgICByZXNwb25zZSA9IG5ldyBNb2NrSHR0cFNlcnZsZXRSZXNwb25zZSgpOwotICAgICAgICBGYWN0b3J5RmluZGVyLnJlbGVhc2VGYWN0b3JpZXMoKTsKLSAgICAgICAgRmFjdG9yeUZpbmRlci5zZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3RvcnkiLCAib3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0FwcGxpY2F0aW9uRmFjdG9yeSIpOwotICAgICAgICBGYWN0b3J5RmluZGVyLnNldEZhY3RvcnkoImphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0RmFjdG9yeSIsICJvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrRmFjZXNDb250ZXh0RmFjdG9yeSIpOwotICAgICAgICBGYWN0b3J5RmluZGVyLnNldEZhY3RvcnkoImphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGVGYWN0b3J5IiwgIm9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tMaWZlY3ljbGVGYWN0b3J5Iik7Ci0gICAgICAgIEZhY3RvcnlGaW5kZXIuc2V0RmFjdG9yeSgiamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3RvcnkiLCAib3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1JlbmRlcktpdEZhY3RvcnkiKTsKLSAgICAgICAgZXh0ZXJuYWxDb250ZXh0ID0gbmV3IE1vY2tFeHRlcm5hbENvbnRleHQoc2VydmxldENvbnRleHQsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgbGlmZWN5Y2xlRmFjdG9yeSA9IChNb2NrTGlmZWN5Y2xlRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoImphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGVGYWN0b3J5Iik7Ci0gICAgICAgIGxpZmVjeWNsZSA9IChNb2NrTGlmZWN5Y2xlKWxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlKCJERUZBVUxUIik7Ci0gICAgICAgIGZhY2VzQ29udGV4dEZhY3RvcnkgPSAoTW9ja0ZhY2VzQ29udGV4dEZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dEZhY3RvcnkiKTsKLSAgICAgICAgZmFjZXNDb250ZXh0ID0gKE1vY2tGYWNlc0NvbnRleHQpZmFjZXNDb250ZXh0RmFjdG9yeS5nZXRGYWNlc0NvbnRleHQoc2VydmxldENvbnRleHQsIHJlcXVlc3QsIHJlc3BvbnNlLCBsaWZlY3ljbGUpOwotICAgICAgICBleHRlcm5hbENvbnRleHQgPSAoTW9ja0V4dGVybmFsQ29udGV4dClmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCk7Ci0gICAgICAgIFVJVmlld1Jvb3Qgcm9vdCA9IG5ldyBVSVZpZXdSb290KCk7Ci0gICAgICAgIHJvb3Quc2V0Vmlld0lkKCIvdmlld0lkIik7Ci0gICAgICAgIHJvb3Quc2V0UmVuZGVyS2l0SWQoIkhUTUxfQkFTSUMiKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LnNldFZpZXdSb290KHJvb3QpOwotICAgICAgICBBcHBsaWNhdGlvbkZhY3RvcnkgYXBwbGljYXRpb25GYWN0b3J5ID0gKEFwcGxpY2F0aW9uRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoImphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeSIpOwotICAgICAgICBhcHBsaWNhdGlvbiA9IChNb2NrQXBwbGljYXRpb24pYXBwbGljYXRpb25GYWN0b3J5LmdldEFwcGxpY2F0aW9uKCk7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5zZXRBcHBsaWNhdGlvbihhcHBsaWNhdGlvbik7Ci0gICAgICAgIFJlbmRlcktpdEZhY3RvcnkgcmVuZGVyS2l0RmFjdG9yeSA9IChSZW5kZXJLaXRGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3RvcnkiKTsKLSAgICAgICAgLy9XcmFwIHJlbmRlcmVycyB3aXRoIHByb3BlciBleHZhbCB3cmFwcGVyCi0gICAgICAgIHJlbmRlcktpdCA9IG5ldyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKS5jcmVhdGUobmV3IE1vY2tSZW5kZXJLaXQoKSk7Ci0gICAgICAgIHJlbmRlcktpdEZhY3RvcnkuYWRkUmVuZGVyS2l0KCJIVE1MX0JBU0lDIiwgcmVuZGVyS2l0KTsgICAgICAgIAotICAgICAgICAKLSAgICAgICAgLy8gYWRkaXRpb25hbCBzZXR1cCBub3QgcHJvdmlkZWQgYXV0b21hdGljYWxseSBieSB0aGUgc2hhbGUgbW9jayBzdHVmZgotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25NYXAoKS5wdXQoTXlmYWNlc0NvbmZpZy5jbGFzcy5nZXROYW1lKCksIG5ldyBNeWZhY2VzQ29uZmlnKCkpOwotICAgICAgICB3cml0ZXIgPSBuZXcgTW9ja1Jlc3BvbnNlV3JpdGVyKG5ldyBTdHJpbmdXcml0ZXIoKSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5zZXRSZXNwb25zZVdyaXRlcih3cml0ZXIpOwotCi0gICAgICAgIFRlc3RVdGlscy5hZGREZWZhdWx0UmVuZGVyZXJzKGZhY2VzQ29udGV4dCk7Ci0gICAgICAgIFRlc3RVdGlscy5hZGREZWZhdWx0VmFsaWRhdG9ycyhmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIC8vZXhlY3V0ZSBzdGFydHVwIGxpc3RlbmVyCi0gICAgICAgIG5ldyBFeHRWYWxTdGFydHVwTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyLmluaXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfS5pbml0KCk7Ci0KLSAgICAgICAgbmV3IFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lcigpewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlci5pbml0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0uaW5pdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlYXIgZG93biB0aGUgdGVzdCBlbnZpcm9ubWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGFwcGxpY2F0aW9uID0gbnVsbDsKLSAgICAgICAgY29uZmlnID0gbnVsbDsKLSAgICAgICAgZXh0ZXJuYWxDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgZmFjZXNDb250ZXh0LnJlbGVhc2UoKTsKLSAgICAgICAgZmFjZXNDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgbGlmZWN5Y2xlID0gbnVsbDsKLSAgICAgICAgbGlmZWN5Y2xlRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIHJlbmRlcktpdCA9IG51bGw7Ci0gICAgICAgIHJlcXVlc3QgPSBudWxsOwotICAgICAgICByZXNwb25zZSA9IG51bGw7Ci0gICAgICAgIHNlcnZsZXRDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgc2Vzc2lvbiA9IG51bGw7Ci0gICAgICAgIEZhY3RvcnlGaW5kZXIucmVsZWFzZUZhY3RvcmllcygpOwotICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcih0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIpOwotICAgICAgICB0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIgPSBudWxsOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ3Jvc3NWYWxWYWxpZGF0aW9uKCkKLSAgICB7Ci0gICAgICAgIG5ldyBDcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyKCkuYWZ0ZXJQaGFzZShuZXcgUGhhc2VFdmVudCgoRmFjZXNDb250ZXh0KWZhY2VzQ29udGV4dCxQaGFzZUlkLkFOWV9QSEFTRSxsaWZlY3ljbGUpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tNZXNzYWdlQ291bnQoaW50IGV4cGVjdGVkKQotICAgIHsKLSAgICAgICAgaW50IGFjdHVhbCA9IDA7Ci0gICAgICAgIGZvcihJdGVyYXRvciBtZXNzYWdlcyA9IGZhY2VzQ29udGV4dC5nZXRNZXNzYWdlcygpOyBtZXNzYWdlcy5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlcy5uZXh0KCk7Ci0gICAgICAgICAgICBhY3R1YWwrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydEVxdWFscygiQ29tcGxldGUgbWVzc2FnZSBjb3VudCIsIGV4cGVjdGVkLCBhY3R1YWwpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrTWVzc2FnZUNvdW50KFN0cmluZyBjbGllbnRJZCwgaW50IGV4cGVjdGVkKQotICAgIHsKLSAgICAgICAgaW50IGFjdHVhbCA9IDA7Ci0gICAgICAgIGZvcihJdGVyYXRvciBtZXNzYWdlcyA9IGZhY2VzQ29udGV4dC5nZXRNZXNzYWdlcyhjbGllbnRJZCk7IG1lc3NhZ2VzLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lc3NhZ2VzLm5leHQoKTsKLSAgICAgICAgICAgIGFjdHVhbCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb21wbGV0ZSBtZXNzYWdlIGNvdW50IiwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFZlcmlmeSB0aGUgZm9sbG93aW5nOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+aWQgaXMgbm90IG51bGw8L2xpPgotICAgICAqIDxsaT5SZXNwb25zZSBpcyBjb21wbGV0ZTwvbGk+Ci0gICAgICogPGxpPlJlc3BvbmNlIGNvbnRhaW5zIHRoZSBpZDwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQgSUQgdG8gdmVyaWZ5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0SWRFeGlzdHMoU3RyaW5nIGlkKQotICAgIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiSUQgaXMgbm90IG51bGwiLCBpZCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlJlc3BvbnNlIENvbXBsZXRlIiwgZmFjZXNDb250ZXh0LmdldFJlc3BvbnNlQ29tcGxldGUoKSk7Ci0gICAgICAgIFN0cmluZyBvdXRwdXQgPSB3cml0ZXIuZ2V0V3JpdGVyKCkudG9TdHJpbmcoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiSGFzIG91dHB1dCIsIG91dHB1dCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkNvbnRhaW5zIGlkICciICsgaWQgKyAiJyIsIG91dHB1dC5pbmRleE9mKGlkKSAhPSAtMSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmFsdWVCaW5kaW5nKFVJSW5wdXQgdWlJbnB1dCwgU3RyaW5nIG5hbWUsIFN0cmluZyBleHByZXNzaW9uKQotICAgIHsKLSAgICAgICAgVmFsdWVCaW5kaW5nIHZhbHVlQmluZGluZyA9IGFwcGxpY2F0aW9uLmNyZWF0ZVZhbHVlQmluZGluZyhleHByZXNzaW9uKTsKLQotICAgICAgICBpZih1aUlucHV0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpSW5wdXQuc2V0VmFsdWVCaW5kaW5nKG5hbWUsIHZhbHVlQmluZGluZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSZXF1ZXN0U2NvcGVkQmVhbihTdHJpbmcgbmFtZSwgT2JqZWN0IGluc3RhbmNlKQotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKG51bGwsICJ2YWx1ZSIsICIjeyIgKyBuYW1lICsgIn0iKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKS5wdXQobmFtZSwgaW5zdGFuY2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCA8VD4gVCByZXNvbHZlQmVhbihTdHJpbmcgbmFtZSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbihuYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9CYXNlVmFsVGVzdEJlYW4uamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNldmFsL0Jhc2VWYWxUZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmY4NDdmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNldmFsL0Jhc2VWYWxUZXN0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZXZhbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uRG91YmxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5QYXR0ZXJuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7Ci0KLS8qKgotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQotICovCi1wdWJsaWMgY2xhc3MgQmFzZVZhbFRlc3RCZWFuCi17Ci0gICAgQFJlcXVpcmVkCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICAKLSAgICBATGVuZ3RoKG1pbmltdW09MixtYXhpbXVtPTMpCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTE7Ci0gICAgCi0gICAgQFBhdHRlcm4oIltBLVpdW2Etel0rIikKLSAgICBwcml2YXRlIFN0cmluZyBwYXR0ZXJuTmFtZTsKLSAgICAKLSAgICBARG91YmxlUmFuZ2UobWluaW11bT0tMzAwZCkKLSAgICBwcml2YXRlIERvdWJsZSBkb3VibGVWYWx1ZTE7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lMSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmFtZTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZTEoU3RyaW5nIG5hbWUxKQotICAgIHsKLSAgICAgICAgdGhpcy5uYW1lMSA9IG5hbWUxOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0dGVybk5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBhdHRlcm5OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm5OYW1lKFN0cmluZyBwYXR0ZXJuTmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMucGF0dGVybk5hbWUgPSBwYXR0ZXJuTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG91YmxlIGdldERvdWJsZVZhbHVlMSgpCi0gICAgewotICAgICAgICByZXR1cm4gZG91YmxlVmFsdWUxOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERvdWJsZVZhbHVlMShEb3VibGUgZG91YmxlVmFsdWUxKQotICAgIHsKLSAgICAgICAgdGhpcy5kb3VibGVWYWx1ZTEgPSBkb3VibGVWYWx1ZTE7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2V2YWwvQmFzZVZhbFRlc3RDYXNlLmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9CYXNlVmFsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M5NmEyNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9CYXNlVmFsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNldmFsOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2U7Ci0KLS8qKgotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQotICovCi1wdWJsaWMgY2xhc3MgQmFzZVZhbFRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UKLXsKLQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQgPSBudWxsOwotCi0gICAgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsKLSAgICAKLSAgICBCYXNlVmFsVGVzdEJlYW4gYmVhbiA9IG51bGw7Ci0KLSAgICBwdWJsaWMgQmFzZVZhbFRlc3RDYXNlKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50ID0gbnVsbDsKLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7Ci0gICAgICAgIGJlYW4gPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShCYXNlVmFsVGVzdENhc2UuY2xhc3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgYmVhbiA9IG5ldyBCYXNlVmFsVGVzdEJlYW4oKTsKLSAgICAgICAgVmFsdWVCaW5kaW5nIHZiID0gYXBwbGljYXRpb24uY3JlYXRlVmFsdWVCaW5kaW5nKCIje3Rlc3RCZWFufSIpOwotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dCgidGVzdEJlYW4iLCBiZWFuKTsKLQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsKLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOwotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7Ci0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50ID0gbmV3IEh0bWxJbnB1dFRleHQoKTsKLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudCk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldElkKCJpbnB1dDEiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50ID0gbnVsbDsKLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7Ci0gICAgICAgIGJlYW4gPSBudWxsOyAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWVSZXF1aXJlZEZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWV9Iik7Ci0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIiIpOwotCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWUxTGVuZ2h0TWF4RmFpbCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZTF9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIjEyMzQ1Iik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lMUxlbmdodENvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWUxfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZTFMZW5naHRNaW5GYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lMX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgieCIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFBhdHRlcm5OYW1lRmFpbCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucGF0dGVybk5hbWV9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIlBldGVyMSIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFBhdHRlcm5OYW1lQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucGF0dGVybk5hbWV9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIlBldGVyIik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydFRydWUoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7Ci0gICAgfSAgICAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVWYWx1ZUZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLmRvdWJsZVZhbHVlMX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiLTMwMSIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWVDb3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5kb3VibGVWYWx1ZTF9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIjIwMCIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOwotICAgICAgICBhc3NlcnRFcXVhbHMoMjAwZCwgaW5wdXRDb21wb25lbnQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIAotICAgICAgICBpbnB1dENvbXBvbmVudC51cGRhdGVNb2RlbChmYWNlc0NvbnRleHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMjAwZCwgYmVhbi5nZXREb3VibGVWYWx1ZTEoKSk7Ci0gICAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RCZWFuLmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjZiN2MyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jcm9zc3ZhbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsKLQotLyoqCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlCi0gKi8KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbFRlc3RCZWFuCi17Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTE7Ci0gICAgCi0gICAgQEVxdWFscygicHJvcGVydHkxIikgICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkyOwotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eTE7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MShTdHJpbmcgcHJvcGVydHkxKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7Ci0gICAgfQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eTI7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdENhc2UuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZTgwODUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jcm9zc3ZhbDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2U7Ci0KLS8qKgotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQotICovCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlCi17Ci0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MSA9IG51bGw7Ci0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOwotICAgIAotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIENyb3NzVmFsVGVzdENhc2UoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbnVsbDsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbnVsbDsKLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ3Jvc3NWYWxUZXN0Q2FzZS5jbGFzcyk7Ci0gICAgfSAgICAKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgQ3Jvc3NWYWxUZXN0QmVhbiBiZWFuID0gbmV3IENyb3NzVmFsVGVzdEJlYW4oKTsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKG51bGwsICJ2YWx1ZSIsICIje3Rlc3RCZWFufSIpOwotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dCgidGVzdEJlYW4iLGJlYW4pOwotICAgICAgICAKLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7Ci0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsKLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOwotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOyAgICAgICAgCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7Ci0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQxKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldElkKCJpbnB1dDEiKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbmV3IEh0bWxJbnB1dFRleHQoKTsKLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDIpOwotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0SWQoImlucHV0MiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc0NvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOwotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbFZhbGlkYXRpb24oKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7Ci0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOwotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDQiKTsKLSAgICAgICAgCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotICAgICAgICAKLQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxWYWxpZGF0aW9uKCk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDIpOwotCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9FTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0VMQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZWIxYWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0VMQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC51dGlsLk1ldGhvZFV0aWxzOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZSBleHRlbmRzIEVMQ3Jvc3NWYWxUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIEVMQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShFTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLQ0KLSAgICAgICAgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24oKTsNCi0NCi0gICAgICAgIGNvbmZpZy5hZGRNYXBwaW5nKEVxdWFscy5jbGFzcy5nZXROYW1lKCksIE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRywgY29uZmlnKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgcmV0ZXN0IHRoaXMgdGVzdC1jYXNlDQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHJldGVzdCB0aGlzIHRlc3QtY2FzZQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCk7DQotICAgICAgICBhc3NlcnRGYWxzZShNZXRob2RVdGlscy5pc01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKTsNCi0gICAgICAgIGFzc2VydFRydWUoTWV0aG9kVXRpbHMuaXNNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIikpOw0KLSAgICAgICAgLy8xeCBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeSBhbmQgMXggZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShNZXRob2RVdGlscy5jaGVja01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiLCAyKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjYxNWExLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9FTENyb3NzVmFsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkRhdGVUaW1lQ29udmVydGVyOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2U7DQotDQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFTENyb3NzVmFsVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZQ0KLXsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotDQotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHB1YmxpYyBFTENyb3NzVmFsVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShFTENyb3NzVmFsVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJiZWFuMSIsIGdldEVudGl0eUluc3RhbmNlKCkpOw0KLSAgICAgICAgY3JlYXRlUmVxdWVzdFNjb3BlZEJlYW4oImJlYW4yIiwgZ2V0RW50aXR5SW5zdGFuY2UoKSk7DQotDQotDQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsNCi0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsNCi0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7DQotDQotICAgICAgICAvL2lucHV0MQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRJZCgiaW5wdXQxIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0Q29udmVydGVyKG5ldyBEYXRlVGltZUNvbnZlcnRlcigpKTsNCi0gICAgICAgICgoRGF0ZVRpbWVDb252ZXJ0ZXIpaW5wdXRDb21wb25lbnQxLmdldENvbnZlcnRlcigpKS5zZXRQYXR0ZXJuKCJkZC5NTS55eXl5Iik7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50MSk7DQotDQotICAgICAgICAvL2lucHV0Mg0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRJZCgiaW5wdXQyIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0Q29udmVydGVyKG5ldyBEYXRlVGltZUNvbnZlcnRlcigpKTsNCi0gICAgICAgICgoRGF0ZVRpbWVDb252ZXJ0ZXIpaW5wdXRDb21wb25lbnQyLmdldENvbnZlcnRlcigpKS5zZXRQYXR0ZXJuKCJkZC5NTS55eXl5Iik7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Mik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZWFyRG93bigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZUVMQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlRUxDcm9zc0NvbXBvbmVudFZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxMi4xMi4yMDA4Iik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgyKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVFTENyb3NzQ29tcG9uZW50VmFsaWRhdGlvblVzZUNhc2UoU3RyaW5nIHZhbHVlQmVhbjFQcm9wZXJ0eTEsIFN0cmluZyB2YWx1ZUJlYW4xUHJvcGVydHkyLCBTdHJpbmcgdmFsdWVCZWFuMlByb3BlcnR5MSwgU3RyaW5nIHZhbHVlQmVhbjJQcm9wZXJ0eTIpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje2JlYW4xLmRhdGUxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7YmVhbjIuZGF0ZTJ9Iik7DQotDQotICAgICAgICAvL3NldCBtb2RlbCB2YWx1ZXMNCi0gICAgICAgIHJlc29sdmVCZWFuKCJiZWFuMSIsIGdldEVudGl0eUluc3RhbmNlKCkuZ2V0Q2xhc3MoKSkuc2V0RGF0ZTIoKERhdGUpaW5wdXRDb21wb25lbnQxLmdldENvbnZlcnRlcigpLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgaW5wdXRDb21wb25lbnQxLCB2YWx1ZUJlYW4xUHJvcGVydHkyKSk7DQotICAgICAgICByZXNvbHZlQmVhbigiYmVhbjIiLCBnZXRFbnRpdHlJbnN0YW5jZSgpLmdldENsYXNzKCkpLnNldERhdGUxKChEYXRlKWlucHV0Q29tcG9uZW50Mi5nZXRDb252ZXJ0ZXIoKS5nZXRBc09iamVjdChmYWNlc0NvbnRleHQsIGlucHV0Q29tcG9uZW50MiwgdmFsdWVCZWFuMlByb3BlcnR5MSkpOw0KLQ0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSh2YWx1ZUJlYW4xUHJvcGVydHkxKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSh2YWx1ZUJlYW4yUHJvcGVydHkyKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlRUxNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZUVMTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjEyLjEyLjIwMDgiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUVMTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvblVzZUNhc2UoU3RyaW5nIHZhbHVlQmVhbjFQcm9wZXJ0eTEsIFN0cmluZyB2YWx1ZUJlYW4xUHJvcGVydHkyLCBTdHJpbmcgdmFsdWVCZWFuMlByb3BlcnR5MSwgU3RyaW5nIHZhbHVlQmVhbjJQcm9wZXJ0eTIpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje2JlYW4xLmRhdGUxfSIpOw0KLQ0KLSAgICAgICAgLy9zZXQgbW9kZWwgdmFsdWVzDQotICAgICAgICByZXNvbHZlQmVhbigiYmVhbjEiLCBnZXRFbnRpdHlJbnN0YW5jZSgpLmdldENsYXNzKCkpLnNldERhdGUyKChEYXRlKWlucHV0Q29tcG9uZW50MS5nZXRDb252ZXJ0ZXIoKS5nZXRBc09iamVjdChmYWNlc0NvbnRleHQsIGlucHV0Q29tcG9uZW50MSwgdmFsdWVCZWFuMVByb3BlcnR5MikpOw0KLSAgICAgICAgcmVzb2x2ZUJlYW4oImJlYW4yIiwgZ2V0RW50aXR5SW5zdGFuY2UoKS5nZXRDbGFzcygpKS5zZXREYXRlMSgoRGF0ZSlpbnB1dENvbXBvbmVudDIuZ2V0Q29udmVydGVyKCkuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dENvbXBvbmVudDIsIHZhbHVlQmVhbjJQcm9wZXJ0eTEpKTsNCi0gICAgICAgIHJlc29sdmVCZWFuKCJiZWFuMiIsIGdldEVudGl0eUluc3RhbmNlKCkuZ2V0Q2xhc3MoKSkuc2V0RGF0ZTIoKERhdGUpaW5wdXRDb21wb25lbnQyLmdldENvbnZlcnRlcigpLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgaW5wdXRDb21wb25lbnQyLCB2YWx1ZUJlYW4yUHJvcGVydHkyKSk7DQotDQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKHZhbHVlQmVhbjFQcm9wZXJ0eTEpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgRUxDcm9zc1ZhbFRlc3REYXRlQmVhbiBnZXRFbnRpdHlJbnN0YW5jZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRUxDcm9zc1ZhbFRlc3REYXRlQmVhbigpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9FTENyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvRUxDcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGNkOGM1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9FTENyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRUxDcm9zc1ZhbFRlc3REYXRlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZSBERUZBVUxUX0RBVEUgPSBuZXcgRGF0ZSgpOw0KLQ0KLSAgICBARXF1YWxzKCIje2JlYW4yLmRhdGUyfSIpDQotICAgIHByaXZhdGUgRGF0ZSBkYXRlMSA9IERFRkFVTFRfREFURTsNCi0NCi0gICAgcHJpdmF0ZSBEYXRlIGRhdGUyID0gREVGQVVMVF9EQVRFOw0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlMSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkYXRlMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlMShEYXRlIGRhdGUxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRhdGUxID0gZGF0ZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGF0ZTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZTIoRGF0ZSBkYXRlMikNCi0gICAgew0KLSAgICAgICAgdGhpcy5kYXRlMiA9IGRhdGUyOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjRmOGYwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC51dGlsLk1ldGhvZFV0aWxzOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlIGV4dGVuZHMgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKExvY2FsUHJvcGVydHlDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0NCi0gICAgICAgIFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uKCk7DQotDQotICAgICAgICBjb25maWcuYWRkTWFwcGluZyhFcXVhbHMuY2xhc3MuZ2V0TmFtZSgpLCBNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsIGNvbmZpZyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExvY2FsUHJvcGVydHlDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCByZXRlc3QgdGhpcyB0ZXN0LWNhc2UNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgcmV0ZXN0IHRoaXMgdGVzdC1jYXNlDQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCk7DQotICAgICAgICBhc3NlcnRGYWxzZShNZXRob2RVdGlscy5pc01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiKSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCk7DQotICAgICAgICBhc3NlcnRUcnVlKE1ldGhvZFV0aWxzLmlzTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIpKTsNCi0gICAgICAgIC8vMXggZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkgYW5kIDF4IGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwNCi0gICAgICAgIGFzc2VydFRydWUoTWV0aG9kVXRpbHMuY2hlY2tNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIiwgMikpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZjdlZTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIExvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3RDYXNlIGV4dGVuZHMgRUxDcm9zc1ZhbFRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShMb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIEVMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4gZ2V0RW50aXR5SW5zdGFuY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IExvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3REYXRlQmVhbigpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ1NzEwNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdERhdGVCZWFuIGV4dGVuZHMgRUxDcm9zc1ZhbFRlc3REYXRlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZSBERUZBVUxUX0RBVEUgPSBuZXcgRGF0ZSgpOw0KLQ0KLSAgICBARXF1YWxzKCJkYXRlMiIpDQotICAgIHByaXZhdGUgRGF0ZSBkYXRlMSA9IERFRkFVTFRfREFURTsNCi0NCi0gICAgcHJpdmF0ZSBEYXRlIGRhdGUyID0gREVGQVVMVF9EQVRFOw0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlMSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkYXRlMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlMShEYXRlIGRhdGUxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRhdGUxID0gZGF0ZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGF0ZTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZTIoRGF0ZSBkYXRlMikNCi0gICAgew0KLSAgICAgICAgdGhpcy5kYXRlMiA9IGRhdGUyOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Nb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWY5MzM2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Nb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5LkVxdWFsc1N0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC51dGlsLk1ldGhvZFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgRXF1YWxzU3RyYXRlZ3kNCi17DQotICAgIHB1YmxpYyBNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgTWV0aG9kVXRpbHMuc2lnbmFsQ2xhc3NVc2VkKGdldENsYXNzKCkpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgTWV0aG9kVXRpbHMuc2lnbmFsTWV0aG9kQ2FsbGVkKGdldENsYXNzKCksICJyZXZlcnNlTWVzc2FnZSIpOw0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24pOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBNZXRob2RVdGlscy5zaWduYWxNZXRob2RDYWxsZWQoZ2V0Q2xhc3MoKSwgInJldmVyc2VNZXNzYWdlIik7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Nb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDFmMGZiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Nb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIE1vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5IGV4dGVuZHMgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGNyZWF0ZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIC8vZm9yY2UgaW5pdCBzbyB0aGF0IGV2ZXJ5IHRlc3QtY2FzZSBzZXR1cCBtZXRob2QgY2FuIGFkZCBhIG1vY2sgdmFsaWRhdGlvbiBzdHJhdGVneSB2aWEgZXh0dmFsIGphdmEtYXBpDQotICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodGhpcyxSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoZ2V0Q2xhc3MoKSwgImluaXRTdGF0aWNNYXBwaW5ncyIpKTsNCi0gICAgICAgIHJldHVybiBzdXBlci5jcmVhdGUobWV0YURhdGFLZXkpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEgYi9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDljOTBhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC51dGlsLk1ldGhvZFV0aWxzOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlIGV4dGVuZHMgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotDQotICAgICAgICBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbigpOw0KLQ0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoRXF1YWxzLmNsYXNzLmdldE5hbWUoKSwgTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHLCBjb25maWcpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCByZXRlc3QgdGhpcyB0ZXN0LWNhc2UNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgcmV0ZXN0IHRoaXMgdGVzdC1jYXNlDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKTsNCi0gICAgICAgIGFzc2VydEZhbHNlKE1ldGhvZFV0aWxzLmlzTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShNZXRob2RVdGlscy5pc01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiKSk7DQotICAgICAgICAvLzF4IGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5IGFuZCAxeCBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsDQotICAgICAgICBhc3NlcnRUcnVlKE1ldGhvZFV0aWxzLmNoZWNrTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIsIDIpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTQ1YThkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5EYXRlVGltZUNvbnZlcnRlcjsNCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UNCi17DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLQ0KLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgY3JlYXRlUmVxdWVzdFNjb3BlZEJlYW4oImJlYW4xIiwgZ2V0RW50aXR5SW5zdGFuY2UoKSk7DQotDQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsNCi0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsNCi0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7DQotDQotICAgICAgICAvL2lucHV0MQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRJZCgiaW5wdXQxIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0Q29udmVydGVyKG5ldyBEYXRlVGltZUNvbnZlcnRlcigpKTsNCi0gICAgICAgICgoRGF0ZVRpbWVDb252ZXJ0ZXIpaW5wdXRDb21wb25lbnQxLmdldENvbnZlcnRlcigpKS5zZXRQYXR0ZXJuKCJkZC5NTS55eXl5Iik7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50MSk7DQotDQotICAgICAgICAvL2lucHV0Mg0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRJZCgiaW5wdXQyIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0Q29udmVydGVyKG5ldyBEYXRlVGltZUNvbnZlcnRlcigpKTsNCi0gICAgICAgICgoRGF0ZVRpbWVDb252ZXJ0ZXIpaW5wdXRDb21wb25lbnQyLmdldENvbnZlcnRlcigpKS5zZXRQYXR0ZXJuKCJkZC5NTS55eXl5Iik7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Mik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZWFyRG93bigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZVByb3BlcnR5Q2hhaW5Dcm9zc0NvbXBvbmVudFZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZVByb3BlcnR5Q2hhaW5Dcm9zc0NvbXBvbmVudFZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjEyLjEyLjIwMDgiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVByb3BlcnR5Q2hhaW5Dcm9zc0NvbXBvbmVudFZhbGlkYXRpb25Vc2VDYXNlKFN0cmluZyB2YWx1ZUJlYW4xUHJvcGVydHkxLCBTdHJpbmcgdmFsdWVCZWFuMlByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7YmVhbjEuZGF0ZTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3tiZWFuMS5zdWJCZWFuLmRhdGUyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSh2YWx1ZUJlYW4xUHJvcGVydHkxKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSh2YWx1ZUJlYW4yUHJvcGVydHkyKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlRUxNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlRUxNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxMi4xMi4yMDA4Iik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKFN0cmluZyB2YWx1ZUJlYW4xUHJvcGVydHkxLCBTdHJpbmcgdmFsdWVCZWFuMlByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7YmVhbjEuZGF0ZTF9Iik7DQotDQotICAgICAgICAvL3NldCBtb2RlbCB2YWx1ZXMNCi0gICAgICAgIHJlc29sdmVCZWFuKCJiZWFuMSIsIGdldEVudGl0eUluc3RhbmNlKCkuZ2V0Q2xhc3MoKSkuZ2V0U3ViQmVhbigpLnNldERhdGUyKChEYXRlKWlucHV0Q29tcG9uZW50Mi5nZXRDb252ZXJ0ZXIoKS5nZXRBc09iamVjdChmYWNlc0NvbnRleHQsIGlucHV0Q29tcG9uZW50MiwgdmFsdWVCZWFuMlByb3BlcnR5MSkpOw0KLQ0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSh2YWx1ZUJlYW4xUHJvcGVydHkxKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbiBnZXRFbnRpdHlJbnN0YW5jZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVCZWFuKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDczZWI4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4NCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERhdGUgREVGQVVMVF9EQVRFID0gbmV3IERhdGUoKTsNCi0NCi0gICAgQEVxdWFscygic3ViQmVhbi5kYXRlMiIpDQotICAgIHByaXZhdGUgRGF0ZSBkYXRlMSA9IERFRkFVTFRfREFURTsNCi0NCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4gc3ViQmVhbiA9IG5ldyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4oKTsNCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGF0ZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZTEoRGF0ZSBkYXRlMSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5kYXRlMSA9IGRhdGUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4gZ2V0U3ViQmVhbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzdWJCZWFuOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFN1YkJlYW4oUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuIHN1YkJlYW4pDQotICAgIHsNCi0gICAgICAgIHRoaXMuc3ViQmVhbiA9IHN1YkJlYW47DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbi5qYXZhIGIvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzAxOWU0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlIERFRkFVTFRfREFURSA9IG5ldyBEYXRlKCk7DQotDQotICAgIHByaXZhdGUgRGF0ZSBkYXRlMiA9IERFRkFVTFRfREFURTsNCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGF0ZTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZTIoRGF0ZSBkYXRlMikNCi0gICAgew0KLSAgICAgICAgdGhpcy5kYXRlMiA9IGRhdGUyOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQzZjVjZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvblRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LkFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1wdWJsaWMgY2xhc3MgVmFsdWVCaW5kaW5nRXhwcmVzc2lvblRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFZhbHVlQmluZGluZ0V4cHJlc3Npb25UZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhbmRhcmRTeW50YXgoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xLnByb3BlcnR5MX0iKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjEucHJvcGVydHkxfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSwgInByb3BlcnR5MSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydwcm9wZXJ0eTEnXX0iKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjFbJ3Byb3BlcnR5MSddfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSwgInByb3BlcnR5MSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydiZWFuMiddLnByb3BlcnR5MX0iKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjFbJ2JlYW4yJ10ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xWydiZWFuMiddfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLCAicHJvcGVydHkxIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YW5kYXJkU3ludGF4UmVwbGFjZVByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMS5wcm9wZXJ0eTF9Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgInByb3BlcnR5MiIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMS5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLCAicHJvcGVydHkyIik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjFbJ3Byb3BlcnR5MSddfSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sICJwcm9wZXJ0eTIiKTsNCi0NCi0gICAgICAgIC8vVE9ETyByZXN0b3JlIG9yaWdpbmFsIHN5bnRheA0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMS5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLCAicHJvcGVydHkyIik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjFbJ2JlYW4yJ10ucHJvcGVydHkxfSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sICJwcm9wZXJ0eTIiKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjFbJ2JlYW4yJ10ucHJvcGVydHkyfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xWydiZWFuMiddfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLCAicHJvcGVydHkyIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YW5kYXJkU3ludGF4QWRkUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xLmJlYW4yfSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24uYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgInByb3BlcnR5MSIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMS5iZWFuMi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjEuYmVhbjJ9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLCAicHJvcGVydHkxIik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjFbJ2JlYW4yJ119Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5hZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAicHJvcGVydHkxIik7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xWydiZWFuMiddLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMVsnYmVhbjInXX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCksICJwcm9wZXJ0eTEiKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsnYmVhbjInXS5iZWFuM30iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sICJwcm9wZXJ0eTEiKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjFbJ2JlYW4yJ10uYmVhbjMucHJvcGVydHkxfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xWydiZWFuMiddLmJlYW4zfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24NCi0gICAgICAgICAgICAgICAgLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xWydiZWFuMiddfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSwgInByb3BlcnR5MSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWNlbGV0c0N1c3RvbUNvbXBvbmVudFN5bnRheCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7ZW50aXR5W2ZpZWxkTmFtZV19Iik7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2VudGl0eVtmaWVsZE5hbWVdfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2VudGl0eX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCksICJmaWVsZE5hbWUiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFjZWxldHNDdXN0b21Db21wb25lbnRTeW50YXhSZXBsYWNlUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2VudGl0eVtmaWVsZE5hbWVdfSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sICJuZXdGaWVsZE5hbWUiKTsNCi0NCi0gICAgICAgIC8vVE9ETyByZXN0b3JlIG9yaWdpbmFsIHN5bnRheA0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tlbnRpdHkubmV3RmllbGROYW1lfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2VudGl0eX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCksICJuZXdGaWVsZE5hbWUiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxleE1hcFN5bnRheCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjFbYmVhbjJbYmVhbjNbJ2tleTEnXV1dLnByb3BlcnR5MX0iKTsNCi0NCi0gICAgICAgIC8vVE9ETw0KLSAgICAgICAgLy9hc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xW2JlYW4yW2JlYW4zWydrZXkxJ11dXS5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLCAicHJvcGVydHkxIik7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3V0aWwvTWV0aG9kVXRpbHMuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC91dGlsL01ldGhvZFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNjlmYzcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3V0aWwvTWV0aG9kVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnV0aWw7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLS8vVE9ETw0KLXB1YmxpYyBjbGFzcyBNZXRob2RVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBNZXRob2RVdGlscygpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tNZXRob2RDYWxsZWQoQ2xhc3MgdXNlZENsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgaW50IGNhbGxDb3VudCkNCi0gICAgew0KLSAgICAgICAgY2hlY2tSZXF1aXJlZENsYXNzKHVzZWRDbGFzcyk7DQotDQotICAgICAgICByZXR1cm4gY2FsbENvdW50ID09IGdldE1ldGhvZENhbGxDb3VudCh1c2VkQ2xhc3MsIG1ldGhvZE5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01ldGhvZENhbGxlZChDbGFzcyB1c2VkQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKQ0KLSAgICB7DQotICAgICAgICBjaGVja1JlcXVpcmVkQ2xhc3ModXNlZENsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgICAgIC5jb250YWluc0tleSh1c2VkQ2xhc3MuZ2V0TmFtZSgpICsgIiMiICsgbWV0aG9kTmFtZSk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNpZ25hbE1ldGhvZENhbGxlZChDbGFzcyB1c2VkQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKQ0KLSAgICB7DQotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7DQotDQotICAgICAgICBpbnQgbWV0aG9kQ2FsbENvdW50ID0gMDsNCi0gICAgICAgIFN0cmluZyBrZXkgPSB1c2VkQ2xhc3MuZ2V0TmFtZSgpICsgIiMiICsgbWV0aG9kTmFtZTsNCi0NCi0gICAgICAgIGlmKHJlcXVlc3RNYXAuY29udGFpbnNLZXkoa2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRob2RDYWxsQ291bnQgPSAoSW50ZWdlcilyZXF1ZXN0TWFwLmdldChrZXkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmVxdWVzdE1hcC5wdXQoa2V5LCArK21ldGhvZENhbGxDb3VudCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldE1ldGhvZENhbGxDb3VudChDbGFzcyB1c2VkQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKQ0KLSAgICB7DQotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7DQotDQotICAgICAgICBTdHJpbmcga2V5ID0gdXNlZENsYXNzLmdldE5hbWUoKSArICIjIiArIG1ldGhvZE5hbWU7DQotDQotICAgICAgICBpZihyZXF1ZXN0TWFwLmNvbnRhaW5zS2V5KGtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChJbnRlZ2VyKXJlcXVlc3RNYXAuZ2V0KGtleSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2lnbmFsQ2xhc3NVc2VkKENsYXNzIG1vY2tDbGFzcykNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKQ0KLSAgICAgICAgICAgICAgICAucHV0KG1vY2tDbGFzcy5nZXROYW1lKCkgKyAiOnVzZWQiLCB0cnVlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDbGFzc1VzZWQoQ2xhc3MgbW9ja0NsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKQ0KLSAgICAgICAgICAgICAgICAuY29udGFpbnNLZXkobW9ja0NsYXNzLmdldE5hbWUoKSArICI6dXNlZCIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tSZXF1aXJlZENsYXNzKENsYXNzIHVzZWRDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc0NsYXNzVXNlZCh1c2VkQ2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24odXNlZENsYXNzLmdldE5hbWUoKSArICIgbm90IHVzZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdXRpbC9UZXN0VXRpbHMuamF2YSBiL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC91dGlsL1Rlc3RVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWVkMTYxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC91dGlsL1Rlc3RVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjZXNFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBUZXN0VXRpbHMKLXsKLSAgICAvKiogRGVmYXVsdCBMb2dnZXIgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVGVzdFV0aWxzLmNsYXNzKTsKLQotICAgIC8qKiB1dGlsaXR5IGNsYXNzLCBkbyBub3QgaW5zdGFudGlhdGUgKi8KLSAgICBwcml2YXRlIFRlc3RVdGlscygpCi0gICAgewotICAgICAgICAvLyB1dGlsaXR5IGNsYXNzLCBkaXNhYmxlIGluc3RhbnRpYXRpb24KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZERlZmF1bHRWYWxpZGF0b3JzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpCi0gICAgewotICAgICAgICBhZGRWYWxpZGF0b3IoZmFjZXNDb250ZXh0LCJqYXZheC5mYWNlcy5Eb3VibGVSYW5nZSIsICJqYXZheC5mYWNlcy52YWxpZGF0b3IuRG91YmxlUmFuZ2VWYWxpZGF0b3IiKTsKLSAgICAgICAgYWRkVmFsaWRhdG9yKGZhY2VzQ29udGV4dCwiamF2YXguZmFjZXMuTGVuZ3RoIiwgImphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3IiKTsKLSAgICAgICAgYWRkVmFsaWRhdG9yKGZhY2VzQ29udGV4dCwiamF2YXguZmFjZXMuTG9uZ1JhbmdlIiwgImphdmF4LmZhY2VzLnZhbGlkYXRvci5Mb25nUmFuZ2VWYWxpZGF0b3IiKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFZhbGlkYXRvcihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRvcklkLCBTdHJpbmcgdmFsaWRhdG9yQ2xhc3MpCi0gICAgewotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5hZGRWYWxpZGF0b3IodmFsaWRhdG9ySWQsIHZhbGlkYXRvckNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYWxsIG9mIEpTRiAxLjIgZGVmYXVsdCByZW5kZXJlcnMuICBDdXJyZW50bHkgdGhpcyBpcyBub3QgdGllZCB0byAKLSAgICAgKiBmYWNlcy1jb25maWcueG1sLCBzbyBhbGwgY2hhbmdlIHRvIHRoZSBmaWxlIE1VU1QgYWxzbyBiZSBtYWRlIGhlcmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dAotICAgICAqIEB0b2RvIERvIG5vdCBhZGQgcmVuZGVyZXIgaWYgcmVuZGVyZXIgaXMgYWxyZWFkeSBhZGRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRGVmYXVsdFJlbmRlcmVycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQotICAgIHsKLSAgICAgICAgLy8gU3RhbmRhcmQgSFRNTCBSZW5kZXJlcnMKLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuQ29tbWFuZCIsICJqYXZheC5mYWNlcy5CdXR0b24iLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEJ1dHRvblJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0Qm9vbGVhbiIsCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkNoZWNrYm94IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxDaGVja2JveFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0TWFueSIsCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkNoZWNrYm94IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxDaGVja2JveFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuRm9ybSIsICJqYXZheC5mYWNlcy5Gb3JtIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxGb3JtUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5QYW5lbCIsICJqYXZheC5mYWNlcy5HcmlkIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxHcmlkUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5QYW5lbCIsICJqYXZheC5mYWNlcy5Hcm91cCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sR3JvdXBSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLklucHV0IiwgImphdmF4LmZhY2VzLkhpZGRlbiIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sSGlkZGVuUmVuZGVyZXIiKTsKLSAgICAgICAgCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkdyYXBoaWMiLCAiamF2YXguZmFjZXMuSW1hZ2UiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEltYWdlUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5PdXRwdXQiLCAiamF2YXguZmFjZXMuTGFiZWwiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbExhYmVsUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5PdXRwdXQiLCAiamF2YXguZmFjZXMuTGluayIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlua1JlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuQ29tbWFuZCIsICJqYXZheC5mYWNlcy5MaW5rIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMaW5rUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RPbmUiLAotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5MaXN0Ym94IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMaXN0Ym94UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RNYW55IiwKLSAgICAgICAgICAgICAgICAiamF2YXguZmFjZXMuTGlzdGJveCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlzdGJveFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0T25lIiwgImphdmF4LmZhY2VzLk1lbnUiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lbnVSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE1hbnkiLCAiamF2YXguZmFjZXMuTWVudSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTWVudVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuTWVzc2FnZSIsICJqYXZheC5mYWNlcy5NZXNzYWdlIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxNZXNzYWdlUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5PdXRwdXQiLCAiamF2YXguZmFjZXMuRm9ybWF0IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxGb3JtYXRSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk1lc3NhZ2VzIiwKLSAgICAgICAgICAgICAgICAiamF2YXguZmFjZXMuTWVzc2FnZXMiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lc3NhZ2VzUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RPbmUiLCAiamF2YXguZmFjZXMuUmFkaW8iLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFJhZGlvUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5TZWNyZXQiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFNlY3JldFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuRGF0YSIsICJqYXZheC5mYWNlcy5UYWJsZSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGFibGVSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLklucHV0IiwgImphdmF4LmZhY2VzLlRleHRhcmVhIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxUZXh0YXJlYVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuSW5wdXQiLCAiamF2YXguZmFjZXMuVGV4dCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGV4dFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuT3V0cHV0IiwgImphdmF4LmZhY2VzLlRleHQiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFRleHRSZW5kZXJlciIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIHJlbmRlcmVyIHRvIHRoZSBGYWNlc0NvbnRleHQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBGYWNlcyBDb250ZXh0Ci0gICAgICogQHBhcmFtIGZhbWlseSBDb21wb25lbmV0IEZhbWlseQotICAgICAqIEBwYXJhbSByZW5kZXJlclR5cGUgQ29tcG9uZW50IFR5cGUKLSAgICAgKiBAcGFyYW0gcmVuZGVyQ2xhc3NOYW1lIENsYXNzIE5hbWUgb2YgUmVuZGVyZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkUmVuZGVyZXIoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIGZhbWlseSwKLSAgICAgICAgICAgIFN0cmluZyByZW5kZXJlclR5cGUsIFN0cmluZyByZW5kZXJDbGFzc05hbWUpCi0gICAgewotICAgICAgICBSZW5kZXJlciByZW5kZXJlciA9IChqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXIpIG5ld0luc3RhbmNlKHJlbmRlckNsYXNzTmFtZSk7Ci0gICAgICAgIFJlbmRlcktpdCBraXQgPSBmYWNlc0NvbnRleHQuZ2V0UmVuZGVyS2l0KCk7Ci0gICAgICAgIGtpdC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgcmVuZGVyZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyaWVzIGEgQ2xhc3MubG9hZENsYXNzIHdpdGggdGhlIGNvbnRleHQgY2xhc3MgbG9hZGVyIG9mIHRoZSBjdXJyZW50IHRocmVhZCBmaXJzdCBhbmQKLSAgICAgKiBhdXRvbWF0aWNhbGx5IGZhbGxzIGJhY2sgdG8gdGhlIENsYXNzVXRpbHMgY2xhc3MgbG9hZGVyIChpLmUuIHRoZSBsb2FkZXIgb2YgdGhlCi0gICAgICogbXlmYWNlcy5qYXIgbGliKSBpZiBuZWNlc3NhcnkuCi0gICAgICogCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMKLSAgICAgKgotICAgICAqIEBwYXJhbSB0eXBlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgbm9uLXByaW1pdGl2ZSBub24tYXJyYXkgY2xhc3MKLSAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIENsYXNzCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0eXBlIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBjbGFzc0Zvck5hbWUoU3RyaW5nIHR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidHlwZSIpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVHJ5IFdlYkFwcCBDbGFzc0xvYWRlciBmaXJzdAotICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUodHlwZSwgZmFsc2UsIC8vIGRvIG5vdCBpbml0aWFsaXplIGZvciBmYXN0ZXIgc3RhcnR1cAotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGZhbGxiYWNrOiBUcnkgQ2xhc3NMb2FkZXIgZm9yIENsYXNzVXRpbHMgKGkuZS4gdGhlIG15ZmFjZXMuamFyIGxpYikKLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKHR5cGUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXAKLSAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWxzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2FtZSBhcyB7QGxpbmsgI2NsYXNzRm9yTmFtZShTdHJpbmcpfSwgYnV0IHRocm93cyBhIFJ1bnRpbWVFeGNlcHRpb24KLSAgICAgKiAoRmFjZXNFeGNlcHRpb24pIGluc3RlYWQgb2YgYSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLgotICAgICAqCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgQ2xhc3MKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHR5cGUgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgRmFjZXNFeGNlcHRpb24gaWYgY2xhc3Mgbm90IGZvdW5kCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3Mgc2ltcGxlQ2xhc3NGb3JOYW1lKFN0cmluZyB0eXBlKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjbGFzc0Zvck5hbWUodHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nLmVycm9yKCJDbGFzcyAiICsgdHlwZSArICIgbm90IGZvdW5kIiwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHdpdGggdGhlIHR5cGUgb2YgPGNvZGU+dHlwZTwvY29kZT4uCi0gICAgICogCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMKLSAgICAgKgotICAgICAqIEBwYXJhbSB0eXBlIFR5cGUgb2YgbmV3IGNsYXNzLgotICAgICAqIEByZXR1cm4gSW5zdGFuY2Ugb2YgdGhlIGNsYXNzIDxjb2RlPnR5cGU8L2NvZGU+Ci0gICAgICogQHRocm93cyBGYWNlc0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgdHlwZSkgdGhyb3dzIEZhY2VzRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAodHlwZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBuZXdJbnN0YW5jZShzaW1wbGVDbGFzc0Zvck5hbWUodHlwZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgPGNvZGU+Y2xheno8L2NvZGU+LgotICAgICAqIAotICAgICAqIE5vdGU6IFRoaXMgd2FzIGNvcGllZCBmcm9tIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWQudXRpbC5DbGFzc1V0aWxzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhenogQ2xhc3MgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mLgotICAgICAqIEByZXR1cm4gSW5zdGFuY2Ugb2YgdGhlIGNsYXNzIDxjb2RlPmNsYXp6PC9jb2RlPgotICAgICAqIEB0aHJvd3MgRmFjZXNFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoQ2xhc3MgY2xhenopIHRocm93cyBGYWNlc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjbGF6ei5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIkNsYXNzIDogIiArIGNsYXp6LmdldE5hbWUoKSArICIgbm90IGZvdW5kLiIsIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBGYWNlc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbmRlcmVyZWQgYSBjb21wb25lbnQsIGluY2x1ZGluZyBpdCdzIGNoaWxkcmVuLCB0aGVuIGNvbXBsZXRlIHRoZSByZXBvbnNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZXh0IEZhY2VzIENvbnRleHQKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50IENvbXBvbmVudCB0byBiZSByZW5kZXJlZC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFRocm93biB3aGlsZSByZW5kZXJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbmRlckNvbXBvbmVudChGYWNlc0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgIFVJQ29tcG9uZW50IGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlciByZW5kZXJlciA9IGNvbnRleHQuZ2V0UmVuZGVyS2l0KCkuZ2V0UmVuZGVyZXIoCi0gICAgICAgICAgICAgICAgY29tcG9uZW50LmdldEZhbWlseSgpLCBjb21wb25lbnQuZ2V0UmVuZGVyZXJUeXBlKCkpOwotICAgICAgICByZW5kZXJlci5lbmNvZGVCZWdpbihjb250ZXh0LCBjb21wb25lbnQpOwotICAgICAgICByZW5kZXJlci5lbmNvZGVDaGlsZHJlbihjb250ZXh0LCBjb21wb25lbnQpOwotICAgICAgICByZW5kZXJlci5lbmNvZGVFbmQoY29udGV4dCwgY29tcG9uZW50KTsKLSAgICAgICAgY29udGV4dC5yZXNwb25zZUNvbXBsZXRlKCk7Ci0gICAgICAgIGNvbnRleHQucmVuZGVyUmVzcG9uc2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9hc3NlbWJseS9wb20ueG1sIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvYXNzZW1ibHkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUzOTljZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9hc3NlbWJseS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWFzc2VtYmx5MTE8L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBBc3NlbWJseTwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+TXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBBc3NlbWJseSBpcyB1c2VkIHRvIGdlbmVyYXRlIAotICAgIC56aXAgYW5kIC50YXIuZ3ogZGlzdHJpYnV0aW9ucyA8L2Rlc2NyaXB0aW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvYXNzZW1ibHk8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy9hc3NlbWJseTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvYXNzZW1ibHk8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRlcGVuZGVuY3ktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktamF2YWRvYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZW5lcmljLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9qYXZhZG9jPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktc291cmNlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y29yZS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3NyYzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tIEVYRUNVVEUgbXZuIHBhY2thZ2UgdG8gZ2VuZXJhdGUgYXNzZW1ibHkgZmlsZXMgLS0+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfc3JjPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsMTEtJHt2ZXJzaW9ufS1zcmM8L2ZpbmFsTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfYmluPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+JHtiYXNlZGlyfS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwxMS0ke3ZlcnNpb259LWJpbjwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L291dDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmF0dGFjaGVkPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y29yZS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPCEtLSBTaW5jZSBleHR2YWwgY291bGQgYmUgYXN5bmMgcmVsZWFzZWQsIGFuIGdlbmVyYXRlZCBhc3NlbWJseSBjb3VsZCBjb250YWluIGRpZmZlcmVudAotICAgICAgICAgYXJ0aWZhY3QgdmVyc2lvbnMgLS0+Ci0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxjb3JlLnZlcnNpb24+MS4xLjItU05BUFNIT1Q8L2NvcmUudmVyc2lvbj4KLSAgICAgICAgPHRyaW5pZGFkLXN1cHBvcnQudmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9uPgotICAgICAgICA8Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb24+MS4xLjItU05BUFNIT1Q8L2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9uPgotICAgICAgICA8cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9uPjEuMS4yLVNOQVBTSE9UPC9wcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWwgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2Nzk1Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPmNvcmViaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAJPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+UkVBRE1FKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+TElDRU5TRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPk5PVElDRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPlJFTEVBU0UqPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9qYXZhZG9jPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmphdmFkb2M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3Jlc3JjLnhtbCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTE4NmM2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+Y29yZXNyYzwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPiAgCi0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAJPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+UkVBRE1FKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+TElDRU5TRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPk5PVElDRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPlJFTEVBU0UqPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+ICAgCi0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9zcmM8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+c3JjPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgotIApkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDViM2E1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5YmRiMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IKLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvcG9tLnhtbCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWY4NWE5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGU8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMS4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+Y2dsaWI8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2dsaWI8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4xXzM8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgPC9yZXNvdXJjZXM+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWVjZTU1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDDQotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMC8vRU4iDQotICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWZhY2VzY29uZmlnXzFfMS5kdGQiID4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08ZmFjZXMtY29uZmlnPg0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPg0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnN0YXJ0dXAuR2VuZXJpY01vZHVsZVN0YXJ0dXBMaXN0ZW5lcg0KLSAgICAgICAgPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyS2l0LmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGNlYzc2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyS2l0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5yZW5kZXJraXQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotDQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RJbnRlcmNlcHRvcjsNCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5LkVuaGFuY2VyOw0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kUHJveHk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsR2VuZXJpY1JlbmRlcktpdCBleHRlbmRzIEV4dFZhbFJlbmRlcktpdCBpbXBsZW1lbnRzIE1ldGhvZEludGVyY2VwdG9yDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFJlbmRlcktpdCBuZXdJbnN0YW5jZShSZW5kZXJLaXQgcmVuZGVyS2l0KQ0KLSAgICB7DQotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSByZW5kZXJLaXQuZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIC8vaXQncyBub3QgcG9zc2libGUgdG8gd3JhcCB0aGUgY29udmVydGVyIGFnYWluIC0gb2NjdXJzIGUuZy4gdW5kZXIgc29sYXJpcyArIGJlYSB3ZWJsb2dpYw0KLSAgICAgICAgaWYgKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkuY29udGFpbnMoIiQkRW5oYW5jZXJCeUNHTElCJCQiKQ0KLSAgICAgICAgICAgIHx8IGN1cnJlbnRDbGFzcy5nZXROYW1lKCkuY29udGFpbnMoIiQkRmFzdENsYXNzQnlDR0xJQiQkIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcktpdDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEVuaGFuY2VyIGVuaGFuY2VyID0gbmV3IEVuaGFuY2VyKCk7DQotICAgICAgICBlbmhhbmNlci5zZXRTdXBlcmNsYXNzKHJlbmRlcktpdC5nZXRDbGFzcygpKTsNCi0gICAgICAgIGVuaGFuY2VyLnNldENhbGxiYWNrKG5ldyBFeHRWYWxHZW5lcmljUmVuZGVyS2l0KHJlbmRlcktpdCkpOw0KLQ0KLSAgICAgICAgcmV0dXJuIChSZW5kZXJLaXQpIGVuaGFuY2VyLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgaW50ZXJjZXB0KE9iamVjdCBvYmosIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MsIE1ldGhvZFByb3h5IHByb3h5KSB0aHJvd3MgVGhyb3dhYmxlDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJnZXRSZW5kZXJlciIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRSZW5kZXJlcigoU3RyaW5nKWFyZ3NbMF0sIChTdHJpbmcpYXJnc1sxXSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJhZGRSZW5kZXJlciIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZFJlbmRlcmVyKChTdHJpbmcpYXJnc1swXSwgKFN0cmluZylhcmdzWzFdLCAoUmVuZGVyZXIpYXJnc1syXSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb3h5Lmludm9rZVN1cGVyKG9iaiwgYXJncyk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRXh0VmFsR2VuZXJpY1JlbmRlcktpdChSZW5kZXJLaXQgd3JhcHBlZCkNCi0gICAgew0KLSAgICAgICAgc3VwZXIod3JhcHBlZCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBSZW5kZXJlciBjcmVhdGVXcmFwcGVyKFJlbmRlcmVyIHJlbmRlcmVyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5uZXdJbnN0YW5jZShyZW5kZXJlcik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MjQxNzcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJXcmFwcGVyOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kSW50ZXJjZXB0b3I7Ci1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5LkVuaGFuY2VyOwotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RQcm94eTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGZpbmFsIGNsYXNzIEV4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIgZXh0ZW5kcyBFeHRWYWxSZW5kZXJlcldyYXBwZXIgaW1wbGVtZW50cyBNZXRob2RJbnRlcmNlcHRvcgotewotICAgIHB1YmxpYyBzdGF0aWMgUmVuZGVyZXIgbmV3SW5zdGFuY2UoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSByZW5kZXJlci5nZXRDbGFzcygpOwotCi0gICAgICAgIC8vdG8gYXZvaWQgcmUtd3JhcHBpbmcgLSBvY2N1cnMgZS5nLiB1bmRlciBzb2xhcmlzICsgYmVhIHdlYmxvZ2ljCi0gICAgICAgIGlmIChjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCIkJEVuaGFuY2VyQnlDR0xJQiQkIikgfHwKLSAgICAgICAgICAgIGN1cnJlbnRDbGFzcy5nZXROYW1lKCkuY29udGFpbnMoIiQkRmFzdENsYXNzQnlDR0xJQiQkIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJlcjsKLSAgICAgICAgfQotCi0gICAgICAgIEVuaGFuY2VyIGVuaGFuY2VyID0gbmV3IEVuaGFuY2VyKCk7Ci0gICAgICAgIGVuaGFuY2VyLnNldFN1cGVyY2xhc3MocmVuZGVyZXIuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIGVuaGFuY2VyLnNldENhbGxiYWNrKG5ldyBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyKHJlbmRlcmVyKSk7Ci0KLSAgICAgICAgcmV0dXJuIChSZW5kZXJlcikgZW5oYW5jZXIuY3JlYXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBpbnRlcmNlcHQoT2JqZWN0IG9iaiwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncywgTWV0aG9kUHJveHkgcHJveHkpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0Q29udmVydGVkVmFsdWUiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDb252ZXJ0ZWRWYWx1ZSgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdLCBhcmdzWzJdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZGVjb2RlIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWNvZGUoKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImVuY29kZUJlZ2luIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGVCZWdpbigoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZW5jb2RlQ2hpbGRyZW4iKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZUNoaWxkcmVuKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJlbmNvZGVFbmQiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZUVuZCgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiY29udmVydENsaWVudElkIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRDbGllbnRJZCgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChTdHJpbmcpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldFJlbmRlcnNDaGlsZHJlbiIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm1ldGhvZCAiICsgbWV0aG9kLmdldE5hbWUoKSArICIgY2FsbGVkIHdpdGhvdXQgcmVuZGVyaW5nLWludGVyY2VwdG9ycyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcHJveHkuaW52b2tlU3VwZXIob2JqLCBhcmdzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlcihSZW5kZXJlciB3cmFwcGVkKQotICAgIHsKLSAgICAgICAgc3VwZXIod3JhcHBlZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0dlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0dlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzVkMjhiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5DQotew0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyS2l0IGNyZWF0ZVdyYXBwZXIoUmVuZGVyS2l0IHJlbmRlcktpdCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVya2l0IHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcktpdC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgdmlhIGNnbGliIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5uZXdJbnN0YW5jZShyZW5kZXJLaXQpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3N0YXJ0dXAvR2VuZXJpY01vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YzdiNDEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkFic3RyYWN0U3RhcnR1cExpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdC5HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBHZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jbGFzcykuYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkobmV3IEdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI5YzM5ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGUgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlIHByb3ZpZGVzIGdlbmVyaWMgU3VwcG9ydCBmb3IgSlNGIGNvbXBvbmVudCBmcmFtZXdvcmtzIHdoaWNoIGhhdmUgc3BlY2lhbCByZXF1aXJlbWVudHMgKGUuZy4gUmljaEZhY2VzLCBNeUZhY2VzIFRvYmFnbywgLi4uKS4NCi0gIA0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS4xLnggYW5kIEpTRiAxLjIueC4gQm90aCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41Kw0KLSAgDQotICAgIA0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3BvbS54bWwgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTNhNWIwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotDQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQ29tcG9uZW50LVN1cHBvcnQgTW9kdWxlczwvbmFtZT4NCi0gICAgPHZlcnNpb24+MS4xLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxzY20+DQotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy9jb21wb25lbnQtc3VwcG9ydDwvY29ubmVjdGlvbj4NCi0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy9jb21wb25lbnQtc3VwcG9ydDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4NCi0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8yX3JjL2NvbXBvbmVudC1zdXBwb3J0PC91cmw+DQotICAgIDwvc2NtPg0KLQ0KLSAgICA8bW9kdWxlcz4NCi0gICAgICAgIDxtb2R1bGU+dHJpbmlkYWQtc3VwcG9ydDwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5nZW5lcmljLXN1cHBvcnQ8L21vZHVsZT4NCi0gICAgPC9tb2R1bGVzPg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPHByb3BlcnRpZXM+DQotICAgICAgICA8dHJpbmlkYWQudmVyc2lvbj4xLjAuNTwvdHJpbmlkYWQudmVyc2lvbj4NCi0gICAgPC9wcm9wZXJ0aWVzPg0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OWQzODcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgVHJpbmlkYWQgU3VwcG9ydCBNb2R1bGU8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMS4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cmVzb3VyY2VzPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICA8L3Jlc291cmNlcz4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJlZTM4NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQwotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMC8vRU4iCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlcy1jb25maWc+Ci0gICAgPGxpZmVjeWNsZT4KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0YXJ0dXAuVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIKLSAgICAgICAgPC9waGFzZS1saXN0ZW5lcj4KLSAgICA8L2xpZmVjeWNsZT4KLQotICAgIDxsaWZlY3ljbGU+Ci0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj4KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyCi0gICAgICAgIDwvcGhhc2UtbGlzdGVuZXI+Ci0gICAgPC9saWZlY3ljbGU+Ci08L2ZhY2VzLWNvbmZpZz4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUwZWI2OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkNsaWVudFZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotLyoqDQotICogaW4gY2FzZSBvZiBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIGEgdHJpbmlkYWQgY2xpZW50IHZhbGlkYXRvciBpcyBhZGRlZCB0byB0aGUgY29tcG9uZW50IGJhc2VkIG9uIHRoZSBtZXRhLWRhdGEuDQotICogYXQgdGhlIHBvc3RiYWNrOiB0aGUgZXh0dmFsIHZhbGlkYXRpb24gc3RyYXRlZ3kgZ2V0cyBjYWxsZWQgYW5kIGFmdGVyIHRoYXQgdGhlIGFkZGVkIHZhbGlkYXRvci4NCi0gKiB0aGlzIHdyYXBwZXIgcHJldmVudHMgc3VjaCBhIHNlcnZlci1zaWRlIGRvdWJsZSB2YWxpZGF0aW9uLg0KLSAqIGl0IGp1c3QgZGVsZWdhdGVzIHRoZSBjbGllbnQtc2lkZSBmdW5jdGlvbmFsaXR5Lg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyIGltcGxlbWVudHMgVmFsaWRhdG9yLCBDbGllbnRWYWxpZGF0b3IsIFNlcmlhbGl6YWJsZQ0KLXsNCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgQ2xpZW50VmFsaWRhdG9yIHdyYXBwZWQ7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE0MTQ1NDc4NDE3MDA2MjE0MTBMOw0KLQ0KLSAgICBwdWJsaWMgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKENsaWVudFZhbGlkYXRvciBjbGllbnRWYWxpZGF0b3IpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IGNsaWVudFZhbGlkYXRvcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCB2YWxpZGF0ZSAtIHRoZSBleHR2YWwgdmFsaWRhdGlvbiBzdHJhdGVneSB3aWxsIGRvIHRoYXQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudExpYnJhcnlTb3VyY2UoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q2xpZW50TGlicmFyeVNvdXJjZShmYWNlc0NvbnRleHQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0Q2xpZW50SW1wb3J0TmFtZXMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRDbGllbnRJbXBvcnROYW1lcygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50U2NyaXB0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRDbGllbnRTY3JpcHQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRDbGllbnRWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYjRkYmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0LkV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5OwotCi0vKioKLSAqIHVzZSB0aGlzIHBoYXNlLWxpc3RlbmVyIGluc3RlYWQgb2YgYSBFeHRWYWxUcmluaWRhZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGR1ZSB0byBhIHRyaW5pZGFkIGlzc3VlCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcgotewotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBldmVudCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICAgIGlmKGV2ZW50LmdldFBoYXNlSWQoKSAhPSBQaGFzZUlkLkFQUExZX1JFUVVFU1RfVkFMVUVTICYmIGV2ZW50LmdldFBoYXNlSWQoKSAhPSBQaGFzZUlkLlJFTkRFUl9SRVNQT05TRSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsKLQotICAgICAgICBSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnkgPSAoUmVuZGVyS2l0RmFjdG9yeSkKLSAgICAgICAgICAgIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShGYWN0b3J5RmluZGVyLlJFTkRFUl9LSVRfRkFDVE9SWSk7Ci0KLSAgICAgICAgU3RyaW5nIHJlbmRlcktpdElkID0gZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZ2V0UmVuZGVyS2l0SWQoKTsKLQotICAgICAgICBpZihFeHRWYWxUcmluaWRhZFJlbmRlcktpdC5JRC5lcXVhbHMocmVuZGVyS2l0SWQpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBSZW5kZXJLaXQgcmVuZGVyS2l0ID0gcmVuZGVyS2l0RmFjdG9yeS5nZXRSZW5kZXJLaXQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCByZW5kZXJLaXRJZCk7Ci0gICAgICAgIHJlbmRlcktpdEZhY3RvcnkuYWRkUmVuZGVyS2l0KEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LklELCBuZXcgRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQocmVuZGVyS2l0KSk7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLnNldFJlbmRlcktpdElkKEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LklEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQaGFzZUlkLlJFTkRFUl9SRVNQT05TRTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUwY2I3NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJlbid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIC8qDQotICAgICAqIGRlYWN0aXZhdGUNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9DTElFTlRfU0lERV9UUklOSURBRF9WQUxJREFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0NMSUVOVF9TSURFX1RSSU5JREFEX1ZBTElEQVRJT04iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX1RSSU5JREFEX0NPUkVfT1VUUFVUX0xBQkVMX0lOSVRJQUxJWkFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1RSSU5JREFEX0NPUkVfT1VUUFVUX0xBQkVMX0lOSVRJQUxJWkFUSU9OIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9UUklOSURBRF9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9UUklOSURBRF9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiIpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMzI5ZjYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvRG91YmxlUmFuZ2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkRvdWJsZVJhbmdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgRG91YmxlUmFuZ2VJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7Ci0gICAgICAgIERvdWJsZVJhbmdlVmFsaWRhdG9yIGRvdWJsZVJhbmdlVmFsaWRhdG9yID0gKERvdWJsZVJhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5Eb3VibGVSYW5nZSIpOwotCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbWluID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pOwotCi0gICAgICAgICAgICBpZihtaW4gaW5zdGFuY2VvZiBEb3VibGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bSgoRG91YmxlKW1pbik7Ci0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1heExlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYKTsKLQotICAgICAgICAgICAgaWYobWF4TGVuZ3RoIGluc3RhbmNlb2YgRG91YmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oKERvdWJsZSltYXhMZW5ndGgpOwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkICYmCi0gICAgICAgICAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3IgaW5zdGFuY2VvZiBDbGllbnRWYWxpZGF0b3IgJiYgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKWRvdWJsZVJhbmdlVmFsaWRhdG9yKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xlbmd0aEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDEyMjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkNsaWVudFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgTGVuZ3RoSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW5mb3JtYXRpb25BZGRlZCA9IGZhbHNlOwotICAgICAgICAvL1RPRE8KLSAgICAgICAgTGVuZ3RoVmFsaWRhdG9yIGxlbmd0aFZhbGlkYXRvciA9IChMZW5ndGhWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkxlbmd0aCIpOwotCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSCk7Ci0KLSAgICAgICAgICAgIGlmKG1pbiBpbnN0YW5jZW9mIEludGVnZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1pbmltdW0oKEludGVnZXIpbWluKTsKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1heExlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCk7Ci0KLSAgICAgICAgICAgIGlmKG1heExlbmd0aCBpbnN0YW5jZW9mIEludGVnZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRNYXhpbXVtTGVuZ3RoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludC5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1heGltdW0oKEludGVnZXIpbWF4TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vcmVJbml0VmFsaWRhdG9ycygoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCwgbWV0YURhdGEpOyAvL3NlYXJjaCB3cmFwcGVycyBhbmQgY2FsbCAuZGVhY3RpdmF0ZQotCi0gICAgICAgIGlmKGluZm9ybWF0aW9uQWRkZWQgJiYgbGVuZ3RoVmFsaWRhdG9yIGluc3RhbmNlb2YgQ2xpZW50VmFsaWRhdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpbGVuZ3RoVmFsaWRhdG9yKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIENvcmVPdXRwdXRMYWJlbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsZW5ndGhWYWxpZGF0b3IuZ2V0TWluaW11bSgpID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgoQ29yZU91dHB1dExhYmVsKXVpQ29tcG9uZW50KS5zZXRTaG93UmVxdWlyZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChDb3JlT3V0cHV0TGFiZWwpdWlDb21wb25lbnQpLnNldFNob3dSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTG9uZ1JhbmdlSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xvbmdSYW5nZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYzM0ZGUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTG9uZ1JhbmdlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5Mb25nUmFuZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5DbGllbnRWYWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBMb25nUmFuZ2VJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7Ci0gICAgICAgIExvbmdSYW5nZVZhbGlkYXRvciBsb25nUmFuZ2VWYWxpZGF0b3IgPSAoTG9uZ1JhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5Mb25nUmFuZ2UiKTsKLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKTsKLQotICAgICAgICAgICAgaWYobWluIGluc3RhbmNlb2YgTG9uZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bSgoTG9uZyltaW4pOwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCk7Ci0KLSAgICAgICAgICAgIGlmKG1heExlbmd0aCBpbnN0YW5jZW9mIExvbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oKExvbmcpbWF4TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKGluZm9ybWF0aW9uQWRkZWQgJiYKLSAgICAgICAgICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3IgaW5zdGFuY2VvZiBDbGllbnRWYWxpZGF0b3IgJiYgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpbG9uZ1JhbmdlVmFsaWRhdG9yKSk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9QYXR0ZXJuSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZmMDg4ZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9QYXR0ZXJuSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5SZWdFeHBWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5DbGllbnRWYWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBQYXR0ZXJuSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCFtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIHBhdHRlcm5zID0gKFN0cmluZ1tdKW1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTik7Ci0KLSAgICAgICAgUmVnRXhwVmFsaWRhdG9yIHJlZ0V4cFZhbGlkYXRvcjsKLQotICAgICAgICBmb3IoU3RyaW5nIHBhdHRlcm4gOiBwYXR0ZXJucykKLSAgICAgICAgewotICAgICAgICAgICAgcmVnRXhwVmFsaWRhdG9yID0gKFJlZ0V4cFZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLlJlZ0V4cCIpOwotCi0gICAgICAgICAgICByZWdFeHBWYWxpZGF0b3Iuc2V0UGF0dGVybihwYXR0ZXJuKTsKLSAgICAgICAgICAgIHJlZ0V4cFZhbGlkYXRvci5zZXRNZXNzYWdlRGV0YWlsTm9NYXRjaCgoU3RyaW5nKW1ldGFEYXRhLmdldCgKLSAgICAgICAgICAgICAgICBDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTl9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UpKTsKLQotICAgICAgICAgICAgaWYocmVnRXhwVmFsaWRhdG9yIGluc3RhbmNlb2YgQ2xpZW50VmFsaWRhdG9yICYmIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIoKENsaWVudFZhbGlkYXRvcilyZWdFeHBWYWxpZGF0b3IpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OTlmZTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUmVxdWlyZWRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC51dGlsLlRyaW5pZGFkVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLm91dHB1dC5Db3JlT3V0cHV0TGFiZWw7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgUmVxdWlyZWRJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSB8fAotICAgICAgICAgICBtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCl8fAotICAgICAgICAgICBtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoKAotICAgICAgICAgICAgICAgICAgICAoIUJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJgotICAgICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCkpKSB8fAotICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSkKLSAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMoaXNDb21wb25lbnRSZXF1aXJlZCh1aUNvbXBvbmVudCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgQ29yZU91dHB1dExhYmVsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChDb3JlT3V0cHV0TGFiZWwpdWlDb21wb25lbnQpLnNldFNob3dSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpICYmCi0gICAgICAgICAgICAgICAgICAgIUJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIENvcmVPdXRwdXRMYWJlbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgoQ29yZU91dHB1dExhYmVsKXVpQ29tcG9uZW50KS5zZXRTaG93UmVxdWlyZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEJvb2xlYW4gaXNDb21wb25lbnRSZXF1aXJlZChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgQ29yZU91dHB1dExhYmVsKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aUNvbXBvbmVudCA9IFRyaW5pZGFkVXRpbHMuZmluZExhYmVsZWRFZGl0YWJsZUNvbXBvbmVudCgoQ29yZU91dHB1dExhYmVsKSB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgICAgIGlmKHVpQ29tcG9uZW50ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvL2NvbXBhcmUgd2l0aCBmYWxzZSBzbyB0cnVlID0gdHJ1ZSBvciBudWxsCi0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNSZWFkT25seSIpKSk7Ci0gICAgICAgIGJvb2xlYW4gaXNEaXNhYmxlZCA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNEaXNhYmxlZCIpKSk7Ci0KLSAgICAgICAgcmV0dXJuICEoaXNSZWFkT25seSB8fCBpc0Rpc2FibGVkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NjRjZTEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbnRleHQuUmVxdWVzdENvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUuaW5wdXQuQ29yZUlucHV0VGV4dCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUuaW5wdXQuQ29yZUlucHV0RGF0ZSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXI+IGNvbXBvbmVudEluaXRpYWxpemVycyA9Ci0gICAgICAgIG5ldyBBcnJheUxpc3Q8VHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcj4oKTsKLQotICAgIHN0YXRpYwotICAgIHsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgUmVxdWlyZWRJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgTGVuZ3RoSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IExvbmdSYW5nZUluaXRpYWxpemVyKCkpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBEb3VibGVSYW5nZUluaXRpYWxpemVyKCkpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBQYXR0ZXJuSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIC8vY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgVmFsaWRhdG9ySW5pdGlhbGl6ZXIoKSk7Ci0gICAgfQotCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gImNoZWNrIHBwciBpc3N1ZSIpCi0gICAgcHVibGljIGZpbmFsIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgZm9yKFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIgOiBjb21wb25lbnRJbml0aWFsaXplcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGNvbXBvbmVudEluaXRpYWxpemVyLmNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gVFJJTklEQURfQ09SRV9JTlBVVF9URVhULmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSkgfHwKLSAgICAgICAgICAgICAgIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURS5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBpZihSZXF1ZXN0Q29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5pc1BhcnRpYWxSZXF1ZXN0KGZhY2VzQ29udGV4dCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmFkZFBhcnRpYWxUYXJnZXQodWlDb21wb25lbnQuZ2V0UGFyZW50KCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVmFsaWRhdG9ySW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1ZhbGlkYXRvckluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODg3OGMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVmFsaWRhdG9ySW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHZhbHVlID0gVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTE9XLCBkZXNjcmlwdGlvbiA9ICJpbXBsLiB0cmluaWRhZCBlLW1haWwgdmFsaWRhdG9yIikKLWNsYXNzIFZhbGlkYXRvckluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZighbWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLkNVU1RPTSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuQ1VTVE9NKTsKLQotICAgICAgICBpZighKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvcihPYmplY3QgY3VycmVudFZhbHVlIDogKExpc3QpdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCEoY3VycmVudFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoQ29tbW9uTWV0YURhdGFLZXlzLkVNQUlMLmVxdWFscyhjdXJyZW50VmFsdWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vVE9ETwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNjdjZjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnV0aWwuVHJpbmlkYWRVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLm91dHB1dC5Db3JlT3V0cHV0TGFiZWw7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotcHVibGljIGNsYXNzIFRyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvciBleHRlbmRzIEFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcg0KLXsNCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpDQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmKGZpbHRlckNvcmVPdXRwdXRMYWJlbCh1aUNvbXBvbmVudCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdENvcmVPdXRwdXRMYWJlbChmYWNlc0NvbnRleHQsIChDb3JlT3V0cHV0TGFiZWwpdWlDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBmaWx0ZXJDb3JlT3V0cHV0TGFiZWwoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb3JlT3V0cHV0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgQ29yZU91dHB1dExhYmVsIGNvcmVPdXRwdXRMYWJlbCkNCi0gICAgew0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0NCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIGFubm90YXRpb25FeHRyYWN0b3IgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkuZ2V0RmFjdG9yeSgNCi0gICAgICAgICAgICBGYWN0b3J5TmFtZXMuQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmNsYXNzKS5jcmVhdGUoKTsNCi0NCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IFRyaW5pZGFkVXRpbHMuZmluZExhYmVsZWRFZGl0YWJsZUNvbXBvbmVudChjb3JlT3V0cHV0TGFiZWwpOw0KLQ0KLSAgICAgICAgaWYodGFyZ2V0Q29tcG9uZW50ID09IG51bGwgfHwgIWlzQ29tcG9uZW50RWRpdGFibGUodGFyZ2V0Q29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBCb29sZWFuIHNraXBJbml0aWFsaXphdGlvbiA9IGZhbHNlOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YTsNCi0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IGFubm90YXRpb25FeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHRhcmdldENvbXBvbmVudCkuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSBFeHRWYWxVdGlscy5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSk7DQotDQotICAgICAgICAgICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEgPSBtZXRhRGF0YVRyYW5zZm9ybWVyLmNvbnZlcnRNZXRhRGF0YShlbnRyeSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG51bGw7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYobWV0YURhdGEgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2V4ZWN1dGUgc2tpcCB2YWxpZGF0aW9uIHN0cmF0ZWd5IC0+IHNraXAgdmFsaWRhdGlvbiB5L24gaW4gZW50cnkNCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHRhcmdldENvbXBvbmVudCwgZW50cnksIG51bGwpOw0KLSAgICAgICAgICAgICAgICAgICAgc2tpcEluaXRpYWxpemF0aW9uID0gZW50cnkuZ2V0UHJvcGVydHkoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTiwgQm9vbGVhbi5jbGFzcyk7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZihCb29sZWFuLlRSVUUuZXF1YWxzKHNraXBJbml0aWFsaXphdGlvbikgJiYgIW1ldGFEYXRhLmlzRW1wdHkoKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmlzU2tpcGFibGVWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YS5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTiwgdHJ1ZSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYoIW1ldGFEYXRhLmlzRW1wdHkoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29uZmlndXJlQ29tcG9uZW50V2l0aE1ldGFEYXRhKGZhY2VzQ29udGV4dCwgY29yZU91dHB1dExhYmVsLCBtZXRhRGF0YSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcG9uZW50RWRpdGFibGUoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIC8vY29tcGFyZSB3aXRoIGZhbHNlIHNvIHRydWUgPSB0cnVlIG9yIG51bGwNCi0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzUmVhZE9ubHkiKSkpOw0KLSAgICAgICAgYm9vbGVhbiBpc0Rpc2FibGVkID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNEaXNhYmxlZCIpKSk7DQotDQotICAgICAgICByZXR1cm4gIShpc1JlYWRPbmx5IHx8IGlzRGlzYWJsZWQpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVjMjY5NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuTGFiZWxlZE1lc3NhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb250ZXh0LlJlcXVlc3RDb250ZXh0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXRUZXh0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dERhdGUiOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmVmcmVzaENvbXBvbmVudCh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IGdldExhYmVsKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgICAgICBpZihsYWJlbCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbGFiZWwgPSB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvL292ZXJyaWRlIHRoZSBsYWJlbCBpZiB0aGUgYW5ub3RhdGlvbiBwcm92aWRlcyBhIGxhYmVsDQotICAgICAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsYWJlbCA9IG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwsIFN0cmluZy5jbGFzcyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIExhYmVsZWRNZXNzYWdlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgKChMYWJlbGVkTWVzc2FnZSlmYWNlc01lc3NhZ2UpLnNldExhYmVsVGV4dChsYWJlbCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vaWYgc29tZW9uZSB1c2VzIGEgbm9ybWFsIGZhY2VzIG1lc3NhZ2UNCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwoZmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVmcmVzaENvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYoUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuaXNQYXJ0aWFsUmVxdWVzdChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmFkZFBhcnRpYWxUYXJnZXQodWlDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKSB8fA0KLSAgICAgICAgICAgICAgIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURS5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldExhYmVsKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFN0cmluZylSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiZ2V0TGFiZWwiKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlY2EyMWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyS2l0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnJlbmRlcmtpdC5SZW5kZXJLaXREZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwucmVuZGVya2l0LmNvcmUuQ29yZVJlbmRlcktpdDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZXNwb25zZVN0YXRlTWFuYWdlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LlJlc3BvbnNlV3JpdGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZFJlbmRlcktpdCBleHRlbmRzIFJlbmRlcktpdERlY29yYXRvcgotewotICAgIHByb3RlY3RlZCBFeHRWYWxSZW5kZXJLaXQgZXh0VmFsUmVuZGVyS2l0OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiRVhUVkFMX1RSSU5JREFEX1JFTkRFUktJVCI7Ci0KLSAgICBwdWJsaWMgRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQoUmVuZGVyS2l0IHdyYXBwZWQpCi0gICAgewotICAgICAgICB0aGlzLmV4dFZhbFJlbmRlcktpdCA9IG5ldyBFeHRWYWxSZW5kZXJLaXQod3JhcHBlZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICB0aGlzLmV4dFZhbFJlbmRlcktpdC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgcmVuZGVyZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZW5kZXJlciBnZXRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmdldFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVzcG9uc2VTdGF0ZU1hbmFnZXIgZ2V0UmVzcG9uc2VTdGF0ZU1hbmFnZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlc3BvbnNlV3JpdGVyIGNyZWF0ZVJlc3BvbnNlV3JpdGVyKFdyaXRlciB3cml0ZXIsIFN0cmluZyBzLCBTdHJpbmcgczEpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5leHRWYWxSZW5kZXJLaXQuY3JlYXRlUmVzcG9uc2VXcml0ZXIod3JpdGVyLCBzLCBzMSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlc3BvbnNlU3RyZWFtIGNyZWF0ZVJlc3BvbnNlU3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5leHRWYWxSZW5kZXJLaXQuY3JlYXRlUmVzcG9uc2VTdHJlYW0ob3V0cHV0U3RyZWFtKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlY29yYXRlZFJlbmRlcktpdElkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBDb3JlUmVuZGVyS2l0LkJBU0VfUkVOREVSX0tJVF9JRDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjI3MDFmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnJlbmRlcmtpdC5jb3JlLnhodG1sLnRhYmxlLlRhYmxlUmVuZGVyaW5nQ29udGV4dDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIHNvbHV0aW9uIGZvciB0cmluaWRhZCB0YWJsZSByZW5kZXJlciBpc3N1ZSAoaW4gY29ubmVjdGlvbiB3aXRoIGRvdWJsZSBjYWxsIHByZXZlbnRpb24gcHJveGllcykNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1wdWJsaWMgY2xhc3MgRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5IGV4dGVuZHMgRXh0VmFsUmVuZGVyZXJQcm94eQ0KLXsNCi0gICAgcHVibGljIEV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgc3VwZXIocmVuZGVyZXIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wdGlvbmFsS2V5KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZihUYWJsZVJlbmRlcmluZ0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gInwiICsgVGFibGVSZW5kZXJpbmdDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFJlbmRlclN0YWdlKCkuZ2V0U3RhZ2UoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAiIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmRlY2I0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQuVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnZhbGlkYXRpb24ubWVzc2FnZS5UcmluaWRhZEZhY2VzTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQuRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3IuVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvci5UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBhbHRlcm5hdGl2ZSBhcHByb2FjaCBmb3IgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFRyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBpbml0VHJpbmlkYWRTdXBwb3J0KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRUcmluaWRhZFN1cHBvcnQoKQ0KLSAgICB7DQotICAgICAgICAvL2RlYWN0aXZhdGUgZGVmYXVsdCBhcHByb2FjaA0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpLmRlYWN0aXZhdGUoKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIGRlYWN0aXZhdGVDbGllbnRTaWRlVmFsaWRhdGlvbiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NMSUVOVF9TSURFX1RSSU5JREFEX1ZBTElEQVRJT047DQotDQotICAgICAgICBpZihkZWFjdGl2YXRlQ2xpZW50U2lkZVZhbGlkYXRpb24gPT0gbnVsbCB8fCAhZGVhY3RpdmF0ZUNsaWVudFNpZGVWYWxpZGF0aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBkZWFjdGl2YXRlSW5pdENvcmVPdXRwdXRMYWJlbCA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX1RSSU5JREFEX0NPUkVfT1VUUFVUX0xBQkVMX0lOSVRJQUxJWkFUSU9OOw0KLQ0KLSAgICAgICAgaWYoZGVhY3RpdmF0ZUluaXRDb3JlT3V0cHV0TGFiZWwgPT0gbnVsbCB8fCAhZGVhY3RpdmF0ZUluaXRDb3JlT3V0cHV0TGFiZWwuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIGRlYWN0aXZhdGVUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA9DQotICAgICAgICAgICAgICAgIFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX1RSSU5JREFEX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SOw0KLQ0KLSAgICAgICAgaWYoZGVhY3RpdmF0ZVRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yID09IG51bGwgfHwNCi0gICAgICAgICAgICAgICAgIWRlYWN0aXZhdGVUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKG5ldyBUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vZGVhY3RpdmF0ZSBleHR2YWwgcmVuZGVyZXIgcHJveHkgLSBkdWUgdG8gYW4gaW5jb21wYXRpYmlsaXR5IHdpdGggdGhlIHRhYmxlIHJlbmRlcmVyDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVksIEV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY3RvcnlOYW1lcy5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkubmFtZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIGlmIHRoZXJlIGFyZSBmdXJ0aGVyIGluY29tcGF0aWJsZSByZW5kZXJlcnMgdXNlIHRoZSBmb2xsb3dpbmcgcXVpY2stZml4Og0KLSAgICAgICAgICogICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVksIG51bGwpOw0KLSAgICAgICAgICAgYXR0ZW50aW9uOiBpdCBjYXVzZXMgZGlyZWN0IGRlbGVnYXRpb24gd2l0aG91dCBhIGNoZWNrIG9mIGRvdWJsZSBpbnZvY2F0aW9ucw0KLSAgICAgICAgICovDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC91dGlsL1RyaW5pZGFkVXRpbHMuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdXRpbC9UcmluaWRhZFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1N2FlZTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC91dGlsL1RyaW5pZGFkVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImNoZWNrIHN1YmZvcm0iKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZFV0aWxzDQotew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhUcmluaWRhZFV0aWxzLmNsYXNzKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBVSUNvbXBvbmVudCBmaW5kTGFiZWxlZEVkaXRhYmxlQ29tcG9uZW50KENvcmVPdXRwdXRMYWJlbCBjb3JlT3V0cHV0TGFiZWwpDQotICAgIHsNCi0gICAgICAgIC8vVE9ETw0KLSAgICAgICAgaWYoY29yZU91dHB1dExhYmVsLmdldEZvcigpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgVUlDb21wb25lbnQgcmVzdWx0ID0gZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZmluZENvbXBvbmVudChjb3JlT3V0cHV0TGFiZWwuZ2V0Rm9yKCkpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoTE9HLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgTE9HLnRyYWNlKGNvcmVPdXRwdXRMYWJlbC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpICsgIiBkb2Vzbid0IHJlZmVyZW5jZSBhbiBlZGl0YWJsZSBjb21wb25lbnQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYzIxY2MuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFRyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeSBleHRlbmRzIERlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5DQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNMYWJlbGVkRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2UgaW5zdGFuY2VvZiBUcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2UgY3JlYXRlKEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlKHNldmVyaXR5LCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMWFhMWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudXRpbC5MYWJlbGVkRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5MYWJlbGVkTWVzc2FnZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBUcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UgZXh0ZW5kcyBMYWJlbGVkRmFjZXNNZXNzYWdlIGltcGxlbWVudHMgTGFiZWxlZE1lc3NhZ2UNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYzNTY4MDA2ODk5NjE1MDUxNTRMOw0KLQ0KLSAgICBwdWJsaWMgVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlKFNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgc3VwZXIoc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TGFiZWxBc1N0cmluZyhGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldExhYmVsKGxhYmVsKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDViM2E1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRhYWU2NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcgotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjQ5NTk4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlIHByb3ZpZGVzIHNwZWNpYWwgVHJpbmlkYWQgU3VwcG9ydCBmb3IgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvci4NCi0gICAgRnVydGhlcm1vcmUsIGl0IGFsbG93cyB0byBqb2luIHRoZSBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIG1lY2hhbmlzbSBvZiBUcmluaWRhZC4gU2FtcGxlIHVzZS1jYXNlOiBhbm5vdGF0ZSB5b3VyIG1vZGVsIHdpdGggSlBBIDEuMCBhbm5vdGF0aW9ucywgYmluZCBwcm9wZXJ0aWVzIHRvIEpTRiBJbnB1dCBjb21wb25lbnRzIGFuZCBnZXQgYXV0b21hdGljIGNsaWVudC1zaWRlIHZhbGlkYXRpb24ganVzdCBieSBhZGRpbmcgMyBKQVIgZmlsZXMgKE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSwgUHJvcGVydHkgVmFsaWRhdGlvbiBhbmQgVHJpbmlkYWQgU3VwcG9ydCkuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLjEueCBhbmQgSlNGIDEuMi54LiBCb3RoIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9wb20ueG1sIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTFjZWI2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBDb3JlPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0gICAgDQotICAgIDxzY20+DQotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy9jb3JlPC9jb25uZWN0aW9uPg0KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8yX3JjL2NvcmU8L2RldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy9jb3JlPC91cmw+DQotICAgIDwvc2NtPg0KLSAgICANCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvZGVjPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29kZWM8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxyZXNvdXJjZXM+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgIDwvcmVzb3VyY2VzPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzA0NDc2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQw0KLSAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKYXZhU2VydmVyIEZhY2VzIENvbmZpZyAxLjAvL0VOIg0KLSAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzEuZHRkIiA+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGZhY2VzLWNvbmZpZz4NCi0gICAgPGZhY3Rvcnk+DQotICAgICAgICA8cmVuZGVyLWtpdC1mYWN0b3J5Pm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXRGYWN0b3J5PC9yZW5kZXIta2l0LWZhY3Rvcnk+DQotICAgIDwvZmFjdG9yeT4NCi0NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkV4dFZhbFN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0V4dFZhbEluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0V4dFZhbEluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZDVkMWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotDQotLyoqDQotICogZG9udCd0IG1vdmUgdG8gYW4gb3RoZXIgcGFja2FnZSEhIQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIEV4dFZhbEluZm9ybWF0aW9uDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FID0gRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJYTUxfUEFSQU1fUFJFRklYID0gRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gQ2xhc3NVdGlscy5nZXRKYXJWZXJzaW9uKEV4dFZhbEluZm9ybWF0aW9uLmNsYXNzKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0N1c3RvbUluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ3VzdG9tSW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE5MGNlNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ3VzdG9tSW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkNCi1wdWJsaWMgZW51bSBDdXN0b21JbmZvcm1hdGlvbg0KLXsNCi0gICAgQkFTRV9QQUNLQUdFLA0KLSAgICBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiwNCi0NCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYLA0KLSAgICBWQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWCwNCi0gICAgTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVgsDQotDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfVE9fTVNHX1JFU09MVkVSX05BTUVfTUFQUEVSLA0KLSAgICBNRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUiwNCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIsDQotDQotICAgIFNUQVJUVVBfTElTVEVORVIsDQotICAgIENPTVBPTkVOVF9JTklUSUFMSVpFUiwNCi0gICAgVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IsDQotICAgIE1FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SLA0KLQ0KLSAgICBNRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwNCi0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwNCi0gICAgTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksDQotICAgIEZBQ0VTX01FU1NBR0VfRkFDVE9SWSwNCi0NCi0gICAgTUVTU0FHRV9CVU5ETEVfTkFNRSwNCi0gICAgU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTEwZjA3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlJlbmRlcmVySW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5RmluZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRGVmYXVsdEZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBFeHRWYWxDb250ZXh0Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBFeHRWYWxDb250ZXh0IGV4dFZhbENvbnRleHQgPSBuZXcgRXh0VmFsQ29udGV4dCgpOwotCi0gICAgcHJpdmF0ZSBGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIgPSBEZWZhdWx0RmFjdG9yeUZpbmRlci5nZXRJbnN0YW5jZSgpOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUmVuZGVyZXJJbnRlcmNlcHRvcj4gcmVuZGVyZXJJbnRlcmNlcHRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlbmRlcmVySW50ZXJjZXB0b3I+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZGVuaWVkSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI+IHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyPigpOwotCi0gICAgcHJpdmF0ZSBMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPiBjb21wb25lbnRJbml0aWFsaXplcnM7Ci0gICAgcHJpdmF0ZSBMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4gdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yczsKLSAgICBwcml2YXRlIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yczsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBnbG9iYWxQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLSAgICBwcml2YXRlIE1hcDxTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMsIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+PiBzdGF0aWNDb25maWdNYXAKLSAgICAgICAgPSBuZXcgSGFzaE1hcDxTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMsIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+PigpOwotCi0KLSAgICBwcml2YXRlIHZvaWQgbGF6eUluaXRDb21wb25lbnRJbml0aWFsaXplcnMoKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMgPSBuZXcgQXJyYXlMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPigpOwotICAgICAgICBMaXN0PFN0cmluZz4gY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcwotICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9JTklUSUFMSVpFUik7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcwotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfSU5JVElBTElaRVIpKTsKLQotICAgICAgICBDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplcjsKLSAgICAgICAgZm9yIChTdHJpbmcgY29tcG9uZW50SW5pdGlhbGl6ZXJOYW1lIDogY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb21wb25lbnRJbml0aWFsaXplciA9Ci0gICAgICAgICAgICAgICAgKENvbXBvbmVudEluaXRpYWxpemVyKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY29tcG9uZW50SW5pdGlhbGl6ZXJOYW1lKTsKLQotICAgICAgICAgICAgaWYgKGNvbXBvbmVudEluaXRpYWxpemVyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChjb21wb25lbnRJbml0aWFsaXplcik7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShjb21wb25lbnRJbml0aWFsaXplci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbGF6eUluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMudmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMgPSBuZXcgQXJyYXlMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4oKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IpOwotICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KAotICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUikpOwotCi0gICAgICAgIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7Ci0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUgOiB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgPQotICAgICAgICAgICAgICAgIChWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzLmFkZCh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsYXp5SW5pdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBpZih0aGlzLm1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLm1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+KCk7Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SKTsKLSAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KAotICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUikpOwotCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOwotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lIDogbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciA9Ci0gICAgICAgICAgICAgICAgKE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUpOwotCi0gICAgICAgICAgICBpZiAobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5hZGQobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFeHRWYWxDb250ZXh0IGdldENvbnRleHQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGV4dFZhbENvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIEZhY3RvcnlGaW5kZXIgZ2V0RmFjdG9yeUZpbmRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gZmFjdG9yeUZpbmRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGYWN0b3J5RmluZGVyKEZhY3RvcnlGaW5kZXIgZmFjdG9yeUZpbmRlcikKLSAgICB7Ci0gICAgICAgIGlmKGZhY3RvcnlGaW5kZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5mYWN0b3J5RmluZGVyID0gZmFjdG9yeUZpbmRlcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFJlbmRlcmVySW50ZXJjZXB0b3I+IGdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFJlbmRlcmVySW50ZXJjZXB0b3I+KHJlbmRlcmVySW50ZXJjZXB0b3JzLnZhbHVlcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChFeHRWYWxDb250ZXh0LmNsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVuaWVkSW50ZXJjZXB0b3JzLmNvbnRhaW5zKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3JzLnB1dChyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSwgcmVuZGVyZXJJbnRlcmNlcHRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVyZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IoQ2xhc3MgcmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yID0KLSAgICAgICAgICAgIChSZW5kZXJlckludGVyY2VwdG9yKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzcyhyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoRXh0VmFsQ29udGV4dC5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvcnMucmVtb3ZlKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vaWYgYW4gaW50ZXJjZXB0b3IgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZCBzbyBmYXIsIGl0IHNob3VsZCBiZSBkZW5pZWQgYXQgZnV0dXJlIHJlZ2lzdHJhdGlvbnMKLSAgICBwdWJsaWMgdm9pZCBkZW55UmVuZGVyZXJJbnRlcmNlcHRvcihDbGFzcyByZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpCi0gICAgewotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgPQotICAgICAgICAgICAgKFJlbmRlcmVySW50ZXJjZXB0b3IpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcyk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChFeHRWYWxDb250ZXh0LmNsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZW5pZWRJbnRlcmNlcHRvcnMuYWRkKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKTsKLSAgICAgICAgfQotICAgICAgICBkZXJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvbXBvbmVudEluaXRpYWxpemVyKENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyKQotICAgIHsKLSAgICAgICAgbGF6eUluaXRDb21wb25lbnRJbml0aWFsaXplcnMoKTsKLSAgICAgICAgdGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMuYWRkKGNvbXBvbmVudEluaXRpYWxpemVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4gZ2V0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCkKLSAgICB7Ci0gICAgICAgIGxhenlJbml0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7Ci0gICAgICAgIHJldHVybiBjb21wb25lbnRJbml0aWFsaXplcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBsYXp5SW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgdGhpcy52YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzLmFkZCh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4gZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBsYXp5SW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBsYXp5SW5pdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMuYWRkKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGxhenlJbml0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHJldHVybiBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcj4gZ2V0UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciBwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycy5hZGQocHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICB7Ci0gICAgICAgIE1hcCBhcHBsaWNhdGlvbk1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbk1hcCgpOwotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBiZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBhcHBsaWNhdGlvbk1hcC5nZXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FKTsKLQotICAgICAgICBpZiAoYmVhbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW5pdEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKGFwcGxpY2F0aW9uTWFwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmVhbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGluaXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbihNYXAgYXBwbGljYXRpb25NYXApCi0gICAgewotICAgICAgICBMaXN0PFN0cmluZz4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4pOwotICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMuYWRkKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkNVU1RPTV9CRUFOKTsKLQotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbjsKLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChpbmZvcm1hdGlvblByb3ZpZGVyQmVhbiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uTWFwLnB1dChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUsIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnlUb0luaXRDdXN0b21Db25maWd1cmVkSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWUoYXBwbGljYXRpb25NYXApOwotCi0gICAgICAgIGlmKGFwcGxpY2F0aW9uTWFwLmNvbnRhaW5zS2V5KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4pYXBwbGljYXRpb25NYXAuZ2V0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0luaXRDdXN0b21Db25maWd1cmVkSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWUoTWFwIGFwcGxpY2F0aW9uTWFwKQotICAgIHsKLSAgICAgICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gYmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKQotICAgICAgICAgICAgLmdldEJlYW4oSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQ1VTVE9NX0JFQU4ucmVwbGFjZSgiLiIsICJfIikpOwotCi0gICAgICAgIGlmKGJlYW4gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYXBwbGljYXRpb25NYXAucHV0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSwgYmVhbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gZ2V0U3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmKCF0aGlzLnN0YXRpY0NvbmZpZ01hcC5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gc3RhdGljQ29uZmlnTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgICAgICB0aGlzLnN0YXRpY0NvbmZpZ01hcC5wdXQobmFtZSwgc3RhdGljQ29uZmlnTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGljQ29uZmlnTWFwLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcyBuYW1lLCBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IHN0YXRpY0NvbmZpZ0xpc3Q7Ci0gICAgICAgICAgICBpZighdGhpcy5zdGF0aWNDb25maWdNYXAuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5zdGF0aWNDb25maWdNYXAucHV0KG5hbWUsIHN0YXRpY0NvbmZpZ0xpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5zdGF0aWNDb25maWdNYXAuZ2V0KG5hbWUpLmFkZChzdGF0aWNDb25maWcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYWRkR2xvYmFsUHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhZGRHbG9iYWxQcm9wZXJ0eShuYW1lICwgdmFsdWUsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gZm9yY2VPdmVycmlkZSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMuZ2xvYmFsUHJvcGVydGllcy5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIWZvcmNlT3ZlcnJpZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJvdmVycmlkZSBnbG9iYWwgcHJvcGVydHkgJyIgKyBuYW1lICsgIiciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmdsb2JhbFByb3BlcnRpZXMucHV0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRHbG9iYWxQcm9wZXJ0eShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmdsb2JhbFByb3BlcnRpZXMuZ2V0KG5hbWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZWZhNmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJlbid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKiArIHNvbWUgb2YgdGhlbSBjYW4gYmUgY3VzdG9taXplZCB3aXRoaW4gYSBjdXN0b20gaW1wbC4gb2YgdGhlIGJlYW4NCi0gKiAoZXh0ZW5kIHRoaXMgY2xhc3MgYW5kIHByb3ZpZGUgaXQgdmlhIGNvbnZlbnRpb24gb3Igd2ViLnhtbCkNCi0gKiA8cC8+DQotICogdGhlIHN0YXRpYyBhcGkgc2hvdWxkIG9ubHkgYmUgdXNlZA0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUFOX05BTUUgPSBFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRQ0KLSAgICAgICAgKyAiLiIgKyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7DQotICAgIC8vY3VzdG9tIGNsYXNzIHdoaWNoIGlzIGFuIG9wdGlvbmFsIHJlcGxhY2VtZW50IGZvciB0aGlzIGNsYXNzIChoYXMgdG8gZXh0ZW5kIHRoaXMgY2xhc3MpDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CRUFOID0gKEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FDQotICAgICAgICArICIuY3VzdG9tLiIgKyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOw0KLQ0KLSAgICBwdWJsaWMgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc2V0dXBDdXN0b21pemFibGVJbmZvcm1hdGlvbigpOw0KLSAgICAgICAgYXBwbHlDdXN0b21WYWx1ZXModGhpcy5jdXN0b21pemFibGVJbmZvcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8Q3VzdG9tSW5mb3JtYXRpb24sIFN0cmluZz4gY3VzdG9taXphYmxlSW5mb3MgPSBuZXcgSGFzaE1hcDxDdXN0b21JbmZvcm1hdGlvbiwgU3RyaW5nPigpOw0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBDdXN0b21pemFibGVJbmZvcm1hdGlvbigpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBiYXNlUGFja2FnZSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fQkFTRV9QQUNLQUdFOw0KLQ0KLSAgICAgICAgaWYgKGJhc2VQYWNrYWdlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZVBhY2thZ2UgPSBFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSArICIuY3VzdG9tLiI7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWJhc2VQYWNrYWdlLmVuZHNXaXRoKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZVBhY2thZ2UgPSBiYXNlUGFja2FnZSArICIuIjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5CQVNFX1BBQ0tBR0UsIGJhc2VQYWNrYWdlKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiwNCi0gICAgICAgICAgICAgICAgIkNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVgsDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVRyYW5zZm9ybWVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFX1JFU09MVkVSX1BPU1RGSVgsDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfSU5JVElBTElaRVIsDQotICAgICAgICAgICAgICAgICJDb21wb25lbnRJbml0aWFsaXplciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IsDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTVNHX1JFU09MVkVSX05BTUVfTUFQUEVSLA0KLSAgICAgICAgICAgICJWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSLA0KLSAgICAgICAgICAgICJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSLA0KLSAgICAgICAgICAgICJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBUlRVUF9MSVNURU5FUiwNCi0gICAgICAgICAgICAgICAgIlN0YXJ0dXBMaXN0ZW5lciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIk1lc3NhZ2VSZXNvbHZlckZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIkNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJGYWNlc01lc3NhZ2VGYWN0b3J5Iik7DQotDQotICAgICAgICAvL2NvbnZlbnRpb25zICh0aGUgcmVzdCBvZiB0aGUgY29udmVudGlvbnMgYXJlIGJ1aWx0IHdpdGggdGhlIGhlbHAgb2YgbmFtZSBtYXBwZXJzLC4uLg0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FU1NBR0VfQlVORExFX05BTUUsDQotICAgICAgICAgICAgICAgICJ2YWxpZGF0aW9uX21lc3NhZ2VzIik7DQotICAgICAgICAvL3N0YXRpYyBzdHJhdGVneSBtYXBwaW5ncyAobmFtZSBvZiBwcm9wZXJ0eSBmaWxlcykNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5TVEFUSUNfU1RSQVRFR1lfTUFQUElOR19TT1VSQ0UsDQotICAgICAgICAgICAgICAgICJzdHJhdGVneV9tYXBwaW5ncyIpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGFwcGx5Q3VzdG9tVmFsdWVzKE1hcDxDdXN0b21JbmZvcm1hdGlvbiwgU3RyaW5nPiBtYXApDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgdG8gY3VzdG9taXplIGluZm9ybWF0aW9uDQotICAgIH0NCi0NCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXQoQ3VzdG9tSW5mb3JtYXRpb24gY3VzdG9tSW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGN1c3RvbWl6YWJsZUluZm9zLmdldChjdXN0b21JbmZvcm1hdGlvbik7DQotDQotICAgICAgICBzd2l0Y2ggKGN1c3RvbUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNhc2UgQkFTRV9QQUNLQUdFOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgKiBwb3N0Zml4IHVzZWQgYnkgdGhlIFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi0gICAgICAgICAgICAgKiB0aGUgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBpcyBmb3IgY3VzdG9tIHN0cmF0ZWdpZXMgb25seQ0KLSAgICAgICAgICAgICAqIChub3QgZm9yIHB1YmxpYyB2YWxpZGF0aW9uIG1vZHVsZXMpDQotICAgICAgICAgICAgICogc28gaXQncyBmaW5lIHRvIGN1c3RvbWl6ZSBpdA0KLSAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgY2FzZSBWQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVg6DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0NCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9taXphYmxlSW5mb3MuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkJBU0VfUEFDS0FHRSkgKyB2YWx1ZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDlmODY5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2R1bGVNZXNzYWdlQnVuZGxlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuZXdQYWNrYWdlTmFtZTsNCi0gICAgICAgIGlmIChwYWNrYWdlTmFtZS5lbmRzV2l0aCgiLnJlc29sdmVyIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgbmV3UGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZS5yZXBsYWNlKCIucmVzb2x2ZXIiLCAiLmJ1bmRsZSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5ld1BhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUucmVwbGFjZSgiLnJlc29sdmVyLiIsICIuYnVuZGxlLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG5ld1BhY2thZ2VOYW1lICsgIi52YWxpZGF0aW9uX21lc3NhZ2VzIjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKA0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsICIubWVzc2FnZS5yZXNvbHZlci4iLCB0YXJnZXRDbGFzc05hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoDQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgU3RyaW5nIHRhcmdldENsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgIi5tZXRhZGF0YS50cmFuc2Zvcm1lci4iLCB0YXJnZXRDbGFzc05hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UGFja2FnZU5hbWUsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXROYW1lKCk7DQotDQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUucmVwbGFjZSgiLnN0cmF0ZWd5LiIsIHRhcmdldFBhY2thZ2VOYW1lKTsNCi0NCi0gICAgICAgIGlmICh0YXJnZXRDbGFzc05hbWUgPT0gbnVsbCB8fCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSkgKyAiLiIgKyB0YXJnZXRDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHVzZSBhIGN1c3RvbSBuYW1lIG1hcHBlciB0byBpbXBsZW1lbnQgY3VzdG9tIGNvbnZlbnRpb25zDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgIlZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB1c2UgYSBjdXN0b20gbmFtZSBtYXBwZXIgdG8gaW1wbGVtZW50IGN1c3RvbSBjb252ZW50aW9ucw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5LnJlcGxhY2UoIi5hbm5vdGF0aW9uLiIsICIuc3RyYXRlZ3kuIikgKyAiU3RyYXRlZ3kiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgIk1ldGFEYXRhVHJhbnNmb3JtZXIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0YXJnZXRQb3N0Zml4KQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5lbmRzV2l0aCgiVmFsaWRhdGlvblN0cmF0ZWd5IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneU5hbWUuc3Vic3RyaW5nKDAsIHZhbGlkYXRpb25TdHJhdGVneU5hbWUubGVuZ3RoKCkgLSAxOCkgKyB0YXJnZXRQb3N0Zml4Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5lbmRzV2l0aCgiU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5zdWJzdHJpbmcoMCwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5sZW5ndGgoKSAtIDgpICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYWNiMGQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJlbid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIC8qDQotICAgICAqIG1pc2MNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FU1NBR0VfQlVORExFID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVTU0FHRV9CVU5ETEUiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQkFTRV9QQUNLQUdFID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQkFTRV9QQUNLQUdFIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9JTkZPUk1BVElPTl9QUk9WSURFUl9CRUFOIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OX1NUUkFURUdZX01BUFBJTkciKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUiIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBuYW1lIG1hcHBlcg0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUiIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBmYWN0b3JpZXMNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9GQUNFU19NRVNTQUdFX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9GQUNFU19NRVNTQUdFX0ZBQ1RPUlkiKTsNCi0NCi0gICAgLyoNCi0gICAgICogZGVhY3RpdmF0ZQ0KLSAgICAgKi8NCi0gICAgQERlcHJlY2F0ZWQNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX1JFTkRFUktJVCA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9SRU5ERVJLSVQiKTsNCi0NCi0gICAgLy9jdXJyZW50bHkganVzdCB1c2VkIGJ5IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfREVGQVVMVF9DT05WRU5USU9OIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9ERUZBVUxUX05BTUVfTUFQUEVSUyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9ERUZBVUxUX05BTUVfTUFQUEVSUyIpOw0KLSAgICANCi0gICAgLy90aGVyZSBpcyBub3RoaW5nIGxpa2UgREVBQ1RJVkFURV9ERUZBVUxUX1ZBTElEQVRJT05fSU5URVJDRVBUT1INCi0gICAgLy91c2UgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZGVueVJlbmRlcmVySW50ZXJjZXB0b3IoLi4uKSB3aXRoaW4gYW4gZXh0dmFsLVN0YXJ0dXBMaXN0ZW5lcg0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9BYnN0cmFjdEVMSGVscGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjQwNWIwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9BYnN0cmFjdEVMSGVscGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIGRldGFpbHMNCi0gKiBAc2VlIERlZmF1bHRFTEhlbHBlcg0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkgY3VzdG9tRUxIZWxwZXJGYWN0b3J5Ow0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbUVMSGVscGVyRmFjdG9yeShBYnN0cmFjdEVMSGVscGVyRmFjdG9yeSBlbEhlbHBlckZhY3RvcnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3VzdG9tRUxIZWxwZXJGYWN0b3J5ID0gZWxIZWxwZXJGYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBmaW5hbCBFTEhlbHBlciBjcmVhdGUoKQ0KLSAgICB7DQotICAgICAgICBFTEhlbHBlciByZXN1bHQgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYodGhpcy5jdXN0b21FTEhlbHBlckZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSB0aGlzLmN1c3RvbUVMSGVscGVyRmFjdG9yeS5jcmVhdGVFTEhlbHBlcigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUVMSGVscGVyKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBFTEhlbHBlciBjcmVhdGVFTEhlbHBlcigpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MTVlYmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7DQotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBpbiBvcmRlciB0byBjZW50cmFsaXplIHRoZSBqc2YgdmVyc2lvbiBkZXBlbmRlbmN5IHdpdGhpbiB0aGUgY29yZQ0KLSAqDQotICogdGhpcyBlbC1oZWxwZXIgc3VwcG9ydHMganNwIGFuZCBmYWNlbGV0cyAodGVzdGVkIHdpdGggMS4xLjE0KQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotLyoNCi0gKiB0aGVyZSBpcyBhIHNwZWNpYWwgZmFjZWxldHMgd29ya2Fyb3VuZCBmb3IgZWwtZXhwcmVzc2lvbnMgb2YgY3VzdG9tIGNvbXBvbmVudHMNCi0gKiBpdCdzIHBsdWdnYWJsZSBpbiBvcmRlciB0byBzdXBwb3J0IHNwZWNpYWwgbWVjaGFuaXNtcyBvZiBkaWZmZXJlbnQgdGVjaG5vbG9naWVzICh0aGFuIGpzcCBhbmQgZmFjZWxldHMpDQotICogc28geW91IGNhbiBwbHVnIGluIHlvdXIgb3duIGltcGwuIHdoaWNoIGltcGxlbWVudHMgYSBjdXN0b20gd29ya2Fyb3VuZCAobGlrZSB0aGUgZmFjZWxldHMgd29ya2Fyb3VuZCBvZiB0aGlzIGltcGwuKQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRFTEhlbHBlciBpbXBsZW1lbnRzIEVMSGVscGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdEVMSGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIC8vZHVlIHRvIGEgcmVzdHJpY3Rpb24gd2l0aCB0aGUgcmkNCi0gICAgICAgIE9iamVjdCBiZWFuID0gZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIHJldHVybiAoYmVhbiAhPSBudWxsKSA/IGJlYW4uZ2V0Q2xhc3MoKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRCZWFuKFN0cmluZyBiZWFuTmFtZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIHJldHVybiBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5nZXRWYXJpYWJsZVJlc29sdmVyKCkucmVzb2x2ZVZhcmlhYmxlKGZhY2VzQ29udGV4dCwgYmVhbk5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKHZhbHVlQmluZGluZ0V4cHJlc3Npb24gIT0gbnVsbCkgPyBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQ0KLSAgICAgICAgICAgIC5jcmVhdGVWYWx1ZUJpbmRpbmcodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpLmdldFZhbHVlKGZhY2VzQ29udGV4dCkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5jcmVhdGVWYWx1ZUJpbmRpbmcodmFsdWVCaW5kaW5nRXhwcmVzc2lvbikgIT0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gZ2V0VmFsdWVCaW5kaW5nRXhwcmVzc2lvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgYm9vbGVhbiBhbGxvd0JsYW5rQ2hhcmFjdGVycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBnZXRPcmlnaW5hbFZhbHVlQmluZGluZ0V4cHJlc3Npb24odWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgLy9mb3IgaW5wdXQgY29tcG9uZW50cyB3aXRob3V0IHZhbHVlLWJpbmRpbmcNCi0gICAgICAgIC8vKGUuZy4gZm9yIHNwZWNpYWwgY29tcG9uZW50IGxpYnMgLT4gaXNzdWUgd2l0aCBFeHRWYWxSZW5kZXJlcldyYXBwZXIjZW5jb2RlQmVnaW4pDQotICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LmdldENsYXNzKCkgKyAiIGhhcyBubyB2YWx1ZSBiaW5kaW5nIC0gY29tcG9uZW50IGlkOiAiICsgdWlDb21wb25lbnQuZ2V0SWQoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoIWFsbG93QmxhbmtDaGFyYWN0ZXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2UoIiAiLCAiIik7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbikuZ2V0QmFzZUV4cHJlc3Npb24oKSkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlc3VsdCA9IEZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlci4NCi0gICAgICAgICAgICAgICAgdHJ5VG9DcmVhdGVWYWx1ZUJpbmRpbmdGb3JGYWNlbGV0c0JpbmRpbmcodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IHJlc29sdmUgZXhwcmVzc2lvbjogIiArIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCByZXN1bHQuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotDQotICAgICAgICAgICAgaWYoZW50aXR5Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCByZXNvbHZlIGV4cHJlc3Npb246ICIgKyByZXN1bHQuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICAvL2tlZXAgaW4gc3luYyB3aXRoIERlZmF1bHRFTEhlbHBlciNnZXRQcm9wZXJ0eURldGFpbHNWaWFSZWZsZWN0aW9uRmFsbGJhY2sgb2YgdHJ1bmshISENCi0gICAgcHVibGljIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IGdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24odWlDb21wb25lbnQsIGZhbHNlKTsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24gPQ0KLSAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0NCi0gICAgICAgIFN0cmluZyBwYXRoID0gbnVsbDsNCi0NCi0gICAgICAgIHdoaWxlKGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihwYXRoID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwYXRoID0gZ2V0UHJvcGVydHlOYW1lKGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcGF0aCA9IGdldFByb3BlcnR5TmFtZShjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbikgKyAiLiIgKyBwYXRoOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBwYXRoID0gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSArICIuIiArIHBhdGg7DQotDQotICAgICAgICBPYmplY3QgYmFzZU9iamVjdCA9IGdldFZhbHVlT2ZFeHByZXNzaW9uKGZhY2VzQ29udGV4dCwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpKTsNCi0NCi0gICAgICAgIC8vaW4gY2FzZSBvZiBlLmcuOiAje2JlYW5bYmVhbi5wYXNzd29yZFJlcGVhdGVkUHJvcGVydHlOYW1lXX0NCi0gICAgICAgIC8vLT4gYmVhbi5wYXNzd29yZFJlcGVhdGVkUHJvcGVydHlOYW1lIGlzIG5vdCB0aGUgZmluYWwgcHJvcGVydHkgbmFtZQ0KLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURldGFpbHMocGF0aCwgYmFzZU9iamVjdCwgZ2V0UHJvcGVydHlOYW1lKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpOw0KLQ0KLSAgICAgICAgaWYocHJvcGVydHlOYW1lLmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gZXh0cmFjdFByb3BlcnR5TmFtZU9mUHJvcGVydHlQYXRoKHByb3BlcnR5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcHJvcGVydHlOYW1lOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJzdXBwb3J0IGZvciBtb3JlIGR5bmFtaWMgYmluZGluZ3MgLSBkZXRhaWxzIHNlZSBpbmxpbmUiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBleHRyYWN0UHJvcGVydHlOYW1lT2ZQcm9wZXJ0eVBhdGgoU3RyaW5nIHByb3BlcnR5Q2hhaW4pDQotICAgIHsNCi0gICAgICAgIFN0cmluZ1tdIHByb3BlcnRpZXMgPSBwcm9wZXJ0eUNoYWluLnNwbGl0KCJcXC4iKTsNCi0NCi0gICAgICAgIE9iamVjdCBjdXJyZW50UHJvcGVydHlWYWx1ZSA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbihwcm9wZXJ0aWVzWzBdKTsNCi0NCi0gICAgICAgIE1ldGhvZCBjdXJyZW50TWV0aG9kOw0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRQcm9wZXJ0eU5hbWU7DQotICAgICAgICBmb3IoaW50IGkgPSAxOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50UHJvcGVydHlOYW1lID0gcHJvcGVydGllc1tpXTsNCi0gICAgICAgICAgICBjdXJyZW50TWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKGN1cnJlbnRQcm9wZXJ0eVZhbHVlLmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICJnZXQiICsgY3VycmVudFByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIGN1cnJlbnRQcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpKTsNCi0NCi0gICAgICAgICAgICBpZihjdXJyZW50TWV0aG9kID09IG51bGwgJiYgY3VycmVudFByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBNYXApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL2l0J3Mgb2sgZm9yIHRoZSBzaW1wbGUgbWFwIGNhc2UgLSBidXQgbm90IGZvciBlLmcuOg0KLSAgICAgICAgICAgICAgICAvLyN7YmVhbjFbYmVhbjIucHJvcGVydHlOYW1lUHJvdmlkZXJbIGJlYW4zLmluZGV4XV19DQotICAgICAgICAgICAgICAgIC8vb3IgZXZlcnkgb3RoZXIgY29tcGxleCByZXBsYWNlbWVudCBmb3IgYmVhbjMuaW5kZXgNCi0gICAgICAgICAgICAgICAgLy9pdCBtaWdodCBhbHNvIHJlcXVpcmUgYW4gYWRqdXN0bWVudCBhdCBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIjdHJ5VG9UcmFuc2Zvcm1Ub1JlYWxCaW5kaW5nDQotICAgICAgICAgICAgICAgICgoTWFwKWN1cnJlbnRQcm9wZXJ0eVZhbHVlKS5nZXQoY3VycmVudFByb3BlcnR5TmFtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eVZhbHVlID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKGN1cnJlbnRQcm9wZXJ0eVZhbHVlLCBjdXJyZW50TWV0aG9kKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZihjdXJyZW50UHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFN0cmluZyljdXJyZW50UHJvcGVydHlWYWx1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoInVuZXhwZWN0ZWQgdmFsdWUgd2l0aGluIG1hcCBzeW50YXg6ICIgKyBwcm9wZXJ0eUNoYWluICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGxhc3QgcHJvcGVydHkgbmFtZTogIiArIGN1cnJlbnRQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgc3RhdGljIFN0cmluZyBnZXRPcmlnaW5hbFZhbHVlQmluZGluZ0V4cHJlc3Npb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZyB2YWx1ZUV4cHJlc3Npb24gPSB1aUNvbXBvbmVudC5nZXRWYWx1ZUJpbmRpbmcoInZhbHVlIik7DQotDQotICAgICAgICByZXR1cm4gKHZhbHVlRXhwcmVzc2lvbiAhPSBudWxsKSA/IHZhbHVlRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtV2VsbEZvcm1lZChPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBWYWx1ZUJpbmRpbmcgfHwgbyBpbnN0YW5jZW9mIEV4dGVybmFsaXphYmxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBzID0gby50b1N0cmluZygpOw0KLSAgICAgICAgcmV0dXJuICgocy5jb250YWlucygiIyIpIHx8IHMuY29udGFpbnMoIiQiKSkgJiYgcy5jb250YWlucygieyIpICYmIHMuY29udGFpbnMoIn0iKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRCaW5kaW5nT2ZDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQuZ2V0VmFsdWVCaW5kaW5nKG5hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2ZlNTZjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRFTEhlbHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeQ0KLXsNCi0gICAgcHJpdmF0ZSBFTEhlbHBlciBlbEhlbHBlciA9IG5ldyBEZWZhdWx0RUxIZWxwZXIoKTsNCi0gICAgDQotICAgIHByb3RlY3RlZCBFTEhlbHBlciBjcmVhdGVFTEhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmVsSGVscGVyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FTEhlbHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYjI1NTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogaW4gb3JkZXIgdG8gY2VudHJhbGl6ZSB0aGUganNmIHZlcnNpb24gZGVwZW5kZW5jeSB3aXRoaW4gdGhlIGNvcmUNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRUxIZWxwZXINCi17DQotICAgIE9iamVjdCBnZXRCZWFuKFN0cmluZyBiZWFuTmFtZSk7DQotDQotICAgIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLQ0KLSAgICBDbGFzcyBnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCk7DQotDQotICAgIGJvb2xlYW4gaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIGJvb2xlYW4gaXNFTFRlcm1XZWxsRm9ybWVkKE9iamVjdCBvKTsNCi0NCi0gICAgT2JqZWN0IGdldEJpbmRpbmdPZkNvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgU3RyaW5nIG5hbWUpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMTYxYjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0ZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0Ow0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi0vKioNCi0gKiBIZWxwZXIgY2xhc3MgdG8gZ2V0IHRoZSByZWFsL2Z1bGwgdmFsdWUgYmluZGluZyAtIHRlc3RlZCB3aXRoIGZhY2VsZXRzIDEuMS4xNA0KLSAqIFRoZSB0YXJnZXQgaXMgdG8gZ2V0IHJpZCBvZiB0aGlzIGltcGwuIC0gY3VycmVudGx5IGl0J3MgYSB3b3JrYXJvdW5kIHRvIHN1cHBvcnQgY3VzdG9tIGZhY2VsZXRzIGNvbXBvbmVudHMuDQotICogQW4gYWx0ZXJuYXRpdmUgd291bGQgYmUgYW4gRUwtUmVzb2x2ZXIgLSB0aGVyZSBhcmUgc3RpbGwgc29tZSBvcGVuIGlzc3VlcyB3aXRoIHN1Y2ggYW4gYXBwcm9hY2gNCi0gKiArIEl0IGlzbid0IGF2YWlsYWJsZSB3aXRoIEpTRiAxLjEueA0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB0cnlUb0NyZWF0ZVZhbHVlQmluZGluZ0ZvckZhY2VsZXRzQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGZhY2VsZXRzVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IERlZmF1bHRFTEhlbHBlci5nZXRPcmlnaW5hbFZhbHVlQmluZGluZ0V4cHJlc3Npb24odWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGZvdW5kQmluZGluZ3MgPSBleHRyYWN0RUxUZXJtcygNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCaW5kaW5nT2ZDb21wb25lbnQodWlDb21wb25lbnQsICJ2YWx1ZSIpKTsNCi0NCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcHBlZEZhY2VsZXRzVmFycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmJlPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24NCi0gICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgMSkgKyAieyIgKyBjcmVhdGVCaW5kaW5nKGZvdW5kQmluZGluZ3MsIG1hcHBlZEZhY2VsZXRzVmFycykgKyAifSIpOw0KLQ0KLSAgICAgICAgICAgIENsYXNzIGVudGl0eUNsYXNzID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZiZS5nZXRCYXNlRXhwcmVzc2lvbigpKTsNCi0NCi0gICAgICAgICAgICBpZihlbnRpdHlDbGFzcyA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRyeVRvUmVwbGFjZVZhcnModmJlLCBtYXBwZWRGYWNlbGV0c1ZhcnMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gdmJlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNyZWF0ZUJpbmRpbmcoTGlzdDxTdHJpbmc+IGV4cHJlc3Npb25zLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHZpcnR1YWxWYXJzKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VycmVudEJpbmRpbmc7DQotDQotICAgICAgICBpbnQgaW5kZXhPZkJpbmRpbmdEZXRhaWxzOw0KLSAgICAgICAgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBleHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aCgiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZvdW5kQmluZGluZ0RldGFpbHMgPSBlbnRyeS5zcGxpdCgiICIpOw0KLSAgICAgICAgICAgIGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoZm91bmRCaW5kaW5nRGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9PSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBiaW5kaW5nRGV0YWlscyA9IGZvdW5kQmluZGluZ0RldGFpbHNbaW5kZXhPZkJpbmRpbmdEZXRhaWxzXS5zcGxpdCgiPSIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nRGV0YWlscy5sZW5ndGggPCAyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYmluZGluZ0RldGFpbHNbMV07DQotDQotICAgICAgICAgICAgLy90byBzdXBwb3J0IGJsYW5rcyB3aXRoaW4gYSBiaW5kaW5nIHdpdGggbWFwIHN5bnRheA0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgJiYgIWN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoY3VycmVudEJpbmRpbmcsIGZvdW5kQmluZGluZ0RldGFpbHMsIGluZGV4T2ZCaW5kaW5nRGV0YWlscyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9lbnRyeSBmb3IgInZpcnR1YWwiIGZhY2VsZXRzIGJlYW5zDQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWluc0tleShiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLnB1dChiaW5kaW5nRGV0YWlsc1swXSwgY3VycmVudEJpbmRpbmcpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICBpZighKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgfHwgY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2aXJ0dWFsVmFycy5wdXQoYmluZGluZ0RldGFpbHNbMF0sIGJpbmRpbmdEZXRhaWxzWzFdLnN1YnN0cmluZygxLCBiaW5kaW5nRGV0YWlsc1sxXS5sZW5ndGgoKS0yKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIG9yaWdpbmFsQmluZGluZyA9IGFkZGVkVmlydHVhbE5hbWVzLmdldCgidmFsdWUiKTsNCi0gICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5zdWJzdHJpbmcob3JpZ2luYWxCaW5kaW5nLmluZGV4T2YoInsiKSArIDEsIG9yaWdpbmFsQmluZGluZy5pbmRleE9mKCJ9IikpOw0KLSAgICAgICAgYWRkZWRWaXJ0dWFsTmFtZXMucmVtb3ZlKCJ2YWx1ZSIpOw0KLSAgICAgICAgcmV0dXJuIHRyeVRvVHJhbnNmb3JtVG9SZWFsQmluZGluZyhvcmlnaW5hbEJpbmRpbmcsIGFkZGVkVmlydHVhbE5hbWVzLCB2aXJ0dWFsVmFycyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRyeVRvVHJhbnNmb3JtVG9SZWFsQmluZGluZygNCi0gICAgICAgICAgICBTdHJpbmcgb3JpZ2luYWxCaW5kaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZGVkVmlydHVhbE5hbWVzLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHZpcnR1YWxWYXJzKQ0KLSAgICB7DQotICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSAiI3siICsgb3JpZ2luYWxCaW5kaW5nICsgIn0iOw0KLSAgICAgICAgSXRlcmF0b3IgbmFtZUl0ZXJhdG9yID0gYWRkZWRWaXJ0dWFsTmFtZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsNCi0NCi0gICAgICAgIFN0cmluZyBjdXJyZW50S2V5Ow0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRWYWx1ZTsNCi0gICAgICAgIHdoaWxlKG5hbWVJdGVyYXRvci5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudEtleSA9IChTdHJpbmcpIG5hbWVJdGVyYXRvci5uZXh0KCk7DQotDQotICAgICAgICAgICAgY3VycmVudFZhbHVlID0gYWRkZWRWaXJ0dWFsTmFtZXMuZ2V0KGN1cnJlbnRLZXkpOw0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoY3VycmVudFZhbHVlLmluZGV4T2YoInsiKSArIDEsIGN1cnJlbnRWYWx1ZS5pbmRleE9mKCJ9IikpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJ7IiArIGN1cnJlbnRLZXkgKyAiLiIsICJ7IiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoInsiICsgY3VycmVudEtleSArICJbIiwgInsiICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiLiIgKyBjdXJyZW50S2V5ICsgIi4iLCAiLiIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCIuIiArIGN1cnJlbnRLZXkgKyAiWyIsICIuIiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIlsiICsgY3VycmVudEtleSArICJdIiwgIlsnIiArIGN1cnJlbnRWYWx1ZSArICInXSIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiWyIsICJbIiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIlsiICsgY3VycmVudEtleSArICIuIiwgIlsiICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG5hbWVJdGVyYXRvciA9IHZpcnR1YWxWYXJzLmtleVNldCgpLml0ZXJhdG9yKCk7DQotDQotICAgICAgICB3aGlsZShuYW1lSXRlcmF0b3IuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRLZXkgPSAoU3RyaW5nKSBuYW1lSXRlcmF0b3IubmV4dCgpOw0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IHZpcnR1YWxWYXJzLmdldChjdXJyZW50S2V5KTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIi4iLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJ7IiArIGN1cnJlbnRLZXkgKyAiWyIsICJ7IiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICIuIiwgIi4iICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiLiIgKyBjdXJyZW50S2V5ICsgIlsiLCAiLiIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiXSIsICJbJyIgKyBjdXJyZW50VmFsdWUgKyAiJ10iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIlsiLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiLiIsICJbIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gb3JpZ2luYWxCaW5kaW5nLnN1YnN0cmluZygyLCBvcmlnaW5hbEJpbmRpbmcubGVuZ3RoKCkgLSAxKTsNCi0gICAgfQ0KLQ0KLSAgICAvL3RvIHN1cHBvcnQgYmxhbmtzIC0gZS5nLiB3aXRoIG1hcCBzeW50YXgNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoU3RyaW5nIGN1cnJlbnRCaW5kaW5nLCBTdHJpbmdbXSBmb3VuZEJpbmRpbmdEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhPZkJpbmRpbmdEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBmb3IoaW50IGkgPSBpbmRleE9mQmluZGluZ0RldGFpbHMgKyAxOyBpIDwgZm91bmRCaW5kaW5nRGV0YWlscy5sZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50QmluZGluZyArPSBmb3VuZEJpbmRpbmdEZXRhaWxzW2ldOw0KLSAgICAgICAgICAgIGlmKGZvdW5kQmluZGluZ0RldGFpbHNbaV0uY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50QmluZGluZzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY3VycmVudEJpbmRpbmc7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoU3RyaW5nW10gYmluZGluZ0RldGFpbHMpDQotICAgIHsNCi0gICAgICAgIGludCBjb3VudCA9IDA7DQotICAgICAgICBmb3IgKFN0cmluZyBlbnRyeSA6IGJpbmRpbmdEZXRhaWxzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbnRyeS5jb250YWlucygiPSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjb3VudCsrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBleHRyYWN0RUxUZXJtcyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGZvdW5kRUxUZXJtcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHJlc29sdmVFTFRlcm1zKG8sIG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpLCBmb3VuZEVMVGVybXMsIDApID4gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZEVMVGVybXM7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGludCByZXNvbHZlRUxUZXJtcyhPYmplY3QgbywgTWFwPE9iamVjdCwgT2JqZWN0PiB2aXNpdGVkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGZvdW5kRUxUZXJtcywgaW50IGNvdW50KSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChvID09IG51bGwgfHwgdmlzaXRlZC5jb250YWluc0tleShvKSB8fCBjb3VudCA+IDUwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdmlzaXRlZC5wdXQobywgbnVsbCk7DQotDQotICAgICAgICBpbnQgZWxDb3VudCA9IDA7DQotICAgICAgICBDbGFzcyBjID0gby5nZXRDbGFzcygpOw0KLQ0KLSAgICAgICAgLy9pbnNwZWN0IG1hcHMNCi0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgTWFwKQ0KLSAgICAgICAgew0KLQ0KLSAgICAgICAgICAgIGZvciAoT2JqZWN0IGVudHJ5IDogKChNYXApIG8pLnZhbHVlcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9mb3VuZCBlbnRyeSBmb3IgInZpcnR1YWwiIGZhY2VsZXRzIHZhcg0KLSAgICAgICAgICAgICAgICBpZihlbnRyeS50b1N0cmluZygpLmNvbnRhaW5zKCJWYWx1ZUV4cHJlc3Npb25bIikpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kRUxUZXJtcy5hZGQoZW50cnkudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxDb3VudCArPSByZXNvbHZlRUxUZXJtcyhlbnRyeSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gZWxDb3VudDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChvKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiArK2VsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2FuYWx5emUgYXJyYXlzDQotICAgICAgICBpZiAoYy5pc0FycmF5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW50IGxlbmd0aCA9IEFycmF5LmdldExlbmd0aChvKTsNCi0gICAgICAgICAgICAvL2NoZWNrIGFycmF5IFtMIC0+IG5vIGFycmF5IG9mIHByaW1pdGl2ZSB0eXBlcw0KLSAgICAgICAgICAgIGlmIChvLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiW0wiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChvLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiW0xqYXZhLmxhbmcuU3RyaW5nIikpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKEFycmF5LmdldChvLCBpKSkpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kRUxUZXJtcy5hZGQoby50b1N0cmluZygpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbENvdW50Kys7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoQXJyYXkuZ2V0KG8sIGkpLCB2aXNpdGVkLCBmb3VuZEVMVGVybXMsIGNvdW50ICsgMSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGVsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PEZpZWxkPiBhdHRyaWJ1dGVzID0gZmluZEFsbEF0dHJpYnV0ZXMoYywgbmV3IEFycmF5TGlzdDxGaWVsZD4oKSk7DQotICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGF0dHJpYnV0ZXMudG9BcnJheShuZXcgRmllbGRbYXR0cmlidXRlcy5zaXplKCldKTsNCi0NCi0gICAgICAgIEFjY2Vzc2libGVPYmplY3Quc2V0QWNjZXNzaWJsZShmaWVsZHMsIHRydWUpOw0KLSAgICAgICAgZm9yIChGaWVsZCBjdXJyZW50RmllbGQgOiBmaWVsZHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5nZXQobykgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmdldFR5cGUoKS5lcXVhbHMoU3RyaW5nLmNsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQuZ2V0KG8pICE9IG51bGwgJiYgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQoY3VycmVudEZpZWxkLmdldChvKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZEVMVGVybXMgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBlbENvdW50Kys7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZiAoIWN1cnJlbnRGaWVsZC5nZXRUeXBlKCkuaXNQcmltaXRpdmUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoY3VycmVudEZpZWxkLmdldChvKSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBlbENvdW50Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8RmllbGQ+IGZpbmRBbGxBdHRyaWJ1dGVzKENsYXNzIGMsIExpc3Q8RmllbGQ+IGF0dHJpYnV0ZXMpDQotICAgIHsNCi0gICAgICAgIGlmIChjID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7DQotICAgICAgICB9DQotICAgICAgICBmaW5kQWxsQXR0cmlidXRlcyhjLmdldFN1cGVyY2xhc3MoKSwgYXR0cmlidXRlcyk7DQotDQotICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGMuZ2V0RGVjbGFyZWRGaWVsZHMoKTsNCi0gICAgICAgIGZvciAoRmllbGQgY3VycmVudEZpZWxkIDogZmllbGRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghTW9kaWZpZXIuaXNTdGF0aWMoY3VycmVudEZpZWxkLmdldE1vZGlmaWVycygpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKGN1cnJlbnRGaWVsZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB0cnlUb1JlcGxhY2VWYXJzKFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcHBlZEZhY2VsZXRzVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5Ow0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOw0KLSAgICAgICAgYm9vbGVhbiBsYXN0ID0gZmFsc2U7DQotDQotICAgICAgICB3aGlsZSh0cnVlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbGFzdCA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLQ0KLQ0KLSAgICAgICAgICAgIHByb3BlcnR5ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpOw0KLQ0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgIC5yZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgZ2V0TmV3UHJvcGVydHkocHJvcGVydHksIG1hcHBlZEZhY2VsZXRzVmFycykpOw0KLQ0KLSAgICAgICAgICAgIGlmKHJlc3VsdC5sZW5ndGgoKSA9PSAwKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkgKyAiLiIgKyByZXN1bHQ7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCk7DQotDQotICAgICAgICAgICAgaWYobGFzdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByZWZpeCgpICsgInsiICsgcmVzdWx0ICsgIn0iKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmV3UHJvcGVydHkoU3RyaW5nIG9sZFByb3BlcnR5LCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcHBlZEZhY2VsZXRzVmFycykNCi0gICAgew0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZpcnR1YWxWYXJzID0gZ2V0UG90ZW50aWFsVmlydHVhbFZhcnMob2xkUHJvcGVydHkpOw0KLQ0KLSAgICAgICAgZm9yKFN0cmluZyB2aXJ0dWFsVmFyIDogdmlydHVhbFZhcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobWFwcGVkRmFjZWxldHNWYXJzLmNvbnRhaW5zS2V5KHZpcnR1YWxWYXIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgb2xkUHJvcGVydHkgPSByZXBsYWNlUHJvcGVydHlWYWx1ZShvbGRQcm9wZXJ0eSwgdmlydHVhbFZhciwgbWFwcGVkRmFjZWxldHNWYXJzLmdldCh2aXJ0dWFsVmFyKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG9sZFByb3BlcnR5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRQb3RlbnRpYWxWaXJ0dWFsVmFycyhTdHJpbmcgb2xkUHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGludCBzdGFydCA9IC0xOw0KLSAgICAgICAgaW50IGVuZCA9IC0xOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZpcnR1YWxWYXJMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgb2xkUHJvcGVydHkubGVuZ3RoKCk7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihzdGFydCA9PSAtIDEgJiYgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICdbJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYoKHN0YXJ0ICE9IC0gMSAmJiBvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ1snKSB8fCBvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ10nKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZW5kID0gaTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYoc3RhcnQgIT0gLTEgJiYgZW5kICE9IC0xKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhckxpc3QuYWRkKG9sZFByb3BlcnR5LnN1YnN0cmluZyhzdGFydCwgZW5kKSk7DQotICAgICAgICAgICAgICAgIGlmKG9sZFByb3BlcnR5LmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IC0xOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVuZCA9IC0xOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB2aXJ0dWFsVmFyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVwbGFjZVByb3BlcnR5VmFsdWUoU3RyaW5nIG9sZFByb3BlcnR5LCBTdHJpbmcgdGFyZ2V0VmFyLCBTdHJpbmcgbmV3VmFsdWUpDQotICAgIHsNCi0gICAgICAgIGludCBpbmRleCA9IG9sZFByb3BlcnR5LmluZGV4T2YodGFyZ2V0VmFyKTsNCi0NCi0gICAgICAgIGlmKGluZGV4ID09IC0xKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBvbGRQcm9wZXJ0eTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoMCwgaW5kZXgpOw0KLSAgICAgICAgcmVzdWx0ICs9IG5ld1ZhbHVlOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdCArIG9sZFByb3BlcnR5LnN1YnN0cmluZyhpbmRleCArIHRhcmdldFZhci5sZW5ndGgoKSwgb2xkUHJvcGVydHkubGVuZ3RoKCkpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHJlcGxhY2UgdmlydHVhbCBmYWNlbGV0cyB2YXJzIChtYXAgc3ludGF4KQ0KLSAgICAgKiB0ZXN0ZWQgc3R5bGVzIChzaW1wbGUgYW5kIG5lc3RlZCk6IHRlc3RbaXhbaXgyW2l4M11dXQ0KLSAgICAgKi8NCi0gICAgLyoNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIF9jcmVhdGVCaW5kaW5nKExpc3Q8U3RyaW5nPiBleHByZXNzaW9ucywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOw0KLQ0KLSAgICAgICAgU3RyaW5nIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRCaW5kaW5nOw0KLSAgICAgICAgU3RyaW5nIHBhcnRPZkJpbmRpbmc7DQotDQotICAgICAgICBpbnQgaW5kZXhPZkJpbmRpbmdEZXRhaWxzOw0KLSAgICAgICAgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGFkZGVkVmlydHVhbE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBlbnRyeSA6IGV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbnRyeS5zdGFydHNXaXRoKCJWYWx1ZUV4cHJlc3Npb25bIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgZm91bmRCaW5kaW5nRGV0YWlscyA9IGVudHJ5LnNwbGl0KCIgIik7DQotICAgICAgICAgICAgaW5kZXhPZkJpbmRpbmdEZXRhaWxzID0gZmluZEluZGV4T2ZCaW5kaW5nRGV0YWlscyhmb3VuZEJpbmRpbmdEZXRhaWxzKTsNCi0NCi0gICAgICAgICAgICBpZiAoaW5kZXhPZkJpbmRpbmdEZXRhaWxzID09IC0xKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGJpbmRpbmdEZXRhaWxzID0gZm91bmRCaW5kaW5nRGV0YWlsc1tpbmRleE9mQmluZGluZ0RldGFpbHNdLnNwbGl0KCI9Iik7DQotDQotICAgICAgICAgICAgaWYgKGJpbmRpbmdEZXRhaWxzLmxlbmd0aCA8IDIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgPSBiaW5kaW5nRGV0YWlsc1sxXTsNCi0NCi0gICAgICAgICAgICAvL3RvIHN1cHBvcnQgYmxhbmtzIHdpdGhpbiBhIGJpbmRpbmcgd2l0aCBtYXAgc3ludGF4DQotICAgICAgICAgICAgaWYoY3VycmVudEJpbmRpbmcuY29udGFpbnMoInsiKSAmJiAhY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYWRkRnVydGhlckJpbmRpbmdQYXJ0cyhjdXJyZW50QmluZGluZywgZm91bmRCaW5kaW5nRGV0YWlscywgaW5kZXhPZkJpbmRpbmdEZXRhaWxzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUgIT0gbnVsbCAmJiBjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9lbnRyeSBmb3IgInZpcnR1YWwiIGZhY2VsZXRzIGJlYW5zDQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWlucyhiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHBhcnRPZkJpbmRpbmcgPSBjdXJyZW50QmluZGluZy5zdWJzdHJpbmcoY3VycmVudEJpbmRpbmcuaW5kZXhPZihwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgcHJldkZhY2VsZXRzQXR0cmlidXRlTmFtZS5sZW5ndGgoKSwgY3VycmVudEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLmFkZChiaW5kaW5nRGV0YWlsc1swXSk7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBwYXJ0T2ZCaW5kaW5nOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy9lbnRyeSBmb3IgInZpcnR1YWwiIGZhY2VsZXRzIHZhcg0KLSAgICAgICAgICAgIGVsc2UgaWYoIShjdXJyZW50QmluZGluZy5jb250YWlucygieyIpIHx8IGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhcnMucHV0KGJpbmRpbmdEZXRhaWxzWzBdLCBiaW5kaW5nRGV0YWlsc1sxXS5zdWJzdHJpbmcoMSwgYmluZGluZ0RldGFpbHNbMV0ubGVuZ3RoKCktMikpOw0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoIWFkZGVkVmlydHVhbE5hbWVzLmNvbnRhaW5zKGJpbmRpbmdEZXRhaWxzWzBdKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYWRkZWRWaXJ0dWFsTmFtZXMuYWRkKGJpbmRpbmdEZXRhaWxzWzBdKTsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGN1cnJlbnRCaW5kaW5nLnN1YnN0cmluZyhjdXJyZW50QmluZGluZy5pbmRleE9mKCJ7IikgKyAxLCBjdXJyZW50QmluZGluZy5pbmRleE9mKCJ9IikpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUgPSBiaW5kaW5nRGV0YWlsc1swXTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0gICAgKi8NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24uamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OGViNjYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiZGlmZmVyZW5jZSBiZXR3ZWVuIFsgYW5kIFsnIC0gdGVzdCB3aXRoIG1vcmUgY29uc3RlbGxhdGlvbnMiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSX0pDQotcHVibGljIGNsYXNzIFZhbHVlQmluZGluZ0V4cHJlc3Npb24NCi17DQotICAgIHByaXZhdGUgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBiYXNlOw0KLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJlZml4Ow0KLSAgICBwcml2YXRlIFN0cmluZyB0b2tlbjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlcGxhY2VPckFkZFByb3BlcnR5KFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuZXdQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gcmVwbGFjZVByb3BlcnR5KFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIC8vVE9ETyBhZGp1c3RtZW50cyBmb3IgaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5DQotICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkuZW5kc1dpdGgoIiddIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCksIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBhZGRQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIFN0cmluZyBuZXdQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUV4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzb3VyY2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBzb3VyY2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSk7DQotDQotICAgICAgICAvL1RPRE8gYWRqdXN0bWVudHMgZm9yIGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eQ0KLSAgICAgICAgaWYobmV3UHJvcGVydHkuc3RhcnRzV2l0aCgiWyciKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ocmVzdWx0ICsgbmV3UHJvcGVydHkgKyAifSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihyZXN1bHQgKyAiLiIgKyBuZXdQcm9wZXJ0eSArICJ9Iik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24oU3RyaW5nIGV4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIGlmKCFFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChleHByZXNzaW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGV4cHJlc3Npb24gKyAiIGlzIG5vIHZhbGlkIGVsLWV4cHJlc3Npb24iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGJvb2xlYW4gaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5ID0gZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiJ10iKSA9PSAtMTsNCi0gICAgICAgIGludCBpbmRleDEgPSBpc0R5bmFtaWNCYXNlQW5kUHJvcGVydHkgPyBleHByZXNzaW9uLmxhc3RJbmRleE9mKCJdIikgOiBleHByZXNzaW9uLmxhc3RJbmRleE9mKCInXSIpOw0KLSAgICAgICAgaW50IGluZGV4MiA9IGV4cHJlc3Npb24ubGFzdEluZGV4T2YoIi4iKTsNCi0NCi0gICAgICAgIGlmKGluZGV4MSA+IGluZGV4MikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgxKTsNCi0NCi0gICAgICAgICAgICBpbnQgaW5kZXgzID0gZmluZEluZGV4T2ZTdGFydGluZ0JyYWNrZXQoZXhwcmVzc2lvbik7DQotICAgICAgICAgICAgaWYoaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKGluZGV4MyArIDEsIGluZGV4MSk7DQotDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZyhpbmRleDMgKyAyLCBpbmRleDEpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB0aGlzLmJhc2UgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihleHByZXNzaW9uLnN1YnN0cmluZygwLCBpbmRleDMpICsgIn0iKTsNCi0gICAgICAgICAgICB0aGlzLnRva2VuID0gaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5ID8gIlsiIDogIlsnIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoIGluZGV4MiA+IGluZGV4MSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoaW5kZXgyICsgMSwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEgKTsNCi0gICAgICAgICAgICB0aGlzLmJhc2UgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihleHByZXNzaW9uLnN1YnN0cmluZygwLCBpbmRleDIpICsgIn0iKTsNCi0gICAgICAgICAgICB0aGlzLnRva2VuID0gIi4iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZygyLCBleHByZXNzaW9uLmxlbmd0aCgpIC0gMSk7DQotICAgICAgICAgICAgdGhpcy5wcmVmaXggPSBleHByZXNzaW9uLnN1YnN0cmluZygwLCAxKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUudHJpbSgpOw0KLSAgICAgICAgDQotICAgICAgICBpZigiWyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMudmFsdWUuc3RhcnRzV2l0aCgiJyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUuc3Vic3RyaW5nKDEsIHRoaXMudmFsdWUubGVuZ3RoKCkgLSAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy9yZXR1cm4gdGhpcy5iYXNlLnZhbHVlICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUuc3Vic3RyaW5nKDAsIHRoaXMudmFsdWUubGVuZ3RoKCkpICsgIiddIjsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBnZXRCYXNlRXhwcmVzc2lvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBiYXNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwcmVzc2lvblN0cmluZygpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMuYmFzZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBiYXNlRXhwcmVzc2lvbiA9IHRoaXMuYmFzZS5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotDQotICAgICAgICAgICAgaWYoIlsnIi5lcXVhbHModGhpcy50b2tlbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGJhc2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSkgKyB0aGlzLnRva2VuICsgdGhpcy52YWx1ZSArICInXX0iOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKCJbIi5lcXVhbHModGhpcy50b2tlbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGJhc2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSkgKyB0aGlzLnRva2VuICsgdGhpcy52YWx1ZSArICJdfSI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBiYXNlRXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgYmFzZUV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKSArIHRoaXMudG9rZW4gKyB0aGlzLnZhbHVlICsgIn0iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLnByZWZpeCArICJ7IiArIHRoaXMudmFsdWUgKyAifSI7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlLmdldFByZWZpeCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBwcmVmaXg7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMuYmFzZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuYmFzZS5zZXRQcmVmaXgocHJlZml4KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXhwcmVzc2lvblN0cmluZygpLmhhc2hDb2RlKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiAmJiBnZXRFeHByZXNzaW9uU3RyaW5nKCkNCi0gICAgICAgICAgICAuZXF1YWxzKCgoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbikgdGFyZ2V0KS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgaW50IGZpbmRJbmRleE9mU3RhcnRpbmdCcmFja2V0KFN0cmluZyBleHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBpbnQgY2xvc2VDb3VudCA9IDA7DQotICAgICAgICBmb3IoaW50IGkgPSBleHByZXNzaW9uLmxlbmd0aCgpIC0gMTsgaSA+IDA7IGktLSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihleHByZXNzaW9uLmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjbG9zZUNvdW50LS07DQotICAgICAgICAgICAgICAgIGlmKGNsb3NlQ291bnQgPCAwKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKGV4cHJlc3Npb24uY2hhckF0KGkpID09ICddJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNsb3NlQ291bnQrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0Fic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODJlNTE0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0Fic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFQ+IGltcGxlbWVudHMgTmFtZU1hcHBlckF3YXJlRmFjdG9yeTxOYW1lTWFwcGVyPFQ+Pg0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PENsYXNzPiBkZW5pZWROYW1lTWFwcGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWdpc3RlcihOYW1lTWFwcGVyPFQ+IG5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIGlmKCFkZW5pZWROYW1lTWFwcGVyTGlzdC5jb250YWlucyhuYW1lTWFwcGVyLmdldENsYXNzKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGdldE5hbWVNYXBwZXJMaXN0KCkuYWRkKG5hbWVNYXBwZXIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkZXJlZ2lzdGVyKENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBjbGFzc1RvRGVyZWdpc3RlcikNCi0gICAgew0KLSAgICAgICAgSXRlcmF0b3I8TmFtZU1hcHBlcjxUPj4gbmFtZU1hcHBlckl0ZXJhdG9yID0gZ2V0TmFtZU1hcHBlckxpc3QoKS5pdGVyYXRvcigpOw0KLSAgICAgICAgd2hpbGUobmFtZU1hcHBlckl0ZXJhdG9yLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihuYW1lTWFwcGVySXRlcmF0b3IubmV4dCgpLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc1RvRGVyZWdpc3Rlci5nZXROYW1lKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbmFtZU1hcHBlckl0ZXJhdG9yLnJlbW92ZSgpOw0KLSAgICAgICAgICAgICAgICAvL2Rvbid0IGJyZWFrIC0gZS5nLiB0byBkZXJlZ2lzdGVyIGFsbCB3cmFwcGVycy4uLg0KLSAgICAgICAgICAgICAgICAvL2JyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBkZW55KENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBjbGFzc1RvRGVueSkNCi0gICAgew0KLSAgICAgICAgZGVyZWdpc3RlcihjbGFzc1RvRGVueSk7DQotDQotICAgICAgICBzeW5jaHJvbml6ZWQgKGdldENsYXNzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZGVuaWVkTmFtZU1hcHBlckxpc3QuYWRkKGNsYXNzVG9EZW55KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdDxOYW1lTWFwcGVyPFQ+PiBnZXROYW1lTWFwcGVyTGlzdCgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9DbGFzc01hcHBpbmdGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9DbGFzc01hcHBpbmdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMjdlMGIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBDbGFzc01hcHBpbmdGYWN0b3J5PFAsIFI+Ci17Ci0gICAgUiBjcmVhdGUoUCBzb3VyY2UpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRGVmYXVsdEZhY3RvcnlGaW5kZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0RlZmF1bHRGYWN0b3J5RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MzJkYmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRGVmYXVsdEZhY3RvcnlGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5EZWZhdWx0RUxIZWxwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkRlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vL2R5bmFtaWMgYXBwcm9hY2ggdG8gY3JlYXRlIHRoZSBmYWN0b3JpZXMgZHVyaW5nIHRoZSBmaXJzdCByZXF1ZXN0LCB3aGVuIGEgZmFjZXMtY29udGV4dCBpcyBhdmFpbGFibGUNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RmFjdG9yeUZpbmRlciBpbXBsZW1lbnRzIEZhY3RvcnlGaW5kZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotICAgIHByb3RlY3RlZCBNYXA8RmFjdG9yeU5hbWVzLCBPYmplY3Q+IGZhY3RvcnlNYXAgPSBuZXcgSGFzaE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4oKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgRmFjdG9yeUZpbmRlciBmYWN0b3J5RmluZGVyID0gbmV3IERlZmF1bHRGYWN0b3J5RmluZGVyKCk7DQotDQotICAgIHByaXZhdGUgRGVmYXVsdEZhY3RvcnlGaW5kZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjdG9yeUZpbmRlciBnZXRJbnN0YW5jZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWN0b3J5RmluZGVyOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyBmaW5hbCA8VD4gVCBnZXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIGlmKCEoZmFjdG9yeU1hcC5jb250YWluc0tleShmYWN0b3J5TmFtZSkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRGYWN0b3J5KGZhY3RvcnlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoVClmYWN0b3J5TWFwLmdldChmYWN0b3J5TmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgc3dpdGNoIChmYWN0b3J5TmFtZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjYXNlIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlTWVzc2FnZVJlc29sdmVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBSRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBFTF9IRUxQRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZUVMSGVscGVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIEZBQ0VTX01FU1NBR0VfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZUZhY2VzTWVzc2FnZUZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgZGVmYXVsdDogLy9yZXF1aXJlZCBieSBjaGVja3N0eWxlDQotICAgICAgICB9DQotDQotICAgICAgICBpZihmYWN0b3J5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IHBvc3NpYmxlIHRvIGNyZWF0ZSBmYWN0b3J5ICIgKyBmYWN0b3J5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBmYWN0b3J5TWFwLnB1dChmYWN0b3J5TmFtZSwgZmFjdG9yeSk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZKTsNCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZKSk7DQotICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkpOw0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZKSk7DQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkpOw0KLSAgICAgICAgbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZKSk7DQotICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSApOw0KLSAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZKSk7DQotICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgY3JlYXRlRmFjZXNNZXNzYWdlRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fRkFDRVNfTUVTU0FHRV9GQUNUT1JZKTsNCi0gICAgICAgIGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkZBQ0VTX01FU1NBR0VfRkFDVE9SWSkpOw0KLQ0KLSAgICAgICAgT2JqZWN0IHRhcmdldCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KEN1c3RvbUluZm9ybWF0aW9uLkZBQ0VTX01FU1NBR0VfRkFDVE9SWS5uYW1lKCkpOw0KLSAgICAgICAgaWYodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0IGluc3RhbmNlb2YgU3RyaW5nKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzLmFkZCgoU3RyaW5nKXRhcmdldCk7DQotICAgICAgICB9DQotICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgY3JlYXRlRUxIZWxwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0RUxIZWxwZXJGYWN0b3J5KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2JkOGEzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRmFjZXNNZXNzYWdlRmFjdG9yeQ0KLXsNCi0gICAgRmFjZXNNZXNzYWdlIGNvbnZlcnQoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSk7DQotDQotICAgIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlGaW5kZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmMjYyNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnlGaW5kZXIKLXsKLSAgICA8VD4gVCBnZXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeU5hbWVzLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFmMzEzOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQotcHVibGljIGVudW0gRmFjdG9yeU5hbWVzCi17Ci0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksCi0gICAgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLAotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLAotCi0gICAgRkFDRVNfTUVTU0FHRV9GQUNUT1JZLAotCi0gICAgUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwKLSAgICBFTF9IRUxQRVJfRkFDVE9SWQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDJkMWYwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L05hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFQgZXh0ZW5kcyBOYW1lTWFwcGVyPg0KLXsNCi0gICAgdm9pZCByZWdpc3RlcihUIGNsYXNzVG9BZGQpOw0KLSAgICB2b2lkIGRlcmVnaXN0ZXIoQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IGNsYXNzVG9EZXJlZ2lzdGVyKTsNCi0gICAgdm9pZCBkZW55KENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBjbGFzc1RvRGVueSk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQwY2UyMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEFsbG93cyB0byBpbml0aWFsaXplIGNvbXBvbmVudHMgYmVmb3JlRW5jb2RlQmVnaW4uPGJyLz4KLSAqIGUuZy46IHlvdSBjYW4gYWRkIGluZm9ybWF0aW9uIGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIG1lY2hhbmlzbXMsLi4uCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTcxNTQwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBTdGF0aWNDb25maWd1cmF0aW9uPFQsIFI+Ci17Ci0gICAgdm9pZCBzZXRTb3VyY2VPZk1hcHBpbmcoU3RyaW5nIHBhdGgpOwotICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFQsIFI+PiBnZXRNYXBwaW5nKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMzMTBmNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8VCwgUj4KLXsKLSAgICBwcml2YXRlIFQgc291cmNlOwotICAgIHByaXZhdGUgUiB0YXJnZXQ7Ci0KLSAgICBwdWJsaWMgVCBnZXRTb3VyY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoVCBzb3VyY2UpCi0gICAgewotICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUiBnZXRUYXJnZXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRhcmdldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoUiB0YXJnZXQpCi0gICAgewotICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmJjZGM0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSX0pCi1wdWJsaWMgZW51bSBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMKLXsKLSAgICBNRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9DT05GSUcsCi0KLSAgICBTS0lQX1ZBTElEQVRJT05fU1VQUE9SVF9DT05GSUcKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24uamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDg3ZDBkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3MKLSAgICAgICAgPSBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VPZk1hcHBpbmcoU3RyaW5nIHBhdGgpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGdldE1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2Uoc291cmNlKTsKLSAgICAgICAgZW50cnkuc2V0VGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgIHRoaXMubWFwcGluZ3MuYWRkKGVudHJ5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWE2M2M0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LlJFVVNFfSkKLXB1YmxpYyBjbGFzcyBTdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPgotewotICAgIHByaXZhdGUgU3RyaW5nIHBhdGg7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmdzOwotCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlT2ZNYXBwaW5nKFN0cmluZyBwYXRoKQotICAgIHsKLSAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKLSAgICAgICAgLy9mb3JjZSByZWxvYWQKLSAgICAgICAgbWFwcGluZ3MgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGdldE1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgaWYobWFwcGluZ3MgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgICAgICB9Ci0KLSAgICAgICAgbWFwcGluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+KCk7Ci0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgbWFwcGluZyA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShwYXRoKTsKLQotICAgICAgICBpZiAobWFwcGluZyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2xvZ2dpbmcKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBFbnVtZXJhdGlvbiBrZXlzID0gbWFwcGluZy5nZXRLZXlzKCk7Ci0KLSAgICAgICAgU3RyaW5nIG1ldGFEYXRhS2V5OwotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOwotCi0gICAgICAgIHdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhRGF0YUtleSA9IChTdHJpbmcpIGtleXMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSA9IG1hcHBpbmcuZ2V0U3RyaW5nKG1ldGFEYXRhS2V5KTsKLQotICAgICAgICAgICAgYWRkTWFwcGluZyhtZXRhRGF0YUtleSwgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFwcGluZ3M7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIG1ldGFEYXRhS2V5LCBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQotICAgIHsKLSAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA9IG5ldyBTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIGVudHJ5LnNldFNvdXJjZShtZXRhRGF0YUtleSk7Ci0gICAgICAgIGVudHJ5LnNldFRhcmdldCh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpOwotICAgICAgICB0aGlzLm1hcHBpbmdzLmFkZChlbnRyeSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGQzZjA3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBSZW5kZXJlckludGVyY2VwdG9yCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEludGVyY2VwdG9ySWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmV0dXJuVmFsdWVPblNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oCi0gICAgICAgIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gc2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiwgT2JqZWN0IGN1cnJlbnRSZXR1cm5WYWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50UmV0dXJuVmFsdWU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIGJlZm9yZQotICAgICovCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIC8qCi0gICAgICogYWZ0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZnRlckRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZnRlckVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZnRlckVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZnRlckVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmE1MGE4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotew0KLSAgICAvKioNCi0gICAgICoNCi0gICAgICogQHBhcmFtIHByb3BlcnR5SW5mb3JtYXRpb24gdGhlIGluZm9ybWF0aW9uIGVudHJ5IHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9wZXJ0eQ0KLSAgICAgKi8NCi0gICAgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9SZW5kZXJlckludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZjI3NTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbGxvd3MgdG8gaW50ZXJjZXB0IHJlbmRlcmVyIG1ldGhvZHMuPGJyLz4KLSAqIEJhc2UgbWVjaGFuaXNtIG9mIGV4dHZhbC4gSXQgYWxsb3dzIHRvIGFkZCBjdXN0b20gaW5mcmFzdHJ1Y3R1cmVzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBSZW5kZXJlckludGVyY2VwdG9yCi17Ci0gICAgU3RyaW5nIGdldEludGVyY2VwdG9ySWQoKTsKLQotICAgIE9iamVjdCBnZXRSZXR1cm5WYWx1ZU9uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBza2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLCBPYmplY3QgY3VycmVudFJldHVyblZhbHVlKTsKLQotICAgIC8qCi0gICAgICogYmVmb3JlCi0gICAgICovCi0gICAgdm9pZCBiZWZvcmVEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKgotICAgICAqIGFmdGVyCi0gICAgICovCi0gICAgdm9pZCBhZnRlckRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdjMDlhYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEFsbG93cyB0byBpbnRlcmNlcHQgdmFsaWRhdGlvciBleGNlcHRpb25zLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAqIEBwYXJhbSBtZXRhRGF0YUVudHJ5IHRoZSBtZXRhIGRhdGEgZW50cnkgd2hpY2ggY29udGFpbnMgdGhlIG1ldGEgZGF0YSBvZiB0aGUgcHJvcGVydHkNCi0gICAgICogQHBhcmFtIGNvbnZlcnRlZE9iamVjdCB0aGUgY29udmVydGVkIHVzZXIgaW5wdXQNCi0gICAgICogQHBhcmFtIHZhbGlkYXRvckV4Y2VwdGlvbiB0aGUgY3VycmVudCBleGNlcHRpb24NCi0gICAgICogQHBhcmFtIHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IHdoaWNoIHRocmV3IHRoZSBleGNlcHRpb24NCi0gICAgICogQHJldHVybiBmYWxzZSB0byBzdG9wIHRocm93aW5nIHRoZSBleGNlcHRpb24NCi0gICAgICovDQotICAgIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk1Njk0OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXIuUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW5pdENvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYoISh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCB0byBpbml0IGNvbXBvbmVudCAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsKLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOwotCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gRXh0VmFsVXRpbHMuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IG1ldGFEYXRhRXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCkuZ2V0TWV0YURhdGFFbnRyaWVzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKGVudHJ5LmdldEtleSgpKTsKLQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCFza2lwVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uU3RyYXRlZ3ksIGVudHJ5KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSBFeHRWYWxVdGlscy5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKG1ldGFEYXRhID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZighbWV0YURhdGEuaXNFbXB0eSgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlNLSVBfVkFMSURBVElPTiwgQm9vbGVhbi5jbGFzcykpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04sIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vZ2V0IGNvbXBvbmVudCBpbml0aWFsaXplciBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50IGFuZCBjb25maWd1cmUgaXQKLSAgICAgICAgICAgICAgICAvL2Fsc28gaW4gY2FzZSBvZiBza2lwcGVkIHZhbGlkYXRpb24gdG8gcmVzZXQgZS5nLiB0aGUgcmVxdWlyZWQgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgaWYoIW1ldGFEYXRhLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbmZpZ3VyZUNvbXBvbmVudFdpdGhNZXRhRGF0YShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJpbml0IGNvbXBvbmVudCBvZiAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0ID0gd3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLQotICAgICAgICAvL3JlY29yZGUgdXNlciBpbnB1dCBlLmcuIGZvciBjcm9zcy1jb21wb25lbnQgdmFsaWRhdGlvbgotICAgICAgICBmb3IoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciByZWNvcmRlciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlY29yZGVyLnJlY29yZFVzZXJJbnB1dCh1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsKLQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHJlY29yZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjYWxsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9jZXNzVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbnZlcnRlckV4Y2VwdGlvbihlLmdldEZhY2VzTWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQotICAgIHsKLSAgICAgICAgaWYgKCEodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgdmFsaWRhdGlvbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsKLQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IEV4dFZhbFV0aWxzLmdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKCk7Ci0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KS5nZXRNZXRhRGF0YUVudHJpZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOwotCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoc2tpcFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblN0cmF0ZWd5LCBlbnRyeSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvL3JlcXVpcmVkIGlzIGEgc3BlY2lhbCBjYXNlIC0gcmVzZXQgaXQKLSAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZChmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInZhbGlkYXRlICIgKyBlbnRyeS5nZXRWYWx1ZSgpICsgIiB3aXRoICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyB2YWxpZGF0aW9uIHN0cmF0ZWd5IGZvdW5kIGZvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJ2YWxpZGF0aW9uIGZpbmlzaGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBza2lwVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBlbnRyeSkKLSAgICB7Ci0gICAgICAgIC8vb3ZlcnJpZGUgZm9yIGN1c3RvbSBza2lwIHZhbGlkYXRpb24gc3VwcG9ydCAoaWYgbmVlZGVkKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNTc4YzUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQSBnZW5lcmljIGltcGxlbWVudGF0aW9uLiBTdWJjbGFzc2VzIGp1c3QgaGF2ZSB0byBub3cgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBuYW1lIG1hcHBlci4NCi0gKg0KLSAqIE5hbWVNYXBwZXJzIGFyZSBzdGF0ZWxlc3MuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VD4gaW1wbGVtZW50cyBOYW1lTWFwcGVyPFQ+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLSAgICBwcml2YXRlIE5hbWVNYXBwZXI8VD4gY3VzdG9tTmFtZU1hcHBlcjsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFQgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZiAoY3VzdG9tTmFtZU1hcHBlciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCk7DQotDQotICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTmFtZU1hcHBlciA9IChOYW1lTWFwcGVyPFQ+KSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKGN1c3RvbU5hbWVNYXBwZXIgIT0gbnVsbCkgPyBjdXN0b21OYW1lTWFwcGVyLmNyZWF0ZU5hbWUoc291cmNlKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YjZkNDMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgZm9yIG5hbWUgbWFwcGVycy4NCi0gKiBBIG5hbWUgbWFwcGVyIGNhbGN1bGF0ZXMgYSBuYW1lIGZvciBhIGdpdmVuIHNvdXJjZSBvYmplY3QuDQotICogZS5nLiBNZXRhLURhdGEgS2V5IChlLmcuOiBhbm5vdGF0aW9uIGNsYXNzIG5hbWUpIC0+IFZhbGlkYXRpb25TdHJhdGVneQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBOYW1lTWFwcGVyPFQ+DQotew0KLSAgICBTdHJpbmcgY3JlYXRlTmFtZShUIHNvdXJjZSk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyOGJhZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvQ29tbW9uTWV0YURhdGFLZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIGhlbHBlciBmb3IgZnJlcXVlbnQgbWV0YS1kYXRhIGtleXMKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi0vKgotICogcGxhY2VkIGluIGNvcmUgdG8gYXZvaWQgZHVwbGljYXRlZCBpbmZvcm1hdGlvbiBpbiBtdWx0aXBsZSBtb2R1bGVzICh2YWxpZGF0aW9uIG1vZHVsZSBhbmQgY29tcG9uZW50LXN1cHBvcnQgbW9kdWxlKQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGludGVyZmFjZSBDb21tb25NZXRhRGF0YUtleXMKLXsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVJUkVEID0gInJlcXVpcmVkIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQUtfUkVRVUlSRUQgPSAid2Vha19yZXF1aXJlZCI7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTl9MRU5HVEggPSAibWluX2xlbmd0aCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfTEVOR1RIID0gIm1heF9sZW5ndGgiOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9NSU4gPSAicmFuZ2VfbWluIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01BWCA9ICJyYW5nZV9tYXgiOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRURVJOID0gInBhdHRlcm4iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUVEVSTl9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UgPSAicGF0dGVybl92YWxpZGF0aW9uX2Vycm9yX21lc3NhZ2UiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1BSUwgPSAiZW1haWwiOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT00gPSAiY3VzdG9tIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSVBfVkFMSURBVElPTiA9ICJza2lwX3ZhbGlkYXRpb24iOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL01ldGFEYXRhRW50cnkuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9NZXRhRGF0YUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNTQ1ODIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL01ldGFEYXRhRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBEYXRhIGhvbGRlciB3aGljaCBzdG9yZXMgdGhlIG1ldGEtZGF0YSBhbmQgc29tZSBpbmZvcm1hdGlvbiB3aGVyZSB0aGUgbWV0YS1kYXRhIHdhcyBhcm91bmQuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgTWV0YURhdGFFbnRyeQotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBrZXk7Ci0gICAgcHJpdmF0ZSBPYmplY3QgdmFsdWU7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgic2V0dGluZyBtZXRhLWRhdGEga2V5OiAiICsga2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gVCBnZXRWYWx1ZShDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVClnZXRWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJzZXR0aW5nIG1ldGEtZGF0YSB2YWx1ZTogIiArIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpZ2V0UHJvcGVydHkoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgibmV3IHByb3BlcnR5IGFkZGVkIGtleTogIiArIGtleSArICIgdmFsdWU6ICIgKyB2YWx1ZSArICIgZm9yIG1ldGFkYXRhLWtleTogIiArIHRoaXMua2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMucHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMmY0YTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGFsbCBmYWN0b3JpZXMgd2hpY2ggY3JlYXRlIG1ldGEtZGF0YSBleHRyYWN0b3JzCi0gKiAKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkKLXsKLSAgICBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGUoKTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTg5YzkwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIGV4dHJhY3RzIG1ldGEtZGF0YSAoZS5nLiB0aGUgYW5ub3RhdGlvbnMpIG9mIHRoZSB2YWx1ZSBiaW5kaW5nIG9mIGEgY29tcG9uZW50LgotICogSXQgZXh0cmFjdHMgdGhlIG1ldGEtZGF0YSBvZiB0aGUgZmllbGQgYW5kIHRoZSBwcm9wZXJ0eS4KLSAqIChBbHNvIHRoZSBhbm5vdGF0aW9ucyBvZiBzdXBlciBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzLikKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvciBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdG9yCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHB1YmxpYyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVG9EbyhQcmlvcml0eS5NRURJVU0pCi0gICAgcHVibGljIFByb3BlcnR5SW5mb3JtYXRpb24gZXh0cmFjdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKCk7Ci0KLSAgICAgICAgLy9zaG91bGQgbmV2ZXIgb2NjdXIKLSAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgVUlDb21wb25lbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkgJiYgb2JqZWN0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihvYmplY3QuZ2V0Q2xhc3MoKSArICIgaXMgbm8gdmFsaWQgY29tcG9uZW50Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50ID0gKFVJQ29tcG9uZW50KSBvYmplY3Q7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgZXh0cmFjdGluZyBtZXRhLWRhdGEgb2YgIiArIHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAocHJvcGVydHlEZXRhaWxzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZ2V0IGJlYW4gY2xhc3MgYW5kIHByb3BlcnR5IG5hbWUKLSAgICAgICAgICovCi0gICAgICAgIENsYXNzIGVudGl0eUNsYXNzID0gcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpOwotCi0gICAgICAgIC8vY3JlYXRlCi0gICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uc2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBmaW5kIGFuZCBhZGQgYW5ub3RhdGlvbnMKLSAgICAgICAgICovCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IGVudGl0eUNsYXNzOwotCi0gICAgICAgIHdoaWxlICghT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY3VycmVudENsYXNzLmdldE5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoY3VycmVudENsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgICAgICBhZGRGaWVsZEFjY2Vzc0Fubm90YXRpb25zKGN1cnJlbnRDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhjdXJyZW50Q2xhc3MsIHByb3BlcnR5RGV0YWlscywgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0KLSAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHRyYWN0IGZpbmlzaGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ludGVyZmFjZXMoCi0gICAgICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MsIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMsIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IGN1cnJlbnRDbGFzcy5nZXRJbnRlcmZhY2VzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoY3VycmVudEludGVyZmFjZSwgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhjdXJyZW50SW50ZXJmYWNlLCBwcm9wZXJ0eURldGFpbHMsIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIHByb3BlcnR5ID0gcHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSk7Ci0KLSAgICAgICAgTWV0aG9kIG1ldGhvZDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0aG9kID0gZW50aXR5LmdldERlY2xhcmVkTWV0aG9kKCJnZXQiICsgcHJvcGVydHkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kID0gZW50aXR5LmdldERlY2xhcmVkTWV0aG9kKCJpcyIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJtZXRob2Qgbm90IGZvdW5kIC0gY2xhc3M6ICIgKyBlbnRpdHkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgLSBtZXRob2RzOiAiICsgImdldCIgKyBwcm9wZXJ0eSArICIgIiArICJpcyIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoQXJyYXlzLmFzTGlzdChtZXRob2QuZ2V0QW5ub3RhdGlvbnMoKSksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBGaWVsZCBmaWVsZDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmllbGQgPSBlbnRpdHkuZ2V0RGVjbGFyZWRGaWVsZChwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWVsZCA9IGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKCJfIiArIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZmllbGQgIiArIHByb3BlcnR5ICsgIiBvciBfIiArIHByb3BlcnR5ICsgIiBub3QgZm91bmQiLCBlMSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoQXJyYXlzLmFzTGlzdChmaWVsZC5nZXRBbm5vdGF0aW9ucygpKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoCi0gICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMsIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uYWRkTWV0YURhdGFFbnRyeShjcmVhdGVNZXRhRGF0YUVudHJ5Rm9yQW5ub3RhdGlvbihhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShhbm5vdGF0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmb3VuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1ldGFEYXRhRW50cnkgY3JlYXRlTWV0YURhdGFFbnRyeUZvckFubm90YXRpb24oQW5ub3RhdGlvbiBmb3VuZEFubm90YXRpb24pCi0gICAgewotICAgICAgICBNZXRhRGF0YUVudHJ5IGVudHJ5ID0gbmV3IE1ldGFEYXRhRW50cnkoKTsKLQotICAgICAgICBlbnRyeS5zZXRLZXkoZm91bmRBbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgZW50cnkuc2V0VmFsdWUoZm91bmRBbm5vdGF0aW9uKTsKLQotICAgICAgICByZXR1cm4gZW50cnk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkNzBhZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGlzIGZhY3RvcnkgY3JlYXRlcyBhIG1ldGEtZGF0YSBleHRyYWN0b3Igd2hpY2ggZXh0cmFjdHMgdGhlIG1ldGEtZGF0YQotICogb2YgdGhlIHZhbHVlIGJpbmRpbmcgb2YgYSBjb21wb25lbnQuCi0gKiA8cC8+Ci0gKiBvcmRlcjo8YnIvPgotICogPG9sPgotICogICA8bGk+Y29uZmlndXJlZCBtZXRhLWRhdGEgZXh0cmFjdG9yICh3ZWIueG1sKTwvbGk+Ci0gKiAgIDxsaT5jb25maWd1cmVkIG1ldGEtZGF0YSBleHRyYWN0b3IgKGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pPC9saT4KLSAqICAgPGxpPmRlZmF1bHQgaW1wbGVtZW50YXRpb248L2xpPgotICogPC9vbD4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkKLXsKLSAgICBwcml2YXRlIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gbnVsbDsKLQotICAgIHB1YmxpYyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQotICAgIHB1YmxpYyBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGUoKQotICAgIHsKLSAgICAgICAgaWYgKG1ldGFEYXRhRXh0cmFjdG9yID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SKTsKLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SKSk7Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMuYWRkKERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3IgPSAoTWV0YURhdGFFeHRyYWN0b3IpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1ldGFEYXRhRXh0cmFjdG9yICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKG1ldGFEYXRhRXh0cmFjdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjcmVhdGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvcihtZXRhRGF0YUV4dHJhY3Rvcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9NZXRhRGF0YUV4dHJhY3Rvci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9NZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDQwNTFkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLQotLyoqCi0gKiBBbiBtZXRhLWRhdGEgZXh0cmFjdG9yIGlzIHJlc3BvbnNpYmxlIHRvIGFuYWx5emUgYW4gb2JqZWN0Ci0gKiBhbmQgcmV0dXJucyBhbGwgYXZhaWxhYmxlIG1ldGEtZGF0YSBpbmZvcm1hdGlvbgotICogCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFFeHRyYWN0b3IKLXsKLSAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OTkxMmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSBlcXVpdmFsZW50IHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0Lg0KLSAqDQotICogaWYgdGhlcmUgaXMgYWxzbyBhIHByb3h5IGZvciB0aGUgZXh0cmFjdG9yIHlvdSBjYW4gdXNlIHRoZSBjbGFzc05hbWUgcHJvcGVydHkgdG8gbWFudWFsbHkgcmVwZWF0IHRoZQ0KLSAqIGZ1bGwgcXVhbGlmaWVkIGNsYXNzIG5hbWUuDQotICoNCi0gKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgaW50ZXJmYWNlIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlciBleHRlbmRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGVhODE5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgZXF1aXZhbGVudCB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0gKg0KLSAqIGlmIHRoZXJlIGlzIGFsc28gYSBwcm94eSBmb3IgdGhlIHRyYW5zZm9ybWVyIHlvdSBjYW4gdXNlIHRoZSBjbGFzc05hbWUgcHJvcGVydHkgdG8gbWFudWFsbHkgcmVwZWF0IHRoZQ0KLSAqIGZ1bGwgcXVhbGlmaWVkIGNsYXNzIG5hbWUuDQotICoNCi0gKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgY2xhc3MgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbCBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXIsIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIHByaXZhdGUgU3RyaW5nIG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWU7DQotDQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKG1ldGFEYXRhRW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoU3RyaW5nIG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSA9IG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhVHJhbnNmb3JtZXIoTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXIgPSBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI1MTYyYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotDQotLyoqDQotICogRmFjdG9yeSB3aGljaCBjcmVhdGVzIHRoZSBNZXRhRGF0YVRyYW5zZm9ybWVyIGZvciBhIGdpdmVuIFZhbGlkYXRpb25TdHJhdGVneQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotLyoNCi0gKiBWYWxpZGF0aW9uU3RyYXRlZ3kgLT4gTWV0YURhdGFUcmFuc2Zvcm1lciBpbnN0ZWFkIG9mIE1ldGEtRGF0YSAtPiBNZXRhRGF0YVRyYW5zZm9ybWVyDQotICogdG8gYXZvaWQgYSBzZWNvbmQgc3RhdGljIG1hcHBpbmcgZS5nLiBmb3IganBhIGFubm90YXRpb25zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneT4NCi0gICAgICAgIGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1ldGFEYXRhVHJhbnNmb3JtZXI+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZzsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgY3JlYXRlKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lID0gbnVsbDsNCi0NCi0gICAgICAgIC8vcHJveHkgY2hlY2sNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICAvL2luIGNhc2Ugb2YgYSBwcm94eSBhbmQgdGhlIHVzYWdlIG9mIGEgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi0gICAgICAgIGVsc2UgaWYgKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgPSAoKEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKXZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljTWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHZhbGlkYXRpb25TdHJhdGVneU5hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoTWV0YURhdGFUcmFuc2Zvcm1lcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcuZ2V0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgIFN0cmluZyB0cmFuc2Zvcm1lck5hbWU7DQotICAgICAgICAvL251bGwgLT4gdXNlIG5hbWUgbWFwcGVycw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyYW5zZm9ybWVyTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lck5hbWUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyID0gKE1ldGFEYXRhVHJhbnNmb3JtZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHRyYW5zZm9ybWVyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneU5hbWUgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYWRkTWFwcGluZyh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCB0cmFuc2Zvcm1lck5hbWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgLy9zZXR1cCBpbnRlcm5hbCBzdGF0aWMgbWFwcGluZ3MNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnIDoNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhtYXBwaW5nLmdldFNvdXJjZSgpLCBtYXBwaW5nLmdldFRhcmdldCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0cmFuc2Zvcm1lck5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkaW5nIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWV0YS1kYXRhIHRyYW5zZm9ybWVyIG1hcHBpbmc6ICINCi0gICAgICAgICAgICAgICAgKyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgIiAtPiAiICsgdHJhbnNmb3JtZXJOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcucHV0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIHRyYW5zZm9ybWVyTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1MDRiMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gdHJhbnNmb3JtIGNvbmNyZXRlIG1ldGEtZGF0YSB0byBhIG1vcmUgYWJzdHJhY3QgZm9ybS48YnIvPg0KLSAqIGUuZy46IEBSZXF1aXJlZCwgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLC4uLiksIEBMZW5ndGgobWluaW11bSA9IDEpLCAuLi4gLT4gcmVxdWlyZWQgPSB0cnVlDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotLy8qVHJhbnNmb3JtZXIgaW5zdGVhZCBvZiAqQ29udmVydGVyIHRvIGF2b2lkIG5hbWluZyBjb25mdXNpb24gDQotcHVibGljIGludGVyZmFjZSBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMzRmZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIKLSAgICBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjMzMWUyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciAtIGlmIHRoZXJlIGlzIGEgcHJveHkgYXJvdW5kIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5Lg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoKEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKXZhbGlkYXRpb25TdHJhdGVneSkuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTdiMmQ5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gTWV0YURhdGFUcmFuc2Zvcm1lcnMuDQotICogKGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYWNkMTEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1ldGFEYXRhVHJhbnNmb3JtZXJzLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWJlZGIwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBtYXBzIEV4dFZhbCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBnZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzA5ZWYxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciB0byBwbGFjZSBWYWxpZGF0aW9uU3RyYXRlZ2llcyBhbmQgTWV0YURhdGFUcmFuc2Zvcm1lcnMgaW4gdGhlIHNhbWUgcGFja2FnZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGdldFNpbXBsZU1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkgKyAiLiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNpbXBsZU1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lQYWNrYWdlTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHBvc3RmaXggPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfUE9TVEZJWCk7DQotDQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUuZW5kc1dpdGgoIlZhbGlkYXRpb25TdHJhdGVneSIpIHx8DQotICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUuZW5kc1dpdGgoIlN0cmF0ZWd5IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneVBhY2thZ2VOYW1lICsgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lDQotICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgpICxwb3N0Zml4KQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoIlZhbGlkYXRpb25TdHJhdGVneSIsIHBvc3RmaXgpDQotICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgiU3RyYXRlZ3kiLCBwb3N0Zml4KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vaW4gY2FzZSBvZiBhIHN0YXRpYyB2YWxpZGF0aW9uIHN0cmF0ZWd5IG1hcHBpbmcNCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lQYWNrYWdlTmFtZSArIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSArIHBvc3RmaXg7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1ZjUyOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uIGltcGxlbWVudHMgUHJvcGVydHlJbmZvcm1hdGlvbgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gaW5mb3JtYXRpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICBwcml2YXRlIExpc3Q8TWV0YURhdGFFbnRyeT4gbWV0YURhdGFMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUVudHJ5PigpOwotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNJbmZvcm1hdGlvbihTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZm9ybWF0aW9uTWFwLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZm9ybWF0aW9uTWFwLmdldChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gVCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVCkgZ2V0SW5mb3JtYXRpb24oa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgibmV3IGluZm9ybWF0aW9uIGFkZGVkIGtleTogIiArIGtleSArICIgdmFsdWU6ICIgKyB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmZvcm1hdGlvbk1hcC5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGFEYXRhRW50cnlbXSBnZXRNZXRhRGF0YUVudHJpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhTGlzdC50b0FycmF5KG5ldyBNZXRhRGF0YUVudHJ5W21ldGFEYXRhTGlzdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXRhRGF0YUVudHJ5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkKLSAgICB7Ci0gICAgICAgIG1ldGFEYXRhRW50cnkuc2V0UHJvcGVydGllcyh0aGlzLmluZm9ybWF0aW9uTWFwKTsKLSAgICAgICAgdGhpcy5tZXRhRGF0YUxpc3QuYWRkKG1ldGFEYXRhRW50cnkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0TWV0YURhdGFFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJyZXNldHRpbmcgbWV0YS1kYXRhIGVudHJpZXMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMubWV0YURhdGFMaXN0LmNsZWFyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTAzN2NmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eURldGFpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eURldGFpbHMKLXsKLSAgICAvL2Zvcm1zIHRoZSBpZCBmb3IgY3Jvc3MtdmFsaWRhdGlvbiB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzCi0gICAgcHJpdmF0ZSBTdHJpbmcga2V5OwotICAgIHByaXZhdGUgT2JqZWN0IGJhc2VPYmplY3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlEZXRhaWxzKFN0cmluZyBrZXksIE9iamVjdCBiYXNlT2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICAgICAgdGhpcy5iYXNlT2JqZWN0ID0gYmFzZU9iamVjdDsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJhc2VPYmplY3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJhc2VPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZU9iamVjdChPYmplY3QgYmFzZU9iamVjdCkKLSAgICB7Ci0gICAgICAgIHRoaXMuYmFzZU9iamVjdCA9IGJhc2VPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDkyODRmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5SW5mb3JtYXRpb24KLXsKLSAgICBib29sZWFuIGNvbnRhaW5zSW5mb3JtYXRpb24oU3RyaW5nIGtleSk7Ci0gICAgT2JqZWN0IGdldEluZm9ybWF0aW9uKFN0cmluZyBrZXkpOwotICAgIDxUPiBUIGdldEluZm9ybWF0aW9uKFN0cmluZyBrZXksIENsYXNzPFQ+IHRhcmdldENsYXNzKTsKLSAgICB2b2lkIHNldEluZm9ybWF0aW9uKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSk7Ci0KLSAgICBNZXRhRGF0YUVudHJ5W10gZ2V0TWV0YURhdGFFbnRyaWVzKCk7Ci0gICAgdm9pZCBhZGRNZXRhRGF0YUVudHJ5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSk7Ci0gICAgdm9pZCByZXNldE1ldGFEYXRhRW50cmllcygpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRlOTI1Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlJbmZvcm1hdGlvbktleXMKLXsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFVEFJTFMgPSAicHJvcGVydHlfZGV0YWlscyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lQX1ZBTElEQVRJT04gPSAic2tpcF92YWxpZGF0aW9uIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gImxhYmVsIjsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZWNvcmRlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzBmMjNmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZWNvcmRlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotCi0vKioKLSAqIEFsbG93cyB0byBjYXB0dXJlIGNvbnZlcnRlZCB2YWx1ZXMuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIKLXsKLSAgICB2b2lkIHJlY29yZFVzZXJJbnB1dChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZGU1YzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLQotLyoqCi0gKiBCYXNlIGZvciBhbGwgUmVuZGVyS2l0V3JhcHBlckZhY3RvcmllcyB0byBmb3JjZSBhIHNwZWNpZmljIGJlaGF2aW91cgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFJlbmRlcktpdCwgUmVuZGVyS2l0PgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSB3cmFwcGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBkZWFjdGl2YXRlZCA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeShBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRoaXMud3JhcHBlZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLndyYXBwZWQuYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkocmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkZWFjdGl2YXRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5kZWFjdGl2YXRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWFjdGl2YXRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVhY3RpdmF0ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFJlbmRlcktpdCBjcmVhdGUoUmVuZGVyS2l0IHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIGlmKGlzRGVhY3RpdmF0ZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBSZW5kZXJLaXQgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBpZih0aGlzLndyYXBwZWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy53cmFwcGVkLmNyZWF0ZShyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVXcmFwcGVyKHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0RlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDdlMDUwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ci17Ci0gICAgcHJpdmF0ZSBSZW5kZXJLaXQgcmVuZGVyS2l0OwotCi0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCBjcmVhdGVXcmFwcGVyKFJlbmRlcktpdCByZW5kZXJLaXQpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVya2l0IHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcktpdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLnJlbmRlcktpdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnJlbmRlcktpdCA9IG5ldyBFeHRWYWxSZW5kZXJLaXQocmVuZGVyS2l0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJLaXQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM2YWJkMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbExhenlSZW5kZXJlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7DQotDQotLyoqDQotICogdG8gc3VwcG9ydCBhIGN1c3RvbSBwcm94eQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBFeHRWYWxMYXp5UmVuZGVyZXJQcm94eSBleHRlbmRzIFJlbmRlcmVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIFJlbmRlcmVyIHdyYXBwZWQ7DQotDQotICAgIHB1YmxpYyBFeHRWYWxMYXp5UmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyZXI7DQotDQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInNpbXBsZSBwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldExhenlSZW5kZXJlcigpLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQ0KLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBSZW5kZXJlciBnZXRMYXp5UmVuZGVyZXIoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcHJveHlDbGFzc05hbWUgPSAoU3RyaW5nKSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSk7DQotDQotICAgICAgICBpZihwcm94eUNsYXNzTmFtZSAhPSBudWxsICYmICFwcm94eUNsYXNzTmFtZS5lbmRzV2l0aChnZXRDbGFzcygpLmdldE5hbWUoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShwcm94eUNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYodGFyZ2V0Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImEgY3VzdG9tIGludmFsaWQgcmVuZGVyZXIgcHJveHkgaXMgY29uZmlndXJlZDogIiArIHByb3h5Q2xhc3NOYW1lKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgQ2xhc3NbXSBhcmdDbGFzc2VzID0gbmV3IENsYXNzWzFdOw0KLSAgICAgICAgICAgIGFyZ0NsYXNzZXNbMF0gPSBSZW5kZXJlci5jbGFzczsNCi0NCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGFyZ2V0Q2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJnQ2xhc3Nlcyk7DQotICAgICAgICAgICAgICAgIHJldHVybiAoUmVuZGVyZXIpY29uc3RydWN0b3IubmV3SW5zdGFuY2UodGhpcy53cmFwcGVkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGNyZWF0ZTogIiArIHRhcmdldENsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzNTRlNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVN0cmVhbTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LlJlc3BvbnNlV3JpdGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZXNwb25zZVN0YXRlTWFuYWdlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcktpdCBleHRlbmRzIFJlbmRlcktpdAotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcktpdChSZW5kZXJLaXQgd3JhcHBlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlLCBSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIGlmIChyZW5kZXJlciBpbnN0YW5jZW9mIEV4dFZhbFJlbmRlcmVyV3JhcHBlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgcmVuZGVyZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgY3JlYXRlV3JhcHBlcihyZW5kZXJlcikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFJlbmRlcmVyIGdldFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUpCi0gICAgewotICAgICAgICBSZW5kZXJlciByZW5kZXJlciA9IHdyYXBwZWQuZ2V0UmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUpOwotCi0gICAgICAgIGlmKHJlbmRlcmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJlciBpbnN0YW5jZW9mIEV4dFZhbFJlbmRlcmVyV3JhcHBlciA/IHJlbmRlcmVyIDogY3JlYXRlV3JhcHBlcihyZW5kZXJlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oIm5vIHJlbmRlcmVyIGZvdW5kIGZvciBmYW1pbHkgIiArIGZhbWlseSArICIgYW5kIHR5cGUgIiArIHJlbmRlcmVyVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVuZGVyZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlU3RhdGVNYW5hZ2VyIGdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlV3JpdGVyIGNyZWF0ZVJlc3BvbnNlV3JpdGVyKFdyaXRlciB3cml0ZXIsIFN0cmluZyBzLCBTdHJpbmcgczEpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jcmVhdGVSZXNwb25zZVdyaXRlcih3cml0ZXIsIHMsIHMxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdHJlYW0gY3JlYXRlUmVzcG9uc2VTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmNyZWF0ZVJlc3BvbnNlU3RyZWFtKG91dHB1dFN0cmVhbSk7Ci0gICAgfQotCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkKLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgY3JlYXRlV3JhcHBlcihSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRXh0VmFsUmVuZGVyZXJXcmFwcGVyKHJlbmRlcmVyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjgyYmJjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIGNlbnRyYWwgbWVjaGFuaXNtIHdoaWNoIGlzIHJlc3BvbnNpYmxlIHRvIGNyZWF0ZSBhIHdyYXBwZXIgZm9yIGEgcmVuZGVyZXIgLSBzdGFydGluZyBwb2ludCBvZiBleHR2YWwuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJLaXRGYWN0b3J5IGV4dGVuZHMgUmVuZGVyS2l0RmFjdG9yeQotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0gICAgcHJpdmF0ZSBSZW5kZXJLaXRGYWN0b3J5IHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeShSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnkpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSByZW5kZXJLaXRGYWN0b3J5OwotCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyS2l0KFN0cmluZyBzLCBSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJLaXQocywgcmVuZGVyS2l0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVuZGVyS2l0IGdldFJlbmRlcktpdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIFJlbmRlcktpdCByZW5kZXJLaXQgPSB0aGlzLndyYXBwZWQuZ2V0UmVuZGVyS2l0KGZhY2VzQ29udGV4dCwgcyk7Ci0KLSAgICAgICAgLy9qc2YgcmkgKyB0cmluaWRhZAotICAgICAgICBpZihyZW5kZXJLaXQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHdyYXBwZXJGYWN0b3J5ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgLy9zb21lIGNvbXBvbmVudCBsaWJzIGUuZy4gbXlmYWNlcy10cmluaWRhZCBhcmVuJ3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgY2xlYW4gYXBwcm9hY2gKLSAgICAgICAgLy9leGFtcGxlIHNlZSBUcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lcgotICAgICAgICBpZih3cmFwcGVyRmFjdG9yeS5pc0RlYWN0aXZhdGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJLaXQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gd3JhcHBlckZhY3RvcnkuY3JlYXRlKHJlbmRlcktpdCk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gZ2V0UmVuZGVyS2l0SWRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlbmRlcktpdElkcygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MzRmZTIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiB0byBhdm9pZCBtdWx0aXBsZSBjYWxscyBvZiByZW5kZXJlciBtZXRob2RzIHdpdGhpbiByZW5kZXJlciBpbnRlcmNlcHRvcnMgKGUuZy4gZm9yIGVuY29kZSwgZGVjb2RlLC4uLikKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcmVyUHJveHkgZXh0ZW5kcyBSZW5kZXJlcgotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9IEV4dFZhbFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpICsgIjpLRVkiOwotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0gICAgCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHJlbmRlcmVyOwotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInByb3h5IGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5RW50cnkgZW50cnkgPSBnZXRPckluaXRFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRGVjb2RlQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldERlY29kZUNhbGxlZCh0cnVlKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVkLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkb3VibGUgY2FsbCBvZiBtZXRob2QgJ2RlY29kZScgZmlsdGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlFbnRyeSBlbnRyeSA9IGdldE9ySW5pdEVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNFbmNvZGVCZWdpbkNhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXRFbmNvZGVCZWdpbkNhbGxlZCh0cnVlKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlZC5lbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkb3VibGUgY2FsbCBvZiBtZXRob2QgJ2VuY29kZUJlZ2luJyBmaWx0ZXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eUVudHJ5IGVudHJ5ID0gZ2V0T3JJbml0RW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0VuY29kZUNoaWxkcmVuQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldEVuY29kZUNoaWxkcmVuQ2FsbGVkKHRydWUpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLndyYXBwZWQuZW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZG91YmxlIGNhbGwgb2YgbWV0aG9kICdlbmNvZGVDaGlsZHJlbicgZmlsdGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5RW50cnkgZW50cnkgPSBnZXRPckluaXRFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRW5jb2RlRW5kQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldEVuY29kZUVuZENhbGxlZCh0cnVlKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVkLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkb3VibGUgY2FsbCBvZiBtZXRob2QgJ2VuY29kZUVuZCcgZmlsdGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydENsaWVudElkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICB0aHJvdyByOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UmVuZGVyc0NoaWxkcmVuKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZW5kZXJzQ2hpbGRyZW4oKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgdGhyb3cgdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5RW50cnkgZW50cnkgPSBnZXRPckluaXRFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoZW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh3cmFwcGVkLmdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkb3VibGUgY2FsbCBvZiBtZXRob2QgJ2dldENvbnZlcnRlZFZhbHVlJyBmaWx0ZXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVuZGVyZXJQcm94eUVudHJ5IGdldE9ySW5pdEVudHJ5KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgU3RyaW5nIGtleSA9IHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAga2V5ICs9IGdldE9wdGlvbmFsS2V5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZ2V0T3JJbml0Q29tcG9uZW50UHJveHlNYXBwaW5nKCkuY29udGFpbnNLZXkoa2V5KSkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0T3JJbml0Q29tcG9uZW50UHJveHlNYXBwaW5nKCkucHV0KGtleSwgbmV3IFJlbmRlcmVyUHJveHlFbnRyeSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0T3JJbml0Q29tcG9uZW50UHJveHlNYXBwaW5nKCkuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcHRpb25hbEtleShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfU1RPUkFHRV9OQU1FID0gRXh0VmFsUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCkgKyAiOlNUT1JBR0UiOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5RW50cnk+IGdldE9ySW5pdENvbXBvbmVudFByb3h5TWFwcGluZygpCi0gICAgewotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7Ci0KLSAgICAgICAgaWYoIXJlcXVlc3RNYXAuY29udGFpbnNLZXkoUFJPWFlfU1RPUkFHRV9OQU1FKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVxdWVzdE1hcC5wdXQoUFJPWFlfU1RPUkFHRV9OQU1FLCBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlFbnRyeT4+KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eUVudHJ5Pj4gcHJveHlTdG9yYWdlID0KLSAgICAgICAgICAgICgoTWFwPFN0cmluZywgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eUVudHJ5Pj4pcmVxdWVzdE1hcC5nZXQoUFJPWFlfU1RPUkFHRV9OQU1FKSk7Ci0KLSAgICAgICAgU3RyaW5nIGtleSA9IHRoaXMud3JhcHBlZC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQotICAgICAgICBpZighcHJveHlTdG9yYWdlLmNvbnRhaW5zS2V5KGtleSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3h5U3RvcmFnZS5wdXQoa2V5LCBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlFbnRyeT4oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJveHlTdG9yYWdlLmdldChrZXkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpCi0gICAgewotICAgICAgICAvL3Jlc2V0IGNvbXBvbmVudCBwcm94eSBtYXBwaW5nCi0gICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucmVtb3ZlKFBST1hZX1NUT1JBR0VfTkFNRSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YzMwNWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotCi0vKioKLSAqIERlZmF1bHQgYXBwcm9hY2ggdG8gYXZvaWQgcHJveGllcyBmb3IgY29udmVydGVycyBhbmQgdGhlIGFkYXB0ZXIgZmFsbGJhY2suCi0gKiBJdCByZXF1aXJlcyB0aGF0IGNvbXBvbmVudHMgZGVsZWdhdGUgZ2V0Q29udmVydGVkVmFsdWUgdG8gYSByZW5kZXJlci48YnIvPgotICogSWYgaXQgaXNuJ3QgdGhlIGNhc2UgZm9yIHlvdXIgY29tcG9uZW50IGxpYiB1c2U6Ci0gKiBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5FeHRWYWxBcHBsaWNhdGlvbkZhY3Rvcnk8YnIvPgotICogYW5kPGJyLz4KLSAqIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5LlByb3h5TWFwcGluZ1BoYXNlTGlzdGVuZXIKLSAqIDxwLz4KLSAqIFRoaXMgd3JhcHBlciB3aWxsIGFsc28gaW1wbGVtZW50IGNsaWVudC1zaWRlIHZhbGlkYXRpb24gYmVoYXZpb3VyCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJlcldyYXBwZXIgZXh0ZW5kcyBSZW5kZXJlcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgd3JhcHBlZDsKLSAgICBwcm90ZWN0ZWQgRXh0VmFsQ29udGV4dCBleHRWYWxDb250ZXh0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCk7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyZXJXcmFwcGVyKFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHByb3h5Q2xhc3NOYW1lID0gKFN0cmluZylFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSk7Ci0KLSAgICAgICAgaWYocHJveHlDbGFzc05hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyBleHR2YWwgcmVuZGVyZXIgcHJveHkgY29uZmlndXJlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSBuZXcgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkocmVuZGVyZXIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShwcm94eUNsYXNzTmFtZSk7Ci0KLSAgICAgICAgaWYodGFyZ2V0Q2xhc3MgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyBleHR2YWwgcmVuZGVyZXIgcHJveHkgY29uZmlndXJlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSBuZXcgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkocmVuZGVyZXIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xhc3NbXSBhcmdDbGFzc2VzID0gbmV3IENsYXNzWzFdOwotICAgICAgICBhcmdDbGFzc2VzWzBdID0gUmVuZGVyZXIuY2xhc3M7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGFyZ2V0Q2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJnQ2xhc3Nlcyk7Ci0gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSAoUmVuZGVyZXIpY29uc3RydWN0b3IubmV3SW5zdGFuY2UocmVuZGVyZXIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIud2Fybigibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVyZXIgd3JhcHBlciBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkZWNvZGUgZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRGVjb2RlIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJEZWNvZGUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckRlY29kZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImVuY29kZUJlZ2luIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUJlZ2luIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUJlZ2luIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVFbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZW5jb2RlQ2hpbGRyZW4gZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlQ2hpbGRyZW4gb2YgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUNoaWxkcmVuIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJFbmNvZGVDaGlsZHJlbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVDaGlsZHJlbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQ2hpbGRyZW4gaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJlbmNvZGVFbmQgZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUVuZCBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVFbmQgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGdldFJlbmRlcnNDaGlsZHJlbigpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZW5kZXJzQ2hpbGRyZW4oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLSAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbywgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdCA9IGUuZ2V0UmV0dXJuVmFsdWVPbkV4Y2VwdGlvbihjb252ZXJ0ZWRPYmplY3QpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImdldENvbnZlcnRlZFZhbHVlIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUdldENvbnZlcnRlZFZhbHVlIG9mICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QgPSB3cmFwcGVkLmdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8pOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyR2V0Q29udmVydGVkVmFsdWUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvLCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyR2V0Q29udmVydGVkVmFsdWUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckdldENvbnZlcnRlZFZhbHVlIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZE9iamVjdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L1JlbmRlcmVyUHJveHlFbnRyeS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9SZW5kZXJlclByb3h5RW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2MzkxMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L1JlbmRlcmVyUHJveHlFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBSZW5kZXJlclByb3h5RW50cnkNCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiBkZWNvZGVDYWxsZWQgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGVuY29kZUJlZ2luQ2FsbGVkID0gZmFsc2U7DQotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVDaGlsZHJlbkNhbGxlZCA9IGZhbHNlOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlRW5kQ2FsbGVkID0gZmFsc2U7DQotDQotICAgIHByaXZhdGUgT2JqZWN0IGNvbnZlcnRlZFZhbHVlID0gbnVsbDsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWNvZGVDYWxsZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGVjb2RlQ2FsbGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERlY29kZUNhbGxlZChib29sZWFuIGRlY29kZUNhbGxlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5kZWNvZGVDYWxsZWQgPSBkZWNvZGVDYWxsZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmNvZGVCZWdpbkNhbGxlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBlbmNvZGVCZWdpbkNhbGxlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVCZWdpbkNhbGxlZChib29sZWFuIGVuY29kZUJlZ2luQ2FsbGVkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmVuY29kZUJlZ2luQ2FsbGVkID0gZW5jb2RlQmVnaW5DYWxsZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmNvZGVDaGlsZHJlbkNhbGxlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBlbmNvZGVDaGlsZHJlbkNhbGxlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVDaGlsZHJlbkNhbGxlZChib29sZWFuIGVuY29kZUNoaWxkcmVuQ2FsbGVkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmVuY29kZUNoaWxkcmVuQ2FsbGVkID0gZW5jb2RlQ2hpbGRyZW5DYWxsZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmNvZGVFbmRDYWxsZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW5jb2RlRW5kQ2FsbGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kZUVuZENhbGxlZChib29sZWFuIGVuY29kZUVuZENhbGxlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5lbmNvZGVFbmRDYWxsZWQgPSBlbmNvZGVFbmRDYWxsZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRWYWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZWRWYWx1ZShPYmplY3QgY29udmVydGVkVmFsdWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29udmVydGVkVmFsdWUgPSBjb252ZXJ0ZWRWYWx1ZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmZmZDQ2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjA5NDBhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExODBmZmIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlJlbmRlcmVySW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICAgIHByb3RlY3RlZCBSZW5kZXJlckludGVyY2VwdG9yIGV4Y2VwdGlvblNvdXJjZTsKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGluZm9ybWF0aW9uOwotICAgIGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbigpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzKQotICAgIHsKLSAgICAgICAgdGhpcy5za2lwT3RoZXJJbnRlcmNlcHRvcnMgPSBza2lwT3RoZXJJbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgcHVibGljIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oYm9vbGVhbiBza2lwT3RoZXJJbnRlcmNlcHRvcnMsIFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHRoaXMoc2tpcE90aGVySW50ZXJjZXB0b3JzKTsKLSAgICAgICAgdGhpcy5leGNlcHRpb25Tb3VyY2UgPSByZW5kZXJlckludGVyY2VwdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEluZm9ybWF0aW9uKE9iamVjdCBpbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIHRoaXMuaW5mb3JtYXRpb24gPSBpbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEluZm9ybWF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NraXBPdGhlckludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gc2tpcE90aGVySW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmV0dXJuVmFsdWVPbkV4Y2VwdGlvbihPYmplY3QgY3VycmVudFJldHVyblZhbHVlKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5leGNlcHRpb25Tb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhjZXB0aW9uU291cmNlLmdldFJldHVyblZhbHVlT25Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKHRoaXMsIGN1cnJlbnRSZXR1cm5WYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRSZXR1cm5WYWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNiN2FiYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogSW4gb3JkZXIgdG8gZXhlY3V0ZSBsb2dpYyBqdXN0IG9uY2UuDQotICogZS5nLiByZWdpc3RlciBhcnRpZmFjdHMgdmlhIGFwaQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICAvL2Rvbid0IHJlbW92ZSAtIGl0J3MgYSBmYWxsYmFjayBpZiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCBkZXJlZ2lzdHJhdGlvbg0KLSAgICAvL3RhcmdldDogZG9uJ3QgcHJvY2VzcyBpbml0IGxvZ2ljIG1vcmUgdGhhbiBvbmNlDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8Q2xhc3M+IGluaXRpYWxpemVkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKEFic3RyYWN0U3RhcnR1cExpc3RlbmVyLmNsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZWRMaXN0ZW5lcnMuY29udGFpbnMoZ2V0Q2xhc3MoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnQgaW5pdCBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiaW5pdCBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZmluYWxseQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEpzZlV0aWxzLmRlcmVnaXN0ZXJQaGFzZUxpc3RlbmVyKHRoaXMpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiYW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGRlcmVnaXN0ZXJpbmcgdGhlIHBoYXNlLWxpc3RlbmVyIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRDbGFzcygpLmdldE5hbWUoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC0+IHRoZXJlIGlzIGp1c3QgYSBsaXR0bGUgb3ZlcmhlYWQsIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJ1dCBldmVyeXRoaW5nIGVsc2Ugd29ya3MgY29ycmVjdGx5LiINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBob3dldmVyLCBwbGVhc2UgaW5mb3JtIHRoZSBjb21tdW5pdHkgYWJvdXQgeW91ciBjb25maWd1cmF0aW9uIiwgdCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZmluYWxseQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZExpc3RlbmVycy5hZGQoZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLlJFU1RPUkVfVklFVzsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0KCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0V4dFZhbFN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YzM2MGEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIKLSAgICAgICAgLkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIKLSAgICAgICAgLkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIKLSAgICAgICAgLkRlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXIKLSAgICAgICAgLlNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIKLXsKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKEV4dFZhbEluZm9ybWF0aW9uLlZFUlNJT04gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnRpbmcgdXAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciB2IiArIEV4dFZhbEluZm9ybWF0aW9uLlZFUlNJT04pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydGluZyB1cCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsKLQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSwgRXh0VmFsUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCksIGZhbHNlKTsKLQotICAgICAgICBpbml0TmFtZU1hcHBlcnMoKTsKLSAgICAgICAgZXhlY3V0ZUN1c3RvbVN0YXJ0dXBMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0TmFtZU1hcHBlcnMoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGRlYWN0aXZhdGVEZWZhdWx0TmFtZU1hcHBlcnMgPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9ERUZBVUxUX05BTUVfTUFQUEVSUzsKLSAgICAgICAgaWYgKChkZWFjdGl2YXRlRGVmYXVsdE5hbWVNYXBwZXJzICE9IG51bGwgJiYgZGVhY3RpdmF0ZURlZmF1bHROYW1lTWFwcGVycy5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvL3JlZ2lzdGVyIG1ldGFkYXRhIHRvIHZhbGlkYXRpb24gc3RyYXRlZ3kgbmFtZSBtYXBwZXIKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsKLQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsKLQotICAgICAgICAvL3JlZ2lzdGVyIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWVzc2FnZSByZXNvbHZlciBuYW1lIG1hcHBlcgotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0KLSAgICAgICAgLy9yZWdpc3RlciB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1ldGFkYXRhIHRyYW5zZm9ybWVyIG5hbWUgbWFwcGVyCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUN1c3RvbVN0YXJ0dXBMaXN0ZW5lcigpCi0gICAgewotICAgICAgICBTdHJpbmcgY3VzdG9tU3RhcnR1cExpc3RlbmVyTmFtZSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBUlRVUF9MSVNURU5FUik7Ci0gICAgICAgIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lciA9Ci0gICAgICAgICAgICAoQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGN1c3RvbVN0YXJ0dXBMaXN0ZW5lck5hbWUpOwotCi0gICAgICAgIGlmKGN1c3RvbVN0YXJ0dXBMaXN0ZW5lciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydCBpbml0IG9mICIgKyBjdXN0b21TdGFydHVwTGlzdGVuZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjdXN0b21TdGFydHVwTGlzdGVuZXIuaW5pdCgpOwotCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJpbml0IG9mICIgKyBjdXN0b21TdGFydHVwTGlzdGVuZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MjUxMGMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjZXNNZXNzYWdlRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5IGltcGxlbWVudHMgRmFjZXNNZXNzYWdlRmFjdG9yeQ0KLXsNCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBjb252ZXJ0KEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIGlmKGlzTGFiZWxlZEZhY2VzTWVzc2FnZShmYWNlc01lc3NhZ2UpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2U7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY3JlYXRlKGZhY2VzTWVzc2FnZS5nZXRTZXZlcml0eSgpLCBmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLCBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2UgY3JlYXRlKEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVmlvbGF0aW9uTWVzc2FnZShzZXZlcml0eSwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xhYmVsZWRGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgLy9kb24ndCB1c2UgdGhlIGludGVyZmFjZSBoZXJlDQotICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlIGluc3RhbmNlb2YgVmlvbGF0aW9uTWVzc2FnZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0xhYmVsZWRNZXNzYWdlLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0xhYmVsZWRNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZjdhZTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9MYWJlbGVkTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZG9uJ3QgcmVtb3ZlICpUZXh0IC0gaXQgd291bGQgbGVhZCB0byBhbiBvdmVybGFwIHdpdGggdHJpbmlkYWQNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIExhYmVsZWRNZXNzYWdlDQotew0KLSAgICBTdHJpbmcgZ2V0TGFiZWxUZXh0KCk7DQotICAgIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyBsYWJlbCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvVmlvbGF0aW9uTWVzc2FnZS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9WaW9sYXRpb25NZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwODE0MzUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9WaW9sYXRpb25NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgVmlvbGF0aW9uTWVzc2FnZSBleHRlbmRzIEZhY2VzTWVzc2FnZSBpbXBsZW1lbnRzIExhYmVsZWRNZXNzYWdlDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2OTAzOTU4OTQyOTg3NzExMjMxTDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFiZWw7DQotICAgIHByaXZhdGUgYm9vbGVhbiBzdW1tYXJ5TGFiZWxSZXBsYWNlZCA9IGZhbHNlOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGV0YWlsTGFiZWxSZXBsYWNlZCA9IGZhbHNlOw0KLQ0KLSAgICBwdWJsaWMgVmlvbGF0aW9uTWVzc2FnZShTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgdGhpcyhTRVZFUklUWV9FUlJPUiwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmlvbGF0aW9uTWVzc2FnZShTZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHNldFNldmVyaXR5KHNldmVyaXR5KTsNCi0gICAgICAgIHNldFN1bW1hcnkoc3VtbWFyeSk7DQotICAgICAgICBzZXREZXRhaWwoZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsVGV4dCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsYWJlbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIGxhYmVsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VtbWFyeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxhYmVsICE9IG51bGwgJiYgIXRoaXMuc3VtbWFyeUxhYmVsUmVwbGFjZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0U3VtbWFyeShnZXRMYWJlbGVkTWVzc3NhZ2Uoc3VwZXIuZ2V0U3VtbWFyeSgpLCBnZXRMYWJlbFRleHQoKSkpOw0KLSAgICAgICAgICAgIHRoaXMuc3VtbWFyeUxhYmVsUmVwbGFjZWQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFN1bW1hcnkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBnZXREZXRhaWwoKQ0KLSAgICB7DQotICAgICAgICBpZihsYWJlbCAhPSBudWxsICYmICF0aGlzLmRldGFpbExhYmVsUmVwbGFjZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0RGV0YWlsKGdldExhYmVsZWRNZXNzc2FnZShzdXBlci5nZXREZXRhaWwoKSwgZ2V0TGFiZWxUZXh0KCkpKTsNCi0gICAgICAgICAgICB0aGlzLmRldGFpbExhYmVsUmVwbGFjZWQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldERldGFpbCgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldExhYmVsZWRNZXNzc2FnZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGxhYmVsKQ0KLSAgICB7DQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmNvbnRhaW5zKCJ7IiArIGkgKyAifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgieyIgKyBpICsgIn0iLCBsYWJlbCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2M4MDViLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOw0KLQ0KLS8qKg0KLSAqIE1lc3NhZ2VSZXNvbHZlciB3aGljaCB1c2VzIHByb3BlcnR5IGZpbGVzLg0KLSAqIFN1YmNsYXNzZXMganVzdCBoYXZlIHRvIHByb3ZpZGUgdGhlIHBhY2thZ2UgdG8gbG9vayBhdC4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBjYW4gYWxzbyBwcm92aWRlIGEgY3VzdG9tIG5hbWUgd2hpY2ggaXMgZS5nLiBjb25maWd1cmVkIHZpYSB3ZWIueG1sLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgaW1wbGVtZW50cyBNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSID0gIj8/PyI7DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb24gPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT047DQotICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGRlZmF1bHRCdW5kbGUgPSBudWxsOw0KLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlQnVuZGxlQmFzZU5hbWU7DQotICAgIC8vd2l0aCBqc2YgMS4xIG9ubHkgYXZhaWxhYmxlIGlmIHRoZXJlIGlzIGEgY3VzdG9tIGJlYW4NCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZUJ1bmRsZVZhck5hbWU7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIGlmIChrZXkgPT0gbnVsbCB8fCBrZXkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjdXN0b21NZXNzYWdlID0gbnVsbDsNCi0NCi0gICAgICAgIC8vb25seSBpbiBjYXNlIG9mIGEgVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIHdoaWNoIGlzIGNvbmZpZ3VyZWQgYXMgYmVhbg0KLSAgICAgICAgaWYgKHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUodGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUsIGxvY2FsZSk7DQotICAgICAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJtZXNzYWdlIGJ1bmRsZSAiICsgdGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUgKyAiIG5vdCBmb3VuZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9vbmx5IGluIGNhc2Ugb2YgYSBWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggaXMgY29uZmlndXJlZCBhcyBiZWFuDQotICAgICAgICBpZiAodGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSAhPSBudWxsICYmIGN1c3RvbU1lc3NhZ2UgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IChSZXNvdXJjZUJ1bmRsZSkgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKG1lc3NhZ2VCdW5kbGVWYXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm1lc3NhZ2UgYnVuZGxlIHZhciBuYW1lICIgKyB0aGlzLm1lc3NhZ2VCdW5kbGVWYXJOYW1lICsgIiBub3QgZm91bmQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChjdXN0b21NZXNzYWdlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2U7DQotICAgICAgICB9DQotDQotICAgICAgICAvKg0KLSAgICAgICAgICogdHJ5IHRvIHVzZSB0aGUgY29udmVudGlvbiBmb3IgdGhlIG1lc3NhZ2UgYnVuZGxlDQotICAgICAgICAgKi8NCi0gICAgICAgIGN1c3RvbU1lc3NhZ2UgPSB0cnlUb1VzZU1lc3NhZ2VCdW5kbGVDb252ZW50aW9uKGtleSwgbG9jYWxlKTsNCi0NCi0gICAgICAgIGlmIChjdXN0b21NZXNzYWdlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2U7DQotICAgICAgICB9DQotDQotICAgICAgICAvKg0KLSAgICAgICAgICogbm8gbWVzc2FnZSBidW5kbGUgb3IgbWVzc2FnZSBmb3VuZCAod2l0aCB0aGUgY29udmVudGlvbik/DQotICAgICAgICAgKi8NCi0NCi0gICAgICAgIC8vdHJ5IHRvIGxvYWQgY3VzdG9tIG1lc3NhZ2VzDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShnZXRDdXN0b21CYXNlTmFtZSgpLCBsb2NhbGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gY3VzdG9tIG1lc3NhZ2UgZm9yICIgKyBrZXkgKyAiIHdpdGhpbiAiICsgZ2V0Q3VzdG9tQmFzZU5hbWUoKSwgZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvL3VzZSBjdXN0b20gbmFtZSAoaWYgcG9zc2libGUpIG90aGVyd2lzZTogZmFsbGJhY2sgdG8gZGVmYXVsdCBtZXNzYWdlIChpZiBwb3NzaWJsZSkNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoY3VzdG9tTWVzc2FnZSAhPSBudWxsKSA/IGN1c3RvbU1lc3NhZ2UNCi0gICAgICAgICAgICAgICAgOiAoZ2V0QmFzZU5hbWUoKSAhPSBudWxsKSA/IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShnZXRCYXNlTmFtZSgpLCBsb2NhbGUpLmdldFN0cmluZyhrZXkpIDogbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIgKyBrZXkgKyBNSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb1VzZU1lc3NhZ2VCdW5kbGVDb252ZW50aW9uKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjdXN0b21NZXNzYWdlID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICgoZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID09IG51bGwgfHwgIWRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICAgICAgJiYgaXNEZWZhdWx0TWVzc2FnZUJ1bmRsZUNvbnZlbnRpb25BY3RpdmUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZGVmYXVsdEJ1bmRsZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9CVU5ETEVfTkFNRSksIGxvY2FsZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgICAgICAgICAgICAgICAgIGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbiA9ICJ0cnVlIjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoZGVmYXVsdEJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSBkZWZhdWx0QnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nDQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlZmF1bHRNZXNzYWdlQnVuZGxlQ29udmVudGlvbkFjdGl2ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0QmFzZU5hbWUoKTsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21CYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VCdW5kbGVCYXNlTmFtZShTdHJpbmcgbWVzc2FnZUJ1bmRsZUJhc2VOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSA9IG1lc3NhZ2VCdW5kbGVCYXNlTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlQnVuZGxlVmFyTmFtZShTdHJpbmcgbWVzc2FnZUJ1bmRsZVZhck5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZUJ1bmRsZVZhck5hbWUgPSBtZXNzYWdlQnVuZGxlVmFyTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MGU2OGYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBGYWN0b3J5IHdoaWNoIGNyZWF0ZXMgYSBNZXNzYWdlUmVzb2x2ZXIgZm9yIGEgZ2l2ZW4gVmFsaWRhdGlvblN0cmF0ZWd5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdlbmVyaWMgamF2YSBhcGkgKGRlLS9yZWdpc3RlciBtYXBwaW5nKSIpDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLSAgICAgICAgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWVzc2FnZVJlc29sdmVyPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZzsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZVJlc29sdmVyIGNyZWF0ZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgc3RyYXRlZ3lOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLQ0KLSAgICAgICAgaWYgKHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRTdGF0aWNNYXBwaW5ncygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZy5jb250YWluc0tleShzdHJhdGVneU5hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoTWVzc2FnZVJlc29sdmVyKSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgIC50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZy5nZXQoc3RyYXRlZ3lOYW1lKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOw0KLSAgICAgICAgU3RyaW5nIHJlc29sdmVyTmFtZTsNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IG5hbWVNYXBwZXIgOiBuYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2J1aWxkIGNvbnZlbnRpb24gKFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcikNCi0gICAgICAgICAgICByZXNvbHZlck5hbWUgPSBuYW1lTWFwcGVyLmNyZWF0ZU5hbWUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAvL25hbWUgd2Fzbid0IG1hcHBlZA0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlck5hbWUgPT0gbnVsbCB8fCB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKHJlc29sdmVyTmFtZSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgbWVzc2FnZVJlc29sdmVyID0gKE1lc3NhZ2VSZXNvbHZlcikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHJlc29sdmVyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKG1lc3NhZ2VSZXNvbHZlciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyhzdHJhdGVneU5hbWUsIHJlc29sdmVyTmFtZSk7DQotDQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UocmVzb2x2ZXJOYW1lICsgIiB1c2VkIGZvciAiICsgc3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZVJlc29sdmVyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGFkZE1hcHBpbmcoc3RyYXRlZ3lOYW1lLCBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgLy9zZXR1cCBpbnRlcm5hbCBzdGF0aWMgbWFwcGluZ3MNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnIDoNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cFN0cmF0ZWd5TWFwcGluZ3MoTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhtYXBwaW5nLmdldFNvdXJjZSgpLCBtYXBwaW5nLmdldFRhcmdldCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgU3RyaW5nIG1lc3NhZ2VSZXNvbHZlck5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkaW5nIHN0YXRpYyB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1lc3NhZ2UgcmVzb2x2ZXIgbWFwcGluZzogIg0KLSAgICAgICAgICAgICAgICArIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgKyAiIC0+ICIgKyBtZXNzYWdlUmVzb2x2ZXJOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZy5wdXQodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgbWVzc2FnZVJlc29sdmVyTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWE5NzFmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogRGVmYXVsdCBNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggdXNlcyB0aGUgZGVmYXVsdCBjb252ZW50aW9uIGZvciB0aGUgbWVzc2FnZSBidW5kbGUuDQotICogSXQncyBwb3NzaWJsZSB0byBwcm92aWRlIGEgY3VzdG9tIG1lc3NhZ2UgYnVuZGxlIHZpYSB3ZWIueG1sDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQlVORExFID0gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVNTQUdFX0JVTkRMRTsNCi0NCi0gICAgLy9ub3QgdXNlZCBhdCB0aGUgbW9tZW50IC0ganVzdCBmb3IgYSBjb252ZW50aW9uDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TW9kdWxlTWVzc2FnZUJ1bmRsZU5hbWUoZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENVU1RPTV9CVU5ETEU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNGY4NjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSBmb3IgTWVzc2FnZVJlc29sdmVycyBpbmRlcGVuZGVudCBvZiB0aGUgbWVzc2FnZSBzb3VyY2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0YzRkNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ3NDAxYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1lc3NhZ2VSZXNvbHZlcnMuDQotICogKGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNzIwMzUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVneSB0byBNZXNzYWdlUmVzb2x2ZXIuDQotICogKGNvbmZpZ3VyZWQgdmlhIGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pDQotICogVGhlIGJlYW4gcHJvdmlkZXMgdGhlIGRlZmF1bHQgbmFtZSAoY29udmVudGlvbikuDQotICogSXQncyBwb3NzaWJsZSB0byBwcm92aWRlIGEgY3VzdG9tIGZ1bGwgcXVhbGlmaWVkIG5hbWUuICg9IGN1c3RvbWl6YWJsZSBjb252ZW50aW9uKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01TR19SRVNPTFZFUl9OQU1FX01BUFBFUik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNkZjQyYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSW4gb3JkZXIgdG8gcHJvdmlkZSBhIE5hbWVNYXBwZXIgcGVyIHZhbGlkYXRpb24gbW9kdWxlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE1YzExNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFwcyBFeHRWYWwgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gRXh0VmFsIE1lc3NhZ2VSZXNvbHZlcnMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1lc3NhZ2VSZXNvbHZlckNsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgc3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUoc3RyYXRlZ3lDbGFzc05hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjYwNmY1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciB0byBwbGFjZSBWYWxpZGF0aW9uU3RyYXRlZ2llcyBhbmQgTWVzc2FnZVJlc29sdmVycyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VzdG9tUG9zdGZpeCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYKTsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoc3RyYXRlZ3lDbGFzc05hbWUsIGN1c3RvbVBvc3RmaXgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZDM3OWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBQcm92aWRlcyB0aGUgYWJpbGl0eSBvZiBtZXNzYWdlIHJlc29sdmluZyB0byBWYWxpZGF0aW9uU3RyYXRlZ2llcwotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LlJFVVNFfSkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQotewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYID0gIl9kZXRhaWwiOwotICAgIC8vZS5nLiBmb3IgaW5qZWN0aW5nIGEgbWVzc2FnZSByZXNvbHZlciB2aWEgc3ByaW5nCi0gICAgcHJpdmF0ZSBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgTG9jYWxlIGxvY2FsZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpOwotCi0gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VSZXNvbHZlciAhPSBudWxsID8gdGhpcy5tZXNzYWdlUmVzb2x2ZXIuZ2V0TWVzc2FnZShrZXksIGxvY2FsZSkgOgotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHRoaXMpLmdldE1lc3NhZ2Uoa2V5LCBsb2NhbGUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShBbm5vdGF0aW9uIGFubm90YXRpb24pCi0gICAgewotICAgICAgICByZXR1cm4gcmVzb2x2ZU1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24pCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiAoa2V5ICE9IG51bGwpID8gcmVzb2x2ZU1lc3NhZ2Uoa2V5ICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgpIDogbnVsbDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbikgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBGYWNlc01lc3NhZ2UgZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNYXNzYWdlKEFubm90YXRpb24gYW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2UoZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uKSwgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pOwotCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZVJlc29sdmVyKE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXIpCi0gICAgewotICAgICAgICB0aGlzLm1lc3NhZ2VSZXNvbHZlciA9IG1lc3NhZ2VSZXNvbHZlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICAgIG1ldGFEYXRhRW50cnkuc2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwsIGdldExhYmVsKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnkpKTsKLQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uKTsKLSAgICB9Ci0KLSAgICAvL2ZvciBjdXN0b20gYW5ub3RhdGlvbnMgLSBvdmVycmlkZSBpZiBuZWVkZWQKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI2OTRiMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBQcm92aWRlcyB0aGUgYWJpbGl0eSB0byB1c2UgVmFsaWRhdG9yRXhjZXB0aW9uIChhcyBleHBlY3RlZCBieSB0aGUgdXNlcikgaW5zdGVhZCBvZiBDb252ZXJ0ZXJFeGNlcHRpb24uDQotICogRnVydGhlcm1vcmUgaXQgcHJvdmlkZXM6PGJyLz4NCi0gKiBpbml0VmFsaWRhdGlvbjxici8+DQotICogcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgaW5pdFZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGluaXRWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImluaXRWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBwcm9jZXNzVmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcm9jZXNzVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJwcm9jZXNzVmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiA9IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb252ZXJ0RmFjZXNNZXNzYWdlKGUuZ2V0RmFjZXNNZXNzYWdlKCkpLCBlLmdldENhdXNlKCkpOw0KLSAgICAgICAgICAgIGlmIChwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGdldENsYXNzKCkuZ2V0TmFtZSgpICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiOiB0aHJvdyBvcmlnaW5hbCBleGNlcHRpb24gYWZ0ZXIgcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgdGhyb3cgdmFsaWRhdG9yRXhjZXB0aW9uOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAiOiBvcmlnaW5hbCBleGNlcHRpb24gYWZ0ZXIgcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICAvL292ZXJyaWRlIGlmIG5lZWRlZA0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uLCB0aGlzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI1ZGM0ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIGl0J3MganVzdCBhIGhlbHBlciBmb3IgcHJveGllcyAtIHlvdSBqdXN0IG5lZWQgaXQsIGlmIHlvdSBkZWZpbmUgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0Lg0KLQ0KLSAqIGFkYXB0ZXIgdG8gY29ubmVjdCB2YWxpZGF0aW9uIHN0cmF0ZWdpZXMgd2l0aCBtZXRhLWRhdGEgdHJhbnNmb3JtZXJzLA0KLSAqIGlmIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIGRlZmluZWQgYXMgYmVhbiBhbmQgZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGludGVyZmFjZSBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlciBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgLy90byBnZXQgYmFjayB0aGUgaW50ZXJuYWwgY2FzaGluZw0KLSAgICBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKCk7DQotDQotICAgIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NWNiNjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0NCi0gKiBhZGFwdGVyIHRvIGNvbm5lY3QgdmFsaWRhdGlvbiBzdHJhdGVnaWVzIHdpdGggbWV0YS1kYXRhIHRyYW5zZm9ybWVycywNCi0gKiBpZiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBkZWZpbmVkIGFzIGJlYW4gYW5kIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwgaW1wbGVtZW50cyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIHByaXZhdGUgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgLy9vcHRpb25hbCBmYWxsYmFjayBmb3IgaW50ZXJuYWwgY2FzaGluZw0KLSAgICBwcml2YXRlIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7DQotDQotICAgIHB1YmxpYyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIgaW5zdGFuY2VvZiBCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcikgbWV0YURhdGFUcmFuc2Zvcm1lciApLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhVHJhbnNmb3JtZXIoTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXIgPSBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uU3RyYXRlZ3koVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3kgPSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmFkNGY5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXINCi0gICAgLkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi0NCi0NCi0vKioNCi0gKiBGYWN0b3J5IHdoaWNoIGNyZWF0ZXMgdGhlIFZhbGlkYXRpb25TdHJhdGVneSBmb3IgYSBnaXZlbiBNZXRhLURhdGEgS2V5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeQ0KLSAgICAgICAgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFN0cmluZywgVmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4oKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGNyZWF0ZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIGlmIChtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRTdGF0aWNNYXBwaW5ncygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nLmNvbnRhaW5zS2V5KG1ldGFEYXRhS2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5SW5zdGFuY2UobWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcuZ2V0KG1ldGFEYXRhS2V5KSk7DQotICAgICAgICB9DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgU3RyaW5nIHN0cmF0ZWd5TmFtZTsNCi0gICAgICAgIC8vbnVsbCAtPiB1c2UgbmFtZSBtYXBwZXJzDQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8U3RyaW5nPiBuYW1lTWFwcGVyIDogbmFtZU1hcHBlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RyYXRlZ3lOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKG1ldGFEYXRhS2V5KTsNCi0NCi0gICAgICAgICAgICBpZiAoc3RyYXRlZ3lOYW1lID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5SW5zdGFuY2Uoc3RyYXRlZ3lOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKG1ldGFEYXRhS2V5LCBzdHJhdGVneU5hbWUpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZQ0KLSAgICAgICAgICAgIC5zdGFydHNXaXRoKEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLlBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFZhbGlkYXRpb25TdHJhdGVneSkgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKHZhbGlkYXRpb25TdHJhdGVneU5hbWUNCi0gICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuUFJFRklYX0ZPUl9CRUFOX01BUFBJTkcubGVuZ3RoKCkpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFZhbGlkYXRpb25TdHJhdGVneSkgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBtZXRhRGF0YUtleSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkaW5nIG1ldGEtZGF0YSBrZXkgdG8gdmFsaWRhdGlvbiBzdHJhdGVneSBtYXBwaW5nOiAiDQotICAgICAgICAgICAgICAgICsgbWV0YURhdGFLZXkgKyAiIC0+ICIgKyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nLnB1dChtZXRhRGF0YUtleSwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotDQotICAgICAgICAvL3NldHVwIGludGVybmFsIHN0YXRpYyBtYXBwaW5ncw0KLSAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgOg0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA9IG5ldyBTdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgIC8vdHJ5IHRvIHNldHVwIG1hcHBpbmcgd2l0aCBiYXNlIG5hbWUgYnkgY29udmVudGlvbiAtIG92ZXJyaWRlcyBkZWZhdWx0IG1hcHBpbmcNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vYnVpbGQgY29udmVudGlvbiAoc3RyYXRlZ3kgbWFwcGluZykNCi0gICAgICAgICAgICBzdGF0aWNDb25maWcuc2V0U291cmNlT2ZNYXBwaW5nKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5TVEFUSUNfU1RSQVRFR1lfTUFQUElOR19TT1VSQ0UpKTsNCi0NCi0gICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vc2V0dXAgY3VzdG9tIG1hcHBpbmcgLSBvdmVycmlkZXMgYWxsIG90aGVyIG1hcHBpbmdzDQotICAgICAgICBTdHJpbmcgY3VzdG9tTWFwcGluZ0Jhc2VOYW1lID0gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9TVEFUSUNfVkFMSURBVElPTl9TVFJBVEVHWV9NQVBQSU5HOw0KLSAgICAgICAgaWYgKGN1c3RvbU1hcHBpbmdCYXNlTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnID0gbmV3IFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgICAgICAgICBzdGF0aWNDb25maWcuc2V0U291cmNlT2ZNYXBwaW5nKGN1c3RvbU1hcHBpbmdCYXNlTmFtZSk7DQotICAgICAgICAgICAgICAgIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsU3RyaW5nPj4gbWFwcGluZ3MpDQotICAgIHsNCi0gICAgICAgIGZvcihTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IG1hcHBpbmcgOiBtYXBwaW5ncykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNYXBwaW5nKG1hcHBpbmcuZ2V0U291cmNlKCksIG1hcHBpbmcuZ2V0VGFyZ2V0KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gZ2V0TmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5uYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTU1MjNkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEJhc2UgaW50ZXJmYWNlIGZvciBWYWxpZGF0aW9uU3RyYXRlZ2llcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotLy8qVmFsaWRhdGlvblN0cmF0ZWd5IGluc3RlYWQgb2YgKlZhbGlkYXRvciB0byBhdm9pZCBuYW1pbmcgY29uZnVzaW9uIA0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9BYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmNlNzkxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9BYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNWQzNjEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBOYW1lIE1hcHBlciB3aGljaCBkZWxlZ2F0ZXMgdGhlIG5hbWUgbWFwcGluZywgZXh0cmFjdCB0aGUgbmFtZSBhbmQgY29udmVydCBpdCB0byBhIGJlYW4gbmFtZSArIHByZWZpeA0KLSAqIHRhcmdldDogY29uZmlndXJlIGEgdmFsaWRhdGlvbiBzdHJhdGVneSB2aWEgYSBtYW5hZ2VkIGJlYW4gZmFjaWxpdHkgLT4gYWxsb3dzIHRvIGluamVjdCBvdGhlciBiZWFucw0KLSAqIGluc3RlYWQgb2YgYXBpIGNhbGxzICsgaGFyZGNvZGVkIGJlYW4gbmFtZXMNCi0gKiA8cC8+DQotICogYWxsb3dlZCBiZWFuIHNjb3BlczoNCi0gKiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBzdGF0ZWxlc3M6IGFwcGxpY2F0aW9uL3NpbmdsZXRvbg0KLSAqIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIHN0YXRlZnVsOiBub25lL3Byb3RvdHlwZQ0KLSAqIGRvbid0IHVzZSB0aGUgc2Vzc2lvbiBvciBhIGNvbnZlcnNhdGlvbiBzY29wZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfRk9SX0JFQU5fTUFQUElORyA9ICJiZWFuOiI7DQotICAgIHByaXZhdGUgTmFtZU1hcHBlcjxTdHJpbmc+IHdyYXBwZWQ7DQotDQotICAgIHB1YmxpYyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcihOYW1lTWFwcGVyPFN0cmluZz4gbmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gbmFtZU1hcHBlcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSB3cmFwcGVkLmNyZWF0ZU5hbWUoc291cmNlKTsNCi0NCi0gICAgICAgIGlmIChuYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7DQotICAgICAgICByZXR1cm4gUFJFRklYX0ZPUl9CRUFOX01BUFBJTkcgKyBuYW1lLnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZSgpICsgbmFtZS5zdWJzdHJpbmcoMSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZlMWY2ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIEFubm90YXRpb25zIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqIChjb25maWd1cmVkIHZpYSB3ZWIueG1sKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y4ZGRmYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgQW5ub3RhdGlvbnMgdG8gVmFsaWRhdGlvblN0cmF0ZWdpZXMuDQotICogKGNvbmZpZ3VyZWQgdmlhIGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pDQotICogVGhlIGJlYW4gcHJvdmlkZXMgdGhlIGRlZmF1bHQgbmFtZSAoY29udmVudGlvbikuDQotICogSXQncyBwb3NzaWJsZSB0byBwcm92aWRlIGEgY3VzdG9tIGZ1bGwgcXVhbGlmaWVkIG5hbWUuICg9IGN1c3RvbWl6YWJsZSBjb252ZW50aW9uKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzBlNDIwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBtYXBzIEV4dFZhbCBBbm5vdGF0aW9ucyB0byBFeHRWYWwgVmFsaWRhdGlvblN0cmF0ZWdpZXMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUobWV0YURhdGFLZXkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTBhNjEyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciB0byBwbGFjZSBBbm5vdGF0aW9ucyBhbmQgVmFsaWRhdGlvblN0cmF0ZWdpZXMgaW4gdGhlIHNhbWUgcGFja2FnZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUtleSArDQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OTQ3ZDUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Qcmlvcml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLXB1YmxpYyBlbnVtIFByaW9yaXR5Ci17Ci0gICAgQkxPQ0tJTkcsCi0gICAgSElHSCwKLSAgICBNRURJVU0sCi0gICAgTE9XCi19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVG9Eby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODQ5NjI2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVG9Eby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotcHVibGljIEBpbnRlcmZhY2UgVG9EbwotewotICAgIFByaW9yaXR5IHZhbHVlKCk7Ci0gICAgU3RyaW5nIGRlc2NyaXB0aW9uKCkgZGVmYXVsdCAiIjsKLQotICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgIEBpbnRlcmZhY2UgTGlzdAotICAgIHsKLSAgICAgICAgVG9Eb1tdIHZhbHVlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ3YjM4NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbDsKLQotLyoqCi0gKiBBUEk6PGJyLz4KLSAqIHBhcnRzIHlvdSBtaWdodCBuZWVkIGZvciBjdXN0b20gaW1wbGVtZW50YXRpb25zIGFuZCB3aGljaCBhcmUgcXVpdGUgc3RhYmxlIGluIHZpZXcgb2YgY2hhbmdlcwotICogPHAvPgotICogSU5URVJOQUw6PGJyLz4KLSAqIGlmIHlvdSB0aGluayBhYm91dCByZWZlcmVuY2luZyBhbiBhcnRpZmFjdCB3aGljaCBpcyBtYXJrZWQgYXMgaW50ZXJuYWwsIGFzayBmb3Igc3VwcG9ydC4KLSAqIHRoZXJlIHNob3VsZCBiZSBhIGJldHRlciBzb2x1dGlvbgotICogPHAvPgotICogQ1VTVE9NSVpBQkxFOjxici8+Ci0gKiBhIHBsYW5uZWQgZXh0ZW5zaW9uIHBvaW50IHdoaWNoIGNvbnRhaW5zIGxvZ2ljIHRvIGN1c3RvbWl6ZSB0aGUgZnJhbWV3b3JrLgotICogaWYgaXQgaXNuJ3QgYWxzbyBtYXJrZWQgYXMgQVBJIGl0IG1pZ2h0IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuCi0gKiBob3dldmVyLCB3ZSB0cnkgdG8ga2VlcCBpdCBhcyBzdGFibGUgYXMgcG9zc2libGUgYW5kIHJlYXNvbmFibGUuCi0gKiA8cC8+Ci0gKiBSRVVTRTo8YnIvPgotICogYW4gYXJ0aWZhY3Qgd2hpY2ggeW91IGNhbiByZXVzZSBmb3IgYSBjdXN0b20gaW1wbGVtZW50YXRpb24uCi0gKiBpZiBpdCBpc24ndCBtYXJrZWQgYXMgQVBJIGl0IG1pZ2h0IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuCi0gKiBob3dldmVyLCB3ZSB0cnkgdG8ga2VlcCBpdCBhcyBzdGFibGUgYXMgcG9zc2libGUgYW5kIHJlYXNvbmFibGUuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGVudW0gVXNhZ2VDYXRlZ29yeQotewotICAgIEFQSSwKLSAgICBJTlRFUk5BTCwKLSAgICBDVVNUT01JWkFCTEUsCi0gICAgUkVVU0UKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MzdlYmMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogaXQncyBhbiBpbnRlcm5hbCBhbm5vdGF0aW9uIHRvIHByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBjb25jZXJuaW5nIHVzYWdlLWNhdGVnb3JpZXMKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeQotICovCi1AVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLXB1YmxpYyBAaW50ZXJmYWNlIFVzYWdlSW5mb3JtYXRpb24KLXsKLSAgICBVc2FnZUNhdGVnb3J5W10gdmFsdWUoKTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWE2NWIxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDbGFzc1V0aWxzDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coQ2xhc3NVdGlscy5jbGFzcyk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgdHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbG9hZENsYXNzRm9yTmFtZShuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgbG9hZENsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gVHJ5IFdlYkFwcCBDbGFzc0xvYWRlciBmaXJzdA0KLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKG5hbWUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXANCi0gICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gZmFsbGJhY2s6IFRyeSBDbGFzc0xvYWRlciBmb3IgQ2xhc3NVdGlscyAoaS5lLiB0aGUgbXlmYWNlcy5qYXIgbGliKQ0KLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKG5hbWUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXANCi0gICAgICAgICAgICAgICAgQ2xhc3NVdGlscy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0luc3RhbnRpYXRlQ2xhc3MoQ2xhc3MgdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0YXJnZXRDbGFzcy5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKFN0cmluZyBjbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxvYWRDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEphclZlcnNpb24oQ2xhc3MgdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjbGFzc0ZpbGVQYXRoID0gdGFyZ2V0Q2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyI7DQotICAgICAgICBTdHJpbmcgbWFuaWZlc3RGaWxlUGF0aCA9ICIvTUVUQS1JTkYvTUFOSUZFU1QuTUYiOw0KLQ0KLSAgICAgICAgU3RyaW5nIGNsYXNzTG9jYXRpb24gPSB0YXJnZXRDbGFzcy5nZXRSZXNvdXJjZSh0YXJnZXRDbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLmNsYXNzIikudG9TdHJpbmcoKTsNCi0gICAgICAgIFN0cmluZyBtYW5pZmVzdEZpbGVMb2NhdGlvbiA9IGNsYXNzTG9jYXRpb24NCi0gICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCBjbGFzc0xvY2F0aW9uLmluZGV4T2YoY2xhc3NGaWxlUGF0aCkgLSAxKSArIG1hbmlmZXN0RmlsZVBhdGg7DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IE1hbmlmZXN0KG5ldyBVUkwobWFuaWZlc3RGaWxlTG9jYXRpb24pLm9wZW5TdHJlYW0oKSkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNYWluQXR0cmlidXRlcygpLmdldFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5JTVBMRU1FTlRBVElPTl9WRVJTSU9OKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoTE9HLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBMT0cudHJhY2UoImNvdWxkbid0IGxvYWQgdmVyc2lvbiBvZiBqYXIgZmlsZSB3aGljaCBjb250YWlucyAiICsgdGFyZ2V0Q2xhc3MuZ2V0TmFtZSgpLCB0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRlNzM5Mi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLk1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkFic3RyYWN0RUxIZWxwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5Lk5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjZXNNZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbFV0aWxzDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HR0VSID0gTG9nRmFjdG9yeS5nZXRMb2coRXh0VmFsVXRpbHMuY2xhc3MpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfUkVRVUlSRUQgPSAiamF2YXguZmFjZXMuY29tcG9uZW50LlVJSW5wdXQuUkVRVUlSRUQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfUkVRVUlSRURfREVUQUlMID0gImphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUlucHV0LlJFUVVJUkVEX2RldGFpbCI7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19NQVhJTVVNID0gImphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3IuTUFYSU1VTSI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19NQVhJTVVNX0RFVEFJTCA9ICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yLk1BWElNVU1fZGV0YWlsIjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChDbGFzc01hcHBpbmdGYWN0b3J5PFN0cmluZywgVmFsaWRhdGlvblN0cmF0ZWd5PikgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZShtZXRhRGF0YUtleSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgTmFtZU1hcHBlcjxTdHJpbmc+IG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlcmVnaXN0ZXIobWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbnlNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gbWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZW55KG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFUcmFuc2Zvcm1lciBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YVRyYW5zZm9ybWVyPikgRXh0VmFsQ29udGV4dA0KLSAgICAgICAgICAgICAgICAgICAgLmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlKHZhbGlkYXRpb25TdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLnJlZ2lzdGVyKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVyZWdpc3Rlcih2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZW55VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVueSh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKQ0KLSAgICB7DQotICAgICAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudFdpdGhNZXRhRGF0YShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGZvcihDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldENvbXBvbmVudEluaXRpYWxpemVycygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyLmNvbmZpZ3VyZUNvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7DQotDQotICAgICAgICBmb3IoVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoIXZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5hZnRlclRocm93aW5nKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24sIHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvcihmaW5hbCBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBNZXRhRGF0YUV4dHJhY3RvcigpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHVibGljIFByb3BlcnR5SW5mb3JtYXRpb24gZXh0cmFjdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBPYmplY3Qgb2JqZWN0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiByZXN1bHQgPSBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgb2JqZWN0KTsNCi0gICAgICAgICAgICAgICAgZm9yKE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIDoNCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJFeHRyYWN0aW5nKHJlc3VsdCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZVJlc29sdmVyIGdldE1lc3NhZ2VSZXNvbHZlckZvclZhbGlkYXRpb25TdHJhdGVneShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWVzc2FnZVJlc29sdmVyPilFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAuY3JlYXRlKHZhbGlkYXRpb25TdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5yZWdpc3Rlcih2YWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlcmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IHZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlcmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZW55VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZW55KHZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEVMSGVscGVyIGdldEVMSGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5FTF9IRUxQRVJfRkFDVE9SWSwgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuY2xhc3MpLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjZXNNZXNzYWdlIGNyZWF0ZUZhY2VzTWVzc2FnZShTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZUZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBGYWNlc01lc3NhZ2UgY3JlYXRlRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRkFDRVNfTUVTU0FHRV9GQUNUT1JZLCBGYWNlc01lc3NhZ2VGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlKHNldmVyaXR5LCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjZXNNZXNzYWdlIGNvbnZlcnRGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5GQUNFU19NRVNTQUdFX0ZBQ1RPUlksIEZhY2VzTWVzc2FnZUZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5jb252ZXJ0KGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eURldGFpbHMgY3JlYXRlUHJvcGVydHlEZXRhaWxzRm9yTmV3VGFyZ2V0KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldEV4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBiYXNlT2JqZWN0Ow0KLSAgICAgICAgaWYoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQodGFyZ2V0RXhwcmVzc2lvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YmUgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih0YXJnZXRFeHByZXNzaW9uKTsNCi0NCi0gICAgICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbiA9IHZiZS5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICAgICAgYmFzZU9iamVjdCA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZiZS5nZXRCYXNlRXhwcmVzc2lvbigpKTsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5zdWJzdHJpbmcoMiwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpLCBiYXNlT2JqZWN0LCB2YmUuZ2V0UHJvcGVydHkoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgb3JpZ2luYWwgPSBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KA0KLSAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBTdHJpbmcgbmV3QmFzZUtleSA9IG9yaWdpbmFsLmdldEtleSgpLnN1YnN0cmluZygwLCBvcmlnaW5hbC5nZXRLZXkoKS5sYXN0SW5kZXhPZigiLiIpICsgMSk7DQotICAgICAgICBTdHJpbmcgbmV3S2V5ID0gbmV3QmFzZUtleSArIHRhcmdldEV4cHJlc3Npb247DQotDQotICAgICAgICBiYXNlT2JqZWN0ID0gUmVmbGVjdGlvblV0aWxzLmdldEJhc2VPZlByb3BlcnR5Q2hhaW4ob3JpZ2luYWwuZ2V0QmFzZU9iamVjdCgpLCB0YXJnZXRFeHByZXNzaW9uKTsNCi0gICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlEZXRhaWxzKA0KLSAgICAgICAgICAgIG5ld0tleSwgYmFzZU9iamVjdCwgdGFyZ2V0RXhwcmVzc2lvbi5zdWJzdHJpbmcodGFyZ2V0RXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiLiIpICsgMSwNCi0gICAgICAgICAgICB0YXJnZXRFeHByZXNzaW9uLmxlbmd0aCgpKSk7DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvUGxhY2VMYWJlbChGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBTdHJpbmcgbGFiZWwsIGludCBpbmRleCkNCi0gICAgew0KLSAgICAgICAgaWYoZmFjZXNNZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsICYmIGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkuY29udGFpbnMoInsiICsgaW5kZXggKyAifSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkucmVwbGFjZSgieyIgKyBpbmRleCArICJ9IiwgbGFiZWwpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsICYmIGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKS5jb250YWlucygieyIgKyBpbmRleCArICJ9IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldERldGFpbChmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkucmVwbGFjZSgieyIgKyBpbmRleCArICJ9IiwgbGFiZWwpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVwbGFjZVdpdGhEZWZhdWx0TWF4aW11bU1lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgaW50IG1heExlbmd0aCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGZhY2VzUmVxdWlyZWRNZXNzYWdlID0gSnNmVXRpbHMuZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhKQVZBWF9GQUNFU19NQVhJTVVNKTsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlOw0KLQ0KLSAgICAgICAgLy91c2UgdHJ5L2NhdGNoIGZvciBlYXNpZXIgc3luYyBiZXR3ZWVuIHRydW5rL2JyYW5jaA0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoSnNmVXRpbHMuZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhKQVZBWF9GQUNFU19NQVhJTVVNX0RFVEFJTCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsID0gSnNmVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhKQVZBWF9GQUNFU19NQVhJTVVNX0RFVEFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9qc2YgMS4yIGRvZXNuJ3QgaGF2ZSBhIGRldGFpbCBtZXNzYWdlDQotICAgICAgICB9DQotDQotICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZSA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlLnJlcGxhY2UoInswfSIsICIiICsgbWF4TGVuZ3RoKTsNCi0gICAgICAgIGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsID0gZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwucmVwbGFjZSgiezB9IiwgIiIgKyBtYXhMZW5ndGgpOw0KLQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoZmFjZXNSZXF1aXJlZE1lc3NhZ2UpOw0KLSAgICAgICAgZmFjZXNNZXNzYWdlLnNldERldGFpbChmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCk7DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2UgPSBKc2ZVdGlscy5nZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkuZ2V0U3RyaW5nKEpBVkFYX0ZBQ0VTX1JFUVVJUkVEKTsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlOw0KLQ0KLSAgICAgICAgLy91c2UgdHJ5L2NhdGNoIGZvciBlYXNpZXIgc3luYyBiZXR3ZWVuIHRydW5rL2JyYW5jaA0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoSnNmVXRpbHMuZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhKQVZBWF9GQUNFU19SRVFVSVJFRF9ERVRBSUwpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IEpzZlV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfUkVRVUlSRURfREVUQUlMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2pzZiAxLjIgZG9lc24ndCBoYXZlIGEgZGV0YWlsIG1lc3NhZ2UNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGZhY2VzUmVxdWlyZWRNZXNzYWdlKTsNCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NraXBhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBmb3IoQ2xhc3MgY3VycmVudENsYXNzIDogRXh0VmFsVXRpbHMuZ2V0U2tpcFZhbGlkYXRpb25TdXBwb3J0Q2xhc3NMaXN0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoRXh0VmFsVXRpbHMuaXNTa2lwVmFsaWRhdGlvblN1cHBvcnRlZChjdXJyZW50Q2xhc3MsIHRhcmdldENsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8Q2xhc3M+IGdldFNraXBWYWxpZGF0aW9uU3VwcG9ydENsYXNzTGlzdCgpDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IHN0YXRpY0NvbmZpZ3VyYXRpb25MaXN0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlNLSVBfVkFMSURBVElPTl9TVVBQT1JUX0NPTkZJRyk7DQotDQotICAgICAgICBMaXN0PENsYXNzPiBtYXJrZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzczsNCi0gICAgICAgIGZvcihTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBjdXJyZW50RW50cnkgOiBzdGF0aWNDb25maWd1cmF0aW9uTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBjdXJyZW50Q29uZmlndXJhdGlvbkVudHJ5IDogY3VycmVudEVudHJ5LmdldE1hcHBpbmcoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKGN1cnJlbnRDb25maWd1cmF0aW9uRW50cnkuZ2V0VGFyZ2V0KCkpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZihjdXJyZW50Q2xhc3MgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbWFya2VyTGlzdC5hZGQoY3VycmVudENsYXNzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKExPR0dFUi5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLndhcm4oImNvbmZpZ3VyYXRpb24gZW50cnkgcHJvdmlkZXMgYW4gaW52YWxpZCBlbnRyeTogIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjdXJyZW50Q29uZmlndXJhdGlvbkVudHJ5LmdldFRhcmdldCgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBtYXJrZXJMaXN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NraXBWYWxpZGF0aW9uU3VwcG9ydGVkKENsYXNzIGN1cnJlbnRDbGFzcywgQ2xhc3MgdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIGlmKGN1cnJlbnRDbGFzcy5pc0Fubm90YXRpb24oKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0YXJnZXRDbGFzcy5pc0Fubm90YXRpb25QcmVzZW50KGN1cnJlbnRDbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoY3VycmVudENsYXNzLmlzQXNzaWduYWJsZUZyb20odGFyZ2V0Q2xhc3MpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0pzZlV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MDQwNTQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0pzZlV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5mYWNlcy5saWZlY3ljbGUuTGlmZWN5Y2xlOwotaW1wb3J0IGphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGVGYWN0b3J5OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEpzZlV0aWxzCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlcmVnaXN0ZXJQaGFzZUxpc3RlbmVyKFBoYXNlTGlzdGVuZXIgcGhhc2VMaXN0ZW5lcikKLSAgICB7Ci0gICAgICAgIExpZmVjeWNsZUZhY3RvcnkgbGlmZWN5Y2xlRmFjdG9yeSA9IChMaWZlY3ljbGVGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShGYWN0b3J5RmluZGVyLkxJRkVDWUNMRV9GQUNUT1JZKTsKLQotICAgICAgICBTdHJpbmcgY3VycmVudElkOwotICAgICAgICBMaWZlY3ljbGUgY3VycmVudExpZmVjeWNsZTsKLSAgICAgICAgSXRlcmF0b3IgbGlmZWN5Y2xlSWRzID0gbGlmZWN5Y2xlRmFjdG9yeS5nZXRMaWZlY3ljbGVJZHMoKTsKLSAgICAgICAgd2hpbGUgKGxpZmVjeWNsZUlkcy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN1cnJlbnRJZCA9IChTdHJpbmcpIGxpZmVjeWNsZUlkcy5uZXh0KCk7Ci0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlID0gbGlmZWN5Y2xlRmFjdG9yeS5nZXRMaWZlY3ljbGUoY3VycmVudElkKTsKLSAgICAgICAgICAgIGN1cnJlbnRMaWZlY3ljbGUucmVtb3ZlUGhhc2VMaXN0ZW5lcihwaGFzZUxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpCi0gICAgewotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgYnVuZGxlTmFtZSA9IGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmdldE1lc3NhZ2VCdW5kbGUoKTsKLQotICAgICAgICBpZihidW5kbGVOYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1bmRsZU5hbWUgPSBGYWNlc01lc3NhZ2UuRkFDRVNfTUVTU0FHRVM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGJ1bmRsZU5hbWUsIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODdmN2QuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1JlZmxlY3Rpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGlvblV0aWxzCi17Ci0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgdHJ5VG9HZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvR2V0TWV0aG9kKHRhcmdldENsYXNzLCB0YXJnZXRNZXRob2ROYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCB0cnlUb0dldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUsIENsYXNzLi4uIHBhcmFtZXRlclR5cGVzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lKQotICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TWV0aG9kKHRhcmdldENsYXNzLCB0YXJnZXRNZXRob2ROYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lLCBDbGFzcy4uLiBwYXJhbWV0ZXJUeXBlcykKLSAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gdGFyZ2V0Q2xhc3M7Ci0gICAgICAgIE1ldGhvZCB0YXJnZXRNZXRob2QgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKCFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gY3VycmVudENsYXNzLmdldERlY2xhcmVkTWV0aG9kKHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGFyZ2V0TWV0aG9kID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IHRhcmdldENsYXNzLmdldEludGVyZmFjZXMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50SW50ZXJmYWNlOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRDbGFzcyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IGN1cnJlbnRDbGFzcy5nZXREZWNsYXJlZE1ldGhvZCh0YXJnZXRNZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0YXJnZXRNZXRob2QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRhcmdldE1ldGhvZDsKLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBOb1N1Y2hNZXRob2RFeGNlcHRpb24oInRoZXJlIGlzIG5vIG1ldGhvZCB3aXRoIHRoZSBuYW1lICciICsgdGFyZ2V0TWV0aG9kTmFtZSArICInIiArCi0gICAgICAgICAgICAgICAgIiBjbGFzczogIiArIHRhcmdldENsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0ludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3ModGFyZ2V0LCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZE9mQ2xhc3ModGFyZ2V0LCBtZXRob2QsIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQubmV3SW5zdGFuY2UoKSwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldC5uZXdJbnN0YW5jZSgpLCBtZXRob2QsIGFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdC4uLiBhcmdzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0LCBtZXRob2QsIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdC4uLiBhcmdzKQotICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKHRhcmdldCwgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QmFzZU9mUHJvcGVydHlDaGFpbihPYmplY3QgYmFzZU9iamVjdCwgU3RyaW5nIHByb3BlcnR5Q2hhaW4pCi0gICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcm9wZXJ0eUNoYWluLCAiLiIpOwotCi0gICAgICAgIE9iamVjdCBjdXJyZW50QmFzZSA9IGJhc2VPYmplY3Q7Ci0gICAgICAgIFN0cmluZyBjdXJyZW50UHJvcGVydHk7Ci0gICAgICAgIE1ldGhvZCBjdXJyZW50TWV0aG9kOwotCi0gICAgICAgIHdoaWxlKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQotICAgICAgICAgICAgLy9pZ25vcmUgdGhlIGxhc3QgcHJvcGVydHkKLSAgICAgICAgICAgIGlmKCF0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL25vIGlzIC0gaXQncyBvbmx5IHBvc3NpYmxlIGF0IHByb3BlcnRpZXMgbm90IGF0IGJlYW4gbGV2ZWwKLSAgICAgICAgICAgIGN1cnJlbnRNZXRob2QgPSB0cnlUb0dldE1ldGhvZChjdXJyZW50QmFzZS5nZXRDbGFzcygpLAotICAgICAgICAgICAgICAgICJnZXQiICsgY3VycmVudFByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFByb3BlcnR5LnN1YnN0cmluZygxLCBjdXJyZW50UHJvcGVydHkubGVuZ3RoKCkpKTsKLSAgICAgICAgICAgIGN1cnJlbnRCYXNlID0gdHJ5VG9JbnZva2VNZXRob2QoY3VycmVudEJhc2UsIGN1cnJlbnRNZXRob2QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRCYXNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1dlYlhtbFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYjIxN2IuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1dlYlhtbFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFdlYlhtbFV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKQ0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVggKyAiLiIgKyBrZXkpOw0KLSAgICAgICAgcmV0dXJuICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlLnJlcGxhY2UoIiAiLCAiIikudHJpbSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTIwMWQyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlIE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlIE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUgTW9kdWxlIHByb3ZpZGVzIGFuIGV4dGVuc2libGUgdmFsaWRhdGlvbiBwbGF0Zm9ybSB0byBpbXBsZW1lbnQgdmFsaWRhdGlvbiBiYXNlZCBvbiBtZXRhLWRhdGEuDQotICAgIEJhc2VkIG9uIHRoaXMgbW9kdWxlIGl0IGlzIHBvc3NpYmxlIHRvIGltcGxlbWVudCB2YWxpZGF0aW9uIG1vZHVsZXMuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLjEueCBhbmQgSlNGIDEuMi54LiBCb3RoIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2Fzc2VtYmx5L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNGY3MDkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgRXhhbXBsZXMgQXNzZW1ibHk8L25hbWU+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWV4YW1wbGVzLWFzc2VtYmx5MTI8L2FydGlmYWN0SWQ+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvZXhhbXBsZXMvYXNzZW1ibHk8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy9leGFtcGxlcy9hc3NlbWJseTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvZXhhbXBsZXMvYXNzZW1ibHk8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRlcGVuZGVuY3ktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktd2FyPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fd29ybGQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+CQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWZlYXR1cmUtc2V0XzAxPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS93YXI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1zcmM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1oZWxsb193b3JsZDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPmphdmEtc291cmNlPC90eXBlPiAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPmphdmEtc291cmNlPC90eXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zcmM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tIEVYRUNVVEUgbXZuIHBhY2thZ2UgdG8gZ2VuZXJhdGUgYXNzZW1ibHkgZmlsZXMgLS0+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X3NyYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXNzZW1ibHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPiAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5teWZhY2VzLWV4dHZhbC1leGFtcGxlcy0ke3Byb2plY3QudmVyc2lvbn0tc3JjPC9maW5hbE5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9iaW48L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmFzc2VtYmx5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLQkgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotCSAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4gICAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbDwvZGVzY3JpcHRvcj4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotCSAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwtZXhhbXBsZXMtJHtwcm9qZWN0LnZlcnNpb259PC9maW5hbE5hbWU+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS93b3JrPC93b3JrRGlyZWN0b3J5PgotCSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQkgICAgCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD53YWdvbi1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxpZD5teWZhY2VzLW5pZ2h0bHktYnVpbGRzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9taW5vdGF1ci5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9idWlsZHMvbXlmYWNlcy9uaWdodGx5PC91cmw+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9vdXQ8L2lucHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotCi0gICAgICAgIDwvcGx1Z2lucz4KLQotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGY3YjgxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08YXNzZW1ibHk+Ci0gIDxpZD5iaW48L2lkPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4JCi0gIDxmaWxlU2V0cz4gICAgCi0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC93YXI8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPioud2FyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+ICAgICAKLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU3MGNjYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+c3JjPC9pZD4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+CQotICA8ZmlsZVNldHM+ICAgIAotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvc3JjPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLmphcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPioudHh0PC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDViM2E1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5YmRiMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IKLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9wb20ueG1sIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU5ZDMyOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBmZWF0dXJlLXNldCAwMTwvbmFtZT4NCi0gICAgPHZlcnNpb24+MS4xLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4xLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5mYWNlbGV0czwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtZmFjZWxldHM8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE0PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmVsLWltcGw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRvbWFoYXdrPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRvbWFoYXdrPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS42PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2N1c3RvbS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MDFkZjcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0jIHRoaXMgbWVzc2FnZSBidW5kbGUgaXMgcGlja2VkIHVwIHZpYSBjb252ZW50aW9uDQotcmVwZWF0ZWRfcGFzc3dvcmRfcmVxdWlyZWQ9cGxlYXNlIHJldHlwZSB0aGUgcGFzc3dvcmQNCi1yZXBlYXRlZF9wYXNzd29yZF9yZXF1aXJlZF9kZXRhaWw9cGxlYXNlIHJldHlwZSB0aGUgcGFzc3dvcmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2RvbWFpbi9QZXJzb24uamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmFlNDFlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRGF0ZUlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXNUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5Ob3RFcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47DQotDQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVGVtcG9yYWw7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlRlbXBvcmFsVHlwZTsNCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotcHVibGljIGNsYXNzIFBlcnNvbg0KLXsNCi0gICAgQExlbmd0aChtaW5pbXVtID0gMikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAyMCkNCi0gICAgQE5vdEVxdWFscygibGFzdE5hbWUiKQ0KLSAgICBAUGF0dGVybigiW0EtWl1bYS16XSsiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7DQotDQotICAgIEBMZW5ndGgobWluaW11bSA9IDIpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMjApDQotICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsNCi0NCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcm9sZSA9ICJ1c2VyIjsNCi0NCi0gICAgQERhdGVJcyh0eXBlID0gRGF0ZUlzVHlwZS5iZWZvcmUsIHZhbHVlT2YgPSAiZmluYWxFeGFtIikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlKQ0KLSAgICBAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLkRBVEUpDQotICAgIHByaXZhdGUgRGF0ZSBiaXJ0aGRheTsNCi0NCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlKQ0KLSAgICBAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLkRBVEUpDQotICAgIHByaXZhdGUgRGF0ZSBmaW5hbEV4YW07DQotDQotICAgIEBMZW5ndGgobWluaW11bSA9IDIpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIG5pY2tOYW1lOw0KLQ0KLSAgICBATGVuZ3RoKG1pbmltdW0gPSA2KQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDYwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBlbWFpbDsNCi0NCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlKQ0KLSAgICBwcml2YXRlIGludCBudW1iZXJPZlNpYmxpbmdzOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbGFzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJvbGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcm9sZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRSb2xlKFN0cmluZyByb2xlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnJvbGUgPSByb2xlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldEJpcnRoZGF5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGJpcnRoZGF5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEJpcnRoZGF5KERhdGUgYmlydGhkYXkpDQotICAgIHsNCi0gICAgICAgIHRoaXMuYmlydGhkYXkgPSBiaXJ0aGRheTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXRGaW5hbEV4YW0oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmluYWxFeGFtOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEZpbmFsRXhhbShEYXRlIGZpbmFsRXhhbSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maW5hbEV4YW0gPSBmaW5hbEV4YW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROaWNrTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuaWNrTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROaWNrTmFtZShTdHJpbmcgbmlja05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmlja05hbWUgPSBuaWNrTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVtYWlsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKFN0cmluZyBlbWFpbCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5lbWFpbCA9IGVtYWlsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZTaWJsaW5ncygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBudW1iZXJPZlNpYmxpbmdzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlck9mU2libGluZ3MoaW50IG51bWJlck9mU2libGluZ3MpDQotICAgIHsNCi0gICAgICAgIHRoaXMubnVtYmVyT2ZTaWJsaW5ncyA9IG51bWJlck9mU2libGluZ3M7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmUxNGZiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5ndWkuYmVhbnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uTm90RXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxvbmdSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5jdXN0b20uZW1haWx2YWxpZGF0b3IuRW1haWxWYWxpZGF0b3I7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvblBhZ2UNCi17DQotDQotICAgIC8vdGhlIG9sZCBwYXNzd29yZCBvZiB0aGUgcGVyc29uIGlzbid0IHVzZWQgd2l0aGluIHRoZSBwYWdlDQotICAgIC8vLT4gdmFsaWRhdGUgd2l0aCB2YWx1ZSBvZiB0aGUgbW9kZWwNCi0gICAgQFNraXBWYWxpZGF0aW9uKCIje3BlcnNvbi5yb2xlIGVxICdhZG1pbid9IikNCi0gICAgQFJlcXVpcmVkDQotICAgIEBFcXVhbHMoInBlcnNvbi5wYXNzd29yZCIpDQotICAgIEBOb3RFcXVhbHMoInBhc3N3b3JkIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgb2xkUGFzc3dvcmQ7DQotDQotICAgIEBFcXVhbHMoInBhc3N3b3JkUmVwZWF0ZWQiKQ0KLSAgICAvL2NvbWJpbmUgZ3VpIHJlbGF0ZWQgYW5ub3RhdGlvbnMgd2l0aCB0aGUgYW5ub2F0aW9ucyBvZiB0aGUgZG9tYWluIG1vZGVsDQotICAgIEBKb2luVmFsaWRhdGlvbih2YWx1ZSA9ICIje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLnBhc3N3b3JkfSIpDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOw0KLQ0KLSAgICBAUmVxdWlyZWQodmFsaWRhdGlvbkVycm9yTXNnS2V5ID0gInJlcGVhdGVkX3Bhc3N3b3JkX3JlcXVpcmVkIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmRSZXBlYXRlZDsNCi0NCi0gICAgLy91c2UgI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5uaWNrTmFtZX0sICN7cGVyc29uLm5pY2tOYW1lfQ0KLSAgICAvL3VzZSByZWdpc3RyYXRpb25QYWdlIHRvIGRpc3BsYXkgdGhlIHNlY29uZCBlcnJvciBtZXNzYWdlIGF0IG9sZCBuaWNrbmFtZQ0KLSAgICAvL29yIGxvY2FsIHByb3BlcnR5IGNoYWluaW5nICh0byBhdm9pZCB0aGUgdXNhZ2Ugb2YgdGhlIGJlYW4gbmFtZSkgLSBsaWtlOg0KLSAgICBAU2tpcFZhbGlkYXRpb24oIiN7cGVyc29uLnJvbGUgZXEgJ2FkbWluJ30iKQ0KLSAgICBATm90RXF1YWxzKCJwZXJzb24ubmlja05hbWUiKQ0KLSAgICBASm9pblZhbGlkYXRpb24oInBlcnNvbi5uaWNrTmFtZSIpDQotICAgIHByaXZhdGUgU3RyaW5nIG5ld05pY2tOYW1lOw0KLQ0KLSAgICBwcml2YXRlIFBlcnNvbiBwZXJzb247DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZmluaXNoKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0UGFzc3dvcmQodGhpcy5wYXNzd29yZCk7DQotICAgICAgICByZXR1cm4gImhvbWUiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgdXBkYXRlTmlja05hbWUoKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXROaWNrTmFtZSh0aGlzLm5ld05pY2tOYW1lKTsNCi0gICAgICAgIHJldHVybiAiaG9tZSI7DQotICAgIH0NCi0NCi0gICAgLy9qdXN0IGEgcXVpY2sgaWxsdXN0cmF0aW9uIG9mIHNraXBWYWxpZGF0aW9uDQotICAgIHB1YmxpYyBTdHJpbmcgc3dpdGNoTW9kZSgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50Um9sZSA9IHRoaXMucGVyc29uLmdldFJvbGUoKTsNCi0NCi0gICAgICAgIGlmKGN1cnJlbnRSb2xlLmVxdWFscygiYWRtaW4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnBlcnNvbi5zZXRSb2xlKCJ1c2VyIik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5wZXJzb24uc2V0Um9sZSgiYWRtaW4iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAiIjsNCi0gICAgfQ0KLQ0KLSAgICBASm9pblZhbGlkYXRpb24oInBlcnNvbi5lbWFpbCIpDQotICAgIEBWYWxpZGF0b3IoRW1haWxWYWxpZGF0b3IuY2xhc3MpDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5wZXJzb24uZ2V0RW1haWwoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbWFpbChTdHJpbmcgZW1haWwpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldEVtYWlsKGVtYWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBASm9pblZhbGlkYXRpb24oIiN7cGVyc29uLm51bWJlck9mU2libGluZ3N9IikNCi0gICAgQExvbmdSYW5nZShtYXhpbXVtID0gMjApDQotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZTaWJsaW5ncygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbi5nZXROdW1iZXJPZlNpYmxpbmdzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyT2ZTaWJsaW5ncyhpbnQgbnVtYmVyT2ZTaWJsaW5ncykNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0TnVtYmVyT2ZTaWJsaW5ncyhudW1iZXJPZlNpYmxpbmdzKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2xkUGFzc3dvcmQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gb2xkUGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0T2xkUGFzc3dvcmQoU3RyaW5nIG9sZFBhc3N3b3JkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm9sZFBhc3N3b3JkID0gb2xkUGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkUmVwZWF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmRSZXBlYXRlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZFJlcGVhdGVkKFN0cmluZyBwYXNzd29yZFJlcGVhdGVkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkUmVwZWF0ZWQgPSBwYXNzd29yZFJlcGVhdGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQZXJzb24gZ2V0UGVyc29uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBlcnNvbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzb24oUGVyc29uIHBlcnNvbikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24gPSBwZXJzb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROZXdOaWNrTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXdOaWNrTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROZXdOaWNrTmFtZShTdHJpbmcgbmV3Tmlja05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmV3Tmlja05hbWUgPSBuZXdOaWNrTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OWRmNGYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIGZhY2VzLWNvbmZpZyBQVUJMSUMKLSAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKYXZhU2VydmVyIEZhY2VzIENvbmZpZyAxLjAvL0VOIgotICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWZhY2VzY29uZmlnXzFfMS5kdGQiID4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZmFjZXMtY29uZmlnPgotICAgIDxhcHBsaWNhdGlvbj4KLSAgICAgICAgPCEtLSB0cmluaWRhZCAtLT4KLSAgICAgICAgPGRlZmF1bHQtcmVuZGVyLWtpdC1pZD4KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb3JlCi0gICAgICAgIDwvZGVmYXVsdC1yZW5kZXIta2l0LWlkPgotCi0gICAgPC9hcHBsaWNhdGlvbj4KLQotICAgIDxtYW5hZ2VkLWJlYW4+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tbmFtZT5yZWdpc3RyYXRpb25QYWdlPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5ndWkuYmVhbnMuUmVnaXN0cmF0aW9uUGFnZTwvbWFuYWdlZC1iZWFuLWNsYXNzPgotICAgICAgICA8bWFuYWdlZC1iZWFuLXNjb3BlPnJlcXVlc3Q8L21hbmFnZWQtYmVhbi1zY29wZT4KLQotICAgICAgICA8bWFuYWdlZC1wcm9wZXJ0eT4KLSAgICAgICAgICAgIDxwcm9wZXJ0eS1uYW1lPnBlcnNvbjwvcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDx2YWx1ZT4je3BlcnNvbn08L3ZhbHVlPgotICAgICAgICA8L21hbmFnZWQtcHJvcGVydHk+Ci0gICAgPC9tYW5hZ2VkLWJlYW4+Ci0KLSAgICA8bWFuYWdlZC1iZWFuPgotICAgICAgICA8bWFuYWdlZC1iZWFuLW5hbWU+cGVyc29uPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5kb21haW4uUGVyc29uPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tc2NvcGU+c2Vzc2lvbjwvbWFuYWdlZC1iZWFuLXNjb3BlPgotICAgIDwvbWFuYWdlZC1iZWFuPgotCi0gICAgPG5hdmlnYXRpb24tcnVsZT4KLSAgICAgICAgPGZyb20tdmlldy1pZD4vcGFnZXMvaG9tZS54aHRtbDwvZnJvbS12aWV3LWlkPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5hZGRVc2VyPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+Y2hhbmdlTmlja05hbWU8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5jaGFuZ2VQYXNzd29yZDwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL2NoYW5nZV9wYXNzd29yZC54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgPG5hdmlnYXRpb24tcnVsZT4KLSAgICAgICAgPGZyb20tdmlldy1pZD4qPC9mcm9tLXZpZXctaWQ+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmhvbWU8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9ob21lLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICA8L25hdmlnYXRpb24tcnVsZT4KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzOTM2Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9tYWluLnRhZ2xpYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBmYWNlbGV0LXRhZ2xpYiBQVUJMSUMKLSAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBGYWNlbGV0IFRhZ2xpYiAxLjAvL0VOIgotICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZmFjZWxldC10YWdsaWJfMV8wLmR0ZCI+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGZhY2VsZXQtdGFnbGliPgotICAgIDxuYW1lc3BhY2U+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHR2YWwvZGVtby9jb21wb25lbnRzPC9uYW1lc3BhY2U+Ci0KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+dXNlckZvcm08L3RhZy1uYW1lPgotICAgICAgICA8c291cmNlPgotICAgICAgICAgICAgLi4vY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKLSAgICAgICAgPC9zb3VyY2U+Ci0gICAgPC90YWc+Ci0KLTwvZmFjZWxldC10YWdsaWI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YzAxYWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgotICAgICAgICAgdmVyc2lvbj0iMi40Ij4KLQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuREVGQVVMVF9TVUZGSVg8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4ueGh0bWw8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5mYWNlbGV0cy5MSUJSQVJJRVM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9tYWluLnRhZ2xpYi54bWw8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRU5BQkxFX0xJR0hUV0VJR0hUX0RJQUxPR1M8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkRJU0FCTEVfQ09OVEVOVF9DT01QUkVTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQUxURVJOQVRFX1ZJRVdfSEFORExFUjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNvbS5zdW4uZmFjZWxldHMuRmFjZWxldFZpZXdIYW5kbGVyPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLlVTRV9BUFBMSUNBVElPTl9WSUVXX0NBQ0hFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQ0hBTkdFX1BFUlNJU1RFTkNFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+c2Vzc2lvbjwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5TdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jbGllbnQ8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgRGVmaW5lcyB0aGUgYW1vdW50IChkZWZhdWx0ID0gMjApIG9mIHRoZSBsYXRlc3Qgdmlld3MgYXJlIHN0b3JlZCBpbiBzZXNzaW9uLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuTlVNQkVSX09GX1ZJRVdTX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc3RhdGUgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0gYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLgotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkgYW5kIGlmCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04gaXMgdHJ1ZSAoPSBkZWZhdWx0KQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4gSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DT01QUkVTU19TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhpcyBwYXJhbWV0ZXIgdGVsbHMgTXlGYWNlcyBpZiBqYXZhc2NyaXB0IGNvZGUgc2hvdWxkIGJlIGFsbG93ZWQgaW4gdGhlCi0gICAgICAgICAgICByZW5kZXJlZCBIVE1MIG91dHB1dC4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgYWxsb3dlZCwgY29tbWFuZF9saW5rIGFuY2hvcnMgd2lsbCBoYXZlIGphdmFzY3JpcHQgY29kZQotICAgICAgICAgICAgdGhhdCBzdWJtaXRzIHRoZSBjb3JyZXNwb25kaW5nIGZvcm0uCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIG5vdCBhbGxvd2VkLCB0aGUgc3RhdGUgc2F2aW5nIGluZm8gYW5kIG5lc3RlZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICB3aWxsIGJlIGFkZGVkIGFzIHVybCBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BTExPV19KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuREVURUNUX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgcmVuZGVyZWQgSFRNTCBjb2RlIHdpbGwgYmUgZm9ybWF0dGVkLCBzbyB0aGF0IGl0IGlzICJodW1hbiByZWFkYWJsZSIuCi0gICAgICAgICAgICBpLmUuIGFkZGl0aW9uYWwgbGluZSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIHdpbGwgYmUgd3JpdHRlbiwgdGhhdCBkbyBub3QKLSAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgSFRNTCBjb2RlLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIGEgamF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRoYXQgaXMgYWJsZSB0byByZXN0b3JlIHRoZQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMKLSAgICAgICAgICAgIHdpdGggbG9uZyBsaXN0cyBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcAotICAgICAgICAgICAgaWYgeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZSBwYWdlLgotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQVVUT19TQ1JPTEw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlVzZWQgZm9yIGVuY3J5cHRpbmcgdmlldyBzdGF0ZS4gT25seSByZWxldmFudCBmb3IgY2xpZW50IHNpZGUKLSAgICAgICAgICAgIHN0YXRlIHNhdmluZy4gU2VlIE15RmFjZXMgd2lraS93ZWIgc2l0ZSBkb2N1bWVudGF0aW9uIGZvciBpbnN0cnVjdGlvbnMKLSAgICAgICAgICAgIG9uIGhvdyB0byBjb25maWd1cmUgYW4gYXBwbGljYXRpb24gZm9yIGRpZmZlbmVudCBlbmNyeXB0aW9uIHN0cmVuZ3Rocy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFQ1JFVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPk56WTFORE15TVRBPTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZhbGlkYXRlIG1hbmFnZWQgYmVhbnMsIG5hdmlnYXRpb24gcnVsZXMgYW5kIGVuc3VyZSB0aGF0IGZvcm1zIGFyZSBub3QgbmVzdGVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuVkFMSURBVEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8IS0tIExpc3RlbmVyLCB0byBhbGxvdyBKZXR0eSBzZXJ2aW5nIE15RmFjZXMgYXBwcyAtLT4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMud2ViYXBwLlN0YXJ0dXBTZXJ2bGV0Q29udGV4dExpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IC0tPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+cmVzb3VyY2VzPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC53ZWJhcHAuUmVzb3VyY2VTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgIDwvc2VydmxldD4KLQotICAgIDxmaWx0ZXI+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT50cmluaWRhZDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLndlYmFwcC5UcmluaWRhZEZpbHRlcjwvZmlsdGVyLWNsYXNzPgotICAgIDwvZmlsdGVyPgotCi0gICAgPGZpbHRlci1tYXBwaW5nPgotICAgICAgICA8ZmlsdGVyLW5hbWU+dHJpbmlkYWQ8L2ZpbHRlci1uYW1lPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICA8L2ZpbHRlci1tYXBwaW5nPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmdzIC0tPgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+L2ZhY2VzLyo8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9hZGYvKjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NGQ2NDguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIgotICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIKLSAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiCi0gICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCIKLSAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4KLQotPHVpOmNvbXBvc2l0aW9uPgotICAgIDx0cjpwYW5lbEZvcm1MYXlvdXQ+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibmljayBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvblsgJ25pY2tOYW1lJyBdfSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJlLW1haWwiIHZhbHVlPSIje2JlYW4uZW1haWx9Ii8+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0iZmlyc3QgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb24uZmlyc3ROYW1lfSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJsYXN0IG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uLmxhc3ROYW1lfSIvPgotICAgICAgICA8dHI6aW5wdXREYXRlIGxhYmVsPSJiaXJ0aGRheSIgdmFsdWU9IiN7YmVhbi5wZXJzb24uYmlydGhkYXl9Ij4KLSAgICAgICAgICAgIDx0cjpjb252ZXJ0RGF0ZVRpbWUgdHlwZT0iZGF0ZSIgcGF0dGVybj0iZGQuTU0ueXl5eSIvPgotICAgICAgICA8L3RyOmlucHV0RGF0ZT4KLSAgICAgICAgPHRyOmlucHV0RGF0ZSBsYWJlbD0iZmluYWwgZXhhbSIgdmFsdWU9IiN7YmVhbi5wZXJzb24uZmluYWxFeGFtfSI+Ci0gICAgICAgICAgICA8dHI6Y29udmVydERhdGVUaW1lIHR5cGU9ImRhdGUiIHBhdHRlcm49ImRkLk1NLnl5eXkiLz4KLSAgICAgICAgPC90cjppbnB1dERhdGU+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibnVtYmVyIG9mIHNpYmxpbmdzIiB2YWx1ZT0iI3tiZWFuLm51bWJlck9mU2libGluZ3N9Ii8+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0icGFzc3dvcmQiIHZhbHVlPSIje2JlYW4ucGFzc3dvcmR9IiBzZWNyZXQ9InRydWUiLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0icmUtZW50ZXIgcGFzc3dvcmQiIHZhbHVlPSIje2JlYW4ucGFzc3dvcmRSZXBlYXRlZH0iIHNlY3JldD0idHJ1ZSIvPgotCi0gICAgPC90cjpwYW5lbEZvcm1MYXlvdXQ+Ci08L3VpOmNvbXBvc2l0aW9uPgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjZDE0OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLSAgICAgICAgDQotPGh0bWw+DQotDQotPGhlYWQ+DQotICAgIDxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjA7IFVSTD1mYWNlcy9wYWdlcy9ob21lLnhodG1sIj4NCi08L2hlYWQ+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGMxZWE4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08dHI6ZG9jdW1lbnQNCi0gICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCINCi0gICAgICAgIHhtbG5zOmM9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanN0bC9jb3JlIj4NCi0gICAgPGY6ZmFjZXQgbmFtZT0ibWV0YUNvbnRhaW5lciI+DQotICAgICAgICA8dGl0bGU+c2V2LWVuIGZlYXR1cmUtc2V0IGRlbW8gMDE8L3RpdGxlPg0KLSAgICA8L2Y6ZmFjZXQ+DQotDQotICAgIDx0cmg6Ym9keT4NCi0NCi0gICAgICAgIDwhLS0gb3JpZ2luYWwgLS0+DQotICAgICAgICA8ZGl2IGlkPSJ3cmFwIj4NCi0NCi0gICAgICAgICAgICA8dHI6Zm9ybSBpZD0iZm9ybSIgZGVmYXVsdENvbW1hbmQ9ImRlZmF1bHRCdXR0b24iPg0KLSAgICAgICAgICAgICAgICA8ZGl2IGlkPSJtYWluIj4NCi0gICAgICAgICAgICAgICAgICAgIDx1aTppbnNlcnQgbmFtZT0iY29udGVudCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idW5kZXJfY29uc3RydWN0aW9uIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPiFzaXRlIHVuZGVyIGNvbnN0cnVjdGlvbiE8L2gyPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgY29udGVudCBvZiB0aGlzIHNpdGUgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgbW9tZW50LjwvcD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgICAgICAgICAgIDwvdWk6aW5zZXJ0Pg0KLSAgICAgICAgICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICAgICAgICA8L3RyOmZvcm0+DQotICAgICAgICAgICAgPHRyOm1lc3NhZ2VzIGdsb2JhbE9ubHk9InRydWUiLz4NCi0NCi0gICAgICAgIDwvZGl2Pg0KLSAgICA8L3RyaDpib2R5Pg0KLQ0KLQ0KLTwvdHI6ZG9jdW1lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OTNmYWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotDQotICAgICAgICA8dHI6cGFuZWxGb3JtTGF5b3V0Pg0KLQ0KLSAgICAgICAgICAgIDx1aTpyZW1vdmU+DQotICAgICAgICAgICAgICAgIGp1c3QgZm9yIHRoZSBkZW1vIHdlIGFyZSB1c2luZyB0d28gaW5wdXQgY29tcG9uZW50cw0KLSAgICAgICAgICAgIDwvdWk6cmVtb3ZlPg0KLSAgICAgICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im9sZCBuaWNrIG5hbWUiIHJlYWRPbmx5PSJ0cnVlIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5uaWNrTmFtZX0iLz4NCi0NCi0gICAgICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJuaWNrIG5hbWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UubmV3Tmlja05hbWV9Ii8+DQotDQotICAgICAgICA8L3RyOnBhbmVsRm9ybUxheW91dD4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9InNhdmUiIGFjdGlvbj0iI3tyZWdpc3RyYXRpb25QYWdlLnVwZGF0ZU5pY2tOYW1lfSIvPg0KLQ0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9wYXNzd29yZC54aHRtbCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMDk3NWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9wYXNzd29yZC54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotDQotICAgICAgICA8dGFibGU+DQotICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm91dHB1dExhYmVsIHZhbHVlPSJvbGQgcGFzc3dvcmQiIGZvcj0ib2xkX3Bhc3N3b3JkIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjppbnB1dFRleHQgaWQ9Im9sZF9wYXNzd29yZCIgc2ltcGxlPSJ0cnVlIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLm9sZFBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjptZXNzYWdlIGZvcj0ib2xkX3Bhc3N3b3JkIi8+PC90ZD4NCi0gICAgICAgICAgICA8L3RyPg0KLQ0KLSAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjpvdXRwdXRMYWJlbCB2YWx1ZT0ibmV3IHBhc3N3b3JkIiBmb3I9Im5ld19wYXNzd29yZCIvPjwvdGQ+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6aW5wdXRUZXh0IGlkPSJuZXdfcGFzc3dvcmQiIHNpbXBsZT0idHJ1ZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5wYXNzd29yZH0iIHNlY3JldD0idHJ1ZSIvPjwvdGQ+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6bWVzc2FnZSBmb3I9Im5ld19wYXNzd29yZCIvPjwvdGQ+DQotICAgICAgICAgICAgPC90cj4NCi0NCi0gICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6b3V0cHV0TGFiZWwgdmFsdWU9InJlLWVudGVyIHBhc3N3b3JkIiBmb3I9InJlZW50ZXJlZCIvPjwvdGQ+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6aW5wdXRUZXh0IGlkPSJyZWVudGVyZWQiIHNpbXBsZT0idHJ1ZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5wYXNzd29yZFJlcGVhdGVkfSIgc2VjcmV0PSJ0cnVlIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjptZXNzYWdlIGZvcj0icmVlbnRlcmVkIi8+PC90ZD4NCi0gICAgICAgICAgICA8L3RyPg0KLQ0KLSAgICAgICAgPC90YWJsZT4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9InNhdmUiIGFjdGlvbj0iI3tyZWdpc3RyYXRpb25QYWdlLmZpbmlzaH0iLz4NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxN2ViZDkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0iYWRkIHVzZXIiIGFjdGlvbj0iYWRkVXNlciIvPjxici8+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJjaGFuZ2UgbmljayBuYW1lIiBhY3Rpb249ImNoYW5nZU5pY2tOYW1lIi8+PGJyLz4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9ImNoYW5nZSBwYXNzd29yZCIgYWN0aW9uPSJjaGFuZ2VQYXNzd29yZCIvPjxici8+DQotICAgICAgICA8dHI6Y29tbWFuZExpbmsgdGV4dD0ibW9kZTogI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5yb2xlfSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0iI3tyZWdpc3RyYXRpb25QYWdlLnN3aXRjaE1vZGV9IiBpbW1lZGlhdGU9InRydWUiLz4NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGY2YjA2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOmM9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0dmFsL2RlbW8vY29tcG9uZW50cyINCi0gICAgICAgID4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDxjOnVzZXJGb3JtIGJlYW49IiN7cmVnaXN0cmF0aW9uUGFnZX0iLz4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9InNhdmUiIGFjdGlvbj0iI3tyZWdpc3RyYXRpb25QYWdlLmZpbmlzaH0iLz4NCi0NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3BvbS54bWwgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMThhYzgxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIGhlbGxvIHdvcmxkPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+ZWwtaW1wbDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmFmYjM5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbms7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluLlBlcnNvbjsKLQotLyoqCi0gKiBBIHR5cGljYWwgc2ltcGxlIGJhY2tpbmcgYmVhbiwgdGhhdCBpcyBiYWNrZWQgdG8gPGNvZGU+aGVsbG93b3JsZC5qc3A8L2NvZGU+Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEhlbGxvV29ybGRDb250cm9sbGVyCi17Ci0gICAgcHJpdmF0ZSBQZXJzb24gcGVyc29uID0gbmV3IFBlcnNvbigpOwotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBlbXB0eSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBIZWxsb1dvcmxkQ29udHJvbGxlcigpCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB0aGF0IGlzIGJhY2tlZCB0byBhIHN1Ym1pdCBidXR0b24gb2YgYSBmb3JtLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgc2VuZCgpCi0gICAgewotICAgICAgICAvL2RvIHJlYWwgbG9naWMsIHJldHVybiBhIHN0cmluZyB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuYXZpZ2F0aW9uIHN5c3RlbSBvZiBKU0YKLSAgICAgICAgcmV0dXJuICJzdWNjZXNzIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpCi0gICAgewotICAgICAgICByZXR1cm4gcGVyc29uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNvbihQZXJzb24gcGVyc29uKQotICAgIHsKLSAgICAgICAgdGhpcy5wZXJzb24gPSBwZXJzb247Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkNGE5ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsKLQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsKLQotcHVibGljIGNsYXNzIFBlcnNvbgotewotICAgIC8vaGVsbG8gd29ybGQgZGVtbwotICAgIEBSZXF1aXJlZAotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsKLQotICAgIC8vZGVtbyBmb3IganBhIGJhc2VkIHZhbGlkYXRpb24gc3VwcG9ydAotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTAgLyouLi4qLykKLSAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaXJzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsYXN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjY0NGQwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiIKLSAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzEuZHRkIiA+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGZhY2VzLWNvbmZpZz4KLQkKLQk8IS0tIG1hbmFnZWQgYmVhbnMgb2YgdGhlIHNpbXBsZSBoZWxsbyB3b3JsZCBhcHAgLS0+Ci0JPG1hbmFnZWQtYmVhbj4KLQkJPG1hbmFnZWQtYmVhbi1uYW1lPmhlbGxvV29ybGQ8L21hbmFnZWQtYmVhbi1uYW1lPgotCQk8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5IZWxsb1dvcmxkQ29udHJvbGxlcjwvbWFuYWdlZC1iZWFuLWNsYXNzPgotCQk8bWFuYWdlZC1iZWFuLXNjb3BlPnJlcXVlc3Q8L21hbmFnZWQtYmVhbi1zY29wZT4KLQk8L21hbmFnZWQtYmVhbj4KLQkKLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIGhlbGxvV29ybGQuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L2hlbGxvV29ybGQuanNwPC9mcm9tLXZpZXctaWQ+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPnN1Y2Nlc3M8L2Zyb20tb3V0Y29tZT4KLQkJCTx0by12aWV3LWlkPi9wYWdlMi5qc3A8L3RvLXZpZXctaWQ+Ci0JCTwvbmF2aWdhdGlvbi1jYXNlPgotCTwvbmF2aWdhdGlvbi1ydWxlPgotCQotCTwhLS0gbmF2aWdhdGlvbiBydWxlcyBmb3IgcGFnZTIuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L3BhZ2UyLmpzcDwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5iYWNrPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vaGVsbG9Xb3JsZC5qc3A8L3RvLXZpZXctaWQ+Ci0JCTwvbmF2aWdhdGlvbi1jYXNlPgotCTwvbmF2aWdhdGlvbi1ydWxlPgotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNGExODMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgotICAgICAgICAgdmVyc2lvbj0iMi40Ij4KLQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8IS0tb3B0aW9uYWw6IGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Db21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBVUklzIG9mIChhZGRpdGlvbmFsKSBmYWNlcyBjb25maWcgZmlsZXMuCi0gICAgICAgICAgICAoZS5nLiAvV0VCLUlORi9teS1jb25maWcueG1sKQotICAgICAgICAgICAgU2VlIEpTRiAxLjAgUFJEMiwgMTAuMy4yCi0gICAgICAgICAgICBBdHRlbnRpb246IFlvdSBkbyBub3QgbmVlZCB0byBwdXQgL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBpbiBoZXJlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5DT05GSUdfRklMRVM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0tLT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBTZWUgSlNGIFNwZWNpZmljYXRpb24gMi41LjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIGFtb3VudCAoZGVmYXVsdCA9IDIwKSBvZiB0aGUgbGF0ZXN0IHZpZXdzIGFyZSBzdG9yZWQgaW4gc2Vzc2lvbi48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuTlVNQkVSX09GX1ZJRVdTX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc3RhdGUgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0gYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLgotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KSBhbmQgaWYKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgY29tcHJlc3NlZC48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcGFyYW1ldGVyIHRlbGxzIE15RmFjZXMgaWYgamF2YXNjcmlwdCBjb2RlIHNob3VsZCBiZSBhbGxvd2VkIGluIHRoZQotICAgICAgICAgICAgcmVuZGVyZWQgSFRNTCBvdXRwdXQuCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUKLSAgICAgICAgICAgIHRoYXQgc3VibWl0cyB0aGUgY29ycmVzcG9uZGluZyBmb3JtLgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBub3QgYWxsb3dlZCwgdGhlIHN0YXRlIHNhdmluZyBpbmZvIGFuZCBuZXN0ZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BTExPV19KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuREVURUNUX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgcmVuZGVyZWQgSFRNTCBjb2RlIHdpbGwgYmUgZm9ybWF0dGVkLCBzbyB0aGF0IGl0IGlzICJodW1hbiByZWFkYWJsZSIuCi0gICAgICAgICAgICBpLmUuIGFkZGl0aW9uYWwgbGluZSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIHdpbGwgYmUgd3JpdHRlbiwgdGhhdCBkbyBub3QKLSAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgSFRNTCBjb2RlLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlBSRVRUWV9IVE1MPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlCi0gICAgICAgICAgICBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuIENvbnZlbmllbnQgZmVhdHVyZSBpZiB5b3UgaGF2ZSBwYWdlcwotICAgICAgICAgICAgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGJyb3dzZXIgcGFnZSB0byBhbHdheXMganVtcCB0byB0aGUgdG9wCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuCi0gICAgICAgICAgICBEZWZhdWx0OiAiZmFsc2UiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFVVE9fU0NST0xMPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Vc2VkIGZvciBlbmNyeXB0aW5nIHZpZXcgc3RhdGUuIE9ubHkgcmVsZXZhbnQgZm9yIGNsaWVudCBzaWRlCi0gICAgICAgICAgICBzdGF0ZSBzYXZpbmcuIFNlZSBNeUZhY2VzIHdpa2kvd2ViIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRUNSRVQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWYWxpZGF0ZSBtYW5hZ2VkIGJlYW5zLCBuYXZpZ2F0aW9uIHJ1bGVzIGFuZCBlbnN1cmUgdGhhdCBmb3JtcyBhcmUgbm90IG5lc3RlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlZBTElEQVRFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUcmVhdCByZWFkb25seSBzYW1lIGFzIGlmIGRpc2FibGVkIGF0dHJpYnV0ZSB3YXMgc2V0IGZvciBzZWxlY3QgZWxlbWVudHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5SRUFET05MWV9BU19ESVNBQkxFRF9GT1JfU0VMRUNUUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFVzZSB0aGUgZGVmaW5lZCBjbGFzcyBhcyB0aGUgY2xhc3Mgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiBhIHJlc291cmNlIGlzIGFkZGVkIHRvIHRoZQotICAgICAgICAgICAgRXh0ZW5zaW9uRmlsdGVyIGhhbmRsaW5nLiBVc2luZyBTdHJlYW1pbmdBZGRSZXNvdXJjZSBoZXJlIGhlbHBzIHdpdGggcGVyZm9ybWFuY2UuIElmIHlvdSB3YW50IHRvIGFkZAotICAgICAgICAgICAgY3VzdG9tIGNvbXBvbmVudHMgYW5kIHdhbnQgdG8gdXNlIHRoZSBFeHRlbnNpb25GaWx0ZXIsIHlvdSBuZWVkIHRvIHByb3ZpZGUgeW91ciBjdXN0b20gaW1wbGVtZW50YXRpb24gaGVyZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFERF9SRVNPVVJDRV9DTEFTUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC51dGlsLkRlZmF1bHRBZGRSZXNvdXJjZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAgICAgCi0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmlydHVhbCBwYXRoIGluIHRoZSBVUkwgd2hpY2ggdHJpZ2dlcnMgbG9hZGluZyBvZiByZXNvdXJjZXMgZm9yIHRoZSBNeUZhY2VzIGV4dGVuZGVkIGNvbXBvbmVudHMKLSAgICAgICAgICAgIGluIHRoZSBFeHRlbnNpb25GaWx0ZXIuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5SRVNPVVJDRV9WSVJUVUFMX1BBVEg8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vZmFjZXMvbXlGYWNlc0V4dGVuc2lvblJlc291cmNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIENoZWNrIGlmIHRoZSBleHRlbnNpb25zLWZpbHRlciBoYXMgYmVlbiBwcm9wZXJseSBjb25maWd1cmVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ0hFQ0tfRVhURU5TSU9OU19GSUxURVI8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIERlZmluZSBwYXJ0aWFsIHN0YXRlIHNhdmluZyBhcyB0cnVlL2ZhbHNlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5QQVJUSUFMX1NUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLQotICAgIDwhLS0gTGlzdGVuZXIsIHRvIGFsbG93IEpldHR5IHNlcnZpbmcgTXlGYWNlcyBhcHBzIC0tPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy53ZWJhcHAuU3RhcnR1cFNlcnZsZXRDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZyAtLT4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPiouanNmPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguanNwPC93ZWxjb21lLWZpbGU+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwOGUwMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIzIj4KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9ImZpcnN0X25hbWUiIHZhbHVlPSJGaXJzdCBuYW1lOiIvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0iZmlyc3RfbmFtZSIgdmFsdWU9IiN7aGVsbG9Xb3JsZC5wZXJzb24uZmlyc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJmaXJzdF9uYW1lIiBzaG93U3VtbWFyeT0iZmFsc2UiIHNob3dEZXRhaWw9InRydWUiLz4KLQotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0ibGFzdF9uYW1lIiB2YWx1ZT0iTGFzdCBuYW1lOiIvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0ibGFzdF9uYW1lIiB2YWx1ZT0iI3toZWxsb1dvcmxkLnBlcnNvbi5sYXN0TmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0ibGFzdF9uYW1lIiBzaG93U3VtbWFyeT0iZmFsc2UiIHNob3dEZXRhaWw9InRydWUiLz4KLQotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Xb3JsZC5zZW5kfSIvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgICAgICAgPC9oOmZvcm0+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDgyZDUzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCBwYWdlIHNlc3Npb249ImZhbHNlIiU+Ci08JQotcmVzcG9uc2Uuc2VuZFJlZGlyZWN0KCJoZWxsb1dvcmxkLmpzZiIpOwotJT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFjODUyMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgICA8Zjp2aWV3PgotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPgotICAgICAgICAgICAgICAgIDxoMj48aDpvdXRwdXRUZXh0IHZhbHVlPSJIZWxsbyAje2hlbGxvV29ybGQucGVyc29uLmZpcnN0TmFtZX0gI3toZWxsb1dvcmxkLnBlcnNvbi5sYXN0TmFtZX0uIFdlIGhvcGUgeW91IGVuam95IEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yISIvPjwvaDI+Ci0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZExpbmsgYWN0aW9uPSJiYWNrIj4KLSAgICAgICAgICAgICAgICAgICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iSG9tZSIvPgotICAgICAgICAgICAgICAgIDwvaDpjb21tYW5kTGluaz4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICA8L2Y6dmlldz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvcG9tLnhtbCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZTE5NGYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0NCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIHByb2plY3Q8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMS4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4xLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvZXhhbXBsZXM8L2Nvbm5lY3Rpb24+DQotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvZXhhbXBsZXM8L2RldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy9leGFtcGxlczwvdXJsPg0KLSAgICA8L3NjbT4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPCEtLVRoaXMgcGx1Z2luIGFsbG93cyB0byBydW4gdGhlIGV4YW1wbGUgdXNpbmcgbXZuIGpldHR5OnJ1biAtLT4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpldHR5LXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Ni4xLjg8L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+MTA8L3NjYW5JbnRlcnZhbFNlY29uZHM+DQotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi0gICAgPG1vZHVsZXM+DQotICAgICAgICA8bW9kdWxlPmhlbGxvX3dvcmxkPC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPmZlYXR1cmUtc2V0XzAxPC9tb2R1bGU+DQotICAgIDwvbW9kdWxlcz4NCi0NCi0gICAgPHByb2ZpbGVzPg0KLSAgICAgICAgPCEtLSBUaGlzIHByb2ZpbGUgaXMgaW52b2tlZCBieSAtRHByZXBhcmVSZWxlYXNlPXRydWUuICBUaGlzIGFsbG93cyBtdm4gcmVsZWFzZTpwcmVwYXJlIHRvDQotICAgICAgICAgICAgcnVuIHN1Y2Nlc3NmdWxseSBvbiB0aGUgYXNzZW1ibHkgcHJvamVjdHMuIC0tPg0KLSAgICAgICAgPHByb2ZpbGU+DQotICAgICAgICAgICAgPGlkPnByZXBhcmUtcmVsZWFzZTwvaWQ+DQotICAgICAgICAgICAgPGFjdGl2YXRpb24+DQotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4NCi0gICAgICAgICAgICAgICAgICAgIDxuYW1lPnByZXBhcmVSZWxlYXNlPC9uYW1lPg0KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4NCi0gICAgICAgICAgICA8bW9kdWxlcz4NCi0gICAgICAgICAgICAgICAgPG1vZHVsZT5hc3NlbWJseTwvbW9kdWxlPg0KLSAgICAgICAgICAgIDwvbW9kdWxlcz4NCi0gICAgICAgICAgICA8YnVpbGQ+DQotICAgICAgICAgICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZWxlYXNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ3VtZW50cz4tRHByZXBhcmVSZWxlYXNlPC9hcmd1bWVudHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4NCi0gICAgICAgICAgICA8L2J1aWxkPg0KLSAgICAgICAgPC9wcm9maWxlPg0KLSAgICA8L3Byb2ZpbGVzPg0KLQ0KLSAgICA8cHJvcGVydGllcz4NCi0gICAgICAgIDx0cmluaWRhZC52ZXJzaW9uPjEuMC41PC90cmluaWRhZC52ZXJzaW9uPg0KLSAgICA8L3Byb3BlcnRpZXM+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3BhcmVudC9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3BhcmVudC9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9wYXJlbnQvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3BhcmVudC9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvcGFyZW50L05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOWJkYjEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvcGFyZW50L05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvcGFyZW50L3BvbS54bWwgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9wYXJlbnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk3MDIyMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9wYXJlbnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tCi0gIC0gUGFyZW50IHBvbSBvZiBhbGwgdGhlIG15ZmFjZXMgZXh0ZW5zaW9ucyB2YWxpZGF0b3Igc3VicHJvamVjdHMgCi0gICAgdGhhdCBoZWxwIHRvIGJ1aWxkIG90aGVyIG15ZmFjZXMgcHJvamVjdHMuCi0gIC0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgUHJvamVjdCBQYXJlbnQ8L25hbWU+Ci0gICAgPHVybD5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTE8L3VybD4KLQotICAgIDxpc3N1ZU1hbmFnZW1lbnQ+Ci0gICAgICAgIDxzeXN0ZW0+amlyYTwvc3lzdGVtPgotICAgICAgICA8dXJsPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9FWFRWQUw8L3VybD4KLSAgICA8L2lzc3VlTWFuYWdlbWVudD4KLQotICAgIDxjaU1hbmFnZW1lbnQ+Ci0gICAgICAgIDxzeXN0ZW0+Y29udGludXVtPC9zeXN0ZW0+Ci0gICAgICAgIDx1cmw+aHR0cDovL215ZmFjZXMuem9uZXMuYXBhY2hlLm9yZzo4MDgwL2NvbnRpbnV1bTwvdXJsPgotICAgICAgICA8bm90aWZpZXJzPgotICAgICAgICAgICAgPG5vdGlmaWVyPgotICAgICAgICAgICAgICAgIDx0eXBlPm1haWw8L3R5cGU+Ci0gICAgICAgICAgICAgICAgPHNlbmRPblN1Y2Nlc3M+dHJ1ZTwvc2VuZE9uU3VjY2Vzcz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGFkZHJlc3M+Y29tbWl0c0BteWZhY2VzLmFwYWNoZS5vcmc8L2FkZHJlc3M+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9ub3RpZmllcj4KLSAgICAgICAgPC9ub3RpZmllcnM+Ci0gICAgPC9jaU1hbmFnZW1lbnQ+Ci0gICAgCi0gICAgPGluY2VwdGlvblllYXI+MjAwODwvaW5jZXB0aW9uWWVhcj4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn08L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD5NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotCi0gICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgotICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KLQotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLQotICAgICAgICAgICAgICAgICAgICAtIENvcHkgTElDRU5TRS50eHQgYW5kIE5PVElDRS50eHQgc28gdGhhdCB0aGV5IGFyZSBpbmNsdWRlZAotICAgICAgICAgICAgICAgICAgICAtIGluIHRoZSAtamF2YWRvYyBqYXIgZmlsZSBmb3IgdGhlIGNvbXBvbmVudC4KLSAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5qYXZhZG9jLnJlc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2FwaWRvY3MvTUVUQS1JTkYiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJMSUNFTlNFLnR4dCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJOT1RJQ0UudHh0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+amF2YWRvYy5zaXRlLmNvcHk8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnNpdGU8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ29weSBqYXZhZG9jIHRvIGFub3RoZXIgZGlyZWN0b3J5LCB0byBrZWVwIGphdmFkb2Mgb2YgcHJldmlvdXMgdmVyc2lvbnMgb24gc2l0ZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3NpdGUvYXBpZG9jcy0ke3Byb2plY3QudmVyc2lvbn0iIGZhaWxvbmVycm9yPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zaXRlL2FwaWRvY3MiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPCEtLQotICAgICAgICAgICAgICAgIC0gTWFrZSBhIGNoZWNrc3R5bGUgdmlvbGF0aW9uIGEgY29tcGlsZSBlcnJvci4gTm90ZSB0aGF0IGlmIGEgY29tcGlsZSBlcnJvciBvY2N1cnMsCi0gICAgICAgICAgICAgICAgLSBmdXJ0aGVyIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0YXJnZXQvc2l0ZS9jaGVja3N0eWxlLmh0bWwgKHByZXNlbnQgZXZlbiB3aGVuCi0gICAgICAgICAgICAgICAgLSBqdXN0IHRoZSBjb21waWxlIGdvYWwgYW5kIG5vdCB0aGUgc2l0ZSBnb2FsIGhhcyBiZWVuIHJ1bikuIE5vdGUgYWxzbyB0aGF0IGNoaWxkCi0gICAgICAgICAgICAgICAgLSBwcm9qZWN0cyBtYXkgcmVkZWNsYXJlIHRoaXMgcGx1Z2luIGFuZCBwcm92aWRlIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIHNldHRpbmdzCi0gICAgICAgICAgICAgICAgLSB0byB1c2UgZGlmZmVyZW50IGNoZWNrcyAobW9yZSBvciBsZXNzIHN0cmljdCB0aGFuIHRoZSBkZWZhdWx0KS4KLSAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGVja3N0eWxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+dmVyaWZ5LXN0eWxlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNoZWNrPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlnTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdGFuZGFyZC54bWw8L2NvbmZpZ0xvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aGVhZGVyTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWhlYWRlci50eHQ8L2hlYWRlckxvY2F0aW9uPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBTZXQgY29tcGlsZSBzb3VyY2UgYXQgMS41LCBzaW5jZSB0aGUgdGFyZ2V0IEpTRiBpbXBsIGlzIDEuMiAtLT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgotICAgICAgICAgICAgICAgICAgICA8b3B0aW1pemU+ZmFsc2U8L29wdGltaXplPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgICAgICAgICAgIAotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotICAgIDxyZXBvc2l0b3JpZXM+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPm1hdmVuMi1yZXBvc2l0b3J5LmRldi5qYXZhLm5ldDwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5KYXZhLm5ldCBSZXBvc2l0b3J5IGZvciBNYXZlbjwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL2Rvd25sb2FkLmphdmEubmV0L21hdmVuLzEvPC91cmw+Ci0gICAgICAgICAgICA8bGF5b3V0PmxlZ2FjeTwvbGF5b3V0PgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgPC9yZXBvc2l0b3JpZXM+Ci0KLSAgICA8cmVwb3J0aW5nPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWp4ci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXJlcG9ydC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40LjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBtZC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cnVsZXNldHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvYmFzaWMueG1sPC9ydWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL3VudXNlZGNvZGUueG1sPC9ydWxlc2V0PgotICAgICAgICAgICAgICAgICAgICA8L3J1bGVzZXRzPgotICAgICAgICAgICAgICAgICAgICA8bGlua1hyZWY+dHJ1ZTwvbGlua1hyZWY+Ci0gICAgICAgICAgICAgICAgICAgIDxtaW5pbXVtVG9rZW5zPjEwMDwvbWluaW11bVRva2Vucz4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldEpkaz4xLjU8L3RhcmdldEpkaz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1jaGVja3Mtc3RhbmRhcmQueG1sPC9jb25maWdMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGhlYWRlckxvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1oZWFkZXIudHh0PC9oZWFkZXJMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvcmVwb3J0aW5nPgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvcGFyZW50PC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvcGFyZW50PC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy9wYXJlbnQ8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgICAgICA8c25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICAgICAgPHVuaXF1ZVZlcnNpb24+ZmFsc2U8L3VuaXF1ZVZlcnNpb24+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLnNuYXBzaG90czwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgTWF2ZW4gU25hcHNob3QgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgPHNpdGU+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTE8L3VybD4KLSAgICAgICAgPC9zaXRlPgotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtYXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wZXJmb3JtUmVsZWFzZTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvY3M8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxqc2YudmVyc2lvbj4xLjEuNTwvanNmLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgzY2E2Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIC0tLS0tLQ0KLU92ZXJ2aWV3DQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4xDQotDQotICBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBwcm92aWRlcyB2ZXJzaW9ucyBmb3IgSlNGIDEuMSBhbmQgMS4yDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvcGFyZW50L3NyYy9zaXRlL2FwdC9qYXZhZG9jLmFwdCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3BhcmVudC9zcmMvc2l0ZS9hcHQvamF2YWRvYy5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYjE5NTEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvcGFyZW50L3NyYy9zaXRlL2FwdC9qYXZhZG9jLmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSAtLS0tLS0NCi1KYXZhZG9jDQotIC0tLS0tLQ0KLQ0KLUphdmFkb2MNCi0NCi0gICAgSGVyZSB5b3UgY2FuIGZpbmQgdGhlIGphdmFkb2Mgb2YgcHJldmlvdXMgZXh0dmFsIHZlcnNpb25zLg0KLQ0KLSAgICAqIHt7e2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS9teWZhY2VzLWV4dHZhbC1jb3JlL2FwaWRvY3MtMS4xLjEvaW5kZXguaHRtbH1NeWZhY2VzIEV4dFZhbCBDb3JlIFZlcnNpb24gMS4xLjF9fQ0KLQ0KLSAgICAqIHt7e2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS92YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uL2FwaWRvY3MtMS4xLjEvaW5kZXguaHRtbH1NeWZhY2VzIEV4dFZhbCBQcm9wZXJ0eSBWYWxpZGF0aW9uIFZlcnNpb24gMS4xLjF9fQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3BhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3BhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUyYWJmNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS9wYXJlbnQvc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgbmFtZT0iQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IiPgotICA8YmFubmVyTGVmdD4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRWYWw8L25hbWU+Ci0gICAgPHNyYz5pbWFnZXMvZXh0dmFsX2xvZ28ucG5nPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sPC9ocmVmPgotICA8L2Jhbm5lckxlZnQ+Ci0KLSAgPGJhbm5lclJpZ2h0PgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzPC9uYW1lPgotICAgIDxzcmM+aW1nL2Jhbm5lcnMvTXlGYWNlc19sb2dvLmpwZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbDwvaHJlZj4KLSAgPC9iYW5uZXJSaWdodD4KLQotICA8cHVibGlzaERhdGUgZm9ybWF0PSJkZCBNTU0geXl5eSIvPgotCi0gIDxza2luPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5tYXZlbjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLXNpdGUtc2tpbjwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3NraW4+Ci0KLSAgPGJvZHk+Ci0gICAgPGxpbmtzPgotICAgICAgPGl0ZW0gbmFtZT0iQXBhY2hlIiBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmciLz4KLSAgICAgIDxpdGVtIG5hbWU9Ik15RmFjZXMiIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQgTXlmYWNlcyBFeHRWYWwiIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZG93bmxvYWQuaHRtbCIvPgotICAgIDwvbGlua3M+Ci0KLSAgICA8bWVudSBuYW1lPSJBcGFjaGUgTXlGYWNlcyIgaW5oZXJpdD0idG9wIj4KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkRvd25sb2FkIiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2Rvd25sb2FkLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0KLSAgICA8bWVudSBuYW1lPSJDb250ZW50cyIgaW5oZXJpdD0idG9wIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iTWFpbiBTaXRlIiAgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW5kZXguaHRtbCIvPgotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjEiICAgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iQ29yZSBNb2R1bGUiICAgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvbXlmYWNlcy1leHR2YWwtY29yZS9pbmRleC5odG1sIi8+Ci0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IlByb3BlcnR5IFZhbGlkYXRpb24iICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExL3ZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb24vaW5kZXguaHRtbCIvPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJUcmluaWRhZCBTdXBwb3J0IiAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS9jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydC9pbmRleC5odG1sIi8+Ci0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IkdlbmVyaWMgU3VwcG9ydCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExL2NvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQvaW5kZXguaHRtbCIvPgotICAgICAgICA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkV4dFZhbCBmb3IgSlNGIDEuMiIgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvaW5kZXguaHRtbCIgY29sbGFwc2U9InRydWUiPgotICAgICAgICAgICAgPGl0ZW0gbmFtZT0iZHVtbXkiICAgICAgICBocmVmPSJkdW1teSIvPgotICAgICAgICA8L2l0ZW0+Ci0gICAgPC9tZW51PgotCQotICAgIDxtZW51IG5hbWU9IkRvY3VtZW50YXRpb24iPgotICAgICAgPGl0ZW0gbmFtZT0iV2lraSIgICAgICAgICBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL215ZmFjZXMvRXh0ZW5zaW9ucy9WYWxpZGF0b3IvIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJKYXZhZG9jIiAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS9qYXZhZG9jLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0KLSAgICA8bWVudSByZWY9InJlcG9ydHMiLz4KLQotICAgIDxtZW51IG5hbWU9IkZvdW5kYXRpb24iIGluaGVyaXQ9ImJvdHRvbSI+Ci0gICAgICA8aXRlbSBuYW1lPSJBU0YiICAgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlNwb25zb3JzaGlwIiAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9zcG9uc29yc2hpcC5odG1sIiAvPgotICAgICAgPGl0ZW0gbmFtZT0iVGhhbmtzIiAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3RoYW5rcy5odG1sIiAvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvcG9tLnhtbCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYTllZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+NjwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtbW9kdWxlPC9hcnRpZmFjdElkPg0KLSAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgTW9kdWxlPC9uYW1lPg0KLSAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMTwvdXJsPg0KLSAgICANCi0gICAgPHNjbT4NCi0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzFfMS88L2Nvbm5lY3Rpb24+DQotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMV8xLzwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4NCi0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzFfMS88L3VybD4NCi0gICAgPC9zY20+ICAgIA0KLQ0KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4NCi0gICAgICAgIDxzbmFwc2hvdFJlcG9zaXRvcnk+DQotICAgICAgICAgICAgPHVuaXF1ZVZlcnNpb24+ZmFsc2U8L3VuaXF1ZVZlcnNpb24+DQotICAgICAgICAgICAgPGlkPmFwYWNoZS5zbmFwc2hvdHM8L2lkPg0KLSAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBNYXZlbiBTbmFwc2hvdCBSZXBvc2l0b3J5PC9uYW1lPg0KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPg0KLSAgICAgICAgPC9zbmFwc2hvdFJlcG9zaXRvcnk+DQotICAgICAgICA8c2l0ZT4NCi0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPg0KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyPC91cmw+DQotICAgICAgICA8L3NpdGU+DQotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4NCi0NCi0gICAgPCEtLSBXQVJOSU5HOiBETyBOT1QgR0VORVJBVEUgU0lURSBGUk9NIEhFUkUgRElSRUNUTFkNCi0gICAgU2luY2UgdGhpcyBwcm9qZWN0IGhhcyBhbiBhc3luYyByZWxlYXNlIHByb2NlZHVyZSAobm90DQotICAgIGFsbCBtb2R1bGVzIHNob3VsZCBiZSByZWxlYXNlZCBhdCBvbmNlKSwgdGhlIHBhcmVudCBwb20ueG1sIA0KLSAgICBpcyBub3QgdGhpcyAodGhlcmUgaXMgYSBtb2R1bGUgZm9yIHRoYXQpLiBVc2UgbWF2ZW4gc2l0ZSANCi0gICAgcGx1Z2luIGhlcmUgY2F1c2UgcHJvYmxlbXMgd2hlbiB0aGUgc2l0ZSBpcyBnZW5lcmF0ZWQuDQotICAgIFRoZSBwcm9jZWR1cmUgbXVzdCBleGVjdXRlIHNpdGUgY29tbW1hbmQgZmlyc3Qgb24gcGFyZW50IA0KLSAgICBtb2R1bGUgYW5kIHRoZW4gb24gZWFjaCBtb2R1bGUgbGlzdGVkIGJlbG93LiANCi0gICAgIC0tPg0KLQ0KLSAgICA8bW9kdWxlcz4NCi0gICAgICAgIDxtb2R1bGU+cGFyZW50PC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPmNvcmU8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+dmFsaWRhdGlvbi1tb2R1bGVzPC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPmNvbXBvbmVudC1zdXBwb3J0PC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPmV4YW1wbGVzPC9tb2R1bGU+DQotICAgIDwvbW9kdWxlcz4NCi0NCi0gICAgPHByb2ZpbGVzPg0KLSAgICAgICAgPCEtLSBUaGlzIHByb2ZpbGUgaXMgaW52b2tlZCBieSAtRHByZXBhcmVSZWxlYXNlPXRydWUuICBUaGlzIGFsbG93cyBtdm4gcmVsZWFzZTpwcmVwYXJlIHRvDQotICAgICAgICAgICAgcnVuIHN1Y2Nlc3NmdWxseSBvbiB0aGUgYXNzZW1ibHkgcHJvamVjdHMuIC0tPg0KLSAgICAgICAgPHByb2ZpbGU+DQotICAgICAgICAgICAgPGlkPnByZXBhcmUtcmVsZWFzZTwvaWQ+DQotICAgICAgICAgICAgPGFjdGl2YXRpb24+DQotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4NCi0gICAgICAgICAgICAgICAgICAgIDxuYW1lPnByZXBhcmVSZWxlYXNlPC9uYW1lPg0KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4NCi0gICAgICAgICAgICA8bW9kdWxlcz4NCi0gICAgICAgICAgICAgICAgPG1vZHVsZT5hc3NlbWJseTwvbW9kdWxlPg0KLSAgICAgICAgICAgIDwvbW9kdWxlcz4NCi0gICAgICAgICAgICA8YnVpbGQ+DQotICAgICAgICAgICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZWxlYXNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ3VtZW50cz4tRHByZXBhcmVSZWxlYXNlPC9hcmd1bWVudHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4NCi0gICAgICAgICAgICA8L2J1aWxkPg0KLSAgICAgICAgPC9wcm9maWxlPg0KLSAgICA8L3Byb2ZpbGVzPg0KLSAgICANCi0gICAgPHByb3BlcnRpZXM+DQotICAgICAgICA8anNmLnZlcnNpb24+MS4xLjU8L2pzZi52ZXJzaW9uPg0KLSAgICA8L3Byb3BlcnRpZXM+DQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wb20ueG1sIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OTU4MzUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotDQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPnZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFZhbGlkYXRpb24tTW9kdWxlczwvbmFtZT4NCi0gICAgPHZlcnNpb24+MS4xLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxzY20+DQotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy92YWxpZGF0aW9uLW1vZHVsZXM8L2Nvbm5lY3Rpb24+DQotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvdmFsaWRhdGlvbi1tb2R1bGVzPC9kZXZlbG9wZXJDb25uZWN0aW9uPg0KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvdmFsaWRhdGlvbi1tb2R1bGVzPC91cmw+DQotICAgIDwvc2NtPg0KLQ0KLSAgICA8bW9kdWxlcz4NCi0gICAgICAgIDxtb2R1bGU+cHJvcGVydHktdmFsaWRhdGlvbjwvbW9kdWxlPg0KLSAgICAgICAgPCEtLW1vZHVsZT5iZWFuLXZhbGlkYXRpb248L21vZHVsZS0tPg0KLSAgICA8L21vZHVsZXM+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9wb20ueG1sIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkwODQyMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBQcm9wZXJ0eS1WYWxpZGF0aW9uLU1vZHVsZTwvbmFtZT4NCi0gICAgPHZlcnNpb24+MS4xLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5wZXJzaXN0ZW5jZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5wZXJzaXN0ZW5jZS1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDwhLS0gVGVzdCBkZXBlbmRlbmNpZXMgLS0+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldC5qc3A8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNwLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zaGFsZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zaGFsZS10ZXN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC40PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4NCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5teWZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgPC9leGNsdXNpb25zPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4NCi0gICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4NCi0gICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgPC9yZXNvdXJjZXM+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4yPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9BYnN0cmFjdCouamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9UZXN0VXRpbHMuamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qQmVhbi5qYXZhPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODU0YmY2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCFET0NUWVBFIGZhY2VzLWNvbmZpZyBQVUJMSUMNCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiINCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxmYWNlcy1jb25maWc+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLQ0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWM0ODdkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRTZWNyZXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTWVudTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lUmFkaW87Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlDaGVja2JveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUxpc3Rib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHRhcmVhOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgcHVibGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgY29uZmlndXJlUmVxdWlyZWRBdHRyaWJ1dGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOwotICAgICAgICBjb25maWd1cmVNYXhMZW5ndGhBdHRyaWJ1dGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVJlcXVpcmVkQXR0cmlidXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCFwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKSkgfHwKLSAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSkKLSAgICAgICAgICAgICYmCi0gICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGlzQ29tcG9uZW50UmVxdWlyZWQodWlDb21wb25lbnQpKSkKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJgotICAgICAgICAgICAgICAgIUJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRTZWNyZXQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVMaXN0Ym94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lTWVudSB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZVJhZGlvIHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUNoZWNrYm94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TWVudSB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0VGV4dGFyZWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaWYgdGhlcmUgaXMgbm8gc3BlY2lhbCBhdHRyaWJ1dGUgYXQgdGhlIGNvbXBvbmVudCB3aGljaCBzaG91bGQgb3ZlcnJ1bGUKLSAgICAgKiB0aGUgYW5ub3RhdGVkIHByb3BlcnR5IHJldHVybiB0cnVlIQotICAgICAqCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IGNvbXBvbmVudCB3aGljaCBpbXBsZW1lbnRzIHRoZSBFZGl0YWJsZVZhbHVlSG9sZGVyIGludGVyZmFjZQotICAgICAqIEByZXR1cm4gZmFsc2UgdG8gb3ZlcnJ1bGUgdGhlIGFubm90YXRlZCBwcm9wZXJ0eSBlLmcuIGlmIGNvbXBvbmVudCBpcyByZWFkb25seQotICAgICAqLwotICAgIHByb3RlY3RlZCBCb29sZWFuIGlzQ29tcG9uZW50UmVxdWlyZWQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBib29sZWFuIGlzUmVhZE9ubHkgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzUmVhZG9ubHkiKSkpOwotICAgICAgICBib29sZWFuIGlzRGlzYWJsZWQgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzRGlzYWJsZWQiKSkpOwotCi0gICAgICAgIHJldHVybiAhKGlzUmVhZE9ubHkgfHwgaXNEaXNhYmxlZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlTWF4TGVuZ3RoQXR0cmlidXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpOwotCi0gICAgICAgICAgICBpZighKG1heExlbmd0aCBpbnN0YW5jZW9mIEludGVnZXIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0VGV4dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBIdG1sSW5wdXRUZXh0IGh0bWxJbnB1dFRleHQgPSAoSHRtbElucHV0VGV4dCl1aUNvbXBvbmVudDsKLSAgICAgICAgICAgICAgICBodG1sSW5wdXRUZXh0LnNldE1heGxlbmd0aCgoSW50ZWdlciltYXhMZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjMmEwZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuTGFiZWxlZE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0U2VjcmV0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZUxpc3Rib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZU1lbnU7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZVJhZGlvOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55Q2hlY2tib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlMaXN0Ym94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TWVudTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0YXJlYTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEh0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcgotewotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpCi0gICAgewotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IEV4dFZhbFV0aWxzLmNvbnZlcnRGYWNlc01lc3NhZ2UodmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpKTsKLQotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gKFN0cmluZykgUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiZ2V0TGFiZWwiKSk7Ci0KLSAgICAgICAgICAgIGlmKGxhYmVsID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGFiZWwgPSB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL292ZXJyaWRlIHRoZSBsYWJlbCBpZiB0aGUgYW5ub3RhdGlvbiBwcm92aWRlcyBhIGxhYmVsCi0gICAgICAgICAgICBpZihtZXRhRGF0YUVudHJ5ICE9IG51bGwgJiYgbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsYWJlbCA9IG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwsIFN0cmluZy5jbGFzcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIExhYmVsZWRNZXNzYWdlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgoTGFiZWxlZE1lc3NhZ2UpZmFjZXNNZXNzYWdlKS5zZXRMYWJlbFRleHQobGFiZWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9pZiBzb21lb25lIHVzZXMgYSBub3JtYWwgZmFjZXMgbWVzc2FnZQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwoZmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRTZWNyZXQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVMaXN0Ym94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lTWVudSB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZVJhZGlvIHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUNoZWNrYm94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TWVudSB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0VGV4dGFyZWE7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzNjBiZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnJlY29yZGVyLkNyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyDQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcihuZXcgQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIoKSk7DQotDQotICAgICAgICBpbml0U3RhdGljU3RyYXRlZ3lNYXBwaW5ncygpOw0KLSAgICAgICAgaW5pdERlZmF1bHRDb21wb25lbnRJbml0aWFsaXplcigpOw0KLSAgICAgICAgaW5pdERlZmF1bHRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKTsNCi0gICAgICAgIGFkZFNraXBWYWxpZGF0aW9uU3VwcG9ydCgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0U3RhdGljU3RyYXRlZ3lNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBqcGFCYXNlZFZhbGlkYXRpb24gPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9KUEFfQkFTRURfVkFMSURBVElPTjsNCi0gICAgICAgIGlmIChqcGFCYXNlZFZhbGlkYXRpb24gPT0gbnVsbA0KLSAgICAgICAgICAgICAgICB8fCAhanBhQmFzZWRWYWxpZGF0aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgPSBuZXcgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZygNCi0gICAgICAgICAgICAgICAgRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgKyIuanBhX3N0cmF0ZWd5X21hcHBpbmdzIik7DQotDQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkU3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRywgc3RhdGljQ29uZmlnKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAid2ViLnhtbCBwYXJhbWV0ZXIgdG8gZGVhY3RpdmF0ZSBpdCIpDQotICAgIHByaXZhdGUgdm9pZCBpbml0RGVmYXVsdENvbXBvbmVudEluaXRpYWxpemVyKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ3ZWIueG1sIHBhcmFtZXRlciB0byBkZWFjdGl2YXRlIGl0IikNCi0gICAgcHJpdmF0ZSB2b2lkIGluaXREZWZhdWx0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKA0KLSAgICAgICAgICAgICAgICBuZXcgSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRTa2lwVmFsaWRhdGlvblN1cHBvcnQoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJhZGRpbmcgc3VwcG9ydCBmb3IgQFNraXBWYWxpZGF0aW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5kZW55UmVuZGVyZXJJbnRlcmNlcHRvcihWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKG5ldyBWYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0KCkpOw0KLQ0KLSAgICAgICAgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgIC8vaXQncyBqdXN0IHJlcXVpcmVkIHRvIHNldCB0aGUgdGFyZ2V0DQotICAgICAgICBjb25maWcuYWRkTWFwcGluZyhDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCBTa2lwVmFsaWRhdGlvblN1cHBvcnQuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5TS0lQX1ZBTElEQVRJT05fU1VQUE9SVF9DT05GSUcsIGNvbmZpZyk7DQotDQotICAgICAgICAvL2NvbmZpZy5hZGRNYXBwaW5nKENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04sIFJlcXVpcmVkU3RyYXRlZ3kuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYWE3YzEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yV2l0aFNraXBWYWxpZGF0aW9uU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuU2tpcFZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25JbnRlcmNlcHRvcldpdGhTa2lwVmFsaWRhdGlvblN1cHBvcnQgZXh0ZW5kcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBza2lwVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQotICAgIHsKLSAgICAgICAgaWYoRXh0VmFsVXRpbHMuaXNTa2lwYWJsZVZhbGlkYXRpb25TdHJhdGVneSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJvb2xlYW4gc2tpcFZhbGlkYXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlNLSVBfVkFMSURBVElPTiwgQm9vbGVhbi5jbGFzcyk7Ci0KLSAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMoc2tpcFZhbGlkYXRpb24pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJ2YWxpZGF0aW9uIG9mICIgKyB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGNhbmNlbGVkIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZih2YWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGFuY2VvZiBTa2lwVmFsaWRhdGlvblN0cmF0ZWd5KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgbnVsbCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZWViMjguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRvY3VtZW50YXRpb24iKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NRVNTQUdFU19KUEEgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJKUEFfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFUyIpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfSlBBX0JBU0VEX1ZBTElEQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OIik7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0RvdWJsZVJhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNjFjMWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0RvdWJsZVJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgRG91YmxlUmFuZ2UNCi17DQotICAgIGRvdWJsZSBtaW5pbXVtKCkgZGVmYXVsdCAwOw0KLQ0KLSAgICBkb3VibGUgbWF4aW11bSgpIGRlZmF1bHQgRG91YmxlLk1BWF9WQUxVRTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vSm9pblZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiNTJiZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vSm9pblZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBKb2luVmFsaWRhdGlvbg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xlbmd0aC5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xlbmd0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDUyZmZjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBMZW5ndGgNCi17DQotICAgIGludCBtaW5pbXVtKCkgZGVmYXVsdCAwOw0KLQ0KLSAgICBpbnQgbWF4aW11bSgpIGRlZmF1bHQgSW50ZWdlci5NQVhfVkFMVUU7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Mb25nUmFuZ2UuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Mb25nUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU5Mjk0NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgTG9uZ1JhbmdlDQotew0KLSAgICBsb25nIG1pbmltdW0oKSBkZWZhdWx0IDA7DQotDQotICAgIGxvbmcgbWF4aW11bSgpIGRlZmF1bHQgTG9uZy5NQVhfVkFMVUU7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTQ5YjlhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLUBSZXRlbnRpb24oUlVOVElNRSkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIEBpbnRlcmZhY2UgUGF0dGVybgotewotICAgIFN0cmluZ1tdIHZhbHVlKCk7Ci0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAibm9fbWF0Y2giOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUmVxdWlyZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI2NWIzYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUmVxdWlyZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBSZXF1aXJlZA0KLXsNCi0gICAgLyoqDQotICAgICAqIHRvIGN1c3RvbWl6ZSB0aGUgZXJyb3IgbWVzc2FnZSBvcg0KLSAgICAgKiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBqc2YgcmVxdWlyZWQgbWVzc2FnZSB3aXRoIHRoZSB1c2FnZSBvZiB0aGUgbWVzc2FnZSByZXNvbHZlciBtZWNoYW5pc20NCi0gICAgICoNCi0gICAgICogQHJldHVybiBhbiBvcHRpb25hbCBlcnJvciBtZXNzYWdlIGtleQ0KLSAgICAgKi8NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImZpZWxkX3JlcXVpcmVkIjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM2NzZiNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotQFJldGVudGlvbihSVU5USU1FKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgQGludGVyZmFjZSBTa2lwVmFsaWRhdGlvbgotewotICAgIFN0cmluZ1tdIHZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOTk1YmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRhcmdldChUWVBFKQotQFJldGVudGlvbihSVU5USU1FKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgQGludGVyZmFjZSBTa2lwVmFsaWRhdGlvblN1cHBvcnQKLXsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9WYWxpZGF0b3IuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ5NDBjNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgVmFsaWRhdG9yDQotew0KLSAgICBDbGFzczw/IGV4dGVuZHMgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcj5bXSB2YWx1ZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWU4OTA1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IgZXh0ZW5kcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IKLXsKLSAgICBwcml2YXRlIERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGdldEluc3RhbmNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVJbnRlcmNlcHRlZE1ldGFEYXRhRXh0cmFjdG9yKG5ldyBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkKLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsKLQotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBQcm9wZXJ0eURldGFpbHMpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG9iamVjdC5nZXRDbGFzcygpICsgIiBpcyBub3QgYSAiICsgUHJvcGVydHlEZXRhaWxzLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gKFByb3BlcnR5RGV0YWlscylvYmplY3Q7Ci0KLSAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCk7Ci0KLSAgICAgICAgLy9UT0RPIHRlc3Qgd2l0aCBjb21wbGV4IGNvbXBvbmVudHMKLSAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5zZXRJbmZvcm1hdGlvbigKLSAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIHByb3BlcnR5RGV0YWlscyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZmluZCBhbmQgYWRkIGFubm90YXRpb25zCi0gICAgICAgICAqLwotICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU4MDEyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPVRoZSByZXF1aXJlZCBmb3JtYXRlIGlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2FiNTQzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPVx1MDYyN1x1MDY0NFx1MDYzNVx1MDY0YVx1MDYzYVx1MDYyOSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2MjZcdTA2MjkNCi1ub19tYXRjaF9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjM1XHUwNjRhXHUwNjNhXHUwNjI5IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzN1x1MDY0NFx1MDY0OFx1MDYyOFx1MDYyOSBcdTA2NDdcdTA2NDk6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZDY0OTAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW5vX21hdGNoPUZvcm1hdCBpbnZcdTAwZTBsaWQKLW5vX21hdGNoX2RldGFpbD1FbCBmb3JtYXQgcmVxdWVyaXQgXHUwMGU5czogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVlNzAxYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1Vbmf8bHRpZ2VzIEZvcm1hdA0KLW5vX21hdGNoX2RldGFpbD1EYXMgZXJmb3JkZXJsaWNoZSBGb3JtYXQgaXN0OiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU4MDEyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPVRoZSByZXF1aXJlZCBmb3JtYXRlIGlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmIxMDc3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXRvIGludlx1MDBlMWxpZG8gCi1ub19tYXRjaF9kZXRhaWw9RWwgZm9ybWF0byByZXF1ZXJpZG8gZXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMGEyMjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9TGUgZm9ybWF0IGVzdCBpbnZhbGlkZQ0KLW5vX21hdGNoX2RldGFpbD1MZSBmb3JtYXQgZG9pdCAmZWNpcmM7dHJlIGRlIGxhIGZvcm1lOiB7MH0NCi0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTg3NDhjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXRvIG5vbiB2YWxpZG8KLW5vX21hdGNoX2RldGFpbD1JbCBmb3JtYXRvIHJpY2hpZXN0byAmZWdyYXZlOzogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0YmM3NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1HZVx1MDBlN2Vyc2l6IGJpXHUwMGU3aW0NCi1ub19tYXRjaF9kZXRhaWw9Z2VyZWtlbiBiaVx1MDBlN2ltOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlOTY3YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgICAgIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZU5hbWUgPSBudWxsOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VOYW1lID0gc3VwZXIuZ2V0QmFzZU5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBiYXNlTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NGVjZTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIHRoZSBqcGEgc3VwcG9ydCBpcyBhbiBleGNlcHRpb24gaW4gdmlldyBvZiBzb21lIG1lY2hhbmlzbXMgLSBzbyB0aGVyZSdzIG5vIGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZS4NCi0gKiBpbnN0ZWFkIG9mIHRoZSBjb252ZW50aW9uIHRoZXJlIGlzIGEgZ2xvYmFsIHByb3BlcnR5IHRvIGhhdmUgYW4gYWx0ZXJuYXRpdmUgdG8gd2ViLnhtbCBjb25maWd1cmF0aW9uDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTID0gIkpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTIjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX05BTUUgPSBXZWJYbWxQYXJhbWV0ZXIuVkFMSURBVElPTl9NRVNTQUdFU19KUEE7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX05BTUUgPSBKcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MNCi0gICAgICAgICAgICAuZ2V0UGFja2FnZSgpLmdldE5hbWUoKS5yZXBsYWNlKCIubWVzc2FnZS5yZXNvbHZlciIsICIubWVzc2FnZS5idW5kbGUiKSsgIi5qcGFfbWVzc2FnZXMiOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYoQ1VTVE9NX0JBU0VfTkFNRSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBDVVNUT01fQkFTRV9OQU1FOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQkFTRV9OQU1FOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWRkMThjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgRG91YmxlUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoRG91YmxlUmFuZ2UuY2xhc3MpOw0KLQ0KLSAgICAgICAgZG91YmxlIG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4sIG1pbmltdW0pOw0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCwgYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgaWYobWluaW11bSA+IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzVhMTU5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSm9pbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3Rvci5EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKb2luTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIGV4dHJhY3RvciA9IERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuZ2V0SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIFN0cmluZ1tdIHRhcmdldEV4cHJlc3Npb25zID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShKb2luVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotDQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHM7DQotICAgICAgICBmb3IgKFN0cmluZyB0YXJnZXRFeHByZXNzaW9uIDogdGFyZ2V0RXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChtZXRhRGF0YUVudHJ5LCB0YXJnZXRFeHByZXNzaW9uKTsNCi0NCi0gICAgICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBleHRyYWN0b3IuZXh0cmFjdChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscykuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSBFeHRWYWxVdGlscy5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSk7DQotDQotICAgICAgICAgICAgICAgIGlmIChtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0QWxsKG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pwYU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGJmZGJhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5CYXNpYzsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJpbXBsLiB0aGUgcmVzdCIpDQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IG1ldGFEYXRhLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIENvbHVtbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighKChDb2x1bW4pIGFubm90YXRpb24pLm51bGxhYmxlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCwgKChDb2x1bW4pIGFubm90YXRpb24pLmxlbmd0aCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIEJhc2ljKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCEoKEJhc2ljKSBhbm5vdGF0aW9uKS5vcHRpb25hbCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKGFubm90YXRpb24gaW5zdGFuY2VvZiBJZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9UT0RPIGltcGwuIHRoZSByZXN0ISEhDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTGVuZ3RoTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2M1ZWUzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTGVuZ3RoTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTGVuZ3RoTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTGVuZ3RoIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKExlbmd0aC5jbGFzcyk7DQotDQotICAgICAgICBpbnQgbWluaW11bSA9IGFubm90YXRpb24ubWluaW11bSgpOw0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEgsIG1pbmltdW0pOw0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgsIGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gPiAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Mb25nUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ODVlMmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Mb25nUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Mb25nUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMb25nUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBMb25nUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTG9uZ1JhbmdlLmNsYXNzKTsNCi0NCi0gICAgICAgIGxvbmcgbWluaW11bSA9IGFubm90YXRpb24ubWluaW11bSgpOw0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTiwgbWluaW11bSk7DQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYLCBhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBpZihtaW5pbXVtID4gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1BhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1BhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NGE1YjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9QYXR0ZXJuTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFBhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBQYXR0ZXJuIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFBhdHRlcm4uY2xhc3MpOw0KLSAgICAgICAgDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTiwgKGFubm90YXRpb24pLnZhbHVlKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSA9IChhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIExvY2FsZSBjdXJyZW50TG9jYWxlID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCk7DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5ID0NCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2cgPSBFeHRWYWxVdGlscy5nZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgIC5nZXRNZXNzYWdlKHZhbGlkYXRpb25FcnJvck1zZ0tleSwgY3VycmVudExvY2FsZSk7DQotDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTl9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UsIHZhbGlkYXRpb25FcnJvck1zZyk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9SZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThmNWFhNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU2tpcE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU2tpcE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZiODI1Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NraXBNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFNraXBNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCB0cnVlKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MTc0ODkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgVmFsaWRhdG9yIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFZhbGlkYXRvci5jbGFzcyk7DQotDQotICAgICAgICBDbGFzc1tdIHZhbGlkYXRvcnMgPSBhbm5vdGF0aW9uLnZhbHVlKCk7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBjdXJyZW50Q2xhc3MgOiB2YWxpZGF0b3JzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRDbGFzcy5nZXRTaW1wbGVOYW1lKCkudG9Mb3dlckNhc2UoKS5jb250YWlucyhDb21tb25NZXRhRGF0YUtleXMuRU1BSUwpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsdWUuYWRkKENvbW1vbk1ldGFEYXRhS2V5cy5FTUFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZhbHVlLmFkZChjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00sIHZhbHVlKTsNCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvRG91YmxlUmFuZ2VTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNzU5MzMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkRvdWJsZVJhbmdlVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEb3VibGVSYW5nZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIERvdWJsZVJhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKERvdWJsZVJhbmdlLmNsYXNzKTsNCi0gICAgICAgIERvdWJsZVJhbmdlVmFsaWRhdG9yIGRvdWJsZVJhbmdlVmFsaWRhdG9yID0gKERvdWJsZVJhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5Eb3VibGVSYW5nZSIpOw0KLQ0KLSAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Kb2luVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1ZDRlNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3Rvci5EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSm9pblZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBleHRyYWN0b3IgPSBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmdldEluc3RhbmNlKCk7DQotDQotICAgICAgICBTdHJpbmdbXSB0YXJnZXRFeHByZXNzaW9ucyA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoSm9pblZhbGlkYXRpb24uY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlsczsNCi0gICAgICAgIGZvciAoU3RyaW5nIHRhcmdldEV4cHJlc3Npb24gOiB0YXJnZXRFeHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscw0KLSAgICAgICAgICAgICAgICAuY3JlYXRlUHJvcGVydHlEZXRhaWxzRm9yTmV3VGFyZ2V0KG1ldGFEYXRhRW50cnksIHRhcmdldEV4cHJlc3Npb24pOw0KLQ0KLSAgICAgICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IGV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgcHJvcGVydHlEZXRhaWxzKS5nZXRNZXRhRGF0YUVudHJpZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKGVudHJ5LmdldEtleSgpKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm5vIHZhbGlkYXRpb24gc3RyYXRlZ3kgZm91bmQgZm9yICIgKyBlbnRyeS5nZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxNGQ4ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQmFzaWM7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZTsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRmFjZXNCdW5kbGUgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRFX0xFTkdUSCA9ICJsZW5ndGgiOw0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB2aW9sYXRpb247DQotICAgIHByaXZhdGUgaW50IG1heExlbmd0aDsNCi0NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpOw0KLSAgICAgICAgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBDb2x1bW4pDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVDb2x1bW5Bbm5vdGF0aW9uKChDb2x1bW4pIGFubm90YXRpb24sIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgQmFzaWMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVCYXNpY0Fubm90YXRpb24oKEJhc2ljKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIElkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBPbmVUb09uZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZU9uZVRvT25lQW5ub3RhdGlvbigoT25lVG9PbmUpIGFubm90YXRpb24sIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTWFueVRvT25lKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlTWFueVRvT25lQW5ub3RhdGlvbigoTWFueVRvT25lKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUNvbHVtbkFubm90YXRpb24oQ29sdW1uIGNvbHVtbiwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoIWNvbHVtbi5udWxsYWJsZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nDQotICAgICAgICAgICAgICAgICYmIGNvbHVtbi5sZW5ndGgoKSA8ICgoU3RyaW5nKSBjb252ZXJ0ZWRPYmplY3QpLmxlbmd0aCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uID0gVkFMSURBVEVfTEVOR1RIOw0KLSAgICAgICAgICAgIHRoaXMubWF4TGVuZ3RoID0gY29sdW1uLmxlbmd0aCgpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNYXNzYWdlKG51bGwpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVCYXNpY0Fubm90YXRpb24oQmFzaWMgYmFzaWMsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKCFiYXNpYy5vcHRpb25hbCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVPbmVUb09uZUFubm90YXRpb24oT25lVG9PbmUgb25lVG9PbmUsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmICghb25lVG9PbmUub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTWFueVRvT25lQW5ub3RhdGlvbihNYW55VG9PbmUgbWFueVRvT25lLCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIW1hbnlUb09uZS5vcHRpb25hbCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9EbyhQcmlvcml0eS5NRURJVU0pDQotICAgIHByaXZhdGUgdm9pZCBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCA9PSBudWxsIHx8IGNvbnZlcnRlZE9iamVjdC5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uID0gQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNYXNzYWdlKG51bGwpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChWQUxJREFURV9MRU5HVEguZXF1YWxzKHRoaXMudmlvbGF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gImZpZWxkX3Rvb19sb25nIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gImZpZWxkX3JlcXVpcmVkIjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24pOw0KLQ0KLSAgICAgICAgaWYgKFZBTElEQVRFX0xFTkdUSC5lcXVhbHModGhpcy52aW9sYXRpb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLnJlcGxhY2UoInswfSIsICIiICsgdGhpcy5tYXhMZW5ndGgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gZS5nZXRGYWNlc01lc3NhZ2UoKTsNCi0NCi0gICAgICAgIGlmKHRoaXMudXNlRmFjZXNCdW5kbGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoVkFMSURBVEVfTEVOR1RILmVxdWFscyh0aGlzLnZpb2xhdGlvbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5yZXBsYWNlV2l0aERlZmF1bHRNYXhpbXVtTWVzc2FnZShmYWNlc01lc3NhZ2UsIHRoaXMubWF4TGVuZ3RoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKGZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIGUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTGVuZ3RoU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTGVuZ3RoU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkMDU1OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xlbmd0aFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExlbmd0aFN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIExlbmd0aCBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMZW5ndGguY2xhc3MpOw0KLSAgICAgICAgTGVuZ3RoVmFsaWRhdG9yIGxlbmd0aFZhbGlkYXRvciA9IChMZW5ndGhWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoImphdmF4LmZhY2VzLkxlbmd0aCIpOw0KLQ0KLSAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1pbmltdW0oYW5ub3RhdGlvbi5taW5pbXVtKCkpOw0KLSAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1heGltdW0oYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzU4MjAyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTG9uZ1JhbmdlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxvbmdSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkxvbmdSYW5nZVZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTG9uZ1JhbmdlU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLQ0KLSAgICAgICAgTG9uZ1JhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKExvbmdSYW5nZS5jbGFzcyk7DQotICAgICAgICBMb25nUmFuZ2VWYWxpZGF0b3IgbG9uZ1JhbmdlVmFsaWRhdG9yID0gKExvbmdSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5Mb25nUmFuZ2UiKTsNCi0NCi0gICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUGF0dGVyblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2VlN2YzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUGF0dGVyblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFNraXBWYWxpZGF0aW9uU3VwcG9ydAotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBQYXR0ZXJuU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kKLXsKLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwKLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFBhdHRlcm4gYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoUGF0dGVybi5jbGFzcyk7Ci0KLSAgICAgICAgZm9yIChTdHJpbmcgZXhwcmVzc2lvbiA6IGFubm90YXRpb24udmFsdWUoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgIHx8ICFqYXZhLnV0aWwucmVnZXguUGF0dGVybi5jb21waWxlKGV4cHJlc3Npb24pLm1hdGNoZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkT2JqZWN0LnRvU3RyaW5nKCkpLm1hdGNoZXMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG5ldyBGYWNlc01lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24pLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24pLnJlcGxhY2UoInswfSIsIGV4cHJlc3Npb24pKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pCi0gICAgewotICAgICAgICByZXR1cm4gKChQYXR0ZXJuKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUmVxdWlyZWRTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzhmOTk2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUmVxdWlyZWRTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUZhY2VzQnVuZGxlID0gZmFsc2U7DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCB8fCBjb252ZXJ0ZWRPYmplY3QuZXF1YWxzKCIiKSB8fA0KLSAgICAgICAgICAgICAgICAoY29udmVydGVkT2JqZWN0IGluc3RhbmNlb2YgQ29sbGVjdGlvbiAmJiAoKENvbGxlY3Rpb24pY29udmVydGVkT2JqZWN0KS5pc0VtcHR5KCkpIHx8DQotICAgICAgICAgICAgICAgIChjb252ZXJ0ZWRPYmplY3QgaW5zdGFuY2VvZiBNYXAgJiYgKChNYXApY29udmVydGVkT2JqZWN0KS5pc0VtcHR5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNYXNzYWdlKG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKFJlcXVpcmVkKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc3VwZXIucmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0gICAgICAgIFN0cmluZyBtYXJrZXIgPSBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5NSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0NCi0gICAgICAgIGlmKChtYXJrZXIgKyBrZXkgKyBtYXJrZXIpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudXNlRmFjZXNCdW5kbGUgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy51c2VGYWNlc0J1bmRsZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5yZXBsYWNlV2l0aERlZmF1bHRSZXF1aXJlZE1lc3NhZ2UoZS5nZXRGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1NraXBWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhZGFjNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1NraXBWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFNraXBWYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBWYWxpZGF0aW9uU3RyYXRlZ3kKLXsKLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmdbXSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9ucyA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoU2tpcFZhbGlkYXRpb24uY2xhc3MpLnZhbHVlKCk7Ci0KLSAgICAgICAgZm9yKFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uIDogdmFsdWVCaW5kaW5nRXhwcmVzc2lvbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRWYWx1ZU9mRXhwcmVzc2lvbigKLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5zZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5TS0lQX1ZBTElEQVRJT04sIHRydWUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9WYWxpZGF0b3JTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9WYWxpZGF0b3JTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjNjYzkxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLQ0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I+W10gdmFsaWRhdG9yQ2xhc3NlcyA9DQotICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShWYWxpZGF0b3IuY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yIHZhbGlkYXRvcjsNCi0gICAgICAgIGZvciAoQ2xhc3MgdmFsaWRhdG9yQ2xhc3NOYW1lIDogdmFsaWRhdG9yQ2xhc3NlcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0b3IgPSAoamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcikgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzcyh2YWxpZGF0b3JDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UodmFsaWRhdG9yQ2xhc3NOYW1lLmdldE5hbWUoKSArICIgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU2NmE0MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWNlc0V4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBUaGlzIHBoYXNlIGxpc3RlbmVyIHByb2Nlc3NlcyBjcm9zcyB2YWxpZGF0aW9uIGFzIHNvb24gYXMgaXQgZmluZHMgYSBzcGVjaWFsIHJlcXVlc3Qgc2NvcGVkIHN0b3JhZ2UuPGJyLz4NCi0gKiBTbyBpdCdzIHBvc3NpYmxlIHRvIGFkZCBpbmZvcm1hdGlvbiBkdXJpbmcgdGhlIHByb2Nlc3MgdmFsaWRhdGlvbiBwaGFzZS4gQXQgdGhlIGVuZCBvZiB0aGlzIHBoYXNlIGl0IGdldHMgcHJvY2Vzc2VkLg0KLSAqIEFmdGVyIHRoYXQgdGhlIHN0b3JhZ2UgZ2V0cyByZXNldGVkLjxwLz4NCi0gKiBJZiB5b3UgcHJvdmlkZSBhIGN1c3RvbSBleHRlbnNpb24gYW5kIHlvdSBhZGQgdGhlIHNhbWUgc3RvcmFnZSB0eXBlIHdpdGhpbiBhIGRpZmZlcmVudCBwaGFzZSwNCi0gKiBpdCBhbHNvIGdldHMgcHJvY2Vzc2VkIGF0IHRoZSBlbmQgb2YgdGhhdCBwaGFzZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSA9IENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKTsNCi0gICAgICAgICAgICBmb3IgKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA6IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UuZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKSBpbnN0YW5jZW9mIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbml0Q3Jvc3NWYWxpZGF0aW9uIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLnByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oZW50cnksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFkZE1lc3NhZ2UgPSB0cnVlOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkgaW5zdGFuY2VvZiBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWVzc2FnZSA9IChCb29sZWFuKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5nZXRDbGFzcygpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5jbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRDbGFzcygpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYoYWRkTWVzc2FnZSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWNlc01lc3NhZ2UgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsICYmIGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RmFjZXNDb250ZXh0KCkuYWRkTWVzc2FnZShlbnRyeS5nZXRDbGllbnRJZCgpLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRGYWNlc0NvbnRleHQoKS5yZW5kZXJSZXNwb25zZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluYWxseQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLnJlc2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNJbml0aWFsaXplZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OICE9IG51bGwNCi0gICAgICAgICAgICAgICAgICAgICYmIFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NST1NTVkFMSURBVElPTi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBKc2ZVdGlscy5kZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcih0aGlzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5BTllfUEhBU0U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmIzZGYwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMgPSANCi0gICAgICAgIG5ldyBBcnJheUxpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGQoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzLmFkZChlbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcyhMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDRjMDQwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkNCi17DQotICAgIHByaXZhdGUgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5Ow0KLSAgICAvL2ZvciBjb21wbGV4IGNvbXBvbmVudHMgKGUuZy4gYSB0YWJsZSkgc3RvcmVzIHRoZSBvYmplY3Qgb2YgZW50cnkgKCN7ZW50cnkucHJvcGVydHl9KQ0KLSAgICBwcml2YXRlIFVJQ29tcG9uZW50IGNvbXBvbmVudDsNCi0gICAgcHJpdmF0ZSBPYmplY3QgY29udmVydGVkT2JqZWN0Ow0KLSAgICBwcml2YXRlIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgLy9qdXN0IGZvciBpbnB1dCBjb21wb25lbnRzIHdpdGhpbiBjb21wbGV4IGNvbXBvbmVudHMgZS5nLiBkYXRhVGFibGUsLi4uDQotICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudElkOw0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeSBnZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhRW50cnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFFbnRyeSA9IG1ldGFEYXRhRW50cnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFVJQ29tcG9uZW50IGdldENvbXBvbmVudCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KFVJQ29tcG9uZW50IGNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRPYmplY3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlZE9iamVjdChPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbnZlcnRlZE9iamVjdCA9IGNvbnZlcnRlZE9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uU3RyYXRlZ3koQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneSA9IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudElkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNsaWVudElkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudElkKFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1Byb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1Byb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkzMTNkOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBJbiBvcmRlciB0byBidWlsZCB1cCBhIG1hcHBpbmcgd2hpY2ggaXMgdXNlZCBmb3IgY3Jvc3MtdmFsaWRhdGlvbi4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkKLXsKLSAgICBwcml2YXRlIE9iamVjdCBiZWFuOwotICAgIHByaXZhdGUgT2JqZWN0IGNvbnZlcnRlZFZhbHVlOwotICAgIHByaXZhdGUgVUlDb21wb25lbnQgY29tcG9uZW50OwotICAgIC8vZm9yIGNvbXBsZXggY29tcG9uZW50cyAoZS5nLiBhIHRhYmxlIHRoZXJlIGFyZSBtdWx0aXBsZSBlbnRyaWVzIHdpdGgKLSAgICAvL3RoZSBzYW1lIGtleSAoaGVyZSB0aGUgZWwgZXhwcmVzc2lvbiAje2VudHJ5LnByb3BlcnR5fSkKLSAgICAvL2hvd2V2ZXIsIGRvbid0IG92ZXJyaWRlIHRoZSBwcmV2aW91cyBlbnRyeSAtIHRoZXkgYXJuJ3QgdGhlIHNhbWU7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGZ1cnRoZXJFbnRyaWVzOwotICAgIC8vanVzdCBmb3IgaW5wdXQgY29tcG9uZW50cyB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzIGUuZy4gZGF0YVRhYmxlLC4uLgotICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudElkOwotCi0gICAgLyoKLSAgICAgKiBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmVhbihPYmplY3QgYmVhbikKLSAgICB7Ci0gICAgICAgIHRoaXMuYmVhbiA9IGJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkVmFsdWUoT2JqZWN0IGNvbnZlcnRlZFZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy5jb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBVSUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnQoVUlDb21wb25lbnQgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gY2xpZW50SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50SWQoU3RyaW5nIGNsaWVudElkKQotICAgIHsKLSAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGdldEZ1cnRoZXJFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmdXJ0aGVyRW50cmllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGdXJ0aGVyRW50cmllcyhMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGZ1cnRoZXJFbnRyaWVzKQotICAgIHsKLSAgICAgICAgdGhpcy5mdXJ0aGVyRW50cmllcyA9IGZ1cnRoZXJFbnRyaWVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiN2Y4OWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcm4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04iKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXMuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZjgzY2YuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIERhdGVJcw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWVPZigpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBvcHRpb25hbCBzZWN0aW9uDQotICAgICAqLw0KLQ0KLSAgICBEYXRlSXNUeXBlIHR5cGUoKSBkZWZhdWx0IERhdGVJc1R5cGUuc2FtZTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgIiI7DQotDQotICAgIFN0cmluZyBub3RCZWZvcmVFcnJvck1zZ0tleSgpIGRlZmF1bHQgIndyb25nX2RhdGVfbm90X2JlZm9yZSI7DQotDQotICAgIFN0cmluZyBub3RBZnRlckVycm9yTXNnS2V5KCkgZGVmYXVsdCAid3JvbmdfZGF0ZV9ub3RfYWZ0ZXIiOw0KLQ0KLSAgICBTdHJpbmcgbm90RXF1YWxFcnJvck1zZ0tleSgpIGRlZmF1bHQgIndyb25nX2RhdGVfbm90X2VxdWFsIjsNCi0NCi0gICAgaW50IGVycm9yTWVzc2FnZURhdGVTdHlsZSgpIGRlZmF1bHQgRGF0ZUZvcm1hdC5NRURJVU07DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzVHlwZS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNWY0ODIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJiZWZvcmVPclNhbWUsIGFmdGVyT3JTYW1lIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgZW51bSBEYXRlSXNUeXBlDQotew0KLSAgICBiZWZvcmUsIGFmdGVyLCBzYW1lDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0VxdWFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTQyNDA5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIEVxdWFscw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZCI7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL05vdEVxdWFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTYxNmEwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIE5vdEVxdWFscw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQiOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWIwMTlkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBSZXF1aXJlZElmDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZU9mKCk7DQotDQotICAgIC8qDQotICAgICAqIG9wdGlvbmFsIHNlY3Rpb24NCi0gICAgICovDQotDQotICAgIFJlcXVpcmVkSWZUeXBlIGlzKCkgZGVmYXVsdCBSZXF1aXJlZElmVHlwZS5ub3RfZW1wdHk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJlbXB0eV9maWVsZCI7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZlR5cGUuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkwYWM5MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWZUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBlbnVtIFJlcXVpcmVkSWZUeXBlDQotew0KLSAgICBlbXB0eSwgbm90X2VtcHR5DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2MDc1OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUlucHV0IGlzIGRpZmZlcmVudA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9SW5wdXQgaXMgZGlmZmVyZW50DQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi0NCi13cm9uZ19kYXRlPVdyb25nIGRhdGUNCi13cm9uZ19kYXRlX2RldGFpbD1Xcm9uZyBkYXRlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZjkzYzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1cdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgXHUwNjQ1XHUwNjJlXHUwNjJhXHUwNjQ0XHUwNjQxDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgXHUwNjQ1XHUwNjJlXHUwNjJhXHUwNjQ0XHUwNjQxDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1cdTA2M2FcdTA2NGFcdTA2MzEgXHUwNjQ1XHUwNjMzXHUwNjQ1XHUwNjQ4XHUwNjJkIFx1MDYyOFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDYgXHUwNjQxXHUwNjMzIFx1MDY0Mlx1MDY0YVx1MDY0NVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1cdTA2M2FcdTA2NGFcdTA2MzEgXHUwNjQ1XHUwNjMzXHUwNjQ1XHUwNjQ4XHUwNjJkIFx1MDYyOFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCAgXHUwNjQ2XHUwNjQxXHUwNjMzIFx1MDY0Mlx1MDY0YVx1MDY0NVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQNCi0NCi13cm9uZ19kYXRlPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2NDlcdTA2MjENCi13cm9uZ19kYXRlX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjJlXHUwNjI3XHUwNjM3XHUwNjQ5XHUwNjIxDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0M1x1MDY0OCBcdTA2NDYgXHUwNjI4XHUwNjM5XHUwNjJmIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzIFx1MDY0OFx1MDY0NiBcdTA2MjhcdTA2MzlcdTA2MmYgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzXHUwNjQ4IFx1MDY0NiBcdTA2NDJcdTA2MjhcdTA2NDQgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0MyBcdTA2NDhcdTA2NDYgXHUwNjQyXHUwNjI4XHUwNjQ0IHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NDRcdTA2MjcgXHUwNjRhXHUwNjMzXHUwNjI3XHUwNjQ4XHUwNjQ5IHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjQ0XHUwNjI3IFx1MDY0YVx1MDYzM1x1MDYyN1x1MDY0OFx1MDY0OSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NTRlZDIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9ZWwgdmFsb3IgXHUwMGU5IGRpZmVyZW50Ci1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPWVsIHZhbG9yIFx1MDBlOSBkaWZlcmVudAotCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPW5vIGVzIHBlcm1ldCBlbCBtYXRlaXggdmFsb3IKLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPW5vIGVzIHBlcm1ldCBlbCBtYXRlaXggdmFsb3IKLQotd3JvbmdfZGF0ZT1kYXRhIGVyclx1MDBmMm5pYQotd3JvbmdfZGF0ZV9kZXRhaWw9ZGF0YSBlcnJcdTAwZjJuaWEKLQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1sYSBkYXRhIGhhIGRlIHNlciBwb3N0ZXJpb3IgYSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9bGEgZGF0YSBoYSBkZSBzZXIgYW50ZXJpb3IgYSB7MH0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1sYSBkYXRhIGhhIGRlIHNlciBwb3N0ZXJpb3IgYSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9bGEgZGF0YSBubyBcdTAwMGU5cyBpZ3VhbCBhIHswfQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPWxhIGRhdGEgbm8gXHUwMDBlOXMgaWd1YWwgYSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkODcyMzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1FaW5nYWJlIGlzdCB1bnRlcnNjaGllZGxpY2gNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUVpbmdhYmUgaXN0IHVudGVyc2NoaWVkbGljaA0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9RGVyIGdsZWljaGUgV2VydCBpc3QgbmljaHQgZXJsYXVidA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPURlciBnbGVpY2hlIFdlcnQgaXN0IG5pY2h0IGVybGF1YnQNCi0NCi13cm9uZ19kYXRlPURhdHVtIGlua29ycmVrdA0KLXdyb25nX2RhdGVfZGV0YWlsPURhdHVtIGlua29ycmVrdA0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1EYXMgRGF0dW0gbXVzcyBuYWNoIGRlbSB7MH0gc2Vpbg0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9RGFzIERhdHVtIG11c3MgbmFjaCBkZW0gezB9IHNlaW4NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1EYXMgRGF0dW0gbXVzcyB2b3IgZGVtIHswfSBzZWluDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPURhcyBEYXR1bSBtdXNzIHZvciBkZW0gezB9IHNlaW4NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1EYXMgRGF0dW0gZW50c3ByaWNodCBuaWNodCBkZW0gezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPURhcyBEYXR1bSBlbnRzcHJpY2h0IG5pY2h0IGRlbSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNjA3NTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1JbnB1dCBpcyBkaWZmZXJlbnQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUlucHV0IGlzIGRpZmZlcmVudA0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotDQotd3JvbmdfZGF0ZT1Xcm9uZyBkYXRlDQotd3JvbmdfZGF0ZV9kZXRhaWw9V3JvbmcgZGF0ZQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzM4NTI0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPWxhIGVudHJhZGEgZXMgZGlmZXJlbnRlCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPWxhIGVudHJhZGEgZXMgZGlmZXJlbnRlCi0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9bm8gc2UgcGVybWl0ZW4gZW50cmFkYXMgaWd1YWxlcwotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9bm8gc2UgcGVybWl0ZW4gZW50cmFkYXMgaWd1YWxlcwotCi13cm9uZ19kYXRlPWZlY2hhIGVxdWl2b2NhZGEKLXdyb25nX2RhdGVfZGV0YWlsPWZlY2hhIGVxdWl2b2NhZGEKLQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgbHVlZ28gZGUgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgbHVlZ28gZGUgezB9Ci0KLXdyb25nX2RhdGVfbm90X2FmdGVyPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgYW50ZXMgZGUgezB9Ci13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBhbnRlcyBkZSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9bGEgZmVjaGEgbm8gZXMgaWd1YWwgYSB7MH0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1sYSBmZWNoYSBubyBlcyBpZ3VhbCBhIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmMDIxOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUxlcyBjaGFtcHMgc29udCBkaWZmJmVhY3V0ZTtyZW50cw0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9TGVzIGNoYW1wcyBzb250IGRpZmYmZWFjdXRlO3JlbnRzDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1MZXMgY2hhbXBzIGRvaXZlbnQgJmVjaXJjO3RyZSBkaWZmJmVhY3V0ZTtyZW50cw0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPUxlcyBjaGFtcHMgZG9pdmVudCAmZWNpcmM7dHJlIGRpZmYmZWFjdXRlO3JlbnRzDQotDQotd3JvbmdfZGF0ZT1MYSBkYXRlIGVzdCBpbmNvcnJlY3RlDQotd3JvbmdfZGF0ZV9kZXRhaWw9TGEgZGF0ZSBlc3QgaW5jb3JyZWN0ZQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhcHImZWdyYXZlO3MgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhcHImZWdyYXZlO3MgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXZhbnQgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGF2YW50IHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPUxhIGRhdGUgbidlc3QgcGFzICZlYWN1dGU7Z2FsZSAmYWdyYXZlOyB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9TGEgZGF0ZSBuJ2VzdCBwYXMgJmVhY3V0ZTtnYWxlICZhZ3JhdmU7IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcyBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA0MjgwMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1WYWxvcmkgbm9uIHVndWFsaQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1JIHZhbG9yaSBpbnNlcml0aSBub24gY29pbmNpZG9ubwotCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPUxvIHN0ZXNzbyB2YWxvcmUgbm9uICZlZ3JhdmU7IHBlcm1lc3NvCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1MbyBzdGVzc28gdmFsb3JlIG5vbiAmZWdyYXZlOyBwZXJtZXNzbwotCi13cm9uZ19kYXRlPURhdGEgZXJyYXRhCi13cm9uZ19kYXRlX2RldGFpbD1EYXRhIGVycmF0YQotCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9TGEgZGF0YSBkZXZlIGVzc2VyZSBkb3BvIGRpIHswfQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1MYSBkYXRhIGRldmUgZXNzZXJlIGRvcG8gZGkgezB9Ci0KLXdyb25nX2RhdGVfbm90X2FmdGVyPUxhIGRhdGEgZGV2ZSBlc3NlcmUgcHJpbWEgZGkgezB9Ci13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9TGEgZGF0YSBkZXZlIGVzc2VyZSBwcmltYSBkaSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9TGEgZGF0YSBub24gJmVncmF2ZTsgdWd1YWxlIGEgezB9Ci13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9TGEgZGF0YSBub24gJmVncmF2ZTsgdWd1YWxlIGEgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWY2YTlkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9Z2lyaWxlbiBkZVx1MDExZmVyIGZhcmtsXHUwMTMxDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1naXJpbGVuIGRlXHUwMTFmZXIgZmFya2xcdTAxMzENCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPWF5blx1MDEzMSBkZVx1MDExZmVyIGdpcmlsZW1leg0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPWF5blx1MDEzMSBkZVx1MDExZmVyIGdpcmlsZW1leg0KLQ0KLXdyb25nX2RhdGU9eWFubFx1MDEzMVx1MDE1ZiB0YXJpaA0KLXdyb25nX2RhdGVfZGV0YWlsPXlhbmxcdTAxMzFcdTAxNWYgdGFyaWgNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBzb25yYSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIHNvbnJhIG9sbWFsXHUwMTMxZFx1MDEzMXINCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIFx1MDBmNm5jZSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gXHUwMGY2bmNlIG9sbWFsXHUwMTMxZFx1MDEzMXINCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZSBlXHUwMTVmaXQgZGVcdTAxMWZpbA0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZSBlXHUwMTVmaXQgZGVcdTAxMWZpbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNzY1OWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgICAgIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZU5hbWUgPSBudWxsOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VOYW1lID0gc3VwZXIuZ2V0QmFzZU5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBiYXNlTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWNvcmRlci9Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlci5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcmVjb3JkZXIvQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0MGEwMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWNvcmRlci9Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnJlY29yZGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlci5Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyIGltcGxlbWVudHMgUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcg0KLXsNCi0gICAgcHVibGljIHZvaWQgcmVjb3JkVXNlcklucHV0KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgdmFsdWUpDQotICAgIHsNCi0gICAgICAgIGlmICghKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy90byBzdXBwb3J0IGxvY2FsIGNyb3NzLXZhbGlkYXRpb24gKHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkpDQotICAgICAgICBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZyA9IENyb3NzVmFsaWRhdGlvblV0aWxzDQotICAgICAgICAgICAgLmdldE9ySW5pdEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IGVudHJ5Ow0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBpZihwcm9wZXJ0eURldGFpbHMgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGVudHJ5ID0gbmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkoKTsNCi0gICAgICAgIGVudHJ5LnNldEJlYW4ocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSk7DQotICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh2YWx1ZSk7DQotICAgICAgICBlbnRyeS5zZXRDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgZW50cnkuc2V0Q2xpZW50SWQodWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKSk7DQotDQotICAgICAgICBTdHJpbmcga2V5ID0gcHJvcGVydHlEZXRhaWxzLmdldEtleSgpOw0KLQ0KLSAgICAgICAgLy9mb3IgbG9jYWwgY3Jvc3MtdmFsaWRhdGlvbg0KLSAgICAgICAgaWYgKGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLmNvbnRhaW5zS2V5KGtleSkgJiYNCi0gICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQoa2V5KS5nZXRCZWFuKCkgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICFrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQoa2V5KS5nZXRCZWFuKCkuZXF1YWxzKGVudHJ5LmdldEJlYW4oKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9mb3IgdGhlIHZhbGlkYXRpb24gd2l0aGluIGEgY29tcGxleCBjb21wb25lbnQgZS5nLiBhIHRhYmxlDQotICAgICAgICAgICAgLy9kb24ndCBvdmVycmlkZSBleGlzdGluZyBleHByZXNzaW9uIChzdHlsZTogI3tlbnRyeS5wcm9wZXJ0eX0pIC0gbWFrZSBhIHNwZWNpYWwgbWFwcGluZw0KLQ0KLSAgICAgICAgICAgIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4gZnVydGhlckVudHJpZXMgPQ0KLSAgICAgICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQoa2V5KS5nZXRGdXJ0aGVyRW50cmllcygpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmdXJ0aGVyRW50cmllcyA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZnVydGhlckVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+KCk7DQotDQotICAgICAgICAgICAgICAgIGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLmdldChrZXkpLnNldEZ1cnRoZXJFbnRyaWVzKGZ1cnRoZXJFbnRyaWVzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgZnVydGhlckVudHJpZXMuYWRkKGVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2ZvciBub3JtYWwgdmFsaWRhdGlvbg0KLSAgICAgICAgICAgIGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLnB1dChrZXksIGVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjMTU0NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIExpc3Q8UmVmZXJlbmNpbmdTdHJhdGVneT4gcmVmZXJlbmNpbmdTdHJhdGVnaWVzOw0KLSAgICBwcm90ZWN0ZWQgTWFwPE9iamVjdCwgT2JqZWN0PiB2aW9sYXRpb25SZXN1bHRTdG9yYWdlID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIGluaXRSZWZlcmVuY2luZ1N0cmF0ZWdpZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UmVmZXJlbmNpbmdTdHJhdGVnaWVzKCkNCi0gICAgew0KLSAgICAgICAgaWYgKHJlZmVyZW5jaW5nU3RyYXRlZ2llcyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcyA9IG5ldyBBcnJheUxpc3Q8UmVmZXJlbmNpbmdTdHJhdGVneT4oKTsNCi0NCi0gICAgICAgICAgICBTdHJpbmcgY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneUNsYXNzTmFtZSA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQkFTRV9QQUNLQUdFKSArICJSZWZlcmVuY2luZ1N0cmF0ZWd5IjsNCi0NCi0gICAgICAgICAgICBSZWZlcmVuY2luZ1N0cmF0ZWd5IGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kgPSAoUmVmZXJlbmNpbmdTdHJhdGVneSkgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneUNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IEVMQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgICAgIC8vcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgQWxpYXNDb21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgTG9jYWxDb21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9pbml0Q3Jvc3NWYWxpZGF0aW9uIGlzIGRvbmUgaW4gdGhlIENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXINCi0NCi0gICAgICAgIFN0cmluZ1tdIHZhbGlkYXRpb25UYXJnZXRzID0gZ2V0VmFsaWRhdGlvblRhcmdldHMoDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0IDogdmFsaWRhdGlvblRhcmdldHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCA9IHZhbGlkYXRpb25UYXJnZXQudHJpbSgpOw0KLQ0KLSAgICAgICAgICAgIC8vc2VsZWN0IHZhbGlkYXRpb24gbWV0aG9kDQotICAgICAgICAgICAgdHJ5VG9WYWxpZGF0ZShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsIHZhbGlkYXRpb25UYXJnZXQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBmb3IgKFJlZmVyZW5jaW5nU3RyYXRlZ3kgcmVmZXJlbmNpbmdTdHJhdGVneSA6IHJlZmVyZW5jaW5nU3RyYXRlZ2llcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAocmVmZXJlbmNpbmdTdHJhdGVneS5ldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLCB2YWxpZGF0aW9uVGFyZ2V0LCB0aGlzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlRocm93YWJsZUluc3RhbmNlTmV2ZXJUaHJvd24ifSkNCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlLA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWhhbmRsZVRhcmdldFZpb2xhdGlvbihlbnRyeU9mU291cmNlLCBlbnRyeU9mVGFyZ2V0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL25vIHRhcmdldCAtIGJlY2F1c2UgdGhlcmUgaXMgbm8gdGFyZ2V0IGNvbXBvbmVudCAtIHZhbHVlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbW9kZWwNCi0gICAgICAgICAgICBpZihlbnRyeU9mVGFyZ2V0ID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzVGFyZ2V0Q29tcG9uZW50QXNTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihlbnRyeU9mU291cmNlKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgLy9nZXQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIHRhcmdldCBjb21wb25lbnQNCi0gICAgICAgIFN0cmluZyBzdW1tYXJ5ID0gZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgdHJ1ZSk7DQotICAgICAgICBTdHJpbmcgZGV0YWlscyA9IGdldEVycm9yTWVzc2FnZURldGFpbChlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgdHJ1ZSk7DQotDQotICAgICAgICAvL3ZhbGlkYXRpb24gdGFyZ2V0IGlzbid0IGJvdW5kIHRvIGEgY29tcG9uZW50IHdpdGhpbmcgdGhlIGN1cnJlbnQgcGFnZSANCi0gICAgICAgIC8vKHNlZSB2YWxpZGF0ZUZvdW5kRW50cnksIHRyeVRvVmFsaWRhdGVMb2NhbGx5IGFuZCB0cnlUb1ZhbGlkYXRlQmluZGluZ09ubHkpDQotICAgICAgICBpZiAoZW50cnlPZlRhcmdldCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGVudHJ5T2ZUYXJnZXQgPSBlbnRyeU9mU291cmNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlIG1lc3NhZ2U7DQotICAgICAgICBpZiAoZW50cnlPZlRhcmdldC5nZXRNZXRhRGF0YUVudHJ5KCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXNzYWdlID0gZ2V0VGFyZ2V0Q29tcG9uZW50RXJyb3JNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICBlbnRyeU9mVGFyZ2V0LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9UT0RPIGRvY3VtZW50IHBvc3NpYmxlIHNpZGUgZWZmZWN0cw0KLSAgICAgICAgICAgIC8vZHVlIHRvIGEgbWlzc2luZyB0YXJnZXQgYW5ub3RhdGlvbiAoc2VlOiB0cnlUb1ZhbGlkYXRlTG9jYWxseSkNCi0gICAgICAgICAgICBtZXNzYWdlID0gZ2V0VGFyZ2V0Q29tcG9uZW50RXJyb3JNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoKG1lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgfHwgbWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKSAmJg0KLSAgICAgICAgICAgIGVudHJ5T2ZTb3VyY2UuZ2V0Q2xpZW50SWQoKSAhPSBudWxsICYmICFlbnRyeU9mU291cmNlLmdldENsaWVudElkKCkuZXF1YWxzKGVudHJ5T2ZUYXJnZXQuZ2V0Q2xpZW50SWQoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiA9IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24obWVzc2FnZSk7DQotDQotICAgICAgICAgICAgaWYoRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgICAgICBlbnRyeU9mVGFyZ2V0LmdldENvbXBvbmVudCgpLCBlbnRyeU9mVGFyZ2V0LmdldE1ldGFEYXRhRW50cnkoKSwNCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5T2ZUYXJnZXQuZ2V0Q29udmVydGVkT2JqZWN0KCksIHZhbGlkYXRvckV4Y2VwdGlvbiwgdGhpcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQuYWRkTWVzc2FnZShlbnRyeU9mVGFyZ2V0LmdldENsaWVudElkKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29udmVydEZhY2VzTWVzc2FnZSh2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NUYXJnZXRDb21wb25lbnRBc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlKQ0KLSAgICB7DQotICAgICAgICAvL2dldCB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQNCi0gICAgICAgIFN0cmluZyBzdW1tYXJ5ID0gZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpOw0KLSAgICAgICAgU3RyaW5nIGRldGFpbHMgPSBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsKGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlID0gZ2V0U291cmNlQ29tcG9uZW50RXJyb3JNZXNzYWdlKA0KLSAgICAgICAgICAgIGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCBzdW1tYXJ5LCBkZXRhaWxzKTsNCi0NCi0gICAgICAgIGlmIChtZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsIHx8IG1lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8NCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vVE9ETyBsb2dnaW5nDQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHJvY2Vzc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZiAoaGFuZGxlU291cmNlVmlvbGF0aW9uKGVudHJ5T2ZTb3VyY2UpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZ2V0IHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgICAgICAgIFN0cmluZyBzdW1tYXJ5ID0gZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgZmFsc2UpOw0KLSAgICAgICAgICAgIFN0cmluZyBkZXRhaWxzID0gZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCBmYWxzZSk7DQotDQotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIG1lc3NhZ2UgPSBnZXRTb3VyY2VDb21wb25lbnRFcnJvck1lc3NhZ2UoDQotICAgICAgICAgICAgICAgIGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCBzdW1tYXJ5LCBkZXRhaWxzKTsNCi0NCi0gICAgICAgICAgICBpZiAobWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCB8fCBtZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL1RPRE8NCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihtZXNzYWdlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvL2p1c3QgdGhyb3cgYSBuZXcgbWVzc2FnZSAtIHRoZSBlcnJvciBtZXNzYWdlIGlzIGF0IHRoZSB0YXJnZXQNCi0gICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24obmV3IEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgRmFjZXNNZXNzYWdlIGdldFNvdXJjZUNvbXBvbmVudEVycm9yTWVzc2FnZShBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEZhY2VzTWVzc2FnZSBnZXRUYXJnZXRDb21wb25lbnRFcnJvck1lc3NhZ2UoQW5ub3RhdGlvbiBmb3VuZEFubm90YXRpb24sIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHJlc29sdmVNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgU3RyaW5nIGtleSA9IGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgICAgICAgICAgcmV0dXJuIChrZXkgIT0gbnVsbCkgPyByZXNvbHZlTWVzc2FnZShrZXkgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCkgOiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBrZXkgIiArIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlVGFyZ2V0VmlvbGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlLA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW50cnlPZlRhcmdldCAhPSBudWxsICYmIGVudHJ5T2ZUYXJnZXQuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVTb3VyY2VWaW9sYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBoYW5kbGVUYXJnZXRWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBubyB0YXJnZXQgY29tcG9uZW50ICh2YWxpZGF0aW9uIGFnYWluc3QgdGhlIG1vZGVsKSAtPiBnZXQgcmV2ZXJzZSBtZXNzYWdlIGZvciBzb3VyY2UgY29tcG9uZW50DQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgLy9pZiB0aGUgbWVzc2FnZSBpcyBuZXV0cmFsDQotICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uLCB0cnVlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBubyB0YXJnZXQgY29tcG9uZW50ICh2YWxpZGF0aW9uIGFnYWluc3QgdGhlIG1vZGVsKSAtPiBnZXQgcmV2ZXJzZSBtZXNzYWdlIGZvciBzb3VyY2UgY29tcG9uZW50DQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICAvL2lmIHRoZSBtZXNzYWdlIGlzIG5ldXRyYWwNCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbiwgdHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogYWJzdHJhY3QgbWV0aG9kcw0KLSAgICAgKi8NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0NCi0gICAgLyoNCi0gICAgICogaW1wbGVtZW50cyB0aGUgc3BlY2lmaWMgdmFsaWRhdGlvbiBsb2dpYw0KLSAgICAgKi8NCi0NCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLCBBbm5vdGF0aW9uIGFubm90YXRpb24pOw0KLQ0KLSAgICAvKg0KLSAgICAgKiByZXR1cm5zIHRoZSByZWZlcmVuY2VkIHZhbGlkYXRpb24gdGFyZ2V0cyBvZiB0aGUgYW5ub3RhdGlvbg0KLSAgICAgKiBlLmcuIEBEYXRlSXModHlwZSA9IERhdGVJc1R5cGUuYmVmb3JlLCB2YWx1ZSA9ICJmaW5hbEV4YW0iKQ0KLSAgICAgKiAtPiBtZXRob2QgcmV0dXJucyBhbiBhcnJheSB3aXRoIG9uZSB2YWx1ZSAoImZpbmFsRXhhbSIpDQotICAgICAqLw0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWM4MWJiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMNCi0gICAgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIC8vaW5pdCBjcm9zcy12YWxpZGF0aW9uDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkgPQ0KLSAgICAgICAgICAgIGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpLmFkZChlbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkgPSBuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KCk7DQotDQotICAgICAgICBlbnRyeS5zZXRNZXRhRGF0YUVudHJ5KG1ldGFEYXRhRW50cnkpOw0KLSAgICAgICAgZW50cnkuc2V0Q29tcG9uZW50KHVpQ29tcG9uZW50KTsNCi0gICAgICAgIGVudHJ5LnNldENsaWVudElkKHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCkpOw0KLSAgICAgICAgZW50cnkuc2V0Q29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICBlbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3kodGhpcyk7DQotDQotICAgICAgICByZXR1cm4gZW50cnk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IGF2YWlsYWJsZSBmb3IgY3Jvc3MgdmFsaWRhdGlvbiAtIHVzZSBwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbiIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldExhYmVsKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vdCBhdmFpbGFibGUgZm9yIGNyb3NzIHZhbGlkYXRpb24iKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgLy9ub3QgYXZhaWxhYmxlIGZvciBjcm9zcyB2YWxpZGF0aW9uIC0gdXNlIGluaXRDcm9zc1ZhbGlkYXRpb24NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q3Jvc3NWYWxpZGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCksDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwgdmFsaWRhdG9yRXhjZXB0aW9uLCB0aGlzKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25IZWxwZXIuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjkwODllLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneShBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSwNCi0gICAgICAgICAgICBib29sZWFuIGlzTW9kZWxBd2FyZVZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChjb21wYXJlU3RyYXRlZ3kuaXNWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCksDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vcHJvY2VzcyBhZnRlciB2aW9sYXRpb24NCi0gICAgICAgICAgICAvL2p1c3QgYWRkIG1lc3NhZ2VzDQotICAgICAgICAgICAgaWYoIWlzTW9kZWxBd2FyZVZhbGlkYXRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzVGFyZ2V0QWZ0ZXJDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NUYXJnZXRBZnRlck1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvL3Rob3cgZXhjZXB0aW9uDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc1RhcmdldEFmdGVyQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgc291cmNlQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5ID0gbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgpOw0KLQ0KLSAgICAgICAgaWYgKGNvbXBhcmVTdHJhdGVneS51c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb21wb25lbnQodmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q2xpZW50SWQodmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENsaWVudElkKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb21wb25lbnQoc291cmNlQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q2xpZW50SWQoc291cmNlQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENsaWVudElkKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbnZlcnRlZE9iamVjdCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSk7DQotICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0VmFsaWRhdGlvblN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSk7DQotDQotICAgICAgICAvL2FkZCBtZXNzYWdlDQotICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICBzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzVGFyZ2V0QWZ0ZXJNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICAvL25vIHRhcmdldCAtIGJlY2F1c2UgdGhlcmUgaXMgbm8gdGFyZ2V0IGNvbXBvbmVudCAtIHZhbHVlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbW9kZWwNCi0gICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBudWxsKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM3ZDg3Mi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgIHZvaWQgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSkNCi0gICAgICAgICAgICB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRGF0ZUlzU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMyZmE3MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRGF0ZUlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXNUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEYXRlSXNTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUT09fRUFSTFkgPSAiZWFybHkiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUT09fTEFURSA9ICJsYXRlIjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UX0VRVUFMX0RBVEVfVElNRSA9ICJub3QgZXF1YWwiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfS0VZID0gInJlc3VsdCI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBUkVEX1ZBTFVFX0tFWSA9ICJ0YXJnZXQgdmFsdWUiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVZFUlNFX0NPTVBBUkVEX1ZBTFVFX0tFWSA9ICJyZXZlcnNlIHRhcmdldCB2YWx1ZSI7DQotDQotICAgIHB1YmxpYyBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIC8vVE9ETyB0ZXN0ICYgcmVtb3ZlDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVTb3VyY2VWaW9sYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiB2aW9sYXRpb25Gb3VuZDsNCi0NCi0gICAgICAgIGlmICgoKERhdGVJcykgYW5ub3RhdGlvbikudHlwZSgpLmVxdWFscyhEYXRlSXNUeXBlLnNhbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsICYmICFvYmplY3QxLmVxdWFscyhvYmplY3QyKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFU1VMVF9LRVksIE5PVF9FUVVBTF9EQVRFX1RJTUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKCgoRGF0ZUlzKSBhbm5vdGF0aW9uKS50eXBlKCkuZXF1YWxzKERhdGVJc1R5cGUuYmVmb3JlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IG9iamVjdDEgIT0gbnVsbCAmJiBvYmplY3QyICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFuZXcgRGF0ZSgoKERhdGUpIG9iamVjdDEpLmdldFRpbWUoKSkuYmVmb3JlKChEYXRlKSBvYmplY3QyKSB8fCBvYmplY3QxLmVxdWFscyhvYmplY3QyKSk7DQotDQotICAgICAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVNVTFRfS0VZLCBUT09fTEFURSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsICYmIG9iamVjdDIgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW5ldyBEYXRlKCgoRGF0ZSkgb2JqZWN0MSkuZ2V0VGltZSgpKS5hZnRlcigoRGF0ZSkgb2JqZWN0MikgfHwgb2JqZWN0MS5lcXVhbHMob2JqZWN0MikpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVTVUxUX0tFWSwgVE9PX0VBUkxZKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChDT01QQVJFRF9WQUxVRV9LRVksIG9iamVjdDEpOw0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVWRVJTRV9DT01QQVJFRF9WQUxVRV9LRVksIG9iamVjdDIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZpb2xhdGlvbkZvdW5kOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKERhdGVJcykgYW5ub3RhdGlvbikudmFsdWVPZigpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHByb3RlY3RlZA0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZykgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLmdldChSRVNVTFRfS0VZKTsNCi0NCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gcmV2ZXJzZVJlc3VsdChyZXN1bHQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKFRPT19FQVJMWS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0Tm90QWZ0ZXJFcnJvck1zZ0tleSgoRGF0ZUlzKSBhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKFRPT19MQVRFLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROb3RCZWZvcmVFcnJvck1zZ0tleSgoRGF0ZUlzKSBhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0Tm90RXF1YWxFcnJvck1zZ0tleSgoRGF0ZUlzKSBhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyByZXZlcnNlUmVzdWx0KFN0cmluZyByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIGlmIChUT09fRUFSTFkuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIFRPT19MQVRFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBUT09fRUFSTFk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpLCBhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBrZXkgIiArIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgZmFsc2UpLCBhbm5vdGF0aW9uLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGZhbHNlKQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgYW5ub3RhdGlvbiwgZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBrZXkgIiArIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGtleSwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHJlc29sdmVNZXNzYWdlKGtleSk7DQotDQotICAgICAgICBEYXRlRm9ybWF0IGRhdGVGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSgoKERhdGVJcykgYW5ub3RhdGlvbikuZXJyb3JNZXNzYWdlRGF0ZVN0eWxlKCksDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlc3VsdDsNCi0NCi0gICAgICAgIGlmKGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IG1lc3NhZ2UucmVwbGFjZSgiezB9IiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0LmZvcm1hdCgoRGF0ZSkgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLmdldChDT01QQVJFRF9WQUxVRV9LRVkpKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQuZm9ybWF0KChEYXRlKSB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UuZ2V0KFJFVkVSU0VfQ09NUEFSRURfVkFMVUVfS0VZKSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9yZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBvdGhlciBjb21wb25lbnQNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogcHJpdmF0ZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90QWZ0ZXJFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RBZnRlckVycm9yTXNnS2V5KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXROb3RCZWZvcmVFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RCZWZvcmVFcnJvck1zZ0tleSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90RXF1YWxFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RFcXVhbEVycm9yTXNnS2V5KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRUxDb21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg0NmEyNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLlByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiByZWZlcmVuY2luZyB2YWxpZGF0aW9uIHRhcmdldHMgLSBwb3NzaWJsZSBmb3JtYXRzOg0KLSAqICIje1tiZWFuX25hbWVdLltwcm9wZXJ0eV9uYW1lXX0iIC4uLiBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbiB3aXRoIHZhbHVlIGJpbmRpbmcNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRUxDb21wYXJlU3RyYXRlZ3kgaW1wbGVtZW50cyBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LCBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZCh2YWxpZGF0aW9uVGFyZ2V0KSAmJg0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZhbGlkYXRpb25UYXJnZXQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvVmFsaWRhdGVWYWx1ZUJpbmRpbmcoDQotICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgICAgICAgICBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWxpZGF0aW9uVGFyZ2V0KSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwgY29tcGFyZVN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAidGVzdCIpDQotICAgIHByb3RlY3RlZCBib29sZWFuIHRyeVRvVmFsaWRhdGVWYWx1ZUJpbmRpbmcoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkgPQ0KLSAgICAgICAgICAgICAgICByZXNvbHZlVGFyZ2V0Rm9yQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldCk7DQotDQotICAgICAgICBpZih2YWxpZGF0aW9uVGFyZ2V0RW50cnkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSByZXNvbHZlVGFyZ2V0Rm9yQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWxpZGF0aW9uVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcgPQ0KLSAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpOw0KLQ0KLSAgICAgICAgcmV0dXJuIENyb3NzVmFsaWRhdGlvblV0aWxzLnJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgICAgIGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZywNCi0gICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuY29udmVydFZhbHVlQmluZGluZ0V4cHJlc3Npb25Ub1Byb2Nlc3NlZEluZm9ybWF0aW9uS2V5KHZhbGlkYXRpb25UYXJnZXQpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbGlkYXRpb25UYXJnZXQpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBPYmplY3QgdGFyZ2V0VmFsdWUgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFZhbHVlT2ZFeHByZXNzaW9uKGZhY2VzQ29udGV4dCwgdmFsaWRhdGlvblRhcmdldCk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHRhcmdldEVudHJ5ID0gbmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkoKTsNCi0gICAgICAgIHRhcmdldEVudHJ5LnNldEJlYW4oDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWxpZGF0aW9uVGFyZ2V0LmdldEJhc2VFeHByZXNzaW9uKCkpKTsNCi0gICAgICAgIHRhcmdldEVudHJ5LnNldENvbnZlcnRlZFZhbHVlKHRhcmdldFZhbHVlKTsNCi0NCi0gICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneShjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0RW50cnksIHRydWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VxdWFsc1N0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FcXVhbHNTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjFlNGJhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VxdWFsc1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXF1YWxzU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneQ0KLXsNCi0gICAgcHVibGljIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChFcXVhbHMpIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gb2JqZWN0MSAhPSBudWxsICYmICFvYmplY3QxLmVxdWFscyhvYmplY3QyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChFcXVhbHMpIGFubm90YXRpb24pLnZhbHVlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxDb21wYXJlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOGQ5OGMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxDb21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi0NCi0vKioNCi0gKiAiW3Byb3BlcnR5X25hbWVdIiAuLi4gbG9jYWwgdmFsaWRhdGlvbiAtPiBjcm9zcy1jb21wb25lbnQsIGJ1dCBubyBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBMb2NhbENvbXBhcmVTdHJhdGVneSBpbXBsZW1lbnRzIFJlZmVyZW5jaW5nU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblRhcmdldC5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5IHdpbGwgY29udGludWUNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ5VG9WYWxpZGF0ZUxvY2FsbHkoDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXksDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcgPQ0KLSAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpOw0KLQ0KLSAgICAgICAgYm9vbGVhbiBpc01vZGVsQXdhcmVWYWxpZGF0aW9uID0NCi0gICAgICAgICAgICAgICAgaXNNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHRhcmdldFByb3BlcnR5ID0gdGFyZ2V0S2V5Ow0KLQ0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUtleSA9IHJlc29sdmVTb3VyY2VLZXkoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIHRhcmdldEtleSA9IHNvdXJjZUtleS5zdWJzdHJpbmcoMCwgc291cmNlS2V5Lmxhc3RJbmRleE9mKCIuIikgKyAxKSArIHRhcmdldEtleTsNCi0NCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5ID0gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMucmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFbnRyeSgNCi0gICAgICAgICAgICAgICAga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLCB0YXJnZXRLZXksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotDQotICAgICAgICBpZiAodmFsaWRhdGlvblRhcmdldEVudHJ5ICE9IG51bGwgJiYgdmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENvbXBvbmVudCgpICE9IG51bGwgJiYgIWlzTW9kZWxBd2FyZVZhbGlkYXRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vbm8gdGFyZ2V0IC0gYmVjYXVzZSB0aGVyZSBpcyBubyB0YXJnZXQgY29tcG9uZW50IC0gdmFsdWUgd2FzIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBtb2RlbA0KLSAgICAgICAgZWxzZSBpZihpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdW5zdXBwb3J0ZWRDYXNlKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZVRhcmdldEtleShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBTdHJpbmcgdGFyZ2V0S2V5KQ0KLSAgICB7DQotICAgICAgICAvL25vIHJlYWwgdmFsdWUgYmluZGluZyBleHByZXNzaW9uDQotICAgICAgICAvL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24ganVzdCBoZXBscyB0byByZXBsYWNlIHRoZSBwcm9wZXJ0eSBvZiB0aGUga2V5DQotICAgICAgICAvL2hlcmUgb25seSBkb3Qtbm90YXRpb24gaXMgYWxsb3dlZCAtPiBubyBwcm9ibGVtDQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGJhc2VFeHByZXNzaW9uID0NCi0gICAgICAgICAgICBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3siICsgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywNCi0gICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGV0YWlscy5jbGFzcykuZ2V0S2V5KCkgKyAifSIpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZU9yQWRkUHJvcGVydHkoYmFzZUV4cHJlc3Npb24sIHRhcmdldEtleSkNCi0gICAgICAgICAgICAuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC5zdWJzdHJpbmcoMiwgcmVzdWx0Lmxlbmd0aCgpIC0xKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlT2ZQcm9wZXJ0eShPYmplY3QgYmFzZSwgU3RyaW5nIHByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnR5LnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSwgcHJvcGVydHkubGVuZ3RoKCkpOw0KLSAgICAgICAgTWV0aG9kIHRhcmdldE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZChiYXNlLmdldENsYXNzKCksICJnZXQiICsgcHJvcGVydHkpOw0KLQ0KLSAgICAgICAgaWYodGFyZ2V0TWV0aG9kID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKGJhc2UuZ2V0Q2xhc3MoKSwgImlzIiArIHByb3BlcnR5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICJjbGFzcyAiICsgYmFzZS5nZXRDbGFzcygpICsgIiBoYXMgbm8gcHVibGljIGdldC9pcyAiICsgcHJvcGVydHkudG9Mb3dlckNhc2UoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKGJhc2UsIHRhcmdldE1ldGhvZCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZywNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0S2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbmV3S2V5ID0gY3JlYXRlVGFyZ2V0S2V5KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIHJldHVybiAha2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLmNvbnRhaW5zS2V5KG5ld0tleSk7DQotDQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZVNvdXJjZUtleShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIFN0cmluZyBzb3VyY2VLZXkgPSBwcm9wZXJ0eURldGFpbHMuZ2V0S2V5KCk7DQotDQotICAgICAgICBpZighc291cmNlS2V5LmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic291cmNlIHBhdGg6ICIgKyBzb3VyY2VLZXkgKyAiIGludmFsaWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzb3VyY2VLZXk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHVuc3VwcG9ydGVkQ2FzZShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGNvbnZlcnRlZCBvYmplY3QgZm9yICIgKyAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpLmdldEtleSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSkNCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHRhcmdldEVudHJ5ID0gbmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkoKTsNCi0NCi0gICAgICAgIHRhcmdldEVudHJ5LnNldEJlYW4oDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKS5nZXRCYXNlT2JqZWN0KCkpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkNCi0gICAgICAgICAgICAgICAgLnNldENvbnZlcnRlZFZhbHVlKGdldFZhbHVlT2ZQcm9wZXJ0eSh0YXJnZXRFbnRyeS5nZXRCZWFuKCksIHRhcmdldFByb3BlcnR5KSk7DQotDQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEVudHJ5LCB0cnVlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTM1MmExLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogIltsb2NhbF9wcm9wZXJ0eS5wcm9wZXJ0eTEucHJvcGVydHkyXSINCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5IGV4dGVuZHMgTG9jYWxDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LCBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKCF2YWxpZGF0aW9uVGFyZ2V0LmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9ub3Qgc3VwcG9ydGVkIC0gVE9ETyBhZGQgbG9nZ2luZw0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnlUb1ZhbGlkYXRlTG9jYWxseSgNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcgPQ0KLSAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpOw0KLQ0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IGNyZWF0ZVRhcmdldEtleShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEtleSk7DQotDQotICAgICAgICBpZiAoa2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLmNvbnRhaW5zS2V5KG5ld0tleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkgPSBrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcuZ2V0KG5ld0tleSk7DQotDQotICAgICAgICAgICAgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vbm8gdGFyZ2V0IC0gYmVjYXVzZSB0aGVyZSBpcyBubyB0YXJnZXQgY29tcG9uZW50IC0gdmFsdWUgd2FzIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBtb2RlbA0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRLZXkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB0YXJnZXRJbmZvcm1hdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LmlzVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgIHRhcmdldEluZm9ybWF0aW9uRW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSA9IG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoKTsNCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29tcG9uZW50KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENsaWVudElkKHRhcmdldEluZm9ybWF0aW9uRW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbnZlcnRlZE9iamVjdCh0YXJnZXRJbmZvcm1hdGlvbkVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCkpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAvL3Byb2Nlc3MgYWZ0ZXIgdmlvbGF0aW9uDQotICAgICAgICAgICAgLy9qdXN0IGFkZCBtZXNzYWdlcw0KLSAgICAgICAgICAgIGlmKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBudWxsKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy90aG93IGV4Y2VwdGlvbg0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFN0cmluZyB0YXJnZXRLZXkpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBPYmplY3QgbmV3QmFzZSA9IFJlZmxlY3Rpb25VdGlscw0KLSAgICAgICAgICAgIC5nZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCksIHRhcmdldEtleSk7DQotDQotICAgICAgICBpZih0YXJnZXRLZXkuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2ZpbmQgdGhlIGxhc3QgcHJvcGVydHkNCi0gICAgICAgICAgICB0YXJnZXRLZXkgPSB0YXJnZXRLZXkuc3Vic3RyaW5nKHRhcmdldEtleS5sYXN0SW5kZXhPZigiLiIpICsgMSwgdGFyZ2V0S2V5Lmxlbmd0aCgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXRWYWx1ZSA9IGdldFZhbHVlT2ZQcm9wZXJ0eShuZXdCYXNlLCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB0YXJnZXRFbnRyeSA9IG5ldyBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5KCk7DQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRCZWFuKG5ld0Jhc2UpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0Q29udmVydGVkVmFsdWUodGFyZ2V0VmFsdWUpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRFbnRyeSwgdHJ1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L05vdEVxdWFsc1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMTVlMjAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uTm90RXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBOb3RFcXVhbHNTdHJhdGVneSBleHRlbmRzIEVxdWFsc1N0cmF0ZWd5DQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChOb3RFcXVhbHMpIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsDQotICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIXN1cGVyLmlzVmlvbGF0aW9uKG9iamVjdDEsIG9iamVjdDIsIGFubm90YXRpb24pOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChOb3RFcXVhbHMpIGFubm90YXRpb24pLnZhbHVlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVmZXJlbmNpbmdTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVmZXJlbmNpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDZkM2ZhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlZmVyZW5jaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJbnRlcm5hbCBpbnRlcmZhY2UgdG8gYWxsb3cgbXVsdGlwbGUgcmVmZXJlbmNpbmcgc3RyYXRlZ2llcyBmb3IgY3Jvc3MgY29tcG9uZW50IHZhbGlkYXRpb24uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWludGVyZmFjZSBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgYWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlcXVpcmVkSWZTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDA1YTVmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlcXVpcmVkSWZTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRJZlN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VGYWNlc0J1bmRsZSA9IGZhbHNlOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHN1cGVyLnJlc29sdmVNZXNzYWdlKGtleSk7DQotICAgICAgICBTdHJpbmcgbWFya2VyID0gQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVI7DQotDQotICAgICAgICBpZigobWFya2VyICsga2V5ICsgbWFya2VyKS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnVzZUZhY2VzQnVuZGxlID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChSZXF1aXJlZElmKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiB2aW9sYXRpb25Gb3VuZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgaWYgKCgoUmVxdWlyZWRJZikgYW5ub3RhdGlvbikuaXMoKS5lcXVhbHMoUmVxdWlyZWRJZlR5cGUuZW1wdHkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gKG9iamVjdDIgPT0gbnVsbCB8fCBvYmplY3QyLmVxdWFscygiIikpICYmIChvYmplY3QxID09IG51bGwgfHwgb2JqZWN0MS5lcXVhbHMoIiIpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKCgoUmVxdWlyZWRJZikgYW5ub3RhdGlvbikuaXMoKS5lcXVhbHMoUmVxdWlyZWRJZlR5cGUubm90X2VtcHR5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IChvYmplY3QyICE9IG51bGwgJiYgIW9iamVjdDIuZXF1YWxzKCIiKSkgJiYgKG9iamVjdDEgPT0gbnVsbCB8fCBvYmplY3QxLmVxdWFscygiIikpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZpb2xhdGlvbkZvdW5kOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKFJlcXVpcmVkSWYpIGFubm90YXRpb24pLnZhbHVlT2YoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy51c2VGYWNlc0J1bmRsZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5yZXBsYWNlV2l0aERlZmF1bHRSZXF1aXJlZE1lc3NhZ2UodmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRvckV4Y2VwdGlvbik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkOTkyOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1qYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW49b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuQmFzaWM9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuSWQ9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmU9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQzYzNhZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENST1NTX1ZBTElEQVRJT05fU1RPUkFHRV9LRVkgPSBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7DQotDQotICAgICAgICBpZiAoIXJlcXVlc3RNYXAuY29udGFpbnNLZXkoQ1JPU1NfVkFMSURBVElPTl9TVE9SQUdFX0tFWSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKENyb3NzVmFsaWRhdGlvblN0b3JhZ2UpIHJlcXVlc3RNYXAuZ2V0KENST1NTX1ZBTElEQVRJT05fU1RPUkFHRV9LRVkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQNCi0gICAgICAgICAgICAgICAgLmdldEN1cnJlbnRJbnN0YW5jZSgpDQotICAgICAgICAgICAgICAgIC5nZXRFeHRlcm5hbENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgICAgIC5wdXQoQ1JPU1NfVkFMSURBVElPTl9TVE9SQUdFX0tFWSwgbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RPX0NPTlZFUlRFRF9WQUxVRV9NQVBQSU5HX0tFWSA9IENyb3NzVmFsaWRhdGlvblV0aWxzLmNsYXNzLmdldE5hbWUoKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBnZXRPckluaXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIGlmICghcmVxdWVzdE1hcC5jb250YWluc0tleShLRVlfVE9fQ09OVkVSVEVEX1ZBTFVFX01BUFBJTkdfS0VZKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNldEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+KSByZXF1ZXN0TWFwLmdldChLRVlfVE9fQ09OVkVSVEVEX1ZBTFVFX01BUFBJTkdfS0VZKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkNCi0gICAgICAgICAgICAucHV0KEtFWV9UT19DT05WRVJURURfVkFMVUVfTUFQUElOR19LRVksIG5ldyBIYXNoTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4oKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4ga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcsDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSwgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5ID0NCi0gICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQodGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIC8vdmFsdWUgbm90IHN1Ym1pdHRlZCBhdCB0aGlzIHJlcXVlc3QgLSB1c2UgbW9kZWwgdmFsdWUgKHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbW9kZWwpDQotICAgICAgICBpZihwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICAvL3NpbXBsZSBjYXNlDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5nZXRGdXJ0aGVyRW50cmllcygpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXRCZWFuID0gcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKTsNCi0NCi0gICAgICAgIC8vcHJvY2VzcyBjb21wbGV4IGNvbXBvbmVudCBlbnRyaWVzIChlLmcuIGEgdGFibGUpDQotICAgICAgICAvL3N1cHBvcnRlZDogY3Jvc3MtY29tcG9uZW50IGJ1dCBubyBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbiAoPSBsb2NhbGUgdmFsaWRhdGlvbikNCi0gICAgICAgIGlmIChwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEJlYW4oKS5lcXVhbHModGFyZ2V0QmVhbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotICAgICAgICB9DQotDQotICAgICAgICBmb3IgKFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgZW50cnkgOiBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEZ1cnRoZXJFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LmdldEJlYW4oKS5lcXVhbHModGFyZ2V0QmVhbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInN1cHBvcnQgZm9yIG1hcCBzeW50YXgiKQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VmFsdWVCaW5kaW5nRXhwcmVzc2lvblRvUHJvY2Vzc2VkSW5mb3JtYXRpb25LZXkoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YmUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YmUuZ2V0RXhwcmVzc2lvblN0cmluZygpLnJlcGxhY2UoIiN7IiwgIiIpLnJlcGxhY2UoIn0iLCAiIik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzM5MjU1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBQcm9wZXJ0eSBWYWxpZGF0aW9uIE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFByb3BlcnR5IFZhbGlkYXRpb24gTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgUHJvcGVydHkgVmFsaWRhdGlvbiBwcm92aWRlcyBhbm5vdGF0aW9uIGJhc2VkIHZhbGlkYXRpb24gZm9yIGJlYW4gcHJvcGVydGllcy4NCi0gICAgSXQgYWxzbyBwcm92aWRlcyBKUEEgMS4wIGJhc2VkIHZhbGlkYXRpb24gU3VwcG9ydC4NCi0gIA0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS4xLnggYW5kIEpTRiAxLjIueC4gQm90aCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM5NWZlNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L0Fic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7Ci1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUlucHV0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkV4dFZhbFN0YXJ0dXBMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jcm9zc3ZhbC5Nb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC51dGlsLlRlc3RVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuc2hhcmVkX2ltcGwuY29uZmlnLk15ZmFjZXNDb25maWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0FwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tFeHRlcm5hbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0ZhY2VzQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrRmFjZXNDb250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tIdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tIdHRwU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrTGlmZWN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tMaWZlY3ljbGVGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tSZW5kZXJLaXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1Jlc3BvbnNlV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tTZXJ2bGV0Q29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tTZXJ2bGV0Q29udGV4dDsKLQotLyoqCi0gKiBBYnN0cmFjdCBTaGFsZSBUZXN0IGJhc2UgY2xhc3MsIHdoaWNoIHNldHMgdXAgdGhlIEpTRiBlbnZpcm9ubWVudC4gIElmIHRoZSB0ZXN0Ci0gKiBvdmVycmlkZXMgPGNvZGU+c2V0VXAoKTwvY29kZT4gYW5kL29yIDxjb2RlPnRlYXJEb3duKCk8L2NvZGU+LCB0aGVuIHRob3NlCi0gKiBtZXRob2RzIGJ1dCBjYWxsIHRoZSBvdmVyd2l0dGVuIG1ldGhvZCB0byBpbnN1cmUgYSB2YWxpZCB0ZXN0IGVudmlyb25tZW50LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHByb3RlY3RlZCBNb2NrQXBwbGljYXRpb24gYXBwbGljYXRpb247Ci0gICAgcHJvdGVjdGVkIE1vY2tTZXJ2bGV0Q29uZmlnIGNvbmZpZzsKLSAgICBwcm90ZWN0ZWQgTW9ja0V4dGVybmFsQ29udGV4dCBleHRlcm5hbENvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIE1vY2tGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0OwotICAgIHByb3RlY3RlZCBNb2NrRmFjZXNDb250ZXh0RmFjdG9yeSBmYWNlc0NvbnRleHRGYWN0b3J5OwotICAgIHByb3RlY3RlZCBNb2NrTGlmZWN5Y2xlIGxpZmVjeWNsZTsKLSAgICBwcm90ZWN0ZWQgTW9ja0xpZmVjeWNsZUZhY3RvcnkgbGlmZWN5Y2xlRmFjdG9yeTsKLSAgICBwcm90ZWN0ZWQgUmVuZGVyS2l0IHJlbmRlcktpdDsKLSAgICBwcm90ZWN0ZWQgTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0OwotICAgIHByb3RlY3RlZCBNb2NrSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZTsKLSAgICBwcm90ZWN0ZWQgTW9ja1NlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0OwotICAgIHByb3RlY3RlZCBNb2NrSHR0cFNlc3Npb24gc2Vzc2lvbjsKLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIHRocmVhZENvbnRleHRDbGFzc0xvYWRlcjsKLSAgICAgICAgCi0gICAgLyoqIFJlc3BvbnNlIFdyaXRlciAqLwotICAgIHByaXZhdGUgTW9ja1Jlc3BvbnNlV3JpdGVyIHdyaXRlcjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0LgotICAgICAqLwotICAgIHB1YmxpYyBBYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgICAgICBhcHBsaWNhdGlvbiA9IG51bGw7Ci0gICAgICAgIGNvbmZpZyA9IG51bGw7Ci0gICAgICAgIGV4dGVybmFsQ29udGV4dCA9IG51bGw7Ci0gICAgICAgIGZhY2VzQ29udGV4dCA9IG51bGw7Ci0gICAgICAgIGZhY2VzQ29udGV4dEZhY3RvcnkgPSBudWxsOwotICAgICAgICBsaWZlY3ljbGUgPSBudWxsOwotICAgICAgICBsaWZlY3ljbGVGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgcmVuZGVyS2l0ID0gbnVsbDsKLSAgICAgICAgcmVxdWVzdCA9IG51bGw7Ci0gICAgICAgIHJlc3BvbnNlID0gbnVsbDsKLSAgICAgICAgc2VydmxldENvbnRleHQgPSBudWxsOwotICAgICAgICBzZXNzaW9uID0gbnVsbDsKLSAgICAgICAgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgU2V0dXAgdGhlIHRlc3QgZW52aXJvbm1lbnQsIGluY2x1ZGluZyB0aGUgZm9sbG93aW5nOgotICAgICAqICA8dWw+Ci0gICAgICogIDxsaT5TZXQgdGhlIEFwcGxpY2F0aW9uIE1hcC48L2xpPgotICAgICAqICA8bGk+U2V0IGEgcmVzcG9uc2Ugd3JpdGVyPC9saT4KLSAgICAgKiAgPGxpPkFkZCBUb21haGF3aydzIHJlbmRlcmVycyB0byB0aGUgZmFjZXMgY29udGV4dC48L2xpPgotICAgICAqICA8L3VsPiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRocmVhZENvbnRleHRDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKG5ldyBVUkxDbGFzc0xvYWRlcihuZXcgVVJMWzBdLCBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpKTsKLSAgICAgICAgc2VydmxldENvbnRleHQgPSBuZXcgTW9ja1NlcnZsZXRDb250ZXh0KCk7Ci0gICAgICAgIC8vZm9yIHRlc3RpbmcgdGhlIGZhbGxiYWNrCi0gICAgICAgIC8vc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihFeHRWYWxJbmZvcm1hdGlvbi5XRUJYTUxfUEFSQU1fUFJFRklYICsgIi5ERUFDVElWQVRFX0VMX1JFU09MVkVSIiwgInRydWUiKTsKLSAgICAgICAgc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihFeHRWYWxJbmZvcm1hdGlvbi5XRUJYTUxfUEFSQU1fUFJFRklYICsgIi5DVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZIiwgTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgY29uZmlnID0gbmV3IE1vY2tTZXJ2bGV0Q29uZmlnKHNlcnZsZXRDb250ZXh0KTsKLSAgICAgICAgc2Vzc2lvbiA9IG5ldyBNb2NrSHR0cFNlc3Npb24oKTsKLSAgICAgICAgc2Vzc2lvbi5zZXRTZXJ2bGV0Q29udGV4dChzZXJ2bGV0Q29udGV4dCk7Ci0gICAgICAgIHJlcXVlc3QgPSBuZXcgTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdChzZXNzaW9uKTsKLSAgICAgICAgcmVxdWVzdC5zZXRTZXJ2bGV0Q29udGV4dChzZXJ2bGV0Q29udGV4dCk7Ci0gICAgICAgIHJlc3BvbnNlID0gbmV3IE1vY2tIdHRwU2VydmxldFJlc3BvbnNlKCk7Ci0gICAgICAgIEZhY3RvcnlGaW5kZXIucmVsZWFzZUZhY3RvcmllcygpOwotICAgICAgICBGYWN0b3J5RmluZGVyLnNldEZhY3RvcnkoImphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeSIsICJvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb25GYWN0b3J5Iik7Ci0gICAgICAgIEZhY3RvcnlGaW5kZXIuc2V0RmFjdG9yeSgiamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHRGYWN0b3J5IiwgIm9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tGYWNlc0NvbnRleHRGYWN0b3J5Iik7Ci0gICAgICAgIEZhY3RvcnlGaW5kZXIuc2V0RmFjdG9yeSgiamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZUZhY3RvcnkiLCAib3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0xpZmVjeWNsZUZhY3RvcnkiKTsKLSAgICAgICAgRmFjdG9yeUZpbmRlci5zZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeSIsICJvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrUmVuZGVyS2l0RmFjdG9yeSIpOwotICAgICAgICBleHRlcm5hbENvbnRleHQgPSBuZXcgTW9ja0V4dGVybmFsQ29udGV4dChzZXJ2bGV0Q29udGV4dCwgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICBsaWZlY3ljbGVGYWN0b3J5ID0gKE1vY2tMaWZlY3ljbGVGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZUZhY3RvcnkiKTsKLSAgICAgICAgbGlmZWN5Y2xlID0gKE1vY2tMaWZlY3ljbGUpbGlmZWN5Y2xlRmFjdG9yeS5nZXRMaWZlY3ljbGUoIkRFRkFVTFQiKTsKLSAgICAgICAgZmFjZXNDb250ZXh0RmFjdG9yeSA9IChNb2NrRmFjZXNDb250ZXh0RmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoImphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0RmFjdG9yeSIpOwotICAgICAgICBmYWNlc0NvbnRleHQgPSAoTW9ja0ZhY2VzQ29udGV4dClmYWNlc0NvbnRleHRGYWN0b3J5LmdldEZhY2VzQ29udGV4dChzZXJ2bGV0Q29udGV4dCwgcmVxdWVzdCwgcmVzcG9uc2UsIGxpZmVjeWNsZSk7Ci0gICAgICAgIGV4dGVybmFsQ29udGV4dCA9IChNb2NrRXh0ZXJuYWxDb250ZXh0KWZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKTsKLSAgICAgICAgVUlWaWV3Um9vdCByb290ID0gbmV3IFVJVmlld1Jvb3QoKTsKLSAgICAgICAgcm9vdC5zZXRWaWV3SWQoIi92aWV3SWQiKTsKLSAgICAgICAgcm9vdC5zZXRSZW5kZXJLaXRJZCgiSFRNTF9CQVNJQyIpOwotICAgICAgICBmYWNlc0NvbnRleHQuc2V0Vmlld1Jvb3Qocm9vdCk7Ci0gICAgICAgIEFwcGxpY2F0aW9uRmFjdG9yeSBhcHBsaWNhdGlvbkZhY3RvcnkgPSAoQXBwbGljYXRpb25GYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5Iik7Ci0gICAgICAgIGFwcGxpY2F0aW9uID0gKE1vY2tBcHBsaWNhdGlvbilhcHBsaWNhdGlvbkZhY3RvcnkuZ2V0QXBwbGljYXRpb24oKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LnNldEFwcGxpY2F0aW9uKGFwcGxpY2F0aW9uKTsKLSAgICAgICAgUmVuZGVyS2l0RmFjdG9yeSByZW5kZXJLaXRGYWN0b3J5ID0gKFJlbmRlcktpdEZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeSIpOwotICAgICAgICAvL1dyYXAgcmVuZGVyZXJzIHdpdGggcHJvcGVyIGV4dmFsIHdyYXBwZXIKLSAgICAgICAgcmVuZGVyS2l0ID0gbmV3IERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpLmNyZWF0ZShuZXcgTW9ja1JlbmRlcktpdCgpKTsKLSAgICAgICAgcmVuZGVyS2l0RmFjdG9yeS5hZGRSZW5kZXJLaXQoIkhUTUxfQkFTSUMiLCByZW5kZXJLaXQpOyAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyBhZGRpdGlvbmFsIHNldHVwIG5vdCBwcm92aWRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBzaGFsZSBtb2NrIHN0dWZmCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbk1hcCgpLnB1dChNeWZhY2VzQ29uZmlnLmNsYXNzLmdldE5hbWUoKSwgbmV3IE15ZmFjZXNDb25maWcoKSk7Ci0gICAgICAgIHdyaXRlciA9IG5ldyBNb2NrUmVzcG9uc2VXcml0ZXIobmV3IFN0cmluZ1dyaXRlcigpLCBudWxsLCBudWxsKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LnNldFJlc3BvbnNlV3JpdGVyKHdyaXRlcik7Ci0KLSAgICAgICAgVGVzdFV0aWxzLmFkZERlZmF1bHRSZW5kZXJlcnMoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgVGVzdFV0aWxzLmFkZERlZmF1bHRWYWxpZGF0b3JzKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgLy9leGVjdXRlIHN0YXJ0dXAgbGlzdGVuZXIKLSAgICAgICAgbmV3IEV4dFZhbFN0YXJ0dXBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuaW5pdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9LmluaXQoKTsKLQotICAgICAgICBuZXcgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyKCl7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyLmluaXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfS5pbml0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVhciBkb3duIHRoZSB0ZXN0IGVudmlyb25tZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYXBwbGljYXRpb24gPSBudWxsOwotICAgICAgICBjb25maWcgPSBudWxsOwotICAgICAgICBleHRlcm5hbENvbnRleHQgPSBudWxsOwotICAgICAgICBmYWNlc0NvbnRleHQucmVsZWFzZSgpOwotICAgICAgICBmYWNlc0NvbnRleHQgPSBudWxsOwotICAgICAgICBsaWZlY3ljbGUgPSBudWxsOwotICAgICAgICBsaWZlY3ljbGVGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgcmVuZGVyS2l0ID0gbnVsbDsKLSAgICAgICAgcmVxdWVzdCA9IG51bGw7Ci0gICAgICAgIHJlc3BvbnNlID0gbnVsbDsKLSAgICAgICAgc2VydmxldENvbnRleHQgPSBudWxsOwotICAgICAgICBzZXNzaW9uID0gbnVsbDsKLSAgICAgICAgRmFjdG9yeUZpbmRlci5yZWxlYXNlRmFjdG9yaWVzKCk7Ci0gICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHRocmVhZENvbnRleHRDbGFzc0xvYWRlcik7Ci0gICAgICAgIHRocmVhZENvbnRleHRDbGFzc0xvYWRlciA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NDcm9zc1ZhbFZhbGlkYXRpb24oKQotICAgIHsKLSAgICAgICAgbmV3IENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIoKS5hZnRlclBoYXNlKG5ldyBQaGFzZUV2ZW50KChGYWNlc0NvbnRleHQpZmFjZXNDb250ZXh0LFBoYXNlSWQuQU5ZX1BIQVNFLGxpZmVjeWNsZSkpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja01lc3NhZ2VDb3VudChpbnQgZXhwZWN0ZWQpCi0gICAgewotICAgICAgICBpbnQgYWN0dWFsID0gMDsKLSAgICAgICAgZm9yKEl0ZXJhdG9yIG1lc3NhZ2VzID0gZmFjZXNDb250ZXh0LmdldE1lc3NhZ2VzKCk7IG1lc3NhZ2VzLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lc3NhZ2VzLm5leHQoKTsKLSAgICAgICAgICAgIGFjdHVhbCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb21wbGV0ZSBtZXNzYWdlIGNvdW50IiwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tNZXNzYWdlQ291bnQoU3RyaW5nIGNsaWVudElkLCBpbnQgZXhwZWN0ZWQpCi0gICAgewotICAgICAgICBpbnQgYWN0dWFsID0gMDsKLSAgICAgICAgZm9yKEl0ZXJhdG9yIG1lc3NhZ2VzID0gZmFjZXNDb250ZXh0LmdldE1lc3NhZ2VzKGNsaWVudElkKTsgbWVzc2FnZXMuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgbWVzc2FnZXMubmV4dCgpOwotICAgICAgICAgICAgYWN0dWFsKys7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbXBsZXRlIG1lc3NhZ2UgY291bnQiLCBleHBlY3RlZCwgYWN0dWFsKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVmVyaWZ5IHRoZSBmb2xsb3dpbmc6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5pZCBpcyBub3QgbnVsbDwvbGk+Ci0gICAgICogPGxpPlJlc3BvbnNlIGlzIGNvbXBsZXRlPC9saT4KLSAgICAgKiA8bGk+UmVzcG9uY2UgY29udGFpbnMgdGhlIGlkPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZCBJRCB0byB2ZXJpZnkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRJZEV4aXN0cyhTdHJpbmcgaWQpCi0gICAgewotICAgICAgICBhc3NlcnROb3ROdWxsKCJJRCBpcyBub3QgbnVsbCIsIGlkKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzcG9uc2UgQ29tcGxldGUiLCBmYWNlc0NvbnRleHQuZ2V0UmVzcG9uc2VDb21wbGV0ZSgpKTsKLSAgICAgICAgU3RyaW5nIG91dHB1dCA9IHdyaXRlci5nZXRXcml0ZXIoKS50b1N0cmluZygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJIYXMgb3V0cHV0Iiwgb3V0cHV0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ29udGFpbnMgaWQgJyIgKyBpZCArICInIiwgb3V0cHV0LmluZGV4T2YoaWQpICE9IC0xKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVWYWx1ZUJpbmRpbmcoVUlJbnB1dCB1aUlucHV0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIGV4cHJlc3Npb24pCi0gICAgewotICAgICAgICBWYWx1ZUJpbmRpbmcgdmFsdWVCaW5kaW5nID0gYXBwbGljYXRpb24uY3JlYXRlVmFsdWVCaW5kaW5nKGV4cHJlc3Npb24pOwotCi0gICAgICAgIGlmKHVpSW5wdXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdWlJbnB1dC5zZXRWYWx1ZUJpbmRpbmcobmFtZSwgdmFsdWVCaW5kaW5nKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKFN0cmluZyBuYW1lLCBPYmplY3QgaW5zdGFuY2UpCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcobnVsbCwgInZhbHVlIiwgIiN7IiArIG5hbWUgKyAifSIpOwotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dChuYW1lLCBpbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIDxUPiBUIHJlc29sdmVCZWFuKFN0cmluZyBuYW1lLCBDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVCkgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKG5hbWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9CYXNlVmFsVGVzdEJlYW4uamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9CYXNlVmFsVGVzdEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmODQ3Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2V2YWwvQmFzZVZhbFRlc3RCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNldmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxlbmd0aDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsKLQotLyoqCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlVmFsVGVzdEJlYW4KLXsKLSAgICBAUmVxdWlyZWQKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIAotICAgIEBMZW5ndGgobWluaW11bT0yLG1heGltdW09MykKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lMTsKLSAgICAKLSAgICBAUGF0dGVybigiW0EtWl1bYS16XSsiKQotICAgIHByaXZhdGUgU3RyaW5nIHBhdHRlcm5OYW1lOwotICAgIAotICAgIEBEb3VibGVSYW5nZShtaW5pbXVtPS0zMDBkKQotICAgIHByaXZhdGUgRG91YmxlIGRvdWJsZVZhbHVlMTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUxKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYW1lMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lMShTdHJpbmcgbmFtZTEpCi0gICAgewotICAgICAgICB0aGlzLm5hbWUxID0gbmFtZTE7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gcGF0dGVybk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGF0dGVybk5hbWUoU3RyaW5nIHBhdHRlcm5OYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5wYXR0ZXJuTmFtZSA9IHBhdHRlcm5OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBEb3VibGUgZ2V0RG91YmxlVmFsdWUxKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkb3VibGVWYWx1ZTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RG91YmxlVmFsdWUxKERvdWJsZSBkb3VibGVWYWx1ZTEpCi0gICAgewotICAgICAgICB0aGlzLmRvdWJsZVZhbHVlMSA9IGRvdWJsZVZhbHVlMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2V2YWwvQmFzZVZhbFRlc3RDYXNlLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2V2YWwvQmFzZVZhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjOTZhMjQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNldmFsL0Jhc2VWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2V2YWw7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlVmFsVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZQotewotCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudCA9IG51bGw7Ci0KLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOwotICAgIAotICAgIEJhc2VWYWxUZXN0QmVhbiBiZWFuID0gbnVsbDsKLQotICAgIHB1YmxpYyBCYXNlVmFsVGVzdENhc2UoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBudWxsOwotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsKLSAgICAgICAgYmVhbiA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEJhc2VWYWxUZXN0Q2FzZS5jbGFzcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBiZWFuID0gbmV3IEJhc2VWYWxUZXN0QmVhbigpOwotICAgICAgICBWYWx1ZUJpbmRpbmcgdmIgPSBhcHBsaWNhdGlvbi5jcmVhdGVWYWx1ZUJpbmRpbmcoIiN7dGVzdEJlYW59Iik7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucHV0KCJ0ZXN0QmVhbiIsIGJlYW4pOwotCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOwotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7Ci0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsKLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBuZXcgSHRtbElucHV0VGV4dCgpOwotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50KTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0SWQoImlucHV0MSIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBudWxsOwotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsKLSAgICAgICAgYmVhbiA9IG51bGw7ICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZVJlcXVpcmVkRmFpbCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZX0iKTsKLQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7Ci0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZTFMZW5naHRNYXhGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lMX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiMTIzNDUiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWUxTGVuZ2h0Q29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZTF9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lMUxlbmdodE1pbkZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWUxfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCJ4Iik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0dGVybk5hbWVGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wYXR0ZXJuTmFtZX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiUGV0ZXIxIik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0dGVybk5hbWVDb3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wYXR0ZXJuTmFtZX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiUGV0ZXIiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsKLSAgICB9ICAgIAotCi0gICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVZhbHVlRmFpbCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4uZG91YmxlVmFsdWUxfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCItMzAxIik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVWYWx1ZUNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLmRvdWJsZVZhbHVlMX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiMjAwIik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydFRydWUoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyMDBkLCBpbnB1dENvbXBvbmVudC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnVwZGF0ZU1vZGVsKGZhY2VzQ29udGV4dCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyMDBkLCBiZWFuLmdldERvdWJsZVZhbHVlMSgpKTsKLSAgICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RCZWFuLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI2YjdjMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOwotCi0vKioKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUKLSAqLwotcHVibGljIGNsYXNzIENyb3NzVmFsVGVzdEJlYW4KLXsKLQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsKLSAgICAKLSAgICBARXF1YWxzKCJwcm9wZXJ0eTEiKSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTEoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKFN0cmluZyBwcm9wZXJ0eTEpCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnR5MSA9IHByb3BlcnR5MTsKLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkyKFN0cmluZyBwcm9wZXJ0eTIpCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdENhc2UuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGU4MDg1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlCi0gKi8KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbFRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UKLXsKLQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQxID0gbnVsbDsKLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MiA9IG51bGw7Ci0gICAgCi0gICAgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsKLSAgICAKLSAgICBwdWJsaWMgQ3Jvc3NWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBudWxsOwotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOwotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShDcm9zc1ZhbFRlc3RDYXNlLmNsYXNzKTsKLSAgICB9ICAgIAotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBDcm9zc1ZhbFRlc3RCZWFuIGJlYW4gPSBuZXcgQ3Jvc3NWYWxUZXN0QmVhbigpOwotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcobnVsbCwgInZhbHVlIiwgIiN7dGVzdEJlYW59Iik7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucHV0KCJ0ZXN0QmVhbiIsYmVhbik7Ci0gICAgICAgIAotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsKLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOwotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7Ci0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7ICAgICAgICAKLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbmV3IEh0bWxJbnB1dFRleHQoKTsKLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDEpOwotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0SWQoImlucHV0MSIpOwotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBuZXcgSHRtbElucHV0VGV4dCgpOwotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Mik7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRJZCgiaW5wdXQyIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsVmFsaWRhdGlvbigpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsKLQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc0ZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOwotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIjFkNCIpOwotICAgICAgICAKLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0gICAgICAgIAotCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbFZhbGlkYXRpb24oKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7Ci0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9FTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9FTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmViMWFhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvRUxDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnV0aWwuTWV0aG9kVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIEVMQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlIGV4dGVuZHMgRUxDcm9zc1ZhbFRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgRUxDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEVMQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotDQotICAgICAgICBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbigpOw0KLQ0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoRXF1YWxzLmNsYXNzLmdldE5hbWUoKSwgTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHLCBjb25maWcpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCByZXRlc3QgdGhpcyB0ZXN0LWNhc2UNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgcmV0ZXN0IHRoaXMgdGVzdC1jYXNlDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKTsNCi0gICAgICAgIGFzc2VydEZhbHNlKE1ldGhvZFV0aWxzLmlzTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShNZXRob2RVdGlscy5pc01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiKSk7DQotICAgICAgICAvLzF4IGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5IGFuZCAxeCBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsDQotICAgICAgICBhc3NlcnRUcnVlKE1ldGhvZFV0aWxzLmNoZWNrTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIsIDIpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9FTENyb3NzVmFsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI2MTVhMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuRGF0ZVRpbWVDb252ZXJ0ZXI7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIEVMQ3Jvc3NWYWxUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlDQotew0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0NCi0gICAgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgcHVibGljIEVMQ3Jvc3NWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEVMQ3Jvc3NWYWxUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgY3JlYXRlUmVxdWVzdFNjb3BlZEJlYW4oImJlYW4xIiwgZ2V0RW50aXR5SW5zdGFuY2UoKSk7DQotICAgICAgICBjcmVhdGVSZXF1ZXN0U2NvcGVkQmVhbigiYmVhbjIiLCBnZXRFbnRpdHlJbnN0YW5jZSgpKTsNCi0NCi0NCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOw0KLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOw0KLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOw0KLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsNCi0NCi0gICAgICAgIC8vaW5wdXQxDQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldElkKCJpbnB1dDEiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRDb252ZXJ0ZXIobmV3IERhdGVUaW1lQ29udmVydGVyKCkpOw0KLSAgICAgICAgKChEYXRlVGltZUNvbnZlcnRlcilpbnB1dENvbXBvbmVudDEuZ2V0Q29udmVydGVyKCkpLnNldFBhdHRlcm4oImRkLk1NLnl5eXkiKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQxKTsNCi0NCi0gICAgICAgIC8vaW5wdXQyDQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRDb252ZXJ0ZXIobmV3IERhdGVUaW1lQ29udmVydGVyKCkpOw0KLSAgICAgICAgKChEYXRlVGltZUNvbnZlcnRlcilpbnB1dENvbXBvbmVudDIuZ2V0Q29udmVydGVyKCkpLnNldFBhdHRlcm4oImRkLk1NLnl5eXkiKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQyKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlRUxDcm9zc0NvbXBvbmVudFZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTENyb3NzQ29tcG9uZW50VmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjEyLjEyLjIwMDgiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUVMQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uVXNlQ2FzZShTdHJpbmcgdmFsdWVCZWFuMVByb3BlcnR5MSwgU3RyaW5nIHZhbHVlQmVhbjFQcm9wZXJ0eTIsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkxLCBTdHJpbmcgdmFsdWVCZWFuMlByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7YmVhbjEuZGF0ZTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3tiZWFuMi5kYXRlMn0iKTsNCi0NCi0gICAgICAgIC8vc2V0IG1vZGVsIHZhbHVlcw0KLSAgICAgICAgcmVzb2x2ZUJlYW4oImJlYW4xIiwgZ2V0RW50aXR5SW5zdGFuY2UoKS5nZXRDbGFzcygpKS5zZXREYXRlMigoRGF0ZSlpbnB1dENvbXBvbmVudDEuZ2V0Q29udmVydGVyKCkuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dENvbXBvbmVudDEsIHZhbHVlQmVhbjFQcm9wZXJ0eTIpKTsNCi0gICAgICAgIHJlc29sdmVCZWFuKCJiZWFuMiIsIGdldEVudGl0eUluc3RhbmNlKCkuZ2V0Q2xhc3MoKSkuc2V0RGF0ZTEoKERhdGUpaW5wdXRDb21wb25lbnQyLmdldENvbnZlcnRlcigpLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgaW5wdXRDb21wb25lbnQyLCB2YWx1ZUJlYW4yUHJvcGVydHkxKSk7DQotDQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKHZhbHVlQmVhbjFQcm9wZXJ0eTEpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKHZhbHVlQmVhbjJQcm9wZXJ0eTIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlRUxNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTIuMTIuMjAwOCIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRUxNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uVXNlQ2FzZShTdHJpbmcgdmFsdWVCZWFuMVByb3BlcnR5MSwgU3RyaW5nIHZhbHVlQmVhbjFQcm9wZXJ0eTIsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkxLCBTdHJpbmcgdmFsdWVCZWFuMlByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7YmVhbjEuZGF0ZTF9Iik7DQotDQotICAgICAgICAvL3NldCBtb2RlbCB2YWx1ZXMNCi0gICAgICAgIHJlc29sdmVCZWFuKCJiZWFuMSIsIGdldEVudGl0eUluc3RhbmNlKCkuZ2V0Q2xhc3MoKSkuc2V0RGF0ZTIoKERhdGUpaW5wdXRDb21wb25lbnQxLmdldENvbnZlcnRlcigpLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgaW5wdXRDb21wb25lbnQxLCB2YWx1ZUJlYW4xUHJvcGVydHkyKSk7DQotICAgICAgICByZXNvbHZlQmVhbigiYmVhbjIiLCBnZXRFbnRpdHlJbnN0YW5jZSgpLmdldENsYXNzKCkpLnNldERhdGUxKChEYXRlKWlucHV0Q29tcG9uZW50Mi5nZXRDb252ZXJ0ZXIoKS5nZXRBc09iamVjdChmYWNlc0NvbnRleHQsIGlucHV0Q29tcG9uZW50MiwgdmFsdWVCZWFuMlByb3BlcnR5MSkpOw0KLSAgICAgICAgcmVzb2x2ZUJlYW4oImJlYW4yIiwgZ2V0RW50aXR5SW5zdGFuY2UoKS5nZXRDbGFzcygpKS5zZXREYXRlMigoRGF0ZSlpbnB1dENvbXBvbmVudDIuZ2V0Q29udmVydGVyKCkuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dENvbXBvbmVudDIsIHZhbHVlQmVhbjJQcm9wZXJ0eTIpKTsNCi0NCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVCZWFuMVByb3BlcnR5MSk7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBFTENyb3NzVmFsVGVzdERhdGVCZWFuIGdldEVudGl0eUluc3RhbmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBFTENyb3NzVmFsVGVzdERhdGVCZWFuKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9FTENyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRjZDhjNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFTENyb3NzVmFsVGVzdERhdGVCZWFuDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlIERFRkFVTFRfREFURSA9IG5ldyBEYXRlKCk7DQotDQotICAgIEBFcXVhbHMoIiN7YmVhbjIuZGF0ZTJ9IikNCi0gICAgcHJpdmF0ZSBEYXRlIGRhdGUxID0gREVGQVVMVF9EQVRFOw0KLQ0KLSAgICBwcml2YXRlIERhdGUgZGF0ZTIgPSBERUZBVUxUX0RBVEU7DQotDQotICAgIHB1YmxpYyBEYXRlIGdldERhdGUxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRhdGUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERhdGUxKERhdGUgZGF0ZTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGF0ZTEgPSBkYXRlMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlMigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkYXRlMjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlMihEYXRlIGRhdGUyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRhdGUyID0gZGF0ZTI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0ZjhmMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnV0aWwuTWV0aG9kVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIExvY2FsUHJvcGVydHlDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UgZXh0ZW5kcyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTG9jYWxQcm9wZXJ0eUNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLQ0KLSAgICAgICAgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24oKTsNCi0NCi0gICAgICAgIGNvbmZpZy5hZGRNYXBwaW5nKEVxdWFscy5jbGFzcy5nZXROYW1lKCksIE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRywgY29uZmlnKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHJldGVzdCB0aGlzIHRlc3QtY2FzZQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCByZXRlc3QgdGhpcyB0ZXN0LWNhc2UNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKTsNCi0gICAgICAgIGFzc2VydEZhbHNlKE1ldGhvZFV0aWxzLmlzTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKTsNCi0gICAgICAgIGFzc2VydFRydWUoTWV0aG9kVXRpbHMuaXNNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIikpOw0KLSAgICAgICAgLy8xeCBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeSBhbmQgMXggZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShNZXRob2RVdGlscy5jaGVja01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiLCAyKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmY3ZWU3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UgZXh0ZW5kcyBFTENyb3NzVmFsVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKExvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgRUxDcm9zc1ZhbFRlc3REYXRlQmVhbiBnZXRFbnRpdHlJbnN0YW5jZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdERhdGVCZWFuKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NTcxMDUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4gZXh0ZW5kcyBFTENyb3NzVmFsVGVzdERhdGVCZWFuDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlIERFRkFVTFRfREFURSA9IG5ldyBEYXRlKCk7DQotDQotICAgIEBFcXVhbHMoImRhdGUyIikNCi0gICAgcHJpdmF0ZSBEYXRlIGRhdGUxID0gREVGQVVMVF9EQVRFOw0KLQ0KLSAgICBwcml2YXRlIERhdGUgZGF0ZTIgPSBERUZBVUxUX0RBVEU7DQotDQotICAgIHB1YmxpYyBEYXRlIGdldERhdGUxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRhdGUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERhdGUxKERhdGUgZGF0ZTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGF0ZTEgPSBkYXRlMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlMigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkYXRlMjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlMihEYXRlIGRhdGUyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRhdGUyID0gZGF0ZTI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Nb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL01vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFmOTMzNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL01vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuRXF1YWxzU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnV0aWwuTWV0aG9kVXRpbHM7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBFcXVhbHNTdHJhdGVneQ0KLXsNCi0gICAgcHVibGljIE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICBNZXRob2RVdGlscy5zaWduYWxDbGFzc1VzZWQoZ2V0Q2xhc3MoKSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBNZXRob2RVdGlscy5zaWduYWxNZXRob2RDYWxsZWQoZ2V0Q2xhc3MoKSwgInJldmVyc2VNZXNzYWdlIik7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIE1ldGhvZFV0aWxzLnNpZ25hbE1ldGhvZENhbGxlZChnZXRDbGFzcygpLCAicmV2ZXJzZU1lc3NhZ2UiKTsNCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24pOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQxZjBmYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL01vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkgZXh0ZW5kcyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgY3JlYXRlKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgLy9mb3JjZSBpbml0IHNvIHRoYXQgZXZlcnkgdGVzdC1jYXNlIHNldHVwIG1ldGhvZCBjYW4gYWRkIGEgbW9jayB2YWxpZGF0aW9uIHN0cmF0ZWd5IHZpYSBleHR2YWwgamF2YS1hcGkNCi0gICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCh0aGlzLFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZChnZXRDbGFzcygpLCAiaW5pdFN0YXRpY01hcHBpbmdzIikpOw0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZShtZXRhRGF0YUtleSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEgYi9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA5YzkwYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnV0aWwuTWV0aG9kVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UgZXh0ZW5kcyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUHJvcGVydHlDaGFpbkNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0NCi0gICAgICAgIFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uKCk7DQotDQotICAgICAgICBjb25maWcuYWRkTWFwcGluZyhFcXVhbHMuY2xhc3MuZ2V0TmFtZSgpLCBNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsIGNvbmZpZyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHJldGVzdCB0aGlzIHRlc3QtY2FzZQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCByZXRlc3QgdGhpcyB0ZXN0LWNhc2UNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpOw0KLSAgICAgICAgYXNzZXJ0RmFsc2UoTWV0aG9kVXRpbHMuaXNNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIikpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCk7DQotICAgICAgICBhc3NlcnRUcnVlKE1ldGhvZFV0aWxzLmlzTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIpKTsNCi0gICAgICAgIC8vMXggZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkgYW5kIDF4IGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwNCi0gICAgICAgIGFzc2VydFRydWUoTWV0aG9kVXRpbHMuY2hlY2tNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIiwgMikpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE0NWE4ZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkRhdGVUaW1lQ29udmVydGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZQ0KLXsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotDQotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgICAgICBjcmVhdGVSZXF1ZXN0U2NvcGVkQmVhbigiYmVhbjEiLCBnZXRFbnRpdHlJbnN0YW5jZSgpKTsNCi0NCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOw0KLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOw0KLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOw0KLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsNCi0NCi0gICAgICAgIC8vaW5wdXQxDQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldElkKCJpbnB1dDEiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRDb252ZXJ0ZXIobmV3IERhdGVUaW1lQ29udmVydGVyKCkpOw0KLSAgICAgICAgKChEYXRlVGltZUNvbnZlcnRlcilpbnB1dENvbXBvbmVudDEuZ2V0Q29udmVydGVyKCkpLnNldFBhdHRlcm4oImRkLk1NLnl5eXkiKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQxKTsNCi0NCi0gICAgICAgIC8vaW5wdXQyDQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRDb252ZXJ0ZXIobmV3IERhdGVUaW1lQ29udmVydGVyKCkpOw0KLSAgICAgICAgKChEYXRlVGltZUNvbnZlcnRlcilpbnB1dENvbXBvbmVudDIuZ2V0Q29udmVydGVyKCkpLnNldFBhdHRlcm4oImRkLk1NLnl5eXkiKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQyKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlUHJvcGVydHlDaGFpbkNyb3NzQ29tcG9uZW50VmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlUHJvcGVydHlDaGFpbkNyb3NzQ29tcG9uZW50VmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTIuMTIuMjAwOCIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUHJvcGVydHlDaGFpbkNyb3NzQ29tcG9uZW50VmFsaWRhdGlvblVzZUNhc2UoU3RyaW5nIHZhbHVlQmVhbjFQcm9wZXJ0eTEsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3tiZWFuMS5kYXRlMX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje2JlYW4xLnN1YkJlYW4uZGF0ZTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKHZhbHVlQmVhbjFQcm9wZXJ0eTEpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKHZhbHVlQmVhbjJQcm9wZXJ0eTIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjEyLjEyLjIwMDgiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUVMTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvblVzZUNhc2UoU3RyaW5nIHZhbHVlQmVhbjFQcm9wZXJ0eTEsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkxKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3tiZWFuMS5kYXRlMX0iKTsNCi0NCi0gICAgICAgIC8vc2V0IG1vZGVsIHZhbHVlcw0KLSAgICAgICAgcmVzb2x2ZUJlYW4oImJlYW4xIiwgZ2V0RW50aXR5SW5zdGFuY2UoKS5nZXRDbGFzcygpKS5nZXRTdWJCZWFuKCkuc2V0RGF0ZTIoKERhdGUpaW5wdXRDb21wb25lbnQyLmdldENvbnZlcnRlcigpLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgaW5wdXRDb21wb25lbnQyLCB2YWx1ZUJlYW4yUHJvcGVydHkxKSk7DQotDQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKHZhbHVlQmVhbjFQcm9wZXJ0eTEpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVCZWFuIGdldEVudGl0eUluc3RhbmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4oKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ3M2ViOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZSBERUZBVUxUX0RBVEUgPSBuZXcgRGF0ZSgpOw0KLQ0KLSAgICBARXF1YWxzKCJzdWJCZWFuLmRhdGUyIikNCi0gICAgcHJpdmF0ZSBEYXRlIGRhdGUxID0gREVGQVVMVF9EQVRFOw0KLQ0KLSAgICBwcml2YXRlIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbiBzdWJCZWFuID0gbmV3IFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbigpOw0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlMSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkYXRlMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlMShEYXRlIGRhdGUxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRhdGUxID0gZGF0ZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbiBnZXRTdWJCZWFuKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1YkJlYW47DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0U3ViQmVhbihQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4gc3ViQmVhbikNCi0gICAgew0KLSAgICAgICAgdGhpcy5zdWJCZWFuID0gc3ViQmVhbjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbi5qYXZhIGIvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMwMTllNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4NCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERhdGUgREVGQVVMVF9EQVRFID0gbmV3IERhdGUoKTsNCi0NCi0gICAgcHJpdmF0ZSBEYXRlIGRhdGUyID0gREVGQVVMVF9EQVRFOw0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlMigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkYXRlMjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlMihEYXRlIGRhdGUyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRhdGUyID0gZGF0ZTI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvblRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0M2Y1Y2QuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzFfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb25UZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVmFsdWVCaW5kaW5nRXhwcmVzc2lvblRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZWFyRG93bigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFyZFN5bnRheCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjEucHJvcGVydHkxfSIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMS5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLCAicHJvcGVydHkxIik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjFbJ3Byb3BlcnR5MSddfSIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMVsncHJvcGVydHkxJ119Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLCAicHJvcGVydHkxIik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjFbJ2JlYW4yJ10ucHJvcGVydHkxfSIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMVsnYmVhbjInXS5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjFbJ2JlYW4yJ119Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCksICJwcm9wZXJ0eTEiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhbmRhcmRTeW50YXhSZXBsYWNlUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xLnByb3BlcnR5MX0iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2VQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAicHJvcGVydHkyIik7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCksICJwcm9wZXJ0eTIiKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsncHJvcGVydHkxJ119Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgInByb3BlcnR5MiIpOw0KLQ0KLSAgICAgICAgLy9UT0RPIHJlc3RvcmUgb3JpZ2luYWwgc3ludGF4DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCksICJwcm9wZXJ0eTIiKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsnYmVhbjInXS5wcm9wZXJ0eTF9Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgInByb3BlcnR5MiIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMVsnYmVhbjInXS5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjFbJ2JlYW4yJ119Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCksICJwcm9wZXJ0eTIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhbmRhcmRTeW50YXhBZGRQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjEuYmVhbjJ9Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5hZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAicHJvcGVydHkxIik7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xLmJlYW4yLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMS5iZWFuMn0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCksICJwcm9wZXJ0eTEiKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsnYmVhbjInXX0iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sICJwcm9wZXJ0eTEiKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjFbJ2JlYW4yJ10ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xWydiZWFuMiddfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSwgInByb3BlcnR5MSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydiZWFuMiddLmJlYW4zfSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24uYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgInByb3BlcnR5MSIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMVsnYmVhbjInXS5iZWFuMy5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjFbJ2JlYW4yJ10uYmVhbjN9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbg0KLSAgICAgICAgICAgICAgICAuZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjFbJ2JlYW4yJ119Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLCAicHJvcGVydHkxIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhY2VsZXRzQ3VzdG9tQ29tcG9uZW50U3ludGF4KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tlbnRpdHlbZmllbGROYW1lXX0iKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7ZW50aXR5W2ZpZWxkTmFtZV19Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7ZW50aXR5fSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSwgImZpZWxkTmFtZSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWNlbGV0c0N1c3RvbUNvbXBvbmVudFN5bnRheFJlcGxhY2VQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7ZW50aXR5W2ZpZWxkTmFtZV19Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgIm5ld0ZpZWxkTmFtZSIpOw0KLQ0KLSAgICAgICAgLy9UT0RPIHJlc3RvcmUgb3JpZ2luYWwgc3ludGF4DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2VudGl0eS5uZXdGaWVsZE5hbWV9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7ZW50aXR5fSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSwgIm5ld0ZpZWxkTmFtZSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wbGV4TWFwU3ludGF4KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24NCi0gICAgICAgICAgICAgICAgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVtiZWFuMltiZWFuM1sna2V5MSddXV0ucHJvcGVydHkxfSIpOw0KLQ0KLSAgICAgICAgLy9UT0RPDQotICAgICAgICAvL2Fzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjFbYmVhbjJbYmVhbjNbJ2tleTEnXV1dLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCksICJwcm9wZXJ0eTEiKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3V0aWwvTWV0aG9kVXRpbHMuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdXRpbC9NZXRob2RVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDY5ZmM3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdXRpbC9NZXRob2RVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QudXRpbDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotLy9UT0RPDQotcHVibGljIGNsYXNzIE1ldGhvZFV0aWxzDQotew0KLSAgICBwcml2YXRlIE1ldGhvZFV0aWxzKCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja01ldGhvZENhbGxlZChDbGFzcyB1c2VkQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBpbnQgY2FsbENvdW50KQ0KLSAgICB7DQotICAgICAgICBjaGVja1JlcXVpcmVkQ2xhc3ModXNlZENsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiBjYWxsQ291bnQgPT0gZ2V0TWV0aG9kQ2FsbENvdW50KHVzZWRDbGFzcywgbWV0aG9kTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWV0aG9kQ2FsbGVkKENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpDQotICAgIHsNCi0gICAgICAgIGNoZWNrUmVxdWlyZWRDbGFzcyh1c2VkQ2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkNCi0gICAgICAgICAgICAgICAgLmNvbnRhaW5zS2V5KHVzZWRDbGFzcy5nZXROYW1lKCkgKyAiIyIgKyBtZXRob2ROYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2lnbmFsTWV0aG9kQ2FsbGVkKENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIGludCBtZXRob2RDYWxsQ291bnQgPSAwOw0KLSAgICAgICAgU3RyaW5nIGtleSA9IHVzZWRDbGFzcy5nZXROYW1lKCkgKyAiIyIgKyBtZXRob2ROYW1lOw0KLQ0KLSAgICAgICAgaWYocmVxdWVzdE1hcC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGhvZENhbGxDb3VudCA9IChJbnRlZ2VyKXJlcXVlc3RNYXAuZ2V0KGtleSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXF1ZXN0TWFwLnB1dChrZXksICsrbWV0aG9kQ2FsbENvdW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TWV0aG9kQ2FsbENvdW50KENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIFN0cmluZyBrZXkgPSB1c2VkQ2xhc3MuZ2V0TmFtZSgpICsgIiMiICsgbWV0aG9kTmFtZTsNCi0NCi0gICAgICAgIGlmKHJlcXVlc3RNYXAuY29udGFpbnNLZXkoa2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKEludGVnZXIpcmVxdWVzdE1hcC5nZXQoa2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaWduYWxDbGFzc1VzZWQoQ2xhc3MgbW9ja0NsYXNzKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgICAgIC5wdXQobW9ja0NsYXNzLmdldE5hbWUoKSArICI6dXNlZCIsIHRydWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NsYXNzVXNlZChDbGFzcyBtb2NrQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgICAgIC5jb250YWluc0tleShtb2NrQ2xhc3MuZ2V0TmFtZSgpICsgIjp1c2VkIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1JlcXVpcmVkQ2xhc3MoQ2xhc3MgdXNlZENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzQ2xhc3NVc2VkKHVzZWRDbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbih1c2VkQ2xhc3MuZ2V0TmFtZSgpICsgIiBub3QgdXNlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdXRpbC9UZXN0VXRpbHMuamF2YSBiL3ByZXBhcmUvMV8xXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdXRpbC9UZXN0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlZDE2MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMV8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3V0aWwvVGVzdFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWNlc0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGZpbmFsIGNsYXNzIFRlc3RVdGlscwotewotICAgIC8qKiBEZWZhdWx0IExvZ2dlciAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUZXN0VXRpbHMuY2xhc3MpOwotCi0gICAgLyoqIHV0aWxpdHkgY2xhc3MsIGRvIG5vdCBpbnN0YW50aWF0ZSAqLwotICAgIHByaXZhdGUgVGVzdFV0aWxzKCkKLSAgICB7Ci0gICAgICAgIC8vIHV0aWxpdHkgY2xhc3MsIGRpc2FibGUgaW5zdGFudGlhdGlvbgotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRGVmYXVsdFZhbGlkYXRvcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIGFkZFZhbGlkYXRvcihmYWNlc0NvbnRleHQsImphdmF4LmZhY2VzLkRvdWJsZVJhbmdlIiwgImphdmF4LmZhY2VzLnZhbGlkYXRvci5Eb3VibGVSYW5nZVZhbGlkYXRvciIpOwotICAgICAgICBhZGRWYWxpZGF0b3IoZmFjZXNDb250ZXh0LCJqYXZheC5mYWNlcy5MZW5ndGgiLCAiamF2YXguZmFjZXMudmFsaWRhdG9yLkxlbmd0aFZhbGlkYXRvciIpOwotICAgICAgICBhZGRWYWxpZGF0b3IoZmFjZXNDb250ZXh0LCJqYXZheC5mYWNlcy5Mb25nUmFuZ2UiLCAiamF2YXguZmFjZXMudmFsaWRhdG9yLkxvbmdSYW5nZVZhbGlkYXRvciIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkVmFsaWRhdG9yKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdG9ySWQsIFN0cmluZyB2YWxpZGF0b3JDbGFzcykKLSAgICB7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmFkZFZhbGlkYXRvcih2YWxpZGF0b3JJZCwgdmFsaWRhdG9yQ2xhc3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhbGwgb2YgSlNGIDEuMiBkZWZhdWx0IHJlbmRlcmVycy4gIEN1cnJlbnRseSB0aGlzIGlzIG5vdCB0aWVkIHRvIAotICAgICAqIGZhY2VzLWNvbmZpZy54bWwsIHNvIGFsbCBjaGFuZ2UgdG8gdGhlIGZpbGUgTVVTVCBhbHNvIGJlIG1hZGUgaGVyZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0Ci0gICAgICogQHRvZG8gRG8gbm90IGFkZCByZW5kZXJlciBpZiByZW5kZXJlciBpcyBhbHJlYWR5IGFkZGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGREZWZhdWx0UmVuZGVyZXJzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpCi0gICAgewotICAgICAgICAvLyBTdGFuZGFyZCBIVE1MIFJlbmRlcmVycwotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5Db21tYW5kIiwgImphdmF4LmZhY2VzLkJ1dHRvbiIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sQnV0dG9uUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RCb29sZWFuIiwKLSAgICAgICAgICAgICAgICAiamF2YXguZmFjZXMuQ2hlY2tib3giLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbENoZWNrYm94UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RNYW55IiwKLSAgICAgICAgICAgICAgICAiamF2YXguZmFjZXMuQ2hlY2tib3giLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbENoZWNrYm94UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5Gb3JtIiwgImphdmF4LmZhY2VzLkZvcm0iLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEZvcm1SZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlBhbmVsIiwgImphdmF4LmZhY2VzLkdyaWQiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEdyaWRSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlBhbmVsIiwgImphdmF4LmZhY2VzLkdyb3VwIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxHcm91cFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuSW5wdXQiLCAiamF2YXguZmFjZXMuSGlkZGVuIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxIaWRkZW5SZW5kZXJlciIpOwotICAgICAgICAKLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuR3JhcGhpYyIsICJqYXZheC5mYWNlcy5JbWFnZSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sSW1hZ2VSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5MYWJlbCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGFiZWxSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5MaW5rIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMaW5rUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5Db21tYW5kIiwgImphdmF4LmZhY2VzLkxpbmsiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbExpbmtSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkxpc3Rib3giLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbExpc3Rib3hSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE1hbnkiLAotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5MaXN0Ym94IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMaXN0Ym94UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RPbmUiLCAiamF2YXguZmFjZXMuTWVudSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTWVudVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0TWFueSIsICJqYXZheC5mYWNlcy5NZW51IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxNZW51UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5NZXNzYWdlIiwgImphdmF4LmZhY2VzLk1lc3NhZ2UiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lc3NhZ2VSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5Gb3JtYXQiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEZvcm1hdFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuTWVzc2FnZXMiLAotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5NZXNzYWdlcyIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTWVzc2FnZXNSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsICJqYXZheC5mYWNlcy5SYWRpbyIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sUmFkaW9SZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLklucHV0IiwgImphdmF4LmZhY2VzLlNlY3JldCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sU2VjcmV0UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5EYXRhIiwgImphdmF4LmZhY2VzLlRhYmxlIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxUYWJsZVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuSW5wdXQiLCAiamF2YXguZmFjZXMuVGV4dGFyZWEiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFRleHRhcmVhUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5UZXh0IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxUZXh0UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5PdXRwdXQiLCAiamF2YXguZmFjZXMuVGV4dCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGV4dFJlbmRlcmVyIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgcmVuZGVyZXIgdG8gdGhlIEZhY2VzQ29udGV4dC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IEZhY2VzIENvbnRleHQKLSAgICAgKiBAcGFyYW0gZmFtaWx5IENvbXBvbmVuZXQgRmFtaWx5Ci0gICAgICogQHBhcmFtIHJlbmRlcmVyVHlwZSBDb21wb25lbnQgVHlwZQotICAgICAqIEBwYXJhbSByZW5kZXJDbGFzc05hbWUgQ2xhc3MgTmFtZSBvZiBSZW5kZXJlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRSZW5kZXJlcihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgZmFtaWx5LAotICAgICAgICAgICAgU3RyaW5nIHJlbmRlcmVyVHlwZSwgU3RyaW5nIHJlbmRlckNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyIHJlbmRlcmVyID0gKGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcikgbmV3SW5zdGFuY2UocmVuZGVyQ2xhc3NOYW1lKTsKLSAgICAgICAgUmVuZGVyS2l0IGtpdCA9IGZhY2VzQ29udGV4dC5nZXRSZW5kZXJLaXQoKTsKLSAgICAgICAga2l0LmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCByZW5kZXJlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJpZXMgYSBDbGFzcy5sb2FkQ2xhc3Mgd2l0aCB0aGUgY29udGV4dCBjbGFzcyBsb2FkZXIgb2YgdGhlIGN1cnJlbnQgdGhyZWFkIGZpcnN0IGFuZAotICAgICAqIGF1dG9tYXRpY2FsbHkgZmFsbHMgYmFjayB0byB0aGUgQ2xhc3NVdGlscyBjbGFzcyBsb2FkZXIgKGkuZS4gdGhlIGxvYWRlciBvZiB0aGUKLSAgICAgKiBteWZhY2VzLmphciBsaWIpIGlmIG5lY2Vzc2FyeS4KLSAgICAgKiAKLSAgICAgKiBOb3RlOiBUaGlzIHdhcyBjb3BpZWQgZnJvbSBvcmcuYXBhY2hlLm15ZmFjZXMuc2hhcmVkLnV0aWwuQ2xhc3NVdGlscwotICAgICAqCi0gICAgICogQHBhcmFtIHR5cGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBub24tcHJpbWl0aXZlIG5vbi1hcnJheSBjbGFzcwotICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgQ2xhc3MKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHR5cGUgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGNsYXNzRm9yTmFtZShTdHJpbmcgdHlwZSkKLSAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAodHlwZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0eXBlIik7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUcnkgV2ViQXBwIENsYXNzTG9hZGVyIGZpcnN0Ci0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZSh0eXBlLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwCi0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlnbm9yZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZmFsbGJhY2s6IFRyeSBDbGFzc0xvYWRlciBmb3IgQ2xhc3NVdGlscyAoaS5lLiB0aGUgbXlmYWNlcy5qYXIgbGliKQotICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUodHlwZSwgZmFsc2UsIC8vIGRvIG5vdCBpbml0aWFsaXplIGZvciBmYXN0ZXIgc3RhcnR1cAotICAgICAgICAgICAgICAgICAgICBUZXN0VXRpbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYW1lIGFzIHtAbGluayAjY2xhc3NGb3JOYW1lKFN0cmluZyl9LCBidXQgdGhyb3dzIGEgUnVudGltZUV4Y2VwdGlvbgotICAgICAqIChGYWNlc0V4Y2VwdGlvbikgaW5zdGVhZCBvZiBhIENsYXNzTm90Rm91bmRFeGNlcHRpb24uCi0gICAgICoKLSAgICAgKiBOb3RlOiBUaGlzIHdhcyBjb3BpZWQgZnJvbSBvcmcuYXBhY2hlLm15ZmFjZXMuc2hhcmVkLnV0aWwuQ2xhc3NVdGlscwotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBDbGFzcwotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdHlwZSBpcyBudWxsCi0gICAgICogQHRocm93cyBGYWNlc0V4Y2VwdGlvbiBpZiBjbGFzcyBub3QgZm91bmQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBzaW1wbGVDbGFzc0Zvck5hbWUoU3RyaW5nIHR5cGUpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNsYXNzRm9yTmFtZSh0eXBlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIkNsYXNzICIgKyB0eXBlICsgIiBub3QgZm91bmQiLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBGYWNlc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3Mgd2l0aCB0aGUgdHlwZSBvZiA8Y29kZT50eXBlPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBOb3RlOiBUaGlzIHdhcyBjb3BpZWQgZnJvbSBvcmcuYXBhY2hlLm15ZmFjZXMuc2hhcmVkLnV0aWwuQ2xhc3NVdGlscwotICAgICAqCi0gICAgICogQHBhcmFtIHR5cGUgVHlwZSBvZiBuZXcgY2xhc3MuCi0gICAgICogQHJldHVybiBJbnN0YW5jZSBvZiB0aGUgY2xhc3MgPGNvZGU+dHlwZTwvY29kZT4KLSAgICAgKiBAdGhyb3dzIEZhY2VzRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyB0eXBlKSB0aHJvd3MgRmFjZXNFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKHNpbXBsZUNsYXNzRm9yTmFtZSh0eXBlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyA8Y29kZT5jbGF6ejwvY29kZT4uCi0gICAgICogCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGF6eiBDbGFzcyB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YuCi0gICAgICogQHJldHVybiBJbnN0YW5jZSBvZiB0aGUgY2xhc3MgPGNvZGU+Y2xheno8L2NvZGU+Ci0gICAgICogQHRocm93cyBGYWNlc0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShDbGFzcyBjbGF6eikgdGhyb3dzIEZhY2VzRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ2xhc3MgOiAiICsgY2xhenouZ2V0TmFtZSgpICsgIiBub3QgZm91bmQuIiwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBGYWNlc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVuZGVyZXJlZCBhIGNvbXBvbmVudCwgaW5jbHVkaW5nIGl0J3MgY2hpbGRyZW4sIHRoZW4gY29tcGxldGUgdGhlIHJlcG9uc2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRleHQgRmFjZXMgQ29udGV4dAotICAgICAqIEBwYXJhbSBjb21wb25lbnQgQ29tcG9uZW50IHRvIGJlIHJlbmRlcmVkLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gVGhyb3duIHdoaWxlIHJlbmRlcmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVuZGVyQ29tcG9uZW50KEZhY2VzQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgVUlDb21wb25lbnQgY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyIHJlbmRlcmVyID0gY29udGV4dC5nZXRSZW5kZXJLaXQoKS5nZXRSZW5kZXJlcigKLSAgICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0RmFtaWx5KCksIGNvbXBvbmVudC5nZXRSZW5kZXJlclR5cGUoKSk7Ci0gICAgICAgIHJlbmRlcmVyLmVuY29kZUJlZ2luKGNvbnRleHQsIGNvbXBvbmVudCk7Ci0gICAgICAgIHJlbmRlcmVyLmVuY29kZUNoaWxkcmVuKGNvbnRleHQsIGNvbXBvbmVudCk7Ci0gICAgICAgIHJlbmRlcmVyLmVuY29kZUVuZChjb250ZXh0LCBjb21wb25lbnQpOwotICAgICAgICBjb250ZXh0LnJlc3BvbnNlQ29tcGxldGUoKTsKLSAgICAgICAgY29udGV4dC5yZW5kZXJSZXNwb25zZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9hc3NlbWJseS9wb20ueG1sIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2Fzc2VtYmx5L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZWExNDQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2Fzc2VtYmx5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWFzc2VtYmx5MTI8L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBBc3NlbWJseTwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+TXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBBc3NlbWJseSBpcyB1c2VkIHRvIGdlbmVyYXRlIAotICAgIC56aXAgYW5kIC50YXIuZ3ogZGlzdHJpYnV0aW9ucyA8L2Rlc2NyaXB0aW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvYXNzZW1ibHkvPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvYXNzZW1ibHkvPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay9hc3NlbWJseS88L3VybD4KLSAgICA8L3NjbT4KLSAgICAKLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5kZXBlbmRlbmN5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LWphdmFkb2M8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjb3JlLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+amF2YWRvYzwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+amF2YWRvYzwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+amF2YWRvYzwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vamF2YWRvYzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LXNvdXJjZTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZW5lcmljLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zcmM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBFWEVDVVRFIG12biBwYWNrYWdlIHRvIGdlbmVyYXRlIGFzc2VtYmx5IGZpbGVzIC0tPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X3NyYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5teWZhY2VzLWV4dHZhbDEyLSR7dmVyc2lvbn0tc3JjPC9maW5hbE5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXR0YWNoZWQ8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X2JpbjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPiR7YmFzZWRpcn0vc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsMTItJHt2ZXJzaW9ufS1iaW48L2ZpbmFsTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtnZW5lcmljLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDwhLS0gU2luY2UgZXh0dmFsIGNvdWxkIGJlIGFzeW5jIHJlbGVhc2VkLCBhbiBnZW5lcmF0ZWQgYXNzZW1ibHkgY291bGQgY29udGFpbiBkaWZmZXJlbnQKLSAgICAgICAgIGFydGlmYWN0IHZlcnNpb25zIC0tPgotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8Y29yZS52ZXJzaW9uPjEuMi4xPC9jb3JlLnZlcnNpb24+Ci0gICAgICAgIDx0cmluaWRhZC1zdXBwb3J0LnZlcnNpb24+MS4yLjE8L3RyaW5pZGFkLXN1cHBvcnQudmVyc2lvbj4KLSAgICAgICAgPGdlbmVyaWMtc3VwcG9ydC52ZXJzaW9uPjEuMi4xPC9nZW5lcmljLXN1cHBvcnQudmVyc2lvbj4KLSAgICAgICAgPHByb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbj4xLjIuMTwvcHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9uPgotICAgIDwvcHJvcGVydGllcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbCBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2Nzk1Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08YXNzZW1ibHk+Ci0gIDxpZD5jb3JlYmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgCTxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgCTxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPlJFQURNRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5OT1RJQ0UqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5SRUxFQVNFKjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvamF2YWRvYzwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5qYXZhZG9jPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTE4NmM2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3Jlc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPmNvcmVzcmM8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4gIAotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgCTxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgCTxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPlJFQURNRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5OT1RJQ0UqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5SRUxFQVNFKjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PiAgIAotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvc3JjPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PnNyYzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLmphcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KLSAKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDViM2E1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5YmZlNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnk6Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dAotU2VlIGxpY2Vuc2VzIGZvciBhY2NvbXBhbnlpbmcgcHJvZHVjdHMgaW4gdGhlICIvbGljZW5zZXMiIHN1YmRpcmVjdG9yeS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3BvbS54bWwgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOGM3N2QuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGU8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+Y29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y2dsaWI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZ2xpYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMV8zPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg0NjNlNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+DQotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMuc3RhcnR1cC5HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyDQotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJLaXQuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmI1NThhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyS2l0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLQ0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kSW50ZXJjZXB0b3I7DQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5FbmhhbmNlcjsNCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZFByb3h5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbEdlbmVyaWNSZW5kZXJLaXQgZXh0ZW5kcyBFeHRWYWxSZW5kZXJLaXQgaW1wbGVtZW50cyBNZXRob2RJbnRlcmNlcHRvcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBSZW5kZXJLaXQgbmV3SW5zdGFuY2UoUmVuZGVyS2l0IHJlbmRlcktpdCkNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gcmVuZGVyS2l0LmdldENsYXNzKCk7DQotDQotICAgICAgICAvL2l0J3Mgbm90IHBvc3NpYmxlIHRvIHdyYXAgdGhlIGNvbnZlcnRlciBhZ2FpbiAtIG9jY3VycyBlLmcuIHVuZGVyIHNvbGFyaXMgKyBiZWEgd2VibG9naWMNCi0gICAgICAgIGlmIChjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCIkJEVuaGFuY2VyQnlDR0xJQiQkIikNCi0gICAgICAgICAgICB8fCBjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCIkJEZhc3RDbGFzc0J5Q0dMSUIkJCIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZW5kZXJLaXQ7DQotICAgICAgICB9DQotDQotICAgICAgICBFbmhhbmNlciBlbmhhbmNlciA9IG5ldyBFbmhhbmNlcigpOw0KLSAgICAgICAgZW5oYW5jZXIuc2V0U3VwZXJjbGFzcyhyZW5kZXJLaXQuZ2V0Q2xhc3MoKSk7DQotICAgICAgICBlbmhhbmNlci5zZXRDYWxsYmFjayhuZXcgRXh0VmFsR2VuZXJpY1JlbmRlcktpdChyZW5kZXJLaXQpKTsNCi0NCi0gICAgICAgIHJldHVybiAoUmVuZGVyS2l0KSBlbmhhbmNlci5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGludGVyY2VwdChPYmplY3Qgb2JqLCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzLCBNZXRob2RQcm94eSBwcm94eSkgdGhyb3dzIFRocm93YWJsZQ0KLSAgICB7DQotICAgICAgICBpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0UmVuZGVyZXIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZXIoKFN0cmluZylhcmdzWzBdLCAoU3RyaW5nKWFyZ3NbMV0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiYWRkUmVuZGVyZXIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRSZW5kZXJlcigoU3RyaW5nKWFyZ3NbMF0sIChTdHJpbmcpYXJnc1sxXSwgKFJlbmRlcmVyKWFyZ3NbMl0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBwcm94eS5pbnZva2VTdXBlcihvYmosIGFyZ3MpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEV4dFZhbEdlbmVyaWNSZW5kZXJLaXQoUmVuZGVyS2l0IHdyYXBwZWQpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKHdyYXBwZWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgY3JlYXRlV3JhcHBlcihSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIubmV3SW5zdGFuY2UocmVuZGVyZXIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MGQ2MjIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyV3JhcHBlcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZEludGVyY2VwdG9yOwotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5FbmhhbmNlcjsKLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kUHJveHk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBmaW5hbCBjbGFzcyBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyIGV4dGVuZHMgRXh0VmFsUmVuZGVyZXJXcmFwcGVyIGltcGxlbWVudHMgTWV0aG9kSW50ZXJjZXB0b3IKLXsKLSAgICBwdWJsaWMgc3RhdGljIFJlbmRlcmVyIG5ld0luc3RhbmNlKFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gcmVuZGVyZXIuZ2V0Q2xhc3MoKTsKLQotICAgICAgICAvL3RvIGF2b2lkIHJlLXdyYXBwaW5nIC0gb2NjdXJzIGUuZy4gdW5kZXIgc29sYXJpcyArIGJlYSB3ZWJsb2dpYwotICAgICAgICBpZiAoY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRFbmhhbmNlckJ5Q0dMSUIkJCIpIHx8Ci0gICAgICAgICAgICBjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCIkJEZhc3RDbGFzc0J5Q0dMSUIkJCIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBFbmhhbmNlciBlbmhhbmNlciA9IG5ldyBFbmhhbmNlcigpOwotICAgICAgICBlbmhhbmNlci5zZXRTdXBlcmNsYXNzKHJlbmRlcmVyLmdldENsYXNzKCkpOwotICAgICAgICBlbmhhbmNlci5zZXRDYWxsYmFjayhuZXcgRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlcihyZW5kZXJlcikpOwotCi0gICAgICAgIHJldHVybiAoUmVuZGVyZXIpIGVuaGFuY2VyLmNyZWF0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgaW50ZXJjZXB0KE9iamVjdCBvYmosIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MsIE1ldGhvZFByb3h5IHByb3h5KSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldENvbnZlcnRlZFZhbHVlIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29udmVydGVkVmFsdWUoKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSwgYXJnc1syXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImRlY29kZSIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZGVjb2RlKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJlbmNvZGVCZWdpbiIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlQmVnaW4oKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImVuY29kZUNoaWxkcmVuIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGVDaGlsZHJlbigoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZW5jb2RlRW5kIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGVFbmQoKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImNvbnZlcnRDbGllbnRJZCIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0Q2xpZW50SWQoKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoU3RyaW5nKWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJnZXRSZW5kZXJzQ2hpbGRyZW4iKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJtZXRob2QgIiArIG1ldGhvZC5nZXROYW1lKCkgKyAiIGNhbGxlZCB3aXRob3V0IHJlbmRlcmluZy1pbnRlcmNlcHRvcnMiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHByb3h5Lmludm9rZVN1cGVyKG9iaiwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEV4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIoUmVuZGVyZXIgd3JhcHBlZCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKHdyYXBwZWQpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0dlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5MTdlNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0dlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkNCi17DQotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImV4dHZhbCByZW5kZXJraXQgd3JhcHBlciBjcmVhdGVkIGZvciAiICsgcmVuZGVyS2l0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB2aWEgY2dsaWIiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBFeHRWYWxHZW5lcmljUmVuZGVyS2l0Lm5ld0luc3RhbmNlKHJlbmRlcktpdCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3N0YXJ0dXAvR2VuZXJpY01vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3N0YXJ0dXAvR2VuZXJpY01vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGM3YjQxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9zdGFydHVwL0dlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0LkdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEdlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKS5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5SRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmNsYXNzKS5hZGRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeShuZXcgR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OWE4ZTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZSBwcm92aWRlcyBnZW5lcmljIFN1cHBvcnQgZm9yIEpTRiBjb21wb25lbnQgZnJhbWV3b3JrcyB3aGljaCBoYXZlIHNwZWNpYWwgcmVxdWlyZW1lbnRzIChlLmcuIFJpY2hGYWNlcywgTXlGYWNlcyBUb2JhZ28sIC4uLikuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLjEueCBhbmQgSlNGIDEuMi54LiBCb3RoIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3BvbS54bWwgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdlZjQ4MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIENvbXBvbmVudC1TdXBwb3J0IE1vZHVsZXM8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay9jb21wb25lbnQtc3VwcG9ydC88L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay9jb21wb25lbnQtc3VwcG9ydC88L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rL2NvbXBvbmVudC1zdXBwb3J0LzwvdXJsPgotICAgIDwvc2NtPgotCi0gICAgPG1vZHVsZXM+Ci0gICAgICAgIDxtb2R1bGU+dHJpbmlkYWQtc3VwcG9ydDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmdlbmVyaWMtc3VwcG9ydDwvbW9kdWxlPgotICAgIDwvbW9kdWxlcz4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPHRyaW5pZGFkLnZlcnNpb24+MS4yLjk8L3RyaW5pZGFkLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTg0MDI5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlPC9uYW1lPgotICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk4YjJiYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiDQotICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjIiPg0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPg0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdGFydHVwLlRyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyDQotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi0NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj4NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcg0KLSAgICAgICAgPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGJjMTk0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdC5FeHRWYWxUcmluaWRhZFJlbmRlcktpdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWN0b3J5RmluZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3Rvcnk7DQotDQotLyoqDQotICogdXNlIHRoaXMgcGhhc2UtbGlzdGVuZXIgaW5zdGVhZCBvZiBhIEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZHVlIHRvIGEgdHJpbmlkYWQgaXNzdWUNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICBpZihldmVudC5nZXRQaGFzZUlkKCkgIT0gUGhhc2VJZC5BUFBMWV9SRVFVRVNUX1ZBTFVFUyAmJiBldmVudC5nZXRQaGFzZUlkKCkgIT0gUGhhc2VJZC5SRU5ERVJfUkVTUE9OU0UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIFJlbmRlcktpdEZhY3RvcnkgcmVuZGVyS2l0RmFjdG9yeSA9IChSZW5kZXJLaXRGYWN0b3J5KQ0KLSAgICAgICAgICAgIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShGYWN0b3J5RmluZGVyLlJFTkRFUl9LSVRfRkFDVE9SWSk7DQotDQotICAgICAgICBTdHJpbmcgcmVuZGVyS2l0SWQgPSBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5nZXRSZW5kZXJLaXRJZCgpOw0KLQ0KLSAgICAgICAgaWYoRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuSUQuZXF1YWxzKHJlbmRlcktpdElkKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBSZW5kZXJLaXQgcmVuZGVyS2l0ID0gcmVuZGVyS2l0RmFjdG9yeS5nZXRSZW5kZXJLaXQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCByZW5kZXJLaXRJZCk7DQotICAgICAgICByZW5kZXJLaXRGYWN0b3J5LmFkZFJlbmRlcktpdChFeHRWYWxUcmluaWRhZFJlbmRlcktpdC5JRCwgbmV3IEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0KHJlbmRlcktpdCkpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuc2V0UmVuZGVyS2l0SWQoRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuSUQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5SRU5ERVJfUkVTUE9OU0U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc4YTFlMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFyZW4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICAvKg0KLSAgICAgKiBkZWFjdGl2YXRlDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfQ0xJRU5UX1NJREVfVFJJTklEQURfVkFMSURBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9DTElFTlRfU0lERV9UUklOSURBRF9WQUxJREFUSU9OIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9UUklOSURBRF9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9UUklOSURBRF9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiIpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvRG91YmxlUmFuZ2VJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0RvdWJsZVJhbmdlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM3OGE3MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvRG91YmxlUmFuZ2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5Eb3VibGVSYW5nZVZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJza2lwVmFsaWRhdGlvblN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24iKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEb3VibGVSYW5nZUluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBib29sZWFuIGluZm9ybWF0aW9uQWRkZWQgPSBmYWxzZTsKLSAgICAgICAgRG91YmxlUmFuZ2VWYWxpZGF0b3IgbGVuZ3RoVmFsaWRhdG9yID0gKERvdWJsZVJhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5Eb3VibGVSYW5nZSIpOwotCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbWluID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pOwotCi0gICAgICAgICAgICBpZihtaW4gaW5zdGFuY2VvZiBEb3VibGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1pbmltdW0oKERvdWJsZSltaW4pOwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCk7Ci0KLSAgICAgICAgICAgIGlmKG1heExlbmd0aCBpbnN0YW5jZW9mIERvdWJsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWF4aW11bSgoRG91YmxlKW1heExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYoaW5mb3JtYXRpb25BZGRlZCkKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IobGVuZ3RoVmFsaWRhdG9yKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xlbmd0aEluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYxOTFmOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIExlbmd0aEluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBib29sZWFuIGluZm9ybWF0aW9uQWRkZWQgPSBmYWxzZTsKLSAgICAgICAgLy9UT0RPCi0gICAgICAgIExlbmd0aFZhbGlkYXRvciBsZW5ndGhWYWxpZGF0b3IgPSAoTGVuZ3RoVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5MZW5ndGgiKTsKLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEgpOwotCi0gICAgICAgICAgICBpZihtaW4gaW5zdGFuY2VvZiBJbnRlZ2VyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNaW5pbXVtKChJbnRlZ2VyKW1pbik7Ci0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpOwotCi0gICAgICAgICAgICBpZihtYXhMZW5ndGggaW5zdGFuY2VvZiBJbnRlZ2VyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LmdldENsYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0TWF4aW11bUxlbmd0aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQuY2xhc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNYXhpbXVtKChJbnRlZ2VyKW1heExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL3JlSW5pdFZhbGlkYXRvcnMoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQsIG1ldGFEYXRhKTsgLy9zZWFyY2ggd3JhcHBlcnMgYW5kIGNhbGwgLmRlYWN0aXZhdGUKLQotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcihsZW5ndGhWYWxpZGF0b3IpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Mb25nUmFuZ2VJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xvbmdSYW5nZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZDM3YTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xvbmdSYW5nZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkxvbmdSYW5nZVZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJza2lwVmFsaWRhdGlvblN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24iKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBMb25nUmFuZ2VJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7Ci0gICAgICAgIExvbmdSYW5nZVZhbGlkYXRvciBsZW5ndGhWYWxpZGF0b3IgPSAoTG9uZ1JhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5Mb25nUmFuZ2UiKTsKLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKTsKLQotICAgICAgICAgICAgaWYobWluIGluc3RhbmNlb2YgTG9uZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWluaW11bSgoTG9uZyltaW4pOwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCk7Ci0KLSAgICAgICAgICAgIGlmKG1heExlbmd0aCBpbnN0YW5jZW9mIExvbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1heGltdW0oKExvbmcpbWF4TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcihsZW5ndGhWYWxpZGF0b3IpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNjY4NmQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1BhdHRlcm5Jbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5SZWdFeHBWYWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUGF0dGVybkluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZighbWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4pKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBwYXR0ZXJucyA9IChTdHJpbmdbXSltZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4pOwotCi0gICAgICAgIFJlZ0V4cFZhbGlkYXRvciByZWdFeHBWYWxpZGF0b3I7Ci0KLSAgICAgICAgZm9yKFN0cmluZyBwYXR0ZXJuIDogcGF0dGVybnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZ0V4cFZhbGlkYXRvciA9IChSZWdFeHBWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5SZWdFeHAiKTsKLQotICAgICAgICAgICAgcmVnRXhwVmFsaWRhdG9yLnNldFBhdHRlcm4ocGF0dGVybik7Ci0gICAgICAgICAgICByZWdFeHBWYWxpZGF0b3Iuc2V0TWVzc2FnZURldGFpbE5vTWF0Y2goKFN0cmluZyltZXRhRGF0YS5nZXQoCi0gICAgICAgICAgICAgICAgQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFKSk7Ci0KLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKHJlZ0V4cFZhbGlkYXRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUmVxdWlyZWRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDhmZTExLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSB8fAotICAgICAgICAgICBtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCl8fAotICAgICAgICAgICBtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKSkgfHwKLSAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpCi0gICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGlzQ29tcG9uZW50UmVxdWlyZWQodWlDb21wb25lbnQpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKHRydWUpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkgJiYKLSAgICAgICAgICAgICAgICAgICAhQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBCb29sZWFuIGlzQ29tcG9uZW50UmVxdWlyZWQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICAvL2NvbXBhcmUgd2l0aCBmYWxzZSBzbyB0cnVlID0gdHJ1ZSBvciBudWxsCi0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNSZWFkT25seSIpKSk7Ci0gICAgICAgIGJvb2xlYW4gaXNEaXNhYmxlZCA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNEaXNhYmxlZCIpKSk7Ci0KLSAgICAgICAgcmV0dXJuICEoaXNSZWFkT25seSB8fCBpc0Rpc2FibGVkKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1RyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MzEwOGMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1RyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb250ZXh0LlJlcXVlc3RDb250ZXh0OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dFRleHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX0RBVEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dERhdGUiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyPiBjb21wb25lbnRJbml0aWFsaXplcnMgPQotICAgICAgICBuZXcgQXJyYXlMaXN0PFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXI+KCk7Ci0KLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFJlcXVpcmVkSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IExlbmd0aEluaXRpYWxpemVyKCkpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBMb25nUmFuZ2VJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgRG91YmxlUmFuZ2VJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgUGF0dGVybkluaXRpYWxpemVyKCkpOwotICAgICAgICAvL2NvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFZhbGlkYXRvckluaXRpYWxpemVyKCkpOwotICAgIH0KLQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTE9XLCBkZXNjcmlwdGlvbiA9ICJjaGVjayBwcHIgaXNzdWUiKQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGZvcihUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyIDogY29tcG9uZW50SW5pdGlhbGl6ZXJzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihjb21wb25lbnRJbml0aWFsaXplci5jb25maWd1cmVUcmluaWRhZENvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQ29tcG9uZW50KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVC5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpIHx8Ci0gICAgICAgICAgICAgICBUUklOSURBRF9DT1JFX0lOUFVUX0RBVEUuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYoUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuaXNQYXJ0aWFsUmVxdWVzdChmYWNlc0NvbnRleHQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXF1ZXN0Q29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5hZGRQYXJ0aWFsVGFyZ2V0KHVpQ29tcG9uZW50LmdldFBhcmVudCgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVmFsaWRhdG9ySW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGJjZDBjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24odmFsdWUgPSBVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gImltcGwuIHRyaW5pZGFkIGUtbWFpbCB2YWxpZGF0b3IiKQotcHVibGljIGNsYXNzIFZhbGlkYXRvckluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZighbWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLkNVU1RPTSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuQ1VTVE9NKTsKLQotICAgICAgICBpZighKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvcihPYmplY3QgY3VycmVudFZhbHVlIDogKExpc3QpdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCEoY3VycmVudFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoQ29tbW9uTWV0YURhdGFLZXlzLkVNQUlMLmVxdWFscyhjdXJyZW50VmFsdWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vVE9ETwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjIxMjhkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dFRleHQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUuaW5wdXQuQ29yZUlucHV0RGF0ZSI7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IGdldExhYmVsKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgICAgICBpZihsYWJlbCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbGFiZWwgPSB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvL292ZXJyaWRlIHRoZSBsYWJlbCBpZiB0aGUgYW5ub3RhdGlvbiBwcm92aWRlcyBhIGxhYmVsDQotICAgICAgICAgICAgaWYobWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxhYmVsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCwgU3RyaW5nLmNsYXNzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvUGxhY2VMYWJlbChmYWNlc01lc3NhZ2UsIGxhYmVsLCBpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gVFJJTklEQURfQ09SRV9JTlBVVF9URVhULmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSkgfHwNCi0gICAgICAgICAgICAgICBUUklOSURBRF9DT1JFX0lOUFVUX0RBVEUuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRMYWJlbChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldExhYmVsIikpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYjQ1ZTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyS2l0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnJlbmRlcmtpdC5SZW5kZXJLaXREZWNvcmF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnJlbmRlcmtpdC5jb3JlLkNvcmVSZW5kZXJLaXQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlc3BvbnNlU3RhdGVNYW5hZ2VyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LlJlc3BvbnNlV3JpdGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LlJlc3BvbnNlU3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsNCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQgZXh0ZW5kcyBSZW5kZXJLaXREZWNvcmF0b3INCi17DQotICAgIHByb3RlY3RlZCBFeHRWYWxSZW5kZXJLaXQgZXh0VmFsUmVuZGVyS2l0Ow0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJFWFRWQUxfVFJJTklEQURfUkVOREVSS0lUIjsNCi0NCi0gICAgcHVibGljIEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0KFJlbmRlcktpdCB3cmFwcGVkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmV4dFZhbFJlbmRlcktpdCA9IG5ldyBFeHRWYWxSZW5kZXJLaXQod3JhcHBlZCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUsIFJlbmRlcmVyIHJlbmRlcmVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmV4dFZhbFJlbmRlcktpdC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgcmVuZGVyZXIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUmVuZGVyZXIgZ2V0UmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmdldFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFJlc3BvbnNlU3RhdGVNYW5hZ2VyIGdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBSZXNwb25zZVdyaXRlciBjcmVhdGVSZXNwb25zZVdyaXRlcihXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcywgU3RyaW5nIHMxKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5leHRWYWxSZW5kZXJLaXQuY3JlYXRlUmVzcG9uc2VXcml0ZXIod3JpdGVyLCBzLCBzMSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBSZXNwb25zZVN0cmVhbSBjcmVhdGVSZXNwb25zZVN0cmVhbShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5leHRWYWxSZW5kZXJLaXQuY3JlYXRlUmVzcG9uc2VTdHJlYW0ob3V0cHV0U3RyZWFtKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlY29yYXRlZFJlbmRlcktpdElkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENvcmVSZW5kZXJLaXQuQkFTRV9SRU5ERVJfS0lUX0lEOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYyNzAxZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwucmVuZGVya2l0LmNvcmUueGh0bWwudGFibGUuVGFibGVSZW5kZXJpbmdDb250ZXh0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogc29sdXRpb24gZm9yIHRyaW5pZGFkIHRhYmxlIHJlbmRlcmVyIGlzc3VlIChpbiBjb25uZWN0aW9uIHdpdGggZG91YmxlIGNhbGwgcHJldmVudGlvbiBwcm94aWVzKQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkgZXh0ZW5kcyBFeHRWYWxSZW5kZXJlclByb3h5DQotew0KLSAgICBwdWJsaWMgRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5KFJlbmRlcmVyIHJlbmRlcmVyKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihyZW5kZXJlcik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3B0aW9uYWxLZXkoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmKFRhYmxlUmVuZGVyaW5nQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAifCIgKyBUYWJsZVJlbmRlcmluZ0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0UmVuZGVyU3RhZ2UoKS5nZXRTdGFnZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuICIiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ2MWY0Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdGFydHVwL1RyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudC5UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0LkV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yLlRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogYWx0ZXJuYXRpdmUgYXBwcm9hY2ggZm9yIEV4dFZhbFJlbmRlcktpdEZhY3RvcnkNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyDQotew0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAid2ViLnhtbCBwYXJhbWV0ZXIgdG8gZGVhY3RpdmF0ZSBpdCIpDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBpbml0VHJpbmlkYWRTdXBwb3J0KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRUcmluaWRhZFN1cHBvcnQoKQ0KLSAgICB7DQotICAgICAgICAvL2RlYWN0aXZhdGUgZGVmYXVsdCBhcHByb2FjaA0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpLmRlYWN0aXZhdGUoKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIGRlYWN0aXZhdGVDbGllbnRTaWRlVmFsaWRhdGlvbiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NMSUVOVF9TSURFX1RSSU5JREFEX1ZBTElEQVRJT047DQotDQotICAgICAgICBpZihkZWFjdGl2YXRlQ2xpZW50U2lkZVZhbGlkYXRpb24gPT0gbnVsbCB8fCAhZGVhY3RpdmF0ZUNsaWVudFNpZGVWYWxpZGF0aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBkZWFjdGl2YXRlVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgPQ0KLSAgICAgICAgICAgICAgICBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9UUklOSURBRF9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUjsNCi0NCi0gICAgICAgIGlmKGRlYWN0aXZhdGVUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA9PSBudWxsIHx8DQotICAgICAgICAgICAgICAgICFkZWFjdGl2YXRlVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcihuZXcgVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2RlYWN0aXZhdGUgZXh0dmFsIHJlbmRlcmVyIHByb3h5IC0gZHVlIHRvIGFuIGluY29tcGF0aWJpbGl0eSB3aXRoIHRoZSB0YWJsZSByZW5kZXJlcg0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZLCBFeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIC8qDQotICAgICAgICAgKiBpZiB0aGVyZSBhcmUgZnVydGhlciBpbmNvbXBhdGlibGUgcmVuZGVyZXJzIHVzZSB0aGUgZm9sbG93aW5nIHF1aWNrLWZpeDoNCi0gICAgICAgICAqICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZLCBudWxsKTsNCi0gICAgICAgICAgIGF0dGVudGlvbjogaXQgY2F1c2VzIGRpcmVjdCBkZWxlZ2F0aW9uIHdpdGhvdXQgYSBjaGVjayBvZiBkb3VibGUgaW52b2NhdGlvbnMNCi0gICAgICAgICAqLw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0YmE4YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgVHJpbmlkYWQgU3VwcG9ydCBNb2R1bGUgcHJvdmlkZXMgc3BlY2lhbCBUcmluaWRhZCBTdXBwb3J0IGZvciBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yLg0KLSAgICBGdXJ0aGVybW9yZSwgaXQgYWxsb3dzIHRvIGpvaW4gdGhlIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gbWVjaGFuaXNtIG9mIFRyaW5pZGFkLiBTYW1wbGUgdXNlLWNhc2U6IGFubm90YXRlIHlvdXIgbW9kZWwgd2l0aCBKUEEgMS4wIGFubm90YXRpb25zLCBiaW5kIHByb3BlcnRpZXMgdG8gSlNGIElucHV0IGNvbXBvbmVudHMgYW5kIGdldCBhdXRvbWF0aWMgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBqdXN0IGJ5IGFkZGluZyAzIEpBUiBmaWxlcyAoTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlLCBQcm9wZXJ0eSBWYWxpZGF0aW9uIGFuZCBUcmluaWRhZCBTdXBwb3J0KS4NCi0gIA0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS4xLnggYW5kIEpTRiAxLjIueC4gQm90aCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KyAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvcG9tLnhtbCBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNzBkYjIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQ29yZTwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvY29yZS88L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay9jb3JlLzwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvY29yZS88L3VybD4KLSAgICA8L3NjbT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDRkYzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4NCi0gICAgPGZhY3Rvcnk+DQotICAgICAgICA8cmVuZGVyLWtpdC1mYWN0b3J5Pm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXRGYWN0b3J5PC9yZW5kZXIta2l0LWZhY3Rvcnk+DQotICAgIDwvZmFjdG9yeT4NCi0NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkV4dFZhbFN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0V4dFZhbEluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzgyMTAxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0V4dFZhbEluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBkb250J3QgbW92ZSB0byBhbiBvdGhlciBwYWNrYWdlISEhDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRXh0VmFsSW5mb3JtYXRpb24NCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgPSBFeHRWYWxJbmZvcm1hdGlvbi5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlhNTF9QQVJBTV9QUkVGSVggPSBFeHRWYWxJbmZvcm1hdGlvbi5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSAiMS4yLjEiOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0N1c3RvbUluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0N1c3RvbUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3Mjg4MWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9DdXN0b21JbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQ0KLXB1YmxpYyBlbnVtIEN1c3RvbUluZm9ybWF0aW9uDQotew0KLSAgICBCQVNFX1BBQ0tBR0UsDQotICAgIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SLA0KLQ0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgsDQotICAgIFZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYLA0KLSAgICBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfUE9TVEZJWCwNCi0NCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NU0dfUkVTT0xWRVJfTkFNRV9NQVBQRVIsDQotICAgIE1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSLA0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUiwNCi0NCi0gICAgU1RBUlRVUF9MSVNURU5FUiwNCi0gICAgQ09NUE9ORU5UX0lOSVRJQUxJWkVSLA0KLSAgICBWQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiwNCi0NCi0gICAgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLA0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksDQotICAgIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksDQotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLA0KLQ0KLSAgICBNRVNTQUdFX0JVTkRMRV9OQU1FLA0KLSAgICBTVEFUSUNfU1RSQVRFR1lfTUFQUElOR19TT1VSQ0UNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2YzQ2Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUmVuZGVyZXJJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXIuUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5EZWZhdWx0RmFjdG9yeUZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIEV4dFZhbENvbnRleHQKLXsKLSAgICBwcml2YXRlIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgc3RhdGljIEV4dFZhbENvbnRleHQgZXh0VmFsQ29udGV4dCA9IG5ldyBFeHRWYWxDb250ZXh0KCk7Ci0KLSAgICBwcml2YXRlIEZhY3RvcnlGaW5kZXIgZmFjdG9yeUZpbmRlciA9IG5ldyBEZWZhdWx0RmFjdG9yeUZpbmRlcigpOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUmVuZGVyZXJJbnRlcmNlcHRvcj4gcmVuZGVyZXJJbnRlcmNlcHRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlbmRlcmVySW50ZXJjZXB0b3I+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZGVuaWVkSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI+IHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyPigpOwotCi0gICAgcHJpdmF0ZSBMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPiBjb21wb25lbnRJbml0aWFsaXplcnM7Ci0gICAgcHJpdmF0ZSBMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4gdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yczsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBnbG9iYWxQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLSAgICBwcml2YXRlIE1hcDxTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMsIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+PiBzdGF0aWNDb25maWdNYXAKLSAgICAgICAgPSBuZXcgSGFzaE1hcDxTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMsIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+PigpOwotCi0KLSAgICBwcml2YXRlIHZvaWQgbGF6eUluaXRDb21wb25lbnRJbml0aWFsaXplcnMoKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMgPSBuZXcgQXJyYXlMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPigpOwotICAgICAgICBMaXN0PFN0cmluZz4gY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcwotICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9JTklUSUFMSVpFUik7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcwotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfSU5JVElBTElaRVIpKTsKLQotICAgICAgICBDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplcjsKLSAgICAgICAgZm9yIChTdHJpbmcgY29tcG9uZW50SW5pdGlhbGl6ZXJOYW1lIDogY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb21wb25lbnRJbml0aWFsaXplciA9Ci0gICAgICAgICAgICAgICAgKENvbXBvbmVudEluaXRpYWxpemVyKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY29tcG9uZW50SW5pdGlhbGl6ZXJOYW1lKTsKLQotICAgICAgICAgICAgaWYgKGNvbXBvbmVudEluaXRpYWxpemVyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChjb21wb25lbnRJbml0aWFsaXplcik7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShjb21wb25lbnRJbml0aWFsaXplci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbGF6eUluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMudmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMgPSBuZXcgQXJyYXlMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4oKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IpOwotICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KAotICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUikpOwotCi0gICAgICAgIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7Ci0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUgOiB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgPQotICAgICAgICAgICAgICAgIChWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzLmFkZCh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRXh0VmFsQ29udGV4dCBnZXRDb250ZXh0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBleHRWYWxDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBGYWN0b3J5RmluZGVyIGdldEZhY3RvcnlGaW5kZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZhY3RvcnlGaW5kZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmFjdG9yeUZpbmRlcihGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIpCi0gICAgewotICAgICAgICBpZihmYWN0b3J5RmluZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZmFjdG9yeUZpbmRlciA9IGZhY3RvcnlGaW5kZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxSZW5kZXJlckludGVyY2VwdG9yPiBnZXRSZW5kZXJlckludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxSZW5kZXJlckludGVyY2VwdG9yPihyZW5kZXJlckludGVyY2VwdG9ycy52YWx1ZXMoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoRXh0VmFsQ29udGV4dC5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlbmllZEludGVyY2VwdG9ycy5jb250YWlucyhyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9ycy5wdXQocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCksIHJlbmRlcmVySW50ZXJjZXB0b3IpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlcmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKENsYXNzIHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcykKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA9Ci0gICAgICAgICAgICAoUmVuZGVyZXJJbnRlcmNlcHRvcikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3MocmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKEV4dFZhbENvbnRleHQuY2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3JzLnJlbW92ZShyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvL2lmIGFuIGludGVyY2VwdG9yIGhhc24ndCBiZWVuIHJlZ2lzdGVyZWQgc28gZmFyLCBpdCBzaG91bGQgYmUgZGVuaWVkIGF0IGZ1dHVyZSByZWdpc3RyYXRpb25zCi0gICAgcHVibGljIHZvaWQgZGVueVJlbmRlcmVySW50ZXJjZXB0b3IoQ2xhc3MgcmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yID0KLSAgICAgICAgICAgIChSZW5kZXJlckludGVyY2VwdG9yKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzcyhyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoRXh0VmFsQ29udGV4dC5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgZGVuaWVkSW50ZXJjZXB0b3JzLmFkZChyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVyZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IocmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb21wb25lbnRJbml0aWFsaXplcihDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplcikKLSAgICB7Ci0gICAgICAgIGxhenlJbml0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7Ci0gICAgICAgIHRoaXMuY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChjb21wb25lbnRJbml0aWFsaXplcik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+IGdldENvbXBvbmVudEluaXRpYWxpemVycygpCi0gICAgewotICAgICAgICBsYXp5SW5pdENvbXBvbmVudEluaXRpYWxpemVycygpOwotICAgICAgICByZXR1cm4gY29tcG9uZW50SW5pdGlhbGl6ZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcihWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgbGF6eUluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHRoaXMudmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycy5hZGQodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+IGdldFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgbGF6eUluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI+IGdldFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIgcHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcikKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMuYWRkKHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBnZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpCi0gICAgewotICAgICAgICBNYXAgYXBwbGljYXRpb25NYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25NYXAoKTsKLSAgICAgICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gYmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgYXBwbGljYXRpb25NYXAuZ2V0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSk7Ci0KLSAgICAgICAgaWYgKGJlYW4gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGluaXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbihhcHBsaWNhdGlvbk1hcCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJlYW47Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBpbml0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oTWFwIGFwcGxpY2F0aW9uTWFwKQotICAgIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9JTkZPUk1BVElPTl9QUk9WSURFUl9CRUFOKTsKLSAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzLmFkZChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5DVVNUT01fQkVBTik7Ci0KLSAgICAgICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW47Ci0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW4gPSAoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4pIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOwotCi0gICAgICAgICAgICBpZiAoaW5mb3JtYXRpb25Qcm92aWRlckJlYW4gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbk1hcC5wdXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FLCBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5VG9Jbml0Q3VzdG9tQ29uZmlndXJlZEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lKGFwcGxpY2F0aW9uTWFwKTsKLQotICAgICAgICBpZihhcHBsaWNhdGlvbk1hcC5jb250YWluc0tleShJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKWFwcGxpY2F0aW9uTWFwLmdldChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9Jbml0Q3VzdG9tQ29uZmlndXJlZEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lKE1hcCBhcHBsaWNhdGlvbk1hcCkKLSAgICB7Ci0gICAgICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGJlYW4gPSAoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4pIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkKLSAgICAgICAgICAgIC5nZXRCZWFuKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkNVU1RPTV9CRUFOLnJlcGxhY2UoIi4iLCAiXyIpKTsKLQotICAgICAgICBpZihiZWFuICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uTWFwLnB1dChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUsIGJlYW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IGdldFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzIG5hbWUpCi0gICAgewotICAgICAgICBpZighdGhpcy5zdGF0aWNDb25maWdNYXAuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IHN0YXRpY0NvbmZpZ0xpc3QgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICAgICAgdGhpcy5zdGF0aWNDb25maWdNYXAucHV0KG5hbWUsIHN0YXRpY0NvbmZpZ0xpc3QpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnN0YXRpY0NvbmZpZ01hcC5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMgbmFtZSwgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBzdGF0aWNDb25maWdMaXN0OwotICAgICAgICAgICAgaWYoIXRoaXMuc3RhdGljQ29uZmlnTWFwLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRpY0NvbmZpZ0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICAgICAgICAgIHRoaXMuc3RhdGljQ29uZmlnTWFwLnB1dChuYW1lLCBzdGF0aWNDb25maWdMaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMuc3RhdGljQ29uZmlnTWFwLmdldChuYW1lKS5hZGQoc3RhdGljQ29uZmlnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gYWRkR2xvYmFsUHJvcGVydHkobmFtZSAsIHZhbHVlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRHbG9iYWxQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIGZvcmNlT3ZlcnJpZGUpCi0gICAgewotICAgICAgICBpZih0aGlzLmdsb2JhbFByb3BlcnRpZXMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCFmb3JjZU92ZXJyaWRlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygib3ZlcnJpZGUgZ2xvYmFsIHByb3BlcnR5ICciICsgbmFtZSArICInIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5nbG9iYWxQcm9wZXJ0aWVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0R2xvYmFsUHJvcGVydHkoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5nbG9iYWxQcm9wZXJ0aWVzLmdldChuYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYzMxMTYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFyZW4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICogKyBzb21lIG9mIHRoZW0gY2FuIGJlIGN1c3RvbWl6ZWQgd2l0aGluIGEgY3VzdG9tIGltcGwuIG9mIHRoZSBiZWFuDQotICogKGV4dGVuZCB0aGlzIGNsYXNzIGFuZCBwcm92aWRlIGl0IHZpYSBjb252ZW50aW9uIG9yIHdlYi54bWwpDQotICogPHAvPg0KLSAqIHRoZSBzdGF0aWMgYXBpIHNob3VsZCBvbmx5IGJlIHVzZWQNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSSwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVBTl9OQU1FID0gRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUNCi0gICAgICAgICsgIi4iICsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICAvL2N1c3RvbSBjbGFzcyB3aGljaCBpcyBhbiBvcHRpb25hbCByZXBsYWNlbWVudCBmb3IgdGhpcyBjbGFzcyAoaGFzIHRvIGV4dGVuZCB0aGlzIGNsYXNzKQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQkVBTiA9IChFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRQ0KLSAgICAgICAgKyAiLmN1c3RvbS4iICsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsNCi0NCi0gICAgcHVibGljIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHNldHVwQ3VzdG9taXphYmxlSW5mb3JtYXRpb24oKTsNCi0gICAgICAgIGFwcGx5Q3VzdG9tVmFsdWVzKHRoaXMuY3VzdG9taXphYmxlSW5mb3MpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPEN1c3RvbUluZm9ybWF0aW9uLCBTdHJpbmc+IGN1c3RvbWl6YWJsZUluZm9zID0gbmV3IEhhc2hNYXA8Q3VzdG9tSW5mb3JtYXRpb24sIFN0cmluZz4oKTsNCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwQ3VzdG9taXphYmxlSW5mb3JtYXRpb24oKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgYmFzZVBhY2thZ2UgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0JBU0VfUEFDS0FHRTsNCi0NCi0gICAgICAgIGlmIChiYXNlUGFja2FnZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VQYWNrYWdlID0gRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgKyAiLmN1c3RvbS4iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFiYXNlUGFja2FnZS5lbmRzV2l0aCgiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VQYWNrYWdlID0gYmFzZVBhY2thZ2UgKyAiLiI7DQotICAgICAgICB9DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQkFTRV9QQUNLQUdFLCBiYXNlUGFja2FnZSk7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IsDQotICAgICAgICAgICAgICAgICJDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFUcmFuc2Zvcm1lciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX0lOSVRJQUxJWkVSLA0KLSAgICAgICAgICAgICAgICAiQ29tcG9uZW50SW5pdGlhbGl6ZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTVNHX1JFU09MVkVSX05BTUVfTUFQUEVSLA0KLSAgICAgICAgICAgICJWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSLA0KLSAgICAgICAgICAgICJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSLA0KLSAgICAgICAgICAgICJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBUlRVUF9MSVNURU5FUiwNCi0gICAgICAgICAgICAgICAgIlN0YXJ0dXBMaXN0ZW5lciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIk1lc3NhZ2VSZXNvbHZlckZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIkNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkiKTsNCi0NCi0gICAgICAgIC8vY29udmVudGlvbnMgKHRoZSByZXN0IG9mIHRoZSBjb252ZW50aW9ucyBhcmUgYnVpbHQgd2l0aCB0aGUgaGVscCBvZiBuYW1lIG1hcHBlcnMsLi4uDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9CVU5ETEVfTkFNRSwNCi0gICAgICAgICAgICAgICAgInZhbGlkYXRpb25fbWVzc2FnZXMiKTsNCi0gICAgICAgIC8vc3RhdGljIHN0cmF0ZWd5IG1hcHBpbmdzIChuYW1lIG9mIHByb3BlcnR5IGZpbGVzKQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVRJQ19TVFJBVEVHWV9NQVBQSU5HX1NPVVJDRSwNCi0gICAgICAgICAgICAgICAgInN0cmF0ZWd5X21hcHBpbmdzIik7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlDdXN0b21WYWx1ZXMoTWFwPEN1c3RvbUluZm9ybWF0aW9uLCBTdHJpbmc+IG1hcCkNCi0gICAgew0KLSAgICAgICAgLy9vdmVycmlkZSB0byBjdXN0b21pemUgaW5mb3JtYXRpb24NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldChDdXN0b21JbmZvcm1hdGlvbiBjdXN0b21JbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gY3VzdG9taXphYmxlSW5mb3MuZ2V0KGN1c3RvbUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIHN3aXRjaCAoY3VzdG9tSW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgY2FzZSBCQVNFX1BBQ0tBR0U6DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0NCi0gICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAqIHBvc3RmaXggdXNlZCBieSB0aGUgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLSAgICAgICAgICAgICAqIHRoZSBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGlzIGZvciBjdXN0b20gc3RyYXRlZ2llcyBvbmx5DQotICAgICAgICAgICAgICogKG5vdCBmb3IgcHVibGljIHZhbGlkYXRpb24gbW9kdWxlcykNCi0gICAgICAgICAgICAgKiBzbyBpdCdzIGZpbmUgdG8gY3VzdG9taXplIGl0DQotICAgICAgICAgICAgICovDQotICAgICAgICAgICAgY2FzZSBWQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVg6DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0NCi0gICAgICAgICAgICBjYXNlIFZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgY2FzZSBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfUE9TVEZJWDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIHJldHVybiBjdXN0b21pemFibGVJbmZvcy5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQkFTRV9QQUNLQUdFKSArIHZhbHVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5Zjg2OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1vZHVsZU1lc3NhZ2VCdW5kbGVOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG5ld1BhY2thZ2VOYW1lOw0KLSAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmVuZHNXaXRoKCIucmVzb2x2ZXIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBuZXdQYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lLnJlcGxhY2UoIi5yZXNvbHZlciIsICIuYnVuZGxlIik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgbmV3UGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZS5yZXBsYWNlKCIucmVzb2x2ZXIuIiwgIi5idW5kbGUuIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbmV3UGFja2FnZU5hbWUgKyAiLnZhbGlkYXRpb25fbWVzc2FnZXMiOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB1c2UgYSBjdXN0b20gbmFtZSBtYXBwZXIgdG8gaW1wbGVtZW50IGN1c3RvbSBjb252ZW50aW9ucw0KLSAgICAgKi8NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUoDQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgU3RyaW5nIHRhcmdldENsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgIi5tZXNzYWdlLnJlc29sdmVyLiIsIHRhcmdldENsYXNzTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgNCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLCBTdHJpbmcgdGFyZ2V0Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLCAiLm1ldGFkYXRhLnRyYW5zZm9ybWVyLiIsIHRhcmdldENsYXNzTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZShDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRQYWNrYWdlTmFtZSwgU3RyaW5nIHRhcmdldENsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLmdldE5hbWUoKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5yZXBsYWNlKCIuc3RyYXRlZ3kuIiwgdGFyZ2V0UGFja2FnZU5hbWUpOw0KLQ0KLSAgICAgICAgaWYgKHRhcmdldENsYXNzTmFtZSA9PSBudWxsIHx8IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpID09IC0xKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZQ0KLSAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpKSArICIuIiArIHRhcmdldENsYXNzTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VSZXNvbHZlckNsYXNzTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCAiVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHVzZSBhIGN1c3RvbSBuYW1lIG1hcHBlciB0byBpbXBsZW1lbnQgY3VzdG9tIGNvbnZlbnRpb25zDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFLZXkucmVwbGFjZSgiLmFubm90YXRpb24uIiwgIi5zdHJhdGVneS4iKSArICJTdHJhdGVneSI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCAiTWV0YURhdGFUcmFuc2Zvcm1lciIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgU3RyaW5nIHRhcmdldFBvc3RmaXgpDQotICAgIHsNCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLmVuZHNXaXRoKCJWYWxpZGF0aW9uU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5zdWJzdHJpbmcoMCwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5sZW5ndGgoKSAtIDE4KSArIHRhcmdldFBvc3RmaXg7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLmVuZHNXaXRoKCJTdHJhdGVneSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLnN1YnN0cmluZygwLCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLmxlbmd0aCgpIC0gOCkgKyB0YXJnZXRQb3N0Zml4Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgKyB0YXJnZXRQb3N0Zml4Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmMxYzkxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcmVuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgLyoNCi0gICAgICogbWlzYw0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVTU0FHRV9CVU5ETEUgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVNTQUdFX0JVTkRMRSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX1BBQ0tBR0UgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9CQVNFX1BBQ0tBR0UiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fSU5GT1JNQVRJT05fUFJPVklERVJfQkVBTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9TVEFUSUNfVkFMSURBVElPTl9TVFJBVEVHWV9NQVBQSU5HID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORyIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DT01QT05FTlRfSU5JVElBTElaRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT01QT05FTlRfSU5JVElBTElaRVIiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBuYW1lIG1hcHBlcg0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUiIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBmYWN0b3JpZXMNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBkZWFjdGl2YXRlDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfUkVOREVSS0lUID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1JFTkRFUktJVCIpOw0KLQ0KLSAgICAvL2N1cnJlbnRseSBqdXN0IHVzZWQgYnkgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0RFRkFVTFRfQ09OVkVOVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT04iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0VMX1JFU09MVkVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0VMX1JFU09MVkVSIik7DQotDQotICAgIC8vdGhlcmUgaXMgbm90aGluZyBsaWtlIERFQUNUSVZBVEVfREVGQVVMVF9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SDQotICAgIC8vdXNlIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmRlbnlSZW5kZXJlckludGVyY2VwdG9yKC4uLikgd2l0aGluIGFuIGV4dHZhbC1TdGFydHVwTGlzdGVuZXINCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9BYnN0cmFjdEVMSGVscGVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9BYnN0cmFjdEVMSGVscGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTQzZjI1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBkZXRhaWxzDQotICogQHNlZSBEZWZhdWx0RUxIZWxwZXINCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5IGN1c3RvbUVMSGVscGVyRmFjdG9yeTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21FTEhlbHBlckZhY3RvcnkoQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkgZWxIZWxwZXJGYWN0b3J5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmN1c3RvbUVMSGVscGVyRmFjdG9yeSA9IGVsSGVscGVyRmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgZmluYWwgRUxIZWxwZXIgY3JlYXRlKCkNCi0gICAgew0KLSAgICAgICAgRUxIZWxwZXIgcmVzdWx0ID0gbnVsbDsNCi0NCi0gICAgICAgIGlmKHRoaXMuY3VzdG9tRUxIZWxwZXJGYWN0b3J5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5jdXN0b21FTEhlbHBlckZhY3RvcnkuY3JlYXRlRUxIZWxwZXIoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVFTEhlbHBlcigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRUxIZWxwZXIgY3JlYXRlRUxIZWxwZXIoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMDM2MTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb247DQotaW1wb3J0IGphdmF4LmVsLkVMQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nOw0KLWltcG9ydCBqYXZhLmlvLkV4dGVybmFsaXphYmxlOw0KLQ0KLS8qKg0KLSAqIGluIG9yZGVyIHRvIGNlbnRyYWxpemUgdGhlIGpzZiB2ZXJzaW9uIGRlcGVuZGVuY3kgd2l0aGluIHRoZSBjb3JlDQotICoNCi0gKiB0aGlzIGVsLWhlbHBlciBzdXBwb3J0cyBqc3AgYW5kIGZhY2VsZXRzICh0ZXN0ZWQgd2l0aCAxLjEuMTQpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIHRoZXJlIGlzIGEgc3BlY2lhbCBmYWNlbGV0cyB3b3JrYXJvdW5kIGZvciBlbC1leHByZXNzaW9ucyBvZiBjdXN0b20gY29tcG9uZW50cw0KLSAqIGl0J3MgcGx1Z2dhYmxlIGluIG9yZGVyIHRvIHN1cHBvcnQgc3BlY2lhbCBtZWNoYW5pc21zIG9mIGRpZmZlcmVudCB0ZWNobm9sb2dpZXMgKHRoYW4ganNwIGFuZCBmYWNlbGV0cykNCi0gKiBzbyB5b3UgY2FuIHBsdWcgaW4geW91ciBvd24gaW1wbC4gd2hpY2ggaW1wbGVtZW50cyBhIGN1c3RvbSB3b3JrYXJvdW5kIChsaWtlIHRoZSBmYWNlbGV0cyB3b3JrYXJvdW5kIG9mIHRoaXMgaW1wbC4pDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEVMSGVscGVyIGltcGxlbWVudHMgRUxIZWxwZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0VMX1JFU09MVkVSID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfRUxfUkVTT0xWRVI7DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0RUxIZWxwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgLy9kdWUgdG8gYSByZXN0cmljdGlvbiB3aXRoIHRoZSByaQ0KLSAgICAgICAgT2JqZWN0IGJlYW4gPSBnZXRWYWx1ZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgcmV0dXJuIChiZWFuICE9IG51bGwpID8gYmVhbi5nZXRDbGFzcygpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oU3RyaW5nIGJlYW5OYW1lKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgcmV0dXJuIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmdldEVMUmVzb2x2ZXIoKS5nZXRWYWx1ZShmYWNlc0NvbnRleHQuZ2V0RUxDb250ZXh0KCksIG51bGwsIGJlYW5OYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKHZhbHVlQmluZGluZ0V4cHJlc3Npb24gIT0gbnVsbCkgPyBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5ldmFsdWF0ZUV4cHJlc3Npb25HZXQoDQotICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgT2JqZWN0LmNsYXNzKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZXZhbHVhdGVFeHByZXNzaW9uR2V0KGZhY2VzQ29udGV4dCwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgT2JqZWN0LmNsYXNzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gZ2V0VmFsdWVCaW5kaW5nRXhwcmVzc2lvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgYm9vbGVhbiBhbGxvd0JsYW5rQ2hhcmFjdGVycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBnZXRPcmlnaW5hbFZhbHVlQmluZGluZ0V4cHJlc3Npb24odWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgLy9mb3IgaW5wdXQgY29tcG9uZW50cyB3aXRob3V0IHZhbHVlLWJpbmRpbmcNCi0gICAgICAgIC8vKGUuZy4gZm9yIHNwZWNpYWwgY29tcG9uZW50IGxpYnMgLT4gaXNzdWUgd2l0aCBFeHRWYWxSZW5kZXJlcldyYXBwZXIjZW5jb2RlQmVnaW4pDQotICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LmdldENsYXNzKCkgKyAiIGhhcyBubyB2YWx1ZSBiaW5kaW5nIC0gY29tcG9uZW50IGlkOiAiICsgdWlDb21wb25lbnQuZ2V0SWQoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoIWFsbG93QmxhbmtDaGFyYWN0ZXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2UoIiAiLCAiIik7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbikuZ2V0QmFzZUV4cHJlc3Npb24oKSkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlc3VsdCA9IEZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlci4NCi0gICAgICAgICAgICAgICAgdHJ5VG9DcmVhdGVWYWx1ZUJpbmRpbmdGb3JGYWNlbGV0c0JpbmRpbmcodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IHJlc29sdmUgZXhwcmVzc2lvbjogIiArIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCByZXN1bHQuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotDQotICAgICAgICAgICAgaWYoZW50aXR5Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCByZXNvbHZlIGV4cHJlc3Npb246ICIgKyByZXN1bHQuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvcGVydHlEZXRhaWxzIGdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZigidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShERUFDVElWQVRFX0VMX1JFU09MVkVSKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlEZXRhaWxzVmlhUmVmbGVjdGlvbkZhbGxiYWNrKHVpQ29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBFeHRWYWxFTFJlc29sdmVyIGVsUmVzb2x2ZXIgPSBuZXcgRXh0VmFsRUxSZXNvbHZlcihmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5nZXRFTFJlc29sdmVyKCkpOw0KLSAgICAgICAgRUxDb250ZXh0IGVsQ29udGV4dCA9IEV4dFZhbEVMUmVzb2x2ZXIuY3JlYXRlQ29udGV4dFdyYXBwZXIoZmFjZXNDb250ZXh0LmdldEVMQ29udGV4dCgpLCBlbFJlc29sdmVyKTsNCi0NCi0gICAgICAgIFZhbHVlRXhwcmVzc2lvbiB2YWx1ZUV4cHJlc3Npb24gPSB1aUNvbXBvbmVudC5nZXRWYWx1ZUV4cHJlc3Npb24oInZhbHVlIik7DQotDQotICAgICAgICBpZih2YWx1ZUV4cHJlc3Npb24gPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbHVlRXhwcmVzc2lvbi5zZXRWYWx1ZShlbENvbnRleHQsIG51bGwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICJlcnJvciBhdCBiaW5kaW5nOiAiICsgdmFsdWVFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSArDQotICAgICAgICAgICAgICAgICIgLS0gYW4gZWwtcmVzb2x2ZXIgZXJyb3Igb2NjdXJyZWQhIG1heWJlIHlvdSB1c2VkIGFuIGludmFsaWQgYmluZGluZy4gb3RoZXJ3aXNlOiAiICsNCi0gICAgICAgICAgICAgICAgInBsZWFzZSByZXBvcnQgdGhlIGlzc3VlLCBkZWFjdGl2YXRlIHRoZSBlbC1yZXNvdmxlciBvZiBleHR2YWwgdmlhIHdlYi54bWwgY29udGV4dC1wYXJhbTogIiArDQotICAgICAgICAgICAgICAgIEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVggKyAiLkRFQUNUSVZBVEVfRUxfUkVTT0xWRVIiICsNCi0gICAgICAgICAgICAgICAgIiBhbmQgdGVzdCBhZ2Fpbi4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGVsUmVzb2x2ZXIuZ2V0UGF0aCgpID09IG51bGwgfHwgZWxSZXNvbHZlci5nZXRCYXNlT2JqZWN0KCkgPT0gbnVsbCB8fCBlbFJlc29sdmVyLmdldFByb3BlcnR5KCkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlEZXRhaWxzKGVsUmVzb2x2ZXIuZ2V0UGF0aCgpLCBlbFJlc29sdmVyLmdldEJhc2VPYmplY3QoKSwgZWxSZXNvbHZlci5nZXRQcm9wZXJ0eSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNWaWFSZWZsZWN0aW9uRmFsbGJhY2soVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IGdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24odWlDb21wb25lbnQsIGZhbHNlKTsNCi0NCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24gPQ0KLSAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIFN0cmluZyBwYXRoID0gbnVsbDsNCi0NCi0gICAgICAgIHdoaWxlKGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihwYXRoID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwYXRoID0gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcGF0aCA9IGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkgKyAiLiIgKyBwYXRoOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBwYXRoID0gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSArICIuIiArIHBhdGg7DQotDQotICAgICAgICBPYmplY3QgYmFzZU9iamVjdCA9IGdldFZhbHVlT2ZFeHByZXNzaW9uKA0KLSAgICAgICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscyhwYXRoLCBiYXNlT2JqZWN0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLSAgICB9DQotDQotICAgIHN0YXRpYyBTdHJpbmcgZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBWYWx1ZUV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uID0gdWlDb21wb25lbnQuZ2V0VmFsdWVFeHByZXNzaW9uKCJ2YWx1ZSIpOw0KLQ0KLSAgICAgICAgcmV0dXJuICh2YWx1ZUV4cHJlc3Npb24gIT0gbnVsbCkgPyB2YWx1ZUV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VMVGVybVdlbGxGb3JtZWQoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgVmFsdWVCaW5kaW5nIHx8IG8gaW5zdGFuY2VvZiBFeHRlcm5hbGl6YWJsZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcyA9IG8udG9TdHJpbmcoKTsNCi0gICAgICAgIHJldHVybiAoKHMuY29udGFpbnMoIiMiKSB8fCBzLmNvbnRhaW5zKCIkIikpICYmIHMuY29udGFpbnMoInsiKSAmJiBzLmNvbnRhaW5zKCJ9IikpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmluZGluZ09mQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHVpQ29tcG9uZW50LmdldFZhbHVlRXhwcmVzc2lvbihuYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2ZlNTZjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RUxIZWxwZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkNCi17DQotICAgIHByaXZhdGUgRUxIZWxwZXIgZWxIZWxwZXIgPSBuZXcgRGVmYXVsdEVMSGVscGVyKCk7DQotICAgIA0KLSAgICBwcm90ZWN0ZWQgRUxIZWxwZXIgY3JlYXRlRUxIZWxwZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5lbEhlbHBlcjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYjI1NTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FTEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIGluIG9yZGVyIHRvIGNlbnRyYWxpemUgdGhlIGpzZiB2ZXJzaW9uIGRlcGVuZGVuY3kgd2l0aGluIHRoZSBjb3JlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIEVMSGVscGVyDQotew0KLSAgICBPYmplY3QgZ2V0QmVhbihTdHJpbmcgYmVhbk5hbWUpOw0KLQ0KLSAgICBPYmplY3QgZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0NCi0gICAgQ2xhc3MgZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLQ0KLSAgICBQcm9wZXJ0eURldGFpbHMgZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpOw0KLQ0KLSAgICBib29sZWFuIGlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLQ0KLSAgICBib29sZWFuIGlzRUxUZXJtV2VsbEZvcm1lZChPYmplY3Qgbyk7DQotDQotICAgIE9iamVjdCBnZXRCaW5kaW5nT2ZDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBuYW1lKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FeHRWYWxFTFJlc29sdmVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0V4dFZhbEVMUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I2YzNkMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0V4dFZhbEVMUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsKLQotaW1wb3J0IGphdmF4LmVsLkVMUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0OwotaW1wb3J0IGphdmF4LmVsLlZhcmlhYmxlTWFwcGVyOwotaW1wb3J0IGphdmF4LmVsLkZ1bmN0aW9uTWFwcGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEuYmVhbnMuRmVhdHVyZURlc2NyaXB0b3I7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGNsYXNzIEV4dFZhbEVMUmVzb2x2ZXIgZXh0ZW5kcyBFTFJlc29sdmVyCi17Ci0gICAgcHJpdmF0ZSBFTFJlc29sdmVyIHdyYXBwZWQ7Ci0gICAgcHJpdmF0ZSBPYmplY3QgYmFzZU9iamVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKLSAgICAvL2Zvcm1zIHRoZSBpZCBmb3IgY3Jvc3MtdmFsaWRhdGlvbiB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXhwcmVzc2lvbjsKLQotICAgIHB1YmxpYyBFeHRWYWxFTFJlc29sdmVyKEVMUmVzb2x2ZXIgZWxSZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IGVsUmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRCYXNlT2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpCi0gICAgewotICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpCi0gICAgewotICAgICAgICB0aGlzLmJhc2VPYmplY3QgPSBudWxsOwotICAgICAgICB0aGlzLnByb3BlcnR5ID0gbnVsbDsKLSAgICAgICAgdGhpcy5leHByZXNzaW9uID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBiYXNlLCBPYmplY3QgcHJvcGVydHkpCi0gICAgewotICAgICAgICBpZih0aGlzLmV4cHJlc3Npb24gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uID0gKFN0cmluZylwcm9wZXJ0eTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbiArPSAiLiIgKyBwcm9wZXJ0eTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRWYWx1ZShlbENvbnRleHQsIGJhc2UsIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0VHlwZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbywgT2JqZWN0IG8xKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0VHlwZShlbENvbnRleHQsIG8sIG8xKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbywgT2JqZWN0IG8xLCBPYmplY3QgbzIpCi0gICAgewotICAgICAgICBleHByZXNzaW9uICs9ICIuIiArIG8xOwotICAgICAgICBwcm9wZXJ0eSA9IChTdHJpbmcpbzE7Ci0gICAgICAgIGJhc2VPYmplY3QgPSBvOwotICAgICAgICBlbENvbnRleHQuc2V0UHJvcGVydHlSZXNvbHZlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvLCBPYmplY3QgbzEpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5pc1JlYWRPbmx5KGVsQ29udGV4dCwgbywgbzEpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxGZWF0dXJlRGVzY3JpcHRvcj4gZ2V0RmVhdHVyZURlc2NyaXB0b3JzKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0RmVhdHVyZURlc2NyaXB0b3JzKGVsQ29udGV4dCwgbyk7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzPD8+IGdldENvbW1vblByb3BlcnR5VHlwZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbykKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENvbW1vblByb3BlcnR5VHlwZShlbENvbnRleHQsIG8pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRUxDb250ZXh0IGNyZWF0ZUNvbnRleHRXcmFwcGVyKGZpbmFsIEVMQ29udGV4dCBjb250ZXh0LCBmaW5hbCBFTFJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFTENvbnRleHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRMb2NhbGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVJlc29sdmVkKGJvb2xlYW4gdmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuc2V0UHJvcGVydHlSZXNvbHZlZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRQcm9wZXJ0eVJlc29sdmVkKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwdXRDb250ZXh0KENsYXNzIGNsYXp6LCBPYmplY3Qgb2JqZWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyLnB1dENvbnRleHQoY2xhenosIG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5wdXRDb250ZXh0KGNsYXp6LCBvYmplY3QpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udGV4dChDbGFzcyBjbGF6eikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRDb250ZXh0KGNsYXp6KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvY2FsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlci5zZXRMb2NhbGUobG9jYWxlKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldExvY2FsZShsb2NhbGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBFTFJlc29sdmVyIGdldEVMUmVzb2x2ZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgRnVuY3Rpb25NYXBwZXIgZ2V0RnVuY3Rpb25NYXBwZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldEZ1bmN0aW9uTWFwcGVyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFZhcmlhYmxlTWFwcGVyIGdldFZhcmlhYmxlTWFwcGVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRWYXJpYWJsZU1hcHBlcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMDE0NjEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogSGVscGVyIGNsYXNzIHRvIGdldCB0aGUgcmVhbC9mdWxsIHZhbHVlIGJpbmRpbmcgLSB0ZXN0ZWQgd2l0aCBmYWNlbGV0cyAxLjEuMTQNCi0gKiBUaGUgdGFyZ2V0IGlzIHRvIGdldCByaWQgb2YgdGhpcyBpbXBsLiAtIGN1cnJlbnRseSBpdCdzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IGN1c3RvbSBmYWNlbGV0cyBjb21wb25lbnRzLg0KLSAqIEFuIGFsdGVybmF0aXZlIHdvdWxkIGJlIGFuIEVMLVJlc29sdmVyIC0gdGhlcmUgYXJlIHN0aWxsIHNvbWUgb3BlbiBpc3N1ZXMgd2l0aCBzdWNoIGFuIGFwcHJvYWNoDQotICogKyBJdCBpc24ndCBhdmFpbGFibGUgd2l0aCBKU0YgMS4xLngNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9DcmVhdGVWYWx1ZUJpbmRpbmdGb3JGYWNlbGV0c0JpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBEZWZhdWx0RUxIZWxwZXIuZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEJpbmRpbmdzID0gZXh0cmFjdEVMVGVybXMoDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmluZGluZ09mQ29tcG9uZW50KHVpQ29tcG9uZW50LCAidmFsdWUiKSk7DQotDQotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZT0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIDEpICsgInsiICsgY3JlYXRlQmluZGluZyhmb3VuZEJpbmRpbmdzLCBtYXBwZWRGYWNlbGV0c1ZhcnMpICsgIn0iKTsNCi0NCi0gICAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YmUuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotDQotICAgICAgICAgICAgaWYoZW50aXR5Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnlUb1JlcGxhY2VWYXJzKHZiZSwgbWFwcGVkRmFjZWxldHNWYXJzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHZiZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVCaW5kaW5nKExpc3Q8U3RyaW5nPiBleHByZXNzaW9ucywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkZWRWaXJ0dWFsTmFtZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGVudHJ5IDogZXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoIlZhbHVlRXhwcmVzc2lvblsiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBmb3VuZEJpbmRpbmdEZXRhaWxzID0gZW50cnkuc3BsaXQoIiAiKTsNCi0gICAgICAgICAgICBpbmRleE9mQmluZGluZ0RldGFpbHMgPSBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKGZvdW5kQmluZGluZ0RldGFpbHMpOw0KLQ0KLSAgICAgICAgICAgIGlmIChpbmRleE9mQmluZGluZ0RldGFpbHMgPT0gLTEpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgYmluZGluZ0RldGFpbHMgPSBmb3VuZEJpbmRpbmdEZXRhaWxzW2luZGV4T2ZCaW5kaW5nRGV0YWlsc10uc3BsaXQoIj0iKTsNCi0NCi0gICAgICAgICAgICBpZiAoYmluZGluZ0RldGFpbHMubGVuZ3RoIDwgMikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGJpbmRpbmdEZXRhaWxzWzFdOw0KLQ0KLSAgICAgICAgICAgIC8vdG8gc3VwcG9ydCBibGFua3Mgd2l0aGluIGEgYmluZGluZyB3aXRoIG1hcCBzeW50YXgNCi0gICAgICAgICAgICBpZihjdXJyZW50QmluZGluZy5jb250YWlucygieyIpICYmICFjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgPSBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKGN1cnJlbnRCaW5kaW5nLCBmb3VuZEJpbmRpbmdEZXRhaWxzLCBpbmRleE9mQmluZGluZ0RldGFpbHMpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnNLZXkoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5wdXQoYmluZGluZ0RldGFpbHNbMF0sIGN1cnJlbnRCaW5kaW5nKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvL2VudHJ5IGZvciAidmlydHVhbCIgZmFjZWxldHMgdmFyDQotICAgICAgICAgICAgaWYoIShjdXJyZW50QmluZGluZy5jb250YWlucygieyIpIHx8IGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhcnMucHV0KGJpbmRpbmdEZXRhaWxzWzBdLCBiaW5kaW5nRGV0YWlsc1sxXS5zdWJzdHJpbmcoMSwgYmluZGluZ0RldGFpbHNbMV0ubGVuZ3RoKCktMikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBvcmlnaW5hbEJpbmRpbmcgPSBhZGRlZFZpcnR1YWxOYW1lcy5nZXQoInZhbHVlIik7DQotICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcuc3Vic3RyaW5nKG9yaWdpbmFsQmluZGluZy5pbmRleE9mKCJ7IikgKyAxLCBvcmlnaW5hbEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLnJlbW92ZSgidmFsdWUiKTsNCi0gICAgICAgIHJldHVybiB0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcob3JpZ2luYWxCaW5kaW5nLCBhZGRlZFZpcnR1YWxOYW1lcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRyeVRvVHJhbnNmb3JtVG9SZWFsQmluZGluZyhTdHJpbmcgb3JpZ2luYWxCaW5kaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZGVkVmlydHVhbE5hbWVzKQ0KLSAgICB7DQotICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSAiI3siICsgb3JpZ2luYWxCaW5kaW5nICsgIn0iOw0KLSAgICAgICAgSXRlcmF0b3IgbmFtZUl0ZXJhdG9yID0gYWRkZWRWaXJ0dWFsTmFtZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsNCi0NCi0gICAgICAgIFN0cmluZyBjdXJyZW50S2V5Ow0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRWYWx1ZTsNCi0gICAgICAgIHdoaWxlKG5hbWVJdGVyYXRvci5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudEtleSA9IChTdHJpbmcpIG5hbWVJdGVyYXRvci5uZXh0KCk7DQotICAgICAgICAgICAgY3VycmVudFZhbHVlID0gYWRkZWRWaXJ0dWFsTmFtZXMuZ2V0KGN1cnJlbnRLZXkpOw0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoY3VycmVudFZhbHVlLmluZGV4T2YoInsiKSArIDEsIGN1cnJlbnRWYWx1ZS5pbmRleE9mKCJ9IikpOw0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJ7IiArIGN1cnJlbnRLZXkgKyAiLiIsICJ7IiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICIuIiwgIi4iICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIl0iLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiXSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG9yaWdpbmFsQmluZGluZy5zdWJzdHJpbmcoMiwgb3JpZ2luYWxCaW5kaW5nLmxlbmd0aCgpIC0gMSk7DQotICAgIH0NCi0NCi0gICAgLy90byBzdXBwb3J0IGJsYW5rcyAtIGUuZy4gd2l0aCBtYXAgc3ludGF4DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKFN0cmluZyBjdXJyZW50QmluZGluZywgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlscykNCi0gICAgew0KLSAgICAgICAgZm9yKGludCBpID0gaW5kZXhPZkJpbmRpbmdEZXRhaWxzICsgMTsgaSA8IGZvdW5kQmluZGluZ0RldGFpbHMubGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgKz0gZm91bmRCaW5kaW5nRGV0YWlsc1tpXTsNCi0gICAgICAgICAgICBpZihmb3VuZEJpbmRpbmdEZXRhaWxzW2ldLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEJpbmRpbmc7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRCaW5kaW5nOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBpbnQgY291bnQgPSAwOw0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBiaW5kaW5nRGV0YWlscykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuY29udGFpbnMoIj0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY291bnQrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZXh0cmFjdEVMVGVybXMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlRUxUZXJtcyhvLCBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKSwgZm91bmRFTFRlcm1zLCAwKSA+IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRFTFRlcm1zOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcmVzb2x2ZUVMVGVybXMoT2JqZWN0IG8sIE1hcDxPYmplY3QsIE9iamVjdD4gdmlzaXRlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMsIGludCBjb3VudCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAobyA9PSBudWxsIHx8IHZpc2l0ZWQuY29udGFpbnNLZXkobykgfHwgY291bnQgPiA1MCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZpc2l0ZWQucHV0KG8sIG51bGwpOw0KLQ0KLSAgICAgICAgaW50IGVsQ291bnQgPSAwOw0KLSAgICAgICAgQ2xhc3MgYyA9IG8uZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIC8vaW5zcGVjdCBtYXBzDQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1hcCkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBmb3IgKE9iamVjdCBlbnRyeSA6ICgoTWFwKSBvKS52YWx1ZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZm91bmQgZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICAgICAgaWYoZW50cnkudG9TdHJpbmcoKS5jb250YWlucygiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKGVudHJ5LnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoZW50cnksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGVsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQobykpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gKytlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9hbmFseXplIGFycmF5cw0KLSAgICAgICAgaWYgKGMuaXNBcnJheSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgobyk7DQotICAgICAgICAgICAgLy9jaGVjayBhcnJheSBbTCAtPiBubyBhcnJheSBvZiBwcmltaXRpdmUgdHlwZXMNCi0gICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMamF2YS5sYW5nLlN0cmluZyIpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChBcnJheS5nZXQobywgaSkpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKEFycmF5LmdldChvLCBpKSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxGaWVsZD4gYXR0cmlidXRlcyA9IGZpbmRBbGxBdHRyaWJ1dGVzKGMsIG5ldyBBcnJheUxpc3Q8RmllbGQ+KCkpOw0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBhdHRyaWJ1dGVzLnRvQXJyYXkobmV3IEZpZWxkW2F0dHJpYnV0ZXMuc2l6ZSgpXSk7DQotDQotICAgICAgICBBY2Nlc3NpYmxlT2JqZWN0LnNldEFjY2Vzc2libGUoZmllbGRzLCB0cnVlKTsNCi0gICAgICAgIGZvciAoRmllbGQgY3VycmVudEZpZWxkIDogZmllbGRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQuZ2V0KG8pID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5nZXRUeXBlKCkuZXF1YWxzKFN0cmluZy5jbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmdldChvKSAhPSBudWxsICYmIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKGN1cnJlbnRGaWVsZC5nZXQobykpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFjdXJyZW50RmllbGQuZ2V0VHlwZSgpLmlzUHJpbWl0aXZlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKGN1cnJlbnRGaWVsZC5nZXQobyksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZWxDb3VudDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEZpZWxkPiBmaW5kQWxsQXR0cmlidXRlcyhDbGFzcyBjLCBMaXN0PEZpZWxkPiBhdHRyaWJ1dGVzKQ0KLSAgICB7DQotICAgICAgICBpZiAoYyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluZEFsbEF0dHJpYnV0ZXMoYy5nZXRTdXBlcmNsYXNzKCksIGF0dHJpYnV0ZXMpOw0KLQ0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBjLmdldERlY2xhcmVkRmllbGRzKCk7DQotICAgICAgICBmb3IgKEZpZWxkIGN1cnJlbnRGaWVsZCA6IGZpZWxkcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzU3RhdGljKGN1cnJlbnRGaWVsZC5nZXRNb2RpZmllcnMoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChjdXJyZW50RmllbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9SZXBsYWNlVmFycyhWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eTsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0gICAgICAgIGJvb2xlYW4gbGFzdCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgd2hpbGUodHJ1ZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxhc3QgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0NCi0gICAgICAgICAgICBwcm9wZXJ0eSA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbg0KLSAgICAgICAgICAgICAgICAucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIGdldE5ld1Byb3BlcnR5KHByb3BlcnR5LCBtYXBwZWRGYWNlbGV0c1ZhcnMpKTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQubGVuZ3RoKCkgPT0gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpICsgIi4iICsgcmVzdWx0Ow0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpOw0KLQ0KLSAgICAgICAgICAgIGlmKGxhc3QpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcmVmaXgoKSArICJ7IiArIHJlc3VsdCArICJ9Iik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5ld1Byb3BlcnR5KFN0cmluZyBvbGRQcm9wZXJ0eSwgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFycyA9IGdldFBvdGVudGlhbFZpcnR1YWxWYXJzKG9sZFByb3BlcnR5KTsNCi0NCi0gICAgICAgIGZvcihTdHJpbmcgdmlydHVhbFZhciA6IHZpcnR1YWxWYXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1hcHBlZEZhY2VsZXRzVmFycy5jb250YWluc0tleSh2aXJ0dWFsVmFyKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG9sZFByb3BlcnR5ID0gcmVwbGFjZVByb3BlcnR5VmFsdWUob2xkUHJvcGVydHksIHZpcnR1YWxWYXIsIG1hcHBlZEZhY2VsZXRzVmFycy5nZXQodmlydHVhbFZhcikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvbGRQcm9wZXJ0eTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0UG90ZW50aWFsVmlydHVhbFZhcnMoU3RyaW5nIG9sZFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpbnQgc3RhcnQgPSAtMTsNCi0gICAgICAgIGludCBlbmQgPSAtMTsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG9sZFByb3BlcnR5Lmxlbmd0aCgpOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoc3RhcnQgPT0gLSAxICYmIG9sZFByb3BlcnR5LmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKChzdGFydCAhPSAtIDEgJiYgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICdbJykgfHwgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICddJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGVuZCA9IGk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKHN0YXJ0ICE9IC0xICYmIGVuZCAhPSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJMaXN0LmFkZChvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOw0KLSAgICAgICAgICAgICAgICBpZihvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbmQgPSAtMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlydHVhbFZhckxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcGxhY2VQcm9wZXJ0eVZhbHVlKFN0cmluZyBvbGRQcm9wZXJ0eSwgU3RyaW5nIHRhcmdldFZhciwgU3RyaW5nIG5ld1ZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpbnQgaW5kZXggPSBvbGRQcm9wZXJ0eS5pbmRleE9mKHRhcmdldFZhcik7DQotDQotICAgICAgICBpZihpbmRleCA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gb2xkUHJvcGVydHk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gb2xkUHJvcGVydHkuc3Vic3RyaW5nKDAsIGluZGV4KTsNCi0gICAgICAgIHJlc3VsdCArPSBuZXdWYWx1ZTsNCi0gICAgICAgIHJldHVybiByZXN1bHQgKyBvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoaW5kZXggKyB0YXJnZXRWYXIubGVuZ3RoKCksIG9sZFByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiByZXBsYWNlIHZpcnR1YWwgZmFjZWxldHMgdmFycyAobWFwIHN5bnRheCkNCi0gICAgICogdGVzdGVkIHN0eWxlcyAoc2ltcGxlIGFuZCBuZXN0ZWQpOiB0ZXN0W2l4W2l4MltpeDNdXV0NCi0gICAgICovDQotICAgIC8qDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBfY3JlYXRlQmluZGluZyhMaXN0PFN0cmluZz4gZXhwcmVzc2lvbnMsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmlydHVhbFZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0NCi0gICAgICAgIFN0cmluZyBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50QmluZGluZzsNCi0gICAgICAgIFN0cmluZyBwYXJ0T2ZCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBleHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aCgiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZvdW5kQmluZGluZ0RldGFpbHMgPSBlbnRyeS5zcGxpdCgiICIpOw0KLSAgICAgICAgICAgIGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoZm91bmRCaW5kaW5nRGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9PSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBiaW5kaW5nRGV0YWlscyA9IGZvdW5kQmluZGluZ0RldGFpbHNbaW5kZXhPZkJpbmRpbmdEZXRhaWxzXS5zcGxpdCgiPSIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nRGV0YWlscy5sZW5ndGggPCAyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYmluZGluZ0RldGFpbHNbMV07DQotDQotICAgICAgICAgICAgLy90byBzdXBwb3J0IGJsYW5rcyB3aXRoaW4gYSBiaW5kaW5nIHdpdGggbWFwIHN5bnRheA0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgJiYgIWN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoY3VycmVudEJpbmRpbmcsIGZvdW5kQmluZGluZ0RldGFpbHMsIGluZGV4T2ZCaW5kaW5nRGV0YWlscyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lICE9IG51bGwgJiYgY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnMoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBwYXJ0T2ZCaW5kaW5nID0gY3VycmVudEJpbmRpbmcuc3Vic3RyaW5nKGN1cnJlbnRCaW5kaW5nLmluZGV4T2YocHJldkZhY2VsZXRzQXR0cmlidXRlTmFtZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICArIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUubGVuZ3RoKCksIGN1cnJlbnRCaW5kaW5nLmluZGV4T2YoIn0iKSk7DQotDQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5hZGQoYmluZGluZ0RldGFpbHNbMF0pOw0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgcGFydE9mQmluZGluZzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICBlbHNlIGlmKCEoY3VycmVudEJpbmRpbmcuY29udGFpbnMoInsiKSB8fCBjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJzLnB1dChiaW5kaW5nRGV0YWlsc1swXSwgYmluZGluZ0RldGFpbHNbMV0uc3Vic3RyaW5nKDEsIGJpbmRpbmdEZXRhaWxzWzFdLmxlbmd0aCgpLTIpKTsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWlucyhiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLmFkZChiaW5kaW5nRGV0YWlsc1swXSk7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyZW50QmluZGluZy5zdWJzdHJpbmcoY3VycmVudEJpbmRpbmcuaW5kZXhPZigieyIpICsgMSwgY3VycmVudEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gYmluZGluZ0RldGFpbHNbMF07DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotICAgICovDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOGFmZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRpZmZlcmVuY2UgYmV0d2VlbiBbIGFuZCBbJyAtIHRlc3Qgd2l0aCBtb3JlIGNvbnN0ZWxsYXRpb25zIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQ0KLXB1YmxpYyBjbGFzcyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotew0KLSAgICBwcml2YXRlIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYmFzZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7DQotICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdG9rZW47DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXBsYWNlT3JBZGRQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlcGxhY2VQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1Byb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkuZW5kc1dpdGgoIiddIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCksIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBhZGRQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIFN0cmluZyBuZXdQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUV4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzb3VyY2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBzb3VyY2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSk7DQotDQotICAgICAgICBpZihuZXdQcm9wZXJ0eS5zdGFydHNXaXRoKCJbJyIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihyZXN1bHQgKyBuZXdQcm9wZXJ0eSArICJ9Iik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHJlc3VsdCArICIuIiArIG5ld1Byb3BlcnR5ICsgIn0iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihTdHJpbmcgZXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgaWYoIUV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKGV4cHJlc3Npb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXhwcmVzc2lvbiArICIgaXMgbm8gdmFsaWQgZWwtZXhwcmVzc2lvbiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW50IGluZGV4MSA9IGV4cHJlc3Npb24ubGFzdEluZGV4T2YoIiddIik7DQotICAgICAgICBpbnQgaW5kZXgyID0gZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiLiIpOw0KLQ0KLSAgICAgICAgaWYoaW5kZXgxID4gaW5kZXgyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnN1YnN0cmluZygwLCBpbmRleDEpOw0KLQ0KLSAgICAgICAgICAgIGludCBpbmRleDMgPSBmaW5kSW5kZXhPZlN0YXJ0aW5nQnJhY2tldChleHByZXNzaW9uKTsNCi0gICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoaW5kZXgzICsgMiwgaW5kZXgxKTsNCi0gICAgICAgICAgICB0aGlzLmJhc2UgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihleHByZXNzaW9uLnN1YnN0cmluZygwLCBpbmRleDMpICsgIn0iKTsNCi0gICAgICAgICAgICB0aGlzLnRva2VuID0gIlsnIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoIGluZGV4MiA+IGluZGV4MSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoaW5kZXgyICsgMSwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEgKTsNCi0gICAgICAgICAgICB0aGlzLmJhc2UgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihleHByZXNzaW9uLnN1YnN0cmluZygwLCBpbmRleDIpICsgIn0iKTsNCi0gICAgICAgICAgICB0aGlzLnRva2VuID0gIi4iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZygyLCBleHByZXNzaW9uLmxlbmd0aCgpIC0gMSk7DQotICAgICAgICAgICAgdGhpcy5wcmVmaXggPSBleHByZXNzaW9uLnN1YnN0cmluZygwLCAxKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUudHJpbSgpOw0KLSAgICAgICAgDQotICAgICAgICBpZigiWyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMudmFsdWUuc3RhcnRzV2l0aCgiJyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUuc3Vic3RyaW5nKDEsIHRoaXMudmFsdWUubGVuZ3RoKCkgLSAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZS52YWx1ZSArIHRoaXMudG9rZW4gKyB0aGlzLnZhbHVlLnN1YnN0cmluZygwLCB0aGlzLnZhbHVlLmxlbmd0aCgpKSArICInXSI7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gZ2V0QmFzZUV4cHJlc3Npb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmFzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4cHJlc3Npb25TdHJpbmcoKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgYmFzZUV4cHJlc3Npb24gPSB0aGlzLmJhc2UuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLQ0KLSAgICAgICAgICAgIGlmKCJbJyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAiJ119IjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAifSI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlZml4ICsgInsiICsgdGhpcy52YWx1ZSArICJ9IjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMuYmFzZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2UuZ2V0UHJlZml4KCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5iYXNlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5iYXNlLnNldFByZWZpeChwcmVmaXgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRFeHByZXNzaW9uU3RyaW5nKCkuaGFzaENvZGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uICYmIGdldEV4cHJlc3Npb25TdHJpbmcoKQ0KLSAgICAgICAgICAgIC5lcXVhbHMoKChWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKSB0YXJnZXQpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBpbnQgZmluZEluZGV4T2ZTdGFydGluZ0JyYWNrZXQoU3RyaW5nIGV4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIGludCBjbG9zZUNvdW50ID0gMDsNCi0gICAgICAgIGZvcihpbnQgaSA9IGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxOyBpID4gMDsgaS0tKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGV4cHJlc3Npb24uY2hhckF0KGkpID09ICdbJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNsb3NlQ291bnQtLTsNCi0gICAgICAgICAgICAgICAgaWYoY2xvc2VDb3VudCA8IDApDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYoZXhwcmVzc2lvbi5jaGFyQXQoaSkgPT0gJ10nKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2xvc2VDb3VudCsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9EZWZhdWx0RmFjdG9yeUZpbmRlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0RlZmF1bHRGYWN0b3J5RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZjcxNzcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0RlZmF1bHRGYWN0b3J5RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRGVmYXVsdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8vZHluYW1pYyBhcHByb2FjaCB0byBjcmVhdGUgdGhlIGZhY3RvcmllcyBkdXJpbmcgdGhlIGZpcnN0IHJlcXVlc3QsIHdoZW4gYSBmYWNlcy1jb250ZXh0IGlzIGF2YWlsYWJsZQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWN0b3J5RmluZGVyIGltcGxlbWVudHMgRmFjdG9yeUZpbmRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJvdGVjdGVkIE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4gZmFjdG9yeU1hcCA9IG5ldyBIYXNoTWFwPEZhY3RvcnlOYW1lcywgT2JqZWN0PigpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdEZhY3RvcnlGaW5kZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBmaW5hbCA8VD4gVCBnZXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIGlmKCEoZmFjdG9yeU1hcC5jb250YWluc0tleShmYWN0b3J5TmFtZSkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRGYWN0b3J5KGZhY3RvcnlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoVClmYWN0b3J5TWFwLmdldChmYWN0b3J5TmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgc3dpdGNoIChmYWN0b3J5TmFtZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjYXNlIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlTWVzc2FnZVJlc29sdmVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBSRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBFTF9IRUxQRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZUVMSGVscGVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0OiAvL3JlcXVpcmVkIGJ5IGNoZWNrc3R5bGUNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgcG9zc2libGUgdG8gY3JlYXRlIGZhY3RvcnkgIiArIGZhY3RvcnlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZhY3RvcnlNYXAucHV0KGZhY3RvcnlOYW1lLCBmYWN0b3J5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkpOw0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSk7DQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotICAgICAgICBMaXN0PFN0cmluZz4gbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSk7DQotICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZICk7DQotICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBjcmVhdGVFTEhlbHBlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRFTEhlbHBlckZhY3RvcnkoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmMjYyNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBGYWN0b3J5RmluZGVyCi17Ci0gICAgPFQ+IFQgZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUsIENsYXNzPFQ+IHRhcmdldENsYXNzKTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUxOWRjMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkKLXB1YmxpYyBlbnVtIEZhY3RvcnlOYW1lcwotewotICAgIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLAotICAgIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwKLSAgICBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwKLQotICAgIFJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksCi0gICAgRUxfSEVMUEVSX0ZBQ1RPUlkKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9Db21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWJkOTdhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gaW5pdGlhbGl6ZSBjb21wb25lbnRzIGJlZm9yZUVuY29kZUJlZ2luLjxici8+DQotICogZS5nLjogeW91IGNhbiBhZGQgaW5mb3JtYXRpb24gZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gbWVjaGFuaXNtcywuLi4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50SW5pdGlhbGl6ZXINCi17DQotICAgIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1OWMwNDEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBTdGF0aWNDb25maWd1cmF0aW9uPFQsIFI+DQotew0KLSAgICB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCk7DQotICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFQsIFI+PiBnZXRNYXBwaW5nKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uRW50cnkuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4NGFmNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGNsYXNzIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxULCBSPg0KLXsNCi0gICAgcHJpdmF0ZSBUIHNvdXJjZTsNCi0gICAgcHJpdmF0ZSBSIHRhcmdldDsNCi0NCi0gICAgcHVibGljIFQgZ2V0U291cmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHNvdXJjZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoVCBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSIGdldFRhcmdldCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KFIgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNTliMWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSX0pCi1wdWJsaWMgZW51bSBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMKLXsKLSAgICBNRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9DT05GSUcKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwY2I2ZjQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3MKLSAgICAgICAgPSBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VPZk1hcHBpbmcoU3RyaW5nIHBhdGgpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGdldE1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2Uoc291cmNlKTsKLSAgICAgICAgZW50cnkuc2V0VGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgIHRoaXMubWFwcGluZ3MuYWRkKGVudHJ5KTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWE2M2M0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIFN0cmluZyBwYXRoOwotICAgIHByaXZhdGUgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5nczsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCkKLSAgICB7Ci0gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgICAgIC8vZm9yY2UgcmVsb2FkCi0gICAgICAgIG1hcHBpbmdzID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBnZXRNYXBwaW5nKCkKLSAgICB7Ci0gICAgICAgIGlmKG1hcHBpbmdzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtYXBwaW5nczsKLSAgICAgICAgfQotCi0gICAgICAgIG1hcHBpbmdzID0gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotCi0gICAgICAgIFJlc291cmNlQnVuZGxlIG1hcHBpbmcgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocGF0aCk7Ci0KLSAgICAgICAgaWYgKG1hcHBpbmcgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9sb2dnaW5nCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IG1hcHBpbmcuZ2V0S2V5cygpOwotCi0gICAgICAgIFN0cmluZyBtZXRhRGF0YUtleTsKLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsKLQotICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YURhdGFLZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSBtYXBwaW5nLmdldFN0cmluZyhtZXRhRGF0YUtleSk7Ci0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWV0YURhdGFLZXksIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBtZXRhRGF0YUtleSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2UobWV0YURhdGFLZXkpOwotICAgICAgICBlbnRyeS5zZXRUYXJnZXQodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsKLSAgICAgICAgdGhpcy5tYXBwaW5ncy5hZGQoZW50cnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTkzOTY4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yIGltcGxlbWVudHMgUmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRJbnRlcmNlcHRvcklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJldHVyblZhbHVlT25Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKAotICAgICAgICBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIHNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24sIE9iamVjdCBjdXJyZW50UmV0dXJuVmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gY3VycmVudFJldHVyblZhbHVlOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBiZWZvcmUKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJlZm9yZURlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGFmdGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9SZW5kZXJlckludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMWYwNTQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9SZW5kZXJlckludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogQWxsb3dzIHRvIGludGVyY2VwdCByZW5kZXJlciBtZXRob2RzLjxici8+Ci0gKiBCYXNlIG1lY2hhbmlzbSBvZiBleHR2YWwuIEl0IGFsbG93cyB0byBhZGQgY3VzdG9tIGluZnJhc3RydWN0dXJlcy4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIFN0cmluZyBnZXRJbnRlcmNlcHRvcklkKCk7Ci0KLSAgICBPYmplY3QgZ2V0UmV0dXJuVmFsdWVPblNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oCi0gICAgICAgIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gc2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiwgT2JqZWN0IGN1cnJlbnRSZXR1cm5WYWx1ZSk7Ci0KLSAgICAvKgotICAgICAqIGJlZm9yZQotICAgICAqLwotICAgIHZvaWQgYmVmb3JlRGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlRW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgLyoKLSAgICAgKiBhZnRlcgotICAgICAqLwotICAgIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyRW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YzA5YWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQWxsb3dzIHRvIGludGVyY2VwdCB2YWxpZGF0aW9yIGV4Y2VwdGlvbnMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgLyoqDQotICAgICAqDQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCB0aGUgY3VycmVudCBjb21wb25lbnQNCi0gICAgICogQHBhcmFtIG1ldGFEYXRhRW50cnkgdGhlIG1ldGEgZGF0YSBlbnRyeSB3aGljaCBjb250YWlucyB0aGUgbWV0YSBkYXRhIG9mIHRoZSBwcm9wZXJ0eQ0KLSAgICAgKiBAcGFyYW0gY29udmVydGVkT2JqZWN0IHRoZSBjb252ZXJ0ZWQgdXNlciBpbnB1dA0KLSAgICAgKiBAcGFyYW0gdmFsaWRhdG9yRXhjZXB0aW9uIHRoZSBjdXJyZW50IGV4Y2VwdGlvbg0KLSAgICAgKiBAcGFyYW0gdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlIHZhbGlkYXRpb24gc3RyYXRlZ3kgd2hpY2ggdGhyZXcgdGhlIGV4Y2VwdGlvbg0KLSAgICAgKiBAcmV0dXJuIGZhbHNlIHRvIHN0b3AgdGhyb3dpbmcgdGhlIGV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZmNjNGYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXIuUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkludGVyY2VwdG9yIGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW5pdENvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYoISh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCB0byBpbml0IGNvbXBvbmVudCAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsKLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOwotCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gRXh0VmFsVXRpbHMuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IG1ldGFEYXRhRXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCkuZ2V0TWV0YURhdGFFbnRyaWVzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKGVudHJ5LmdldEtleSgpKTsKLQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCFza2lwVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uU3RyYXRlZ3ksIGVudHJ5KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSBFeHRWYWxVdGlscy5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKG1ldGFEYXRhID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihCb29sZWFuLlRSVUUuZXF1YWxzKGVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlNLSVBfVkFMSURBVElPTiwgQm9vbGVhbi5jbGFzcykpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04sIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vZ2V0IGNvbXBvbmVudCBpbml0aWFsaXplciBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50IGFuZCBjb25maWd1cmUgaXQKLSAgICAgICAgICAgICAgICAvL2Fsc28gaW4gY2FzZSBvZiBza2lwcGVkIHZhbGlkYXRpb24gdG8gcmVzZXQgZS5nLiB0aGUgcmVxdWlyZWQgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29uZmlndXJlQ29tcG9uZW50V2l0aE1ldGFEYXRhKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImluaXQgY29tcG9uZW50IG9mICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCA9IHdyYXBwZWQuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7Ci0KLSAgICAgICAgLy9yZWNvcmRlIHVzZXIgaW5wdXQgZS5nLiBmb3IgY3Jvc3MtY29tcG9uZW50IHZhbGlkYXRpb24KLSAgICAgICAgZm9yKFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIgcmVjb3JkZXIgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycygpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWNvcmRlci5yZWNvcmRVc2VySW5wdXQodWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7Ci0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZWNvcmRlci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY2FsbGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm9jZXNzVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQotICAgIHsKLSAgICAgICAgaWYgKCEodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgdmFsaWRhdGlvbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsKLQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IEV4dFZhbFV0aWxzLmdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKCk7Ci0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KS5nZXRNZXRhRGF0YUVudHJpZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOwotCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoc2tpcFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblN0cmF0ZWd5LCBlbnRyeSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgidmFsaWRhdGUgIiArIGVudHJ5LmdldFZhbHVlKCkgKyAiIHdpdGggIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZW50cnksIGNvbnZlcnRlZE9iamVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm5vIHZhbGlkYXRpb24gc3RyYXRlZ3kgZm91bmQgZm9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInZhbGlkYXRpb24gZmluaXNoZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHNraXBWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IGVudHJ5KQotICAgIHsKLSAgICAgICAgLy9vdmVycmlkZSBmb3IgY3VzdG9tIHNraXAgdmFsaWRhdGlvbiBzdXBwb3J0IChpZiBuZWVkZWQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2QzODY1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBBIGdlbmVyaWMgaW1wbGVtZW50YXRpb24uIFN1YmNsYXNzZXMganVzdCBoYXZlIHRvIG5vdyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIG5hbWUgbWFwcGVyLg0KLSAqDQotICogTmFtZU1hcHBlcnMgYXJlIHN0YXRlbGVzcy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxUPiBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VD4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotICAgIHByaXZhdGUgTmFtZU1hcHBlcjxUPiBjdXN0b21OYW1lTWFwcGVyOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVCBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIGlmIChjdXN0b21OYW1lTWFwcGVyID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKTsNCi0NCi0gICAgICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXN0b21OYW1lTWFwcGVyID0gKE5hbWVNYXBwZXI8VD4pIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoY3VzdG9tTmFtZU1hcHBlciAhPSBudWxsKSA/IGN1c3RvbU5hbWVNYXBwZXIuY3JlYXRlTmFtZShzb3VyY2UpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTE0MjNhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ2xhc3NNYXBwaW5nRmFjdG9yeTxQLCBSPg0KLXsNCi0gICAgUiBjcmVhdGUoUCBzb3VyY2UpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNjA3OGQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBuYW1lIG1hcHBlcnMuDQotICogQSBuYW1lIG1hcHBlciBjYWxjdWxhdGVzIGEgbmFtZSBmb3IgYSBnaXZlbiBzb3VyY2Ugb2JqZWN0Lg0KLSAqIGUuZy4gTWV0YS1EYXRhIEtleSAoZS5nLjogYW5ub3RhdGlvbiBjbGFzcyBuYW1lKSAtPiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgU3RyaW5nIGNyZWF0ZU5hbWUoVCBzb3VyY2UpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL0NvbW1vbk1ldGFEYXRhS2V5cy5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjYzQzMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL0NvbW1vbk1ldGFEYXRhS2V5cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGE7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBoZWxwZXIgZm9yIGZyZXF1ZW50IG1ldGEtZGF0YSBrZXlzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIHBsYWNlZCBpbiBjb3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgaW5mb3JtYXRpb24gaW4gbXVsdGlwbGUgbW9kdWxlcyAodmFsaWRhdGlvbiBtb2R1bGUgYW5kIGNvbXBvbmVudC1zdXBwb3J0IG1vZHVsZSkNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbW9uTWV0YURhdGFLZXlzDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVJUkVEID0gInJlcXVpcmVkIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFLX1JFUVVJUkVEID0gIndlYWtfcmVxdWlyZWQiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTl9MRU5HVEggPSAibWluX2xlbmd0aCI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0xFTkdUSCA9ICJtYXhfbGVuZ3RoIjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9NSU4gPSAicmFuZ2VfbWluIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9NQVggPSAicmFuZ2VfbWF4IjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRURVJOID0gInBhdHRlcm4iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFID0gInBhdHRlcm5fdmFsaWRhdGlvbl9lcnJvcl9tZXNzYWdlIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFTUFJTCA9ICJlbWFpbCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NID0gImN1c3RvbSI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9WQUxJREFUSU9OID0gInNraXBfdmFsaWRhdGlvbiI7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvTWV0YURhdGFFbnRyeS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9NZXRhRGF0YUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyY2I1OGYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9NZXRhRGF0YUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBEYXRhIGhvbGRlciB3aGljaCBzdG9yZXMgdGhlIG1ldGEtZGF0YSBhbmQgc29tZSBpbmZvcm1hdGlvbiB3aGVyZSB0aGUgbWV0YS1kYXRhIHdhcyBhcm91bmQuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgTWV0YURhdGFFbnRyeQotewotICAgIHByaXZhdGUgU3RyaW5nIGtleTsKLSAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRLZXkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gVCBnZXRWYWx1ZShDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVClnZXRWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpZ2V0UHJvcGVydHkoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMmY0YTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhbGwgZmFjdG9yaWVzIHdoaWNoIGNyZWF0ZSBtZXRhLWRhdGEgZXh0cmFjdG9ycwotICogCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ci17Ci0gICAgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlKCk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGY3ZTMzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBleHRyYWN0cyBtZXRhLWRhdGEgKGUuZy4gdGhlIGFubm90YXRpb25zKSBvZiB0aGUgdmFsdWUgYmluZGluZyBvZiBhIGNvbXBvbmVudC4KLSAqIEl0IGV4dHJhY3RzIHRoZSBtZXRhLWRhdGEgb2YgdGhlIGZpZWxkIGFuZCB0aGUgcHJvcGVydHkuCi0gKiAoQWxzbyB0aGUgYW5ub3RhdGlvbnMgb2Ygc3VwZXIgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcy4pCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3RvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQotICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOwotCi0gICAgICAgIC8vc2hvdWxkIG5ldmVyIG9jY3VyCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpICYmIG9iamVjdCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4ob2JqZWN0LmdldENsYXNzKCkgKyAiIGlzIG5vIHZhbGlkIGNvbXBvbmVudCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCA9IChVSUNvbXBvbmVudCkgb2JqZWN0OwotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGV4dHJhY3RpbmcgbWV0YS1kYXRhIG9mICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5RGV0YWlscyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGdldCBiZWFuIGNsYXNzIGFuZCBwcm9wZXJ0eSBuYW1lCi0gICAgICAgICAqLwotICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKTsKLQotICAgICAgICAvL2NyZWF0ZQotICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnNldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIHByb3BlcnR5RGV0YWlscyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZmluZCBhbmQgYWRkIGFubm90YXRpb25zCi0gICAgICAgICAqLwotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSBlbnRpdHlDbGFzczsKLQotICAgICAgICB3aGlsZSAoIU9iamVjdC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGN1cnJlbnRDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICAgICAgYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9ucyhjdXJyZW50Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudENsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IGVudGl0eUNsYXNzLmdldEludGVyZmFjZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudEludGVyZmFjZTsKLQotICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRDbGFzcyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoY3VycmVudENsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0KLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0cmFjdCBmaW5pc2hlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIHByb3BlcnR5ID0gcHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSk7Ci0KLSAgICAgICAgTWV0aG9kIG1ldGhvZDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0aG9kID0gZW50aXR5LmdldERlY2xhcmVkTWV0aG9kKCJnZXQiICsgcHJvcGVydHkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kID0gZW50aXR5LmdldERlY2xhcmVkTWV0aG9kKCJpcyIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJtZXRob2Qgbm90IGZvdW5kIC0gY2xhc3M6ICIgKyBlbnRpdHkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgLSBtZXRob2RzOiAiICsgImdldCIgKyBwcm9wZXJ0eSArICIgIiArICJpcyIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoQXJyYXlzLmFzTGlzdChtZXRob2QuZ2V0QW5ub3RhdGlvbnMoKSksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBGaWVsZCBmaWVsZDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmllbGQgPSBlbnRpdHkuZ2V0RGVjbGFyZWRGaWVsZChwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWVsZCA9IGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKCJfIiArIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZmllbGQgIiArIHByb3BlcnR5ICsgIiBvciBfIiArIHByb3BlcnR5ICsgIiBub3QgZm91bmQiLCBlMSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoQXJyYXlzLmFzTGlzdChmaWVsZC5nZXRBbm5vdGF0aW9ucygpKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoCi0gICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMsIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uYWRkTWV0YURhdGFFbnRyeShjcmVhdGVNZXRhRGF0YUVudHJ5Rm9yQW5ub3RhdGlvbihhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShhbm5vdGF0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmb3VuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1ldGFEYXRhRW50cnkgY3JlYXRlTWV0YURhdGFFbnRyeUZvckFubm90YXRpb24oQW5ub3RhdGlvbiBmb3VuZEFubm90YXRpb24pCi0gICAgewotICAgICAgICBNZXRhRGF0YUVudHJ5IGVudHJ5ID0gbmV3IE1ldGFEYXRhRW50cnkoKTsKLQotICAgICAgICBlbnRyeS5zZXRLZXkoZm91bmRBbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgZW50cnkuc2V0VmFsdWUoZm91bmRBbm5vdGF0aW9uKTsKLQotICAgICAgICByZXR1cm4gZW50cnk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDgwZDc5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGlzIGZhY3RvcnkgY3JlYXRlcyBhIG1ldGEtZGF0YSBleHRyYWN0b3Igd2hpY2ggZXh0cmFjdHMgdGhlIG1ldGEtZGF0YQotICogb2YgdGhlIHZhbHVlIGJpbmRpbmcgb2YgYSBjb21wb25lbnQuCi0gKiA8cC8+Ci0gKiBvcmRlcjo8YnIvPgotICogPG9sPgotICogICA8bGk+Y29uZmlndXJlZCBtZXRhLWRhdGEgZXh0cmFjdG9yICh3ZWIueG1sKTwvbGk+Ci0gKiAgIDxsaT5jb25maWd1cmVkIG1ldGEtZGF0YSBleHRyYWN0b3IgKGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pPC9saT4KLSAqICAgPGxpPmRlZmF1bHQgaW1wbGVtZW50YXRpb248L2xpPgotICogPC9vbD4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkKLXsKLSAgICBwcml2YXRlIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gbnVsbDsKLQotICAgIHB1YmxpYyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQotICAgIHB1YmxpYyBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGUoKQotICAgIHsKLSAgICAgICAgaWYgKG1ldGFEYXRhRXh0cmFjdG9yID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SKTsKLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SKSk7Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMuYWRkKERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3IgPSAoTWV0YURhdGFFeHRyYWN0b3IpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1ldGFEYXRhRXh0cmFjdG9yICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKG1ldGFEYXRhRXh0cmFjdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjcmVhdGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWV0YURhdGFFeHRyYWN0b3I7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL01ldGFEYXRhRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNDA1MWQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLQotLyoqCi0gKiBBbiBtZXRhLWRhdGEgZXh0cmFjdG9yIGlzIHJlc3BvbnNpYmxlIHRvIGFuYWx5emUgYW4gb2JqZWN0Ci0gKiBhbmQgcmV0dXJucyBhbGwgYXZhaWxhYmxlIG1ldGEtZGF0YSBpbmZvcm1hdGlvbgotICogCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFFeHRyYWN0b3IKLXsKLSAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5OTEyYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSBlcXVpdmFsZW50IHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0Lg0KLSAqDQotICogaWYgdGhlcmUgaXMgYWxzbyBhIHByb3h5IGZvciB0aGUgZXh0cmFjdG9yIHlvdSBjYW4gdXNlIHRoZSBjbGFzc05hbWUgcHJvcGVydHkgdG8gbWFudWFsbHkgcmVwZWF0IHRoZQ0KLSAqIGZ1bGwgcXVhbGlmaWVkIGNsYXNzIG5hbWUuDQotICoNCi0gKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgaW50ZXJmYWNlIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlciBleHRlbmRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbC5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZWE4MTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgZXF1aXZhbGVudCB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0gKg0KLSAqIGlmIHRoZXJlIGlzIGFsc28gYSBwcm94eSBmb3IgdGhlIHRyYW5zZm9ybWVyIHlvdSBjYW4gdXNlIHRoZSBjbGFzc05hbWUgcHJvcGVydHkgdG8gbWFudWFsbHkgcmVwZWF0IHRoZQ0KLSAqIGZ1bGwgcXVhbGlmaWVkIGNsYXNzIG5hbWUuDQotICoNCi0gKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgY2xhc3MgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbCBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXIsIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIHByaXZhdGUgU3RyaW5nIG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWU7DQotDQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKG1ldGFEYXRhRW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoU3RyaW5nIG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSA9IG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhVHJhbnNmb3JtZXIoTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXIgPSBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODliYzM4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyDQotICAgICAgICAuQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcg0KLSAgICAgICAgLkN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXINCi0gICAgICAgIC5EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyDQotICAgICAgICAuU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyDQotICAgICAgICAuQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0NCi0vKioNCi0gKiBGYWN0b3J5IHdoaWNoIGNyZWF0ZXMgdGhlIE1ldGFEYXRhVHJhbnNmb3JtZXIgZm9yIGEgZ2l2ZW4gVmFsaWRhdGlvblN0cmF0ZWd5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIFZhbGlkYXRpb25TdHJhdGVneSAtPiBNZXRhRGF0YVRyYW5zZm9ybWVyIGluc3RlYWQgb2YgTWV0YS1EYXRhIC0+IE1ldGFEYXRhVHJhbnNmb3JtZXINCi0gKiB0byBhdm9pZCBhIHNlY29uZCBzdGF0aWMgbWFwcGluZyBlLmcuIGZvciBqcGEgYW5ub3RhdGlvbnMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWV0YURhdGFUcmFuc2Zvcm1lcj4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZzsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IG5hbWVNYXBwZXJMaXN0DQotICAgICAgICA9IG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PigpOw0KLQ0KLSAgICBzdGF0aWMNCi0gICAgew0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIG5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFUcmFuc2Zvcm1lciBjcmVhdGUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgPSBudWxsOw0KLQ0KLSAgICAgICAgLy9wcm94eSBjaGVjaw0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vaW4gY2FzZSBvZiBhIHByb3h5IGFuZCB0aGUgdXNhZ2Ugb2YgYSBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcg0KLSAgICAgICAgZWxzZSBpZiAodmFsaWRhdGlvblN0cmF0ZWd5IGluc3RhbmNlb2YgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSA9ICgoQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIpdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRTdGF0aWNNYXBwaW5ncygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcuY29udGFpbnNLZXkodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChNZXRhRGF0YVRyYW5zZm9ybWVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSgNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZy5nZXQodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICAgICAgU3RyaW5nIHRyYW5zZm9ybWVyTmFtZTsNCi0gICAgICAgIC8vbnVsbCAtPiB1c2UgbmFtZSBtYXBwZXJzDQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiBuYW1lTWFwcGVyIDogbmFtZU1hcHBlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJhbnNmb3JtZXJOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKHZhbGlkYXRpb25TdHJhdGVneSk7DQotDQotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWVyTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSAoTWV0YURhdGFUcmFuc2Zvcm1lcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodHJhbnNmb3JtZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIHRyYW5zZm9ybWVyTmFtZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIHN5bmNocm9uaXplZCAoRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgICAgICAvL3NldHVwIGludGVybmFsIHN0YXRpYyBtYXBwaW5ncw0KLSAgICAgICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnIDoNCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9DT05GSUcpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBTdHJhdGVneU1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3MpDQotICAgIHsNCi0gICAgICAgIGZvcihTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IG1hcHBpbmcgOiBtYXBwaW5ncykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNYXBwaW5nKG1hcHBpbmcuZ2V0U291cmNlKCksIG1hcHBpbmcuZ2V0VGFyZ2V0KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgdHJhbnNmb3JtZXJOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImFkZGluZyB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1ldGEtZGF0YSB0cmFuc2Zvcm1lciBtYXBwaW5nOiAiDQotICAgICAgICAgICAgICAgICsgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArICIgLT4gIiArIHRyYW5zZm9ybWVyTmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBzeW5jaHJvbml6ZWQgKERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5jbGFzcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLnB1dCh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCB0cmFuc2Zvcm1lck5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNTA0YjIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEFsbG93cyB0byB0cmFuc2Zvcm0gY29uY3JldGUgbWV0YS1kYXRhIHRvIGEgbW9yZSBhYnN0cmFjdCBmb3JtLjxici8+DQotICogZS5nLjogQFJlcXVpcmVkLCBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsLi4uKSwgQExlbmd0aChtaW5pbXVtID0gMSksIC4uLiAtPiByZXF1aXJlZCA9IHRydWUNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi0vLypUcmFuc2Zvcm1lciBpbnN0ZWFkIG9mICpDb252ZXJ0ZXIgdG8gYXZvaWQgbmFtaW5nIGNvbmZ1c2lvbiANCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGEpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGFkYzE2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotICAgIGltcGxlbWVudHMgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ3MjJhOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIC0gaWYgdGhlcmUgaXMgYSBwcm94eSBhcm91bmQgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5IGluc3RhbmNlb2YgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICgoQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIpdmFsaWRhdGlvblN0cmF0ZWd5KS5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3YjJkOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKiAoY29uZmlndXJlZCB2aWEgd2ViLnhtbCkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2FjZDExLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gTWV0YURhdGFUcmFuc2Zvcm1lcnMuDQotICogKGNvbmZpZ3VyZWQgdmlhIGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pDQotICogVGhlIGJlYW4gcHJvdmlkZXMgdGhlIGRlZmF1bHQgbmFtZSAoY29udmVudGlvbikuDQotICogSXQncyBwb3NzaWJsZSB0byBwcm92aWRlIGEgY3VzdG9tIGZ1bGwgcXVhbGlmaWVkIG5hbWUuICg9IGN1c3RvbWl6YWJsZSBjb252ZW50aW9uKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyODY4Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIG1hcHMgRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1ldGFEYXRhVHJhbnNmb3JtZXJzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksIGdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1YjUzZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIHRvIHBsYWNlIFZhbGlkYXRpb25TdHJhdGVnaWVzIGFuZCBNZXRhRGF0YVRyYW5zZm9ybWVycyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZ2V0U2ltcGxlTWV0YURhdGFUcmFuc2Zvcm1lck5hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArICIuIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTWV0YURhdGFUcmFuc2Zvcm1lck5hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneVBhY2thZ2VOYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcG9zdGZpeCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYKTsNCi0NCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5lbmRzV2l0aCgiVmFsaWRhdGlvblN0cmF0ZWd5IikgfHwNCi0gICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5lbmRzV2l0aCgiU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUgKyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCkgLHBvc3RmaXgpDQotICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgiVmFsaWRhdGlvblN0cmF0ZWd5IiwgcG9zdGZpeCkNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCJTdHJhdGVneSIsIHBvc3RmaXgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGEgc3RhdGljIHZhbGlkYXRpb24gc3RyYXRlZ3kgbWFwcGluZw0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneVBhY2thZ2VOYW1lICsgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lICsgcG9zdGZpeDsNCi0gICAgfQ0KLQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjk0OGEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24gaW1wbGVtZW50cyBQcm9wZXJ0eUluZm9ybWF0aW9uCi17Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGluZm9ybWF0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhRW50cnk+IG1ldGFEYXRhTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFbnRyeT4oKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zSW5mb3JtYXRpb24oU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbk1hcC5jb250YWluc0tleShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbk1hcC5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpIGdldEluZm9ybWF0aW9uKGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaW5mb3JtYXRpb25NYXAucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRhRGF0YUVudHJ5W10gZ2V0TWV0YURhdGFFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtZXRhRGF0YUxpc3QudG9BcnJheShuZXcgTWV0YURhdGFFbnRyeVttZXRhRGF0YUxpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpCi0gICAgewotICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnRpZXModGhpcy5pbmZvcm1hdGlvbk1hcCk7Ci0gICAgICAgIHRoaXMubWV0YURhdGFMaXN0LmFkZChtZXRhRGF0YUVudHJ5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eURldGFpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwMzdjZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5RGV0YWlscwotewotICAgIC8vZm9ybXMgdGhlIGlkIGZvciBjcm9zcy12YWxpZGF0aW9uIHdpdGhpbiBjb21wbGV4IGNvbXBvbmVudHMKLSAgICBwcml2YXRlIFN0cmluZyBrZXk7Ci0gICAgcHJpdmF0ZSBPYmplY3QgYmFzZU9iamVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eURldGFpbHMoU3RyaW5nIGtleSwgT2JqZWN0IGJhc2VPYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgICAgICB0aGlzLmJhc2VPYmplY3QgPSBiYXNlT2JqZWN0OwotICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRLZXkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmFzZU9iamVjdCgpCi0gICAgewotICAgICAgICByZXR1cm4gYmFzZU9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlT2JqZWN0KE9iamVjdCBiYXNlT2JqZWN0KQotICAgIHsKLSAgICAgICAgdGhpcy5iYXNlT2JqZWN0ID0gYmFzZU9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxNzNlNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlJbmZvcm1hdGlvbgotewotICAgIGJvb2xlYW4gY29udGFpbnNJbmZvcm1hdGlvbihTdHJpbmcga2V5KTsKLSAgICBPYmplY3QgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSk7Ci0gICAgPFQ+IFQgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpOwotICAgIHZvaWQgc2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKTsKLQotICAgIE1ldGFEYXRhRW50cnlbXSBnZXRNZXRhRGF0YUVudHJpZXMoKTsKLSAgICB2b2lkIGFkZE1ldGFEYXRhRW50cnkoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRlOTI1Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzCi17Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ERVRBSUxTID0gInByb3BlcnR5X2RldGFpbHMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9WQUxJREFUSU9OID0gInNraXBfdmFsaWRhdGlvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJsYWJlbCI7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlY29yZGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzBmMjNmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLQotLyoqCi0gKiBBbGxvd3MgdG8gY2FwdHVyZSBjb252ZXJ0ZWQgdmFsdWVzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyCi17Ci0gICAgdm9pZCByZWNvcmRVc2VySW5wdXQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYzFmOTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5DbGFzc01hcHBpbmdGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLQotLyoqCi0gKiBCYXNlIGZvciBhbGwgUmVuZGVyS2l0V3JhcHBlckZhY3RvcmllcyB0byBmb3JjZSBhIHNwZWNpZmljIGJlaGF2aW91cgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFJlbmRlcktpdCwgUmVuZGVyS2l0PgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSB3cmFwcGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBkZWFjdGl2YXRlZCA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeShBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRoaXMud3JhcHBlZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLndyYXBwZWQuYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkocmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkZWFjdGl2YXRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5kZWFjdGl2YXRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWFjdGl2YXRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVhY3RpdmF0ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFJlbmRlcktpdCBjcmVhdGUoUmVuZGVyS2l0IHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIGlmKGlzRGVhY3RpdmF0ZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBSZW5kZXJLaXQgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBpZih0aGlzLndyYXBwZWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy53cmFwcGVkLmNyZWF0ZShyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVXcmFwcGVyKHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0RlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDdlMDUwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0RlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeQotewotICAgIHByaXZhdGUgUmVuZGVyS2l0IHJlbmRlcktpdDsKLQotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0dmFsIHJlbmRlcmtpdCB3cmFwcGVyIGNyZWF0ZWQgZm9yICIgKyByZW5kZXJLaXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGhpcy5yZW5kZXJLaXQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5yZW5kZXJLaXQgPSBuZXcgRXh0VmFsUmVuZGVyS2l0KHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyS2l0OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxMYXp5UmVuZGVyZXJQcm94eS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzNjI4Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxMYXp5UmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLQotLyoqCi0gKiB0byBzdXBwb3J0IGEgY3VzdG9tIHByb3h5Ci0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIEV4dFZhbExhenlSZW5kZXJlclByb3h5IGV4dGVuZHMgUmVuZGVyZXIKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBSZW5kZXJlciB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbExhenlSZW5kZXJlclByb3h5KFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyZXI7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic2ltcGxlIHByb3h5IGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBnZXRMYXp5UmVuZGVyZXIoKS5kZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRMYXp5UmVuZGVyZXIoKS5jb252ZXJ0Q2xpZW50SWQoZmFjZXNDb250ZXh0LCBzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldExhenlSZW5kZXJlcigpLmdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJlciBnZXRMYXp5UmVuZGVyZXIoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHByb3h5Q2xhc3NOYW1lID0gKFN0cmluZykgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVkpOwotCi0gICAgICAgIGlmKHByb3h5Q2xhc3NOYW1lICE9IG51bGwgJiYgIXByb3h5Q2xhc3NOYW1lLmVuZHNXaXRoKGdldENsYXNzKCkuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShwcm94eUNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmKHRhcmdldENsYXNzID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYSBjdXN0b20gaW52YWxpZCByZW5kZXJlciBwcm94eSBpcyBjb25maWd1cmVkOiAiICsgcHJveHlDbGFzc05hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDbGFzc1tdIGFyZ0NsYXNzZXMgPSBuZXcgQ2xhc3NbMV07Ci0gICAgICAgICAgICBhcmdDbGFzc2VzWzBdID0gUmVuZGVyZXIuY2xhc3M7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGFyZ2V0Q2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJnQ2xhc3Nlcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChSZW5kZXJlciljb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSh0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgY3JlYXRlOiAiICsgdGFyZ2V0Q2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZDsKLSAgICAgICAgfQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMzU0ZTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LlJlc3BvbnNlU3RyZWFtOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VXcml0ZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlc3BvbnNlU3RhdGVNYW5hZ2VyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyS2l0IGV4dGVuZHMgUmVuZGVyS2l0Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLSAgICBwcm90ZWN0ZWQgUmVuZGVyS2l0IHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyS2l0KFJlbmRlcktpdCB3cmFwcGVkKQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsKLQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgaWYgKHJlbmRlcmVyIGluc3RhbmNlb2YgRXh0VmFsUmVuZGVyZXJXcmFwcGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCByZW5kZXJlcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCBjcmVhdGVXcmFwcGVyKHJlbmRlcmVyKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVuZGVyZXIgZ2V0UmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSkKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyIHJlbmRlcmVyID0gd3JhcHBlZC5nZXRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSk7Ci0KLSAgICAgICAgaWYocmVuZGVyZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyIGluc3RhbmNlb2YgRXh0VmFsUmVuZGVyZXJXcmFwcGVyID8gcmVuZGVyZXIgOiBjcmVhdGVXcmFwcGVyKHJlbmRlcmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIud2Fybigibm8gcmVuZGVyZXIgZm91bmQgZm9yIGZhbWlseSAiICsgZmFtaWx5ICsgIiBhbmQgdHlwZSAiICsgcmVuZGVyZXJUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZW5kZXJlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdGF0ZU1hbmFnZXIgZ2V0UmVzcG9uc2VTdGF0ZU1hbmFnZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UmVzcG9uc2VTdGF0ZU1hbmFnZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2VXcml0ZXIgY3JlYXRlUmVzcG9uc2VXcml0ZXIoV3JpdGVyIHdyaXRlciwgU3RyaW5nIHMsIFN0cmluZyBzMSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmNyZWF0ZVJlc3BvbnNlV3JpdGVyKHdyaXRlciwgcywgczEpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZVN0cmVhbSBjcmVhdGVSZXNwb25zZVN0cmVhbShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY3JlYXRlUmVzcG9uc2VTdHJlYW0ob3V0cHV0U3RyZWFtKTsKLSAgICB9Ci0KLSAgICBAVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQotICAgIHByb3RlY3RlZCBSZW5kZXJlciBjcmVhdGVXcmFwcGVyKFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxSZW5kZXJlcldyYXBwZXIocmVuZGVyZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI4MmJiYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogY2VudHJhbCBtZWNoYW5pc20gd2hpY2ggaXMgcmVzcG9uc2libGUgdG8gY3JlYXRlIGEgd3JhcHBlciBmb3IgYSByZW5kZXJlciAtIHN0YXJ0aW5nIHBvaW50IG9mIGV4dHZhbC4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcktpdEZhY3RvcnkgZXh0ZW5kcyBSZW5kZXJLaXRGYWN0b3J5Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLSAgICBwcml2YXRlIFJlbmRlcktpdEZhY3Rvcnkgd3JhcHBlZDsKLQotICAgIHB1YmxpYyBFeHRWYWxSZW5kZXJLaXRGYWN0b3J5KFJlbmRlcktpdEZhY3RvcnkgcmVuZGVyS2l0RmFjdG9yeSkKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHJlbmRlcktpdEZhY3Rvcnk7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJLaXQoU3RyaW5nIHMsIFJlbmRlcktpdCByZW5kZXJLaXQpCi0gICAgewotICAgICAgICB3cmFwcGVkLmFkZFJlbmRlcktpdChzLCByZW5kZXJLaXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZW5kZXJLaXQgZ2V0UmVuZGVyS2l0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgUmVuZGVyS2l0IHJlbmRlcktpdCA9IHRoaXMud3JhcHBlZC5nZXRSZW5kZXJLaXQoZmFjZXNDb250ZXh0LCBzKTsKLQotICAgICAgICAvL2pzZiByaSArIHRyaW5pZGFkCi0gICAgICAgIGlmKHJlbmRlcktpdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnkgd3JhcHBlckZhY3RvcnkgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkKLSAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5SRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZLCBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvL3NvbWUgY29tcG9uZW50IGxpYnMgZS5nLiBteWZhY2VzLXRyaW5pZGFkIGFyZW4ndCBjb21wYXRpYmxlIHdpdGggdGhpcyBjbGVhbiBhcHByb2FjaAotICAgICAgICAvL2V4YW1wbGUgc2VlIFRyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyCi0gICAgICAgIGlmKHdyYXBwZXJGYWN0b3J5LmlzRGVhY3RpdmF0ZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcktpdDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB3cmFwcGVyRmFjdG9yeS5jcmVhdGUocmVuZGVyS2l0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBnZXRSZW5kZXJLaXRJZHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UmVuZGVyS2l0SWRzKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg0OTk0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIHRvIGF2b2lkIG11bHRpcGxlIGNhbGxzIG9mIHJlbmRlcmVyIG1ldGhvZHMgd2l0aGluIHJlbmRlcmVyIGludGVyY2VwdG9ycyAoZS5nLiBmb3IgZW5jb2RlLCBkZWNvZGUsLi4uKQotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyZXJQcm94eSBleHRlbmRzIFJlbmRlcmVyCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZID0gRXh0VmFsUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCkgKyAiOktFWSI7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgd3JhcHBlZDsKLQotICAgIHB1YmxpYyBFeHRWYWxSZW5kZXJlclByb3h5KFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyZXI7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgicHJveHkgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlFbnRyeSBlbnRyeSA9IGdldE9ySW5pdEVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNEZWNvZGVDYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RGVjb2RlQ2FsbGVkKHRydWUpOwotICAgICAgICAgICAgd3JhcHBlZC5kZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImRvdWJsZSBjYWxsIG9mIG1ldGhvZCAnZGVjb2RlJyBmaWx0ZXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eUVudHJ5IGVudHJ5ID0gZ2V0T3JJbml0RW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0VuY29kZUJlZ2luQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldEVuY29kZUJlZ2luQ2FsbGVkKHRydWUpOwotICAgICAgICAgICAgd3JhcHBlZC5lbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZG91YmxlIGNhbGwgb2YgbWV0aG9kICdlbmNvZGVCZWdpbicgZmlsdGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlFbnRyeSBlbnRyeSA9IGdldE9ySW5pdEVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNFbmNvZGVDaGlsZHJlbkNhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXRFbmNvZGVDaGlsZHJlbkNhbGxlZCh0cnVlKTsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImRvdWJsZSBjYWxsIG9mIG1ldGhvZCAnZW5jb2RlQ2hpbGRyZW4nIGZpbHRlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eUVudHJ5IGVudHJ5ID0gZ2V0T3JJbml0RW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0VuY29kZUVuZENhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXRFbmNvZGVFbmRDYWxsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZG91YmxlIGNhbGwgb2YgbWV0aG9kICdlbmNvZGVFbmQnIGZpbHRlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGdldFJlbmRlcnNDaGlsZHJlbigpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZW5kZXJzQ2hpbGRyZW4oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eUVudHJ5IGVudHJ5ID0gZ2V0T3JJbml0RW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKGVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0Q29udmVydGVkVmFsdWUod3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImRvdWJsZSBjYWxsIG9mIG1ldGhvZCAnZ2V0Q29udmVydGVkVmFsdWUnIGZpbHRlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJlclByb3h5RW50cnkgZ2V0T3JJbml0RW50cnkoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBTdHJpbmcga2V5ID0gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBrZXkgKz0gZ2V0T3B0aW9uYWxLZXkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFnZXRPckluaXRDb21wb25lbnRQcm94eU1hcHBpbmcoKS5jb250YWluc0tleShrZXkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRPckluaXRDb21wb25lbnRQcm94eU1hcHBpbmcoKS5wdXQoa2V5LCBuZXcgUmVuZGVyZXJQcm94eUVudHJ5KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXRPckluaXRDb21wb25lbnRQcm94eU1hcHBpbmcoKS5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wdGlvbmFsS2V5KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9TVE9SQUdFX05BTUUgPSBFeHRWYWxSZW5kZXJlclByb3h5LmNsYXNzLmdldE5hbWUoKSArICI6U1RPUkFHRSI7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlFbnRyeT4gZ2V0T3JJbml0Q29tcG9uZW50UHJveHlNYXBwaW5nKCkKLSAgICB7Ci0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsKLQotICAgICAgICBpZighcmVxdWVzdE1hcC5jb250YWluc0tleShQUk9YWV9TVE9SQUdFX05BTUUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXF1ZXN0TWFwLnB1dChQUk9YWV9TVE9SQUdFX05BTUUsIG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eUVudHJ5Pj4oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5RW50cnk+PiBwcm94eVN0b3JhZ2UgPQotICAgICAgICAgICAgKChNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5RW50cnk+PilyZXF1ZXN0TWFwLmdldChQUk9YWV9TVE9SQUdFX05BTUUpKTsKLQotICAgICAgICBTdHJpbmcga2V5ID0gdGhpcy53cmFwcGVkLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCi0gICAgICAgIGlmKCFwcm94eVN0b3JhZ2UuY29udGFpbnNLZXkoa2V5KSkKLSAgICAgICAgewotICAgICAgICAgICAgcHJveHlTdG9yYWdlLnB1dChrZXksIG5ldyBIYXNoTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eUVudHJ5PigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcm94eVN0b3JhZ2UuZ2V0KGtleSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjMzA1ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotCi0vKioKLSAqIERlZmF1bHQgYXBwcm9hY2ggdG8gYXZvaWQgcHJveGllcyBmb3IgY29udmVydGVycyBhbmQgdGhlIGFkYXB0ZXIgZmFsbGJhY2suCi0gKiBJdCByZXF1aXJlcyB0aGF0IGNvbXBvbmVudHMgZGVsZWdhdGUgZ2V0Q29udmVydGVkVmFsdWUgdG8gYSByZW5kZXJlci48YnIvPgotICogSWYgaXQgaXNuJ3QgdGhlIGNhc2UgZm9yIHlvdXIgY29tcG9uZW50IGxpYiB1c2U6Ci0gKiBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5FeHRWYWxBcHBsaWNhdGlvbkZhY3Rvcnk8YnIvPgotICogYW5kPGJyLz4KLSAqIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5LlByb3h5TWFwcGluZ1BoYXNlTGlzdGVuZXIKLSAqIDxwLz4KLSAqIFRoaXMgd3JhcHBlciB3aWxsIGFsc28gaW1wbGVtZW50IGNsaWVudC1zaWRlIHZhbGlkYXRpb24gYmVoYXZpb3VyCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJlcldyYXBwZXIgZXh0ZW5kcyBSZW5kZXJlcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgd3JhcHBlZDsKLSAgICBwcm90ZWN0ZWQgRXh0VmFsQ29udGV4dCBleHRWYWxDb250ZXh0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCk7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyZXJXcmFwcGVyKFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHByb3h5Q2xhc3NOYW1lID0gKFN0cmluZylFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSk7Ci0KLSAgICAgICAgaWYocHJveHlDbGFzc05hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyBleHR2YWwgcmVuZGVyZXIgcHJveHkgY29uZmlndXJlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSBuZXcgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkocmVuZGVyZXIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShwcm94eUNsYXNzTmFtZSk7Ci0KLSAgICAgICAgaWYodGFyZ2V0Q2xhc3MgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyBleHR2YWwgcmVuZGVyZXIgcHJveHkgY29uZmlndXJlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSBuZXcgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkocmVuZGVyZXIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xhc3NbXSBhcmdDbGFzc2VzID0gbmV3IENsYXNzWzFdOwotICAgICAgICBhcmdDbGFzc2VzWzBdID0gUmVuZGVyZXIuY2xhc3M7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGFyZ2V0Q2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJnQ2xhc3Nlcyk7Ci0gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSAoUmVuZGVyZXIpY29uc3RydWN0b3IubmV3SW5zdGFuY2UocmVuZGVyZXIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIud2Fybigibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVyZXIgd3JhcHBlciBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkZWNvZGUgZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRGVjb2RlIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJEZWNvZGUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckRlY29kZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImVuY29kZUJlZ2luIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUJlZ2luIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUJlZ2luIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVFbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZW5jb2RlQ2hpbGRyZW4gZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlQ2hpbGRyZW4gb2YgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUNoaWxkcmVuIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJFbmNvZGVDaGlsZHJlbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVDaGlsZHJlbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQ2hpbGRyZW4gaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJlbmNvZGVFbmQgZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUVuZCBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVFbmQgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGdldFJlbmRlcnNDaGlsZHJlbigpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZW5kZXJzQ2hpbGRyZW4oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLSAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbywgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdCA9IGUuZ2V0UmV0dXJuVmFsdWVPbkV4Y2VwdGlvbihjb252ZXJ0ZWRPYmplY3QpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImdldENvbnZlcnRlZFZhbHVlIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUdldENvbnZlcnRlZFZhbHVlIG9mICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QgPSB3cmFwcGVkLmdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8pOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyR2V0Q29udmVydGVkVmFsdWUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvLCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyR2V0Q29udmVydGVkVmFsdWUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckdldENvbnZlcnRlZFZhbHVlIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZE9iamVjdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9SZW5kZXJlclByb3h5RW50cnkuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L1JlbmRlcmVyUHJveHlFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWU1N2Y5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L1JlbmRlcmVyUHJveHlFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIFJlbmRlcmVyUHJveHlFbnRyeQotewotICAgIHByaXZhdGUgYm9vbGVhbiBkZWNvZGVDYWxsZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlQmVnaW5DYWxsZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlRW5kQ2FsbGVkID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIE9iamVjdCBjb252ZXJ0ZWRWYWx1ZSA9IG51bGw7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlY29kZUNhbGxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVjb2RlQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlY29kZUNhbGxlZChib29sZWFuIGRlY29kZUNhbGxlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVjb2RlQ2FsbGVkID0gZGVjb2RlQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlQmVnaW5DYWxsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVuY29kZUJlZ2luQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kZUJlZ2luQ2FsbGVkKGJvb2xlYW4gZW5jb2RlQmVnaW5DYWxsZWQpCi0gICAgewotICAgICAgICB0aGlzLmVuY29kZUJlZ2luQ2FsbGVkID0gZW5jb2RlQmVnaW5DYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmNvZGVDaGlsZHJlbkNhbGxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlQ2hpbGRyZW5DYWxsZWQoYm9vbGVhbiBlbmNvZGVDaGlsZHJlbkNhbGxlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZW5jb2RlQ2hpbGRyZW5DYWxsZWQgPSBlbmNvZGVDaGlsZHJlbkNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuY29kZUVuZENhbGxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZW5jb2RlRW5kQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kZUVuZENhbGxlZChib29sZWFuIGVuY29kZUVuZENhbGxlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZW5jb2RlRW5kQ2FsbGVkID0gZW5jb2RlRW5kQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlZFZhbHVlKE9iamVjdCBjb252ZXJ0ZWRWYWx1ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29udmVydGVkVmFsdWUgPSBjb252ZXJ0ZWRWYWx1ZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzJlZWY5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDllOTZjZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM3YzY0YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlJlbmRlcmVySW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICAgIHByb3RlY3RlZCBSZW5kZXJlckludGVyY2VwdG9yIGV4Y2VwdGlvblNvdXJjZTsKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGluZm9ybWF0aW9uOwotICAgIGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbigpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzKQotICAgIHsKLSAgICAgICAgdGhpcy5za2lwT3RoZXJJbnRlcmNlcHRvcnMgPSBza2lwT3RoZXJJbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgcHVibGljIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oYm9vbGVhbiBza2lwT3RoZXJJbnRlcmNlcHRvcnMsIFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHRoaXMoc2tpcE90aGVySW50ZXJjZXB0b3JzKTsKLSAgICAgICAgdGhpcy5leGNlcHRpb25Tb3VyY2UgPSByZW5kZXJlckludGVyY2VwdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEluZm9ybWF0aW9uKE9iamVjdCBpbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIHRoaXMuaW5mb3JtYXRpb24gPSBpbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEluZm9ybWF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NraXBPdGhlckludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gc2tpcE90aGVySW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmV0dXJuVmFsdWVPbkV4Y2VwdGlvbihPYmplY3QgY3VycmVudFJldHVyblZhbHVlKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5leGNlcHRpb25Tb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhjZXB0aW9uU291cmNlLmdldFJldHVyblZhbHVlT25Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKHRoaXMsIGN1cnJlbnRSZXR1cm5WYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRSZXR1cm5WYWx1ZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0Fic3RyYWN0U3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIwOThiYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIGV4ZWN1dGUgbG9naWMganVzdCBvbmNlLg0KLSAqIGUuZy4gcmVnaXN0ZXIgYXJ0aWZhY3RzIHZpYSBhcGkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgLy9kb24ndCByZW1vdmUgLSBpdCdzIGEgZmFsbGJhY2sgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggZGVyZWdpc3RyYXRpb24NCi0gICAgLy90YXJnZXQ6IGRvbid0IHByb2Nlc3MgaW5pdCBsb2dpYyBtb3JlIHRoYW4gb25jZQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENsYXNzPiBpbml0aWFsaXplZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICAgICAgc3luY2hyb25pemVkIChBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5jbGFzcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIWluaXRpYWxpemVkTGlzdGVuZXJzLmNvbnRhaW5zKGdldENsYXNzKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oInN0YXJ0IGluaXQgb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluaXQoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImluaXQgb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBKc2ZVdGlscy5kZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcih0aGlzKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBkZXJlZ2lzdGVyaW5nIHRoZSBwaGFzZS1saXN0ZW5lciINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtPiB0aGVyZSBpcyBqdXN0IGEgbGl0dGxlIG92ZXJoZWFkLCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBidXQgZXZlcnl0aGluZyBlbHNlIHdvcmtzIGNvcnJlY3RseS4iDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaG93ZXZlciwgcGxlYXNlIGluZm9ybSB0aGUgY29tbXVuaXR5IGFib3V0IHlvdXIgY29uZmlndXJhdGlvbiIsIHQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWRMaXN0ZW5lcnMuYWRkKGdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5SRVNUT1JFX1ZJRVc7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdCgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYWE3MjcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0V4dFZhbFN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIKLXsKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydGluZyB1cCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIHYiICsgRXh0VmFsSW5mb3JtYXRpb24uVkVSU0lPTik7Ci0gICAgICAgIH0KLQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsKLQotICAgICAgICBleGVjdXRlQ3VzdG9tU3RhcnR1cExpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVDdXN0b21TdGFydHVwTGlzdGVuZXIoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkKLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVksIEV4dFZhbFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpLCBmYWxzZSk7Ci0KLSAgICAgICAgU3RyaW5nIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lck5hbWUgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVJUVVBfTElTVEVORVIpOwotICAgICAgICBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lciBjdXN0b21TdGFydHVwTGlzdGVuZXIgPQotICAgICAgICAgICAgKEFic3RyYWN0U3RhcnR1cExpc3RlbmVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjdXN0b21TdGFydHVwTGlzdGVuZXJOYW1lKTsKLQotICAgICAgICBpZihjdXN0b21TdGFydHVwTGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnQgaW5pdCBvZiAiICsgY3VzdG9tU3RhcnR1cExpc3RlbmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3VzdG9tU3RhcnR1cExpc3RlbmVyLmluaXQoKTsKLQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiaW5pdCBvZiAiICsgY3VzdG9tU3RhcnR1cExpc3RlbmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YzgwNWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOw0KLQ0KLS8qKg0KLSAqIE1lc3NhZ2VSZXNvbHZlciB3aGljaCB1c2VzIHByb3BlcnR5IGZpbGVzLg0KLSAqIFN1YmNsYXNzZXMganVzdCBoYXZlIHRvIHByb3ZpZGUgdGhlIHBhY2thZ2UgdG8gbG9vayBhdC4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBjYW4gYWxzbyBwcm92aWRlIGEgY3VzdG9tIG5hbWUgd2hpY2ggaXMgZS5nLiBjb25maWd1cmVkIHZpYSB3ZWIueG1sLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgaW1wbGVtZW50cyBNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSID0gIj8/PyI7DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb24gPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT047DQotICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGRlZmF1bHRCdW5kbGUgPSBudWxsOw0KLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlQnVuZGxlQmFzZU5hbWU7DQotICAgIC8vd2l0aCBqc2YgMS4xIG9ubHkgYXZhaWxhYmxlIGlmIHRoZXJlIGlzIGEgY3VzdG9tIGJlYW4NCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZUJ1bmRsZVZhck5hbWU7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIGlmIChrZXkgPT0gbnVsbCB8fCBrZXkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjdXN0b21NZXNzYWdlID0gbnVsbDsNCi0NCi0gICAgICAgIC8vb25seSBpbiBjYXNlIG9mIGEgVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIHdoaWNoIGlzIGNvbmZpZ3VyZWQgYXMgYmVhbg0KLSAgICAgICAgaWYgKHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUodGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUsIGxvY2FsZSk7DQotICAgICAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJtZXNzYWdlIGJ1bmRsZSAiICsgdGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUgKyAiIG5vdCBmb3VuZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9vbmx5IGluIGNhc2Ugb2YgYSBWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggaXMgY29uZmlndXJlZCBhcyBiZWFuDQotICAgICAgICBpZiAodGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSAhPSBudWxsICYmIGN1c3RvbU1lc3NhZ2UgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IChSZXNvdXJjZUJ1bmRsZSkgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKG1lc3NhZ2VCdW5kbGVWYXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm1lc3NhZ2UgYnVuZGxlIHZhciBuYW1lICIgKyB0aGlzLm1lc3NhZ2VCdW5kbGVWYXJOYW1lICsgIiBub3QgZm91bmQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChjdXN0b21NZXNzYWdlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2U7DQotICAgICAgICB9DQotDQotICAgICAgICAvKg0KLSAgICAgICAgICogdHJ5IHRvIHVzZSB0aGUgY29udmVudGlvbiBmb3IgdGhlIG1lc3NhZ2UgYnVuZGxlDQotICAgICAgICAgKi8NCi0gICAgICAgIGN1c3RvbU1lc3NhZ2UgPSB0cnlUb1VzZU1lc3NhZ2VCdW5kbGVDb252ZW50aW9uKGtleSwgbG9jYWxlKTsNCi0NCi0gICAgICAgIGlmIChjdXN0b21NZXNzYWdlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2U7DQotICAgICAgICB9DQotDQotICAgICAgICAvKg0KLSAgICAgICAgICogbm8gbWVzc2FnZSBidW5kbGUgb3IgbWVzc2FnZSBmb3VuZCAod2l0aCB0aGUgY29udmVudGlvbik/DQotICAgICAgICAgKi8NCi0NCi0gICAgICAgIC8vdHJ5IHRvIGxvYWQgY3VzdG9tIG1lc3NhZ2VzDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShnZXRDdXN0b21CYXNlTmFtZSgpLCBsb2NhbGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gY3VzdG9tIG1lc3NhZ2UgZm9yICIgKyBrZXkgKyAiIHdpdGhpbiAiICsgZ2V0Q3VzdG9tQmFzZU5hbWUoKSwgZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvL3VzZSBjdXN0b20gbmFtZSAoaWYgcG9zc2libGUpIG90aGVyd2lzZTogZmFsbGJhY2sgdG8gZGVmYXVsdCBtZXNzYWdlIChpZiBwb3NzaWJsZSkNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoY3VzdG9tTWVzc2FnZSAhPSBudWxsKSA/IGN1c3RvbU1lc3NhZ2UNCi0gICAgICAgICAgICAgICAgOiAoZ2V0QmFzZU5hbWUoKSAhPSBudWxsKSA/IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShnZXRCYXNlTmFtZSgpLCBsb2NhbGUpLmdldFN0cmluZyhrZXkpIDogbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIgKyBrZXkgKyBNSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb1VzZU1lc3NhZ2VCdW5kbGVDb252ZW50aW9uKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjdXN0b21NZXNzYWdlID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICgoZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID09IG51bGwgfHwgIWRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICAgICAgJiYgaXNEZWZhdWx0TWVzc2FnZUJ1bmRsZUNvbnZlbnRpb25BY3RpdmUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZGVmYXVsdEJ1bmRsZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9CVU5ETEVfTkFNRSksIGxvY2FsZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgICAgICAgICAgICAgICAgIGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbiA9ICJ0cnVlIjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoZGVmYXVsdEJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSBkZWZhdWx0QnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nDQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlZmF1bHRNZXNzYWdlQnVuZGxlQ29udmVudGlvbkFjdGl2ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0QmFzZU5hbWUoKTsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21CYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VCdW5kbGVCYXNlTmFtZShTdHJpbmcgbWVzc2FnZUJ1bmRsZUJhc2VOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSA9IG1lc3NhZ2VCdW5kbGVCYXNlTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlQnVuZGxlVmFyTmFtZShTdHJpbmcgbWVzc2FnZUJ1bmRsZVZhck5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZUJ1bmRsZVZhck5hbWUgPSBtZXNzYWdlQnVuZGxlVmFyTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI4MTBhYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuDQotICAgICAgICByZXNvbHZlci5tYXBwZXIuQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuDQotICAgICAgICByZXNvbHZlci5tYXBwZXIuQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuDQotICAgICAgICByZXNvbHZlci5tYXBwZXIuRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuDQotICAgICAgICByZXNvbHZlci5tYXBwZXIuRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuDQotICAgICAgICByZXNvbHZlci5tYXBwZXIuU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBGYWN0b3J5IHdoaWNoIGNyZWF0ZXMgYSBNZXNzYWdlUmVzb2x2ZXIgZm9yIGEgZ2l2ZW4gVmFsaWRhdGlvblN0cmF0ZWd5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdlbmVyaWMgamF2YSBhcGkgKGRlLS9yZWdpc3RlciBtYXBwaW5nKSIpDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkgaW1wbGVtZW50cw0KLSAgICBDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWVzc2FnZVJlc29sdmVyPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmc7DQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBuYW1lTWFwcGVyTGlzdCA9DQotICAgICAgICBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0NCi0gICAgc3RhdGljDQotICAgIHsNCi0gICAgICAgIG5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIG5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlUmVzb2x2ZXIgY3JlYXRlKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHN0cmF0ZWd5TmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChNZXNzYWdlUmVzb2x2ZXIpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmdldChzdHJhdGVneU5hbWUpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICBTdHJpbmcgcmVzb2x2ZXJOYW1lOw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vYnVpbGQgY29udmVudGlvbiAoVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKQ0KLSAgICAgICAgICAgIHJlc29sdmVyTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIC8vbmFtZSB3YXNuJ3QgbWFwcGVkDQotICAgICAgICAgICAgaWYgKHJlc29sdmVyTmFtZSA9PSBudWxsIHx8IHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMocmVzb2x2ZXJOYW1lKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtZXNzYWdlUmVzb2x2ZXIgPSAoTWVzc2FnZVJlc29sdmVyKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUocmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWVzc2FnZVJlc29sdmVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKHN0cmF0ZWd5TmFtZSwgcmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZXNvbHZlck5hbWUgKyAiIHVzZWQgZm9yICIgKyBzdHJhdGVneU5hbWUpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYWRkTWFwcGluZyhzdHJhdGVneU5hbWUsIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0U3RhdGljTWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKERlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgOg0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9DT05GSUcpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBTdHJhdGVneU1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZyxTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWFwcGluZy5nZXRTb3VyY2UoKSwgbWFwcGluZy5nZXRUYXJnZXQoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgU3RyaW5nIG1lc3NhZ2VSZXNvbHZlck5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkaW5nIHN0YXRpYyB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1lc3NhZ2UgcmVzb2x2ZXIgbWFwcGluZzogIg0KLSAgICAgICAgICAgICAgICArIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgKyAiIC0+ICIgKyBtZXNzYWdlUmVzb2x2ZXJOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHN5bmNocm9uaXplZCAoRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuY2xhc3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLnB1dCh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBtZXNzYWdlUmVzb2x2ZXJOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OWVkYzYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogRGVmYXVsdCBNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggdXNlcyB0aGUgZGVmYXVsdCBjb252ZW50aW9uIGZvciB0aGUgbWVzc2FnZSBidW5kbGUuDQotICogSXQncyBwb3NzaWJsZSB0byBwcm92aWRlIGEgY3VzdG9tIG1lc3NhZ2UgYnVuZGxlIHZpYSB3ZWIueG1sDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQlVORExFID0gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVNTQUdFX0JVTkRMRTsNCi0NCi0gICAgLy9ub3QgdXNlZCBhdCB0aGUgbW9tZW50IC0ganVzdCBmb3IgYSBjb252ZW50aW9uDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TW9kdWxlTWVzc2FnZUJ1bmRsZU5hbWUoZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENVU1RPTV9CVU5ETEU7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNjYTFjMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSBmb3IgTWVzc2FnZVJlc29sdmVycyBpbmRlcGVuZGVudCBvZiB0aGUgbWVzc2FnZSBzb3VyY2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGQ0MGI2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NzQwMWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gTWVzc2FnZVJlc29sdmVycy4NCi0gKiAoY29uZmlndXJlZCB2aWEgd2ViLnhtbCkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfTkFNRV9NQVBQRVI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzcyMDM1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgVmFsaWRhdGlvblN0cmF0ZWd5IHRvIE1lc3NhZ2VSZXNvbHZlci4NCi0gKiAoY29uZmlndXJlZCB2aWEgaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbikNCi0gKiBUaGUgYmVhbiBwcm92aWRlcyB0aGUgZGVmYXVsdCBuYW1lIChjb252ZW50aW9uKS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gZnVsbCBxdWFsaWZpZWQgbmFtZS4gKD0gY3VzdG9taXphYmxlIGNvbnZlbnRpb24pDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTVNHX1JFU09MVkVSX05BTUVfTUFQUEVSKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYjU5YjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJbiBvcmRlciB0byBwcm92aWRlIGEgTmFtZU1hcHBlciBwZXIgdmFsaWRhdGlvbiBtb2R1bGUuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgc3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NDgzOGIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBtYXBzIEV4dFZhbCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBFeHRWYWwgTWVzc2FnZVJlc29sdmVycy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBzdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1lc3NhZ2VSZXNvbHZlckNsYXNzTmFtZShzdHJhdGVneUNsYXNzTmFtZSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI2MDZmNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIHRvIHBsYWNlIFZhbGlkYXRpb25TdHJhdGVnaWVzIGFuZCBNZXNzYWdlUmVzb2x2ZXJzIGluIHRoZSBzYW1lIHBhY2thZ2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgc3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjdXN0b21Qb3N0Zml4ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFX1JFU09MVkVSX1BPU1RGSVgpOw0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZShzdHJhdGVneUNsYXNzTmFtZSwgY3VzdG9tUG9zdGZpeCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGRlYWJmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLk1lc3NhZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotCi0vKioKLSAqIFByb3ZpZGVzIHRoZSBhYmlsaXR5IG9mIG1lc3NhZ2UgcmVzb2x2aW5nIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuUkVVU0V9KQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ci17Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVggPSAiX2RldGFpbCI7Ci0gICAgLy9lLmcuIGZvciBpbmplY3RpbmcgYSBtZXNzYWdlIHJlc29sdmVyIHZpYSBzcHJpbmcKLSAgICBwcml2YXRlIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXI7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICBMb2NhbGUgbG9jYWxlID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCk7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZVJlc29sdmVyICE9IG51bGwgPyB0aGlzLm1lc3NhZ2VSZXNvbHZlci5nZXRNZXNzYWdlKGtleSwgbG9jYWxlKSA6Ci0gICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodGhpcykuZ2V0TWVzc2FnZShrZXksIGxvY2FsZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KEFubm90YXRpb24gYW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiByZXNvbHZlTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbikpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKEFubm90YXRpb24gYW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pOwotICAgICAgICAgICAgcmV0dXJuIChrZXkgIT0gbnVsbCkgPyByZXNvbHZlTWVzc2FnZShrZXkgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCkgOiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBrZXkgIiArIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKSArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLAotICAgICAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEZhY2VzTWVzc2FnZSBnZXRWYWxpZGF0aW9uRXJyb3JGYWNlc01hc3NhZ2UoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLAotICAgICAgICAgICAgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uKSwgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pOwotCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZVJlc29sdmVyKE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXIpCi0gICAgewotICAgICAgICB0aGlzLm1lc3NhZ2VSZXNvbHZlciA9IG1lc3NhZ2VSZXNvbHZlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICAgIG1ldGFEYXRhRW50cnkuc2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwsIGdldExhYmVsKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnkpKTsKLQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uKTsKLSAgICB9Ci0KLSAgICAvL2ZvciBjdXN0b20gYW5ub3RhdGlvbnMgLSBvdmVycmlkZSBpZiBuZWVkZWQKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODk0NmIxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogUHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gdXNlIFZhbGlkYXRvckV4Y2VwdGlvbiAoYXMgZXhwZWN0ZWQgYnkgdGhlIHVzZXIpIGluc3RlYWQgb2YgQ29udmVydGVyRXhjZXB0aW9uLg0KLSAqIEZ1cnRoZXJtb3JlIGl0IHByb3ZpZGVzOjxici8+DQotICogaW5pdFZhbGlkYXRpb248YnIvPg0KLSAqIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGluaXRWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpbml0VmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJpbml0VmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7DQotICAgICAgICB9DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgcHJvY2Vzc1ZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHJvY2Vzc1ZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgicHJvY2Vzc1ZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICI6IHRocm93IG9yaWdpbmFsIGV4Y2VwdGlvbiBhZnRlciBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24iKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29udmVydGVyRXhjZXB0aW9uKGUuZ2V0RmFjZXNNZXNzYWdlKCksIGUpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAiOiBvcmlnaW5hbCBleGNlcHRpb24gYWZ0ZXIgcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICAvL292ZXJyaWRlIGlmIG5lZWRlZA0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uLCB0aGlzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjVkYzRlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIGl0J3MganVzdCBhIGhlbHBlciBmb3IgcHJveGllcyAtIHlvdSBqdXN0IG5lZWQgaXQsIGlmIHlvdSBkZWZpbmUgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0Lg0KLQ0KLSAqIGFkYXB0ZXIgdG8gY29ubmVjdCB2YWxpZGF0aW9uIHN0cmF0ZWdpZXMgd2l0aCBtZXRhLWRhdGEgdHJhbnNmb3JtZXJzLA0KLSAqIGlmIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIGRlZmluZWQgYXMgYmVhbiBhbmQgZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGludGVyZmFjZSBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlciBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgLy90byBnZXQgYmFjayB0aGUgaW50ZXJuYWwgY2FzaGluZw0KLSAgICBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKCk7DQotDQotICAgIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1Y2I2My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0NCi0gKiBhZGFwdGVyIHRvIGNvbm5lY3QgdmFsaWRhdGlvbiBzdHJhdGVnaWVzIHdpdGggbWV0YS1kYXRhIHRyYW5zZm9ybWVycywNCi0gKiBpZiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBkZWZpbmVkIGFzIGJlYW4gYW5kIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwgaW1wbGVtZW50cyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIHByaXZhdGUgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgLy9vcHRpb25hbCBmYWxsYmFjayBmb3IgaW50ZXJuYWwgY2FzaGluZw0KLSAgICBwcml2YXRlIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7DQotDQotICAgIHB1YmxpYyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIgaW5zdGFuY2VvZiBCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcikgbWV0YURhdGFUcmFuc2Zvcm1lciApLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhVHJhbnNmb3JtZXIoTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXIgPSBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uU3RyYXRlZ3koVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3kgPSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOGEzZTYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyDQotICAgIC5Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXINCi0gICAgLkN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcg0KLSAgICAuQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyDQotICAgIC5EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXINCi0gICAgLlNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyB0aGUgVmFsaWRhdGlvblN0cmF0ZWd5IGZvciBhIGdpdmVuIE1ldGEtRGF0YSBLZXkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJhZGQgZ2VuZXJpYyBqYXZhIGFwaSAoZGUtL3JlZ2lzdGVyIG1hcHBpbmcpIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8U3RyaW5nLCBWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+IG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyTGlzdCA9DQotICAgICAgICBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4oKTsNCi0NCi0gICAgc3RhdGljDQotICAgIHsNCi0gICAgICAgIG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IEN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsNCi0gICAgICAgIG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7DQotDQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsNCi0gICAgICAgIG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOw0KLSAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJMaXN0LmFkZChuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoDQotICAgICAgICAgICAgbmV3IERlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsNCi0gICAgICAgIG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyTGlzdC5hZGQobmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIG5ldyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgY3JlYXRlKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgaWYgKG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcuY29udGFpbnNLZXkobWV0YURhdGFLZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lJbnN0YW5jZShtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZy5nZXQobWV0YURhdGFLZXkpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgICAgICBTdHJpbmcgc3RyYXRlZ3lOYW1lOw0KLSAgICAgICAgLy9udWxsIC0+IHVzZSBuYW1lIG1hcHBlcnMNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxTdHJpbmc+IG5hbWVNYXBwZXIgOiBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RyYXRlZ3lOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKG1ldGFEYXRhS2V5KTsNCi0NCi0gICAgICAgICAgICBpZiAoc3RyYXRlZ3lOYW1lID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5SW5zdGFuY2Uoc3RyYXRlZ3lOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKG1ldGFEYXRhS2V5LCBzdHJhdGVneU5hbWUpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZQ0KLSAgICAgICAgICAgIC5zdGFydHNXaXRoKEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLlBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFZhbGlkYXRpb25TdHJhdGVneSkgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKHZhbGlkYXRpb25TdHJhdGVneU5hbWUNCi0gICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuUFJFRklYX0ZPUl9CRUFOX01BUFBJTkcubGVuZ3RoKCkpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFZhbGlkYXRpb25TdHJhdGVneSkgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIG1ldGFEYXRhS2V5LCBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZGRpbmcgbWV0YS1kYXRhIGtleSB0byB2YWxpZGF0aW9uIHN0cmF0ZWd5IG1hcHBpbmc6ICINCi0gICAgICAgICAgICAgICAgKyBtZXRhRGF0YUtleSArICIgLT4gIiArIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc3luY2hyb25pemVkIChEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5jbGFzcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZy5wdXQobWV0YURhdGFLZXksIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIHN5bmNocm9uaXplZCAoRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuY2xhc3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgICAgICAvL3NldHVwIGludGVybmFsIHN0YXRpYyBtYXBwaW5ncw0KLSAgICAgICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnIDoNCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgPSBuZXcgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAgICAgLy90cnkgdG8gc2V0dXAgbWFwcGluZyB3aXRoIGJhc2UgbmFtZSBieSBjb252ZW50aW9uIC0gb3ZlcnJpZGVzIGRlZmF1bHQgbWFwcGluZw0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9idWlsZCBjb252ZW50aW9uIChzdHJhdGVneSBtYXBwaW5nKQ0KLSAgICAgICAgICAgICAgICBzdGF0aWNDb25maWcuc2V0U291cmNlT2ZNYXBwaW5nKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFKSk7DQotDQotICAgICAgICAgICAgICAgIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy9zZXR1cCBjdXN0b20gbWFwcGluZyAtIG92ZXJyaWRlcyBhbGwgb3RoZXIgbWFwcGluZ3MNCi0gICAgICAgICAgICBTdHJpbmcgY3VzdG9tTWFwcGluZ0Jhc2VOYW1lID0gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9TVEFUSUNfVkFMSURBVElPTl9TVFJBVEVHWV9NQVBQSU5HOw0KLSAgICAgICAgICAgIGlmIChjdXN0b21NYXBwaW5nQmFzZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNDb25maWcgPSBuZXcgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNDb25maWcuc2V0U291cmNlT2ZNYXBwaW5nKGN1c3RvbU1hcHBpbmdCYXNlTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cFN0cmF0ZWd5TWFwcGluZ3MoTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhtYXBwaW5nLmdldFNvdXJjZSgpLCBtYXBwaW5nLmdldFRhcmdldCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NTUyM2QuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEJhc2UgaW50ZXJmYWNlIGZvciBWYWxpZGF0aW9uU3RyYXRlZ2llcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotLy8qVmFsaWRhdGlvblN0cmF0ZWd5IGluc3RlYWQgb2YgKlZhbGlkYXRvciB0byBhdm9pZCBuYW1pbmcgY29uZnVzaW9uIA0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fic3RyYWN0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2NjNzJiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWEzYjYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIE5hbWUgTWFwcGVyIHdoaWNoIGRlbGVnYXRlcyB0aGUgbmFtZSBtYXBwaW5nLCBleHRyYWN0IHRoZSBuYW1lIGFuZCBjb252ZXJ0IGl0IHRvIGEgYmVhbiBuYW1lICsgcHJlZml4DQotICogdGFyZ2V0OiBjb25maWd1cmUgYSB2YWxpZGF0aW9uIHN0cmF0ZWd5IHZpYSBhIG1hbmFnZWQgYmVhbiBmYWNpbGl0eSAtPiBhbGxvd3MgdG8gaW5qZWN0IG90aGVyIGJlYW5zDQotICogaW5zdGVhZCBvZiBhcGkgY2FsbHMgKyBoYXJkY29kZWQgYmVhbiBuYW1lcw0KLSAqIDxwLz4NCi0gKiBhbGxvd2VkIGJlYW4gc2NvcGVzOg0KLSAqIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIHN0YXRlbGVzczogYXBwbGljYXRpb24vc2luZ2xldG9uDQotICogdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgc3RhdGVmdWw6IG5vbmUvcHJvdG90eXBlDQotICogZG9uJ3QgdXNlIHRoZSBzZXNzaW9uIG9yIGEgY29udmVyc2F0aW9uIHNjb3BlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0ZPUl9CRUFOX01BUFBJTkcgPSAiYmVhbjoiOw0KLSAgICBwcml2YXRlIE5hbWVNYXBwZXI8U3RyaW5nPiB3cmFwcGVkOw0KLQ0KLSAgICBwdWJsaWMgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoTmFtZU1hcHBlcjxTdHJpbmc+IG5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IG5hbWVNYXBwZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuYW1lID0gd3JhcHBlZC5jcmVhdGVOYW1lKHNvdXJjZSk7DQotDQotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOw0KLSAgICAgICAgcmV0dXJuIFBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HICsgbmFtZS5zdWJzdHJpbmcoMCwgMSkudG9Mb3dlckNhc2UoKSArIG5hbWUuc3Vic3RyaW5nKDEpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZlMWY2ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBBbm5vdGF0aW9ucyB0byBWYWxpZGF0aW9uU3RyYXRlZ2llcy4NCi0gKiAoY29uZmlndXJlZCB2aWEgd2ViLnhtbCkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y4ZGRmYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIEFubm90YXRpb25zIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYThkZjU5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFwcyBFeHRWYWwgQW5ub3RhdGlvbnMgdG8gRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUobWV0YURhdGFLZXkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZjQ1YmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciB0byBwbGFjZSBBbm5vdGF0aW9ucyBhbmQgVmFsaWRhdGlvblN0cmF0ZWdpZXMgaW4gdGhlIHNhbWUgcGFja2FnZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5ICsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Qcmlvcml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTFhYTMzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGVudW0gUHJpb3JpdHkKLXsKLSAgICBCTE9DS0lORywKLSAgICBISUdILAotICAgIE1FRElVTSwKLSAgICBMT1cKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Ub0RvLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Ub0RvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNDQ2ZjguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVG9Eby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotcHVibGljIEBpbnRlcmZhY2UgVG9EbwotewotICAgIFByaW9yaXR5IHZhbHVlKCk7Ci0gICAgU3RyaW5nIGRlc2NyaXB0aW9uKCkgZGVmYXVsdCAiIjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0N2IzODUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VDYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi0vKioKLSAqIEFQSTo8YnIvPgotICogcGFydHMgeW91IG1pZ2h0IG5lZWQgZm9yIGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMgYW5kIHdoaWNoIGFyZSBxdWl0ZSBzdGFibGUgaW4gdmlldyBvZiBjaGFuZ2VzCi0gKiA8cC8+Ci0gKiBJTlRFUk5BTDo8YnIvPgotICogaWYgeW91IHRoaW5rIGFib3V0IHJlZmVyZW5jaW5nIGFuIGFydGlmYWN0IHdoaWNoIGlzIG1hcmtlZCBhcyBpbnRlcm5hbCwgYXNrIGZvciBzdXBwb3J0LgotICogdGhlcmUgc2hvdWxkIGJlIGEgYmV0dGVyIHNvbHV0aW9uCi0gKiA8cC8+Ci0gKiBDVVNUT01JWkFCTEU6PGJyLz4KLSAqIGEgcGxhbm5lZCBleHRlbnNpb24gcG9pbnQgd2hpY2ggY29udGFpbnMgbG9naWMgdG8gY3VzdG9taXplIHRoZSBmcmFtZXdvcmsuCi0gKiBpZiBpdCBpc24ndCBhbHNvIG1hcmtlZCBhcyBBUEkgaXQgbWlnaHQgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcy4KLSAqIGhvd2V2ZXIsIHdlIHRyeSB0byBrZWVwIGl0IGFzIHN0YWJsZSBhcyBwb3NzaWJsZSBhbmQgcmVhc29uYWJsZS4KLSAqIDxwLz4KLSAqIFJFVVNFOjxici8+Ci0gKiBhbiBhcnRpZmFjdCB3aGljaCB5b3UgY2FuIHJldXNlIGZvciBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbi4KLSAqIGlmIGl0IGlzbid0IG1hcmtlZCBhcyBBUEkgaXQgbWlnaHQgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcy4KLSAqIGhvd2V2ZXIsIHdlIHRyeSB0byBrZWVwIGl0IGFzIHN0YWJsZSBhcyBwb3NzaWJsZSBhbmQgcmVhc29uYWJsZS4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1wdWJsaWMgZW51bSBVc2FnZUNhdGVnb3J5Ci17Ci0gICAgQVBJLAotICAgIElOVEVSTkFMLAotICAgIENVU1RPTUlaQUJMRSwKLSAgICBSRVVTRQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTk0OTVmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlSW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBpdCdzIGFuIGludGVybmFsIGFubm90YXRpb24gdG8gcHJvdmlkZSBzb21lIGluZm9ybWF0aW9uCi0gKiA8cC8+Ci0gKiBlLmcuOiBzb21lIG1lY2hhbmlzbXMgYXJlbid0IGRlcHJlY2F0ZWQKLSAqIHRoZXkgYXJlIGUuZy4gZmFsbGJhY2tzLCBhbHRlcm5hdGl2ZXMsLi4uCi0gKiBpbiBvcmRlciB0byBhdm9pZCB0aGUgZGVwcmVjYXRlZCBhbm5vdGF0aW9uIGl0J3MgcG9zc2libGUgdG8gdXNlIHRoaXMgb25lLgotICogeW91IGNhbiB0ZWxsIG90aGVyIGRldmVsb3BlcnM6Ci0gKiB0aGlzIGFydGlmYWN0IGlzbid0IHVzZWQgZm9yIHRoZSBkZXNpcmVkIGFwcHJvYWNoLCBob3dldmVyLCBpdCdzIHN0aWxsIGVzc2VudGlhbCB0byBoYXZlIGl0IGFzIC4uLgotICogPHAvPgotICogaWRlYTogdW5pZnkgc21hbGwgcGFydHMgb2YgaW5mb3JtYXRpb24gd2hpY2ggYXJlIGZyZXF1ZW50bHkgdXNlZAotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotcHVibGljIEBpbnRlcmZhY2UgVXNhZ2VJbmZvcm1hdGlvbgotewotICAgIFVzYWdlQ2F0ZWdvcnlbXSB2YWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0NsYXNzVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYyNzVlYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0NsYXNzVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ2xhc3NVdGlscw0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBDbGFzcyB0cnlUb0xvYWRDbGFzc0Zvck5hbWUoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBsb2FkQ2xhc3NGb3JOYW1lKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBDbGFzcyBsb2FkQ2xhc3NGb3JOYW1lKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvLyBUcnkgV2ViQXBwIENsYXNzTG9hZGVyIGZpcnN0DQotICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUobmFtZSwgZmFsc2UsIC8vIGRvIG5vdCBpbml0aWFsaXplIGZvciBmYXN0ZXIgc3RhcnR1cA0KLSAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlnbm9yZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvLyBmYWxsYmFjazogVHJ5IENsYXNzTG9hZGVyIGZvciBDbGFzc1V0aWxzIChpLmUuIHRoZSBteWZhY2VzLmphciBsaWIpDQotICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUobmFtZSwgZmFsc2UsIC8vIGRvIG5vdCBpbml0aWFsaXplIGZvciBmYXN0ZXIgc3RhcnR1cA0KLSAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW5zdGFudGlhdGVDbGFzcyhDbGFzcyB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRhcmdldENsYXNzLm5ld0luc3RhbmNlKCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoU3RyaW5nIGNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGluc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKFN0cmluZyBjbGFzc05hbWUpDQotICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXR1cm4gbG9hZENsYXNzRm9yTmFtZShjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxVdGlscy5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWJkYjI3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLk1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkFic3RyYWN0RUxIZWxwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi0NCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX1JFUVVJUkVEID0gImphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUlucHV0LlJFUVVJUkVEIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX1JFUVVJUkVEX0RFVEFJTCA9ICJqYXZheC5mYWNlcy5jb21wb25lbnQuVUlJbnB1dC5SRVFVSVJFRF9kZXRhaWwiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfTUFYSU1VTSA9ICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yLk1BWElNVU0iOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwgPSAiamF2YXguZmFjZXMudmFsaWRhdG9yLkxlbmd0aFZhbGlkYXRvci5NQVhJTVVNX2RldGFpbCI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nRmFjdG9yeTxPYmplY3QsIFZhbGlkYXRpb25TdHJhdGVneT4pIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUobWV0YURhdGFLZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFUcmFuc2Zvcm1lciBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YVRyYW5zZm9ybWVyPikgRXh0VmFsQ29udGV4dA0KLSAgICAgICAgICAgICAgICAgICAgLmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlKHZhbGlkYXRpb25TdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcigpDQotICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLCBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50V2l0aE1ldGFEYXRhKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgZm9yKENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyIDogRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXIuY29uZmlndXJlQ29tcG9uZW50KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsNCi0NCi0gICAgICAgIGZvcihWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIDogRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmFmdGVyVGhyb3dpbmcoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbiwgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlUmVzb2x2ZXIgZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXNzYWdlUmVzb2x2ZXI+KUV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgIC5jcmVhdGUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEVMSGVscGVyIGdldEVMSGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5FTF9IRUxQRVJfRkFDVE9SWSwgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuY2xhc3MpLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHlEZXRhaWxzIGNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgYmFzZU9iamVjdDsNCi0gICAgICAgIGlmKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKHRhcmdldEV4cHJlc3Npb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmJlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgU3RyaW5nIGV4cHJlc3Npb24gPSB2YmUuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgICAgIGJhc2VPYmplY3QgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YmUuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURldGFpbHMoDQotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uc3Vic3RyaW5nKDIsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKSwgYmFzZU9iamVjdCwgdmJlLmdldFByb3BlcnR5KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIG9yaWdpbmFsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eSgNCi0gICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgU3RyaW5nIG5ld0Jhc2VLZXkgPSBvcmlnaW5hbC5nZXRLZXkoKS5zdWJzdHJpbmcoMCwgb3JpZ2luYWwuZ2V0S2V5KCkubGFzdEluZGV4T2YoIi4iKSArIDEpOw0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IG5ld0Jhc2VLZXkgKyB0YXJnZXRFeHByZXNzaW9uOw0KLQ0KLSAgICAgICAgYmFzZU9iamVjdCA9IFJlZmxlY3Rpb25VdGlscy5nZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKG9yaWdpbmFsLmdldEJhc2VPYmplY3QoKSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICBuZXdLZXksIGJhc2VPYmplY3QsIHRhcmdldEV4cHJlc3Npb24uc3Vic3RyaW5nKHRhcmdldEV4cHJlc3Npb24ubGFzdEluZGV4T2YoIi4iKSArIDEsDQotICAgICAgICAgICAgdGFyZ2V0RXhwcmVzc2lvbi5sZW5ndGgoKSkpOw0KLSAgICB9DQotDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb1BsYWNlTGFiZWwoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgU3RyaW5nIGxhYmVsLCBpbnQgaW5kZXgpDQotICAgIHsNCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLmNvbnRhaW5zKCJ7IiArIGluZGV4ICsgIn0iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLnJlcGxhY2UoInsiICsgaW5kZXggKyAifSIsIGxhYmVsKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkuY29udGFpbnMoInsiICsgaW5kZXggKyAifSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNNZXNzYWdlLmdldERldGFpbCgpLnJlcGxhY2UoInsiICsgaW5kZXggKyAifSIsIGxhYmVsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VXaXRoRGVmYXVsdE1heGltdW1NZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIGludCBtYXhMZW5ndGgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZSA9IEpzZlV0aWxzLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfTUFYSU1VTSk7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZTsNCi0NCi0gICAgICAgIC8vdXNlIHRyeS9jYXRjaCBmb3IgZWFzaWVyIHN5bmMgYmV0d2VlbiB0cnVuay9icmFuY2gNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEpzZlV0aWxzLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IEpzZlV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vanNmIDEuMiBkb2Vzbid0IGhhdmUgYSBkZXRhaWwgbWVzc2FnZQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2UgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZS5yZXBsYWNlKCJ7MH0iLCAiIiArIG1heExlbmd0aCk7DQotICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsLnJlcGxhY2UoInswfSIsICIiICsgbWF4TGVuZ3RoKTsNCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGZhY2VzUmVxdWlyZWRNZXNzYWdlKTsNCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwpOw0KLSAgICB9DQotDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBsYWNlV2l0aERlZmF1bHRSZXF1aXJlZE1lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGZhY2VzUmVxdWlyZWRNZXNzYWdlID0gSnNmVXRpbHMuZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhKQVZBWF9GQUNFU19SRVFVSVJFRCk7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZTsNCi0NCi0gICAgICAgIC8vdXNlIHRyeS9jYXRjaCBmb3IgZWFzaWVyIHN5bmMgYmV0d2VlbiB0cnVuay9icmFuY2gNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEpzZlV0aWxzLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfUkVRVUlSRURfREVUQUlMKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBKc2ZVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkuZ2V0U3RyaW5nKEpBVkFYX0ZBQ0VTX1JFUVVJUkVEX0RFVEFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9qc2YgMS4yIGRvZXNuJ3QgaGF2ZSBhIGRldGFpbCBtZXNzYWdlDQotICAgICAgICB9DQotDQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc1JlcXVpcmVkTWVzc2FnZSk7DQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0pzZlV0aWxzLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0pzZlV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNTBkODkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZTsNCi1pbXBvcnQgamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZUZhY3Rvcnk7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOw0KLQ0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpzZlV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3RlclBoYXNlTGlzdGVuZXIoUGhhc2VMaXN0ZW5lciBwaGFzZUxpc3RlbmVyKQ0KLSAgICB7DQotICAgICAgICBMaWZlY3ljbGVGYWN0b3J5IGxpZmVjeWNsZUZhY3RvcnkgPSAoTGlmZWN5Y2xlRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRmFjdG9yeUZpbmRlci5MSUZFQ1lDTEVfRkFDVE9SWSk7DQotDQotICAgICAgICBTdHJpbmcgY3VycmVudElkOw0KLSAgICAgICAgTGlmZWN5Y2xlIGN1cnJlbnRMaWZlY3ljbGU7DQotICAgICAgICBJdGVyYXRvciBsaWZlY3ljbGVJZHMgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZUlkcygpOw0KLSAgICAgICAgd2hpbGUgKGxpZmVjeWNsZUlkcy5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudElkID0gKFN0cmluZykgbGlmZWN5Y2xlSWRzLm5leHQoKTsNCi0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlID0gbGlmZWN5Y2xlRmFjdG9yeS5nZXRMaWZlY3ljbGUoY3VycmVudElkKTsNCi0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlLnJlbW92ZVBoYXNlTGlzdGVuZXIocGhhc2VMaXN0ZW5lcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFN0cmluZyBidW5kbGVOYW1lID0gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZ2V0TWVzc2FnZUJ1bmRsZSgpOw0KLQ0KLSAgICAgICAgaWYoYnVuZGxlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJ1bmRsZU5hbWUgPSBGYWNlc01lc3NhZ2UuRkFDRVNfTUVTU0FHRVM7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGJ1bmRsZU5hbWUsIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1JlZmxlY3Rpb25VdGlscy5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9SZWZsZWN0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4N2Y3ZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1JlZmxlY3Rpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGlvblV0aWxzCi17Ci0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgdHJ5VG9HZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvR2V0TWV0aG9kKHRhcmdldENsYXNzLCB0YXJnZXRNZXRob2ROYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCB0cnlUb0dldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUsIENsYXNzLi4uIHBhcmFtZXRlclR5cGVzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lKQotICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TWV0aG9kKHRhcmdldENsYXNzLCB0YXJnZXRNZXRob2ROYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lLCBDbGFzcy4uLiBwYXJhbWV0ZXJUeXBlcykKLSAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gdGFyZ2V0Q2xhc3M7Ci0gICAgICAgIE1ldGhvZCB0YXJnZXRNZXRob2QgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKCFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gY3VycmVudENsYXNzLmdldERlY2xhcmVkTWV0aG9kKHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGFyZ2V0TWV0aG9kID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IHRhcmdldENsYXNzLmdldEludGVyZmFjZXMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50SW50ZXJmYWNlOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRDbGFzcyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IGN1cnJlbnRDbGFzcy5nZXREZWNsYXJlZE1ldGhvZCh0YXJnZXRNZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0YXJnZXRNZXRob2QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRhcmdldE1ldGhvZDsKLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBOb1N1Y2hNZXRob2RFeGNlcHRpb24oInRoZXJlIGlzIG5vIG1ldGhvZCB3aXRoIHRoZSBuYW1lICciICsgdGFyZ2V0TWV0aG9kTmFtZSArICInIiArCi0gICAgICAgICAgICAgICAgIiBjbGFzczogIiArIHRhcmdldENsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0ludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3ModGFyZ2V0LCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZE9mQ2xhc3ModGFyZ2V0LCBtZXRob2QsIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQubmV3SW5zdGFuY2UoKSwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldC5uZXdJbnN0YW5jZSgpLCBtZXRob2QsIGFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdC4uLiBhcmdzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0LCBtZXRob2QsIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdC4uLiBhcmdzKQotICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKHRhcmdldCwgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QmFzZU9mUHJvcGVydHlDaGFpbihPYmplY3QgYmFzZU9iamVjdCwgU3RyaW5nIHByb3BlcnR5Q2hhaW4pCi0gICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcm9wZXJ0eUNoYWluLCAiLiIpOwotCi0gICAgICAgIE9iamVjdCBjdXJyZW50QmFzZSA9IGJhc2VPYmplY3Q7Ci0gICAgICAgIFN0cmluZyBjdXJyZW50UHJvcGVydHk7Ci0gICAgICAgIE1ldGhvZCBjdXJyZW50TWV0aG9kOwotCi0gICAgICAgIHdoaWxlKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQotICAgICAgICAgICAgLy9pZ25vcmUgdGhlIGxhc3QgcHJvcGVydHkKLSAgICAgICAgICAgIGlmKCF0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL25vIGlzIC0gaXQncyBvbmx5IHBvc3NpYmxlIGF0IHByb3BlcnRpZXMgbm90IGF0IGJlYW4gbGV2ZWwKLSAgICAgICAgICAgIGN1cnJlbnRNZXRob2QgPSB0cnlUb0dldE1ldGhvZChjdXJyZW50QmFzZS5nZXRDbGFzcygpLAotICAgICAgICAgICAgICAgICJnZXQiICsgY3VycmVudFByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFByb3BlcnR5LnN1YnN0cmluZygxLCBjdXJyZW50UHJvcGVydHkubGVuZ3RoKCkpKTsKLSAgICAgICAgICAgIGN1cnJlbnRCYXNlID0gdHJ5VG9JbnZva2VNZXRob2QoY3VycmVudEJhc2UsIGN1cnJlbnRNZXRob2QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRCYXNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvV2ViWG1sVXRpbHMuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvV2ViWG1sVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFiMjE3Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1dlYlhtbFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFdlYlhtbFV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKQ0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVggKyAiLiIgKyBrZXkpOw0KLSAgICAgICAgcmV0dXJuICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlLnJlcGxhY2UoIiAiLCAiIikudHJpbSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9jb3JlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMjAxZDIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2NvcmUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlIE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlIE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUgTW9kdWxlIHByb3ZpZGVzIGFuIGV4dGVuc2libGUgdmFsaWRhdGlvbiBwbGF0Zm9ybSB0byBpbXBsZW1lbnQgdmFsaWRhdGlvbiBiYXNlZCBvbiBtZXRhLWRhdGEuDQotICAgIEJhc2VkIG9uIHRoaXMgbW9kdWxlIGl0IGlzIHBvc3NpYmxlIHRvIGltcGxlbWVudCB2YWxpZGF0aW9uIG1vZHVsZXMuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLjEueCBhbmQgSlNGIDEuMi54LiBCb3RoIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2Fzc2VtYmx5L3BvbS54bWwgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE2YzI3OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBFeGFtcGxlcyBBc3NlbWJseTwvbmFtZT4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZXhhbXBsZXMtYXNzZW1ibHkxMjwvYXJ0aWZhY3RJZD4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5kZXBlbmRlbmN5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LXdhcjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd2FyPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktc3JjPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fd29ybGQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXZhLXNvdXJjZTwvdHlwZT4gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmVhdHVyZS1zZXRfMDE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXZhLXNvdXJjZTwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc3JjPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPiAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBFWEVDVVRFIG12biBwYWNrYWdlIHRvIGdlbmVyYXRlIGFzc2VtYmx5IGZpbGVzIC0tPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9zcmM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmFzc2VtYmx5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4gICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwtZXhhbXBsZXMtJHtwcm9qZWN0LnZlcnNpb259LXNyYzwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfYmluPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hc3NlbWJseTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0JICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+ICAgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWw8L2Rlc2NyaXB0b3I+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsLWV4YW1wbGVzLSR7cHJvamVjdC52ZXJzaW9ufTwvZmluYWxOYW1lPgotCSAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd29yazwvd29ya0RpcmVjdG9yeT4KLQkgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0JICAgIAotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+d2Fnb24tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aWQ+bXlmYWNlcy1uaWdodGx5LWJ1aWxkczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vbWlub3RhdXIuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvYnVpbGRzL215ZmFjZXMvbmlnaHRseTwvdXJsPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9pbnB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICA8L3BsdWdpbnM+Ci0KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBmN2I4MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgkKLSAgPGZpbGVTZXRzPiAgICAKLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3dhcjwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki53YXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4gICAgIAotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NzBjY2MuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08YXNzZW1ibHk+Ci0gIDxpZD5zcmM8L2lkPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4JCi0gIDxmaWxlU2V0cz4gICAgCi0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9zcmM8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki50eHQ8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1YjNhNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMWI5ZjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMKLUNvcHlyaWdodCAyMDA0LTIwMDcgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnk6Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dAotU2VlIGxpY2Vuc2VzIGZvciBhY2NvbXBhbnlpbmcgcHJvZHVjdHMgaW4gdGhlICIvbGljZW5zZXMiIHN1YmRpcmVjdG9yeS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEhlbmcgWXVhbgotaHR0cDovL3d3dy5jcy51Y2xhLmVkdS9+aGVuZy9KU0Nvb2tNZW51Ci0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgU2FtIFN0ZXBoZW5zb24gKHRoZSBQcm90b1R5cGUgbGlicmFyeSkKLWh0dHA6Ly9jb25pby5uZXQvCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgVGhvbWFzIEZ1Y2hzICh0aGUgUnVieSBvbiBSYWlscyBBamF4IGphdmFzY3JpcHQgZXh0ZW5zaW9ucykKLWh0dHA6Ly9zY3JpcHQuYWN1bG8udXMvCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvcG9tLnhtbCBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmJjN2FjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWZlYXR1cmUtc2V0XzAxPC9hcnRpZmFjdElkPgotCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBmZWF0dXJlLXNldCAwMTwvbmFtZT4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uZmFjZWxldHM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtZmFjZWxldHM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMTQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8IS0tCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgLS0+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudG9tYWhhd2s8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50b21haGF3azwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS42PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jdXN0b20vdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmEyMmE3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jdXN0b20vdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIHRoaXMgbWVzc2FnZSBidW5kbGUgaXMgcGlja2VkIHVwIHZpYSBjb252ZW50aW9uDQotcmVwZWF0ZWRfcGFzc3dvcmRfcmVxdWlyZWQ9cGxlYXNlIHJldHlwZSB0aGUgcGFzc3dvcmQNCi1yZXBlYXRlZF9wYXNzd29yZF9yZXF1aXJlZF9kZXRhaWw9cGxlYXNlIHJldHlwZSB0aGUgcGFzc3dvcmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YWU0MWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRGF0ZUlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXNUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5Ob3RFcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47DQotDQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVGVtcG9yYWw7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlRlbXBvcmFsVHlwZTsNCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotcHVibGljIGNsYXNzIFBlcnNvbg0KLXsNCi0gICAgQExlbmd0aChtaW5pbXVtID0gMikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAyMCkNCi0gICAgQE5vdEVxdWFscygibGFzdE5hbWUiKQ0KLSAgICBAUGF0dGVybigiW0EtWl1bYS16XSsiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7DQotDQotICAgIEBMZW5ndGgobWluaW11bSA9IDIpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMjApDQotICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsNCi0NCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcm9sZSA9ICJ1c2VyIjsNCi0NCi0gICAgQERhdGVJcyh0eXBlID0gRGF0ZUlzVHlwZS5iZWZvcmUsIHZhbHVlT2YgPSAiZmluYWxFeGFtIikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlKQ0KLSAgICBAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLkRBVEUpDQotICAgIHByaXZhdGUgRGF0ZSBiaXJ0aGRheTsNCi0NCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlKQ0KLSAgICBAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLkRBVEUpDQotICAgIHByaXZhdGUgRGF0ZSBmaW5hbEV4YW07DQotDQotICAgIEBMZW5ndGgobWluaW11bSA9IDIpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIG5pY2tOYW1lOw0KLQ0KLSAgICBATGVuZ3RoKG1pbmltdW0gPSA2KQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDYwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBlbWFpbDsNCi0NCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlKQ0KLSAgICBwcml2YXRlIGludCBudW1iZXJPZlNpYmxpbmdzOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbGFzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJvbGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcm9sZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRSb2xlKFN0cmluZyByb2xlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnJvbGUgPSByb2xlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldEJpcnRoZGF5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGJpcnRoZGF5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEJpcnRoZGF5KERhdGUgYmlydGhkYXkpDQotICAgIHsNCi0gICAgICAgIHRoaXMuYmlydGhkYXkgPSBiaXJ0aGRheTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXRGaW5hbEV4YW0oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmluYWxFeGFtOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEZpbmFsRXhhbShEYXRlIGZpbmFsRXhhbSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maW5hbEV4YW0gPSBmaW5hbEV4YW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROaWNrTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuaWNrTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROaWNrTmFtZShTdHJpbmcgbmlja05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmlja05hbWUgPSBuaWNrTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVtYWlsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKFN0cmluZyBlbWFpbCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5lbWFpbCA9IGVtYWlsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZTaWJsaW5ncygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBudW1iZXJPZlNpYmxpbmdzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlck9mU2libGluZ3MoaW50IG51bWJlck9mU2libGluZ3MpDQotICAgIHsNCi0gICAgICAgIHRoaXMubnVtYmVyT2ZTaWJsaW5ncyA9IG51bWJlck9mU2libGluZ3M7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZTE0ZmIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5ndWkuYmVhbnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uTm90RXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxvbmdSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5jdXN0b20uZW1haWx2YWxpZGF0b3IuRW1haWxWYWxpZGF0b3I7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvblBhZ2UNCi17DQotDQotICAgIC8vdGhlIG9sZCBwYXNzd29yZCBvZiB0aGUgcGVyc29uIGlzbid0IHVzZWQgd2l0aGluIHRoZSBwYWdlDQotICAgIC8vLT4gdmFsaWRhdGUgd2l0aCB2YWx1ZSBvZiB0aGUgbW9kZWwNCi0gICAgQFNraXBWYWxpZGF0aW9uKCIje3BlcnNvbi5yb2xlIGVxICdhZG1pbid9IikNCi0gICAgQFJlcXVpcmVkDQotICAgIEBFcXVhbHMoInBlcnNvbi5wYXNzd29yZCIpDQotICAgIEBOb3RFcXVhbHMoInBhc3N3b3JkIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgb2xkUGFzc3dvcmQ7DQotDQotICAgIEBFcXVhbHMoInBhc3N3b3JkUmVwZWF0ZWQiKQ0KLSAgICAvL2NvbWJpbmUgZ3VpIHJlbGF0ZWQgYW5ub3RhdGlvbnMgd2l0aCB0aGUgYW5ub2F0aW9ucyBvZiB0aGUgZG9tYWluIG1vZGVsDQotICAgIEBKb2luVmFsaWRhdGlvbih2YWx1ZSA9ICIje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLnBhc3N3b3JkfSIpDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOw0KLQ0KLSAgICBAUmVxdWlyZWQodmFsaWRhdGlvbkVycm9yTXNnS2V5ID0gInJlcGVhdGVkX3Bhc3N3b3JkX3JlcXVpcmVkIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmRSZXBlYXRlZDsNCi0NCi0gICAgLy91c2UgI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5uaWNrTmFtZX0sICN7cGVyc29uLm5pY2tOYW1lfQ0KLSAgICAvL3VzZSByZWdpc3RyYXRpb25QYWdlIHRvIGRpc3BsYXkgdGhlIHNlY29uZCBlcnJvciBtZXNzYWdlIGF0IG9sZCBuaWNrbmFtZQ0KLSAgICAvL29yIGxvY2FsIHByb3BlcnR5IGNoYWluaW5nICh0byBhdm9pZCB0aGUgdXNhZ2Ugb2YgdGhlIGJlYW4gbmFtZSkgLSBsaWtlOg0KLSAgICBAU2tpcFZhbGlkYXRpb24oIiN7cGVyc29uLnJvbGUgZXEgJ2FkbWluJ30iKQ0KLSAgICBATm90RXF1YWxzKCJwZXJzb24ubmlja05hbWUiKQ0KLSAgICBASm9pblZhbGlkYXRpb24oInBlcnNvbi5uaWNrTmFtZSIpDQotICAgIHByaXZhdGUgU3RyaW5nIG5ld05pY2tOYW1lOw0KLQ0KLSAgICBwcml2YXRlIFBlcnNvbiBwZXJzb247DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZmluaXNoKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0UGFzc3dvcmQodGhpcy5wYXNzd29yZCk7DQotICAgICAgICByZXR1cm4gImhvbWUiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgdXBkYXRlTmlja05hbWUoKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXROaWNrTmFtZSh0aGlzLm5ld05pY2tOYW1lKTsNCi0gICAgICAgIHJldHVybiAiaG9tZSI7DQotICAgIH0NCi0NCi0gICAgLy9qdXN0IGEgcXVpY2sgaWxsdXN0cmF0aW9uIG9mIHNraXBWYWxpZGF0aW9uDQotICAgIHB1YmxpYyBTdHJpbmcgc3dpdGNoTW9kZSgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50Um9sZSA9IHRoaXMucGVyc29uLmdldFJvbGUoKTsNCi0NCi0gICAgICAgIGlmKGN1cnJlbnRSb2xlLmVxdWFscygiYWRtaW4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnBlcnNvbi5zZXRSb2xlKCJ1c2VyIik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5wZXJzb24uc2V0Um9sZSgiYWRtaW4iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAiIjsNCi0gICAgfQ0KLQ0KLSAgICBASm9pblZhbGlkYXRpb24oInBlcnNvbi5lbWFpbCIpDQotICAgIEBWYWxpZGF0b3IoRW1haWxWYWxpZGF0b3IuY2xhc3MpDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5wZXJzb24uZ2V0RW1haWwoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbWFpbChTdHJpbmcgZW1haWwpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldEVtYWlsKGVtYWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBASm9pblZhbGlkYXRpb24oIiN7cGVyc29uLm51bWJlck9mU2libGluZ3N9IikNCi0gICAgQExvbmdSYW5nZShtYXhpbXVtID0gMjApDQotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZTaWJsaW5ncygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbi5nZXROdW1iZXJPZlNpYmxpbmdzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyT2ZTaWJsaW5ncyhpbnQgbnVtYmVyT2ZTaWJsaW5ncykNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0TnVtYmVyT2ZTaWJsaW5ncyhudW1iZXJPZlNpYmxpbmdzKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2xkUGFzc3dvcmQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gb2xkUGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0T2xkUGFzc3dvcmQoU3RyaW5nIG9sZFBhc3N3b3JkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm9sZFBhc3N3b3JkID0gb2xkUGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkUmVwZWF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmRSZXBlYXRlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZFJlcGVhdGVkKFN0cmluZyBwYXNzd29yZFJlcGVhdGVkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkUmVwZWF0ZWQgPSBwYXNzd29yZFJlcGVhdGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQZXJzb24gZ2V0UGVyc29uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBlcnNvbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzb24oUGVyc29uIHBlcnNvbikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24gPSBwZXJzb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROZXdOaWNrTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXdOaWNrTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROZXdOaWNrTmFtZShTdHJpbmcgbmV3Tmlja05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmV3Tmlja05hbWUgPSBuZXdOaWNrTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxOGQ2Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIgotICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjIiPgotICAgIDxhcHBsaWNhdGlvbj4KLSAgICAgICAgPCEtLSB0cmluaWRhZCAtLT4KLSAgICAgICAgPGRlZmF1bHQtcmVuZGVyLWtpdC1pZD4KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb3JlCi0gICAgICAgIDwvZGVmYXVsdC1yZW5kZXIta2l0LWlkPgotCi0gICAgPC9hcHBsaWNhdGlvbj4KLQotICAgIDxtYW5hZ2VkLWJlYW4+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tbmFtZT5yZWdpc3RyYXRpb25QYWdlPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5ndWkuYmVhbnMuUmVnaXN0cmF0aW9uUGFnZTwvbWFuYWdlZC1iZWFuLWNsYXNzPgotICAgICAgICA8bWFuYWdlZC1iZWFuLXNjb3BlPnJlcXVlc3Q8L21hbmFnZWQtYmVhbi1zY29wZT4KLQotICAgICAgICA8bWFuYWdlZC1wcm9wZXJ0eT4KLSAgICAgICAgICAgIDxwcm9wZXJ0eS1uYW1lPnBlcnNvbjwvcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDx2YWx1ZT4je3BlcnNvbn08L3ZhbHVlPgotICAgICAgICA8L21hbmFnZWQtcHJvcGVydHk+Ci0gICAgPC9tYW5hZ2VkLWJlYW4+Ci0KLSAgICA8bWFuYWdlZC1iZWFuPgotICAgICAgICA8bWFuYWdlZC1iZWFuLW5hbWU+cGVyc29uPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5kb21haW4uUGVyc29uPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tc2NvcGU+c2Vzc2lvbjwvbWFuYWdlZC1iZWFuLXNjb3BlPgotICAgIDwvbWFuYWdlZC1iZWFuPgotCi0gICAgPG5hdmlnYXRpb24tcnVsZT4KLSAgICAgICAgPGZyb20tdmlldy1pZD4vcGFnZXMvaG9tZS54aHRtbDwvZnJvbS12aWV3LWlkPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5hZGRVc2VyPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+Y2hhbmdlTmlja05hbWU8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5jaGFuZ2VQYXNzd29yZDwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL2NoYW5nZV9wYXNzd29yZC54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgPG5hdmlnYXRpb24tcnVsZT4KLSAgICAgICAgPGZyb20tdmlldy1pZD4qPC9mcm9tLXZpZXctaWQ+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmhvbWU8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9ob21lLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICA8L25hdmlnYXRpb24tcnVsZT4KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9tYWluLnRhZ2xpYi54bWwgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWMwYzUxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9tYWluLnRhZ2xpYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBmYWNlbGV0LXRhZ2xpYiBQVUJMSUMKLSAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBGYWNlbGV0IFRhZ2xpYiAxLjAvL0VOIgotICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZmFjZWxldC10YWdsaWJfMV8wLmR0ZCI+Ci08ZmFjZWxldC10YWdsaWI+Ci0gICAgPG5hbWVzcGFjZT5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dHZhbC9kZW1vL2NvbXBvbmVudHM8L25hbWVzcGFjZT4KLQotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT51c2VyRm9ybTwvdGFnLW5hbWU+Ci0gICAgICAgIDxzb3VyY2U+Ci0gICAgICAgICAgICAuLi9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbAotICAgICAgICA8L3NvdXJjZT4KLSAgICA8L3RhZz4KLQotPC9mYWNlbGV0LXRhZ2xpYj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWMwMWFhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCi0gICAgICAgICB2ZXJzaW9uPSIyLjQiPgotCi0gICAgPGRlc2NyaXB0aW9uPk15UHJvamVjdCB3ZWIueG1sPC9kZXNjcmlwdGlvbj4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5ERUZBVUxUX1NVRkZJWDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi54aHRtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmZhY2VsZXRzLkxJQlJBUklFUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi9XRUItSU5GL21haW4udGFnbGliLnhtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5FTkFCTEVfTElHSFRXRUlHSFRfRElBTE9HUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRElTQUJMRV9DT05URU5UX0NPTVBSRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5BTFRFUk5BVEVfVklFV19IQU5ETEVSPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y29tLnN1bi5mYWNlbGV0cy5GYWNlbGV0Vmlld0hhbmRsZXI8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuVVNFX0FQUExJQ0FUSU9OX1ZJRVdfQ0FDSEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5DSEFOR0VfUEVSU0lTVEVOQ0U8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5zZXNzaW9uPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBTZWUgSlNGIFNwZWNpZmljYXRpb24gMi41LjMKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNsaWVudDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5OVU1CRVJfT0ZfVklFV1NfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPjIwPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzdGF0ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbSBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uCi0gICAgICAgICAgICBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KSBhbmQgaWYKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgY29tcHJlc3NlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUKLSAgICAgICAgICAgIHJlbmRlcmVkIEhUTUwgb3V0cHV0LgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgbm90IGFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFMTE9XX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5ERVRFQ1RfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCByZW5kZXJlZCBIVE1MIGNvZGUgd2lsbCBiZSBmb3JtYXR0ZWQsIHNvIHRoYXQgaXQgaXMgImh1bWFuIHJlYWRhYmxlIi4KLSAgICAgICAgICAgIGkuZS4gYWRkaXRpb25hbCBsaW5lIHNlcGFyYXRvcnMgYW5kIHdoaXRlc3BhY2Ugd2lsbCBiZSB3cml0dGVuLCB0aGF0IGRvIG5vdAotICAgICAgICAgICAgaW5mbHVlbmNlIHRoZSBIVE1MIGNvZGUuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlBSRVRUWV9IVE1MPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlCi0gICAgICAgICAgICBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuIENvbnZlbmllbnQgZmVhdHVyZSBpZiB5b3UgaGF2ZSBwYWdlcwotICAgICAgICAgICAgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGJyb3dzZXIgcGFnZSB0byBhbHdheXMganVtcCB0byB0aGUgdG9wCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuCi0gICAgICAgICAgICBEZWZhdWx0OiAiZmFsc2UiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BVVRPX1NDUk9MTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQotICAgICAgICAgICAgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucwotICAgICAgICAgICAgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IgZGlmZmVuZW50IGVuY3J5cHRpb24gc3RyZW5ndGhzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VDUkVUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+TnpZMU5ETXlNVEE9PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmFsaWRhdGUgbWFuYWdlZCBiZWFucywgbmF2aWdhdGlvbiBydWxlcyBhbmQgZW5zdXJlIHRoYXQgZm9ybXMgYXJlIG5vdCBuZXN0ZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDwhLS0gTGlzdGVuZXIsIHRvIGFsbG93IEpldHR5IHNlcnZpbmcgTXlGYWNlcyBhcHBzIC0tPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy53ZWJhcHAuU3RhcnR1cFNlcnZsZXRDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLndlYmFwcC5SZXNvdXJjZVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPGZpbHRlcj4KLSAgICAgICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlRyaW5pZGFkRmlsdGVyPC9maWx0ZXItY2xhc3M+Ci0gICAgPC9maWx0ZXI+Ci0KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT50cmluaWRhZDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZ3MgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4vZmFjZXMvKjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPnJlc291cmNlczwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+L2FkZi8qPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTg5OTkyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyIKLSAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiCi0gICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIgotICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiCi0gICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+Ci0KLTx1aTpjb21wb3NpdGlvbj4KLSAgICA8dHI6cGFuZWxGb3JtTGF5b3V0PgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im5pY2sgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb25bICduaWNrTmFtZScgXX0iLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0iZS1tYWlsIiB2YWx1ZT0iI3tiZWFuLmVtYWlsfSIvPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9ImZpcnN0IG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uLmZpcnN0TmFtZX0iLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibGFzdCBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5sYXN0TmFtZX0iLz4KLSAgICAgICAgPHRyOmlucHV0RGF0ZSBsYWJlbD0iYmlydGhkYXkiIHZhbHVlPSIje2JlYW4ucGVyc29uLmJpcnRoZGF5fSI+Ci0gICAgICAgICAgICA8dHI6Y29udmVydERhdGVUaW1lIHR5cGU9ImRhdGUiIHBhdHRlcm49ImRkLk1NLnl5eXkiLz4KLSAgICAgICAgPC90cjppbnB1dERhdGU+Ci0gICAgICAgIDx0cjppbnB1dERhdGUgbGFiZWw9ImZpbmFsIGV4YW0iIHZhbHVlPSIje2JlYW4ucGVyc29uLmZpbmFsRXhhbX0iPgotICAgICAgICAgICAgPHRyOmNvbnZlcnREYXRlVGltZSB0eXBlPSJkYXRlIiBwYXR0ZXJuPSJkZC5NTS55eXl5Ii8+Ci0gICAgICAgIDwvdHI6aW5wdXREYXRlPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im51bWJlciBvZiBzaWJsaW5ncyIgdmFsdWU9IiN7YmVhbi5udW1iZXJPZlNpYmxpbmdzfSIvPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9InBhc3N3b3JkIiB2YWx1ZT0iI3tiZWFuLnBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9InJlLWVudGVyIHBhc3N3b3JkIiB2YWx1ZT0iI3tiZWFuLnBhc3N3b3JkUmVwZWF0ZWR9IiBzZWNyZXQ9InRydWUiLz4KLQotICAgIDwvdHI6cGFuZWxGb3JtTGF5b3V0PgotPC91aTpjb21wb3NpdGlvbj4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbCBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBkM2U2Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTxodG1sPg0KLQ0KLTxoZWFkPg0KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIwOyBVUkw9ZmFjZXMvcGFnZXMvaG9tZS54aHRtbCI+DQotPC9oZWFkPg0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbCBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2E0MWE1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPHRyOmRvY3VtZW50DQotICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiDQotICAgICAgICB4bWxuczpjPSJodHRwOi8vamF2YS5zdW4uY29tL2pzdGwvY29yZSI+DQotICAgIDxmOmZhY2V0IG5hbWU9Im1ldGFDb250YWluZXIiPg0KLSAgICAgICAgPHRpdGxlPnNldi1lbiBmZWF0dXJlLXNldCBkZW1vIDAxPC90aXRsZT4NCi0gICAgPC9mOmZhY2V0Pg0KLQ0KLSAgICA8dHJoOmJvZHk+DQotDQotICAgICAgICA8IS0tIG9yaWdpbmFsIC0tPg0KLSAgICAgICAgPGRpdiBpZD0id3JhcCI+DQotDQotICAgICAgICAgICAgPHRyOmZvcm0gaWQ9ImZvcm0iIGRlZmF1bHRDb21tYW5kPSJkZWZhdWx0QnV0dG9uIj4NCi0gICAgICAgICAgICAgICAgPGRpdiBpZD0ibWFpbiI+DQotICAgICAgICAgICAgICAgICAgICA8dWk6aW5zZXJ0IG5hbWU9ImNvbnRlbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InVuZGVyX2NvbnN0cnVjdGlvbiI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj4hc2l0ZSB1bmRlciBjb25zdHJ1Y3Rpb24hPC9oMj4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIGNvbnRlbnQgb2YgdGhpcyBzaXRlIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhlIG1vbWVudC48L3A+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICA8L3VpOmluc2VydD4NCi0gICAgICAgICAgICAgICAgPC9kaXY+DQotDQotICAgICAgICAgICAgPC90cjpmb3JtPg0KLSAgICAgICAgICAgIDx0cjptZXNzYWdlcyBnbG9iYWxPbmx5PSJ0cnVlIi8+DQotDQotICAgICAgICA8L2Rpdj4NCi0gICAgPC90cmg6Ym9keT4NCi0NCi0NCi08L3RyOmRvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZGNkMDMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgPHRyOnBhbmVsRm9ybUxheW91dD4NCi0NCi0gICAgICAgICAgICA8dWk6cmVtb3ZlPg0KLSAgICAgICAgICAgICAgICBqdXN0IGZvciB0aGUgZGVtbyB3ZSBhcmUgdXNpbmcgdHdvIGlucHV0IGNvbXBvbmVudHMNCi0gICAgICAgICAgICA8L3VpOnJlbW92ZT4NCi0gICAgICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJvbGQgbmljayBuYW1lIiByZWFkT25seT0idHJ1ZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ubmlja05hbWV9Ii8+DQotDQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibmljayBuYW1lIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLm5ld05pY2tOYW1lfSIvPg0KLQ0KLSAgICAgICAgPC90cjpwYW5lbEZvcm1MYXlvdXQ+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJzYXZlIiBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS51cGRhdGVOaWNrTmFtZX0iLz4NCi0NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NzkzNTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgPHRyOnBhbmVsRm9ybUxheW91dD4NCi0NCi0gICAgICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJvbGQgcGFzc3dvcmQiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2Uub2xkUGFzc3dvcmR9IiBzZWNyZXQ9InRydWUiLz4NCi0NCi0gICAgICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJuZXcgcGFzc3dvcmQiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGFzc3dvcmR9IiBzZWNyZXQ9InRydWUiLz4NCi0gICAgICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJyZS1lbnRlciBwYXNzd29yZCIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5wYXNzd29yZFJlcGVhdGVkfSIgc2VjcmV0PSJ0cnVlIi8+DQotDQotICAgICAgICA8L3RyOnBhbmVsRm9ybUxheW91dD4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9InNhdmUiIGFjdGlvbj0iI3tyZWdpc3RyYXRpb25QYWdlLmZpbmlzaH0iLz4NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbCBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4YTJjOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0iYWRkIHVzZXIiIGFjdGlvbj0iYWRkVXNlciIvPjxici8+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJjaGFuZ2UgbmljayBuYW1lIiBhY3Rpb249ImNoYW5nZU5pY2tOYW1lIi8+PGJyLz4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9ImNoYW5nZSBwYXNzd29yZCIgYWN0aW9uPSJjaGFuZ2VQYXNzd29yZCIvPjxici8+DQotICAgICAgICA8dHI6Y29tbWFuZExpbmsgdGV4dD0ibW9kZTogI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5yb2xlfSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0iI3tyZWdpc3RyYXRpb25QYWdlLnN3aXRjaE1vZGV9IiBpbW1lZGlhdGU9InRydWUiLz4NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNTM1YzcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOmM9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0dmFsL2RlbW8vY29tcG9uZW50cyINCi0gICAgICAgID4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDxjOnVzZXJGb3JtIGJlYW49IiN7cmVnaXN0cmF0aW9uUGFnZX0iLz4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9InNhdmUiIGFjdGlvbj0iI3tyZWdpc3RyYXRpb25QYWdlLmZpbmlzaH0iLz4NCi0NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Zjk5OWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1oZWxsb193b3JsZDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgaGVsbG8gd29ybGQ8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+anN0bDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzdGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4gICAgICAgIAotCi0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmFmYjM5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLmRvbWFpbi5QZXJzb247Ci0KLS8qKgotICogQSB0eXBpY2FsIHNpbXBsZSBiYWNraW5nIGJlYW4sIHRoYXQgaXMgYmFja2VkIHRvIDxjb2RlPmhlbGxvd29ybGQuanNwPC9jb2RlPgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkQ29udHJvbGxlcgotewotICAgIHByaXZhdGUgUGVyc29uIHBlcnNvbiA9IG5ldyBQZXJzb24oKTsKLQotICAgIC8qKgotICAgICAqIGRlZmF1bHQgZW1wdHkgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgSGVsbG9Xb3JsZENvbnRyb2xsZXIoKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdGhhdCBpcyBiYWNrZWQgdG8gYSBzdWJtaXQgYnV0dG9uIG9mIGEgZm9ybS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHNlbmQoKQotICAgIHsKLSAgICAgICAgLy9kbyByZWFsIGxvZ2ljLCByZXR1cm4gYSBzdHJpbmcgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciB0aGUgbmF2aWdhdGlvbiBzeXN0ZW0gb2YgSlNGCi0gICAgICAgIHJldHVybiAic3VjY2VzcyI7Ci0gICAgfQotCi0gICAgcHVibGljIFBlcnNvbiBnZXRQZXJzb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBlcnNvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzb24oUGVyc29uIHBlcnNvbikKLSAgICB7Ci0gICAgICAgIHRoaXMucGVyc29uID0gcGVyc29uOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvZG9tYWluL1BlcnNvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkNGE5ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvZG9tYWluL1BlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLmRvbWFpbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7Ci0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47Ci0KLXB1YmxpYyBjbGFzcyBQZXJzb24KLXsKLSAgICAvL2hlbGxvIHdvcmxkIGRlbW8KLSAgICBAUmVxdWlyZWQKLSAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7Ci0KLSAgICAvL2RlbW8gZm9yIGpwYSBiYXNlZCB2YWxpZGF0aW9uIHN1cHBvcnQKLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwIC8qLi4uKi8pCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbGFzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYmVhZTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlcy1jb25maWcgdmVyc2lvbj0iMS4yIiAKLSAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIAotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCI+Ci0JCi0JPCEtLSBtYW5hZ2VkIGJlYW5zIG9mIHRoZSBzaW1wbGUgaGVsbG8gd29ybGQgYXBwIC0tPgotCTxtYW5hZ2VkLWJlYW4+Ci0JCTxtYW5hZ2VkLWJlYW4tbmFtZT5oZWxsb1dvcmxkPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLQkJPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuSGVsbG9Xb3JsZENvbnRyb2xsZXI8L21hbmFnZWQtYmVhbi1jbGFzcz4KLQkJPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0JPC9tYW5hZ2VkLWJlYW4+Ci0JCi0JPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciBoZWxsb1dvcmxkLmpzcCAtLT4KLQk8bmF2aWdhdGlvbi1ydWxlPgotCQk8ZnJvbS12aWV3LWlkPi9oZWxsb1dvcmxkLmpzcDwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5zdWNjZXNzPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vcGFnZTIuanNwPC90by12aWV3LWlkPgotCQk8L25hdmlnYXRpb24tY2FzZT4KLQk8L25hdmlnYXRpb24tcnVsZT4KLQkKLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIHBhZ2UyLmpzcCAtLT4KLQk8bmF2aWdhdGlvbi1ydWxlPgotCQk8ZnJvbS12aWV3LWlkPi9wYWdlMi5qc3A8L2Zyb20tdmlldy1pZD4KLQkJPG5hdmlnYXRpb24tY2FzZT4KLQkJCTxmcm9tLW91dGNvbWU+YmFjazwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L2hlbGxvV29ybGQuanNwPC90by12aWV3LWlkPgotCQk8L25hdmlnYXRpb24tY2FzZT4KLQk8L25hdmlnYXRpb24tcnVsZT4KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNGExODMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLSAgICAgICAgIHZlcnNpb249IjIuNCI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+TXlQcm9qZWN0IHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0gICAgPCEtLW9wdGlvbmFsOiBjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgVVJJcyBvZiAoYWRkaXRpb25hbCkgZmFjZXMgY29uZmlnIGZpbGVzLgotICAgICAgICAgICAgKGUuZy4gL1dFQi1JTkYvbXktY29uZmlnLnhtbCkKLSAgICAgICAgICAgIFNlZSBKU0YgMS4wIFBSRDIsIDEwLjMuMgotICAgICAgICAgICAgQXR0ZW50aW9uOiBZb3UgZG8gbm90IG5lZWQgdG8gcHV0IC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgaW4gaGVyZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuQ09ORklHX0ZJTEVTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L1dFQi1JTkYvZXhhbXBsZXMtY29uZmlnLnhtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtLS0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5TdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNsaWVudDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLk5VTUJFUl9PRl9WSUVXU19JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkgYW5kIGlmCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04gaXMgdHJ1ZSAoPSBkZWZhdWx0KQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4gSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUKLSAgICAgICAgICAgIHJlbmRlcmVkIEhUTUwgb3V0cHV0LgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgbm90IGFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLgotICAgICAgICAgICAgaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90Ci0gICAgICAgICAgICBpbmZsdWVuY2UgdGhlIEhUTUwgY29kZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIGEgamF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRoYXQgaXMgYWJsZSB0byByZXN0b3JlIHRoZQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMKLSAgICAgICAgICAgIHdpdGggbG9uZyBsaXN0cyBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcAotICAgICAgICAgICAgaWYgeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZSBwYWdlLgotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BVVRPX1NDUk9MTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQotICAgICAgICAgICAgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucwotICAgICAgICAgICAgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IgZGlmZmVuZW50IGVuY3J5cHRpb24gc3RyZW5ndGhzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VDUkVUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+TnpZMU5ETXlNVEE9PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmFsaWRhdGUgbWFuYWdlZCBiZWFucywgbmF2aWdhdGlvbiBydWxlcyBhbmQgZW5zdXJlIHRoYXQgZm9ybXMgYXJlIG5vdCBuZXN0ZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVHJlYXQgcmVhZG9ubHkgc2FtZSBhcyBpZiBkaXNhYmxlZCBhdHRyaWJ1dGUgd2FzIHNldCBmb3Igc2VsZWN0IGVsZW1lbnRzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUkVBRE9OTFlfQVNfRElTQUJMRURfRk9SX1NFTEVDVFM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBVc2UgdGhlIGRlZmluZWQgY2xhc3MgYXMgdGhlIGNsYXNzIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSByZXNvdXJjZSBpcyBhZGRlZCB0byB0aGUKLSAgICAgICAgICAgIEV4dGVuc2lvbkZpbHRlciBoYW5kbGluZy4gVXNpbmcgU3RyZWFtaW5nQWRkUmVzb3VyY2UgaGVyZSBoZWxwcyB3aXRoIHBlcmZvcm1hbmNlLiBJZiB5b3Ugd2FudCB0byBhZGQKLSAgICAgICAgICAgIGN1c3RvbSBjb21wb25lbnRzIGFuZCB3YW50IHRvIHVzZSB0aGUgRXh0ZW5zaW9uRmlsdGVyLCB5b3UgbmVlZCB0byBwcm92aWRlIHlvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIGhlcmUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BRERfUkVTT1VSQ0VfQ0xBU1M8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwudXRpbC5EZWZhdWx0QWRkUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgICAgIAotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZpcnR1YWwgcGF0aCBpbiB0aGUgVVJMIHdoaWNoIHRyaWdnZXJzIGxvYWRpbmcgb2YgcmVzb3VyY2VzIGZvciB0aGUgTXlGYWNlcyBleHRlbmRlZCBjb21wb25lbnRzCi0gICAgICAgICAgICBpbiB0aGUgRXh0ZW5zaW9uRmlsdGVyLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUkVTT1VSQ0VfVklSVFVBTF9QQVRIPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L2ZhY2VzL215RmFjZXNFeHRlbnNpb25SZXNvdXJjZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBDaGVjayBpZiB0aGUgZXh0ZW5zaW9ucy1maWx0ZXIgaGFzIGJlZW4gcHJvcGVybHkgY29uZmlndXJlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNIRUNLX0VYVEVOU0lPTlNfRklMVEVSPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBEZWZpbmUgcGFydGlhbCBzdGF0ZSBzYXZpbmcgYXMgdHJ1ZS9mYWxzZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuUEFSVElBTF9TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0KLSAgICA8IS0tIExpc3RlbmVyLCB0byBhbGxvdyBKZXR0eSBzZXJ2aW5nIE15RmFjZXMgYXBwcyAtLT4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMud2ViYXBwLlN0YXJ0dXBTZXJ2bGV0Q29udGV4dExpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IC0tPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmcgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4qLmpzZjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4LmpzcDwvd2VsY29tZS1maWxlPgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlkYTRhZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgICAgPGY6dmlldz4KLSAgICAgICAgICAgIDxoOmZvcm0gaWQ9Im1haW5Gb3JtIj4KLSAgICAgICAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjMiPgotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0iZmlyc3RfbmFtZSIgdmFsdWU9IkZpcnN0IG5hbWU6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJmaXJzdF9uYW1lIiBsYWJlbD0iRmlyc3QgbmFtZSIgdmFsdWU9IiN7aGVsbG9Xb3JsZC5wZXJzb24uZmlyc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJmaXJzdF9uYW1lIiBzaG93U3VtbWFyeT0idHJ1ZSIgc2hvd0RldGFpbD0iZmFsc2UiLz4KLQotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0ibGFzdF9uYW1lIiB2YWx1ZT0iTGFzdCBuYW1lOiIvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0ibGFzdF9uYW1lIiBsYWJlbD0iTGFzdCBuYW1lIiB2YWx1ZT0iI3toZWxsb1dvcmxkLnBlcnNvbi5sYXN0TmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0ibGFzdF9uYW1lIiBzaG93U3VtbWFyeT0idHJ1ZSIgc2hvd0RldGFpbD0iZmFsc2UiLz4KLQotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Xb3JsZC5zZW5kfSIvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgICAgICAgPC9oOmZvcm0+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOWMyMjguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTwlQCBwYWdlIHNlc3Npb249ImZhbHNlIiU+Ci08JQotcmVzcG9uc2Uuc2VuZFJlZGlyZWN0KCJoZWxsb1dvcmxkLmpzZiIpOwotJT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcCBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjQ0ZGQyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgICAgPGY6dmlldz4KLSAgICAgICAgICAgIDxoOmZvcm0gaWQ9Im1haW5Gb3JtIj4KLSAgICAgICAgICAgICAgICA8aDI+PGg6b3V0cHV0VGV4dCB2YWx1ZT0iSGVsbG8gI3toZWxsb1dvcmxkLnBlcnNvbi5maXJzdE5hbWV9ICN7aGVsbG9Xb3JsZC5wZXJzb24ubGFzdE5hbWV9LiBXZSBob3BlIHlvdSBlbmpveSBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciEiLz48L2gyPgotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIGFjdGlvbj0iYmFjayI+Ci0gICAgICAgICAgICAgICAgICAgIDxoOm91dHB1dFRleHQgdmFsdWU9IkhvbWUiLz4KLSAgICAgICAgICAgICAgICA8L2g6Y29tbWFuZExpbms+Ci0gICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgPC9mOnZpZXc+Ci0gICAgPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9leGFtcGxlcy9wb20ueG1sIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NWFkNWYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL2V4YW1wbGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIHByb2plY3Q8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay9leGFtcGxlcy88L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay9leGFtcGxlcy88L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rL2V4YW1wbGVzLzwvdXJsPgotICAgIDwvc2NtPgotICAgIAotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS1UaGlzIHBsdWdpbiBhbGxvd3MgdG8gcnVuIHRoZSBleGFtcGxlIHVzaW5nIG12biBqZXR0eTpydW4gLS0+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamV0dHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjYuMS44PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c2NhbkludGVydmFsU2Vjb25kcz4xMDwvc2NhbkludGVydmFsU2Vjb25kcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLSAgICA8bW9kdWxlcz4KLSAgICAgICAgPG1vZHVsZT5oZWxsb193b3JsZDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmZlYXR1cmUtc2V0XzAxPC9tb2R1bGU+Ci0gICAgPC9tb2R1bGVzPgotCi0gICAgPHByb2ZpbGVzPgotICAgICAgICA8IS0tIFRoaXMgcHJvZmlsZSBpcyBpbnZva2VkIGJ5IC1EcHJlcGFyZVJlbGVhc2U9dHJ1ZS4gIFRoaXMgYWxsb3dzIG12biByZWxlYXNlOnByZXBhcmUgdG8KLSAgICAgICAgICAgIHJ1biBzdWNjZXNzZnVsbHkgb24gdGhlIGFzc2VtYmx5IHByb2plY3RzLiAtLT4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+cHJlcGFyZS1yZWxlYXNlPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+cHJlcGFyZVJlbGVhc2U8L25hbWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxtb2R1bGVzPgotICAgICAgICAgICAgICAgIDxtb2R1bGU+YXNzZW1ibHk8L21vZHVsZT4KLSAgICAgICAgICAgIDwvbW9kdWxlcz4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ3VtZW50cz4tRHByZXBhcmVSZWxlYXNlPC9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDx0cmluaWRhZC52ZXJzaW9uPjEuMi45PC90cmluaWRhZC52ZXJzaW9uPgotICAgIDwvcHJvcGVydGllcz4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9wYXJlbnQvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvcGFyZW50L0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9wYXJlbnQvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9wYXJlbnQvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9wYXJlbnQvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvcGFyZW50L05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09Ci09PSAgVmVyc2lvbiAyLjAsIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBNeUZhY2VzIE1hdmVuIFBsdWdpbnMgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOgotCi0gLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgT3JhY2xlIENvcnAsIDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vPi4KLWFuZCBhcmUgbGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIHRoZSAKLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCIKLQotU2VlIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBhbGwgbGljZW5zZXMgCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9wYXJlbnQvcG9tLnhtbCBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9wYXJlbnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg4MGVhNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvcGFyZW50L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj42PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFByb2plY3QgUGFyZW50PC9uYW1lPgotICAgIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyPC91cmw+Ci0KLSAgICA8aXNzdWVNYW5hZ2VtZW50PgotICAgICAgICA8c3lzdGVtPmppcmE8L3N5c3RlbT4KLSAgICAgICAgPHVybD5odHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvRVhUVkFMPC91cmw+Ci0gICAgPC9pc3N1ZU1hbmFnZW1lbnQ+Ci0KLSAgICA8Y2lNYW5hZ2VtZW50PgotICAgICAgICA8c3lzdGVtPmNvbnRpbnV1bTwvc3lzdGVtPgotICAgICAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLnpvbmVzLmFwYWNoZS5vcmc6ODA4MC9jb250aW51dW08L3VybD4KLSAgICAgICAgPG5vdGlmaWVycz4KLSAgICAgICAgICAgIDxub3RpZmllcj4KLSAgICAgICAgICAgICAgICA8dHlwZT5tYWlsPC90eXBlPgotICAgICAgICAgICAgICAgIDxzZW5kT25TdWNjZXNzPnRydWU8L3NlbmRPblN1Y2Nlc3M+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhZGRyZXNzPmNvbW1pdHNAbXlmYWNlcy5hcGFjaGUub3JnPC9hZGRyZXNzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvbm90aWZpZXI+Ci0gICAgICAgIDwvbm90aWZpZXJzPgotICAgIDwvY2lNYW5hZ2VtZW50PgotICAgIAotICAgIDxpbmNlcHRpb25ZZWFyPjIwMDg8L2luY2VwdGlvblllYXI+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+TUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLQotICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KLSAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+Ci0KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS0KLSAgICAgICAgICAgICAgICAgICAgLSBDb3B5IExJQ0VOU0UudHh0IGFuZCBOT1RJQ0UudHh0IHNvIHRoYXQgdGhleSBhcmUgaW5jbHVkZWQKLSAgICAgICAgICAgICAgICAgICAgLSBpbiB0aGUgLWphdmFkb2MgamFyIGZpbGUgZm9yIHRoZSBjb21wb25lbnQuCi0gICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+amF2YWRvYy5yZXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hcGlkb2NzL01FVEEtSU5GIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTElDRU5TRS50eHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTk9USUNFLnR4dCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPCEtLQotICAgICAgICAgICAgICAgIC0gTWFrZSBhIGNoZWNrc3R5bGUgdmlvbGF0aW9uIGEgY29tcGlsZSBlcnJvci4gTm90ZSB0aGF0IGlmIGEgY29tcGlsZSBlcnJvciBvY2N1cnMsCi0gICAgICAgICAgICAgICAgLSBmdXJ0aGVyIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0YXJnZXQvc2l0ZS9jaGVja3N0eWxlLmh0bWwgKHByZXNlbnQgZXZlbiB3aGVuCi0gICAgICAgICAgICAgICAgLSBqdXN0IHRoZSBjb21waWxlIGdvYWwgYW5kIG5vdCB0aGUgc2l0ZSBnb2FsIGhhcyBiZWVuIHJ1bikuIE5vdGUgYWxzbyB0aGF0IGNoaWxkCi0gICAgICAgICAgICAgICAgLSBwcm9qZWN0cyBtYXkgcmVkZWNsYXJlIHRoaXMgcGx1Z2luIGFuZCBwcm92aWRlIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIHNldHRpbmdzCi0gICAgICAgICAgICAgICAgLSB0byB1c2UgZGlmZmVyZW50IGNoZWNrcyAobW9yZSBvciBsZXNzIHN0cmljdCB0aGFuIHRoZSBkZWZhdWx0KS4KLSAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGVja3N0eWxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+dmVyaWZ5LXN0eWxlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNoZWNrPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlnTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdGFuZGFyZC54bWw8L2NvbmZpZ0xvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aGVhZGVyTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWhlYWRlci50eHQ8L2hlYWRlckxvY2F0aW9uPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBTZXQgY29tcGlsZSBzb3VyY2UgYXQgMS41LCBzaW5jZSB0aGUgdGFyZ2V0IEpTRiBpbXBsIGlzIDEuMiAtLT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgotICAgICAgICAgICAgICAgICAgICA8b3B0aW1pemU+ZmFsc2U8L29wdGltaXplPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotICAgIDxyZXBvc2l0b3JpZXM+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPm1hdmVuMi1yZXBvc2l0b3J5LmRldi5qYXZhLm5ldDwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5KYXZhLm5ldCBSZXBvc2l0b3J5IGZvciBNYXZlbjwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL2Rvd25sb2FkLmphdmEubmV0L21hdmVuLzEvPC91cmw+Ci0gICAgICAgICAgICA8bGF5b3V0PmxlZ2FjeTwvbGF5b3V0PgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgPC9yZXBvc2l0b3JpZXM+Ci0KLSAgICA8cmVwb3J0aW5nPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWp4ci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXJlcG9ydC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40LjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBtZC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cnVsZXNldHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvYmFzaWMueG1sPC9ydWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL3VudXNlZGNvZGUueG1sPC9ydWxlc2V0PgotICAgICAgICAgICAgICAgICAgICA8L3J1bGVzZXRzPgotICAgICAgICAgICAgICAgICAgICA8bGlua1hyZWY+dHJ1ZTwvbGlua1hyZWY+Ci0gICAgICAgICAgICAgICAgICAgIDxtaW5pbXVtVG9rZW5zPjEwMDwvbWluaW11bVRva2Vucz4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldEpkaz4xLjU8L3RhcmdldEpkaz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1jaGVja3Mtc3RhbmRhcmQueG1sPC9jb25maWdMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGhlYWRlckxvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1oZWFkZXIudHh0PC9oZWFkZXJMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvcmVwb3J0aW5nPgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvcGFyZW50LzwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rL3BhcmVudC88L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rL3BhcmVudC88L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgICAgICA8c25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICAgICAgPHVuaXF1ZVZlcnNpb24+ZmFsc2U8L3VuaXF1ZVZlcnNpb24+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLnNuYXBzaG90czwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgTWF2ZW4gU25hcHNob3QgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgPHNpdGU+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTI8L3VybD4KLSAgICAgICAgPC9zaXRlPgotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtYXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wZXJmb3JtUmVsZWFzZTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvY3M8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxqc2YudmVyc2lvbj4xLjIuNDwvanNmLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI4NzkzMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSAtLS0tLS0NCi1PdmVydmlldw0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMg0KLQ0KLSAgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgcHJvdmlkZXMgdmVyc2lvbnMgZm9yIEpTRiAxLjEgYW5kIDEuMg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9wYXJlbnQvc3JjL3NpdGUvc2l0ZS54bWwgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvcGFyZW50L3NyYy9zaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTc2MzFjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9wYXJlbnQvc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgbmFtZT0iQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IiPgotICA8YmFubmVyTGVmdD4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlczwvbmFtZT4KLSAgICA8c3JjPmltZy9iYW5uZXJzL015RmFjZXNfbG9nby5qcGc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWw8L2hyZWY+Ci0gIDwvYmFubmVyTGVmdD4KLQotICA8YmFubmVyUmlnaHQ+Ci0gICAgPG5hbWU+QXBhY2hlIEJhbm5lcjwvbmFtZT4KLSAgICA8c3JjPmltZy9iYW5uZXJzL2FwYWNoZV9iYW5uZXIucG5nPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvaHJlZj4KLSAgPC9iYW5uZXJSaWdodD4gIAotCi0gIDxwdWJsaXNoRGF0ZSBmb3JtYXQ9ImRkIE1NTSB5eXl5Ii8+Ci0KLSAgPHNraW4+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLm1hdmVuPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtc2l0ZS1za2luPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvc2tpbj4KLQotICA8Ym9keT4KLSAgICA8bGlua3M+Ci0gICAgICA8aXRlbSBuYW1lPSJBcGFjaGUiIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZyIvPgotICAgICAgPGl0ZW0gbmFtZT0iTXlGYWNlcyIgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCBNeWZhY2VzIEV4dFZhbCIgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9kb3dubG9hZC5odG1sIi8+Ci0gICAgPC9saW5rcz4KLQotICAgIDxtZW51IG5hbWU9IkFwYWNoZSBNeUZhY2VzIiBpbmhlcml0PSJ0b3AiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZG93bmxvYWQuaHRtbCIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IG5hbWU9IkNvbnRlbnRzIiBpbmhlcml0PSJ0b3AiPgotICAgICAgICA8aXRlbSBuYW1lPSJNYWluIFNpdGUiICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sIi8+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkV4dFZhbCBmb3IgSlNGIDEuMSIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExL2luZGV4Lmh0bWwiIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9ImR1bW15IiAgICAgICAgaHJlZj0iZHVtbXkiLz4KLSAgICAgICAgPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjIiICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJDb3JlIE1vZHVsZSIgICAgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9teWZhY2VzLWV4dHZhbC1jb3JlL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iUHJvcGVydHkgVmFsaWRhdGlvbiIgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvdmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbi9pbmRleC5odG1sIi8+Ci0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IlRyaW5pZGFkIFN1cHBvcnQiICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2NvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0L2luZGV4Lmh0bWwiLz4KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iR2VuZXJpYyBTdXBwb3J0IiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydC9pbmRleC5odG1sIi8+Ci0gICAgICAgIDwvaXRlbT4KLSAgICA8L21lbnU+Ci0JCi0gICAgPG1lbnUgbmFtZT0iRG9jdW1lbnRhdGlvbiI+Ci0gICAgICA8aXRlbSBuYW1lPSJXaWtpIiAgICAgICAgIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvbXlmYWNlcy9FeHRlbnNpb25zL1ZhbGlkYXRvci8iLz4KLSAgICA8L21lbnU+Ci0KLSAgICA8bWVudSByZWY9InJlcG9ydHMiLz4KLQotICAgIDxtZW51IG5hbWU9IkZvdW5kYXRpb24iIGluaGVyaXQ9ImJvdHRvbSI+Ci0gICAgICA8aXRlbSBuYW1lPSJBU0YiICAgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlNwb25zb3JzaGlwIiAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9zcG9uc29yc2hpcC5odG1sIiAvPgotICAgICAgPGl0ZW0gbmFtZT0iVGhhbmtzIiAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3RoYW5rcy5odG1sIiAvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3BvbS54bWwgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2NDBlMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+NjwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1tb2R1bGU8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBNb2R1bGU8L25hbWU+Ci0gICAgPHVybD5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTI8L3VybD4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rLzwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rLzwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvPC91cmw+Ci0gICAgPC9zY20+Ci0KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDx1bmlxdWVWZXJzaW9uPmZhbHNlPC91bmlxdWVWZXJzaW9uPgotICAgICAgICAgICAgPGlkPmFwYWNoZS5zbmFwc2hvdHM8L2lkPgotICAgICAgICAgICAgPG5hbWU+QXBhY2hlIE1hdmVuIFNuYXBzaG90IFJlcG9zaXRvcnk8L25hbWU+Ci0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4KLSAgICAgICAgPC9zbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgICAgIDxzaXRlPgotICAgICAgICAgICAgPGlkPmFwYWNoZS1zaXRlPC9pZD4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyPC91cmw+Ci0gICAgICAgIDwvc2l0ZT4KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0KLSAgICA8IS0tIFdBUk5JTkc6IERPIE5PVCBHRU5FUkFURSBTSVRFIEZST00gSEVSRSBESVJFQ1RMWQotICAgIFNpbmNlIHRoaXMgcHJvamVjdCBoYXMgYW4gYXN5bmMgcmVsZWFzZSBwcm9jZWR1cmUgKG5vdAotICAgIGFsbCBtb2R1bGVzIHNob3VsZCBiZSByZWxlYXNlZCBhdCBvbmNlKSwgdGhlIHBhcmVudCBwb20ueG1sIAotICAgIGlzIG5vdCB0aGlzICh0aGVyZSBpcyBhIG1vZHVsZSBmb3IgdGhhdCkuIFVzZSBtYXZlbiBzaXRlIAotICAgIHBsdWdpbiBoZXJlIGNhdXNlIHByb2JsZW1zIHdoZW4gdGhlIHNpdGUgaXMgZ2VuZXJhdGVkLgotICAgIFRoZSBwcm9jZWR1cmUgbXVzdCBleGVjdXRlIHNpdGUgY29tbW1hbmQgZmlyc3Qgb24gcGFyZW50IAotICAgIG1vZHVsZSBhbmQgdGhlbiBvbiBlYWNoIG1vZHVsZSBsaXN0ZWQgYmVsb3cuIAotICAgICAtLT4KLQotICAgIDxtb2R1bGVzPgotICAgICAgICA8bW9kdWxlPnBhcmVudDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmNvcmU8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT52YWxpZGF0aW9uLW1vZHVsZXM8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5jb21wb25lbnQtc3VwcG9ydDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmV4YW1wbGVzPC9tb2R1bGU+Ci0gICAgPC9tb2R1bGVzPgotCi0gICAgPHByb2ZpbGVzPgotICAgICAgICA8IS0tIFRoaXMgcHJvZmlsZSBpcyBpbnZva2VkIGJ5IC1EcHJlcGFyZVJlbGVhc2U9dHJ1ZS4gIFRoaXMgYWxsb3dzIG12biByZWxlYXNlOnByZXBhcmUgdG8KLSAgICAgICAgICAgIHJ1biBzdWNjZXNzZnVsbHkgb24gdGhlIGFzc2VtYmx5IHByb2plY3RzLiAtLT4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+cHJlcGFyZS1yZWxlYXNlPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+cHJlcGFyZVJlbGVhc2U8L25hbWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxtb2R1bGVzPgotICAgICAgICAgICAgICAgIDxtb2R1bGU+YXNzZW1ibHk8L21vZHVsZT4KLSAgICAgICAgICAgIDwvbW9kdWxlcz4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ3VtZW50cz4tRHByZXBhcmVSZWxlYXNlPC9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotICAgIAotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8anNmLnZlcnNpb24+MS4yLjQ8L2pzZi52ZXJzaW9uPgotICAgIDwvcHJvcGVydGllcz4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvc2l0ZS9wb20ueG1sIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3NpdGUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRlZjAzMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvc2l0ZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICAgICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gICAgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gICAgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAgICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgICAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgKgotICAgICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgICAqCi0gICAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXNpdGU8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4yLjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvcjwvbmFtZT4KLSAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3I8L3VybD4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPGRlZmF1bHRHb2FsPnNpdGU8L2RlZmF1bHRHb2FsPgotICAgICAgICA8ZXh0ZW5zaW9ucz4KLSAgICAgICAgICA8ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi53YWdvbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPndhZ29uLXNzaC1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC1hbHBoYS01PC92ZXJzaW9uPgotICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICA8L2V4dGVuc2lvbnM+Ci0gICAgPC9idWlsZD4KLSAgICA8cmVwb3J0aW5nPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L3JlcG9ydGluZz4KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay9zaXRlPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvc2l0ZTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay9zaXRlPC91cmw+Ci0gICAgPC9zY20+Ci0gICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgICA8c2l0ZT4KLSAgICAgICAgPGlkPmFwYWNoZS1zaXRlPC9pZD4KLSAgICAgICAgPG5hbWU+QXBhY2hlIFdlYnNpdGU8L25hbWU+Ci0gICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjwvdXJsPgotICAgICAgPC9zaXRlPgotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3NpdGUvc3JjL3NpdGUvYXB0L2Rvd25sb2FkLmFwdCBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9zaXRlL3NyYy9zaXRlL2FwdC9kb3dubG9hZC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTU5OTYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3NpdGUvc3JjL3NpdGUvYXB0L2Rvd25sb2FkLmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0gfn4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotIH5+IGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSB+fiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotIH5+IFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotIH5+ICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotIH5+IHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIH5+DQotIH5+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIH5+DQotIH5+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gfn4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gfn4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotIH5+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gfn4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotIA0KLSAtLS0tLS0NCi1Eb3dubG9hZCBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLSAtLS0tLS0NCi0NCi1Eb3dubG9hZCBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLQ0KLQ0KLSAgVXNlIHRoZSBsaW5rcyBiZWxvdyB0byBkb3dubG9hZCBhIGRpc3RyaWJ1dGlvbiBvZiBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmcm9tDQotICBvbmUgb2Ygb3VyIG1pcnJvcnMuIEl0IGlzIGdvb2QgcHJhY3RpY2UgdG8gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlDQotICBkaXN0cmlidXRpb24gZmlsZXMuDQotDQotICBZb3Ugd2lsbCBiZSBwcm9tcHRlZCBmb3IgYSBtaXJyb3IgLSBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQgb24geW91cnMsIHBsZWFzZSBiZSBwYXRpZW50LCBhcyBpdCBtYXkgdGFrZSAyNA0KLSAgaG91cnMgdG8gcmVhY2ggYWxsIG1pcnJvcnMuDQotDQotICBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBkaXN0cmlidXRlZCBhcyBhIDw8PHppcD4+PiBhcmNoaXZlIChmb3IgV2luZG93cykgYW5kDQotICBhcyBhIDw8PHRhci5nej4+PiBhcmNoaXZlIChmb3IgVU5JWCkuIFRoZSBjb250ZW50IGlzIHRoZSBzYW1lLiBQbGVhc2Ugbm90ZQ0KLSAgdGhhdCB0aGUgPDw8dGFyLmd6Pj4+IGFyY2hpdmVzIGNvbnRhaW4gZmlsZSBuYW1lcyBsb25nZXIgdGhhbiAxMDAgY2hhcmFjdGVycyBhbmQgaGF2ZSBiZWVuDQotICBjcmVhdGVkIHVzaW5nIEdOVSB0YXIgZXh0ZW5zaW9ucy4gVGh1cyB0aGV5IG11c3QgYmUgdW50YXJyZWQgd2l0aCBhIEdOVSBjb21wYXRpYmxlDQotICB2ZXJzaW9uIG9mIHRhci4NCi0NCi0gIDw8IEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIDEuMC4wIERpc3RyaWJ1dGlvbiA+Pg0KLQ0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgICAgICAgICAgICAgICAgICAgICAgICAgfCBNaXJyb3JzIHwgQ2hlY2tzdW0gfCBTaWduYXR1cmUgfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMSAxLjAuMSAodGFyLmd6KSAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDExLTEuMC4xLWJpbi50YXIuZ3p9IG15ZmFjZXMtZXh0dmFsMTEtMS4wLjEtYmluLnRhci5nen19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDExLTEuMC4xLWJpbi50YXIuZ3oubWQ1fSBteWZhY2VzLWV4dHZhbDExLTEuMC4xLWJpbi50YXIuZ3oubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4wLjEtYmluLnRhci5nei5hc2N9IG15ZmFjZXMtZXh0dmFsMTEtMS4wLjEtYmluLnRhci5nei5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4xIDEuMC4xICh6aXApICAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDExLTEuMC4xLWJpbi56aXB9IG15ZmFjZXMtZXh0dmFsMTEtMS4wLjEtYmluLnppcH19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDExLTEuMC4xLWJpbi56aXAubWQ1fSBteWZhY2VzLWV4dHZhbDExLTEuMC4xLWJpbi56aXAubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4wLjEtYmluLnppcC5hc2N9IG15ZmFjZXMtZXh0dmFsMTEtMS4wLjEtYmluLnppcC5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4xIDEuMC4xIFNvdXJjZSAodGFyLmd6KSAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjAuMS1zcmMudGFyLmd6fSBteWZhY2VzLWV4dHZhbDExLTEuMC4xLXNyYy50YXIuZ3p9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4wLjEtc3JjLnRhci5nei5tZDV9IG15ZmFjZXMtZXh0dmFsMTEtMS4wLjEtc3JjLnRhci5nei5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4wLjEtc3JjLnRhci5nei5hc2N9IG15ZmFjZXMtZXh0dmFsMTEtMS4wLjEtc3JjLnRhci5nei5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4xIDEuMC4xIFNvdXJjZSAoemlwKSAgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4wLjEtc3JjLnppcH0gbXlmYWNlcy1leHR2YWwxMS0xLjAuMS1zcmMuemlwfX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMC4xLXNyYy56aXAubWQ1fSBteWZhY2VzLWV4dHZhbDExLTEuMC4xLXNyYy56aXAubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMC4xLXNyYy56aXAuYXNjfSBteWZhY2VzLWV4dHZhbDExLTEuMC4xLXNyYy56aXAuYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMiAxLjIuMSAodGFyLmd6KSAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi50YXIuZ3p9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjEtYmluLnRhci5nen19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi50YXIuZ3oubWQ1fSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi50YXIuZ3oubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjEtYmluLnRhci5nei5hc2N9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjEtYmluLnRhci5nei5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4yIDEuMi4xICh6aXApICAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi56aXB9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjEtYmluLnppcH19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi56aXAubWQ1fSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi56aXAubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjEtYmluLnppcC5hc2N9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjEtYmluLnppcC5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4yIDEuMi4xIFNvdXJjZSAodGFyLmd6KSAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1zcmMudGFyLmd6fSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLXNyYy50YXIuZ3p9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjEtc3JjLnRhci5nei5tZDV9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjEtc3JjLnRhci5nei5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjEtc3JjLnRhci5nei5hc2N9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjEtc3JjLnRhci5nei5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4yIDEuMi4xIFNvdXJjZSAoemlwKSAgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjEtc3JjLnppcH0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1zcmMuemlwfX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4xLXNyYy56aXAubWQ1fSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLXNyYy56aXAubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4xLXNyYy56aXAuYXNjfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLXNyYy56aXAuYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLQ0KLUxhdGVzdCBzb3VyY2UgY29kZSBmcm9tIFNWTiByZXBvc2l0b3J5DQotDQotICAgIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgbGF0ZXN0IEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZlYXR1cmVzLCB0aGUgc291cmNlIGNvZGUgaXMgdW5kZXINCi0gICAgdmVyc2lvbiBjb250cm9sIHdpdGggU1ZOLiAgQ2xpY2sge3t7c291cmNlLXJlcG9zaXRvcnkuaHRtbH0gaGVyZSB9fQ0KLSAgICBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZSB0aGUgQVNGIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFNWTiBSZXBvc2l0b3J5Lg0KLQ0KLVZlcmlmeWluZyBjaGVja3N1bXMNCi0NCi0gICAgSXQgaXMgZXNzZW50aWFsIHRoYXQgeW91IHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIHRoZSBkb3dubG9hZGVkDQotICAgIGZpbGVzIHVzaW5nIHRoZSBQR1AgYW5kIE1ENSBzaWduYXR1cmVzLiBNRDUgdmVyaWZpY2F0aW9uIGVuc3VyZXMgdGhlDQotICAgIGZpbGUgd2FzIG5vdCBjb3JydXB0ZWQgZHVyaW5nIHRoZSBkb3dubG9hZCBwcm9jZXNzLiBQR1AgdmVyaWZpY2F0aW9uDQotICAgIGVuc3VyZXMgdGhhdCB0aGUgZmlsZSBjYW1lIGZyb20gYSBjZXJ0YWluIHBlcnNvbi4NCi0NCi0gICAgVG8gdmVyaWZ5IHRoZSBNRDUgc2lnbmF0dXJlIG9uIHRoZSBmaWxlcywgeW91IG5lZWQgdG8gdXNlIGEgcHJvZ3JhbQ0KLSAgICBjYWxsZWQgPDw8bWQ1Pj4+IG9yIDw8PG1kNXN1bT4+Piwgd2hpY2ggaXMNCi0gICAgaW5jbHVkZWQgaW4gbWFueSBVTklYIGRpc3RyaWJ1dGlvbnMuICBJdCBpcyBhbHNvIGF2YWlsYWJsZSBhcyBwYXJ0IG9mDQotICAgIHt7e2h0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS90ZXh0dXRpbHMvdGV4dHV0aWxzLmh0bWx9R05VIFRleHR1dGlsc319Lg0KLSAgICBXaW5kb3dzIHVzZXJzIGNhbiBnZXQgYmluYXJ5IG1kNSBwcm9ncmFtcyBmcm9tIHt7e2h0dHA6Ly93d3cuZm91cm1pbGFiLmNoL21kNS99aGVyZX19LA0KLSAgICB7e3todHRwOi8vd3d3LnBjLXRvb2xzLm5ldC93aW4zMi9mcmVld2FyZS9jb25zb2xlL31oZXJlfX0sIG9yDQotICAgIHt7e2h0dHA6Ly93d3cuc2xhdmFzb2Z0LmNvbS9mc3VtL31oZXJlfX0uDQotDQotVmVyaWZ5aW5nIHNpZ25hdHVyZXMNCi0NCi0gIAlQR1AgdmVyaWZpY2F0aW9uIGVuc3VyZXMgdGhhdCB0aGUgZmlsZSBjYW1lIGZyb20gYSBjZXJ0YWluIHBlcnNvbi4gIFdlIHN0cm9uZ2x5IHJlY29tbWVuZA0KLQkgIHlvdSB2ZXJpZnkgeW91ciBkb3dubG9hZHMgd2l0aCBib3RoIFBHUCBhbmQgTUQ1Lg0KLQ0KLQlUaGUgUEdQIHNpZ25hdHVyZXMgY2FuIGJlIHZlcmlmaWVkIHVzaW5nIHt7e2h0dHA6Ly93d3cucGdwaS5vcmcvfVBHUH19IG9yIA0KLQl7e3todHRwOi8vd3d3LmdudXBnLm9yZy99R1BHfX0uICBGaXJzdCBkb3dubG9hZCB0aGUgQXBhY2hlIE15RmFjZXMgDQotCXt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvS0VZU31LRVlTfX0JYXMgd2VsbCBhcyB0aGUgPDw8YXNjPj4+IHNpZ25hdHVyZSBmaWxlIA0KLQlmb3IgdGhlIHBhcnRpY3VsYXIgZGlzdHJpYnV0aW9uLiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB5b3UgZ2V0IHRoZXNlIGZpbGVzIGZyb20gdGhlIHVsdGltYXRlDQotCXRydXN0ZWQgc291cmNlIC0gdGhlIG1haW4gQVNGIGRpc3RyaWJ1dGlvbiBzaXRlLCByYXRoZXIgdGhhbiBmcm9tIGEgbWlycm9yLg0KLQlUaGVuIHZlcmlmeSB0aGUgc2lnbmF0dXJlcyB1c2luZyAuLi4NCi0NCi0JICA8PDwNCi0JICAlIHBncGsgLWEgS0VZUw0KLQkgICUgcGdwdiBteWZhY2VzLWV4dHZhbDExLTEuMC4xLWJpbi50YXIuZ3ouYXNjIG15ZmFjZXMtZXh0dmFsMTEtMS4wLjEtYmluLnRhci5neg0KLQkgID4+Pg0KLQ0KLQkgIDxvcj4NCi0NCi0JICA8PDwNCi0JICAlIHBncCAta2EgS0VZUw0KLQkgICUgcGdwIG15ZmFjZXMtZXh0dmFsMTEtMS4wLjEtYmluLnRhci5nei5hc2MgbXlmYWNlcy1leHR2YWwxMS0xLjAuMS1iaW4udGFyLmd6DQotCSAgPj4+DQotDQotCSAgPG9yPg0KLQ0KLQkgIDw8PA0KLSAgCSUgZ3BnIC0taW1wb3J0IEtFWVMNCi0JICAlIGdwZyAtLXZlcmlmeSBteWZhY2VzLWV4dHZhbDExLTEuMC4xLWJpbi50YXIuZ3ouYXNjIG15ZmFjZXMtZXh0dmFsMTEtMS4wLjEtYmluLnRhci5neg0KLQkgID4+Pg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9zaXRlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvc2l0ZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDI1MzliLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy9zaXRlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBhIEpTRiBjZW50cmljIHZhbGlkYXRpb24gZnJhbWV3b3JrLg0KLSAgDQotICAgIEl0IG9mZmVycyBwb3dlcmZ1bCBhbmQgZWFzeSB0byB1c2UgZmllbGQgYmFzZWQgdmFsaWRhdGlvbiBiYXNlZCBvbiBhbm5vdGF0aW9ucy4NCi1JdCBoYXMgYSBwbHVnZ2FibGUgYXJjaGl0ZWN0dXJlLCBzbyBpdCBpcyBwb3NzaWJsZSB0byBhZGQgbmV3IHZhbGlkYXRpb24gbW9kdWxlcyBvciBzdXBwb3J0IGZvciBjb21wb25lbnQgbGlicmFyaWVzIGxpa2UgVHJpbmlkYWQgb3Igb3RoZXIgM3JkIHBhcnR5IGZyYW1ld29ya3MuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLjEueCBhbmQgSlNGIDEuMi54LiBCb3RoIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrDQotDQotICAgIEZ1cnRoZXIgaW5mb3JtYXRpb24gYXJlIGF2YWlsYWJsZSBhdCB0aGUge3t7aHR0cDovL3dpa2kuYXBhY2hlLm9yZy9teWZhY2VzL0V4dGVuc2lvbnMvVmFsaWRhdG9yL31XaWtpfX0uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3NpdGUvc3JjL3NpdGUvc2l0ZS54bWwgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvc2l0ZS9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkMDVjYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvc2l0ZS9zcmMvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCBuYW1lPSJBcGFjaGUgTXlmYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciI+Ci0gIDxiYW5uZXJMZWZ0PgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzPC9uYW1lPgotICAgIDxzcmM+aW1nL2Jhbm5lcnMvTXlGYWNlc19sb2dvLmpwZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbDwvaHJlZj4KLSAgPC9iYW5uZXJMZWZ0PgotCi0gIDxiYW5uZXJSaWdodD4KLSAgICA8bmFtZT5BcGFjaGUgQmFubmVyPC9uYW1lPgotICAgIDxzcmM+aW1nL2Jhbm5lcnMvYXBhY2hlX2Jhbm5lci5wbmc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC9ocmVmPgotICA8L2Jhbm5lclJpZ2h0PiAgCi0KLSAgPHB1Ymxpc2hEYXRlIGZvcm1hdD0iZGQgTU1NIHl5eXkiLz4KLQotICA8c2tpbj4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1zaXRlLXNraW48L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9za2luPgotCi0gIDxib2R5PgotICAgIDxsaW5rcz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSIgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJNeUZhY2VzIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkRvd25sb2FkIE15ZmFjZXMgRXh0VmFsIiAgICAgICBocmVmPSJkb3dubG9hZC5odG1sIi8+Ci0gICAgPC9saW5rcz4KLQotICAgIDxtZW51IG5hbWU9IkFwYWNoZSBNeUZhY2VzIiBpbmhlcml0PSJ0b3AiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZG93bmxvYWQuaHRtbCIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IG5hbWU9IkNvbnRlbnRzIiBpbmhlcml0PSJ0b3AiPgotICAgICAgICA8aXRlbSBuYW1lPSJNYWluIFNpdGUiICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sIi8+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkV4dFZhbCBmb3IgSlNGIDEuMSIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExL2luZGV4Lmh0bWwiIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9ImR1bW15IiAgICAgICAgaHJlZj0iZHVtbXkiLz4KLSAgICAgICAgPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjIiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9pbmRleC5odG1sIiBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8aXRlbSBuYW1lPSJkdW1teSIgICAgICAgIGhyZWY9ImR1bW15Ii8+Ci0gICAgICAgIDwvaXRlbT4KLSAgICA8L21lbnU+Ci0KLSAgICA8bWVudSBuYW1lPSJEb2N1bWVudGF0aW9uIj4KLSAgICAgIDxpdGVtIG5hbWU9Ildpa2kiICAgICAgICAgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9teWZhY2VzL0V4dGVuc2lvbnMvVmFsaWRhdG9yLyIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IHJlZj0icmVwb3J0cyIvPgotCi0gICAgPG1lbnUgbmFtZT0iRm91bmRhdGlvbiIgaW5oZXJpdD0idG9wIj4KLSAgICAgIDxpdGVtIG5hbWU9IkFTRiIgICAgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIiAvPgotICAgICAgPGl0ZW0gbmFtZT0iU3BvbnNvcnNoaXAiICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3Nwb25zb3JzaGlwLmh0bWwiIC8+Ci0gICAgICA8aXRlbSBuYW1lPSJUaGFua3MiICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vdGhhbmtzLmh0bWwiIC8+Ci0gICAgPC9tZW51PgotICA8L2JvZHk+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZGRiMzcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFZhbGlkYXRpb24tTW9kdWxlczwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rL3ZhbGlkYXRpb24tbW9kdWxlcy88L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay92YWxpZGF0aW9uLW1vZHVsZXMvPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay92YWxpZGF0aW9uLW1vZHVsZXMvPC91cmw+Ci0gICAgPC9zY20+Ci0KLSAgICA8bW9kdWxlcz4KLSAgICAgICAgPG1vZHVsZT5wcm9wZXJ0eS12YWxpZGF0aW9uPC9tb2R1bGU+Ci0gICAgICAgIDwhLS1tb2R1bGU+YmVhbi12YWxpZGF0aW9uPC9tb2R1bGUtLT4KLSAgICA8L21vZHVsZXM+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU4MDdiOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgUHJvcGVydHktVmFsaWRhdGlvbi1Nb2R1bGU8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnBlcnNpc3RlbmNlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGVyc2lzdGVuY2UtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICAgICAgPCEtLSBUZXN0IGRlcGVuZGVuY2llcyAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi41PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldC5qc3A8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3AtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zaGFsZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNoYWxlLXRlc3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuNDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovQWJzdHJhY3QqLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9UZXN0VXRpbHMuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypCZWFuLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+ICAgICAgICAgICAgCi0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGM3NDE2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiDQotICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjIiPg0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi0NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYzQ4N2QuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRTZWNyZXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTWVudTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lUmFkaW87Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlDaGVja2JveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUxpc3Rib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHRhcmVhOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgcHVibGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgY29uZmlndXJlUmVxdWlyZWRBdHRyaWJ1dGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOwotICAgICAgICBjb25maWd1cmVNYXhMZW5ndGhBdHRyaWJ1dGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVJlcXVpcmVkQXR0cmlidXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCFwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKSkgfHwKLSAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSkKLSAgICAgICAgICAgICYmCi0gICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGlzQ29tcG9uZW50UmVxdWlyZWQodWlDb21wb25lbnQpKSkKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJgotICAgICAgICAgICAgICAgIUJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRTZWNyZXQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVMaXN0Ym94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lTWVudSB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZVJhZGlvIHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUNoZWNrYm94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TWVudSB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0VGV4dGFyZWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaWYgdGhlcmUgaXMgbm8gc3BlY2lhbCBhdHRyaWJ1dGUgYXQgdGhlIGNvbXBvbmVudCB3aGljaCBzaG91bGQgb3ZlcnJ1bGUKLSAgICAgKiB0aGUgYW5ub3RhdGVkIHByb3BlcnR5IHJldHVybiB0cnVlIQotICAgICAqCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IGNvbXBvbmVudCB3aGljaCBpbXBsZW1lbnRzIHRoZSBFZGl0YWJsZVZhbHVlSG9sZGVyIGludGVyZmFjZQotICAgICAqIEByZXR1cm4gZmFsc2UgdG8gb3ZlcnJ1bGUgdGhlIGFubm90YXRlZCBwcm9wZXJ0eSBlLmcuIGlmIGNvbXBvbmVudCBpcyByZWFkb25seQotICAgICAqLwotICAgIHByb3RlY3RlZCBCb29sZWFuIGlzQ29tcG9uZW50UmVxdWlyZWQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBib29sZWFuIGlzUmVhZE9ubHkgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzUmVhZG9ubHkiKSkpOwotICAgICAgICBib29sZWFuIGlzRGlzYWJsZWQgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzRGlzYWJsZWQiKSkpOwotCi0gICAgICAgIHJldHVybiAhKGlzUmVhZE9ubHkgfHwgaXNEaXNhYmxlZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlTWF4TGVuZ3RoQXR0cmlidXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpOwotCi0gICAgICAgICAgICBpZighKG1heExlbmd0aCBpbnN0YW5jZW9mIEludGVnZXIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0VGV4dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBIdG1sSW5wdXRUZXh0IGh0bWxJbnB1dFRleHQgPSAoSHRtbElucHV0VGV4dCl1aUNvbXBvbmVudDsKLSAgICAgICAgICAgICAgICBodG1sSW5wdXRUZXh0LnNldE1heGxlbmd0aCgoSW50ZWdlciltYXhMZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWJlNTYwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFNlY3JldDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVMaXN0Ym94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVSYWRpbzsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueU1lbnU7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dGFyZWE7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBIdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IKLXsKLSAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQotICAgIHsKLSAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IChTdHJpbmcpIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCh1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldExhYmVsIikpOwotCi0gICAgICAgICAgICBpZihsYWJlbCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxhYmVsID0gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9vdmVycmlkZSB0aGUgbGFiZWwgaWYgdGhlIGFubm90YXRpb24gcHJvdmlkZXMgYSBsYWJlbAotICAgICAgICAgICAgaWYobWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsYWJlbCA9IG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwsIFN0cmluZy5jbGFzcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9QbGFjZUxhYmVsKGZhY2VzTWVzc2FnZSwgbGFiZWwsIGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRTZWNyZXQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVMaXN0Ym94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lTWVudSB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZVJhZGlvIHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUNoZWNrYm94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TWVudSB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0VGV4dGFyZWE7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxZjg0Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwucmVjb3JkZXIuQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXI7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKG5ldyBDcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlcigpKTsNCi0NCi0gICAgICAgIGluaXRTdGF0aWNTdHJhdGVneU1hcHBpbmdzKCk7DQotICAgICAgICBpbml0RGVmYXVsdENvbXBvbmVudEluaXRpYWxpemVyKCk7DQotICAgICAgICBpbml0RGVmYXVsdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigpOw0KLSAgICAgICAgYWRkU2tpcFZhbGlkYXRpb25TdXBwb3J0KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdGF0aWNTdHJhdGVneU1hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGpwYUJhc2VkVmFsaWRhdGlvbiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OOw0KLSAgICAgICAgaWYgKGpwYUJhc2VkVmFsaWRhdGlvbiA9PSBudWxsDQotICAgICAgICAgICAgICAgIHx8ICFqcGFCYXNlZFZhbGlkYXRpb24uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA9IG5ldyBTdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgICAgICBzdGF0aWNDb25maWcuc2V0U291cmNlT2ZNYXBwaW5nKA0KLSAgICAgICAgICAgICAgICBFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSArIi5qcGFfc3RyYXRlZ3lfbWFwcGluZ3MiKTsNCi0NCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHLCBzdGF0aWNDb25maWcpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ3ZWIueG1sIHBhcmFtZXRlciB0byBkZWFjdGl2YXRlIGl0IikNCi0gICAgcHJpdmF0ZSB2b2lkIGluaXREZWZhdWx0Q29tcG9uZW50SW5pdGlhbGl6ZXIoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gIndlYi54bWwgcGFyYW1ldGVyIHRvIGRlYWN0aXZhdGUgaXQiKQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdERlZmF1bHRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoDQotICAgICAgICAgICAgICAgIG5ldyBIdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFNraXBWYWxpZGF0aW9uU3VwcG9ydCgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmluZm8oImFkZGluZyBzdXBwb3J0IGZvciBAU2tpcFZhbGlkYXRpb24iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmRlbnlSZW5kZXJlckludGVyY2VwdG9yKFZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcyk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFZhbGlkYXRpb25JbnRlcmNlcHRvcldpdGhTa2lwVmFsaWRhdGlvblN1cHBvcnQoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvcldpdGhTa2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2N2I2YTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvcldpdGhTa2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LlNraXBWYWxpZGF0aW9uU3RyYXRlZ3k7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0IGV4dGVuZHMgVmFsaWRhdGlvbkludGVyY2VwdG9yCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2tpcFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkKLSAgICB7Ci0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoU2tpcFZhbGlkYXRpb25TdXBwb3J0LmNsYXNzKSkKLSAgICAgICAgewotICAgICAgICAgICAgQm9vbGVhbiBza2lwVmFsaWRhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCBCb29sZWFuLmNsYXNzKTsKLQotICAgICAgICAgICAgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhza2lwVmFsaWRhdGlvbikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInZhbGlkYXRpb24gb2YgIiArIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY2FuY2VsZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIFNraXBWYWxpZGF0aW9uU3RyYXRlZ3kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc3N2E0ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRvY3VtZW50YXRpb24iKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NRVNTQUdFU19KUEEgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJKUEFfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFUyIpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfSlBBX0JBU0VEX1ZBTElEQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OIik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vRG91YmxlUmFuZ2UuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vRG91YmxlUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjZDRlZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0RvdWJsZVJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgRG91YmxlUmFuZ2UNCi17DQotICAgIGRvdWJsZSBtaW5pbXVtKCkgZGVmYXVsdCAwOw0KLQ0KLSAgICBkb3VibGUgbWF4aW11bSgpIGRlZmF1bHQgRG91YmxlLk1BWF9WQUxVRTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Kb2luVmFsaWRhdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Kb2luVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGI1MmJmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vSm9pblZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBKb2luVmFsaWRhdGlvbg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTGVuZ3RoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZDc1ZmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBMZW5ndGgNCi17DQotICAgIGludCBtaW5pbXVtKCkgZGVmYXVsdCAwOw0KLQ0KLSAgICBpbnQgbWF4aW11bSgpIGRlZmF1bHQgSW50ZWdlci5NQVhfVkFMVUU7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmM3NTJkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgTG9uZ1JhbmdlDQotew0KLSAgICBsb25nIG1pbmltdW0oKSBkZWZhdWx0IDA7DQotDQotICAgIGxvbmcgbWF4aW11bSgpIGRlZmF1bHQgTG9uZy5NQVhfVkFMVUU7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUGF0dGVybi5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNzdkYzguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUGF0dGVybg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgIm5vX21hdGNoIjsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZC5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjY1YjNjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUmVxdWlyZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBSZXF1aXJlZA0KLXsNCi0gICAgLyoqDQotICAgICAqIHRvIGN1c3RvbWl6ZSB0aGUgZXJyb3IgbWVzc2FnZSBvcg0KLSAgICAgKiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBqc2YgcmVxdWlyZWQgbWVzc2FnZSB3aXRoIHRoZSB1c2FnZSBvZiB0aGUgbWVzc2FnZSByZXNvbHZlciBtZWNoYW5pc20NCi0gICAgICoNCi0gICAgICogQHJldHVybiBhbiBvcHRpb25hbCBlcnJvciBtZXNzYWdlIGtleQ0KLSAgICAgKi8NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImZpZWxkX3JlcXVpcmVkIjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTdlZjgwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBTa2lwVmFsaWRhdGlvbg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3OWY2NTEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUYXJnZXQoVFlQRSkKLUBSZXRlbnRpb24oUlVOVElNRSkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIEBpbnRlcmZhY2UgU2tpcFZhbGlkYXRpb25TdXBwb3J0Ci17Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9WYWxpZGF0b3IuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NDU2ZDAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBWYWxpZGF0b3INCi17DQotICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yPltdIHZhbHVlKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhM2RiNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yIGV4dGVuZHMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQotICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOwotCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFByb3BlcnR5RGV0YWlscykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24ob2JqZWN0LmdldENsYXNzKCkgKyAiIGlzIG5vdCBhICIgKyBQcm9wZXJ0eURldGFpbHMuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSAoUHJvcGVydHlEZXRhaWxzKW9iamVjdDsKLQotICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKTsKLQotICAgICAgICAvL1RPRE8gdGVzdCB3aXRoIGNvbXBsZXggY29tcG9uZW50cwotICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnNldEluZm9ybWF0aW9uKAotICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBmaW5kIGFuZCBhZGQgYW5ub3RhdGlvbnMKLSAgICAgICAgICovCi0gICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9ucyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlODAxMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9SW52YWxpZCBmb3JtYXQNCi1ub19tYXRjaF9kZXRhaWw9VGhlIHJlcXVpcmVkIGZvcm1hdGUgaXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdhYjU0My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9XHUwNjI3XHUwNjQ0XHUwNjM1XHUwNjRhXHUwNjNhXHUwNjI5IFx1MDYyZVx1MDYyN1x1MDYzN1x1MDYyNlx1MDYyOQ0KLW5vX21hdGNoX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MzVcdTA2NGFcdTA2M2FcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjM3XHUwNjQ0XHUwNjQ4XHUwNjI4XHUwNjI5IFx1MDY0N1x1MDY0OTogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGQ2NDkwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotbm9fbWF0Y2g9Rm9ybWF0IGludlx1MDBlMGxpZAotbm9fbWF0Y2hfZGV0YWlsPUVsIGZvcm1hdCByZXF1ZXJpdCBcdTAwZTlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZTcwMWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPVVuZ/xsdGlnZXMgRm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPURhcyBlcmZvcmRlcmxpY2hlIEZvcm1hdCBpc3Q6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlODAxMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9SW52YWxpZCBmb3JtYXQNCi1ub19tYXRjaF9kZXRhaWw9VGhlIHJlcXVpcmVkIGZvcm1hdGUgaXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiMTA3Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW5vX21hdGNoPUZvcm1hdG8gaW52XHUwMGUxbGlkbyAKLW5vX21hdGNoX2RldGFpbD1FbCBmb3JtYXRvIHJlcXVlcmlkbyBlczogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjBhMjIzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1MZSBmb3JtYXQgZXN0IGludmFsaWRlDQotbm9fbWF0Y2hfZGV0YWlsPUxlIGZvcm1hdCBkb2l0ICZlY2lyYzt0cmUgZGUgbGEgZm9ybWU6IHswfQ0KLQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE4NzQ4Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW5vX21hdGNoPUZvcm1hdG8gbm9uIHZhbGlkbwotbm9fbWF0Y2hfZGV0YWlsPUlsIGZvcm1hdG8gcmljaGllc3RvICZlZ3JhdmU7OiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NGJjNzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUdlXHUwMGU3ZXJzaXogYmlcdTAwZTdpbQ0KLW5vX21hdGNoX2RldGFpbD1nZXJla2VuIGJpXHUwMGU3aW06IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYWU2NGIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLSAgICAgICAgZXh0ZW5kcw0KLSAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBiYXNlTmFtZSA9IG51bGw7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYgKGJhc2VOYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZU5hbWUgPSBzdXBlci5nZXRCYXNlTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGJhc2VOYW1lOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDc2YWQ5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogdGhlIGpwYSBzdXBwb3J0IGlzIGFuIGV4Y2VwdGlvbiBpbiB2aWV3IG9mIHNvbWUgbWVjaGFuaXNtcyAtIHNvIHRoZXJlJ3Mgbm8gY29udmVudGlvbiBmb3IgdGhlIG1lc3NhZ2UgYnVuZGxlLg0KLSAqIGluc3RlYWQgb2YgdGhlIGNvbnZlbnRpb24gdGhlcmUgaXMgYSBnbG9iYWwgcHJvcGVydHkgdG8gaGF2ZSBhbiBhbHRlcm5hdGl2ZSB0byB3ZWIueG1sIGNvbmZpZ3VyYXRpb24NCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMgPSAiSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0JBU0VfTkFNRSA9IFdlYlhtbFBhcmFtZXRlci5WQUxJREFUSU9OX01FU1NBR0VTX0pQQTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfTkFNRSA9IEpwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5jbGFzcw0KLSAgICAgICAgICAgIC5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLnJlcGxhY2UoIi5tZXNzYWdlLnJlc29sdmVyIiwgIi5tZXNzYWdlLmJ1bmRsZSIpKyAiLmpwYV9tZXNzYWdlcyI7DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tQmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZihDVVNUT01fQkFTRV9OQU1FICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIENVU1RPTV9CQVNFX05BTUU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKFN0cmluZylFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShKUEFfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFUyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBCQVNFX05BTUU7DQotICAgIH0NCi0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Eb3VibGVSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVkZDE4Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Eb3VibGVSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkRvdWJsZVJhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBEb3VibGVSYW5nZSBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShEb3VibGVSYW5nZS5jbGFzcyk7DQotDQotICAgICAgICBkb3VibGUgbWluaW11bSA9IGFubm90YXRpb24ubWluaW11bSgpOw0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTiwgbWluaW11bSk7DQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYLCBhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBpZihtaW5pbXVtID4gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSm9pbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMwODgyZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uZXh0cmFjdG9yLkRlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpvaW5NZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IoKTsNCi0NCi0gICAgICAgIFN0cmluZ1tdIHRhcmdldEV4cHJlc3Npb25zID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShKb2luVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotDQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHM7DQotICAgICAgICBmb3IgKFN0cmluZyB0YXJnZXRFeHByZXNzaW9uIDogdGFyZ2V0RXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChtZXRhRGF0YUVudHJ5LCB0YXJnZXRFeHByZXNzaW9uKTsNCi0NCi0gICAgICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBleHRyYWN0b3IuZXh0cmFjdChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscykuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSBFeHRWYWxVdGlscy5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSk7DQotDQotICAgICAgICAgICAgICAgIGlmIChtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0QWxsKG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYmZkYmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5CYXNpYzsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJpbXBsLiB0aGUgcmVzdCIpDQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IG1ldGFEYXRhLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIENvbHVtbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighKChDb2x1bW4pIGFubm90YXRpb24pLm51bGxhYmxlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCwgKChDb2x1bW4pIGFubm90YXRpb24pLmxlbmd0aCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIEJhc2ljKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCEoKEJhc2ljKSBhbm5vdGF0aW9uKS5vcHRpb25hbCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKGFubm90YXRpb24gaW5zdGFuY2VvZiBJZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9UT0RPIGltcGwuIHRoZSByZXN0ISEhDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9MZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9MZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYzVlZTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTGVuZ3RoTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTGVuZ3RoTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTGVuZ3RoIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKExlbmd0aC5jbGFzcyk7DQotDQotICAgICAgICBpbnQgbWluaW11bSA9IGFubm90YXRpb24ubWluaW11bSgpOw0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEgsIG1pbmltdW0pOw0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgsIGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gPiAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ4NWUyZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Mb25nUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Mb25nUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMb25nUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBMb25nUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTG9uZ1JhbmdlLmNsYXNzKTsNCi0NCi0gICAgICAgIGxvbmcgbWluaW11bSA9IGFubm90YXRpb24ubWluaW11bSgpOw0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTiwgbWluaW11bSk7DQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYLCBhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBpZihtaW5pbXVtID4gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9QYXR0ZXJuTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0YTViNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9QYXR0ZXJuTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFBhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBQYXR0ZXJuIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFBhdHRlcm4uY2xhc3MpOw0KLSAgICAgICAgDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTiwgKGFubm90YXRpb24pLnZhbHVlKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSA9IChhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIExvY2FsZSBjdXJyZW50TG9jYWxlID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCk7DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5ID0NCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2cgPSBFeHRWYWxVdGlscy5nZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgIC5nZXRNZXNzYWdlKHZhbGlkYXRpb25FcnJvck1zZ0tleSwgY3VycmVudExvY2FsZSk7DQotDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTl9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UsIHZhbGlkYXRpb25FcnJvck1zZyk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9SZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGY1YWE3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1ZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1ZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxNzQ4OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgVmFsaWRhdG9yIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFZhbGlkYXRvci5jbGFzcyk7DQotDQotICAgICAgICBDbGFzc1tdIHZhbGlkYXRvcnMgPSBhbm5vdGF0aW9uLnZhbHVlKCk7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBjdXJyZW50Q2xhc3MgOiB2YWxpZGF0b3JzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRDbGFzcy5nZXRTaW1wbGVOYW1lKCkudG9Mb3dlckNhc2UoKS5jb250YWlucyhDb21tb25NZXRhRGF0YUtleXMuRU1BSUwpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsdWUuYWRkKENvbW1vbk1ldGFEYXRhS2V5cy5FTUFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZhbHVlLmFkZChjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00sIHZhbHVlKTsNCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3NTkzMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkRvdWJsZVJhbmdlVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEb3VibGVSYW5nZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIERvdWJsZVJhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKERvdWJsZVJhbmdlLmNsYXNzKTsNCi0gICAgICAgIERvdWJsZVJhbmdlVmFsaWRhdG9yIGRvdWJsZVJhbmdlVmFsaWRhdG9yID0gKERvdWJsZVJhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5Eb3VibGVSYW5nZSIpOw0KLQ0KLSAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSm9pblZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSm9pblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmQ0YTkxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3Rvci5EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSm9pblZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvcigpOw0KLQ0KLSAgICAgICAgU3RyaW5nW10gdGFyZ2V0RXhwcmVzc2lvbnMgPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEpvaW5WYWxpZGF0aW9uLmNsYXNzKS52YWx1ZSgpOw0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHM7DQotICAgICAgICBmb3IgKFN0cmluZyB0YXJnZXRFeHByZXNzaW9uIDogdGFyZ2V0RXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChtZXRhRGF0YUVudHJ5LCB0YXJnZXRFeHByZXNzaW9uKTsNCi0NCi0gICAgICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBleHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHByb3BlcnR5RGV0YWlscykuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyB2YWxpZGF0aW9uIHN0cmF0ZWd5IGZvdW5kIGZvciAiICsgZW50cnkuZ2V0VmFsdWUoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSnBhVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxNGQ4ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkJhc2ljOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZTsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmU7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpwYVZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUZhY2VzQnVuZGxlID0gZmFsc2U7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFURV9MRU5HVEggPSAibGVuZ3RoIjsNCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmlvbGF0aW9uOw0KLSAgICBwcml2YXRlIGludCBtYXhMZW5ndGg7DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKTsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgQ29sdW1uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlQ29sdW1uQW5ub3RhdGlvbigoQ29sdW1uKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIEJhc2ljKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlQmFzaWNBbm5vdGF0aW9uKChCYXNpYykgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBJZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgT25lVG9PbmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVPbmVUb09uZUFubm90YXRpb24oKE9uZVRvT25lKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE1hbnlUb09uZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZU1hbnlUb09uZUFubm90YXRpb24oKE1hbnlUb09uZSkgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVDb2x1bW5Bbm5vdGF0aW9uKENvbHVtbiBjb2x1bW4sIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKCFjb2x1bW4ubnVsbGFibGUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCBpbnN0YW5jZW9mIFN0cmluZw0KLSAgICAgICAgICAgICAgICAmJiBjb2x1bW4ubGVuZ3RoKCkgPCAoKFN0cmluZykgY29udmVydGVkT2JqZWN0KS5sZW5ndGgoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbiA9IFZBTElEQVRFX0xFTkdUSDsNCi0gICAgICAgICAgICB0aGlzLm1heExlbmd0aCA9IGNvbHVtbi5sZW5ndGgoKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWFzc2FnZShudWxsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQmFzaWNBbm5vdGF0aW9uKEJhc2ljIGJhc2ljLCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICghYmFzaWMub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlT25lVG9PbmVBbm5vdGF0aW9uKE9uZVRvT25lIG9uZVRvT25lLCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIW9uZVRvT25lLm9wdGlvbmFsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU1hbnlUb09uZUFubm90YXRpb24oTWFueVRvT25lIG1hbnlUb09uZSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFtYW55VG9PbmUub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCB8fCBjb252ZXJ0ZWRPYmplY3QuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbiA9IENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRDsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWFzc2FnZShudWxsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoVkFMSURBVEVfTEVOR1RILmVxdWFscyh0aGlzLnZpb2xhdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJmaWVsZF90b29fbG9uZyI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJmaWVsZF9yZXF1aXJlZCI7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHN1cGVyLmdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgIGlmIChWQUxJREFURV9MRU5HVEguZXF1YWxzKHRoaXMudmlvbGF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLCAiIiArIHRoaXMubWF4TGVuZ3RoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc3VwZXIucmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0gICAgICAgIFN0cmluZyBtYXJrZXIgPSBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5NSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0NCi0gICAgICAgIGlmKChtYXJrZXIgKyBrZXkgKyBtYXJrZXIpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudXNlRmFjZXNCdW5kbGUgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IGUuZ2V0RmFjZXNNZXNzYWdlKCk7DQotDQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKFZBTElEQVRFX0xFTkdUSC5lcXVhbHModGhpcy52aW9sYXRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0TWF4aW11bU1lc3NhZ2UoZmFjZXNNZXNzYWdlLCB0aGlzLm1heExlbmd0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTGVuZ3RoU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkMDU1OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMZW5ndGhTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBMZW5ndGggYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTGVuZ3RoLmNsYXNzKTsNCi0gICAgICAgIExlbmd0aFZhbGlkYXRvciBsZW5ndGhWYWxpZGF0b3IgPSAoTGVuZ3RoVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5MZW5ndGgiKTsNCi0NCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzU4MjAyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Mb25nUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5Mb25nUmFuZ2VWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExvbmdSYW5nZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIExvbmdSYW5nZSBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMb25nUmFuZ2UuY2xhc3MpOw0KLSAgICAgICAgTG9uZ1JhbmdlVmFsaWRhdG9yIGxvbmdSYW5nZVZhbGlkYXRvciA9IChMb25nUmFuZ2VWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigiamF2YXguZmFjZXMuTG9uZ1JhbmdlIik7DQotDQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bShhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9QYXR0ZXJuU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDU2ZTA3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUGF0dGVyblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotDQotICAgICAgICBQYXR0ZXJuIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFBhdHRlcm4uY2xhc3MpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZXhwcmVzc2lvbiA6IGFubm90YXRpb24udmFsdWUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0ID09IG51bGwNCi0gICAgICAgICAgICAgICAgICAgIHx8ICFqYXZhLnV0aWwucmVnZXguUGF0dGVybi5jb21waWxlKGV4cHJlc3Npb24pLm1hdGNoZXIoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdC50b1N0cmluZygpKS5tYXRjaGVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG5ldyBGYWNlc01lc3NhZ2UoDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiksDQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24pLnJlcGxhY2UoInswfSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uKSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKFBhdHRlcm4pIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4Zjk5Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZXF1aXJlZFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZFN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRmFjZXNCdW5kbGUgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCA9PSBudWxsIHx8IGNvbnZlcnRlZE9iamVjdC5lcXVhbHMoIiIpIHx8DQotICAgICAgICAgICAgICAgIChjb252ZXJ0ZWRPYmplY3QgaW5zdGFuY2VvZiBDb2xsZWN0aW9uICYmICgoQ29sbGVjdGlvbiljb252ZXJ0ZWRPYmplY3QpLmlzRW1wdHkoKSkgfHwNCi0gICAgICAgICAgICAgICAgKGNvbnZlcnRlZE9iamVjdCBpbnN0YW5jZW9mIE1hcCAmJiAoKE1hcCljb252ZXJ0ZWRPYmplY3QpLmlzRW1wdHkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihnZXRWYWxpZGF0aW9uRXJyb3JGYWNlc01hc3NhZ2UobWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoUmVxdWlyZWQpIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShlLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlODYxMDMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvU2tpcFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBTa2lwVmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFN0cmluZ1tdIHZhbHVlQmluZGluZ0V4cHJlc3Npb25zID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShTa2lwVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIGZvcihTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA6IHZhbHVlQmluZGluZ0V4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRWYWx1ZU9mRXhwcmVzc2lvbigNCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKSkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5zZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5TS0lQX1ZBTElEQVRJT04sIHRydWUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiM2NjOTEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLQ0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I+W10gdmFsaWRhdG9yQ2xhc3NlcyA9DQotICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShWYWxpZGF0b3IuY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yIHZhbGlkYXRvcjsNCi0gICAgICAgIGZvciAoQ2xhc3MgdmFsaWRhdG9yQ2xhc3NOYW1lIDogdmFsaWRhdG9yQ2xhc3NlcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0b3IgPSAoamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcikgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzcyh2YWxpZGF0b3JDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UodmFsaWRhdG9yQ2xhc3NOYW1lLmdldE5hbWUoKSArICIgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTY2YTQxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWNlc0V4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBUaGlzIHBoYXNlIGxpc3RlbmVyIHByb2Nlc3NlcyBjcm9zcyB2YWxpZGF0aW9uIGFzIHNvb24gYXMgaXQgZmluZHMgYSBzcGVjaWFsIHJlcXVlc3Qgc2NvcGVkIHN0b3JhZ2UuPGJyLz4NCi0gKiBTbyBpdCdzIHBvc3NpYmxlIHRvIGFkZCBpbmZvcm1hdGlvbiBkdXJpbmcgdGhlIHByb2Nlc3MgdmFsaWRhdGlvbiBwaGFzZS4gQXQgdGhlIGVuZCBvZiB0aGlzIHBoYXNlIGl0IGdldHMgcHJvY2Vzc2VkLg0KLSAqIEFmdGVyIHRoYXQgdGhlIHN0b3JhZ2UgZ2V0cyByZXNldGVkLjxwLz4NCi0gKiBJZiB5b3UgcHJvdmlkZSBhIGN1c3RvbSBleHRlbnNpb24gYW5kIHlvdSBhZGQgdGhlIHNhbWUgc3RvcmFnZSB0eXBlIHdpdGhpbiBhIGRpZmZlcmVudCBwaGFzZSwNCi0gKiBpdCBhbHNvIGdldHMgcHJvY2Vzc2VkIGF0IHRoZSBlbmQgb2YgdGhhdCBwaGFzZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSA9IENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKTsNCi0gICAgICAgICAgICBmb3IgKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA6IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UuZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKSBpbnN0YW5jZW9mIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbml0Q3Jvc3NWYWxpZGF0aW9uIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLnByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oZW50cnksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFkZE1lc3NhZ2UgPSB0cnVlOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkgaW5zdGFuY2VvZiBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWVzc2FnZSA9IChCb29sZWFuKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5nZXRDbGFzcygpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5jbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRDbGFzcygpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYoYWRkTWVzc2FnZSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWNlc01lc3NhZ2UgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsICYmIGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RmFjZXNDb250ZXh0KCkuYWRkTWVzc2FnZShlbnRyeS5nZXRDbGllbnRJZCgpLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRGYWNlc0NvbnRleHQoKS5yZW5kZXJSZXNwb25zZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluYWxseQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLnJlc2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNJbml0aWFsaXplZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OICE9IG51bGwNCi0gICAgICAgICAgICAgICAgICAgICYmIFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NST1NTVkFMSURBVElPTi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBKc2ZVdGlscy5kZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcih0aGlzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5BTllfUEhBU0U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYjNkZjAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMgPSANCi0gICAgICAgIG5ldyBBcnJheUxpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGQoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzLmFkZChlbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcyhMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNGMwNDAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkNCi17DQotICAgIHByaXZhdGUgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5Ow0KLSAgICAvL2ZvciBjb21wbGV4IGNvbXBvbmVudHMgKGUuZy4gYSB0YWJsZSkgc3RvcmVzIHRoZSBvYmplY3Qgb2YgZW50cnkgKCN7ZW50cnkucHJvcGVydHl9KQ0KLSAgICBwcml2YXRlIFVJQ29tcG9uZW50IGNvbXBvbmVudDsNCi0gICAgcHJpdmF0ZSBPYmplY3QgY29udmVydGVkT2JqZWN0Ow0KLSAgICBwcml2YXRlIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgLy9qdXN0IGZvciBpbnB1dCBjb21wb25lbnRzIHdpdGhpbiBjb21wbGV4IGNvbXBvbmVudHMgZS5nLiBkYXRhVGFibGUsLi4uDQotICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudElkOw0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeSBnZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhRW50cnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFFbnRyeSA9IG1ldGFEYXRhRW50cnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFVJQ29tcG9uZW50IGdldENvbXBvbmVudCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KFVJQ29tcG9uZW50IGNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRPYmplY3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlZE9iamVjdChPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbnZlcnRlZE9iamVjdCA9IGNvbnZlcnRlZE9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uU3RyYXRlZ3koQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneSA9IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudElkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNsaWVudElkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudElkKFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTMxM2Q4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBJbiBvcmRlciB0byBidWlsZCB1cCBhIG1hcHBpbmcgd2hpY2ggaXMgdXNlZCBmb3IgY3Jvc3MtdmFsaWRhdGlvbi4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkKLXsKLSAgICBwcml2YXRlIE9iamVjdCBiZWFuOwotICAgIHByaXZhdGUgT2JqZWN0IGNvbnZlcnRlZFZhbHVlOwotICAgIHByaXZhdGUgVUlDb21wb25lbnQgY29tcG9uZW50OwotICAgIC8vZm9yIGNvbXBsZXggY29tcG9uZW50cyAoZS5nLiBhIHRhYmxlIHRoZXJlIGFyZSBtdWx0aXBsZSBlbnRyaWVzIHdpdGgKLSAgICAvL3RoZSBzYW1lIGtleSAoaGVyZSB0aGUgZWwgZXhwcmVzc2lvbiAje2VudHJ5LnByb3BlcnR5fSkKLSAgICAvL2hvd2V2ZXIsIGRvbid0IG92ZXJyaWRlIHRoZSBwcmV2aW91cyBlbnRyeSAtIHRoZXkgYXJuJ3QgdGhlIHNhbWU7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGZ1cnRoZXJFbnRyaWVzOwotICAgIC8vanVzdCBmb3IgaW5wdXQgY29tcG9uZW50cyB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzIGUuZy4gZGF0YVRhYmxlLC4uLgotICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudElkOwotCi0gICAgLyoKLSAgICAgKiBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmVhbihPYmplY3QgYmVhbikKLSAgICB7Ci0gICAgICAgIHRoaXMuYmVhbiA9IGJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkVmFsdWUoT2JqZWN0IGNvbnZlcnRlZFZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy5jb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBVSUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnQoVUlDb21wb25lbnQgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gY2xpZW50SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50SWQoU3RyaW5nIGNsaWVudElkKQotICAgIHsKLSAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGdldEZ1cnRoZXJFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmdXJ0aGVyRW50cmllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGdXJ0aGVyRW50cmllcyhMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGZ1cnRoZXJFbnRyaWVzKQotICAgIHsKLSAgICAgICAgdGhpcy5mdXJ0aGVyRW50cmllcyA9IGZ1cnRoZXJFbnRyaWVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM0MDI3OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcm4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04iKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg3NjQwYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJEYXRlSXNFbnRyeSAodmFsdWVPZiwgdHlwZSkiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIERhdGVJcw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWVPZigpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBvcHRpb25hbCBzZWN0aW9uDQotICAgICAqLw0KLQ0KLSAgICBEYXRlSXNUeXBlIHR5cGUoKSBkZWZhdWx0IERhdGVJc1R5cGUuc2FtZTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgIiI7DQotDQotICAgIFN0cmluZyBub3RCZWZvcmVFcnJvck1zZ0tleSgpIGRlZmF1bHQgIndyb25nX2RhdGVfbm90X2JlZm9yZSI7DQotDQotICAgIFN0cmluZyBub3RBZnRlckVycm9yTXNnS2V5KCkgZGVmYXVsdCAid3JvbmdfZGF0ZV9ub3RfYWZ0ZXIiOw0KLQ0KLSAgICBTdHJpbmcgbm90RXF1YWxFcnJvck1zZ0tleSgpIGRlZmF1bHQgIndyb25nX2RhdGVfbm90X2VxdWFsIjsNCi0NCi0gICAgaW50IGVycm9yTWVzc2FnZURhdGVTdHlsZSgpIGRlZmF1bHQgRGF0ZUZvcm1hdC5NRURJVU07DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJc1R5cGUuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJc1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1ZjQ4Mi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJiZWZvcmVPclNhbWUsIGFmdGVyT3JTYW1lIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgZW51bSBEYXRlSXNUeXBlDQotew0KLSAgICBiZWZvcmUsIGFmdGVyLCBzYW1lDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0VxdWFscy5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NDc4OTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIEVxdWFscw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZCI7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL05vdEVxdWFscy5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ODE3NjIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIE5vdEVxdWFscw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQiOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYjZkYjEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBSZXF1aXJlZElmDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZU9mKCk7DQotDQotICAgIC8qDQotICAgICAqIG9wdGlvbmFsIHNlY3Rpb24NCi0gICAgICovDQotDQotICAgIFJlcXVpcmVkSWZUeXBlIGlzKCkgZGVmYXVsdCBSZXF1aXJlZElmVHlwZS5ub3RfZW1wdHk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJlbXB0eV9maWVsZCI7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWZUeXBlLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWM1OGQ5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWZUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBlbnVtIFJlcXVpcmVkSWZUeXBlDQotew0KLSAgICBlbXB0eSwgbm90X2VtcHR5DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjYwNzU5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUlucHV0IGlzIGRpZmZlcmVudA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9SW5wdXQgaXMgZGlmZmVyZW50DQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi0NCi13cm9uZ19kYXRlPVdyb25nIGRhdGUNCi13cm9uZ19kYXRlX2RldGFpbD1Xcm9uZyBkYXRlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZmOTNjNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1cdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgXHUwNjQ1XHUwNjJlXHUwNjJhXHUwNjQ0XHUwNjQxDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgXHUwNjQ1XHUwNjJlXHUwNjJhXHUwNjQ0XHUwNjQxDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1cdTA2M2FcdTA2NGFcdTA2MzEgXHUwNjQ1XHUwNjMzXHUwNjQ1XHUwNjQ4XHUwNjJkIFx1MDYyOFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDYgXHUwNjQxXHUwNjMzIFx1MDY0Mlx1MDY0YVx1MDY0NVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1cdTA2M2FcdTA2NGFcdTA2MzEgXHUwNjQ1XHUwNjMzXHUwNjQ1XHUwNjQ4XHUwNjJkIFx1MDYyOFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCAgXHUwNjQ2XHUwNjQxXHUwNjMzIFx1MDY0Mlx1MDY0YVx1MDY0NVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQNCi0NCi13cm9uZ19kYXRlPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2NDlcdTA2MjENCi13cm9uZ19kYXRlX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjJlXHUwNjI3XHUwNjM3XHUwNjQ5XHUwNjIxDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0M1x1MDY0OCBcdTA2NDYgXHUwNjI4XHUwNjM5XHUwNjJmIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzIFx1MDY0OFx1MDY0NiBcdTA2MjhcdTA2MzlcdTA2MmYgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzXHUwNjQ4IFx1MDY0NiBcdTA2NDJcdTA2MjhcdTA2NDQgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0MyBcdTA2NDhcdTA2NDYgXHUwNjQyXHUwNjI4XHUwNjQ0IHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NDRcdTA2MjcgXHUwNjRhXHUwNjMzXHUwNjI3XHUwNjQ4XHUwNjQ5IHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjQ0XHUwNjI3IFx1MDY0YVx1MDYzM1x1MDYyN1x1MDY0OFx1MDY0OSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1NGVkMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9ZWwgdmFsb3IgXHUwMGU5IGRpZmVyZW50Ci1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPWVsIHZhbG9yIFx1MDBlOSBkaWZlcmVudAotCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPW5vIGVzIHBlcm1ldCBlbCBtYXRlaXggdmFsb3IKLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPW5vIGVzIHBlcm1ldCBlbCBtYXRlaXggdmFsb3IKLQotd3JvbmdfZGF0ZT1kYXRhIGVyclx1MDBmMm5pYQotd3JvbmdfZGF0ZV9kZXRhaWw9ZGF0YSBlcnJcdTAwZjJuaWEKLQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1sYSBkYXRhIGhhIGRlIHNlciBwb3N0ZXJpb3IgYSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9bGEgZGF0YSBoYSBkZSBzZXIgYW50ZXJpb3IgYSB7MH0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1sYSBkYXRhIGhhIGRlIHNlciBwb3N0ZXJpb3IgYSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9bGEgZGF0YSBubyBcdTAwMGU5cyBpZ3VhbCBhIHswfQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPWxhIGRhdGEgbm8gXHUwMDBlOXMgaWd1YWwgYSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4NzIzNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1FaW5nYWJlIGlzdCB1bnRlcnNjaGllZGxpY2gNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUVpbmdhYmUgaXN0IHVudGVyc2NoaWVkbGljaA0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9RGVyIGdsZWljaGUgV2VydCBpc3QgbmljaHQgZXJsYXVidA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPURlciBnbGVpY2hlIFdlcnQgaXN0IG5pY2h0IGVybGF1YnQNCi0NCi13cm9uZ19kYXRlPURhdHVtIGlua29ycmVrdA0KLXdyb25nX2RhdGVfZGV0YWlsPURhdHVtIGlua29ycmVrdA0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1EYXMgRGF0dW0gbXVzcyBuYWNoIGRlbSB7MH0gc2Vpbg0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9RGFzIERhdHVtIG11c3MgbmFjaCBkZW0gezB9IHNlaW4NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1EYXMgRGF0dW0gbXVzcyB2b3IgZGVtIHswfSBzZWluDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPURhcyBEYXR1bSBtdXNzIHZvciBkZW0gezB9IHNlaW4NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1EYXMgRGF0dW0gZW50c3ByaWNodCBuaWNodCBkZW0gezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPURhcyBEYXR1bSBlbnRzcHJpY2h0IG5pY2h0IGRlbSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2MDc1OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1JbnB1dCBpcyBkaWZmZXJlbnQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUlucHV0IGlzIGRpZmZlcmVudA0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotDQotd3JvbmdfZGF0ZT1Xcm9uZyBkYXRlDQotd3JvbmdfZGF0ZV9kZXRhaWw9V3JvbmcgZGF0ZQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMzg1MjQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPWxhIGVudHJhZGEgZXMgZGlmZXJlbnRlCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPWxhIGVudHJhZGEgZXMgZGlmZXJlbnRlCi0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9bm8gc2UgcGVybWl0ZW4gZW50cmFkYXMgaWd1YWxlcwotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9bm8gc2UgcGVybWl0ZW4gZW50cmFkYXMgaWd1YWxlcwotCi13cm9uZ19kYXRlPWZlY2hhIGVxdWl2b2NhZGEKLXdyb25nX2RhdGVfZGV0YWlsPWZlY2hhIGVxdWl2b2NhZGEKLQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgbHVlZ28gZGUgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgbHVlZ28gZGUgezB9Ci0KLXdyb25nX2RhdGVfbm90X2FmdGVyPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgYW50ZXMgZGUgezB9Ci13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBhbnRlcyBkZSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9bGEgZmVjaGEgbm8gZXMgaWd1YWwgYSB7MH0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1sYSBmZWNoYSBubyBlcyBpZ3VhbCBhIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWYwMjE4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUxlcyBjaGFtcHMgc29udCBkaWZmJmVhY3V0ZTtyZW50cw0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9TGVzIGNoYW1wcyBzb250IGRpZmYmZWFjdXRlO3JlbnRzDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1MZXMgY2hhbXBzIGRvaXZlbnQgJmVjaXJjO3RyZSBkaWZmJmVhY3V0ZTtyZW50cw0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPUxlcyBjaGFtcHMgZG9pdmVudCAmZWNpcmM7dHJlIGRpZmYmZWFjdXRlO3JlbnRzDQotDQotd3JvbmdfZGF0ZT1MYSBkYXRlIGVzdCBpbmNvcnJlY3RlDQotd3JvbmdfZGF0ZV9kZXRhaWw9TGEgZGF0ZSBlc3QgaW5jb3JyZWN0ZQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhcHImZWdyYXZlO3MgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhcHImZWdyYXZlO3MgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXZhbnQgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGF2YW50IHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPUxhIGRhdGUgbidlc3QgcGFzICZlYWN1dGU7Z2FsZSAmYWdyYXZlOyB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9TGEgZGF0ZSBuJ2VzdCBwYXMgJmVhY3V0ZTtnYWxlICZhZ3JhdmU7IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDQyODAxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1WYWxvcmkgbm9uIHVndWFsaQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1JIHZhbG9yaSBpbnNlcml0aSBub24gY29pbmNpZG9ubwotCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPUxvIHN0ZXNzbyB2YWxvcmUgbm9uICZlZ3JhdmU7IHBlcm1lc3NvCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1MbyBzdGVzc28gdmFsb3JlIG5vbiAmZWdyYXZlOyBwZXJtZXNzbwotCi13cm9uZ19kYXRlPURhdGEgZXJyYXRhCi13cm9uZ19kYXRlX2RldGFpbD1EYXRhIGVycmF0YQotCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9TGEgZGF0YSBkZXZlIGVzc2VyZSBkb3BvIGRpIHswfQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1MYSBkYXRhIGRldmUgZXNzZXJlIGRvcG8gZGkgezB9Ci0KLXdyb25nX2RhdGVfbm90X2FmdGVyPUxhIGRhdGEgZGV2ZSBlc3NlcmUgcHJpbWEgZGkgezB9Ci13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9TGEgZGF0YSBkZXZlIGVzc2VyZSBwcmltYSBkaSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9TGEgZGF0YSBub24gJmVncmF2ZTsgdWd1YWxlIGEgezB9Ci13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9TGEgZGF0YSBub24gJmVncmF2ZTsgdWd1YWxlIGEgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZjZhOWQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9Z2lyaWxlbiBkZVx1MDExZmVyIGZhcmtsXHUwMTMxDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1naXJpbGVuIGRlXHUwMTFmZXIgZmFya2xcdTAxMzENCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPWF5blx1MDEzMSBkZVx1MDExZmVyIGdpcmlsZW1leg0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPWF5blx1MDEzMSBkZVx1MDExZmVyIGdpcmlsZW1leg0KLQ0KLXdyb25nX2RhdGU9eWFubFx1MDEzMVx1MDE1ZiB0YXJpaA0KLXdyb25nX2RhdGVfZGV0YWlsPXlhbmxcdTAxMzFcdTAxNWYgdGFyaWgNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBzb25yYSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIHNvbnJhIG9sbWFsXHUwMTMxZFx1MDEzMXINCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIFx1MDBmNm5jZSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gXHUwMGY2bmNlIG9sbWFsXHUwMTMxZFx1MDEzMXINCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZSBlXHUwMTVmaXQgZGVcdTAxMWZpbA0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZSBlXHUwMTVmaXQgZGVcdTAxMWZpbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q3NjU5ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgICAgIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZU5hbWUgPSBudWxsOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VOYW1lID0gc3VwZXIuZ2V0QmFzZU5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBiYXNlTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcmVjb3JkZXIvQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWNvcmRlci9Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzQwYTAzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWNvcmRlci9Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnJlY29yZGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlci5Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyIGltcGxlbWVudHMgUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcg0KLXsNCi0gICAgcHVibGljIHZvaWQgcmVjb3JkVXNlcklucHV0KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgdmFsdWUpDQotICAgIHsNCi0gICAgICAgIGlmICghKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy90byBzdXBwb3J0IGxvY2FsIGNyb3NzLXZhbGlkYXRpb24gKHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkpDQotICAgICAgICBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZyA9IENyb3NzVmFsaWRhdGlvblV0aWxzDQotICAgICAgICAgICAgLmdldE9ySW5pdEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IGVudHJ5Ow0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBpZihwcm9wZXJ0eURldGFpbHMgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGVudHJ5ID0gbmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkoKTsNCi0gICAgICAgIGVudHJ5LnNldEJlYW4ocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSk7DQotICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh2YWx1ZSk7DQotICAgICAgICBlbnRyeS5zZXRDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgZW50cnkuc2V0Q2xpZW50SWQodWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKSk7DQotDQotICAgICAgICBTdHJpbmcga2V5ID0gcHJvcGVydHlEZXRhaWxzLmdldEtleSgpOw0KLQ0KLSAgICAgICAgLy9mb3IgbG9jYWwgY3Jvc3MtdmFsaWRhdGlvbg0KLSAgICAgICAgaWYgKGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLmNvbnRhaW5zS2V5KGtleSkgJiYNCi0gICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQoa2V5KS5nZXRCZWFuKCkgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICFrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQoa2V5KS5nZXRCZWFuKCkuZXF1YWxzKGVudHJ5LmdldEJlYW4oKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9mb3IgdGhlIHZhbGlkYXRpb24gd2l0aGluIGEgY29tcGxleCBjb21wb25lbnQgZS5nLiBhIHRhYmxlDQotICAgICAgICAgICAgLy9kb24ndCBvdmVycmlkZSBleGlzdGluZyBleHByZXNzaW9uIChzdHlsZTogI3tlbnRyeS5wcm9wZXJ0eX0pIC0gbWFrZSBhIHNwZWNpYWwgbWFwcGluZw0KLQ0KLSAgICAgICAgICAgIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4gZnVydGhlckVudHJpZXMgPQ0KLSAgICAgICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQoa2V5KS5nZXRGdXJ0aGVyRW50cmllcygpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmdXJ0aGVyRW50cmllcyA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZnVydGhlckVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+KCk7DQotDQotICAgICAgICAgICAgICAgIGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLmdldChrZXkpLnNldEZ1cnRoZXJFbnRyaWVzKGZ1cnRoZXJFbnRyaWVzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgZnVydGhlckVudHJpZXMuYWRkKGVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2ZvciBub3JtYWwgdmFsaWRhdGlvbg0KLSAgICAgICAgICAgIGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLnB1dChrZXksIGVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWVhNTA4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBzdGF0aWMgTGlzdDxSZWZlcmVuY2luZ1N0cmF0ZWd5PiByZWZlcmVuY2luZ1N0cmF0ZWdpZXM7DQotICAgIHByb3RlY3RlZCBNYXA8T2JqZWN0LCBPYmplY3Q+IHZpb2xhdGlvblJlc3VsdFN0b3JhZ2UgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgaW5pdFJlZmVyZW5jaW5nU3RyYXRlZ2llcygpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRSZWZlcmVuY2luZ1N0cmF0ZWdpZXMoKQ0KLSAgICB7DQotICAgICAgICBpZiAocmVmZXJlbmNpbmdTdHJhdGVnaWVzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzID0gbmV3IEFycmF5TGlzdDxSZWZlcmVuY2luZ1N0cmF0ZWd5PigpOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyBjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5Q2xhc3NOYW1lID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5CQVNFX1BBQ0tBR0UpICsgIlJlZmVyZW5jaW5nU3RyYXRlZ3kiOw0KLQ0KLSAgICAgICAgICAgIFJlZmVyZW5jaW5nU3RyYXRlZ3kgY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneSA9IChSZWZlcmVuY2luZ1N0cmF0ZWd5KSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5KTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgRUxDb21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICAgICAgLy9yZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBBbGlhc0NvbXBhcmVTdHJhdGVneSgpKTsNCi0gICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBMb2NhbENvbXBhcmVTdHJhdGVneSgpKTsNCi0gICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBMb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpbml0VmFsaWRhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgU3RyaW5nW10gdmFsaWRhdGlvblRhcmdldHMgPSBnZXRWYWxpZGF0aW9uVGFyZ2V0cygNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQgOiB2YWxpZGF0aW9uVGFyZ2V0cykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0ID0gdmFsaWRhdGlvblRhcmdldC50cmltKCk7DQotDQotICAgICAgICAgICAgLy9zZWxlY3QgdmFsaWRhdGlvbiBtZXRob2QNCi0gICAgICAgICAgICB0cnlUb1ZhbGlkYXRlKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwgdmFsaWRhdGlvblRhcmdldCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIHRyeVRvVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQpDQotICAgIHsNCi0gICAgICAgIGZvciAoUmVmZXJlbmNpbmdTdHJhdGVneSByZWZlcmVuY2luZ1N0cmF0ZWd5IDogcmVmZXJlbmNpbmdTdHJhdGVnaWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChyZWZlcmVuY2luZ1N0cmF0ZWd5LmV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsIHZhbGlkYXRpb25UYXJnZXQsIHRoaXMpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlRhcmdldCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFoYW5kbGVUYXJnZXRWaW9sYXRpb24oZW50cnlPZlNvdXJjZSwgZW50cnlPZlRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIC8vZ2V0IHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSB0YXJnZXQgY29tcG9uZW50DQotICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldEVycm9yTWVzc2FnZVN1bW1hcnkoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIHRydWUpOw0KLSAgICAgICAgU3RyaW5nIGRldGFpbHMgPSBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIHRydWUpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0aW9uIHRhcmdldCBpc24ndCBib3VuZCB0byBhIGNvbXBvbmVudCB3aXRoaW5nIHRoZSBjdXJyZW50IHBhZ2UgDQotICAgICAgICAvLyhzZWUgdmFsaWRhdGVGb3VuZEVudHJ5LCB0cnlUb1ZhbGlkYXRlTG9jYWxseSBhbmQgdHJ5VG9WYWxpZGF0ZUJpbmRpbmdPbmx5KQ0KLSAgICAgICAgaWYgKGVudHJ5T2ZUYXJnZXQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBlbnRyeU9mVGFyZ2V0ID0gZW50cnlPZlNvdXJjZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlOw0KLSAgICAgICAgaWYgKGVudHJ5T2ZUYXJnZXQuZ2V0TWV0YURhdGFFbnRyeSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWVzc2FnZSA9IGdldFRhcmdldENvbXBvbmVudEVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgZW50cnlPZlRhcmdldC5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIHN1bW1hcnksIGRldGFpbHMpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vVE9ETyBkb2N1bWVudCBwb3NzaWJsZSBzaWRlIGVmZmVjdHMNCi0gICAgICAgICAgICAvL2R1ZSB0byBhIG1pc3NpbmcgdGFyZ2V0IGFubm90YXRpb24gKHNlZTogdHJ5VG9WYWxpZGF0ZUxvY2FsbHkpDQotICAgICAgICAgICAgbWVzc2FnZSA9IGdldFRhcmdldENvbXBvbmVudEVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIHN1bW1hcnksIGRldGFpbHMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKChtZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsIHx8IG1lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkgJiYNCi0gICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldENsaWVudElkKCkgIT0gbnVsbCAmJiAhZW50cnlPZlNvdXJjZS5nZXRDbGllbnRJZCgpLmVxdWFscyhlbnRyeU9mVGFyZ2V0LmdldENsaWVudElkKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dC5hZGRNZXNzYWdlKGVudHJ5T2ZUYXJnZXQuZ2V0Q2xpZW50SWQoKSwgbWVzc2FnZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHJvY2Vzc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZiAoIWhhbmRsZVNvdXJjZVZpb2xhdGlvbihlbnRyeU9mU291cmNlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICAvL2dldCB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQNCi0gICAgICAgIFN0cmluZyBzdW1tYXJ5ID0gZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgZmFsc2UpOw0KLSAgICAgICAgU3RyaW5nIGRldGFpbHMgPSBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIGZhbHNlKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlID0gZ2V0U291cmNlQ29tcG9uZW50RXJyb3JNZXNzYWdlKA0KLSAgICAgICAgICAgIGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCBzdW1tYXJ5LCBkZXRhaWxzKTsNCi0NCi0gICAgICAgIGlmIChtZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsIHx8IG1lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8NCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24obmV3IEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgRmFjZXNNZXNzYWdlIGdldFNvdXJjZUNvbXBvbmVudEVycm9yTWVzc2FnZShBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZSA9IG5ldyBGYWNlc01lc3NhZ2UoKTsNCi0NCi0gICAgICAgIG1lc3NhZ2Uuc2V0U2V2ZXJpdHkoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgICAgIG1lc3NhZ2Uuc2V0U3VtbWFyeShzdW1tYXJ5KTsNCi0gICAgICAgIG1lc3NhZ2Uuc2V0RGV0YWlsKGRldGFpbCk7DQotDQotICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgRmFjZXNNZXNzYWdlIGdldFRhcmdldENvbXBvbmVudEVycm9yTWVzc2FnZShBbm5vdGF0aW9uIGZvdW5kQW5ub3RhdGlvbiwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlID0gbmV3IEZhY2VzTWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgbWVzc2FnZS5zZXRTZXZlcml0eShGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICAgICAgbWVzc2FnZS5zZXRTdW1tYXJ5KHN1bW1hcnkpOw0KLSAgICAgICAgbWVzc2FnZS5zZXREZXRhaWwoZGV0YWlsKTsNCi0NCi0gICAgICAgIHJldHVybiBtZXNzYWdlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByZXNvbHZlTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgICAgIHJldHVybiAoa2V5ICE9IG51bGwpID8gcmVzb2x2ZU1lc3NhZ2Uoa2V5ICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgpIDogbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB0aGUgdXNhZ2Ugb2YgdGhpcyBtZXRob2QgcmVxdWlyZXMgYSBuZXcgaW5zdGFuY2UNCi0gICAgICogLT4gaW4gY2FzZSBvZiB2YWxpZGF0aW9uIHN0cmF0ZWd5IGJlYW5zIGFwcGxpY2F0aW9uL3NpbmdsZXRvbiBpc24ndCBhbGxvd2VkDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0VmFsaWRhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlVGFyZ2V0VmlvbGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlLA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVTb3VyY2VWaW9sYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBoYW5kbGVUYXJnZXRWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBhYnN0cmFjdCBtZXRob2RzDQotICAgICAqLw0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBpbXBsZW1lbnRzIHRoZSBzcGVjaWZpYyB2YWxpZGF0aW9uIGxvZ2ljDQotICAgICAqLw0KLQ0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbik7DQotDQotICAgIC8qDQotICAgICAqIHJldHVybnMgdGhlIHJlZmVyZW5jZWQgdmFsaWRhdGlvbiB0YXJnZXRzIG9mIHRoZSBhbm5vdGF0aW9uDQotICAgICAqIGUuZy4gQERhdGVJcyh0eXBlID0gRGF0ZUlzVHlwZS5iZWZvcmUsIHZhbHVlID0gImZpbmFsRXhhbSIpDQotICAgICAqIC0+IG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IHdpdGggb25lIHZhbHVlICgiZmluYWxFeGFtIikNCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjODFiYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgLy9pbml0IGNyb3NzLXZhbGlkYXRpb24NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA9DQotICAgICAgICAgICAgZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkuYWRkKGVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA9IG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoKTsNCi0NCi0gICAgICAgIGVudHJ5LnNldE1ldGFEYXRhRW50cnkobWV0YURhdGFFbnRyeSk7DQotICAgICAgICBlbnRyeS5zZXRDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgZW50cnkuc2V0Q2xpZW50SWQodWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIGVudHJ5LnNldFZhbGlkYXRpb25TdHJhdGVneSh0aGlzKTsNCi0NCi0gICAgICAgIHJldHVybiBlbnRyeTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgYXZhaWxhYmxlIGZvciBjcm9zcyB2YWxpZGF0aW9uIC0gdXNlIHByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IGF2YWlsYWJsZSBmb3IgY3Jvc3MgdmFsaWRhdGlvbiIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0VmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICAvL25vdCBhdmFpbGFibGUgZm9yIGNyb3NzIHZhbGlkYXRpb24gLSB1c2UgaW5pdENyb3NzVmFsaWRhdGlvbg0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDcm9zc1ZhbGlkYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICAvL292ZXJyaWRlIGlmIG5lZWRlZA0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLCB2YWxpZGF0b3JFeGNlcHRpb24sIHRoaXMpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25IZWxwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkZjkzNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5KQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHZpb2xhdGlvbkZvdW5kID0gZmFsc2U7DQotDQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LmlzVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKSkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5ID0gbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgpOw0KLSAgICAgICAgICAgIGlmIChjb21wYXJlU3RyYXRlZ3kudXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb21wb25lbnQodmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENsaWVudElkKHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDbGllbnRJZCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbXBvbmVudChjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q2xpZW50SWQoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENsaWVudElkKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29udmVydGVkT2JqZWN0KHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpKTsNCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0VmFsaWRhdGlvblN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSk7DQotDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5DQotICAgICAgICAgICAgICAgICAgICAucHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0NCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICB7DQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjN2Q4NzIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgdm9pZCBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlKQ0KLSAgICAgICAgICAgIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb247DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0RhdGVJc1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMGM2MDcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0RhdGVJc1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJc1R5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsNCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERhdGVJc1N0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT19FQVJMWSA9ICJlYXJseSI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT19MQVRFID0gImxhdGUiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRVFVQUxfREFURV9USU1FID0gIm5vdCBlcXVhbCI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVkgPSAicmVzdWx0IjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFSRURfVkFMVUVfS0VZID0gInRhcmdldCB2YWx1ZSI7DQotDQotICAgIHB1YmxpYyBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHZpb2xhdGlvbkZvdW5kOw0KLQ0KLSAgICAgICAgaWYgKCgoRGF0ZUlzKSBhbm5vdGF0aW9uKS50eXBlKCkuZXF1YWxzKERhdGVJc1R5cGUuc2FtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSBvYmplY3QxICE9IG51bGwgJiYgIW9iamVjdDEuZXF1YWxzKG9iamVjdDIpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVTVUxUX0tFWSwgTk9UX0VRVUFMX0RBVEVfVElNRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoKChEYXRlSXMpIGFubm90YXRpb24pLnR5cGUoKS5lcXVhbHMoRGF0ZUlzVHlwZS5iZWZvcmUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsICYmIG9iamVjdDIgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW5ldyBEYXRlKCgoRGF0ZSkgb2JqZWN0MSkuZ2V0VGltZSgpKS5iZWZvcmUoKERhdGUpIG9iamVjdDIpIHx8IG9iamVjdDEuZXF1YWxzKG9iamVjdDIpKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFU1VMVF9LRVksIFRPT19MQVRFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSBvYmplY3QxICE9IG51bGwgJiYgb2JqZWN0MiAhPSBudWxsICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICghbmV3IERhdGUoKChEYXRlKSBvYmplY3QxKS5nZXRUaW1lKCkpLmFmdGVyKChEYXRlKSBvYmplY3QyKSB8fCBvYmplY3QxLmVxdWFscyhvYmplY3QyKSk7DQotDQotICAgICAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVNVTFRfS0VZLCBUT09fRUFSTFkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KENPTVBBUkVEX1ZBTFVFX0tFWSwgb2JqZWN0MSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlvbGF0aW9uRm91bmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRGF0ZUlzKSBhbm5vdGF0aW9uKS52YWx1ZU9mKCk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogcHJvdGVjdGVkDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZykgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLmdldChSRVNVTFRfS0VZKTsNCi0gICAgICAgIGlmIChUT09fRUFSTFkuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldE5vdEFmdGVyRXJyb3JNc2dLZXkoKERhdGVJcykgYW5ub3RhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChUT09fTEFURS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0Tm90QmVmb3JlRXJyb3JNc2dLZXkoKERhdGVJcykgYW5ub3RhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldE5vdEVxdWFsRXJyb3JNc2dLZXkoKERhdGVJcykgYW5ub3RhdGlvbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpLCBhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBrZXkgIiArIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKFN0cmluZyBrZXksIEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSByZXNvbHZlTWVzc2FnZShrZXkpOw0KLQ0KLSAgICAgICAgRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKChEYXRlSXMpIGFubm90YXRpb24pLmVycm9yTWVzc2FnZURhdGVTdHlsZSgpLA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpKTsNCi0NCi0gICAgICAgIC8vcmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgb3RoZXIgY29tcG9uZW50DQotICAgICAgICByZXR1cm4gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLCBkYXRlRm9ybWF0LmZvcm1hdCgoRGF0ZSkgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLmdldChDT01QQVJFRF9WQUxVRV9LRVkpKSk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogcHJpdmF0ZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90QWZ0ZXJFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RBZnRlckVycm9yTXNnS2V5KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXROb3RCZWZvcmVFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RCZWZvcmVFcnJvck1zZ0tleSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90RXF1YWxFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RFcXVhbEVycm9yTXNnS2V5KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRUxDb21wYXJlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2U1ZjlmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIHJlZmVyZW5jaW5nIHZhbGlkYXRpb24gdGFyZ2V0cyAtIHBvc3NpYmxlIGZvcm1hdHM6DQotICogIiN7W2JlYW5fbmFtZV0uW3Byb3BlcnR5X25hbWVdfSIgLi4uIGNyb3NzLWVudGl0eSB2YWxpZGF0aW9uIHdpdGggdmFsdWUgYmluZGluZw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBFTENvbXBhcmVTdHJhdGVneSBpbXBsZW1lbnRzIFJlZmVyZW5jaW5nU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYgKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKHZhbGlkYXRpb25UYXJnZXQpICYmDQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVZhbGlkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgdmFsaWRhdGlvblRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9WYWxpZGF0ZVZhbHVlQmluZGluZyhjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbGlkYXRpb25UYXJnZXQpLCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLCBjb21wYXJlU3RyYXRlZ3kpOw0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ0ZXN0IikNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZVZhbHVlQmluZGluZygNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcgPSBDcm9zc1ZhbGlkYXRpb25VdGlscw0KLSAgICAgICAgICAgICAgICAuZ2V0T3JJbml0S2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcoKTsNCi0NCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5ID0gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMucmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFbnRyeSgNCi0gICAgICAgICAgICAgICAga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLA0KLSAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5jb252ZXJ0VmFsdWVCaW5kaW5nRXhwcmVzc2lvblRvUHJvY2Vzc2VkSW5mb3JtYXRpb25LZXkodmFsaWRhdGlvblRhcmdldCksDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotDQotICAgICAgICBpZih2YWxpZGF0aW9uVGFyZ2V0RW50cnkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBjb252ZXJ0ZWQgb2JqZWN0IGZvciAiICsgcHJvcGVydHlEZXRhaWxzLmdldEtleSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FcXVhbHNTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDQ3NmNhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FcXVhbHNTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEVxdWFsc1N0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIHB1YmxpYyBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRXF1YWxzKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG9iamVjdDEgIT0gbnVsbCAmJiAhb2JqZWN0MS5lcXVhbHMob2JqZWN0Mik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRXF1YWxzKSBhbm5vdGF0aW9uKS52YWx1ZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbENvbXBhcmVTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZWI1NDEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiAiW3Byb3BlcnR5X25hbWVdIiAuLi4gbG9jYWwgdmFsaWRhdGlvbiAtPiBjcm9zcy1jb21wb25lbnQsIGJ1dCBubyBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBMb2NhbENvbXBhcmVTdHJhdGVneSBpbXBsZW1lbnRzIFJlZmVyZW5jaW5nU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlTG9jYWxseSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0S2V5LA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4ga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nID0gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMNCi0gICAgICAgICAgICAgICAgLmdldE9ySW5pdEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCk7DQotDQotICAgICAgICBTdHJpbmcgbmV3S2V5ID0gY3JlYXRlVGFyZ2V0S2V5KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0S2V5KTsNCi0gICAgICAgIGlmICgha2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLmNvbnRhaW5zS2V5KG5ld0tleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBTdHJpbmcgc291cmNlS2V5ID0gcHJvcGVydHlEZXRhaWxzLmdldEtleSgpOw0KLQ0KLSAgICAgICAgaWYoIXNvdXJjZUtleS5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNvdXJjZSBwYXRoOiAiICsgc291cmNlS2V5ICsgIiBpbnZhbGlkIik7DQotICAgICAgICB9DQotDQotICAgICAgICB0YXJnZXRLZXkgPSBzb3VyY2VLZXkuc3Vic3RyaW5nKDAsIHNvdXJjZUtleS5sYXN0SW5kZXhPZigiLiIpICsgMSkgKyB0YXJnZXRLZXk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9IENyb3NzVmFsaWRhdGlvblV0aWxzLnJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgICAgIGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZywgdGFyZ2V0S2V5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLQ0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25UYXJnZXRFbnRyeSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGNvbnZlcnRlZCBvYmplY3QgZm9yICIgKyBwcm9wZXJ0eURldGFpbHMuZ2V0S2V5KCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlVGFyZ2V0S2V5KENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFN0cmluZyB0YXJnZXRLZXkpDQotICAgIHsNCi0gICAgICAgIC8vbm8gcmVhbCB2YWx1ZSBiaW5kaW5nIGV4cHJlc3Npb24NCi0gICAgICAgIC8vVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBqdXN0IGhlcGxzIHRvIHJlcGxhY2UgdGhlIHByb3BlcnR5IG9mIHRoZSBrZXkNCi0gICAgICAgIC8vaGVyZSBvbmx5IGRvdC1ub3RhdGlvbiBpcyBhbGxvd2VkIC0+IG5vIHByb2JsZW0NCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYmFzZUV4cHJlc3Npb24gPQ0KLSAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIjeyIgKyBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLA0KLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZXRhaWxzLmNsYXNzKS5nZXRLZXkoKSArICJ9Iik7DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlT3JBZGRQcm9wZXJ0eShiYXNlRXhwcmVzc2lvbiwgdGFyZ2V0S2V5KQ0KLSAgICAgICAgICAgIC5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0LnN1YnN0cmluZygyLCByZXN1bHQubGVuZ3RoKCkgLTEpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkYTQ1NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi0NCi0vKioNCi0gKiAiW2xvY2FsX3Byb3BlcnR5LnByb3BlcnR5MS5wcm9wZXJ0eTJdIg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBMb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kgZXh0ZW5kcyBMb2NhbENvbXBhcmVTdHJhdGVneQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgT2JqZWN0IG5ld0Jhc2UgPSBSZWZsZWN0aW9uVXRpbHMNCi0gICAgICAgICAgICAuZ2V0QmFzZU9mUHJvcGVydHlDaGFpbihwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgaWYodGFyZ2V0S2V5LmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9maW5kIHRoZSBsYXN0IHByb3BlcnR5DQotICAgICAgICAgICAgdGFyZ2V0S2V5ID0gdGFyZ2V0S2V5LnN1YnN0cmluZyh0YXJnZXRLZXkubGFzdEluZGV4T2YoIi4iKSArIDEsIHRhcmdldEtleS5sZW5ndGgoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBPYmplY3QgdGFyZ2V0VmFsdWUgPSBnZXRWYWx1ZU9mUHJvcGVydHkobmV3QmFzZSwgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIGJvb2xlYW4gdmlvbGF0aW9uRm91bmQgPSBmYWxzZTsNCi0NCi0gICAgICAgIGlmIChjb21wYXJlU3RyYXRlZ3kuaXNWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VmFsdWUsIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpKQ0KLSAgICAgICAgew0KLQ0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgPSBuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KCk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbXBvbmVudChjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDbGllbnRJZChjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbnZlcnRlZE9iamVjdCh0YXJnZXRWYWx1ZSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldFZhbGlkYXRpb25TdHJhdGVneShjb21wYXJlU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneQ0KLSAgICAgICAgICAgICAgICAgICAgLnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotDQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IGdldFZhbHVlT2ZQcm9wZXJ0eShPYmplY3QgYmFzZSwgU3RyaW5nIHByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnR5LnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSwgcHJvcGVydHkubGVuZ3RoKCkpOw0KLSAgICAgICAgTWV0aG9kIHRhcmdldE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZChiYXNlLmdldENsYXNzKCksICJnZXQiICsgcHJvcGVydHkpOw0KLQ0KLSAgICAgICAgaWYodGFyZ2V0TWV0aG9kID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKGJhc2UuZ2V0Q2xhc3MoKSwgImlzIiArIHByb3BlcnR5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICJjbGFzcyAiICsgYmFzZS5nZXRDbGFzcygpICsgIiBoYXMgbm8gcHVibGljIGdldC9pcyAiICsgcHJvcGVydHkudG9Mb3dlckNhc2UoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKGJhc2UsIHRhcmdldE1ldGhvZCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L05vdEVxdWFsc1N0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxNWUyMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uTm90RXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBOb3RFcXVhbHNTdHJhdGVneSBleHRlbmRzIEVxdWFsc1N0cmF0ZWd5DQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChOb3RFcXVhbHMpIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsDQotICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIXN1cGVyLmlzVmlvbGF0aW9uKG9iamVjdDEsIG9iamVjdDIsIGFubm90YXRpb24pOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChOb3RFcXVhbHMpIGFubm90YXRpb24pLnZhbHVlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlZmVyZW5jaW5nU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMzZkZmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlZmVyZW5jaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJbnRlcm5hbCBpbnRlcmZhY2UgdG8gYWxsb3cgbXVsdGlwbGUgcmVmZXJlbmNpbmcgc3RyYXRlZ2llcyBmb3IgY3Jvc3MgY29tcG9uZW50IHZhbGlkYXRpb24uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWludGVyZmFjZSBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgYWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVxdWlyZWRJZlN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVxdWlyZWRJZlN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMDVhNWYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlcXVpcmVkSWZTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRJZlN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VGYWNlc0J1bmRsZSA9IGZhbHNlOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHN1cGVyLnJlc29sdmVNZXNzYWdlKGtleSk7DQotICAgICAgICBTdHJpbmcgbWFya2VyID0gQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVI7DQotDQotICAgICAgICBpZigobWFya2VyICsga2V5ICsgbWFya2VyKS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnVzZUZhY2VzQnVuZGxlID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChSZXF1aXJlZElmKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiB2aW9sYXRpb25Gb3VuZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgaWYgKCgoUmVxdWlyZWRJZikgYW5ub3RhdGlvbikuaXMoKS5lcXVhbHMoUmVxdWlyZWRJZlR5cGUuZW1wdHkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gKG9iamVjdDIgPT0gbnVsbCB8fCBvYmplY3QyLmVxdWFscygiIikpICYmIChvYmplY3QxID09IG51bGwgfHwgb2JqZWN0MS5lcXVhbHMoIiIpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKCgoUmVxdWlyZWRJZikgYW5ub3RhdGlvbikuaXMoKS5lcXVhbHMoUmVxdWlyZWRJZlR5cGUubm90X2VtcHR5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IChvYmplY3QyICE9IG51bGwgJiYgIW9iamVjdDIuZXF1YWxzKCIiKSkgJiYgKG9iamVjdDEgPT0gbnVsbCB8fCBvYmplY3QxLmVxdWFscygiIikpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZpb2xhdGlvbkZvdW5kOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKFJlcXVpcmVkSWYpIGFubm90YXRpb24pLnZhbHVlT2YoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy51c2VGYWNlc0J1bmRsZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5yZXBsYWNlV2l0aERlZmF1bHRSZXF1aXJlZE1lc3NhZ2UodmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRvckV4Y2VwdGlvbik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2pwYV9zdHJhdGVneV9tYXBwaW5ncy5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2pwYV9zdHJhdGVneV9tYXBwaW5ncy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Q5OTI5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1qYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW49b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuQmFzaWM9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuSWQ9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmU9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Dcm9zc1ZhbGlkYXRpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTRiY2Q4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENST1NTX1ZBTElEQVRJT05fU1RPUkFHRV9LRVkgPSBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7DQotDQotICAgICAgICBpZiAoIXJlcXVlc3RNYXAuY29udGFpbnNLZXkoQ1JPU1NfVkFMSURBVElPTl9TVE9SQUdFX0tFWSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKENyb3NzVmFsaWRhdGlvblN0b3JhZ2UpIHJlcXVlc3RNYXAuZ2V0KENST1NTX1ZBTElEQVRJT05fU1RPUkFHRV9LRVkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQNCi0gICAgICAgICAgICAgICAgLmdldEN1cnJlbnRJbnN0YW5jZSgpDQotICAgICAgICAgICAgICAgIC5nZXRFeHRlcm5hbENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgICAgIC5wdXQoQ1JPU1NfVkFMSURBVElPTl9TVE9SQUdFX0tFWSwgbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RPX0NPTlZFUlRFRF9WQUxVRV9NQVBQSU5HX0tFWSA9IEpzZlV0aWxzLmNsYXNzLmdldE5hbWUoKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBnZXRPckluaXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIGlmICghcmVxdWVzdE1hcC5jb250YWluc0tleShLRVlfVE9fQ09OVkVSVEVEX1ZBTFVFX01BUFBJTkdfS0VZKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNldEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+KSByZXF1ZXN0TWFwLmdldChLRVlfVE9fQ09OVkVSVEVEX1ZBTFVFX01BUFBJTkdfS0VZKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkNCi0gICAgICAgICAgICAucHV0KEtFWV9UT19DT05WRVJURURfVkFMVUVfTUFQUElOR19LRVksIG5ldyBIYXNoTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4oKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4ga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcsDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSwgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5ID0NCi0gICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQodGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIC8vc2ltcGxlIGNhc2UNCi0gICAgICAgIGlmIChwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEZ1cnRoZXJFbnRyaWVzKCkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgT2JqZWN0IHRhcmdldEJlYW4gPSBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpOw0KLQ0KLSAgICAgICAgLy9wcm9jZXNzIGNvbXBsZXggY29tcG9uZW50IGVudHJpZXMgKGUuZy4gYSB0YWJsZSkNCi0gICAgICAgIC8vc3VwcG9ydGVkOiBjcm9zcy1jb21wb25lbnQgYnV0IG5vIGNyb3NzLWVudGl0eSB2YWxpZGF0aW9uICg9IGxvY2FsZSB2YWxpZGF0aW9uKQ0KLSAgICAgICAgaWYgKHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuZ2V0QmVhbigpLmVxdWFscyh0YXJnZXRCZWFuKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAoUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSBlbnRyeSA6IHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuZ2V0RnVydGhlckVudHJpZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuZ2V0QmVhbigpLmVxdWFscyh0YXJnZXRCZWFuKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic3VwcG9ydCBmb3IgbWFwIHN5bnRheCIpDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uVG9Qcm9jZXNzZWRJbmZvcm1hdGlvbktleShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZiZS5nZXRFeHByZXNzaW9uU3RyaW5nKCkucmVwbGFjZSgiI3siLCAiIikucmVwbGFjZSgifSIsICIiKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzOTI1NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFByb3BlcnR5IFZhbGlkYXRpb24gTW9kdWxlDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgUHJvcGVydHkgVmFsaWRhdGlvbiBNb2R1bGUgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBQcm9wZXJ0eSBWYWxpZGF0aW9uIHByb3ZpZGVzIGFubm90YXRpb24gYmFzZWQgdmFsaWRhdGlvbiBmb3IgYmVhbiBwcm9wZXJ0aWVzLg0KLSAgICBJdCBhbHNvIHByb3ZpZGVzIEpQQSAxLjAgYmFzZWQgdmFsaWRhdGlvbiBTdXBwb3J0Lg0KLSAgDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLjEueCBhbmQgSlNGIDEuMi54LiBCb3RoIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0Fic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYzM2FiYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7Ci1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUlucHV0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuVGVzdFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5tb2NrLkV4dFZhbE1vY2tBcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZF9pbXBsLmNvbmZpZy5NeWZhY2VzQ29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrRXh0ZXJuYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tGYWNlc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0ZhY2VzQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrSHR0cFNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0xpZmVjeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrTGlmZWN5Y2xlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrUmVuZGVyS2l0OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tSZXNwb25zZVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrU2VydmxldENvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrU2VydmxldENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0LmVsLk1vY2tFeHByZXNzaW9uRmFjdG9yeTsKLQotLyoqCi0gKiBBYnN0cmFjdCBTaGFsZSBUZXN0IGJhc2UgY2xhc3MsIHdoaWNoIHNldHMgdXAgdGhlIEpTRiBlbnZpcm9ubWVudC4gIElmIHRoZSB0ZXN0Ci0gKiBvdmVycmlkZXMgPGNvZGU+c2V0VXAoKTwvY29kZT4gYW5kL29yIDxjb2RlPnRlYXJEb3duKCk8L2NvZGU+LCB0aGVuIHRob3NlCi0gKiBtZXRob2RzIGJ1dCBjYWxsIHRoZSBvdmVyd2l0dGVuIG1ldGhvZCB0byBpbnN1cmUgYSB2YWxpZCB0ZXN0IGVudmlyb25tZW50LgotICovCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHByb3RlY3RlZCBNb2NrQXBwbGljYXRpb24gYXBwbGljYXRpb247Ci0gICAgcHJvdGVjdGVkIE1vY2tTZXJ2bGV0Q29uZmlnIGNvbmZpZzsKLSAgICBwcm90ZWN0ZWQgTW9ja0V4dGVybmFsQ29udGV4dCBleHRlcm5hbENvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIE1vY2tGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0OwotICAgIHByb3RlY3RlZCBNb2NrRmFjZXNDb250ZXh0RmFjdG9yeSBmYWNlc0NvbnRleHRGYWN0b3J5OwotICAgIHByb3RlY3RlZCBNb2NrTGlmZWN5Y2xlIGxpZmVjeWNsZTsKLSAgICBwcm90ZWN0ZWQgTW9ja0xpZmVjeWNsZUZhY3RvcnkgbGlmZWN5Y2xlRmFjdG9yeTsKLSAgICBwcm90ZWN0ZWQgUmVuZGVyS2l0IHJlbmRlcktpdDsKLSAgICBwcm90ZWN0ZWQgTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0OwotICAgIHByb3RlY3RlZCBNb2NrSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZTsKLSAgICBwcm90ZWN0ZWQgTW9ja1NlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0OwotICAgIHByb3RlY3RlZCBNb2NrSHR0cFNlc3Npb24gc2Vzc2lvbjsKLSAgICBwcm90ZWN0ZWQgTW9ja0V4cHJlc3Npb25GYWN0b3J5IGV4cHJlc3Npb25GYWN0b3J5OwotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyOwotICAgICAgICAKLSAgICAvKiogUmVzcG9uc2UgV3JpdGVyICovCi0gICAgcHJpdmF0ZSBNb2NrUmVzcG9uc2VXcml0ZXIgd3JpdGVyOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuCi0gICAgICovCi0gICAgcHVibGljIEFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgICAgIGFwcGxpY2F0aW9uID0gbnVsbDsKLSAgICAgICAgY29uZmlnID0gbnVsbDsKLSAgICAgICAgZXh0ZXJuYWxDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgZmFjZXNDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgZmFjZXNDb250ZXh0RmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIGxpZmVjeWNsZSA9IG51bGw7Ci0gICAgICAgIGxpZmVjeWNsZUZhY3RvcnkgPSBudWxsOwotICAgICAgICByZW5kZXJLaXQgPSBudWxsOwotICAgICAgICByZXF1ZXN0ID0gbnVsbDsKLSAgICAgICAgcmVzcG9uc2UgPSBudWxsOwotICAgICAgICBzZXJ2bGV0Q29udGV4dCA9IG51bGw7Ci0gICAgICAgIHNlc3Npb24gPSBudWxsOwotICAgICAgICBleHByZXNzaW9uRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIHRocmVhZENvbnRleHRDbGFzc0xvYWRlciA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFNldHVwIHRoZSB0ZXN0IGVudmlyb25tZW50LCBpbmNsdWRpbmcgdGhlIGZvbGxvd2luZzoKLSAgICAgKiAgPHVsPgotICAgICAqICA8bGk+U2V0IHRoZSBBcHBsaWNhdGlvbiBNYXAuPC9saT4KLSAgICAgKiAgPGxpPlNldCBhIHJlc3BvbnNlIHdyaXRlcjwvbGk+Ci0gICAgICogIDxsaT5BZGQgVG9tYWhhd2sncyByZW5kZXJlcnMgdG8gdGhlIGZhY2VzIGNvbnRleHQuPC9saT4KLSAgICAgKiAgPC91bD4gCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFswXSwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKSk7Ci0gICAgICAgIHNlcnZsZXRDb250ZXh0ID0gbmV3IE1vY2tTZXJ2bGV0Q29udGV4dCgpOwotICAgICAgICAvL2ZvciB0ZXN0aW5nIHRoZSBmYWxsYmFjawotICAgICAgICAvL3NlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCArICIuREVBQ1RJVkFURV9FTF9SRVNPTFZFUiIsICJ0cnVlIik7Ci0gICAgICAgIGNvbmZpZyA9IG5ldyBNb2NrU2VydmxldENvbmZpZyhzZXJ2bGV0Q29udGV4dCk7Ci0gICAgICAgIHNlc3Npb24gPSBuZXcgTW9ja0h0dHBTZXNzaW9uKCk7Ci0gICAgICAgIHNlc3Npb24uc2V0U2VydmxldENvbnRleHQoc2VydmxldENvbnRleHQpOwotICAgICAgICByZXF1ZXN0ID0gbmV3IE1vY2tIdHRwU2VydmxldFJlcXVlc3Qoc2Vzc2lvbik7Ci0gICAgICAgIHJlcXVlc3Quc2V0U2VydmxldENvbnRleHQoc2VydmxldENvbnRleHQpOwotICAgICAgICByZXNwb25zZSA9IG5ldyBNb2NrSHR0cFNlcnZsZXRSZXNwb25zZSgpOwotICAgICAgICBGYWN0b3J5RmluZGVyLnJlbGVhc2VGYWN0b3JpZXMoKTsKLSAgICAgICAgRmFjdG9yeUZpbmRlci5zZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3RvcnkiLCBFeHRWYWxNb2NrQXBwbGljYXRpb25GYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIEZhY3RvcnlGaW5kZXIuc2V0RmFjdG9yeSgiamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHRGYWN0b3J5IiwgIm9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tGYWNlc0NvbnRleHRGYWN0b3J5Iik7Ci0gICAgICAgIEZhY3RvcnlGaW5kZXIuc2V0RmFjdG9yeSgiamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZUZhY3RvcnkiLCAib3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0xpZmVjeWNsZUZhY3RvcnkiKTsKLSAgICAgICAgRmFjdG9yeUZpbmRlci5zZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeSIsICJvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrUmVuZGVyS2l0RmFjdG9yeSIpOwotICAgICAgICBleHRlcm5hbENvbnRleHQgPSBuZXcgTW9ja0V4dGVybmFsQ29udGV4dChzZXJ2bGV0Q29udGV4dCwgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICBsaWZlY3ljbGVGYWN0b3J5ID0gKE1vY2tMaWZlY3ljbGVGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZUZhY3RvcnkiKTsKLSAgICAgICAgbGlmZWN5Y2xlID0gKE1vY2tMaWZlY3ljbGUpbGlmZWN5Y2xlRmFjdG9yeS5nZXRMaWZlY3ljbGUoIkRFRkFVTFQiKTsKLSAgICAgICAgZmFjZXNDb250ZXh0RmFjdG9yeSA9IChNb2NrRmFjZXNDb250ZXh0RmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoImphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0RmFjdG9yeSIpOwotICAgICAgICBmYWNlc0NvbnRleHQgPSAoTW9ja0ZhY2VzQ29udGV4dClmYWNlc0NvbnRleHRGYWN0b3J5LmdldEZhY2VzQ29udGV4dChzZXJ2bGV0Q29udGV4dCwgcmVxdWVzdCwgcmVzcG9uc2UsIGxpZmVjeWNsZSk7Ci0gICAgICAgIGV4dGVybmFsQ29udGV4dCA9IChNb2NrRXh0ZXJuYWxDb250ZXh0KWZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKTsKLSAgICAgICAgVUlWaWV3Um9vdCByb290ID0gbmV3IFVJVmlld1Jvb3QoKTsKLSAgICAgICAgcm9vdC5zZXRWaWV3SWQoIi92aWV3SWQiKTsKLSAgICAgICAgcm9vdC5zZXRSZW5kZXJLaXRJZCgiSFRNTF9CQVNJQyIpOwotICAgICAgICBmYWNlc0NvbnRleHQuc2V0Vmlld1Jvb3Qocm9vdCk7Ci0gICAgICAgIEFwcGxpY2F0aW9uRmFjdG9yeSBhcHBsaWNhdGlvbkZhY3RvcnkgPSAoQXBwbGljYXRpb25GYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5Iik7Ci0gICAgICAgIGFwcGxpY2F0aW9uID0gKE1vY2tBcHBsaWNhdGlvbilhcHBsaWNhdGlvbkZhY3RvcnkuZ2V0QXBwbGljYXRpb24oKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LnNldEFwcGxpY2F0aW9uKGFwcGxpY2F0aW9uKTsKLSAgICAgICAgUmVuZGVyS2l0RmFjdG9yeSByZW5kZXJLaXRGYWN0b3J5ID0gKFJlbmRlcktpdEZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeSIpOwotICAgICAgICAvL1dyYXAgcmVuZGVyZXJzIHdpdGggcHJvcGVyIGV4dmFsIHdyYXBwZXIKLSAgICAgICAgcmVuZGVyS2l0ID0gbmV3IERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpLmNyZWF0ZShuZXcgTW9ja1JlbmRlcktpdCgpKTsKLSAgICAgICAgcmVuZGVyS2l0RmFjdG9yeS5hZGRSZW5kZXJLaXQoIkhUTUxfQkFTSUMiLCByZW5kZXJLaXQpOyAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyBhZGRpdGlvbmFsIHNldHVwIG5vdCBwcm92aWRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBzaGFsZSBtb2NrIHN0dWZmCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbk1hcCgpLnB1dCgKLSAgICAgICAgICAgICAgICBNeWZhY2VzQ29uZmlnLmNsYXNzLmdldE5hbWUoKSwgbmV3IE15ZmFjZXNDb25maWcoKSk7Ci0gICAgICAgIHdyaXRlciA9IG5ldyBNb2NrUmVzcG9uc2VXcml0ZXIobmV3IFN0cmluZ1dyaXRlcigpLCBudWxsLCBudWxsKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LnNldFJlc3BvbnNlV3JpdGVyKHdyaXRlcik7Ci0KLSAgICAgICAgVGVzdFV0aWxzLmFkZERlZmF1bHRSZW5kZXJlcnMoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgVGVzdFV0aWxzLmFkZERlZmF1bHRWYWxpZGF0b3JzKGZhY2VzQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIGV4cHJlc3Npb25GYWN0b3J5ID0gKE1vY2tFeHByZXNzaW9uRmFjdG9yeSlhcHBsaWNhdGlvbi5nZXRFeHByZXNzaW9uRmFjdG9yeSgpOwotICAgICAgICBuZXcgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyKCkuaW5pdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlYXIgZG93biB0aGUgdGVzdCBlbnZpcm9ubWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGFwcGxpY2F0aW9uID0gbnVsbDsKLSAgICAgICAgY29uZmlnID0gbnVsbDsKLSAgICAgICAgZXh0ZXJuYWxDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgZmFjZXNDb250ZXh0LnJlbGVhc2UoKTsKLSAgICAgICAgZmFjZXNDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgbGlmZWN5Y2xlID0gbnVsbDsKLSAgICAgICAgbGlmZWN5Y2xlRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIHJlbmRlcktpdCA9IG51bGw7Ci0gICAgICAgIHJlcXVlc3QgPSBudWxsOwotICAgICAgICByZXNwb25zZSA9IG51bGw7Ci0gICAgICAgIHNlcnZsZXRDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgc2Vzc2lvbiA9IG51bGw7Ci0gICAgICAgIEZhY3RvcnlGaW5kZXIucmVsZWFzZUZhY3RvcmllcygpOwotICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcih0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIpOwotICAgICAgICBleHByZXNzaW9uRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIHRocmVhZENvbnRleHRDbGFzc0xvYWRlciA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NDcm9zc1ZhbFZhbGlkYXRpb24oKQotICAgIHsKLSAgICAgICAgbmV3IENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIoKS5hZnRlclBoYXNlKG5ldyBQaGFzZUV2ZW50KChGYWNlc0NvbnRleHQpZmFjZXNDb250ZXh0LFBoYXNlSWQuQU5ZX1BIQVNFLGxpZmVjeWNsZSkpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja01lc3NhZ2VDb3VudChpbnQgZXhwZWN0ZWQpCi0gICAgewotICAgICAgICBpbnQgYWN0dWFsID0gMDsKLSAgICAgICAgZm9yKEl0ZXJhdG9yIG1lc3NhZ2VzID0gZmFjZXNDb250ZXh0LmdldE1lc3NhZ2VzKCk7IG1lc3NhZ2VzLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lc3NhZ2VzLm5leHQoKTsKLSAgICAgICAgICAgIGFjdHVhbCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb21wbGV0ZSBtZXNzYWdlIGNvdW50IiwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tNZXNzYWdlQ291bnQoU3RyaW5nIGNsaWVudElkLCBpbnQgZXhwZWN0ZWQpCi0gICAgewotICAgICAgICBpbnQgYWN0dWFsID0gMDsKLSAgICAgICAgZm9yKEl0ZXJhdG9yIG1lc3NhZ2VzID0gZmFjZXNDb250ZXh0LmdldE1lc3NhZ2VzKGNsaWVudElkKTsgbWVzc2FnZXMuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgbWVzc2FnZXMubmV4dCgpOwotICAgICAgICAgICAgYWN0dWFsKys7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbXBsZXRlIG1lc3NhZ2UgY291bnQiLCBleHBlY3RlZCwgYWN0dWFsKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVmVyaWZ5IHRoZSBmb2xsb3dpbmc6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5pZCBpcyBub3QgbnVsbDwvbGk+Ci0gICAgICogPGxpPlJlc3BvbnNlIGlzIGNvbXBsZXRlPC9saT4KLSAgICAgKiA8bGk+UmVzcG9uY2UgY29udGFpbnMgdGhlIGlkPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZCBJRCB0byB2ZXJpZnkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRJZEV4aXN0cyhTdHJpbmcgaWQpCi0gICAgewotICAgICAgICBhc3NlcnROb3ROdWxsKCJJRCBpcyBub3QgbnVsbCIsIGlkKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzcG9uc2UgQ29tcGxldGUiLCBmYWNlc0NvbnRleHQuZ2V0UmVzcG9uc2VDb21wbGV0ZSgpKTsKLSAgICAgICAgU3RyaW5nIG91dHB1dCA9IHdyaXRlci5nZXRXcml0ZXIoKS50b1N0cmluZygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJIYXMgb3V0cHV0Iiwgb3V0cHV0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ29udGFpbnMgaWQgJyIgKyBpZCArICInIiwgb3V0cHV0LmluZGV4T2YoaWQpICE9IC0xKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVWYWx1ZUJpbmRpbmcoVUlJbnB1dCB1aUlucHV0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIGV4cHJlc3Npb24pCi0gICAgewotICAgICAgICBWYWx1ZUJpbmRpbmcgdmFsdWVCaW5kaW5nID0gYXBwbGljYXRpb24uY3JlYXRlVmFsdWVCaW5kaW5nKGV4cHJlc3Npb24pOwotICAgICAgICBWYWx1ZUV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uID0gZXhwcmVzc2lvbkZhY3RvcnkuY3JlYXRlVmFsdWVFeHByZXNzaW9uKAotICAgICAgICAgICAgZmFjZXNDb250ZXh0LmdldEVMQ29udGV4dCgpLCBleHByZXNzaW9uLCBPYmplY3QuY2xhc3MpOwotCi0gICAgICAgIGlmKHVpSW5wdXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdWlJbnB1dC5zZXRWYWx1ZUJpbmRpbmcobmFtZSwgdmFsdWVCaW5kaW5nKTsKLSAgICAgICAgICAgIHVpSW5wdXQuc2V0VmFsdWVFeHByZXNzaW9uKG5hbWUsIHZhbHVlRXhwcmVzc2lvbik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9CYXNlVmFsVGVzdEJlYW4uamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL0Jhc2VWYWxUZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWRjOTIwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL0Jhc2VWYWxUZXN0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkRvdWJsZVJhbmdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOwotCi0vKioKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUKLSAqLwotcHVibGljIGNsYXNzIEJhc2VWYWxUZXN0QmVhbgotewotICAgIEBSZXF1aXJlZAotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgCi0gICAgQExlbmd0aChtaW5pbXVtPTIsbWF4aW11bT0zKQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWUxOwotICAgIAotICAgIEBQYXR0ZXJuKCJbQS1aXVthLXpdKyIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGF0dGVybk5hbWU7Ci0gICAgCi0gICAgQERvdWJsZVJhbmdlKG1pbmltdW09LTMwMGQpCi0gICAgcHJpdmF0ZSBEb3VibGUgZG91YmxlVmFsdWUxOwotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZTEoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5hbWUxOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUxKFN0cmluZyBuYW1lMSkKLSAgICB7Ci0gICAgICAgIHRoaXMubmFtZTEgPSBuYW1lMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhdHRlcm5OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwYXR0ZXJuTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuTmFtZShTdHJpbmcgcGF0dGVybk5hbWUpCi0gICAgewotICAgICAgICB0aGlzLnBhdHRlcm5OYW1lID0gcGF0dGVybk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIERvdWJsZSBnZXREb3VibGVWYWx1ZTEoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRvdWJsZVZhbHVlMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREb3VibGVWYWx1ZTEoRG91YmxlIGRvdWJsZVZhbHVlMSkKLSAgICB7Ci0gICAgICAgIHRoaXMuZG91YmxlVmFsdWUxID0gZG91YmxlVmFsdWUxOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL0Jhc2VWYWxUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvQmFzZVZhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwN2ExNjEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvQmFzZVZhbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWw7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2U7Ci0KLS8qKgotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQotICovCi1wdWJsaWMgY2xhc3MgQmFzZVZhbFRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UKLXsKLQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQgPSBudWxsOwotCi0gICAgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsKLSAgICAKLSAgICBCYXNlVmFsVGVzdEJlYW4gYmVhbiA9IG51bGw7Ci0KLSAgICBwdWJsaWMgQmFzZVZhbFRlc3RDYXNlKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50ID0gbnVsbDsKLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7Ci0gICAgICAgIGJlYW4gPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShCYXNlVmFsVGVzdENhc2UuY2xhc3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgYmVhbiA9IG5ldyBCYXNlVmFsVGVzdEJlYW4oKTsKLSAgICAgICAgVmFsdWVCaW5kaW5nIHZiID0gYXBwbGljYXRpb24uY3JlYXRlVmFsdWVCaW5kaW5nKCIje3Rlc3RCZWFufSIpOwotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dCgidGVzdEJlYW4iLCBiZWFuKTsKLQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsKLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOwotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7Ci0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50ID0gbmV3IEh0bWxJbnB1dFRleHQoKTsKLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudCk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldElkKCJpbnB1dDEiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50ID0gbnVsbDsKLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7Ci0gICAgICAgIGJlYW4gPSBudWxsOyAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWVSZXF1aXJlZEZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWV9Iik7Ci0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIiIpOwotCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWUxTGVuZ2h0TWF4RmFpbCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZTF9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIjEyMzQ1Iik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lMUxlbmdodENvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWUxfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZTFMZW5naHRNaW5GYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lMX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgieCIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFBhdHRlcm5OYW1lRmFpbCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucGF0dGVybk5hbWV9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIlBldGVyMSIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFBhdHRlcm5OYW1lQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucGF0dGVybk5hbWV9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIlBldGVyIik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydFRydWUoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7Ci0gICAgfSAgICAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVWYWx1ZUZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLmRvdWJsZVZhbHVlMX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiLTMwMSIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWVDb3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5kb3VibGVWYWx1ZTF9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIjIwMCIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOwotICAgICAgICBhc3NlcnRFcXVhbHMoMjAwZCwgaW5wdXRDb21wb25lbnQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIAotICAgICAgICBpbnB1dENvbXBvbmVudC51cGRhdGVNb2RlbChmYWNlc0NvbnRleHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMjAwZCwgYmVhbi5nZXREb3VibGVWYWx1ZTEoKSk7Ci0gICAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RCZWFuLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDhhZGM5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7Ci0KLS8qKgotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQotICovCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxUZXN0QmVhbgotewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkxOwotICAgIAotICAgIEBFcXVhbHMoInByb3BlcnR5MSIpICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MjsKLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MSgpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvcGVydHkxOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOwotICAgIH0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MigpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvcGVydHkyOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydHkyID0gcHJvcGVydHkyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RDYXNlLmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGNhMGJjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2U7Ci0KLS8qKgotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQotICovCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlCi17Ci0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MSA9IG51bGw7Ci0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOwotICAgIAotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIENyb3NzVmFsVGVzdENhc2UoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbnVsbDsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbnVsbDsKLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ3Jvc3NWYWxUZXN0Q2FzZS5jbGFzcyk7Ci0gICAgfSAgICAKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgQ3Jvc3NWYWxUZXN0QmVhbiBiZWFuID0gbmV3IENyb3NzVmFsVGVzdEJlYW4oKTsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKG51bGwsICJ2YWx1ZSIsICIje3Rlc3RCZWFufSIpOwotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dCgidGVzdEJlYW4iLGJlYW4pOwotICAgICAgICAKLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7Ci0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsKLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOwotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOyAgICAgICAgCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7Ci0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQxKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldElkKCJpbnB1dDEiKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbmV3IEh0bWxJbnB1dFRleHQoKTsKLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDIpOwotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0SWQoImlucHV0MiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc0NvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOwotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbFZhbGlkYXRpb24oKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7Ci0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOwotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDQiKTsKLSAgICAgICAgCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotICAgICAgICAKLQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxWYWxpZGF0aW9uKCk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDIpOwotCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9tb2NrL0V4dFZhbE1vY2tBcHBsaWNhdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNDQ1NDEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IubW9jazsKLQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbjsKLQotaW1wb3J0IGphdmF4LmVsLkVMQ29udGV4dExpc3RlbmVyOwotaW1wb3J0IGphdmF4LmVsLkVMUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXguZWwuRXhwcmVzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRWYWxNb2NrQXBwbGljYXRpb24gZXh0ZW5kcyBNb2NrQXBwbGljYXRpb24KLXsKLSAgICBwcml2YXRlIEFwcGxpY2F0aW9uIHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsTW9ja0FwcGxpY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEV4dFZhbE1vY2tBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IGFwcGxpY2F0aW9uOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFTENvbnRleHRMaXN0ZW5lcltdIGdldEVMQ29udGV4dExpc3RlbmVycygpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEVMQ29udGV4dExpc3RlbmVyWzBdOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFTFJlc29sdmVyIGdldEVMUmVzb2x2ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZC5nZXRFTFJlc29sdmVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEV4cHJlc3Npb25GYWN0b3J5IGdldEV4cHJlc3Npb25GYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRXh0VmFsTW9ja0V4cHJlc3Npb25GYWN0b3J5KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2YxNzk1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9tb2NrL0V4dFZhbE1vY2tBcHBsaWNhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5tb2NrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0FwcGxpY2F0aW9uRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICovCi1wdWJsaWMgY2xhc3MgRXh0VmFsTW9ja0FwcGxpY2F0aW9uRmFjdG9yeSBleHRlbmRzIE1vY2tBcHBsaWNhdGlvbkZhY3RvcnkKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxNb2NrQXBwbGljYXRpb24oc3VwZXIuZ2V0QXBwbGljYXRpb24oKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL21vY2svRXh0VmFsTW9ja0V4cHJlc3Npb25GYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvbW9jay9FeHRWYWxNb2NrRXhwcmVzc2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU4OWNlMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvbW9jay9FeHRWYWxNb2NrRXhwcmVzc2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5tb2NrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0LmVsLk1vY2tFeHByZXNzaW9uRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmVsLkVMQ29udGV4dDsKLWltcG9ydCBqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRWYWxNb2NrRXhwcmVzc2lvbkZhY3RvcnkgZXh0ZW5kcyBNb2NrRXhwcmVzc2lvbkZhY3RvcnkKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVmFsdWVFeHByZXNzaW9uIGNyZWF0ZVZhbHVlRXhwcmVzc2lvbihFTENvbnRleHQgY29udGV4dCwgU3RyaW5nIGV4cHJlc3Npb24sIENsYXNzIGV4cGVjdGVkVHlwZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRXh0VmFsTW9ja1ZhbHVlRXhwcmVzc2lvbihleHByZXNzaW9uLCBleHBlY3RlZFR5cGUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9tb2NrL0V4dFZhbE1vY2tWYWx1ZUV4cHJlc3Npb24uamF2YSBiL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9tb2NrL0V4dFZhbE1vY2tWYWx1ZUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAzMzg3Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3ByZXBhcmVfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvbW9jay9FeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLm1vY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5FeHRWYWxFTFJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5lbC5Nb2NrVmFsdWVFeHByZXNzaW9uOwotCi1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0OwotaW1wb3J0IGphdmF4LmVsLkVMUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKi8KLS8vVE9ETyBpbXByb3ZlCi1wdWJsaWMgY2xhc3MgRXh0VmFsTW9ja1ZhbHVlRXhwcmVzc2lvbiBleHRlbmRzIE1vY2tWYWx1ZUV4cHJlc3Npb24KLXsKLSAgICBwcml2YXRlIFN0cmluZ1tdIGVsZW1lbnRzID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBleHByZXNzaW9uID0gbnVsbDsKLQotICAgIHB1YmxpYyBFeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uKFN0cmluZyBleHByZXNzaW9uLCBDbGFzcyBleHBlY3RlZFR5cGUpCi0gICAgewotICAgICAgICBzdXBlcihleHByZXNzaW9uLCBleHBlY3RlZFR5cGUpOwotCi0gICAgICAgIGlmIChleHByZXNzaW9uID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiRXhwcmVzc2lvbiBzdHJpbmcgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247Ci0gICAgICAgIHBhcnNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShFTENvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIEVMUmVzb2x2ZXIgcmVzb2x2ZXIgPSBjb250ZXh0LmdldEVMUmVzb2x2ZXIoKTsKLQotICAgICAgICBpZiAocmVzb2x2ZXIgaW5zdGFuY2VvZiBFeHRWYWxFTFJlc29sdmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QmFzZShjb250ZXh0LCByZXNvbHZlcik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VmFsdWUoY29udGV4dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoRUxDb250ZXh0IGNvbnRleHQsIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmIChjb250ZXh0LmdldEVMUmVzb2x2ZXIoKSBpbnN0YW5jZW9mIEV4dFZhbEVMUmVzb2x2ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRleHQuZ2V0RUxSZXNvbHZlcigpLnNldFZhbHVlKGNvbnRleHQsIGdldFZhbHVlKGNvbnRleHQpLCBlbGVtZW50c1tlbGVtZW50cy5sZW5ndGggLSAxXSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgYmFzZSA9IGdldEJhc2UoY29udGV4dCwgY29udGV4dC5nZXRFTFJlc29sdmVyKCkpOwotICAgICAgICAgICAgU3RyaW5nIHNldHRlciA9ICJzZXQiICsgY3JlYXRlUHJvcGVydHlTdHJpbmcoKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTWV0aG9kIHNldHRlck1ldGhvZCA9IGJhc2UuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZChzZXR0ZXIsIHZhbHVlICE9IG51bGwgPyB2YWx1ZS5nZXRDbGFzcygpIDogT2JqZWN0LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBzZXR0ZXJNZXRob2QuaW52b2tlKGJhc2UsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZShFTENvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IGJhc2UgPSBnZXRCYXNlKGNvbnRleHQsIGNvbnRleHQuZ2V0RUxSZXNvbHZlcigpKTsKLQotICAgICAgICBpZiAoYmFzZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBnZXR0ZXIgPSAiZ2V0IiArIGNyZWF0ZVByb3BlcnR5U3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1ldGhvZCBnZXR0ZXJNZXRob2QgPSBiYXNlLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2QoZ2V0dGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0dGVyTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGFyc2UoKQotICAgIHsKLQotICAgICAgICBpZiAoaXNMaXRlcmFsVGV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbGVtZW50cyA9IG5ldyBTdHJpbmdbMF07Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXhwcmVzc2lvbi5zdGFydHNXaXRoKCIkeyIpIHx8IGV4cHJlc3Npb24uc3RhcnRzV2l0aCgiI3siKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24uZW5kc1dpdGgoIn0iKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBleHByID0gbmV3IFN0cmluZ0J1ZmZlcihleHByZXNzaW9uLnN1YnN0cmluZygyLCBleHByZXNzaW9uLmxlbmd0aCgpIC0gMSkucmVwbGFjZUFsbCgiICIsICIiKSk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Jsb2NrT24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gZXhwci5sZW5ndGgoKSAtIDE7IGkgPiAtMTsgaS0tKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4cHIuY2hhckF0KGkpID09ICcgJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhwci5kZWxldGVDaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhwci5jaGFyQXQoaSkgPT0gJ10nKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHByLmRlbGV0ZUNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHByLmNoYXJBdChpKSA9PSAnWycpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZGVsZXRlQ2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4cHIuY2hhckF0KGkpID09ICdcJycpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNCbG9ja09uKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZGVsZXRlQ2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZCgwLCBleHByLnN1YnN0cmluZyhpICsgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZGVsZXRlKGksIGV4cHIubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaXNCbG9ja09uID0gIWlzQmxvY2tPbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHByLmNoYXJBdChpKSA9PSAnLicgJiYgIWlzQmxvY2tPbikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMuYWRkKDAsIGV4cHIuc3Vic3RyaW5nKGkgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHByLmRlbGV0ZShpLCBleHByLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZXhwci5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuYW1lcy5hZGQoMCwgZXhwci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlbGVtZW50cyA9IChTdHJpbmdbXSkgbmFtZXMudG9BcnJheShuZXcgU3RyaW5nW25hbWVzLnNpemUoKV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXhwcmVzc2lvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV4cHJlc3Npb24pOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJhc2UoRUxDb250ZXh0IGNvbnRleHQsIEVMUmVzb2x2ZXIgcmVzb2x2ZXIpCi0gICAgewotICAgICAgICBPYmplY3QgYmFzZSA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoIC0gMTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBiYXNlID0gcmVzb2x2ZXIuZ2V0VmFsdWUoY29udGV4dCwgYmFzZSwgZWxlbWVudHNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiYXNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVByb3BlcnR5U3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdOwotICAgICAgICByZXR1cm4gcHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSwgcHJvcGVydHkubGVuZ3RoKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcHJlcGFyZV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Rlc3RVdGlscy5qYXZhIGIvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvVGVzdFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMTdkZTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9wcmVwYXJlX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvVGVzdFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjZXNFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBUZXN0VXRpbHMKLXsKLSAgICAvKiogRGVmYXVsdCBMb2dnZXIgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVGVzdFV0aWxzLmNsYXNzKTsKLQotICAgIC8qKiB1dGlsaXR5IGNsYXNzLCBkbyBub3QgaW5zdGFudGlhdGUgKi8KLSAgICBwcml2YXRlIFRlc3RVdGlscygpCi0gICAgewotICAgICAgICAvLyB1dGlsaXR5IGNsYXNzLCBkaXNhYmxlIGluc3RhbnRpYXRpb24KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZERlZmF1bHRWYWxpZGF0b3JzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpCi0gICAgewotICAgICAgICBhZGRWYWxpZGF0b3IoZmFjZXNDb250ZXh0LCJqYXZheC5mYWNlcy5Eb3VibGVSYW5nZSIsICJqYXZheC5mYWNlcy52YWxpZGF0b3IuRG91YmxlUmFuZ2VWYWxpZGF0b3IiKTsKLSAgICAgICAgYWRkVmFsaWRhdG9yKGZhY2VzQ29udGV4dCwiamF2YXguZmFjZXMuTGVuZ3RoIiwgImphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3IiKTsKLSAgICAgICAgYWRkVmFsaWRhdG9yKGZhY2VzQ29udGV4dCwiamF2YXguZmFjZXMuTG9uZ1JhbmdlIiwgImphdmF4LmZhY2VzLnZhbGlkYXRvci5Mb25nUmFuZ2VWYWxpZGF0b3IiKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFZhbGlkYXRvcihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRvcklkLCBTdHJpbmcgdmFsaWRhdG9yQ2xhc3MpCi0gICAgewotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5hZGRWYWxpZGF0b3IodmFsaWRhdG9ySWQsIHZhbGlkYXRvckNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYWxsIG9mIEpTRiAxLjIgZGVmYXVsdCByZW5kZXJlcnMuICBDdXJyZW50bHkgdGhpcyBpcyBub3QgdGllZCB0byAKLSAgICAgKiBmYWNlcy1jb25maWcueG1sLCBzbyBhbGwgY2hhbmdlIHRvIHRoZSBmaWxlIE1VU1QgYWxzbyBiZSBtYWRlIGhlcmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dAotICAgICAqIEB0b2RvIERvIG5vdCBhZGQgcmVuZGVyZXIgaWYgcmVuZGVyZXIgaXMgYWxyZWFkeSBhZGRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRGVmYXVsdFJlbmRlcmVycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQotICAgIHsKLSAgICAgICAgLy8gU3RhbmRhcmQgSFRNTCBSZW5kZXJlcnMKLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuQ29tbWFuZCIsICJqYXZheC5mYWNlcy5CdXR0b24iLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEJ1dHRvblJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0Qm9vbGVhbiIsCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkNoZWNrYm94IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxDaGVja2JveFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0TWFueSIsCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkNoZWNrYm94IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxDaGVja2JveFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuRm9ybSIsICJqYXZheC5mYWNlcy5Gb3JtIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxGb3JtUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5QYW5lbCIsICJqYXZheC5mYWNlcy5HcmlkIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxHcmlkUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5QYW5lbCIsICJqYXZheC5mYWNlcy5Hcm91cCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sR3JvdXBSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLklucHV0IiwgImphdmF4LmZhY2VzLkhpZGRlbiIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sSGlkZGVuUmVuZGVyZXIiKTsKLSAgICAgICAgCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkdyYXBoaWMiLCAiamF2YXguZmFjZXMuSW1hZ2UiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEltYWdlUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5PdXRwdXQiLCAiamF2YXguZmFjZXMuTGFiZWwiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbExhYmVsUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5PdXRwdXQiLCAiamF2YXguZmFjZXMuTGluayIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlua1JlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuQ29tbWFuZCIsICJqYXZheC5mYWNlcy5MaW5rIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMaW5rUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RPbmUiLAotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5MaXN0Ym94IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMaXN0Ym94UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RNYW55IiwKLSAgICAgICAgICAgICAgICAiamF2YXguZmFjZXMuTGlzdGJveCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlzdGJveFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0T25lIiwgImphdmF4LmZhY2VzLk1lbnUiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lbnVSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE1hbnkiLCAiamF2YXguZmFjZXMuTWVudSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTWVudVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuTWVzc2FnZSIsICJqYXZheC5mYWNlcy5NZXNzYWdlIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxNZXNzYWdlUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5PdXRwdXQiLCAiamF2YXguZmFjZXMuRm9ybWF0IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxGb3JtYXRSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk1lc3NhZ2VzIiwKLSAgICAgICAgICAgICAgICAiamF2YXguZmFjZXMuTWVzc2FnZXMiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lc3NhZ2VzUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RPbmUiLCAiamF2YXguZmFjZXMuUmFkaW8iLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFJhZGlvUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5TZWNyZXQiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFNlY3JldFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuRGF0YSIsICJqYXZheC5mYWNlcy5UYWJsZSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGFibGVSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLklucHV0IiwgImphdmF4LmZhY2VzLlRleHRhcmVhIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxUZXh0YXJlYVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuSW5wdXQiLCAiamF2YXguZmFjZXMuVGV4dCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGV4dFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuT3V0cHV0IiwgImphdmF4LmZhY2VzLlRleHQiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFRleHRSZW5kZXJlciIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIHJlbmRlcmVyIHRvIHRoZSBGYWNlc0NvbnRleHQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBGYWNlcyBDb250ZXh0Ci0gICAgICogQHBhcmFtIGZhbWlseSBDb21wb25lbmV0IEZhbWlseQotICAgICAqIEBwYXJhbSByZW5kZXJlclR5cGUgQ29tcG9uZW50IFR5cGUKLSAgICAgKiBAcGFyYW0gcmVuZGVyQ2xhc3NOYW1lIENsYXNzIE5hbWUgb2YgUmVuZGVyZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkUmVuZGVyZXIoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIGZhbWlseSwKLSAgICAgICAgICAgIFN0cmluZyByZW5kZXJlclR5cGUsIFN0cmluZyByZW5kZXJDbGFzc05hbWUpCi0gICAgewotICAgICAgICBSZW5kZXJlciByZW5kZXJlciA9IChqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXIpIG5ld0luc3RhbmNlKHJlbmRlckNsYXNzTmFtZSk7Ci0gICAgICAgIFJlbmRlcktpdCBraXQgPSBmYWNlc0NvbnRleHQuZ2V0UmVuZGVyS2l0KCk7Ci0gICAgICAgIGtpdC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgcmVuZGVyZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyaWVzIGEgQ2xhc3MubG9hZENsYXNzIHdpdGggdGhlIGNvbnRleHQgY2xhc3MgbG9hZGVyIG9mIHRoZSBjdXJyZW50IHRocmVhZCBmaXJzdCBhbmQKLSAgICAgKiBhdXRvbWF0aWNhbGx5IGZhbGxzIGJhY2sgdG8gdGhlIENsYXNzVXRpbHMgY2xhc3MgbG9hZGVyIChpLmUuIHRoZSBsb2FkZXIgb2YgdGhlCi0gICAgICogbXlmYWNlcy5qYXIgbGliKSBpZiBuZWNlc3NhcnkuCi0gICAgICogCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMKLSAgICAgKgotICAgICAqIEBwYXJhbSB0eXBlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgbm9uLXByaW1pdGl2ZSBub24tYXJyYXkgY2xhc3MKLSAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIENsYXNzCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0eXBlIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBjbGFzc0Zvck5hbWUoU3RyaW5nIHR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidHlwZSIpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVHJ5IFdlYkFwcCBDbGFzc0xvYWRlciBmaXJzdAotICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUodHlwZSwgZmFsc2UsIC8vIGRvIG5vdCBpbml0aWFsaXplIGZvciBmYXN0ZXIgc3RhcnR1cAotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGZhbGxiYWNrOiBUcnkgQ2xhc3NMb2FkZXIgZm9yIENsYXNzVXRpbHMgKGkuZS4gdGhlIG15ZmFjZXMuamFyIGxpYikKLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKHR5cGUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXAKLSAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWxzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2FtZSBhcyB7QGxpbmsgI2NsYXNzRm9yTmFtZShTdHJpbmcpfSwgYnV0IHRocm93cyBhIFJ1bnRpbWVFeGNlcHRpb24KLSAgICAgKiAoRmFjZXNFeGNlcHRpb24pIGluc3RlYWQgb2YgYSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLgotICAgICAqCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgQ2xhc3MKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHR5cGUgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgRmFjZXNFeGNlcHRpb24gaWYgY2xhc3Mgbm90IGZvdW5kCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3Mgc2ltcGxlQ2xhc3NGb3JOYW1lKFN0cmluZyB0eXBlKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjbGFzc0Zvck5hbWUodHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nLmVycm9yKCJDbGFzcyAiICsgdHlwZSArICIgbm90IGZvdW5kIiwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHdpdGggdGhlIHR5cGUgb2YgPGNvZGU+dHlwZTwvY29kZT4uCi0gICAgICogCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMKLSAgICAgKgotICAgICAqIEBwYXJhbSB0eXBlIFR5cGUgb2YgbmV3IGNsYXNzLgotICAgICAqIEByZXR1cm4gSW5zdGFuY2Ugb2YgdGhlIGNsYXNzIDxjb2RlPnR5cGU8L2NvZGU+Ci0gICAgICogQHRocm93cyBGYWNlc0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgdHlwZSkgdGhyb3dzIEZhY2VzRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAodHlwZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBuZXdJbnN0YW5jZShzaW1wbGVDbGFzc0Zvck5hbWUodHlwZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgPGNvZGU+Y2xheno8L2NvZGU+LgotICAgICAqIAotICAgICAqIE5vdGU6IFRoaXMgd2FzIGNvcGllZCBmcm9tIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWQudXRpbC5DbGFzc1V0aWxzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhenogQ2xhc3MgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mLgotICAgICAqIEByZXR1cm4gSW5zdGFuY2Ugb2YgdGhlIGNsYXNzIDxjb2RlPmNsYXp6PC9jb2RlPgotICAgICAqIEB0aHJvd3MgRmFjZXNFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoQ2xhc3MgY2xhenopIHRocm93cyBGYWNlc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjbGF6ei5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIkNsYXNzIDogIiArIGNsYXp6LmdldE5hbWUoKSArICIgbm90IGZvdW5kLiIsIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBGYWNlc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbmRlcmVyZWQgYSBjb21wb25lbnQsIGluY2x1ZGluZyBpdCdzIGNoaWxkcmVuLCB0aGVuIGNvbXBsZXRlIHRoZSByZXBvbnNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZXh0IEZhY2VzIENvbnRleHQKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50IENvbXBvbmVudCB0byBiZSByZW5kZXJlZC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFRocm93biB3aGlsZSByZW5kZXJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbmRlckNvbXBvbmVudChGYWNlc0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgIFVJQ29tcG9uZW50IGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlciByZW5kZXJlciA9IGNvbnRleHQuZ2V0UmVuZGVyS2l0KCkuZ2V0UmVuZGVyZXIoCi0gICAgICAgICAgICAgICAgY29tcG9uZW50LmdldEZhbWlseSgpLCBjb21wb25lbnQuZ2V0UmVuZGVyZXJUeXBlKCkpOwotICAgICAgICByZW5kZXJlci5lbmNvZGVCZWdpbihjb250ZXh0LCBjb21wb25lbnQpOwotICAgICAgICByZW5kZXJlci5lbmNvZGVDaGlsZHJlbihjb250ZXh0LCBjb21wb25lbnQpOwotICAgICAgICByZW5kZXJlci5lbmNvZGVFbmQoY29udGV4dCwgY29tcG9uZW50KTsKLSAgICAgICAgY29udGV4dC5yZXNwb25zZUNvbXBsZXRlKCk7Ci0gICAgICAgIGNvbnRleHQucmVuZGVyUmVzcG9uc2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2Fzc2VtYmx5L3BvbS54bWwgYi9wcmVwYXJlLzFfMl8xX3JjL2Fzc2VtYmx5L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NDY0NzYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9hc3NlbWJseS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1hc3NlbWJseTEyPC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQXNzZW1ibHk8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPk15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQXNzZW1ibHkgaXMgdXNlZCB0byBnZW5lcmF0ZSAKLSAgICAuemlwIGFuZCAudGFyLmd6IGRpc3RyaWJ1dGlvbnMgPC9kZXNjcmlwdGlvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuMTwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8xX3JjYXNzZW1ibHk8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMV9yY2Fzc2VtYmx5PC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMV9yY2Fzc2VtYmx5PC91cmw+Ci0gICAgPC9zY20+Ci0gICAgCi0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZGVwZW5kZW5jeS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1qYXZhZG9jPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y29yZS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+amF2YWRvYzwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2phdmFkb2M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1zb3VyY2U8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjb3JlLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc3JjPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS0gRVhFQ1VURSBtdm4gcGFja2FnZSB0byBnZW5lcmF0ZSBhc3NlbWJseSBmaWxlcyAtLT4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9zcmM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9jb3Jlc3JjLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwxMi0ke3ZlcnNpb259LXNyYzwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L291dDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmF0dGFjaGVkPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9iaW48L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj4ke2Jhc2VkaXJ9L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmViaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5teWZhY2VzLWV4dHZhbDEyLSR7dmVyc2lvbn0tYmluPC9maW5hbE5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXR0YWNoZWQ8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtjb3JlLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8IS0tIFNpbmNlIGV4dHZhbCBjb3VsZCBiZSBhc3luYyByZWxlYXNlZCwgYW4gZ2VuZXJhdGVkIGFzc2VtYmx5IGNvdWxkIGNvbnRhaW4gZGlmZmVyZW50Ci0gICAgICAgICBhcnRpZmFjdCB2ZXJzaW9ucyAtLT4KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGNvcmUudmVyc2lvbj4xLjIuMTwvY29yZS52ZXJzaW9uPgotICAgICAgICA8dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9uPjEuMi4xPC90cmluaWRhZC1zdXBwb3J0LnZlcnNpb24+Ci0gICAgICAgIDxnZW5lcmljLXN1cHBvcnQudmVyc2lvbj4xLjIuMTwvZ2VuZXJpYy1zdXBwb3J0LnZlcnNpb24+Ci0gICAgICAgIDxwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb24+MS4yLjE8L3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmViaW4ueG1sIGIvcHJlcGFyZS8xXzJfMV9yYy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2Nzk1Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmViaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+Y29yZWJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgIAk8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgIAk8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5SRUFETUUqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5MSUNFTlNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+Tk9USUNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+UkVMRUFTRSo8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L2phdmFkb2M8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+amF2YWRvYzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLmphcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWwgYi9wcmVwYXJlLzFfMl8xX3JjL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTE4NmM2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08YXNzZW1ibHk+Ci0gIDxpZD5jb3Jlc3JjPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+ICAKLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgIAk8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgIAk8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5SRUFETUUqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5MSUNFTlNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+Tk9USUNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+UkVMRUFTRSo8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4gICAKLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3NyYzwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5zcmM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+Ci0gCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8yXzFfcmMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDViM2E1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzJfMV9yYy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5YmRiMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcgotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3BvbS54bWwgYi9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjQ5ZGIwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZTwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjIuMTwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMi4xPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jZ2xpYjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNnbGliPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4xXzM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDYzZTYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj4NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5zdGFydHVwLkdlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXINCi0gICAgICAgIDwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyS2l0LmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYjU1OGEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyS2l0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLQ0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kSW50ZXJjZXB0b3I7DQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5FbmhhbmNlcjsNCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZFByb3h5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbEdlbmVyaWNSZW5kZXJLaXQgZXh0ZW5kcyBFeHRWYWxSZW5kZXJLaXQgaW1wbGVtZW50cyBNZXRob2RJbnRlcmNlcHRvcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBSZW5kZXJLaXQgbmV3SW5zdGFuY2UoUmVuZGVyS2l0IHJlbmRlcktpdCkNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gcmVuZGVyS2l0LmdldENsYXNzKCk7DQotDQotICAgICAgICAvL2l0J3Mgbm90IHBvc3NpYmxlIHRvIHdyYXAgdGhlIGNvbnZlcnRlciBhZ2FpbiAtIG9jY3VycyBlLmcuIHVuZGVyIHNvbGFyaXMgKyBiZWEgd2VibG9naWMNCi0gICAgICAgIGlmIChjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCIkJEVuaGFuY2VyQnlDR0xJQiQkIikNCi0gICAgICAgICAgICB8fCBjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCIkJEZhc3RDbGFzc0J5Q0dMSUIkJCIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZW5kZXJLaXQ7DQotICAgICAgICB9DQotDQotICAgICAgICBFbmhhbmNlciBlbmhhbmNlciA9IG5ldyBFbmhhbmNlcigpOw0KLSAgICAgICAgZW5oYW5jZXIuc2V0U3VwZXJjbGFzcyhyZW5kZXJLaXQuZ2V0Q2xhc3MoKSk7DQotICAgICAgICBlbmhhbmNlci5zZXRDYWxsYmFjayhuZXcgRXh0VmFsR2VuZXJpY1JlbmRlcktpdChyZW5kZXJLaXQpKTsNCi0NCi0gICAgICAgIHJldHVybiAoUmVuZGVyS2l0KSBlbmhhbmNlci5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGludGVyY2VwdChPYmplY3Qgb2JqLCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzLCBNZXRob2RQcm94eSBwcm94eSkgdGhyb3dzIFRocm93YWJsZQ0KLSAgICB7DQotICAgICAgICBpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0UmVuZGVyZXIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZXIoKFN0cmluZylhcmdzWzBdLCAoU3RyaW5nKWFyZ3NbMV0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiYWRkUmVuZGVyZXIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRSZW5kZXJlcigoU3RyaW5nKWFyZ3NbMF0sIChTdHJpbmcpYXJnc1sxXSwgKFJlbmRlcmVyKWFyZ3NbMl0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBwcm94eS5pbnZva2VTdXBlcihvYmosIGFyZ3MpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEV4dFZhbEdlbmVyaWNSZW5kZXJLaXQoUmVuZGVyS2l0IHdyYXBwZWQpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKHdyYXBwZWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgY3JlYXRlV3JhcHBlcihSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIubmV3SW5zdGFuY2UocmVuZGVyZXIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUwZDYyMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyV3JhcHBlcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZEludGVyY2VwdG9yOwotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5FbmhhbmNlcjsKLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kUHJveHk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBmaW5hbCBjbGFzcyBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyIGV4dGVuZHMgRXh0VmFsUmVuZGVyZXJXcmFwcGVyIGltcGxlbWVudHMgTWV0aG9kSW50ZXJjZXB0b3IKLXsKLSAgICBwdWJsaWMgc3RhdGljIFJlbmRlcmVyIG5ld0luc3RhbmNlKFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gcmVuZGVyZXIuZ2V0Q2xhc3MoKTsKLQotICAgICAgICAvL3RvIGF2b2lkIHJlLXdyYXBwaW5nIC0gb2NjdXJzIGUuZy4gdW5kZXIgc29sYXJpcyArIGJlYSB3ZWJsb2dpYwotICAgICAgICBpZiAoY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRFbmhhbmNlckJ5Q0dMSUIkJCIpIHx8Ci0gICAgICAgICAgICBjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCIkJEZhc3RDbGFzc0J5Q0dMSUIkJCIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBFbmhhbmNlciBlbmhhbmNlciA9IG5ldyBFbmhhbmNlcigpOwotICAgICAgICBlbmhhbmNlci5zZXRTdXBlcmNsYXNzKHJlbmRlcmVyLmdldENsYXNzKCkpOwotICAgICAgICBlbmhhbmNlci5zZXRDYWxsYmFjayhuZXcgRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlcihyZW5kZXJlcikpOwotCi0gICAgICAgIHJldHVybiAoUmVuZGVyZXIpIGVuaGFuY2VyLmNyZWF0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgaW50ZXJjZXB0KE9iamVjdCBvYmosIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MsIE1ldGhvZFByb3h5IHByb3h5KSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldENvbnZlcnRlZFZhbHVlIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29udmVydGVkVmFsdWUoKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSwgYXJnc1syXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImRlY29kZSIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZGVjb2RlKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJlbmNvZGVCZWdpbiIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlQmVnaW4oKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImVuY29kZUNoaWxkcmVuIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGVDaGlsZHJlbigoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZW5jb2RlRW5kIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGVFbmQoKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImNvbnZlcnRDbGllbnRJZCIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0Q2xpZW50SWQoKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoU3RyaW5nKWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJnZXRSZW5kZXJzQ2hpbGRyZW4iKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJtZXRob2QgIiArIG1ldGhvZC5nZXROYW1lKCkgKyAiIGNhbGxlZCB3aXRob3V0IHJlbmRlcmluZy1pbnRlcmNlcHRvcnMiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHByb3h5Lmludm9rZVN1cGVyKG9iaiwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEV4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIoUmVuZGVyZXIgd3JhcHBlZCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKHdyYXBwZWQpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0dlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDkxN2U2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0dlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkNCi17DQotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImV4dHZhbCByZW5kZXJraXQgd3JhcHBlciBjcmVhdGVkIGZvciAiICsgcmVuZGVyS2l0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB2aWEgY2dsaWIiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBFeHRWYWxHZW5lcmljUmVuZGVyS2l0Lm5ld0luc3RhbmNlKHJlbmRlcktpdCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9zdGFydHVwL0dlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YzdiNDEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9zdGFydHVwL0dlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0LkdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEdlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKS5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5SRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmNsYXNzKS5hZGRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeShuZXcgR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU5YThlOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZSBwcm92aWRlcyBnZW5lcmljIFN1cHBvcnQgZm9yIEpTRiBjb21wb25lbnQgZnJhbWV3b3JrcyB3aGljaCBoYXZlIHNwZWNpYWwgcmVxdWlyZW1lbnRzIChlLmcuIFJpY2hGYWNlcywgTXlGYWNlcyBUb2JhZ28sIC4uLikuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLjEueCBhbmQgSlNGIDEuMi54LiBCb3RoIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC9wb20ueG1sIGIvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTcyYmMyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIENvbXBvbmVudC1TdXBwb3J0IE1vZHVsZXM8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4yLjE8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjE8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMV9yY2NvbXBvbmVudC1zdXBwb3J0PC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzFfcmNjb21wb25lbnQtc3VwcG9ydDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzFfcmNjb21wb25lbnQtc3VwcG9ydDwvdXJsPgotICAgIDwvc2NtPgotCi0gICAgPG1vZHVsZXM+Ci0gICAgICAgIDxtb2R1bGU+dHJpbmlkYWQtc3VwcG9ydDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmdlbmVyaWMtc3VwcG9ydDwvbW9kdWxlPgotICAgIDwvbW9kdWxlcz4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPHRyaW5pZGFkLnZlcnNpb24+MS4yLjk8L3RyaW5pZGFkLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9wb20ueG1sIGIvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMWQ5YzUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlPC9uYW1lPgotICAgIDx2ZXJzaW9uPjEuMi4xPC92ZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjE8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOThiMmJiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiDQotICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjIiPg0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPg0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdGFydHVwLlRyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyDQotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi0NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj4NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcg0KLSAgICAgICAgPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGJjMTk0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQuRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSB0aGlzIHBoYXNlLWxpc3RlbmVyIGluc3RlYWQgb2YgYSBFeHRWYWxUcmluaWRhZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGR1ZSB0byBhIHRyaW5pZGFkIGlzc3VlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICAgICAgaWYoZXZlbnQuZ2V0UGhhc2VJZCgpICE9IFBoYXNlSWQuQVBQTFlfUkVRVUVTVF9WQUxVRVMgJiYgZXZlbnQuZ2V0UGhhc2VJZCgpICE9IFBoYXNlSWQuUkVOREVSX1JFU1BPTlNFKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnkgPSAoUmVuZGVyS2l0RmFjdG9yeSkNCi0gICAgICAgICAgICBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRmFjdG9yeUZpbmRlci5SRU5ERVJfS0lUX0ZBQ1RPUlkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlbmRlcktpdElkID0gZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZ2V0UmVuZGVyS2l0SWQoKTsNCi0NCi0gICAgICAgIGlmKEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LklELmVxdWFscyhyZW5kZXJLaXRJZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUmVuZGVyS2l0IHJlbmRlcktpdCA9IHJlbmRlcktpdEZhY3RvcnkuZ2V0UmVuZGVyS2l0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgcmVuZGVyS2l0SWQpOw0KLSAgICAgICAgcmVuZGVyS2l0RmFjdG9yeS5hZGRSZW5kZXJLaXQoRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuSUQsIG5ldyBFeHRWYWxUcmluaWRhZFJlbmRlcktpdChyZW5kZXJLaXQpKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLnNldFJlbmRlcktpdElkKEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LklEKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuUkVOREVSX1JFU1BPTlNFOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc4YTFlMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcmVuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgLyoNCi0gICAgICogZGVhY3RpdmF0ZQ0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0NMSUVOVF9TSURFX1RSSU5JREFEX1ZBTElEQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfQ0xJRU5UX1NJREVfVFJJTklEQURfVkFMSURBVElPTiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfVFJJTklEQURfVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfVFJJTklEQURfVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IiKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0RvdWJsZVJhbmdlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM3OGE3MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0RvdWJsZVJhbmdlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuRG91YmxlUmFuZ2VWYWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRG91YmxlUmFuZ2VJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7Ci0gICAgICAgIERvdWJsZVJhbmdlVmFsaWRhdG9yIGxlbmd0aFZhbGlkYXRvciA9IChEb3VibGVSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRG91YmxlUmFuZ2UiKTsKLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKTsKLQotICAgICAgICAgICAgaWYobWluIGluc3RhbmNlb2YgRG91YmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNaW5pbXVtKChEb3VibGUpbWluKTsKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpOwotCi0gICAgICAgICAgICBpZihtYXhMZW5ndGggaW5zdGFuY2VvZiBEb3VibGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1heGltdW0oKERvdWJsZSltYXhMZW5ndGgpOwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKGluZm9ybWF0aW9uQWRkZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKGxlbmd0aFZhbGlkYXRvcik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYxOTFmOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xlbmd0aEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkxlbmd0aFZhbGlkYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJza2lwVmFsaWRhdGlvblN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24iKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBMZW5ndGhJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7Ci0gICAgICAgIC8vVE9ETwotICAgICAgICBMZW5ndGhWYWxpZGF0b3IgbGVuZ3RoVmFsaWRhdG9yID0gKExlbmd0aFZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTGVuZ3RoIik7Ci0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbWluID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIKTsKLQotICAgICAgICAgICAgaWYobWluIGluc3RhbmNlb2YgSW50ZWdlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWluaW11bSgoSW50ZWdlciltaW4pOwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKTsKLQotICAgICAgICAgICAgaWYobWF4TGVuZ3RoIGluc3RhbmNlb2YgSW50ZWdlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudC5nZXRDbGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldE1heGltdW1MZW5ndGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LmNsYXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhMZW5ndGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWF4aW11bSgoSW50ZWdlciltYXhMZW5ndGgpOwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9yZUluaXRWYWxpZGF0b3JzKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50LCBtZXRhRGF0YSk7IC8vc2VhcmNoIHdyYXBwZXJzIGFuZCBjYWxsIC5kZWFjdGl2YXRlCi0KLSAgICAgICAgaWYoaW5mb3JtYXRpb25BZGRlZCkKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IobGVuZ3RoVmFsaWRhdG9yKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xvbmdSYW5nZUluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xvbmdSYW5nZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZDM3YTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Mb25nUmFuZ2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5Mb25nUmFuZ2VWYWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgTG9uZ1JhbmdlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW5mb3JtYXRpb25BZGRlZCA9IGZhbHNlOwotICAgICAgICBMb25nUmFuZ2VWYWxpZGF0b3IgbGVuZ3RoVmFsaWRhdG9yID0gKExvbmdSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTG9uZ1JhbmdlIik7Ci0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTik7Ci0KLSAgICAgICAgICAgIGlmKG1pbiBpbnN0YW5jZW9mIExvbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1pbmltdW0oKExvbmcpbWluKTsKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpOwotCi0gICAgICAgICAgICBpZihtYXhMZW5ndGggaW5zdGFuY2VvZiBMb25nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNYXhpbXVtKChMb25nKW1heExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYoaW5mb3JtYXRpb25BZGRlZCkKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IobGVuZ3RoVmFsaWRhdG9yKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9QYXR0ZXJuSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNjY4NmQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9QYXR0ZXJuSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuUmVnRXhwVmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFBhdHRlcm5Jbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYoIW1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gcGF0dGVybnMgPSAoU3RyaW5nW10pbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOKTsKLQotICAgICAgICBSZWdFeHBWYWxpZGF0b3IgcmVnRXhwVmFsaWRhdG9yOwotCi0gICAgICAgIGZvcihTdHJpbmcgcGF0dGVybiA6IHBhdHRlcm5zKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWdFeHBWYWxpZGF0b3IgPSAoUmVnRXhwVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuUmVnRXhwIik7Ci0KLSAgICAgICAgICAgIHJlZ0V4cFZhbGlkYXRvci5zZXRQYXR0ZXJuKHBhdHRlcm4pOwotICAgICAgICAgICAgcmVnRXhwVmFsaWRhdG9yLnNldE1lc3NhZ2VEZXRhaWxOb01hdGNoKChTdHJpbmcpbWV0YURhdGEuZ2V0KAotICAgICAgICAgICAgICAgIENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRSkpOwotCi0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcihyZWdFeHBWYWxpZGF0b3IpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1JlcXVpcmVkSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUmVxdWlyZWRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDhmZTExLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUmVxdWlyZWRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFJlcXVpcmVkSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkgfHwKLSAgICAgICAgICAgbWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQpfHwKLSAgICAgICAgICAgbWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKChCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCkpIHx8Ci0gICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhpc0NvbXBvbmVudFJlcXVpcmVkKHVpQ29tcG9uZW50KSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpICYmCi0gICAgICAgICAgICAgICAgICAgIUJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQm9vbGVhbiBpc0NvbXBvbmVudFJlcXVpcmVkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgLy9jb21wYXJlIHdpdGggZmFsc2Ugc28gdHJ1ZSA9IHRydWUgb3IgbnVsbAotICAgICAgICBib29sZWFuIGlzUmVhZE9ubHkgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzUmVhZE9ubHkiKSkpOwotICAgICAgICBib29sZWFuIGlzRGlzYWJsZWQgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzRGlzYWJsZWQiKSkpOwotCi0gICAgICAgIHJldHVybiAhKGlzUmVhZE9ubHkgfHwgaXNEaXNhYmxlZCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MzEwOGMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29udGV4dC5SZXF1ZXN0Q29udGV4dDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9URVhUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXRUZXh0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXREYXRlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8VHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcj4gY29tcG9uZW50SW5pdGlhbGl6ZXJzID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyPigpOwotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBSZXF1aXJlZEluaXRpYWxpemVyKCkpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBMZW5ndGhJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgTG9uZ1JhbmdlSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IERvdWJsZVJhbmdlSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFBhdHRlcm5Jbml0aWFsaXplcigpKTsKLSAgICAgICAgLy9jb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBWYWxpZGF0b3JJbml0aWFsaXplcigpKTsKLSAgICB9Ci0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkxPVywgZGVzY3JpcHRpb24gPSAiY2hlY2sgcHByIGlzc3VlIikKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBmb3IoVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplciA6IGNvbXBvbmVudEluaXRpYWxpemVycykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoY29tcG9uZW50SW5pdGlhbGl6ZXIuY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVwZGF0ZUNvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKSB8fAotICAgICAgICAgICAgICAgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFLmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmKFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmlzUGFydGlhbFJlcXVlc3QoZmFjZXNDb250ZXh0KSkKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuYWRkUGFydGlhbFRhcmdldCh1aUNvbXBvbmVudC5nZXRQYXJlbnQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGJjZDBjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVmFsaWRhdG9ySW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHZhbHVlID0gVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTE9XLCBkZXNjcmlwdGlvbiA9ICJpbXBsLiB0cmluaWRhZCBlLW1haWwgdmFsaWRhdG9yIikKLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JJbml0aWFsaXplciBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgcHVibGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYoIW1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00pKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgdmFsdWUgPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLkNVU1RPTSk7Ci0KLSAgICAgICAgaWYoISh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IoT2JqZWN0IGN1cnJlbnRWYWx1ZSA6IChMaXN0KXZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZighKGN1cnJlbnRWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKENvbW1vbk1ldGFEYXRhS2V5cy5FTUFJTC5lcXVhbHMoY3VycmVudFZhbHVlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL1RPRE8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjIxMjhkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXRUZXh0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dERhdGUiOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKTsNCi0NCi0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBnZXRMYWJlbCh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICAgICAgaWYobGFiZWwgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxhYmVsID0gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy9vdmVycmlkZSB0aGUgbGFiZWwgaWYgdGhlIGFubm90YXRpb24gcHJvdmlkZXMgYSBsYWJlbA0KLSAgICAgICAgICAgIGlmKG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsYWJlbCA9IG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwsIFN0cmluZy5jbGFzcyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwoZmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVC5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpIHx8DQotICAgICAgICAgICAgICAgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFLmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGFiZWwoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoU3RyaW5nKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCh1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJnZXRMYWJlbCIpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYjQ1ZTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcktpdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuUmVuZGVyS2l0RGVjb3JhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuY29yZS5Db3JlUmVuZGVyS2l0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZXNwb25zZVN0YXRlTWFuYWdlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVdyaXRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5Xcml0ZXI7DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0IGV4dGVuZHMgUmVuZGVyS2l0RGVjb3JhdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgRXh0VmFsUmVuZGVyS2l0IGV4dFZhbFJlbmRlcktpdDsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiRVhUVkFMX1RSSU5JREFEX1JFTkRFUktJVCI7DQotDQotICAgIHB1YmxpYyBFeHRWYWxUcmluaWRhZFJlbmRlcktpdChSZW5kZXJLaXQgd3JhcHBlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5leHRWYWxSZW5kZXJLaXQgPSBuZXcgRXh0VmFsUmVuZGVyS2l0KHdyYXBwZWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlLCBSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5leHRWYWxSZW5kZXJLaXQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIHJlbmRlcmVyKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFJlbmRlcmVyIGdldFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5nZXRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBSZXNwb25zZVN0YXRlTWFuYWdlciBnZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5nZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUmVzcG9uc2VXcml0ZXIgY3JlYXRlUmVzcG9uc2VXcml0ZXIoV3JpdGVyIHdyaXRlciwgU3RyaW5nIHMsIFN0cmluZyBzMSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmNyZWF0ZVJlc3BvbnNlV3JpdGVyKHdyaXRlciwgcywgczEpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdHJlYW0gY3JlYXRlUmVzcG9uc2VTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmNyZWF0ZVJlc3BvbnNlU3RyZWFtKG91dHB1dFN0cmVhbSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZWNvcmF0ZWRSZW5kZXJLaXRJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBDb3JlUmVuZGVyS2l0LkJBU0VfUkVOREVSX0tJVF9JRDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYyNzAxZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnJlbmRlcmtpdC5jb3JlLnhodG1sLnRhYmxlLlRhYmxlUmVuZGVyaW5nQ29udGV4dDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIHNvbHV0aW9uIGZvciB0cmluaWRhZCB0YWJsZSByZW5kZXJlciBpc3N1ZSAoaW4gY29ubmVjdGlvbiB3aXRoIGRvdWJsZSBjYWxsIHByZXZlbnRpb24gcHJveGllcykNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1wdWJsaWMgY2xhc3MgRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5IGV4dGVuZHMgRXh0VmFsUmVuZGVyZXJQcm94eQ0KLXsNCi0gICAgcHVibGljIEV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgc3VwZXIocmVuZGVyZXIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wdGlvbmFsS2V5KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZihUYWJsZVJlbmRlcmluZ0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gInwiICsgVGFibGVSZW5kZXJpbmdDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFJlbmRlclN0YWdlKCkuZ2V0U3RhZ2UoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAiIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ2MWY0Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQuVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdC5FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvci5UcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGFsdGVybmF0aXZlIGFwcHJvYWNoIGZvciBFeHRWYWxSZW5kZXJLaXRGYWN0b3J5DQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gIndlYi54bWwgcGFyYW1ldGVyIHRvIGRlYWN0aXZhdGUgaXQiKQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgaW5pdFRyaW5pZGFkU3VwcG9ydCgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0VHJpbmlkYWRTdXBwb3J0KCkNCi0gICAgew0KLSAgICAgICAgLy9kZWFjdGl2YXRlIGRlZmF1bHQgYXBwcm9hY2gNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5SRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZLCBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmNsYXNzKS5kZWFjdGl2YXRlKCk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBkZWFjdGl2YXRlQ2xpZW50U2lkZVZhbGlkYXRpb24gPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DTElFTlRfU0lERV9UUklOSURBRF9WQUxJREFUSU9OOw0KLQ0KLSAgICAgICAgaWYoZGVhY3RpdmF0ZUNsaWVudFNpZGVWYWxpZGF0aW9uID09IG51bGwgfHwgIWRlYWN0aXZhdGVDbGllbnRTaWRlVmFsaWRhdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgZGVhY3RpdmF0ZVRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yID0NCi0gICAgICAgICAgICAgICAgV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfVFJJTklEQURfVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1I7DQotDQotICAgICAgICBpZihkZWFjdGl2YXRlVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgPT0gbnVsbCB8fA0KLSAgICAgICAgICAgICAgICAhZGVhY3RpdmF0ZVRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IobmV3IFRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9kZWFjdGl2YXRlIGV4dHZhbCByZW5kZXJlciBwcm94eSAtIGR1ZSB0byBhbiBpbmNvbXBhdGliaWxpdHkgd2l0aCB0aGUgdGFibGUgcmVuZGVyZXINCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSwgRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICAvKg0KLSAgICAgICAgICogaWYgdGhlcmUgYXJlIGZ1cnRoZXIgaW5jb21wYXRpYmxlIHJlbmRlcmVycyB1c2UgdGhlIGZvbGxvd2luZyBxdWljay1maXg6DQotICAgICAgICAgKiAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSwgbnVsbCk7DQotICAgICAgICAgICBhdHRlbnRpb246IGl0IGNhdXNlcyBkaXJlY3QgZGVsZWdhdGlvbiB3aXRob3V0IGEgY2hlY2sgb2YgZG91YmxlIGludm9jYXRpb25zDQotICAgICAgICAgKi8NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0YmE4YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlIHByb3ZpZGVzIHNwZWNpYWwgVHJpbmlkYWQgU3VwcG9ydCBmb3IgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvci4NCi0gICAgRnVydGhlcm1vcmUsIGl0IGFsbG93cyB0byBqb2luIHRoZSBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIG1lY2hhbmlzbSBvZiBUcmluaWRhZC4gU2FtcGxlIHVzZS1jYXNlOiBhbm5vdGF0ZSB5b3VyIG1vZGVsIHdpdGggSlBBIDEuMCBhbm5vdGF0aW9ucywgYmluZCBwcm9wZXJ0aWVzIHRvIEpTRiBJbnB1dCBjb21wb25lbnRzIGFuZCBnZXQgYXV0b21hdGljIGNsaWVudC1zaWRlIHZhbGlkYXRpb24ganVzdCBieSBhZGRpbmcgMyBKQVIgZmlsZXMgKE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSwgUHJvcGVydHkgVmFsaWRhdGlvbiBhbmQgVHJpbmlkYWQgU3VwcG9ydCkuDQotICANCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEuMS54IGFuZCBKU0YgMS4yLnguIEJvdGggdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9wb20ueG1sIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYzNhMjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjE8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIENvcmU8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4yLjE8L3ZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8xX3JjY29yZTwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8xX3JjY29yZTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzFfcmNjb3JlPC91cmw+Ci0gICAgPC9zY20+Ci0gICAgCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDRkYzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotICAgIDxmYWN0b3J5Pg0KLSAgICAgICAgPHJlbmRlci1raXQtZmFjdG9yeT5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyS2l0RmFjdG9yeTwvcmVuZGVyLWtpdC1mYWN0b3J5Pg0KLSAgICA8L2ZhY3Rvcnk+DQotDQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5FeHRWYWxTdGFydHVwTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0V4dFZhbEluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4MjEwMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGRvbnQndCBtb3ZlIHRvIGFuIG90aGVyIHBhY2thZ2UhISENCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBFeHRWYWxJbmZvcm1hdGlvbg0KLXsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSA9IEV4dFZhbEluZm9ybWF0aW9uLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCWE1MX1BBUkFNX1BSRUZJWCA9IEV4dFZhbEluZm9ybWF0aW9uLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICIxLjIuMSI7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0N1c3RvbUluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9DdXN0b21JbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzI4ODFjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0N1c3RvbUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSX0pDQotcHVibGljIGVudW0gQ3VzdG9tSW5mb3JtYXRpb24NCi17DQotICAgIEJBU0VfUEFDS0FHRSwNCi0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IsDQotDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCwNCi0gICAgVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFX1JFU09MVkVSX1BPU1RGSVgsDQotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYLA0KLQ0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01TR19SRVNPTFZFUl9OQU1FX01BUFBFUiwNCi0gICAgTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIsDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSLA0KLQ0KLSAgICBTVEFSVFVQX0xJU1RFTkVSLA0KLSAgICBDT01QT05FTlRfSU5JVElBTElaRVIsDQotICAgIFZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SLA0KLQ0KLSAgICBNRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwNCi0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwNCi0gICAgTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksDQotDQotICAgIE1FU1NBR0VfQlVORExFX05BTUUsDQotICAgIFNUQVRJQ19TVFJBVEVHWV9NQVBQSU5HX1NPVVJDRQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NmM0NjcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlci5Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeUZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkRlZmF1bHRGYWN0b3J5RmluZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgRXh0VmFsQ29udGV4dAotewotICAgIHByaXZhdGUgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRXh0VmFsQ29udGV4dCBleHRWYWxDb250ZXh0ID0gbmV3IEV4dFZhbENvbnRleHQoKTsKLQotICAgIHByaXZhdGUgRmFjdG9yeUZpbmRlciBmYWN0b3J5RmluZGVyID0gbmV3IERlZmF1bHRGYWN0b3J5RmluZGVyKCk7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZW5kZXJlckludGVyY2VwdG9yPiByZW5kZXJlckludGVyY2VwdG9ycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUmVuZGVyZXJJbnRlcmNlcHRvcj4oKTsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBkZW5pZWRJbnRlcmNlcHRvcnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICBwcml2YXRlIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcj4gcHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMgPQotICAgICAgICBuZXcgQXJyYXlMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI+KCk7Ci0KLSAgICBwcml2YXRlIExpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+IGNvbXBvbmVudEluaXRpYWxpemVyczsKLSAgICBwcml2YXRlIExpc3Q8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPiB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGdsb2JhbFByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgIHByaXZhdGUgTWFwPFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcywgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4+IHN0YXRpY0NvbmZpZ01hcAotICAgICAgICA9IG5ldyBIYXNoTWFwPFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcywgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4+KCk7Ci0KLQotICAgIHByaXZhdGUgdm9pZCBsYXp5SW5pdENvbXBvbmVudEluaXRpYWxpemVycygpCi0gICAgewotICAgICAgICBpZih0aGlzLmNvbXBvbmVudEluaXRpYWxpemVycyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmNvbXBvbmVudEluaXRpYWxpemVycyA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+KCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzCi0gICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9JTklUSUFMSVpFUikpOwotCi0gICAgICAgIENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyOwotICAgICAgICBmb3IgKFN0cmluZyBjb21wb25lbnRJbml0aWFsaXplck5hbWUgOiBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyID0KLSAgICAgICAgICAgICAgICAoQ29tcG9uZW50SW5pdGlhbGl6ZXIpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjb21wb25lbnRJbml0aWFsaXplck5hbWUpOwotCi0gICAgICAgICAgICBpZiAoY29tcG9uZW50SW5pdGlhbGl6ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKGNvbXBvbmVudEluaXRpYWxpemVyKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGNvbXBvbmVudEluaXRpYWxpemVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsYXp5SW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgaWYodGhpcy52YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMudmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycyA9IG5ldyBBcnJheUxpc3Q8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPigpOwotICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMKLSAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUik7Ci0gICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMKLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoCi0gICAgICAgICAgICAgICAgICAgIEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SKSk7Ci0KLSAgICAgICAgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsKLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSA6IHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA9Ci0gICAgICAgICAgICAgICAgKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lKTsKLQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMuYWRkKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcik7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFeHRWYWxDb250ZXh0IGdldENvbnRleHQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGV4dFZhbENvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIEZhY3RvcnlGaW5kZXIgZ2V0RmFjdG9yeUZpbmRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gZmFjdG9yeUZpbmRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGYWN0b3J5RmluZGVyKEZhY3RvcnlGaW5kZXIgZmFjdG9yeUZpbmRlcikKLSAgICB7Ci0gICAgICAgIGlmKGZhY3RvcnlGaW5kZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5mYWN0b3J5RmluZGVyID0gZmFjdG9yeUZpbmRlcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFJlbmRlcmVySW50ZXJjZXB0b3I+IGdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFJlbmRlcmVySW50ZXJjZXB0b3I+KHJlbmRlcmVySW50ZXJjZXB0b3JzLnZhbHVlcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChFeHRWYWxDb250ZXh0LmNsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVuaWVkSW50ZXJjZXB0b3JzLmNvbnRhaW5zKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3JzLnB1dChyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSwgcmVuZGVyZXJJbnRlcmNlcHRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVyZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IoQ2xhc3MgcmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yID0KLSAgICAgICAgICAgIChSZW5kZXJlckludGVyY2VwdG9yKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzcyhyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoRXh0VmFsQ29udGV4dC5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvcnMucmVtb3ZlKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vaWYgYW4gaW50ZXJjZXB0b3IgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZCBzbyBmYXIsIGl0IHNob3VsZCBiZSBkZW5pZWQgYXQgZnV0dXJlIHJlZ2lzdHJhdGlvbnMKLSAgICBwdWJsaWMgdm9pZCBkZW55UmVuZGVyZXJJbnRlcmNlcHRvcihDbGFzcyByZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpCi0gICAgewotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgPQotICAgICAgICAgICAgKFJlbmRlcmVySW50ZXJjZXB0b3IpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcyk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChFeHRWYWxDb250ZXh0LmNsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZW5pZWRJbnRlcmNlcHRvcnMuYWRkKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKTsKLSAgICAgICAgfQotICAgICAgICBkZXJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvbXBvbmVudEluaXRpYWxpemVyKENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyKQotICAgIHsKLSAgICAgICAgbGF6eUluaXRDb21wb25lbnRJbml0aWFsaXplcnMoKTsKLSAgICAgICAgdGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMuYWRkKGNvbXBvbmVudEluaXRpYWxpemVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4gZ2V0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCkKLSAgICB7Ci0gICAgICAgIGxhenlJbml0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7Ci0gICAgICAgIHJldHVybiBjb21wb25lbnRJbml0aWFsaXplcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBsYXp5SW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgdGhpcy52YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzLmFkZCh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4gZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBsYXp5SW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcj4gZ2V0UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciBwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycy5hZGQocHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICB7Ci0gICAgICAgIE1hcCBhcHBsaWNhdGlvbk1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbk1hcCgpOwotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBiZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBhcHBsaWNhdGlvbk1hcC5nZXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FKTsKLQotICAgICAgICBpZiAoYmVhbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW5pdEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKGFwcGxpY2F0aW9uTWFwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmVhbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGluaXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbihNYXAgYXBwbGljYXRpb25NYXApCi0gICAgewotICAgICAgICBMaXN0PFN0cmluZz4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4pOwotICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMuYWRkKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkNVU1RPTV9CRUFOKTsKLQotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbjsKLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChpbmZvcm1hdGlvblByb3ZpZGVyQmVhbiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uTWFwLnB1dChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUsIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnlUb0luaXRDdXN0b21Db25maWd1cmVkSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWUoYXBwbGljYXRpb25NYXApOwotCi0gICAgICAgIGlmKGFwcGxpY2F0aW9uTWFwLmNvbnRhaW5zS2V5KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4pYXBwbGljYXRpb25NYXAuZ2V0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0luaXRDdXN0b21Db25maWd1cmVkSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWUoTWFwIGFwcGxpY2F0aW9uTWFwKQotICAgIHsKLSAgICAgICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gYmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKQotICAgICAgICAgICAgLmdldEJlYW4oSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQ1VTVE9NX0JFQU4ucmVwbGFjZSgiLiIsICJfIikpOwotCi0gICAgICAgIGlmKGJlYW4gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYXBwbGljYXRpb25NYXAucHV0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSwgYmVhbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gZ2V0U3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmKCF0aGlzLnN0YXRpY0NvbmZpZ01hcC5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gc3RhdGljQ29uZmlnTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgICAgICB0aGlzLnN0YXRpY0NvbmZpZ01hcC5wdXQobmFtZSwgc3RhdGljQ29uZmlnTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGljQ29uZmlnTWFwLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcyBuYW1lLCBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IHN0YXRpY0NvbmZpZ0xpc3Q7Ci0gICAgICAgICAgICBpZighdGhpcy5zdGF0aWNDb25maWdNYXAuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5zdGF0aWNDb25maWdNYXAucHV0KG5hbWUsIHN0YXRpY0NvbmZpZ0xpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5zdGF0aWNDb25maWdNYXAuZ2V0KG5hbWUpLmFkZChzdGF0aWNDb25maWcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYWRkR2xvYmFsUHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhZGRHbG9iYWxQcm9wZXJ0eShuYW1lICwgdmFsdWUsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gZm9yY2VPdmVycmlkZSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMuZ2xvYmFsUHJvcGVydGllcy5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIWZvcmNlT3ZlcnJpZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJvdmVycmlkZSBnbG9iYWwgcHJvcGVydHkgJyIgKyBuYW1lICsgIiciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmdsb2JhbFByb3BlcnRpZXMucHV0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRHbG9iYWxQcm9wZXJ0eShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmdsb2JhbFByb3BlcnRpZXMuZ2V0KG5hbWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmMzMTE2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJlbid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKiArIHNvbWUgb2YgdGhlbSBjYW4gYmUgY3VzdG9taXplZCB3aXRoaW4gYSBjdXN0b20gaW1wbC4gb2YgdGhlIGJlYW4NCi0gKiAoZXh0ZW5kIHRoaXMgY2xhc3MgYW5kIHByb3ZpZGUgaXQgdmlhIGNvbnZlbnRpb24gb3Igd2ViLnhtbCkNCi0gKiA8cC8+DQotICogdGhlIHN0YXRpYyBhcGkgc2hvdWxkIG9ubHkgYmUgdXNlZA0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUFOX05BTUUgPSBFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRQ0KLSAgICAgICAgKyAiLiIgKyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7DQotICAgIC8vY3VzdG9tIGNsYXNzIHdoaWNoIGlzIGFuIG9wdGlvbmFsIHJlcGxhY2VtZW50IGZvciB0aGlzIGNsYXNzIChoYXMgdG8gZXh0ZW5kIHRoaXMgY2xhc3MpDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CRUFOID0gKEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FDQotICAgICAgICArICIuY3VzdG9tLiIgKyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOw0KLQ0KLSAgICBwdWJsaWMgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc2V0dXBDdXN0b21pemFibGVJbmZvcm1hdGlvbigpOw0KLSAgICAgICAgYXBwbHlDdXN0b21WYWx1ZXModGhpcy5jdXN0b21pemFibGVJbmZvcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8Q3VzdG9tSW5mb3JtYXRpb24sIFN0cmluZz4gY3VzdG9taXphYmxlSW5mb3MgPSBuZXcgSGFzaE1hcDxDdXN0b21JbmZvcm1hdGlvbiwgU3RyaW5nPigpOw0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBDdXN0b21pemFibGVJbmZvcm1hdGlvbigpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBiYXNlUGFja2FnZSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fQkFTRV9QQUNLQUdFOw0KLQ0KLSAgICAgICAgaWYgKGJhc2VQYWNrYWdlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZVBhY2thZ2UgPSBFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSArICIuY3VzdG9tLiI7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWJhc2VQYWNrYWdlLmVuZHNXaXRoKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZVBhY2thZ2UgPSBiYXNlUGFja2FnZSArICIuIjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5CQVNFX1BBQ0tBR0UsIGJhc2VQYWNrYWdlKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiwNCi0gICAgICAgICAgICAgICAgIkNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVgsDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVRyYW5zZm9ybWVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFX1JFU09MVkVSX1BPU1RGSVgsDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfSU5JVElBTElaRVIsDQotICAgICAgICAgICAgICAgICJDb21wb25lbnRJbml0aWFsaXplciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NU0dfUkVTT0xWRVJfTkFNRV9NQVBQRVIsDQotICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIsDQotICAgICAgICAgICAgIk1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIsDQotICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5TVEFSVFVQX0xJU1RFTkVSLA0KLSAgICAgICAgICAgICAgICAiU3RhcnR1cExpc3RlbmVyIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiTWVzc2FnZVJlc29sdmVyRmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSIpOw0KLQ0KLSAgICAgICAgLy9jb252ZW50aW9ucyAodGhlIHJlc3Qgb2YgdGhlIGNvbnZlbnRpb25zIGFyZSBidWlsdCB3aXRoIHRoZSBoZWxwIG9mIG5hbWUgbWFwcGVycywuLi4NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX0JVTkRMRV9OQU1FLA0KLSAgICAgICAgICAgICAgICAidmFsaWRhdGlvbl9tZXNzYWdlcyIpOw0KLSAgICAgICAgLy9zdGF0aWMgc3RyYXRlZ3kgbWFwcGluZ3MgKG5hbWUgb2YgcHJvcGVydHkgZmlsZXMpDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFLA0KLSAgICAgICAgICAgICAgICAic3RyYXRlZ3lfbWFwcGluZ3MiKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcHBseUN1c3RvbVZhbHVlcyhNYXA8Q3VzdG9tSW5mb3JtYXRpb24sIFN0cmluZz4gbWFwKQ0KLSAgICB7DQotICAgICAgICAvL292ZXJyaWRlIHRvIGN1c3RvbWl6ZSBpbmZvcm1hdGlvbg0KLSAgICB9DQotDQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0KEN1c3RvbUluZm9ybWF0aW9uIGN1c3RvbUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBjdXN0b21pemFibGVJbmZvcy5nZXQoY3VzdG9tSW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgc3dpdGNoIChjdXN0b21JbmZvcm1hdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjYXNlIEJBU0VfUEFDS0FHRToNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICogcG9zdGZpeCB1c2VkIGJ5IHRoZSBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgICAgICAgICAgICogdGhlIFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgaXMgZm9yIGN1c3RvbSBzdHJhdGVnaWVzIG9ubHkNCi0gICAgICAgICAgICAgKiAobm90IGZvciBwdWJsaWMgdmFsaWRhdGlvbiBtb2R1bGVzKQ0KLSAgICAgICAgICAgICAqIHNvIGl0J3MgZmluZSB0byBjdXN0b21pemUgaXQNCi0gICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICBjYXNlIFZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFX1JFU09MVkVSX1BPU1RGSVg6DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbWl6YWJsZUluZm9zLmdldChDdXN0b21JbmZvcm1hdGlvbi5CQVNFX1BBQ0tBR0UpICsgdmFsdWU7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOWY4NjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TW9kdWxlTWVzc2FnZUJ1bmRsZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbmV3UGFja2FnZU5hbWU7DQotICAgICAgICBpZiAocGFja2FnZU5hbWUuZW5kc1dpdGgoIi5yZXNvbHZlciIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5ld1BhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUucmVwbGFjZSgiLnJlc29sdmVyIiwgIi5idW5kbGUiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBuZXdQYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lLnJlcGxhY2UoIi5yZXNvbHZlci4iLCAiLmJ1bmRsZS4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXdQYWNrYWdlTmFtZSArICIudmFsaWRhdGlvbl9tZXNzYWdlcyI7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHVzZSBhIGN1c3RvbSBuYW1lIG1hcHBlciB0byBpbXBsZW1lbnQgY3VzdG9tIGNvbnZlbnRpb25zDQotICAgICAqLw0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VSZXNvbHZlckNsYXNzTmFtZSgNCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLCBTdHJpbmcgdGFyZ2V0Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLCAiLm1lc3NhZ2UucmVzb2x2ZXIuIiwgdGFyZ2V0Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKA0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsICIubWV0YWRhdGEudHJhbnNmb3JtZXIuIiwgdGFyZ2V0Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldFBhY2thZ2VOYW1lLCBTdHJpbmcgdGFyZ2V0Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0TmFtZSgpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLnJlcGxhY2UoIi5zdHJhdGVneS4iLCB0YXJnZXRQYWNrYWdlTmFtZSk7DQotDQotICAgICAgICBpZiAodGFyZ2V0Q2xhc3NOYW1lID09IG51bGwgfHwgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgPT0gLTEpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lDQotICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikpICsgIi4iICsgdGFyZ2V0Q2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB1c2UgYSBjdXN0b20gbmFtZSBtYXBwZXIgdG8gaW1wbGVtZW50IGN1c3RvbSBjb252ZW50aW9ucw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneU5hbWUsICJWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIiKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUtleS5yZXBsYWNlKCIuYW5ub3RhdGlvbi4iLCAiLnN0cmF0ZWd5LiIpICsgIlN0cmF0ZWd5IjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneU5hbWUsICJNZXRhRGF0YVRyYW5zZm9ybWVyIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgdGFyZ2V0UG9zdGZpeCkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUuZW5kc1dpdGgoIlZhbGlkYXRpb25TdHJhdGVneSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLnN1YnN0cmluZygwLCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLmxlbmd0aCgpIC0gMTgpICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUuZW5kc1dpdGgoIlN0cmF0ZWd5IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneU5hbWUuc3Vic3RyaW5nKDAsIHZhbGlkYXRpb25TdHJhdGVneU5hbWUubGVuZ3RoKCkgLSA4KSArIHRhcmdldFBvc3RmaXg7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArIHRhcmdldFBvc3RmaXg7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJjMWM5MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFyZW4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICAvKg0KLSAgICAgKiBtaXNjDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVNTQUdFX0JVTkRMRSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FU1NBR0VfQlVORExFIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0JBU0VfUEFDS0FHRSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0JBU0VfUEFDS0FHRSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9JTkZPUk1BVElPTl9QUk9WSURFUl9CRUFOID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fSU5GT1JNQVRJT05fUFJPVklERVJfQkVBTiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OX1NUUkFURUdZX01BUFBJTkcgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9TVEFUSUNfVkFMSURBVElPTl9TVFJBVEVHWV9NQVBQSU5HIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NPTVBPTkVOVF9JTklUSUFMSVpFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0NPTVBPTkVOVF9JTklUSUFMSVpFUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SIik7DQotDQotICAgIC8qDQotICAgICAqIG5hbWUgbWFwcGVyDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfTkFNRV9NQVBQRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfTkFNRV9NQVBQRVIiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSIik7DQotDQotICAgIC8qDQotICAgICAqIGZhY3Rvcmllcw0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZIik7DQotDQotICAgIC8qDQotICAgICAqIGRlYWN0aXZhdGUNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9SRU5ERVJLSVQgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfUkVOREVSS0lUIik7DQotDQotICAgIC8vY3VycmVudGx5IGp1c3QgdXNlZCBieSBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfREVGQVVMVF9DT05WRU5USU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0RFRkFVTFRfQ09OVkVOVElPTiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfRUxfUkVTT0xWRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfRUxfUkVTT0xWRVIiKTsNCi0NCi0gICAgLy90aGVyZSBpcyBub3RoaW5nIGxpa2UgREVBQ1RJVkFURV9ERUZBVUxUX1ZBTElEQVRJT05fSU5URVJDRVBUT1INCi0gICAgLy91c2UgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZGVueVJlbmRlcmVySW50ZXJjZXB0b3IoLi4uKSB3aXRoaW4gYW4gZXh0dmFsLVN0YXJ0dXBMaXN0ZW5lcg0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9BYnN0cmFjdEVMSGVscGVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE0M2YyNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9BYnN0cmFjdEVMSGVscGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIGRldGFpbHMNCi0gKiBAc2VlIERlZmF1bHRFTEhlbHBlcg0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkgY3VzdG9tRUxIZWxwZXJGYWN0b3J5Ow0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbUVMSGVscGVyRmFjdG9yeShBYnN0cmFjdEVMSGVscGVyRmFjdG9yeSBlbEhlbHBlckZhY3RvcnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3VzdG9tRUxIZWxwZXJGYWN0b3J5ID0gZWxIZWxwZXJGYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBmaW5hbCBFTEhlbHBlciBjcmVhdGUoKQ0KLSAgICB7DQotICAgICAgICBFTEhlbHBlciByZXN1bHQgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYodGhpcy5jdXN0b21FTEhlbHBlckZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSB0aGlzLmN1c3RvbUVMSGVscGVyRmFjdG9yeS5jcmVhdGVFTEhlbHBlcigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUVMSGVscGVyKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBFTEhlbHBlciBjcmVhdGVFTEhlbHBlcigpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjAzNjEzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsNCi1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7DQotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7DQotDQotLyoqDQotICogaW4gb3JkZXIgdG8gY2VudHJhbGl6ZSB0aGUganNmIHZlcnNpb24gZGVwZW5kZW5jeSB3aXRoaW4gdGhlIGNvcmUNCi0gKg0KLSAqIHRoaXMgZWwtaGVscGVyIHN1cHBvcnRzIGpzcCBhbmQgZmFjZWxldHMgKHRlc3RlZCB3aXRoIDEuMS4xNCkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogdGhlcmUgaXMgYSBzcGVjaWFsIGZhY2VsZXRzIHdvcmthcm91bmQgZm9yIGVsLWV4cHJlc3Npb25zIG9mIGN1c3RvbSBjb21wb25lbnRzDQotICogaXQncyBwbHVnZ2FibGUgaW4gb3JkZXIgdG8gc3VwcG9ydCBzcGVjaWFsIG1lY2hhbmlzbXMgb2YgZGlmZmVyZW50IHRlY2hub2xvZ2llcyAodGhhbiBqc3AgYW5kIGZhY2VsZXRzKQ0KLSAqIHNvIHlvdSBjYW4gcGx1ZyBpbiB5b3VyIG93biBpbXBsLiB3aGljaCBpbXBsZW1lbnRzIGEgY3VzdG9tIHdvcmthcm91bmQgKGxpa2UgdGhlIGZhY2VsZXRzIHdvcmthcm91bmQgb2YgdGhpcyBpbXBsLikNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RUxIZWxwZXIgaW1wbGVtZW50cyBFTEhlbHBlcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfRUxfUkVTT0xWRVIgPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9FTF9SRVNPTFZFUjsNCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRFTEhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIENsYXNzIGdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICAvL2R1ZSB0byBhIHJlc3RyaWN0aW9uIHdpdGggdGhlIHJpDQotICAgICAgICBPYmplY3QgYmVhbiA9IGdldFZhbHVlT2ZFeHByZXNzaW9uKGZhY2VzQ29udGV4dCwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgICAgICByZXR1cm4gKGJlYW4gIT0gbnVsbCkgPyBiZWFuLmdldENsYXNzKCkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmVhbihTdHJpbmcgYmVhbk5hbWUpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICByZXR1cm4gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZ2V0RUxSZXNvbHZlcigpLmdldFZhbHVlKGZhY2VzQ29udGV4dC5nZXRFTENvbnRleHQoKSwgbnVsbCwgYmVhbk5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiAhPSBudWxsKSA/IGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmV2YWx1YXRlRXhwcmVzc2lvbkdldCgNCi0gICAgICAgICAgICBmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpLCBPYmplY3QuY2xhc3MpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VMVGVybVZhbGlkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5ldmFsdWF0ZUV4cHJlc3Npb25HZXQoZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBPYmplY3QuY2xhc3MpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBnZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBib29sZWFuIGFsbG93QmxhbmtDaGFyYWN0ZXJzKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IGdldE9yaWdpbmFsVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih1aUNvbXBvbmVudCk7DQotDQotICAgICAgICAvL2ZvciBpbnB1dCBjb21wb25lbnRzIHdpdGhvdXQgdmFsdWUtYmluZGluZw0KLSAgICAgICAgLy8oZS5nLiBmb3Igc3BlY2lhbCBjb21wb25lbnQgbGlicyAtPiBpc3N1ZSB3aXRoIEV4dFZhbFJlbmRlcmVyV3JhcHBlciNlbmNvZGVCZWdpbikNCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoDQotICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKSArICIgaGFzIG5vIHZhbHVlIGJpbmRpbmcgLSBjb21wb25lbnQgaWQ6ICIgKyB1aUNvbXBvbmVudC5nZXRJZCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBpZighYWxsb3dCbGFua0NoYXJhY3RlcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZSgiICIsICIiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwNCi0gICAgICAgICAgICBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKS5nZXRCYXNlRXhwcmVzc2lvbigpKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gcmVzdWx0ID0gRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyLg0KLSAgICAgICAgICAgICAgICB0cnlUb0NyZWF0ZVZhbHVlQmluZGluZ0ZvckZhY2VsZXRzQmluZGluZyh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICAgICAgaWYocmVzdWx0ID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgcmVzb2x2ZSBleHByZXNzaW9uOiAiICsgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIENsYXNzIGVudGl0eUNsYXNzID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHJlc3VsdC5nZXRCYXNlRXhwcmVzc2lvbigpKTsNCi0NCi0gICAgICAgICAgICBpZihlbnRpdHlDbGFzcyA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IHJlc29sdmUgZXhwcmVzc2lvbjogIiArIHJlc3VsdC5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm9wZXJ0eURldGFpbHMgZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKERFQUNUSVZBVEVfRUxfUkVTT0xWRVIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eURldGFpbHNWaWFSZWZsZWN0aW9uRmFsbGJhY2sodWlDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIEV4dFZhbEVMUmVzb2x2ZXIgZWxSZXNvbHZlciA9IG5ldyBFeHRWYWxFTFJlc29sdmVyKGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmdldEVMUmVzb2x2ZXIoKSk7DQotICAgICAgICBFTENvbnRleHQgZWxDb250ZXh0ID0gRXh0VmFsRUxSZXNvbHZlci5jcmVhdGVDb250ZXh0V3JhcHBlcihmYWNlc0NvbnRleHQuZ2V0RUxDb250ZXh0KCksIGVsUmVzb2x2ZXIpOw0KLQ0KLSAgICAgICAgVmFsdWVFeHByZXNzaW9uIHZhbHVlRXhwcmVzc2lvbiA9IHVpQ29tcG9uZW50LmdldFZhbHVlRXhwcmVzc2lvbigidmFsdWUiKTsNCi0NCi0gICAgICAgIGlmKHZhbHVlRXhwcmVzc2lvbiA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsdWVFeHByZXNzaW9uLnNldFZhbHVlKGVsQ29udGV4dCwgbnVsbCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgImVycm9yIGF0IGJpbmRpbmc6ICIgKyB2YWx1ZUV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpICsNCi0gICAgICAgICAgICAgICAgIiAtLSBhbiBlbC1yZXNvbHZlciBlcnJvciBvY2N1cnJlZCEgbWF5YmUgeW91IHVzZWQgYW4gaW52YWxpZCBiaW5kaW5nLiBvdGhlcndpc2U6ICIgKw0KLSAgICAgICAgICAgICAgICAicGxlYXNlIHJlcG9ydCB0aGUgaXNzdWUsIGRlYWN0aXZhdGUgdGhlIGVsLXJlc292bGVyIG9mIGV4dHZhbCB2aWEgd2ViLnhtbCBjb250ZXh0LXBhcmFtOiAiICsNCi0gICAgICAgICAgICAgICAgRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCArICIuREVBQ1RJVkFURV9FTF9SRVNPTFZFUiIgKw0KLSAgICAgICAgICAgICAgICAiIGFuZCB0ZXN0IGFnYWluLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoZWxSZXNvbHZlci5nZXRQYXRoKCkgPT0gbnVsbCB8fCBlbFJlc29sdmVyLmdldEJhc2VPYmplY3QoKSA9PSBudWxsIHx8IGVsUmVzb2x2ZXIuZ2V0UHJvcGVydHkoKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURldGFpbHMoZWxSZXNvbHZlci5nZXRQYXRoKCksIGVsUmVzb2x2ZXIuZ2V0QmFzZU9iamVjdCgpLCBlbFJlc29sdmVyLmdldFByb3BlcnR5KCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgUHJvcGVydHlEZXRhaWxzIGdldFByb3BlcnR5RGV0YWlsc1ZpYVJlZmxlY3Rpb25GYWxsYmFjayhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gZ2V0VmFsdWVCaW5kaW5nRXhwcmVzc2lvbih1aUNvbXBvbmVudCwgZmFsc2UpOw0KLQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9DQotICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgU3RyaW5nIHBhdGggPSBudWxsOw0KLQ0KLSAgICAgICAgd2hpbGUoY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHBhdGggPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHBhdGggPSBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwYXRoID0gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSArICIuIiArIHBhdGg7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBhdGggPSBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpICsgIi4iICsgcGF0aDsNCi0NCi0gICAgICAgIE9iamVjdCBiYXNlT2JqZWN0ID0gZ2V0VmFsdWVPZkV4cHJlc3Npb24oDQotICAgICAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpKTsNCi0gICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlEZXRhaWxzKHBhdGgsIGJhc2VPYmplY3QsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSk7DQotICAgIH0NCi0NCi0gICAgc3RhdGljIFN0cmluZyBnZXRPcmlnaW5hbFZhbHVlQmluZGluZ0V4cHJlc3Npb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFZhbHVlRXhwcmVzc2lvbiB2YWx1ZUV4cHJlc3Npb24gPSB1aUNvbXBvbmVudC5nZXRWYWx1ZUV4cHJlc3Npb24oInZhbHVlIik7DQotDQotICAgICAgICByZXR1cm4gKHZhbHVlRXhwcmVzc2lvbiAhPSBudWxsKSA/IHZhbHVlRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtV2VsbEZvcm1lZChPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBWYWx1ZUJpbmRpbmcgfHwgbyBpbnN0YW5jZW9mIEV4dGVybmFsaXphYmxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBzID0gby50b1N0cmluZygpOw0KLSAgICAgICAgcmV0dXJuICgocy5jb250YWlucygiIyIpIHx8IHMuY29udGFpbnMoIiQiKSkgJiYgcy5jb250YWlucygieyIpICYmIHMuY29udGFpbnMoIn0iKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRCaW5kaW5nT2ZDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQuZ2V0VmFsdWVFeHByZXNzaW9uKG5hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmZTU2Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRFTEhlbHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeQ0KLXsNCi0gICAgcHJpdmF0ZSBFTEhlbHBlciBlbEhlbHBlciA9IG5ldyBEZWZhdWx0RUxIZWxwZXIoKTsNCi0gICAgDQotICAgIHByb3RlY3RlZCBFTEhlbHBlciBjcmVhdGVFTEhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmVsSGVscGVyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FTEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWIyNTUzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogaW4gb3JkZXIgdG8gY2VudHJhbGl6ZSB0aGUganNmIHZlcnNpb24gZGVwZW5kZW5jeSB3aXRoaW4gdGhlIGNvcmUNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRUxIZWxwZXINCi17DQotICAgIE9iamVjdCBnZXRCZWFuKFN0cmluZyBiZWFuTmFtZSk7DQotDQotICAgIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLQ0KLSAgICBDbGFzcyBnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCk7DQotDQotICAgIGJvb2xlYW4gaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIGJvb2xlYW4gaXNFTFRlcm1XZWxsRm9ybWVkKE9iamVjdCBvKTsNCi0NCi0gICAgT2JqZWN0IGdldEJpbmRpbmdPZkNvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgU3RyaW5nIG5hbWUpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FeHRWYWxFTFJlc29sdmVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FeHRWYWxFTFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNmMzZDMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRXh0VmFsRUxSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOwotCi1pbXBvcnQgamF2YXguZWwuRUxSZXNvbHZlcjsKLWltcG9ydCBqYXZheC5lbC5FTENvbnRleHQ7Ci1pbXBvcnQgamF2YXguZWwuVmFyaWFibGVNYXBwZXI7Ci1pbXBvcnQgamF2YXguZWwuRnVuY3Rpb25NYXBwZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS5iZWFucy5GZWF0dXJlRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1wdWJsaWMgY2xhc3MgRXh0VmFsRUxSZXNvbHZlciBleHRlbmRzIEVMUmVzb2x2ZXIKLXsKLSAgICBwcml2YXRlIEVMUmVzb2x2ZXIgd3JhcHBlZDsKLSAgICBwcml2YXRlIE9iamVjdCBiYXNlT2JqZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5OwotICAgIC8vZm9ybXMgdGhlIGlkIGZvciBjcm9zcy12YWxpZGF0aW9uIHdpdGhpbiBjb21wbGV4IGNvbXBvbmVudHMKLSAgICBwcml2YXRlIFN0cmluZyBleHByZXNzaW9uOwotCi0gICAgcHVibGljIEV4dFZhbEVMUmVzb2x2ZXIoRUxSZXNvbHZlciBlbFJlc29sdmVyKQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gZWxSZXNvbHZlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJhc2VPYmplY3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJhc2VPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBleHByZXNzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKLSAgICB7Ci0gICAgICAgIHRoaXMuYmFzZU9iamVjdCA9IG51bGw7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBudWxsOwotICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoRUxDb250ZXh0IGVsQ29udGV4dCwgT2JqZWN0IGJhc2UsIE9iamVjdCBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMuZXhwcmVzc2lvbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSAoU3RyaW5nKXByb3BlcnR5OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uICs9ICIuIiArIHByb3BlcnR5OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFZhbHVlKGVsQ29udGV4dCwgYmFzZSwgcHJvcGVydHkpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzczw/PiBnZXRUeXBlKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvLCBPYmplY3QgbzEpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRUeXBlKGVsQ29udGV4dCwgbywgbzEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvLCBPYmplY3QgbzEsIE9iamVjdCBvMikKLSAgICB7Ci0gICAgICAgIGV4cHJlc3Npb24gKz0gIi4iICsgbzE7Ci0gICAgICAgIHByb3BlcnR5ID0gKFN0cmluZylvMTsKLSAgICAgICAgYmFzZU9iamVjdCA9IG87Ci0gICAgICAgIGVsQ29udGV4dC5zZXRQcm9wZXJ0eVJlc29sdmVkKHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoRUxDb250ZXh0IGVsQ29udGV4dCwgT2JqZWN0IG8sIE9iamVjdCBvMSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmlzUmVhZE9ubHkoZWxDb250ZXh0LCBvLCBvMSk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yPEZlYXR1cmVEZXNjcmlwdG9yPiBnZXRGZWF0dXJlRGVzY3JpcHRvcnMoRUxDb250ZXh0IGVsQ29udGV4dCwgT2JqZWN0IG8pCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRGZWF0dXJlRGVzY3JpcHRvcnMoZWxDb250ZXh0LCBvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0Q29tbW9uUHJvcGVydHlUeXBlKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q29tbW9uUHJvcGVydHlUeXBlKGVsQ29udGV4dCwgbyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFTENvbnRleHQgY3JlYXRlQ29udGV4dFdyYXBwZXIoZmluYWwgRUxDb250ZXh0IGNvbnRleHQsIGZpbmFsIEVMUmVzb2x2ZXIgcmVzb2x2ZXIpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEVMQ29udGV4dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIExvY2FsZSBnZXRMb2NhbGUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldExvY2FsZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5UmVzb2x2ZWQoYm9vbGVhbiB2YWx1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlci5zZXRQcm9wZXJ0eVJlc29sdmVkKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldFByb3BlcnR5UmVzb2x2ZWQodmFsdWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHB1dENvbnRleHQoQ2xhc3MgY2xhenosIE9iamVjdCBvYmplY3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIucHV0Q29udGV4dChjbGF6eiwgb2JqZWN0KTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnB1dENvbnRleHQoY2xhenosIG9iamVjdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRDb250ZXh0KENsYXNzIGNsYXp6KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldENvbnRleHQoY2xhenopOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jYWxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyLnNldExvY2FsZShsb2NhbGUpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0TG9jYWxlKGxvY2FsZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEVMUmVzb2x2ZXIgZ2V0RUxSZXNvbHZlcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBGdW5jdGlvbk1hcHBlciBnZXRGdW5jdGlvbk1hcHBlcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0RnVuY3Rpb25NYXBwZXIoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgVmFyaWFibGVNYXBwZXIgZ2V0VmFyaWFibGVNYXBwZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldFZhcmlhYmxlTWFwcGVyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0ZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjAxNDYxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0ZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0Ow0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi0vKioNCi0gKiBIZWxwZXIgY2xhc3MgdG8gZ2V0IHRoZSByZWFsL2Z1bGwgdmFsdWUgYmluZGluZyAtIHRlc3RlZCB3aXRoIGZhY2VsZXRzIDEuMS4xNA0KLSAqIFRoZSB0YXJnZXQgaXMgdG8gZ2V0IHJpZCBvZiB0aGlzIGltcGwuIC0gY3VycmVudGx5IGl0J3MgYSB3b3JrYXJvdW5kIHRvIHN1cHBvcnQgY3VzdG9tIGZhY2VsZXRzIGNvbXBvbmVudHMuDQotICogQW4gYWx0ZXJuYXRpdmUgd291bGQgYmUgYW4gRUwtUmVzb2x2ZXIgLSB0aGVyZSBhcmUgc3RpbGwgc29tZSBvcGVuIGlzc3VlcyB3aXRoIHN1Y2ggYW4gYXBwcm9hY2gNCi0gKiArIEl0IGlzbid0IGF2YWlsYWJsZSB3aXRoIEpTRiAxLjEueA0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB0cnlUb0NyZWF0ZVZhbHVlQmluZGluZ0ZvckZhY2VsZXRzQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGZhY2VsZXRzVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IERlZmF1bHRFTEhlbHBlci5nZXRPcmlnaW5hbFZhbHVlQmluZGluZ0V4cHJlc3Npb24odWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGZvdW5kQmluZGluZ3MgPSBleHRyYWN0RUxUZXJtcygNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCaW5kaW5nT2ZDb21wb25lbnQodWlDb21wb25lbnQsICJ2YWx1ZSIpKTsNCi0NCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcHBlZEZhY2VsZXRzVmFycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmJlPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24NCi0gICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgMSkgKyAieyIgKyBjcmVhdGVCaW5kaW5nKGZvdW5kQmluZGluZ3MsIG1hcHBlZEZhY2VsZXRzVmFycykgKyAifSIpOw0KLQ0KLSAgICAgICAgICAgIENsYXNzIGVudGl0eUNsYXNzID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZiZS5nZXRCYXNlRXhwcmVzc2lvbigpKTsNCi0NCi0gICAgICAgICAgICBpZihlbnRpdHlDbGFzcyA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRyeVRvUmVwbGFjZVZhcnModmJlLCBtYXBwZWRGYWNlbGV0c1ZhcnMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gdmJlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNyZWF0ZUJpbmRpbmcoTGlzdDxTdHJpbmc+IGV4cHJlc3Npb25zLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHZpcnR1YWxWYXJzKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VycmVudEJpbmRpbmc7DQotDQotICAgICAgICBpbnQgaW5kZXhPZkJpbmRpbmdEZXRhaWxzOw0KLSAgICAgICAgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBleHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aCgiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZvdW5kQmluZGluZ0RldGFpbHMgPSBlbnRyeS5zcGxpdCgiICIpOw0KLSAgICAgICAgICAgIGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoZm91bmRCaW5kaW5nRGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9PSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBiaW5kaW5nRGV0YWlscyA9IGZvdW5kQmluZGluZ0RldGFpbHNbaW5kZXhPZkJpbmRpbmdEZXRhaWxzXS5zcGxpdCgiPSIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nRGV0YWlscy5sZW5ndGggPCAyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYmluZGluZ0RldGFpbHNbMV07DQotDQotICAgICAgICAgICAgLy90byBzdXBwb3J0IGJsYW5rcyB3aXRoaW4gYSBiaW5kaW5nIHdpdGggbWFwIHN5bnRheA0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgJiYgIWN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoY3VycmVudEJpbmRpbmcsIGZvdW5kQmluZGluZ0RldGFpbHMsIGluZGV4T2ZCaW5kaW5nRGV0YWlscyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9lbnRyeSBmb3IgInZpcnR1YWwiIGZhY2VsZXRzIGJlYW5zDQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWluc0tleShiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLnB1dChiaW5kaW5nRGV0YWlsc1swXSwgY3VycmVudEJpbmRpbmcpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICBpZighKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgfHwgY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2aXJ0dWFsVmFycy5wdXQoYmluZGluZ0RldGFpbHNbMF0sIGJpbmRpbmdEZXRhaWxzWzFdLnN1YnN0cmluZygxLCBiaW5kaW5nRGV0YWlsc1sxXS5sZW5ndGgoKS0yKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIG9yaWdpbmFsQmluZGluZyA9IGFkZGVkVmlydHVhbE5hbWVzLmdldCgidmFsdWUiKTsNCi0gICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5zdWJzdHJpbmcob3JpZ2luYWxCaW5kaW5nLmluZGV4T2YoInsiKSArIDEsIG9yaWdpbmFsQmluZGluZy5pbmRleE9mKCJ9IikpOw0KLSAgICAgICAgYWRkZWRWaXJ0dWFsTmFtZXMucmVtb3ZlKCJ2YWx1ZSIpOw0KLSAgICAgICAgcmV0dXJuIHRyeVRvVHJhbnNmb3JtVG9SZWFsQmluZGluZyhvcmlnaW5hbEJpbmRpbmcsIGFkZGVkVmlydHVhbE5hbWVzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdHJ5VG9UcmFuc2Zvcm1Ub1JlYWxCaW5kaW5nKFN0cmluZyBvcmlnaW5hbEJpbmRpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkZWRWaXJ0dWFsTmFtZXMpDQotICAgIHsNCi0gICAgICAgIG9yaWdpbmFsQmluZGluZyA9ICIjeyIgKyBvcmlnaW5hbEJpbmRpbmcgKyAifSI7DQotICAgICAgICBJdGVyYXRvciBuYW1lSXRlcmF0b3IgPSBhZGRlZFZpcnR1YWxOYW1lcy5rZXlTZXQoKS5pdGVyYXRvcigpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRLZXk7DQotICAgICAgICBTdHJpbmcgY3VycmVudFZhbHVlOw0KLSAgICAgICAgd2hpbGUobmFtZUl0ZXJhdG9yLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50S2V5ID0gKFN0cmluZykgbmFtZUl0ZXJhdG9yLm5leHQoKTsNCi0gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBhZGRlZFZpcnR1YWxOYW1lcy5nZXQoY3VycmVudEtleSk7DQotDQotICAgICAgICAgICAgY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlLnN1YnN0cmluZyhjdXJyZW50VmFsdWUuaW5kZXhPZigieyIpICsgMSwgY3VycmVudFZhbHVlLmluZGV4T2YoIn0iKSk7DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoInsiICsgY3VycmVudEtleSArICIuIiwgInsiICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiLiIgKyBjdXJyZW50S2V5ICsgIi4iLCAiLiIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiXSIsICJbIiArIGN1cnJlbnRWYWx1ZSArICJdIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gb3JpZ2luYWxCaW5kaW5nLnN1YnN0cmluZygyLCBvcmlnaW5hbEJpbmRpbmcubGVuZ3RoKCkgLSAxKTsNCi0gICAgfQ0KLQ0KLSAgICAvL3RvIHN1cHBvcnQgYmxhbmtzIC0gZS5nLiB3aXRoIG1hcCBzeW50YXgNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoU3RyaW5nIGN1cnJlbnRCaW5kaW5nLCBTdHJpbmdbXSBmb3VuZEJpbmRpbmdEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhPZkJpbmRpbmdEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBmb3IoaW50IGkgPSBpbmRleE9mQmluZGluZ0RldGFpbHMgKyAxOyBpIDwgZm91bmRCaW5kaW5nRGV0YWlscy5sZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50QmluZGluZyArPSBmb3VuZEJpbmRpbmdEZXRhaWxzW2ldOw0KLSAgICAgICAgICAgIGlmKGZvdW5kQmluZGluZ0RldGFpbHNbaV0uY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50QmluZGluZzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY3VycmVudEJpbmRpbmc7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoU3RyaW5nW10gYmluZGluZ0RldGFpbHMpDQotICAgIHsNCi0gICAgICAgIGludCBjb3VudCA9IDA7DQotICAgICAgICBmb3IgKFN0cmluZyBlbnRyeSA6IGJpbmRpbmdEZXRhaWxzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbnRyeS5jb250YWlucygiPSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjb3VudCsrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBleHRyYWN0RUxUZXJtcyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGZvdW5kRUxUZXJtcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHJlc29sdmVFTFRlcm1zKG8sIG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpLCBmb3VuZEVMVGVybXMsIDApID4gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZEVMVGVybXM7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGludCByZXNvbHZlRUxUZXJtcyhPYmplY3QgbywgTWFwPE9iamVjdCwgT2JqZWN0PiB2aXNpdGVkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGZvdW5kRUxUZXJtcywgaW50IGNvdW50KSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChvID09IG51bGwgfHwgdmlzaXRlZC5jb250YWluc0tleShvKSB8fCBjb3VudCA+IDUwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdmlzaXRlZC5wdXQobywgbnVsbCk7DQotDQotICAgICAgICBpbnQgZWxDb3VudCA9IDA7DQotICAgICAgICBDbGFzcyBjID0gby5nZXRDbGFzcygpOw0KLQ0KLSAgICAgICAgLy9pbnNwZWN0IG1hcHMNCi0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgTWFwKQ0KLSAgICAgICAgew0KLQ0KLSAgICAgICAgICAgIGZvciAoT2JqZWN0IGVudHJ5IDogKChNYXApIG8pLnZhbHVlcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9mb3VuZCBlbnRyeSBmb3IgInZpcnR1YWwiIGZhY2VsZXRzIHZhcg0KLSAgICAgICAgICAgICAgICBpZihlbnRyeS50b1N0cmluZygpLmNvbnRhaW5zKCJWYWx1ZUV4cHJlc3Npb25bIikpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kRUxUZXJtcy5hZGQoZW50cnkudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxDb3VudCArPSByZXNvbHZlRUxUZXJtcyhlbnRyeSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gZWxDb3VudDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChvKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiArK2VsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2FuYWx5emUgYXJyYXlzDQotICAgICAgICBpZiAoYy5pc0FycmF5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW50IGxlbmd0aCA9IEFycmF5LmdldExlbmd0aChvKTsNCi0gICAgICAgICAgICAvL2NoZWNrIGFycmF5IFtMIC0+IG5vIGFycmF5IG9mIHByaW1pdGl2ZSB0eXBlcw0KLSAgICAgICAgICAgIGlmIChvLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiW0wiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChvLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiW0xqYXZhLmxhbmcuU3RyaW5nIikpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKEFycmF5LmdldChvLCBpKSkpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kRUxUZXJtcy5hZGQoby50b1N0cmluZygpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbENvdW50Kys7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoQXJyYXkuZ2V0KG8sIGkpLCB2aXNpdGVkLCBmb3VuZEVMVGVybXMsIGNvdW50ICsgMSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGVsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PEZpZWxkPiBhdHRyaWJ1dGVzID0gZmluZEFsbEF0dHJpYnV0ZXMoYywgbmV3IEFycmF5TGlzdDxGaWVsZD4oKSk7DQotICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGF0dHJpYnV0ZXMudG9BcnJheShuZXcgRmllbGRbYXR0cmlidXRlcy5zaXplKCldKTsNCi0NCi0gICAgICAgIEFjY2Vzc2libGVPYmplY3Quc2V0QWNjZXNzaWJsZShmaWVsZHMsIHRydWUpOw0KLSAgICAgICAgZm9yIChGaWVsZCBjdXJyZW50RmllbGQgOiBmaWVsZHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5nZXQobykgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmdldFR5cGUoKS5lcXVhbHMoU3RyaW5nLmNsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQuZ2V0KG8pICE9IG51bGwgJiYgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQoY3VycmVudEZpZWxkLmdldChvKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZEVMVGVybXMgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBlbENvdW50Kys7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZiAoIWN1cnJlbnRGaWVsZC5nZXRUeXBlKCkuaXNQcmltaXRpdmUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoY3VycmVudEZpZWxkLmdldChvKSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBlbENvdW50Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8RmllbGQ+IGZpbmRBbGxBdHRyaWJ1dGVzKENsYXNzIGMsIExpc3Q8RmllbGQ+IGF0dHJpYnV0ZXMpDQotICAgIHsNCi0gICAgICAgIGlmIChjID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7DQotICAgICAgICB9DQotICAgICAgICBmaW5kQWxsQXR0cmlidXRlcyhjLmdldFN1cGVyY2xhc3MoKSwgYXR0cmlidXRlcyk7DQotDQotICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGMuZ2V0RGVjbGFyZWRGaWVsZHMoKTsNCi0gICAgICAgIGZvciAoRmllbGQgY3VycmVudEZpZWxkIDogZmllbGRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghTW9kaWZpZXIuaXNTdGF0aWMoY3VycmVudEZpZWxkLmdldE1vZGlmaWVycygpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKGN1cnJlbnRGaWVsZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB0cnlUb1JlcGxhY2VWYXJzKFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcHBlZEZhY2VsZXRzVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5Ow0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOw0KLSAgICAgICAgYm9vbGVhbiBsYXN0ID0gZmFsc2U7DQotDQotICAgICAgICB3aGlsZSh0cnVlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbGFzdCA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLQ0KLQ0KLSAgICAgICAgICAgIHByb3BlcnR5ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpOw0KLQ0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgIC5yZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgZ2V0TmV3UHJvcGVydHkocHJvcGVydHksIG1hcHBlZEZhY2VsZXRzVmFycykpOw0KLQ0KLSAgICAgICAgICAgIGlmKHJlc3VsdC5sZW5ndGgoKSA9PSAwKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkgKyAiLiIgKyByZXN1bHQ7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCk7DQotDQotICAgICAgICAgICAgaWYobGFzdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByZWZpeCgpICsgInsiICsgcmVzdWx0ICsgIn0iKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmV3UHJvcGVydHkoU3RyaW5nIG9sZFByb3BlcnR5LCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcHBlZEZhY2VsZXRzVmFycykNCi0gICAgew0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZpcnR1YWxWYXJzID0gZ2V0UG90ZW50aWFsVmlydHVhbFZhcnMob2xkUHJvcGVydHkpOw0KLQ0KLSAgICAgICAgZm9yKFN0cmluZyB2aXJ0dWFsVmFyIDogdmlydHVhbFZhcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobWFwcGVkRmFjZWxldHNWYXJzLmNvbnRhaW5zS2V5KHZpcnR1YWxWYXIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgb2xkUHJvcGVydHkgPSByZXBsYWNlUHJvcGVydHlWYWx1ZShvbGRQcm9wZXJ0eSwgdmlydHVhbFZhciwgbWFwcGVkRmFjZWxldHNWYXJzLmdldCh2aXJ0dWFsVmFyKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG9sZFByb3BlcnR5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRQb3RlbnRpYWxWaXJ0dWFsVmFycyhTdHJpbmcgb2xkUHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGludCBzdGFydCA9IC0xOw0KLSAgICAgICAgaW50IGVuZCA9IC0xOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZpcnR1YWxWYXJMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgb2xkUHJvcGVydHkubGVuZ3RoKCk7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihzdGFydCA9PSAtIDEgJiYgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICdbJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYoKHN0YXJ0ICE9IC0gMSAmJiBvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ1snKSB8fCBvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ10nKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZW5kID0gaTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYoc3RhcnQgIT0gLTEgJiYgZW5kICE9IC0xKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhckxpc3QuYWRkKG9sZFByb3BlcnR5LnN1YnN0cmluZyhzdGFydCwgZW5kKSk7DQotICAgICAgICAgICAgICAgIGlmKG9sZFByb3BlcnR5LmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IC0xOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVuZCA9IC0xOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB2aXJ0dWFsVmFyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVwbGFjZVByb3BlcnR5VmFsdWUoU3RyaW5nIG9sZFByb3BlcnR5LCBTdHJpbmcgdGFyZ2V0VmFyLCBTdHJpbmcgbmV3VmFsdWUpDQotICAgIHsNCi0gICAgICAgIGludCBpbmRleCA9IG9sZFByb3BlcnR5LmluZGV4T2YodGFyZ2V0VmFyKTsNCi0NCi0gICAgICAgIGlmKGluZGV4ID09IC0xKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBvbGRQcm9wZXJ0eTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoMCwgaW5kZXgpOw0KLSAgICAgICAgcmVzdWx0ICs9IG5ld1ZhbHVlOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdCArIG9sZFByb3BlcnR5LnN1YnN0cmluZyhpbmRleCArIHRhcmdldFZhci5sZW5ndGgoKSwgb2xkUHJvcGVydHkubGVuZ3RoKCkpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHJlcGxhY2UgdmlydHVhbCBmYWNlbGV0cyB2YXJzIChtYXAgc3ludGF4KQ0KLSAgICAgKiB0ZXN0ZWQgc3R5bGVzIChzaW1wbGUgYW5kIG5lc3RlZCk6IHRlc3RbaXhbaXgyW2l4M11dXQ0KLSAgICAgKi8NCi0gICAgLyoNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIF9jcmVhdGVCaW5kaW5nKExpc3Q8U3RyaW5nPiBleHByZXNzaW9ucywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOw0KLQ0KLSAgICAgICAgU3RyaW5nIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRCaW5kaW5nOw0KLSAgICAgICAgU3RyaW5nIHBhcnRPZkJpbmRpbmc7DQotDQotICAgICAgICBpbnQgaW5kZXhPZkJpbmRpbmdEZXRhaWxzOw0KLSAgICAgICAgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGFkZGVkVmlydHVhbE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBlbnRyeSA6IGV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbnRyeS5zdGFydHNXaXRoKCJWYWx1ZUV4cHJlc3Npb25bIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgZm91bmRCaW5kaW5nRGV0YWlscyA9IGVudHJ5LnNwbGl0KCIgIik7DQotICAgICAgICAgICAgaW5kZXhPZkJpbmRpbmdEZXRhaWxzID0gZmluZEluZGV4T2ZCaW5kaW5nRGV0YWlscyhmb3VuZEJpbmRpbmdEZXRhaWxzKTsNCi0NCi0gICAgICAgICAgICBpZiAoaW5kZXhPZkJpbmRpbmdEZXRhaWxzID09IC0xKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGJpbmRpbmdEZXRhaWxzID0gZm91bmRCaW5kaW5nRGV0YWlsc1tpbmRleE9mQmluZGluZ0RldGFpbHNdLnNwbGl0KCI9Iik7DQotDQotICAgICAgICAgICAgaWYgKGJpbmRpbmdEZXRhaWxzLmxlbmd0aCA8IDIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgPSBiaW5kaW5nRGV0YWlsc1sxXTsNCi0NCi0gICAgICAgICAgICAvL3RvIHN1cHBvcnQgYmxhbmtzIHdpdGhpbiBhIGJpbmRpbmcgd2l0aCBtYXAgc3ludGF4DQotICAgICAgICAgICAgaWYoY3VycmVudEJpbmRpbmcuY29udGFpbnMoInsiKSAmJiAhY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYWRkRnVydGhlckJpbmRpbmdQYXJ0cyhjdXJyZW50QmluZGluZywgZm91bmRCaW5kaW5nRGV0YWlscywgaW5kZXhPZkJpbmRpbmdEZXRhaWxzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUgIT0gbnVsbCAmJiBjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9lbnRyeSBmb3IgInZpcnR1YWwiIGZhY2VsZXRzIGJlYW5zDQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWlucyhiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHBhcnRPZkJpbmRpbmcgPSBjdXJyZW50QmluZGluZy5zdWJzdHJpbmcoY3VycmVudEJpbmRpbmcuaW5kZXhPZihwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgcHJldkZhY2VsZXRzQXR0cmlidXRlTmFtZS5sZW5ndGgoKSwgY3VycmVudEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLmFkZChiaW5kaW5nRGV0YWlsc1swXSk7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBwYXJ0T2ZCaW5kaW5nOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy9lbnRyeSBmb3IgInZpcnR1YWwiIGZhY2VsZXRzIHZhcg0KLSAgICAgICAgICAgIGVsc2UgaWYoIShjdXJyZW50QmluZGluZy5jb250YWlucygieyIpIHx8IGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhcnMucHV0KGJpbmRpbmdEZXRhaWxzWzBdLCBiaW5kaW5nRGV0YWlsc1sxXS5zdWJzdHJpbmcoMSwgYmluZGluZ0RldGFpbHNbMV0ubGVuZ3RoKCktMikpOw0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoIWFkZGVkVmlydHVhbE5hbWVzLmNvbnRhaW5zKGJpbmRpbmdEZXRhaWxzWzBdKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYWRkZWRWaXJ0dWFsTmFtZXMuYWRkKGJpbmRpbmdEZXRhaWxzWzBdKTsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGN1cnJlbnRCaW5kaW5nLnN1YnN0cmluZyhjdXJyZW50QmluZGluZy5pbmRleE9mKCJ7IikgKyAxLCBjdXJyZW50QmluZGluZy5pbmRleE9mKCJ9IikpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUgPSBiaW5kaW5nRGV0YWlsc1swXTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0gICAgKi8NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzhhZmVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiZGlmZmVyZW5jZSBiZXR3ZWVuIFsgYW5kIFsnIC0gdGVzdCB3aXRoIG1vcmUgY29uc3RlbGxhdGlvbnMiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSX0pDQotcHVibGljIGNsYXNzIFZhbHVlQmluZGluZ0V4cHJlc3Npb24NCi17DQotICAgIHByaXZhdGUgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBiYXNlOw0KLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJlZml4Ow0KLSAgICBwcml2YXRlIFN0cmluZyB0b2tlbjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlcGxhY2VPckFkZFByb3BlcnR5KFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuZXdQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gcmVwbGFjZVByb3BlcnR5KFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKS5lbmRzV2l0aCgiJ10iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGFkZFByb3BlcnR5KFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgU3RyaW5nIG5ld1Byb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgc291cmNlRXhwcmVzc2lvbiA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHNvdXJjZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIHNvdXJjZUV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKTsNCi0NCi0gICAgICAgIGlmKG5ld1Byb3BlcnR5LnN0YXJ0c1dpdGgoIlsnIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHJlc3VsdCArIG5ld1Byb3BlcnR5ICsgIn0iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ocmVzdWx0ICsgIi4iICsgbmV3UHJvcGVydHkgKyAifSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKFN0cmluZyBleHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBpZighRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQoZXhwcmVzc2lvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihleHByZXNzaW9uICsgIiBpcyBubyB2YWxpZCBlbC1leHByZXNzaW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBpbnQgaW5kZXgxID0gZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiJ10iKTsNCi0gICAgICAgIGludCBpbmRleDIgPSBleHByZXNzaW9uLmxhc3RJbmRleE9mKCIuIik7DQotDQotICAgICAgICBpZihpbmRleDEgPiBpbmRleDIpDQotICAgICAgICB7DQotICAgICAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGluZGV4MSk7DQotDQotICAgICAgICAgICAgaW50IGluZGV4MyA9IGZpbmRJbmRleE9mU3RhcnRpbmdCcmFja2V0KGV4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZyhpbmRleDMgKyAyLCBpbmRleDEpOw0KLSAgICAgICAgICAgIHRoaXMuYmFzZSA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKGV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGluZGV4MykgKyAifSIpOw0KLSAgICAgICAgICAgIHRoaXMudG9rZW4gPSAiWyciOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiggaW5kZXgyID4gaW5kZXgxKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZyhpbmRleDIgKyAxLCBleHByZXNzaW9uLmxlbmd0aCgpIC0gMSApOw0KLSAgICAgICAgICAgIHRoaXMuYmFzZSA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKGV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGluZGV4MikgKyAifSIpOw0KLSAgICAgICAgICAgIHRoaXMudG9rZW4gPSAiLiI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKDIsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKTsNCi0gICAgICAgICAgICB0aGlzLnByZWZpeCA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIDEpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS50cmltKCk7DQotICAgICAgICANCi0gICAgICAgIGlmKCJbIi5lcXVhbHModGhpcy50b2tlbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGhpcy52YWx1ZS5zdGFydHNXaXRoKCInIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS5zdWJzdHJpbmcoMSwgdGhpcy52YWx1ZS5sZW5ndGgoKSAtIDEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlLnZhbHVlICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUuc3Vic3RyaW5nKDAsIHRoaXMudmFsdWUubGVuZ3RoKCkpICsgIiddIjsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBnZXRCYXNlRXhwcmVzc2lvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBiYXNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwcmVzc2lvblN0cmluZygpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMuYmFzZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBiYXNlRXhwcmVzc2lvbiA9IHRoaXMuYmFzZS5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotDQotICAgICAgICAgICAgaWYoIlsnIi5lcXVhbHModGhpcy50b2tlbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGJhc2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSkgKyB0aGlzLnRva2VuICsgdGhpcy52YWx1ZSArICInXX0iOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gYmFzZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGJhc2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSkgKyB0aGlzLnRva2VuICsgdGhpcy52YWx1ZSArICJ9IjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVmaXggKyAieyIgKyB0aGlzLnZhbHVlICsgIn0iOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5iYXNlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZS5nZXRQcmVmaXgoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJlZml4Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmJhc2Uuc2V0UHJlZml4KHByZWZpeCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEV4cHJlc3Npb25TdHJpbmcoKS5oYXNoQ29kZSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gJiYgZ2V0RXhwcmVzc2lvblN0cmluZygpDQotICAgICAgICAgICAgLmVxdWFscygoKFZhbHVlQmluZGluZ0V4cHJlc3Npb24pIHRhcmdldCkuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGludCBmaW5kSW5kZXhPZlN0YXJ0aW5nQnJhY2tldChTdHJpbmcgZXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgaW50IGNsb3NlQ291bnQgPSAwOw0KLSAgICAgICAgZm9yKGludCBpID0gZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDE7IGkgPiAwOyBpLS0pDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoZXhwcmVzc2lvbi5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2xvc2VDb3VudC0tOw0KLSAgICAgICAgICAgICAgICBpZihjbG9zZUNvdW50IDwgMCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZihleHByZXNzaW9uLmNoYXJBdChpKSA9PSAnXScpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjbG9zZUNvdW50Kys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9EZWZhdWx0RmFjdG9yeUZpbmRlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9EZWZhdWx0RmFjdG9yeUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGY3MTc3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRGVmYXVsdEZhY3RvcnlGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5EZWZhdWx0RUxIZWxwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotLy9keW5hbWljIGFwcHJvYWNoIHRvIGNyZWF0ZSB0aGUgZmFjdG9yaWVzIGR1cmluZyB0aGUgZmlyc3QgcmVxdWVzdCwgd2hlbiBhIGZhY2VzLWNvbnRleHQgaXMgYXZhaWxhYmxlDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZhY3RvcnlGaW5kZXIgaW1wbGVtZW50cyBGYWN0b3J5RmluZGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLSAgICBwcm90ZWN0ZWQgTWFwPEZhY3RvcnlOYW1lcywgT2JqZWN0PiBmYWN0b3J5TWFwID0gbmV3IEhhc2hNYXA8RmFjdG9yeU5hbWVzLCBPYmplY3Q+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0RmFjdG9yeUZpbmRlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIGZpbmFsIDxUPiBUIGdldEZhY3RvcnkoRmFjdG9yeU5hbWVzIGZhY3RvcnlOYW1lLCBDbGFzczxUPiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYoIShmYWN0b3J5TWFwLmNvbnRhaW5zS2V5KGZhY3RvcnlOYW1lKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdEZhY3RvcnkoZmFjdG9yeU5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChUKWZhY3RvcnlNYXAuZ2V0KGZhY3RvcnlOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdEZhY3RvcnkoRmFjdG9yeU5hbWVzIGZhY3RvcnlOYW1lKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotICAgICAgICBzd2l0Y2ggKGZhY3RvcnlOYW1lKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNhc2UgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZUNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIFZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZVZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIFJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIEVMX0hFTFBFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlRUxIZWxwZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6IC8vcmVxdWlyZWQgYnkgY2hlY2tzdHlsZQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoZmFjdG9yeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vdCBwb3NzaWJsZSB0byBjcmVhdGUgZmFjdG9yeSAiICsgZmFjdG9yeU5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZmFjdG9yeU1hcC5wdXQoZmFjdG9yeU5hbWUsIGZhY3RvcnkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSk7DQotICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSkpOw0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZKTsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSkpOw0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlTWVzc2FnZVJlc29sdmVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZKTsNCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSkpOw0KLSAgICAgICAgbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKERlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkgKTsNCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSkpOw0KLSAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IGNyZWF0ZUVMSGVscGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdEVMSGVscGVyRmFjdG9yeSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZjI2MjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnlGaW5kZXIKLXsKLSAgICA8VD4gVCBnZXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMTlkYzIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQotcHVibGljIGVudW0gRmFjdG9yeU5hbWVzCi17Ci0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksCi0gICAgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLAotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLAotCi0gICAgUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwKLSAgICBFTF9IRUxQRVJfRkFDVE9SWQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjliZDk3YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEFsbG93cyB0byBpbml0aWFsaXplIGNvbXBvbmVudHMgYmVmb3JlRW5jb2RlQmVnaW4uPGJyLz4NCi0gKiBlLmcuOiB5b3UgY2FuIGFkZCBpbmZvcm1hdGlvbiBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBtZWNoYW5pc21zLC4uLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBDb21wb25lbnRJbml0aWFsaXplcg0KLXsNCi0gICAgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTljMDQxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXRpY0NvbmZpZ3VyYXRpb248VCwgUj4NCi17DQotICAgIHZvaWQgc2V0U291cmNlT2ZNYXBwaW5nKFN0cmluZyBwYXRoKTsNCi0gICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8VCwgUj4+IGdldE1hcHBpbmcoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uRW50cnkuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiODRhZjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgY2xhc3MgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFQsIFI+DQotew0KLSAgICBwcml2YXRlIFQgc291cmNlOw0KLSAgICBwcml2YXRlIFIgdGFyZ2V0Ow0KLQ0KLSAgICBwdWJsaWMgVCBnZXRTb3VyY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc291cmNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZShUIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFIgZ2V0VGFyZ2V0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoUiB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjU5YjFlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkKLXB1YmxpYyBlbnVtIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcwotewotICAgIE1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfQ09ORklHLAotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0NPTkZJRwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGNiNmY0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LlJFVVNFfSkKLXB1YmxpYyBjbGFzcyBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPgotewotICAgIHByaXZhdGUgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5ncwotICAgICAgICA9IG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4oKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gZ2V0TWFwcGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gbWFwcGluZ3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgc291cmNlLCBTdHJpbmcgdGFyZ2V0KQotICAgIHsKLSAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA9IG5ldyBTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIGVudHJ5LnNldFNvdXJjZShzb3VyY2UpOwotICAgICAgICBlbnRyeS5zZXRUYXJnZXQodGFyZ2V0KTsKLSAgICAgICAgdGhpcy5tYXBwaW5ncy5hZGQoZW50cnkpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhNjNjNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LlJFVVNFfSkKLXB1YmxpYyBjbGFzcyBTdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPgotewotICAgIHByaXZhdGUgU3RyaW5nIHBhdGg7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmdzOwotCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlT2ZNYXBwaW5nKFN0cmluZyBwYXRoKQotICAgIHsKLSAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKLSAgICAgICAgLy9mb3JjZSByZWxvYWQKLSAgICAgICAgbWFwcGluZ3MgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGdldE1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgaWYobWFwcGluZ3MgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgICAgICB9Ci0KLSAgICAgICAgbWFwcGluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+KCk7Ci0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgbWFwcGluZyA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShwYXRoKTsKLQotICAgICAgICBpZiAobWFwcGluZyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2xvZ2dpbmcKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBFbnVtZXJhdGlvbiBrZXlzID0gbWFwcGluZy5nZXRLZXlzKCk7Ci0KLSAgICAgICAgU3RyaW5nIG1ldGFEYXRhS2V5OwotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOwotCi0gICAgICAgIHdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhRGF0YUtleSA9IChTdHJpbmcpIGtleXMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSA9IG1hcHBpbmcuZ2V0U3RyaW5nKG1ldGFEYXRhS2V5KTsKLQotICAgICAgICAgICAgYWRkTWFwcGluZyhtZXRhRGF0YUtleSwgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFwcGluZ3M7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIG1ldGFEYXRhS2V5LCBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQotICAgIHsKLSAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA9IG5ldyBTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIGVudHJ5LnNldFNvdXJjZShtZXRhRGF0YUtleSk7Ci0gICAgICAgIGVudHJ5LnNldFRhcmdldCh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpOwotICAgICAgICB0aGlzLm1hcHBpbmdzLmFkZChlbnRyeSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk5Mzk2OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBSZW5kZXJlckludGVyY2VwdG9yCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEludGVyY2VwdG9ySWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmV0dXJuVmFsdWVPblNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oCi0gICAgICAgIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gc2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiwgT2JqZWN0IGN1cnJlbnRSZXR1cm5WYWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50UmV0dXJuVmFsdWU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIGJlZm9yZQotICAgICovCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIC8qCi0gICAgICogYWZ0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZnRlckRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZnRlckVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZnRlckVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZnRlckVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzFmMDU0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbGxvd3MgdG8gaW50ZXJjZXB0IHJlbmRlcmVyIG1ldGhvZHMuPGJyLz4KLSAqIEJhc2UgbWVjaGFuaXNtIG9mIGV4dHZhbC4gSXQgYWxsb3dzIHRvIGFkZCBjdXN0b20gaW5mcmFzdHJ1Y3R1cmVzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBSZW5kZXJlckludGVyY2VwdG9yCi17Ci0gICAgU3RyaW5nIGdldEludGVyY2VwdG9ySWQoKTsKLQotICAgIE9iamVjdCBnZXRSZXR1cm5WYWx1ZU9uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBza2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLCBPYmplY3QgY3VycmVudFJldHVyblZhbHVlKTsKLQotICAgIC8qCi0gICAgICogYmVmb3JlCi0gICAgICovCi0gICAgdm9pZCBiZWZvcmVEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKgotICAgICAqIGFmdGVyCi0gICAgICovCi0gICAgdm9pZCBhZnRlckRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2MwOWFiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gaW50ZXJjZXB0IHZhbGlkYXRpb3IgZXhjZXB0aW9ucy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yDQotew0KLSAgICAvKioNCi0gICAgICoNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IHRoZSBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gbWV0YURhdGFFbnRyeSB0aGUgbWV0YSBkYXRhIGVudHJ5IHdoaWNoIGNvbnRhaW5zIHRoZSBtZXRhIGRhdGEgb2YgdGhlIHByb3BlcnR5DQotICAgICAqIEBwYXJhbSBjb252ZXJ0ZWRPYmplY3QgdGhlIGNvbnZlcnRlZCB1c2VyIGlucHV0DQotICAgICAqIEBwYXJhbSB2YWxpZGF0b3JFeGNlcHRpb24gdGhlIGN1cnJlbnQgZXhjZXB0aW9uDQotICAgICAqIEBwYXJhbSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UgdmFsaWRhdGlvbiBzdHJhdGVneSB3aGljaCB0aHJldyB0aGUgZXhjZXB0aW9uDQotICAgICAqIEByZXR1cm4gZmFsc2UgdG8gc3RvcCB0aHJvd2luZyB0aGUgZXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWZjYzRmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlci5Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpbml0Q29tcG9uZW50KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBpZighKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHRvIGluaXQgY29tcG9uZW50ICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5OwotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7Ci0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IgPSBFeHRWYWxVdGlscy5nZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcigpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KS5nZXRNZXRhRGF0YUVudHJpZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOwotCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIXNraXBWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHZhbGlkYXRpb25TdHJhdGVneSwgZW50cnkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IEV4dFZhbFV0aWxzLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KTsKLQotICAgICAgICAgICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcobWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbWV0YURhdGFUcmFuc2Zvcm1lci5jb252ZXJ0TWV0YURhdGEoZW50cnkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYobWV0YURhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMoZW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCBCb29sZWFuLmNsYXNzKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YS5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9nZXQgY29tcG9uZW50IGluaXRpYWxpemVyIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQgYW5kIGNvbmZpZ3VyZSBpdAotICAgICAgICAgICAgICAgIC8vYWxzbyBpbiBjYXNlIG9mIHNraXBwZWQgdmFsaWRhdGlvbiB0byByZXNldCBlLmcuIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiaW5pdCBjb21wb25lbnQgb2YgIiArIHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0ID0gd3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLQotICAgICAgICAvL3JlY29yZGUgdXNlciBpbnB1dCBlLmcuIGZvciBjcm9zcy1jb21wb25lbnQgdmFsaWRhdGlvbgotICAgICAgICBmb3IoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciByZWNvcmRlciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlY29yZGVyLnJlY29yZFVzZXJJbnB1dCh1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsKLQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHJlY29yZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjYWxsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb2Nlc3NWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpCi0gICAgewotICAgICAgICBpZiAoISh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCB2YWxpZGF0aW9uIik7Ci0gICAgICAgIH0KLQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5OwotCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gRXh0VmFsVXRpbHMuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKTsKLQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpLmdldE1ldGFEYXRhRW50cmllcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7Ci0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihza2lwVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uU3RyYXRlZ3ksIGVudHJ5KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJ2YWxpZGF0ZSAiICsgZW50cnkuZ2V0VmFsdWUoKSArICIgd2l0aCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBlbnRyeSwgY29udmVydGVkT2JqZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gdmFsaWRhdGlvbiBzdHJhdGVneSBmb3VuZCBmb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgidmFsaWRhdGlvbiBmaW5pc2hlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2tpcFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgZW50cnkpCi0gICAgewotICAgICAgICAvL292ZXJyaWRlIGZvciBjdXN0b20gc2tpcCB2YWxpZGF0aW9uIHN1cHBvcnQgKGlmIG5lZWRlZCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkMzg2NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbi4gU3ViY2xhc3NlcyBqdXN0IGhhdmUgdG8gbm93IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgbmFtZSBtYXBwZXIuDQotICoNCi0gKiBOYW1lTWFwcGVycyBhcmUgc3RhdGVsZXNzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFQ+IGltcGxlbWVudHMgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJpdmF0ZSBOYW1lTWFwcGVyPFQ+IGN1c3RvbU5hbWVNYXBwZXI7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShUIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGN1c3RvbU5hbWVNYXBwZXIgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpOw0KLQ0KLSAgICAgICAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU5hbWVNYXBwZXIgPSAoTmFtZU1hcHBlcjxUPikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChjdXN0b21OYW1lTWFwcGVyICE9IG51bGwpID8gY3VzdG9tTmFtZU1hcHBlci5jcmVhdGVOYW1lKHNvdXJjZSkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGExNDIzYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBDbGFzc01hcHBpbmdGYWN0b3J5PFAsIFI+DQotew0KLSAgICBSIGNyZWF0ZShQIHNvdXJjZSk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDYwNzhkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgZm9yIG5hbWUgbWFwcGVycy4NCi0gKiBBIG5hbWUgbWFwcGVyIGNhbGN1bGF0ZXMgYSBuYW1lIGZvciBhIGdpdmVuIHNvdXJjZSBvYmplY3QuDQotICogZS5nLiBNZXRhLURhdGEgS2V5IChlLmcuOiBhbm5vdGF0aW9uIGNsYXNzIG5hbWUpIC0+IFZhbGlkYXRpb25TdHJhdGVneQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBOYW1lTWFwcGVyPFQ+DQotew0KLSAgICBTdHJpbmcgY3JlYXRlTmFtZShUIHNvdXJjZSk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL0NvbW1vbk1ldGFEYXRhS2V5cy5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvQ29tbW9uTWV0YURhdGFLZXlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3Y2M0MzEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvQ29tbW9uTWV0YURhdGFLZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGhlbHBlciBmb3IgZnJlcXVlbnQgbWV0YS1kYXRhIGtleXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogcGxhY2VkIGluIGNvcmUgdG8gYXZvaWQgZHVwbGljYXRlZCBpbmZvcm1hdGlvbiBpbiBtdWx0aXBsZSBtb2R1bGVzICh2YWxpZGF0aW9uIG1vZHVsZSBhbmQgY29tcG9uZW50LXN1cHBvcnQgbW9kdWxlKQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBDb21tb25NZXRhRGF0YUtleXMNCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRUQgPSAicmVxdWlyZWQiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQUtfUkVRVUlSRUQgPSAid2Vha19yZXF1aXJlZCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOX0xFTkdUSCA9ICJtaW5fbGVuZ3RoIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfTEVOR1RIID0gIm1heF9sZW5ndGgiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01JTiA9ICJyYW5nZV9taW4iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01BWCA9ICJyYW5nZV9tYXgiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVFRFUk4gPSAicGF0dGVybiI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUVEVSTl9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UgPSAicGF0dGVybl92YWxpZGF0aW9uX2Vycm9yX21lc3NhZ2UiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQUlMID0gImVtYWlsIjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT00gPSAiY3VzdG9tIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lQX1ZBTElEQVRJT04gPSAic2tpcF92YWxpZGF0aW9uIjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvTWV0YURhdGFFbnRyeS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvTWV0YURhdGFFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmNiNThmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL01ldGFEYXRhRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIERhdGEgaG9sZGVyIHdoaWNoIHN0b3JlcyB0aGUgbWV0YS1kYXRhIGFuZCBzb21lIGluZm9ybWF0aW9uIHdoZXJlIHRoZSBtZXRhLWRhdGEgd2FzIGFyb3VuZC4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBNZXRhRGF0YUVudHJ5Ci17Ci0gICAgcHJpdmF0ZSBTdHJpbmcga2V5OwotICAgIHByaXZhdGUgT2JqZWN0IHZhbHVlOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gICAgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIDxUPiBUIGdldFZhbHVlKENsYXNzPFQ+IHRhcmdldENsYXNzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUKWdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmdldChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gVCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVClnZXRQcm9wZXJ0eShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzJmNGE3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGFsbCBmYWN0b3JpZXMgd2hpY2ggY3JlYXRlIG1ldGEtZGF0YSBleHRyYWN0b3JzCi0gKiAKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkKLXsKLSAgICBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGUoKTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRmN2UzMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIGV4dHJhY3RzIG1ldGEtZGF0YSAoZS5nLiB0aGUgYW5ub3RhdGlvbnMpIG9mIHRoZSB2YWx1ZSBiaW5kaW5nIG9mIGEgY29tcG9uZW50LgotICogSXQgZXh0cmFjdHMgdGhlIG1ldGEtZGF0YSBvZiB0aGUgZmllbGQgYW5kIHRoZSBwcm9wZXJ0eS4KLSAqIChBbHNvIHRoZSBhbm5vdGF0aW9ucyBvZiBzdXBlciBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzLikKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvciBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdG9yCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHB1YmxpYyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVG9EbyhQcmlvcml0eS5NRURJVU0pCi0gICAgcHVibGljIFByb3BlcnR5SW5mb3JtYXRpb24gZXh0cmFjdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKCk7Ci0KLSAgICAgICAgLy9zaG91bGQgbmV2ZXIgb2NjdXIKLSAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgVUlDb21wb25lbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkgJiYgb2JqZWN0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihvYmplY3QuZ2V0Q2xhc3MoKSArICIgaXMgbm8gdmFsaWQgY29tcG9uZW50Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50ID0gKFVJQ29tcG9uZW50KSBvYmplY3Q7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgZXh0cmFjdGluZyBtZXRhLWRhdGEgb2YgIiArIHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAocHJvcGVydHlEZXRhaWxzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZ2V0IGJlYW4gY2xhc3MgYW5kIHByb3BlcnR5IG5hbWUKLSAgICAgICAgICovCi0gICAgICAgIENsYXNzIGVudGl0eUNsYXNzID0gcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpOwotCi0gICAgICAgIC8vY3JlYXRlCi0gICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uc2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBmaW5kIGFuZCBhZGQgYW5ub3RhdGlvbnMKLSAgICAgICAgICovCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IGVudGl0eUNsYXNzOwotCi0gICAgICAgIHdoaWxlICghT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY3VycmVudENsYXNzLmdldE5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoY3VycmVudENsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgICAgICBhZGRGaWVsZEFjY2Vzc0Fubm90YXRpb25zKGN1cnJlbnRDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50SW50ZXJmYWNlIDogZW50aXR5Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50SW50ZXJmYWNlOwotCi0gICAgICAgICAgICB3aGlsZSAoY3VycmVudENsYXNzICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhjdXJyZW50Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHRyYWN0IGZpbmlzaGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQotICAgIHsKLSAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHByb3BlcnR5LnN1YnN0cmluZygxKTsKLQotICAgICAgICBNZXRob2QgbWV0aG9kOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRob2QgPSBlbnRpdHkuZ2V0RGVjbGFyZWRNZXRob2QoImdldCIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXRob2QgPSBlbnRpdHkuZ2V0RGVjbGFyZWRNZXRob2QoImlzIiArIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm1ldGhvZCBub3QgZm91bmQgLSBjbGFzczogIiArIGVudGl0eS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtIG1ldGhvZHM6ICIgKyAiZ2V0IiArIHByb3BlcnR5ICsgIiAiICsgImlzIiArIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRBbm5vdGF0aW9uVG9Bbm5vdGF0aW9uRW50cmllcyhBcnJheXMuYXNMaXN0KG1ldGhvZC5nZXRBbm5vdGF0aW9ucygpKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9ucyhDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIEZpZWxkIGZpZWxkOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWVsZCA9IGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpZWxkID0gZW50aXR5LmdldERlY2xhcmVkRmllbGQoIl8iICsgcHJvcGVydHkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJmaWVsZCAiICsgcHJvcGVydHkgKyAiIG9yIF8iICsgcHJvcGVydHkgKyAiIG5vdCBmb3VuZCIsIGUxKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRBbm5vdGF0aW9uVG9Bbm5vdGF0aW9uRW50cmllcyhBcnJheXMuYXNMaXN0KGZpZWxkLmdldEFubm90YXRpb25zKCkpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uVG9Bbm5vdGF0aW9uRW50cmllcygKLSAgICAgICAgTGlzdDxBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucywgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQotICAgIHsKLSAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykKLSAgICAgICAgewotICAgICAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5hZGRNZXRhRGF0YUVudHJ5KGNyZWF0ZU1ldGFEYXRhRW50cnlGb3JBbm5vdGF0aW9uKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGFubm90YXRpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZvdW5kIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWV0YURhdGFFbnRyeSBjcmVhdGVNZXRhRGF0YUVudHJ5Rm9yQW5ub3RhdGlvbihBbm5vdGF0aW9uIGZvdW5kQW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICAgIE1ldGFEYXRhRW50cnkgZW50cnkgPSBuZXcgTWV0YURhdGFFbnRyeSgpOwotCi0gICAgICAgIGVudHJ5LnNldEtleShmb3VuZEFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCkpOwotICAgICAgICBlbnRyeS5zZXRWYWx1ZShmb3VuZEFubm90YXRpb24pOwotCi0gICAgICAgIHJldHVybiBlbnRyeTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4MGQ3OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRoaXMgZmFjdG9yeSBjcmVhdGVzIGEgbWV0YS1kYXRhIGV4dHJhY3RvciB3aGljaCBleHRyYWN0cyB0aGUgbWV0YS1kYXRhCi0gKiBvZiB0aGUgdmFsdWUgYmluZGluZyBvZiBhIGNvbXBvbmVudC4KLSAqIDxwLz4KLSAqIG9yZGVyOjxici8+Ci0gKiA8b2w+Ci0gKiAgIDxsaT5jb25maWd1cmVkIG1ldGEtZGF0YSBleHRyYWN0b3IgKHdlYi54bWwpPC9saT4KLSAqICAgPGxpPmNvbmZpZ3VyZWQgbWV0YS1kYXRhIGV4dHJhY3RvciAoaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbik8L2xpPgotICogICA8bGk+ZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjwvbGk+Ci0gKiA8L29sPgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeQotewotICAgIHByaXZhdGUgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IgPSBudWxsOwotCi0gICAgcHVibGljIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpCi0gICAgcHVibGljIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZSgpCi0gICAgewotICAgICAgICBpZiAobWV0YURhdGFFeHRyYWN0b3IgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IpOwotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IpKTsKLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcy5hZGQoRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3RvciA9IChNZXRhRGF0YUV4dHJhY3RvcikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobWV0YURhdGFFeHRyYWN0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UobWV0YURhdGFFeHRyYWN0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGNyZWF0ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUV4dHJhY3RvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9NZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDQwNTFkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9NZXRhRGF0YUV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotCi0vKioKLSAqIEFuIG1ldGEtZGF0YSBleHRyYWN0b3IgaXMgcmVzcG9uc2libGUgdG8gYW5hbHl6ZSBhbiBvYmplY3QKLSAqIGFuZCByZXR1cm5zIGFsbCBhdmFpbGFibGUgbWV0YS1kYXRhIGluZm9ybWF0aW9uCi0gKiAKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBNZXRhRGF0YUV4dHJhY3RvcgotewotICAgIFByb3BlcnR5SW5mb3JtYXRpb24gZXh0cmFjdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OTkxMmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIGl0J3MganVzdCBhIGhlbHBlciBmb3IgcHJveGllcyAtIHlvdSBqdXN0IG5lZWQgaXQsIGlmIHlvdSBkZWZpbmUgdGhlIGVxdWl2YWxlbnQgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotICoNCi0gKiBpZiB0aGVyZSBpcyBhbHNvIGEgcHJveHkgZm9yIHRoZSBleHRyYWN0b3IgeW91IGNhbiB1c2UgdGhlIGNsYXNzTmFtZSBwcm9wZXJ0eSB0byBtYW51YWxseSByZXBlYXQgdGhlDQotICogZnVsbCBxdWFsaWZpZWQgY2xhc3MgbmFtZS4NCi0gKg0KLSAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBpbnRlcmZhY2UgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyIGV4dGVuZHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbC5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGVhODE5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSBlcXVpdmFsZW50IHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0Lg0KLSAqDQotICogaWYgdGhlcmUgaXMgYWxzbyBhIHByb3h5IGZvciB0aGUgdHJhbnNmb3JtZXIgeW91IGNhbiB1c2UgdGhlIGNsYXNzTmFtZSBwcm9wZXJ0eSB0byBtYW51YWxseSByZXBlYXQgdGhlDQotICogZnVsbCBxdWFsaWZpZWQgY2xhc3MgbmFtZS4NCi0gKg0KLSAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBjbGFzcyBCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lciwgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZTsNCi0NCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lci5jb252ZXJ0TWV0YURhdGEobWV0YURhdGFFbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZShTdHJpbmcgbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lID0gbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFUcmFuc2Zvcm1lciBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFUcmFuc2Zvcm1lcihNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lciA9IG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg5YmMzOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXINCi0gICAgICAgIC5DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyDQotICAgICAgICAuQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcg0KLSAgICAgICAgLkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXINCi0gICAgICAgIC5TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXINCi0gICAgICAgIC5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyB0aGUgTWV0YURhdGFUcmFuc2Zvcm1lciBmb3IgYSBnaXZlbiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogVmFsaWRhdGlvblN0cmF0ZWd5IC0+IE1ldGFEYXRhVHJhbnNmb3JtZXIgaW5zdGVhZCBvZiBNZXRhLURhdGEgLT4gTWV0YURhdGFUcmFuc2Zvcm1lcg0KLSAqIHRvIGF2b2lkIGEgc2Vjb25kIHN0YXRpYyBtYXBwaW5nIGUuZy4gZm9yIGpwYSBhbm5vdGF0aW9ucw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YVRyYW5zZm9ybWVyPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nOw0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gbmFtZU1hcHBlckxpc3QNCi0gICAgICAgID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KCk7DQotDQotICAgIHN0YXRpYw0KLSAgICB7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIG5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGNyZWF0ZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSA9IG51bGw7DQotDQotICAgICAgICAvL3Byb3h5IGNoZWNrDQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGEgcHJveHkgYW5kIHRoZSB1c2FnZSBvZiBhIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICAgICAgICBlbHNlIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lID0gKChCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcil2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZy5jb250YWluc0tleSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKE1ldGFEYXRhVHJhbnNmb3JtZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLmdldCh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgICAgICBTdHJpbmcgdHJhbnNmb3JtZXJOYW1lOw0KLSAgICAgICAgLy9udWxsIC0+IHVzZSBuYW1lIG1hcHBlcnMNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IG5hbWVNYXBwZXIgOiBuYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cmFuc2Zvcm1lck5hbWUgPSBuYW1lTWFwcGVyLmNyZWF0ZU5hbWUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICBpZiAodHJhbnNmb3JtZXJOYW1lID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IChNZXRhRGF0YVRyYW5zZm9ybWVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh0cmFuc2Zvcm1lck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZE1hcHBpbmcodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgdHJhbnNmb3JtZXJOYW1lKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgc3luY2hyb25pemVkIChEZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuY2xhc3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgOg0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0NPTkZJRykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cFN0cmF0ZWd5TWFwcGluZ3MoTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWFwcGluZy5nZXRTb3VyY2UoKSwgbWFwcGluZy5nZXRUYXJnZXQoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0cmFuc2Zvcm1lck5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkaW5nIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWV0YS1kYXRhIHRyYW5zZm9ybWVyIG1hcHBpbmc6ICINCi0gICAgICAgICAgICAgICAgKyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgIiAtPiAiICsgdHJhbnNmb3JtZXJOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHN5bmNocm9uaXplZCAoRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcucHV0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIHRyYW5zZm9ybWVyTmFtZSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTUwNGIyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQWxsb3dzIHRvIHRyYW5zZm9ybSBjb25jcmV0ZSBtZXRhLWRhdGEgdG8gYSBtb3JlIGFic3RyYWN0IGZvcm0uPGJyLz4NCi0gKiBlLmcuOiBAUmVxdWlyZWQsIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwuLi4pLCBATGVuZ3RoKG1pbmltdW0gPSAxKSwgLi4uIC0+IHJlcXVpcmVkID0gdHJ1ZQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLS8vKlRyYW5zZm9ybWVyIGluc3RlYWQgb2YgKkNvbnZlcnRlciB0byBhdm9pZCBuYW1pbmcgY29uZnVzaW9uIA0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YSk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRhZGMxNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NzIyYTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgLSBpZiB0aGVyZSBpcyBhIHByb3h5IGFyb3VuZCB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKChCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcil2YWxpZGF0aW9uU3RyYXRlZ3kpLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1N2IyZDkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1ldGFEYXRhVHJhbnNmb3JtZXJzLg0KLSAqIChjb25maWd1cmVkIHZpYSB3ZWIueG1sKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNhY2QxMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKiAoY29uZmlndXJlZCB2aWEgaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbikNCi0gKiBUaGUgYmVhbiBwcm92aWRlcyB0aGUgZGVmYXVsdCBuYW1lIChjb252ZW50aW9uKS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gZnVsbCBxdWFsaWZpZWQgbmFtZS4gKD0gY3VzdG9taXphYmxlIGNvbnZlbnRpb24pDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMjg2OGYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFwcyBFeHRWYWwgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gTWV0YURhdGFUcmFuc2Zvcm1lcnMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgZ2V0Q2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NWI1M2YuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgdG8gcGxhY2UgVmFsaWRhdGlvblN0cmF0ZWdpZXMgYW5kIE1ldGFEYXRhVHJhbnNmb3JtZXJzIGluIHRoZSBzYW1lIHBhY2thZ2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBnZXRTaW1wbGVNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpICsgIi4iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTaW1wbGVNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwb3N0Zml4ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVgpOw0KLQ0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmVuZHNXaXRoKCJWYWxpZGF0aW9uU3RyYXRlZ3kiKSB8fA0KLSAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmVuZHNXaXRoKCJTdHJhdGVneSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lQYWNrYWdlTmFtZSArIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYKSAscG9zdGZpeCkNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCJWYWxpZGF0aW9uU3RyYXRlZ3kiLCBwb3N0Zml4KQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoIlN0cmF0ZWd5IiwgcG9zdGZpeCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2luIGNhc2Ugb2YgYSBzdGF0aWMgdmFsaWRhdGlvbiBzdHJhdGVneSBtYXBwaW5nDQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUgKyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgKyBwb3N0Zml4Ow0KLSAgICB9DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWY5NDhhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbiBpbXBsZW1lbnRzIFByb3BlcnR5SW5mb3JtYXRpb24KLXsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gaW5mb3JtYXRpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICBwcml2YXRlIExpc3Q8TWV0YURhdGFFbnRyeT4gbWV0YURhdGFMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUVudHJ5PigpOwotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNJbmZvcm1hdGlvbihTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZm9ybWF0aW9uTWFwLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZm9ybWF0aW9uTWFwLmdldChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gVCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVCkgZ2V0SW5mb3JtYXRpb24oa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBpbmZvcm1hdGlvbk1hcC5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGFEYXRhRW50cnlbXSBnZXRNZXRhRGF0YUVudHJpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhTGlzdC50b0FycmF5KG5ldyBNZXRhRGF0YUVudHJ5W21ldGFEYXRhTGlzdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXRhRGF0YUVudHJ5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkKLSAgICB7Ci0gICAgICAgIG1ldGFEYXRhRW50cnkuc2V0UHJvcGVydGllcyh0aGlzLmluZm9ybWF0aW9uTWFwKTsKLSAgICAgICAgdGhpcy5tZXRhRGF0YUxpc3QuYWRkKG1ldGFEYXRhRW50cnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlEZXRhaWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MDM3Y2YuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlEZXRhaWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlEZXRhaWxzCi17Ci0gICAgLy9mb3JtcyB0aGUgaWQgZm9yIGNyb3NzLXZhbGlkYXRpb24gd2l0aGluIGNvbXBsZXggY29tcG9uZW50cwotICAgIHByaXZhdGUgU3RyaW5nIGtleTsKLSAgICBwcml2YXRlIE9iamVjdCBiYXNlT2JqZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5OwotCi0gICAgcHVibGljIFByb3BlcnR5RGV0YWlscyhTdHJpbmcga2V5LCBPYmplY3QgYmFzZU9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICAgIHRoaXMuYmFzZU9iamVjdCA9IGJhc2VPYmplY3Q7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gICAgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRCYXNlT2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VPYmplY3QoT2JqZWN0IGJhc2VPYmplY3QpCi0gICAgewotICAgICAgICB0aGlzLmJhc2VPYmplY3QgPSBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MTczZTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUluZm9ybWF0aW9uCi17Ci0gICAgYm9vbGVhbiBjb250YWluc0luZm9ybWF0aW9uKFN0cmluZyBrZXkpOwotICAgIE9iamVjdCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5KTsKLSAgICA8VD4gVCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcyk7Ci0gICAgdm9pZCBzZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpOwotCi0gICAgTWV0YURhdGFFbnRyeVtdIGdldE1ldGFEYXRhRW50cmllcygpOwotICAgIHZvaWQgYWRkTWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZTkyNWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlJbmZvcm1hdGlvbktleXMKLXsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFVEFJTFMgPSAicHJvcGVydHlfZGV0YWlscyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lQX1ZBTElEQVRJT04gPSAic2tpcF92YWxpZGF0aW9uIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gImxhYmVsIjsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlY29yZGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlY29yZGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwZjIzZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZWNvcmRlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotCi0vKioKLSAqIEFsbG93cyB0byBjYXB0dXJlIGNvbnZlcnRlZCB2YWx1ZXMuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIKLXsKLSAgICB2b2lkIHJlY29yZFVzZXJJbnB1dChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGMxZjkzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkNsYXNzTWFwcGluZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotCi0vKioKLSAqIEJhc2UgZm9yIGFsbCBSZW5kZXJLaXRXcmFwcGVyRmFjdG9yaWVzIHRvIGZvcmNlIGEgc3BlY2lmaWMgYmVoYXZpb3VyCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8UmVuZGVyS2l0LCBSZW5kZXJLaXQ+Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHdyYXBwZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRlYWN0aXZhdGVkID0gZmFsc2U7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgcmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGhpcy53cmFwcGVkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMud3JhcHBlZC5hZGRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeShyZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLndyYXBwZWQgPSByZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGRlYWN0aXZhdGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmRlYWN0aXZhdGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlYWN0aXZhdGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWFjdGl2YXRlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgUmVuZGVyS2l0IGNyZWF0ZShSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgaWYoaXNEZWFjdGl2YXRlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFJlbmRlcktpdCByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIGlmKHRoaXMud3JhcHBlZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSB0aGlzLndyYXBwZWQuY3JlYXRlKHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVdyYXBwZXIocmVuZGVyS2l0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFJlbmRlcktpdCBjcmVhdGVXcmFwcGVyKFJlbmRlcktpdCByZW5kZXJLaXQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3ZTA1MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ci17Ci0gICAgcHJpdmF0ZSBSZW5kZXJLaXQgcmVuZGVyS2l0OwotCi0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCBjcmVhdGVXcmFwcGVyKFJlbmRlcktpdCByZW5kZXJLaXQpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVya2l0IHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcktpdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLnJlbmRlcktpdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnJlbmRlcktpdCA9IG5ldyBFeHRWYWxSZW5kZXJLaXQocmVuZGVyS2l0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJLaXQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxMYXp5UmVuZGVyZXJQcm94eS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbExhenlSZW5kZXJlclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMzYyODcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbExhenlSZW5kZXJlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotCi0vKioKLSAqIHRvIHN1cHBvcnQgYSBjdXN0b20gcHJveHkKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkgZXh0ZW5kcyBSZW5kZXJlcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIFJlbmRlcmVyIHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSByZW5kZXJlcjsKLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzaW1wbGUgcHJveHkgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZXRMYXp5UmVuZGVyZXIoKS5lbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZXRMYXp5UmVuZGVyZXIoKS5lbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydENsaWVudElkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldExhenlSZW5kZXJlcigpLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGdldFJlbmRlcnNDaGlsZHJlbigpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRMYXp5UmVuZGVyZXIoKS5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlbmRlcmVyIGdldExhenlSZW5kZXJlcigpCi0gICAgewotICAgICAgICBTdHJpbmcgcHJveHlDbGFzc05hbWUgPSAoU3RyaW5nKSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSk7Ci0KLSAgICAgICAgaWYocHJveHlDbGFzc05hbWUgIT0gbnVsbCAmJiAhcHJveHlDbGFzc05hbWUuZW5kc1dpdGgoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKHByb3h5Q2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgaWYodGFyZ2V0Q2xhc3MgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhIGN1c3RvbSBpbnZhbGlkIHJlbmRlcmVyIHByb3h5IGlzIGNvbmZpZ3VyZWQ6ICIgKyBwcm94eUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENsYXNzW10gYXJnQ2xhc3NlcyA9IG5ldyBDbGFzc1sxXTsKLSAgICAgICAgICAgIGFyZ0NsYXNzZXNbMF0gPSBSZW5kZXJlci5jbGFzczsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSB0YXJnZXRDbGFzcy5nZXRDb25zdHJ1Y3RvcihhcmdDbGFzc2VzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFJlbmRlcmVyKWNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBjcmVhdGU6ICIgKyB0YXJnZXRDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkOwotICAgICAgICB9Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjM1NGU1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VTdHJlYW07Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVdyaXRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVzcG9uc2VTdGF0ZU1hbmFnZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJLaXQgZXh0ZW5kcyBSZW5kZXJLaXQKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgd3JhcHBlZDsKLQotICAgIHB1YmxpYyBFeHRWYWxSZW5kZXJLaXQoUmVuZGVyS2l0IHdyYXBwZWQpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOwotCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICBpZiAocmVuZGVyZXIgaW5zdGFuY2VvZiBFeHRWYWxSZW5kZXJlcldyYXBwZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIHJlbmRlcmVyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIGNyZWF0ZVdyYXBwZXIocmVuZGVyZXIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBSZW5kZXJlciBnZXRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSB3cmFwcGVkLmdldFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlKTsKLQotICAgICAgICBpZihyZW5kZXJlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyZXIgaW5zdGFuY2VvZiBFeHRWYWxSZW5kZXJlcldyYXBwZXIgPyByZW5kZXJlciA6IGNyZWF0ZVdyYXBwZXIocmVuZGVyZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCJubyByZW5kZXJlciBmb3VuZCBmb3IgZmFtaWx5ICIgKyBmYW1pbHkgKyAiIGFuZCB0eXBlICIgKyByZW5kZXJlclR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlbmRlcmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZVN0YXRlTWFuYWdlciBnZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZVdyaXRlciBjcmVhdGVSZXNwb25zZVdyaXRlcihXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcywgU3RyaW5nIHMxKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY3JlYXRlUmVzcG9uc2VXcml0ZXIod3JpdGVyLCBzLCBzMSk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlU3RyZWFtIGNyZWF0ZVJlc3BvbnNlU3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jcmVhdGVSZXNwb25zZVN0cmVhbShvdXRwdXRTdHJlYW0pOwotICAgIH0KLQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIGNyZWF0ZVdyYXBwZXIoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEV4dFZhbFJlbmRlcmVyV3JhcHBlcihyZW5kZXJlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyODJiYmMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeTsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBjZW50cmFsIG1lY2hhbmlzbSB3aGljaCBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgYSB3cmFwcGVyIGZvciBhIHJlbmRlcmVyIC0gc3RhcnRpbmcgcG9pbnQgb2YgZXh0dmFsLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeSBleHRlbmRzIFJlbmRlcktpdEZhY3RvcnkKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotICAgIHByaXZhdGUgUmVuZGVyS2l0RmFjdG9yeSB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcktpdEZhY3RvcnkoUmVuZGVyS2l0RmFjdG9yeSByZW5kZXJLaXRGYWN0b3J5KQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyS2l0RmFjdG9yeTsKLQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcktpdChTdHJpbmcgcywgUmVuZGVyS2l0IHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIHdyYXBwZWQuYWRkUmVuZGVyS2l0KHMsIHJlbmRlcktpdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlbmRlcktpdCBnZXRSZW5kZXJLaXQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICBSZW5kZXJLaXQgcmVuZGVyS2l0ID0gdGhpcy53cmFwcGVkLmdldFJlbmRlcktpdChmYWNlc0NvbnRleHQsIHMpOwotCi0gICAgICAgIC8vanNmIHJpICsgdHJpbmlkYWQKLSAgICAgICAgaWYocmVuZGVyS2l0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSB3cmFwcGVyRmFjdG9yeSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgIC8vc29tZSBjb21wb25lbnQgbGlicyBlLmcuIG15ZmFjZXMtdHJpbmlkYWQgYXJlbid0IGNvbXBhdGlibGUgd2l0aCB0aGlzIGNsZWFuIGFwcHJvYWNoCi0gICAgICAgIC8vZXhhbXBsZSBzZWUgVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIKLSAgICAgICAgaWYod3JhcHBlckZhY3RvcnkuaXNEZWFjdGl2YXRlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJGYWN0b3J5LmNyZWF0ZShyZW5kZXJLaXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGdldFJlbmRlcktpdElkcygpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZW5kZXJLaXRJZHMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NDk5NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogdG8gYXZvaWQgbXVsdGlwbGUgY2FsbHMgb2YgcmVuZGVyZXIgbWV0aG9kcyB3aXRoaW4gcmVuZGVyZXIgaW50ZXJjZXB0b3JzIChlLmcuIGZvciBlbmNvZGUsIGRlY29kZSwuLi4pCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJlclByb3h5IGV4dGVuZHMgUmVuZGVyZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVkgPSBFeHRWYWxSZW5kZXJlclByb3h5LmNsYXNzLmdldE5hbWUoKSArICI6S0VZIjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotICAgIAotICAgIHByb3RlY3RlZCBSZW5kZXJlciB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcmVyUHJveHkoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSByZW5kZXJlcjsKLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eUVudHJ5IGVudHJ5ID0gZ2V0T3JJbml0RW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0RlY29kZUNhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXREZWNvZGVDYWxsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB3cmFwcGVkLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZG91YmxlIGNhbGwgb2YgbWV0aG9kICdkZWNvZGUnIGZpbHRlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5RW50cnkgZW50cnkgPSBnZXRPckluaXRFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRW5jb2RlQmVnaW5DYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RW5jb2RlQmVnaW5DYWxsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkb3VibGUgY2FsbCBvZiBtZXRob2QgJ2VuY29kZUJlZ2luJyBmaWx0ZXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eUVudHJ5IGVudHJ5ID0gZ2V0T3JJbml0RW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0VuY29kZUNoaWxkcmVuQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldEVuY29kZUNoaWxkcmVuQ2FsbGVkKHRydWUpOwotICAgICAgICAgICAgd3JhcHBlZC5lbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZG91YmxlIGNhbGwgb2YgbWV0aG9kICdlbmNvZGVDaGlsZHJlbicgZmlsdGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5RW50cnkgZW50cnkgPSBnZXRPckluaXRFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRW5jb2RlRW5kQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldEVuY29kZUVuZENhbGxlZCh0cnVlKTsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkb3VibGUgY2FsbCBvZiBtZXRob2QgJ2VuY29kZUVuZCcgZmlsdGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydENsaWVudElkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udmVydENsaWVudElkKGZhY2VzQ29udGV4dCwgcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UmVuZGVyc0NoaWxkcmVuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5RW50cnkgZW50cnkgPSBnZXRPckluaXRFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoZW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh3cmFwcGVkLmdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8pKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZG91YmxlIGNhbGwgb2YgbWV0aG9kICdnZXRDb252ZXJ0ZWRWYWx1ZScgZmlsdGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlbmRlcmVyUHJveHlFbnRyeSBnZXRPckluaXRFbnRyeShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGtleSArPSBnZXRPcHRpb25hbEtleShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWdldE9ySW5pdENvbXBvbmVudFByb3h5TWFwcGluZygpLmNvbnRhaW5zS2V5KGtleSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldE9ySW5pdENvbXBvbmVudFByb3h5TWFwcGluZygpLnB1dChrZXksIG5ldyBSZW5kZXJlclByb3h5RW50cnkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldE9ySW5pdENvbXBvbmVudFByb3h5TWFwcGluZygpLmdldChrZXkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3B0aW9uYWxLZXkoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX1NUT1JBR0VfTkFNRSA9IEV4dFZhbFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpICsgIjpTVE9SQUdFIjsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eUVudHJ5PiBnZXRPckluaXRDb21wb25lbnRQcm94eU1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgTWFwIHJlcXVlc3RNYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpOwotCi0gICAgICAgIGlmKCFyZXF1ZXN0TWFwLmNvbnRhaW5zS2V5KFBST1hZX1NUT1JBR0VfTkFNRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcXVlc3RNYXAucHV0KFBST1hZX1NUT1JBR0VfTkFNRSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5RW50cnk+PigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlFbnRyeT4+IHByb3h5U3RvcmFnZSA9Ci0gICAgICAgICAgICAoKE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlFbnRyeT4+KXJlcXVlc3RNYXAuZ2V0KFBST1hZX1NUT1JBR0VfTkFNRSkpOwotCi0gICAgICAgIFN0cmluZyBrZXkgPSB0aGlzLndyYXBwZWQuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0KLSAgICAgICAgaWYoIXByb3h5U3RvcmFnZS5jb250YWluc0tleShrZXkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm94eVN0b3JhZ2UucHV0KGtleSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5RW50cnk+KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByb3h5U3RvcmFnZS5nZXQoa2V5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YzMwNWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlJlbmRlcmVySW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci0KLS8qKgotICogRGVmYXVsdCBhcHByb2FjaCB0byBhdm9pZCBwcm94aWVzIGZvciBjb252ZXJ0ZXJzIGFuZCB0aGUgYWRhcHRlciBmYWxsYmFjay4KLSAqIEl0IHJlcXVpcmVzIHRoYXQgY29tcG9uZW50cyBkZWxlZ2F0ZSBnZXRDb252ZXJ0ZWRWYWx1ZSB0byBhIHJlbmRlcmVyLjxici8+Ci0gKiBJZiBpdCBpc24ndCB0aGUgY2FzZSBmb3IgeW91ciBjb21wb25lbnQgbGliIHVzZToKLSAqIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5LkV4dFZhbEFwcGxpY2F0aW9uRmFjdG9yeTxici8+Ci0gKiBhbmQ8YnIvPgotICogb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHkuUHJveHlNYXBwaW5nUGhhc2VMaXN0ZW5lcgotICogPHAvPgotICogVGhpcyB3cmFwcGVyIHdpbGwgYWxzbyBpbXBsZW1lbnQgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBiZWhhdmlvdXIKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcmVyV3JhcHBlciBleHRlbmRzIFJlbmRlcmVyCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByb3RlY3RlZCBSZW5kZXJlciB3cmFwcGVkOwotICAgIHByb3RlY3RlZCBFeHRWYWxDb250ZXh0IGV4dFZhbENvbnRleHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKTsKLQotICAgIHB1YmxpYyBFeHRWYWxSZW5kZXJlcldyYXBwZXIoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICBTdHJpbmcgcHJveHlDbGFzc05hbWUgPSAoU3RyaW5nKUV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZKTsKLQotICAgICAgICBpZihwcm94eUNsYXNzTmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm5vIGV4dHZhbCByZW5kZXJlciBwcm94eSBjb25maWd1cmVkIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRoaXMud3JhcHBlZCA9IG5ldyBFeHRWYWxMYXp5UmVuZGVyZXJQcm94eShyZW5kZXJlcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKHByb3h5Q2xhc3NOYW1lKTsKLQotICAgICAgICBpZih0YXJnZXRDbGFzcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm5vIGV4dHZhbCByZW5kZXJlciBwcm94eSBjb25maWd1cmVkIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRoaXMud3JhcHBlZCA9IG5ldyBFeHRWYWxMYXp5UmVuZGVyZXJQcm94eShyZW5kZXJlcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBDbGFzc1tdIGFyZ0NsYXNzZXMgPSBuZXcgQ2xhc3NbMV07Ci0gICAgICAgIGFyZ0NsYXNzZXNbMF0gPSBSZW5kZXJlci5jbGFzczsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSB0YXJnZXRDbGFzcy5nZXRDb25zdHJ1Y3RvcihhcmdDbGFzc2VzKTsKLSAgICAgICAgICAgIHRoaXMud3JhcHBlZCA9IChSZW5kZXJlciljb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShyZW5kZXJlcik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJubyBleHR2YWwgcmVuZGVyZXIgcHJveHkgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImV4dHZhbCByZW5kZXJlciB3cmFwcGVyIGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSB0cnVlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVEZWNvZGUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVEZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImRlY29kZSBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVEZWNvZGUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVEZWNvZGUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5kZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJEZWNvZGUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJEZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckRlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRGVjb2RlIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVFbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZW5jb2RlQmVnaW4gZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlQmVnaW4gaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5lbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQmVnaW4gaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBlbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSB0cnVlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVFbmNvZGVDaGlsZHJlbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJlbmNvZGVDaGlsZHJlbiBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVDaGlsZHJlbiBvZiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlQ2hpbGRyZW4gaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5lbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckVuY29kZUNoaWxkcmVuIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUNoaWxkcmVuIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVDaGlsZHJlbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSB0cnVlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVFbmNvZGVFbmQgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVFbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImVuY29kZUVuZCBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVFbmQgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlRW5kIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVFbmQgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUVuZCBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY29udmVydENsaWVudElkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udmVydENsaWVudElkKGZhY2VzQ29udGV4dCwgcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZ2V0UmVuZGVyc0NoaWxkcmVuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSB0cnVlOwotICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0ID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlR2V0Q29udmVydGVkVmFsdWUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvLCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udmVydGVkT2JqZWN0ID0gZS5nZXRSZXR1cm5WYWx1ZU9uRXhjZXB0aW9uKGNvbnZlcnRlZE9iamVjdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZ2V0Q29udmVydGVkVmFsdWUgZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlR2V0Q29udmVydGVkVmFsdWUgb2YgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUdldENvbnZlcnRlZFZhbHVlIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdCA9IHdyYXBwZWQuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8sIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyR2V0Q29udmVydGVkVmFsdWUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9SZW5kZXJlclByb3h5RW50cnkuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9SZW5kZXJlclByb3h5RW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDllNTdmOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvUmVuZGVyZXJQcm94eUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgUmVuZGVyZXJQcm94eUVudHJ5Ci17Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRlY29kZUNhbGxlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVCZWdpbkNhbGxlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVDaGlsZHJlbkNhbGxlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVFbmRDYWxsZWQgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgT2JqZWN0IGNvbnZlcnRlZFZhbHVlID0gbnVsbDsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVjb2RlQ2FsbGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWNvZGVDYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVjb2RlQ2FsbGVkKGJvb2xlYW4gZGVjb2RlQ2FsbGVkKQotICAgIHsKLSAgICAgICAgdGhpcy5kZWNvZGVDYWxsZWQgPSBkZWNvZGVDYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmNvZGVCZWdpbkNhbGxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZW5jb2RlQmVnaW5DYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlQmVnaW5DYWxsZWQoYm9vbGVhbiBlbmNvZGVCZWdpbkNhbGxlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZW5jb2RlQmVnaW5DYWxsZWQgPSBlbmNvZGVCZWdpbkNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuY29kZUNoaWxkcmVuQ2FsbGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbmNvZGVDaGlsZHJlbkNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVDaGlsZHJlbkNhbGxlZChib29sZWFuIGVuY29kZUNoaWxkcmVuQ2FsbGVkKQotICAgIHsKLSAgICAgICAgdGhpcy5lbmNvZGVDaGlsZHJlbkNhbGxlZCA9IGVuY29kZUNoaWxkcmVuQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlRW5kQ2FsbGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbmNvZGVFbmRDYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlRW5kQ2FsbGVkKGJvb2xlYW4gZW5jb2RlRW5kQ2FsbGVkKQotICAgIHsKLSAgICAgICAgdGhpcy5lbmNvZGVFbmRDYWxsZWQgPSBlbmNvZGVFbmRDYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkVmFsdWUoT2JqZWN0IGNvbnZlcnRlZFZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy5jb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMyZWVmOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZTk2Y2YuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzN2M2NGEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUmVuZGVyZXJJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gICAgcHJvdGVjdGVkIFJlbmRlcmVySW50ZXJjZXB0b3IgZXhjZXB0aW9uU291cmNlOwotICAgIHByb3RlY3RlZCBPYmplY3QgaW5mb3JtYXRpb247Ci0gICAgYm9vbGVhbiBza2lwT3RoZXJJbnRlcmNlcHRvcnMgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oYm9vbGVhbiBza2lwT3RoZXJJbnRlcmNlcHRvcnMpCi0gICAgewotICAgICAgICB0aGlzLnNraXBPdGhlckludGVyY2VwdG9ycyA9IHNraXBPdGhlckludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbihib29sZWFuIHNraXBPdGhlckludGVyY2VwdG9ycywgUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgdGhpcyhza2lwT3RoZXJJbnRlcmNlcHRvcnMpOwotICAgICAgICB0aGlzLmV4Y2VwdGlvblNvdXJjZSA9IHJlbmRlcmVySW50ZXJjZXB0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5mb3JtYXRpb24oT2JqZWN0IGluZm9ybWF0aW9uKQotICAgIHsKLSAgICAgICAgdGhpcy5pbmZvcm1hdGlvbiA9IGluZm9ybWF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZm9ybWF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBza2lwT3RoZXJJbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRSZXR1cm5WYWx1ZU9uRXhjZXB0aW9uKE9iamVjdCBjdXJyZW50UmV0dXJuVmFsdWUpCi0gICAgewotICAgICAgICBpZih0aGlzLmV4Y2VwdGlvblNvdXJjZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5leGNlcHRpb25Tb3VyY2UuZ2V0UmV0dXJuVmFsdWVPblNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24odGhpcywgY3VycmVudFJldHVyblZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3VycmVudFJldHVyblZhbHVlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0Fic3RyYWN0U3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0Fic3RyYWN0U3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMDk4YmMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogSW4gb3JkZXIgdG8gZXhlY3V0ZSBsb2dpYyBqdXN0IG9uY2UuDQotICogZS5nLiByZWdpc3RlciBhcnRpZmFjdHMgdmlhIGFwaQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICAvL2Rvbid0IHJlbW92ZSAtIGl0J3MgYSBmYWxsYmFjayBpZiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCBkZXJlZ2lzdHJhdGlvbg0KLSAgICAvL3RhcmdldDogZG9uJ3QgcHJvY2VzcyBpbml0IGxvZ2ljIG1vcmUgdGhhbiBvbmNlDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8Q2xhc3M+IGluaXRpYWxpemVkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKEFic3RyYWN0U3RhcnR1cExpc3RlbmVyLmNsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZWRMaXN0ZW5lcnMuY29udGFpbnMoZ2V0Q2xhc3MoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnQgaW5pdCBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiaW5pdCBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZmluYWxseQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEpzZlV0aWxzLmRlcmVnaXN0ZXJQaGFzZUxpc3RlbmVyKHRoaXMpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiYW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGRlcmVnaXN0ZXJpbmcgdGhlIHBoYXNlLWxpc3RlbmVyIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRDbGFzcygpLmdldE5hbWUoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC0+IHRoZXJlIGlzIGp1c3QgYSBsaXR0bGUgb3ZlcmhlYWQsIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJ1dCBldmVyeXRoaW5nIGVsc2Ugd29ya3MgY29ycmVjdGx5LiINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBob3dldmVyLCBwbGVhc2UgaW5mb3JtIHRoZSBjb21tdW5pdHkgYWJvdXQgeW91ciBjb25maWd1cmF0aW9uIiwgdCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZmluYWxseQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZExpc3RlbmVycy5hZGQoZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLlJFU1RPUkVfVklFVzsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0KCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0V4dFZhbFN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWFhNzI3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcgotewotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmluZm8oInN0YXJ0aW5nIHVwIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgdiIgKyBFeHRWYWxJbmZvcm1hdGlvbi5WRVJTSU9OKTsKLSAgICAgICAgfQotCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgVmFsaWRhdGlvbkludGVyY2VwdG9yKCkpOwotCi0gICAgICAgIGV4ZWN1dGVDdXN0b21TdGFydHVwTGlzdGVuZXIoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUN1c3RvbVN0YXJ0dXBMaXN0ZW5lcigpCi0gICAgewotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSwgRXh0VmFsUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCksIGZhbHNlKTsKLQotICAgICAgICBTdHJpbmcgY3VzdG9tU3RhcnR1cExpc3RlbmVyTmFtZSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBUlRVUF9MSVNURU5FUik7Ci0gICAgICAgIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lciA9Ci0gICAgICAgICAgICAoQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGN1c3RvbVN0YXJ0dXBMaXN0ZW5lck5hbWUpOwotCi0gICAgICAgIGlmKGN1c3RvbVN0YXJ0dXBMaXN0ZW5lciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydCBpbml0IG9mICIgKyBjdXN0b21TdGFydHVwTGlzdGVuZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjdXN0b21TdGFydHVwTGlzdGVuZXIuaW5pdCgpOwotCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJpbml0IG9mICIgKyBjdXN0b21TdGFydHVwTGlzdGVuZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2M4MDViLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7DQotDQotLyoqDQotICogTWVzc2FnZVJlc29sdmVyIHdoaWNoIHVzZXMgcHJvcGVydHkgZmlsZXMuDQotICogU3ViY2xhc3NlcyBqdXN0IGhhdmUgdG8gcHJvdmlkZSB0aGUgcGFja2FnZSB0byBsb29rIGF0Lg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIGNhbiBhbHNvIHByb3ZpZGUgYSBjdXN0b20gbmFtZSB3aGljaCBpcyBlLmcuIGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciBpbXBsZW1lbnRzIE1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIgPSAiPz8/IjsNCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0RFRkFVTFRfQ09OVkVOVElPTjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZGVmYXVsdEJ1bmRsZSA9IG51bGw7DQotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VCdW5kbGVCYXNlTmFtZTsNCi0gICAgLy93aXRoIGpzZiAxLjEgb25seSBhdmFpbGFibGUgaWYgdGhlcmUgaXMgYSBjdXN0b20gYmVhbg0KLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlQnVuZGxlVmFyTmFtZTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGtleSA9PSBudWxsIHx8IGtleS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIGN1c3RvbU1lc3NhZ2UgPSBudWxsOw0KLQ0KLSAgICAgICAgLy9vbmx5IGluIGNhc2Ugb2YgYSBWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggaXMgY29uZmlndXJlZCBhcyBiZWFuDQotICAgICAgICBpZiAodGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSh0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSwgbG9jYWxlKTsNCi0gICAgICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm1lc3NhZ2UgYnVuZGxlICIgKyB0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSArICIgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvL29ubHkgaW4gY2FzZSBvZiBhIFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciB3aGljaCBpcyBjb25maWd1cmVkIGFzIGJlYW4NCi0gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VCdW5kbGVWYXJOYW1lICE9IG51bGwgJiYgY3VzdG9tTWVzc2FnZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gKFJlc291cmNlQnVuZGxlKSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4obWVzc2FnZUJ1bmRsZVZhck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigibWVzc2FnZSBidW5kbGUgdmFyIG5hbWUgIiArIHRoaXMubWVzc2FnZUJ1bmRsZVZhck5hbWUgKyAiIG5vdCBmb3VuZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGN1c3RvbU1lc3NhZ2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qDQotICAgICAgICAgKiB0cnkgdG8gdXNlIHRoZSBjb252ZW50aW9uIGZvciB0aGUgbWVzc2FnZSBidW5kbGUNCi0gICAgICAgICAqLw0KLSAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHRyeVRvVXNlTWVzc2FnZUJ1bmRsZUNvbnZlbnRpb24oa2V5LCBsb2NhbGUpOw0KLQ0KLSAgICAgICAgaWYgKGN1c3RvbU1lc3NhZ2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qDQotICAgICAgICAgKiBubyBtZXNzYWdlIGJ1bmRsZSBvciBtZXNzYWdlIGZvdW5kICh3aXRoIHRoZSBjb252ZW50aW9uKT8NCi0gICAgICAgICAqLw0KLQ0KLSAgICAgICAgLy90cnkgdG8gbG9hZCBjdXN0b20gbWVzc2FnZXMNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEN1c3RvbUJhc2VOYW1lKCksIGxvY2FsZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyBjdXN0b20gbWVzc2FnZSBmb3IgIiArIGtleSArICIgd2l0aGluICIgKyBnZXRDdXN0b21CYXNlTmFtZSgpLCBlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vdXNlIGN1c3RvbSBuYW1lIChpZiBwb3NzaWJsZSkgb3RoZXJ3aXNlOiBmYWxsYmFjayB0byBkZWZhdWx0IG1lc3NhZ2UgKGlmIHBvc3NpYmxlKQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChjdXN0b21NZXNzYWdlICE9IG51bGwpID8gY3VzdG9tTWVzc2FnZQ0KLSAgICAgICAgICAgICAgICA6IChnZXRCYXNlTmFtZSgpICE9IG51bGwpID8gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEJhc2VOYW1lKCksIGxvY2FsZSkuZ2V0U3RyaW5nKGtleSkgOiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBNSVNTSU5HX1JFU09VUkNFX01BUktFUiArIGtleSArIE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvVXNlTWVzc2FnZUJ1bmRsZUNvbnZlbnRpb24oU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1c3RvbU1lc3NhZ2UgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKChkZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb24gPT0gbnVsbCB8fCAhZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgICAgICAmJiBpc0RlZmF1bHRNZXNzYWdlQnVuZGxlQ29udmVudGlvbkFjdGl2ZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChkZWZhdWx0QnVuZGxlID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX0JVTkRMRV9OQU1FKSwgbG9jYWxlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZw0KLSAgICAgICAgICAgICAgICAgICAgZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID0gInRydWUiOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChkZWZhdWx0QnVuZGxlICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IGRlZmF1bHRCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGVmYXVsdE1lc3NhZ2VCdW5kbGVDb252ZW50aW9uQWN0aXZlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRCYXNlTmFtZSgpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUJ1bmRsZUJhc2VOYW1lKFN0cmluZyBtZXNzYWdlQnVuZGxlQmFzZU5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lID0gbWVzc2FnZUJ1bmRsZUJhc2VOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VCdW5kbGVWYXJOYW1lKFN0cmluZyBtZXNzYWdlQnVuZGxlVmFyTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSA9IG1lc3NhZ2VCdW5kbGVWYXJOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyODEwYWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS4NCi0gICAgICAgIHJlc29sdmVyLm1hcHBlci5DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS4NCi0gICAgICAgIHJlc29sdmVyLm1hcHBlci5DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS4NCi0gICAgICAgIHJlc29sdmVyLm1hcHBlci5EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS4NCi0gICAgICAgIHJlc29sdmVyLm1hcHBlci5EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS4NCi0gICAgICAgIHJlc29sdmVyLm1hcHBlci5TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyBhIE1lc3NhZ2VSZXNvbHZlciBmb3IgYSBnaXZlbiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJhZGQgZ2VuZXJpYyBqYXZhIGFwaSAoZGUtL3JlZ2lzdGVyIG1hcHBpbmcpIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeSBpbXBsZW1lbnRzDQotICAgIENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXNzYWdlUmVzb2x2ZXI+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZzsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IG5hbWVNYXBwZXJMaXN0ID0NCi0gICAgICAgIG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PigpOw0KLQ0KLSAgICBzdGF0aWMNCi0gICAgew0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIG5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBEZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7DQotICAgICAgICBuYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1lc3NhZ2VSZXNvbHZlciBjcmVhdGUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHN0cmF0ZWd5TmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0NCi0gICAgICAgIGlmIChzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmcgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljTWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmcuY29udGFpbnNLZXkoc3RyYXRlZ3lOYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKE1lc3NhZ2VSZXNvbHZlcikgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmcuZ2V0KHN0cmF0ZWd5TmFtZSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcjsNCi0gICAgICAgIFN0cmluZyByZXNvbHZlck5hbWU7DQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiBuYW1lTWFwcGVyIDogbmFtZU1hcHBlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9idWlsZCBjb252ZW50aW9uIChWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIpDQotICAgICAgICAgICAgcmVzb2x2ZXJOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKHZhbGlkYXRpb25TdHJhdGVneSk7DQotDQotICAgICAgICAgICAgLy9uYW1lIHdhc24ndCBtYXBwZWQNCi0gICAgICAgICAgICBpZiAocmVzb2x2ZXJOYW1lID09IG51bGwgfHwgdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscyhyZXNvbHZlck5hbWUpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIG1lc3NhZ2VSZXNvbHZlciA9IChNZXNzYWdlUmVzb2x2ZXIpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShyZXNvbHZlck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtZXNzYWdlUmVzb2x2ZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFkZE1hcHBpbmcoc3RyYXRlZ3lOYW1lLCByZXNvbHZlck5hbWUpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHJlc29sdmVyTmFtZSArICIgdXNlZCBmb3IgIiArIHN0cmF0ZWd5TmFtZSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VSZXNvbHZlcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBhZGRNYXBwaW5nKHN0cmF0ZWd5TmFtZSwgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIHN5bmNocm9uaXplZCAoRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuY2xhc3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotDQotICAgICAgICAgICAgLy9zZXR1cCBpbnRlcm5hbCBzdGF0aWMgbWFwcGluZ3MNCi0gICAgICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX0NPTkZJRykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cFN0cmF0ZWd5TWFwcGluZ3MoTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhtYXBwaW5nLmdldFNvdXJjZSgpLCBtYXBwaW5nLmdldFRhcmdldCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgbWVzc2FnZVJlc29sdmVyTmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZGRpbmcgc3RhdGljIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWVzc2FnZSByZXNvbHZlciBtYXBwaW5nOiAiDQotICAgICAgICAgICAgICAgICsgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArICIgLT4gIiArIG1lc3NhZ2VSZXNvbHZlck5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc3luY2hyb25pemVkIChEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5jbGFzcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmcucHV0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIG1lc3NhZ2VSZXNvbHZlck5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzllZGM2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IE1lc3NhZ2VSZXNvbHZlciB3aGljaCB1c2VzIHRoZSBkZWZhdWx0IGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gbWVzc2FnZSBidW5kbGUgdmlhIHdlYi54bWwNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CVU5ETEUgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FU1NBR0VfQlVORExFOw0KLQ0KLSAgICAvL25vdCB1c2VkIGF0IHRoZSBtb21lbnQgLSBqdXN0IGZvciBhIGNvbnZlbnRpb24NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNb2R1bGVNZXNzYWdlQnVuZGxlTmFtZShnZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tQmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ1VTVE9NX0JVTkRMRTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjY2ExYzEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL01lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBNZXNzYWdlUmVzb2x2ZXJzIGluZGVwZW5kZW50IG9mIHRoZSBtZXNzYWdlIHNvdXJjZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkNDBiNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDc0MDFhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXNzYWdlUmVzb2x2ZXJzLg0KLSAqIChjb25maWd1cmVkIHZpYSB3ZWIueG1sKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM3MjAzNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ3kgdG8gTWVzc2FnZVJlc29sdmVyLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NU0dfUkVTT0xWRVJfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWI1OWI1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIHByb3ZpZGUgYSBOYW1lTWFwcGVyIHBlciB2YWxpZGF0aW9uIG1vZHVsZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBzdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTQ4MzhiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIG1hcHMgRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIEV4dFZhbCBNZXNzYWdlUmVzb2x2ZXJzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKHN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNjA2ZjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgdG8gcGxhY2UgVmFsaWRhdGlvblN0cmF0ZWdpZXMgYW5kIE1lc3NhZ2VSZXNvbHZlcnMgaW4gdGhlIHNhbWUgcGFja2FnZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBzdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1c3RvbVBvc3RmaXggPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWCk7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHN0cmF0ZWd5Q2xhc3NOYW1lLCBjdXN0b21Qb3N0Zml4KTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRkZWFiZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci0KLS8qKgotICogUHJvdmlkZXMgdGhlIGFiaWxpdHkgb2YgbWVzc2FnZSByZXNvbHZpbmcgdG8gVmFsaWRhdGlvblN0cmF0ZWdpZXMKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kKLXsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCA9ICJfZGV0YWlsIjsKLSAgICAvL2UuZy4gZm9yIGluamVjdGluZyBhIG1lc3NhZ2UgcmVzb2x2ZXIgdmlhIHNwcmluZwotICAgIHByaXZhdGUgTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcjsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIExvY2FsZSBsb2NhbGUgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKTsKLQotICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlUmVzb2x2ZXIgIT0gbnVsbCA/IHRoaXMubWVzc2FnZVJlc29sdmVyLmdldE1lc3NhZ2Uoa2V5LCBsb2NhbGUpIDoKLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldE1lc3NhZ2VSZXNvbHZlckZvclZhbGlkYXRpb25TdHJhdGVneSh0aGlzKS5nZXRNZXNzYWdlKGtleSwgbG9jYWxlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlc29sdmVNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gKGtleSAhPSBudWxsKSA/IHJlc29sdmVNZXNzYWdlKGtleSArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYKSA6IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRmFjZXNNZXNzYWdlIGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWFzc2FnZShBbm5vdGF0aW9uIGFubm90YXRpb24pCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsCi0gICAgICAgICAgICBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24pLCBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbikpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbik7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlUmVzb2x2ZXIoTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIHRoaXMubWVzc2FnZVJlc29sdmVyID0gbWVzc2FnZVJlc29sdmVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQotICAgIHsKLSAgICAgICAgbWV0YURhdGFFbnRyeS5zZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCwgZ2V0TGFiZWwoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSkpOwotCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24pOwotICAgIH0KLQotICAgIC8vZm9yIGN1c3RvbSBhbm5vdGF0aW9ucyAtIG92ZXJyaWRlIGlmIG5lZWRlZAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5NDZiMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBQcm92aWRlcyB0aGUgYWJpbGl0eSB0byB1c2UgVmFsaWRhdG9yRXhjZXB0aW9uIChhcyBleHBlY3RlZCBieSB0aGUgdXNlcikgaW5zdGVhZCBvZiBDb252ZXJ0ZXJFeGNlcHRpb24uDQotICogRnVydGhlcm1vcmUgaXQgcHJvdmlkZXM6PGJyLz4NCi0gKiBpbml0VmFsaWRhdGlvbjxici8+DQotICogcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgaW5pdFZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGluaXRWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImluaXRWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBwcm9jZXNzVmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcm9jZXNzVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJwcm9jZXNzVmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIGUpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgIjogdGhyb3cgb3JpZ2luYWwgZXhjZXB0aW9uIGFmdGVyIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb252ZXJ0ZXJFeGNlcHRpb24oZS5nZXRGYWNlc01lc3NhZ2UoKSwgZSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGdldENsYXNzKCkuZ2V0TmFtZSgpICsNCi0gICAgICAgICAgICAgICAgICAgICI6IG9yaWdpbmFsIGV4Y2VwdGlvbiBhZnRlciBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24gbm90IHRocm93biIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0VmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICAvL292ZXJyaWRlIGlmIG5lZWRlZA0KLSAgICB9DQotDQotICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24sIHRoaXMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb247DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI1ZGM0ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotDQotICogYWRhcHRlciB0byBjb25uZWN0IHZhbGlkYXRpb24gc3RyYXRlZ2llcyB3aXRoIG1ldGEtZGF0YSB0cmFuc2Zvcm1lcnMsDQotICogaWYgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgZGVmaW5lZCBhcyBiZWFuIGFuZCBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgaW50ZXJmYWNlIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyIGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICAvL3RvIGdldCBiYWNrIHRoZSBpbnRlcm5hbCBjYXNoaW5nDQotICAgIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoKTsNCi0NCi0gICAgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NWNiNjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIGl0J3MganVzdCBhIGhlbHBlciBmb3IgcHJveGllcyAtIHlvdSBqdXN0IG5lZWQgaXQsIGlmIHlvdSBkZWZpbmUgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0Lg0KLQ0KLSAqIGFkYXB0ZXIgdG8gY29ubmVjdCB2YWxpZGF0aW9uIHN0cmF0ZWdpZXMgd2l0aCBtZXRhLWRhdGEgdHJhbnNmb3JtZXJzLA0KLSAqIGlmIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIGRlZmluZWQgYXMgYmVhbiBhbmQgZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbCBpbXBsZW1lbnRzIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgcHJpdmF0ZSBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAvL29wdGlvbmFsIGZhbGxiYWNrIGZvciBpbnRlcm5hbCBjYXNoaW5nDQotICAgIHByaXZhdGUgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsNCi0NCi0gICAgcHVibGljIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbCgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciBpbnN0YW5jZW9mIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcikNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyKSBtZXRhRGF0YVRyYW5zZm9ybWVyICkuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgTWV0YURhdGFUcmFuc2Zvcm1lciBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFUcmFuc2Zvcm1lcihNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lciA9IG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25TdHJhdGVneShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneSA9IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDhhM2U2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXINCi0gICAgLkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcg0KLSAgICAuQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyDQotICAgIC5DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXINCi0gICAgLkRlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcg0KLSAgICAuU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotDQotLyoqDQotICogRmFjdG9yeSB3aGljaCBjcmVhdGVzIHRoZSBWYWxpZGF0aW9uU3RyYXRlZ3kgZm9yIGEgZ2l2ZW4gTWV0YS1EYXRhIEtleQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnZW5lcmljIGphdmEgYXBpIChkZS0vcmVnaXN0ZXIgbWFwcGluZykiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5IGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxTdHJpbmcsIFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcgPSBudWxsOw0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJMaXN0ID0NCi0gICAgICAgIG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxTdHJpbmc+PigpOw0KLQ0KLSAgICBzdGF0aWMNCi0gICAgew0KLSAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckxpc3QNCi0gICAgICAgICAgICAuYWRkKG5ldyBDdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsNCi0gICAgICAgIG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IERlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsNCi0NCi0gICAgICAgIG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyTGlzdA0KLSAgICAgICAgICAgIC5hZGQobmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOw0KLSAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJMaXN0DQotICAgICAgICAgICAgLmFkZChuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7DQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckxpc3QuYWRkKG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBuZXcgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOw0KLSAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJMaXN0LmFkZChuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoDQotICAgICAgICAgICAgbmV3IFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBjcmVhdGUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICBpZiAobWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljTWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZy5jb250YWluc0tleShtZXRhRGF0YUtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nLmdldChtZXRhRGF0YUtleSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWU7DQotICAgICAgICAvL251bGwgLT4gdXNlIG5hbWUgbWFwcGVycw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFN0cmluZz4gbmFtZU1hcHBlciA6IG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdHJhdGVneU5hbWUgPSBuYW1lTWFwcGVyLmNyZWF0ZU5hbWUobWV0YURhdGFLZXkpOw0KLQ0KLSAgICAgICAgICAgIGlmIChzdHJhdGVneU5hbWUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lJbnN0YW5jZShzdHJhdGVneU5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFkZE1hcHBpbmcobWV0YURhdGFLZXksIHN0cmF0ZWd5TmFtZSk7DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5SW5zdGFuY2UoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lDQotICAgICAgICAgICAgLnN0YXJ0c1dpdGgoQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuUFJFRklYX0ZPUl9CRUFOX01BUFBJTkcpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoVmFsaWRhdGlvblN0cmF0ZWd5KSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4odmFsaWRhdGlvblN0cmF0ZWd5TmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZyhBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5QUkVGSVhfRk9SX0JFQU5fTUFQUElORy5sZW5ndGgoKSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoVmFsaWRhdGlvblN0cmF0ZWd5KSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgbWV0YURhdGFLZXksIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImFkZGluZyBtZXRhLWRhdGEga2V5IHRvIHZhbGlkYXRpb24gc3RyYXRlZ3kgbWFwcGluZzogIg0KLSAgICAgICAgICAgICAgICArIG1ldGFEYXRhS2V5ICsgIiAtPiAiICsgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBzeW5jaHJvbml6ZWQgKERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nLnB1dChtZXRhRGF0YUtleSwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgc3luY2hyb25pemVkIChEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5jbGFzcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgOg0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA9IG5ldyBTdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgICAgICAvL3RyeSB0byBzZXR1cCBtYXBwaW5nIHdpdGggYmFzZSBuYW1lIGJ5IGNvbnZlbnRpb24gLSBvdmVycmlkZXMgZGVmYXVsdCBtYXBwaW5nDQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL2J1aWxkIGNvbnZlbnRpb24gKHN0cmF0ZWd5IG1hcHBpbmcpDQotICAgICAgICAgICAgICAgIHN0YXRpY0NvbmZpZy5zZXRTb3VyY2VPZk1hcHBpbmcoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5TVEFUSUNfU1RSQVRFR1lfTUFQUElOR19TT1VSQ0UpKTsNCi0NCi0gICAgICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvL3NldHVwIGN1c3RvbSBtYXBwaW5nIC0gb3ZlcnJpZGVzIGFsbCBvdGhlciBtYXBwaW5ncw0KLSAgICAgICAgICAgIFN0cmluZyBjdXN0b21NYXBwaW5nQmFzZU5hbWUgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OX1NUUkFURUdZX01BUFBJTkc7DQotICAgICAgICAgICAgaWYgKGN1c3RvbU1hcHBpbmdCYXNlTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY0NvbmZpZyA9IG5ldyBTdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY0NvbmZpZy5zZXRTb3VyY2VPZk1hcHBpbmcoY3VzdG9tTWFwcGluZ0Jhc2VOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsU3RyaW5nPj4gbWFwcGluZ3MpDQotICAgIHsNCi0gICAgICAgIGZvcihTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IG1hcHBpbmcgOiBtYXBwaW5ncykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNYXBwaW5nKG1hcHBpbmcuZ2V0U291cmNlKCksIG1hcHBpbmcuZ2V0VGFyZ2V0KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTU1MjNkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQmFzZSBpbnRlcmZhY2UgZm9yIFZhbGlkYXRpb25TdHJhdGVnaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi0vLypWYWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGVhZCBvZiAqVmFsaWRhdG9yIHRvIGF2b2lkIG5hbWluZyBjb25mdXNpb24gDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9BYnN0cmFjdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNjYzcyYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9BYnN0cmFjdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgQWJzdHJhY3RBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFhM2I2My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogTmFtZSBNYXBwZXIgd2hpY2ggZGVsZWdhdGVzIHRoZSBuYW1lIG1hcHBpbmcsIGV4dHJhY3QgdGhlIG5hbWUgYW5kIGNvbnZlcnQgaXQgdG8gYSBiZWFuIG5hbWUgKyBwcmVmaXgNCi0gKiB0YXJnZXQ6IGNvbmZpZ3VyZSBhIHZhbGlkYXRpb24gc3RyYXRlZ3kgdmlhIGEgbWFuYWdlZCBiZWFuIGZhY2lsaXR5IC0+IGFsbG93cyB0byBpbmplY3Qgb3RoZXIgYmVhbnMNCi0gKiBpbnN0ZWFkIG9mIGFwaSBjYWxscyArIGhhcmRjb2RlZCBiZWFuIG5hbWVzDQotICogPHAvPg0KLSAqIGFsbG93ZWQgYmVhbiBzY29wZXM6DQotICogdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgc3RhdGVsZXNzOiBhcHBsaWNhdGlvbi9zaW5nbGV0b24NCi0gKiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBzdGF0ZWZ1bDogbm9uZS9wcm90b3R5cGUNCi0gKiBkb24ndCB1c2UgdGhlIHNlc3Npb24gb3IgYSBjb252ZXJzYXRpb24gc2NvcGUNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfRk9SX0JFQU5fTUFQUElORyA9ICJiZWFuOiI7DQotICAgIHByaXZhdGUgTmFtZU1hcHBlcjxTdHJpbmc+IHdyYXBwZWQ7DQotDQotICAgIHB1YmxpYyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcihOYW1lTWFwcGVyPFN0cmluZz4gbmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gbmFtZU1hcHBlcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSB3cmFwcGVkLmNyZWF0ZU5hbWUoc291cmNlKTsNCi0NCi0gICAgICAgIGlmIChuYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7DQotICAgICAgICByZXR1cm4gUFJFRklYX0ZPUl9CRUFOX01BUFBJTkcgKyBuYW1lLnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZSgpICsgbmFtZS5zdWJzdHJpbmcoMSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZTFmNmUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIEFubm90YXRpb25zIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqIChjb25maWd1cmVkIHZpYSB3ZWIueG1sKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmOGRkZmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgQW5ub3RhdGlvbnMgdG8gVmFsaWRhdGlvblN0cmF0ZWdpZXMuDQotICogKGNvbmZpZ3VyZWQgdmlhIGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pDQotICogVGhlIGJlYW4gcHJvdmlkZXMgdGhlIGRlZmF1bHQgbmFtZSAoY29udmVudGlvbikuDQotICogSXQncyBwb3NzaWJsZSB0byBwcm92aWRlIGEgY3VzdG9tIGZ1bGwgcXVhbGlmaWVkIG5hbWUuICg9IGN1c3RvbWl6YWJsZSBjb252ZW50aW9uKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE4ZGY1OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBtYXBzIEV4dFZhbCBBbm5vdGF0aW9ucyB0byBFeHRWYWwgVmFsaWRhdGlvblN0cmF0ZWdpZXMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZShtZXRhRGF0YUtleSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmY0NWJmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIHRvIHBsYWNlIEFubm90YXRpb25zIGFuZCBWYWxpZGF0aW9uU3RyYXRlZ2llcyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFLZXkgKw0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvUHJpb3JpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTExYWEzMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvUHJpb3JpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1wdWJsaWMgZW51bSBQcmlvcml0eQotewotICAgIEJMT0NLSU5HLAotICAgIEhJR0gsCi0gICAgTUVESVVNLAotICAgIExPVwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Ub0RvLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVG9Eby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDQ0NmY4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Ub0RvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi1wdWJsaWMgQGludGVyZmFjZSBUb0RvCi17Ci0gICAgUHJpb3JpdHkgdmFsdWUoKTsKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24oKSBkZWZhdWx0ICIiOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VDYXRlZ29yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDdiMzg1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLS8qKgotICogQVBJOjxici8+Ci0gKiBwYXJ0cyB5b3UgbWlnaHQgbmVlZCBmb3IgY3VzdG9tIGltcGxlbWVudGF0aW9ucyBhbmQgd2hpY2ggYXJlIHF1aXRlIHN0YWJsZSBpbiB2aWV3IG9mIGNoYW5nZXMKLSAqIDxwLz4KLSAqIElOVEVSTkFMOjxici8+Ci0gKiBpZiB5b3UgdGhpbmsgYWJvdXQgcmVmZXJlbmNpbmcgYW4gYXJ0aWZhY3Qgd2hpY2ggaXMgbWFya2VkIGFzIGludGVybmFsLCBhc2sgZm9yIHN1cHBvcnQuCi0gKiB0aGVyZSBzaG91bGQgYmUgYSBiZXR0ZXIgc29sdXRpb24KLSAqIDxwLz4KLSAqIENVU1RPTUlaQUJMRTo8YnIvPgotICogYSBwbGFubmVkIGV4dGVuc2lvbiBwb2ludCB3aGljaCBjb250YWlucyBsb2dpYyB0byBjdXN0b21pemUgdGhlIGZyYW1ld29yay4KLSAqIGlmIGl0IGlzbid0IGFsc28gbWFya2VkIGFzIEFQSSBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotICogaG93ZXZlciwgd2UgdHJ5IHRvIGtlZXAgaXQgYXMgc3RhYmxlIGFzIHBvc3NpYmxlIGFuZCByZWFzb25hYmxlLgotICogPHAvPgotICogUkVVU0U6PGJyLz4KLSAqIGFuIGFydGlmYWN0IHdoaWNoIHlvdSBjYW4gcmV1c2UgZm9yIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uLgotICogaWYgaXQgaXNuJ3QgbWFya2VkIGFzIEFQSSBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotICogaG93ZXZlciwgd2UgdHJ5IHRvIGtlZXAgaXQgYXMgc3RhYmxlIGFzIHBvc3NpYmxlIGFuZCByZWFzb25hYmxlLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLXB1YmxpYyBlbnVtIFVzYWdlQ2F0ZWdvcnkKLXsKLSAgICBBUEksCi0gICAgSU5URVJOQUwsCi0gICAgQ1VTVE9NSVpBQkxFLAotICAgIFJFVVNFCi19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlSW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk5NDk1Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIGl0J3MgYW4gaW50ZXJuYWwgYW5ub3RhdGlvbiB0byBwcm92aWRlIHNvbWUgaW5mb3JtYXRpb24KLSAqIDxwLz4KLSAqIGUuZy46IHNvbWUgbWVjaGFuaXNtcyBhcmVuJ3QgZGVwcmVjYXRlZAotICogdGhleSBhcmUgZS5nLiBmYWxsYmFja3MsIGFsdGVybmF0aXZlcywuLi4KLSAqIGluIG9yZGVyIHRvIGF2b2lkIHRoZSBkZXByZWNhdGVkIGFubm90YXRpb24gaXQncyBwb3NzaWJsZSB0byB1c2UgdGhpcyBvbmUuCi0gKiB5b3UgY2FuIHRlbGwgb3RoZXIgZGV2ZWxvcGVyczoKLSAqIHRoaXMgYXJ0aWZhY3QgaXNuJ3QgdXNlZCBmb3IgdGhlIGRlc2lyZWQgYXBwcm9hY2gsIGhvd2V2ZXIsIGl0J3Mgc3RpbGwgZXNzZW50aWFsIHRvIGhhdmUgaXQgYXMgLi4uCi0gKiA8cC8+Ci0gKiBpZGVhOiB1bmlmeSBzbWFsbCBwYXJ0cyBvZiBpbmZvcm1hdGlvbiB3aGljaCBhcmUgZnJlcXVlbnRseSB1c2VkCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi1wdWJsaWMgQGludGVyZmFjZSBVc2FnZUluZm9ybWF0aW9uCi17Ci0gICAgVXNhZ2VDYXRlZ29yeVtdIHZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMjc1ZWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDbGFzc1V0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIHRyeVRvTG9hZENsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGxvYWRDbGFzc0Zvck5hbWUobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGxvYWRDbGFzc0Zvck5hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIFRyeSBXZWJBcHAgQ2xhc3NMb2FkZXIgZmlyc3QNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwDQotICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWdub3JlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIGZhbGxiYWNrOiBUcnkgQ2xhc3NMb2FkZXIgZm9yIENsYXNzVXRpbHMgKGkuZS4gdGhlIG15ZmFjZXMuamFyIGxpYikNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwDQotICAgICAgICAgICAgICAgIENsYXNzVXRpbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnN0YW50aWF0ZUNsYXNzKENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0Q2xhc3MubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoU3RyaW5nIGNsYXNzTmFtZSkNCi0gICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsb2FkQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxVdGlscy5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFiZGIyNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5FTEhlbHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuQWJzdHJhY3RFTEhlbHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLkNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbFV0aWxzDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfUkVRVUlSRUQgPSAiamF2YXguZmFjZXMuY29tcG9uZW50LlVJSW5wdXQuUkVRVUlSRUQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfUkVRVUlSRURfREVUQUlMID0gImphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUlucHV0LlJFUVVJUkVEX2RldGFpbCI7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19NQVhJTVVNID0gImphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3IuTUFYSU1VTSI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19NQVhJTVVNX0RFVEFJTCA9ICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yLk1BWElNVU1fZGV0YWlsIjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChDbGFzc01hcHBpbmdGYWN0b3J5PE9iamVjdCwgVmFsaWRhdGlvblN0cmF0ZWd5PikgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZShtZXRhRGF0YUtleSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1ldGFEYXRhVHJhbnNmb3JtZXI+KSBFeHRWYWxDb250ZXh0DQotICAgICAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKCkNCi0gICAgew0KLSAgICAgICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksIENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICB7DQotICAgICAgICBmb3IoQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRDb21wb25lbnRJbml0aWFsaXplcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjb21wb25lbnRJbml0aWFsaXplci5jb25maWd1cmVDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOw0KLQ0KLSAgICAgICAgZm9yKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCF2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJUaHJvd2luZygNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uLCB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VSZXNvbHZlciBnZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1lc3NhZ2VSZXNvbHZlcj4pRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgLmNyZWF0ZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRUxIZWxwZXIgZ2V0RUxIZWxwZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkVMX0hFTFBFUl9GQUNUT1JZLCBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeS5jbGFzcykuY3JlYXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eURldGFpbHMgY3JlYXRlUHJvcGVydHlEZXRhaWxzRm9yTmV3VGFyZ2V0KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldEV4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBiYXNlT2JqZWN0Ow0KLSAgICAgICAgaWYoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQodGFyZ2V0RXhwcmVzc2lvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YmUgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih0YXJnZXRFeHByZXNzaW9uKTsNCi0NCi0gICAgICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbiA9IHZiZS5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICAgICAgYmFzZU9iamVjdCA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZiZS5nZXRCYXNlRXhwcmVzc2lvbigpKTsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5zdWJzdHJpbmcoMiwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpLCBiYXNlT2JqZWN0LCB2YmUuZ2V0UHJvcGVydHkoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgb3JpZ2luYWwgPSBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KA0KLSAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBTdHJpbmcgbmV3QmFzZUtleSA9IG9yaWdpbmFsLmdldEtleSgpLnN1YnN0cmluZygwLCBvcmlnaW5hbC5nZXRLZXkoKS5sYXN0SW5kZXhPZigiLiIpICsgMSk7DQotICAgICAgICBTdHJpbmcgbmV3S2V5ID0gbmV3QmFzZUtleSArIHRhcmdldEV4cHJlc3Npb247DQotDQotICAgICAgICBiYXNlT2JqZWN0ID0gUmVmbGVjdGlvblV0aWxzLmdldEJhc2VPZlByb3BlcnR5Q2hhaW4ob3JpZ2luYWwuZ2V0QmFzZU9iamVjdCgpLCB0YXJnZXRFeHByZXNzaW9uKTsNCi0gICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlEZXRhaWxzKA0KLSAgICAgICAgICAgIG5ld0tleSwgYmFzZU9iamVjdCwgdGFyZ2V0RXhwcmVzc2lvbi5zdWJzdHJpbmcodGFyZ2V0RXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiLiIpICsgMSwNCi0gICAgICAgICAgICB0YXJnZXRFeHByZXNzaW9uLmxlbmd0aCgpKSk7DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvUGxhY2VMYWJlbChGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBTdHJpbmcgbGFiZWwsIGludCBpbmRleCkNCi0gICAgew0KLSAgICAgICAgaWYoZmFjZXNNZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsICYmIGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkuY29udGFpbnMoInsiICsgaW5kZXggKyAifSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkucmVwbGFjZSgieyIgKyBpbmRleCArICJ9IiwgbGFiZWwpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsICYmIGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKS5jb250YWlucygieyIgKyBpbmRleCArICJ9IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldERldGFpbChmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkucmVwbGFjZSgieyIgKyBpbmRleCArICJ9IiwgbGFiZWwpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVwbGFjZVdpdGhEZWZhdWx0TWF4aW11bU1lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgaW50IG1heExlbmd0aCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGZhY2VzUmVxdWlyZWRNZXNzYWdlID0gSnNmVXRpbHMuZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhKQVZBWF9GQUNFU19NQVhJTVVNKTsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlOw0KLQ0KLSAgICAgICAgLy91c2UgdHJ5L2NhdGNoIGZvciBlYXNpZXIgc3luYyBiZXR3ZWVuIHRydW5rL2JyYW5jaA0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoSnNmVXRpbHMuZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhKQVZBWF9GQUNFU19NQVhJTVVNX0RFVEFJTCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsID0gSnNmVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhKQVZBWF9GQUNFU19NQVhJTVVNX0RFVEFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9qc2YgMS4yIGRvZXNuJ3QgaGF2ZSBhIGRldGFpbCBtZXNzYWdlDQotICAgICAgICB9DQotDQotICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZSA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlLnJlcGxhY2UoInswfSIsICIiICsgbWF4TGVuZ3RoKTsNCi0gICAgICAgIGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsID0gZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwucmVwbGFjZSgiezB9IiwgIiIgKyBtYXhMZW5ndGgpOw0KLQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoZmFjZXNSZXF1aXJlZE1lc3NhZ2UpOw0KLSAgICAgICAgZmFjZXNNZXNzYWdlLnNldERldGFpbChmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCk7DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2UgPSBKc2ZVdGlscy5nZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkuZ2V0U3RyaW5nKEpBVkFYX0ZBQ0VTX1JFUVVJUkVEKTsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlOw0KLQ0KLSAgICAgICAgLy91c2UgdHJ5L2NhdGNoIGZvciBlYXNpZXIgc3luYyBiZXR3ZWVuIHRydW5rL2JyYW5jaA0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoSnNmVXRpbHMuZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhKQVZBWF9GQUNFU19SRVFVSVJFRF9ERVRBSUwpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IEpzZlV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfUkVRVUlSRURfREVUQUlMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2pzZiAxLjIgZG9lc24ndCBoYXZlIGEgZGV0YWlsIG1lc3NhZ2UNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGZhY2VzUmVxdWlyZWRNZXNzYWdlKTsNCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0pzZlV0aWxzLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjUwZDg5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0pzZlV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWN0b3J5RmluZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5saWZlY3ljbGUuTGlmZWN5Y2xlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5saWZlY3ljbGUuTGlmZWN5Y2xlRmFjdG9yeTsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7DQotDQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnNmVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcihQaGFzZUxpc3RlbmVyIHBoYXNlTGlzdGVuZXIpDQotICAgIHsNCi0gICAgICAgIExpZmVjeWNsZUZhY3RvcnkgbGlmZWN5Y2xlRmFjdG9yeSA9IChMaWZlY3ljbGVGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShGYWN0b3J5RmluZGVyLkxJRkVDWUNMRV9GQUNUT1JZKTsNCi0NCi0gICAgICAgIFN0cmluZyBjdXJyZW50SWQ7DQotICAgICAgICBMaWZlY3ljbGUgY3VycmVudExpZmVjeWNsZTsNCi0gICAgICAgIEl0ZXJhdG9yIGxpZmVjeWNsZUlkcyA9IGxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlSWRzKCk7DQotICAgICAgICB3aGlsZSAobGlmZWN5Y2xlSWRzLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50SWQgPSAoU3RyaW5nKSBsaWZlY3ljbGVJZHMubmV4dCgpOw0KLSAgICAgICAgICAgIGN1cnJlbnRMaWZlY3ljbGUgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZShjdXJyZW50SWQpOw0KLSAgICAgICAgICAgIGN1cnJlbnRMaWZlY3ljbGUucmVtb3ZlUGhhc2VMaXN0ZW5lcihwaGFzZUxpc3RlbmVyKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgU3RyaW5nIGJ1bmRsZU5hbWUgPSBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5nZXRNZXNzYWdlQnVuZGxlKCk7DQotDQotICAgICAgICBpZihidW5kbGVOYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgYnVuZGxlTmFtZSA9IEZhY2VzTWVzc2FnZS5GQUNFU19NRVNTQUdFUzsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoYnVuZGxlTmFtZSwgZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1JlZmxlY3Rpb25VdGlscy5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODdmN2QuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBSZWZsZWN0aW9uVXRpbHMKLXsKLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCB0cnlUb0dldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ5VG9HZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIHRyeVRvR2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0TWV0aG9kTmFtZSwgQ2xhc3MuLi4gcGFyYW1ldGVyVHlwZXMpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldE1ldGhvZCh0YXJnZXRDbGFzcywgdGFyZ2V0TWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUpCi0gICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUsIENsYXNzLi4uIHBhcmFtZXRlclR5cGVzKQotICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSB0YXJnZXRDbGFzczsKLSAgICAgICAgTWV0aG9kIHRhcmdldE1ldGhvZCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAoIU9iamVjdC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0YXJnZXRNZXRob2QgPSBjdXJyZW50Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QodGFyZ2V0TWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50SW50ZXJmYWNlIDogdGFyZ2V0Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRJbnRlcmZhY2U7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudENsYXNzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gY3VycmVudENsYXNzLmdldERlY2xhcmVkTWV0aG9kKHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudENsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0TWV0aG9kOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbigidGhlcmUgaXMgbm8gbWV0aG9kIHdpdGggdGhlIG5hbWUgJyIgKyB0YXJnZXRNZXRob2ROYW1lICsgIiciICsKLSAgICAgICAgICAgICAgICAiIGNsYXNzOiAiICsgdGFyZ2V0Q2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvSW52b2tlTWV0aG9kKHRhcmdldCwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvSW52b2tlTWV0aG9kT2ZDbGFzcyh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kT2ZDbGFzcyh0YXJnZXQsIG1ldGhvZCwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldC5uZXdJbnN0YW5jZSgpLCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kLCBPYmplY3QuLi4gYXJncykKLSAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0Lm5ld0luc3RhbmNlKCksIG1ldGhvZCwgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldCwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgewotICAgICAgICBtZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2UodGFyZ2V0LCBhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKE9iamVjdCBiYXNlT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlDaGFpbikKLSAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHByb3BlcnR5Q2hhaW4sICIuIik7Ci0KLSAgICAgICAgT2JqZWN0IGN1cnJlbnRCYXNlID0gYmFzZU9iamVjdDsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnRQcm9wZXJ0eTsKLSAgICAgICAgTWV0aG9kIGN1cnJlbnRNZXRob2Q7Ci0KLSAgICAgICAgd2hpbGUodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudFByb3BlcnR5ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCi0gICAgICAgICAgICAvL2lnbm9yZSB0aGUgbGFzdCBwcm9wZXJ0eQotICAgICAgICAgICAgaWYoIXRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vbm8gaXMgLSBpdCdzIG9ubHkgcG9zc2libGUgYXQgcHJvcGVydGllcyBub3QgYXQgYmVhbiBsZXZlbAotICAgICAgICAgICAgY3VycmVudE1ldGhvZCA9IHRyeVRvR2V0TWV0aG9kKGN1cnJlbnRCYXNlLmdldENsYXNzKCksCi0gICAgICAgICAgICAgICAgImdldCIgKyBjdXJyZW50UHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50UHJvcGVydHkuc3Vic3RyaW5nKDEsIGN1cnJlbnRQcm9wZXJ0eS5sZW5ndGgoKSkpOwotICAgICAgICAgICAgY3VycmVudEJhc2UgPSB0cnlUb0ludm9rZU1ldGhvZChjdXJyZW50QmFzZSwgY3VycmVudE1ldGhvZCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY3VycmVudEJhc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvV2ViWG1sVXRpbHMuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1dlYlhtbFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYjIxN2IuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvV2ViWG1sVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgV2ViWG1sVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEluaXRQYXJhbWV0ZXIoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpDQotICAgICAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCArICIuIiArIGtleSk7DQotICAgICAgICByZXR1cm4gKHZhbHVlICE9IG51bGwpID8gdmFsdWUucmVwbGFjZSgiICIsICIiKS50cmltKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2NvcmUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTIwMWQyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUgTW9kdWxlDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUgTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSBNb2R1bGUgcHJvdmlkZXMgYW4gZXh0ZW5zaWJsZSB2YWxpZGF0aW9uIHBsYXRmb3JtIHRvIGltcGxlbWVudCB2YWxpZGF0aW9uIGJhc2VkIG9uIG1ldGEtZGF0YS4NCi0gICAgQmFzZWQgb24gdGhpcyBtb2R1bGUgaXQgaXMgcG9zc2libGUgdG8gaW1wbGVtZW50IHZhbGlkYXRpb24gbW9kdWxlcy4NCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEuMS54IGFuZCBKU0YgMS4yLnguIEJvdGggdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2Fzc2VtYmx5L3BvbS54bWwgYi9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2Fzc2VtYmx5L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYjU5NTQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9hc3NlbWJseS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEV4YW1wbGVzIEFzc2VtYmx5PC9uYW1lPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1leGFtcGxlcy1hc3NlbWJseTEyPC9hcnRpZmFjdElkPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuMTwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRlcGVuZGVuY3ktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktd2FyPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fd29ybGQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+CQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWZlYXR1cmUtc2V0XzAxPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS93YXI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1zcmM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1oZWxsb193b3JsZDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPmphdmEtc291cmNlPC90eXBlPiAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPmphdmEtc291cmNlPC90eXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zcmM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tIEVYRUNVVEUgbXZuIHBhY2thZ2UgdG8gZ2VuZXJhdGUgYXNzZW1ibHkgZmlsZXMgLS0+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X3NyYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXNzZW1ibHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPiAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5teWZhY2VzLWV4dHZhbC1leGFtcGxlcy0ke3Byb2plY3QudmVyc2lvbn0tc3JjPC9maW5hbE5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9iaW48L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmFzc2VtYmx5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLQkgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotCSAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4gICAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbDwvZGVzY3JpcHRvcj4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotCSAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwtZXhhbXBsZXMtJHtwcm9qZWN0LnZlcnNpb259PC9maW5hbE5hbWU+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS93b3JrPC93b3JrRGlyZWN0b3J5PgotCSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQkgICAgCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD53YWdvbi1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxpZD5teWZhY2VzLW5pZ2h0bHktYnVpbGRzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9taW5vdGF1ci5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9idWlsZHMvbXlmYWNlcy9uaWdodGx5PC91cmw+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9vdXQ8L2lucHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotCi0gICAgICAgIDwvcGx1Z2lucz4KLQotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwgYi9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZjdiODEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+YmluPC9pZD4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+CQotICA8ZmlsZVNldHM+ICAgIAotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvd2FyPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLndhcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PiAgICAgCi0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sIGIvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTcwY2NjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPnNyYzwvaWQ+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgkKLSAgPGZpbGVTZXRzPiAgICAKLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3NyYzwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLnR4dDwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNWIzYTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDliZGIxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9wb20ueG1sIGIvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmJlN2ZiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgZmVhdHVyZS1zZXQgMDE8L25hbWU+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMi4xPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmZhY2VsZXRzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWZhY2VsZXRzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE0PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPCEtLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIC0tPgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRvbWFoYXdrPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dG9tYWhhd2s8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuNjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwMWRmNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2N1c3RvbS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotIyB0aGlzIG1lc3NhZ2UgYnVuZGxlIGlzIHBpY2tlZCB1cCB2aWEgY29udmVudGlvbg0KLXJlcGVhdGVkX3Bhc3N3b3JkX3JlcXVpcmVkPXBsZWFzZSByZXR5cGUgdGhlIHBhc3N3b3JkDQotcmVwZWF0ZWRfcGFzc3dvcmRfcmVxdWlyZWRfZGV0YWlsPXBsZWFzZSByZXR5cGUgdGhlIHBhc3N3b3JkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2RvbWFpbi9QZXJzb24uamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YWU0MWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2RvbWFpbi9QZXJzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5kb21haW47DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRGF0ZUlzVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uTm90RXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxlbmd0aDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5QYXR0ZXJuOw0KLQ0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlRlbXBvcmFsOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbFR5cGU7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLXB1YmxpYyBjbGFzcyBQZXJzb24NCi17DQotICAgIEBMZW5ndGgobWluaW11bSA9IDIpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMjApDQotICAgIEBOb3RFcXVhbHMoImxhc3ROYW1lIikNCi0gICAgQFBhdHRlcm4oIltBLVpdW2Etel0rIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOw0KLQ0KLSAgICBATGVuZ3RoKG1pbmltdW0gPSAyKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDIwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsNCi0NCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7DQotDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIHJvbGUgPSAidXNlciI7DQotDQotICAgIEBEYXRlSXModHlwZSA9IERhdGVJc1R5cGUuYmVmb3JlLCB2YWx1ZU9mID0gImZpbmFsRXhhbSIpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSkNCi0gICAgQFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5EQVRFKQ0KLSAgICBwcml2YXRlIERhdGUgYmlydGhkYXk7DQotDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSkNCi0gICAgQFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5EQVRFKQ0KLSAgICBwcml2YXRlIERhdGUgZmluYWxFeGFtOw0KLQ0KLSAgICBATGVuZ3RoKG1pbmltdW0gPSAyKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBuaWNrTmFtZTsNCi0NCi0gICAgQExlbmd0aChtaW5pbXVtID0gNikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSA2MCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW1haWw7DQotDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSkNCi0gICAgcHJpdmF0ZSBpbnQgbnVtYmVyT2ZTaWJsaW5nczsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxhc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRSb2xlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHJvbGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Um9sZShTdHJpbmcgcm9sZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5yb2xlID0gcm9sZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXRCaXJ0aGRheSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBiaXJ0aGRheTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRCaXJ0aGRheShEYXRlIGJpcnRoZGF5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmJpcnRoZGF5ID0gYmlydGhkYXk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RmluYWxFeGFtKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZpbmFsRXhhbTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaW5hbEV4YW0oRGF0ZSBmaW5hbEV4YW0pDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmluYWxFeGFtID0gZmluYWxFeGFtOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tmlja05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmlja05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Tmlja05hbWUoU3RyaW5nIG5pY2tOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm5pY2tOYW1lID0gbmlja05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBlbWFpbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbWFpbChTdHJpbmcgZW1haWwpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZW1haWwgPSBlbWFpbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGdldE51bWJlck9mU2libGluZ3MoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbnVtYmVyT2ZTaWJsaW5nczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXJPZlNpYmxpbmdzKGludCBudW1iZXJPZlNpYmxpbmdzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm51bWJlck9mU2libGluZ3MgPSBudW1iZXJPZlNpYmxpbmdzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZTE0ZmIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZ3VpLmJlYW5zOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5kb21haW4uUGVyc29uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLk5vdEVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Kb2luVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Mb25nUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uVmFsaWRhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuY3VzdG9tLmVtYWlsdmFsaWRhdG9yLkVtYWlsVmFsaWRhdG9yOw0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25QYWdlDQotew0KLQ0KLSAgICAvL3RoZSBvbGQgcGFzc3dvcmQgb2YgdGhlIHBlcnNvbiBpc24ndCB1c2VkIHdpdGhpbiB0aGUgcGFnZQ0KLSAgICAvLy0+IHZhbGlkYXRlIHdpdGggdmFsdWUgb2YgdGhlIG1vZGVsDQotICAgIEBTa2lwVmFsaWRhdGlvbigiI3twZXJzb24ucm9sZSBlcSAnYWRtaW4nfSIpDQotICAgIEBSZXF1aXJlZA0KLSAgICBARXF1YWxzKCJwZXJzb24ucGFzc3dvcmQiKQ0KLSAgICBATm90RXF1YWxzKCJwYXNzd29yZCIpDQotICAgIHByaXZhdGUgU3RyaW5nIG9sZFBhc3N3b3JkOw0KLQ0KLSAgICBARXF1YWxzKCJwYXNzd29yZFJlcGVhdGVkIikNCi0gICAgLy9jb21iaW5lIGd1aSByZWxhdGVkIGFubm90YXRpb25zIHdpdGggdGhlIGFubm9hdGlvbnMgb2YgdGhlIGRvbWFpbiBtb2RlbA0KLSAgICBASm9pblZhbGlkYXRpb24odmFsdWUgPSAiI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5wYXNzd29yZH0iKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsNCi0NCi0gICAgQFJlcXVpcmVkKHZhbGlkYXRpb25FcnJvck1zZ0tleSA9ICJyZXBlYXRlZF9wYXNzd29yZF9yZXF1aXJlZCIpDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkUmVwZWF0ZWQ7DQotDQotICAgIC8vdXNlICN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ubmlja05hbWV9LCAje3BlcnNvbi5uaWNrTmFtZX0NCi0gICAgLy91c2UgcmVnaXN0cmF0aW9uUGFnZSB0byBkaXNwbGF5IHRoZSBzZWNvbmQgZXJyb3IgbWVzc2FnZSBhdCBvbGQgbmlja25hbWUNCi0gICAgLy9vciBsb2NhbCBwcm9wZXJ0eSBjaGFpbmluZyAodG8gYXZvaWQgdGhlIHVzYWdlIG9mIHRoZSBiZWFuIG5hbWUpIC0gbGlrZToNCi0gICAgQFNraXBWYWxpZGF0aW9uKCIje3BlcnNvbi5yb2xlIGVxICdhZG1pbid9IikNCi0gICAgQE5vdEVxdWFscygicGVyc29uLm5pY2tOYW1lIikNCi0gICAgQEpvaW5WYWxpZGF0aW9uKCJwZXJzb24ubmlja05hbWUiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBuZXdOaWNrTmFtZTsNCi0NCi0gICAgcHJpdmF0ZSBQZXJzb24gcGVyc29uOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGZpbmlzaCgpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldFBhc3N3b3JkKHRoaXMucGFzc3dvcmQpOw0KLSAgICAgICAgcmV0dXJuICJob21lIjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHVwZGF0ZU5pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0Tmlja05hbWUodGhpcy5uZXdOaWNrTmFtZSk7DQotICAgICAgICByZXR1cm4gImhvbWUiOw0KLSAgICB9DQotDQotICAgIC8vanVzdCBhIHF1aWNrIGlsbHVzdHJhdGlvbiBvZiBza2lwVmFsaWRhdGlvbg0KLSAgICBwdWJsaWMgU3RyaW5nIHN3aXRjaE1vZGUoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VycmVudFJvbGUgPSB0aGlzLnBlcnNvbi5nZXRSb2xlKCk7DQotDQotICAgICAgICBpZihjdXJyZW50Um9sZS5lcXVhbHMoImFkbWluIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5wZXJzb24uc2V0Um9sZSgidXNlciIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMucGVyc29uLnNldFJvbGUoImFkbWluIik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gIiI7DQotICAgIH0NCi0NCi0gICAgQEpvaW5WYWxpZGF0aW9uKCJwZXJzb24uZW1haWwiKQ0KLSAgICBAVmFsaWRhdG9yKEVtYWlsVmFsaWRhdG9yLmNsYXNzKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uLmdldEVtYWlsKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXRFbWFpbChlbWFpbCk7DQotICAgIH0NCi0NCi0gICAgQEpvaW5WYWxpZGF0aW9uKCIje3BlcnNvbi5udW1iZXJPZlNpYmxpbmdzfSIpDQotICAgIEBMb25nUmFuZ2UobWF4aW11bSA9IDIwKQ0KLSAgICBwdWJsaWMgaW50IGdldE51bWJlck9mU2libGluZ3MoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5wZXJzb24uZ2V0TnVtYmVyT2ZTaWJsaW5ncygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlck9mU2libGluZ3MoaW50IG51bWJlck9mU2libGluZ3MpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldE51bWJlck9mU2libGluZ3MobnVtYmVyT2ZTaWJsaW5ncyk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9sZFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG9sZFBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE9sZFBhc3N3b3JkKFN0cmluZyBvbGRQYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5vbGRQYXNzd29yZCA9IG9sZFBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZFJlcGVhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkUmVwZWF0ZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRSZXBlYXRlZChTdHJpbmcgcGFzc3dvcmRSZXBlYXRlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZFJlcGVhdGVkID0gcGFzc3dvcmRSZXBlYXRlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwZXJzb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbiBwZXJzb24pDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uID0gcGVyc29uOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmV3Tmlja05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3Tmlja05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TmV3Tmlja05hbWUoU3RyaW5nIG5ld05pY2tOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm5ld05pY2tOYW1lID0gbmV3Tmlja05hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxOGQ2Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCIKLSAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4KLSAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgIDwhLS0gdHJpbmlkYWQgLS0+Ci0gICAgICAgIDxkZWZhdWx0LXJlbmRlci1raXQtaWQ+Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29yZQotICAgICAgICA8L2RlZmF1bHQtcmVuZGVyLWtpdC1pZD4KLQotICAgIDwvYXBwbGljYXRpb24+Ci0KLSAgICA8bWFuYWdlZC1iZWFuPgotICAgICAgICA8bWFuYWdlZC1iZWFuLW5hbWU+cmVnaXN0cmF0aW9uUGFnZTwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZ3VpLmJlYW5zLlJlZ2lzdHJhdGlvblBhZ2U8L21hbmFnZWQtYmVhbi1jbGFzcz4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0KLSAgICAgICAgPG1hbmFnZWQtcHJvcGVydHk+Ci0gICAgICAgICAgICA8cHJvcGVydHktbmFtZT5wZXJzb248L3Byb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8dmFsdWU+I3twZXJzb259PC92YWx1ZT4KLSAgICAgICAgPC9tYW5hZ2VkLXByb3BlcnR5PgotICAgIDwvbWFuYWdlZC1iZWFuPgotCi0gICAgPG1hbmFnZWQtYmVhbj4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1uYW1lPnBlcnNvbjwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluLlBlcnNvbjwvbWFuYWdlZC1iZWFuLWNsYXNzPgotICAgICAgICA8bWFuYWdlZC1iZWFuLXNjb3BlPnNlc3Npb248L21hbmFnZWQtYmVhbi1zY29wZT4KLSAgICA8L21hbmFnZWQtYmVhbj4KLQotICAgIDxuYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgICAgIDxmcm9tLXZpZXctaWQ+L3BhZ2VzL2hvbWUueGh0bWw8L2Zyb20tdmlldy1pZD4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+YWRkVXNlcjwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmNoYW5nZU5pY2tOYW1lPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+Y2hhbmdlUGFzc3dvcmQ8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgIDwvbmF2aWdhdGlvbi1ydWxlPgotICAgIDxuYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgICAgIDxmcm9tLXZpZXctaWQ+KjwvZnJvbS12aWV3LWlkPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5ob21lPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvaG9tZS54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgPC9uYXZpZ2F0aW9uLXJ1bGU+Ci08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbCBiL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzM5MzY2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgZmFjZWxldC10YWdsaWIgUFVCTElDCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRmFjZWxldCBUYWdsaWIgMS4wLy9FTiIKLSAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2ZhY2VsZXQtdGFnbGliXzFfMC5kdGQiPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlbGV0LXRhZ2xpYj4KLSAgICA8bmFtZXNwYWNlPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0dmFsL2RlbW8vY29tcG9uZW50czwvbmFtZXNwYWNlPgotCi0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPnVzZXJGb3JtPC90YWctbmFtZT4KLSAgICAgICAgPHNvdXJjZT4KLSAgICAgICAgICAgIC4uL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sCi0gICAgICAgIDwvc291cmNlPgotICAgIDwvdGFnPgotCi08L2ZhY2VsZXQtdGFnbGliPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjMDFhYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLSAgICAgICAgIHZlcnNpb249IjIuNCI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+TXlQcm9qZWN0IHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkRFRkFVTFRfU1VGRklYPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+LnhodG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+ZmFjZWxldHMuTElCUkFSSUVTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L1dFQi1JTkYvbWFpbi50YWdsaWIueG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkVOQUJMRV9MSUdIVFdFSUdIVF9ESUFMT0dTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5ESVNBQkxFX0NPTlRFTlRfQ09NUFJFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkFMVEVSTkFURV9WSUVXX0hBTkRMRVI8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jb20uc3VuLmZhY2VsZXRzLkZhY2VsZXRWaWV3SGFuZGxlcjwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5VU0VfQVBQTElDQVRJT05fVklFV19DQUNIRTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkNIQU5HRV9QRVJTSVNURU5DRTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnNlc3Npb248L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+U3RhdGUgc2F2aW5nIG1ldGhvZDogImNsaWVudCIgb3IgInNlcnZlciIgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIFNlZSBKU0YgU3BlY2lmaWNhdGlvbiAyLjUuMwotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIGFtb3VudCAoZGVmYXVsdCA9IDIwKSBvZiB0aGUgbGF0ZXN0IHZpZXdzIGFyZSBzdG9yZWQgaW4gc2Vzc2lvbi4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLk5VTUJFUl9PRl9WSUVXU19JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpIGFuZCBpZgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OIGlzIHRydWUgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzZXJpYWxpemVkIHN0YXRlIHdpbGwgYmUgY29tcHJlc3NlZCBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBjb21wcmVzc2VkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcGFyYW1ldGVyIHRlbGxzIE15RmFjZXMgaWYgamF2YXNjcmlwdCBjb2RlIHNob3VsZCBiZSBhbGxvd2VkIGluIHRoZQotICAgICAgICAgICAgcmVuZGVyZWQgSFRNTCBvdXRwdXQuCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUKLSAgICAgICAgICAgIHRoYXQgc3VibWl0cyB0aGUgY29ycmVzcG9uZGluZyBmb3JtLgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBub3QgYWxsb3dlZCwgdGhlIHN0YXRlIHNhdmluZyBpbmZvIGFuZCBuZXN0ZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLgotICAgICAgICAgICAgaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90Ci0gICAgICAgICAgICBpbmZsdWVuY2UgdGhlIEhUTUwgY29kZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUFJFVFRZX0hUTUw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCBhIGphdmFzY3JpcHQgZnVuY3Rpb24gd2lsbCBiZSByZW5kZXJlZCB0aGF0IGlzIGFibGUgdG8gcmVzdG9yZSB0aGUKLSAgICAgICAgICAgIGZvcm1lciB2ZXJ0aWNhbCBzY3JvbGwgb24gZXZlcnkgcmVxdWVzdC4gQ29udmVuaWVudCBmZWF0dXJlIGlmIHlvdSBoYXZlIHBhZ2VzCi0gICAgICAgICAgICB3aXRoIGxvbmcgbGlzdHMgYW5kIHlvdSBkbyBub3Qgd2FudCB0aGUgYnJvd3NlciBwYWdlIHRvIGFsd2F5cyBqdW1wIHRvIHRoZSB0b3AKLSAgICAgICAgICAgIGlmIHlvdSB0cmlnZ2VyIGEgbGluayBvciBidXR0b24gYWN0aW9uIHRoYXQgc3RheXMgb24gdGhlIHNhbWUgcGFnZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJmYWxzZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFVVE9fU0NST0xMPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Vc2VkIGZvciBlbmNyeXB0aW5nIHZpZXcgc3RhdGUuIE9ubHkgcmVsZXZhbnQgZm9yIGNsaWVudCBzaWRlCi0gICAgICAgICAgICBzdGF0ZSBzYXZpbmcuIFNlZSBNeUZhY2VzIHdpa2kvd2ViIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRUNSRVQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWYWxpZGF0ZSBtYW5hZ2VkIGJlYW5zLCBuYXZpZ2F0aW9uIHJ1bGVzIGFuZCBlbnN1cmUgdGhhdCBmb3JtcyBhcmUgbm90IG5lc3RlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlZBTElEQVRFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPCEtLSBMaXN0ZW5lciwgdG8gYWxsb3cgSmV0dHkgc2VydmluZyBNeUZhY2VzIGFwcHMgLS0+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLndlYmFwcC5TdGFydHVwU2VydmxldENvbnRleHRMaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+Ci0gICAgPC9saXN0ZW5lcj4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCAtLT4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICAgIDwvc2VydmxldD4KLQotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPnJlc291cmNlczwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlJlc291cmNlU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8ZmlsdGVyPgotICAgICAgICA8ZmlsdGVyLW5hbWU+dHJpbmlkYWQ8L2ZpbHRlci1uYW1lPgotICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC53ZWJhcHAuVHJpbmlkYWRGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KLSAgICA8L2ZpbHRlcj4KLQotICAgIDxmaWx0ZXItbWFwcGluZz4KLSAgICAgICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgPC9maWx0ZXItbWFwcGluZz4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCBNYXBwaW5ncyAtLT4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9mYWNlcy8qPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+cmVzb3VyY2VzPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4vYWRmLyo8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPCEtLSBXZWxjb21lIGZpbGVzIC0tPgotICAgIDx3ZWxjb21lLWZpbGUtbGlzdD4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+Ci0gICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KLQotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwgYi9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg0ZDY0OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyIKLSAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiCi0gICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIgotICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiCi0gICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+Ci0KLTx1aTpjb21wb3NpdGlvbj4KLSAgICA8dHI6cGFuZWxGb3JtTGF5b3V0PgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im5pY2sgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb25bICduaWNrTmFtZScgXX0iLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0iZS1tYWlsIiB2YWx1ZT0iI3tiZWFuLmVtYWlsfSIvPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9ImZpcnN0IG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uLmZpcnN0TmFtZX0iLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibGFzdCBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5sYXN0TmFtZX0iLz4KLSAgICAgICAgPHRyOmlucHV0RGF0ZSBsYWJlbD0iYmlydGhkYXkiIHZhbHVlPSIje2JlYW4ucGVyc29uLmJpcnRoZGF5fSI+Ci0gICAgICAgICAgICA8dHI6Y29udmVydERhdGVUaW1lIHR5cGU9ImRhdGUiIHBhdHRlcm49ImRkLk1NLnl5eXkiLz4KLSAgICAgICAgPC90cjppbnB1dERhdGU+Ci0gICAgICAgIDx0cjppbnB1dERhdGUgbGFiZWw9ImZpbmFsIGV4YW0iIHZhbHVlPSIje2JlYW4ucGVyc29uLmZpbmFsRXhhbX0iPgotICAgICAgICAgICAgPHRyOmNvbnZlcnREYXRlVGltZSB0eXBlPSJkYXRlIiBwYXR0ZXJuPSJkZC5NTS55eXl5Ii8+Ci0gICAgICAgIDwvdHI6aW5wdXREYXRlPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im51bWJlciBvZiBzaWJsaW5ncyIgdmFsdWU9IiN7YmVhbi5udW1iZXJPZlNpYmxpbmdzfSIvPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9InBhc3N3b3JkIiB2YWx1ZT0iI3tiZWFuLnBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9InJlLWVudGVyIHBhc3N3b3JkIiB2YWx1ZT0iI3tiZWFuLnBhc3N3b3JkUmVwZWF0ZWR9IiBzZWNyZXQ9InRydWUiLz4KLQotICAgIDwvdHI6cGFuZWxGb3JtTGF5b3V0PgotPC91aTpjb21wb3NpdGlvbj4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwgYi9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWNkMTQ4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0gICAgICAgIA0KLTxodG1sPg0KLQ0KLTxoZWFkPg0KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIwOyBVUkw9ZmFjZXMvcGFnZXMvaG9tZS54aHRtbCI+DQotPC9oZWFkPg0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwgYi9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYzFlYTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPHRyOmRvY3VtZW50DQotICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiDQotICAgICAgICB4bWxuczpjPSJodHRwOi8vamF2YS5zdW4uY29tL2pzdGwvY29yZSI+DQotICAgIDxmOmZhY2V0IG5hbWU9Im1ldGFDb250YWluZXIiPg0KLSAgICAgICAgPHRpdGxlPnNldi1lbiBmZWF0dXJlLXNldCBkZW1vIDAxPC90aXRsZT4NCi0gICAgPC9mOmZhY2V0Pg0KLQ0KLSAgICA8dHJoOmJvZHk+DQotDQotICAgICAgICA8IS0tIG9yaWdpbmFsIC0tPg0KLSAgICAgICAgPGRpdiBpZD0id3JhcCI+DQotDQotICAgICAgICAgICAgPHRyOmZvcm0gaWQ9ImZvcm0iIGRlZmF1bHRDb21tYW5kPSJkZWZhdWx0QnV0dG9uIj4NCi0gICAgICAgICAgICAgICAgPGRpdiBpZD0ibWFpbiI+DQotICAgICAgICAgICAgICAgICAgICA8dWk6aW5zZXJ0IG5hbWU9ImNvbnRlbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InVuZGVyX2NvbnN0cnVjdGlvbiI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj4hc2l0ZSB1bmRlciBjb25zdHJ1Y3Rpb24hPC9oMj4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIGNvbnRlbnQgb2YgdGhpcyBzaXRlIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhlIG1vbWVudC48L3A+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICA8L3VpOmluc2VydD4NCi0gICAgICAgICAgICAgICAgPC9kaXY+DQotDQotICAgICAgICAgICAgPC90cjpmb3JtPg0KLSAgICAgICAgICAgIDx0cjptZXNzYWdlcyBnbG9iYWxPbmx5PSJ0cnVlIi8+DQotDQotICAgICAgICA8L2Rpdj4NCi0gICAgPC90cmg6Ym9keT4NCi0NCi0NCi08L3RyOmRvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbCBiL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg5M2ZhZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgPHRyOnBhbmVsRm9ybUxheW91dD4NCi0NCi0gICAgICAgICAgICA8dWk6cmVtb3ZlPg0KLSAgICAgICAgICAgICAgICBqdXN0IGZvciB0aGUgZGVtbyB3ZSBhcmUgdXNpbmcgdHdvIGlucHV0IGNvbXBvbmVudHMNCi0gICAgICAgICAgICA8L3VpOnJlbW92ZT4NCi0gICAgICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJvbGQgbmljayBuYW1lIiByZWFkT25seT0idHJ1ZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ubmlja05hbWV9Ii8+DQotDQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibmljayBuYW1lIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLm5ld05pY2tOYW1lfSIvPg0KLQ0KLSAgICAgICAgPC90cjpwYW5lbEZvcm1MYXlvdXQ+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJzYXZlIiBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS51cGRhdGVOaWNrTmFtZX0iLz4NCi0NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9wYXNzd29yZC54aHRtbCBiL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9wYXNzd29yZC54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ2ODk4Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgPHRyOnBhbmVsRm9ybUxheW91dD4NCi0NCi0gICAgICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJvbGQgcGFzc3dvcmQiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2Uub2xkUGFzc3dvcmR9IiBzZWNyZXQ9InRydWUiLz4NCi0NCi0gICAgICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJuZXcgcGFzc3dvcmQiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGFzc3dvcmR9IiBzZWNyZXQ9InRydWUiLz4NCi0gICAgICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJyZS1lbnRlciBwYXNzd29yZCIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5wYXNzd29yZFJlcGVhdGVkfSIgc2VjcmV0PSJ0cnVlIi8+DQotDQotICAgICAgICA8L3RyOnBhbmVsRm9ybUxheW91dD4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9InNhdmUiIGFjdGlvbj0iI3tyZWdpc3RyYXRpb25QYWdlLmZpbmlzaH0iLz4NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwgYi9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTdlYmQ5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0iYWRkIHVzZXIiIGFjdGlvbj0iYWRkVXNlciIvPjxici8+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJjaGFuZ2UgbmljayBuYW1lIiBhY3Rpb249ImNoYW5nZU5pY2tOYW1lIi8+PGJyLz4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9ImNoYW5nZSBwYXNzd29yZCIgYWN0aW9uPSJjaGFuZ2VQYXNzd29yZCIvPjxici8+DQotICAgICAgICA8dHI6Y29tbWFuZExpbmsgdGV4dD0ibW9kZTogI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5yb2xlfSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0iI3tyZWdpc3RyYXRpb25QYWdlLnN3aXRjaE1vZGV9IiBpbW1lZGlhdGU9InRydWUiLz4NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbCBiL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmNmIwNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOmM9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0dmFsL2RlbW8vY29tcG9uZW50cyINCi0gICAgICAgID4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDxjOnVzZXJGb3JtIGJlYW49IiN7cmVnaXN0cmF0aW9uUGFnZX0iLz4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9InNhdmUiIGFjdGlvbj0iI3tyZWdpc3RyYXRpb25QYWdlLmZpbmlzaH0iLz4NCi0NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvcG9tLnhtbCBiL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQzZjQwMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1oZWxsb193b3JsZDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgaGVsbG8gd29ybGQ8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4yLjE8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMi4xPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+anN0bDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzdGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4gICAgICAgIAotCi0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmFmYjM5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuazsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5kb21haW4uUGVyc29uOwotCi0vKioKLSAqIEEgdHlwaWNhbCBzaW1wbGUgYmFja2luZyBiZWFuLCB0aGF0IGlzIGJhY2tlZCB0byA8Y29kZT5oZWxsb3dvcmxkLmpzcDwvY29kZT4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZENvbnRyb2xsZXIKLXsKLSAgICBwcml2YXRlIFBlcnNvbiBwZXJzb24gPSBuZXcgUGVyc29uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBkZWZhdWx0IGVtcHR5IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIEhlbGxvV29ybGRDb250cm9sbGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHRoYXQgaXMgYmFja2VkIHRvIGEgc3VibWl0IGJ1dHRvbiBvZiBhIGZvcm0uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBzZW5kKCkKLSAgICB7Ci0gICAgICAgIC8vZG8gcmVhbCBsb2dpYywgcmV0dXJuIGEgc3RyaW5nIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgdGhlIG5hdmlnYXRpb24gc3lzdGVtIG9mIEpTRgotICAgICAgICByZXR1cm4gInN1Y2Nlc3MiOwotICAgIH0KLQotICAgIHB1YmxpYyBQZXJzb24gZ2V0UGVyc29uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwZXJzb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbiBwZXJzb24pCi0gICAgewotICAgICAgICB0aGlzLnBlcnNvbiA9IHBlcnNvbjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkNGE5ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5kb21haW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOwotCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOwotCi1wdWJsaWMgY2xhc3MgUGVyc29uCi17Ci0gICAgLy9oZWxsbyB3b3JsZCBkZW1vCi0gICAgQFJlcXVpcmVkCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOwotCi0gICAgLy9kZW1vIGZvciBqcGEgYmFzZWQgdmFsaWRhdGlvbiBzdXBwb3J0Ci0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxMCAvKi4uLiovKQotICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGxhc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGIvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmJlYWU3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGZhY2VzLWNvbmZpZyB2ZXJzaW9uPSIxLjIiIAotICAgIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIj4KLQkKLQk8IS0tIG1hbmFnZWQgYmVhbnMgb2YgdGhlIHNpbXBsZSBoZWxsbyB3b3JsZCBhcHAgLS0+Ci0JPG1hbmFnZWQtYmVhbj4KLQkJPG1hbmFnZWQtYmVhbi1uYW1lPmhlbGxvV29ybGQ8L21hbmFnZWQtYmVhbi1uYW1lPgotCQk8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5IZWxsb1dvcmxkQ29udHJvbGxlcjwvbWFuYWdlZC1iZWFuLWNsYXNzPgotCQk8bWFuYWdlZC1iZWFuLXNjb3BlPnJlcXVlc3Q8L21hbmFnZWQtYmVhbi1zY29wZT4KLQk8L21hbmFnZWQtYmVhbj4KLQkKLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIGhlbGxvV29ybGQuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L2hlbGxvV29ybGQuanNwPC9mcm9tLXZpZXctaWQ+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPnN1Y2Nlc3M8L2Zyb20tb3V0Y29tZT4KLQkJCTx0by12aWV3LWlkPi9wYWdlMi5qc3A8L3RvLXZpZXctaWQ+Ci0JCTwvbmF2aWdhdGlvbi1jYXNlPgotCTwvbmF2aWdhdGlvbi1ydWxlPgotCQotCTwhLS0gbmF2aWdhdGlvbiBydWxlcyBmb3IgcGFnZTIuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L3BhZ2UyLmpzcDwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5iYWNrPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vaGVsbG9Xb3JsZC5qc3A8L3RvLXZpZXctaWQ+Ci0JCTwvbmF2aWdhdGlvbi1jYXNlPgotCTwvbmF2aWdhdGlvbi1ydWxlPgotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTRhMTgzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgotICAgICAgICAgdmVyc2lvbj0iMi40Ij4KLQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8IS0tb3B0aW9uYWw6IGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Db21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBVUklzIG9mIChhZGRpdGlvbmFsKSBmYWNlcyBjb25maWcgZmlsZXMuCi0gICAgICAgICAgICAoZS5nLiAvV0VCLUlORi9teS1jb25maWcueG1sKQotICAgICAgICAgICAgU2VlIEpTRiAxLjAgUFJEMiwgMTAuMy4yCi0gICAgICAgICAgICBBdHRlbnRpb246IFlvdSBkbyBub3QgbmVlZCB0byBwdXQgL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBpbiBoZXJlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5DT05GSUdfRklMRVM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0tLT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBTZWUgSlNGIFNwZWNpZmljYXRpb24gMi41LjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIGFtb3VudCAoZGVmYXVsdCA9IDIwKSBvZiB0aGUgbGF0ZXN0IHZpZXdzIGFyZSBzdG9yZWQgaW4gc2Vzc2lvbi48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuTlVNQkVSX09GX1ZJRVdTX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc3RhdGUgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0gYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLgotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KSBhbmQgaWYKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgY29tcHJlc3NlZC48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcGFyYW1ldGVyIHRlbGxzIE15RmFjZXMgaWYgamF2YXNjcmlwdCBjb2RlIHNob3VsZCBiZSBhbGxvd2VkIGluIHRoZQotICAgICAgICAgICAgcmVuZGVyZWQgSFRNTCBvdXRwdXQuCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUKLSAgICAgICAgICAgIHRoYXQgc3VibWl0cyB0aGUgY29ycmVzcG9uZGluZyBmb3JtLgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBub3QgYWxsb3dlZCwgdGhlIHN0YXRlIHNhdmluZyBpbmZvIGFuZCBuZXN0ZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BTExPV19KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuREVURUNUX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgcmVuZGVyZWQgSFRNTCBjb2RlIHdpbGwgYmUgZm9ybWF0dGVkLCBzbyB0aGF0IGl0IGlzICJodW1hbiByZWFkYWJsZSIuCi0gICAgICAgICAgICBpLmUuIGFkZGl0aW9uYWwgbGluZSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIHdpbGwgYmUgd3JpdHRlbiwgdGhhdCBkbyBub3QKLSAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgSFRNTCBjb2RlLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlBSRVRUWV9IVE1MPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlCi0gICAgICAgICAgICBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuIENvbnZlbmllbnQgZmVhdHVyZSBpZiB5b3UgaGF2ZSBwYWdlcwotICAgICAgICAgICAgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGJyb3dzZXIgcGFnZSB0byBhbHdheXMganVtcCB0byB0aGUgdG9wCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuCi0gICAgICAgICAgICBEZWZhdWx0OiAiZmFsc2UiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFVVE9fU0NST0xMPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Vc2VkIGZvciBlbmNyeXB0aW5nIHZpZXcgc3RhdGUuIE9ubHkgcmVsZXZhbnQgZm9yIGNsaWVudCBzaWRlCi0gICAgICAgICAgICBzdGF0ZSBzYXZpbmcuIFNlZSBNeUZhY2VzIHdpa2kvd2ViIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRUNSRVQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWYWxpZGF0ZSBtYW5hZ2VkIGJlYW5zLCBuYXZpZ2F0aW9uIHJ1bGVzIGFuZCBlbnN1cmUgdGhhdCBmb3JtcyBhcmUgbm90IG5lc3RlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlZBTElEQVRFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUcmVhdCByZWFkb25seSBzYW1lIGFzIGlmIGRpc2FibGVkIGF0dHJpYnV0ZSB3YXMgc2V0IGZvciBzZWxlY3QgZWxlbWVudHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5SRUFET05MWV9BU19ESVNBQkxFRF9GT1JfU0VMRUNUUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFVzZSB0aGUgZGVmaW5lZCBjbGFzcyBhcyB0aGUgY2xhc3Mgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiBhIHJlc291cmNlIGlzIGFkZGVkIHRvIHRoZQotICAgICAgICAgICAgRXh0ZW5zaW9uRmlsdGVyIGhhbmRsaW5nLiBVc2luZyBTdHJlYW1pbmdBZGRSZXNvdXJjZSBoZXJlIGhlbHBzIHdpdGggcGVyZm9ybWFuY2UuIElmIHlvdSB3YW50IHRvIGFkZAotICAgICAgICAgICAgY3VzdG9tIGNvbXBvbmVudHMgYW5kIHdhbnQgdG8gdXNlIHRoZSBFeHRlbnNpb25GaWx0ZXIsIHlvdSBuZWVkIHRvIHByb3ZpZGUgeW91ciBjdXN0b20gaW1wbGVtZW50YXRpb24gaGVyZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFERF9SRVNPVVJDRV9DTEFTUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC51dGlsLkRlZmF1bHRBZGRSZXNvdXJjZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAgICAgCi0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmlydHVhbCBwYXRoIGluIHRoZSBVUkwgd2hpY2ggdHJpZ2dlcnMgbG9hZGluZyBvZiByZXNvdXJjZXMgZm9yIHRoZSBNeUZhY2VzIGV4dGVuZGVkIGNvbXBvbmVudHMKLSAgICAgICAgICAgIGluIHRoZSBFeHRlbnNpb25GaWx0ZXIuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5SRVNPVVJDRV9WSVJUVUFMX1BBVEg8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vZmFjZXMvbXlGYWNlc0V4dGVuc2lvblJlc291cmNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIENoZWNrIGlmIHRoZSBleHRlbnNpb25zLWZpbHRlciBoYXMgYmVlbiBwcm9wZXJseSBjb25maWd1cmVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ0hFQ0tfRVhURU5TSU9OU19GSUxURVI8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIERlZmluZSBwYXJ0aWFsIHN0YXRlIHNhdmluZyBhcyB0cnVlL2ZhbHNlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5QQVJUSUFMX1NUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLQotICAgIDwhLS0gTGlzdGVuZXIsIHRvIGFsbG93IEpldHR5IHNlcnZpbmcgTXlGYWNlcyBhcHBzIC0tPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy53ZWJhcHAuU3RhcnR1cFNlcnZsZXRDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZyAtLT4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPiouanNmPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguanNwPC93ZWxjb21lLWZpbGU+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwIGIvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZTEwYjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIzIj4KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9ImZpcnN0X25hbWUiIHZhbHVlPSJGaXJzdCBuYW1lOiIvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0iZmlyc3RfbmFtZSIgbGFiZWw9IkZpcnN0IG5hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQucGVyc29uLmZpcnN0TmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0iZmlyc3RfbmFtZSIgc2hvd1N1bW1hcnk9InRydWUiIHNob3dEZXRhaWw9ImZhbHNlIi8+Ci0KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9Imxhc3RfbmFtZSIgdmFsdWU9Ikxhc3QgbmFtZToiLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9Imxhc3RfbmFtZSIgbGFiZWw9Ikxhc3QgbmFtZSIgdmFsdWU9IiN7aGVsbG9Xb3JsZC5wZXJzb24ubGFzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9Imxhc3RfbmFtZSIgc2hvd1N1bW1hcnk9InRydWUiIHNob3dEZXRhaWw9ImZhbHNlIi8+Ci0KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJQcmVzcyBtZSIgYWN0aW9uPSIje2hlbGxvV29ybGQuc2VuZH0iLz4KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4KLSAgICAgICAgICAgICAgPC9oOnBhbmVsR3JpZD4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICA8L2Y6dmlldz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ODJkNTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgcGFnZSBzZXNzaW9uPSJmYWxzZSIlPgotPCUKLXJlc3BvbnNlLnNlbmRSZWRpcmVjdCgiaGVsbG9Xb3JsZC5qc2YiKTsKLSU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwIGIvcHJlcGFyZS8xXzJfMV9yYy9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWM4NTIzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwlLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tJT4KLQotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgICAgPGY6dmlldz4KLSAgICAgICAgICAgIDxoOmZvcm0gaWQ9Im1haW5Gb3JtIj4KLSAgICAgICAgICAgICAgICA8aDI+PGg6b3V0cHV0VGV4dCB2YWx1ZT0iSGVsbG8gI3toZWxsb1dvcmxkLnBlcnNvbi5maXJzdE5hbWV9ICN7aGVsbG9Xb3JsZC5wZXJzb24ubGFzdE5hbWV9LiBXZSBob3BlIHlvdSBlbmpveSBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciEiLz48L2gyPgotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIGFjdGlvbj0iYmFjayI+Ci0gICAgICAgICAgICAgICAgICAgIDxoOm91dHB1dFRleHQgdmFsdWU9IkhvbWUiLz4KLSAgICAgICAgICAgICAgICA8L2g6Y29tbWFuZExpbms+Ci0gICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgPC9mOnZpZXc+Ci0gICAgPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvcG9tLnhtbCBiL3ByZXBhcmUvMV8yXzFfcmMvZXhhbXBsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxYTNiYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL2V4YW1wbGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIHByb2plY3Q8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4yLjE8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjE8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMV9yY2V4YW1wbGVzPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzFfcmNleGFtcGxlczwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzFfcmNleGFtcGxlczwvdXJsPgotICAgIDwvc2NtPgotICAgIAotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS1UaGlzIHBsdWdpbiBhbGxvd3MgdG8gcnVuIHRoZSBleGFtcGxlIHVzaW5nIG12biBqZXR0eTpydW4gLS0+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamV0dHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjYuMS44PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c2NhbkludGVydmFsU2Vjb25kcz4xMDwvc2NhbkludGVydmFsU2Vjb25kcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLSAgICA8bW9kdWxlcz4KLSAgICAgICAgPG1vZHVsZT5oZWxsb193b3JsZDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmZlYXR1cmUtc2V0XzAxPC9tb2R1bGU+Ci0gICAgPC9tb2R1bGVzPgotCi0gICAgPHByb2ZpbGVzPgotICAgICAgICA8IS0tIFRoaXMgcHJvZmlsZSBpcyBpbnZva2VkIGJ5IC1EcHJlcGFyZVJlbGVhc2U9dHJ1ZS4gIFRoaXMgYWxsb3dzIG12biByZWxlYXNlOnByZXBhcmUgdG8KLSAgICAgICAgICAgIHJ1biBzdWNjZXNzZnVsbHkgb24gdGhlIGFzc2VtYmx5IHByb2plY3RzLiAtLT4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+cHJlcGFyZS1yZWxlYXNlPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+cHJlcGFyZVJlbGVhc2U8L25hbWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxtb2R1bGVzPgotICAgICAgICAgICAgICAgIDxtb2R1bGU+YXNzZW1ibHk8L21vZHVsZT4KLSAgICAgICAgICAgIDwvbW9kdWxlcz4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ3VtZW50cz4tRHByZXBhcmVSZWxlYXNlPC9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDx0cmluaWRhZC52ZXJzaW9uPjEuMi45PC90cmluaWRhZC52ZXJzaW9uPgotICAgIDwvcHJvcGVydGllcz4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvcGFyZW50L0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzJfMV9yYy9wYXJlbnQvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDU2OTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9wYXJlbnQvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvcGFyZW50L05PVElDRS50eHQgYi9wcmVwYXJlLzFfMl8xX3JjL3BhcmVudC9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDliZGIxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvcGFyZW50L05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9wYXJlbnQvcG9tLnhtbCBiL3ByZXBhcmUvMV8yXzFfcmMvcGFyZW50L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ODIwOTQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9wYXJlbnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMi4xPC92ZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgUHJvamVjdCBQYXJlbnQ8L25hbWU+Ci0gICAgPHVybD5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTI8L3VybD4KLQotICAgIDxpc3N1ZU1hbmFnZW1lbnQ+Ci0gICAgICAgIDxzeXN0ZW0+amlyYTwvc3lzdGVtPgotICAgICAgICA8dXJsPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9FWFRWQUw8L3VybD4KLSAgICA8L2lzc3VlTWFuYWdlbWVudD4KLQotICAgIDxjaU1hbmFnZW1lbnQ+Ci0gICAgICAgIDxzeXN0ZW0+Y29udGludXVtPC9zeXN0ZW0+Ci0gICAgICAgIDx1cmw+aHR0cDovL215ZmFjZXMuem9uZXMuYXBhY2hlLm9yZzo4MDgwL2NvbnRpbnV1bTwvdXJsPgotICAgICAgICA8bm90aWZpZXJzPgotICAgICAgICAgICAgPG5vdGlmaWVyPgotICAgICAgICAgICAgICAgIDx0eXBlPm1haWw8L3R5cGU+Ci0gICAgICAgICAgICAgICAgPHNlbmRPblN1Y2Nlc3M+dHJ1ZTwvc2VuZE9uU3VjY2Vzcz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGFkZHJlc3M+Y29tbWl0c0BteWZhY2VzLmFwYWNoZS5vcmc8L2FkZHJlc3M+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9ub3RpZmllcj4KLSAgICAgICAgPC9ub3RpZmllcnM+Ci0gICAgPC9jaU1hbmFnZW1lbnQ+Ci0gICAgCi0gICAgPGluY2VwdGlvblllYXI+MjAwODwvaW5jZXB0aW9uWWVhcj4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn08L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD5NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotCi0gICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgotICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KLQotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLQotICAgICAgICAgICAgICAgICAgICAtIENvcHkgTElDRU5TRS50eHQgYW5kIE5PVElDRS50eHQgc28gdGhhdCB0aGV5IGFyZSBpbmNsdWRlZAotICAgICAgICAgICAgICAgICAgICAtIGluIHRoZSAtamF2YWRvYyBqYXIgZmlsZSBmb3IgdGhlIGNvbXBvbmVudC4KLSAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5qYXZhZG9jLnJlc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2FwaWRvY3MvTUVUQS1JTkYiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJMSUNFTlNFLnR4dCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJOT1RJQ0UudHh0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgICAgLSBNYWtlIGEgY2hlY2tzdHlsZSB2aW9sYXRpb24gYSBjb21waWxlIGVycm9yLiBOb3RlIHRoYXQgaWYgYSBjb21waWxlIGVycm9yIG9jY3VycywKLSAgICAgICAgICAgICAgICAtIGZ1cnRoZXIgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRhcmdldC9zaXRlL2NoZWNrc3R5bGUuaHRtbCAocHJlc2VudCBldmVuIHdoZW4KLSAgICAgICAgICAgICAgICAtIGp1c3QgdGhlIGNvbXBpbGUgZ29hbCBhbmQgbm90IHRoZSBzaXRlIGdvYWwgaGFzIGJlZW4gcnVuKS4gTm90ZSBhbHNvIHRoYXQgY2hpbGQKLSAgICAgICAgICAgICAgICAtIHByb2plY3RzIG1heSByZWRlY2xhcmUgdGhpcyBwbHVnaW4gYW5kIHByb3ZpZGUgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MKLSAgICAgICAgICAgICAgICAtIHRvIHVzZSBkaWZmZXJlbnQgY2hlY2tzIChtb3JlIG9yIGxlc3Mgc3RyaWN0IHRoYW4gdGhlIGRlZmF1bHQpLgotICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD52ZXJpZnktc3R5bGU8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWdMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0YW5kYXJkLnhtbDwvY29uZmlnTG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxoZWFkZXJMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtaGVhZGVyLnR4dDwvaGVhZGVyTG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tIFNldCBjb21waWxlIHNvdXJjZSBhdCAxLjUsIHNpbmNlIHRoZSB0YXJnZXQgSlNGIGltcGwgaXMgMS4yIC0tPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvcHRpbWl6ZT5mYWxzZTwvb3B0aW1pemU+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi0gICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+bWF2ZW4yLXJlcG9zaXRvcnkuZGV2LmphdmEubmV0PC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkphdmEubmV0IFJlcG9zaXRvcnkgZm9yIE1hdmVuPC9uYW1lPgotICAgICAgICAgICAgPHVybD5odHRwOi8vZG93bmxvYWQuamF2YS5uZXQvbWF2ZW4vMS88L3VybD4KLSAgICAgICAgICAgIDxsYXlvdXQ+bGVnYWN5PC9sYXlvdXQ+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICA8L3JlcG9zaXRvcmllcz4KLQotICAgIDxyZXBvcnRpbmc+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tanhyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcmVwb3J0LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcG1kLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxydWxlc2V0cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxydWxlc2V0Pi9ydWxlc2V0cy9iYXNpYy54bWw8L3J1bGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvdW51c2VkY29kZS54bWw8L3J1bGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvcnVsZXNldHM+Ci0gICAgICAgICAgICAgICAgICAgIDxsaW5rWHJlZj50cnVlPC9saW5rWHJlZj4KLSAgICAgICAgICAgICAgICAgICAgPG1pbmltdW1Ub2tlbnM+MTAwPC9taW5pbXVtVG9rZW5zPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0SmRrPjEuNTwvdGFyZ2V0SmRrPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY2hlY2tzdHlsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlnTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdGFuZGFyZC54bWw8L2NvbmZpZ0xvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aGVhZGVyTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWhlYWRlci50eHQ8L2hlYWRlckxvY2F0aW9uPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9yZXBvcnRpbmc+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMV9yY3BhcmVudDwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8xX3JjcGFyZW50PC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMV9yY3BhcmVudDwvdXJsPgotICAgIDwvc2NtPgotCi0gICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgICAgIDxzbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8dW5pcXVlVmVyc2lvbj5mYWxzZTwvdW5pcXVlVmVyc2lvbj4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUuc25hcHNob3RzPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBNYXZlbiBTbmFwc2hvdCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1zbmFwc2hvdC1yZXBvc2l0b3J5PC91cmw+Ci0gICAgICAgIDwvc25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICA8c2l0ZT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc2l0ZTwvaWQ+Ci0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMjwvdXJsPgotICAgICAgICA8L3NpdGU+Ci0gICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgotCi0gICAgPHByb2ZpbGVzPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5nZW5lcmF0ZS1hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPnBlcmZvcm1SZWxlYXNlPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1qYXZhZG9jczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotICAgIDwvcHJvZmlsZXM+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGpzZi52ZXJzaW9uPjEuMi40PC9qc2YudmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL3ByZXBhcmUvMV8yXzFfcmMvcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyODc5MzAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIC0tLS0tLQ0KLU92ZXJ2aWV3DQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4yDQotDQotICBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBwcm92aWRlcyB2ZXJzaW9ucyBmb3IgSlNGIDEuMSBhbmQgMS4yDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9wYXJlbnQvc3JjL3NpdGUvc2l0ZS54bWwgYi9wcmVwYXJlLzFfMl8xX3JjL3BhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU3NjMxYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3BhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCBuYW1lPSJBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciI+Ci0gIDxiYW5uZXJMZWZ0PgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzPC9uYW1lPgotICAgIDxzcmM+aW1nL2Jhbm5lcnMvTXlGYWNlc19sb2dvLmpwZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbDwvaHJlZj4KLSAgPC9iYW5uZXJMZWZ0PgotCi0gIDxiYW5uZXJSaWdodD4KLSAgICA8bmFtZT5BcGFjaGUgQmFubmVyPC9uYW1lPgotICAgIDxzcmM+aW1nL2Jhbm5lcnMvYXBhY2hlX2Jhbm5lci5wbmc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC9ocmVmPgotICA8L2Jhbm5lclJpZ2h0PiAgCi0KLSAgPHB1Ymxpc2hEYXRlIGZvcm1hdD0iZGQgTU1NIHl5eXkiLz4KLQotICA8c2tpbj4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1zaXRlLXNraW48L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9za2luPgotCi0gIDxib2R5PgotICAgIDxsaW5rcz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSIgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJNeUZhY2VzIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkRvd25sb2FkIE15ZmFjZXMgRXh0VmFsIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Rvd25sb2FkLmh0bWwiLz4KLSAgICA8L2xpbmtzPgotCi0gICAgPG1lbnUgbmFtZT0iQXBhY2hlIE15RmFjZXMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9kb3dubG9hZC5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgbmFtZT0iQ29udGVudHMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9Ik1haW4gU2l0ZSIgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgPGl0ZW0gbmFtZT0iRXh0VmFsIGZvciBKU0YgMS4xIiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvaW5kZXguaHRtbCIgY29sbGFwc2U9InRydWUiPgotICAgICAgICAgICAgPGl0ZW0gbmFtZT0iZHVtbXkiICAgICAgICBocmVmPSJkdW1teSIvPgotICAgICAgICA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkV4dFZhbCBmb3IgSlNGIDEuMiIgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IkNvcmUgTW9kdWxlIiAgICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL215ZmFjZXMtZXh0dmFsLWNvcmUvaW5kZXguaHRtbCIvPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJQcm9wZXJ0eSBWYWxpZGF0aW9uIiAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi92YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iVHJpbmlkYWQgU3VwcG9ydCIgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQvaW5kZXguaHRtbCIvPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJHZW5lcmljIFN1cHBvcnQiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0L2luZGV4Lmh0bWwiLz4KLSAgICAgICAgPC9pdGVtPgotICAgIDwvbWVudT4KLQkKLSAgICA8bWVudSBuYW1lPSJEb2N1bWVudGF0aW9uIj4KLSAgICAgIDxpdGVtIG5hbWU9Ildpa2kiICAgICAgICAgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9teWZhY2VzL0V4dGVuc2lvbnMvVmFsaWRhdG9yLyIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IHJlZj0icmVwb3J0cyIvPgotCi0gICAgPG1lbnUgbmFtZT0iRm91bmRhdGlvbiIgaW5oZXJpdD0iYm90dG9tIj4KLSAgICAgIDxpdGVtIG5hbWU9IkFTRiIgICAgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIiAvPgotICAgICAgPGl0ZW0gbmFtZT0iU3BvbnNvcnNoaXAiICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3Nwb25zb3JzaGlwLmh0bWwiIC8+Ci0gICAgICA8aXRlbSBuYW1lPSJUaGFua3MiICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vdGhhbmtzLmh0bWwiIC8+Ci0gICAgPC9tZW51PgotICA8L2JvZHk+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3BvbS54bWwgYi9wcmVwYXJlLzFfMl8xX3JjL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNWIwNDEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj42PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLW1vZHVsZTwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjIuMTwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIE1vZHVsZTwvbmFtZT4KLSAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMjwvdXJsPgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzFfcmM8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMV9yYzwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzFfcmM8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgICAgICA8c25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICAgICAgPHVuaXF1ZVZlcnNpb24+ZmFsc2U8L3VuaXF1ZVZlcnNpb24+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLnNuYXBzaG90czwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgTWF2ZW4gU25hcHNob3QgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgPHNpdGU+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTI8L3VybD4KLSAgICAgICAgPC9zaXRlPgotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotICAgIDwhLS0gV0FSTklORzogRE8gTk9UIEdFTkVSQVRFIFNJVEUgRlJPTSBIRVJFIERJUkVDVExZCi0gICAgU2luY2UgdGhpcyBwcm9qZWN0IGhhcyBhbiBhc3luYyByZWxlYXNlIHByb2NlZHVyZSAobm90Ci0gICAgYWxsIG1vZHVsZXMgc2hvdWxkIGJlIHJlbGVhc2VkIGF0IG9uY2UpLCB0aGUgcGFyZW50IHBvbS54bWwgCi0gICAgaXMgbm90IHRoaXMgKHRoZXJlIGlzIGEgbW9kdWxlIGZvciB0aGF0KS4gVXNlIG1hdmVuIHNpdGUgCi0gICAgcGx1Z2luIGhlcmUgY2F1c2UgcHJvYmxlbXMgd2hlbiB0aGUgc2l0ZSBpcyBnZW5lcmF0ZWQuCi0gICAgVGhlIHByb2NlZHVyZSBtdXN0IGV4ZWN1dGUgc2l0ZSBjb21tbWFuZCBmaXJzdCBvbiBwYXJlbnQgCi0gICAgbW9kdWxlIGFuZCB0aGVuIG9uIGVhY2ggbW9kdWxlIGxpc3RlZCBiZWxvdy4gCi0gICAgIC0tPgotCi0gICAgPG1vZHVsZXM+Ci0gICAgICAgIDxtb2R1bGU+cGFyZW50PC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+Y29yZTwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPnZhbGlkYXRpb24tbW9kdWxlczwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmNvbXBvbmVudC1zdXBwb3J0PC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+ZXhhbXBsZXM8L21vZHVsZT4KLSAgICA8L21vZHVsZXM+Ci0KLSAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDwhLS0gVGhpcyBwcm9maWxlIGlzIGludm9rZWQgYnkgLURwcmVwYXJlUmVsZWFzZT10cnVlLiAgVGhpcyBhbGxvd3MgbXZuIHJlbGVhc2U6cHJlcGFyZSB0bwotICAgICAgICAgICAgcnVuIHN1Y2Nlc3NmdWxseSBvbiB0aGUgYXNzZW1ibHkgcHJvamVjdHMuIC0tPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5wcmVwYXJlLXJlbGVhc2U8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wcmVwYXJlUmVsZWFzZTwvbmFtZT4KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPG1vZHVsZXM+Ci0gICAgICAgICAgICAgICAgPG1vZHVsZT5hc3NlbWJseTwvbW9kdWxlPgotICAgICAgICAgICAgPC9tb2R1bGVzPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVsZWFzZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnRzPi1EcHJlcGFyZVJlbGVhc2U8L2FyZ3VtZW50cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotICAgIDwvcHJvZmlsZXM+Ci0gICAgCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxqc2YudmVyc2lvbj4xLjIuNDwvanNmLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvc2l0ZS9wb20ueG1sIGIvcHJlcGFyZS8xXzJfMV9yYy9zaXRlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZWYwMzMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9zaXRlL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gICAgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgICAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgICAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICAgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgICAqCi0gICAgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAgICoKLSAgICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+NjwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtc2l0ZTwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjIuMS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yPC9uYW1lPgotICAgIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjwvdXJsPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8ZGVmYXVsdEdvYWw+c2l0ZTwvZGVmYXVsdEdvYWw+Ci0gICAgICAgIDxleHRlbnNpb25zPgotICAgICAgICAgIDxleHRlbnNpb24+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLndhZ29uPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+d2Fnb24tc3NoLWV4dGVybmFsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wLWFscGhhLTU8L3ZlcnNpb24+Ci0gICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgIDwvZXh0ZW5zaW9ucz4KLSAgICA8L2J1aWxkPgotICAgIDxyZXBvcnRpbmc+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvcmVwb3J0aW5nPgotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rL3NpdGU8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay9zaXRlPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rL3NpdGU8L3VybD4KLSAgICA8L3NjbT4KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgIDxzaXRlPgotICAgICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPgotICAgICAgICA8bmFtZT5BcGFjaGUgV2Vic2l0ZTwvbmFtZT4KLSAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yPC91cmw+Ci0gICAgICA8L3NpdGU+Ci0gICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3NpdGUvc3JjL3NpdGUvYXB0L2Rvd25sb2FkLmFwdCBiL3ByZXBhcmUvMV8yXzFfcmMvc2l0ZS9zcmMvc2l0ZS9hcHQvZG93bmxvYWQuYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjEzNmEyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvc2l0ZS9zcmMvc2l0ZS9hcHQvZG93bmxvYWQuYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLSB+fiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gfn4gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotIH5+IHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gfn4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gfn4gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gfn4gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gfn4NCi0gfn4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gfn4NCi0gfn4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSB+fiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSB+fiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gfn4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSB+fiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gDQotIC0tLS0tLQ0KLURvd25sb2FkIEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotIC0tLS0tLQ0KLQ0KLURvd25sb2FkIEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotDQotDQotICBVc2UgdGhlIGxpbmtzIGJlbG93IHRvIGRvd25sb2FkIGEgZGlzdHJpYnV0aW9uIG9mIEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZyb20NCi0gIG9uZSBvZiBvdXIgbWlycm9ycy4gSXQgaXMgZ29vZCBwcmFjdGljZSB0byB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGUNCi0gIGRpc3RyaWJ1dGlvbiBmaWxlcy4NCi0NCi0gIFlvdSB3aWxsIGJlIHByb21wdGVkIGZvciBhIG1pcnJvciAtIGlmIHRoZSBmaWxlIGlzIG5vdCBmb3VuZCBvbiB5b3VycywgcGxlYXNlIGJlIHBhdGllbnQsIGFzIGl0IG1heSB0YWtlIDI0DQotICBob3VycyB0byByZWFjaCBhbGwgbWlycm9ycy4NCi0NCi0gIEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGRpc3RyaWJ1dGVkIGFzIGEgPDw8emlwPj4+IGFyY2hpdmUgKGZvciBXaW5kb3dzKSBhbmQNCi0gIGFzIGEgPDw8dGFyLmd6Pj4+IGFyY2hpdmUgKGZvciBVTklYKS4gVGhlIGNvbnRlbnQgaXMgdGhlIHNhbWUuIFBsZWFzZSBub3RlDQotICB0aGF0IHRoZSA8PDx0YXIuZ3o+Pj4gYXJjaGl2ZXMgY29udGFpbiBmaWxlIG5hbWVzIGxvbmdlciB0aGFuIDEwMCBjaGFyYWN0ZXJzIGFuZCBoYXZlIGJlZW4NCi0gIGNyZWF0ZWQgdXNpbmcgR05VIHRhciBleHRlbnNpb25zLiBUaHVzIHRoZXkgbXVzdCBiZSB1bnRhcnJlZCB3aXRoIGEgR05VIGNvbXBhdGlibGUNCi0gIHZlcnNpb24gb2YgdGFyLg0KLQ0KLSAgPDwgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgMS4wLjAgRGlzdHJpYnV0aW9uID4+DQotDQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCAgICAgICAgICAgICAgICAgICAgICAgICB8IE1pcnJvcnMgfCBDaGVja3N1bSB8IFNpZ25hdHVyZSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4xIDEuMS4xICh0YXIuZ3opICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjEtYmluLnRhci5nen0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4udGFyLmd6fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjEtYmluLnRhci5nei5tZDV9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjEtYmluLnRhci5nei5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4udGFyLmd6LmFzY30gbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4udGFyLmd6LmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjEgMS4xLjEgKHppcCkgICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjEtYmluLnppcH0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4uemlwfX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjEtYmluLnppcC5tZDV9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjEtYmluLnppcC5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4uemlwLmFzY30gbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4uemlwLmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjEgMS4xLjEgU291cmNlICh0YXIuZ3opICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMS4xLXNyYy50YXIuZ3p9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjEtc3JjLnRhci5nen19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1zcmMudGFyLmd6Lm1kNX0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1zcmMudGFyLmd6Lm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1zcmMudGFyLmd6LmFzY30gbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1zcmMudGFyLmd6LmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjEgMS4xLjEgU291cmNlICh6aXApICAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1zcmMuemlwfSBteWZhY2VzLWV4dHZhbDExLTEuMS4xLXNyYy56aXB9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4xLjEtc3JjLnppcC5tZDV9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjEtc3JjLnppcC5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4xLjEtc3JjLnppcC5hc2N9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjEtc3JjLnppcC5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4yIDEuMi4xICh0YXIuZ3opICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjEtYmluLnRhci5nen0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4udGFyLmd6fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjEtYmluLnRhci5nei5tZDV9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjEtYmluLnRhci5nei5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4udGFyLmd6LmFzY30gbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4udGFyLmd6LmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjIgMS4yLjEgKHppcCkgICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjEtYmluLnppcH0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4uemlwfX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjEtYmluLnppcC5tZDV9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjEtYmluLnppcC5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4uemlwLmFzY30gbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4uemlwLmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjIgMS4yLjEgU291cmNlICh0YXIuZ3opICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4xLXNyYy50YXIuZ3p9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjEtc3JjLnRhci5nen19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1zcmMudGFyLmd6Lm1kNX0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1zcmMudGFyLmd6Lm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1zcmMudGFyLmd6LmFzY30gbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1zcmMudGFyLmd6LmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjIgMS4yLjEgU291cmNlICh6aXApICAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1zcmMuemlwfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLXNyYy56aXB9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjEtc3JjLnppcC5tZDV9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjEtc3JjLnppcC5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjEtc3JjLnppcC5hc2N9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjEtc3JjLnppcC5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotDQotTGF0ZXN0IHNvdXJjZSBjb2RlIGZyb20gU1ZOIHJlcG9zaXRvcnkNCi0NCi0gICAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBsYXRlc3QgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZmVhdHVyZXMsIHRoZSBzb3VyY2UgY29kZSBpcyB1bmRlcg0KLSAgICB2ZXJzaW9uIGNvbnRyb2wgd2l0aCBTVk4uICBDbGljayB7e3tzb3VyY2UtcmVwb3NpdG9yeS5odG1sfSBoZXJlIH19DQotICAgIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIHRoZSBBU0YgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgU1ZOIFJlcG9zaXRvcnkuDQotDQotVmVyaWZ5aW5nIGNoZWNrc3Vtcw0KLQ0KLSAgICBJdCBpcyBlc3NlbnRpYWwgdGhhdCB5b3UgdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGRvd25sb2FkZWQNCi0gICAgZmlsZXMgdXNpbmcgdGhlIFBHUCBhbmQgTUQ1IHNpZ25hdHVyZXMuIE1ENSB2ZXJpZmljYXRpb24gZW5zdXJlcyB0aGUNCi0gICAgZmlsZSB3YXMgbm90IGNvcnJ1cHRlZCBkdXJpbmcgdGhlIGRvd25sb2FkIHByb2Nlc3MuIFBHUCB2ZXJpZmljYXRpb24NCi0gICAgZW5zdXJlcyB0aGF0IHRoZSBmaWxlIGNhbWUgZnJvbSBhIGNlcnRhaW4gcGVyc29uLg0KLQ0KLSAgICBUbyB2ZXJpZnkgdGhlIE1ENSBzaWduYXR1cmUgb24gdGhlIGZpbGVzLCB5b3UgbmVlZCB0byB1c2UgYSBwcm9ncmFtDQotICAgIGNhbGxlZCA8PDxtZDU+Pj4gb3IgPDw8bWQ1c3VtPj4+LCB3aGljaCBpcw0KLSAgICBpbmNsdWRlZCBpbiBtYW55IFVOSVggZGlzdHJpYnV0aW9ucy4gIEl0IGlzIGFsc28gYXZhaWxhYmxlIGFzIHBhcnQgb2YNCi0gICAge3t7aHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL3RleHR1dGlscy90ZXh0dXRpbHMuaHRtbH1HTlUgVGV4dHV0aWxzfX0uDQotICAgIFdpbmRvd3MgdXNlcnMgY2FuIGdldCBiaW5hcnkgbWQ1IHByb2dyYW1zIGZyb20ge3t7aHR0cDovL3d3dy5mb3VybWlsYWIuY2gvbWQ1L31oZXJlfX0sDQotICAgIHt7e2h0dHA6Ly93d3cucGMtdG9vbHMubmV0L3dpbjMyL2ZyZWV3YXJlL2NvbnNvbGUvfWhlcmV9fSwgb3INCi0gICAge3t7aHR0cDovL3d3dy5zbGF2YXNvZnQuY29tL2ZzdW0vfWhlcmV9fS4NCi0NCi1WZXJpZnlpbmcgc2lnbmF0dXJlcw0KLQ0KLSAgCVBHUCB2ZXJpZmljYXRpb24gZW5zdXJlcyB0aGF0IHRoZSBmaWxlIGNhbWUgZnJvbSBhIGNlcnRhaW4gcGVyc29uLiAgV2Ugc3Ryb25nbHkgcmVjb21tZW5kDQotCSAgeW91IHZlcmlmeSB5b3VyIGRvd25sb2FkcyB3aXRoIGJvdGggUEdQIGFuZCBNRDUuDQotDQotCVRoZSBQR1Agc2lnbmF0dXJlcyBjYW4gYmUgdmVyaWZpZWQgdXNpbmcge3t7aHR0cDovL3d3dy5wZ3BpLm9yZy99UEdQfX0gb3IgDQotCXt7e2h0dHA6Ly93d3cuZ251cGcub3JnL31HUEd9fS4gIEZpcnN0IGRvd25sb2FkIHRoZSBBcGFjaGUgTXlGYWNlcyANCi0Je3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9LRVlTfUtFWVN9fQlhcyB3ZWxsIGFzIHRoZSA8PDxhc2M+Pj4gc2lnbmF0dXJlIGZpbGUgDQotCWZvciB0aGUgcGFydGljdWxhciBkaXN0cmlidXRpb24uIEl0IGlzIGltcG9ydGFudCB0aGF0IHlvdSBnZXQgdGhlc2UgZmlsZXMgZnJvbSB0aGUgdWx0aW1hdGUNCi0JdHJ1c3RlZCBzb3VyY2UgLSB0aGUgbWFpbiBBU0YgZGlzdHJpYnV0aW9uIHNpdGUsIHJhdGhlciB0aGFuIGZyb20gYSBtaXJyb3IuDQotCVRoZW4gdmVyaWZ5IHRoZSBzaWduYXR1cmVzIHVzaW5nIC4uLg0KLQ0KLQkgIDw8PA0KLQkgICUgcGdwayAtYSBLRVlTDQotCSAgJSBwZ3B2IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjEtYmluLnRhci5nei5hc2MgbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4udGFyLmd6DQotCSAgPj4+DQotDQotCSAgPG9yPg0KLQ0KLQkgIDw8PA0KLQkgICUgcGdwIC1rYSBLRVlTDQotCSAgJSBwZ3AgbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4udGFyLmd6LmFzYyBteWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi50YXIuZ3oNCi0JICA+Pj4NCi0NCi0JICA8b3I+DQotDQotCSAgPDw8DQotICAJJSBncGcgLS1pbXBvcnQgS0VZUw0KLQkgICUgZ3BnIC0tdmVyaWZ5IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjEtYmluLnRhci5nei5hc2MgbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4udGFyLmd6DQotCSAgPj4+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy9zaXRlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlLzFfMl8xX3JjL3NpdGUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyNTM5Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3NpdGUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGEgSlNGIGNlbnRyaWMgdmFsaWRhdGlvbiBmcmFtZXdvcmsuDQotICANCi0gICAgSXQgb2ZmZXJzIHBvd2VyZnVsIGFuZCBlYXN5IHRvIHVzZSBmaWVsZCBiYXNlZCB2YWxpZGF0aW9uIGJhc2VkIG9uIGFubm90YXRpb25zLg0KLUl0IGhhcyBhIHBsdWdnYWJsZSBhcmNoaXRlY3R1cmUsIHNvIGl0IGlzIHBvc3NpYmxlIHRvIGFkZCBuZXcgdmFsaWRhdGlvbiBtb2R1bGVzIG9yIHN1cHBvcnQgZm9yIGNvbXBvbmVudCBsaWJyYXJpZXMgbGlrZSBUcmluaWRhZCBvciBvdGhlciAzcmQgcGFydHkgZnJhbWV3b3Jrcy4NCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEuMS54IGFuZCBKU0YgMS4yLnguIEJvdGggdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsNCi0NCi0gICAgRnVydGhlciBpbmZvcm1hdGlvbiBhcmUgYXZhaWxhYmxlIGF0IHRoZSB7e3todHRwOi8vd2lraS5hcGFjaGUub3JnL215ZmFjZXMvRXh0ZW5zaW9ucy9WYWxpZGF0b3IvfVdpa2l9fS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3NpdGUvc3JjL3NpdGUvc2l0ZS54bWwgYi9wcmVwYXJlLzFfMl8xX3JjL3NpdGUvc3JjL3NpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZDA1Y2EuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy9zaXRlL3NyYy9zaXRlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IG5hbWU9IkFwYWNoZSBNeWZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIj4KLSAgPGJhbm5lckxlZnQ+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXM8L25hbWU+Ci0gICAgPHNyYz5pbWcvYmFubmVycy9NeUZhY2VzX2xvZ28uanBnPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sPC9ocmVmPgotICA8L2Jhbm5lckxlZnQ+Ci0KLSAgPGJhbm5lclJpZ2h0PgotICAgIDxuYW1lPkFwYWNoZSBCYW5uZXI8L25hbWU+Ci0gICAgPHNyYz5pbWcvYmFubmVycy9hcGFjaGVfYmFubmVyLnBuZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L2hyZWY+Ci0gIDwvYmFubmVyUmlnaHQ+ICAKLQotICA8cHVibGlzaERhdGUgZm9ybWF0PSJkZCBNTU0geXl5eSIvPgotCi0gIDxza2luPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5tYXZlbjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLXNpdGUtc2tpbjwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3NraW4+Ci0KLSAgPGJvZHk+Ci0gICAgPGxpbmtzPgotICAgICAgPGl0ZW0gbmFtZT0iQXBhY2hlIiBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmciLz4KLSAgICAgIDxpdGVtIG5hbWU9Ik15RmFjZXMiIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQgTXlmYWNlcyBFeHRWYWwiICAgICAgIGhyZWY9ImRvd25sb2FkLmh0bWwiLz4KLSAgICA8L2xpbmtzPgotCi0gICAgPG1lbnUgbmFtZT0iQXBhY2hlIE15RmFjZXMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9kb3dubG9hZC5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgbmFtZT0iQ29udGVudHMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9Ik1haW4gU2l0ZSIgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgPGl0ZW0gbmFtZT0iRXh0VmFsIGZvciBKU0YgMS4xIiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvaW5kZXguaHRtbCIgY29sbGFwc2U9InRydWUiPgotICAgICAgICAgICAgPGl0ZW0gbmFtZT0iZHVtbXkiICAgICAgICBocmVmPSJkdW1teSIvPgotICAgICAgICA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkV4dFZhbCBmb3IgSlNGIDEuMiIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2luZGV4Lmh0bWwiIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9ImR1bW15IiAgICAgICAgaHJlZj0iZHVtbXkiLz4KLSAgICAgICAgPC9pdGVtPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IG5hbWU9IkRvY3VtZW50YXRpb24iPgotICAgICAgPGl0ZW0gbmFtZT0iV2lraSIgICAgICAgICBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL215ZmFjZXMvRXh0ZW5zaW9ucy9WYWxpZGF0b3IvIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgcmVmPSJyZXBvcnRzIi8+Ci0KLSAgICA8bWVudSBuYW1lPSJGb3VuZGF0aW9uIiBpbmhlcml0PSJ0b3AiPgotICAgICAgPGl0ZW0gbmFtZT0iQVNGIiAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iIC8+Ci0gICAgICA8aXRlbSBuYW1lPSJTcG9uc29yc2hpcCIgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vc3BvbnNvcnNoaXAuaHRtbCIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlRoYW5rcyIgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi90aGFua3MuaHRtbCIgLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2NiZjU4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgVmFsaWRhdGlvbi1Nb2R1bGVzPC9uYW1lPgotICAgIDx2ZXJzaW9uPjEuMi4xPC92ZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMi4xPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzFfcmN2YWxpZGF0aW9uLW1vZHVsZXM8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMV9yY3ZhbGlkYXRpb24tbW9kdWxlczwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzFfcmN2YWxpZGF0aW9uLW1vZHVsZXM8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxtb2R1bGVzPgotICAgICAgICA8bW9kdWxlPnByb3BlcnR5LXZhbGlkYXRpb248L21vZHVsZT4KLSAgICAgICAgPCEtLW1vZHVsZT5iZWFuLXZhbGlkYXRpb248L21vZHVsZS0tPgotICAgIDwvbW9kdWxlcz4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3N2Y0YzEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBQcm9wZXJ0eS1WYWxpZGF0aW9uLU1vZHVsZTwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjIuMTwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPnZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuMTwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgucGVyc2lzdGVuY2U8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5wZXJzaXN0ZW5jZS1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgICAgICA8IS0tIFRlc3QgZGVwZW5kZW5jaWVzIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjU8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0LmpzcDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnNoYWxlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2hhbGUtdGVzdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC40PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9BYnN0cmFjdCouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL1Rlc3RVdGlscy5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKkJlYW4uamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4gICAgICAgICAgICAKLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjNzQxNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLQ0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFjNDg3ZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRTZWNyZXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTWVudTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lUmFkaW87Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlDaGVja2JveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUxpc3Rib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHRhcmVhOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgcHVibGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgY29uZmlndXJlUmVxdWlyZWRBdHRyaWJ1dGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOwotICAgICAgICBjb25maWd1cmVNYXhMZW5ndGhBdHRyaWJ1dGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVJlcXVpcmVkQXR0cmlidXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCFwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKSkgfHwKLSAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSkKLSAgICAgICAgICAgICYmCi0gICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGlzQ29tcG9uZW50UmVxdWlyZWQodWlDb21wb25lbnQpKSkKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJgotICAgICAgICAgICAgICAgIUJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRTZWNyZXQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVMaXN0Ym94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lTWVudSB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZVJhZGlvIHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUNoZWNrYm94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TWVudSB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0VGV4dGFyZWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaWYgdGhlcmUgaXMgbm8gc3BlY2lhbCBhdHRyaWJ1dGUgYXQgdGhlIGNvbXBvbmVudCB3aGljaCBzaG91bGQgb3ZlcnJ1bGUKLSAgICAgKiB0aGUgYW5ub3RhdGVkIHByb3BlcnR5IHJldHVybiB0cnVlIQotICAgICAqCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IGNvbXBvbmVudCB3aGljaCBpbXBsZW1lbnRzIHRoZSBFZGl0YWJsZVZhbHVlSG9sZGVyIGludGVyZmFjZQotICAgICAqIEByZXR1cm4gZmFsc2UgdG8gb3ZlcnJ1bGUgdGhlIGFubm90YXRlZCBwcm9wZXJ0eSBlLmcuIGlmIGNvbXBvbmVudCBpcyByZWFkb25seQotICAgICAqLwotICAgIHByb3RlY3RlZCBCb29sZWFuIGlzQ29tcG9uZW50UmVxdWlyZWQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBib29sZWFuIGlzUmVhZE9ubHkgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzUmVhZG9ubHkiKSkpOwotICAgICAgICBib29sZWFuIGlzRGlzYWJsZWQgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzRGlzYWJsZWQiKSkpOwotCi0gICAgICAgIHJldHVybiAhKGlzUmVhZE9ubHkgfHwgaXNEaXNhYmxlZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlTWF4TGVuZ3RoQXR0cmlidXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpOwotCi0gICAgICAgICAgICBpZighKG1heExlbmd0aCBpbnN0YW5jZW9mIEludGVnZXIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0VGV4dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBIdG1sSW5wdXRUZXh0IGh0bWxJbnB1dFRleHQgPSAoSHRtbElucHV0VGV4dCl1aUNvbXBvbmVudDsKLSAgICAgICAgICAgICAgICBodG1sSW5wdXRUZXh0LnNldE1heGxlbmd0aCgoSW50ZWdlciltYXhMZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YmU1NjAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFNlY3JldDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVMaXN0Ym94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVSYWRpbzsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueU1lbnU7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dGFyZWE7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBIdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IKLXsKLSAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQotICAgIHsKLSAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IChTdHJpbmcpIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCh1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldExhYmVsIikpOwotCi0gICAgICAgICAgICBpZihsYWJlbCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxhYmVsID0gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9vdmVycmlkZSB0aGUgbGFiZWwgaWYgdGhlIGFubm90YXRpb24gcHJvdmlkZXMgYSBsYWJlbAotICAgICAgICAgICAgaWYobWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsYWJlbCA9IG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwsIFN0cmluZy5jbGFzcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9QbGFjZUxhYmVsKGZhY2VzTWVzc2FnZSwgbGFiZWwsIGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRTZWNyZXQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVMaXN0Ym94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lTWVudSB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZVJhZGlvIHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUNoZWNrYm94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TWVudSB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0VGV4dGFyZWE7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTFmODRiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwucmVjb3JkZXIuQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXI7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKG5ldyBDcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlcigpKTsNCi0NCi0gICAgICAgIGluaXRTdGF0aWNTdHJhdGVneU1hcHBpbmdzKCk7DQotICAgICAgICBpbml0RGVmYXVsdENvbXBvbmVudEluaXRpYWxpemVyKCk7DQotICAgICAgICBpbml0RGVmYXVsdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigpOw0KLSAgICAgICAgYWRkU2tpcFZhbGlkYXRpb25TdXBwb3J0KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdGF0aWNTdHJhdGVneU1hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGpwYUJhc2VkVmFsaWRhdGlvbiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OOw0KLSAgICAgICAgaWYgKGpwYUJhc2VkVmFsaWRhdGlvbiA9PSBudWxsDQotICAgICAgICAgICAgICAgIHx8ICFqcGFCYXNlZFZhbGlkYXRpb24uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA9IG5ldyBTdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgICAgICBzdGF0aWNDb25maWcuc2V0U291cmNlT2ZNYXBwaW5nKA0KLSAgICAgICAgICAgICAgICBFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSArIi5qcGFfc3RyYXRlZ3lfbWFwcGluZ3MiKTsNCi0NCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHLCBzdGF0aWNDb25maWcpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ3ZWIueG1sIHBhcmFtZXRlciB0byBkZWFjdGl2YXRlIGl0IikNCi0gICAgcHJpdmF0ZSB2b2lkIGluaXREZWZhdWx0Q29tcG9uZW50SW5pdGlhbGl6ZXIoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gIndlYi54bWwgcGFyYW1ldGVyIHRvIGRlYWN0aXZhdGUgaXQiKQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdERlZmF1bHRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoDQotICAgICAgICAgICAgICAgIG5ldyBIdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFNraXBWYWxpZGF0aW9uU3VwcG9ydCgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmluZm8oImFkZGluZyBzdXBwb3J0IGZvciBAU2tpcFZhbGlkYXRpb24iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmRlbnlSZW5kZXJlckludGVyY2VwdG9yKFZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcyk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFZhbGlkYXRpb25JbnRlcmNlcHRvcldpdGhTa2lwVmFsaWRhdGlvblN1cHBvcnQoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvcldpdGhTa2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY3YjZhOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvcldpdGhTa2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LlNraXBWYWxpZGF0aW9uU3RyYXRlZ3k7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0IGV4dGVuZHMgVmFsaWRhdGlvbkludGVyY2VwdG9yCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2tpcFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkKLSAgICB7Ci0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoU2tpcFZhbGlkYXRpb25TdXBwb3J0LmNsYXNzKSkKLSAgICAgICAgewotICAgICAgICAgICAgQm9vbGVhbiBza2lwVmFsaWRhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCBCb29sZWFuLmNsYXNzKTsKLQotICAgICAgICAgICAgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhza2lwVmFsaWRhdGlvbikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInZhbGlkYXRpb24gb2YgIiArIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY2FuY2VsZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIFNraXBWYWxpZGF0aW9uU3RyYXRlZ3kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzc3YTRlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRvY3VtZW50YXRpb24iKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NRVNTQUdFU19KUEEgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJKUEFfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFUyIpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfSlBBX0JBU0VEX1ZBTElEQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OIik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0RvdWJsZVJhbmdlLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2NkNGVmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0RvdWJsZVJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgRG91YmxlUmFuZ2UNCi17DQotICAgIGRvdWJsZSBtaW5pbXVtKCkgZGVmYXVsdCAwOw0KLQ0KLSAgICBkb3VibGUgbWF4aW11bSgpIGRlZmF1bHQgRG91YmxlLk1BWF9WQUxVRTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vSm9pblZhbGlkYXRpb24uamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YjUyYmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vSm9pblZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBKb2luVmFsaWRhdGlvbg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTGVuZ3RoLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkNzVmYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBMZW5ndGgNCi17DQotICAgIGludCBtaW5pbXVtKCkgZGVmYXVsdCAwOw0KLQ0KLSAgICBpbnQgbWF4aW11bSgpIGRlZmF1bHQgSW50ZWdlci5NQVhfVkFMVUU7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzc1MmQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgTG9uZ1JhbmdlDQotew0KLSAgICBsb25nIG1pbmltdW0oKSBkZWZhdWx0IDA7DQotDQotICAgIGxvbmcgbWF4aW11bSgpIGRlZmF1bHQgTG9uZy5NQVhfVkFMVUU7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1BhdHRlcm4uamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1BhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY3N2RjOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUGF0dGVybg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgIm5vX21hdGNoIjsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUmVxdWlyZWQuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNjViM2MuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUmVxdWlyZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBSZXF1aXJlZA0KLXsNCi0gICAgLyoqDQotICAgICAqIHRvIGN1c3RvbWl6ZSB0aGUgZXJyb3IgbWVzc2FnZSBvcg0KLSAgICAgKiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBqc2YgcmVxdWlyZWQgbWVzc2FnZSB3aXRoIHRoZSB1c2FnZSBvZiB0aGUgbWVzc2FnZSByZXNvbHZlciBtZWNoYW5pc20NCi0gICAgICoNCi0gICAgICogQHJldHVybiBhbiBvcHRpb25hbCBlcnJvciBtZXNzYWdlIGtleQ0KLSAgICAgKi8NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImZpZWxkX3JlcXVpcmVkIjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb24uamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5N2VmODAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBTa2lwVmFsaWRhdGlvbg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc5ZjY1MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUYXJnZXQoVFlQRSkKLUBSZXRlbnRpb24oUlVOVElNRSkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIEBpbnRlcmZhY2UgU2tpcFZhbGlkYXRpb25TdXBwb3J0Ci17Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vVmFsaWRhdG9yLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0NTZkMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBWYWxpZGF0b3INCi17DQotICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yPltdIHZhbHVlKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2EzZGI3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yIGV4dGVuZHMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQotICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOwotCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFByb3BlcnR5RGV0YWlscykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24ob2JqZWN0LmdldENsYXNzKCkgKyAiIGlzIG5vdCBhICIgKyBQcm9wZXJ0eURldGFpbHMuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSAoUHJvcGVydHlEZXRhaWxzKW9iamVjdDsKLQotICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKTsKLQotICAgICAgICAvL1RPRE8gdGVzdCB3aXRoIGNvbXBsZXggY29tcG9uZW50cwotICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnNldEluZm9ybWF0aW9uKAotICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBmaW5kIGFuZCBhZGQgYW5ub3RhdGlvbnMKLSAgICAgICAgICovCi0gICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9ucyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU4MDEyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9SW52YWxpZCBmb3JtYXQNCi1ub19tYXRjaF9kZXRhaWw9VGhlIHJlcXVpcmVkIGZvcm1hdGUgaXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2FiNTQzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9XHUwNjI3XHUwNjQ0XHUwNjM1XHUwNjRhXHUwNjNhXHUwNjI5IFx1MDYyZVx1MDYyN1x1MDYzN1x1MDYyNlx1MDYyOQ0KLW5vX21hdGNoX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MzVcdTA2NGFcdTA2M2FcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjM3XHUwNjQ0XHUwNjQ4XHUwNjI4XHUwNjI5IFx1MDY0N1x1MDY0OTogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZDY0OTAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotbm9fbWF0Y2g9Rm9ybWF0IGludlx1MDBlMGxpZAotbm9fbWF0Y2hfZGV0YWlsPUVsIGZvcm1hdCByZXF1ZXJpdCBcdTAwZTlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVlNzAxYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPVVuZ/xsdGlnZXMgRm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPURhcyBlcmZvcmRlcmxpY2hlIEZvcm1hdCBpc3Q6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU4MDEyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9SW52YWxpZCBmb3JtYXQNCi1ub19tYXRjaF9kZXRhaWw9VGhlIHJlcXVpcmVkIGZvcm1hdGUgaXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmIxMDc3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW5vX21hdGNoPUZvcm1hdG8gaW52XHUwMGUxbGlkbyAKLW5vX21hdGNoX2RldGFpbD1FbCBmb3JtYXRvIHJlcXVlcmlkbyBlczogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMGEyMjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1MZSBmb3JtYXQgZXN0IGludmFsaWRlDQotbm9fbWF0Y2hfZGV0YWlsPUxlIGZvcm1hdCBkb2l0ICZlY2lyYzt0cmUgZGUgbGEgZm9ybWU6IHswfQ0KLQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTg3NDhjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW5vX21hdGNoPUZvcm1hdG8gbm9uIHZhbGlkbwotbm9fbWF0Y2hfZGV0YWlsPUlsIGZvcm1hdG8gcmljaGllc3RvICZlZ3JhdmU7OiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0YmM3NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUdlXHUwMGU3ZXJzaXogYmlcdTAwZTdpbQ0KLW5vX21hdGNoX2RldGFpbD1nZXJla2VuIGJpXHUwMGU3aW06IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFhZTY0Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLSAgICAgICAgZXh0ZW5kcw0KLSAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBiYXNlTmFtZSA9IG51bGw7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYgKGJhc2VOYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZU5hbWUgPSBzdXBlci5nZXRCYXNlTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGJhc2VOYW1lOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NzZhZDkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogdGhlIGpwYSBzdXBwb3J0IGlzIGFuIGV4Y2VwdGlvbiBpbiB2aWV3IG9mIHNvbWUgbWVjaGFuaXNtcyAtIHNvIHRoZXJlJ3Mgbm8gY29udmVudGlvbiBmb3IgdGhlIG1lc3NhZ2UgYnVuZGxlLg0KLSAqIGluc3RlYWQgb2YgdGhlIGNvbnZlbnRpb24gdGhlcmUgaXMgYSBnbG9iYWwgcHJvcGVydHkgdG8gaGF2ZSBhbiBhbHRlcm5hdGl2ZSB0byB3ZWIueG1sIGNvbmZpZ3VyYXRpb24NCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMgPSAiSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0JBU0VfTkFNRSA9IFdlYlhtbFBhcmFtZXRlci5WQUxJREFUSU9OX01FU1NBR0VTX0pQQTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfTkFNRSA9IEpwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5jbGFzcw0KLSAgICAgICAgICAgIC5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLnJlcGxhY2UoIi5tZXNzYWdlLnJlc29sdmVyIiwgIi5tZXNzYWdlLmJ1bmRsZSIpKyAiLmpwYV9tZXNzYWdlcyI7DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tQmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZihDVVNUT01fQkFTRV9OQU1FICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIENVU1RPTV9CQVNFX05BTUU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKFN0cmluZylFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShKUEFfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFUyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBCQVNFX05BTUU7DQotICAgIH0NCi0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWRkMThjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Eb3VibGVSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkRvdWJsZVJhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBEb3VibGVSYW5nZSBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShEb3VibGVSYW5nZS5jbGFzcyk7DQotDQotICAgICAgICBkb3VibGUgbWluaW11bSA9IGFubm90YXRpb24ubWluaW11bSgpOw0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTiwgbWluaW11bSk7DQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYLCBhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBpZihtaW5pbXVtID4gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSm9pbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzA4ODJlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uZXh0cmFjdG9yLkRlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpvaW5NZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IoKTsNCi0NCi0gICAgICAgIFN0cmluZ1tdIHRhcmdldEV4cHJlc3Npb25zID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShKb2luVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotDQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHM7DQotICAgICAgICBmb3IgKFN0cmluZyB0YXJnZXRFeHByZXNzaW9uIDogdGFyZ2V0RXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChtZXRhRGF0YUVudHJ5LCB0YXJnZXRFeHByZXNzaW9uKTsNCi0NCi0gICAgICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBleHRyYWN0b3IuZXh0cmFjdChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscykuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSBFeHRWYWxVdGlscy5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSk7DQotDQotICAgICAgICAgICAgICAgIGlmIChtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0QWxsKG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pwYU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiZmRiYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5CYXNpYzsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJpbXBsLiB0aGUgcmVzdCIpDQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IG1ldGFEYXRhLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIENvbHVtbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighKChDb2x1bW4pIGFubm90YXRpb24pLm51bGxhYmxlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCwgKChDb2x1bW4pIGFubm90YXRpb24pLmxlbmd0aCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIEJhc2ljKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCEoKEJhc2ljKSBhbm5vdGF0aW9uKS5vcHRpb25hbCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKGFubm90YXRpb24gaW5zdGFuY2VvZiBJZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9UT0RPIGltcGwuIHRoZSByZXN0ISEhDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTGVuZ3RoTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjNWVlMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTGVuZ3RoTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTGVuZ3RoTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTGVuZ3RoIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKExlbmd0aC5jbGFzcyk7DQotDQotICAgICAgICBpbnQgbWluaW11bSA9IGFubm90YXRpb24ubWluaW11bSgpOw0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEgsIG1pbmltdW0pOw0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgsIGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gPiAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Mb25nUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDg1ZTJmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Mb25nUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Mb25nUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMb25nUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBMb25nUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTG9uZ1JhbmdlLmNsYXNzKTsNCi0NCi0gICAgICAgIGxvbmcgbWluaW11bSA9IGFubm90YXRpb24ubWluaW11bSgpOw0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTiwgbWluaW11bSk7DQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYLCBhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBpZihtaW5pbXVtID4gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9QYXR0ZXJuTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDRhNWI1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9QYXR0ZXJuTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFBhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBQYXR0ZXJuIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFBhdHRlcm4uY2xhc3MpOw0KLSAgICAgICAgDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTiwgKGFubm90YXRpb24pLnZhbHVlKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSA9IChhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIExvY2FsZSBjdXJyZW50TG9jYWxlID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCk7DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5ID0NCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2cgPSBFeHRWYWxVdGlscy5nZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgIC5nZXRNZXNzYWdlKHZhbGlkYXRpb25FcnJvck1zZ0tleSwgY3VycmVudExvY2FsZSk7DQotDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTl9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UsIHZhbGlkYXRpb25FcnJvck1zZyk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZjVhYTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjE3NDg5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgVmFsaWRhdG9yIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFZhbGlkYXRvci5jbGFzcyk7DQotDQotICAgICAgICBDbGFzc1tdIHZhbGlkYXRvcnMgPSBhbm5vdGF0aW9uLnZhbHVlKCk7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBjdXJyZW50Q2xhc3MgOiB2YWxpZGF0b3JzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRDbGFzcy5nZXRTaW1wbGVOYW1lKCkudG9Mb3dlckNhc2UoKS5jb250YWlucyhDb21tb25NZXRhRGF0YUtleXMuRU1BSUwpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsdWUuYWRkKENvbW1vbk1ldGFEYXRhS2V5cy5FTUFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZhbHVlLmFkZChjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00sIHZhbHVlKTsNCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvRG91YmxlUmFuZ2VTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTc1OTMzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkRvdWJsZVJhbmdlVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEb3VibGVSYW5nZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIERvdWJsZVJhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKERvdWJsZVJhbmdlLmNsYXNzKTsNCi0gICAgICAgIERvdWJsZVJhbmdlVmFsaWRhdG9yIGRvdWJsZVJhbmdlVmFsaWRhdG9yID0gKERvdWJsZVJhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5Eb3VibGVSYW5nZSIpOw0KLQ0KLSAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Kb2luVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZDRhOTEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3Rvci5EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSm9pblZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvcigpOw0KLQ0KLSAgICAgICAgU3RyaW5nW10gdGFyZ2V0RXhwcmVzc2lvbnMgPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEpvaW5WYWxpZGF0aW9uLmNsYXNzKS52YWx1ZSgpOw0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHM7DQotICAgICAgICBmb3IgKFN0cmluZyB0YXJnZXRFeHByZXNzaW9uIDogdGFyZ2V0RXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChtZXRhRGF0YUVudHJ5LCB0YXJnZXRFeHByZXNzaW9uKTsNCi0NCi0gICAgICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBleHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHByb3BlcnR5RGV0YWlscykuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyB2YWxpZGF0aW9uIHN0cmF0ZWd5IGZvdW5kIGZvciAiICsgZW50cnkuZ2V0VmFsdWUoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTE0ZDhlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkJhc2ljOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZTsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmU7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpwYVZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUZhY2VzQnVuZGxlID0gZmFsc2U7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFURV9MRU5HVEggPSAibGVuZ3RoIjsNCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmlvbGF0aW9uOw0KLSAgICBwcml2YXRlIGludCBtYXhMZW5ndGg7DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKTsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgQ29sdW1uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlQ29sdW1uQW5ub3RhdGlvbigoQ29sdW1uKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIEJhc2ljKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlQmFzaWNBbm5vdGF0aW9uKChCYXNpYykgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBJZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgT25lVG9PbmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVPbmVUb09uZUFubm90YXRpb24oKE9uZVRvT25lKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE1hbnlUb09uZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZU1hbnlUb09uZUFubm90YXRpb24oKE1hbnlUb09uZSkgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVDb2x1bW5Bbm5vdGF0aW9uKENvbHVtbiBjb2x1bW4sIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKCFjb2x1bW4ubnVsbGFibGUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCBpbnN0YW5jZW9mIFN0cmluZw0KLSAgICAgICAgICAgICAgICAmJiBjb2x1bW4ubGVuZ3RoKCkgPCAoKFN0cmluZykgY29udmVydGVkT2JqZWN0KS5sZW5ndGgoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbiA9IFZBTElEQVRFX0xFTkdUSDsNCi0gICAgICAgICAgICB0aGlzLm1heExlbmd0aCA9IGNvbHVtbi5sZW5ndGgoKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWFzc2FnZShudWxsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQmFzaWNBbm5vdGF0aW9uKEJhc2ljIGJhc2ljLCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICghYmFzaWMub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlT25lVG9PbmVBbm5vdGF0aW9uKE9uZVRvT25lIG9uZVRvT25lLCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIW9uZVRvT25lLm9wdGlvbmFsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU1hbnlUb09uZUFubm90YXRpb24oTWFueVRvT25lIG1hbnlUb09uZSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFtYW55VG9PbmUub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCB8fCBjb252ZXJ0ZWRPYmplY3QuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbiA9IENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRDsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWFzc2FnZShudWxsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoVkFMSURBVEVfTEVOR1RILmVxdWFscyh0aGlzLnZpb2xhdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJmaWVsZF90b29fbG9uZyI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJmaWVsZF9yZXF1aXJlZCI7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHN1cGVyLmdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgIGlmIChWQUxJREFURV9MRU5HVEguZXF1YWxzKHRoaXMudmlvbGF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLCAiIiArIHRoaXMubWF4TGVuZ3RoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc3VwZXIucmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0gICAgICAgIFN0cmluZyBtYXJrZXIgPSBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5NSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0NCi0gICAgICAgIGlmKChtYXJrZXIgKyBrZXkgKyBtYXJrZXIpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudXNlRmFjZXNCdW5kbGUgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IGUuZ2V0RmFjZXNNZXNzYWdlKCk7DQotDQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKFZBTElEQVRFX0xFTkdUSC5lcXVhbHModGhpcy52aW9sYXRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0TWF4aW11bU1lc3NhZ2UoZmFjZXNNZXNzYWdlLCB0aGlzLm1heExlbmd0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTGVuZ3RoU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2QwNTU4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMZW5ndGhTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBMZW5ndGggYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTGVuZ3RoLmNsYXNzKTsNCi0gICAgICAgIExlbmd0aFZhbGlkYXRvciBsZW5ndGhWYWxpZGF0b3IgPSAoTGVuZ3RoVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5MZW5ndGgiKTsNCi0NCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNTgyMDIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Mb25nUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5Mb25nUmFuZ2VWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExvbmdSYW5nZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIExvbmdSYW5nZSBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMb25nUmFuZ2UuY2xhc3MpOw0KLSAgICAgICAgTG9uZ1JhbmdlVmFsaWRhdG9yIGxvbmdSYW5nZVZhbGlkYXRvciA9IChMb25nUmFuZ2VWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigiamF2YXguZmFjZXMuTG9uZ1JhbmdlIik7DQotDQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bShhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUGF0dGVyblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUGF0dGVyblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NTZlMDcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUGF0dGVyblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotDQotICAgICAgICBQYXR0ZXJuIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFBhdHRlcm4uY2xhc3MpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZXhwcmVzc2lvbiA6IGFubm90YXRpb24udmFsdWUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0ID09IG51bGwNCi0gICAgICAgICAgICAgICAgICAgIHx8ICFqYXZhLnV0aWwucmVnZXguUGF0dGVybi5jb21waWxlKGV4cHJlc3Npb24pLm1hdGNoZXIoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdC50b1N0cmluZygpKS5tYXRjaGVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG5ldyBGYWNlc01lc3NhZ2UoDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiksDQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24pLnJlcGxhY2UoInswfSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uKSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKFBhdHRlcm4pIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZXF1aXJlZFN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUmVxdWlyZWRTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzhmOTk2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZXF1aXJlZFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZFN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRmFjZXNCdW5kbGUgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCA9PSBudWxsIHx8IGNvbnZlcnRlZE9iamVjdC5lcXVhbHMoIiIpIHx8DQotICAgICAgICAgICAgICAgIChjb252ZXJ0ZWRPYmplY3QgaW5zdGFuY2VvZiBDb2xsZWN0aW9uICYmICgoQ29sbGVjdGlvbiljb252ZXJ0ZWRPYmplY3QpLmlzRW1wdHkoKSkgfHwNCi0gICAgICAgICAgICAgICAgKGNvbnZlcnRlZE9iamVjdCBpbnN0YW5jZW9mIE1hcCAmJiAoKE1hcCljb252ZXJ0ZWRPYmplY3QpLmlzRW1wdHkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihnZXRWYWxpZGF0aW9uRXJyb3JGYWNlc01hc3NhZ2UobWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoUmVxdWlyZWQpIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShlLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvU2tpcFZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1NraXBWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU4NjEwMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvU2tpcFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBTa2lwVmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFN0cmluZ1tdIHZhbHVlQmluZGluZ0V4cHJlc3Npb25zID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShTa2lwVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIGZvcihTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA6IHZhbHVlQmluZGluZ0V4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRWYWx1ZU9mRXhwcmVzc2lvbigNCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKSkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5zZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5TS0lQX1ZBTElEQVRJT04sIHRydWUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIzY2M5MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLQ0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I+W10gdmFsaWRhdG9yQ2xhc3NlcyA9DQotICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShWYWxpZGF0b3IuY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yIHZhbGlkYXRvcjsNCi0gICAgICAgIGZvciAoQ2xhc3MgdmFsaWRhdG9yQ2xhc3NOYW1lIDogdmFsaWRhdG9yQ2xhc3NlcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0b3IgPSAoamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcikgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzcyh2YWxpZGF0b3JDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UodmFsaWRhdG9yQ2xhc3NOYW1lLmdldE5hbWUoKSArICIgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NjZhNDEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWNlc0V4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBUaGlzIHBoYXNlIGxpc3RlbmVyIHByb2Nlc3NlcyBjcm9zcyB2YWxpZGF0aW9uIGFzIHNvb24gYXMgaXQgZmluZHMgYSBzcGVjaWFsIHJlcXVlc3Qgc2NvcGVkIHN0b3JhZ2UuPGJyLz4NCi0gKiBTbyBpdCdzIHBvc3NpYmxlIHRvIGFkZCBpbmZvcm1hdGlvbiBkdXJpbmcgdGhlIHByb2Nlc3MgdmFsaWRhdGlvbiBwaGFzZS4gQXQgdGhlIGVuZCBvZiB0aGlzIHBoYXNlIGl0IGdldHMgcHJvY2Vzc2VkLg0KLSAqIEFmdGVyIHRoYXQgdGhlIHN0b3JhZ2UgZ2V0cyByZXNldGVkLjxwLz4NCi0gKiBJZiB5b3UgcHJvdmlkZSBhIGN1c3RvbSBleHRlbnNpb24gYW5kIHlvdSBhZGQgdGhlIHNhbWUgc3RvcmFnZSB0eXBlIHdpdGhpbiBhIGRpZmZlcmVudCBwaGFzZSwNCi0gKiBpdCBhbHNvIGdldHMgcHJvY2Vzc2VkIGF0IHRoZSBlbmQgb2YgdGhhdCBwaGFzZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSA9IENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKTsNCi0gICAgICAgICAgICBmb3IgKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA6IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UuZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKSBpbnN0YW5jZW9mIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbml0Q3Jvc3NWYWxpZGF0aW9uIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLnByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oZW50cnksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFkZE1lc3NhZ2UgPSB0cnVlOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkgaW5zdGFuY2VvZiBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWVzc2FnZSA9IChCb29sZWFuKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5nZXRDbGFzcygpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5jbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRDbGFzcygpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYoYWRkTWVzc2FnZSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWNlc01lc3NhZ2UgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsICYmIGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RmFjZXNDb250ZXh0KCkuYWRkTWVzc2FnZShlbnRyeS5nZXRDbGllbnRJZCgpLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRGYWNlc0NvbnRleHQoKS5yZW5kZXJSZXNwb25zZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluYWxseQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLnJlc2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNJbml0aWFsaXplZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OICE9IG51bGwNCi0gICAgICAgICAgICAgICAgICAgICYmIFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NST1NTVkFMSURBVElPTi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBKc2ZVdGlscy5kZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcih0aGlzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5BTllfUEhBU0U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZiM2RmMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMgPSANCi0gICAgICAgIG5ldyBBcnJheUxpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGQoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzLmFkZChlbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcyhMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0YzA0MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkNCi17DQotICAgIHByaXZhdGUgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5Ow0KLSAgICAvL2ZvciBjb21wbGV4IGNvbXBvbmVudHMgKGUuZy4gYSB0YWJsZSkgc3RvcmVzIHRoZSBvYmplY3Qgb2YgZW50cnkgKCN7ZW50cnkucHJvcGVydHl9KQ0KLSAgICBwcml2YXRlIFVJQ29tcG9uZW50IGNvbXBvbmVudDsNCi0gICAgcHJpdmF0ZSBPYmplY3QgY29udmVydGVkT2JqZWN0Ow0KLSAgICBwcml2YXRlIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgLy9qdXN0IGZvciBpbnB1dCBjb21wb25lbnRzIHdpdGhpbiBjb21wbGV4IGNvbXBvbmVudHMgZS5nLiBkYXRhVGFibGUsLi4uDQotICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudElkOw0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeSBnZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhRW50cnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFFbnRyeSA9IG1ldGFEYXRhRW50cnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFVJQ29tcG9uZW50IGdldENvbXBvbmVudCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KFVJQ29tcG9uZW50IGNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRPYmplY3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlZE9iamVjdChPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbnZlcnRlZE9iamVjdCA9IGNvbnZlcnRlZE9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uU3RyYXRlZ3koQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneSA9IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudElkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNsaWVudElkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudElkKFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MzEzZDguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBJbiBvcmRlciB0byBidWlsZCB1cCBhIG1hcHBpbmcgd2hpY2ggaXMgdXNlZCBmb3IgY3Jvc3MtdmFsaWRhdGlvbi4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkKLXsKLSAgICBwcml2YXRlIE9iamVjdCBiZWFuOwotICAgIHByaXZhdGUgT2JqZWN0IGNvbnZlcnRlZFZhbHVlOwotICAgIHByaXZhdGUgVUlDb21wb25lbnQgY29tcG9uZW50OwotICAgIC8vZm9yIGNvbXBsZXggY29tcG9uZW50cyAoZS5nLiBhIHRhYmxlIHRoZXJlIGFyZSBtdWx0aXBsZSBlbnRyaWVzIHdpdGgKLSAgICAvL3RoZSBzYW1lIGtleSAoaGVyZSB0aGUgZWwgZXhwcmVzc2lvbiAje2VudHJ5LnByb3BlcnR5fSkKLSAgICAvL2hvd2V2ZXIsIGRvbid0IG92ZXJyaWRlIHRoZSBwcmV2aW91cyBlbnRyeSAtIHRoZXkgYXJuJ3QgdGhlIHNhbWU7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGZ1cnRoZXJFbnRyaWVzOwotICAgIC8vanVzdCBmb3IgaW5wdXQgY29tcG9uZW50cyB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzIGUuZy4gZGF0YVRhYmxlLC4uLgotICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudElkOwotCi0gICAgLyoKLSAgICAgKiBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmVhbihPYmplY3QgYmVhbikKLSAgICB7Ci0gICAgICAgIHRoaXMuYmVhbiA9IGJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkVmFsdWUoT2JqZWN0IGNvbnZlcnRlZFZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy5jb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBVSUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnQoVUlDb21wb25lbnQgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gY2xpZW50SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50SWQoU3RyaW5nIGNsaWVudElkKQotICAgIHsKLSAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGdldEZ1cnRoZXJFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmdXJ0aGVyRW50cmllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGdXJ0aGVyRW50cmllcyhMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGZ1cnRoZXJFbnRyaWVzKQotICAgIHsKLSAgICAgICAgdGhpcy5mdXJ0aGVyRW50cmllcyA9IGZ1cnRoZXJFbnRyaWVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzQwMjc5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcm4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04iKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJcy5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODc2NDBjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJEYXRlSXNFbnRyeSAodmFsdWVPZiwgdHlwZSkiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIERhdGVJcw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWVPZigpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBvcHRpb25hbCBzZWN0aW9uDQotICAgICAqLw0KLQ0KLSAgICBEYXRlSXNUeXBlIHR5cGUoKSBkZWZhdWx0IERhdGVJc1R5cGUuc2FtZTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgIiI7DQotDQotICAgIFN0cmluZyBub3RCZWZvcmVFcnJvck1zZ0tleSgpIGRlZmF1bHQgIndyb25nX2RhdGVfbm90X2JlZm9yZSI7DQotDQotICAgIFN0cmluZyBub3RBZnRlckVycm9yTXNnS2V5KCkgZGVmYXVsdCAid3JvbmdfZGF0ZV9ub3RfYWZ0ZXIiOw0KLQ0KLSAgICBTdHJpbmcgbm90RXF1YWxFcnJvck1zZ0tleSgpIGRlZmF1bHQgIndyb25nX2RhdGVfbm90X2VxdWFsIjsNCi0NCi0gICAgaW50IGVycm9yTWVzc2FnZURhdGVTdHlsZSgpIGRlZmF1bHQgRGF0ZUZvcm1hdC5NRURJVU07DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzVmNDgyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJiZWZvcmVPclNhbWUsIGFmdGVyT3JTYW1lIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgZW51bSBEYXRlSXNUeXBlDQotew0KLSAgICBiZWZvcmUsIGFmdGVyLCBzYW1lDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0Nzg5OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIEVxdWFscw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZCI7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9Ob3RFcXVhbHMuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9Ob3RFcXVhbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg4MTc2Mi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIE5vdEVxdWFscw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQiOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJiNmRiMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBSZXF1aXJlZElmDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZU9mKCk7DQotDQotICAgIC8qDQotICAgICAqIG9wdGlvbmFsIHNlY3Rpb24NCi0gICAgICovDQotDQotICAgIFJlcXVpcmVkSWZUeXBlIGlzKCkgZGVmYXVsdCBSZXF1aXJlZElmVHlwZS5ub3RfZW1wdHk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJlbXB0eV9maWVsZCI7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmVHlwZS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWZUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYzU4ZDkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWZUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBlbnVtIFJlcXVpcmVkSWZUeXBlDQotew0KLSAgICBlbXB0eSwgbm90X2VtcHR5DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNjA3NTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUlucHV0IGlzIGRpZmZlcmVudA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9SW5wdXQgaXMgZGlmZmVyZW50DQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi0NCi13cm9uZ19kYXRlPVdyb25nIGRhdGUNCi13cm9uZ19kYXRlX2RldGFpbD1Xcm9uZyBkYXRlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmY5M2M0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1cdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgXHUwNjQ1XHUwNjJlXHUwNjJhXHUwNjQ0XHUwNjQxDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgXHUwNjQ1XHUwNjJlXHUwNjJhXHUwNjQ0XHUwNjQxDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1cdTA2M2FcdTA2NGFcdTA2MzEgXHUwNjQ1XHUwNjMzXHUwNjQ1XHUwNjQ4XHUwNjJkIFx1MDYyOFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDYgXHUwNjQxXHUwNjMzIFx1MDY0Mlx1MDY0YVx1MDY0NVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1cdTA2M2FcdTA2NGFcdTA2MzEgXHUwNjQ1XHUwNjMzXHUwNjQ1XHUwNjQ4XHUwNjJkIFx1MDYyOFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCAgXHUwNjQ2XHUwNjQxXHUwNjMzIFx1MDY0Mlx1MDY0YVx1MDY0NVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQNCi0NCi13cm9uZ19kYXRlPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2NDlcdTA2MjENCi13cm9uZ19kYXRlX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjJlXHUwNjI3XHUwNjM3XHUwNjQ5XHUwNjIxDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0M1x1MDY0OCBcdTA2NDYgXHUwNjI4XHUwNjM5XHUwNjJmIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzIFx1MDY0OFx1MDY0NiBcdTA2MjhcdTA2MzlcdTA2MmYgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzXHUwNjQ4IFx1MDY0NiBcdTA2NDJcdTA2MjhcdTA2NDQgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0MyBcdTA2NDhcdTA2NDYgXHUwNjQyXHUwNjI4XHUwNjQ0IHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NDRcdTA2MjcgXHUwNjRhXHUwNjMzXHUwNjI3XHUwNjQ4XHUwNjQ5IHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjQ0XHUwNjI3IFx1MDY0YVx1MDYzM1x1MDYyN1x1MDY0OFx1MDY0OSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODU0ZWQyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9ZWwgdmFsb3IgXHUwMGU5IGRpZmVyZW50Ci1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPWVsIHZhbG9yIFx1MDBlOSBkaWZlcmVudAotCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPW5vIGVzIHBlcm1ldCBlbCBtYXRlaXggdmFsb3IKLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPW5vIGVzIHBlcm1ldCBlbCBtYXRlaXggdmFsb3IKLQotd3JvbmdfZGF0ZT1kYXRhIGVyclx1MDBmMm5pYQotd3JvbmdfZGF0ZV9kZXRhaWw9ZGF0YSBlcnJcdTAwZjJuaWEKLQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1sYSBkYXRhIGhhIGRlIHNlciBwb3N0ZXJpb3IgYSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9bGEgZGF0YSBoYSBkZSBzZXIgYW50ZXJpb3IgYSB7MH0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1sYSBkYXRhIGhhIGRlIHNlciBwb3N0ZXJpb3IgYSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9bGEgZGF0YSBubyBcdTAwMGU5cyBpZ3VhbCBhIHswfQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPWxhIGRhdGEgbm8gXHUwMDBlOXMgaWd1YWwgYSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDg3MjM0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1FaW5nYWJlIGlzdCB1bnRlcnNjaGllZGxpY2gNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUVpbmdhYmUgaXN0IHVudGVyc2NoaWVkbGljaA0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9RGVyIGdsZWljaGUgV2VydCBpc3QgbmljaHQgZXJsYXVidA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPURlciBnbGVpY2hlIFdlcnQgaXN0IG5pY2h0IGVybGF1YnQNCi0NCi13cm9uZ19kYXRlPURhdHVtIGlua29ycmVrdA0KLXdyb25nX2RhdGVfZGV0YWlsPURhdHVtIGlua29ycmVrdA0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1EYXMgRGF0dW0gbXVzcyBuYWNoIGRlbSB7MH0gc2Vpbg0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9RGFzIERhdHVtIG11c3MgbmFjaCBkZW0gezB9IHNlaW4NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1EYXMgRGF0dW0gbXVzcyB2b3IgZGVtIHswfSBzZWluDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPURhcyBEYXR1bSBtdXNzIHZvciBkZW0gezB9IHNlaW4NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1EYXMgRGF0dW0gZW50c3ByaWNodCBuaWNodCBkZW0gezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPURhcyBEYXR1bSBlbnRzcHJpY2h0IG5pY2h0IGRlbSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjYwNzU5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1JbnB1dCBpcyBkaWZmZXJlbnQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUlucHV0IGlzIGRpZmZlcmVudA0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotDQotd3JvbmdfZGF0ZT1Xcm9uZyBkYXRlDQotd3JvbmdfZGF0ZV9kZXRhaWw9V3JvbmcgZGF0ZQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzODUyNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPWxhIGVudHJhZGEgZXMgZGlmZXJlbnRlCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPWxhIGVudHJhZGEgZXMgZGlmZXJlbnRlCi0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9bm8gc2UgcGVybWl0ZW4gZW50cmFkYXMgaWd1YWxlcwotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9bm8gc2UgcGVybWl0ZW4gZW50cmFkYXMgaWd1YWxlcwotCi13cm9uZ19kYXRlPWZlY2hhIGVxdWl2b2NhZGEKLXdyb25nX2RhdGVfZGV0YWlsPWZlY2hhIGVxdWl2b2NhZGEKLQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgbHVlZ28gZGUgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgbHVlZ28gZGUgezB9Ci0KLXdyb25nX2RhdGVfbm90X2FmdGVyPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgYW50ZXMgZGUgezB9Ci13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBhbnRlcyBkZSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9bGEgZmVjaGEgbm8gZXMgaWd1YWwgYSB7MH0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1sYSBmZWNoYSBubyBlcyBpZ3VhbCBhIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZjAyMTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUxlcyBjaGFtcHMgc29udCBkaWZmJmVhY3V0ZTtyZW50cw0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9TGVzIGNoYW1wcyBzb250IGRpZmYmZWFjdXRlO3JlbnRzDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1MZXMgY2hhbXBzIGRvaXZlbnQgJmVjaXJjO3RyZSBkaWZmJmVhY3V0ZTtyZW50cw0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPUxlcyBjaGFtcHMgZG9pdmVudCAmZWNpcmM7dHJlIGRpZmYmZWFjdXRlO3JlbnRzDQotDQotd3JvbmdfZGF0ZT1MYSBkYXRlIGVzdCBpbmNvcnJlY3RlDQotd3JvbmdfZGF0ZV9kZXRhaWw9TGEgZGF0ZSBlc3QgaW5jb3JyZWN0ZQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhcHImZWdyYXZlO3MgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhcHImZWdyYXZlO3MgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXZhbnQgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGF2YW50IHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPUxhIGRhdGUgbidlc3QgcGFzICZlYWN1dGU7Z2FsZSAmYWdyYXZlOyB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9TGEgZGF0ZSBuJ2VzdCBwYXMgJmVhY3V0ZTtnYWxlICZhZ3JhdmU7IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNDI4MDEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1WYWxvcmkgbm9uIHVndWFsaQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1JIHZhbG9yaSBpbnNlcml0aSBub24gY29pbmNpZG9ubwotCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPUxvIHN0ZXNzbyB2YWxvcmUgbm9uICZlZ3JhdmU7IHBlcm1lc3NvCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1MbyBzdGVzc28gdmFsb3JlIG5vbiAmZWdyYXZlOyBwZXJtZXNzbwotCi13cm9uZ19kYXRlPURhdGEgZXJyYXRhCi13cm9uZ19kYXRlX2RldGFpbD1EYXRhIGVycmF0YQotCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9TGEgZGF0YSBkZXZlIGVzc2VyZSBkb3BvIGRpIHswfQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1MYSBkYXRhIGRldmUgZXNzZXJlIGRvcG8gZGkgezB9Ci0KLXdyb25nX2RhdGVfbm90X2FmdGVyPUxhIGRhdGEgZGV2ZSBlc3NlcmUgcHJpbWEgZGkgezB9Ci13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9TGEgZGF0YSBkZXZlIGVzc2VyZSBwcmltYSBkaSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9TGEgZGF0YSBub24gJmVncmF2ZTsgdWd1YWxlIGEgezB9Ci13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9TGEgZGF0YSBub24gJmVncmF2ZTsgdWd1YWxlIGEgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFmNmE5ZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9Z2lyaWxlbiBkZVx1MDExZmVyIGZhcmtsXHUwMTMxDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1naXJpbGVuIGRlXHUwMTFmZXIgZmFya2xcdTAxMzENCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPWF5blx1MDEzMSBkZVx1MDExZmVyIGdpcmlsZW1leg0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPWF5blx1MDEzMSBkZVx1MDExZmVyIGdpcmlsZW1leg0KLQ0KLXdyb25nX2RhdGU9eWFubFx1MDEzMVx1MDE1ZiB0YXJpaA0KLXdyb25nX2RhdGVfZGV0YWlsPXlhbmxcdTAxMzFcdTAxNWYgdGFyaWgNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBzb25yYSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIHNvbnJhIG9sbWFsXHUwMTMxZFx1MDEzMXINCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIFx1MDBmNm5jZSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gXHUwMGY2bmNlIG9sbWFsXHUwMTMxZFx1MDEzMXINCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZSBlXHUwMTVmaXQgZGVcdTAxMWZpbA0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZSBlXHUwMTVmaXQgZGVcdTAxMWZpbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDc2NTllLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgICAgIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZU5hbWUgPSBudWxsOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VOYW1lID0gc3VwZXIuZ2V0QmFzZU5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBiYXNlTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlY29yZGVyL0Nyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlY29yZGVyL0Nyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNDBhMDMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWNvcmRlci9Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnJlY29yZGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlci5Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyIGltcGxlbWVudHMgUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcg0KLXsNCi0gICAgcHVibGljIHZvaWQgcmVjb3JkVXNlcklucHV0KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgdmFsdWUpDQotICAgIHsNCi0gICAgICAgIGlmICghKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy90byBzdXBwb3J0IGxvY2FsIGNyb3NzLXZhbGlkYXRpb24gKHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkpDQotICAgICAgICBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZyA9IENyb3NzVmFsaWRhdGlvblV0aWxzDQotICAgICAgICAgICAgLmdldE9ySW5pdEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IGVudHJ5Ow0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBpZihwcm9wZXJ0eURldGFpbHMgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGVudHJ5ID0gbmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkoKTsNCi0gICAgICAgIGVudHJ5LnNldEJlYW4ocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSk7DQotICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh2YWx1ZSk7DQotICAgICAgICBlbnRyeS5zZXRDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgZW50cnkuc2V0Q2xpZW50SWQodWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKSk7DQotDQotICAgICAgICBTdHJpbmcga2V5ID0gcHJvcGVydHlEZXRhaWxzLmdldEtleSgpOw0KLQ0KLSAgICAgICAgLy9mb3IgbG9jYWwgY3Jvc3MtdmFsaWRhdGlvbg0KLSAgICAgICAgaWYgKGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLmNvbnRhaW5zS2V5KGtleSkgJiYNCi0gICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQoa2V5KS5nZXRCZWFuKCkgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICFrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQoa2V5KS5nZXRCZWFuKCkuZXF1YWxzKGVudHJ5LmdldEJlYW4oKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9mb3IgdGhlIHZhbGlkYXRpb24gd2l0aGluIGEgY29tcGxleCBjb21wb25lbnQgZS5nLiBhIHRhYmxlDQotICAgICAgICAgICAgLy9kb24ndCBvdmVycmlkZSBleGlzdGluZyBleHByZXNzaW9uIChzdHlsZTogI3tlbnRyeS5wcm9wZXJ0eX0pIC0gbWFrZSBhIHNwZWNpYWwgbWFwcGluZw0KLQ0KLSAgICAgICAgICAgIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4gZnVydGhlckVudHJpZXMgPQ0KLSAgICAgICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQoa2V5KS5nZXRGdXJ0aGVyRW50cmllcygpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmdXJ0aGVyRW50cmllcyA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZnVydGhlckVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+KCk7DQotDQotICAgICAgICAgICAgICAgIGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLmdldChrZXkpLnNldEZ1cnRoZXJFbnRyaWVzKGZ1cnRoZXJFbnRyaWVzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgZnVydGhlckVudHJpZXMuYWRkKGVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2ZvciBub3JtYWwgdmFsaWRhdGlvbg0KLSAgICAgICAgICAgIGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLnB1dChrZXksIGVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q29tcGFyZVN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZWE1MDguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBzdGF0aWMgTGlzdDxSZWZlcmVuY2luZ1N0cmF0ZWd5PiByZWZlcmVuY2luZ1N0cmF0ZWdpZXM7DQotICAgIHByb3RlY3RlZCBNYXA8T2JqZWN0LCBPYmplY3Q+IHZpb2xhdGlvblJlc3VsdFN0b3JhZ2UgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgaW5pdFJlZmVyZW5jaW5nU3RyYXRlZ2llcygpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRSZWZlcmVuY2luZ1N0cmF0ZWdpZXMoKQ0KLSAgICB7DQotICAgICAgICBpZiAocmVmZXJlbmNpbmdTdHJhdGVnaWVzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzID0gbmV3IEFycmF5TGlzdDxSZWZlcmVuY2luZ1N0cmF0ZWd5PigpOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyBjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5Q2xhc3NOYW1lID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5CQVNFX1BBQ0tBR0UpICsgIlJlZmVyZW5jaW5nU3RyYXRlZ3kiOw0KLQ0KLSAgICAgICAgICAgIFJlZmVyZW5jaW5nU3RyYXRlZ3kgY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneSA9IChSZWZlcmVuY2luZ1N0cmF0ZWd5KSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5KTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgRUxDb21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICAgICAgLy9yZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBBbGlhc0NvbXBhcmVTdHJhdGVneSgpKTsNCi0gICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBMb2NhbENvbXBhcmVTdHJhdGVneSgpKTsNCi0gICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBMb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpbml0VmFsaWRhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgU3RyaW5nW10gdmFsaWRhdGlvblRhcmdldHMgPSBnZXRWYWxpZGF0aW9uVGFyZ2V0cygNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQgOiB2YWxpZGF0aW9uVGFyZ2V0cykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0ID0gdmFsaWRhdGlvblRhcmdldC50cmltKCk7DQotDQotICAgICAgICAgICAgLy9zZWxlY3QgdmFsaWRhdGlvbiBtZXRob2QNCi0gICAgICAgICAgICB0cnlUb1ZhbGlkYXRlKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwgdmFsaWRhdGlvblRhcmdldCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIHRyeVRvVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQpDQotICAgIHsNCi0gICAgICAgIGZvciAoUmVmZXJlbmNpbmdTdHJhdGVneSByZWZlcmVuY2luZ1N0cmF0ZWd5IDogcmVmZXJlbmNpbmdTdHJhdGVnaWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChyZWZlcmVuY2luZ1N0cmF0ZWd5LmV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsIHZhbGlkYXRpb25UYXJnZXQsIHRoaXMpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlRhcmdldCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFoYW5kbGVUYXJnZXRWaW9sYXRpb24oZW50cnlPZlNvdXJjZSwgZW50cnlPZlRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIC8vZ2V0IHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSB0YXJnZXQgY29tcG9uZW50DQotICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldEVycm9yTWVzc2FnZVN1bW1hcnkoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIHRydWUpOw0KLSAgICAgICAgU3RyaW5nIGRldGFpbHMgPSBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIHRydWUpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0aW9uIHRhcmdldCBpc24ndCBib3VuZCB0byBhIGNvbXBvbmVudCB3aXRoaW5nIHRoZSBjdXJyZW50IHBhZ2UgDQotICAgICAgICAvLyhzZWUgdmFsaWRhdGVGb3VuZEVudHJ5LCB0cnlUb1ZhbGlkYXRlTG9jYWxseSBhbmQgdHJ5VG9WYWxpZGF0ZUJpbmRpbmdPbmx5KQ0KLSAgICAgICAgaWYgKGVudHJ5T2ZUYXJnZXQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBlbnRyeU9mVGFyZ2V0ID0gZW50cnlPZlNvdXJjZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlOw0KLSAgICAgICAgaWYgKGVudHJ5T2ZUYXJnZXQuZ2V0TWV0YURhdGFFbnRyeSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWVzc2FnZSA9IGdldFRhcmdldENvbXBvbmVudEVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgZW50cnlPZlRhcmdldC5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIHN1bW1hcnksIGRldGFpbHMpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vVE9ETyBkb2N1bWVudCBwb3NzaWJsZSBzaWRlIGVmZmVjdHMNCi0gICAgICAgICAgICAvL2R1ZSB0byBhIG1pc3NpbmcgdGFyZ2V0IGFubm90YXRpb24gKHNlZTogdHJ5VG9WYWxpZGF0ZUxvY2FsbHkpDQotICAgICAgICAgICAgbWVzc2FnZSA9IGdldFRhcmdldENvbXBvbmVudEVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIHN1bW1hcnksIGRldGFpbHMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKChtZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsIHx8IG1lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkgJiYNCi0gICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldENsaWVudElkKCkgIT0gbnVsbCAmJiAhZW50cnlPZlNvdXJjZS5nZXRDbGllbnRJZCgpLmVxdWFscyhlbnRyeU9mVGFyZ2V0LmdldENsaWVudElkKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dC5hZGRNZXNzYWdlKGVudHJ5T2ZUYXJnZXQuZ2V0Q2xpZW50SWQoKSwgbWVzc2FnZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHJvY2Vzc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZiAoIWhhbmRsZVNvdXJjZVZpb2xhdGlvbihlbnRyeU9mU291cmNlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICAvL2dldCB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQNCi0gICAgICAgIFN0cmluZyBzdW1tYXJ5ID0gZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgZmFsc2UpOw0KLSAgICAgICAgU3RyaW5nIGRldGFpbHMgPSBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIGZhbHNlKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlID0gZ2V0U291cmNlQ29tcG9uZW50RXJyb3JNZXNzYWdlKA0KLSAgICAgICAgICAgIGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCBzdW1tYXJ5LCBkZXRhaWxzKTsNCi0NCi0gICAgICAgIGlmIChtZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsIHx8IG1lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8NCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24obmV3IEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgRmFjZXNNZXNzYWdlIGdldFNvdXJjZUNvbXBvbmVudEVycm9yTWVzc2FnZShBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZSA9IG5ldyBGYWNlc01lc3NhZ2UoKTsNCi0NCi0gICAgICAgIG1lc3NhZ2Uuc2V0U2V2ZXJpdHkoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgICAgIG1lc3NhZ2Uuc2V0U3VtbWFyeShzdW1tYXJ5KTsNCi0gICAgICAgIG1lc3NhZ2Uuc2V0RGV0YWlsKGRldGFpbCk7DQotDQotICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgRmFjZXNNZXNzYWdlIGdldFRhcmdldENvbXBvbmVudEVycm9yTWVzc2FnZShBbm5vdGF0aW9uIGZvdW5kQW5ub3RhdGlvbiwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlID0gbmV3IEZhY2VzTWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgbWVzc2FnZS5zZXRTZXZlcml0eShGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICAgICAgbWVzc2FnZS5zZXRTdW1tYXJ5KHN1bW1hcnkpOw0KLSAgICAgICAgbWVzc2FnZS5zZXREZXRhaWwoZGV0YWlsKTsNCi0NCi0gICAgICAgIHJldHVybiBtZXNzYWdlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByZXNvbHZlTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgICAgIHJldHVybiAoa2V5ICE9IG51bGwpID8gcmVzb2x2ZU1lc3NhZ2Uoa2V5ICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgpIDogbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB0aGUgdXNhZ2Ugb2YgdGhpcyBtZXRob2QgcmVxdWlyZXMgYSBuZXcgaW5zdGFuY2UNCi0gICAgICogLT4gaW4gY2FzZSBvZiB2YWxpZGF0aW9uIHN0cmF0ZWd5IGJlYW5zIGFwcGxpY2F0aW9uL3NpbmdsZXRvbiBpc24ndCBhbGxvd2VkDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0VmFsaWRhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlVGFyZ2V0VmlvbGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlLA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVTb3VyY2VWaW9sYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBoYW5kbGVUYXJnZXRWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBhYnN0cmFjdCBtZXRob2RzDQotICAgICAqLw0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBpbXBsZW1lbnRzIHRoZSBzcGVjaWZpYyB2YWxpZGF0aW9uIGxvZ2ljDQotICAgICAqLw0KLQ0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbik7DQotDQotICAgIC8qDQotICAgICAqIHJldHVybnMgdGhlIHJlZmVyZW5jZWQgdmFsaWRhdGlvbiB0YXJnZXRzIG9mIHRoZSBhbm5vdGF0aW9uDQotICAgICAqIGUuZy4gQERhdGVJcyh0eXBlID0gRGF0ZUlzVHlwZS5iZWZvcmUsIHZhbHVlID0gImZpbmFsRXhhbSIpDQotICAgICAqIC0+IG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IHdpdGggb25lIHZhbHVlICgiZmluYWxFeGFtIikNCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWM4MWJiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgLy9pbml0IGNyb3NzLXZhbGlkYXRpb24NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA9DQotICAgICAgICAgICAgZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkuYWRkKGVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA9IG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoKTsNCi0NCi0gICAgICAgIGVudHJ5LnNldE1ldGFEYXRhRW50cnkobWV0YURhdGFFbnRyeSk7DQotICAgICAgICBlbnRyeS5zZXRDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgZW50cnkuc2V0Q2xpZW50SWQodWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIGVudHJ5LnNldFZhbGlkYXRpb25TdHJhdGVneSh0aGlzKTsNCi0NCi0gICAgICAgIHJldHVybiBlbnRyeTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgYXZhaWxhYmxlIGZvciBjcm9zcyB2YWxpZGF0aW9uIC0gdXNlIHByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IGF2YWlsYWJsZSBmb3IgY3Jvc3MgdmFsaWRhdGlvbiIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0VmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICAvL25vdCBhdmFpbGFibGUgZm9yIGNyb3NzIHZhbGlkYXRpb24gLSB1c2UgaW5pdENyb3NzVmFsaWRhdGlvbg0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDcm9zc1ZhbGlkYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICAvL292ZXJyaWRlIGlmIG5lZWRlZA0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLCB2YWxpZGF0b3JFeGNlcHRpb24sIHRoaXMpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uSGVscGVyLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2RmOTM0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5KQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHZpb2xhdGlvbkZvdW5kID0gZmFsc2U7DQotDQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LmlzVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKSkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5ID0gbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgpOw0KLSAgICAgICAgICAgIGlmIChjb21wYXJlU3RyYXRlZ3kudXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb21wb25lbnQodmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENsaWVudElkKHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDbGllbnRJZCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbXBvbmVudChjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q2xpZW50SWQoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENsaWVudElkKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29udmVydGVkT2JqZWN0KHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpKTsNCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0VmFsaWRhdGlvblN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSk7DQotDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5DQotICAgICAgICAgICAgICAgICAgICAucHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0NCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICB7DQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM3ZDg3Mi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgdm9pZCBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlKQ0KLSAgICAgICAgICAgIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb247DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRGF0ZUlzU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRGF0ZUlzU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwYzYwNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0RhdGVJc1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJc1R5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsNCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERhdGVJc1N0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT19FQVJMWSA9ICJlYXJseSI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT19MQVRFID0gImxhdGUiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRVFVQUxfREFURV9USU1FID0gIm5vdCBlcXVhbCI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVkgPSAicmVzdWx0IjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFSRURfVkFMVUVfS0VZID0gInRhcmdldCB2YWx1ZSI7DQotDQotICAgIHB1YmxpYyBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHZpb2xhdGlvbkZvdW5kOw0KLQ0KLSAgICAgICAgaWYgKCgoRGF0ZUlzKSBhbm5vdGF0aW9uKS50eXBlKCkuZXF1YWxzKERhdGVJc1R5cGUuc2FtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSBvYmplY3QxICE9IG51bGwgJiYgIW9iamVjdDEuZXF1YWxzKG9iamVjdDIpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVTVUxUX0tFWSwgTk9UX0VRVUFMX0RBVEVfVElNRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoKChEYXRlSXMpIGFubm90YXRpb24pLnR5cGUoKS5lcXVhbHMoRGF0ZUlzVHlwZS5iZWZvcmUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsICYmIG9iamVjdDIgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW5ldyBEYXRlKCgoRGF0ZSkgb2JqZWN0MSkuZ2V0VGltZSgpKS5iZWZvcmUoKERhdGUpIG9iamVjdDIpIHx8IG9iamVjdDEuZXF1YWxzKG9iamVjdDIpKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFU1VMVF9LRVksIFRPT19MQVRFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSBvYmplY3QxICE9IG51bGwgJiYgb2JqZWN0MiAhPSBudWxsICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICghbmV3IERhdGUoKChEYXRlKSBvYmplY3QxKS5nZXRUaW1lKCkpLmFmdGVyKChEYXRlKSBvYmplY3QyKSB8fCBvYmplY3QxLmVxdWFscyhvYmplY3QyKSk7DQotDQotICAgICAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVNVTFRfS0VZLCBUT09fRUFSTFkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KENPTVBBUkVEX1ZBTFVFX0tFWSwgb2JqZWN0MSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlvbGF0aW9uRm91bmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRGF0ZUlzKSBhbm5vdGF0aW9uKS52YWx1ZU9mKCk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogcHJvdGVjdGVkDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZykgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLmdldChSRVNVTFRfS0VZKTsNCi0gICAgICAgIGlmIChUT09fRUFSTFkuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldE5vdEFmdGVyRXJyb3JNc2dLZXkoKERhdGVJcykgYW5ub3RhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChUT09fTEFURS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0Tm90QmVmb3JlRXJyb3JNc2dLZXkoKERhdGVJcykgYW5ub3RhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldE5vdEVxdWFsRXJyb3JNc2dLZXkoKERhdGVJcykgYW5ub3RhdGlvbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpLCBhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBrZXkgIiArIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKFN0cmluZyBrZXksIEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSByZXNvbHZlTWVzc2FnZShrZXkpOw0KLQ0KLSAgICAgICAgRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKChEYXRlSXMpIGFubm90YXRpb24pLmVycm9yTWVzc2FnZURhdGVTdHlsZSgpLA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpKTsNCi0NCi0gICAgICAgIC8vcmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgb3RoZXIgY29tcG9uZW50DQotICAgICAgICByZXR1cm4gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLCBkYXRlRm9ybWF0LmZvcm1hdCgoRGF0ZSkgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLmdldChDT01QQVJFRF9WQUxVRV9LRVkpKSk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogcHJpdmF0ZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90QWZ0ZXJFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RBZnRlckVycm9yTXNnS2V5KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXROb3RCZWZvcmVFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RCZWZvcmVFcnJvck1zZ0tleSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90RXF1YWxFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RFcXVhbEVycm9yTXNnS2V5KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VMQ29tcGFyZVN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VMQ29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZTVmOWYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIHJlZmVyZW5jaW5nIHZhbGlkYXRpb24gdGFyZ2V0cyAtIHBvc3NpYmxlIGZvcm1hdHM6DQotICogIiN7W2JlYW5fbmFtZV0uW3Byb3BlcnR5X25hbWVdfSIgLi4uIGNyb3NzLWVudGl0eSB2YWxpZGF0aW9uIHdpdGggdmFsdWUgYmluZGluZw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBFTENvbXBhcmVTdHJhdGVneSBpbXBsZW1lbnRzIFJlZmVyZW5jaW5nU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYgKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKHZhbGlkYXRpb25UYXJnZXQpICYmDQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVZhbGlkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgdmFsaWRhdGlvblRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9WYWxpZGF0ZVZhbHVlQmluZGluZyhjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbGlkYXRpb25UYXJnZXQpLCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLCBjb21wYXJlU3RyYXRlZ3kpOw0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ0ZXN0IikNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZVZhbHVlQmluZGluZygNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcgPSBDcm9zc1ZhbGlkYXRpb25VdGlscw0KLSAgICAgICAgICAgICAgICAuZ2V0T3JJbml0S2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcoKTsNCi0NCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5ID0gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMucmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFbnRyeSgNCi0gICAgICAgICAgICAgICAga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLA0KLSAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5jb252ZXJ0VmFsdWVCaW5kaW5nRXhwcmVzc2lvblRvUHJvY2Vzc2VkSW5mb3JtYXRpb25LZXkodmFsaWRhdGlvblRhcmdldCksDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotDQotICAgICAgICBpZih2YWxpZGF0aW9uVGFyZ2V0RW50cnkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBjb252ZXJ0ZWQgb2JqZWN0IGZvciAiICsgcHJvcGVydHlEZXRhaWxzLmdldEtleSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VxdWFsc1N0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VxdWFsc1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNDc2Y2EuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FcXVhbHNTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEVxdWFsc1N0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIHB1YmxpYyBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRXF1YWxzKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG9iamVjdDEgIT0gbnVsbCAmJiAhb2JqZWN0MS5lcXVhbHMob2JqZWN0Mik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRXF1YWxzKSBhbm5vdGF0aW9uKS52YWx1ZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxDb21wYXJlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxDb21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVlYjU0MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiAiW3Byb3BlcnR5X25hbWVdIiAuLi4gbG9jYWwgdmFsaWRhdGlvbiAtPiBjcm9zcy1jb21wb25lbnQsIGJ1dCBubyBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBMb2NhbENvbXBhcmVTdHJhdGVneSBpbXBsZW1lbnRzIFJlZmVyZW5jaW5nU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlTG9jYWxseSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0S2V5LA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4ga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nID0gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMNCi0gICAgICAgICAgICAgICAgLmdldE9ySW5pdEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCk7DQotDQotICAgICAgICBTdHJpbmcgbmV3S2V5ID0gY3JlYXRlVGFyZ2V0S2V5KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0S2V5KTsNCi0gICAgICAgIGlmICgha2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLmNvbnRhaW5zS2V5KG5ld0tleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBTdHJpbmcgc291cmNlS2V5ID0gcHJvcGVydHlEZXRhaWxzLmdldEtleSgpOw0KLQ0KLSAgICAgICAgaWYoIXNvdXJjZUtleS5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNvdXJjZSBwYXRoOiAiICsgc291cmNlS2V5ICsgIiBpbnZhbGlkIik7DQotICAgICAgICB9DQotDQotICAgICAgICB0YXJnZXRLZXkgPSBzb3VyY2VLZXkuc3Vic3RyaW5nKDAsIHNvdXJjZUtleS5sYXN0SW5kZXhPZigiLiIpICsgMSkgKyB0YXJnZXRLZXk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9IENyb3NzVmFsaWRhdGlvblV0aWxzLnJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgICAgIGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZywgdGFyZ2V0S2V5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLQ0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25UYXJnZXRFbnRyeSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGNvbnZlcnRlZCBvYmplY3QgZm9yICIgKyBwcm9wZXJ0eURldGFpbHMuZ2V0S2V5KCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlVGFyZ2V0S2V5KENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFN0cmluZyB0YXJnZXRLZXkpDQotICAgIHsNCi0gICAgICAgIC8vbm8gcmVhbCB2YWx1ZSBiaW5kaW5nIGV4cHJlc3Npb24NCi0gICAgICAgIC8vVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBqdXN0IGhlcGxzIHRvIHJlcGxhY2UgdGhlIHByb3BlcnR5IG9mIHRoZSBrZXkNCi0gICAgICAgIC8vaGVyZSBvbmx5IGRvdC1ub3RhdGlvbiBpcyBhbGxvd2VkIC0+IG5vIHByb2JsZW0NCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYmFzZUV4cHJlc3Npb24gPQ0KLSAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIjeyIgKyBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLA0KLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZXRhaWxzLmNsYXNzKS5nZXRLZXkoKSArICJ9Iik7DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlT3JBZGRQcm9wZXJ0eShiYXNlRXhwcmVzc2lvbiwgdGFyZ2V0S2V5KQ0KLSAgICAgICAgICAgIC5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0LnN1YnN0cmluZygyLCByZXN1bHQubGVuZ3RoKCkgLTEpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWRhNDU1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi0NCi0vKioNCi0gKiAiW2xvY2FsX3Byb3BlcnR5LnByb3BlcnR5MS5wcm9wZXJ0eTJdIg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBMb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kgZXh0ZW5kcyBMb2NhbENvbXBhcmVTdHJhdGVneQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgT2JqZWN0IG5ld0Jhc2UgPSBSZWZsZWN0aW9uVXRpbHMNCi0gICAgICAgICAgICAuZ2V0QmFzZU9mUHJvcGVydHlDaGFpbihwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgaWYodGFyZ2V0S2V5LmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9maW5kIHRoZSBsYXN0IHByb3BlcnR5DQotICAgICAgICAgICAgdGFyZ2V0S2V5ID0gdGFyZ2V0S2V5LnN1YnN0cmluZyh0YXJnZXRLZXkubGFzdEluZGV4T2YoIi4iKSArIDEsIHRhcmdldEtleS5sZW5ndGgoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBPYmplY3QgdGFyZ2V0VmFsdWUgPSBnZXRWYWx1ZU9mUHJvcGVydHkobmV3QmFzZSwgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIGJvb2xlYW4gdmlvbGF0aW9uRm91bmQgPSBmYWxzZTsNCi0NCi0gICAgICAgIGlmIChjb21wYXJlU3RyYXRlZ3kuaXNWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VmFsdWUsIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpKQ0KLSAgICAgICAgew0KLQ0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgPSBuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KCk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbXBvbmVudChjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDbGllbnRJZChjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbnZlcnRlZE9iamVjdCh0YXJnZXRWYWx1ZSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldFZhbGlkYXRpb25TdHJhdGVneShjb21wYXJlU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneQ0KLSAgICAgICAgICAgICAgICAgICAgLnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotDQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IGdldFZhbHVlT2ZQcm9wZXJ0eShPYmplY3QgYmFzZSwgU3RyaW5nIHByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnR5LnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSwgcHJvcGVydHkubGVuZ3RoKCkpOw0KLSAgICAgICAgTWV0aG9kIHRhcmdldE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZChiYXNlLmdldENsYXNzKCksICJnZXQiICsgcHJvcGVydHkpOw0KLQ0KLSAgICAgICAgaWYodGFyZ2V0TWV0aG9kID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKGJhc2UuZ2V0Q2xhc3MoKSwgImlzIiArIHByb3BlcnR5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICJjbGFzcyAiICsgYmFzZS5nZXRDbGFzcygpICsgIiBoYXMgbm8gcHVibGljIGdldC9pcyAiICsgcHJvcGVydHkudG9Mb3dlckNhc2UoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKGJhc2UsIHRhcmdldE1ldGhvZCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Ob3RFcXVhbHNTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Ob3RFcXVhbHNTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDE1ZTIwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uTm90RXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBOb3RFcXVhbHNTdHJhdGVneSBleHRlbmRzIEVxdWFsc1N0cmF0ZWd5DQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChOb3RFcXVhbHMpIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsDQotICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIXN1cGVyLmlzVmlvbGF0aW9uKG9iamVjdDEsIG9iamVjdDIsIGFubm90YXRpb24pOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChOb3RFcXVhbHMpIGFubm90YXRpb24pLnZhbHVlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlZmVyZW5jaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzNmRmYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlZmVyZW5jaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJbnRlcm5hbCBpbnRlcmZhY2UgdG8gYWxsb3cgbXVsdGlwbGUgcmVmZXJlbmNpbmcgc3RyYXRlZ2llcyBmb3IgY3Jvc3MgY29tcG9uZW50IHZhbGlkYXRpb24uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWludGVyZmFjZSBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgYWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlcXVpcmVkSWZTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQwNWE1Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlcXVpcmVkSWZTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRJZlN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VGYWNlc0J1bmRsZSA9IGZhbHNlOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHN1cGVyLnJlc29sdmVNZXNzYWdlKGtleSk7DQotICAgICAgICBTdHJpbmcgbWFya2VyID0gQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVI7DQotDQotICAgICAgICBpZigobWFya2VyICsga2V5ICsgbWFya2VyKS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnVzZUZhY2VzQnVuZGxlID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChSZXF1aXJlZElmKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiB2aW9sYXRpb25Gb3VuZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgaWYgKCgoUmVxdWlyZWRJZikgYW5ub3RhdGlvbikuaXMoKS5lcXVhbHMoUmVxdWlyZWRJZlR5cGUuZW1wdHkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gKG9iamVjdDIgPT0gbnVsbCB8fCBvYmplY3QyLmVxdWFscygiIikpICYmIChvYmplY3QxID09IG51bGwgfHwgb2JqZWN0MS5lcXVhbHMoIiIpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKCgoUmVxdWlyZWRJZikgYW5ub3RhdGlvbikuaXMoKS5lcXVhbHMoUmVxdWlyZWRJZlR5cGUubm90X2VtcHR5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IChvYmplY3QyICE9IG51bGwgJiYgIW9iamVjdDIuZXF1YWxzKCIiKSkgJiYgKG9iamVjdDEgPT0gbnVsbCB8fCBvYmplY3QxLmVxdWFscygiIikpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZpb2xhdGlvbkZvdW5kOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKFJlcXVpcmVkSWYpIGFubm90YXRpb24pLnZhbHVlT2YoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy51c2VGYWNlc0J1bmRsZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5yZXBsYWNlV2l0aERlZmF1bHRSZXF1aXJlZE1lc3NhZ2UodmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRvckV4Y2VwdGlvbik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZDk5MjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1qYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW49b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuQmFzaWM9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuSWQ9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmU9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Dcm9zc1ZhbGlkYXRpb25VdGlscy5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNGJjZDguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENST1NTX1ZBTElEQVRJT05fU1RPUkFHRV9LRVkgPSBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7DQotDQotICAgICAgICBpZiAoIXJlcXVlc3RNYXAuY29udGFpbnNLZXkoQ1JPU1NfVkFMSURBVElPTl9TVE9SQUdFX0tFWSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKENyb3NzVmFsaWRhdGlvblN0b3JhZ2UpIHJlcXVlc3RNYXAuZ2V0KENST1NTX1ZBTElEQVRJT05fU1RPUkFHRV9LRVkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQNCi0gICAgICAgICAgICAgICAgLmdldEN1cnJlbnRJbnN0YW5jZSgpDQotICAgICAgICAgICAgICAgIC5nZXRFeHRlcm5hbENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgICAgIC5wdXQoQ1JPU1NfVkFMSURBVElPTl9TVE9SQUdFX0tFWSwgbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RPX0NPTlZFUlRFRF9WQUxVRV9NQVBQSU5HX0tFWSA9IEpzZlV0aWxzLmNsYXNzLmdldE5hbWUoKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBnZXRPckluaXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIGlmICghcmVxdWVzdE1hcC5jb250YWluc0tleShLRVlfVE9fQ09OVkVSVEVEX1ZBTFVFX01BUFBJTkdfS0VZKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNldEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+KSByZXF1ZXN0TWFwLmdldChLRVlfVE9fQ09OVkVSVEVEX1ZBTFVFX01BUFBJTkdfS0VZKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkNCi0gICAgICAgICAgICAucHV0KEtFWV9UT19DT05WRVJURURfVkFMVUVfTUFQUElOR19LRVksIG5ldyBIYXNoTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4oKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4ga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcsDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSwgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5ID0NCi0gICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQodGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIC8vc2ltcGxlIGNhc2UNCi0gICAgICAgIGlmIChwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEZ1cnRoZXJFbnRyaWVzKCkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgT2JqZWN0IHRhcmdldEJlYW4gPSBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpOw0KLQ0KLSAgICAgICAgLy9wcm9jZXNzIGNvbXBsZXggY29tcG9uZW50IGVudHJpZXMgKGUuZy4gYSB0YWJsZSkNCi0gICAgICAgIC8vc3VwcG9ydGVkOiBjcm9zcy1jb21wb25lbnQgYnV0IG5vIGNyb3NzLWVudGl0eSB2YWxpZGF0aW9uICg9IGxvY2FsZSB2YWxpZGF0aW9uKQ0KLSAgICAgICAgaWYgKHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuZ2V0QmVhbigpLmVxdWFscyh0YXJnZXRCZWFuKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAoUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSBlbnRyeSA6IHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuZ2V0RnVydGhlckVudHJpZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuZ2V0QmVhbigpLmVxdWFscyh0YXJnZXRCZWFuKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic3VwcG9ydCBmb3IgbWFwIHN5bnRheCIpDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uVG9Qcm9jZXNzZWRJbmZvcm1hdGlvbktleShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZiZS5nZXRFeHByZXNzaW9uU3RyaW5nKCkucmVwbGFjZSgiI3siLCAiIikucmVwbGFjZSgifSIsICIiKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzM5MjU1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFByb3BlcnR5IFZhbGlkYXRpb24gTW9kdWxlDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgUHJvcGVydHkgVmFsaWRhdGlvbiBNb2R1bGUgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBQcm9wZXJ0eSBWYWxpZGF0aW9uIHByb3ZpZGVzIGFubm90YXRpb24gYmFzZWQgdmFsaWRhdGlvbiBmb3IgYmVhbiBwcm9wZXJ0aWVzLg0KLSAgICBJdCBhbHNvIHByb3ZpZGVzIEpQQSAxLjAgYmFzZWQgdmFsaWRhdGlvbiBTdXBwb3J0Lg0KLSAgDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLjEueCBhbmQgSlNGIDEuMi54LiBCb3RoIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjMzYWJjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7Ci1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUlucHV0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuVGVzdFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5tb2NrLkV4dFZhbE1vY2tBcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZF9pbXBsLmNvbmZpZy5NeWZhY2VzQ29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrRXh0ZXJuYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tGYWNlc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0ZhY2VzQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrSHR0cFNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0xpZmVjeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrTGlmZWN5Y2xlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrUmVuZGVyS2l0OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tSZXNwb25zZVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrU2VydmxldENvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrU2VydmxldENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0LmVsLk1vY2tFeHByZXNzaW9uRmFjdG9yeTsKLQotLyoqCi0gKiBBYnN0cmFjdCBTaGFsZSBUZXN0IGJhc2UgY2xhc3MsIHdoaWNoIHNldHMgdXAgdGhlIEpTRiBlbnZpcm9ubWVudC4gIElmIHRoZSB0ZXN0Ci0gKiBvdmVycmlkZXMgPGNvZGU+c2V0VXAoKTwvY29kZT4gYW5kL29yIDxjb2RlPnRlYXJEb3duKCk8L2NvZGU+LCB0aGVuIHRob3NlCi0gKiBtZXRob2RzIGJ1dCBjYWxsIHRoZSBvdmVyd2l0dGVuIG1ldGhvZCB0byBpbnN1cmUgYSB2YWxpZCB0ZXN0IGVudmlyb25tZW50LgotICovCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIHByb3RlY3RlZCBNb2NrQXBwbGljYXRpb24gYXBwbGljYXRpb247Ci0gICAgcHJvdGVjdGVkIE1vY2tTZXJ2bGV0Q29uZmlnIGNvbmZpZzsKLSAgICBwcm90ZWN0ZWQgTW9ja0V4dGVybmFsQ29udGV4dCBleHRlcm5hbENvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIE1vY2tGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0OwotICAgIHByb3RlY3RlZCBNb2NrRmFjZXNDb250ZXh0RmFjdG9yeSBmYWNlc0NvbnRleHRGYWN0b3J5OwotICAgIHByb3RlY3RlZCBNb2NrTGlmZWN5Y2xlIGxpZmVjeWNsZTsKLSAgICBwcm90ZWN0ZWQgTW9ja0xpZmVjeWNsZUZhY3RvcnkgbGlmZWN5Y2xlRmFjdG9yeTsKLSAgICBwcm90ZWN0ZWQgUmVuZGVyS2l0IHJlbmRlcktpdDsKLSAgICBwcm90ZWN0ZWQgTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0OwotICAgIHByb3RlY3RlZCBNb2NrSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZTsKLSAgICBwcm90ZWN0ZWQgTW9ja1NlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0OwotICAgIHByb3RlY3RlZCBNb2NrSHR0cFNlc3Npb24gc2Vzc2lvbjsKLSAgICBwcm90ZWN0ZWQgTW9ja0V4cHJlc3Npb25GYWN0b3J5IGV4cHJlc3Npb25GYWN0b3J5OwotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyOwotICAgICAgICAKLSAgICAvKiogUmVzcG9uc2UgV3JpdGVyICovCi0gICAgcHJpdmF0ZSBNb2NrUmVzcG9uc2VXcml0ZXIgd3JpdGVyOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuCi0gICAgICovCi0gICAgcHVibGljIEFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgICAgIGFwcGxpY2F0aW9uID0gbnVsbDsKLSAgICAgICAgY29uZmlnID0gbnVsbDsKLSAgICAgICAgZXh0ZXJuYWxDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgZmFjZXNDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgZmFjZXNDb250ZXh0RmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIGxpZmVjeWNsZSA9IG51bGw7Ci0gICAgICAgIGxpZmVjeWNsZUZhY3RvcnkgPSBudWxsOwotICAgICAgICByZW5kZXJLaXQgPSBudWxsOwotICAgICAgICByZXF1ZXN0ID0gbnVsbDsKLSAgICAgICAgcmVzcG9uc2UgPSBudWxsOwotICAgICAgICBzZXJ2bGV0Q29udGV4dCA9IG51bGw7Ci0gICAgICAgIHNlc3Npb24gPSBudWxsOwotICAgICAgICBleHByZXNzaW9uRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIHRocmVhZENvbnRleHRDbGFzc0xvYWRlciA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFNldHVwIHRoZSB0ZXN0IGVudmlyb25tZW50LCBpbmNsdWRpbmcgdGhlIGZvbGxvd2luZzoKLSAgICAgKiAgPHVsPgotICAgICAqICA8bGk+U2V0IHRoZSBBcHBsaWNhdGlvbiBNYXAuPC9saT4KLSAgICAgKiAgPGxpPlNldCBhIHJlc3BvbnNlIHdyaXRlcjwvbGk+Ci0gICAgICogIDxsaT5BZGQgVG9tYWhhd2sncyByZW5kZXJlcnMgdG8gdGhlIGZhY2VzIGNvbnRleHQuPC9saT4KLSAgICAgKiAgPC91bD4gCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFswXSwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKSk7Ci0gICAgICAgIHNlcnZsZXRDb250ZXh0ID0gbmV3IE1vY2tTZXJ2bGV0Q29udGV4dCgpOwotICAgICAgICAvL2ZvciB0ZXN0aW5nIHRoZSBmYWxsYmFjawotICAgICAgICAvL3NlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCArICIuREVBQ1RJVkFURV9FTF9SRVNPTFZFUiIsICJ0cnVlIik7Ci0gICAgICAgIGNvbmZpZyA9IG5ldyBNb2NrU2VydmxldENvbmZpZyhzZXJ2bGV0Q29udGV4dCk7Ci0gICAgICAgIHNlc3Npb24gPSBuZXcgTW9ja0h0dHBTZXNzaW9uKCk7Ci0gICAgICAgIHNlc3Npb24uc2V0U2VydmxldENvbnRleHQoc2VydmxldENvbnRleHQpOwotICAgICAgICByZXF1ZXN0ID0gbmV3IE1vY2tIdHRwU2VydmxldFJlcXVlc3Qoc2Vzc2lvbik7Ci0gICAgICAgIHJlcXVlc3Quc2V0U2VydmxldENvbnRleHQoc2VydmxldENvbnRleHQpOwotICAgICAgICByZXNwb25zZSA9IG5ldyBNb2NrSHR0cFNlcnZsZXRSZXNwb25zZSgpOwotICAgICAgICBGYWN0b3J5RmluZGVyLnJlbGVhc2VGYWN0b3JpZXMoKTsKLSAgICAgICAgRmFjdG9yeUZpbmRlci5zZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3RvcnkiLCBFeHRWYWxNb2NrQXBwbGljYXRpb25GYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIEZhY3RvcnlGaW5kZXIuc2V0RmFjdG9yeSgiamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHRGYWN0b3J5IiwgIm9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tGYWNlc0NvbnRleHRGYWN0b3J5Iik7Ci0gICAgICAgIEZhY3RvcnlGaW5kZXIuc2V0RmFjdG9yeSgiamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZUZhY3RvcnkiLCAib3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0xpZmVjeWNsZUZhY3RvcnkiKTsKLSAgICAgICAgRmFjdG9yeUZpbmRlci5zZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeSIsICJvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrUmVuZGVyS2l0RmFjdG9yeSIpOwotICAgICAgICBleHRlcm5hbENvbnRleHQgPSBuZXcgTW9ja0V4dGVybmFsQ29udGV4dChzZXJ2bGV0Q29udGV4dCwgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICBsaWZlY3ljbGVGYWN0b3J5ID0gKE1vY2tMaWZlY3ljbGVGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZUZhY3RvcnkiKTsKLSAgICAgICAgbGlmZWN5Y2xlID0gKE1vY2tMaWZlY3ljbGUpbGlmZWN5Y2xlRmFjdG9yeS5nZXRMaWZlY3ljbGUoIkRFRkFVTFQiKTsKLSAgICAgICAgZmFjZXNDb250ZXh0RmFjdG9yeSA9IChNb2NrRmFjZXNDb250ZXh0RmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoImphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0RmFjdG9yeSIpOwotICAgICAgICBmYWNlc0NvbnRleHQgPSAoTW9ja0ZhY2VzQ29udGV4dClmYWNlc0NvbnRleHRGYWN0b3J5LmdldEZhY2VzQ29udGV4dChzZXJ2bGV0Q29udGV4dCwgcmVxdWVzdCwgcmVzcG9uc2UsIGxpZmVjeWNsZSk7Ci0gICAgICAgIGV4dGVybmFsQ29udGV4dCA9IChNb2NrRXh0ZXJuYWxDb250ZXh0KWZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKTsKLSAgICAgICAgVUlWaWV3Um9vdCByb290ID0gbmV3IFVJVmlld1Jvb3QoKTsKLSAgICAgICAgcm9vdC5zZXRWaWV3SWQoIi92aWV3SWQiKTsKLSAgICAgICAgcm9vdC5zZXRSZW5kZXJLaXRJZCgiSFRNTF9CQVNJQyIpOwotICAgICAgICBmYWNlc0NvbnRleHQuc2V0Vmlld1Jvb3Qocm9vdCk7Ci0gICAgICAgIEFwcGxpY2F0aW9uRmFjdG9yeSBhcHBsaWNhdGlvbkZhY3RvcnkgPSAoQXBwbGljYXRpb25GYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5Iik7Ci0gICAgICAgIGFwcGxpY2F0aW9uID0gKE1vY2tBcHBsaWNhdGlvbilhcHBsaWNhdGlvbkZhY3RvcnkuZ2V0QXBwbGljYXRpb24oKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LnNldEFwcGxpY2F0aW9uKGFwcGxpY2F0aW9uKTsKLSAgICAgICAgUmVuZGVyS2l0RmFjdG9yeSByZW5kZXJLaXRGYWN0b3J5ID0gKFJlbmRlcktpdEZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeSIpOwotICAgICAgICAvL1dyYXAgcmVuZGVyZXJzIHdpdGggcHJvcGVyIGV4dmFsIHdyYXBwZXIKLSAgICAgICAgcmVuZGVyS2l0ID0gbmV3IERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpLmNyZWF0ZShuZXcgTW9ja1JlbmRlcktpdCgpKTsKLSAgICAgICAgcmVuZGVyS2l0RmFjdG9yeS5hZGRSZW5kZXJLaXQoIkhUTUxfQkFTSUMiLCByZW5kZXJLaXQpOyAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyBhZGRpdGlvbmFsIHNldHVwIG5vdCBwcm92aWRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBzaGFsZSBtb2NrIHN0dWZmCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbk1hcCgpLnB1dCgKLSAgICAgICAgICAgICAgICBNeWZhY2VzQ29uZmlnLmNsYXNzLmdldE5hbWUoKSwgbmV3IE15ZmFjZXNDb25maWcoKSk7Ci0gICAgICAgIHdyaXRlciA9IG5ldyBNb2NrUmVzcG9uc2VXcml0ZXIobmV3IFN0cmluZ1dyaXRlcigpLCBudWxsLCBudWxsKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LnNldFJlc3BvbnNlV3JpdGVyKHdyaXRlcik7Ci0KLSAgICAgICAgVGVzdFV0aWxzLmFkZERlZmF1bHRSZW5kZXJlcnMoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgVGVzdFV0aWxzLmFkZERlZmF1bHRWYWxpZGF0b3JzKGZhY2VzQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIGV4cHJlc3Npb25GYWN0b3J5ID0gKE1vY2tFeHByZXNzaW9uRmFjdG9yeSlhcHBsaWNhdGlvbi5nZXRFeHByZXNzaW9uRmFjdG9yeSgpOwotICAgICAgICBuZXcgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyKCkuaW5pdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlYXIgZG93biB0aGUgdGVzdCBlbnZpcm9ubWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGFwcGxpY2F0aW9uID0gbnVsbDsKLSAgICAgICAgY29uZmlnID0gbnVsbDsKLSAgICAgICAgZXh0ZXJuYWxDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgZmFjZXNDb250ZXh0LnJlbGVhc2UoKTsKLSAgICAgICAgZmFjZXNDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgbGlmZWN5Y2xlID0gbnVsbDsKLSAgICAgICAgbGlmZWN5Y2xlRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIHJlbmRlcktpdCA9IG51bGw7Ci0gICAgICAgIHJlcXVlc3QgPSBudWxsOwotICAgICAgICByZXNwb25zZSA9IG51bGw7Ci0gICAgICAgIHNlcnZsZXRDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgc2Vzc2lvbiA9IG51bGw7Ci0gICAgICAgIEZhY3RvcnlGaW5kZXIucmVsZWFzZUZhY3RvcmllcygpOwotICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcih0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIpOwotICAgICAgICBleHByZXNzaW9uRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIHRocmVhZENvbnRleHRDbGFzc0xvYWRlciA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NDcm9zc1ZhbFZhbGlkYXRpb24oKQotICAgIHsKLSAgICAgICAgbmV3IENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIoKS5hZnRlclBoYXNlKG5ldyBQaGFzZUV2ZW50KChGYWNlc0NvbnRleHQpZmFjZXNDb250ZXh0LFBoYXNlSWQuQU5ZX1BIQVNFLGxpZmVjeWNsZSkpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja01lc3NhZ2VDb3VudChpbnQgZXhwZWN0ZWQpCi0gICAgewotICAgICAgICBpbnQgYWN0dWFsID0gMDsKLSAgICAgICAgZm9yKEl0ZXJhdG9yIG1lc3NhZ2VzID0gZmFjZXNDb250ZXh0LmdldE1lc3NhZ2VzKCk7IG1lc3NhZ2VzLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lc3NhZ2VzLm5leHQoKTsKLSAgICAgICAgICAgIGFjdHVhbCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb21wbGV0ZSBtZXNzYWdlIGNvdW50IiwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tNZXNzYWdlQ291bnQoU3RyaW5nIGNsaWVudElkLCBpbnQgZXhwZWN0ZWQpCi0gICAgewotICAgICAgICBpbnQgYWN0dWFsID0gMDsKLSAgICAgICAgZm9yKEl0ZXJhdG9yIG1lc3NhZ2VzID0gZmFjZXNDb250ZXh0LmdldE1lc3NhZ2VzKGNsaWVudElkKTsgbWVzc2FnZXMuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgbWVzc2FnZXMubmV4dCgpOwotICAgICAgICAgICAgYWN0dWFsKys7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbXBsZXRlIG1lc3NhZ2UgY291bnQiLCBleHBlY3RlZCwgYWN0dWFsKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVmVyaWZ5IHRoZSBmb2xsb3dpbmc6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5pZCBpcyBub3QgbnVsbDwvbGk+Ci0gICAgICogPGxpPlJlc3BvbnNlIGlzIGNvbXBsZXRlPC9saT4KLSAgICAgKiA8bGk+UmVzcG9uY2UgY29udGFpbnMgdGhlIGlkPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZCBJRCB0byB2ZXJpZnkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRJZEV4aXN0cyhTdHJpbmcgaWQpCi0gICAgewotICAgICAgICBhc3NlcnROb3ROdWxsKCJJRCBpcyBub3QgbnVsbCIsIGlkKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzcG9uc2UgQ29tcGxldGUiLCBmYWNlc0NvbnRleHQuZ2V0UmVzcG9uc2VDb21wbGV0ZSgpKTsKLSAgICAgICAgU3RyaW5nIG91dHB1dCA9IHdyaXRlci5nZXRXcml0ZXIoKS50b1N0cmluZygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJIYXMgb3V0cHV0Iiwgb3V0cHV0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ29udGFpbnMgaWQgJyIgKyBpZCArICInIiwgb3V0cHV0LmluZGV4T2YoaWQpICE9IC0xKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVWYWx1ZUJpbmRpbmcoVUlJbnB1dCB1aUlucHV0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIGV4cHJlc3Npb24pCi0gICAgewotICAgICAgICBWYWx1ZUJpbmRpbmcgdmFsdWVCaW5kaW5nID0gYXBwbGljYXRpb24uY3JlYXRlVmFsdWVCaW5kaW5nKGV4cHJlc3Npb24pOwotICAgICAgICBWYWx1ZUV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uID0gZXhwcmVzc2lvbkZhY3RvcnkuY3JlYXRlVmFsdWVFeHByZXNzaW9uKAotICAgICAgICAgICAgZmFjZXNDb250ZXh0LmdldEVMQ29udGV4dCgpLCBleHByZXNzaW9uLCBPYmplY3QuY2xhc3MpOwotCi0gICAgICAgIGlmKHVpSW5wdXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdWlJbnB1dC5zZXRWYWx1ZUJpbmRpbmcobmFtZSwgdmFsdWVCaW5kaW5nKTsKLSAgICAgICAgICAgIHVpSW5wdXQuc2V0VmFsdWVFeHByZXNzaW9uKG5hbWUsIHZhbHVlRXhwcmVzc2lvbik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvQmFzZVZhbFRlc3RCZWFuLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvQmFzZVZhbFRlc3RCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZGM5MjAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL0Jhc2VWYWxUZXN0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkRvdWJsZVJhbmdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOwotCi0vKioKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUKLSAqLwotcHVibGljIGNsYXNzIEJhc2VWYWxUZXN0QmVhbgotewotICAgIEBSZXF1aXJlZAotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgCi0gICAgQExlbmd0aChtaW5pbXVtPTIsbWF4aW11bT0zKQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWUxOwotICAgIAotICAgIEBQYXR0ZXJuKCJbQS1aXVthLXpdKyIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGF0dGVybk5hbWU7Ci0gICAgCi0gICAgQERvdWJsZVJhbmdlKG1pbmltdW09LTMwMGQpCi0gICAgcHJpdmF0ZSBEb3VibGUgZG91YmxlVmFsdWUxOwotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZTEoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5hbWUxOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUxKFN0cmluZyBuYW1lMSkKLSAgICB7Ci0gICAgICAgIHRoaXMubmFtZTEgPSBuYW1lMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhdHRlcm5OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwYXR0ZXJuTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuTmFtZShTdHJpbmcgcGF0dGVybk5hbWUpCi0gICAgewotICAgICAgICB0aGlzLnBhdHRlcm5OYW1lID0gcGF0dGVybk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIERvdWJsZSBnZXREb3VibGVWYWx1ZTEoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRvdWJsZVZhbHVlMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREb3VibGVWYWx1ZTEoRG91YmxlIGRvdWJsZVZhbHVlMSkKLSAgICB7Ci0gICAgICAgIHRoaXMuZG91YmxlVmFsdWUxID0gZG91YmxlVmFsdWUxOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9CYXNlVmFsVGVzdENhc2UuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9CYXNlVmFsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA3YTE2MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvQmFzZVZhbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWw7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2U7Ci0KLS8qKgotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQotICovCi1wdWJsaWMgY2xhc3MgQmFzZVZhbFRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UKLXsKLQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQgPSBudWxsOwotCi0gICAgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsKLSAgICAKLSAgICBCYXNlVmFsVGVzdEJlYW4gYmVhbiA9IG51bGw7Ci0KLSAgICBwdWJsaWMgQmFzZVZhbFRlc3RDYXNlKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50ID0gbnVsbDsKLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7Ci0gICAgICAgIGJlYW4gPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShCYXNlVmFsVGVzdENhc2UuY2xhc3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgYmVhbiA9IG5ldyBCYXNlVmFsVGVzdEJlYW4oKTsKLSAgICAgICAgVmFsdWVCaW5kaW5nIHZiID0gYXBwbGljYXRpb24uY3JlYXRlVmFsdWVCaW5kaW5nKCIje3Rlc3RCZWFufSIpOwotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dCgidGVzdEJlYW4iLCBiZWFuKTsKLQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsKLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOwotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7Ci0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50ID0gbmV3IEh0bWxJbnB1dFRleHQoKTsKLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudCk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldElkKCJpbnB1dDEiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50ID0gbnVsbDsKLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7Ci0gICAgICAgIGJlYW4gPSBudWxsOyAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWVSZXF1aXJlZEZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWV9Iik7Ci0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIiIpOwotCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWUxTGVuZ2h0TWF4RmFpbCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZTF9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIjEyMzQ1Iik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lMUxlbmdodENvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWUxfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZTFMZW5naHRNaW5GYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lMX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgieCIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFBhdHRlcm5OYW1lRmFpbCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucGF0dGVybk5hbWV9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIlBldGVyMSIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFBhdHRlcm5OYW1lQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucGF0dGVybk5hbWV9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIlBldGVyIik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydFRydWUoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7Ci0gICAgfSAgICAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVWYWx1ZUZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLmRvdWJsZVZhbHVlMX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiLTMwMSIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWVDb3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5kb3VibGVWYWx1ZTF9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIjIwMCIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOwotICAgICAgICBhc3NlcnRFcXVhbHMoMjAwZCwgaW5wdXRDb21wb25lbnQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIAotICAgICAgICBpbnB1dENvbXBvbmVudC51cGRhdGVNb2RlbChmYWNlc0NvbnRleHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMjAwZCwgYmVhbi5nZXREb3VibGVWYWx1ZTEoKSk7Ci0gICAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0QmVhbi5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOGFkYzkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7Ci0KLS8qKgotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQotICovCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxUZXN0QmVhbgotewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkxOwotICAgIAotICAgIEBFcXVhbHMoInByb3BlcnR5MSIpICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MjsKLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MSgpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvcGVydHkxOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOwotICAgIH0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MigpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvcGVydHkyOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydHkyID0gcHJvcGVydHkyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4Y2EwYmMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2U7Ci0KLS8qKgotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQotICovCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlCi17Ci0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MSA9IG51bGw7Ci0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOwotICAgIAotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIENyb3NzVmFsVGVzdENhc2UoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbnVsbDsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbnVsbDsKLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ3Jvc3NWYWxUZXN0Q2FzZS5jbGFzcyk7Ci0gICAgfSAgICAKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgQ3Jvc3NWYWxUZXN0QmVhbiBiZWFuID0gbmV3IENyb3NzVmFsVGVzdEJlYW4oKTsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKG51bGwsICJ2YWx1ZSIsICIje3Rlc3RCZWFufSIpOwotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dCgidGVzdEJlYW4iLGJlYW4pOwotICAgICAgICAKLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7Ci0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsKLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOwotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOyAgICAgICAgCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7Ci0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQxKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldElkKCJpbnB1dDEiKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbmV3IEh0bWxJbnB1dFRleHQoKTsKLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDIpOwotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0SWQoImlucHV0MiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc0NvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOwotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbFZhbGlkYXRpb24oKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7Ci0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOwotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDQiKTsKLSAgICAgICAgCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotICAgICAgICAKLQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxWYWxpZGF0aW9uKCk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDIpOwotCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvbW9jay9FeHRWYWxNb2NrQXBwbGljYXRpb24uamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvbW9jay9FeHRWYWxNb2NrQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ0NDU0MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IubW9jazsKLQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbjsKLQotaW1wb3J0IGphdmF4LmVsLkVMQ29udGV4dExpc3RlbmVyOwotaW1wb3J0IGphdmF4LmVsLkVMUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXguZWwuRXhwcmVzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRWYWxNb2NrQXBwbGljYXRpb24gZXh0ZW5kcyBNb2NrQXBwbGljYXRpb24KLXsKLSAgICBwcml2YXRlIEFwcGxpY2F0aW9uIHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsTW9ja0FwcGxpY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEV4dFZhbE1vY2tBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IGFwcGxpY2F0aW9uOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFTENvbnRleHRMaXN0ZW5lcltdIGdldEVMQ29udGV4dExpc3RlbmVycygpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEVMQ29udGV4dExpc3RlbmVyWzBdOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFTFJlc29sdmVyIGdldEVMUmVzb2x2ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZC5nZXRFTFJlc29sdmVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEV4cHJlc3Npb25GYWN0b3J5IGdldEV4cHJlc3Npb25GYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRXh0VmFsTW9ja0V4cHJlc3Npb25GYWN0b3J5KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9tb2NrL0V4dFZhbE1vY2tBcHBsaWNhdGlvbkZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvbW9jay9FeHRWYWxNb2NrQXBwbGljYXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZjE3OTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9tb2NrL0V4dFZhbE1vY2tBcHBsaWNhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5tb2NrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0FwcGxpY2F0aW9uRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICovCi1wdWJsaWMgY2xhc3MgRXh0VmFsTW9ja0FwcGxpY2F0aW9uRmFjdG9yeSBleHRlbmRzIE1vY2tBcHBsaWNhdGlvbkZhY3RvcnkKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxNb2NrQXBwbGljYXRpb24oc3VwZXIuZ2V0QXBwbGljYXRpb24oKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9tb2NrL0V4dFZhbE1vY2tFeHByZXNzaW9uRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMV9yYy92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9tb2NrL0V4dFZhbE1vY2tFeHByZXNzaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTg5Y2UyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvbW9jay9FeHRWYWxNb2NrRXhwcmVzc2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5tb2NrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0LmVsLk1vY2tFeHByZXNzaW9uRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmVsLkVMQ29udGV4dDsKLWltcG9ydCBqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRWYWxNb2NrRXhwcmVzc2lvbkZhY3RvcnkgZXh0ZW5kcyBNb2NrRXhwcmVzc2lvbkZhY3RvcnkKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVmFsdWVFeHByZXNzaW9uIGNyZWF0ZVZhbHVlRXhwcmVzc2lvbihFTENvbnRleHQgY29udGV4dCwgU3RyaW5nIGV4cHJlc3Npb24sIENsYXNzIGV4cGVjdGVkVHlwZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRXh0VmFsTW9ja1ZhbHVlRXhwcmVzc2lvbihleHByZXNzaW9uLCBleHBlY3RlZFR5cGUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvbW9jay9FeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uLmphdmEgYi9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL21vY2svRXh0VmFsTW9ja1ZhbHVlRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDMzODc2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvbW9jay9FeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLm1vY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5FeHRWYWxFTFJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5lbC5Nb2NrVmFsdWVFeHByZXNzaW9uOwotCi1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0OwotaW1wb3J0IGphdmF4LmVsLkVMUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKi8KLS8vVE9ETyBpbXByb3ZlCi1wdWJsaWMgY2xhc3MgRXh0VmFsTW9ja1ZhbHVlRXhwcmVzc2lvbiBleHRlbmRzIE1vY2tWYWx1ZUV4cHJlc3Npb24KLXsKLSAgICBwcml2YXRlIFN0cmluZ1tdIGVsZW1lbnRzID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBleHByZXNzaW9uID0gbnVsbDsKLQotICAgIHB1YmxpYyBFeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uKFN0cmluZyBleHByZXNzaW9uLCBDbGFzcyBleHBlY3RlZFR5cGUpCi0gICAgewotICAgICAgICBzdXBlcihleHByZXNzaW9uLCBleHBlY3RlZFR5cGUpOwotCi0gICAgICAgIGlmIChleHByZXNzaW9uID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiRXhwcmVzc2lvbiBzdHJpbmcgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247Ci0gICAgICAgIHBhcnNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShFTENvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIEVMUmVzb2x2ZXIgcmVzb2x2ZXIgPSBjb250ZXh0LmdldEVMUmVzb2x2ZXIoKTsKLQotICAgICAgICBpZiAocmVzb2x2ZXIgaW5zdGFuY2VvZiBFeHRWYWxFTFJlc29sdmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QmFzZShjb250ZXh0LCByZXNvbHZlcik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VmFsdWUoY29udGV4dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoRUxDb250ZXh0IGNvbnRleHQsIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmIChjb250ZXh0LmdldEVMUmVzb2x2ZXIoKSBpbnN0YW5jZW9mIEV4dFZhbEVMUmVzb2x2ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRleHQuZ2V0RUxSZXNvbHZlcigpLnNldFZhbHVlKGNvbnRleHQsIGdldFZhbHVlKGNvbnRleHQpLCBlbGVtZW50c1tlbGVtZW50cy5sZW5ndGggLSAxXSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgYmFzZSA9IGdldEJhc2UoY29udGV4dCwgY29udGV4dC5nZXRFTFJlc29sdmVyKCkpOwotICAgICAgICAgICAgU3RyaW5nIHNldHRlciA9ICJzZXQiICsgY3JlYXRlUHJvcGVydHlTdHJpbmcoKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTWV0aG9kIHNldHRlck1ldGhvZCA9IGJhc2UuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZChzZXR0ZXIsIHZhbHVlICE9IG51bGwgPyB2YWx1ZS5nZXRDbGFzcygpIDogT2JqZWN0LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBzZXR0ZXJNZXRob2QuaW52b2tlKGJhc2UsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZShFTENvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IGJhc2UgPSBnZXRCYXNlKGNvbnRleHQsIGNvbnRleHQuZ2V0RUxSZXNvbHZlcigpKTsKLQotICAgICAgICBpZiAoYmFzZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBnZXR0ZXIgPSAiZ2V0IiArIGNyZWF0ZVByb3BlcnR5U3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1ldGhvZCBnZXR0ZXJNZXRob2QgPSBiYXNlLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2QoZ2V0dGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0dGVyTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGFyc2UoKQotICAgIHsKLQotICAgICAgICBpZiAoaXNMaXRlcmFsVGV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbGVtZW50cyA9IG5ldyBTdHJpbmdbMF07Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXhwcmVzc2lvbi5zdGFydHNXaXRoKCIkeyIpIHx8IGV4cHJlc3Npb24uc3RhcnRzV2l0aCgiI3siKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24uZW5kc1dpdGgoIn0iKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBleHByID0gbmV3IFN0cmluZ0J1ZmZlcihleHByZXNzaW9uLnN1YnN0cmluZygyLCBleHByZXNzaW9uLmxlbmd0aCgpIC0gMSkucmVwbGFjZUFsbCgiICIsICIiKSk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Jsb2NrT24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gZXhwci5sZW5ndGgoKSAtIDE7IGkgPiAtMTsgaS0tKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4cHIuY2hhckF0KGkpID09ICcgJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhwci5kZWxldGVDaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhwci5jaGFyQXQoaSkgPT0gJ10nKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHByLmRlbGV0ZUNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHByLmNoYXJBdChpKSA9PSAnWycpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZGVsZXRlQ2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4cHIuY2hhckF0KGkpID09ICdcJycpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNCbG9ja09uKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZGVsZXRlQ2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZCgwLCBleHByLnN1YnN0cmluZyhpICsgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZGVsZXRlKGksIGV4cHIubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaXNCbG9ja09uID0gIWlzQmxvY2tPbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHByLmNoYXJBdChpKSA9PSAnLicgJiYgIWlzQmxvY2tPbikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMuYWRkKDAsIGV4cHIuc3Vic3RyaW5nKGkgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHByLmRlbGV0ZShpLCBleHByLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZXhwci5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuYW1lcy5hZGQoMCwgZXhwci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlbGVtZW50cyA9IChTdHJpbmdbXSkgbmFtZXMudG9BcnJheShuZXcgU3RyaW5nW25hbWVzLnNpemUoKV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXhwcmVzc2lvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV4cHJlc3Npb24pOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJhc2UoRUxDb250ZXh0IGNvbnRleHQsIEVMUmVzb2x2ZXIgcmVzb2x2ZXIpCi0gICAgewotICAgICAgICBPYmplY3QgYmFzZSA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoIC0gMTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBiYXNlID0gcmVzb2x2ZXIuZ2V0VmFsdWUoY29udGV4dCwgYmFzZSwgZWxlbWVudHNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiYXNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVByb3BlcnR5U3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdOwotICAgICAgICByZXR1cm4gcHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSwgcHJvcGVydHkubGVuZ3RoKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9UZXN0VXRpbHMuamF2YSBiL3ByZXBhcmUvMV8yXzFfcmMvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9UZXN0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxN2RlMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8xX3JjL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvVGVzdFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjZXNFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBUZXN0VXRpbHMKLXsKLSAgICAvKiogRGVmYXVsdCBMb2dnZXIgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVGVzdFV0aWxzLmNsYXNzKTsKLQotICAgIC8qKiB1dGlsaXR5IGNsYXNzLCBkbyBub3QgaW5zdGFudGlhdGUgKi8KLSAgICBwcml2YXRlIFRlc3RVdGlscygpCi0gICAgewotICAgICAgICAvLyB1dGlsaXR5IGNsYXNzLCBkaXNhYmxlIGluc3RhbnRpYXRpb24KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZERlZmF1bHRWYWxpZGF0b3JzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpCi0gICAgewotICAgICAgICBhZGRWYWxpZGF0b3IoZmFjZXNDb250ZXh0LCJqYXZheC5mYWNlcy5Eb3VibGVSYW5nZSIsICJqYXZheC5mYWNlcy52YWxpZGF0b3IuRG91YmxlUmFuZ2VWYWxpZGF0b3IiKTsKLSAgICAgICAgYWRkVmFsaWRhdG9yKGZhY2VzQ29udGV4dCwiamF2YXguZmFjZXMuTGVuZ3RoIiwgImphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3IiKTsKLSAgICAgICAgYWRkVmFsaWRhdG9yKGZhY2VzQ29udGV4dCwiamF2YXguZmFjZXMuTG9uZ1JhbmdlIiwgImphdmF4LmZhY2VzLnZhbGlkYXRvci5Mb25nUmFuZ2VWYWxpZGF0b3IiKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFZhbGlkYXRvcihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRvcklkLCBTdHJpbmcgdmFsaWRhdG9yQ2xhc3MpCi0gICAgewotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5hZGRWYWxpZGF0b3IodmFsaWRhdG9ySWQsIHZhbGlkYXRvckNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYWxsIG9mIEpTRiAxLjIgZGVmYXVsdCByZW5kZXJlcnMuICBDdXJyZW50bHkgdGhpcyBpcyBub3QgdGllZCB0byAKLSAgICAgKiBmYWNlcy1jb25maWcueG1sLCBzbyBhbGwgY2hhbmdlIHRvIHRoZSBmaWxlIE1VU1QgYWxzbyBiZSBtYWRlIGhlcmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dAotICAgICAqIEB0b2RvIERvIG5vdCBhZGQgcmVuZGVyZXIgaWYgcmVuZGVyZXIgaXMgYWxyZWFkeSBhZGRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRGVmYXVsdFJlbmRlcmVycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQotICAgIHsKLSAgICAgICAgLy8gU3RhbmRhcmQgSFRNTCBSZW5kZXJlcnMKLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuQ29tbWFuZCIsICJqYXZheC5mYWNlcy5CdXR0b24iLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEJ1dHRvblJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0Qm9vbGVhbiIsCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkNoZWNrYm94IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxDaGVja2JveFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0TWFueSIsCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkNoZWNrYm94IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxDaGVja2JveFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuRm9ybSIsICJqYXZheC5mYWNlcy5Gb3JtIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxGb3JtUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5QYW5lbCIsICJqYXZheC5mYWNlcy5HcmlkIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxHcmlkUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5QYW5lbCIsICJqYXZheC5mYWNlcy5Hcm91cCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sR3JvdXBSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLklucHV0IiwgImphdmF4LmZhY2VzLkhpZGRlbiIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sSGlkZGVuUmVuZGVyZXIiKTsKLSAgICAgICAgCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkdyYXBoaWMiLCAiamF2YXguZmFjZXMuSW1hZ2UiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEltYWdlUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5PdXRwdXQiLCAiamF2YXguZmFjZXMuTGFiZWwiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbExhYmVsUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5PdXRwdXQiLCAiamF2YXguZmFjZXMuTGluayIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlua1JlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuQ29tbWFuZCIsICJqYXZheC5mYWNlcy5MaW5rIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMaW5rUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RPbmUiLAotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5MaXN0Ym94IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMaXN0Ym94UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RNYW55IiwKLSAgICAgICAgICAgICAgICAiamF2YXguZmFjZXMuTGlzdGJveCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlzdGJveFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0T25lIiwgImphdmF4LmZhY2VzLk1lbnUiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lbnVSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE1hbnkiLCAiamF2YXguZmFjZXMuTWVudSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTWVudVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuTWVzc2FnZSIsICJqYXZheC5mYWNlcy5NZXNzYWdlIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxNZXNzYWdlUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5PdXRwdXQiLCAiamF2YXguZmFjZXMuRm9ybWF0IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxGb3JtYXRSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk1lc3NhZ2VzIiwKLSAgICAgICAgICAgICAgICAiamF2YXguZmFjZXMuTWVzc2FnZXMiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lc3NhZ2VzUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RPbmUiLCAiamF2YXguZmFjZXMuUmFkaW8iLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFJhZGlvUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5TZWNyZXQiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFNlY3JldFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuRGF0YSIsICJqYXZheC5mYWNlcy5UYWJsZSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGFibGVSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLklucHV0IiwgImphdmF4LmZhY2VzLlRleHRhcmVhIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxUZXh0YXJlYVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuSW5wdXQiLCAiamF2YXguZmFjZXMuVGV4dCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGV4dFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuT3V0cHV0IiwgImphdmF4LmZhY2VzLlRleHQiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFRleHRSZW5kZXJlciIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIHJlbmRlcmVyIHRvIHRoZSBGYWNlc0NvbnRleHQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBGYWNlcyBDb250ZXh0Ci0gICAgICogQHBhcmFtIGZhbWlseSBDb21wb25lbmV0IEZhbWlseQotICAgICAqIEBwYXJhbSByZW5kZXJlclR5cGUgQ29tcG9uZW50IFR5cGUKLSAgICAgKiBAcGFyYW0gcmVuZGVyQ2xhc3NOYW1lIENsYXNzIE5hbWUgb2YgUmVuZGVyZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkUmVuZGVyZXIoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIGZhbWlseSwKLSAgICAgICAgICAgIFN0cmluZyByZW5kZXJlclR5cGUsIFN0cmluZyByZW5kZXJDbGFzc05hbWUpCi0gICAgewotICAgICAgICBSZW5kZXJlciByZW5kZXJlciA9IChqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXIpIG5ld0luc3RhbmNlKHJlbmRlckNsYXNzTmFtZSk7Ci0gICAgICAgIFJlbmRlcktpdCBraXQgPSBmYWNlc0NvbnRleHQuZ2V0UmVuZGVyS2l0KCk7Ci0gICAgICAgIGtpdC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgcmVuZGVyZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyaWVzIGEgQ2xhc3MubG9hZENsYXNzIHdpdGggdGhlIGNvbnRleHQgY2xhc3MgbG9hZGVyIG9mIHRoZSBjdXJyZW50IHRocmVhZCBmaXJzdCBhbmQKLSAgICAgKiBhdXRvbWF0aWNhbGx5IGZhbGxzIGJhY2sgdG8gdGhlIENsYXNzVXRpbHMgY2xhc3MgbG9hZGVyIChpLmUuIHRoZSBsb2FkZXIgb2YgdGhlCi0gICAgICogbXlmYWNlcy5qYXIgbGliKSBpZiBuZWNlc3NhcnkuCi0gICAgICogCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMKLSAgICAgKgotICAgICAqIEBwYXJhbSB0eXBlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgbm9uLXByaW1pdGl2ZSBub24tYXJyYXkgY2xhc3MKLSAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIENsYXNzCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0eXBlIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBjbGFzc0Zvck5hbWUoU3RyaW5nIHR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidHlwZSIpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVHJ5IFdlYkFwcCBDbGFzc0xvYWRlciBmaXJzdAotICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUodHlwZSwgZmFsc2UsIC8vIGRvIG5vdCBpbml0aWFsaXplIGZvciBmYXN0ZXIgc3RhcnR1cAotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGZhbGxiYWNrOiBUcnkgQ2xhc3NMb2FkZXIgZm9yIENsYXNzVXRpbHMgKGkuZS4gdGhlIG15ZmFjZXMuamFyIGxpYikKLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKHR5cGUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXAKLSAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWxzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2FtZSBhcyB7QGxpbmsgI2NsYXNzRm9yTmFtZShTdHJpbmcpfSwgYnV0IHRocm93cyBhIFJ1bnRpbWVFeGNlcHRpb24KLSAgICAgKiAoRmFjZXNFeGNlcHRpb24pIGluc3RlYWQgb2YgYSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLgotICAgICAqCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgQ2xhc3MKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHR5cGUgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgRmFjZXNFeGNlcHRpb24gaWYgY2xhc3Mgbm90IGZvdW5kCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3Mgc2ltcGxlQ2xhc3NGb3JOYW1lKFN0cmluZyB0eXBlKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjbGFzc0Zvck5hbWUodHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nLmVycm9yKCJDbGFzcyAiICsgdHlwZSArICIgbm90IGZvdW5kIiwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHdpdGggdGhlIHR5cGUgb2YgPGNvZGU+dHlwZTwvY29kZT4uCi0gICAgICogCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMKLSAgICAgKgotICAgICAqIEBwYXJhbSB0eXBlIFR5cGUgb2YgbmV3IGNsYXNzLgotICAgICAqIEByZXR1cm4gSW5zdGFuY2Ugb2YgdGhlIGNsYXNzIDxjb2RlPnR5cGU8L2NvZGU+Ci0gICAgICogQHRocm93cyBGYWNlc0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgdHlwZSkgdGhyb3dzIEZhY2VzRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAodHlwZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBuZXdJbnN0YW5jZShzaW1wbGVDbGFzc0Zvck5hbWUodHlwZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgPGNvZGU+Y2xheno8L2NvZGU+LgotICAgICAqIAotICAgICAqIE5vdGU6IFRoaXMgd2FzIGNvcGllZCBmcm9tIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWQudXRpbC5DbGFzc1V0aWxzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhenogQ2xhc3MgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mLgotICAgICAqIEByZXR1cm4gSW5zdGFuY2Ugb2YgdGhlIGNsYXNzIDxjb2RlPmNsYXp6PC9jb2RlPgotICAgICAqIEB0aHJvd3MgRmFjZXNFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoQ2xhc3MgY2xhenopIHRocm93cyBGYWNlc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjbGF6ei5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIkNsYXNzIDogIiArIGNsYXp6LmdldE5hbWUoKSArICIgbm90IGZvdW5kLiIsIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBGYWNlc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbmRlcmVyZWQgYSBjb21wb25lbnQsIGluY2x1ZGluZyBpdCdzIGNoaWxkcmVuLCB0aGVuIGNvbXBsZXRlIHRoZSByZXBvbnNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZXh0IEZhY2VzIENvbnRleHQKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50IENvbXBvbmVudCB0byBiZSByZW5kZXJlZC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFRocm93biB3aGlsZSByZW5kZXJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbmRlckNvbXBvbmVudChGYWNlc0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgIFVJQ29tcG9uZW50IGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlciByZW5kZXJlciA9IGNvbnRleHQuZ2V0UmVuZGVyS2l0KCkuZ2V0UmVuZGVyZXIoCi0gICAgICAgICAgICAgICAgY29tcG9uZW50LmdldEZhbWlseSgpLCBjb21wb25lbnQuZ2V0UmVuZGVyZXJUeXBlKCkpOwotICAgICAgICByZW5kZXJlci5lbmNvZGVCZWdpbihjb250ZXh0LCBjb21wb25lbnQpOwotICAgICAgICByZW5kZXJlci5lbmNvZGVDaGlsZHJlbihjb250ZXh0LCBjb21wb25lbnQpOwotICAgICAgICByZW5kZXJlci5lbmNvZGVFbmQoY29udGV4dCwgY29tcG9uZW50KTsKLSAgICAgICAgY29udGV4dC5yZXNwb25zZUNvbXBsZXRlKCk7Ci0gICAgICAgIGNvbnRleHQucmVuZGVyUmVzcG9uc2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2Fzc2VtYmx5L3BvbS54bWwgYi9wcmVwYXJlLzFfMl8yL2Fzc2VtYmx5L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMWY0MDQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9hc3NlbWJseS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1hc3NlbWJseTEyPC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQXNzZW1ibHk8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPk15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQXNzZW1ibHkgaXMgdXNlZCB0byBnZW5lcmF0ZSAKLSAgICAuemlwIGFuZCAudGFyLmd6IGRpc3RyaWJ1dGlvbnMgPC9kZXNjcmlwdGlvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuMjwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RhZ3MvMV8yXzI8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGFncy8xXzJfMjwvdXJsPgotICAgIDwvc2NtPgotICAgIAotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRlcGVuZGVuY3ktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktamF2YWRvYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZW5lcmljLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9qYXZhZG9jPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktc291cmNlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y29yZS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3NyYzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tIEVYRUNVVEUgbXZuIHBhY2thZ2UgdG8gZ2VuZXJhdGUgYXNzZW1ibHkgZmlsZXMgLS0+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfc3JjPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsMTItJHt2ZXJzaW9ufS1zcmM8L2ZpbmFsTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfYmluPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+JHtiYXNlZGlyfS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwxMi0ke3ZlcnNpb259LWJpbjwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L291dDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmF0dGFjaGVkPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y29yZS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPCEtLSBTaW5jZSBleHR2YWwgY291bGQgYmUgYXN5bmMgcmVsZWFzZWQsIGFuIGdlbmVyYXRlZCBhc3NlbWJseSBjb3VsZCBjb250YWluIGRpZmZlcmVudAotICAgICAgICAgYXJ0aWZhY3QgdmVyc2lvbnMgLS0+Ci0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxjb3JlLnZlcnNpb24+MS4yLjI8L2NvcmUudmVyc2lvbj4KLSAgICAgICAgPHRyaW5pZGFkLXN1cHBvcnQudmVyc2lvbj4xLjIuMjwvdHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9uPgotICAgICAgICA8Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb24+MS4yLjI8L2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9uPgotICAgICAgICA8cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9uPjEuMi4yPC9wcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbCBiL3ByZXBhcmUvMV8yXzIvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNjc5NWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPmNvcmViaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAJPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+UkVBRE1FKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+TElDRU5TRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPk5PVElDRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPlJFTEVBU0UqPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9qYXZhZG9jPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmphdmFkb2M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sIGIvcHJlcGFyZS8xXzJfMi9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3Jlc3JjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUxODZjNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+Y29yZXNyYzwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPiAgCi0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAJPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+UkVBRE1FKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+TElDRU5TRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPk5PVElDRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPlJFTEVBU0UqPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+ICAgCi0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9zcmM8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+c3JjPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgotIApkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMl8yL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1YjNhNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8yXzIvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NGUxYTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IKLUNvcHlyaWdodCAyMDA3LTIwMDkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sIGIvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ3YzgwZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGU8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4yLjI8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+Y29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuMjwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y2dsaWI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZ2xpYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMV8zPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODQ2M2U2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+DQotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMuc3RhcnR1cC5HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyDQotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OTNiZmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmI1NThhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcktpdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi0NCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZEludGVyY2VwdG9yOw0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuRW5oYW5jZXI7DQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RQcm94eTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxHZW5lcmljUmVuZGVyS2l0IGV4dGVuZHMgRXh0VmFsUmVuZGVyS2l0IGltcGxlbWVudHMgTWV0aG9kSW50ZXJjZXB0b3INCi17DQotICAgIHB1YmxpYyBzdGF0aWMgUmVuZGVyS2l0IG5ld0luc3RhbmNlKFJlbmRlcktpdCByZW5kZXJLaXQpDQotICAgIHsNCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IHJlbmRlcktpdC5nZXRDbGFzcygpOw0KLQ0KLSAgICAgICAgLy9pdCdzIG5vdCBwb3NzaWJsZSB0byB3cmFwIHRoZSBjb252ZXJ0ZXIgYWdhaW4gLSBvY2N1cnMgZS5nLiB1bmRlciBzb2xhcmlzICsgYmVhIHdlYmxvZ2ljDQotICAgICAgICBpZiAoY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRFbmhhbmNlckJ5Q0dMSUIkJCIpDQotICAgICAgICAgICAgfHwgY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRGYXN0Q2xhc3NCeUNHTElCJCQiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRW5oYW5jZXIgZW5oYW5jZXIgPSBuZXcgRW5oYW5jZXIoKTsNCi0gICAgICAgIGVuaGFuY2VyLnNldFN1cGVyY2xhc3MocmVuZGVyS2l0LmdldENsYXNzKCkpOw0KLSAgICAgICAgZW5oYW5jZXIuc2V0Q2FsbGJhY2sobmV3IEV4dFZhbEdlbmVyaWNSZW5kZXJLaXQocmVuZGVyS2l0KSk7DQotDQotICAgICAgICByZXR1cm4gKFJlbmRlcktpdCkgZW5oYW5jZXIuY3JlYXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBpbnRlcmNlcHQoT2JqZWN0IG9iaiwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncywgTWV0aG9kUHJveHkgcHJveHkpIHRocm93cyBUaHJvd2FibGUNCi0gICAgew0KLSAgICAgICAgaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldFJlbmRlcmVyIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFJlbmRlcmVyKChTdHJpbmcpYXJnc1swXSwgKFN0cmluZylhcmdzWzFdKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImFkZFJlbmRlcmVyIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkUmVuZGVyZXIoKFN0cmluZylhcmdzWzBdLCAoU3RyaW5nKWFyZ3NbMV0sIChSZW5kZXJlcilhcmdzWzJdKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJveHkuaW52b2tlU3VwZXIob2JqLCBhcmdzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBFeHRWYWxHZW5lcmljUmVuZGVyS2l0KFJlbmRlcktpdCB3cmFwcGVkKQ0KLSAgICB7DQotICAgICAgICBzdXBlcih3cmFwcGVkKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIGNyZWF0ZVdyYXBwZXIoUmVuZGVyZXIgcmVuZGVyZXIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLm5ld0luc3RhbmNlKHJlbmRlcmVyKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MGQ2MjIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlcldyYXBwZXI7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RJbnRlcmNlcHRvcjsKLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuRW5oYW5jZXI7Ci1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZFByb3h5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgZmluYWwgY2xhc3MgRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlciBleHRlbmRzIEV4dFZhbFJlbmRlcmVyV3JhcHBlciBpbXBsZW1lbnRzIE1ldGhvZEludGVyY2VwdG9yCi17Ci0gICAgcHVibGljIHN0YXRpYyBSZW5kZXJlciBuZXdJbnN0YW5jZShSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IHJlbmRlcmVyLmdldENsYXNzKCk7Ci0KLSAgICAgICAgLy90byBhdm9pZCByZS13cmFwcGluZyAtIG9jY3VycyBlLmcuIHVuZGVyIHNvbGFyaXMgKyBiZWEgd2VibG9naWMKLSAgICAgICAgaWYgKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkuY29udGFpbnMoIiQkRW5oYW5jZXJCeUNHTElCJCQiKSB8fAotICAgICAgICAgICAgY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRGYXN0Q2xhc3NCeUNHTElCJCQiKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgRW5oYW5jZXIgZW5oYW5jZXIgPSBuZXcgRW5oYW5jZXIoKTsKLSAgICAgICAgZW5oYW5jZXIuc2V0U3VwZXJjbGFzcyhyZW5kZXJlci5nZXRDbGFzcygpKTsKLSAgICAgICAgZW5oYW5jZXIuc2V0Q2FsbGJhY2sobmV3IEV4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIocmVuZGVyZXIpKTsKLQotICAgICAgICByZXR1cm4gKFJlbmRlcmVyKSBlbmhhbmNlci5jcmVhdGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGludGVyY2VwdChPYmplY3Qgb2JqLCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzLCBNZXRob2RQcm94eSBwcm94eSkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJnZXRDb252ZXJ0ZWRWYWx1ZSIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldENvbnZlcnRlZFZhbHVlKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0sIGFyZ3NbMl0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJkZWNvZGUiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlY29kZSgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZW5jb2RlQmVnaW4iKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZUJlZ2luKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJlbmNvZGVDaGlsZHJlbiIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlQ2hpbGRyZW4oKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImVuY29kZUVuZCIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlRW5kKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJjb252ZXJ0Q2xpZW50SWQiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29udmVydENsaWVudElkKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFN0cmluZylhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0UmVuZGVyc0NoaWxkcmVuIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRSZW5kZXJzQ2hpbGRyZW4oKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibWV0aG9kICIgKyBtZXRob2QuZ2V0TmFtZSgpICsgIiBjYWxsZWQgd2l0aG91dCByZW5kZXJpbmctaW50ZXJjZXB0b3JzIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBwcm94eS5pbnZva2VTdXBlcihvYmosIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyKFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgewotICAgICAgICBzdXBlcih3cmFwcGVkKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5MTdlNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5DQotew0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyS2l0IGNyZWF0ZVdyYXBwZXIoUmVuZGVyS2l0IHJlbmRlcktpdCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVya2l0IHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcktpdC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgdmlhIGNnbGliIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5uZXdJbnN0YW5jZShyZW5kZXJLaXQpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3N0YXJ0dXAvR2VuZXJpY01vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGM3YjQxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkFic3RyYWN0U3RhcnR1cExpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdC5HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBHZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jbGFzcykuYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkobmV3IEdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODkzYmZmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OWE4ZTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGUNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGUgcHJvdmlkZXMgZ2VuZXJpYyBTdXBwb3J0IGZvciBKU0YgY29tcG9uZW50IGZyYW1ld29ya3Mgd2hpY2ggaGF2ZSBzcGVjaWFsIHJlcXVpcmVtZW50cyAoZS5nLiBSaWNoRmFjZXMsIE15RmFjZXMgVG9iYWdvLCAuLi4pLg0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS4xLnggYW5kIEpTRiAxLjIueC4gQm90aCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvcG9tLnhtbCBiL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVjMjFiNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+Y29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBDb21wb25lbnQtU3VwcG9ydCBNb2R1bGVzPC9uYW1lPgotICAgIDx2ZXJzaW9uPjEuMi4yPC92ZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMi4yPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGFncy8xXzJfMjwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90YWdzLzFfMl8yPC91cmw+Ci0gICAgPC9zY20+Ci0KLSAgICA8bW9kdWxlcz4KLSAgICAgICAgPG1vZHVsZT50cmluaWRhZC1zdXBwb3J0PC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+Z2VuZXJpYy1zdXBwb3J0PC9tb2R1bGU+Ci0gICAgPC9tb2R1bGVzPgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8dHJpbmlkYWQudmVyc2lvbj4xLjIuOTwvdHJpbmlkYWQudmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwgYi9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MWU3NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgVHJpbmlkYWQgU3VwcG9ydCBNb2R1bGU8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4yLjI8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+Y29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuMjwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OGIyYmIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+DQotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0YXJ0dXAuVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXINCi0gICAgICAgIDwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLQ0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPg0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyDQotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg5M2JmZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTBlYjY4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5DbGllbnRWYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLS8qKg0KLSAqIGluIGNhc2Ugb2YgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBhIHRyaW5pZGFkIGNsaWVudCB2YWxpZGF0b3IgaXMgYWRkZWQgdG8gdGhlIGNvbXBvbmVudCBiYXNlZCBvbiB0aGUgbWV0YS1kYXRhLg0KLSAqIGF0IHRoZSBwb3N0YmFjazogdGhlIGV4dHZhbCB2YWxpZGF0aW9uIHN0cmF0ZWd5IGdldHMgY2FsbGVkIGFuZCBhZnRlciB0aGF0IHRoZSBhZGRlZCB2YWxpZGF0b3IuDQotICogdGhpcyB3cmFwcGVyIHByZXZlbnRzIHN1Y2ggYSBzZXJ2ZXItc2lkZSBkb3VibGUgdmFsaWRhdGlvbi4NCi0gKiBpdCBqdXN0IGRlbGVnYXRlcyB0aGUgY2xpZW50LXNpZGUgZnVuY3Rpb25hbGl0eS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlciBpbXBsZW1lbnRzIFZhbGlkYXRvciwgQ2xpZW50VmFsaWRhdG9yLCBTZXJpYWxpemFibGUNCi17DQotICAgIHByaXZhdGUgdHJhbnNpZW50IENsaWVudFZhbGlkYXRvciB3cmFwcGVkOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxNDE0NTQ3ODQxNzAwNjIxNDEwTDsNCi0NCi0gICAgcHVibGljIEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcihDbGllbnRWYWxpZGF0b3IgY2xpZW50VmFsaWRhdG9yKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSBjbGllbnRWYWxpZGF0b3I7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgdmFsaWRhdGUgLSB0aGUgZXh0dmFsIHZhbGlkYXRpb24gc3RyYXRlZ3kgd2lsbCBkbyB0aGF0DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRMaWJyYXJ5U291cmNlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudExpYnJhcnlTb3VyY2UoZmFjZXNDb250ZXh0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldENsaWVudEltcG9ydE5hbWVzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q2xpZW50SW1wb3J0TmFtZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFNjcmlwdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q2xpZW50U2NyaXB0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50VmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q2xpZW50VmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiYzE5NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0LkV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY3RvcnlGaW5kZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeTsNCi0NCi0vKioNCi0gKiB1c2UgdGhpcyBwaGFzZS1saXN0ZW5lciBpbnN0ZWFkIG9mIGEgRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBkdWUgdG8gYSB0cmluaWRhZCBpc3N1ZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lciBpbXBsZW1lbnRzIFBoYXNlTGlzdGVuZXINCi17DQotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIGlmKGV2ZW50LmdldFBoYXNlSWQoKSAhPSBQaGFzZUlkLkFQUExZX1JFUVVFU1RfVkFMVUVTICYmIGV2ZW50LmdldFBoYXNlSWQoKSAhPSBQaGFzZUlkLlJFTkRFUl9SRVNQT05TRSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgUmVuZGVyS2l0RmFjdG9yeSByZW5kZXJLaXRGYWN0b3J5ID0gKFJlbmRlcktpdEZhY3RvcnkpDQotICAgICAgICAgICAgRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEZhY3RvcnlGaW5kZXIuUkVOREVSX0tJVF9GQUNUT1JZKTsNCi0NCi0gICAgICAgIFN0cmluZyByZW5kZXJLaXRJZCA9IGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldFJlbmRlcktpdElkKCk7DQotDQotICAgICAgICBpZihFeHRWYWxUcmluaWRhZFJlbmRlcktpdC5JRC5lcXVhbHMocmVuZGVyS2l0SWQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFJlbmRlcktpdCByZW5kZXJLaXQgPSByZW5kZXJLaXRGYWN0b3J5LmdldFJlbmRlcktpdChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHJlbmRlcktpdElkKTsNCi0gICAgICAgIHJlbmRlcktpdEZhY3RvcnkuYWRkUmVuZGVyS2l0KEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LklELCBuZXcgRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQocmVuZGVyS2l0KSk7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5zZXRSZW5kZXJLaXRJZChFeHRWYWxUcmluaWRhZFJlbmRlcktpdC5JRCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLlJFTkRFUl9SRVNQT05TRTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMGNiNzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJlbid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIC8qDQotICAgICAqIGRlYWN0aXZhdGUNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9DTElFTlRfU0lERV9UUklOSURBRF9WQUxJREFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0NMSUVOVF9TSURFX1RSSU5JREFEX1ZBTElEQVRJT04iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX1RSSU5JREFEX0NPUkVfT1VUUFVUX0xBQkVMX0lOSVRJQUxJWkFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1RSSU5JREFEX0NPUkVfT1VUUFVUX0xBQkVMX0lOSVRJQUxJWkFUSU9OIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9UUklOSURBRF9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9UUklOSURBRF9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiIpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0RvdWJsZVJhbmdlSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvRG91YmxlUmFuZ2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjMyOWY2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvRG91YmxlUmFuZ2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkRvdWJsZVJhbmdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgRG91YmxlUmFuZ2VJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7Ci0gICAgICAgIERvdWJsZVJhbmdlVmFsaWRhdG9yIGRvdWJsZVJhbmdlVmFsaWRhdG9yID0gKERvdWJsZVJhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5Eb3VibGVSYW5nZSIpOwotCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbWluID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pOwotCi0gICAgICAgICAgICBpZihtaW4gaW5zdGFuY2VvZiBEb3VibGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bSgoRG91YmxlKW1pbik7Ci0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1heExlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYKTsKLQotICAgICAgICAgICAgaWYobWF4TGVuZ3RoIGluc3RhbmNlb2YgRG91YmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oKERvdWJsZSltYXhMZW5ndGgpOwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkICYmCi0gICAgICAgICAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3IgaW5zdGFuY2VvZiBDbGllbnRWYWxpZGF0b3IgJiYgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKWRvdWJsZVJhbmdlVmFsaWRhdG9yKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9MZW5ndGhJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9MZW5ndGhJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQxMjI1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkNsaWVudFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgTGVuZ3RoSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW5mb3JtYXRpb25BZGRlZCA9IGZhbHNlOwotICAgICAgICAvL1RPRE8KLSAgICAgICAgTGVuZ3RoVmFsaWRhdG9yIGxlbmd0aFZhbGlkYXRvciA9IChMZW5ndGhWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkxlbmd0aCIpOwotCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSCk7Ci0KLSAgICAgICAgICAgIGlmKG1pbiBpbnN0YW5jZW9mIEludGVnZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1pbmltdW0oKEludGVnZXIpbWluKTsKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1heExlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCk7Ci0KLSAgICAgICAgICAgIGlmKG1heExlbmd0aCBpbnN0YW5jZW9mIEludGVnZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRNYXhpbXVtTGVuZ3RoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludC5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1heGltdW0oKEludGVnZXIpbWF4TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vcmVJbml0VmFsaWRhdG9ycygoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCwgbWV0YURhdGEpOyAvL3NlYXJjaCB3cmFwcGVycyBhbmQgY2FsbCAuZGVhY3RpdmF0ZQotCi0gICAgICAgIGlmKGluZm9ybWF0aW9uQWRkZWQgJiYgbGVuZ3RoVmFsaWRhdG9yIGluc3RhbmNlb2YgQ2xpZW50VmFsaWRhdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpbGVuZ3RoVmFsaWRhdG9yKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIENvcmVPdXRwdXRMYWJlbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsZW5ndGhWYWxpZGF0b3IuZ2V0TWluaW11bSgpID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgoQ29yZU91dHB1dExhYmVsKXVpQ29tcG9uZW50KS5zZXRTaG93UmVxdWlyZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChDb3JlT3V0cHV0TGFiZWwpdWlDb21wb25lbnQpLnNldFNob3dSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Mb25nUmFuZ2VJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Mb25nUmFuZ2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWMzNGRlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTG9uZ1JhbmdlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5Mb25nUmFuZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5DbGllbnRWYWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBMb25nUmFuZ2VJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7Ci0gICAgICAgIExvbmdSYW5nZVZhbGlkYXRvciBsb25nUmFuZ2VWYWxpZGF0b3IgPSAoTG9uZ1JhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5Mb25nUmFuZ2UiKTsKLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKTsKLQotICAgICAgICAgICAgaWYobWluIGluc3RhbmNlb2YgTG9uZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bSgoTG9uZyltaW4pOwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCk7Ci0KLSAgICAgICAgICAgIGlmKG1heExlbmd0aCBpbnN0YW5jZW9mIExvbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oKExvbmcpbWF4TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKGluZm9ybWF0aW9uQWRkZWQgJiYKLSAgICAgICAgICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3IgaW5zdGFuY2VvZiBDbGllbnRWYWxpZGF0b3IgJiYgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpbG9uZ1JhbmdlVmFsaWRhdG9yKSk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9QYXR0ZXJuSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZjA4OGQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9QYXR0ZXJuSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5SZWdFeHBWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5DbGllbnRWYWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBQYXR0ZXJuSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCFtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIHBhdHRlcm5zID0gKFN0cmluZ1tdKW1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTik7Ci0KLSAgICAgICAgUmVnRXhwVmFsaWRhdG9yIHJlZ0V4cFZhbGlkYXRvcjsKLQotICAgICAgICBmb3IoU3RyaW5nIHBhdHRlcm4gOiBwYXR0ZXJucykKLSAgICAgICAgewotICAgICAgICAgICAgcmVnRXhwVmFsaWRhdG9yID0gKFJlZ0V4cFZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLlJlZ0V4cCIpOwotCi0gICAgICAgICAgICByZWdFeHBWYWxpZGF0b3Iuc2V0UGF0dGVybihwYXR0ZXJuKTsKLSAgICAgICAgICAgIHJlZ0V4cFZhbGlkYXRvci5zZXRNZXNzYWdlRGV0YWlsTm9NYXRjaCgoU3RyaW5nKW1ldGFEYXRhLmdldCgKLSAgICAgICAgICAgICAgICBDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTl9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UpKTsKLQotICAgICAgICAgICAgaWYocmVnRXhwVmFsaWRhdG9yIGluc3RhbmNlb2YgQ2xpZW50VmFsaWRhdG9yICYmIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIoKENsaWVudFZhbGlkYXRvcilyZWdFeHBWYWxpZGF0b3IpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1JlcXVpcmVkSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUmVxdWlyZWRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjNkMTM2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUmVxdWlyZWRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC51dGlsLlRyaW5pZGFkVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLm91dHB1dC5Db3JlT3V0cHV0TGFiZWw7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgUmVxdWlyZWRJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSB8fAotICAgICAgICAgICBtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCl8fAotICAgICAgICAgICBtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoKAotICAgICAgICAgICAgICAgICAoIUJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJgotICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKSkpIHx8Ci0gICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhpc0NvbXBvbmVudFJlcXVpcmVkKHVpQ29tcG9uZW50KSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkgJiYKLSAgICAgICAgICAgICAgICAgICAhQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgQ29yZU91dHB1dExhYmVsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChDb3JlT3V0cHV0TGFiZWwpdWlDb21wb25lbnQpLnNldFNob3dSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQm9vbGVhbiBpc0NvbXBvbmVudFJlcXVpcmVkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpQ29tcG9uZW50ID0gVHJpbmlkYWRVdGlscy5maW5kTGFiZWxlZEVkaXRhYmxlQ29tcG9uZW50KChDb3JlT3V0cHV0TGFiZWwpIHVpQ29tcG9uZW50KTsKLQotICAgICAgICAgICAgaWYodWlDb21wb25lbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vY29tcGFyZSB3aXRoIGZhbHNlIHNvIHRydWUgPSB0cnVlIG9yIG51bGwKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc1JlYWRPbmx5IikpKTsKLSAgICAgICAgYm9vbGVhbiBpc0Rpc2FibGVkID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc0Rpc2FibGVkIikpKTsKLQotICAgICAgICByZXR1cm4gIShpc1JlYWRPbmx5IHx8IGlzRGlzYWJsZWQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MzEwOGMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29udGV4dC5SZXF1ZXN0Q29udGV4dDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9URVhUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXRUZXh0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXREYXRlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8VHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcj4gY29tcG9uZW50SW5pdGlhbGl6ZXJzID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyPigpOwotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBSZXF1aXJlZEluaXRpYWxpemVyKCkpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBMZW5ndGhJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgTG9uZ1JhbmdlSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IERvdWJsZVJhbmdlSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFBhdHRlcm5Jbml0aWFsaXplcigpKTsKLSAgICAgICAgLy9jb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBWYWxpZGF0b3JJbml0aWFsaXplcigpKTsKLSAgICB9Ci0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkxPVywgZGVzY3JpcHRpb24gPSAiY2hlY2sgcHByIGlzc3VlIikKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBmb3IoVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplciA6IGNvbXBvbmVudEluaXRpYWxpemVycykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoY29tcG9uZW50SW5pdGlhbGl6ZXIuY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVwZGF0ZUNvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKSB8fAotICAgICAgICAgICAgICAgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFLmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmKFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmlzUGFydGlhbFJlcXVlc3QoZmFjZXNDb250ZXh0KSkKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuYWRkUGFydGlhbFRhcmdldCh1aUNvbXBvbmVudC5nZXRQYXJlbnQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTg4NzhjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVmFsaWRhdG9ySW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHZhbHVlID0gVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTE9XLCBkZXNjcmlwdGlvbiA9ICJpbXBsLiB0cmluaWRhZCBlLW1haWwgdmFsaWRhdG9yIikKLWNsYXNzIFZhbGlkYXRvckluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZighbWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLkNVU1RPTSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuQ1VTVE9NKTsKLQotICAgICAgICBpZighKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvcihPYmplY3QgY3VycmVudFZhbHVlIDogKExpc3QpdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCEoY3VycmVudFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoQ29tbW9uTWV0YURhdGFLZXlzLkVNQUlMLmVxdWFscyhjdXJyZW50VmFsdWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vVE9ETwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTY3Y2Y5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnV0aWwuVHJpbmlkYWRVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLm91dHB1dC5Db3JlT3V0cHV0TGFiZWw7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotcHVibGljIGNsYXNzIFRyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvciBleHRlbmRzIEFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcg0KLXsNCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpDQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmKGZpbHRlckNvcmVPdXRwdXRMYWJlbCh1aUNvbXBvbmVudCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdENvcmVPdXRwdXRMYWJlbChmYWNlc0NvbnRleHQsIChDb3JlT3V0cHV0TGFiZWwpdWlDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBmaWx0ZXJDb3JlT3V0cHV0TGFiZWwoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb3JlT3V0cHV0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgQ29yZU91dHB1dExhYmVsIGNvcmVPdXRwdXRMYWJlbCkNCi0gICAgew0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0NCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIGFubm90YXRpb25FeHRyYWN0b3IgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkuZ2V0RmFjdG9yeSgNCi0gICAgICAgICAgICBGYWN0b3J5TmFtZXMuQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmNsYXNzKS5jcmVhdGUoKTsNCi0NCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IFRyaW5pZGFkVXRpbHMuZmluZExhYmVsZWRFZGl0YWJsZUNvbXBvbmVudChjb3JlT3V0cHV0TGFiZWwpOw0KLQ0KLSAgICAgICAgaWYodGFyZ2V0Q29tcG9uZW50ID09IG51bGwgfHwgIWlzQ29tcG9uZW50RWRpdGFibGUodGFyZ2V0Q29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBCb29sZWFuIHNraXBJbml0aWFsaXphdGlvbiA9IGZhbHNlOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YTsNCi0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IGFubm90YXRpb25FeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHRhcmdldENvbXBvbmVudCkuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSBFeHRWYWxVdGlscy5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSk7DQotDQotICAgICAgICAgICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEgPSBtZXRhRGF0YVRyYW5zZm9ybWVyLmNvbnZlcnRNZXRhRGF0YShlbnRyeSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG51bGw7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYobWV0YURhdGEgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2V4ZWN1dGUgc2tpcCB2YWxpZGF0aW9uIHN0cmF0ZWd5IC0+IHNraXAgdmFsaWRhdGlvbiB5L24gaW4gZW50cnkNCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHRhcmdldENvbXBvbmVudCwgZW50cnksIG51bGwpOw0KLSAgICAgICAgICAgICAgICAgICAgc2tpcEluaXRpYWxpemF0aW9uID0gZW50cnkuZ2V0UHJvcGVydHkoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTiwgQm9vbGVhbi5jbGFzcyk7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZihCb29sZWFuLlRSVUUuZXF1YWxzKHNraXBJbml0aWFsaXphdGlvbikgJiYgIW1ldGFEYXRhLmlzRW1wdHkoKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmlzU2tpcGFibGVWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YS5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTiwgdHJ1ZSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYoIW1ldGFEYXRhLmlzRW1wdHkoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29uZmlndXJlQ29tcG9uZW50V2l0aE1ldGFEYXRhKGZhY2VzQ29udGV4dCwgY29yZU91dHB1dExhYmVsLCBtZXRhRGF0YSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcG9uZW50RWRpdGFibGUoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIC8vY29tcGFyZSB3aXRoIGZhbHNlIHNvIHRydWUgPSB0cnVlIG9yIG51bGwNCi0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzUmVhZE9ubHkiKSkpOw0KLSAgICAgICAgYm9vbGVhbiBpc0Rpc2FibGVkID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNEaXNhYmxlZCIpKSk7DQotDQotICAgICAgICByZXR1cm4gIShpc1JlYWRPbmx5IHx8IGlzRGlzYWJsZWQpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YzI2OTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuTGFiZWxlZE1lc3NhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb250ZXh0LlJlcXVlc3RDb250ZXh0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXRUZXh0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dERhdGUiOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmVmcmVzaENvbXBvbmVudCh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IGdldExhYmVsKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgICAgICBpZihsYWJlbCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbGFiZWwgPSB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvL292ZXJyaWRlIHRoZSBsYWJlbCBpZiB0aGUgYW5ub3RhdGlvbiBwcm92aWRlcyBhIGxhYmVsDQotICAgICAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsYWJlbCA9IG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwsIFN0cmluZy5jbGFzcyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIExhYmVsZWRNZXNzYWdlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgKChMYWJlbGVkTWVzc2FnZSlmYWNlc01lc3NhZ2UpLnNldExhYmVsVGV4dChsYWJlbCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vaWYgc29tZW9uZSB1c2VzIGEgbm9ybWFsIGZhY2VzIG1lc3NhZ2UNCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwoZmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVmcmVzaENvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYoUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuaXNQYXJ0aWFsUmVxdWVzdChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmFkZFBhcnRpYWxUYXJnZXQodWlDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKSB8fA0KLSAgICAgICAgICAgICAgIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURS5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldExhYmVsKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFN0cmluZylSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiZ2V0TGFiZWwiKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGI0NWU5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwucmVuZGVya2l0LlJlbmRlcktpdERlY29yYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwucmVuZGVya2l0LmNvcmUuQ29yZVJlbmRlcktpdDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVzcG9uc2VTdGF0ZU1hbmFnZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VXcml0ZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uV3JpdGVyOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZFJlbmRlcktpdCBleHRlbmRzIFJlbmRlcktpdERlY29yYXRvcg0KLXsNCi0gICAgcHJvdGVjdGVkIEV4dFZhbFJlbmRlcktpdCBleHRWYWxSZW5kZXJLaXQ7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIkVYVFZBTF9UUklOSURBRF9SRU5ERVJLSVQiOw0KLQ0KLSAgICBwdWJsaWMgRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQoUmVuZGVyS2l0IHdyYXBwZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZXh0VmFsUmVuZGVyS2l0ID0gbmV3IEV4dFZhbFJlbmRlcktpdCh3cmFwcGVkKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSwgUmVuZGVyZXIgcmVuZGVyZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCByZW5kZXJlcik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBSZW5kZXJlciBnZXRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5leHRWYWxSZW5kZXJLaXQuZ2V0UmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdGF0ZU1hbmFnZXIgZ2V0UmVzcG9uc2VTdGF0ZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5leHRWYWxSZW5kZXJLaXQuZ2V0UmVzcG9uc2VTdGF0ZU1hbmFnZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFJlc3BvbnNlV3JpdGVyIGNyZWF0ZVJlc3BvbnNlV3JpdGVyKFdyaXRlciB3cml0ZXIsIFN0cmluZyBzLCBTdHJpbmcgczEpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5jcmVhdGVSZXNwb25zZVdyaXRlcih3cml0ZXIsIHMsIHMxKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFJlc3BvbnNlU3RyZWFtIGNyZWF0ZVJlc3BvbnNlU3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5jcmVhdGVSZXNwb25zZVN0cmVhbShvdXRwdXRTdHJlYW0pOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVjb3JhdGVkUmVuZGVyS2l0SWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ29yZVJlbmRlcktpdC5CQVNFX1JFTkRFUl9LSVRfSUQ7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMjcwMWYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuY29yZS54aHRtbC50YWJsZS5UYWJsZVJlbmRlcmluZ0NvbnRleHQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBzb2x1dGlvbiBmb3IgdHJpbmlkYWQgdGFibGUgcmVuZGVyZXIgaXNzdWUgKGluIGNvbm5lY3Rpb24gd2l0aCBkb3VibGUgY2FsbCBwcmV2ZW50aW9uIHByb3hpZXMpDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eSBleHRlbmRzIEV4dFZhbFJlbmRlcmVyUHJveHkNCi17DQotICAgIHB1YmxpYyBFeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkoUmVuZGVyZXIgcmVuZGVyZXIpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKHJlbmRlcmVyKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcHRpb25hbEtleShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYoVGFibGVSZW5kZXJpbmdDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJ8IiArIFRhYmxlUmVuZGVyaW5nQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRSZW5kZXJTdGFnZSgpLmdldFN0YWdlKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gIiI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdGFydHVwL1RyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZGVjYjQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkFic3RyYWN0U3RhcnR1cExpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50LlRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC52YWxpZGF0aW9uLm1lc3NhZ2UuVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0LkV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yLlRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3IuVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogYWx0ZXJuYXRpdmUgYXBwcm9hY2ggZm9yIEV4dFZhbFJlbmRlcktpdEZhY3RvcnkNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyDQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgaW5pdFRyaW5pZGFkU3VwcG9ydCgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0VHJpbmlkYWRTdXBwb3J0KCkNCi0gICAgew0KLSAgICAgICAgLy9kZWFjdGl2YXRlIGRlZmF1bHQgYXBwcm9hY2gNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5SRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZLCBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmNsYXNzKS5kZWFjdGl2YXRlKCk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBkZWFjdGl2YXRlQ2xpZW50U2lkZVZhbGlkYXRpb24gPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DTElFTlRfU0lERV9UUklOSURBRF9WQUxJREFUSU9OOw0KLQ0KLSAgICAgICAgaWYoZGVhY3RpdmF0ZUNsaWVudFNpZGVWYWxpZGF0aW9uID09IG51bGwgfHwgIWRlYWN0aXZhdGVDbGllbnRTaWRlVmFsaWRhdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgZGVhY3RpdmF0ZUluaXRDb3JlT3V0cHV0TGFiZWwgPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9UUklOSURBRF9DT1JFX09VVFBVVF9MQUJFTF9JTklUSUFMSVpBVElPTjsNCi0NCi0gICAgICAgIGlmKGRlYWN0aXZhdGVJbml0Q29yZU91dHB1dExhYmVsID09IG51bGwgfHwgIWRlYWN0aXZhdGVJbml0Q29yZU91dHB1dExhYmVsLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFRyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvcigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBkZWFjdGl2YXRlVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgPQ0KLSAgICAgICAgICAgICAgICBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9UUklOSURBRF9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUjsNCi0NCi0gICAgICAgIGlmKGRlYWN0aXZhdGVUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA9PSBudWxsIHx8DQotICAgICAgICAgICAgICAgICFkZWFjdGl2YXRlVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcihuZXcgVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2RlYWN0aXZhdGUgZXh0dmFsIHJlbmRlcmVyIHByb3h5IC0gZHVlIHRvIGFuIGluY29tcGF0aWJpbGl0eSB3aXRoIHRoZSB0YWJsZSByZW5kZXJlcg0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZLCBFeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5TmFtZXMuRkFDRVNfTUVTU0FHRV9GQUNUT1JZLm5hbWUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBUcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIC8qDQotICAgICAgICAgKiBpZiB0aGVyZSBhcmUgZnVydGhlciBpbmNvbXBhdGlibGUgcmVuZGVyZXJzIHVzZSB0aGUgZm9sbG93aW5nIHF1aWNrLWZpeDoNCi0gICAgICAgICAqICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZLCBudWxsKTsNCi0gICAgICAgICAgIGF0dGVudGlvbjogaXQgY2F1c2VzIGRpcmVjdCBkZWxlZ2F0aW9uIHdpdGhvdXQgYSBjaGVjayBvZiBkb3VibGUgaW52b2NhdGlvbnMNCi0gICAgICAgICAqLw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC91dGlsL1RyaW5pZGFkVXRpbHMuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC91dGlsL1RyaW5pZGFkVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU3YWVlOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdXRpbC9UcmluaWRhZFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJjaGVjayBzdWJmb3JtIikNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRVdGlscw0KLXsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coVHJpbmlkYWRVdGlscy5jbGFzcyk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVUlDb21wb25lbnQgZmluZExhYmVsZWRFZGl0YWJsZUNvbXBvbmVudChDb3JlT3V0cHV0TGFiZWwgY29yZU91dHB1dExhYmVsKQ0KLSAgICB7DQotICAgICAgICAvL1RPRE8NCi0gICAgICAgIGlmKGNvcmVPdXRwdXRMYWJlbC5nZXRGb3IoKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFVJQ29tcG9uZW50IHJlc3VsdCA9IGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmZpbmRDb21wb25lbnQoY29yZU91dHB1dExhYmVsLmdldEZvcigpKTsNCi0NCi0gICAgICAgIGlmKHJlc3VsdCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKExPRy5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExPRy50cmFjZShjb3JlT3V0cHV0TGFiZWwuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSArICIgZG9lc24ndCByZWZlcmVuY2UgYW4gZWRpdGFibGUgY29tcG9uZW50Iik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNjMjFjYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnZhbGlkYXRpb24ubWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkRlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkgZXh0ZW5kcyBEZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzTGFiZWxlZEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlIGluc3RhbmNlb2YgVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgRmFjZXNNZXNzYWdlIGNyZWF0ZShGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZShzZXZlcml0eSwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZS5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAxYWExYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnZhbGlkYXRpb24ubWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnV0aWwuTGFiZWxlZEZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuTGFiZWxlZE1lc3NhZ2U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlIGV4dGVuZHMgTGFiZWxlZEZhY2VzTWVzc2FnZSBpbXBsZW1lbnRzIExhYmVsZWRNZXNzYWdlDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2MzU2ODAwNjg5OTYxNTA1MTU0TDsNCi0NCi0gICAgcHVibGljIFRyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZShTZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKHNldmVyaXR5LCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldExhYmVsQXNTdHJpbmcoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIGxhYmVsKQ0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRMYWJlbChsYWJlbCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODkzYmZmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNGJhOGEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgVHJpbmlkYWQgU3VwcG9ydCBNb2R1bGUNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgVHJpbmlkYWQgU3VwcG9ydCBNb2R1bGUgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZSBwcm92aWRlcyBzcGVjaWFsIFRyaW5pZGFkIFN1cHBvcnQgZm9yIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IuDQotICAgIEZ1cnRoZXJtb3JlLCBpdCBhbGxvd3MgdG8gam9pbiB0aGUgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBtZWNoYW5pc20gb2YgVHJpbmlkYWQuIFNhbXBsZSB1c2UtY2FzZTogYW5ub3RhdGUgeW91ciBtb2RlbCB3aXRoIEpQQSAxLjAgYW5ub3RhdGlvbnMsIGJpbmQgcHJvcGVydGllcyB0byBKU0YgSW5wdXQgY29tcG9uZW50cyBhbmQgZ2V0IGF1dG9tYXRpYyBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIGp1c3QgYnkgYWRkaW5nIDMgSkFSIGZpbGVzIChNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUsIFByb3BlcnR5IFZhbGlkYXRpb24gYW5kIFRyaW5pZGFkIFN1cHBvcnQpLg0KLSAgDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLjEueCBhbmQgSlNGIDEuMi54LiBCb3RoIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvcG9tLnhtbCBiL3ByZXBhcmUvMV8yXzIvY29yZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTIzNGI0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMi4yPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBDb3JlPC9uYW1lPgotICAgIDx2ZXJzaW9uPjEuMi4yPC92ZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90YWdzLzFfMl8yPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzI8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RhZ3MvMV8yXzI8L3VybD4KLSAgICA8L3NjbT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkNGRjNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4NCi0gICAgPGZhY3Rvcnk+DQotICAgICAgICA8cmVuZGVyLWtpdC1mYWN0b3J5Pm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXRGYWN0b3J5PC9yZW5kZXIta2l0LWZhY3Rvcnk+DQotICAgIDwvZmFjdG9yeT4NCi0NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkV4dFZhbFN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODkzYmZmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2Q1ZDFjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotDQotLyoqDQotICogZG9udCd0IG1vdmUgdG8gYW4gb3RoZXIgcGFja2FnZSEhIQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIEV4dFZhbEluZm9ybWF0aW9uDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FID0gRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJYTUxfUEFSQU1fUFJFRklYID0gRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gQ2xhc3NVdGlscy5nZXRKYXJWZXJzaW9uKEV4dFZhbEluZm9ybWF0aW9uLmNsYXNzKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ3VzdG9tSW5mb3JtYXRpb24uamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0N1c3RvbUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxOTBjZTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ3VzdG9tSW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkNCi1wdWJsaWMgZW51bSBDdXN0b21JbmZvcm1hdGlvbg0KLXsNCi0gICAgQkFTRV9QQUNLQUdFLA0KLSAgICBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiwNCi0NCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYLA0KLSAgICBWQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWCwNCi0gICAgTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVgsDQotDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfVE9fTVNHX1JFU09MVkVSX05BTUVfTUFQUEVSLA0KLSAgICBNRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUiwNCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIsDQotDQotICAgIFNUQVJUVVBfTElTVEVORVIsDQotICAgIENPTVBPTkVOVF9JTklUSUFMSVpFUiwNCi0gICAgVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IsDQotICAgIE1FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SLA0KLQ0KLSAgICBNRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwNCi0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwNCi0gICAgTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksDQotICAgIEZBQ0VTX01FU1NBR0VfRkFDVE9SWSwNCi0NCi0gICAgTUVTU0FHRV9CVU5ETEVfTkFNRSwNCi0gICAgU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHQuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUxMGYwNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlJlbmRlcmVySW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5RmluZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRGVmYXVsdEZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBFeHRWYWxDb250ZXh0Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBFeHRWYWxDb250ZXh0IGV4dFZhbENvbnRleHQgPSBuZXcgRXh0VmFsQ29udGV4dCgpOwotCi0gICAgcHJpdmF0ZSBGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIgPSBEZWZhdWx0RmFjdG9yeUZpbmRlci5nZXRJbnN0YW5jZSgpOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUmVuZGVyZXJJbnRlcmNlcHRvcj4gcmVuZGVyZXJJbnRlcmNlcHRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlbmRlcmVySW50ZXJjZXB0b3I+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZGVuaWVkSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI+IHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyPigpOwotCi0gICAgcHJpdmF0ZSBMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPiBjb21wb25lbnRJbml0aWFsaXplcnM7Ci0gICAgcHJpdmF0ZSBMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4gdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yczsKLSAgICBwcml2YXRlIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yczsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBnbG9iYWxQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLSAgICBwcml2YXRlIE1hcDxTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMsIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+PiBzdGF0aWNDb25maWdNYXAKLSAgICAgICAgPSBuZXcgSGFzaE1hcDxTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMsIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+PigpOwotCi0KLSAgICBwcml2YXRlIHZvaWQgbGF6eUluaXRDb21wb25lbnRJbml0aWFsaXplcnMoKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMgPSBuZXcgQXJyYXlMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPigpOwotICAgICAgICBMaXN0PFN0cmluZz4gY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcwotICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9JTklUSUFMSVpFUik7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcwotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfSU5JVElBTElaRVIpKTsKLQotICAgICAgICBDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplcjsKLSAgICAgICAgZm9yIChTdHJpbmcgY29tcG9uZW50SW5pdGlhbGl6ZXJOYW1lIDogY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb21wb25lbnRJbml0aWFsaXplciA9Ci0gICAgICAgICAgICAgICAgKENvbXBvbmVudEluaXRpYWxpemVyKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY29tcG9uZW50SW5pdGlhbGl6ZXJOYW1lKTsKLQotICAgICAgICAgICAgaWYgKGNvbXBvbmVudEluaXRpYWxpemVyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChjb21wb25lbnRJbml0aWFsaXplcik7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShjb21wb25lbnRJbml0aWFsaXplci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbGF6eUluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMudmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMgPSBuZXcgQXJyYXlMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4oKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IpOwotICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KAotICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUikpOwotCi0gICAgICAgIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7Ci0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUgOiB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgPQotICAgICAgICAgICAgICAgIChWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzLmFkZCh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsYXp5SW5pdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBpZih0aGlzLm1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLm1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+KCk7Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SKTsKLSAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KAotICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUikpOwotCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOwotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lIDogbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciA9Ci0gICAgICAgICAgICAgICAgKE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUpOwotCi0gICAgICAgICAgICBpZiAobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5hZGQobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFeHRWYWxDb250ZXh0IGdldENvbnRleHQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGV4dFZhbENvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIEZhY3RvcnlGaW5kZXIgZ2V0RmFjdG9yeUZpbmRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gZmFjdG9yeUZpbmRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGYWN0b3J5RmluZGVyKEZhY3RvcnlGaW5kZXIgZmFjdG9yeUZpbmRlcikKLSAgICB7Ci0gICAgICAgIGlmKGZhY3RvcnlGaW5kZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5mYWN0b3J5RmluZGVyID0gZmFjdG9yeUZpbmRlcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFJlbmRlcmVySW50ZXJjZXB0b3I+IGdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFJlbmRlcmVySW50ZXJjZXB0b3I+KHJlbmRlcmVySW50ZXJjZXB0b3JzLnZhbHVlcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChFeHRWYWxDb250ZXh0LmNsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVuaWVkSW50ZXJjZXB0b3JzLmNvbnRhaW5zKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3JzLnB1dChyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSwgcmVuZGVyZXJJbnRlcmNlcHRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVyZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IoQ2xhc3MgcmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yID0KLSAgICAgICAgICAgIChSZW5kZXJlckludGVyY2VwdG9yKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzcyhyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoRXh0VmFsQ29udGV4dC5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvcnMucmVtb3ZlKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vaWYgYW4gaW50ZXJjZXB0b3IgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZCBzbyBmYXIsIGl0IHNob3VsZCBiZSBkZW5pZWQgYXQgZnV0dXJlIHJlZ2lzdHJhdGlvbnMKLSAgICBwdWJsaWMgdm9pZCBkZW55UmVuZGVyZXJJbnRlcmNlcHRvcihDbGFzcyByZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpCi0gICAgewotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgPQotICAgICAgICAgICAgKFJlbmRlcmVySW50ZXJjZXB0b3IpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcyk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChFeHRWYWxDb250ZXh0LmNsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZW5pZWRJbnRlcmNlcHRvcnMuYWRkKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKTsKLSAgICAgICAgfQotICAgICAgICBkZXJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvbXBvbmVudEluaXRpYWxpemVyKENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyKQotICAgIHsKLSAgICAgICAgbGF6eUluaXRDb21wb25lbnRJbml0aWFsaXplcnMoKTsKLSAgICAgICAgdGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMuYWRkKGNvbXBvbmVudEluaXRpYWxpemVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4gZ2V0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCkKLSAgICB7Ci0gICAgICAgIGxhenlJbml0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7Ci0gICAgICAgIHJldHVybiBjb21wb25lbnRJbml0aWFsaXplcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBsYXp5SW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgdGhpcy52YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzLmFkZCh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4gZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBsYXp5SW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBsYXp5SW5pdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMuYWRkKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGxhenlJbml0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHJldHVybiBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcj4gZ2V0UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciBwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycy5hZGQocHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICB7Ci0gICAgICAgIE1hcCBhcHBsaWNhdGlvbk1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbk1hcCgpOwotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBiZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBhcHBsaWNhdGlvbk1hcC5nZXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FKTsKLQotICAgICAgICBpZiAoYmVhbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW5pdEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKGFwcGxpY2F0aW9uTWFwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmVhbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGluaXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbihNYXAgYXBwbGljYXRpb25NYXApCi0gICAgewotICAgICAgICBMaXN0PFN0cmluZz4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4pOwotICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMuYWRkKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkNVU1RPTV9CRUFOKTsKLQotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbjsKLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChpbmZvcm1hdGlvblByb3ZpZGVyQmVhbiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uTWFwLnB1dChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUsIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnlUb0luaXRDdXN0b21Db25maWd1cmVkSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWUoYXBwbGljYXRpb25NYXApOwotCi0gICAgICAgIGlmKGFwcGxpY2F0aW9uTWFwLmNvbnRhaW5zS2V5KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4pYXBwbGljYXRpb25NYXAuZ2V0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0luaXRDdXN0b21Db25maWd1cmVkSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWUoTWFwIGFwcGxpY2F0aW9uTWFwKQotICAgIHsKLSAgICAgICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gYmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKQotICAgICAgICAgICAgLmdldEJlYW4oSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQ1VTVE9NX0JFQU4ucmVwbGFjZSgiLiIsICJfIikpOwotCi0gICAgICAgIGlmKGJlYW4gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYXBwbGljYXRpb25NYXAucHV0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSwgYmVhbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gZ2V0U3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmKCF0aGlzLnN0YXRpY0NvbmZpZ01hcC5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gc3RhdGljQ29uZmlnTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgICAgICB0aGlzLnN0YXRpY0NvbmZpZ01hcC5wdXQobmFtZSwgc3RhdGljQ29uZmlnTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGljQ29uZmlnTWFwLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcyBuYW1lLCBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IHN0YXRpY0NvbmZpZ0xpc3Q7Ci0gICAgICAgICAgICBpZighdGhpcy5zdGF0aWNDb25maWdNYXAuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5zdGF0aWNDb25maWdNYXAucHV0KG5hbWUsIHN0YXRpY0NvbmZpZ0xpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5zdGF0aWNDb25maWdNYXAuZ2V0KG5hbWUpLmFkZChzdGF0aWNDb25maWcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYWRkR2xvYmFsUHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhZGRHbG9iYWxQcm9wZXJ0eShuYW1lICwgdmFsdWUsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gZm9yY2VPdmVycmlkZSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMuZ2xvYmFsUHJvcGVydGllcy5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIWZvcmNlT3ZlcnJpZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJvdmVycmlkZSBnbG9iYWwgcHJvcGVydHkgJyIgKyBuYW1lICsgIiciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmdsb2JhbFByb3BlcnRpZXMucHV0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRHbG9iYWxQcm9wZXJ0eShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmdsb2JhbFByb3BlcnRpZXMuZ2V0KG5hbWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGVmYTZhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJlbid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKiArIHNvbWUgb2YgdGhlbSBjYW4gYmUgY3VzdG9taXplZCB3aXRoaW4gYSBjdXN0b20gaW1wbC4gb2YgdGhlIGJlYW4NCi0gKiAoZXh0ZW5kIHRoaXMgY2xhc3MgYW5kIHByb3ZpZGUgaXQgdmlhIGNvbnZlbnRpb24gb3Igd2ViLnhtbCkNCi0gKiA8cC8+DQotICogdGhlIHN0YXRpYyBhcGkgc2hvdWxkIG9ubHkgYmUgdXNlZA0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUFOX05BTUUgPSBFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRQ0KLSAgICAgICAgKyAiLiIgKyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7DQotICAgIC8vY3VzdG9tIGNsYXNzIHdoaWNoIGlzIGFuIG9wdGlvbmFsIHJlcGxhY2VtZW50IGZvciB0aGlzIGNsYXNzIChoYXMgdG8gZXh0ZW5kIHRoaXMgY2xhc3MpDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CRUFOID0gKEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FDQotICAgICAgICArICIuY3VzdG9tLiIgKyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOw0KLQ0KLSAgICBwdWJsaWMgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc2V0dXBDdXN0b21pemFibGVJbmZvcm1hdGlvbigpOw0KLSAgICAgICAgYXBwbHlDdXN0b21WYWx1ZXModGhpcy5jdXN0b21pemFibGVJbmZvcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8Q3VzdG9tSW5mb3JtYXRpb24sIFN0cmluZz4gY3VzdG9taXphYmxlSW5mb3MgPSBuZXcgSGFzaE1hcDxDdXN0b21JbmZvcm1hdGlvbiwgU3RyaW5nPigpOw0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBDdXN0b21pemFibGVJbmZvcm1hdGlvbigpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBiYXNlUGFja2FnZSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fQkFTRV9QQUNLQUdFOw0KLQ0KLSAgICAgICAgaWYgKGJhc2VQYWNrYWdlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZVBhY2thZ2UgPSBFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSArICIuY3VzdG9tLiI7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWJhc2VQYWNrYWdlLmVuZHNXaXRoKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZVBhY2thZ2UgPSBiYXNlUGFja2FnZSArICIuIjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5CQVNFX1BBQ0tBR0UsIGJhc2VQYWNrYWdlKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiwNCi0gICAgICAgICAgICAgICAgIkNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVgsDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVRyYW5zZm9ybWVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFX1JFU09MVkVSX1BPU1RGSVgsDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfSU5JVElBTElaRVIsDQotICAgICAgICAgICAgICAgICJDb21wb25lbnRJbml0aWFsaXplciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IsDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTVNHX1JFU09MVkVSX05BTUVfTUFQUEVSLA0KLSAgICAgICAgICAgICJWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSLA0KLSAgICAgICAgICAgICJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSLA0KLSAgICAgICAgICAgICJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBUlRVUF9MSVNURU5FUiwNCi0gICAgICAgICAgICAgICAgIlN0YXJ0dXBMaXN0ZW5lciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIk1lc3NhZ2VSZXNvbHZlckZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIkNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJGYWNlc01lc3NhZ2VGYWN0b3J5Iik7DQotDQotICAgICAgICAvL2NvbnZlbnRpb25zICh0aGUgcmVzdCBvZiB0aGUgY29udmVudGlvbnMgYXJlIGJ1aWx0IHdpdGggdGhlIGhlbHAgb2YgbmFtZSBtYXBwZXJzLC4uLg0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FU1NBR0VfQlVORExFX05BTUUsDQotICAgICAgICAgICAgICAgICJ2YWxpZGF0aW9uX21lc3NhZ2VzIik7DQotICAgICAgICAvL3N0YXRpYyBzdHJhdGVneSBtYXBwaW5ncyAobmFtZSBvZiBwcm9wZXJ0eSBmaWxlcykNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5TVEFUSUNfU1RSQVRFR1lfTUFQUElOR19TT1VSQ0UsDQotICAgICAgICAgICAgICAgICJzdHJhdGVneV9tYXBwaW5ncyIpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGFwcGx5Q3VzdG9tVmFsdWVzKE1hcDxDdXN0b21JbmZvcm1hdGlvbiwgU3RyaW5nPiBtYXApDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgdG8gY3VzdG9taXplIGluZm9ybWF0aW9uDQotICAgIH0NCi0NCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXQoQ3VzdG9tSW5mb3JtYXRpb24gY3VzdG9tSW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGN1c3RvbWl6YWJsZUluZm9zLmdldChjdXN0b21JbmZvcm1hdGlvbik7DQotDQotICAgICAgICBzd2l0Y2ggKGN1c3RvbUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNhc2UgQkFTRV9QQUNLQUdFOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgKiBwb3N0Zml4IHVzZWQgYnkgdGhlIFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi0gICAgICAgICAgICAgKiB0aGUgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBpcyBmb3IgY3VzdG9tIHN0cmF0ZWdpZXMgb25seQ0KLSAgICAgICAgICAgICAqIChub3QgZm9yIHB1YmxpYyB2YWxpZGF0aW9uIG1vZHVsZXMpDQotICAgICAgICAgICAgICogc28gaXQncyBmaW5lIHRvIGN1c3RvbWl6ZSBpdA0KLSAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgY2FzZSBWQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVg6DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0NCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9taXphYmxlSW5mb3MuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkJBU0VfUEFDS0FHRSkgKyB2YWx1ZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5Zjg2OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2R1bGVNZXNzYWdlQnVuZGxlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuZXdQYWNrYWdlTmFtZTsNCi0gICAgICAgIGlmIChwYWNrYWdlTmFtZS5lbmRzV2l0aCgiLnJlc29sdmVyIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgbmV3UGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZS5yZXBsYWNlKCIucmVzb2x2ZXIiLCAiLmJ1bmRsZSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5ld1BhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUucmVwbGFjZSgiLnJlc29sdmVyLiIsICIuYnVuZGxlLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG5ld1BhY2thZ2VOYW1lICsgIi52YWxpZGF0aW9uX21lc3NhZ2VzIjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKA0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsICIubWVzc2FnZS5yZXNvbHZlci4iLCB0YXJnZXRDbGFzc05hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoDQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgU3RyaW5nIHRhcmdldENsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgIi5tZXRhZGF0YS50cmFuc2Zvcm1lci4iLCB0YXJnZXRDbGFzc05hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UGFja2FnZU5hbWUsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXROYW1lKCk7DQotDQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUucmVwbGFjZSgiLnN0cmF0ZWd5LiIsIHRhcmdldFBhY2thZ2VOYW1lKTsNCi0NCi0gICAgICAgIGlmICh0YXJnZXRDbGFzc05hbWUgPT0gbnVsbCB8fCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSkgKyAiLiIgKyB0YXJnZXRDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHVzZSBhIGN1c3RvbSBuYW1lIG1hcHBlciB0byBpbXBsZW1lbnQgY3VzdG9tIGNvbnZlbnRpb25zDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgIlZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB1c2UgYSBjdXN0b20gbmFtZSBtYXBwZXIgdG8gaW1wbGVtZW50IGN1c3RvbSBjb252ZW50aW9ucw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5LnJlcGxhY2UoIi5hbm5vdGF0aW9uLiIsICIuc3RyYXRlZ3kuIikgKyAiU3RyYXRlZ3kiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgIk1ldGFEYXRhVHJhbnNmb3JtZXIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0YXJnZXRQb3N0Zml4KQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5lbmRzV2l0aCgiVmFsaWRhdGlvblN0cmF0ZWd5IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneU5hbWUuc3Vic3RyaW5nKDAsIHZhbGlkYXRpb25TdHJhdGVneU5hbWUubGVuZ3RoKCkgLSAxOCkgKyB0YXJnZXRQb3N0Zml4Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5lbmRzV2l0aCgiU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5zdWJzdHJpbmcoMCwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5sZW5ndGgoKSAtIDgpICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGZhYWJlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJlbid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIC8qDQotICAgICAqIG1pc2MNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FU1NBR0VfQlVORExFID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVTU0FHRV9CVU5ETEUiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQkFTRV9QQUNLQUdFID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQkFTRV9QQUNLQUdFIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9JTkZPUk1BVElPTl9QUk9WSURFUl9CRUFOIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OX1NUUkFURUdZX01BUFBJTkciKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUiIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBuYW1lIG1hcHBlcg0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUiIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBmYWN0b3JpZXMNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9GQUNFU19NRVNTQUdFX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9GQUNFU19NRVNTQUdFX0ZBQ1RPUlkiKTsNCi0NCi0gICAgLyoNCi0gICAgICogZGVhY3RpdmF0ZQ0KLSAgICAgKi8NCi0gICAgQERlcHJlY2F0ZWQNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX1JFTkRFUktJVCA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9SRU5ERVJLSVQiKTsNCi0NCi0gICAgLy9jdXJyZW50bHkganVzdCB1c2VkIGJ5IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfREVGQVVMVF9DT05WRU5USU9OIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9ERUZBVUxUX05BTUVfTUFQUEVSUyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9ERUZBVUxUX05BTUVfTUFQUEVSUyIpOw0KLSAgICANCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0VMX1JFU09MVkVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0VMX1JFU09MVkVSIik7DQotDQotICAgIC8vdGhlcmUgaXMgbm90aGluZyBsaWtlIERFQUNUSVZBVEVfREVGQVVMVF9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SDQotICAgIC8vdXNlIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmRlbnlSZW5kZXJlckludGVyY2VwdG9yKC4uLikgd2l0aGluIGFuIGV4dHZhbC1TdGFydHVwTGlzdGVuZXINCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0Fic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNDNmMjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBkZXRhaWxzDQotICogQHNlZSBEZWZhdWx0RUxIZWxwZXINCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5IGN1c3RvbUVMSGVscGVyRmFjdG9yeTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21FTEhlbHBlckZhY3RvcnkoQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkgZWxIZWxwZXJGYWN0b3J5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmN1c3RvbUVMSGVscGVyRmFjdG9yeSA9IGVsSGVscGVyRmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgZmluYWwgRUxIZWxwZXIgY3JlYXRlKCkNCi0gICAgew0KLSAgICAgICAgRUxIZWxwZXIgcmVzdWx0ID0gbnVsbDsNCi0NCi0gICAgICAgIGlmKHRoaXMuY3VzdG9tRUxIZWxwZXJGYWN0b3J5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5jdXN0b21FTEhlbHBlckZhY3RvcnkuY3JlYXRlRUxIZWxwZXIoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVFTEhlbHBlcigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRUxIZWxwZXIgY3JlYXRlRUxIZWxwZXIoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE0ZWUxYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsNCi1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7DQotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBpbiBvcmRlciB0byBjZW50cmFsaXplIHRoZSBqc2YgdmVyc2lvbiBkZXBlbmRlbmN5IHdpdGhpbiB0aGUgY29yZQ0KLSAqDQotICogdGhpcyBlbC1oZWxwZXIgc3VwcG9ydHMganNwIGFuZCBmYWNlbGV0cyAodGVzdGVkIHdpdGggMS4xLjE0KQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotLyoNCi0gKiB0aGVyZSBpcyBhIHNwZWNpYWwgZmFjZWxldHMgd29ya2Fyb3VuZCBmb3IgZWwtZXhwcmVzc2lvbnMgb2YgY3VzdG9tIGNvbXBvbmVudHMNCi0gKiBpdCdzIHBsdWdnYWJsZSBpbiBvcmRlciB0byBzdXBwb3J0IHNwZWNpYWwgbWVjaGFuaXNtcyBvZiBkaWZmZXJlbnQgdGVjaG5vbG9naWVzICh0aGFuIGpzcCBhbmQgZmFjZWxldHMpDQotICogc28geW91IGNhbiBwbHVnIGluIHlvdXIgb3duIGltcGwuIHdoaWNoIGltcGxlbWVudHMgYSBjdXN0b20gd29ya2Fyb3VuZCAobGlrZSB0aGUgZmFjZWxldHMgd29ya2Fyb3VuZCBvZiB0aGlzIGltcGwuKQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRFTEhlbHBlciBpbXBsZW1lbnRzIEVMSGVscGVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9FTF9SRVNPTFZFUiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0VMX1JFU09MVkVSOw0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdEVMSGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIC8vZHVlIHRvIGEgcmVzdHJpY3Rpb24gd2l0aCB0aGUgcmkNCi0gICAgICAgIE9iamVjdCBiZWFuID0gZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIHJldHVybiAoYmVhbiAhPSBudWxsKSA/IGJlYW4uZ2V0Q2xhc3MoKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRCZWFuKFN0cmluZyBiZWFuTmFtZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIHJldHVybiBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5nZXRFTFJlc29sdmVyKCkuZ2V0VmFsdWUoZmFjZXNDb250ZXh0LmdldEVMQ29udGV4dCgpLCBudWxsLCBiZWFuTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uICE9IG51bGwpID8gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZXZhbHVhdGVFeHByZXNzaW9uR2V0KA0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksIE9iamVjdC5jbGFzcykgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmV2YWx1YXRlRXhwcmVzc2lvbkdldChmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIE9iamVjdC5jbGFzcyk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQsIGJvb2xlYW4gYWxsb3dCbGFua0NoYXJhY3RlcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIC8vZm9yIGlucHV0IGNvbXBvbmVudHMgd2l0aG91dCB2YWx1ZS1iaW5kaW5nDQotICAgICAgICAvLyhlLmcuIGZvciBzcGVjaWFsIGNvbXBvbmVudCBsaWJzIC0+IGlzc3VlIHdpdGggRXh0VmFsUmVuZGVyZXJXcmFwcGVyI2VuY29kZUJlZ2luKQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudC5nZXRDbGFzcygpICsgIiBoYXMgbm8gdmFsdWUgYmluZGluZyAtIGNvbXBvbmVudCBpZDogIiArIHVpQ29tcG9uZW50LmdldElkKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKCFhbGxvd0JsYW5rQ2hhcmFjdGVycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlKCIgIiwgIiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pLmdldEJhc2VFeHByZXNzaW9uKCkpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXN1bHQgPSBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuDQotICAgICAgICAgICAgICAgIHRyeVRvQ3JlYXRlVmFsdWVCaW5kaW5nRm9yRmFjZWxldHNCaW5kaW5nKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCByZXNvbHZlIGV4cHJlc3Npb246ICIgKyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgIC5nZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgcmVzdWx0LmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLQ0KLSAgICAgICAgICAgIGlmKGVudGl0eUNsYXNzID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgcmVzb2x2ZSBleHByZXNzaW9uOiAiICsgcmVzdWx0LmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYoInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoREVBQ1RJVkFURV9FTF9SRVNPTFZFUikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5RGV0YWlsc1ZpYVJlZmxlY3Rpb25GYWxsYmFjayh1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgRXh0VmFsRUxSZXNvbHZlciBlbFJlc29sdmVyID0gbmV3IEV4dFZhbEVMUmVzb2x2ZXIoZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZ2V0RUxSZXNvbHZlcigpKTsNCi0gICAgICAgIEVMQ29udGV4dCBlbENvbnRleHQgPSBFeHRWYWxFTFJlc29sdmVyLmNyZWF0ZUNvbnRleHRXcmFwcGVyKGZhY2VzQ29udGV4dC5nZXRFTENvbnRleHQoKSwgZWxSZXNvbHZlcik7DQotDQotICAgICAgICBWYWx1ZUV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uID0gdWlDb21wb25lbnQuZ2V0VmFsdWVFeHByZXNzaW9uKCJ2YWx1ZSIpOw0KLQ0KLSAgICAgICAgaWYodmFsdWVFeHByZXNzaW9uID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWx1ZUV4cHJlc3Npb24uc2V0VmFsdWUoZWxDb250ZXh0LCBudWxsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAiZXJyb3IgYXQgYmluZGluZzogIiArIHZhbHVlRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkgKw0KLSAgICAgICAgICAgICAgICAiIC0tIGFuIGVsLXJlc29sdmVyIGVycm9yIG9jY3VycmVkISBtYXliZSB5b3UgdXNlZCBhbiBpbnZhbGlkIGJpbmRpbmcuIG90aGVyd2lzZTogIiArDQotICAgICAgICAgICAgICAgICJwbGVhc2UgcmVwb3J0IHRoZSBpc3N1ZSwgZGVhY3RpdmF0ZSB0aGUgZWwtcmVzb3ZsZXIgb2YgZXh0dmFsIHZpYSB3ZWIueG1sIGNvbnRleHQtcGFyYW06ICIgKw0KLSAgICAgICAgICAgICAgICBFeHRWYWxJbmZvcm1hdGlvbi5XRUJYTUxfUEFSQU1fUFJFRklYICsgIi5ERUFDVElWQVRFX0VMX1JFU09MVkVSIiArDQotICAgICAgICAgICAgICAgICIgYW5kIHRlc3QgYWdhaW4uIiwgdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihlbFJlc29sdmVyLmdldFBhdGgoKSA9PSBudWxsIHx8IGVsUmVzb2x2ZXIuZ2V0QmFzZU9iamVjdCgpID09IG51bGwgfHwgZWxSZXNvbHZlci5nZXRQcm9wZXJ0eSgpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscyhlbFJlc29sdmVyLmdldFBhdGgoKSwgZWxSZXNvbHZlci5nZXRCYXNlT2JqZWN0KCksIGVsUmVzb2x2ZXIuZ2V0UHJvcGVydHkoKSk7DQotICAgIH0NCi0NCi0gICAgLy9rZWVwIGluIHN5bmMgd2l0aCBEZWZhdWx0RUxIZWxwZXIjZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcgb2YgYnJhbmNoISEhDQotICAgIHByaXZhdGUgUHJvcGVydHlEZXRhaWxzIGdldFByb3BlcnR5RGV0YWlsc1ZpYVJlZmxlY3Rpb25GYWxsYmFjayhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IGdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24odWlDb21wb25lbnQsIGZhbHNlKTsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24gPQ0KLSAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0NCi0gICAgICAgIFN0cmluZyBwYXRoID0gbnVsbDsNCi0NCi0gICAgICAgIHdoaWxlKGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihwYXRoID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwYXRoID0gZ2V0UHJvcGVydHlOYW1lKGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcGF0aCA9IGdldFByb3BlcnR5TmFtZShjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbikgKyAiLiIgKyBwYXRoOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBwYXRoID0gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSArICIuIiArIHBhdGg7DQotDQotICAgICAgICBPYmplY3QgYmFzZU9iamVjdCA9IGdldFZhbHVlT2ZFeHByZXNzaW9uKGZhY2VzQ29udGV4dCwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpKTsNCi0NCi0gICAgICAgIC8vaW4gY2FzZSBvZiBlLmcuOiAje2JlYW5bYmVhbi5wYXNzd29yZFJlcGVhdGVkUHJvcGVydHlOYW1lXX0NCi0gICAgICAgIC8vLT4gYmVhbi5wYXNzd29yZFJlcGVhdGVkUHJvcGVydHlOYW1lIGlzIG5vdCB0aGUgZmluYWwgcHJvcGVydHkgbmFtZQ0KLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURldGFpbHMocGF0aCwgYmFzZU9iamVjdCwgZ2V0UHJvcGVydHlOYW1lKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpOw0KLQ0KLSAgICAgICAgaWYocHJvcGVydHlOYW1lLmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gZXh0cmFjdFByb3BlcnR5TmFtZU9mUHJvcGVydHlQYXRoKHByb3BlcnR5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcHJvcGVydHlOYW1lOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJzdXBwb3J0IGZvciBtb3JlIGR5bmFtaWMgYmluZGluZ3MgLSBkZXRhaWxzIHNlZSBpbmxpbmUiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBleHRyYWN0UHJvcGVydHlOYW1lT2ZQcm9wZXJ0eVBhdGgoU3RyaW5nIHByb3BlcnR5Q2hhaW4pDQotICAgIHsNCi0gICAgICAgIFN0cmluZ1tdIHByb3BlcnRpZXMgPSBwcm9wZXJ0eUNoYWluLnNwbGl0KCJcXC4iKTsNCi0NCi0gICAgICAgIE9iamVjdCBjdXJyZW50UHJvcGVydHlWYWx1ZSA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbihwcm9wZXJ0aWVzWzBdKTsNCi0NCi0gICAgICAgIE1ldGhvZCBjdXJyZW50TWV0aG9kOw0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRQcm9wZXJ0eU5hbWU7DQotICAgICAgICBmb3IoaW50IGkgPSAxOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50UHJvcGVydHlOYW1lID0gcHJvcGVydGllc1tpXTsNCi0gICAgICAgICAgICBjdXJyZW50TWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKGN1cnJlbnRQcm9wZXJ0eVZhbHVlLmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICJnZXQiICsgY3VycmVudFByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIGN1cnJlbnRQcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpKTsNCi0NCi0gICAgICAgICAgICBpZihjdXJyZW50TWV0aG9kID09IG51bGwgJiYgY3VycmVudFByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBNYXApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL2l0J3Mgb2sgZm9yIHRoZSBzaW1wbGUgbWFwIGNhc2UgLSBidXQgbm90IGZvciBlLmcuOg0KLSAgICAgICAgICAgICAgICAvLyN7YmVhbjFbYmVhbjIucHJvcGVydHlOYW1lUHJvdmlkZXJbIGJlYW4zLmluZGV4XV19DQotICAgICAgICAgICAgICAgIC8vb3IgZXZlcnkgb3RoZXIgY29tcGxleCByZXBsYWNlbWVudCBmb3IgYmVhbjMuaW5kZXgNCi0gICAgICAgICAgICAgICAgLy9pdCBtaWdodCBhbHNvIHJlcXVpcmUgYW4gYWRqdXN0bWVudCBhdCBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIjdHJ5VG9UcmFuc2Zvcm1Ub1JlYWxCaW5kaW5nDQotICAgICAgICAgICAgICAgICgoTWFwKWN1cnJlbnRQcm9wZXJ0eVZhbHVlKS5nZXQoY3VycmVudFByb3BlcnR5TmFtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eVZhbHVlID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKGN1cnJlbnRQcm9wZXJ0eVZhbHVlLCBjdXJyZW50TWV0aG9kKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZihjdXJyZW50UHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFN0cmluZyljdXJyZW50UHJvcGVydHlWYWx1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoInVuZXhwZWN0ZWQgdmFsdWUgd2l0aGluIG1hcCBzeW50YXg6ICIgKyBwcm9wZXJ0eUNoYWluICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGxhc3QgcHJvcGVydHkgbmFtZTogIiArIGN1cnJlbnRQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgc3RhdGljIFN0cmluZyBnZXRPcmlnaW5hbFZhbHVlQmluZGluZ0V4cHJlc3Npb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFZhbHVlRXhwcmVzc2lvbiB2YWx1ZUV4cHJlc3Npb24gPSB1aUNvbXBvbmVudC5nZXRWYWx1ZUV4cHJlc3Npb24oInZhbHVlIik7DQotDQotICAgICAgICByZXR1cm4gKHZhbHVlRXhwcmVzc2lvbiAhPSBudWxsKSA/IHZhbHVlRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtV2VsbEZvcm1lZChPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBWYWx1ZUJpbmRpbmcgfHwgbyBpbnN0YW5jZW9mIEV4dGVybmFsaXphYmxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBzID0gby50b1N0cmluZygpOw0KLSAgICAgICAgcmV0dXJuICgocy5jb250YWlucygiIyIpIHx8IHMuY29udGFpbnMoIiQiKSkgJiYgcy5jb250YWlucygieyIpICYmIHMuY29udGFpbnMoIn0iKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRCaW5kaW5nT2ZDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQuZ2V0VmFsdWVFeHByZXNzaW9uKG5hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmZTU2Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRFTEhlbHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeQ0KLXsNCi0gICAgcHJpdmF0ZSBFTEhlbHBlciBlbEhlbHBlciA9IG5ldyBEZWZhdWx0RUxIZWxwZXIoKTsNCi0gICAgDQotICAgIHByb3RlY3RlZCBFTEhlbHBlciBjcmVhdGVFTEhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmVsSGVscGVyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FTEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWIyNTUzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogaW4gb3JkZXIgdG8gY2VudHJhbGl6ZSB0aGUganNmIHZlcnNpb24gZGVwZW5kZW5jeSB3aXRoaW4gdGhlIGNvcmUNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRUxIZWxwZXINCi17DQotICAgIE9iamVjdCBnZXRCZWFuKFN0cmluZyBiZWFuTmFtZSk7DQotDQotICAgIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLQ0KLSAgICBDbGFzcyBnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCk7DQotDQotICAgIGJvb2xlYW4gaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIGJvb2xlYW4gaXNFTFRlcm1XZWxsRm9ybWVkKE9iamVjdCBvKTsNCi0NCi0gICAgT2JqZWN0IGdldEJpbmRpbmdPZkNvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgU3RyaW5nIG5hbWUpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FeHRWYWxFTFJlc29sdmVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FeHRWYWxFTFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTg5NjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRXh0VmFsRUxSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5lbC5FTFJlc29sdmVyOwotaW1wb3J0IGphdmF4LmVsLkVMQ29udGV4dDsKLWltcG9ydCBqYXZheC5lbC5WYXJpYWJsZU1hcHBlcjsKLWltcG9ydCBqYXZheC5lbC5GdW5jdGlvbk1hcHBlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEuYmVhbnMuRmVhdHVyZURlc2NyaXB0b3I7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGNsYXNzIEV4dFZhbEVMUmVzb2x2ZXIgZXh0ZW5kcyBFTFJlc29sdmVyCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgRUxSZXNvbHZlciB3cmFwcGVkOwotICAgIHByaXZhdGUgT2JqZWN0IGJhc2VPYmplY3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7Ci0gICAgLy9mb3JtcyB0aGUgaWQgZm9yIGNyb3NzLXZhbGlkYXRpb24gd2l0aGluIGNvbXBsZXggY29tcG9uZW50cwotICAgIHByaXZhdGUgU3RyaW5nIGV4cHJlc3Npb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGF0aFJlY29yZGluZ1N0b3BwZWQgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBFeHRWYWxFTFJlc29sdmVyKEVMUmVzb2x2ZXIgZWxSZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IGVsUmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRCYXNlT2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgiZXh0cmFjdGVkIHBhdGg6ICIgKyB0aGlzLmV4cHJlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKQotICAgIHsKLSAgICAgICAgdGhpcy5iYXNlT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IG51bGw7Ci0gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcGF0aCByZWNvcmRpbmcgaXMgcGVyZm9ybWVkIHRvIGdldCBhIGtleSBmb3IgY3Jvc3MtdmFsaWRhdGlvbjxici8+Ci0gICAgICogZXZlcnkgYmFzZSBhZnRlciB0aGUgZmlyc3QgY2FsbCB3aGljaCBpcyBudWxsIHN0b3BzIHJlY29yZGluZzxici8+Ci0gICAgICogd2l0aCBhIGR5bmFtaWMgbWFwIHN5bnRheCB0aGUgbGFzdCBwcm9wZXJ0eSBpbiB0aGUgbWlkZGxlIG9mIGFuIGV4cHJlc3Npb24gaGFzIHRvIGJlIGEgc3RyaW5nLgotICAgICAqIHN1Y2ggYSBzdHJpbmcgcmVzdWx0IGNvbnRpbnVlcyB0aGUgcGF0aCByZWNvcmRpbmcgYXQgdGhlIG5leHQgY2FsbCBmb3IgdGhlIGN1cnJlbnQgZXhwcmVzc2lvbi4KLSAgICAgKiA8cC8+Ci0gICAgICogZXhhbXBsZTogI3tiZWFuW2JlYW4ucHJvcGVydHlOYW1lUHJvdmlkZXJbJ25hbWVPZlByb3BlcnR5MSddXVsnZHluQmVhbiddLnByb3BlcnR5fQotICAgICAqIDxwLz4KLSAgICAgKiBsaW1pdGF0aW9uIGZvciBjcm9zcy12YWxpZGF0aW9uOiBuYW1lT2ZQcm9wZXJ0eTEgaGFzIHRvIGJlIG9mIHR5cGUgc3RyaW5nLgotICAgICAqIG90aGVyIGtleSB0eXBlcyBhcmVuJ3Qgc3VwcG9ydGVkIHlldAotICAgICAqCi0gICAgICogQHBhcmFtIGVsQ29udGV4dCB3cmFwcGVkIGVsLWNvbnRleHQKLSAgICAgKiBAcGFyYW0gYmFzZSBjdXJyZW50IGJhc2UKLSAgICAgKiBAcGFyYW0gcHJvcGVydHkgcHJvcGVydHkgdG8gcmVzb2x2ZQotICAgICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBkZWxlZ2F0ZWQgbWV0aG9kIGNhbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBiYXNlLCBPYmplY3QgcHJvcGVydHkpCi0gICAgewotICAgICAgICBPYmplY3QgcmVzdWx0ID0gdGhpcy53cmFwcGVkLmdldFZhbHVlKGVsQ29udGV4dCwgYmFzZSwgcHJvcGVydHkpOwotCi0gICAgICAgIC8vdmVyeSBmaXJzdCBjYWxsIGZvciBhbiBleHByZXNzaW9uCi0gICAgICAgIGlmKHRoaXMuZXhwcmVzc2lvbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSAoU3RyaW5nKXByb3BlcnR5OwotICAgICAgICB9Ci0gICAgICAgIC8vI3tiZWFuW2R5bkJhc2UucHJvcGVydHlOYW1lXX0gLT4gYmFzZSBvZiBkeW5CYXNlIGlzIG51bGwgLT4gc3RvcCBwYXRoIHJlY29yZGluZwotICAgICAgICBlbHNlIGlmKGJhc2UgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pc1BhdGhSZWNvcmRpbmdTdG9wcGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gcHJvcGVydHlFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKXByb3BlcnR5OwotICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHlOYW1lLnN1YnN0cmluZygxKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoYmFzZSBpbnN0YW5jZW9mIE1hcCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCgoTWFwKWJhc2UpLmNvbnRhaW5zS2V5KHByb3BlcnR5KSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoYmFzZS5nZXRDbGFzcygpLmdldE1ldGhvZCgiZ2V0IiArIHByb3BlcnR5TmFtZSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihiYXNlLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJpcyIgKyBwcm9wZXJ0eU5hbWUpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoInByb3BlcnR5OiAiICsgcHJvcGVydHkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzbid0IHVzZWQgZm9yIHBhdGggLSBpdCBpc24ndCBhIHByb3BlcnR5IG9mICIgKyBiYXNlLmdldENsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2UuZy46ICN7YmVhbi5zdWJCYXNlLnByb3BlcnR5fSAtPiBoZXJlIHdlIGFyZSBhdCBzdWJCYXNlCi0gICAgICAgICAgICBpZihwcm9wZXJ0eUV4aXN0cyAmJiAhdGhpcy5pc1BhdGhSZWNvcmRpbmdTdG9wcGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbiArPSAiLiIgKyBwcm9wZXJ0eTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYocHJvcGVydHlFeGlzdHMgJiYgcmVzdWx0IGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuaXNQYXRoUmVjb3JkaW5nU3RvcHBlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgaWYodGhpcy5pc1BhdGhSZWNvcmRpbmdTdG9wcGVkICYmIHJlc3VsdCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uICs9ICIuIiArIHByb3BlcnR5OwotICAgICAgICB9Ci0gICAgICAgICovCi0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0VHlwZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbywgT2JqZWN0IG8xKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0VHlwZShlbENvbnRleHQsIG8sIG8xKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbywgT2JqZWN0IG8xLCBPYmplY3QgbzIpCi0gICAgewotICAgICAgICBleHByZXNzaW9uICs9ICIuIiArIG8xOwotICAgICAgICBwcm9wZXJ0eSA9IChTdHJpbmcpbzE7Ci0gICAgICAgIGJhc2VPYmplY3QgPSBvOwotICAgICAgICBlbENvbnRleHQuc2V0UHJvcGVydHlSZXNvbHZlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvLCBPYmplY3QgbzEpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5pc1JlYWRPbmx5KGVsQ29udGV4dCwgbywgbzEpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxGZWF0dXJlRGVzY3JpcHRvcj4gZ2V0RmVhdHVyZURlc2NyaXB0b3JzKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0RmVhdHVyZURlc2NyaXB0b3JzKGVsQ29udGV4dCwgbyk7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzPD8+IGdldENvbW1vblByb3BlcnR5VHlwZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbykKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENvbW1vblByb3BlcnR5VHlwZShlbENvbnRleHQsIG8pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRUxDb250ZXh0IGNyZWF0ZUNvbnRleHRXcmFwcGVyKGZpbmFsIEVMQ29udGV4dCBjb250ZXh0LCBmaW5hbCBFTFJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFTENvbnRleHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRMb2NhbGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVJlc29sdmVkKGJvb2xlYW4gdmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuc2V0UHJvcGVydHlSZXNvbHZlZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRQcm9wZXJ0eVJlc29sdmVkKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwdXRDb250ZXh0KENsYXNzIGNsYXp6LCBPYmplY3Qgb2JqZWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyLnB1dENvbnRleHQoY2xhenosIG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5wdXRDb250ZXh0KGNsYXp6LCBvYmplY3QpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udGV4dChDbGFzcyBjbGF6eikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRDb250ZXh0KGNsYXp6KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvY2FsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlci5zZXRMb2NhbGUobG9jYWxlKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldExvY2FsZShsb2NhbGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBFTFJlc29sdmVyIGdldEVMUmVzb2x2ZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgRnVuY3Rpb25NYXBwZXIgZ2V0RnVuY3Rpb25NYXBwZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldEZ1bmN0aW9uTWFwcGVyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFZhcmlhYmxlTWFwcGVyIGdldFZhcmlhYmxlTWFwcGVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRWYXJpYWJsZU1hcHBlcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyYjg5Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogSGVscGVyIGNsYXNzIHRvIGdldCB0aGUgcmVhbC9mdWxsIHZhbHVlIGJpbmRpbmcgLSB0ZXN0ZWQgd2l0aCBmYWNlbGV0cyAxLjEuMTQNCi0gKiBUaGUgdGFyZ2V0IGlzIHRvIGdldCByaWQgb2YgdGhpcyBpbXBsLiAtIGN1cnJlbnRseSBpdCdzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IGN1c3RvbSBmYWNlbGV0cyBjb21wb25lbnRzLg0KLSAqIEFuIGFsdGVybmF0aXZlIHdvdWxkIGJlIGFuIEVMLVJlc29sdmVyIC0gdGhlcmUgYXJlIHN0aWxsIHNvbWUgb3BlbiBpc3N1ZXMgd2l0aCBzdWNoIGFuIGFwcHJvYWNoDQotICogKyBJdCBpc24ndCBhdmFpbGFibGUgd2l0aCBKU0YgMS4xLngNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9DcmVhdGVWYWx1ZUJpbmRpbmdGb3JGYWNlbGV0c0JpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBEZWZhdWx0RUxIZWxwZXIuZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEJpbmRpbmdzID0gZXh0cmFjdEVMVGVybXMoDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmluZGluZ09mQ29tcG9uZW50KHVpQ29tcG9uZW50LCAidmFsdWUiKSk7DQotDQotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZT0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIDEpICsgInsiICsgY3JlYXRlQmluZGluZyhmb3VuZEJpbmRpbmdzLCBtYXBwZWRGYWNlbGV0c1ZhcnMpICsgIn0iKTsNCi0NCi0gICAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YmUuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotDQotICAgICAgICAgICAgaWYoZW50aXR5Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnlUb1JlcGxhY2VWYXJzKHZiZSwgbWFwcGVkRmFjZWxldHNWYXJzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHZiZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVCaW5kaW5nKExpc3Q8U3RyaW5nPiBleHByZXNzaW9ucywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkZWRWaXJ0dWFsTmFtZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGVudHJ5IDogZXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoIlZhbHVlRXhwcmVzc2lvblsiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBmb3VuZEJpbmRpbmdEZXRhaWxzID0gZW50cnkuc3BsaXQoIiAiKTsNCi0gICAgICAgICAgICBpbmRleE9mQmluZGluZ0RldGFpbHMgPSBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKGZvdW5kQmluZGluZ0RldGFpbHMpOw0KLQ0KLSAgICAgICAgICAgIGlmIChpbmRleE9mQmluZGluZ0RldGFpbHMgPT0gLTEpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgYmluZGluZ0RldGFpbHMgPSBmb3VuZEJpbmRpbmdEZXRhaWxzW2luZGV4T2ZCaW5kaW5nRGV0YWlsc10uc3BsaXQoIj0iKTsNCi0NCi0gICAgICAgICAgICBpZiAoYmluZGluZ0RldGFpbHMubGVuZ3RoIDwgMikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGJpbmRpbmdEZXRhaWxzWzFdOw0KLQ0KLSAgICAgICAgICAgIC8vdG8gc3VwcG9ydCBibGFua3Mgd2l0aGluIGEgYmluZGluZyB3aXRoIG1hcCBzeW50YXgNCi0gICAgICAgICAgICBpZihjdXJyZW50QmluZGluZy5jb250YWlucygieyIpICYmICFjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgPSBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKGN1cnJlbnRCaW5kaW5nLCBmb3VuZEJpbmRpbmdEZXRhaWxzLCBpbmRleE9mQmluZGluZ0RldGFpbHMpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnNLZXkoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5wdXQoYmluZGluZ0RldGFpbHNbMF0sIGN1cnJlbnRCaW5kaW5nKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvL2VudHJ5IGZvciAidmlydHVhbCIgZmFjZWxldHMgdmFyDQotICAgICAgICAgICAgaWYoIShjdXJyZW50QmluZGluZy5jb250YWlucygieyIpIHx8IGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhcnMucHV0KGJpbmRpbmdEZXRhaWxzWzBdLCBiaW5kaW5nRGV0YWlsc1sxXS5zdWJzdHJpbmcoMSwgYmluZGluZ0RldGFpbHNbMV0ubGVuZ3RoKCktMikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBvcmlnaW5hbEJpbmRpbmcgPSBhZGRlZFZpcnR1YWxOYW1lcy5nZXQoInZhbHVlIik7DQotICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcuc3Vic3RyaW5nKG9yaWdpbmFsQmluZGluZy5pbmRleE9mKCJ7IikgKyAxLCBvcmlnaW5hbEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLnJlbW92ZSgidmFsdWUiKTsNCi0gICAgICAgIHJldHVybiB0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcob3JpZ2luYWxCaW5kaW5nLCBhZGRlZFZpcnR1YWxOYW1lcywgdmlydHVhbFZhcnMpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcoDQotICAgICAgICAgICAgU3RyaW5nIG9yaWdpbmFsQmluZGluZywgTWFwPFN0cmluZywgU3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gIiN7IiArIG9yaWdpbmFsQmluZGluZyArICJ9IjsNCi0gICAgICAgIEl0ZXJhdG9yIG5hbWVJdGVyYXRvciA9IGFkZGVkVmlydHVhbE5hbWVzLmtleVNldCgpLml0ZXJhdG9yKCk7DQotDQotICAgICAgICBTdHJpbmcgY3VycmVudEtleTsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50VmFsdWU7DQotICAgICAgICB3aGlsZShuYW1lSXRlcmF0b3IuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRLZXkgPSAoU3RyaW5nKSBuYW1lSXRlcmF0b3IubmV4dCgpOw0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGFkZGVkVmlydHVhbE5hbWVzLmdldChjdXJyZW50S2V5KTsNCi0gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGN1cnJlbnRWYWx1ZS5pbmRleE9mKCJ7IikgKyAxLCBjdXJyZW50VmFsdWUuaW5kZXhPZigifSIpKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIi4iLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJ7IiArIGN1cnJlbnRLZXkgKyAiWyIsICJ7IiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICIuIiwgIi4iICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiLiIgKyBjdXJyZW50S2V5ICsgIlsiLCAiLiIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiXSIsICJbJyIgKyBjdXJyZW50VmFsdWUgKyAiJ10iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIlsiLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiLiIsICJbIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICB9DQotDQotICAgICAgICBuYW1lSXRlcmF0b3IgPSB2aXJ0dWFsVmFycy5rZXlTZXQoKS5pdGVyYXRvcigpOw0KLQ0KLSAgICAgICAgd2hpbGUobmFtZUl0ZXJhdG9yLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50S2V5ID0gKFN0cmluZykgbmFtZUl0ZXJhdG9yLm5leHQoKTsNCi0NCi0gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSB2aXJ0dWFsVmFycy5nZXQoY3VycmVudEtleSk7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoInsiICsgY3VycmVudEtleSArICIuIiwgInsiICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIlsiLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCIuIiArIGN1cnJlbnRLZXkgKyAiLiIsICIuIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICJbIiwgIi4iICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIl0iLCAiWyciICsgY3VycmVudFZhbHVlICsgIiddIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIlsiICsgY3VycmVudEtleSArICJbIiwgIlsiICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIi4iLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG9yaWdpbmFsQmluZGluZy5zdWJzdHJpbmcoMiwgb3JpZ2luYWxCaW5kaW5nLmxlbmd0aCgpIC0gMSk7DQotICAgIH0NCi0NCi0gICAgLy90byBzdXBwb3J0IGJsYW5rcyAtIGUuZy4gd2l0aCBtYXAgc3ludGF4DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKFN0cmluZyBjdXJyZW50QmluZGluZywgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlscykNCi0gICAgew0KLSAgICAgICAgZm9yKGludCBpID0gaW5kZXhPZkJpbmRpbmdEZXRhaWxzICsgMTsgaSA8IGZvdW5kQmluZGluZ0RldGFpbHMubGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgKz0gZm91bmRCaW5kaW5nRGV0YWlsc1tpXTsNCi0gICAgICAgICAgICBpZihmb3VuZEJpbmRpbmdEZXRhaWxzW2ldLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEJpbmRpbmc7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRCaW5kaW5nOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBpbnQgY291bnQgPSAwOw0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBiaW5kaW5nRGV0YWlscykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuY29udGFpbnMoIj0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY291bnQrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZXh0cmFjdEVMVGVybXMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlRUxUZXJtcyhvLCBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKSwgZm91bmRFTFRlcm1zLCAwKSA+IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRFTFRlcm1zOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcmVzb2x2ZUVMVGVybXMoT2JqZWN0IG8sIE1hcDxPYmplY3QsIE9iamVjdD4gdmlzaXRlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMsIGludCBjb3VudCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAobyA9PSBudWxsIHx8IHZpc2l0ZWQuY29udGFpbnNLZXkobykgfHwgY291bnQgPiA1MCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZpc2l0ZWQucHV0KG8sIG51bGwpOw0KLQ0KLSAgICAgICAgaW50IGVsQ291bnQgPSAwOw0KLSAgICAgICAgQ2xhc3MgYyA9IG8uZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIC8vaW5zcGVjdCBtYXBzDQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1hcCkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBmb3IgKE9iamVjdCBlbnRyeSA6ICgoTWFwKSBvKS52YWx1ZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZm91bmQgZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICAgICAgaWYoZW50cnkudG9TdHJpbmcoKS5jb250YWlucygiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKGVudHJ5LnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoZW50cnksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGVsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQobykpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gKytlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9hbmFseXplIGFycmF5cw0KLSAgICAgICAgaWYgKGMuaXNBcnJheSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgobyk7DQotICAgICAgICAgICAgLy9jaGVjayBhcnJheSBbTCAtPiBubyBhcnJheSBvZiBwcmltaXRpdmUgdHlwZXMNCi0gICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMamF2YS5sYW5nLlN0cmluZyIpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChBcnJheS5nZXQobywgaSkpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKEFycmF5LmdldChvLCBpKSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxGaWVsZD4gYXR0cmlidXRlcyA9IGZpbmRBbGxBdHRyaWJ1dGVzKGMsIG5ldyBBcnJheUxpc3Q8RmllbGQ+KCkpOw0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBhdHRyaWJ1dGVzLnRvQXJyYXkobmV3IEZpZWxkW2F0dHJpYnV0ZXMuc2l6ZSgpXSk7DQotDQotICAgICAgICBBY2Nlc3NpYmxlT2JqZWN0LnNldEFjY2Vzc2libGUoZmllbGRzLCB0cnVlKTsNCi0gICAgICAgIGZvciAoRmllbGQgY3VycmVudEZpZWxkIDogZmllbGRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQuZ2V0KG8pID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5nZXRUeXBlKCkuZXF1YWxzKFN0cmluZy5jbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmdldChvKSAhPSBudWxsICYmIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKGN1cnJlbnRGaWVsZC5nZXQobykpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFjdXJyZW50RmllbGQuZ2V0VHlwZSgpLmlzUHJpbWl0aXZlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKGN1cnJlbnRGaWVsZC5nZXQobyksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZWxDb3VudDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEZpZWxkPiBmaW5kQWxsQXR0cmlidXRlcyhDbGFzcyBjLCBMaXN0PEZpZWxkPiBhdHRyaWJ1dGVzKQ0KLSAgICB7DQotICAgICAgICBpZiAoYyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluZEFsbEF0dHJpYnV0ZXMoYy5nZXRTdXBlcmNsYXNzKCksIGF0dHJpYnV0ZXMpOw0KLQ0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBjLmdldERlY2xhcmVkRmllbGRzKCk7DQotICAgICAgICBmb3IgKEZpZWxkIGN1cnJlbnRGaWVsZCA6IGZpZWxkcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzU3RhdGljKGN1cnJlbnRGaWVsZC5nZXRNb2RpZmllcnMoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChjdXJyZW50RmllbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9SZXBsYWNlVmFycyhWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eTsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0gICAgICAgIGJvb2xlYW4gbGFzdCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgd2hpbGUodHJ1ZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxhc3QgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0NCi0gICAgICAgICAgICBwcm9wZXJ0eSA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbg0KLSAgICAgICAgICAgICAgICAucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIGdldE5ld1Byb3BlcnR5KHByb3BlcnR5LCBtYXBwZWRGYWNlbGV0c1ZhcnMpKTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQubGVuZ3RoKCkgPT0gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpICsgIi4iICsgcmVzdWx0Ow0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpOw0KLQ0KLSAgICAgICAgICAgIGlmKGxhc3QpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcmVmaXgoKSArICJ7IiArIHJlc3VsdCArICJ9Iik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5ld1Byb3BlcnR5KFN0cmluZyBvbGRQcm9wZXJ0eSwgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFycyA9IGdldFBvdGVudGlhbFZpcnR1YWxWYXJzKG9sZFByb3BlcnR5KTsNCi0NCi0gICAgICAgIGZvcihTdHJpbmcgdmlydHVhbFZhciA6IHZpcnR1YWxWYXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1hcHBlZEZhY2VsZXRzVmFycy5jb250YWluc0tleSh2aXJ0dWFsVmFyKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG9sZFByb3BlcnR5ID0gcmVwbGFjZVByb3BlcnR5VmFsdWUob2xkUHJvcGVydHksIHZpcnR1YWxWYXIsIG1hcHBlZEZhY2VsZXRzVmFycy5nZXQodmlydHVhbFZhcikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvbGRQcm9wZXJ0eTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0UG90ZW50aWFsVmlydHVhbFZhcnMoU3RyaW5nIG9sZFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpbnQgc3RhcnQgPSAtMTsNCi0gICAgICAgIGludCBlbmQgPSAtMTsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG9sZFByb3BlcnR5Lmxlbmd0aCgpOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoc3RhcnQgPT0gLSAxICYmIG9sZFByb3BlcnR5LmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKChzdGFydCAhPSAtIDEgJiYgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICdbJykgfHwgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICddJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGVuZCA9IGk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKHN0YXJ0ICE9IC0xICYmIGVuZCAhPSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJMaXN0LmFkZChvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOw0KLSAgICAgICAgICAgICAgICBpZihvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbmQgPSAtMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlydHVhbFZhckxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcGxhY2VQcm9wZXJ0eVZhbHVlKFN0cmluZyBvbGRQcm9wZXJ0eSwgU3RyaW5nIHRhcmdldFZhciwgU3RyaW5nIG5ld1ZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpbnQgaW5kZXggPSBvbGRQcm9wZXJ0eS5pbmRleE9mKHRhcmdldFZhcik7DQotDQotICAgICAgICBpZihpbmRleCA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gb2xkUHJvcGVydHk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gb2xkUHJvcGVydHkuc3Vic3RyaW5nKDAsIGluZGV4KTsNCi0gICAgICAgIHJlc3VsdCArPSBuZXdWYWx1ZTsNCi0gICAgICAgIHJldHVybiByZXN1bHQgKyBvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoaW5kZXggKyB0YXJnZXRWYXIubGVuZ3RoKCksIG9sZFByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiByZXBsYWNlIHZpcnR1YWwgZmFjZWxldHMgdmFycyAobWFwIHN5bnRheCkNCi0gICAgICogdGVzdGVkIHN0eWxlcyAoc2ltcGxlIGFuZCBuZXN0ZWQpOiB0ZXN0W2l4W2l4MltpeDNdXV0NCi0gICAgICovDQotICAgIC8qDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBfY3JlYXRlQmluZGluZyhMaXN0PFN0cmluZz4gZXhwcmVzc2lvbnMsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmlydHVhbFZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0NCi0gICAgICAgIFN0cmluZyBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50QmluZGluZzsNCi0gICAgICAgIFN0cmluZyBwYXJ0T2ZCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBleHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aCgiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZvdW5kQmluZGluZ0RldGFpbHMgPSBlbnRyeS5zcGxpdCgiICIpOw0KLSAgICAgICAgICAgIGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoZm91bmRCaW5kaW5nRGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9PSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBiaW5kaW5nRGV0YWlscyA9IGZvdW5kQmluZGluZ0RldGFpbHNbaW5kZXhPZkJpbmRpbmdEZXRhaWxzXS5zcGxpdCgiPSIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nRGV0YWlscy5sZW5ndGggPCAyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYmluZGluZ0RldGFpbHNbMV07DQotDQotICAgICAgICAgICAgLy90byBzdXBwb3J0IGJsYW5rcyB3aXRoaW4gYSBiaW5kaW5nIHdpdGggbWFwIHN5bnRheA0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgJiYgIWN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoY3VycmVudEJpbmRpbmcsIGZvdW5kQmluZGluZ0RldGFpbHMsIGluZGV4T2ZCaW5kaW5nRGV0YWlscyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lICE9IG51bGwgJiYgY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnMoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBwYXJ0T2ZCaW5kaW5nID0gY3VycmVudEJpbmRpbmcuc3Vic3RyaW5nKGN1cnJlbnRCaW5kaW5nLmluZGV4T2YocHJldkZhY2VsZXRzQXR0cmlidXRlTmFtZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICArIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUubGVuZ3RoKCksIGN1cnJlbnRCaW5kaW5nLmluZGV4T2YoIn0iKSk7DQotDQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5hZGQoYmluZGluZ0RldGFpbHNbMF0pOw0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgcGFydE9mQmluZGluZzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICBlbHNlIGlmKCEoY3VycmVudEJpbmRpbmcuY29udGFpbnMoInsiKSB8fCBjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJzLnB1dChiaW5kaW5nRGV0YWlsc1swXSwgYmluZGluZ0RldGFpbHNbMV0uc3Vic3RyaW5nKDEsIGJpbmRpbmdEZXRhaWxzWzFdLmxlbmd0aCgpLTIpKTsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWlucyhiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLmFkZChiaW5kaW5nRGV0YWlsc1swXSk7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyZW50QmluZGluZy5zdWJzdHJpbmcoY3VycmVudEJpbmRpbmcuaW5kZXhPZigieyIpICsgMSwgY3VycmVudEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gYmluZGluZ0RldGFpbHNbMF07DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotICAgICovDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24uamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc4ZWI2Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRpZmZlcmVuY2UgYmV0d2VlbiBbIGFuZCBbJyAtIHRlc3Qgd2l0aCBtb3JlIGNvbnN0ZWxsYXRpb25zIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQ0KLXB1YmxpYyBjbGFzcyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotew0KLSAgICBwcml2YXRlIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYmFzZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7DQotICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdG9rZW47DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXBsYWNlT3JBZGRQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlcGxhY2VQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1Byb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICAvL1RPRE8gYWRqdXN0bWVudHMgZm9yIGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLmVuZHNXaXRoKCInXSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYWRkUHJvcGVydHkoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBzb3VyY2VFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc291cmNlRXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgc291cmNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpOw0KLQ0KLSAgICAgICAgLy9UT0RPIGFkanVzdG1lbnRzIGZvciBpc0R5bmFtaWNCYXNlQW5kUHJvcGVydHkNCi0gICAgICAgIGlmKG5ld1Byb3BlcnR5LnN0YXJ0c1dpdGgoIlsnIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHJlc3VsdCArIG5ld1Byb3BlcnR5ICsgIn0iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ocmVzdWx0ICsgIi4iICsgbmV3UHJvcGVydHkgKyAifSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKFN0cmluZyBleHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBpZighRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQoZXhwcmVzc2lvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihleHByZXNzaW9uICsgIiBpcyBubyB2YWxpZCBlbC1leHByZXNzaW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBib29sZWFuIGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSA9IGV4cHJlc3Npb24ubGFzdEluZGV4T2YoIiddIikgPT0gLTE7DQotICAgICAgICBpbnQgaW5kZXgxID0gaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5ID8gZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiXSIpIDogZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiJ10iKTsNCi0gICAgICAgIGludCBpbmRleDIgPSBleHByZXNzaW9uLmxhc3RJbmRleE9mKCIuIik7DQotDQotICAgICAgICBpZihpbmRleDEgPiBpbmRleDIpDQotICAgICAgICB7DQotICAgICAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGluZGV4MSk7DQotDQotICAgICAgICAgICAgaW50IGluZGV4MyA9IGZpbmRJbmRleE9mU3RhcnRpbmdCcmFja2V0KGV4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIGlmKGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZyhpbmRleDMgKyAxLCBpbmRleDEpOw0KLQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoaW5kZXgzICsgMiwgaW5kZXgxKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdGhpcy5iYXNlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgzKSArICJ9Iik7DQotICAgICAgICAgICAgdGhpcy50b2tlbiA9IGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSA/ICJbIiA6ICJbJyI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKCBpbmRleDIgPiBpbmRleDEpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKGluZGV4MiArIDEsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxICk7DQotICAgICAgICAgICAgdGhpcy5iYXNlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgyKSArICJ9Iik7DQotICAgICAgICAgICAgdGhpcy50b2tlbiA9ICIuIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoMiwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpOw0KLSAgICAgICAgICAgIHRoaXMucHJlZml4ID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgMSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnRyaW0oKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYoIlsiLmVxdWFscyh0aGlzLnRva2VuKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLnZhbHVlLnN0YXJ0c1dpdGgoIiciKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlLnN1YnN0cmluZygxLCB0aGlzLnZhbHVlLmxlbmd0aCgpIC0gMSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vcmV0dXJuIHRoaXMuYmFzZS52YWx1ZSArIHRoaXMudG9rZW4gKyB0aGlzLnZhbHVlLnN1YnN0cmluZygwLCB0aGlzLnZhbHVlLmxlbmd0aCgpKSArICInXSI7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gZ2V0QmFzZUV4cHJlc3Npb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmFzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4cHJlc3Npb25TdHJpbmcoKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgYmFzZUV4cHJlc3Npb24gPSB0aGlzLmJhc2UuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLQ0KLSAgICAgICAgICAgIGlmKCJbJyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAiJ119IjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZigiWyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAiXX0iOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gYmFzZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGJhc2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSkgKyB0aGlzLnRva2VuICsgdGhpcy52YWx1ZSArICJ9IjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVmaXggKyAieyIgKyB0aGlzLnZhbHVlICsgIn0iOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5iYXNlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZS5nZXRQcmVmaXgoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJlZml4Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmJhc2Uuc2V0UHJlZml4KHByZWZpeCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEV4cHJlc3Npb25TdHJpbmcoKS5oYXNoQ29kZSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gJiYgZ2V0RXhwcmVzc2lvblN0cmluZygpDQotICAgICAgICAgICAgLmVxdWFscygoKFZhbHVlQmluZGluZ0V4cHJlc3Npb24pIHRhcmdldCkuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGludCBmaW5kSW5kZXhPZlN0YXJ0aW5nQnJhY2tldChTdHJpbmcgZXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgaW50IGNsb3NlQ291bnQgPSAwOw0KLSAgICAgICAgZm9yKGludCBpID0gZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDE7IGkgPiAwOyBpLS0pDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoZXhwcmVzc2lvbi5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2xvc2VDb3VudC0tOw0KLSAgICAgICAgICAgICAgICBpZihjbG9zZUNvdW50IDwgMCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZihleHByZXNzaW9uLmNoYXJBdChpKSA9PSAnXScpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjbG9zZUNvdW50Kys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MmU1MTQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxUPiBpbXBsZW1lbnRzIE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8TmFtZU1hcHBlcjxUPj4NCi17DQotICAgIHByaXZhdGUgTGlzdDxDbGFzcz4gZGVuaWVkTmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLQ0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVnaXN0ZXIoTmFtZU1hcHBlcjxUPiBuYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICBpZighZGVuaWVkTmFtZU1hcHBlckxpc3QuY29udGFpbnMobmFtZU1hcHBlci5nZXRDbGFzcygpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBnZXROYW1lTWFwcGVyTGlzdCgpLmFkZChuYW1lTWFwcGVyKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGVyZWdpc3RlcihDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gY2xhc3NUb0RlcmVnaXN0ZXIpDQotICAgIHsNCi0gICAgICAgIEl0ZXJhdG9yPE5hbWVNYXBwZXI8VD4+IG5hbWVNYXBwZXJJdGVyYXRvciA9IGdldE5hbWVNYXBwZXJMaXN0KCkuaXRlcmF0b3IoKTsNCi0gICAgICAgIHdoaWxlKG5hbWVNYXBwZXJJdGVyYXRvci5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobmFtZU1hcHBlckl0ZXJhdG9yLm5leHQoKS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NUb0RlcmVnaXN0ZXIuZ2V0TmFtZSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG5hbWVNYXBwZXJJdGVyYXRvci5yZW1vdmUoKTsNCi0gICAgICAgICAgICAgICAgLy9kb24ndCBicmVhayAtIGUuZy4gdG8gZGVyZWdpc3RlciBhbGwgd3JhcHBlcnMuLi4NCi0gICAgICAgICAgICAgICAgLy9icmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZGVueShDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gY2xhc3NUb0RlbnkpDQotICAgIHsNCi0gICAgICAgIGRlcmVnaXN0ZXIoY2xhc3NUb0RlbnkpOw0KLQ0KLSAgICAgICAgc3luY2hyb25pemVkIChnZXRDbGFzcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGRlbmllZE5hbWVNYXBwZXJMaXN0LmFkZChjbGFzc1RvRGVueSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IExpc3Q8TmFtZU1hcHBlcjxUPj4gZ2V0TmFtZU1hcHBlckxpc3QoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9DbGFzc01hcHBpbmdGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2NjA3MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIENsYXNzTWFwcGluZ0ZhY3Rvcnk8UCwgUj4NCi17DQotICAgIFIgY3JlYXRlKFAgc291cmNlKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9EZWZhdWx0RmFjdG9yeUZpbmRlci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9EZWZhdWx0RmFjdG9yeUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODMyZGJhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRGVmYXVsdEZhY3RvcnlGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5EZWZhdWx0RUxIZWxwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkRlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vL2R5bmFtaWMgYXBwcm9hY2ggdG8gY3JlYXRlIHRoZSBmYWN0b3JpZXMgZHVyaW5nIHRoZSBmaXJzdCByZXF1ZXN0LCB3aGVuIGEgZmFjZXMtY29udGV4dCBpcyBhdmFpbGFibGUNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RmFjdG9yeUZpbmRlciBpbXBsZW1lbnRzIEZhY3RvcnlGaW5kZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotICAgIHByb3RlY3RlZCBNYXA8RmFjdG9yeU5hbWVzLCBPYmplY3Q+IGZhY3RvcnlNYXAgPSBuZXcgSGFzaE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4oKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgRmFjdG9yeUZpbmRlciBmYWN0b3J5RmluZGVyID0gbmV3IERlZmF1bHRGYWN0b3J5RmluZGVyKCk7DQotDQotICAgIHByaXZhdGUgRGVmYXVsdEZhY3RvcnlGaW5kZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjdG9yeUZpbmRlciBnZXRJbnN0YW5jZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWN0b3J5RmluZGVyOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyBmaW5hbCA8VD4gVCBnZXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIGlmKCEoZmFjdG9yeU1hcC5jb250YWluc0tleShmYWN0b3J5TmFtZSkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRGYWN0b3J5KGZhY3RvcnlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoVClmYWN0b3J5TWFwLmdldChmYWN0b3J5TmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgc3dpdGNoIChmYWN0b3J5TmFtZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjYXNlIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlTWVzc2FnZVJlc29sdmVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBSRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBFTF9IRUxQRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZUVMSGVscGVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIEZBQ0VTX01FU1NBR0VfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZUZhY2VzTWVzc2FnZUZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgZGVmYXVsdDogLy9yZXF1aXJlZCBieSBjaGVja3N0eWxlDQotICAgICAgICB9DQotDQotICAgICAgICBpZihmYWN0b3J5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IHBvc3NpYmxlIHRvIGNyZWF0ZSBmYWN0b3J5ICIgKyBmYWN0b3J5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBmYWN0b3J5TWFwLnB1dChmYWN0b3J5TmFtZSwgZmFjdG9yeSk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZKTsNCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZKSk7DQotICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkpOw0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZKSk7DQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkpOw0KLSAgICAgICAgbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZKSk7DQotICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSApOw0KLSAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZKSk7DQotICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgY3JlYXRlRmFjZXNNZXNzYWdlRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fRkFDRVNfTUVTU0FHRV9GQUNUT1JZKTsNCi0gICAgICAgIGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkZBQ0VTX01FU1NBR0VfRkFDVE9SWSkpOw0KLQ0KLSAgICAgICAgT2JqZWN0IHRhcmdldCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KEN1c3RvbUluZm9ybWF0aW9uLkZBQ0VTX01FU1NBR0VfRkFDVE9SWS5uYW1lKCkpOw0KLSAgICAgICAgaWYodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0IGluc3RhbmNlb2YgU3RyaW5nKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzLmFkZCgoU3RyaW5nKXRhcmdldCk7DQotICAgICAgICB9DQotICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgY3JlYXRlRUxIZWxwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0RUxIZWxwZXJGYWN0b3J5KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdiZDhhMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRmFjZXNNZXNzYWdlRmFjdG9yeQ0KLXsNCi0gICAgRmFjZXNNZXNzYWdlIGNvbnZlcnQoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSk7DQotDQotICAgIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZjI2MjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnlGaW5kZXIKLXsKLSAgICA8VD4gVCBnZXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZjMxMzkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQotcHVibGljIGVudW0gRmFjdG9yeU5hbWVzCi17Ci0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksCi0gICAgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLAotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLAotCi0gICAgRkFDRVNfTUVTU0FHRV9GQUNUT1JZLAotCi0gICAgUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwKLSAgICBFTF9IRUxQRVJfRkFDVE9SWQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9OYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L05hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQyZDFmMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L05hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFQgZXh0ZW5kcyBOYW1lTWFwcGVyPg0KLXsNCi0gICAgdm9pZCByZWdpc3RlcihUIGNsYXNzVG9BZGQpOw0KLSAgICB2b2lkIGRlcmVnaXN0ZXIoQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IGNsYXNzVG9EZXJlZ2lzdGVyKTsNCi0gICAgdm9pZCBkZW55KENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBjbGFzc1RvRGVueSk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9Db21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YmQ5N2EuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gaW5pdGlhbGl6ZSBjb21wb25lbnRzIGJlZm9yZUVuY29kZUJlZ2luLjxici8+DQotICogZS5nLjogeW91IGNhbiBhZGQgaW5mb3JtYXRpb24gZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gbWVjaGFuaXNtcywuLi4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50SW5pdGlhbGl6ZXINCi17DQotICAgIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5YzA0MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBTdGF0aWNDb25maWd1cmF0aW9uPFQsIFI+DQotew0KLSAgICB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCk7DQotICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFQsIFI+PiBnZXRNYXBwaW5nKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjg0YWY1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGNsYXNzIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxULCBSPg0KLXsNCi0gICAgcHJpdmF0ZSBUIHNvdXJjZTsNCi0gICAgcHJpdmF0ZSBSIHRhcmdldDsNCi0NCi0gICAgcHVibGljIFQgZ2V0U291cmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHNvdXJjZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoVCBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSIGdldFRhcmdldCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KFIgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiY2RjNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSX0pCi1wdWJsaWMgZW51bSBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMKLXsKLSAgICBNRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9DT05GSUcsCi0KLSAgICBTS0lQX1ZBTElEQVRJT05fU1VQUE9SVF9DT05GSUcKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBjYjZmNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3MKLSAgICAgICAgPSBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VPZk1hcHBpbmcoU3RyaW5nIHBhdGgpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGdldE1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2Uoc291cmNlKTsKLSAgICAgICAgZW50cnkuc2V0VGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgIHRoaXMubWFwcGluZ3MuYWRkKGVudHJ5KTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYTYzYzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIFN0cmluZyBwYXRoOwotICAgIHByaXZhdGUgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5nczsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCkKLSAgICB7Ci0gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgICAgIC8vZm9yY2UgcmVsb2FkCi0gICAgICAgIG1hcHBpbmdzID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBnZXRNYXBwaW5nKCkKLSAgICB7Ci0gICAgICAgIGlmKG1hcHBpbmdzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtYXBwaW5nczsKLSAgICAgICAgfQotCi0gICAgICAgIG1hcHBpbmdzID0gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotCi0gICAgICAgIFJlc291cmNlQnVuZGxlIG1hcHBpbmcgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocGF0aCk7Ci0KLSAgICAgICAgaWYgKG1hcHBpbmcgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9sb2dnaW5nCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IG1hcHBpbmcuZ2V0S2V5cygpOwotCi0gICAgICAgIFN0cmluZyBtZXRhRGF0YUtleTsKLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsKLQotICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YURhdGFLZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSBtYXBwaW5nLmdldFN0cmluZyhtZXRhRGF0YUtleSk7Ci0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWV0YURhdGFLZXksIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBtZXRhRGF0YUtleSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2UobWV0YURhdGFLZXkpOwotICAgICAgICBlbnRyeS5zZXRUYXJnZXQodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsKLSAgICAgICAgdGhpcy5tYXBwaW5ncy5hZGQoZW50cnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OTM5NjguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yIGltcGxlbWVudHMgUmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRJbnRlcmNlcHRvcklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJldHVyblZhbHVlT25Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKAotICAgICAgICBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIHNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24sIE9iamVjdCBjdXJyZW50UmV0dXJuVmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gY3VycmVudFJldHVyblZhbHVlOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBiZWZvcmUKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJlZm9yZURlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGFmdGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTNiMWI2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlJbmZvcm1hdGlvbiB0aGUgaW5mb3JtYXRpb24gZW50cnkgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3BlcnR5DQotICAgICAqLw0KLSAgICB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9SZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9SZW5kZXJlckludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMWYwNTQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEFsbG93cyB0byBpbnRlcmNlcHQgcmVuZGVyZXIgbWV0aG9kcy48YnIvPgotICogQmFzZSBtZWNoYW5pc20gb2YgZXh0dmFsLiBJdCBhbGxvd3MgdG8gYWRkIGN1c3RvbSBpbmZyYXN0cnVjdHVyZXMuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIFJlbmRlcmVySW50ZXJjZXB0b3IKLXsKLSAgICBTdHJpbmcgZ2V0SW50ZXJjZXB0b3JJZCgpOwotCi0gICAgT2JqZWN0IGdldFJldHVyblZhbHVlT25Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKAotICAgICAgICBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIHNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24sIE9iamVjdCBjdXJyZW50UmV0dXJuVmFsdWUpOwotCi0gICAgLyoKLSAgICAgKiBiZWZvcmUKLSAgICAgKi8KLSAgICB2b2lkIGJlZm9yZURlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlRW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIC8qCi0gICAgICogYWZ0ZXIKLSAgICAgKi8KLSAgICB2b2lkIGFmdGVyRGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyRW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YzA5YWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEFsbG93cyB0byBpbnRlcmNlcHQgdmFsaWRhdGlvciBleGNlcHRpb25zLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAqIEBwYXJhbSBtZXRhRGF0YUVudHJ5IHRoZSBtZXRhIGRhdGEgZW50cnkgd2hpY2ggY29udGFpbnMgdGhlIG1ldGEgZGF0YSBvZiB0aGUgcHJvcGVydHkNCi0gICAgICogQHBhcmFtIGNvbnZlcnRlZE9iamVjdCB0aGUgY29udmVydGVkIHVzZXIgaW5wdXQNCi0gICAgICogQHBhcmFtIHZhbGlkYXRvckV4Y2VwdGlvbiB0aGUgY3VycmVudCBleGNlcHRpb24NCi0gICAgICogQHBhcmFtIHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IHdoaWNoIHRocmV3IHRoZSBleGNlcHRpb24NCi0gICAgICogQHJldHVybiBmYWxzZSB0byBzdG9wIHRocm93aW5nIHRoZSBleGNlcHRpb24NCi0gICAgICovDQotICAgIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NTY5NDkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXIuUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW5pdENvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYoISh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCB0byBpbml0IGNvbXBvbmVudCAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsKLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOwotCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gRXh0VmFsVXRpbHMuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IG1ldGFEYXRhRXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCkuZ2V0TWV0YURhdGFFbnRyaWVzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKGVudHJ5LmdldEtleSgpKTsKLQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCFza2lwVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uU3RyYXRlZ3ksIGVudHJ5KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSBFeHRWYWxVdGlscy5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKG1ldGFEYXRhID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZighbWV0YURhdGEuaXNFbXB0eSgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlNLSVBfVkFMSURBVElPTiwgQm9vbGVhbi5jbGFzcykpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04sIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vZ2V0IGNvbXBvbmVudCBpbml0aWFsaXplciBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50IGFuZCBjb25maWd1cmUgaXQKLSAgICAgICAgICAgICAgICAvL2Fsc28gaW4gY2FzZSBvZiBza2lwcGVkIHZhbGlkYXRpb24gdG8gcmVzZXQgZS5nLiB0aGUgcmVxdWlyZWQgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgaWYoIW1ldGFEYXRhLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbmZpZ3VyZUNvbXBvbmVudFdpdGhNZXRhRGF0YShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJpbml0IGNvbXBvbmVudCBvZiAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0ID0gd3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLQotICAgICAgICAvL3JlY29yZGUgdXNlciBpbnB1dCBlLmcuIGZvciBjcm9zcy1jb21wb25lbnQgdmFsaWRhdGlvbgotICAgICAgICBmb3IoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciByZWNvcmRlciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlY29yZGVyLnJlY29yZFVzZXJJbnB1dCh1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsKLQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHJlY29yZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjYWxsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9jZXNzVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbnZlcnRlckV4Y2VwdGlvbihlLmdldEZhY2VzTWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQotICAgIHsKLSAgICAgICAgaWYgKCEodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgdmFsaWRhdGlvbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsKLQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IEV4dFZhbFV0aWxzLmdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKCk7Ci0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KS5nZXRNZXRhRGF0YUVudHJpZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOwotCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoc2tpcFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblN0cmF0ZWd5LCBlbnRyeSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvL3JlcXVpcmVkIGlzIGEgc3BlY2lhbCBjYXNlIC0gcmVzZXQgaXQKLSAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZChmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInZhbGlkYXRlICIgKyBlbnRyeS5nZXRWYWx1ZSgpICsgIiB3aXRoICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyB2YWxpZGF0aW9uIHN0cmF0ZWd5IGZvdW5kIGZvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJ2YWxpZGF0aW9uIGZpbmlzaGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBza2lwVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBlbnRyeSkKLSAgICB7Ci0gICAgICAgIC8vb3ZlcnJpZGUgZm9yIGN1c3RvbSBza2lwIHZhbGlkYXRpb24gc3VwcG9ydCAoaWYgbmVlZGVkKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2QzODY1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQSBnZW5lcmljIGltcGxlbWVudGF0aW9uLiBTdWJjbGFzc2VzIGp1c3QgaGF2ZSB0byBub3cgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBuYW1lIG1hcHBlci4NCi0gKg0KLSAqIE5hbWVNYXBwZXJzIGFyZSBzdGF0ZWxlc3MuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VD4gaW1wbGVtZW50cyBOYW1lTWFwcGVyPFQ+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLSAgICBwcml2YXRlIE5hbWVNYXBwZXI8VD4gY3VzdG9tTmFtZU1hcHBlcjsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFQgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZiAoY3VzdG9tTmFtZU1hcHBlciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCk7DQotDQotICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTmFtZU1hcHBlciA9IChOYW1lTWFwcGVyPFQ+KSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKGN1c3RvbU5hbWVNYXBwZXIgIT0gbnVsbCkgPyBjdXN0b21OYW1lTWFwcGVyLmNyZWF0ZU5hbWUoc291cmNlKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDYwNzhkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgZm9yIG5hbWUgbWFwcGVycy4NCi0gKiBBIG5hbWUgbWFwcGVyIGNhbGN1bGF0ZXMgYSBuYW1lIGZvciBhIGdpdmVuIHNvdXJjZSBvYmplY3QuDQotICogZS5nLiBNZXRhLURhdGEgS2V5IChlLmcuOiBhbm5vdGF0aW9uIGNsYXNzIG5hbWUpIC0+IFZhbGlkYXRpb25TdHJhdGVneQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBOYW1lTWFwcGVyPFQ+DQotew0KLSAgICBTdHJpbmcgY3JlYXRlTmFtZShUIHNvdXJjZSk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL0NvbW1vbk1ldGFEYXRhS2V5cy5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvQ29tbW9uTWV0YURhdGFLZXlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3Y2M0MzEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvQ29tbW9uTWV0YURhdGFLZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGhlbHBlciBmb3IgZnJlcXVlbnQgbWV0YS1kYXRhIGtleXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogcGxhY2VkIGluIGNvcmUgdG8gYXZvaWQgZHVwbGljYXRlZCBpbmZvcm1hdGlvbiBpbiBtdWx0aXBsZSBtb2R1bGVzICh2YWxpZGF0aW9uIG1vZHVsZSBhbmQgY29tcG9uZW50LXN1cHBvcnQgbW9kdWxlKQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBDb21tb25NZXRhRGF0YUtleXMNCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRUQgPSAicmVxdWlyZWQiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQUtfUkVRVUlSRUQgPSAid2Vha19yZXF1aXJlZCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOX0xFTkdUSCA9ICJtaW5fbGVuZ3RoIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfTEVOR1RIID0gIm1heF9sZW5ndGgiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01JTiA9ICJyYW5nZV9taW4iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01BWCA9ICJyYW5nZV9tYXgiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVFRFUk4gPSAicGF0dGVybiI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUVEVSTl9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UgPSAicGF0dGVybl92YWxpZGF0aW9uX2Vycm9yX21lc3NhZ2UiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQUlMID0gImVtYWlsIjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT00gPSAiY3VzdG9tIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lQX1ZBTElEQVRJT04gPSAic2tpcF92YWxpZGF0aW9uIjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvTWV0YURhdGFFbnRyeS5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvTWV0YURhdGFFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTU0NTgyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL01ldGFEYXRhRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBEYXRhIGhvbGRlciB3aGljaCBzdG9yZXMgdGhlIG1ldGEtZGF0YSBhbmQgc29tZSBpbmZvcm1hdGlvbiB3aGVyZSB0aGUgbWV0YS1kYXRhIHdhcyBhcm91bmQuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgTWV0YURhdGFFbnRyeQotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBrZXk7Ci0gICAgcHJpdmF0ZSBPYmplY3QgdmFsdWU7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgic2V0dGluZyBtZXRhLWRhdGEga2V5OiAiICsga2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gVCBnZXRWYWx1ZShDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVClnZXRWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJzZXR0aW5nIG1ldGEtZGF0YSB2YWx1ZTogIiArIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpZ2V0UHJvcGVydHkoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgibmV3IHByb3BlcnR5IGFkZGVkIGtleTogIiArIGtleSArICIgdmFsdWU6ICIgKyB2YWx1ZSArICIgZm9yIG1ldGFkYXRhLWtleTogIiArIHRoaXMua2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMucHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzJmNGE3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGFsbCBmYWN0b3JpZXMgd2hpY2ggY3JlYXRlIG1ldGEtZGF0YSBleHRyYWN0b3JzCi0gKiAKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkKLXsKLSAgICBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGUoKTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU4OWM5MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIGV4dHJhY3RzIG1ldGEtZGF0YSAoZS5nLiB0aGUgYW5ub3RhdGlvbnMpIG9mIHRoZSB2YWx1ZSBiaW5kaW5nIG9mIGEgY29tcG9uZW50LgotICogSXQgZXh0cmFjdHMgdGhlIG1ldGEtZGF0YSBvZiB0aGUgZmllbGQgYW5kIHRoZSBwcm9wZXJ0eS4KLSAqIChBbHNvIHRoZSBhbm5vdGF0aW9ucyBvZiBzdXBlciBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzLikKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvciBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdG9yCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHB1YmxpYyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVG9EbyhQcmlvcml0eS5NRURJVU0pCi0gICAgcHVibGljIFByb3BlcnR5SW5mb3JtYXRpb24gZXh0cmFjdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKCk7Ci0KLSAgICAgICAgLy9zaG91bGQgbmV2ZXIgb2NjdXIKLSAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgVUlDb21wb25lbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkgJiYgb2JqZWN0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihvYmplY3QuZ2V0Q2xhc3MoKSArICIgaXMgbm8gdmFsaWQgY29tcG9uZW50Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50ID0gKFVJQ29tcG9uZW50KSBvYmplY3Q7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgZXh0cmFjdGluZyBtZXRhLWRhdGEgb2YgIiArIHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAocHJvcGVydHlEZXRhaWxzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZ2V0IGJlYW4gY2xhc3MgYW5kIHByb3BlcnR5IG5hbWUKLSAgICAgICAgICovCi0gICAgICAgIENsYXNzIGVudGl0eUNsYXNzID0gcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpOwotCi0gICAgICAgIC8vY3JlYXRlCi0gICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uc2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBmaW5kIGFuZCBhZGQgYW5ub3RhdGlvbnMKLSAgICAgICAgICovCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IGVudGl0eUNsYXNzOwotCi0gICAgICAgIHdoaWxlICghT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY3VycmVudENsYXNzLmdldE5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoY3VycmVudENsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgICAgICBhZGRGaWVsZEFjY2Vzc0Fubm90YXRpb25zKGN1cnJlbnRDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhjdXJyZW50Q2xhc3MsIHByb3BlcnR5RGV0YWlscywgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0KLSAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHRyYWN0IGZpbmlzaGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ludGVyZmFjZXMoCi0gICAgICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MsIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMsIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IGN1cnJlbnRDbGFzcy5nZXRJbnRlcmZhY2VzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoY3VycmVudEludGVyZmFjZSwgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhjdXJyZW50SW50ZXJmYWNlLCBwcm9wZXJ0eURldGFpbHMsIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIHByb3BlcnR5ID0gcHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSk7Ci0KLSAgICAgICAgTWV0aG9kIG1ldGhvZDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0aG9kID0gZW50aXR5LmdldERlY2xhcmVkTWV0aG9kKCJnZXQiICsgcHJvcGVydHkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kID0gZW50aXR5LmdldERlY2xhcmVkTWV0aG9kKCJpcyIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJtZXRob2Qgbm90IGZvdW5kIC0gY2xhc3M6ICIgKyBlbnRpdHkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgLSBtZXRob2RzOiAiICsgImdldCIgKyBwcm9wZXJ0eSArICIgIiArICJpcyIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoQXJyYXlzLmFzTGlzdChtZXRob2QuZ2V0QW5ub3RhdGlvbnMoKSksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBGaWVsZCBmaWVsZDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmllbGQgPSBlbnRpdHkuZ2V0RGVjbGFyZWRGaWVsZChwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWVsZCA9IGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKCJfIiArIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZmllbGQgIiArIHByb3BlcnR5ICsgIiBvciBfIiArIHByb3BlcnR5ICsgIiBub3QgZm91bmQiLCBlMSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoQXJyYXlzLmFzTGlzdChmaWVsZC5nZXRBbm5vdGF0aW9ucygpKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoCi0gICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMsIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uYWRkTWV0YURhdGFFbnRyeShjcmVhdGVNZXRhRGF0YUVudHJ5Rm9yQW5ub3RhdGlvbihhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShhbm5vdGF0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmb3VuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1ldGFEYXRhRW50cnkgY3JlYXRlTWV0YURhdGFFbnRyeUZvckFubm90YXRpb24oQW5ub3RhdGlvbiBmb3VuZEFubm90YXRpb24pCi0gICAgewotICAgICAgICBNZXRhRGF0YUVudHJ5IGVudHJ5ID0gbmV3IE1ldGFEYXRhRW50cnkoKTsKLQotICAgICAgICBlbnRyeS5zZXRLZXkoZm91bmRBbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgZW50cnkuc2V0VmFsdWUoZm91bmRBbm5vdGF0aW9uKTsKLQotICAgICAgICByZXR1cm4gZW50cnk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZDcwYWQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGlzIGZhY3RvcnkgY3JlYXRlcyBhIG1ldGEtZGF0YSBleHRyYWN0b3Igd2hpY2ggZXh0cmFjdHMgdGhlIG1ldGEtZGF0YQotICogb2YgdGhlIHZhbHVlIGJpbmRpbmcgb2YgYSBjb21wb25lbnQuCi0gKiA8cC8+Ci0gKiBvcmRlcjo8YnIvPgotICogPG9sPgotICogICA8bGk+Y29uZmlndXJlZCBtZXRhLWRhdGEgZXh0cmFjdG9yICh3ZWIueG1sKTwvbGk+Ci0gKiAgIDxsaT5jb25maWd1cmVkIG1ldGEtZGF0YSBleHRyYWN0b3IgKGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pPC9saT4KLSAqICAgPGxpPmRlZmF1bHQgaW1wbGVtZW50YXRpb248L2xpPgotICogPC9vbD4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkKLXsKLSAgICBwcml2YXRlIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gbnVsbDsKLQotICAgIHB1YmxpYyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQotICAgIHB1YmxpYyBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGUoKQotICAgIHsKLSAgICAgICAgaWYgKG1ldGFEYXRhRXh0cmFjdG9yID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SKTsKLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SKSk7Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMuYWRkKERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3IgPSAoTWV0YURhdGFFeHRyYWN0b3IpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1ldGFEYXRhRXh0cmFjdG9yICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKG1ldGFEYXRhRXh0cmFjdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjcmVhdGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvcihtZXRhRGF0YUV4dHJhY3Rvcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL01ldGFEYXRhRXh0cmFjdG9yLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0MDUxZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLQotLyoqCi0gKiBBbiBtZXRhLWRhdGEgZXh0cmFjdG9yIGlzIHJlc3BvbnNpYmxlIHRvIGFuYWx5emUgYW4gb2JqZWN0Ci0gKiBhbmQgcmV0dXJucyBhbGwgYXZhaWxhYmxlIG1ldGEtZGF0YSBpbmZvcm1hdGlvbgotICogCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFFeHRyYWN0b3IKLXsKLSAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njk5MTJhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSBlcXVpdmFsZW50IHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0Lg0KLSAqDQotICogaWYgdGhlcmUgaXMgYWxzbyBhIHByb3h5IGZvciB0aGUgZXh0cmFjdG9yIHlvdSBjYW4gdXNlIHRoZSBjbGFzc05hbWUgcHJvcGVydHkgdG8gbWFudWFsbHkgcmVwZWF0IHRoZQ0KLSAqIGZ1bGwgcXVhbGlmaWVkIGNsYXNzIG5hbWUuDQotICoNCi0gKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgaW50ZXJmYWNlIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlciBleHRlbmRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlYTgxOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgZXF1aXZhbGVudCB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0gKg0KLSAqIGlmIHRoZXJlIGlzIGFsc28gYSBwcm94eSBmb3IgdGhlIHRyYW5zZm9ybWVyIHlvdSBjYW4gdXNlIHRoZSBjbGFzc05hbWUgcHJvcGVydHkgdG8gbWFudWFsbHkgcmVwZWF0IHRoZQ0KLSAqIGZ1bGwgcXVhbGlmaWVkIGNsYXNzIG5hbWUuDQotICoNCi0gKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgY2xhc3MgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbCBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXIsIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIHByaXZhdGUgU3RyaW5nIG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWU7DQotDQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKG1ldGFEYXRhRW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoU3RyaW5nIG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSA9IG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhVHJhbnNmb3JtZXIoTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXIgPSBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNTE2MmIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotDQotLyoqDQotICogRmFjdG9yeSB3aGljaCBjcmVhdGVzIHRoZSBNZXRhRGF0YVRyYW5zZm9ybWVyIGZvciBhIGdpdmVuIFZhbGlkYXRpb25TdHJhdGVneQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotLyoNCi0gKiBWYWxpZGF0aW9uU3RyYXRlZ3kgLT4gTWV0YURhdGFUcmFuc2Zvcm1lciBpbnN0ZWFkIG9mIE1ldGEtRGF0YSAtPiBNZXRhRGF0YVRyYW5zZm9ybWVyDQotICogdG8gYXZvaWQgYSBzZWNvbmQgc3RhdGljIG1hcHBpbmcgZS5nLiBmb3IganBhIGFubm90YXRpb25zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneT4NCi0gICAgICAgIGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1ldGFEYXRhVHJhbnNmb3JtZXI+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZzsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgY3JlYXRlKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lID0gbnVsbDsNCi0NCi0gICAgICAgIC8vcHJveHkgY2hlY2sNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICAvL2luIGNhc2Ugb2YgYSBwcm94eSBhbmQgdGhlIHVzYWdlIG9mIGEgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi0gICAgICAgIGVsc2UgaWYgKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgPSAoKEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKXZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljTWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHZhbGlkYXRpb25TdHJhdGVneU5hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoTWV0YURhdGFUcmFuc2Zvcm1lcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcuZ2V0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgIFN0cmluZyB0cmFuc2Zvcm1lck5hbWU7DQotICAgICAgICAvL251bGwgLT4gdXNlIG5hbWUgbWFwcGVycw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyYW5zZm9ybWVyTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lck5hbWUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyID0gKE1ldGFEYXRhVHJhbnNmb3JtZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHRyYW5zZm9ybWVyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneU5hbWUgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYWRkTWFwcGluZyh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCB0cmFuc2Zvcm1lck5hbWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgLy9zZXR1cCBpbnRlcm5hbCBzdGF0aWMgbWFwcGluZ3MNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnIDoNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhtYXBwaW5nLmdldFNvdXJjZSgpLCBtYXBwaW5nLmdldFRhcmdldCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0cmFuc2Zvcm1lck5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkaW5nIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWV0YS1kYXRhIHRyYW5zZm9ybWVyIG1hcHBpbmc6ICINCi0gICAgICAgICAgICAgICAgKyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgIiAtPiAiICsgdHJhbnNmb3JtZXJOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcucHV0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIHRyYW5zZm9ybWVyTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNTA0YjIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gdHJhbnNmb3JtIGNvbmNyZXRlIG1ldGEtZGF0YSB0byBhIG1vcmUgYWJzdHJhY3QgZm9ybS48YnIvPg0KLSAqIGUuZy46IEBSZXF1aXJlZCwgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLC4uLiksIEBMZW5ndGgobWluaW11bSA9IDEpLCAuLi4gLT4gcmVxdWlyZWQgPSB0cnVlDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotLy8qVHJhbnNmb3JtZXIgaW5zdGVhZCBvZiAqQ29udmVydGVyIHRvIGF2b2lkIG5hbWluZyBjb25mdXNpb24gDQotcHVibGljIGludGVyZmFjZSBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGFkYzE2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ3MjJhOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciAtIGlmIHRoZXJlIGlzIGEgcHJveHkgYXJvdW5kIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5Lg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoKEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKXZhbGlkYXRpb25TdHJhdGVneSkuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3YjJkOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gTWV0YURhdGFUcmFuc2Zvcm1lcnMuDQotICogKGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2FjZDExLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1ldGFEYXRhVHJhbnNmb3JtZXJzLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyODY4Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBtYXBzIEV4dFZhbCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBnZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1YjUzZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciB0byBwbGFjZSBWYWxpZGF0aW9uU3RyYXRlZ2llcyBhbmQgTWV0YURhdGFUcmFuc2Zvcm1lcnMgaW4gdGhlIHNhbWUgcGFja2FnZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGdldFNpbXBsZU1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkgKyAiLiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNpbXBsZU1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lQYWNrYWdlTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHBvc3RmaXggPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfUE9TVEZJWCk7DQotDQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUuZW5kc1dpdGgoIlZhbGlkYXRpb25TdHJhdGVneSIpIHx8DQotICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUuZW5kc1dpdGgoIlN0cmF0ZWd5IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneVBhY2thZ2VOYW1lICsgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lDQotICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgpICxwb3N0Zml4KQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoIlZhbGlkYXRpb25TdHJhdGVneSIsIHBvc3RmaXgpDQotICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgiU3RyYXRlZ3kiLCBwb3N0Zml4KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vaW4gY2FzZSBvZiBhIHN0YXRpYyB2YWxpZGF0aW9uIHN0cmF0ZWd5IG1hcHBpbmcNCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lQYWNrYWdlTmFtZSArIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSArIHBvc3RmaXg7DQotICAgIH0NCi0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24uamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NWY1MjguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uIGltcGxlbWVudHMgUHJvcGVydHlJbmZvcm1hdGlvbgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gaW5mb3JtYXRpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICBwcml2YXRlIExpc3Q8TWV0YURhdGFFbnRyeT4gbWV0YURhdGFMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUVudHJ5PigpOwotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNJbmZvcm1hdGlvbihTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZm9ybWF0aW9uTWFwLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZm9ybWF0aW9uTWFwLmdldChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gVCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVCkgZ2V0SW5mb3JtYXRpb24oa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgibmV3IGluZm9ybWF0aW9uIGFkZGVkIGtleTogIiArIGtleSArICIgdmFsdWU6ICIgKyB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmZvcm1hdGlvbk1hcC5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGFEYXRhRW50cnlbXSBnZXRNZXRhRGF0YUVudHJpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhTGlzdC50b0FycmF5KG5ldyBNZXRhRGF0YUVudHJ5W21ldGFEYXRhTGlzdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXRhRGF0YUVudHJ5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkKLSAgICB7Ci0gICAgICAgIG1ldGFEYXRhRW50cnkuc2V0UHJvcGVydGllcyh0aGlzLmluZm9ybWF0aW9uTWFwKTsKLSAgICAgICAgdGhpcy5tZXRhRGF0YUxpc3QuYWRkKG1ldGFEYXRhRW50cnkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0TWV0YURhdGFFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJyZXNldHRpbmcgbWV0YS1kYXRhIGVudHJpZXMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMubWV0YURhdGFMaXN0LmNsZWFyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlEZXRhaWxzLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eURldGFpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwMzdjZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eURldGFpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eURldGFpbHMKLXsKLSAgICAvL2Zvcm1zIHRoZSBpZCBmb3IgY3Jvc3MtdmFsaWRhdGlvbiB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzCi0gICAgcHJpdmF0ZSBTdHJpbmcga2V5OwotICAgIHByaXZhdGUgT2JqZWN0IGJhc2VPYmplY3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlEZXRhaWxzKFN0cmluZyBrZXksIE9iamVjdCBiYXNlT2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICAgICAgdGhpcy5iYXNlT2JqZWN0ID0gYmFzZU9iamVjdDsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJhc2VPYmplY3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJhc2VPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZU9iamVjdChPYmplY3QgYmFzZU9iamVjdCkKLSAgICB7Ci0gICAgICAgIHRoaXMuYmFzZU9iamVjdCA9IGJhc2VPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb24uamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5Mjg0Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5SW5mb3JtYXRpb24KLXsKLSAgICBib29sZWFuIGNvbnRhaW5zSW5mb3JtYXRpb24oU3RyaW5nIGtleSk7Ci0gICAgT2JqZWN0IGdldEluZm9ybWF0aW9uKFN0cmluZyBrZXkpOwotICAgIDxUPiBUIGdldEluZm9ybWF0aW9uKFN0cmluZyBrZXksIENsYXNzPFQ+IHRhcmdldENsYXNzKTsKLSAgICB2b2lkIHNldEluZm9ybWF0aW9uKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSk7Ci0KLSAgICBNZXRhRGF0YUVudHJ5W10gZ2V0TWV0YURhdGFFbnRyaWVzKCk7Ci0gICAgdm9pZCBhZGRNZXRhRGF0YUVudHJ5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSk7Ci0gICAgdm9pZCByZXNldE1ldGFEYXRhRW50cmllcygpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZTkyNWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlJbmZvcm1hdGlvbktleXMKLXsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFVEFJTFMgPSAicHJvcGVydHlfZGV0YWlscyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lQX1ZBTElEQVRJT04gPSAic2tpcF92YWxpZGF0aW9uIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gImxhYmVsIjsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlY29yZGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlY29yZGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwZjIzZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZWNvcmRlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotCi0vKioKLSAqIEFsbG93cyB0byBjYXB0dXJlIGNvbnZlcnRlZCB2YWx1ZXMuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIKLXsKLSAgICB2b2lkIHJlY29yZFVzZXJJbnB1dChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWRlNWM0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLQotLyoqCi0gKiBCYXNlIGZvciBhbGwgUmVuZGVyS2l0V3JhcHBlckZhY3RvcmllcyB0byBmb3JjZSBhIHNwZWNpZmljIGJlaGF2aW91cgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFJlbmRlcktpdCwgUmVuZGVyS2l0PgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSB3cmFwcGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBkZWFjdGl2YXRlZCA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeShBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRoaXMud3JhcHBlZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLndyYXBwZWQuYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkocmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkZWFjdGl2YXRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5kZWFjdGl2YXRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWFjdGl2YXRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVhY3RpdmF0ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFJlbmRlcktpdCBjcmVhdGUoUmVuZGVyS2l0IHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIGlmKGlzRGVhY3RpdmF0ZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBSZW5kZXJLaXQgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBpZih0aGlzLndyYXBwZWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy53cmFwcGVkLmNyZWF0ZShyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVXcmFwcGVyKHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3ZTA1MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ci17Ci0gICAgcHJpdmF0ZSBSZW5kZXJLaXQgcmVuZGVyS2l0OwotCi0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCBjcmVhdGVXcmFwcGVyKFJlbmRlcktpdCByZW5kZXJLaXQpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVya2l0IHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcktpdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLnJlbmRlcktpdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnJlbmRlcktpdCA9IG5ldyBFeHRWYWxSZW5kZXJLaXQocmVuZGVyS2l0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJLaXQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxMYXp5UmVuZGVyZXJQcm94eS5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbExhenlSZW5kZXJlclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMzYyODcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbExhenlSZW5kZXJlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotCi0vKioKLSAqIHRvIHN1cHBvcnQgYSBjdXN0b20gcHJveHkKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkgZXh0ZW5kcyBSZW5kZXJlcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIFJlbmRlcmVyIHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSByZW5kZXJlcjsKLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzaW1wbGUgcHJveHkgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZXRMYXp5UmVuZGVyZXIoKS5lbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZXRMYXp5UmVuZGVyZXIoKS5lbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydENsaWVudElkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldExhenlSZW5kZXJlcigpLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGdldFJlbmRlcnNDaGlsZHJlbigpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRMYXp5UmVuZGVyZXIoKS5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlbmRlcmVyIGdldExhenlSZW5kZXJlcigpCi0gICAgewotICAgICAgICBTdHJpbmcgcHJveHlDbGFzc05hbWUgPSAoU3RyaW5nKSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSk7Ci0KLSAgICAgICAgaWYocHJveHlDbGFzc05hbWUgIT0gbnVsbCAmJiAhcHJveHlDbGFzc05hbWUuZW5kc1dpdGgoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKHByb3h5Q2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgaWYodGFyZ2V0Q2xhc3MgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhIGN1c3RvbSBpbnZhbGlkIHJlbmRlcmVyIHByb3h5IGlzIGNvbmZpZ3VyZWQ6ICIgKyBwcm94eUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENsYXNzW10gYXJnQ2xhc3NlcyA9IG5ldyBDbGFzc1sxXTsKLSAgICAgICAgICAgIGFyZ0NsYXNzZXNbMF0gPSBSZW5kZXJlci5jbGFzczsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSB0YXJnZXRDbGFzcy5nZXRDb25zdHJ1Y3RvcihhcmdDbGFzc2VzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFJlbmRlcmVyKWNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBjcmVhdGU6ICIgKyB0YXJnZXRDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkOwotICAgICAgICB9Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjM1NGU1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VTdHJlYW07Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVdyaXRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVzcG9uc2VTdGF0ZU1hbmFnZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJLaXQgZXh0ZW5kcyBSZW5kZXJLaXQKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgd3JhcHBlZDsKLQotICAgIHB1YmxpYyBFeHRWYWxSZW5kZXJLaXQoUmVuZGVyS2l0IHdyYXBwZWQpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOwotCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICBpZiAocmVuZGVyZXIgaW5zdGFuY2VvZiBFeHRWYWxSZW5kZXJlcldyYXBwZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIHJlbmRlcmVyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIGNyZWF0ZVdyYXBwZXIocmVuZGVyZXIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBSZW5kZXJlciBnZXRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSB3cmFwcGVkLmdldFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlKTsKLQotICAgICAgICBpZihyZW5kZXJlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyZXIgaW5zdGFuY2VvZiBFeHRWYWxSZW5kZXJlcldyYXBwZXIgPyByZW5kZXJlciA6IGNyZWF0ZVdyYXBwZXIocmVuZGVyZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCJubyByZW5kZXJlciBmb3VuZCBmb3IgZmFtaWx5ICIgKyBmYW1pbHkgKyAiIGFuZCB0eXBlICIgKyByZW5kZXJlclR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlbmRlcmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZVN0YXRlTWFuYWdlciBnZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZVdyaXRlciBjcmVhdGVSZXNwb25zZVdyaXRlcihXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcywgU3RyaW5nIHMxKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY3JlYXRlUmVzcG9uc2VXcml0ZXIod3JpdGVyLCBzLCBzMSk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlU3RyZWFtIGNyZWF0ZVJlc3BvbnNlU3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jcmVhdGVSZXNwb25zZVN0cmVhbShvdXRwdXRTdHJlYW0pOwotICAgIH0KLQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIGNyZWF0ZVdyYXBwZXIoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEV4dFZhbFJlbmRlcmVyV3JhcHBlcihyZW5kZXJlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyODJiYmMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeTsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBjZW50cmFsIG1lY2hhbmlzbSB3aGljaCBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgYSB3cmFwcGVyIGZvciBhIHJlbmRlcmVyIC0gc3RhcnRpbmcgcG9pbnQgb2YgZXh0dmFsLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeSBleHRlbmRzIFJlbmRlcktpdEZhY3RvcnkKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotICAgIHByaXZhdGUgUmVuZGVyS2l0RmFjdG9yeSB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcktpdEZhY3RvcnkoUmVuZGVyS2l0RmFjdG9yeSByZW5kZXJLaXRGYWN0b3J5KQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyS2l0RmFjdG9yeTsKLQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcktpdChTdHJpbmcgcywgUmVuZGVyS2l0IHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIHdyYXBwZWQuYWRkUmVuZGVyS2l0KHMsIHJlbmRlcktpdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlbmRlcktpdCBnZXRSZW5kZXJLaXQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICBSZW5kZXJLaXQgcmVuZGVyS2l0ID0gdGhpcy53cmFwcGVkLmdldFJlbmRlcktpdChmYWNlc0NvbnRleHQsIHMpOwotCi0gICAgICAgIC8vanNmIHJpICsgdHJpbmlkYWQKLSAgICAgICAgaWYocmVuZGVyS2l0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSB3cmFwcGVyRmFjdG9yeSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgIC8vc29tZSBjb21wb25lbnQgbGlicyBlLmcuIG15ZmFjZXMtdHJpbmlkYWQgYXJlbid0IGNvbXBhdGlibGUgd2l0aCB0aGlzIGNsZWFuIGFwcHJvYWNoCi0gICAgICAgIC8vZXhhbXBsZSBzZWUgVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIKLSAgICAgICAgaWYod3JhcHBlckZhY3RvcnkuaXNEZWFjdGl2YXRlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJGYWN0b3J5LmNyZWF0ZShyZW5kZXJLaXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGdldFJlbmRlcktpdElkcygpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZW5kZXJLaXRJZHMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkzNGZlMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogdG8gYXZvaWQgbXVsdGlwbGUgY2FsbHMgb2YgcmVuZGVyZXIgbWV0aG9kcyB3aXRoaW4gcmVuZGVyZXIgaW50ZXJjZXB0b3JzIChlLmcuIGZvciBlbmNvZGUsIGRlY29kZSwuLi4pCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJlclByb3h5IGV4dGVuZHMgUmVuZGVyZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVkgPSBFeHRWYWxSZW5kZXJlclByb3h5LmNsYXNzLmdldE5hbWUoKSArICI6S0VZIjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotICAgIAotICAgIHByb3RlY3RlZCBSZW5kZXJlciB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcmVyUHJveHkoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSByZW5kZXJlcjsKLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eUVudHJ5IGVudHJ5ID0gZ2V0T3JJbml0RW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0RlY29kZUNhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXREZWNvZGVDYWxsZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlZC5kZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZG91YmxlIGNhbGwgb2YgbWV0aG9kICdkZWNvZGUnIGZpbHRlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5RW50cnkgZW50cnkgPSBnZXRPckluaXRFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRW5jb2RlQmVnaW5DYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RW5jb2RlQmVnaW5DYWxsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLndyYXBwZWQuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZG91YmxlIGNhbGwgb2YgbWV0aG9kICdlbmNvZGVCZWdpbicgZmlsdGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlFbnRyeSBlbnRyeSA9IGdldE9ySW5pdEVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNFbmNvZGVDaGlsZHJlbkNhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXRFbmNvZGVDaGlsZHJlbkNhbGxlZCh0cnVlKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVkLmVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImRvdWJsZSBjYWxsIG9mIG1ldGhvZCAnZW5jb2RlQ2hpbGRyZW4nIGZpbHRlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eUVudHJ5IGVudHJ5ID0gZ2V0T3JJbml0RW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0VuY29kZUVuZENhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXRFbmNvZGVFbmRDYWxsZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlZC5lbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZG91YmxlIGNhbGwgb2YgbWV0aG9kICdlbmNvZGVFbmQnIGZpbHRlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5jb252ZXJ0Q2xpZW50SWQoZmFjZXNDb250ZXh0LCBzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGdldFJlbmRlcnNDaGlsZHJlbigpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gdCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgIHRocm93IHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eUVudHJ5IGVudHJ5ID0gZ2V0T3JJbml0RW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKGVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW50cnkuc2V0Q29udmVydGVkVmFsdWUod3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZG91YmxlIGNhbGwgb2YgbWV0aG9kICdnZXRDb252ZXJ0ZWRWYWx1ZScgZmlsdGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlbmRlcmVyUHJveHlFbnRyeSBnZXRPckluaXRFbnRyeShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGtleSArPSBnZXRPcHRpb25hbEtleShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWdldE9ySW5pdENvbXBvbmVudFByb3h5TWFwcGluZygpLmNvbnRhaW5zS2V5KGtleSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldE9ySW5pdENvbXBvbmVudFByb3h5TWFwcGluZygpLnB1dChrZXksIG5ldyBSZW5kZXJlclByb3h5RW50cnkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldE9ySW5pdENvbXBvbmVudFByb3h5TWFwcGluZygpLmdldChrZXkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3B0aW9uYWxLZXkoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX1NUT1JBR0VfTkFNRSA9IEV4dFZhbFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpICsgIjpTVE9SQUdFIjsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eUVudHJ5PiBnZXRPckluaXRDb21wb25lbnRQcm94eU1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgTWFwIHJlcXVlc3RNYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpOwotCi0gICAgICAgIGlmKCFyZXF1ZXN0TWFwLmNvbnRhaW5zS2V5KFBST1hZX1NUT1JBR0VfTkFNRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcXVlc3RNYXAucHV0KFBST1hZX1NUT1JBR0VfTkFNRSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5RW50cnk+PigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlFbnRyeT4+IHByb3h5U3RvcmFnZSA9Ci0gICAgICAgICAgICAoKE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlFbnRyeT4+KXJlcXVlc3RNYXAuZ2V0KFBST1hZX1NUT1JBR0VfTkFNRSkpOwotCi0gICAgICAgIFN0cmluZyBrZXkgPSB0aGlzLndyYXBwZWQuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0KLSAgICAgICAgaWYoIXByb3h5U3RvcmFnZS5jb250YWluc0tleShrZXkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm94eVN0b3JhZ2UucHV0KGtleSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5RW50cnk+KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByb3h5U3RvcmFnZS5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgLy9yZXNldCBjb21wb25lbnQgcHJveHkgbWFwcGluZwotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnJlbW92ZShQUk9YWV9TVE9SQUdFX05BTUUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjMzA1ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUmVuZGVyZXJJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLQotLyoqCi0gKiBEZWZhdWx0IGFwcHJvYWNoIHRvIGF2b2lkIHByb3hpZXMgZm9yIGNvbnZlcnRlcnMgYW5kIHRoZSBhZGFwdGVyIGZhbGxiYWNrLgotICogSXQgcmVxdWlyZXMgdGhhdCBjb21wb25lbnRzIGRlbGVnYXRlIGdldENvbnZlcnRlZFZhbHVlIHRvIGEgcmVuZGVyZXIuPGJyLz4KLSAqIElmIGl0IGlzbid0IHRoZSBjYXNlIGZvciB5b3VyIGNvbXBvbmVudCBsaWIgdXNlOgotICogb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHkuRXh0VmFsQXBwbGljYXRpb25GYWN0b3J5PGJyLz4KLSAqIGFuZDxici8+Ci0gKiBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5Qcm94eU1hcHBpbmdQaGFzZUxpc3RlbmVyCi0gKiA8cC8+Ci0gKiBUaGlzIHdyYXBwZXIgd2lsbCBhbHNvIGltcGxlbWVudCBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIGJlaGF2aW91cgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyZXJXcmFwcGVyIGV4dGVuZHMgUmVuZGVyZXIKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIHdyYXBwZWQ7Ci0gICAgcHJvdGVjdGVkIEV4dFZhbENvbnRleHQgZXh0VmFsQ29udGV4dCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcmVyV3JhcHBlcihSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwcm94eUNsYXNzTmFtZSA9IChTdHJpbmcpRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVkpOwotCi0gICAgICAgIGlmKHByb3h5Q2xhc3NOYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNvbmZpZ3VyZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gbmV3IEV4dFZhbExhenlSZW5kZXJlclByb3h5KHJlbmRlcmVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUocHJveHlDbGFzc05hbWUpOwotCi0gICAgICAgIGlmKHRhcmdldENsYXNzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNvbmZpZ3VyZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gbmV3IEV4dFZhbExhenlSZW5kZXJlclByb3h5KHJlbmRlcmVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzW10gYXJnQ2xhc3NlcyA9IG5ldyBDbGFzc1sxXTsKLSAgICAgICAgYXJnQ2xhc3Nlc1swXSA9IFJlbmRlcmVyLmNsYXNzOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHRhcmdldENsYXNzLmdldENvbnN0cnVjdG9yKGFyZ0NsYXNzZXMpOwotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gKFJlbmRlcmVyKWNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHJlbmRlcmVyKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm5vIGV4dHZhbCByZW5kZXJlciBwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0dmFsIHJlbmRlcmVyIHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZURlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZURlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZGVjb2RlIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZURlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZURlY29kZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckRlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJEZWNvZGUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSB0cnVlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJlbmNvZGVCZWdpbiBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVCZWdpbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVCZWdpbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUNoaWxkcmVuIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImVuY29kZUNoaWxkcmVuIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUNoaWxkcmVuIG9mICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVDaGlsZHJlbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUNoaWxkcmVuIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZW5jb2RlRW5kIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVFbmQgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5lbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJFbmNvZGVFbmQgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlRW5kIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBjb252ZXJ0Q2xpZW50SWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jb252ZXJ0Q2xpZW50SWQoZmFjZXNDb250ZXh0LCBzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0gICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8sIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QgPSBlLmdldFJldHVyblZhbHVlT25FeGNlcHRpb24oY29udmVydGVkT2JqZWN0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJnZXRDb252ZXJ0ZWRWYWx1ZSBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlR2V0Q29udmVydGVkVmFsdWUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgY29udmVydGVkT2JqZWN0ID0gd3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyR2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbywgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRPYmplY3Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L1JlbmRlcmVyUHJveHlFbnRyeS5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L1JlbmRlcmVyUHJveHlFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWU1N2Y5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9SZW5kZXJlclByb3h5RW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBSZW5kZXJlclByb3h5RW50cnkKLXsKLSAgICBwcml2YXRlIGJvb2xlYW4gZGVjb2RlQ2FsbGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGVuY29kZUJlZ2luQ2FsbGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGVuY29kZUNoaWxkcmVuQ2FsbGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGVuY29kZUVuZENhbGxlZCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBPYmplY3QgY29udmVydGVkVmFsdWUgPSBudWxsOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWNvZGVDYWxsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlY29kZUNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWNvZGVDYWxsZWQoYm9vbGVhbiBkZWNvZGVDYWxsZWQpCi0gICAgewotICAgICAgICB0aGlzLmRlY29kZUNhbGxlZCA9IGRlY29kZUNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuY29kZUJlZ2luQ2FsbGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbmNvZGVCZWdpbkNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVCZWdpbkNhbGxlZChib29sZWFuIGVuY29kZUJlZ2luQ2FsbGVkKQotICAgIHsKLSAgICAgICAgdGhpcy5lbmNvZGVCZWdpbkNhbGxlZCA9IGVuY29kZUJlZ2luQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlQ2hpbGRyZW5DYWxsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVuY29kZUNoaWxkcmVuQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kZUNoaWxkcmVuQ2FsbGVkKGJvb2xlYW4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQpCi0gICAgewotICAgICAgICB0aGlzLmVuY29kZUNoaWxkcmVuQ2FsbGVkID0gZW5jb2RlQ2hpbGRyZW5DYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmNvZGVFbmRDYWxsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVuY29kZUVuZENhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVFbmRDYWxsZWQoYm9vbGVhbiBlbmNvZGVFbmRDYWxsZWQpCi0gICAgewotICAgICAgICB0aGlzLmVuY29kZUVuZENhbGxlZCA9IGVuY29kZUVuZENhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZWRWYWx1ZShPYmplY3QgY29udmVydGVkVmFsdWUpCi0gICAgewotICAgICAgICB0aGlzLmNvbnZlcnRlZFZhbHVlID0gY29udmVydGVkVmFsdWU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzJlZWY5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDllOTZjZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM3YzY0YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXJJbnRlcmNlcHRvciBleGNlcHRpb25Tb3VyY2U7Ci0gICAgcHJvdGVjdGVkIE9iamVjdCBpbmZvcm1hdGlvbjsKLSAgICBib29sZWFuIHNraXBPdGhlckludGVyY2VwdG9ycyA9IGZhbHNlOwotCi0gICAgcHVibGljIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbihib29sZWFuIHNraXBPdGhlckludGVyY2VwdG9ycykKLSAgICB7Ci0gICAgICAgIHRoaXMuc2tpcE90aGVySW50ZXJjZXB0b3JzID0gc2tpcE90aGVySW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzLCBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzKHNraXBPdGhlckludGVyY2VwdG9ycyk7Ci0gICAgICAgIHRoaXMuZXhjZXB0aW9uU291cmNlID0gcmVuZGVyZXJJbnRlcmNlcHRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvbihPYmplY3QgaW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICB0aGlzLmluZm9ybWF0aW9uID0gaW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gaW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNraXBPdGhlckludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJldHVyblZhbHVlT25FeGNlcHRpb24oT2JqZWN0IGN1cnJlbnRSZXR1cm5WYWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMuZXhjZXB0aW9uU291cmNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmV4Y2VwdGlvblNvdXJjZS5nZXRSZXR1cm5WYWx1ZU9uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbih0aGlzLCBjdXJyZW50UmV0dXJuVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjdXJyZW50UmV0dXJuVmFsdWU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIwOThiYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0Fic3RyYWN0U3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBJbiBvcmRlciB0byBleGVjdXRlIGxvZ2ljIGp1c3Qgb25jZS4NCi0gKiBlLmcuIHJlZ2lzdGVyIGFydGlmYWN0cyB2aWEgYXBpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lciBpbXBsZW1lbnRzIFBoYXNlTGlzdGVuZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIC8vZG9uJ3QgcmVtb3ZlIC0gaXQncyBhIGZhbGxiYWNrIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIGRlcmVnaXN0cmF0aW9uDQotICAgIC8vdGFyZ2V0OiBkb24ndCBwcm9jZXNzIGluaXQgbG9naWMgbW9yZSB0aGFuIG9uY2UNCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxDbGFzcz4gaW5pdGlhbGl6ZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIHN5bmNocm9uaXplZCAoQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuY2xhc3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCFpbml0aWFsaXplZExpc3RlbmVycy5jb250YWlucyhnZXRDbGFzcygpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydCBpbml0IG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbml0KCk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJpbml0IG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBmaW5hbGx5DQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgSnNmVXRpbHMuZGVyZWdpc3RlclBoYXNlTGlzdGVuZXIodGhpcyk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJhbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgZGVyZWdpc3RlcmluZyB0aGUgcGhhc2UtbGlzdGVuZXIiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldENsYXNzKCkuZ2V0TmFtZSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgLT4gdGhlcmUgaXMganVzdCBhIGxpdHRsZSBvdmVyaGVhZCwiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYnV0IGV2ZXJ5dGhpbmcgZWxzZSB3b3JrcyBjb3JyZWN0bHkuIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGhvd2V2ZXIsIHBsZWFzZSBpbmZvcm0gdGhlIGNvbW11bml0eSBhYm91dCB5b3VyIGNvbmZpZ3VyYXRpb24iLCB0KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBmaW5hbGx5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkTGlzdGVuZXJzLmFkZChnZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuUkVTVE9SRV9WSUVXOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXQoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9FeHRWYWxTdGFydHVwTGlzdGVuZXIuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YzM2MGEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9FeHRWYWxTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXIKLSAgICAgICAgLkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcgotewotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoRXh0VmFsSW5mb3JtYXRpb24uVkVSU0lPTiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydGluZyB1cCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIHYiICsgRXh0VmFsSW5mb3JtYXRpb24uVkVSU0lPTik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oInN0YXJ0aW5nIHVwIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgVmFsaWRhdGlvbkludGVyY2VwdG9yKCkpOwotCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZLCBFeHRWYWxSZW5kZXJlclByb3h5LmNsYXNzLmdldE5hbWUoKSwgZmFsc2UpOwotCi0gICAgICAgIGluaXROYW1lTWFwcGVycygpOwotICAgICAgICBleGVjdXRlQ3VzdG9tU3RhcnR1cExpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXROYW1lTWFwcGVycygpCi0gICAgewotICAgICAgICBTdHJpbmcgZGVhY3RpdmF0ZURlZmF1bHROYW1lTWFwcGVycyA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0RFRkFVTFRfTkFNRV9NQVBQRVJTOwotICAgICAgICBpZiAoKGRlYWN0aXZhdGVEZWZhdWx0TmFtZU1hcHBlcnMgIT0gbnVsbCAmJiBkZWFjdGl2YXRlRGVmYXVsdE5hbWVNYXBwZXJzLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vcmVnaXN0ZXIgbWV0YWRhdGEgdG8gdmFsaWRhdGlvbiBzdHJhdGVneSBuYW1lIG1hcHBlcgotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOwotCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOwotCi0gICAgICAgIC8vcmVnaXN0ZXIgdmFsaWRhdGlvbiBzdHJhdGVneSB0byBtZXNzYWdlIHJlc29sdmVyIG5hbWUgbWFwcGVyCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsKLQotICAgICAgICAvL3JlZ2lzdGVyIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWV0YWRhdGEgdHJhbnNmb3JtZXIgbmFtZSBtYXBwZXIKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleGVjdXRlQ3VzdG9tU3RhcnR1cExpc3RlbmVyKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBjdXN0b21TdGFydHVwTGlzdGVuZXJOYW1lID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5TVEFSVFVQX0xJU1RFTkVSKTsKLSAgICAgICAgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIgY3VzdG9tU3RhcnR1cExpc3RlbmVyID0KLSAgICAgICAgICAgIChBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY3VzdG9tU3RhcnR1cExpc3RlbmVyTmFtZSk7Ci0KLSAgICAgICAgaWYoY3VzdG9tU3RhcnR1cExpc3RlbmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oInN0YXJ0IGluaXQgb2YgIiArIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lci5pbml0KCk7Ci0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImluaXQgb2YgIiArIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MjUxMGMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkgaW1wbGVtZW50cyBGYWNlc01lc3NhZ2VGYWN0b3J5DQotew0KLSAgICBwdWJsaWMgRmFjZXNNZXNzYWdlIGNvbnZlcnQoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYoaXNMYWJlbGVkRmFjZXNNZXNzYWdlKGZhY2VzTWVzc2FnZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjcmVhdGUoZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCksIGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCksIGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBWaW9sYXRpb25NZXNzYWdlKHNldmVyaXR5LCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzTGFiZWxlZEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHVzZSB0aGUgaW50ZXJmYWNlIGhlcmUNCi0gICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2UgaW5zdGFuY2VvZiBWaW9sYXRpb25NZXNzYWdlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9MYWJlbGVkTWVzc2FnZS5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0xhYmVsZWRNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZjdhZTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0xhYmVsZWRNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBkb24ndCByZW1vdmUgKlRleHQgLSBpdCB3b3VsZCBsZWFkIHRvIGFuIG92ZXJsYXAgd2l0aCB0cmluaWRhZA0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTGFiZWxlZE1lc3NhZ2UNCi17DQotICAgIFN0cmluZyBnZXRMYWJlbFRleHQoKTsNCi0gICAgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIGxhYmVsKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL1Zpb2xhdGlvbk1lc3NhZ2UuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9WaW9sYXRpb25NZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwODE0MzUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL1Zpb2xhdGlvbk1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBWaW9sYXRpb25NZXNzYWdlIGV4dGVuZHMgRmFjZXNNZXNzYWdlIGltcGxlbWVudHMgTGFiZWxlZE1lc3NhZ2UNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY5MDM5NTg5NDI5ODc3MTEyMzFMOw0KLSAgICBwcml2YXRlIFN0cmluZyBsYWJlbDsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHN1bW1hcnlMYWJlbFJlcGxhY2VkID0gZmFsc2U7DQotICAgIHByaXZhdGUgYm9vbGVhbiBkZXRhaWxMYWJlbFJlcGxhY2VkID0gZmFsc2U7DQotDQotICAgIHB1YmxpYyBWaW9sYXRpb25NZXNzYWdlKFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzKFNFVkVSSVRZX0VSUk9SLCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWaW9sYXRpb25NZXNzYWdlKFNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOw0KLSAgICAgICAgc2V0U3VtbWFyeShzdW1tYXJ5KTsNCi0gICAgICAgIHNldERldGFpbChkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxhYmVsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBnZXRTdW1tYXJ5KCkNCi0gICAgew0KLSAgICAgICAgaWYobGFiZWwgIT0gbnVsbCAmJiAhdGhpcy5zdW1tYXJ5TGFiZWxSZXBsYWNlZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXRTdW1tYXJ5KGdldExhYmVsZWRNZXNzc2FnZShzdXBlci5nZXRTdW1tYXJ5KCksIGdldExhYmVsVGV4dCgpKSk7DQotICAgICAgICAgICAgdGhpcy5zdW1tYXJ5TGFiZWxSZXBsYWNlZCA9IHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0U3VtbWFyeSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERldGFpbCgpDQotICAgIHsNCi0gICAgICAgIGlmKGxhYmVsICE9IG51bGwgJiYgIXRoaXMuZGV0YWlsTGFiZWxSZXBsYWNlZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXREZXRhaWwoZ2V0TGFiZWxlZE1lc3NzYWdlKHN1cGVyLmdldERldGFpbCgpLCBnZXRMYWJlbFRleHQoKSkpOw0KLSAgICAgICAgICAgIHRoaXMuZGV0YWlsTGFiZWxSZXBsYWNlZCA9IHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RGV0YWlsKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGFiZWxlZE1lc3NzYWdlKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UuY29udGFpbnMoInsiICsgaSArICJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCJ7IiArIGkgKyAifSIsIGxhYmVsKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2M4MDViLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7DQotDQotLyoqDQotICogTWVzc2FnZVJlc29sdmVyIHdoaWNoIHVzZXMgcHJvcGVydHkgZmlsZXMuDQotICogU3ViY2xhc3NlcyBqdXN0IGhhdmUgdG8gcHJvdmlkZSB0aGUgcGFja2FnZSB0byBsb29rIGF0Lg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIGNhbiBhbHNvIHByb3ZpZGUgYSBjdXN0b20gbmFtZSB3aGljaCBpcyBlLmcuIGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciBpbXBsZW1lbnRzIE1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIgPSAiPz8/IjsNCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0RFRkFVTFRfQ09OVkVOVElPTjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZGVmYXVsdEJ1bmRsZSA9IG51bGw7DQotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VCdW5kbGVCYXNlTmFtZTsNCi0gICAgLy93aXRoIGpzZiAxLjEgb25seSBhdmFpbGFibGUgaWYgdGhlcmUgaXMgYSBjdXN0b20gYmVhbg0KLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlQnVuZGxlVmFyTmFtZTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGtleSA9PSBudWxsIHx8IGtleS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIGN1c3RvbU1lc3NhZ2UgPSBudWxsOw0KLQ0KLSAgICAgICAgLy9vbmx5IGluIGNhc2Ugb2YgYSBWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggaXMgY29uZmlndXJlZCBhcyBiZWFuDQotICAgICAgICBpZiAodGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSh0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSwgbG9jYWxlKTsNCi0gICAgICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm1lc3NhZ2UgYnVuZGxlICIgKyB0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSArICIgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvL29ubHkgaW4gY2FzZSBvZiBhIFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciB3aGljaCBpcyBjb25maWd1cmVkIGFzIGJlYW4NCi0gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VCdW5kbGVWYXJOYW1lICE9IG51bGwgJiYgY3VzdG9tTWVzc2FnZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gKFJlc291cmNlQnVuZGxlKSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4obWVzc2FnZUJ1bmRsZVZhck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigibWVzc2FnZSBidW5kbGUgdmFyIG5hbWUgIiArIHRoaXMubWVzc2FnZUJ1bmRsZVZhck5hbWUgKyAiIG5vdCBmb3VuZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGN1c3RvbU1lc3NhZ2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qDQotICAgICAgICAgKiB0cnkgdG8gdXNlIHRoZSBjb252ZW50aW9uIGZvciB0aGUgbWVzc2FnZSBidW5kbGUNCi0gICAgICAgICAqLw0KLSAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHRyeVRvVXNlTWVzc2FnZUJ1bmRsZUNvbnZlbnRpb24oa2V5LCBsb2NhbGUpOw0KLQ0KLSAgICAgICAgaWYgKGN1c3RvbU1lc3NhZ2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qDQotICAgICAgICAgKiBubyBtZXNzYWdlIGJ1bmRsZSBvciBtZXNzYWdlIGZvdW5kICh3aXRoIHRoZSBjb252ZW50aW9uKT8NCi0gICAgICAgICAqLw0KLQ0KLSAgICAgICAgLy90cnkgdG8gbG9hZCBjdXN0b20gbWVzc2FnZXMNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEN1c3RvbUJhc2VOYW1lKCksIGxvY2FsZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyBjdXN0b20gbWVzc2FnZSBmb3IgIiArIGtleSArICIgd2l0aGluICIgKyBnZXRDdXN0b21CYXNlTmFtZSgpLCBlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vdXNlIGN1c3RvbSBuYW1lIChpZiBwb3NzaWJsZSkgb3RoZXJ3aXNlOiBmYWxsYmFjayB0byBkZWZhdWx0IG1lc3NhZ2UgKGlmIHBvc3NpYmxlKQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChjdXN0b21NZXNzYWdlICE9IG51bGwpID8gY3VzdG9tTWVzc2FnZQ0KLSAgICAgICAgICAgICAgICA6IChnZXRCYXNlTmFtZSgpICE9IG51bGwpID8gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEJhc2VOYW1lKCksIGxvY2FsZSkuZ2V0U3RyaW5nKGtleSkgOiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBNSVNTSU5HX1JFU09VUkNFX01BUktFUiArIGtleSArIE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvVXNlTWVzc2FnZUJ1bmRsZUNvbnZlbnRpb24oU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1c3RvbU1lc3NhZ2UgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKChkZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb24gPT0gbnVsbCB8fCAhZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgICAgICAmJiBpc0RlZmF1bHRNZXNzYWdlQnVuZGxlQ29udmVudGlvbkFjdGl2ZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChkZWZhdWx0QnVuZGxlID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX0JVTkRMRV9OQU1FKSwgbG9jYWxlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZw0KLSAgICAgICAgICAgICAgICAgICAgZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID0gInRydWUiOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChkZWZhdWx0QnVuZGxlICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IGRlZmF1bHRCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGVmYXVsdE1lc3NhZ2VCdW5kbGVDb252ZW50aW9uQWN0aXZlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRCYXNlTmFtZSgpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUJ1bmRsZUJhc2VOYW1lKFN0cmluZyBtZXNzYWdlQnVuZGxlQmFzZU5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lID0gbWVzc2FnZUJ1bmRsZUJhc2VOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VCdW5kbGVWYXJOYW1lKFN0cmluZyBtZXNzYWdlQnVuZGxlVmFyTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSA9IG1lc3NhZ2VCdW5kbGVWYXJOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MGU2OGYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyBhIE1lc3NhZ2VSZXNvbHZlciBmb3IgYSBnaXZlbiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJhZGQgZ2VuZXJpYyBqYXZhIGFwaSAoZGUtL3JlZ2lzdGVyIG1hcHBpbmcpIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotICAgICAgICBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXNzYWdlUmVzb2x2ZXI+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nOw0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBuYW1lTWFwcGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PigpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlUmVzb2x2ZXIgY3JlYXRlKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHN0cmF0ZWd5TmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChNZXNzYWdlUmVzb2x2ZXIpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmdldChzdHJhdGVneU5hbWUpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICBTdHJpbmcgcmVzb2x2ZXJOYW1lOw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vYnVpbGQgY29udmVudGlvbiAoVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKQ0KLSAgICAgICAgICAgIHJlc29sdmVyTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIC8vbmFtZSB3YXNuJ3QgbWFwcGVkDQotICAgICAgICAgICAgaWYgKHJlc29sdmVyTmFtZSA9PSBudWxsIHx8IHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMocmVzb2x2ZXJOYW1lKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtZXNzYWdlUmVzb2x2ZXIgPSAoTWVzc2FnZVJlc29sdmVyKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUocmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWVzc2FnZVJlc29sdmVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKHN0cmF0ZWd5TmFtZSwgcmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZXNvbHZlck5hbWUgKyAiIHVzZWQgZm9yICIgKyBzdHJhdGVneU5hbWUpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYWRkTWFwcGluZyhzdHJhdGVneU5hbWUsIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotDQotICAgICAgICAvL3NldHVwIGludGVybmFsIHN0YXRpYyBtYXBwaW5ncw0KLSAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgOg0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsU3RyaW5nPj4gbWFwcGluZ3MpDQotICAgIHsNCi0gICAgICAgIGZvcihTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IG1hcHBpbmcgOiBtYXBwaW5ncykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNYXBwaW5nKG1hcHBpbmcuZ2V0U291cmNlKCksIG1hcHBpbmcuZ2V0VGFyZ2V0KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgbWVzc2FnZVJlc29sdmVyTmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZGRpbmcgc3RhdGljIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWVzc2FnZSByZXNvbHZlciBtYXBwaW5nOiAiDQotICAgICAgICAgICAgICAgICsgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArICIgLT4gIiArIG1lc3NhZ2VSZXNvbHZlck5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLnB1dCh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBtZXNzYWdlUmVzb2x2ZXJOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IGdldE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5hbWVNYXBwZXJMaXN0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzllZGM2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IE1lc3NhZ2VSZXNvbHZlciB3aGljaCB1c2VzIHRoZSBkZWZhdWx0IGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gbWVzc2FnZSBidW5kbGUgdmlhIHdlYi54bWwNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CVU5ETEUgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FU1NBR0VfQlVORExFOw0KLQ0KLSAgICAvL25vdCB1c2VkIGF0IHRoZSBtb21lbnQgLSBqdXN0IGZvciBhIGNvbnZlbnRpb24NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNb2R1bGVNZXNzYWdlQnVuZGxlTmFtZShnZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tQmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ1VTVE9NX0JVTkRMRTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjY2ExYzEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL01lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBNZXNzYWdlUmVzb2x2ZXJzIGluZGVwZW5kZW50IG9mIHRoZSBtZXNzYWdlIHNvdXJjZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkNDBiNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDc0MDFhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXNzYWdlUmVzb2x2ZXJzLg0KLSAqIChjb25maWd1cmVkIHZpYSB3ZWIueG1sKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM3MjAzNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ3kgdG8gTWVzc2FnZVJlc29sdmVyLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NU0dfUkVTT0xWRVJfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWI1OWI1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIHByb3ZpZGUgYSBOYW1lTWFwcGVyIHBlciB2YWxpZGF0aW9uIG1vZHVsZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBzdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTQ4MzhiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIG1hcHMgRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIEV4dFZhbCBNZXNzYWdlUmVzb2x2ZXJzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKHN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNjA2ZjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgdG8gcGxhY2UgVmFsaWRhdGlvblN0cmF0ZWdpZXMgYW5kIE1lc3NhZ2VSZXNvbHZlcnMgaW4gdGhlIHNhbWUgcGFja2FnZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBzdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1c3RvbVBvc3RmaXggPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWCk7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHN0cmF0ZWd5Q2xhc3NOYW1lLCBjdXN0b21Qb3N0Zml4KTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdkMzc5ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci0KLS8qKgotICogUHJvdmlkZXMgdGhlIGFiaWxpdHkgb2YgbWVzc2FnZSByZXNvbHZpbmcgdG8gVmFsaWRhdGlvblN0cmF0ZWdpZXMKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kKLXsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCA9ICJfZGV0YWlsIjsKLSAgICAvL2UuZy4gZm9yIGluamVjdGluZyBhIG1lc3NhZ2UgcmVzb2x2ZXIgdmlhIHNwcmluZwotICAgIHByaXZhdGUgTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcjsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIExvY2FsZSBsb2NhbGUgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKTsKLQotICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlUmVzb2x2ZXIgIT0gbnVsbCA/IHRoaXMubWVzc2FnZVJlc29sdmVyLmdldE1lc3NhZ2Uoa2V5LCBsb2NhbGUpIDoKLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldE1lc3NhZ2VSZXNvbHZlckZvclZhbGlkYXRpb25TdHJhdGVneSh0aGlzKS5nZXRNZXNzYWdlKGtleSwgbG9jYWxlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlc29sdmVNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gKGtleSAhPSBudWxsKSA/IHJlc29sdmVNZXNzYWdlKGtleSArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYKSA6IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRmFjZXNNZXNzYWdlIGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWFzc2FnZShBbm5vdGF0aW9uIGFubm90YXRpb24pCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKGdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiksIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VSZXNvbHZlcihNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyKQotICAgIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlUmVzb2x2ZXIgPSBtZXNzYWdlUmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pCi0gICAgewotICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMLCBnZXRMYWJlbChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5KSk7Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbik7Ci0gICAgfQotCi0gICAgLy9mb3IgY3VzdG9tIGFubm90YXRpb25zIC0gb3ZlcnJpZGUgaWYgbmVlZGVkCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjY5NGIzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogUHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gdXNlIFZhbGlkYXRvckV4Y2VwdGlvbiAoYXMgZXhwZWN0ZWQgYnkgdGhlIHVzZXIpIGluc3RlYWQgb2YgQ29udmVydGVyRXhjZXB0aW9uLg0KLSAqIEZ1cnRoZXJtb3JlIGl0IHByb3ZpZGVzOjxici8+DQotICogaW5pdFZhbGlkYXRpb248YnIvPg0KLSAqIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGluaXRWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpbml0VmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJpbml0VmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7DQotICAgICAgICB9DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgcHJvY2Vzc1ZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHJvY2Vzc1ZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgicHJvY2Vzc1ZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24gPSBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29udmVydEZhY2VzTWVzc2FnZShlLmdldEZhY2VzTWVzc2FnZSgpKSwgZS5nZXRDYXVzZSgpKTsNCi0gICAgICAgICAgICBpZiAocHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgIjogdGhyb3cgb3JpZ2luYWwgZXhjZXB0aW9uIGFmdGVyIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHRocm93IHZhbGlkYXRvckV4Y2VwdGlvbjsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgIjogb3JpZ2luYWwgZXhjZXB0aW9uIGFmdGVyIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbiwgdGhpcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjVkYzRlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0NCi0gKiBhZGFwdGVyIHRvIGNvbm5lY3QgdmFsaWRhdGlvbiBzdHJhdGVnaWVzIHdpdGggbWV0YS1kYXRhIHRyYW5zZm9ybWVycywNCi0gKiBpZiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBkZWZpbmVkIGFzIGJlYW4gYW5kIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBpbnRlcmZhY2UgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIgZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIC8vdG8gZ2V0IGJhY2sgdGhlIGludGVybmFsIGNhc2hpbmcNCi0gICAgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpOw0KLQ0KLSAgICBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1Y2I2My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLkJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotDQotICogYWRhcHRlciB0byBjb25uZWN0IHZhbGlkYXRpb24gc3RyYXRlZ2llcyB3aXRoIG1ldGEtZGF0YSB0cmFuc2Zvcm1lcnMsDQotICogaWYgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgZGVmaW5lZCBhcyBiZWFuIGFuZCBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIC8vb3B0aW9uYWwgZmFsbGJhY2sgZm9yIGludGVybmFsIGNhc2hpbmcNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOw0KLQ0KLSAgICBwdWJsaWMgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyIGluc3RhbmNlb2YgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIpIG1ldGFEYXRhVHJhbnNmb3JtZXIgKS5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGdldE1ldGFEYXRhVHJhbnNmb3JtZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVRyYW5zZm9ybWVyKE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyID0gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsaWRhdGlvblN0cmF0ZWd5ID0gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYWQ0ZjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyDQotICAgIC5Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotDQotLyoqDQotICogRmFjdG9yeSB3aGljaCBjcmVhdGVzIHRoZSBWYWxpZGF0aW9uU3RyYXRlZ3kgZm9yIGEgZ2l2ZW4gTWV0YS1EYXRhIEtleQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkNCi0gICAgICAgIGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxTdHJpbmcsIFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9IG51bGw7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBjcmVhdGUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICBpZiAobWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljTWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZy5jb250YWluc0tleShtZXRhRGF0YUtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nLmdldChtZXRhRGF0YUtleSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWU7DQotICAgICAgICAvL251bGwgLT4gdXNlIG5hbWUgbWFwcGVycw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFN0cmluZz4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0cmF0ZWd5TmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZShtZXRhRGF0YUtleSk7DQotDQotICAgICAgICAgICAgaWYgKHN0cmF0ZWd5TmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKHN0cmF0ZWd5TmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyhtZXRhRGF0YUtleSwgc3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lJbnN0YW5jZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUNCi0gICAgICAgICAgICAuc3RhcnRzV2l0aChBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5QUkVGSVhfRk9SX0JFQU5fTUFQUElORykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbih2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLlBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HLmxlbmd0aCgpKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgbWV0YURhdGFLZXksIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImFkZGluZyBtZXRhLWRhdGEga2V5IHRvIHZhbGlkYXRpb24gc3RyYXRlZ3kgbWFwcGluZzogIg0KLSAgICAgICAgICAgICAgICArIG1ldGFEYXRhS2V5ICsgIiAtPiAiICsgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZy5wdXQobWV0YURhdGFLZXksIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbml0U3RhdGljTWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgLy9zZXR1cCBpbnRlcm5hbCBzdGF0aWMgbWFwcGluZ3MNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnIDoNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgPSBuZXcgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAvL3RyeSB0byBzZXR1cCBtYXBwaW5nIHdpdGggYmFzZSBuYW1lIGJ5IGNvbnZlbnRpb24gLSBvdmVycmlkZXMgZGVmYXVsdCBtYXBwaW5nDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2J1aWxkIGNvbnZlbnRpb24gKHN0cmF0ZWd5IG1hcHBpbmcpDQotICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZyhFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFKSk7DQotDQotICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotDQotICAgICAgICAvL3NldHVwIGN1c3RvbSBtYXBwaW5nIC0gb3ZlcnJpZGVzIGFsbCBvdGhlciBtYXBwaW5ncw0KLSAgICAgICAgU3RyaW5nIGN1c3RvbU1hcHBpbmdCYXNlTmFtZSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORzsNCi0gICAgICAgIGlmIChjdXN0b21NYXBwaW5nQmFzZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHN0YXRpY0NvbmZpZyA9IG5ldyBTdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZyhjdXN0b21NYXBwaW5nQmFzZU5hbWUpOw0KLSAgICAgICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cFN0cmF0ZWd5TWFwcGluZ3MoTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhtYXBwaW5nLmdldFNvdXJjZSgpLCBtYXBwaW5nLmdldFRhcmdldCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+IGdldE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZU1hcHBlckxpc3Q7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NTUyM2QuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBCYXNlIGludGVyZmFjZSBmb3IgVmFsaWRhdGlvblN0cmF0ZWdpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLS8vKlZhbGlkYXRpb25TdHJhdGVneSBpbnN0ZWFkIG9mICpWYWxpZGF0b3IgdG8gYXZvaWQgbmFtaW5nIGNvbmZ1c2lvbiANCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9BYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9BYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YjNmMGQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNWQzNjEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIE5hbWUgTWFwcGVyIHdoaWNoIGRlbGVnYXRlcyB0aGUgbmFtZSBtYXBwaW5nLCBleHRyYWN0IHRoZSBuYW1lIGFuZCBjb252ZXJ0IGl0IHRvIGEgYmVhbiBuYW1lICsgcHJlZml4DQotICogdGFyZ2V0OiBjb25maWd1cmUgYSB2YWxpZGF0aW9uIHN0cmF0ZWd5IHZpYSBhIG1hbmFnZWQgYmVhbiBmYWNpbGl0eSAtPiBhbGxvd3MgdG8gaW5qZWN0IG90aGVyIGJlYW5zDQotICogaW5zdGVhZCBvZiBhcGkgY2FsbHMgKyBoYXJkY29kZWQgYmVhbiBuYW1lcw0KLSAqIDxwLz4NCi0gKiBhbGxvd2VkIGJlYW4gc2NvcGVzOg0KLSAqIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIHN0YXRlbGVzczogYXBwbGljYXRpb24vc2luZ2xldG9uDQotICogdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgc3RhdGVmdWw6IG5vbmUvcHJvdG90eXBlDQotICogZG9uJ3QgdXNlIHRoZSBzZXNzaW9uIG9yIGEgY29udmVyc2F0aW9uIHNjb3BlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HID0gImJlYW46IjsNCi0gICAgcHJpdmF0ZSBOYW1lTWFwcGVyPFN0cmluZz4gd3JhcHBlZDsNCi0NCi0gICAgcHVibGljIEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKE5hbWVNYXBwZXI8U3RyaW5nPiBuYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSBuYW1lTWFwcGVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbmFtZSA9IHdyYXBwZWQuY3JlYXRlTmFtZShzb3VyY2UpOw0KLQ0KLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKTsNCi0gICAgICAgIHJldHVybiBQUkVGSVhfRk9SX0JFQU5fTUFQUElORyArIG5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvTG93ZXJDYXNlKCkgKyBuYW1lLnN1YnN0cmluZygxKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZlMWY2ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgQW5ub3RhdGlvbnMgdG8gVmFsaWRhdGlvblN0cmF0ZWdpZXMuDQotICogKGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y4ZGRmYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBBbm5vdGF0aW9ucyB0byBWYWxpZGF0aW9uU3RyYXRlZ2llcy4NCi0gKiAoY29uZmlndXJlZCB2aWEgaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbikNCi0gKiBUaGUgYmVhbiBwcm92aWRlcyB0aGUgZGVmYXVsdCBuYW1lIChjb252ZW50aW9uKS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gZnVsbCBxdWFsaWZpZWQgbmFtZS4gKD0gY3VzdG9taXphYmxlIGNvbnZlbnRpb24pDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzBlNDIwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIG1hcHMgRXh0VmFsIEFubm90YXRpb25zIHRvIEV4dFZhbCBWYWxpZGF0aW9uU3RyYXRlZ2llcy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZShtZXRhRGF0YUtleSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTBhNjEyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIHRvIHBsYWNlIEFubm90YXRpb25zIGFuZCBWYWxpZGF0aW9uU3RyYXRlZ2llcyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5ICsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Qcmlvcml0eS5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMWFhMzMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGVudW0gUHJpb3JpdHkKLXsKLSAgICBCTE9DS0lORywKLSAgICBISUdILAotICAgIE1FRElVTSwKLSAgICBMT1cKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVG9Eby5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3ZmQ1Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVG9Eby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotcHVibGljIEBpbnRlcmZhY2UgVG9EbwotewotICAgIFByaW9yaXR5IHZhbHVlKCk7Ci0gICAgU3RyaW5nIGRlc2NyaXB0aW9uKCkgZGVmYXVsdCAiIjsKLQotICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgIEBpbnRlcmZhY2UgTGlzdAotICAgIHsKLSAgICAgICAgVG9Eb1tdIHZhbHVlKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VDYXRlZ29yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDdiMzg1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLS8qKgotICogQVBJOjxici8+Ci0gKiBwYXJ0cyB5b3UgbWlnaHQgbmVlZCBmb3IgY3VzdG9tIGltcGxlbWVudGF0aW9ucyBhbmQgd2hpY2ggYXJlIHF1aXRlIHN0YWJsZSBpbiB2aWV3IG9mIGNoYW5nZXMKLSAqIDxwLz4KLSAqIElOVEVSTkFMOjxici8+Ci0gKiBpZiB5b3UgdGhpbmsgYWJvdXQgcmVmZXJlbmNpbmcgYW4gYXJ0aWZhY3Qgd2hpY2ggaXMgbWFya2VkIGFzIGludGVybmFsLCBhc2sgZm9yIHN1cHBvcnQuCi0gKiB0aGVyZSBzaG91bGQgYmUgYSBiZXR0ZXIgc29sdXRpb24KLSAqIDxwLz4KLSAqIENVU1RPTUlaQUJMRTo8YnIvPgotICogYSBwbGFubmVkIGV4dGVuc2lvbiBwb2ludCB3aGljaCBjb250YWlucyBsb2dpYyB0byBjdXN0b21pemUgdGhlIGZyYW1ld29yay4KLSAqIGlmIGl0IGlzbid0IGFsc28gbWFya2VkIGFzIEFQSSBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotICogaG93ZXZlciwgd2UgdHJ5IHRvIGtlZXAgaXQgYXMgc3RhYmxlIGFzIHBvc3NpYmxlIGFuZCByZWFzb25hYmxlLgotICogPHAvPgotICogUkVVU0U6PGJyLz4KLSAqIGFuIGFydGlmYWN0IHdoaWNoIHlvdSBjYW4gcmV1c2UgZm9yIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uLgotICogaWYgaXQgaXNuJ3QgbWFya2VkIGFzIEFQSSBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotICogaG93ZXZlciwgd2UgdHJ5IHRvIGtlZXAgaXQgYXMgc3RhYmxlIGFzIHBvc3NpYmxlIGFuZCByZWFzb25hYmxlLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLXB1YmxpYyBlbnVtIFVzYWdlQ2F0ZWdvcnkKLXsKLSAgICBBUEksCi0gICAgSU5URVJOQUwsCi0gICAgQ1VTVE9NSVpBQkxFLAotICAgIFJFVVNFCi19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlSW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzN2ViYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIGl0J3MgYW4gaW50ZXJuYWwgYW5ub3RhdGlvbiB0byBwcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gY29uY2VybmluZyB1c2FnZS1jYXRlZ29yaWVzCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkKLSAqLwotQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi1wdWJsaWMgQGludGVyZmFjZSBVc2FnZUluZm9ybWF0aW9uCi17Ci0gICAgVXNhZ2VDYXRlZ29yeVtdIHZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTY1YjEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsNCi1pbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ2xhc3NVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENsYXNzVXRpbHMuY2xhc3MpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIHRyeVRvTG9hZENsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGxvYWRDbGFzc0Zvck5hbWUobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGxvYWRDbGFzc0Zvck5hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIFRyeSBXZWJBcHAgQ2xhc3NMb2FkZXIgZmlyc3QNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwDQotICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWdub3JlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIGZhbGxiYWNrOiBUcnkgQ2xhc3NMb2FkZXIgZm9yIENsYXNzVXRpbHMgKGkuZS4gdGhlIG15ZmFjZXMuamFyIGxpYikNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwDQotICAgICAgICAgICAgICAgIENsYXNzVXRpbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnN0YW50aWF0ZUNsYXNzKENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0Q2xhc3MubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoU3RyaW5nIGNsYXNzTmFtZSkNCi0gICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsb2FkQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKYXJWZXJzaW9uKENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY2xhc3NGaWxlUGF0aCA9IHRhcmdldENsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSArICIuY2xhc3MiOw0KLSAgICAgICAgU3RyaW5nIG1hbmlmZXN0RmlsZVBhdGggPSAiL01FVEEtSU5GL01BTklGRVNULk1GIjsNCi0NCi0gICAgICAgIFN0cmluZyBjbGFzc0xvY2F0aW9uID0gdGFyZ2V0Q2xhc3MuZ2V0UmVzb3VyY2UodGFyZ2V0Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi5jbGFzcyIpLnRvU3RyaW5nKCk7DQotICAgICAgICBTdHJpbmcgbWFuaWZlc3RGaWxlTG9jYXRpb24gPSBjbGFzc0xvY2F0aW9uDQotICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgY2xhc3NMb2NhdGlvbi5pbmRleE9mKGNsYXNzRmlsZVBhdGgpIC0gMSkgKyBtYW5pZmVzdEZpbGVQYXRoOw0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBNYW5pZmVzdChuZXcgVVJMKG1hbmlmZXN0RmlsZUxvY2F0aW9uKS5vcGVuU3RyZWFtKCkpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5nZXRWYWx1ZShBdHRyaWJ1dGVzLk5hbWUuSU1QTEVNRU5UQVRJT05fVkVSU0lPTik7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKExPRy5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTE9HLnRyYWNlKCJjb3VsZG4ndCBsb2FkIHZlcnNpb24gb2YgamFyIGZpbGUgd2hpY2ggY29udGFpbnMgIiArIHRhcmdldENsYXNzLmdldE5hbWUoKSwgdCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGU3MzkyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkVMSGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5BYnN0cmFjdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5OYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY2VzTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPR0dFUiA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEV4dFZhbFV0aWxzLmNsYXNzKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX1JFUVVJUkVEID0gImphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUlucHV0LlJFUVVJUkVEIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX1JFUVVJUkVEX0RFVEFJTCA9ICJqYXZheC5mYWNlcy5jb21wb25lbnQuVUlJbnB1dC5SRVFVSVJFRF9kZXRhaWwiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfTUFYSU1VTSA9ICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yLk1BWElNVU0iOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwgPSAiamF2YXguZmFjZXMudmFsaWRhdG9yLkxlbmd0aFZhbGlkYXRvci5NQVhJTVVNX2RldGFpbCI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nRmFjdG9yeTxTdHJpbmcsIFZhbGlkYXRpb25TdHJhdGVneT4pIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUobWV0YURhdGFLZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIE5hbWVNYXBwZXI8U3RyaW5nPiBtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5yZWdpc3RlcihtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlcmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gbWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZXJlZ2lzdGVyKG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZW55TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVueShtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckZvclZhbGlkYXRpb25TdHJhdGVneShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWV0YURhdGFUcmFuc2Zvcm1lcj4pIEV4dFZhbENvbnRleHQNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5yZWdpc3Rlcih2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlcmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVueVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlbnkodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKCkNCi0gICAgew0KLSAgICAgICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksIENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICB7DQotICAgICAgICBmb3IoQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRDb21wb25lbnRJbml0aWFsaXplcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjb21wb25lbnRJbml0aWFsaXplci5jb25maWd1cmVDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOw0KLQ0KLSAgICAgICAgZm9yKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCF2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJUaHJvd2luZygNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uLCB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3IoZmluYWwgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgTWV0YURhdGFFeHRyYWN0b3IoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcmVzdWx0ID0gbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIG9iamVjdCk7DQotICAgICAgICAgICAgICAgIGZvcihNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciA6DQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmFmdGVyRXh0cmFjdGluZyhyZXN1bHQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VSZXNvbHZlciBnZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1lc3NhZ2VSZXNvbHZlcj4pRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgLmNyZWF0ZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAucmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZXJlZ2lzdGVyKHZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVueVZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVueSh2YWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBFTEhlbHBlciBnZXRFTEhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRUxfSEVMUEVSX0ZBQ1RPUlksIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmNsYXNzKS5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY2VzTWVzc2FnZSBjcmVhdGVGYWNlc01lc3NhZ2UoU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcmVhdGVGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjZXNNZXNzYWdlIGNyZWF0ZUZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkZBQ0VTX01FU1NBR0VfRkFDVE9SWSwgRmFjZXNNZXNzYWdlRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZShzZXZlcml0eSwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY2VzTWVzc2FnZSBjb252ZXJ0RmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRkFDRVNfTUVTU0FHRV9GQUNUT1JZLCBGYWNlc01lc3NhZ2VGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuY29udmVydChmYWNlc01lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHlEZXRhaWxzIGNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgYmFzZU9iamVjdDsNCi0gICAgICAgIGlmKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKHRhcmdldEV4cHJlc3Npb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmJlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgU3RyaW5nIGV4cHJlc3Npb24gPSB2YmUuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgICAgIGJhc2VPYmplY3QgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YmUuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURldGFpbHMoDQotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uc3Vic3RyaW5nKDIsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKSwgYmFzZU9iamVjdCwgdmJlLmdldFByb3BlcnR5KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIG9yaWdpbmFsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eSgNCi0gICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgU3RyaW5nIG5ld0Jhc2VLZXkgPSBvcmlnaW5hbC5nZXRLZXkoKS5zdWJzdHJpbmcoMCwgb3JpZ2luYWwuZ2V0S2V5KCkubGFzdEluZGV4T2YoIi4iKSArIDEpOw0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IG5ld0Jhc2VLZXkgKyB0YXJnZXRFeHByZXNzaW9uOw0KLQ0KLSAgICAgICAgYmFzZU9iamVjdCA9IFJlZmxlY3Rpb25VdGlscy5nZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKG9yaWdpbmFsLmdldEJhc2VPYmplY3QoKSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICBuZXdLZXksIGJhc2VPYmplY3QsIHRhcmdldEV4cHJlc3Npb24uc3Vic3RyaW5nKHRhcmdldEV4cHJlc3Npb24ubGFzdEluZGV4T2YoIi4iKSArIDEsDQotICAgICAgICAgICAgdGFyZ2V0RXhwcmVzc2lvbi5sZW5ndGgoKSkpOw0KLSAgICB9DQotDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb1BsYWNlTGFiZWwoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgU3RyaW5nIGxhYmVsLCBpbnQgaW5kZXgpDQotICAgIHsNCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLmNvbnRhaW5zKCJ7IiArIGluZGV4ICsgIn0iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLnJlcGxhY2UoInsiICsgaW5kZXggKyAifSIsIGxhYmVsKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkuY29udGFpbnMoInsiICsgaW5kZXggKyAifSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNNZXNzYWdlLmdldERldGFpbCgpLnJlcGxhY2UoInsiICsgaW5kZXggKyAifSIsIGxhYmVsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VXaXRoRGVmYXVsdE1heGltdW1NZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIGludCBtYXhMZW5ndGgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZSA9IEpzZlV0aWxzLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfTUFYSU1VTSk7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZTsNCi0NCi0gICAgICAgIC8vdXNlIHRyeS9jYXRjaCBmb3IgZWFzaWVyIHN5bmMgYmV0d2VlbiB0cnVuay9icmFuY2gNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEpzZlV0aWxzLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IEpzZlV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vanNmIDEuMiBkb2Vzbid0IGhhdmUgYSBkZXRhaWwgbWVzc2FnZQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2UgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZS5yZXBsYWNlKCJ7MH0iLCAiIiArIG1heExlbmd0aCk7DQotICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsLnJlcGxhY2UoInswfSIsICIiICsgbWF4TGVuZ3RoKTsNCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGZhY2VzUmVxdWlyZWRNZXNzYWdlKTsNCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwpOw0KLSAgICB9DQotDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBsYWNlV2l0aERlZmF1bHRSZXF1aXJlZE1lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGZhY2VzUmVxdWlyZWRNZXNzYWdlID0gSnNmVXRpbHMuZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhKQVZBWF9GQUNFU19SRVFVSVJFRCk7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZTsNCi0NCi0gICAgICAgIC8vdXNlIHRyeS9jYXRjaCBmb3IgZWFzaWVyIHN5bmMgYmV0d2VlbiB0cnVuay9icmFuY2gNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEpzZlV0aWxzLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfUkVRVUlSRURfREVUQUlMKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBKc2ZVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkuZ2V0U3RyaW5nKEpBVkFYX0ZBQ0VTX1JFUVVJUkVEX0RFVEFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9qc2YgMS4yIGRvZXNuJ3QgaGF2ZSBhIGRldGFpbCBtZXNzYWdlDQotICAgICAgICB9DQotDQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc1JlcXVpcmVkTWVzc2FnZSk7DQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTa2lwYWJsZVZhbGlkYXRpb25TdHJhdGVneShDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRDbGFzcyA6IEV4dFZhbFV0aWxzLmdldFNraXBWYWxpZGF0aW9uU3VwcG9ydENsYXNzTGlzdCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLmlzU2tpcFZhbGlkYXRpb25TdXBwb3J0ZWQoY3VycmVudENsYXNzLCB0YXJnZXRDbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PENsYXNzPiBnZXRTa2lwVmFsaWRhdGlvblN1cHBvcnRDbGFzc0xpc3QoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBzdGF0aWNDb25maWd1cmF0aW9uTGlzdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5TS0lQX1ZBTElEQVRJT05fU1VQUE9SVF9DT05GSUcpOw0KLQ0KLSAgICAgICAgTGlzdDxDbGFzcz4gbWFya2VyTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3M7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gY3VycmVudEVudHJ5IDogc3RhdGljQ29uZmlndXJhdGlvbkxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gY3VycmVudENvbmZpZ3VyYXRpb25FbnRyeSA6IGN1cnJlbnRFbnRyeS5nZXRNYXBwaW5nKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShjdXJyZW50Q29uZmlndXJhdGlvbkVudHJ5LmdldFRhcmdldCgpKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYoY3VycmVudENsYXNzICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1hcmtlckxpc3QuYWRkKGN1cnJlbnRDbGFzcyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihMT0dHRVIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi53YXJuKCJjb25maWd1cmF0aW9uIGVudHJ5IHByb3ZpZGVzIGFuIGludmFsaWQgZW50cnk6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY3VycmVudENvbmZpZ3VyYXRpb25FbnRyeS5nZXRUYXJnZXQoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWFya2VyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTa2lwVmFsaWRhdGlvblN1cHBvcnRlZChDbGFzcyBjdXJyZW50Q2xhc3MsIENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZihjdXJyZW50Q2xhc3MuaXNBbm5vdGF0aW9uKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGFyZ2V0Q2xhc3MuaXNBbm5vdGF0aW9uUHJlc2VudChjdXJyZW50Q2xhc3MpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRhcmdldENsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhIGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvSnNmVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1MGQ4OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZTsNCi1pbXBvcnQgamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZUZhY3Rvcnk7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOw0KLQ0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpzZlV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3RlclBoYXNlTGlzdGVuZXIoUGhhc2VMaXN0ZW5lciBwaGFzZUxpc3RlbmVyKQ0KLSAgICB7DQotICAgICAgICBMaWZlY3ljbGVGYWN0b3J5IGxpZmVjeWNsZUZhY3RvcnkgPSAoTGlmZWN5Y2xlRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRmFjdG9yeUZpbmRlci5MSUZFQ1lDTEVfRkFDVE9SWSk7DQotDQotICAgICAgICBTdHJpbmcgY3VycmVudElkOw0KLSAgICAgICAgTGlmZWN5Y2xlIGN1cnJlbnRMaWZlY3ljbGU7DQotICAgICAgICBJdGVyYXRvciBsaWZlY3ljbGVJZHMgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZUlkcygpOw0KLSAgICAgICAgd2hpbGUgKGxpZmVjeWNsZUlkcy5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudElkID0gKFN0cmluZykgbGlmZWN5Y2xlSWRzLm5leHQoKTsNCi0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlID0gbGlmZWN5Y2xlRmFjdG9yeS5nZXRMaWZlY3ljbGUoY3VycmVudElkKTsNCi0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlLnJlbW92ZVBoYXNlTGlzdGVuZXIocGhhc2VMaXN0ZW5lcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFN0cmluZyBidW5kbGVOYW1lID0gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZ2V0TWVzc2FnZUJ1bmRsZSgpOw0KLQ0KLSAgICAgICAgaWYoYnVuZGxlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJ1bmRsZU5hbWUgPSBGYWNlc01lc3NhZ2UuRkFDRVNfTUVTU0FHRVM7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGJ1bmRsZU5hbWUsIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9SZWZsZWN0aW9uVXRpbHMuamF2YSBiL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1JlZmxlY3Rpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg3ZjdkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1JlZmxlY3Rpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGlvblV0aWxzCi17Ci0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgdHJ5VG9HZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvR2V0TWV0aG9kKHRhcmdldENsYXNzLCB0YXJnZXRNZXRob2ROYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCB0cnlUb0dldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUsIENsYXNzLi4uIHBhcmFtZXRlclR5cGVzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lKQotICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TWV0aG9kKHRhcmdldENsYXNzLCB0YXJnZXRNZXRob2ROYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lLCBDbGFzcy4uLiBwYXJhbWV0ZXJUeXBlcykKLSAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gdGFyZ2V0Q2xhc3M7Ci0gICAgICAgIE1ldGhvZCB0YXJnZXRNZXRob2QgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKCFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gY3VycmVudENsYXNzLmdldERlY2xhcmVkTWV0aG9kKHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGFyZ2V0TWV0aG9kID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IHRhcmdldENsYXNzLmdldEludGVyZmFjZXMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50SW50ZXJmYWNlOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRDbGFzcyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IGN1cnJlbnRDbGFzcy5nZXREZWNsYXJlZE1ldGhvZCh0YXJnZXRNZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0YXJnZXRNZXRob2QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRhcmdldE1ldGhvZDsKLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBOb1N1Y2hNZXRob2RFeGNlcHRpb24oInRoZXJlIGlzIG5vIG1ldGhvZCB3aXRoIHRoZSBuYW1lICciICsgdGFyZ2V0TWV0aG9kTmFtZSArICInIiArCi0gICAgICAgICAgICAgICAgIiBjbGFzczogIiArIHRhcmdldENsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0ludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3ModGFyZ2V0LCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZE9mQ2xhc3ModGFyZ2V0LCBtZXRob2QsIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQubmV3SW5zdGFuY2UoKSwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldC5uZXdJbnN0YW5jZSgpLCBtZXRob2QsIGFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdC4uLiBhcmdzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0LCBtZXRob2QsIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdC4uLiBhcmdzKQotICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKHRhcmdldCwgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QmFzZU9mUHJvcGVydHlDaGFpbihPYmplY3QgYmFzZU9iamVjdCwgU3RyaW5nIHByb3BlcnR5Q2hhaW4pCi0gICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcm9wZXJ0eUNoYWluLCAiLiIpOwotCi0gICAgICAgIE9iamVjdCBjdXJyZW50QmFzZSA9IGJhc2VPYmplY3Q7Ci0gICAgICAgIFN0cmluZyBjdXJyZW50UHJvcGVydHk7Ci0gICAgICAgIE1ldGhvZCBjdXJyZW50TWV0aG9kOwotCi0gICAgICAgIHdoaWxlKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQotICAgICAgICAgICAgLy9pZ25vcmUgdGhlIGxhc3QgcHJvcGVydHkKLSAgICAgICAgICAgIGlmKCF0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL25vIGlzIC0gaXQncyBvbmx5IHBvc3NpYmxlIGF0IHByb3BlcnRpZXMgbm90IGF0IGJlYW4gbGV2ZWwKLSAgICAgICAgICAgIGN1cnJlbnRNZXRob2QgPSB0cnlUb0dldE1ldGhvZChjdXJyZW50QmFzZS5nZXRDbGFzcygpLAotICAgICAgICAgICAgICAgICJnZXQiICsgY3VycmVudFByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFByb3BlcnR5LnN1YnN0cmluZygxLCBjdXJyZW50UHJvcGVydHkubGVuZ3RoKCkpKTsKLSAgICAgICAgICAgIGN1cnJlbnRCYXNlID0gdHJ5VG9JbnZva2VNZXRob2QoY3VycmVudEJhc2UsIGN1cnJlbnRNZXRob2QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRCYXNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1dlYlhtbFV0aWxzLmphdmEgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWIyMTdiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1dlYlhtbFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFdlYlhtbFV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKQ0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVggKyAiLiIgKyBrZXkpOw0KLSAgICAgICAgcmV0dXJuICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlLnJlcGxhY2UoIiAiLCAiIikudHJpbSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OTNiZmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9jb3JlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyMDFkMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2NvcmUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlIE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlIE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUgTW9kdWxlIHByb3ZpZGVzIGFuIGV4dGVuc2libGUgdmFsaWRhdGlvbiBwbGF0Zm9ybSB0byBpbXBsZW1lbnQgdmFsaWRhdGlvbiBiYXNlZCBvbiBtZXRhLWRhdGEuDQotICAgIEJhc2VkIG9uIHRoaXMgbW9kdWxlIGl0IGlzIHBvc3NpYmxlIHRvIGltcGxlbWVudCB2YWxpZGF0aW9uIG1vZHVsZXMuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLjEueCBhbmQgSlNGIDEuMi54LiBCb3RoIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9hc3NlbWJseS9wb20ueG1sIGIvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9hc3NlbWJseS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWEwYzA1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBFeGFtcGxlcyBBc3NlbWJseTwvbmFtZT4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZXhhbXBsZXMtYXNzZW1ibHkxMjwvYXJ0aWZhY3RJZD4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjI8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5kZXBlbmRlbmN5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LXdhcjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd2FyPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktc3JjPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fd29ybGQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXZhLXNvdXJjZTwvdHlwZT4gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmVhdHVyZS1zZXRfMDE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXZhLXNvdXJjZTwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc3JjPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPiAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBFWEVDVVRFIG12biBwYWNrYWdlIHRvIGdlbmVyYXRlIGFzc2VtYmx5IGZpbGVzIC0tPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9zcmM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmFzc2VtYmx5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4gICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwtZXhhbXBsZXMtJHtwcm9qZWN0LnZlcnNpb259LXNyYzwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfYmluPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hc3NlbWJseTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0JICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+ICAgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWw8L2Rlc2NyaXB0b3I+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsLWV4YW1wbGVzLSR7cHJvamVjdC52ZXJzaW9ufTwvZmluYWxOYW1lPgotCSAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd29yazwvd29ya0RpcmVjdG9yeT4KLQkgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0JICAgIAotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+d2Fnb24tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aWQ+bXlmYWNlcy1uaWdodGx5LWJ1aWxkczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vbWlub3RhdXIuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvYnVpbGRzL215ZmFjZXMvbmlnaHRseTwvdXJsPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9pbnB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICA8L3BsdWdpbnM+Ci0KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXAueG1sIGIvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGY3YjgxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgkKLSAgPGZpbGVTZXRzPiAgICAKLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3dhcjwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki53YXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4gICAgIAotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbCBiL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU3MGNjYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08YXNzZW1ibHk+Ci0gIDxpZD5zcmM8L2lkPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4JCi0gIDxmaWxlU2V0cz4gICAgCi0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9zcmM8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki50eHQ8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDViM2E1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY0ZTFhOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcgotQ29weXJpZ2h0IDIwMDctMjAwOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvcG9tLnhtbCBiL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU1ZTNjNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmVhdHVyZS1zZXRfMDE8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIGZlYXR1cmUtc2V0IDAxPC9uYW1lPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuMjwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5mYWNlbGV0czwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzZi1mYWNlbGV0czwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xNDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDwhLS0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAtLT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50b21haGF3azwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRvbWFoYXdrPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjY8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OTNiZmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2N1c3RvbS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2N1c3RvbS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MDFkZjcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jdXN0b20vdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLSMgdGhpcyBtZXNzYWdlIGJ1bmRsZSBpcyBwaWNrZWQgdXAgdmlhIGNvbnZlbnRpb24NCi1yZXBlYXRlZF9wYXNzd29yZF9yZXF1aXJlZD1wbGVhc2UgcmV0eXBlIHRoZSBwYXNzd29yZA0KLXJlcGVhdGVkX3Bhc3N3b3JkX3JlcXVpcmVkX2RldGFpbD1wbGVhc2UgcmV0eXBlIHRoZSBwYXNzd29yZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEgYi9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmFlNDFlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJc1R5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLk5vdEVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi0NCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbDsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVGVtcG9yYWxUeXBlOw0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi1wdWJsaWMgY2xhc3MgUGVyc29uDQotew0KLSAgICBATGVuZ3RoKG1pbmltdW0gPSAyKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDIwKQ0KLSAgICBATm90RXF1YWxzKCJsYXN0TmFtZSIpDQotICAgIEBQYXR0ZXJuKCJbQS1aXVthLXpdKyIpDQotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsNCi0NCi0gICAgQExlbmd0aChtaW5pbXVtID0gMikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAyMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7DQotDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwKQ0KLSAgICBwcml2YXRlIFN0cmluZyByb2xlID0gInVzZXIiOw0KLQ0KLSAgICBARGF0ZUlzKHR5cGUgPSBEYXRlSXNUeXBlLmJlZm9yZSwgdmFsdWVPZiA9ICJmaW5hbEV4YW0iKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIEBUZW1wb3JhbChUZW1wb3JhbFR5cGUuREFURSkNCi0gICAgcHJpdmF0ZSBEYXRlIGJpcnRoZGF5Ow0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIEBUZW1wb3JhbChUZW1wb3JhbFR5cGUuREFURSkNCi0gICAgcHJpdmF0ZSBEYXRlIGZpbmFsRXhhbTsNCi0NCi0gICAgQExlbmd0aChtaW5pbXVtID0gMikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmlja05hbWU7DQotDQotICAgIEBMZW5ndGgobWluaW11bSA9IDYpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gNjApDQotICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIHByaXZhdGUgaW50IG51bWJlck9mU2libGluZ3M7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByb2xlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFJvbGUoU3RyaW5nIHJvbGUpDQotICAgIHsNCi0gICAgICAgIHRoaXMucm9sZSA9IHJvbGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0QmlydGhkYXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmlydGhkYXk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0QmlydGhkYXkoRGF0ZSBiaXJ0aGRheSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5iaXJ0aGRheSA9IGJpcnRoZGF5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldEZpbmFsRXhhbSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmaW5hbEV4YW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RmluYWxFeGFtKERhdGUgZmluYWxFeGFtKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpbmFsRXhhbSA9IGZpbmFsRXhhbTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5pY2tOYW1lKFN0cmluZyBuaWNrTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uaWNrTmFtZSA9IG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNpYmxpbmdzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG51bWJlck9mU2libGluZ3M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyT2ZTaWJsaW5ncyhpbnQgbnVtYmVyT2ZTaWJsaW5ncykNCi0gICAgew0KLSAgICAgICAgdGhpcy5udW1iZXJPZlNpYmxpbmdzID0gbnVtYmVyT2ZTaWJsaW5nczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YSBiL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmUxNGZiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmd1aS5iZWFuczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluLlBlcnNvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5Ob3RFcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTG9uZ1JhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmN1c3RvbS5lbWFpbHZhbGlkYXRvci5FbWFpbFZhbGlkYXRvcjsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uUGFnZQ0KLXsNCi0NCi0gICAgLy90aGUgb2xkIHBhc3N3b3JkIG9mIHRoZSBwZXJzb24gaXNuJ3QgdXNlZCB3aXRoaW4gdGhlIHBhZ2UNCi0gICAgLy8tPiB2YWxpZGF0ZSB3aXRoIHZhbHVlIG9mIHRoZSBtb2RlbA0KLSAgICBAU2tpcFZhbGlkYXRpb24oIiN7cGVyc29uLnJvbGUgZXEgJ2FkbWluJ30iKQ0KLSAgICBAUmVxdWlyZWQNCi0gICAgQEVxdWFscygicGVyc29uLnBhc3N3b3JkIikNCi0gICAgQE5vdEVxdWFscygicGFzc3dvcmQiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBvbGRQYXNzd29yZDsNCi0NCi0gICAgQEVxdWFscygicGFzc3dvcmRSZXBlYXRlZCIpDQotICAgIC8vY29tYmluZSBndWkgcmVsYXRlZCBhbm5vdGF0aW9ucyB3aXRoIHRoZSBhbm5vYXRpb25zIG9mIHRoZSBkb21haW4gbW9kZWwNCi0gICAgQEpvaW5WYWxpZGF0aW9uKHZhbHVlID0gIiN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ucGFzc3dvcmR9IikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7DQotDQotICAgIEBSZXF1aXJlZCh2YWxpZGF0aW9uRXJyb3JNc2dLZXkgPSAicmVwZWF0ZWRfcGFzc3dvcmRfcmVxdWlyZWQiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZFJlcGVhdGVkOw0KLQ0KLSAgICAvL3VzZSAje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLm5pY2tOYW1lfSwgI3twZXJzb24ubmlja05hbWV9DQotICAgIC8vdXNlIHJlZ2lzdHJhdGlvblBhZ2UgdG8gZGlzcGxheSB0aGUgc2Vjb25kIGVycm9yIG1lc3NhZ2UgYXQgb2xkIG5pY2tuYW1lDQotICAgIC8vb3IgbG9jYWwgcHJvcGVydHkgY2hhaW5pbmcgKHRvIGF2b2lkIHRoZSB1c2FnZSBvZiB0aGUgYmVhbiBuYW1lKSAtIGxpa2U6DQotICAgIEBTa2lwVmFsaWRhdGlvbigiI3twZXJzb24ucm9sZSBlcSAnYWRtaW4nfSIpDQotICAgIEBOb3RFcXVhbHMoInBlcnNvbi5uaWNrTmFtZSIpDQotICAgIEBKb2luVmFsaWRhdGlvbigicGVyc29uLm5pY2tOYW1lIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmV3Tmlja05hbWU7DQotDQotICAgIHByaXZhdGUgUGVyc29uIHBlcnNvbjsNCi0NCi0gICAgcHVibGljIFN0cmluZyBmaW5pc2goKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXRQYXNzd29yZCh0aGlzLnBhc3N3b3JkKTsNCi0gICAgICAgIHJldHVybiAiaG9tZSI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyB1cGRhdGVOaWNrTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldE5pY2tOYW1lKHRoaXMubmV3Tmlja05hbWUpOw0KLSAgICAgICAgcmV0dXJuICJob21lIjsNCi0gICAgfQ0KLQ0KLSAgICAvL2p1c3QgYSBxdWljayBpbGx1c3RyYXRpb24gb2Ygc2tpcFZhbGlkYXRpb24NCi0gICAgcHVibGljIFN0cmluZyBzd2l0Y2hNb2RlKCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRSb2xlID0gdGhpcy5wZXJzb24uZ2V0Um9sZSgpOw0KLQ0KLSAgICAgICAgaWYoY3VycmVudFJvbGUuZXF1YWxzKCJhZG1pbiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMucGVyc29uLnNldFJvbGUoInVzZXIiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnBlcnNvbi5zZXRSb2xlKCJhZG1pbiIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuICIiOw0KLSAgICB9DQotDQotICAgIEBKb2luVmFsaWRhdGlvbigicGVyc29uLmVtYWlsIikNCi0gICAgQFZhbGlkYXRvcihFbWFpbFZhbGlkYXRvci5jbGFzcykNCi0gICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbi5nZXRFbWFpbCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKFN0cmluZyBlbWFpbCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0RW1haWwoZW1haWwpOw0KLSAgICB9DQotDQotICAgIEBKb2luVmFsaWRhdGlvbigiI3twZXJzb24ubnVtYmVyT2ZTaWJsaW5nc30iKQ0KLSAgICBATG9uZ1JhbmdlKG1heGltdW0gPSAyMCkNCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNpYmxpbmdzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uLmdldE51bWJlck9mU2libGluZ3MoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXJPZlNpYmxpbmdzKGludCBudW1iZXJPZlNpYmxpbmdzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXROdW1iZXJPZlNpYmxpbmdzKG51bWJlck9mU2libGluZ3MpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRPbGRQYXNzd29yZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBvbGRQYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRPbGRQYXNzd29yZChTdHJpbmcgb2xkUGFzc3dvcmQpDQotICAgIHsNCi0gICAgICAgIHRoaXMub2xkUGFzc3dvcmQgPSBvbGRQYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmRSZXBlYXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZFJlcGVhdGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkUmVwZWF0ZWQoU3RyaW5nIHBhc3N3b3JkUmVwZWF0ZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmRSZXBlYXRlZCA9IHBhc3N3b3JkUmVwZWF0ZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBlcnNvbiBnZXRQZXJzb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGVyc29uOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNvbihQZXJzb24gcGVyc29uKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbiA9IHBlcnNvbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5ld05pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ld05pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5ld05pY2tOYW1lKFN0cmluZyBuZXdOaWNrTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uZXdOaWNrTmFtZSA9IG5ld05pY2tOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg5M2JmZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MThkNjYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+Ci0gICAgPGFwcGxpY2F0aW9uPgotICAgICAgICA8IS0tIHRyaW5pZGFkIC0tPgotICAgICAgICA8ZGVmYXVsdC1yZW5kZXIta2l0LWlkPgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvcmUKLSAgICAgICAgPC9kZWZhdWx0LXJlbmRlci1raXQtaWQ+Ci0KLSAgICA8L2FwcGxpY2F0aW9uPgotCi0gICAgPG1hbmFnZWQtYmVhbj4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1uYW1lPnJlZ2lzdHJhdGlvblBhZ2U8L21hbmFnZWQtYmVhbi1uYW1lPgotICAgICAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmd1aS5iZWFucy5SZWdpc3RyYXRpb25QYWdlPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPgotCi0gICAgICAgIDxtYW5hZ2VkLXByb3BlcnR5PgotICAgICAgICAgICAgPHByb3BlcnR5LW5hbWU+cGVyc29uPC9wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPHZhbHVlPiN7cGVyc29ufTwvdmFsdWU+Ci0gICAgICAgIDwvbWFuYWdlZC1wcm9wZXJ0eT4KLSAgICA8L21hbmFnZWQtYmVhbj4KLQotICAgIDxtYW5hZ2VkLWJlYW4+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tbmFtZT5wZXJzb248L21hbmFnZWQtYmVhbi1uYW1lPgotICAgICAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb248L21hbmFnZWQtYmVhbi1jbGFzcz4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5zZXNzaW9uPC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0gICAgPC9tYW5hZ2VkLWJlYW4+Ci0KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8ZnJvbS12aWV3LWlkPi9wYWdlcy9ob21lLnhodG1sPC9mcm9tLXZpZXctaWQ+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmFkZFVzZXI8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5jaGFuZ2VOaWNrTmFtZTwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmNoYW5nZVBhc3N3b3JkPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICA8L25hdmlnYXRpb24tcnVsZT4KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8ZnJvbS12aWV3LWlkPio8L2Zyb20tdmlldy1pZD4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+aG9tZTwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL2hvbWUueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgIDwvbmF2aWdhdGlvbi1ydWxlPgotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9tYWluLnRhZ2xpYi54bWwgYi9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzOTM2Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIGZhY2VsZXQtdGFnbGliIFBVQkxJQwotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEZhY2VsZXQgVGFnbGliIDEuMC8vRU4iCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9mYWNlbGV0LXRhZ2xpYl8xXzAuZHRkIj4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZmFjZWxldC10YWdsaWI+Ci0gICAgPG5hbWVzcGFjZT5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dHZhbC9kZW1vL2NvbXBvbmVudHM8L25hbWVzcGFjZT4KLQotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT51c2VyRm9ybTwvdGFnLW5hbWU+Ci0gICAgICAgIDxzb3VyY2U+Ci0gICAgICAgICAgICAuLi9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbAotICAgICAgICA8L3NvdXJjZT4KLSAgICA8L3RhZz4KLQotPC9mYWNlbGV0LXRhZ2xpYj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YzAxYWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCi0gICAgICAgICB2ZXJzaW9uPSIyLjQiPgotCi0gICAgPGRlc2NyaXB0aW9uPk15UHJvamVjdCB3ZWIueG1sPC9kZXNjcmlwdGlvbj4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5ERUZBVUxUX1NVRkZJWDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi54aHRtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmZhY2VsZXRzLkxJQlJBUklFUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi9XRUItSU5GL21haW4udGFnbGliLnhtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5FTkFCTEVfTElHSFRXRUlHSFRfRElBTE9HUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRElTQUJMRV9DT05URU5UX0NPTVBSRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5BTFRFUk5BVEVfVklFV19IQU5ETEVSPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y29tLnN1bi5mYWNlbGV0cy5GYWNlbGV0Vmlld0hhbmRsZXI8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuVVNFX0FQUExJQ0FUSU9OX1ZJRVdfQ0FDSEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5DSEFOR0VfUEVSU0lTVEVOQ0U8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5zZXNzaW9uPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBTZWUgSlNGIFNwZWNpZmljYXRpb24gMi41LjMKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNsaWVudDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5OVU1CRVJfT0ZfVklFV1NfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPjIwPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzdGF0ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbSBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uCi0gICAgICAgICAgICBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KSBhbmQgaWYKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgY29tcHJlc3NlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUKLSAgICAgICAgICAgIHJlbmRlcmVkIEhUTUwgb3V0cHV0LgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgbm90IGFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFMTE9XX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5ERVRFQ1RfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCByZW5kZXJlZCBIVE1MIGNvZGUgd2lsbCBiZSBmb3JtYXR0ZWQsIHNvIHRoYXQgaXQgaXMgImh1bWFuIHJlYWRhYmxlIi4KLSAgICAgICAgICAgIGkuZS4gYWRkaXRpb25hbCBsaW5lIHNlcGFyYXRvcnMgYW5kIHdoaXRlc3BhY2Ugd2lsbCBiZSB3cml0dGVuLCB0aGF0IGRvIG5vdAotICAgICAgICAgICAgaW5mbHVlbmNlIHRoZSBIVE1MIGNvZGUuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlBSRVRUWV9IVE1MPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlCi0gICAgICAgICAgICBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuIENvbnZlbmllbnQgZmVhdHVyZSBpZiB5b3UgaGF2ZSBwYWdlcwotICAgICAgICAgICAgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGJyb3dzZXIgcGFnZSB0byBhbHdheXMganVtcCB0byB0aGUgdG9wCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuCi0gICAgICAgICAgICBEZWZhdWx0OiAiZmFsc2UiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BVVRPX1NDUk9MTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQotICAgICAgICAgICAgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucwotICAgICAgICAgICAgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IgZGlmZmVuZW50IGVuY3J5cHRpb24gc3RyZW5ndGhzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VDUkVUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+TnpZMU5ETXlNVEE9PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmFsaWRhdGUgbWFuYWdlZCBiZWFucywgbmF2aWdhdGlvbiBydWxlcyBhbmQgZW5zdXJlIHRoYXQgZm9ybXMgYXJlIG5vdCBuZXN0ZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDwhLS0gTGlzdGVuZXIsIHRvIGFsbG93IEpldHR5IHNlcnZpbmcgTXlGYWNlcyBhcHBzIC0tPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy53ZWJhcHAuU3RhcnR1cFNlcnZsZXRDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLndlYmFwcC5SZXNvdXJjZVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPGZpbHRlcj4KLSAgICAgICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlRyaW5pZGFkRmlsdGVyPC9maWx0ZXItY2xhc3M+Ci0gICAgPC9maWx0ZXI+Ci0KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT50cmluaWRhZDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZ3MgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4vZmFjZXMvKjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPnJlc291cmNlczwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+L2FkZi8qPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sIGIvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NGQ2NDguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiCi0gICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIgotICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIKLSAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIgotICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPgotCi08dWk6Y29tcG9zaXRpb24+Ci0gICAgPHRyOnBhbmVsRm9ybUxheW91dD4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJuaWNrIG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uWyAnbmlja05hbWUnIF19Ii8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9ImUtbWFpbCIgdmFsdWU9IiN7YmVhbi5lbWFpbH0iLz4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJmaXJzdCBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5maXJzdE5hbWV9Ii8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Imxhc3QgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb24ubGFzdE5hbWV9Ii8+Ci0gICAgICAgIDx0cjppbnB1dERhdGUgbGFiZWw9ImJpcnRoZGF5IiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5iaXJ0aGRheX0iPgotICAgICAgICAgICAgPHRyOmNvbnZlcnREYXRlVGltZSB0eXBlPSJkYXRlIiBwYXR0ZXJuPSJkZC5NTS55eXl5Ii8+Ci0gICAgICAgIDwvdHI6aW5wdXREYXRlPgotICAgICAgICA8dHI6aW5wdXREYXRlIGxhYmVsPSJmaW5hbCBleGFtIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5maW5hbEV4YW19Ij4KLSAgICAgICAgICAgIDx0cjpjb252ZXJ0RGF0ZVRpbWUgdHlwZT0iZGF0ZSIgcGF0dGVybj0iZGQuTU0ueXl5eSIvPgotICAgICAgICA8L3RyOmlucHV0RGF0ZT4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJudW1iZXIgb2Ygc2libGluZ3MiIHZhbHVlPSIje2JlYW4ubnVtYmVyT2ZTaWJsaW5nc30iLz4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJwYXNzd29yZCIgdmFsdWU9IiN7YmVhbi5wYXNzd29yZH0iIHNlY3JldD0idHJ1ZSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJyZS1lbnRlciBwYXNzd29yZCIgdmFsdWU9IiN7YmVhbi5wYXNzd29yZFJlcGVhdGVkfSIgc2VjcmV0PSJ0cnVlIi8+Ci0KLSAgICA8L3RyOnBhbmVsRm9ybUxheW91dD4KLTwvdWk6Y29tcG9zaXRpb24+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sIGIvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjZDE0OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotICAgICAgICANCi08aHRtbD4NCi0NCi08aGVhZD4NCi0gICAgPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDsgVVJMPWZhY2VzL3BhZ2VzL2hvbWUueGh0bWwiPg0KLTwvaGVhZD4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sIGIvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGMxZWE4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTx0cjpkb2N1bWVudA0KLSAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIg0KLSAgICAgICAgeG1sbnM6Yz0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3RsL2NvcmUiPg0KLSAgICA8ZjpmYWNldCBuYW1lPSJtZXRhQ29udGFpbmVyIj4NCi0gICAgICAgIDx0aXRsZT5zZXYtZW4gZmVhdHVyZS1zZXQgZGVtbyAwMTwvdGl0bGU+DQotICAgIDwvZjpmYWNldD4NCi0NCi0gICAgPHRyaDpib2R5Pg0KLQ0KLSAgICAgICAgPCEtLSBvcmlnaW5hbCAtLT4NCi0gICAgICAgIDxkaXYgaWQ9IndyYXAiPg0KLQ0KLSAgICAgICAgICAgIDx0cjpmb3JtIGlkPSJmb3JtIiBkZWZhdWx0Q29tbWFuZD0iZGVmYXVsdEJ1dHRvbiI+DQotICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1haW4iPg0KLSAgICAgICAgICAgICAgICAgICAgPHVpOmluc2VydCBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ1bmRlcl9jb25zdHJ1Y3Rpb24iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+IXNpdGUgdW5kZXIgY29uc3RydWN0aW9uITwvaDI+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBjb250ZW50IG9mIHRoaXMgc2l0ZSBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSBtb21lbnQuPC9wPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC91aTppbnNlcnQ+DQotICAgICAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICAgIDwvdHI6Zm9ybT4NCi0gICAgICAgICAgICA8dHI6bWVzc2FnZXMgZ2xvYmFsT25seT0idHJ1ZSIvPg0KLQ0KLSAgICAgICAgPC9kaXY+DQotICAgIDwvdHJoOmJvZHk+DQotDQotDQotPC90cjpkb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWwgYi9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OTNmYWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDx0cjpwYW5lbEZvcm1MYXlvdXQ+DQotDQotICAgICAgICAgICAgPHVpOnJlbW92ZT4NCi0gICAgICAgICAgICAgICAganVzdCBmb3IgdGhlIGRlbW8gd2UgYXJlIHVzaW5nIHR3byBpbnB1dCBjb21wb25lbnRzDQotICAgICAgICAgICAgPC91aTpyZW1vdmU+DQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ib2xkIG5pY2sgbmFtZSIgcmVhZE9ubHk9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLm5pY2tOYW1lfSIvPg0KLQ0KLSAgICAgICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im5pY2sgbmFtZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5uZXdOaWNrTmFtZX0iLz4NCi0NCi0gICAgICAgIDwvdHI6cGFuZWxGb3JtTGF5b3V0Pg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UudXBkYXRlTmlja05hbWV9Ii8+DQotDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWwgYi9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMDk3NWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDx0YWJsZT4NCi0gICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6b3V0cHV0TGFiZWwgdmFsdWU9Im9sZCBwYXNzd29yZCIgZm9yPSJvbGRfcGFzc3dvcmQiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOmlucHV0VGV4dCBpZD0ib2xkX3Bhc3N3b3JkIiBzaW1wbGU9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2Uub2xkUGFzc3dvcmR9IiBzZWNyZXQ9InRydWUiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm1lc3NhZ2UgZm9yPSJvbGRfcGFzc3dvcmQiLz48L3RkPg0KLSAgICAgICAgICAgIDwvdHI+DQotDQotICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm91dHB1dExhYmVsIHZhbHVlPSJuZXcgcGFzc3dvcmQiIGZvcj0ibmV3X3Bhc3N3b3JkIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjppbnB1dFRleHQgaWQ9Im5ld19wYXNzd29yZCIgc2ltcGxlPSJ0cnVlIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjptZXNzYWdlIGZvcj0ibmV3X3Bhc3N3b3JkIi8+PC90ZD4NCi0gICAgICAgICAgICA8L3RyPg0KLQ0KLSAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjpvdXRwdXRMYWJlbCB2YWx1ZT0icmUtZW50ZXIgcGFzc3dvcmQiIGZvcj0icmVlbnRlcmVkIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjppbnB1dFRleHQgaWQ9InJlZW50ZXJlZCIgc2ltcGxlPSJ0cnVlIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBhc3N3b3JkUmVwZWF0ZWR9IiBzZWNyZXQ9InRydWUiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm1lc3NhZ2UgZm9yPSJyZWVudGVyZWQiLz48L3RkPg0KLSAgICAgICAgICAgIDwvdHI+DQotDQotICAgICAgICA8L3RhYmxlPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UuZmluaXNofSIvPg0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbCBiL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxN2ViZDkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJhZGQgdXNlciIgYWN0aW9uPSJhZGRVc2VyIi8+PGJyLz4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9ImNoYW5nZSBuaWNrIG5hbWUiIGFjdGlvbj0iY2hhbmdlTmlja05hbWUiLz48YnIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0iY2hhbmdlIHBhc3N3b3JkIiBhY3Rpb249ImNoYW5nZVBhc3N3b3JkIi8+PGJyLz4NCi0gICAgICAgIDx0cjpjb21tYW5kTGluayB0ZXh0PSJtb2RlOiAje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLnJvbGV9Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2Uuc3dpdGNoTW9kZX0iIGltbWVkaWF0ZT0idHJ1ZSIvPg0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sIGIvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGY2YjA2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6Yz0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHR2YWwvZGVtby9jb21wb25lbnRzIg0KLSAgICAgICAgPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgPGM6dXNlckZvcm0gYmVhbj0iI3tyZWdpc3RyYXRpb25QYWdlfSIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UuZmluaXNofSIvPg0KLQ0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sIGIvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGEzYzRlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPgotCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBoZWxsbyB3b3JsZDwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjIuMjwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjI8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qc3RsPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anN0bDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PiAgICAgICAgCi0KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OTNiZmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYWZiMzkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLmRvbWFpbi5QZXJzb247Ci0KLS8qKgotICogQSB0eXBpY2FsIHNpbXBsZSBiYWNraW5nIGJlYW4sIHRoYXQgaXMgYmFja2VkIHRvIDxjb2RlPmhlbGxvd29ybGQuanNwPC9jb2RlPgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkQ29udHJvbGxlcgotewotICAgIHByaXZhdGUgUGVyc29uIHBlcnNvbiA9IG5ldyBQZXJzb24oKTsKLQotICAgIC8qKgotICAgICAqIGRlZmF1bHQgZW1wdHkgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgSGVsbG9Xb3JsZENvbnRyb2xsZXIoKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdGhhdCBpcyBiYWNrZWQgdG8gYSBzdWJtaXQgYnV0dG9uIG9mIGEgZm9ybS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHNlbmQoKQotICAgIHsKLSAgICAgICAgLy9kbyByZWFsIGxvZ2ljLCByZXR1cm4gYSBzdHJpbmcgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciB0aGUgbmF2aWdhdGlvbiBzeXN0ZW0gb2YgSlNGCi0gICAgICAgIHJldHVybiAic3VjY2VzcyI7Ci0gICAgfQotCi0gICAgcHVibGljIFBlcnNvbiBnZXRQZXJzb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBlcnNvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzb24oUGVyc29uIHBlcnNvbikKLSAgICB7Ci0gICAgICAgIHRoaXMucGVyc29uID0gcGVyc29uOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YSBiL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvZG9tYWluL1BlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmQ0YTllLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvZG9tYWluL1BlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLmRvbWFpbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7Ci0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47Ci0KLXB1YmxpYyBjbGFzcyBQZXJzb24KLXsKLSAgICAvL2hlbGxvIHdvcmxkIGRlbW8KLSAgICBAUmVxdWlyZWQKLSAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7Ci0KLSAgICAvL2RlbW8gZm9yIGpwYSBiYXNlZCB2YWxpZGF0aW9uIHN1cHBvcnQKLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwIC8qLi4uKi8pCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbGFzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg5M2JmZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYmVhZTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZmFjZXMtY29uZmlnIHZlcnNpb249IjEuMiIgCi0gICAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiPgotCQotCTwhLS0gbWFuYWdlZCBiZWFucyBvZiB0aGUgc2ltcGxlIGhlbGxvIHdvcmxkIGFwcCAtLT4KLQk8bWFuYWdlZC1iZWFuPgotCQk8bWFuYWdlZC1iZWFuLW5hbWU+aGVsbG9Xb3JsZDwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0JCTxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLkhlbGxvV29ybGRDb250cm9sbGVyPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0JCTxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPgotCTwvbWFuYWdlZC1iZWFuPgotCQotCTwhLS0gbmF2aWdhdGlvbiBydWxlcyBmb3IgaGVsbG9Xb3JsZC5qc3AgLS0+Ci0JPG5hdmlnYXRpb24tcnVsZT4KLQkJPGZyb20tdmlldy1pZD4vaGVsbG9Xb3JsZC5qc3A8L2Zyb20tdmlldy1pZD4KLQkJPG5hdmlnYXRpb24tY2FzZT4KLQkJCTxmcm9tLW91dGNvbWU+c3VjY2VzczwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L3BhZ2UyLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0JCi0JPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciBwYWdlMi5qc3AgLS0+Ci0JPG5hdmlnYXRpb24tcnVsZT4KLQkJPGZyb20tdmlldy1pZD4vcGFnZTIuanNwPC9mcm9tLXZpZXctaWQ+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPmJhY2s8L2Zyb20tb3V0Y29tZT4KLQkJCTx0by12aWV3LWlkPi9oZWxsb1dvcmxkLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNGExODMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCi0gICAgICAgICB2ZXJzaW9uPSIyLjQiPgotCi0gICAgPGRlc2NyaXB0aW9uPk15UHJvamVjdCB3ZWIueG1sPC9kZXNjcmlwdGlvbj4KLQotICAgIDwhLS1vcHRpb25hbDogY29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIFVSSXMgb2YgKGFkZGl0aW9uYWwpIGZhY2VzIGNvbmZpZyBmaWxlcy4KLSAgICAgICAgICAgIChlLmcuIC9XRUItSU5GL215LWNvbmZpZy54bWwpCi0gICAgICAgICAgICBTZWUgSlNGIDEuMCBQUkQyLCAxMC4zLjIKLSAgICAgICAgICAgIEF0dGVudGlvbjogWW91IGRvIG5vdCBuZWVkIHRvIHB1dCAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGluIGhlcmUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkNPTkZJR19GSUxFUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi9XRUItSU5GL2V4YW1wbGVzLWNvbmZpZy54bWw8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbS0tPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+U3RhdGUgc2F2aW5nIG1ldGhvZDogImNsaWVudCIgb3IgInNlcnZlciIgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIFNlZSBKU0YgU3BlY2lmaWNhdGlvbiAyLjUuMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jbGllbnQ8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgRGVmaW5lcyB0aGUgYW1vdW50IChkZWZhdWx0ID0gMjApIG9mIHRoZSBsYXRlc3Qgdmlld3MgYXJlIHN0b3JlZCBpbiBzZXNzaW9uLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5OVU1CRVJfT0ZfVklFV1NfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPjIwPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzdGF0ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbSBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uCi0gICAgICAgICAgICBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpIGFuZCBpZgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OIGlzIHRydWUgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzZXJpYWxpemVkIHN0YXRlIHdpbGwgYmUgY29tcHJlc3NlZCBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBjb21wcmVzc2VkLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DT01QUkVTU19TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhpcyBwYXJhbWV0ZXIgdGVsbHMgTXlGYWNlcyBpZiBqYXZhc2NyaXB0IGNvZGUgc2hvdWxkIGJlIGFsbG93ZWQgaW4gdGhlCi0gICAgICAgICAgICByZW5kZXJlZCBIVE1MIG91dHB1dC4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgYWxsb3dlZCwgY29tbWFuZF9saW5rIGFuY2hvcnMgd2lsbCBoYXZlIGphdmFzY3JpcHQgY29kZQotICAgICAgICAgICAgdGhhdCBzdWJtaXRzIHRoZSBjb3JyZXNwb25kaW5nIGZvcm0uCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIG5vdCBhbGxvd2VkLCB0aGUgc3RhdGUgc2F2aW5nIGluZm8gYW5kIG5lc3RlZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICB3aWxsIGJlIGFkZGVkIGFzIHVybCBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFMTE9XX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5ERVRFQ1RfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCByZW5kZXJlZCBIVE1MIGNvZGUgd2lsbCBiZSBmb3JtYXR0ZWQsIHNvIHRoYXQgaXQgaXMgImh1bWFuIHJlYWRhYmxlIi4KLSAgICAgICAgICAgIGkuZS4gYWRkaXRpb25hbCBsaW5lIHNlcGFyYXRvcnMgYW5kIHdoaXRlc3BhY2Ugd2lsbCBiZSB3cml0dGVuLCB0aGF0IGRvIG5vdAotICAgICAgICAgICAgaW5mbHVlbmNlIHRoZSBIVE1MIGNvZGUuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUFJFVFRZX0hUTUw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCBhIGphdmFzY3JpcHQgZnVuY3Rpb24gd2lsbCBiZSByZW5kZXJlZCB0aGF0IGlzIGFibGUgdG8gcmVzdG9yZSB0aGUKLSAgICAgICAgICAgIGZvcm1lciB2ZXJ0aWNhbCBzY3JvbGwgb24gZXZlcnkgcmVxdWVzdC4gQ29udmVuaWVudCBmZWF0dXJlIGlmIHlvdSBoYXZlIHBhZ2VzCi0gICAgICAgICAgICB3aXRoIGxvbmcgbGlzdHMgYW5kIHlvdSBkbyBub3Qgd2FudCB0aGUgYnJvd3NlciBwYWdlIHRvIGFsd2F5cyBqdW1wIHRvIHRoZSB0b3AKLSAgICAgICAgICAgIGlmIHlvdSB0cmlnZ2VyIGEgbGluayBvciBidXR0b24gYWN0aW9uIHRoYXQgc3RheXMgb24gdGhlIHNhbWUgcGFnZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJmYWxzZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQVVUT19TQ1JPTEw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlVzZWQgZm9yIGVuY3J5cHRpbmcgdmlldyBzdGF0ZS4gT25seSByZWxldmFudCBmb3IgY2xpZW50IHNpZGUKLSAgICAgICAgICAgIHN0YXRlIHNhdmluZy4gU2VlIE15RmFjZXMgd2lraS93ZWIgc2l0ZSBkb2N1bWVudGF0aW9uIGZvciBpbnN0cnVjdGlvbnMKLSAgICAgICAgICAgIG9uIGhvdyB0byBjb25maWd1cmUgYW4gYXBwbGljYXRpb24gZm9yIGRpZmZlbmVudCBlbmNyeXB0aW9uIHN0cmVuZ3Rocy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFQ1JFVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPk56WTFORE15TVRBPTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZhbGlkYXRlIG1hbmFnZWQgYmVhbnMsIG5hdmlnYXRpb24gcnVsZXMgYW5kIGVuc3VyZSB0aGF0IGZvcm1zIGFyZSBub3QgbmVzdGVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuVkFMSURBVEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRyZWF0IHJlYWRvbmx5IHNhbWUgYXMgaWYgZGlzYWJsZWQgYXR0cmlidXRlIHdhcyBzZXQgZm9yIHNlbGVjdCBlbGVtZW50cy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlJFQURPTkxZX0FTX0RJU0FCTEVEX0ZPUl9TRUxFQ1RTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVXNlIHRoZSBkZWZpbmVkIGNsYXNzIGFzIHRoZSBjbGFzcyB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgcmVzb3VyY2UgaXMgYWRkZWQgdG8gdGhlCi0gICAgICAgICAgICBFeHRlbnNpb25GaWx0ZXIgaGFuZGxpbmcuIFVzaW5nIFN0cmVhbWluZ0FkZFJlc291cmNlIGhlcmUgaGVscHMgd2l0aCBwZXJmb3JtYW5jZS4gSWYgeW91IHdhbnQgdG8gYWRkCi0gICAgICAgICAgICBjdXN0b20gY29tcG9uZW50cyBhbmQgd2FudCB0byB1c2UgdGhlIEV4dGVuc2lvbkZpbHRlciwgeW91IG5lZWQgdG8gcHJvdmlkZSB5b3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBoZXJlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUREX1JFU09VUkNFX0NMQVNTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLnV0aWwuRGVmYXVsdEFkZFJlc291cmNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgICAgICAKLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWaXJ0dWFsIHBhdGggaW4gdGhlIFVSTCB3aGljaCB0cmlnZ2VycyBsb2FkaW5nIG9mIHJlc291cmNlcyBmb3IgdGhlIE15RmFjZXMgZXh0ZW5kZWQgY29tcG9uZW50cwotICAgICAgICAgICAgaW4gdGhlIEV4dGVuc2lvbkZpbHRlci4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlJFU09VUkNFX1ZJUlRVQUxfUEFUSDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi9mYWNlcy9teUZhY2VzRXh0ZW5zaW9uUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgQ2hlY2sgaWYgdGhlIGV4dGVuc2lvbnMtZmlsdGVyIGhhcyBiZWVuIHByb3Blcmx5IGNvbmZpZ3VyZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DSEVDS19FWFRFTlNJT05TX0ZJTFRFUjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgRGVmaW5lIHBhcnRpYWwgc3RhdGUgc2F2aW5nIGFzIHRydWUvZmFsc2UuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlBBUlRJQUxfU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotCi0gICAgPCEtLSBMaXN0ZW5lciwgdG8gYWxsb3cgSmV0dHkgc2VydmluZyBNeUZhY2VzIGFwcHMgLS0+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLndlYmFwcC5TdGFydHVwU2VydmxldENvbnRleHRMaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+Ci0gICAgPC9saXN0ZW5lcj4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCAtLT4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICAgIDwvc2VydmxldD4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCBNYXBwaW5nIC0tPgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+Ki5qc2Y8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPCEtLSBXZWxjb21lIGZpbGVzIC0tPgotICAgIDx3ZWxjb21lLWZpbGUtbGlzdD4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5qc3A8L3dlbGNvbWUtZmlsZT4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+Ci0gICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KLQotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AgYi9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNlMTBiMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwlLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tJT4KLQotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgICAgPGY6dmlldz4KLSAgICAgICAgICAgIDxoOmZvcm0gaWQ9Im1haW5Gb3JtIj4KLSAgICAgICAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjMiPgotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0iZmlyc3RfbmFtZSIgdmFsdWU9IkZpcnN0IG5hbWU6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJmaXJzdF9uYW1lIiBsYWJlbD0iRmlyc3QgbmFtZSIgdmFsdWU9IiN7aGVsbG9Xb3JsZC5wZXJzb24uZmlyc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJmaXJzdF9uYW1lIiBzaG93U3VtbWFyeT0idHJ1ZSIgc2hvd0RldGFpbD0iZmFsc2UiLz4KLQotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0ibGFzdF9uYW1lIiB2YWx1ZT0iTGFzdCBuYW1lOiIvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0ibGFzdF9uYW1lIiBsYWJlbD0iTGFzdCBuYW1lIiB2YWx1ZT0iI3toZWxsb1dvcmxkLnBlcnNvbi5sYXN0TmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0ibGFzdF9uYW1lIiBzaG93U3VtbWFyeT0idHJ1ZSIgc2hvd0RldGFpbD0iZmFsc2UiLz4KLQotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Xb3JsZC5zZW5kfSIvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgICAgICAgPC9oOmZvcm0+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcCBiL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ4MmQ1My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCBwYWdlIHNlc3Npb249ImZhbHNlIiU+Ci08JQotcmVzcG9uc2Uuc2VuZFJlZGlyZWN0KCJoZWxsb1dvcmxkLmpzZiIpOwotJT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AgYi9wcmVwYXJlLzFfMl8yL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYzg1MjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgICA8Zjp2aWV3PgotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPgotICAgICAgICAgICAgICAgIDxoMj48aDpvdXRwdXRUZXh0IHZhbHVlPSJIZWxsbyAje2hlbGxvV29ybGQucGVyc29uLmZpcnN0TmFtZX0gI3toZWxsb1dvcmxkLnBlcnNvbi5sYXN0TmFtZX0uIFdlIGhvcGUgeW91IGVuam95IEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yISIvPjwvaDI+Ci0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZExpbmsgYWN0aW9uPSJiYWNrIj4KLSAgICAgICAgICAgICAgICAgICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iSG9tZSIvPgotICAgICAgICAgICAgICAgIDwvaDpjb21tYW5kTGluaz4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICA8L2Y6dmlldz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9wb20ueG1sIGIvcHJlcGFyZS8xXzJfMi9leGFtcGxlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzkzNTk0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvZXhhbXBsZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgcHJvamVjdDwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjIuMjwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuMjwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RhZ3MvMV8yXzI8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGFncy8xXzJfMjwvdXJsPgotICAgIDwvc2NtPgotICAgIAotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS1UaGlzIHBsdWdpbiBhbGxvd3MgdG8gcnVuIHRoZSBleGFtcGxlIHVzaW5nIG12biBqZXR0eTpydW4gLS0+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamV0dHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjYuMS44PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c2NhbkludGVydmFsU2Vjb25kcz4xMDwvc2NhbkludGVydmFsU2Vjb25kcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLSAgICA8bW9kdWxlcz4KLSAgICAgICAgPG1vZHVsZT5oZWxsb193b3JsZDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmZlYXR1cmUtc2V0XzAxPC9tb2R1bGU+Ci0gICAgPC9tb2R1bGVzPgotCi0gICAgPHByb2ZpbGVzPgotICAgICAgICA8IS0tIFRoaXMgcHJvZmlsZSBpcyBpbnZva2VkIGJ5IC1EcHJlcGFyZVJlbGVhc2U9dHJ1ZS4gIFRoaXMgYWxsb3dzIG12biByZWxlYXNlOnByZXBhcmUgdG8KLSAgICAgICAgICAgIHJ1biBzdWNjZXNzZnVsbHkgb24gdGhlIGFzc2VtYmx5IHByb2plY3RzLiAtLT4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+cHJlcGFyZS1yZWxlYXNlPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+cHJlcGFyZVJlbGVhc2U8L25hbWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxtb2R1bGVzPgotICAgICAgICAgICAgICAgIDxtb2R1bGU+YXNzZW1ibHk8L21vZHVsZT4KLSAgICAgICAgICAgIDwvbW9kdWxlcz4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ3VtZW50cz4tRHByZXBhcmVSZWxlYXNlPC9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDx0cmluaWRhZC52ZXJzaW9uPjEuMi45PC90cmluaWRhZC52ZXJzaW9uPgotICAgIDwvcHJvcGVydGllcz4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvbG9nby9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8yXzIvbG9nby9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2xvZ28vTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvbG9nby9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzJfMi9sb2dvL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OTNiZmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9sb2dvL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL2xvZ28vZXh0dmFsLWxvZ28uc3ZnIGIvcHJlcGFyZS8xXzJfMi9sb2dvL2V4dHZhbC1sb2dvLnN2ZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcyYjUzOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL2xvZ28vZXh0dmFsLWxvZ28uc3ZnCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Ci08IS0tIENyZWF0ZWQgd2l0aCBJbmtzY2FwZSAoaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvKSAtLT4KLQotCi08IS0tCi0JQ29weXJpZ2h0IDIwMDkgRW5yaWNvIEJlcnRpIChlbnJpY28uYmVydGlAZ21haWwuY29tKQotCi0JTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0JeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0JICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0JVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotCWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0JV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0JU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotCWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLQotPHN2ZwotICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKLSAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKLSAgIHZlcnNpb249IjEuMCIKLSAgIHdpZHRoPSI3NDQuMDk0NDgiCi0gICBoZWlnaHQ9IjEwNTIuMzYyMiIKLSAgIGlkPSJzdmcyIj4KLSAgPGRlZnMKLSAgICAgaWQ9ImRlZnM0IiAvPgotICA8ZwotICAgICBpZD0ibGF5ZXIyIj4KLSAgICA8cmVjdAotICAgICAgIHdpZHRoPSIzNTMuNDE5NTMiCi0gICAgICAgaGVpZ2h0PSIxMTMuMTA4NCIKLSAgICAgICByeT0iMTEiCi0gICAgICAgeD0iMTgyLjIzMDE1IgotICAgICAgIHk9IjM4MS4zMzI5MiIKLSAgICAgICBpZD0icmVjdDI0ODQiCi0gICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzY2NjY2ZjtzdHJva2Utd2lkdGg6MC44MDE4ODI2MjtzdHJva2Utb3BhY2l0eTowLjk0MTE3NjQ3IiAvPgotICA8L2c+Ci0gIDxnCi0gICAgIGlkPSJsYXllcjEiPgotICAgIDxwYXRoCi0gICAgICAgZD0iTSAxMDcuMTg3NSwzOTMuNTY2MzggTCAxMjIuMzA0NjksMzkzLjU2NjM4IEwgMTc3LjUsNDY3LjM5NDUxIEwgMTYyLjM4MjgxLDQ2Ny4zOTQ1MSBMIDEwNy4xODc1LDM5My41NjYzOCBNIDEyMi4zMDQ2OSw0NjcuMzk0NTEgTCAxMDcuMTg3NSw0NjcuMzk0NTEgTCAxNjIuMzgyODEsMzkzLjU2NjM4IEwgMTc3LjUsMzkzLjU2NjM4IEwgMTIyLjMwNDY5LDQ2Ny4zOTQ1MSBNIDE4NS45Mzc1LDM4MS42MTMyNiBMIDE5NC4wOTM3NSwzODEuNjEzMjYgTCAxOTYuOTA2MjUsMzkzLjU2NjM4IEwgMjE0LjA2MjUsMzkzLjU2NjM4IEwgMjE0LjA2MjUsNDA0LjExMzI2IEwgMTk4Ljk0NTMxLDQwNC4xMTMyNiBMIDE5OC45NDUzMSw0NDYuNTExNjkgQyAxOTguOTQ1Myw0NTMuNDAyMzMgMjAxLjkyMTg2LDQ1Ni44NDc2NCAyMDcuODc1LDQ1Ni44NDc2MyBMIDIxNC4wNjI1LDQ1Ni44NDc2MyBMIDIxNC4wNjI1LDQ2Ny4zOTQ1MSBMIDIwNC41LDQ2Ny4zOTQ1MSBDIDE5Mi4xMjQ5OSw0NjcuMzk0NTEgMTg1LjkzNzUsNDYwLjc2MTcgMTg1LjkzNzUsNDQ3LjQ5NjA3IEwgMTg1LjkzNzUsMzgxLjYxMzI2IgotICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE0Ny41MjE3MywxOS4yOTE5MjIpIgotICAgICAgIGlkPSJmbG93Um9vdDI0NjEiCi0gICAgICAgc3R5bGU9ImZvbnQtc2l6ZTo0MHB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojNjY2NjY2O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtmb250LWZhbWlseTpTYW5zYXRpb247LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpTYW5zYXRpb24iIC8+Ci0gICAgPHBhdGgKLSAgICAgICBkPSJNIDQ4NC4xNTYyNSwzMzcuOTM3NSBDIDQ3OS45NTAwNywzNDEuMTgxMDUgNDc2LjkwODYxLDM0NS42MDEyMSA0NzMuNzE4NzUsMzQ5Ljc4MTI1IEMgNDY2LjA3MTkyLDM2MC4xNTkwMiA0NTguMzUzNDcsMzcwLjQ4NDYxIDQ1MC44MzczOSwzODAuOTU3OTYgQyA0NDAuOTgxMjMsMzk0LjQ0ODczIDQzMS4yOTU5Myw0MDguMDY0NDkgNDIxLjgzMjk4LDQyMS44MzQxMyBDIDQxMy42NTAwNyw0MzMuNzI3OTkgNDA1LjQ1NTY4LDQ0NS42MTQxMiAzOTcuMzU4NTcsNDU3LjU2NjY2IEMgMzk2Ljc0NDYsNDU4LjMzMzA5IDM5Ni4zNTExOSw0NTkuMzA0MjcgMzk1LjU5Mzc1LDQ1OS45Mzc1IEMgMzk0Ljc4MzAzLDQ2MC41MDYyNyAzOTMuMzk2OTcsNDYwLjA3NDI1IDM5My4zMDk5NSw0NTkuMDA3ODUgQyAzOTAuMDU3ODIsNDQxLjY0NTE0IDM4Ni43NzI1Niw0MjQuMjg4NjUgMzgzLjM5NzQyLDQwNi45NDkzOCBDIDM4Mi4wMjYsMzk5Ljc3NDIyIDM4MC42MjY0MywzOTIuNjAzNDQgMzc5LjA2ODY2LDM4NS40NjYyNSBDIDM3OC4zMzMwMiwzODIuMTI5MjQgMzc3LjU1NzY0LDM3OC43ODg1NCAzNzYuNDU1NiwzNzUuNTUyMzMgQyAzNzYuMDgxODksMzc0LjY5MzczIDM3NS45Mjg0NiwzNzMuNDg3MzkgMzc0Ljg2MTUyLDM3My4yMTMzNiBDIDM3My45MDk0NSwzNzIuNzczNTkgMzcyLjg3MTEzLDM3My4zNTA1NCAzNzIuMzYxMjMsMzc0LjE3OTA5IEMgMzcxLjQxNDgxLDM3NS41NTY5MSAzNzAuNjE1NzEsMzc3LjA1Nzk4IDM3MC4xNjI2MywzNzguNjczOTggQyAzNjkuMTU5NDYsMzgxLjcwMDE5IDM2OC44NTA5NywzODQuOTA0OTIgMzY4LjczNDQ1LDM4OC4wNzQ4MSBDIDM2OC42Njg3NiwzOTIuNzc0MTcgMzY5LjQwODg4LDM5Ny40MzM2OSAzNzAuMTIxNjIsNDAyLjA2NDc5IEMgMzcxLjk0NTE4LDQxMy4zMzM5MyAzNzQuMzI0MTcsNDI0LjUwMzczIDM3Ni4xNzQ4Niw0MzUuNzY4MTMgQyAzNzYuODYwNTUsNDM5LjU3MTA3IDM3Ny41MDI5Nyw0NDMuMzgzMyAzNzcuOTE5NzMsNDQ3LjIyNjY5IEMgMzc4LjQ1ODE4LDQ1Mi4xODcwOCAzNzguNTc4NDcsNDU3LjE4Mjc5IDM3OC42MjUsNDYyLjE2ODczIEMgMzc4LjY0ODkzLDQ3MC43MzcwOSAzNzguMDUwMzgsNDc5LjMwMDg1IDM3OC4yNjQzOSw0ODcuODY5NzQgQyAzNzguNTA2OTksNDkxLjA2NTE1IDM3OC45NDM2OSw0OTQuMzk0MjkgMzgwLjYzNjc2LDQ5Ny4xODE1NSBDIDM4MS43MTgxOCw0OTguOTE2MSAzODMuNTc0Nyw1MDAuMjU3ODYgMzg1LjY3MTE3LDUwMC4yOTk2NSBDIDM4Ny43OTU4NCw1MDAuMzQ4MDMgMzg5Ljg5NzA0LDQ5OS41NTk3NSAzOTEuNjMzNTQsNDk4LjM3MDgzIEMgMzkyLjk4MDExLDQ5Ny4zNDQyOCAzOTQuMTAwNDQsNDk2LjAyMzY3IDM5NC45OTg4OSw0OTQuNTkxNzIgQyAzOTYuNDk4MzEsNDkyLjA1MjQ2IDM5OC4wNjMwNyw0ODkuNTM5MTMgMzk5LjIzMDI4LDQ4Ni44Mjc5NyBDIDQwMC42MTM1Myw0ODMuNzI4ODMgNDAxLjk2NDcyLDQ4MC42MTQgNDAzLjE3MDI2LDQ3Ny40Mzk4OSBDIDQwNC43OTMzOCw0NzMuMjE2NDUgNDA2LjQyNTY3LDQ2OC45OTAxMiA0MDguNDQwNzQsNDY0LjkzNDIgQyA0MTEuNzc3OTEsNDU3Ljg1MjUxIDQxNS4zNDI2Niw0NTAuODgwMTEgNDE5LjAwODIsNDQzLjk2MzYyIEMgNDIxLjA1MDYxLDQ0MC4xMzA0MiA0MjMuMjA5MjEsNDM2LjM1NjMxIDQyNS41NTg2NSw0MzIuNzAyOTMgQyA0MjguNDAyNTQsNDI4LjUxMzQ3IDQzMS40MTY2MSw0MjQuNDQzMTggNDM0LjQyOTEyLDQyMC4zNzQ2NSBDIDQ0MC4yODY1LDQxMi41NzQ1NiA0NDYuMzMzNjcsNDA0LjkxOTY0IDQ1Mi4yMzY5MSwzOTcuMTU0NDcgQyA0NTYuOTc4NzksMzkwLjk4NjE1IDQ2MS43NTIzNSwzODQuODQwNzEgNDY2LjM5MzE3LDM3OC41OTU4NyBDIDQ2OS4zNTM3MywzNzQuNTkxNjYgNDcyLjIyMTYzLDM3MC41MTYzMiA0NzQuOTQyOTMsMzY2LjM0NTY4IEMgNDc3Ljg0NDA2LDM2MS43Njg0NyA0ODAuNTI3NTcsMzU3LjAzNTA1IDQ4Mi42NzQyOSwzNTIuMDU0MDUgQyA0ODQuMDc5OTMsMzQ4LjY3Mzc5IDQ4NS4yNzAzNiwzNDUuMTM5IDQ4NS40NDI3MywzNDEuNDUyNzkgQyA0ODUuNDU5OTEsMzQwLjUzNDE5IDQ4NS41NTgyMywzMzkuNTgyNjkgNDg1LjMxMjUsMzM4LjY4NzUgQyA0ODUuMTE3ODMsMzM4LjIzMzU5IDQ4NC43MDI0NiwzMzcuNzgxMDkgNDg0LjE1NjI1LDMzNy45Mzc1IHoiCi0gICAgICAgaWQ9InRleHQyNDc1IgotICAgICAgIHN0eWxlPSJmb250LXNpemU6NDkuMzIxNjkzNDJweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6Izk5Y2MwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjE7Zm9udC1mYW1pbHk6U2Fuc2F0aW9uOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246U2Fuc2F0aW9uIiAvPgotICAgIDxwYXRoCi0gICAgICAgZD0iTSAxNDIuNTU0NjksMzkzLjU2NjM4IEMgMTY1LjE0ODM4LDM5My41NjY0NiAxNzQuMjY1NTYsNDA3LjExMzMyIDE2OS45MDYyNSw0MzQuMjA3MDEgTCAxMjAuMTk1MzEsNDM0LjIwNzAxIEMgMTIwLjE5NTMsNDQ5LjMwMDc3IDEyOS43MTA5MSw0NTYuODQ3NjQgMTQ4Ljc0MjE5LDQ1Ni44NDc2MyBDIDE1NS4yNTc3Niw0NTYuODQ3NjQgMTYxLjc3MzM4LDQ1Ni4xNDQ1MiAxNjguMjg5MDYsNDU0LjczODI2IEwgMTY4LjI4OTA2LDQ2NS4yODUxMyBDIDE2MS43NzMzOCw0NjYuNjkxMzggMTUzLjg1MTUyLDQ2Ny4zOTQ1MSAxNDQuNTIzNDQsNDY3LjM5NDUxIEMgMTE5LjYzMjgsNDY3LjM5NDUxIDEwNy4xODc1LDQ1NC44MDg1OCAxMDcuMTg3NSw0MjkuNjM2NjkgQyAxMDcuMTg3NSw0MDUuNTg5ODggMTE4Ljk3NjU1LDM5My41NjY0NiAxNDIuNTU0NjksMzkzLjU2NjM4IE0gMTIwLjE5NTMxLDQyMy4zNzg4OCBMIDE1OC4wMjM0NCw0MjMuMzc4ODggQyAxNTguNjc5NjQsNDEwLjQ0MTQ0IDE1Mi44MjAyNyw0MDMuOTcyNjkgMTQwLjQ0NTMxLDQwMy45NzI2MyBDIDEyNy43ODkwNCw0MDMuOTcyNjkgMTIxLjAzOTA1LDQxMC40NDE0NCAxMjAuMTk1MzEsNDIzLjM3ODg4IgotICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDgxLjA0MjUsMTkuMjkxNjc2KSIKLSAgICAgICBpZD0iZmxvd1Jvb3Q0NzgzIgotICAgICAgIHN0eWxlPSJmb250LXNpemU6NDBweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjE7Zm9udC1mYW1pbHk6U2Fuc2F0aW9uOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246U2Fuc2F0aW9uIiAvPgotICAgIDxwYXRoCi0gICAgICAgZD0iTSAxMDcuMTg3NSw0NDQuNDAyMzIgQyAxMDcuMTg3NSw0MjkuMjYxNzMgMTE3LjE3MTg3LDQyMS42OTE0MyAxMzcuMTQwNjIsNDIxLjY5MTM4IEMgMTQ0LjQ5OTk2LDQyMS42OTE0MyAxNTAuOTIxODMsNDIyLjE2MDE4IDE1Ni40MDYyNSw0MjMuMDk3NjMgTCAxNTYuNDA2MjUsNDE2LjEzNjY5IEMgMTU2LjQwNjIsNDA4LjEyMTEzIDE0OS43NzMzOSw0MDQuMTEzMzIgMTM2LjUwNzgxLDQwNC4xMTMyNiBDIDEyOC45MTQwNCw0MDQuMTEzMzIgMTIxLjEzMjgsNDA1LjI4NTE5IDExMy4xNjQwNiw0MDcuNjI4ODggTCAxMTMuMTY0MDYsMzk3LjA4MjAxIEMgMTIxLjEzMjgsMzk0LjczODMzIDEyOC45MTQwNCwzOTMuNTY2NDYgMTM2LjUwNzgxLDM5My41NjYzOCBDIDE1OC40NDUyNiwzOTMuNTY2NDYgMTY5LjQxNCw0MDEuNDQxNDUgMTY5LjQxNDA2LDQxNy4xOTEzOCBMIDE2OS40MTQwNiw0NjcuMzk0NTEgTCAxNjIuODA0NjksNDY3LjM5NDUxIEwgMTU3LjYwMTU2LDQ2Mi4xOTEzOCBDIDE1MS4xNzk2NCw0NjUuNjYwMTMgMTQzLjYzMjc4LDQ2Ny4zOTQ1MSAxMzQuOTYwOTQsNDY3LjM5NDUxIEMgMTE2LjQ0NTMsNDY3LjM5NDUxIDEwNy4xODc1LDQ1OS43MzA0NSAxMDcuMTg3NSw0NDQuNDAyMzIgTSAxNTYuNDA2MjUsNDMzLjY0NDUxIEMgMTUxLjI0OTk2LDQzMi43MDcwNCAxNDQuODI4MDksNDMyLjIzODI5IDEzNy4xNDA2Miw0MzIuMjM4MjYgQyAxMjUuODQzNzMsNDMyLjIzODI5IDEyMC4xOTUzLDQzNi4yMjI2NiAxMjAuMTk1MzEsNDQ0LjE5MTM4IEMgMTIwLjE5NTMsNDUyLjYyODkgMTI1LjExNzE3LDQ1Ni44NDc2NCAxMzQuOTYwOTQsNDU2Ljg0NzYzIEMgMTQzLjk2MDksNDU2Ljg0NzY0IDE1MS4xMDkzMyw0NTQuOTI1NzcgMTU2LjQwNjI1LDQ1MS4wODIwMSBMIDE1Ni40MDYyNSw0MzMuNjQ0NTEiCi0gICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMDAwMDIsMCwwLDEsMzI5LjczODI5LDE5LjI5MTY3NikiCi0gICAgICAgaWQ9ImZsb3dSb290NDgwNyIKLSAgICAgICBzdHlsZT0iZm9udC1zaXplOjQwcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO2ZvbnQtZmFtaWx5OlNhbnNhdGlvbjstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlNhbnNhdGlvbiIgLz4KLSAgICA8cGF0aAotICAgICAgIGQ9Ik0gMTA3LjE4NzUsMzY2Ljg0NzYzIEwgMTA3LjE4NzUsNDY3LjM5NDUxIEwgMTIwLjE5NTMxLDQ2Ny4zOTQ1MSBMIDEyMC4xOTUzMSwzNjYuODQ3NjMgTCAxMDcuMTg3NSwzNjYuODQ3NjMiCi0gICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMDAwMDIsMCwwLDEsNDAzLjc5OTI5LDE5LjI5MTY3NikiCi0gICAgICAgaWQ9ImZsb3dSb290NDgxOSIKLSAgICAgICBzdHlsZT0iZm9udC1zaXplOjQwcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO2ZvbnQtZmFtaWx5OlNhbnNhdGlvbjstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlNhbnNhdGlvbiIgLz4KLSAgPC9nPgotICA8ZwotICAgICBpZD0ibGF5ZXIzIj4KLSAgICA8cmVjdAotICAgICAgIHdpZHRoPSIxMS44OTE1OTciCi0gICAgICAgaGVpZ2h0PSIxMi44MDYzMzUiCi0gICAgICAgeD0iMzMzLjU3NDU1IgotICAgICAgIHk9IjQwMC44NzM4NCIKLSAgICAgICBpZD0icmVjdDQ2OTUiCi0gICAgICAgc3R5bGU9ImZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utb3BhY2l0eToxIiAvPgotICAgIDxyZWN0Ci0gICAgICAgd2lkdGg9IjE1LjA3MTQ3MyIKLSAgICAgICBoZWlnaHQ9IjIwLjEyNDE1NyIKLSAgICAgICByeT0iMC4zMTQ0NDEzMiIKLSAgICAgICB4PSIyODEuODkxODIiCi0gICAgICAgeT0iNDM5Ljc5MjQ4IgotICAgICAgIGlkPSJyZWN0NDY5NyIKLSAgICAgICBzdHlsZT0iZmlsbDojNjY2NjY2O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+Ci0gICAgPHJlY3QKLSAgICAgICB3aWR0aD0iMTEuODkxNTk3IgotICAgICAgIGhlaWdodD0iMTAuNTMwNjQ1IgotICAgICAgIHg9IjMyNy42OTY5OSIKLSAgICAgICB5PSI0MTIuODcxNTUiCi0gICAgICAgaWQ9InJlY3Q0ODkxIgotICAgICAgIHN0eWxlPSJmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KLSAgPC9nPgotPC9zdmc+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3BhcmVudC9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8yXzIvcGFyZW50L0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvcGFyZW50L0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3BhcmVudC9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzJfMi9wYXJlbnQvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY0ZTFhOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3BhcmVudC9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcgotQ29weXJpZ2h0IDIwMDctMjAwOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvcGFyZW50L3BvbS54bWwgYi9wcmVwYXJlLzFfMl8yL3BhcmVudC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGQxNGE0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvcGFyZW50L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj42PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjIuMjwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFByb2plY3QgUGFyZW50PC9uYW1lPgotICAgIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyPC91cmw+Ci0KLSAgICA8aXNzdWVNYW5hZ2VtZW50PgotICAgICAgICA8c3lzdGVtPmppcmE8L3N5c3RlbT4KLSAgICAgICAgPHVybD5odHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvRVhUVkFMPC91cmw+Ci0gICAgPC9pc3N1ZU1hbmFnZW1lbnQ+Ci0KLSAgICA8Y2lNYW5hZ2VtZW50PgotICAgICAgICA8c3lzdGVtPmNvbnRpbnV1bTwvc3lzdGVtPgotICAgICAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLnpvbmVzLmFwYWNoZS5vcmc6ODA4MC9jb250aW51dW08L3VybD4KLSAgICAgICAgPG5vdGlmaWVycz4KLSAgICAgICAgICAgIDxub3RpZmllcj4KLSAgICAgICAgICAgICAgICA8dHlwZT5tYWlsPC90eXBlPgotICAgICAgICAgICAgICAgIDxzZW5kT25TdWNjZXNzPnRydWU8L3NlbmRPblN1Y2Nlc3M+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhZGRyZXNzPmNvbW1pdHNAbXlmYWNlcy5hcGFjaGUub3JnPC9hZGRyZXNzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvbm90aWZpZXI+Ci0gICAgICAgIDwvbm90aWZpZXJzPgotICAgIDwvY2lNYW5hZ2VtZW50PgotICAgIAotICAgIDxpbmNlcHRpb25ZZWFyPjIwMDg8L2luY2VwdGlvblllYXI+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+TUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLQotICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KLSAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+Ci0KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS0KLSAgICAgICAgICAgICAgICAgICAgLSBDb3B5IExJQ0VOU0UudHh0IGFuZCBOT1RJQ0UudHh0IHNvIHRoYXQgdGhleSBhcmUgaW5jbHVkZWQKLSAgICAgICAgICAgICAgICAgICAgLSBpbiB0aGUgLWphdmFkb2MgamFyIGZpbGUgZm9yIHRoZSBjb21wb25lbnQuCi0gICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+amF2YWRvYy5yZXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hcGlkb2NzL01FVEEtSU5GIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTElDRU5TRS50eHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTk9USUNFLnR4dCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmphdmFkb2Muc2l0ZS5jb3B5PC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5zaXRlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENvcHkgamF2YWRvYyB0byBhbm90aGVyIGRpcmVjdG9yeSwgdG8ga2VlcCBqYXZhZG9jIG9mIHByZXZpb3VzIHZlcnNpb25zIG9uIHNpdGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zaXRlL2FwaWRvY3MtJHtwcm9qZWN0LnZlcnNpb259IiBmYWlsb25lcnJvcj0iZmFsc2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc2l0ZS9hcGlkb2NzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgICAgLSBNYWtlIGEgY2hlY2tzdHlsZSB2aW9sYXRpb24gYSBjb21waWxlIGVycm9yLiBOb3RlIHRoYXQgaWYgYSBjb21waWxlIGVycm9yIG9jY3VycywKLSAgICAgICAgICAgICAgICAtIGZ1cnRoZXIgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRhcmdldC9zaXRlL2NoZWNrc3R5bGUuaHRtbCAocHJlc2VudCBldmVuIHdoZW4KLSAgICAgICAgICAgICAgICAtIGp1c3QgdGhlIGNvbXBpbGUgZ29hbCBhbmQgbm90IHRoZSBzaXRlIGdvYWwgaGFzIGJlZW4gcnVuKS4gTm90ZSBhbHNvIHRoYXQgY2hpbGQKLSAgICAgICAgICAgICAgICAtIHByb2plY3RzIG1heSByZWRlY2xhcmUgdGhpcyBwbHVnaW4gYW5kIHByb3ZpZGUgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MKLSAgICAgICAgICAgICAgICAtIHRvIHVzZSBkaWZmZXJlbnQgY2hlY2tzIChtb3JlIG9yIGxlc3Mgc3RyaWN0IHRoYW4gdGhlIGRlZmF1bHQpLgotICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD52ZXJpZnktc3R5bGU8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWdMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0YW5kYXJkLnhtbDwvY29uZmlnTG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxoZWFkZXJMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtaGVhZGVyLnR4dDwvaGVhZGVyTG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tIFNldCBjb21waWxlIHNvdXJjZSBhdCAxLjUsIHNpbmNlIHRoZSB0YXJnZXQgSlNGIGltcGwgaXMgMS4yIC0tPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvcHRpbWl6ZT5mYWxzZTwvb3B0aW1pemU+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+ICAgICAgICAgICAgCi0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi0gICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+bWF2ZW4yLXJlcG9zaXRvcnkuZGV2LmphdmEubmV0PC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkphdmEubmV0IFJlcG9zaXRvcnkgZm9yIE1hdmVuPC9uYW1lPgotICAgICAgICAgICAgPHVybD5odHRwOi8vZG93bmxvYWQuamF2YS5uZXQvbWF2ZW4vMS88L3VybD4KLSAgICAgICAgICAgIDxsYXlvdXQ+bGVnYWN5PC9sYXlvdXQ+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICA8L3JlcG9zaXRvcmllcz4KLQotICAgIDxyZXBvcnRpbmc+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tanhyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcmVwb3J0LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcG1kLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxydWxlc2V0cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxydWxlc2V0Pi9ydWxlc2V0cy9iYXNpYy54bWw8L3J1bGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvdW51c2VkY29kZS54bWw8L3J1bGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvcnVsZXNldHM+Ci0gICAgICAgICAgICAgICAgICAgIDxsaW5rWHJlZj50cnVlPC9saW5rWHJlZj4KLSAgICAgICAgICAgICAgICAgICAgPG1pbmltdW1Ub2tlbnM+MTAwPC9taW5pbXVtVG9rZW5zPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0SmRrPjEuNTwvdGFyZ2V0SmRrPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY2hlY2tzdHlsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlnTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdGFuZGFyZC54bWw8L2NvbmZpZ0xvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aGVhZGVyTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWhlYWRlci50eHQ8L2hlYWRlckxvY2F0aW9uPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9yZXBvcnRpbmc+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90YWdzLzFfMl8yPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzI8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RhZ3MvMV8yXzI8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgICAgICA8c25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICAgICAgPHVuaXF1ZVZlcnNpb24+ZmFsc2U8L3VuaXF1ZVZlcnNpb24+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLnNuYXBzaG90czwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgTWF2ZW4gU25hcHNob3QgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgPHNpdGU+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTI8L3VybD4KLSAgICAgICAgPC9zaXRlPgotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtYXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wZXJmb3JtUmVsZWFzZTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvY3M8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxqc2YudmVyc2lvbj4xLjIuNDwvanNmLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlLzFfMl8yL3BhcmVudC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjg3OTMwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSAtLS0tLS0NCi1PdmVydmlldw0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMg0KLQ0KLSAgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgcHJvdmlkZXMgdmVyc2lvbnMgZm9yIEpTRiAxLjEgYW5kIDEuMg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvcGFyZW50L3NyYy9zaXRlL2FwdC9qYXZhZG9jLmFwdCBiL3ByZXBhcmUvMV8yXzIvcGFyZW50L3NyYy9zaXRlL2FwdC9qYXZhZG9jLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIyNjYzMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3BhcmVudC9zcmMvc2l0ZS9hcHQvamF2YWRvYy5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0gLS0tLS0tDQotSmF2YWRvYw0KLSAtLS0tLS0NCi0NCi1KYXZhZG9jDQotDQotICAgIEhlcmUgeW91IGNhbiBmaW5kIHRoZSBqYXZhZG9jIG9mIHByZXZpb3VzIGV4dHZhbCB2ZXJzaW9ucy4NCi0NCi0gICAgKiB7e3todHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvbXlmYWNlcy1leHR2YWwtY29yZS9hcGlkb2NzLTEuMi4xL2luZGV4Lmh0bWx9TXlmYWNlcyBFeHRWYWwgQ29yZSBWZXJzaW9uIDEuMi4xfX0NCi0NCi0gICAgKiB7e3todHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvdmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbi9hcGlkb2NzLTEuMi4xL2luZGV4Lmh0bWx9TXlmYWNlcyBFeHRWYWwgUHJvcGVydHkgVmFsaWRhdGlvbiBWZXJzaW9uIDEuMi4xfX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3BhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbCBiL3ByZXBhcmUvMV8yXzIvcGFyZW50L3NyYy9zaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Nzg2NDlmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvcGFyZW50L3NyYy9zaXRlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IG5hbWU9IkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIj4KLSAgPGJhbm5lckxlZnQ+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0VmFsPC9uYW1lPgotICAgIDxzcmM+aW1hZ2VzL2V4dHZhbF9sb2dvLnBuZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW5kZXguaHRtbDwvaHJlZj4KLSAgPC9iYW5uZXJMZWZ0PgotCi0gIDxiYW5uZXJSaWdodD4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlczwvbmFtZT4KLSAgICA8c3JjPmltZy9iYW5uZXJzL015RmFjZXNfbG9nby5qcGc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWw8L2hyZWY+Ci0gIDwvYmFubmVyUmlnaHQ+Ci0KLSAgPHB1Ymxpc2hEYXRlIGZvcm1hdD0iZGQgTU1NIHl5eXkiLz4KLQotICA8c2tpbj4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1zaXRlLXNraW48L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9za2luPgotCi0gIDxib2R5PgotICAgIDxsaW5rcz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSIgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJNeUZhY2VzIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkRvd25sb2FkIE15ZmFjZXMgRXh0VmFsIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Rvd25sb2FkLmh0bWwiLz4KLSAgICA8L2xpbmtzPgotCi0gICAgPG1lbnUgbmFtZT0iQXBhY2hlIE15RmFjZXMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9kb3dubG9hZC5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgbmFtZT0iQ29udGVudHMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9Ik1haW4gU2l0ZSIgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgPGl0ZW0gbmFtZT0iRXh0VmFsIGZvciBKU0YgMS4xIiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvaW5kZXguaHRtbCIgY29sbGFwc2U9InRydWUiPgotICAgICAgICAgICAgPGl0ZW0gbmFtZT0iZHVtbXkiICAgICAgICBocmVmPSJkdW1teSIvPgotICAgICAgICA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkV4dFZhbCBmb3IgSlNGIDEuMiIgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IkNvcmUgTW9kdWxlIiAgICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL215ZmFjZXMtZXh0dmFsLWNvcmUvaW5kZXguaHRtbCIvPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJQcm9wZXJ0eSBWYWxpZGF0aW9uIiAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi92YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iVHJpbmlkYWQgU3VwcG9ydCIgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQvaW5kZXguaHRtbCIvPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJHZW5lcmljIFN1cHBvcnQiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0L2luZGV4Lmh0bWwiLz4KLSAgICAgICAgPC9pdGVtPgotICAgIDwvbWVudT4KLQkKLSAgICA8bWVudSBuYW1lPSJEb2N1bWVudGF0aW9uIj4KLSAgICAgIDxpdGVtIG5hbWU9Ildpa2kiICAgICAgICAgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9teWZhY2VzL0V4dGVuc2lvbnMvVmFsaWRhdG9yLyIvPgotICAgICAgPGl0ZW0gbmFtZT0iSmF2YWRvYyIgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvamF2YWRvYy5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgcmVmPSJyZXBvcnRzIi8+Ci0KLSAgICA8bWVudSBuYW1lPSJGb3VuZGF0aW9uIiBpbmhlcml0PSJib3R0b20iPgotICAgICAgPGl0ZW0gbmFtZT0iQVNGIiAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iIC8+Ci0gICAgICA8aXRlbSBuYW1lPSJTcG9uc29yc2hpcCIgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vc3BvbnNvcnNoaXAuaHRtbCIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlRoYW5rcyIgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi90aGFua3MuaHRtbCIgLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvcG9tLnhtbCBiL3ByZXBhcmUvMV8yXzIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc1NGQwYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtbW9kdWxlPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMi4yPC92ZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgTW9kdWxlPC9uYW1lPgotICAgIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyPC91cmw+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMjwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMjwvdXJsPgotICAgIDwvc2NtPgotCi0gICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgICAgIDxzbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8dW5pcXVlVmVyc2lvbj5mYWxzZTwvdW5pcXVlVmVyc2lvbj4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUuc25hcHNob3RzPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBNYXZlbiBTbmFwc2hvdCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1zbmFwc2hvdC1yZXBvc2l0b3J5PC91cmw+Ci0gICAgICAgIDwvc25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICA8c2l0ZT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc2l0ZTwvaWQ+Ci0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMjwvdXJsPgotICAgICAgICA8L3NpdGU+Ci0gICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgotCi0gICAgPCEtLSBXQVJOSU5HOiBETyBOT1QgR0VORVJBVEUgU0lURSBGUk9NIEhFUkUgRElSRUNUTFkKLSAgICBTaW5jZSB0aGlzIHByb2plY3QgaGFzIGFuIGFzeW5jIHJlbGVhc2UgcHJvY2VkdXJlIChub3QKLSAgICBhbGwgbW9kdWxlcyBzaG91bGQgYmUgcmVsZWFzZWQgYXQgb25jZSksIHRoZSBwYXJlbnQgcG9tLnhtbCAKLSAgICBpcyBub3QgdGhpcyAodGhlcmUgaXMgYSBtb2R1bGUgZm9yIHRoYXQpLiBVc2UgbWF2ZW4gc2l0ZSAKLSAgICBwbHVnaW4gaGVyZSBjYXVzZSBwcm9ibGVtcyB3aGVuIHRoZSBzaXRlIGlzIGdlbmVyYXRlZC4KLSAgICBUaGUgcHJvY2VkdXJlIG11c3QgZXhlY3V0ZSBzaXRlIGNvbW1tYW5kIGZpcnN0IG9uIHBhcmVudCAKLSAgICBtb2R1bGUgYW5kIHRoZW4gb24gZWFjaCBtb2R1bGUgbGlzdGVkIGJlbG93LiAKLSAgICAgLS0+Ci0KLSAgICA8bW9kdWxlcz4KLSAgICAgICAgPG1vZHVsZT5wYXJlbnQ8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5jb3JlPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+dmFsaWRhdGlvbi1tb2R1bGVzPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+Y29tcG9uZW50LXN1cHBvcnQ8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5leGFtcGxlczwvbW9kdWxlPgotICAgIDwvbW9kdWxlcz4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPCEtLSBUaGlzIHByb2ZpbGUgaXMgaW52b2tlZCBieSAtRHByZXBhcmVSZWxlYXNlPXRydWUuICBUaGlzIGFsbG93cyBtdm4gcmVsZWFzZTpwcmVwYXJlIHRvCi0gICAgICAgICAgICBydW4gc3VjY2Vzc2Z1bGx5IG9uIHRoZSBhc3NlbWJseSBwcm9qZWN0cy4gLS0+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPnByZXBhcmUtcmVsZWFzZTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPnByZXBhcmVSZWxlYXNlPC9uYW1lPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8bW9kdWxlcz4KLSAgICAgICAgICAgICAgICA8bW9kdWxlPmFzc2VtYmx5PC9tb2R1bGU+Ci0gICAgICAgICAgICA8L21vZHVsZXM+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZWxlYXNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+LURwcmVwYXJlUmVsZWFzZTwvYXJndW1lbnRzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLSAgICAKLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGpzZi52ZXJzaW9uPjEuMi40PC9qc2YudmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi9zaXRlL3BvbS54bWwgYi9wcmVwYXJlLzFfMl8yL3NpdGUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhmZTBhZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3NpdGUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgICAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICAgICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICAgICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgICAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gICAgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgICoKLSAgICAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gICAgKgotICAgICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj42PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1zaXRlPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3I8L25hbWU+Ci0gICAgPHVybD5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yPC91cmw+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxkZWZhdWx0R29hbD5zaXRlPC9kZWZhdWx0R29hbD4KLSAgICAgICAgPGV4dGVuc2lvbnM+Ci0gICAgICAgICAgPGV4dGVuc2lvbj4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ud2Fnb248L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD53YWdvbi1zc2gtZXh0ZXJuYWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtNTwvdmVyc2lvbj4KLSAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgPC9leHRlbnNpb25zPgotICAgIDwvYnVpbGQ+Ci0gICAgPHJlcG9ydGluZz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3QtaW5mby1yZXBvcnRzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9yZXBvcnRpbmc+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvc2l0ZTwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rL3NpdGU8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvc2l0ZTwvdXJsPgotICAgIDwvc2NtPgotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgICAgPHNpdGU+Ci0gICAgICAgIDxpZD5hcGFjaGUtc2l0ZTwvaWQ+Ci0gICAgICAgIDxuYW1lPkFwYWNoZSBXZWJzaXRlPC9uYW1lPgotICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3I8L3VybD4KLSAgICAgIDwvc2l0ZT4KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvc2l0ZS9zcmMvc2l0ZS9hcHQvZG93bmxvYWQuYXB0IGIvcHJlcGFyZS8xXzJfMi9zaXRlL3NyYy9zaXRlL2FwdC9kb3dubG9hZC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MTM2YTIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi9zaXRlL3NyYy9zaXRlL2FwdC9kb3dubG9hZC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotIH5+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSB+fiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gfn4gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSB+fiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSB+fiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSB+fiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSB+fg0KLSB+fiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSB+fg0KLSB+fiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIH5+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotIH5+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSB+fiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIH5+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSANCi0gLS0tLS0tDQotRG93bmxvYWQgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi0gLS0tLS0tDQotDQotRG93bmxvYWQgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi0NCi0NCi0gIFVzZSB0aGUgbGlua3MgYmVsb3cgdG8gZG93bmxvYWQgYSBkaXN0cmlidXRpb24gb2YgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZnJvbQ0KLSAgb25lIG9mIG91ciBtaXJyb3JzLiBJdCBpcyBnb29kIHByYWN0aWNlIHRvIHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIHRoZQ0KLSAgZGlzdHJpYnV0aW9uIGZpbGVzLg0KLQ0KLSAgWW91IHdpbGwgYmUgcHJvbXB0ZWQgZm9yIGEgbWlycm9yIC0gaWYgdGhlIGZpbGUgaXMgbm90IGZvdW5kIG9uIHlvdXJzLCBwbGVhc2UgYmUgcGF0aWVudCwgYXMgaXQgbWF5IHRha2UgMjQNCi0gIGhvdXJzIHRvIHJlYWNoIGFsbCBtaXJyb3JzLg0KLQ0KLSAgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgZGlzdHJpYnV0ZWQgYXMgYSA8PDx6aXA+Pj4gYXJjaGl2ZSAoZm9yIFdpbmRvd3MpIGFuZA0KLSAgYXMgYSA8PDx0YXIuZ3o+Pj4gYXJjaGl2ZSAoZm9yIFVOSVgpLiBUaGUgY29udGVudCBpcyB0aGUgc2FtZS4gUGxlYXNlIG5vdGUNCi0gIHRoYXQgdGhlIDw8PHRhci5nej4+PiBhcmNoaXZlcyBjb250YWluIGZpbGUgbmFtZXMgbG9uZ2VyIHRoYW4gMTAwIGNoYXJhY3RlcnMgYW5kIGhhdmUgYmVlbg0KLSAgY3JlYXRlZCB1c2luZyBHTlUgdGFyIGV4dGVuc2lvbnMuIFRodXMgdGhleSBtdXN0IGJlIHVudGFycmVkIHdpdGggYSBHTlUgY29tcGF0aWJsZQ0KLSAgdmVyc2lvbiBvZiB0YXIuDQotDQotICA8PCBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciAxLjAuMCBEaXN0cmlidXRpb24gPj4NCi0NCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18ICAgICAgICAgICAgICAgICAgICAgICAgIHwgTWlycm9ycyB8IENoZWNrc3VtIHwgU2lnbmF0dXJlIHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjEgMS4xLjEgKHRhci5neikgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4udGFyLmd6fSBteWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi50YXIuZ3p9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4udGFyLmd6Lm1kNX0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4udGFyLmd6Lm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi50YXIuZ3ouYXNjfSBteWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi50YXIuZ3ouYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMSAxLjEuMSAoemlwKSAgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4uemlwfSBteWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi56aXB9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4uemlwLm1kNX0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4uemlwLm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi56aXAuYXNjfSBteWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi56aXAuYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMSAxLjEuMSBTb3VyY2UgKHRhci5neikgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4xLjEtc3JjLnRhci5nen0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1zcmMudGFyLmd6fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMS4xLXNyYy50YXIuZ3oubWQ1fSBteWZhY2VzLWV4dHZhbDExLTEuMS4xLXNyYy50YXIuZ3oubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMS4xLXNyYy50YXIuZ3ouYXNjfSBteWZhY2VzLWV4dHZhbDExLTEuMS4xLXNyYy50YXIuZ3ouYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMSAxLjEuMSBTb3VyY2UgKHppcCkgICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMS4xLXNyYy56aXB9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjEtc3JjLnppcH19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1zcmMuemlwLm1kNX0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1zcmMuemlwLm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1zcmMuemlwLmFzY30gbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1zcmMuemlwLmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjIgMS4yLjEgKHRhci5neikgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4udGFyLmd6fSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi50YXIuZ3p9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4udGFyLmd6Lm1kNX0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4udGFyLmd6Lm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi50YXIuZ3ouYXNjfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi50YXIuZ3ouYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMiAxLjIuMSAoemlwKSAgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4uemlwfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi56aXB9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4uemlwLm1kNX0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4uemlwLm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi56aXAuYXNjfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi56aXAuYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMiAxLjIuMSBTb3VyY2UgKHRhci5neikgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjEtc3JjLnRhci5nen0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1zcmMudGFyLmd6fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4xLXNyYy50YXIuZ3oubWQ1fSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLXNyYy50YXIuZ3oubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4xLXNyYy50YXIuZ3ouYXNjfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLXNyYy50YXIuZ3ouYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMiAxLjIuMSBTb3VyY2UgKHppcCkgICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4xLXNyYy56aXB9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjEtc3JjLnppcH19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1zcmMuemlwLm1kNX0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1zcmMuemlwLm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1zcmMuemlwLmFzY30gbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1zcmMuemlwLmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi0NCi1MYXRlc3Qgc291cmNlIGNvZGUgZnJvbSBTVk4gcmVwb3NpdG9yeQ0KLQ0KLSAgICBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIGxhdGVzdCBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmZWF0dXJlcywgdGhlIHNvdXJjZSBjb2RlIGlzIHVuZGVyDQotICAgIHZlcnNpb24gY29udHJvbCB3aXRoIFNWTi4gIENsaWNrIHt7e3NvdXJjZS1yZXBvc2l0b3J5Lmh0bWx9IGhlcmUgfX0NCi0gICAgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byB1c2UgdGhlIEFTRiBFeHRlbnNpb25zIFZhbGlkYXRvciBTVk4gUmVwb3NpdG9yeS4NCi0NCi1WZXJpZnlpbmcgY2hlY2tzdW1zDQotDQotICAgIEl0IGlzIGVzc2VudGlhbCB0aGF0IHlvdSB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGUgZG93bmxvYWRlZA0KLSAgICBmaWxlcyB1c2luZyB0aGUgUEdQIGFuZCBNRDUgc2lnbmF0dXJlcy4gTUQ1IHZlcmlmaWNhdGlvbiBlbnN1cmVzIHRoZQ0KLSAgICBmaWxlIHdhcyBub3QgY29ycnVwdGVkIGR1cmluZyB0aGUgZG93bmxvYWQgcHJvY2Vzcy4gUEdQIHZlcmlmaWNhdGlvbg0KLSAgICBlbnN1cmVzIHRoYXQgdGhlIGZpbGUgY2FtZSBmcm9tIGEgY2VydGFpbiBwZXJzb24uDQotDQotICAgIFRvIHZlcmlmeSB0aGUgTUQ1IHNpZ25hdHVyZSBvbiB0aGUgZmlsZXMsIHlvdSBuZWVkIHRvIHVzZSBhIHByb2dyYW0NCi0gICAgY2FsbGVkIDw8PG1kNT4+PiBvciA8PDxtZDVzdW0+Pj4sIHdoaWNoIGlzDQotICAgIGluY2x1ZGVkIGluIG1hbnkgVU5JWCBkaXN0cmlidXRpb25zLiAgSXQgaXMgYWxzbyBhdmFpbGFibGUgYXMgcGFydCBvZg0KLSAgICB7e3todHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvdGV4dHV0aWxzL3RleHR1dGlscy5odG1sfUdOVSBUZXh0dXRpbHN9fS4NCi0gICAgV2luZG93cyB1c2VycyBjYW4gZ2V0IGJpbmFyeSBtZDUgcHJvZ3JhbXMgZnJvbSB7e3todHRwOi8vd3d3LmZvdXJtaWxhYi5jaC9tZDUvfWhlcmV9fSwNCi0gICAge3t7aHR0cDovL3d3dy5wYy10b29scy5uZXQvd2luMzIvZnJlZXdhcmUvY29uc29sZS99aGVyZX19LCBvcg0KLSAgICB7e3todHRwOi8vd3d3LnNsYXZhc29mdC5jb20vZnN1bS99aGVyZX19Lg0KLQ0KLVZlcmlmeWluZyBzaWduYXR1cmVzDQotDQotICAJUEdQIHZlcmlmaWNhdGlvbiBlbnN1cmVzIHRoYXQgdGhlIGZpbGUgY2FtZSBmcm9tIGEgY2VydGFpbiBwZXJzb24uICBXZSBzdHJvbmdseSByZWNvbW1lbmQNCi0JICB5b3UgdmVyaWZ5IHlvdXIgZG93bmxvYWRzIHdpdGggYm90aCBQR1AgYW5kIE1ENS4NCi0NCi0JVGhlIFBHUCBzaWduYXR1cmVzIGNhbiBiZSB2ZXJpZmllZCB1c2luZyB7e3todHRwOi8vd3d3LnBncGkub3JnL31QR1B9fSBvciANCi0Je3t7aHR0cDovL3d3dy5nbnVwZy5vcmcvfUdQR319LiAgRmlyc3QgZG93bmxvYWQgdGhlIEFwYWNoZSBNeUZhY2VzIA0KLQl7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL0tFWVN9S0VZU319CWFzIHdlbGwgYXMgdGhlIDw8PGFzYz4+PiBzaWduYXR1cmUgZmlsZSANCi0JZm9yIHRoZSBwYXJ0aWN1bGFyIGRpc3RyaWJ1dGlvbi4gSXQgaXMgaW1wb3J0YW50IHRoYXQgeW91IGdldCB0aGVzZSBmaWxlcyBmcm9tIHRoZSB1bHRpbWF0ZQ0KLQl0cnVzdGVkIHNvdXJjZSAtIHRoZSBtYWluIEFTRiBkaXN0cmlidXRpb24gc2l0ZSwgcmF0aGVyIHRoYW4gZnJvbSBhIG1pcnJvci4NCi0JVGhlbiB2ZXJpZnkgdGhlIHNpZ25hdHVyZXMgdXNpbmcgLi4uDQotDQotCSAgPDw8DQotCSAgJSBwZ3BrIC1hIEtFWVMNCi0JICAlIHBncHYgbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4udGFyLmd6LmFzYyBteWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi50YXIuZ3oNCi0JICA+Pj4NCi0NCi0JICA8b3I+DQotDQotCSAgPDw8DQotCSAgJSBwZ3AgLWthIEtFWVMNCi0JICAlIHBncCBteWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi50YXIuZ3ouYXNjIG15ZmFjZXMtZXh0dmFsMTEtMS4xLjEtYmluLnRhci5neg0KLQkgID4+Pg0KLQ0KLQkgIDxvcj4NCi0NCi0JICA8PDwNCi0gIAklIGdwZyAtLWltcG9ydCBLRVlTDQotCSAgJSBncGcgLS12ZXJpZnkgbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4udGFyLmd6LmFzYyBteWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi50YXIuZ3oNCi0JICA+Pj4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3NpdGUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL3ByZXBhcmUvMV8yXzIvc2l0ZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDI1MzliLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvc2l0ZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgYSBKU0YgY2VudHJpYyB2YWxpZGF0aW9uIGZyYW1ld29yay4NCi0gIA0KLSAgICBJdCBvZmZlcnMgcG93ZXJmdWwgYW5kIGVhc3kgdG8gdXNlIGZpZWxkIGJhc2VkIHZhbGlkYXRpb24gYmFzZWQgb24gYW5ub3RhdGlvbnMuDQotSXQgaGFzIGEgcGx1Z2dhYmxlIGFyY2hpdGVjdHVyZSwgc28gaXQgaXMgcG9zc2libGUgdG8gYWRkIG5ldyB2YWxpZGF0aW9uIG1vZHVsZXMgb3Igc3VwcG9ydCBmb3IgY29tcG9uZW50IGxpYnJhcmllcyBsaWtlIFRyaW5pZGFkIG9yIG90aGVyIDNyZCBwYXJ0eSBmcmFtZXdvcmtzLg0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS4xLnggYW5kIEpTRiAxLjIueC4gQm90aCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41Kw0KLQ0KLSAgICBGdXJ0aGVyIGluZm9ybWF0aW9uIGFyZSBhdmFpbGFibGUgYXQgdGhlIHt7e2h0dHA6Ly93aWtpLmFwYWNoZS5vcmcvbXlmYWNlcy9FeHRlbnNpb25zL1ZhbGlkYXRvci99V2lraX19LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvc2l0ZS9zcmMvc2l0ZS9zaXRlLnhtbCBiL3ByZXBhcmUvMV8yXzIvc2l0ZS9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJjOWU4NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3NpdGUvc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgbmFtZT0iQXBhY2hlIE15ZmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IiPgotICA8YmFubmVyTGVmdD4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRWYWw8L25hbWU+Ci0gICAgPHNyYz5pbWFnZXMvZXh0dmFsX2xvZ28ucG5nPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sPC9ocmVmPgotICA8L2Jhbm5lckxlZnQ+Ci0KLSAgPGJhbm5lclJpZ2h0PgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzPC9uYW1lPgotICAgIDxzcmM+aW1nL2Jhbm5lcnMvTXlGYWNlc19sb2dvLmpwZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbDwvaHJlZj4KLSAgPC9iYW5uZXJSaWdodD4gCi0KLSAgPHB1Ymxpc2hEYXRlIGZvcm1hdD0iZGQgTU1NIHl5eXkiLz4KLQotICA8c2tpbj4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1zaXRlLXNraW48L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9za2luPgotCi0gIDxib2R5PgotICAgIDxsaW5rcz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSIgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJNeUZhY2VzIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkRvd25sb2FkIE15ZmFjZXMgRXh0VmFsIiAgICAgICBocmVmPSJkb3dubG9hZC5odG1sIi8+Ci0gICAgPC9saW5rcz4KLQotICAgIDxtZW51IG5hbWU9IkFwYWNoZSBNeUZhY2VzIiBpbmhlcml0PSJ0b3AiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZG93bmxvYWQuaHRtbCIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IG5hbWU9IkNvbnRlbnRzIiBpbmhlcml0PSJ0b3AiPgotICAgICAgICA8aXRlbSBuYW1lPSJNYWluIFNpdGUiICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sIi8+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkV4dFZhbCBmb3IgSlNGIDEuMSIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExL2luZGV4Lmh0bWwiIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9ImR1bW15IiAgICAgICAgaHJlZj0iZHVtbXkiLz4KLSAgICAgICAgPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjIiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9pbmRleC5odG1sIiBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8aXRlbSBuYW1lPSJkdW1teSIgICAgICAgIGhyZWY9ImR1bW15Ii8+Ci0gICAgICAgIDwvaXRlbT4KLSAgICA8L21lbnU+Ci0KLSAgICA8bWVudSBuYW1lPSJEb2N1bWVudGF0aW9uIj4KLSAgICAgIDxpdGVtIG5hbWU9Ildpa2kiICAgICAgICAgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9teWZhY2VzL0V4dGVuc2lvbnMvVmFsaWRhdG9yLyIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IHJlZj0icmVwb3J0cyIvPgotCi0gICAgPG1lbnUgbmFtZT0iRm91bmRhdGlvbiIgaW5oZXJpdD0idG9wIj4KLSAgICAgIDxpdGVtIG5hbWU9IkFTRiIgICAgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIiAvPgotICAgICAgPGl0ZW0gbmFtZT0iU3BvbnNvcnNoaXAiICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3Nwb25zb3JzaGlwLmh0bWwiIC8+Ci0gICAgICA8aXRlbSBuYW1lPSJUaGFua3MiICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vdGhhbmtzLmh0bWwiIC8+Ci0gICAgPC9tZW51PgotICA8L2JvZHk+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wb20ueG1sIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkyYWZhYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFZhbGlkYXRpb24tTW9kdWxlczwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjIuMjwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuMjwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RhZ3MvMV8yXzI8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGFncy8xXzJfMjwvdXJsPgotICAgIDwvc2NtPgotCi0gICAgPG1vZHVsZXM+Ci0gICAgICAgIDxtb2R1bGU+cHJvcGVydHktdmFsaWRhdGlvbjwvbW9kdWxlPgotICAgICAgICA8IS0tbW9kdWxlPmJlYW4tdmFsaWRhdGlvbjwvbW9kdWxlLS0+Ci0gICAgPC9tb2R1bGVzPgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbCBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTllODJkYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFByb3BlcnR5LVZhbGlkYXRpb24tTW9kdWxlPC9uYW1lPgotICAgIDx2ZXJzaW9uPjEuMi4yPC92ZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMi4yPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5wZXJzaXN0ZW5jZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnBlcnNpc3RlbmNlLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gVGVzdCBkZXBlbmRlbmNpZXMgLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuNTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQuanNwPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNwLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc2hhbGU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zaGFsZS10ZXN0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40LjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL0Fic3RyYWN0Ki5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovVGVzdFV0aWxzLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qQmVhbi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgICAgICAgICAgIAotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGM3NDE2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotDQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODkzYmZmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWM0ODdkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFNlY3JldDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVMaXN0Ym94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVSYWRpbzsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueU1lbnU7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dGFyZWE7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBjb25maWd1cmVSZXF1aXJlZEF0dHJpYnV0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7Ci0gICAgICAgIGNvbmZpZ3VyZU1heExlbmd0aEF0dHJpYnV0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlUmVxdWlyZWRBdHRyaWJ1dGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYoIXByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZigoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQpKSB8fAotICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICAgICAgJiYKLSAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMoaXNDb21wb25lbnRSZXF1aXJlZCh1aUNvbXBvbmVudCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpICYmCi0gICAgICAgICAgICAgICAhQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lUmFkaW8gfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TGlzdGJveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpZiB0aGVyZSBpcyBubyBzcGVjaWFsIGF0dHJpYnV0ZSBhdCB0aGUgY29tcG9uZW50IHdoaWNoIHNob3VsZCBvdmVycnVsZQotICAgICAqIHRoZSBhbm5vdGF0ZWQgcHJvcGVydHkgcmV0dXJuIHRydWUhCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgY29tcG9uZW50IHdoaWNoIGltcGxlbWVudHMgdGhlIEVkaXRhYmxlVmFsdWVIb2xkZXIgaW50ZXJmYWNlCi0gICAgICogQHJldHVybiBmYWxzZSB0byBvdmVycnVsZSB0aGUgYW5ub3RhdGVkIHByb3BlcnR5IGUuZy4gaWYgY29tcG9uZW50IGlzIHJlYWRvbmx5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEJvb2xlYW4gaXNDb21wb25lbnRSZXF1aXJlZChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNSZWFkb25seSIpKSk7Ci0gICAgICAgIGJvb2xlYW4gaXNEaXNhYmxlZCA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNEaXNhYmxlZCIpKSk7Ci0KLSAgICAgICAgcmV0dXJuICEoaXNSZWFkT25seSB8fCBpc0Rpc2FibGVkKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVNYXhMZW5ndGhBdHRyaWJ1dGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1heExlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCk7Ci0KLSAgICAgICAgICAgIGlmKCEobWF4TGVuZ3RoIGluc3RhbmNlb2YgSW50ZWdlcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEh0bWxJbnB1dFRleHQgaHRtbElucHV0VGV4dCA9IChIdG1sSW5wdXRUZXh0KXVpQ29tcG9uZW50OwotICAgICAgICAgICAgICAgIGh0bWxJbnB1dFRleHQuc2V0TWF4bGVuZ3RoKChJbnRlZ2VyKW1heExlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjMmEwZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5MYWJlbGVkTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRTZWNyZXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTWVudTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lUmFkaW87Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlDaGVja2JveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUxpc3Rib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHRhcmVhOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yCi17Ci0gICAgcHVibGljIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkKLSAgICB7Ci0gICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gRXh0VmFsVXRpbHMuY29udmVydEZhY2VzTWVzc2FnZSh2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkpOwotCi0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSAoU3RyaW5nKSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJnZXRMYWJlbCIpKTsKLQotICAgICAgICAgICAgaWYobGFiZWwgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsYWJlbCA9IHVpQ29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vb3ZlcnJpZGUgdGhlIGxhYmVsIGlmIHRoZSBhbm5vdGF0aW9uIHByb3ZpZGVzIGEgbGFiZWwKLSAgICAgICAgICAgIGlmKG1ldGFEYXRhRW50cnkgIT0gbnVsbCAmJiBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxhYmVsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCwgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoZmFjZXNNZXNzYWdlIGluc3RhbmNlb2YgTGFiZWxlZE1lc3NhZ2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChMYWJlbGVkTWVzc2FnZSlmYWNlc01lc3NhZ2UpLnNldExhYmVsVGV4dChsYWJlbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL2lmIHNvbWVvbmUgdXNlcyBhIG5vcm1hbCBmYWNlcyBtZXNzYWdlCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvUGxhY2VMYWJlbChmYWNlc01lc3NhZ2UsIGxhYmVsLCBpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lUmFkaW8gfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TGlzdGJveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzNjBiZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwucmVjb3JkZXIuQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXI7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKG5ldyBDcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlcigpKTsNCi0NCi0gICAgICAgIGluaXRTdGF0aWNTdHJhdGVneU1hcHBpbmdzKCk7DQotICAgICAgICBpbml0RGVmYXVsdENvbXBvbmVudEluaXRpYWxpemVyKCk7DQotICAgICAgICBpbml0RGVmYXVsdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigpOw0KLSAgICAgICAgYWRkU2tpcFZhbGlkYXRpb25TdXBwb3J0KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdGF0aWNTdHJhdGVneU1hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGpwYUJhc2VkVmFsaWRhdGlvbiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OOw0KLSAgICAgICAgaWYgKGpwYUJhc2VkVmFsaWRhdGlvbiA9PSBudWxsDQotICAgICAgICAgICAgICAgIHx8ICFqcGFCYXNlZFZhbGlkYXRpb24uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA9IG5ldyBTdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgICAgICBzdGF0aWNDb25maWcuc2V0U291cmNlT2ZNYXBwaW5nKA0KLSAgICAgICAgICAgICAgICBFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSArIi5qcGFfc3RyYXRlZ3lfbWFwcGluZ3MiKTsNCi0NCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHLCBzdGF0aWNDb25maWcpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ3ZWIueG1sIHBhcmFtZXRlciB0byBkZWFjdGl2YXRlIGl0IikNCi0gICAgcHJpdmF0ZSB2b2lkIGluaXREZWZhdWx0Q29tcG9uZW50SW5pdGlhbGl6ZXIoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gIndlYi54bWwgcGFyYW1ldGVyIHRvIGRlYWN0aXZhdGUgaXQiKQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdERlZmF1bHRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoDQotICAgICAgICAgICAgICAgIG5ldyBIdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFNraXBWYWxpZGF0aW9uU3VwcG9ydCgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmluZm8oImFkZGluZyBzdXBwb3J0IGZvciBAU2tpcFZhbGlkYXRpb24iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmRlbnlSZW5kZXJlckludGVyY2VwdG9yKFZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcyk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFZhbGlkYXRpb25JbnRlcmNlcHRvcldpdGhTa2lwVmFsaWRhdGlvblN1cHBvcnQoKSk7DQotDQotICAgICAgICBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgLy9pdCdzIGp1c3QgcmVxdWlyZWQgdG8gc2V0IHRoZSB0YXJnZXQNCi0gICAgICAgIGNvbmZpZy5hZGRNYXBwaW5nKENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04sIFNraXBWYWxpZGF0aW9uU3VwcG9ydC5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlNLSVBfVkFMSURBVElPTl9TVVBQT1JUX0NPTkZJRywgY29uZmlnKTsNCi0NCi0gICAgICAgIC8vY29uZmlnLmFkZE1hcHBpbmcoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTiwgUmVxdWlyZWRTdHJhdGVneS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yV2l0aFNraXBWYWxpZGF0aW9uU3VwcG9ydC5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OTc3MjYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkludGVyY2VwdG9yV2l0aFNraXBWYWxpZGF0aW9uU3VwcG9ydCBleHRlbmRzIFZhbGlkYXRpb25JbnRlcmNlcHRvcgotewotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIHNraXBWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpCi0gICAgewotICAgICAgICBpZihFeHRWYWxVdGlscy5pc1NraXBhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpKSkKLSAgICAgICAgewotICAgICAgICAgICAgQm9vbGVhbiBza2lwVmFsaWRhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCBCb29sZWFuLmNsYXNzKTsKLQotICAgICAgICAgICAgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhza2lwVmFsaWRhdGlvbikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInZhbGlkYXRpb24gb2YgIiArIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY2FuY2VsZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIFNraXBWYWxpZGF0aW9uU3RyYXRlZ3kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzc3YTRlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRvY3VtZW50YXRpb24iKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NRVNTQUdFU19KUEEgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJKUEFfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFUyIpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfSlBBX0JBU0VEX1ZBTElEQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OIik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0RvdWJsZVJhbmdlLmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2NkNGVmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0RvdWJsZVJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgRG91YmxlUmFuZ2UNCi17DQotICAgIGRvdWJsZSBtaW5pbXVtKCkgZGVmYXVsdCAwOw0KLQ0KLSAgICBkb3VibGUgbWF4aW11bSgpIGRlZmF1bHQgRG91YmxlLk1BWF9WQUxVRTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vSm9pblZhbGlkYXRpb24uamF2YSBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YjUyYmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vSm9pblZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBKb2luVmFsaWRhdGlvbg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTGVuZ3RoLmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkNzVmYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBMZW5ndGgNCi17DQotICAgIGludCBtaW5pbXVtKCkgZGVmYXVsdCAwOw0KLQ0KLSAgICBpbnQgbWF4aW11bSgpIGRlZmF1bHQgSW50ZWdlci5NQVhfVkFMVUU7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzc1MmQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgTG9uZ1JhbmdlDQotew0KLSAgICBsb25nIG1pbmltdW0oKSBkZWZhdWx0IDA7DQotDQotICAgIGxvbmcgbWF4aW11bSgpIGRlZmF1bHQgTG9uZy5NQVhfVkFMVUU7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1BhdHRlcm4uamF2YSBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1BhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY3N2RjOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUGF0dGVybg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgIm5vX21hdGNoIjsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUmVxdWlyZWQuamF2YSBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNjViM2MuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUmVxdWlyZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBSZXF1aXJlZA0KLXsNCi0gICAgLyoqDQotICAgICAqIHRvIGN1c3RvbWl6ZSB0aGUgZXJyb3IgbWVzc2FnZSBvcg0KLSAgICAgKiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBqc2YgcmVxdWlyZWQgbWVzc2FnZSB3aXRoIHRoZSB1c2FnZSBvZiB0aGUgbWVzc2FnZSByZXNvbHZlciBtZWNoYW5pc20NCi0gICAgICoNCi0gICAgICogQHJldHVybiBhbiBvcHRpb25hbCBlcnJvciBtZXNzYWdlIGtleQ0KLSAgICAgKi8NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImZpZWxkX3JlcXVpcmVkIjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb24uamF2YSBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5N2VmODAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBTa2lwVmFsaWRhdGlvbg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc5ZjY1MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUYXJnZXQoVFlQRSkKLUBSZXRlbnRpb24oUlVOVElNRSkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIEBpbnRlcmZhY2UgU2tpcFZhbGlkYXRpb25TdXBwb3J0Ci17Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vVmFsaWRhdG9yLmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0NTZkMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBWYWxpZGF0b3INCi17DQotICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yPltdIHZhbHVlKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWU4OTA1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvciBleHRlbmRzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcgotewotICAgIHByaXZhdGUgRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvcigpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgZ2V0SW5zdGFuY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3IobmV3IERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQotICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOwotCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFByb3BlcnR5RGV0YWlscykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24ob2JqZWN0LmdldENsYXNzKCkgKyAiIGlzIG5vdCBhICIgKyBQcm9wZXJ0eURldGFpbHMuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSAoUHJvcGVydHlEZXRhaWxzKW9iamVjdDsKLQotICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKTsKLQotICAgICAgICAvL1RPRE8gdGVzdCB3aXRoIGNvbXBsZXggY29tcG9uZW50cwotICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnNldEluZm9ybWF0aW9uKAotICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBmaW5kIGFuZCBhZGQgYW5ub3RhdGlvbnMKLSAgICAgICAgICovCi0gICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9ucyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU4MDEyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9SW52YWxpZCBmb3JtYXQNCi1ub19tYXRjaF9kZXRhaWw9VGhlIHJlcXVpcmVkIGZvcm1hdGUgaXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2FiNTQzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9XHUwNjI3XHUwNjQ0XHUwNjM1XHUwNjRhXHUwNjNhXHUwNjI5IFx1MDYyZVx1MDYyN1x1MDYzN1x1MDYyNlx1MDYyOQ0KLW5vX21hdGNoX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MzVcdTA2NGFcdTA2M2FcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjM3XHUwNjQ0XHUwNjQ4XHUwNjI4XHUwNjI5IFx1MDY0N1x1MDY0OTogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZDY0OTAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotbm9fbWF0Y2g9Rm9ybWF0IGludlx1MDBlMGxpZAotbm9fbWF0Y2hfZGV0YWlsPUVsIGZvcm1hdCByZXF1ZXJpdCBcdTAwZTlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVlNzAxYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPVVuZ/xsdGlnZXMgRm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPURhcyBlcmZvcmRlcmxpY2hlIEZvcm1hdCBpc3Q6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU4MDEyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9SW52YWxpZCBmb3JtYXQNCi1ub19tYXRjaF9kZXRhaWw9VGhlIHJlcXVpcmVkIGZvcm1hdGUgaXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmIxMDc3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW5vX21hdGNoPUZvcm1hdG8gaW52XHUwMGUxbGlkbyAKLW5vX21hdGNoX2RldGFpbD1FbCBmb3JtYXRvIHJlcXVlcmlkbyBlczogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMGEyMjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1MZSBmb3JtYXQgZXN0IGludmFsaWRlDQotbm9fbWF0Y2hfZGV0YWlsPUxlIGZvcm1hdCBkb2l0ICZlY2lyYzt0cmUgZGUgbGEgZm9ybWU6IHswfQ0KLQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTg3NDhjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW5vX21hdGNoPUZvcm1hdG8gbm9uIHZhbGlkbwotbm9fbWF0Y2hfZGV0YWlsPUlsIGZvcm1hdG8gcmljaGllc3RvICZlZ3JhdmU7OiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0YmM3NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUdlXHUwMGU3ZXJzaXogYmlcdTAwZTdpbQ0KLW5vX21hdGNoX2RldGFpbD1nZXJla2VuIGJpXHUwMGU3aW06IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFhZTY0Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLSAgICAgICAgZXh0ZW5kcw0KLSAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBiYXNlTmFtZSA9IG51bGw7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYgKGJhc2VOYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZU5hbWUgPSBzdXBlci5nZXRCYXNlTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGJhc2VOYW1lOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NzZhZDkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogdGhlIGpwYSBzdXBwb3J0IGlzIGFuIGV4Y2VwdGlvbiBpbiB2aWV3IG9mIHNvbWUgbWVjaGFuaXNtcyAtIHNvIHRoZXJlJ3Mgbm8gY29udmVudGlvbiBmb3IgdGhlIG1lc3NhZ2UgYnVuZGxlLg0KLSAqIGluc3RlYWQgb2YgdGhlIGNvbnZlbnRpb24gdGhlcmUgaXMgYSBnbG9iYWwgcHJvcGVydHkgdG8gaGF2ZSBhbiBhbHRlcm5hdGl2ZSB0byB3ZWIueG1sIGNvbmZpZ3VyYXRpb24NCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMgPSAiSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0JBU0VfTkFNRSA9IFdlYlhtbFBhcmFtZXRlci5WQUxJREFUSU9OX01FU1NBR0VTX0pQQTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfTkFNRSA9IEpwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5jbGFzcw0KLSAgICAgICAgICAgIC5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLnJlcGxhY2UoIi5tZXNzYWdlLnJlc29sdmVyIiwgIi5tZXNzYWdlLmJ1bmRsZSIpKyAiLmpwYV9tZXNzYWdlcyI7DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tQmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZihDVVNUT01fQkFTRV9OQU1FICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIENVU1RPTV9CQVNFX05BTUU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKFN0cmluZylFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShKUEFfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFUyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBCQVNFX05BTUU7DQotICAgIH0NCi0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWRkMThjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Eb3VibGVSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkRvdWJsZVJhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBEb3VibGVSYW5nZSBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShEb3VibGVSYW5nZS5jbGFzcyk7DQotDQotICAgICAgICBkb3VibGUgbWluaW11bSA9IGFubm90YXRpb24ubWluaW11bSgpOw0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTiwgbWluaW11bSk7DQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYLCBhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBpZihtaW5pbXVtID4gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSm9pbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzVhMTU5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uZXh0cmFjdG9yLkRlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpvaW5NZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgZXh0cmFjdG9yID0gRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5nZXRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgU3RyaW5nW10gdGFyZ2V0RXhwcmVzc2lvbnMgPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEpvaW5WYWxpZGF0aW9uLmNsYXNzKS52YWx1ZSgpOw0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlsczsNCi0gICAgICAgIGZvciAoU3RyaW5nIHRhcmdldEV4cHJlc3Npb24gOiB0YXJnZXRFeHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscw0KLSAgICAgICAgICAgICAgICAuY3JlYXRlUHJvcGVydHlEZXRhaWxzRm9yTmV3VGFyZ2V0KG1ldGFEYXRhRW50cnksIHRhcmdldEV4cHJlc3Npb24pOw0KLQ0KLSAgICAgICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IGV4dHJhY3Rvci5leHRyYWN0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzKS5nZXRNZXRhRGF0YUVudHJpZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKGVudHJ5LmdldEtleSgpKTsNCi0NCi0gICAgICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IEV4dFZhbFV0aWxzLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXRBbGwobWV0YURhdGFUcmFuc2Zvcm1lci5jb252ZXJ0TWV0YURhdGEoZW50cnkpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGJmZGJhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkJhc2ljOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKcGFNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImltcGwuIHRoZSByZXN0IikNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGEuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyk7DQotDQotICAgICAgICBpZihhbm5vdGF0aW9uIGluc3RhbmNlb2YgQ29sdW1uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCEoKENvbHVtbikgYW5ub3RhdGlvbikubnVsbGFibGUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RILCAoKENvbHVtbikgYW5ub3RhdGlvbikubGVuZ3RoKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihhbm5vdGF0aW9uIGluc3RhbmNlb2YgQmFzaWMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoISgoQmFzaWMpIGFubm90YXRpb24pLm9wdGlvbmFsKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIElkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotICAgICAgICAvL1RPRE8gaW1wbC4gdGhlIHJlc3QhISENCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9MZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTGVuZ3RoTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2M1ZWUzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9MZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBMZW5ndGggYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTGVuZ3RoLmNsYXNzKTsNCi0NCi0gICAgICAgIGludCBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW5pbXVtKCk7DQotDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSCwgbWluaW11bSk7DQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCwgYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgaWYobWluaW11bSA+IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Mb25nUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ODVlMmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxvbmdSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIExvbmdSYW5nZSBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMb25nUmFuZ2UuY2xhc3MpOw0KLQ0KLSAgICAgICAgbG9uZyBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW5pbXVtKCk7DQotDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOLCBtaW5pbXVtKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgsIGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gPiAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9QYXR0ZXJuTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1BhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NGE1YjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1BhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5QYXR0ZXJuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIFBhdHRlcm4gYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoUGF0dGVybi5jbGFzcyk7DQotICAgICAgICANCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOLCAoYW5ub3RhdGlvbikudmFsdWUoKSk7DQotDQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5ID0gKGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICAgICAgTG9jYWxlIGN1cnJlbnRMb2NhbGUgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKTsNCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kgPQ0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZyA9IEV4dFZhbFV0aWxzLmdldE1lc3NhZ2VSZXNvbHZlckZvclZhbGlkYXRpb25TdHJhdGVneSh2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICAgICAgLmdldE1lc3NhZ2UodmFsaWRhdGlvbkVycm9yTXNnS2V5LCBjdXJyZW50TG9jYWxlKTsNCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRSwgdmFsaWRhdGlvbkVycm9yTXNnKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9SZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9SZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThmNWFhNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFJlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NraXBNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU2tpcE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZiODI1Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU2tpcE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgU2tpcE1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04sIHRydWUpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1ZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MTc0ODkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1ZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBWYWxpZGF0b3IgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoVmFsaWRhdG9yLmNsYXNzKTsNCi0NCi0gICAgICAgIENsYXNzW10gdmFsaWRhdG9ycyA9IGFubm90YXRpb24udmFsdWUoKTsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRDbGFzcyA6IHZhbGlkYXRvcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoY3VycmVudENsYXNzLmdldFNpbXBsZU5hbWUoKS50b0xvd2VyQ2FzZSgpLmNvbnRhaW5zKENvbW1vbk1ldGFEYXRhS2V5cy5FTUFJTCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWx1ZS5hZGQoQ29tbW9uTWV0YURhdGFLZXlzLkVNQUlMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdmFsdWUuYWRkKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLkNVU1RPTSwgdmFsdWUpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNzU5MzMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkRvdWJsZVJhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuRG91YmxlUmFuZ2VWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERvdWJsZVJhbmdlU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLQ0KLSAgICAgICAgRG91YmxlUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoRG91YmxlUmFuZ2UuY2xhc3MpOw0KLSAgICAgICAgRG91YmxlUmFuZ2VWYWxpZGF0b3IgZG91YmxlUmFuZ2VWYWxpZGF0b3IgPSAoRG91YmxlUmFuZ2VWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoImphdmF4LmZhY2VzLkRvdWJsZVJhbmdlIik7DQotDQotICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSm9pblZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1ZDRlNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSm9pblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uZXh0cmFjdG9yLkRlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKb2luVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIGV4dHJhY3RvciA9IERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuZ2V0SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIFN0cmluZ1tdIHRhcmdldEV4cHJlc3Npb25zID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShKb2luVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdGFyZ2V0RXhwcmVzc2lvbiA6IHRhcmdldEV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogZXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCBwcm9wZXJ0eURldGFpbHMpLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBlbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gdmFsaWRhdGlvbiBzdHJhdGVneSBmb3VuZCBmb3IgIiArIGVudHJ5LmdldFZhbHVlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxNGQ4ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSnBhVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5CYXNpYzsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmU7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKcGFWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VGYWNlc0J1bmRsZSA9IGZhbHNlOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVEVfTEVOR1RIID0gImxlbmd0aCI7DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHZpb2xhdGlvbjsNCi0gICAgcHJpdmF0ZSBpbnQgbWF4TGVuZ3RoOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyk7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIENvbHVtbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZUNvbHVtbkFubm90YXRpb24oKENvbHVtbikgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBCYXNpYykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZUJhc2ljQW5ub3RhdGlvbigoQmFzaWMpIGFubm90YXRpb24sIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgSWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE9uZVRvT25lKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlT25lVG9PbmVBbm5vdGF0aW9uKChPbmVUb09uZSkgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBNYW55VG9PbmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVNYW55VG9PbmVBbm5vdGF0aW9uKChNYW55VG9PbmUpIGFubm90YXRpb24sIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ29sdW1uQW5ub3RhdGlvbihDb2x1bW4gY29sdW1uLCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICghY29sdW1uLm51bGxhYmxlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcNCi0gICAgICAgICAgICAgICAgJiYgY29sdW1uLmxlbmd0aCgpIDwgKChTdHJpbmcpIGNvbnZlcnRlZE9iamVjdCkubGVuZ3RoKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb24gPSBWQUxJREFURV9MRU5HVEg7DQotICAgICAgICAgICAgdGhpcy5tYXhMZW5ndGggPSBjb2x1bW4ubGVuZ3RoKCk7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihnZXRWYWxpZGF0aW9uRXJyb3JGYWNlc01hc3NhZ2UobnVsbCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUJhc2ljQW5ub3RhdGlvbihCYXNpYyBiYXNpYywgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoIWJhc2ljLm9wdGlvbmFsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU9uZVRvT25lQW5ub3RhdGlvbihPbmVUb09uZSBvbmVUb09uZSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFvbmVUb09uZS5vcHRpb25hbCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVNYW55VG9PbmVBbm5vdGF0aW9uKE1hbnlUb09uZSBtYW55VG9PbmUsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmICghbWFueVRvT25lLm9wdGlvbmFsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkNCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0ID09IG51bGwgfHwgY29udmVydGVkT2JqZWN0LmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb24gPSBDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQ7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihnZXRWYWxpZGF0aW9uRXJyb3JGYWNlc01hc3NhZ2UobnVsbCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKFZBTElEQVRFX0xFTkdUSC5lcXVhbHModGhpcy52aW9sYXRpb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAiZmllbGRfdG9vX2xvbmciOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAiZmllbGRfcmVxdWlyZWQiOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBzdXBlci5nZXRFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbik7DQotDQotICAgICAgICBpZiAoVkFMSURBVEVfTEVOR1RILmVxdWFscyh0aGlzLnZpb2xhdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgiezB9IiwgIiIgKyB0aGlzLm1heExlbmd0aCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHN1cGVyLnJlc29sdmVNZXNzYWdlKGtleSk7DQotICAgICAgICBTdHJpbmcgbWFya2VyID0gQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVI7DQotDQotICAgICAgICBpZigobWFya2VyICsga2V5ICsgbWFya2VyKS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnVzZUZhY2VzQnVuZGxlID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIGUpDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSBlLmdldEZhY2VzTWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgaWYodGhpcy51c2VGYWNlc0J1bmRsZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihWQUxJREFURV9MRU5HVEguZXF1YWxzKHRoaXMudmlvbGF0aW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdE1heGltdW1NZXNzYWdlKGZhY2VzTWVzc2FnZSwgdGhpcy5tYXhMZW5ndGgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5yZXBsYWNlV2l0aERlZmF1bHRSZXF1aXJlZE1lc3NhZ2UoZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xlbmd0aFN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTGVuZ3RoU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkMDU1OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTGVuZ3RoU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxlbmd0aDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkxlbmd0aFZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTGVuZ3RoU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgTGVuZ3RoIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKExlbmd0aC5jbGFzcyk7DQotICAgICAgICBMZW5ndGhWYWxpZGF0b3IgbGVuZ3RoVmFsaWRhdG9yID0gKExlbmd0aFZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigiamF2YXguZmFjZXMuTGVuZ3RoIik7DQotDQotICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWF4aW11bShhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBsZW5ndGhWYWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTG9uZ1JhbmdlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzU4MjAyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTG9uZ1JhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTG9uZ1JhbmdlVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMb25nUmFuZ2VTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotDQotICAgICAgICBMb25nUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTG9uZ1JhbmdlLmNsYXNzKTsNCi0gICAgICAgIExvbmdSYW5nZVZhbGlkYXRvciBsb25nUmFuZ2VWYWxpZGF0b3IgPSAoTG9uZ1JhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoImphdmF4LmZhY2VzLkxvbmdSYW5nZSIpOw0KLQ0KLSAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnNldE1pbmltdW0oYW5ub3RhdGlvbi5taW5pbXVtKCkpOw0KLSAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDI4MzlhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9QYXR0ZXJuU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFBhdHRlcm5TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgUGF0dGVybiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShQYXR0ZXJuLmNsYXNzKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGV4cHJlc3Npb24gOiBhbm5vdGF0aW9uLnZhbHVlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCA9PSBudWxsDQotICAgICAgICAgICAgICAgICAgICB8fCAhamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4uY29tcGlsZShleHByZXNzaW9uKS5tYXRjaGVyKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QudG9TdHJpbmcoKSkubWF0Y2hlcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihuZXcgRmFjZXNNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24pLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKS5yZXBsYWNlKCJ7MH0iLCBleHByZXNzaW9uKSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKFBhdHRlcm4pIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZXF1aXJlZFN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUmVxdWlyZWRTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzhmOTk2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZXF1aXJlZFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZFN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRmFjZXNCdW5kbGUgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCA9PSBudWxsIHx8IGNvbnZlcnRlZE9iamVjdC5lcXVhbHMoIiIpIHx8DQotICAgICAgICAgICAgICAgIChjb252ZXJ0ZWRPYmplY3QgaW5zdGFuY2VvZiBDb2xsZWN0aW9uICYmICgoQ29sbGVjdGlvbiljb252ZXJ0ZWRPYmplY3QpLmlzRW1wdHkoKSkgfHwNCi0gICAgICAgICAgICAgICAgKGNvbnZlcnRlZE9iamVjdCBpbnN0YW5jZW9mIE1hcCAmJiAoKE1hcCljb252ZXJ0ZWRPYmplY3QpLmlzRW1wdHkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihnZXRWYWxpZGF0aW9uRXJyb3JGYWNlc01hc3NhZ2UobWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoUmVxdWlyZWQpIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShlLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvU2tpcFZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1NraXBWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU4NjEwMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvU2tpcFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBTa2lwVmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFN0cmluZ1tdIHZhbHVlQmluZGluZ0V4cHJlc3Npb25zID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShTa2lwVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIGZvcihTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA6IHZhbHVlQmluZGluZ0V4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRWYWx1ZU9mRXhwcmVzc2lvbigNCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKSkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5zZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5TS0lQX1ZBTElEQVRJT04sIHRydWUpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIzY2M5MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLQ0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I+W10gdmFsaWRhdG9yQ2xhc3NlcyA9DQotICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShWYWxpZGF0b3IuY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yIHZhbGlkYXRvcjsNCi0gICAgICAgIGZvciAoQ2xhc3MgdmFsaWRhdG9yQ2xhc3NOYW1lIDogdmFsaWRhdG9yQ2xhc3NlcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0b3IgPSAoamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcikgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzcyh2YWxpZGF0b3JDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UodmFsaWRhdG9yQ2xhc3NOYW1lLmdldE5hbWUoKSArICIgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NjZhNDEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWNlc0V4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBUaGlzIHBoYXNlIGxpc3RlbmVyIHByb2Nlc3NlcyBjcm9zcyB2YWxpZGF0aW9uIGFzIHNvb24gYXMgaXQgZmluZHMgYSBzcGVjaWFsIHJlcXVlc3Qgc2NvcGVkIHN0b3JhZ2UuPGJyLz4NCi0gKiBTbyBpdCdzIHBvc3NpYmxlIHRvIGFkZCBpbmZvcm1hdGlvbiBkdXJpbmcgdGhlIHByb2Nlc3MgdmFsaWRhdGlvbiBwaGFzZS4gQXQgdGhlIGVuZCBvZiB0aGlzIHBoYXNlIGl0IGdldHMgcHJvY2Vzc2VkLg0KLSAqIEFmdGVyIHRoYXQgdGhlIHN0b3JhZ2UgZ2V0cyByZXNldGVkLjxwLz4NCi0gKiBJZiB5b3UgcHJvdmlkZSBhIGN1c3RvbSBleHRlbnNpb24gYW5kIHlvdSBhZGQgdGhlIHNhbWUgc3RvcmFnZSB0eXBlIHdpdGhpbiBhIGRpZmZlcmVudCBwaGFzZSwNCi0gKiBpdCBhbHNvIGdldHMgcHJvY2Vzc2VkIGF0IHRoZSBlbmQgb2YgdGhhdCBwaGFzZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSA9IENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKTsNCi0gICAgICAgICAgICBmb3IgKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA6IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UuZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKSBpbnN0YW5jZW9mIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbml0Q3Jvc3NWYWxpZGF0aW9uIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLnByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oZW50cnksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFkZE1lc3NhZ2UgPSB0cnVlOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkgaW5zdGFuY2VvZiBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWVzc2FnZSA9IChCb29sZWFuKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5nZXRDbGFzcygpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5jbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRDbGFzcygpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYoYWRkTWVzc2FnZSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWNlc01lc3NhZ2UgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsICYmIGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RmFjZXNDb250ZXh0KCkuYWRkTWVzc2FnZShlbnRyeS5nZXRDbGllbnRJZCgpLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRGYWNlc0NvbnRleHQoKS5yZW5kZXJSZXNwb25zZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluYWxseQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLnJlc2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNJbml0aWFsaXplZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OICE9IG51bGwNCi0gICAgICAgICAgICAgICAgICAgICYmIFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NST1NTVkFMSURBVElPTi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBKc2ZVdGlscy5kZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcih0aGlzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5BTllfUEhBU0U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZiM2RmMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMgPSANCi0gICAgICAgIG5ldyBBcnJheUxpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGQoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzLmFkZChlbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcyhMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0YzA0MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkNCi17DQotICAgIHByaXZhdGUgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5Ow0KLSAgICAvL2ZvciBjb21wbGV4IGNvbXBvbmVudHMgKGUuZy4gYSB0YWJsZSkgc3RvcmVzIHRoZSBvYmplY3Qgb2YgZW50cnkgKCN7ZW50cnkucHJvcGVydHl9KQ0KLSAgICBwcml2YXRlIFVJQ29tcG9uZW50IGNvbXBvbmVudDsNCi0gICAgcHJpdmF0ZSBPYmplY3QgY29udmVydGVkT2JqZWN0Ow0KLSAgICBwcml2YXRlIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgLy9qdXN0IGZvciBpbnB1dCBjb21wb25lbnRzIHdpdGhpbiBjb21wbGV4IGNvbXBvbmVudHMgZS5nLiBkYXRhVGFibGUsLi4uDQotICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudElkOw0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeSBnZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhRW50cnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFFbnRyeSA9IG1ldGFEYXRhRW50cnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFVJQ29tcG9uZW50IGdldENvbXBvbmVudCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KFVJQ29tcG9uZW50IGNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRPYmplY3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlZE9iamVjdChPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbnZlcnRlZE9iamVjdCA9IGNvbnZlcnRlZE9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uU3RyYXRlZ3koQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneSA9IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudElkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNsaWVudElkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudElkKFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MzEzZDguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBJbiBvcmRlciB0byBidWlsZCB1cCBhIG1hcHBpbmcgd2hpY2ggaXMgdXNlZCBmb3IgY3Jvc3MtdmFsaWRhdGlvbi4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkKLXsKLSAgICBwcml2YXRlIE9iamVjdCBiZWFuOwotICAgIHByaXZhdGUgT2JqZWN0IGNvbnZlcnRlZFZhbHVlOwotICAgIHByaXZhdGUgVUlDb21wb25lbnQgY29tcG9uZW50OwotICAgIC8vZm9yIGNvbXBsZXggY29tcG9uZW50cyAoZS5nLiBhIHRhYmxlIHRoZXJlIGFyZSBtdWx0aXBsZSBlbnRyaWVzIHdpdGgKLSAgICAvL3RoZSBzYW1lIGtleSAoaGVyZSB0aGUgZWwgZXhwcmVzc2lvbiAje2VudHJ5LnByb3BlcnR5fSkKLSAgICAvL2hvd2V2ZXIsIGRvbid0IG92ZXJyaWRlIHRoZSBwcmV2aW91cyBlbnRyeSAtIHRoZXkgYXJuJ3QgdGhlIHNhbWU7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGZ1cnRoZXJFbnRyaWVzOwotICAgIC8vanVzdCBmb3IgaW5wdXQgY29tcG9uZW50cyB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzIGUuZy4gZGF0YVRhYmxlLC4uLgotICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudElkOwotCi0gICAgLyoKLSAgICAgKiBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmVhbihPYmplY3QgYmVhbikKLSAgICB7Ci0gICAgICAgIHRoaXMuYmVhbiA9IGJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkVmFsdWUoT2JqZWN0IGNvbnZlcnRlZFZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy5jb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBVSUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnQoVUlDb21wb25lbnQgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gY2xpZW50SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50SWQoU3RyaW5nIGNsaWVudElkKQotICAgIHsKLSAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGdldEZ1cnRoZXJFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmdXJ0aGVyRW50cmllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGdXJ0aGVyRW50cmllcyhMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGZ1cnRoZXJFbnRyaWVzKQotICAgIHsKLSAgICAgICAgdGhpcy5mdXJ0aGVyRW50cmllcyA9IGZ1cnRoZXJFbnRyaWVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzQwMjc5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcm4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04iKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJcy5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjM1YTFkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIERhdGVJcw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWVPZigpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBvcHRpb25hbCBzZWN0aW9uDQotICAgICAqLw0KLQ0KLSAgICBEYXRlSXNUeXBlIHR5cGUoKSBkZWZhdWx0IERhdGVJc1R5cGUuc2FtZTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgIiI7DQotDQotICAgIFN0cmluZyBub3RCZWZvcmVFcnJvck1zZ0tleSgpIGRlZmF1bHQgIndyb25nX2RhdGVfbm90X2JlZm9yZSI7DQotDQotICAgIFN0cmluZyBub3RBZnRlckVycm9yTXNnS2V5KCkgZGVmYXVsdCAid3JvbmdfZGF0ZV9ub3RfYWZ0ZXIiOw0KLQ0KLSAgICBTdHJpbmcgbm90RXF1YWxFcnJvck1zZ0tleSgpIGRlZmF1bHQgIndyb25nX2RhdGVfbm90X2VxdWFsIjsNCi0NCi0gICAgaW50IGVycm9yTWVzc2FnZURhdGVTdHlsZSgpIGRlZmF1bHQgRGF0ZUZvcm1hdC5NRURJVU07DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzVmNDgyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJiZWZvcmVPclNhbWUsIGFmdGVyT3JTYW1lIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgZW51bSBEYXRlSXNUeXBlDQotew0KLSAgICBiZWZvcmUsIGFmdGVyLCBzYW1lDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YSBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0Nzg5OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIEVxdWFscw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZCI7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9Ob3RFcXVhbHMuamF2YSBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9Ob3RFcXVhbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg4MTc2Mi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIE5vdEVxdWFscw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQiOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJiNmRiMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBSZXF1aXJlZElmDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZU9mKCk7DQotDQotICAgIC8qDQotICAgICAqIG9wdGlvbmFsIHNlY3Rpb24NCi0gICAgICovDQotDQotICAgIFJlcXVpcmVkSWZUeXBlIGlzKCkgZGVmYXVsdCBSZXF1aXJlZElmVHlwZS5ub3RfZW1wdHk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJlbXB0eV9maWVsZCI7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmVHlwZS5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWZUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYzU4ZDkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWZUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBlbnVtIFJlcXVpcmVkSWZUeXBlDQotew0KLSAgICBlbXB0eSwgbm90X2VtcHR5DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNjA3NTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUlucHV0IGlzIGRpZmZlcmVudA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9SW5wdXQgaXMgZGlmZmVyZW50DQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi0NCi13cm9uZ19kYXRlPVdyb25nIGRhdGUNCi13cm9uZ19kYXRlX2RldGFpbD1Xcm9uZyBkYXRlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmY5M2M0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1cdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgXHUwNjQ1XHUwNjJlXHUwNjJhXHUwNjQ0XHUwNjQxDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgXHUwNjQ1XHUwNjJlXHUwNjJhXHUwNjQ0XHUwNjQxDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1cdTA2M2FcdTA2NGFcdTA2MzEgXHUwNjQ1XHUwNjMzXHUwNjQ1XHUwNjQ4XHUwNjJkIFx1MDYyOFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDYgXHUwNjQxXHUwNjMzIFx1MDY0Mlx1MDY0YVx1MDY0NVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1cdTA2M2FcdTA2NGFcdTA2MzEgXHUwNjQ1XHUwNjMzXHUwNjQ1XHUwNjQ4XHUwNjJkIFx1MDYyOFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCAgXHUwNjQ2XHUwNjQxXHUwNjMzIFx1MDY0Mlx1MDY0YVx1MDY0NVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQNCi0NCi13cm9uZ19kYXRlPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2NDlcdTA2MjENCi13cm9uZ19kYXRlX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjJlXHUwNjI3XHUwNjM3XHUwNjQ5XHUwNjIxDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0M1x1MDY0OCBcdTA2NDYgXHUwNjI4XHUwNjM5XHUwNjJmIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzIFx1MDY0OFx1MDY0NiBcdTA2MjhcdTA2MzlcdTA2MmYgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzXHUwNjQ4IFx1MDY0NiBcdTA2NDJcdTA2MjhcdTA2NDQgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0MyBcdTA2NDhcdTA2NDYgXHUwNjQyXHUwNjI4XHUwNjQ0IHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NDRcdTA2MjcgXHUwNjRhXHUwNjMzXHUwNjI3XHUwNjQ4XHUwNjQ5IHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjQ0XHUwNjI3IFx1MDY0YVx1MDYzM1x1MDYyN1x1MDY0OFx1MDY0OSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODU0ZWQyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9ZWwgdmFsb3IgXHUwMGU5IGRpZmVyZW50Ci1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPWVsIHZhbG9yIFx1MDBlOSBkaWZlcmVudAotCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPW5vIGVzIHBlcm1ldCBlbCBtYXRlaXggdmFsb3IKLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPW5vIGVzIHBlcm1ldCBlbCBtYXRlaXggdmFsb3IKLQotd3JvbmdfZGF0ZT1kYXRhIGVyclx1MDBmMm5pYQotd3JvbmdfZGF0ZV9kZXRhaWw9ZGF0YSBlcnJcdTAwZjJuaWEKLQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1sYSBkYXRhIGhhIGRlIHNlciBwb3N0ZXJpb3IgYSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9bGEgZGF0YSBoYSBkZSBzZXIgYW50ZXJpb3IgYSB7MH0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1sYSBkYXRhIGhhIGRlIHNlciBwb3N0ZXJpb3IgYSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9bGEgZGF0YSBubyBcdTAwMGU5cyBpZ3VhbCBhIHswfQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPWxhIGRhdGEgbm8gXHUwMDBlOXMgaWd1YWwgYSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDg3MjM0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1FaW5nYWJlIGlzdCB1bnRlcnNjaGllZGxpY2gNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUVpbmdhYmUgaXN0IHVudGVyc2NoaWVkbGljaA0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9RGVyIGdsZWljaGUgV2VydCBpc3QgbmljaHQgZXJsYXVidA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPURlciBnbGVpY2hlIFdlcnQgaXN0IG5pY2h0IGVybGF1YnQNCi0NCi13cm9uZ19kYXRlPURhdHVtIGlua29ycmVrdA0KLXdyb25nX2RhdGVfZGV0YWlsPURhdHVtIGlua29ycmVrdA0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1EYXMgRGF0dW0gbXVzcyBuYWNoIGRlbSB7MH0gc2Vpbg0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9RGFzIERhdHVtIG11c3MgbmFjaCBkZW0gezB9IHNlaW4NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1EYXMgRGF0dW0gbXVzcyB2b3IgZGVtIHswfSBzZWluDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPURhcyBEYXR1bSBtdXNzIHZvciBkZW0gezB9IHNlaW4NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1EYXMgRGF0dW0gZW50c3ByaWNodCBuaWNodCBkZW0gezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPURhcyBEYXR1bSBlbnRzcHJpY2h0IG5pY2h0IGRlbSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjYwNzU5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1JbnB1dCBpcyBkaWZmZXJlbnQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUlucHV0IGlzIGRpZmZlcmVudA0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotDQotd3JvbmdfZGF0ZT1Xcm9uZyBkYXRlDQotd3JvbmdfZGF0ZV9kZXRhaWw9V3JvbmcgZGF0ZQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzODUyNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPWxhIGVudHJhZGEgZXMgZGlmZXJlbnRlCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPWxhIGVudHJhZGEgZXMgZGlmZXJlbnRlCi0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9bm8gc2UgcGVybWl0ZW4gZW50cmFkYXMgaWd1YWxlcwotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9bm8gc2UgcGVybWl0ZW4gZW50cmFkYXMgaWd1YWxlcwotCi13cm9uZ19kYXRlPWZlY2hhIGVxdWl2b2NhZGEKLXdyb25nX2RhdGVfZGV0YWlsPWZlY2hhIGVxdWl2b2NhZGEKLQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgbHVlZ28gZGUgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgbHVlZ28gZGUgezB9Ci0KLXdyb25nX2RhdGVfbm90X2FmdGVyPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgYW50ZXMgZGUgezB9Ci13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBhbnRlcyBkZSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9bGEgZmVjaGEgbm8gZXMgaWd1YWwgYSB7MH0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1sYSBmZWNoYSBubyBlcyBpZ3VhbCBhIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZjAyMTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUxlcyBjaGFtcHMgc29udCBkaWZmJmVhY3V0ZTtyZW50cw0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9TGVzIGNoYW1wcyBzb250IGRpZmYmZWFjdXRlO3JlbnRzDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1MZXMgY2hhbXBzIGRvaXZlbnQgJmVjaXJjO3RyZSBkaWZmJmVhY3V0ZTtyZW50cw0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPUxlcyBjaGFtcHMgZG9pdmVudCAmZWNpcmM7dHJlIGRpZmYmZWFjdXRlO3JlbnRzDQotDQotd3JvbmdfZGF0ZT1MYSBkYXRlIGVzdCBpbmNvcnJlY3RlDQotd3JvbmdfZGF0ZV9kZXRhaWw9TGEgZGF0ZSBlc3QgaW5jb3JyZWN0ZQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhcHImZWdyYXZlO3MgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhcHImZWdyYXZlO3MgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXZhbnQgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGF2YW50IHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPUxhIGRhdGUgbidlc3QgcGFzICZlYWN1dGU7Z2FsZSAmYWdyYXZlOyB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9TGEgZGF0ZSBuJ2VzdCBwYXMgJmVhY3V0ZTtnYWxlICZhZ3JhdmU7IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNDI4MDEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1WYWxvcmkgbm9uIHVndWFsaQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1JIHZhbG9yaSBpbnNlcml0aSBub24gY29pbmNpZG9ubwotCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPUxvIHN0ZXNzbyB2YWxvcmUgbm9uICZlZ3JhdmU7IHBlcm1lc3NvCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1MbyBzdGVzc28gdmFsb3JlIG5vbiAmZWdyYXZlOyBwZXJtZXNzbwotCi13cm9uZ19kYXRlPURhdGEgZXJyYXRhCi13cm9uZ19kYXRlX2RldGFpbD1EYXRhIGVycmF0YQotCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9TGEgZGF0YSBkZXZlIGVzc2VyZSBkb3BvIGRpIHswfQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1MYSBkYXRhIGRldmUgZXNzZXJlIGRvcG8gZGkgezB9Ci0KLXdyb25nX2RhdGVfbm90X2FmdGVyPUxhIGRhdGEgZGV2ZSBlc3NlcmUgcHJpbWEgZGkgezB9Ci13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9TGEgZGF0YSBkZXZlIGVzc2VyZSBwcmltYSBkaSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9TGEgZGF0YSBub24gJmVncmF2ZTsgdWd1YWxlIGEgezB9Ci13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9TGEgZGF0YSBub24gJmVncmF2ZTsgdWd1YWxlIGEgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFmNmE5ZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9Z2lyaWxlbiBkZVx1MDExZmVyIGZhcmtsXHUwMTMxDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1naXJpbGVuIGRlXHUwMTFmZXIgZmFya2xcdTAxMzENCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPWF5blx1MDEzMSBkZVx1MDExZmVyIGdpcmlsZW1leg0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPWF5blx1MDEzMSBkZVx1MDExZmVyIGdpcmlsZW1leg0KLQ0KLXdyb25nX2RhdGU9eWFubFx1MDEzMVx1MDE1ZiB0YXJpaA0KLXdyb25nX2RhdGVfZGV0YWlsPXlhbmxcdTAxMzFcdTAxNWYgdGFyaWgNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBzb25yYSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIHNvbnJhIG9sbWFsXHUwMTMxZFx1MDEzMXINCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIFx1MDBmNm5jZSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gXHUwMGY2bmNlIG9sbWFsXHUwMTMxZFx1MDEzMXINCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZSBlXHUwMTVmaXQgZGVcdTAxMWZpbA0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZSBlXHUwMTVmaXQgZGVcdTAxMWZpbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDc2NTllLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgICAgIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZU5hbWUgPSBudWxsOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VOYW1lID0gc3VwZXIuZ2V0QmFzZU5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBiYXNlTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlY29yZGVyL0Nyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlY29yZGVyL0Nyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNDBhMDMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWNvcmRlci9Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnJlY29yZGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlci5Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyIGltcGxlbWVudHMgUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcg0KLXsNCi0gICAgcHVibGljIHZvaWQgcmVjb3JkVXNlcklucHV0KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgdmFsdWUpDQotICAgIHsNCi0gICAgICAgIGlmICghKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy90byBzdXBwb3J0IGxvY2FsIGNyb3NzLXZhbGlkYXRpb24gKHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkpDQotICAgICAgICBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZyA9IENyb3NzVmFsaWRhdGlvblV0aWxzDQotICAgICAgICAgICAgLmdldE9ySW5pdEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IGVudHJ5Ow0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBpZihwcm9wZXJ0eURldGFpbHMgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGVudHJ5ID0gbmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkoKTsNCi0gICAgICAgIGVudHJ5LnNldEJlYW4ocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSk7DQotICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh2YWx1ZSk7DQotICAgICAgICBlbnRyeS5zZXRDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgZW50cnkuc2V0Q2xpZW50SWQodWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKSk7DQotDQotICAgICAgICBTdHJpbmcga2V5ID0gcHJvcGVydHlEZXRhaWxzLmdldEtleSgpOw0KLQ0KLSAgICAgICAgLy9mb3IgbG9jYWwgY3Jvc3MtdmFsaWRhdGlvbg0KLSAgICAgICAgaWYgKGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLmNvbnRhaW5zS2V5KGtleSkgJiYNCi0gICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQoa2V5KS5nZXRCZWFuKCkgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICFrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQoa2V5KS5nZXRCZWFuKCkuZXF1YWxzKGVudHJ5LmdldEJlYW4oKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9mb3IgdGhlIHZhbGlkYXRpb24gd2l0aGluIGEgY29tcGxleCBjb21wb25lbnQgZS5nLiBhIHRhYmxlDQotICAgICAgICAgICAgLy9kb24ndCBvdmVycmlkZSBleGlzdGluZyBleHByZXNzaW9uIChzdHlsZTogI3tlbnRyeS5wcm9wZXJ0eX0pIC0gbWFrZSBhIHNwZWNpYWwgbWFwcGluZw0KLQ0KLSAgICAgICAgICAgIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4gZnVydGhlckVudHJpZXMgPQ0KLSAgICAgICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQoa2V5KS5nZXRGdXJ0aGVyRW50cmllcygpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmdXJ0aGVyRW50cmllcyA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZnVydGhlckVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+KCk7DQotDQotICAgICAgICAgICAgICAgIGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLmdldChrZXkpLnNldEZ1cnRoZXJFbnRyaWVzKGZ1cnRoZXJFbnRyaWVzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgZnVydGhlckVudHJpZXMuYWRkKGVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2ZvciBub3JtYWwgdmFsaWRhdGlvbg0KLSAgICAgICAgICAgIGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLnB1dChrZXksIGVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q29tcGFyZVN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYzE1NDQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIExpc3Q8UmVmZXJlbmNpbmdTdHJhdGVneT4gcmVmZXJlbmNpbmdTdHJhdGVnaWVzOw0KLSAgICBwcm90ZWN0ZWQgTWFwPE9iamVjdCwgT2JqZWN0PiB2aW9sYXRpb25SZXN1bHRTdG9yYWdlID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIGluaXRSZWZlcmVuY2luZ1N0cmF0ZWdpZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UmVmZXJlbmNpbmdTdHJhdGVnaWVzKCkNCi0gICAgew0KLSAgICAgICAgaWYgKHJlZmVyZW5jaW5nU3RyYXRlZ2llcyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcyA9IG5ldyBBcnJheUxpc3Q8UmVmZXJlbmNpbmdTdHJhdGVneT4oKTsNCi0NCi0gICAgICAgICAgICBTdHJpbmcgY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneUNsYXNzTmFtZSA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQkFTRV9QQUNLQUdFKSArICJSZWZlcmVuY2luZ1N0cmF0ZWd5IjsNCi0NCi0gICAgICAgICAgICBSZWZlcmVuY2luZ1N0cmF0ZWd5IGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kgPSAoUmVmZXJlbmNpbmdTdHJhdGVneSkgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneUNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IEVMQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgICAgIC8vcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgQWxpYXNDb21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgTG9jYWxDb21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9pbml0Q3Jvc3NWYWxpZGF0aW9uIGlzIGRvbmUgaW4gdGhlIENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXINCi0NCi0gICAgICAgIFN0cmluZ1tdIHZhbGlkYXRpb25UYXJnZXRzID0gZ2V0VmFsaWRhdGlvblRhcmdldHMoDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0IDogdmFsaWRhdGlvblRhcmdldHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCA9IHZhbGlkYXRpb25UYXJnZXQudHJpbSgpOw0KLQ0KLSAgICAgICAgICAgIC8vc2VsZWN0IHZhbGlkYXRpb24gbWV0aG9kDQotICAgICAgICAgICAgdHJ5VG9WYWxpZGF0ZShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsIHZhbGlkYXRpb25UYXJnZXQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBmb3IgKFJlZmVyZW5jaW5nU3RyYXRlZ3kgcmVmZXJlbmNpbmdTdHJhdGVneSA6IHJlZmVyZW5jaW5nU3RyYXRlZ2llcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAocmVmZXJlbmNpbmdTdHJhdGVneS5ldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLCB2YWxpZGF0aW9uVGFyZ2V0LCB0aGlzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlRocm93YWJsZUluc3RhbmNlTmV2ZXJUaHJvd24ifSkNCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlLA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWhhbmRsZVRhcmdldFZpb2xhdGlvbihlbnRyeU9mU291cmNlLCBlbnRyeU9mVGFyZ2V0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL25vIHRhcmdldCAtIGJlY2F1c2UgdGhlcmUgaXMgbm8gdGFyZ2V0IGNvbXBvbmVudCAtIHZhbHVlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbW9kZWwNCi0gICAgICAgICAgICBpZihlbnRyeU9mVGFyZ2V0ID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzVGFyZ2V0Q29tcG9uZW50QXNTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihlbnRyeU9mU291cmNlKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgLy9nZXQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIHRhcmdldCBjb21wb25lbnQNCi0gICAgICAgIFN0cmluZyBzdW1tYXJ5ID0gZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgdHJ1ZSk7DQotICAgICAgICBTdHJpbmcgZGV0YWlscyA9IGdldEVycm9yTWVzc2FnZURldGFpbChlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgdHJ1ZSk7DQotDQotICAgICAgICAvL3ZhbGlkYXRpb24gdGFyZ2V0IGlzbid0IGJvdW5kIHRvIGEgY29tcG9uZW50IHdpdGhpbmcgdGhlIGN1cnJlbnQgcGFnZSANCi0gICAgICAgIC8vKHNlZSB2YWxpZGF0ZUZvdW5kRW50cnksIHRyeVRvVmFsaWRhdGVMb2NhbGx5IGFuZCB0cnlUb1ZhbGlkYXRlQmluZGluZ09ubHkpDQotICAgICAgICBpZiAoZW50cnlPZlRhcmdldCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGVudHJ5T2ZUYXJnZXQgPSBlbnRyeU9mU291cmNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlIG1lc3NhZ2U7DQotICAgICAgICBpZiAoZW50cnlPZlRhcmdldC5nZXRNZXRhRGF0YUVudHJ5KCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXNzYWdlID0gZ2V0VGFyZ2V0Q29tcG9uZW50RXJyb3JNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICBlbnRyeU9mVGFyZ2V0LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9UT0RPIGRvY3VtZW50IHBvc3NpYmxlIHNpZGUgZWZmZWN0cw0KLSAgICAgICAgICAgIC8vZHVlIHRvIGEgbWlzc2luZyB0YXJnZXQgYW5ub3RhdGlvbiAoc2VlOiB0cnlUb1ZhbGlkYXRlTG9jYWxseSkNCi0gICAgICAgICAgICBtZXNzYWdlID0gZ2V0VGFyZ2V0Q29tcG9uZW50RXJyb3JNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoKG1lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgfHwgbWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKSAmJg0KLSAgICAgICAgICAgIGVudHJ5T2ZTb3VyY2UuZ2V0Q2xpZW50SWQoKSAhPSBudWxsICYmICFlbnRyeU9mU291cmNlLmdldENsaWVudElkKCkuZXF1YWxzKGVudHJ5T2ZUYXJnZXQuZ2V0Q2xpZW50SWQoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiA9IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24obWVzc2FnZSk7DQotDQotICAgICAgICAgICAgaWYoRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgICAgICBlbnRyeU9mVGFyZ2V0LmdldENvbXBvbmVudCgpLCBlbnRyeU9mVGFyZ2V0LmdldE1ldGFEYXRhRW50cnkoKSwNCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5T2ZUYXJnZXQuZ2V0Q29udmVydGVkT2JqZWN0KCksIHZhbGlkYXRvckV4Y2VwdGlvbiwgdGhpcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQuYWRkTWVzc2FnZShlbnRyeU9mVGFyZ2V0LmdldENsaWVudElkKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29udmVydEZhY2VzTWVzc2FnZSh2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NUYXJnZXRDb21wb25lbnRBc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlKQ0KLSAgICB7DQotICAgICAgICAvL2dldCB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQNCi0gICAgICAgIFN0cmluZyBzdW1tYXJ5ID0gZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpOw0KLSAgICAgICAgU3RyaW5nIGRldGFpbHMgPSBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsKGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlID0gZ2V0U291cmNlQ29tcG9uZW50RXJyb3JNZXNzYWdlKA0KLSAgICAgICAgICAgIGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCBzdW1tYXJ5LCBkZXRhaWxzKTsNCi0NCi0gICAgICAgIGlmIChtZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsIHx8IG1lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8NCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vVE9ETyBsb2dnaW5nDQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHJvY2Vzc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZiAoaGFuZGxlU291cmNlVmlvbGF0aW9uKGVudHJ5T2ZTb3VyY2UpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZ2V0IHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgICAgICAgIFN0cmluZyBzdW1tYXJ5ID0gZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgZmFsc2UpOw0KLSAgICAgICAgICAgIFN0cmluZyBkZXRhaWxzID0gZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCBmYWxzZSk7DQotDQotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIG1lc3NhZ2UgPSBnZXRTb3VyY2VDb21wb25lbnRFcnJvck1lc3NhZ2UoDQotICAgICAgICAgICAgICAgIGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLCBzdW1tYXJ5LCBkZXRhaWxzKTsNCi0NCi0gICAgICAgICAgICBpZiAobWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCB8fCBtZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL1RPRE8NCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihtZXNzYWdlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvL2p1c3QgdGhyb3cgYSBuZXcgbWVzc2FnZSAtIHRoZSBlcnJvciBtZXNzYWdlIGlzIGF0IHRoZSB0YXJnZXQNCi0gICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24obmV3IEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgRmFjZXNNZXNzYWdlIGdldFNvdXJjZUNvbXBvbmVudEVycm9yTWVzc2FnZShBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEZhY2VzTWVzc2FnZSBnZXRUYXJnZXRDb21wb25lbnRFcnJvck1lc3NhZ2UoQW5ub3RhdGlvbiBmb3VuZEFubm90YXRpb24sIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHJlc29sdmVNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgU3RyaW5nIGtleSA9IGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgICAgICAgICAgcmV0dXJuIChrZXkgIT0gbnVsbCkgPyByZXNvbHZlTWVzc2FnZShrZXkgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCkgOiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBrZXkgIiArIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlVGFyZ2V0VmlvbGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlLA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW50cnlPZlRhcmdldCAhPSBudWxsICYmIGVudHJ5T2ZUYXJnZXQuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVTb3VyY2VWaW9sYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBoYW5kbGVUYXJnZXRWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBubyB0YXJnZXQgY29tcG9uZW50ICh2YWxpZGF0aW9uIGFnYWluc3QgdGhlIG1vZGVsKSAtPiBnZXQgcmV2ZXJzZSBtZXNzYWdlIGZvciBzb3VyY2UgY29tcG9uZW50DQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgLy9pZiB0aGUgbWVzc2FnZSBpcyBuZXV0cmFsDQotICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uLCB0cnVlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBubyB0YXJnZXQgY29tcG9uZW50ICh2YWxpZGF0aW9uIGFnYWluc3QgdGhlIG1vZGVsKSAtPiBnZXQgcmV2ZXJzZSBtZXNzYWdlIGZvciBzb3VyY2UgY29tcG9uZW50DQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICAvL2lmIHRoZSBtZXNzYWdlIGlzIG5ldXRyYWwNCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbiwgdHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogYWJzdHJhY3QgbWV0aG9kcw0KLSAgICAgKi8NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0NCi0gICAgLyoNCi0gICAgICogaW1wbGVtZW50cyB0aGUgc3BlY2lmaWMgdmFsaWRhdGlvbiBsb2dpYw0KLSAgICAgKi8NCi0NCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLCBBbm5vdGF0aW9uIGFubm90YXRpb24pOw0KLQ0KLSAgICAvKg0KLSAgICAgKiByZXR1cm5zIHRoZSByZWZlcmVuY2VkIHZhbGlkYXRpb24gdGFyZ2V0cyBvZiB0aGUgYW5ub3RhdGlvbg0KLSAgICAgKiBlLmcuIEBEYXRlSXModHlwZSA9IERhdGVJc1R5cGUuYmVmb3JlLCB2YWx1ZSA9ICJmaW5hbEV4YW0iKQ0KLSAgICAgKiAtPiBtZXRob2QgcmV0dXJucyBhbiBhcnJheSB3aXRoIG9uZSB2YWx1ZSAoImZpbmFsRXhhbSIpDQotICAgICAqLw0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjODFiYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMNCi0gICAgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIC8vaW5pdCBjcm9zcy12YWxpZGF0aW9uDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkgPQ0KLSAgICAgICAgICAgIGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpLmFkZChlbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkgPSBuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KCk7DQotDQotICAgICAgICBlbnRyeS5zZXRNZXRhRGF0YUVudHJ5KG1ldGFEYXRhRW50cnkpOw0KLSAgICAgICAgZW50cnkuc2V0Q29tcG9uZW50KHVpQ29tcG9uZW50KTsNCi0gICAgICAgIGVudHJ5LnNldENsaWVudElkKHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCkpOw0KLSAgICAgICAgZW50cnkuc2V0Q29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICBlbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3kodGhpcyk7DQotDQotICAgICAgICByZXR1cm4gZW50cnk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IGF2YWlsYWJsZSBmb3IgY3Jvc3MgdmFsaWRhdGlvbiAtIHVzZSBwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbiIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldExhYmVsKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vdCBhdmFpbGFibGUgZm9yIGNyb3NzIHZhbGlkYXRpb24iKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgLy9ub3QgYXZhaWxhYmxlIGZvciBjcm9zcyB2YWxpZGF0aW9uIC0gdXNlIGluaXRDcm9zc1ZhbGlkYXRpb24NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q3Jvc3NWYWxpZGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCksDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwgdmFsaWRhdG9yRXhjZXB0aW9uLCB0aGlzKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvbkhlbHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNmN2RlMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneShBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSwNCi0gICAgICAgICAgICBib29sZWFuIGlzTW9kZWxBd2FyZVZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChjb21wYXJlU3RyYXRlZ3kuaXNWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCksDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vcHJvY2VzcyBhZnRlciB2aW9sYXRpb24NCi0gICAgICAgICAgICAvL2p1c3QgYWRkIG1lc3NhZ2VzDQotICAgICAgICAgICAgaWYoIWlzTW9kZWxBd2FyZVZhbGlkYXRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzVGFyZ2V0QWZ0ZXJDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NUYXJnZXRBZnRlck1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvL3Rob3cgZXhjZXB0aW9uDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc1RhcmdldEFmdGVyQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgc291cmNlQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5ID0gbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgpOw0KLQ0KLSAgICAgICAgaWYgKGNvbXBhcmVTdHJhdGVneS51c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb21wb25lbnQodmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q2xpZW50SWQodmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENsaWVudElkKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb21wb25lbnQoc291cmNlQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q2xpZW50SWQoc291cmNlQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENsaWVudElkKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbnZlcnRlZE9iamVjdCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSk7DQotICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0VmFsaWRhdGlvblN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSk7DQotDQotICAgICAgICAvL2FkZCBtZXNzYWdlDQotICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICBzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzVGFyZ2V0QWZ0ZXJNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICAvL25vIHRhcmdldCAtIGJlY2F1c2UgdGhlcmUgaXMgbm8gdGFyZ2V0IGNvbXBvbmVudCAtIHZhbHVlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbW9kZWwNCi0gICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBudWxsKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjN2Q4NzIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgIHZvaWQgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSkNCi0gICAgICAgICAgICB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0RhdGVJc1N0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0RhdGVJc1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMmZhNzEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRGF0ZUlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXNUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEYXRlSXNTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUT09fRUFSTFkgPSAiZWFybHkiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUT09fTEFURSA9ICJsYXRlIjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UX0VRVUFMX0RBVEVfVElNRSA9ICJub3QgZXF1YWwiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfS0VZID0gInJlc3VsdCI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBUkVEX1ZBTFVFX0tFWSA9ICJ0YXJnZXQgdmFsdWUiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVZFUlNFX0NPTVBBUkVEX1ZBTFVFX0tFWSA9ICJyZXZlcnNlIHRhcmdldCB2YWx1ZSI7DQotDQotICAgIHB1YmxpYyBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIC8vVE9ETyB0ZXN0ICYgcmVtb3ZlDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVTb3VyY2VWaW9sYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiB2aW9sYXRpb25Gb3VuZDsNCi0NCi0gICAgICAgIGlmICgoKERhdGVJcykgYW5ub3RhdGlvbikudHlwZSgpLmVxdWFscyhEYXRlSXNUeXBlLnNhbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsICYmICFvYmplY3QxLmVxdWFscyhvYmplY3QyKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFU1VMVF9LRVksIE5PVF9FUVVBTF9EQVRFX1RJTUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKCgoRGF0ZUlzKSBhbm5vdGF0aW9uKS50eXBlKCkuZXF1YWxzKERhdGVJc1R5cGUuYmVmb3JlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IG9iamVjdDEgIT0gbnVsbCAmJiBvYmplY3QyICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFuZXcgRGF0ZSgoKERhdGUpIG9iamVjdDEpLmdldFRpbWUoKSkuYmVmb3JlKChEYXRlKSBvYmplY3QyKSB8fCBvYmplY3QxLmVxdWFscyhvYmplY3QyKSk7DQotDQotICAgICAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVNVTFRfS0VZLCBUT09fTEFURSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsICYmIG9iamVjdDIgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW5ldyBEYXRlKCgoRGF0ZSkgb2JqZWN0MSkuZ2V0VGltZSgpKS5hZnRlcigoRGF0ZSkgb2JqZWN0MikgfHwgb2JqZWN0MS5lcXVhbHMob2JqZWN0MikpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVTVUxUX0tFWSwgVE9PX0VBUkxZKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChDT01QQVJFRF9WQUxVRV9LRVksIG9iamVjdDEpOw0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVWRVJTRV9DT01QQVJFRF9WQUxVRV9LRVksIG9iamVjdDIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZpb2xhdGlvbkZvdW5kOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKERhdGVJcykgYW5ub3RhdGlvbikudmFsdWVPZigpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHByb3RlY3RlZA0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZykgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLmdldChSRVNVTFRfS0VZKTsNCi0NCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gcmV2ZXJzZVJlc3VsdChyZXN1bHQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKFRPT19FQVJMWS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0Tm90QWZ0ZXJFcnJvck1zZ0tleSgoRGF0ZUlzKSBhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKFRPT19MQVRFLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROb3RCZWZvcmVFcnJvck1zZ0tleSgoRGF0ZUlzKSBhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0Tm90RXF1YWxFcnJvck1zZ0tleSgoRGF0ZUlzKSBhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyByZXZlcnNlUmVzdWx0KFN0cmluZyByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIGlmIChUT09fRUFSTFkuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIFRPT19MQVRFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBUT09fRUFSTFk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpLCBhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBrZXkgIiArIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgZmFsc2UpLCBhbm5vdGF0aW9uLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGZhbHNlKQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgYW5ub3RhdGlvbiwgZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBrZXkgIiArIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGtleSwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHJlc29sdmVNZXNzYWdlKGtleSk7DQotDQotICAgICAgICBEYXRlRm9ybWF0IGRhdGVGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSgoKERhdGVJcykgYW5ub3RhdGlvbikuZXJyb3JNZXNzYWdlRGF0ZVN0eWxlKCksDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlc3VsdDsNCi0NCi0gICAgICAgIGlmKGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IG1lc3NhZ2UucmVwbGFjZSgiezB9IiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0LmZvcm1hdCgoRGF0ZSkgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLmdldChDT01QQVJFRF9WQUxVRV9LRVkpKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQuZm9ybWF0KChEYXRlKSB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UuZ2V0KFJFVkVSU0VfQ09NUEFSRURfVkFMVUVfS0VZKSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9yZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBvdGhlciBjb21wb25lbnQNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogcHJpdmF0ZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90QWZ0ZXJFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RBZnRlckVycm9yTXNnS2V5KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXROb3RCZWZvcmVFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RCZWZvcmVFcnJvck1zZ0tleSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90RXF1YWxFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RFcXVhbEVycm9yTXNnS2V5KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VMQ29tcGFyZVN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VMQ29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NDZhMjYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLlByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiByZWZlcmVuY2luZyB2YWxpZGF0aW9uIHRhcmdldHMgLSBwb3NzaWJsZSBmb3JtYXRzOg0KLSAqICIje1tiZWFuX25hbWVdLltwcm9wZXJ0eV9uYW1lXX0iIC4uLiBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbiB3aXRoIHZhbHVlIGJpbmRpbmcNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRUxDb21wYXJlU3RyYXRlZ3kgaW1wbGVtZW50cyBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LCBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZCh2YWxpZGF0aW9uVGFyZ2V0KSAmJg0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZhbGlkYXRpb25UYXJnZXQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvVmFsaWRhdGVWYWx1ZUJpbmRpbmcoDQotICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgICAgICAgICBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWxpZGF0aW9uVGFyZ2V0KSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwgY29tcGFyZVN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAidGVzdCIpDQotICAgIHByb3RlY3RlZCBib29sZWFuIHRyeVRvVmFsaWRhdGVWYWx1ZUJpbmRpbmcoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkgPQ0KLSAgICAgICAgICAgICAgICByZXNvbHZlVGFyZ2V0Rm9yQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldCk7DQotDQotICAgICAgICBpZih2YWxpZGF0aW9uVGFyZ2V0RW50cnkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSByZXNvbHZlVGFyZ2V0Rm9yQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWxpZGF0aW9uVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcgPQ0KLSAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpOw0KLQ0KLSAgICAgICAgcmV0dXJuIENyb3NzVmFsaWRhdGlvblV0aWxzLnJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgICAgIGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZywNCi0gICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuY29udmVydFZhbHVlQmluZGluZ0V4cHJlc3Npb25Ub1Byb2Nlc3NlZEluZm9ybWF0aW9uS2V5KHZhbGlkYXRpb25UYXJnZXQpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbGlkYXRpb25UYXJnZXQpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBPYmplY3QgdGFyZ2V0VmFsdWUgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFZhbHVlT2ZFeHByZXNzaW9uKGZhY2VzQ29udGV4dCwgdmFsaWRhdGlvblRhcmdldCk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHRhcmdldEVudHJ5ID0gbmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkoKTsNCi0gICAgICAgIHRhcmdldEVudHJ5LnNldEJlYW4oDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWxpZGF0aW9uVGFyZ2V0LmdldEJhc2VFeHByZXNzaW9uKCkpKTsNCi0gICAgICAgIHRhcmdldEVudHJ5LnNldENvbnZlcnRlZFZhbHVlKHRhcmdldFZhbHVlKTsNCi0NCi0gICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneShjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0RW50cnksIHRydWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0NzZjYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VxdWFsc1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXF1YWxzU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneQ0KLXsNCi0gICAgcHVibGljIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChFcXVhbHMpIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gb2JqZWN0MSAhPSBudWxsICYmICFvYmplY3QxLmVxdWFscyhvYmplY3QyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChFcXVhbHMpIGFubm90YXRpb24pLnZhbHVlKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbENvbXBhcmVTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDhkOThjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxDb21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi0NCi0vKioNCi0gKiAiW3Byb3BlcnR5X25hbWVdIiAuLi4gbG9jYWwgdmFsaWRhdGlvbiAtPiBjcm9zcy1jb21wb25lbnQsIGJ1dCBubyBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBMb2NhbENvbXBhcmVTdHJhdGVneSBpbXBsZW1lbnRzIFJlZmVyZW5jaW5nU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblRhcmdldC5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5IHdpbGwgY29udGludWUNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ5VG9WYWxpZGF0ZUxvY2FsbHkoDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXksDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcgPQ0KLSAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpOw0KLQ0KLSAgICAgICAgYm9vbGVhbiBpc01vZGVsQXdhcmVWYWxpZGF0aW9uID0NCi0gICAgICAgICAgICAgICAgaXNNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHRhcmdldFByb3BlcnR5ID0gdGFyZ2V0S2V5Ow0KLQ0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUtleSA9IHJlc29sdmVTb3VyY2VLZXkoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIHRhcmdldEtleSA9IHNvdXJjZUtleS5zdWJzdHJpbmcoMCwgc291cmNlS2V5Lmxhc3RJbmRleE9mKCIuIikgKyAxKSArIHRhcmdldEtleTsNCi0NCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5ID0gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMucmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFbnRyeSgNCi0gICAgICAgICAgICAgICAga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLCB0YXJnZXRLZXksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotDQotICAgICAgICBpZiAodmFsaWRhdGlvblRhcmdldEVudHJ5ICE9IG51bGwgJiYgdmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENvbXBvbmVudCgpICE9IG51bGwgJiYgIWlzTW9kZWxBd2FyZVZhbGlkYXRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vbm8gdGFyZ2V0IC0gYmVjYXVzZSB0aGVyZSBpcyBubyB0YXJnZXQgY29tcG9uZW50IC0gdmFsdWUgd2FzIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBtb2RlbA0KLSAgICAgICAgZWxzZSBpZihpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdW5zdXBwb3J0ZWRDYXNlKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZVRhcmdldEtleShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBTdHJpbmcgdGFyZ2V0S2V5KQ0KLSAgICB7DQotICAgICAgICAvL25vIHJlYWwgdmFsdWUgYmluZGluZyBleHByZXNzaW9uDQotICAgICAgICAvL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24ganVzdCBoZXBscyB0byByZXBsYWNlIHRoZSBwcm9wZXJ0eSBvZiB0aGUga2V5DQotICAgICAgICAvL2hlcmUgb25seSBkb3Qtbm90YXRpb24gaXMgYWxsb3dlZCAtPiBubyBwcm9ibGVtDQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGJhc2VFeHByZXNzaW9uID0NCi0gICAgICAgICAgICBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3siICsgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywNCi0gICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGV0YWlscy5jbGFzcykuZ2V0S2V5KCkgKyAifSIpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZU9yQWRkUHJvcGVydHkoYmFzZUV4cHJlc3Npb24sIHRhcmdldEtleSkNCi0gICAgICAgICAgICAuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC5zdWJzdHJpbmcoMiwgcmVzdWx0Lmxlbmd0aCgpIC0xKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlT2ZQcm9wZXJ0eShPYmplY3QgYmFzZSwgU3RyaW5nIHByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnR5LnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSwgcHJvcGVydHkubGVuZ3RoKCkpOw0KLSAgICAgICAgTWV0aG9kIHRhcmdldE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZChiYXNlLmdldENsYXNzKCksICJnZXQiICsgcHJvcGVydHkpOw0KLQ0KLSAgICAgICAgaWYodGFyZ2V0TWV0aG9kID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKGJhc2UuZ2V0Q2xhc3MoKSwgImlzIiArIHByb3BlcnR5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICJjbGFzcyAiICsgYmFzZS5nZXRDbGFzcygpICsgIiBoYXMgbm8gcHVibGljIGdldC9pcyAiICsgcHJvcGVydHkudG9Mb3dlckNhc2UoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKGJhc2UsIHRhcmdldE1ldGhvZCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZywNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0S2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbmV3S2V5ID0gY3JlYXRlVGFyZ2V0S2V5KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIHJldHVybiAha2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLmNvbnRhaW5zS2V5KG5ld0tleSk7DQotDQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZVNvdXJjZUtleShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIFN0cmluZyBzb3VyY2VLZXkgPSBwcm9wZXJ0eURldGFpbHMuZ2V0S2V5KCk7DQotDQotICAgICAgICBpZighc291cmNlS2V5LmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic291cmNlIHBhdGg6ICIgKyBzb3VyY2VLZXkgKyAiIGludmFsaWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzb3VyY2VLZXk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHVuc3VwcG9ydGVkQ2FzZShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGNvbnZlcnRlZCBvYmplY3QgZm9yICIgKyAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpLmdldEtleSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSkNCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHRhcmdldEVudHJ5ID0gbmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkoKTsNCi0NCi0gICAgICAgIHRhcmdldEVudHJ5LnNldEJlYW4oDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKS5nZXRCYXNlT2JqZWN0KCkpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkNCi0gICAgICAgICAgICAgICAgLnNldENvbnZlcnRlZFZhbHVlKGdldFZhbHVlT2ZQcm9wZXJ0eSh0YXJnZXRFbnRyeS5nZXRCZWFuKCksIHRhcmdldFByb3BlcnR5KSk7DQotDQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEVudHJ5LCB0cnVlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdhZjRiYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogIltsb2NhbF9wcm9wZXJ0eS5wcm9wZXJ0eTEucHJvcGVydHkyXSINCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5IGV4dGVuZHMgTG9jYWxDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LCBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKCF2YWxpZGF0aW9uVGFyZ2V0LmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9ub3Qgc3VwcG9ydGVkIC0gVE9ETyBhZGQgbG9nZ2luZw0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnlUb1ZhbGlkYXRlTG9jYWxseSgNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcgPQ0KLSAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpOw0KLQ0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IGNyZWF0ZVRhcmdldEtleShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEtleSk7DQotDQotICAgICAgICBpZiAoa2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLmNvbnRhaW5zS2V5KG5ld0tleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkgPSBrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcuZ2V0KG5ld0tleSk7DQotDQotICAgICAgICAgICAgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vbm8gdGFyZ2V0IC0gYmVjYXVzZSB0aGVyZSBpcyBubyB0YXJnZXQgY29tcG9uZW50IC0gdmFsdWUgd2FzIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBtb2RlbA0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRLZXkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB0YXJnZXRJbmZvcm1hdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LmlzVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgIHRhcmdldEluZm9ybWF0aW9uRW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSA9IG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoKTsNCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29tcG9uZW50KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENsaWVudElkKHRhcmdldEluZm9ybWF0aW9uRW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbnZlcnRlZE9iamVjdCh0YXJnZXRJbmZvcm1hdGlvbkVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCkpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAvL3Byb2Nlc3MgYWZ0ZXIgdmlvbGF0aW9uDQotICAgICAgICAgICAgLy9qdXN0IGFkZCBtZXNzYWdlcw0KLSAgICAgICAgICAgIGlmKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBudWxsKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy90aG93IGV4Y2VwdGlvbg0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFN0cmluZyB0YXJnZXRLZXkpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBPYmplY3QgbmV3QmFzZSA9IFJlZmxlY3Rpb25VdGlscw0KLSAgICAgICAgICAgIC5nZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCksIHRhcmdldEtleSk7DQotDQotICAgICAgICBpZih0YXJnZXRLZXkuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2ZpbmQgdGhlIGxhc3QgcHJvcGVydHkNCi0gICAgICAgICAgICB0YXJnZXRLZXkgPSB0YXJnZXRLZXkuc3Vic3RyaW5nKHRhcmdldEtleS5sYXN0SW5kZXhPZigiLiIpICsgMSwgdGFyZ2V0S2V5Lmxlbmd0aCgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXRWYWx1ZSA9IGdldFZhbHVlT2ZQcm9wZXJ0eShuZXdCYXNlLCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB0YXJnZXRFbnRyeSA9IG5ldyBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5KCk7DQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRCZWFuKG5ld0Jhc2UpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0Q29udmVydGVkVmFsdWUodGFyZ2V0VmFsdWUpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRFbnRyeSwgdHJ1ZSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Ob3RFcXVhbHNTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Ob3RFcXVhbHNTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDE1ZTIwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uTm90RXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBOb3RFcXVhbHNTdHJhdGVneSBleHRlbmRzIEVxdWFsc1N0cmF0ZWd5DQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChOb3RFcXVhbHMpIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsDQotICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIXN1cGVyLmlzVmlvbGF0aW9uKG9iamVjdDEsIG9iamVjdDIsIGFubm90YXRpb24pOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChOb3RFcXVhbHMpIGFubm90YXRpb24pLnZhbHVlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlZmVyZW5jaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzNmRmYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlZmVyZW5jaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJbnRlcm5hbCBpbnRlcmZhY2UgdG8gYWxsb3cgbXVsdGlwbGUgcmVmZXJlbmNpbmcgc3RyYXRlZ2llcyBmb3IgY3Jvc3MgY29tcG9uZW50IHZhbGlkYXRpb24uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWludGVyZmFjZSBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgYWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlcXVpcmVkSWZTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQwNWE1Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlcXVpcmVkSWZTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRJZlN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VGYWNlc0J1bmRsZSA9IGZhbHNlOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHN1cGVyLnJlc29sdmVNZXNzYWdlKGtleSk7DQotICAgICAgICBTdHJpbmcgbWFya2VyID0gQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVI7DQotDQotICAgICAgICBpZigobWFya2VyICsga2V5ICsgbWFya2VyKS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnVzZUZhY2VzQnVuZGxlID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChSZXF1aXJlZElmKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiB2aW9sYXRpb25Gb3VuZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgaWYgKCgoUmVxdWlyZWRJZikgYW5ub3RhdGlvbikuaXMoKS5lcXVhbHMoUmVxdWlyZWRJZlR5cGUuZW1wdHkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gKG9iamVjdDIgPT0gbnVsbCB8fCBvYmplY3QyLmVxdWFscygiIikpICYmIChvYmplY3QxID09IG51bGwgfHwgb2JqZWN0MS5lcXVhbHMoIiIpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKCgoUmVxdWlyZWRJZikgYW5ub3RhdGlvbikuaXMoKS5lcXVhbHMoUmVxdWlyZWRJZlR5cGUubm90X2VtcHR5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IChvYmplY3QyICE9IG51bGwgJiYgIW9iamVjdDIuZXF1YWxzKCIiKSkgJiYgKG9iamVjdDEgPT0gbnVsbCB8fCBvYmplY3QxLmVxdWFscygiIikpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZpb2xhdGlvbkZvdW5kOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKFJlcXVpcmVkSWYpIGFubm90YXRpb24pLnZhbHVlT2YoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy51c2VGYWNlc0J1bmRsZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5yZXBsYWNlV2l0aERlZmF1bHRSZXF1aXJlZE1lc3NhZ2UodmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRvckV4Y2VwdGlvbik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZDk5MjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1qYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW49b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuQmFzaWM9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuSWQ9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmU9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Dcm9zc1ZhbGlkYXRpb25VdGlscy5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkM2MzYWQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENST1NTX1ZBTElEQVRJT05fU1RPUkFHRV9LRVkgPSBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7DQotDQotICAgICAgICBpZiAoIXJlcXVlc3RNYXAuY29udGFpbnNLZXkoQ1JPU1NfVkFMSURBVElPTl9TVE9SQUdFX0tFWSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKENyb3NzVmFsaWRhdGlvblN0b3JhZ2UpIHJlcXVlc3RNYXAuZ2V0KENST1NTX1ZBTElEQVRJT05fU1RPUkFHRV9LRVkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQNCi0gICAgICAgICAgICAgICAgLmdldEN1cnJlbnRJbnN0YW5jZSgpDQotICAgICAgICAgICAgICAgIC5nZXRFeHRlcm5hbENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgICAgIC5wdXQoQ1JPU1NfVkFMSURBVElPTl9TVE9SQUdFX0tFWSwgbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RPX0NPTlZFUlRFRF9WQUxVRV9NQVBQSU5HX0tFWSA9IENyb3NzVmFsaWRhdGlvblV0aWxzLmNsYXNzLmdldE5hbWUoKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBnZXRPckluaXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIGlmICghcmVxdWVzdE1hcC5jb250YWluc0tleShLRVlfVE9fQ09OVkVSVEVEX1ZBTFVFX01BUFBJTkdfS0VZKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNldEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+KSByZXF1ZXN0TWFwLmdldChLRVlfVE9fQ09OVkVSVEVEX1ZBTFVFX01BUFBJTkdfS0VZKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkNCi0gICAgICAgICAgICAucHV0KEtFWV9UT19DT05WRVJURURfVkFMVUVfTUFQUElOR19LRVksIG5ldyBIYXNoTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4oKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4ga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcsDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSwgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5ID0NCi0gICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQodGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIC8vdmFsdWUgbm90IHN1Ym1pdHRlZCBhdCB0aGlzIHJlcXVlc3QgLSB1c2UgbW9kZWwgdmFsdWUgKHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbW9kZWwpDQotICAgICAgICBpZihwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICAvL3NpbXBsZSBjYXNlDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5nZXRGdXJ0aGVyRW50cmllcygpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXRCZWFuID0gcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKTsNCi0NCi0gICAgICAgIC8vcHJvY2VzcyBjb21wbGV4IGNvbXBvbmVudCBlbnRyaWVzIChlLmcuIGEgdGFibGUpDQotICAgICAgICAvL3N1cHBvcnRlZDogY3Jvc3MtY29tcG9uZW50IGJ1dCBubyBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbiAoPSBsb2NhbGUgdmFsaWRhdGlvbikNCi0gICAgICAgIGlmIChwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEJlYW4oKS5lcXVhbHModGFyZ2V0QmVhbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotICAgICAgICB9DQotDQotICAgICAgICBmb3IgKFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgZW50cnkgOiBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEZ1cnRoZXJFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LmdldEJlYW4oKS5lcXVhbHModGFyZ2V0QmVhbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInN1cHBvcnQgZm9yIG1hcCBzeW50YXgiKQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VmFsdWVCaW5kaW5nRXhwcmVzc2lvblRvUHJvY2Vzc2VkSW5mb3JtYXRpb25LZXkoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YmUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YmUuZ2V0RXhwcmVzc2lvblN0cmluZygpLnJlcGxhY2UoIiN7IiwgIiIpLnJlcGxhY2UoIn0iLCAiIik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OTNiZmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzOTI1NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBQcm9wZXJ0eSBWYWxpZGF0aW9uIE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFByb3BlcnR5IFZhbGlkYXRpb24gTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgUHJvcGVydHkgVmFsaWRhdGlvbiBwcm92aWRlcyBhbm5vdGF0aW9uIGJhc2VkIHZhbGlkYXRpb24gZm9yIGJlYW4gcHJvcGVydGllcy4NCi0gICAgSXQgYWxzbyBwcm92aWRlcyBKUEEgMS4wIGJhc2VkIHZhbGlkYXRpb24gU3VwcG9ydC4NCi0gIA0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS4xLnggYW5kIEpTRiAxLjIueC4gQm90aCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L0Fic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYjFkOTAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L0Fic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7Ci1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUlucHV0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5FeHRWYWxTdGFydHVwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWwuTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QudXRpbC5UZXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QubW9jay5FeHRWYWxNb2NrQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWRfaW1wbC5jb25maWcuTXlmYWNlc0NvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0V4dGVybmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrRmFjZXNDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tGYWNlc0NvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tIdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0h0dHBTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tMaWZlY3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0xpZmVjeWNsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1JlbmRlcktpdDsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrUmVzcG9uc2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1NlcnZsZXRDb25maWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1NlcnZsZXRDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5lbC5Nb2NrRXhwcmVzc2lvbkZhY3Rvcnk7Ci0KLS8qKgotICogQWJzdHJhY3QgU2hhbGUgVGVzdCBiYXNlIGNsYXNzLCB3aGljaCBzZXRzIHVwIHRoZSBKU0YgZW52aXJvbm1lbnQuICBJZiB0aGUgdGVzdAotICogb3ZlcnJpZGVzIDxjb2RlPnNldFVwKCk8L2NvZGU+IGFuZC9vciA8Y29kZT50ZWFyRG93bigpPC9jb2RlPiwgdGhlbiB0aG9zZQotICogbWV0aG9kcyBidXQgY2FsbCB0aGUgb3ZlcndpdHRlbiBtZXRob2QgdG8gaW5zdXJlIGEgdmFsaWQgdGVzdCBlbnZpcm9ubWVudC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwcm90ZWN0ZWQgTW9ja0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uOwotICAgIHByb3RlY3RlZCBNb2NrU2VydmxldENvbmZpZyBjb25maWc7Ci0gICAgcHJvdGVjdGVkIE1vY2tFeHRlcm5hbENvbnRleHQgZXh0ZXJuYWxDb250ZXh0OwotICAgIHByb3RlY3RlZCBNb2NrRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgTW9ja0ZhY2VzQ29udGV4dEZhY3RvcnkgZmFjZXNDb250ZXh0RmFjdG9yeTsKLSAgICBwcm90ZWN0ZWQgTW9ja0xpZmVjeWNsZSBsaWZlY3ljbGU7Ci0gICAgcHJvdGVjdGVkIE1vY2tMaWZlY3ljbGVGYWN0b3J5IGxpZmVjeWNsZUZhY3Rvcnk7Ci0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCByZW5kZXJLaXQ7Ci0gICAgcHJvdGVjdGVkIE1vY2tIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdDsKLSAgICBwcm90ZWN0ZWQgTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2U7Ci0gICAgcHJvdGVjdGVkIE1vY2tTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dDsKLSAgICBwcm90ZWN0ZWQgTW9ja0h0dHBTZXNzaW9uIHNlc3Npb247Ci0gICAgcHJvdGVjdGVkIE1vY2tFeHByZXNzaW9uRmFjdG9yeSBleHByZXNzaW9uRmFjdG9yeTsKLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIHRocmVhZENvbnRleHRDbGFzc0xvYWRlcjsKLQotICAgIC8qKiBSZXNwb25zZSBXcml0ZXIgKi8KLSAgICBwcml2YXRlIE1vY2tSZXNwb25zZVdyaXRlciB3cml0ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICAgICAgYXBwbGljYXRpb24gPSBudWxsOwotICAgICAgICBjb25maWcgPSBudWxsOwotICAgICAgICBleHRlcm5hbENvbnRleHQgPSBudWxsOwotICAgICAgICBmYWNlc0NvbnRleHQgPSBudWxsOwotICAgICAgICBmYWNlc0NvbnRleHRGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgbGlmZWN5Y2xlID0gbnVsbDsKLSAgICAgICAgbGlmZWN5Y2xlRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIHJlbmRlcktpdCA9IG51bGw7Ci0gICAgICAgIHJlcXVlc3QgPSBudWxsOwotICAgICAgICByZXNwb25zZSA9IG51bGw7Ci0gICAgICAgIHNlcnZsZXRDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgc2Vzc2lvbiA9IG51bGw7Ci0gICAgICAgIGV4cHJlc3Npb25GYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgU2V0dXAgdGhlIHRlc3QgZW52aXJvbm1lbnQsIGluY2x1ZGluZyB0aGUgZm9sbG93aW5nOgotICAgICAqICA8dWw+Ci0gICAgICogIDxsaT5TZXQgdGhlIEFwcGxpY2F0aW9uIE1hcC48L2xpPgotICAgICAqICA8bGk+U2V0IGEgcmVzcG9uc2Ugd3JpdGVyPC9saT4KLSAgICAgKiAgPGxpPkFkZCBUb21haGF3aydzIHJlbmRlcmVycyB0byB0aGUgZmFjZXMgY29udGV4dC48L2xpPgotICAgICAqICA8L3VsPiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRocmVhZENvbnRleHRDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKG5ldyBVUkxDbGFzc0xvYWRlcihuZXcgVVJMWzBdLCBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpKTsKLSAgICAgICAgc2VydmxldENvbnRleHQgPSBuZXcgTW9ja1NlcnZsZXRDb250ZXh0KCk7Ci0gICAgICAgIC8vZm9yIHRlc3RpbmcgdGhlIGZhbGxiYWNrCi0gICAgICAgIC8vc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihFeHRWYWxJbmZvcm1hdGlvbi5XRUJYTUxfUEFSQU1fUFJFRklYICsgIi5ERUFDVElWQVRFX0VMX1JFU09MVkVSIiwgInRydWUiKTsKLSAgICAgICAgc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihFeHRWYWxJbmZvcm1hdGlvbi5XRUJYTUxfUEFSQU1fUFJFRklYICsgIi5DVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZIiwgTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgY29uZmlnID0gbmV3IE1vY2tTZXJ2bGV0Q29uZmlnKHNlcnZsZXRDb250ZXh0KTsKLSAgICAgICAgc2Vzc2lvbiA9IG5ldyBNb2NrSHR0cFNlc3Npb24oKTsKLSAgICAgICAgc2Vzc2lvbi5zZXRTZXJ2bGV0Q29udGV4dChzZXJ2bGV0Q29udGV4dCk7Ci0gICAgICAgIHJlcXVlc3QgPSBuZXcgTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdChzZXNzaW9uKTsKLSAgICAgICAgcmVxdWVzdC5zZXRTZXJ2bGV0Q29udGV4dChzZXJ2bGV0Q29udGV4dCk7Ci0gICAgICAgIHJlc3BvbnNlID0gbmV3IE1vY2tIdHRwU2VydmxldFJlc3BvbnNlKCk7Ci0gICAgICAgIEZhY3RvcnlGaW5kZXIucmVsZWFzZUZhY3RvcmllcygpOwotICAgICAgICBGYWN0b3J5RmluZGVyLnNldEZhY3RvcnkoImphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeSIsIEV4dFZhbE1vY2tBcHBsaWNhdGlvbkZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgRmFjdG9yeUZpbmRlci5zZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dEZhY3RvcnkiLCAib3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0ZhY2VzQ29udGV4dEZhY3RvcnkiKTsKLSAgICAgICAgRmFjdG9yeUZpbmRlci5zZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5saWZlY3ljbGUuTGlmZWN5Y2xlRmFjdG9yeSIsICJvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrTGlmZWN5Y2xlRmFjdG9yeSIpOwotICAgICAgICBGYWN0b3J5RmluZGVyLnNldEZhY3RvcnkoImphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5IiwgIm9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tSZW5kZXJLaXRGYWN0b3J5Iik7Ci0gICAgICAgIGV4dGVybmFsQ29udGV4dCA9IG5ldyBNb2NrRXh0ZXJuYWxDb250ZXh0KHNlcnZsZXRDb250ZXh0LCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgIGxpZmVjeWNsZUZhY3RvcnkgPSAoTW9ja0xpZmVjeWNsZUZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5saWZlY3ljbGUuTGlmZWN5Y2xlRmFjdG9yeSIpOwotICAgICAgICBsaWZlY3ljbGUgPSAoTW9ja0xpZmVjeWNsZSlsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZSgiREVGQVVMVCIpOwotICAgICAgICBmYWNlc0NvbnRleHRGYWN0b3J5ID0gKE1vY2tGYWNlc0NvbnRleHRGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHRGYWN0b3J5Iik7Ci0gICAgICAgIGZhY2VzQ29udGV4dCA9IChNb2NrRmFjZXNDb250ZXh0KWZhY2VzQ29udGV4dEZhY3RvcnkuZ2V0RmFjZXNDb250ZXh0KHNlcnZsZXRDb250ZXh0LCByZXF1ZXN0LCByZXNwb25zZSwgbGlmZWN5Y2xlKTsKLSAgICAgICAgZXh0ZXJuYWxDb250ZXh0ID0gKE1vY2tFeHRlcm5hbENvbnRleHQpZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpOwotICAgICAgICBVSVZpZXdSb290IHJvb3QgPSBuZXcgVUlWaWV3Um9vdCgpOwotICAgICAgICByb290LnNldFZpZXdJZCgiL3ZpZXdJZCIpOwotICAgICAgICByb290LnNldFJlbmRlcktpdElkKCJIVE1MX0JBU0lDIik7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5zZXRWaWV3Um9vdChyb290KTsKLSAgICAgICAgQXBwbGljYXRpb25GYWN0b3J5IGFwcGxpY2F0aW9uRmFjdG9yeSA9IChBcHBsaWNhdGlvbkZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3RvcnkiKTsKLSAgICAgICAgYXBwbGljYXRpb24gPSAoTW9ja0FwcGxpY2F0aW9uKWFwcGxpY2F0aW9uRmFjdG9yeS5nZXRBcHBsaWNhdGlvbigpOwotICAgICAgICBmYWNlc0NvbnRleHQuc2V0QXBwbGljYXRpb24oYXBwbGljYXRpb24pOwotICAgICAgICBSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnkgPSAoUmVuZGVyS2l0RmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoImphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5Iik7Ci0gICAgICAgIC8vV3JhcCByZW5kZXJlcnMgd2l0aCBwcm9wZXIgZXh2YWwgd3JhcHBlcgotICAgICAgICByZW5kZXJLaXQgPSBuZXcgRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkuY3JlYXRlKG5ldyBNb2NrUmVuZGVyS2l0KCkpOwotICAgICAgICByZW5kZXJLaXRGYWN0b3J5LmFkZFJlbmRlcktpdCgiSFRNTF9CQVNJQyIsIHJlbmRlcktpdCk7ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vIGFkZGl0aW9uYWwgc2V0dXAgbm90IHByb3ZpZGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHNoYWxlIG1vY2sgc3R1ZmYKLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uTWFwKCkucHV0KE15ZmFjZXNDb25maWcuY2xhc3MuZ2V0TmFtZSgpLCBuZXcgTXlmYWNlc0NvbmZpZygpKTsKLSAgICAgICAgd3JpdGVyID0gbmV3IE1vY2tSZXNwb25zZVdyaXRlcihuZXcgU3RyaW5nV3JpdGVyKCksIG51bGwsIG51bGwpOwotICAgICAgICBmYWNlc0NvbnRleHQuc2V0UmVzcG9uc2VXcml0ZXIod3JpdGVyKTsKLQotICAgICAgICBUZXN0VXRpbHMuYWRkRGVmYXVsdFJlbmRlcmVycyhmYWNlc0NvbnRleHQpOwotICAgICAgICBUZXN0VXRpbHMuYWRkRGVmYXVsdFZhbGlkYXRvcnMoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgZXhwcmVzc2lvbkZhY3RvcnkgPSAoTW9ja0V4cHJlc3Npb25GYWN0b3J5KWFwcGxpY2F0aW9uLmdldEV4cHJlc3Npb25GYWN0b3J5KCk7Ci0KLSAgICAgICAgLy9leGVjdXRlIHN0YXJ0dXAgbGlzdGVuZXIKLSAgICAgICAgbmV3IEV4dFZhbFN0YXJ0dXBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuaW5pdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9LmluaXQoKTsKLQotICAgICAgICBuZXcgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyKCl7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyLmluaXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfS5pbml0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVhciBkb3duIHRoZSB0ZXN0IGVudmlyb25tZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYXBwbGljYXRpb24gPSBudWxsOwotICAgICAgICBjb25maWcgPSBudWxsOwotICAgICAgICBleHRlcm5hbENvbnRleHQgPSBudWxsOwotICAgICAgICBmYWNlc0NvbnRleHQucmVsZWFzZSgpOwotICAgICAgICBmYWNlc0NvbnRleHQgPSBudWxsOwotICAgICAgICBsaWZlY3ljbGUgPSBudWxsOwotICAgICAgICBsaWZlY3ljbGVGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgcmVuZGVyS2l0ID0gbnVsbDsKLSAgICAgICAgcmVxdWVzdCA9IG51bGw7Ci0gICAgICAgIHJlc3BvbnNlID0gbnVsbDsKLSAgICAgICAgc2VydmxldENvbnRleHQgPSBudWxsOwotICAgICAgICBzZXNzaW9uID0gbnVsbDsKLSAgICAgICAgRmFjdG9yeUZpbmRlci5yZWxlYXNlRmFjdG9yaWVzKCk7Ci0gICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHRocmVhZENvbnRleHRDbGFzc0xvYWRlcik7Ci0gICAgICAgIGV4cHJlc3Npb25GYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0Nyb3NzVmFsVmFsaWRhdGlvbigpCi0gICAgewotICAgICAgICBuZXcgQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcigpLmFmdGVyUGhhc2UobmV3IFBoYXNlRXZlbnQoKEZhY2VzQ29udGV4dClmYWNlc0NvbnRleHQsUGhhc2VJZC5BTllfUEhBU0UsbGlmZWN5Y2xlKSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrTWVzc2FnZUNvdW50KGludCBleHBlY3RlZCkKLSAgICB7Ci0gICAgICAgIGludCBhY3R1YWwgPSAwOwotICAgICAgICBmb3IoSXRlcmF0b3IgbWVzc2FnZXMgPSBmYWNlc0NvbnRleHQuZ2V0TWVzc2FnZXMoKTsgbWVzc2FnZXMuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgbWVzc2FnZXMubmV4dCgpOwotICAgICAgICAgICAgYWN0dWFsKys7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbXBsZXRlIG1lc3NhZ2UgY291bnQiLCBleHBlY3RlZCwgYWN0dWFsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja01lc3NhZ2VDb3VudChTdHJpbmcgY2xpZW50SWQsIGludCBleHBlY3RlZCkKLSAgICB7Ci0gICAgICAgIGludCBhY3R1YWwgPSAwOwotICAgICAgICBmb3IoSXRlcmF0b3IgbWVzc2FnZXMgPSBmYWNlc0NvbnRleHQuZ2V0TWVzc2FnZXMoY2xpZW50SWQpOyBtZXNzYWdlcy5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlcy5uZXh0KCk7Ci0gICAgICAgICAgICBhY3R1YWwrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydEVxdWFscygiQ29tcGxldGUgbWVzc2FnZSBjb3VudCIsIGV4cGVjdGVkLCBhY3R1YWwpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBWZXJpZnkgdGhlIGZvbGxvd2luZzoKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPmlkIGlzIG5vdCBudWxsPC9saT4KLSAgICAgKiA8bGk+UmVzcG9uc2UgaXMgY29tcGxldGU8L2xpPgotICAgICAqIDxsaT5SZXNwb25jZSBjb250YWlucyB0aGUgaWQ8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGlkIElEIHRvIHZlcmlmeQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydElkRXhpc3RzKFN0cmluZyBpZCkKLSAgICB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIklEIGlzIG5vdCBudWxsIiwgaWQpOwotICAgICAgICBhc3NlcnRUcnVlKCJSZXNwb25zZSBDb21wbGV0ZSIsIGZhY2VzQ29udGV4dC5nZXRSZXNwb25zZUNvbXBsZXRlKCkpOwotICAgICAgICBTdHJpbmcgb3V0cHV0ID0gd3JpdGVyLmdldFdyaXRlcigpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIkhhcyBvdXRwdXQiLCBvdXRwdXQpOwotICAgICAgICBhc3NlcnRUcnVlKCJDb250YWlucyBpZCAnIiArIGlkICsgIiciLCBvdXRwdXQuaW5kZXhPZihpZCkgIT0gLTEpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVZhbHVlQmluZGluZyhVSUlucHV0IHVpSW5wdXQsIFN0cmluZyBuYW1lLCBTdHJpbmcgZXhwcmVzc2lvbikKLSAgICB7Ci0gICAgICAgIFZhbHVlQmluZGluZyB2YWx1ZUJpbmRpbmcgPSBhcHBsaWNhdGlvbi5jcmVhdGVWYWx1ZUJpbmRpbmcoZXhwcmVzc2lvbik7Ci0gICAgICAgIFZhbHVlRXhwcmVzc2lvbiB2YWx1ZUV4cHJlc3Npb24gPSBleHByZXNzaW9uRmFjdG9yeS5jcmVhdGVWYWx1ZUV4cHJlc3Npb24oCi0gICAgICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RUxDb250ZXh0KCksIGV4cHJlc3Npb24sIE9iamVjdC5jbGFzcyk7Ci0KLSAgICAgICAgaWYodWlJbnB1dCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aUlucHV0LnNldFZhbHVlQmluZGluZyhuYW1lLCB2YWx1ZUJpbmRpbmcpOwotICAgICAgICAgICAgdWlJbnB1dC5zZXRWYWx1ZUV4cHJlc3Npb24obmFtZSwgdmFsdWVFeHByZXNzaW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKFN0cmluZyBuYW1lLCBPYmplY3QgaW5zdGFuY2UpCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcobnVsbCwgInZhbHVlIiwgIiN7IiArIG5hbWUgKyAifSIpOwotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dChuYW1lLCBpbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIDxUPiBUIHJlc29sdmVCZWFuKFN0cmluZyBuYW1lLCBDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVClFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4obmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2V2YWwvQmFzZVZhbFRlc3RCZWFuLmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9CYXNlVmFsVGVzdEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmODQ3Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9CYXNlVmFsVGVzdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2V2YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkRvdWJsZVJhbmdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOwotCi0vKioKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUKLSAqLwotcHVibGljIGNsYXNzIEJhc2VWYWxUZXN0QmVhbgotewotICAgIEBSZXF1aXJlZAotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgCi0gICAgQExlbmd0aChtaW5pbXVtPTIsbWF4aW11bT0zKQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWUxOwotICAgIAotICAgIEBQYXR0ZXJuKCJbQS1aXVthLXpdKyIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGF0dGVybk5hbWU7Ci0gICAgCi0gICAgQERvdWJsZVJhbmdlKG1pbmltdW09LTMwMGQpCi0gICAgcHJpdmF0ZSBEb3VibGUgZG91YmxlVmFsdWUxOwotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZTEoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5hbWUxOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUxKFN0cmluZyBuYW1lMSkKLSAgICB7Ci0gICAgICAgIHRoaXMubmFtZTEgPSBuYW1lMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhdHRlcm5OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwYXR0ZXJuTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuTmFtZShTdHJpbmcgcGF0dGVybk5hbWUpCi0gICAgewotICAgICAgICB0aGlzLnBhdHRlcm5OYW1lID0gcGF0dGVybk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIERvdWJsZSBnZXREb3VibGVWYWx1ZTEoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRvdWJsZVZhbHVlMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREb3VibGVWYWx1ZTEoRG91YmxlIGRvdWJsZVZhbHVlMSkKLSAgICB7Ci0gICAgICAgIHRoaXMuZG91YmxlVmFsdWUxID0gZG91YmxlVmFsdWUxOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNldmFsL0Jhc2VWYWxUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2V2YWwvQmFzZVZhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjOTZhMjQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2V2YWwvQmFzZVZhbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZXZhbDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LkFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUKLSAqLwotcHVibGljIGNsYXNzIEJhc2VWYWxUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlCi17Ci0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50ID0gbnVsbDsKLQotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7Ci0gICAgCi0gICAgQmFzZVZhbFRlc3RCZWFuIGJlYW4gPSBudWxsOwotCi0gICAgcHVibGljIEJhc2VWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgICAgICBpbnB1dENvbXBvbmVudCA9IG51bGw7Ci0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOwotICAgICAgICBiZWFuID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQmFzZVZhbFRlc3RDYXNlLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIGJlYW4gPSBuZXcgQmFzZVZhbFRlc3RCZWFuKCk7Ci0gICAgICAgIFZhbHVlQmluZGluZyB2YiA9IGFwcGxpY2F0aW9uLmNyZWF0ZVZhbHVlQmluZGluZygiI3t0ZXN0QmVhbn0iKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKS5wdXQoInRlc3RCZWFuIiwgYmVhbik7Ci0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7Ci0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsKLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOwotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOwotICAgICAgICBpbnB1dENvbXBvbmVudCA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7Ci0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQpOwotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRJZCgiaW5wdXQxIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgICAgICBpbnB1dENvbXBvbmVudCA9IG51bGw7Ci0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOwotICAgICAgICBiZWFuID0gbnVsbDsgICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lUmVxdWlyZWRGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lfSIpOwotCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsKLQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lMUxlbmdodE1heEZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWUxfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIxMjM0NSIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZTFMZW5naHRDb3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lMX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydFRydWUoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWUxTGVuZ2h0TWluRmFpbCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZTF9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIngiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXR0ZXJuTmFtZUZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnBhdHRlcm5OYW1lfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCJQZXRlcjEiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXR0ZXJuTmFtZUNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnBhdHRlcm5OYW1lfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCJQZXRlciIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOwotICAgIH0gICAgCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWVGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5kb3VibGVWYWx1ZTF9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIi0zMDEiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVZhbHVlQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4uZG91YmxlVmFsdWUxfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIyMDAiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMGQsIGlucHV0Q29tcG9uZW50LmdldFZhbHVlKCkpOwotICAgICAgICAKLSAgICAgICAgaW5wdXRDb21wb25lbnQudXBkYXRlTW9kZWwoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMGQsIGJlYW4uZ2V0RG91YmxlVmFsdWUxKCkpOwotICAgIH0gICAgCi19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0QmVhbi5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI2YjdjMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7Ci0KLS8qKgotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQotICovCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxUZXN0QmVhbgotewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkxOwotICAgIAotICAgIEBFcXVhbHMoInByb3BlcnR5MSIpICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MjsKLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MSgpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvcGVydHkxOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOwotICAgIH0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MigpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvcGVydHkyOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydHkyID0gcHJvcGVydHkyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RDYXNlLmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGU4MDg1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LkFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUKLSAqLwotcHVibGljIGNsYXNzIENyb3NzVmFsVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZQotewotCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOwotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQyID0gbnVsbDsKLSAgICAKLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOwotICAgIAotICAgIHB1YmxpYyBDcm9zc1ZhbFRlc3RDYXNlKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG51bGw7Ci0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKENyb3NzVmFsVGVzdENhc2UuY2xhc3MpOwotICAgIH0gICAgCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIENyb3NzVmFsVGVzdEJlYW4gYmVhbiA9IG5ldyBDcm9zc1ZhbFRlc3RCZWFuKCk7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhudWxsLCAidmFsdWUiLCAiI3t0ZXN0QmVhbn0iKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKS5wdXQoInRlc3RCZWFuIixiZWFuKTsKLSAgICAgICAgCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOwotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7Ci0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsKLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsgICAgICAgIAotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOwotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50MSk7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRJZCgiaW5wdXQxIik7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7Ci0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQyKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNDb3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOwotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxWYWxpZGF0aW9uKCk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOwotCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzRmFpbCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQ0Iik7Ci0gICAgICAgIAotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgCi0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsVmFsaWRhdGlvbigpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgyKTsKLQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvRUxDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YSBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9FTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjFmNjc4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9FTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QudXRpbC5NZXRob2RVdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRUxDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UgZXh0ZW5kcyBFTENyb3NzVmFsVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBFTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRUxDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0NCi0gICAgICAgIFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uKCk7DQotDQotICAgICAgICBjb25maWcuYWRkTWFwcGluZyhFcXVhbHMuY2xhc3MuZ2V0TmFtZSgpLCBNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsIGNvbmZpZyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHJldGVzdCB0aGlzIHRlc3QtY2FzZQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCByZXRlc3QgdGhpcyB0ZXN0LWNhc2UNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpOw0KLSAgICAgICAgYXNzZXJ0RmFsc2UoTWV0aG9kVXRpbHMuaXNNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIikpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCk7DQotICAgICAgICBhc3NlcnRUcnVlKE1ldGhvZFV0aWxzLmlzTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIpKTsNCi0gICAgICAgIC8vMXggZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkgYW5kIDF4IGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwNCi0gICAgICAgIGFzc2VydFRydWUoTWV0aG9kVXRpbHMuY2hlY2tNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIiwgMikpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9FTENyb3NzVmFsVGVzdENhc2UuamF2YSBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9FTENyb3NzVmFsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdkODk1Mi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvRUxDcm9zc1ZhbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5EYXRlVGltZUNvbnZlcnRlcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LkFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRUxDcm9zc1ZhbFRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UNCi17DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLQ0KLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgRUxDcm9zc1ZhbFRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRUxDcm9zc1ZhbFRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgICAgICBjcmVhdGVSZXF1ZXN0U2NvcGVkQmVhbigiYmVhbjEiLCBnZXRFbnRpdHlJbnN0YW5jZSgpKTsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJiZWFuMiIsIGdldEVudGl0eUluc3RhbmNlKCkpOw0KLQ0KLQ0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7DQotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7DQotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7DQotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOw0KLQ0KLSAgICAgICAgLy9pbnB1dDENCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0SWQoImlucHV0MSIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldENvbnZlcnRlcihuZXcgRGF0ZVRpbWVDb252ZXJ0ZXIoKSk7DQotICAgICAgICAoKERhdGVUaW1lQ29udmVydGVyKWlucHV0Q29tcG9uZW50MS5nZXRDb252ZXJ0ZXIoKSkuc2V0UGF0dGVybigiZGQuTU0ueXl5eSIpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDEpOw0KLQ0KLSAgICAgICAgLy9pbnB1dDINCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0SWQoImlucHV0MiIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldENvbnZlcnRlcihuZXcgRGF0ZVRpbWVDb252ZXJ0ZXIoKSk7DQotICAgICAgICAoKERhdGVUaW1lQ29udmVydGVyKWlucHV0Q29tcG9uZW50Mi5nZXRDb252ZXJ0ZXIoKSkuc2V0UGF0dGVybigiZGQuTU0ueXl5eSIpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTENyb3NzQ29tcG9uZW50VmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZUVMQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTIuMTIuMjAwOCIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRUxDcm9zc0NvbXBvbmVudFZhbGlkYXRpb25Vc2VDYXNlKFN0cmluZyB2YWx1ZUJlYW4xUHJvcGVydHkxLCBTdHJpbmcgdmFsdWVCZWFuMVByb3BlcnR5MiwgU3RyaW5nIHZhbHVlQmVhbjJQcm9wZXJ0eTEsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3tiZWFuMS5kYXRlMX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje2JlYW4yLmRhdGUyfSIpOw0KLQ0KLSAgICAgICAgLy9zZXQgbW9kZWwgdmFsdWVzDQotICAgICAgICByZXNvbHZlQmVhbigiYmVhbjEiLCBnZXRFbnRpdHlJbnN0YW5jZSgpLmdldENsYXNzKCkpLnNldERhdGUyKChEYXRlKWlucHV0Q29tcG9uZW50MS5nZXRDb252ZXJ0ZXIoKS5nZXRBc09iamVjdChmYWNlc0NvbnRleHQsIGlucHV0Q29tcG9uZW50MSwgdmFsdWVCZWFuMVByb3BlcnR5MikpOw0KLSAgICAgICAgcmVzb2x2ZUJlYW4oImJlYW4yIiwgZ2V0RW50aXR5SW5zdGFuY2UoKS5nZXRDbGFzcygpKS5zZXREYXRlMSgoRGF0ZSlpbnB1dENvbXBvbmVudDIuZ2V0Q29udmVydGVyKCkuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dENvbXBvbmVudDIsIHZhbHVlQmVhbjJQcm9wZXJ0eTEpKTsNCi0NCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVCZWFuMVByb3BlcnR5MSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVCZWFuMlByb3BlcnR5Mik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZUVMTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxMi4xMi4yMDA4Iik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKFN0cmluZyB2YWx1ZUJlYW4xUHJvcGVydHkxLCBTdHJpbmcgdmFsdWVCZWFuMVByb3BlcnR5MiwgU3RyaW5nIHZhbHVlQmVhbjJQcm9wZXJ0eTEsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3tiZWFuMS5kYXRlMX0iKTsNCi0NCi0gICAgICAgIC8vc2V0IG1vZGVsIHZhbHVlcw0KLSAgICAgICAgcmVzb2x2ZUJlYW4oImJlYW4xIiwgZ2V0RW50aXR5SW5zdGFuY2UoKS5nZXRDbGFzcygpKS5zZXREYXRlMigoRGF0ZSlpbnB1dENvbXBvbmVudDEuZ2V0Q29udmVydGVyKCkuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dENvbXBvbmVudDEsIHZhbHVlQmVhbjFQcm9wZXJ0eTIpKTsNCi0gICAgICAgIHJlc29sdmVCZWFuKCJiZWFuMiIsIGdldEVudGl0eUluc3RhbmNlKCkuZ2V0Q2xhc3MoKSkuc2V0RGF0ZTEoKERhdGUpaW5wdXRDb21wb25lbnQyLmdldENvbnZlcnRlcigpLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgaW5wdXRDb21wb25lbnQyLCB2YWx1ZUJlYW4yUHJvcGVydHkxKSk7DQotICAgICAgICByZXNvbHZlQmVhbigiYmVhbjIiLCBnZXRFbnRpdHlJbnN0YW5jZSgpLmdldENsYXNzKCkpLnNldERhdGUyKChEYXRlKWlucHV0Q29tcG9uZW50Mi5nZXRDb252ZXJ0ZXIoKS5nZXRBc09iamVjdChmYWNlc0NvbnRleHQsIGlucHV0Q29tcG9uZW50MiwgdmFsdWVCZWFuMlByb3BlcnR5MikpOw0KLQ0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSh2YWx1ZUJlYW4xUHJvcGVydHkxKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEVMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4gZ2V0RW50aXR5SW5zdGFuY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEVMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4oKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvRUxDcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE1ZjQ0Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvRUxDcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIEVMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4NCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERhdGUgREVGQVVMVF9EQVRFID0gbmV3IERhdGUoKTsNCi0NCi0gICAgQEVxdWFscygiI3tiZWFuMi5kYXRlMn0iKQ0KLSAgICBwcml2YXRlIERhdGUgZGF0ZTEgPSBERUZBVUxUX0RBVEU7DQotDQotICAgIHByaXZhdGUgRGF0ZSBkYXRlMiA9IERFRkFVTFRfREFURTsNCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGF0ZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZTEoRGF0ZSBkYXRlMSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5kYXRlMSA9IGRhdGUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldERhdGUyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRhdGUyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERhdGUyKERhdGUgZGF0ZTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGF0ZTIgPSBkYXRlMjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwNjVkOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QudXRpbC5NZXRob2RVdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZSBleHRlbmRzIExvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShMb2NhbFByb3BlcnR5Q3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotDQotICAgICAgICBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbigpOw0KLQ0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoRXF1YWxzLmNsYXNzLmdldE5hbWUoKSwgTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHLCBjb25maWcpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgcmV0ZXN0IHRoaXMgdGVzdC1jYXNlDQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHJldGVzdCB0aGlzIHRlc3QtY2FzZQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpOw0KLSAgICAgICAgYXNzZXJ0RmFsc2UoTWV0aG9kVXRpbHMuaXNNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIikpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShNZXRob2RVdGlscy5pc01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiKSk7DQotICAgICAgICAvLzF4IGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5IGFuZCAxeCBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsDQotICAgICAgICBhc3NlcnRUcnVlKE1ldGhvZFV0aWxzLmNoZWNrTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIsIDIpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UuamF2YSBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmYxM2FiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZSBleHRlbmRzIEVMQ3Jvc3NWYWxUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBFTENyb3NzVmFsVGVzdERhdGVCZWFuIGdldEVudGl0eUluc3RhbmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4oKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYTg5MDkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIExvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3REYXRlQmVhbiBleHRlbmRzIEVMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4NCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERhdGUgREVGQVVMVF9EQVRFID0gbmV3IERhdGUoKTsNCi0NCi0gICAgQEVxdWFscygiZGF0ZTIiKQ0KLSAgICBwcml2YXRlIERhdGUgZGF0ZTEgPSBERUZBVUxUX0RBVEU7DQotDQotICAgIHByaXZhdGUgRGF0ZSBkYXRlMiA9IERFRkFVTFRfREFURTsNCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGF0ZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZTEoRGF0ZSBkYXRlMSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5kYXRlMSA9IGRhdGUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldERhdGUyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRhdGUyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERhdGUyKERhdGUgZGF0ZTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGF0ZTIgPSBkYXRlMjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL01vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFmOTMzNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneS5FcXVhbHNTdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QudXRpbC5NZXRob2RVdGlsczsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEVxdWFsc1N0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIE1ldGhvZFV0aWxzLnNpZ25hbENsYXNzVXNlZChnZXRDbGFzcygpKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIE1ldGhvZFV0aWxzLnNpZ25hbE1ldGhvZENhbGxlZChnZXRDbGFzcygpLCAicmV2ZXJzZU1lc3NhZ2UiKTsNCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgTWV0aG9kVXRpbHMuc2lnbmFsTWV0aG9kQ2FsbGVkKGdldENsYXNzKCksICJyZXZlcnNlTWVzc2FnZSIpOw0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL01vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQxZjBmYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSBleHRlbmRzIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5DQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBjcmVhdGUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICAvL2ZvcmNlIGluaXQgc28gdGhhdCBldmVyeSB0ZXN0LWNhc2Ugc2V0dXAgbWV0aG9kIGNhbiBhZGQgYSBtb2NrIHZhbGlkYXRpb24gc3RyYXRlZ3kgdmlhIGV4dHZhbCBqYXZhLWFwaQ0KLSAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHRoaXMsUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKGdldENsYXNzKCksICJpbml0U3RhdGljTWFwcGluZ3MiKSk7DQotICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlKG1ldGFEYXRhS2V5KTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5M2I0Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QudXRpbC5NZXRob2RVdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFpbkNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZSBleHRlbmRzIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvcGVydHlDaGFpbkNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLQ0KLSAgICAgICAgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24oKTsNCi0NCi0gICAgICAgIGNvbmZpZy5hZGRNYXBwaW5nKEVxdWFscy5jbGFzcy5nZXROYW1lKCksIE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRywgY29uZmlnKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgcmV0ZXN0IHRoaXMgdGVzdC1jYXNlDQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHJldGVzdCB0aGlzIHRlc3QtY2FzZQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCk7DQotICAgICAgICBhc3NlcnRGYWxzZShNZXRob2RVdGlscy5pc01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKTsNCi0gICAgICAgIGFzc2VydFRydWUoTWV0aG9kVXRpbHMuaXNNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIikpOw0KLSAgICAgICAgLy8xeCBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeSBhbmQgMXggZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShNZXRob2RVdGlscy5jaGVja01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiLCAyKSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlLmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIxNmRjZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LkFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuRGF0ZVRpbWVDb252ZXJ0ZXI7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlDQotew0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0NCi0gICAgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJiZWFuMSIsIGdldEVudGl0eUluc3RhbmNlKCkpOw0KLQ0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7DQotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7DQotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7DQotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOw0KLQ0KLSAgICAgICAgLy9pbnB1dDENCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0SWQoImlucHV0MSIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldENvbnZlcnRlcihuZXcgRGF0ZVRpbWVDb252ZXJ0ZXIoKSk7DQotICAgICAgICAoKERhdGVUaW1lQ29udmVydGVyKWlucHV0Q29tcG9uZW50MS5nZXRDb252ZXJ0ZXIoKSkuc2V0UGF0dGVybigiZGQuTU0ueXl5eSIpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDEpOw0KLQ0KLSAgICAgICAgLy9pbnB1dDINCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0SWQoImlucHV0MiIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldENvbnZlcnRlcihuZXcgRGF0ZVRpbWVDb252ZXJ0ZXIoKSk7DQotICAgICAgICAoKERhdGVUaW1lQ29udmVydGVyKWlucHV0Q29tcG9uZW50Mi5nZXRDb252ZXJ0ZXIoKSkuc2V0UGF0dGVybigiZGQuTU0ueXl5eSIpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVQcm9wZXJ0eUNoYWluQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVQcm9wZXJ0eUNoYWluQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxMi4xMi4yMDA4Iik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgyKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVQcm9wZXJ0eUNoYWluQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uVXNlQ2FzZShTdHJpbmcgdmFsdWVCZWFuMVByb3BlcnR5MSwgU3RyaW5nIHZhbHVlQmVhbjJQcm9wZXJ0eTIpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje2JlYW4xLmRhdGUxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7YmVhbjEuc3ViQmVhbi5kYXRlMn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVCZWFuMVByb3BlcnR5MSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVCZWFuMlByb3BlcnR5Mik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZUVMTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZUVMTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTIuMTIuMjAwOCIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRUxNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uVXNlQ2FzZShTdHJpbmcgdmFsdWVCZWFuMVByb3BlcnR5MSwgU3RyaW5nIHZhbHVlQmVhbjJQcm9wZXJ0eTEpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje2JlYW4xLmRhdGUxfSIpOw0KLQ0KLSAgICAgICAgLy9zZXQgbW9kZWwgdmFsdWVzDQotICAgICAgICByZXNvbHZlQmVhbigiYmVhbjEiLCBnZXRFbnRpdHlJbnN0YW5jZSgpLmdldENsYXNzKCkpLmdldFN1YkJlYW4oKS5zZXREYXRlMigoRGF0ZSlpbnB1dENvbXBvbmVudDIuZ2V0Q29udmVydGVyKCkuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dENvbXBvbmVudDIsIHZhbHVlQmVhbjJQcm9wZXJ0eTEpKTsNCi0NCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVCZWFuMVByb3BlcnR5MSk7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4gZ2V0RW50aXR5SW5zdGFuY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbigpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YSBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMyMWYyNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVCZWFuDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlIERFRkFVTFRfREFURSA9IG5ldyBEYXRlKCk7DQotDQotICAgIEBFcXVhbHMoInN1YkJlYW4uZGF0ZTIiKQ0KLSAgICBwcml2YXRlIERhdGUgZGF0ZTEgPSBERUZBVUxUX0RBVEU7DQotDQotICAgIHByaXZhdGUgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuIHN1YkJlYW4gPSBuZXcgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuKCk7DQotDQotICAgIHB1YmxpYyBEYXRlIGdldERhdGUxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRhdGUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERhdGUxKERhdGUgZGF0ZTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGF0ZTEgPSBkYXRlMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuIGdldFN1YkJlYW4oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3ViQmVhbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdWJCZWFuKFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbiBzdWJCZWFuKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnN1YkJlYW4gPSBzdWJCZWFuOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4uamF2YSBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4NTNmYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZSBERUZBVUxUX0RBVEUgPSBuZXcgRGF0ZSgpOw0KLQ0KLSAgICBwcml2YXRlIERhdGUgZGF0ZTIgPSBERUZBVUxUX0RBVEU7DQotDQotICAgIHB1YmxpYyBEYXRlIGdldERhdGUyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRhdGUyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERhdGUyKERhdGUgZGF0ZTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGF0ZTIgPSBkYXRlMjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvblRlc3RDYXNlLmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvblRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0M2Y1Y2QuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb25UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotcHVibGljIGNsYXNzIFZhbHVlQmluZGluZ0V4cHJlc3Npb25UZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvblRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YW5kYXJkU3ludGF4KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMS5wcm9wZXJ0eTF9Iik7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCksICJwcm9wZXJ0eTEiKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsncHJvcGVydHkxJ119Iik7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xWydwcm9wZXJ0eTEnXX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCksICJwcm9wZXJ0eTEiKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsnYmVhbjInXS5wcm9wZXJ0eTF9Iik7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xWydiZWFuMiddLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMVsnYmVhbjInXX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSwgInByb3BlcnR5MSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFyZFN5bnRheFJlcGxhY2VQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjEucHJvcGVydHkxfSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sICJwcm9wZXJ0eTIiKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjEucHJvcGVydHkyfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSwgInByb3BlcnR5MiIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydwcm9wZXJ0eTEnXX0iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2VQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAicHJvcGVydHkyIik7DQotDQotICAgICAgICAvL1RPRE8gcmVzdG9yZSBvcmlnaW5hbCBzeW50YXgNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjEucHJvcGVydHkyfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSwgInByb3BlcnR5MiIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydiZWFuMiddLnByb3BlcnR5MX0iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2VQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAicHJvcGVydHkyIik7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xWydiZWFuMiddLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMVsnYmVhbjInXX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSwgInByb3BlcnR5MiIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFyZFN5bnRheEFkZFByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMS5iZWFuMn0iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sICJwcm9wZXJ0eTEiKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjEuYmVhbjIucHJvcGVydHkxfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xLmJlYW4yfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSwgInByb3BlcnR5MSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydiZWFuMiddfSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24uYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgInByb3BlcnR5MSIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMVsnYmVhbjInXS5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjFbJ2JlYW4yJ119Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLCAicHJvcGVydHkxIik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjFbJ2JlYW4yJ10uYmVhbjN9Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5hZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAicHJvcGVydHkxIik7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xWydiZWFuMiddLmJlYW4zLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMVsnYmVhbjInXS5iZWFuM30iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgIC5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMVsnYmVhbjInXX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCksICJwcm9wZXJ0eTEiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFjZWxldHNDdXN0b21Db21wb25lbnRTeW50YXgoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2VudGl0eVtmaWVsZE5hbWVdfSIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tlbnRpdHlbZmllbGROYW1lXX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tlbnRpdHl9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLCAiZmllbGROYW1lIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhY2VsZXRzQ3VzdG9tQ29tcG9uZW50U3ludGF4UmVwbGFjZVByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tlbnRpdHlbZmllbGROYW1lXX0iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2VQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAibmV3RmllbGROYW1lIik7DQotDQotICAgICAgICAvL1RPRE8gcmVzdG9yZSBvcmlnaW5hbCBzeW50YXgNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7ZW50aXR5Lm5ld0ZpZWxkTmFtZX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tlbnRpdHl9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLCAibmV3RmllbGROYW1lIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBsZXhNYXBTeW50YXgoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbg0KLSAgICAgICAgICAgICAgICA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xW2JlYW4yW2JlYW4zWydrZXkxJ11dXS5wcm9wZXJ0eTF9Iik7DQotDQotICAgICAgICAvL1RPRE8NCi0gICAgICAgIC8vYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMVtiZWFuMltiZWFuM1sna2V5MSddXV0ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSwgInByb3BlcnR5MSIpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9tb2NrL0V4dFZhbE1vY2tBcHBsaWNhdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1Y2JjZDAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5tb2NrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0FwcGxpY2F0aW9uOwotCi1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0TGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguZWwuRUxSZXNvbHZlcjsKLWltcG9ydCBqYXZheC5lbC5FeHByZXNzaW9uRmFjdG9yeTsKLWltcG9ydCBqYXZheC5lbC5FTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqLwotcHVibGljIGNsYXNzIEV4dFZhbE1vY2tBcHBsaWNhdGlvbiBleHRlbmRzIE1vY2tBcHBsaWNhdGlvbgotewotICAgIHByaXZhdGUgQXBwbGljYXRpb24gd3JhcHBlZDsKLQotICAgIHB1YmxpYyBFeHRWYWxNb2NrQXBwbGljYXRpb24oKQotICAgIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXh0VmFsTW9ja0FwcGxpY2F0aW9uKEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKQotICAgIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gYXBwbGljYXRpb247Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVMQ29udGV4dExpc3RlbmVyW10gZ2V0RUxDb250ZXh0TGlzdGVuZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRUxDb250ZXh0TGlzdGVuZXJbMF07Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVMUmVzb2x2ZXIgZ2V0RUxSZXNvbHZlcigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkLmdldEVMUmVzb2x2ZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRXhwcmVzc2lvbkZhY3RvcnkgZ2V0RXhwcmVzc2lvbkZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxNb2NrRXhwcmVzc2lvbkZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGV2YWx1YXRlRXhwcmVzc2lvbkdldChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgZXhwcmVzc2lvbiwgQ2xhc3MgYUNsYXNzKSB0aHJvd3MgRUxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmV2YWx1YXRlRXhwcmVzc2lvbkdldChmYWNlc0NvbnRleHQsIGV4cHJlc3Npb24sIGFDbGFzcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzhjNTc2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9tb2NrL0V4dFZhbE1vY2tBcHBsaWNhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0Lm1vY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb25GYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRWYWxNb2NrQXBwbGljYXRpb25GYWN0b3J5IGV4dGVuZHMgTW9ja0FwcGxpY2F0aW9uRmFjdG9yeQotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBcHBsaWNhdGlvbiBnZXRBcHBsaWNhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEV4dFZhbE1vY2tBcHBsaWNhdGlvbihzdXBlci5nZXRBcHBsaWNhdGlvbigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvbW9jay9FeHRWYWxNb2NrRXhwcmVzc2lvbkZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9tb2NrL0V4dFZhbE1vY2tFeHByZXNzaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTllMjMzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9tb2NrL0V4dFZhbE1vY2tFeHByZXNzaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QubW9jazsKLQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5lbC5Nb2NrRXhwcmVzc2lvbkZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5lbC5FTENvbnRleHQ7Ci1pbXBvcnQgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICovCi1wdWJsaWMgY2xhc3MgRXh0VmFsTW9ja0V4cHJlc3Npb25GYWN0b3J5IGV4dGVuZHMgTW9ja0V4cHJlc3Npb25GYWN0b3J5Ci17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZhbHVlRXhwcmVzc2lvbiBjcmVhdGVWYWx1ZUV4cHJlc3Npb24oRUxDb250ZXh0IGNvbnRleHQsIFN0cmluZyBleHByZXNzaW9uLCBDbGFzcyBleHBlY3RlZFR5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEV4dFZhbE1vY2tWYWx1ZUV4cHJlc3Npb24oZXhwcmVzc2lvbiwgZXhwZWN0ZWRUeXBlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvbW9jay9FeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uLmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvbW9jay9FeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiY2MwOGEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L21vY2svRXh0VmFsTW9ja1ZhbHVlRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0Lm1vY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5FeHRWYWxFTFJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5lbC5Nb2NrVmFsdWVFeHByZXNzaW9uOwotCi1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0OwotaW1wb3J0IGphdmF4LmVsLkVMUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKi8KLS8vVE9ETyBpbXByb3ZlCi1wdWJsaWMgY2xhc3MgRXh0VmFsTW9ja1ZhbHVlRXhwcmVzc2lvbiBleHRlbmRzIE1vY2tWYWx1ZUV4cHJlc3Npb24KLXsKLSAgICBwcml2YXRlIFN0cmluZ1tdIGVsZW1lbnRzID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBleHByZXNzaW9uID0gbnVsbDsKLQotICAgIHB1YmxpYyBFeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uKFN0cmluZyBleHByZXNzaW9uLCBDbGFzcyBleHBlY3RlZFR5cGUpCi0gICAgewotICAgICAgICBzdXBlcihleHByZXNzaW9uLCBleHBlY3RlZFR5cGUpOwotCi0gICAgICAgIGlmIChleHByZXNzaW9uID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiRXhwcmVzc2lvbiBzdHJpbmcgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247Ci0gICAgICAgIHBhcnNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShFTENvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIEVMUmVzb2x2ZXIgcmVzb2x2ZXIgPSBjb250ZXh0LmdldEVMUmVzb2x2ZXIoKTsKLQotICAgICAgICBpZiAocmVzb2x2ZXIgaW5zdGFuY2VvZiBFeHRWYWxFTFJlc29sdmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QmFzZShjb250ZXh0LCByZXNvbHZlcik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VmFsdWUoY29udGV4dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoRUxDb250ZXh0IGNvbnRleHQsIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmIChjb250ZXh0LmdldEVMUmVzb2x2ZXIoKSBpbnN0YW5jZW9mIEV4dFZhbEVMUmVzb2x2ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRleHQuZ2V0RUxSZXNvbHZlcigpLnNldFZhbHVlKGNvbnRleHQsIGdldFZhbHVlKGNvbnRleHQpLCBlbGVtZW50c1tlbGVtZW50cy5sZW5ndGggLSAxXSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgYmFzZSA9IGdldEJhc2UoY29udGV4dCwgY29udGV4dC5nZXRFTFJlc29sdmVyKCkpOwotICAgICAgICAgICAgU3RyaW5nIHNldHRlciA9ICJzZXQiICsgY3JlYXRlUHJvcGVydHlTdHJpbmcoKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTWV0aG9kIHNldHRlck1ldGhvZCA9IGJhc2UuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZChzZXR0ZXIsIHZhbHVlICE9IG51bGwgPyB2YWx1ZS5nZXRDbGFzcygpIDogT2JqZWN0LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBzZXR0ZXJNZXRob2QuaW52b2tlKGJhc2UsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZShFTENvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IGJhc2UgPSBnZXRCYXNlKGNvbnRleHQsIGNvbnRleHQuZ2V0RUxSZXNvbHZlcigpKTsKLQotICAgICAgICBpZiAoYmFzZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBnZXR0ZXIgPSAiZ2V0IiArIGNyZWF0ZVByb3BlcnR5U3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1ldGhvZCBnZXR0ZXJNZXRob2QgPSBiYXNlLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2QoZ2V0dGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0dGVyTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGFyc2UoKQotICAgIHsKLQotICAgICAgICBpZiAoaXNMaXRlcmFsVGV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbGVtZW50cyA9IG5ldyBTdHJpbmdbMF07Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXhwcmVzc2lvbi5zdGFydHNXaXRoKCIkeyIpIHx8IGV4cHJlc3Npb24uc3RhcnRzV2l0aCgiI3siKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24uZW5kc1dpdGgoIn0iKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBleHByID0gbmV3IFN0cmluZ0J1ZmZlcihleHByZXNzaW9uLnN1YnN0cmluZygyLCBleHByZXNzaW9uLmxlbmd0aCgpIC0gMSkucmVwbGFjZUFsbCgiICIsICIiKSk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Jsb2NrT24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gZXhwci5sZW5ndGgoKSAtIDE7IGkgPiAtMTsgaS0tKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4cHIuY2hhckF0KGkpID09ICcgJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhwci5kZWxldGVDaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhwci5jaGFyQXQoaSkgPT0gJ10nKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHByLmRlbGV0ZUNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHByLmNoYXJBdChpKSA9PSAnWycpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZGVsZXRlQ2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4cHIuY2hhckF0KGkpID09ICdcJycpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNCbG9ja09uKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZGVsZXRlQ2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZCgwLCBleHByLnN1YnN0cmluZyhpICsgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZGVsZXRlKGksIGV4cHIubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaXNCbG9ja09uID0gIWlzQmxvY2tPbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHByLmNoYXJBdChpKSA9PSAnLicgJiYgIWlzQmxvY2tPbikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMuYWRkKDAsIGV4cHIuc3Vic3RyaW5nKGkgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHByLmRlbGV0ZShpLCBleHByLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZXhwci5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuYW1lcy5hZGQoMCwgZXhwci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlbGVtZW50cyA9IChTdHJpbmdbXSkgbmFtZXMudG9BcnJheShuZXcgU3RyaW5nW25hbWVzLnNpemUoKV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXhwcmVzc2lvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV4cHJlc3Npb24pOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJhc2UoRUxDb250ZXh0IGNvbnRleHQsIEVMUmVzb2x2ZXIgcmVzb2x2ZXIpCi0gICAgewotICAgICAgICBPYmplY3QgYmFzZSA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoIC0gMTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBiYXNlID0gcmVzb2x2ZXIuZ2V0VmFsdWUoY29udGV4dCwgYmFzZSwgZWxlbWVudHNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiYXNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVByb3BlcnR5U3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdOwotICAgICAgICByZXR1cm4gcHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSwgcHJvcGVydHkubGVuZ3RoKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC91dGlsL01ldGhvZFV0aWxzLmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdXRpbC9NZXRob2RVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDY5ZmM3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC91dGlsL01ldGhvZFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC51dGlsOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi0vL1RPRE8NCi1wdWJsaWMgY2xhc3MgTWV0aG9kVXRpbHMNCi17DQotICAgIHByaXZhdGUgTWV0aG9kVXRpbHMoKQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrTWV0aG9kQ2FsbGVkKENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIGludCBjYWxsQ291bnQpDQotICAgIHsNCi0gICAgICAgIGNoZWNrUmVxdWlyZWRDbGFzcyh1c2VkQ2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGNhbGxDb3VudCA9PSBnZXRNZXRob2RDYWxsQ291bnQodXNlZENsYXNzLCBtZXRob2ROYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZXRob2RDYWxsZWQoQ2xhc3MgdXNlZENsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkNCi0gICAgew0KLSAgICAgICAgY2hlY2tSZXF1aXJlZENsYXNzKHVzZWRDbGFzcyk7DQotDQotICAgICAgICByZXR1cm4gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKQ0KLSAgICAgICAgICAgICAgICAuY29udGFpbnNLZXkodXNlZENsYXNzLmdldE5hbWUoKSArICIjIiArIG1ldGhvZE5hbWUpOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaWduYWxNZXRob2RDYWxsZWQoQ2xhc3MgdXNlZENsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkNCi0gICAgew0KLSAgICAgICAgTWFwIHJlcXVlc3RNYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpOw0KLQ0KLSAgICAgICAgaW50IG1ldGhvZENhbGxDb3VudCA9IDA7DQotICAgICAgICBTdHJpbmcga2V5ID0gdXNlZENsYXNzLmdldE5hbWUoKSArICIjIiArIG1ldGhvZE5hbWU7DQotDQotICAgICAgICBpZihyZXF1ZXN0TWFwLmNvbnRhaW5zS2V5KGtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0aG9kQ2FsbENvdW50ID0gKEludGVnZXIpcmVxdWVzdE1hcC5nZXQoa2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJlcXVlc3RNYXAucHV0KGtleSwgKyttZXRob2RDYWxsQ291bnQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRNZXRob2RDYWxsQ291bnQoQ2xhc3MgdXNlZENsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkNCi0gICAgew0KLSAgICAgICAgTWFwIHJlcXVlc3RNYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGtleSA9IHVzZWRDbGFzcy5nZXROYW1lKCkgKyAiIyIgKyBtZXRob2ROYW1lOw0KLQ0KLSAgICAgICAgaWYocmVxdWVzdE1hcC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoSW50ZWdlcilyZXF1ZXN0TWFwLmdldChrZXkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNpZ25hbENsYXNzVXNlZChDbGFzcyBtb2NrQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkNCi0gICAgICAgICAgICAgICAgLnB1dChtb2NrQ2xhc3MuZ2V0TmFtZSgpICsgIjp1c2VkIiwgdHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2xhc3NVc2VkKENsYXNzIG1vY2tDbGFzcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkNCi0gICAgICAgICAgICAgICAgLmNvbnRhaW5zS2V5KG1vY2tDbGFzcy5nZXROYW1lKCkgKyAiOnVzZWQiKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrUmVxdWlyZWRDbGFzcyhDbGFzcyB1c2VkQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNDbGFzc1VzZWQodXNlZENsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHVzZWRDbGFzcy5nZXROYW1lKCkgKyAiIG5vdCB1c2VkIik7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3V0aWwvVGVzdFV0aWxzLmphdmEgYi9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdXRpbC9UZXN0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlZDE2MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdXRpbC9UZXN0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY2VzRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVGVzdFV0aWxzCi17Ci0gICAgLyoqIERlZmF1bHQgTG9nZ2VyICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFRlc3RVdGlscy5jbGFzcyk7Ci0KLSAgICAvKiogdXRpbGl0eSBjbGFzcywgZG8gbm90IGluc3RhbnRpYXRlICovCi0gICAgcHJpdmF0ZSBUZXN0VXRpbHMoKQotICAgIHsKLSAgICAgICAgLy8gdXRpbGl0eSBjbGFzcywgZGlzYWJsZSBpbnN0YW50aWF0aW9uCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGREZWZhdWx0VmFsaWRhdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQotICAgIHsKLSAgICAgICAgYWRkVmFsaWRhdG9yKGZhY2VzQ29udGV4dCwiamF2YXguZmFjZXMuRG91YmxlUmFuZ2UiLCAiamF2YXguZmFjZXMudmFsaWRhdG9yLkRvdWJsZVJhbmdlVmFsaWRhdG9yIik7Ci0gICAgICAgIGFkZFZhbGlkYXRvcihmYWNlc0NvbnRleHQsImphdmF4LmZhY2VzLkxlbmd0aCIsICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yIik7Ci0gICAgICAgIGFkZFZhbGlkYXRvcihmYWNlc0NvbnRleHQsImphdmF4LmZhY2VzLkxvbmdSYW5nZSIsICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTG9uZ1JhbmdlVmFsaWRhdG9yIik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRWYWxpZGF0b3IoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0b3JJZCwgU3RyaW5nIHZhbGlkYXRvckNsYXNzKQotICAgIHsKLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuYWRkVmFsaWRhdG9yKHZhbGlkYXRvcklkLCB2YWxpZGF0b3JDbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGFsbCBvZiBKU0YgMS4yIGRlZmF1bHQgcmVuZGVyZXJzLiAgQ3VycmVudGx5IHRoaXMgaXMgbm90IHRpZWQgdG8gCi0gICAgICogZmFjZXMtY29uZmlnLnhtbCwgc28gYWxsIGNoYW5nZSB0byB0aGUgZmlsZSBNVVNUIGFsc28gYmUgbWFkZSBoZXJlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQKLSAgICAgKiBAdG9kbyBEbyBub3QgYWRkIHJlbmRlcmVyIGlmIHJlbmRlcmVyIGlzIGFscmVhZHkgYWRkZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZERlZmF1bHRSZW5kZXJlcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vIFN0YW5kYXJkIEhUTUwgUmVuZGVyZXJzCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkNvbW1hbmQiLCAiamF2YXguZmFjZXMuQnV0dG9uIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxCdXR0b25SZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdEJvb2xlYW4iLAotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5DaGVja2JveCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sQ2hlY2tib3hSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE1hbnkiLAotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5DaGVja2JveCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sQ2hlY2tib3hSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkZvcm0iLCAiamF2YXguZmFjZXMuRm9ybSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sRm9ybVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuUGFuZWwiLCAiamF2YXguZmFjZXMuR3JpZCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sR3JpZFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuUGFuZWwiLCAiamF2YXguZmFjZXMuR3JvdXAiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEdyb3VwUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5IaWRkZW4iLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEhpZGRlblJlbmRlcmVyIik7Ci0gICAgICAgIAotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5HcmFwaGljIiwgImphdmF4LmZhY2VzLkltYWdlIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxJbWFnZVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuT3V0cHV0IiwgImphdmF4LmZhY2VzLkxhYmVsIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMYWJlbFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuT3V0cHV0IiwgImphdmF4LmZhY2VzLkxpbmsiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbExpbmtSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkNvbW1hbmQiLCAiamF2YXguZmFjZXMuTGluayIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlua1JlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0T25lIiwKLSAgICAgICAgICAgICAgICAiamF2YXguZmFjZXMuTGlzdGJveCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlzdGJveFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0TWFueSIsCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkxpc3Rib3giLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbExpc3Rib3hSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsICJqYXZheC5mYWNlcy5NZW51IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxNZW51UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RNYW55IiwgImphdmF4LmZhY2VzLk1lbnUiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lbnVSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk1lc3NhZ2UiLCAiamF2YXguZmFjZXMuTWVzc2FnZSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTWVzc2FnZVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuT3V0cHV0IiwgImphdmF4LmZhY2VzLkZvcm1hdCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sRm9ybWF0UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5NZXNzYWdlcyIsCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLk1lc3NhZ2VzIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxNZXNzYWdlc1JlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0T25lIiwgImphdmF4LmZhY2VzLlJhZGlvIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxSYWRpb1JlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuSW5wdXQiLCAiamF2YXguZmFjZXMuU2VjcmV0IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxTZWNyZXRSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkRhdGEiLCAiamF2YXguZmFjZXMuVGFibGUiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFRhYmxlUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5UZXh0YXJlYSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGV4dGFyZWFSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLklucHV0IiwgImphdmF4LmZhY2VzLlRleHQiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFRleHRSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5UZXh0IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxUZXh0UmVuZGVyZXIiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSByZW5kZXJlciB0byB0aGUgRmFjZXNDb250ZXh0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgRmFjZXMgQ29udGV4dAotICAgICAqIEBwYXJhbSBmYW1pbHkgQ29tcG9uZW5ldCBGYW1pbHkKLSAgICAgKiBAcGFyYW0gcmVuZGVyZXJUeXBlIENvbXBvbmVudCBUeXBlCi0gICAgICogQHBhcmFtIHJlbmRlckNsYXNzTmFtZSBDbGFzcyBOYW1lIG9mIFJlbmRlcmVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFJlbmRlcmVyKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBmYW1pbHksCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGVyZXJUeXBlLCBTdHJpbmcgcmVuZGVyQ2xhc3NOYW1lKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSAoamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyKSBuZXdJbnN0YW5jZShyZW5kZXJDbGFzc05hbWUpOwotICAgICAgICBSZW5kZXJLaXQga2l0ID0gZmFjZXNDb250ZXh0LmdldFJlbmRlcktpdCgpOwotICAgICAgICBraXQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIHJlbmRlcmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmllcyBhIENsYXNzLmxvYWRDbGFzcyB3aXRoIHRoZSBjb250ZXh0IGNsYXNzIGxvYWRlciBvZiB0aGUgY3VycmVudCB0aHJlYWQgZmlyc3QgYW5kCi0gICAgICogYXV0b21hdGljYWxseSBmYWxscyBiYWNrIHRvIHRoZSBDbGFzc1V0aWxzIGNsYXNzIGxvYWRlciAoaS5lLiB0aGUgbG9hZGVyIG9mIHRoZQotICAgICAqIG15ZmFjZXMuamFyIGxpYikgaWYgbmVjZXNzYXJ5LgotICAgICAqIAotICAgICAqIE5vdGU6IFRoaXMgd2FzIGNvcGllZCBmcm9tIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWQudXRpbC5DbGFzc1V0aWxzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHlwZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIG5vbi1wcmltaXRpdmUgbm9uLWFycmF5IGNsYXNzCi0gICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBDbGFzcwotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdHlwZSBpcyBudWxsCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgY2xhc3NGb3JOYW1lKFN0cmluZyB0eXBlKQotICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInR5cGUiKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRyeSBXZWJBcHAgQ2xhc3NMb2FkZXIgZmlyc3QKLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKHR5cGUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXAKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWdub3JlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBmYWxsYmFjazogVHJ5IENsYXNzTG9hZGVyIGZvciBDbGFzc1V0aWxzIChpLmUuIHRoZSBteWZhY2VzLmphciBsaWIpCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZSh0eXBlLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwCi0gICAgICAgICAgICAgICAgICAgIFRlc3RVdGlscy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhbWUgYXMge0BsaW5rICNjbGFzc0Zvck5hbWUoU3RyaW5nKX0sIGJ1dCB0aHJvd3MgYSBSdW50aW1lRXhjZXB0aW9uCi0gICAgICogKEZhY2VzRXhjZXB0aW9uKSBpbnN0ZWFkIG9mIGEgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIE5vdGU6IFRoaXMgd2FzIGNvcGllZCBmcm9tIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWQudXRpbC5DbGFzc1V0aWxzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIENsYXNzCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0eXBlIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIEZhY2VzRXhjZXB0aW9uIGlmIGNsYXNzIG5vdCBmb3VuZAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIHNpbXBsZUNsYXNzRm9yTmFtZShTdHJpbmcgdHlwZSkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY2xhc3NGb3JOYW1lKHR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ2xhc3MgIiArIHR5cGUgKyAiIG5vdCBmb3VuZCIsIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyB3aXRoIHRoZSB0eXBlIG9mIDxjb2RlPnR5cGU8L2NvZGU+LgotICAgICAqIAotICAgICAqIE5vdGU6IFRoaXMgd2FzIGNvcGllZCBmcm9tIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWQudXRpbC5DbGFzc1V0aWxzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHlwZSBUeXBlIG9mIG5ldyBjbGFzcy4KLSAgICAgKiBAcmV0dXJuIEluc3RhbmNlIG9mIHRoZSBjbGFzcyA8Y29kZT50eXBlPC9jb2RlPgotICAgICAqIEB0aHJvd3MgRmFjZXNFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIHR5cGUpIHRocm93cyBGYWNlc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2Uoc2ltcGxlQ2xhc3NGb3JOYW1lKHR5cGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIDxjb2RlPmNsYXp6PC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBOb3RlOiBUaGlzIHdhcyBjb3BpZWQgZnJvbSBvcmcuYXBhY2hlLm15ZmFjZXMuc2hhcmVkLnV0aWwuQ2xhc3NVdGlscwotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXp6IENsYXNzIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZi4KLSAgICAgKiBAcmV0dXJuIEluc3RhbmNlIG9mIHRoZSBjbGFzcyA8Y29kZT5jbGF6ejwvY29kZT4KLSAgICAgKiBAdGhyb3dzIEZhY2VzRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKENsYXNzIGNsYXp6KSB0aHJvd3MgRmFjZXNFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY2xhenoubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nLmVycm9yKCJDbGFzcyA6ICIgKyBjbGF6ei5nZXROYW1lKCkgKyAiIG5vdCBmb3VuZC4iLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBGYWNlc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW5kZXJlcmVkIGEgY29tcG9uZW50LCBpbmNsdWRpbmcgaXQncyBjaGlsZHJlbiwgdGhlbiBjb21wbGV0ZSB0aGUgcmVwb25zZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGV4dCBGYWNlcyBDb250ZXh0Ci0gICAgICogQHBhcmFtIGNvbXBvbmVudCBDb21wb25lbnQgdG8gYmUgcmVuZGVyZWQuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gd2hpbGUgcmVuZGVyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW5kZXJDb21wb25lbnQoRmFjZXNDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICBVSUNvbXBvbmVudCBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSBjb250ZXh0LmdldFJlbmRlcktpdCgpLmdldFJlbmRlcmVyKAotICAgICAgICAgICAgICAgIGNvbXBvbmVudC5nZXRGYW1pbHkoKSwgY29tcG9uZW50LmdldFJlbmRlcmVyVHlwZSgpKTsKLSAgICAgICAgcmVuZGVyZXIuZW5jb2RlQmVnaW4oY29udGV4dCwgY29tcG9uZW50KTsKLSAgICAgICAgcmVuZGVyZXIuZW5jb2RlQ2hpbGRyZW4oY29udGV4dCwgY29tcG9uZW50KTsKLSAgICAgICAgcmVuZGVyZXIuZW5jb2RlRW5kKGNvbnRleHQsIGNvbXBvbmVudCk7Ci0gICAgICAgIGNvbnRleHQucmVzcG9uc2VDb21wbGV0ZSgpOwotICAgICAgICBjb250ZXh0LnJlbmRlclJlc3BvbnNlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvYXNzZW1ibHkvcG9tLnhtbCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2Fzc2VtYmx5L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNjQ3ZTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvYXNzZW1ibHkvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1hc3NlbWJseTEyPC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQXNzZW1ibHk8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPk15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQXNzZW1ibHkgaXMgdXNlZCB0byBnZW5lcmF0ZSAKLSAgICAuemlwIGFuZCAudGFyLmd6IGRpc3RyaWJ1dGlvbnMgPC9kZXNjcmlwdGlvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2Fzc2VtYmx5PC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvYXNzZW1ibHk8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2Fzc2VtYmx5PC91cmw+Ci0gICAgPC9zY20+Ci0gICAgCi0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZGVwZW5kZW5jeS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1qYXZhZG9jPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y29yZS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+amF2YWRvYzwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2phdmFkb2M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1zb3VyY2U8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjb3JlLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc3JjPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS0gRVhFQ1VURSBtdm4gcGFja2FnZSB0byBnZW5lcmF0ZSBhc3NlbWJseSBmaWxlcyAtLT4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9zcmM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9jb3Jlc3JjLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwxMi0ke3ZlcnNpb259LXNyYzwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L291dDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmF0dGFjaGVkPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9iaW48L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj4ke2Jhc2VkaXJ9L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmViaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5teWZhY2VzLWV4dHZhbDEyLSR7dmVyc2lvbn0tYmluPC9maW5hbE5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXR0YWNoZWQ8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtjb3JlLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8IS0tIFNpbmNlIGV4dHZhbCBjb3VsZCBiZSBhc3luYyByZWxlYXNlZCwgYW4gZ2VuZXJhdGVkIGFzc2VtYmx5IGNvdWxkIGNvbnRhaW4gZGlmZmVyZW50Ci0gICAgICAgICBhcnRpZmFjdCB2ZXJzaW9ucyAtLT4KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGNvcmUudmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvY29yZS52ZXJzaW9uPgotICAgICAgICA8dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC90cmluaWRhZC1zdXBwb3J0LnZlcnNpb24+Ci0gICAgICAgIDxnZW5lcmljLXN1cHBvcnQudmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvZ2VuZXJpYy1zdXBwb3J0LnZlcnNpb24+Ci0gICAgICAgIDxwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmViaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjY3OTViLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmViaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+Y29yZWJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgIAk8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgIAk8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5SRUFETUUqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5MSUNFTlNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+Tk9USUNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+UkVMRUFTRSo8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L2phdmFkb2M8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+amF2YWRvYzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLmphcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMTg2YzYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08YXNzZW1ibHk+Ci0gIDxpZD5jb3Jlc3JjPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+ICAKLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgIAk8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgIAk8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5SRUFETUUqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5MSUNFTlNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+Tk9USUNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+UkVMRUFTRSo8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4gICAKLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3NyYzwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5zcmM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+Ci0gCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNWIzYTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDliZGIxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcgotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYWY2MGYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZTwvbmFtZT4NCi0gICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5jZ2xpYjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZ2xpYjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjFfMzwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cmVzb3VyY2VzPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICA8L3Jlc291cmNlcz4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDYzZTYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+DQotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMuc3RhcnR1cC5HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyDQotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJLaXQuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYjU1OGEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcktpdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi0NCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZEludGVyY2VwdG9yOw0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuRW5oYW5jZXI7DQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RQcm94eTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxHZW5lcmljUmVuZGVyS2l0IGV4dGVuZHMgRXh0VmFsUmVuZGVyS2l0IGltcGxlbWVudHMgTWV0aG9kSW50ZXJjZXB0b3INCi17DQotICAgIHB1YmxpYyBzdGF0aWMgUmVuZGVyS2l0IG5ld0luc3RhbmNlKFJlbmRlcktpdCByZW5kZXJLaXQpDQotICAgIHsNCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IHJlbmRlcktpdC5nZXRDbGFzcygpOw0KLQ0KLSAgICAgICAgLy9pdCdzIG5vdCBwb3NzaWJsZSB0byB3cmFwIHRoZSBjb252ZXJ0ZXIgYWdhaW4gLSBvY2N1cnMgZS5nLiB1bmRlciBzb2xhcmlzICsgYmVhIHdlYmxvZ2ljDQotICAgICAgICBpZiAoY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRFbmhhbmNlckJ5Q0dMSUIkJCIpDQotICAgICAgICAgICAgfHwgY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRGYXN0Q2xhc3NCeUNHTElCJCQiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRW5oYW5jZXIgZW5oYW5jZXIgPSBuZXcgRW5oYW5jZXIoKTsNCi0gICAgICAgIGVuaGFuY2VyLnNldFN1cGVyY2xhc3MocmVuZGVyS2l0LmdldENsYXNzKCkpOw0KLSAgICAgICAgZW5oYW5jZXIuc2V0Q2FsbGJhY2sobmV3IEV4dFZhbEdlbmVyaWNSZW5kZXJLaXQocmVuZGVyS2l0KSk7DQotDQotICAgICAgICByZXR1cm4gKFJlbmRlcktpdCkgZW5oYW5jZXIuY3JlYXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBpbnRlcmNlcHQoT2JqZWN0IG9iaiwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncywgTWV0aG9kUHJveHkgcHJveHkpIHRocm93cyBUaHJvd2FibGUNCi0gICAgew0KLSAgICAgICAgaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldFJlbmRlcmVyIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFJlbmRlcmVyKChTdHJpbmcpYXJnc1swXSwgKFN0cmluZylhcmdzWzFdKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImFkZFJlbmRlcmVyIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkUmVuZGVyZXIoKFN0cmluZylhcmdzWzBdLCAoU3RyaW5nKWFyZ3NbMV0sIChSZW5kZXJlcilhcmdzWzJdKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJveHkuaW52b2tlU3VwZXIob2JqLCBhcmdzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBFeHRWYWxHZW5lcmljUmVuZGVyS2l0KFJlbmRlcktpdCB3cmFwcGVkKQ0KLSAgICB7DQotICAgICAgICBzdXBlcih3cmFwcGVkKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIGNyZWF0ZVdyYXBwZXIoUmVuZGVyZXIgcmVuZGVyZXIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLm5ld0luc3RhbmNlKHJlbmRlcmVyKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUwZDYyMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlcldyYXBwZXI7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RJbnRlcmNlcHRvcjsKLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuRW5oYW5jZXI7Ci1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZFByb3h5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgZmluYWwgY2xhc3MgRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlciBleHRlbmRzIEV4dFZhbFJlbmRlcmVyV3JhcHBlciBpbXBsZW1lbnRzIE1ldGhvZEludGVyY2VwdG9yCi17Ci0gICAgcHVibGljIHN0YXRpYyBSZW5kZXJlciBuZXdJbnN0YW5jZShSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IHJlbmRlcmVyLmdldENsYXNzKCk7Ci0KLSAgICAgICAgLy90byBhdm9pZCByZS13cmFwcGluZyAtIG9jY3VycyBlLmcuIHVuZGVyIHNvbGFyaXMgKyBiZWEgd2VibG9naWMKLSAgICAgICAgaWYgKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkuY29udGFpbnMoIiQkRW5oYW5jZXJCeUNHTElCJCQiKSB8fAotICAgICAgICAgICAgY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRGYXN0Q2xhc3NCeUNHTElCJCQiKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgRW5oYW5jZXIgZW5oYW5jZXIgPSBuZXcgRW5oYW5jZXIoKTsKLSAgICAgICAgZW5oYW5jZXIuc2V0U3VwZXJjbGFzcyhyZW5kZXJlci5nZXRDbGFzcygpKTsKLSAgICAgICAgZW5oYW5jZXIuc2V0Q2FsbGJhY2sobmV3IEV4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIocmVuZGVyZXIpKTsKLQotICAgICAgICByZXR1cm4gKFJlbmRlcmVyKSBlbmhhbmNlci5jcmVhdGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGludGVyY2VwdChPYmplY3Qgb2JqLCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzLCBNZXRob2RQcm94eSBwcm94eSkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJnZXRDb252ZXJ0ZWRWYWx1ZSIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldENvbnZlcnRlZFZhbHVlKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0sIGFyZ3NbMl0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJkZWNvZGUiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlY29kZSgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZW5jb2RlQmVnaW4iKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZUJlZ2luKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJlbmNvZGVDaGlsZHJlbiIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlQ2hpbGRyZW4oKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImVuY29kZUVuZCIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlRW5kKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJjb252ZXJ0Q2xpZW50SWQiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29udmVydENsaWVudElkKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFN0cmluZylhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0UmVuZGVyc0NoaWxkcmVuIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRSZW5kZXJzQ2hpbGRyZW4oKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibWV0aG9kICIgKyBtZXRob2QuZ2V0TmFtZSgpICsgIiBjYWxsZWQgd2l0aG91dCByZW5kZXJpbmctaW50ZXJjZXB0b3JzIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBwcm94eS5pbnZva2VTdXBlcihvYmosIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyKFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgewotICAgICAgICBzdXBlcih3cmFwcGVkKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0dlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0dlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDkxN2U2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5DQotew0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyS2l0IGNyZWF0ZVdyYXBwZXIoUmVuZGVyS2l0IHJlbmRlcktpdCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVya2l0IHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcktpdC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgdmlhIGNnbGliIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5uZXdJbnN0YW5jZShyZW5kZXJLaXQpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3N0YXJ0dXAvR2VuZXJpY01vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YzdiNDEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkFic3RyYWN0U3RhcnR1cExpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdC5HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBHZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jbGFzcykuYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkobmV3IEdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU5YThlOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGUNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGUgcHJvdmlkZXMgZ2VuZXJpYyBTdXBwb3J0IGZvciBKU0YgY29tcG9uZW50IGZyYW1ld29ya3Mgd2hpY2ggaGF2ZSBzcGVjaWFsIHJlcXVpcmVtZW50cyAoZS5nLiBSaWNoRmFjZXMsIE15RmFjZXMgVG9iYWdvLCAuLi4pLg0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS4xLnggYW5kIEpTRiAxLjIueC4gQm90aCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3BvbS54bWwgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzc3YjI1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotDQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQ29tcG9uZW50LVN1cHBvcnQgTW9kdWxlczwvbmFtZT4NCi0gICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxzY20+DQotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9jb21wb25lbnQtc3VwcG9ydDwvY29ubmVjdGlvbj4NCi0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9jb21wb25lbnQtc3VwcG9ydDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4NCi0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvbXBvbmVudC1zdXBwb3J0PC91cmw+DQotICAgIDwvc2NtPg0KLQ0KLSAgICA8bW9kdWxlcz4NCi0gICAgICAgIDxtb2R1bGU+dHJpbmlkYWQtc3VwcG9ydDwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5nZW5lcmljLXN1cHBvcnQ8L21vZHVsZT4NCi0gICAgPC9tb2R1bGVzPg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPHByb3BlcnRpZXM+DQotICAgICAgICA8dHJpbmlkYWQudmVyc2lvbj4xLjIuOTwvdHJpbmlkYWQudmVyc2lvbj4NCi0gICAgPC9wcm9wZXJ0aWVzPg0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyM2Y1ZGIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgVHJpbmlkYWQgU3VwcG9ydCBNb2R1bGU8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cmVzb3VyY2VzPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICA8L3Jlc291cmNlcz4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk4YjJiYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+DQotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0YXJ0dXAuVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXINCi0gICAgICAgIDwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLQ0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPg0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyDQotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MGViNjguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5DbGllbnRWYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLS8qKg0KLSAqIGluIGNhc2Ugb2YgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBhIHRyaW5pZGFkIGNsaWVudCB2YWxpZGF0b3IgaXMgYWRkZWQgdG8gdGhlIGNvbXBvbmVudCBiYXNlZCBvbiB0aGUgbWV0YS1kYXRhLg0KLSAqIGF0IHRoZSBwb3N0YmFjazogdGhlIGV4dHZhbCB2YWxpZGF0aW9uIHN0cmF0ZWd5IGdldHMgY2FsbGVkIGFuZCBhZnRlciB0aGF0IHRoZSBhZGRlZCB2YWxpZGF0b3IuDQotICogdGhpcyB3cmFwcGVyIHByZXZlbnRzIHN1Y2ggYSBzZXJ2ZXItc2lkZSBkb3VibGUgdmFsaWRhdGlvbi4NCi0gKiBpdCBqdXN0IGRlbGVnYXRlcyB0aGUgY2xpZW50LXNpZGUgZnVuY3Rpb25hbGl0eS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlciBpbXBsZW1lbnRzIFZhbGlkYXRvciwgQ2xpZW50VmFsaWRhdG9yLCBTZXJpYWxpemFibGUNCi17DQotICAgIHByaXZhdGUgdHJhbnNpZW50IENsaWVudFZhbGlkYXRvciB3cmFwcGVkOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxNDE0NTQ3ODQxNzAwNjIxNDEwTDsNCi0NCi0gICAgcHVibGljIEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcihDbGllbnRWYWxpZGF0b3IgY2xpZW50VmFsaWRhdG9yKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSBjbGllbnRWYWxpZGF0b3I7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgdmFsaWRhdGUgLSB0aGUgZXh0dmFsIHZhbGlkYXRpb24gc3RyYXRlZ3kgd2lsbCBkbyB0aGF0DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRMaWJyYXJ5U291cmNlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudExpYnJhcnlTb3VyY2UoZmFjZXNDb250ZXh0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldENsaWVudEltcG9ydE5hbWVzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q2xpZW50SW1wb3J0TmFtZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFNjcmlwdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q2xpZW50U2NyaXB0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50VmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q2xpZW50VmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGJjMTk0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0LkV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY3RvcnlGaW5kZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeTsNCi0NCi0vKioNCi0gKiB1c2UgdGhpcyBwaGFzZS1saXN0ZW5lciBpbnN0ZWFkIG9mIGEgRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBkdWUgdG8gYSB0cmluaWRhZCBpc3N1ZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lciBpbXBsZW1lbnRzIFBoYXNlTGlzdGVuZXINCi17DQotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIGlmKGV2ZW50LmdldFBoYXNlSWQoKSAhPSBQaGFzZUlkLkFQUExZX1JFUVVFU1RfVkFMVUVTICYmIGV2ZW50LmdldFBoYXNlSWQoKSAhPSBQaGFzZUlkLlJFTkRFUl9SRVNQT05TRSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgUmVuZGVyS2l0RmFjdG9yeSByZW5kZXJLaXRGYWN0b3J5ID0gKFJlbmRlcktpdEZhY3RvcnkpDQotICAgICAgICAgICAgRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEZhY3RvcnlGaW5kZXIuUkVOREVSX0tJVF9GQUNUT1JZKTsNCi0NCi0gICAgICAgIFN0cmluZyByZW5kZXJLaXRJZCA9IGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldFJlbmRlcktpdElkKCk7DQotDQotICAgICAgICBpZihFeHRWYWxUcmluaWRhZFJlbmRlcktpdC5JRC5lcXVhbHMocmVuZGVyS2l0SWQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFJlbmRlcktpdCByZW5kZXJLaXQgPSByZW5kZXJLaXRGYWN0b3J5LmdldFJlbmRlcktpdChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHJlbmRlcktpdElkKTsNCi0gICAgICAgIHJlbmRlcktpdEZhY3RvcnkuYWRkUmVuZGVyS2l0KEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LklELCBuZXcgRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQocmVuZGVyS2l0KSk7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5zZXRSZW5kZXJLaXRJZChFeHRWYWxUcmluaWRhZFJlbmRlcktpdC5JRCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLlJFTkRFUl9SRVNQT05TRTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUwY2I3NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJlbid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIC8qDQotICAgICAqIGRlYWN0aXZhdGUNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9DTElFTlRfU0lERV9UUklOSURBRF9WQUxJREFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0NMSUVOVF9TSURFX1RSSU5JREFEX1ZBTElEQVRJT04iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX1RSSU5JREFEX0NPUkVfT1VUUFVUX0xBQkVMX0lOSVRJQUxJWkFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1RSSU5JREFEX0NPUkVfT1VUUFVUX0xBQkVMX0lOSVRJQUxJWkFUSU9OIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9UUklOSURBRF9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9UUklOSURBRF9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiIpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMzI5ZjYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvRG91YmxlUmFuZ2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkRvdWJsZVJhbmdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgRG91YmxlUmFuZ2VJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7Ci0gICAgICAgIERvdWJsZVJhbmdlVmFsaWRhdG9yIGRvdWJsZVJhbmdlVmFsaWRhdG9yID0gKERvdWJsZVJhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5Eb3VibGVSYW5nZSIpOwotCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbWluID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pOwotCi0gICAgICAgICAgICBpZihtaW4gaW5zdGFuY2VvZiBEb3VibGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bSgoRG91YmxlKW1pbik7Ci0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1heExlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYKTsKLQotICAgICAgICAgICAgaWYobWF4TGVuZ3RoIGluc3RhbmNlb2YgRG91YmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oKERvdWJsZSltYXhMZW5ndGgpOwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkICYmCi0gICAgICAgICAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3IgaW5zdGFuY2VvZiBDbGllbnRWYWxpZGF0b3IgJiYgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKWRvdWJsZVJhbmdlVmFsaWRhdG9yKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xlbmd0aEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDEyMjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkNsaWVudFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgTGVuZ3RoSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW5mb3JtYXRpb25BZGRlZCA9IGZhbHNlOwotICAgICAgICAvL1RPRE8KLSAgICAgICAgTGVuZ3RoVmFsaWRhdG9yIGxlbmd0aFZhbGlkYXRvciA9IChMZW5ndGhWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkxlbmd0aCIpOwotCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSCk7Ci0KLSAgICAgICAgICAgIGlmKG1pbiBpbnN0YW5jZW9mIEludGVnZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1pbmltdW0oKEludGVnZXIpbWluKTsKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1heExlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCk7Ci0KLSAgICAgICAgICAgIGlmKG1heExlbmd0aCBpbnN0YW5jZW9mIEludGVnZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRNYXhpbXVtTGVuZ3RoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludC5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1heGltdW0oKEludGVnZXIpbWF4TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vcmVJbml0VmFsaWRhdG9ycygoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCwgbWV0YURhdGEpOyAvL3NlYXJjaCB3cmFwcGVycyBhbmQgY2FsbCAuZGVhY3RpdmF0ZQotCi0gICAgICAgIGlmKGluZm9ybWF0aW9uQWRkZWQgJiYgbGVuZ3RoVmFsaWRhdG9yIGluc3RhbmNlb2YgQ2xpZW50VmFsaWRhdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpbGVuZ3RoVmFsaWRhdG9yKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIENvcmVPdXRwdXRMYWJlbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsZW5ndGhWYWxpZGF0b3IuZ2V0TWluaW11bSgpID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgoQ29yZU91dHB1dExhYmVsKXVpQ29tcG9uZW50KS5zZXRTaG93UmVxdWlyZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChDb3JlT3V0cHV0TGFiZWwpdWlDb21wb25lbnQpLnNldFNob3dSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTG9uZ1JhbmdlSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xvbmdSYW5nZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYzM0ZGUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTG9uZ1JhbmdlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5Mb25nUmFuZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5DbGllbnRWYWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBMb25nUmFuZ2VJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7Ci0gICAgICAgIExvbmdSYW5nZVZhbGlkYXRvciBsb25nUmFuZ2VWYWxpZGF0b3IgPSAoTG9uZ1JhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5Mb25nUmFuZ2UiKTsKLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKTsKLQotICAgICAgICAgICAgaWYobWluIGluc3RhbmNlb2YgTG9uZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bSgoTG9uZyltaW4pOwotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCk7Ci0KLSAgICAgICAgICAgIGlmKG1heExlbmd0aCBpbnN0YW5jZW9mIExvbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oKExvbmcpbWF4TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKGluZm9ybWF0aW9uQWRkZWQgJiYKLSAgICAgICAgICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3IgaW5zdGFuY2VvZiBDbGllbnRWYWxpZGF0b3IgJiYgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpbG9uZ1JhbmdlVmFsaWRhdG9yKSk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9QYXR0ZXJuSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZmMDg4ZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9QYXR0ZXJuSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5SZWdFeHBWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5DbGllbnRWYWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBQYXR0ZXJuSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCFtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIHBhdHRlcm5zID0gKFN0cmluZ1tdKW1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTik7Ci0KLSAgICAgICAgUmVnRXhwVmFsaWRhdG9yIHJlZ0V4cFZhbGlkYXRvcjsKLQotICAgICAgICBmb3IoU3RyaW5nIHBhdHRlcm4gOiBwYXR0ZXJucykKLSAgICAgICAgewotICAgICAgICAgICAgcmVnRXhwVmFsaWRhdG9yID0gKFJlZ0V4cFZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLlJlZ0V4cCIpOwotCi0gICAgICAgICAgICByZWdFeHBWYWxpZGF0b3Iuc2V0UGF0dGVybihwYXR0ZXJuKTsKLSAgICAgICAgICAgIHJlZ0V4cFZhbGlkYXRvci5zZXRNZXNzYWdlRGV0YWlsTm9NYXRjaCgoU3RyaW5nKW1ldGFEYXRhLmdldCgKLSAgICAgICAgICAgICAgICBDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTl9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UpKTsKLQotICAgICAgICAgICAgaWYocmVnRXhwVmFsaWRhdG9yIGluc3RhbmNlb2YgQ2xpZW50VmFsaWRhdG9yICYmIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIoKENsaWVudFZhbGlkYXRvcilyZWdFeHBWYWxpZGF0b3IpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmM2QxMzYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUmVxdWlyZWRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC51dGlsLlRyaW5pZGFkVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLm91dHB1dC5Db3JlT3V0cHV0TGFiZWw7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgUmVxdWlyZWRJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSB8fAotICAgICAgICAgICBtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCl8fAotICAgICAgICAgICBtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoKAotICAgICAgICAgICAgICAgICAoIUJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJgotICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKSkpIHx8Ci0gICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhpc0NvbXBvbmVudFJlcXVpcmVkKHVpQ29tcG9uZW50KSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkgJiYKLSAgICAgICAgICAgICAgICAgICAhQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgQ29yZU91dHB1dExhYmVsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKChDb3JlT3V0cHV0TGFiZWwpdWlDb21wb25lbnQpLnNldFNob3dSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQm9vbGVhbiBpc0NvbXBvbmVudFJlcXVpcmVkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpQ29tcG9uZW50ID0gVHJpbmlkYWRVdGlscy5maW5kTGFiZWxlZEVkaXRhYmxlQ29tcG9uZW50KChDb3JlT3V0cHV0TGFiZWwpIHVpQ29tcG9uZW50KTsKLQotICAgICAgICAgICAgaWYodWlDb21wb25lbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vY29tcGFyZSB3aXRoIGZhbHNlIHNvIHRydWUgPSB0cnVlIG9yIG51bGwKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc1JlYWRPbmx5IikpKTsKLSAgICAgICAgYm9vbGVhbiBpc0Rpc2FibGVkID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc0Rpc2FibGVkIikpKTsKLQotICAgICAgICByZXR1cm4gIShpc1JlYWRPbmx5IHx8IGlzRGlzYWJsZWQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1RyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1RyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkzMTA4Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29udGV4dC5SZXF1ZXN0Q29udGV4dDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9URVhUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXRUZXh0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXREYXRlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8VHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcj4gY29tcG9uZW50SW5pdGlhbGl6ZXJzID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyPigpOwotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBSZXF1aXJlZEluaXRpYWxpemVyKCkpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBMZW5ndGhJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgTG9uZ1JhbmdlSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IERvdWJsZVJhbmdlSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFBhdHRlcm5Jbml0aWFsaXplcigpKTsKLSAgICAgICAgLy9jb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBWYWxpZGF0b3JJbml0aWFsaXplcigpKTsKLSAgICB9Ci0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkxPVywgZGVzY3JpcHRpb24gPSAiY2hlY2sgcHByIGlzc3VlIikKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBmb3IoVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplciA6IGNvbXBvbmVudEluaXRpYWxpemVycykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoY29tcG9uZW50SW5pdGlhbGl6ZXIuY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVwZGF0ZUNvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKSB8fAotICAgICAgICAgICAgICAgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFLmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmKFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmlzUGFydGlhbFJlcXVlc3QoZmFjZXNDb250ZXh0KSkKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuYWRkUGFydGlhbFRhcmdldCh1aUNvbXBvbmVudC5nZXRQYXJlbnQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVmFsaWRhdG9ySW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1ZhbGlkYXRvckluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODg3OGMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVmFsaWRhdG9ySW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHZhbHVlID0gVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTE9XLCBkZXNjcmlwdGlvbiA9ICJpbXBsLiB0cmluaWRhZCBlLW1haWwgdmFsaWRhdG9yIikKLWNsYXNzIFZhbGlkYXRvckluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZighbWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLkNVU1RPTSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuQ1VTVE9NKTsKLQotICAgICAgICBpZighKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvcihPYmplY3QgY3VycmVudFZhbHVlIDogKExpc3QpdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCEoY3VycmVudFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoQ29tbW9uTWV0YURhdGFLZXlzLkVNQUlMLmVxdWFscyhjdXJyZW50VmFsdWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vVE9ETwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNjdjZjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnV0aWwuVHJpbmlkYWRVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLm91dHB1dC5Db3JlT3V0cHV0TGFiZWw7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotcHVibGljIGNsYXNzIFRyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvciBleHRlbmRzIEFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcg0KLXsNCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpDQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmKGZpbHRlckNvcmVPdXRwdXRMYWJlbCh1aUNvbXBvbmVudCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdENvcmVPdXRwdXRMYWJlbChmYWNlc0NvbnRleHQsIChDb3JlT3V0cHV0TGFiZWwpdWlDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBmaWx0ZXJDb3JlT3V0cHV0TGFiZWwoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb3JlT3V0cHV0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgQ29yZU91dHB1dExhYmVsIGNvcmVPdXRwdXRMYWJlbCkNCi0gICAgew0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0NCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIGFubm90YXRpb25FeHRyYWN0b3IgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkuZ2V0RmFjdG9yeSgNCi0gICAgICAgICAgICBGYWN0b3J5TmFtZXMuQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmNsYXNzKS5jcmVhdGUoKTsNCi0NCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IFRyaW5pZGFkVXRpbHMuZmluZExhYmVsZWRFZGl0YWJsZUNvbXBvbmVudChjb3JlT3V0cHV0TGFiZWwpOw0KLQ0KLSAgICAgICAgaWYodGFyZ2V0Q29tcG9uZW50ID09IG51bGwgfHwgIWlzQ29tcG9uZW50RWRpdGFibGUodGFyZ2V0Q29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBCb29sZWFuIHNraXBJbml0aWFsaXphdGlvbiA9IGZhbHNlOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YTsNCi0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IGFubm90YXRpb25FeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHRhcmdldENvbXBvbmVudCkuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSBFeHRWYWxVdGlscy5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSk7DQotDQotICAgICAgICAgICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEgPSBtZXRhRGF0YVRyYW5zZm9ybWVyLmNvbnZlcnRNZXRhRGF0YShlbnRyeSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG51bGw7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYobWV0YURhdGEgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2V4ZWN1dGUgc2tpcCB2YWxpZGF0aW9uIHN0cmF0ZWd5IC0+IHNraXAgdmFsaWRhdGlvbiB5L24gaW4gZW50cnkNCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHRhcmdldENvbXBvbmVudCwgZW50cnksIG51bGwpOw0KLSAgICAgICAgICAgICAgICAgICAgc2tpcEluaXRpYWxpemF0aW9uID0gZW50cnkuZ2V0UHJvcGVydHkoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTiwgQm9vbGVhbi5jbGFzcyk7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZihCb29sZWFuLlRSVUUuZXF1YWxzKHNraXBJbml0aWFsaXphdGlvbikgJiYgIW1ldGFEYXRhLmlzRW1wdHkoKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmlzU2tpcGFibGVWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YS5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTiwgdHJ1ZSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYoIW1ldGFEYXRhLmlzRW1wdHkoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29uZmlndXJlQ29tcG9uZW50V2l0aE1ldGFEYXRhKGZhY2VzQ29udGV4dCwgY29yZU91dHB1dExhYmVsLCBtZXRhRGF0YSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcG9uZW50RWRpdGFibGUoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIC8vY29tcGFyZSB3aXRoIGZhbHNlIHNvIHRydWUgPSB0cnVlIG9yIG51bGwNCi0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzUmVhZE9ubHkiKSkpOw0KLSAgICAgICAgYm9vbGVhbiBpc0Rpc2FibGVkID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNEaXNhYmxlZCIpKSk7DQotDQotICAgICAgICByZXR1cm4gIShpc1JlYWRPbmx5IHx8IGlzRGlzYWJsZWQpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVjMjY5NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuTGFiZWxlZE1lc3NhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb250ZXh0LlJlcXVlc3RDb250ZXh0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXRUZXh0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dERhdGUiOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmVmcmVzaENvbXBvbmVudCh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IGdldExhYmVsKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgICAgICBpZihsYWJlbCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbGFiZWwgPSB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvL292ZXJyaWRlIHRoZSBsYWJlbCBpZiB0aGUgYW5ub3RhdGlvbiBwcm92aWRlcyBhIGxhYmVsDQotICAgICAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsYWJlbCA9IG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwsIFN0cmluZy5jbGFzcyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIExhYmVsZWRNZXNzYWdlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgKChMYWJlbGVkTWVzc2FnZSlmYWNlc01lc3NhZ2UpLnNldExhYmVsVGV4dChsYWJlbCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vaWYgc29tZW9uZSB1c2VzIGEgbm9ybWFsIGZhY2VzIG1lc3NhZ2UNCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwoZmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVmcmVzaENvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYoUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuaXNQYXJ0aWFsUmVxdWVzdChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmFkZFBhcnRpYWxUYXJnZXQodWlDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKSB8fA0KLSAgICAgICAgICAgICAgIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURS5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldExhYmVsKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFN0cmluZylSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiZ2V0TGFiZWwiKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYjQ1ZTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwucmVuZGVya2l0LlJlbmRlcktpdERlY29yYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwucmVuZGVya2l0LmNvcmUuQ29yZVJlbmRlcktpdDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVzcG9uc2VTdGF0ZU1hbmFnZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VXcml0ZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uV3JpdGVyOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZFJlbmRlcktpdCBleHRlbmRzIFJlbmRlcktpdERlY29yYXRvcg0KLXsNCi0gICAgcHJvdGVjdGVkIEV4dFZhbFJlbmRlcktpdCBleHRWYWxSZW5kZXJLaXQ7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIkVYVFZBTF9UUklOSURBRF9SRU5ERVJLSVQiOw0KLQ0KLSAgICBwdWJsaWMgRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQoUmVuZGVyS2l0IHdyYXBwZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZXh0VmFsUmVuZGVyS2l0ID0gbmV3IEV4dFZhbFJlbmRlcktpdCh3cmFwcGVkKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSwgUmVuZGVyZXIgcmVuZGVyZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCByZW5kZXJlcik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBSZW5kZXJlciBnZXRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5leHRWYWxSZW5kZXJLaXQuZ2V0UmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdGF0ZU1hbmFnZXIgZ2V0UmVzcG9uc2VTdGF0ZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5leHRWYWxSZW5kZXJLaXQuZ2V0UmVzcG9uc2VTdGF0ZU1hbmFnZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFJlc3BvbnNlV3JpdGVyIGNyZWF0ZVJlc3BvbnNlV3JpdGVyKFdyaXRlciB3cml0ZXIsIFN0cmluZyBzLCBTdHJpbmcgczEpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5jcmVhdGVSZXNwb25zZVdyaXRlcih3cml0ZXIsIHMsIHMxKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFJlc3BvbnNlU3RyZWFtIGNyZWF0ZVJlc3BvbnNlU3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5jcmVhdGVSZXNwb25zZVN0cmVhbShvdXRwdXRTdHJlYW0pOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVjb3JhdGVkUmVuZGVyS2l0SWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ29yZVJlbmRlcktpdC5CQVNFX1JFTkRFUl9LSVRfSUQ7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5LmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYyNzAxZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuY29yZS54aHRtbC50YWJsZS5UYWJsZVJlbmRlcmluZ0NvbnRleHQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBzb2x1dGlvbiBmb3IgdHJpbmlkYWQgdGFibGUgcmVuZGVyZXIgaXNzdWUgKGluIGNvbm5lY3Rpb24gd2l0aCBkb3VibGUgY2FsbCBwcmV2ZW50aW9uIHByb3hpZXMpDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eSBleHRlbmRzIEV4dFZhbFJlbmRlcmVyUHJveHkNCi17DQotICAgIHB1YmxpYyBFeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkoUmVuZGVyZXIgcmVuZGVyZXIpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKHJlbmRlcmVyKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcHRpb25hbEtleShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYoVGFibGVSZW5kZXJpbmdDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJ8IiArIFRhYmxlUmVuZGVyaW5nQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRSZW5kZXJTdGFnZSgpLmdldFN0YWdlKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gIiI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdGFydHVwL1RyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJkZWNiNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkFic3RyYWN0U3RhcnR1cExpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50LlRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC52YWxpZGF0aW9uLm1lc3NhZ2UuVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0LkV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yLlRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3IuVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogYWx0ZXJuYXRpdmUgYXBwcm9hY2ggZm9yIEV4dFZhbFJlbmRlcktpdEZhY3RvcnkNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyDQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgaW5pdFRyaW5pZGFkU3VwcG9ydCgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0VHJpbmlkYWRTdXBwb3J0KCkNCi0gICAgew0KLSAgICAgICAgLy9kZWFjdGl2YXRlIGRlZmF1bHQgYXBwcm9hY2gNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5SRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZLCBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmNsYXNzKS5kZWFjdGl2YXRlKCk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBkZWFjdGl2YXRlQ2xpZW50U2lkZVZhbGlkYXRpb24gPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DTElFTlRfU0lERV9UUklOSURBRF9WQUxJREFUSU9OOw0KLQ0KLSAgICAgICAgaWYoZGVhY3RpdmF0ZUNsaWVudFNpZGVWYWxpZGF0aW9uID09IG51bGwgfHwgIWRlYWN0aXZhdGVDbGllbnRTaWRlVmFsaWRhdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgZGVhY3RpdmF0ZUluaXRDb3JlT3V0cHV0TGFiZWwgPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9UUklOSURBRF9DT1JFX09VVFBVVF9MQUJFTF9JTklUSUFMSVpBVElPTjsNCi0NCi0gICAgICAgIGlmKGRlYWN0aXZhdGVJbml0Q29yZU91dHB1dExhYmVsID09IG51bGwgfHwgIWRlYWN0aXZhdGVJbml0Q29yZU91dHB1dExhYmVsLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFRyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvcigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBkZWFjdGl2YXRlVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgPQ0KLSAgICAgICAgICAgICAgICBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9UUklOSURBRF9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUjsNCi0NCi0gICAgICAgIGlmKGRlYWN0aXZhdGVUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA9PSBudWxsIHx8DQotICAgICAgICAgICAgICAgICFkZWFjdGl2YXRlVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcihuZXcgVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2RlYWN0aXZhdGUgZXh0dmFsIHJlbmRlcmVyIHByb3h5IC0gZHVlIHRvIGFuIGluY29tcGF0aWJpbGl0eSB3aXRoIHRoZSB0YWJsZSByZW5kZXJlcg0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZLCBFeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5TmFtZXMuRkFDRVNfTUVTU0FHRV9GQUNUT1JZLm5hbWUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBUcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIC8qDQotICAgICAgICAgKiBpZiB0aGVyZSBhcmUgZnVydGhlciBpbmNvbXBhdGlibGUgcmVuZGVyZXJzIHVzZSB0aGUgZm9sbG93aW5nIHF1aWNrLWZpeDoNCi0gICAgICAgICAqICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZLCBudWxsKTsNCi0gICAgICAgICAgIGF0dGVudGlvbjogaXQgY2F1c2VzIGRpcmVjdCBkZWxlZ2F0aW9uIHdpdGhvdXQgYSBjaGVjayBvZiBkb3VibGUgaW52b2NhdGlvbnMNCi0gICAgICAgICAqLw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdXRpbC9UcmluaWRhZFV0aWxzLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3V0aWwvVHJpbmlkYWRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTdhZWU5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdXRpbC9UcmluaWRhZFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJjaGVjayBzdWJmb3JtIikNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRVdGlscw0KLXsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coVHJpbmlkYWRVdGlscy5jbGFzcyk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVUlDb21wb25lbnQgZmluZExhYmVsZWRFZGl0YWJsZUNvbXBvbmVudChDb3JlT3V0cHV0TGFiZWwgY29yZU91dHB1dExhYmVsKQ0KLSAgICB7DQotICAgICAgICAvL1RPRE8NCi0gICAgICAgIGlmKGNvcmVPdXRwdXRMYWJlbC5nZXRGb3IoKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFVJQ29tcG9uZW50IHJlc3VsdCA9IGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmZpbmRDb21wb25lbnQoY29yZU91dHB1dExhYmVsLmdldEZvcigpKTsNCi0NCi0gICAgICAgIGlmKHJlc3VsdCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKExPRy5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExPRy50cmFjZShjb3JlT3V0cHV0TGFiZWwuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSArICIgZG9lc24ndCByZWZlcmVuY2UgYW4gZWRpdGFibGUgY29tcG9uZW50Iik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2MyMWNjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnZhbGlkYXRpb24ubWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkRlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkgZXh0ZW5kcyBEZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzTGFiZWxlZEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlIGluc3RhbmNlb2YgVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgRmFjZXNNZXNzYWdlIGNyZWF0ZShGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZShzZXZlcml0eSwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDFhYTFjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnZhbGlkYXRpb24ubWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnV0aWwuTGFiZWxlZEZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuTGFiZWxlZE1lc3NhZ2U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlIGV4dGVuZHMgTGFiZWxlZEZhY2VzTWVzc2FnZSBpbXBsZW1lbnRzIExhYmVsZWRNZXNzYWdlDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2MzU2ODAwNjg5OTYxNTA1MTU0TDsNCi0NCi0gICAgcHVibGljIFRyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZShTZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKHNldmVyaXR5LCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldExhYmVsQXNTdHJpbmcoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIGxhYmVsKQ0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRMYWJlbChsYWJlbCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0YmE4YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgVHJpbmlkYWQgU3VwcG9ydCBNb2R1bGUNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgVHJpbmlkYWQgU3VwcG9ydCBNb2R1bGUgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZSBwcm92aWRlcyBzcGVjaWFsIFRyaW5pZGFkIFN1cHBvcnQgZm9yIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IuDQotICAgIEZ1cnRoZXJtb3JlLCBpdCBhbGxvd3MgdG8gam9pbiB0aGUgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBtZWNoYW5pc20gb2YgVHJpbmlkYWQuIFNhbXBsZSB1c2UtY2FzZTogYW5ub3RhdGUgeW91ciBtb2RlbCB3aXRoIEpQQSAxLjAgYW5ub3RhdGlvbnMsIGJpbmQgcHJvcGVydGllcyB0byBKU0YgSW5wdXQgY29tcG9uZW50cyBhbmQgZ2V0IGF1dG9tYXRpYyBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIGp1c3QgYnkgYWRkaW5nIDMgSkFSIGZpbGVzIChNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUsIFByb3BlcnR5IFZhbGlkYXRpb24gYW5kIFRyaW5pZGFkIFN1cHBvcnQpLg0KLSAgDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLjEueCBhbmQgSlNGIDEuMi54LiBCb3RoIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3BvbS54bWwgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NWYzNDAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIENvcmU8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvY29yZTwvY29ubmVjdGlvbj4NCi0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9jb3JlPC9kZXZlbG9wZXJDb25uZWN0aW9uPg0KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvY29yZTwvdXJsPg0KLSAgICA8L3NjbT4NCi0gICAgDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxyZXNvdXJjZXM+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgIDwvcmVzb3VyY2VzPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ0ZGM0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4NCi0gICAgPGZhY3Rvcnk+DQotICAgICAgICA8cmVuZGVyLWtpdC1mYWN0b3J5Pm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXRGYWN0b3J5PC9yZW5kZXIta2l0LWZhY3Rvcnk+DQotICAgIDwvZmFjdG9yeT4NCi0NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkV4dFZhbFN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0V4dFZhbEluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0V4dFZhbEluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZDVkMWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotDQotLyoqDQotICogZG9udCd0IG1vdmUgdG8gYW4gb3RoZXIgcGFja2FnZSEhIQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIEV4dFZhbEluZm9ybWF0aW9uDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FID0gRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJYTUxfUEFSQU1fUFJFRklYID0gRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gQ2xhc3NVdGlscy5nZXRKYXJWZXJzaW9uKEV4dFZhbEluZm9ybWF0aW9uLmNsYXNzKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0N1c3RvbUluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ3VzdG9tSW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE5MGNlNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ3VzdG9tSW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkNCi1wdWJsaWMgZW51bSBDdXN0b21JbmZvcm1hdGlvbg0KLXsNCi0gICAgQkFTRV9QQUNLQUdFLA0KLSAgICBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiwNCi0NCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYLA0KLSAgICBWQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWCwNCi0gICAgTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVgsDQotDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfVE9fTVNHX1JFU09MVkVSX05BTUVfTUFQUEVSLA0KLSAgICBNRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUiwNCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIsDQotDQotICAgIFNUQVJUVVBfTElTVEVORVIsDQotICAgIENPTVBPTkVOVF9JTklUSUFMSVpFUiwNCi0gICAgVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IsDQotICAgIE1FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SLA0KLQ0KLSAgICBNRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwNCi0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwNCi0gICAgTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksDQotICAgIEZBQ0VTX01FU1NBR0VfRkFDVE9SWSwNCi0NCi0gICAgTUVTU0FHRV9CVU5ETEVfTkFNRSwNCi0gICAgU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTEwZjA3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlJlbmRlcmVySW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5RmluZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRGVmYXVsdEZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBFeHRWYWxDb250ZXh0Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBFeHRWYWxDb250ZXh0IGV4dFZhbENvbnRleHQgPSBuZXcgRXh0VmFsQ29udGV4dCgpOwotCi0gICAgcHJpdmF0ZSBGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIgPSBEZWZhdWx0RmFjdG9yeUZpbmRlci5nZXRJbnN0YW5jZSgpOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUmVuZGVyZXJJbnRlcmNlcHRvcj4gcmVuZGVyZXJJbnRlcmNlcHRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlbmRlcmVySW50ZXJjZXB0b3I+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZGVuaWVkSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI+IHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyPigpOwotCi0gICAgcHJpdmF0ZSBMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPiBjb21wb25lbnRJbml0aWFsaXplcnM7Ci0gICAgcHJpdmF0ZSBMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4gdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yczsKLSAgICBwcml2YXRlIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yczsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBnbG9iYWxQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLSAgICBwcml2YXRlIE1hcDxTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMsIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+PiBzdGF0aWNDb25maWdNYXAKLSAgICAgICAgPSBuZXcgSGFzaE1hcDxTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMsIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+PigpOwotCi0KLSAgICBwcml2YXRlIHZvaWQgbGF6eUluaXRDb21wb25lbnRJbml0aWFsaXplcnMoKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMgPSBuZXcgQXJyYXlMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPigpOwotICAgICAgICBMaXN0PFN0cmluZz4gY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcwotICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9JTklUSUFMSVpFUik7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcwotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfSU5JVElBTElaRVIpKTsKLQotICAgICAgICBDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplcjsKLSAgICAgICAgZm9yIChTdHJpbmcgY29tcG9uZW50SW5pdGlhbGl6ZXJOYW1lIDogY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb21wb25lbnRJbml0aWFsaXplciA9Ci0gICAgICAgICAgICAgICAgKENvbXBvbmVudEluaXRpYWxpemVyKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY29tcG9uZW50SW5pdGlhbGl6ZXJOYW1lKTsKLQotICAgICAgICAgICAgaWYgKGNvbXBvbmVudEluaXRpYWxpemVyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChjb21wb25lbnRJbml0aWFsaXplcik7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShjb21wb25lbnRJbml0aWFsaXplci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbGF6eUluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMudmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMgPSBuZXcgQXJyYXlMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4oKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IpOwotICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KAotICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUikpOwotCi0gICAgICAgIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7Ci0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUgOiB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgPQotICAgICAgICAgICAgICAgIChWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzLmFkZCh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsYXp5SW5pdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBpZih0aGlzLm1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLm1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+KCk7Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SKTsKLSAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KAotICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUikpOwotCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOwotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lIDogbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciA9Ci0gICAgICAgICAgICAgICAgKE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUpOwotCi0gICAgICAgICAgICBpZiAobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5hZGQobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFeHRWYWxDb250ZXh0IGdldENvbnRleHQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGV4dFZhbENvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIEZhY3RvcnlGaW5kZXIgZ2V0RmFjdG9yeUZpbmRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gZmFjdG9yeUZpbmRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGYWN0b3J5RmluZGVyKEZhY3RvcnlGaW5kZXIgZmFjdG9yeUZpbmRlcikKLSAgICB7Ci0gICAgICAgIGlmKGZhY3RvcnlGaW5kZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5mYWN0b3J5RmluZGVyID0gZmFjdG9yeUZpbmRlcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFJlbmRlcmVySW50ZXJjZXB0b3I+IGdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFJlbmRlcmVySW50ZXJjZXB0b3I+KHJlbmRlcmVySW50ZXJjZXB0b3JzLnZhbHVlcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChFeHRWYWxDb250ZXh0LmNsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVuaWVkSW50ZXJjZXB0b3JzLmNvbnRhaW5zKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3JzLnB1dChyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSwgcmVuZGVyZXJJbnRlcmNlcHRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVyZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IoQ2xhc3MgcmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yID0KLSAgICAgICAgICAgIChSZW5kZXJlckludGVyY2VwdG9yKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzcyhyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoRXh0VmFsQ29udGV4dC5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvcnMucmVtb3ZlKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vaWYgYW4gaW50ZXJjZXB0b3IgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZCBzbyBmYXIsIGl0IHNob3VsZCBiZSBkZW5pZWQgYXQgZnV0dXJlIHJlZ2lzdHJhdGlvbnMKLSAgICBwdWJsaWMgdm9pZCBkZW55UmVuZGVyZXJJbnRlcmNlcHRvcihDbGFzcyByZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpCi0gICAgewotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgPQotICAgICAgICAgICAgKFJlbmRlcmVySW50ZXJjZXB0b3IpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcyk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChFeHRWYWxDb250ZXh0LmNsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZW5pZWRJbnRlcmNlcHRvcnMuYWRkKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKTsKLSAgICAgICAgfQotICAgICAgICBkZXJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvbXBvbmVudEluaXRpYWxpemVyKENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyKQotICAgIHsKLSAgICAgICAgbGF6eUluaXRDb21wb25lbnRJbml0aWFsaXplcnMoKTsKLSAgICAgICAgdGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMuYWRkKGNvbXBvbmVudEluaXRpYWxpemVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4gZ2V0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCkKLSAgICB7Ci0gICAgICAgIGxhenlJbml0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7Ci0gICAgICAgIHJldHVybiBjb21wb25lbnRJbml0aWFsaXplcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBsYXp5SW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgdGhpcy52YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzLmFkZCh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4gZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBsYXp5SW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBsYXp5SW5pdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMuYWRkKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGxhenlJbml0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHJldHVybiBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcj4gZ2V0UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciBwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycy5hZGQocHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICB7Ci0gICAgICAgIE1hcCBhcHBsaWNhdGlvbk1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbk1hcCgpOwotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBiZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBhcHBsaWNhdGlvbk1hcC5nZXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FKTsKLQotICAgICAgICBpZiAoYmVhbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW5pdEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKGFwcGxpY2F0aW9uTWFwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmVhbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGluaXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbihNYXAgYXBwbGljYXRpb25NYXApCi0gICAgewotICAgICAgICBMaXN0PFN0cmluZz4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4pOwotICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMuYWRkKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkNVU1RPTV9CRUFOKTsKLQotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbjsKLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChpbmZvcm1hdGlvblByb3ZpZGVyQmVhbiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uTWFwLnB1dChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUsIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnlUb0luaXRDdXN0b21Db25maWd1cmVkSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWUoYXBwbGljYXRpb25NYXApOwotCi0gICAgICAgIGlmKGFwcGxpY2F0aW9uTWFwLmNvbnRhaW5zS2V5KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4pYXBwbGljYXRpb25NYXAuZ2V0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0luaXRDdXN0b21Db25maWd1cmVkSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWUoTWFwIGFwcGxpY2F0aW9uTWFwKQotICAgIHsKLSAgICAgICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gYmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKQotICAgICAgICAgICAgLmdldEJlYW4oSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQ1VTVE9NX0JFQU4ucmVwbGFjZSgiLiIsICJfIikpOwotCi0gICAgICAgIGlmKGJlYW4gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYXBwbGljYXRpb25NYXAucHV0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSwgYmVhbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gZ2V0U3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmKCF0aGlzLnN0YXRpY0NvbmZpZ01hcC5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gc3RhdGljQ29uZmlnTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgICAgICB0aGlzLnN0YXRpY0NvbmZpZ01hcC5wdXQobmFtZSwgc3RhdGljQ29uZmlnTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGljQ29uZmlnTWFwLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcyBuYW1lLCBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IHN0YXRpY0NvbmZpZ0xpc3Q7Ci0gICAgICAgICAgICBpZighdGhpcy5zdGF0aWNDb25maWdNYXAuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5zdGF0aWNDb25maWdNYXAucHV0KG5hbWUsIHN0YXRpY0NvbmZpZ0xpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5zdGF0aWNDb25maWdNYXAuZ2V0KG5hbWUpLmFkZChzdGF0aWNDb25maWcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYWRkR2xvYmFsUHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhZGRHbG9iYWxQcm9wZXJ0eShuYW1lICwgdmFsdWUsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gZm9yY2VPdmVycmlkZSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMuZ2xvYmFsUHJvcGVydGllcy5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIWZvcmNlT3ZlcnJpZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJvdmVycmlkZSBnbG9iYWwgcHJvcGVydHkgJyIgKyBuYW1lICsgIiciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmdsb2JhbFByb3BlcnRpZXMucHV0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRHbG9iYWxQcm9wZXJ0eShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmdsb2JhbFByb3BlcnRpZXMuZ2V0KG5hbWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZWZhNmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJlbid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKiArIHNvbWUgb2YgdGhlbSBjYW4gYmUgY3VzdG9taXplZCB3aXRoaW4gYSBjdXN0b20gaW1wbC4gb2YgdGhlIGJlYW4NCi0gKiAoZXh0ZW5kIHRoaXMgY2xhc3MgYW5kIHByb3ZpZGUgaXQgdmlhIGNvbnZlbnRpb24gb3Igd2ViLnhtbCkNCi0gKiA8cC8+DQotICogdGhlIHN0YXRpYyBhcGkgc2hvdWxkIG9ubHkgYmUgdXNlZA0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUFOX05BTUUgPSBFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRQ0KLSAgICAgICAgKyAiLiIgKyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7DQotICAgIC8vY3VzdG9tIGNsYXNzIHdoaWNoIGlzIGFuIG9wdGlvbmFsIHJlcGxhY2VtZW50IGZvciB0aGlzIGNsYXNzIChoYXMgdG8gZXh0ZW5kIHRoaXMgY2xhc3MpDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CRUFOID0gKEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FDQotICAgICAgICArICIuY3VzdG9tLiIgKyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOw0KLQ0KLSAgICBwdWJsaWMgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc2V0dXBDdXN0b21pemFibGVJbmZvcm1hdGlvbigpOw0KLSAgICAgICAgYXBwbHlDdXN0b21WYWx1ZXModGhpcy5jdXN0b21pemFibGVJbmZvcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8Q3VzdG9tSW5mb3JtYXRpb24sIFN0cmluZz4gY3VzdG9taXphYmxlSW5mb3MgPSBuZXcgSGFzaE1hcDxDdXN0b21JbmZvcm1hdGlvbiwgU3RyaW5nPigpOw0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBDdXN0b21pemFibGVJbmZvcm1hdGlvbigpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBiYXNlUGFja2FnZSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fQkFTRV9QQUNLQUdFOw0KLQ0KLSAgICAgICAgaWYgKGJhc2VQYWNrYWdlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZVBhY2thZ2UgPSBFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSArICIuY3VzdG9tLiI7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWJhc2VQYWNrYWdlLmVuZHNXaXRoKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZVBhY2thZ2UgPSBiYXNlUGFja2FnZSArICIuIjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5CQVNFX1BBQ0tBR0UsIGJhc2VQYWNrYWdlKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiwNCi0gICAgICAgICAgICAgICAgIkNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVgsDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVRyYW5zZm9ybWVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFX1JFU09MVkVSX1BPU1RGSVgsDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfSU5JVElBTElaRVIsDQotICAgICAgICAgICAgICAgICJDb21wb25lbnRJbml0aWFsaXplciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IsDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTVNHX1JFU09MVkVSX05BTUVfTUFQUEVSLA0KLSAgICAgICAgICAgICJWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSLA0KLSAgICAgICAgICAgICJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSLA0KLSAgICAgICAgICAgICJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBUlRVUF9MSVNURU5FUiwNCi0gICAgICAgICAgICAgICAgIlN0YXJ0dXBMaXN0ZW5lciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIk1lc3NhZ2VSZXNvbHZlckZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIkNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJGYWNlc01lc3NhZ2VGYWN0b3J5Iik7DQotDQotICAgICAgICAvL2NvbnZlbnRpb25zICh0aGUgcmVzdCBvZiB0aGUgY29udmVudGlvbnMgYXJlIGJ1aWx0IHdpdGggdGhlIGhlbHAgb2YgbmFtZSBtYXBwZXJzLC4uLg0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FU1NBR0VfQlVORExFX05BTUUsDQotICAgICAgICAgICAgICAgICJ2YWxpZGF0aW9uX21lc3NhZ2VzIik7DQotICAgICAgICAvL3N0YXRpYyBzdHJhdGVneSBtYXBwaW5ncyAobmFtZSBvZiBwcm9wZXJ0eSBmaWxlcykNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5TVEFUSUNfU1RSQVRFR1lfTUFQUElOR19TT1VSQ0UsDQotICAgICAgICAgICAgICAgICJzdHJhdGVneV9tYXBwaW5ncyIpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGFwcGx5Q3VzdG9tVmFsdWVzKE1hcDxDdXN0b21JbmZvcm1hdGlvbiwgU3RyaW5nPiBtYXApDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgdG8gY3VzdG9taXplIGluZm9ybWF0aW9uDQotICAgIH0NCi0NCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXQoQ3VzdG9tSW5mb3JtYXRpb24gY3VzdG9tSW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGN1c3RvbWl6YWJsZUluZm9zLmdldChjdXN0b21JbmZvcm1hdGlvbik7DQotDQotICAgICAgICBzd2l0Y2ggKGN1c3RvbUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNhc2UgQkFTRV9QQUNLQUdFOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgKiBwb3N0Zml4IHVzZWQgYnkgdGhlIFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi0gICAgICAgICAgICAgKiB0aGUgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBpcyBmb3IgY3VzdG9tIHN0cmF0ZWdpZXMgb25seQ0KLSAgICAgICAgICAgICAqIChub3QgZm9yIHB1YmxpYyB2YWxpZGF0aW9uIG1vZHVsZXMpDQotICAgICAgICAgICAgICogc28gaXQncyBmaW5lIHRvIGN1c3RvbWl6ZSBpdA0KLSAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgY2FzZSBWQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVg6DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0NCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9taXphYmxlSW5mb3MuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkJBU0VfUEFDS0FHRSkgKyB2YWx1ZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDlmODY5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2R1bGVNZXNzYWdlQnVuZGxlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuZXdQYWNrYWdlTmFtZTsNCi0gICAgICAgIGlmIChwYWNrYWdlTmFtZS5lbmRzV2l0aCgiLnJlc29sdmVyIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgbmV3UGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZS5yZXBsYWNlKCIucmVzb2x2ZXIiLCAiLmJ1bmRsZSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5ld1BhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUucmVwbGFjZSgiLnJlc29sdmVyLiIsICIuYnVuZGxlLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG5ld1BhY2thZ2VOYW1lICsgIi52YWxpZGF0aW9uX21lc3NhZ2VzIjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKA0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsICIubWVzc2FnZS5yZXNvbHZlci4iLCB0YXJnZXRDbGFzc05hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoDQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgU3RyaW5nIHRhcmdldENsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgIi5tZXRhZGF0YS50cmFuc2Zvcm1lci4iLCB0YXJnZXRDbGFzc05hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UGFja2FnZU5hbWUsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXROYW1lKCk7DQotDQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUucmVwbGFjZSgiLnN0cmF0ZWd5LiIsIHRhcmdldFBhY2thZ2VOYW1lKTsNCi0NCi0gICAgICAgIGlmICh0YXJnZXRDbGFzc05hbWUgPT0gbnVsbCB8fCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSkgKyAiLiIgKyB0YXJnZXRDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHVzZSBhIGN1c3RvbSBuYW1lIG1hcHBlciB0byBpbXBsZW1lbnQgY3VzdG9tIGNvbnZlbnRpb25zDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgIlZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB1c2UgYSBjdXN0b20gbmFtZSBtYXBwZXIgdG8gaW1wbGVtZW50IGN1c3RvbSBjb252ZW50aW9ucw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5LnJlcGxhY2UoIi5hbm5vdGF0aW9uLiIsICIuc3RyYXRlZ3kuIikgKyAiU3RyYXRlZ3kiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgIk1ldGFEYXRhVHJhbnNmb3JtZXIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0YXJnZXRQb3N0Zml4KQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5lbmRzV2l0aCgiVmFsaWRhdGlvblN0cmF0ZWd5IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneU5hbWUuc3Vic3RyaW5nKDAsIHZhbGlkYXRpb25TdHJhdGVneU5hbWUubGVuZ3RoKCkgLSAxOCkgKyB0YXJnZXRQb3N0Zml4Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5lbmRzV2l0aCgiU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5zdWJzdHJpbmcoMCwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5sZW5ndGgoKSAtIDgpICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZmFhYmUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJlbid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIC8qDQotICAgICAqIG1pc2MNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FU1NBR0VfQlVORExFID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVTU0FHRV9CVU5ETEUiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQkFTRV9QQUNLQUdFID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQkFTRV9QQUNLQUdFIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9JTkZPUk1BVElPTl9QUk9WSURFUl9CRUFOIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OX1NUUkFURUdZX01BUFBJTkciKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUiIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBuYW1lIG1hcHBlcg0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUiIpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBmYWN0b3JpZXMNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9GQUNFU19NRVNTQUdFX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9GQUNFU19NRVNTQUdFX0ZBQ1RPUlkiKTsNCi0NCi0gICAgLyoNCi0gICAgICogZGVhY3RpdmF0ZQ0KLSAgICAgKi8NCi0gICAgQERlcHJlY2F0ZWQNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX1JFTkRFUktJVCA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9SRU5ERVJLSVQiKTsNCi0NCi0gICAgLy9jdXJyZW50bHkganVzdCB1c2VkIGJ5IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfREVGQVVMVF9DT05WRU5USU9OIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9ERUZBVUxUX05BTUVfTUFQUEVSUyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9ERUZBVUxUX05BTUVfTUFQUEVSUyIpOw0KLSAgICANCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0VMX1JFU09MVkVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0VMX1JFU09MVkVSIik7DQotDQotICAgIC8vdGhlcmUgaXMgbm90aGluZyBsaWtlIERFQUNUSVZBVEVfREVGQVVMVF9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SDQotICAgIC8vdXNlIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmRlbnlSZW5kZXJlckludGVyY2VwdG9yKC4uLikgd2l0aGluIGFuIGV4dHZhbC1TdGFydHVwTGlzdGVuZXINCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0Fic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE0M2YyNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBkZXRhaWxzDQotICogQHNlZSBEZWZhdWx0RUxIZWxwZXINCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5IGN1c3RvbUVMSGVscGVyRmFjdG9yeTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21FTEhlbHBlckZhY3RvcnkoQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkgZWxIZWxwZXJGYWN0b3J5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmN1c3RvbUVMSGVscGVyRmFjdG9yeSA9IGVsSGVscGVyRmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgZmluYWwgRUxIZWxwZXIgY3JlYXRlKCkNCi0gICAgew0KLSAgICAgICAgRUxIZWxwZXIgcmVzdWx0ID0gbnVsbDsNCi0NCi0gICAgICAgIGlmKHRoaXMuY3VzdG9tRUxIZWxwZXJGYWN0b3J5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5jdXN0b21FTEhlbHBlckZhY3RvcnkuY3JlYXRlRUxIZWxwZXIoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVFTEhlbHBlcigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRUxIZWxwZXIgY3JlYXRlRUxIZWxwZXIoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTRlZTFjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsNCi1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7DQotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBpbiBvcmRlciB0byBjZW50cmFsaXplIHRoZSBqc2YgdmVyc2lvbiBkZXBlbmRlbmN5IHdpdGhpbiB0aGUgY29yZQ0KLSAqDQotICogdGhpcyBlbC1oZWxwZXIgc3VwcG9ydHMganNwIGFuZCBmYWNlbGV0cyAodGVzdGVkIHdpdGggMS4xLjE0KQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotLyoNCi0gKiB0aGVyZSBpcyBhIHNwZWNpYWwgZmFjZWxldHMgd29ya2Fyb3VuZCBmb3IgZWwtZXhwcmVzc2lvbnMgb2YgY3VzdG9tIGNvbXBvbmVudHMNCi0gKiBpdCdzIHBsdWdnYWJsZSBpbiBvcmRlciB0byBzdXBwb3J0IHNwZWNpYWwgbWVjaGFuaXNtcyBvZiBkaWZmZXJlbnQgdGVjaG5vbG9naWVzICh0aGFuIGpzcCBhbmQgZmFjZWxldHMpDQotICogc28geW91IGNhbiBwbHVnIGluIHlvdXIgb3duIGltcGwuIHdoaWNoIGltcGxlbWVudHMgYSBjdXN0b20gd29ya2Fyb3VuZCAobGlrZSB0aGUgZmFjZWxldHMgd29ya2Fyb3VuZCBvZiB0aGlzIGltcGwuKQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRFTEhlbHBlciBpbXBsZW1lbnRzIEVMSGVscGVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9FTF9SRVNPTFZFUiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0VMX1JFU09MVkVSOw0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdEVMSGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIC8vZHVlIHRvIGEgcmVzdHJpY3Rpb24gd2l0aCB0aGUgcmkNCi0gICAgICAgIE9iamVjdCBiZWFuID0gZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIHJldHVybiAoYmVhbiAhPSBudWxsKSA/IGJlYW4uZ2V0Q2xhc3MoKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRCZWFuKFN0cmluZyBiZWFuTmFtZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIHJldHVybiBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5nZXRFTFJlc29sdmVyKCkuZ2V0VmFsdWUoZmFjZXNDb250ZXh0LmdldEVMQ29udGV4dCgpLCBudWxsLCBiZWFuTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uICE9IG51bGwpID8gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZXZhbHVhdGVFeHByZXNzaW9uR2V0KA0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksIE9iamVjdC5jbGFzcykgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmV2YWx1YXRlRXhwcmVzc2lvbkdldChmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIE9iamVjdC5jbGFzcyk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQsIGJvb2xlYW4gYWxsb3dCbGFua0NoYXJhY3RlcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIC8vZm9yIGlucHV0IGNvbXBvbmVudHMgd2l0aG91dCB2YWx1ZS1iaW5kaW5nDQotICAgICAgICAvLyhlLmcuIGZvciBzcGVjaWFsIGNvbXBvbmVudCBsaWJzIC0+IGlzc3VlIHdpdGggRXh0VmFsUmVuZGVyZXJXcmFwcGVyI2VuY29kZUJlZ2luKQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudC5nZXRDbGFzcygpICsgIiBoYXMgbm8gdmFsdWUgYmluZGluZyAtIGNvbXBvbmVudCBpZDogIiArIHVpQ29tcG9uZW50LmdldElkKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKCFhbGxvd0JsYW5rQ2hhcmFjdGVycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlKCIgIiwgIiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pLmdldEJhc2VFeHByZXNzaW9uKCkpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXN1bHQgPSBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuDQotICAgICAgICAgICAgICAgIHRyeVRvQ3JlYXRlVmFsdWVCaW5kaW5nRm9yRmFjZWxldHNCaW5kaW5nKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCByZXNvbHZlIGV4cHJlc3Npb246ICIgKyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgIC5nZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgcmVzdWx0LmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLQ0KLSAgICAgICAgICAgIGlmKGVudGl0eUNsYXNzID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgcmVzb2x2ZSBleHByZXNzaW9uOiAiICsgcmVzdWx0LmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYoInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoREVBQ1RJVkFURV9FTF9SRVNPTFZFUikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5RGV0YWlsc1ZpYVJlZmxlY3Rpb25GYWxsYmFjayh1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgRXh0VmFsRUxSZXNvbHZlciBlbFJlc29sdmVyID0gbmV3IEV4dFZhbEVMUmVzb2x2ZXIoZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZ2V0RUxSZXNvbHZlcigpKTsNCi0gICAgICAgIEVMQ29udGV4dCBlbENvbnRleHQgPSBFeHRWYWxFTFJlc29sdmVyLmNyZWF0ZUNvbnRleHRXcmFwcGVyKGZhY2VzQ29udGV4dC5nZXRFTENvbnRleHQoKSwgZWxSZXNvbHZlcik7DQotDQotICAgICAgICBWYWx1ZUV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uID0gdWlDb21wb25lbnQuZ2V0VmFsdWVFeHByZXNzaW9uKCJ2YWx1ZSIpOw0KLQ0KLSAgICAgICAgaWYodmFsdWVFeHByZXNzaW9uID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWx1ZUV4cHJlc3Npb24uc2V0VmFsdWUoZWxDb250ZXh0LCBudWxsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAiZXJyb3IgYXQgYmluZGluZzogIiArIHZhbHVlRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkgKw0KLSAgICAgICAgICAgICAgICAiIC0tIGFuIGVsLXJlc29sdmVyIGVycm9yIG9jY3VycmVkISBtYXliZSB5b3UgdXNlZCBhbiBpbnZhbGlkIGJpbmRpbmcuIG90aGVyd2lzZTogIiArDQotICAgICAgICAgICAgICAgICJwbGVhc2UgcmVwb3J0IHRoZSBpc3N1ZSwgZGVhY3RpdmF0ZSB0aGUgZWwtcmVzb3ZsZXIgb2YgZXh0dmFsIHZpYSB3ZWIueG1sIGNvbnRleHQtcGFyYW06ICIgKw0KLSAgICAgICAgICAgICAgICBFeHRWYWxJbmZvcm1hdGlvbi5XRUJYTUxfUEFSQU1fUFJFRklYICsgIi5ERUFDVElWQVRFX0VMX1JFU09MVkVSIiArDQotICAgICAgICAgICAgICAgICIgYW5kIHRlc3QgYWdhaW4uIiwgdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihlbFJlc29sdmVyLmdldFBhdGgoKSA9PSBudWxsIHx8IGVsUmVzb2x2ZXIuZ2V0QmFzZU9iamVjdCgpID09IG51bGwgfHwgZWxSZXNvbHZlci5nZXRQcm9wZXJ0eSgpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscyhlbFJlc29sdmVyLmdldFBhdGgoKSwgZWxSZXNvbHZlci5nZXRCYXNlT2JqZWN0KCksIGVsUmVzb2x2ZXIuZ2V0UHJvcGVydHkoKSk7DQotICAgIH0NCi0NCi0gICAgLy9rZWVwIGluIHN5bmMgd2l0aCBEZWZhdWx0RUxIZWxwZXIjZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcgb2YgYnJhbmNoISEhDQotICAgIHByaXZhdGUgUHJvcGVydHlEZXRhaWxzIGdldFByb3BlcnR5RGV0YWlsc1ZpYVJlZmxlY3Rpb25GYWxsYmFjayhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IGdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24odWlDb21wb25lbnQsIGZhbHNlKTsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24gPQ0KLSAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0NCi0gICAgICAgIFN0cmluZyBwYXRoID0gbnVsbDsNCi0NCi0gICAgICAgIHdoaWxlKGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihwYXRoID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwYXRoID0gZ2V0UHJvcGVydHlOYW1lKGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcGF0aCA9IGdldFByb3BlcnR5TmFtZShjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbikgKyAiLiIgKyBwYXRoOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBwYXRoID0gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSArICIuIiArIHBhdGg7DQotDQotICAgICAgICBPYmplY3QgYmFzZU9iamVjdCA9IGdldFZhbHVlT2ZFeHByZXNzaW9uKGZhY2VzQ29udGV4dCwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpKTsNCi0NCi0gICAgICAgIC8vaW4gY2FzZSBvZiBlLmcuOiAje2JlYW5bYmVhbi5wYXNzd29yZFJlcGVhdGVkUHJvcGVydHlOYW1lXX0NCi0gICAgICAgIC8vLT4gYmVhbi5wYXNzd29yZFJlcGVhdGVkUHJvcGVydHlOYW1lIGlzIG5vdCB0aGUgZmluYWwgcHJvcGVydHkgbmFtZQ0KLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURldGFpbHMocGF0aCwgYmFzZU9iamVjdCwgZ2V0UHJvcGVydHlOYW1lKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpOw0KLQ0KLSAgICAgICAgaWYocHJvcGVydHlOYW1lLmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gZXh0cmFjdFByb3BlcnR5TmFtZU9mUHJvcGVydHlQYXRoKHByb3BlcnR5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcHJvcGVydHlOYW1lOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJzdXBwb3J0IGZvciBtb3JlIGR5bmFtaWMgYmluZGluZ3MgLSBkZXRhaWxzIHNlZSBpbmxpbmUiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBleHRyYWN0UHJvcGVydHlOYW1lT2ZQcm9wZXJ0eVBhdGgoU3RyaW5nIHByb3BlcnR5Q2hhaW4pDQotICAgIHsNCi0gICAgICAgIFN0cmluZ1tdIHByb3BlcnRpZXMgPSBwcm9wZXJ0eUNoYWluLnNwbGl0KCJcXC4iKTsNCi0NCi0gICAgICAgIE9iamVjdCBjdXJyZW50UHJvcGVydHlWYWx1ZSA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbihwcm9wZXJ0aWVzWzBdKTsNCi0NCi0gICAgICAgIE1ldGhvZCBjdXJyZW50TWV0aG9kOw0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRQcm9wZXJ0eU5hbWU7DQotICAgICAgICBmb3IoaW50IGkgPSAxOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50UHJvcGVydHlOYW1lID0gcHJvcGVydGllc1tpXTsNCi0gICAgICAgICAgICBjdXJyZW50TWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKGN1cnJlbnRQcm9wZXJ0eVZhbHVlLmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICJnZXQiICsgY3VycmVudFByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIGN1cnJlbnRQcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpKTsNCi0NCi0gICAgICAgICAgICBpZihjdXJyZW50TWV0aG9kID09IG51bGwgJiYgY3VycmVudFByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBNYXApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL2l0J3Mgb2sgZm9yIHRoZSBzaW1wbGUgbWFwIGNhc2UgLSBidXQgbm90IGZvciBlLmcuOg0KLSAgICAgICAgICAgICAgICAvLyN7YmVhbjFbYmVhbjIucHJvcGVydHlOYW1lUHJvdmlkZXJbIGJlYW4zLmluZGV4XV19DQotICAgICAgICAgICAgICAgIC8vb3IgZXZlcnkgb3RoZXIgY29tcGxleCByZXBsYWNlbWVudCBmb3IgYmVhbjMuaW5kZXgNCi0gICAgICAgICAgICAgICAgLy9pdCBtaWdodCBhbHNvIHJlcXVpcmUgYW4gYWRqdXN0bWVudCBhdCBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIjdHJ5VG9UcmFuc2Zvcm1Ub1JlYWxCaW5kaW5nDQotICAgICAgICAgICAgICAgICgoTWFwKWN1cnJlbnRQcm9wZXJ0eVZhbHVlKS5nZXQoY3VycmVudFByb3BlcnR5TmFtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eVZhbHVlID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKGN1cnJlbnRQcm9wZXJ0eVZhbHVlLCBjdXJyZW50TWV0aG9kKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZihjdXJyZW50UHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFN0cmluZyljdXJyZW50UHJvcGVydHlWYWx1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoInVuZXhwZWN0ZWQgdmFsdWUgd2l0aGluIG1hcCBzeW50YXg6ICIgKyBwcm9wZXJ0eUNoYWluICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGxhc3QgcHJvcGVydHkgbmFtZTogIiArIGN1cnJlbnRQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgc3RhdGljIFN0cmluZyBnZXRPcmlnaW5hbFZhbHVlQmluZGluZ0V4cHJlc3Npb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFZhbHVlRXhwcmVzc2lvbiB2YWx1ZUV4cHJlc3Npb24gPSB1aUNvbXBvbmVudC5nZXRWYWx1ZUV4cHJlc3Npb24oInZhbHVlIik7DQotDQotICAgICAgICByZXR1cm4gKHZhbHVlRXhwcmVzc2lvbiAhPSBudWxsKSA/IHZhbHVlRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtV2VsbEZvcm1lZChPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBWYWx1ZUJpbmRpbmcgfHwgbyBpbnN0YW5jZW9mIEV4dGVybmFsaXphYmxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBzID0gby50b1N0cmluZygpOw0KLSAgICAgICAgcmV0dXJuICgocy5jb250YWlucygiIyIpIHx8IHMuY29udGFpbnMoIiQiKSkgJiYgcy5jb250YWlucygieyIpICYmIHMuY29udGFpbnMoIn0iKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRCaW5kaW5nT2ZDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQuZ2V0VmFsdWVFeHByZXNzaW9uKG5hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2ZlNTZjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRFTEhlbHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeQ0KLXsNCi0gICAgcHJpdmF0ZSBFTEhlbHBlciBlbEhlbHBlciA9IG5ldyBEZWZhdWx0RUxIZWxwZXIoKTsNCi0gICAgDQotICAgIHByb3RlY3RlZCBFTEhlbHBlciBjcmVhdGVFTEhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmVsSGVscGVyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FTEhlbHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYjI1NTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogaW4gb3JkZXIgdG8gY2VudHJhbGl6ZSB0aGUganNmIHZlcnNpb24gZGVwZW5kZW5jeSB3aXRoaW4gdGhlIGNvcmUNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRUxIZWxwZXINCi17DQotICAgIE9iamVjdCBnZXRCZWFuKFN0cmluZyBiZWFuTmFtZSk7DQotDQotICAgIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLQ0KLSAgICBDbGFzcyBnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCk7DQotDQotICAgIGJvb2xlYW4gaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIGJvb2xlYW4gaXNFTFRlcm1XZWxsRm9ybWVkKE9iamVjdCBvKTsNCi0NCi0gICAgT2JqZWN0IGdldEJpbmRpbmdPZkNvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgU3RyaW5nIG5hbWUpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRXh0VmFsRUxSZXNvbHZlci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0V4dFZhbEVMUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1ODk2My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRXh0VmFsRUxSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5lbC5FTFJlc29sdmVyOwotaW1wb3J0IGphdmF4LmVsLkVMQ29udGV4dDsKLWltcG9ydCBqYXZheC5lbC5WYXJpYWJsZU1hcHBlcjsKLWltcG9ydCBqYXZheC5lbC5GdW5jdGlvbk1hcHBlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEuYmVhbnMuRmVhdHVyZURlc2NyaXB0b3I7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGNsYXNzIEV4dFZhbEVMUmVzb2x2ZXIgZXh0ZW5kcyBFTFJlc29sdmVyCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgRUxSZXNvbHZlciB3cmFwcGVkOwotICAgIHByaXZhdGUgT2JqZWN0IGJhc2VPYmplY3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7Ci0gICAgLy9mb3JtcyB0aGUgaWQgZm9yIGNyb3NzLXZhbGlkYXRpb24gd2l0aGluIGNvbXBsZXggY29tcG9uZW50cwotICAgIHByaXZhdGUgU3RyaW5nIGV4cHJlc3Npb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGF0aFJlY29yZGluZ1N0b3BwZWQgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBFeHRWYWxFTFJlc29sdmVyKEVMUmVzb2x2ZXIgZWxSZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IGVsUmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRCYXNlT2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgiZXh0cmFjdGVkIHBhdGg6ICIgKyB0aGlzLmV4cHJlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKQotICAgIHsKLSAgICAgICAgdGhpcy5iYXNlT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IG51bGw7Ci0gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcGF0aCByZWNvcmRpbmcgaXMgcGVyZm9ybWVkIHRvIGdldCBhIGtleSBmb3IgY3Jvc3MtdmFsaWRhdGlvbjxici8+Ci0gICAgICogZXZlcnkgYmFzZSBhZnRlciB0aGUgZmlyc3QgY2FsbCB3aGljaCBpcyBudWxsIHN0b3BzIHJlY29yZGluZzxici8+Ci0gICAgICogd2l0aCBhIGR5bmFtaWMgbWFwIHN5bnRheCB0aGUgbGFzdCBwcm9wZXJ0eSBpbiB0aGUgbWlkZGxlIG9mIGFuIGV4cHJlc3Npb24gaGFzIHRvIGJlIGEgc3RyaW5nLgotICAgICAqIHN1Y2ggYSBzdHJpbmcgcmVzdWx0IGNvbnRpbnVlcyB0aGUgcGF0aCByZWNvcmRpbmcgYXQgdGhlIG5leHQgY2FsbCBmb3IgdGhlIGN1cnJlbnQgZXhwcmVzc2lvbi4KLSAgICAgKiA8cC8+Ci0gICAgICogZXhhbXBsZTogI3tiZWFuW2JlYW4ucHJvcGVydHlOYW1lUHJvdmlkZXJbJ25hbWVPZlByb3BlcnR5MSddXVsnZHluQmVhbiddLnByb3BlcnR5fQotICAgICAqIDxwLz4KLSAgICAgKiBsaW1pdGF0aW9uIGZvciBjcm9zcy12YWxpZGF0aW9uOiBuYW1lT2ZQcm9wZXJ0eTEgaGFzIHRvIGJlIG9mIHR5cGUgc3RyaW5nLgotICAgICAqIG90aGVyIGtleSB0eXBlcyBhcmVuJ3Qgc3VwcG9ydGVkIHlldAotICAgICAqCi0gICAgICogQHBhcmFtIGVsQ29udGV4dCB3cmFwcGVkIGVsLWNvbnRleHQKLSAgICAgKiBAcGFyYW0gYmFzZSBjdXJyZW50IGJhc2UKLSAgICAgKiBAcGFyYW0gcHJvcGVydHkgcHJvcGVydHkgdG8gcmVzb2x2ZQotICAgICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBkZWxlZ2F0ZWQgbWV0aG9kIGNhbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBiYXNlLCBPYmplY3QgcHJvcGVydHkpCi0gICAgewotICAgICAgICBPYmplY3QgcmVzdWx0ID0gdGhpcy53cmFwcGVkLmdldFZhbHVlKGVsQ29udGV4dCwgYmFzZSwgcHJvcGVydHkpOwotCi0gICAgICAgIC8vdmVyeSBmaXJzdCBjYWxsIGZvciBhbiBleHByZXNzaW9uCi0gICAgICAgIGlmKHRoaXMuZXhwcmVzc2lvbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSAoU3RyaW5nKXByb3BlcnR5OwotICAgICAgICB9Ci0gICAgICAgIC8vI3tiZWFuW2R5bkJhc2UucHJvcGVydHlOYW1lXX0gLT4gYmFzZSBvZiBkeW5CYXNlIGlzIG51bGwgLT4gc3RvcCBwYXRoIHJlY29yZGluZwotICAgICAgICBlbHNlIGlmKGJhc2UgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pc1BhdGhSZWNvcmRpbmdTdG9wcGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gcHJvcGVydHlFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKXByb3BlcnR5OwotICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHlOYW1lLnN1YnN0cmluZygxKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoYmFzZSBpbnN0YW5jZW9mIE1hcCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCgoTWFwKWJhc2UpLmNvbnRhaW5zS2V5KHByb3BlcnR5KSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoYmFzZS5nZXRDbGFzcygpLmdldE1ldGhvZCgiZ2V0IiArIHByb3BlcnR5TmFtZSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihiYXNlLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJpcyIgKyBwcm9wZXJ0eU5hbWUpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoInByb3BlcnR5OiAiICsgcHJvcGVydHkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzbid0IHVzZWQgZm9yIHBhdGggLSBpdCBpc24ndCBhIHByb3BlcnR5IG9mICIgKyBiYXNlLmdldENsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2UuZy46ICN7YmVhbi5zdWJCYXNlLnByb3BlcnR5fSAtPiBoZXJlIHdlIGFyZSBhdCBzdWJCYXNlCi0gICAgICAgICAgICBpZihwcm9wZXJ0eUV4aXN0cyAmJiAhdGhpcy5pc1BhdGhSZWNvcmRpbmdTdG9wcGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbiArPSAiLiIgKyBwcm9wZXJ0eTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYocHJvcGVydHlFeGlzdHMgJiYgcmVzdWx0IGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuaXNQYXRoUmVjb3JkaW5nU3RvcHBlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgaWYodGhpcy5pc1BhdGhSZWNvcmRpbmdTdG9wcGVkICYmIHJlc3VsdCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uICs9ICIuIiArIHByb3BlcnR5OwotICAgICAgICB9Ci0gICAgICAgICovCi0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0VHlwZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbywgT2JqZWN0IG8xKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0VHlwZShlbENvbnRleHQsIG8sIG8xKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbywgT2JqZWN0IG8xLCBPYmplY3QgbzIpCi0gICAgewotICAgICAgICBleHByZXNzaW9uICs9ICIuIiArIG8xOwotICAgICAgICBwcm9wZXJ0eSA9IChTdHJpbmcpbzE7Ci0gICAgICAgIGJhc2VPYmplY3QgPSBvOwotICAgICAgICBlbENvbnRleHQuc2V0UHJvcGVydHlSZXNvbHZlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvLCBPYmplY3QgbzEpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5pc1JlYWRPbmx5KGVsQ29udGV4dCwgbywgbzEpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxGZWF0dXJlRGVzY3JpcHRvcj4gZ2V0RmVhdHVyZURlc2NyaXB0b3JzKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0RmVhdHVyZURlc2NyaXB0b3JzKGVsQ29udGV4dCwgbyk7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzPD8+IGdldENvbW1vblByb3BlcnR5VHlwZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbykKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENvbW1vblByb3BlcnR5VHlwZShlbENvbnRleHQsIG8pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRUxDb250ZXh0IGNyZWF0ZUNvbnRleHRXcmFwcGVyKGZpbmFsIEVMQ29udGV4dCBjb250ZXh0LCBmaW5hbCBFTFJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFTENvbnRleHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRMb2NhbGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVJlc29sdmVkKGJvb2xlYW4gdmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuc2V0UHJvcGVydHlSZXNvbHZlZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRQcm9wZXJ0eVJlc29sdmVkKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwdXRDb250ZXh0KENsYXNzIGNsYXp6LCBPYmplY3Qgb2JqZWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyLnB1dENvbnRleHQoY2xhenosIG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5wdXRDb250ZXh0KGNsYXp6LCBvYmplY3QpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udGV4dChDbGFzcyBjbGF6eikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRDb250ZXh0KGNsYXp6KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvY2FsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlci5zZXRMb2NhbGUobG9jYWxlKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldExvY2FsZShsb2NhbGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBFTFJlc29sdmVyIGdldEVMUmVzb2x2ZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgRnVuY3Rpb25NYXBwZXIgZ2V0RnVuY3Rpb25NYXBwZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldEZ1bmN0aW9uTWFwcGVyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFZhcmlhYmxlTWFwcGVyIGdldFZhcmlhYmxlTWFwcGVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRWYXJpYWJsZU1hcHBlcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0ZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0ZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjJiODlmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogSGVscGVyIGNsYXNzIHRvIGdldCB0aGUgcmVhbC9mdWxsIHZhbHVlIGJpbmRpbmcgLSB0ZXN0ZWQgd2l0aCBmYWNlbGV0cyAxLjEuMTQNCi0gKiBUaGUgdGFyZ2V0IGlzIHRvIGdldCByaWQgb2YgdGhpcyBpbXBsLiAtIGN1cnJlbnRseSBpdCdzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IGN1c3RvbSBmYWNlbGV0cyBjb21wb25lbnRzLg0KLSAqIEFuIGFsdGVybmF0aXZlIHdvdWxkIGJlIGFuIEVMLVJlc29sdmVyIC0gdGhlcmUgYXJlIHN0aWxsIHNvbWUgb3BlbiBpc3N1ZXMgd2l0aCBzdWNoIGFuIGFwcHJvYWNoDQotICogKyBJdCBpc24ndCBhdmFpbGFibGUgd2l0aCBKU0YgMS4xLngNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9DcmVhdGVWYWx1ZUJpbmRpbmdGb3JGYWNlbGV0c0JpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBEZWZhdWx0RUxIZWxwZXIuZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEJpbmRpbmdzID0gZXh0cmFjdEVMVGVybXMoDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmluZGluZ09mQ29tcG9uZW50KHVpQ29tcG9uZW50LCAidmFsdWUiKSk7DQotDQotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZT0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIDEpICsgInsiICsgY3JlYXRlQmluZGluZyhmb3VuZEJpbmRpbmdzLCBtYXBwZWRGYWNlbGV0c1ZhcnMpICsgIn0iKTsNCi0NCi0gICAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YmUuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotDQotICAgICAgICAgICAgaWYoZW50aXR5Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnlUb1JlcGxhY2VWYXJzKHZiZSwgbWFwcGVkRmFjZWxldHNWYXJzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHZiZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVCaW5kaW5nKExpc3Q8U3RyaW5nPiBleHByZXNzaW9ucywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkZWRWaXJ0dWFsTmFtZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGVudHJ5IDogZXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoIlZhbHVlRXhwcmVzc2lvblsiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBmb3VuZEJpbmRpbmdEZXRhaWxzID0gZW50cnkuc3BsaXQoIiAiKTsNCi0gICAgICAgICAgICBpbmRleE9mQmluZGluZ0RldGFpbHMgPSBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKGZvdW5kQmluZGluZ0RldGFpbHMpOw0KLQ0KLSAgICAgICAgICAgIGlmIChpbmRleE9mQmluZGluZ0RldGFpbHMgPT0gLTEpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgYmluZGluZ0RldGFpbHMgPSBmb3VuZEJpbmRpbmdEZXRhaWxzW2luZGV4T2ZCaW5kaW5nRGV0YWlsc10uc3BsaXQoIj0iKTsNCi0NCi0gICAgICAgICAgICBpZiAoYmluZGluZ0RldGFpbHMubGVuZ3RoIDwgMikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGJpbmRpbmdEZXRhaWxzWzFdOw0KLQ0KLSAgICAgICAgICAgIC8vdG8gc3VwcG9ydCBibGFua3Mgd2l0aGluIGEgYmluZGluZyB3aXRoIG1hcCBzeW50YXgNCi0gICAgICAgICAgICBpZihjdXJyZW50QmluZGluZy5jb250YWlucygieyIpICYmICFjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgPSBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKGN1cnJlbnRCaW5kaW5nLCBmb3VuZEJpbmRpbmdEZXRhaWxzLCBpbmRleE9mQmluZGluZ0RldGFpbHMpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnNLZXkoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5wdXQoYmluZGluZ0RldGFpbHNbMF0sIGN1cnJlbnRCaW5kaW5nKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvL2VudHJ5IGZvciAidmlydHVhbCIgZmFjZWxldHMgdmFyDQotICAgICAgICAgICAgaWYoIShjdXJyZW50QmluZGluZy5jb250YWlucygieyIpIHx8IGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhcnMucHV0KGJpbmRpbmdEZXRhaWxzWzBdLCBiaW5kaW5nRGV0YWlsc1sxXS5zdWJzdHJpbmcoMSwgYmluZGluZ0RldGFpbHNbMV0ubGVuZ3RoKCktMikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBvcmlnaW5hbEJpbmRpbmcgPSBhZGRlZFZpcnR1YWxOYW1lcy5nZXQoInZhbHVlIik7DQotICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcuc3Vic3RyaW5nKG9yaWdpbmFsQmluZGluZy5pbmRleE9mKCJ7IikgKyAxLCBvcmlnaW5hbEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLnJlbW92ZSgidmFsdWUiKTsNCi0gICAgICAgIHJldHVybiB0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcob3JpZ2luYWxCaW5kaW5nLCBhZGRlZFZpcnR1YWxOYW1lcywgdmlydHVhbFZhcnMpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcoDQotICAgICAgICAgICAgU3RyaW5nIG9yaWdpbmFsQmluZGluZywgTWFwPFN0cmluZywgU3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gIiN7IiArIG9yaWdpbmFsQmluZGluZyArICJ9IjsNCi0gICAgICAgIEl0ZXJhdG9yIG5hbWVJdGVyYXRvciA9IGFkZGVkVmlydHVhbE5hbWVzLmtleVNldCgpLml0ZXJhdG9yKCk7DQotDQotICAgICAgICBTdHJpbmcgY3VycmVudEtleTsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50VmFsdWU7DQotICAgICAgICB3aGlsZShuYW1lSXRlcmF0b3IuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRLZXkgPSAoU3RyaW5nKSBuYW1lSXRlcmF0b3IubmV4dCgpOw0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGFkZGVkVmlydHVhbE5hbWVzLmdldChjdXJyZW50S2V5KTsNCi0gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGN1cnJlbnRWYWx1ZS5pbmRleE9mKCJ7IikgKyAxLCBjdXJyZW50VmFsdWUuaW5kZXhPZigifSIpKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIi4iLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJ7IiArIGN1cnJlbnRLZXkgKyAiWyIsICJ7IiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICIuIiwgIi4iICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiLiIgKyBjdXJyZW50S2V5ICsgIlsiLCAiLiIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiXSIsICJbJyIgKyBjdXJyZW50VmFsdWUgKyAiJ10iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIlsiLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiLiIsICJbIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICB9DQotDQotICAgICAgICBuYW1lSXRlcmF0b3IgPSB2aXJ0dWFsVmFycy5rZXlTZXQoKS5pdGVyYXRvcigpOw0KLQ0KLSAgICAgICAgd2hpbGUobmFtZUl0ZXJhdG9yLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50S2V5ID0gKFN0cmluZykgbmFtZUl0ZXJhdG9yLm5leHQoKTsNCi0NCi0gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSB2aXJ0dWFsVmFycy5nZXQoY3VycmVudEtleSk7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoInsiICsgY3VycmVudEtleSArICIuIiwgInsiICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIlsiLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCIuIiArIGN1cnJlbnRLZXkgKyAiLiIsICIuIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICJbIiwgIi4iICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIl0iLCAiWyciICsgY3VycmVudFZhbHVlICsgIiddIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIlsiICsgY3VycmVudEtleSArICJbIiwgIlsiICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIi4iLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG9yaWdpbmFsQmluZGluZy5zdWJzdHJpbmcoMiwgb3JpZ2luYWxCaW5kaW5nLmxlbmd0aCgpIC0gMSk7DQotICAgIH0NCi0NCi0gICAgLy90byBzdXBwb3J0IGJsYW5rcyAtIGUuZy4gd2l0aCBtYXAgc3ludGF4DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKFN0cmluZyBjdXJyZW50QmluZGluZywgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlscykNCi0gICAgew0KLSAgICAgICAgZm9yKGludCBpID0gaW5kZXhPZkJpbmRpbmdEZXRhaWxzICsgMTsgaSA8IGZvdW5kQmluZGluZ0RldGFpbHMubGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgKz0gZm91bmRCaW5kaW5nRGV0YWlsc1tpXTsNCi0gICAgICAgICAgICBpZihmb3VuZEJpbmRpbmdEZXRhaWxzW2ldLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEJpbmRpbmc7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRCaW5kaW5nOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBpbnQgY291bnQgPSAwOw0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBiaW5kaW5nRGV0YWlscykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuY29udGFpbnMoIj0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY291bnQrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZXh0cmFjdEVMVGVybXMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlRUxUZXJtcyhvLCBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKSwgZm91bmRFTFRlcm1zLCAwKSA+IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRFTFRlcm1zOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcmVzb2x2ZUVMVGVybXMoT2JqZWN0IG8sIE1hcDxPYmplY3QsIE9iamVjdD4gdmlzaXRlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMsIGludCBjb3VudCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAobyA9PSBudWxsIHx8IHZpc2l0ZWQuY29udGFpbnNLZXkobykgfHwgY291bnQgPiA1MCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZpc2l0ZWQucHV0KG8sIG51bGwpOw0KLQ0KLSAgICAgICAgaW50IGVsQ291bnQgPSAwOw0KLSAgICAgICAgQ2xhc3MgYyA9IG8uZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIC8vaW5zcGVjdCBtYXBzDQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1hcCkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBmb3IgKE9iamVjdCBlbnRyeSA6ICgoTWFwKSBvKS52YWx1ZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZm91bmQgZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICAgICAgaWYoZW50cnkudG9TdHJpbmcoKS5jb250YWlucygiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKGVudHJ5LnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoZW50cnksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGVsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQobykpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gKytlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9hbmFseXplIGFycmF5cw0KLSAgICAgICAgaWYgKGMuaXNBcnJheSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgobyk7DQotICAgICAgICAgICAgLy9jaGVjayBhcnJheSBbTCAtPiBubyBhcnJheSBvZiBwcmltaXRpdmUgdHlwZXMNCi0gICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMamF2YS5sYW5nLlN0cmluZyIpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChBcnJheS5nZXQobywgaSkpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKEFycmF5LmdldChvLCBpKSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxGaWVsZD4gYXR0cmlidXRlcyA9IGZpbmRBbGxBdHRyaWJ1dGVzKGMsIG5ldyBBcnJheUxpc3Q8RmllbGQ+KCkpOw0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBhdHRyaWJ1dGVzLnRvQXJyYXkobmV3IEZpZWxkW2F0dHJpYnV0ZXMuc2l6ZSgpXSk7DQotDQotICAgICAgICBBY2Nlc3NpYmxlT2JqZWN0LnNldEFjY2Vzc2libGUoZmllbGRzLCB0cnVlKTsNCi0gICAgICAgIGZvciAoRmllbGQgY3VycmVudEZpZWxkIDogZmllbGRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQuZ2V0KG8pID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5nZXRUeXBlKCkuZXF1YWxzKFN0cmluZy5jbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmdldChvKSAhPSBudWxsICYmIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKGN1cnJlbnRGaWVsZC5nZXQobykpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFjdXJyZW50RmllbGQuZ2V0VHlwZSgpLmlzUHJpbWl0aXZlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKGN1cnJlbnRGaWVsZC5nZXQobyksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZWxDb3VudDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEZpZWxkPiBmaW5kQWxsQXR0cmlidXRlcyhDbGFzcyBjLCBMaXN0PEZpZWxkPiBhdHRyaWJ1dGVzKQ0KLSAgICB7DQotICAgICAgICBpZiAoYyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluZEFsbEF0dHJpYnV0ZXMoYy5nZXRTdXBlcmNsYXNzKCksIGF0dHJpYnV0ZXMpOw0KLQ0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBjLmdldERlY2xhcmVkRmllbGRzKCk7DQotICAgICAgICBmb3IgKEZpZWxkIGN1cnJlbnRGaWVsZCA6IGZpZWxkcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzU3RhdGljKGN1cnJlbnRGaWVsZC5nZXRNb2RpZmllcnMoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChjdXJyZW50RmllbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9SZXBsYWNlVmFycyhWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eTsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0gICAgICAgIGJvb2xlYW4gbGFzdCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgd2hpbGUodHJ1ZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxhc3QgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0NCi0gICAgICAgICAgICBwcm9wZXJ0eSA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbg0KLSAgICAgICAgICAgICAgICAucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIGdldE5ld1Byb3BlcnR5KHByb3BlcnR5LCBtYXBwZWRGYWNlbGV0c1ZhcnMpKTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQubGVuZ3RoKCkgPT0gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpICsgIi4iICsgcmVzdWx0Ow0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpOw0KLQ0KLSAgICAgICAgICAgIGlmKGxhc3QpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcmVmaXgoKSArICJ7IiArIHJlc3VsdCArICJ9Iik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5ld1Byb3BlcnR5KFN0cmluZyBvbGRQcm9wZXJ0eSwgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFycyA9IGdldFBvdGVudGlhbFZpcnR1YWxWYXJzKG9sZFByb3BlcnR5KTsNCi0NCi0gICAgICAgIGZvcihTdHJpbmcgdmlydHVhbFZhciA6IHZpcnR1YWxWYXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1hcHBlZEZhY2VsZXRzVmFycy5jb250YWluc0tleSh2aXJ0dWFsVmFyKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG9sZFByb3BlcnR5ID0gcmVwbGFjZVByb3BlcnR5VmFsdWUob2xkUHJvcGVydHksIHZpcnR1YWxWYXIsIG1hcHBlZEZhY2VsZXRzVmFycy5nZXQodmlydHVhbFZhcikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvbGRQcm9wZXJ0eTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0UG90ZW50aWFsVmlydHVhbFZhcnMoU3RyaW5nIG9sZFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpbnQgc3RhcnQgPSAtMTsNCi0gICAgICAgIGludCBlbmQgPSAtMTsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG9sZFByb3BlcnR5Lmxlbmd0aCgpOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoc3RhcnQgPT0gLSAxICYmIG9sZFByb3BlcnR5LmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKChzdGFydCAhPSAtIDEgJiYgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICdbJykgfHwgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICddJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGVuZCA9IGk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKHN0YXJ0ICE9IC0xICYmIGVuZCAhPSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJMaXN0LmFkZChvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOw0KLSAgICAgICAgICAgICAgICBpZihvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbmQgPSAtMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlydHVhbFZhckxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcGxhY2VQcm9wZXJ0eVZhbHVlKFN0cmluZyBvbGRQcm9wZXJ0eSwgU3RyaW5nIHRhcmdldFZhciwgU3RyaW5nIG5ld1ZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpbnQgaW5kZXggPSBvbGRQcm9wZXJ0eS5pbmRleE9mKHRhcmdldFZhcik7DQotDQotICAgICAgICBpZihpbmRleCA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gb2xkUHJvcGVydHk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gb2xkUHJvcGVydHkuc3Vic3RyaW5nKDAsIGluZGV4KTsNCi0gICAgICAgIHJlc3VsdCArPSBuZXdWYWx1ZTsNCi0gICAgICAgIHJldHVybiByZXN1bHQgKyBvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoaW5kZXggKyB0YXJnZXRWYXIubGVuZ3RoKCksIG9sZFByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiByZXBsYWNlIHZpcnR1YWwgZmFjZWxldHMgdmFycyAobWFwIHN5bnRheCkNCi0gICAgICogdGVzdGVkIHN0eWxlcyAoc2ltcGxlIGFuZCBuZXN0ZWQpOiB0ZXN0W2l4W2l4MltpeDNdXV0NCi0gICAgICovDQotICAgIC8qDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBfY3JlYXRlQmluZGluZyhMaXN0PFN0cmluZz4gZXhwcmVzc2lvbnMsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmlydHVhbFZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0NCi0gICAgICAgIFN0cmluZyBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50QmluZGluZzsNCi0gICAgICAgIFN0cmluZyBwYXJ0T2ZCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBleHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aCgiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZvdW5kQmluZGluZ0RldGFpbHMgPSBlbnRyeS5zcGxpdCgiICIpOw0KLSAgICAgICAgICAgIGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoZm91bmRCaW5kaW5nRGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9PSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBiaW5kaW5nRGV0YWlscyA9IGZvdW5kQmluZGluZ0RldGFpbHNbaW5kZXhPZkJpbmRpbmdEZXRhaWxzXS5zcGxpdCgiPSIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nRGV0YWlscy5sZW5ndGggPCAyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYmluZGluZ0RldGFpbHNbMV07DQotDQotICAgICAgICAgICAgLy90byBzdXBwb3J0IGJsYW5rcyB3aXRoaW4gYSBiaW5kaW5nIHdpdGggbWFwIHN5bnRheA0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgJiYgIWN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoY3VycmVudEJpbmRpbmcsIGZvdW5kQmluZGluZ0RldGFpbHMsIGluZGV4T2ZCaW5kaW5nRGV0YWlscyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lICE9IG51bGwgJiYgY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnMoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBwYXJ0T2ZCaW5kaW5nID0gY3VycmVudEJpbmRpbmcuc3Vic3RyaW5nKGN1cnJlbnRCaW5kaW5nLmluZGV4T2YocHJldkZhY2VsZXRzQXR0cmlidXRlTmFtZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICArIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUubGVuZ3RoKCksIGN1cnJlbnRCaW5kaW5nLmluZGV4T2YoIn0iKSk7DQotDQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5hZGQoYmluZGluZ0RldGFpbHNbMF0pOw0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgcGFydE9mQmluZGluZzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICBlbHNlIGlmKCEoY3VycmVudEJpbmRpbmcuY29udGFpbnMoInsiKSB8fCBjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJzLnB1dChiaW5kaW5nRGV0YWlsc1swXSwgYmluZGluZ0RldGFpbHNbMV0uc3Vic3RyaW5nKDEsIGJpbmRpbmdEZXRhaWxzWzFdLmxlbmd0aCgpLTIpKTsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWlucyhiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLmFkZChiaW5kaW5nRGV0YWlsc1swXSk7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyZW50QmluZGluZy5zdWJzdHJpbmcoY3VycmVudEJpbmRpbmcuaW5kZXhPZigieyIpICsgMSwgY3VycmVudEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gYmluZGluZ0RldGFpbHNbMF07DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotICAgICovDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzhlYjY2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRpZmZlcmVuY2UgYmV0d2VlbiBbIGFuZCBbJyAtIHRlc3Qgd2l0aCBtb3JlIGNvbnN0ZWxsYXRpb25zIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQ0KLXB1YmxpYyBjbGFzcyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotew0KLSAgICBwcml2YXRlIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYmFzZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7DQotICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdG9rZW47DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXBsYWNlT3JBZGRQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlcGxhY2VQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1Byb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICAvL1RPRE8gYWRqdXN0bWVudHMgZm9yIGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLmVuZHNXaXRoKCInXSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYWRkUHJvcGVydHkoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBzb3VyY2VFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc291cmNlRXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgc291cmNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpOw0KLQ0KLSAgICAgICAgLy9UT0RPIGFkanVzdG1lbnRzIGZvciBpc0R5bmFtaWNCYXNlQW5kUHJvcGVydHkNCi0gICAgICAgIGlmKG5ld1Byb3BlcnR5LnN0YXJ0c1dpdGgoIlsnIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHJlc3VsdCArIG5ld1Byb3BlcnR5ICsgIn0iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ocmVzdWx0ICsgIi4iICsgbmV3UHJvcGVydHkgKyAifSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKFN0cmluZyBleHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBpZighRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQoZXhwcmVzc2lvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihleHByZXNzaW9uICsgIiBpcyBubyB2YWxpZCBlbC1leHByZXNzaW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBib29sZWFuIGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSA9IGV4cHJlc3Npb24ubGFzdEluZGV4T2YoIiddIikgPT0gLTE7DQotICAgICAgICBpbnQgaW5kZXgxID0gaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5ID8gZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiXSIpIDogZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiJ10iKTsNCi0gICAgICAgIGludCBpbmRleDIgPSBleHByZXNzaW9uLmxhc3RJbmRleE9mKCIuIik7DQotDQotICAgICAgICBpZihpbmRleDEgPiBpbmRleDIpDQotICAgICAgICB7DQotICAgICAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGluZGV4MSk7DQotDQotICAgICAgICAgICAgaW50IGluZGV4MyA9IGZpbmRJbmRleE9mU3RhcnRpbmdCcmFja2V0KGV4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIGlmKGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZyhpbmRleDMgKyAxLCBpbmRleDEpOw0KLQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoaW5kZXgzICsgMiwgaW5kZXgxKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdGhpcy5iYXNlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgzKSArICJ9Iik7DQotICAgICAgICAgICAgdGhpcy50b2tlbiA9IGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSA/ICJbIiA6ICJbJyI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKCBpbmRleDIgPiBpbmRleDEpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKGluZGV4MiArIDEsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxICk7DQotICAgICAgICAgICAgdGhpcy5iYXNlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgyKSArICJ9Iik7DQotICAgICAgICAgICAgdGhpcy50b2tlbiA9ICIuIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoMiwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpOw0KLSAgICAgICAgICAgIHRoaXMucHJlZml4ID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgMSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnRyaW0oKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYoIlsiLmVxdWFscyh0aGlzLnRva2VuKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLnZhbHVlLnN0YXJ0c1dpdGgoIiciKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlLnN1YnN0cmluZygxLCB0aGlzLnZhbHVlLmxlbmd0aCgpIC0gMSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vcmV0dXJuIHRoaXMuYmFzZS52YWx1ZSArIHRoaXMudG9rZW4gKyB0aGlzLnZhbHVlLnN1YnN0cmluZygwLCB0aGlzLnZhbHVlLmxlbmd0aCgpKSArICInXSI7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gZ2V0QmFzZUV4cHJlc3Npb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmFzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4cHJlc3Npb25TdHJpbmcoKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgYmFzZUV4cHJlc3Npb24gPSB0aGlzLmJhc2UuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLQ0KLSAgICAgICAgICAgIGlmKCJbJyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAiJ119IjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZigiWyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAiXX0iOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gYmFzZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGJhc2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSkgKyB0aGlzLnRva2VuICsgdGhpcy52YWx1ZSArICJ9IjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVmaXggKyAieyIgKyB0aGlzLnZhbHVlICsgIn0iOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5iYXNlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZS5nZXRQcmVmaXgoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJlZml4Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmJhc2Uuc2V0UHJlZml4KHByZWZpeCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEV4cHJlc3Npb25TdHJpbmcoKS5oYXNoQ29kZSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gJiYgZ2V0RXhwcmVzc2lvblN0cmluZygpDQotICAgICAgICAgICAgLmVxdWFscygoKFZhbHVlQmluZGluZ0V4cHJlc3Npb24pIHRhcmdldCkuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGludCBmaW5kSW5kZXhPZlN0YXJ0aW5nQnJhY2tldChTdHJpbmcgZXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgaW50IGNsb3NlQ291bnQgPSAwOw0KLSAgICAgICAgZm9yKGludCBpID0gZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDE7IGkgPiAwOyBpLS0pDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoZXhwcmVzc2lvbi5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2xvc2VDb3VudC0tOw0KLSAgICAgICAgICAgICAgICBpZihjbG9zZUNvdW50IDwgMCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZihleHByZXNzaW9uLmNoYXJBdChpKSA9PSAnXScpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjbG9zZUNvdW50Kys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgyZTUxNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxUPiBpbXBsZW1lbnRzIE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8TmFtZU1hcHBlcjxUPj4NCi17DQotICAgIHByaXZhdGUgTGlzdDxDbGFzcz4gZGVuaWVkTmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLQ0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVnaXN0ZXIoTmFtZU1hcHBlcjxUPiBuYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICBpZighZGVuaWVkTmFtZU1hcHBlckxpc3QuY29udGFpbnMobmFtZU1hcHBlci5nZXRDbGFzcygpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBnZXROYW1lTWFwcGVyTGlzdCgpLmFkZChuYW1lTWFwcGVyKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGVyZWdpc3RlcihDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gY2xhc3NUb0RlcmVnaXN0ZXIpDQotICAgIHsNCi0gICAgICAgIEl0ZXJhdG9yPE5hbWVNYXBwZXI8VD4+IG5hbWVNYXBwZXJJdGVyYXRvciA9IGdldE5hbWVNYXBwZXJMaXN0KCkuaXRlcmF0b3IoKTsNCi0gICAgICAgIHdoaWxlKG5hbWVNYXBwZXJJdGVyYXRvci5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobmFtZU1hcHBlckl0ZXJhdG9yLm5leHQoKS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NUb0RlcmVnaXN0ZXIuZ2V0TmFtZSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG5hbWVNYXBwZXJJdGVyYXRvci5yZW1vdmUoKTsNCi0gICAgICAgICAgICAgICAgLy9kb24ndCBicmVhayAtIGUuZy4gdG8gZGVyZWdpc3RlciBhbGwgd3JhcHBlcnMuLi4NCi0gICAgICAgICAgICAgICAgLy9icmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZGVueShDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gY2xhc3NUb0RlbnkpDQotICAgIHsNCi0gICAgICAgIGRlcmVnaXN0ZXIoY2xhc3NUb0RlbnkpOw0KLQ0KLSAgICAgICAgc3luY2hyb25pemVkIChnZXRDbGFzcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGRlbmllZE5hbWVNYXBwZXJMaXN0LmFkZChjbGFzc1RvRGVueSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IExpc3Q8TmFtZU1hcHBlcjxUPj4gZ2V0TmFtZU1hcHBlckxpc3QoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzY2MDcwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIENsYXNzTWFwcGluZ0ZhY3Rvcnk8UCwgUj4NCi17DQotICAgIFIgY3JlYXRlKFAgc291cmNlKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRGVmYXVsdEZhY3RvcnlGaW5kZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0RlZmF1bHRGYWN0b3J5RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MzJkYmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRGVmYXVsdEZhY3RvcnlGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5EZWZhdWx0RUxIZWxwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkRlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vL2R5bmFtaWMgYXBwcm9hY2ggdG8gY3JlYXRlIHRoZSBmYWN0b3JpZXMgZHVyaW5nIHRoZSBmaXJzdCByZXF1ZXN0LCB3aGVuIGEgZmFjZXMtY29udGV4dCBpcyBhdmFpbGFibGUNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RmFjdG9yeUZpbmRlciBpbXBsZW1lbnRzIEZhY3RvcnlGaW5kZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotICAgIHByb3RlY3RlZCBNYXA8RmFjdG9yeU5hbWVzLCBPYmplY3Q+IGZhY3RvcnlNYXAgPSBuZXcgSGFzaE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4oKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgRmFjdG9yeUZpbmRlciBmYWN0b3J5RmluZGVyID0gbmV3IERlZmF1bHRGYWN0b3J5RmluZGVyKCk7DQotDQotICAgIHByaXZhdGUgRGVmYXVsdEZhY3RvcnlGaW5kZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjdG9yeUZpbmRlciBnZXRJbnN0YW5jZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWN0b3J5RmluZGVyOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyBmaW5hbCA8VD4gVCBnZXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIGlmKCEoZmFjdG9yeU1hcC5jb250YWluc0tleShmYWN0b3J5TmFtZSkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRGYWN0b3J5KGZhY3RvcnlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoVClmYWN0b3J5TWFwLmdldChmYWN0b3J5TmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgc3dpdGNoIChmYWN0b3J5TmFtZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjYXNlIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlTWVzc2FnZVJlc29sdmVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBSRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBFTF9IRUxQRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZUVMSGVscGVyRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIEZBQ0VTX01FU1NBR0VfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZUZhY2VzTWVzc2FnZUZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgZGVmYXVsdDogLy9yZXF1aXJlZCBieSBjaGVja3N0eWxlDQotICAgICAgICB9DQotDQotICAgICAgICBpZihmYWN0b3J5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IHBvc3NpYmxlIHRvIGNyZWF0ZSBmYWN0b3J5ICIgKyBmYWN0b3J5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBmYWN0b3J5TWFwLnB1dChmYWN0b3J5TmFtZSwgZmFjdG9yeSk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZKTsNCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZKSk7DQotICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkpOw0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZKSk7DQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkpOw0KLSAgICAgICAgbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZKSk7DQotICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSApOw0KLSAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZKSk7DQotICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgY3JlYXRlRmFjZXNNZXNzYWdlRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fRkFDRVNfTUVTU0FHRV9GQUNUT1JZKTsNCi0gICAgICAgIGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkZBQ0VTX01FU1NBR0VfRkFDVE9SWSkpOw0KLQ0KLSAgICAgICAgT2JqZWN0IHRhcmdldCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KEN1c3RvbUluZm9ybWF0aW9uLkZBQ0VTX01FU1NBR0VfRkFDVE9SWS5uYW1lKCkpOw0KLSAgICAgICAgaWYodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0IGluc3RhbmNlb2YgU3RyaW5nKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzLmFkZCgoU3RyaW5nKXRhcmdldCk7DQotICAgICAgICB9DQotICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgY3JlYXRlRUxIZWxwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0RUxIZWxwZXJGYWN0b3J5KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2JkOGEzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRmFjZXNNZXNzYWdlRmFjdG9yeQ0KLXsNCi0gICAgRmFjZXNNZXNzYWdlIGNvbnZlcnQoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSk7DQotDQotICAgIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlGaW5kZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmMjYyNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnlGaW5kZXIKLXsKLSAgICA8VD4gVCBnZXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeU5hbWVzLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFmMzEzOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQotcHVibGljIGVudW0gRmFjdG9yeU5hbWVzCi17Ci0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksCi0gICAgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLAotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLAotCi0gICAgRkFDRVNfTUVTU0FHRV9GQUNUT1JZLAotCi0gICAgUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwKLSAgICBFTF9IRUxQRVJfRkFDVE9SWQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDJkMWYwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L05hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFQgZXh0ZW5kcyBOYW1lTWFwcGVyPg0KLXsNCi0gICAgdm9pZCByZWdpc3RlcihUIGNsYXNzVG9BZGQpOw0KLSAgICB2b2lkIGRlcmVnaXN0ZXIoQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IGNsYXNzVG9EZXJlZ2lzdGVyKTsNCi0gICAgdm9pZCBkZW55KENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBjbGFzc1RvRGVueSk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjliZDk3YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gaW5pdGlhbGl6ZSBjb21wb25lbnRzIGJlZm9yZUVuY29kZUJlZ2luLjxici8+DQotICogZS5nLjogeW91IGNhbiBhZGQgaW5mb3JtYXRpb24gZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gbWVjaGFuaXNtcywuLi4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50SW5pdGlhbGl6ZXINCi17DQotICAgIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTljMDQxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBTdGF0aWNDb25maWd1cmF0aW9uPFQsIFI+DQotew0KLSAgICB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCk7DQotICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFQsIFI+PiBnZXRNYXBwaW5nKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeS5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiODRhZjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGNsYXNzIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxULCBSPg0KLXsNCi0gICAgcHJpdmF0ZSBUIHNvdXJjZTsNCi0gICAgcHJpdmF0ZSBSIHRhcmdldDsNCi0NCi0gICAgcHVibGljIFQgZ2V0U291cmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHNvdXJjZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoVCBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSIGdldFRhcmdldCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KFIgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmJjZGM0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSX0pCi1wdWJsaWMgZW51bSBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMKLXsKLSAgICBNRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9DT05GSUcsCi0KLSAgICBTS0lQX1ZBTElEQVRJT05fU1VQUE9SVF9DT05GSUcKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24uamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGNiNmY0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3MKLSAgICAgICAgPSBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VPZk1hcHBpbmcoU3RyaW5nIHBhdGgpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGdldE1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2Uoc291cmNlKTsKLSAgICAgICAgZW50cnkuc2V0VGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgIHRoaXMubWFwcGluZ3MuYWRkKGVudHJ5KTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhNjNjNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIFN0cmluZyBwYXRoOwotICAgIHByaXZhdGUgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5nczsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCkKLSAgICB7Ci0gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgICAgIC8vZm9yY2UgcmVsb2FkCi0gICAgICAgIG1hcHBpbmdzID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBnZXRNYXBwaW5nKCkKLSAgICB7Ci0gICAgICAgIGlmKG1hcHBpbmdzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtYXBwaW5nczsKLSAgICAgICAgfQotCi0gICAgICAgIG1hcHBpbmdzID0gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotCi0gICAgICAgIFJlc291cmNlQnVuZGxlIG1hcHBpbmcgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocGF0aCk7Ci0KLSAgICAgICAgaWYgKG1hcHBpbmcgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9sb2dnaW5nCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IG1hcHBpbmcuZ2V0S2V5cygpOwotCi0gICAgICAgIFN0cmluZyBtZXRhRGF0YUtleTsKLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsKLQotICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YURhdGFLZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSBtYXBwaW5nLmdldFN0cmluZyhtZXRhRGF0YUtleSk7Ci0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWV0YURhdGFLZXksIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBtZXRhRGF0YUtleSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2UobWV0YURhdGFLZXkpOwotICAgICAgICBlbnRyeS5zZXRUYXJnZXQodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsKLSAgICAgICAgdGhpcy5tYXBwaW5ncy5hZGQoZW50cnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk5Mzk2OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yIGltcGxlbWVudHMgUmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRJbnRlcmNlcHRvcklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJldHVyblZhbHVlT25Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKAotICAgICAgICBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIHNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24sIE9iamVjdCBjdXJyZW50UmV0dXJuVmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gY3VycmVudFJldHVyblZhbHVlOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBiZWZvcmUKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJlZm9yZURlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGFmdGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhM2IxYjYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlJbmZvcm1hdGlvbiB0aGUgaW5mb3JtYXRpb24gZW50cnkgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3BlcnR5DQotICAgICAqLw0KLSAgICB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxZjA1NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEFsbG93cyB0byBpbnRlcmNlcHQgcmVuZGVyZXIgbWV0aG9kcy48YnIvPgotICogQmFzZSBtZWNoYW5pc20gb2YgZXh0dmFsLiBJdCBhbGxvd3MgdG8gYWRkIGN1c3RvbSBpbmZyYXN0cnVjdHVyZXMuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIFJlbmRlcmVySW50ZXJjZXB0b3IKLXsKLSAgICBTdHJpbmcgZ2V0SW50ZXJjZXB0b3JJZCgpOwotCi0gICAgT2JqZWN0IGdldFJldHVyblZhbHVlT25Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKAotICAgICAgICBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIHNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24sIE9iamVjdCBjdXJyZW50UmV0dXJuVmFsdWUpOwotCi0gICAgLyoKLSAgICAgKiBiZWZvcmUKLSAgICAgKi8KLSAgICB2b2lkIGJlZm9yZURlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlRW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIC8qCi0gICAgICogYWZ0ZXIKLSAgICAgKi8KLSAgICB2b2lkIGFmdGVyRGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyRW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdjMDlhYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEFsbG93cyB0byBpbnRlcmNlcHQgdmFsaWRhdGlvciBleGNlcHRpb25zLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAqIEBwYXJhbSBtZXRhRGF0YUVudHJ5IHRoZSBtZXRhIGRhdGEgZW50cnkgd2hpY2ggY29udGFpbnMgdGhlIG1ldGEgZGF0YSBvZiB0aGUgcHJvcGVydHkNCi0gICAgICogQHBhcmFtIGNvbnZlcnRlZE9iamVjdCB0aGUgY29udmVydGVkIHVzZXIgaW5wdXQNCi0gICAgICogQHBhcmFtIHZhbGlkYXRvckV4Y2VwdGlvbiB0aGUgY3VycmVudCBleGNlcHRpb24NCi0gICAgICogQHBhcmFtIHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IHdoaWNoIHRocmV3IHRoZSBleGNlcHRpb24NCi0gICAgICogQHJldHVybiBmYWxzZSB0byBzdG9wIHRocm93aW5nIHRoZSBleGNlcHRpb24NCi0gICAgICovDQotICAgIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk1Njk0OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXIuUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3IKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW5pdENvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYoISh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCB0byBpbml0IGNvbXBvbmVudCAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsKLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOwotCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gRXh0VmFsVXRpbHMuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IG1ldGFEYXRhRXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCkuZ2V0TWV0YURhdGFFbnRyaWVzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKGVudHJ5LmdldEtleSgpKTsKLQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCFza2lwVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uU3RyYXRlZ3ksIGVudHJ5KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSBFeHRWYWxVdGlscy5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKG1ldGFEYXRhID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZighbWV0YURhdGEuaXNFbXB0eSgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlNLSVBfVkFMSURBVElPTiwgQm9vbGVhbi5jbGFzcykpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04sIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vZ2V0IGNvbXBvbmVudCBpbml0aWFsaXplciBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50IGFuZCBjb25maWd1cmUgaXQKLSAgICAgICAgICAgICAgICAvL2Fsc28gaW4gY2FzZSBvZiBza2lwcGVkIHZhbGlkYXRpb24gdG8gcmVzZXQgZS5nLiB0aGUgcmVxdWlyZWQgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgaWYoIW1ldGFEYXRhLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbmZpZ3VyZUNvbXBvbmVudFdpdGhNZXRhRGF0YShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJpbml0IGNvbXBvbmVudCBvZiAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0ID0gd3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLQotICAgICAgICAvL3JlY29yZGUgdXNlciBpbnB1dCBlLmcuIGZvciBjcm9zcy1jb21wb25lbnQgdmFsaWRhdGlvbgotICAgICAgICBmb3IoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciByZWNvcmRlciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlY29yZGVyLnJlY29yZFVzZXJJbnB1dCh1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsKLQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHJlY29yZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjYWxsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9jZXNzVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbnZlcnRlckV4Y2VwdGlvbihlLmdldEZhY2VzTWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQotICAgIHsKLSAgICAgICAgaWYgKCEodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgdmFsaWRhdGlvbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsKLQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IEV4dFZhbFV0aWxzLmdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKCk7Ci0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KS5nZXRNZXRhRGF0YUVudHJpZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOwotCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoc2tpcFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblN0cmF0ZWd5LCBlbnRyeSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvL3JlcXVpcmVkIGlzIGEgc3BlY2lhbCBjYXNlIC0gcmVzZXQgaXQKLSAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZChmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInZhbGlkYXRlICIgKyBlbnRyeS5nZXRWYWx1ZSgpICsgIiB3aXRoICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyB2YWxpZGF0aW9uIHN0cmF0ZWd5IGZvdW5kIGZvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJ2YWxpZGF0aW9uIGZpbmlzaGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBza2lwVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBlbnRyeSkKLSAgICB7Ci0gICAgICAgIC8vb3ZlcnJpZGUgZm9yIGN1c3RvbSBza2lwIHZhbGlkYXRpb24gc3VwcG9ydCAoaWYgbmVlZGVkKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZDM4NjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQSBnZW5lcmljIGltcGxlbWVudGF0aW9uLiBTdWJjbGFzc2VzIGp1c3QgaGF2ZSB0byBub3cgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBuYW1lIG1hcHBlci4NCi0gKg0KLSAqIE5hbWVNYXBwZXJzIGFyZSBzdGF0ZWxlc3MuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VD4gaW1wbGVtZW50cyBOYW1lTWFwcGVyPFQ+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLSAgICBwcml2YXRlIE5hbWVNYXBwZXI8VD4gY3VzdG9tTmFtZU1hcHBlcjsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFQgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZiAoY3VzdG9tTmFtZU1hcHBlciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCk7DQotDQotICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTmFtZU1hcHBlciA9IChOYW1lTWFwcGVyPFQ+KSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKGN1c3RvbU5hbWVNYXBwZXIgIT0gbnVsbCkgPyBjdXN0b21OYW1lTWFwcGVyLmNyZWF0ZU5hbWUoc291cmNlKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNjA3OGQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgZm9yIG5hbWUgbWFwcGVycy4NCi0gKiBBIG5hbWUgbWFwcGVyIGNhbGN1bGF0ZXMgYSBuYW1lIGZvciBhIGdpdmVuIHNvdXJjZSBvYmplY3QuDQotICogZS5nLiBNZXRhLURhdGEgS2V5IChlLmcuOiBhbm5vdGF0aW9uIGNsYXNzIG5hbWUpIC0+IFZhbGlkYXRpb25TdHJhdGVneQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBOYW1lTWFwcGVyPFQ+DQotew0KLSAgICBTdHJpbmcgY3JlYXRlTmFtZShUIHNvdXJjZSk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjYzQzMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvQ29tbW9uTWV0YURhdGFLZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGhlbHBlciBmb3IgZnJlcXVlbnQgbWV0YS1kYXRhIGtleXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogcGxhY2VkIGluIGNvcmUgdG8gYXZvaWQgZHVwbGljYXRlZCBpbmZvcm1hdGlvbiBpbiBtdWx0aXBsZSBtb2R1bGVzICh2YWxpZGF0aW9uIG1vZHVsZSBhbmQgY29tcG9uZW50LXN1cHBvcnQgbW9kdWxlKQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBDb21tb25NZXRhRGF0YUtleXMNCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRUQgPSAicmVxdWlyZWQiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQUtfUkVRVUlSRUQgPSAid2Vha19yZXF1aXJlZCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOX0xFTkdUSCA9ICJtaW5fbGVuZ3RoIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfTEVOR1RIID0gIm1heF9sZW5ndGgiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01JTiA9ICJyYW5nZV9taW4iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01BWCA9ICJyYW5nZV9tYXgiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVFRFUk4gPSAicGF0dGVybiI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUVEVSTl9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UgPSAicGF0dGVybl92YWxpZGF0aW9uX2Vycm9yX21lc3NhZ2UiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQUlMID0gImVtYWlsIjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT00gPSAiY3VzdG9tIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lQX1ZBTElEQVRJT04gPSAic2tpcF92YWxpZGF0aW9uIjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL01ldGFEYXRhRW50cnkuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9NZXRhRGF0YUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNTQ1ODIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL01ldGFEYXRhRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBEYXRhIGhvbGRlciB3aGljaCBzdG9yZXMgdGhlIG1ldGEtZGF0YSBhbmQgc29tZSBpbmZvcm1hdGlvbiB3aGVyZSB0aGUgbWV0YS1kYXRhIHdhcyBhcm91bmQuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgTWV0YURhdGFFbnRyeQotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBrZXk7Ci0gICAgcHJpdmF0ZSBPYmplY3QgdmFsdWU7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgic2V0dGluZyBtZXRhLWRhdGEga2V5OiAiICsga2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gVCBnZXRWYWx1ZShDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVClnZXRWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJzZXR0aW5nIG1ldGEtZGF0YSB2YWx1ZTogIiArIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpZ2V0UHJvcGVydHkoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgibmV3IHByb3BlcnR5IGFkZGVkIGtleTogIiArIGtleSArICIgdmFsdWU6ICIgKyB2YWx1ZSArICIgZm9yIG1ldGFkYXRhLWtleTogIiArIHRoaXMua2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMucHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMmY0YTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGFsbCBmYWN0b3JpZXMgd2hpY2ggY3JlYXRlIG1ldGEtZGF0YSBleHRyYWN0b3JzCi0gKiAKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkKLXsKLSAgICBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGUoKTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTg5YzkwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIGV4dHJhY3RzIG1ldGEtZGF0YSAoZS5nLiB0aGUgYW5ub3RhdGlvbnMpIG9mIHRoZSB2YWx1ZSBiaW5kaW5nIG9mIGEgY29tcG9uZW50LgotICogSXQgZXh0cmFjdHMgdGhlIG1ldGEtZGF0YSBvZiB0aGUgZmllbGQgYW5kIHRoZSBwcm9wZXJ0eS4KLSAqIChBbHNvIHRoZSBhbm5vdGF0aW9ucyBvZiBzdXBlciBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzLikKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvciBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdG9yCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHB1YmxpYyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVG9EbyhQcmlvcml0eS5NRURJVU0pCi0gICAgcHVibGljIFByb3BlcnR5SW5mb3JtYXRpb24gZXh0cmFjdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKCk7Ci0KLSAgICAgICAgLy9zaG91bGQgbmV2ZXIgb2NjdXIKLSAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgVUlDb21wb25lbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkgJiYgb2JqZWN0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihvYmplY3QuZ2V0Q2xhc3MoKSArICIgaXMgbm8gdmFsaWQgY29tcG9uZW50Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50ID0gKFVJQ29tcG9uZW50KSBvYmplY3Q7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgZXh0cmFjdGluZyBtZXRhLWRhdGEgb2YgIiArIHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAocHJvcGVydHlEZXRhaWxzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZ2V0IGJlYW4gY2xhc3MgYW5kIHByb3BlcnR5IG5hbWUKLSAgICAgICAgICovCi0gICAgICAgIENsYXNzIGVudGl0eUNsYXNzID0gcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpOwotCi0gICAgICAgIC8vY3JlYXRlCi0gICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uc2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBmaW5kIGFuZCBhZGQgYW5ub3RhdGlvbnMKLSAgICAgICAgICovCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IGVudGl0eUNsYXNzOwotCi0gICAgICAgIHdoaWxlICghT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY3VycmVudENsYXNzLmdldE5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoY3VycmVudENsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgICAgICBhZGRGaWVsZEFjY2Vzc0Fubm90YXRpb25zKGN1cnJlbnRDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhjdXJyZW50Q2xhc3MsIHByb3BlcnR5RGV0YWlscywgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0KLSAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHRyYWN0IGZpbmlzaGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ludGVyZmFjZXMoCi0gICAgICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MsIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMsIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IGN1cnJlbnRDbGFzcy5nZXRJbnRlcmZhY2VzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoY3VycmVudEludGVyZmFjZSwgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhjdXJyZW50SW50ZXJmYWNlLCBwcm9wZXJ0eURldGFpbHMsIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIHByb3BlcnR5ID0gcHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSk7Ci0KLSAgICAgICAgTWV0aG9kIG1ldGhvZDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0aG9kID0gZW50aXR5LmdldERlY2xhcmVkTWV0aG9kKCJnZXQiICsgcHJvcGVydHkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kID0gZW50aXR5LmdldERlY2xhcmVkTWV0aG9kKCJpcyIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJtZXRob2Qgbm90IGZvdW5kIC0gY2xhc3M6ICIgKyBlbnRpdHkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgLSBtZXRob2RzOiAiICsgImdldCIgKyBwcm9wZXJ0eSArICIgIiArICJpcyIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoQXJyYXlzLmFzTGlzdChtZXRob2QuZ2V0QW5ub3RhdGlvbnMoKSksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBGaWVsZCBmaWVsZDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmllbGQgPSBlbnRpdHkuZ2V0RGVjbGFyZWRGaWVsZChwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWVsZCA9IGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKCJfIiArIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZmllbGQgIiArIHByb3BlcnR5ICsgIiBvciBfIiArIHByb3BlcnR5ICsgIiBub3QgZm91bmQiLCBlMSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoQXJyYXlzLmFzTGlzdChmaWVsZC5nZXRBbm5vdGF0aW9ucygpKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoCi0gICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMsIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uYWRkTWV0YURhdGFFbnRyeShjcmVhdGVNZXRhRGF0YUVudHJ5Rm9yQW5ub3RhdGlvbihhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShhbm5vdGF0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmb3VuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1ldGFEYXRhRW50cnkgY3JlYXRlTWV0YURhdGFFbnRyeUZvckFubm90YXRpb24oQW5ub3RhdGlvbiBmb3VuZEFubm90YXRpb24pCi0gICAgewotICAgICAgICBNZXRhRGF0YUVudHJ5IGVudHJ5ID0gbmV3IE1ldGFEYXRhRW50cnkoKTsKLQotICAgICAgICBlbnRyeS5zZXRLZXkoZm91bmRBbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgZW50cnkuc2V0VmFsdWUoZm91bmRBbm5vdGF0aW9uKTsKLQotICAgICAgICByZXR1cm4gZW50cnk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkNzBhZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGlzIGZhY3RvcnkgY3JlYXRlcyBhIG1ldGEtZGF0YSBleHRyYWN0b3Igd2hpY2ggZXh0cmFjdHMgdGhlIG1ldGEtZGF0YQotICogb2YgdGhlIHZhbHVlIGJpbmRpbmcgb2YgYSBjb21wb25lbnQuCi0gKiA8cC8+Ci0gKiBvcmRlcjo8YnIvPgotICogPG9sPgotICogICA8bGk+Y29uZmlndXJlZCBtZXRhLWRhdGEgZXh0cmFjdG9yICh3ZWIueG1sKTwvbGk+Ci0gKiAgIDxsaT5jb25maWd1cmVkIG1ldGEtZGF0YSBleHRyYWN0b3IgKGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pPC9saT4KLSAqICAgPGxpPmRlZmF1bHQgaW1wbGVtZW50YXRpb248L2xpPgotICogPC9vbD4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkKLXsKLSAgICBwcml2YXRlIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gbnVsbDsKLQotICAgIHB1YmxpYyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQotICAgIHB1YmxpYyBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGUoKQotICAgIHsKLSAgICAgICAgaWYgKG1ldGFEYXRhRXh0cmFjdG9yID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SKTsKLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SKSk7Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMuYWRkKERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3IgPSAoTWV0YURhdGFFeHRyYWN0b3IpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1ldGFEYXRhRXh0cmFjdG9yICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKG1ldGFEYXRhRXh0cmFjdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjcmVhdGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvcihtZXRhRGF0YUV4dHJhY3Rvcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9NZXRhRGF0YUV4dHJhY3Rvci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9NZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDQwNTFkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLQotLyoqCi0gKiBBbiBtZXRhLWRhdGEgZXh0cmFjdG9yIGlzIHJlc3BvbnNpYmxlIHRvIGFuYWx5emUgYW4gb2JqZWN0Ci0gKiBhbmQgcmV0dXJucyBhbGwgYXZhaWxhYmxlIG1ldGEtZGF0YSBpbmZvcm1hdGlvbgotICogCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFFeHRyYWN0b3IKLXsKLSAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OTkxMmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSBlcXVpdmFsZW50IHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0Lg0KLSAqDQotICogaWYgdGhlcmUgaXMgYWxzbyBhIHByb3h5IGZvciB0aGUgZXh0cmFjdG9yIHlvdSBjYW4gdXNlIHRoZSBjbGFzc05hbWUgcHJvcGVydHkgdG8gbWFudWFsbHkgcmVwZWF0IHRoZQ0KLSAqIGZ1bGwgcXVhbGlmaWVkIGNsYXNzIG5hbWUuDQotICoNCi0gKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgaW50ZXJmYWNlIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlciBleHRlbmRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGVhODE5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgZXF1aXZhbGVudCB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0gKg0KLSAqIGlmIHRoZXJlIGlzIGFsc28gYSBwcm94eSBmb3IgdGhlIHRyYW5zZm9ybWVyIHlvdSBjYW4gdXNlIHRoZSBjbGFzc05hbWUgcHJvcGVydHkgdG8gbWFudWFsbHkgcmVwZWF0IHRoZQ0KLSAqIGZ1bGwgcXVhbGlmaWVkIGNsYXNzIG5hbWUuDQotICoNCi0gKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgY2xhc3MgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbCBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXIsIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIHByaXZhdGUgU3RyaW5nIG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWU7DQotDQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKG1ldGFEYXRhRW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoU3RyaW5nIG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSA9IG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhVHJhbnNmb3JtZXIoTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXIgPSBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI1MTYyYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotDQotLyoqDQotICogRmFjdG9yeSB3aGljaCBjcmVhdGVzIHRoZSBNZXRhRGF0YVRyYW5zZm9ybWVyIGZvciBhIGdpdmVuIFZhbGlkYXRpb25TdHJhdGVneQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotLyoNCi0gKiBWYWxpZGF0aW9uU3RyYXRlZ3kgLT4gTWV0YURhdGFUcmFuc2Zvcm1lciBpbnN0ZWFkIG9mIE1ldGEtRGF0YSAtPiBNZXRhRGF0YVRyYW5zZm9ybWVyDQotICogdG8gYXZvaWQgYSBzZWNvbmQgc3RhdGljIG1hcHBpbmcgZS5nLiBmb3IganBhIGFubm90YXRpb25zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneT4NCi0gICAgICAgIGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1ldGFEYXRhVHJhbnNmb3JtZXI+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZzsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgY3JlYXRlKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lID0gbnVsbDsNCi0NCi0gICAgICAgIC8vcHJveHkgY2hlY2sNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICAvL2luIGNhc2Ugb2YgYSBwcm94eSBhbmQgdGhlIHVzYWdlIG9mIGEgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi0gICAgICAgIGVsc2UgaWYgKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgPSAoKEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKXZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljTWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHZhbGlkYXRpb25TdHJhdGVneU5hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoTWV0YURhdGFUcmFuc2Zvcm1lcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcuZ2V0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgIFN0cmluZyB0cmFuc2Zvcm1lck5hbWU7DQotICAgICAgICAvL251bGwgLT4gdXNlIG5hbWUgbWFwcGVycw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyYW5zZm9ybWVyTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lck5hbWUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyID0gKE1ldGFEYXRhVHJhbnNmb3JtZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHRyYW5zZm9ybWVyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneU5hbWUgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYWRkTWFwcGluZyh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCB0cmFuc2Zvcm1lck5hbWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgLy9zZXR1cCBpbnRlcm5hbCBzdGF0aWMgbWFwcGluZ3MNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnIDoNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhtYXBwaW5nLmdldFNvdXJjZSgpLCBtYXBwaW5nLmdldFRhcmdldCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0cmFuc2Zvcm1lck5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkaW5nIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWV0YS1kYXRhIHRyYW5zZm9ybWVyIG1hcHBpbmc6ICINCi0gICAgICAgICAgICAgICAgKyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgIiAtPiAiICsgdHJhbnNmb3JtZXJOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcucHV0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIHRyYW5zZm9ybWVyTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1MDRiMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gdHJhbnNmb3JtIGNvbmNyZXRlIG1ldGEtZGF0YSB0byBhIG1vcmUgYWJzdHJhY3QgZm9ybS48YnIvPg0KLSAqIGUuZy46IEBSZXF1aXJlZCwgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLC4uLiksIEBMZW5ndGgobWluaW11bSA9IDEpLCAuLi4gLT4gcmVxdWlyZWQgPSB0cnVlDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotLy8qVHJhbnNmb3JtZXIgaW5zdGVhZCBvZiAqQ29udmVydGVyIHRvIGF2b2lkIG5hbWluZyBjb25mdXNpb24gDQotcHVibGljIGludGVyZmFjZSBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYWRjMTYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDcyMmE4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciAtIGlmIHRoZXJlIGlzIGEgcHJveHkgYXJvdW5kIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5Lg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoKEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKXZhbGlkYXRpb25TdHJhdGVneSkuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTdiMmQ5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gTWV0YURhdGFUcmFuc2Zvcm1lcnMuDQotICogKGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYWNkMTEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1ldGFEYXRhVHJhbnNmb3JtZXJzLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDI4NjhmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBtYXBzIEV4dFZhbCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBnZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODViNTNmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciB0byBwbGFjZSBWYWxpZGF0aW9uU3RyYXRlZ2llcyBhbmQgTWV0YURhdGFUcmFuc2Zvcm1lcnMgaW4gdGhlIHNhbWUgcGFja2FnZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGdldFNpbXBsZU1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkgKyAiLiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNpbXBsZU1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lQYWNrYWdlTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHBvc3RmaXggPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfUE9TVEZJWCk7DQotDQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUuZW5kc1dpdGgoIlZhbGlkYXRpb25TdHJhdGVneSIpIHx8DQotICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUuZW5kc1dpdGgoIlN0cmF0ZWd5IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneVBhY2thZ2VOYW1lICsgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lDQotICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgpICxwb3N0Zml4KQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoIlZhbGlkYXRpb25TdHJhdGVneSIsIHBvc3RmaXgpDQotICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgiU3RyYXRlZ3kiLCBwb3N0Zml4KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vaW4gY2FzZSBvZiBhIHN0YXRpYyB2YWxpZGF0aW9uIHN0cmF0ZWd5IG1hcHBpbmcNCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lQYWNrYWdlTmFtZSArIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSArIHBvc3RmaXg7DQotICAgIH0NCi0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1ZjUyOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uIGltcGxlbWVudHMgUHJvcGVydHlJbmZvcm1hdGlvbgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gaW5mb3JtYXRpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICBwcml2YXRlIExpc3Q8TWV0YURhdGFFbnRyeT4gbWV0YURhdGFMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUVudHJ5PigpOwotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNJbmZvcm1hdGlvbihTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZm9ybWF0aW9uTWFwLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZm9ybWF0aW9uTWFwLmdldChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gVCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVCkgZ2V0SW5mb3JtYXRpb24oa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgibmV3IGluZm9ybWF0aW9uIGFkZGVkIGtleTogIiArIGtleSArICIgdmFsdWU6ICIgKyB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmZvcm1hdGlvbk1hcC5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGFEYXRhRW50cnlbXSBnZXRNZXRhRGF0YUVudHJpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhTGlzdC50b0FycmF5KG5ldyBNZXRhRGF0YUVudHJ5W21ldGFEYXRhTGlzdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXRhRGF0YUVudHJ5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkKLSAgICB7Ci0gICAgICAgIG1ldGFEYXRhRW50cnkuc2V0UHJvcGVydGllcyh0aGlzLmluZm9ybWF0aW9uTWFwKTsKLSAgICAgICAgdGhpcy5tZXRhRGF0YUxpc3QuYWRkKG1ldGFEYXRhRW50cnkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0TWV0YURhdGFFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJyZXNldHRpbmcgbWV0YS1kYXRhIGVudHJpZXMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMubWV0YURhdGFMaXN0LmNsZWFyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTAzN2NmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eURldGFpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eURldGFpbHMKLXsKLSAgICAvL2Zvcm1zIHRoZSBpZCBmb3IgY3Jvc3MtdmFsaWRhdGlvbiB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzCi0gICAgcHJpdmF0ZSBTdHJpbmcga2V5OwotICAgIHByaXZhdGUgT2JqZWN0IGJhc2VPYmplY3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlEZXRhaWxzKFN0cmluZyBrZXksIE9iamVjdCBiYXNlT2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICAgICAgdGhpcy5iYXNlT2JqZWN0ID0gYmFzZU9iamVjdDsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJhc2VPYmplY3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJhc2VPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZU9iamVjdChPYmplY3QgYmFzZU9iamVjdCkKLSAgICB7Ci0gICAgICAgIHRoaXMuYmFzZU9iamVjdCA9IGJhc2VPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDkyODRmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5SW5mb3JtYXRpb24KLXsKLSAgICBib29sZWFuIGNvbnRhaW5zSW5mb3JtYXRpb24oU3RyaW5nIGtleSk7Ci0gICAgT2JqZWN0IGdldEluZm9ybWF0aW9uKFN0cmluZyBrZXkpOwotICAgIDxUPiBUIGdldEluZm9ybWF0aW9uKFN0cmluZyBrZXksIENsYXNzPFQ+IHRhcmdldENsYXNzKTsKLSAgICB2b2lkIHNldEluZm9ybWF0aW9uKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSk7Ci0KLSAgICBNZXRhRGF0YUVudHJ5W10gZ2V0TWV0YURhdGFFbnRyaWVzKCk7Ci0gICAgdm9pZCBhZGRNZXRhRGF0YUVudHJ5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSk7Ci0gICAgdm9pZCByZXNldE1ldGFEYXRhRW50cmllcygpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRlOTI1Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlJbmZvcm1hdGlvbktleXMKLXsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFVEFJTFMgPSAicHJvcGVydHlfZGV0YWlscyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lQX1ZBTElEQVRJT04gPSAic2tpcF92YWxpZGF0aW9uIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gImxhYmVsIjsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZWNvcmRlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzBmMjNmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZWNvcmRlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotCi0vKioKLSAqIEFsbG93cyB0byBjYXB0dXJlIGNvbnZlcnRlZCB2YWx1ZXMuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIKLXsKLSAgICB2b2lkIHJlY29yZFVzZXJJbnB1dChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZGU1YzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLQotLyoqCi0gKiBCYXNlIGZvciBhbGwgUmVuZGVyS2l0V3JhcHBlckZhY3RvcmllcyB0byBmb3JjZSBhIHNwZWNpZmljIGJlaGF2aW91cgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFJlbmRlcktpdCwgUmVuZGVyS2l0PgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSB3cmFwcGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBkZWFjdGl2YXRlZCA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeShBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRoaXMud3JhcHBlZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLndyYXBwZWQuYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkocmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkZWFjdGl2YXRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5kZWFjdGl2YXRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWFjdGl2YXRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVhY3RpdmF0ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFJlbmRlcktpdCBjcmVhdGUoUmVuZGVyS2l0IHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIGlmKGlzRGVhY3RpdmF0ZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBSZW5kZXJLaXQgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBpZih0aGlzLndyYXBwZWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy53cmFwcGVkLmNyZWF0ZShyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVXcmFwcGVyKHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0RlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDdlMDUwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ci17Ci0gICAgcHJpdmF0ZSBSZW5kZXJLaXQgcmVuZGVyS2l0OwotCi0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCBjcmVhdGVXcmFwcGVyKFJlbmRlcktpdCByZW5kZXJLaXQpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVya2l0IHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcktpdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLnJlbmRlcktpdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnJlbmRlcktpdCA9IG5ldyBFeHRWYWxSZW5kZXJLaXQocmVuZGVyS2l0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJLaXQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzNjI4Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbExhenlSZW5kZXJlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotCi0vKioKLSAqIHRvIHN1cHBvcnQgYSBjdXN0b20gcHJveHkKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkgZXh0ZW5kcyBSZW5kZXJlcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIFJlbmRlcmVyIHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSByZW5kZXJlcjsKLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzaW1wbGUgcHJveHkgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZXRMYXp5UmVuZGVyZXIoKS5lbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZXRMYXp5UmVuZGVyZXIoKS5lbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydENsaWVudElkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldExhenlSZW5kZXJlcigpLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGdldFJlbmRlcnNDaGlsZHJlbigpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRMYXp5UmVuZGVyZXIoKS5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlbmRlcmVyIGdldExhenlSZW5kZXJlcigpCi0gICAgewotICAgICAgICBTdHJpbmcgcHJveHlDbGFzc05hbWUgPSAoU3RyaW5nKSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSk7Ci0KLSAgICAgICAgaWYocHJveHlDbGFzc05hbWUgIT0gbnVsbCAmJiAhcHJveHlDbGFzc05hbWUuZW5kc1dpdGgoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKHByb3h5Q2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgaWYodGFyZ2V0Q2xhc3MgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhIGN1c3RvbSBpbnZhbGlkIHJlbmRlcmVyIHByb3h5IGlzIGNvbmZpZ3VyZWQ6ICIgKyBwcm94eUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENsYXNzW10gYXJnQ2xhc3NlcyA9IG5ldyBDbGFzc1sxXTsKLSAgICAgICAgICAgIGFyZ0NsYXNzZXNbMF0gPSBSZW5kZXJlci5jbGFzczsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSB0YXJnZXRDbGFzcy5nZXRDb25zdHJ1Y3RvcihhcmdDbGFzc2VzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFJlbmRlcmVyKWNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBjcmVhdGU6ICIgKyB0YXJnZXRDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkOwotICAgICAgICB9Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXQuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMzU0ZTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VTdHJlYW07Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVdyaXRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVzcG9uc2VTdGF0ZU1hbmFnZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJLaXQgZXh0ZW5kcyBSZW5kZXJLaXQKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgd3JhcHBlZDsKLQotICAgIHB1YmxpYyBFeHRWYWxSZW5kZXJLaXQoUmVuZGVyS2l0IHdyYXBwZWQpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOwotCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICBpZiAocmVuZGVyZXIgaW5zdGFuY2VvZiBFeHRWYWxSZW5kZXJlcldyYXBwZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIHJlbmRlcmVyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIGNyZWF0ZVdyYXBwZXIocmVuZGVyZXIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBSZW5kZXJlciBnZXRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSB3cmFwcGVkLmdldFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlKTsKLQotICAgICAgICBpZihyZW5kZXJlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyZXIgaW5zdGFuY2VvZiBFeHRWYWxSZW5kZXJlcldyYXBwZXIgPyByZW5kZXJlciA6IGNyZWF0ZVdyYXBwZXIocmVuZGVyZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCJubyByZW5kZXJlciBmb3VuZCBmb3IgZmFtaWx5ICIgKyBmYW1pbHkgKyAiIGFuZCB0eXBlICIgKyByZW5kZXJlclR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlbmRlcmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZVN0YXRlTWFuYWdlciBnZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZVdyaXRlciBjcmVhdGVSZXNwb25zZVdyaXRlcihXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcywgU3RyaW5nIHMxKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY3JlYXRlUmVzcG9uc2VXcml0ZXIod3JpdGVyLCBzLCBzMSk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlU3RyZWFtIGNyZWF0ZVJlc3BvbnNlU3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jcmVhdGVSZXNwb25zZVN0cmVhbShvdXRwdXRTdHJlYW0pOwotICAgIH0KLQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIGNyZWF0ZVdyYXBwZXIoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEV4dFZhbFJlbmRlcmVyV3JhcHBlcihyZW5kZXJlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXRGYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI4MmJiYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeTsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBjZW50cmFsIG1lY2hhbmlzbSB3aGljaCBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgYSB3cmFwcGVyIGZvciBhIHJlbmRlcmVyIC0gc3RhcnRpbmcgcG9pbnQgb2YgZXh0dmFsLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeSBleHRlbmRzIFJlbmRlcktpdEZhY3RvcnkKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotICAgIHByaXZhdGUgUmVuZGVyS2l0RmFjdG9yeSB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcktpdEZhY3RvcnkoUmVuZGVyS2l0RmFjdG9yeSByZW5kZXJLaXRGYWN0b3J5KQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyS2l0RmFjdG9yeTsKLQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcktpdChTdHJpbmcgcywgUmVuZGVyS2l0IHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIHdyYXBwZWQuYWRkUmVuZGVyS2l0KHMsIHJlbmRlcktpdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlbmRlcktpdCBnZXRSZW5kZXJLaXQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICBSZW5kZXJLaXQgcmVuZGVyS2l0ID0gdGhpcy53cmFwcGVkLmdldFJlbmRlcktpdChmYWNlc0NvbnRleHQsIHMpOwotCi0gICAgICAgIC8vanNmIHJpICsgdHJpbmlkYWQKLSAgICAgICAgaWYocmVuZGVyS2l0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSB3cmFwcGVyRmFjdG9yeSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgIC8vc29tZSBjb21wb25lbnQgbGlicyBlLmcuIG15ZmFjZXMtdHJpbmlkYWQgYXJlbid0IGNvbXBhdGlibGUgd2l0aCB0aGlzIGNsZWFuIGFwcHJvYWNoCi0gICAgICAgIC8vZXhhbXBsZSBzZWUgVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIKLSAgICAgICAgaWYod3JhcHBlckZhY3RvcnkuaXNEZWFjdGl2YXRlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJGYWN0b3J5LmNyZWF0ZShyZW5kZXJLaXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGdldFJlbmRlcktpdElkcygpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZW5kZXJLaXRJZHMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyUHJveHkuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTM0ZmUyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogdG8gYXZvaWQgbXVsdGlwbGUgY2FsbHMgb2YgcmVuZGVyZXIgbWV0aG9kcyB3aXRoaW4gcmVuZGVyZXIgaW50ZXJjZXB0b3JzIChlLmcuIGZvciBlbmNvZGUsIGRlY29kZSwuLi4pCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJlclByb3h5IGV4dGVuZHMgUmVuZGVyZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVkgPSBFeHRWYWxSZW5kZXJlclByb3h5LmNsYXNzLmdldE5hbWUoKSArICI6S0VZIjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotICAgIAotICAgIHByb3RlY3RlZCBSZW5kZXJlciB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcmVyUHJveHkoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSByZW5kZXJlcjsKLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eUVudHJ5IGVudHJ5ID0gZ2V0T3JJbml0RW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0RlY29kZUNhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXREZWNvZGVDYWxsZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlZC5kZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZG91YmxlIGNhbGwgb2YgbWV0aG9kICdkZWNvZGUnIGZpbHRlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5RW50cnkgZW50cnkgPSBnZXRPckluaXRFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRW5jb2RlQmVnaW5DYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RW5jb2RlQmVnaW5DYWxsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLndyYXBwZWQuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZG91YmxlIGNhbGwgb2YgbWV0aG9kICdlbmNvZGVCZWdpbicgZmlsdGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlFbnRyeSBlbnRyeSA9IGdldE9ySW5pdEVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNFbmNvZGVDaGlsZHJlbkNhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXRFbmNvZGVDaGlsZHJlbkNhbGxlZCh0cnVlKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVkLmVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImRvdWJsZSBjYWxsIG9mIG1ldGhvZCAnZW5jb2RlQ2hpbGRyZW4nIGZpbHRlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eUVudHJ5IGVudHJ5ID0gZ2V0T3JJbml0RW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0VuY29kZUVuZENhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXRFbmNvZGVFbmRDYWxsZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlZC5lbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZG91YmxlIGNhbGwgb2YgbWV0aG9kICdlbmNvZGVFbmQnIGZpbHRlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5jb252ZXJ0Q2xpZW50SWQoZmFjZXNDb250ZXh0LCBzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGdldFJlbmRlcnNDaGlsZHJlbigpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gdCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgIHRocm93IHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eUVudHJ5IGVudHJ5ID0gZ2V0T3JJbml0RW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKGVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW50cnkuc2V0Q29udmVydGVkVmFsdWUod3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZG91YmxlIGNhbGwgb2YgbWV0aG9kICdnZXRDb252ZXJ0ZWRWYWx1ZScgZmlsdGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlbmRlcmVyUHJveHlFbnRyeSBnZXRPckluaXRFbnRyeShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGtleSArPSBnZXRPcHRpb25hbEtleShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWdldE9ySW5pdENvbXBvbmVudFByb3h5TWFwcGluZygpLmNvbnRhaW5zS2V5KGtleSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldE9ySW5pdENvbXBvbmVudFByb3h5TWFwcGluZygpLnB1dChrZXksIG5ldyBSZW5kZXJlclByb3h5RW50cnkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldE9ySW5pdENvbXBvbmVudFByb3h5TWFwcGluZygpLmdldChrZXkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3B0aW9uYWxLZXkoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX1NUT1JBR0VfTkFNRSA9IEV4dFZhbFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpICsgIjpTVE9SQUdFIjsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eUVudHJ5PiBnZXRPckluaXRDb21wb25lbnRQcm94eU1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgTWFwIHJlcXVlc3RNYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpOwotCi0gICAgICAgIGlmKCFyZXF1ZXN0TWFwLmNvbnRhaW5zS2V5KFBST1hZX1NUT1JBR0VfTkFNRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcXVlc3RNYXAucHV0KFBST1hZX1NUT1JBR0VfTkFNRSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5RW50cnk+PigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlFbnRyeT4+IHByb3h5U3RvcmFnZSA9Ci0gICAgICAgICAgICAoKE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlFbnRyeT4+KXJlcXVlc3RNYXAuZ2V0KFBST1hZX1NUT1JBR0VfTkFNRSkpOwotCi0gICAgICAgIFN0cmluZyBrZXkgPSB0aGlzLndyYXBwZWQuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0KLSAgICAgICAgaWYoIXByb3h5U3RvcmFnZS5jb250YWluc0tleShrZXkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm94eVN0b3JhZ2UucHV0KGtleSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5RW50cnk+KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByb3h5U3RvcmFnZS5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgLy9yZXNldCBjb21wb25lbnQgcHJveHkgbWFwcGluZwotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnJlbW92ZShQUk9YWV9TVE9SQUdFX05BTUUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2MzMDVlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUmVuZGVyZXJJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLQotLyoqCi0gKiBEZWZhdWx0IGFwcHJvYWNoIHRvIGF2b2lkIHByb3hpZXMgZm9yIGNvbnZlcnRlcnMgYW5kIHRoZSBhZGFwdGVyIGZhbGxiYWNrLgotICogSXQgcmVxdWlyZXMgdGhhdCBjb21wb25lbnRzIGRlbGVnYXRlIGdldENvbnZlcnRlZFZhbHVlIHRvIGEgcmVuZGVyZXIuPGJyLz4KLSAqIElmIGl0IGlzbid0IHRoZSBjYXNlIGZvciB5b3VyIGNvbXBvbmVudCBsaWIgdXNlOgotICogb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHkuRXh0VmFsQXBwbGljYXRpb25GYWN0b3J5PGJyLz4KLSAqIGFuZDxici8+Ci0gKiBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5Qcm94eU1hcHBpbmdQaGFzZUxpc3RlbmVyCi0gKiA8cC8+Ci0gKiBUaGlzIHdyYXBwZXIgd2lsbCBhbHNvIGltcGxlbWVudCBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIGJlaGF2aW91cgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyZXJXcmFwcGVyIGV4dGVuZHMgUmVuZGVyZXIKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIHdyYXBwZWQ7Ci0gICAgcHJvdGVjdGVkIEV4dFZhbENvbnRleHQgZXh0VmFsQ29udGV4dCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcmVyV3JhcHBlcihSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwcm94eUNsYXNzTmFtZSA9IChTdHJpbmcpRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVkpOwotCi0gICAgICAgIGlmKHByb3h5Q2xhc3NOYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNvbmZpZ3VyZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gbmV3IEV4dFZhbExhenlSZW5kZXJlclByb3h5KHJlbmRlcmVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUocHJveHlDbGFzc05hbWUpOwotCi0gICAgICAgIGlmKHRhcmdldENsYXNzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNvbmZpZ3VyZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gbmV3IEV4dFZhbExhenlSZW5kZXJlclByb3h5KHJlbmRlcmVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzW10gYXJnQ2xhc3NlcyA9IG5ldyBDbGFzc1sxXTsKLSAgICAgICAgYXJnQ2xhc3Nlc1swXSA9IFJlbmRlcmVyLmNsYXNzOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHRhcmdldENsYXNzLmdldENvbnN0cnVjdG9yKGFyZ0NsYXNzZXMpOwotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gKFJlbmRlcmVyKWNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHJlbmRlcmVyKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm5vIGV4dHZhbCByZW5kZXJlciBwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0dmFsIHJlbmRlcmVyIHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZURlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZURlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZGVjb2RlIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZURlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZURlY29kZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckRlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJEZWNvZGUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSB0cnVlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJlbmNvZGVCZWdpbiBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVCZWdpbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVCZWdpbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUNoaWxkcmVuIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImVuY29kZUNoaWxkcmVuIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUNoaWxkcmVuIG9mICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVDaGlsZHJlbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUNoaWxkcmVuIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZW5jb2RlRW5kIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVFbmQgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5lbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJFbmNvZGVFbmQgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlRW5kIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBjb252ZXJ0Q2xpZW50SWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jb252ZXJ0Q2xpZW50SWQoZmFjZXNDb250ZXh0LCBzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0gICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8sIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QgPSBlLmdldFJldHVyblZhbHVlT25FeGNlcHRpb24oY29udmVydGVkT2JqZWN0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJnZXRDb252ZXJ0ZWRWYWx1ZSBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlR2V0Q29udmVydGVkVmFsdWUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgY29udmVydGVkT2JqZWN0ID0gd3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyR2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbywgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRPYmplY3Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9SZW5kZXJlclByb3h5RW50cnkuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvUmVuZGVyZXJQcm94eUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZTU3ZjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9SZW5kZXJlclByb3h5RW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBSZW5kZXJlclByb3h5RW50cnkKLXsKLSAgICBwcml2YXRlIGJvb2xlYW4gZGVjb2RlQ2FsbGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGVuY29kZUJlZ2luQ2FsbGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGVuY29kZUNoaWxkcmVuQ2FsbGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGVuY29kZUVuZENhbGxlZCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBPYmplY3QgY29udmVydGVkVmFsdWUgPSBudWxsOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWNvZGVDYWxsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlY29kZUNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWNvZGVDYWxsZWQoYm9vbGVhbiBkZWNvZGVDYWxsZWQpCi0gICAgewotICAgICAgICB0aGlzLmRlY29kZUNhbGxlZCA9IGRlY29kZUNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuY29kZUJlZ2luQ2FsbGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbmNvZGVCZWdpbkNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVCZWdpbkNhbGxlZChib29sZWFuIGVuY29kZUJlZ2luQ2FsbGVkKQotICAgIHsKLSAgICAgICAgdGhpcy5lbmNvZGVCZWdpbkNhbGxlZCA9IGVuY29kZUJlZ2luQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlQ2hpbGRyZW5DYWxsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVuY29kZUNoaWxkcmVuQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kZUNoaWxkcmVuQ2FsbGVkKGJvb2xlYW4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQpCi0gICAgewotICAgICAgICB0aGlzLmVuY29kZUNoaWxkcmVuQ2FsbGVkID0gZW5jb2RlQ2hpbGRyZW5DYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmNvZGVFbmRDYWxsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVuY29kZUVuZENhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVFbmRDYWxsZWQoYm9vbGVhbiBlbmNvZGVFbmRDYWxsZWQpCi0gICAgewotICAgICAgICB0aGlzLmVuY29kZUVuZENhbGxlZCA9IGVuY29kZUVuZENhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZWRWYWx1ZShPYmplY3QgY29udmVydGVkVmFsdWUpCi0gICAgewotICAgICAgICB0aGlzLmNvbnZlcnRlZFZhbHVlID0gY29udmVydGVkVmFsdWU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMmVlZjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWU5NmNmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzdjNjRhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXJJbnRlcmNlcHRvciBleGNlcHRpb25Tb3VyY2U7Ci0gICAgcHJvdGVjdGVkIE9iamVjdCBpbmZvcm1hdGlvbjsKLSAgICBib29sZWFuIHNraXBPdGhlckludGVyY2VwdG9ycyA9IGZhbHNlOwotCi0gICAgcHVibGljIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbihib29sZWFuIHNraXBPdGhlckludGVyY2VwdG9ycykKLSAgICB7Ci0gICAgICAgIHRoaXMuc2tpcE90aGVySW50ZXJjZXB0b3JzID0gc2tpcE90aGVySW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzLCBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzKHNraXBPdGhlckludGVyY2VwdG9ycyk7Ci0gICAgICAgIHRoaXMuZXhjZXB0aW9uU291cmNlID0gcmVuZGVyZXJJbnRlcmNlcHRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvbihPYmplY3QgaW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICB0aGlzLmluZm9ybWF0aW9uID0gaW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gaW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNraXBPdGhlckludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJldHVyblZhbHVlT25FeGNlcHRpb24oT2JqZWN0IGN1cnJlbnRSZXR1cm5WYWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMuZXhjZXB0aW9uU291cmNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmV4Y2VwdGlvblNvdXJjZS5nZXRSZXR1cm5WYWx1ZU9uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbih0aGlzLCBjdXJyZW50UmV0dXJuVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjdXJyZW50UmV0dXJuVmFsdWU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0Fic3RyYWN0U3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjA5OGJjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0Fic3RyYWN0U3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBJbiBvcmRlciB0byBleGVjdXRlIGxvZ2ljIGp1c3Qgb25jZS4NCi0gKiBlLmcuIHJlZ2lzdGVyIGFydGlmYWN0cyB2aWEgYXBpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lciBpbXBsZW1lbnRzIFBoYXNlTGlzdGVuZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIC8vZG9uJ3QgcmVtb3ZlIC0gaXQncyBhIGZhbGxiYWNrIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIGRlcmVnaXN0cmF0aW9uDQotICAgIC8vdGFyZ2V0OiBkb24ndCBwcm9jZXNzIGluaXQgbG9naWMgbW9yZSB0aGFuIG9uY2UNCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxDbGFzcz4gaW5pdGlhbGl6ZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIHN5bmNocm9uaXplZCAoQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuY2xhc3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCFpbml0aWFsaXplZExpc3RlbmVycy5jb250YWlucyhnZXRDbGFzcygpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydCBpbml0IG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbml0KCk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJpbml0IG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBmaW5hbGx5DQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgSnNmVXRpbHMuZGVyZWdpc3RlclBoYXNlTGlzdGVuZXIodGhpcyk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJhbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgZGVyZWdpc3RlcmluZyB0aGUgcGhhc2UtbGlzdGVuZXIiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldENsYXNzKCkuZ2V0TmFtZSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgLT4gdGhlcmUgaXMganVzdCBhIGxpdHRsZSBvdmVyaGVhZCwiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYnV0IGV2ZXJ5dGhpbmcgZWxzZSB3b3JrcyBjb3JyZWN0bHkuIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGhvd2V2ZXIsIHBsZWFzZSBpbmZvcm0gdGhlIGNvbW11bml0eSBhYm91dCB5b3VyIGNvbmZpZ3VyYXRpb24iLCB0KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBmaW5hbGx5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkTGlzdGVuZXJzLmFkZChnZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuUkVTVE9SRV9WSUVXOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXQoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9FeHRWYWxTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjMzYwYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9FeHRWYWxTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXIKLSAgICAgICAgLkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcgotewotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoRXh0VmFsSW5mb3JtYXRpb24uVkVSU0lPTiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydGluZyB1cCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIHYiICsgRXh0VmFsSW5mb3JtYXRpb24uVkVSU0lPTik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oInN0YXJ0aW5nIHVwIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgVmFsaWRhdGlvbkludGVyY2VwdG9yKCkpOwotCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZLCBFeHRWYWxSZW5kZXJlclByb3h5LmNsYXNzLmdldE5hbWUoKSwgZmFsc2UpOwotCi0gICAgICAgIGluaXROYW1lTWFwcGVycygpOwotICAgICAgICBleGVjdXRlQ3VzdG9tU3RhcnR1cExpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXROYW1lTWFwcGVycygpCi0gICAgewotICAgICAgICBTdHJpbmcgZGVhY3RpdmF0ZURlZmF1bHROYW1lTWFwcGVycyA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0RFRkFVTFRfTkFNRV9NQVBQRVJTOwotICAgICAgICBpZiAoKGRlYWN0aXZhdGVEZWZhdWx0TmFtZU1hcHBlcnMgIT0gbnVsbCAmJiBkZWFjdGl2YXRlRGVmYXVsdE5hbWVNYXBwZXJzLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vcmVnaXN0ZXIgbWV0YWRhdGEgdG8gdmFsaWRhdGlvbiBzdHJhdGVneSBuYW1lIG1hcHBlcgotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOwotCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOwotCi0gICAgICAgIC8vcmVnaXN0ZXIgdmFsaWRhdGlvbiBzdHJhdGVneSB0byBtZXNzYWdlIHJlc29sdmVyIG5hbWUgbWFwcGVyCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsKLQotICAgICAgICAvL3JlZ2lzdGVyIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWV0YWRhdGEgdHJhbnNmb3JtZXIgbmFtZSBtYXBwZXIKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleGVjdXRlQ3VzdG9tU3RhcnR1cExpc3RlbmVyKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBjdXN0b21TdGFydHVwTGlzdGVuZXJOYW1lID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5TVEFSVFVQX0xJU1RFTkVSKTsKLSAgICAgICAgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIgY3VzdG9tU3RhcnR1cExpc3RlbmVyID0KLSAgICAgICAgICAgIChBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY3VzdG9tU3RhcnR1cExpc3RlbmVyTmFtZSk7Ci0KLSAgICAgICAgaWYoY3VzdG9tU3RhcnR1cExpc3RlbmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oInN0YXJ0IGluaXQgb2YgIiArIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lci5pbml0KCk7Ci0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImluaXQgb2YgIiArIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYyNTEwYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkgaW1wbGVtZW50cyBGYWNlc01lc3NhZ2VGYWN0b3J5DQotew0KLSAgICBwdWJsaWMgRmFjZXNNZXNzYWdlIGNvbnZlcnQoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYoaXNMYWJlbGVkRmFjZXNNZXNzYWdlKGZhY2VzTWVzc2FnZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjcmVhdGUoZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCksIGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCksIGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBWaW9sYXRpb25NZXNzYWdlKHNldmVyaXR5LCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzTGFiZWxlZEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHVzZSB0aGUgaW50ZXJmYWNlIGhlcmUNCi0gICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2UgaW5zdGFuY2VvZiBWaW9sYXRpb25NZXNzYWdlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvTGFiZWxlZE1lc3NhZ2UuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvTGFiZWxlZE1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RmN2FlNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0xhYmVsZWRNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBkb24ndCByZW1vdmUgKlRleHQgLSBpdCB3b3VsZCBsZWFkIHRvIGFuIG92ZXJsYXAgd2l0aCB0cmluaWRhZA0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTGFiZWxlZE1lc3NhZ2UNCi17DQotICAgIFN0cmluZyBnZXRMYWJlbFRleHQoKTsNCi0gICAgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIGxhYmVsKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9WaW9sYXRpb25NZXNzYWdlLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL1Zpb2xhdGlvbk1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA4MTQzNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL1Zpb2xhdGlvbk1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBWaW9sYXRpb25NZXNzYWdlIGV4dGVuZHMgRmFjZXNNZXNzYWdlIGltcGxlbWVudHMgTGFiZWxlZE1lc3NhZ2UNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY5MDM5NTg5NDI5ODc3MTEyMzFMOw0KLSAgICBwcml2YXRlIFN0cmluZyBsYWJlbDsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHN1bW1hcnlMYWJlbFJlcGxhY2VkID0gZmFsc2U7DQotICAgIHByaXZhdGUgYm9vbGVhbiBkZXRhaWxMYWJlbFJlcGxhY2VkID0gZmFsc2U7DQotDQotICAgIHB1YmxpYyBWaW9sYXRpb25NZXNzYWdlKFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzKFNFVkVSSVRZX0VSUk9SLCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWaW9sYXRpb25NZXNzYWdlKFNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOw0KLSAgICAgICAgc2V0U3VtbWFyeShzdW1tYXJ5KTsNCi0gICAgICAgIHNldERldGFpbChkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxhYmVsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBnZXRTdW1tYXJ5KCkNCi0gICAgew0KLSAgICAgICAgaWYobGFiZWwgIT0gbnVsbCAmJiAhdGhpcy5zdW1tYXJ5TGFiZWxSZXBsYWNlZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXRTdW1tYXJ5KGdldExhYmVsZWRNZXNzc2FnZShzdXBlci5nZXRTdW1tYXJ5KCksIGdldExhYmVsVGV4dCgpKSk7DQotICAgICAgICAgICAgdGhpcy5zdW1tYXJ5TGFiZWxSZXBsYWNlZCA9IHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0U3VtbWFyeSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERldGFpbCgpDQotICAgIHsNCi0gICAgICAgIGlmKGxhYmVsICE9IG51bGwgJiYgIXRoaXMuZGV0YWlsTGFiZWxSZXBsYWNlZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXREZXRhaWwoZ2V0TGFiZWxlZE1lc3NzYWdlKHN1cGVyLmdldERldGFpbCgpLCBnZXRMYWJlbFRleHQoKSkpOw0KLSAgICAgICAgICAgIHRoaXMuZGV0YWlsTGFiZWxSZXBsYWNlZCA9IHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RGV0YWlsKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGFiZWxlZE1lc3NzYWdlKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UuY29udGFpbnMoInsiICsgaSArICJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCJ7IiArIGkgKyAifSIsIGxhYmVsKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YzgwNWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7DQotDQotLyoqDQotICogTWVzc2FnZVJlc29sdmVyIHdoaWNoIHVzZXMgcHJvcGVydHkgZmlsZXMuDQotICogU3ViY2xhc3NlcyBqdXN0IGhhdmUgdG8gcHJvdmlkZSB0aGUgcGFja2FnZSB0byBsb29rIGF0Lg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIGNhbiBhbHNvIHByb3ZpZGUgYSBjdXN0b20gbmFtZSB3aGljaCBpcyBlLmcuIGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciBpbXBsZW1lbnRzIE1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIgPSAiPz8/IjsNCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0RFRkFVTFRfQ09OVkVOVElPTjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZGVmYXVsdEJ1bmRsZSA9IG51bGw7DQotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VCdW5kbGVCYXNlTmFtZTsNCi0gICAgLy93aXRoIGpzZiAxLjEgb25seSBhdmFpbGFibGUgaWYgdGhlcmUgaXMgYSBjdXN0b20gYmVhbg0KLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlQnVuZGxlVmFyTmFtZTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGtleSA9PSBudWxsIHx8IGtleS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIGN1c3RvbU1lc3NhZ2UgPSBudWxsOw0KLQ0KLSAgICAgICAgLy9vbmx5IGluIGNhc2Ugb2YgYSBWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggaXMgY29uZmlndXJlZCBhcyBiZWFuDQotICAgICAgICBpZiAodGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSh0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSwgbG9jYWxlKTsNCi0gICAgICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm1lc3NhZ2UgYnVuZGxlICIgKyB0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSArICIgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvL29ubHkgaW4gY2FzZSBvZiBhIFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciB3aGljaCBpcyBjb25maWd1cmVkIGFzIGJlYW4NCi0gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VCdW5kbGVWYXJOYW1lICE9IG51bGwgJiYgY3VzdG9tTWVzc2FnZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gKFJlc291cmNlQnVuZGxlKSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4obWVzc2FnZUJ1bmRsZVZhck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigibWVzc2FnZSBidW5kbGUgdmFyIG5hbWUgIiArIHRoaXMubWVzc2FnZUJ1bmRsZVZhck5hbWUgKyAiIG5vdCBmb3VuZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGN1c3RvbU1lc3NhZ2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qDQotICAgICAgICAgKiB0cnkgdG8gdXNlIHRoZSBjb252ZW50aW9uIGZvciB0aGUgbWVzc2FnZSBidW5kbGUNCi0gICAgICAgICAqLw0KLSAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHRyeVRvVXNlTWVzc2FnZUJ1bmRsZUNvbnZlbnRpb24oa2V5LCBsb2NhbGUpOw0KLQ0KLSAgICAgICAgaWYgKGN1c3RvbU1lc3NhZ2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qDQotICAgICAgICAgKiBubyBtZXNzYWdlIGJ1bmRsZSBvciBtZXNzYWdlIGZvdW5kICh3aXRoIHRoZSBjb252ZW50aW9uKT8NCi0gICAgICAgICAqLw0KLQ0KLSAgICAgICAgLy90cnkgdG8gbG9hZCBjdXN0b20gbWVzc2FnZXMNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEN1c3RvbUJhc2VOYW1lKCksIGxvY2FsZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyBjdXN0b20gbWVzc2FnZSBmb3IgIiArIGtleSArICIgd2l0aGluICIgKyBnZXRDdXN0b21CYXNlTmFtZSgpLCBlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vdXNlIGN1c3RvbSBuYW1lIChpZiBwb3NzaWJsZSkgb3RoZXJ3aXNlOiBmYWxsYmFjayB0byBkZWZhdWx0IG1lc3NhZ2UgKGlmIHBvc3NpYmxlKQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChjdXN0b21NZXNzYWdlICE9IG51bGwpID8gY3VzdG9tTWVzc2FnZQ0KLSAgICAgICAgICAgICAgICA6IChnZXRCYXNlTmFtZSgpICE9IG51bGwpID8gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEJhc2VOYW1lKCksIGxvY2FsZSkuZ2V0U3RyaW5nKGtleSkgOiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBNSVNTSU5HX1JFU09VUkNFX01BUktFUiArIGtleSArIE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvVXNlTWVzc2FnZUJ1bmRsZUNvbnZlbnRpb24oU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1c3RvbU1lc3NhZ2UgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKChkZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb24gPT0gbnVsbCB8fCAhZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgICAgICAmJiBpc0RlZmF1bHRNZXNzYWdlQnVuZGxlQ29udmVudGlvbkFjdGl2ZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChkZWZhdWx0QnVuZGxlID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX0JVTkRMRV9OQU1FKSwgbG9jYWxlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZw0KLSAgICAgICAgICAgICAgICAgICAgZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID0gInRydWUiOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChkZWZhdWx0QnVuZGxlICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IGRlZmF1bHRCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGVmYXVsdE1lc3NhZ2VCdW5kbGVDb252ZW50aW9uQWN0aXZlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRCYXNlTmFtZSgpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUJ1bmRsZUJhc2VOYW1lKFN0cmluZyBtZXNzYWdlQnVuZGxlQmFzZU5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lID0gbWVzc2FnZUJ1bmRsZUJhc2VOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VCdW5kbGVWYXJOYW1lKFN0cmluZyBtZXNzYWdlQnVuZGxlVmFyTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSA9IG1lc3NhZ2VCdW5kbGVWYXJOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQwZTY4Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyBhIE1lc3NhZ2VSZXNvbHZlciBmb3IgYSBnaXZlbiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJhZGQgZ2VuZXJpYyBqYXZhIGFwaSAoZGUtL3JlZ2lzdGVyIG1hcHBpbmcpIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotICAgICAgICBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXNzYWdlUmVzb2x2ZXI+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nOw0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBuYW1lTWFwcGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PigpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlUmVzb2x2ZXIgY3JlYXRlKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHN0cmF0ZWd5TmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChNZXNzYWdlUmVzb2x2ZXIpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmdldChzdHJhdGVneU5hbWUpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICBTdHJpbmcgcmVzb2x2ZXJOYW1lOw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vYnVpbGQgY29udmVudGlvbiAoVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKQ0KLSAgICAgICAgICAgIHJlc29sdmVyTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIC8vbmFtZSB3YXNuJ3QgbWFwcGVkDQotICAgICAgICAgICAgaWYgKHJlc29sdmVyTmFtZSA9PSBudWxsIHx8IHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMocmVzb2x2ZXJOYW1lKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtZXNzYWdlUmVzb2x2ZXIgPSAoTWVzc2FnZVJlc29sdmVyKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUocmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWVzc2FnZVJlc29sdmVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKHN0cmF0ZWd5TmFtZSwgcmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZXNvbHZlck5hbWUgKyAiIHVzZWQgZm9yICIgKyBzdHJhdGVneU5hbWUpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYWRkTWFwcGluZyhzdHJhdGVneU5hbWUsIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotDQotICAgICAgICAvL3NldHVwIGludGVybmFsIHN0YXRpYyBtYXBwaW5ncw0KLSAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgOg0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsU3RyaW5nPj4gbWFwcGluZ3MpDQotICAgIHsNCi0gICAgICAgIGZvcihTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IG1hcHBpbmcgOiBtYXBwaW5ncykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNYXBwaW5nKG1hcHBpbmcuZ2V0U291cmNlKCksIG1hcHBpbmcuZ2V0VGFyZ2V0KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgbWVzc2FnZVJlc29sdmVyTmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZGRpbmcgc3RhdGljIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWVzc2FnZSByZXNvbHZlciBtYXBwaW5nOiAiDQotICAgICAgICAgICAgICAgICsgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArICIgLT4gIiArIG1lc3NhZ2VSZXNvbHZlck5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLnB1dCh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBtZXNzYWdlUmVzb2x2ZXJOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IGdldE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5hbWVNYXBwZXJMaXN0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OWVkYzYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IE1lc3NhZ2VSZXNvbHZlciB3aGljaCB1c2VzIHRoZSBkZWZhdWx0IGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gbWVzc2FnZSBidW5kbGUgdmlhIHdlYi54bWwNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CVU5ETEUgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FU1NBR0VfQlVORExFOw0KLQ0KLSAgICAvL25vdCB1c2VkIGF0IHRoZSBtb21lbnQgLSBqdXN0IGZvciBhIGNvbnZlbnRpb24NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNb2R1bGVNZXNzYWdlQnVuZGxlTmFtZShnZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tQmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ1VTVE9NX0JVTkRMRTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL01lc3NhZ2VSZXNvbHZlci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNjYTFjMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL01lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBNZXNzYWdlUmVzb2x2ZXJzIGluZGVwZW5kZW50IG9mIHRoZSBtZXNzYWdlIHNvdXJjZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGQ0MGI2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NzQwMWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXNzYWdlUmVzb2x2ZXJzLg0KLSAqIChjb25maWd1cmVkIHZpYSB3ZWIueG1sKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzcyMDM1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ3kgdG8gTWVzc2FnZVJlc29sdmVyLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NU0dfUkVTT0xWRVJfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYjU5YjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIHByb3ZpZGUgYSBOYW1lTWFwcGVyIHBlciB2YWxpZGF0aW9uIG1vZHVsZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBzdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NDgzOGIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIG1hcHMgRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIEV4dFZhbCBNZXNzYWdlUmVzb2x2ZXJzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKHN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI2MDZmNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgdG8gcGxhY2UgVmFsaWRhdGlvblN0cmF0ZWdpZXMgYW5kIE1lc3NhZ2VSZXNvbHZlcnMgaW4gdGhlIHNhbWUgcGFja2FnZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBzdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1c3RvbVBvc3RmaXggPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWCk7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHN0cmF0ZWd5Q2xhc3NOYW1lLCBjdXN0b21Qb3N0Zml4KTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2QzNzllLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci0KLS8qKgotICogUHJvdmlkZXMgdGhlIGFiaWxpdHkgb2YgbWVzc2FnZSByZXNvbHZpbmcgdG8gVmFsaWRhdGlvblN0cmF0ZWdpZXMKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kKLXsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCA9ICJfZGV0YWlsIjsKLSAgICAvL2UuZy4gZm9yIGluamVjdGluZyBhIG1lc3NhZ2UgcmVzb2x2ZXIgdmlhIHNwcmluZwotICAgIHByaXZhdGUgTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcjsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIExvY2FsZSBsb2NhbGUgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKTsKLQotICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlUmVzb2x2ZXIgIT0gbnVsbCA/IHRoaXMubWVzc2FnZVJlc29sdmVyLmdldE1lc3NhZ2Uoa2V5LCBsb2NhbGUpIDoKLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldE1lc3NhZ2VSZXNvbHZlckZvclZhbGlkYXRpb25TdHJhdGVneSh0aGlzKS5nZXRNZXNzYWdlKGtleSwgbG9jYWxlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlc29sdmVNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gKGtleSAhPSBudWxsKSA/IHJlc29sdmVNZXNzYWdlKGtleSArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYKSA6IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRmFjZXNNZXNzYWdlIGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWFzc2FnZShBbm5vdGF0aW9uIGFubm90YXRpb24pCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKGdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiksIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VSZXNvbHZlcihNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyKQotICAgIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlUmVzb2x2ZXIgPSBtZXNzYWdlUmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pCi0gICAgewotICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMLCBnZXRMYWJlbChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5KSk7Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbik7Ci0gICAgfQotCi0gICAgLy9mb3IgY3VzdG9tIGFubm90YXRpb25zIC0gb3ZlcnJpZGUgaWYgbmVlZGVkCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNjk0YjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogUHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gdXNlIFZhbGlkYXRvckV4Y2VwdGlvbiAoYXMgZXhwZWN0ZWQgYnkgdGhlIHVzZXIpIGluc3RlYWQgb2YgQ29udmVydGVyRXhjZXB0aW9uLg0KLSAqIEZ1cnRoZXJtb3JlIGl0IHByb3ZpZGVzOjxici8+DQotICogaW5pdFZhbGlkYXRpb248YnIvPg0KLSAqIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGluaXRWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpbml0VmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJpbml0VmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7DQotICAgICAgICB9DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgcHJvY2Vzc1ZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHJvY2Vzc1ZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgicHJvY2Vzc1ZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24gPSBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29udmVydEZhY2VzTWVzc2FnZShlLmdldEZhY2VzTWVzc2FnZSgpKSwgZS5nZXRDYXVzZSgpKTsNCi0gICAgICAgICAgICBpZiAocHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgIjogdGhyb3cgb3JpZ2luYWwgZXhjZXB0aW9uIGFmdGVyIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHRocm93IHZhbGlkYXRvckV4Y2VwdGlvbjsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgIjogb3JpZ2luYWwgZXhjZXB0aW9uIGFmdGVyIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbiwgdGhpcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNWRjNGUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0NCi0gKiBhZGFwdGVyIHRvIGNvbm5lY3QgdmFsaWRhdGlvbiBzdHJhdGVnaWVzIHdpdGggbWV0YS1kYXRhIHRyYW5zZm9ybWVycywNCi0gKiBpZiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBkZWZpbmVkIGFzIGJlYW4gYW5kIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBpbnRlcmZhY2UgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIgZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIC8vdG8gZ2V0IGJhY2sgdGhlIGludGVybmFsIGNhc2hpbmcNCi0gICAgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpOw0KLQ0KLSAgICBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzVjYjYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLkJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotDQotICogYWRhcHRlciB0byBjb25uZWN0IHZhbGlkYXRpb24gc3RyYXRlZ2llcyB3aXRoIG1ldGEtZGF0YSB0cmFuc2Zvcm1lcnMsDQotICogaWYgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgZGVmaW5lZCBhcyBiZWFuIGFuZCBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIC8vb3B0aW9uYWwgZmFsbGJhY2sgZm9yIGludGVybmFsIGNhc2hpbmcNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOw0KLQ0KLSAgICBwdWJsaWMgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyIGluc3RhbmNlb2YgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIpIG1ldGFEYXRhVHJhbnNmb3JtZXIgKS5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGdldE1ldGFEYXRhVHJhbnNmb3JtZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVRyYW5zZm9ybWVyKE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyID0gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsaWRhdGlvblN0cmF0ZWd5ID0gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJhZDRmOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyDQotICAgIC5Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotDQotLyoqDQotICogRmFjdG9yeSB3aGljaCBjcmVhdGVzIHRoZSBWYWxpZGF0aW9uU3RyYXRlZ3kgZm9yIGEgZ2l2ZW4gTWV0YS1EYXRhIEtleQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkNCi0gICAgICAgIGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxTdHJpbmcsIFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9IG51bGw7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBjcmVhdGUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICBpZiAobWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljTWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZy5jb250YWluc0tleShtZXRhRGF0YUtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nLmdldChtZXRhRGF0YUtleSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWU7DQotICAgICAgICAvL251bGwgLT4gdXNlIG5hbWUgbWFwcGVycw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFN0cmluZz4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0cmF0ZWd5TmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZShtZXRhRGF0YUtleSk7DQotDQotICAgICAgICAgICAgaWYgKHN0cmF0ZWd5TmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKHN0cmF0ZWd5TmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyhtZXRhRGF0YUtleSwgc3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lJbnN0YW5jZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUNCi0gICAgICAgICAgICAuc3RhcnRzV2l0aChBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5QUkVGSVhfRk9SX0JFQU5fTUFQUElORykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbih2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLlBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HLmxlbmd0aCgpKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgbWV0YURhdGFLZXksIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImFkZGluZyBtZXRhLWRhdGEga2V5IHRvIHZhbGlkYXRpb24gc3RyYXRlZ3kgbWFwcGluZzogIg0KLSAgICAgICAgICAgICAgICArIG1ldGFEYXRhS2V5ICsgIiAtPiAiICsgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZy5wdXQobWV0YURhdGFLZXksIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbml0U3RhdGljTWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgLy9zZXR1cCBpbnRlcm5hbCBzdGF0aWMgbWFwcGluZ3MNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnIDoNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgPSBuZXcgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAvL3RyeSB0byBzZXR1cCBtYXBwaW5nIHdpdGggYmFzZSBuYW1lIGJ5IGNvbnZlbnRpb24gLSBvdmVycmlkZXMgZGVmYXVsdCBtYXBwaW5nDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2J1aWxkIGNvbnZlbnRpb24gKHN0cmF0ZWd5IG1hcHBpbmcpDQotICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZyhFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFKSk7DQotDQotICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotDQotICAgICAgICAvL3NldHVwIGN1c3RvbSBtYXBwaW5nIC0gb3ZlcnJpZGVzIGFsbCBvdGhlciBtYXBwaW5ncw0KLSAgICAgICAgU3RyaW5nIGN1c3RvbU1hcHBpbmdCYXNlTmFtZSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORzsNCi0gICAgICAgIGlmIChjdXN0b21NYXBwaW5nQmFzZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHN0YXRpY0NvbmZpZyA9IG5ldyBTdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZyhjdXN0b21NYXBwaW5nQmFzZU5hbWUpOw0KLSAgICAgICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cFN0cmF0ZWd5TWFwcGluZ3MoTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhtYXBwaW5nLmdldFNvdXJjZSgpLCBtYXBwaW5nLmdldFRhcmdldCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+IGdldE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZU1hcHBlckxpc3Q7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1NTIzZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBCYXNlIGludGVyZmFjZSBmb3IgVmFsaWRhdGlvblN0cmF0ZWdpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLS8vKlZhbGlkYXRpb25TdHJhdGVneSBpbnN0ZWFkIG9mICpWYWxpZGF0b3IgdG8gYXZvaWQgbmFtaW5nIGNvbmZ1c2lvbiANCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjliM2YwZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1ZDM2MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIE5hbWUgTWFwcGVyIHdoaWNoIGRlbGVnYXRlcyB0aGUgbmFtZSBtYXBwaW5nLCBleHRyYWN0IHRoZSBuYW1lIGFuZCBjb252ZXJ0IGl0IHRvIGEgYmVhbiBuYW1lICsgcHJlZml4DQotICogdGFyZ2V0OiBjb25maWd1cmUgYSB2YWxpZGF0aW9uIHN0cmF0ZWd5IHZpYSBhIG1hbmFnZWQgYmVhbiBmYWNpbGl0eSAtPiBhbGxvd3MgdG8gaW5qZWN0IG90aGVyIGJlYW5zDQotICogaW5zdGVhZCBvZiBhcGkgY2FsbHMgKyBoYXJkY29kZWQgYmVhbiBuYW1lcw0KLSAqIDxwLz4NCi0gKiBhbGxvd2VkIGJlYW4gc2NvcGVzOg0KLSAqIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIHN0YXRlbGVzczogYXBwbGljYXRpb24vc2luZ2xldG9uDQotICogdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgc3RhdGVmdWw6IG5vbmUvcHJvdG90eXBlDQotICogZG9uJ3QgdXNlIHRoZSBzZXNzaW9uIG9yIGEgY29udmVyc2F0aW9uIHNjb3BlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HID0gImJlYW46IjsNCi0gICAgcHJpdmF0ZSBOYW1lTWFwcGVyPFN0cmluZz4gd3JhcHBlZDsNCi0NCi0gICAgcHVibGljIEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKE5hbWVNYXBwZXI8U3RyaW5nPiBuYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSBuYW1lTWFwcGVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbmFtZSA9IHdyYXBwZWQuY3JlYXRlTmFtZShzb3VyY2UpOw0KLQ0KLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKTsNCi0gICAgICAgIHJldHVybiBQUkVGSVhfRk9SX0JFQU5fTUFQUElORyArIG5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvTG93ZXJDYXNlKCkgKyBuYW1lLnN1YnN0cmluZygxKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmUxZjZlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgQW5ub3RhdGlvbnMgdG8gVmFsaWRhdGlvblN0cmF0ZWdpZXMuDQotICogKGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjhkZGZhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBBbm5vdGF0aW9ucyB0byBWYWxpZGF0aW9uU3RyYXRlZ2llcy4NCi0gKiAoY29uZmlndXJlZCB2aWEgaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbikNCi0gKiBUaGUgYmVhbiBwcm92aWRlcyB0aGUgZGVmYXVsdCBuYW1lIChjb252ZW50aW9uKS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gZnVsbCBxdWFsaWZpZWQgbmFtZS4gKD0gY3VzdG9taXphYmxlIGNvbnZlbnRpb24pDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MGU0MjAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIG1hcHMgRXh0VmFsIEFubm90YXRpb25zIHRvIEV4dFZhbCBWYWxpZGF0aW9uU3RyYXRlZ2llcy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZShtZXRhRGF0YUtleSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MGE2MTIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIHRvIHBsYWNlIEFubm90YXRpb25zIGFuZCBWYWxpZGF0aW9uU3RyYXRlZ2llcyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5ICsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvUHJpb3JpdHkuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvUHJpb3JpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTExYWEzMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGVudW0gUHJpb3JpdHkKLXsKLSAgICBCTE9DS0lORywKLSAgICBISUdILAotICAgIE1FRElVTSwKLSAgICBMT1cKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVG9Eby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTdmZDU3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVG9Eby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotcHVibGljIEBpbnRlcmZhY2UgVG9EbwotewotICAgIFByaW9yaXR5IHZhbHVlKCk7Ci0gICAgU3RyaW5nIGRlc2NyaXB0aW9uKCkgZGVmYXVsdCAiIjsKLQotICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgIEBpbnRlcmZhY2UgTGlzdAotICAgIHsKLSAgICAgICAgVG9Eb1tdIHZhbHVlKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VDYXRlZ29yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0N2IzODUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLS8qKgotICogQVBJOjxici8+Ci0gKiBwYXJ0cyB5b3UgbWlnaHQgbmVlZCBmb3IgY3VzdG9tIGltcGxlbWVudGF0aW9ucyBhbmQgd2hpY2ggYXJlIHF1aXRlIHN0YWJsZSBpbiB2aWV3IG9mIGNoYW5nZXMKLSAqIDxwLz4KLSAqIElOVEVSTkFMOjxici8+Ci0gKiBpZiB5b3UgdGhpbmsgYWJvdXQgcmVmZXJlbmNpbmcgYW4gYXJ0aWZhY3Qgd2hpY2ggaXMgbWFya2VkIGFzIGludGVybmFsLCBhc2sgZm9yIHN1cHBvcnQuCi0gKiB0aGVyZSBzaG91bGQgYmUgYSBiZXR0ZXIgc29sdXRpb24KLSAqIDxwLz4KLSAqIENVU1RPTUlaQUJMRTo8YnIvPgotICogYSBwbGFubmVkIGV4dGVuc2lvbiBwb2ludCB3aGljaCBjb250YWlucyBsb2dpYyB0byBjdXN0b21pemUgdGhlIGZyYW1ld29yay4KLSAqIGlmIGl0IGlzbid0IGFsc28gbWFya2VkIGFzIEFQSSBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotICogaG93ZXZlciwgd2UgdHJ5IHRvIGtlZXAgaXQgYXMgc3RhYmxlIGFzIHBvc3NpYmxlIGFuZCByZWFzb25hYmxlLgotICogPHAvPgotICogUkVVU0U6PGJyLz4KLSAqIGFuIGFydGlmYWN0IHdoaWNoIHlvdSBjYW4gcmV1c2UgZm9yIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uLgotICogaWYgaXQgaXNuJ3QgbWFya2VkIGFzIEFQSSBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotICogaG93ZXZlciwgd2UgdHJ5IHRvIGtlZXAgaXQgYXMgc3RhYmxlIGFzIHBvc3NpYmxlIGFuZCByZWFzb25hYmxlLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLXB1YmxpYyBlbnVtIFVzYWdlQ2F0ZWdvcnkKLXsKLSAgICBBUEksCi0gICAgSU5URVJOQUwsCi0gICAgQ1VTVE9NSVpBQkxFLAotICAgIFJFVVNFCi19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlSW5mb3JtYXRpb24uamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTM3ZWJjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIGl0J3MgYW4gaW50ZXJuYWwgYW5ub3RhdGlvbiB0byBwcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gY29uY2VybmluZyB1c2FnZS1jYXRlZ29yaWVzCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkKLSAqLwotQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi1wdWJsaWMgQGludGVyZmFjZSBVc2FnZUluZm9ybWF0aW9uCi17Ci0gICAgVXNhZ2VDYXRlZ29yeVtdIHZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0NsYXNzVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VhNjViMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsNCi1pbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ2xhc3NVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENsYXNzVXRpbHMuY2xhc3MpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIHRyeVRvTG9hZENsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGxvYWRDbGFzc0Zvck5hbWUobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGxvYWRDbGFzc0Zvck5hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIFRyeSBXZWJBcHAgQ2xhc3NMb2FkZXIgZmlyc3QNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwDQotICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWdub3JlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIGZhbGxiYWNrOiBUcnkgQ2xhc3NMb2FkZXIgZm9yIENsYXNzVXRpbHMgKGkuZS4gdGhlIG15ZmFjZXMuamFyIGxpYikNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwDQotICAgICAgICAgICAgICAgIENsYXNzVXRpbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnN0YW50aWF0ZUNsYXNzKENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0Q2xhc3MubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoU3RyaW5nIGNsYXNzTmFtZSkNCi0gICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsb2FkQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKYXJWZXJzaW9uKENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY2xhc3NGaWxlUGF0aCA9IHRhcmdldENsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSArICIuY2xhc3MiOw0KLSAgICAgICAgU3RyaW5nIG1hbmlmZXN0RmlsZVBhdGggPSAiL01FVEEtSU5GL01BTklGRVNULk1GIjsNCi0NCi0gICAgICAgIFN0cmluZyBjbGFzc0xvY2F0aW9uID0gdGFyZ2V0Q2xhc3MuZ2V0UmVzb3VyY2UodGFyZ2V0Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi5jbGFzcyIpLnRvU3RyaW5nKCk7DQotICAgICAgICBTdHJpbmcgbWFuaWZlc3RGaWxlTG9jYXRpb24gPSBjbGFzc0xvY2F0aW9uDQotICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgY2xhc3NMb2NhdGlvbi5pbmRleE9mKGNsYXNzRmlsZVBhdGgpIC0gMSkgKyBtYW5pZmVzdEZpbGVQYXRoOw0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBNYW5pZmVzdChuZXcgVVJMKG1hbmlmZXN0RmlsZUxvY2F0aW9uKS5vcGVuU3RyZWFtKCkpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5nZXRWYWx1ZShBdHRyaWJ1dGVzLk5hbWUuSU1QTEVNRU5UQVRJT05fVkVSU0lPTik7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKExPRy5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTE9HLnRyYWNlKCJjb3VsZG4ndCBsb2FkIHZlcnNpb24gb2YgamFyIGZpbGUgd2hpY2ggY29udGFpbnMgIiArIHRhcmdldENsYXNzLmdldE5hbWUoKSwgdCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxVdGlscy5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZTczOTIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkVMSGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5BYnN0cmFjdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5OYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY2VzTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPR0dFUiA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEV4dFZhbFV0aWxzLmNsYXNzKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX1JFUVVJUkVEID0gImphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUlucHV0LlJFUVVJUkVEIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX1JFUVVJUkVEX0RFVEFJTCA9ICJqYXZheC5mYWNlcy5jb21wb25lbnQuVUlJbnB1dC5SRVFVSVJFRF9kZXRhaWwiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfTUFYSU1VTSA9ICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yLk1BWElNVU0iOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwgPSAiamF2YXguZmFjZXMudmFsaWRhdG9yLkxlbmd0aFZhbGlkYXRvci5NQVhJTVVNX2RldGFpbCI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nRmFjdG9yeTxTdHJpbmcsIFZhbGlkYXRpb25TdHJhdGVneT4pIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUobWV0YURhdGFLZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIE5hbWVNYXBwZXI8U3RyaW5nPiBtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5yZWdpc3RlcihtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlcmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gbWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZXJlZ2lzdGVyKG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZW55TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVueShtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckZvclZhbGlkYXRpb25TdHJhdGVneShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWV0YURhdGFUcmFuc2Zvcm1lcj4pIEV4dFZhbENvbnRleHQNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5yZWdpc3Rlcih2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlcmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVueVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlbnkodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKCkNCi0gICAgew0KLSAgICAgICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksIENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICB7DQotICAgICAgICBmb3IoQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRDb21wb25lbnRJbml0aWFsaXplcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjb21wb25lbnRJbml0aWFsaXplci5jb25maWd1cmVDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOw0KLQ0KLSAgICAgICAgZm9yKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCF2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJUaHJvd2luZygNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uLCB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3IoZmluYWwgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgTWV0YURhdGFFeHRyYWN0b3IoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcmVzdWx0ID0gbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIG9iamVjdCk7DQotICAgICAgICAgICAgICAgIGZvcihNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciA6DQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmFmdGVyRXh0cmFjdGluZyhyZXN1bHQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VSZXNvbHZlciBnZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1lc3NhZ2VSZXNvbHZlcj4pRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgLmNyZWF0ZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAucmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZXJlZ2lzdGVyKHZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVueVZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVueSh2YWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBFTEhlbHBlciBnZXRFTEhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRUxfSEVMUEVSX0ZBQ1RPUlksIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmNsYXNzKS5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY2VzTWVzc2FnZSBjcmVhdGVGYWNlc01lc3NhZ2UoU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcmVhdGVGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjZXNNZXNzYWdlIGNyZWF0ZUZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkZBQ0VTX01FU1NBR0VfRkFDVE9SWSwgRmFjZXNNZXNzYWdlRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZShzZXZlcml0eSwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY2VzTWVzc2FnZSBjb252ZXJ0RmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRkFDRVNfTUVTU0FHRV9GQUNUT1JZLCBGYWNlc01lc3NhZ2VGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuY29udmVydChmYWNlc01lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHlEZXRhaWxzIGNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgYmFzZU9iamVjdDsNCi0gICAgICAgIGlmKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKHRhcmdldEV4cHJlc3Npb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmJlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgU3RyaW5nIGV4cHJlc3Npb24gPSB2YmUuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgICAgIGJhc2VPYmplY3QgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YmUuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURldGFpbHMoDQotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uc3Vic3RyaW5nKDIsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKSwgYmFzZU9iamVjdCwgdmJlLmdldFByb3BlcnR5KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIG9yaWdpbmFsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eSgNCi0gICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgU3RyaW5nIG5ld0Jhc2VLZXkgPSBvcmlnaW5hbC5nZXRLZXkoKS5zdWJzdHJpbmcoMCwgb3JpZ2luYWwuZ2V0S2V5KCkubGFzdEluZGV4T2YoIi4iKSArIDEpOw0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IG5ld0Jhc2VLZXkgKyB0YXJnZXRFeHByZXNzaW9uOw0KLQ0KLSAgICAgICAgYmFzZU9iamVjdCA9IFJlZmxlY3Rpb25VdGlscy5nZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKG9yaWdpbmFsLmdldEJhc2VPYmplY3QoKSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICBuZXdLZXksIGJhc2VPYmplY3QsIHRhcmdldEV4cHJlc3Npb24uc3Vic3RyaW5nKHRhcmdldEV4cHJlc3Npb24ubGFzdEluZGV4T2YoIi4iKSArIDEsDQotICAgICAgICAgICAgdGFyZ2V0RXhwcmVzc2lvbi5sZW5ndGgoKSkpOw0KLSAgICB9DQotDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb1BsYWNlTGFiZWwoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgU3RyaW5nIGxhYmVsLCBpbnQgaW5kZXgpDQotICAgIHsNCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLmNvbnRhaW5zKCJ7IiArIGluZGV4ICsgIn0iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLnJlcGxhY2UoInsiICsgaW5kZXggKyAifSIsIGxhYmVsKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkuY29udGFpbnMoInsiICsgaW5kZXggKyAifSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNNZXNzYWdlLmdldERldGFpbCgpLnJlcGxhY2UoInsiICsgaW5kZXggKyAifSIsIGxhYmVsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VXaXRoRGVmYXVsdE1heGltdW1NZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIGludCBtYXhMZW5ndGgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZSA9IEpzZlV0aWxzLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfTUFYSU1VTSk7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZTsNCi0NCi0gICAgICAgIC8vdXNlIHRyeS9jYXRjaCBmb3IgZWFzaWVyIHN5bmMgYmV0d2VlbiB0cnVuay9icmFuY2gNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEpzZlV0aWxzLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IEpzZlV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vanNmIDEuMiBkb2Vzbid0IGhhdmUgYSBkZXRhaWwgbWVzc2FnZQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2UgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZS5yZXBsYWNlKCJ7MH0iLCAiIiArIG1heExlbmd0aCk7DQotICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsLnJlcGxhY2UoInswfSIsICIiICsgbWF4TGVuZ3RoKTsNCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGZhY2VzUmVxdWlyZWRNZXNzYWdlKTsNCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwpOw0KLSAgICB9DQotDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBsYWNlV2l0aERlZmF1bHRSZXF1aXJlZE1lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGZhY2VzUmVxdWlyZWRNZXNzYWdlID0gSnNmVXRpbHMuZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhKQVZBWF9GQUNFU19SRVFVSVJFRCk7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZTsNCi0NCi0gICAgICAgIC8vdXNlIHRyeS9jYXRjaCBmb3IgZWFzaWVyIHN5bmMgYmV0d2VlbiB0cnVuay9icmFuY2gNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEpzZlV0aWxzLmdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcoSkFWQVhfRkFDRVNfUkVRVUlSRURfREVUQUlMKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBKc2ZVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkuZ2V0U3RyaW5nKEpBVkFYX0ZBQ0VTX1JFUVVJUkVEX0RFVEFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9qc2YgMS4yIGRvZXNuJ3QgaGF2ZSBhIGRldGFpbCBtZXNzYWdlDQotICAgICAgICB9DQotDQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc1JlcXVpcmVkTWVzc2FnZSk7DQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTa2lwYWJsZVZhbGlkYXRpb25TdHJhdGVneShDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRDbGFzcyA6IEV4dFZhbFV0aWxzLmdldFNraXBWYWxpZGF0aW9uU3VwcG9ydENsYXNzTGlzdCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLmlzU2tpcFZhbGlkYXRpb25TdXBwb3J0ZWQoY3VycmVudENsYXNzLCB0YXJnZXRDbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PENsYXNzPiBnZXRTa2lwVmFsaWRhdGlvblN1cHBvcnRDbGFzc0xpc3QoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBzdGF0aWNDb25maWd1cmF0aW9uTGlzdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5TS0lQX1ZBTElEQVRJT05fU1VQUE9SVF9DT05GSUcpOw0KLQ0KLSAgICAgICAgTGlzdDxDbGFzcz4gbWFya2VyTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3M7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gY3VycmVudEVudHJ5IDogc3RhdGljQ29uZmlndXJhdGlvbkxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gY3VycmVudENvbmZpZ3VyYXRpb25FbnRyeSA6IGN1cnJlbnRFbnRyeS5nZXRNYXBwaW5nKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShjdXJyZW50Q29uZmlndXJhdGlvbkVudHJ5LmdldFRhcmdldCgpKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYoY3VycmVudENsYXNzICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1hcmtlckxpc3QuYWRkKGN1cnJlbnRDbGFzcyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihMT0dHRVIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi53YXJuKCJjb25maWd1cmF0aW9uIGVudHJ5IHByb3ZpZGVzIGFuIGludmFsaWQgZW50cnk6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY3VycmVudENvbmZpZ3VyYXRpb25FbnRyeS5nZXRUYXJnZXQoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWFya2VyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTa2lwVmFsaWRhdGlvblN1cHBvcnRlZChDbGFzcyBjdXJyZW50Q2xhc3MsIENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZihjdXJyZW50Q2xhc3MuaXNBbm5vdGF0aW9uKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGFyZ2V0Q2xhc3MuaXNBbm5vdGF0aW9uUHJlc2VudChjdXJyZW50Q2xhc3MpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRhcmdldENsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvSnNmVXRpbHMuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjUwZDg5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZTsNCi1pbXBvcnQgamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZUZhY3Rvcnk7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOw0KLQ0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpzZlV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3RlclBoYXNlTGlzdGVuZXIoUGhhc2VMaXN0ZW5lciBwaGFzZUxpc3RlbmVyKQ0KLSAgICB7DQotICAgICAgICBMaWZlY3ljbGVGYWN0b3J5IGxpZmVjeWNsZUZhY3RvcnkgPSAoTGlmZWN5Y2xlRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRmFjdG9yeUZpbmRlci5MSUZFQ1lDTEVfRkFDVE9SWSk7DQotDQotICAgICAgICBTdHJpbmcgY3VycmVudElkOw0KLSAgICAgICAgTGlmZWN5Y2xlIGN1cnJlbnRMaWZlY3ljbGU7DQotICAgICAgICBJdGVyYXRvciBsaWZlY3ljbGVJZHMgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZUlkcygpOw0KLSAgICAgICAgd2hpbGUgKGxpZmVjeWNsZUlkcy5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudElkID0gKFN0cmluZykgbGlmZWN5Y2xlSWRzLm5leHQoKTsNCi0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlID0gbGlmZWN5Y2xlRmFjdG9yeS5nZXRMaWZlY3ljbGUoY3VycmVudElkKTsNCi0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlLnJlbW92ZVBoYXNlTGlzdGVuZXIocGhhc2VMaXN0ZW5lcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFN0cmluZyBidW5kbGVOYW1lID0gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZ2V0TWVzc2FnZUJ1bmRsZSgpOw0KLQ0KLSAgICAgICAgaWYoYnVuZGxlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJ1bmRsZU5hbWUgPSBGYWNlc01lc3NhZ2UuRkFDRVNfTUVTU0FHRVM7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGJ1bmRsZU5hbWUsIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODdmN2QuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1JlZmxlY3Rpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGlvblV0aWxzCi17Ci0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgdHJ5VG9HZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvR2V0TWV0aG9kKHRhcmdldENsYXNzLCB0YXJnZXRNZXRob2ROYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCB0cnlUb0dldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUsIENsYXNzLi4uIHBhcmFtZXRlclR5cGVzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lKQotICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TWV0aG9kKHRhcmdldENsYXNzLCB0YXJnZXRNZXRob2ROYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lLCBDbGFzcy4uLiBwYXJhbWV0ZXJUeXBlcykKLSAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gdGFyZ2V0Q2xhc3M7Ci0gICAgICAgIE1ldGhvZCB0YXJnZXRNZXRob2QgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKCFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gY3VycmVudENsYXNzLmdldERlY2xhcmVkTWV0aG9kKHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGFyZ2V0TWV0aG9kID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IHRhcmdldENsYXNzLmdldEludGVyZmFjZXMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50SW50ZXJmYWNlOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRDbGFzcyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IGN1cnJlbnRDbGFzcy5nZXREZWNsYXJlZE1ldGhvZCh0YXJnZXRNZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0YXJnZXRNZXRob2QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRhcmdldE1ldGhvZDsKLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBOb1N1Y2hNZXRob2RFeGNlcHRpb24oInRoZXJlIGlzIG5vIG1ldGhvZCB3aXRoIHRoZSBuYW1lICciICsgdGFyZ2V0TWV0aG9kTmFtZSArICInIiArCi0gICAgICAgICAgICAgICAgIiBjbGFzczogIiArIHRhcmdldENsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0ludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3ModGFyZ2V0LCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZE9mQ2xhc3ModGFyZ2V0LCBtZXRob2QsIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQubmV3SW5zdGFuY2UoKSwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldC5uZXdJbnN0YW5jZSgpLCBtZXRob2QsIGFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdC4uLiBhcmdzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0LCBtZXRob2QsIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdC4uLiBhcmdzKQotICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKHRhcmdldCwgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QmFzZU9mUHJvcGVydHlDaGFpbihPYmplY3QgYmFzZU9iamVjdCwgU3RyaW5nIHByb3BlcnR5Q2hhaW4pCi0gICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcm9wZXJ0eUNoYWluLCAiLiIpOwotCi0gICAgICAgIE9iamVjdCBjdXJyZW50QmFzZSA9IGJhc2VPYmplY3Q7Ci0gICAgICAgIFN0cmluZyBjdXJyZW50UHJvcGVydHk7Ci0gICAgICAgIE1ldGhvZCBjdXJyZW50TWV0aG9kOwotCi0gICAgICAgIHdoaWxlKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQotICAgICAgICAgICAgLy9pZ25vcmUgdGhlIGxhc3QgcHJvcGVydHkKLSAgICAgICAgICAgIGlmKCF0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL25vIGlzIC0gaXQncyBvbmx5IHBvc3NpYmxlIGF0IHByb3BlcnRpZXMgbm90IGF0IGJlYW4gbGV2ZWwKLSAgICAgICAgICAgIGN1cnJlbnRNZXRob2QgPSB0cnlUb0dldE1ldGhvZChjdXJyZW50QmFzZS5nZXRDbGFzcygpLAotICAgICAgICAgICAgICAgICJnZXQiICsgY3VycmVudFByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFByb3BlcnR5LnN1YnN0cmluZygxLCBjdXJyZW50UHJvcGVydHkubGVuZ3RoKCkpKTsKLSAgICAgICAgICAgIGN1cnJlbnRCYXNlID0gdHJ5VG9JbnZva2VNZXRob2QoY3VycmVudEJhc2UsIGN1cnJlbnRNZXRob2QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRCYXNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1dlYlhtbFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYjIxN2IuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1dlYlhtbFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFdlYlhtbFV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKQ0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVggKyAiLiIgKyBrZXkpOw0KLSAgICAgICAgcmV0dXJuICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlLnJlcGxhY2UoIiAiLCAiIikudHJpbSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTIwMWQyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2NvcmUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlIE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlIE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUgTW9kdWxlIHByb3ZpZGVzIGFuIGV4dGVuc2libGUgdmFsaWRhdGlvbiBwbGF0Zm9ybSB0byBpbXBsZW1lbnQgdmFsaWRhdGlvbiBiYXNlZCBvbiBtZXRhLWRhdGEuDQotICAgIEJhc2VkIG9uIHRoaXMgbW9kdWxlIGl0IGlzIHBvc3NpYmxlIHRvIGltcGxlbWVudCB2YWxpZGF0aW9uIG1vZHVsZXMuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLjEueCBhbmQgSlNGIDEuMi54LiBCb3RoIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2Fzc2VtYmx5L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NWM3MDAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgRXhhbXBsZXMgQXNzZW1ibHk8L25hbWU+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWV4YW1wbGVzLWFzc2VtYmx5MTI8L2FydGlmYWN0SWQ+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZGVwZW5kZW5jeS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS13YXI8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1oZWxsb193b3JsZDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4JCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmVhdHVyZS1zZXRfMDE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3dhcjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LXNyYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+amF2YS1zb3VyY2U8L3R5cGU+ICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWZlYXR1cmUtc2V0XzAxPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+amF2YS1zb3VyY2U8L3R5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3NyYzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS0gRVhFQ1VURSBtdm4gcGFja2FnZSB0byBnZW5lcmF0ZSBhc3NlbWJseSBmaWxlcyAtLT4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfc3JjPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hc3NlbWJseTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsLWV4YW1wbGVzLSR7cHJvamVjdC52ZXJzaW9ufS1zcmM8L2ZpbmFsTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L291dDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X2JpbjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXNzZW1ibHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotCSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPiAgIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9kZXAueG1sPC9kZXNjcmlwdG9yPgotCSAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5teWZhY2VzLWV4dHZhbC1leGFtcGxlcy0ke3Byb2plY3QudmVyc2lvbn08L2ZpbmFsTmFtZT4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L291dDwvb3V0cHV0RGlyZWN0b3J5PgotCSAgICAgICAgICAgICAgICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0JICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotCSAgICAKLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLm1hdmVuPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPndhZ29uLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGlkPm15ZmFjZXMtbmlnaHRseS1idWlsZHM8L2lkPgotICAgICAgICAgICAgICAgICAgICA8dXJsPnNjcGV4ZTovL21pbm90YXVyLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL2J1aWxkcy9teWZhY2VzL25pZ2h0bHk8L3VybD4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L291dDwvaW5wdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgPC9wbHVnaW5zPgotCi0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZjdiODEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgkKLSAgPGZpbGVTZXRzPiAgICAKLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3dhcjwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki53YXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4gICAgIAotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWwgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTcwY2NjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08YXNzZW1ibHk+Ci0gIDxpZD5zcmM8L2lkPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4JCi0gIDxmaWxlU2V0cz4gICAgCi0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9zcmM8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki50eHQ8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNWIzYTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDliZGIxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcgotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3BvbS54bWwgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWI0MmE4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWZlYXR1cmUtc2V0XzAxPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIGZlYXR1cmUtc2V0IDAxPC9uYW1lPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uZmFjZWxldHM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWZhY2VsZXRzPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xNDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPCEtLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICAtLT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50b21haGF3azwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50b21haGF3azwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuNjwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2N1c3RvbS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jdXN0b20vdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDAxZGY3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2N1c3RvbS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotIyB0aGlzIG1lc3NhZ2UgYnVuZGxlIGlzIHBpY2tlZCB1cCB2aWEgY29udmVudGlvbg0KLXJlcGVhdGVkX3Bhc3N3b3JkX3JlcXVpcmVkPXBsZWFzZSByZXR5cGUgdGhlIHBhc3N3b3JkDQotcmVwZWF0ZWRfcGFzc3dvcmRfcmVxdWlyZWRfZGV0YWlsPXBsZWFzZSByZXR5cGUgdGhlIHBhc3N3b3JkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2RvbWFpbi9QZXJzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhZTQxZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2RvbWFpbi9QZXJzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5kb21haW47DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRGF0ZUlzVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uTm90RXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxlbmd0aDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5QYXR0ZXJuOw0KLQ0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlRlbXBvcmFsOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbFR5cGU7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLXB1YmxpYyBjbGFzcyBQZXJzb24NCi17DQotICAgIEBMZW5ndGgobWluaW11bSA9IDIpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMjApDQotICAgIEBOb3RFcXVhbHMoImxhc3ROYW1lIikNCi0gICAgQFBhdHRlcm4oIltBLVpdW2Etel0rIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOw0KLQ0KLSAgICBATGVuZ3RoKG1pbmltdW0gPSAyKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDIwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsNCi0NCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7DQotDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIHJvbGUgPSAidXNlciI7DQotDQotICAgIEBEYXRlSXModHlwZSA9IERhdGVJc1R5cGUuYmVmb3JlLCB2YWx1ZU9mID0gImZpbmFsRXhhbSIpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSkNCi0gICAgQFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5EQVRFKQ0KLSAgICBwcml2YXRlIERhdGUgYmlydGhkYXk7DQotDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSkNCi0gICAgQFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5EQVRFKQ0KLSAgICBwcml2YXRlIERhdGUgZmluYWxFeGFtOw0KLQ0KLSAgICBATGVuZ3RoKG1pbmltdW0gPSAyKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBuaWNrTmFtZTsNCi0NCi0gICAgQExlbmd0aChtaW5pbXVtID0gNikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSA2MCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW1haWw7DQotDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSkNCi0gICAgcHJpdmF0ZSBpbnQgbnVtYmVyT2ZTaWJsaW5nczsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxhc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRSb2xlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHJvbGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Um9sZShTdHJpbmcgcm9sZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5yb2xlID0gcm9sZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXRCaXJ0aGRheSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBiaXJ0aGRheTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRCaXJ0aGRheShEYXRlIGJpcnRoZGF5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmJpcnRoZGF5ID0gYmlydGhkYXk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RmluYWxFeGFtKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZpbmFsRXhhbTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaW5hbEV4YW0oRGF0ZSBmaW5hbEV4YW0pDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmluYWxFeGFtID0gZmluYWxFeGFtOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tmlja05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmlja05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Tmlja05hbWUoU3RyaW5nIG5pY2tOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm5pY2tOYW1lID0gbmlja05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBlbWFpbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbWFpbChTdHJpbmcgZW1haWwpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZW1haWwgPSBlbWFpbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGdldE51bWJlck9mU2libGluZ3MoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbnVtYmVyT2ZTaWJsaW5nczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXJPZlNpYmxpbmdzKGludCBudW1iZXJPZlNpYmxpbmdzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm51bWJlck9mU2libGluZ3MgPSBudW1iZXJPZlNpYmxpbmdzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJlMTRmYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZ3VpLmJlYW5zOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5kb21haW4uUGVyc29uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLk5vdEVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Kb2luVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Mb25nUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uVmFsaWRhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuY3VzdG9tLmVtYWlsdmFsaWRhdG9yLkVtYWlsVmFsaWRhdG9yOw0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25QYWdlDQotew0KLQ0KLSAgICAvL3RoZSBvbGQgcGFzc3dvcmQgb2YgdGhlIHBlcnNvbiBpc24ndCB1c2VkIHdpdGhpbiB0aGUgcGFnZQ0KLSAgICAvLy0+IHZhbGlkYXRlIHdpdGggdmFsdWUgb2YgdGhlIG1vZGVsDQotICAgIEBTa2lwVmFsaWRhdGlvbigiI3twZXJzb24ucm9sZSBlcSAnYWRtaW4nfSIpDQotICAgIEBSZXF1aXJlZA0KLSAgICBARXF1YWxzKCJwZXJzb24ucGFzc3dvcmQiKQ0KLSAgICBATm90RXF1YWxzKCJwYXNzd29yZCIpDQotICAgIHByaXZhdGUgU3RyaW5nIG9sZFBhc3N3b3JkOw0KLQ0KLSAgICBARXF1YWxzKCJwYXNzd29yZFJlcGVhdGVkIikNCi0gICAgLy9jb21iaW5lIGd1aSByZWxhdGVkIGFubm90YXRpb25zIHdpdGggdGhlIGFubm9hdGlvbnMgb2YgdGhlIGRvbWFpbiBtb2RlbA0KLSAgICBASm9pblZhbGlkYXRpb24odmFsdWUgPSAiI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5wYXNzd29yZH0iKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsNCi0NCi0gICAgQFJlcXVpcmVkKHZhbGlkYXRpb25FcnJvck1zZ0tleSA9ICJyZXBlYXRlZF9wYXNzd29yZF9yZXF1aXJlZCIpDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkUmVwZWF0ZWQ7DQotDQotICAgIC8vdXNlICN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ubmlja05hbWV9LCAje3BlcnNvbi5uaWNrTmFtZX0NCi0gICAgLy91c2UgcmVnaXN0cmF0aW9uUGFnZSB0byBkaXNwbGF5IHRoZSBzZWNvbmQgZXJyb3IgbWVzc2FnZSBhdCBvbGQgbmlja25hbWUNCi0gICAgLy9vciBsb2NhbCBwcm9wZXJ0eSBjaGFpbmluZyAodG8gYXZvaWQgdGhlIHVzYWdlIG9mIHRoZSBiZWFuIG5hbWUpIC0gbGlrZToNCi0gICAgQFNraXBWYWxpZGF0aW9uKCIje3BlcnNvbi5yb2xlIGVxICdhZG1pbid9IikNCi0gICAgQE5vdEVxdWFscygicGVyc29uLm5pY2tOYW1lIikNCi0gICAgQEpvaW5WYWxpZGF0aW9uKCJwZXJzb24ubmlja05hbWUiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBuZXdOaWNrTmFtZTsNCi0NCi0gICAgcHJpdmF0ZSBQZXJzb24gcGVyc29uOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGZpbmlzaCgpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldFBhc3N3b3JkKHRoaXMucGFzc3dvcmQpOw0KLSAgICAgICAgcmV0dXJuICJob21lIjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHVwZGF0ZU5pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0Tmlja05hbWUodGhpcy5uZXdOaWNrTmFtZSk7DQotICAgICAgICByZXR1cm4gImhvbWUiOw0KLSAgICB9DQotDQotICAgIC8vanVzdCBhIHF1aWNrIGlsbHVzdHJhdGlvbiBvZiBza2lwVmFsaWRhdGlvbg0KLSAgICBwdWJsaWMgU3RyaW5nIHN3aXRjaE1vZGUoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VycmVudFJvbGUgPSB0aGlzLnBlcnNvbi5nZXRSb2xlKCk7DQotDQotICAgICAgICBpZihjdXJyZW50Um9sZS5lcXVhbHMoImFkbWluIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5wZXJzb24uc2V0Um9sZSgidXNlciIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMucGVyc29uLnNldFJvbGUoImFkbWluIik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gIiI7DQotICAgIH0NCi0NCi0gICAgQEpvaW5WYWxpZGF0aW9uKCJwZXJzb24uZW1haWwiKQ0KLSAgICBAVmFsaWRhdG9yKEVtYWlsVmFsaWRhdG9yLmNsYXNzKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uLmdldEVtYWlsKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXRFbWFpbChlbWFpbCk7DQotICAgIH0NCi0NCi0gICAgQEpvaW5WYWxpZGF0aW9uKCIje3BlcnNvbi5udW1iZXJPZlNpYmxpbmdzfSIpDQotICAgIEBMb25nUmFuZ2UobWF4aW11bSA9IDIwKQ0KLSAgICBwdWJsaWMgaW50IGdldE51bWJlck9mU2libGluZ3MoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5wZXJzb24uZ2V0TnVtYmVyT2ZTaWJsaW5ncygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlck9mU2libGluZ3MoaW50IG51bWJlck9mU2libGluZ3MpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldE51bWJlck9mU2libGluZ3MobnVtYmVyT2ZTaWJsaW5ncyk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9sZFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG9sZFBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE9sZFBhc3N3b3JkKFN0cmluZyBvbGRQYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5vbGRQYXNzd29yZCA9IG9sZFBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZFJlcGVhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkUmVwZWF0ZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRSZXBlYXRlZChTdHJpbmcgcGFzc3dvcmRSZXBlYXRlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZFJlcGVhdGVkID0gcGFzc3dvcmRSZXBlYXRlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwZXJzb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbiBwZXJzb24pDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uID0gcGVyc29uOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmV3Tmlja05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3Tmlja05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TmV3Tmlja05hbWUoU3RyaW5nIG5ld05pY2tOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm5ld05pY2tOYW1lID0gbmV3Tmlja05hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDE4ZDY2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCIKLSAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4KLSAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgIDwhLS0gdHJpbmlkYWQgLS0+Ci0gICAgICAgIDxkZWZhdWx0LXJlbmRlci1raXQtaWQ+Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29yZQotICAgICAgICA8L2RlZmF1bHQtcmVuZGVyLWtpdC1pZD4KLQotICAgIDwvYXBwbGljYXRpb24+Ci0KLSAgICA8bWFuYWdlZC1iZWFuPgotICAgICAgICA8bWFuYWdlZC1iZWFuLW5hbWU+cmVnaXN0cmF0aW9uUGFnZTwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZ3VpLmJlYW5zLlJlZ2lzdHJhdGlvblBhZ2U8L21hbmFnZWQtYmVhbi1jbGFzcz4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0KLSAgICAgICAgPG1hbmFnZWQtcHJvcGVydHk+Ci0gICAgICAgICAgICA8cHJvcGVydHktbmFtZT5wZXJzb248L3Byb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8dmFsdWU+I3twZXJzb259PC92YWx1ZT4KLSAgICAgICAgPC9tYW5hZ2VkLXByb3BlcnR5PgotICAgIDwvbWFuYWdlZC1iZWFuPgotCi0gICAgPG1hbmFnZWQtYmVhbj4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1uYW1lPnBlcnNvbjwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluLlBlcnNvbjwvbWFuYWdlZC1iZWFuLWNsYXNzPgotICAgICAgICA8bWFuYWdlZC1iZWFuLXNjb3BlPnNlc3Npb248L21hbmFnZWQtYmVhbi1zY29wZT4KLSAgICA8L21hbmFnZWQtYmVhbj4KLQotICAgIDxuYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgICAgIDxmcm9tLXZpZXctaWQ+L3BhZ2VzL2hvbWUueGh0bWw8L2Zyb20tdmlldy1pZD4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+YWRkVXNlcjwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmNoYW5nZU5pY2tOYW1lPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+Y2hhbmdlUGFzc3dvcmQ8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgIDwvbmF2aWdhdGlvbi1ydWxlPgotICAgIDxuYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgICAgIDxmcm9tLXZpZXctaWQ+KjwvZnJvbS12aWV3LWlkPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5ob21lPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvaG9tZS54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgPC9uYXZpZ2F0aW9uLXJ1bGU+Ci08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9tYWluLnRhZ2xpYi54bWwgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9tYWluLnRhZ2xpYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMzkzNjYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgZmFjZWxldC10YWdsaWIgUFVCTElDCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRmFjZWxldCBUYWdsaWIgMS4wLy9FTiIKLSAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2ZhY2VsZXQtdGFnbGliXzFfMC5kdGQiPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlbGV0LXRhZ2xpYj4KLSAgICA8bmFtZXNwYWNlPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0dmFsL2RlbW8vY29tcG9uZW50czwvbmFtZXNwYWNlPgotCi0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPnVzZXJGb3JtPC90YWctbmFtZT4KLSAgICAgICAgPHNvdXJjZT4KLSAgICAgICAgICAgIC4uL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sCi0gICAgICAgIDwvc291cmNlPgotICAgIDwvdGFnPgotCi08L2ZhY2VsZXQtdGFnbGliPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWMwMWFhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLSAgICAgICAgIHZlcnNpb249IjIuNCI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+TXlQcm9qZWN0IHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkRFRkFVTFRfU1VGRklYPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+LnhodG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+ZmFjZWxldHMuTElCUkFSSUVTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L1dFQi1JTkYvbWFpbi50YWdsaWIueG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkVOQUJMRV9MSUdIVFdFSUdIVF9ESUFMT0dTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5ESVNBQkxFX0NPTlRFTlRfQ09NUFJFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkFMVEVSTkFURV9WSUVXX0hBTkRMRVI8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jb20uc3VuLmZhY2VsZXRzLkZhY2VsZXRWaWV3SGFuZGxlcjwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5VU0VfQVBQTElDQVRJT05fVklFV19DQUNIRTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkNIQU5HRV9QRVJTSVNURU5DRTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnNlc3Npb248L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+U3RhdGUgc2F2aW5nIG1ldGhvZDogImNsaWVudCIgb3IgInNlcnZlciIgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIFNlZSBKU0YgU3BlY2lmaWNhdGlvbiAyLjUuMwotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIGFtb3VudCAoZGVmYXVsdCA9IDIwKSBvZiB0aGUgbGF0ZXN0IHZpZXdzIGFyZSBzdG9yZWQgaW4gc2Vzc2lvbi4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLk5VTUJFUl9PRl9WSUVXU19JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpIGFuZCBpZgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OIGlzIHRydWUgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzZXJpYWxpemVkIHN0YXRlIHdpbGwgYmUgY29tcHJlc3NlZCBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBjb21wcmVzc2VkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcGFyYW1ldGVyIHRlbGxzIE15RmFjZXMgaWYgamF2YXNjcmlwdCBjb2RlIHNob3VsZCBiZSBhbGxvd2VkIGluIHRoZQotICAgICAgICAgICAgcmVuZGVyZWQgSFRNTCBvdXRwdXQuCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUKLSAgICAgICAgICAgIHRoYXQgc3VibWl0cyB0aGUgY29ycmVzcG9uZGluZyBmb3JtLgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBub3QgYWxsb3dlZCwgdGhlIHN0YXRlIHNhdmluZyBpbmZvIGFuZCBuZXN0ZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLgotICAgICAgICAgICAgaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90Ci0gICAgICAgICAgICBpbmZsdWVuY2UgdGhlIEhUTUwgY29kZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUFJFVFRZX0hUTUw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCBhIGphdmFzY3JpcHQgZnVuY3Rpb24gd2lsbCBiZSByZW5kZXJlZCB0aGF0IGlzIGFibGUgdG8gcmVzdG9yZSB0aGUKLSAgICAgICAgICAgIGZvcm1lciB2ZXJ0aWNhbCBzY3JvbGwgb24gZXZlcnkgcmVxdWVzdC4gQ29udmVuaWVudCBmZWF0dXJlIGlmIHlvdSBoYXZlIHBhZ2VzCi0gICAgICAgICAgICB3aXRoIGxvbmcgbGlzdHMgYW5kIHlvdSBkbyBub3Qgd2FudCB0aGUgYnJvd3NlciBwYWdlIHRvIGFsd2F5cyBqdW1wIHRvIHRoZSB0b3AKLSAgICAgICAgICAgIGlmIHlvdSB0cmlnZ2VyIGEgbGluayBvciBidXR0b24gYWN0aW9uIHRoYXQgc3RheXMgb24gdGhlIHNhbWUgcGFnZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJmYWxzZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFVVE9fU0NST0xMPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Vc2VkIGZvciBlbmNyeXB0aW5nIHZpZXcgc3RhdGUuIE9ubHkgcmVsZXZhbnQgZm9yIGNsaWVudCBzaWRlCi0gICAgICAgICAgICBzdGF0ZSBzYXZpbmcuIFNlZSBNeUZhY2VzIHdpa2kvd2ViIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRUNSRVQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWYWxpZGF0ZSBtYW5hZ2VkIGJlYW5zLCBuYXZpZ2F0aW9uIHJ1bGVzIGFuZCBlbnN1cmUgdGhhdCBmb3JtcyBhcmUgbm90IG5lc3RlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlZBTElEQVRFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPCEtLSBMaXN0ZW5lciwgdG8gYWxsb3cgSmV0dHkgc2VydmluZyBNeUZhY2VzIGFwcHMgLS0+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLndlYmFwcC5TdGFydHVwU2VydmxldENvbnRleHRMaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+Ci0gICAgPC9saXN0ZW5lcj4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCAtLT4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICAgIDwvc2VydmxldD4KLQotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPnJlc291cmNlczwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlJlc291cmNlU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8ZmlsdGVyPgotICAgICAgICA8ZmlsdGVyLW5hbWU+dHJpbmlkYWQ8L2ZpbHRlci1uYW1lPgotICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC53ZWJhcHAuVHJpbmlkYWRGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KLSAgICA8L2ZpbHRlcj4KLQotICAgIDxmaWx0ZXItbWFwcGluZz4KLSAgICAgICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgPC9maWx0ZXItbWFwcGluZz4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCBNYXBwaW5ncyAtLT4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9mYWNlcy8qPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+cmVzb3VyY2VzPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4vYWRmLyo8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPCEtLSBXZWxjb21lIGZpbGVzIC0tPgotICAgIDx3ZWxjb21lLWZpbGUtbGlzdD4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+Ci0gICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KLQotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODRkNjQ4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyIKLSAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiCi0gICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIgotICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiCi0gICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+Ci0KLTx1aTpjb21wb3NpdGlvbj4KLSAgICA8dHI6cGFuZWxGb3JtTGF5b3V0PgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im5pY2sgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb25bICduaWNrTmFtZScgXX0iLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0iZS1tYWlsIiB2YWx1ZT0iI3tiZWFuLmVtYWlsfSIvPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9ImZpcnN0IG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uLmZpcnN0TmFtZX0iLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibGFzdCBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5sYXN0TmFtZX0iLz4KLSAgICAgICAgPHRyOmlucHV0RGF0ZSBsYWJlbD0iYmlydGhkYXkiIHZhbHVlPSIje2JlYW4ucGVyc29uLmJpcnRoZGF5fSI+Ci0gICAgICAgICAgICA8dHI6Y29udmVydERhdGVUaW1lIHR5cGU9ImRhdGUiIHBhdHRlcm49ImRkLk1NLnl5eXkiLz4KLSAgICAgICAgPC90cjppbnB1dERhdGU+Ci0gICAgICAgIDx0cjppbnB1dERhdGUgbGFiZWw9ImZpbmFsIGV4YW0iIHZhbHVlPSIje2JlYW4ucGVyc29uLmZpbmFsRXhhbX0iPgotICAgICAgICAgICAgPHRyOmNvbnZlcnREYXRlVGltZSB0eXBlPSJkYXRlIiBwYXR0ZXJuPSJkZC5NTS55eXl5Ii8+Ci0gICAgICAgIDwvdHI6aW5wdXREYXRlPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im51bWJlciBvZiBzaWJsaW5ncyIgdmFsdWU9IiN7YmVhbi5udW1iZXJPZlNpYmxpbmdzfSIvPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9InBhc3N3b3JkIiB2YWx1ZT0iI3tiZWFuLnBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9InJlLWVudGVyIHBhc3N3b3JkIiB2YWx1ZT0iI3tiZWFuLnBhc3N3b3JkUmVwZWF0ZWR9IiBzZWNyZXQ9InRydWUiLz4KLQotICAgIDwvdHI6cGFuZWxGb3JtTGF5b3V0PgotPC91aTpjb21wb3NpdGlvbj4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1Y2QxNDguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0gICAgICAgIA0KLTxodG1sPg0KLQ0KLTxoZWFkPg0KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIwOyBVUkw9ZmFjZXMvcGFnZXMvaG9tZS54aHRtbCI+DQotPC9oZWFkPg0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBjMWVhOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPHRyOmRvY3VtZW50DQotICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiDQotICAgICAgICB4bWxuczpjPSJodHRwOi8vamF2YS5zdW4uY29tL2pzdGwvY29yZSI+DQotICAgIDxmOmZhY2V0IG5hbWU9Im1ldGFDb250YWluZXIiPg0KLSAgICAgICAgPHRpdGxlPnNldi1lbiBmZWF0dXJlLXNldCBkZW1vIDAxPC90aXRsZT4NCi0gICAgPC9mOmZhY2V0Pg0KLQ0KLSAgICA8dHJoOmJvZHk+DQotDQotICAgICAgICA8IS0tIG9yaWdpbmFsIC0tPg0KLSAgICAgICAgPGRpdiBpZD0id3JhcCI+DQotDQotICAgICAgICAgICAgPHRyOmZvcm0gaWQ9ImZvcm0iIGRlZmF1bHRDb21tYW5kPSJkZWZhdWx0QnV0dG9uIj4NCi0gICAgICAgICAgICAgICAgPGRpdiBpZD0ibWFpbiI+DQotICAgICAgICAgICAgICAgICAgICA8dWk6aW5zZXJ0IG5hbWU9ImNvbnRlbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InVuZGVyX2NvbnN0cnVjdGlvbiI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj4hc2l0ZSB1bmRlciBjb25zdHJ1Y3Rpb24hPC9oMj4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIGNvbnRlbnQgb2YgdGhpcyBzaXRlIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhlIG1vbWVudC48L3A+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICA8L3VpOmluc2VydD4NCi0gICAgICAgICAgICAgICAgPC9kaXY+DQotDQotICAgICAgICAgICAgPC90cjpmb3JtPg0KLSAgICAgICAgICAgIDx0cjptZXNzYWdlcyBnbG9iYWxPbmx5PSJ0cnVlIi8+DQotDQotICAgICAgICA8L2Rpdj4NCi0gICAgPC90cmg6Ym9keT4NCi0NCi0NCi08L3RyOmRvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWwgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODkzZmFlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgPHRyOnBhbmVsRm9ybUxheW91dD4NCi0NCi0gICAgICAgICAgICA8dWk6cmVtb3ZlPg0KLSAgICAgICAgICAgICAgICBqdXN0IGZvciB0aGUgZGVtbyB3ZSBhcmUgdXNpbmcgdHdvIGlucHV0IGNvbXBvbmVudHMNCi0gICAgICAgICAgICA8L3VpOnJlbW92ZT4NCi0gICAgICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJvbGQgbmljayBuYW1lIiByZWFkT25seT0idHJ1ZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ubmlja05hbWV9Ii8+DQotDQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibmljayBuYW1lIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLm5ld05pY2tOYW1lfSIvPg0KLQ0KLSAgICAgICAgPC90cjpwYW5lbEZvcm1MYXlvdXQ+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJzYXZlIiBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS51cGRhdGVOaWNrTmFtZX0iLz4NCi0NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWwgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTA5NzVhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgPHRhYmxlPg0KLSAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjpvdXRwdXRMYWJlbCB2YWx1ZT0ib2xkIHBhc3N3b3JkIiBmb3I9Im9sZF9wYXNzd29yZCIvPjwvdGQ+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6aW5wdXRUZXh0IGlkPSJvbGRfcGFzc3dvcmQiIHNpbXBsZT0idHJ1ZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5vbGRQYXNzd29yZH0iIHNlY3JldD0idHJ1ZSIvPjwvdGQ+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6bWVzc2FnZSBmb3I9Im9sZF9wYXNzd29yZCIvPjwvdGQ+DQotICAgICAgICAgICAgPC90cj4NCi0NCi0gICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6b3V0cHV0TGFiZWwgdmFsdWU9Im5ldyBwYXNzd29yZCIgZm9yPSJuZXdfcGFzc3dvcmQiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOmlucHV0VGV4dCBpZD0ibmV3X3Bhc3N3b3JkIiBzaW1wbGU9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGFzc3dvcmR9IiBzZWNyZXQ9InRydWUiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm1lc3NhZ2UgZm9yPSJuZXdfcGFzc3dvcmQiLz48L3RkPg0KLSAgICAgICAgICAgIDwvdHI+DQotDQotICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm91dHB1dExhYmVsIHZhbHVlPSJyZS1lbnRlciBwYXNzd29yZCIgZm9yPSJyZWVudGVyZWQiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOmlucHV0VGV4dCBpZD0icmVlbnRlcmVkIiBzaW1wbGU9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGFzc3dvcmRSZXBlYXRlZH0iIHNlY3JldD0idHJ1ZSIvPjwvdGQ+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6bWVzc2FnZSBmb3I9InJlZW50ZXJlZCIvPjwvdGQ+DQotICAgICAgICAgICAgPC90cj4NCi0NCi0gICAgICAgIDwvdGFibGU+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJzYXZlIiBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS5maW5pc2h9Ii8+DQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTdlYmQ5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9ImFkZCB1c2VyIiBhY3Rpb249ImFkZFVzZXIiLz48YnIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0iY2hhbmdlIG5pY2sgbmFtZSIgYWN0aW9uPSJjaGFuZ2VOaWNrTmFtZSIvPjxici8+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJjaGFuZ2UgcGFzc3dvcmQiIGFjdGlvbj0iY2hhbmdlUGFzc3dvcmQiLz48YnIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRMaW5rIHRleHQ9Im1vZGU6ICN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ucm9sZX0iDQotICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS5zd2l0Y2hNb2RlfSIgaW1tZWRpYXRlPSJ0cnVlIi8+DQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmNmIwNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczpjPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dHZhbC9kZW1vL2NvbXBvbmVudHMiDQotICAgICAgICA+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotDQotICAgICAgICA8Yzp1c2VyRm9ybSBiZWFuPSIje3JlZ2lzdHJhdGlvblBhZ2V9Ii8+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJzYXZlIiBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS5maW5pc2h9Ii8+DQotDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvaGVsbG9fd29ybGQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUwNTkyNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIGhlbGxvIHdvcmxkPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmpzdGw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anN0bDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5PiAgICAgICAgDQotDQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmFmYjM5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbms7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluLlBlcnNvbjsKLQotLyoqCi0gKiBBIHR5cGljYWwgc2ltcGxlIGJhY2tpbmcgYmVhbiwgdGhhdCBpcyBiYWNrZWQgdG8gPGNvZGU+aGVsbG93b3JsZC5qc3A8L2NvZGU+Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEhlbGxvV29ybGRDb250cm9sbGVyCi17Ci0gICAgcHJpdmF0ZSBQZXJzb24gcGVyc29uID0gbmV3IFBlcnNvbigpOwotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBlbXB0eSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBIZWxsb1dvcmxkQ29udHJvbGxlcigpCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB0aGF0IGlzIGJhY2tlZCB0byBhIHN1Ym1pdCBidXR0b24gb2YgYSBmb3JtLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgc2VuZCgpCi0gICAgewotICAgICAgICAvL2RvIHJlYWwgbG9naWMsIHJldHVybiBhIHN0cmluZyB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuYXZpZ2F0aW9uIHN5c3RlbSBvZiBKU0YKLSAgICAgICAgcmV0dXJuICJzdWNjZXNzIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpCi0gICAgewotICAgICAgICByZXR1cm4gcGVyc29uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNvbihQZXJzb24gcGVyc29uKQotICAgIHsKLSAgICAgICAgdGhpcy5wZXJzb24gPSBwZXJzb247Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkNGE5ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsKLQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsKLQotcHVibGljIGNsYXNzIFBlcnNvbgotewotICAgIC8vaGVsbG8gd29ybGQgZGVtbwotICAgIEBSZXF1aXJlZAotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsKLQotICAgIC8vZGVtbyBmb3IganBhIGJhc2VkIHZhbGlkYXRpb24gc3VwcG9ydAotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTAgLyouLi4qLykKLSAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaXJzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsYXN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpCi0gICAgewotICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmJlYWU3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlcy1jb25maWcgdmVyc2lvbj0iMS4yIiAKLSAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIAotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCI+Ci0JCi0JPCEtLSBtYW5hZ2VkIGJlYW5zIG9mIHRoZSBzaW1wbGUgaGVsbG8gd29ybGQgYXBwIC0tPgotCTxtYW5hZ2VkLWJlYW4+Ci0JCTxtYW5hZ2VkLWJlYW4tbmFtZT5oZWxsb1dvcmxkPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLQkJPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuSGVsbG9Xb3JsZENvbnRyb2xsZXI8L21hbmFnZWQtYmVhbi1jbGFzcz4KLQkJPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0JPC9tYW5hZ2VkLWJlYW4+Ci0JCi0JPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciBoZWxsb1dvcmxkLmpzcCAtLT4KLQk8bmF2aWdhdGlvbi1ydWxlPgotCQk8ZnJvbS12aWV3LWlkPi9oZWxsb1dvcmxkLmpzcDwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5zdWNjZXNzPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vcGFnZTIuanNwPC90by12aWV3LWlkPgotCQk8L25hdmlnYXRpb24tY2FzZT4KLQk8L25hdmlnYXRpb24tcnVsZT4KLQkKLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIHBhZ2UyLmpzcCAtLT4KLQk8bmF2aWdhdGlvbi1ydWxlPgotCQk8ZnJvbS12aWV3LWlkPi9wYWdlMi5qc3A8L2Zyb20tdmlldy1pZD4KLQkJPG5hdmlnYXRpb24tY2FzZT4KLQkJCTxmcm9tLW91dGNvbWU+YmFjazwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L2hlbGxvV29ybGQuanNwPC90by12aWV3LWlkPgotCQk8L25hdmlnYXRpb24tY2FzZT4KLQk8L25hdmlnYXRpb24tcnVsZT4KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTRhMTgzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLSAgICAgICAgIHZlcnNpb249IjIuNCI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+TXlQcm9qZWN0IHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0gICAgPCEtLW9wdGlvbmFsOiBjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgVVJJcyBvZiAoYWRkaXRpb25hbCkgZmFjZXMgY29uZmlnIGZpbGVzLgotICAgICAgICAgICAgKGUuZy4gL1dFQi1JTkYvbXktY29uZmlnLnhtbCkKLSAgICAgICAgICAgIFNlZSBKU0YgMS4wIFBSRDIsIDEwLjMuMgotICAgICAgICAgICAgQXR0ZW50aW9uOiBZb3UgZG8gbm90IG5lZWQgdG8gcHV0IC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgaW4gaGVyZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuQ09ORklHX0ZJTEVTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L1dFQi1JTkYvZXhhbXBsZXMtY29uZmlnLnhtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtLS0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5TdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNsaWVudDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLk5VTUJFUl9PRl9WSUVXU19JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkgYW5kIGlmCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04gaXMgdHJ1ZSAoPSBkZWZhdWx0KQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4gSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUKLSAgICAgICAgICAgIHJlbmRlcmVkIEhUTUwgb3V0cHV0LgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgbm90IGFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLgotICAgICAgICAgICAgaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90Ci0gICAgICAgICAgICBpbmZsdWVuY2UgdGhlIEhUTUwgY29kZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIGEgamF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRoYXQgaXMgYWJsZSB0byByZXN0b3JlIHRoZQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMKLSAgICAgICAgICAgIHdpdGggbG9uZyBsaXN0cyBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcAotICAgICAgICAgICAgaWYgeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZSBwYWdlLgotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BVVRPX1NDUk9MTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQotICAgICAgICAgICAgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucwotICAgICAgICAgICAgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IgZGlmZmVuZW50IGVuY3J5cHRpb24gc3RyZW5ndGhzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VDUkVUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+TnpZMU5ETXlNVEE9PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmFsaWRhdGUgbWFuYWdlZCBiZWFucywgbmF2aWdhdGlvbiBydWxlcyBhbmQgZW5zdXJlIHRoYXQgZm9ybXMgYXJlIG5vdCBuZXN0ZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVHJlYXQgcmVhZG9ubHkgc2FtZSBhcyBpZiBkaXNhYmxlZCBhdHRyaWJ1dGUgd2FzIHNldCBmb3Igc2VsZWN0IGVsZW1lbnRzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUkVBRE9OTFlfQVNfRElTQUJMRURfRk9SX1NFTEVDVFM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBVc2UgdGhlIGRlZmluZWQgY2xhc3MgYXMgdGhlIGNsYXNzIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSByZXNvdXJjZSBpcyBhZGRlZCB0byB0aGUKLSAgICAgICAgICAgIEV4dGVuc2lvbkZpbHRlciBoYW5kbGluZy4gVXNpbmcgU3RyZWFtaW5nQWRkUmVzb3VyY2UgaGVyZSBoZWxwcyB3aXRoIHBlcmZvcm1hbmNlLiBJZiB5b3Ugd2FudCB0byBhZGQKLSAgICAgICAgICAgIGN1c3RvbSBjb21wb25lbnRzIGFuZCB3YW50IHRvIHVzZSB0aGUgRXh0ZW5zaW9uRmlsdGVyLCB5b3UgbmVlZCB0byBwcm92aWRlIHlvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIGhlcmUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BRERfUkVTT1VSQ0VfQ0xBU1M8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwudXRpbC5EZWZhdWx0QWRkUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgICAgIAotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZpcnR1YWwgcGF0aCBpbiB0aGUgVVJMIHdoaWNoIHRyaWdnZXJzIGxvYWRpbmcgb2YgcmVzb3VyY2VzIGZvciB0aGUgTXlGYWNlcyBleHRlbmRlZCBjb21wb25lbnRzCi0gICAgICAgICAgICBpbiB0aGUgRXh0ZW5zaW9uRmlsdGVyLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUkVTT1VSQ0VfVklSVFVBTF9QQVRIPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L2ZhY2VzL215RmFjZXNFeHRlbnNpb25SZXNvdXJjZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBDaGVjayBpZiB0aGUgZXh0ZW5zaW9ucy1maWx0ZXIgaGFzIGJlZW4gcHJvcGVybHkgY29uZmlndXJlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNIRUNLX0VYVEVOU0lPTlNfRklMVEVSPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBEZWZpbmUgcGFydGlhbCBzdGF0ZSBzYXZpbmcgYXMgdHJ1ZS9mYWxzZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuUEFSVElBTF9TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0KLSAgICA8IS0tIExpc3RlbmVyLCB0byBhbGxvdyBKZXR0eSBzZXJ2aW5nIE15RmFjZXMgYXBwcyAtLT4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMud2ViYXBwLlN0YXJ0dXBTZXJ2bGV0Q29udGV4dExpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IC0tPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmcgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4qLmpzZjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4LmpzcDwvd2VsY29tZS1maWxlPgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZTEwYjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgICA8Zjp2aWV3PgotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPgotICAgICAgICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMyI+Ci0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJmaXJzdF9uYW1lIiB2YWx1ZT0iRmlyc3QgbmFtZToiLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9ImZpcnN0X25hbWUiIGxhYmVsPSJGaXJzdCBuYW1lIiB2YWx1ZT0iI3toZWxsb1dvcmxkLnBlcnNvbi5maXJzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9ImZpcnN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIvPgotCi0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJsYXN0X25hbWUiIHZhbHVlPSJMYXN0IG5hbWU6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJsYXN0X25hbWUiIGxhYmVsPSJMYXN0IG5hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJsYXN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIvPgotCi0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiB2YWx1ZT0iUHJlc3MgbWUiIGFjdGlvbj0iI3toZWxsb1dvcmxkLnNlbmR9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+Ci0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+Ci0gICAgICAgICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0gICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgPC9mOnZpZXc+Ci0gICAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ODJkNTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTwlLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tJT4KLQotPCVAIHBhZ2Ugc2Vzc2lvbj0iZmFsc2UiJT4KLTwlCi1yZXNwb25zZS5zZW5kUmVkaXJlY3QoImhlbGxvV29ybGQuanNmIik7Ci0lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWM4NTIzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgICAgPGgyPjxoOm91dHB1dFRleHQgdmFsdWU9IkhlbGxvICN7aGVsbG9Xb3JsZC5wZXJzb24uZmlyc3ROYW1lfSAje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfS4gV2UgaG9wZSB5b3UgZW5qb3kgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IhIi8+PC9oMj4KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kTGluayBhY3Rpb249ImJhY2siPgotICAgICAgICAgICAgICAgICAgICA8aDpvdXRwdXRUZXh0IHZhbHVlPSJIb21lIi8+Ci0gICAgICAgICAgICAgICAgPC9oOmNvbW1hbmRMaW5rPgotICAgICAgICAgICAgPC9oOmZvcm0+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgIDwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9wb20ueG1sIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvZXhhbXBsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYzYzBmMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9leGFtcGxlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgcHJvamVjdDwvbmFtZT4NCi0gICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxzY20+DQotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9leGFtcGxlczwvY29ubmVjdGlvbj4NCi0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9leGFtcGxlczwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4NCi0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2V4YW1wbGVzPC91cmw+DQotICAgIDwvc2NtPg0KLSAgICANCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPCEtLVRoaXMgcGx1Z2luIGFsbG93cyB0byBydW4gdGhlIGV4YW1wbGUgdXNpbmcgbXZuIGpldHR5OnJ1biAtLT4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpldHR5LXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Ni4xLjg8L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+MTA8L3NjYW5JbnRlcnZhbFNlY29uZHM+DQotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi0gICAgPG1vZHVsZXM+DQotICAgICAgICA8bW9kdWxlPmhlbGxvX3dvcmxkPC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPmZlYXR1cmUtc2V0XzAxPC9tb2R1bGU+DQotICAgIDwvbW9kdWxlcz4NCi0NCi0gICAgPHByb2ZpbGVzPg0KLSAgICAgICAgPCEtLSBUaGlzIHByb2ZpbGUgaXMgaW52b2tlZCBieSAtRHByZXBhcmVSZWxlYXNlPXRydWUuICBUaGlzIGFsbG93cyBtdm4gcmVsZWFzZTpwcmVwYXJlIHRvDQotICAgICAgICAgICAgcnVuIHN1Y2Nlc3NmdWxseSBvbiB0aGUgYXNzZW1ibHkgcHJvamVjdHMuIC0tPg0KLSAgICAgICAgPHByb2ZpbGU+DQotICAgICAgICAgICAgPGlkPnByZXBhcmUtcmVsZWFzZTwvaWQ+DQotICAgICAgICAgICAgPGFjdGl2YXRpb24+DQotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4NCi0gICAgICAgICAgICAgICAgICAgIDxuYW1lPnByZXBhcmVSZWxlYXNlPC9uYW1lPg0KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4NCi0gICAgICAgICAgICA8bW9kdWxlcz4NCi0gICAgICAgICAgICAgICAgPG1vZHVsZT5hc3NlbWJseTwvbW9kdWxlPg0KLSAgICAgICAgICAgIDwvbW9kdWxlcz4NCi0gICAgICAgICAgICA8YnVpbGQ+DQotICAgICAgICAgICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZWxlYXNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ3VtZW50cz4tRHByZXBhcmVSZWxlYXNlPC9hcmd1bWVudHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4NCi0gICAgICAgICAgICA8L2J1aWxkPg0KLSAgICAgICAgPC9wcm9maWxlPg0KLSAgICA8L3Byb2ZpbGVzPg0KLQ0KLSAgICA8cHJvcGVydGllcz4NCi0gICAgICAgIDx0cmluaWRhZC52ZXJzaW9uPjEuMi45PC90cmluaWRhZC52ZXJzaW9uPg0KLSAgICA8L3Byb3BlcnRpZXM+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2xvZ28vTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9sb2dvL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2xvZ28vTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2xvZ28vTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2xvZ28vTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3OGVmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9sb2dvL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9sb2dvL2V4dHZhbC1sb2dvLnN2ZyBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2xvZ28vZXh0dmFsLWxvZ28uc3ZnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzJiNTM5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL2xvZ28vZXh0dmFsLWxvZ28uc3ZnCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Ci08IS0tIENyZWF0ZWQgd2l0aCBJbmtzY2FwZSAoaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvKSAtLT4KLQotCi08IS0tCi0JQ29weXJpZ2h0IDIwMDkgRW5yaWNvIEJlcnRpIChlbnJpY28uYmVydGlAZ21haWwuY29tKQotCi0JTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0JeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0JICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0JVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotCWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0JV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0JU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotCWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLQotPHN2ZwotICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKLSAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKLSAgIHZlcnNpb249IjEuMCIKLSAgIHdpZHRoPSI3NDQuMDk0NDgiCi0gICBoZWlnaHQ9IjEwNTIuMzYyMiIKLSAgIGlkPSJzdmcyIj4KLSAgPGRlZnMKLSAgICAgaWQ9ImRlZnM0IiAvPgotICA8ZwotICAgICBpZD0ibGF5ZXIyIj4KLSAgICA8cmVjdAotICAgICAgIHdpZHRoPSIzNTMuNDE5NTMiCi0gICAgICAgaGVpZ2h0PSIxMTMuMTA4NCIKLSAgICAgICByeT0iMTEiCi0gICAgICAgeD0iMTgyLjIzMDE1IgotICAgICAgIHk9IjM4MS4zMzI5MiIKLSAgICAgICBpZD0icmVjdDI0ODQiCi0gICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzY2NjY2ZjtzdHJva2Utd2lkdGg6MC44MDE4ODI2MjtzdHJva2Utb3BhY2l0eTowLjk0MTE3NjQ3IiAvPgotICA8L2c+Ci0gIDxnCi0gICAgIGlkPSJsYXllcjEiPgotICAgIDxwYXRoCi0gICAgICAgZD0iTSAxMDcuMTg3NSwzOTMuNTY2MzggTCAxMjIuMzA0NjksMzkzLjU2NjM4IEwgMTc3LjUsNDY3LjM5NDUxIEwgMTYyLjM4MjgxLDQ2Ny4zOTQ1MSBMIDEwNy4xODc1LDM5My41NjYzOCBNIDEyMi4zMDQ2OSw0NjcuMzk0NTEgTCAxMDcuMTg3NSw0NjcuMzk0NTEgTCAxNjIuMzgyODEsMzkzLjU2NjM4IEwgMTc3LjUsMzkzLjU2NjM4IEwgMTIyLjMwNDY5LDQ2Ny4zOTQ1MSBNIDE4NS45Mzc1LDM4MS42MTMyNiBMIDE5NC4wOTM3NSwzODEuNjEzMjYgTCAxOTYuOTA2MjUsMzkzLjU2NjM4IEwgMjE0LjA2MjUsMzkzLjU2NjM4IEwgMjE0LjA2MjUsNDA0LjExMzI2IEwgMTk4Ljk0NTMxLDQwNC4xMTMyNiBMIDE5OC45NDUzMSw0NDYuNTExNjkgQyAxOTguOTQ1Myw0NTMuNDAyMzMgMjAxLjkyMTg2LDQ1Ni44NDc2NCAyMDcuODc1LDQ1Ni44NDc2MyBMIDIxNC4wNjI1LDQ1Ni44NDc2MyBMIDIxNC4wNjI1LDQ2Ny4zOTQ1MSBMIDIwNC41LDQ2Ny4zOTQ1MSBDIDE5Mi4xMjQ5OSw0NjcuMzk0NTEgMTg1LjkzNzUsNDYwLjc2MTcgMTg1LjkzNzUsNDQ3LjQ5NjA3IEwgMTg1LjkzNzUsMzgxLjYxMzI2IgotICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE0Ny41MjE3MywxOS4yOTE5MjIpIgotICAgICAgIGlkPSJmbG93Um9vdDI0NjEiCi0gICAgICAgc3R5bGU9ImZvbnQtc2l6ZTo0MHB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojNjY2NjY2O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtmb250LWZhbWlseTpTYW5zYXRpb247LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpTYW5zYXRpb24iIC8+Ci0gICAgPHBhdGgKLSAgICAgICBkPSJNIDQ4NC4xNTYyNSwzMzcuOTM3NSBDIDQ3OS45NTAwNywzNDEuMTgxMDUgNDc2LjkwODYxLDM0NS42MDEyMSA0NzMuNzE4NzUsMzQ5Ljc4MTI1IEMgNDY2LjA3MTkyLDM2MC4xNTkwMiA0NTguMzUzNDcsMzcwLjQ4NDYxIDQ1MC44MzczOSwzODAuOTU3OTYgQyA0NDAuOTgxMjMsMzk0LjQ0ODczIDQzMS4yOTU5Myw0MDguMDY0NDkgNDIxLjgzMjk4LDQyMS44MzQxMyBDIDQxMy42NTAwNyw0MzMuNzI3OTkgNDA1LjQ1NTY4LDQ0NS42MTQxMiAzOTcuMzU4NTcsNDU3LjU2NjY2IEMgMzk2Ljc0NDYsNDU4LjMzMzA5IDM5Ni4zNTExOSw0NTkuMzA0MjcgMzk1LjU5Mzc1LDQ1OS45Mzc1IEMgMzk0Ljc4MzAzLDQ2MC41MDYyNyAzOTMuMzk2OTcsNDYwLjA3NDI1IDM5My4zMDk5NSw0NTkuMDA3ODUgQyAzOTAuMDU3ODIsNDQxLjY0NTE0IDM4Ni43NzI1Niw0MjQuMjg4NjUgMzgzLjM5NzQyLDQwNi45NDkzOCBDIDM4Mi4wMjYsMzk5Ljc3NDIyIDM4MC42MjY0MywzOTIuNjAzNDQgMzc5LjA2ODY2LDM4NS40NjYyNSBDIDM3OC4zMzMwMiwzODIuMTI5MjQgMzc3LjU1NzY0LDM3OC43ODg1NCAzNzYuNDU1NiwzNzUuNTUyMzMgQyAzNzYuMDgxODksMzc0LjY5MzczIDM3NS45Mjg0NiwzNzMuNDg3MzkgMzc0Ljg2MTUyLDM3My4yMTMzNiBDIDM3My45MDk0NSwzNzIuNzczNTkgMzcyLjg3MTEzLDM3My4zNTA1NCAzNzIuMzYxMjMsMzc0LjE3OTA5IEMgMzcxLjQxNDgxLDM3NS41NTY5MSAzNzAuNjE1NzEsMzc3LjA1Nzk4IDM3MC4xNjI2MywzNzguNjczOTggQyAzNjkuMTU5NDYsMzgxLjcwMDE5IDM2OC44NTA5NywzODQuOTA0OTIgMzY4LjczNDQ1LDM4OC4wNzQ4MSBDIDM2OC42Njg3NiwzOTIuNzc0MTcgMzY5LjQwODg4LDM5Ny40MzM2OSAzNzAuMTIxNjIsNDAyLjA2NDc5IEMgMzcxLjk0NTE4LDQxMy4zMzM5MyAzNzQuMzI0MTcsNDI0LjUwMzczIDM3Ni4xNzQ4Niw0MzUuNzY4MTMgQyAzNzYuODYwNTUsNDM5LjU3MTA3IDM3Ny41MDI5Nyw0NDMuMzgzMyAzNzcuOTE5NzMsNDQ3LjIyNjY5IEMgMzc4LjQ1ODE4LDQ1Mi4xODcwOCAzNzguNTc4NDcsNDU3LjE4Mjc5IDM3OC42MjUsNDYyLjE2ODczIEMgMzc4LjY0ODkzLDQ3MC43MzcwOSAzNzguMDUwMzgsNDc5LjMwMDg1IDM3OC4yNjQzOSw0ODcuODY5NzQgQyAzNzguNTA2OTksNDkxLjA2NTE1IDM3OC45NDM2OSw0OTQuMzk0MjkgMzgwLjYzNjc2LDQ5Ny4xODE1NSBDIDM4MS43MTgxOCw0OTguOTE2MSAzODMuNTc0Nyw1MDAuMjU3ODYgMzg1LjY3MTE3LDUwMC4yOTk2NSBDIDM4Ny43OTU4NCw1MDAuMzQ4MDMgMzg5Ljg5NzA0LDQ5OS41NTk3NSAzOTEuNjMzNTQsNDk4LjM3MDgzIEMgMzkyLjk4MDExLDQ5Ny4zNDQyOCAzOTQuMTAwNDQsNDk2LjAyMzY3IDM5NC45OTg4OSw0OTQuNTkxNzIgQyAzOTYuNDk4MzEsNDkyLjA1MjQ2IDM5OC4wNjMwNyw0ODkuNTM5MTMgMzk5LjIzMDI4LDQ4Ni44Mjc5NyBDIDQwMC42MTM1Myw0ODMuNzI4ODMgNDAxLjk2NDcyLDQ4MC42MTQgNDAzLjE3MDI2LDQ3Ny40Mzk4OSBDIDQwNC43OTMzOCw0NzMuMjE2NDUgNDA2LjQyNTY3LDQ2OC45OTAxMiA0MDguNDQwNzQsNDY0LjkzNDIgQyA0MTEuNzc3OTEsNDU3Ljg1MjUxIDQxNS4zNDI2Niw0NTAuODgwMTEgNDE5LjAwODIsNDQzLjk2MzYyIEMgNDIxLjA1MDYxLDQ0MC4xMzA0MiA0MjMuMjA5MjEsNDM2LjM1NjMxIDQyNS41NTg2NSw0MzIuNzAyOTMgQyA0MjguNDAyNTQsNDI4LjUxMzQ3IDQzMS40MTY2MSw0MjQuNDQzMTggNDM0LjQyOTEyLDQyMC4zNzQ2NSBDIDQ0MC4yODY1LDQxMi41NzQ1NiA0NDYuMzMzNjcsNDA0LjkxOTY0IDQ1Mi4yMzY5MSwzOTcuMTU0NDcgQyA0NTYuOTc4NzksMzkwLjk4NjE1IDQ2MS43NTIzNSwzODQuODQwNzEgNDY2LjM5MzE3LDM3OC41OTU4NyBDIDQ2OS4zNTM3MywzNzQuNTkxNjYgNDcyLjIyMTYzLDM3MC41MTYzMiA0NzQuOTQyOTMsMzY2LjM0NTY4IEMgNDc3Ljg0NDA2LDM2MS43Njg0NyA0ODAuNTI3NTcsMzU3LjAzNTA1IDQ4Mi42NzQyOSwzNTIuMDU0MDUgQyA0ODQuMDc5OTMsMzQ4LjY3Mzc5IDQ4NS4yNzAzNiwzNDUuMTM5IDQ4NS40NDI3MywzNDEuNDUyNzkgQyA0ODUuNDU5OTEsMzQwLjUzNDE5IDQ4NS41NTgyMywzMzkuNTgyNjkgNDg1LjMxMjUsMzM4LjY4NzUgQyA0ODUuMTE3ODMsMzM4LjIzMzU5IDQ4NC43MDI0NiwzMzcuNzgxMDkgNDg0LjE1NjI1LDMzNy45Mzc1IHoiCi0gICAgICAgaWQ9InRleHQyNDc1IgotICAgICAgIHN0eWxlPSJmb250LXNpemU6NDkuMzIxNjkzNDJweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6Izk5Y2MwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjE7Zm9udC1mYW1pbHk6U2Fuc2F0aW9uOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246U2Fuc2F0aW9uIiAvPgotICAgIDxwYXRoCi0gICAgICAgZD0iTSAxNDIuNTU0NjksMzkzLjU2NjM4IEMgMTY1LjE0ODM4LDM5My41NjY0NiAxNzQuMjY1NTYsNDA3LjExMzMyIDE2OS45MDYyNSw0MzQuMjA3MDEgTCAxMjAuMTk1MzEsNDM0LjIwNzAxIEMgMTIwLjE5NTMsNDQ5LjMwMDc3IDEyOS43MTA5MSw0NTYuODQ3NjQgMTQ4Ljc0MjE5LDQ1Ni44NDc2MyBDIDE1NS4yNTc3Niw0NTYuODQ3NjQgMTYxLjc3MzM4LDQ1Ni4xNDQ1MiAxNjguMjg5MDYsNDU0LjczODI2IEwgMTY4LjI4OTA2LDQ2NS4yODUxMyBDIDE2MS43NzMzOCw0NjYuNjkxMzggMTUzLjg1MTUyLDQ2Ny4zOTQ1MSAxNDQuNTIzNDQsNDY3LjM5NDUxIEMgMTE5LjYzMjgsNDY3LjM5NDUxIDEwNy4xODc1LDQ1NC44MDg1OCAxMDcuMTg3NSw0MjkuNjM2NjkgQyAxMDcuMTg3NSw0MDUuNTg5ODggMTE4Ljk3NjU1LDM5My41NjY0NiAxNDIuNTU0NjksMzkzLjU2NjM4IE0gMTIwLjE5NTMxLDQyMy4zNzg4OCBMIDE1OC4wMjM0NCw0MjMuMzc4ODggQyAxNTguNjc5NjQsNDEwLjQ0MTQ0IDE1Mi44MjAyNyw0MDMuOTcyNjkgMTQwLjQ0NTMxLDQwMy45NzI2MyBDIDEyNy43ODkwNCw0MDMuOTcyNjkgMTIxLjAzOTA1LDQxMC40NDE0NCAxMjAuMTk1MzEsNDIzLjM3ODg4IgotICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDgxLjA0MjUsMTkuMjkxNjc2KSIKLSAgICAgICBpZD0iZmxvd1Jvb3Q0NzgzIgotICAgICAgIHN0eWxlPSJmb250LXNpemU6NDBweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjE7Zm9udC1mYW1pbHk6U2Fuc2F0aW9uOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246U2Fuc2F0aW9uIiAvPgotICAgIDxwYXRoCi0gICAgICAgZD0iTSAxMDcuMTg3NSw0NDQuNDAyMzIgQyAxMDcuMTg3NSw0MjkuMjYxNzMgMTE3LjE3MTg3LDQyMS42OTE0MyAxMzcuMTQwNjIsNDIxLjY5MTM4IEMgMTQ0LjQ5OTk2LDQyMS42OTE0MyAxNTAuOTIxODMsNDIyLjE2MDE4IDE1Ni40MDYyNSw0MjMuMDk3NjMgTCAxNTYuNDA2MjUsNDE2LjEzNjY5IEMgMTU2LjQwNjIsNDA4LjEyMTEzIDE0OS43NzMzOSw0MDQuMTEzMzIgMTM2LjUwNzgxLDQwNC4xMTMyNiBDIDEyOC45MTQwNCw0MDQuMTEzMzIgMTIxLjEzMjgsNDA1LjI4NTE5IDExMy4xNjQwNiw0MDcuNjI4ODggTCAxMTMuMTY0MDYsMzk3LjA4MjAxIEMgMTIxLjEzMjgsMzk0LjczODMzIDEyOC45MTQwNCwzOTMuNTY2NDYgMTM2LjUwNzgxLDM5My41NjYzOCBDIDE1OC40NDUyNiwzOTMuNTY2NDYgMTY5LjQxNCw0MDEuNDQxNDUgMTY5LjQxNDA2LDQxNy4xOTEzOCBMIDE2OS40MTQwNiw0NjcuMzk0NTEgTCAxNjIuODA0NjksNDY3LjM5NDUxIEwgMTU3LjYwMTU2LDQ2Mi4xOTEzOCBDIDE1MS4xNzk2NCw0NjUuNjYwMTMgMTQzLjYzMjc4LDQ2Ny4zOTQ1MSAxMzQuOTYwOTQsNDY3LjM5NDUxIEMgMTE2LjQ0NTMsNDY3LjM5NDUxIDEwNy4xODc1LDQ1OS43MzA0NSAxMDcuMTg3NSw0NDQuNDAyMzIgTSAxNTYuNDA2MjUsNDMzLjY0NDUxIEMgMTUxLjI0OTk2LDQzMi43MDcwNCAxNDQuODI4MDksNDMyLjIzODI5IDEzNy4xNDA2Miw0MzIuMjM4MjYgQyAxMjUuODQzNzMsNDMyLjIzODI5IDEyMC4xOTUzLDQzNi4yMjI2NiAxMjAuMTk1MzEsNDQ0LjE5MTM4IEMgMTIwLjE5NTMsNDUyLjYyODkgMTI1LjExNzE3LDQ1Ni44NDc2NCAxMzQuOTYwOTQsNDU2Ljg0NzYzIEMgMTQzLjk2MDksNDU2Ljg0NzY0IDE1MS4xMDkzMyw0NTQuOTI1NzcgMTU2LjQwNjI1LDQ1MS4wODIwMSBMIDE1Ni40MDYyNSw0MzMuNjQ0NTEiCi0gICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMDAwMDIsMCwwLDEsMzI5LjczODI5LDE5LjI5MTY3NikiCi0gICAgICAgaWQ9ImZsb3dSb290NDgwNyIKLSAgICAgICBzdHlsZT0iZm9udC1zaXplOjQwcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO2ZvbnQtZmFtaWx5OlNhbnNhdGlvbjstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlNhbnNhdGlvbiIgLz4KLSAgICA8cGF0aAotICAgICAgIGQ9Ik0gMTA3LjE4NzUsMzY2Ljg0NzYzIEwgMTA3LjE4NzUsNDY3LjM5NDUxIEwgMTIwLjE5NTMxLDQ2Ny4zOTQ1MSBMIDEyMC4xOTUzMSwzNjYuODQ3NjMgTCAxMDcuMTg3NSwzNjYuODQ3NjMiCi0gICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMDAwMDIsMCwwLDEsNDAzLjc5OTI5LDE5LjI5MTY3NikiCi0gICAgICAgaWQ9ImZsb3dSb290NDgxOSIKLSAgICAgICBzdHlsZT0iZm9udC1zaXplOjQwcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO2ZvbnQtZmFtaWx5OlNhbnNhdGlvbjstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlNhbnNhdGlvbiIgLz4KLSAgPC9nPgotICA8ZwotICAgICBpZD0ibGF5ZXIzIj4KLSAgICA8cmVjdAotICAgICAgIHdpZHRoPSIxMS44OTE1OTciCi0gICAgICAgaGVpZ2h0PSIxMi44MDYzMzUiCi0gICAgICAgeD0iMzMzLjU3NDU1IgotICAgICAgIHk9IjQwMC44NzM4NCIKLSAgICAgICBpZD0icmVjdDQ2OTUiCi0gICAgICAgc3R5bGU9ImZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utb3BhY2l0eToxIiAvPgotICAgIDxyZWN0Ci0gICAgICAgd2lkdGg9IjE1LjA3MTQ3MyIKLSAgICAgICBoZWlnaHQ9IjIwLjEyNDE1NyIKLSAgICAgICByeT0iMC4zMTQ0NDEzMiIKLSAgICAgICB4PSIyODEuODkxODIiCi0gICAgICAgeT0iNDM5Ljc5MjQ4IgotICAgICAgIGlkPSJyZWN0NDY5NyIKLSAgICAgICBzdHlsZT0iZmlsbDojNjY2NjY2O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+Ci0gICAgPHJlY3QKLSAgICAgICB3aWR0aD0iMTEuODkxNTk3IgotICAgICAgIGhlaWdodD0iMTAuNTMwNjQ1IgotICAgICAgIHg9IjMyNy42OTY5OSIKLSAgICAgICB5PSI0MTIuODcxNTUiCi0gICAgICAgaWQ9InJlY3Q0ODkxIgotICAgICAgIHN0eWxlPSJmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KLSAgPC9nPgotPC9zdmc+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9wYXJlbnQvTElDRU5TRS50eHQgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9wYXJlbnQvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDU2OTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvcGFyZW50L0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9wYXJlbnQvTk9USUNFLnR4dCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3BhcmVudC9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDliZGIxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3BhcmVudC9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcgotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3BhcmVudC9wb20ueG1sIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvcGFyZW50L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NzliZGIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvcGFyZW50L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLQotICAtIFBhcmVudCBwb20gb2YgYWxsIHRoZSBteWZhY2VzIGV4dGVuc2lvbnMgdmFsaWRhdG9yIHN1YnByb2plY3RzIAotICAgIHRoYXQgaGVscCB0byBidWlsZCBvdGhlciBteWZhY2VzIHByb2plY3RzLgotICAtLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj42PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFByb2plY3QgUGFyZW50PC9uYW1lPgotICAgIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyPC91cmw+Ci0KLSAgICA8aXNzdWVNYW5hZ2VtZW50PgotICAgICAgICA8c3lzdGVtPmppcmE8L3N5c3RlbT4KLSAgICAgICAgPHVybD5odHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvRVhUVkFMPC91cmw+Ci0gICAgPC9pc3N1ZU1hbmFnZW1lbnQ+Ci0KLSAgICA8Y2lNYW5hZ2VtZW50PgotICAgICAgICA8c3lzdGVtPmNvbnRpbnV1bTwvc3lzdGVtPgotICAgICAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLnpvbmVzLmFwYWNoZS5vcmc6ODA4MC9jb250aW51dW08L3VybD4KLSAgICAgICAgPG5vdGlmaWVycz4KLSAgICAgICAgICAgIDxub3RpZmllcj4KLSAgICAgICAgICAgICAgICA8dHlwZT5tYWlsPC90eXBlPgotICAgICAgICAgICAgICAgIDxzZW5kT25TdWNjZXNzPnRydWU8L3NlbmRPblN1Y2Nlc3M+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhZGRyZXNzPmNvbW1pdHNAbXlmYWNlcy5hcGFjaGUub3JnPC9hZGRyZXNzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvbm90aWZpZXI+Ci0gICAgICAgIDwvbm90aWZpZXJzPgotICAgIDwvY2lNYW5hZ2VtZW50PgotICAgIAotICAgIDxpbmNlcHRpb25ZZWFyPjIwMDg8L2luY2VwdGlvblllYXI+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+TUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLQotICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KLSAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+Ci0KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS0KLSAgICAgICAgICAgICAgICAgICAgLSBDb3B5IExJQ0VOU0UudHh0IGFuZCBOT1RJQ0UudHh0IHNvIHRoYXQgdGhleSBhcmUgaW5jbHVkZWQKLSAgICAgICAgICAgICAgICAgICAgLSBpbiB0aGUgLWphdmFkb2MgamFyIGZpbGUgZm9yIHRoZSBjb21wb25lbnQuCi0gICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+amF2YWRvYy5yZXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hcGlkb2NzL01FVEEtSU5GIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTElDRU5TRS50eHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTk9USUNFLnR4dCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmphdmFkb2Muc2l0ZS5jb3B5PC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5zaXRlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENvcHkgamF2YWRvYyB0byBhbm90aGVyIGRpcmVjdG9yeSwgdG8ga2VlcCBqYXZhZG9jIG9mIHByZXZpb3VzIHZlcnNpb25zIG9uIHNpdGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zaXRlL2FwaWRvY3MtJHtwcm9qZWN0LnZlcnNpb259IiBmYWlsb25lcnJvcj0iZmFsc2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc2l0ZS9hcGlkb2NzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDwhLS0KLSAgICAgICAgICAgICAgICAtIE1ha2UgYSBjaGVja3N0eWxlIHZpb2xhdGlvbiBhIGNvbXBpbGUgZXJyb3IuIE5vdGUgdGhhdCBpZiBhIGNvbXBpbGUgZXJyb3Igb2NjdXJzLAotICAgICAgICAgICAgICAgIC0gZnVydGhlciBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGFyZ2V0L3NpdGUvY2hlY2tzdHlsZS5odG1sIChwcmVzZW50IGV2ZW4gd2hlbgotICAgICAgICAgICAgICAgIC0ganVzdCB0aGUgY29tcGlsZSBnb2FsIGFuZCBub3QgdGhlIHNpdGUgZ29hbCBoYXMgYmVlbiBydW4pLiBOb3RlIGFsc28gdGhhdCBjaGlsZAotICAgICAgICAgICAgICAgIC0gcHJvamVjdHMgbWF5IHJlZGVjbGFyZSB0aGlzIHBsdWdpbiBhbmQgcHJvdmlkZSBkaWZmZXJlbnQgY29uZmlndXJhdGlvbiBzZXR0aW5ncwotICAgICAgICAgICAgICAgIC0gdG8gdXNlIGRpZmZlcmVudCBjaGVja3MgKG1vcmUgb3IgbGVzcyBzdHJpY3QgdGhhbiB0aGUgZGVmYXVsdCkuCi0gICAgICAgICAgICAtLT4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY2hlY2tzdHlsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnZlcmlmeS1zdHlsZTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jaGVjazwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1jaGVja3Mtc3RhbmRhcmQueG1sPC9jb25maWdMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGhlYWRlckxvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1oZWFkZXIudHh0PC9oZWFkZXJMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS0gU2V0IGNvbXBpbGUgc291cmNlIGF0IDEuNSwgc2luY2UgdGhlIHRhcmdldCBKU0YgaW1wbCBpcyAxLjIgLS0+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4KLSAgICAgICAgICAgICAgICAgICAgPG9wdGltaXplPmZhbHNlPC9vcHRpbWl6ZT4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4gICAgICAgICAgICAKLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLSAgICA8cmVwb3NpdG9yaWVzPgotICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5tYXZlbjItcmVwb3NpdG9yeS5kZXYuamF2YS5uZXQ8L2lkPgotICAgICAgICAgICAgPG5hbWU+SmF2YS5uZXQgUmVwb3NpdG9yeSBmb3IgTWF2ZW48L25hbWU+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9kb3dubG9hZC5qYXZhLm5ldC9tYXZlbi8xLzwvdXJsPgotICAgICAgICAgICAgPGxheW91dD5sZWdhY3k8L2xheW91dD4KLSAgICAgICAgPC9yZXBvc2l0b3J5PgotICAgIDwvcmVwb3NpdG9yaWVzPgotCi0gICAgPHJlcG9ydGluZz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qeHItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1yZXBvcnQtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4zPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3QtaW5mby1yZXBvcnRzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjAuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbWQtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHJ1bGVzZXRzPgotICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL2Jhc2ljLnhtbDwvcnVsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxydWxlc2V0Pi9ydWxlc2V0cy91bnVzZWRjb2RlLnhtbDwvcnVsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgPC9ydWxlc2V0cz4KLSAgICAgICAgICAgICAgICAgICAgPGxpbmtYcmVmPnRydWU8L2xpbmtYcmVmPgotICAgICAgICAgICAgICAgICAgICA8bWluaW11bVRva2Vucz4xMDA8L21pbmltdW1Ub2tlbnM+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXRKZGs+MS41PC90YXJnZXRKZGs+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGVja3N0eWxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWdMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0YW5kYXJkLnhtbDwvY29uZmlnTG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxoZWFkZXJMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtaGVhZGVyLnR4dDwvaGVhZGVyTG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L3JlcG9ydGluZz4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL3BhcmVudDwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL3BhcmVudDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvcGFyZW50PC91cmw+Ci0gICAgPC9zY20+Ci0KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDx1bmlxdWVWZXJzaW9uPmZhbHNlPC91bmlxdWVWZXJzaW9uPgotICAgICAgICAgICAgPGlkPmFwYWNoZS5zbmFwc2hvdHM8L2lkPgotICAgICAgICAgICAgPG5hbWU+QXBhY2hlIE1hdmVuIFNuYXBzaG90IFJlcG9zaXRvcnk8L25hbWU+Ci0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4KLSAgICAgICAgPC9zbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgICAgIDxzaXRlPgotICAgICAgICAgICAgPGlkPmFwYWNoZS1zaXRlPC9pZD4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyPC91cmw+Ci0gICAgICAgIDwvc2l0ZT4KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0KLSAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmdlbmVyYXRlLWFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+cGVyZm9ybVJlbGVhc2U8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDx2YWx1ZT50cnVlPC92YWx1ZT4KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLWphdmFkb2NzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLQotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8anNmLnZlcnNpb24+MS4yLjQ8L2pzZi52ZXJzaW9uPgotICAgIDwvcHJvcGVydGllcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3BhcmVudC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyODc5MzAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSAtLS0tLS0NCi1PdmVydmlldw0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMg0KLQ0KLSAgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgcHJvdmlkZXMgdmVyc2lvbnMgZm9yIEpTRiAxLjEgYW5kIDEuMg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3BhcmVudC9zcmMvc2l0ZS9hcHQvamF2YWRvYy5hcHQgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9wYXJlbnQvc3JjL3NpdGUvYXB0L2phdmFkb2MuYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjI2NjMxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3BhcmVudC9zcmMvc2l0ZS9hcHQvamF2YWRvYy5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0gLS0tLS0tDQotSmF2YWRvYw0KLSAtLS0tLS0NCi0NCi1KYXZhZG9jDQotDQotICAgIEhlcmUgeW91IGNhbiBmaW5kIHRoZSBqYXZhZG9jIG9mIHByZXZpb3VzIGV4dHZhbCB2ZXJzaW9ucy4NCi0NCi0gICAgKiB7e3todHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvbXlmYWNlcy1leHR2YWwtY29yZS9hcGlkb2NzLTEuMi4xL2luZGV4Lmh0bWx9TXlmYWNlcyBFeHRWYWwgQ29yZSBWZXJzaW9uIDEuMi4xfX0NCi0NCi0gICAgKiB7e3todHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvdmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbi9hcGlkb2NzLTEuMi4xL2luZGV4Lmh0bWx9TXlmYWNlcyBFeHRWYWwgUHJvcGVydHkgVmFsaWRhdGlvbiBWZXJzaW9uIDEuMi4xfX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9wYXJlbnQvc3JjL3NpdGUvc2l0ZS54bWwgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9wYXJlbnQvc3JjL3NpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ODY0OWYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvcGFyZW50L3NyYy9zaXRlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IG5hbWU9IkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIj4KLSAgPGJhbm5lckxlZnQ+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0VmFsPC9uYW1lPgotICAgIDxzcmM+aW1hZ2VzL2V4dHZhbF9sb2dvLnBuZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW5kZXguaHRtbDwvaHJlZj4KLSAgPC9iYW5uZXJMZWZ0PgotCi0gIDxiYW5uZXJSaWdodD4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlczwvbmFtZT4KLSAgICA8c3JjPmltZy9iYW5uZXJzL015RmFjZXNfbG9nby5qcGc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWw8L2hyZWY+Ci0gIDwvYmFubmVyUmlnaHQ+Ci0KLSAgPHB1Ymxpc2hEYXRlIGZvcm1hdD0iZGQgTU1NIHl5eXkiLz4KLQotICA8c2tpbj4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1zaXRlLXNraW48L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9za2luPgotCi0gIDxib2R5PgotICAgIDxsaW5rcz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSIgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJNeUZhY2VzIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkRvd25sb2FkIE15ZmFjZXMgRXh0VmFsIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Rvd25sb2FkLmh0bWwiLz4KLSAgICA8L2xpbmtzPgotCi0gICAgPG1lbnUgbmFtZT0iQXBhY2hlIE15RmFjZXMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9kb3dubG9hZC5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgbmFtZT0iQ29udGVudHMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9Ik1haW4gU2l0ZSIgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgPGl0ZW0gbmFtZT0iRXh0VmFsIGZvciBKU0YgMS4xIiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvaW5kZXguaHRtbCIgY29sbGFwc2U9InRydWUiPgotICAgICAgICAgICAgPGl0ZW0gbmFtZT0iZHVtbXkiICAgICAgICBocmVmPSJkdW1teSIvPgotICAgICAgICA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkV4dFZhbCBmb3IgSlNGIDEuMiIgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IkNvcmUgTW9kdWxlIiAgICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL215ZmFjZXMtZXh0dmFsLWNvcmUvaW5kZXguaHRtbCIvPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJQcm9wZXJ0eSBWYWxpZGF0aW9uIiAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi92YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iVHJpbmlkYWQgU3VwcG9ydCIgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQvaW5kZXguaHRtbCIvPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJHZW5lcmljIFN1cHBvcnQiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0L2luZGV4Lmh0bWwiLz4KLSAgICAgICAgPC9pdGVtPgotICAgIDwvbWVudT4KLQkKLSAgICA8bWVudSBuYW1lPSJEb2N1bWVudGF0aW9uIj4KLSAgICAgIDxpdGVtIG5hbWU9Ildpa2kiICAgICAgICAgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9teWZhY2VzL0V4dGVuc2lvbnMvVmFsaWRhdG9yLyIvPgotICAgICAgPGl0ZW0gbmFtZT0iSmF2YWRvYyIgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvamF2YWRvYy5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgcmVmPSJyZXBvcnRzIi8+Ci0KLSAgICA8bWVudSBuYW1lPSJGb3VuZGF0aW9uIiBpbmhlcml0PSJib3R0b20iPgotICAgICAgPGl0ZW0gbmFtZT0iQVNGIiAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iIC8+Ci0gICAgICA8aXRlbSBuYW1lPSJTcG9uc29yc2hpcCIgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vc3BvbnNvcnNoaXAuaHRtbCIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlRoYW5rcyIgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi90aGFua3MuaHRtbCIgLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3BvbS54bWwgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjg3OWQ1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlczwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLW1vZHVsZTwvYXJ0aWZhY3RJZD4NCi0gICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIE1vZHVsZTwvbmFtZT4NCi0gICAgPHVybD5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTI8L3VybD4NCi0NCi0gICAgPHNjbT4NCi0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rLzwvY29ubmVjdGlvbj4NCi0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay88L2RldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay88L3VybD4NCi0gICAgPC9zY20+DQotDQotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50Pg0KLSAgICAgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4NCi0gICAgICAgICAgICA8dW5pcXVlVmVyc2lvbj5mYWxzZTwvdW5pcXVlVmVyc2lvbj4NCi0gICAgICAgICAgICA8aWQ+YXBhY2hlLnNuYXBzaG90czwvaWQ+DQotICAgICAgICAgICAgPG5hbWU+QXBhY2hlIE1hdmVuIFNuYXBzaG90IFJlcG9zaXRvcnk8L25hbWU+DQotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1zbmFwc2hvdC1yZXBvc2l0b3J5PC91cmw+DQotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4NCi0gICAgICAgIDxzaXRlPg0KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc2l0ZTwvaWQ+DQotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTI8L3VybD4NCi0gICAgICAgIDwvc2l0ZT4NCi0gICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50Pg0KLQ0KLSAgICA8IS0tIFdBUk5JTkc6IERPIE5PVCBHRU5FUkFURSBTSVRFIEZST00gSEVSRSBESVJFQ1RMWQ0KLSAgICBTaW5jZSB0aGlzIHByb2plY3QgaGFzIGFuIGFzeW5jIHJlbGVhc2UgcHJvY2VkdXJlIChub3QNCi0gICAgYWxsIG1vZHVsZXMgc2hvdWxkIGJlIHJlbGVhc2VkIGF0IG9uY2UpLCB0aGUgcGFyZW50IHBvbS54bWwgDQotICAgIGlzIG5vdCB0aGlzICh0aGVyZSBpcyBhIG1vZHVsZSBmb3IgdGhhdCkuIFVzZSBtYXZlbiBzaXRlIA0KLSAgICBwbHVnaW4gaGVyZSBjYXVzZSBwcm9ibGVtcyB3aGVuIHRoZSBzaXRlIGlzIGdlbmVyYXRlZC4NCi0gICAgVGhlIHByb2NlZHVyZSBtdXN0IGV4ZWN1dGUgc2l0ZSBjb21tbWFuZCBmaXJzdCBvbiBwYXJlbnQgDQotICAgIG1vZHVsZSBhbmQgdGhlbiBvbiBlYWNoIG1vZHVsZSBsaXN0ZWQgYmVsb3cuIA0KLSAgICAgLS0+DQotDQotICAgIDxtb2R1bGVzPg0KLSAgICAgICAgPG1vZHVsZT5wYXJlbnQ8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+Y29yZTwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT52YWxpZGF0aW9uLW1vZHVsZXM8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+Y29tcG9uZW50LXN1cHBvcnQ8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+ZXhhbXBsZXM8L21vZHVsZT4NCi0gICAgPC9tb2R1bGVzPg0KLQ0KLSAgICA8cHJvZmlsZXM+DQotICAgICAgICA8IS0tIFRoaXMgcHJvZmlsZSBpcyBpbnZva2VkIGJ5IC1EcHJlcGFyZVJlbGVhc2U9dHJ1ZS4gIFRoaXMgYWxsb3dzIG12biByZWxlYXNlOnByZXBhcmUgdG8NCi0gICAgICAgICAgICBydW4gc3VjY2Vzc2Z1bGx5IG9uIHRoZSBhc3NlbWJseSBwcm9qZWN0cy4gLS0+DQotICAgICAgICA8cHJvZmlsZT4NCi0gICAgICAgICAgICA8aWQ+cHJlcGFyZS1yZWxlYXNlPC9pZD4NCi0gICAgICAgICAgICA8YWN0aXZhdGlvbj4NCi0gICAgICAgICAgICAgICAgPHByb3BlcnR5Pg0KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+cHJlcGFyZVJlbGVhc2U8L25hbWU+DQotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPg0KLSAgICAgICAgICAgIDxtb2R1bGVzPg0KLSAgICAgICAgICAgICAgICA8bW9kdWxlPmFzc2VtYmx5PC9tb2R1bGU+DQotICAgICAgICAgICAgPC9tb2R1bGVzPg0KLSAgICAgICAgICAgIDxidWlsZD4NCi0gICAgICAgICAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnRzPi1EcHJlcGFyZVJlbGVhc2U8L2FyZ3VtZW50cz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPg0KLSAgICAgICAgICAgIDwvYnVpbGQ+DQotICAgICAgICA8L3Byb2ZpbGU+DQotICAgIDwvcHJvZmlsZXM+DQotICAgIA0KLSAgICA8cHJvcGVydGllcz4NCi0gICAgICAgIDxqc2YudmVyc2lvbj4xLjIuNDwvanNmLnZlcnNpb24+DQotICAgIDwvcHJvcGVydGllcz4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2Uvc2l0ZS9wb20ueG1sIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2Uvc2l0ZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGZlMGFmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3NpdGUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgICAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICAgICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICAgICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgICAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gICAgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgICoKLSAgICAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gICAgKgotICAgICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj42PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1zaXRlPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3I8L25hbWU+Ci0gICAgPHVybD5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yPC91cmw+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxkZWZhdWx0R29hbD5zaXRlPC9kZWZhdWx0R29hbD4KLSAgICAgICAgPGV4dGVuc2lvbnM+Ci0gICAgICAgICAgPGV4dGVuc2lvbj4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ud2Fnb248L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD53YWdvbi1zc2gtZXh0ZXJuYWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtNTwvdmVyc2lvbj4KLSAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgPC9leHRlbnNpb25zPgotICAgIDwvYnVpbGQ+Ci0gICAgPHJlcG9ydGluZz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3QtaW5mby1yZXBvcnRzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9yZXBvcnRpbmc+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvc2l0ZTwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rL3NpdGU8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvc2l0ZTwvdXJsPgotICAgIDwvc2NtPgotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgICAgPHNpdGU+Ci0gICAgICAgIDxpZD5hcGFjaGUtc2l0ZTwvaWQ+Ci0gICAgICAgIDxuYW1lPkFwYWNoZSBXZWJzaXRlPC9uYW1lPgotICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3I8L3VybD4KLSAgICAgIDwvc2l0ZT4KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3NpdGUvc3JjL3NpdGUvYXB0L2Rvd25sb2FkLmFwdCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3NpdGUvc3JjL3NpdGUvYXB0L2Rvd25sb2FkLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYxMzZhMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9zaXRlL3NyYy9zaXRlL2FwdC9kb3dubG9hZC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotIH5+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSB+fiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gfn4gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSB+fiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSB+fiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSB+fiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSB+fg0KLSB+fiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSB+fg0KLSB+fiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIH5+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotIH5+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSB+fiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIH5+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSANCi0gLS0tLS0tDQotRG93bmxvYWQgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi0gLS0tLS0tDQotDQotRG93bmxvYWQgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi0NCi0NCi0gIFVzZSB0aGUgbGlua3MgYmVsb3cgdG8gZG93bmxvYWQgYSBkaXN0cmlidXRpb24gb2YgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZnJvbQ0KLSAgb25lIG9mIG91ciBtaXJyb3JzLiBJdCBpcyBnb29kIHByYWN0aWNlIHRvIHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIHRoZQ0KLSAgZGlzdHJpYnV0aW9uIGZpbGVzLg0KLQ0KLSAgWW91IHdpbGwgYmUgcHJvbXB0ZWQgZm9yIGEgbWlycm9yIC0gaWYgdGhlIGZpbGUgaXMgbm90IGZvdW5kIG9uIHlvdXJzLCBwbGVhc2UgYmUgcGF0aWVudCwgYXMgaXQgbWF5IHRha2UgMjQNCi0gIGhvdXJzIHRvIHJlYWNoIGFsbCBtaXJyb3JzLg0KLQ0KLSAgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgZGlzdHJpYnV0ZWQgYXMgYSA8PDx6aXA+Pj4gYXJjaGl2ZSAoZm9yIFdpbmRvd3MpIGFuZA0KLSAgYXMgYSA8PDx0YXIuZ3o+Pj4gYXJjaGl2ZSAoZm9yIFVOSVgpLiBUaGUgY29udGVudCBpcyB0aGUgc2FtZS4gUGxlYXNlIG5vdGUNCi0gIHRoYXQgdGhlIDw8PHRhci5nej4+PiBhcmNoaXZlcyBjb250YWluIGZpbGUgbmFtZXMgbG9uZ2VyIHRoYW4gMTAwIGNoYXJhY3RlcnMgYW5kIGhhdmUgYmVlbg0KLSAgY3JlYXRlZCB1c2luZyBHTlUgdGFyIGV4dGVuc2lvbnMuIFRodXMgdGhleSBtdXN0IGJlIHVudGFycmVkIHdpdGggYSBHTlUgY29tcGF0aWJsZQ0KLSAgdmVyc2lvbiBvZiB0YXIuDQotDQotICA8PCBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciAxLjAuMCBEaXN0cmlidXRpb24gPj4NCi0NCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18ICAgICAgICAgICAgICAgICAgICAgICAgIHwgTWlycm9ycyB8IENoZWNrc3VtIHwgU2lnbmF0dXJlIHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjEgMS4xLjEgKHRhci5neikgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4udGFyLmd6fSBteWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi50YXIuZ3p9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4udGFyLmd6Lm1kNX0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4udGFyLmd6Lm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi50YXIuZ3ouYXNjfSBteWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi50YXIuZ3ouYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMSAxLjEuMSAoemlwKSAgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4uemlwfSBteWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi56aXB9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4uemlwLm1kNX0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4uemlwLm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi56aXAuYXNjfSBteWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi56aXAuYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMSAxLjEuMSBTb3VyY2UgKHRhci5neikgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4xLjEtc3JjLnRhci5nen0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1zcmMudGFyLmd6fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMS4xLXNyYy50YXIuZ3oubWQ1fSBteWZhY2VzLWV4dHZhbDExLTEuMS4xLXNyYy50YXIuZ3oubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMS4xLXNyYy50YXIuZ3ouYXNjfSBteWZhY2VzLWV4dHZhbDExLTEuMS4xLXNyYy50YXIuZ3ouYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMSAxLjEuMSBTb3VyY2UgKHppcCkgICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMS4xLXNyYy56aXB9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjEtc3JjLnppcH19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1zcmMuemlwLm1kNX0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1zcmMuemlwLm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1zcmMuemlwLmFzY30gbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1zcmMuemlwLmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjIgMS4yLjEgKHRhci5neikgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4udGFyLmd6fSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi50YXIuZ3p9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4udGFyLmd6Lm1kNX0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4udGFyLmd6Lm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi50YXIuZ3ouYXNjfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi50YXIuZ3ouYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMiAxLjIuMSAoemlwKSAgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4uemlwfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi56aXB9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4uemlwLm1kNX0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1iaW4uemlwLm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9iaW5hcmllcy9teWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi56aXAuYXNjfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLWJpbi56aXAuYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMiAxLjIuMSBTb3VyY2UgKHRhci5neikgICAgIHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9jbG9zZXIuY2dpL215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjEtc3JjLnRhci5nen0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1zcmMudGFyLmd6fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4xLXNyYy50YXIuZ3oubWQ1fSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLXNyYy50YXIuZ3oubWQ1fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4xLXNyYy50YXIuZ3ouYXNjfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4xLXNyYy50YXIuZ3ouYXNjfX0gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tKw0KLXwgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMiAxLjIuMSBTb3VyY2UgKHppcCkgICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4xLXNyYy56aXB9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjEtc3JjLnppcH19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1zcmMuemlwLm1kNX0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1zcmMuemlwLm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1zcmMuemlwLmFzY30gbXlmYWNlcy1leHR2YWwxMi0xLjIuMS1zcmMuemlwLmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi0NCi1MYXRlc3Qgc291cmNlIGNvZGUgZnJvbSBTVk4gcmVwb3NpdG9yeQ0KLQ0KLSAgICBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIGxhdGVzdCBBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmZWF0dXJlcywgdGhlIHNvdXJjZSBjb2RlIGlzIHVuZGVyDQotICAgIHZlcnNpb24gY29udHJvbCB3aXRoIFNWTi4gIENsaWNrIHt7e3NvdXJjZS1yZXBvc2l0b3J5Lmh0bWx9IGhlcmUgfX0NCi0gICAgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byB1c2UgdGhlIEFTRiBFeHRlbnNpb25zIFZhbGlkYXRvciBTVk4gUmVwb3NpdG9yeS4NCi0NCi1WZXJpZnlpbmcgY2hlY2tzdW1zDQotDQotICAgIEl0IGlzIGVzc2VudGlhbCB0aGF0IHlvdSB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGUgZG93bmxvYWRlZA0KLSAgICBmaWxlcyB1c2luZyB0aGUgUEdQIGFuZCBNRDUgc2lnbmF0dXJlcy4gTUQ1IHZlcmlmaWNhdGlvbiBlbnN1cmVzIHRoZQ0KLSAgICBmaWxlIHdhcyBub3QgY29ycnVwdGVkIGR1cmluZyB0aGUgZG93bmxvYWQgcHJvY2Vzcy4gUEdQIHZlcmlmaWNhdGlvbg0KLSAgICBlbnN1cmVzIHRoYXQgdGhlIGZpbGUgY2FtZSBmcm9tIGEgY2VydGFpbiBwZXJzb24uDQotDQotICAgIFRvIHZlcmlmeSB0aGUgTUQ1IHNpZ25hdHVyZSBvbiB0aGUgZmlsZXMsIHlvdSBuZWVkIHRvIHVzZSBhIHByb2dyYW0NCi0gICAgY2FsbGVkIDw8PG1kNT4+PiBvciA8PDxtZDVzdW0+Pj4sIHdoaWNoIGlzDQotICAgIGluY2x1ZGVkIGluIG1hbnkgVU5JWCBkaXN0cmlidXRpb25zLiAgSXQgaXMgYWxzbyBhdmFpbGFibGUgYXMgcGFydCBvZg0KLSAgICB7e3todHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvdGV4dHV0aWxzL3RleHR1dGlscy5odG1sfUdOVSBUZXh0dXRpbHN9fS4NCi0gICAgV2luZG93cyB1c2VycyBjYW4gZ2V0IGJpbmFyeSBtZDUgcHJvZ3JhbXMgZnJvbSB7e3todHRwOi8vd3d3LmZvdXJtaWxhYi5jaC9tZDUvfWhlcmV9fSwNCi0gICAge3t7aHR0cDovL3d3dy5wYy10b29scy5uZXQvd2luMzIvZnJlZXdhcmUvY29uc29sZS99aGVyZX19LCBvcg0KLSAgICB7e3todHRwOi8vd3d3LnNsYXZhc29mdC5jb20vZnN1bS99aGVyZX19Lg0KLQ0KLVZlcmlmeWluZyBzaWduYXR1cmVzDQotDQotICAJUEdQIHZlcmlmaWNhdGlvbiBlbnN1cmVzIHRoYXQgdGhlIGZpbGUgY2FtZSBmcm9tIGEgY2VydGFpbiBwZXJzb24uICBXZSBzdHJvbmdseSByZWNvbW1lbmQNCi0JICB5b3UgdmVyaWZ5IHlvdXIgZG93bmxvYWRzIHdpdGggYm90aCBQR1AgYW5kIE1ENS4NCi0NCi0JVGhlIFBHUCBzaWduYXR1cmVzIGNhbiBiZSB2ZXJpZmllZCB1c2luZyB7e3todHRwOi8vd3d3LnBncGkub3JnL31QR1B9fSBvciANCi0Je3t7aHR0cDovL3d3dy5nbnVwZy5vcmcvfUdQR319LiAgRmlyc3QgZG93bmxvYWQgdGhlIEFwYWNoZSBNeUZhY2VzIA0KLQl7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL0tFWVN9S0VZU319CWFzIHdlbGwgYXMgdGhlIDw8PGFzYz4+PiBzaWduYXR1cmUgZmlsZSANCi0JZm9yIHRoZSBwYXJ0aWN1bGFyIGRpc3RyaWJ1dGlvbi4gSXQgaXMgaW1wb3J0YW50IHRoYXQgeW91IGdldCB0aGVzZSBmaWxlcyBmcm9tIHRoZSB1bHRpbWF0ZQ0KLQl0cnVzdGVkIHNvdXJjZSAtIHRoZSBtYWluIEFTRiBkaXN0cmlidXRpb24gc2l0ZSwgcmF0aGVyIHRoYW4gZnJvbSBhIG1pcnJvci4NCi0JVGhlbiB2ZXJpZnkgdGhlIHNpZ25hdHVyZXMgdXNpbmcgLi4uDQotDQotCSAgPDw8DQotCSAgJSBwZ3BrIC1hIEtFWVMNCi0JICAlIHBncHYgbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4udGFyLmd6LmFzYyBteWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi50YXIuZ3oNCi0JICA+Pj4NCi0NCi0JICA8b3I+DQotDQotCSAgPDw8DQotCSAgJSBwZ3AgLWthIEtFWVMNCi0JICAlIHBncCBteWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi50YXIuZ3ouYXNjIG15ZmFjZXMtZXh0dmFsMTEtMS4xLjEtYmluLnRhci5neg0KLQkgID4+Pg0KLQ0KLQkgIDxvcj4NCi0NCi0JICA8PDwNCi0gIAklIGdwZyAtLWltcG9ydCBLRVlTDQotCSAgJSBncGcgLS12ZXJpZnkgbXlmYWNlcy1leHR2YWwxMS0xLjEuMS1iaW4udGFyLmd6LmFzYyBteWZhY2VzLWV4dHZhbDExLTEuMS4xLWJpbi50YXIuZ3oNCi0JICA+Pj4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9zaXRlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9zaXRlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MjUzOWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2Uvc2l0ZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgYSBKU0YgY2VudHJpYyB2YWxpZGF0aW9uIGZyYW1ld29yay4NCi0gIA0KLSAgICBJdCBvZmZlcnMgcG93ZXJmdWwgYW5kIGVhc3kgdG8gdXNlIGZpZWxkIGJhc2VkIHZhbGlkYXRpb24gYmFzZWQgb24gYW5ub3RhdGlvbnMuDQotSXQgaGFzIGEgcGx1Z2dhYmxlIGFyY2hpdGVjdHVyZSwgc28gaXQgaXMgcG9zc2libGUgdG8gYWRkIG5ldyB2YWxpZGF0aW9uIG1vZHVsZXMgb3Igc3VwcG9ydCBmb3IgY29tcG9uZW50IGxpYnJhcmllcyBsaWtlIFRyaW5pZGFkIG9yIG90aGVyIDNyZCBwYXJ0eSBmcmFtZXdvcmtzLg0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS4xLnggYW5kIEpTRiAxLjIueC4gQm90aCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41Kw0KLQ0KLSAgICBGdXJ0aGVyIGluZm9ybWF0aW9uIGFyZSBhdmFpbGFibGUgYXQgdGhlIHt7e2h0dHA6Ly93aWtpLmFwYWNoZS5vcmcvbXlmYWNlcy9FeHRlbnNpb25zL1ZhbGlkYXRvci99V2lraX19LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3NpdGUvc3JjL3NpdGUvc2l0ZS54bWwgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS9zaXRlL3NyYy9zaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmM5ZTg1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3NpdGUvc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgbmFtZT0iQXBhY2hlIE15ZmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IiPgotICA8YmFubmVyTGVmdD4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRWYWw8L25hbWU+Ci0gICAgPHNyYz5pbWFnZXMvZXh0dmFsX2xvZ28ucG5nPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sPC9ocmVmPgotICA8L2Jhbm5lckxlZnQ+Ci0KLSAgPGJhbm5lclJpZ2h0PgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzPC9uYW1lPgotICAgIDxzcmM+aW1nL2Jhbm5lcnMvTXlGYWNlc19sb2dvLmpwZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbDwvaHJlZj4KLSAgPC9iYW5uZXJSaWdodD4gCi0KLSAgPHB1Ymxpc2hEYXRlIGZvcm1hdD0iZGQgTU1NIHl5eXkiLz4KLQotICA8c2tpbj4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1zaXRlLXNraW48L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9za2luPgotCi0gIDxib2R5PgotICAgIDxsaW5rcz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSIgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJNeUZhY2VzIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkRvd25sb2FkIE15ZmFjZXMgRXh0VmFsIiAgICAgICBocmVmPSJkb3dubG9hZC5odG1sIi8+Ci0gICAgPC9saW5rcz4KLQotICAgIDxtZW51IG5hbWU9IkFwYWNoZSBNeUZhY2VzIiBpbmhlcml0PSJ0b3AiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZG93bmxvYWQuaHRtbCIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IG5hbWU9IkNvbnRlbnRzIiBpbmhlcml0PSJ0b3AiPgotICAgICAgICA8aXRlbSBuYW1lPSJNYWluIFNpdGUiICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sIi8+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkV4dFZhbCBmb3IgSlNGIDEuMSIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExL2luZGV4Lmh0bWwiIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9ImR1bW15IiAgICAgICAgaHJlZj0iZHVtbXkiLz4KLSAgICAgICAgPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjIiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9pbmRleC5odG1sIiBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8aXRlbSBuYW1lPSJkdW1teSIgICAgICAgIGhyZWY9ImR1bW15Ii8+Ci0gICAgICAgIDwvaXRlbT4KLSAgICA8L21lbnU+Ci0KLSAgICA8bWVudSBuYW1lPSJEb2N1bWVudGF0aW9uIj4KLSAgICAgIDxpdGVtIG5hbWU9Ildpa2kiICAgICAgICAgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9teWZhY2VzL0V4dGVuc2lvbnMvVmFsaWRhdG9yLyIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IHJlZj0icmVwb3J0cyIvPgotCi0gICAgPG1lbnUgbmFtZT0iRm91bmRhdGlvbiIgaW5oZXJpdD0idG9wIj4KLSAgICAgIDxpdGVtIG5hbWU9IkFTRiIgICAgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIiAvPgotICAgICAgPGl0ZW0gbmFtZT0iU3BvbnNvcnNoaXAiICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3Nwb25zb3JzaGlwLmh0bWwiIC8+Ci0gICAgICA8aXRlbSBuYW1lPSJUaGFua3MiICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vdGhhbmtzLmh0bWwiIC8+Ci0gICAgPC9tZW51PgotICA8L2JvZHk+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcG9tLnhtbCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzFhZDc1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBWYWxpZGF0aW9uLU1vZHVsZXM8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvdmFsaWRhdGlvbi1tb2R1bGVzPC9jb25uZWN0aW9uPg0KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL3ZhbGlkYXRpb24tbW9kdWxlczwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4NCi0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL3ZhbGlkYXRpb24tbW9kdWxlczwvdXJsPg0KLSAgICA8L3NjbT4NCi0NCi0gICAgPG1vZHVsZXM+DQotICAgICAgICA8bW9kdWxlPnByb3BlcnR5LXZhbGlkYXRpb248L21vZHVsZT4NCi0gICAgICAgIDwhLS1tb2R1bGU+YmVhbi12YWxpZGF0aW9uPC9tb2R1bGUtLT4NCi0gICAgPC9tb2R1bGVzPg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZjllNmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgUHJvcGVydHktVmFsaWRhdGlvbi1Nb2R1bGU8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPnZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgucGVyc2lzdGVuY2U8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGVyc2lzdGVuY2UtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgICAgICA8IS0tIFRlc3QgZGVwZW5kZW5jaWVzIC0tPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi41PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQuanNwPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc2hhbGU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2hhbGUtdGVzdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuNDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIA0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgPC9yZXNvdXJjZXM+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4yPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9BYnN0cmFjdCouamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9UZXN0VXRpbHMuamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qQmVhbi5qYXZhPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGM3NDE2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLQ0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc4ZWYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDA4IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWM0ODdkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRTZWNyZXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTWVudTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lUmFkaW87Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlDaGVja2JveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUxpc3Rib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHRhcmVhOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgcHVibGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgY29uZmlndXJlUmVxdWlyZWRBdHRyaWJ1dGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOwotICAgICAgICBjb25maWd1cmVNYXhMZW5ndGhBdHRyaWJ1dGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVJlcXVpcmVkQXR0cmlidXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCFwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKSkgfHwKLSAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSkKLSAgICAgICAgICAgICYmCi0gICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGlzQ29tcG9uZW50UmVxdWlyZWQodWlDb21wb25lbnQpKSkKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJgotICAgICAgICAgICAgICAgIUJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRTZWNyZXQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVMaXN0Ym94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lTWVudSB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZVJhZGlvIHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUNoZWNrYm94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TWVudSB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0VGV4dGFyZWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaWYgdGhlcmUgaXMgbm8gc3BlY2lhbCBhdHRyaWJ1dGUgYXQgdGhlIGNvbXBvbmVudCB3aGljaCBzaG91bGQgb3ZlcnJ1bGUKLSAgICAgKiB0aGUgYW5ub3RhdGVkIHByb3BlcnR5IHJldHVybiB0cnVlIQotICAgICAqCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IGNvbXBvbmVudCB3aGljaCBpbXBsZW1lbnRzIHRoZSBFZGl0YWJsZVZhbHVlSG9sZGVyIGludGVyZmFjZQotICAgICAqIEByZXR1cm4gZmFsc2UgdG8gb3ZlcnJ1bGUgdGhlIGFubm90YXRlZCBwcm9wZXJ0eSBlLmcuIGlmIGNvbXBvbmVudCBpcyByZWFkb25seQotICAgICAqLwotICAgIHByb3RlY3RlZCBCb29sZWFuIGlzQ29tcG9uZW50UmVxdWlyZWQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBib29sZWFuIGlzUmVhZE9ubHkgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzUmVhZG9ubHkiKSkpOwotICAgICAgICBib29sZWFuIGlzRGlzYWJsZWQgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzRGlzYWJsZWQiKSkpOwotCi0gICAgICAgIHJldHVybiAhKGlzUmVhZE9ubHkgfHwgaXNEaXNhYmxlZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlTWF4TGVuZ3RoQXR0cmlidXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpOwotCi0gICAgICAgICAgICBpZighKG1heExlbmd0aCBpbnN0YW5jZW9mIEludGVnZXIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0VGV4dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBIdG1sSW5wdXRUZXh0IGh0bWxJbnB1dFRleHQgPSAoSHRtbElucHV0VGV4dCl1aUNvbXBvbmVudDsKLSAgICAgICAgICAgICAgICBodG1sSW5wdXRUZXh0LnNldE1heGxlbmd0aCgoSW50ZWdlciltYXhMZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjMmEwZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuTGFiZWxlZE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0U2VjcmV0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZUxpc3Rib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZU1lbnU7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZVJhZGlvOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55Q2hlY2tib3g7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE1hbnlMaXN0Ym94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TWVudTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0YXJlYTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEh0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcgotewotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpCi0gICAgewotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IEV4dFZhbFV0aWxzLmNvbnZlcnRGYWNlc01lc3NhZ2UodmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpKTsKLQotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gKFN0cmluZykgUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiZ2V0TGFiZWwiKSk7Ci0KLSAgICAgICAgICAgIGlmKGxhYmVsID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGFiZWwgPSB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL292ZXJyaWRlIHRoZSBsYWJlbCBpZiB0aGUgYW5ub3RhdGlvbiBwcm92aWRlcyBhIGxhYmVsCi0gICAgICAgICAgICBpZihtZXRhRGF0YUVudHJ5ICE9IG51bGwgJiYgbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsYWJlbCA9IG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwsIFN0cmluZy5jbGFzcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIExhYmVsZWRNZXNzYWdlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgoTGFiZWxlZE1lc3NhZ2UpZmFjZXNNZXNzYWdlKS5zZXRMYWJlbFRleHQobGFiZWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9pZiBzb21lb25lIHVzZXMgYSBub3JtYWwgZmFjZXMgbWVzc2FnZQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwoZmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRTZWNyZXQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVMaXN0Ym94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lTWVudSB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZVJhZGlvIHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUNoZWNrYm94IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TWVudSB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbElucHV0VGV4dGFyZWE7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzNjBiZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnJlY29yZGVyLkNyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyDQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcihuZXcgQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIoKSk7DQotDQotICAgICAgICBpbml0U3RhdGljU3RyYXRlZ3lNYXBwaW5ncygpOw0KLSAgICAgICAgaW5pdERlZmF1bHRDb21wb25lbnRJbml0aWFsaXplcigpOw0KLSAgICAgICAgaW5pdERlZmF1bHRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKTsNCi0gICAgICAgIGFkZFNraXBWYWxpZGF0aW9uU3VwcG9ydCgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0U3RhdGljU3RyYXRlZ3lNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBqcGFCYXNlZFZhbGlkYXRpb24gPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9KUEFfQkFTRURfVkFMSURBVElPTjsNCi0gICAgICAgIGlmIChqcGFCYXNlZFZhbGlkYXRpb24gPT0gbnVsbA0KLSAgICAgICAgICAgICAgICB8fCAhanBhQmFzZWRWYWxpZGF0aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgPSBuZXcgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZygNCi0gICAgICAgICAgICAgICAgRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgKyIuanBhX3N0cmF0ZWd5X21hcHBpbmdzIik7DQotDQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkU3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRywgc3RhdGljQ29uZmlnKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAid2ViLnhtbCBwYXJhbWV0ZXIgdG8gZGVhY3RpdmF0ZSBpdCIpDQotICAgIHByaXZhdGUgdm9pZCBpbml0RGVmYXVsdENvbXBvbmVudEluaXRpYWxpemVyKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ3ZWIueG1sIHBhcmFtZXRlciB0byBkZWFjdGl2YXRlIGl0IikNCi0gICAgcHJpdmF0ZSB2b2lkIGluaXREZWZhdWx0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKA0KLSAgICAgICAgICAgICAgICBuZXcgSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRTa2lwVmFsaWRhdGlvblN1cHBvcnQoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJhZGRpbmcgc3VwcG9ydCBmb3IgQFNraXBWYWxpZGF0aW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5kZW55UmVuZGVyZXJJbnRlcmNlcHRvcihWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKG5ldyBWYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0KCkpOw0KLQ0KLSAgICAgICAgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgIC8vaXQncyBqdXN0IHJlcXVpcmVkIHRvIHNldCB0aGUgdGFyZ2V0DQotICAgICAgICBjb25maWcuYWRkTWFwcGluZyhDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCBTa2lwVmFsaWRhdGlvblN1cHBvcnQuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5TS0lQX1ZBTElEQVRJT05fU1VQUE9SVF9DT05GSUcsIGNvbmZpZyk7DQotDQotICAgICAgICAvL2NvbmZpZy5hZGRNYXBwaW5nKENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04sIFJlcXVpcmVkU3RyYXRlZ3kuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OTc3MjYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yV2l0aFNraXBWYWxpZGF0aW9uU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuU2tpcFZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25JbnRlcmNlcHRvcldpdGhTa2lwVmFsaWRhdGlvblN1cHBvcnQgZXh0ZW5kcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBza2lwVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQotICAgIHsKLSAgICAgICAgaWYoRXh0VmFsVXRpbHMuaXNTa2lwYWJsZVZhbGlkYXRpb25TdHJhdGVneSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJvb2xlYW4gc2tpcFZhbGlkYXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlNLSVBfVkFMSURBVElPTiwgQm9vbGVhbi5jbGFzcyk7Ci0KLSAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMoc2tpcFZhbGlkYXRpb24pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJ2YWxpZGF0aW9uIG9mICIgKyB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGNhbmNlbGVkIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZih2YWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGFuY2VvZiBTa2lwVmFsaWRhdGlvblN0cmF0ZWd5KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgbnVsbCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzc3YTRlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFybid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJkb2N1bWVudGF0aW9uIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fTUVTU0FHRVNfSlBBID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMiKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9KUEFfQkFTRURfVkFMSURBVElPTiIpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vRG91YmxlUmFuZ2UuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2NkNGVmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIERvdWJsZVJhbmdlDQotew0KLSAgICBkb3VibGUgbWluaW11bSgpIGRlZmF1bHQgMDsNCi0NCi0gICAgZG91YmxlIG1heGltdW0oKSBkZWZhdWx0IERvdWJsZS5NQVhfVkFMVUU7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Kb2luVmFsaWRhdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YjUyYmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgSm9pblZhbGlkYXRpb24NCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkNzVmYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTGVuZ3RoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgTGVuZ3RoDQotew0KLSAgICBpbnQgbWluaW11bSgpIGRlZmF1bHQgMDsNCi0NCi0gICAgaW50IG1heGltdW0oKSBkZWZhdWx0IEludGVnZXIuTUFYX1ZBTFVFOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzc1MmQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIExvbmdSYW5nZQ0KLXsNCi0gICAgbG9uZyBtaW5pbXVtKCkgZGVmYXVsdCAwOw0KLQ0KLSAgICBsb25nIG1heGltdW0oKSBkZWZhdWx0IExvbmcuTUFYX1ZBTFVFOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUGF0dGVybi5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1BhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY3N2RjOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFBhdHRlcm4NCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJub19tYXRjaCI7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZC5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNjViM2MuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUmVxdWlyZWQNCi17DQotICAgIC8qKg0KLSAgICAgKiB0byBjdXN0b21pemUgdGhlIGVycm9yIG1lc3NhZ2Ugb3INCi0gICAgICogdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQganNmIHJlcXVpcmVkIG1lc3NhZ2Ugd2l0aCB0aGUgdXNhZ2Ugb2YgdGhlIG1lc3NhZ2UgcmVzb2x2ZXIgbWVjaGFuaXNtDQotICAgICAqDQotICAgICAqIEByZXR1cm4gYW4gb3B0aW9uYWwgZXJyb3IgbWVzc2FnZSBrZXkNCi0gICAgICovDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJmaWVsZF9yZXF1aXJlZCI7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvbi5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5N2VmODAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgU2tpcFZhbGlkYXRpb24NCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc5ZjY1MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVGFyZ2V0KFRZUEUpCi1AUmV0ZW50aW9uKFJVTlRJTUUpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBAaW50ZXJmYWNlIFNraXBWYWxpZGF0aW9uU3VwcG9ydAotewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9WYWxpZGF0b3IuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0NTZkMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgVmFsaWRhdG9yDQotew0KLSAgICBDbGFzczw/IGV4dGVuZHMgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcj5bXSB2YWx1ZSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWU4OTA1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IgZXh0ZW5kcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IKLXsKLSAgICBwcml2YXRlIERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGdldEluc3RhbmNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVJbnRlcmNlcHRlZE1ldGFEYXRhRXh0cmFjdG9yKG5ldyBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkKLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsKLQotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBQcm9wZXJ0eURldGFpbHMpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG9iamVjdC5nZXRDbGFzcygpICsgIiBpcyBub3QgYSAiICsgUHJvcGVydHlEZXRhaWxzLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gKFByb3BlcnR5RGV0YWlscylvYmplY3Q7Ci0KLSAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCk7Ci0KLSAgICAgICAgLy9UT0RPIHRlc3Qgd2l0aCBjb21wbGV4IGNvbXBvbmVudHMKLSAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5zZXRJbmZvcm1hdGlvbigKLSAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIHByb3BlcnR5RGV0YWlscyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZmluZCBhbmQgYWRkIGFubm90YXRpb25zCi0gICAgICAgICAqLwotICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU4MDEyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPVRoZSByZXF1aXJlZCBmb3JtYXRlIGlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2FiNTQzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPVx1MDYyN1x1MDY0NFx1MDYzNVx1MDY0YVx1MDYzYVx1MDYyOSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2MjZcdTA2MjkNCi1ub19tYXRjaF9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjM1XHUwNjRhXHUwNjNhXHUwNjI5IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzN1x1MDY0NFx1MDY0OFx1MDYyOFx1MDYyOSBcdTA2NDdcdTA2NDk6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZDY0OTAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW5vX21hdGNoPUZvcm1hdCBpbnZcdTAwZTBsaWQKLW5vX21hdGNoX2RldGFpbD1FbCBmb3JtYXQgcmVxdWVyaXQgXHUwMGU5czogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVlNzAxYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1Vbmf8bHRpZ2VzIEZvcm1hdA0KLW5vX21hdGNoX2RldGFpbD1EYXMgZXJmb3JkZXJsaWNoZSBGb3JtYXQgaXN0OiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU4MDEyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPVRoZSByZXF1aXJlZCBmb3JtYXRlIGlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmIxMDc3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXRvIGludlx1MDBlMWxpZG8gCi1ub19tYXRjaF9kZXRhaWw9RWwgZm9ybWF0byByZXF1ZXJpZG8gZXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMGEyMjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9TGUgZm9ybWF0IGVzdCBpbnZhbGlkZQ0KLW5vX21hdGNoX2RldGFpbD1MZSBmb3JtYXQgZG9pdCAmZWNpcmM7dHJlIGRlIGxhIGZvcm1lOiB7MH0NCi0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTg3NDhjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXRvIG5vbiB2YWxpZG8KLW5vX21hdGNoX2RldGFpbD1JbCBmb3JtYXRvIHJpY2hpZXN0byAmZWdyYXZlOzogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0YmM3NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1HZVx1MDBlN2Vyc2l6IGJpXHUwMGU3aW0NCi1ub19tYXRjaF9kZXRhaWw9Z2VyZWtlbiBiaVx1MDBlN2ltOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFhZTY0Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgICAgIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZU5hbWUgPSBudWxsOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VOYW1lID0gc3VwZXIuZ2V0QmFzZU5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBiYXNlTmFtZTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NzZhZDkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIHRoZSBqcGEgc3VwcG9ydCBpcyBhbiBleGNlcHRpb24gaW4gdmlldyBvZiBzb21lIG1lY2hhbmlzbXMgLSBzbyB0aGVyZSdzIG5vIGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZS4NCi0gKiBpbnN0ZWFkIG9mIHRoZSBjb252ZW50aW9uIHRoZXJlIGlzIGEgZ2xvYmFsIHByb3BlcnR5IHRvIGhhdmUgYW4gYWx0ZXJuYXRpdmUgdG8gd2ViLnhtbCBjb25maWd1cmF0aW9uDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTID0gIkpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTIjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX05BTUUgPSBXZWJYbWxQYXJhbWV0ZXIuVkFMSURBVElPTl9NRVNTQUdFU19KUEE7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX05BTUUgPSBKcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MNCi0gICAgICAgICAgICAuZ2V0UGFja2FnZSgpLmdldE5hbWUoKS5yZXBsYWNlKCIubWVzc2FnZS5yZXNvbHZlciIsICIubWVzc2FnZS5idW5kbGUiKSsgIi5qcGFfbWVzc2FnZXMiOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYoQ1VTVE9NX0JBU0VfTkFNRSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBDVVNUT01fQkFTRV9OQU1FOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQkFTRV9OQU1FOw0KLSAgICB9DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWRkMThjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgRG91YmxlUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoRG91YmxlUmFuZ2UuY2xhc3MpOw0KLQ0KLSAgICAgICAgZG91YmxlIG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4sIG1pbmltdW0pOw0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCwgYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgaWYobWluaW11bSA+IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzVhMTU5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSm9pbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3Rvci5EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKb2luTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIGV4dHJhY3RvciA9IERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuZ2V0SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIFN0cmluZ1tdIHRhcmdldEV4cHJlc3Npb25zID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShKb2luVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotDQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHM7DQotICAgICAgICBmb3IgKFN0cmluZyB0YXJnZXRFeHByZXNzaW9uIDogdGFyZ2V0RXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChtZXRhRGF0YUVudHJ5LCB0YXJnZXRFeHByZXNzaW9uKTsNCi0NCi0gICAgICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBleHRyYWN0b3IuZXh0cmFjdChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscykuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSBFeHRWYWxVdGlscy5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSk7DQotDQotICAgICAgICAgICAgICAgIGlmIChtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0QWxsKG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pwYU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGJmZGJhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5CYXNpYzsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJpbXBsLiB0aGUgcmVzdCIpDQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IG1ldGFEYXRhLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIENvbHVtbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighKChDb2x1bW4pIGFubm90YXRpb24pLm51bGxhYmxlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCwgKChDb2x1bW4pIGFubm90YXRpb24pLmxlbmd0aCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIEJhc2ljKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCEoKEJhc2ljKSBhbm5vdGF0aW9uKS5vcHRpb25hbCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKGFubm90YXRpb24gaW5zdGFuY2VvZiBJZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9UT0RPIGltcGwuIHRoZSByZXN0ISEhDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTGVuZ3RoTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2M1ZWUzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTGVuZ3RoTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTGVuZ3RoTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTGVuZ3RoIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKExlbmd0aC5jbGFzcyk7DQotDQotICAgICAgICBpbnQgbWluaW11bSA9IGFubm90YXRpb24ubWluaW11bSgpOw0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEgsIG1pbmltdW0pOw0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgsIGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gPiAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Mb25nUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ODVlMmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Mb25nUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Mb25nUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMb25nUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBMb25nUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTG9uZ1JhbmdlLmNsYXNzKTsNCi0NCi0gICAgICAgIGxvbmcgbWluaW11bSA9IGFubm90YXRpb24ubWluaW11bSgpOw0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTiwgbWluaW11bSk7DQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYLCBhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBpZihtaW5pbXVtID4gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1BhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1BhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NGE1YjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9QYXR0ZXJuTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFBhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBQYXR0ZXJuIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFBhdHRlcm4uY2xhc3MpOw0KLSAgICAgICAgDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTiwgKGFubm90YXRpb24pLnZhbHVlKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSA9IChhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIExvY2FsZSBjdXJyZW50TG9jYWxlID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCk7DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5ID0NCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2cgPSBFeHRWYWxVdGlscy5nZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgIC5nZXRNZXNzYWdlKHZhbGlkYXRpb25FcnJvck1zZ0tleSwgY3VycmVudExvY2FsZSk7DQotDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTl9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UsIHZhbGlkYXRpb25FcnJvck1zZyk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9SZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThmNWFhNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU2tpcE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU2tpcE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZiODI1Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NraXBNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFNraXBNZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCB0cnVlKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MTc0ODkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgVmFsaWRhdG9yIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFZhbGlkYXRvci5jbGFzcyk7DQotDQotICAgICAgICBDbGFzc1tdIHZhbGlkYXRvcnMgPSBhbm5vdGF0aW9uLnZhbHVlKCk7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBjdXJyZW50Q2xhc3MgOiB2YWxpZGF0b3JzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRDbGFzcy5nZXRTaW1wbGVOYW1lKCkudG9Mb3dlckNhc2UoKS5jb250YWlucyhDb21tb25NZXRhRGF0YUtleXMuRU1BSUwpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsdWUuYWRkKENvbW1vbk1ldGFEYXRhS2V5cy5FTUFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZhbHVlLmFkZChjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00sIHZhbHVlKTsNCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvRG91YmxlUmFuZ2VTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNzU5MzMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkRvdWJsZVJhbmdlVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEb3VibGVSYW5nZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIERvdWJsZVJhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKERvdWJsZVJhbmdlLmNsYXNzKTsNCi0gICAgICAgIERvdWJsZVJhbmdlVmFsaWRhdG9yIGRvdWJsZVJhbmdlVmFsaWRhdG9yID0gKERvdWJsZVJhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5Eb3VibGVSYW5nZSIpOw0KLQ0KLSAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Kb2luVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1ZDRlNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3Rvci5EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSm9pblZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBleHRyYWN0b3IgPSBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmdldEluc3RhbmNlKCk7DQotDQotICAgICAgICBTdHJpbmdbXSB0YXJnZXRFeHByZXNzaW9ucyA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoSm9pblZhbGlkYXRpb24uY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlsczsNCi0gICAgICAgIGZvciAoU3RyaW5nIHRhcmdldEV4cHJlc3Npb24gOiB0YXJnZXRFeHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscw0KLSAgICAgICAgICAgICAgICAuY3JlYXRlUHJvcGVydHlEZXRhaWxzRm9yTmV3VGFyZ2V0KG1ldGFEYXRhRW50cnksIHRhcmdldEV4cHJlc3Npb24pOw0KLQ0KLSAgICAgICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IGV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgcHJvcGVydHlEZXRhaWxzKS5nZXRNZXRhRGF0YUVudHJpZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKGVudHJ5LmdldEtleSgpKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm5vIHZhbGlkYXRpb24gc3RyYXRlZ3kgZm91bmQgZm9yICIgKyBlbnRyeS5nZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxNGQ4ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQmFzaWM7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZTsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRmFjZXNCdW5kbGUgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRFX0xFTkdUSCA9ICJsZW5ndGgiOw0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB2aW9sYXRpb247DQotICAgIHByaXZhdGUgaW50IG1heExlbmd0aDsNCi0NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpOw0KLSAgICAgICAgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBDb2x1bW4pDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVDb2x1bW5Bbm5vdGF0aW9uKChDb2x1bW4pIGFubm90YXRpb24sIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgQmFzaWMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVCYXNpY0Fubm90YXRpb24oKEJhc2ljKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIElkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBPbmVUb09uZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZU9uZVRvT25lQW5ub3RhdGlvbigoT25lVG9PbmUpIGFubm90YXRpb24sIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTWFueVRvT25lKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlTWFueVRvT25lQW5ub3RhdGlvbigoTWFueVRvT25lKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUNvbHVtbkFubm90YXRpb24oQ29sdW1uIGNvbHVtbiwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoIWNvbHVtbi5udWxsYWJsZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nDQotICAgICAgICAgICAgICAgICYmIGNvbHVtbi5sZW5ndGgoKSA8ICgoU3RyaW5nKSBjb252ZXJ0ZWRPYmplY3QpLmxlbmd0aCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uID0gVkFMSURBVEVfTEVOR1RIOw0KLSAgICAgICAgICAgIHRoaXMubWF4TGVuZ3RoID0gY29sdW1uLmxlbmd0aCgpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNYXNzYWdlKG51bGwpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVCYXNpY0Fubm90YXRpb24oQmFzaWMgYmFzaWMsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKCFiYXNpYy5vcHRpb25hbCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVPbmVUb09uZUFubm90YXRpb24oT25lVG9PbmUgb25lVG9PbmUsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmICghb25lVG9PbmUub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTWFueVRvT25lQW5ub3RhdGlvbihNYW55VG9PbmUgbWFueVRvT25lLCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIW1hbnlUb09uZS5vcHRpb25hbCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9EbyhQcmlvcml0eS5NRURJVU0pDQotICAgIHByaXZhdGUgdm9pZCBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCA9PSBudWxsIHx8IGNvbnZlcnRlZE9iamVjdC5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uID0gQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNYXNzYWdlKG51bGwpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChWQUxJREFURV9MRU5HVEguZXF1YWxzKHRoaXMudmlvbGF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gImZpZWxkX3Rvb19sb25nIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gImZpZWxkX3JlcXVpcmVkIjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24pOw0KLQ0KLSAgICAgICAgaWYgKFZBTElEQVRFX0xFTkdUSC5lcXVhbHModGhpcy52aW9sYXRpb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLnJlcGxhY2UoInswfSIsICIiICsgdGhpcy5tYXhMZW5ndGgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gZS5nZXRGYWNlc01lc3NhZ2UoKTsNCi0NCi0gICAgICAgIGlmKHRoaXMudXNlRmFjZXNCdW5kbGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoVkFMSURBVEVfTEVOR1RILmVxdWFscyh0aGlzLnZpb2xhdGlvbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5yZXBsYWNlV2l0aERlZmF1bHRNYXhpbXVtTWVzc2FnZShmYWNlc01lc3NhZ2UsIHRoaXMubWF4TGVuZ3RoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKGZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIGUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTGVuZ3RoU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTGVuZ3RoU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkMDU1OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xlbmd0aFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExlbmd0aFN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIExlbmd0aCBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMZW5ndGguY2xhc3MpOw0KLSAgICAgICAgTGVuZ3RoVmFsaWRhdG9yIGxlbmd0aFZhbGlkYXRvciA9IChMZW5ndGhWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoImphdmF4LmZhY2VzLkxlbmd0aCIpOw0KLQ0KLSAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1pbmltdW0oYW5ub3RhdGlvbi5taW5pbXVtKCkpOw0KLSAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1heGltdW0oYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzU4MjAyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTG9uZ1JhbmdlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxvbmdSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkxvbmdSYW5nZVZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTG9uZ1JhbmdlU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLQ0KLSAgICAgICAgTG9uZ1JhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKExvbmdSYW5nZS5jbGFzcyk7DQotICAgICAgICBMb25nUmFuZ2VWYWxpZGF0b3IgbG9uZ1JhbmdlVmFsaWRhdG9yID0gKExvbmdSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5Mb25nUmFuZ2UiKTsNCi0NCi0gICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUGF0dGVyblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDI4MzlhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUGF0dGVyblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5QYXR0ZXJuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQYXR0ZXJuU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFBhdHRlcm4gYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoUGF0dGVybi5jbGFzcyk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBleHByZXNzaW9uIDogYW5ub3RhdGlvbi52YWx1ZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbA0KLSAgICAgICAgICAgICAgICAgICAgfHwgIWphdmEudXRpbC5yZWdleC5QYXR0ZXJuLmNvbXBpbGUoZXhwcmVzc2lvbikubWF0Y2hlcigNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkT2JqZWN0LnRvU3RyaW5nKCkpLm1hdGNoZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24obmV3IEZhY2VzTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsDQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbikucmVwbGFjZSgiezB9IiwgZXhwcmVzc2lvbikpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChQYXR0ZXJuKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUmVxdWlyZWRTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzhmOTk2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUmVxdWlyZWRTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUZhY2VzQnVuZGxlID0gZmFsc2U7DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCB8fCBjb252ZXJ0ZWRPYmplY3QuZXF1YWxzKCIiKSB8fA0KLSAgICAgICAgICAgICAgICAoY29udmVydGVkT2JqZWN0IGluc3RhbmNlb2YgQ29sbGVjdGlvbiAmJiAoKENvbGxlY3Rpb24pY29udmVydGVkT2JqZWN0KS5pc0VtcHR5KCkpIHx8DQotICAgICAgICAgICAgICAgIChjb252ZXJ0ZWRPYmplY3QgaW5zdGFuY2VvZiBNYXAgJiYgKChNYXApY29udmVydGVkT2JqZWN0KS5pc0VtcHR5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNYXNzYWdlKG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKFJlcXVpcmVkKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc3VwZXIucmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0gICAgICAgIFN0cmluZyBtYXJrZXIgPSBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5NSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0NCi0gICAgICAgIGlmKChtYXJrZXIgKyBrZXkgKyBtYXJrZXIpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudXNlRmFjZXNCdW5kbGUgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy51c2VGYWNlc0J1bmRsZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5yZXBsYWNlV2l0aERlZmF1bHRSZXF1aXJlZE1lc3NhZ2UoZS5nZXRGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1NraXBWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU4NjEwMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1NraXBWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgU2tpcFZhbGlkYXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBTdHJpbmdbXSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9ucyA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoU2tpcFZhbGlkYXRpb24uY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBmb3IoU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gOiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihCb29sZWFuLlRSVUUuZXF1YWxzKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0VmFsdWVPZkV4cHJlc3Npb24oDQotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbikpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1ldGFEYXRhRW50cnkuc2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCB0cnVlKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIzY2M5MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFZhbGlkYXRvclN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yPltdIHZhbGlkYXRvckNsYXNzZXMgPQ0KLSAgICAgICAgICAgIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoVmFsaWRhdG9yLmNsYXNzKS52YWx1ZSgpOw0KLQ0KLSAgICAgICAgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvciB2YWxpZGF0b3I7DQotICAgICAgICBmb3IgKENsYXNzIHZhbGlkYXRvckNsYXNzTmFtZSA6IHZhbGlkYXRvckNsYXNzZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdG9yID0gKGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3IpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgIC50cnlUb0luc3RhbnRpYXRlQ2xhc3ModmFsaWRhdG9yQ2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAodmFsaWRhdG9yID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHZhbGlkYXRvckNsYXNzTmFtZS5nZXROYW1lKCkgKyAiIG5vdCBmb3VuZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NjZhNDEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5LkFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjZXNFeGNlcHRpb247DQotDQotLyoqDQotICogVGhpcyBwaGFzZSBsaXN0ZW5lciBwcm9jZXNzZXMgY3Jvc3MgdmFsaWRhdGlvbiBhcyBzb29uIGFzIGl0IGZpbmRzIGEgc3BlY2lhbCByZXF1ZXN0IHNjb3BlZCBzdG9yYWdlLjxici8+DQotICogU28gaXQncyBwb3NzaWJsZSB0byBhZGQgaW5mb3JtYXRpb24gZHVyaW5nIHRoZSBwcm9jZXNzIHZhbGlkYXRpb24gcGhhc2UuIEF0IHRoZSBlbmQgb2YgdGhpcyBwaGFzZSBpdCBnZXRzIHByb2Nlc3NlZC4NCi0gKiBBZnRlciB0aGF0IHRoZSBzdG9yYWdlIGdldHMgcmVzZXRlZC48cC8+DQotICogSWYgeW91IHByb3ZpZGUgYSBjdXN0b20gZXh0ZW5zaW9uIGFuZCB5b3UgYWRkIHRoZSBzYW1lIHN0b3JhZ2UgdHlwZSB3aXRoaW4gYSBkaWZmZXJlbnQgcGhhc2UsDQotICogaXQgYWxzbyBnZXRzIHByb2Nlc3NlZCBhdCB0aGUgZW5kIG9mIHRoYXQgcGhhc2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UgPSBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCk7DQotICAgICAgICAgICAgZm9yIChDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkgOiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkgaW5zdGFuY2VvZiBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5nZXRDbGFzcygpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5pdENyb3NzVmFsaWRhdGlvbiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5wcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKGVudHJ5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhZGRNZXNzYWdlID0gdHJ1ZTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpIGluc3RhbmNlb2YgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1lc3NhZ2UgPSAoQm9vbGVhbilSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkuZ2V0Q2xhc3MoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuY2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0Q2xhc3MoKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmKGFkZE1lc3NhZ2UpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjZXNNZXNzYWdlICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldEZhY2VzQ29udGV4dCgpLmFkZE1lc3NhZ2UoZW50cnkuZ2V0Q2xpZW50SWQoKSwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RmFjZXNDb250ZXh0KCkucmVuZGVyUmVzcG9uc2UoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGZpbmFsbHkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5yZXNldENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzSW5pdGlhbGl6ZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NST1NTVkFMSURBVElPTiAhPSBudWxsDQotICAgICAgICAgICAgICAgICAgICAmJiBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgSnNmVXRpbHMuZGVyZWdpc3RlclBoYXNlTGlzdGVuZXIodGhpcyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuQU5ZX1BIQVNFOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZiM2RmMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgTGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzID0gDQotICAgICAgICBuZXcgQXJyYXlMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcy5hZGQoZW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoTGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0YzA0MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5LkNyb3NzVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5DQotew0KLSAgICBwcml2YXRlIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeTsNCi0gICAgLy9mb3IgY29tcGxleCBjb21wb25lbnRzIChlLmcuIGEgdGFibGUpIHN0b3JlcyB0aGUgb2JqZWN0IG9mIGVudHJ5ICgje2VudHJ5LnByb3BlcnR5fSkNCi0gICAgcHJpdmF0ZSBVSUNvbXBvbmVudCBjb21wb25lbnQ7DQotICAgIHByaXZhdGUgT2JqZWN0IGNvbnZlcnRlZE9iamVjdDsNCi0gICAgcHJpdmF0ZSBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIC8vanVzdCBmb3IgaW5wdXQgY29tcG9uZW50cyB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzIGUuZy4gZGF0YVRhYmxlLC4uLg0KLSAgICBwcml2YXRlIFN0cmluZyBjbGllbnRJZDsNCi0NCi0gICAgcHVibGljIE1ldGFEYXRhRW50cnkgZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUVudHJ5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhRW50cnkoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhRW50cnkgPSBtZXRhRGF0YUVudHJ5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBVSUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudChVSUNvbXBvbmVudCBjb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkT2JqZWN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZE9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZWRPYmplY3QoT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb252ZXJ0ZWRPYmplY3QgPSBjb252ZXJ0ZWRPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblN0cmF0ZWd5KENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3kgPSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjbGllbnRJZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGllbnRJZChTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MzEzZDguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogSW4gb3JkZXIgdG8gYnVpbGQgdXAgYSBtYXBwaW5nIHdoaWNoIGlzIHVzZWQgZm9yIGNyb3NzLXZhbGlkYXRpb24uCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ci17Ci0gICAgcHJpdmF0ZSBPYmplY3QgYmVhbjsKLSAgICBwcml2YXRlIE9iamVjdCBjb252ZXJ0ZWRWYWx1ZTsKLSAgICBwcml2YXRlIFVJQ29tcG9uZW50IGNvbXBvbmVudDsKLSAgICAvL2ZvciBjb21wbGV4IGNvbXBvbmVudHMgKGUuZy4gYSB0YWJsZSB0aGVyZSBhcmUgbXVsdGlwbGUgZW50cmllcyB3aXRoCi0gICAgLy90aGUgc2FtZSBrZXkgKGhlcmUgdGhlIGVsIGV4cHJlc3Npb24gI3tlbnRyeS5wcm9wZXJ0eX0pCi0gICAgLy9ob3dldmVyLCBkb24ndCBvdmVycmlkZSB0aGUgcHJldmlvdXMgZW50cnkgLSB0aGV5IGFybid0IHRoZSBzYW1lOwotICAgIHByaXZhdGUgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBmdXJ0aGVyRW50cmllczsKLSAgICAvL2p1c3QgZm9yIGlucHV0IGNvbXBvbmVudHMgd2l0aGluIGNvbXBsZXggY29tcG9uZW50cyBlLmcuIGRhdGFUYWJsZSwuLi4KLSAgICBwcml2YXRlIFN0cmluZyBjbGllbnRJZDsKLQotICAgIC8qCi0gICAgICogZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRCZWFuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJlYW4oT2JqZWN0IGJlYW4pCi0gICAgewotICAgICAgICB0aGlzLmJlYW4gPSBiZWFuOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlZFZhbHVlKE9iamVjdCBjb252ZXJ0ZWRWYWx1ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29udmVydGVkVmFsdWUgPSBjb252ZXJ0ZWRWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVUlDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21wb25lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KFVJQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNsaWVudElkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudElkKFN0cmluZyBjbGllbnRJZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBnZXRGdXJ0aGVyRW50cmllcygpCi0gICAgewotICAgICAgICByZXR1cm4gZnVydGhlckVudHJpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RnVydGhlckVudHJpZXMoTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBmdXJ0aGVyRW50cmllcykKLSAgICB7Ci0gICAgICAgIHRoaXMuZnVydGhlckVudHJpZXMgPSBmdXJ0aGVyRW50cmllczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzQwMjc5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0NST1NTVkFMSURBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OIik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjM1YTFkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBEYXRlSXMNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlT2YoKTsNCi0NCi0gICAgLyoNCi0gICAgICogb3B0aW9uYWwgc2VjdGlvbg0KLSAgICAgKi8NCi0NCi0gICAgRGF0ZUlzVHlwZSB0eXBlKCkgZGVmYXVsdCBEYXRlSXNUeXBlLnNhbWU7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICIiOw0KLQ0KLSAgICBTdHJpbmcgbm90QmVmb3JlRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJ3cm9uZ19kYXRlX25vdF9iZWZvcmUiOw0KLQ0KLSAgICBTdHJpbmcgbm90QWZ0ZXJFcnJvck1zZ0tleSgpIGRlZmF1bHQgIndyb25nX2RhdGVfbm90X2FmdGVyIjsNCi0NCi0gICAgU3RyaW5nIG5vdEVxdWFsRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJ3cm9uZ19kYXRlX25vdF9lcXVhbCI7DQotDQotICAgIGludCBlcnJvck1lc3NhZ2VEYXRlU3R5bGUoKSBkZWZhdWx0IERhdGVGb3JtYXQuTUVESVVNOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJc1R5cGUuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzVmNDgyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYmVmb3JlT3JTYW1lLCBhZnRlck9yU2FtZSIpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGVudW0gRGF0ZUlzVHlwZQ0KLXsNCi0gICAgYmVmb3JlLCBhZnRlciwgc2FtZQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0VxdWFscy5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0Nzg5OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0VxdWFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBFcXVhbHMNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJkdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQiOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL05vdEVxdWFscy5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9Ob3RFcXVhbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg4MTc2Mi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL05vdEVxdWFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBOb3RFcXVhbHMNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJkdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkIjsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJiNmRiMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUmVxdWlyZWRJZg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWVPZigpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBvcHRpb25hbCBzZWN0aW9uDQotICAgICAqLw0KLQ0KLSAgICBSZXF1aXJlZElmVHlwZSBpcygpIGRlZmF1bHQgUmVxdWlyZWRJZlR5cGUubm90X2VtcHR5Ow0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZW1wdHlfZmllbGQiOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWZUeXBlLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWZUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYzU4ZDkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgZW51bSBSZXF1aXJlZElmVHlwZQ0KLXsNCi0gICAgZW1wdHksIG5vdF9lbXB0eQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNjA3NTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1JbnB1dCBpcyBkaWZmZXJlbnQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUlucHV0IGlzIGRpZmZlcmVudA0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotDQotd3JvbmdfZGF0ZT1Xcm9uZyBkYXRlDQotd3JvbmdfZGF0ZV9kZXRhaWw9V3JvbmcgZGF0ZQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmY5M2M0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9XHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0IFx1MDY0NVx1MDYyZVx1MDYyYVx1MDY0NFx1MDY0MQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0IFx1MDY0NVx1MDYyZVx1MDYyYVx1MDY0NFx1MDY0MQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9XHUwNjNhXHUwNjRhXHUwNjMxIFx1MDY0NVx1MDYzM1x1MDY0NVx1MDY0OFx1MDYyZCBcdTA2MjhcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgXHUwNjQ2IFx1MDY0MVx1MDYzMyBcdTA2NDJcdTA2NGFcdTA2NDVcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0DQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9XHUwNjNhXHUwNjRhXHUwNjMxIFx1MDY0NVx1MDYzM1x1MDY0NVx1MDY0OFx1MDYyZCBcdTA2MjhcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgIFx1MDY0Nlx1MDY0MVx1MDYzMyBcdTA2NDJcdTA2NGFcdTA2NDVcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0DQotDQotd3JvbmdfZGF0ZT1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjJlXHUwNjI3XHUwNjM3XHUwNjQ5XHUwNjIxDQotd3JvbmdfZGF0ZV9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDYyZVx1MDYyN1x1MDYzN1x1MDY0OVx1MDYyMQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDNcdTA2NDggXHUwNjQ2IFx1MDYyOFx1MDYzOVx1MDYyZiB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0MyBcdTA2NDhcdTA2NDYgXHUwNjI4XHUwNjM5XHUwNjJmIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0M1x1MDY0OCBcdTA2NDYgXHUwNjQyXHUwNjI4XHUwNjQ0IHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDMgXHUwNjQ4XHUwNjQ2IFx1MDY0Mlx1MDYyOFx1MDY0NCB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjQ0XHUwNjI3IFx1MDY0YVx1MDYzM1x1MDYyN1x1MDY0OFx1MDY0OSB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0NFx1MDYyNyBcdTA2NGFcdTA2MzNcdTA2MjdcdTA2NDhcdTA2NDkgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODU0ZWQyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPWVsIHZhbG9yIFx1MDBlOSBkaWZlcmVudAotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1lbCB2YWxvciBcdTAwZTkgZGlmZXJlbnQKLQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1ubyBlcyBwZXJtZXQgZWwgbWF0ZWl4IHZhbG9yCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1ubyBlcyBwZXJtZXQgZWwgbWF0ZWl4IHZhbG9yCi0KLXdyb25nX2RhdGU9ZGF0YSBlcnJcdTAwZjJuaWEKLXdyb25nX2RhdGVfZGV0YWlsPWRhdGEgZXJyXHUwMGYybmlhCi0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1sYSBkYXRhIGhhIGRlIHNlciBwb3N0ZXJpb3IgYSB7MH0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9bGEgZGF0YSBoYSBkZSBzZXIgcG9zdGVyaW9yIGEgezB9Ci0KLXdyb25nX2RhdGVfbm90X2FmdGVyPWxhIGRhdGEgaGEgZGUgc2VyIGFudGVyaW9yIGEgezB9Ci13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9bGEgZGF0YSBoYSBkZSBzZXIgcG9zdGVyaW9yIGEgezB9Ci0KLXdyb25nX2RhdGVfbm90X2VxdWFsPWxhIGRhdGEgbm8gXHUwMDBlOXMgaWd1YWwgYSB7MH0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1sYSBkYXRhIG5vIFx1MDAwZTlzIGlndWFsIGEgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDg3MjM0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9RWluZ2FiZSBpc3QgdW50ZXJzY2hpZWRsaWNoDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1FaW5nYWJlIGlzdCB1bnRlcnNjaGllZGxpY2gNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPURlciBnbGVpY2hlIFdlcnQgaXN0IG5pY2h0IGVybGF1YnQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1EZXIgZ2xlaWNoZSBXZXJ0IGlzdCBuaWNodCBlcmxhdWJ0DQotDQotd3JvbmdfZGF0ZT1EYXR1bSBpbmtvcnJla3QNCi13cm9uZ19kYXRlX2RldGFpbD1EYXR1bSBpbmtvcnJla3QNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9RGFzIERhdHVtIG11c3MgbmFjaCBkZW0gezB9IHNlaW4NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPURhcyBEYXR1bSBtdXNzIG5hY2ggZGVtIHswfSBzZWluDQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9RGFzIERhdHVtIG11c3Mgdm9yIGRlbSB7MH0gc2Vpbg0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1EYXMgRGF0dW0gbXVzcyB2b3IgZGVtIHswfSBzZWluDQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9RGFzIERhdHVtIGVudHNwcmljaHQgbmljaHQgZGVtIHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1EYXMgRGF0dW0gZW50c3ByaWNodCBuaWNodCBkZW0gezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjYwNzU5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9SW5wdXQgaXMgZGlmZmVyZW50DQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1JbnB1dCBpcyBkaWZmZXJlbnQNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLQ0KLXdyb25nX2RhdGU9V3JvbmcgZGF0ZQ0KLXdyb25nX2RhdGVfZGV0YWlsPVdyb25nIGRhdGUNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzODUyNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1sYSBlbnRyYWRhIGVzIGRpZmVyZW50ZQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1sYSBlbnRyYWRhIGVzIGRpZmVyZW50ZQotCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPW5vIHNlIHBlcm1pdGVuIGVudHJhZGFzIGlndWFsZXMKLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPW5vIHNlIHBlcm1pdGVuIGVudHJhZGFzIGlndWFsZXMKLQotd3JvbmdfZGF0ZT1mZWNoYSBlcXVpdm9jYWRhCi13cm9uZ19kYXRlX2RldGFpbD1mZWNoYSBlcXVpdm9jYWRhCi0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGx1ZWdvIGRlIHswfQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGx1ZWdvIGRlIHswfQotCi13cm9uZ19kYXRlX25vdF9hZnRlcj1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGFudGVzIGRlIHswfQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgYW50ZXMgZGUgezB9Ci0KLXdyb25nX2RhdGVfbm90X2VxdWFsPWxhIGZlY2hhIG5vIGVzIGlndWFsIGEgezB9Ci13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9bGEgZmVjaGEgbm8gZXMgaWd1YWwgYSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZjAyMTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1MZXMgY2hhbXBzIHNvbnQgZGlmZiZlYWN1dGU7cmVudHMNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUxlcyBjaGFtcHMgc29udCBkaWZmJmVhY3V0ZTtyZW50cw0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9TGVzIGNoYW1wcyBkb2l2ZW50ICZlY2lyYzt0cmUgZGlmZiZlYWN1dGU7cmVudHMNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1MZXMgY2hhbXBzIGRvaXZlbnQgJmVjaXJjO3RyZSBkaWZmJmVhY3V0ZTtyZW50cw0KLQ0KLXdyb25nX2RhdGU9TGEgZGF0ZSBlc3QgaW5jb3JyZWN0ZQ0KLXdyb25nX2RhdGVfZGV0YWlsPUxhIGRhdGUgZXN0IGluY29ycmVjdGUNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXByJmVncmF2ZTtzIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXByJmVncmF2ZTtzIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGF2YW50IHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhdmFudCB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1MYSBkYXRlIG4nZXN0IHBhcyAmZWFjdXRlO2dhbGUgJmFncmF2ZTsgezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPUxhIGRhdGUgbidlc3QgcGFzICZlYWN1dGU7Z2FsZSAmYWdyYXZlOyB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNDI4MDEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9VmFsb3JpIG5vbiB1Z3VhbGkKLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9SSB2YWxvcmkgaW5zZXJpdGkgbm9uIGNvaW5jaWRvbm8KLQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1MbyBzdGVzc28gdmFsb3JlIG5vbiAmZWdyYXZlOyBwZXJtZXNzbwotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9TG8gc3Rlc3NvIHZhbG9yZSBub24gJmVncmF2ZTsgcGVybWVzc28KLQotd3JvbmdfZGF0ZT1EYXRhIGVycmF0YQotd3JvbmdfZGF0ZV9kZXRhaWw9RGF0YSBlcnJhdGEKLQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPUxhIGRhdGEgZGV2ZSBlc3NlcmUgZG9wbyBkaSB7MH0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9TGEgZGF0YSBkZXZlIGVzc2VyZSBkb3BvIGRpIHswfQotCi13cm9uZ19kYXRlX25vdF9hZnRlcj1MYSBkYXRhIGRldmUgZXNzZXJlIHByaW1hIGRpIHswfQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPUxhIGRhdGEgZGV2ZSBlc3NlcmUgcHJpbWEgZGkgezB9Ci0KLXdyb25nX2RhdGVfbm90X2VxdWFsPUxhIGRhdGEgbm9uICZlZ3JhdmU7IHVndWFsZSBhIHswfQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPUxhIGRhdGEgbm9uICZlZ3JhdmU7IHVndWFsZSBhIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcyBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFmNmE5ZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPWdpcmlsZW4gZGVcdTAxMWZlciBmYXJrbFx1MDEzMQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9Z2lyaWxlbiBkZVx1MDExZmVyIGZhcmtsXHUwMTMxDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1heW5cdTAxMzEgZGVcdTAxMWZlciBnaXJpbGVtZXoNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1heW5cdTAxMzEgZGVcdTAxMWZlciBnaXJpbGVtZXoNCi0NCi13cm9uZ19kYXRlPXlhbmxcdTAxMzFcdTAxNWYgdGFyaWgNCi13cm9uZ19kYXRlX2RldGFpbD15YW5sXHUwMTMxXHUwMTVmIHRhcmloDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gc29ucmEgb2xtYWxcdTAxMzFkXHUwMTMxcg0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBzb25yYSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBcdTAwZjZuY2Ugb2xtYWxcdTAxMzFkXHUwMTMxcg0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIFx1MDBmNm5jZSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmUgZVx1MDE1Zml0IGRlXHUwMTFmaWwNCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmUgZVx1MDE1Zml0IGRlXHUwMTFmaWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDc2NTllLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotICAgICAgICBleHRlbmRzDQotICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZiAoYmFzZU5hbWUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBiYXNlTmFtZSA9IHN1cGVyLmdldEJhc2VOYW1lKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gYmFzZU5hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcmVjb3JkZXIvQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlY29yZGVyL0Nyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNDBhMDMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcmVjb3JkZXIvQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5yZWNvcmRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXIuUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlciBpbXBsZW1lbnRzIFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXINCi17DQotICAgIHB1YmxpYyB2b2lkIHJlY29yZFVzZXJJbnB1dChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IHZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpZiAoISh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vdG8gc3VwcG9ydCBsb2NhbCBjcm9zcy12YWxpZGF0aW9uICh3aXRoaW4gdGhlIHNhbWUgZW50aXR5KQ0KLSAgICAgICAgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4ga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcgPSBDcm9zc1ZhbGlkYXRpb25VdGlscw0KLSAgICAgICAgICAgIC5nZXRPckluaXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpOw0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSBlbnRyeTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPQ0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgaWYocHJvcGVydHlEZXRhaWxzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBlbnRyeSA9IG5ldyBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5KCk7DQotICAgICAgICBlbnRyeS5zZXRCZWFuKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkpOw0KLSAgICAgICAgZW50cnkuc2V0Q29udmVydGVkVmFsdWUodmFsdWUpOw0KLSAgICAgICAgZW50cnkuc2V0Q29tcG9uZW50KHVpQ29tcG9uZW50KTsNCi0gICAgICAgIGVudHJ5LnNldENsaWVudElkKHVpQ29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGtleSA9IHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKTsNCi0NCi0gICAgICAgIC8vZm9yIGxvY2FsIGNyb3NzLXZhbGlkYXRpb24NCi0gICAgICAgIGlmIChrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5jb250YWluc0tleShrZXkpICYmDQotICAgICAgICAgICAga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcuZ2V0KGtleSkuZ2V0QmVhbigpICE9IG51bGwgJiYNCi0gICAgICAgICAgICAha2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcuZ2V0KGtleSkuZ2V0QmVhbigpLmVxdWFscyhlbnRyeS5nZXRCZWFuKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZm9yIHRoZSB2YWxpZGF0aW9uIHdpdGhpbiBhIGNvbXBsZXggY29tcG9uZW50IGUuZy4gYSB0YWJsZQ0KLSAgICAgICAgICAgIC8vZG9uJ3Qgb3ZlcnJpZGUgZXhpc3RpbmcgZXhwcmVzc2lvbiAoc3R5bGU6ICN7ZW50cnkucHJvcGVydHl9KSAtIG1ha2UgYSBzcGVjaWFsIG1hcHBpbmcNCi0NCi0gICAgICAgICAgICBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGZ1cnRoZXJFbnRyaWVzID0NCi0gICAgICAgICAgICAgICAga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcuZ2V0KGtleSkuZ2V0RnVydGhlckVudHJpZXMoKTsNCi0NCi0gICAgICAgICAgICBpZiAoZnVydGhlckVudHJpZXMgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZ1cnRoZXJFbnRyaWVzID0gbmV3IEFycmF5TGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PigpOw0KLQ0KLSAgICAgICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5nZXQoa2V5KS5zZXRGdXJ0aGVyRW50cmllcyhmdXJ0aGVyRW50cmllcyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZ1cnRoZXJFbnRyaWVzLmFkZChlbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9mb3Igbm9ybWFsIHZhbGlkYXRpb24NCi0gICAgICAgICAgICBrZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZy5wdXQoa2V5LCBlbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYzE1NDQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBMaXN0PFJlZmVyZW5jaW5nU3RyYXRlZ3k+IHJlZmVyZW5jaW5nU3RyYXRlZ2llczsNCi0gICAgcHJvdGVjdGVkIE1hcDxPYmplY3QsIE9iamVjdD4gdmlvbGF0aW9uUmVzdWx0U3RvcmFnZSA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOw0KLQ0KLSAgICBwdWJsaWMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICBpbml0UmVmZXJlbmNpbmdTdHJhdGVnaWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFJlZmVyZW5jaW5nU3RyYXRlZ2llcygpDQotICAgIHsNCi0gICAgICAgIGlmIChyZWZlcmVuY2luZ1N0cmF0ZWdpZXMgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMgPSBuZXcgQXJyYXlMaXN0PFJlZmVyZW5jaW5nU3RyYXRlZ3k+KCk7DQotDQotICAgICAgICAgICAgU3RyaW5nIGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3lDbGFzc05hbWUgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkJBU0VfUEFDS0FHRSkgKyAiUmVmZXJlbmNpbmdTdHJhdGVneSI7DQotDQotICAgICAgICAgICAgUmVmZXJlbmNpbmdTdHJhdGVneSBjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5ID0gKFJlZmVyZW5jaW5nU3RyYXRlZ3kpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgIC50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3lDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBFTENvbXBhcmVTdHJhdGVneSgpKTsNCi0gICAgICAgICAgICAvL3JlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IEFsaWFzQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IExvY2FsQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IExvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlKSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vaW5pdENyb3NzVmFsaWRhdGlvbiBpcyBkb25lIGluIHRoZSBDcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyDQotDQotICAgICAgICBTdHJpbmdbXSB2YWxpZGF0aW9uVGFyZ2V0cyA9IGdldFZhbGlkYXRpb25UYXJnZXRzKA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvblRhcmdldCA6IHZhbGlkYXRpb25UYXJnZXRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQgPSB2YWxpZGF0aW9uVGFyZ2V0LnRyaW0oKTsNCi0NCi0gICAgICAgICAgICAvL3NlbGVjdCB2YWxpZGF0aW9uIG1ldGhvZA0KLSAgICAgICAgICAgIHRyeVRvVmFsaWRhdGUoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCkNCi0gICAgew0KLSAgICAgICAgZm9yIChSZWZlcmVuY2luZ1N0cmF0ZWd5IHJlZmVyZW5jaW5nU3RyYXRlZ3kgOiByZWZlcmVuY2luZ1N0cmF0ZWdpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHJlZmVyZW5jaW5nU3RyYXRlZ3kuZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwgdmFsaWRhdGlvblRhcmdldCwgdGhpcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJUaHJvd2FibGVJbnN0YW5jZU5ldmVyVGhyb3duIn0pDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlRhcmdldCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFoYW5kbGVUYXJnZXRWaW9sYXRpb24oZW50cnlPZlNvdXJjZSwgZW50cnlPZlRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9ubyB0YXJnZXQgLSBiZWNhdXNlIHRoZXJlIGlzIG5vIHRhcmdldCBjb21wb25lbnQgLSB2YWx1ZSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1vZGVsDQotICAgICAgICAgICAgaWYoZW50cnlPZlRhcmdldCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1RhcmdldENvbXBvbmVudEFzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oZW50cnlPZlNvdXJjZSk7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIC8vZ2V0IHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSB0YXJnZXQgY29tcG9uZW50DQotICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldEVycm9yTWVzc2FnZVN1bW1hcnkoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIHRydWUpOw0KLSAgICAgICAgU3RyaW5nIGRldGFpbHMgPSBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIHRydWUpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0aW9uIHRhcmdldCBpc24ndCBib3VuZCB0byBhIGNvbXBvbmVudCB3aXRoaW5nIHRoZSBjdXJyZW50IHBhZ2UgDQotICAgICAgICAvLyhzZWUgdmFsaWRhdGVGb3VuZEVudHJ5LCB0cnlUb1ZhbGlkYXRlTG9jYWxseSBhbmQgdHJ5VG9WYWxpZGF0ZUJpbmRpbmdPbmx5KQ0KLSAgICAgICAgaWYgKGVudHJ5T2ZUYXJnZXQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBlbnRyeU9mVGFyZ2V0ID0gZW50cnlPZlNvdXJjZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlOw0KLSAgICAgICAgaWYgKGVudHJ5T2ZUYXJnZXQuZ2V0TWV0YURhdGFFbnRyeSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWVzc2FnZSA9IGdldFRhcmdldENvbXBvbmVudEVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgZW50cnlPZlRhcmdldC5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIHN1bW1hcnksIGRldGFpbHMpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vVE9ETyBkb2N1bWVudCBwb3NzaWJsZSBzaWRlIGVmZmVjdHMNCi0gICAgICAgICAgICAvL2R1ZSB0byBhIG1pc3NpbmcgdGFyZ2V0IGFubm90YXRpb24gKHNlZTogdHJ5VG9WYWxpZGF0ZUxvY2FsbHkpDQotICAgICAgICAgICAgbWVzc2FnZSA9IGdldFRhcmdldENvbXBvbmVudEVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIHN1bW1hcnksIGRldGFpbHMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKChtZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsIHx8IG1lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkgJiYNCi0gICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldENsaWVudElkKCkgIT0gbnVsbCAmJiAhZW50cnlPZlNvdXJjZS5nZXRDbGllbnRJZCgpLmVxdWFscyhlbnRyeU9mVGFyZ2V0LmdldENsaWVudElkKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24gPSBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG1lc3NhZ2UpOw0KLQ0KLSAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICAgICAgZW50cnlPZlRhcmdldC5nZXRDb21wb25lbnQoKSwgZW50cnlPZlRhcmdldC5nZXRNZXRhRGF0YUVudHJ5KCksDQotICAgICAgICAgICAgICAgICAgICBlbnRyeU9mVGFyZ2V0LmdldENvbnZlcnRlZE9iamVjdCgpLCB2YWxpZGF0b3JFeGNlcHRpb24sIHRoaXMpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LmFkZE1lc3NhZ2UoZW50cnlPZlRhcmdldC5nZXRDbGllbnRJZCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbnZlcnRGYWNlc01lc3NhZ2UodmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzVGFyZ2V0Q29tcG9uZW50QXNTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgLy9nZXQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKTsNCi0gICAgICAgIFN0cmluZyBkZXRhaWxzID0gZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbChlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSk7DQotDQotICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZSA9IGdldFNvdXJjZUNvbXBvbmVudEVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotDQotICAgICAgICBpZiAobWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCB8fCBtZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9UT0RPDQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihtZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8gbG9nZ2luZw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByb2Nlc3NTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGhhbmRsZVNvdXJjZVZpb2xhdGlvbihlbnRyeU9mU291cmNlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2dldCB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQNCi0gICAgICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldEVycm9yTWVzc2FnZVN1bW1hcnkoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksIGZhbHNlKTsNCi0gICAgICAgICAgICBTdHJpbmcgZGV0YWlscyA9IGdldEVycm9yTWVzc2FnZURldGFpbChlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgZmFsc2UpOw0KLQ0KLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlID0gZ2V0U291cmNlQ29tcG9uZW50RXJyb3JNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgfHwgbWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9UT0RPDQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24obWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9qdXN0IHRocm93IGEgbmV3IG1lc3NhZ2UgLSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBhdCB0aGUgdGFyZ2V0DQotICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG5ldyBGYWNlc01lc3NhZ2UoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEZhY2VzTWVzc2FnZSBnZXRTb3VyY2VDb21wb25lbnRFcnJvck1lc3NhZ2UoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZUZhY2VzTWVzc2FnZShzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBGYWNlc01lc3NhZ2UgZ2V0VGFyZ2V0Q29tcG9uZW50RXJyb3JNZXNzYWdlKEFubm90YXRpb24gZm91bmRBbm5vdGF0aW9uLCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZUZhY2VzTWVzc2FnZShzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByZXNvbHZlTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgICAgIHJldHVybiAoa2V5ICE9IG51bGwpID8gcmVzb2x2ZU1lc3NhZ2Uoa2V5ICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgpIDogbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVRhcmdldFZpb2xhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVudHJ5T2ZUYXJnZXQgIT0gbnVsbCAmJiBlbnRyeU9mVGFyZ2V0LmdldENvbXBvbmVudCgpICE9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlU291cmNlVmlvbGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gaGFuZGxlVGFyZ2V0VmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogbm8gdGFyZ2V0IGNvbXBvbmVudCAodmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBtb2RlbCkgLT4gZ2V0IHJldmVyc2UgbWVzc2FnZSBmb3Igc291cmNlIGNvbXBvbmVudA0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIC8vaWYgdGhlIG1lc3NhZ2UgaXMgbmV1dHJhbA0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiwgdHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogbm8gdGFyZ2V0IGNvbXBvbmVudCAodmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBtb2RlbCkgLT4gZ2V0IHJldmVyc2UgbWVzc2FnZSBmb3Igc291cmNlIGNvbXBvbmVudA0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgLy9pZiB0aGUgbWVzc2FnZSBpcyBuZXV0cmFsDQotICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24sIHRydWUpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGFic3RyYWN0IG1ldGhvZHMNCi0gICAgICovDQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCk7DQotDQotICAgIC8qDQotICAgICAqIGltcGxlbWVudHMgdGhlIHNwZWNpZmljIHZhbGlkYXRpb24gbG9naWMNCi0gICAgICovDQotDQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKTsNCi0NCi0gICAgLyoNCi0gICAgICogcmV0dXJucyB0aGUgcmVmZXJlbmNlZCB2YWxpZGF0aW9uIHRhcmdldHMgb2YgdGhlIGFubm90YXRpb24NCi0gICAgICogZS5nLiBARGF0ZUlzKHR5cGUgPSBEYXRlSXNUeXBlLmJlZm9yZSwgdmFsdWUgPSAiZmluYWxFeGFtIikNCi0gICAgICogLT4gbWV0aG9kIHJldHVybnMgYW4gYXJyYXkgd2l0aCBvbmUgdmFsdWUgKCJmaW5hbEV4YW0iKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbik7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjODFiYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzDQotICAgIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICAvL2luaXQgY3Jvc3MtdmFsaWRhdGlvbg0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5ID0NCi0gICAgICAgICAgICBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKS5hZGQoZW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5ID0gbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgpOw0KLQ0KLSAgICAgICAgZW50cnkuc2V0TWV0YURhdGFFbnRyeShtZXRhRGF0YUVudHJ5KTsNCi0gICAgICAgIGVudHJ5LnNldENvbXBvbmVudCh1aUNvbXBvbmVudCk7DQotICAgICAgICBlbnRyeS5zZXRDbGllbnRJZCh1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpKTsNCi0gICAgICAgIGVudHJ5LnNldENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgZW50cnkuc2V0VmFsaWRhdGlvblN0cmF0ZWd5KHRoaXMpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGVudHJ5Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vdCBhdmFpbGFibGUgZm9yIGNyb3NzIHZhbGlkYXRpb24gLSB1c2UgcHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24iKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRMYWJlbChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgYXZhaWxhYmxlIGZvciBjcm9zcyB2YWxpZGF0aW9uIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIC8vbm90IGF2YWlsYWJsZSBmb3IgY3Jvc3MgdmFsaWRhdGlvbiAtIHVzZSBpbml0Q3Jvc3NWYWxpZGF0aW9uDQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdENyb3NzVmFsaWRhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICAvL292ZXJyaWRlIGlmIG5lZWRlZA0KLSAgICB9DQotDQotICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbXBvbmVudCgpLCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksIHZhbGlkYXRvckV4Y2VwdGlvbiwgdGhpcyk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uSGVscGVyLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNmN2RlMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLlByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnksDQotICAgICAgICAgICAgYm9vbGVhbiBpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LmlzVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL3Byb2Nlc3MgYWZ0ZXIgdmlvbGF0aW9uDQotICAgICAgICAgICAgLy9qdXN0IGFkZCBtZXNzYWdlcw0KLSAgICAgICAgICAgIGlmKCFpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1RhcmdldEFmdGVyQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzVGFyZ2V0QWZ0ZXJNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy90aG93IGV4Y2VwdGlvbg0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NUYXJnZXRBZnRlckNyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSkNCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSA9IG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoKTsNCi0NCi0gICAgICAgIGlmIChjb21wYXJlU3RyYXRlZ3kudXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coc291cmNlQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29tcG9uZW50KHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb21wb25lbnQoKSk7DQotICAgICAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENsaWVudElkKHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDbGllbnRJZCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29tcG9uZW50KHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSk7DQotICAgICAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENsaWVudElkKHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDbGllbnRJZCgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb252ZXJ0ZWRPYmplY3QodmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCkpOw0KLSAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldFZhbGlkYXRpb25TdHJhdGVneShjb21wYXJlU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgLy9hZGQgbWVzc2FnZQ0KLSAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgc291cmNlQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc1RhcmdldEFmdGVyTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgLy9ubyB0YXJnZXQgLSBiZWNhdXNlIHRoZXJlIGlzIG5vIHRhcmdldCBjb21wb25lbnQgLSB2YWx1ZSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1vZGVsDQotICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgbnVsbCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjN2Q4NzIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICB2b2lkIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpDQotICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRGF0ZUlzU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0RhdGVJc1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMmZhNzEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRGF0ZUlzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRGF0ZUlzVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0Ow0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGF0ZUlzU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PX0VBUkxZID0gImVhcmx5IjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PX0xBVEUgPSAibGF0ZSI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9FUVVBTF9EQVRFX1RJTUUgPSAibm90IGVxdWFsIjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWSA9ICJyZXN1bHQiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QQVJFRF9WQUxVRV9LRVkgPSAidGFyZ2V0IHZhbHVlIjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVWRVJTRV9DT01QQVJFRF9WQUxVRV9LRVkgPSAicmV2ZXJzZSB0YXJnZXQgdmFsdWUiOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZygNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICAvL1RPRE8gdGVzdCAmIHJlbW92ZQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlU291cmNlVmlvbGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLCBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gdmlvbGF0aW9uRm91bmQ7DQotDQotICAgICAgICBpZiAoKChEYXRlSXMpIGFubm90YXRpb24pLnR5cGUoKS5lcXVhbHMoRGF0ZUlzVHlwZS5zYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IG9iamVjdDEgIT0gbnVsbCAmJiAhb2JqZWN0MS5lcXVhbHMob2JqZWN0Mik7DQotDQotICAgICAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVNVTFRfS0VZLCBOT1RfRVFVQUxfREFURV9USU1FKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmICgoKERhdGVJcykgYW5ub3RhdGlvbikudHlwZSgpLmVxdWFscyhEYXRlSXNUeXBlLmJlZm9yZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSBvYmplY3QxICE9IG51bGwgJiYgb2JqZWN0MiAhPSBudWxsICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICghbmV3IERhdGUoKChEYXRlKSBvYmplY3QxKS5nZXRUaW1lKCkpLmJlZm9yZSgoRGF0ZSkgb2JqZWN0MikgfHwgb2JqZWN0MS5lcXVhbHMob2JqZWN0MikpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVTVUxUX0tFWSwgVE9PX0xBVEUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IG9iamVjdDEgIT0gbnVsbCAmJiBvYmplY3QyICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFuZXcgRGF0ZSgoKERhdGUpIG9iamVjdDEpLmdldFRpbWUoKSkuYWZ0ZXIoKERhdGUpIG9iamVjdDIpIHx8IG9iamVjdDEuZXF1YWxzKG9iamVjdDIpKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFU1VMVF9LRVksIFRPT19FQVJMWSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoQ09NUEFSRURfVkFMVUVfS0VZLCBvYmplY3QxKTsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFVkVSU0VfQ09NUEFSRURfVkFMVUVfS0VZLCBvYmplY3QyKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB2aW9sYXRpb25Gb3VuZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChEYXRlSXMpIGFubm90YXRpb24pLnZhbHVlT2YoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBwcm90ZWN0ZWQNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IChTdHJpbmcpIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5nZXQoUkVTVUxUX0tFWSk7DQotDQotICAgICAgICBpZiAoIWlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHJldmVyc2VSZXN1bHQocmVzdWx0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChUT09fRUFSTFkuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldE5vdEFmdGVyRXJyb3JNc2dLZXkoKERhdGVJcykgYW5ub3RhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChUT09fTEFURS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0Tm90QmVmb3JlRXJyb3JNc2dLZXkoKERhdGVJcykgYW5ub3RhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldE5vdEVxdWFsRXJyb3JNc2dLZXkoKERhdGVJcykgYW5ub3RhdGlvbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmV2ZXJzZVJlc3VsdChTdHJpbmcgcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBpZiAoVE9PX0VBUkxZLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBUT09fTEFURTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gVE9PX0VBUkxZOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KSwgYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgICAgICB9DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGZhbHNlKSwgYW5ub3RhdGlvbiwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBmYWxzZSkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGFubm90YXRpb24sIGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbikNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKFN0cmluZyBrZXksIEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSByZXNvbHZlTWVzc2FnZShrZXkpOw0KLQ0KLSAgICAgICAgRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKChEYXRlSXMpIGFubm90YXRpb24pLmVycm9yTWVzc2FnZURhdGVTdHlsZSgpLA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpKTsNCi0NCi0gICAgICAgIFN0cmluZyByZXN1bHQ7DQotDQotICAgICAgICBpZihpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBtZXNzYWdlLnJlcGxhY2UoInswfSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdC5mb3JtYXQoKERhdGUpIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5nZXQoQ09NUEFSRURfVkFMVUVfS0VZKSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IG1lc3NhZ2UucmVwbGFjZSgiezB9IiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0LmZvcm1hdCgoRGF0ZSkgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLmdldChSRVZFUlNFX0NPTVBBUkVEX1ZBTFVFX0tFWSkpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vcmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgb3RoZXIgY29tcG9uZW50DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHByaXZhdGUNCi0gICAgICovDQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5vdEFmdGVyRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpLmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24ubm90QWZ0ZXJFcnJvck1zZ0tleSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90QmVmb3JlRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpLmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24ubm90QmVmb3JlRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5vdEVxdWFsRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpLmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24ubm90RXF1YWxFcnJvck1zZ0tleSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRUxDb21wYXJlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VMQ29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NDZhMjYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRUxDb21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Qcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogcmVmZXJlbmNpbmcgdmFsaWRhdGlvbiB0YXJnZXRzIC0gcG9zc2libGUgZm9ybWF0czoNCi0gKiAiI3tbYmVhbl9uYW1lXS5bcHJvcGVydHlfbmFtZV19IiAuLi4gY3Jvc3MtZW50aXR5IHZhbGlkYXRpb24gd2l0aCB2YWx1ZSBiaW5kaW5nDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIEVMQ29tcGFyZVN0cmF0ZWd5IGltcGxlbWVudHMgUmVmZXJlbmNpbmdTdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQodmFsaWRhdGlvblRhcmdldCkgJiYNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YWxpZGF0aW9uVGFyZ2V0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb1ZhbGlkYXRlVmFsdWVCaW5kaW5nKA0KLSAgICAgICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsaWRhdGlvblRhcmdldCksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsIGNvbXBhcmVTdHJhdGVneSk7DQotDQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInRlc3QiKQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlVmFsdWVCaW5kaW5nKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5ID0NCi0gICAgICAgICAgICAgICAgcmVzb2x2ZVRhcmdldEZvckNyb3NzQ29tcG9uZW50VmFsaWRhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXQpOw0KLQ0KLSAgICAgICAgaWYodmFsaWRhdGlvblRhcmdldEVudHJ5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgcmVzb2x2ZVRhcmdldEZvckNyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsaWRhdGlvblRhcmdldCkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4ga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nID0NCi0gICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0S2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcoKTsNCi0NCi0gICAgICAgIHJldHVybiBDcm9zc1ZhbGlkYXRpb25VdGlscy5yZXNvbHZlVmFsaWRhdGlvblRhcmdldEVudHJ5KA0KLSAgICAgICAgICAgICAgICBrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcsDQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmNvbnZlcnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uVG9Qcm9jZXNzZWRJbmZvcm1hdGlvbktleSh2YWxpZGF0aW9uVGFyZ2V0KSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSkNCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWxpZGF0aW9uVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgT2JqZWN0IHRhcmdldFZhbHVlID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRWYWx1ZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsIHZhbGlkYXRpb25UYXJnZXQpOw0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB0YXJnZXRFbnRyeSA9IG5ldyBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5KCk7DQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRCZWFuKA0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFZhbHVlT2ZFeHByZXNzaW9uKGZhY2VzQ29udGV4dCwgdmFsaWRhdGlvblRhcmdldC5nZXRCYXNlRXhwcmVzc2lvbigpKSk7DQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh0YXJnZXRWYWx1ZSk7DQotDQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEVudHJ5LCB0cnVlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FcXVhbHNTdHJhdGVneS5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0NzZjYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FcXVhbHNTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEVxdWFsc1N0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIHB1YmxpYyBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRXF1YWxzKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG9iamVjdDEgIT0gbnVsbCAmJiAhb2JqZWN0MS5lcXVhbHMob2JqZWN0Mik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRXF1YWxzKSBhbm5vdGF0aW9uKS52YWx1ZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDhkOThjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotDQotLyoqDQotICogIltwcm9wZXJ0eV9uYW1lXSIgLi4uIGxvY2FsIHZhbGlkYXRpb24gLT4gY3Jvc3MtY29tcG9uZW50LCBidXQgbm8gY3Jvc3MtZW50aXR5IHZhbGlkYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgTG9jYWxDb21wYXJlU3RyYXRlZ3kgaW1wbGVtZW50cyBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LCBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25UYXJnZXQuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneSB3aWxsIGNvbnRpbnVlDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlTG9jYWxseSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0S2V5LA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4ga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nID0NCi0gICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0S2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcoKTsNCi0NCi0gICAgICAgIGJvb2xlYW4gaXNNb2RlbEF3YXJlVmFsaWRhdGlvbiA9DQotICAgICAgICAgICAgICAgIGlzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZywgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldEtleTsNCi0NCi0gICAgICAgIFN0cmluZyBzb3VyY2VLZXkgPSByZXNvbHZlU291cmNlS2V5KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICB0YXJnZXRLZXkgPSBzb3VyY2VLZXkuc3Vic3RyaW5nKDAsIHNvdXJjZUtleS5sYXN0SW5kZXhPZigiLiIpICsgMSkgKyB0YXJnZXRLZXk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9IENyb3NzVmFsaWRhdGlvblV0aWxzLnJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgICAgIGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZywgdGFyZ2V0S2V5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLQ0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25UYXJnZXRFbnRyeSAhPSBudWxsICYmIHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb21wb25lbnQoKSAhPSBudWxsICYmICFpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICAvL25vIHRhcmdldCAtIGJlY2F1c2UgdGhlcmUgaXMgbm8gdGFyZ2V0IGNvbXBvbmVudCAtIHZhbHVlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbW9kZWwNCi0gICAgICAgIGVsc2UgaWYoaXNNb2RlbEF3YXJlVmFsaWRhdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHVuc3VwcG9ydGVkQ2FzZShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVUYXJnZXRLZXkoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgU3RyaW5nIHRhcmdldEtleSkNCi0gICAgew0KLSAgICAgICAgLy9ubyByZWFsIHZhbHVlIGJpbmRpbmcgZXhwcmVzc2lvbg0KLSAgICAgICAgLy9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGp1c3QgaGVwbHMgdG8gcmVwbGFjZSB0aGUgcHJvcGVydHkgb2YgdGhlIGtleQ0KLSAgICAgICAgLy9oZXJlIG9ubHkgZG90LW5vdGF0aW9uIGlzIGFsbG93ZWQgLT4gbm8gcHJvYmxlbQ0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBiYXNlRXhwcmVzc2lvbiA9DQotICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7IiArIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsDQotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMuY2xhc3MpLmdldEtleSgpICsgIn0iKTsNCi0NCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2VPckFkZFByb3BlcnR5KGJhc2VFeHByZXNzaW9uLCB0YXJnZXRLZXkpDQotICAgICAgICAgICAgLmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgIHJldHVybiByZXN1bHQuc3Vic3RyaW5nKDIsIHJlc3VsdC5sZW5ndGgoKSAtMSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRWYWx1ZU9mUHJvcGVydHkoT2JqZWN0IGJhc2UsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEsIHByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgICAgIE1ldGhvZCB0YXJnZXRNZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoYmFzZS5nZXRDbGFzcygpLCAiZ2V0IiArIHByb3BlcnR5KTsNCi0NCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZChiYXNlLmdldENsYXNzKCksICJpcyIgKyBwcm9wZXJ0eSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAiY2xhc3MgIiArIGJhc2UuZ2V0Q2xhc3MoKSArICIgaGFzIG5vIHB1YmxpYyBnZXQvaXMgIiArIHByb3BlcnR5LnRvTG93ZXJDYXNlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZChiYXNlLCB0YXJnZXRNZXRob2QpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PiBrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcsDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IGNyZWF0ZVRhcmdldEtleShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEtleSk7DQotDQotICAgICAgICByZXR1cm4gIWtleUNvbnZlcnRlZFZhbHVlTWFwcGluZy5jb250YWluc0tleShuZXdLZXkpOw0KLQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHJlc29sdmVTb3VyY2VLZXkoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBTdHJpbmcgc291cmNlS2V5ID0gcHJvcGVydHlEZXRhaWxzLmdldEtleSgpOw0KLQ0KLSAgICAgICAgaWYoIXNvdXJjZUtleS5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNvdXJjZSBwYXRoOiAiICsgc291cmNlS2V5ICsgIiBpbnZhbGlkIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc291cmNlS2V5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB1bnN1cHBvcnRlZENhc2UoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBjb252ZXJ0ZWQgb2JqZWN0IGZvciAiICsgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKS5nZXRLZXkoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5LCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSB0YXJnZXRFbnRyeSA9IG5ldyBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5KCk7DQotDQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRCZWFuKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcykuZ2V0QmFzZU9iamVjdCgpKTsNCi0gICAgICAgIHRhcmdldEVudHJ5DQotICAgICAgICAgICAgICAgIC5zZXRDb252ZXJ0ZWRWYWx1ZShnZXRWYWx1ZU9mUHJvcGVydHkodGFyZ2V0RW50cnkuZ2V0QmVhbigpLCB0YXJnZXRQcm9wZXJ0eSkpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRFbnRyeSwgdHJ1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdhZjRiYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqICJbbG9jYWxfcHJvcGVydHkucHJvcGVydHkxLnByb3BlcnR5Ml0iDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIExvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneSBleHRlbmRzIExvY2FsQ29tcGFyZVN0cmF0ZWd5DQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZighdmFsaWRhdGlvblRhcmdldC5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vbm90IHN1cHBvcnRlZCAtIFRPRE8gYWRkIGxvZ2dpbmcNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ5VG9WYWxpZGF0ZUxvY2FsbHkoDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlTG9jYWxseShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4ga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nID0NCi0gICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0S2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcoKTsNCi0NCi0gICAgICAgIFN0cmluZyBuZXdLZXkgPSBjcmVhdGVUYXJnZXRLZXkoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgaWYgKGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZy5jb250YWluc0tleShuZXdLZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5ID0ga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLmdldChuZXdLZXkpOw0KLQ0KLSAgICAgICAgICAgIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICAvL25vIHRhcmdldCAtIGJlY2F1c2UgdGhlcmUgaXMgbm8gdGFyZ2V0IGNvbXBvbmVudCAtIHZhbHVlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbW9kZWwNCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0S2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdGFyZ2V0SW5mb3JtYXRpb25FbnRyeSkNCi0gICAgew0KLSAgICAgICAgaWYgKGNvbXBhcmVTdHJhdGVneS5pc1Zpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICB0YXJnZXRJbmZvcm1hdGlvbkVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCksDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgPSBuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KCk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbXBvbmVudChjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDbGllbnRJZCh0YXJnZXRJbmZvcm1hdGlvbkVudHJ5LmdldENsaWVudElkKCkpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb252ZXJ0ZWRPYmplY3QodGFyZ2V0SW5mb3JtYXRpb25FbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpKTsNCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0VmFsaWRhdGlvblN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSk7DQotDQotICAgICAgICAgICAgLy9wcm9jZXNzIGFmdGVyIHZpb2xhdGlvbg0KLSAgICAgICAgICAgIC8vanVzdCBhZGQgbWVzc2FnZXMNCi0gICAgICAgICAgICBpZihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgbnVsbCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vdGhvdyBleGNlcHRpb24NCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBTdHJpbmcgdGFyZ2V0S2V5KQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgT2JqZWN0IG5ld0Jhc2UgPSBSZWZsZWN0aW9uVXRpbHMNCi0gICAgICAgICAgICAuZ2V0QmFzZU9mUHJvcGVydHlDaGFpbihwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgaWYodGFyZ2V0S2V5LmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9maW5kIHRoZSBsYXN0IHByb3BlcnR5DQotICAgICAgICAgICAgdGFyZ2V0S2V5ID0gdGFyZ2V0S2V5LnN1YnN0cmluZyh0YXJnZXRLZXkubGFzdEluZGV4T2YoIi4iKSArIDEsIHRhcmdldEtleS5sZW5ndGgoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBPYmplY3QgdGFyZ2V0VmFsdWUgPSBnZXRWYWx1ZU9mUHJvcGVydHkobmV3QmFzZSwgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgdGFyZ2V0RW50cnkgPSBuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSgpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0QmVhbihuZXdCYXNlKTsNCi0gICAgICAgIHRhcmdldEVudHJ5LnNldENvbnZlcnRlZFZhbHVlKHRhcmdldFZhbHVlKTsNCi0NCi0gICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0RW50cnksIHRydWUpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L05vdEVxdWFsc1N0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Ob3RFcXVhbHNTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDE1ZTIwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L05vdEVxdWFsc1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLk5vdEVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTm90RXF1YWxzU3RyYXRlZ3kgZXh0ZW5kcyBFcXVhbHNTdHJhdGVneQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoTm90RXF1YWxzKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLA0KLSAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICFzdXBlci5pc1Zpb2xhdGlvbihvYmplY3QxLCBvYmplY3QyLCBhbm5vdGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoTm90RXF1YWxzKSBhbm5vdGF0aW9uKS52YWx1ZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlZmVyZW5jaW5nU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlZmVyZW5jaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzNmRmYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSW50ZXJuYWwgaW50ZXJmYWNlIHRvIGFsbG93IG11bHRpcGxlIHJlZmVyZW5jaW5nIHN0cmF0ZWdpZXMgZm9yIGNyb3NzIGNvbXBvbmVudCB2YWxpZGF0aW9uLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1pbnRlcmZhY2UgUmVmZXJlbmNpbmdTdHJhdGVneQ0KLXsNCi0gICAgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5KTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVxdWlyZWRJZlN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQwNWE1Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZlR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFJlcXVpcmVkSWZTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRmFjZXNCdW5kbGUgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoUmVxdWlyZWRJZikgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLCBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gdmlvbGF0aW9uRm91bmQgPSBmYWxzZTsNCi0NCi0gICAgICAgIGlmICgoKFJlcXVpcmVkSWYpIGFubm90YXRpb24pLmlzKCkuZXF1YWxzKFJlcXVpcmVkSWZUeXBlLmVtcHR5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IChvYmplY3QyID09IG51bGwgfHwgb2JqZWN0Mi5lcXVhbHMoIiIpKSAmJiAob2JqZWN0MSA9PSBudWxsIHx8IG9iamVjdDEuZXF1YWxzKCIiKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmICgoKFJlcXVpcmVkSWYpIGFubm90YXRpb24pLmlzKCkuZXF1YWxzKFJlcXVpcmVkSWZUeXBlLm5vdF9lbXB0eSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSAob2JqZWN0MiAhPSBudWxsICYmICFvYmplY3QyLmVxdWFscygiIikpICYmIChvYmplY3QxID09IG51bGwgfHwgb2JqZWN0MS5lcXVhbHMoIiIpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB2aW9sYXRpb25Gb3VuZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChSZXF1aXJlZElmKSBhbm5vdGF0aW9uKS52YWx1ZU9mKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMudXNlRmFjZXNCdW5kbGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2pwYV9zdHJhdGVneV9tYXBwaW5ncy5wcm9wZXJ0aWVzIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZDk5MjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLkJhc2ljPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLklkPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZT1vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5KcGFWYWxpZGF0aW9uU3RyYXRlZ3kKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkM2MzYWQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Dcm9zc1ZhbGlkYXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLlByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUk9TU19WQUxJREFUSU9OX1NUT1JBR0VfS0VZID0gQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBnZXRPckluaXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgTWFwIHJlcXVlc3RNYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpOw0KLQ0KLSAgICAgICAgaWYgKCFyZXF1ZXN0TWFwLmNvbnRhaW5zS2V5KENST1NTX1ZBTElEQVRJT05fU1RPUkFHRV9LRVkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKSByZXF1ZXN0TWFwLmdldChDUk9TU19WQUxJREFUSU9OX1NUT1JBR0VfS0VZKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0DQotICAgICAgICAgICAgICAgIC5nZXRDdXJyZW50SW5zdGFuY2UoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RXh0ZXJuYWxDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldFJlcXVlc3RNYXAoKQ0KLSAgICAgICAgICAgICAgICAucHV0KENST1NTX1ZBTElEQVRJT05fU1RPUkFHRV9LRVksIG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UT19DT05WRVJURURfVkFMVUVfTUFQUElOR19LRVkgPSBDcm9zc1ZhbGlkYXRpb25VdGlscy5jbGFzcy5nZXROYW1lKCk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeT4gZ2V0T3JJbml0S2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcoKQ0KLSAgICB7DQotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7DQotDQotICAgICAgICBpZiAoIXJlcXVlc3RNYXAuY29udGFpbnNLZXkoS0VZX1RPX0NPTlZFUlRFRF9WQUxVRV9NQVBQSU5HX0tFWSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzZXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5PikgcmVxdWVzdE1hcC5nZXQoS0VZX1RPX0NPTlZFUlRFRF9WQUxVRV9NQVBQSU5HX0tFWSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0S2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgLnB1dChLRVlfVE9fQ09OVkVSVEVEX1ZBTFVFX01BUFBJTkdfS0VZLCBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSByZXNvbHZlVmFsaWRhdGlvblRhcmdldEVudHJ5KA0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk+IGtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nLA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXksIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSA9DQotICAgICAgICAgICAga2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcuZ2V0KHRhcmdldEtleSk7DQotDQotICAgICAgICAvL3ZhbHVlIG5vdCBzdWJtaXR0ZWQgYXQgdGhpcyByZXF1ZXN0IC0gdXNlIG1vZGVsIHZhbHVlICh2YWxpZGF0aW9uIGFnYWluc3QgdGhlIG1vZGVsKQ0KLSAgICAgICAgaWYocHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9zaW1wbGUgY2FzZQ0KLSAgICAgICAgaWYgKHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuZ2V0RnVydGhlckVudHJpZXMoKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBPYmplY3QgdGFyZ2V0QmVhbiA9IHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCk7DQotDQotICAgICAgICAvL3Byb2Nlc3MgY29tcGxleCBjb21wb25lbnQgZW50cmllcyAoZS5nLiBhIHRhYmxlKQ0KLSAgICAgICAgLy9zdXBwb3J0ZWQ6IGNyb3NzLWNvbXBvbmVudCBidXQgbm8gY3Jvc3MtZW50aXR5IHZhbGlkYXRpb24gKD0gbG9jYWxlIHZhbGlkYXRpb24pDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5nZXRCZWFuKCkuZXF1YWxzKHRhcmdldEJlYW4pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZm9yIChQcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5IGVudHJ5IDogcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5nZXRGdXJ0aGVyRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbnRyeS5nZXRCZWFuKCkuZXF1YWxzKHRhcmdldEJlYW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJzdXBwb3J0IGZvciBtYXAgc3ludGF4IikNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFZhbHVlQmluZGluZ0V4cHJlc3Npb25Ub1Byb2Nlc3NlZEluZm9ybWF0aW9uS2V5KFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmJlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmJlLmdldEV4cHJlc3Npb25TdHJpbmcoKS5yZXBsYWNlKCIjeyIsICIiKS5yZXBsYWNlKCJ9IiwgIiIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzhlZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzOTI1NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgUHJvcGVydHkgVmFsaWRhdGlvbiBNb2R1bGUNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBQcm9wZXJ0eSBWYWxpZGF0aW9uIE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFByb3BlcnR5IFZhbGlkYXRpb24gcHJvdmlkZXMgYW5ub3RhdGlvbiBiYXNlZCB2YWxpZGF0aW9uIGZvciBiZWFuIHByb3BlcnRpZXMuDQotICAgIEl0IGFsc28gcHJvdmlkZXMgSlBBIDEuMCBiYXNlZCB2YWxpZGF0aW9uIFN1cHBvcnQuDQotICANCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEuMS54IGFuZCBKU0YgMS4yLnguIEJvdGggdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L0Fic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L0Fic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYjFkOTAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0OwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nOwotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlJbnB1dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeTsKLWltcG9ydCBqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuRXh0VmFsU3RhcnR1cExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsLk1vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnV0aWwuVGVzdFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0Lm1vY2suRXh0VmFsTW9ja0FwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuc2hhcmVkX2ltcGwuY29uZmlnLk15ZmFjZXNDb25maWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0FwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tFeHRlcm5hbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0ZhY2VzQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrRmFjZXNDb250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tIdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tIdHRwU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrTGlmZWN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tMaWZlY3ljbGVGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tSZW5kZXJLaXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1Jlc3BvbnNlV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tTZXJ2bGV0Q29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tTZXJ2bGV0Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QuZWwuTW9ja0V4cHJlc3Npb25GYWN0b3J5OwotCi0vKioKLSAqIEFic3RyYWN0IFNoYWxlIFRlc3QgYmFzZSBjbGFzcywgd2hpY2ggc2V0cyB1cCB0aGUgSlNGIGVudmlyb25tZW50LiAgSWYgdGhlIHRlc3QKLSAqIG92ZXJyaWRlcyA8Y29kZT5zZXRVcCgpPC9jb2RlPiBhbmQvb3IgPGNvZGU+dGVhckRvd24oKTwvY29kZT4sIHRoZW4gdGhvc2UKLSAqIG1ldGhvZHMgYnV0IGNhbGwgdGhlIG92ZXJ3aXR0ZW4gbWV0aG9kIHRvIGluc3VyZSBhIHZhbGlkIHRlc3QgZW52aXJvbm1lbnQuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHJvdGVjdGVkIE1vY2tBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbjsKLSAgICBwcm90ZWN0ZWQgTW9ja1NlcnZsZXRDb25maWcgY29uZmlnOwotICAgIHByb3RlY3RlZCBNb2NrRXh0ZXJuYWxDb250ZXh0IGV4dGVybmFsQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgTW9ja0ZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIE1vY2tGYWNlc0NvbnRleHRGYWN0b3J5IGZhY2VzQ29udGV4dEZhY3Rvcnk7Ci0gICAgcHJvdGVjdGVkIE1vY2tMaWZlY3ljbGUgbGlmZWN5Y2xlOwotICAgIHByb3RlY3RlZCBNb2NrTGlmZWN5Y2xlRmFjdG9yeSBsaWZlY3ljbGVGYWN0b3J5OwotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgcmVuZGVyS2l0OwotICAgIHByb3RlY3RlZCBNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3Q7Ci0gICAgcHJvdGVjdGVkIE1vY2tIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlOwotICAgIHByb3RlY3RlZCBNb2NrU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIE1vY2tIdHRwU2Vzc2lvbiBzZXNzaW9uOwotICAgIHByb3RlY3RlZCBNb2NrRXhwcmVzc2lvbkZhY3RvcnkgZXhwcmVzc2lvbkZhY3Rvcnk7Ci0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciB0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXI7Ci0KLSAgICAvKiogUmVzcG9uc2UgV3JpdGVyICovCi0gICAgcHJpdmF0ZSBNb2NrUmVzcG9uc2VXcml0ZXIgd3JpdGVyOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuCi0gICAgICovCi0gICAgcHVibGljIEFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgICAgIGFwcGxpY2F0aW9uID0gbnVsbDsKLSAgICAgICAgY29uZmlnID0gbnVsbDsKLSAgICAgICAgZXh0ZXJuYWxDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgZmFjZXNDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgZmFjZXNDb250ZXh0RmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIGxpZmVjeWNsZSA9IG51bGw7Ci0gICAgICAgIGxpZmVjeWNsZUZhY3RvcnkgPSBudWxsOwotICAgICAgICByZW5kZXJLaXQgPSBudWxsOwotICAgICAgICByZXF1ZXN0ID0gbnVsbDsKLSAgICAgICAgcmVzcG9uc2UgPSBudWxsOwotICAgICAgICBzZXJ2bGV0Q29udGV4dCA9IG51bGw7Ci0gICAgICAgIHNlc3Npb24gPSBudWxsOwotICAgICAgICBleHByZXNzaW9uRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIHRocmVhZENvbnRleHRDbGFzc0xvYWRlciA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFNldHVwIHRoZSB0ZXN0IGVudmlyb25tZW50LCBpbmNsdWRpbmcgdGhlIGZvbGxvd2luZzoKLSAgICAgKiAgPHVsPgotICAgICAqICA8bGk+U2V0IHRoZSBBcHBsaWNhdGlvbiBNYXAuPC9saT4KLSAgICAgKiAgPGxpPlNldCBhIHJlc3BvbnNlIHdyaXRlcjwvbGk+Ci0gICAgICogIDxsaT5BZGQgVG9tYWhhd2sncyByZW5kZXJlcnMgdG8gdGhlIGZhY2VzIGNvbnRleHQuPC9saT4KLSAgICAgKiAgPC91bD4gCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFswXSwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKSk7Ci0gICAgICAgIHNlcnZsZXRDb250ZXh0ID0gbmV3IE1vY2tTZXJ2bGV0Q29udGV4dCgpOwotICAgICAgICAvL2ZvciB0ZXN0aW5nIHRoZSBmYWxsYmFjawotICAgICAgICAvL3NlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCArICIuREVBQ1RJVkFURV9FTF9SRVNPTFZFUiIsICJ0cnVlIik7Ci0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCArICIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSIsIE1vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGNvbmZpZyA9IG5ldyBNb2NrU2VydmxldENvbmZpZyhzZXJ2bGV0Q29udGV4dCk7Ci0gICAgICAgIHNlc3Npb24gPSBuZXcgTW9ja0h0dHBTZXNzaW9uKCk7Ci0gICAgICAgIHNlc3Npb24uc2V0U2VydmxldENvbnRleHQoc2VydmxldENvbnRleHQpOwotICAgICAgICByZXF1ZXN0ID0gbmV3IE1vY2tIdHRwU2VydmxldFJlcXVlc3Qoc2Vzc2lvbik7Ci0gICAgICAgIHJlcXVlc3Quc2V0U2VydmxldENvbnRleHQoc2VydmxldENvbnRleHQpOwotICAgICAgICByZXNwb25zZSA9IG5ldyBNb2NrSHR0cFNlcnZsZXRSZXNwb25zZSgpOwotICAgICAgICBGYWN0b3J5RmluZGVyLnJlbGVhc2VGYWN0b3JpZXMoKTsKLSAgICAgICAgRmFjdG9yeUZpbmRlci5zZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3RvcnkiLCBFeHRWYWxNb2NrQXBwbGljYXRpb25GYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIEZhY3RvcnlGaW5kZXIuc2V0RmFjdG9yeSgiamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHRGYWN0b3J5IiwgIm9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tGYWNlc0NvbnRleHRGYWN0b3J5Iik7Ci0gICAgICAgIEZhY3RvcnlGaW5kZXIuc2V0RmFjdG9yeSgiamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZUZhY3RvcnkiLCAib3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0xpZmVjeWNsZUZhY3RvcnkiKTsKLSAgICAgICAgRmFjdG9yeUZpbmRlci5zZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeSIsICJvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrUmVuZGVyS2l0RmFjdG9yeSIpOwotICAgICAgICBleHRlcm5hbENvbnRleHQgPSBuZXcgTW9ja0V4dGVybmFsQ29udGV4dChzZXJ2bGV0Q29udGV4dCwgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICBsaWZlY3ljbGVGYWN0b3J5ID0gKE1vY2tMaWZlY3ljbGVGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZUZhY3RvcnkiKTsKLSAgICAgICAgbGlmZWN5Y2xlID0gKE1vY2tMaWZlY3ljbGUpbGlmZWN5Y2xlRmFjdG9yeS5nZXRMaWZlY3ljbGUoIkRFRkFVTFQiKTsKLSAgICAgICAgZmFjZXNDb250ZXh0RmFjdG9yeSA9IChNb2NrRmFjZXNDb250ZXh0RmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoImphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0RmFjdG9yeSIpOwotICAgICAgICBmYWNlc0NvbnRleHQgPSAoTW9ja0ZhY2VzQ29udGV4dClmYWNlc0NvbnRleHRGYWN0b3J5LmdldEZhY2VzQ29udGV4dChzZXJ2bGV0Q29udGV4dCwgcmVxdWVzdCwgcmVzcG9uc2UsIGxpZmVjeWNsZSk7Ci0gICAgICAgIGV4dGVybmFsQ29udGV4dCA9IChNb2NrRXh0ZXJuYWxDb250ZXh0KWZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKTsKLSAgICAgICAgVUlWaWV3Um9vdCByb290ID0gbmV3IFVJVmlld1Jvb3QoKTsKLSAgICAgICAgcm9vdC5zZXRWaWV3SWQoIi92aWV3SWQiKTsKLSAgICAgICAgcm9vdC5zZXRSZW5kZXJLaXRJZCgiSFRNTF9CQVNJQyIpOwotICAgICAgICBmYWNlc0NvbnRleHQuc2V0Vmlld1Jvb3Qocm9vdCk7Ci0gICAgICAgIEFwcGxpY2F0aW9uRmFjdG9yeSBhcHBsaWNhdGlvbkZhY3RvcnkgPSAoQXBwbGljYXRpb25GYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5Iik7Ci0gICAgICAgIGFwcGxpY2F0aW9uID0gKE1vY2tBcHBsaWNhdGlvbilhcHBsaWNhdGlvbkZhY3RvcnkuZ2V0QXBwbGljYXRpb24oKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LnNldEFwcGxpY2F0aW9uKGFwcGxpY2F0aW9uKTsKLSAgICAgICAgUmVuZGVyS2l0RmFjdG9yeSByZW5kZXJLaXRGYWN0b3J5ID0gKFJlbmRlcktpdEZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeSIpOwotICAgICAgICAvL1dyYXAgcmVuZGVyZXJzIHdpdGggcHJvcGVyIGV4dmFsIHdyYXBwZXIKLSAgICAgICAgcmVuZGVyS2l0ID0gbmV3IERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpLmNyZWF0ZShuZXcgTW9ja1JlbmRlcktpdCgpKTsKLSAgICAgICAgcmVuZGVyS2l0RmFjdG9yeS5hZGRSZW5kZXJLaXQoIkhUTUxfQkFTSUMiLCByZW5kZXJLaXQpOyAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyBhZGRpdGlvbmFsIHNldHVwIG5vdCBwcm92aWRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBzaGFsZSBtb2NrIHN0dWZmCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbk1hcCgpLnB1dChNeWZhY2VzQ29uZmlnLmNsYXNzLmdldE5hbWUoKSwgbmV3IE15ZmFjZXNDb25maWcoKSk7Ci0gICAgICAgIHdyaXRlciA9IG5ldyBNb2NrUmVzcG9uc2VXcml0ZXIobmV3IFN0cmluZ1dyaXRlcigpLCBudWxsLCBudWxsKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LnNldFJlc3BvbnNlV3JpdGVyKHdyaXRlcik7Ci0KLSAgICAgICAgVGVzdFV0aWxzLmFkZERlZmF1bHRSZW5kZXJlcnMoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgVGVzdFV0aWxzLmFkZERlZmF1bHRWYWxpZGF0b3JzKGZhY2VzQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIGV4cHJlc3Npb25GYWN0b3J5ID0gKE1vY2tFeHByZXNzaW9uRmFjdG9yeSlhcHBsaWNhdGlvbi5nZXRFeHByZXNzaW9uRmFjdG9yeSgpOwotCi0gICAgICAgIC8vZXhlY3V0ZSBzdGFydHVwIGxpc3RlbmVyCi0gICAgICAgIG5ldyBFeHRWYWxTdGFydHVwTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyLmluaXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfS5pbml0KCk7Ci0KLSAgICAgICAgbmV3IFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lcigpewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlci5pbml0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0uaW5pdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlYXIgZG93biB0aGUgdGVzdCBlbnZpcm9ubWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGFwcGxpY2F0aW9uID0gbnVsbDsKLSAgICAgICAgY29uZmlnID0gbnVsbDsKLSAgICAgICAgZXh0ZXJuYWxDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgZmFjZXNDb250ZXh0LnJlbGVhc2UoKTsKLSAgICAgICAgZmFjZXNDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgbGlmZWN5Y2xlID0gbnVsbDsKLSAgICAgICAgbGlmZWN5Y2xlRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIHJlbmRlcktpdCA9IG51bGw7Ci0gICAgICAgIHJlcXVlc3QgPSBudWxsOwotICAgICAgICByZXNwb25zZSA9IG51bGw7Ci0gICAgICAgIHNlcnZsZXRDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgc2Vzc2lvbiA9IG51bGw7Ci0gICAgICAgIEZhY3RvcnlGaW5kZXIucmVsZWFzZUZhY3RvcmllcygpOwotICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcih0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIpOwotICAgICAgICBleHByZXNzaW9uRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIHRocmVhZENvbnRleHRDbGFzc0xvYWRlciA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NDcm9zc1ZhbFZhbGlkYXRpb24oKQotICAgIHsKLSAgICAgICAgbmV3IENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIoKS5hZnRlclBoYXNlKG5ldyBQaGFzZUV2ZW50KChGYWNlc0NvbnRleHQpZmFjZXNDb250ZXh0LFBoYXNlSWQuQU5ZX1BIQVNFLGxpZmVjeWNsZSkpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja01lc3NhZ2VDb3VudChpbnQgZXhwZWN0ZWQpCi0gICAgewotICAgICAgICBpbnQgYWN0dWFsID0gMDsKLSAgICAgICAgZm9yKEl0ZXJhdG9yIG1lc3NhZ2VzID0gZmFjZXNDb250ZXh0LmdldE1lc3NhZ2VzKCk7IG1lc3NhZ2VzLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lc3NhZ2VzLm5leHQoKTsKLSAgICAgICAgICAgIGFjdHVhbCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb21wbGV0ZSBtZXNzYWdlIGNvdW50IiwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tNZXNzYWdlQ291bnQoU3RyaW5nIGNsaWVudElkLCBpbnQgZXhwZWN0ZWQpCi0gICAgewotICAgICAgICBpbnQgYWN0dWFsID0gMDsKLSAgICAgICAgZm9yKEl0ZXJhdG9yIG1lc3NhZ2VzID0gZmFjZXNDb250ZXh0LmdldE1lc3NhZ2VzKGNsaWVudElkKTsgbWVzc2FnZXMuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgbWVzc2FnZXMubmV4dCgpOwotICAgICAgICAgICAgYWN0dWFsKys7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbXBsZXRlIG1lc3NhZ2UgY291bnQiLCBleHBlY3RlZCwgYWN0dWFsKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVmVyaWZ5IHRoZSBmb2xsb3dpbmc6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5pZCBpcyBub3QgbnVsbDwvbGk+Ci0gICAgICogPGxpPlJlc3BvbnNlIGlzIGNvbXBsZXRlPC9saT4KLSAgICAgKiA8bGk+UmVzcG9uY2UgY29udGFpbnMgdGhlIGlkPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZCBJRCB0byB2ZXJpZnkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRJZEV4aXN0cyhTdHJpbmcgaWQpCi0gICAgewotICAgICAgICBhc3NlcnROb3ROdWxsKCJJRCBpcyBub3QgbnVsbCIsIGlkKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzcG9uc2UgQ29tcGxldGUiLCBmYWNlc0NvbnRleHQuZ2V0UmVzcG9uc2VDb21wbGV0ZSgpKTsKLSAgICAgICAgU3RyaW5nIG91dHB1dCA9IHdyaXRlci5nZXRXcml0ZXIoKS50b1N0cmluZygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJIYXMgb3V0cHV0Iiwgb3V0cHV0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ29udGFpbnMgaWQgJyIgKyBpZCArICInIiwgb3V0cHV0LmluZGV4T2YoaWQpICE9IC0xKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVWYWx1ZUJpbmRpbmcoVUlJbnB1dCB1aUlucHV0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIGV4cHJlc3Npb24pCi0gICAgewotICAgICAgICBWYWx1ZUJpbmRpbmcgdmFsdWVCaW5kaW5nID0gYXBwbGljYXRpb24uY3JlYXRlVmFsdWVCaW5kaW5nKGV4cHJlc3Npb24pOwotICAgICAgICBWYWx1ZUV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uID0gZXhwcmVzc2lvbkZhY3RvcnkuY3JlYXRlVmFsdWVFeHByZXNzaW9uKAotICAgICAgICAgICAgZmFjZXNDb250ZXh0LmdldEVMQ29udGV4dCgpLCBleHByZXNzaW9uLCBPYmplY3QuY2xhc3MpOwotCi0gICAgICAgIGlmKHVpSW5wdXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdWlJbnB1dC5zZXRWYWx1ZUJpbmRpbmcobmFtZSwgdmFsdWVCaW5kaW5nKTsKLSAgICAgICAgICAgIHVpSW5wdXQuc2V0VmFsdWVFeHByZXNzaW9uKG5hbWUsIHZhbHVlRXhwcmVzc2lvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSZXF1ZXN0U2NvcGVkQmVhbihTdHJpbmcgbmFtZSwgT2JqZWN0IGluc3RhbmNlKQotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKG51bGwsICJ2YWx1ZSIsICIjeyIgKyBuYW1lICsgIn0iKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKS5wdXQobmFtZSwgaW5zdGFuY2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCA8VD4gVCByZXNvbHZlQmVhbihTdHJpbmcgbmFtZSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKG5hbWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9CYXNlVmFsVGVzdEJlYW4uamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZXZhbC9CYXNlVmFsVGVzdEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmODQ3Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2V2YWwvQmFzZVZhbFRlc3RCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNldmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxlbmd0aDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsKLQotLyoqCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlVmFsVGVzdEJlYW4KLXsKLSAgICBAUmVxdWlyZWQKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIAotICAgIEBMZW5ndGgobWluaW11bT0yLG1heGltdW09MykKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lMTsKLSAgICAKLSAgICBAUGF0dGVybigiW0EtWl1bYS16XSsiKQotICAgIHByaXZhdGUgU3RyaW5nIHBhdHRlcm5OYW1lOwotICAgIAotICAgIEBEb3VibGVSYW5nZShtaW5pbXVtPS0zMDBkKQotICAgIHByaXZhdGUgRG91YmxlIGRvdWJsZVZhbHVlMTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUxKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYW1lMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lMShTdHJpbmcgbmFtZTEpCi0gICAgewotICAgICAgICB0aGlzLm5hbWUxID0gbmFtZTE7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gcGF0dGVybk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGF0dGVybk5hbWUoU3RyaW5nIHBhdHRlcm5OYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5wYXR0ZXJuTmFtZSA9IHBhdHRlcm5OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBEb3VibGUgZ2V0RG91YmxlVmFsdWUxKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkb3VibGVWYWx1ZTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RG91YmxlVmFsdWUxKERvdWJsZSBkb3VibGVWYWx1ZTEpCi0gICAgewotICAgICAgICB0aGlzLmRvdWJsZVZhbHVlMSA9IGRvdWJsZVZhbHVlMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2V2YWwvQmFzZVZhbFRlc3RDYXNlLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2V2YWwvQmFzZVZhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjOTZhMjQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNldmFsL0Jhc2VWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2V2YWw7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlVmFsVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZQotewotCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudCA9IG51bGw7Ci0KLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOwotICAgIAotICAgIEJhc2VWYWxUZXN0QmVhbiBiZWFuID0gbnVsbDsKLQotICAgIHB1YmxpYyBCYXNlVmFsVGVzdENhc2UoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBudWxsOwotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsKLSAgICAgICAgYmVhbiA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEJhc2VWYWxUZXN0Q2FzZS5jbGFzcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBiZWFuID0gbmV3IEJhc2VWYWxUZXN0QmVhbigpOwotICAgICAgICBWYWx1ZUJpbmRpbmcgdmIgPSBhcHBsaWNhdGlvbi5jcmVhdGVWYWx1ZUJpbmRpbmcoIiN7dGVzdEJlYW59Iik7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucHV0KCJ0ZXN0QmVhbiIsIGJlYW4pOwotCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOwotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7Ci0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsKLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBuZXcgSHRtbElucHV0VGV4dCgpOwotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50KTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0SWQoImlucHV0MSIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBudWxsOwotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsKLSAgICAgICAgYmVhbiA9IG51bGw7ICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZVJlcXVpcmVkRmFpbCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZX0iKTsKLQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7Ci0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZTFMZW5naHRNYXhGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lMX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiMTIzNDUiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWUxTGVuZ2h0Q29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZTF9Iik7Ci0KLSAgICAgICAgLy9kZWNvZGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOwotCi0gICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lMUxlbmdodE1pbkZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWUxfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCJ4Iik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0dGVybk5hbWVGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wYXR0ZXJuTmFtZX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiUGV0ZXIxIik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0dGVybk5hbWVDb3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wYXR0ZXJuTmFtZX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiUGV0ZXIiKTsKLQotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsKLSAgICB9ICAgIAotCi0gICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVZhbHVlRmFpbCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4uZG91YmxlVmFsdWUxfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCItMzAxIik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7Ci0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVWYWx1ZUNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLmRvdWJsZVZhbHVlMX0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiMjAwIik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGFzc2VydFRydWUoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyMDBkLCBpbnB1dENvbXBvbmVudC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnVwZGF0ZU1vZGVsKGZhY2VzQ29udGV4dCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyMDBkLCBiZWFuLmdldERvdWJsZVZhbHVlMSgpKTsKLSAgICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RCZWFuLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI2YjdjMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOwotCi0vKioKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUKLSAqLwotcHVibGljIGNsYXNzIENyb3NzVmFsVGVzdEJlYW4KLXsKLQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsKLSAgICAKLSAgICBARXF1YWxzKCJwcm9wZXJ0eTEiKSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTEoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKFN0cmluZyBwcm9wZXJ0eTEpCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnR5MSA9IHByb3BlcnR5MTsKLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkyKFN0cmluZyBwcm9wZXJ0eTIpCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdENhc2UuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGU4MDg1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlCi0gKi8KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbFRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2UKLXsKLQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQxID0gbnVsbDsKLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MiA9IG51bGw7Ci0gICAgCi0gICAgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsKLSAgICAKLSAgICBwdWJsaWMgQ3Jvc3NWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBudWxsOwotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOwotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShDcm9zc1ZhbFRlc3RDYXNlLmNsYXNzKTsKLSAgICB9ICAgIAotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBDcm9zc1ZhbFRlc3RCZWFuIGJlYW4gPSBuZXcgQ3Jvc3NWYWxUZXN0QmVhbigpOwotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcobnVsbCwgInZhbHVlIiwgIiN7dGVzdEJlYW59Iik7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucHV0KCJ0ZXN0QmVhbiIsYmVhbik7Ci0gICAgICAgIAotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsKLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOwotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7Ci0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7ICAgICAgICAKLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbmV3IEh0bWxJbnB1dFRleHQoKTsKLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDEpOwotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0SWQoImlucHV0MSIpOwotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBuZXcgSHRtbElucHV0VGV4dCgpOwotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Mik7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRJZCgiaW5wdXQyIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsKLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOwotCi0gICAgICAgIC8vZGVjb2RlCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7Ci0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7Ci0KLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsVmFsaWRhdGlvbigpOwotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsKLQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc0ZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7Ci0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsKLQotICAgICAgICAvL2RlY29kZQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOwotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIjFkNCIpOwotICAgICAgICAKLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7Ci0gICAgICAgIAotCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbFZhbGlkYXRpb24oKTsKLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7Ci0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9FTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9FTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjFmNjc4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvRUxDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnV0aWwuTWV0aG9kVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIEVMQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlIGV4dGVuZHMgRUxDcm9zc1ZhbFRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgRUxDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEVMQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotDQotICAgICAgICBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbigpOw0KLQ0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoRXF1YWxzLmNsYXNzLmdldE5hbWUoKSwgTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHLCBjb25maWcpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCByZXRlc3QgdGhpcyB0ZXN0LWNhc2UNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgcmV0ZXN0IHRoaXMgdGVzdC1jYXNlDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKTsNCi0gICAgICAgIGFzc2VydEZhbHNlKE1ldGhvZFV0aWxzLmlzTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShNZXRob2RVdGlscy5pc01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiKSk7DQotICAgICAgICAvLzF4IGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5IGFuZCAxeCBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsDQotICAgICAgICBhc3NlcnRUcnVlKE1ldGhvZFV0aWxzLmNoZWNrTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIsIDIpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9FTENyb3NzVmFsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdkODk1Mi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuRGF0ZVRpbWVDb252ZXJ0ZXI7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIEVMQ3Jvc3NWYWxUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxWaWV3Q29udHJvbGxlclRlc3RDYXNlDQotew0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0NCi0gICAgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgcHVibGljIEVMQ3Jvc3NWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEVMQ3Jvc3NWYWxUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgY3JlYXRlUmVxdWVzdFNjb3BlZEJlYW4oImJlYW4xIiwgZ2V0RW50aXR5SW5zdGFuY2UoKSk7DQotICAgICAgICBjcmVhdGVSZXF1ZXN0U2NvcGVkQmVhbigiYmVhbjIiLCBnZXRFbnRpdHlJbnN0YW5jZSgpKTsNCi0NCi0NCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOw0KLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOw0KLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOw0KLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsNCi0NCi0gICAgICAgIC8vaW5wdXQxDQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldElkKCJpbnB1dDEiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRDb252ZXJ0ZXIobmV3IERhdGVUaW1lQ29udmVydGVyKCkpOw0KLSAgICAgICAgKChEYXRlVGltZUNvbnZlcnRlcilpbnB1dENvbXBvbmVudDEuZ2V0Q29udmVydGVyKCkpLnNldFBhdHRlcm4oImRkLk1NLnl5eXkiKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQxKTsNCi0NCi0gICAgICAgIC8vaW5wdXQyDQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRDb252ZXJ0ZXIobmV3IERhdGVUaW1lQ29udmVydGVyKCkpOw0KLSAgICAgICAgKChEYXRlVGltZUNvbnZlcnRlcilpbnB1dENvbXBvbmVudDIuZ2V0Q29udmVydGVyKCkpLnNldFBhdHRlcm4oImRkLk1NLnl5eXkiKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQyKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlRUxDcm9zc0NvbXBvbmVudFZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTENyb3NzQ29tcG9uZW50VmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjEyLjEyLjIwMDgiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUVMQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uVXNlQ2FzZShTdHJpbmcgdmFsdWVCZWFuMVByb3BlcnR5MSwgU3RyaW5nIHZhbHVlQmVhbjFQcm9wZXJ0eTIsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkxLCBTdHJpbmcgdmFsdWVCZWFuMlByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7YmVhbjEuZGF0ZTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3tiZWFuMi5kYXRlMn0iKTsNCi0NCi0gICAgICAgIC8vc2V0IG1vZGVsIHZhbHVlcw0KLSAgICAgICAgcmVzb2x2ZUJlYW4oImJlYW4xIiwgZ2V0RW50aXR5SW5zdGFuY2UoKS5nZXRDbGFzcygpKS5zZXREYXRlMigoRGF0ZSlpbnB1dENvbXBvbmVudDEuZ2V0Q29udmVydGVyKCkuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dENvbXBvbmVudDEsIHZhbHVlQmVhbjFQcm9wZXJ0eTIpKTsNCi0gICAgICAgIHJlc29sdmVCZWFuKCJiZWFuMiIsIGdldEVudGl0eUluc3RhbmNlKCkuZ2V0Q2xhc3MoKSkuc2V0RGF0ZTEoKERhdGUpaW5wdXRDb21wb25lbnQyLmdldENvbnZlcnRlcigpLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgaW5wdXRDb21wb25lbnQyLCB2YWx1ZUJlYW4yUHJvcGVydHkxKSk7DQotDQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKHZhbHVlQmVhbjFQcm9wZXJ0eTEpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKHZhbHVlQmVhbjJQcm9wZXJ0eTIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlRUxNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTIuMTIuMjAwOCIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRUxNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uVXNlQ2FzZShTdHJpbmcgdmFsdWVCZWFuMVByb3BlcnR5MSwgU3RyaW5nIHZhbHVlQmVhbjFQcm9wZXJ0eTIsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkxLCBTdHJpbmcgdmFsdWVCZWFuMlByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7YmVhbjEuZGF0ZTF9Iik7DQotDQotICAgICAgICAvL3NldCBtb2RlbCB2YWx1ZXMNCi0gICAgICAgIHJlc29sdmVCZWFuKCJiZWFuMSIsIGdldEVudGl0eUluc3RhbmNlKCkuZ2V0Q2xhc3MoKSkuc2V0RGF0ZTIoKERhdGUpaW5wdXRDb21wb25lbnQxLmdldENvbnZlcnRlcigpLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgaW5wdXRDb21wb25lbnQxLCB2YWx1ZUJlYW4xUHJvcGVydHkyKSk7DQotICAgICAgICByZXNvbHZlQmVhbigiYmVhbjIiLCBnZXRFbnRpdHlJbnN0YW5jZSgpLmdldENsYXNzKCkpLnNldERhdGUxKChEYXRlKWlucHV0Q29tcG9uZW50Mi5nZXRDb252ZXJ0ZXIoKS5nZXRBc09iamVjdChmYWNlc0NvbnRleHQsIGlucHV0Q29tcG9uZW50MiwgdmFsdWVCZWFuMlByb3BlcnR5MSkpOw0KLSAgICAgICAgcmVzb2x2ZUJlYW4oImJlYW4yIiwgZ2V0RW50aXR5SW5zdGFuY2UoKS5nZXRDbGFzcygpKS5zZXREYXRlMigoRGF0ZSlpbnB1dENvbXBvbmVudDIuZ2V0Q29udmVydGVyKCkuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dENvbXBvbmVudDIsIHZhbHVlQmVhbjJQcm9wZXJ0eTIpKTsNCi0NCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVCZWFuMVByb3BlcnR5MSk7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBFTENyb3NzVmFsVGVzdERhdGVCZWFuIGdldEVudGl0eUluc3RhbmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBFTENyb3NzVmFsVGVzdERhdGVCZWFuKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9FTENyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE1ZjQ0Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFTENyb3NzVmFsVGVzdERhdGVCZWFuDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlIERFRkFVTFRfREFURSA9IG5ldyBEYXRlKCk7DQotDQotICAgIEBFcXVhbHMoIiN7YmVhbjIuZGF0ZTJ9IikNCi0gICAgcHJpdmF0ZSBEYXRlIGRhdGUxID0gREVGQVVMVF9EQVRFOw0KLQ0KLSAgICBwcml2YXRlIERhdGUgZGF0ZTIgPSBERUZBVUxUX0RBVEU7DQotDQotICAgIHB1YmxpYyBEYXRlIGdldERhdGUxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRhdGUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERhdGUxKERhdGUgZGF0ZTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGF0ZTEgPSBkYXRlMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlMigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkYXRlMjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlMihEYXRlIGRhdGUyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRhdGUyID0gZGF0ZTI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwNjVkOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnV0aWwuTWV0aG9kVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIExvY2FsUHJvcGVydHlDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UgZXh0ZW5kcyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTG9jYWxQcm9wZXJ0eUNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLQ0KLSAgICAgICAgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24oKTsNCi0NCi0gICAgICAgIGNvbmZpZy5hZGRNYXBwaW5nKEVxdWFscy5jbGFzcy5nZXROYW1lKCksIE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRywgY29uZmlnKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHJldGVzdCB0aGlzIHRlc3QtY2FzZQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCByZXRlc3QgdGhpcyB0ZXN0LWNhc2UNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKTsNCi0gICAgICAgIGFzc2VydEZhbHNlKE1ldGhvZFV0aWxzLmlzTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKTsNCi0gICAgICAgIGFzc2VydFRydWUoTWV0aG9kVXRpbHMuaXNNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIikpOw0KLSAgICAgICAgLy8xeCBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeSBhbmQgMXggZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShNZXRob2RVdGlscy5jaGVja01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiLCAyKSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmYxM2FiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UgZXh0ZW5kcyBFTENyb3NzVmFsVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKExvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgRUxDcm9zc1ZhbFRlc3REYXRlQmVhbiBnZXRFbnRpdHlJbnN0YW5jZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdERhdGVCZWFuKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYTg5MDkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4gZXh0ZW5kcyBFTENyb3NzVmFsVGVzdERhdGVCZWFuDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlIERFRkFVTFRfREFURSA9IG5ldyBEYXRlKCk7DQotDQotICAgIEBFcXVhbHMoImRhdGUyIikNCi0gICAgcHJpdmF0ZSBEYXRlIGRhdGUxID0gREVGQVVMVF9EQVRFOw0KLQ0KLSAgICBwcml2YXRlIERhdGUgZGF0ZTIgPSBERUZBVUxUX0RBVEU7DQotDQotICAgIHB1YmxpYyBEYXRlIGdldERhdGUxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRhdGUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERhdGUxKERhdGUgZGF0ZTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGF0ZTEgPSBkYXRlMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlMigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkYXRlMjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlMihEYXRlIGRhdGUyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRhdGUyID0gZGF0ZTI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Nb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL01vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFmOTMzNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL01vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuRXF1YWxzU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnV0aWwuTWV0aG9kVXRpbHM7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBFcXVhbHNTdHJhdGVneQ0KLXsNCi0gICAgcHVibGljIE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICBNZXRob2RVdGlscy5zaWduYWxDbGFzc1VzZWQoZ2V0Q2xhc3MoKSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBNZXRob2RVdGlscy5zaWduYWxNZXRob2RDYWxsZWQoZ2V0Q2xhc3MoKSwgInJldmVyc2VNZXNzYWdlIik7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIE1ldGhvZFV0aWxzLnNpZ25hbE1ldGhvZENhbGxlZChnZXRDbGFzcygpLCAicmV2ZXJzZU1lc3NhZ2UiKTsNCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24pOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQxZjBmYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL01vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkgZXh0ZW5kcyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgY3JlYXRlKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgLy9mb3JjZSBpbml0IHNvIHRoYXQgZXZlcnkgdGVzdC1jYXNlIHNldHVwIG1ldGhvZCBjYW4gYWRkIGEgbW9jayB2YWxpZGF0aW9uIHN0cmF0ZWd5IHZpYSBleHR2YWwgamF2YS1hcGkNCi0gICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCh0aGlzLFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZChnZXRDbGFzcygpLCAiaW5pdFN0YXRpY01hcHBpbmdzIikpOw0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZShtZXRhRGF0YUtleSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5M2I0Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnV0aWwuTWV0aG9kVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UgZXh0ZW5kcyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUHJvcGVydHlDaGFpbkNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0NCi0gICAgICAgIFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uKCk7DQotDQotICAgICAgICBjb25maWcuYWRkTWFwcGluZyhFcXVhbHMuY2xhc3MuZ2V0TmFtZSgpLCBNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsIGNvbmZpZyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHJldGVzdCB0aGlzIHRlc3QtY2FzZQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCByZXRlc3QgdGhpcyB0ZXN0LWNhc2UNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpOw0KLSAgICAgICAgYXNzZXJ0RmFsc2UoTWV0aG9kVXRpbHMuaXNNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIikpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCk7DQotICAgICAgICBhc3NlcnRUcnVlKE1ldGhvZFV0aWxzLmlzTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIpKTsNCi0gICAgICAgIC8vMXggZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkgYW5kIDF4IGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwNCi0gICAgICAgIGFzc2VydFRydWUoTWV0aG9kVXRpbHMuY2hlY2tNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIiwgMikpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIxNmRjZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5BYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkRhdGVUaW1lQ29udmVydGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZQ0KLXsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotDQotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgICAgICBjcmVhdGVSZXF1ZXN0U2NvcGVkQmVhbigiYmVhbjEiLCBnZXRFbnRpdHlJbnN0YW5jZSgpKTsNCi0NCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOw0KLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOw0KLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOw0KLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsNCi0NCi0gICAgICAgIC8vaW5wdXQxDQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldElkKCJpbnB1dDEiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRDb252ZXJ0ZXIobmV3IERhdGVUaW1lQ29udmVydGVyKCkpOw0KLSAgICAgICAgKChEYXRlVGltZUNvbnZlcnRlcilpbnB1dENvbXBvbmVudDEuZ2V0Q29udmVydGVyKCkpLnNldFBhdHRlcm4oImRkLk1NLnl5eXkiKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQxKTsNCi0NCi0gICAgICAgIC8vaW5wdXQyDQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRDb252ZXJ0ZXIobmV3IERhdGVUaW1lQ29udmVydGVyKCkpOw0KLSAgICAgICAgKChEYXRlVGltZUNvbnZlcnRlcilpbnB1dENvbXBvbmVudDIuZ2V0Q29udmVydGVyKCkpLnNldFBhdHRlcm4oImRkLk1NLnl5eXkiKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQyKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlUHJvcGVydHlDaGFpbkNyb3NzQ29tcG9uZW50VmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlUHJvcGVydHlDaGFpbkNyb3NzQ29tcG9uZW50VmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTIuMTIuMjAwOCIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUHJvcGVydHlDaGFpbkNyb3NzQ29tcG9uZW50VmFsaWRhdGlvblVzZUNhc2UoU3RyaW5nIHZhbHVlQmVhbjFQcm9wZXJ0eTEsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3tiZWFuMS5kYXRlMX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje2JlYW4xLnN1YkJlYW4uZGF0ZTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKHZhbHVlQmVhbjFQcm9wZXJ0eTEpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKHZhbHVlQmVhbjJQcm9wZXJ0eTIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjEyLjEyLjIwMDgiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUVMTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvblVzZUNhc2UoU3RyaW5nIHZhbHVlQmVhbjFQcm9wZXJ0eTEsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkxKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3tiZWFuMS5kYXRlMX0iKTsNCi0NCi0gICAgICAgIC8vc2V0IG1vZGVsIHZhbHVlcw0KLSAgICAgICAgcmVzb2x2ZUJlYW4oImJlYW4xIiwgZ2V0RW50aXR5SW5zdGFuY2UoKS5nZXRDbGFzcygpKS5nZXRTdWJCZWFuKCkuc2V0RGF0ZTIoKERhdGUpaW5wdXRDb21wb25lbnQyLmdldENvbnZlcnRlcigpLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgaW5wdXRDb21wb25lbnQyLCB2YWx1ZUJlYW4yUHJvcGVydHkxKSk7DQotDQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKHZhbHVlQmVhbjFQcm9wZXJ0eTEpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVCZWFuIGdldEVudGl0eUluc3RhbmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4oKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMyMWYyNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZSBERUZBVUxUX0RBVEUgPSBuZXcgRGF0ZSgpOw0KLQ0KLSAgICBARXF1YWxzKCJzdWJCZWFuLmRhdGUyIikNCi0gICAgcHJpdmF0ZSBEYXRlIGRhdGUxID0gREVGQVVMVF9EQVRFOw0KLQ0KLSAgICBwcml2YXRlIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbiBzdWJCZWFuID0gbmV3IFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbigpOw0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlMSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkYXRlMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlMShEYXRlIGRhdGUxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRhdGUxID0gZGF0ZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbiBnZXRTdWJCZWFuKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1YkJlYW47DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0U3ViQmVhbihQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4gc3ViQmVhbikNCi0gICAgew0KLSAgICAgICAgdGhpcy5zdWJCZWFuID0gc3ViQmVhbjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbi5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4NTNmYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4NCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERhdGUgREVGQVVMVF9EQVRFID0gbmV3IERhdGUoKTsNCi0NCi0gICAgcHJpdmF0ZSBEYXRlIGRhdGUyID0gREVGQVVMVF9EQVRFOw0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlMigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkYXRlMjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlMihEYXRlIGRhdGUyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRhdGUyID0gZGF0ZTI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvblRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0M2Y1Y2QuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuQWJzdHJhY3RFeFZhbFZpZXdDb250cm9sbGVyVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsVmlld0NvbnRyb2xsZXJUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb25UZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVmFsdWVCaW5kaW5nRXhwcmVzc2lvblRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZWFyRG93bigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFyZFN5bnRheCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjEucHJvcGVydHkxfSIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMS5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLCAicHJvcGVydHkxIik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjFbJ3Byb3BlcnR5MSddfSIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMVsncHJvcGVydHkxJ119Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLCAicHJvcGVydHkxIik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjFbJ2JlYW4yJ10ucHJvcGVydHkxfSIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMVsnYmVhbjInXS5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjFbJ2JlYW4yJ119Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCksICJwcm9wZXJ0eTEiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhbmRhcmRTeW50YXhSZXBsYWNlUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xLnByb3BlcnR5MX0iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2VQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAicHJvcGVydHkyIik7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCksICJwcm9wZXJ0eTIiKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsncHJvcGVydHkxJ119Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgInByb3BlcnR5MiIpOw0KLQ0KLSAgICAgICAgLy9UT0RPIHJlc3RvcmUgb3JpZ2luYWwgc3ludGF4DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCksICJwcm9wZXJ0eTIiKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsnYmVhbjInXS5wcm9wZXJ0eTF9Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgInByb3BlcnR5MiIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMVsnYmVhbjInXS5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjFbJ2JlYW4yJ119Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCksICJwcm9wZXJ0eTIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhbmRhcmRTeW50YXhBZGRQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjEuYmVhbjJ9Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5hZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAicHJvcGVydHkxIik7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xLmJlYW4yLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMS5iZWFuMn0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCksICJwcm9wZXJ0eTEiKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsnYmVhbjInXX0iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sICJwcm9wZXJ0eTEiKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjFbJ2JlYW4yJ10ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2JlYW4xWydiZWFuMiddfSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSwgInByb3BlcnR5MSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydiZWFuMiddLmJlYW4zfSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24uYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgInByb3BlcnR5MSIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpLCAiI3tiZWFuMVsnYmVhbjInXS5iZWFuMy5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjFbJ2JlYW4yJ10uYmVhbjN9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbg0KLSAgICAgICAgICAgICAgICAuZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjFbJ2JlYW4yJ119Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLCAicHJvcGVydHkxIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhY2VsZXRzQ3VzdG9tQ29tcG9uZW50U3ludGF4KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tlbnRpdHlbZmllbGROYW1lXX0iKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7ZW50aXR5W2ZpZWxkTmFtZV19Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7ZW50aXR5fSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSwgImZpZWxkTmFtZSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWNlbGV0c0N1c3RvbUNvbXBvbmVudFN5bnRheFJlcGxhY2VQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7ZW50aXR5W2ZpZWxkTmFtZV19Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgIm5ld0ZpZWxkTmFtZSIpOw0KLQ0KLSAgICAgICAgLy9UT0RPIHJlc3RvcmUgb3JpZ2luYWwgc3ludGF4DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksICIje2VudGl0eS5uZXdGaWVsZE5hbWV9Iik7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7ZW50aXR5fSIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSwgIm5ld0ZpZWxkTmFtZSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wbGV4TWFwU3ludGF4KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24NCi0gICAgICAgICAgICAgICAgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVtiZWFuMltiZWFuM1sna2V5MSddXV0ucHJvcGVydHkxfSIpOw0KLQ0KLSAgICAgICAgLy9UT0RPDQotICAgICAgICAvL2Fzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgIiN7YmVhbjFbYmVhbjJbYmVhbjNbJ2tleTEnXV1dLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCksICJwcm9wZXJ0eTEiKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uLmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1Y2JjZDAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9tb2NrL0V4dFZhbE1vY2tBcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QubW9jazsKLQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbjsKLQotaW1wb3J0IGphdmF4LmVsLkVMQ29udGV4dExpc3RlbmVyOwotaW1wb3J0IGphdmF4LmVsLkVMUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXguZWwuRXhwcmVzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguZWwuRUxFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRWYWxNb2NrQXBwbGljYXRpb24gZXh0ZW5kcyBNb2NrQXBwbGljYXRpb24KLXsKLSAgICBwcml2YXRlIEFwcGxpY2F0aW9uIHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsTW9ja0FwcGxpY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEV4dFZhbE1vY2tBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IGFwcGxpY2F0aW9uOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFTENvbnRleHRMaXN0ZW5lcltdIGdldEVMQ29udGV4dExpc3RlbmVycygpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEVMQ29udGV4dExpc3RlbmVyWzBdOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFTFJlc29sdmVyIGdldEVMUmVzb2x2ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZC5nZXRFTFJlc29sdmVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEV4cHJlc3Npb25GYWN0b3J5IGdldEV4cHJlc3Npb25GYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRXh0VmFsTW9ja0V4cHJlc3Npb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBldmFsdWF0ZUV4cHJlc3Npb25HZXQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIGV4cHJlc3Npb24sIENsYXNzIGFDbGFzcykgdGhyb3dzIEVMRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5ldmFsdWF0ZUV4cHJlc3Npb25HZXQoZmFjZXNDb250ZXh0LCBleHByZXNzaW9uLCBhQ2xhc3MpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvbW9jay9FeHRWYWxNb2NrQXBwbGljYXRpb25GYWN0b3J5LmphdmEgYi9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzhjNTc2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvbW9jay9FeHRWYWxNb2NrQXBwbGljYXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5tb2NrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0FwcGxpY2F0aW9uRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICovCi1wdWJsaWMgY2xhc3MgRXh0VmFsTW9ja0FwcGxpY2F0aW9uRmFjdG9yeSBleHRlbmRzIE1vY2tBcHBsaWNhdGlvbkZhY3RvcnkKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxNb2NrQXBwbGljYXRpb24oc3VwZXIuZ2V0QXBwbGljYXRpb24oKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9tb2NrL0V4dFZhbE1vY2tFeHByZXNzaW9uRmFjdG9yeS5qYXZhIGIvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9tb2NrL0V4dFZhbE1vY2tFeHByZXNzaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTllMjMzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvbW9jay9FeHRWYWxNb2NrRXhwcmVzc2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0Lm1vY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QuZWwuTW9ja0V4cHJlc3Npb25GYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0OwotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqLwotcHVibGljIGNsYXNzIEV4dFZhbE1vY2tFeHByZXNzaW9uRmFjdG9yeSBleHRlbmRzIE1vY2tFeHByZXNzaW9uRmFjdG9yeQotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWYWx1ZUV4cHJlc3Npb24gY3JlYXRlVmFsdWVFeHByZXNzaW9uKEVMQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgZXhwcmVzc2lvbiwgQ2xhc3MgZXhwZWN0ZWRUeXBlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uKGV4cHJlc3Npb24sIGV4cGVjdGVkVHlwZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9tb2NrL0V4dFZhbE1vY2tWYWx1ZUV4cHJlc3Npb24uamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvbW9jay9FeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiY2MwOGEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZS8xXzJfMl9wcmVwYXJlX3JjX2Jhc2UvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9tb2NrL0V4dFZhbE1vY2tWYWx1ZUV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5tb2NrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRXh0VmFsRUxSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QuZWwuTW9ja1ZhbHVlRXhwcmVzc2lvbjsKLQotaW1wb3J0IGphdmF4LmVsLkVMQ29udGV4dDsKLWltcG9ydCBqYXZheC5lbC5FTFJlc29sdmVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICovCi0vL1RPRE8gaW1wcm92ZQotcHVibGljIGNsYXNzIEV4dFZhbE1vY2tWYWx1ZUV4cHJlc3Npb24gZXh0ZW5kcyBNb2NrVmFsdWVFeHByZXNzaW9uCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBlbGVtZW50cyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZXhwcmVzc2lvbiA9IG51bGw7Ci0KLSAgICBwdWJsaWMgRXh0VmFsTW9ja1ZhbHVlRXhwcmVzc2lvbihTdHJpbmcgZXhwcmVzc2lvbiwgQ2xhc3MgZXhwZWN0ZWRUeXBlKQotICAgIHsKLSAgICAgICAgc3VwZXIoZXhwcmVzc2lvbiwgZXhwZWN0ZWRUeXBlKTsKLQotICAgICAgICBpZiAoZXhwcmVzc2lvbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkV4cHJlc3Npb24gc3RyaW5nIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOwotICAgICAgICBwYXJzZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoRUxDb250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBFTFJlc29sdmVyIHJlc29sdmVyID0gY29udGV4dC5nZXRFTFJlc29sdmVyKCk7Ci0KLSAgICAgICAgaWYgKHJlc29sdmVyIGluc3RhbmNlb2YgRXh0VmFsRUxSZXNvbHZlcikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldEJhc2UoY29udGV4dCwgcmVzb2x2ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFZhbHVlKGNvbnRleHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKEVMQ29udGV4dCBjb250ZXh0LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBpZiAoY29udGV4dC5nZXRFTFJlc29sdmVyKCkgaW5zdGFuY2VvZiBFeHRWYWxFTFJlc29sdmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb250ZXh0LmdldEVMUmVzb2x2ZXIoKS5zZXRWYWx1ZShjb250ZXh0LCBnZXRWYWx1ZShjb250ZXh0KSwgZWxlbWVudHNbZWxlbWVudHMubGVuZ3RoIC0gMV0sIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IGJhc2UgPSBnZXRCYXNlKGNvbnRleHQsIGNvbnRleHQuZ2V0RUxSZXNvbHZlcigpKTsKLSAgICAgICAgICAgIFN0cmluZyBzZXR0ZXIgPSAic2V0IiArIGNyZWF0ZVByb3BlcnR5U3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1ldGhvZCBzZXR0ZXJNZXRob2QgPSBiYXNlLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2Qoc2V0dGVyLCB2YWx1ZSAhPSBudWxsID8gdmFsdWUuZ2V0Q2xhc3MoKSA6IE9iamVjdC5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgc2V0dGVyTWV0aG9kLmludm9rZShiYXNlLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENsYXNzIGdldFR5cGUoRUxDb250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBiYXNlID0gZ2V0QmFzZShjb250ZXh0LCBjb250ZXh0LmdldEVMUmVzb2x2ZXIoKSk7Ci0KLSAgICAgICAgaWYgKGJhc2UgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgZ2V0dGVyID0gImdldCIgKyBjcmVhdGVQcm9wZXJ0eVN0cmluZygpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNZXRob2QgZ2V0dGVyTWV0aG9kID0gYmFzZS5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKGdldHRlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldHRlck1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlKCkKLSAgICB7Ci0KLSAgICAgICAgaWYgKGlzTGl0ZXJhbFRleHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZWxlbWVudHMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4cHJlc3Npb24uc3RhcnRzV2l0aCgiJHsiKSB8fCBleHByZXNzaW9uLnN0YXJ0c1dpdGgoIiN7IikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChleHByZXNzaW9uLmVuZHNXaXRoKCJ9IikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgZXhwciA9IG5ldyBTdHJpbmdCdWZmZXIoZXhwcmVzc2lvbi5zdWJzdHJpbmcoMiwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpLnJlcGxhY2VBbGwoIiAiLCAiIikpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNCbG9ja09uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGV4cHIubGVuZ3RoKCkgLSAxOyBpID4gLTE7IGktLSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChleHByLmNoYXJBdChpKSA9PSAnICcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZGVsZXRlQ2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4cHIuY2hhckF0KGkpID09ICddJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhwci5kZWxldGVDaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhwci5jaGFyQXQoaSkgPT0gJ1snKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHByLmRlbGV0ZUNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHByLmNoYXJBdChpKSA9PSAnXCcnKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQmxvY2tPbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLmRlbGV0ZUNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcy5hZGQoMCwgZXhwci5zdWJzdHJpbmcoaSArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLmRlbGV0ZShpLCBleHByLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlzQmxvY2tPbiA9ICFpc0Jsb2NrT247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhwci5jaGFyQXQoaSkgPT0gJy4nICYmICFpc0Jsb2NrT24pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZCgwLCBleHByLnN1YnN0cmluZyhpICsgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXhwci5kZWxldGUoaSwgZXhwci5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGV4cHIubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXMuYWRkKDAsIGV4cHIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZWxlbWVudHMgPSAoU3RyaW5nW10pIG5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tuYW1lcy5zaXplKCldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV4cHJlc3Npb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihleHByZXNzaW9uKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRCYXNlKEVMQ29udGV4dCBjb250ZXh0LCBFTFJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgT2JqZWN0IGJhc2UgPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aCAtIDE7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgYmFzZSA9IHJlc29sdmVyLmdldFZhbHVlKGNvbnRleHQsIGJhc2UsIGVsZW1lbnRzW2ldKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmFzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVQcm9wZXJ0eVN0cmluZygpCi0gICAgewotICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBlbGVtZW50c1tlbGVtZW50cy5sZW5ndGggLSAxXTsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEsIHByb3BlcnR5Lmxlbmd0aCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3V0aWwvTWV0aG9kVXRpbHMuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdXRpbC9NZXRob2RVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDY5ZmM3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdXRpbC9NZXRob2RVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QudXRpbDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotLy9UT0RPDQotcHVibGljIGNsYXNzIE1ldGhvZFV0aWxzDQotew0KLSAgICBwcml2YXRlIE1ldGhvZFV0aWxzKCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja01ldGhvZENhbGxlZChDbGFzcyB1c2VkQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBpbnQgY2FsbENvdW50KQ0KLSAgICB7DQotICAgICAgICBjaGVja1JlcXVpcmVkQ2xhc3ModXNlZENsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiBjYWxsQ291bnQgPT0gZ2V0TWV0aG9kQ2FsbENvdW50KHVzZWRDbGFzcywgbWV0aG9kTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWV0aG9kQ2FsbGVkKENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpDQotICAgIHsNCi0gICAgICAgIGNoZWNrUmVxdWlyZWRDbGFzcyh1c2VkQ2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkNCi0gICAgICAgICAgICAgICAgLmNvbnRhaW5zS2V5KHVzZWRDbGFzcy5nZXROYW1lKCkgKyAiIyIgKyBtZXRob2ROYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2lnbmFsTWV0aG9kQ2FsbGVkKENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIGludCBtZXRob2RDYWxsQ291bnQgPSAwOw0KLSAgICAgICAgU3RyaW5nIGtleSA9IHVzZWRDbGFzcy5nZXROYW1lKCkgKyAiIyIgKyBtZXRob2ROYW1lOw0KLQ0KLSAgICAgICAgaWYocmVxdWVzdE1hcC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGhvZENhbGxDb3VudCA9IChJbnRlZ2VyKXJlcXVlc3RNYXAuZ2V0KGtleSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXF1ZXN0TWFwLnB1dChrZXksICsrbWV0aG9kQ2FsbENvdW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TWV0aG9kQ2FsbENvdW50KENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIFN0cmluZyBrZXkgPSB1c2VkQ2xhc3MuZ2V0TmFtZSgpICsgIiMiICsgbWV0aG9kTmFtZTsNCi0NCi0gICAgICAgIGlmKHJlcXVlc3RNYXAuY29udGFpbnNLZXkoa2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKEludGVnZXIpcmVxdWVzdE1hcC5nZXQoa2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaWduYWxDbGFzc1VzZWQoQ2xhc3MgbW9ja0NsYXNzKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgICAgIC5wdXQobW9ja0NsYXNzLmdldE5hbWUoKSArICI6dXNlZCIsIHRydWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NsYXNzVXNlZChDbGFzcyBtb2NrQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgICAgIC5jb250YWluc0tleShtb2NrQ2xhc3MuZ2V0TmFtZSgpICsgIjp1c2VkIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1JlcXVpcmVkQ2xhc3MoQ2xhc3MgdXNlZENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzQ2xhc3NVc2VkKHVzZWRDbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbih1c2VkQ2xhc3MuZ2V0TmFtZSgpICsgIiBub3QgdXNlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdXRpbC9UZXN0VXRpbHMuamF2YSBiL3ByZXBhcmUvMV8yXzJfcHJlcGFyZV9yY19iYXNlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdXRpbC9UZXN0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlZDE2MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlLzFfMl8yX3ByZXBhcmVfcmNfYmFzZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3V0aWwvVGVzdFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWNlc0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGZpbmFsIGNsYXNzIFRlc3RVdGlscwotewotICAgIC8qKiBEZWZhdWx0IExvZ2dlciAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUZXN0VXRpbHMuY2xhc3MpOwotCi0gICAgLyoqIHV0aWxpdHkgY2xhc3MsIGRvIG5vdCBpbnN0YW50aWF0ZSAqLwotICAgIHByaXZhdGUgVGVzdFV0aWxzKCkKLSAgICB7Ci0gICAgICAgIC8vIHV0aWxpdHkgY2xhc3MsIGRpc2FibGUgaW5zdGFudGlhdGlvbgotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRGVmYXVsdFZhbGlkYXRvcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIGFkZFZhbGlkYXRvcihmYWNlc0NvbnRleHQsImphdmF4LmZhY2VzLkRvdWJsZVJhbmdlIiwgImphdmF4LmZhY2VzLnZhbGlkYXRvci5Eb3VibGVSYW5nZVZhbGlkYXRvciIpOwotICAgICAgICBhZGRWYWxpZGF0b3IoZmFjZXNDb250ZXh0LCJqYXZheC5mYWNlcy5MZW5ndGgiLCAiamF2YXguZmFjZXMudmFsaWRhdG9yLkxlbmd0aFZhbGlkYXRvciIpOwotICAgICAgICBhZGRWYWxpZGF0b3IoZmFjZXNDb250ZXh0LCJqYXZheC5mYWNlcy5Mb25nUmFuZ2UiLCAiamF2YXguZmFjZXMudmFsaWRhdG9yLkxvbmdSYW5nZVZhbGlkYXRvciIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkVmFsaWRhdG9yKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdG9ySWQsIFN0cmluZyB2YWxpZGF0b3JDbGFzcykKLSAgICB7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmFkZFZhbGlkYXRvcih2YWxpZGF0b3JJZCwgdmFsaWRhdG9yQ2xhc3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhbGwgb2YgSlNGIDEuMiBkZWZhdWx0IHJlbmRlcmVycy4gIEN1cnJlbnRseSB0aGlzIGlzIG5vdCB0aWVkIHRvIAotICAgICAqIGZhY2VzLWNvbmZpZy54bWwsIHNvIGFsbCBjaGFuZ2UgdG8gdGhlIGZpbGUgTVVTVCBhbHNvIGJlIG1hZGUgaGVyZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0Ci0gICAgICogQHRvZG8gRG8gbm90IGFkZCByZW5kZXJlciBpZiByZW5kZXJlciBpcyBhbHJlYWR5IGFkZGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGREZWZhdWx0UmVuZGVyZXJzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpCi0gICAgewotICAgICAgICAvLyBTdGFuZGFyZCBIVE1MIFJlbmRlcmVycwotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5Db21tYW5kIiwgImphdmF4LmZhY2VzLkJ1dHRvbiIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sQnV0dG9uUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RCb29sZWFuIiwKLSAgICAgICAgICAgICAgICAiamF2YXguZmFjZXMuQ2hlY2tib3giLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbENoZWNrYm94UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RNYW55IiwKLSAgICAgICAgICAgICAgICAiamF2YXguZmFjZXMuQ2hlY2tib3giLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbENoZWNrYm94UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5Gb3JtIiwgImphdmF4LmZhY2VzLkZvcm0iLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEZvcm1SZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlBhbmVsIiwgImphdmF4LmZhY2VzLkdyaWQiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEdyaWRSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlBhbmVsIiwgImphdmF4LmZhY2VzLkdyb3VwIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxHcm91cFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuSW5wdXQiLCAiamF2YXguZmFjZXMuSGlkZGVuIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxIaWRkZW5SZW5kZXJlciIpOwotICAgICAgICAKLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuR3JhcGhpYyIsICJqYXZheC5mYWNlcy5JbWFnZSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sSW1hZ2VSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5MYWJlbCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGFiZWxSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5MaW5rIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMaW5rUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5Db21tYW5kIiwgImphdmF4LmZhY2VzLkxpbmsiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbExpbmtSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkxpc3Rib3giLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbExpc3Rib3hSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE1hbnkiLAotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5MaXN0Ym94IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMaXN0Ym94UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RPbmUiLCAiamF2YXguZmFjZXMuTWVudSIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTWVudVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0TWFueSIsICJqYXZheC5mYWNlcy5NZW51IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxNZW51UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5NZXNzYWdlIiwgImphdmF4LmZhY2VzLk1lc3NhZ2UiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lc3NhZ2VSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5Gb3JtYXQiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEZvcm1hdFJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuTWVzc2FnZXMiLAotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5NZXNzYWdlcyIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTWVzc2FnZXNSZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsICJqYXZheC5mYWNlcy5SYWRpbyIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sUmFkaW9SZW5kZXJlciIpOwotCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLklucHV0IiwgImphdmF4LmZhY2VzLlNlY3JldCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sU2VjcmV0UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5EYXRhIiwgImphdmF4LmZhY2VzLlRhYmxlIiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxUYWJsZVJlbmRlcmVyIik7Ci0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuSW5wdXQiLCAiamF2YXguZmFjZXMuVGV4dGFyZWEiLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFRleHRhcmVhUmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5UZXh0IiwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxUZXh0UmVuZGVyZXIiKTsKLQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5PdXRwdXQiLCAiamF2YXguZmFjZXMuVGV4dCIsCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGV4dFJlbmRlcmVyIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgcmVuZGVyZXIgdG8gdGhlIEZhY2VzQ29udGV4dC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IEZhY2VzIENvbnRleHQKLSAgICAgKiBAcGFyYW0gZmFtaWx5IENvbXBvbmVuZXQgRmFtaWx5Ci0gICAgICogQHBhcmFtIHJlbmRlcmVyVHlwZSBDb21wb25lbnQgVHlwZQotICAgICAqIEBwYXJhbSByZW5kZXJDbGFzc05hbWUgQ2xhc3MgTmFtZSBvZiBSZW5kZXJlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRSZW5kZXJlcihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgZmFtaWx5LAotICAgICAgICAgICAgU3RyaW5nIHJlbmRlcmVyVHlwZSwgU3RyaW5nIHJlbmRlckNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyIHJlbmRlcmVyID0gKGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcikgbmV3SW5zdGFuY2UocmVuZGVyQ2xhc3NOYW1lKTsKLSAgICAgICAgUmVuZGVyS2l0IGtpdCA9IGZhY2VzQ29udGV4dC5nZXRSZW5kZXJLaXQoKTsKLSAgICAgICAga2l0LmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCByZW5kZXJlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJpZXMgYSBDbGFzcy5sb2FkQ2xhc3Mgd2l0aCB0aGUgY29udGV4dCBjbGFzcyBsb2FkZXIgb2YgdGhlIGN1cnJlbnQgdGhyZWFkIGZpcnN0IGFuZAotICAgICAqIGF1dG9tYXRpY2FsbHkgZmFsbHMgYmFjayB0byB0aGUgQ2xhc3NVdGlscyBjbGFzcyBsb2FkZXIgKGkuZS4gdGhlIGxvYWRlciBvZiB0aGUKLSAgICAgKiBteWZhY2VzLmphciBsaWIpIGlmIG5lY2Vzc2FyeS4KLSAgICAgKiAKLSAgICAgKiBOb3RlOiBUaGlzIHdhcyBjb3BpZWQgZnJvbSBvcmcuYXBhY2hlLm15ZmFjZXMuc2hhcmVkLnV0aWwuQ2xhc3NVdGlscwotICAgICAqCi0gICAgICogQHBhcmFtIHR5cGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBub24tcHJpbWl0aXZlIG5vbi1hcnJheSBjbGFzcwotICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgQ2xhc3MKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHR5cGUgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGNsYXNzRm9yTmFtZShTdHJpbmcgdHlwZSkKLSAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAodHlwZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0eXBlIik7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUcnkgV2ViQXBwIENsYXNzTG9hZGVyIGZpcnN0Ci0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZSh0eXBlLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwCi0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlnbm9yZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZmFsbGJhY2s6IFRyeSBDbGFzc0xvYWRlciBmb3IgQ2xhc3NVdGlscyAoaS5lLiB0aGUgbXlmYWNlcy5qYXIgbGliKQotICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUodHlwZSwgZmFsc2UsIC8vIGRvIG5vdCBpbml0aWFsaXplIGZvciBmYXN0ZXIgc3RhcnR1cAotICAgICAgICAgICAgICAgICAgICBUZXN0VXRpbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYW1lIGFzIHtAbGluayAjY2xhc3NGb3JOYW1lKFN0cmluZyl9LCBidXQgdGhyb3dzIGEgUnVudGltZUV4Y2VwdGlvbgotICAgICAqIChGYWNlc0V4Y2VwdGlvbikgaW5zdGVhZCBvZiBhIENsYXNzTm90Rm91bmRFeGNlcHRpb24uCi0gICAgICoKLSAgICAgKiBOb3RlOiBUaGlzIHdhcyBjb3BpZWQgZnJvbSBvcmcuYXBhY2hlLm15ZmFjZXMuc2hhcmVkLnV0aWwuQ2xhc3NVdGlscwotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBDbGFzcwotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdHlwZSBpcyBudWxsCi0gICAgICogQHRocm93cyBGYWNlc0V4Y2VwdGlvbiBpZiBjbGFzcyBub3QgZm91bmQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBzaW1wbGVDbGFzc0Zvck5hbWUoU3RyaW5nIHR5cGUpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNsYXNzRm9yTmFtZSh0eXBlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIkNsYXNzICIgKyB0eXBlICsgIiBub3QgZm91bmQiLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBGYWNlc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3Mgd2l0aCB0aGUgdHlwZSBvZiA8Y29kZT50eXBlPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBOb3RlOiBUaGlzIHdhcyBjb3BpZWQgZnJvbSBvcmcuYXBhY2hlLm15ZmFjZXMuc2hhcmVkLnV0aWwuQ2xhc3NVdGlscwotICAgICAqCi0gICAgICogQHBhcmFtIHR5cGUgVHlwZSBvZiBuZXcgY2xhc3MuCi0gICAgICogQHJldHVybiBJbnN0YW5jZSBvZiB0aGUgY2xhc3MgPGNvZGU+dHlwZTwvY29kZT4KLSAgICAgKiBAdGhyb3dzIEZhY2VzRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyB0eXBlKSB0aHJvd3MgRmFjZXNFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKHNpbXBsZUNsYXNzRm9yTmFtZSh0eXBlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyA8Y29kZT5jbGF6ejwvY29kZT4uCi0gICAgICogCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGF6eiBDbGFzcyB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YuCi0gICAgICogQHJldHVybiBJbnN0YW5jZSBvZiB0aGUgY2xhc3MgPGNvZGU+Y2xheno8L2NvZGU+Ci0gICAgICogQHRocm93cyBGYWNlc0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShDbGFzcyBjbGF6eikgdGhyb3dzIEZhY2VzRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ2xhc3MgOiAiICsgY2xhenouZ2V0TmFtZSgpICsgIiBub3QgZm91bmQuIiwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBGYWNlc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVuZGVyZXJlZCBhIGNvbXBvbmVudCwgaW5jbHVkaW5nIGl0J3MgY2hpbGRyZW4sIHRoZW4gY29tcGxldGUgdGhlIHJlcG9uc2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRleHQgRmFjZXMgQ29udGV4dAotICAgICAqIEBwYXJhbSBjb21wb25lbnQgQ29tcG9uZW50IHRvIGJlIHJlbmRlcmVkLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gVGhyb3duIHdoaWxlIHJlbmRlcmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVuZGVyQ29tcG9uZW50KEZhY2VzQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgVUlDb21wb25lbnQgY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyIHJlbmRlcmVyID0gY29udGV4dC5nZXRSZW5kZXJLaXQoKS5nZXRSZW5kZXJlcigKLSAgICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0RmFtaWx5KCksIGNvbXBvbmVudC5nZXRSZW5kZXJlclR5cGUoKSk7Ci0gICAgICAgIHJlbmRlcmVyLmVuY29kZUJlZ2luKGNvbnRleHQsIGNvbXBvbmVudCk7Ci0gICAgICAgIHJlbmRlcmVyLmVuY29kZUNoaWxkcmVuKGNvbnRleHQsIGNvbXBvbmVudCk7Ci0gICAgICAgIHJlbmRlcmVyLmVuY29kZUVuZChjb250ZXh0LCBjb21wb25lbnQpOwotICAgICAgICBjb250ZXh0LnJlc3BvbnNlQ29tcGxldGUoKTsKLSAgICAgICAgY29udGV4dC5yZW5kZXJSZXNwb25zZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9hc3NlbWJseS9wb20ueG1sIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2Fzc2VtYmx5L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNDZjY2IuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2Fzc2VtYmx5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWFzc2VtYmx5MTE8L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBBc3NlbWJseTwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+TXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBBc3NlbWJseSBpcyB1c2VkIHRvIGdlbmVyYXRlIAotICAgIC56aXAgYW5kIC50YXIuZ3ogZGlzdHJpYnV0aW9ucyA8L2Rlc2NyaXB0aW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvYXNzZW1ibHk8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy9hc3NlbWJseTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvYXNzZW1ibHk8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRlcGVuZGVuY3ktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktamF2YWRvYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZW5lcmljLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2JlYW4tdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2phdmFkb2M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1zb3VyY2U8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjb3JlLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtiZWFuLXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zcmM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBFWEVDVVRFIG12biBwYWNrYWdlIHRvIGdlbmVyYXRlIGFzc2VtYmx5IGZpbGVzIC0tPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X3NyYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5teWZhY2VzLWV4dHZhbDExLSR7dmVyc2lvbn0tc3JjPC9maW5hbE5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXR0YWNoZWQ8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X2JpbjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPiR7YmFzZWRpcn0vc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsMTEtJHt2ZXJzaW9ufS1iaW48L2ZpbmFsTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgucGVyc2lzdGVuY2U8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnBlcnNpc3RlbmNlLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4gCi0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2JlYW4tdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnZhbGlkYXRpb248L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnZhbGlkYXRpb24tYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPiAKLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y2dsaWI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNnbGliPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPiAKLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPCEtLSBTaW5jZSBleHR2YWwgY291bGQgYmUgYXN5bmMgcmVsZWFzZWQsIGFuIGdlbmVyYXRlZCBhc3NlbWJseSBjb3VsZCBjb250YWluIGRpZmZlcmVudAotICAgICAgICAgYXJ0aWZhY3QgdmVyc2lvbnMgLS0+Ci0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxjb3JlLnZlcnNpb24+MS4xLjM8L2NvcmUudmVyc2lvbj4KLSAgICAgICAgPHRyaW5pZGFkLXN1cHBvcnQudmVyc2lvbj4xLjEuMzwvdHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9uPgotICAgICAgICA8Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb24+MS4xLjM8L2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9uPgotICAgICAgICA8cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9uPjEuMS4zPC9wcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb24+Ci0gICAgICAgIDxiZWFuLXZhbGlkYXRpb24udmVyc2lvbj4xLjEuMzwvYmVhbi12YWxpZGF0aW9uLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmViaW4ueG1sIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmViaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjY3OTViLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPmNvcmViaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAJPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+UkVBRE1FKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+TElDRU5TRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPk5PVElDRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPlJFTEVBU0UqPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9qYXZhZG9jPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmphdmFkb2M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWwgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMTg2YzYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+Y29yZXNyYzwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPiAgCi0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAJPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+UkVBRE1FKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+TElDRU5TRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPk5PVElDRSo8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPlJFTEVBU0UqPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+ICAgCi0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9zcmM8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+c3JjPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgotIApkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNWIzYTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGYzNjNhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IKLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3BvbS54bWwgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMzg3NWQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGU8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4xLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+Y29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjEuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y2dsaWI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZ2xpYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMV8zPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlY2U1NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCFET0NUWVBFIGZhY2VzLWNvbmZpZyBQVUJMSUMNCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiINCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxmYWNlcy1jb25maWc+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+DQotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMuc3RhcnR1cC5HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyDQotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYxY2Y5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyS2l0LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJLaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RiZWQ3Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcktpdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi0NCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZEludGVyY2VwdG9yOw0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuRW5oYW5jZXI7DQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RQcm94eTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxHZW5lcmljUmVuZGVyS2l0IGV4dGVuZHMgRXh0VmFsUmVuZGVyS2l0IGltcGxlbWVudHMgTWV0aG9kSW50ZXJjZXB0b3INCi17DQotICAgIHB1YmxpYyBzdGF0aWMgUmVuZGVyS2l0IG5ld0luc3RhbmNlKFJlbmRlcktpdCByZW5kZXJLaXQpDQotICAgIHsNCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IHJlbmRlcktpdC5nZXRDbGFzcygpOw0KLQ0KLSAgICAgICAgLy9pdCdzIG5vdCBwb3NzaWJsZSB0byB3cmFwIHRoZSBjb252ZXJ0ZXIgYWdhaW4gLSBvY2N1cnMgZS5nLiB1bmRlciBzb2xhcmlzICsgYmVhIHdlYmxvZ2ljDQotICAgICAgICBpZiAoUHJveHlVdGlscy5pc1Byb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZW5kZXJLaXQ7DQotICAgICAgICB9DQotDQotICAgICAgICBFbmhhbmNlciBlbmhhbmNlciA9IG5ldyBFbmhhbmNlcigpOw0KLSAgICAgICAgZW5oYW5jZXIuc2V0U3VwZXJjbGFzcyhyZW5kZXJLaXQuZ2V0Q2xhc3MoKSk7DQotICAgICAgICBlbmhhbmNlci5zZXRDYWxsYmFjayhuZXcgRXh0VmFsR2VuZXJpY1JlbmRlcktpdChyZW5kZXJLaXQpKTsNCi0gICAgICAgIGVuaGFuY2VyLnNldENsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOw0KLQ0KLSAgICAgICAgcmV0dXJuIChSZW5kZXJLaXQpIGVuaGFuY2VyLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgaW50ZXJjZXB0KE9iamVjdCBvYmosIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MsIE1ldGhvZFByb3h5IHByb3h5KSB0aHJvd3MgVGhyb3dhYmxlDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJnZXRSZW5kZXJlciIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRSZW5kZXJlcigoU3RyaW5nKWFyZ3NbMF0sIChTdHJpbmcpYXJnc1sxXSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJhZGRSZW5kZXJlciIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZFJlbmRlcmVyKChTdHJpbmcpYXJnc1swXSwgKFN0cmluZylhcmdzWzFdLCAoUmVuZGVyZXIpYXJnc1syXSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb3h5Lmludm9rZVN1cGVyKG9iaiwgYXJncyk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRXh0VmFsR2VuZXJpY1JlbmRlcktpdChSZW5kZXJLaXQgd3JhcHBlZCkNCi0gICAgew0KLSAgICAgICAgc3VwZXIod3JhcHBlZCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBSZW5kZXJlciBjcmVhdGVXcmFwcGVyKFJlbmRlcmVyIHJlbmRlcmVyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5uZXdJbnN0YW5jZShyZW5kZXJlcik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2NTU3NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RJbnRlcmNlcHRvcjsKLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuRW5oYW5jZXI7Ci1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZFByb3h5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgZmluYWwgY2xhc3MgRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlciBleHRlbmRzIEV4dFZhbFJlbmRlcmVyV3JhcHBlciBpbXBsZW1lbnRzIE1ldGhvZEludGVyY2VwdG9yCi17Ci0gICAgcHVibGljIHN0YXRpYyBSZW5kZXJlciBuZXdJbnN0YW5jZShSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IHJlbmRlcmVyLmdldENsYXNzKCk7Ci0KLSAgICAgICAgLy90byBhdm9pZCByZS13cmFwcGluZyAtIG9jY3VycyBlLmcuIHVuZGVyIHNvbGFyaXMgKyBiZWEgd2VibG9naWMKLSAgICAgICAgaWYgKFByb3h5VXRpbHMuaXNQcm94aWVkQ2xhc3MoY3VycmVudENsYXNzKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgRW5oYW5jZXIgZW5oYW5jZXIgPSBuZXcgRW5oYW5jZXIoKTsKLSAgICAgICAgZW5oYW5jZXIuc2V0U3VwZXJjbGFzcyhyZW5kZXJlci5nZXRDbGFzcygpKTsKLSAgICAgICAgZW5oYW5jZXIuc2V0Q2FsbGJhY2sobmV3IEV4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIocmVuZGVyZXIpKTsKLSAgICAgICAgZW5oYW5jZXIuc2V0Q2xhc3NMb2FkZXIoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0KLSAgICAgICAgcmV0dXJuIChSZW5kZXJlcikgZW5oYW5jZXIuY3JlYXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBpbnRlcmNlcHQoT2JqZWN0IG9iaiwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncywgTWV0aG9kUHJveHkgcHJveHkpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0Q29udmVydGVkVmFsdWUiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDb252ZXJ0ZWRWYWx1ZSgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdLCBhcmdzWzJdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZGVjb2RlIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWNvZGUoKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImVuY29kZUJlZ2luIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGVCZWdpbigoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZW5jb2RlQ2hpbGRyZW4iKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZUNoaWxkcmVuKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJlbmNvZGVFbmQiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZUVuZCgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiY29udmVydENsaWVudElkIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRDbGllbnRJZCgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChTdHJpbmcpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldFJlbmRlcnNDaGlsZHJlbiIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm1ldGhvZCAiICsgbWV0aG9kLmdldE5hbWUoKSArICIgY2FsbGVkIHdpdGhvdXQgcmVuZGVyaW5nLWludGVyY2VwdG9ycyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcHJveHkuaW52b2tlU3VwZXIob2JqLCBhcmdzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlcihSZW5kZXJlciB3cmFwcGVkKQotICAgIHsKLSAgICAgICAgc3VwZXIod3JhcHBlZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NWQyOGIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5DQotew0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyS2l0IGNyZWF0ZVdyYXBwZXIoUmVuZGVyS2l0IHJlbmRlcktpdCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVya2l0IHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcktpdC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgdmlhIGNnbGliIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5uZXdJbnN0YW5jZShyZW5kZXJLaXQpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9zdGFydHVwL0dlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9zdGFydHVwL0dlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU3MzMxNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdC5HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBHZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQzOTIxNTYwMzI4Nzc1MTk1NTZMOw0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpLmFkZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KG5ldyBHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmNjMyMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGUgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlIHByb3ZpZGVzIGdlbmVyaWMgU3VwcG9ydCBmb3IgSlNGIGNvbXBvbmVudCBmcmFtZXdvcmtzIHdoaWNoIGhhdmUgc3BlY2lhbCByZXF1aXJlbWVudHMgKGUuZy4gUmljaEZhY2VzLCBNeUZhY2VzIFRvYmFnbywgLi4uKS4NCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEueCBhbmQgSlNGIDIueC4gQWxsIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3BvbS54bWwgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUxNGU3Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIENvbXBvbmVudC1TdXBwb3J0IE1vZHVsZXM8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4xLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4xLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy9jb21wb25lbnQtc3VwcG9ydDwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8yX3JjL2NvbXBvbmVudC1zdXBwb3J0PC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy9jb21wb25lbnQtc3VwcG9ydDwvdXJsPgotICAgIDwvc2NtPgotCi0gICAgPG1vZHVsZXM+Ci0gICAgICAgIDxtb2R1bGU+dHJpbmlkYWQtc3VwcG9ydDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmdlbmVyaWMtc3VwcG9ydDwvbW9kdWxlPgotICAgIDwvbW9kdWxlcz4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPHRyaW5pZGFkLnZlcnNpb24+MS4wLjk8L3RyaW5pZGFkLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmQxMjk0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlPC9uYW1lPgotICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4xLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZWUzODUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiIKLSAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzEuZHRkIiA+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGZhY2VzLWNvbmZpZz4KLSAgICA8bGlmZWN5Y2xlPgotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RhcnR1cC5UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lcgotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPgotICAgIDwvbGlmZWN5Y2xlPgotCi0gICAgPGxpZmVjeWNsZT4KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIKLSAgICAgICAgPC9waGFzZS1saXN0ZW5lcj4KLSAgICA8L2xpZmVjeWNsZT4KLTwvZmFjZXMtY29uZmlnPgpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYxY2Y5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MGViNjguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi0vKioNCi0gKiBpbiBjYXNlIG9mIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gYSB0cmluaWRhZCBjbGllbnQgdmFsaWRhdG9yIGlzIGFkZGVkIHRvIHRoZSBjb21wb25lbnQgYmFzZWQgb24gdGhlIG1ldGEtZGF0YS4NCi0gKiBhdCB0aGUgcG9zdGJhY2s6IHRoZSBleHR2YWwgdmFsaWRhdGlvbiBzdHJhdGVneSBnZXRzIGNhbGxlZCBhbmQgYWZ0ZXIgdGhhdCB0aGUgYWRkZWQgdmFsaWRhdG9yLg0KLSAqIHRoaXMgd3JhcHBlciBwcmV2ZW50cyBzdWNoIGEgc2VydmVyLXNpZGUgZG91YmxlIHZhbGlkYXRpb24uDQotICogaXQganVzdCBkZWxlZ2F0ZXMgdGhlIGNsaWVudC1zaWRlIGZ1bmN0aW9uYWxpdHkuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIgaW1wbGVtZW50cyBWYWxpZGF0b3IsIENsaWVudFZhbGlkYXRvciwgU2VyaWFsaXphYmxlDQotew0KLSAgICBwcml2YXRlIHRyYW5zaWVudCBDbGllbnRWYWxpZGF0b3Igd3JhcHBlZDsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTQxNDU0Nzg0MTcwMDYyMTQxMEw7DQotDQotICAgIHB1YmxpYyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIoQ2xpZW50VmFsaWRhdG9yIGNsaWVudFZhbGlkYXRvcikNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gY2xpZW50VmFsaWRhdG9yOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHZhbGlkYXRlIC0gdGhlIGV4dHZhbCB2YWxpZGF0aW9uIHN0cmF0ZWd5IHdpbGwgZG8gdGhhdA0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50TGlicmFyeVNvdXJjZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRDbGllbnRMaWJyYXJ5U291cmNlKGZhY2VzQ29udGV4dCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRDbGllbnRJbXBvcnROYW1lcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudEltcG9ydE5hbWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRTY3JpcHQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudFNjcmlwdChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTg3NzA4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0LkV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0OwotCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5OwotCi0vKioKLSAqIHVzZSB0aGlzIHBoYXNlLWxpc3RlbmVyIGluc3RlYWQgb2YgYSBFeHRWYWxUcmluaWRhZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGR1ZSB0byBhIHRyaW5pZGFkIGlzc3VlCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDkxMDk3MjE4MzE4NjQxNDYxNjVMOwotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsKLQotICAgICAgICBSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnkgPSBnZXRSZW5kZXJLaXRGYWN0b3J5KCk7Ci0KLSAgICAgICAgU3RyaW5nIHJlbmRlcktpdElkID0gZ2V0UmVuZGVyS2l0SWQoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBpZiAoaXNJbmNvbXBhdGlibGVSZW5kZXJLaXQocmVuZGVyS2l0SWQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFuZ2VSZW5kZXJLaXQoZmFjZXNDb250ZXh0LCByZW5kZXJLaXRGYWN0b3J5LCByZW5kZXJLaXRJZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRSZW5kZXJLaXRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldFJlbmRlcktpdElkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJLaXRGYWN0b3J5IGdldFJlbmRlcktpdEZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChSZW5kZXJLaXRGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShGYWN0b3J5RmluZGVyLlJFTkRFUl9LSVRfRkFDVE9SWSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5jb21wYXRpYmxlUmVuZGVyS2l0KFN0cmluZyByZW5kZXJLaXRJZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAhRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuSUQuZXF1YWxzKHJlbmRlcktpdElkKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hhbmdlUmVuZGVyS2l0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFJlbmRlcktpdEZhY3RvcnkgcmVuZGVyS2l0RmFjdG9yeSwgU3RyaW5nIHJlbmRlcktpdElkKQotICAgIHsKLSAgICAgICAgUmVuZGVyS2l0IHJlbmRlcktpdCA9IHJlbmRlcktpdEZhY3RvcnkuZ2V0UmVuZGVyS2l0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgcmVuZGVyS2l0SWQpOwotICAgICAgICByZW5kZXJLaXRGYWN0b3J5LmFkZFJlbmRlcktpdChFeHRWYWxUcmluaWRhZFJlbmRlcktpdC5JRCwgbmV3IEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0KHJlbmRlcktpdCkpOwotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5zZXRSZW5kZXJLaXRJZChFeHRWYWxUcmluaWRhZFJlbmRlcktpdC5JRCk7Ci0gICAgfQotCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gUGhhc2VJZC5SRU5ERVJfUkVTUE9OU0U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCi0gICAgewotICAgICAgICBpZiAodGhpcyA9PSBvKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUwY2I3NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFyZW4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICAvKg0KLSAgICAgKiBkZWFjdGl2YXRlDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfQ0xJRU5UX1NJREVfVFJJTklEQURfVkFMSURBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9DTElFTlRfU0lERV9UUklOSURBRF9WQUxJREFUSU9OIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9UUklOSURBRF9DT1JFX09VVFBVVF9MQUJFTF9JTklUSUFMSVpBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9UUklOSURBRF9DT1JFX09VVFBVVF9MQUJFTF9JTklUSUFMSVpBVElPTiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfVFJJTklEQURfVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfVFJJTklEQURfVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IiKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0RvdWJsZVJhbmdlSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMDAwZTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0RvdWJsZVJhbmdlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5Eb3VibGVSYW5nZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkNsaWVudFZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJza2lwVmFsaWRhdGlvblN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24iKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIERvdWJsZVJhbmdlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW5mb3JtYXRpb25BZGRlZCA9IGZhbHNlOwotICAgICAgICBEb3VibGVSYW5nZVZhbGlkYXRvciBkb3VibGVSYW5nZVZhbGlkYXRvciA9IChEb3VibGVSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRG91YmxlUmFuZ2UiKTsKLQotICAgICAgICBPYmplY3QgbWluID0gbnVsbDsKLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU5fREVGQVVMVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOX0RFRkFVTFQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWluIGluc3RhbmNlb2YgRG91YmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKChEb3VibGUpbWluKTsKLSAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IG1heCA9IG51bGw7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWF9ERUZBVUxUKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1heCBpbnN0YW5jZW9mIERvdWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bSgoRG91YmxlKW1heCk7Ci0gICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGluZm9ybWF0aW9uQWRkZWQgJiYKLSAgICAgICAgICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvciBpbnN0YW5jZW9mIENsaWVudFZhbGlkYXRvciAmJiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpZG91YmxlUmFuZ2VWYWxpZGF0b3IpKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9MZW5ndGhJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTI2YzhmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9MZW5ndGhJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBMZW5ndGhJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7Ci0gICAgICAgIC8vVE9ETwotICAgICAgICBMZW5ndGhWYWxpZGF0b3IgbGVuZ3RoVmFsaWRhdG9yID0gKExlbmd0aFZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTGVuZ3RoIik7Ci0KLSAgICAgICAgT2JqZWN0IG1pbkxlbmd0aCA9IG51bGw7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWluTGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIX0RFRkFVTFQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW5MZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEhfREVGQVVMVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtaW5MZW5ndGggaW5zdGFuY2VvZiBJbnRlZ2VyKQotICAgICAgICB7Ci0gICAgICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWluaW11bSgoSW50ZWdlciltaW5MZW5ndGgpOwotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbnVsbDsKLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEhfREVGQVVMVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heExlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSF9ERUZBVUxUKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1heExlbmd0aCBpbnN0YW5jZW9mIEludGVnZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudC5nZXRDbGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0TWF4aW11bUxlbmd0aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludC5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhMZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWF4aW11bSgoSW50ZWdlciltYXhMZW5ndGgpOwotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3JlSW5pdFZhbGlkYXRvcnMoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQsIG1ldGFEYXRhKTsgLy9zZWFyY2ggd3JhcHBlcnMgYW5kIGNhbGwgLmRlYWN0aXZhdGUKLQotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkICYmIGxlbmd0aFZhbGlkYXRvciBpbnN0YW5jZW9mIENsaWVudFZhbGlkYXRvcikKLSAgICAgICAgewotICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKWxlbmd0aFZhbGlkYXRvcikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobGVuZ3RoVmFsaWRhdG9yLmdldE1pbmltdW0oKSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgoQ29yZU91dHB1dExhYmVsKXVpQ29tcG9uZW50KS5zZXRTaG93UmVxdWlyZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Mb25nUmFuZ2VJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xvbmdSYW5nZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OWVlYjguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xvbmdSYW5nZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuTG9uZ1JhbmdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgTG9uZ1JhbmdlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW5mb3JtYXRpb25BZGRlZCA9IGZhbHNlOwotICAgICAgICBMb25nUmFuZ2VWYWxpZGF0b3IgbG9uZ1JhbmdlVmFsaWRhdG9yID0gKExvbmdSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTG9uZ1JhbmdlIik7Ci0KLSAgICAgICAgT2JqZWN0IG1pbiA9IG51bGw7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pKQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOX0RFRkFVTFQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxUKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1pbiBpbnN0YW5jZW9mIExvbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKChMb25nKW1pbik7Ci0gICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBtYXggPSBudWxsOwotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4ID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWF9ERUZBVUxUKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4ID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVhfREVGQVVMVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtYXggaW5zdGFuY2VvZiBMb25nKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bSgoTG9uZyltYXgpOwotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkICYmCi0gICAgICAgICAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yIGluc3RhbmNlb2YgQ2xpZW50VmFsaWRhdG9yICYmIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikKLSAgICAgICAgewotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKWxvbmdSYW5nZVZhbGlkYXRvcikpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9QYXR0ZXJuSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9QYXR0ZXJuSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZmMDg4ZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuUmVnRXhwVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgUGF0dGVybkluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZighbWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4pKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBwYXR0ZXJucyA9IChTdHJpbmdbXSltZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4pOwotCi0gICAgICAgIFJlZ0V4cFZhbGlkYXRvciByZWdFeHBWYWxpZGF0b3I7Ci0KLSAgICAgICAgZm9yKFN0cmluZyBwYXR0ZXJuIDogcGF0dGVybnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZ0V4cFZhbGlkYXRvciA9IChSZWdFeHBWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5SZWdFeHAiKTsKLQotICAgICAgICAgICAgcmVnRXhwVmFsaWRhdG9yLnNldFBhdHRlcm4ocGF0dGVybik7Ci0gICAgICAgICAgICByZWdFeHBWYWxpZGF0b3Iuc2V0TWVzc2FnZURldGFpbE5vTWF0Y2goKFN0cmluZyltZXRhRGF0YS5nZXQoCi0gICAgICAgICAgICAgICAgQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFKSk7Ci0KLSAgICAgICAgICAgIGlmKHJlZ0V4cFZhbGlkYXRvciBpbnN0YW5jZW9mIENsaWVudFZhbGlkYXRvciAmJiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpcmVnRXhwVmFsaWRhdG9yKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1JlcXVpcmVkSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNGE5OTIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1JlcXVpcmVkSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudXRpbC5UcmluaWRhZFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIFJlcXVpcmVkSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCF2YWxpZGF0ZUVtcHR5RmllbGRzKCkgfHwgIUV4dFZhbFV0aWxzLmlzUmVxdWlyZWRJbml0aWFsaXphdGlvbkFjdGl2ZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpIHx8Ci0gICAgICAgICAgIG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKXx8Ci0gICAgICAgICAgIG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigoCi0gICAgICAgICAgICAgICAgICghQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpICYmCi0gICAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQpKSkgfHwKLSAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpCi0gICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGlzQ29tcG9uZW50UmVxdWlyZWQodWlDb21wb25lbnQpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIENvcmVPdXRwdXRMYWJlbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgoQ29yZU91dHB1dExhYmVsKXVpQ29tcG9uZW50KS5zZXRTaG93UmVxdWlyZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJgotICAgICAgICAgICAgICAgICAgICFCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIgJiYgRXh0VmFsVXRpbHMuaXNSZXF1aXJlZFJlc2V0QWN0aXZhdGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlRW1wdHlGaWVsZHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLnZhbGlkYXRlRW1wdHlGaWVsZHMoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQm9vbGVhbiBpc0NvbXBvbmVudFJlcXVpcmVkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpQ29tcG9uZW50ID0gVHJpbmlkYWRVdGlscy5maW5kTGFiZWxlZEVkaXRhYmxlQ29tcG9uZW50KChDb3JlT3V0cHV0TGFiZWwpIHVpQ29tcG9uZW50KTsKLQotICAgICAgICAgICAgaWYodWlDb21wb25lbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL2NvbXBhcmUgd2l0aCBmYWxzZSBzbyB0cnVlID0gdHJ1ZSBvciBudWxsCi0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNSZWFkT25seSIpKSk7Ci0gICAgICAgIGJvb2xlYW4gaXNEaXNhYmxlZCA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNEaXNhYmxlZCIpKSk7Ci0KLSAgICAgICAgcmV0dXJuICEoaXNSZWFkT25seSB8fCBpc0Rpc2FibGVkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1RyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEyZDFlNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZS5UcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbnRleHQuUmVxdWVzdENvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9URVhUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXRUZXh0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXREYXRlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8VHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcj4gY29tcG9uZW50SW5pdGlhbGl6ZXJzID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyPigpOwotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBSZXF1aXJlZEluaXRpYWxpemVyKCkpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBMZW5ndGhJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgTG9uZ1JhbmdlSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IERvdWJsZVJhbmdlSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFBhdHRlcm5Jbml0aWFsaXplcigpKTsKLSAgICAgICAgLy9jb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBWYWxpZGF0b3JJbml0aWFsaXplcigpKTsKLSAgICB9Ci0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkxPVywgZGVzY3JpcHRpb24gPSAiY2hlY2sgcHByIGlzc3VlIikKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBmb3IoVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplciA6IGNvbXBvbmVudEluaXRpYWxpemVycykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoY29tcG9uZW50SW5pdGlhbGl6ZXIuY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZENvbXBvbmVudFRvU3RvcmFnZSh1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQ29tcG9uZW50KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZENvbXBvbmVudFRvU3RvcmFnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmNsYXNzLCBUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKQotICAgICAgICAgICAgICAgIC5hZGRDb21wb25lbnQodWlDb21wb25lbnQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKSB8fAotICAgICAgICAgICAgICAgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFLmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmKFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmlzUGFydGlhbFJlcXVlc3QoZmFjZXNDb250ZXh0KSkKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuYWRkUGFydGlhbFRhcmdldCh1aUNvbXBvbmVudC5nZXRQYXJlbnQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVmFsaWRhdG9ySW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzZmNGFkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQotQFVzYWdlSW5mb3JtYXRpb24odmFsdWUgPSBVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gImltcGwuIHRyaW5pZGFkIGUtbWFpbCB2YWxpZGF0b3IiKQotY2xhc3MgVmFsaWRhdG9ySW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCFtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuQ1VTVE9NKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00pOwotCi0gICAgICAgIGlmKCEodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKE9iamVjdCBjdXJyZW50VmFsdWUgOiAoTGlzdCl2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIShjdXJyZW50VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihDb21tb25NZXRhRGF0YUtleXMuRU1BSUwuZXF1YWxzKGN1cnJlbnRWYWx1ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9UT0RPCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNDY5NmIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3INCi0gICAgICAgIC5Db21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigzMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBleHRlbmRzIENvbXBvbmVudEluaXRpYWxpemF0aW9uQXdhcmVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nRm9yQ29tcG9uZW50SW5pdGlhbGl6YXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzTWV0YURhdGFFbnRyaWVzKHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0TWV0YURhdGFFbnRyaWVzKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTWV0YURhdGFFbnRyaWVzKE1ldGFEYXRhRW50cnlbXSBtZXRhRGF0YUVudHJpZXMpDQotICAgIHsNCi0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IG1ldGFEYXRhRW50cmllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAocHJvY2Vzc0VudHJ5KGVudHJ5KSAmJiBpc0NsaWVudFZhbGlkYXRpb25EaXNhYmxlZChlbnRyeSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBkaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24oZW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvL2UuZy4gcmV0dXJucyBmYWxzZSBmb3IganNyMzAzIGVudHJpZXMNCi0gICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NFbnRyeShNZXRhRGF0YUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb247DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xpZW50VmFsaWRhdGlvbkRpc2FibGVkKE1ldGFEYXRhRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkNCi0gICAgICAgICAgICAgICAgLmV4dHJhY3QoZW50cnkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5pdGVyYXRvcigpLmhhc05leHQoKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwcml2YXRlIHZvaWQgZGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uKE1ldGFEYXRhRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmKGVudHJ5LmdldFByb3BlcnR5KENvbW1vbk1ldGFEYXRhS2V5cy5ESVNBQkxFX0NMSUVOVF9TSURFX1ZBTElEQVRJT04pID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZW50cnkuc2V0UHJvcGVydHkoQ29tbW9uTWV0YURhdGFLZXlzLkRJU0FCTEVfQ0xJRU5UX1NJREVfVkFMSURBVElPTiwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGtleXNUb0Rpc2FibGUgPSBlbnRyeS5nZXRQcm9wZXJ0eShDb21tb25NZXRhRGF0YUtleXMuRElTQUJMRV9DTElFTlRfU0lERV9WQUxJREFUSU9OLCBMaXN0LmNsYXNzKTsNCi0gICAgICAgIGtleXNUb0Rpc2FibGUuYWRkKGVudHJ5LmdldEtleSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWUzYjYxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UuVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudXRpbC5UcmluaWRhZFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUuQ29yZUZvcm07DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotcHVibGljIGNsYXNzIFRyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvciBleHRlbmRzIEFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcg0KLXsNCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpDQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChmaWx0ZXJDb3JlT3V0cHV0TGFiZWwodWlDb21wb25lbnQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRDb3JlT3V0cHV0TGFiZWwoZmFjZXNDb250ZXh0LCAoQ29yZU91dHB1dExhYmVsKSB1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyRW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQ0KLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIENvcmVGb3JtKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNsZWFudXBFeHRWYWxDbGllbnRWYWxpZGF0b3JzKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFudXBFeHRWYWxDbGllbnRWYWxpZGF0b3JzKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MsIFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpDQotICAgICAgICAgICAgICAgIC5yb2xsYmFjaygpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBmaWx0ZXJDb3JlT3V0cHV0TGFiZWwoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb3JlT3V0cHV0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgQ29yZU91dHB1dExhYmVsIGNvcmVPdXRwdXRMYWJlbCkNCi0gICAgew0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gVHJpbmlkYWRVdGlscy5maW5kTGFiZWxlZEVkaXRhYmxlQ29tcG9uZW50KGNvcmVPdXRwdXRMYWJlbCk7DQotDQotICAgICAgICBpZiAodGFyZ2V0Q29tcG9uZW50ID09IG51bGwgfHwgIWlzQ29tcG9uZW50RWRpdGFibGUodGFyZ2V0Q29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhUmVzdWx0ID0gRXh0VmFsVXRpbHMuZ2V0VHJhbnNmb3JtZWRNZXRhRGF0YShmYWNlc0NvbnRleHQsIHRhcmdldENvbXBvbmVudCk7DQotDQotICAgICAgICAvL2dldCBjb21wb25lbnQgaW5pdGlhbGl6ZXIgZm9yIHRoZSBjdXJyZW50IGNvbXBvbmVudCBhbmQgY29uZmlndXJlIGl0DQotICAgICAgICAvL2Fsc28gaW4gY2FzZSBvZiBza2lwcGVkIHZhbGlkYXRpb24gdG8gcmVzZXQgZS5nLiB0aGUgcmVxdWlyZWQgYXR0cmlidXRlDQotICAgICAgICBpZiAoIW1ldGFEYXRhUmVzdWx0LmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5jb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoZmFjZXNDb250ZXh0LCBjb3JlT3V0cHV0TGFiZWwsIG1ldGFEYXRhUmVzdWx0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDb21wb25lbnRFZGl0YWJsZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgLy9jb21wYXJlIHdpdGggZmFsc2Ugc28gdHJ1ZSA9IHRydWUgb3IgbnVsbA0KLSAgICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNSZWFkT25seSIpKSk7DQotICAgICAgICBib29sZWFuIGlzRGlzYWJsZWQgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc0Rpc2FibGVkIikpKTsNCi0NCi0gICAgICAgIHJldHVybiAhKGlzUmVhZE9ubHkgfHwgaXNEaXNhYmxlZCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODU0NjEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5MYWJlbGVkTWVzc2FnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5leGNlcHRpb24uUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbnRleHQuUmVxdWVzdENvbnRleHQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dFRleHQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUuaW5wdXQuQ29yZUlucHV0RGF0ZSI7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb1JlZnJlc2hDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgICAgIHRyeVRvUGxhY2VMYWJlbEluRmFjZXNNZXNzYWdlKHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvUGxhY2VMYWJlbEluRmFjZXNNZXNzYWdlKA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHRyeVRvSGFuZGxlUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24odWlDb21wb25lbnQsIHZhbGlkYXRvckV4Y2VwdGlvbik7DQotDQotICAgICAgICBTdHJpbmcgbGFiZWwgPSBkZXRlY3RMYWJlbFRleHQobWV0YURhdGFFbnRyeSwgdWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0xhYmVsKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSwgbGFiZWwpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGRldGVjdExhYmVsVGV4dChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbGFiZWwgPSBnZXRMYWJlbCh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBsYWJlbCA9IGdldENsaWVudElkQXNGYWxsYmFja0lmTmVlZGVkKHVpQ29tcG9uZW50LCBsYWJlbCk7DQotDQotICAgICAgICBsYWJlbCA9IHRyeVRvT3ZlcnJpZGVMYWJlbElmUHJvdmlkZWRNYW51YWxseShtZXRhRGF0YUVudHJ5LCBsYWJlbCk7DQotICAgICAgICByZXR1cm4gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NMYWJlbChGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIExhYmVsZWRNZXNzYWdlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgICgoTGFiZWxlZE1lc3NhZ2UpZmFjZXNNZXNzYWdlKS5zZXRMYWJlbFRleHQobGFiZWwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9pZiBzb21lb25lIHVzZXMgYSBub3JtYWwgZmFjZXMgbWVzc2FnZQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwoZmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvT3ZlcnJpZGVMYWJlbElmUHJvdmlkZWRNYW51YWxseShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwsIFN0cmluZy5jbGFzcyk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xpZW50SWRBc0ZhbGxiYWNrSWZOZWVkZWQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgaWYobGFiZWwgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBsYWJlbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9IYW5kbGVSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdG9yRXhjZXB0aW9uIGluc3RhbmNlb2YgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKTsNCi0gICAgICAgICAgICBTdHJpbmcgaW5saW5lTWVzc2FnZSA9IGdldElubGluZVJlcXVpcmVkTWVzc2FnZSh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICAgICAgaWYoaW5saW5lTWVzc2FnZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoaW5saW5lTWVzc2FnZSk7DQotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoaW5saW5lTWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1JlZnJlc2hDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmKFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmlzUGFydGlhbFJlcXVlc3QoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBSZXF1ZXN0Q29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5hZGRQYXJ0aWFsVGFyZ2V0KHVpQ29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAoVFJJTklEQURfQ09SRV9JTlBVVF9URVhULmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSkgfHwNCi0gICAgICAgICAgICAgICAgIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURS5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRMYWJlbChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldExhYmVsIikpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldElubGluZVJlcXVpcmVkTWVzc2FnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldFJlcXVpcmVkTWVzc2FnZURldGFpbCIpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWNhMjFlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwucmVuZGVya2l0LlJlbmRlcktpdERlY29yYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuY29yZS5Db3JlUmVuZGVyS2l0OwotCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlc3BvbnNlU3RhdGVNYW5hZ2VyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VXcml0ZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0IGV4dGVuZHMgUmVuZGVyS2l0RGVjb3JhdG9yCi17Ci0gICAgcHJvdGVjdGVkIEV4dFZhbFJlbmRlcktpdCBleHRWYWxSZW5kZXJLaXQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJFWFRWQUxfVFJJTklEQURfUkVOREVSS0lUIjsKLQotICAgIHB1YmxpYyBFeHRWYWxUcmluaWRhZFJlbmRlcktpdChSZW5kZXJLaXQgd3JhcHBlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZXh0VmFsUmVuZGVyS2l0ID0gbmV3IEV4dFZhbFJlbmRlcktpdCh3cmFwcGVkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlLCBSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCByZW5kZXJlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlbmRlcmVyIGdldFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5leHRWYWxSZW5kZXJLaXQuZ2V0UmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZXNwb25zZVN0YXRlTWFuYWdlciBnZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5leHRWYWxSZW5kZXJLaXQuZ2V0UmVzcG9uc2VTdGF0ZU1hbmFnZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVzcG9uc2VXcml0ZXIgY3JlYXRlUmVzcG9uc2VXcml0ZXIoV3JpdGVyIHdyaXRlciwgU3RyaW5nIHMsIFN0cmluZyBzMSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5jcmVhdGVSZXNwb25zZVdyaXRlcih3cml0ZXIsIHMsIHMxKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVzcG9uc2VTdHJlYW0gY3JlYXRlUmVzcG9uc2VTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5jcmVhdGVSZXNwb25zZVN0cmVhbShvdXRwdXRTdHJlYW0pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVjb3JhdGVkUmVuZGVyS2l0SWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIENvcmVSZW5kZXJLaXQuQkFTRV9SRU5ERVJfS0lUX0lEOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYyNzAxZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwucmVuZGVya2l0LmNvcmUueGh0bWwudGFibGUuVGFibGVSZW5kZXJpbmdDb250ZXh0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogc29sdXRpb24gZm9yIHRyaW5pZGFkIHRhYmxlIHJlbmRlcmVyIGlzc3VlIChpbiBjb25uZWN0aW9uIHdpdGggZG91YmxlIGNhbGwgcHJldmVudGlvbiBwcm94aWVzKQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkgZXh0ZW5kcyBFeHRWYWxSZW5kZXJlclByb3h5DQotew0KLSAgICBwdWJsaWMgRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5KFJlbmRlcmVyIHJlbmRlcmVyKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihyZW5kZXJlcik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3B0aW9uYWxLZXkoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmKFRhYmxlUmVuZGVyaW5nQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAifCIgKyBUYWJsZVJlbmRlcmluZ0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0UmVuZGVyU3RhZ2UoKS5nZXRTdGFnZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuICIiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRiNzU2Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdGFydHVwL1RyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXJIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQuVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UuVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZS5EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC52YWxpZGF0aW9uLm1lc3NhZ2UuVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0LkV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yLlRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3IuVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3IuVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGFsdGVybmF0aXZlIGFwcHJvYWNoIGZvciBFeHRWYWxSZW5kZXJLaXRGYWN0b3J5DQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgwMzQwODkyNDQ5MDM5NjY5OTlMOw0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgZGVhY3RpdmF0ZURlZmF1bHRFeHRWYWxSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpOw0KLQ0KLSAgICAgICAgaW5pdENsaWVudFNpZGVWYWxpZGF0aW9uU3VwcG9ydCgpOw0KLQ0KLSAgICAgICAgaW5pdExhYmVsSW5pdGlhbGl6YXRpb25TdXBwb3J0KCk7DQotDQotICAgICAgICBpbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdGlvbigpOw0KLQ0KLSAgICAgICAgcmVwbGFjZURlZmF1bHRQcm94eVdpdGhUcmluaWRhZFJlbmRlcmVyUHJveHkoKTsNCi0NCi0gICAgICAgIGluaXRUcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkoKTsNCi0gICAgICAgIC8qDQotICAgICAgICAgKiBpZiB0aGVyZSBhcmUgZnVydGhlciBpbmNvbXBhdGlibGUgcmVuZGVyZXJzIHVzZSB0aGUgZm9sbG93aW5nIHF1aWNrLWZpeDoNCi0gICAgICAgICAqICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZLCBudWxsKTsNCi0gICAgICAgICAgIGF0dGVudGlvbjogaXQgY2F1c2VzIGRpcmVjdCBkZWxlZ2F0aW9uIHdpdGhvdXQgYSBjaGVjayBvZiBkb3VibGUgaW52b2NhdGlvbnMNCi0gICAgICAgICAqLw0KLQ0KLSAgICAgICAgaW5pdFRyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IoKTsNCi0NCi0gICAgICAgIGluaXRUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UoKTsNCi0NCi0gICAgICAgIGluaXRSZXF1aXJlZEluaXRpYWxpemF0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGRlYWN0aXZhdGVEZWZhdWx0RXh0VmFsUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jbGFzcykuZGVhY3RpdmF0ZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0Q2xpZW50U2lkZVZhbGlkYXRpb25TdXBwb3J0KCkNCi0gICAgew0KLSAgICAgICAgaWYoaXNDbGllbnRTaWRlVmFsaWRhdGlvblN1cHBvcnRFbmFibGVkKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NMSUVOVF9TSURFX1RSSU5JREFEX1ZBTElEQVRJT04pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZENvbXBvbmVudEluaXRpYWxpemVyKG5ldyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TGFiZWxJbml0aWFsaXphdGlvblN1cHBvcnQoKQ0KLSAgICB7DQotICAgICAgICBpZihpc0xhYmVsSW5pdGlhbGl6YXRpb25FbmFibGVkKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX1RSSU5JREFEX0NPUkVfT1VUUFVUX0xBQkVMX0lOSVRJQUxJWkFUSU9OKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFRyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRpb24oKQ0KLSAgICB7DQotICAgICAgICBpZih1c2VWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0aW9uKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX1RSSU5JREFEX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IobmV3IFRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZXBsYWNlRGVmYXVsdFByb3h5V2l0aFRyaW5pZGFkUmVuZGVyZXJQcm94eSgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSwgRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRUcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjdG9yeU5hbWVzLkZBQ0VTX01FU1NBR0VfRkFDVE9SWS5uYW1lKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRUcmluaWRhZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZLCBTdG9yYWdlTWFuYWdlckhvbGRlci5jbGFzcykNCi0gICAgICAgICAgICAgICAgLnNldFN0b3JhZ2VNYW5hZ2VyKFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNMYWJlbEluaXRpYWxpemF0aW9uRW5hYmxlZChTdHJpbmcgZGVhY3RpdmF0ZUluaXRDb3JlT3V0cHV0TGFiZWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkZWFjdGl2YXRlSW5pdENvcmVPdXRwdXRMYWJlbCA9PSBudWxsIHx8ICFkZWFjdGl2YXRlSW5pdENvcmVPdXRwdXRMYWJlbC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xpZW50U2lkZVZhbGlkYXRpb25TdXBwb3J0RW5hYmxlZChTdHJpbmcgZGVhY3RpdmF0ZUNsaWVudFNpZGVWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGVhY3RpdmF0ZUNsaWVudFNpZGVWYWxpZGF0aW9uID09IG51bGwgfHwgIWRlYWN0aXZhdGVDbGllbnRTaWRlVmFsaWRhdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRpb24oU3RyaW5nIGRlYWN0aXZhdGVUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRlYWN0aXZhdGVUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA9PSBudWxsIHx8DQotICAgICAgICAgICAgICAgICFkZWFjdGl2YXRlVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRSZXF1aXJlZEluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgaWYoIWlzUmVxdWlyZWRJbml0aWFsaXphdGlvbkRlYWN0aXZhdGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoIm1vZGU6aW5pdDpyZXF1aXJlZCIsIEJvb2xlYW4uVFJVRSwgdHJ1ZSk7DQotDQotICAgICAgICAgICAgLy90aGVyZSBpcyBubyBzdXBwb3J0IGZvciBjbGllbnQtc2lkZSBzZXZlcml0eSBhd2FyZSB2YWxpZGF0aW9uIC0+IGRvbid0IHJlc2V0IHRoZSB2YWx1ZQ0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KCJtb2RlOnJlc2V0OnJlcXVpcmVkIiwgQm9vbGVhbi5GQUxTRSwgZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25EZWFjdGl2YXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAiZmFsc2UiLmVxdWFsc0lnbm9yZUNhc2UoDQotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlci5BQ1RJVkFURV9SRVFVSVJFRF9JTklUSUFMSVpBVElPTik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDU0MjU0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXI7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlIGltcGxlbWVudHMgVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlDQotew0KLSAgICBwcml2YXRlIExpc3Q8VUlDb21wb25lbnQ+IGNvbXBvbmVudExpc3QgPSBuZXcgQXJyYXlMaXN0PFVJQ29tcG9uZW50PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb21wb25lbnQoVUlDb21wb25lbnQgdHJpbmlkYWRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmKCF0aGlzLmNvbXBvbmVudExpc3QuY29udGFpbnModHJpbmlkYWRDb21wb25lbnQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuY29tcG9uZW50TGlzdC5hZGQodHJpbmlkYWRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJvbGxiYWNrKCkNCi0gICAgew0KLSAgICAgICAgZm9yIChVSUNvbXBvbmVudCBjb21wb25lbnQgOiB0aGlzLmNvbXBvbmVudExpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVtb3ZlVHJpbmlkYWRWYWxpZGF0b3JXcmFwcGVyKGNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgICAgICB0aGlzLmNvbXBvbmVudExpc3QuY2xlYXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlVHJpbmlkYWRWYWxpZGF0b3JXcmFwcGVyKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlbW92ZVdyYXBwZXJGcm9tQ29tcG9uZW50KHVpQ29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL3RvIGtlZXAgdGhlIHNvdXJjZSBpbiBzeW5jIHdpdGggb2xkZXIgdmVyc2lvbnMNCi0gICAgICAgICAgICBmb3IgKE9iamVjdCBjaGlsZCA6IHVpQ29tcG9uZW50LmdldENoaWxkcmVuKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZW1vdmVUcmluaWRhZFZhbGlkYXRvcldyYXBwZXIoKFVJQ29tcG9uZW50KWNoaWxkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVdyYXBwZXJGcm9tQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBmb3IgKFZhbGlkYXRvciB2YWxpZGF0b3IgOiAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpIHVpQ29tcG9uZW50KS5nZXRWYWxpZGF0b3JzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcikgdWlDb21wb25lbnQpLnJlbW92ZVZhbGlkYXRvcih2YWxpZGF0b3IpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTWFuYWdlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQwMWRjNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIGNvbXBvbmVudCBlbnRyaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU1hbmFnZXINCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZT4NCi17DQotICAgIHB1YmxpYyBEZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfVFJJTklEQURfQ0xJRU5UX1ZBTElEQVRPUjpLRVkiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL1RyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzgzY2I4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotDQotLyoqDQotICogZXh0dmFsIGluamVjdHMgY2xpZW50LXZhbGlkYXRvcnMgaW50byB0cmluaWRhZCBjb21wb25lbnRzIGJhc2VkIG9uIG1ldGEtZGF0YS4NCi0gKiBzbyBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIGlzIHN1cHBvcnRlZC4gc29tZSBhcHAtc2VydmVycyBzaG93IGEgZGlmZmVyZW50IGJlaGF2aW91ci4NCi0gKiB0aGF0J3MgdGhlIHJlYXNvbiBmb3Igc3RvcmluZyB0aGVzZSBjb21wb25lbnRzIGFuZCByZW1vdmUgdGhlIGluamVjdGVkIHZhbGlkYXRvcnMgYWZ0ZXIgdGhlIHJlbmRlcmluZyBwaGFzZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UNCi17DQotICAgIHZvaWQgYWRkQ29tcG9uZW50KFVJQ29tcG9uZW50IHRyaW5pZGFkQ29tcG9uZW50KTsNCi0gICAgdm9pZCByb2xsYmFjaygpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL21hcHBlci9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmU2OWIzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZS5UcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLkRlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC91dGlsL1RyaW5pZGFkVXRpbHMuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3V0aWwvVHJpbmlkYWRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTYzODMyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3V0aWwvVHJpbmlkYWRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLm91dHB1dC5Db3JlT3V0cHV0TGFiZWw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiY2hlY2sgc3ViZm9ybSIpDQotcHVibGljIGNsYXNzIFRyaW5pZGFkVXRpbHMNCi17DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFRyaW5pZGFkVXRpbHMuY2xhc3MpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFVJQ29tcG9uZW50IGZpbmRMYWJlbGVkRWRpdGFibGVDb21wb25lbnQoQ29yZU91dHB1dExhYmVsIGNvcmVPdXRwdXRMYWJlbCkNCi0gICAgew0KLSAgICAgICAgLy9UT0RPDQotICAgICAgICBpZihpc0xhYmVsVGFyZ2V0QXZhaWxhYmxlKGNvcmVPdXRwdXRMYWJlbCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgVUlDb21wb25lbnQgcmVzdWx0ID0gcmVzb2x2ZUxhYmVsVGFyZ2V0KGZhY2VzQ29udGV4dCwgY29yZU91dHB1dExhYmVsKTsNCi0NCi0gICAgICAgIGlmKHJlc3VsdCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKExPRy5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExPRy50cmFjZShjb3JlT3V0cHV0TGFiZWwuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSArICIgZG9lc24ndCByZWZlcmVuY2UgYW4gZWRpdGFibGUgY29tcG9uZW50Iik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBVSUNvbXBvbmVudCByZXNvbHZlTGFiZWxUYXJnZXQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgQ29yZU91dHB1dExhYmVsIGNvcmVPdXRwdXRMYWJlbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmZpbmRDb21wb25lbnQoY29yZU91dHB1dExhYmVsLmdldEZvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTGFiZWxUYXJnZXRBdmFpbGFibGUoQ29yZU91dHB1dExhYmVsIGNvcmVPdXRwdXRMYWJlbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNvcmVPdXRwdXRMYWJlbC5nZXRGb3IoKSA9PSBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNjMjFjYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFRyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeSBleHRlbmRzIERlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5DQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNMYWJlbGVkRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2UgaW5zdGFuY2VvZiBUcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2UgY3JlYXRlKEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlKHNldmVyaXR5LCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZlNjkzYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnZhbGlkYXRpb24ubWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkxhYmVsZWRNZXNzYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudXRpbC5MYWJlbGVkRmFjZXNNZXNzYWdlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlIGV4dGVuZHMgTGFiZWxlZEZhY2VzTWVzc2FnZSBpbXBsZW1lbnRzIExhYmVsZWRNZXNzYWdlDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2MzU2ODAwNjg5OTYxNTA1MTU0TDsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIgPSAiPz8/IjsNCi0NCi0gICAgcHVibGljIFRyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZShTZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKHNldmVyaXR5LCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldExhYmVsQXNTdHJpbmcoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBnZXRTdW1tYXJ5KCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIHJlc3VsdCA9IHRyeVRvUGxhY2VMYWJlbChzdXBlci5nZXRTdW1tYXJ5KCkpOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN1cGVyLnNldFN1bW1hcnkocmVzdWx0LmdldFN1bW1hcnkoKSk7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5nZXRTdW1tYXJ5KCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0U3VtbWFyeSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERldGFpbCgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZSByZXN1bHQgPSB0cnlUb1BsYWNlTGFiZWwoc3VwZXIuZ2V0RGV0YWlsKCkpOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN1cGVyLnNldERldGFpbChyZXN1bHQuZ2V0RGV0YWlsKCkpOw0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQuZ2V0RGV0YWlsKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RGV0YWlsKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBGYWNlc01lc3NhZ2UgdHJ5VG9QbGFjZUxhYmVsKFN0cmluZyBvcmlnaW5hbE1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIGlmIChpc1ZhbGlkTWVzc2FnZShvcmlnaW5hbE1lc3NhZ2UpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBuZXdGYWNlc01lc3NhZ2UgPSBjcmVhdGVPcmlnaW5hbEZhY2VzTWVzc2FnZSgpOw0KLSAgICAgICAgICAgIHRyeVRvUGxhY2VMYWJlbEluKG5ld0ZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgcmV0dXJuIG5ld0ZhY2VzTWVzc2FnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgRmFjZXNNZXNzYWdlIGNyZWF0ZU9yaWdpbmFsRmFjZXNNZXNzYWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBGYWNlc01lc3NhZ2Uoc3VwZXIuZ2V0U2V2ZXJpdHkoKSwgc3VwZXIuZ2V0U3VtbWFyeSgpLCBzdXBlci5nZXREZXRhaWwoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvUGxhY2VMYWJlbEluKEZhY2VzTWVzc2FnZSBuZXdGYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBsYWJlbCA9IGdldExhYmVsVGV4dCgpOw0KLQ0KLSAgICAgICAgaWYobGFiZWwgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvUGxhY2VMYWJlbChuZXdGYWNlc01lc3NhZ2UsIGxhYmVsLCBpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRNZXNzYWdlKFN0cmluZyBvcmlnaW5hbE1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAhKG9yaWdpbmFsTWVzc2FnZSAhPSBudWxsICYmDQotICAgICAgICAgICAgICAgIG9yaWdpbmFsTWVzc2FnZS5zdGFydHNXaXRoKE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSKSAmJg0KLSAgICAgICAgICAgICAgICBvcmlnaW5hbE1lc3NhZ2UuZW5kc1dpdGgoTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIGxhYmVsKQ0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRMYWJlbChsYWJlbCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDViM2E1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2YTQzNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IKLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDI4YzJlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgVHJpbmlkYWQgU3VwcG9ydCBNb2R1bGUNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgVHJpbmlkYWQgU3VwcG9ydCBNb2R1bGUgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZSBwcm92aWRlcyBzcGVjaWFsIFRyaW5pZGFkIFN1cHBvcnQgZm9yIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IuDQotICAgIEZ1cnRoZXJtb3JlLCBpdCBhbGxvd3MgdG8gam9pbiB0aGUgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBtZWNoYW5pc20gb2YgVHJpbmlkYWQuIFNhbXBsZSB1c2UtY2FzZTogYW5ub3RhdGUgeW91ciBtb2RlbCB3aXRoIEpQQSAxLjAgYW5ub3RhdGlvbnMsIGJpbmQgcHJvcGVydGllcyB0byBKU0YgSW5wdXQgY29tcG9uZW50cyBhbmQgZ2V0IGF1dG9tYXRpYyBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIGp1c3QgYnkgYWRkaW5nIDMgSkFSIGZpbGVzIChNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUsIFByb3BlcnR5IFZhbGlkYXRpb24gYW5kIFRyaW5pZGFkIFN1cHBvcnQpLg0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS54IGFuZCBKU0YgMi54LiBBbGwgdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9wb20ueG1sIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3MmJhZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBDb3JlPC9uYW1lPgotICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gICAgCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvY29yZTwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8yX3JjL2NvcmU8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8yX3JjL2NvcmU8L3VybD4KLSAgICA8L3NjbT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvZGVjPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2RlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMzwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMwNDQ3Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDDQotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMC8vRU4iDQotICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWZhY2VzY29uZmlnXzFfMS5kdGQiID4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08ZmFjZXMtY29uZmlnPg0KLSAgICA8ZmFjdG9yeT4NCi0gICAgICAgIDxyZW5kZXIta2l0LWZhY3Rvcnk+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcktpdEZhY3Rvcnk8L3JlbmRlci1raXQtZmFjdG9yeT4NCi0gICAgPC9mYWN0b3J5Pg0KLQ0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuRXh0VmFsU3RhcnR1cExpc3RlbmVyPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYxY2Y5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0V4dFZhbEluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2Q1ZDFjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0V4dFZhbEluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi0NCi0vKioNCi0gKiBkb250J3QgbW92ZSB0byBhbiBvdGhlciBwYWNrYWdlISEhDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRXh0VmFsSW5mb3JtYXRpb24NCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgPSBFeHRWYWxJbmZvcm1hdGlvbi5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlhNTF9QQVJBTV9QUkVGSVggPSBFeHRWYWxJbmZvcm1hdGlvbi5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSBDbGFzc1V0aWxzLmdldEphclZlcnNpb24oRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0N1c3RvbUluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0N1c3RvbUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZGEzOWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9DdXN0b21JbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQ0KLXB1YmxpYyBlbnVtIEN1c3RvbUluZm9ybWF0aW9uDQotew0KLSAgICBCQVNFX1BBQ0tBR0UsDQotDQotICAgIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SLA0KLSAgICBWQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1IsDQotDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCwNCi0gICAgVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFX1JFU09MVkVSX1BPU1RGSVgsDQotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYLA0KLQ0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01TR19SRVNPTFZFUl9OQU1FX01BUFBFUiwNCi0gICAgTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIsDQotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSLA0KLQ0KLSAgICBTVEFSVFVQX0xJU1RFTkVSLA0KLSAgICBDT01QT05FTlRfSU5JVElBTElaRVIsDQotICAgIFZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SLA0KLSAgICBQUk9QRVJUWV9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SLA0KLSAgICBNRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUiwNCi0NCi0gICAgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLA0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksDQotICAgIENPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksDQotICAgIFZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZLA0KLSAgICBWQUxJREFUSU9OX1BBUkFNRVRFUl9GQUNUT1JZLA0KLSAgICBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwNCi0gICAgRkFDRVNfTUVTU0FHRV9GQUNUT1JZLA0KLSAgICBTVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwNCi0NCi0gICAgTUVTU0FHRV9CVU5ETEVfTkFNRSwNCi0gICAgU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFLA0KLQ0KLSAgICBNRVRBX0RBVEFfU1RPUkFHRV9GSUxURVINCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9EZWZhdWx0UHJvamVjdFN0YWdlUmVzb2x2ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYjNjNTQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9EZWZhdWx0UHJvamVjdFN0YWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvamVjdFN0YWdlUmVzb2x2ZXIgaW1wbGVtZW50cyBQcm9qZWN0U3RhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHVibGljIFByb2plY3RTdGFnZSBnZXRDdXJyZW50UHJvamVjdFN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgLy9kb24ndCB1c2UgdGhlIGRlZmF1bHQgZXh0dmFsIG1lY2hhbmlzbSB0byBhdm9pZCB0b28gZWFybHkgZXZhbHVhdGlvbiB3aXRoIG1vamFycmENCi0gICAgICAgIFN0cmluZyByZXN1bHQ7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRJbml0UGFyYW1ldGVyKCJqYXZheC5mYWNlcy5QUk9KRUNUX1NUQUdFIik7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVByb2plY3RTdGFnZShnZXREZWZhdWx0UHJvamVjdFN0YWdlKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwgfHwgIiIuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVByb2plY3RTdGFnZShnZXREZWZhdWx0UHJvamVjdFN0YWdlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZVByb2plY3RTdGFnZShQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKHJlc3VsdC50cmltKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgUHJvamVjdFN0YWdlIGNyZWF0ZVByb2plY3RTdGFnZShQcm9qZWN0U3RhZ2VOYW1lIHByb2plY3RTdGFnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2UocHJvamVjdFN0YWdlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBQcm9qZWN0U3RhZ2VOYW1lIGdldERlZmF1bHRQcm9qZWN0U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0RGVmYXVsdFN0YWdlTmFtZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dC5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyODk1YmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkRlZmF1bHRGYWN0b3J5RmluZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeUZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlJlbmRlcmVySW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXIuUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgRXh0VmFsQ29udGV4dAotewotICAgIHByaXZhdGUgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRXh0VmFsQ29udGV4dCBleHRWYWxDb250ZXh0OwotCi0gICAgLy9kb24ndCB0cnkgdG8gcmVzb2x2ZSBpdCBkeW5hbWljYWxseSBlLmcuIHZpYSBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiAtIHRoZXJlJ3MgYSBtb2phcnJhIGlzc3VlCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9FWFRWQUxfQ09OVEVYVF9DTEFTU19OQU1FID0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuY2xhc3MuZ2V0TmFtZSgpLnJlcGxhY2UoIi5jb3JlLiIsICIuY3VzdG9tLiIpOwotCi0gICAgcHJpdmF0ZSBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7Ci0gICAgcHJpdmF0ZSBGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIgPSBEZWZhdWx0RmFjdG9yeUZpbmRlci5nZXRJbnN0YW5jZSgpOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUmVuZGVyZXJJbnRlcmNlcHRvcj4gcmVuZGVyZXJJbnRlcmNlcHRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlbmRlcmVySW50ZXJjZXB0b3I+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZGVuaWVkSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI+IHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzID0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcj4oKTsKLQotICAgIHByaXZhdGUgU2tpcFZhbGlkYXRpb25FdmFsdWF0b3Igc2tpcFZhbGlkYXRpb25FdmFsdWF0b3I7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2xvYmFsUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLCBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+Pj4gc3RhdGljQ29uZmlnTWFwCi0gICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcywgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4+KCk7Ci0KLSAgICBwcml2YXRlIEV4dFZhbENvbnRleHRJbnRlcm5hbHMgY29udGV4dEhlbHBlcjsKLSAgICBwcml2YXRlIEV4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscyBpbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXI7Ci0KLSAgICBwcm90ZWN0ZWQgRXh0VmFsQ29udGV4dCgpCi0gICAgewotICAgICAgICB0aGlzLmNvbnRleHRIZWxwZXIgPSBuZXcgRXh0VmFsQ29udGV4dEludGVybmFscygpOwotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlciA9IG5ldyBFeHRWYWxDb250ZXh0SW52b2NhdGlvbk9yZGVyQXdhcmVJbnRlcm5hbHModGhpcy5jb250ZXh0SGVscGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEV4dFZhbENvbnRleHQgZ2V0Q29udGV4dCgpCi0gICAgewotICAgICAgICBpZiAoZXh0VmFsQ29udGV4dCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBleHRWYWxDb250ZXh0ID0gbmV3IEV4dFZhbENvbnRleHQoKTsKLQotICAgICAgICAgICAgdHJ5VG9DcmVhdGVDdXN0b21FeHRWYWxDb250ZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGV4dFZhbENvbnRleHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0cnlUb0NyZWF0ZUN1c3RvbUV4dFZhbENvbnRleHQoKQotICAgIHsKLSAgICAgICAgT2JqZWN0IGN1c3RvbUV4dFZhbENvbnRleHQgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoQ1VTVE9NX0VYVFZBTF9DT05URVhUX0NMQVNTX05BTUUpOwotCi0gICAgICAgIGlmIChjdXN0b21FeHRWYWxDb250ZXh0IGluc3RhbmNlb2YgRXh0VmFsQ29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgZXh0VmFsQ29udGV4dCA9IChFeHRWYWxDb250ZXh0KSBjdXN0b21FeHRWYWxDb250ZXh0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcihWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIpCi0gICAgewotICAgICAgICBzZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoCi0gICAgICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIsIGJvb2xlYW4gZm9yY2VPdmVycmlkZSkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLnZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgPT0gbnVsbCB8fCBmb3JjZU92ZXJyaWRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpICYmIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuZ2V0Q2xhc3MoKSArICIgaXMgdXNlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyID0gdmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKQotICAgIHsKLSAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciByZXF1ZXN0U2NvcGVkSW50ZXJwcmV0ZXIgPSB0aGlzLmNvbnRleHRIZWxwZXIKLSAgICAgICAgICAgICAgICAuZ2V0UmVxdWVzdFNjb3BlZFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsKLQotICAgICAgICBpZihyZXF1ZXN0U2NvcGVkSW50ZXJwcmV0ZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RTY29wZWRJbnRlcnByZXRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzLnZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIEZhY3RvcnlGaW5kZXIKLSAgICAqLwotICAgIHB1YmxpYyBGYWN0b3J5RmluZGVyIGdldEZhY3RvcnlGaW5kZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZmFjdG9yeUZpbmRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGYWN0b3J5RmluZGVyKEZhY3RvcnlGaW5kZXIgZmFjdG9yeUZpbmRlcikKLSAgICB7Ci0gICAgICAgIGlmIChmYWN0b3J5RmluZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZmFjdG9yeUZpbmRlciA9IGZhY3RvcnlGaW5kZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoU2tpcFZhbGlkYXRpb25FdmFsdWF0b3Igc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IpCi0gICAgewotICAgICAgICBzZXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcihza2lwVmFsaWRhdGlvbkV2YWx1YXRvciwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoU2tpcFZhbGlkYXRpb25FdmFsdWF0b3Igc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IsIGJvb2xlYW4gZm9yY2VPdmVycmlkZSkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLnNraXBWYWxpZGF0aW9uRXZhbHVhdG9yID09IG51bGwgfHwgZm9yY2VPdmVycmlkZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRoaXMubG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSAmJiBza2lwVmFsaWRhdGlvbkV2YWx1YXRvciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuZ2V0Q2xhc3MoKSArICIgaXMgdXNlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5za2lwVmFsaWRhdGlvbkV2YWx1YXRvciA9IHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIGdldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLnNraXBWYWxpZGF0aW9uRXZhbHVhdG9yID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHNraXBWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksIE1ldGFEYXRhRW50cnkgZW50cnkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzLnNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUmVuZGVyZXJJbnRlcmNlcHRvcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxSZW5kZXJlckludGVyY2VwdG9yPiBnZXRSZW5kZXJlckludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxSZW5kZXJlckludGVyY2VwdG9yPih0aGlzLnJlbmRlcmVySW50ZXJjZXB0b3JzLnZhbHVlcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChFeHRWYWxDb250ZXh0LmNsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGhpcy5kZW5pZWRJbnRlcmNlcHRvcnMuY29udGFpbnMocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy5yZW5kZXJlckludGVyY2VwdG9ycy5wdXQocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCksIHJlbmRlcmVySW50ZXJjZXB0b3IpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlcmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKENsYXNzPD8gZXh0ZW5kcyBSZW5kZXJlckludGVyY2VwdG9yPiByZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpCi0gICAgewotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzcyhyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoRXh0VmFsQ29udGV4dC5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5yZW5kZXJlckludGVyY2VwdG9ycy5yZW1vdmUocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy9pZiBhbiBpbnRlcmNlcHRvciBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkIHNvIGZhciwgaXQgc2hvdWxkIGJlIGRlbmllZCBhdCBmdXR1cmUgcmVnaXN0cmF0aW9ucwotICAgIHB1YmxpYyB2b2lkIGRlbnlSZW5kZXJlckludGVyY2VwdG9yKENsYXNzPD8gZXh0ZW5kcyBSZW5kZXJlckludGVyY2VwdG9yPiByZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpCi0gICAgewotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzcyhyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoRXh0VmFsQ29udGV4dC5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCF0aGlzLmRlbmllZEludGVyY2VwdG9ycy5jb250YWlucyhyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5kZW5pZWRJbnRlcmNlcHRvcnMuYWRkKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZXJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihyZW5kZXJlckludGVyY2VwdG9yQ2xhc3MpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ29tcG9uZW50SW5pdGlhbGl6ZXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIoQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdENvbXBvbmVudEluaXRpYWxpemVycygpOwotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5hZGRDb21wb25lbnRJbml0aWFsaXplcihjb21wb25lbnRJbml0aWFsaXplcik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+IGdldENvbXBvbmVudEluaXRpYWxpemVycygpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdENvbXBvbmVudEluaXRpYWxpemVycygpOwotICAgICAgICByZXR1cm4gdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuZ2V0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPiBnZXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmxhenlJbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhbGwgZ2xvYmFsIHZhbGlkYXRpb24gaW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IGdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IGdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc0ZvcihDbGFzcyBtb2R1bGVLZXkpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzRm9yKG1vZHVsZUtleSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmxhenlJbml0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGFsbCBnbG9iYWwgbWV0YS1kYXRhIGV4dHJhY3Rpb24gaW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc0ZvcihDbGFzcyBtb2R1bGVLZXkpCi0gICAgewotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgICAgICBpZihtb2R1bGVLZXkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCksIG1vZHVsZUtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc1dpdGgocHJvcGVydGllcyk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc1dpdGgoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc1dpdGgocHJvcGVydGllcyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI+IGdldFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciBwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycy5hZGQocHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbgotICAgICAqLwotICAgIHB1YmxpYyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBnZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0SGVscGVyLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTdGF0aWNDb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IGdldFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzIG5hbWUpCi0gICAgewotICAgICAgICBpZiAoIXRoaXMuc3RhdGljQ29uZmlnTWFwLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBzdGF0aWNDb25maWdMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4oKTsKLSAgICAgICAgICAgIHRoaXMuc3RhdGljQ29uZmlnTWFwLnB1dChuYW1lLCBzdGF0aWNDb25maWdMaXN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5zdGF0aWNDb25maWdNYXAuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzIG5hbWUsIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZykKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gc3RhdGljQ29uZmlnTGlzdDsKLSAgICAgICAgICAgIGlmICghdGhpcy5zdGF0aWNDb25maWdNYXAuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5zdGF0aWNDb25maWdNYXAucHV0KG5hbWUsIHN0YXRpY0NvbmZpZ0xpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5zdGF0aWNDb25maWdNYXAuZ2V0KG5hbWUpLmFkZChzdGF0aWNDb25maWcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBHbG9iYWwgcHJvcGVydGllcwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gYWRkR2xvYmFsUHJvcGVydHkobmFtZSwgdmFsdWUsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gZm9yY2VPdmVycmlkZSkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLmdsb2JhbFByb3BlcnRpZXMuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghZm9yY2VPdmVycmlkZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygib3ZlcnJpZGUgZ2xvYmFsIHByb3BlcnR5ICciICsgbmFtZSArICInIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLkRldmVsb3BtZW50KSAmJiB0aGlzLmxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oImdsb2JhbCBwcm9wZXJ0eSBbIiArIG5hbWUgKyAiXSBhZGRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5nbG9iYWxQcm9wZXJ0aWVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0R2xvYmFsUHJvcGVydHkoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5nbG9iYWxQcm9wZXJ0aWVzLmdldChuYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnRlcm5hbHMuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dEludGVybmFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmFlODY3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dEludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBFeHRWYWxDb250ZXh0SW50ZXJuYWxzDQotew0KLSAgICBib29sZWFuIGlzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25BY3RpdmF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gISJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NPTVBPTkVOVF9JTklUSUFMSVpBVElPTik7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gaW5pdEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKE1hcCBhcHBsaWNhdGlvbk1hcCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4pOw0KLSAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzLmFkZChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5DVVNUT01fQkVBTik7DQotDQotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbjsNCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbk1hcC5wdXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FLCBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbik7DQotICAgICAgICAgICAgICAgIHJldHVybiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICB0cnlUb0luaXRDdXN0b21Db25maWd1cmVkSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWUoYXBwbGljYXRpb25NYXApOw0KLQ0KLSAgICAgICAgaWYgKGFwcGxpY2F0aW9uTWFwLmNvbnRhaW5zS2V5KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgYXBwbGljYXRpb25NYXAuZ2V0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgdm9pZCB0cnlUb0luaXRDdXN0b21Db25maWd1cmVkSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWUoTWFwIGFwcGxpY2F0aW9uTWFwKQ0KLSAgICB7DQotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBiZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgIC5nZXRCZWFuKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkNVU1RPTV9CRUFOLnJlcGxhY2UoIi4iLCAiXyIpKTsNCi0NCi0gICAgICAgIGlmIChiZWFuICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgYXBwbGljYXRpb25NYXAucHV0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSwgYmVhbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICB7DQotICAgICAgICBNYXAgYXBwbGljYXRpb25NYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25NYXAoKTsNCi0gICAgICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGJlYW4gPSAoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4pIGFwcGxpY2F0aW9uTWFwLmdldChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUpOw0KLQ0KLSAgICAgICAgaWYgKGJlYW4gPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gaW5pdEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKGFwcGxpY2F0aW9uTWFwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBiZWFuOw0KLSAgICB9DQotDQotICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgZ2V0UmVxdWVzdFNjb3BlZFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZSgNCi0gICAgICAgICAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuY2xhc3MsIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSkNCi0gICAgICAgICAgICAgICAgLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscy5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0SW52b2NhdGlvbk9yZGVyQXdhcmVJbnRlcm5hbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNjNjVlNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBFeHRWYWxDb250ZXh0SW52b2NhdGlvbk9yZGVyQXdhcmVJbnRlcm5hbHMNCi17DQotICAgIHByaXZhdGUgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyA9IG51bGw7DQotICAgIHByaXZhdGUgTWFwPENsYXNzLCBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPj4gbW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMgPSBudWxsOw0KLSAgICBwcml2YXRlIExpc3Q8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPiB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPSBudWxsOw0KLSAgICBwcml2YXRlIE1hcDxDbGFzcywgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4+IG1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPiBjb21wb25lbnRJbml0aWFsaXplcnMgPSBudWxsOw0KLQ0KLSAgICBwcml2YXRlIEV4dFZhbENvbnRleHRJbnRlcm5hbHMgY29udGV4dEhlbHBlcjsNCi0NCi0gICAgRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzKEV4dFZhbENvbnRleHRJbnRlcm5hbHMgY29udGV4dEhlbHBlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb250ZXh0SGVscGVyID0gY29udGV4dEhlbHBlcjsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBDb21wb25lbnRJbml0aWFsaXplcnMNCi0gICAgICovDQotICAgIHZvaWQgYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIoQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChjb21wb25lbnRJbml0aWFsaXplcik7DQotICAgICAgICBzb3J0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7DQotICAgIH0NCi0NCi0gICAgTGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4gZ2V0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dEhlbHBlci5pc0NvbXBvbmVudEluaXRpYWxpemF0aW9uQWN0aXZhdGVkKCkgPw0KLSAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudEluaXRpYWxpemVycyA6IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+KCk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycw0KLSAgICAgKi8NCi0gICAgdm9pZCBhZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcikNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzLmFkZCh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpOw0KLSAgICAgICAgc29ydFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsNCi0gICAgfQ0KLQ0KLSAgICBMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4gZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnM7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzDQotICAgICAqLw0KLSAgICB2b2lkIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKQ0KLSAgICB7DQotICAgICAgICBpZiAocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uTW9kdWxlQXdhcmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGVzKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsNCi0gICAgICAgICAgICBzb3J0TW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckZvck1vZHVsZShudWxsLCBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7DQotICAgICAgICAgICAgc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IGdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yczsNCi0gICAgfQ0KLQ0KLSAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBnZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IoQ2xhc3MgbW9kdWxlS2V5KQ0KLSAgICB7DQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPigpOw0KLQ0KLSAgICAgICAgcmVzdWx0LmFkZEFsbChnZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKSk7DQotDQotICAgICAgICBpZiAobW9kdWxlS2V5ICE9IG51bGwgJiYgdGhpcy5tb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5jb250YWluc0tleShtb2R1bGVLZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodGhpcy5tb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5nZXQobW9kdWxlS2V5KSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdChyZXN1bHQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckZvck1vZHVsZXMoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpDQotICAgIHsNCi0gICAgICAgIENsYXNzIG1vZHVsZUtleTsNCi0gICAgICAgIGZvciAoU3RyaW5nIGN1cnJlbnRNb2R1bGVLZXkgOiAoKFZhbGlkYXRpb25Nb2R1bGVBd2FyZSkgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpLmdldE1vZHVsZUtleXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtb2R1bGVLZXkgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShjdXJyZW50TW9kdWxlS2V5KTsNCi0NCi0gICAgICAgICAgICBpZiAobW9kdWxlS2V5ID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUobW9kdWxlS2V5LCBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlKA0KLSAgICAgICAgICAgIENsYXNzIG1vZHVsZUtleSwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpDQotICAgIHsNCi0gICAgICAgIGlmIChtb2R1bGVLZXkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5hZGQocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOw0KLQ0KLSAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQgYXMgZ2xvYmFsIGludGVyY2VwdG9yIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdDsNCi0gICAgICAgICAgICBpZiAodGhpcy5tb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5jb250YWluc0tleShtb2R1bGVLZXkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0ID0gdGhpcy5tb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5nZXQobW9kdWxlS2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4oKTsNCi0gICAgICAgICAgICAgICAgdGhpcy5tb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5wdXQobW9kdWxlS2V5LCBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QuYWRkKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsNCi0NCi0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIGZvciAiICsgbW9kdWxlS2V5LmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycw0KLSAgICAgKi8NCi0gICAgdm9pZCBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcikNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uTW9kdWxlQXdhcmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGVzKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsNCi0gICAgICAgICAgICBzb3J0TW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckZvck1vZHVsZShudWxsLCBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7DQotICAgICAgICAgICAgc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckZvck1vZHVsZXMoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpDQotICAgIHsNCi0gICAgICAgIENsYXNzIG1vZHVsZUtleTsNCi0gICAgICAgIGZvciAoU3RyaW5nIGN1cnJlbnRNb2R1bGVLZXkgOiAoKFZhbGlkYXRpb25Nb2R1bGVBd2FyZSkgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpLmdldE1vZHVsZUtleXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtb2R1bGVLZXkgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShjdXJyZW50TW9kdWxlS2V5KTsNCi0NCi0gICAgICAgICAgICBpZiAobW9kdWxlS2V5ID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUobW9kdWxlS2V5LCBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlKA0KLSAgICAgICAgICAgIENsYXNzIG1vZHVsZUtleSwgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpDQotICAgIHsNCi0gICAgICAgIGlmIChtb2R1bGVLZXkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLm1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5hZGQobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpOw0KLQ0KLSAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQgYXMgZ2xvYmFsIGludGVyY2VwdG9yIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdDsNCi0gICAgICAgICAgICBpZiAodGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5jb250YWluc0tleShtb2R1bGVLZXkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0ID0gdGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5nZXQobW9kdWxlS2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4oKTsNCi0gICAgICAgICAgICAgICAgdGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5wdXQobW9kdWxlS2V5LCBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QuYWRkKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsNCi0NCi0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIGZvciAiICsgbW9kdWxlS2V5LmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yczsNCi0gICAgfQ0KLQ0KLSAgICBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnNXaXRoKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4oKTsNCi0NCi0gICAgICAgIHJlc3VsdC5hZGRBbGwoZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkpOw0KLQ0KLSAgICAgICAgQ2xhc3MgbW9kdWxlS2V5ID0gdHJ5VG9SZXNvbHZlTW9kdWxlS2V5KHByb3BlcnRpZXMpOw0KLSAgICAgICAgaWYobW9kdWxlS2V5ICE9IG51bGwgJiYgdGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5jb250YWluc0tleShtb2R1bGVLZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5nZXQobW9kdWxlS2V5KSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdChyZXN1bHQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3MgdHJ5VG9SZXNvbHZlTW9kdWxlS2V5KE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgbW9kdWxlS2V5ID0gbnVsbDsNCi0gICAgICAgIGlmKHByb3BlcnRpZXMgIT0gbnVsbCAmJiBwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBPYmplY3QgZm91bmRWYWx1ZSA9IHByb3BlcnRpZXMuZ2V0KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICBpZihmb3VuZFZhbHVlIGluc3RhbmNlb2YgQ2xhc3MpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtb2R1bGVLZXkgPSAoQ2xhc3MpZm91bmRWYWx1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbW9kdWxlS2V5Ow0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGluaXQNCi0gICAgICovDQotDQotICAgIHZvaWQgbGF6eUluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+KCk7DQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IpOw0KLSAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKHRoaXMuY29udGV4dEhlbHBlci5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldCgNCi0gICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUikpOw0KLQ0KLSAgICAgICAgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUgOiB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA9DQotICAgICAgICAgICAgICAgICAgICAoVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycy5hZGQodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHZvaWQgbGF6eUluaXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKQ0KLSAgICB7DQotICAgICAgICBpZiAobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4oKTsNCi0gICAgICAgIG1vZHVsZVNwZWNpZmljTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzID0gbmV3IEhhc2hNYXA8Q2xhc3MsIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+PigpOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzDQotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUik7DQotICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMNCi0gICAgICAgICAgICAgICAgLmFkZCh0aGlzLmNvbnRleHRIZWxwZXIuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoDQotICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IpKTsNCi0NCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSA6IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciA9DQotICAgICAgICAgICAgICAgICAgICAoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgdm9pZCBsYXp5SW5pdENvbXBvbmVudEluaXRpYWxpemVycygpDQotICAgIHsNCi0gICAgICAgIGlmIChjb21wb25lbnRJbml0aWFsaXplcnMgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMgPSBuZXcgQXJyYXlMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPigpOw0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzDQotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9DT01QT05FTlRfSU5JVElBTElaRVIpOw0KLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzDQotICAgICAgICAgICAgICAgIC5hZGQodGhpcy5jb250ZXh0SGVscGVyLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9JTklUSUFMSVpFUikpOw0KLQ0KLSAgICAgICAgQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXI7DQotICAgICAgICBmb3IgKFN0cmluZyBjb21wb25lbnRJbml0aWFsaXplck5hbWUgOiBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXIgPQ0KLSAgICAgICAgICAgICAgICAgICAgKENvbXBvbmVudEluaXRpYWxpemVyKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY29tcG9uZW50SW5pdGlhbGl6ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoY29tcG9uZW50SW5pdGlhbGl6ZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQoY29tcG9uZW50SW5pdGlhbGl6ZXIpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShjb21wb25lbnRJbml0aWFsaXplci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICB2b2lkIGxhenlJbml0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkNCi0gICAgew0KLSAgICAgICAgaWYgKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+KCk7DQotICAgICAgICBtb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycyA9IG5ldyBIYXNoTWFwPENsYXNzLCBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPj4oKTsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICB2YWxpZGF0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzDQotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9QUk9QRVJUWV9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SKTsNCi0gICAgICAgIHZhbGlkYXRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMNCi0gICAgICAgICAgICAgICAgLmFkZCh0aGlzLmNvbnRleHRIZWxwZXIuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoDQotICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tSW5mb3JtYXRpb24uUFJPUEVSVFlfVkFMSURBVElPTl9JTlRFUkNFUFRPUikpOw0KLQ0KLSAgICAgICAgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uSW50ZXJjZXB0b3JOYW1lIDogdmFsaWRhdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA9DQotICAgICAgICAgICAgICAgICAgICAoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uSW50ZXJjZXB0b3JOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBpbnN0YW5jZW9mIFZhbGlkYXRpb25Nb2R1bGVBd2FyZSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGVzKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlKG51bGwsIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBzb3J0DQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgc29ydENvbXBvbmVudEluaXRpYWxpemVycygpDQotICAgIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQodGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMsIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPENvbXBvbmVudEluaXRpYWxpemVyPigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpDQotICAgIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQodGhpcy5wcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMsDQotICAgICAgICAgICAgICAgIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPigpKTsNCi0gICAgfQ0KLQ0KLSAgICAvL3NvcnQgYWxsIC0gaXQgaXNuJ3QgYSBodWdlIG92ZXJoZWFkIHNpbmNlIGl0J3MganVzdCBkb25lIGR1cmluZyB0aGUgaW5pdC1waGFzZQ0KLSAgICBwcml2YXRlIHZvaWQgc29ydE1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkNCi0gICAgew0KLSAgICAgICAgZm9yKExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdCA6DQotICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMudmFsdWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdChwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdCgNCi0gICAgICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QpDQotICAgIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+KCkpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc29ydFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQ0KLSAgICB7DQotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRoaXMudmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycywNCi0gICAgICAgICAgICAgICAgbmV3IEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpDQotICAgIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQodGhpcy5tZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMsDQotICAgICAgICAgICAgICAgIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPigpKTsNCi0gICAgfQ0KLQ0KLSAgICAvL3NvcnQgYWxsIC0gaXQgaXNuJ3QgYSBodWdlIG92ZXJoZWFkIHNpbmNlIGl0J3MganVzdCBkb25lIGR1cmluZyB0aGUgaW5pdC1waGFzZQ0KLSAgICBwcml2YXRlIHZvaWQgc29ydE1vZHVsZVNwZWNpZmljTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkNCi0gICAgew0KLSAgICAgICAgZm9yKExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdCA6DQotICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMudmFsdWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdCgNCi0gICAgICAgICAgICBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QpDQotICAgIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+KCkpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NTg3YTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFyZW4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICogKyBzb21lIG9mIHRoZW0gY2FuIGJlIGN1c3RvbWl6ZWQgd2l0aGluIGEgY3VzdG9tIGltcGwuIG9mIHRoZSBiZWFuDQotICogKGV4dGVuZCB0aGlzIGNsYXNzIGFuZCBwcm92aWRlIGl0IHZpYSBjb252ZW50aW9uIG9yIHdlYi54bWwpDQotICogPHAvPg0KLSAqIHRoZSBzdGF0aWMgYXBpIHNob3VsZCBvbmx5IGJlIHVzZWQNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSSwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVBTl9OQU1FID0gRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUNCi0gICAgICAgICsgIi4iICsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICAvL2N1c3RvbSBjbGFzcyB3aGljaCBpcyBhbiBvcHRpb25hbCByZXBsYWNlbWVudCBmb3IgdGhpcyBjbGFzcyAoaGFzIHRvIGV4dGVuZCB0aGlzIGNsYXNzKQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQkVBTiA9IChFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRQ0KLSAgICAgICAgKyAiLmN1c3RvbS4iICsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsNCi0NCi0gICAgcHVibGljIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHNldHVwQ3VzdG9taXphYmxlSW5mb3JtYXRpb24oKTsNCi0gICAgICAgIGFwcGx5Q3VzdG9tVmFsdWVzKHRoaXMuY3VzdG9taXphYmxlSW5mb3MpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPEN1c3RvbUluZm9ybWF0aW9uLCBTdHJpbmc+IGN1c3RvbWl6YWJsZUluZm9zID0gbmV3IEhhc2hNYXA8Q3VzdG9tSW5mb3JtYXRpb24sIFN0cmluZz4oKTsNCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwQ3VzdG9taXphYmxlSW5mb3JtYXRpb24oKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgYmFzZVBhY2thZ2UgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0JBU0VfUEFDS0FHRTsNCi0NCi0gICAgICAgIGlmIChiYXNlUGFja2FnZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VQYWNrYWdlID0gRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgKyAiLmN1c3RvbS4iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFiYXNlUGFja2FnZS5lbmRzV2l0aCgiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VQYWNrYWdlID0gYmFzZVBhY2thZ2UgKyAiLiI7DQotICAgICAgICB9DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQkFTRV9QQUNLQUdFLCBiYXNlUGFja2FnZSk7DQotICAgICAgICANCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiwNCi0gICAgICAgICAgICAgICAgIkNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFUcmFuc2Zvcm1lciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX0lOSVRJQUxJWkVSLA0KLSAgICAgICAgICAgICAgICAiQ29tcG9uZW50SW5pdGlhbGl6ZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlBST1BFUlRZX1ZBTElEQVRJT05fSU5URVJDRVBUT1IsDQotICAgICAgICAgICAgICAgICJQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01TR19SRVNPTFZFUl9OQU1FX01BUFBFUiwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIsDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVJUVVBfTElTVEVORVIsDQotICAgICAgICAgICAgICAgICJTdGFydHVwTGlzdGVuZXIiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkZBQ0VTX01FU1NBR0VfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIkZhY2VzTWVzc2FnZUZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIlN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSIpOw0KLQ0KLSAgICAgICAgLy9jb252ZW50aW9ucyAodGhlIHJlc3Qgb2YgdGhlIGNvbnZlbnRpb25zIGFyZSBidWlsdCB3aXRoIHRoZSBoZWxwIG9mIG5hbWUgbWFwcGVycywuLi4NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX0JVTkRMRV9OQU1FLA0KLSAgICAgICAgICAgICAgICAidmFsaWRhdGlvbl9tZXNzYWdlcyIpOw0KLSAgICAgICAgLy9zdGF0aWMgc3RyYXRlZ3kgbWFwcGluZ3MgKG5hbWUgb2YgcHJvcGVydHkgZmlsZXMpDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFLA0KLSAgICAgICAgICAgICAgICAic3RyYXRlZ3lfbWFwcGluZ3MiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIsDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIiKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pDQotICAgIHByb3RlY3RlZCB2b2lkIGFwcGx5Q3VzdG9tVmFsdWVzKE1hcDxDdXN0b21JbmZvcm1hdGlvbiwgU3RyaW5nPiBtYXApDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgdG8gY3VzdG9taXplIGluZm9ybWF0aW9uDQotICAgIH0NCi0NCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXQoQ3VzdG9tSW5mb3JtYXRpb24gY3VzdG9tSW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGN1c3RvbWl6YWJsZUluZm9zLmdldChjdXN0b21JbmZvcm1hdGlvbik7DQotDQotICAgICAgICBzd2l0Y2ggKGN1c3RvbUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNhc2UgQkFTRV9QQUNLQUdFOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgKiBwb3N0Zml4IHVzZWQgYnkgdGhlIFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi0gICAgICAgICAgICAgKiB0aGUgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBpcyBmb3IgY3VzdG9tIHN0cmF0ZWdpZXMgb25seQ0KLSAgICAgICAgICAgICAqIChub3QgZm9yIHB1YmxpYyB2YWxpZGF0aW9uIG1vZHVsZXMpDQotICAgICAgICAgICAgICogc28gaXQncyBmaW5lIHRvIGN1c3RvbWl6ZSBpdA0KLSAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgY2FzZSBWQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVg6DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0NCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9taXphYmxlSW5mb3MuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkJBU0VfUEFDS0FHRSkgKyB2YWx1ZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOWY4NjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2R1bGVNZXNzYWdlQnVuZGxlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuZXdQYWNrYWdlTmFtZTsNCi0gICAgICAgIGlmIChwYWNrYWdlTmFtZS5lbmRzV2l0aCgiLnJlc29sdmVyIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgbmV3UGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZS5yZXBsYWNlKCIucmVzb2x2ZXIiLCAiLmJ1bmRsZSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5ld1BhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUucmVwbGFjZSgiLnJlc29sdmVyLiIsICIuYnVuZGxlLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG5ld1BhY2thZ2VOYW1lICsgIi52YWxpZGF0aW9uX21lc3NhZ2VzIjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKA0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsICIubWVzc2FnZS5yZXNvbHZlci4iLCB0YXJnZXRDbGFzc05hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoDQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgU3RyaW5nIHRhcmdldENsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgIi5tZXRhZGF0YS50cmFuc2Zvcm1lci4iLCB0YXJnZXRDbGFzc05hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UGFja2FnZU5hbWUsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXROYW1lKCk7DQotDQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUucmVwbGFjZSgiLnN0cmF0ZWd5LiIsIHRhcmdldFBhY2thZ2VOYW1lKTsNCi0NCi0gICAgICAgIGlmICh0YXJnZXRDbGFzc05hbWUgPT0gbnVsbCB8fCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSkgKyAiLiIgKyB0YXJnZXRDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHVzZSBhIGN1c3RvbSBuYW1lIG1hcHBlciB0byBpbXBsZW1lbnQgY3VzdG9tIGNvbnZlbnRpb25zDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgIlZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB1c2UgYSBjdXN0b20gbmFtZSBtYXBwZXIgdG8gaW1wbGVtZW50IGN1c3RvbSBjb252ZW50aW9ucw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5LnJlcGxhY2UoIi5hbm5vdGF0aW9uLiIsICIuc3RyYXRlZ3kuIikgKyAiU3RyYXRlZ3kiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgIk1ldGFEYXRhVHJhbnNmb3JtZXIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0YXJnZXRQb3N0Zml4KQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5lbmRzV2l0aCgiVmFsaWRhdGlvblN0cmF0ZWd5IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneU5hbWUuc3Vic3RyaW5nKDAsIHZhbGlkYXRpb25TdHJhdGVneU5hbWUubGVuZ3RoKCkgLSAxOCkgKyB0YXJnZXRQb3N0Zml4Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5lbmRzV2l0aCgiU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5zdWJzdHJpbmcoMCwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5sZW5ndGgoKSAtIDgpICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RmZmFkOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7DQotDQotQFRhcmdldChUWVBFKQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLS8qKg0KLSAqIGFsbG93ZWQgdG8gdXNlIGZvciBjbGFzc2VzIHdoaWNoIGltcGxlbWVudCBpbnRlcmZhY2VzIHdoaWNoIGhhdmUgdGhlIG1hcmtlciBASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLSAqDQotICogc3VnZ2VzdGVkIHJhbmdlcyAobWFpbmx5IGZvciBuYW1lLW1hcHBlcnMpOg0KLSAqIG5lZ2F0aXZlIHZhbHVlcyBmb3IgImV4dHJlbWUiIGNhc2VzDQotICoNCi0gKiAwLTQ5IGZvciBjdXN0b20gYXJ0aWZhY3RzIHdoaWNoIHNob3VsZCBoYXZlIHRoZSBoaWdoZXN0IHByaW9yaXR5DQotICogNTAtOTkgZm9yIGFkZC1vbnMgd2hpY2ggcHJvdmlkZSBhcnRpZmFjdHMgd2hpY2ggc2hvdWxkIGhhdmUgYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGUgZGVmYXVsdCBhcnRpZmFjdHMNCi0gKiAxMDAtOTk5IGludGVybmFsIGFydGlmYWN0cw0KLSAqIDEwMDArIGZvciBjdXN0b20gYXJ0aWZhY3RzDQotICoNCi0gKiBzdWdnZXN0ZWQgcmFuZ2VzIGZvciBhcnRpZmFjdHMgbGlrZSBpbnRlcmNlcHRvcnMsLi4uDQotICogMXh4IC4uLiBhcnRpZmFjdHMgb2YgdGhlIGNvcmUNCi0gKiAyeHggLi4uIGFydGlmYWN0cyBvZiB2YWxpZGF0aW9uIG1vZHVsZXMNCi0gKiAzeHggLi4uIGFydGlmYWN0cyBvZiBjb21wb25lbnQgc3VwcG9ydCBtb2R1bGVzDQotICoNCi0gKiBhIHByaW9yaXR5IHNob3VsZCBiZSB1bmlxdWUgd2l0aGluIG9uZSBhcnRpZmFjdC10eXBlIC0gdGhhdCBtZWFucw0KLSAqIGlmIGEgbmFtZS1tYXBwZXIgaGFzIHByaW9yaXR5IDEwMCwgaXQncyBvayB0aGF0IGFuIGV4Y2VwdGlvbi1pbnRlcmNlcHRvciBhbHNvIGhhcyBwcmlvcml0eSAxMDAuDQotICogYnV0IGEgMm5kIG5hbWUtbWFwcGVyIHNob3VsZG4ndCBoYXZlIHByaW9yaXR5IDEwMA0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgSW52b2NhdGlvbk9yZGVyDQotew0KLSAgICAvKioNCi0gICAgICogZGVmYXVsdCBwcmlvcml0eSBmb3IgY3VzdG9tIGFydGlmYWN0cyAoaWYgdGhleSBzaG91bGQgZ2V0IGFkZGVkIGFmdGVyIHRoZSBpbnRlcm5hbCB2ZXJzaW9ucw0KLSAgICAgKiBAcmV0dXJuIHRoZSBwcmlvcml0eSBvZiBhbiBhcnRpZmFjdCBhbm5vdGF0ZWQgd2l0aCB0aGlzIGFubm90YXRpb24NCi0gICAgICovDQotICAgIGludCB2YWx1ZSgpIGRlZmF1bHQgMTAwMDsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlckNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE4MDcxZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlckNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8VD4gaW1wbGVtZW50cyBDb21wYXJhdG9yPFQ+DQotew0KLSAgICBwdWJsaWMgaW50IGNvbXBhcmUoVCBubTEsIFQgbm0yKQ0KLSAgICB7DQotICAgICAgICBpZiAoaGFzUHJpb3JpdHkobm0xKSAmJiBoYXNQcmlvcml0eShubTIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBpc1ByaW9yaXR5SGlnaGVyKG5tMS5nZXRDbGFzcygpLmdldEFubm90YXRpb24oSW52b2NhdGlvbk9yZGVyLmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgIG5tMi5nZXRDbGFzcygpLmdldEFubm90YXRpb24oSW52b2NhdGlvbk9yZGVyLmNsYXNzKSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWhhc1ByaW9yaXR5KG5tMSkgJiYgIWhhc1ByaW9yaXR5KG5tMikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gaGFzUHJpb3JpdHkobm0xKSA/IC0xIDogMTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGludCBpc1ByaW9yaXR5SGlnaGVyKEludm9jYXRpb25PcmRlciBwcmlvcml0eTEsIEludm9jYXRpb25PcmRlciBwcmlvcml0eTIpDQotICAgIHsNCi0gICAgICAgIGlmIChwcmlvcml0eTEudmFsdWUoKSA9PSBwcmlvcml0eTIudmFsdWUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBwcmlvcml0eTEudmFsdWUoKSA8IHByaW9yaXR5Mi52YWx1ZSgpID8gLTEgOiAxOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNQcmlvcml0eShPYmplY3Qgbm0pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBubS5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoSW52b2NhdGlvbk9yZGVyLmNsYXNzKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlclN1cHBvcnQuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDM0ZTc5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi0NCi1AVGFyZ2V0KFRZUEUpDQotQERvY3VtZW50ZWQNCi0vKioNCi0gKiBtYXJrZXIgYW5ub3RhdGlvbiBmb3IgZWFzaWVyIHVzYWdlDQotICogaXQgbWFya3MgaW50ZXJmYWNlcyAtIGluc3RhbmNlcyBvZiBjbGFzc2VzIGltcGxlbWVudGluZyB0aGVzZSBpbnRlcmZhY2VzIHdpbGwgYmUgc29ydGVkDQotICogQHNlZSBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotew0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0pzZlByb2plY3RTdGFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Kc2ZQcm9qZWN0U3RhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiMzBiYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0pzZlByb2plY3RTdGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBwcm9qZWN0IHN0YWdlIGVxdWl2YWxlbnQgdG8ganNmIDIuMA0KLSAqIGV4dHZhbCAyLnggaGFzIGEgc3BlY2lhbCByZXNvbHZlciB3aGljaCByZWRpcmVjdHMgdGhlIGNhbGwgdG8gdGhlIG5ldyBqc2YgYXBpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBlbnVtIEpzZlByb2plY3RTdGFnZQ0KLXsNCi0gICAgRGV2ZWxvcG1lbnQoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZSgiRGV2ZWxvcG1lbnQiKSksDQotICAgIFVuaXRUZXN0KFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoIlVuaXRUZXN0IikpLA0KLSAgICBTeXN0ZW1UZXN0KFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoIlN5c3RlbVRlc3QiKSksDQotICAgIFByb2R1Y3Rpb24oUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZSgiUHJvZHVjdGlvbiIpKTsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0U3RhZ2VOYW1lIHZhbHVlOw0KLQ0KLSAgICBKc2ZQcm9qZWN0U3RhZ2UoUHJvamVjdFN0YWdlTmFtZSB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpcyhKc2ZQcm9qZWN0U3RhZ2UganNmUHJvamVjdFN0YWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUHJvamVjdFN0YWdlLmlzKGpzZlByb2plY3RTdGFnZS5nZXRWYWx1ZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvamVjdFN0YWdlTmFtZSBnZXRWYWx1ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnZhbHVlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvTmVzdGVkLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL05lc3RlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDY5MWU4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvTmVzdGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi0NCi0vKioNCi0gKiBtYXJrZXIgYW5ub3RhdGlvbiBlLmcuIHRvIG1hcmsgc3ViLW5hbWUtbWFwcGVycw0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBOZXN0ZWQNCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUGhhc2VJZFJlY29yZGluZ1BoYXNlTGlzdGVuZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUGhhc2VJZFJlY29yZGluZ1BoYXNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY5NTU0Mi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1BoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5GYWNlc0luZm9ybWF0aW9uU3RvcmFnZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi0NCi0vKioNCi0gKiBlLmcuIHRvIGFsbG93IGluIG1ldGFkYXRhIGV4dHJhY3Rpb24gaW50ZXJjZXB0b3JzIHRvIGtub3cgaWYgdGhleSBhcmUgaW52b2tlZCBkdXJpbmcgdmFsaWRhdGlvbiBvcg0KLSAqIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbiAoaWYgbmVlZGVkKQ0KLSAqIGV4YW1wbGU6IGNsaWVudC1zaWRlIHZhbGlkYXRpb24gLSBzb21lIGZ1bmN0aW9uYWxpdHkgc2hvdWxkbid0IGJlIHByb2Nlc3NlZCBkdXJpbmcgcmVuZGVyaW5nDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQaGFzZUlkUmVjb3JkaW5nUGhhc2VMaXN0ZW5lciBpbXBsZW1lbnRzIFBoYXNlTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI3OTEyNDA1MTQwMTQ4Njc0NTdMOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgcGhhc2VFdmVudCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgcGhhc2VFdmVudCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UgZmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UgPSBFeHRWYWxVdGlscw0KLSAgICAgICAgICAgICAgICAuZ2V0U3RvcmFnZShGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5jbGFzcywgRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLnNldEN1cnJlbnRQaGFzZUlkKHBoYXNlRXZlbnQuZ2V0UGhhc2VJZCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuQU5ZX1BIQVNFOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKHRoaXMgPT0gbykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBQaGFzZUlkUmVjb3JkaW5nUGhhc2VMaXN0ZW5lcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhNDQ0ZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotLyoqDQotICogZXh0ZW5zaWJsZSBwcm9qZWN0IHN0YWdlIGltcGxlbWVudGF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0U3RhZ2UNCi17DQotICAgIHByaXZhdGUgUHJvamVjdFN0YWdlTmFtZSB2YWx1ZTsNCi0NCi0gICAgcHJpdmF0ZSBQcm9qZWN0U3RhZ2UoUHJvamVjdFN0YWdlTmFtZSB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdFN0YWdlTmFtZSBjcmVhdGVTdGFnZU5hbWUoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVQcm9qZWN0U3RhZ2VOYW1lKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdFN0YWdlIGNyZWF0ZVN0YWdlKFByb2plY3RTdGFnZU5hbWUgbmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBQcm9qZWN0U3RhZ2UobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzKFByb2plY3RTdGFnZU5hbWUgcHJvamVjdFN0YWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0Q3VycmVudFByb2plY3RTdGFnZSgpLmVxdWFscyhwcm9qZWN0U3RhZ2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFByb2plY3RTdGFnZU5hbWUgZ2V0Q3VycmVudFByb2plY3RTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIC8vc2V0IFByb2plY3RTdGFnZVJlc29sdmVyIHRvIG51bGwgdG8gdHdlYWsgdGhlIHBlcmZvcm1hbmNlDQotICAgICAgICBPYmplY3QgcHJvamVjdFN0YWdlUmVzb2x2ZXIgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0R2xvYmFsUHJvcGVydHkoUHJvamVjdFN0YWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGlmKHByb2plY3RTdGFnZVJlc29sdmVyIGluc3RhbmNlb2YgUHJvamVjdFN0YWdlUmVzb2x2ZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICgoUHJvamVjdFN0YWdlUmVzb2x2ZXIpcHJvamVjdFN0YWdlUmVzb2x2ZXIpLmdldEN1cnJlbnRQcm9qZWN0U3RhZ2UoKS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldERlZmF1bHRTdGFnZU5hbWUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvamVjdFN0YWdlTmFtZSBnZXRWYWx1ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnZhbHVlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvamVjdFN0YWdlTmFtZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VOYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMjJiODYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBQcm9qZWN0U3RhZ2VOYW1lDQotew0KLSAgICBTdHJpbmcgZ2V0TmFtZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NGYyN2EuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvamVjdFN0YWdlUmVzb2x2ZXINCi17DQotICAgIFByb2plY3RTdGFnZSBnZXRDdXJyZW50UHJvamVjdFN0YWdlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvVmFsaWRhdGlvbk1vZHVsZUF3YXJlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1ZhbGlkYXRpb25Nb2R1bGVBd2FyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTQyMGY1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvVmFsaWRhdGlvbk1vZHVsZUF3YXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGlmIGFuIGFydGlmYWN0ICh3aGljaCBzdXBwb3J0cyB0aGlzIGNvbmNlcHQpIHNob3VsZCBiZSB1c2VkIGp1c3QgZm9yIGEvc29tZSBzcGVjaWZpYyBtb2R1bGUocyksDQotICogdGhlIGFydGlmYWN0IGhhcyB0byBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvbk1vZHVsZUF3YXJlDQotew0KLSAgICAvKioNCi0gICAgICogZHVyaW5nIHRoZSByZWdpc3RyYXRpb24gcHJvY2VzcyB0aGUgaW5mb3JtYXRpb24gZ2V0cyBldmFsdWF0ZWQ8YnIvPg0KLSAgICAgKiBpbnN0ZWFkIG9mIGEgY2xhc3MgYXJyYXkgYSBzdHJpbmcgYXJyYXkgaXMgdXNlZCBzbyB0aGF0IGl0J3MgcG9zc2libGUgdG8gaW1wbGVtZW50DQotICAgICAqIGFuIGFydGlmYWN0IGZvciBkaWZmZXJlbnQgbW9kdWxlcy4gaWYgYW4gYWRkLW9uIHJlc3RyaWN0cyBhbiBhcnRpZmFjdCB0byBzcGVjaWZpYyBtb2R1bGVzLA0KLSAgICAgKiBub3QgYWxsIG1vZHVsZXMgaGF2ZSB0byBiZSB1c2VkIGJ5IHRoZSB3ZWJhcHAuIGlmIGEgbW9kdWxlIGtleSBpcyB1bmtub3duLCB0aGUgYXJ0aWZhY3Qgd29uJ3QgZ2V0IHJlZ2lzdGVyZWQNCi0gICAgICogZm9yIHRoaXMgbW9kdWxlLiBpZiBhbiBhcnRpZmFjdCBkb2Vzbid0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgaXQgZ2V0cyByZWdpc3RlcmVkIGZvciBhbGwgbW9kdWxlcw0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lcyBvZiB0aGUgbW9kdWxlIGtleXMNCi0gICAgICovDQotICAgIFN0cmluZ1tdIGdldE1vZHVsZUtleXMoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9WYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1ZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1MzQwZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1ZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLQ0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi0vKioNCi0gKiBtYXJrZXIgYW5ub3RhdGlvbiBmb3IgbW9kdWxlIGtleXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFZhbGlkYXRpb25Nb2R1bGVLZXkNCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGRiNzBlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcmVuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgLyoNCi0gICAgICogbWlzYw0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVTU0FHRV9CVU5ETEUgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVNTQUdFX0JVTkRMRSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX1BBQ0tBR0UgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9CQVNFX1BBQ0tBR0UiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fSU5GT1JNQVRJT05fUFJPVklERVJfQkVBTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OX1NUUkFURUdZX01BUFBJTkciKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fUFJPUEVSVFlfVkFMSURBVElPTl9JTlRFUkNFUFRPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1BST1BFUlRZX1ZBTElEQVRJT05fSU5URVJDRVBUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9QUk9YWV9IRUxQRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9QUk9YWV9IRUxQRVIiKTsNCi0NCi0gICAgLyoNCi0gICAgICogbmFtZSBtYXBwZXINCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIiKTsNCi0NCi0gICAgLyoNCi0gICAgICogZmlsdGVyDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIiKTsNCi0gICAgDQotICAgIC8qDQotICAgICAqIGZhY3Rvcmllcw0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9GQUNFU19NRVNTQUdFX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9GQUNFU19NRVNTQUdFX0ZBQ1RPUlkiKTsNCi0NCi0gICAgLyoNCi0gICAgICogYWN0aXZhdGUNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZBVEVfUkVRVUlSRURfSU5JVElBTElaQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkFDVElWQVRFX1JFUVVJUkVEX0lOSVRJQUxJWkFUSU9OIik7DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBkZWFjdGl2YXRlDQotICAgICAqLw0KLSAgICBARGVwcmVjYXRlZA0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfUkVOREVSS0lUID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1JFTkRFUktJVCIpOw0KLQ0KLSAgICAvL2N1cnJlbnRseSBqdXN0IHVzZWQgYnkgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0RFRkFVTFRfQ09OVkVOVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT04iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0RFRkFVTFRfTkFNRV9NQVBQRVJTID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0RFRkFVTFRfTkFNRV9NQVBQRVJTIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9DT01QT05FTlRfSU5JVElBTElaQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfQ09NUE9ORU5UX0lOSVRJQUxJWkFUSU9OIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9WQUxJREFUSU9OX1BBUkFNRVRFUlMgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfVkFMSURBVElPTl9QQVJBTUVURVJTIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9SRU5ERVJfS0lUX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfUkVOREVSX0tJVF9GQUNUT1JZIik7DQotDQotICAgIC8vdGhlcmUgaXMgbm90aGluZyBsaWtlIERFQUNUSVZBVEVfREVGQVVMVF9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SDQotICAgIC8vdXNlIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmRlbnlSZW5kZXJlckludGVyY2VwdG9yKC4uLikgd2l0aGluIGFuIGV4dHZhbC1TdGFydHVwTGlzdGVuZXINCi0NCi0gICAgLyoNCi0gICAgICogc3BlYyBwYXJhbWV0ZXJzDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSUFJFVF9FTVBUWV9TVFJJTkdfU1VCTUlUVEVEX1ZBTFVFU19BU19OVUxMID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJqYXZheC5mYWNlcyIsICJJTlRFUlBSRVRfRU1QVFlfU1RSSU5HX1NVQk1JVFRFRF9WQUxVRVNfQVNfTlVMTCIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRFX0VNUFRZX0ZJRUxEUyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiamF2YXguZmFjZXMiLCAiVkFMSURBVEVfRU1QVFlfRklFTERTIik7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY0MDViMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0Fic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogZGV0YWlscw0KLSAqIEBzZWUgRGVmYXVsdEVMSGVscGVyDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotICAgIHByb3RlY3RlZCBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeSBjdXN0b21FTEhlbHBlckZhY3Rvcnk7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tRUxIZWxwZXJGYWN0b3J5KEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5IGVsSGVscGVyRmFjdG9yeSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jdXN0b21FTEhlbHBlckZhY3RvcnkgPSBlbEhlbHBlckZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGZpbmFsIEVMSGVscGVyIGNyZWF0ZSgpDQotICAgIHsNCi0gICAgICAgIEVMSGVscGVyIHJlc3VsdCA9IG51bGw7DQotDQotICAgICAgICBpZih0aGlzLmN1c3RvbUVMSGVscGVyRmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuY3VzdG9tRUxIZWxwZXJGYWN0b3J5LmNyZWF0ZUVMSGVscGVyKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlRUxIZWxwZXIoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IEVMSGVscGVyIGNyZWF0ZUVMSGVscGVyKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2IzZjM2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsNCi1pbXBvcnQgamF2YS5pby5FeHRlcm5hbGl6YWJsZTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIGluIG9yZGVyIHRvIGNlbnRyYWxpemUgdGhlIGpzZiB2ZXJzaW9uIGRlcGVuZGVuY3kgd2l0aGluIHRoZSBjb3JlDQotICoNCi0gKiB0aGlzIGVsLWhlbHBlciBzdXBwb3J0cyBqc3AgYW5kIGZhY2VsZXRzICh0ZXN0ZWQgd2l0aCAxLjEuMTQpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIHRoZXJlIGlzIGEgc3BlY2lhbCBmYWNlbGV0cyB3b3JrYXJvdW5kIGZvciBlbC1leHByZXNzaW9ucyBvZiBjdXN0b20gY29tcG9uZW50cw0KLSAqIGl0J3MgcGx1Z2dhYmxlIGluIG9yZGVyIHRvIHN1cHBvcnQgc3BlY2lhbCBtZWNoYW5pc21zIG9mIGRpZmZlcmVudCB0ZWNobm9sb2dpZXMgKHRoYW4ganNwIGFuZCBmYWNlbGV0cykNCi0gKiBzbyB5b3UgY2FuIHBsdWcgaW4geW91ciBvd24gaW1wbC4gd2hpY2ggaW1wbGVtZW50cyBhIGN1c3RvbSB3b3JrYXJvdW5kIChsaWtlIHRoZSBmYWNlbGV0cyB3b3JrYXJvdW5kIG9mIHRoaXMgaW1wbC4pDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEVMSGVscGVyIGltcGxlbWVudHMgRUxIZWxwZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0RUxIZWxwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgLy9kdWUgdG8gYSByZXN0cmljdGlvbiB3aXRoIHRoZSByaQ0KLSAgICAgICAgT2JqZWN0IGJlYW4gPSBnZXRWYWx1ZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgcmV0dXJuIChiZWFuICE9IG51bGwpID8gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhiZWFuLmdldENsYXNzKCkpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oU3RyaW5nIGJlYW5OYW1lKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgcmV0dXJuIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmdldFZhcmlhYmxlUmVzb2x2ZXIoKS5yZXNvbHZlVmFyaWFibGUoZmFjZXNDb250ZXh0LCBiZWFuTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiAhPSBudWxsKSA/IGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgLmNyZWF0ZVZhbHVlQmluZGluZyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSkuZ2V0VmFsdWUoZmFjZXNDb250ZXh0KSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmNyZWF0ZVZhbHVlQmluZGluZyh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKSAhPSBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBnZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBib29sZWFuIGFsbG93QmxhbmtDaGFyYWN0ZXJzKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IGdldE9yaWdpbmFsVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih1aUNvbXBvbmVudCk7DQotDQotICAgICAgICAvL2ZvciBpbnB1dCBjb21wb25lbnRzIHdpdGhvdXQgdmFsdWUtYmluZGluZw0KLSAgICAgICAgLy8oZS5nLiBmb3Igc3BlY2lhbCBjb21wb25lbnQgbGlicyAtPiBpc3N1ZSB3aXRoIEV4dFZhbFJlbmRlcmVyV3JhcHBlciNlbmNvZGVCZWdpbikNCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoDQotICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKSArICIgaGFzIG5vIHZhbHVlIGJpbmRpbmcgLSBjb21wb25lbnQgaWQ6ICIgKyB1aUNvbXBvbmVudC5nZXRJZCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBpZighYWxsb3dCbGFua0NoYXJhY3RlcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZSgiICIsICIiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwNCi0gICAgICAgICAgICBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKS5nZXRCYXNlRXhwcmVzc2lvbigpKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gcmVzdWx0ID0gRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyLg0KLSAgICAgICAgICAgICAgICB0cnlUb0NyZWF0ZVZhbHVlQmluZGluZ0ZvckZhY2VsZXRzQmluZGluZyh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICAgICAgaWYocmVzdWx0ID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgcmVzb2x2ZSBleHByZXNzaW9uOiAiICsgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIENsYXNzIGVudGl0eUNsYXNzID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHJlc3VsdC5nZXRCYXNlRXhwcmVzc2lvbigpKTsNCi0NCi0gICAgICAgICAgICBpZihlbnRpdHlDbGFzcyA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IHJlc29sdmUgZXhwcmVzc2lvbjogIiArIHJlc3VsdC5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICB9DQotDQotICAgIC8va2VlcCBpbiBzeW5jIHdpdGggRGVmYXVsdEVMSGVscGVyI2dldFByb3BlcnR5RGV0YWlsc1ZpYVJlZmxlY3Rpb25GYWxsYmFjayBvZiB0cnVuayEhIQ0KLSAgICBwdWJsaWMgUHJvcGVydHlEZXRhaWxzIGdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gZ2V0VmFsdWVCaW5kaW5nRXhwcmVzc2lvbih1aUNvbXBvbmVudCwgZmFsc2UpOw0KLQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9DQotICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHBhdGggPSBudWxsOw0KLQ0KLSAgICAgICAgd2hpbGUoY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHBhdGggPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHBhdGggPSBnZXRQcm9wZXJ0eU5hbWUoY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwYXRoID0gZ2V0UHJvcGVydHlOYW1lKGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKSArICIuIiArIHBhdGg7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBhdGggPSBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpICsgIi4iICsgcGF0aDsNCi0NCi0gICAgICAgIE9iamVjdCBiYXNlT2JqZWN0ID0gZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLQ0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGUuZy46ICN7YmVhbltiZWFuLnBhc3N3b3JkUmVwZWF0ZWRQcm9wZXJ0eU5hbWVdfQ0KLSAgICAgICAgLy8tPiBiZWFuLnBhc3N3b3JkUmVwZWF0ZWRQcm9wZXJ0eU5hbWUgaXMgbm90IHRoZSBmaW5hbCBwcm9wZXJ0eSBuYW1lDQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscyhwYXRoLCBiYXNlT2JqZWN0LCBnZXRQcm9wZXJ0eU5hbWUodmFsdWVCaW5kaW5nRXhwcmVzc2lvbikpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldFByb3BlcnR5TmFtZShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCk7DQotDQotICAgICAgICBpZihwcm9wZXJ0eU5hbWUuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBleHRyYWN0UHJvcGVydHlOYW1lT2ZQcm9wZXJ0eVBhdGgocHJvcGVydHlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInN1cHBvcnQgZm9yIG1vcmUgZHluYW1pYyBiaW5kaW5ncyAtIGRldGFpbHMgc2VlIGlubGluZSIpDQotICAgIHByaXZhdGUgU3RyaW5nIGV4dHJhY3RQcm9wZXJ0eU5hbWVPZlByb3BlcnR5UGF0aChTdHJpbmcgcHJvcGVydHlDaGFpbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nW10gcHJvcGVydGllcyA9IHByb3BlcnR5Q2hhaW4uc3BsaXQoIlxcLiIpOw0KLQ0KLSAgICAgICAgT2JqZWN0IGN1cnJlbnRQcm9wZXJ0eVZhbHVlID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKHByb3BlcnRpZXNbMF0pOw0KLQ0KLSAgICAgICAgTWV0aG9kIGN1cnJlbnRNZXRob2Q7DQotICAgICAgICBTdHJpbmcgY3VycmVudFByb3BlcnR5TmFtZTsNCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzc09mUHJvcGVydHlWYWx1ZTsNCi0gICAgICAgIGZvcihpbnQgaSA9IDE7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0aWVzW2ldOw0KLSAgICAgICAgICAgIGN1cnJlbnRDbGFzc09mUHJvcGVydHlWYWx1ZSA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudFByb3BlcnR5VmFsdWUuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgY3VycmVudE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZChjdXJyZW50Q2xhc3NPZlByb3BlcnR5VmFsdWUsDQotICAgICAgICAgICAgICAgICJnZXQiICsgY3VycmVudFByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIGN1cnJlbnRQcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpKTsNCi0NCi0gICAgICAgICAgICBpZihjdXJyZW50TWV0aG9kID09IG51bGwgJiYgY3VycmVudFByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBNYXApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL2l0J3Mgb2sgZm9yIHRoZSBzaW1wbGUgbWFwIGNhc2UgLSBidXQgbm90IGZvciBlLmcuOg0KLSAgICAgICAgICAgICAgICAvLyN7YmVhbjFbYmVhbjIucHJvcGVydHlOYW1lUHJvdmlkZXJbIGJlYW4zLmluZGV4XV19DQotICAgICAgICAgICAgICAgIC8vb3IgZXZlcnkgb3RoZXIgY29tcGxleCByZXBsYWNlbWVudCBmb3IgYmVhbjMuaW5kZXgNCi0gICAgICAgICAgICAgICAgLy9pdCBtaWdodCBhbHNvIHJlcXVpcmUgYW4gYWRqdXN0bWVudCBhdCBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIjdHJ5VG9UcmFuc2Zvcm1Ub1JlYWxCaW5kaW5nDQotICAgICAgICAgICAgICAgICgoTWFwKWN1cnJlbnRQcm9wZXJ0eVZhbHVlKS5nZXQoY3VycmVudFByb3BlcnR5TmFtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eVZhbHVlID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKGN1cnJlbnRQcm9wZXJ0eVZhbHVlLCBjdXJyZW50TWV0aG9kKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZihjdXJyZW50UHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFN0cmluZyljdXJyZW50UHJvcGVydHlWYWx1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoInVuZXhwZWN0ZWQgdmFsdWUgd2l0aGluIG1hcCBzeW50YXg6ICIgKyBwcm9wZXJ0eUNoYWluICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGxhc3QgcHJvcGVydHkgbmFtZTogIiArIGN1cnJlbnRQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgc3RhdGljIFN0cmluZyBnZXRPcmlnaW5hbFZhbHVlQmluZGluZ0V4cHJlc3Npb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZyB2YWx1ZUV4cHJlc3Npb24gPSB1aUNvbXBvbmVudC5nZXRWYWx1ZUJpbmRpbmcoInZhbHVlIik7DQotDQotICAgICAgICByZXR1cm4gKHZhbHVlRXhwcmVzc2lvbiAhPSBudWxsKSA/IHZhbHVlRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtV2VsbEZvcm1lZChPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBWYWx1ZUJpbmRpbmcgfHwgbyBpbnN0YW5jZW9mIEV4dGVybmFsaXphYmxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBzID0gby50b1N0cmluZygpOw0KLSAgICAgICAgcmV0dXJuICgocy5jb250YWlucygiIyIpIHx8IHMuY29udGFpbnMoIiQiKSkgJiYgcy5jb250YWlucygieyIpICYmIHMuY29udGFpbnMoIn0iKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRCaW5kaW5nT2ZDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQuZ2V0VmFsdWVCaW5kaW5nKG5hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZmU1NmMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRFTEhlbHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeQ0KLXsNCi0gICAgcHJpdmF0ZSBFTEhlbHBlciBlbEhlbHBlciA9IG5ldyBEZWZhdWx0RUxIZWxwZXIoKTsNCi0gICAgDQotICAgIHByb3RlY3RlZCBFTEhlbHBlciBjcmVhdGVFTEhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmVsSGVscGVyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRUxIZWxwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRUxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGViMjU1My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogaW4gb3JkZXIgdG8gY2VudHJhbGl6ZSB0aGUganNmIHZlcnNpb24gZGVwZW5kZW5jeSB3aXRoaW4gdGhlIGNvcmUNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRUxIZWxwZXINCi17DQotICAgIE9iamVjdCBnZXRCZWFuKFN0cmluZyBiZWFuTmFtZSk7DQotDQotICAgIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLQ0KLSAgICBDbGFzcyBnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCk7DQotDQotICAgIGJvb2xlYW4gaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIGJvb2xlYW4gaXNFTFRlcm1XZWxsRm9ybWVkKE9iamVjdCBvKTsNCi0NCi0gICAgT2JqZWN0IGdldEJpbmRpbmdPZkNvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgU3RyaW5nIG5hbWUpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0ZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIxNjFiMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0ZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0Ow0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi0vKioNCi0gKiBIZWxwZXIgY2xhc3MgdG8gZ2V0IHRoZSByZWFsL2Z1bGwgdmFsdWUgYmluZGluZyAtIHRlc3RlZCB3aXRoIGZhY2VsZXRzIDEuMS4xNA0KLSAqIFRoZSB0YXJnZXQgaXMgdG8gZ2V0IHJpZCBvZiB0aGlzIGltcGwuIC0gY3VycmVudGx5IGl0J3MgYSB3b3JrYXJvdW5kIHRvIHN1cHBvcnQgY3VzdG9tIGZhY2VsZXRzIGNvbXBvbmVudHMuDQotICogQW4gYWx0ZXJuYXRpdmUgd291bGQgYmUgYW4gRUwtUmVzb2x2ZXIgLSB0aGVyZSBhcmUgc3RpbGwgc29tZSBvcGVuIGlzc3VlcyB3aXRoIHN1Y2ggYW4gYXBwcm9hY2gNCi0gKiArIEl0IGlzbid0IGF2YWlsYWJsZSB3aXRoIEpTRiAxLjEueA0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB0cnlUb0NyZWF0ZVZhbHVlQmluZGluZ0ZvckZhY2VsZXRzQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGZhY2VsZXRzVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IERlZmF1bHRFTEhlbHBlci5nZXRPcmlnaW5hbFZhbHVlQmluZGluZ0V4cHJlc3Npb24odWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGZvdW5kQmluZGluZ3MgPSBleHRyYWN0RUxUZXJtcygNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCaW5kaW5nT2ZDb21wb25lbnQodWlDb21wb25lbnQsICJ2YWx1ZSIpKTsNCi0NCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcHBlZEZhY2VsZXRzVmFycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmJlPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24NCi0gICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgMSkgKyAieyIgKyBjcmVhdGVCaW5kaW5nKGZvdW5kQmluZGluZ3MsIG1hcHBlZEZhY2VsZXRzVmFycykgKyAifSIpOw0KLQ0KLSAgICAgICAgICAgIENsYXNzIGVudGl0eUNsYXNzID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZiZS5nZXRCYXNlRXhwcmVzc2lvbigpKTsNCi0NCi0gICAgICAgICAgICBpZihlbnRpdHlDbGFzcyA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRyeVRvUmVwbGFjZVZhcnModmJlLCBtYXBwZWRGYWNlbGV0c1ZhcnMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gdmJlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNyZWF0ZUJpbmRpbmcoTGlzdDxTdHJpbmc+IGV4cHJlc3Npb25zLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHZpcnR1YWxWYXJzKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VycmVudEJpbmRpbmc7DQotDQotICAgICAgICBpbnQgaW5kZXhPZkJpbmRpbmdEZXRhaWxzOw0KLSAgICAgICAgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBleHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aCgiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZvdW5kQmluZGluZ0RldGFpbHMgPSBlbnRyeS5zcGxpdCgiICIpOw0KLSAgICAgICAgICAgIGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoZm91bmRCaW5kaW5nRGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9PSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBiaW5kaW5nRGV0YWlscyA9IGZvdW5kQmluZGluZ0RldGFpbHNbaW5kZXhPZkJpbmRpbmdEZXRhaWxzXS5zcGxpdCgiPSIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nRGV0YWlscy5sZW5ndGggPCAyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYmluZGluZ0RldGFpbHNbMV07DQotDQotICAgICAgICAgICAgLy90byBzdXBwb3J0IGJsYW5rcyB3aXRoaW4gYSBiaW5kaW5nIHdpdGggbWFwIHN5bnRheA0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgJiYgIWN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoY3VycmVudEJpbmRpbmcsIGZvdW5kQmluZGluZ0RldGFpbHMsIGluZGV4T2ZCaW5kaW5nRGV0YWlscyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9lbnRyeSBmb3IgInZpcnR1YWwiIGZhY2VsZXRzIGJlYW5zDQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWluc0tleShiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLnB1dChiaW5kaW5nRGV0YWlsc1swXSwgY3VycmVudEJpbmRpbmcpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICBpZighKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgfHwgY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2aXJ0dWFsVmFycy5wdXQoYmluZGluZ0RldGFpbHNbMF0sIGJpbmRpbmdEZXRhaWxzWzFdLnN1YnN0cmluZygxLCBiaW5kaW5nRGV0YWlsc1sxXS5sZW5ndGgoKS0yKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIG9yaWdpbmFsQmluZGluZyA9IGFkZGVkVmlydHVhbE5hbWVzLmdldCgidmFsdWUiKTsNCi0gICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5zdWJzdHJpbmcob3JpZ2luYWxCaW5kaW5nLmluZGV4T2YoInsiKSArIDEsIG9yaWdpbmFsQmluZGluZy5pbmRleE9mKCJ9IikpOw0KLSAgICAgICAgYWRkZWRWaXJ0dWFsTmFtZXMucmVtb3ZlKCJ2YWx1ZSIpOw0KLSAgICAgICAgcmV0dXJuIHRyeVRvVHJhbnNmb3JtVG9SZWFsQmluZGluZyhvcmlnaW5hbEJpbmRpbmcsIGFkZGVkVmlydHVhbE5hbWVzLCB2aXJ0dWFsVmFycyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRyeVRvVHJhbnNmb3JtVG9SZWFsQmluZGluZygNCi0gICAgICAgICAgICBTdHJpbmcgb3JpZ2luYWxCaW5kaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZGVkVmlydHVhbE5hbWVzLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHZpcnR1YWxWYXJzKQ0KLSAgICB7DQotICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSAiI3siICsgb3JpZ2luYWxCaW5kaW5nICsgIn0iOw0KLSAgICAgICAgSXRlcmF0b3IgbmFtZUl0ZXJhdG9yID0gYWRkZWRWaXJ0dWFsTmFtZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsNCi0NCi0gICAgICAgIFN0cmluZyBjdXJyZW50S2V5Ow0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRWYWx1ZTsNCi0gICAgICAgIHdoaWxlKG5hbWVJdGVyYXRvci5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudEtleSA9IChTdHJpbmcpIG5hbWVJdGVyYXRvci5uZXh0KCk7DQotDQotICAgICAgICAgICAgY3VycmVudFZhbHVlID0gYWRkZWRWaXJ0dWFsTmFtZXMuZ2V0KGN1cnJlbnRLZXkpOw0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoY3VycmVudFZhbHVlLmluZGV4T2YoInsiKSArIDEsIGN1cnJlbnRWYWx1ZS5pbmRleE9mKCJ9IikpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJ7IiArIGN1cnJlbnRLZXkgKyAiLiIsICJ7IiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoInsiICsgY3VycmVudEtleSArICJbIiwgInsiICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiLiIgKyBjdXJyZW50S2V5ICsgIi4iLCAiLiIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCIuIiArIGN1cnJlbnRLZXkgKyAiWyIsICIuIiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIlsiICsgY3VycmVudEtleSArICJdIiwgIlsnIiArIGN1cnJlbnRWYWx1ZSArICInXSIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiWyIsICJbIiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIlsiICsgY3VycmVudEtleSArICIuIiwgIlsiICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG5hbWVJdGVyYXRvciA9IHZpcnR1YWxWYXJzLmtleVNldCgpLml0ZXJhdG9yKCk7DQotDQotICAgICAgICB3aGlsZShuYW1lSXRlcmF0b3IuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRLZXkgPSAoU3RyaW5nKSBuYW1lSXRlcmF0b3IubmV4dCgpOw0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IHZpcnR1YWxWYXJzLmdldChjdXJyZW50S2V5KTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIi4iLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJ7IiArIGN1cnJlbnRLZXkgKyAiWyIsICJ7IiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICIuIiwgIi4iICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiLiIgKyBjdXJyZW50S2V5ICsgIlsiLCAiLiIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiXSIsICJbJyIgKyBjdXJyZW50VmFsdWUgKyAiJ10iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIlsiLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiLiIsICJbIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gb3JpZ2luYWxCaW5kaW5nLnN1YnN0cmluZygyLCBvcmlnaW5hbEJpbmRpbmcubGVuZ3RoKCkgLSAxKTsNCi0gICAgfQ0KLQ0KLSAgICAvL3RvIHN1cHBvcnQgYmxhbmtzIC0gZS5nLiB3aXRoIG1hcCBzeW50YXgNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoU3RyaW5nIGN1cnJlbnRCaW5kaW5nLCBTdHJpbmdbXSBmb3VuZEJpbmRpbmdEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhPZkJpbmRpbmdEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBmb3IoaW50IGkgPSBpbmRleE9mQmluZGluZ0RldGFpbHMgKyAxOyBpIDwgZm91bmRCaW5kaW5nRGV0YWlscy5sZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50QmluZGluZyArPSBmb3VuZEJpbmRpbmdEZXRhaWxzW2ldOw0KLSAgICAgICAgICAgIGlmKGZvdW5kQmluZGluZ0RldGFpbHNbaV0uY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50QmluZGluZzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY3VycmVudEJpbmRpbmc7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoU3RyaW5nW10gYmluZGluZ0RldGFpbHMpDQotICAgIHsNCi0gICAgICAgIGludCBjb3VudCA9IDA7DQotICAgICAgICBmb3IgKFN0cmluZyBlbnRyeSA6IGJpbmRpbmdEZXRhaWxzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbnRyeS5jb250YWlucygiPSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjb3VudCsrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBleHRyYWN0RUxUZXJtcyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGZvdW5kRUxUZXJtcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHJlc29sdmVFTFRlcm1zKG8sIG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpLCBmb3VuZEVMVGVybXMsIDApID4gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZEVMVGVybXM7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGludCByZXNvbHZlRUxUZXJtcyhPYmplY3QgbywgTWFwPE9iamVjdCwgT2JqZWN0PiB2aXNpdGVkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGZvdW5kRUxUZXJtcywgaW50IGNvdW50KSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChvID09IG51bGwgfHwgdmlzaXRlZC5jb250YWluc0tleShvKSB8fCBjb3VudCA+IDUwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdmlzaXRlZC5wdXQobywgbnVsbCk7DQotDQotICAgICAgICBpbnQgZWxDb3VudCA9IDA7DQotICAgICAgICBDbGFzcyBjID0gby5nZXRDbGFzcygpOw0KLQ0KLSAgICAgICAgLy9pbnNwZWN0IG1hcHMNCi0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgTWFwKQ0KLSAgICAgICAgew0KLQ0KLSAgICAgICAgICAgIGZvciAoT2JqZWN0IGVudHJ5IDogKChNYXApIG8pLnZhbHVlcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9mb3VuZCBlbnRyeSBmb3IgInZpcnR1YWwiIGZhY2VsZXRzIHZhcg0KLSAgICAgICAgICAgICAgICBpZihlbnRyeS50b1N0cmluZygpLmNvbnRhaW5zKCJWYWx1ZUV4cHJlc3Npb25bIikpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kRUxUZXJtcy5hZGQoZW50cnkudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxDb3VudCArPSByZXNvbHZlRUxUZXJtcyhlbnRyeSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gZWxDb3VudDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChvKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiArK2VsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2FuYWx5emUgYXJyYXlzDQotICAgICAgICBpZiAoYy5pc0FycmF5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW50IGxlbmd0aCA9IEFycmF5LmdldExlbmd0aChvKTsNCi0gICAgICAgICAgICAvL2NoZWNrIGFycmF5IFtMIC0+IG5vIGFycmF5IG9mIHByaW1pdGl2ZSB0eXBlcw0KLSAgICAgICAgICAgIGlmIChvLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiW0wiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChvLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiW0xqYXZhLmxhbmcuU3RyaW5nIikpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKEFycmF5LmdldChvLCBpKSkpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kRUxUZXJtcy5hZGQoby50b1N0cmluZygpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbENvdW50Kys7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoQXJyYXkuZ2V0KG8sIGkpLCB2aXNpdGVkLCBmb3VuZEVMVGVybXMsIGNvdW50ICsgMSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGVsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PEZpZWxkPiBhdHRyaWJ1dGVzID0gZmluZEFsbEF0dHJpYnV0ZXMoYywgbmV3IEFycmF5TGlzdDxGaWVsZD4oKSk7DQotICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGF0dHJpYnV0ZXMudG9BcnJheShuZXcgRmllbGRbYXR0cmlidXRlcy5zaXplKCldKTsNCi0NCi0gICAgICAgIEFjY2Vzc2libGVPYmplY3Quc2V0QWNjZXNzaWJsZShmaWVsZHMsIHRydWUpOw0KLSAgICAgICAgZm9yIChGaWVsZCBjdXJyZW50RmllbGQgOiBmaWVsZHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5nZXQobykgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmdldFR5cGUoKS5lcXVhbHMoU3RyaW5nLmNsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQuZ2V0KG8pICE9IG51bGwgJiYgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQoY3VycmVudEZpZWxkLmdldChvKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZEVMVGVybXMgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBlbENvdW50Kys7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZiAoIWN1cnJlbnRGaWVsZC5nZXRUeXBlKCkuaXNQcmltaXRpdmUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoY3VycmVudEZpZWxkLmdldChvKSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBlbENvdW50Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8RmllbGQ+IGZpbmRBbGxBdHRyaWJ1dGVzKENsYXNzIGMsIExpc3Q8RmllbGQ+IGF0dHJpYnV0ZXMpDQotICAgIHsNCi0gICAgICAgIGlmIChjID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7DQotICAgICAgICB9DQotICAgICAgICBmaW5kQWxsQXR0cmlidXRlcyhjLmdldFN1cGVyY2xhc3MoKSwgYXR0cmlidXRlcyk7DQotDQotICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGMuZ2V0RGVjbGFyZWRGaWVsZHMoKTsNCi0gICAgICAgIGZvciAoRmllbGQgY3VycmVudEZpZWxkIDogZmllbGRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghTW9kaWZpZXIuaXNTdGF0aWMoY3VycmVudEZpZWxkLmdldE1vZGlmaWVycygpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKGN1cnJlbnRGaWVsZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB0cnlUb1JlcGxhY2VWYXJzKFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcHBlZEZhY2VsZXRzVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5Ow0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOw0KLSAgICAgICAgYm9vbGVhbiBsYXN0ID0gZmFsc2U7DQotDQotICAgICAgICB3aGlsZSh0cnVlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbGFzdCA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLQ0KLQ0KLSAgICAgICAgICAgIHByb3BlcnR5ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpOw0KLQ0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgIC5yZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgZ2V0TmV3UHJvcGVydHkocHJvcGVydHksIG1hcHBlZEZhY2VsZXRzVmFycykpOw0KLQ0KLSAgICAgICAgICAgIGlmKHJlc3VsdC5sZW5ndGgoKSA9PSAwKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkgKyAiLiIgKyByZXN1bHQ7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCk7DQotDQotICAgICAgICAgICAgaWYobGFzdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByZWZpeCgpICsgInsiICsgcmVzdWx0ICsgIn0iKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmV3UHJvcGVydHkoU3RyaW5nIG9sZFByb3BlcnR5LCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcHBlZEZhY2VsZXRzVmFycykNCi0gICAgew0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZpcnR1YWxWYXJzID0gZ2V0UG90ZW50aWFsVmlydHVhbFZhcnMob2xkUHJvcGVydHkpOw0KLQ0KLSAgICAgICAgZm9yKFN0cmluZyB2aXJ0dWFsVmFyIDogdmlydHVhbFZhcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobWFwcGVkRmFjZWxldHNWYXJzLmNvbnRhaW5zS2V5KHZpcnR1YWxWYXIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgb2xkUHJvcGVydHkgPSByZXBsYWNlUHJvcGVydHlWYWx1ZShvbGRQcm9wZXJ0eSwgdmlydHVhbFZhciwgbWFwcGVkRmFjZWxldHNWYXJzLmdldCh2aXJ0dWFsVmFyKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG9sZFByb3BlcnR5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRQb3RlbnRpYWxWaXJ0dWFsVmFycyhTdHJpbmcgb2xkUHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGludCBzdGFydCA9IC0xOw0KLSAgICAgICAgaW50IGVuZCA9IC0xOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZpcnR1YWxWYXJMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgb2xkUHJvcGVydHkubGVuZ3RoKCk7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihzdGFydCA9PSAtIDEgJiYgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICdbJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYoKHN0YXJ0ICE9IC0gMSAmJiBvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ1snKSB8fCBvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ10nKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZW5kID0gaTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYoc3RhcnQgIT0gLTEgJiYgZW5kICE9IC0xKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhckxpc3QuYWRkKG9sZFByb3BlcnR5LnN1YnN0cmluZyhzdGFydCwgZW5kKSk7DQotICAgICAgICAgICAgICAgIGlmKG9sZFByb3BlcnR5LmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IC0xOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVuZCA9IC0xOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB2aXJ0dWFsVmFyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVwbGFjZVByb3BlcnR5VmFsdWUoU3RyaW5nIG9sZFByb3BlcnR5LCBTdHJpbmcgdGFyZ2V0VmFyLCBTdHJpbmcgbmV3VmFsdWUpDQotICAgIHsNCi0gICAgICAgIGludCBpbmRleCA9IG9sZFByb3BlcnR5LmluZGV4T2YodGFyZ2V0VmFyKTsNCi0NCi0gICAgICAgIGlmKGluZGV4ID09IC0xKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBvbGRQcm9wZXJ0eTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoMCwgaW5kZXgpOw0KLSAgICAgICAgcmVzdWx0ICs9IG5ld1ZhbHVlOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdCArIG9sZFByb3BlcnR5LnN1YnN0cmluZyhpbmRleCArIHRhcmdldFZhci5sZW5ndGgoKSwgb2xkUHJvcGVydHkubGVuZ3RoKCkpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHJlcGxhY2UgdmlydHVhbCBmYWNlbGV0cyB2YXJzIChtYXAgc3ludGF4KQ0KLSAgICAgKiB0ZXN0ZWQgc3R5bGVzIChzaW1wbGUgYW5kIG5lc3RlZCk6IHRlc3RbaXhbaXgyW2l4M11dXQ0KLSAgICAgKi8NCi0gICAgLyoNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIF9jcmVhdGVCaW5kaW5nKExpc3Q8U3RyaW5nPiBleHByZXNzaW9ucywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOw0KLQ0KLSAgICAgICAgU3RyaW5nIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRCaW5kaW5nOw0KLSAgICAgICAgU3RyaW5nIHBhcnRPZkJpbmRpbmc7DQotDQotICAgICAgICBpbnQgaW5kZXhPZkJpbmRpbmdEZXRhaWxzOw0KLSAgICAgICAgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGFkZGVkVmlydHVhbE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBlbnRyeSA6IGV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbnRyeS5zdGFydHNXaXRoKCJWYWx1ZUV4cHJlc3Npb25bIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgZm91bmRCaW5kaW5nRGV0YWlscyA9IGVudHJ5LnNwbGl0KCIgIik7DQotICAgICAgICAgICAgaW5kZXhPZkJpbmRpbmdEZXRhaWxzID0gZmluZEluZGV4T2ZCaW5kaW5nRGV0YWlscyhmb3VuZEJpbmRpbmdEZXRhaWxzKTsNCi0NCi0gICAgICAgICAgICBpZiAoaW5kZXhPZkJpbmRpbmdEZXRhaWxzID09IC0xKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGJpbmRpbmdEZXRhaWxzID0gZm91bmRCaW5kaW5nRGV0YWlsc1tpbmRleE9mQmluZGluZ0RldGFpbHNdLnNwbGl0KCI9Iik7DQotDQotICAgICAgICAgICAgaWYgKGJpbmRpbmdEZXRhaWxzLmxlbmd0aCA8IDIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgPSBiaW5kaW5nRGV0YWlsc1sxXTsNCi0NCi0gICAgICAgICAgICAvL3RvIHN1cHBvcnQgYmxhbmtzIHdpdGhpbiBhIGJpbmRpbmcgd2l0aCBtYXAgc3ludGF4DQotICAgICAgICAgICAgaWYoY3VycmVudEJpbmRpbmcuY29udGFpbnMoInsiKSAmJiAhY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYWRkRnVydGhlckJpbmRpbmdQYXJ0cyhjdXJyZW50QmluZGluZywgZm91bmRCaW5kaW5nRGV0YWlscywgaW5kZXhPZkJpbmRpbmdEZXRhaWxzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUgIT0gbnVsbCAmJiBjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9lbnRyeSBmb3IgInZpcnR1YWwiIGZhY2VsZXRzIGJlYW5zDQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWlucyhiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHBhcnRPZkJpbmRpbmcgPSBjdXJyZW50QmluZGluZy5zdWJzdHJpbmcoY3VycmVudEJpbmRpbmcuaW5kZXhPZihwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgcHJldkZhY2VsZXRzQXR0cmlidXRlTmFtZS5sZW5ndGgoKSwgY3VycmVudEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLmFkZChiaW5kaW5nRGV0YWlsc1swXSk7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBwYXJ0T2ZCaW5kaW5nOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy9lbnRyeSBmb3IgInZpcnR1YWwiIGZhY2VsZXRzIHZhcg0KLSAgICAgICAgICAgIGVsc2UgaWYoIShjdXJyZW50QmluZGluZy5jb250YWlucygieyIpIHx8IGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhcnMucHV0KGJpbmRpbmdEZXRhaWxzWzBdLCBiaW5kaW5nRGV0YWlsc1sxXS5zdWJzdHJpbmcoMSwgYmluZGluZ0RldGFpbHNbMV0ubGVuZ3RoKCktMikpOw0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoIWFkZGVkVmlydHVhbE5hbWVzLmNvbnRhaW5zKGJpbmRpbmdEZXRhaWxzWzBdKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYWRkZWRWaXJ0dWFsTmFtZXMuYWRkKGJpbmRpbmdEZXRhaWxzWzBdKTsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGN1cnJlbnRCaW5kaW5nLnN1YnN0cmluZyhjdXJyZW50QmluZGluZy5pbmRleE9mKCJ7IikgKyAxLCBjdXJyZW50QmluZGluZy5pbmRleE9mKCJ9IikpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUgPSBiaW5kaW5nRGV0YWlsc1swXTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0gICAgKi8NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc4ZWI2Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiZGlmZmVyZW5jZSBiZXR3ZWVuIFsgYW5kIFsnIC0gdGVzdCB3aXRoIG1vcmUgY29uc3RlbGxhdGlvbnMiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSX0pDQotcHVibGljIGNsYXNzIFZhbHVlQmluZGluZ0V4cHJlc3Npb24NCi17DQotICAgIHByaXZhdGUgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBiYXNlOw0KLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJlZml4Ow0KLSAgICBwcml2YXRlIFN0cmluZyB0b2tlbjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlcGxhY2VPckFkZFByb3BlcnR5KFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuZXdQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gcmVwbGFjZVByb3BlcnR5KFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIC8vVE9ETyBhZGp1c3RtZW50cyBmb3IgaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5DQotICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkuZW5kc1dpdGgoIiddIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCksIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBhZGRQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIFN0cmluZyBuZXdQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUV4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzb3VyY2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBzb3VyY2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSk7DQotDQotICAgICAgICAvL1RPRE8gYWRqdXN0bWVudHMgZm9yIGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eQ0KLSAgICAgICAgaWYobmV3UHJvcGVydHkuc3RhcnRzV2l0aCgiWyciKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ocmVzdWx0ICsgbmV3UHJvcGVydHkgKyAifSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihyZXN1bHQgKyAiLiIgKyBuZXdQcm9wZXJ0eSArICJ9Iik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24oU3RyaW5nIGV4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIGlmKCFFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChleHByZXNzaW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGV4cHJlc3Npb24gKyAiIGlzIG5vIHZhbGlkIGVsLWV4cHJlc3Npb24iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGJvb2xlYW4gaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5ID0gZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiJ10iKSA9PSAtMTsNCi0gICAgICAgIGludCBpbmRleDEgPSBpc0R5bmFtaWNCYXNlQW5kUHJvcGVydHkgPyBleHByZXNzaW9uLmxhc3RJbmRleE9mKCJdIikgOiBleHByZXNzaW9uLmxhc3RJbmRleE9mKCInXSIpOw0KLSAgICAgICAgaW50IGluZGV4MiA9IGV4cHJlc3Npb24ubGFzdEluZGV4T2YoIi4iKTsNCi0NCi0gICAgICAgIGlmKGluZGV4MSA+IGluZGV4MikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgxKTsNCi0NCi0gICAgICAgICAgICBpbnQgaW5kZXgzID0gZmluZEluZGV4T2ZTdGFydGluZ0JyYWNrZXQoZXhwcmVzc2lvbik7DQotICAgICAgICAgICAgaWYoaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKGluZGV4MyArIDEsIGluZGV4MSk7DQotDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZyhpbmRleDMgKyAyLCBpbmRleDEpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB0aGlzLmJhc2UgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihleHByZXNzaW9uLnN1YnN0cmluZygwLCBpbmRleDMpICsgIn0iKTsNCi0gICAgICAgICAgICB0aGlzLnRva2VuID0gaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5ID8gIlsiIDogIlsnIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoIGluZGV4MiA+IGluZGV4MSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoaW5kZXgyICsgMSwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEgKTsNCi0gICAgICAgICAgICB0aGlzLmJhc2UgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihleHByZXNzaW9uLnN1YnN0cmluZygwLCBpbmRleDIpICsgIn0iKTsNCi0gICAgICAgICAgICB0aGlzLnRva2VuID0gIi4iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZygyLCBleHByZXNzaW9uLmxlbmd0aCgpIC0gMSk7DQotICAgICAgICAgICAgdGhpcy5wcmVmaXggPSBleHByZXNzaW9uLnN1YnN0cmluZygwLCAxKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUudHJpbSgpOw0KLSAgICAgICAgDQotICAgICAgICBpZigiWyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMudmFsdWUuc3RhcnRzV2l0aCgiJyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUuc3Vic3RyaW5nKDEsIHRoaXMudmFsdWUubGVuZ3RoKCkgLSAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy9yZXR1cm4gdGhpcy5iYXNlLnZhbHVlICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUuc3Vic3RyaW5nKDAsIHRoaXMudmFsdWUubGVuZ3RoKCkpICsgIiddIjsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBnZXRCYXNlRXhwcmVzc2lvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBiYXNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwcmVzc2lvblN0cmluZygpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMuYmFzZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBiYXNlRXhwcmVzc2lvbiA9IHRoaXMuYmFzZS5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotDQotICAgICAgICAgICAgaWYoIlsnIi5lcXVhbHModGhpcy50b2tlbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGJhc2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSkgKyB0aGlzLnRva2VuICsgdGhpcy52YWx1ZSArICInXX0iOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKCJbIi5lcXVhbHModGhpcy50b2tlbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGJhc2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSkgKyB0aGlzLnRva2VuICsgdGhpcy52YWx1ZSArICJdfSI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBiYXNlRXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgYmFzZUV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKSArIHRoaXMudG9rZW4gKyB0aGlzLnZhbHVlICsgIn0iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLnByZWZpeCArICJ7IiArIHRoaXMudmFsdWUgKyAifSI7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlLmdldFByZWZpeCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBwcmVmaXg7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMuYmFzZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuYmFzZS5zZXRQcmVmaXgocHJlZml4KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXhwcmVzc2lvblN0cmluZygpLmhhc2hDb2RlKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiAmJiBnZXRFeHByZXNzaW9uU3RyaW5nKCkNCi0gICAgICAgICAgICAuZXF1YWxzKCgoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbikgdGFyZ2V0KS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgaW50IGZpbmRJbmRleE9mU3RhcnRpbmdCcmFja2V0KFN0cmluZyBleHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBpbnQgY2xvc2VDb3VudCA9IDA7DQotICAgICAgICBmb3IoaW50IGkgPSBleHByZXNzaW9uLmxlbmd0aCgpIC0gMTsgaSA+IDA7IGktLSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihleHByZXNzaW9uLmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjbG9zZUNvdW50LS07DQotICAgICAgICAgICAgICAgIGlmKGNsb3NlQ291bnQgPCAwKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKGV4cHJlc3Npb24uY2hhckF0KGkpID09ICddJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNsb3NlQ291bnQrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMTAwYjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0Fic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFQ+IGltcGxlbWVudHMgTmFtZU1hcHBlckF3YXJlRmFjdG9yeTxOYW1lTWFwcGVyPFQ+Pg0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PENsYXNzPiBkZW5pZWROYW1lTWFwcGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWdpc3RlcihOYW1lTWFwcGVyPFQ+IG5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIGlmKCFkZW5pZWROYW1lTWFwcGVyTGlzdC5jb250YWlucyhuYW1lTWFwcGVyLmdldENsYXNzKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGdldE5hbWVNYXBwZXJMaXN0KCkuYWRkKG5hbWVNYXBwZXIpOw0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoZ2V0TmFtZU1hcHBlckxpc3QoKSwgZ2V0Q29tcGFyYXRvcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgQ29tcGFyYXRvcjxOYW1lTWFwcGVyPFQ+PiBnZXRDb21wYXJhdG9yKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPE5hbWVNYXBwZXI8VD4+KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRlcmVnaXN0ZXIoQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IGNsYXNzVG9EZXJlZ2lzdGVyKQ0KLSAgICB7DQotICAgICAgICBJdGVyYXRvcjxOYW1lTWFwcGVyPFQ+PiBuYW1lTWFwcGVySXRlcmF0b3IgPSBnZXROYW1lTWFwcGVyTGlzdCgpLml0ZXJhdG9yKCk7DQotICAgICAgICB3aGlsZShuYW1lTWFwcGVySXRlcmF0b3IuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG5hbWVNYXBwZXJJdGVyYXRvci5uZXh0KCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKGNsYXNzVG9EZXJlZ2lzdGVyLmdldE5hbWUoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBuYW1lTWFwcGVySXRlcmF0b3IucmVtb3ZlKCk7DQotICAgICAgICAgICAgICAgIC8vZG9uJ3QgYnJlYWsgLSBlLmcuIHRvIGRlcmVnaXN0ZXIgYWxsIHdyYXBwZXJzLi4uDQotICAgICAgICAgICAgICAgIC8vYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGRlbnkoQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IGNsYXNzVG9EZW55KQ0KLSAgICB7DQotICAgICAgICBkZXJlZ2lzdGVyKGNsYXNzVG9EZW55KTsNCi0NCi0gICAgICAgIHN5bmNocm9uaXplZCAoZ2V0Q2xhc3MoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBkZW5pZWROYW1lTWFwcGVyTGlzdC5hZGQoY2xhc3NUb0RlbnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBMaXN0PE5hbWVNYXBwZXI8VD4+IGdldE5hbWVNYXBwZXJMaXN0KCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9DbGFzc01hcHBpbmdGYWN0b3J5LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTI3ZTBiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9DbGFzc01hcHBpbmdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIENsYXNzTWFwcGluZ0ZhY3Rvcnk8UCwgUj4KLXsKLSAgICBSIGNyZWF0ZShQIHNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRGVmYXVsdEZhY3RvcnlGaW5kZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9EZWZhdWx0RmFjdG9yeUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjk3NTVmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9EZWZhdWx0RmFjdG9yeUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLkRlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRGVmYXVsdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8vZHluYW1pYyBhcHByb2FjaCB0byBjcmVhdGUgdGhlIGZhY3RvcmllcyBkdXJpbmcgdGhlIGZpcnN0IHJlcXVlc3QsIHdoZW4gYSBmYWNlcy1jb250ZXh0IGlzIGF2YWlsYWJsZQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWN0b3J5RmluZGVyIGltcGxlbWVudHMgRmFjdG9yeUZpbmRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJvdGVjdGVkIE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4gZmFjdG9yeU1hcCA9IG5ldyBIYXNoTWFwPEZhY3RvcnlOYW1lcywgT2JqZWN0PigpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIgPSBuZXcgRGVmYXVsdEZhY3RvcnlGaW5kZXIoKTsNCi0NCi0gICAgcHJvdGVjdGVkIERlZmF1bHRGYWN0b3J5RmluZGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY3RvcnlGaW5kZXIgZ2V0SW5zdGFuY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjdG9yeUZpbmRlcjsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgZmluYWwgPFQ+IFQgZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUsIENsYXNzPFQ+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZighKGZhY3RvcnlNYXAuY29udGFpbnNLZXkoZmFjdG9yeU5hbWUpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0RmFjdG9yeShmYWN0b3J5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKFQpZmFjdG9yeU1hcC5nZXQoZmFjdG9yeU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIHN3aXRjaCAoZmFjdG9yeU5hbWUpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2FzZSBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZU1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZU1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZVJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgRUxfSEVMUEVSX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVFTEhlbHBlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBGQUNFU19NRVNTQUdFX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVGYWNlc01lc3NhZ2VGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIFNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlU3RvcmFnZU1hbmFnZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZVZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICANCi0gICAgICAgICAgICBkZWZhdWx0OiAvL3JlcXVpcmVkIGJ5IGNoZWNrc3R5bGUNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgcG9zc2libGUgdG8gY3JlYXRlIGZhY3RvcnkgIiArIGZhY3RvcnlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZhY3RvcnlNYXAucHV0KGZhY3RvcnlOYW1lLCBmYWN0b3J5KTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkpOw0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSk7DQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotICAgICAgICBMaXN0PFN0cmluZz4gbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSk7DQotICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZICk7DQotICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUZhY2VzTWVzc2FnZUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0ZBQ0VTX01FU1NBR0VfRkFDVE9SWSk7DQotICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkpKTsNCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkubmFtZSgpKTsNCi0gICAgICAgIGlmKHRhcmdldCAhPSBudWxsICYmIHRhcmdldCBpbnN0YW5jZW9mIFN0cmluZykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoKFN0cmluZyl0YXJnZXQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlRUxIZWxwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0RUxIZWxwZXJGYWN0b3J5KCk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlkpOw0KLSAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSk7DQotICAgICAgICBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHN0b3JhZ2VNYW5hZ2VyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IHN0b3JhZ2VNYW5hZ2VyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWSk7DQotICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1BBUkFNRVRFUl9GQUNUT1JZKSk7DQotICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogdmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YmQ4YTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRmFjZXNNZXNzYWdlRmFjdG9yeQ0KLXsNCi0gICAgRmFjZXNNZXNzYWdlIGNvbnZlcnQoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSk7DQotDQotICAgIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGYyNjI1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnlGaW5kZXIKLXsKLSAgICA8VD4gVCBnZXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlOYW1lcy5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTJiMTVlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQotcHVibGljIGVudW0gRmFjdG9yeU5hbWVzCi17Ci0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwKLQotICAgIFZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZLAotICAgIFZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlksCi0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksCi0gICAgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLAotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLAotCi0gICAgRkFDRVNfTUVTU0FHRV9GQUNUT1JZLAotCi0gICAgUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwKLSAgICBFTF9IRUxQRVJfRkFDVE9SWSwKLQotICAgIFNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZCi19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L05hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQyZDFmMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8VCBleHRlbmRzIE5hbWVNYXBwZXI+DQotew0KLSAgICB2b2lkIHJlZ2lzdGVyKFQgY2xhc3NUb0FkZCk7DQotICAgIHZvaWQgZGVyZWdpc3RlcihDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gY2xhc3NUb0RlcmVnaXN0ZXIpOw0KLSAgICB2b2lkIGRlbnkoQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IGNsYXNzVG9EZW55KTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjUwMGMzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0Fic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRTZWNyZXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3g7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVMaXN0Ym94Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTWVudTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZVJhZGlvOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUNoZWNrYm94Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUxpc3Rib3g7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TWVudTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dGFyZWE7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyDQotew0KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbGlkYXRlRW1wdHlGaWVsZHMoKSAmJiBFeHRWYWxVdGlscy5pc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25BY3RpdmUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyZVJlcXVpcmVkQXR0cmlidXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgY29uZmlndXJlTWF4TGVuZ3RoQXR0cmlidXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUVtcHR5RmllbGRzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLnZhbGlkYXRlRW1wdHlGaWVsZHMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjb25maWd1cmVSZXF1aXJlZEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSk7DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRTZWNyZXQgfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94IHx8DQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lTWVudSB8fA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVSYWRpbyB8fA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUxpc3Rib3ggfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueU1lbnUgfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogaWYgdGhlcmUgaXMgbm8gc3BlY2lhbCBhdHRyaWJ1dGUgYXQgdGhlIGNvbXBvbmVudCB3aGljaCBzaG91bGQgb3ZlcnJ1bGUNCi0gICAgICogdGhlIGFubm90YXRlZCBwcm9wZXJ0eSByZXR1cm4gdHJ1ZSENCi0gICAgICoNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IGNvbXBvbmVudCB3aGljaCBpbXBsZW1lbnRzIHRoZSBFZGl0YWJsZVZhbHVlSG9sZGVyIGludGVyZmFjZQ0KLSAgICAgKiBAcmV0dXJuIGZhbHNlIHRvIG92ZXJydWxlIHRoZSBhbm5vdGF0ZWQgcHJvcGVydHkgZS5nLiBpZiBjb21wb25lbnQgaXMgcmVhZG9ubHkNCi0gICAgICovDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJyZWZhY3RvciIpDQotICAgIHByb3RlY3RlZCBCb29sZWFuIGlzQ29tcG9uZW50UmVxdWlyZWQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzUmVhZG9ubHkiKSkpOw0KLSAgICAgICAgYm9vbGVhbiBpc0Rpc2FibGVkID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNEaXNhYmxlZCIpKSk7DQotDQotICAgICAgICByZXR1cm4gIShpc1JlYWRPbmx5IHx8IGlzRGlzYWJsZWQpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZU1heExlbmd0aEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKTsNCi0NCi0gICAgICAgICAgICBpZighKG1heExlbmd0aCBpbnN0YW5jZW9mIEludGVnZXIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBIdG1sSW5wdXRUZXh0IGh0bWxJbnB1dFRleHQgPSAoSHRtbElucHV0VGV4dCl1aUNvbXBvbmVudDsNCi0gICAgICAgICAgICAgICAgaHRtbElucHV0VGV4dC5zZXRNYXhsZW5ndGgoKEludGVnZXIpbWF4TGVuZ3RoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEh0bWxJbnB1dFNlY3JldCBodG1sSW5wdXRTZWNyZXQgPSAoSHRtbElucHV0U2VjcmV0KXVpQ29tcG9uZW50Ow0KLSAgICAgICAgICAgICAgICBodG1sSW5wdXRTZWNyZXQuc2V0TWF4bGVuZ3RoKChJbnRlZ2VyKW1heExlbmd0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9Db21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2RjMDFlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXJTdXBwb3J0OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQWxsb3dzIHRvIGluaXRpYWxpemUgY29tcG9uZW50cyBiZWZvcmVFbmNvZGVCZWdpbi48YnIvPgotICogZS5nLjogeW91IGNhbiBhZGQgaW5mb3JtYXRpb24gZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gbWVjaGFuaXNtcywuLi4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydAotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NzE1NDAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBTdGF0aWNDb25maWd1cmF0aW9uPFQsIFI+Ci17Ci0gICAgdm9pZCBzZXRTb3VyY2VPZk1hcHBpbmcoU3RyaW5nIHBhdGgpOwotICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFQsIFI+PiBnZXRNYXBwaW5nKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzMxMGY0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8VCwgUj4KLXsKLSAgICBwcml2YXRlIFQgc291cmNlOwotICAgIHByaXZhdGUgUiB0YXJnZXQ7Ci0KLSAgICBwdWJsaWMgVCBnZXRTb3VyY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoVCBzb3VyY2UpCi0gICAgewotICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUiBnZXRUYXJnZXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRhcmdldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoUiB0YXJnZXQpCi0gICAgewotICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNzViZjQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSX0pCi1wdWJsaWMgZW51bSBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMKLXsKLSAgICBNRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9DT05GSUcsCi0gICAgU1RPUkFHRV9UWVBFX1RPX1NUT1JBR0VfTUFOQUdFUl9DT05GSUcsCi0KLSAgICBTS0lQX1ZBTElEQVRJT05fU1VQUE9SVF9DT05GSUcsCi0gICAgVkFMSURBVElPTl9QQVJBTUVURVJfQ09ORklHCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDg3ZDBkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuUkVVU0V9KQotcHVibGljIGNsYXNzIFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+Ci17Ci0gICAgcHJpdmF0ZSBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmdzCi0gICAgICAgID0gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlT2ZNYXBwaW5nKFN0cmluZyBwYXRoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBnZXRNYXBwaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtYXBwaW5nczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBzb3VyY2UsIFN0cmluZyB0YXJnZXQpCi0gICAgewotICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5ID0gbmV3IFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgZW50cnkuc2V0U291cmNlKHNvdXJjZSk7Ci0gICAgICAgIGVudHJ5LnNldFRhcmdldCh0YXJnZXQpOwotICAgICAgICB0aGlzLm1hcHBpbmdzLmFkZChlbnRyeSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWE2M2M0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIFN0cmluZyBwYXRoOwotICAgIHByaXZhdGUgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5nczsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCkKLSAgICB7Ci0gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgICAgIC8vZm9yY2UgcmVsb2FkCi0gICAgICAgIG1hcHBpbmdzID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBnZXRNYXBwaW5nKCkKLSAgICB7Ci0gICAgICAgIGlmKG1hcHBpbmdzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtYXBwaW5nczsKLSAgICAgICAgfQotCi0gICAgICAgIG1hcHBpbmdzID0gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotCi0gICAgICAgIFJlc291cmNlQnVuZGxlIG1hcHBpbmcgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocGF0aCk7Ci0KLSAgICAgICAgaWYgKG1hcHBpbmcgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9sb2dnaW5nCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IG1hcHBpbmcuZ2V0S2V5cygpOwotCi0gICAgICAgIFN0cmluZyBtZXRhRGF0YUtleTsKLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsKLQotICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YURhdGFLZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSBtYXBwaW5nLmdldFN0cmluZyhtZXRhRGF0YUtleSk7Ci0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWV0YURhdGFLZXksIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBtZXRhRGF0YUtleSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2UobWV0YURhdGFLZXkpOwotICAgICAgICBlbnRyeS5zZXRUYXJnZXQodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsKLSAgICAgICAgdGhpcy5tYXBwaW5ncy5hZGQoZW50cnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGQzZjA3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yIGltcGxlbWVudHMgUmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRJbnRlcmNlcHRvcklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJldHVyblZhbHVlT25Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKAotICAgICAgICBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIHNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24sIE9iamVjdCBjdXJyZW50UmV0dXJuVmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gY3VycmVudFJldHVyblZhbHVlOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBiZWZvcmUKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJlZm9yZURlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGFmdGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9BYnN0cmFjdFZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmYzNWZhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlZhbGlkYXRpb25Nb2R1bGVLZXk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5SZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZWwuUHJvcGVydHlOb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3INCi17DQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvblN1cHBvcnRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpDQotICAgICAgICAgICAgdGhyb3dzIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvKg0KLSAgICAgICAgICogY29tcG9uZW50IGluaXRpYWxpemF0aW9uIHNldHMgYSBjb21wb25lbnQgdG8gcmVxdWlyZWQgaWYgdGhlcmUgYXJlIGNvbnN0cmFpbnRzIHdoaWNoIGluZGljYXRlIGl0DQotICAgICAgICAgKiB0aGUgcmVxdWlyZWQgZmxhZyBpbiBhIGNvbXBvbmVudCBsZWFkcyB0byBwcm9ibGVtcyB3aXRoIGg6bWVzc2FnZXMgKGFkZGl0aW9uYWwgbWVzc2FnZSkgYXMgd2VsbCBhcw0KLSAgICAgICAgICogaW5jb21wYXRpYmlsaXRpZXMgd2l0aCBza2lwIHZhbGlkYXRpb24gYW5kIHNldmVyaXRpZXMNCi0gICAgICAgICAqLw0KLSAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyICYmIEV4dFZhbFV0aWxzLmlzUmVxdWlyZWRSZXNldEFjdGl2YXRlZCgpICYmDQotICAgICAgICAgICAgICAgIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvblN1cHBvcnRlZCgpICYmIEV4dFZhbFV0aWxzLmlzUmVxdWlyZWRJbml0aWFsaXphdGlvbkFjdGl2ZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQoZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkNCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkgJiYgIWlzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25EZWFjdGl2YXRlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCk7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8sIFJlbmRlcmVyIHdyYXBwZWQpDQotICAgICAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0Ow0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgY29udmVydGVkT2JqZWN0ID0gd3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChQcm9wZXJ0eU5vdEZvdW5kRXhjZXB0aW9uIHIpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNGYXRhbEVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmZhdGFsKCJpdCBzZWVtcyB5b3UgYXJlIHVzaW5nIGFuIGludmFsaWQgYmluZGluZy4gIiArIHdyYXBwZWQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICArICI6IGNvbnZlcnNpb24gZmFpbGVkLiBub3JtYWxseSB0aGlzIGlzID5ub3Q8IGEgbXlmYWNlcyBleHR2YWwgaXNzdWUhIiwgcik7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHRocm93IHI7DQotICAgICAgICB9DQotDQotICAgICAgICBzZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydGllcyh1aUNvbXBvbmVudCk7DQotICAgICAgICANCi0gICAgICAgIGlmKHJlY29yZFByb2Nlc3NlZEluZm9ybWF0aW9uKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9yZWNvcmRlIHVzZXIgaW5wdXQgZS5nLiBmb3IgY3Jvc3MtY29tcG9uZW50IHZhbGlkYXRpb24NCi0gICAgICAgICAgICBmb3IoUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlciByZWNvcmRlciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZWNvcmRlci5yZWNvcmRVc2VySW5wdXQodWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UocmVjb3JkZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGNhbGxlZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QgPSB0cmFuc2Zvcm1WYWx1ZUZvclZhbGlkYXRpb24oY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgICAgICAgICAgICAgaWYodmFsaWRhdGVWYWx1ZShjb252ZXJ0ZWRPYmplY3QpICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0JlZm9yZVZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1ZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBtaWdodCBkZWNpZGUgdGhhdCBpdCBpc24ndCBhbiBleGNlcHRpb24NCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudCh1aUNvbXBvbmVudCwgZS5nZXRGYWNlc01lc3NhZ2UoKSwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZmluYWxFeGNlcHRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29udmVydGVyRXhjZXB0aW9uKGUuZ2V0RmFjZXNNZXNzYWdlKCksIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGZpbmFsbHkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzQWZ0ZXJWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICAgICAgcmVzZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydGllcyh1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0JlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmV4ZWN1dGVHbG9iYWxCZWZvcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHZhbHVlLA0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uLmNsYXNzLmdldE5hbWUoKSwgZ2V0UHJvcGVydHlJbmZvcm1hdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KSwgZ2V0TW9kdWxlS2V5KCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NBZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMuZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWx1ZSwNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIGdldFByb3BlcnR5SW5mb3JtYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCksIGdldE1vZHVsZUtleSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgUHJvcGVydHlJbmZvcm1hdGlvbiBnZXRQcm9wZXJ0eUluZm9ybWF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0aWVzRm9yQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IgPSBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcihwcm9wZXJ0aWVzKTsNCi0NCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXNGb3JDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBpZihnZXRNb2R1bGVLZXkoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpLCBnZXRNb2R1bGVLZXkoKSk7DQotICAgICAgICB9DQotICAgICAgICBwcm9wZXJ0aWVzLnB1dChVSUNvbXBvbmVudC5jbGFzcy5nZXROYW1lKCksIHVpQ29tcG9uZW50KTsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IHRyYW5zZm9ybVZhbHVlRm9yVmFsaWRhdGlvbihPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIiIuZXF1YWxzKGNvbnZlcnRlZE9iamVjdCkgJiYgaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZShPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZihpc1ZhbHVlVG9WYWxpZGF0ZUVtcHR5KGNvbnZlcnRlZE9iamVjdCkgJiYgIXZhbGlkYXRlRW1wdHlGaWVsZHMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoImVtcHR5IGZpZWxkIHZhbGlkYXRpb24gaXMgZGVhY3RpdmF0ZWQgaW4gdGhlIHdlYi54bWwgLSBzZWU6ICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5WQUxJREFURV9FTVBUWV9GSUVMRFMiKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWx1ZVRvVmFsaWRhdGVFbXB0eShPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0ID09IG51bGwgfHwgIiIuZXF1YWxzKGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVFbXB0eUZpZWxkcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy52YWxpZGF0ZUVtcHR5RmllbGRzKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIgJiYgaXNWYWx1ZUJpbmRpbmdPZkNvbXBvbmVudFZhbGlkKHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWx1ZUJpbmRpbmdPZkNvbXBvbmVudFZhbGlkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCkgIT0gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25EZWFjdGl2YXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DT01QT05FTlRfSU5JVElBTElaQVRJT04pOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHJlY29yZFByb2Nlc3NlZEluZm9ybWF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0TW9kdWxlS2V5KCkNCi0gICAgew0KLSAgICAgICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEludGVyY2VwdG9yUHJvcGVydGllcyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIGlmKGdldE1vZHVsZUtleSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LnB1dChWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzLmdldE5hbWUoKSwgZ2V0TW9kdWxlS2V5KCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmVzdWx0LnB1dChVSUNvbXBvbmVudC5jbGFzcy5nZXROYW1lKCksIHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0aWVzKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlIGludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlID0gZ2V0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gZ2V0SW50ZXJjZXB0b3JQcm9wZXJ0aWVzKHVpQ29tcG9uZW50KTsNCi0gICAgICAgIGZvcihTdHJpbmcga2V5IDogcHJvcGVydGllcy5rZXlTZXQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5zZXRQcm9wZXJ0eShrZXksIHByb3BlcnRpZXMuZ2V0KGtleSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZXNldFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0aWVzKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlIGludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlID0gZ2V0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgZm9yKFN0cmluZyBrZXkgOiBnZXRJbnRlcmNlcHRvclByb3BlcnRpZXModWlDb21wb25lbnQpLmtleVNldCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLnJlbW92ZVByb3BlcnR5KGtleSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlIGdldFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Db21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Bd2FyZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZjcxMTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Db21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlclN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Bd2FyZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKEpzZlV0aWxzLmlzUmVuZGVyUmVzcG9uc2VQaGFzZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFmdGVyRXh0cmFjdGluZ0ZvckNvbXBvbmVudEluaXRpYWxpemF0aW9uKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFmdGVyRXh0cmFjdGluZ0ZvckNvbXBvbmVudEluaXRpYWxpemF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbik7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2YjE2My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0ZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkZhY2VzTWVzc2FnZVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDkwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBGYWNlc01lc3NhZ2VQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2VTdG9yYWdlIGZhY2VzTWVzc2FnZVN0b3JhZ2UgPSBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKA0KLSAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLCBGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBpZihmYWNlc01lc3NhZ2VTdG9yYWdlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNNZXNzYWdlU3RvcmFnZS5hZGRBbGwoKTsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5yZXNldFN0b3JhZ2UoRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcywgRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0h0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDdjOTI4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5MYWJlbGVkTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLmV4Y2VwdGlvbi5SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFNlY3JldDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVMaXN0Ym94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVSYWRpbzsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueU1lbnU7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dGFyZWE7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpCi0gICAgewotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSBFeHRWYWxVdGlscy5jb252ZXJ0RmFjZXNNZXNzYWdlKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSk7Ci0KLSAgICAgICAgICAgIHRyeVRvVXNlSW5saW5lTWVzc2FnZSh1aUNvbXBvbmVudCwgdmFsaWRhdG9yRXhjZXB0aW9uKTsKLQotICAgICAgICAgICAgdHJ5VG9Vc2VMYWJlbChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBmYWNlc01lc3NhZ2UpOwotCi0gICAgICAgICAgICB0cnlUb0Jsb2Nrc05hdmlnYXRpb24odWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGZhY2VzTWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvVXNlSW5saW5lTWVzc2FnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCk7Ci0gICAgICAgIFN0cmluZyBpbmxpbmVNZXNzYWdlOwotCi0gICAgICAgIGlmKHZhbGlkYXRvckV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmxpbmVNZXNzYWdlID0gZ2V0SW5saW5lUmVxdWlyZWRNZXNzYWdlKHVpQ29tcG9uZW50KTsKLQotICAgICAgICAgICAgaWYoaW5saW5lTWVzc2FnZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGlubGluZU1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoaW5saW5lTWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgaW5saW5lTWVzc2FnZSA9IGdldElubGluZVZhbGlkYXRvck1lc3NhZ2UodWlDb21wb25lbnQpOwotCi0gICAgICAgICAgICBpZihpbmxpbmVNZXNzYWdlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoaW5saW5lTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldERldGFpbChpbmxpbmVNZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1VzZUxhYmVsKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpCi0gICAgewotICAgICAgICBTdHJpbmcgbGFiZWwgPSAoU3RyaW5nKSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsCi0gICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldExhYmVsIikpOwotCi0gICAgICAgIGlmKGxhYmVsID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxhYmVsID0gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vb3ZlcnJpZGUgdGhlIGxhYmVsIGlmIHRoZSBhbm5vdGF0aW9uIHByb3ZpZGVzIGEgbGFiZWwKLSAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxhYmVsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCwgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIExhYmVsZWRNZXNzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKExhYmVsZWRNZXNzYWdlKWZhY2VzTWVzc2FnZSkuc2V0TGFiZWxUZXh0KGxhYmVsKTsKLSAgICAgICAgfQotICAgICAgICAvL2lmIHNvbWVvbmUgdXNlcyBhIG5vcm1hbCBmYWNlcyBtZXNzYWdlCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwoZmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiY2hlY2sgaWYgaXQgaXMgc3RpbGwgcmVxdWlyZWQgaGVyZSIpCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvQmxvY2tzTmF2aWdhdGlvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQotICAgIHsKLSAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vY29ycmVjdCBzZXZlcml0eSBpcyBlLmcuIHByb3ZpZGVkIGJ5IFZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yCi0gICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnQodWlDb21wb25lbnQsIGZhY2VzTWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRJbmxpbmVSZXF1aXJlZE1lc3NhZ2UoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gKFN0cmluZylSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJnZXRSZXF1aXJlZE1lc3NhZ2UiKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW5saW5lVmFsaWRhdG9yTWVzc2FnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCh1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldFZhbGlkYXRvck1lc3NhZ2UiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lUmFkaW8gfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TGlzdGJveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYzQ5NjIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlJbmZvcm1hdGlvbiB0aGUgaW5mb3JtYXRpb24gZW50cnkgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3BlcnR5DQotICAgICAqLw0KLSAgICB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0Y2Y1MjcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotew0KLSAgICAvKioNCi0gICAgICogQHJldHVybiBmYWxzZSBpZiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzIHNob3VsZCBiZSBieXBhc3NlZA0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpOw0KLQ0KLSAgICAvKioNCi0gICAgICogcHJvY2Vzc2VkIGlmIHZhbGlkYXRpb24gd2FzIGV4ZWN1dGVkDQotICAgICAqIGluIGNvbnRyYXN0IHRvIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpdCBnZXRzIGV4ZWN1dGVkIGluIGFueSBjYXNlDQotICAgICAqLw0KLSAgICB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9SZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVmMjc1OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbGxvd3MgdG8gaW50ZXJjZXB0IHJlbmRlcmVyIG1ldGhvZHMuPGJyLz4KLSAqIEJhc2UgbWVjaGFuaXNtIG9mIGV4dHZhbC4gSXQgYWxsb3dzIHRvIGFkZCBjdXN0b20gaW5mcmFzdHJ1Y3R1cmVzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBSZW5kZXJlckludGVyY2VwdG9yCi17Ci0gICAgU3RyaW5nIGdldEludGVyY2VwdG9ySWQoKTsKLQotICAgIE9iamVjdCBnZXRSZXR1cm5WYWx1ZU9uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBza2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLCBPYmplY3QgY3VycmVudFJldHVyblZhbHVlKTsKLQotICAgIC8qCi0gICAgICogYmVmb3JlCi0gICAgICovCi0gICAgdm9pZCBiZWZvcmVEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKgotICAgICAqIGFmdGVyCi0gICAgICovCi0gICAgdm9pZCBhZnRlckRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGVjM2QwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEFsbG93cyB0byBpbnRlcmNlcHQgdmFsaWRhdGlvciBleGNlcHRpb25zLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlclN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgLyoqDQotICAgICAqDQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCB0aGUgY3VycmVudCBjb21wb25lbnQNCi0gICAgICogQHBhcmFtIG1ldGFEYXRhRW50cnkgdGhlIG1ldGEgZGF0YSBlbnRyeSB3aGljaCBjb250YWlucyB0aGUgbWV0YSBkYXRhIG9mIHRoZSBwcm9wZXJ0eQ0KLSAgICAgKiBAcGFyYW0gY29udmVydGVkT2JqZWN0IHRoZSBjb252ZXJ0ZWQgdXNlciBpbnB1dA0KLSAgICAgKiBAcGFyYW0gdmFsaWRhdG9yRXhjZXB0aW9uIHRoZSBjdXJyZW50IGV4Y2VwdGlvbg0KLSAgICAgKiBAcGFyYW0gdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlIHZhbGlkYXRpb24gc3RyYXRlZ3kgd2hpY2ggdGhyZXcgdGhlIGV4Y2VwdGlvbg0KLSAgICAgKiBAcmV0dXJuIGZhbHNlIHRvIHN0b3AgdGhyb3dpbmcgdGhlIGV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZTE1ZTAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25JbnRlcmNlcHRvcgotewotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvblN1cHBvcnRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgdG8gaW5pdCBjb21wb25lbnQgIiArIHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGFSZXN1bHQgPSBFeHRWYWxVdGlscwotICAgICAgICAgICAgICAgIC5nZXRUcmFuc2Zvcm1lZE1ldGFEYXRhRm9yKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGdldE1vZHVsZUtleSgpKTsKLQotICAgICAgICAvL2dldCBjb21wb25lbnQgaW5pdGlhbGl6ZXIgZm9yIHRoZSBjdXJyZW50IGNvbXBvbmVudCBhbmQgY29uZmlndXJlIGl0Ci0gICAgICAgIC8vYWxzbyBpbiBjYXNlIG9mIHNraXBwZWQgdmFsaWRhdGlvbiB0byByZXNldCBlLmcuIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGUKLSAgICAgICAgaWYoIW1ldGFEYXRhUmVzdWx0LmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29uZmlndXJlQ29tcG9uZW50V2l0aE1ldGFEYXRhKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImluaXQgY29tcG9uZW50IG9mICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQotICAgIHsKLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IgPSBFeHRWYWxVdGlscwotICAgICAgICAgICAgICAgIC5nZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcldpdGgoZ2V0UHJvcGVydGllc0ZvckNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKHVpQ29tcG9uZW50KSk7Ci0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCB2YWxpZGF0aW9uIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByb2Nlc3NGaWVsZFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgidmFsaWRhdGlvbiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1ldGFEYXRhRXh0cmFjdG9yIGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcldpdGgocHJvcGVydGllcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ZpZWxkVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQotICAgIHsKLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsKLSAgICAgICAgU2tpcFZhbGlkYXRpb25FdmFsdWF0b3Igc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcigpOwotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldE1ldGFEYXRhRW50cmllcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7Ci0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkYXRpb25TdHJhdGVneUNvbXBhdGlibGVXaXRoVmFsdWUodmFsaWRhdGlvblN0cmF0ZWd5LCAgY29udmVydGVkT2JqZWN0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihza2lwVmFsaWRhdGlvbkV2YWx1YXRvci5za2lwVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uU3RyYXRlZ3ksIGVudHJ5KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInNraXAgdmFsaWRhdGlvbiBvZiAiICsgZW50cnkuZ2V0VmFsdWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2l0aCAiICsgdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvL2Rvbid0IGJyZWFrIG1heWJlIHRoZXJlIGFyZSBjb25zdHJhaW50cyB3aGljaCBkb24ndCBzdXBwb3J0IHRoZSBza2lwLW1lY2hhbmlzbQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgidmFsaWRhdGUgIiArIGVudHJ5LmdldFZhbHVlKCkgKyAiIHdpdGggIiArIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQW5ub3RhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIUV4dFZhbFV0aWxzLmV4ZWN1dGVMb2NhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIHByb3BlcnR5SW5mb3JtYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIHZhbGlkYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBlbnRyeSwgY29udmVydGVkT2JqZWN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb24pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmV4ZWN1dGVMb2NhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uLmNsYXNzLmdldE5hbWUoKSwgcHJvcGVydHlJbmZvcm1hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZih2YWxpZGF0aW9uU3RyYXRlZ3kgPT0gbnVsbCAmJiBsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm5vIHZhbGlkYXRpb24gc3RyYXRlZ3kgZm91bmQgZm9yICIgKyBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRhdGlvblN0cmF0ZWd5Q29tcGF0aWJsZVdpdGhWYWx1ZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBpZih2YWx1ZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3ModmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkpOwotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLmlzQW5ub3RhdGlvblByZXNlbnQoTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICEiIi5lcXVhbHModmFsdWUpIHx8IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3ModmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkpCi0gICAgICAgICAgICAgICAgLmlzQW5ub3RhdGlvblByZXNlbnQoRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICAvKioKLSAgICAgKiB0byBlbnN1cmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGludGVycHJldEVtcHR5U3RyaW5nVmFsdWVzQXNOdWxsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWNvcmRQcm9jZXNzZWRJbmZvcm1hdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Zpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Zpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MzRjNjEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WaW9sYXRpb25TZXZlcml0eVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoOTApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmlvbGF0aW9uU2V2ZXJpdHlWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZihpc0V4dFZhbE1ldGFEYXRhKG1ldGFEYXRhRW50cnkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvUGxhY2VTZXZlcml0eSh2YWxpZGF0b3JFeGNlcHRpb24sIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRXh0VmFsTWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQW5ub3RhdGlvbjsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9QbGFjZVNldmVyaXR5KFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgZm9yKEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSA6IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKQ0KLSAgICAgICAgICAgICAgICAuZXh0cmFjdChhbm5vdGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihWaW9sYXRpb25TZXZlcml0eS5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5LmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkuc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNTc4YzUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbi4gU3ViY2xhc3NlcyBqdXN0IGhhdmUgdG8gbm93IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgbmFtZSBtYXBwZXIuDQotICoNCi0gKiBOYW1lTWFwcGVycyBhcmUgc3RhdGVsZXNzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFQ+IGltcGxlbWVudHMgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJpdmF0ZSBOYW1lTWFwcGVyPFQ+IGN1c3RvbU5hbWVNYXBwZXI7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShUIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGN1c3RvbU5hbWVNYXBwZXIgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpOw0KLQ0KLSAgICAgICAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU5hbWVNYXBwZXIgPSAoTmFtZU1hcHBlcjxUPikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChjdXN0b21OYW1lTWFwcGVyICE9IG51bGwpID8gY3VzdG9tTmFtZU1hcHBlci5jcmVhdGVOYW1lKHNvdXJjZSkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NWI2MmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlclN1cHBvcnQ7DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBuYW1lIG1hcHBlcnMuDQotICogQSBuYW1lIG1hcHBlciBjYWxjdWxhdGVzIGEgbmFtZSBmb3IgYSBnaXZlbiBzb3VyY2Ugb2JqZWN0Lg0KLSAqIGUuZy4gTWV0YS1EYXRhIEtleSAoZS5nLjogYW5ub3RhdGlvbiBjbGFzcyBuYW1lKSAtPiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBOYW1lTWFwcGVyPFQ+DQotew0KLSAgICBTdHJpbmcgY3JlYXRlTmFtZShUIHNvdXJjZSk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL1N1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNmRkZDIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBpbnRlcmZhY2UgZm9yIG5hbWUtbWFwcGVycyB3aGljaCBoYXZlIHRvIGRlbGVnYXRlIHRvIG90aGVyIChzdWItKW5hbWUtbWFwcGVycw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXI8VD4gZXh0ZW5kcyBOYW1lTWFwcGVyPFQ+DQotew0KLSAgICB2b2lkIGFkZE5hbWVNYXBwZXIoTmFtZU1hcHBlcjxUPiBuYW1lTWFwcGVyKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvQ29tbW9uTWV0YURhdGFLZXlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYWU2MzcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9Db21tb25NZXRhRGF0YUtleXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogaGVscGVyIGZvciBmcmVxdWVudCBtZXRhLWRhdGEga2V5cw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotLyoNCi0gKiBwbGFjZWQgaW4gY29yZSB0byBhdm9pZCBkdXBsaWNhdGVkIGluZm9ybWF0aW9uIGluIG11bHRpcGxlIG1vZHVsZXMgKHZhbGlkYXRpb24gbW9kdWxlIGFuZCBjb21wb25lbnQtc3VwcG9ydCBtb2R1bGUpDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1vbk1ldGFEYXRhS2V5cw0KLXsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRCA9ICJyZXF1aXJlZCI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBS19SRVFVSVJFRCA9ICJ3ZWFrX3JlcXVpcmVkIjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5fTEVOR1RIID0gIm1pbl9sZW5ndGgiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTl9MRU5HVEhfREVGQVVMVCA9ICJtaW5fbGVuZ3RoX2RlZmF1bHQiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9MRU5HVEggPSAibWF4X2xlbmd0aCI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0xFTkdUSF9ERUZBVUxUID0gIm1heF9sZW5ndGhfZGVmYXVsdCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOR0VfTUlOID0gInJhbmdlX21pbiI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOR0VfTUlOX0RFRkFVTFQgPSAicmFuZ2VfbWluX2RlZmF1bHQiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01BWCA9ICJyYW5nZV9tYXgiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01BWF9ERUZBVUxUID0gInJhbmdlX21heF9kZWZhdWx0IjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRURVJOID0gInBhdHRlcm4iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFID0gInBhdHRlcm5fdmFsaWRhdGlvbl9lcnJvcl9tZXNzYWdlIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFTUFJTCA9ICJlbWFpbCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NID0gImN1c3RvbSI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9WQUxJREFUSU9OID0gInNraXBfdmFsaWRhdGlvbiI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRV9DTElFTlRfU0lERV9WQUxJREFUSU9OID0gImRpc2FibGVfY2xpZW50X3NpZGVfdmFsaWRhdGlvbiI7DQotICAgIC8vYXZhaWxhYmxlIGZvciBhZGQtb25zIG5vdCB1c2VkIGludGVybmFsbHkgZHVlIHRvIHBlcmZvcm1hbmNlIHJlYXNvbnMNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFX1NIT1dfSU5ESUNBVElPTiA9ICJkaXNhYmxlX3Nob3dfaW5kaWNhdGlvbiI7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvTWV0YURhdGFFbnRyeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9NZXRhRGF0YUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNTQ1ODIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9NZXRhRGF0YUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogRGF0YSBob2xkZXIgd2hpY2ggc3RvcmVzIHRoZSBtZXRhLWRhdGEgYW5kIHNvbWUgaW5mb3JtYXRpb24gd2hlcmUgdGhlIG1ldGEtZGF0YSB3YXMgYXJvdW5kLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIE1ldGFEYXRhRW50cnkKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcga2V5OwotICAgIHByaXZhdGUgT2JqZWN0IHZhbHVlOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gICAgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoInNldHRpbmcgbWV0YS1kYXRhIGtleTogIiArIGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0VmFsdWUoQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgic2V0dGluZyBtZXRhLWRhdGEgdmFsdWU6ICIgKyB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIDxUPiBUIGdldFByb3BlcnR5KFN0cmluZyBrZXksIENsYXNzPFQ+IHRhcmdldENsYXNzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUKWdldFByb3BlcnR5KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoIm5ldyBwcm9wZXJ0eSBhZGRlZCBrZXk6ICIgKyBrZXkgKyAiIHZhbHVlOiAiICsgdmFsdWUgKyAiIGZvciBtZXRhZGF0YS1rZXk6ICIgKyB0aGlzLmtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZGMyNmQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYWxsIGZhY3RvcmllcyB3aGljaCBjcmVhdGUgbWV0YS1kYXRhIGV4dHJhY3RvcnMKLSAqIAotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeQotewotICAgIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZSgpOwotCi0gICAgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlV2l0aChNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU0Y2NjYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NZXRhRGF0YVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5Qcm9wZXJ0eVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS5iZWFucy5CZWFuSW5mbzsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIGV4dHJhY3RzIG1ldGEtZGF0YSAoZS5nLiB0aGUgYW5ub3RhdGlvbnMpIG9mIHRoZSB2YWx1ZSBiaW5kaW5nIG9mIGEgY29tcG9uZW50LgotICogSXQgZXh0cmFjdHMgdGhlIG1ldGEtZGF0YSBvZiB0aGUgZmllbGQgYW5kIHRoZSBwcm9wZXJ0eS4KLSAqIChBbHNvIHRoZSBhbm5vdGF0aW9ucyBvZiBzdXBlciBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzLikKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvciBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdG9yCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHB1YmxpYyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKQotICAgIHsKLSAgICAgICAgaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQotICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOwotCi0gICAgICAgIC8vc2hvdWxkIG5ldmVyIG9jY3VyCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSAmJiBvYmplY3QgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKG9iamVjdC5nZXRDbGFzcygpICsgIiBpcyBubyB2YWxpZCBjb21wb25lbnQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQgPSAoVUlDb21wb25lbnQpIG9iamVjdDsKLQotICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgZXh0cmFjdGluZyBtZXRhLWRhdGEgb2YgIiArIHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAocHJvcGVydHlEZXRhaWxzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZ2V0IGJlYW4gY2xhc3MgYW5kIHByb3BlcnR5IG5hbWUKLSAgICAgICAgICovCi0gICAgICAgIENsYXNzIGVudGl0eUNsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCkpOwotCi0gICAgICAgIC8vY3JlYXRlCi0gICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uc2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsKLQotICAgICAgICBpZiAoaXNDYWNoZWQoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkgOiBnZXRDYWNoZWRNZXRhRGF0YShlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uYWRkTWV0YURhdGFFbnRyeShtZXRhRGF0YUVudHJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4dHJhY3RBbm5vdGF0aW9ucyhwcm9wZXJ0eUluZm9ybWF0aW9uLCBwcm9wZXJ0eURldGFpbHMsIGVudGl0eUNsYXNzKTsKLSAgICAgICAgICAgIGNhY2hlTWV0YURhdGEocHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0cmFjdCBmaW5pc2hlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2FjaGVkKENsYXNzIGVudGl0eUNsYXNzLCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TWV0YURhdGFTdG9yYWdlKCkuY29udGFpbnNNZXRhRGF0YUZvcihlbnRpdHlDbGFzcywgcHJvcGVydHkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjYWNoZU1ldGFEYXRhKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIGdldE1ldGFEYXRhU3RvcmFnZSgpLnN0b3JlTWV0YURhdGFPZihwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1ldGFEYXRhRW50cnlbXSBnZXRDYWNoZWRNZXRhRGF0YShDbGFzcyBlbnRpdHlDbGFzcywgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldE1ldGFEYXRhU3RvcmFnZSgpLmdldE1ldGFEYXRhKGVudGl0eUNsYXNzLCBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVN0b3JhZ2UgZ2V0TWV0YURhdGFTdG9yYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKE1ldGFEYXRhU3RvcmFnZS5jbGFzcywgTWV0YURhdGFTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2FjaGVkRmllbGQoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlTdG9yYWdlKCkuY29udGFpbnNGaWVsZChlbnRpdHksIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9DYWNoZWRGaWVsZChDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSwgRmllbGQgZmllbGQpCi0gICAgewotICAgICAgICBQcm9wZXJ0eVN0b3JhZ2UgcHJvcGVydHlTdG9yYWdlID0gZ2V0UHJvcGVydHlTdG9yYWdlKCk7Ci0gICAgICAgIGlmICghcHJvcGVydHlTdG9yYWdlLmNvbnRhaW5zRmllbGQoZW50aXR5LCBwcm9wZXJ0eSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnR5U3RvcmFnZS5zdG9yZUZpZWxkKGVudGl0eSwgcHJvcGVydHksIGZpZWxkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgRmllbGQgZ2V0Q2FjaGVkRmllbGQoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlTdG9yYWdlKCkuZ2V0RmllbGQoZW50aXR5LCBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2FjaGVkTWV0aG9kKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5U3RvcmFnZSgpLmNvbnRhaW5zTWV0aG9kKGVudGl0eSwgcHJvcGVydHkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0NhY2hlZE1ldGhvZChDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSwgTWV0aG9kIG1ldGhvZCkKLSAgICB7Ci0gICAgICAgIFByb3BlcnR5U3RvcmFnZSBwcm9wZXJ0eVN0b3JhZ2UgPSBnZXRQcm9wZXJ0eVN0b3JhZ2UoKTsKLSAgICAgICAgaWYgKCFwcm9wZXJ0eVN0b3JhZ2UuY29udGFpbnNNZXRob2QoZW50aXR5LCBwcm9wZXJ0eSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnR5U3RvcmFnZS5zdG9yZU1ldGhvZChlbnRpdHksIHByb3BlcnR5LCBtZXRob2QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRob2QgZ2V0Q2FjaGVkTWV0aG9kKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5U3RvcmFnZSgpLmdldE1ldGhvZChlbnRpdHksIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFByb3BlcnR5U3RvcmFnZSBnZXRQcm9wZXJ0eVN0b3JhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoUHJvcGVydHlTdG9yYWdlLmNsYXNzLCBQcm9wZXJ0eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBleHRyYWN0QW5ub3RhdGlvbnMoCi0gICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24sIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMsIENsYXNzIGVudGl0eUNsYXNzKQotICAgIHsKLSAgICAgICAgd2hpbGUgKCFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhlbnRpdHlDbGFzcy5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgICAgICBhZGRGaWVsZEFjY2Vzc0Fubm90YXRpb25zKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0KLSAgICAgICAgICAgIHByb2Nlc3NJbnRlcmZhY2VzKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMsIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICBlbnRpdHlDbGFzcyA9IGVudGl0eUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzSW50ZXJmYWNlcygKLSAgICAgICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcywgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQotICAgIHsKLSAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50SW50ZXJmYWNlIDogY3VycmVudENsYXNzLmdldEludGVyZmFjZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhjdXJyZW50SW50ZXJmYWNlLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0KLSAgICAgICAgICAgIHByb2Nlc3NJbnRlcmZhY2VzKGN1cnJlbnRJbnRlcmZhY2UsIHByb3BlcnR5RGV0YWlscywgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQotICAgIHsKLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IHRyeVRvR2V0UmVhZE1ldGhvZChlbnRpdHksIHByb3BlcnR5KTsKLQotICAgICAgICBpZiAobWV0aG9kID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGhvZCA9IHRyeVRvR2V0UmVhZE1ldGhvZE1hbnVhbGx5KGVudGl0eSwgcHJvcGVydHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnlUb0NhY2hlZE1ldGhvZChlbnRpdHksIHByb3BlcnR5LCBtZXRob2QpOwotICAgICAgICAgICAgYWRkQW5ub3RhdGlvblRvQW5ub3RhdGlvbkVudHJpZXMoQXJyYXlzLmFzTGlzdChtZXRob2QuZ2V0QW5ub3RhdGlvbnMoKSksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRob2QgdHJ5VG9HZXRSZWFkTWV0aG9kKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgaWYgKGlzQ2FjaGVkTWV0aG9kKGVudGl0eSwgcHJvcGVydHkpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q2FjaGVkTWV0aG9kKGVudGl0eSwgcHJvcGVydHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHVzZUJlYW5JbmZvKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJlYW5JbmZvIGJlYW5JbmZvID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKGVudGl0eSk7Ci0gICAgICAgICAgICAgICAgZm9yIChQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlEZXNjcmlwdG9yIDogYmVhbkluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LmVxdWFscyhwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0TmFtZSgpKSAmJiBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEludHJvc3BlY3Rpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlQmVhbkluZm8oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRS5lcXVhbHMoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoQmVhbkluZm8uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRob2QgdHJ5VG9HZXRSZWFkTWV0aG9kTWFudWFsbHkoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2NoYW5nZWQgdG8gb2ZmaWNpYWwgYmVhbiBzcGVjLiBkdWUgdG8gY2FjaGluZyB0aGVyZSBpcyBubyBwZXJmb3JtYW5jZSBpc3N1ZSBhbnkgbW9yZQotICAgICAgICAgICAgcmV0dXJuIGVudGl0eS5nZXREZWNsYXJlZE1ldGhvZCgiaXMiICsgcHJvcGVydHkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVudGl0eS5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0IiArIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJtZXRob2Qgbm90IGZvdW5kIC0gY2xhc3M6ICIgKyBlbnRpdHkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC0gbWV0aG9kczogIiArICJnZXQiICsgcHJvcGVydHkgKyAiICIgKyAiaXMiICsgcHJvcGVydHkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9ucyhDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIEZpZWxkIGZpZWxkOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWVsZCA9IGdldERlY2xhcmVkRmllbGQoZW50aXR5LCBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpZWxkID0gZW50aXR5LmdldERlY2xhcmVkRmllbGQoIl8iICsgcHJvcGVydHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Lmxlbmd0aCgpID4gMSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShwcm9wZXJ0eS5jaGFyQXQoMCkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHByb3BlcnR5LmNoYXJBdCgxKSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vZG9uJ3QgdXNlIEludHJvc3BlY3RvciNkZWNhcGl0YWxpemUgaGVyZQotICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgPSBlbnRpdHkuZ2V0RGVjbGFyZWRGaWVsZChwcm9wZXJ0eS5zdWJzdHJpbmcoMCwgMSkudG9Mb3dlckNhc2UoKSArIHByb3BlcnR5LnN1YnN0cmluZygxKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUocHJvcGVydHkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImZpZWxkICIgKyBwcm9wZXJ0eSArICIgb3IgXyIgKyBwcm9wZXJ0eSArICIgbm90IGZvdW5kIiwgZTEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmaWVsZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnlUb0NhY2hlZEZpZWxkKGVudGl0eSwgcHJvcGVydHksIGZpZWxkKTsKLSAgICAgICAgICAgIGFkZEFubm90YXRpb25Ub0Fubm90YXRpb25FbnRyaWVzKEFycmF5cy5hc0xpc3QoZmllbGQuZ2V0QW5ub3RhdGlvbnMoKSksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWVsZCBnZXREZWNsYXJlZEZpZWxkKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChpc0NhY2hlZEZpZWxkKGVudGl0eSwgcHJvcGVydHkpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q2FjaGVkRmllbGQoZW50aXR5LCBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZW50aXR5LmdldERlY2xhcmVkRmllbGQocHJvcGVydHkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEFubm90YXRpb25Ub0Fubm90YXRpb25FbnRyaWVzKAotICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucywgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQotICAgIHsKLSAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykKLSAgICAgICAgewotICAgICAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5hZGRNZXRhRGF0YUVudHJ5KGNyZWF0ZU1ldGFEYXRhRW50cnlGb3JBbm5vdGF0aW9uKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShhbm5vdGF0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmb3VuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1ldGFEYXRhRW50cnkgY3JlYXRlTWV0YURhdGFFbnRyeUZvckFubm90YXRpb24oQW5ub3RhdGlvbiBmb3VuZEFubm90YXRpb24pCi0gICAgewotICAgICAgICBNZXRhRGF0YUVudHJ5IGVudHJ5ID0gbmV3IE1ldGFEYXRhRW50cnkoKTsKLQotICAgICAgICBlbnRyeS5zZXRLZXkoZm91bmRBbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgZW50cnkuc2V0VmFsdWUoZm91bmRBbm5vdGF0aW9uKTsKLQotICAgICAgICByZXR1cm4gZW50cnk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Zjc2NDViLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGlzIGZhY3RvcnkgY3JlYXRlcyBhIG1ldGEtZGF0YSBleHRyYWN0b3Igd2hpY2ggZXh0cmFjdHMgdGhlIG1ldGEtZGF0YQotICogb2YgdGhlIHZhbHVlIGJpbmRpbmcgb2YgYSBjb21wb25lbnQuCi0gKiA8cC8+Ci0gKiBvcmRlcjo8YnIvPgotICogPG9sPgotICogICA8bGk+Y29uZmlndXJlZCBtZXRhLWRhdGEgZXh0cmFjdG9yICh3ZWIueG1sKTwvbGk+Ci0gKiAgIDxsaT5jb25maWd1cmVkIG1ldGEtZGF0YSBleHRyYWN0b3IgKGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pPC9saT4KLSAqICAgPGxpPmRlZmF1bHQgaW1wbGVtZW50YXRpb248L2xpPgotICogPC9vbD4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkKLXsKLSAgICBwcml2YXRlIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gbnVsbDsKLQotICAgIHB1YmxpYyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQotICAgIHB1YmxpYyBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVdpdGgobnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZVdpdGgoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQotICAgIHsKLSAgICAgICAgaWYgKG1ldGFEYXRhRXh0cmFjdG9yID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SKTsKLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SKSk7Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMuYWRkKERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3IgPSAoTWV0YURhdGFFeHRyYWN0b3IpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1ldGFEYXRhRXh0cmFjdG9yICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKG1ldGFEYXRhRXh0cmFjdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjcmVhdGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvcldpdGgobWV0YURhdGFFeHRyYWN0b3IsIHByb3BlcnRpZXMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL01ldGFEYXRhRXh0cmFjdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9NZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDQwNTFkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL01ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci0KLS8qKgotICogQW4gbWV0YS1kYXRhIGV4dHJhY3RvciBpcyByZXNwb25zaWJsZSB0byBhbmFseXplIGFuIG9iamVjdAotICogYW5kIHJldHVybnMgYWxsIGF2YWlsYWJsZSBtZXRhLWRhdGEgaW5mb3JtYXRpb24KLSAqIAotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhRXh0cmFjdG9yCi17Ci0gICAgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OTkxMmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgZXF1aXZhbGVudCB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0gKg0KLSAqIGlmIHRoZXJlIGlzIGFsc28gYSBwcm94eSBmb3IgdGhlIGV4dHJhY3RvciB5b3UgY2FuIHVzZSB0aGUgY2xhc3NOYW1lIHByb3BlcnR5IHRvIG1hbnVhbGx5IHJlcGVhdCB0aGUNCi0gKiBmdWxsIHF1YWxpZmllZCBjbGFzcyBuYW1lLg0KLSAqDQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGludGVyZmFjZSBCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIgZXh0ZW5kcyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGVhODE5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIGl0J3MganVzdCBhIGhlbHBlciBmb3IgcHJveGllcyAtIHlvdSBqdXN0IG5lZWQgaXQsIGlmIHlvdSBkZWZpbmUgdGhlIGVxdWl2YWxlbnQgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotICoNCi0gKiBpZiB0aGVyZSBpcyBhbHNvIGEgcHJveHkgZm9yIHRoZSB0cmFuc2Zvcm1lciB5b3UgY2FuIHVzZSB0aGUgY2xhc3NOYW1lIHByb3BlcnR5IHRvIG1hbnVhbGx5IHJlcGVhdCB0aGUNCi0gKiBmdWxsIHF1YWxpZmllZCBjbGFzcyBuYW1lLg0KLSAqDQotICogQHNlZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGNsYXNzIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyLCBCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICBwcml2YXRlIFN0cmluZyBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lOw0KLQ0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyLmNvbnZlcnRNZXRhRGF0YShtZXRhRGF0YUVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWU7DQotICAgICAgICB9DQotICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKFN0cmluZyBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUgPSBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXRhRGF0YVRyYW5zZm9ybWVyIGdldE1ldGFEYXRhVHJhbnNmb3JtZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVRyYW5zZm9ybWVyKE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyID0gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJjM2FlZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5JZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5OZXN0ZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIuDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotDQotLyoqDQotICogRmFjdG9yeSB3aGljaCBjcmVhdGVzIHRoZSBNZXRhRGF0YVRyYW5zZm9ybWVyIGZvciBhIGdpdmVuIFZhbGlkYXRpb25TdHJhdGVneQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotLyoNCi0gKiBWYWxpZGF0aW9uU3RyYXRlZ3kgLT4gTWV0YURhdGFUcmFuc2Zvcm1lciBpbnN0ZWFkIG9mIE1ldGEtRGF0YSAtPiBNZXRhRGF0YVRyYW5zZm9ybWVyDQotICogdG8gYXZvaWQgYSBzZWNvbmQgc3RhdGljIG1hcHBpbmcgZS5nLiBmb3IganBhIGFubm90YXRpb25zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneT4NCi0gICAgICAgIGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1ldGFEYXRhVHJhbnNmb3JtZXI+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZzsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gc3ViTmFtZU1hcHBlckxpc3QgPQ0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PigpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vc2luY2UgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIHN0YXJ0dXAgbGlzdGVuZXIgb2YgdGhlIGNvcmUgZ2V0cyBleGVjdXRlZCBmaXJzdA0KLSAgICAgICAgcmVnaXN0ZXIobmV3IFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFUcmFuc2Zvcm1lciBjcmVhdGUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgPSBjcmVhdGVWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lKHZhbGlkYXRpb25TdHJhdGVneSk7DQotDQotICAgICAgICB0cnlUb0luaXRTdGF0aWNNYXBwaW5ncygpOw0KLQ0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyID0NCi0gICAgICAgICAgICAgICAgdHJ5VG9SZXNvbHZlQ2FjaGVkTWV0YURhdGFUcmFuc2Zvcm1lcih2YWxpZGF0aW9uU3RyYXRlZ3ksIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLQ0KLSAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZUFuZENhY2hlTWV0YURhdGFUcmFuc2Zvcm1lcih2YWxpZGF0aW9uU3RyYXRlZ3ksIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVZhbGlkYXRpb25TdHJhdGVneU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiBpc1Byb3h5RGV0ZWN0ZWQgPSBpc1Byb3h5KHZhbGlkYXRpb25TdHJhdGVneSk7DQotICAgICAgICAvL2luIGNhc2Ugb2YgYSBwcm94eSBhbmQgdGhlIHVzYWdlIG9mIGEgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXINCi0gICAgICAgIGlmIChpc1Byb3h5RGV0ZWN0ZWQgJiYgdmFsaWRhdGlvblN0cmF0ZWd5IGluc3RhbmNlb2YgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICgoQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIpdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gIWlzUHJveHlEZXRlY3RlZCA/IFByb3h5VXRpbHMuZ2V0Q2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvSW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljTWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQcm94eShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpID09IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIGNyZWF0ZUFuZENhY2hlTWV0YURhdGFUcmFuc2Zvcm1lcigNCi0gICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LCBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICAgICAgU3RyaW5nIHRyYW5zZm9ybWVyTmFtZTsNCi0gICAgICAgIC8vbnVsbCAtPiB1c2UgbmFtZSBtYXBwZXJzDQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiBuYW1lTWFwcGVyIDogbmFtZU1hcHBlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJhbnNmb3JtZXJOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKHZhbGlkYXRpb25TdHJhdGVneSk7DQotDQotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWVyTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSB0cnlUb0NyZWF0ZUFuZENhY2hlTWV0YURhdGFUcmFuc2Zvcm1lcigNCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgdHJhbnNmb3JtZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhVHJhbnNmb3JtZXIgdHJ5VG9SZXNvbHZlQ2FjaGVkTWV0YURhdGFUcmFuc2Zvcm1lcigNCi0gICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LCBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcuY29udGFpbnNLZXkodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChNZXRhRGF0YVRyYW5zZm9ybWVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSgNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZy5nZXQodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5IGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBuZXdWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArIElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneS5JRF9QUkVGSVggKw0KLSAgICAgICAgICAgICAgICAgICAgKChJZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kpdmFsaWRhdGlvblN0cmF0ZWd5KS5nZXRJZCgpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLmNvbnRhaW5zS2V5KG5ld1ZhbGlkYXRpb25TdHJhdGVneU5hbWUpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIChNZXRhRGF0YVRyYW5zZm9ybWVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSgNCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcuZ2V0KG5ld1ZhbGlkYXRpb25TdHJhdGVneU5hbWUpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhVHJhbnNmb3JtZXIgdHJ5VG9DcmVhdGVBbmRDYWNoZU1ldGFEYXRhVHJhbnNmb3JtZXIoDQotICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0cmFuc2Zvcm1lck5hbWUpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lciA9IChNZXRhRGF0YVRyYW5zZm9ybWVyKQ0KLSAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodHJhbnNmb3JtZXJOYW1lKTsNCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5IGluc3RhbmNlb2YgSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICs9IElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneS5JRF9QUkVGSVggKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneSl2YWxpZGF0aW9uU3RyYXRlZ3kpLmdldElkKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCB0cmFuc2Zvcm1lck5hbWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgLy9zZXR1cCBpbnRlcm5hbCBzdGF0aWMgbWFwcGluZ3MNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnIDoNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cE1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cE1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3MpDQotICAgIHsNCi0gICAgICAgIGZvcihTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IG1hcHBpbmcgOiBtYXBwaW5ncykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNYXBwaW5nKG1hcHBpbmcuZ2V0U291cmNlKCksIG1hcHBpbmcuZ2V0VGFyZ2V0KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgU3RyaW5nIHRyYW5zZm9ybWVyTmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZGRpbmcgdmFsaWRhdGlvbiBzdHJhdGVneSB0byBtZXRhLWRhdGEgdHJhbnNmb3JtZXIgbWFwcGluZzogIg0KLSAgICAgICAgICAgICAgICArIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgKyAiIC0+ICIgKyB0cmFuc2Zvcm1lck5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZy5wdXQodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgdHJhbnNmb3JtZXJOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IGdldE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBTb3J0ZWROYW1lTWFwcGVyTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KHRoaXMubmFtZU1hcHBlckxpc3QsIHRoaXMuc3ViTmFtZU1hcHBlckxpc3QpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlcihOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgdHJ5VG9Jbml0TmFtZU1hcHBlcldpdGhFeGlzdGluZ1N1Yk1hcHBlcnModmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcik7DQotICAgICAgICBzdXBlci5yZWdpc3Rlcih2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogaXQncyBhIHZlcnkgc3BlY2lhbCBjYXNlIGR1ZSB0byB0aGUgbWlzc2luZyBvcmRlciBpbiB0aGUgZXhlY3V0aW9uIG9mIHN0YXJ0dXAtbGlzdGVuZXJzIChwaGFzZSBsaXN0ZW5lcnMpDQotICAgICAqIHBhY2thZ2VkIGluIGZhY2VzLWNvbmZpZy54bWwgZmlsZXMgb2YgamFycw0KLSAgICAgKg0KLSAgICAgKiBub3JtYWxseSB0aGUgZGVmYXVsdCBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIgc2hvdWxkIGJlIGVub3VnaA0KLSAgICAgKiBhbnl3YXksIGlmIGEgbW9kdWxlIGFkZHMgYSBuZXcgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyLA0KLSAgICAgKiBhbGwgcHJldmlvdXMgYWRkZWQgU3ViTmFtZU1hcHBlcnMgaGF2ZSB0byBiZSBhZGRlZCB0byBhdm9pZCBjb25mdXNpb24gaW4gc3BlY2lhbCBjYXNlcy4NCi0gICAgICogaWYgYSBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgZmluYWwgZXh0ZW5kIHRoZSBpbnRlcmZhY2UgYW5kIGZpbHRlciBpdCBpbiBhZGROYW1lTWFwcGVyDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciB3aGljaCBoYXMgdG8gYmUgYWRkZWQNCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0luaXROYW1lTWFwcGVyV2l0aEV4aXN0aW5nU3ViTWFwcGVycyhOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBpbnN0YW5jZW9mIFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IG5hbWVNYXBwZXIgOiB0aGlzLnN1Yk5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobmFtZU1hcHBlci5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoTmVzdGVkLmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgKChTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pil2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkTmFtZU1hcHBlcihuYW1lTWFwcGVyKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTUwNGIyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gdHJhbnNmb3JtIGNvbmNyZXRlIG1ldGEtZGF0YSB0byBhIG1vcmUgYWJzdHJhY3QgZm9ybS48YnIvPg0KLSAqIGUuZy46IEBSZXF1aXJlZCwgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLC4uLiksIEBMZW5ndGgobWluaW11bSA9IDEpLCAuLi4gLT4gcmVxdWlyZWQgPSB0cnVlDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotLy8qVHJhbnNmb3JtZXIgaW5zdGVhZCBvZiAqQ29udmVydGVyIHRvIGF2b2lkIG5hbWluZyBjb25mdXNpb24gDQotcHVibGljIGludGVyZmFjZSBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9Tb3J0ZWROYW1lTWFwcGVyTGlzdC5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9Tb3J0ZWROYW1lTWFwcGVyTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTgxM2JkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU29ydGVkTmFtZU1hcHBlckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5TdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLk5lc3RlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsNCi0NCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotY2xhc3MgU29ydGVkTmFtZU1hcHBlckxpc3Q8VCBleHRlbmRzIE5hbWVNYXBwZXI+IGltcGxlbWVudHMgTGlzdDxUPg0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PFQ+IHdyYXBwZWQ7DQotICAgIHByaXZhdGUgTGlzdDxUPiBnbG9iYWxTdWJOYW1lTWFwcGVyTGlzdDsNCi0NCi0gICAgU29ydGVkTmFtZU1hcHBlckxpc3QoTGlzdDxUPiB3cmFwcGVkLCBMaXN0PFQ+IHN1Yk5hbWVNYXBwZXJMaXN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOw0KLSAgICAgICAgdGhpcy5nbG9iYWxTdWJOYW1lTWFwcGVyTGlzdCA9IHN1Yk5hbWVNYXBwZXJMaXN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFkZChUIHQpDQotICAgIHsNCi0gICAgICAgIGlmICh0ICE9IG51bGwgJiYgdC5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoTmVzdGVkLmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYWRkU3ViTmFtZU1hcHBlcih0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IHdyYXBwZWQuYWRkKHQpOw0KLQ0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQod3JhcHBlZCwgbmV3IENvbXBhcmF0b3I8VD4oKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKFQgbm0xLCBUIG5tMikNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5tMSBpbnN0YW5jZW9mIFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlciAmJiBubTIgaW5zdGFuY2VvZiBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm0xIGluc3RhbmNlb2YgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyID8gMSA6IC0xOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gYWRkU3ViTmFtZU1hcHBlcihUIHN1Yk5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7DQotICAgICAgICBmb3IgKE5hbWVNYXBwZXIgbmFtZU1hcHBlciA6IHRoaXMud3JhcHBlZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAobmFtZU1hcHBlciBpbnN0YW5jZW9mIFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICgoU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyKSBuYW1lTWFwcGVyKS5hZGROYW1lTWFwcGVyKHN1Yk5hbWVNYXBwZXIpOw0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeVRvQWRkTWFwcGVyQXNHbG9iYWxTdWJOYW1lTWFwcGVyKHN1Yk5hbWVNYXBwZXIpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9BZGRNYXBwZXJBc0dsb2JhbFN1Yk5hbWVNYXBwZXIoVCBzdWJOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICBpZighdGhpcy5nbG9iYWxTdWJOYW1lTWFwcGVyTGlzdC5jb250YWlucyhzdWJOYW1lTWFwcGVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmdsb2JhbFN1Yk5hbWVNYXBwZXJMaXN0LmFkZChzdWJOYW1lTWFwcGVyKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBpbnQgc2l6ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnNpemUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaXNFbXB0eSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5jb250YWlucyhvKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSXRlcmF0b3I8VD4gaXRlcmF0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5pdGVyYXRvcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQudG9BcnJheSgpOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiU3VzcGljaW91c1RvQXJyYXlDYWxsIn0pDQotICAgIHB1YmxpYyA8VD4gVFtdIHRvQXJyYXkoVFtdIGEpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnRvQXJyYXkoYSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5yZW1vdmUobyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5jb250YWluc0FsbChjKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVD4gYykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuYWRkQWxsKGMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIFQ+IGMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmFkZEFsbChpbmRleCwgYyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVtb3ZlQWxsKGMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnJldGFpbkFsbChjKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpDQotICAgIHsNCi0gICAgICAgIHdyYXBwZWQuY2xlYXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVCBnZXQoaW50IGluZGV4KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXQoaW5kZXgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBUIHNldChpbnQgaW5kZXgsIFQgZWxlbWVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuc2V0KGluZGV4LCBlbGVtZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBUIGVsZW1lbnQpDQotICAgIHsNCi0gICAgICAgIHdyYXBwZWQuYWRkKGluZGV4LCBlbGVtZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVCByZW1vdmUoaW50IGluZGV4KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5yZW1vdmUoaW5kZXgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaW5kZXhPZihvKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5sYXN0SW5kZXhPZihvKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yPFQ+IGxpc3RJdGVyYXRvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmxpc3RJdGVyYXRvcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3I8VD4gbGlzdEl0ZXJhdG9yKGludCBpbmRleCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQubGlzdEl0ZXJhdG9yKGluZGV4KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxUPiBzdWJMaXN0KGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5zdWJMaXN0KGZyb21JbmRleCwgdG9JbmRleCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEzNGZmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIKLSAgICBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMTM5ZGQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIC0gaWYgdGhlcmUgaXMgYSBwcm94eSBhcm91bmQgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDUwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5IGluc3RhbmNlb2YgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICgoQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIpdmFsaWRhdGlvblN0cmF0ZWd5KS5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkwNWRlMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1ldGFEYXRhVHJhbnNmb3JtZXJzLg0KLSAqIChjb25maWd1cmVkIHZpYSB3ZWIueG1sKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOWIzMDYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1ldGFEYXRhVHJhbnNmb3JtZXJzLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZTg1MGQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIG1hcHMgRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1ldGFEYXRhVHJhbnNmb3JtZXJzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigzMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcyA9DQotICAgICAgICAgICAgICAgIFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3ModmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksIFZhbGlkYXRpb25TdHJhdGVneS5jbGFzcyk7DQotDQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsDQotICAgICAgICAgICAgICAgIGdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXRTaW1wbGVOYW1lKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmMTc1Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgdG8gcGxhY2UgVmFsaWRhdGlvblN0cmF0ZWdpZXMgYW5kIE1ldGFEYXRhVHJhbnNmb3JtZXJzIGluIHRoZSBzYW1lIHBhY2thZ2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDQwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcyA9DQotICAgICAgICAgICAgICAgIFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3ModmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksIFZhbGlkYXRpb25TdHJhdGVneS5jbGFzcyk7DQotDQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXRQYWNrYWdlKCkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBnZXRTaW1wbGVNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpICsgIi4iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLmdldFNpbXBsZU5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTaW1wbGVNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwb3N0Zml4ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVgpOw0KLQ0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmVuZHNXaXRoKCJWYWxpZGF0aW9uU3RyYXRlZ3kiKSB8fA0KLSAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmVuZHNXaXRoKCJTdHJhdGVneSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lQYWNrYWdlTmFtZSArIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYKSAscG9zdGZpeCkNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCJWYWxpZGF0aW9uU3RyYXRlZ3kiLCBwb3N0Zml4KQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoIlN0cmF0ZWd5IiwgcG9zdGZpeCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2luIGNhc2Ugb2YgYSBzdGF0aWMgdmFsaWRhdGlvbiBzdHJhdGVneSBtYXBwaW5nDQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUgKyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgKyBwb3N0Zml4Ow0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1ZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZTIxN2IuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5OZXN0ZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlckNvbXBhcmF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcg0KLSAgICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICBpbXBsZW1lbnRzIFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBzdWJOYW1lTWFwcGVycyA9IG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGROYW1lTWFwcGVyKE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiBuYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICBpZighdGhpcy5zdWJOYW1lTWFwcGVycy5jb250YWlucyhuYW1lTWFwcGVyKSAmJiBuYW1lTWFwcGVyLmdldENsYXNzKCkuaXNBbm5vdGF0aW9uUHJlc2VudChOZXN0ZWQuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuc3ViTmFtZU1hcHBlcnMuYWRkKG5hbWVNYXBwZXIpOw0KLSAgICAgICAgICAgIHNvcnRTdWJOYW1lTWFwcGVycygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzb3J0U3ViTmFtZU1hcHBlcnMoKQ0KLSAgICB7DQotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRoaXMuc3ViTmFtZU1hcHBlcnMsIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOw0KLQ0KLSAgICAgICAgZm9yKE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiBtYXBwZXIgOiB0aGlzLnN1Yk5hbWVNYXBwZXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IG1hcHBlci5jcmVhdGVOYW1lKHNvdXJjZSk7DQotDQotICAgICAgICAgICAgaWYocmVzdWx0ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDVmNTI4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uIGltcGxlbWVudHMgUHJvcGVydHlJbmZvcm1hdGlvbgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gaW5mb3JtYXRpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICBwcml2YXRlIExpc3Q8TWV0YURhdGFFbnRyeT4gbWV0YURhdGFMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUVudHJ5PigpOwotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNJbmZvcm1hdGlvbihTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZm9ybWF0aW9uTWFwLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZm9ybWF0aW9uTWFwLmdldChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gVCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVCkgZ2V0SW5mb3JtYXRpb24oa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgibmV3IGluZm9ybWF0aW9uIGFkZGVkIGtleTogIiArIGtleSArICIgdmFsdWU6ICIgKyB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmZvcm1hdGlvbk1hcC5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGFEYXRhRW50cnlbXSBnZXRNZXRhRGF0YUVudHJpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhTGlzdC50b0FycmF5KG5ldyBNZXRhRGF0YUVudHJ5W21ldGFEYXRhTGlzdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXRhRGF0YUVudHJ5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkKLSAgICB7Ci0gICAgICAgIG1ldGFEYXRhRW50cnkuc2V0UHJvcGVydGllcyh0aGlzLmluZm9ybWF0aW9uTWFwKTsKLSAgICAgICAgdGhpcy5tZXRhRGF0YUxpc3QuYWRkKG1ldGFEYXRhRW50cnkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0TWV0YURhdGFFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJyZXNldHRpbmcgbWV0YS1kYXRhIGVudHJpZXMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMubWV0YURhdGFMaXN0LmNsZWFyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eURldGFpbHMuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlEZXRhaWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MDM3Y2YuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eURldGFpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eURldGFpbHMKLXsKLSAgICAvL2Zvcm1zIHRoZSBpZCBmb3IgY3Jvc3MtdmFsaWRhdGlvbiB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzCi0gICAgcHJpdmF0ZSBTdHJpbmcga2V5OwotICAgIHByaXZhdGUgT2JqZWN0IGJhc2VPYmplY3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlEZXRhaWxzKFN0cmluZyBrZXksIE9iamVjdCBiYXNlT2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICAgICAgdGhpcy5iYXNlT2JqZWN0ID0gYmFzZU9iamVjdDsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJhc2VPYmplY3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJhc2VPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZU9iamVjdChPYmplY3QgYmFzZU9iamVjdCkKLSAgICB7Ci0gICAgICAgIHRoaXMuYmFzZU9iamVjdCA9IGJhc2VPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOTI4NGYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5SW5mb3JtYXRpb24KLXsKLSAgICBib29sZWFuIGNvbnRhaW5zSW5mb3JtYXRpb24oU3RyaW5nIGtleSk7Ci0gICAgT2JqZWN0IGdldEluZm9ybWF0aW9uKFN0cmluZyBrZXkpOwotICAgIDxUPiBUIGdldEluZm9ybWF0aW9uKFN0cmluZyBrZXksIENsYXNzPFQ+IHRhcmdldENsYXNzKTsKLSAgICB2b2lkIHNldEluZm9ybWF0aW9uKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSk7Ci0KLSAgICBNZXRhRGF0YUVudHJ5W10gZ2V0TWV0YURhdGFFbnRyaWVzKCk7Ci0gICAgdm9pZCBhZGRNZXRhRGF0YUVudHJ5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSk7Ci0gICAgdm9pZCByZXNldE1ldGFEYXRhRW50cmllcygpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm9wZXJ0eS9Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmVmNDMwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlJbmZvcm1hdGlvbktleXMKLXsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFVEFJTFMgPSAicHJvcGVydHlfZGV0YWlscyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lQX1ZBTElEQVRJT04gPSAic2tpcF92YWxpZGF0aW9uIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gImxhYmVsIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9QUk9QRVJUSUVTID0gImN1c3RvbV9wcm9wZXJ0aWVzIjsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJveHkvRGVmYXVsdFByb3h5SGVscGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L0RlZmF1bHRQcm94eUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzg1Yjk2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJveHkvRGVmYXVsdFByb3h5SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb3h5SGVscGVyIGltcGxlbWVudHMgUHJveHlIZWxwZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0UHJveHlIZWxwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgPFQ+IENsYXNzPFQ+IGdldFVucHJveGllZENsYXNzKENsYXNzIGN1cnJlbnRDbGFzcywgQ2xhc3M8VD4gdGFyZ2V0VHlwZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChDbGFzczxUPilnZXRVbnByb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzcyBnZXRVbnByb3hpZWRDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIGlmKGlzUHJveGllZENsYXNzKGN1cnJlbnRDbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY3VycmVudENsYXNzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZU9mQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZiAoaXNQcm94aWVkQ2xhc3MoY3VycmVudENsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3VycmVudENsYXNzLmdldFN1cGVyY2xhc3MoKS5nZXROYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY3VycmVudENsYXNzLmdldE5hbWUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZU9mT2JqZWN0KE9iamVjdCBvYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmKG9iamVjdCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROYW1lT2ZDbGFzcyhvYmplY3QuZ2V0Q2xhc3MoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3hpZWRDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCIkJEVuaGFuY2VyQnlDR0xJQiQkIikgfHwNCi0gICAgICAgICAgICBjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpLmNvbnRhaW5zKCIkJEZhc3RDbGFzc0J5Q0dMSUIkJCIpIHx8DQotICAgICAgICAgICAgY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiXyQkX2phdmFzc2lzdCIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzUHJveGllZE9iamVjdChPYmplY3QgcHJveGllZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3hpZWRPYmplY3QgIT0gbnVsbCAmJiBpc1Byb3hpZWRDbGFzcyhwcm94aWVkT2JqZWN0LmdldENsYXNzKCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJveHkvUHJveHlIZWxwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJveHkvUHJveHlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNlN2U0YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L1Byb3h5SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJveHlIZWxwZXINCi17DQotICAgIENsYXNzIGdldFVucHJveGllZENsYXNzKENsYXNzIGN1cnJlbnRDbGFzcyk7DQotDQotICAgIDxUPiBDbGFzczxUPiBnZXRVbnByb3hpZWRDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MsIENsYXNzPFQ+IHRhcmdldFR5cGUpOw0KLQ0KLSAgICBTdHJpbmcgZ2V0TmFtZU9mQ2xhc3MoQ2xhc3MgcHJveGllZENsYXNzKTsNCi0NCi0gICAgU3RyaW5nIGdldENsYXNzTmFtZU9mT2JqZWN0KE9iamVjdCBwcm94aWVkT2JqZWN0KTsNCi0NCi0gICAgYm9vbGVhbiBpc1Byb3hpZWRDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MpOw0KLQ0KLSAgICBib29sZWFuIGlzUHJveGllZE9iamVjdChPYmplY3QgcHJveGllZE9iamVjdCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZWNvcmRlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MGYyM2YuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZWNvcmRlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotCi0vKioKLSAqIEFsbG93cyB0byBjYXB0dXJlIGNvbnZlcnRlZCB2YWx1ZXMuCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIKLXsKLSAgICB2b2lkIHJlY29yZFVzZXJJbnB1dChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0Fic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0Fic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1OTIwYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLQotLyoqCi0gKiBCYXNlIGZvciBhbGwgUmVuZGVyS2l0V3JhcHBlckZhY3RvcmllcyB0byBmb3JjZSBhIHNwZWNpZmljIGJlaGF2aW91cgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFJlbmRlcktpdCwgUmVuZGVyS2l0PgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSB3cmFwcGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBkZWFjdGl2YXRlZCA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeShBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRoaXMud3JhcHBlZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLndyYXBwZWQuYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkocmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkZWFjdGl2YXRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5kZWFjdGl2YXRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWFjdGl2YXRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVhY3RpdmF0ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFJlbmRlcktpdCBjcmVhdGUoUmVuZGVyS2l0IHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIGlmKGlzRGVhY3RpdmF0ZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBSZW5kZXJLaXQgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBpZih0aGlzLndyYXBwZWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy53cmFwcGVkLmNyZWF0ZShyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVXcmFwcGVyKHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KTsKLQotICAgIC8qKgotICAgICAqIHNpbXBsZSB0ZXN0IGZvciBlYXJseSBjb25maWcgaW4gY2FzZSBvZiBtb2phcnJhIChpbmNsLiB0aGUgY29tYmluYXRpb24gd2l0aCB0cmluaWRhZCkuCi0gICAgICogdXNlIGEgY3VzdG9tIGV4dHZhbCBjb250ZXh0IGltcGwuIChzZWUgRVhUVkFMLTU4KSB0byBvcHRpbWl6ZSB0aGlzIGNoZWNrIGZvciB0aGUgdGFyZ2V0IHJ1bnRpbWUuCi0gICAgICogdGhpcyBjaGVjayB3b3JrcyBmb3IgYWxsIGN1cnJlbnQgaW1wbGVtZW50YXRpb25zIHNpbmNlIHRoZSBqc2YgaW50ZXJuYWxzIGFyZSBhdXRvbS4gcmVhZHkgZHVyaW5nIGEgcmVxdWVzdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUganNmIGltcGwuIGlzIGluaXRpYWxpemVkIGFuZCBpdCdzIHBvc3NpYmxlIHRvIHVzZSBpdCBhcyBleHBlY3RlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQXBwbGljYXRpb25Jbml0aWFsaXplZCgpCi0gICAgewotICAgICAgICByZXR1cm4gSnNmVXRpbHMuaXNBcHBsaWNhdGlvbkluaXRpYWxpemVkKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YyNmI3Mi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9EZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeQotewotICAgIHByaXZhdGUgUmVuZGVyS2l0IHJlbmRlcktpdDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJJQ19SRU5ERVJfS0lUX1dSQVBQRVJfRkFDVE9SWSA9Ci0gICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0LkdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiB1c2VHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCBjcmVhdGVXcmFwcGVyKFJlbmRlcktpdCByZW5kZXJLaXQpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVya2l0IHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcktpdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3dvcmthcm91bmQgZm9yIG1vamFycmEgKEVYVFZBTC0zOCkKLSAgICAgICAgaWYodXNlR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENsYXNzIGdlbmVyaWNGYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUoR0VORVJJQ19SRU5ERVJfS0lUX1dSQVBQRVJfRkFDVE9SWSk7Ci0gICAgICAgICAgICB1c2VHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgPSBnZW5lcmljRmFjdG9yeSAhPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodXNlR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5KQotICAgICAgICB7Ci0gICAgICAgICAgICBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID0gKEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpQ2xhc3NVdGlscwotICAgICAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShHRU5FUklDX1JFTkRFUl9LSVRfV1JBUFBFUl9GQUNUT1JZKTsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jcmVhdGVXcmFwcGVyKHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLnJlbmRlcktpdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnJlbmRlcktpdCA9IG5ldyBFeHRWYWxSZW5kZXJLaXQocmVuZGVyS2l0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJLaXQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbExhenlSZW5kZXJlclByb3h5LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxMYXp5UmVuZGVyZXJQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzZhYmQyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbExhenlSZW5kZXJlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7DQotDQotLyoqDQotICogdG8gc3VwcG9ydCBhIGN1c3RvbSBwcm94eQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBFeHRWYWxMYXp5UmVuZGVyZXJQcm94eSBleHRlbmRzIFJlbmRlcmVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIFJlbmRlcmVyIHdyYXBwZWQ7DQotDQotICAgIHB1YmxpYyBFeHRWYWxMYXp5UmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyZXI7DQotDQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInNpbXBsZSBwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldExhenlSZW5kZXJlcigpLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQ0KLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBSZW5kZXJlciBnZXRMYXp5UmVuZGVyZXIoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcHJveHlDbGFzc05hbWUgPSAoU3RyaW5nKSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSk7DQotDQotICAgICAgICBpZihwcm94eUNsYXNzTmFtZSAhPSBudWxsICYmICFwcm94eUNsYXNzTmFtZS5lbmRzV2l0aChnZXRDbGFzcygpLmdldE5hbWUoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShwcm94eUNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYodGFyZ2V0Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImEgY3VzdG9tIGludmFsaWQgcmVuZGVyZXIgcHJveHkgaXMgY29uZmlndXJlZDogIiArIHByb3h5Q2xhc3NOYW1lKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgQ2xhc3NbXSBhcmdDbGFzc2VzID0gbmV3IENsYXNzWzFdOw0KLSAgICAgICAgICAgIGFyZ0NsYXNzZXNbMF0gPSBSZW5kZXJlci5jbGFzczsNCi0NCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGFyZ2V0Q2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJnQ2xhc3Nlcyk7DQotICAgICAgICAgICAgICAgIHJldHVybiAoUmVuZGVyZXIpY29uc3RydWN0b3IubmV3SW5zdGFuY2UodGhpcy53cmFwcGVkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGNyZWF0ZTogIiArIHRhcmdldENsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXQuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjM1NGU1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVN0cmVhbTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LlJlc3BvbnNlV3JpdGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZXNwb25zZVN0YXRlTWFuYWdlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcktpdCBleHRlbmRzIFJlbmRlcktpdAotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcktpdChSZW5kZXJLaXQgd3JhcHBlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlLCBSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIGlmIChyZW5kZXJlciBpbnN0YW5jZW9mIEV4dFZhbFJlbmRlcmVyV3JhcHBlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgcmVuZGVyZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgY3JlYXRlV3JhcHBlcihyZW5kZXJlcikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFJlbmRlcmVyIGdldFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUpCi0gICAgewotICAgICAgICBSZW5kZXJlciByZW5kZXJlciA9IHdyYXBwZWQuZ2V0UmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUpOwotCi0gICAgICAgIGlmKHJlbmRlcmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJlciBpbnN0YW5jZW9mIEV4dFZhbFJlbmRlcmVyV3JhcHBlciA/IHJlbmRlcmVyIDogY3JlYXRlV3JhcHBlcihyZW5kZXJlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oIm5vIHJlbmRlcmVyIGZvdW5kIGZvciBmYW1pbHkgIiArIGZhbWlseSArICIgYW5kIHR5cGUgIiArIHJlbmRlcmVyVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVuZGVyZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlU3RhdGVNYW5hZ2VyIGdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlV3JpdGVyIGNyZWF0ZVJlc3BvbnNlV3JpdGVyKFdyaXRlciB3cml0ZXIsIFN0cmluZyBzLCBTdHJpbmcgczEpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jcmVhdGVSZXNwb25zZVdyaXRlcih3cml0ZXIsIHMsIHMxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdHJlYW0gY3JlYXRlUmVzcG9uc2VTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmNyZWF0ZVJlc3BvbnNlU3RyZWFtKG91dHB1dFN0cmVhbSk7Ci0gICAgfQotCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkKLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgY3JlYXRlV3JhcHBlcihSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRXh0VmFsUmVuZGVyZXJXcmFwcGVyKHJlbmRlcmVyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXRGYWN0b3J5LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNzZiOTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogY2VudHJhbCBtZWNoYW5pc20gd2hpY2ggaXMgcmVzcG9uc2libGUgdG8gY3JlYXRlIGEgd3JhcHBlciBmb3IgYSByZW5kZXJlciAtIHN0YXJ0aW5nIHBvaW50IG9mIGV4dHZhbC4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcktpdEZhY3RvcnkgZXh0ZW5kcyBSZW5kZXJLaXRGYWN0b3J5Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLSAgICBwcml2YXRlIFJlbmRlcktpdEZhY3Rvcnkgd3JhcHBlZDsKLSAgICBwcml2YXRlIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5OwotICAgIHByaXZhdGUgQm9vbGVhbiBpc0RlYWN0aXZhdGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcktpdEZhY3RvcnkoUmVuZGVyS2l0RmFjdG9yeSByZW5kZXJLaXRGYWN0b3J5KQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyS2l0RmFjdG9yeTsKLQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcktpdChTdHJpbmcgcywgUmVuZGVyS2l0IHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZC5hZGRSZW5kZXJLaXQocywgcmVuZGVyS2l0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVuZGVyS2l0IGdldFJlbmRlcktpdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIFJlbmRlcktpdCByZW5kZXJLaXQgPSB0aGlzLndyYXBwZWQuZ2V0UmVuZGVyS2l0KGZhY2VzQ29udGV4dCwgcyk7Ci0KLSAgICAgICAgLy9mb3IgbW9qYXJyYSArIHRyaW5pZGFkCi0gICAgICAgIGlmKHJlbmRlcktpdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeVRvSW5pdERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpOwotCi0gICAgICAgIGNoZWNrUmVuZGVyS2l0RmFjdG9yeURlYWN0aXZhdGlvbigpOwotCi0gICAgICAgIGlmKHRoaXMuaXNEZWFjdGl2YXRlZCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcktpdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vdGVzdCBlYXJseSBjb25maWcgaW4gY2FzZSBvZiBtb2phcnJhCi0gICAgICAgIGlmKCF0aGlzLmRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5pc0FwcGxpY2F0aW9uSW5pdGlhbGl6ZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmNyZWF0ZVdyYXBwZXIocmVuZGVyS2l0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnlUb0NyZWF0ZVdyYXBwZXJXaXRoV3JhcHBlckZhY3RvcnkocmVuZGVyS2l0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tSZW5kZXJLaXRGYWN0b3J5RGVhY3RpdmF0aW9uKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMuaXNEZWFjdGl2YXRlZCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihFeHRWYWxVdGlscy5pc0V4dFZhbERlYWN0aXZhdGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc0RlYWN0aXZhdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKHRoaXMuZGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmlzQXBwbGljYXRpb25Jbml0aWFsaXplZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuaXNEZWFjdGl2YXRlZCA9IGlzUmVuZGVyS2l0RmFjdG9yeURlYWN0aXZhdGVkVmlhV2ViWG1sKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc0RlYWN0aXZhdGVkID0gaXNSZW5kZXJLaXRGYWN0b3J5RGVhY3RpdmF0ZWRWaWFWTVBhcmFtZXRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB0cnlUb0luaXREZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5kZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy93b3JrYXJvdW5kIGZvciBtb2phcnJhIHRvIGFsbG93IGEgY3VzdG9tIGZhY3RvcnkgZHVyaW5nIHRoZSBlYXJseSBjb25maWcgcGhhc2UKLSAgICAgICAgICAgIC8vanVzdCBjcmVhdGUgdGhlIGZhY3Rvcnkgd2l0aCB0aGUgZ2l2ZW4gbmFtZQotICAgICAgICAgICAgLy8raXQgc2hvdWxkIGV4dGVuZCB5b3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiB3aGljaCB5b3UgcmVnaXN0ZXIgYXMgdXN1YWwKLSAgICAgICAgICAgIE9iamVjdCBjdXN0b21GYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKAotICAgICAgICAgICAgICAgICAgICBFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSArICIuY3VzdG9tLlJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Iik7Ci0KLSAgICAgICAgICAgIGlmKGN1c3RvbUZhY3RvcnkgaW5zdGFuY2VvZiBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID0gKEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpY3VzdG9tRmFjdG9yeTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSA9IG5ldyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUmVuZGVyS2l0IHRyeVRvQ3JlYXRlV3JhcHBlcldpdGhXcmFwcGVyRmFjdG9yeShSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSB3cmFwcGVyRmFjdG9yeSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgIC8vc29tZSBjb21wb25lbnQgbGlicyBlLmcuIG15ZmFjZXMtdHJpbmlkYWQgYXJlbid0IGNvbXBhdGlibGUgd2l0aCB0aGlzIGNsZWFuIGFwcHJvYWNoCi0gICAgICAgIC8vZXhhbXBsZSBzZWUgVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIKLSAgICAgICAgaWYod3JhcHBlckZhY3RvcnkuaXNEZWFjdGl2YXRlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJGYWN0b3J5LmNyZWF0ZShyZW5kZXJLaXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGdldFJlbmRlcktpdElkcygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkLmdldFJlbmRlcktpdElkcygpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlbmRlcktpdEZhY3RvcnlEZWFjdGl2YXRlZFZpYVdlYlhtbCgpCi0gICAgewotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfUkVOREVSX0tJVF9GQUNUT1JZKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNSZW5kZXJLaXRGYWN0b3J5RGVhY3RpdmF0ZWRWaWFWTVBhcmFtZXRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoU3lzdGVtCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsKLSAgICAgICAgICAgICAgICAgICAgIi5ERUFDVElWQVRFX1JFTkRFUl9LSVRfRkFDVE9SWSIsICJmYWxzZSIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlclByb3h5LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMzYxM2MuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlJlbmRlcmVyUHJveHlTdG9yYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkpzZlByb2plY3RTdGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiB0byBhdm9pZCBtdWx0aXBsZSBjYWxscyBvZiByZW5kZXJlciBtZXRob2RzIHdpdGhpbiByZW5kZXJlciBpbnRlcmNlcHRvcnMgKGUuZy4gZm9yIGVuY29kZSwgZGVjb2RlLC4uLikKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcmVyUHJveHkgZXh0ZW5kcyBSZW5kZXJlcgotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9IEV4dFZhbFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpICsgIjpLRVkiOwotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0gICAgCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHJlbmRlcmVyOwotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInByb3h5IGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGVudHJ5ID0gZ2V0UmVuZGVyZXJFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRGVjb2RlQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldERlY29kZUNhbGxlZCh0cnVlKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVkLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DcmVhdGVNZXNzYWdlKCJkZWNvZGUiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkgPSBnZXRSZW5kZXJlckVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNFbmNvZGVCZWdpbkNhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXRFbmNvZGVCZWdpbkNhbGxlZCh0cnVlKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlZC5lbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DcmVhdGVNZXNzYWdlKCJlbmNvZGVCZWdpbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBlbnRyeSA9IGdldFJlbmRlcmVyRW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0VuY29kZUNoaWxkcmVuQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldEVuY29kZUNoaWxkcmVuQ2FsbGVkKHRydWUpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLndyYXBwZWQuZW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeVRvQ3JlYXRlTWVzc2FnZSgiZW5jb2RlQ2hpbGRyZW4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGVudHJ5ID0gZ2V0UmVuZGVyZXJFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRW5jb2RlRW5kQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldEVuY29kZUVuZENhbGxlZCh0cnVlKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVkLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DcmVhdGVNZXNzYWdlKCJlbmNvZGVFbmQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydENsaWVudElkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICB0aHJvdyByOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UmVuZGVyc0NoaWxkcmVuKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZW5kZXJzQ2hpbGRyZW4oKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgdGhyb3cgdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGVudHJ5ID0gZ2V0UmVuZGVyZXJFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoZW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh3cmFwcGVkLmdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DcmVhdGVNZXNzYWdlKCJnZXRDb252ZXJ0ZWRWYWx1ZSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGdldFJlbmRlcmVyRW50cnkoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBTdHJpbmcga2V5ID0gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBrZXkgKz0gZ2V0T3B0aW9uYWxLZXkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFnZXRSZW5kZXJlclN0b3JhZ2UoKS5jb250YWluc0VudHJ5KGdldFJlbmRlcmVyS2V5KCksIGtleSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldFJlbmRlcmVyU3RvcmFnZSgpLnNldEVudHJ5KGdldFJlbmRlcmVyS2V5KCksIGtleSwgbmV3IFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldFJlbmRlcmVyU3RvcmFnZSgpLmdldEVudHJ5KGdldFJlbmRlcmVyS2V5KCksIGtleSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcHRpb25hbEtleShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbmRlcmVyS2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh0aGlzLndyYXBwZWQuZ2V0Q2xhc3MoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJlclByb3h5U3RvcmFnZSBnZXRSZW5kZXJlclN0b3JhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoUmVuZGVyZXJQcm94eVN0b3JhZ2UuY2xhc3MsIFJlbmRlcmVyUHJveHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCkKLSAgICB7Ci0gICAgICAgIC8vcmVzZXQgY29tcG9uZW50IHByb3h5IG1hcHBpbmcKLSAgICAgICAgRXh0VmFsVXRpbHMucmVzZXRTdG9yYWdlKFJlbmRlcmVyUHJveHlTdG9yYWdlLmNsYXNzLCBSZW5kZXJlclByb3h5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0NyZWF0ZU1lc3NhZ2UoU3RyaW5nIG1ldGhvZE5hbWUpCi0gICAgewotICAgICAgICBpZihKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLkRldmVsb3BtZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiZG91YmxlIGNhbGwgb2YgIiArIHRoaXMud3JhcHBlZC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIjIiArIG1ldGhvZE5hbWUgKyAiIGZpbHRlcmVkLiAiICsKLSAgICAgICAgICAgICAgICAgICAgInRoaXMgb3B0aW1pemF0aW9uIG1pZ2h0IGxlYWQgdG8gaW5jb21wYXRpYmlsaXRpZXMgd2l0aCBzb21lIGNvbXBvbmVudCBsaWJzLiAiICsKLSAgICAgICAgICAgICAgICAgICAgImluIHN1Y2ggYSBjYXNlIHVzZSB0aGUgc3VwcG9ydCBtb2R1bGUgZm9yIHRoZSBjb21wb25lbnQgbGliIG9yIHVzZTogIiArCi0gICAgICAgICAgICAgICAgICAgICJFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSwgbnVsbCk7ICIgKwotICAgICAgICAgICAgICAgICAgICAiaW4gYSBzdGFydHVwIGxpc3RlbmVyIjsKLQotICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRNZXNzYWdlKG51bGwsIEV4dFZhbFV0aWxzLmNyZWF0ZUZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU0VWRVJJVFlfV0FSTiwgbWVzc2FnZSwgbWVzc2FnZSkpOwotCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKG1lc3NhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygidHVybiBvbiB0aGUgZGV2ZWxvcG1lbnQgbW9kZSBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiwgaWYgc29tZXRoaW5nIGlzIGRpc3BsYXllZCB3cm9uZy4iKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyV3JhcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YzMwNWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUmVuZGVyZXJJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLQotLyoqCi0gKiBEZWZhdWx0IGFwcHJvYWNoIHRvIGF2b2lkIHByb3hpZXMgZm9yIGNvbnZlcnRlcnMgYW5kIHRoZSBhZGFwdGVyIGZhbGxiYWNrLgotICogSXQgcmVxdWlyZXMgdGhhdCBjb21wb25lbnRzIGRlbGVnYXRlIGdldENvbnZlcnRlZFZhbHVlIHRvIGEgcmVuZGVyZXIuPGJyLz4KLSAqIElmIGl0IGlzbid0IHRoZSBjYXNlIGZvciB5b3VyIGNvbXBvbmVudCBsaWIgdXNlOgotICogb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHkuRXh0VmFsQXBwbGljYXRpb25GYWN0b3J5PGJyLz4KLSAqIGFuZDxici8+Ci0gKiBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5Qcm94eU1hcHBpbmdQaGFzZUxpc3RlbmVyCi0gKiA8cC8+Ci0gKiBUaGlzIHdyYXBwZXIgd2lsbCBhbHNvIGltcGxlbWVudCBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIGJlaGF2aW91cgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyZXJXcmFwcGVyIGV4dGVuZHMgUmVuZGVyZXIKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIHdyYXBwZWQ7Ci0gICAgcHJvdGVjdGVkIEV4dFZhbENvbnRleHQgZXh0VmFsQ29udGV4dCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcmVyV3JhcHBlcihSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwcm94eUNsYXNzTmFtZSA9IChTdHJpbmcpRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVkpOwotCi0gICAgICAgIGlmKHByb3h5Q2xhc3NOYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNvbmZpZ3VyZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gbmV3IEV4dFZhbExhenlSZW5kZXJlclByb3h5KHJlbmRlcmVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUocHJveHlDbGFzc05hbWUpOwotCi0gICAgICAgIGlmKHRhcmdldENsYXNzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNvbmZpZ3VyZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gbmV3IEV4dFZhbExhenlSZW5kZXJlclByb3h5KHJlbmRlcmVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzW10gYXJnQ2xhc3NlcyA9IG5ldyBDbGFzc1sxXTsKLSAgICAgICAgYXJnQ2xhc3Nlc1swXSA9IFJlbmRlcmVyLmNsYXNzOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHRhcmdldENsYXNzLmdldENvbnN0cnVjdG9yKGFyZ0NsYXNzZXMpOwotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gKFJlbmRlcmVyKWNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHJlbmRlcmVyKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm5vIGV4dHZhbCByZW5kZXJlciBwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0dmFsIHJlbmRlcmVyIHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZURlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZURlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZGVjb2RlIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZURlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZURlY29kZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckRlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJEZWNvZGUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSB0cnVlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJlbmNvZGVCZWdpbiBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVCZWdpbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVCZWdpbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUNoaWxkcmVuIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImVuY29kZUNoaWxkcmVuIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUNoaWxkcmVuIG9mICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVDaGlsZHJlbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUNoaWxkcmVuIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZW5jb2RlRW5kIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVFbmQgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5lbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJFbmNvZGVFbmQgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlRW5kIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBjb252ZXJ0Q2xpZW50SWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jb252ZXJ0Q2xpZW50SWQoZmFjZXNDb250ZXh0LCBzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0gICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8sIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QgPSBlLmdldFJldHVyblZhbHVlT25FeGNlcHRpb24oY29udmVydGVkT2JqZWN0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJnZXRDb252ZXJ0ZWRWYWx1ZSBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlR2V0Q29udmVydGVkVmFsdWUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgY29udmVydGVkT2JqZWN0ID0gd3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyR2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbywgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRPYmplY3Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjJmZmRhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTQ3Mjc5MDQ5ODc2NjI1MTM0Nkw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YzIwYTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQxODQyNDA1MTQ2NDgxNDg4OEw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMjg1N2EuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXJJbnRlcmNlcHRvciBleGNlcHRpb25Tb3VyY2U7Ci0gICAgcHJvdGVjdGVkIE9iamVjdCBpbmZvcm1hdGlvbjsKLSAgICBib29sZWFuIHNraXBPdGhlckludGVyY2VwdG9ycyA9IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIzNDMwNzQwNzc1MzI5MTU3MjJMOwotCi0gICAgcHVibGljIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbihib29sZWFuIHNraXBPdGhlckludGVyY2VwdG9ycykKLSAgICB7Ci0gICAgICAgIHRoaXMuc2tpcE90aGVySW50ZXJjZXB0b3JzID0gc2tpcE90aGVySW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzLCBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzKHNraXBPdGhlckludGVyY2VwdG9ycyk7Ci0gICAgICAgIHRoaXMuZXhjZXB0aW9uU291cmNlID0gcmVuZGVyZXJJbnRlcmNlcHRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvbihPYmplY3QgaW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICB0aGlzLmluZm9ybWF0aW9uID0gaW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gaW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNraXBPdGhlckludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJldHVyblZhbHVlT25FeGNlcHRpb24oT2JqZWN0IGN1cnJlbnRSZXR1cm5WYWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLmV4Y2VwdGlvblNvdXJjZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5leGNlcHRpb25Tb3VyY2UuZ2V0UmV0dXJuVmFsdWVPblNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24odGhpcywgY3VycmVudFJldHVyblZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3VycmVudFJldHVyblZhbHVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0Fic3RyYWN0U3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNzBhNmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0Fic3RyYWN0U3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Qcm9qZWN0U3RhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIGV4ZWN1dGUgbG9naWMganVzdCBvbmNlLg0KLSAqIGUuZy4gcmVnaXN0ZXIgYXJ0aWZhY3RzIHZpYSBhcGkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgLy9kb24ndCByZW1vdmUgLSBpdCdzIGEgZmFsbGJhY2sgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggZGVyZWdpc3RyYXRpb24NCi0gICAgLy90YXJnZXQ6IGRvbid0IHByb2Nlc3MgaW5pdCBsb2dpYyBtb3JlIHRoYW4gb25jZQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENsYXNzPiBpbml0aWFsaXplZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVySW5pdGlhbGl6ZWQgPSBmYWxzZTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKEFic3RyYWN0U3RhcnR1cExpc3RlbmVyLmNsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZWRMaXN0ZW5lcnMuY29udGFpbnMoZ2V0Q2xhc3MoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnQgaW5pdCBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWlzU3RhcnR1cExpc3RlbmVyRGVhY3RpdmF0ZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJpbml0IG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZGVhY3RpdmF0ZWQiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImluaXQgb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBKc2ZVdGlscy5kZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcih0aGlzKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBkZXJlZ2lzdGVyaW5nIHRoZSBwaGFzZS1saXN0ZW5lciINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtPiB0aGVyZSBpcyBqdXN0IGEgbGl0dGxlIG92ZXJoZWFkLCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBidXQgZXZlcnl0aGluZyBlbHNlIHdvcmtzIGNvcnJlY3RseS4iDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaG93ZXZlciwgcGxlYXNlIGluZm9ybSB0aGUgY29tbXVuaXR5IGFib3V0IHlvdXIgY29uZmlndXJhdGlvbiIsIHQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWRMaXN0ZW5lcnMuYWRkKGdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5SRVNUT1JFX1ZJRVc7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTdGFydHVwTGlzdGVuZXJEZWFjdGl2YXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5pc0V4dFZhbERlYWN0aXZhdGVkKCkgfHwNCi0gICAgICAgICAgICAgICAgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sVXRpbHMuZ2V0SW5pdFBhcmFtZXRlcihudWxsLCBnZXRDbGFzcygpLmdldE5hbWUoKSArICI6REVBQ1RJVkFURUQiKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFByb2plY3RTdGFnZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgaWYoIWRlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlckluaXRpYWxpemVkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoUHJvamVjdFN0YWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpLCBnZXRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpLCBmYWxzZSk7DQotICAgICAgICAgICAgZGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVySW5pdGlhbGl6ZWQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBQcm9qZWN0U3RhZ2VSZXNvbHZlciBnZXRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdCgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZDMyODEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0V4dFZhbFN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlBoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXIKLSAgICAgICAgLkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjUwNDgyNjQyMTA4NjU3MjAxMkw7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKEV4dFZhbEluZm9ybWF0aW9uLlZFUlNJT04gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnRpbmcgdXAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciB2IiArIEV4dFZhbEluZm9ybWF0aW9uLlZFUlNJT04pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydGluZyB1cCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsKLQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSwgRXh0VmFsUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCksIGZhbHNlKTsKLQotICAgICAgICBpbml0TmFtZU1hcHBlcnMoKTsKLSAgICAgICAgaW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgaW5pdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsKLSAgICAgICAgaW5pdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICBpbml0UGhhc2VMaXN0ZW5lcnMoKTsKLSAgICAgICAgaW5pdFZpb2xhdGlvblNldmVyaXR5S2V5KCk7Ci0gICAgICAgIGluaXREaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb25LZXkoKTsKLSAgICAgICAgaW5pdFJlcXVpcmVkSW5pdGlhbGl6YXRpb24oKTsKLSAgICAgICAgZXhlY3V0ZUN1c3RvbVN0YXJ0dXBMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0TmFtZU1hcHBlcnMoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGRlYWN0aXZhdGVEZWZhdWx0TmFtZU1hcHBlcnMgPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9ERUZBVUxUX05BTUVfTUFQUEVSUzsKLSAgICAgICAgaWYgKChkZWFjdGl2YXRlRGVmYXVsdE5hbWVNYXBwZXJzICE9IG51bGwgJiYgZGVhY3RpdmF0ZURlZmF1bHROYW1lTWFwcGVycy5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvL3JlZ2lzdGVyIG1ldGFkYXRhIHRvIHZhbGlkYXRpb24gc3RyYXRlZ3kgbmFtZSBtYXBwZXIKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsKLQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsKLQotICAgICAgICAvL3JlZ2lzdGVyIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWVzc2FnZSByZXNvbHZlciBuYW1lIG1hcHBlcgotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0KLSAgICAgICAgLy9yZWdpc3RlciB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1ldGFkYXRhIHRyYW5zZm9ybWVyIG5hbWUgbWFwcGVyCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUN1c3RvbVN0YXJ0dXBMaXN0ZW5lcigpCi0gICAgewotICAgICAgICBTdHJpbmcgY3VzdG9tU3RhcnR1cExpc3RlbmVyTmFtZSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBUlRVUF9MSVNURU5FUik7Ci0gICAgICAgIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lciA9Ci0gICAgICAgICAgICAoQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGN1c3RvbVN0YXJ0dXBMaXN0ZW5lck5hbWUpOwotCi0gICAgICAgIGlmKGN1c3RvbVN0YXJ0dXBMaXN0ZW5lciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydCBpbml0IG9mICIgKyBjdXN0b21TdGFydHVwTGlzdGVuZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjdXN0b21TdGFydHVwTGlzdGVuZXIuaW5pdCgpOwotCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJpbml0IG9mICIgKyBjdXN0b21TdGFydHVwTGlzdGVuZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKAotICAgICAgICAgICAgICAgIG5ldyBIdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigKLSAgICAgICAgICAgICAgICBuZXcgVmlvbGF0aW9uU2V2ZXJpdHlWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCkKLSAgICB7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnNldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIobmV3IERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCksIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRQaGFzZUxpc3RlbmVycygpCi0gICAgewotICAgICAgICBKc2ZVdGlscy5yZWdpc3RlclBoYXNlTGlzdGVuZXIobmV3IFBoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0VmlvbGF0aW9uU2V2ZXJpdHlLZXkoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MuZ2V0TmFtZSgpLCBWaW9sYXRpb25TZXZlcml0eS5jbGFzcywgZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0RGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uS2V5KCkKLSAgICB7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KAotICAgICAgICAgICAgICAgIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCksIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcywgZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0UmVxdWlyZWRJbml0aWFsaXphdGlvbigpCi0gICAgewotICAgICAgICBpZihXZWJYbWxQYXJhbWV0ZXIuQUNUSVZBVEVfUkVRVUlSRURfSU5JVElBTElaQVRJT04gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiByZXF1aXJlZEluaXRpYWxpemF0aW9uID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkFDVElWQVRFX1JFUVVJUkVEX0lOSVRJQUxJWkFUSU9OKTsKLQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoIm1vZGU6aW5pdDpyZXF1aXJlZCIsIHJlcXVpcmVkSW5pdGlhbGl6YXRpb24sIGZhbHNlKTsKLQotICAgICAgICAgICAgaWYocmVxdWlyZWRJbml0aWFsaXphdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWFjdGl2YXRlUmVxdWlyZWRBdHRyaWJ1dGVTdXBwb3J0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpZiBpdCdzIGNvbmZpZ3VyZWQgdGhhdCByZXF1aXJlZCBpbml0IHNob3VsZCBoYXBwZW4sCi0gICAgICogaXQncyByZXF1aXJlZCB0byBkZWFjdGl2YXRlIHRoZSBzdXBwb3J0IGZvciB0aGUgcmVxdWlyZWQgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRlYWN0aXZhdGVSZXF1aXJlZEF0dHJpYnV0ZVN1cHBvcnQoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoIm1vZGU6cmVzZXQ6cmVxdWlyZWQiLCBCb29sZWFuLlRSVUUsIGZhbHNlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0QXBwbGljYXRpb25TY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIzOGJkZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5SRVVTRTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIGdlbmVyaWMgc3RvcmFnZSBtYW5hZ2VyIGltcGxlbWVudGF0aW9uIHdoaWNoIHN0b3JlcyB0aGUgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbnMgaW4gdGhlIGFwcGxpY2F0aW9uIHNjb3BlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihSRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxUPiBleHRlbmRzIEFic3RyYWN0U3RvcmFnZU1hbmFnZXI8VD4NCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBUPiByZXNvbHZlU3RvcmFnZU1hcCgpDQotICAgIHsNCi0gICAgICAgIE1hcCBhcHBsaWNhdGlvbk1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbk1hcCgpOw0KLSAgICAgICAgTWFwPFN0cmluZywgVD4gc3RvcmFnZU1hcDsNCi0NCi0gICAgICAgIGlmKCFhcHBsaWNhdGlvbk1hcC5jb250YWluc0tleShnZXRTdG9yYWdlTWFuYWdlcktleSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUPigpOw0KLSAgICAgICAgICAgIGFwcGxpY2F0aW9uTWFwLnB1dChnZXRTdG9yYWdlTWFuYWdlcktleSgpLCBzdG9yYWdlTWFwKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoTWFwPFN0cmluZywgVD4pYXBwbGljYXRpb25NYXAuZ2V0KGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY2NjE0ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LlJFVVNFOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogZ2VuZXJpYyBzdG9yYWdlIG1hbmFnZXIgaW1wbGVtZW50YXRpb24gd2hpY2ggc3RvcmVzIHRoZSBzdG9yYWdlIGltcGxlbWVudGF0aW9ucyBpbiB0aGUgcmVxdWVzdCBzY29wZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxUPiBleHRlbmRzIEFic3RyYWN0U3RvcmFnZU1hbmFnZXI8VD4NCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBUPiByZXNvbHZlU3RvcmFnZU1hcCgpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFQ+IHN0b3JhZ2VNYXA7DQotDQotICAgICAgICBpZighcmVxdWVzdE1hcC5jb250YWluc0tleShnZXRTdG9yYWdlTWFuYWdlcktleSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUPigpOw0KLSAgICAgICAgICAgIHJlcXVlc3RNYXAucHV0KGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCksIHN0b3JhZ2VNYXApOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChNYXA8U3RyaW5nLCBUPilyZXF1ZXN0TWFwLmdldChnZXRTdG9yYWdlTWFuYWdlcktleSgpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RTdG9yYWdlTWFuYWdlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0U3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg5OGI5Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5SRVVTRTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBnZW5lcmljIHN0b3JhZ2UgbWFuYWdlciBpbXBsZW1lbnRhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RvcmFnZU1hbmFnZXI8VD4gZXh0ZW5kcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8U3RyaW5nPg0KLSAgICAgICAgaW1wbGVtZW50cyBTdG9yYWdlTWFuYWdlcjxUPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4oKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0U3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBUIGNyZWF0ZShTdHJpbmcgc3RvcmFnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIFQgc3RvcmFnZU1hbmFnZXI7DQotICAgICAgICBTdHJpbmcgc3RvcmFnZUNsYXNzTmFtZTsNCi0gICAgICAgIC8vbnVsbCAtPiB1c2UgbmFtZSBtYXBwZXJzDQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8U3RyaW5nPiBuYW1lTWFwcGVyIDogdGhpcy5uYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlQ2xhc3NOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKHN0b3JhZ2VOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoc3RvcmFnZUNsYXNzTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHN0b3JhZ2VNYW5hZ2VyID0gcmVzb2x2ZVN0b3JhZ2Uoc3RvcmFnZU5hbWUsIHN0b3JhZ2VDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChzdG9yYWdlTWFuYWdlciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2VNYW5hZ2VyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBUIHJlc29sdmVTdG9yYWdlKFN0cmluZyBzdG9yYWdlS2V5LCBTdHJpbmcgc3RvcmFnZUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgVD4gc3RvcmFnZU1hcCA9IHJlc29sdmVTdG9yYWdlTWFwKCk7DQotDQotICAgICAgICBpZighc3RvcmFnZU1hcC5jb250YWluc0tleShzdG9yYWdlS2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlTWFwLnB1dChzdG9yYWdlS2V5LCAoVClDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoc3RvcmFnZUNsYXNzTmFtZSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHN0b3JhZ2VNYXAuZ2V0KHN0b3JhZ2VLZXkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNYXA8U3RyaW5nLCBUPiByZXNvbHZlU3RvcmFnZU1hcCgpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgc3RvcmFnZUtleSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgVD4gc3RvcmFnZU1hcCA9IHJlc29sdmVTdG9yYWdlTWFwKCk7DQotDQotICAgICAgICBpZihzdG9yYWdlTWFwICE9IG51bGwgJiYgc3RvcmFnZU1hcC5jb250YWluc0tleShzdG9yYWdlS2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDbGFzcyBzdG9yYWdlQ2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHN0b3JhZ2VNYXAuZ2V0KHN0b3JhZ2VLZXkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgIHN0b3JhZ2VNYXAucHV0KHN0b3JhZ2VLZXksIChUKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHN0b3JhZ2VDbGFzcykpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gZ2V0TmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5uYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdhZjAzMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlIGltcGxlbWVudHMgRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgUGhhc2VJZCBjdXJyZW50UGhhc2VJZDsNCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q3VycmVudFBoYXNlSWQoUGhhc2VJZCBwaGFzZUlkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmN1cnJlbnRQaGFzZUlkID0gcGhhc2VJZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRDdXJyZW50UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRQaGFzZUlkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTEzYmRmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlci5EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIGpzZiBpbmZvcm1hdGlvbiBub3QgYXZhaWxhYmxlIHZpYSBqc2YtYXBpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIgZXh0ZW5kcw0KLSAgICAgICAgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlPg0KLXsNCi0gICAgRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBEZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfRkFDRVNfSU5GT1JNQVRJT05fU1RPUkFHRTpLRVkiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDZiN2MuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuRmFjZXNNZXNzYWdlSG9sZGVyOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gIm9wdGlvbmFsIHBhcmFtZXRlciB0byBkZWFjdGl2YXRlIHNvcnRpbmciKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlIGltcGxlbWVudHMgRmFjZXNNZXNzYWdlU3RvcmFnZQ0KLXsNCi0gICAgTWFwPFN0cmluZywgVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgVmFsaWRhdGlvblJlc3VsdD4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkRmFjZXNNZXNzYWdlKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYoY2xpZW50SWQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjbGllbnRJZCA9ICIqIjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKCF0aGlzLnJlc3VsdHMuY29udGFpbnNLZXkoY2xpZW50SWQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMucmVzdWx0cy5wdXQoY2xpZW50SWQsIG5ldyBWYWxpZGF0aW9uUmVzdWx0KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGhpcy5yZXN1bHRzLmdldChjbGllbnRJZCkuYWRkRmFjZXNNZXNzYWdlSG9sZGVyKG5ldyBGYWNlc01lc3NhZ2VIb2xkZXIoZmFjZXNNZXNzYWdlLCBjbGllbnRJZCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZ2V0RmFjZXNNZXNzYWdlcygpDQotICAgIHsNCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgICAgIGZvcihWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRpb25SZXN1bHQgOiB0aGlzLnJlc3VsdHMudmFsdWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh2YWxpZGF0aW9uUmVzdWx0LmdldEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEFsbCgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdDsNCi0NCi0gICAgICAgIGZvcihWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRpb25SZXN1bHQgOiB0aGlzLnJlc3VsdHMudmFsdWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCA9IHZhbGlkYXRpb25SZXN1bHQuZ2V0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdCgpOw0KLSAgICAgICAgICAgIHNvcnRGYWNlc01lc3NhZ2VIb2xkZXJMaXN0KGZhY2VzTWVzc2FnZUhvbGRlckxpc3QpOw0KLQ0KLSAgICAgICAgICAgIGZvcihGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyIDogZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dC5hZGRNZXNzYWdlKGZhY2VzTWVzc2FnZUhvbGRlci5nZXRDbGllbnRJZCgpLCBmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0RmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc29ydEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QpDQotICAgIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCwgZ2V0RmFjZXNNZXNzYWdlQ29tcGFyYXRvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgQ29tcGFyYXRvcjxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZUNvbXBhcmF0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IENvbXBhcmF0b3I8RmFjZXNNZXNzYWdlSG9sZGVyPigpIHsNCi0gICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoRmFjZXNNZXNzYWdlSG9sZGVyIGhvbGRlcjEsIEZhY2VzTWVzc2FnZUhvbGRlciBob2xkZXIyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoaG9sZGVyMS5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpID09IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKGlzU2FtZVNldmVyaXR5KGhvbGRlcjEsIGhvbGRlcjIpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZU1lc3NhZ2VUZXh0KGhvbGRlcjEuZ2V0RmFjZXNNZXNzYWdlKCksIGhvbGRlcjIuZ2V0RmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmKGhvbGRlcjEuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKS5nZXRPcmRpbmFsKCkgPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlcjIuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKS5nZXRPcmRpbmFsKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByaXZhdGUgaW50IGNvbXBhcmVNZXNzYWdlVGV4dChGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlMSwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZTIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dDEgPSBmYWNlc01lc3NhZ2UxLmdldERldGFpbCgpOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dDIgPSBmYWNlc01lc3NhZ2UyLmdldERldGFpbCgpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZih0ZXh0MSA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0ZXh0MSA9IGZhY2VzTWVzc2FnZTEuZ2V0U3VtbWFyeSgpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmKHRleHQyID09IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRleHQyID0gZmFjZXNNZXNzYWdlMi5nZXRTdW1tYXJ5KCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYodGV4dDEgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYodGV4dDIgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0MS5jb21wYXJlVG9JZ25vcmVDYXNlKHRleHQyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NhbWVTZXZlcml0eShGYWNlc01lc3NhZ2VIb2xkZXIgaG9sZGVyMSwgRmFjZXNNZXNzYWdlSG9sZGVyIGhvbGRlcjIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBob2xkZXIxLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkuZXF1YWxzKGhvbGRlcjIuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTWFuYWdlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTIzMjZmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTmFtZU1hcHBlcjsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgZmFjZXMgbWVzc2FnZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTWFuYWdlciBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxGYWNlc01lc3NhZ2VTdG9yYWdlPg0KLXsNCi0gICAgRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX0ZBQ0VTX01FU1NBR0VTOktFWSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0R3JvdXBTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YjRkNjEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Hcm91cFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGdyb3Vwcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRHcm91cFN0b3JhZ2UgaW1wbGVtZW50cyBHcm91cFN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IGFkZGVkR3JvdXBzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PENsYXNzPj4oKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PENsYXNzPj4gcmVzdHJpY3RlZEdyb3VwcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgYWRkR3JvdXBUb0dyb3VwU3RvcmFnZShncm91cENsYXNzLCB2aWV3SWQsIGNsaWVudElkLCB0aGlzLmFkZGVkR3JvdXBzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZXN0cmljdEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgYWRkR3JvdXBUb0dyb3VwU3RvcmFnZShncm91cENsYXNzLCB2aWV3SWQsIGNsaWVudElkLCB0aGlzLnJlc3RyaWN0ZWRHcm91cHMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzc1tdIGdldEdyb3VwcyhTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMuYWRkZWRHcm91cHMuc2l6ZSgpIDwgMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vYWRkIGZvdW5kIGdyb3Vwcw0KLSAgICAgICAgU3RyaW5nIGtleSA9IEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBudWxsKTsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IHJlc3VsdExpc3RGb3JQYWdlID0gYnVpbGRHcm91cExpc3Qoa2V5LCB0aGlzLmFkZGVkR3JvdXBzKTsNCi0NCi0gICAgICAgIGtleSA9IEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBjbGllbnRJZCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN1bHRMaXN0Rm9yQ29tcG9uZW50ID0gYnVpbGRHcm91cExpc3Qoa2V5LCB0aGlzLmFkZGVkR3JvdXBzKTsNCi0NCi0gICAgICAgIC8vcmVtb3ZlIHJlc3RyaWN0ZWQgZ3JvdXBzDQotICAgICAgICBDbGFzc1tdIHJlc3VsdHNGb3JQYWdlID0NCi0gICAgICAgICAgICAgICAgZmlsdGVyR3JvdXBMaXN0KEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBudWxsKSwgcmVzdWx0TGlzdEZvclBhZ2UpOw0KLSAgICAgICAgQ2xhc3NbXSByZXN1bHRzRm9yQ29tcG9uZW50ID0NCi0gICAgICAgICAgICAgICAgZmlsdGVyR3JvdXBMaXN0KEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBjbGllbnRJZCksIHJlc3VsdExpc3RGb3JDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0c0ZvclBhZ2UubGVuZ3RoID09IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYocmVzdWx0c0ZvckNvbXBvbmVudC5sZW5ndGggPT0gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCJubyBncm91cHMgZm9yIGdyb3VwLXZhbGlkYXRpb24gYXZhaWxhYmxlLiIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF5YmUgeW91IHJlc3RyaWN0ZWQgYWxsIGdyb3VwcyBvciB5b3UgYXJlbid0IHVzaW5nIGdyb3Vwcy4iICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlYW4gdmFsaWRhdGlvbiB3aWxsIHVzZSB0aGUgZGVmYXVsdCBncm91cCBmb3IgdmFsaWRhdGlvbiIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRzRm9yQ29tcG9uZW50Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihyZXN1bHRzRm9yQ29tcG9uZW50Lmxlbmd0aCA9PSAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRzRm9yUGFnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBtZXJnZVJlc3VsdHMocmVzdWx0c0ZvclBhZ2UsIHJlc3VsdHNGb3JDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRHcm91cFRvR3JvdXBTdG9yYWdlKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IGdyb3VwU3RvcmFnZSkNCi0gICAgew0KLSAgICAgICAgTGlzdDxDbGFzcz4gZ3JvdXBMaXN0ID0gZ3JvdXBTdG9yYWdlLmdldChHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgY2xpZW50SWQpKTsNCi0NCi0gICAgICAgIGlmKGdyb3VwTGlzdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGdyb3VwTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgICAgICAgICAgZ3JvdXBTdG9yYWdlLnB1dChHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgY2xpZW50SWQpLCBncm91cExpc3QpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoIWdyb3VwTGlzdC5jb250YWlucyhncm91cENsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBncm91cExpc3QuYWRkKGdyb3VwQ2xhc3MpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxDbGFzcz4gYnVpbGRHcm91cExpc3QoU3RyaW5nIGtleSwgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IGdyb3VwU3RvcmFnZSkNCi0gICAgew0KLSAgICAgICAgTGlzdDxDbGFzcz4gbGlzdCA9IGdyb3VwU3RvcmFnZS5nZXQoa2V5KTsNCi0gICAgICAgIHJldHVybiAobGlzdCAhPSBudWxsKSA/IGxpc3QgOiBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3NbXSBmaWx0ZXJHcm91cExpc3QoU3RyaW5nIGtleSwgTGlzdDxDbGFzcz4gYWRkZWRHcm91cHMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHMgPSBidWlsZEdyb3VwTGlzdChrZXksIHRoaXMucmVzdHJpY3RlZEdyb3Vwcyk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBjdXJyZW50R3JvdXAgOiBhZGRlZEdyb3VwcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighcmVzdHJpY3RlZEdyb3Vwcy5jb250YWlucyhjdXJyZW50R3JvdXApKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoY3VycmVudEdyb3VwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0cy50b0FycmF5KG5ldyBDbGFzc1tyZXN1bHRzLnNpemUoKV0pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3NbXSBtZXJnZVJlc3VsdHMoQ2xhc3NbXSByZXN1bHRzRm9yUGFnZSwgQ2xhc3NbXSByZXN1bHRzRm9yQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBDbGFzc1tdIG1lcmdlZFJlc3VsdCA9IG5ldyBDbGFzc1tyZXN1bHRzRm9yUGFnZS5sZW5ndGggKyByZXN1bHRzRm9yQ29tcG9uZW50Lmxlbmd0aF07DQotDQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdHNGb3JQYWdlLCAwLCBtZXJnZWRSZXN1bHQsIDAsIHJlc3VsdHNGb3JQYWdlLmxlbmd0aCk7DQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdHNGb3JDb21wb25lbnQsIDAsIG1lcmdlZFJlc3VsdCwgcmVzdWx0c0ZvclBhZ2UubGVuZ3RoLCByZXN1bHRzRm9yQ29tcG9uZW50Lmxlbmd0aCk7DQotDQotICAgICAgICByZXR1cm4gbWVyZ2VkUmVzdWx0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0R3JvdXBTdG9yYWdlTWFuYWdlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNmI1YmMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBncm91cHMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRHcm91cFN0b3JhZ2VNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPEdyb3VwU3RvcmFnZT4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfR1JPVVBTOktFWSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWV0YURhdGFTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZDdiNTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRNZXRhRGF0YVN0b3JhZ2UgaW1wbGVtZW50cyBNZXRhRGF0YVN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWFwPFN0cmluZywgUHJvcGVydHlJbmZvcm1hdGlvbj4+IGNhY2hlZFByb3BlcnR5SW5mb3JtYXRpb24gPQ0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgUHJvcGVydHlJbmZvcm1hdGlvbj4+KCk7DQotDQotICAgIHByaXZhdGUgTGlzdDxNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IG1ldGFEYXRhU3RvcmFnZUZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4oKTsNCi0gICAgcHJpdmF0ZSBMaXN0PENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+PiBkZW5pZWRNZXRhRGF0YUZpbHRlcnMgPQ0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8Q2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0TWV0YURhdGFTdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgaW5pdEZpbHRlcnMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdEZpbHRlcnMoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIpOw0KLSAgICAgICAgbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoDQotICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIpKTsNCi0NCi0gICAgICAgIE1ldGFEYXRhU3RvcmFnZUZpbHRlciBtZXRhRGF0YVN0b3JhZ2VGaWx0ZXI7DQotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lIDogbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgPQ0KLSAgICAgICAgICAgICAgICAoTWV0YURhdGFTdG9yYWdlRmlsdGVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWV0YURhdGFTdG9yYWdlRmlsdGVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLm1ldGFEYXRhU3RvcmFnZUZpbHRlcnMuYWRkKG1ldGFEYXRhU3RvcmFnZUZpbHRlcik7DQotDQotICAgICAgICAgICAgICAgIGxvZ0FkZGVkRmlsdGVyKG1ldGFEYXRhU3RvcmFnZUZpbHRlci5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc3RvcmVNZXRhRGF0YU9mKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgaW52b2tlRmlsdGVycyhwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvblRvU3RvcmUgPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBwcm9wZXJ0eUluZm9ybWF0aW9uDQotICAgICAgICAgICAgICAgIC5nZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgY29weU1ldGFEYXRhKHByb3BlcnR5SW5mb3JtYXRpb24sIHByb3BlcnR5SW5mb3JtYXRpb25Ub1N0b3JlKTsNCi0NCi0gICAgICAgIGdldE1hcEZvckNsYXNzKFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpKSkNCi0gICAgICAgICAgICAgICAgLnB1dChwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvblRvU3RvcmUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbnZva2VGaWx0ZXJzKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgZm9yKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBmaWx0ZXIgOiB0aGlzLm1ldGFEYXRhU3RvcmFnZUZpbHRlcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmlsdGVyLmZpbHRlcihwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeVtdIGdldE1ldGFEYXRhKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IGdldE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5nZXQodGFyZ2V0UHJvcGVydHkpOw0KLQ0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBjbG9uZWRQcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKCk7DQotICAgICAgICBjb3B5TWV0YURhdGEocHJvcGVydHlJbmZvcm1hdGlvbiwgY2xvbmVkUHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgICAgICByZXR1cm4gY2xvbmVkUHJvcGVydHlJbmZvcm1hdGlvbi5nZXRNZXRhRGF0YUVudHJpZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc01ldGFEYXRhRm9yKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykuY29udGFpbnNLZXkodGFyZ2V0UHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRmlsdGVyKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBzdG9yYWdlRmlsdGVyKQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoIWlzRmlsdGVyRGVuaWVkKHN0b3JhZ2VGaWx0ZXIpICYmICFpc0ZpbHRlckFscmVhZHlSZWdpc3RlcmVkKHN0b3JhZ2VGaWx0ZXIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5tZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzLmFkZChzdG9yYWdlRmlsdGVyKTsNCi0gICAgICAgICAgICAgICAgbG9nQWRkZWRGaWx0ZXIoc3RvcmFnZUZpbHRlci5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRmlsdGVyRGVuaWVkKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBzdG9yYWdlRmlsdGVyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5kZW5pZWRNZXRhRGF0YUZpbHRlcnMuY29udGFpbnMoZ2V0U3RvcmFnZUZpbHRlckNsYXNzKHN0b3JhZ2VGaWx0ZXIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNGaWx0ZXJBbHJlYWR5UmVnaXN0ZXJlZChNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgc3RvcmFnZUZpbHRlcikNCi0gICAgew0KLSAgICAgICAgZm9yKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBmaWx0ZXIgOiB0aGlzLm1ldGFEYXRhU3RvcmFnZUZpbHRlcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoZmlsdGVyLmdldENsYXNzKCkuZXF1YWxzKGdldFN0b3JhZ2VGaWx0ZXJDbGFzcyhzdG9yYWdlRmlsdGVyKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZGVyZWdpc3RlckZpbHRlcihDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPiBmaWx0ZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgTWV0YURhdGFTdG9yYWdlRmlsdGVyIHN0b3JhZ2VGaWx0ZXIgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzcyhmaWx0ZXJDbGFzcyk7DQotDQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5tZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzLnJlbW92ZShzdG9yYWdlRmlsdGVyKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGxvZ1JlbW92ZWRGaWx0ZXIoc3RvcmFnZUZpbHRlci5nZXRDbGFzcygpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBkZW55RmlsdGVyKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlcklkIDogdGhpcy5kZW5pZWRNZXRhRGF0YUZpbHRlcnMpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihmaWx0ZXJJZC5lcXVhbHMoZmlsdGVyQ2xhc3MpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdGhpcy5kZW5pZWRNZXRhRGF0YUZpbHRlcnMuYWRkKGZpbHRlckNsYXNzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGRlcmVnaXN0ZXJGaWx0ZXIoZmlsdGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkNCi0gICAgcHJpdmF0ZSB2b2lkIGNvcHlNZXRhRGF0YShQcm9wZXJ0eUluZm9ybWF0aW9uIHNvdXJjZSwgUHJvcGVydHlJbmZvcm1hdGlvbiB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRW50cnkgbmV3TWV0YURhdGFFbnRyeTsNCi0gICAgICAgIGZvcihNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkgOiBzb3VyY2UuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbmV3TWV0YURhdGFFbnRyeSA9IG5ldyBNZXRhRGF0YUVudHJ5KCk7DQotICAgICAgICAgICAgbmV3TWV0YURhdGFFbnRyeS5zZXRLZXkobWV0YURhdGFFbnRyeS5nZXRLZXkoKSk7DQotICAgICAgICAgICAgbmV3TWV0YURhdGFFbnRyeS5zZXRWYWx1ZShtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkpOw0KLQ0KLSAgICAgICAgICAgIHRhcmdldC5hZGRNZXRhRGF0YUVudHJ5KG5ld01ldGFEYXRhRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBsb2dBZGRlZEZpbHRlcihDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPiBmaWx0ZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oZmlsdGVyQ2xhc3MuZ2V0TmFtZSgpICsgIiBhZGRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBsb2dSZW1vdmVkRmlsdGVyKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhmaWx0ZXJDbGFzcy5nZXROYW1lKCkgKyAiIHJlbW92ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFByb3BlcnR5SW5mb3JtYXRpb24+IGdldE1hcEZvckNsYXNzKENsYXNzIHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGtleSA9IFByb3h5VXRpbHMuZ2V0Q2xhc3NOYW1lKHRhcmdldCk7DQotICAgICAgICBpZighdGhpcy5jYWNoZWRQcm9wZXJ0eUluZm9ybWF0aW9uLmNvbnRhaW5zS2V5KGtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5jYWNoZWRQcm9wZXJ0eUluZm9ybWF0aW9uLnB1dChrZXksIG5ldyBIYXNoTWFwPFN0cmluZywgUHJvcGVydHlJbmZvcm1hdGlvbj4oKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRQcm9wZXJ0eUluZm9ybWF0aW9uLmdldChrZXkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gZ2V0U3RvcmFnZUZpbHRlckNsYXNzKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBzdG9yYWdlRmlsdGVyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhzdG9yYWdlRmlsdGVyLmdldENsYXNzKCksIE1ldGFEYXRhU3RvcmFnZUZpbHRlci5jbGFzcyk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNjNjliZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRNZXRhRGF0YVN0b3JhZ2VOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIHByb3BlcnR5IGluZm9ybWF0aW9uIGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdEFwcGxpY2F0aW9uU2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPE1ldGFEYXRhU3RvcmFnZT4NCi17DQotICAgIERlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRNZXRhRGF0YVN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfTUVUQV9EQVRBX0NBQ0hFOktFWSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UHJvcGVydHlTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMGE3ZjAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9wZXJ0eVN0b3JhZ2UgaW1wbGVtZW50cyBQcm9wZXJ0eVN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWFwPFN0cmluZywgRmllbGQ+PiBmaWVsZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgRmllbGQ+PigpOw0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIE1ldGhvZD4+IG1ldGhvZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgTWV0aG9kPj4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgc3RvcmVGaWVsZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5LCBGaWVsZCBmaWVsZCkNCi0gICAgew0KLSAgICAgICAgZ2V0RmllbGRNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykucHV0KHByb3BlcnR5LCBmaWVsZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc3RvcmVNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSwgTWV0aG9kIG1ldGhvZCkNCi0gICAgew0KLSAgICAgICAgZ2V0TWV0aG9kTWFwRm9yQ2xhc3ModGFyZ2V0Q2xhc3MpLnB1dChwcm9wZXJ0eSwgIG1ldGhvZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZpZWxkIGdldEZpZWxkKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRGaWVsZE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5nZXQocHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRNZXRob2RNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykuZ2V0KHByb3BlcnR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0ZpZWxkKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRGaWVsZE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5jb250YWluc0tleShwcm9wZXJ0eSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldE1ldGhvZE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5jb250YWluc0tleShwcm9wZXJ0eSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBGaWVsZD4gZ2V0RmllbGRNYXBGb3JDbGFzcyhDbGFzcyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBrZXkgPSBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh0YXJnZXQpOw0KLSAgICAgICAgaWYgKCF0aGlzLmZpZWxkTWFwLmNvbnRhaW5zS2V5KGtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5maWVsZE1hcC5wdXQoa2V5LCBuZXcgSGFzaE1hcDxTdHJpbmcsIEZpZWxkPigpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0aGlzLmZpZWxkTWFwLmdldChrZXkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWV0aG9kPiBnZXRNZXRob2RNYXBGb3JDbGFzcyhDbGFzcyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBrZXkgPSBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh0YXJnZXQpOw0KLSAgICAgICAgaWYgKCF0aGlzLm1ldGhvZE1hcC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubWV0aG9kTWFwLnB1dChrZXksIG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kPigpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0aGlzLm1ldGhvZE1hcC5nZXQoa2V5KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFByb3BlcnR5U3RvcmFnZU1hbmFnZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UHJvcGVydHlTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjMwMTBhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UHJvcGVydHlTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdFByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXI7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIHByb3BlcnR5IGluZm9ybWF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0UHJvcGVydHlTdG9yYWdlTWFuYWdlciBleHRlbmRzIEFic3RyYWN0QXBwbGljYXRpb25TY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8UHJvcGVydHlTdG9yYWdlPg0KLXsNCi0gICAgRGVmYXVsdFByb3BlcnR5U3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdFByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBTdG9yYWdlTWFuYWdlci5jbGFzcy5nZXROYW1lKCkgKyAiX0ZPUl9QUk9QRVJUWTpLRVkiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNzljNjIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZSBpbXBsZW1lbnRzIFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuZ2V0KGtleSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIDxUPiBUIGdldFByb3BlcnR5KFN0cmluZyBrZXksIENsYXNzPFQ+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFQpdGhpcy5wcm9wZXJ0aWVzLmdldChrZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydGllcy5yZW1vdmUoa2V5KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MWIxMGEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciByZW5kZXJlciBpbnRlcmNlcHRvciBwcm9wZXJ0aWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU1hbmFnZXINCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2U+DQotew0KLSAgICBEZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfUkVOREVSRVJfSU5URVJDRVBUT1JfUFJPUEVSVFk6S0VZIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYjUwZjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlIGltcGxlbWVudGF0aW9uIGZvciBncm91cHMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2UgaW1wbGVtZW50cyBSZW5kZXJlclByb3h5U3RvcmFnZQ0KLXsNCi0gICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeT4+IHByb3h5U3RvcmFnZSA9DQotICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnk+PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnRyeShTdHJpbmcgcmVuZGVyZXJLZXksIFN0cmluZyBjbGllbnRJZCwgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBlbnRyeSkNCi0gICAgew0KLSAgICAgICAgZ2V0UmVuZGVyZXJTdG9yYWdlKHJlbmRlcmVyS2V5KS5wdXQoY2xpZW50SWQsIGVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0VudHJ5KFN0cmluZyByZW5kZXJlcktleSwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZXJTdG9yYWdlKHJlbmRlcmVyS2V5KS5jb250YWluc0tleShjbGllbnRJZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZ2V0RW50cnkoU3RyaW5nIHJlbmRlcmVyS2V5LCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRSZW5kZXJlclN0b3JhZ2UocmVuZGVyZXJLZXkpLmdldChjbGllbnRJZCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5PiBnZXRSZW5kZXJlclN0b3JhZ2UoU3RyaW5nIHJlbmRlcmVyS2V5KQ0KLSAgICB7DQotICAgICAgICBpZighcHJveHlTdG9yYWdlLmNvbnRhaW5zS2V5KHJlbmRlcmVyS2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm94eVN0b3JhZ2UucHV0KHJlbmRlcmVyS2V5LCBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnk+KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHByb3h5U3RvcmFnZS5nZXQocmVuZGVyZXJLZXkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDgxMTk2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciByZW5kZXJlciBwcm94eSBlbnRyaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU1hbmFnZXINCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8UmVuZGVyZXJQcm94eVN0b3JhZ2U+DQotew0KLSAgICBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIC8vZm9yIGJldHRlciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5DQotICAgICAgICByZXR1cm4gRXh0VmFsUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCkgKyAiOlNUT1JBR0UiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0U3RvcmFnZU1hbmFnZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTU2NmRlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0U3RvcmFnZU1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBzdG9yYWdlLW1hbmFnZXIgY3JlYXRpb24gYW5kIGNhY2hpbmcNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0U3RvcmFnZU1hbmFnZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PENsYXNzPg0KLSAgICAgICAgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PENsYXNzLCBTdG9yYWdlTWFuYWdlcj4sIFN0b3JhZ2VNYW5hZ2VySG9sZGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gbGF6eVN0YXRpY01hcHBpbmdBcHBsaWVkID0gZmFsc2U7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPENsYXNzPj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8Q2xhc3M+PigpOw0KLSAgICBwcml2YXRlIE1hcDxDbGFzcywgU3RvcmFnZU1hbmFnZXI+IHN0b3JhZ2VUeXBlVG9TdG9yYWdlTWFuYWdlck1hcCA9IG5ldyBIYXNoTWFwPENsYXNzLCBTdG9yYWdlTWFuYWdlcj4oKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoUmVuZGVyZXJQcm94eVN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKEdyb3VwU3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRHcm91cFN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKE1ldGFEYXRhU3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKEZhY2VzTWVzc2FnZVN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoUHJvcGVydHlTdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFByb3BlcnR5U3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTWFuYWdlcigpLCBmYWxzZSk7DQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLQ0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RvcmFnZU1hbmFnZXIgY3JlYXRlKENsYXNzIHN0b3JhZ2VUeXBlKQ0KLSAgICB7DQotICAgICAgICBpZiAoIXRoaXMubGF6eVN0YXRpY01hcHBpbmdBcHBsaWVkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRTdGF0aWNNYXBwaW5ncygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RvcmFnZU1hbmFnZXIgc3RvcmFnZU1hbmFnZXI7DQotICAgICAgICBTdHJpbmcgc3RvcmFnZU1hbmFnZXJOYW1lOw0KLSAgICAgICAgLy9udWxsIC0+IHVzZSBuYW1lIG1hcHBlcnMNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxDbGFzcz4gbmFtZU1hcHBlciA6IHRoaXMubmFtZU1hcHBlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RvcmFnZU1hbmFnZXJOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKHN0b3JhZ2VUeXBlKTsNCi0NCi0gICAgICAgICAgICBpZiAoc3RvcmFnZU1hbmFnZXJOYW1lID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgc3RvcmFnZU1hbmFnZXIgPSAoU3RvcmFnZU1hbmFnZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHN0b3JhZ2VNYW5hZ2VyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHN0b3JhZ2VNYW5hZ2VyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKHN0b3JhZ2VUeXBlLCBzdG9yYWdlTWFuYWdlcik7DQotICAgICAgICAgICAgICAgIHJldHVybiBzdG9yYWdlTWFuYWdlcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZ2V0U3RvcmFnZU1hbmFnZXIoc3RvcmFnZVR5cGUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkTWFwcGluZyhDbGFzcyBzdG9yYWdlVHlwZSwgU3RvcmFnZU1hbmFnZXIgc3RvcmFnZU1hbmFnZXIpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gaXNWYWxpZEVudHJ5ID0gdHJ1ZTsNCi0gICAgICAgIGlmKHN0b3JhZ2VUeXBlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaXNWYWxpZEVudHJ5ID0gZmFsc2U7DQotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNFcnJvckVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCJ5b3UgdHJpZWQgdG8gYWRkIGFuIGludmFsaWQgc3RvcmFnZSB0eXBlIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoc3RvcmFnZU1hbmFnZXIgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpc1ZhbGlkRW50cnkgPSBmYWxzZTsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoInlvdSB0cmllZCB0byBhZGQgYW4gaW52YWxpZCBzdG9yYWdlIG1hbmFnZXIiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZighaXNWYWxpZEVudHJ5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKHN0b3JhZ2VUeXBlLCBzdG9yYWdlTWFuYWdlciwgdHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGF6eVN0YXRpY01hcHBpbmdBcHBsaWVkID0gdHJ1ZTsNCi0NCi0gICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlNUT1JBR0VfVFlQRV9UT19TVE9SQUdFX01BTkFHRVJfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cE1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cE1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3MpDQotICAgIHsNCi0gICAgICAgIGZvcihTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IG1hcHBpbmcgOiBtYXBwaW5ncykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNYXBwaW5nKENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKG1hcHBpbmcuZ2V0U291cmNlKCkpLA0KLSAgICAgICAgICAgICAgICAgICAgKFN0b3JhZ2VNYW5hZ2VyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShtYXBwaW5nLmdldFRhcmdldCgpKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxDbGFzcz4+IGdldE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZU1hcHBlckxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0U3RvcmFnZU1hbmFnZXIoQ2xhc3Mgc3RvcmFnZVR5cGUsIFN0b3JhZ2VNYW5hZ2VyIHN0b3JhZ2VNYW5hZ2VyLCBib29sZWFuIG92ZXJyaWRlKQ0KLSAgICB7DQotICAgICAgICBpZighdGhpcy5zdG9yYWdlVHlwZVRvU3RvcmFnZU1hbmFnZXJNYXAuY29udGFpbnNLZXkoc3RvcmFnZVR5cGUpIHx8DQotICAgICAgICAgICAgICAgICh0aGlzLnN0b3JhZ2VUeXBlVG9TdG9yYWdlTWFuYWdlck1hcC5jb250YWluc0tleShzdG9yYWdlVHlwZSkgJiYgb3ZlcnJpZGUpKQ0KLSAgICAgICAgew0KLQ0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZGRpbmcgdHlwZSB0byBzdG9yYWdlLW1hbmFnZXIgbWFwcGluZzogIg0KLSAgICAgICAgICAgICAgICAgICAgKyBzdG9yYWdlVHlwZS5nZXROYW1lKCkgKyAiIC0+ICIgKyBzdG9yYWdlTWFuYWdlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHRoaXMuc3RvcmFnZVR5cGVUb1N0b3JhZ2VNYW5hZ2VyTWFwLnB1dChzdG9yYWdlVHlwZSwgc3RvcmFnZU1hbmFnZXIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdG9yYWdlTWFuYWdlciBnZXRTdG9yYWdlTWFuYWdlcihDbGFzcyB0eXBlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlVHlwZVRvU3RvcmFnZU1hbmFnZXJNYXAuZ2V0KHR5cGUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3YmMzZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZSBpbXBsZW1lbnRzIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgdmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsNCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcihWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciA9IHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU1hbmFnZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMDhiNTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgYSBjdXN0b20gVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VNYW5hZ2VyIGV4dGVuZHMNCi0gICAgICAgIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZT4NCi17DQotICAgIERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX1ZJT0xBVElPTlNFVkVSSVRZX0lOVEVSUFJFVEVSOktFWSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYwMTgzNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi0NCi0vKioNCi0gKiBzdG9yYWdlIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IGZhY2VzIHJlcXVlc3QNCi0gKiBmb3Igbm93IGl0IGp1c3QgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgcGhhc2Ugb2YgdGhlIGxpZmVjeWNsZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlDQotew0KLSAgICB2b2lkIHNldEN1cnJlbnRQaGFzZUlkKFBoYXNlSWQgcGhhc2VJZCk7DQotDQotICAgIFBoYXNlSWQgZ2V0Q3VycmVudFBoYXNlSWQoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9GYWNlc01lc3NhZ2VTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNTBmNGYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkZhY2VzTWVzc2FnZUhvbGRlcjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRmFjZXNNZXNzYWdlU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBhZGRGYWNlc01lc3NhZ2UoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKTsNCi0NCi0gICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZXMoKTsNCi0NCi0gICAgdm9pZCBhZGRBbGwoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0dyb3VwU3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0dyb3VwU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmMwMTRiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Hcm91cFN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBzdWdnZXN0ZWQgaW50ZXJmYWNlIGZvciBhIGdyb3VwIHN0b3JhZ2UNCi0gKiB1c2VkIGJ5IHRoZSBidmkgbW9kdWxlIGFuZCBhZGQtb25zDQotICogPHAvPg0KLSAqIGl0IGFsbG93cyB0byBtYW5hZ2UgZ3JvdXBzIGZvciB0aGUgY3VycmVudCByZXF1ZXN0DQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBHcm91cFN0b3JhZ2UNCi17DQotICAgIHZvaWQgYWRkR3JvdXAoQ2xhc3MgZ3JvdXBDbGFzcywgU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKTsNCi0NCi0gICAgdm9pZCByZXN0cmljdEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCk7DQotDQotICAgIENsYXNzW10gZ2V0R3JvdXBzKFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NZXRhRGF0YVN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NZXRhRGF0YVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjllY2ViZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWV0YURhdGFTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBNZXRhRGF0YVN0b3JhZ2UNCi17DQotICAgIHZvaWQgc3RvcmVNZXRhRGF0YU9mKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgIE1ldGFEYXRhRW50cnlbXSBnZXRNZXRhRGF0YShDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldFByb3BlcnR5KTsNCi0NCi0gICAgYm9vbGVhbiBjb250YWluc01ldGFEYXRhRm9yKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpOw0KLQ0KLSAgICB2b2lkIHJlZ2lzdGVyRmlsdGVyKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBzdG9yYWdlRmlsdGVyKTsNCi0NCi0gICAgdm9pZCBkZXJlZ2lzdGVyRmlsdGVyKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlckNsYXNzKTsNCi0NCi0gICAgdm9pZCBkZW55RmlsdGVyKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlckNsYXNzKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01ldGFEYXRhU3RvcmFnZUZpbHRlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01ldGFEYXRhU3RvcmFnZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTc5NDc3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhU3RvcmFnZUZpbHRlcg0KLXsNCi0gICAgdm9pZCBmaWx0ZXIoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1Byb3BlcnR5U3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1Byb3BlcnR5U3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWJlZDI2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Qcm9wZXJ0eVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlTdG9yYWdlDQotew0KLSAgICB2b2lkIHN0b3JlRmllbGQoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSwgRmllbGQgZmllbGQpOw0KLQ0KLSAgICB2b2lkIHN0b3JlTWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHksIE1ldGhvZCBtZXRob2QpOw0KLQ0KLSAgICBGaWVsZCBnZXRGaWVsZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5KTsNCi0NCi0gICAgTWV0aG9kIGdldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5KTsNCi0NCi0gICAgYm9vbGVhbiBjb250YWluc0ZpZWxkKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpOw0KLQ0KLSAgICBib29sZWFuIGNvbnRhaW5zTWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNjOGMxZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGEgc3RvcmFnZSB3aGljaCBpc24ndCB1c2VkIGludGVybmFsbHkuIGl0J3MgZm9yIGFkZC1vbnMgdG8gZWFzaWx5IHN0b3JlIHByb3BlcnRpZXMgb2YgaW50ZXJjZXB0b3JzLg0KLSAqIHdpdGhvdXQgYnJha2luZyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBpdCdzIHBvc3NpYmxlIHRvIHVzZSB0aGVzZSBwcm9wZXJ0aWVzIGluIGN1c3RvbSBhcnRpZmFjdHMuDQotICogcmVuZGVyaW5nIGludGVyY2VwdGlvbiBpcyBhbiBpbnRlcm5hbCBjb25jZXB0LiBzbyBwcm9wZXJ0aWVzLC4uLiBvZiBpdCB3b24ndCBnZXQgaW50byB0aGUgYXBpLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UNCi17DQotICAgIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKTsNCi0NCi0gICAgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpOw0KLQ0KLSAgICA8VD4gVCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcyk7DQotDQotICAgIHZvaWQgcmVtb3ZlUHJvcGVydHkoU3RyaW5nIGtleSk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVyUHJveHlTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MWE3NWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVyUHJveHlTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXJQcm94eVN0b3JhZ2UNCi17DQotICAgIHZvaWQgc2V0RW50cnkoU3RyaW5nIHJlbmRlcmVyS2V5LCBTdHJpbmcgY2xpZW50SWQsIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkpOw0KLQ0KLSAgICBib29sZWFuIGNvbnRhaW5zRW50cnkoU3RyaW5nIHJlbmRlcmVyS2V5LCBTdHJpbmcgY2xpZW50SWQpOw0KLQ0KLSAgICBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGdldEVudHJ5KFN0cmluZyByZW5kZXJlcktleSwgU3RyaW5nIGNsaWVudElkKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYjU0YjIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGVjb2RlQ2FsbGVkID0gZmFsc2U7DQotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVCZWdpbkNhbGxlZCA9IGZhbHNlOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGVuY29kZUVuZENhbGxlZCA9IGZhbHNlOw0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBjb252ZXJ0ZWRWYWx1ZSA9IG51bGw7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVjb2RlQ2FsbGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRlY29kZUNhbGxlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWNvZGVDYWxsZWQoYm9vbGVhbiBkZWNvZGVDYWxsZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGVjb2RlQ2FsbGVkID0gZGVjb2RlQ2FsbGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlQmVnaW5DYWxsZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW5jb2RlQmVnaW5DYWxsZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlQmVnaW5DYWxsZWQoYm9vbGVhbiBlbmNvZGVCZWdpbkNhbGxlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5lbmNvZGVCZWdpbkNhbGxlZCA9IGVuY29kZUJlZ2luQ2FsbGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlQ2hpbGRyZW5DYWxsZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlQ2hpbGRyZW5DYWxsZWQoYm9vbGVhbiBlbmNvZGVDaGlsZHJlbkNhbGxlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5lbmNvZGVDaGlsZHJlbkNhbGxlZCA9IGVuY29kZUNoaWxkcmVuQ2FsbGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlRW5kQ2FsbGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVuY29kZUVuZENhbGxlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVFbmRDYWxsZWQoYm9vbGVhbiBlbmNvZGVFbmRDYWxsZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZW5jb2RlRW5kQ2FsbGVkID0gZW5jb2RlRW5kQ2FsbGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkVmFsdWUoT2JqZWN0IGNvbnZlcnRlZFZhbHVlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbnZlcnRlZFZhbHVlID0gY29udmVydGVkVmFsdWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUwZDBlMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuQVBJOw0KLQ0KLS8qKg0KLSAqIG1hbmFnZXIgdG8gY3JlYXRlIGFuZCByZXNldCBzcGVjaWZpYyBzdG9yYWdlIGltcGxlbWVudGF0aW9ucw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgU3RvcmFnZU1hbmFnZXI8VD4NCi17DQotICAgIFQgY3JlYXRlKFN0cmluZyBrZXkpOw0KLSAgICB2b2lkIHJlc2V0KFN0cmluZyBrZXkpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXJIb2xkZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9TdG9yYWdlTWFuYWdlckhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzhhNGZjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9TdG9yYWdlTWFuYWdlckhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5BUEk7DQotDQotLyoqDQotICogaW50ZXJmYWNlIHRvIG1hbmFnZSBzdG9yYWdlLW1hbmFnZXIgaW5zdGFuY2VzDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgU3RvcmFnZU1hbmFnZXJIb2xkZXINCi17DQotICAgIHZvaWQgc2V0U3RvcmFnZU1hbmFnZXIoQ2xhc3MgdHlwZSwgU3RvcmFnZU1hbmFnZXIgc3RvcmFnZU1hbmFnZXIsIGJvb2xlYW4gb3ZlcnJpZGUpOw0KLSAgICBTdG9yYWdlTWFuYWdlciBnZXRTdG9yYWdlTWFuYWdlcihDbGFzcyB0eXBlKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1ZhbGlkYXRpb25SZXN1bHQuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WYWxpZGF0aW9uUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3OTMyN2MuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1ZhbGlkYXRpb25SZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkZhY2VzTWVzc2FnZUhvbGRlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gInJlZmFjdG9yIGl0IikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIFZhbGlkYXRpb25SZXN1bHQNCi17DQotICAgIHByaXZhdGUgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkRmFjZXNNZXNzYWdlSG9sZGVyKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmFjZXNNZXNzYWdlSG9sZGVyTGlzdC5hZGQoZmFjZXNNZXNzYWdlSG9sZGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTY2OWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOw0KLQ0KLS8qKg0KLSAqIHN1Z2dlc3RlZCBpbnRlcmZhY2UgZm9yIGEgdmlvbGF0aW9uLXNldmVyaXR5LWludGVycHJldGVyIHN0b3JhZ2UNCi0gKiB1c2VkIGJ5IGFkZC1vbnMgdG8gY2hhbmdlIHRoZSBpbnRlcnByZXRlciBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdA0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UNCi17DQotICAgIHZvaWQgc2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcihWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIpOw0KLQ0KLSAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExMDI5Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5GYWNlc0luZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGU5N2YyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRmFjZXNNZXNzYWdlU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEZhY2VzTWVzc2FnZVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0TWV0YURhdGFTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0TWV0YURhdGFTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWJmZTk3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NZXRhRGF0YVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdE1ldGFEYXRhU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWV0YURhdGFTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoTWV0YURhdGFTdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0TWV0YURhdGFTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2Y4NjIzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0UHJvcGVydHlTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlByb3BlcnR5U3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoUHJvcGVydHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0UHJvcGVydHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5Njg0MWQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5SZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiB1c2UgYSBwdWJsaWMgY2xhc3MgdG8gYWxsb3cgb3B0aW9uYWwgZGVyZWdpc3RyYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGU5ZGU5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5SZW5kZXJlclByb3h5U3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChSZW5kZXJlclByb3h5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk0OTZkNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FmYmY2NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBFbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL051bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNzUwZWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL051bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBOdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL1NraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI0Y2FhNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcg0KLXsNCi0gICAgYm9vbGVhbiBza2lwVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YUVudHJ5IGVudHJ5KTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL2V4Y2VwdGlvbi9SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL2V4Y2VwdGlvbi9SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmIyYmIwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9leGNlcHRpb24vUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uZXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiB0byBoYW5kbGUgc3BlY2lhbCBjYXNlcyBpbiBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24gZXh0ZW5kcyBWYWxpZGF0b3JFeGNlcHRpb24NCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NjQ2MzMxNzM2NDI4NDk1ODg0TDsNCi0NCi0gICAgcHVibGljIFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKGZhY2VzTWVzc2FnZSwgdGhyb3dhYmxlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYyNTEwYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjZXNNZXNzYWdlRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5IGltcGxlbWVudHMgRmFjZXNNZXNzYWdlRmFjdG9yeQ0KLXsNCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBjb252ZXJ0KEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIGlmKGlzTGFiZWxlZEZhY2VzTWVzc2FnZShmYWNlc01lc3NhZ2UpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2U7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY3JlYXRlKGZhY2VzTWVzc2FnZS5nZXRTZXZlcml0eSgpLCBmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLCBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2UgY3JlYXRlKEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVmlvbGF0aW9uTWVzc2FnZShzZXZlcml0eSwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xhYmVsZWRGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgLy9kb24ndCB1c2UgdGhlIGludGVyZmFjZSBoZXJlDQotICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlIGluc3RhbmNlb2YgVmlvbGF0aW9uTWVzc2FnZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9GYWNlc01lc3NhZ2VIb2xkZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0ZhY2VzTWVzc2FnZUhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzFjMzY3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0ZhY2VzTWVzc2FnZUhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBGYWNlc01lc3NhZ2VIb2xkZXINCi17DQotICAgIHByaXZhdGUgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50SWQ7DQotDQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2VIb2xkZXIoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5mYWNlc01lc3NhZ2UgPSBmYWNlc01lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZUhvbGRlcihGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmFjZXNNZXNzYWdlID0gZmFjZXNNZXNzYWdlOw0KLSAgICAgICAgc2V0Q2xpZW50SWQoY2xpZW50SWQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2UgZ2V0RmFjZXNNZXNzYWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudElkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNsaWVudElkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudElkKFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgaWYoISIqIi5lcXVhbHMoY2xpZW50SWQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9MYWJlbGVkTWVzc2FnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvTGFiZWxlZE1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RmN2FlNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9MYWJlbGVkTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZG9uJ3QgcmVtb3ZlICpUZXh0IC0gaXQgd291bGQgbGVhZCB0byBhbiBvdmVybGFwIHdpdGggdHJpbmlkYWQNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIExhYmVsZWRNZXNzYWdlDQotew0KLSAgICBTdHJpbmcgZ2V0TGFiZWxUZXh0KCk7DQotICAgIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyBsYWJlbCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL1Zpb2xhdGlvbk1lc3NhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL1Zpb2xhdGlvbk1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk0NGM3Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9WaW9sYXRpb25NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIFZpb2xhdGlvbk1lc3NhZ2UgZXh0ZW5kcyBGYWNlc01lc3NhZ2UgaW1wbGVtZW50cyBMYWJlbGVkTWVzc2FnZQ0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjkwMzk1ODk0Mjk4NzcxMTIzMUw7DQotICAgIHByaXZhdGUgU3RyaW5nIGxhYmVsOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gc3VtbWFyeUxhYmVsUmVwbGFjZWQgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGRldGFpbExhYmVsUmVwbGFjZWQgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIFZpb2xhdGlvbk1lc3NhZ2UoU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHRoaXMoU0VWRVJJVFlfRVJST1IsIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZpb2xhdGlvbk1lc3NhZ2UoU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICBzZXRTZXZlcml0eShzZXZlcml0eSk7DQotICAgICAgICBzZXRTdW1tYXJ5KHN1bW1hcnkpOw0KLSAgICAgICAgc2V0RGV0YWlsKGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN1bW1hcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsYWJlbCAhPSBudWxsICYmICF0aGlzLnN1bW1hcnlMYWJlbFJlcGxhY2VkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHNldFN1bW1hcnkoZ2V0TGFiZWxlZE1lc3NzYWdlKHN1cGVyLmdldFN1bW1hcnkoKSwgZ2V0TGFiZWxUZXh0KCkpKTsNCi0gICAgICAgICAgICB0aGlzLnN1bW1hcnlMYWJlbFJlcGxhY2VkID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRTdW1tYXJ5KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGV0YWlsKCkNCi0gICAgew0KLSAgICAgICAgaWYobGFiZWwgIT0gbnVsbCAmJiAhdGhpcy5kZXRhaWxMYWJlbFJlcGxhY2VkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHNldERldGFpbChnZXRMYWJlbGVkTWVzc3NhZ2Uoc3VwZXIuZ2V0RGV0YWlsKCksIGdldExhYmVsVGV4dCgpKSk7DQotICAgICAgICAgICAgdGhpcy5kZXRhaWxMYWJlbFJlcGxhY2VkID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzdXBlci5nZXREZXRhaWwoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRMYWJlbGVkTWVzc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5jb250YWlucygieyIgKyBpICsgIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoInsiICsgaSArICJ9IiwgbGFiZWwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBtZXNzYWdlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdW1tYXJ5KFN0cmluZyBzKQ0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRTdW1tYXJ5KHMpOw0KLSAgICAgICAgdGhpcy5zdW1tYXJ5TGFiZWxSZXBsYWNlZCA9IGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXRhaWwoU3RyaW5nIHMpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldERldGFpbChzKTsNCi0gICAgICAgIHRoaXMuZGV0YWlsTGFiZWxSZXBsYWNlZCA9IGZhbHNlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjM5NmQ0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotDQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsNCi0NCi0vKioNCi0gKiBNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggdXNlcyBwcm9wZXJ0eSBmaWxlcy4NCi0gKiBTdWJjbGFzc2VzIGp1c3QgaGF2ZSB0byBwcm92aWRlIHRoZSBwYWNrYWdlIHRvIGxvb2sgYXQuDQotICogQW4gaW1wbGVtZW50YXRpb24gY2FuIGFsc28gcHJvdmlkZSBhIGN1c3RvbSBuYW1lIHdoaWNoIGlzIGUuZy4gY29uZmlndXJlZCB2aWEgd2ViLnhtbC4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGltcGxlbWVudHMgTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX1JFU09VUkNFX01BUktFUiA9ICI/Pz8iOw0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfREVGQVVMVF9DT05WRU5USU9OOw0KLSAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBkZWZhdWx0QnVuZGxlID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZUJ1bmRsZUJhc2VOYW1lOw0KLSAgICAvL3dpdGgganNmIDEuMSBvbmx5IGF2YWlsYWJsZSBpZiB0aGVyZSBpcyBhIGN1c3RvbSBiZWFuDQotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VCdW5kbGVWYXJOYW1lOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICBpZiAoa2V5ID09IG51bGwgfHwga2V5LmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihrZXkuY29udGFpbnMoIiAiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihrZXkuZW5kc1dpdGgoIl9kZXRhaWwiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcoMCwga2V5Lmxlbmd0aCgpIC0gNyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBrZXk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgY3VzdG9tTWVzc2FnZSA9IG51bGw7DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gdHJ5VG9GaW5kQ3VzdG9tTWVzc2FnZShrZXksIGxvY2FsZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nDQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY3VzdG9tTWVzc2FnZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIHRyeSB0byB1c2UgdGhlIGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZQ0KLSAgICAgICAgICovDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gdHJ5VG9Vc2VNZXNzYWdlQnVuZGxlQ29udmVudGlvbihrZXksIGxvY2FsZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nDQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY3VzdG9tTWVzc2FnZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIG5vIG1lc3NhZ2UgYnVuZGxlIG9yIG1lc3NhZ2UgZm91bmQgKHdpdGggdGhlIGNvbnZlbnRpb24pPw0KLSAgICAgICAgICovDQotDQotICAgICAgICAvL3RyeSB0byBsb2FkIGN1c3RvbSBtZXNzYWdlcw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHRyeVRvRmluZEN1c3RvbU1lc3NhZ2VJbkN1c3RvbVJlc291cmNlQnVuZGxlKGtleSwgbG9jYWxlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGRldGVybWluZU1lc3NhZ2Uoa2V5LCBsb2NhbGUsIGN1c3RvbU1lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvRmluZEN1c3RvbU1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7DQotICAgICAgICBTdHJpbmcgY3VzdG9tTWVzc2FnZSA9IG51bGw7DQotDQotICAgICAgICAvL29ubHkgaW4gY2FzZSBvZiBhIFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciB3aGljaCBpcyBjb25maWd1cmVkIGFzIGJlYW4NCi0gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lLCBsb2NhbGUpOw0KLSAgICAgICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigibWVzc2FnZSBidW5kbGUgIiArIHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lICsgIiBub3QgZm91bmQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vb25seSBpbiBjYXNlIG9mIGEgVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIHdoaWNoIGlzIGNvbmZpZ3VyZWQgYXMgYmVhbg0KLSAgICAgICAgaWYgKHRoaXMubWVzc2FnZUJ1bmRsZVZhck5hbWUgIT0gbnVsbCAmJiBjdXN0b21NZXNzYWdlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSAoUmVzb3VyY2VCdW5kbGUpIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbihtZXNzYWdlQnVuZGxlVmFyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJtZXNzYWdlIGJ1bmRsZSB2YXIgbmFtZSAiICsgdGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSArICIgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb1VzZU1lc3NhZ2VCdW5kbGVDb252ZW50aW9uKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIGlmICgoZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID09IG51bGwgfHwgIWRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICAgICAgJiYgaXNEZWZhdWx0TWVzc2FnZUJ1bmRsZUNvbnZlbnRpb25BY3RpdmUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZGVmYXVsdEJ1bmRsZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9CVU5ETEVfTkFNRSksIGxvY2FsZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgICAgICAgICAgICAgICAgIGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbiA9ICJ0cnVlIjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoZGVmYXVsdEJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHJ5VG9GaW5kQ3VzdG9tTWVzc2FnZUluQ3VzdG9tUmVzb3VyY2VCdW5kbGUoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSB0cnlUb0xvYWRDdXN0b21SZXNvdXJjZUJ1bmRsZShsb2NhbGUpOw0KLQ0KLSAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm5vIGN1c3RvbSBtZXNzYWdlIGZvciAiICsga2V5ICsgIiB3aXRoaW4gIiArIGdldEN1c3RvbUJhc2VOYW1lKCksIGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSB0cnlUb0xvYWRDdXN0b21SZXNvdXJjZUJ1bmRsZShMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VzdG9tQmFzZU5hbWUgPSBnZXRDdXN0b21CYXNlTmFtZSgpOw0KLQ0KLSAgICAgICAgaWYoY3VzdG9tQmFzZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGN1c3RvbUJhc2VOYW1lLCBsb2NhbGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGV0ZXJtaW5lTWVzc2FnZShTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlLCBTdHJpbmcgY3VzdG9tTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgLy91c2UgY3VzdG9tIG5hbWUgKGlmIHBvc3NpYmxlKSBvdGhlcndpc2U6IGZhbGxiYWNrIHRvIGRlZmF1bHQgbWVzc2FnZSAoaWYgcG9zc2libGUpDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKGN1c3RvbU1lc3NhZ2UgIT0gbnVsbCkgPyBjdXN0b21NZXNzYWdlDQotICAgICAgICAgICAgICAgICAgICA6IChnZXRCYXNlTmFtZSgpICE9IG51bGwpID8gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEJhc2VOYW1lKCksIGxvY2FsZSkuZ2V0U3RyaW5nKGtleSkgOiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBNSVNTSU5HX1JFU09VUkNFX01BUktFUiArIGtleSArIE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGVmYXVsdE1lc3NhZ2VCdW5kbGVDb252ZW50aW9uQWN0aXZlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRCYXNlTmFtZSgpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUJ1bmRsZUJhc2VOYW1lKFN0cmluZyBtZXNzYWdlQnVuZGxlQmFzZU5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lID0gbWVzc2FnZUJ1bmRsZUJhc2VOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VCdW5kbGVWYXJOYW1lKFN0cmluZyBtZXNzYWdlQnVuZGxlVmFyTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSA9IG1lc3NhZ2VCdW5kbGVWYXJOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODE4MDM3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyBhIE1lc3NhZ2VSZXNvbHZlciBmb3IgYSBnaXZlbiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJhZGQgZ2VuZXJpYyBqYXZhIGFwaSAoZGUtL3JlZ2lzdGVyIG1hcHBpbmcpIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotICAgICAgICBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXNzYWdlUmVzb2x2ZXI+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nOw0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBuYW1lTWFwcGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PigpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlUmVzb2x2ZXIgY3JlYXRlKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWUgPSBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSk7DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHN0cmF0ZWd5TmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChNZXNzYWdlUmVzb2x2ZXIpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLmdldChzdHJhdGVneU5hbWUpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICBTdHJpbmcgcmVzb2x2ZXJOYW1lOw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vYnVpbGQgY29udmVudGlvbiAoVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKQ0KLSAgICAgICAgICAgIHJlc29sdmVyTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIC8vbmFtZSB3YXNuJ3QgbWFwcGVkDQotICAgICAgICAgICAgaWYgKHJlc29sdmVyTmFtZSA9PSBudWxsIHx8IFByb3h5VXRpbHMuZ2V0Q2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpKS5lcXVhbHMocmVzb2x2ZXJOYW1lKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtZXNzYWdlUmVzb2x2ZXIgPSAoTWVzc2FnZVJlc29sdmVyKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUocmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWVzc2FnZVJlc29sdmVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKHN0cmF0ZWd5TmFtZSwgcmVzb2x2ZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShyZXNvbHZlck5hbWUgKyAiIHVzZWQgZm9yICIgKyBzdHJhdGVneU5hbWUpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlUmVzb2x2ZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYWRkTWFwcGluZyhzdHJhdGVneU5hbWUsIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotDQotICAgICAgICAvL3NldHVwIGludGVybmFsIHN0YXRpYyBtYXBwaW5ncw0KLSAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgOg0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cE1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cE1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZyxTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWFwcGluZy5nZXRTb3VyY2UoKSwgbWFwcGluZy5nZXRUYXJnZXQoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyBtZXNzYWdlUmVzb2x2ZXJOYW1lKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImFkZGluZyBzdGF0aWMgdmFsaWRhdGlvbiBzdHJhdGVneSB0byBtZXNzYWdlIHJlc29sdmVyIG1hcHBpbmc6ICINCi0gICAgICAgICAgICAgICAgKyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgIiAtPiAiICsgbWVzc2FnZVJlc29sdmVyTmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmcucHV0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIG1lc3NhZ2VSZXNvbHZlck5hbWUpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gZ2V0TmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmFtZU1hcHBlckxpc3Q7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWE5NzFmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgTWVzc2FnZVJlc29sdmVyIHdoaWNoIHVzZXMgdGhlIGRlZmF1bHQgY29udmVudGlvbiBmb3IgdGhlIG1lc3NhZ2UgYnVuZGxlLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBtZXNzYWdlIGJ1bmRsZSB2aWEgd2ViLnhtbA0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0JVTkRMRSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVTU0FHRV9CVU5ETEU7DQotDQotICAgIC8vbm90IHVzZWQgYXQgdGhlIG1vbWVudCAtIGp1c3QgZm9yIGEgY29udmVudGlvbg0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1vZHVsZU1lc3NhZ2VCdW5kbGVOYW1lKGdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21CYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBDVVNUT01fQlVORExFOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL01lc3NhZ2VSZXNvbHZlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNGY4NjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgZm9yIE1lc3NhZ2VSZXNvbHZlcnMgaW5kZXBlbmRlbnQgb2YgdGhlIG1lc3NhZ2Ugc291cmNlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0YzRkNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg3NzNmYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1lc3NhZ2VSZXNvbHZlcnMuDQotICogKGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkY2QwOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgVmFsaWRhdGlvblN0cmF0ZWd5IHRvIE1lc3NhZ2VSZXNvbHZlci4NCi0gKiAoY29uZmlndXJlZCB2aWEgaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbikNCi0gKiBUaGUgYmVhbiBwcm92aWRlcyB0aGUgZGVmYXVsdCBuYW1lIChjb252ZW50aW9uKS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gZnVsbCBxdWFsaWZpZWQgbmFtZS4gKD0gY3VzdG9taXphYmxlIGNvbnZlbnRpb24pDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTVNHX1JFU09MVkVSX05BTUVfTUFQUEVSKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ODE2MTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIHByb3ZpZGUgYSBOYW1lTWFwcGVyIHBlciB2YWxpZGF0aW9uIG1vZHVsZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMzEwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBzdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhNDc3Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFwcyBFeHRWYWwgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gRXh0VmFsIE1lc3NhZ2VSZXNvbHZlcnMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MgPSBQcm94eVV0aWxzDQotICAgICAgICAgICAgICAgIC5nZXRVbnByb3hpZWRDbGFzcyh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKTsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKHN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWQ1OTg0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciB0byBwbGFjZSBWYWxpZGF0aW9uU3RyYXRlZ2llcyBhbmQgTWVzc2FnZVJlc29sdmVycyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcig0MDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VzdG9tUG9zdGZpeCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYKTsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoc3RyYXRlZ3lDbGFzc05hbWUsIGN1c3RvbVBvc3RmaXgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwOTY0ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljQXJyYXlUeXBlOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5XaWxkY2FyZFR5cGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBleHRyYWN0QnlJZChhbm5vdGF0aW9uLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZXh0cmFjdEJ5SWQoYW5ub3RhdGlvbiwga2V5LCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgPFQ+IExpc3Q8VD4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGV4dHJhY3RCeUlkKGFubm90YXRpb24sIGtleSwgdmFsdWVUeXBlLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgPFQ+IFQgZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxUPiByZXN1bHRzID0gZXh0cmFjdEJ5SWQoYW5ub3RhdGlvbiwga2V5LCB2YWx1ZVR5cGUsIHZhbHVlSWQpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0cy5pdGVyYXRvcigpLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0cy5pdGVyYXRvcigpLm5leHQoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyA8VD4gTGlzdDxUPiBleHRyYWN0QnlJZChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxPYmplY3Q+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KLQ0KLSAgICAgICAgZm9yKE9iamVjdCBlbnRyeSA6IGV4dHJhY3RCeUlkKGFubm90YXRpb24sIGtleSwgdmFsdWVJZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodmFsdWVUeXBlLmlzQXNzaWduYWJsZUZyb20oZW50cnkuZ2V0Q2xhc3MoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKExpc3Q8VD4pcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZXh0cmFjdEJ5SWQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzcyB2YWx1ZUlkKQ0KLSAgICB7DQotICAgICAgICBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+IGZ1bGxSZXN1bHQgPSBleHRyYWN0QnlJZChhbm5vdGF0aW9uLCB2YWx1ZUlkKTsNCi0NCi0gICAgICAgIGlmKGZ1bGxSZXN1bHQuY29udGFpbnNLZXkoa2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZnVsbFJlc3VsdC5nZXQoa2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIHdlYi54bWwgcGFyYW1ldGVyIGZvciBwZXJmb3JtYW5jZSB0dW5pbmcgdG8gZGVhY3RpdmF0ZSB0aGUgc2NhbiIpDQotICAgIHB1YmxpYyBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+IGV4dHJhY3RCeUlkKEFubm90YXRpb24gYW5ub3RhdGlvbiwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4oKTsNCi0NCi0gICAgICAgIGZvcihNZXRob2QgY3VycmVudEFubm90YXRpb25BdHRyaWJ1dGUgOiBhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0RGVjbGFyZWRNZXRob2RzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZighaXNWYWxpZGF0aW9uUGFyYW1ldGVyKGN1cnJlbnRBbm5vdGF0aW9uQXR0cmlidXRlLmdldEdlbmVyaWNSZXR1cm5UeXBlKCkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBPYmplY3QgcGFyYW1ldGVyVmFsdWUgPSBjdXJyZW50QW5ub3RhdGlvbkF0dHJpYnV0ZS5pbnZva2UoYW5ub3RhdGlvbik7DQotDQotICAgICAgICAgICAgICAgIGlmKHBhcmFtZXRlclZhbHVlIGluc3RhbmNlb2YgQ2xhc3NbXSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRQYXJhbWV0ZXJWYWx1ZSA6IChDbGFzc1tdKXBhcmFtZXRlclZhbHVlKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8va2VlcCBjaGVjayBzbyB0aGF0IGZvbGxvd2luZyBpcyB0cnVlOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBmb3VuZCB3aGljaCB0ZWxscyB0aGF0IGl0IGlzbid0IGEgYmxvY2tpbmcgZXJyb3IsIGxldCBpdCBwYXNzDQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1BhcmFtZXRlclZhbHVlKGFubm90YXRpb24sIGN1cnJlbnRQYXJhbWV0ZXJWYWx1ZSwgcmVzdWx0LCB2YWx1ZUlkKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKHBhcmFtZXRlclZhbHVlIGluc3RhbmNlb2YgQ2xhc3MpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8va2VlcCBjaGVjayBzbyB0aGF0IGZvbGxvd2luZyBpcyB0cnVlOg0KLSAgICAgICAgICAgICAgICAgICAgLy9pZiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIGZvdW5kIHdoaWNoIHRlbGxzIHRoYXQgaXQgaXNuJ3QgYSBibG9ja2luZyBlcnJvciwgbGV0IGl0IHBhc3MNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQYXJhbWV0ZXJWYWx1ZShhbm5vdGF0aW9uLCAoQ2xhc3MpcGFyYW1ldGVyVmFsdWUsIHJlc3VsdCwgdmFsdWVJZCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBkb24ndCB1c2UgdGhlIEludHJvc3BlY3RvciBpbiB0aGlzIGNhc2UNCi0gICAgICogaWYgeW91IGhhdmUgYSBiZXR0ZXIgc29sdXRpb24gd2hpY2ggc3VwcG9ydHMgYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXIgc3R5bGVzIChzZWUgZXh0dmFsIHdpa2kpLA0KLSAgICAgKiB5b3UgY2FuIGltcGwuIGl0IGFuZCB1c2UgaXQgKGV4Y2hhbmdlIHRoZSBpbXBscy4gdmlhIHRoZSBFeHRWYWxDb250ZXh0KS4NCi0gICAgICogZnVydGhlcm1vcmUsIHlvdSBjYW4gcHJvdmlkZSB0aGUgZml4IGZvciB0aGUgY29tbXVuaXR5DQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1BhcmFtZXRlclZhbHVlKA0KLSAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiwgQ2xhc3MgcGFyYW1DbGFzcywgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiByZXN1bHQsIENsYXNzIHZhbHVlSWQpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGtleSA9IG51bGw7DQotICAgICAgICBMaXN0PE9iamVjdD4gcGFyYW1ldGVyVmFsdWVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7DQotDQotICAgICAgICBpZihWYWxpZGF0aW9uUGFyYW1ldGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocGFyYW1DbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgTGlzdDxGaWVsZD4gcHJvY2Vzc2VkRmllbGRzID0gbmV3IEFycmF5TGlzdDxGaWVsZD4oKTsNCi0gICAgICAgICAgICBMaXN0PE1ldGhvZD4gcHJvY2Vzc2VkTWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kPigpOw0KLQ0KLSAgICAgICAgICAgIENsYXNzIGN1cnJlbnRQYXJhbUNsYXNzID0gcGFyYW1DbGFzczsNCi0gICAgICAgICAgICB3aGlsZSAoY3VycmVudFBhcmFtQ2xhc3MgIT0gbnVsbCAmJiAhT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY3VycmVudFBhcmFtQ2xhc3MuZ2V0TmFtZSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICAgICAqIHByb2Nlc3MgY2xhc3MNCi0gICAgICAgICAgICAgICAgICovDQotICAgICAgICAgICAgICAgIC8vc3VwcG9ydCBwdXJlIGludGVyZmFjZSBhcHByb2FjaCBlLmcuIFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MNCi0gICAgICAgICAgICAgICAgZm9yKEZpZWxkIGN1cnJlbnRGaWVsZCA6IGN1cnJlbnRQYXJhbUNsYXNzLmdldERlY2xhcmVkRmllbGRzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFwcm9jZXNzZWRGaWVsZHMuY29udGFpbnMoY3VycmVudEZpZWxkKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBwcm9jZXNzRm91bmRGaWVsZChhbm5vdGF0aW9uLCBjdXJyZW50RmllbGQsIHBhcmFtZXRlclZhbHVlcywga2V5LCB2YWx1ZUlkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRGaWVsZHMuYWRkKGN1cnJlbnRGaWVsZCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgLy9pbnNwZWN0IHRoZSBvdGhlciBtZXRob2RzIG9mIHRoZSBpbXBsZW1lbnRpbmcgY2xhc3MNCi0gICAgICAgICAgICAgICAgZm9yKE1ldGhvZCBjdXJyZW50TWV0aG9kIDogY3VycmVudFBhcmFtQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFwcm9jZXNzZWRNZXRob2RzLmNvbnRhaW5zKGN1cnJlbnRNZXRob2QpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHByb2Nlc3NGb3VuZE1ldGhvZChjdXJyZW50UGFyYW1DbGFzcywgY3VycmVudE1ldGhvZCwgcGFyYW1ldGVyVmFsdWVzLCBrZXksIHZhbHVlSWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZE1ldGhvZHMuYWRkKGN1cnJlbnRNZXRob2QpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICAgICAqIHByb2Nlc3MgaW50ZXJmYWNlcw0KLSAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRJbnRlcmZhY2UgOiBjdXJyZW50UGFyYW1DbGFzcy5nZXRJbnRlcmZhY2VzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFWYWxpZGF0aW9uUGFyYW1ldGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY3VycmVudEludGVyZmFjZSkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAvL3N1cHBvcnQgaW50ZXJmYWNlICsgaW1wbC4gYXBwcm9hY2ggZS5nLiBNeVBhcmFtSW1wbC5jbGFzcw0KLSAgICAgICAgICAgICAgICAgICAgLy8oTXlQYXJhbUltcGwgaW1wbGVtZW50cyBNeVBhcmFtDQotICAgICAgICAgICAgICAgICAgICAvL015UGFyYW0gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotICAgICAgICAgICAgICAgICAgICAvL21ldGhvZHMgaW4gdGhlIGludGVyZmFjZSBoYXZlIHRvIGJlIG1hcmtlZCB3aXRoIEBQYXJhbWV0ZXJWYWx1ZSBhbmQgQFBhcmFtZXRlcktleQ0KLSAgICAgICAgICAgICAgICAgICAgZm9yKE1ldGhvZCBjdXJyZW50TWV0aG9kIDogY3VycmVudEludGVyZmFjZS5nZXREZWNsYXJlZE1ldGhvZHMoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZighcHJvY2Vzc2VkTWV0aG9kcy5jb250YWlucyhjdXJyZW50TWV0aG9kKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHByb2Nlc3NGb3VuZE1ldGhvZChjdXJyZW50UGFyYW1DbGFzcywgY3VycmVudE1ldGhvZCwgcGFyYW1ldGVyVmFsdWVzLCBrZXksIHZhbHVlSWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRNZXRob2RzLmFkZChjdXJyZW50TWV0aG9kKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBmb3IoRmllbGQgY3VycmVudEZpZWxkIDogY3VycmVudEludGVyZmFjZS5nZXREZWNsYXJlZEZpZWxkcygpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwcm9jZXNzZWRGaWVsZHMuY29udGFpbnMoY3VycmVudEZpZWxkKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHByb2Nlc3NGb3VuZEZpZWxkKGFubm90YXRpb24sIGN1cnJlbnRGaWVsZCwgcGFyYW1ldGVyVmFsdWVzLCBrZXksIHZhbHVlSWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRGaWVsZHMuYWRkKGN1cnJlbnRGaWVsZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGN1cnJlbnRQYXJhbUNsYXNzID0gY3VycmVudFBhcmFtQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGtleSA9IGNyZWF0ZURlZmF1bHRLZXkoa2V5LCBwYXJhbUNsYXNzKTsNCi0NCi0gICAgICAgIGlmKHBhcmFtZXRlclZhbHVlcy5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9AUGFyYW1ldGVyVmFsdWUgaXMgb3B0aW9uYWwgYXMgd2VsbA0KLSAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlcy5hZGQoa2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHJlc3VsdC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5nZXQoa2V5KS5hZGRBbGwocGFyYW1ldGVyVmFsdWVzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQucHV0KGtleSwgcGFyYW1ldGVyVmFsdWVzKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBjcmVhdGVEZWZhdWx0S2V5KE9iamVjdCBrZXksIENsYXNzIGN1cnJlbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYoa2V5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9jaGVjayBmb3Igc3VwZXItaW50ZXJmYWNlIChleGNsdWRlIFZhbGlkYXRpb25QYXJhbWV0ZXIgaXRzZWxmKQ0KLSAgICAgICAgICAgIGZvcihDbGFzcyBpbnRlcmZhY2VDbGFzcyA6IGN1cnJlbnRDbGFzcy5nZXRJbnRlcmZhY2VzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihWYWxpZGF0aW9uUGFyYW1ldGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaW50ZXJmYWNlQ2xhc3MpICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgKCFpbnRlcmZhY2VDbGFzcy5nZXROYW1lKCkuZXF1YWxzKFZhbGlkYXRpb25QYXJhbWV0ZXIuY2xhc3MuZ2V0TmFtZSgpKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGtleSA9IGludGVyZmFjZUNsYXNzOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZihrZXkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBrZXkgPSBjdXJyZW50Q2xhc3M7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4ga2V5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IHByb2Nlc3NGb3VuZEZpZWxkKA0KLSAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZSwgRmllbGQgY3VycmVudEZpZWxkLCBMaXN0PE9iamVjdD4gcGFyYW1WYWx1ZXMsIE9iamVjdCBrZXksIENsYXNzIHZhbHVlSWQpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBuZXdLZXkgPSBudWxsOw0KLSAgICAgICAgaWYoa2V5ID09IG51bGwgJiYgY3VycmVudEZpZWxkLmlzQW5ub3RhdGlvblByZXNlbnQoUGFyYW1ldGVyS2V5LmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG5ld0tleSA9IGN1cnJlbnRGaWVsZC5nZXQoaW5zdGFuY2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICAvL25vICJlbHNlIGlmIiB0byBhbGxvdyBib3RoIGF0IG9uZSBmaWVsZA0KLSAgICAgICAgaWYoY3VycmVudEZpZWxkLmlzQW5ub3RhdGlvblByZXNlbnQoUGFyYW1ldGVyVmFsdWUuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbHVlSWQgPT0gbnVsbCB8fCB2YWx1ZUlkLmVxdWFscyhjdXJyZW50RmllbGQuZ2V0QW5ub3RhdGlvbihQYXJhbWV0ZXJWYWx1ZS5jbGFzcykuaWQoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50RmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtVmFsdWVzLmFkZChjdXJyZW50RmllbGQuZ2V0KGluc3RhbmNlKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXdLZXkgIT0gbnVsbCA/IG5ld0tleSA6IGtleTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBwcm9jZXNzRm91bmRNZXRob2QoDQotICAgICAgICAgICAgQ2xhc3MgcGFyYW1DbGFzcywgTWV0aG9kIGN1cnJlbnRNZXRob2QsIExpc3Q8T2JqZWN0PiBwYXJhbWV0ZXJWYWx1ZXMsIE9iamVjdCBrZXksIENsYXNzIHZhbHVlSWQpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBuZXdLZXkgPSBudWxsOw0KLSAgICAgICAgaWYoa2V5ID09IG51bGwgJiYgY3VycmVudE1ldGhvZC5pc0Fubm90YXRpb25QcmVzZW50KFBhcmFtZXRlcktleS5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZighKE1vZGlmaWVyLmlzQWJzdHJhY3QocGFyYW1DbGFzcy5nZXRNb2RpZmllcnMoKSkgfHwgTW9kaWZpZXIuaXNJbnRlcmZhY2UocGFyYW1DbGFzcy5nZXRNb2RpZmllcnMoKSkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBuZXdLZXkgPSBjdXJyZW50TWV0aG9kLmludm9rZShwYXJhbUNsYXNzLm5ld0luc3RhbmNlKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIC8vbm8gImVsc2UgaWYiIHRvIGFsbG93IGJvdGggYXQgb25lIGZpZWxkDQotICAgICAgICBpZihjdXJyZW50TWV0aG9kLmlzQW5ub3RhdGlvblByZXNlbnQoUGFyYW1ldGVyVmFsdWUuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbHVlSWQgPT0gbnVsbCB8fCB2YWx1ZUlkLmVxdWFscyhjdXJyZW50TWV0aG9kLmdldEFubm90YXRpb24oUGFyYW1ldGVyVmFsdWUuY2xhc3MpLmlkKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudE1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOw0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWVzLmFkZChjdXJyZW50TWV0aG9kLmludm9rZShwYXJhbUNsYXNzLm5ld0luc3RhbmNlKCkpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgaXQncyBhIG5vbmUtc3RhdGljIGlubmVyIGNsYXNzIC0+IHJldHVybiB0aGlzIGNsYXNzDQotICAgICAgICAgICAgICAgICAgICBpZihwYXJhbUNsYXNzLmdldEVuY2xvc2luZ0NsYXNzKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJWYWx1ZXMuYWRkKHBhcmFtQ2xhc3MpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXdLZXkgIT0gbnVsbCA/IG5ld0tleSA6IGtleTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZGF0aW9uUGFyYW1ldGVyKFR5cGUgZ2VuZXJpY1JldHVyblR5cGUpDQotICAgIHsNCi0gICAgICAgIGlmKGdlbmVyaWNSZXR1cm5UeXBlIGluc3RhbmNlb2YgR2VuZXJpY0FycmF5VHlwZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZigoKEdlbmVyaWNBcnJheVR5cGUpZ2VuZXJpY1JldHVyblR5cGUpLmdldEdlbmVyaWNDb21wb25lbnRUeXBlKCkgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBhbmFseXplUGFyYW1ldGVyaXplZFR5cGUoDQotICAgICAgICAgICAgICAgICAgICAgICAgKFBhcmFtZXRlcml6ZWRUeXBlKSgoR2VuZXJpY0FycmF5VHlwZSlnZW5lcmljUmV0dXJuVHlwZSkuZ2V0R2VuZXJpY0NvbXBvbmVudFR5cGUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihnZW5lcmljUmV0dXJuVHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhbmFseXplUGFyYW1ldGVyaXplZFR5cGUoDQotICAgICAgICAgICAgICAgICAgICAoUGFyYW1ldGVyaXplZFR5cGUpZ2VuZXJpY1JldHVyblR5cGUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBhbmFseXplUGFyYW1ldGVyaXplZFR5cGUoUGFyYW1ldGVyaXplZFR5cGUgcGFyYW1ldGVyaXplZFR5cGUpDQotICAgIHsNCi0gICAgICAgIGZvcihUeXBlIHR5cGUgOiBwYXJhbWV0ZXJpemVkVHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodHlwZSBpbnN0YW5jZW9mIFdpbGRjYXJkVHlwZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZvcihUeXBlIHVwcGVyQm91bmRzIDogKChXaWxkY2FyZFR5cGUpdHlwZSkuZ2V0VXBwZXJCb3VuZHMoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYodXBwZXJCb3VuZHMgaW5zdGFuY2VvZiBDbGFzcyAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZvciBhdHRyaWJ1dGVzIGxpa2U6IENsYXNzPD8gZXh0ZW5kcyBJbmhlcml0ZWRGcm9tVmFsaWRhdGlvblBhcmFtZXRlcj4gdmFsdWUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblBhcmFtZXRlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKChDbGFzcyl1cHBlckJvdW5kcykpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OTUyZDQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5IGltcGxlbWVudHMgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkNCi17DQotICAgIHByaXZhdGUgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBjcmVhdGUoKQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUik7DQotICAgICAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckNsYXNzTmFtZXMNCi0gICAgICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUikpOw0KLSAgICAgICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JDbGFzc05hbWVzKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciA9IChWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSh2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjcmVhdGVkIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q1YzhmZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBtYXBzIGludGVybmFsIHBhcmFtZXRlcnMgdG8gb3B0aW9uYWxseSBhdmFpbGFibGUgY3VzdG9tIHBhcmFtZXRlcnMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeSBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8Q2xhc3MsIENsYXNzPg0KLXsNCi0gICAgcHJpdmF0ZSBNYXA8Q2xhc3MsIENsYXNzPiBwYXJhbWV0ZXJNYXBwaW5nID0gbmV3IEhhc2hNYXA8Q2xhc3MsIENsYXNzPigpOw0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgY3JlYXRlKENsYXNzIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHRoaXMucGFyYW1ldGVyTWFwcGluZy5jb250YWluc0tleShzb3VyY2UpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmFtZXRlck1hcHBpbmcuZ2V0KHNvdXJjZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBDbGFzcyByZXN1bHQ7DQotDQotICAgICAgICAvL2l0J3MgaW1wb3J0YW50IHRvIGxvb2sgZm9yIHRoZSBzdGF0aWMgY29uZmlncyBmaXJzdCAtIGdsb2JhbCBwYXJhbWV0ZXJzIGFyZSB1c2VkIGludGVybmFsbHkNCi0gICAgICAgIHJlc3VsdCA9IHRyeVRvRmluZFN0YXRpY0NvbmZpZyhzb3VyY2UpOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHRyeVRvRmluZEdsb2JhbFBhcmFtZXRlcihzb3VyY2UpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHNvdXJjZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGNhY2hlTWFwcGluZyhzb3VyY2UsIHJlc3VsdCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3MgdHJ5VG9GaW5kR2xvYmFsUGFyYW1ldGVyKENsYXNzIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IHRhcmdldCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KHNvdXJjZS5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIENsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoQ2xhc3MpIHRhcmdldDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3MgdHJ5VG9GaW5kU3RhdGljQ29uZmlnKENsYXNzIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgcmVzdWx0ID0gbnVsbDsNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gY29uZmlnIDogRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlZBTElEQVRJT05fUEFSQU1FVEVSX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gdHJ5VG9NYXAoc291cmNlLCBjb25maWcuZ2V0TWFwcGluZygpKTsNCi0NCi0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3MgdHJ5VG9NYXAoQ2xhc3Mgc291cmNlLCBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmcpDQotICAgIHsNCi0gICAgICAgIENsYXNzIHRhcmdldCA9IG51bGw7DQotDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBtYXBwaW5nKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscyhlbnRyeS5nZXRTb3VyY2UoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0YXJnZXQgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShlbnRyeS5nZXRUYXJnZXQoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdGFyZ2V0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjYWNoZU1hcHBpbmcoQ2xhc3Mgc291cmNlLCBDbGFzcyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFyYW1ldGVyTWFwcGluZy5wdXQoc291cmNlLCB0YXJnZXQpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2YzdmMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogbWVjaGFuaXNtIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBleHR2YWwNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGltcGxlbWVudHMgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcg0KLXsNCi0gICAgcHVibGljIGJvb2xlYW4gc2V2ZXJpdHlCbG9ja3NOYXZpZ2F0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IuZXF1YWxzKHNldmVyaXR5KSB8fCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUwuZXF1YWxzKHNldmVyaXR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXZlcml0eUNhdXNlc1ZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLmVxdWFscyhzZXZlcml0eSkgfHwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMLmVxdWFscyhzZXZlcml0eSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gc2V2ZXJpdHlDYXVzZXNWaW9sYXRpb25NZXNzYWdlKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHNldmVyaXR5QmxvY2tzU3VibWl0KA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IuZXF1YWxzKHNldmVyaXR5KSB8fCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUwuZXF1YWxzKHNldmVyaXR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXZlcml0eVNob3dzSW5kaWNhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLmVxdWFscyhzZXZlcml0eSkgfHwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMLmVxdWFscyhzZXZlcml0eSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNzM1MWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotew0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlcktleS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9QYXJhbWV0ZXJLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlNDVjYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlcktleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUYXJnZXQoe0ZJRUxELCBNRVRIT0R9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBQYXJhbWV0ZXJLZXkNCi17DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvUGFyYW1ldGVyVmFsdWUuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvUGFyYW1ldGVyVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZkYzhmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlclZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRhcmdldCh7RklFTEQsIE1FVEhPRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFBhcmFtZXRlclZhbHVlDQotew0KLSAgICBDbGFzcyBpZCgpIGRlZmF1bHQgUGFyYW1ldGVyVmFsdWUuY2xhc3M7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNTljNzYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvblBhcmFtZXRlcg0KLXsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU2NmY5MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvcg0KLXsNCi0gICAgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbik7DQotICAgIExpc3Q8T2JqZWN0PiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSk7DQotICAgIDxUPiBMaXN0PFQ+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzczxUPiB2YWx1ZVR5cGUpOw0KLSAgICA8VD4gVCBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSwgQ2xhc3M8VD4gdmFsdWVUeXBlLCBDbGFzcyB2YWx1ZUlkKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGNkZGQyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeQ0KLXsNCi0gICAgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBjcmVhdGUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WaW9sYXRpb25TZXZlcml0eS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WaW9sYXRpb25TZXZlcml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjNiYTIxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZpb2xhdGlvblNldmVyaXR5DQotew0KLSAgICBpbnRlcmZhY2UgSW5mbyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi0gICAgew0KLSAgICAgICAgQFBhcmFtZXRlcktleQ0KLSAgICAgICAgcHVibGljIENsYXNzIEtFWSA9IFZpb2xhdGlvblNldmVyaXR5LmNsYXNzOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgcHVibGljIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBTRVZFUklUWSA9IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9JTkZPOw0KLQ0KLSAgICAgICAgLy9AUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIC8vTWVzc2FnZVR5cGUgcG9zdGZpeCA9IE1lc3NhZ2VUeXBlLklORk87DQotICAgIH0NCi0NCi0gICAgaW50ZXJmYWNlIFdhcm4gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotICAgIHsNCi0gICAgICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgICAgIHB1YmxpYyBDbGFzcyBLRVkgPSBWaW9sYXRpb25TZXZlcml0eS5jbGFzczsNCi0NCi0gICAgICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFNFVkVSSVRZID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk47DQotDQotICAgICAgICAvL0BQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgLy9NZXNzYWdlVHlwZSBwb3N0Zml4ID0gTWVzc2FnZVR5cGUuV0FSTjsNCi0gICAgfQ0KLQ0KLSAgICBpbnRlcmZhY2UgRXJyb3IgZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotICAgIHsNCi0gICAgICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgICAgIHB1YmxpYyBDbGFzcyBLRVkgPSBWaW9sYXRpb25TZXZlcml0eS5jbGFzczsNCi0NCi0gICAgICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFNFVkVSSVRZID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SOw0KLQ0KLSAgICAgICAgLy9AUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIC8vTWVzc2FnZVR5cGUgcG9zdGZpeCA9IE1lc3NhZ2VUeXBlLkVSUk9SOw0KLSAgICB9DQotDQotICAgIGludGVyZmFjZSBGYXRhbCBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi0gICAgew0KLSAgICAgICAgQFBhcmFtZXRlcktleQ0KLSAgICAgICAgcHVibGljIENsYXNzIEtFWSA9IFZpb2xhdGlvblNldmVyaXR5LmNsYXNzOw0KLQ0KLSAgICAgICAgQFBhcmFtZXRlclZhbHVlDQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgU0VWRVJJVFkgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUw7DQotDQotICAgICAgICAvL0BQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgLy9NZXNzYWdlVHlwZSBwb3N0Zml4ID0gTWVzc2FnZVR5cGUuRkFUQUw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1Zpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc2YmQ5NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1Zpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBtZWNoYW5pc20gdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGV4dHZhbA0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcg0KLXsNCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHNldmVyaXR5IHNob3VsZCBibG9jayB0aGUgbmF2aWdhdGlvbg0KLSAgICAgKiBpZiAjc2V2ZXJpdHlDYXVzZXNWYWxpZGF0b3JFeGNlcHRpb24gcmV0dXJucyBmYWxscyB2YWxpZGF0aW9uIHdpbGwgYmUgY29udGludWVkIGZvciB0aGUgY3VycmVudCBwcm9wZXJ0eQ0KLSAgICAgKiBhbGwgbWVzc2FnZXMgd2hpY2ggZG9uJ3QgbGVhZCB0byBhbiBleGNlcHRpb24gc2hvdWxkIGJlIHN0b3JlZCBpbiBhbiBzdG9yYWdlIGFuZA0KLSAgICAgKiBhZGRlZCBhZnRlciB0aGUgZmlyc3QgbWVzc2FnZSB3aGljaCBnZXRzIHRocm93biBhcyBleGNlcHRpb24NCi0gICAgICogYSBnbG9iYWwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgYWRkIHRoZSBtZXNzYWdlcyBvZiB0aGUgc3RvcmFnZSBhcyBmYWNlcyBtZXNzYWdlDQotICAgICAqLw0KLSAgICBib29sZWFuIHNldmVyaXR5QmxvY2tzTmF2aWdhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KTsNCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHNldmVyaXR5IHNob3VsZCBjYXVzZSBhIHZhbGlkYXRvciBleGNlcHRpb24NCi0gICAgICovDQotICAgIGJvb2xlYW4gc2V2ZXJpdHlDYXVzZXNWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSk7DQotDQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IGN1cnJlbnQgZmFjZXMgY29udGV4dA0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgY3VycmVudCBjb21wb25lbnQNCi0gICAgICogQHBhcmFtIHNldmVyaXR5IGpzZiBzZXZlcml0eSBmb3IgZmFjZXMgbWVzc2FnZXMNCi0gICAgICogQHJldHVybiB0cnVlIGlmIGEgdmlvbGF0aW9uIG1lc3NhZ2UgbGVhZHMgdG8gYSBmYWNlcyBtZXNzYWdlDQotICAgICAqLw0KLSAgICBib29sZWFuIHNldmVyaXR5Q2F1c2VzVmlvbGF0aW9uTWVzc2FnZSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KTsNCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnN0cmFpbnQgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkgc2hvdWxkIGJlIHZhbGlkYXRlZCBvbiB0aGUgY2xpZW50IHNpZGUgKGlmIHN1cHBvcnRlZCkNCi0gICAgICovDQotICAgIGJvb2xlYW4gc2V2ZXJpdHlCbG9ja3NTdWJtaXQoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSk7DQotDQotICAgIC8qKg0KLSAgICAgKiBhdmFpbGFibGUgZm9yIGFkZC1vbnMgLSBub3QgdXNlZCBpbnRlcm5hbGx5IGR1ZSB0byBwZXJmb3JtYW5jZSByZWFzb25zDQotICAgICAqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnN0cmFpbnQgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkNCi0gICAgICogc2hvdWxkIGNhdXNlIGUuZy4gYSByZXF1aXJlZCBtYXJrZXIgaW5kZXBlbmRlbnQgb2YgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiAoaWYgc3VwcG9ydGVkKQ0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBzZXZlcml0eVNob3dzSW5kaWNhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTljOTM0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLk1lc3NhZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotCi0vKioKLSAqIFByb3ZpZGVzIHRoZSBhYmlsaXR5IG9mIG1lc3NhZ2UgcmVzb2x2aW5nIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuUkVVU0V9KQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTxBIGV4dGVuZHMgQW5ub3RhdGlvbj4gZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQotewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYID0gIl9kZXRhaWwiOwotICAgIC8vZS5nLiBmb3IgaW5qZWN0aW5nIGEgbWVzc2FnZSByZXNvbHZlciB2aWEgc3ByaW5nCi0gICAgcHJpdmF0ZSBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgTG9jYWxlIGxvY2FsZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpOwotCi0gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VSZXNvbHZlciAhPSBudWxsID8gdGhpcy5tZXNzYWdlUmVzb2x2ZXIuZ2V0TWVzc2FnZShrZXksIGxvY2FsZSkgOgotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHRoaXMpLmdldE1lc3NhZ2Uoa2V5LCBsb2NhbGUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShBIGFubm90YXRpb24pCi0gICAgewotICAgICAgICByZXR1cm4gcmVzb2x2ZU1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChBIGFubm90YXRpb24pCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiAoa2V5ICE9IG51bGwpID8gcmVzb2x2ZU1lc3NhZ2Uoa2V5ICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgpIDogbnVsbDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbikgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBGYWNlc01lc3NhZ2UgZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNZXNzYWdlKEEgYW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2UoZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uKSwgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBIGFubm90YXRpb24pOwotCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZVJlc29sdmVyKE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXIpCi0gICAgewotICAgICAgICB0aGlzLm1lc3NhZ2VSZXNvbHZlciA9IG1lc3NhZ2VSZXNvbHZlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICAgIG1ldGFEYXRhRW50cnkuc2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwsIGdldExhYmVsKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnkpKTsKLQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uKTsKLSAgICB9Ci0KLSAgICAvL2UuZy4gZm9yIGN1c3RvbSBhbm5vdGF0aW9ucyAtIG92ZXJyaWRlIGlmIG5lZWRlZAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMWYzZWQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5leGNlcHRpb24uUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBQcm92aWRlcyB0aGUgYWJpbGl0eSB0byB1c2UgVmFsaWRhdG9yRXhjZXB0aW9uIChhcyBleHBlY3RlZCBieSB0aGUgdXNlcikgaW5zdGVhZCBvZiBDb252ZXJ0ZXJFeGNlcHRpb24uDQotICogRnVydGhlcm1vcmUgaXQgcHJvdmlkZXM6PGJyLz4NCi0gKiBpbml0VmFsaWRhdGlvbjxici8+DQotICogcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgaW5pdFZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGluaXRWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImluaXRWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBwcm9jZXNzVmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcm9jZXNzVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJwcm9jZXNzVmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0gICAgICAgICAgICBpZihlIGluc3RhbmNlb2YgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24gPSBuZXcgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29udmVydEZhY2VzTWVzc2FnZShlLmdldEZhY2VzTWVzc2FnZSgpKSwgZS5nZXRDYXVzZSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uID0gbmV3IFZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb252ZXJ0RmFjZXNNZXNzYWdlKGUuZ2V0RmFjZXNNZXNzYWdlKCkpLCBlLmdldENhdXNlKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBpZiAocHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgIjogdGhyb3cgb3JpZ2luYWwgZXhjZXB0aW9uIGFmdGVyIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvVGhyb3dWYWxpZGF0b3JFeGNlcHRpb25Gb3JDb21wb25lbnQoDQotICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSwgdmFsaWRhdG9yRXhjZXB0aW9uKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgIjogb3JpZ2luYWwgZXhjZXB0aW9uIGFmdGVyIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbiwgdGhpcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmlydHVhbFZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmlydHVhbFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGY4N2RjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi0NCi0vKioNCi0gKiB0byBtYXAgY29uc3RyYWludHMgZGlyZWN0bHkgdG8gYSBtZXRhLWRhdGEgdHJhbnNmb3JtZXIgaWYgdGhlcmUgaXMgbm8gdmFsaWRhdGlvbiBzdHJhdGVneSAocmVxdWlyZWQgYnkganNyIDMwMykNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGUoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ0aGlzIGlzIGp1c3QgYW4gYWRhcHRlciBlLmcuIGZvciBjb21wb25lbnQgaW5pdGlhbGl6YXRpb24iKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzI1ZTA0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIGl0IGlzbid0IGxpbmtlZCB0byBqc3IgMzAzDQotICoNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0NCi0gKiBhZGFwdGVyIHRvIGNvbm5lY3QgdmFsaWRhdGlvbiBzdHJhdGVnaWVzIHdpdGggbWV0YS1kYXRhIHRyYW5zZm9ybWVycywNCi0gKiBpZiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBkZWZpbmVkIGFzIGJlYW4gYW5kIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBpbnRlcmZhY2UgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIgZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIC8vdG8gZ2V0IGJhY2sgdGhlIGludGVybmFsIGNhc2hpbmcNCi0gICAgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpOw0KLQ0KLSAgICBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMTE2ZjIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLkJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogaXQgaXNuJ3QgbGlua2VkIHRvIGpzciAzMDMNCi0gKg0KLSAqIGl0J3MganVzdCBhIGhlbHBlciBmb3IgcHJveGllcyAtIHlvdSBqdXN0IG5lZWQgaXQsIGlmIHlvdSBkZWZpbmUgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0Lg0KLQ0KLSAqIGFkYXB0ZXIgdG8gY29ubmVjdCB2YWxpZGF0aW9uIHN0cmF0ZWdpZXMgd2l0aCBtZXRhLWRhdGEgdHJhbnNmb3JtZXJzLA0KLSAqIGlmIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIGRlZmluZWQgYXMgYmVhbiBhbmQgZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbCBpbXBsZW1lbnRzIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgcHJpdmF0ZSBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAvL29wdGlvbmFsIGZhbGxiYWNrIGZvciBpbnRlcm5hbCBjYXNoaW5nDQotICAgIHByaXZhdGUgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsNCi0NCi0gICAgcHVibGljIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbCgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciBpbnN0YW5jZW9mIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcikNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyKSBtZXRhRGF0YVRyYW5zZm9ybWVyICkuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgTWV0YURhdGFUcmFuc2Zvcm1lciBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFUcmFuc2Zvcm1lcihNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lciA9IG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25TdHJhdGVneShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneSA9IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEwYTExZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcg0KLSAgICAuQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyB0aGUgVmFsaWRhdGlvblN0cmF0ZWd5IGZvciBhIGdpdmVuIE1ldGEtRGF0YSBLZXkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFN0cmluZz4NCi0gICAgICAgIGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxTdHJpbmcsIFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9IG51bGw7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBjcmVhdGUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICBpZiAobWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljTWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZy5jb250YWluc0tleShtZXRhRGF0YUtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nLmdldChtZXRhRGF0YUtleSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWU7DQotICAgICAgICAvL251bGwgLT4gdXNlIG5hbWUgbWFwcGVycw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFN0cmluZz4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0cmF0ZWd5TmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZShtZXRhRGF0YUtleSk7DQotDQotICAgICAgICAgICAgaWYgKHN0cmF0ZWd5TmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKHN0cmF0ZWd5TmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyhtZXRhRGF0YUtleSwgc3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lJbnN0YW5jZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUNCi0gICAgICAgICAgICAuc3RhcnRzV2l0aChBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5QUkVGSVhfRk9SX0JFQU5fTUFQUElORykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbih2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLlBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HLmxlbmd0aCgpKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIG1ldGFEYXRhS2V5LCBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZGRpbmcgbWV0YS1kYXRhIGtleSB0byB2YWxpZGF0aW9uIHN0cmF0ZWd5IG1hcHBpbmc6ICINCi0gICAgICAgICAgICAgICAgKyBtZXRhRGF0YUtleSArICIgLT4gIiArIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcucHV0KG1ldGFEYXRhS2V5LCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnID0gbmV3IFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgLy90cnkgdG8gc2V0dXAgbWFwcGluZyB3aXRoIGJhc2UgbmFtZSBieSBjb252ZW50aW9uIC0gb3ZlcnJpZGVzIGRlZmF1bHQgbWFwcGluZw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgLy9idWlsZCBjb252ZW50aW9uIChzdHJhdGVneSBtYXBwaW5nKQ0KLSAgICAgICAgICAgIHN0YXRpY0NvbmZpZy5zZXRTb3VyY2VPZk1hcHBpbmcoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVRJQ19TVFJBVEVHWV9NQVBQSU5HX1NPVVJDRSkpOw0KLQ0KLSAgICAgICAgICAgIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9zZXR1cCBjdXN0b20gbWFwcGluZyAtIG92ZXJyaWRlcyBhbGwgb3RoZXIgbWFwcGluZ3MNCi0gICAgICAgIFN0cmluZyBjdXN0b21NYXBwaW5nQmFzZU5hbWUgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OX1NUUkFURUdZX01BUFBJTkc7DQotICAgICAgICBpZiAoY3VzdG9tTWFwcGluZ0Jhc2VOYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzdGF0aWNDb25maWcgPSBuZXcgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAgICAgICAgIHN0YXRpY0NvbmZpZy5zZXRTb3VyY2VPZk1hcHBpbmcoY3VzdG9tTWFwcGluZ0Jhc2VOYW1lKTsNCi0gICAgICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBTdHJhdGVneU1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZyxTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWFwcGluZy5nZXRTb3VyY2UoKSwgbWFwcGluZy5nZXRUYXJnZXQoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxTdHJpbmc+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm5hbWVNYXBwZXJMaXN0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9JZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9JZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAzOTUwZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogaWYgYW4gYWRhcHRlciBpcyB1c2VkIGZvciBzZXZlcmFsIGNvbnN0cmFpbnRzLCB0aGlzIGludGVyZmFjZSBhbGxvd3MgdG8gaWRlbnRpZnkgaW5zdGFuY2VzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgU3RyaW5nIElEX1BSRUZJWCA9ICI6IjsNCi0NCi0gICAgU3RyaW5nIGdldElkKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1NTIzZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQmFzZSBpbnRlcmZhY2UgZm9yIFZhbGlkYXRpb25TdHJhdGVnaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi0vLypWYWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGVhZCBvZiAqVmFsaWRhdG9yIHRvIGF2b2lkIG5hbWluZyBjb25mdXNpb24gDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9BYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJjZTc5MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHB1YmxpYyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGQ5NGY3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOw0KLQ0KLS8qKg0KLSAqIE5hbWUgTWFwcGVyIHdoaWNoIGRlbGVnYXRlcyB0aGUgbmFtZSBtYXBwaW5nLCBleHRyYWN0IHRoZSBuYW1lIGFuZCBjb252ZXJ0IGl0IHRvIGEgYmVhbiBuYW1lICsgcHJlZml4DQotICogdGFyZ2V0OiBjb25maWd1cmUgYSB2YWxpZGF0aW9uIHN0cmF0ZWd5IHZpYSBhIG1hbmFnZWQgYmVhbiBmYWNpbGl0eSAtPiBhbGxvd3MgdG8gaW5qZWN0IG90aGVyIGJlYW5zDQotICogaW5zdGVhZCBvZiBhcGkgY2FsbHMgKyBoYXJkY29kZWQgYmVhbiBuYW1lcw0KLSAqIDxwLz4NCi0gKiBhbGxvd2VkIGJlYW4gc2NvcGVzOg0KLSAqIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIHN0YXRlbGVzczogYXBwbGljYXRpb24vc2luZ2xldG9uDQotICogdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgc3RhdGVmdWw6IG5vbmUvcHJvdG90eXBlDQotICogZG9uJ3QgdXNlIHRoZSBzZXNzaW9uIG9yIGEgY29udmVyc2F0aW9uIHNjb3BlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDUwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HID0gImJlYW46IjsNCi0gICAgcHJpdmF0ZSBOYW1lTWFwcGVyPFN0cmluZz4gd3JhcHBlZDsNCi0NCi0gICAgcHVibGljIEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKE5hbWVNYXBwZXI8U3RyaW5nPiBuYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSBuYW1lTWFwcGVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbmFtZSA9IHdyYXBwZWQuY3JlYXRlTmFtZShzb3VyY2UpOw0KLQ0KLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKTsNCi0gICAgICAgIHJldHVybiBQUkVGSVhfRk9SX0JFQU5fTUFQUElORyArIEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUobmFtZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDAzMjA2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgQW5ub3RhdGlvbnMgdG8gVmFsaWRhdGlvblN0cmF0ZWdpZXMuDQotICogKGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZTgzMDIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIEFubm90YXRpb25zIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqIChjb25maWd1cmVkIHZpYSBpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKQ0KLSAqIFRoZSBiZWFuIHByb3ZpZGVzIHRoZSBkZWZhdWx0IG5hbWUgKGNvbnZlbnRpb24pLg0KLSAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhIGN1c3RvbSBmdWxsIHF1YWxpZmllZCBuYW1lLiAoPSBjdXN0b21pemFibGUgY29udmVudGlvbikNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzM4ZDhmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBtYXBzIEV4dFZhbCBBbm5vdGF0aW9ucyB0byBFeHRWYWwgVmFsaWRhdGlvblN0cmF0ZWdpZXMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUobWV0YURhdGFLZXkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzODIwNTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIHRvIHBsYWNlIEFubm90YXRpb25zIGFuZCBWYWxpZGF0aW9uU3RyYXRlZ2llcyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcig0MDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5ICsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Qcmlvcml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzk0N2Q1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotcHVibGljIGVudW0gUHJpb3JpdHkKLXsKLSAgICBCTE9DS0lORywKLSAgICBISUdILAotICAgIE1FRElVTSwKLSAgICBMT1cKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyYWRhYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Ub0RvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuQ09OU1RSVUNUT1I7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTEQsIENPTlNUUlVDVE9SfSkKLXB1YmxpYyBAaW50ZXJmYWNlIFRvRG8KLXsKLSAgICBQcmlvcml0eSB2YWx1ZSgpOwotICAgIFN0cmluZyBkZXNjcmlwdGlvbigpIGRlZmF1bHQgIiI7Ci0KLSAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICBAaW50ZXJmYWNlIExpc3QKLSAgICB7Ci0gICAgICAgIFRvRG9bXSB2YWx1ZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlQ2F0ZWdvcnkuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ3YjM4NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLS8qKgotICogQVBJOjxici8+Ci0gKiBwYXJ0cyB5b3UgbWlnaHQgbmVlZCBmb3IgY3VzdG9tIGltcGxlbWVudGF0aW9ucyBhbmQgd2hpY2ggYXJlIHF1aXRlIHN0YWJsZSBpbiB2aWV3IG9mIGNoYW5nZXMKLSAqIDxwLz4KLSAqIElOVEVSTkFMOjxici8+Ci0gKiBpZiB5b3UgdGhpbmsgYWJvdXQgcmVmZXJlbmNpbmcgYW4gYXJ0aWZhY3Qgd2hpY2ggaXMgbWFya2VkIGFzIGludGVybmFsLCBhc2sgZm9yIHN1cHBvcnQuCi0gKiB0aGVyZSBzaG91bGQgYmUgYSBiZXR0ZXIgc29sdXRpb24KLSAqIDxwLz4KLSAqIENVU1RPTUlaQUJMRTo8YnIvPgotICogYSBwbGFubmVkIGV4dGVuc2lvbiBwb2ludCB3aGljaCBjb250YWlucyBsb2dpYyB0byBjdXN0b21pemUgdGhlIGZyYW1ld29yay4KLSAqIGlmIGl0IGlzbid0IGFsc28gbWFya2VkIGFzIEFQSSBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotICogaG93ZXZlciwgd2UgdHJ5IHRvIGtlZXAgaXQgYXMgc3RhYmxlIGFzIHBvc3NpYmxlIGFuZCByZWFzb25hYmxlLgotICogPHAvPgotICogUkVVU0U6PGJyLz4KLSAqIGFuIGFydGlmYWN0IHdoaWNoIHlvdSBjYW4gcmV1c2UgZm9yIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uLgotICogaWYgaXQgaXNuJ3QgbWFya2VkIGFzIEFQSSBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotICogaG93ZXZlciwgd2UgdHJ5IHRvIGtlZXAgaXQgYXMgc3RhYmxlIGFzIHBvc3NpYmxlIGFuZCByZWFzb25hYmxlLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLXB1YmxpYyBlbnVtIFVzYWdlQ2F0ZWdvcnkKLXsKLSAgICBBUEksCi0gICAgSU5URVJOQUwsCi0gICAgQ1VTVE9NSVpBQkxFLAotICAgIFJFVVNFCi19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MzdlYmMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIGl0J3MgYW4gaW50ZXJuYWwgYW5ub3RhdGlvbiB0byBwcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gY29uY2VybmluZyB1c2FnZS1jYXRlZ29yaWVzCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkKLSAqLwotQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi1wdWJsaWMgQGludGVyZmFjZSBVc2FnZUluZm9ybWF0aW9uCi17Ci0gICAgVXNhZ2VDYXRlZ29yeVtdIHZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0NsYXNzVXRpbHMuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2UyMDU2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsNCi1pbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ2xhc3NVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENsYXNzVXRpbHMuY2xhc3MpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIHRyeVRvTG9hZENsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGxvYWRDbGFzc0Zvck5hbWUobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGxvYWRDbGFzc0Zvck5hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIFRyeSBXZWJBcHAgQ2xhc3NMb2FkZXIgZmlyc3QNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwDQotICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWdub3JlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIGZhbGxiYWNrOiBUcnkgQ2xhc3NMb2FkZXIgZm9yIENsYXNzVXRpbHMgKGkuZS4gdGhlIG15ZmFjZXMuamFyIGxpYikNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwDQotICAgICAgICAgICAgICAgIENsYXNzVXRpbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyA8VD4gVCB0cnlUb0luc3RhbnRpYXRlQ2xhc3MoQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0YXJnZXRDbGFzcy5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKFN0cmluZyBjbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxvYWRDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEphclZlcnNpb24oQ2xhc3MgdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjbGFzc0ZpbGVQYXRoID0gdGFyZ2V0Q2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyI7DQotICAgICAgICBTdHJpbmcgbWFuaWZlc3RGaWxlUGF0aCA9ICIvTUVUQS1JTkYvTUFOSUZFU1QuTUYiOw0KLQ0KLSAgICAgICAgU3RyaW5nIGNsYXNzTG9jYXRpb24gPSB0YXJnZXRDbGFzcy5nZXRSZXNvdXJjZSh0YXJnZXRDbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLmNsYXNzIikudG9TdHJpbmcoKTsNCi0gICAgICAgIFN0cmluZyBtYW5pZmVzdEZpbGVMb2NhdGlvbiA9IGNsYXNzTG9jYXRpb24NCi0gICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCBjbGFzc0xvY2F0aW9uLmluZGV4T2YoY2xhc3NGaWxlUGF0aCkgLSAxKSArIG1hbmlmZXN0RmlsZVBhdGg7DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IE1hbmlmZXN0KG5ldyBVUkwobWFuaWZlc3RGaWxlTG9jYXRpb24pLm9wZW5TdHJlYW0oKSkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNYWluQXR0cmlidXRlcygpLmdldFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5JTVBMRU1FTlRBVElPTl9WRVJTSU9OKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoTE9HLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBMT0cudHJhY2UoImNvdWxkbid0IGxvYWQgdmVyc2lvbiBvZiBqYXIgZmlsZSB3aGljaCBjb250YWlucyAiICsgdGFyZ2V0Q2xhc3MuZ2V0TmFtZSgpLCB0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9EZWZhdWx0UHJvamVjdE5hbWUuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRGVmYXVsdFByb2plY3ROYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZDYzOTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9EZWZhdWx0UHJvamVjdE5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Qcm9qZWN0U3RhZ2VOYW1lOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0UHJvamVjdE5hbWUgaW1wbGVtZW50cyBQcm9qZWN0U3RhZ2VOYW1lDQotew0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOw0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pDQotICAgIHByaXZhdGUgRGVmYXVsdFByb2plY3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIERlZmF1bHRQcm9qZWN0TmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBzdGF0aWMgUHJvamVjdFN0YWdlTmFtZSBjcmVhdGVQcm9qZWN0U3RhZ2VOYW1lKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRQcm9qZWN0TmFtZShuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5uYW1lOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmICh0aGlzID09IG8pDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgRGVmYXVsdFByb2plY3ROYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBEZWZhdWx0UHJvamVjdE5hbWUgdGhhdCA9IChEZWZhdWx0UHJvamVjdE5hbWUpIG87DQotDQotICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKHRoYXQubmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmFtZS5oYXNoQ29kZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJlZTNkYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NjQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5WYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Qcm9qZWN0U3RhZ2VOYW1lOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5BYnN0cmFjdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5OYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5GYWNlc01lc3NhZ2VTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbFV0aWxzDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HR0VSID0gTG9nRmFjdG9yeS5nZXRMb2coRXh0VmFsVXRpbHMuY2xhc3MpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfUkVRVUlSRUQgPSAiamF2YXguZmFjZXMuY29tcG9uZW50LlVJSW5wdXQuUkVRVUlSRUQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfUkVRVUlSRURfREVUQUlMID0gImphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUlucHV0LlJFUVVJUkVEX2RldGFpbCI7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19NQVhJTVVNID0gImphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3IuTUFYSU1VTSI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19NQVhJTVVNX0RFVEFJTCA9ICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yLk1BWElNVU1fZGV0YWlsIjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChDbGFzc01hcHBpbmdGYWN0b3J5PFN0cmluZywgVmFsaWRhdGlvblN0cmF0ZWd5PikgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZShtZXRhRGF0YUtleSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgTmFtZU1hcHBlcjxTdHJpbmc+IG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlcmVnaXN0ZXIobWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbnlNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gbWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZW55KG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFUcmFuc2Zvcm1lciBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YVRyYW5zZm9ybWVyPikgRXh0VmFsQ29udGV4dA0KLSAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlKHZhbGlkYXRpb25TdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLnJlZ2lzdGVyKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVyZWdpc3Rlcih2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZW55VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVueSh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLCBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yV2l0aChNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksIENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVdpdGgocHJvcGVydGllcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudFdpdGhNZXRhRGF0YShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGZvciAoQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRDb21wb25lbnRJbml0aWFsaXplcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjb21wb25lbnRJbml0aWFsaXplci5jb25maWd1cmVDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOw0KLQ0KLSAgICAgICAgaWYgKG1ldGFEYXRhRW50cnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YUVudHJ5ID0gbmV3IE1ldGFEYXRhRW50cnkoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAoVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCF2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJUaHJvd2luZygNCi0gICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbiwgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGVJbnRlcmNlcHRlZE1ldGFEYXRhRXh0cmFjdG9yKGZpbmFsIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvcldpdGgobWV0YURhdGFFeHRyYWN0b3IsIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvckZvcigNCi0gICAgICAgICAgICBmaW5hbCBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciwgQ2xhc3MgbW9kdWxlS2V5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIGlmKG1vZHVsZUtleSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpLCBtb2R1bGVLZXkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3JXaXRoKG1ldGFEYXRhRXh0cmFjdG9yLCBwcm9wZXJ0aWVzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3JXaXRoKA0KLSAgICAgICAgICAgIGZpbmFsIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yLCBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgTWV0YURhdGFFeHRyYWN0b3IoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcmVzdWx0ID0gbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIG9iamVjdCk7DQotDQotICAgICAgICAgICAgICAgIGFkZFByb3BlcnRpZXMocmVzdWx0LCBwcm9wZXJ0aWVzKTsNCi0gICAgICAgICAgICAgICAgaW52b2tlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKHJlc3VsdCwgcHJvcGVydGllcyk7DQotDQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFByb3BlcnRpZXMoUHJvcGVydHlJbmZvcm1hdGlvbiByZXN1bHQsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgaWYocHJvcGVydGllcyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY3VzdG9tUHJvcGVydGllcyA9IGdldEN1c3RvbVByb3BlcnRpZXMocmVzdWx0KTsNCi0gICAgICAgICAgICBjdXN0b21Qcm9wZXJ0aWVzLnB1dEFsbChwcm9wZXJ0aWVzKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEN1c3RvbVByb3BlcnRpZXMoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZighcHJvcGVydHlJbmZvcm1hdGlvbi5jb250YWluc0luZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkNVU1RPTV9QUk9QRVJUSUVTKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnNldEluZm9ybWF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuQ1VTVE9NX1BST1BFUlRJRVMsIG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoTWFwPFN0cmluZywgT2JqZWN0PikgcHJvcGVydHlJbmZvcm1hdGlvbi5nZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5DVVNUT01fUFJPUEVSVElFUyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbnZva2VNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoUHJvcGVydHlJbmZvcm1hdGlvbiByZXN1bHQsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgZm9yIChNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciA6DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc1dpdGgocHJvcGVydGllcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJFeHRyYWN0aW5nKHJlc3VsdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlUmVzb2x2ZXIgZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXNzYWdlUmVzb2x2ZXI+KSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlKHZhbGlkYXRpb25TdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5yZWdpc3Rlcih2YWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlcmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IHZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlcmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZW55VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZW55KHZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEVMSGVscGVyIGdldEVMSGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRUxfSEVMUEVSX0ZBQ1RPUlksIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmNsYXNzKS5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY2VzTWVzc2FnZSBjcmVhdGVGYWNlc01lc3NhZ2UoU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcmVhdGVGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjZXNNZXNzYWdlIGNyZWF0ZUZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5GQUNFU19NRVNTQUdFX0ZBQ1RPUlksIEZhY2VzTWVzc2FnZUZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUoc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBGYWNlc01lc3NhZ2UgY29udmVydEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5GQUNFU19NRVNTQUdFX0ZBQ1RPUlksIEZhY2VzTWVzc2FnZUZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5jb252ZXJ0KGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eURldGFpbHMgY3JlYXRlUHJvcGVydHlEZXRhaWxzRm9yTmV3VGFyZ2V0KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgYmFzZU9iamVjdDsNCi0gICAgICAgIGlmIChnZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZCh0YXJnZXRFeHByZXNzaW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZSA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHRhcmdldEV4cHJlc3Npb24pOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyBleHByZXNzaW9uID0gdmJlLmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgICAgICBiYXNlT2JqZWN0ID0gZ2V0RUxIZWxwZXIoKS5nZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZiZS5nZXRCYXNlRXhwcmVzc2lvbigpKTsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uc3Vic3RyaW5nKDIsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKSwgYmFzZU9iamVjdCwgdmJlLmdldFByb3BlcnR5KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIG9yaWdpbmFsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eSgNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIFN0cmluZyBuZXdCYXNlS2V5ID0gb3JpZ2luYWwuZ2V0S2V5KCkuc3Vic3RyaW5nKDAsIG9yaWdpbmFsLmdldEtleSgpLmxhc3RJbmRleE9mKCIuIikgKyAxKTsNCi0gICAgICAgIFN0cmluZyBuZXdLZXkgPSBuZXdCYXNlS2V5ICsgdGFyZ2V0RXhwcmVzc2lvbjsNCi0NCi0gICAgICAgIGJhc2VPYmplY3QgPSBSZWZsZWN0aW9uVXRpbHMuZ2V0QmFzZU9mUHJvcGVydHlDaGFpbihvcmlnaW5hbC5nZXRCYXNlT2JqZWN0KCksIHRhcmdldEV4cHJlc3Npb24pOw0KLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURldGFpbHMoDQotICAgICAgICAgICAgICAgIG5ld0tleSwgYmFzZU9iamVjdCwgdGFyZ2V0RXhwcmVzc2lvbi5zdWJzdHJpbmcodGFyZ2V0RXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiLiIpICsgMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRFeHByZXNzaW9uLmxlbmd0aCgpKSk7DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvUGxhY2VMYWJlbChGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBTdHJpbmcgbGFiZWwsIGludCBpbmRleCkNCi0gICAgew0KLSAgICAgICAgaWYgKGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLmNvbnRhaW5zKCJ7IiArIGluZGV4ICsgIn0iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLnJlcGxhY2UoInsiICsgaW5kZXggKyAifSIsIGxhYmVsKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoZmFjZXNNZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwgJiYgZmFjZXNNZXNzYWdlLmdldERldGFpbCgpLmNvbnRhaW5zKCJ7IiArIGluZGV4ICsgIn0iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKS5yZXBsYWNlKCJ7IiArIGluZGV4ICsgIn0iLCBsYWJlbCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBsYWNlV2l0aERlZmF1bHRNYXhpbXVtTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBpbnQgbWF4TGVuZ3RoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2UgPSBKc2ZVdGlscy5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZShKQVZBWF9GQUNFU19NQVhJTVVNKTsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlOw0KLQ0KLSAgICAgICAgLy91c2UgdHJ5L2NhdGNoIGZvciBlYXNpZXIgc3luYyBiZXR3ZWVuIHRydW5rL2JyYW5jaA0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKEpzZlV0aWxzLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKEpBVkFYX0ZBQ0VTX01BWElNVU1fREVUQUlMKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBKc2ZVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZShKQVZBWF9GQUNFU19NQVhJTVVNX0RFVEFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9qc2YgMS4yIGRvZXNuJ3QgaGF2ZSBhIGRldGFpbCBtZXNzYWdlDQotICAgICAgICB9DQotDQotICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZSA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlLnJlcGxhY2UoInswfSIsICIiICsgbWF4TGVuZ3RoKTsNCi0gICAgICAgIGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsID0gZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwucmVwbGFjZSgiezB9IiwgIiIgKyBtYXhMZW5ndGgpOw0KLQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoZmFjZXNSZXF1aXJlZE1lc3NhZ2UpOw0KLSAgICAgICAgZmFjZXNNZXNzYWdlLnNldERldGFpbChmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCk7DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2UgPSBKc2ZVdGlscy5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZShKQVZBWF9GQUNFU19SRVFVSVJFRCk7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZTsNCi0NCi0gICAgICAgIC8vdXNlIHRyeS9jYXRjaCBmb3IgZWFzaWVyIHN5bmMgYmV0d2VlbiB0cnVuay9icmFuY2gNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChKc2ZVdGlscy5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZShKQVZBWF9GQUNFU19SRVFVSVJFRF9ERVRBSUwpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IEpzZlV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKEpBVkFYX0ZBQ0VTX1JFUVVJUkVEX0RFVEFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9qc2YgMS4yIGRvZXNuJ3QgaGF2ZSBhIGRldGFpbCBtZXNzYWdlDQotICAgICAgICB9DQotDQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc1JlcXVpcmVkTWVzc2FnZSk7DQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTa2lwYWJsZVZhbGlkYXRpb25TdHJhdGVneShDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50Q2xhc3MgOiBnZXRTa2lwVmFsaWRhdGlvblN1cHBvcnRDbGFzc0xpc3QoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoaXNTa2lwVmFsaWRhdGlvblN1cHBvcnRlZChjdXJyZW50Q2xhc3MsIHRhcmdldENsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvY2Vzc01ldGFEYXRhRW50cnlBZnRlclNraXBWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHRhcmdldENsYXNzLCBNZXRhRGF0YUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gaXNTa2lwYWJsZVZhbGlkYXRpb25TdHJhdGVneSh0YXJnZXRDbGFzcykgJiYNCi0gICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhlbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5TS0lQX1ZBTElEQVRJT04sIEJvb2xlYW4uY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8Q2xhc3M+IGdldFNraXBWYWxpZGF0aW9uU3VwcG9ydENsYXNzTGlzdCgpDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IHN0YXRpY0NvbmZpZ3VyYXRpb25MaXN0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlNLSVBfVkFMSURBVElPTl9TVVBQT1JUX0NPTkZJRyk7DQotDQotICAgICAgICBMaXN0PENsYXNzPiBtYXJrZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzczsNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gY3VycmVudEVudHJ5IDogc3RhdGljQ29uZmlndXJhdGlvbkxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IGN1cnJlbnRDb25maWd1cmF0aW9uRW50cnkgOiBjdXJyZW50RW50cnkuZ2V0TWFwcGluZygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudENsYXNzID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUoY3VycmVudENvbmZpZ3VyYXRpb25FbnRyeS5nZXRUYXJnZXQoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q2xhc3MgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbWFya2VyTGlzdC5hZGQoY3VycmVudENsYXNzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChMT0dHRVIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi53YXJuKCJjb25maWd1cmF0aW9uIGVudHJ5IHByb3ZpZGVzIGFuIGludmFsaWQgZW50cnk6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY3VycmVudENvbmZpZ3VyYXRpb25FbnRyeS5nZXRUYXJnZXQoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWFya2VyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTa2lwVmFsaWRhdGlvblN1cHBvcnRlZChDbGFzcyBjdXJyZW50Q2xhc3MsIENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZiAoY3VycmVudENsYXNzLmlzQW5ub3RhdGlvbigpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh0YXJnZXRDbGFzcy5pc0Fubm90YXRpb25QcmVzZW50KGN1cnJlbnRDbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGN1cnJlbnRDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRhcmdldENsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgZ2V0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpDQotICAgIHsNCi0gICAgICAgIGlmKGlzVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rpb25EZWFjdGl2YXRlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpIHsNCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4oKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5KQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIDxUPiBMaXN0PFQ+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzczxUPiB2YWx1ZVR5cGUpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFQ+KCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIDxUPiBUIGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzczxUPiB2YWx1ZVR5cGUsIENsYXNzIHZhbHVlSWQpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkuZ2V0RmFjdG9yeSgNCi0gICAgICAgICAgICAgICAgRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZLCBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKENsYXNzIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgIENsYXNzTWFwcGluZ0ZhY3Rvcnk8Q2xhc3MsIENsYXNzPiB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5LmNyZWF0ZShzb3VyY2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdGlvbkRlYWN0aXZhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX1ZBTElEQVRJT05fUEFSQU1FVEVSUyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGV4ZWN1dGVMb2NhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHByb3BlcnRpZXMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0gZ2V0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpLmV4dHJhY3QoDQotICAgICAgICAgICAgICAgIGFubm90YXRpb24sIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLCBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcyk7DQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7DQotDQotICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5TWFwLnB1dChwcm9wZXJ0eUtleSwgcHJvcGVydGllcyk7DQotICAgICAgICB9DQotICAgICAgICBwcm9wZXJ0eU1hcC5wdXQoQW5ub3RhdGlvbi5jbGFzcy5nZXROYW1lKCksIGFubm90YXRpb24pOw0KLQ0KLSAgICAgICAgZm9yIChQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA6IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIXByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgICAgICAgICAgICAgICAgICAuYmVmb3JlVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHByb3BlcnR5TWFwKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGV4ZWN1dGVMb2NhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5S2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwcm9wZXJ0aWVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0gZ2V0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpLmV4dHJhY3QoDQotICAgICAgICAgICAgICAgIGFubm90YXRpb24sIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLCBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcyk7DQotDQotICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5TWFwLnB1dChwcm9wZXJ0eUtleSwgcHJvcGVydGllcyk7DQotICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KEFubm90YXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgOiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlNYXApOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJpcyByZW5hbWluZyBvaz8iKQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXhlY3V0ZUdsb2JhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwcm9wZXJ0aWVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgbW9kdWxlS2V5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7DQotDQotICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5TWFwLnB1dChwcm9wZXJ0eUtleSwgcHJvcGVydGllcyk7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IobW9kdWxlS2V5KTsNCi0NCi0gICAgICAgIGZvciAoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgOiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLSAgICAgICAgICAgICAgICAgICAgLmJlZm9yZVZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eU1hcCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJpcyByZW5hbWluZyBvaz8iKQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5S2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcHJvcGVydGllcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgbW9kdWxlS2V5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5TWFwLnB1dChwcm9wZXJ0eUtleSwgcHJvcGVydGllcyk7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IobW9kdWxlS2V5KTsNCi0NCi0gICAgICAgIGZvciAoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgOiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlNYXApOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgZ2V0U3RvcmFnZShDbGFzczxUPiBzdG9yYWdlVHlwZSwgU3RyaW5nIHN0b3JhZ2VOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFQpIGdldFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSgpLmNyZWF0ZShzdG9yYWdlVHlwZSkuY3JlYXRlKHN0b3JhZ2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRTdG9yYWdlKENsYXNzIHN0b3JhZ2VUeXBlLCBTdHJpbmcgc3RvcmFnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIGdldFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSgpLmNyZWF0ZShzdG9yYWdlVHlwZSkucmVzZXQoc3RvcmFnZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIENsYXNzTWFwcGluZ0ZhY3Rvcnk8Q2xhc3MsIFN0b3JhZ2VNYW5hZ2VyPiBnZXRTdG9yYWdlTWFuYWdlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFRyYW5zZm9ybWVkTWV0YURhdGEoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRUcmFuc2Zvcm1lZE1ldGFEYXRhRm9yKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRUcmFuc2Zvcm1lZE1ldGFEYXRhRm9yKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBDbGFzcyBtb2R1bGVLZXkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgaWYobW9kdWxlS2V5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCksIG1vZHVsZUtleSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZ2V0VHJhbnNmb3JtZWRNZXRhRGF0YVdpdGgoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgcHJvcGVydGllcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFRyYW5zZm9ybWVkTWV0YURhdGFXaXRoKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotICAgICAgICBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvciBza2lwVmFsaWRhdGlvbkV2YWx1YXRvciA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKCk7DQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yV2l0aChwcm9wZXJ0aWVzKTsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGE7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhUmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGFEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gdHJhbnNmb3JtTWV0YURhdGEoDQotICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblN0cmF0ZWd5LCBza2lwVmFsaWRhdGlvbkV2YWx1YXRvciwgbWV0YURhdGEsIGVudHJ5KTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKCFpc0NvbXBvbmVudEluaXRpYWxpemF0aW9uU2tpcHBlZChtZXRhRGF0YSwgZW50cnksIHZhbGlkYXRpb25TdHJhdGVneSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vZG9uJ3QgYnJlYWsgbWF5YmUgdGhlcmUgYXJlIGNvbnN0cmFpbnRzIHdoaWNoIGRvbid0IHN1cHBvcnQgdGhlIHNraXAtbWVjaGFuaXNtDQotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YVJlc3VsdC5wdXRBbGwobWV0YURhdGEpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhUmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEsIE1ldGFEYXRhRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmICghc2tpcFZhbGlkYXRpb25FdmFsdWF0b3Iuc2tpcFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblN0cmF0ZWd5LCBlbnRyeSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyID0gZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckZvclZhbGlkYXRpb25TdHJhdGVneSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIExPR0dFUi5kZWJ1ZyhtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWV0YURhdGEgPSBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAobWV0YURhdGEgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbWV0YURhdGE7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvbXBvbmVudEluaXRpYWxpemF0aW9uU2tpcHBlZChNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhLCBNZXRhRGF0YUVudHJ5IGVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YS5pc0VtcHR5KCkgfHwNCi0gICAgICAgICAgICAgICAgKEJvb2xlYW4uVFJVRS5lcXVhbHMoZW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCBCb29sZWFuLmNsYXNzKSkgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICBpc1NraXBhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKSkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpDQotICAgIHsNCi0gICAgICAgIC8vdG8gZGVhY3RpdmF0ZTogdGhlIHBhcmFtZXRlciBoYXMgdG8gYmUgZXhwbGljaXRseSBmYWxzZQ0KLSAgICAgICAgcmV0dXJuICEiZmFsc2UiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLklOVEVSUFJFVF9FTVBUWV9TVFJJTkdfU1VCTUlUVEVEX1ZBTFVFU19BU19OVUxMKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVFbXB0eUZpZWxkcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAhImZhbHNlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFBhcmFtZXRlci5WQUxJREFURV9FTVBUWV9GSUVMRFMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHlEZXRhaWxzIGdldFByb3BlcnR5RGV0YWlscyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvVGhyb3dWYWxpZGF0b3JFeGNlcHRpb25Gb3JDb21wb25lbnRJZCgNCi0gICAgICAgICAgICBTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpDQotICAgIHsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IGZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgdHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudCh0YXJnZXRDb21wb25lbnQsIGZhY2VzTWVzc2FnZSwgdGhyb3dhYmxlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudCgNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkNCi0gICAgew0KLSAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBpbnRlcnByZXRlciA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBpZiAoaW50ZXJwcmV0ZXIuc2V2ZXJpdHlDYXVzZXNWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh0aHJvd2FibGUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc01lc3NhZ2UsIHRocm93YWJsZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudCh1aUNvbXBvbmVudCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50SWQoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBVSUNvbXBvbmVudCB0YXJnZXRDb21wb25lbnQgPSBmaW5kQ29tcG9uZW50KGNsaWVudElkKTsNCi0NCi0gICAgICAgIGlmICh0YXJnZXRDb21wb25lbnQgPT0gbnVsbCAmJiBjbGllbnRJZCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvclRlc3RDbGllbnRJZChjbGllbnRJZCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICB0cnlUb0FkZFZpb2xhdGlvbk1lc3NhZ2VGb3JDb21wb25lbnQodGFyZ2V0Q29tcG9uZW50LCBmYWNlc01lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJyZXF1aXJlZCBmb3IgdGVzdCBmcmFtZXdvcmtzIC0gZ29hbDogcmVtb3ZlIGl0IikNCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0cnlUb0FkZFZpb2xhdGlvbk1lc3NhZ2VGb3JUZXN0Q2xpZW50SWQoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGludGVycHJldGVyID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIGlmIChpbnRlcnByZXRlci5zZXZlcml0eUNhdXNlc1Zpb2xhdGlvbk1lc3NhZ2UoZmFjZXNDb250ZXh0LCBudWxsLCBmYWNlc01lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkRmFjZXNNZXNzYWdlKGNsaWVudElkLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50KG51bGwsIGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBpbnRlcnByZXRlciA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBpZiAoaW50ZXJwcmV0ZXIuc2V2ZXJpdHlDYXVzZXNWaW9sYXRpb25NZXNzYWdlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGZhY2VzTWVzc2FnZS5nZXRTZXZlcml0eSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodWlDb21wb25lbnQgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFkZEZhY2VzTWVzc2FnZSh1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRGYWNlc01lc3NhZ2UobnVsbCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICB0cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnQodWlDb21wb25lbnQsIGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBhZGRGYWNlc01lc3NhZ2UobnVsbCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRmFjZXNNZXNzYWdlKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlU3RvcmFnZSBzdG9yYWdlID0gZ2V0U3RvcmFnZShGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLCBGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBpZiAoc3RvcmFnZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0b3JhZ2UuYWRkRmFjZXNNZXNzYWdlKGNsaWVudElkLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5hZGRNZXNzYWdlKGNsaWVudElkLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnRJZChTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IGZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgdHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50KHRhcmdldENvbXBvbmVudCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGludGVycHJldGVyID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIGlmIChpbnRlcnByZXRlci5zZXZlcml0eUJsb2Nrc05hdmlnYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5yZW5kZXJSZXNwb25zZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXZlcml0eUJsb2Nrc1N1Ym1pdEZvckNvbXBvbmVudElkKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBpbnRlcnByZXRlciA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBVSUNvbXBvbmVudCB0YXJnZXRDb21wb25lbnQgPSBmaW5kQ29tcG9uZW50KGNsaWVudElkKTsNCi0NCi0gICAgICAgIHJldHVybiBpbnRlcnByZXRlci5zZXZlcml0eUJsb2Nrc1N1Ym1pdChmYWNlc0NvbnRleHQsIHRhcmdldENvbXBvbmVudCwgZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCkpOw0KLSAgICB9DQotDQotICAgIC8vYXZhaWxhYmxlIGZvciBhZGQtb25zIC0gbm90IHVzZWQgaW50ZXJuYWxseSBkdWUgdG8gcGVyZm9ybWFuY2UgcmVhc29ucw0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2V2ZXJpdHlTaG93c0luZGljYXRpb25Gb3JDb21wb25lbnRJZChTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gZmluZENvbXBvbmVudChjbGllbnRJZCk7DQotDQotICAgICAgICByZXR1cm4gaW50ZXJwcmV0ZXIuc2V2ZXJpdHlTaG93c0luZGljYXRpb24oZmFjZXNDb250ZXh0LCB0YXJnZXRDb21wb25lbnQsIGZhY2VzTWVzc2FnZS5nZXRTZXZlcml0eSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBVSUNvbXBvbmVudCBmaW5kQ29tcG9uZW50KFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgICAgIGlmIChjbGllbnRJZCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldENvbXBvbmVudCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRhcmdldENvbXBvbmVudDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQHJldHVybiB0cnVlIGlmIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbiBmb3IgcmVxdWlyZWQgdmFsaWRhdGlvbiBpcyBhY3RpdmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25BY3RpdmUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFLmVxdWFscyhFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eSgibW9kZTppbml0OnJlcXVpcmVkIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBuZWVkZWQgZm9yIHNvbWUgY29tcG9uZW50IGxpYnMgLSBpZiByZXF1aXJlZCBpbml0aWFsaXphdGlvbiBpcyB1c2VkIGUuZy4gZm9yIHZpc3VhbCBpbmRpY2F0b3JzDQotICAgICAqIGJ1dCBmZWF0dXJlcyBsaWtlIHNldmVyaXR5IGF3YXJlIHZhbGlkYXRpb24gYXJlbid0IHVzZWQuDQotICAgICAqIGluIHN1Y2ggYSBjYXNlIGl0J3MgcG9zc2libGUgdG8gdXNlIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGUuDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuIGZhbHNlIHRvIGRlYWN0aXZhdGUgdGhlIGZpbmFsIHJlc2V0IG9mIHRoZSB2YWx1ZSBvZiB0aGUgcmVxdWlyZWQgYXR0cmlidXRlDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZXF1aXJlZFJlc2V0QWN0aXZhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRS5lcXVhbHMoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoIm1vZGU6cmVzZXQ6cmVxdWlyZWQiKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0U3RhZ2VOYW1lIGdldERlZmF1bHRTdGFnZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY3JlYXRlUHJvamVjdFN0YWdlTmFtZSgiUHJvZHVjdGlvbiIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdFN0YWdlTmFtZSBjcmVhdGVQcm9qZWN0U3RhZ2VOYW1lKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRGVmYXVsdFByb2plY3ROYW1lLmNyZWF0ZVByb2plY3RTdGFnZU5hbWUobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXh0VmFsRGVhY3RpdmF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoU3lzdGVtDQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSArDQotICAgICAgICAgICAgICAgICAgICAiLkRFQUNUSVZBVEVfQUxMIiwgImZhbHNlIikpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvR3JvdXBVdGlscy5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Hcm91cFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NWVhYjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Hcm91cFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEdyb3VwVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEdyb3VwS2V5KFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNsaWVudElkID09IG51bGwgPyB2aWV3SWQgOiB2aWV3SWQgKyAiQCIgKyBjbGllbnRJZDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0pzZlV0aWxzLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0pzZlV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3Nzk4NzUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5GYWNlc0luZm9ybWF0aW9uU3RvcmFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5mYWNlcy5saWZlY3ljbGUuTGlmZWN5Y2xlOwotaW1wb3J0IGphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGVGYWN0b3J5OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgSnNmVXRpbHMKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3RlclBoYXNlTGlzdGVuZXIoUGhhc2VMaXN0ZW5lciBwaGFzZUxpc3RlbmVyKQotICAgIHsKLSAgICAgICAgTGlmZWN5Y2xlRmFjdG9yeSBsaWZlY3ljbGVGYWN0b3J5ID0gKExpZmVjeWNsZUZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEZhY3RvcnlGaW5kZXIuTElGRUNZQ0xFX0ZBQ1RPUlkpOwotCi0gICAgICAgIFN0cmluZyBjdXJyZW50SWQ7Ci0gICAgICAgIExpZmVjeWNsZSBjdXJyZW50TGlmZWN5Y2xlOwotICAgICAgICBJdGVyYXRvciBsaWZlY3ljbGVJZHMgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZUlkcygpOwotICAgICAgICB3aGlsZSAobGlmZWN5Y2xlSWRzLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudElkID0gKFN0cmluZykgbGlmZWN5Y2xlSWRzLm5leHQoKTsKLSAgICAgICAgICAgIGN1cnJlbnRMaWZlY3ljbGUgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZShjdXJyZW50SWQpOwotICAgICAgICAgICAgY3VycmVudExpZmVjeWNsZS5yZW1vdmVQaGFzZUxpc3RlbmVyKHBoYXNlTGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyUGhhc2VMaXN0ZW5lcihQaGFzZUxpc3RlbmVyIHBoYXNlTGlzdGVuZXIpCi0gICAgewotICAgICAgICBMaWZlY3ljbGVGYWN0b3J5IGxpZmVjeWNsZUZhY3RvcnkgPSAoTGlmZWN5Y2xlRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRmFjdG9yeUZpbmRlci5MSUZFQ1lDTEVfRkFDVE9SWSk7Ci0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRJZDsKLSAgICAgICAgTGlmZWN5Y2xlIGN1cnJlbnRMaWZlY3ljbGU7Ci0gICAgICAgIEl0ZXJhdG9yIGxpZmVjeWNsZUlkcyA9IGxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlSWRzKCk7Ci0gICAgICAgIHdoaWxlIChsaWZlY3ljbGVJZHMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjdXJyZW50SWQgPSAoU3RyaW5nKSBsaWZlY3ljbGVJZHMubmV4dCgpOwotICAgICAgICAgICAgY3VycmVudExpZmVjeWNsZSA9IGxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlKGN1cnJlbnRJZCk7Ci0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlLmFkZFBoYXNlTGlzdGVuZXIocGhhc2VMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKQotICAgIHsKLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsKLQotICAgICAgICByZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEZhY2VzTWVzc2FnZS5GQUNFU19NRVNTQUdFUywgZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0Q3VzdG9tRmFjZXNNZXNzYWdlQnVuZGxlKCkKLSAgICB7Ci0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBidW5kbGVOYW1lID0gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZ2V0TWVzc2FnZUJ1bmRsZSgpOwotCi0gICAgICAgIGlmIChidW5kbGVOYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShidW5kbGVOYW1lLCBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZUZyb21BcHBsaWNhdGlvbk1lc3NhZ2VCdW5kbGUoU3RyaW5nIG1lc3NhZ2VLZXkpCi0gICAgewotICAgICAgICBSZXNvdXJjZUJ1bmRsZSBjdXN0b21SZXNvdXJjZUJ1bmRsZSA9IGdldEN1c3RvbUZhY2VzTWVzc2FnZUJ1bmRsZSgpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY3VzdG9tUmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9tUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKG1lc3NhZ2VLZXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy9ubyBjdXN0b20gbWVzc2FnZSBpcyBhdmFpbGFibGUgLSBkbyBub3RoaW5nCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpLmdldFN0cmluZyhtZXNzYWdlS2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZW5kZXJSZXNwb25zZVBoYXNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQaGFzZUlkLlJFTkRFUl9SRVNQT05TRS5lcXVhbHMoZ2V0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UoKS5nZXRDdXJyZW50UGhhc2VJZCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFBoYXNlSWQgZ2V0Q3VycmVudFBoYXNlSWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlKCkuZ2V0Q3VycmVudFBoYXNlSWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzaW1wbGUgdGVzdCBmb3IgZWFybHkgY29uZmlnIGluIGNhc2Ugb2YgbW9qYXJyYQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUganNmIGltcGwuIGlzIGluaXRpYWxpemVkIGFuZCBpdCdzIHBvc3NpYmxlIHRvIHVzZSBpdCBhcyBleHBlY3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FwcGxpY2F0aW9uSW5pdGlhbGl6ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRDbGFzcygpLmdldE5hbWUoKS5zdGFydHNXaXRoKCJvcmcuYXBhY2hlLm15ZmFjZXMiKSB8fAotICAgICAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIUZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlIGdldEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLCBGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUHJveHlVdGlscy5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Qcm94eVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NWMyM2UuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Qcm94eVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHkuUHJveHlIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5LkRlZmF1bHRQcm94eUhlbHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJveHlVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgUHJveHlIZWxwZXIgcHJveHlIZWxwZXI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IENsYXNzPFQ+IGdldFVucHJveGllZENsYXNzKENsYXNzIGN1cnJlbnRDbGFzcywgQ2xhc3M8VD4gdGFyZ2V0VHlwZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFByb3h5SGVscGVyKCkuZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudENsYXNzLCB0YXJnZXRUeXBlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldFVucHJveGllZENsYXNzKENsYXNzIGN1cnJlbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFByb3h5SGVscGVyKCkuZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudENsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGFzc05hbWUoQ2xhc3MgcHJveGllZENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UHJveHlIZWxwZXIoKS5nZXROYW1lT2ZDbGFzcyhwcm94aWVkQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsYXNzTmFtZU9mT2JqZWN0KE9iamVjdCBwcm94aWVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UHJveHlIZWxwZXIoKS5nZXRDbGFzc05hbWVPZk9iamVjdChwcm94aWVkT2JqZWN0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UHJveHlIZWxwZXIoKS5pc1Byb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb3hpZWRPYmplY3QoT2JqZWN0IHByb3hpZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRQcm94eUhlbHBlcigpLmlzUHJveGllZE9iamVjdChwcm94aWVkT2JqZWN0KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBQcm94eUhlbHBlciBnZXRQcm94eUhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmIChwcm94eUhlbHBlciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vd29ya2Fyb3VuZCBmb3IgbW9qYXJyYQ0KLSAgICAgICAgICAgIGlmKCFKc2ZVdGlscy5pc0FwcGxpY2F0aW9uSW5pdGlhbGl6ZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFByb3h5SGVscGVyKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByb3h5SGVscGVyID0gY3JlYXRlUHJveHlIZWxwZXIoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBwcm94eUhlbHBlcjsNCi0gICAgfQ0KLQ0KLSAgICAvL2Rvbid0IHVzZSB0aGUgZGVmYXVsdCBhcHByb2FjaCAoZmFjdG9yeSBmaW5kZXIpIC0gUHJveHlIZWxwZXIgaXMgY2FsbGVkIHRvbyBvZnRlbi4uLg0KLSAgICBwcml2YXRlIHN0YXRpYyBQcm94eUhlbHBlciBjcmVhdGVQcm94eUhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjdXN0b21Qcm94eUhlbHBlckNsYXNzTmFtZSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fUFJPWFlfSEVMUEVSOw0KLQ0KLSAgICAgICAgUHJveHlIZWxwZXIgcmVzdWx0ID0gbnVsbDsNCi0gICAgICAgIGlmKGN1c3RvbVByb3h5SGVscGVyQ2xhc3NOYW1lICE9IG51bGwgJiYgISIiLmVxdWFscyhjdXN0b21Qcm94eUhlbHBlckNsYXNzTmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gKFByb3h5SGVscGVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjdXN0b21Qcm94eUhlbHBlckNsYXNzTmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBuZXcgRGVmYXVsdFByb3h5SGVscGVyKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1JlZmxlY3Rpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTA2MmJmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBSZWZsZWN0aW9uVXRpbHMKLXsKLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCB0cnlUb0dldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ5VG9HZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIHRyeVRvR2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0TWV0aG9kTmFtZSwgQ2xhc3MuLi4gcGFyYW1ldGVyVHlwZXMpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldE1ldGhvZCh0YXJnZXRDbGFzcywgdGFyZ2V0TWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUpCi0gICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUsIENsYXNzLi4uIHBhcmFtZXRlclR5cGVzKQotICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSB0YXJnZXRDbGFzczsKLSAgICAgICAgTWV0aG9kIHRhcmdldE1ldGhvZCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAoIU9iamVjdC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0YXJnZXRNZXRob2QgPSBjdXJyZW50Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QodGFyZ2V0TWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50SW50ZXJmYWNlIDogdGFyZ2V0Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRJbnRlcmZhY2U7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudENsYXNzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gY3VycmVudENsYXNzLmdldERlY2xhcmVkTWV0aG9kKHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudENsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0TWV0aG9kOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbigidGhlcmUgaXMgbm8gbWV0aG9kIHdpdGggdGhlIG5hbWUgJyIgKyB0YXJnZXRNZXRob2ROYW1lICsgIiciICsKLSAgICAgICAgICAgICAgICAiIGNsYXNzOiAiICsgdGFyZ2V0Q2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvSW52b2tlTWV0aG9kKHRhcmdldCwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvSW52b2tlTWV0aG9kT2ZDbGFzcyh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kT2ZDbGFzcyh0YXJnZXQsIG1ldGhvZCwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldC5uZXdJbnN0YW5jZSgpLCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kLCBPYmplY3QuLi4gYXJncykKLSAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0Lm5ld0luc3RhbmNlKCksIG1ldGhvZCwgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldCwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgewotICAgICAgICBtZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2UodGFyZ2V0LCBhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKE9iamVjdCBiYXNlT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlDaGFpbikKLSAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHByb3BlcnR5Q2hhaW4sICIuIik7Ci0KLSAgICAgICAgT2JqZWN0IGN1cnJlbnRCYXNlID0gYmFzZU9iamVjdDsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnRQcm9wZXJ0eTsKLSAgICAgICAgTWV0aG9kIGN1cnJlbnRNZXRob2Q7Ci0KLSAgICAgICAgd2hpbGUodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudFByb3BlcnR5ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCi0gICAgICAgICAgICAvL2lnbm9yZSB0aGUgbGFzdCBwcm9wZXJ0eQotICAgICAgICAgICAgaWYoIXRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vbm8gaXMgLSBpdCdzIG9ubHkgcG9zc2libGUgYXQgcHJvcGVydGllcyBub3QgYXQgYmVhbiBsZXZlbAotICAgICAgICAgICAgY3VycmVudE1ldGhvZCA9IHRyeVRvR2V0TWV0aG9kKFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudEJhc2UuZ2V0Q2xhc3MoKSksCi0gICAgICAgICAgICAgICAgImdldCIgKyBjdXJyZW50UHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50UHJvcGVydHkuc3Vic3RyaW5nKDEsIGN1cnJlbnRQcm9wZXJ0eS5sZW5ndGgoKSkpOwotICAgICAgICAgICAgY3VycmVudEJhc2UgPSB0cnlUb0ludm9rZU1ldGhvZChjdXJyZW50QmFzZSwgY3VycmVudE1ldGhvZCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY3VycmVudEJhc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjA3NjljLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvV2ViWG1sVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgV2ViWG1sVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEluaXRQYXJhbWV0ZXIoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEluaXRQYXJhbWV0ZXIoRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCwga2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZSA9IG5hbWU7DQotICAgICAgICBpZihwcmVmaXggIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwYXJhbWV0ZXJOYW1lID0gcHJlZml4ICsgIi4iICsgbmFtZTsNCi0gICAgICAgIH0NCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRJbml0UGFyYW1ldGVyKHBhcmFtZXRlck5hbWUpOw0KLSAgICAgICAgcmV0dXJuICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlLnJlcGxhY2UoIiAiLCAiIikudHJpbSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9jb3JlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMDkyZmIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2NvcmUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlIE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlIE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUgTW9kdWxlIHByb3ZpZGVzIGFuIGV4dGVuc2libGUgdmFsaWRhdGlvbiBwbGF0Zm9ybSB0byBpbXBsZW1lbnQgdmFsaWRhdGlvbiBiYXNlZCBvbiBtZXRhLWRhdGEuDQotICAgIEJhc2VkIG9uIHRoaXMgbW9kdWxlIGl0IGlzIHBvc3NpYmxlIHRvIGltcGxlbWVudCB2YWxpZGF0aW9uIG1vZHVsZXMuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLnggYW5kIEpTRiAyLnguIEFsbCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9wb20ueG1sIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMWRkMDEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEV4YW1wbGVzIEFzc2VtYmx5PC9uYW1lPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1leGFtcGxlcy1hc3NlbWJseTEyPC9hcnRpZmFjdElkPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8yX3JjL2V4YW1wbGVzL2Fzc2VtYmx5PC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvZXhhbXBsZXMvYXNzZW1ibHk8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8yX3JjL2V4YW1wbGVzL2Fzc2VtYmx5PC91cmw+Ci0gICAgPC9zY20+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5kZXBlbmRlbmN5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LXdhcjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd2FyPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktc3JjPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fd29ybGQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXZhLXNvdXJjZTwvdHlwZT4gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmVhdHVyZS1zZXRfMDE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXZhLXNvdXJjZTwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc3JjPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPiAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBFWEVDVVRFIG12biBwYWNrYWdlIHRvIGdlbmVyYXRlIGFzc2VtYmx5IGZpbGVzIC0tPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9zcmM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmFzc2VtYmx5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4gICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwtZXhhbXBsZXMtJHtwcm9qZWN0LnZlcnNpb259LXNyYzwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfYmluPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hc3NlbWJseTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0JICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+ICAgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWw8L2Rlc2NyaXB0b3I+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsLWV4YW1wbGVzLSR7cHJvamVjdC52ZXJzaW9ufTwvZmluYWxOYW1lPgotCSAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd29yazwvd29ya0RpcmVjdG9yeT4KLQkgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0JICAgIAotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+d2Fnb24tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aWQ+bXlmYWNlcy1uaWdodGx5LWJ1aWxkczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vbWlub3RhdXIuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvYnVpbGRzL215ZmFjZXMvbmlnaHRseTwvdXJsPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9pbnB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICA8L3BsdWdpbnM+Ci0KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGY3YjgxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+YmluPC9pZD4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+CQotICA8ZmlsZVNldHM+ICAgIAotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvd2FyPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLndhcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PiAgICAgCi0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWwgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU3MGNjYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPGlkPnNyYzwvaWQ+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgkKLSAgPGZpbGVTZXRzPiAgICAKLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3NyYzwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLnR4dDwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDViM2E1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBmMzYzYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3BvbS54bWwgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQwODBkNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmVhdHVyZS1zZXRfMDE8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgZmVhdHVyZS1zZXQgMDE8L25hbWU+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5mYWNlbGV0czwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtZmFjZWxldHM8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE0PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmVsLWltcGw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRvbWFoYXdrPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRvbWFoYXdrPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS42PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2MWNmOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2N1c3RvbS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwMWRmNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0jIHRoaXMgbWVzc2FnZSBidW5kbGUgaXMgcGlja2VkIHVwIHZpYSBjb252ZW50aW9uDQotcmVwZWF0ZWRfcGFzc3dvcmRfcmVxdWlyZWQ9cGxlYXNlIHJldHlwZSB0aGUgcGFzc3dvcmQNCi1yZXBlYXRlZF9wYXNzd29yZF9yZXF1aXJlZF9kZXRhaWw9cGxlYXNlIHJldHlwZSB0aGUgcGFzc3dvcmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNTExZGUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRGF0ZUlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXNUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5Ob3RFcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbDsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVGVtcG9yYWxUeXBlOw0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi1wdWJsaWMgY2xhc3MgUGVyc29uDQotew0KLSAgICBATGVuZ3RoKG1pbmltdW0gPSAyKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDIwKQ0KLSAgICBATm90RXF1YWxzKCJsYXN0TmFtZSIpDQotICAgIEBQYXR0ZXJuKCJbQS1aXVthLXpdKyIpDQotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsNCi0NCi0gICAgQFJlcXVpcmVkKHBhcmFtZXRlcnMgPSBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpDQotICAgIEBMZW5ndGgobWluaW11bSA9IDIsIHBhcmFtZXRlcnMgPSBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpDQotICAgIEBDb2x1bW4obGVuZ3RoID0gMjApDQotICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsNCi0NCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcm9sZSA9ICJ1c2VyIjsNCi0NCi0gICAgQERhdGVJcyh0eXBlID0gRGF0ZUlzVHlwZS5iZWZvcmUsIHZhbHVlT2YgPSAiZmluYWxFeGFtIikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlKQ0KLSAgICBAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLkRBVEUpDQotICAgIHByaXZhdGUgRGF0ZSBiaXJ0aGRheTsNCi0NCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlKQ0KLSAgICBAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLkRBVEUpDQotICAgIHByaXZhdGUgRGF0ZSBmaW5hbEV4YW07DQotDQotICAgIEBMZW5ndGgobWluaW11bSA9IDIpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIG5pY2tOYW1lOw0KLQ0KLSAgICBATGVuZ3RoKG1pbmltdW0gPSA2KQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDYwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBlbWFpbDsNCi0NCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlKQ0KLSAgICBwcml2YXRlIGludCBudW1iZXJPZlNpYmxpbmdzOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Rmlyc3ROYW1lKFN0cmluZyBmaXJzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbGFzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJvbGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcm9sZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRSb2xlKFN0cmluZyByb2xlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnJvbGUgPSByb2xlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldEJpcnRoZGF5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGJpcnRoZGF5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEJpcnRoZGF5KERhdGUgYmlydGhkYXkpDQotICAgIHsNCi0gICAgICAgIHRoaXMuYmlydGhkYXkgPSBiaXJ0aGRheTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXRGaW5hbEV4YW0oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmluYWxFeGFtOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEZpbmFsRXhhbShEYXRlIGZpbmFsRXhhbSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maW5hbEV4YW0gPSBmaW5hbEV4YW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROaWNrTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuaWNrTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROaWNrTmFtZShTdHJpbmcgbmlja05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmlja05hbWUgPSBuaWNrTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVtYWlsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKFN0cmluZyBlbWFpbCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5lbWFpbCA9IGVtYWlsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZTaWJsaW5ncygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBudW1iZXJPZlNpYmxpbmdzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlck9mU2libGluZ3MoaW50IG51bWJlck9mU2libGluZ3MpDQotICAgIHsNCi0gICAgICAgIHRoaXMubnVtYmVyT2ZTaWJsaW5ncyA9IG51bWJlck9mU2libGluZ3M7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNzQ0MjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5ndWkuYmVhbnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uTm90RXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxvbmdSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5jdXN0b20uZW1haWx2YWxpZGF0b3IuRW1haWxWYWxpZGF0b3I7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvblBhZ2UNCi17DQotDQotICAgIC8vdGhlIG9sZCBwYXNzd29yZCBvZiB0aGUgcGVyc29uIGlzbid0IHVzZWQgd2l0aGluIHRoZSBwYWdlDQotICAgIC8vLT4gdmFsaWRhdGUgd2l0aCB2YWx1ZSBvZiB0aGUgbW9kZWwNCi0gICAgQFNraXBWYWxpZGF0aW9uKCIje3BlcnNvbi5yb2xlIGVxICdhZG1pbid9IikNCi0gICAgQFJlcXVpcmVkDQotICAgIEBFcXVhbHMoInBlcnNvbi5wYXNzd29yZCIpDQotICAgIEBOb3RFcXVhbHMoInBhc3N3b3JkIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgb2xkUGFzc3dvcmQ7DQotDQotICAgIEBFcXVhbHMoInBhc3N3b3JkUmVwZWF0ZWQiKQ0KLSAgICAvL2NvbWJpbmUgZ3VpIHJlbGF0ZWQgYW5ub3RhdGlvbnMgd2l0aCB0aGUgYW5ub2F0aW9ucyBvZiB0aGUgZG9tYWluIG1vZGVsDQotICAgIEBKb2luVmFsaWRhdGlvbih2YWx1ZSA9ICIje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLnBhc3N3b3JkfSIpDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOw0KLQ0KLSAgICBAUmVxdWlyZWQodmFsaWRhdGlvbkVycm9yTXNnS2V5ID0gInJlcGVhdGVkX3Bhc3N3b3JkX3JlcXVpcmVkIiwNCi0gICAgICAgICAgICBwYXJhbWV0ZXJzID0ge0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcywgVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzc30pDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkUmVwZWF0ZWQ7DQotDQotICAgIC8vdXNlICN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ubmlja05hbWV9LCAje3BlcnNvbi5uaWNrTmFtZX0NCi0gICAgLy91c2UgcmVnaXN0cmF0aW9uUGFnZSB0byBkaXNwbGF5IHRoZSBzZWNvbmQgZXJyb3IgbWVzc2FnZSBhdCBvbGQgbmlja25hbWUNCi0gICAgLy9vciBsb2NhbCBwcm9wZXJ0eSBjaGFpbmluZyAodG8gYXZvaWQgdGhlIHVzYWdlIG9mIHRoZSBiZWFuIG5hbWUpIC0gbGlrZToNCi0gICAgQFNraXBWYWxpZGF0aW9uKCIje3BlcnNvbi5yb2xlIGVxICdhZG1pbid9IikNCi0gICAgQE5vdEVxdWFscygicGVyc29uLm5pY2tOYW1lIikNCi0gICAgQEpvaW5WYWxpZGF0aW9uKCJwZXJzb24ubmlja05hbWUiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBuZXdOaWNrTmFtZTsNCi0NCi0gICAgcHJpdmF0ZSBQZXJzb24gcGVyc29uOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGZpbmlzaCgpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldFBhc3N3b3JkKHRoaXMucGFzc3dvcmQpOw0KLSAgICAgICAgcmV0dXJuICJob21lIjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHVwZGF0ZU5pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0Tmlja05hbWUodGhpcy5uZXdOaWNrTmFtZSk7DQotICAgICAgICByZXR1cm4gImhvbWUiOw0KLSAgICB9DQotDQotICAgIC8vanVzdCBhIHF1aWNrIGlsbHVzdHJhdGlvbiBvZiBza2lwVmFsaWRhdGlvbg0KLSAgICBwdWJsaWMgU3RyaW5nIHN3aXRjaE1vZGUoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VycmVudFJvbGUgPSB0aGlzLnBlcnNvbi5nZXRSb2xlKCk7DQotDQotICAgICAgICBpZihjdXJyZW50Um9sZS5lcXVhbHMoImFkbWluIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5wZXJzb24uc2V0Um9sZSgidXNlciIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMucGVyc29uLnNldFJvbGUoImFkbWluIik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gIiI7DQotICAgIH0NCi0NCi0gICAgQEpvaW5WYWxpZGF0aW9uKCJvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5kb21haW4uUGVyc29uOmVtYWlsIikNCi0gICAgQFZhbGlkYXRvcihFbWFpbFZhbGlkYXRvci5jbGFzcykNCi0gICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbi5nZXRFbWFpbCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKFN0cmluZyBlbWFpbCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0RW1haWwoZW1haWwpOw0KLSAgICB9DQotDQotICAgIEBKb2luVmFsaWRhdGlvbigiI3twZXJzb24ubnVtYmVyT2ZTaWJsaW5nc30iKQ0KLSAgICBATG9uZ1JhbmdlKG1heGltdW0gPSAyMCkNCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNpYmxpbmdzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uLmdldE51bWJlck9mU2libGluZ3MoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXJPZlNpYmxpbmdzKGludCBudW1iZXJPZlNpYmxpbmdzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXROdW1iZXJPZlNpYmxpbmdzKG51bWJlck9mU2libGluZ3MpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRPbGRQYXNzd29yZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBvbGRQYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRPbGRQYXNzd29yZChTdHJpbmcgb2xkUGFzc3dvcmQpDQotICAgIHsNCi0gICAgICAgIHRoaXMub2xkUGFzc3dvcmQgPSBvbGRQYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmRSZXBlYXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZFJlcGVhdGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkUmVwZWF0ZWQoU3RyaW5nIHBhc3N3b3JkUmVwZWF0ZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmRSZXBlYXRlZCA9IHBhc3N3b3JkUmVwZWF0ZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBlcnNvbiBnZXRQZXJzb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGVyc29uOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNvbihQZXJzb24gcGVyc29uKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbiA9IHBlcnNvbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5ld05pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ld05pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5ld05pY2tOYW1lKFN0cmluZyBuZXdOaWNrTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uZXdOaWNrTmFtZSA9IG5ld05pY2tOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjlkZjRmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQwotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMC8vRU4iCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlcy1jb25maWc+Ci0gICAgPGFwcGxpY2F0aW9uPgotICAgICAgICA8IS0tIHRyaW5pZGFkIC0tPgotICAgICAgICA8ZGVmYXVsdC1yZW5kZXIta2l0LWlkPgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvcmUKLSAgICAgICAgPC9kZWZhdWx0LXJlbmRlci1raXQtaWQ+Ci0KLSAgICA8L2FwcGxpY2F0aW9uPgotCi0gICAgPG1hbmFnZWQtYmVhbj4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1uYW1lPnJlZ2lzdHJhdGlvblBhZ2U8L21hbmFnZWQtYmVhbi1uYW1lPgotICAgICAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmd1aS5iZWFucy5SZWdpc3RyYXRpb25QYWdlPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPgotCi0gICAgICAgIDxtYW5hZ2VkLXByb3BlcnR5PgotICAgICAgICAgICAgPHByb3BlcnR5LW5hbWU+cGVyc29uPC9wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPHZhbHVlPiN7cGVyc29ufTwvdmFsdWU+Ci0gICAgICAgIDwvbWFuYWdlZC1wcm9wZXJ0eT4KLSAgICA8L21hbmFnZWQtYmVhbj4KLQotICAgIDxtYW5hZ2VkLWJlYW4+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tbmFtZT5wZXJzb248L21hbmFnZWQtYmVhbi1uYW1lPgotICAgICAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb248L21hbmFnZWQtYmVhbi1jbGFzcz4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5zZXNzaW9uPC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0gICAgPC9tYW5hZ2VkLWJlYW4+Ci0KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8ZnJvbS12aWV3LWlkPi9wYWdlcy9ob21lLnhodG1sPC9mcm9tLXZpZXctaWQ+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmFkZFVzZXI8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5jaGFuZ2VOaWNrTmFtZTwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmNoYW5nZVBhc3N3b3JkPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICA8L25hdmlnYXRpb24tcnVsZT4KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8ZnJvbS12aWV3LWlkPio8L2Zyb20tdmlldy1pZD4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+aG9tZTwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL2hvbWUueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgIDwvbmF2aWdhdGlvbi1ydWxlPgotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9tYWluLnRhZ2xpYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMzkzNjYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIGZhY2VsZXQtdGFnbGliIFBVQkxJQwotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEZhY2VsZXQgVGFnbGliIDEuMC8vRU4iCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9mYWNlbGV0LXRhZ2xpYl8xXzAuZHRkIj4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZmFjZWxldC10YWdsaWI+Ci0gICAgPG5hbWVzcGFjZT5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dHZhbC9kZW1vL2NvbXBvbmVudHM8L25hbWVzcGFjZT4KLQotICAgIDx0YWc+Ci0gICAgICAgIDx0YWctbmFtZT51c2VyRm9ybTwvdGFnLW5hbWU+Ci0gICAgICAgIDxzb3VyY2U+Ci0gICAgICAgICAgICAuLi9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbAotICAgICAgICA8L3NvdXJjZT4KLSAgICA8L3RhZz4KLQotPC9mYWNlbGV0LXRhZ2xpYj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWMwMWFhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCi0gICAgICAgICB2ZXJzaW9uPSIyLjQiPgotCi0gICAgPGRlc2NyaXB0aW9uPk15UHJvamVjdCB3ZWIueG1sPC9kZXNjcmlwdGlvbj4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5ERUZBVUxUX1NVRkZJWDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi54aHRtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmZhY2VsZXRzLkxJQlJBUklFUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi9XRUItSU5GL21haW4udGFnbGliLnhtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5FTkFCTEVfTElHSFRXRUlHSFRfRElBTE9HUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRElTQUJMRV9DT05URU5UX0NPTVBSRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5BTFRFUk5BVEVfVklFV19IQU5ETEVSPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y29tLnN1bi5mYWNlbGV0cy5GYWNlbGV0Vmlld0hhbmRsZXI8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuVVNFX0FQUExJQ0FUSU9OX1ZJRVdfQ0FDSEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5DSEFOR0VfUEVSU0lTVEVOQ0U8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5zZXNzaW9uPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBTZWUgSlNGIFNwZWNpZmljYXRpb24gMi41LjMKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNsaWVudDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5OVU1CRVJfT0ZfVklFV1NfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPjIwPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzdGF0ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbSBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uCi0gICAgICAgICAgICBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KSBhbmQgaWYKLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc2VyaWFsaXplZCBzdGF0ZSB3aWxsIGJlIGNvbXByZXNzZWQgYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgY29tcHJlc3NlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUKLSAgICAgICAgICAgIHJlbmRlcmVkIEhUTUwgb3V0cHV0LgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgbm90IGFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFMTE9XX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5ERVRFQ1RfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCByZW5kZXJlZCBIVE1MIGNvZGUgd2lsbCBiZSBmb3JtYXR0ZWQsIHNvIHRoYXQgaXQgaXMgImh1bWFuIHJlYWRhYmxlIi4KLSAgICAgICAgICAgIGkuZS4gYWRkaXRpb25hbCBsaW5lIHNlcGFyYXRvcnMgYW5kIHdoaXRlc3BhY2Ugd2lsbCBiZSB3cml0dGVuLCB0aGF0IGRvIG5vdAotICAgICAgICAgICAgaW5mbHVlbmNlIHRoZSBIVE1MIGNvZGUuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlBSRVRUWV9IVE1MPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlCi0gICAgICAgICAgICBmb3JtZXIgdmVydGljYWwgc2Nyb2xsIG9uIGV2ZXJ5IHJlcXVlc3QuIENvbnZlbmllbnQgZmVhdHVyZSBpZiB5b3UgaGF2ZSBwYWdlcwotICAgICAgICAgICAgd2l0aCBsb25nIGxpc3RzIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGJyb3dzZXIgcGFnZSB0byBhbHdheXMganVtcCB0byB0aGUgdG9wCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuCi0gICAgICAgICAgICBEZWZhdWx0OiAiZmFsc2UiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BVVRPX1NDUk9MTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQotICAgICAgICAgICAgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucwotICAgICAgICAgICAgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IgZGlmZmVuZW50IGVuY3J5cHRpb24gc3RyZW5ndGhzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VDUkVUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+TnpZMU5ETXlNVEE9PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmFsaWRhdGUgbWFuYWdlZCBiZWFucywgbmF2aWdhdGlvbiBydWxlcyBhbmQgZW5zdXJlIHRoYXQgZm9ybXMgYXJlIG5vdCBuZXN0ZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDwhLS0gTGlzdGVuZXIsIHRvIGFsbG93IEpldHR5IHNlcnZpbmcgTXlGYWNlcyBhcHBzIC0tPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy53ZWJhcHAuU3RhcnR1cFNlcnZsZXRDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLndlYmFwcC5SZXNvdXJjZVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPGZpbHRlcj4KLSAgICAgICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlRyaW5pZGFkRmlsdGVyPC9maWx0ZXItY2xhc3M+Ci0gICAgPC9maWx0ZXI+Ci0KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT50cmluaWRhZDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZ3MgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4vZmFjZXMvKjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPnJlc291cmNlczwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+L2FkZi8qPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2JjOTFjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiCi0gICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIgotICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIKLSAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIgotICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPgotCi08dWk6Y29tcG9zaXRpb24+Ci0gICAgPHRyOnBhbmVsRm9ybUxheW91dD4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJuaWNrIG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uWyAnbmlja05hbWUnIF19Ii8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9ImUtbWFpbCIgdmFsdWU9IiN7YmVhbi5lbWFpbH0iLz4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJmaXJzdCBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5maXJzdE5hbWV9Ii8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Imxhc3QgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb24ubGFzdE5hbWV9Ii8+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibGFzdCBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5sYXN0TmFtZX0iIHJlcXVpcmVkTWVzc2FnZURldGFpbD0iezB9IGlzIHJlcXVpcmVkIi8+Ci0gICAgICAgIC0tPgotICAgICAgICA8dHI6aW5wdXREYXRlIGxhYmVsPSJiaXJ0aGRheSIgdmFsdWU9IiN7YmVhbi5wZXJzb24uYmlydGhkYXl9Ij4KLSAgICAgICAgICAgIDx0cjpjb252ZXJ0RGF0ZVRpbWUgdHlwZT0iZGF0ZSIgcGF0dGVybj0iZGQuTU0ueXl5eSIvPgotICAgICAgICA8L3RyOmlucHV0RGF0ZT4KLSAgICAgICAgPHRyOmlucHV0RGF0ZSBsYWJlbD0iZmluYWwgZXhhbSIgdmFsdWU9IiN7YmVhbi5wZXJzb24uZmluYWxFeGFtfSI+Ci0gICAgICAgICAgICA8dHI6Y29udmVydERhdGVUaW1lIHR5cGU9ImRhdGUiIHBhdHRlcm49ImRkLk1NLnl5eXkiLz4KLSAgICAgICAgPC90cjppbnB1dERhdGU+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibnVtYmVyIG9mIHNpYmxpbmdzIiB2YWx1ZT0iI3tiZWFuLm51bWJlck9mU2libGluZ3N9Ii8+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0icGFzc3dvcmQiIHZhbHVlPSIje2JlYW4ucGFzc3dvcmR9IiBzZWNyZXQ9InRydWUiLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0icmUtZW50ZXIgcGFzc3dvcmQiIHZhbHVlPSIje2JlYW4ucGFzc3dvcmRSZXBlYXRlZH0iIHNlY3JldD0idHJ1ZSIvPgotCi0gICAgPC90cjpwYW5lbEZvcm1MYXlvdXQ+Ci08L3VpOmNvbXBvc2l0aW9uPgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWNkMTQ4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLSAgICAgICAgDQotPGh0bWw+DQotDQotPGhlYWQ+DQotICAgIDxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjA7IFVSTD1mYWNlcy9wYWdlcy9ob21lLnhodG1sIj4NCi08L2hlYWQ+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYzFlYTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08dHI6ZG9jdW1lbnQNCi0gICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCINCi0gICAgICAgIHhtbG5zOmM9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanN0bC9jb3JlIj4NCi0gICAgPGY6ZmFjZXQgbmFtZT0ibWV0YUNvbnRhaW5lciI+DQotICAgICAgICA8dGl0bGU+c2V2LWVuIGZlYXR1cmUtc2V0IGRlbW8gMDE8L3RpdGxlPg0KLSAgICA8L2Y6ZmFjZXQ+DQotDQotICAgIDx0cmg6Ym9keT4NCi0NCi0gICAgICAgIDwhLS0gb3JpZ2luYWwgLS0+DQotICAgICAgICA8ZGl2IGlkPSJ3cmFwIj4NCi0NCi0gICAgICAgICAgICA8dHI6Zm9ybSBpZD0iZm9ybSIgZGVmYXVsdENvbW1hbmQ9ImRlZmF1bHRCdXR0b24iPg0KLSAgICAgICAgICAgICAgICA8ZGl2IGlkPSJtYWluIj4NCi0gICAgICAgICAgICAgICAgICAgIDx1aTppbnNlcnQgbmFtZT0iY29udGVudCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idW5kZXJfY29uc3RydWN0aW9uIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPiFzaXRlIHVuZGVyIGNvbnN0cnVjdGlvbiE8L2gyPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgY29udGVudCBvZiB0aGlzIHNpdGUgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgbW9tZW50LjwvcD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgICAgICAgICAgIDwvdWk6aW5zZXJ0Pg0KLSAgICAgICAgICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICAgICAgICA8L3RyOmZvcm0+DQotICAgICAgICAgICAgPHRyOm1lc3NhZ2VzIGdsb2JhbE9ubHk9InRydWUiLz4NCi0NCi0gICAgICAgIDwvZGl2Pg0KLSAgICA8L3RyaDpib2R5Pg0KLQ0KLQ0KLTwvdHI6ZG9jdW1lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2Vfbmlja05hbWUueGh0bWwgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg5M2ZhZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotDQotICAgICAgICA8dHI6cGFuZWxGb3JtTGF5b3V0Pg0KLQ0KLSAgICAgICAgICAgIDx1aTpyZW1vdmU+DQotICAgICAgICAgICAgICAgIGp1c3QgZm9yIHRoZSBkZW1vIHdlIGFyZSB1c2luZyB0d28gaW5wdXQgY29tcG9uZW50cw0KLSAgICAgICAgICAgIDwvdWk6cmVtb3ZlPg0KLSAgICAgICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im9sZCBuaWNrIG5hbWUiIHJlYWRPbmx5PSJ0cnVlIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5uaWNrTmFtZX0iLz4NCi0NCi0gICAgICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJuaWNrIG5hbWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UubmV3Tmlja05hbWV9Ii8+DQotDQotICAgICAgICA8L3RyOnBhbmVsRm9ybUxheW91dD4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9InNhdmUiIGFjdGlvbj0iI3tyZWdpc3RyYXRpb25QYWdlLnVwZGF0ZU5pY2tOYW1lfSIvPg0KLQ0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWwgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9wYXNzd29yZC54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwOTc1YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9wYXNzd29yZC54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotDQotICAgICAgICA8dGFibGU+DQotICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm91dHB1dExhYmVsIHZhbHVlPSJvbGQgcGFzc3dvcmQiIGZvcj0ib2xkX3Bhc3N3b3JkIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjppbnB1dFRleHQgaWQ9Im9sZF9wYXNzd29yZCIgc2ltcGxlPSJ0cnVlIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLm9sZFBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjptZXNzYWdlIGZvcj0ib2xkX3Bhc3N3b3JkIi8+PC90ZD4NCi0gICAgICAgICAgICA8L3RyPg0KLQ0KLSAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjpvdXRwdXRMYWJlbCB2YWx1ZT0ibmV3IHBhc3N3b3JkIiBmb3I9Im5ld19wYXNzd29yZCIvPjwvdGQ+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6aW5wdXRUZXh0IGlkPSJuZXdfcGFzc3dvcmQiIHNpbXBsZT0idHJ1ZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5wYXNzd29yZH0iIHNlY3JldD0idHJ1ZSIvPjwvdGQ+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6bWVzc2FnZSBmb3I9Im5ld19wYXNzd29yZCIvPjwvdGQ+DQotICAgICAgICAgICAgPC90cj4NCi0NCi0gICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6b3V0cHV0TGFiZWwgdmFsdWU9InJlLWVudGVyIHBhc3N3b3JkIiBmb3I9InJlZW50ZXJlZCIvPjwvdGQ+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6aW5wdXRUZXh0IGlkPSJyZWVudGVyZWQiIHNpbXBsZT0idHJ1ZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5wYXNzd29yZFJlcGVhdGVkfSIgc2VjcmV0PSJ0cnVlIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjptZXNzYWdlIGZvcj0icmVlbnRlcmVkIi8+PC90ZD4NCi0gICAgICAgICAgICA8L3RyPg0KLQ0KLSAgICAgICAgPC90YWJsZT4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9InNhdmUiIGFjdGlvbj0iI3tyZWdpc3RyYXRpb25QYWdlLmZpbmlzaH0iLz4NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE3ZWJkOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0iYWRkIHVzZXIiIGFjdGlvbj0iYWRkVXNlciIvPjxici8+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJjaGFuZ2UgbmljayBuYW1lIiBhY3Rpb249ImNoYW5nZU5pY2tOYW1lIi8+PGJyLz4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9ImNoYW5nZSBwYXNzd29yZCIgYWN0aW9uPSJjaGFuZ2VQYXNzd29yZCIvPjxici8+DQotICAgICAgICA8dHI6Y29tbWFuZExpbmsgdGV4dD0ibW9kZTogI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5yb2xlfSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0iI3tyZWdpc3RyYXRpb25QYWdlLnN3aXRjaE1vZGV9IiBpbW1lZGlhdGU9InRydWUiLz4NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZjZiMDYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOmM9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0dmFsL2RlbW8vY29tcG9uZW50cyINCi0gICAgICAgID4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDxjOnVzZXJGb3JtIGJlYW49IiN7cmVnaXN0cmF0aW9uUGFnZX0iLz4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9InNhdmUiIGFjdGlvbj0iI3tyZWdpc3RyYXRpb25QYWdlLmZpbmlzaH0iLz4NCi0NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9wb20ueG1sIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNDI5MGYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWZlYXR1cmUtc2V0XzAyPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIGZlYXR1cmUtc2V0IDAyPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5oaWJlcm5hdGU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGliZXJuYXRlLXZhbGlkYXRvcjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj40LjAuMC5HQTwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS40LjI8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjQuMjwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uZmFjZWxldHM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWZhY2VsZXRzPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xNDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5lbC1pbXBsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2MWNmOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vY29uc3RyYWludHMvQmlydGhkYXkuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2NvbnN0cmFpbnRzL0JpcnRoZGF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYjRlNzIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vY29uc3RyYWludHMvQmlydGhkYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmNvbnN0cmFpbnRzOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuUGFzdDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5BTk5PVEFUSU9OX1RZUEU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi0NCi1AUGFzdA0KLUBOb3ROdWxsDQotDQotQENvbnN0cmFpbnQodmFsaWRhdGVkQnkgPSB7fSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgQU5OT1RBVElPTl9UWVBFfSkNCi1wdWJsaWMgQGludGVyZmFjZSBCaXJ0aGRheQ0KLXsNCi0gICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJubyB2YWxpZCBiaXJ0aGRheSI7DQotDQotICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2NvbnN0cmFpbnRzL05hbWUuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2NvbnN0cmFpbnRzL05hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkyMDBmOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9jb25zdHJhaW50cy9OYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5jb25zdHJhaW50czsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk92ZXJyaWRlc0F0dHJpYnV0ZTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkFOTk9UQVRJT05fVFlQRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLQ0KLUBOb3ROdWxsDQotQFNpemUobWluID0gMikNCi0NCi1AQ29uc3RyYWludCh2YWxpZGF0ZWRCeSA9IHt9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBBTk5PVEFUSU9OX1RZUEV9KQ0KLXB1YmxpYyBAaW50ZXJmYWNlIE5hbWUNCi17DQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAiaW52YWxpZCBuYW1lIjsgLy9ub3QgdXNlZA0KLQ0KLSAgICBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQge307DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHt9Ow0KLQ0KLSAgICBAT3ZlcnJpZGVzQXR0cmlidXRlKGNvbnN0cmFpbnQgPSBTaXplLmNsYXNzLCBuYW1lID0gIm1heCIpDQotICAgIGludCBtYXhMZW5ndGgoKSBkZWZhdWx0IDIwOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MDczY2UuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uY29uc3RyYWludHMuTmFtZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uY29uc3RyYWludHMuQmlydGhkYXk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlBhc3Q7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLXB1YmxpYyBjbGFzcyBQZXJzb24NCi17DQotICAgIEBOYW1lKG1heExlbmd0aCA9IDMwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7DQotDQotICAgIEBOYW1lKG1heExlbmd0aCA9IDMwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsNCi0NCi0gICAgQFNpemUobWluID0gMiwgbWF4ID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOw0KLQ0KLSAgICBAQmlydGhkYXkNCi0gICAgcHJpdmF0ZSBEYXRlIGJpcnRoZGF5Ow0KLQ0KLSAgICBAUGFzdA0KLSAgICBwcml2YXRlIERhdGUgZmluYWxFeGFtOw0KLQ0KLSAgICBATm90TnVsbA0KLSAgICBwcml2YXRlIFN0cmluZyBuaWNrTmFtZTsNCi0NCi0gICAgQFNpemUobWluID0gNiwgbWF4ID0gNjApDQotICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOw0KLQ0KLSAgICBATm90TnVsbA0KLSAgICBwcml2YXRlIGludCBudW1iZXJPZlNpYmxpbmdzOw0KLQ0KLSAgICBAU2l6ZShtaW4gPSAyLCBtYXggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcm9sZSA9ICJ1c2VyIjsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxhc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRSb2xlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHJvbGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Um9sZShTdHJpbmcgcm9sZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5yb2xlID0gcm9sZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXRCaXJ0aGRheSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBiaXJ0aGRheTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRCaXJ0aGRheShEYXRlIGJpcnRoZGF5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmJpcnRoZGF5ID0gYmlydGhkYXk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RmluYWxFeGFtKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZpbmFsRXhhbTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaW5hbEV4YW0oRGF0ZSBmaW5hbEV4YW0pDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmluYWxFeGFtID0gZmluYWxFeGFtOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tmlja05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmlja05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Tmlja05hbWUoU3RyaW5nIG5pY2tOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm5pY2tOYW1lID0gbmlja05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBlbWFpbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbWFpbChTdHJpbmcgZW1haWwpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZW1haWwgPSBlbWFpbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGdldE51bWJlck9mU2libGluZ3MoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbnVtYmVyT2ZTaWJsaW5nczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXJPZlNpYmxpbmdzKGludCBudW1iZXJPZlNpYmxpbmdzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm51bWJlck9mU2libGluZ3MgPSBudW1iZXJPZlNpYmxpbmdzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDIwZjk0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2d1aS9iZWFucy9SZWdpc3RyYXRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5ndWkuYmVhbnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uUGFnZQ0KLXsNCi0gICAgQE5vdE51bGwocGF5bG9hZCA9IERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7DQotDQotICAgIEBOb3ROdWxsKHBheWxvYWQgPSBWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZFJlcGVhdGVkOw0KLQ0KLSAgICBwcml2YXRlIFBlcnNvbiBwZXJzb247DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZmluaXNoKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0UGFzc3dvcmQodGhpcy5wYXNzd29yZCk7DQotICAgICAgICByZXR1cm4gImhvbWUiOw0KLSAgICB9DQotDQotICAgIEBTaXplKG1pbiA9IDYsIG1heCA9IDYwKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uLmdldEVtYWlsKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXRFbWFpbChlbWFpbCk7DQotICAgIH0NCi0NCi0gICAgQE5vdE51bGwNCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNpYmxpbmdzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uLmdldE51bWJlck9mU2libGluZ3MoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXJPZlNpYmxpbmdzKGludCBudW1iZXJPZlNpYmxpbmdzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXROdW1iZXJPZlNpYmxpbmdzKG51bWJlck9mU2libGluZ3MpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkUmVwZWF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmRSZXBlYXRlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZFJlcGVhdGVkKFN0cmluZyBwYXNzd29yZFJlcGVhdGVkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkUmVwZWF0ZWQgPSBwYXNzd29yZFJlcGVhdGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQZXJzb24gZ2V0UGVyc29uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBlcnNvbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzb24oUGVyc29uIHBlcnNvbikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24gPSBwZXJzb247DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0IGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYTI3YmMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiIKLSAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzEuZHRkIiA+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGZhY2VzLWNvbmZpZz4KLSAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgIDwhLS0gdHJpbmlkYWQgLS0+Ci0gICAgICAgIDxkZWZhdWx0LXJlbmRlci1raXQtaWQ+Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29yZQotICAgICAgICA8L2RlZmF1bHQtcmVuZGVyLWtpdC1pZD4KLQotICAgIDwvYXBwbGljYXRpb24+Ci0KLSAgICA8bWFuYWdlZC1iZWFuPgotICAgICAgICA8bWFuYWdlZC1iZWFuLW5hbWU+cmVnaXN0cmF0aW9uUGFnZTwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZ3VpLmJlYW5zLlJlZ2lzdHJhdGlvblBhZ2U8L21hbmFnZWQtYmVhbi1jbGFzcz4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0KLSAgICAgICAgPG1hbmFnZWQtcHJvcGVydHk+Ci0gICAgICAgICAgICA8cHJvcGVydHktbmFtZT5wZXJzb248L3Byb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8dmFsdWU+I3twZXJzb259PC92YWx1ZT4KLSAgICAgICAgPC9tYW5hZ2VkLXByb3BlcnR5PgotICAgIDwvbWFuYWdlZC1iZWFuPgotCi0gICAgPG1hbmFnZWQtYmVhbj4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1uYW1lPnBlcnNvbjwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluLlBlcnNvbjwvbWFuYWdlZC1iZWFuLWNsYXNzPgotICAgICAgICA8bWFuYWdlZC1iZWFuLXNjb3BlPnNlc3Npb248L21hbmFnZWQtYmVhbi1zY29wZT4KLSAgICA8L21hbmFnZWQtYmVhbj4KLQotICAgIDxuYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgICAgIDxmcm9tLXZpZXctaWQ+L3BhZ2VzL2hvbWUueGh0bWw8L2Zyb20tdmlldy1pZD4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+YWRkVXNlcjwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgPG5hdmlnYXRpb24tcnVsZT4KLSAgICAgICAgPGZyb20tdmlldy1pZD4qPC9mcm9tLXZpZXctaWQ+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmhvbWU8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9ob21lLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICA8L25hdmlnYXRpb24tcnVsZT4KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9tYWluLnRhZ2xpYi54bWwgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzM5MzY2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9tYWluLnRhZ2xpYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBmYWNlbGV0LXRhZ2xpYiBQVUJMSUMKLSAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBGYWNlbGV0IFRhZ2xpYiAxLjAvL0VOIgotICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZmFjZWxldC10YWdsaWJfMV8wLmR0ZCI+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGZhY2VsZXQtdGFnbGliPgotICAgIDxuYW1lc3BhY2U+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHR2YWwvZGVtby9jb21wb25lbnRzPC9uYW1lc3BhY2U+Ci0KLSAgICA8dGFnPgotICAgICAgICA8dGFnLW5hbWU+dXNlckZvcm08L3RhZy1uYW1lPgotICAgICAgICA8c291cmNlPgotICAgICAgICAgICAgLi4vY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKLSAgICAgICAgPC9zb3VyY2U+Ci0gICAgPC90YWc+Ci0KLTwvZmFjZWxldC10YWdsaWI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjMDFhYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgotICAgICAgICAgdmVyc2lvbj0iMi40Ij4KLQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuREVGQVVMVF9TVUZGSVg8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4ueGh0bWw8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5mYWNlbGV0cy5MSUJSQVJJRVM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9tYWluLnRhZ2xpYi54bWw8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRU5BQkxFX0xJR0hUV0VJR0hUX0RJQUxPR1M8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkRJU0FCTEVfQ09OVEVOVF9DT01QUkVTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQUxURVJOQVRFX1ZJRVdfSEFORExFUjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNvbS5zdW4uZmFjZWxldHMuRmFjZWxldFZpZXdIYW5kbGVyPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLlVTRV9BUFBMSUNBVElPTl9WSUVXX0NBQ0hFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQ0hBTkdFX1BFUlNJU1RFTkNFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+c2Vzc2lvbjwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5TdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jbGllbnQ8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgRGVmaW5lcyB0aGUgYW1vdW50IChkZWZhdWx0ID0gMjApIG9mIHRoZSBsYXRlc3Qgdmlld3MgYXJlIHN0b3JlZCBpbiBzZXNzaW9uLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuTlVNQkVSX09GX1ZJRVdTX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc3RhdGUgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0gYmVmb3JlIGl0Ci0gICAgICAgICAgICBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLgotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkgYW5kIGlmCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04gaXMgdHJ1ZSAoPSBkZWZhdWx0KQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4gSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DT01QUkVTU19TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhpcyBwYXJhbWV0ZXIgdGVsbHMgTXlGYWNlcyBpZiBqYXZhc2NyaXB0IGNvZGUgc2hvdWxkIGJlIGFsbG93ZWQgaW4gdGhlCi0gICAgICAgICAgICByZW5kZXJlZCBIVE1MIG91dHB1dC4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgYWxsb3dlZCwgY29tbWFuZF9saW5rIGFuY2hvcnMgd2lsbCBoYXZlIGphdmFzY3JpcHQgY29kZQotICAgICAgICAgICAgdGhhdCBzdWJtaXRzIHRoZSBjb3JyZXNwb25kaW5nIGZvcm0uCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIG5vdCBhbGxvd2VkLCB0aGUgc3RhdGUgc2F2aW5nIGluZm8gYW5kIG5lc3RlZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICB3aWxsIGJlIGFkZGVkIGFzIHVybCBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BTExPV19KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuREVURUNUX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgcmVuZGVyZWQgSFRNTCBjb2RlIHdpbGwgYmUgZm9ybWF0dGVkLCBzbyB0aGF0IGl0IGlzICJodW1hbiByZWFkYWJsZSIuCi0gICAgICAgICAgICBpLmUuIGFkZGl0aW9uYWwgbGluZSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIHdpbGwgYmUgd3JpdHRlbiwgdGhhdCBkbyBub3QKLSAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgSFRNTCBjb2RlLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIGEgamF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRoYXQgaXMgYWJsZSB0byByZXN0b3JlIHRoZQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMKLSAgICAgICAgICAgIHdpdGggbG9uZyBsaXN0cyBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcAotICAgICAgICAgICAgaWYgeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZSBwYWdlLgotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQVVUT19TQ1JPTEw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlVzZWQgZm9yIGVuY3J5cHRpbmcgdmlldyBzdGF0ZS4gT25seSByZWxldmFudCBmb3IgY2xpZW50IHNpZGUKLSAgICAgICAgICAgIHN0YXRlIHNhdmluZy4gU2VlIE15RmFjZXMgd2lraS93ZWIgc2l0ZSBkb2N1bWVudGF0aW9uIGZvciBpbnN0cnVjdGlvbnMKLSAgICAgICAgICAgIG9uIGhvdyB0byBjb25maWd1cmUgYW4gYXBwbGljYXRpb24gZm9yIGRpZmZlbmVudCBlbmNyeXB0aW9uIHN0cmVuZ3Rocy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFQ1JFVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPk56WTFORE15TVRBPTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZhbGlkYXRlIG1hbmFnZWQgYmVhbnMsIG5hdmlnYXRpb24gcnVsZXMgYW5kIGVuc3VyZSB0aGF0IGZvcm1zIGFyZSBub3QgbmVzdGVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuVkFMSURBVEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8IS0tIExpc3RlbmVyLCB0byBhbGxvdyBKZXR0eSBzZXJ2aW5nIE15RmFjZXMgYXBwcyAtLT4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMud2ViYXBwLlN0YXJ0dXBTZXJ2bGV0Q29udGV4dExpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IC0tPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+cmVzb3VyY2VzPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC53ZWJhcHAuUmVzb3VyY2VTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgIDwvc2VydmxldD4KLQotICAgIDxmaWx0ZXI+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT50cmluaWRhZDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLndlYmFwcC5UcmluaWRhZEZpbHRlcjwvZmlsdGVyLWNsYXNzPgotICAgIDwvZmlsdGVyPgotCi0gICAgPGZpbHRlci1tYXBwaW5nPgotICAgICAgICA8ZmlsdGVyLW5hbWU+dHJpbmlkYWQ8L2ZpbHRlci1uYW1lPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICA8L2ZpbHRlci1tYXBwaW5nPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmdzIC0tPgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+L2ZhY2VzLyo8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5yZXNvdXJjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9hZGYvKjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg0ZDY0OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIgotICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIKLSAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiCi0gICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCIKLSAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4KLQotPHVpOmNvbXBvc2l0aW9uPgotICAgIDx0cjpwYW5lbEZvcm1MYXlvdXQ+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibmljayBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvblsgJ25pY2tOYW1lJyBdfSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJlLW1haWwiIHZhbHVlPSIje2JlYW4uZW1haWx9Ii8+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0iZmlyc3QgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb24uZmlyc3ROYW1lfSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJsYXN0IG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uLmxhc3ROYW1lfSIvPgotICAgICAgICA8dHI6aW5wdXREYXRlIGxhYmVsPSJiaXJ0aGRheSIgdmFsdWU9IiN7YmVhbi5wZXJzb24uYmlydGhkYXl9Ij4KLSAgICAgICAgICAgIDx0cjpjb252ZXJ0RGF0ZVRpbWUgdHlwZT0iZGF0ZSIgcGF0dGVybj0iZGQuTU0ueXl5eSIvPgotICAgICAgICA8L3RyOmlucHV0RGF0ZT4KLSAgICAgICAgPHRyOmlucHV0RGF0ZSBsYWJlbD0iZmluYWwgZXhhbSIgdmFsdWU9IiN7YmVhbi5wZXJzb24uZmluYWxFeGFtfSI+Ci0gICAgICAgICAgICA8dHI6Y29udmVydERhdGVUaW1lIHR5cGU9ImRhdGUiIHBhdHRlcm49ImRkLk1NLnl5eXkiLz4KLSAgICAgICAgPC90cjppbnB1dERhdGU+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibnVtYmVyIG9mIHNpYmxpbmdzIiB2YWx1ZT0iI3tiZWFuLm51bWJlck9mU2libGluZ3N9Ii8+Ci0KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0icGFzc3dvcmQiIHZhbHVlPSIje2JlYW4ucGFzc3dvcmR9IiBzZWNyZXQ9InRydWUiLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0icmUtZW50ZXIgcGFzc3dvcmQiIHZhbHVlPSIje2JlYW4ucGFzc3dvcmRSZXBlYXRlZH0iIHNlY3JldD0idHJ1ZSIvPgotCi0gICAgPC90cjpwYW5lbEZvcm1MYXlvdXQ+Ci08L3VpOmNvbXBvc2l0aW9uPgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWNkMTQ4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLSAgICAgICAgDQotPGh0bWw+DQotDQotPGhlYWQ+DQotICAgIDxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjA7IFVSTD1mYWNlcy9wYWdlcy9ob21lLnhodG1sIj4NCi08L2hlYWQ+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYzFlYTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08dHI6ZG9jdW1lbnQNCi0gICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCINCi0gICAgICAgIHhtbG5zOmM9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanN0bC9jb3JlIj4NCi0gICAgPGY6ZmFjZXQgbmFtZT0ibWV0YUNvbnRhaW5lciI+DQotICAgICAgICA8dGl0bGU+c2V2LWVuIGZlYXR1cmUtc2V0IGRlbW8gMDE8L3RpdGxlPg0KLSAgICA8L2Y6ZmFjZXQ+DQotDQotICAgIDx0cmg6Ym9keT4NCi0NCi0gICAgICAgIDwhLS0gb3JpZ2luYWwgLS0+DQotICAgICAgICA8ZGl2IGlkPSJ3cmFwIj4NCi0NCi0gICAgICAgICAgICA8dHI6Zm9ybSBpZD0iZm9ybSIgZGVmYXVsdENvbW1hbmQ9ImRlZmF1bHRCdXR0b24iPg0KLSAgICAgICAgICAgICAgICA8ZGl2IGlkPSJtYWluIj4NCi0gICAgICAgICAgICAgICAgICAgIDx1aTppbnNlcnQgbmFtZT0iY29udGVudCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idW5kZXJfY29uc3RydWN0aW9uIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPiFzaXRlIHVuZGVyIGNvbnN0cnVjdGlvbiE8L2gyPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgY29udGVudCBvZiB0aGlzIHNpdGUgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgbW9tZW50LjwvcD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgICAgICAgICAgIDwvdWk6aW5zZXJ0Pg0KLSAgICAgICAgICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICAgICAgICA8L3RyOmZvcm0+DQotICAgICAgICAgICAgPHRyOm1lc3NhZ2VzIGdsb2JhbE9ubHk9InRydWUiLz4NCi0NCi0gICAgICAgIDwvZGl2Pg0KLSAgICA8L3RyaDpib2R5Pg0KLQ0KLQ0KLTwvdHI6ZG9jdW1lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTdiMTUzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJhZGQgdXNlciIgYWN0aW9uPSJhZGRVc2VyIi8+PGJyLz4NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZjZiMDYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOmM9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0dmFsL2RlbW8vY29tcG9uZW50cyINCi0gICAgICAgID4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDxjOnVzZXJGb3JtIGJlYW49IiN7cmVnaXN0cmF0aW9uUGFnZX0iLz4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9InNhdmUiIGFjdGlvbj0iI3tyZWdpc3RyYXRpb25QYWdlLmZpbmlzaH0iLz4NCi0NCi0gICAgPC91aTpkZWZpbmU+DQotPC91aTpjb21wb3NpdGlvbj4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vcG9tLnhtbCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMyMWU5NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX2JlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBoZWxsbyBiZWFuLXZhbGlkYXRpb248L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWwtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5lbC1pbXBsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5oaWJlcm5hdGU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGliZXJuYXRlLXZhbGlkYXRvcjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj40LjAuMC5HQTwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS40LjI8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjQuMjwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotDQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYxY2Y5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NDVmZTIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuazsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLmRvbWFpbi5QZXJzb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay52YWxpZGF0aW9uLmdyb3VwLkFkbWluOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cC5Vc2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cC5OYW1lOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5ncm91cHMuRGVmYXVsdDsNCi0NCi0vKioNCi0gKiBBIHR5cGljYWwgc2ltcGxlIGJhY2tpbmcgYmVhbiwgdGhhdCBpcyBiYWNrZWQgdG8gPGNvZGU+aGVsbG93b3JsZC5qc3A8L2NvZGU+DQotICovDQotcHVibGljIGNsYXNzIEhlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlcg0KLXsNCi0gICAgQEJlYW5WYWxpZGF0aW9uLkxpc3Qoew0KLSAgICAgICAgICAgIEBCZWFuVmFsaWRhdGlvbih1c2VHcm91cHMgPSBEZWZhdWx0LmNsYXNzKSwNCi0gICAgICAgICAgICBAQmVhblZhbGlkYXRpb24odmlld0lkcyA9ICIvZ3JvdXBWYWxpZGF0aW9uMDEuanNwIiwgdXNlR3JvdXBzID0gVXNlci5jbGFzcyksDQotICAgICAgICAgICAgQEJlYW5WYWxpZGF0aW9uKHZpZXdJZHMgPSAiL2dyb3VwVmFsaWRhdGlvbjAyLmpzcCIsIHVzZUdyb3VwcyA9IEFkbWluLmNsYXNzKSwNCi0gICAgICAgICAgICBAQmVhblZhbGlkYXRpb24odmlld0lkcyA9ICIvbW9kZWxWYWxpZGF0aW9uMDEuanNwIiwgdXNlR3JvdXBzID0gQWRtaW4uY2xhc3MpLA0KLSAgICAgICAgICAgIEBCZWFuVmFsaWRhdGlvbih2aWV3SWRzID0gIi9tb2RlbFZhbGlkYXRpb24wMS5qc3AiLCB1c2VHcm91cHMgPSBOYW1lLmNsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uID0gQE1vZGVsVmFsaWRhdGlvbihpc0FjdGl2ZSA9IHRydWUpKQ0KLSAgICB9KQ0KLSAgICBwcml2YXRlIFBlcnNvbiBwZXJzb24gPSBuZXcgUGVyc29uKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBkZWZhdWx0IGVtcHR5IGNvbnN0cnVjdG9yDQotICAgICAqLw0KLSAgICBwdWJsaWMgSGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyKCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgc2VuZCgpDQotICAgIHsNCi0gICAgICAgIC8vZG8gcmVhbCBsb2dpYywgcmV0dXJuIGEgc3RyaW5nIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgdGhlIG5hdmlnYXRpb24gc3lzdGVtIG9mIEpTRg0KLSAgICAgICAgcmV0dXJuICJzdWNjZXNzIjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwZXJzb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbiBwZXJzb24pDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uID0gcGVyc29uOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvSGVsbG9Xb3JsZENvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNlM2ViNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbms7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5kb21haW4uUGVyc29uOw0KLQ0KLS8qKg0KLSAqIEEgdHlwaWNhbCBzaW1wbGUgYmFja2luZyBiZWFuLCB0aGF0IGlzIGJhY2tlZCB0byA8Y29kZT5oZWxsb3dvcmxkLmpzcDwvY29kZT4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZENvbnRyb2xsZXINCi17DQotICAgIHByaXZhdGUgUGVyc29uIHBlcnNvbiA9IG5ldyBQZXJzb24oKTsNCi0NCi0gICAgLyoqDQotICAgICAqIGRlZmF1bHQgZW1wdHkgY29uc3RydWN0b3INCi0gICAgICovDQotICAgIHB1YmxpYyBIZWxsb1dvcmxkQ29udHJvbGxlcigpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHNlbmQoKQ0KLSAgICB7DQotICAgICAgICAvL2RvIHJlYWwgbG9naWMsIHJldHVybiBhIHN0cmluZyB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuYXZpZ2F0aW9uIHN5c3RlbSBvZiBKU0YNCi0gICAgICAgIHJldHVybiAic3VjY2VzcyI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBlcnNvbiBnZXRQZXJzb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGVyc29uOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNvbihQZXJzb24gcGVyc29uKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbiA9IHBlcnNvbjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvZG9tYWluL1BlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmVhODNlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvZG9tYWluL1BlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLmRvbWFpbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb24uTmFtZUNvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay52YWxpZGF0aW9uLmdyb3VwLkFkbWluOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cC5Vc2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cC5OYW1lOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsNCi0NCi1ATmFtZUNvbnN0cmFpbnQoZ3JvdXBzID0gTmFtZS5jbGFzcykNCi1wdWJsaWMgY2xhc3MgUGVyc29uDQotew0KLSAgICBATm90TnVsbChwYXlsb2FkID0gVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcykNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOw0KLQ0KLSAgICAvL2RlbW8gZm9yIGJlYW4gdmFsaWRhdGlvbiBiYXNlZCB2YWxpZGF0aW9uIHN1cHBvcnQNCi0gICAgQE5vdE51bGwNCi0gICAgQFNpemUuTGlzdCh7DQotICAgICAgICAgICAgQFNpemUobWluID0gMywgbWF4ID0gNiwgZ3JvdXBzID0gVXNlci5jbGFzcyksDQotICAgICAgICAgICAgQFNpemUobWluID0gMywgbWF4ID0gMTIsIGdyb3VwcyA9IEFkbWluLmNsYXNzKQ0KLSAgICB9KQ0KLSAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxhc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9OYW1lQ29uc3RyYWludC5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL05hbWVDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYzM3ZjQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL05hbWVDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLQ0KLUBDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0gTmFtZUNvbnN0cmFpbnRWYWxpZGF0b3IuY2xhc3MpDQotQFRhcmdldChUWVBFKQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1wdWJsaWMgQGludGVyZmFjZSBOYW1lQ29uc3RyYWludA0KLXsNCi0gICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJpbnZhbGlkIG5hbWUiOw0KLQ0KLSAgICBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQge307DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHt9Ow0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vTmFtZUNvbnN0cmFpbnRWYWxpZGF0b3IuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9OYW1lQ29uc3RyYWludFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWI4OTJjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9OYW1lQ29uc3RyYWludFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5kb21haW4uUGVyc29uOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIE5hbWVDb25zdHJhaW50VmFsaWRhdG9yIGltcGxlbWVudHMNCi0gICAgICAgIENvbnN0cmFpbnRWYWxpZGF0b3I8TmFtZUNvbnN0cmFpbnQsIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5kb21haW4uUGVyc29uPg0KLXsNCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShOYW1lQ29uc3RyYWludCBkaWZmZXJlbnROYW1lKQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChQZXJzb24gcGVyc29uLCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCkNCi0gICAgew0KLSAgICAgICAgaWYocGVyc29uID09IG51bGwgfHwgaXNFbXB0eShwZXJzb24uZ2V0Rmlyc3ROYW1lKCkpIHx8IGlzRW1wdHkocGVyc29uLmdldExhc3ROYW1lKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuICEocGVyc29uLmdldEZpcnN0TmFtZSgpLmVxdWFscyhwZXJzb24uZ2V0TGFzdE5hbWUoKSkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0VtcHR5KFN0cmluZyB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgIiIuZXF1YWxzKHZhbHVlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvQWRtaW4uamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9BZG1pbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmMwOWQyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9BZG1pbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb24uZ3JvdXA7DQotDQotcHVibGljIGludGVyZmFjZSBBZG1pbg0KLXsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL2dyb3VwL05hbWUuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9OYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMTcwMzguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL2dyb3VwL05hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay52YWxpZGF0aW9uLmdyb3VwOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZQ0KLXsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL2dyb3VwL1VzZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9Vc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZjhkZDUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL2dyb3VwL1VzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay52YWxpZGF0aW9uLmdyb3VwOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgVXNlcg0KLXsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYxY2Y5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM0YjU2Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQw0KLSAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKYXZhU2VydmVyIEZhY2VzIENvbmZpZyAxLjAvL0VOIg0KLSAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzEuZHRkIiA+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGZhY2VzLWNvbmZpZz4NCi0NCi0JPCEtLSBtYW5hZ2VkIGJlYW5zIG9mIHRoZSBzaW1wbGUgaGVsbG8gd29ybGQgYXBwIC0tPg0KLQk8bWFuYWdlZC1iZWFuPg0KLQkJPG1hbmFnZWQtYmVhbi1uYW1lPmhlbGxvV29ybGQ8L21hbmFnZWQtYmVhbi1uYW1lPg0KLQkJPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuSGVsbG9Xb3JsZENvbnRyb2xsZXI8L21hbmFnZWQtYmVhbi1jbGFzcz4NCi0JCTxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPg0KLQk8L21hbmFnZWQtYmVhbj4NCi0JDQotICAgIDxtYW5hZ2VkLWJlYW4+DQotICAgICAgICA8bWFuYWdlZC1iZWFuLW5hbWU+aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyPC9tYW5hZ2VkLWJlYW4tbmFtZT4NCi0gICAgICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLkhlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlcjwvbWFuYWdlZC1iZWFuLWNsYXNzPg0KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+DQotICAgIDwvbWFuYWdlZC1iZWFuPg0KLQ0KLSAgICA8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIGhlbGxvV29ybGQuanNwIC0tPg0KLSAgICA8bmF2aWdhdGlvbi1ydWxlPg0KLSAgICAgICAgPGZyb20tdmlldy1pZD4qPC9mcm9tLXZpZXctaWQ+DQotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPg0KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+c3VjY2VzczwvZnJvbS1vdXRjb21lPg0KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9yZXN1bHQuanNwPC90by12aWV3LWlkPg0KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+DQotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPg0KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+ZXhhbXBsZTAxPC9mcm9tLW91dGNvbWU+DQotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L2dyb3VwVmFsaWRhdGlvbjAxLmpzcDwvdG8tdmlldy1pZD4NCi0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPg0KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4NCi0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmV4YW1wbGUwMjwvZnJvbS1vdXRjb21lPg0KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9ncm91cFZhbGlkYXRpb24wMi5qc3A8L3RvLXZpZXctaWQ+DQotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4NCi0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+DQotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5leGFtcGxlMDM8L2Zyb20tb3V0Y29tZT4NCi0gICAgICAgICAgICA8dG8tdmlldy1pZD4vbW9kZWxWYWxpZGF0aW9uMDEuanNwPC90by12aWV3LWlkPg0KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+DQotICAgIDwvbmF2aWdhdGlvbi1ydWxlPg0KLQ0KLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIHJlc3VsdC5qc3AgLS0+DQotCTxuYXZpZ2F0aW9uLXJ1bGU+DQotCQk8ZnJvbS12aWV3LWlkPi9yZXN1bHQuanNwPC9mcm9tLXZpZXctaWQ+DQotCQk8bmF2aWdhdGlvbi1jYXNlPg0KLQkJCTxmcm9tLW91dGNvbWU+YmFjazwvZnJvbS1vdXRjb21lPg0KLQkJCTx0by12aWV3LWlkPi9oZWxsb1dvcmxkLmpzcDwvdG8tdmlldy1pZD4NCi0JCTwvbmF2aWdhdGlvbi1jYXNlPg0KLQk8L25hdmlnYXRpb24tcnVsZT4NCi08L2ZhY2VzLWNvbmZpZz4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYWQ0ZTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIg0KLSAgICAgICAgIHZlcnNpb249IjIuNCI+DQotDQotICAgIDxkZXNjcmlwdGlvbj5NeVByb2plY3Qgd2ViLnhtbDwvZGVzY3JpcHRpb24+DQotDQotICAgIDwhLS1vcHRpb25hbDogY29udGV4dC1wYXJhbT4NCi0gICAgICAgIDxkZXNjcmlwdGlvbj5Db21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBVUklzIG9mIChhZGRpdGlvbmFsKSBmYWNlcyBjb25maWcgZmlsZXMuDQotICAgICAgICAgICAgKGUuZy4gL1dFQi1JTkYvbXktY29uZmlnLnhtbCkNCi0gICAgICAgICAgICBTZWUgSlNGIDEuMCBQUkQyLCAxMC4zLjINCi0gICAgICAgICAgICBBdHRlbnRpb246IFlvdSBkbyBub3QgbmVlZCB0byBwdXQgL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBpbiBoZXJlLg0KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkNPTkZJR19GSUxFUzwvcGFyYW0tbmFtZT4NCi0gICAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sPC9wYXJhbS12YWx1ZT4NCi0gICAgPC9jb250ZXh0LXBhcmFtLS0+DQotICAgIDxjb250ZXh0LXBhcmFtPg0KLSAgICAgICAgPGRlc2NyaXB0aW9uPlN0YXRlIHNhdmluZyBtZXRob2Q6ICJjbGllbnQiIG9yICJzZXJ2ZXIiICg9IGRlZmF1bHQpDQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+DQotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4NCi0gICAgPC9jb250ZXh0LXBhcmFtPg0KLSAgICA8Y29udGV4dC1wYXJhbT4NCi0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4NCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5OVU1CRVJfT0ZfVklFV1NfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4NCi0gICAgICAgIDxwYXJhbS12YWx1ZT4yMDwvcGFyYW0tdmFsdWU+DQotICAgIDwvY29udGV4dC1wYXJhbT4NCi0gICAgPGNvbnRleHQtcGFyYW0+DQotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuDQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdA0KLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uDQotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS48L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPg0KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPg0KLSAgICA8L2NvbnRleHQtcGFyYW0+DQotICAgIDxjb250ZXh0LXBhcmFtPg0KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpIGFuZCBpZg0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTiBpcyB0cnVlICg9IGRlZmF1bHQpDQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdA0KLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBjb21wcmVzc2VkLjwvZGVzY3JpcHRpb24+DQotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4NCi0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4NCi0gICAgPC9jb250ZXh0LXBhcmFtPg0KLSAgICA8Y29udGV4dC1wYXJhbT4NCi0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUNCi0gICAgICAgICAgICByZW5kZXJlZCBIVE1MIG91dHB1dC4NCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUNCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4NCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIG5vdCBhbGxvd2VkLCB0aGUgc3RhdGUgc2F2aW5nIGluZm8gYW5kIG5lc3RlZCBwYXJhbWV0ZXJzDQotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4NCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFMTE9XX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+DQotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+DQotICAgIDwvY29udGV4dC1wYXJhbT4NCi0gICAgPGNvbnRleHQtcGFyYW0+DQotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuREVURUNUX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+DQotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPg0KLSAgICA8L2NvbnRleHQtcGFyYW0+DQotICAgIDxjb250ZXh0LXBhcmFtPg0KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLg0KLSAgICAgICAgICAgIGkuZS4gYWRkaXRpb25hbCBsaW5lIHNlcGFyYXRvcnMgYW5kIHdoaXRlc3BhY2Ugd2lsbCBiZSB3cml0dGVuLCB0aGF0IGRvIG5vdA0KLSAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgSFRNTCBjb2RlLg0KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+DQotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUFJFVFRZX0hUTUw8L3BhcmFtLW5hbWU+DQotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+DQotICAgIDwvY29udGV4dC1wYXJhbT4NCi0gICAgPGNvbnRleHQtcGFyYW0+DQotICAgICAgICA8ZGVzY3JpcHRpb24+SWYgdHJ1ZSwgYSBqYXZhc2NyaXB0IGZ1bmN0aW9uIHdpbGwgYmUgcmVuZGVyZWQgdGhhdCBpcyBhYmxlIHRvIHJlc3RvcmUgdGhlDQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMNCi0gICAgICAgICAgICB3aXRoIGxvbmcgbGlzdHMgYW5kIHlvdSBkbyBub3Qgd2FudCB0aGUgYnJvd3NlciBwYWdlIHRvIGFsd2F5cyBqdW1wIHRvIHRoZSB0b3ANCi0gICAgICAgICAgICBpZiB5b3UgdHJpZ2dlciBhIGxpbmsgb3IgYnV0dG9uIGFjdGlvbiB0aGF0IHN0YXlzIG9uIHRoZSBzYW1lIHBhZ2UuDQotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIjwvZGVzY3JpcHRpb24+DQotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQVVUT19TQ1JPTEw8L3BhcmFtLW5hbWU+DQotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+DQotICAgIDwvY29udGV4dC1wYXJhbT4NCi0NCi0gICAgPGNvbnRleHQtcGFyYW0+DQotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQ0KLSAgICAgICAgICAgIHN0YXRlIHNhdmluZy4gU2VlIE15RmFjZXMgd2lraS93ZWIgc2l0ZSBkb2N1bWVudGF0aW9uIGZvciBpbnN0cnVjdGlvbnMNCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuDQotICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFQ1JFVDwvcGFyYW0tbmFtZT4NCi0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPg0KLSAgICA8L2NvbnRleHQtcGFyYW0+DQotDQotICAgIDxjb250ZXh0LXBhcmFtPg0KLSAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgIFZhbGlkYXRlIG1hbmFnZWQgYmVhbnMsIG5hdmlnYXRpb24gcnVsZXMgYW5kIGVuc3VyZSB0aGF0IGZvcm1zIGFyZSBub3QgbmVzdGVkLg0KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4NCi0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4NCi0gICAgPC9jb250ZXh0LXBhcmFtPg0KLQ0KLSAgICA8Y29udGV4dC1wYXJhbT4NCi0gICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICBUcmVhdCByZWFkb25seSBzYW1lIGFzIGlmIGRpc2FibGVkIGF0dHJpYnV0ZSB3YXMgc2V0IGZvciBzZWxlY3QgZWxlbWVudHMuDQotICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlJFQURPTkxZX0FTX0RJU0FCTEVEX0ZPUl9TRUxFQ1RTPC9wYXJhbS1uYW1lPg0KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPg0KLSAgICA8L2NvbnRleHQtcGFyYW0+DQotDQotICAgIDxjb250ZXh0LXBhcmFtPg0KLSAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgIFVzZSB0aGUgZGVmaW5lZCBjbGFzcyBhcyB0aGUgY2xhc3Mgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiBhIHJlc291cmNlIGlzIGFkZGVkIHRvIHRoZQ0KLSAgICAgICAgICAgIEV4dGVuc2lvbkZpbHRlciBoYW5kbGluZy4gVXNpbmcgU3RyZWFtaW5nQWRkUmVzb3VyY2UgaGVyZSBoZWxwcyB3aXRoIHBlcmZvcm1hbmNlLiBJZiB5b3Ugd2FudCB0byBhZGQNCi0gICAgICAgICAgICBjdXN0b20gY29tcG9uZW50cyBhbmQgd2FudCB0byB1c2UgdGhlIEV4dGVuc2lvbkZpbHRlciwgeW91IG5lZWQgdG8gcHJvdmlkZSB5b3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBoZXJlLg0KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BRERfUkVTT1VSQ0VfQ0xBU1M8L3BhcmFtLW5hbWU+DQotICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLnV0aWwuRGVmYXVsdEFkZFJlc291cmNlPC9wYXJhbS12YWx1ZT4NCi0gICAgPC9jb250ZXh0LXBhcmFtPg0KLQ0KLSAgICA8Y29udGV4dC1wYXJhbT4NCi0gICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICBWaXJ0dWFsIHBhdGggaW4gdGhlIFVSTCB3aGljaCB0cmlnZ2VycyBsb2FkaW5nIG9mIHJlc291cmNlcyBmb3IgdGhlIE15RmFjZXMgZXh0ZW5kZWQgY29tcG9uZW50cw0KLSAgICAgICAgICAgIGluIHRoZSBFeHRlbnNpb25GaWx0ZXIuDQotICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlJFU09VUkNFX1ZJUlRVQUxfUEFUSDwvcGFyYW0tbmFtZT4NCi0gICAgICAgIDxwYXJhbS12YWx1ZT4vZmFjZXMvbXlGYWNlc0V4dGVuc2lvblJlc291cmNlPC9wYXJhbS12YWx1ZT4NCi0gICAgPC9jb250ZXh0LXBhcmFtPg0KLQ0KLSAgICA8Y29udGV4dC1wYXJhbT4NCi0gICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICBDaGVjayBpZiB0aGUgZXh0ZW5zaW9ucy1maWx0ZXIgaGFzIGJlZW4gcHJvcGVybHkgY29uZmlndXJlZC4NCi0gICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ0hFQ0tfRVhURU5TSU9OU19GSUxURVI8L3BhcmFtLW5hbWU+DQotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+DQotICAgIDwvY29udGV4dC1wYXJhbT4NCi0NCi0gICAgPGNvbnRleHQtcGFyYW0+DQotICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgRGVmaW5lIHBhcnRpYWwgc3RhdGUgc2F2aW5nIGFzIHRydWUvZmFsc2UuDQotICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuUEFSVElBTF9TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPg0KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4NCi0gICAgPC9jb250ZXh0LXBhcmFtPg0KLQ0KLSAgICA8IS0tIExpc3RlbmVyLCB0byBhbGxvdyBKZXR0eSBzZXJ2aW5nIE15RmFjZXMgYXBwcyAtLT4NCi0gICAgPGxpc3RlbmVyPg0KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy53ZWJhcHAuU3RhcnR1cFNlcnZsZXRDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPg0KLSAgICA8L2xpc3RlbmVyPg0KLQ0KLSAgICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+DQotICAgIDxzZXJ2bGV0Pg0KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+DQotICAgICAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPg0KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+DQotICAgIDwvc2VydmxldD4NCi0NCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmcgLS0+DQotICAgIDxzZXJ2bGV0LW1hcHBpbmc+DQotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4NCi0gICAgICAgIDx1cmwtcGF0dGVybj4qLmpzZjwvdXJsLXBhdHRlcm4+DQotICAgIDwvc2VydmxldC1tYXBwaW5nPg0KLQ0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+DQotICAgIDx3ZWxjb21lLWZpbGUtbGlzdD4NCi0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguanNwPC93ZWxjb21lLWZpbGU+DQotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4NCi0gICAgPC93ZWxjb21lLWZpbGUtbGlzdD4NCi0NCi08L3dlYi1hcHA+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvZ3JvdXBWYWxpZGF0aW9uMDEuanNwIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvZ3JvdXBWYWxpZGF0aW9uMDEuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjQ2ZTU0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2dyb3VwVmFsaWRhdGlvbjAxLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTwlLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tJT4NCi0NCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPg0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4NCi08aHRtbD4NCi0gICAgPGhlYWQ+DQotICAgICAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPg0KLSAgICA8L2hlYWQ+DQotICAgIDxib2R5Pg0KLSAgICAgICAgPGY6dmlldz4NCi0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+DQotICAgICAgICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMyI+DQotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0iZmlyc3RfbmFtZSIgdmFsdWU9IkZpcnN0IG5hbWUqOiIvPg0KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9ImZpcnN0X25hbWUiIHZhbHVlPSIje2hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlclsncGVyc29uJ10uZmlyc3ROYW1lfSIvPg0KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0iZmlyc3RfbmFtZSIgc2hvd1N1bW1hcnk9InRydWUiIHNob3dEZXRhaWw9ImZhbHNlIiBlcnJvclN0eWxlPSJjb2xvcjogcmVkOyIgd2FyblN0eWxlPSJjb2xvcjogb3JhbmdlOyIvPg0KLQ0KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9Imxhc3RfbmFtZSIgdmFsdWU9Ikxhc3QgbmFtZSoqOiIvPg0KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9Imxhc3RfbmFtZSIgdmFsdWU9IiN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLnBlcnNvbi5sYXN0TmFtZX0iLz4NCi0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9Imxhc3RfbmFtZSIgc2hvd1N1bW1hcnk9InRydWUiIHNob3dEZXRhaWw9ImZhbHNlIiBlcnJvclN0eWxlPSJjb2xvcjogcmVkOyIgd2FyblN0eWxlPSJjb2xvcjogb3JhbmdlOyIvPg0KLQ0KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJQcmVzcyBtZSIgYWN0aW9uPSIje2hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlci5zZW5kfSIvPg0KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4NCi0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+DQotICAgICAgICAgICAgICA8L2g6cGFuZWxHcmlkPg0KLSAgICAgICAgICAgIDwvaDpmb3JtPg0KLSAgICAgICAgICAgIDxoOm1lc3NhZ2VzIGdsb2JhbE9ubHk9InRydWUiIHNob3dEZXRhaWw9InRydWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIvPg0KLSAgICAgICAgPC9mOnZpZXc+DQotICAgICAgICA8aHIvPg0KLQ0KLSAgICAgICAgKiByZXF1aXJlZDxici8+DQotICAgICAgICAqKiByZXF1aXJlZDsgbGVuZ3RoOiAzLTYgY2hhcmFjdGVycw0KLSAgICA8L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2dyb3VwVmFsaWRhdGlvbjAyLmpzcCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2dyb3VwVmFsaWRhdGlvbjAyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRlNWJkYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9ncm91cFZhbGlkYXRpb24wMi5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08JS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLSU+DQotDQotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4NCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+DQotPGh0bWw+DQotICAgIDxoZWFkPg0KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4NCi0gICAgPC9oZWFkPg0KLSAgICA8Ym9keT4NCi0gICAgICAgIDxmOnZpZXc+DQotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPg0KLSAgICAgICAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjMiPg0KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9ImZpcnN0X25hbWUiIHZhbHVlPSJGaXJzdCBuYW1lKjoiLz4NCi0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJmaXJzdF9uYW1lIiB2YWx1ZT0iI3toZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXJbJ3BlcnNvbiddLmZpcnN0TmFtZX0iLz4NCi0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9ImZpcnN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4NCi0NCi0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJsYXN0X25hbWUiIHZhbHVlPSJMYXN0IG5hbWUqKjoiLz4NCi0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJsYXN0X25hbWUiIHZhbHVlPSIje2hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlci5wZXJzb24ubGFzdE5hbWV9Ii8+DQotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJsYXN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4NCi0NCi0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiB2YWx1ZT0iUHJlc3MgbWUiIGFjdGlvbj0iI3toZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIuc2VuZH0iLz4NCi0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+DQotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPg0KLSAgICAgICAgICAgICAgPC9oOnBhbmVsR3JpZD4NCi0gICAgICAgICAgICA8L2g6Zm9ybT4NCi0gICAgICAgICAgICA8aDptZXNzYWdlcyBnbG9iYWxPbmx5PSJ0cnVlIiBzaG93RGV0YWlsPSJ0cnVlIiBzaG93U3VtbWFyeT0iZmFsc2UiLz4NCi0gICAgICAgIDwvZjp2aWV3Pg0KLSAgICAgICAgPGhyLz4NCi0NCi0gICAgICAgICogcmVxdWlyZWQ8YnIvPg0KLSAgICAgICAgKiogcmVxdWlyZWQ7IGxlbmd0aDogMy0xMiBjaGFyYWN0ZXJzDQotICAgIDwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyOWYwNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTwlLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tJT4NCi0NCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPg0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4NCi08aHRtbD4NCi0gICAgPGhlYWQ+DQotICAgICAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPg0KLSAgICA8L2hlYWQ+DQotICAgIDxib2R5Pg0KLSAgICAgICAgPGY6dmlldz4NCi0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+DQotICAgICAgICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMyI+DQotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0iZmlyc3RfbmFtZSIgdmFsdWU9IkZpcnN0IG5hbWUqOiIvPg0KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9ImZpcnN0X25hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQucGVyc29uLmZpcnN0TmFtZX0iLz4NCi0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9ImZpcnN0X25hbWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIgc2hvd0RldGFpbD0idHJ1ZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4NCi0NCi0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJsYXN0X25hbWUiIHZhbHVlPSJMYXN0IG5hbWUqKjoiLz4NCi0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJsYXN0X25hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfSIvPg0KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0ibGFzdF9uYW1lIiBzaG93U3VtbWFyeT0iZmFsc2UiIHNob3dEZXRhaWw9InRydWUiIGVycm9yU3R5bGU9ImNvbG9yOiByZWQ7IiB3YXJuU3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ii8+DQotDQotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Xb3JsZC5zZW5kfSIvPg0KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4NCi0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+DQotICAgICAgICAgICAgICA8L2g6cGFuZWxHcmlkPg0KLQ0KLSAgICAgICAgICAgICAgPGhyLz4NCi0gICAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIHZhbHVlPSJncm91cCB2YWxpZGF0aW9uIGV4YW1wbGUgMSIgYWN0aW9uPSJleGFtcGxlMDEiIGltbWVkaWF0ZT0idHJ1ZSIvPjxici8+DQotICAgICAgICAgICAgICA8aDpjb21tYW5kTGluayB2YWx1ZT0iZ3JvdXAgdmFsaWRhdGlvbiBleGFtcGxlIDIiIGFjdGlvbj0iZXhhbXBsZTAyIiBpbW1lZGlhdGU9InRydWUiLz48YnIvPg0KLSAgICAgICAgICAgICAgPGg6Y29tbWFuZExpbmsgdmFsdWU9Im1vZGVsIHZhbGlkYXRpb24gZXhhbXBsZSAxIiBhY3Rpb249ImV4YW1wbGUwMyIgaW1tZWRpYXRlPSJ0cnVlIi8+PGJyLz4NCi0gICAgICAgICAgICA8L2g6Zm9ybT4NCi0gICAgICAgICAgPC9mOnZpZXc+DQotICAgICAgICAgIDxoci8+DQotICAgICAgICAgICogbm9uIGJsb2NraW5nIHdhcm4gbW9kZTxici8+DQotICAgICAgICAgICoqIGJsb2NraW5nIGVycm9yIG1vZGUNCi0gICAgICA8L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RiNTcyNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08JS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLSU+DQotDQotPCVAIHBhZ2Ugc2Vzc2lvbj0iZmFsc2UiJT4NCi08JQ0KLXJlc3BvbnNlLnNlbmRSZWRpcmVjdCgiaGVsbG9Xb3JsZC5qc2YiKTsNCi0lPg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL21vZGVsVmFsaWRhdGlvbjAxLmpzcCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL21vZGVsVmFsaWRhdGlvbjAxLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFmYmU1Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9tb2RlbFZhbGlkYXRpb24wMS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08JS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLSU+DQotDQotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4NCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+DQotPGh0bWw+DQotICAgIDxoZWFkPg0KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4NCi0gICAgPC9oZWFkPg0KLSAgICA8Ym9keT4NCi0gICAgICAgIDxmOnZpZXc+DQotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPg0KLSAgICAgICAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjMiPg0KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9ImZpcnN0X25hbWUiIHZhbHVlPSJGaXJzdCBuYW1lKjoiLz4NCi0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJmaXJzdF9uYW1lIiB2YWx1ZT0iI3toZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXJbJ3BlcnNvbiddLmZpcnN0TmFtZX0iLz4NCi0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9ImZpcnN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4NCi0NCi0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJsYXN0X25hbWUiIHZhbHVlPSJMYXN0IG5hbWUqKjoiLz4NCi0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJsYXN0X25hbWUiIHZhbHVlPSIje2hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlci5wZXJzb24ubGFzdE5hbWV9Ii8+DQotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJsYXN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4NCi0NCi0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiB2YWx1ZT0iUHJlc3MgbWUiIGFjdGlvbj0iI3toZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIuc2VuZH0iLz4NCi0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+DQotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPg0KLSAgICAgICAgICAgICAgPC9oOnBhbmVsR3JpZD4NCi0gICAgICAgICAgICA8L2g6Zm9ybT4NCi0gICAgICAgICAgICA8aDptZXNzYWdlcyBnbG9iYWxPbmx5PSJ0cnVlIiBzaG93RGV0YWlsPSJ0cnVlIiBzaG93U3VtbWFyeT0iZmFsc2UiLz4NCi0gICAgICAgIDwvZjp2aWV3Pg0KLSAgICAgICAgPGhyLz4NCi0gICAgICAgIG1vZGVsIHZhbGlkYXRpb246IGZpcnN0IGFuZCBsYXN0IG5hbWUgaGF2ZSB0byBiZSBkaWZmZXJlbnQ8YnIvPg0KLQ0KLSAgICAgICAgKiByZXF1aXJlZDxici8+DQotICAgICAgICAqKiByZXF1aXJlZDsgbGVuZ3RoOiAzLTEyIGNoYXJhY3RlcnMNCi0gICAgPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9yZXN1bHQuanNwIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvcmVzdWx0LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVmMTcwNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9yZXN1bHQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPCUtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0lPg0KLQ0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+DQotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPg0KLTxodG1sPg0KLSAgICA8aGVhZD4NCi0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+DQotICAgIDwvaGVhZD4NCi0gICAgPGJvZHk+DQotICAgICAgICA8Zjp2aWV3Pg0KLSAgICAgICAgICAgIDxoOmZvcm0gaWQ9Im1haW5Gb3JtIj4NCi0gICAgICAgICAgICAgICAgPGgyPjxoOm91dHB1dFRleHQgdmFsdWU9IkhlbGxvICN7aGVsbG9Xb3JsZC5wZXJzb24uZmlyc3ROYW1lfSAje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfSN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLnBlcnNvbi5maXJzdE5hbWV9ICN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLnBlcnNvbi5sYXN0TmFtZX0uIFdlIGhvcGUgeW91IGVuam95IEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yISIvPjwvaDI+DQotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIGFjdGlvbj0iYmFjayI+DQotICAgICAgICAgICAgICAgICAgICA8aDpvdXRwdXRUZXh0IHZhbHVlPSJIb21lIi8+DQotICAgICAgICAgICAgICAgIDwvaDpjb21tYW5kTGluaz4NCi0gICAgICAgICAgICA8L2g6Zm9ybT4NCi0gICAgICAgICAgICA8aDptZXNzYWdlcyBnbG9iYWxPbmx5PSJ0cnVlIiBzaG93RGV0YWlsPSJ0cnVlIiBzaG93U3VtbWFyeT0iZmFsc2UiLz4NCi0gICAgICAgIDwvZjp2aWV3Pg0KLSAgICA8L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1M2Q0ODAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIGhlbGxvIHdvcmxkPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+ZWwtaW1wbDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjFjZjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYWZiMzkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbms7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluLlBlcnNvbjsKLQotLyoqCi0gKiBBIHR5cGljYWwgc2ltcGxlIGJhY2tpbmcgYmVhbiwgdGhhdCBpcyBiYWNrZWQgdG8gPGNvZGU+aGVsbG93b3JsZC5qc3A8L2NvZGU+Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEhlbGxvV29ybGRDb250cm9sbGVyCi17Ci0gICAgcHJpdmF0ZSBQZXJzb24gcGVyc29uID0gbmV3IFBlcnNvbigpOwotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBlbXB0eSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBIZWxsb1dvcmxkQ29udHJvbGxlcigpCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB0aGF0IGlzIGJhY2tlZCB0byBhIHN1Ym1pdCBidXR0b24gb2YgYSBmb3JtLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgc2VuZCgpCi0gICAgewotICAgICAgICAvL2RvIHJlYWwgbG9naWMsIHJldHVybiBhIHN0cmluZyB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuYXZpZ2F0aW9uIHN5c3RlbSBvZiBKU0YKLSAgICAgICAgcmV0dXJuICJzdWNjZXNzIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpCi0gICAgewotICAgICAgICByZXR1cm4gcGVyc29uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNvbihQZXJzb24gcGVyc29uKQotICAgIHsKLSAgICAgICAgdGhpcy5wZXJzb24gPSBwZXJzb247Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvZG9tYWluL1BlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDA3NmNjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsKLQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsKLQotcHVibGljIGNsYXNzIFBlcnNvbgotewotICAgIC8vaGVsbG8gd29ybGQgZGVtbwotICAgIEBSZXF1aXJlZChwYXJhbWV0ZXJzID0gVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcykKLSAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7Ci0KLSAgICAvL2RlbW8gZm9yIGpwYSBiYXNlZCB2YWxpZGF0aW9uIHN1cHBvcnQKLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwIC8qLi4uKi8pCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbGFzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjFjZjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjY0NGQwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQwotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMC8vRU4iCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlcy1jb25maWc+Ci0JCi0JPCEtLSBtYW5hZ2VkIGJlYW5zIG9mIHRoZSBzaW1wbGUgaGVsbG8gd29ybGQgYXBwIC0tPgotCTxtYW5hZ2VkLWJlYW4+Ci0JCTxtYW5hZ2VkLWJlYW4tbmFtZT5oZWxsb1dvcmxkPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLQkJPG1hbmFnZWQtYmVhbi1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuSGVsbG9Xb3JsZENvbnRyb2xsZXI8L21hbmFnZWQtYmVhbi1jbGFzcz4KLQkJPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0JPC9tYW5hZ2VkLWJlYW4+Ci0JCi0JPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciBoZWxsb1dvcmxkLmpzcCAtLT4KLQk8bmF2aWdhdGlvbi1ydWxlPgotCQk8ZnJvbS12aWV3LWlkPi9oZWxsb1dvcmxkLmpzcDwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5zdWNjZXNzPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vcGFnZTIuanNwPC90by12aWV3LWlkPgotCQk8L25hdmlnYXRpb24tY2FzZT4KLQk8L25hdmlnYXRpb24tcnVsZT4KLQkKLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIHBhZ2UyLmpzcCAtLT4KLQk8bmF2aWdhdGlvbi1ydWxlPgotCQk8ZnJvbS12aWV3LWlkPi9wYWdlMi5qc3A8L2Zyb20tdmlldy1pZD4KLQkJPG5hdmlnYXRpb24tY2FzZT4KLQkJCTxmcm9tLW91dGNvbWU+YmFjazwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L2hlbGxvV29ybGQuanNwPC90by12aWV3LWlkPgotCQk8L25hdmlnYXRpb24tY2FzZT4KLQk8L25hdmlnYXRpb24tcnVsZT4KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNGExODMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLSAgICAgICAgIHZlcnNpb249IjIuNCI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+TXlQcm9qZWN0IHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0gICAgPCEtLW9wdGlvbmFsOiBjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgVVJJcyBvZiAoYWRkaXRpb25hbCkgZmFjZXMgY29uZmlnIGZpbGVzLgotICAgICAgICAgICAgKGUuZy4gL1dFQi1JTkYvbXktY29uZmlnLnhtbCkKLSAgICAgICAgICAgIFNlZSBKU0YgMS4wIFBSRDIsIDEwLjMuMgotICAgICAgICAgICAgQXR0ZW50aW9uOiBZb3UgZG8gbm90IG5lZWQgdG8gcHV0IC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgaW4gaGVyZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuQ09ORklHX0ZJTEVTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L1dFQi1JTkYvZXhhbXBsZXMtY29uZmlnLnhtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtLS0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5TdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNsaWVudDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLk5VTUJFUl9PRl9WSUVXU19JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkgYW5kIGlmCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04gaXMgdHJ1ZSAoPSBkZWZhdWx0KQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4gSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUKLSAgICAgICAgICAgIHJlbmRlcmVkIEhUTUwgb3V0cHV0LgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgbm90IGFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLgotICAgICAgICAgICAgaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90Ci0gICAgICAgICAgICBpbmZsdWVuY2UgdGhlIEhUTUwgY29kZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIGEgamF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRoYXQgaXMgYWJsZSB0byByZXN0b3JlIHRoZQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMKLSAgICAgICAgICAgIHdpdGggbG9uZyBsaXN0cyBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcAotICAgICAgICAgICAgaWYgeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZSBwYWdlLgotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BVVRPX1NDUk9MTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQotICAgICAgICAgICAgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucwotICAgICAgICAgICAgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IgZGlmZmVuZW50IGVuY3J5cHRpb24gc3RyZW5ndGhzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VDUkVUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+TnpZMU5ETXlNVEE9PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmFsaWRhdGUgbWFuYWdlZCBiZWFucywgbmF2aWdhdGlvbiBydWxlcyBhbmQgZW5zdXJlIHRoYXQgZm9ybXMgYXJlIG5vdCBuZXN0ZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVHJlYXQgcmVhZG9ubHkgc2FtZSBhcyBpZiBkaXNhYmxlZCBhdHRyaWJ1dGUgd2FzIHNldCBmb3Igc2VsZWN0IGVsZW1lbnRzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUkVBRE9OTFlfQVNfRElTQUJMRURfRk9SX1NFTEVDVFM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBVc2UgdGhlIGRlZmluZWQgY2xhc3MgYXMgdGhlIGNsYXNzIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSByZXNvdXJjZSBpcyBhZGRlZCB0byB0aGUKLSAgICAgICAgICAgIEV4dGVuc2lvbkZpbHRlciBoYW5kbGluZy4gVXNpbmcgU3RyZWFtaW5nQWRkUmVzb3VyY2UgaGVyZSBoZWxwcyB3aXRoIHBlcmZvcm1hbmNlLiBJZiB5b3Ugd2FudCB0byBhZGQKLSAgICAgICAgICAgIGN1c3RvbSBjb21wb25lbnRzIGFuZCB3YW50IHRvIHVzZSB0aGUgRXh0ZW5zaW9uRmlsdGVyLCB5b3UgbmVlZCB0byBwcm92aWRlIHlvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIGhlcmUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BRERfUkVTT1VSQ0VfQ0xBU1M8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwudXRpbC5EZWZhdWx0QWRkUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgICAgIAotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZpcnR1YWwgcGF0aCBpbiB0aGUgVVJMIHdoaWNoIHRyaWdnZXJzIGxvYWRpbmcgb2YgcmVzb3VyY2VzIGZvciB0aGUgTXlGYWNlcyBleHRlbmRlZCBjb21wb25lbnRzCi0gICAgICAgICAgICBpbiB0aGUgRXh0ZW5zaW9uRmlsdGVyLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUkVTT1VSQ0VfVklSVFVBTF9QQVRIPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L2ZhY2VzL215RmFjZXNFeHRlbnNpb25SZXNvdXJjZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBDaGVjayBpZiB0aGUgZXh0ZW5zaW9ucy1maWx0ZXIgaGFzIGJlZW4gcHJvcGVybHkgY29uZmlndXJlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNIRUNLX0VYVEVOU0lPTlNfRklMVEVSPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBEZWZpbmUgcGFydGlhbCBzdGF0ZSBzYXZpbmcgYXMgdHJ1ZS9mYWxzZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuUEFSVElBTF9TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0KLSAgICA8IS0tIExpc3RlbmVyLCB0byBhbGxvdyBKZXR0eSBzZXJ2aW5nIE15RmFjZXMgYXBwcyAtLT4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMud2ViYXBwLlN0YXJ0dXBTZXJ2bGV0Q29udGV4dExpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IC0tPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmcgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4qLmpzZjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4LmpzcDwvd2VsY29tZS1maWxlPgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM0MmQ2OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgICA8Zjp2aWV3PgotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPgotICAgICAgICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMyI+Ci0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJmaXJzdF9uYW1lIiB2YWx1ZT0iRmlyc3QgbmFtZSo6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJmaXJzdF9uYW1lIiB2YWx1ZT0iI3toZWxsb1dvcmxkLnBlcnNvbi5maXJzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9ImZpcnN0X25hbWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIgc2hvd0RldGFpbD0idHJ1ZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4KLQotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0ibGFzdF9uYW1lIiB2YWx1ZT0iTGFzdCBuYW1lKio6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJsYXN0X25hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJsYXN0X25hbWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIgc2hvd0RldGFpbD0idHJ1ZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4KLQotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Xb3JsZC5zZW5kfSIvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgICAgICAgPC9oOmZvcm0+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgICAgICA8aHIvPgotICAgICAgICAqIG5vbmUgYmxvY2tpbmcgd2FybiBtb2RlPGJyLz4KLSAgICAgICAgKiogYmxvY2tpbmcgZXJyb3IgbW9kZQotICAgIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ODJkNTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCBwYWdlIHNlc3Npb249ImZhbHNlIiU+Ci08JQotcmVzcG9uc2Uuc2VuZFJlZGlyZWN0KCJoZWxsb1dvcmxkLmpzZiIpOwotJT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWM4NTIzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgICA8Zjp2aWV3PgotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPgotICAgICAgICAgICAgICAgIDxoMj48aDpvdXRwdXRUZXh0IHZhbHVlPSJIZWxsbyAje2hlbGxvV29ybGQucGVyc29uLmZpcnN0TmFtZX0gI3toZWxsb1dvcmxkLnBlcnNvbi5sYXN0TmFtZX0uIFdlIGhvcGUgeW91IGVuam95IEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yISIvPjwvaDI+Ci0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZExpbmsgYWN0aW9uPSJiYWNrIj4KLSAgICAgICAgICAgICAgICAgICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iSG9tZSIvPgotICAgICAgICAgICAgICAgIDwvaDpjb21tYW5kTGluaz4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICA8L2Y6dmlldz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL2V4YW1wbGVzL3BvbS54bWwgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE3ZDY2Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvZXhhbXBsZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0NCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIHByb2plY3Q8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvZXhhbXBsZXM8L2Nvbm5lY3Rpb24+DQotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvZXhhbXBsZXM8L2RldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy9leGFtcGxlczwvdXJsPg0KLSAgICA8L3NjbT4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPCEtLVRoaXMgcGx1Z2luIGFsbG93cyB0byBydW4gdGhlIGV4YW1wbGUgdXNpbmcgbXZuIGpldHR5OnJ1biAtLT4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpldHR5LXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Ni4xLjg8L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+MTA8L3NjYW5JbnRlcnZhbFNlY29uZHM+DQotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi0gICAgPG1vZHVsZXM+DQotICAgICAgICA8bW9kdWxlPmhlbGxvX3dvcmxkPC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPmhlbGxvX2JlYW4tdmFsaWRhdGlvbjwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5mZWF0dXJlLXNldF8wMTwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5mZWF0dXJlLXNldF8wMjwvbW9kdWxlPg0KLSAgICA8L21vZHVsZXM+DQotDQotICAgIDxwcm9maWxlcz4NCi0gICAgICAgIDwhLS0gVGhpcyBwcm9maWxlIGlzIGludm9rZWQgYnkgLURwcmVwYXJlUmVsZWFzZT10cnVlLiAgVGhpcyBhbGxvd3MgbXZuIHJlbGVhc2U6cHJlcGFyZSB0bw0KLSAgICAgICAgICAgIHJ1biBzdWNjZXNzZnVsbHkgb24gdGhlIGFzc2VtYmx5IHByb2plY3RzLiAtLT4NCi0gICAgICAgIDxwcm9maWxlPg0KLSAgICAgICAgICAgIDxpZD5wcmVwYXJlLXJlbGVhc2U8L2lkPg0KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPg0KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+DQotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wcmVwYXJlUmVsZWFzZTwvbmFtZT4NCi0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8L2FjdGl2YXRpb24+DQotICAgICAgICAgICAgPG1vZHVsZXM+DQotICAgICAgICAgICAgICAgIDxtb2R1bGU+YXNzZW1ibHk8L21vZHVsZT4NCi0gICAgICAgICAgICA8L21vZHVsZXM+DQotICAgICAgICAgICAgPGJ1aWxkPg0KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVsZWFzZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+LURwcmVwYXJlUmVsZWFzZTwvYXJndW1lbnRzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+DQotICAgICAgICAgICAgPC9idWlsZD4NCi0gICAgICAgIDwvcHJvZmlsZT4NCi0gICAgPC9wcm9maWxlcz4NCi0NCi0gICAgPHByb3BlcnRpZXM+DQotICAgICAgICA8dHJpbmlkYWQudmVyc2lvbj4xLjAuOTwvdHJpbmlkYWQudmVyc2lvbj4NCi0gICAgPC9wcm9wZXJ0aWVzPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvcGFyZW50L0xJQ0VOU0UudHh0IGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3BhcmVudC9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvcGFyZW50L0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvcGFyZW50L05PVElDRS50eHQgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvcGFyZW50L05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZjM2M2EuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3BhcmVudC9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcgotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9wYXJlbnQvcG9tLnhtbCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9wYXJlbnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBlNTJmYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvcGFyZW50L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj42PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjEuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFByb2plY3QgUGFyZW50PC9uYW1lPgotICAgIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExPC91cmw+Ci0KLSAgICA8aXNzdWVNYW5hZ2VtZW50PgotICAgICAgICA8c3lzdGVtPmppcmE8L3N5c3RlbT4KLSAgICAgICAgPHVybD5odHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvRVhUVkFMPC91cmw+Ci0gICAgPC9pc3N1ZU1hbmFnZW1lbnQ+Ci0KLSAgICA8Y2lNYW5hZ2VtZW50PgotICAgICAgICA8c3lzdGVtPmNvbnRpbnV1bTwvc3lzdGVtPgotICAgICAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLnpvbmVzLmFwYWNoZS5vcmc6ODA4MC9jb250aW51dW08L3VybD4KLSAgICAgICAgPG5vdGlmaWVycz4KLSAgICAgICAgICAgIDxub3RpZmllcj4KLSAgICAgICAgICAgICAgICA8dHlwZT5tYWlsPC90eXBlPgotICAgICAgICAgICAgICAgIDxzZW5kT25TdWNjZXNzPnRydWU8L3NlbmRPblN1Y2Nlc3M+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhZGRyZXNzPmNvbW1pdHNAbXlmYWNlcy5hcGFjaGUub3JnPC9hZGRyZXNzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvbm90aWZpZXI+Ci0gICAgICAgIDwvbm90aWZpZXJzPgotICAgIDwvY2lNYW5hZ2VtZW50PgotICAgIAotICAgIDxpbmNlcHRpb25ZZWFyPjIwMDg8L2luY2VwdGlvblllYXI+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+TUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLQotICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KLSAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+Ci0KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS0KLSAgICAgICAgICAgICAgICAgICAgLSBDb3B5IExJQ0VOU0UudHh0IGFuZCBOT1RJQ0UudHh0IHNvIHRoYXQgdGhleSBhcmUgaW5jbHVkZWQKLSAgICAgICAgICAgICAgICAgICAgLSBpbiB0aGUgLWphdmFkb2MgamFyIGZpbGUgZm9yIHRoZSBjb21wb25lbnQuCi0gICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+amF2YWRvYy5yZXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hcGlkb2NzL01FVEEtSU5GIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTElDRU5TRS50eHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTk9USUNFLnR4dCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmphdmFkb2Muc2l0ZS5jb3B5PC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5zaXRlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENvcHkgamF2YWRvYyB0byBhbm90aGVyIGRpcmVjdG9yeSwgdG8ga2VlcCBqYXZhZG9jIG9mIHByZXZpb3VzIHZlcnNpb25zIG9uIHNpdGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zaXRlL2FwaWRvY3MtJHtwcm9qZWN0LnZlcnNpb259IiBmYWlsb25lcnJvcj0iZmFsc2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc2l0ZS9hcGlkb2NzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgICAgLSBNYWtlIGEgY2hlY2tzdHlsZSB2aW9sYXRpb24gYSBjb21waWxlIGVycm9yLiBOb3RlIHRoYXQgaWYgYSBjb21waWxlIGVycm9yIG9jY3VycywKLSAgICAgICAgICAgICAgICAtIGZ1cnRoZXIgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRhcmdldC9zaXRlL2NoZWNrc3R5bGUuaHRtbCAocHJlc2VudCBldmVuIHdoZW4KLSAgICAgICAgICAgICAgICAtIGp1c3QgdGhlIGNvbXBpbGUgZ29hbCBhbmQgbm90IHRoZSBzaXRlIGdvYWwgaGFzIGJlZW4gcnVuKS4gTm90ZSBhbHNvIHRoYXQgY2hpbGQKLSAgICAgICAgICAgICAgICAtIHByb2plY3RzIG1heSByZWRlY2xhcmUgdGhpcyBwbHVnaW4gYW5kIHByb3ZpZGUgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MKLSAgICAgICAgICAgICAgICAtIHRvIHVzZSBkaWZmZXJlbnQgY2hlY2tzIChtb3JlIG9yIGxlc3Mgc3RyaWN0IHRoYW4gdGhlIGRlZmF1bHQpLgotICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD52ZXJpZnktc3R5bGU8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWdMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0YW5kYXJkLnhtbDwvY29uZmlnTG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxoZWFkZXJMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtaGVhZGVyLnR4dDwvaGVhZGVyTG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tIFNldCBjb21waWxlIHNvdXJjZSBhdCAxLjUsIHNpbmNlIHRoZSB0YXJnZXQgSlNGIGltcGwgaXMgMS4yIC0tPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvcHRpbWl6ZT5mYWxzZTwvb3B0aW1pemU+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+ICAgICAgICAgICAgCi0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi0gICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+bWF2ZW4yLXJlcG9zaXRvcnkuZGV2LmphdmEubmV0PC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkphdmEubmV0IFJlcG9zaXRvcnkgZm9yIE1hdmVuPC9uYW1lPgotICAgICAgICAgICAgPHVybD5odHRwOi8vZG93bmxvYWQuamF2YS5uZXQvbWF2ZW4vMS88L3VybD4KLSAgICAgICAgICAgIDxsYXlvdXQ+bGVnYWN5PC9sYXlvdXQ+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICA8L3JlcG9zaXRvcmllcz4KLQotICAgIDxyZXBvcnRpbmc+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tanhyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcmVwb3J0LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcG1kLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxydWxlc2V0cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxydWxlc2V0Pi9ydWxlc2V0cy9iYXNpYy54bWw8L3J1bGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvdW51c2VkY29kZS54bWw8L3J1bGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvcnVsZXNldHM+Ci0gICAgICAgICAgICAgICAgICAgIDxsaW5rWHJlZj50cnVlPC9saW5rWHJlZj4KLSAgICAgICAgICAgICAgICAgICAgPG1pbmltdW1Ub2tlbnM+MTAwPC9taW5pbXVtVG9rZW5zPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0SmRrPjEuNTwvdGFyZ2V0SmRrPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY2hlY2tzdHlsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlnTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdGFuZGFyZC54bWw8L2NvbmZpZ0xvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aGVhZGVyTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWhlYWRlci50eHQ8L2hlYWRlckxvY2F0aW9uPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9yZXBvcnRpbmc+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy9wYXJlbnQ8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy9wYXJlbnQ8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMV8yX3JjL3BhcmVudDwvdXJsPgotICAgIDwvc2NtPgotCi0gICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgICAgIDxzbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8dW5pcXVlVmVyc2lvbj5mYWxzZTwvdW5pcXVlVmVyc2lvbj4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUuc25hcHNob3RzPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBNYXZlbiBTbmFwc2hvdCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1zbmFwc2hvdC1yZXBvc2l0b3J5PC91cmw+Ci0gICAgICAgIDwvc25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICA8c2l0ZT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc2l0ZTwvaWQ+Ci0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMTwvdXJsPgotICAgICAgICA8L3NpdGU+Ci0gICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgotCi0gICAgPHByb2ZpbGVzPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5nZW5lcmF0ZS1hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPnBlcmZvcm1SZWxlYXNlPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1qYXZhZG9jczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotICAgIDwvcHJvZmlsZXM+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGpzZi52ZXJzaW9uPjEuMS41PC9qc2YudmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3BhcmVudC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3BhcmVudC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTEzNDJmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIC0tLS0tLQ0KLU92ZXJ2aWV3DQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4xDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLnggYW5kIEpTRiAyLnguIEFsbCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41Kw0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9wYXJlbnQvc3JjL3NpdGUvYXB0L2phdmFkb2MuYXB0IGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3BhcmVudC9zcmMvc2l0ZS9hcHQvamF2YWRvYy5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NzA1YTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3BhcmVudC9zcmMvc2l0ZS9hcHQvamF2YWRvYy5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0gLS0tLS0tDQotSmF2YWRvYw0KLSAtLS0tLS0NCi0NCi1KYXZhZG9jDQotDQotICAgIEhlcmUgeW91IGNhbiBmaW5kIHRoZSBqYXZhZG9jIG9mIHByZXZpb3VzIGV4dHZhbCB2ZXJzaW9ucy4NCi0NCi0gICAgKiB7e3todHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvbXlmYWNlcy1leHR2YWwtY29yZS9hcGlkb2NzLTEuMS4xL2luZGV4Lmh0bWx9TXlmYWNlcyBFeHRWYWwgQ29yZSBWZXJzaW9uIDEuMS4xfX0NCi0NCi0gICAgKiB7e3todHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvdmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbi9hcGlkb2NzLTEuMS4xL2luZGV4Lmh0bWx9TXlmYWNlcyBFeHRWYWwgUHJvcGVydHkgVmFsaWRhdGlvbiBWZXJzaW9uIDEuMS4xfX0NCi0NCi0gICAgKiB7e3todHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvbXlmYWNlcy1leHR2YWwtY29yZS9hcGlkb2NzLTEuMS4yL2luZGV4Lmh0bWx9TXlmYWNlcyBFeHRWYWwgQ29yZSBWZXJzaW9uIDEuMS4yfX0NCi0NCi0gICAgKiB7e3todHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvdmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbi9hcGlkb2NzLTEuMS4yL2luZGV4Lmh0bWx9TXlmYWNlcyBFeHRWYWwgUHJvcGVydHkgVmFsaWRhdGlvbiBWZXJzaW9uIDEuMS4yfX0NCi0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvcGFyZW50L3NyYy9zaXRlL3NpdGUueG1sIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3BhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUyYWJmNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvcGFyZW50L3NyYy9zaXRlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IG5hbWU9IkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIj4KLSAgPGJhbm5lckxlZnQ+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0VmFsPC9uYW1lPgotICAgIDxzcmM+aW1hZ2VzL2V4dHZhbF9sb2dvLnBuZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW5kZXguaHRtbDwvaHJlZj4KLSAgPC9iYW5uZXJMZWZ0PgotCi0gIDxiYW5uZXJSaWdodD4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlczwvbmFtZT4KLSAgICA8c3JjPmltZy9iYW5uZXJzL015RmFjZXNfbG9nby5qcGc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWw8L2hyZWY+Ci0gIDwvYmFubmVyUmlnaHQ+Ci0KLSAgPHB1Ymxpc2hEYXRlIGZvcm1hdD0iZGQgTU1NIHl5eXkiLz4KLQotICA8c2tpbj4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1zaXRlLXNraW48L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9za2luPgotCi0gIDxib2R5PgotICAgIDxsaW5rcz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSIgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJNeUZhY2VzIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkRvd25sb2FkIE15ZmFjZXMgRXh0VmFsIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Rvd25sb2FkLmh0bWwiLz4KLSAgICA8L2xpbmtzPgotCi0gICAgPG1lbnUgbmFtZT0iQXBhY2hlIE15RmFjZXMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9kb3dubG9hZC5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgbmFtZT0iQ29udGVudHMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9Ik1haW4gU2l0ZSIgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgPGl0ZW0gbmFtZT0iRXh0VmFsIGZvciBKU0YgMS4xIiAgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IkNvcmUgTW9kdWxlIiAgICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExL215ZmFjZXMtZXh0dmFsLWNvcmUvaW5kZXguaHRtbCIvPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJQcm9wZXJ0eSBWYWxpZGF0aW9uIiAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS92YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iVHJpbmlkYWQgU3VwcG9ydCIgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQvaW5kZXguaHRtbCIvPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJHZW5lcmljIFN1cHBvcnQiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS9jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0L2luZGV4Lmh0bWwiLz4KLSAgICAgICAgPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjIiICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2luZGV4Lmh0bWwiIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9ImR1bW15IiAgICAgICAgaHJlZj0iZHVtbXkiLz4KLSAgICAgICAgPC9pdGVtPgotICAgIDwvbWVudT4KLQkKLSAgICA8bWVudSBuYW1lPSJEb2N1bWVudGF0aW9uIj4KLSAgICAgIDxpdGVtIG5hbWU9Ildpa2kiICAgICAgICAgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9teWZhY2VzL0V4dGVuc2lvbnMvVmFsaWRhdG9yLyIvPgotICAgICAgPGl0ZW0gbmFtZT0iSmF2YWRvYyIgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvamF2YWRvYy5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgcmVmPSJyZXBvcnRzIi8+Ci0KLSAgICA8bWVudSBuYW1lPSJGb3VuZGF0aW9uIiBpbmhlcml0PSJib3R0b20iPgotICAgICAgPGl0ZW0gbmFtZT0iQVNGIiAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iIC8+Ci0gICAgICA8aXRlbSBuYW1lPSJTcG9uc29yc2hpcCIgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vc3BvbnNvcnNoaXAuaHRtbCIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlRoYW5rcyIgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi90aGFua3MuaHRtbCIgLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS9wb20ueG1sIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MmNhZDAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtbW9kdWxlPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgTW9kdWxlPC9uYW1lPgotICAgIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExPC91cmw+Ci0gICAgCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvYnJhbmNoX2Zvcl9qc2ZfMV8xLzwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzFfMS88L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzL2JyYW5jaF9mb3JfanNmXzFfMS88L3VybD4KLSAgICA8L3NjbT4gICAgCi0KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDx1bmlxdWVWZXJzaW9uPmZhbHNlPC91bmlxdWVWZXJzaW9uPgotICAgICAgICAgICAgPGlkPmFwYWNoZS5zbmFwc2hvdHM8L2lkPgotICAgICAgICAgICAgPG5hbWU+QXBhY2hlIE1hdmVuIFNuYXBzaG90IFJlcG9zaXRvcnk8L25hbWU+Ci0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4KLSAgICAgICAgPC9zbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgICAgIDxzaXRlPgotICAgICAgICAgICAgPGlkPmFwYWNoZS1zaXRlPC9pZD4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyPC91cmw+Ci0gICAgICAgIDwvc2l0ZT4KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0KLSAgICA8IS0tIFdBUk5JTkc6IERPIE5PVCBHRU5FUkFURSBTSVRFIEZST00gSEVSRSBESVJFQ1RMWQotICAgIFNpbmNlIHRoaXMgcHJvamVjdCBoYXMgYW4gYXN5bmMgcmVsZWFzZSBwcm9jZWR1cmUgKG5vdAotICAgIGFsbCBtb2R1bGVzIHNob3VsZCBiZSByZWxlYXNlZCBhdCBvbmNlKSwgdGhlIHBhcmVudCBwb20ueG1sIAotICAgIGlzIG5vdCB0aGlzICh0aGVyZSBpcyBhIG1vZHVsZSBmb3IgdGhhdCkuIFVzZSBtYXZlbiBzaXRlIAotICAgIHBsdWdpbiBoZXJlIGNhdXNlIHByb2JsZW1zIHdoZW4gdGhlIHNpdGUgaXMgZ2VuZXJhdGVkLgotICAgIFRoZSBwcm9jZWR1cmUgbXVzdCBleGVjdXRlIHNpdGUgY29tbW1hbmQgZmlyc3Qgb24gcGFyZW50IAotICAgIG1vZHVsZSBhbmQgdGhlbiBvbiBlYWNoIG1vZHVsZSBsaXN0ZWQgYmVsb3cuIAotICAgICAtLT4KLQotICAgIDxtb2R1bGVzPgotICAgICAgICA8bW9kdWxlPnBhcmVudDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmNvcmU8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT52YWxpZGF0aW9uLW1vZHVsZXM8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5jb21wb25lbnQtc3VwcG9ydDwvbW9kdWxlPgotICAgICAgICA8IS0tbW9kdWxlPnRlc3QtbW9kdWxlczwvbW9kdWxlLS0+Ci0gICAgICAgIDwhLS1tb2R1bGU+ZXhhbXBsZXM8L21vZHVsZS0tPgotICAgIDwvbW9kdWxlcz4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPCEtLSBUaGlzIHByb2ZpbGUgaXMgaW52b2tlZCBieSAtRHByZXBhcmVSZWxlYXNlPXRydWUuICBUaGlzIGFsbG93cyBtdm4gcmVsZWFzZTpwcmVwYXJlIHRvCi0gICAgICAgICAgICBydW4gc3VjY2Vzc2Z1bGx5IG9uIHRoZSBhc3NlbWJseSBwcm9qZWN0cy4gLS0+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPnByZXBhcmUtcmVsZWFzZTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPnByZXBhcmVSZWxlYXNlPC9uYW1lPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8bW9kdWxlcz4KLSAgICAgICAgICAgICAgICA8bW9kdWxlPmFzc2VtYmx5PC9tb2R1bGU+Ci0gICAgICAgICAgICA8L21vZHVsZXM+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZWxlYXNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+LURwcmVwYXJlUmVsZWFzZTwvYXJndW1lbnRzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLSAgICAKLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGpzZi52ZXJzaW9uPjEuMS41PC9qc2YudmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvcG9tLnhtbCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNWIwYTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIEJhc2UtVGVzdC1JbmZyYXN0cnVjdHVyZTwvbmFtZT4NCi0gICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+dGVzdC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2MWNmOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvQWJzdHJhY3RFeFZhbFRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvQWJzdHJhY3RFeFZhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMjFlMTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL0Fic3RyYWN0RXhWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2U7DQotDQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUlucHV0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkV4dFZhbFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5EZWZhdWx0RmFjdG9yeUZpbmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlByb2plY3RTdGFnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5FTEhlbHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuQWJzdHJhY3RFTEhlbHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UubW9jay5Nb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrLk1vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLm1vY2suTW9ja01ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLm1vY2suTW9ja0VMSGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLnV0aWwuVGVzdFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuc2hhcmVkX2ltcGwuY29uZmlnLk15ZmFjZXNDb25maWc7DQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0V4dGVybmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0ZhY2VzQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0ZhY2VzQ29udGV4dEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tIdHRwU2VydmxldFJlcXVlc3Q7DQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tIdHRwU2VydmxldFJlc3BvbnNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrSHR0cFNlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tMaWZlY3ljbGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tMaWZlY3ljbGVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrUmVuZGVyS2l0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrUmVzcG9uc2VXcml0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tTZXJ2bGV0Q29uZmlnOw0KLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QubW9jay5Nb2NrU2VydmxldENvbnRleHQ7DQotDQotLyoqDQotICogQWJzdHJhY3QgU2hhbGUgVGVzdCBiYXNlIGNsYXNzLCB3aGljaCBzZXRzIHVwIHRoZSBKU0YgZW52aXJvbm1lbnQuICBJZiB0aGUgdGVzdA0KLSAqIG92ZXJyaWRlcyA8Y29kZT5zZXRVcCgpPC9jb2RlPiBhbmQvb3IgPGNvZGU+dGVhckRvd24oKTwvY29kZT4sIHRoZW4gdGhvc2UNCi0gKiBtZXRob2RzIGJ1dCBjYWxsIHRoZSBvdmVyd2l0dGVuIG1ldGhvZCB0byBpbnN1cmUgYSB2YWxpZCB0ZXN0IGVudmlyb25tZW50Lg0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEV4VmFsVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0gICAgcHJvdGVjdGVkIE1vY2tBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbjsNCi0gICAgcHJvdGVjdGVkIE1vY2tTZXJ2bGV0Q29uZmlnIGNvbmZpZzsNCi0gICAgcHJvdGVjdGVkIE1vY2tFeHRlcm5hbENvbnRleHQgZXh0ZXJuYWxDb250ZXh0Ow0KLSAgICBwcm90ZWN0ZWQgTW9ja0ZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQ7DQotICAgIHByb3RlY3RlZCBNb2NrRmFjZXNDb250ZXh0RmFjdG9yeSBmYWNlc0NvbnRleHRGYWN0b3J5Ow0KLSAgICBwcm90ZWN0ZWQgTW9ja0xpZmVjeWNsZSBsaWZlY3ljbGU7DQotICAgIHByb3RlY3RlZCBNb2NrTGlmZWN5Y2xlRmFjdG9yeSBsaWZlY3ljbGVGYWN0b3J5Ow0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyS2l0IHJlbmRlcktpdDsNCi0gICAgcHJvdGVjdGVkIE1vY2tIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdDsNCi0gICAgcHJvdGVjdGVkIE1vY2tIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlOw0KLSAgICBwcm90ZWN0ZWQgTW9ja1NlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0Ow0KLSAgICBwcm90ZWN0ZWQgTW9ja0h0dHBTZXNzaW9uIHNlc3Npb247DQotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyOw0KLQ0KLSAgICAvKiogUmVzcG9uc2UgV3JpdGVyICovDQotICAgIHByaXZhdGUgTW9ja1Jlc3BvbnNlV3JpdGVyIHdyaXRlcjsNCi0NCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBBYnN0cmFjdEV4VmFsVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgYXBwbGljYXRpb24gPSBudWxsOw0KLSAgICAgICAgY29uZmlnID0gbnVsbDsNCi0gICAgICAgIGV4dGVybmFsQ29udGV4dCA9IG51bGw7DQotICAgICAgICBmYWNlc0NvbnRleHQgPSBudWxsOw0KLSAgICAgICAgZmFjZXNDb250ZXh0RmFjdG9yeSA9IG51bGw7DQotICAgICAgICBsaWZlY3ljbGUgPSBudWxsOw0KLSAgICAgICAgbGlmZWN5Y2xlRmFjdG9yeSA9IG51bGw7DQotICAgICAgICByZW5kZXJLaXQgPSBudWxsOw0KLSAgICAgICAgcmVxdWVzdCA9IG51bGw7DQotICAgICAgICByZXNwb25zZSA9IG51bGw7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dCA9IG51bGw7DQotICAgICAgICBzZXNzaW9uID0gbnVsbDsNCi0gICAgICAgIHRocmVhZENvbnRleHRDbGFzc0xvYWRlciA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqICBTZXR1cCB0aGUgdGVzdCBlbnZpcm9ubWVudCwgaW5jbHVkaW5nIHRoZSBmb2xsb3dpbmc6DQotICAgICAqICA8dWw+DQotICAgICAqICA8bGk+U2V0IHRoZSBBcHBsaWNhdGlvbiBNYXAuPC9saT4NCi0gICAgICogIDxsaT5TZXQgYSByZXNwb25zZSB3cml0ZXI8L2xpPg0KLSAgICAgKiAgPGxpPkFkZCBUb21haGF3aydzIHJlbmRlcmVycyB0byB0aGUgZmFjZXMgY29udGV4dC48L2xpPg0KLSAgICAgKiAgPC91bD4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOw0KLSAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIobmV3IFVSTENsYXNzTG9hZGVyKG5ldyBVUkxbMF0sIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkpOw0KLSAgICAgICAgc2VydmxldENvbnRleHQgPSBuZXcgTW9ja1NlcnZsZXRDb250ZXh0KCk7DQotICAgICAgICAvL2ZvciB0ZXN0aW5nIHRoZSBmYWxsYmFjaw0KLSAgICAgICAgLy9zZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVggKyAiLkRFQUNUSVZBVEVfRUxfUkVTT0xWRVIiLCAidHJ1ZSIpOw0KLSAgICAgICAgc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihFeHRWYWxJbmZvcm1hdGlvbi5XRUJYTUxfUEFSQU1fUFJFRklYICsgIi5DVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZIiwgTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCArICIuQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSIsIE1vY2tNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVggKyAiLkNVU1RPTV9NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSIsIE1vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgY29uZmlnID0gbmV3IE1vY2tTZXJ2bGV0Q29uZmlnKHNlcnZsZXRDb250ZXh0KTsNCi0gICAgICAgIHNlc3Npb24gPSBuZXcgTW9ja0h0dHBTZXNzaW9uKCk7DQotICAgICAgICBzZXNzaW9uLnNldFNlcnZsZXRDb250ZXh0KHNlcnZsZXRDb250ZXh0KTsNCi0gICAgICAgIHJlcXVlc3QgPSBuZXcgTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdChzZXNzaW9uKTsNCi0gICAgICAgIHJlcXVlc3Quc2V0U2VydmxldENvbnRleHQoc2VydmxldENvbnRleHQpOw0KLSAgICAgICAgcmVzcG9uc2UgPSBuZXcgTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2UoKTsNCi0gICAgICAgIEZhY3RvcnlGaW5kZXIucmVsZWFzZUZhY3RvcmllcygpOw0KLSAgICAgICAgRmFjdG9yeUZpbmRlci5zZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3RvcnkiLCAib3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0FwcGxpY2F0aW9uRmFjdG9yeSIpOw0KLSAgICAgICAgRmFjdG9yeUZpbmRlci5zZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dEZhY3RvcnkiLCAib3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0ZhY2VzQ29udGV4dEZhY3RvcnkiKTsNCi0gICAgICAgIEZhY3RvcnlGaW5kZXIuc2V0RmFjdG9yeSgiamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZUZhY3RvcnkiLCAib3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0xpZmVjeWNsZUZhY3RvcnkiKTsNCi0gICAgICAgIEZhY3RvcnlGaW5kZXIuc2V0RmFjdG9yeSgiamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3RvcnkiLCAib3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1JlbmRlcktpdEZhY3RvcnkiKTsNCi0gICAgICAgIGV4dGVybmFsQ29udGV4dCA9IG5ldyBNb2NrRXh0ZXJuYWxDb250ZXh0KHNlcnZsZXRDb250ZXh0LCByZXF1ZXN0LCByZXNwb25zZSk7DQotICAgICAgICBsaWZlY3ljbGVGYWN0b3J5ID0gKE1vY2tMaWZlY3ljbGVGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMubGlmZWN5Y2xlLkxpZmVjeWNsZUZhY3RvcnkiKTsNCi0gICAgICAgIGxpZmVjeWNsZSA9IChNb2NrTGlmZWN5Y2xlKWxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlKCJERUZBVUxUIik7DQotICAgICAgICBmYWNlc0NvbnRleHRGYWN0b3J5ID0gKE1vY2tGYWNlc0NvbnRleHRGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHRGYWN0b3J5Iik7DQotICAgICAgICBmYWNlc0NvbnRleHQgPSAoTW9ja0ZhY2VzQ29udGV4dClmYWNlc0NvbnRleHRGYWN0b3J5LmdldEZhY2VzQ29udGV4dChzZXJ2bGV0Q29udGV4dCwgcmVxdWVzdCwgcmVzcG9uc2UsIGxpZmVjeWNsZSk7DQotICAgICAgICBleHRlcm5hbENvbnRleHQgPSAoTW9ja0V4dGVybmFsQ29udGV4dClmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCk7DQotICAgICAgICBVSVZpZXdSb290IHJvb3QgPSBuZXcgVUlWaWV3Um9vdCgpOw0KLSAgICAgICAgcm9vdC5zZXRWaWV3SWQoIi92aWV3SWQiKTsNCi0gICAgICAgIHJvb3Quc2V0UmVuZGVyS2l0SWQoIkhUTUxfQkFTSUMiKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5zZXRWaWV3Um9vdChyb290KTsNCi0gICAgICAgIEFwcGxpY2F0aW9uRmFjdG9yeSBhcHBsaWNhdGlvbkZhY3RvcnkgPSAoQXBwbGljYXRpb25GYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5Iik7DQotICAgICAgICBhcHBsaWNhdGlvbiA9IChNb2NrQXBwbGljYXRpb24pYXBwbGljYXRpb25GYWN0b3J5LmdldEFwcGxpY2F0aW9uKCk7DQotICAgICAgICBmYWNlc0NvbnRleHQuc2V0QXBwbGljYXRpb24oYXBwbGljYXRpb24pOw0KLSAgICAgICAgUmVuZGVyS2l0RmFjdG9yeSByZW5kZXJLaXRGYWN0b3J5ID0gKFJlbmRlcktpdEZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KCJqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeSIpOw0KLSAgICAgICAgLy9XcmFwIHJlbmRlcmVycyB3aXRoIHByb3BlciBleHZhbCB3cmFwcGVyDQotICAgICAgICByZW5kZXJLaXQgPSBuZXcgRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkuY3JlYXRlKG5ldyBNb2NrUmVuZGVyS2l0KCkpOw0KLSAgICAgICAgcmVuZGVyS2l0RmFjdG9yeS5hZGRSZW5kZXJLaXQoIkhUTUxfQkFTSUMiLCByZW5kZXJLaXQpOw0KLQ0KLSAgICAgICAgLy8gYWRkaXRpb25hbCBzZXR1cCBub3QgcHJvdmlkZWQgYXV0b21hdGljYWxseSBieSB0aGUgc2hhbGUgbW9jayBzdHVmZg0KLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uTWFwKCkucHV0KE15ZmFjZXNDb25maWcuY2xhc3MuZ2V0TmFtZSgpLCBuZXcgTXlmYWNlc0NvbmZpZygpKTsNCi0gICAgICAgIHdyaXRlciA9IG5ldyBNb2NrUmVzcG9uc2VXcml0ZXIobmV3IFN0cmluZ1dyaXRlcigpLCBudWxsLCBudWxsKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5zZXRSZXNwb25zZVdyaXRlcih3cml0ZXIpOw0KLQ0KLSAgICAgICAgVGVzdFV0aWxzLmFkZERlZmF1bHRSZW5kZXJlcnMoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIFRlc3RVdGlscy5hZGREZWZhdWx0VmFsaWRhdG9ycyhmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgZmluYWwgRUxIZWxwZXIgZGVmYXVsdEVsSGVscGVyID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRUxfSEVMUEVSX0ZBQ1RPUlksIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuc2V0Q3VzdG9tRUxIZWxwZXJGYWN0b3J5KG5ldyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeSgpIHsNCi0NCi0gICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBFTEhlbHBlciBjcmVhdGVFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2NrRUxIZWxwZXIoZGVmYXVsdEVsSGVscGVyKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSk7DQotICAgICAgICANCi0gICAgICAgIC8vZXhlY3V0ZSBzdGFydHVwIGxpc3RlbmVyDQotICAgICAgICBuZXcgRXh0VmFsU3RhcnR1cExpc3RlbmVyKCkgew0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoUHJvamVjdFN0YWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpLCBnZXRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpLCBmYWxzZSk7DQotICAgICAgICAgICAgICAgIHN1cGVyLmluaXQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9LmluaXQoKTsNCi0NCi0gICAgICAgIGludm9rZVN0YXJ0dXBMaXN0ZW5lcnMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbnZva2VTdGFydHVwTGlzdGVuZXJzKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBUZWFyIGRvd24gdGhlIHRlc3QgZW52aXJvbm1lbnQuDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgcmVzZXRGYWN0b3J5RmluZGVyKCk7DQotICAgICAgICByZXNldEV4dFZhbENvbnRleHQoKTsNCi0NCi0gICAgICAgIGFwcGxpY2F0aW9uID0gbnVsbDsNCi0gICAgICAgIGNvbmZpZyA9IG51bGw7DQotICAgICAgICBleHRlcm5hbENvbnRleHQgPSBudWxsOw0KLSAgICAgICAgZmFjZXNDb250ZXh0LnJlbGVhc2UoKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dCA9IG51bGw7DQotICAgICAgICBsaWZlY3ljbGUgPSBudWxsOw0KLSAgICAgICAgbGlmZWN5Y2xlRmFjdG9yeSA9IG51bGw7DQotICAgICAgICByZW5kZXJLaXQgPSBudWxsOw0KLSAgICAgICAgcmVxdWVzdCA9IG51bGw7DQotICAgICAgICByZXNwb25zZSA9IG51bGw7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dCA9IG51bGw7DQotICAgICAgICBzZXNzaW9uID0gbnVsbDsNCi0gICAgICAgIEZhY3RvcnlGaW5kZXIucmVsZWFzZUZhY3RvcmllcygpOw0KLSAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIodGhyZWFkQ29udGV4dENsYXNzTG9hZGVyKTsNCi0gICAgICAgIHRocmVhZENvbnRleHRDbGFzc0xvYWRlciA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0RmFjdG9yeUZpbmRlcigpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZpZWxkIGZhY3RvcnlNYXAgPSBEZWZhdWx0RmFjdG9yeUZpbmRlci5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJmYWN0b3J5TWFwIik7DQotICAgICAgICAgICAgZmFjdG9yeU1hcC5zZXRBY2Nlc3NpYmxlKHRydWUpOw0KLSAgICAgICAgICAgIGZhY3RvcnlNYXAuc2V0KEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKSwgbmV3IEhhc2hNYXA8RmFjdG9yeU5hbWVzLCBPYmplY3Q+KCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbm5vdCByZXNldCB0aGUgZmFjdG9yeSBmaW5kZXIiLCB0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXNldEV4dFZhbENvbnRleHQoKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBGaWVsZCBjb250ZXh0ID0gRXh0VmFsQ29udGV4dC5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJleHRWYWxDb250ZXh0Iik7DQotICAgICAgICAgICAgY29udGV4dC5zZXRBY2Nlc3NpYmxlKHRydWUpOw0KLSAgICAgICAgICAgIGNvbnRleHQuc2V0KEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLCBudWxsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjYW5ub3QgcmVzZXQgdGhlIGV4dHZhbC1jb250ZXh0IiwgdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tNZXNzYWdlQ291bnQoaW50IGV4cGVjdGVkKQ0KLSAgICB7DQotICAgICAgICBpbnQgYWN0dWFsID0gMDsNCi0gICAgICAgIGZvcihJdGVyYXRvciBtZXNzYWdlcyA9IGZhY2VzQ29udGV4dC5nZXRNZXNzYWdlcygpOyBtZXNzYWdlcy5oYXNOZXh0KCk7KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1lc3NhZ2VzLm5leHQoKTsNCi0gICAgICAgICAgICBhY3R1YWwrKzsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGFzc2VydEVxdWFscygiQ29tcGxldGUgbWVzc2FnZSBjb3VudCIsIGV4cGVjdGVkLCBhY3R1YWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrTWVzc2FnZUNvdW50KFN0cmluZyBjbGllbnRJZCwgaW50IGV4cGVjdGVkKQ0KLSAgICB7DQotICAgICAgICBpbnQgYWN0dWFsID0gMDsNCi0gICAgICAgIGZvcihJdGVyYXRvciBtZXNzYWdlcyA9IGZhY2VzQ29udGV4dC5nZXRNZXNzYWdlcyhjbGllbnRJZCk7IG1lc3NhZ2VzLmhhc05leHQoKTspDQotICAgICAgICB7DQotICAgICAgICAgICAgbWVzc2FnZXMubmV4dCgpOw0KLSAgICAgICAgICAgIGFjdHVhbCsrOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb21wbGV0ZSBtZXNzYWdlIGNvdW50IiwgZXhwZWN0ZWQsIGFjdHVhbCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU2V2ZXJpdHkuLi4gc2V2ZXJpdGllcykNCi0gICAgew0KLSAgICAgICAgaW50IGkgPSAwOw0KLSAgICAgICAgZm9yKEl0ZXJhdG9yIG1lc3NhZ2VzID0gZmFjZXNDb250ZXh0LmdldE1lc3NhZ2VzKCk7IG1lc3NhZ2VzLmhhc05leHQoKTspDQotICAgICAgICB7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNldmVyaXRpZXNbaV0sICgoRmFjZXNNZXNzYWdlKW1lc3NhZ2VzLm5leHQoKSkuZ2V0U2V2ZXJpdHkoKSk7DQotICAgICAgICAgICAgaSsrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGJvb2xlYW4gaXNCbG9ja2VkKQ0KLSAgICB7DQotICAgICAgICBhc3NlcnRFcXVhbHMoaXNCbG9ja2VkLCB0aGlzLmZhY2VzQ29udGV4dC5nZXRSZW5kZXJSZXNwb25zZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVmVyaWZ5IHRoZSBmb2xsb3dpbmc6DQotICAgICAqIDx1bD4NCi0gICAgICogPGxpPmlkIGlzIG5vdCBudWxsPC9saT4NCi0gICAgICogPGxpPlJlc3BvbnNlIGlzIGNvbXBsZXRlPC9saT4NCi0gICAgICogPGxpPlJlc3BvbmNlIGNvbnRhaW5zIHRoZSBpZDwvbGk+DQotICAgICAqIDwvdWw+DQotICAgICAqDQotICAgICAqIEBwYXJhbSBpZCBJRCB0byB2ZXJpZnkNCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydElkRXhpc3RzKFN0cmluZyBpZCkNCi0gICAgew0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiSUQgaXMgbm90IG51bGwiLCBpZCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJSZXNwb25zZSBDb21wbGV0ZSIsIGZhY2VzQ29udGV4dC5nZXRSZXNwb25zZUNvbXBsZXRlKCkpOw0KLSAgICAgICAgU3RyaW5nIG91dHB1dCA9IHdyaXRlci5nZXRXcml0ZXIoKS50b1N0cmluZygpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiSGFzIG91dHB1dCIsIG91dHB1dCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJDb250YWlucyBpZCAnIiArIGlkICsgIiciLCBvdXRwdXQuaW5kZXhPZihpZCkgIT0gLTEpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVZhbHVlQmluZGluZyhVSUlucHV0IHVpSW5wdXQsIFN0cmluZyBuYW1lLCBTdHJpbmcgZXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nIHZhbHVlQmluZGluZyA9IGFwcGxpY2F0aW9uLmNyZWF0ZVZhbHVlQmluZGluZyhleHByZXNzaW9uKTsNCi0NCi0gICAgICAgIGlmKHVpSW5wdXQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB1aUlucHV0LnNldFZhbHVlQmluZGluZyhuYW1lLCB2YWx1ZUJpbmRpbmcpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKFN0cmluZyBuYW1lLCBPYmplY3QgaW5zdGFuY2UpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhudWxsLCAidmFsdWUiLCAiI3siICsgbmFtZSArICJ9Iik7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dChuYW1lLCBpbnN0YW5jZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIDxUPiBUIHJlc29sdmVCZWFuKFN0cmluZyBuYW1lLCBDbGFzczxUPiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChUKSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4obmFtZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svTW9ja0VMSGVscGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrRUxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGViMjFlMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrRUxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UubW9jazsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi0NCi1wdWJsaWMgY2xhc3MgTW9ja0VMSGVscGVyIGltcGxlbWVudHMgRUxIZWxwZXINCi17DQotICAgIHByaXZhdGUgRUxIZWxwZXIgd3JhcHBlZDsNCi0NCi0gICAgcHVibGljIE1vY2tFTEhlbHBlcihFTEhlbHBlciB3cmFwcGVkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmVhbihTdHJpbmcgYmVhbk5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldEJlYW4oYmVhbk5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBpZigiI3t0cnVlfSIuZXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFR5cGVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvcGVydHlEZXRhaWxzIGdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaXNFTFRlcm1WYWxpZChmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtV2VsbEZvcm1lZChPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaXNFTFRlcm1XZWxsRm9ybWVkKG8pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmluZGluZ09mQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0QmluZGluZ09mQ29tcG9uZW50KHVpQ29tcG9uZW50LCBuYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svTW9ja01lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q1Mzg5Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTW9ja01lc3NhZ2VSZXNvbHZlckZhY3RvcnkgZXh0ZW5kcyBEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeQ0KLXsNCi0gICAgcHVibGljIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXRSZWdpc3RlcmVkTmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TmFtZU1hcHBlckxpc3QoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL01vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTBkNWQ4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL01vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIE1vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSBleHRlbmRzIERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeQ0KLXsNCi0gICAgcHVibGljIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXRSZWdpc3RlcmVkTmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TmFtZU1hcHBlckxpc3QoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk2NDJiYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIE1vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5IGV4dGVuZHMgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGNyZWF0ZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIC8vZm9yY2UgaW5pdCBzbyB0aGF0IGV2ZXJ5IHRlc3QtY2FzZSBzZXR1cCBtZXRob2QgY2FuIGFkZCBhIG1vY2sgdmFsaWRhdGlvbiBzdHJhdGVneSB2aWEgZXh0dmFsIGphdmEtYXBpDQotICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodGhpcyxSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoZ2V0Q2xhc3MoKSwgImluaXRTdGF0aWNNYXBwaW5ncyIpKTsNCi0gICAgICAgIHJldHVybiBzdXBlci5jcmVhdGUobWV0YURhdGFLZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gZ2V0UmVnaXN0ZXJlZE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldE5hbWVNYXBwZXJMaXN0KCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvTWV0aG9kVXRpbHMuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS91dGlsL01ldGhvZFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZjJlMjQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvTWV0aG9kVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UudXRpbDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotLy9UT0RPDQotcHVibGljIGNsYXNzIE1ldGhvZFV0aWxzDQotew0KLSAgICBwcml2YXRlIE1ldGhvZFV0aWxzKCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja01ldGhvZENhbGxlZChDbGFzcyB1c2VkQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBpbnQgY2FsbENvdW50KQ0KLSAgICB7DQotICAgICAgICBjaGVja1JlcXVpcmVkQ2xhc3ModXNlZENsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiBjYWxsQ291bnQgPT0gZ2V0TWV0aG9kQ2FsbENvdW50KHVzZWRDbGFzcywgbWV0aG9kTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWV0aG9kQ2FsbGVkKENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpDQotICAgIHsNCi0gICAgICAgIGNoZWNrUmVxdWlyZWRDbGFzcyh1c2VkQ2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkNCi0gICAgICAgICAgICAgICAgLmNvbnRhaW5zS2V5KHVzZWRDbGFzcy5nZXROYW1lKCkgKyAiIyIgKyBtZXRob2ROYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2lnbmFsTWV0aG9kQ2FsbGVkKENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIGludCBtZXRob2RDYWxsQ291bnQgPSAwOw0KLSAgICAgICAgU3RyaW5nIGtleSA9IHVzZWRDbGFzcy5nZXROYW1lKCkgKyAiIyIgKyBtZXRob2ROYW1lOw0KLQ0KLSAgICAgICAgaWYocmVxdWVzdE1hcC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGhvZENhbGxDb3VudCA9IChJbnRlZ2VyKXJlcXVlc3RNYXAuZ2V0KGtleSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXF1ZXN0TWFwLnB1dChrZXksICsrbWV0aG9kQ2FsbENvdW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TWV0aG9kQ2FsbENvdW50KENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIFN0cmluZyBrZXkgPSB1c2VkQ2xhc3MuZ2V0TmFtZSgpICsgIiMiICsgbWV0aG9kTmFtZTsNCi0NCi0gICAgICAgIGlmKHJlcXVlc3RNYXAuY29udGFpbnNLZXkoa2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKEludGVnZXIpcmVxdWVzdE1hcC5nZXQoa2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaWduYWxDbGFzc1VzZWQoQ2xhc3MgbW9ja0NsYXNzKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgICAgIC5wdXQobW9ja0NsYXNzLmdldE5hbWUoKSArICI6dXNlZCIsIHRydWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NsYXNzVXNlZChDbGFzcyBtb2NrQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgICAgIC5jb250YWluc0tleShtb2NrQ2xhc3MuZ2V0TmFtZSgpICsgIjp1c2VkIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1JlcXVpcmVkQ2xhc3MoQ2xhc3MgdXNlZENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzQ2xhc3NVc2VkKHVzZWRDbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbih1c2VkQ2xhc3MuZ2V0TmFtZSgpICsgIiBub3QgdXNlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS91dGlsL1Rlc3RVdGlscy5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvVGVzdFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNGYxNDkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvVGVzdFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS51dGlsOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWNlc0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotcHVibGljIGZpbmFsIGNsYXNzIFRlc3RVdGlscw0KLXsNCi0gICAgLyoqIERlZmF1bHQgTG9nZ2VyICovDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUZXN0VXRpbHMuY2xhc3MpOw0KLQ0KLSAgICAvKiogdXRpbGl0eSBjbGFzcywgZG8gbm90IGluc3RhbnRpYXRlICovDQotICAgIHByaXZhdGUgVGVzdFV0aWxzKCkNCi0gICAgew0KLSAgICAgICAgLy8gdXRpbGl0eSBjbGFzcywgZGlzYWJsZSBpbnN0YW50aWF0aW9uDQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZERlZmF1bHRWYWxpZGF0b3JzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpDQotICAgIHsNCi0gICAgICAgIGFkZFZhbGlkYXRvcihmYWNlc0NvbnRleHQsImphdmF4LmZhY2VzLkRvdWJsZVJhbmdlIiwgImphdmF4LmZhY2VzLnZhbGlkYXRvci5Eb3VibGVSYW5nZVZhbGlkYXRvciIpOw0KLSAgICAgICAgYWRkVmFsaWRhdG9yKGZhY2VzQ29udGV4dCwiamF2YXguZmFjZXMuTGVuZ3RoIiwgImphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3IiKTsNCi0gICAgICAgIGFkZFZhbGlkYXRvcihmYWNlc0NvbnRleHQsImphdmF4LmZhY2VzLkxvbmdSYW5nZSIsICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTG9uZ1JhbmdlVmFsaWRhdG9yIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFZhbGlkYXRvcihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0b3JJZCwgU3RyaW5nIHZhbGlkYXRvckNsYXNzKQ0KLSAgICB7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5hZGRWYWxpZGF0b3IodmFsaWRhdG9ySWQsIHZhbGlkYXRvckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQWRkIGFsbCBvZiBKU0YgMS4yIGRlZmF1bHQgcmVuZGVyZXJzLiAgQ3VycmVudGx5IHRoaXMgaXMgbm90IHRpZWQgdG8NCi0gICAgICogZmFjZXMtY29uZmlnLnhtbCwgc28gYWxsIGNoYW5nZSB0byB0aGUgZmlsZSBNVVNUIGFsc28gYmUgbWFkZSBoZXJlLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0DQotICAgICAqIEB0b2RvIERvIG5vdCBhZGQgcmVuZGVyZXIgaWYgcmVuZGVyZXIgaXMgYWxyZWFkeSBhZGRlZC4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGREZWZhdWx0UmVuZGVyZXJzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpDQotICAgIHsNCi0gICAgICAgIC8vIFN0YW5kYXJkIEhUTUwgUmVuZGVyZXJzDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5Db21tYW5kIiwgImphdmF4LmZhY2VzLkJ1dHRvbiIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEJ1dHRvblJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RCb29sZWFuIiwNCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkNoZWNrYm94IiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sQ2hlY2tib3hSZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0TWFueSIsDQotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5DaGVja2JveCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbENoZWNrYm94UmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkZvcm0iLCAiamF2YXguZmFjZXMuRm9ybSIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEZvcm1SZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuUGFuZWwiLCAiamF2YXguZmFjZXMuR3JpZCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEdyaWRSZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuUGFuZWwiLCAiamF2YXguZmFjZXMuR3JvdXAiLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxHcm91cFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5IaWRkZW4iLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxIaWRkZW5SZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuR3JhcGhpYyIsICJqYXZheC5mYWNlcy5JbWFnZSIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEltYWdlUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5MYWJlbCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbExhYmVsUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5MaW5rIiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlua1JlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5Db21tYW5kIiwgImphdmF4LmZhY2VzLkxpbmsiLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMaW5rUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsDQotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5MaXN0Ym94IiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlzdGJveFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RNYW55IiwNCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkxpc3Rib3giLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMaXN0Ym94UmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsICJqYXZheC5mYWNlcy5NZW51IiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTWVudVJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RNYW55IiwgImphdmF4LmZhY2VzLk1lbnUiLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxNZW51UmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk1lc3NhZ2UiLCAiamF2YXguZmFjZXMuTWVzc2FnZSIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lc3NhZ2VSZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuT3V0cHV0IiwgImphdmF4LmZhY2VzLkZvcm1hdCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEZvcm1hdFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5NZXNzYWdlcyIsDQotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5NZXNzYWdlcyIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lc3NhZ2VzUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsICJqYXZheC5mYWNlcy5SYWRpbyIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFJhZGlvUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLklucHV0IiwgImphdmF4LmZhY2VzLlNlY3JldCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFNlY3JldFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5EYXRhIiwgImphdmF4LmZhY2VzLlRhYmxlIiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGFibGVSZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuSW5wdXQiLCAiamF2YXguZmFjZXMuVGV4dGFyZWEiLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxUZXh0YXJlYVJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5UZXh0IiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGV4dFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5PdXRwdXQiLCAiamF2YXguZmFjZXMuVGV4dCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFRleHRSZW5kZXJlciIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBZGQgYSByZW5kZXJlciB0byB0aGUgRmFjZXNDb250ZXh0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IEZhY2VzIENvbnRleHQNCi0gICAgICogQHBhcmFtIGZhbWlseSBDb21wb25lbmV0IEZhbWlseQ0KLSAgICAgKiBAcGFyYW0gcmVuZGVyZXJUeXBlIENvbXBvbmVudCBUeXBlDQotICAgICAqIEBwYXJhbSByZW5kZXJDbGFzc05hbWUgQ2xhc3MgTmFtZSBvZiBSZW5kZXJlcg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFJlbmRlcmVyKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBmYW1pbHksDQotICAgICAgICAgICAgU3RyaW5nIHJlbmRlcmVyVHlwZSwgU3RyaW5nIHJlbmRlckNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSAoUmVuZGVyZXIpIG5ld0luc3RhbmNlKHJlbmRlckNsYXNzTmFtZSk7DQotICAgICAgICBSZW5kZXJLaXQga2l0ID0gZmFjZXNDb250ZXh0LmdldFJlbmRlcktpdCgpOw0KLSAgICAgICAga2l0LmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCByZW5kZXJlcik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRyaWVzIGEgQ2xhc3MubG9hZENsYXNzIHdpdGggdGhlIGNvbnRleHQgY2xhc3MgbG9hZGVyIG9mIHRoZSBjdXJyZW50IHRocmVhZCBmaXJzdCBhbmQNCi0gICAgICogYXV0b21hdGljYWxseSBmYWxscyBiYWNrIHRvIHRoZSBDbGFzc1V0aWxzIGNsYXNzIGxvYWRlciAoaS5lLiB0aGUgbG9hZGVyIG9mIHRoZQ0KLSAgICAgKiBteWZhY2VzLmphciBsaWIpIGlmIG5lY2Vzc2FyeS4NCi0gICAgICoNCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMNCi0gICAgICoNCi0gICAgICogQHBhcmFtIHR5cGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBub24tcHJpbWl0aXZlIG5vbi1hcnJheSBjbGFzcw0KLSAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIENsYXNzDQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdHlwZSBpcyBudWxsDQotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgY2xhc3NGb3JOYW1lKFN0cmluZyB0eXBlKQ0KLSAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpDQotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0eXBlIik7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvLyBUcnkgV2ViQXBwIENsYXNzTG9hZGVyIGZpcnN0DQotICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUodHlwZSwgZmFsc2UsIC8vIGRvIG5vdCBpbml0aWFsaXplIGZvciBmYXN0ZXIgc3RhcnR1cA0KLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gZmFsbGJhY2s6IFRyeSBDbGFzc0xvYWRlciBmb3IgQ2xhc3NVdGlscyAoaS5lLiB0aGUgbXlmYWNlcy5qYXIgbGliKQ0KLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKHR5cGUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXANCi0gICAgICAgICAgICAgICAgICAgIFRlc3RVdGlscy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2FtZSBhcyB7QGxpbmsgI2NsYXNzRm9yTmFtZShTdHJpbmcpfSwgYnV0IHRocm93cyBhIFJ1bnRpbWVFeGNlcHRpb24NCi0gICAgICogKEZhY2VzRXhjZXB0aW9uKSBpbnN0ZWFkIG9mIGEgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi4NCi0gICAgICoNCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMNCi0gICAgICoNCi0gICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBDbGFzcw0KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHR5cGUgaXMgbnVsbA0KLSAgICAgKiBAdGhyb3dzIGphdmF4LmZhY2VzLkZhY2VzRXhjZXB0aW9uIGlmIGNsYXNzIG5vdCBmb3VuZA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3Mgc2ltcGxlQ2xhc3NGb3JOYW1lKFN0cmluZyB0eXBlKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY2xhc3NGb3JOYW1lKHR5cGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2cuZXJyb3IoIkNsYXNzICIgKyB0eXBlICsgIiBub3QgZm91bmQiLCBlKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3Mgd2l0aCB0aGUgdHlwZSBvZiA8Y29kZT50eXBlPC9jb2RlPi4NCi0gICAgICoNCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMNCi0gICAgICoNCi0gICAgICogQHBhcmFtIHR5cGUgVHlwZSBvZiBuZXcgY2xhc3MuDQotICAgICAqIEByZXR1cm4gSW5zdGFuY2Ugb2YgdGhlIGNsYXNzIDxjb2RlPnR5cGU8L2NvZGU+DQotICAgICAqIEB0aHJvd3MgamF2YXguZmFjZXMuRmFjZXNFeGNlcHRpb24NCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgdHlwZSkgdGhyb3dzIEZhY2VzRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpDQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2Uoc2ltcGxlQ2xhc3NGb3JOYW1lKHR5cGUpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyA8Y29kZT5jbGF6ejwvY29kZT4uDQotICAgICAqDQotICAgICAqIE5vdGU6IFRoaXMgd2FzIGNvcGllZCBmcm9tIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWQudXRpbC5DbGFzc1V0aWxzDQotICAgICAqDQotICAgICAqIEBwYXJhbSBjbGF6eiBDbGFzcyB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YuDQotICAgICAqIEByZXR1cm4gSW5zdGFuY2Ugb2YgdGhlIGNsYXNzIDxjb2RlPmNsYXp6PC9jb2RlPg0KLSAgICAgKiBAdGhyb3dzIGphdmF4LmZhY2VzLkZhY2VzRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoQ2xhc3MgY2xhenopIHRocm93cyBGYWNlc0V4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY2xhenoubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ2xhc3MgOiAiICsgY2xhenouZ2V0TmFtZSgpICsgIiBub3QgZm91bmQuIiwgZSk7DQotICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBGYWNlc0V4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJlbmRlcmVyZWQgYSBjb21wb25lbnQsIGluY2x1ZGluZyBpdCdzIGNoaWxkcmVuLCB0aGVuIGNvbXBsZXRlIHRoZSByZXBvbnNlLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gY29udGV4dCBGYWNlcyBDb250ZXh0DQotICAgICAqIEBwYXJhbSBjb21wb25lbnQgQ29tcG9uZW50IHRvIGJlIHJlbmRlcmVkLg0KLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gVGhyb3duIHdoaWxlIHJlbmRlcmluZy4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW5kZXJDb21wb25lbnQoRmFjZXNDb250ZXh0IGNvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSBjb250ZXh0LmdldFJlbmRlcktpdCgpLmdldFJlbmRlcmVyKA0KLSAgICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0RmFtaWx5KCksIGNvbXBvbmVudC5nZXRSZW5kZXJlclR5cGUoKSk7DQotICAgICAgICByZW5kZXJlci5lbmNvZGVCZWdpbihjb250ZXh0LCBjb21wb25lbnQpOw0KLSAgICAgICAgcmVuZGVyZXIuZW5jb2RlQ2hpbGRyZW4oY29udGV4dCwgY29tcG9uZW50KTsNCi0gICAgICAgIHJlbmRlcmVyLmVuY29kZUVuZChjb250ZXh0LCBjb21wb25lbnQpOw0KLSAgICAgICAgY29udGV4dC5yZXNwb25zZUNvbXBsZXRlKCk7DQotICAgICAgICBjb250ZXh0LnJlbmRlclJlc3BvbnNlKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvcG9tLnhtbCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNDg2NDguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbi10ZXN0czwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBCZWFuLVZhbGlkYXRpb24tSW50ZWdyYXRpb24tVGVzdHM8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPnRlc3QtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8cmVwb3NpdG9yaWVzPg0KLSAgICAgICAgPHJlcG9zaXRvcnk+DQotICAgICAgICAgICAgPGlkPmpib3NzPC9pZD4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvc2l0b3J5Lmpib3NzLmNvbS9tYXZlbjI8L3VybD4NCi0gICAgICAgICAgICA8cmVsZWFzZXM+DQotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+DQotICAgICAgICAgICAgPC9yZWxlYXNlcz4NCi0gICAgICAgICAgICA8c25hcHNob3RzPg0KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4NCi0gICAgICAgICAgICA8L3NuYXBzaG90cz4NCi0gICAgICAgIDwvcmVwb3NpdG9yeT4NCi0gICAgICAgIDxyZXBvc2l0b3J5Pg0KLSAgICAgICAgICAgIDxpZD5qYm9zcy1zbmFwc2hvdDwvaWQ+DQotICAgICAgICAgICAgPHVybD5odHRwOi8vc25hcHNob3RzLmpib3NzLm9yZy9tYXZlbjI8L3VybD4NCi0gICAgICAgICAgICA8cmVsZWFzZXM+DQotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+DQotICAgICAgICAgICAgPC9yZWxlYXNlcz4NCi0gICAgICAgICAgICA8c25hcHNob3RzPg0KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPg0KLSAgICAgICAgICAgIDwvc25hcHNob3RzPg0KLSAgICAgICAgPC9yZXBvc2l0b3J5Pg0KLSAgICA8L3JlcG9zaXRvcmllcz4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnZhbGlkYXRpb248L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjAuR0E8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlLXRlc3RzPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5oaWJlcm5hdGU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGliZXJuYXRlLXZhbGlkYXRvcjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj40LjAuMC5HQTwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS40LjI8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjQuMjwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2MWNmOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQWJzdHJhY3RCZWFuVmFsaWRhdGlvblRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQWJzdHJhY3RCZWFuVmFsaWRhdGlvblRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YzRiN2UuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0Fic3RyYWN0QmVhblZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5BYnN0cmFjdEV4VmFsVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0YXJ0dXAuQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi0NCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RCZWFuVmFsaWRhdGlvblRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgQWJzdHJhY3RCZWFuVmFsaWRhdGlvblRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbnZva2VTdGFydHVwTGlzdGVuZXJzKCkNCi0gICAgew0KLSAgICAgICAgbmV3IEJlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyKCkgew0KLQ0KLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zMTI0MTgyMzU1NDQ0NzU0NDk3TDsNCi0NCi0gICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHN1cGVyLmluaXQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9LmluaXQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgbmV3IE1vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIoKS5hZnRlclBoYXNlKG5ldyBQaGFzZUV2ZW50KGZhY2VzQ29udGV4dCwgUGhhc2VJZC5VUERBVEVfTU9ERUxfVkFMVUVTLCBsaWZlY3ljbGUpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0Jhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc2OGFkMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWw7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJSW5wdXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTxUPiBleHRlbmRzIEFic3RyYWN0QmVhblZhbGlkYXRpb25UZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDMgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgICAgICBiZWFuID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICBwcm90ZWN0ZWQgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICBwcm90ZWN0ZWQgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDMgPSBudWxsOw0KLQ0KLSAgICBwcml2YXRlIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHByb3RlY3RlZCBUIGJlYW47DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgYmVhbiA9IGdldEJlYW5Ub1Rlc3QoKTsNCi0gICAgICAgIGJpbmRCZWFuVG9FeHByZXNzaW9uKCk7DQotDQotICAgICAgICBjcmVhdGVDb21wb25lbnRzKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbXBvbmVudHMoKQ0KLSAgICB7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsNCi0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsNCi0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MyA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Myk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0SWQoImlucHV0MSIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50My5zZXRJZCgiaW5wdXQzIik7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQ0KLSAgICBwcml2YXRlIHZvaWQgYmluZEJlYW5Ub0V4cHJlc3Npb24oKQ0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmcgdmIgPSBhcHBsaWNhdGlvbi5jcmVhdGVWYWx1ZUJpbmRpbmcoIiN7dGVzdEJlYW59Iik7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dCgidGVzdEJlYW4iLCBiZWFuKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVCBnZXRCZWFuVG9UZXN0KCk7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQzID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgYmVhbiA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KFVJSW5wdXQgdWlDb21wb25lbnQsIFN0cmluZyB2YWx1ZUJpbmRpbmcpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyh1aUNvbXBvbmVudCwgInZhbHVlIiwgdmFsdWVCaW5kaW5nKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZVRvVmFsaWRhdGUoVUlJbnB1dCB1aUNvbXBvbmVudCwgU3RyaW5nIHZhbHVlVG9WYWxpZGF0ZSkNCi0gICAgew0KLSAgICAgICAgdWlDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVUb1ZhbGlkYXRlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbXBvbmVudHMoKQ0KLSAgICB7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEucHJvY2Vzc1ZhbGlkYXRvcnMoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5wcm9jZXNzVmFsaWRhdG9ycyhmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQzLnByb2Nlc3NWYWxpZGF0b3JzKGZhY2VzQ29udGV4dCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29tcG9uZW50cygpDQotICAgIHsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5wcm9jZXNzVXBkYXRlcyhmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnByb2Nlc3NVcGRhdGVzKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDMucHJvY2Vzc1VwZGF0ZXMoZmFjZXNDb250ZXh0KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRDb21wb25lbnRWYWxpZChVSUlucHV0IHVpSW5wdXQpDQotICAgIHsNCi0gICAgICAgIGFzc2VydFRydWUoaXNDb21wb25lbnRWYWxpZCh1aUlucHV0KSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Q29tcG9uZW50SW52YWxpZChVSUlucHV0IHVpSW5wdXQpDQotICAgIHsNCi0gICAgICAgIGFzc2VydEZhbHNlKGlzQ29tcG9uZW50VmFsaWQodWlJbnB1dCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbXBvbmVudFZhbGlkKFVJSW5wdXQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudC5pc1ZhbGlkKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0N1c3RvbVNldmVyaXR5MVRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M3YzlmZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXcuQ3VzdG9tU2V2ZXJpdHlUZXN0Q2FzZTFQYWdlQmVhbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5jdXN0b20uQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21TZXZlcml0eTFUZXN0Q2FzZSBleHRlbmRzIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8Q3VzdG9tU2V2ZXJpdHlUZXN0Q2FzZTFQYWdlQmVhbj4NCi17DQotICAgIHB1YmxpYyBDdXN0b21TZXZlcml0eTFUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBDdXN0b21TZXZlcml0eVRlc3RDYXNlMVBhZ2VCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEN1c3RvbVNldmVyaXR5VGVzdENhc2UxUGFnZUJlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tUGF5bG9hZFZpYUdsb2JhbFByb3BlcnR5KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MuZ2V0TmFtZSgpLCBDdXN0b21WaW9sYXRpb25TZXZlcml0eS5XYXJuaW5nLmNsYXNzKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfV0FSTik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbVBheWxvYWRWaWFTdGF0aWNDb25maWcoKQ0KLSAgICB7DQotICAgICAgICBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcy5nZXROYW1lKCksIEN1c3RvbVZpb2xhdGlvblNldmVyaXR5Lldhcm5pbmcuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5WQUxJREFUSU9OX1BBUkFNRVRFUl9DT05GSUcsIGNvbmZpZyk7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmtub3duUGF5bG9hZCgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvRGVmYXVsdEdyb3VwVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9EZWZhdWx0R3JvdXBUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmYzYzYxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9EZWZhdWx0R3JvdXBUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5UZXN0Q2FzZTFCZWFuOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0R3JvdXBUZXN0Q2FzZSBleHRlbmRzIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8VGVzdENhc2UxQmVhbj4NCi17DQotICAgIHB1YmxpYyBEZWZhdWx0R3JvdXBUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRGVmYXVsdEdyb3VwVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBUZXN0Q2FzZTFCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RDYXNlMUJlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90TnVsbFNldmVyaXR5RXJyb3IoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE5vdE51bGxTZXZlcml0eVdhcm4oKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXZlcml0eU9yZGVyKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTN9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICJhYiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4pOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24xVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24xVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcyZDE1My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uMVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52aWV3Lk1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLlNpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbjsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi1wdWJsaWMgY2xhc3MgTW9kZWxWYWxpZGF0aW9uMVRlc3RDYXNlIGV4dGVuZHMNCi0gICAgICAgIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8TW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4+DQotew0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uMVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShNb2RlbFZhbGlkYXRpb24xVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbiBnZXRCZWFuVG9UZXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFZhbGlkYXRpb24oKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMS5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIxMjMiKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwxLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIjEyMyIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICB1cGRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxWaW9sYXRpb25XaXRoR2xvYmFsVmlvbGF0aW9uTWVzc2FnZVZpYVByb3BlcnR5KCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDEucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiMTIzIik7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMS5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICI0NTYiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgdXBkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxWaW9sYXRpb25XaXRoSW5saW5lVmlvbGF0aW9uTWVzc2FnZVZpYVByb3BlcnR5KCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDIucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiMTIzIik7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMi5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICI0NTYiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgdXBkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgLy9kdWUgdG8gZGlzcGxheU1lc3NhZ2VJbmxpbmUNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDIpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmlvbGF0aW9uV2l0aEdsb2JhbFZpb2xhdGlvbk1lc3NhZ2VWaWFGaWVsZCgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwzLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIjEyMyIpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDMucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiNDU2Iik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHVwZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmlvbGF0aW9uV2l0aElubGluZVZpb2xhdGlvbk1lc3NhZ2VWaWFGaWVsZCgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWw0LnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIjEyMyIpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiNDU2Iik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHVwZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIC8vZHVlIHRvIGRpc3BsYXlNZXNzYWdlSW5saW5lDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgyKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFZpb2xhdGlvbldpdGhBZG1pblJvbGUoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVSZXF1ZXN0U2NvcGVkQmVhbigiY3VycmVudFVzZXIiLCBuZXcgU2ltdWxhdGVkVXNlckluZm9ybWF0aW9uKCJhZG1pbiIpKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWw1LnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIjEyMyIpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDUucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiNDU2Iik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHVwZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFZpb2xhdGlvbldpdGhVc2VyUm9sZSgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJjdXJyZW50VXNlciIsIG5ldyBTaW11bGF0ZWRVc2VySW5mb3JtYXRpb24oInVzZXIiKSk7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsNS5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIxMjMiKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWw1LnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIjQ1NiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICB1cGRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24yVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24yVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNhYjExMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uMlRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXcuTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW47DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvbjJUZXN0Q2FzZSBleHRlbmRzDQotICAgICAgICBCYXNlQmVhblZhbFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlPE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuPg0KLXsNCi0gICAgcHVibGljIE1vZGVsVmFsaWRhdGlvbjJUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTW9kZWxWYWxpZGF0aW9uMlRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4gZ2V0QmVhblRvVGVzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxWYWxpZGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbC5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIxMjMiKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiMTIzIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHVwZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFZpb2xhdGlvbldpdGhHbG9iYWxWaW9sYXRpb25NZXNzYWdlQ2xhc3NMZXZlbCgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiMTIzIik7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIjQ1NiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICB1cGRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24zVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24zVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZhMTVjZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uM1Rlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXcuTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UzUGFnZUJlYW47DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb24zVGVzdENhc2UgZXh0ZW5kcw0KLSAgICAgICAgQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTxNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTNQYWdlQmVhbj4NCi17DQotICAgIHB1YmxpYyBNb2RlbFZhbGlkYXRpb24zVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKE1vZGVsVmFsaWRhdGlvbjNUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlM1BhZ2VCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlM1BhZ2VCZWFuKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmFsaWRhdGlvbk5vVmlld0lkTWF0Y2goKQ0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZSgpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmFsaWRhdGlvblZpZXdJZE1hdGNoKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuc2V0Vmlld0lkKCIvcGFnZXMvbW9kZWxWYWxpZGF0aW9uQXdhcmVQYWdlLnhodG1sIik7DQotDQotICAgICAgICB2YWxpZGF0ZSgpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIjEyMyIpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbC5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICI0NTYiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgdXBkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbigpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb240VGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb240VGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUxNDUzNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uNFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXcuTW9kZWxWYWxpZGF0aW9uVGVzdENhc2U0UGFnZUJlYW47DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb240VGVzdENhc2UgZXh0ZW5kcw0KLSAgICAgICAgQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTxNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTRQYWdlQmVhbj4NCi17DQotICAgIHB1YmxpYyBNb2RlbFZhbGlkYXRpb240VGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKE1vZGVsVmFsaWRhdGlvbjRUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlNFBhZ2VCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlNFBhZ2VCZWFuKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmFsaWRhdGlvbk5vVmlld0lkTWF0Y2goKQ0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZSgpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmFsaWRhdGlvblZpZXdJZE1hdGNoKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuc2V0Vmlld0lkKCIvcGFnZXMvbW9kZWxWYWxpZGF0aW9uQXdhcmVQYWdlLnhodG1sIik7DQotDQotICAgICAgICB2YWxpZGF0ZSgpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIjEyMyIpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbC5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICI0NTYiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgdXBkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbigpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9SZXN0cmljdEdyb3Vwc1Rlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvUmVzdHJpY3RHcm91cHNUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzRkZjVkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9SZXN0cmljdEdyb3Vwc1Rlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52aWV3LlJlc3RyaWN0R3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuU2ltdWxhdGVkVXNlckluZm9ybWF0aW9uOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVzdHJpY3RHcm91cHNUZXN0Q2FzZSBleHRlbmRzIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8UmVzdHJpY3RHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbj4NCi17DQotICAgIHB1YmxpYyBSZXN0cmljdEdyb3Vwc1Rlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZXN0cmljdEdyb3Vwc1Rlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgUmVzdHJpY3RHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbiBnZXRCZWFuVG9UZXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBSZXN0cmljdEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc3RyaWN0ZWRHcm91cCgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwxLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdHJpY3RlZEdyb3VwV2l0aEFkbWluUm9sZSgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJjdXJyZW50VXNlciIsIG5ldyBTaW11bGF0ZWRVc2VySW5mb3JtYXRpb24oImFkbWluIikpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDIucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDIucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc3RyaWN0ZWRHcm91cFdpdGhVc2VyUm9sZSgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJjdXJyZW50VXNlciIsIG5ldyBTaW11bGF0ZWRVc2VySW5mb3JtYXRpb24oInVzZXIiKSk7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMi5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIiKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc3RyaWN0ZWRHcm91cFdpdGhDb3JyZWN0Vmlld0lkKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuc2V0Vmlld0lkKCIvcGFnZXMvZ3JvdXBWYWxpZGF0aW9uQXdhcmVQYWdlLnhodG1sIik7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMy5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMy5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIiKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdHJpY3RlZEdyb3VwV2l0aFdyb25nVmlld0lkKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDMucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDMucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VkQW5kUmVzdHJpY3RlZEdyb3VwKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Vc2VHcm91cFZhbGlkYXRpb24xVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Vc2VHcm91cFZhbGlkYXRpb24xVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhmZjJmNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvVXNlR3JvdXBWYWxpZGF0aW9uMVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldy5Vc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5TaW11bGF0ZWRVc2VySW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIFVzZUdyb3VwVmFsaWRhdGlvbjFUZXN0Q2FzZSBleHRlbmRzIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8VXNlR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4+DQotew0KLSAgICBwdWJsaWMgVXNlR3JvdXBWYWxpZGF0aW9uMVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShVc2VHcm91cFZhbGlkYXRpb24xVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBVc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbiBnZXRCZWFuVG9UZXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBVc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcm91cDFBd2FyZVZhbGlkYXRpb24oKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMS5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMS5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIiKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEdyb3VwMUFuZEdyb3VwMkF3YXJlVmFsaWRhdGlvbigpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwyLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwyLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDIpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEdyb3VwMkFuZEdyb3VwM0F3YXJlVmFsaWRhdGlvbldpdGhXcm9uZ1ZpZXdJZCgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwzLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwzLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgImciKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgInAiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEdyb3VwMkFuZEdyb3VwM0F3YXJlVmFsaWRhdGlvbldpdGhDb3JyZWN0Vmlld0lkMSgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLnNldFZpZXdJZCgiL3BhZ2VzL3BhZ2UxLnhodG1sIik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMy5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMy5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICJnIik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICJwIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgyKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcm91cDJBbmRHcm91cDNBd2FyZVZhbGlkYXRpb25XaXRoQ29ycmVjdFZpZXdJZDIoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5zZXRWaWV3SWQoIi9wYWdlcy9wYWdlMi54aHRtbCIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDMucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDMucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiZyIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAicCIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXAyQXdhcmVWYWxpZGF0aW9uV2l0aFJvbGVBZG1pbigpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJjdXJyZW50VXNlciIsIG5ldyBTaW11bGF0ZWRVc2VySW5mb3JtYXRpb24oImFkbWluIikpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiZyIpOyAvL2Rvbid0IGZvcmNlIGEgdmlvbGF0aW9uIHdpdGggR3JvdXAxDQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcm91cDJBbmRHcm91cDNBd2FyZVZhbGlkYXRpb25XaXRoUm9sZVVzZXIoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVSZXF1ZXN0U2NvcGVkQmVhbigiY3VycmVudFVzZXIiLCBuZXcgU2ltdWxhdGVkVXNlckluZm9ybWF0aW9uKCJ1c2VyIikpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiZyIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAicCIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvVXNlR3JvdXBWYWxpZGF0aW9uMlRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvVXNlR3JvdXBWYWxpZGF0aW9uMlRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYjllZWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL1VzZUdyb3VwVmFsaWRhdGlvbjJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldy5Vc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBVc2VHcm91cFZhbGlkYXRpb24yVGVzdENhc2UgZXh0ZW5kcyBCYXNlQmVhblZhbFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlPFVzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuPg0KLXsNCi0gICAgcHVibGljIFVzZUdyb3VwVmFsaWRhdGlvbjJUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVXNlR3JvdXBWYWxpZGF0aW9uMlRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgVXNlR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4gZ2V0QmVhblRvVGVzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVXNlR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXAxQXdhcmVWYWxpZGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbC5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvY3VzdG9tL0N1c3RvbVZpb2xhdGlvblNldmVyaXR5LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvY3VzdG9tL0N1c3RvbVZpb2xhdGlvblNldmVyaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZTUyYmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL2N1c3RvbS9DdXN0b21WaW9sYXRpb25TZXZlcml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5jdXN0b207DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIEN1c3RvbVZpb2xhdGlvblNldmVyaXR5DQotew0KLSAgICBpbnRlcmZhY2UgV2FybmluZyBleHRlbmRzIFBheWxvYWQNCi0gICAgew0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Hcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDhiZWU3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Hcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAxOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAzOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5QYXR0ZXJuOw0KLQ0KLXB1YmxpYyBjbGFzcyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuDQotew0KLSAgICBATm90TnVsbChncm91cHMgPSBHcm91cDEuY2xhc3MpDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0NCi0gICAgQFBhdHRlcm4ocmVnZXhwID0gIltBLVpdW2Etel0iLCBncm91cHMgPSBHcm91cDMuY2xhc3MpDQotICAgIEBTaXplKG1pbiA9IDMsIGdyb3VwcyA9IEdyb3VwMi5jbGFzcykNCi0gICAgQE5vdE51bGwoZ3JvdXBzID0gR3JvdXAyLmNsYXNzKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyQmVhbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0dyb3VwVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxMzQwMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uLkdyb3VwMTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uLkdyb3VwMjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLQ0KLXB1YmxpYyBjbGFzcyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuDQotew0KLSAgICBAQmVhblZhbGlkYXRpb24odXNlR3JvdXBzID0gR3JvdXAxLmNsYXNzKQ0KLSAgICBATm90TnVsbChncm91cHMgPSBHcm91cDEuY2xhc3MpDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0NCi0gICAgQE5vdE51bGwoZ3JvdXBzID0gR3JvdXAyLmNsYXNzKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE5N2JhNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uLkNsYXNzTGV2ZWxFcXVhbDsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLQ0KLUBDbGFzc0xldmVsRXF1YWwNCi1wdWJsaWMgY2xhc3MgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbg0KLXsNCi0gICAgQE5vdE51bGwNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkxOw0KLQ0KLSAgICBATm90TnVsbA0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyQmVhbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU5ZjUzMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uLkNsYXNzTGV2ZWxFcXVhbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi0NCi1AQ2xhc3NMZXZlbEVxdWFsDQotQEJlYW5WYWxpZGF0aW9uKHZpZXdJZHMgPSAiL3BhZ2VzL21vZGVsVmFsaWRhdGlvbkF3YXJlUGFnZS54aHRtbCIsDQotICAgICAgICBtb2RlbFZhbGlkYXRpb24gPSBATW9kZWxWYWxpZGF0aW9uKGlzQWN0aXZlID0gdHJ1ZSkpDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4NCi17DQotICAgIEBOb3ROdWxsDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0NCi0gICAgQE5vdE51bGwNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkyOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKFN0cmluZyBwcm9wZXJ0eTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1NpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1NpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGFjYjI3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9TaW11bGF0ZWRVc2VySW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWw7DQotDQotcHVibGljIGNsYXNzIFNpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbg0KLXsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7DQotDQotICAgIHB1YmxpYyBTaW11bGF0ZWRVc2VySW5mb3JtYXRpb24oU3RyaW5nIHZhbHVlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZG1pblJvbGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gImFkbWluIi5lcXVhbHModmFsdWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVXNlclJvbGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gInVzZXIiLmVxdWFscyh2YWx1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1Rlc3RDYXNlMUJlYW4uamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9UZXN0Q2FzZTFCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYmJjZGQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1Rlc3RDYXNlMUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5QYXR0ZXJuOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7DQotDQotcHVibGljIGNsYXNzIFRlc3RDYXNlMUJlYW4NCi17DQotICAgIEBOb3ROdWxsDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0NCi0gICAgQE5vdE51bGwocGF5bG9hZCA9IFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MpDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MjsNCi0NCi0gICAgQFNpemUobWluID0gMywgcGF5bG9hZCA9IFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MpDQotICAgIEBQYXR0ZXJuKHJlZ2V4cCA9ICJbQS1aXVthLXpdKyIsIHBheWxvYWQgPSBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzcykNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkzOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKFN0cmluZyBwcm9wZXJ0eTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MyhTdHJpbmcgcHJvcGVydHkzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MyA9IHByb3BlcnR5MzsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9DbGFzc0xldmVsRXF1YWwuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0NsYXNzTGV2ZWxFcXVhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDYwZmZmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0NsYXNzTGV2ZWxFcXVhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotDQotQGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldChUWVBFKQ0KLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb24oUlVOVElNRSkNCi1AamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZA0KLUBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQodmFsaWRhdGVkQnkgPSB7Q2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjEuY2xhc3MsIENsYXNzTGV2ZWxFcXVhbHNWYWxpZGF0b3IyLmNsYXNzfSkNCi1wdWJsaWMgQGludGVyZmFjZSBDbGFzc0xldmVsRXF1YWwNCi17DQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAiY2xhc3MtbGV2ZWwgZXF1YWwgdmlvbGF0aW9uIjsNCi0NCi0gICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9Ow0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vQ2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjEuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0NsYXNzTGV2ZWxFcXVhbHNWYWxpZGF0b3IxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MWUxNDguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vQ2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIENsYXNzTGV2ZWxFcXVhbHNWYWxpZGF0b3IxIGltcGxlbWVudHMNCi0gICAgICAgIENvbnN0cmFpbnRWYWxpZGF0b3I8Q2xhc3NMZXZlbEVxdWFsLCBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuPg0KLXsNCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDbGFzc0xldmVsRXF1YWwgcGFyYW1ldGVycykNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBwYWdlQmVhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5MSA9IHBhZ2VCZWFuLmdldFByb3BlcnR5MSgpOw0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5MiA9IHBhZ2VCZWFuLmdldFByb3BlcnR5MigpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MSA9PSBudWxsICYmIHByb3BlcnR5MiA9PSBudWxsIHx8IHByb3BlcnR5MSAhPSBudWxsICYmIHByb3BlcnR5MS5lcXVhbHMocHJvcGVydHkyKTsNCi0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9DbGFzc0xldmVsRXF1YWxzVmFsaWRhdG9yMi5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vQ2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk2YjY0MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9DbGFzc0xldmVsRXF1YWxzVmFsaWRhdG9yMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLk1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW47DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgQ2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjIgaW1wbGVtZW50cw0KLSAgICAgICAgQ29uc3RyYWludFZhbGlkYXRvcjxDbGFzc0xldmVsRXF1YWwsIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4+DQotew0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKENsYXNzTGV2ZWxFcXVhbCBwYXJhbWV0ZXJzKQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuIHBhZ2VCZWFuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcHJvcGVydHkxID0gcGFnZUJlYW4uZ2V0UHJvcGVydHkxKCk7DQotICAgICAgICBTdHJpbmcgcHJvcGVydHkyID0gcGFnZUJlYW4uZ2V0UHJvcGVydHkyKCk7DQotDQotICAgICAgICByZXR1cm4gcHJvcGVydHkxID09IG51bGwgJiYgcHJvcGVydHkyID09IG51bGwgfHwgcHJvcGVydHkxICE9IG51bGwgJiYgcHJvcGVydHkxLmVxdWFscyhwcm9wZXJ0eTIpOw0KLQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0dyb3VwMS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViODk0ODAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb247DQotDQotcHVibGljIGludGVyZmFjZSBHcm91cDENCi17DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0dyb3VwMi5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNjk5YzEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb247DQotDQotcHVibGljIGludGVyZmFjZSBHcm91cDINCi17DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0dyb3VwMy5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNjdmYjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb247DQotDQotcHVibGljIGludGVyZmFjZSBHcm91cDMNCi17DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L0N1c3RvbVNldmVyaXR5VGVzdENhc2UxUGFnZUJlYW4uamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L0N1c3RvbVNldmVyaXR5VGVzdENhc2UxUGFnZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgwOWNmMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9DdXN0b21TZXZlcml0eVRlc3RDYXNlMVBhZ2VCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwuY3VzdG9tLkN1c3RvbVZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIEN1c3RvbVNldmVyaXR5VGVzdENhc2UxUGFnZUJlYW4NCi17DQotICAgIEBOb3ROdWxsKHBheWxvYWQgPSBDdXN0b21WaW9sYXRpb25TZXZlcml0eS5XYXJuaW5nLmNsYXNzKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTE7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4uamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYTA3MzYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbjsNCi0NCi1wdWJsaWMgY2xhc3MgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4NCi17DQotICAgIHByaXZhdGUgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDEgPSBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBwcml2YXRlIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gbW9kZWwyID0gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgQEJlYW5WYWxpZGF0aW9uKG1vZGVsVmFsaWRhdGlvbiA9IEBNb2RlbFZhbGlkYXRpb24oaXNBY3RpdmUgPSB0cnVlKSkNCi0gICAgcHJpdmF0ZSBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsMyA9IG5ldyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIEBCZWFuVmFsaWRhdGlvbihtb2RlbFZhbGlkYXRpb24gPSBATW9kZWxWYWxpZGF0aW9uKGlzQWN0aXZlID0gdHJ1ZSwgZGlzcGxheUlubGluZSA9IHRydWUpKQ0KLSAgICBwcml2YXRlIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gbW9kZWw0ID0gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgQEJlYW5WYWxpZGF0aW9uKGNvbmRpdGlvbnMgPSAiI3tjdXJyZW50VXNlci51c2VyUm9sZX0iLCBtb2RlbFZhbGlkYXRpb24gPSBATW9kZWxWYWxpZGF0aW9uKGlzQWN0aXZlID0gdHJ1ZSkpDQotICAgIHByaXZhdGUgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDUgPSBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24obW9kZWxWYWxpZGF0aW9uID0gQE1vZGVsVmFsaWRhdGlvbihpc0FjdGl2ZSA9IHRydWUpKQ0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWwxOw0KLSAgICB9DQotDQotICAgIEBCZWFuVmFsaWRhdGlvbihtb2RlbFZhbGlkYXRpb24gPSBATW9kZWxWYWxpZGF0aW9uKGlzQWN0aXZlID0gdHJ1ZSwgZGlzcGxheUlubGluZSA9IHRydWUpKQ0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWwyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIGdldE1vZGVsMygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWw0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1vZGVsNDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWw1Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTBlYTI5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uQmVhblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLk1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW47DQotDQotQEJlYW5WYWxpZGF0aW9uKG1vZGVsVmFsaWRhdGlvbiA9IEBNb2RlbFZhbGlkYXRpb24oaXNBY3RpdmUgPSB0cnVlLCB2YWxpZGF0aW9uVGFyZ2V0cyA9ICIje3Rlc3RCZWFuLm1vZGVsfSIpKQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsID0gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgcHVibGljIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UzUGFnZUJlYW4uamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L01vZGVsVmFsaWRhdGlvblRlc3RDYXNlM1BhZ2VCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YmY4NTYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UzUGFnZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbjsNCi0NCi1AQmVhblZhbGlkYXRpb24odmlld0lkcyA9ICIvcGFnZXMvbW9kZWxWYWxpZGF0aW9uQXdhcmVQYWdlLnhodG1sIiwNCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbiA9IEBNb2RlbFZhbGlkYXRpb24oaXNBY3RpdmUgPSB0cnVlLCB2YWxpZGF0aW9uVGFyZ2V0cyA9ICIje3Rlc3RCZWFuLm1vZGVsfSIpKQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTNQYWdlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsID0gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgcHVibGljIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2U0UGFnZUJlYW4uamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L01vZGVsVmFsaWRhdGlvblRlc3RDYXNlNFBhZ2VCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNjMwZDcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2U0UGFnZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuOw0KLQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTRQYWdlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuIG1vZGVsID0gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4oKTsNCi0NCi0gICAgcHVibGljIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4gZ2V0TW9kZWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvUmVzdHJpY3RHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvUmVzdHJpY3RHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWZiMWI3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L1Jlc3RyaWN0R3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5Hcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAxOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLQ0KLUBCZWFuVmFsaWRhdGlvbih1c2VHcm91cHMgPSBHcm91cDEuY2xhc3MpDQotcHVibGljIGNsYXNzIFJlc3RyaWN0R3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4NCi17DQotICAgIEBCZWFuVmFsaWRhdGlvbihyZXN0cmljdEdyb3VwcyA9IEdyb3VwMS5jbGFzcykNCi0gICAgcHJpdmF0ZSBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsMSA9IG5ldyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIHByaXZhdGUgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDIgPSBuZXcgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24odmlld0lkcyA9ICIvcGFnZXMvZ3JvdXBWYWxpZGF0aW9uQXdhcmVQYWdlLnhodG1sIiwgcmVzdHJpY3RHcm91cHMgPSBHcm91cDEuY2xhc3MpDQotICAgIHByaXZhdGUgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDMgPSBuZXcgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24ocmVzdHJpY3RHcm91cHMgPSBHcm91cDEuY2xhc3MsIHVzZUdyb3VwcyA9IEdyb3VwMi5jbGFzcykNCi0gICAgcHJpdmF0ZSBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsNCA9IG5ldyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIHB1YmxpYyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIGdldE1vZGVsMSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDE7DQotICAgIH0NCi0NCi0gICAgQEJlYW5WYWxpZGF0aW9uKGNvbmRpdGlvbnMgPSAiI3tjdXJyZW50VXNlci5hZG1pblJvbGV9IiwgcmVzdHJpY3RHcm91cHMgPSBHcm91cDEuY2xhc3MpDQotICAgIHB1YmxpYyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIGdldE1vZGVsMigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWwzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1vZGVsMzsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWw0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L1VzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Vc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGFhNmNmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L1VzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uLkdyb3VwMTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uLkdyb3VwMjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uLkdyb3VwMzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi0NCi1AQmVhblZhbGlkYXRpb24odXNlR3JvdXBzID0gR3JvdXAxLmNsYXNzKQ0KLXB1YmxpYyBjbGFzcyBVc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsMSA9IG5ldyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIHByaXZhdGUgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDIgPSBuZXcgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24odmlld0lkcyA9IHsiL3BhZ2VzL3BhZ2UxLnhodG1sIiwgIi9wYWdlcy9wYWdlMi54aHRtbCJ9LHVzZUdyb3VwcyA9IHtHcm91cDIuY2xhc3MsIEdyb3VwMy5jbGFzc30pDQotICAgIHByaXZhdGUgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDMgPSBuZXcgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24uTGlzdCh7DQotICAgICAgICBAQmVhblZhbGlkYXRpb24odXNlR3JvdXBzID0gR3JvdXAyLmNsYXNzLCBjb25kaXRpb25zID0gIiN7Y3VycmVudFVzZXIuYWRtaW5Sb2xlfSIpLA0KLSAgICAgICAgQEJlYW5WYWxpZGF0aW9uKHVzZUdyb3VwcyA9IHtHcm91cDIuY2xhc3MsIEdyb3VwMy5jbGFzc30sIGNvbmRpdGlvbnMgPSAiI3tjdXJyZW50VXNlci51c2VyUm9sZX0iKQ0KLSAgICB9KQ0KLSAgICBwcml2YXRlIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gbW9kZWw0ID0gbmV3IEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgcHVibGljIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWwxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1vZGVsMTsNCi0gICAgfQ0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24odXNlR3JvdXBzID0gR3JvdXAyLmNsYXNzKQ0KLSAgICBwdWJsaWMgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWwyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIGdldE1vZGVsMygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWw0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1vZGVsNDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Vc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvVXNlR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE1NTAzZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Vc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52aWV3Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLkdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMkJlYW47DQotDQotcHVibGljIGNsYXNzIFVzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuDQotew0KLSAgICBwcml2YXRlIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4gbW9kZWwgPSBuZXcgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyQmVhbigpOw0KLQ0KLSAgICBwdWJsaWMgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyQmVhbiBnZXRNb2RlbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvcG9tLnhtbCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODU5NDc0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlLXRlc3RzPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIENvcmUtVGVzdHM8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPnRlc3QtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjFjZjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZjA3OTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLkFic3RyYWN0RXhWYWxUZXN0Q2FzZTsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGludm9rZVN0YXJ0dXBMaXN0ZW5lcnMoKQ0KLSAgICB7DQotDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvblRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Y2ZlZTEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvblRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YW5kYXJkU3ludGF4KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMS5wcm9wZXJ0eTF9Iik7DQotDQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xLnByb3BlcnR5MX0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygicHJvcGVydHkxIiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsncHJvcGVydHkxJ119Iik7DQotDQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xWydwcm9wZXJ0eTEnXX0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygicHJvcGVydHkxIiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsnYmVhbjInXS5wcm9wZXJ0eTF9Iik7DQotDQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xWydiZWFuMiddLnByb3BlcnR5MX0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xWydiZWFuMiddfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tiZWFuMX0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygicHJvcGVydHkxIiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhbmRhcmRTeW50YXhSZXBsYWNlUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xLnByb3BlcnR5MX0iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2VQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAicHJvcGVydHkyIik7DQotDQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xLnByb3BlcnR5Mn0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygicHJvcGVydHkyIiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsncHJvcGVydHkxJ119Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgInByb3BlcnR5MiIpOw0KLQ0KLSAgICAgICAgLy9UT0RPIHJlc3RvcmUgb3JpZ2luYWwgc3ludGF4DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xLnByb3BlcnR5Mn0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygicHJvcGVydHkyIiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsnYmVhbjInXS5wcm9wZXJ0eTF9Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgInByb3BlcnR5MiIpOw0KLQ0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tiZWFuMVsnYmVhbjInXS5wcm9wZXJ0eTJ9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tiZWFuMVsnYmVhbjInXX0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjF9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInByb3BlcnR5MiIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YW5kYXJkU3ludGF4QWRkUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xLmJlYW4yfSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24uYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgInByb3BlcnR5MSIpOw0KLQ0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tiZWFuMS5iZWFuMi5wcm9wZXJ0eTF9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tiZWFuMS5iZWFuMn0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInByb3BlcnR5MSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSk7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjFbJ2JlYW4yJ119Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5hZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAicHJvcGVydHkxIik7DQotDQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xWydiZWFuMiddLnByb3BlcnR5MX0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xWydiZWFuMiddfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygicHJvcGVydHkxIiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsnYmVhbjInXS5iZWFuM30iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sICJwcm9wZXJ0eTEiKTsNCi0NCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjFbJ2JlYW4yJ10uYmVhbjMucHJvcGVydHkxfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjFbJ2JlYW4yJ10uYmVhbjN9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xWydiZWFuMiddfSIsDQotICAgICAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTEiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWNlbGV0c0N1c3RvbUNvbXBvbmVudFN5bnRheCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7ZW50aXR5W2ZpZWxkTmFtZV19Iik7DQotDQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2VudGl0eVtmaWVsZE5hbWVdfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7ZW50aXR5fSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZmllbGROYW1lIiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFjZWxldHNDdXN0b21Db21wb25lbnRTeW50YXhSZXBsYWNlUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2VudGl0eVtmaWVsZE5hbWVdfSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sICJuZXdGaWVsZE5hbWUiKTsNCi0NCi0gICAgICAgIC8vVE9ETyByZXN0b3JlIG9yaWdpbmFsIHN5bnRheA0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tlbnRpdHkubmV3RmllbGROYW1lfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7ZW50aXR5fSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygibmV3RmllbGROYW1lIiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxleE1hcFN5bnRheCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjFbYmVhbjJbYmVhbjNbJ2tleTEnXV1dLnByb3BlcnR5MX0iKTsNCi0NCi0gICAgICAgIC8vVE9ETw0KLSAgICAgICAgLy9hc3NlcnRFcXVhbHMoIiN7YmVhbjFbYmVhbjJbYmVhbjNbJ2tleTEnXV1dLnByb3BlcnR5MX0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTEiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW5pdGlhbGl6ZXIvUmVnaXN0cmF0aW9uQ29tcG9uZW50SW5pdGlhbGl6ZXJUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbml0aWFsaXplci9SZWdpc3RyYXRpb25Db21wb25lbnRJbml0aWFsaXplclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjOWY0YzEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbml0aWFsaXplci9SZWdpc3RyYXRpb25Db21wb25lbnRJbml0aWFsaXplclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5pbml0aWFsaXplcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25Db21wb25lbnRJbml0aWFsaXplclRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZQ0KLXsNCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBSZWdpc3RyYXRpb25Db21wb25lbnRJbml0aWFsaXplclRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWdpc3RyYXRpb25Db21wb25lbnRJbml0aWFsaXplclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXJJbml0aWFsaXphdGlvbigpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZENvbXBvbmVudEluaXRpYWxpemVyKG5ldyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIxMDAwKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IFRlc3RDb21wb25lbnRJbml0aWFsaXplcjIoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IFRlc3RDb21wb25lbnRJbml0aWFsaXplcjMoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMSgpKTsNCi0NCi0gICAgICAgIExpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldENvbXBvbmVudEluaXRpYWxpemVycygpOw0KLQ0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDU7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuc2l6ZSgpID09IHJlc3VsdExlbmd0aCk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjEpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIyKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMyk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjEwMDApOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDEpDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjEgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigyKQ0KLSAgICBjbGFzcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMykNCi0gICAgY2xhc3MgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMyBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDEwMDApDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjEwMDAgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3ODU4MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUmVnaXN0cmF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVnaXN0cmF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ySW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMCgpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IyKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RDb21wb25lbnRJbml0aWFsaXplcigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IzKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEoKSk7DQotDQotICAgICAgICBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsNCi0NCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSA1Ow0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHRMZW5ndGgsIHJlc3VsdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMS5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IzLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDQ6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RDb21wb25lbnRJbml0aWFsaXplci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMSkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMSBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigyKQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IyIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDMpDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjMgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTAwMCkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMCBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvblByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwZDMyOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvblByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5GYWNlc01lc3NhZ2VQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvblByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlZ2lzdHJhdGlvblByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvblByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RDb21wb25lbnRJbml0aWFsaXplcigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxMDAwKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMygpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxKCkpOw0KLQ0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7DQotDQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gNjsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0TGVuZ3RoLCByZXN1bHQuc2l6ZSgpKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMy5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDU6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RDb21wb25lbnRJbml0aWFsaXplci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDEpDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDIpDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDMpDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjMgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDEwMDApDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEwMDAgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNGQzNjguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WaW9sYXRpb25TZXZlcml0eVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlZ2lzdHJhdGlvblZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvclRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWdpc3RyYXRpb25WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMSgpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcihuZXcgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjIoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IzKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMTAwMCgpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcihuZXcgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigpKTsNCi0NCi0gICAgICAgIExpc3Q8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCk7DQotDQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gNzsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0TGVuZ3RoLCByZXN1bHQuc2l6ZSgpKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IxLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMy5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjEwMDAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA2Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLCBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMSkNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjEgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLCBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMikNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjIgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLCBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMykNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjMgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLCBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTAwMCkNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjEwMDAgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLCBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvbk1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvbk1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUwMWIwMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25NZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuTmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyLio7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UubW9jay5Nb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25NZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlclRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZQ0KLXsNCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBSZWdpc3RyYXRpb25NZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlclRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWdpc3RyYXRpb25NZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJJbml0aWFsaXphdGlvbigpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjY1MCgpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjE1MCgpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjQ1MCgpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjI1MCgpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjU1MCgpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjk5KCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyMzUwKCkpOw0KLQ0KLSAgICAgICAgTGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+IHJlc3VsdCA9IGdldE5hbWVNYXBwZXJzKCk7DQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gMTY7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3VsdExlbmd0aCwgcmVzdWx0LnNpemUoKSk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjk5LmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjE1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIyNTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA1Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDY6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyMzUwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDg6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyNDUwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgOToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxMzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI1NTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxNDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI2NTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxNToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gZ2V0TmFtZU1hcHBlcnMoKQ0KLSAgICB7DQotICAgICAgICBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcyk7DQotDQotICAgICAgICByZXR1cm4gKChNb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSlyZXN1bHQpLmdldFJlZ2lzdGVyZWROYW1lTWFwcGVyTGlzdCgpOw0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDk5KQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjk5IGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDE1MCkNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIxNTAgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMjUwKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjI1MCBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigzNTApDQotICAgIGNsYXNzIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyMzUwIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDQ1MCkNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI0NTAgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoNTUwKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjU1MCBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcig2NTApDQotICAgIGNsYXNzIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyNjUwIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9tYXBwZXIvUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU2N2I0My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuTmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlci4qOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLm1vY2suTW9ja01lc3NhZ2VSZXNvbHZlckZhY3Rvcnk7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlclRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIzMDEoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyMTUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjQ1MCgpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIyNTAoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyNTUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjk5KCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjM1MCgpKTsNCi0NCi0gICAgICAgIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiByZXN1bHQgPSBnZXROYW1lTWFwcGVycygpOw0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDEzOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHRMZW5ndGgsIHJlc3VsdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXI5OS5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyMTUwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIyNTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA1Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA2Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjMwMS5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDc6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKERlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDg6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyMzUwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgOToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXI0NTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXI1NTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gZ2V0TmFtZU1hcHBlcnMoKQ0KLSAgICB7DQotICAgICAgICBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcyk7DQotDQotICAgICAgICByZXR1cm4gKChNb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeSlyZXN1bHQpLmdldFJlZ2lzdGVyZWROYW1lTWFwcGVyTGlzdCgpOw0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDk5KQ0KLSAgICBjbGFzcyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjk5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDE1MCkNCi0gICAgY2xhc3MgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIxNTAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMjUwKQ0KLSAgICBjbGFzcyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjI1MCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigzMDEpDQotICAgIGNsYXNzIFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyMzAxIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDM1MCkNCi0gICAgY2xhc3MgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIzNTAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoNDUwKQ0KLSAgICBjbGFzcyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjQ1MCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcig1NTApDQotICAgIGNsYXNzIFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyNTUwIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2RjZTMzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5Lk5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlci4qOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UubW9jay5Nb2NrTWV0YURhdGFUcmFuc2Zvcm1lckZhY3Rvcnk7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlclRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZQ0KLXsNCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBSZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBlckluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyMTUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyNDUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyMjUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyNTUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOTkoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIzNTAoKSk7DQotDQotICAgICAgICBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gcmVzdWx0ID0gZ2V0TmFtZU1hcHBlcnMoKTsNCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSAxMzsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0TGVuZ3RoLCByZXN1bHQuc2l6ZSgpKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjk5LmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIxNTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDU6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjI1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDY6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyMzUwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgODoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDk6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjQ1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDEwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDExOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI1NTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IGdldE5hbWVNYXBwZXJzKCkNCi0gICAgew0KLSAgICAgICAgTmFtZU1hcHBlckF3YXJlRmFjdG9yeSByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcyk7DQotDQotICAgICAgICByZXR1cm4gKChNb2NrTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkpcmVzdWx0KS5nZXRSZWdpc3RlcmVkTmFtZU1hcHBlckxpc3QoKTsNCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcig5OSkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOTkgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxNTApDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjE1MCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDI1MCkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyMjUwIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMzUwKQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIzNTAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcig0NTApDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjQ1MCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDU1MCkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyNTUwIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvQ3VzdG9tUHJvamVjdFN0YWdlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0N1c3RvbVByb2plY3RTdGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzQzZDYwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvQ3VzdG9tUHJvamVjdFN0YWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLnN0YWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlByb2plY3RTdGFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuUHJvamVjdFN0YWdlTmFtZTsNCi0NCi0vKioNCi0gKiBjdXN0b20gcHJvamVjdCBzdGFnZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1lbnVtIEN1c3RvbVByb2plY3RTdGFnZQ0KLXsNCi0gICAgRGV2KFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoIkRldiIpKSwNCi0gICAgVGVzdChQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKCJUZXN0IikpLA0KLSAgICBQcm9kKFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoIlByb2QiKSk7DQotDQotICAgIHByaXZhdGUgZmluYWwgUHJvamVjdFN0YWdlTmFtZSB2YWx1ZTsNCi0NCi0gICAgQ3VzdG9tUHJvamVjdFN0YWdlKFByb2plY3RTdGFnZU5hbWUgdmFsdWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXMoQ3VzdG9tUHJvamVjdFN0YWdlIGN1c3RvbVByb2plY3RTdGFnZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFByb2plY3RTdGFnZS5pcyhjdXN0b21Qcm9qZWN0U3RhZ2UuZ2V0VmFsdWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb2plY3RTdGFnZU5hbWUgZ2V0VmFsdWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0N1c3RvbVByb2plY3RTdGFnZVRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0N1c3RvbVByb2plY3RTdGFnZVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNGYzMWYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9DdXN0b21Qcm9qZWN0U3RhZ2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5zdGFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSnNmUHJvamVjdFN0YWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Qcm9qZWN0U3RhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotcHVibGljIGNsYXNzIEN1c3RvbVByb2plY3RTdGFnZVRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZQ0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfU1RBR0UgPSAiamF2YXguZmFjZXMuUFJPSkVDVF9TVEFHRSI7DQotICAgIA0KLSAgICBwdWJsaWMgQ3VzdG9tUHJvamVjdFN0YWdlVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEN1c3RvbVByb2plY3RTdGFnZVRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGV2ZWxvcG1lbnRTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoUFJPSkVDVF9TVEFHRSwgIkRldiIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShDdXN0b21Qcm9qZWN0U3RhZ2UuaXMoQ3VzdG9tUHJvamVjdFN0YWdlLkRldikpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKFBST0pFQ1RfU1RBR0UsICJUZXN0Iik7DQotICAgICAgICBhc3NlcnRUcnVlKEN1c3RvbVByb2plY3RTdGFnZS5pcyhDdXN0b21Qcm9qZWN0U3RhZ2UuVGVzdCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9kdWN0aW9uU3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKFBST0pFQ1RfU1RBR0UsICJQcm9kIik7DQotICAgICAgICBhc3NlcnRUcnVlKEN1c3RvbVByb2plY3RTdGFnZS5pcyhDdXN0b21Qcm9qZWN0U3RhZ2UuUHJvZCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICBhc3NlcnRUcnVlKFByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuUHJvZHVjdGlvbi5nZXRWYWx1ZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFdyb25nRGVmYXVsdFN0YWdlMSgpDQotICAgIHsNCi0gICAgICAgIGFzc2VydEZhbHNlKEN1c3RvbVByb2plY3RTdGFnZS5pcyhDdXN0b21Qcm9qZWN0U3RhZ2UuRGV2KSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFdyb25nRGVmYXVsdFN0YWdlMigpDQotICAgIHsNCi0gICAgICAgIGFzc2VydEZhbHNlKEN1c3RvbVByb2plY3RTdGFnZS5pcyhDdXN0b21Qcm9qZWN0U3RhZ2UuVGVzdCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvSW5kZXBlbmRlbnRQcm9qZWN0U3RhZ2VUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9JbmRlcGVuZGVudFByb2plY3RTdGFnZVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3Y2FkNGQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9JbmRlcGVuZGVudFByb2plY3RTdGFnZVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5zdGFnZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLio7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIEluZGVwZW5kZW50UHJvamVjdFN0YWdlVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVBFTkRFTlRfUFJPSkVDVF9TVEFHRSA9ICJjdXN0b20uUFJPSkVDVF9TVEFHRSI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU0ZfUFJPSkVDVF9TVEFHRSA9ICJqYXZheC5mYWNlcy5QUk9KRUNUX1NUQUdFIjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9ERVYgPSAiY3VzdG9tX2RldiI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fUFJPRCA9ICJjdXN0b21fcHJvZCI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVEVTVCA9ICJjdXN0b21fdGVzdCI7DQotDQotICAgIHB1YmxpYyBJbmRlcGVuZGVudFByb2plY3RTdGFnZVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShJbmRlcGVuZGVudFByb2plY3RTdGFnZVRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eShQcm9qZWN0U3RhZ2VSZXNvbHZlci5jbGFzcy5nZXROYW1lKCksIG5ldyBEZWZhdWx0UHJvamVjdFN0YWdlUmVzb2x2ZXIoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHB1YmxpYyBQcm9qZWN0U3RhZ2UgZ2V0Q3VycmVudFByb2plY3RTdGFnZSgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcganNmUHJvamVjdFN0YWdlTmFtZSA9IHJlc29sdmVQcm9qZWN0U3RhZ2VOYW1lKCJqYXZheC5mYWNlcy5QUk9KRUNUX1NUQUdFIik7DQotICAgICAgICAgICAgICAgIFN0cmluZyBpbmRlcGVuZGVudFByb2plY3RTdGFnZU5hbWUgPSByZXNvbHZlUHJvamVjdFN0YWdlTmFtZShJTkRFUEVOREVOVF9QUk9KRUNUX1NUQUdFKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKCEoanNmUHJvamVjdFN0YWdlTmFtZSA9PSBudWxsIHx8ICIiLmVxdWFscyhqc2ZQcm9qZWN0U3RhZ2VOYW1lKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIFByb2plY3RTdGFnZU5hbWUgcmVzdWx0ID0gUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShqc2ZQcm9qZWN0U3RhZ2VOYW1lLnRyaW0oKSk7DQotICAgICAgICAgICAgICAgICAgICBmb3IoSnNmUHJvamVjdFN0YWdlIGpzZlByb2plY3RTdGFnZSA6IEpzZlByb2plY3RTdGFnZS52YWx1ZXMoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihqc2ZQcm9qZWN0U3RhZ2UuZ2V0VmFsdWUoKS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2UocmVzdWx0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYoIShpbmRlcGVuZGVudFByb2plY3RTdGFnZU5hbWUgPT0gbnVsbCB8fCAiIi5lcXVhbHMoaW5kZXBlbmRlbnRQcm9qZWN0U3RhZ2VOYW1lKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIFByb2plY3RTdGFnZU5hbWUgaW5kZXBlbmRlbnRSZXN1bHQgPSBQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKGluZGVwZW5kZW50UHJvamVjdFN0YWdlTmFtZS50cmltKCkpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBqc2Ygc3RhZ2UgdmFsdWVzIGZpcnN0DQotICAgICAgICAgICAgICAgICAgICBQcm9qZWN0U3RhZ2VOYW1lIHJlc3VsdCA9IFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoaW5kZXBlbmRlbnRQcm9qZWN0U3RhZ2VOYW1lLnRyaW0oKSk7DQotICAgICAgICAgICAgICAgICAgICBmb3IoSnNmUHJvamVjdFN0YWdlIGpzZlByb2plY3RTdGFnZSA6IEpzZlByb2plY3RTdGFnZS52YWx1ZXMoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihqc2ZQcm9qZWN0U3RhZ2UuZ2V0VmFsdWUoKS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2UocmVzdWx0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGN1c3RvbSBzdGFnZSB2YWx1ZXMNCi0gICAgICAgICAgICAgICAgICAgIGlmKFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoQ1VTVE9NX0RFVikuZXF1YWxzKGluZGVwZW5kZW50UmVzdWx0KSB8fA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKENVU1RPTV9URVNUKS5lcXVhbHMoaW5kZXBlbmRlbnRSZXN1bHQpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2UoaW5kZXBlbmRlbnRSZXN1bHQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVQcm9qZWN0U3RhZ2UoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShDVVNUT01fUFJPRCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHJlc29sdmVQcm9qZWN0U3RhZ2VOYW1lKFN0cmluZyBwYXJhbWV0ZXJOYW1lKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eShQcm9qZWN0U3RhZ2VSZXNvbHZlci5jbGFzcy5nZXROYW1lKCksIG5ldyBEZWZhdWx0UHJvamVjdFN0YWdlUmVzb2x2ZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdERldmVsb3BtZW50U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKElOREVQRU5ERU5UX1BST0pFQ1RfU1RBR0UsIENVU1RPTV9ERVYpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQcm9qZWN0U3RhZ2UuaXMoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShDVVNUT01fREVWKSkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKElOREVQRU5ERU5UX1BST0pFQ1RfU1RBR0UsIENVU1RPTV9URVNUKTsNCi0gICAgICAgIGFzc2VydFRydWUoUHJvamVjdFN0YWdlLmlzKFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoQ1VTVE9NX1RFU1QpKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhbGxiYWNrU3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKElOREVQRU5ERU5UX1BST0pFQ1RfU1RBR0UsICJTeXN0ZW1UZXN0Iik7DQotICAgICAgICBhc3NlcnRUcnVlKEpzZlByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuU3lzdGVtVGVzdCkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQcm9qZWN0U3RhZ2UuaXMoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZSgiU3lzdGVtVGVzdCIpKSk7DQotICAgICAgICBhc3NlcnRUcnVlKFByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuU3lzdGVtVGVzdC5nZXRWYWx1ZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE92ZXJyaWRlSnNmU3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKElOREVQRU5ERU5UX1BST0pFQ1RfU1RBR0UsIENVU1RPTV9ERVYpOw0KLSAgICAgICAgc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihKU0ZfUFJPSkVDVF9TVEFHRSwgIlN5c3RlbVRlc3QiKTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoSnNmUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5TeXN0ZW1UZXN0KSk7DQotICAgICAgICBhc3NlcnRUcnVlKFByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuU3lzdGVtVGVzdC5nZXRWYWx1ZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFByb2R1Y3Rpb25TdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoSU5ERVBFTkRFTlRfUFJPSkVDVF9TVEFHRSwgQ1VTVE9NX1BST0QpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQcm9qZWN0U3RhZ2UuaXMoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShDVVNUT01fUFJPRCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQcm9qZWN0U3RhZ2UuaXMoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShDVVNUT01fUFJPRCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdEZWZhdWx0U3RhZ2UxKCkNCi0gICAgew0KLSAgICAgICAgYXNzZXJ0RmFsc2UoUHJvamVjdFN0YWdlLmlzKFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoQ1VTVE9NX0RFVikpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdEZWZhdWx0U3RhZ2UyKCkNCi0gICAgew0KLSAgICAgICAgYXNzZXJ0RmFsc2UoUHJvamVjdFN0YWdlLmlzKFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoQ1VTVE9NX1RFU1QpKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9Kc2ZQcm9qZWN0U3RhZ2VUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9Kc2ZQcm9qZWN0U3RhZ2VUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTAxNTVhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvSnNmUHJvamVjdFN0YWdlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuc3RhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkpzZlByb2plY3RTdGFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1wdWJsaWMgY2xhc3MgSnNmUHJvamVjdFN0YWdlVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9TVEFHRSA9ICJqYXZheC5mYWNlcy5QUk9KRUNUX1NUQUdFIjsNCi0gICAgcHVibGljIEpzZlByb2plY3RTdGFnZVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShKc2ZQcm9qZWN0U3RhZ2VUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdERldmVsb3BtZW50U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKFBST0pFQ1RfU1RBR0UsICJEZXZlbG9wbWVudCIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLkRldmVsb3BtZW50KSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFVuaXRUZXN0U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKFBST0pFQ1RfU1RBR0UsICJVbml0VGVzdCIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLlVuaXRUZXN0KSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFN5c3RlbVRlc3RTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoUFJPSkVDVF9TVEFHRSwgIlN5c3RlbVRlc3QiKTsNCi0gICAgICAgIGFzc2VydFRydWUoSnNmUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5TeXN0ZW1UZXN0KSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFByb2R1Y3Rpb25TdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoUFJPSkVDVF9TVEFHRSwgIlByb2R1Y3Rpb24iKTsNCi0gICAgICAgIGFzc2VydFRydWUoSnNmUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5Qcm9kdWN0aW9uKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIGFzc2VydFRydWUoSnNmUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5Qcm9kdWN0aW9uKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFdyb25nRGVmYXVsdFN0YWdlMSgpDQotICAgIHsNCi0gICAgICAgIGFzc2VydEZhbHNlKEpzZlByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuRGV2ZWxvcG1lbnQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdEZWZhdWx0U3RhZ2UyKCkNCi0gICAgew0KLSAgICAgICAgYXNzZXJ0RmFsc2UoSnNmUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5Vbml0VGVzdCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ0RlZmF1bHRTdGFnZTMoKQ0KLSAgICB7DQotICAgICAgICBhc3NlcnRGYWxzZShKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLlN5c3RlbVRlc3QpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3BvbS54bWwgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNmYyYzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0NCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+dGVzdC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgVGVzdC1Nb2R1bGVzPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPHNjbT4NCi0gICAgICAgIDxjb25uZWN0aW9uPg0KLSAgICAgICAgICAgIHNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL3ZhbGlkYXRpb24tbW9kdWxlcw0KLSAgICAgICAgPC9jb25uZWN0aW9uPg0KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICAgICAgc2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL3ZhbGlkYXRpb24tbW9kdWxlcw0KLSAgICAgICAgPC9kZXZlbG9wZXJDb25uZWN0aW9uPg0KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvdmFsaWRhdGlvbi1tb2R1bGVzPC91cmw+DQotICAgIDwvc2NtPg0KLQ0KLSAgICA8bW9kdWxlcz4NCi0gICAgICAgIDxtb2R1bGU+YmFzZS10ZXN0LWluZnJhc3RydWN0dXJlPC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPmNvcmUtdGVzdHM8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+cHJvcGVydHktdmFsaWRhdGlvbi10ZXN0czwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5iZWFuLXZhbGlkYXRpb24tdGVzdHM8L21vZHVsZT4NCi0gICAgPC9tb2R1bGVzPg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi41PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQuanNwPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc2hhbGU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2hhbGUtdGVzdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuNDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm15ZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxyZXNvdXJjZXM+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgIDwvcmVzb3VyY2VzPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotDQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnRlc3QtamFyPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLQ0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40LjI8L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL0Fic3RyYWN0Ki5qYXZhPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL0Jhc2UqLmphdmE8L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovVGVzdFV0aWxzLmphdmE8L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKkJlYW4uamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+DQotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3BvbS54bWwgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJiOTkwMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0czwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBQcm9wZXJ0eS1WYWxpZGF0aW9uLVRlc3RzPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD50ZXN0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZS10ZXN0czwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjFjZjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9BYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOTUzZDYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9BYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLkFic3RyYWN0RXhWYWxUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXI7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBBYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbnZva2VTdGFydHVwTGlzdGVuZXJzKCkNCi0gICAgew0KLSAgICAgICAgbmV3IFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lcigpew0KLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQyMzA3NjkyMDkyNjc1MjY0Nkw7DQotDQotICAgICAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzdXBlci5pbml0KCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfS5pbml0KCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpDQotICAgIHsNCi0gICAgICAgIG5ldyBDcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyKCkuYWZ0ZXJQaGFzZShuZXcgUGhhc2VFdmVudChmYWNlc0NvbnRleHQsIFBoYXNlSWQuQU5ZX1BIQVNFLGxpZmVjeWNsZSkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvQmFzZVZhbFRlc3RCZWFuLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL0Jhc2VWYWxUZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODU0M2Y4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvQmFzZVZhbFRlc3RCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkRvdWJsZVJhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxlbmd0aDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5QYXR0ZXJuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQmFzZVZhbFRlc3RCZWFuDQotew0KLSAgICBAUmVxdWlyZWQNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsNCi0NCi0gICAgQExlbmd0aChtaW5pbXVtPTIsbWF4aW11bT0zKQ0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lMTsNCi0NCi0gICAgQFBhdHRlcm4oIltBLVpdW2Etel0rIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGF0dGVybk5hbWU7DQotDQotICAgIEBEb3VibGVSYW5nZShtaW5pbXVtPS0zMDBkKQ0KLSAgICBwcml2YXRlIERvdWJsZSBkb3VibGVWYWx1ZTE7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lMSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuYW1lMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lMShTdHJpbmcgbmFtZTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmFtZTEgPSBuYW1lMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhdHRlcm5OYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhdHRlcm5OYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm5OYW1lKFN0cmluZyBwYXR0ZXJuTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXR0ZXJuTmFtZSA9IHBhdHRlcm5OYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEb3VibGUgZ2V0RG91YmxlVmFsdWUxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRvdWJsZVZhbHVlMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREb3VibGVWYWx1ZTEoRG91YmxlIGRvdWJsZVZhbHVlMSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5kb3VibGVWYWx1ZTEgPSBkb3VibGVWYWx1ZTE7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9DdXN0b21TZXZlcml0eVRlc3RCZWFuLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL0N1c3RvbVNldmVyaXR5VGVzdEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA0N2IxMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL0N1c3RvbVNldmVyaXR5VGVzdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3VzdG9tLkN1c3RvbVZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21TZXZlcml0eVRlc3RCZWFuDQotew0KLSAgICBAUmVxdWlyZWQocGFyYW1ldGVycyA9IEN1c3RvbVZpb2xhdGlvblNldmVyaXR5Lldhcm5pbmcuY2xhc3MpDQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL0Jhc2VWYWxUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL0Jhc2VWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGQwNzYxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9CYXNlVmFsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5BYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLkJhc2VWYWxUZXN0QmVhbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlDQotICovDQotcHVibGljIGNsYXNzIEJhc2VWYWxUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UNCi17DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICBCYXNlVmFsVGVzdEJlYW4gYmVhbiA9IG51bGw7DQotDQotICAgIHB1YmxpYyBCYXNlVmFsVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgICAgICBiZWFuID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShCYXNlVmFsVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgYmVhbiA9IG5ldyBCYXNlVmFsVGVzdEJlYW4oKTsNCi0gICAgICAgIFZhbHVlQmluZGluZyB2YiA9IGFwcGxpY2F0aW9uLmNyZWF0ZVZhbHVlQmluZGluZygiI3t0ZXN0QmVhbn0iKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucHV0KCJ0ZXN0QmVhbiIsIGJlYW4pOw0KLQ0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7DQotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7DQotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7DQotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRJZCgiaW5wdXQxIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZWFyRG93bigpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgICAgICBiZWFuID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZVJlcXVpcmVkRmFpbCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lfSIpOw0KLQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZTFMZW5naHRNYXhGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWUxfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIxMjM0NSIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZTFMZW5naHRDb3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWUxfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZTFMZW5naHRNaW5GYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWUxfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCJ4Iik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lMU5vTGVuZ2h0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWUxfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0dGVybk5hbWVGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnBhdHRlcm5OYW1lfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCJQZXRlcjEiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFBhdHRlcm5Ob05hbWUoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucGF0dGVybk5hbWV9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXR0ZXJuTmFtZUNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucGF0dGVybk5hbWV9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIlBldGVyIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVZhbHVlRmFpbCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5kb3VibGVWYWx1ZTF9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIi0zMDEiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVZhbHVlQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5kb3VibGVWYWx1ZTF9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIjIwMCIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMGQsIGlucHV0Q29tcG9uZW50LmdldFZhbHVlKCkpOw0KLQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudXBkYXRlTW9kZWwoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyMDBkLCBiZWFuLmdldERvdWJsZVZhbHVlMSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlTm9WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5kb3VibGVWYWx1ZTF9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9DdXN0b21TZXZlcml0eTFUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL0N1c3RvbVNldmVyaXR5MVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MTdiYjQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL0N1c3RvbVNldmVyaXR5MVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5iYXNldmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5BYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLkN1c3RvbVNldmVyaXR5VGVzdEJlYW47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3VzdG9tLkN1c3RvbVZpb2xhdGlvblNldmVyaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21TZXZlcml0eTFUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UNCi17DQotICAgIHByaXZhdGUgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHByaXZhdGUgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgcHJpdmF0ZSBDdXN0b21TZXZlcml0eVRlc3RCZWFuIGJlYW4gPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgICAgICBiZWFuID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShDdXN0b21TZXZlcml0eTFUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgICAgICBiZWFuID0gbmV3IEN1c3RvbVNldmVyaXR5VGVzdEJlYW4oKTsNCi0gICAgICAgIFZhbHVlQmluZGluZyB2YiA9IGFwcGxpY2F0aW9uLmNyZWF0ZVZhbHVlQmluZGluZygiI3t0ZXN0QmVhbn0iKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucHV0KCJ0ZXN0QmVhbiIsIGJlYW4pOw0KLQ0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7DQotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7DQotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7DQotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRJZCgiaW5wdXQxIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZWFyRG93bigpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgICAgICBiZWFuID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tVmFsaWRhdGlvblBhcmFtZXRlclZpYUdsb2JhbFByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MuZ2V0TmFtZSgpLCBDdXN0b21WaW9sYXRpb25TZXZlcml0eS5jbGFzcyk7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWV9Iik7DQotDQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tVmFsaWRhdGlvblBhcmFtZXRlclZpYVN0YXRpY0NvbmZpZygpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgIGNvbmZpZy5hZGRNYXBwaW5nKFZpb2xhdGlvblNldmVyaXR5LmNsYXNzLmdldE5hbWUoKSwgQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5WQUxJREFUSU9OX1BBUkFNRVRFUl9DT05GSUcsIGNvbmZpZyk7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWV9Iik7DQotDQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5rbm93blZhbGlkYXRpb25QYXJhbWV0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZX0iKTsNCi0NCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL0FkZGl0aW9uYWxWYWxpZGF0b3IuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvQWRkaXRpb25hbFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzQyZDIxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvQWRkaXRpb25hbFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5iYXNldmFsLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5QYXJhbWV0ZXJWYWx1ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgQWRkaXRpb25hbFZhbGlkYXRvciBleHRlbmRzIFRlc3RWYWxpZGF0b3JQcm92aWRlcg0KLXsNCi0gICAgQFBhcmFtZXRlclZhbHVlDQotICAgIHB1YmxpYyBDbGFzcyBnZXRQcm92aWRlckNsYXNzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEFkZGl0aW9uYWxWYWxpZGF0b3IuY2xhc3M7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiAidmFsaWRhdGlvbl9mYWlsZWQiOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH07DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9QYXJhbWV0ZXJUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9QYXJhbWV0ZXJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzNiNTgyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvUGFyYW1ldGVyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUGFyYW1ldGVyVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJTdHlsZU9uZSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKTsNCi0NCi0gICAgICAgIFRlc3RQZXJzb24gcGVyc29uID0gbmV3IFRlc3RQZXJzb24oKTsNCi0gICAgICAgIFJlcXVpcmVkIHJlcXVpcmVkID0gcGVyc29uLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgiZmlyc3ROYW1lIikuZ2V0QW5ub3RhdGlvbihSZXF1aXJlZC5jbGFzcyk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkKS5jb250YWluc0tleShWaW9sYXRpb25TZXZlcml0eS5jbGFzcykpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MpLml0ZXJhdG9yKCkubmV4dCgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfV0FSTiwgZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFZpb2xhdGlvblNldmVyaXR5LmNsYXNzKS5pdGVyYXRvcigpLm5leHQoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlclN0eWxlVHdvKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpOw0KLQ0KLSAgICAgICAgVGVzdFBlcnNvbiBwZXJzb24gPSBuZXcgVGVzdFBlcnNvbigpOw0KLSAgICAgICAgUmVxdWlyZWQgcmVxdWlyZWQgPSBwZXJzb24uZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJsYXN0TmFtZSIpLmdldEFubm90YXRpb24oUmVxdWlyZWQuY2xhc3MpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCkuY29udGFpbnNLZXkoImNsaWVudF9zaWRlX3ZhbGlkYXRpb25fc3VwcG9ydCIpKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsICJjbGllbnRfc2lkZV92YWxpZGF0aW9uX3N1cHBvcnQiKS5pdGVyYXRvcigpLm5leHQoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCAiY2xpZW50X3NpZGVfdmFsaWRhdGlvbl9zdXBwb3J0IikuaXRlcmF0b3IoKS5uZXh0KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJTdHlsZVRocmVlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpOw0KLQ0KLSAgICAgICAgVGVzdFBlcnNvbiBwZXJzb24gPSBuZXcgVGVzdFBlcnNvbigpOw0KLSAgICAgICAgUmVxdWlyZWQgcmVxdWlyZWQgPSBwZXJzb24uZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJsYXN0TmFtZSIpLmdldEFubm90YXRpb24oUmVxdWlyZWQuY2xhc3MpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCkuY29udGFpbnNLZXkoVGVzdFByaW9yaXR5LmNsYXNzKSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBUZXN0UHJpb3JpdHkuY2xhc3MpLml0ZXJhdG9yKCkubmV4dCgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxKSwgZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFRlc3RQcmlvcml0eS5jbGFzcywgSW50ZWdlci5jbGFzcykuaXRlcmF0b3IoKS5uZXh0KCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBUZXN0UHJpb3JpdHkuY2xhc3MsIFN0cmluZy5jbGFzcykuc2l6ZSgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiZG8gaXQgYXNhcCIsIGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBUZXN0UHJpb3JpdHkuY2xhc3MsIFN0cmluZy5jbGFzcywgVGVzdFByaW9yaXR5LlNob3J0RGVzY3JpcHRpb24uY2xhc3MpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiZG8gaXQgaW1tZWRpYXRlbHkiLCBleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgVGVzdFByaW9yaXR5LmNsYXNzLCBTdHJpbmcuY2xhc3MsIFRlc3RQcmlvcml0eS5Mb25nRGVzY3JpcHRpb24uY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyU3R5bGVGb3VyKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpOw0KLQ0KLSAgICAgICAgVGVzdFBlcnNvbiBwZXJzb24gPSBuZXcgVGVzdFBlcnNvbigpOw0KLSAgICAgICAgUmVxdWlyZWQgcmVxdWlyZWQgPSBwZXJzb24uZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJsYXN0TmFtZSIpLmdldEFubm90YXRpb24oUmVxdWlyZWQuY2xhc3MpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCkuY29udGFpbnNLZXkoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MpKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKS5pdGVyYXRvcigpLm5leHQoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKS5zaXplKCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MuZ2V0TmFtZSgpLCBleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKS5pdGVyYXRvcigpLm5leHQoKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlclN0eWxlRml2ZSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKTsNCi0NCi0gICAgICAgIFRlc3RQZXJzb24gcGVyc29uID0gbmV3IFRlc3RQZXJzb24oKTsNCi0gICAgICAgIFJlcXVpcmVkIHJlcXVpcmVkID0gcGVyc29uLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgibGFzdE5hbWUiKS5nZXRBbm5vdGF0aW9uKFJlcXVpcmVkLmNsYXNzKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQpLmNvbnRhaW5zS2V5KERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzKS5pdGVyYXRvcigpLm5leHQoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykuc2l6ZSgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLCBDbGFzcy5jbGFzcykuc2l6ZSgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLCBDbGFzcy5jbGFzcykuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBUT0RPIHRoZXNlIHRlc3RzIHdvcmsgaW4gYW4gaWRlIGJ1dCBub3QgdmlhIGNvbW1hbmRsaW5lIC0gaXQncyBhIFN1cmVmaXJlIGlzc3VlDQotICAgICAqLw0KLSAgICAvKg0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyU3R5bGVTaXgoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCk7DQotDQotICAgICAgICBUZXN0UGVyc29uIHBlcnNvbiA9IG5ldyBUZXN0UGVyc29uKCk7DQotICAgICAgICBSZXF1aXJlZCByZXF1aXJlZCA9IHBlcnNvbi5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoImxhc3ROYW1lIikuZ2V0QW5ub3RhdGlvbihSZXF1aXJlZC5jbGFzcyk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkKS5jb250YWluc0tleShUZXN0VmFsaWRhdG9yUHJvdmlkZXIuY2xhc3MpKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFRlc3RWYWxpZGF0b3JQcm92aWRlci5jbGFzcykuaXRlcmF0b3IoKS5uZXh0KCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBUZXN0VmFsaWRhdG9yUHJvdmlkZXIuY2xhc3MsIENsYXNzLmNsYXNzKS5zaXplKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJTdHlsZVNldmVuKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpOw0KLQ0KLSAgICAgICAgVGVzdFBlcnNvbiBwZXJzb24gPSBuZXcgVGVzdFBlcnNvbigpOw0KLSAgICAgICAgUmVxdWlyZWQgcmVxdWlyZWQgPSBwZXJzb24uZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJsYXN0TmFtZSIpLmdldEFubm90YXRpb24oUmVxdWlyZWQuY2xhc3MpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCkuY29udGFpbnNLZXkoVGVzdFZhbGlkYXRvclByb3ZpZGVyLmNsYXNzKSk7DQotICAgICAgICBmb3IgKENsYXNzIGN1cnJlbnRDbGFzcyA6IGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBUZXN0VmFsaWRhdG9yUHJvdmlkZXIuY2xhc3MsIENsYXNzLmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKFRlc3RWYWxpZGF0b3JQcm92aWRlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGN1cnJlbnRDbGFzcykpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgICovDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdEFsbG93Q2xpZW50U2lkZVZhbGlkYXRpb24uamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdEFsbG93Q2xpZW50U2lkZVZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIzYjk3My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RBbGxvd0NsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5QYXJhbWV0ZXJWYWx1ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuUGFyYW1ldGVyS2V5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgVGVzdEFsbG93Q2xpZW50U2lkZVZhbGlkYXRpb24gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotew0KLSAgICBAUGFyYW1ldGVyS2V5DQotICAgIHB1YmxpYyBTdHJpbmcgS0VZID0gImNsaWVudF9zaWRlX3ZhbGlkYXRpb25fc3VwcG9ydCI7DQotDQotICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICBib29sZWFuIHZhbHVlID0gdHJ1ZTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0RGVueUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3REZW55Q2xpZW50U2lkZVZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI5M2RjZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3REZW55Q2xpZW50U2lkZVZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuYmFzZXZhbC5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlBhcmFtZXRlclZhbHVlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5QYXJhbWV0ZXJLZXk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotDQotcHVibGljIGludGVyZmFjZSBUZXN0RGVueUNsaWVudFNpZGVWYWxpZGF0aW9uIGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcg0KLXsNCi0gICAgQFBhcmFtZXRlcktleQ0KLSAgICBwdWJsaWMgU3RyaW5nIGtleSA9ICJjbGllbnRfc2lkZV92YWxpZGF0aW9uX3N1cHBvcnQiOw0KLQ0KLSAgICBAUGFyYW1ldGVyVmFsdWUNCi0gICAgYm9vbGVhbiB2YWx1ZSA9IGZhbHNlOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQZXJzb24uamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFBlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTgzNDk0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFBlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuYmFzZXZhbC5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb247DQotDQotcHVibGljIGNsYXNzIFRlc3RQZXJzb24NCi17DQotICAgIEBSZXF1aXJlZChwYXJhbWV0ZXJzID0ge1Zpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MsIFRlc3RBbGxvd0NsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzfSkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOw0KLQ0KLSAgICBAUmVxdWlyZWQocGFyYW1ldGVycyA9IHsNCi0gICAgICAgICAgICBWaW9sYXRpb25TZXZlcml0eS5JbmZvLmNsYXNzLA0KLSAgICAgICAgICAgIFRlc3REZW55Q2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MsDQotICAgICAgICAgICAgVGVzdFByaW9yaXR5SGlnaC5jbGFzcywNCi0gICAgICAgICAgICBUZXN0VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLA0KLSAgICAgICAgICAgIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcywNCi0gICAgICAgICAgICAvL0xvZ2luVmFsaWRhdG9yLmNsYXNzLA0KLSAgICAgICAgICAgIEFkZGl0aW9uYWxWYWxpZGF0b3IuY2xhc3N9KQ0KLSAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsNCi0NCi0gICAgcHJpdmF0ZSBpbnQgZmFpbGVkTG9naW5zID0gMDsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZXJMb2NrZWQ7DQotDQotICAgIC8qDQotICAgICAqIFRPRE8gdGhlc2UgdGVzdHMgd29yayBpbiBhbiBpZGUgYnV0IG5vdCB2aWEgY29tbWFuZGxpbmUgLSBpdCdzIGEgU3VyZWZpcmUgaXNzdWUNCi0gICAgICovDQotICAgIC8qDQotICAgIHB1YmxpYyBjbGFzcyBMb2dpblZhbGlkYXRvciBleHRlbmRzIFRlc3RWYWxpZGF0b3JQcm92aWRlcg0KLSAgICB7DQotICAgICAgICBAUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIHB1YmxpYyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5UHJvdmlkZXIgZ2V0VmFsdWUoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uU3RyYXRlZ3koKSB7DQotDQotICAgICAgICAgICAgICAgIGludCBmYWlsZWRMb2dpbnM7DQotDQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCh0aGlzLmZhaWxlZExvZ2lucyA9IGlzTG9naW5TdWNjZXNzZnVsKCkpID4gMCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmZhaWxlZExvZ2lucyA+IDMpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICAqLw0KLQ0KLSAgICBwcml2YXRlIGludCBpc0xvZ2luU3VjY2Vzc2Z1bCgpDQotICAgIHsNCi0gICAgICAgIC8vZm9yY2UgYW4gZXhjZXB0aW9uDQotICAgICAgICByZXR1cm4gKyt0aGlzLmZhaWxlZExvZ2luczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xvY2tlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB1c2VyTG9ja2VkOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBsb2NrKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy51c2VyTG9ja2VkID0gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQcmlvcml0eS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UHJpb3JpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE5ZThjNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQcmlvcml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5iYXNldmFsLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuUGFyYW1ldGVyVmFsdWU7DQotDQotcHVibGljIGludGVyZmFjZSBUZXN0UHJpb3JpdHkgZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotew0KLSAgICBAUGFyYW1ldGVyVmFsdWUNCi0gICAgSW50ZWdlciBnZXRWYWx1ZSgpOw0KLQ0KLSAgICBAUGFyYW1ldGVyVmFsdWUoaWQgPSBTaG9ydERlc2NyaXB0aW9uLmNsYXNzKQ0KLSAgICBTdHJpbmcgZ2V0U2hvcnREZXNjcmlwdGlvbigpOw0KLQ0KLSAgICBAUGFyYW1ldGVyVmFsdWUoaWQgPSBMb25nRGVzY3JpcHRpb24uY2xhc3MpDQotICAgIFN0cmluZyBnZXRMb25nRGVzY3JpcHRpb24oKTsNCi0NCi0gICAgaW50ZXJmYWNlIFNob3J0RGVzY3JpcHRpb257fQ0KLSAgICBpbnRlcmZhY2UgTG9uZ0Rlc2NyaXB0aW9ue30NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UHJpb3JpdHlIaWdoLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQcmlvcml0eUhpZ2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFmYTJkYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQcmlvcml0eUhpZ2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuYmFzZXZhbC5wYXJhbWV0ZXI7DQotDQotcHVibGljIGNsYXNzIFRlc3RQcmlvcml0eUhpZ2ggaW1wbGVtZW50cyBUZXN0UHJpb3JpdHkNCi17DQotICAgIHB1YmxpYyBJbnRlZ2VyIGdldFZhbHVlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIDE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTaG9ydERlc2NyaXB0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICJkbyBpdCBhc2FwIjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvbmdEZXNjcmlwdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAiZG8gaXQgaW1tZWRpYXRlbHkiOw0KLSAgICB9DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5TG93LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQcmlvcml0eUxvdy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjJmNWVkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5TG93LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0UHJpb3JpdHlMb3cgaW1wbGVtZW50cyBUZXN0UHJpb3JpdHkNCi17DQotICAgIHB1YmxpYyBJbnRlZ2VyIGdldFZhbHVlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIDM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTaG9ydERlc2NyaXB0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICJub3QgdGhhdCBpbXBvcnRhbnQiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9uZ0Rlc2NyaXB0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICJ0aGUgdG9waWMgaXMgbm90IHRoYXQgaW1wb3J0YW50IjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzEyMjgzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5iYXNldmFsLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlBhcmFtZXRlclZhbHVlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotQEludm9jYXRpb25PcmRlcigyMTApDQotcHVibGljIGNsYXNzIFRlc3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotDQotICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICBwdWJsaWMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZ2V0SW5zdGFuY2UoKQ0KLSAgICB7DQotICAgICAgICBpZihwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yID0gbmV3IFRlc3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiaXQncyBhIHRlc3QgY2xhc3MiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJpdCdzIGEgdGVzdCBjbGFzcyIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFZhbGlkYXRpb25TdHJhdGVneVByb3ZpZGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0aW9uU3RyYXRlZ3lQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Zjc5ZTJkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFZhbGlkYXRpb25TdHJhdGVneVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lQcm92aWRlcg0KLXsNCi0gICAgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0b3JQcm92aWRlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdG9yUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI2NThlOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0b3JQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5iYXNldmFsLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlBhcmFtZXRlcktleTsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdFZhbGlkYXRvclByb3ZpZGVyIGltcGxlbWVudHMgVmFsaWRhdGlvblBhcmFtZXRlciwgVGVzdFZhbGlkYXRpb25TdHJhdGVneVByb3ZpZGVyDQotew0KLSAgICBAUGFyYW1ldGVyS2V5DQotICAgIHB1YmxpYyBDbGFzcyBnZXRLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gVGVzdFZhbGlkYXRvclByb3ZpZGVyLmNsYXNzOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBpdCBpc24ndCBhbGxvd2VkIHRvIGhhdmUgYW4gYWJzdHJhY3QgY2xhc3MgaW4gdGhpcyBjYXNlIC0gc28gdGhpcyBpbXBsLiBpcyByZXF1aXJlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ5b3UgaGF2ZSB0byBvdmVycmlkZSB0aGlzIG1ldGhvZCIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0QmVhbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZjI3MzguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotDQotLyoqDQotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbFRlc3RCZWFuDQotew0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTE7DQotDQotICAgIEBFcXVhbHMoInByb3BlcnR5MSIpDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MjsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkxOw0KLSAgICB9DQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MShTdHJpbmcgcHJvcGVydHkxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MSA9IHByb3BlcnR5MTsNCi0gICAgfQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTI7DQotICAgIH0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkyKFN0cmluZyBwcm9wZXJ0eTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkyID0gcHJvcGVydHkyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNjFiMDguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5BYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UNCi17DQotDQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLQ0KLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgQ3Jvc3NWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKENyb3NzVmFsVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0gICAgICAgIENyb3NzVmFsVGVzdEJlYW4gYmVhbiA9IG5ldyBDcm9zc1ZhbFRlc3RCZWFuKCk7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcobnVsbCwgInZhbHVlIiwgIiN7dGVzdEJlYW59Iik7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dCgidGVzdEJlYW4iLGJlYW4pOw0KLQ0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7DQotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7DQotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7DQotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRJZCgiaW5wdXQxIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc0NvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQ0Iik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VMQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VMQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYmNkMTEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsLm1vY2suTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS51dGlsLk1ldGhvZFV0aWxzOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZSBleHRlbmRzIEVMQ3Jvc3NWYWxUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIEVMQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShFTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLQ0KLSAgICAgICAgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24oKTsNCi0NCi0gICAgICAgIGNvbmZpZy5hZGRNYXBwaW5nKEVxdWFscy5jbGFzcy5nZXROYW1lKCksIE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRywgY29uZmlnKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgcmV0ZXN0IHRoaXMgdGVzdC1jYXNlDQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHJldGVzdCB0aGlzIHRlc3QtY2FzZQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCk7DQotICAgICAgICBhc3NlcnRGYWxzZShNZXRob2RVdGlscy5pc01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKTsNCi0gICAgICAgIGFzc2VydFRydWUoTWV0aG9kVXRpbHMuaXNNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIikpOw0KLSAgICAgICAgLy8xeCBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeSBhbmQgMXggZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShNZXRob2RVdGlscy5jaGVja01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiLCAyKSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FTENyb3NzVmFsVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRUxDcm9zc1ZhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkODYxY2YuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FTENyb3NzVmFsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuRGF0ZVRpbWVDb252ZXJ0ZXI7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLkFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U7DQotDQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFTENyb3NzVmFsVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlDQotew0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0NCi0gICAgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgcHVibGljIEVMQ3Jvc3NWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEVMQ3Jvc3NWYWxUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgY3JlYXRlUmVxdWVzdFNjb3BlZEJlYW4oImJlYW4xIiwgZ2V0RW50aXR5SW5zdGFuY2UoKSk7DQotICAgICAgICBjcmVhdGVSZXF1ZXN0U2NvcGVkQmVhbigiYmVhbjIiLCBnZXRFbnRpdHlJbnN0YW5jZSgpKTsNCi0NCi0NCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOw0KLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOw0KLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOw0KLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsNCi0NCi0gICAgICAgIC8vaW5wdXQxDQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldElkKCJpbnB1dDEiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRDb252ZXJ0ZXIobmV3IERhdGVUaW1lQ29udmVydGVyKCkpOw0KLSAgICAgICAgKChEYXRlVGltZUNvbnZlcnRlcilpbnB1dENvbXBvbmVudDEuZ2V0Q29udmVydGVyKCkpLnNldFBhdHRlcm4oImRkLk1NLnl5eXkiKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQxKTsNCi0NCi0gICAgICAgIC8vaW5wdXQyDQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRDb252ZXJ0ZXIobmV3IERhdGVUaW1lQ29udmVydGVyKCkpOw0KLSAgICAgICAgKChEYXRlVGltZUNvbnZlcnRlcilpbnB1dENvbXBvbmVudDIuZ2V0Q29udmVydGVyKCkpLnNldFBhdHRlcm4oImRkLk1NLnl5eXkiKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQyKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlRUxDcm9zc0NvbXBvbmVudFZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTENyb3NzQ29tcG9uZW50VmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjEyLjEyLjIwMDgiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUVMQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uVXNlQ2FzZShTdHJpbmcgdmFsdWVCZWFuMVByb3BlcnR5MSwgU3RyaW5nIHZhbHVlQmVhbjFQcm9wZXJ0eTIsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkxLCBTdHJpbmcgdmFsdWVCZWFuMlByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7YmVhbjEuZGF0ZTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3tiZWFuMi5kYXRlMn0iKTsNCi0NCi0gICAgICAgIC8vc2V0IG1vZGVsIHZhbHVlcw0KLSAgICAgICAgcmVzb2x2ZUJlYW4oImJlYW4xIiwgZ2V0RW50aXR5SW5zdGFuY2UoKS5nZXRDbGFzcygpKS5zZXREYXRlMigoRGF0ZSlpbnB1dENvbXBvbmVudDEuZ2V0Q29udmVydGVyKCkuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dENvbXBvbmVudDEsIHZhbHVlQmVhbjFQcm9wZXJ0eTIpKTsNCi0gICAgICAgIHJlc29sdmVCZWFuKCJiZWFuMiIsIGdldEVudGl0eUluc3RhbmNlKCkuZ2V0Q2xhc3MoKSkuc2V0RGF0ZTEoKERhdGUpaW5wdXRDb21wb25lbnQyLmdldENvbnZlcnRlcigpLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgaW5wdXRDb21wb25lbnQyLCB2YWx1ZUJlYW4yUHJvcGVydHkxKSk7DQotDQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKHZhbHVlQmVhbjFQcm9wZXJ0eTEpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKHZhbHVlQmVhbjJQcm9wZXJ0eTIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlRUxNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTIuMTIuMjAwOCIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRUxNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uVXNlQ2FzZShTdHJpbmcgdmFsdWVCZWFuMVByb3BlcnR5MSwgU3RyaW5nIHZhbHVlQmVhbjFQcm9wZXJ0eTIsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkxLCBTdHJpbmcgdmFsdWVCZWFuMlByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7YmVhbjEuZGF0ZTF9Iik7DQotDQotICAgICAgICAvL3NldCBtb2RlbCB2YWx1ZXMNCi0gICAgICAgIHJlc29sdmVCZWFuKCJiZWFuMSIsIGdldEVudGl0eUluc3RhbmNlKCkuZ2V0Q2xhc3MoKSkuc2V0RGF0ZTIoKERhdGUpaW5wdXRDb21wb25lbnQxLmdldENvbnZlcnRlcigpLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgaW5wdXRDb21wb25lbnQxLCB2YWx1ZUJlYW4xUHJvcGVydHkyKSk7DQotICAgICAgICByZXNvbHZlQmVhbigiYmVhbjIiLCBnZXRFbnRpdHlJbnN0YW5jZSgpLmdldENsYXNzKCkpLnNldERhdGUxKChEYXRlKWlucHV0Q29tcG9uZW50Mi5nZXRDb252ZXJ0ZXIoKS5nZXRBc09iamVjdChmYWNlc0NvbnRleHQsIGlucHV0Q29tcG9uZW50MiwgdmFsdWVCZWFuMlByb3BlcnR5MSkpOw0KLSAgICAgICAgcmVzb2x2ZUJlYW4oImJlYW4yIiwgZ2V0RW50aXR5SW5zdGFuY2UoKS5nZXRDbGFzcygpKS5zZXREYXRlMigoRGF0ZSlpbnB1dENvbXBvbmVudDIuZ2V0Q29udmVydGVyKCkuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dENvbXBvbmVudDIsIHZhbHVlQmVhbjJQcm9wZXJ0eTIpKTsNCi0NCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVCZWFuMVByb3BlcnR5MSk7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBFTENyb3NzVmFsVGVzdERhdGVCZWFuIGdldEVudGl0eUluc3RhbmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBFTENyb3NzVmFsVGVzdERhdGVCZWFuKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FTENyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU3M2QxMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIEVMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4NCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERhdGUgREVGQVVMVF9EQVRFID0gbmV3IERhdGUoKTsNCi0NCi0gICAgQEVxdWFscygiI3tiZWFuMi5kYXRlMn0iKQ0KLSAgICBwcml2YXRlIERhdGUgZGF0ZTEgPSBERUZBVUxUX0RBVEU7DQotDQotICAgIHByaXZhdGUgRGF0ZSBkYXRlMiA9IERFRkFVTFRfREFURTsNCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGF0ZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZTEoRGF0ZSBkYXRlMSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5kYXRlMSA9IGRhdGUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldERhdGUyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRhdGUyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERhdGUyKERhdGUgZGF0ZTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGF0ZTIgPSBkYXRlMjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWNhNGVmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsLm1vY2suTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS51dGlsLk1ldGhvZFV0aWxzOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlIGV4dGVuZHMgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKExvY2FsUHJvcGVydHlDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0NCi0gICAgICAgIFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uKCk7DQotDQotICAgICAgICBjb25maWcuYWRkTWFwcGluZyhFcXVhbHMuY2xhc3MuZ2V0TmFtZSgpLCBNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsIGNvbmZpZyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExvY2FsUHJvcGVydHlDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCByZXRlc3QgdGhpcyB0ZXN0LWNhc2UNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgcmV0ZXN0IHRoaXMgdGVzdC1jYXNlDQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCk7DQotICAgICAgICBhc3NlcnRGYWxzZShNZXRob2RVdGlscy5pc01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiKSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCk7DQotICAgICAgICBhc3NlcnRUcnVlKE1ldGhvZFV0aWxzLmlzTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIpKTsNCi0gICAgICAgIC8vMXggZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkgYW5kIDF4IGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwNCi0gICAgICAgIGFzc2VydFRydWUoTWV0aG9kVXRpbHMuY2hlY2tNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIiwgMikpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdjN2Y5Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UgZXh0ZW5kcyBFTENyb3NzVmFsVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKExvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgRUxDcm9zc1ZhbFRlc3REYXRlQmVhbiBnZXRFbnRpdHlJbnN0YW5jZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdERhdGVCZWFuKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlN2UyMTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIExvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3REYXRlQmVhbiBleHRlbmRzIEVMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4NCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERhdGUgREVGQVVMVF9EQVRFID0gbmV3IERhdGUoKTsNCi0NCi0gICAgQEVxdWFscygiZGF0ZTIiKQ0KLSAgICBwcml2YXRlIERhdGUgZGF0ZTEgPSBERUZBVUxUX0RBVEU7DQotDQotICAgIHByaXZhdGUgRGF0ZSBkYXRlMiA9IERFRkFVTFRfREFURTsNCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGF0ZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZTEoRGF0ZSBkYXRlMSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5kYXRlMSA9IGRhdGUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldERhdGUyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRhdGUyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERhdGUyKERhdGUgZGF0ZTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGF0ZTIgPSBkYXRlMjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzhiMGE0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsLm1vY2suTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS51dGlsLk1ldGhvZFV0aWxzOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlIGV4dGVuZHMgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotDQotICAgICAgICBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbigpOw0KLQ0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoRXF1YWxzLmNsYXNzLmdldE5hbWUoKSwgTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHLCBjb25maWcpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCByZXRlc3QgdGhpcyB0ZXN0LWNhc2UNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgcmV0ZXN0IHRoaXMgdGVzdC1jYXNlDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKTsNCi0gICAgICAgIGFzc2VydEZhbHNlKE1ldGhvZFV0aWxzLmlzTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShNZXRob2RVdGlscy5pc01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiKSk7DQotICAgICAgICAvLzF4IGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5IGFuZCAxeCBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsDQotICAgICAgICBhc3NlcnRUcnVlKE1ldGhvZFV0aWxzLmNoZWNrTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIsIDIpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZmNjMDguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLkFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5EYXRlVGltZUNvbnZlcnRlcjsNCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZQ0KLXsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotDQotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgICAgICBjcmVhdGVSZXF1ZXN0U2NvcGVkQmVhbigiYmVhbjEiLCBnZXRFbnRpdHlJbnN0YW5jZSgpKTsNCi0NCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOw0KLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOw0KLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOw0KLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsNCi0NCi0gICAgICAgIC8vaW5wdXQxDQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldElkKCJpbnB1dDEiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRDb252ZXJ0ZXIobmV3IERhdGVUaW1lQ29udmVydGVyKCkpOw0KLSAgICAgICAgKChEYXRlVGltZUNvbnZlcnRlcilpbnB1dENvbXBvbmVudDEuZ2V0Q29udmVydGVyKCkpLnNldFBhdHRlcm4oImRkLk1NLnl5eXkiKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQxKTsNCi0NCi0gICAgICAgIC8vaW5wdXQyDQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRDb252ZXJ0ZXIobmV3IERhdGVUaW1lQ29udmVydGVyKCkpOw0KLSAgICAgICAgKChEYXRlVGltZUNvbnZlcnRlcilpbnB1dENvbXBvbmVudDIuZ2V0Q29udmVydGVyKCkpLnNldFBhdHRlcm4oImRkLk1NLnl5eXkiKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQyKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlUHJvcGVydHlDaGFpbkNyb3NzQ29tcG9uZW50VmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlUHJvcGVydHlDaGFpbkNyb3NzQ29tcG9uZW50VmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTIuMTIuMjAwOCIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUHJvcGVydHlDaGFpbkNyb3NzQ29tcG9uZW50VmFsaWRhdGlvblVzZUNhc2UoU3RyaW5nIHZhbHVlQmVhbjFQcm9wZXJ0eTEsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3tiZWFuMS5kYXRlMX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje2JlYW4xLnN1YkJlYW4uZGF0ZTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKHZhbHVlQmVhbjFQcm9wZXJ0eTEpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKHZhbHVlQmVhbjJQcm9wZXJ0eTIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjEyLjEyLjIwMDgiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUVMTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvblVzZUNhc2UoU3RyaW5nIHZhbHVlQmVhbjFQcm9wZXJ0eTEsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkxKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3tiZWFuMS5kYXRlMX0iKTsNCi0NCi0gICAgICAgIC8vc2V0IG1vZGVsIHZhbHVlcw0KLSAgICAgICAgcmVzb2x2ZUJlYW4oImJlYW4xIiwgZ2V0RW50aXR5SW5zdGFuY2UoKS5nZXRDbGFzcygpKS5nZXRTdWJCZWFuKCkuc2V0RGF0ZTIoKERhdGUpaW5wdXRDb21wb25lbnQyLmdldENvbnZlcnRlcigpLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgaW5wdXRDb21wb25lbnQyLCB2YWx1ZUJlYW4yUHJvcGVydHkxKSk7DQotDQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKHZhbHVlQmVhbjFQcm9wZXJ0eTEpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVCZWFuIGdldEVudGl0eUluc3RhbmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4oKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc1NWMxMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVCZWFuDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlIERFRkFVTFRfREFURSA9IG5ldyBEYXRlKCk7DQotDQotICAgIEBFcXVhbHMoInN1YkJlYW4uZGF0ZTIiKQ0KLSAgICBwcml2YXRlIERhdGUgZGF0ZTEgPSBERUZBVUxUX0RBVEU7DQotDQotICAgIHByaXZhdGUgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuIHN1YkJlYW4gPSBuZXcgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuKCk7DQotDQotICAgIHB1YmxpYyBEYXRlIGdldERhdGUxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRhdGUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERhdGUxKERhdGUgZGF0ZTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZGF0ZTEgPSBkYXRlMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuIGdldFN1YkJlYW4oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3ViQmVhbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdWJCZWFuKFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbiBzdWJCZWFuKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnN1YkJlYW4gPSBzdWJCZWFuOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlU3ViQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmMyYTJkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlIERFRkFVTFRfREFURSA9IG5ldyBEYXRlKCk7DQotDQotICAgIHByaXZhdGUgRGF0ZSBkYXRlMiA9IERFRkFVTFRfREFURTsNCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGF0ZTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZTIoRGF0ZSBkYXRlMikNCi0gICAgew0KLSAgICAgICAgdGhpcy5kYXRlMiA9IGRhdGUyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjFUZXN0QmVhbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMVRlc3RCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkODEyYTEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMVRlc3RCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmOw0KLQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZElmMVRlc3RCZWFuDQotew0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTE7DQotDQotICAgIEBSZXF1aXJlZElmKHZhbHVlT2YgPSAicHJvcGVydHkxIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkyOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKFN0cmluZyBwcm9wZXJ0eTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMVRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYxVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNkM2JjYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYxVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5BYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRJZjFUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UNCi17DQotDQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLQ0KLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgUmVxdWlyZWRJZjFUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlcXVpcmVkSWYxVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0gICAgICAgIFJlcXVpcmVkSWYxVGVzdEJlYW4gYmVhbiA9IG5ldyBSZXF1aXJlZElmMVRlc3RCZWFuKCk7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcobnVsbCwgInZhbHVlIiwgIiN7dGVzdEJlYW59Iik7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dCgidGVzdEJlYW4iLCBiZWFuKTsNCi0NCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOw0KLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOw0KLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOw0KLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0SWQoImlucHV0MSIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRJZCgiaW5wdXQyIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZWFyRG93bigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmVGFyZ2V0Tm90RW1wdHlGYWlsZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZUYXJnZXROb3RFbXB0eUNvcnJlY3QxKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZlRhcmdldE5vdEVtcHR5Q29ycmVjdDIoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmVGFyZ2V0Tm90RW1wdHlDb3JyZWN0MygpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMlRlc3RCZWFuLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYyVGVzdEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyMDNlZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYyVGVzdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkSWY7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmVHlwZS4qOw0KLQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZElmMlRlc3RCZWFuDQotew0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTE7DQotICAgIEBSZXF1aXJlZElmKHZhbHVlT2YgPSAicHJvcGVydHkxIiwgaXMgPSBlbXB0eSkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkyOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKFN0cmluZyBwcm9wZXJ0eTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMlRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmNzk0YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5BYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRJZjJUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UNCi17DQotDQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLQ0KLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgUmVxdWlyZWRJZjJUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlcXVpcmVkSWYyVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0gICAgICAgIFJlcXVpcmVkSWYyVGVzdEJlYW4gYmVhbiA9IG5ldyBSZXF1aXJlZElmMlRlc3RCZWFuKCk7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcobnVsbCwgInZhbHVlIiwgIiN7dGVzdEJlYW59Iik7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dCgidGVzdEJlYW4iLCBiZWFuKTsNCi0NCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBuZXcgVUlWaWV3Um9vdCgpOw0KLSAgICAgICAgSHRtbEZvcm0gZm9ybSA9IG5ldyBIdG1sRm9ybSgpOw0KLSAgICAgICAgZm9ybS5zZXRJZCgiZm9ybSIpOw0KLSAgICAgICAgcm9vdENvbXBvbmVudC5nZXRDaGlsZHJlbigpLmFkZChmb3JtKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0SWQoImlucHV0MSIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRJZCgiaW5wdXQyIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZWFyRG93bigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmVGFyZ2V0RW1wdHlGYWlsZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZUYXJnZXRFbXB0eUNvcnJlY3QxKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZlRhcmdldEVtcHR5Q29ycmVjdDIoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmVGFyZ2V0RW1wdHlDb3JyZWN0MygpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmM1Rlc3RCZWFuLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYzVGVzdEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU5MjIzYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYzVGVzdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkSWY7DQotDQotcHVibGljIGNsYXNzIFJlcXVpcmVkSWYzVGVzdEJlYW4NCi17DQotICAgIHByaXZhdGUgQm9vbGVhbiBwcm9wZXJ0eTE7DQotICAgIEBSZXF1aXJlZElmKHZhbHVlT2YgPSAicHJvcGVydHkxIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkyOw0KLQ0KLSAgICBwdWJsaWMgQm9vbGVhbiBnZXRQcm9wZXJ0eTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MShCb29sZWFuIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYzVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjNUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2I1ZWU4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjNUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLkFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZElmM1Rlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZQ0KLXsNCi0NCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotDQotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHB1YmxpYyBSZXF1aXJlZElmM1Rlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVxdWlyZWRJZjNUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgUmVxdWlyZWRJZjNUZXN0QmVhbiBiZWFuID0gbmV3IFJlcXVpcmVkSWYzVGVzdEJlYW4oKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhudWxsLCAidmFsdWUiLCAiI3t0ZXN0QmVhbn0iKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucHV0KCJ0ZXN0QmVhbiIsIGJlYW4pOw0KLQ0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7DQotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7DQotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7DQotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRJZCgiaW5wdXQxIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZCb29sZWFuVGFyZ2V0Tm90RW1wdHlGYWlsZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZCb29sZWFuVGFyZ2V0Tm90RW1wdHlDb3JyZWN0MSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZShCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZCb29sZWFuVGFyZ2V0Tm90RW1wdHlDb3JyZWN0MigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZShCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmQm9vbGVhblRhcmdldE5vdEVtcHR5Q29ycmVjdDMoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoQm9vbGVhbi5GQUxTRS50b1N0cmluZygpKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWY0VGVzdEJlYW4uamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjRUZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDRmNTUwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjRUZXN0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkSWZUeXBlLio7DQotDQotcHVibGljIGNsYXNzIFJlcXVpcmVkSWY0VGVzdEJlYW4NCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiBwcm9wZXJ0eTE7DQotICAgIEBSZXF1aXJlZElmKHZhbHVlT2YgPSAicHJvcGVydHkxIiwgaXMgPSBlbXB0eSkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkyOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5MSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKGJvb2xlYW4gcHJvcGVydHkxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MSA9IHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkyKFN0cmluZyBwcm9wZXJ0eTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkyID0gcHJvcGVydHkyOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjRUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmNFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNjUxNjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmNFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZElmNFRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZQ0KLXsNCi0NCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotDQotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHB1YmxpYyBSZXF1aXJlZElmNFRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVxdWlyZWRJZjRUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgUmVxdWlyZWRJZjRUZXN0QmVhbiBiZWFuID0gbmV3IFJlcXVpcmVkSWY0VGVzdEJlYW4oKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhudWxsLCAidmFsdWUiLCAiI3t0ZXN0QmVhbn0iKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucHV0KCJ0ZXN0QmVhbiIsIGJlYW4pOw0KLQ0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7DQotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7DQotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7DQotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRJZCgiaW5wdXQxIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZCb29sZWFuVGFyZ2V0RW1wdHlGYWlsZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoQm9vbGVhbi5GQUxTRS50b1N0cmluZygpKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmQm9vbGVhblRhcmdldEVtcHR5Q29ycmVjdDEoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoQm9vbGVhbi5GQUxTRS50b1N0cmluZygpKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZkJvb2xlYW5UYXJnZXRFbXB0eUNvcnJlY3QyKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZkJvb2xlYW5UYXJnZXRFbXB0eUNvcnJlY3QzKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL21vY2svTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9tb2NrL01vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY1ZDQ4Mi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL21vY2svTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbC5tb2NrOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuRXF1YWxzU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UudXRpbC5NZXRob2RVdGlsczsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEVxdWFsc1N0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIE1ldGhvZFV0aWxzLnNpZ25hbENsYXNzVXNlZChnZXRDbGFzcygpKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIE1ldGhvZFV0aWxzLnNpZ25hbE1ldGhvZENhbGxlZChnZXRDbGFzcygpLCAicmV2ZXJzZU1lc3NhZ2UiKTsNCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgTWV0aG9kVXRpbHMuc2lnbmFsTWV0aG9kQ2FsbGVkKGdldENsYXNzKCksICJyZXZlcnNlTWVzc2FnZSIpOw0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jdXN0b20vQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHkuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3VzdG9tL0N1c3RvbVZpb2xhdGlvblNldmVyaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZDY3MTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jdXN0b20vQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3VzdG9tOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5QYXJhbWV0ZXJLZXk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlBhcmFtZXRlclZhbHVlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotcHVibGljIGludGVyZmFjZSBDdXN0b21WaW9sYXRpb25TZXZlcml0eQ0KLXsNCi0gICAgaW50ZXJmYWNlIFdhcm5pbmcgZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotICAgIHsNCi0gICAgICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgICAgIHB1YmxpYyBDbGFzcyBLRVkgPSBDdXN0b21WaW9sYXRpb25TZXZlcml0eS5jbGFzczsNCi0NCi0gICAgICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFNFVkVSSVRZID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk47DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25Nb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvbk1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU1ODBhZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvbk1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlZhbGlkYXRpb25Nb2R1bGVBd2FyZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25Nb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZQ0KLXsNCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBSZWdpc3RyYXRpb25Nb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWdpc3RyYXRpb25Nb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbml0aWFsaXphdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJlc2V0RXh0VmFsQ29udGV4dCgpOw0KLQ0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0R2xvYmFsTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxMDAwKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgVGVzdE1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMygpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0R2xvYmFsTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxKCkpOw0KLQ0KLSAgICAgICAgY2hlY2tHbG9iYWxPbmx5UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7DQotICAgICAgICBjaGVja01vZHVsZUF3YXJlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzV2l0aFRlc3RNb2R1bGUoKTsNCi0gICAgICAgIGNoZWNrTW9kdWxlQXdhcmVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNXaXRoUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrR2xvYmFsT25seVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpDQotICAgIHsNCi0gICAgICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOw0KLQ0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDM7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3VsdExlbmd0aCwgcmVzdWx0LnNpemUoKSk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0R2xvYmFsTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEdsb2JhbE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tNb2R1bGVBd2FyZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc1dpdGhUZXN0TW9kdWxlKCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzRm9yKFRlc3RNb2R1bGUuY2xhc3MpOw0KLQ0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDU7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuc2l6ZSgpID09IHJlc3VsdExlbmd0aCk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RHbG9iYWxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0TW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IyKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdE1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMyk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RHbG9iYWxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEwMDApOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjaGVja01vZHVsZUF3YXJlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzV2l0aFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZSgpDQotICAgIHsNCi0gICAgICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc0ZvcihQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MpOw0KLQ0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDQ7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuc2l6ZSgpID09IHJlc3VsdExlbmd0aCk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0R2xvYmFsTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMi5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RHbG9iYWxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEwMDAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDEpDQotICAgIGNsYXNzIFRlc3RHbG9iYWxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMikNCi0gICAgY2xhc3MgVGVzdE1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMiBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLCBWYWxpZGF0aW9uTW9kdWxlQXdhcmUNCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNb2R1bGVLZXlzKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpLCBUZXN0TW9kdWxlLmNsYXNzLmdldE5hbWUoKX07DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigzKQ0KLSAgICBjbGFzcyBUZXN0TW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IzIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IsIFZhbGlkYXRpb25Nb2R1bGVBd2FyZQ0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldE1vZHVsZUtleXMoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge1Rlc3RNb2R1bGUuY2xhc3MuZ2V0TmFtZSgpfTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBUZXN0TW9kdWxlDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDEwMDApDQotICAgIGNsYXNzIFRlc3RHbG9iYWxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEwMDAgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uTW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25Nb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNDU4NDUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25Nb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5WYWxpZGF0aW9uTW9kdWxlQXdhcmU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uTW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUmVnaXN0cmF0aW9uTW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVnaXN0cmF0aW9uTW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ySW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICByZXNldEV4dFZhbENvbnRleHQoKTsNCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMTAwMCgpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IyKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjMoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMSgpKTsNCi0NCi0gICAgICAgIGNoZWNrR2xvYmFsT25seVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOw0KLSAgICAgICAgY2hlY2tNb2R1bGVBd2FyZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc1dpdGhUZXN0TW9kdWxlKCk7DQotICAgICAgICBjaGVja01vZHVsZUF3YXJlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzV2l0aFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjaGVja0dsb2JhbE9ubHlQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsNCi0NCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSAzOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHRMZW5ndGgsIHJlc3VsdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMS5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjEwMDAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrTW9kdWxlQXdhcmVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNXaXRoVGVzdE1vZHVsZSgpDQotICAgIHsNCi0gICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc0ZvcihUZXN0TW9kdWxlLmNsYXNzKTsNCi0NCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSA1Ow0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LnNpemUoKSA9PSByZXN1bHRMZW5ndGgpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdE1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMik7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RNb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjMpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxMDAwKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDQ6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tNb2R1bGVBd2FyZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc1dpdGhQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGUoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IoUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzKTsNCi0NCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSA0Ow0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LnNpemUoKSA9PSByZXN1bHRMZW5ndGgpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMS5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxMDAwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMSkNCi0gICAgY2xhc3MgVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMSBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMikNCi0gICAgY2xhc3MgVGVzdE1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMiBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLCBWYWxpZGF0aW9uTW9kdWxlQXdhcmUNCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYmVmb3JlVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TW9kdWxlS2V5cygpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7UHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzLmdldE5hbWUoKSwgVGVzdE1vZHVsZS5jbGFzcy5nZXROYW1lKCl9Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMykNCi0gICAgY2xhc3MgVGVzdE1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMyBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLCBWYWxpZGF0aW9uTW9kdWxlQXdhcmUNCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYmVmb3JlVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TW9kdWxlS2V5cygpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7VGVzdE1vZHVsZS5jbGFzcy5nZXROYW1lKCl9Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RNb2R1bGUNCi0gICAgew0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTAwMCkNCi0gICAgY2xhc3MgVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMTAwMCBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uUmVuZGVyZXJJbnRlcmNlcHRvclRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvblJlbmRlcmVySW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjA2NGIxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uUmVuZGVyZXJJbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5BYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvblJlbmRlcmVySW50ZXJjZXB0b3JUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUmVnaXN0cmF0aW9uUmVuZGVyZXJJbnRlcmNlcHRvclRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWdpc3RyYXRpb25SZW5kZXJlckludGVyY2VwdG9yVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiQ29uc3RhbnRDb25kaXRpb25zIn0pDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW5kZXJlckludGVyY2VwdG9ySW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFRlc3RDb21wb25lbnRJbml0aWFsaXplcigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMSgpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMigpKTsNCi0NCi0gICAgICAgIExpc3Q8UmVuZGVyZXJJbnRlcmNlcHRvcj4gcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKTsNCi0NCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSA0Ow0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHRMZW5ndGgsIHJlc3VsdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgUmVuZGVyZXJJbnRlcmNlcHRvciB0bXA7DQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgdG1wID0gcmVzdWx0LmdldChpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHRtcCBpbnN0YW5jZW9mIFRlc3RDb21wb25lbnRJbml0aWFsaXplciB8fA0KLSAgICAgICAgICAgICAgICAgICAgdG1wIGluc3RhbmNlb2YgVmFsaWRhdGlvbkludGVyY2VwdG9yIHx8ICAvKmR1ZSB0byBhIGp1bml0IGlzc3VlKi8NCi0gICAgICAgICAgICAgICAgICAgIHRtcCBpbnN0YW5jZW9mIFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdENvbXBvbmVudEluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIxIGV4dGVuZHMgVGVzdENvbXBvbmVudEluaXRpYWxpemVyDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIyIGV4dGVuZHMgVGVzdENvbXBvbmVudEluaXRpYWxpemVyDQotICAgIHsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9wb20ueG1sIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgzZjJlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIEJlYW4tVmFsaWRhdGlvbi1JbnRlZ3JhdGlvbi1Nb2R1bGUgKEpTUiAzMDMpPC9uYW1lPgotICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+amJvc3M8L2lkPgotICAgICAgICAgICAgPHVybD5odHRwOi8vcmVwb3NpdG9yeS5qYm9zcy5jb20vbWF2ZW4yPC91cmw+Ci0gICAgICAgICAgICA8cmVsZWFzZXM+Ci0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4KLSAgICAgICAgICAgIDwvcmVsZWFzZXM+Ci0gICAgICAgICAgICA8c25hcHNob3RzPgotICAgICAgICAgICAgICAgIDxlbmFibGVkPmZhbHNlPC9lbmFibGVkPgotICAgICAgICAgICAgPC9zbmFwc2hvdHM+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+amJvc3Mtc25hcHNob3Q8L2lkPgotICAgICAgICAgICAgPHVybD5odHRwOi8vc25hcHNob3RzLmpib3NzLm9yZy9tYXZlbjI8L3VybD4KLSAgICAgICAgICAgIDxyZWxlYXNlcz4KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPgotICAgICAgICAgICAgPC9yZWxlYXNlcz4KLSAgICAgICAgICAgIDxzbmFwc2hvdHM+Ci0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4KLSAgICAgICAgICAgIDwvc25hcHNob3RzPgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgPC9yZXBvc2l0b3JpZXM+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnZhbGlkYXRpb248L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wLkdBPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICAgICAgPCEtLSBUZXN0IGRlcGVuZGVuY2llcyAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi41PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldC5qc3A8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3AtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zaGFsZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNoYWxlLXRlc3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuNDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovQWJzdHJhY3QqLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9UZXN0VXRpbHMuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypCZWFuLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+ICAgICAgICAgICAgCi0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBiYjM2NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDDQotICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMC8vRU4iDQotICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWZhY2VzY29uZmlnXzFfMS5kdGQiID4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08ZmFjZXMtY29uZmlnPg0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0YXJ0dXAuQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjFjZjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuQXdhcmVDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuQXdhcmVDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2E3NDA0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhbkF3YXJlQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7DQotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgQmVhbkF3YXJlQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeQ0KLXsNCi0gICAgcHJpdmF0ZSBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBjb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeTsNCi0NCi0gICAgcHVibGljIEJlYW5Bd2FyZUNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KQ0KLSAgICB7DQotICAgICAgICBzZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeShjb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkpDQotICAgIHsNCi0gICAgICAgIGlmKGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibnVsbCBpcyBub3QgYWxsb3dlZCBoZXJlIik7DQotICAgICAgICB9DQotICAgICAgICB0aGlzLmNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5ID0gY29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFsbG93IHRoZSByZWdpc3RyYXRpb24gb2YgYSBjdXN0b20gcHJlZml4IikNCi0gICAgcHVibGljIDxUIGV4dGVuZHMgQ29uc3RyYWludFZhbGlkYXRvcjw/LCA/Pj4gVCBnZXRJbnN0YW5jZShDbGFzczxUPiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRvckNsYXNzTmFtZSA9IHRhcmdldENsYXNzLmdldFNpbXBsZU5hbWUoKTsNCi0gICAgICAgIE9iamVjdCByZXN1bHQgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4oY3JlYXRlQmVhbk5hbWUodmFsaWRhdG9yQ2xhc3NOYW1lKSk7DQotDQotICAgICAgICBpZihyZXN1bHQgIT0gbnVsbCAmJiB0YXJnZXRDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHJlc3VsdC5nZXRDbGFzcygpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFQpcmVzdWx0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuZ2V0SW5zdGFuY2UodGFyZ2V0Q2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZUJlYW5OYW1lKFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKHZhbGlkYXRvckNsYXNzTmFtZSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuQXdhcmVWYWxpZGF0b3JGYWN0b3J5LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5Bd2FyZVZhbGlkYXRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkNzZjNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5Bd2FyZVZhbGlkYXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yQ29udGV4dDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5NZXNzYWdlSW50ZXJwb2xhdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlRyYXZlcnNhYmxlUmVzb2x2ZXI7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeSBpbXBsZW1lbnRzIFZhbGlkYXRvckZhY3RvcnkNCi17DQotICAgIHByaXZhdGUgVmFsaWRhdG9yRmFjdG9yeSB2YWxpZGF0b3JGYWN0b3J5Ow0KLQ0KLSAgICBwdWJsaWMgQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeShWYWxpZGF0b3JGYWN0b3J5IHZhbGlkYXRvckZhY3RvcnkpDQotICAgIHsNCi0gICAgICAgIHNldFZhbGlkYXRvckZhY3RvcnkodmFsaWRhdG9yRmFjdG9yeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yRmFjdG9yeShWYWxpZGF0b3JGYWN0b3J5IHZhbGlkYXRvckZhY3RvcnkpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRvckZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJudWxsIGlzIG5vdCBhbGxvd2VkIGhlcmUiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRoaXMudmFsaWRhdG9yRmFjdG9yeSA9IHZhbGlkYXRvckZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeS5nZXRWYWxpZGF0b3IoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdG9yQ29udGV4dCB1c2luZ0NvbnRleHQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeS51c2luZ0NvbnRleHQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZUludGVycG9sYXRvciBnZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRvckZhY3RvcnkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBUcmF2ZXJzYWJsZVJlc29sdmVyIGdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeS5nZXRUcmF2ZXJzYWJsZVJlc29sdmVyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGdldENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBCZWFuQXdhcmVDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSh2YWxpZGF0b3JGYWN0b3J5LmdldENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyA8VD4gVCB1bndyYXAoQ2xhc3M8VD4gdENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeS51bndyYXAodENsYXNzKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NTM2MjcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuVmFsaWRhdGlvbk1vZHVsZUtleTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVmFsaWRhdGlvbk1vZHVsZUtleQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQmVhblZhbGlkYXRpb25Nb2R1bGVLZXkNCi17DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk4YzkxMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkFic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC51dGlsLkJlYW5WYWxpZGF0aW9uVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscyBidmlVdGlscyA9DQotICAgICAgICAgICAgbmV3IEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzKHRoaXMubG9nZ2VyKTsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvblN1cHBvcnRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHRvIGluaXQgY29tcG9uZW50ICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gYnZpVXRpbHMuZXh0cmFjdFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZ2V0UHJvcGVydGllc0ZvckNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKHVpQ29tcG9uZW50KSk7DQotDQotICAgICAgICBpZiAocHJvcGVydHlEZXRhaWxzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdENvbXBvbmVudFdpdGhQcm9wZXJ0eURldGFpbHMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgcHJvcGVydHlEZXRhaWxzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImluaXQgY29tcG9uZW50IG9mICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q29tcG9uZW50V2l0aFByb3BlcnR5RGV0YWlscyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscykNCi0gICAgew0KLSAgICAgICAgdGhpcy5idmlVdGlscy5pbml0Q29tcG9uZW50V2l0aFByb3BlcnR5RGV0YWlscyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBwcm9wZXJ0eURldGFpbHMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBnZXRQcm9wZXJ0eUluZm9ybWF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgYm9vbGVhbiB2YWxpZGF0ZVByb3BlcnR5ID0gaGFzQmVhblZhbGlkYXRpb25Db25zdHJhaW50cyhwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZVByb3BlcnR5KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImpzcjMwMyBzdGFydCB2YWxpZGF0aW9uIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcHJvY2Vzc0ZpZWxkVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGZpbmFsbHkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodmFsaWRhdGVQcm9wZXJ0eSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJqc3IzMDMgdmFsaWRhdGlvbiBmaW5pc2hlZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBidmlVdGlscy5nZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcihwcm9wZXJ0aWVzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNCZWFuVmFsaWRhdGlvbkNvbnN0cmFpbnRzKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuYnZpVXRpbHMuaGFzQmVhblZhbGlkYXRpb25Db25zdHJhaW50cyhwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRmllbGRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIC8qbm90IHVzZWQgeWV0IHN1cHBvcnRNdWx0aXBsZVZpb2xhdGlvbnNQZXJGaWVsZCgpKi8NCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPiB2aW9sYXRpb25zID0gdGhpcy5idmlVdGlscw0KLSAgICAgICAgICAgICAgICAudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIHByb2Nlc3NDb25zdHJhaW50VmlvbGF0aW9ucyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHZpb2xhdGlvbnMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NDb25zdHJhaW50VmlvbGF0aW9ucyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb24+IHZpb2xhdGlvbnMpDQotICAgIHsNCi0gICAgICAgIGlmKHZpb2xhdGlvbnMgIT0gbnVsbCAmJiAhdmlvbGF0aW9ucy5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQmVhblZhbGlkYXRpb25VdGlscy5wcm9jZXNzQ29uc3RyYWludFZpb2xhdGlvbnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCB2aW9sYXRpb25zKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIENsYXNzIGdldE1vZHVsZUtleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBCZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZjhhN2IuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmdyb3Vwcy5EZWZhdWx0Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkJlYW5EZXNjcmlwdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkVsZW1lbnREZXNjcmlwdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzDQotew0KLSAgICBwcml2YXRlIExvZyBsb2dnZXI7DQotDQotICAgIEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzKExvZyBsb2dnZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyOw0KLSAgICB9DQotDQotICAgIFByb3BlcnR5RGV0YWlscyBleHRyYWN0UHJvcGVydHlEZXRhaWxzKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXNGb3JFeHRyYWN0aW9uKQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcmVzdWx0ID0gZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IocHJvcGVydGllc0ZvckV4dHJhY3Rpb24pDQotICAgICAgICAgICAgICAgIC5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpDQotICAgICAgICAgICAgICAgIC5nZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdC5nZXRCYXNlT2JqZWN0KCkgPT0gbnVsbCAmJiB0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5sb2dnZXIud2Fybigibm8gYmFzZSBvYmplY3QgYXQgIiArIHJlc3VsdC5nZXRLZXkoKSArDQotICAgICAgICAgICAgICAgICAgICAiIGNvbXBvbmVudC1pZDogIiArIHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC5nZXRCYXNlT2JqZWN0KCkgIT0gbnVsbCA/IHJlc3VsdCA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogYWxzbyBpbnZva2VzIG1ldGEtZGF0YSBleHRyYWN0aW9uIGludGVyY2VwdG9ycw0KLSAgICAgKiAoc2VlIGUuZy4gRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcikNCi0gICAgICovDQotICAgIE1ldGFEYXRhRXh0cmFjdG9yIGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yV2l0aChwcm9wZXJ0aWVzKTsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIGluaXRDb21wb25lbnRXaXRoUHJvcGVydHlEZXRhaWxzKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBDbGFzc1tdIGZvdW5kR3JvdXBzID0gcmVzb2x2ZUdyb3VwcyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmIChmb3VuZEdyb3VwcyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGZvdW5kR3JvdXBzLmxlbmd0aCA9PSAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvdW5kR3JvdXBzID0gbmV3IENsYXNzW117RGVmYXVsdC5jbGFzc307DQotICAgICAgICB9DQotDQotICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIHRhcmdldENsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyh0YXJnZXRDbGFzcyk7DQotDQotICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBlbGVtZW50RGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3JGb3IodGFyZ2V0Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpKTsNCi0NCi0gICAgICAgIGlmIChlbGVtZW50RGVzY3JpcHRvciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHByb2Nlc3NFbGVtZW50RGVzY3JpcHRvcihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBmb3VuZEdyb3VwcywgZWxlbWVudERlc2NyaXB0b3IpOw0KLSAgICB9DQotDQotICAgIHZvaWQgcHJvY2Vzc0VsZW1lbnREZXNjcmlwdG9yKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1tdIGZvdW5kR3JvdXBzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBlbGVtZW50RGVzY3JpcHRvcikNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YTsNCi0NCi0gICAgICAgIGZvciAoQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gY29uc3RyYWludERlc2NyaXB0b3IgOg0KLSAgICAgICAgICAgICAgICBlbGVtZW50RGVzY3JpcHRvci5maW5kQ29uc3RyYWludHMoKS51bm9yZGVyZWRBbmRNYXRjaGluZ0dyb3Vwcyhmb3VuZEdyb3VwcykuZ2V0Q29uc3RyYWludERlc2NyaXB0b3JzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGEgPSB0cmFuc2Zvcm1Db25zdHJhaW50RGVzY3JpcHRvclRvTWV0YURhdGEoDQotICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50RGVzY3JpcHRvciwgZWxlbWVudERlc2NyaXB0b3IuZ2V0RWxlbWVudENsYXNzKCkpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YSAhPSBudWxsICYmICFtZXRhRGF0YS5pc0VtcHR5KCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiQ29uc3RyYWludERlc2NyaXB0b3IjaXNSZXBvcnRBc1NpbmdsZVZpb2xhdGlvbiIpDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1Db25zdHJhaW50RGVzY3JpcHRvclRvTWV0YURhdGEoDQotICAgICAgICAgICAgQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gY29uc3RyYWludERlc2NyaXB0b3IsIENsYXNzIGVsZW1lbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0NCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSBFeHRWYWxVdGlscy5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KA0KLSAgICAgICAgICAgICAgICBuZXcgQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5KGNvbnN0cmFpbnREZXNjcmlwdG9yLCBlbGVtZW50Q2xhc3MpKTsNCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LnB1dEFsbCh0cmFuc2Zvcm1NZXRhRGF0YShtZXRhRGF0YVRyYW5zZm9ybWVyLCBjb25zdHJhaW50RGVzY3JpcHRvcikpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKCFjb25zdHJhaW50RGVzY3JpcHRvci5pc1JlcG9ydEFzU2luZ2xlVmlvbGF0aW9uKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgU2V0PENvbnN0cmFpbnREZXNjcmlwdG9yPD8+PiBjb21wb3NpbmdDb25zdHJhaW50cyA9IGNvbnN0cmFpbnREZXNjcmlwdG9yLmdldENvbXBvc2luZ0NvbnN0cmFpbnRzKCk7DQotICAgICAgICAgICAgaWYgKGNvbXBvc2luZ0NvbnN0cmFpbnRzICE9IG51bGwgJiYgIWNvbXBvc2luZ0NvbnN0cmFpbnRzLmlzRW1wdHkoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXRBbGwodHJhbnNmb3JtQ29tcG9zaW5nQ29uc3RyYWludHMoY29tcG9zaW5nQ29uc3RyYWludHMsIGVsZW1lbnRDbGFzcykpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybUNvbXBvc2luZ0NvbnN0cmFpbnRzKA0KLSAgICAgICAgICAgIFNldDxDb25zdHJhaW50RGVzY3JpcHRvcjw/Pj4gY29tcG9zaW5nQ29uc3RyYWludHMsIENsYXNzIGVsZW1lbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIGZvciAoQ29uc3RyYWludERlc2NyaXB0b3IgY29uc3RyYWludERlc2NyaXB0b3IgOiBjb21wb3NpbmdDb25zdHJhaW50cykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQucHV0QWxsKHRyYW5zZm9ybUNvbnN0cmFpbnREZXNjcmlwdG9yVG9NZXRhRGF0YShjb25zdHJhaW50RGVzY3JpcHRvciwgZWxlbWVudENsYXNzKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YSgNCi0gICAgICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIsIENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IGNvbnN0cmFpbnREZXNjcmlwdG9yKQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUVudHJ5IGVudHJ5Ow0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQ7DQotICAgICAgICBpZiAodGhpcy5sb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGVudHJ5ID0gbmV3IE1ldGFEYXRhRW50cnkoKTsNCi0gICAgICAgIGVudHJ5LnNldEtleShjb25zdHJhaW50RGVzY3JpcHRvci5nZXRBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgZW50cnkuc2V0VmFsdWUoY29uc3RyYWludERlc2NyaXB0b3IpOw0KLQ0KLSAgICAgICAgcmVzdWx0ID0gbWV0YURhdGFUcmFuc2Zvcm1lci5jb252ZXJ0TWV0YURhdGEoZW50cnkpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBib29sZWFuIGhhc0JlYW5WYWxpZGF0aW9uQ29uc3RyYWludHMoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMuZ2V0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKSk7DQotDQotICAgICAgICByZXR1cm4gZ2V0RGVzY3JpcHRvckZvcih0YXJnZXRDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCkpICE9IG51bGw7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb24+IHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIENsYXNzIGJhc2VCZWFuQ2xhc3MgPSBnZXRCYXNlQ2xhc3NUeXBlKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGdldFByb3BlcnR5VG9WYWxpZGF0ZShwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIENsYXNzW10gZ3JvdXBzID0gcmVzb2x2ZUdyb3VwcyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmIChncm91cHMgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFZhbGlkYXRvckZhY3RvcnkgdmFsaWRhdG9yRmFjdG9yeSA9IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWYWxpZGF0b3JGYWN0b3J5KCk7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeQ0KLSAgICAgICAgICAgICAgICAudXNpbmdDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLm1lc3NhZ2VJbnRlcnBvbGF0b3IoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKSkNCi0gICAgICAgICAgICAgICAgLmNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KHZhbGlkYXRvckZhY3RvcnkuZ2V0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoKSkNCi0gICAgICAgICAgICAgICAgLnRyYXZlcnNhYmxlUmVzb2x2ZXIodmFsaWRhdG9yRmFjdG9yeS5nZXRUcmF2ZXJzYWJsZVJlc29sdmVyKCkpDQotICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0b3IoKQ0KLSAgICAgICAgICAgICAgICAudmFsaWRhdGVWYWx1ZShiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eU5hbWUsIGNvbnZlcnRlZE9iamVjdCwgZ3JvdXBzKTsNCi0gICAgfQ0KLQ0KLSAgICBDbGFzcyBnZXRCYXNlQ2xhc3NUeXBlKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgcmVzdWx0ID0gRXh0VmFsVXRpbHMuZ2V0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5SW5mb3JtYXRpb24pLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpOw0KLQ0KLSAgICAgICAgcmV0dXJuIFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MocmVzdWx0KTsNCi0gICAgfQ0KLQ0KLSAgICBTdHJpbmcgZ2V0UHJvcGVydHlUb1ZhbGlkYXRlKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFByb3BlcnR5RGV0YWlscyhwcm9wZXJ0eUluZm9ybWF0aW9uKS5nZXRQcm9wZXJ0eSgpOw0KLSAgICB9DQotDQotICAgIENsYXNzW10gcmVzb2x2ZUdyb3VwcyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRHcm91cHMoDQotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldFZpZXdJZCgpLA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpKTsNCi0gICAgfQ0KLQ0KLSAgICBFbGVtZW50RGVzY3JpcHRvciBnZXREZXNjcmlwdG9yRm9yKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIEJlYW5EZXNjcmlwdG9yIGJlYW5EZXNjcmlwdG9yID0gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZhbGlkYXRvckZhY3RvcnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdG9yKCkuZ2V0Q29uc3RyYWludHNGb3JDbGFzcyh0YXJnZXRDbGFzcyk7DQotDQotICAgICAgICByZXR1cm4gYmVhbkRlc2NyaXB0b3IuZ2V0Q29uc3RyYWludHNGb3JQcm9wZXJ0eShwcm9wZXJ0eSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjN2M4NTYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5tZXNzYWdlLmludGVycG9sYXRvci5EZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5tZXNzYWdlLmludGVycG9sYXRvci5FeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuTW9kZWxWYWxpZGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuTW9kZWxWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWwuQmVhblZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLk1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuR3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yRmFjdG9yeTsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGNsYXNzIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBpbXBsZW1lbnRzIEdyb3VwU3RvcmFnZSwgTW9kZWxWYWxpZGF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5jbGFzcy5nZXROYW1lKCkgKyAiOktFWSI7DQotDQotICAgIHByaXZhdGUgTWVzc2FnZUludGVycG9sYXRvciBkZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcjsNCi0NCi0gICAgcHJpdmF0ZSBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOw0KLQ0KLSAgICBwcml2YXRlIEdyb3VwU3RvcmFnZSBncm91cFN0b3JhZ2U7DQotDQotICAgIHByaXZhdGUgTW9kZWxWYWxpZGF0aW9uU3RvcmFnZSBtb2RlbFZhbGlkYXRpb25TdG9yYWdlOw0KLQ0KLSAgICBwcml2YXRlIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCgpDQotICAgIHsNCi0gICAgICAgIGluaXRHcm91cFN0b3JhZ2UoKTsNCi0gICAgICAgIGluaXRNb2RlbFZhbGlkYXRpb25TdG9yYWdlKCk7DQotDQotICAgICAgICBpbml0TWVzc2FnZVJlc29sdmVyKCk7DQotICAgICAgICBpbml0TWVzc2FnZUludGVycG9sYXRvcigpOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyBzdGF0aWMgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGdldEN1cnJlbnRJbnN0YW5jZSgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7DQotDQotICAgICAgICBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgY3VycmVudENvbnRleHQgPSAoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0KXJlcXVlc3RNYXAuZ2V0KEtFWSk7DQotDQotICAgICAgICBpZihjdXJyZW50Q29udGV4dCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gbmV3IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCgpOw0KLSAgICAgICAgICAgIHJlcXVlc3RNYXAucHV0KEtFWSwgY3VycmVudENvbnRleHQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRDb250ZXh0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWxpZGF0b3JGYWN0b3J5IGdldFZhbGlkYXRvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgdmFsaWRhdG9yRmFjdG9yeSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KFZhbGlkYXRvckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGlmKHZhbGlkYXRvckZhY3RvcnkgaW5zdGFuY2VvZiBWYWxpZGF0b3JGYWN0b3J5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoVmFsaWRhdG9yRmFjdG9yeSl2YWxpZGF0b3JGYWN0b3J5Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oImZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0IGJ2IHZhbGlkYXRvciBmYWN0b3J5Iik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gQmVhblZhbGlkYXRpb25VdGlscy5nZXREZWZhdWx0VmFsaWRhdG9yRmFjdG9yeSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlSW50ZXJwb2xhdG9yIGdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLm1lc3NhZ2VSZXNvbHZlciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgRXh0VmFsTWVzc2FnZUludGVycG9sYXRvckFkYXB0ZXIodGhpcy5kZWZhdWx0TWVzc2FnZUludGVycG9sYXRvciwgdGhpcy5tZXNzYWdlUmVzb2x2ZXIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkR3JvdXAoQ2xhc3MgZ3JvdXBDbGFzcywgU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmdyb3VwU3RvcmFnZS5hZGRHcm91cChncm91cENsYXNzLCB2aWV3SWQsIGNsaWVudElkKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZXN0cmljdEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5ncm91cFN0b3JhZ2UucmVzdHJpY3RHcm91cChncm91cENsYXNzLCB2aWV3SWQsIGNsaWVudElkKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3NbXSBnZXRHcm91cHMoU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5ncm91cFN0b3JhZ2UuZ2V0R3JvdXBzKHZpZXdJZCwgY2xpZW50SWQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkobW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllc1RvVmFsaWRhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdEdyb3VwU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZ3JvdXBTdG9yYWdlID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmdldFN0b3JhZ2UoR3JvdXBTdG9yYWdlLmNsYXNzLCBCZWFuVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMubW9kZWxWYWxpZGF0aW9uU3RvcmFnZSA9IEV4dFZhbFV0aWxzLg0KLSAgICAgICAgICAgICAgICBnZXRTdG9yYWdlKE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MsIE1vZGVsVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TWVzc2FnZUludGVycG9sYXRvcigpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmb3VuZEJlYW4gPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4oTWVzc2FnZUludGVycG9sYXRvci5jbGFzcy5nZXROYW1lKCkucmVwbGFjZSgiLiIsICJfIikpOw0KLQ0KLSAgICAgICAgaWYoZm91bmRCZWFuIGluc3RhbmNlb2YgTWVzc2FnZUludGVycG9sYXRvcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmRlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yID0gKE1lc3NhZ2VJbnRlcnBvbGF0b3IpZm91bmRCZWFuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuZGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IgPSBuZXcgRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IoDQotICAgICAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVXRpbHMuZ2V0RGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKS5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TWVzc2FnZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlUmVzb2x2ZXIgPSBFeHRWYWxVdGlscy5nZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koZ2V0QmVhblZhbGlkYXRpb25TdHJhdGVneSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSBnZXRCZWFuVmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kobnVsbCwgbnVsbCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWEwOTVhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQNCi0gICAgICAgIC5BYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigyMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyDQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVSZXF1aXJlZEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgaWYoIUV4dFZhbFV0aWxzLmludGVycHJldEVtcHR5U3RyaW5nVmFsdWVzQXNOdWxsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkgfHwNCi0gICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhpc0NvbXBvbmVudFJlcXVpcmVkKHVpQ29tcG9uZW50KSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZCh0cnVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vQmVhblZhbGlkYXRpb24uamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9CZWFuVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWE4YmI0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9CZWFuVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmdyb3Vwcy5EZWZhdWx0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLQ0KLUBUYXJnZXQoe01FVEhPRCwgRklFTEQsIFRZUEV9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1ARG9jdW1lbnRlZA0KLXB1YmxpYyBAaW50ZXJmYWNlIEJlYW5WYWxpZGF0aW9uDQotew0KLSAgICBTdHJpbmdbXSB2aWV3SWRzKCkgZGVmYXVsdCAiKiI7DQotDQotICAgIENsYXNzW10gdXNlR3JvdXBzKCkgZGVmYXVsdCBEZWZhdWx0LmNsYXNzOw0KLQ0KLSAgICBDbGFzc1tdIHJlc3RyaWN0R3JvdXBzKCkgZGVmYXVsdCB7fTsNCi0NCi0gICAgU3RyaW5nW10gY29uZGl0aW9ucygpIGRlZmF1bHQgIiN7dHJ1ZX0iOw0KLQ0KLSAgICBNb2RlbFZhbGlkYXRpb24gbW9kZWxWYWxpZGF0aW9uKCkgZGVmYXVsdCBATW9kZWxWYWxpZGF0aW9uOw0KLSAgICANCi0gICAgQFJldGVudGlvbihSVU5USU1FKSBzdGF0aWMgQGludGVyZmFjZSBMaXN0DQotICAgIHsNCi0gICAgICAgIEJlYW5WYWxpZGF0aW9uW10gdmFsdWUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vTW9kZWxWYWxpZGF0aW9uLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vTW9kZWxWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2Yzc4ZGQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL01vZGVsVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLQ0KLUBUYXJnZXQoe01FVEhPRCwgRklFTEQsIFRZUEV9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1ARG9jdW1lbnRlZA0KLXB1YmxpYyBAaW50ZXJmYWNlIE1vZGVsVmFsaWRhdGlvbg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVCA9ICIiOw0KLQ0KLSAgICBib29sZWFuIGlzQWN0aXZlKCkgZGVmYXVsdCBmYWxzZTsNCi0NCi0gICAgYm9vbGVhbiBkaXNwbGF5SW5saW5lKCkgZGVmYXVsdCBmYWxzZTsNCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInN1cHBvcnQgcHJvcGVydHkgY2hhaW4gc3ludGF4IikNCi0gICAgU3RyaW5nW10gdmFsaWRhdGlvblRhcmdldHMoKSBkZWZhdWx0IERFRkFVTFQ7DQotDQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCBERUZBVUxUOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3Rvci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2ZjEzNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5leHRyYWN0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ1c2UgbWV0YS1kYXRhIHN0b3JhZ2UgLSBidXQgYSBzcGVjaWFsIGltcGwuIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3IgZXh0ZW5kcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3INCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFByb3BlcnR5RGV0YWlscykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihvYmplY3QuZ2V0Q2xhc3MoKSArICIgaXMgbm90IGEgIiArIFByb3BlcnR5RGV0YWlscy5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IChQcm9wZXJ0eURldGFpbHMpb2JqZWN0Ow0KLQ0KLSAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKSk7DQotDQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsNCi0gICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uc2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsNCi0NCi0gICAgICAgIGV4dHJhY3RBbm5vdGF0aW9ucyhwcm9wZXJ0eUluZm9ybWF0aW9uLCBwcm9wZXJ0eURldGFpbHMsIGVudGl0eUNsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvQmVhblZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9CZWFuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MTdmODguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9CZWFuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIGV4dHJhY3RzIGFuZCBhZGRzIHRoZSBleHR2YWwgYnYgbWV0YS1kYXRhIChlLmcuIHZhbGlkYXRpb24gZ3JvdXBzKSB0byB0aGUgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yDQotew0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyICYmIGlzQmxvY2tpbmdFeGNlcHRpb24odWlDb21wb25lbnQsIHZhbGlkYXRvckV4Y2VwdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9idiBpbnRlZ3JhdGlvbiBkb2Vzbid0IHRocm93IGV4Y2VwdGlvbnMgdG8gc3VwcG9ydCBtdWx0aXBsZSBtZXNzYWdlcyAtPiBzZXQgY29tcG9uZW50IHN0YXRlDQotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRWYWxpZChmYWxzZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNCbG9ja2luZ0V4Y2VwdGlvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKS5zZXZlcml0eUNhdXNlc1ZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmY2Y3MGYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuVmFsaWRhdGlvbk1vZHVsZUF3YXJlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLkJlYW5WYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC51dGlsLkJlYW5WYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIGV4dHJhY3RzIGFuZCBhZGRzIHRoZSBleHR2YWwgYnYgbWV0YS1kYXRhIChlLmcuIHZhbGlkYXRpb24gZ3JvdXBzKSB0byB0aGUgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotICAgICAgICBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLCBWYWxpZGF0aW9uTW9kdWxlQXdhcmUNCi17DQotICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKHByb3BlcnR5SW5mb3JtYXRpb24uY29udGFpbnNJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5DVVNUT01fUFJPUEVSVElFUykpDQotICAgICAgICB7DQotICAgICAgICAgICAgTWFwIHByb3BlcnRpZXMgPSBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkNVU1RPTV9QUk9QRVJUSUVTLCBNYXAuY2xhc3MpOw0KLQ0KLSAgICAgICAgICAgIGlmKHByb3BlcnRpZXMgIT0gbnVsbCAmJiBwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFVJQ29tcG9uZW50LmNsYXNzLmdldE5hbWUoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCA9IChVSUNvbXBvbmVudClwcm9wZXJ0aWVzLmdldChVSUNvbXBvbmVudC5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMuZ2V0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgICAgICAgICBwcm9jZXNzRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YSh1aUNvbXBvbmVudCwgcHJvcGVydHlEZXRhaWxzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIGFkZHMgdGhlIGV4dHZhbCBidiBtZXRhLWRhdGEgdG8gdGhlIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dA0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgY3VycmVudCBjb21wb25lbnQNCi0gICAgICogQHBhcmFtIHByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eSBkZXRhaWxzIG9mIHRoZSB2YWx1ZS1iaW5kaW5nDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0V4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGEoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMpDQotICAgIHsNCi0gICAgICAgIGlmKEpzZlV0aWxzLmlzUmVuZGVyUmVzcG9uc2VQaGFzZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVXRpbHMuYWRkTWV0YURhdGFUb0NvbnRleHQodWlDb21wb25lbnQsIHByb3BlcnR5RGV0YWlscywgZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVXRpbHMuYWRkTWV0YURhdGFUb0NvbnRleHQodWlDb21wb25lbnQsIHByb3BlcnR5RGV0YWlscywgdHJ1ZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldE1vZHVsZUtleXMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtCZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCl9Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJmZGEwZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0Fic3RyYWN0QmVhblZhbGlkYXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLlZpb2xhdGlvblNldmVyaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEJlYW5WYWxpZGF0aW9uTWV0YURhdGFUcmFuc2Zvcm1lcjxUIGV4dGVuZHMgQW5ub3RhdGlvbj4gaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBDb25zdHJhaW50RGVzY3JpcHRvcjw/IGV4dGVuZHMgVD4gY29uc3RyYWludERlc2NyaXB0b3IgPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKENvbnN0cmFpbnREZXNjcmlwdG9yLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmKGlzQ2xpZW50U2lkZVZhbGlkYXRpb25FbmFibGVkKGNvbnN0cmFpbnREZXNjcmlwdG9yKSAmJiBpc0Jsb2NraW5nQ29uc3RyYWludChjb25zdHJhaW50RGVzY3JpcHRvcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybU1ldGFEYXRhKChDb25zdHJhaW50RGVzY3JpcHRvcjxUPiljb25zdHJhaW50RGVzY3JpcHRvcik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NsaWVudFNpZGVWYWxpZGF0aW9uRW5hYmxlZChDb25zdHJhaW50RGVzY3JpcHRvcjw/IGV4dGVuZHMgVD4gY29uc3RyYWludERlc2NyaXB0b3IpDQotICAgIHsNCi0gICAgICAgIGZvcihDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD4gcGF5bG9hZCA6IGNvbnN0cmFpbnREZXNjcmlwdG9yLmdldFBheWxvYWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzKS5pc0Fzc2lnbmFibGVGcm9tKHBheWxvYWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQmxvY2tpbmdDb25zdHJhaW50KENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IGNvbnN0cmFpbnREZXNjcmlwdG9yKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UgdGVzdE1lc3NhZ2UgPSBuZXcgRmFjZXNNZXNzYWdlKCk7DQotICAgICAgICB0ZXN0TWVzc2FnZS5zZXRTZXZlcml0eShWaW9sYXRpb25TZXZlcml0eS5FcnJvci5WQUxVRSk7DQotDQotICAgICAgICBmb3IgKENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPiBwYXlsb2FkIDogY29uc3RyYWludERlc2NyaXB0b3IuZ2V0UGF5bG9hZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcykuaXNBc3NpZ25hYmxlRnJvbShwYXlsb2FkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRlc3RNZXNzYWdlLnNldFNldmVyaXR5KFZpb2xhdGlvblNldmVyaXR5Lldhcm4uVkFMVUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihWaW9sYXRpb25TZXZlcml0eS5JbmZvLmNsYXNzKS5pc0Fzc2lnbmFibGVGcm9tKHBheWxvYWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGVzdE1lc3NhZ2Uuc2V0U2V2ZXJpdHkoVmlvbGF0aW9uU2V2ZXJpdHkuSW5mby5WQUxVRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYoRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKFZpb2xhdGlvblNldmVyaXR5LkZhdGFsLmNsYXNzKS5pc0Fzc2lnbmFibGVGcm9tKHBheWxvYWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGVzdE1lc3NhZ2Uuc2V0U2V2ZXJpdHkoVmlvbGF0aW9uU2V2ZXJpdHkuRmF0YWwuVkFMVUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5zZXZlcml0eUJsb2Nrc1N1Ym1pdEZvckNvbXBvbmVudElkKG51bGwsIHRlc3RNZXNzYWdlKTsNCi0gICAgfQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShDb25zdHJhaW50RGVzY3JpcHRvcjxUPiBjb25zdHJhaW50RGVzY3JpcHRvcik7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAwOGQ1YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL05vdE51bGxNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIE5vdE51bGxNZXRhRGF0YVRyYW5zZm9ybWVyIGV4dGVuZHMgQWJzdHJhY3RCZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXI8Tm90TnVsbD4NCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKENvbnN0cmFpbnREZXNjcmlwdG9yPE5vdE51bGw+IGNvbnN0cmFpbnREZXNjcmlwdG9yKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIGlmKEV4dFZhbFV0aWxzLmludGVycHJldEVtcHR5U3RyaW5nVmFsdWVzQXNOdWxsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9TdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9TdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTlmZjU4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU3RyaW5nU2l6ZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBTdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lciBleHRlbmRzIEFic3RyYWN0QmVhblZhbGlkYXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyPFNpemU+DQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShDb25zdHJhaW50RGVzY3JpcHRvcjxTaXplPiBjb25zdHJhaW50RGVzY3JpcHRvcikNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBTaXplIGFubm90YXRpb24gPSBjb25zdHJhaW50RGVzY3JpcHRvci5nZXRBbm5vdGF0aW9uKCk7DQotDQotICAgICAgICBpbnQgbWluaW11bSA9IGFubm90YXRpb24ubWluKCk7DQotDQotICAgICAgICBpZihtaW5pbXVtICE9IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEgsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIX0RFRkFVTFQsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW50IG1heGltdW0gPSBhbm5vdGF0aW9uLm1heCgpOw0KLSAgICAgICAgaWYobWF4aW11bSAhPSBJbnRlZ2VyLk1BWF9WQUxVRSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCwgbWF4aW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEhfREVGQVVMVCwgbWF4aW11bSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0QmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGUwMzFjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0QmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXINCi0gICAgICAgIC5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotICAgIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYoaXNCZWFuVmFsaWRhdGlvblN0cmF0ZWd5KHNvdXJjZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5IGJlYW5WYWxpZGF0aW9uQWRhcHRlciA9DQotICAgICAgICAgICAgICAgICAgICAoQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5KXNvdXJjZTsNCi0NCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlQmVhblZhbGlkYXRpb25UcmFuc2Zvcm1lck5hbWUoYmVhblZhbGlkYXRpb25BZGFwdGVyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3koVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgIGFic3RyYWN0IFN0cmluZyBjcmVhdGVCZWFuVmFsaWRhdGlvblRyYW5zZm9ybWVyTmFtZSgNCi0gICAgICAgICAgICBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvTm90TnVsbE5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL05vdE51bGxOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMjg3ODYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvTm90TnVsbE5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIuTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5OZXN0ZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQE5lc3RlZA0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgTm90TnVsbE5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlQmVhblZhbGlkYXRpb25UcmFuc2Zvcm1lck5hbWUoQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5IGFkYXB0ZXIpDQotICAgIHsNCi0gICAgICAgIGlmKGlzTm90TnVsbENvbnN0cmFpbnQoYWRhcHRlcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIE5vdE51bGxNZXRhRGF0YVRyYW5zZm9ybWVyLmNsYXNzLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc05vdE51bGxDb25zdHJhaW50KEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSBhZGFwdGVyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gTm90TnVsbC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKA0KLSAgICAgICAgICAgICAgICBhZGFwdGVyLmdldENvbnN0cmFpbnREZXNjcmlwdG9yKCkuZ2V0QW5ub3RhdGlvbigpLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaXplTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2l6ZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM4OTBjNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaXplTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5OZXN0ZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIuU3RyaW5nU2l6ZU1ldGFEYXRhVHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ATmVzdGVkDQotQEludm9jYXRpb25PcmRlcigyMTApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaXplTmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0QmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVCZWFuVmFsaWRhdGlvblRyYW5zZm9ybWVyTmFtZShCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgYWRhcHRlcikNCi0gICAgew0KLSAgICAgICAgaWYoaXNTdHJpbmdTaXplQ29uc3RyYWludChhZGFwdGVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gU3RyaW5nU2l6ZU1ldGFEYXRhVHJhbnNmb3JtZXIuY2xhc3MuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3RyaW5nU2l6ZUNvbnN0cmFpbnQoQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5IGFkYXB0ZXIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBTaXplLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoDQotICAgICAgICAgICAgICAgIGFkYXB0ZXIuZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKS5nZXRBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCkpICYmDQotICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGFkYXB0ZXIuZ2V0RWxlbWVudENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3BheWxvYWQvRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3BheWxvYWQvRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMmQyMmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wYXlsb2FkL0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwucGF5bG9hZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24gZXh0ZW5kcyBQYXlsb2FkDQotew0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3BheWxvYWQvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvcGF5bG9hZC9WaW9sYXRpb25TZXZlcml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzg4YjJkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvcGF5bG9hZC9WaW9sYXRpb25TZXZlcml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwucGF5bG9hZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZpb2xhdGlvblNldmVyaXR5DQotew0KLSAgICBpbnRlcmZhY2UgSW5mbyBleHRlbmRzIFBheWxvYWQNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFZBTFVFID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0lORk87DQotICAgIH0NCi0NCi0gICAgaW50ZXJmYWNlIFdhcm4gZXh0ZW5kcyBQYXlsb2FkDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBWQUxVRSA9IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOOw0KLSAgICB9DQotDQotICAgIGludGVyZmFjZSBFcnJvciBleHRlbmRzIFBheWxvYWQNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFZBTFVFID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SOw0KLSAgICB9DQotDQotICAgIGludGVyZmFjZSBGYXRhbCBleHRlbmRzIFBheWxvYWQNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFZBTFVFID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RhcnR1cC9CZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdGFydHVwL0JlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYWM2ZjguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdGFydHVwL0JlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLkh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5CZWFuQXdhcmVWYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLlZpb2xhdGlvblNldmVyaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbC5CZWFuVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5pbnRlcmNlcHRvci5FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5pbnRlcmNlcHRvci5CZWFuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLk1vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlci5TaXplTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyLk5vdE51bGxOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLkRlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5Nb2RlbFZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLm1hcHBlci5CZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UubWFwcGVyLk1vZGVsVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuR3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VySG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MDI1NzQ4Mzk5ODc2ODMzMzk0TDsNCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyVmFsaWRhdG9yRmFjdG9yeSgpOw0KLSAgICAgICAgcmVnaXN0ZXJCZWFuVmFsaWRhdGlvbkludGVyY2VwdG9yKCk7DQotICAgICAgICByZWdpc3Rlck1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCk7DQotICAgICAgICByZWdpc3Rlckdyb3VwU3RvcmFnZU5hbWVNYXBwZXIoKTsNCi0gICAgICAgIHJlZ2lzdGVyTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKTsNCi0gICAgICAgIHJlZ2lzdGVyQ29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7DQotICAgICAgICByZWdpc3Rlck1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOw0KLSAgICAgICAgcmVnaXN0ZXJQaGFzZUxpc3RlbmVycygpOw0KLSAgICAgICAgcmVnaXN0ZXJFeGNlcHRpb25JbnRlcmNlcHRvcigpOw0KLSAgICAgICAgcmVnaXN0ZXJWaW9sYXRpb25TZXZlcml0eVBheWxvYWQoKTsNCi0gICAgICAgIHJlZ2lzdGVyRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uUGF5bG9hZCgpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyVmFsaWRhdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KFZhbGlkYXRvckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpLA0KLSAgICAgICAgICAgICAgICBuZXcgQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeShCZWFuVmFsaWRhdGlvblV0aWxzLmdldERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCkpLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJCZWFuVmFsaWRhdGlvbkludGVyY2VwdG9yKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKG5ldyBCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlck1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKG5ldyBTaXplTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcihuZXcgTm90TnVsbE5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJHcm91cFN0b3JhZ2VOYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgU3RvcmFnZU1hbmFnZXIgc3RvcmFnZU1hbmFnZXIgPSBnZXRTdG9yYWdlTWFuYWdlckhvbGRlcigpLmdldFN0b3JhZ2VNYW5hZ2VyKEdyb3VwU3RvcmFnZS5jbGFzcyk7DQotDQotICAgICAgICBpZiAoc3RvcmFnZU1hbmFnZXIgaW5zdGFuY2VvZiBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkpDQotICAgICAgICB7DQotICAgICAgICAgICAgKChBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8U3RyaW5nPikgc3RvcmFnZU1hbmFnZXIpDQotICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihzdG9yYWdlTWFuYWdlci5nZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgIiBoYXMgdG8gaW1wbGVtZW50IEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeSAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICIgY291bGRuJ3QgcmVnaXN0ZXIgIiArIEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlck1vZGVsVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyIG1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyID0gbmV3IERlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlcigpOw0KLSAgICAgICAgbW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIucmVnaXN0ZXIobmV3IE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgZ2V0U3RvcmFnZU1hbmFnZXJIb2xkZXIoKS5zZXRTdG9yYWdlTWFuYWdlcihNb2RlbFZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLCBtb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlciwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyQ29tcG9uZW50SW5pdGlhbGl6ZXJzKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdG9yYWdlTWFuYWdlckhvbGRlciBnZXRTdG9yYWdlTWFuYWdlckhvbGRlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlksIFN0b3JhZ2VNYW5hZ2VySG9sZGVyLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJQaGFzZUxpc3RlbmVycygpDQotICAgIHsNCi0gICAgICAgIEpzZlV0aWxzLnJlZ2lzdGVyUGhhc2VMaXN0ZW5lcihuZXcgTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckV4Y2VwdGlvbkludGVyY2VwdG9yKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKG5ldyBCZWFuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyVmlvbGF0aW9uU2V2ZXJpdHlQYXlsb2FkKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dCBleHRWYWxDb250ZXh0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCk7DQotDQotICAgICAgICBleHRWYWxDb250ZXh0LmFkZEdsb2JhbFByb3BlcnR5KFZpb2xhdGlvblNldmVyaXR5LkluZm8uY2xhc3MuZ2V0TmFtZSgpLCBWaW9sYXRpb25TZXZlcml0eS5JbmZvLmNsYXNzLCBmYWxzZSk7DQotICAgICAgICBleHRWYWxDb250ZXh0LmFkZEdsb2JhbFByb3BlcnR5KFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MuZ2V0TmFtZSgpLCBWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzLCBmYWxzZSk7DQotICAgICAgICBleHRWYWxDb250ZXh0LmFkZEdsb2JhbFByb3BlcnR5KFZpb2xhdGlvblNldmVyaXR5LkZhdGFsLmNsYXNzLmdldE5hbWUoKSwgVmlvbGF0aW9uU2V2ZXJpdHkuRmF0YWwuY2xhc3MsIGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gbmVlZCB0byByZWdpc3RlciAiZXJyb3IiIGl0J3MgdGhlIGRlZmF1bHQNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb25QYXlsb2FkKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoDQotICAgICAgICAgICAgICAgIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCksIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcywgZmFsc2UpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYwMzc2ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRHcm91cFN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlIGltcGxlbWVudGF0aW9uIGZvciBiZWFuLXZhbGlkYXRpb24gZ3JvdXBzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlIGV4dGVuZHMgRGVmYXVsdEdyb3VwU3RvcmFnZQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBDbGFzc1tdIGdldEdyb3VwcyhTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIENsYXNzW10gcmVzdWx0ID0gc3VwZXIuZ2V0R3JvdXBzKHZpZXdJZCwgY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy90aGUgZGVmYXVsdCBncm91cCB3aWxsIGJlIHZhbGlkYXRlZCBhdXRvbWF0aWNhbGx5DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzc1tdIHt9Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODAwZjhiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkdyb3VwVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogc3RvcmFnZSBpbXBsZW1lbnRhdGlvbiBmb3IgbW9kZWwtdmFsaWRhdGlvbiBlbnRyaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UgaW1wbGVtZW50cyBNb2RlbFZhbGlkYXRpb25TdG9yYWdlDQotew0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+PiBtb2RlbFZhbGlkYXRpb25FbnRyaWVzID0NCi0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+PigpOw0KLQ0KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBjb21wb25lbnRzT2ZSZXF1ZXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY2xpZW50SWQgPSBnZXRDdXJyZW50Q2xpZW50SWQobW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLQ0KLSAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0ID0gcmVzb2x2ZU1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCgNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnksIGNsaWVudElkKTsNCi0NCi0gICAgICAgIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwgbW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldEN1cnJlbnRDbGllbnRJZChNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGNsaWVudElkID0gbnVsbDsNCi0NCi0gICAgICAgIGlmKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2xpZW50SWQgPSBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKS5nZXRDbGllbnRJZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOw0KLQ0KLSAgICAgICAgICAgIGlmKCF0aGlzLmNvbXBvbmVudHNPZlJlcXVlc3QuY29udGFpbnMoY2xpZW50SWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzT2ZSZXF1ZXN0LmFkZChjbGllbnRJZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNsaWVudElkOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gcmVzb2x2ZU1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCgNCi0gICAgICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QgPQ0KLSAgICAgICAgICAgICAgICB0aGlzLm1vZGVsVmFsaWRhdGlvbkVudHJpZXMuZ2V0KEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkoDQotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Vmlld0lkKCksIGNsaWVudElkKSk7DQotDQotICAgICAgICBpZihtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QgPSBuZXcgQXJyYXlMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PigpOw0KLSAgICAgICAgICAgIHRoaXMubW9kZWxWYWxpZGF0aW9uRW50cmllcy5wdXQoR3JvdXBVdGlscy5nZXRHcm91cEtleSgNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldFZpZXdJZCgpLCBjbGllbnRJZCksIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRNb2RlbFZhbGlkYXRpb25FbnRyeSgNCi0gICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZighbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LmNvbnRhaW5zKG1vZGVsVmFsaWRhdGlvbkVudHJ5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QuYWRkKG1vZGVsVmFsaWRhdGlvbkVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllc1RvVmFsaWRhdGUoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmlld0lkID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0Vmlld0lkKCk7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PigpOw0KLQ0KLSAgICAgICAgYWRkRW50cmllc0ZvckNvbXBvbmVudHModmlld0lkLCByZXN1bHQpOw0KLQ0KLSAgICAgICAgYWRkRW50cmllc0ZvclBhZ2Uodmlld0lkLCByZXN1bHQpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkRW50cmllc0ZvckNvbXBvbmVudHMoU3RyaW5nIHZpZXdJZCwgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RyaW5nIGN1cnJlbnRDbGllbnRJZCA6IHRoaXMuY29tcG9uZW50c09mUmVxdWVzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQuYWRkQWxsKGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXModmlld0lkLCBjdXJyZW50Q2xpZW50SWQpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkRW50cmllc0ZvclBhZ2UoU3RyaW5nIHZpZXdJZCwgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICByZXN1bHQuYWRkQWxsKGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXModmlld0lkKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBidWlsZE1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCgNCi0gICAgICAgICAgICBTdHJpbmcga2V5LCBNYXA8U3RyaW5nLCBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5Pj4gZ3JvdXBTdG9yYWdlKQ0KLSAgICB7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBsaXN0Ow0KLQ0KLSAgICAgICAgaWYoa2V5ICE9IG51bGwgJiYga2V5LmVuZHNXaXRoKCIqIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICAgICAgZm9yKE1hcC5FbnRyeTxTdHJpbmcsTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4+IGVudHJ5IDogZ3JvdXBTdG9yYWdlLmVudHJ5U2V0KCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihlbnRyeS5nZXRLZXkoKS5zdWJzdHJpbmcoMCwgZW50cnkuZ2V0S2V5KCkuaW5kZXhPZigiQCIpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoa2V5LnN1YnN0cmluZygwLCBrZXkuaW5kZXhPZigiQCIpKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkQWxsKGVudHJ5LmdldFZhbHVlKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBsaXN0Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbGlzdCA9IGdyb3VwU3RvcmFnZS5nZXQoa2V5KTsNCi0gICAgICAgIHJldHVybiAobGlzdCAhPSBudWxsKSA/IGxpc3QgOiBuZXcgQXJyYXlMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllcyhTdHJpbmcgdmlld0lkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllcyh2aWV3SWQsIG51bGwpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllcyhTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMubW9kZWxWYWxpZGF0aW9uRW50cmllcy5zaXplKCkgPCAxKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9hZGQgZm91bmQgZ3JvdXBzDQotICAgICAgICBTdHJpbmcga2V5Ow0KLSAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gcmVzdWx0TGlzdEZvclBhZ2UgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYoISIqIi5lcXVhbHMoY2xpZW50SWQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGtleSA9IEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBudWxsKTsNCi0gICAgICAgICAgICByZXN1bHRMaXN0Rm9yUGFnZSA9DQotICAgICAgICAgICAgICAgICAgICBidWlsZE1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdChrZXksIHRoaXMubW9kZWxWYWxpZGF0aW9uRW50cmllcyk7DQotICAgICAgICB9DQotDQotICAgICAgICBrZXkgPSBHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgY2xpZW50SWQpOw0KLSAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gcmVzdWx0TGlzdEZvckNvbXBvbmVudCA9DQotICAgICAgICAgICAgICAgIGJ1aWxkTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KGtleSwgdGhpcy5tb2RlbFZhbGlkYXRpb25FbnRyaWVzKTsNCi0NCi0gICAgICAgIGlmKHJlc3VsdExpc3RGb3JQYWdlID09IG51bGwgfHwgcmVzdWx0TGlzdEZvclBhZ2UuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRMaXN0Rm9yQ29tcG9uZW50Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihyZXN1bHRMaXN0Rm9yQ29tcG9uZW50LmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0TGlzdEZvclBhZ2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWVyZ2VSZXN1bHRzKHJlc3VsdExpc3RGb3JQYWdlLCByZXN1bHRMaXN0Rm9yQ29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1lcmdlUmVzdWx0cygNCi0gICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHRMaXN0Rm9yUGFnZSwgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gcmVzdWx0TGlzdEZvckNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbWVyZ2VkUmVzdWx0ID0gbmV3IEFycmF5TGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4oKTsNCi0gICAgICAgIG1lcmdlZFJlc3VsdC5hZGRBbGwocmVzdWx0TGlzdEZvclBhZ2UpOw0KLSAgICAgICAgbWVyZ2VkUmVzdWx0LmFkZEFsbChyZXN1bHRMaXN0Rm9yQ29tcG9uZW50KTsNCi0gICAgICAgIHJldHVybiBtZXJnZWRSZXN1bHQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWY4MjgxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBtb2RlbC12YWxpZGF0aW9uIGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXINCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPE1vZGVsVmFsaWRhdGlvblN0b3JhZ2U+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX01PREVMX1ZBTElEQVRJT046S0VZIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvTW9kZWxWYWxpZGF0aW9uRW50cnkuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzhhOGYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuQVBJOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oQVBJKQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25FbnRyeQ0KLXsNCi0gICAgcHJpdmF0ZSBVSUNvbXBvbmVudCBjb21wb25lbnQ7DQotICAgIHByaXZhdGUgTGlzdDxDbGFzcz4gZ3JvdXBzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgcHJpdmF0ZSBMaXN0PE9iamVjdD4gdmFsaWRhdGlvblRhcmdldHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGRpc3BsYXlNZXNzYWdlSW5saW5lID0gZmFsc2U7DQotICAgIHByaXZhdGUgU3RyaW5nIGN1c3RvbU1lc3NhZ2UgPSBNb2RlbFZhbGlkYXRpb24uREVGQVVMVDsNCi0gICAgDQotICAgIC8vdGhlIG9yaWdpbmFsIHNvdXJjZSB3aGVyZSB0aGUgZXh0dmFsLWJ2IG1ldGEtZGF0YSBoYXMgYmVlbiBmb3VuZA0KLSAgICBwcml2YXRlIE9iamVjdCBtZXRhRGF0YVNvdXJjZU9iamVjdDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmlld0lkID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0Vmlld0lkKCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEdyb3VwKENsYXNzIGdyb3VwKQ0KLSAgICB7DQotICAgICAgICBpZighdGhpcy5ncm91cHMuY29udGFpbnMoZ3JvdXApKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCEodGhpcy5ncm91cHMgaW5zdGFuY2VvZiBBcnJheUxpc3QpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gbmV3R3JvdXBMaXN0ID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgICAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRDbGFzcyA6IHRoaXMuZ3JvdXBzKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBuZXdHcm91cExpc3QuYWRkKGN1cnJlbnRDbGFzcyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgdGhpcy5ncm91cHMgPSBuZXdHcm91cExpc3Q7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHRoaXMuZ3JvdXBzLmFkZChncm91cCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlR3JvdXAoQ2xhc3MgZ3JvdXApDQotICAgIHsNCi0gICAgICAgIHRoaXMuZ3JvdXBzLnJlbW92ZShncm91cCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkVmFsaWRhdGlvblRhcmdldChPYmplY3QgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBpZighdGhpcy52YWxpZGF0aW9uVGFyZ2V0cy5jb250YWlucyh0YXJnZXQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCEodGhpcy52YWxpZGF0aW9uVGFyZ2V0cyBpbnN0YW5jZW9mIEFycmF5TGlzdCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBMaXN0PE9iamVjdD4gdmFsaWRhdGlvblRhcmdldExpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0NCi0gICAgICAgICAgICAgICAgZm9yKE9iamVjdCBjdXJyZW50VGFyZ2V0IDogdGhpcy52YWxpZGF0aW9uVGFyZ2V0cykNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldExpc3QuYWRkKGN1cnJlbnRUYXJnZXQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvblRhcmdldHMgPSB2YWxpZGF0aW9uVGFyZ2V0TGlzdDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uVGFyZ2V0cy5hZGQodGFyZ2V0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBVSUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudChVSUNvbXBvbmVudCBjb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzc1tdIGdldEdyb3VwcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmdyb3Vwcy50b0FycmF5KG5ldyBDbGFzc1t0aGlzLmdyb3Vwcy5zaXplKCldKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRHcm91cHMoTGlzdDxDbGFzcz4gZ3JvdXBzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmdyb3VwcyA9IGdyb3VwczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGdldFZhbGlkYXRpb25UYXJnZXRzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25UYXJnZXRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0TWV0YURhdGFTb3VyY2VPYmplY3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFTb3VyY2VPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFTb3VyY2VPYmplY3QoT2JqZWN0IG1ldGFEYXRhU291cmNlT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhU291cmNlT2JqZWN0ID0gbWV0YURhdGFTb3VyY2VPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJSZWR1bmRhbnRJZlN0YXRlbWVudCJ9KQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICBpZiAodGhpcyA9PSBvKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSB0aGF0ID0gKE1vZGVsVmFsaWRhdGlvbkVudHJ5KSBvOw0KLQ0KLSAgICAgICAgaWYgKGNvbXBvbmVudCAhPSBudWxsID8gIWNvbXBvbmVudC5lcXVhbHModGhhdC5jb21wb25lbnQpIDogdGhhdC5jb21wb25lbnQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWdyb3Vwcy5lcXVhbHModGhhdC5ncm91cHMpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghdmFsaWRhdGlvblRhcmdldHMuZXF1YWxzKHRoYXQudmFsaWRhdGlvblRhcmdldHMpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRGlzcGxheU1lc3NhZ2VJbmxpbmUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGlzcGxheU1lc3NhZ2VJbmxpbmU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGlzcGxheU1lc3NhZ2VJbmxpbmUoYm9vbGVhbiBkaXNwbGF5TWVzc2FnZUlubGluZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5kaXNwbGF5TWVzc2FnZUlubGluZSA9IGRpc3BsYXlNZXNzYWdlSW5saW5lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tTWVzc2FnZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbU1lc3NhZ2UoU3RyaW5nIGN1c3RvbU1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3VzdG9tTWVzc2FnZSA9IGN1c3RvbU1lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICBpbnQgcmVzdWx0ID0gY29tcG9uZW50ICE9IG51bGwgPyBjb21wb25lbnQuaGFzaENvZGUoKSA6IDA7DQotICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGdyb3Vwcy5oYXNoQ29kZSgpOw0KLSAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyB2YWxpZGF0aW9uVGFyZ2V0cy5oYXNoQ29kZSgpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZpZXdJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2aWV3SWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Vmlld0lkKFN0cmluZyB2aWV3SWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmlld0lkID0gdmlld0lkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvTW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGJkZjkzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIHN1Z2dlc3RlZCBpbnRlcmZhY2UgZm9yIGEgbW9kZWwtdmFsaWRhdGlvbiBzdG9yYWdlDQotICogPHAvPg0KLSAqIGl0IGFsbG93cyB0byBtYW5hZ2UgbW9kZWwtdmFsaWRhdGlvbi1lbnRyaWVzIGZvciB0aGUgY3VycmVudCByZXF1ZXN0DQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBNb2RlbFZhbGlkYXRpb25TdG9yYWdlDQotew0KLSAgICB2b2lkIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5KTsNCi0NCi0gICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllc1RvVmFsaWRhdGUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9CZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9tYXBwZXIvQmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MjRiNTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9CZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLkRlZmF1bHRCZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChCZWFuVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGtleSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2M1YjViLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9tYXBwZXIvTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5EZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKE1vZGVsVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGtleSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvQmVhblZhbGlkYXRpb25VdGlscy5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC91dGlsL0JlYW5WYWxpZGF0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc2ZDE3My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvQmVhblZhbGlkYXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5Nb2RlbFZhbGlkYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuRmFjZXNNZXNzYWdlSG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uVXRpbHMNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0dHRVIgPSBMb2dGYWN0b3J5LmdldExvZyhCZWFuVmFsaWRhdGlvblV0aWxzLmNsYXNzKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscyBidm1pID0gbmV3IEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFJbnRlcm5hbHMoTE9HR0VSKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRPUl9GQUNUT1JZX0tFWSA9ICJqYXZheC5mYWNlcy52YWxpZGF0b3IuYmVhblZhbGlkYXRvci5WYWxpZGF0b3JGYWN0b3J5IjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE1ldGFEYXRhVG9Db250ZXh0KA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IGNvbXBvbmVudCwgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmdbXSBrZXkgPSBwcm9wZXJ0eURldGFpbHMuZ2V0S2V5KCkuc3BsaXQoIlxcLiIpOw0KLQ0KLSAgICAgICAgT2JqZWN0IGZpcnN0QmVhbiA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbihrZXlbMF0pOw0KLQ0KLSAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24gPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLSAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QgPSBuZXcgQXJyYXlMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PigpOw0KLSAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgICAgICBidm1pLmV4dHJhY3RFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhKHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAga2V5LA0KLSAgICAgICAgICAgICAgICBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgYnZtaS5wcm9jZXNzRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YShjb21wb25lbnQsDQotICAgICAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByb2Nlc3NDb25zdHJhaW50VmlvbGF0aW9ucyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb24+IHZpb2xhdGlvbnMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+KCk7DQotDQotICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlOw0KLSAgICAgICAgZm9yIChDb25zdHJhaW50VmlvbGF0aW9uIHZpb2xhdGlvbiA6IHZpb2xhdGlvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNNZXNzYWdlID0gY3JlYXRlRmFjZXNNZXNzYWdlRm9yQ29uc3RyYWludFZpb2xhdGlvbih1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCB2aW9sYXRpb24pOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWNlc01lc3NhZ2UgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBidm1pLnByb2Nlc3NGYWNlc01lc3NhZ2UoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHByb2Nlc3NWaW9sYXRpb25NZXNzYWdlcyhmYWNlc01lc3NhZ2VIb2xkZXJMaXN0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY2VzTWVzc2FnZSBjcmVhdGVGYWNlc01lc3NhZ2VGb3JDb25zdHJhaW50VmlvbGF0aW9uKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RyYWludFZpb2xhdGlvbiB2aW9sYXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2aW9sYXRpb25NZXNzYWdlID0gdmlvbGF0aW9uLmdldE1lc3NhZ2UoKTsNCi0NCi0gICAgICAgIFN0cmluZyBsYWJlbGVkTWVzc2FnZVN1bW1hcnkgPSBidm1pLmNyZWF0ZUxhYmVsZWRNZXNzYWdlKHZpb2xhdGlvbk1lc3NhZ2UsIGZhbHNlKTsNCi0gICAgICAgIFN0cmluZyBsYWJlbGVkTWVzc2FnZURldGFpbCA9IGJ2bWkuY3JlYXRlTGFiZWxlZE1lc3NhZ2UodmlvbGF0aW9uTWVzc2FnZSwgdHJ1ZSk7DQotDQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkgPSBidm1pLmNhbGNTZXZlcml0eSh2aW9sYXRpb24pOw0KLQ0KLSAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiA9IGJ2bWkNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvckV4Y2VwdGlvbihsYWJlbGVkTWVzc2FnZVN1bW1hcnksIGxhYmVsZWRNZXNzYWdlRGV0YWlsLCBzZXZlcml0eSk7DQotDQotICAgICAgICBpZiAoIWJ2bWkuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnModWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChidm1pLmlzTWVzc2FnZVRleHRVbmNoYW5nZWQodmFsaWRhdG9yRXhjZXB0aW9uLCBsYWJlbGVkTWVzc2FnZVN1bW1hcnksIGxhYmVsZWRNZXNzYWdlRGV0YWlsKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKHNldmVyaXR5LCB2aW9sYXRpb25NZXNzYWdlLCB2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKHNldmVyaXR5LA0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldFN1bW1hcnkoKSwNCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKS5nZXREZXRhaWwoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByb2Nlc3NWaW9sYXRpb25NZXNzYWdlcyhMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gdmlvbGF0aW9uTWVzc2FnZUhvbGRlckxpc3QpDQotICAgIHsNCi0gICAgICAgIGlmICh2aW9sYXRpb25NZXNzYWdlSG9sZGVyTGlzdCA9PSBudWxsIHx8IHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0LmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlTGlzdFdpdGhMb3dTZXZlcml0eSA9DQotICAgICAgICAgICAgICAgIGJ2bWkuZ2V0RmFjZXNNZXNzYWdlTGlzdFdpdGhMb3dTZXZlcml0eSh2aW9sYXRpb25NZXNzYWdlSG9sZGVyTGlzdCk7DQotICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlTGlzdFdpdGhIaWdoU2V2ZXJpdHkgPQ0KLSAgICAgICAgICAgICAgICBidm1pLmdldEZhY2VzTWVzc2FnZUxpc3RXaXRoSGlnaFNldmVyaXR5KHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0KTsNCi0NCi0gICAgICAgIGJ2bWkuYWRkTWVzc2FnZXMoZmFjZXNNZXNzYWdlTGlzdFdpdGhIaWdoU2V2ZXJpdHkpOw0KLSAgICAgICAgYnZtaS5hZGRNZXNzYWdlcyhmYWNlc01lc3NhZ2VMaXN0V2l0aExvd1NldmVyaXR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbGlkYXRvckZhY3RvcnkgZ2V0RGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGFwcGxpY2F0aW9uTWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uTWFwKCk7DQotICAgICAgICBWYWxpZGF0b3JGYWN0b3J5IHZhbGlkYXRvckZhY3RvcnkgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKGFwcGxpY2F0aW9uTWFwLmNvbnRhaW5zS2V5KFZBTElEQVRPUl9GQUNUT1JZX0tFWSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGFwcGxpY2F0aW9uTWFwLmdldChWQUxJREFUT1JfRkFDVE9SWV9LRVkpIGluc3RhbmNlb2YgVmFsaWRhdG9yRmFjdG9yeSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRvckZhY3RvcnkgPSAoVmFsaWRhdG9yRmFjdG9yeSkgYXBwbGljYXRpb25NYXAuZ2V0KFZBTElEQVRPUl9GQUNUT1JZX0tFWSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHZhbGlkYXRvckZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0b3JGYWN0b3J5ID0gVmFsaWRhdGlvbi5idWlsZERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCk7DQotICAgICAgICAgICAgYXBwbGljYXRpb25NYXAucHV0KFZBTElEQVRPUl9GQUNUT1JZX0tFWSwgdmFsaWRhdG9yRmFjdG9yeSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscy5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC91dGlsL0V4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFJbnRlcm5hbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhNjc5ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjY4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLlZpb2xhdGlvblNldmVyaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5leHRyYWN0b3IuRGVmYXVsdEdyb3VwQ29udHJvbGxlclNjYW5uaW5nRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLk1vZGVsVmFsaWRhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5FTEhlbHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuRmFjZXNNZXNzYWdlSG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzDQotew0KLSAgICBwcml2YXRlIExvZyBsb2dnZXI7DQotICAgIHByaXZhdGUgTGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMgbGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMgPSBuZXcgTGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMoKTsNCi0NCi0gICAgRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscyhMb2cgbG9nZ2VyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIGV4dHJhY3RFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhKFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgZmlyc3RCZWFuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIGluc3BlY3RGaXJzdEJlYW4ocHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgZmlyc3RCZWFuLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgIGluc3BlY3RGaXJzdFByb3BlcnR5KHByb2Nlc3NNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIGtleSwNCi0gICAgICAgICAgICAgICAgZmlyc3RCZWFuLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBrZXkubGVuZ3RoID09IDIpOw0KLQ0KLSAgICAgICAgaW5zcGVjdEJhc2VPZlByb3BlcnR5KHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotDQotICAgICAgICBpbnNwZWN0TGFzdFByb3BlcnR5KHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotICAgIH0NCi0NCi0gICAgdm9pZCBwcm9jZXNzRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YShVSUNvbXBvbmVudCBjb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0ID0gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRWaWV3SWQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRWaWV3SWQoKTsNCi0NCi0gICAgICAgIFN0cmluZyBjbGllbnRJZCA9IGNvbXBvbmVudC5nZXRDbGllbnRJZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0ZvdW5kR3JvdXBzKGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCwgY3VycmVudFZpZXdJZCwgY2xpZW50SWQsDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgIHByb2Nlc3NSZXN0cmljdGVkR3JvdXBzKGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCwgY3VycmVudFZpZXdJZCwgY2xpZW50SWQsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgaW5pdE1vZGVsVmFsaWRhdGlvbihleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQsIGNvbXBvbmVudCwgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbnNwZWN0Rmlyc3RCZWFuKGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgcHJvY2Vzc0NsYXNzKGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RGaXJzdFByb3BlcnR5KGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0xhc3RQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcHJvY2Vzc0ZpZWxkc0FuZFByb3BlcnRpZXMoa2V5WzBdICsgIi4iICsga2V5WzFdLA0KLSAgICAgICAgICAgICAgICBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgIGtleVsxXSwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgaXNMYXN0UHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbnNwZWN0QmFzZU9mUHJvcGVydHkoUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgcHJvY2Vzc0NsYXNzKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCksDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbnNwZWN0TGFzdFByb3BlcnR5KFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgcHJvY2Vzc0ZpZWxkc0FuZFByb3BlcnRpZXMoDQotICAgICAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKSwNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHRydWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ2xhc3MoT2JqZWN0IG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgY2xhc3NUb0luc3BlY3QgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKG9iamVjdFRvSW5zcGVjdC5nZXRDbGFzcygpKTsNCi0NCi0gICAgICAgIHdoaWxlICghT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NUb0luc3BlY3QuZ2V0TmFtZSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cmFuc2Zlckdyb3VwVmFsaWRhdGlvbkluZm9ybWF0aW9uVG9Gb3VuZEdyb3VwcyhvYmplY3RUb0luc3BlY3QsDQotICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotDQotICAgICAgICAgICAgcHJvY2Vzc0ludGVyZmFjZXMob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCksIG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgICAgICBjbGFzc1RvSW5zcGVjdCA9IGNsYXNzVG9JbnNwZWN0LmdldFN1cGVyY2xhc3MoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ZpZWxkc0FuZFByb3BlcnRpZXMoU3RyaW5nIGtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBiYXNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNMYXN0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3IoKQ0KLSAgICAgICAgICAgICAgICAuZXh0cmFjdChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIG5ldyBQcm9wZXJ0eURldGFpbHMoa2V5LCBiYXNlLCBwcm9wZXJ0eSkpOw0KLQ0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkgOiBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeVRvUHJvY2Vzc01ldGFEYXRhKChCZWFuVmFsaWRhdGlvbikgbWV0YURhdGFFbnRyeS5nZXRWYWx1ZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeVRvQ3JlYXRlTmV3VGFyZ2V0KGJhc2UsIHByb3BlcnR5LCBpc0xhc3RQcm9wZXJ0eSksDQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZiAobWV0YURhdGFFbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQmVhblZhbGlkYXRpb24uTGlzdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZvciAoQmVhblZhbGlkYXRpb24gY3VycmVudEJlYW5WYWxpZGF0aW9uIDogKChCZWFuVmFsaWRhdGlvbi5MaXN0KSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkpLnZhbHVlKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRyeVRvUHJvY2Vzc01ldGFEYXRhKGN1cnJlbnRCZWFuVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5VG9DcmVhdGVOZXdUYXJnZXQoYmFzZSwgcHJvcGVydHksIGlzTGFzdFByb3BlcnR5KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgdHJ5VG9DcmVhdGVOZXdUYXJnZXQoT2JqZWN0IGJhc2UsIFN0cmluZyBwcm9wZXJ0eSwgYm9vbGVhbiBpc0xhc3RQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgaWYoaXNMYXN0UHJvcGVydHkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGJhc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBPYmplY3QgcmVzdWx0ID0gZ2V0VmFsdWVPZlByb3BlcnR5KGJhc2UsIHByb3BlcnR5KTsNCi0NCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYmFzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0VmFsdWVPZlByb3BlcnR5KE9iamVjdCBiYXNlLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHByb3BlcnR5ID0gcHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSwgcHJvcGVydHkubGVuZ3RoKCkpOw0KLQ0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKGJhc2UuZ2V0Q2xhc3MoKSk7DQotDQotICAgICAgICBNZXRob2QgdGFyZ2V0TWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHRhcmdldENsYXNzLCAiZ2V0IiArIHByb3BlcnR5KTsNCi0NCi0gICAgICAgIGlmICh0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0YXJnZXRNZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodGFyZ2V0Q2xhc3MsICJpcyIgKyBwcm9wZXJ0eSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodGFyZ2V0TWV0aG9kID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICJjbGFzcyAiICsgdGFyZ2V0Q2xhc3MgKyAiIGhhcyBubyBwdWJsaWMgZ2V0L2lzICIgKyBwcm9wZXJ0eS50b0xvd2VyQ2FzZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoYmFzZSwgdGFyZ2V0TWV0aG9kKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ZvdW5kR3JvdXBzKEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRWaWV3SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsaWVudElkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICAvKg0KLSAgICAgICAgICogYWRkIGZvdW5kIGdyb3VwcyB0byBjb250ZXh0DQotICAgICAgICAgKi8NCi0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEdyb3VwQ2xhc3MgOiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuYWRkR3JvdXAoY3VycmVudEdyb3VwQ2xhc3MsIGN1cnJlbnRWaWV3SWQsIGNsaWVudElkKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1Jlc3RyaWN0ZWRHcm91cHMoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50Vmlld0lkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsaWVudElkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIGFkZCByZXN0cmljdGVkIGdyb3Vwcw0KLSAgICAgICAgICovDQotICAgICAgICBmb3IgKENsYXNzIGN1cnJlbnRHcm91cENsYXNzIDogcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQucmVzdHJpY3RHcm91cChjdXJyZW50R3JvdXBDbGFzcywgY3VycmVudFZpZXdJZCwgY2xpZW50SWQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TW9kZWxWYWxpZGF0aW9uKEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IGNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICAvKg0KLSAgICAgICAgICogYWRkIG1vZGVsIHZhbGlkYXRpb24gZW50cnkgbGlzdA0KLSAgICAgICAgICovDQotICAgICAgICBmb3IgKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5IDogbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvciAoQ2xhc3MgcmVzdHJpY3RlZEdyb3VwIDogcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LnJlbW92ZUdyb3VwKHJlc3RyaWN0ZWRHcm91cCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRHcm91cHMoKS5sZW5ndGggPiAwKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYgKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldFZhbGlkYXRpb25UYXJnZXRzKCkuaXNFbXB0eSgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5hZGRWYWxpZGF0aW9uVGFyZ2V0KHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LnNldENvbXBvbmVudChjb21wb25lbnQpOw0KLSAgICAgICAgICAgICAgICBleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkobW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAidGVzdCBwcm94eSBzdXBwb3J0IikNCi0gICAgcHJpdmF0ZSB2b2lkIHRyYW5zZmVyR3JvdXBWYWxpZGF0aW9uSW5mb3JtYXRpb25Ub0ZvdW5kR3JvdXBzKA0KLSAgICAgICAgICAgIE9iamVjdCBvYmplY3RUb0luc3BlY3QsDQotICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChvYmplY3RUb0luc3BlY3QuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KEJlYW5WYWxpZGF0aW9uLmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb1Byb2Nlc3NNZXRhRGF0YShvYmplY3RUb0luc3BlY3QuZ2V0Q2xhc3MoKS5nZXRBbm5vdGF0aW9uKEJlYW5WYWxpZGF0aW9uLmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgIG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKG9iamVjdFRvSW5zcGVjdC5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoQmVhblZhbGlkYXRpb24uTGlzdC5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yIChCZWFuVmFsaWRhdGlvbiBjdXJyZW50QmVhblZhbGlkYXRpb24gOg0KLSAgICAgICAgICAgICAgICAgICAgKG9iamVjdFRvSW5zcGVjdC5nZXRDbGFzcygpLmdldEFubm90YXRpb24oQmVhblZhbGlkYXRpb24uTGlzdC5jbGFzcykpLnZhbHVlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnlUb1Byb2Nlc3NNZXRhRGF0YShjdXJyZW50QmVhblZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VG9JbnNwZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzSW50ZXJmYWNlcyhDbGFzcyBjdXJyZW50Q2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBmb3IgKENsYXNzIGN1cnJlbnRJbnRlcmZhY2UgOiBjdXJyZW50Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyYW5zZmVyR3JvdXBWYWxpZGF0aW9uSW5mb3JtYXRpb25Ub0ZvdW5kR3JvdXBzKG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgICAgIHByb2Nlc3NJbnRlcmZhY2VzKGN1cnJlbnRJbnRlcmZhY2UsIG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1Byb2Nlc3NNZXRhRGF0YShCZWFuVmFsaWRhdGlvbiBiZWFuVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIGZvciAoU3RyaW5nIGN1cnJlbnRWaWV3SWQgOiBiZWFuVmFsaWRhdGlvbi52aWV3SWRzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHVzZU1ldGFEYXRhRm9yVmlld0lkKGJlYW5WYWxpZGF0aW9uLCBjdXJyZW50Vmlld0lkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NNZXRhRGF0YShiZWFuVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZU1ldGFEYXRhRm9yVmlld0lkKEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uLCBTdHJpbmcgY3VycmVudFZpZXdJZCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChjdXJyZW50Vmlld0lkLmVxdWFscyhGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRWaWV3SWQoKSkgfHwNCi0gICAgICAgICAgICAgICAgY3VycmVudFZpZXdJZC5lcXVhbHMoIioiKSkgJiYgaXNWYWxpZGF0aW9uUGVybWl0dGVkKGJlYW5WYWxpZGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01ldGFEYXRhKEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKHByb2Nlc3NNb2RlbFZhbGlkYXRpb24gJiYgaXNNb2RlbFZhbGlkYXRpb24oYmVhblZhbGlkYXRpb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KA0KLSAgICAgICAgICAgICAgICAgICAgYmVhblZhbGlkYXRpb24sIG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LCByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKCFpc01vZGVsVmFsaWRhdGlvbihiZWFuVmFsaWRhdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc0dyb3VwcygNCi0gICAgICAgICAgICAgICAgICAgIGJlYW5WYWxpZGF0aW9uLCBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRhdGlvblBlcm1pdHRlZChCZWFuVmFsaWRhdGlvbiBiZWFuVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgRUxIZWxwZXIgZWxIZWxwZXIgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY29uZGl0aW9uIDogYmVhblZhbGlkYXRpb24uY29uZGl0aW9ucygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbEhlbHBlci5pc0VMVGVybVdlbGxGb3JtZWQoY29uZGl0aW9uKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgZWxIZWxwZXIuaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIGNvbmRpdGlvbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhlbEhlbHBlci5nZXRWYWx1ZU9mRXhwcmVzc2lvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKGNvbmRpdGlvbikpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYgKHRoaXMubG9nZ2VyLmlzRXJyb3JFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCJhbiBpbnZhbGlkIGNvbmRpdGlvbiBpcyB1c2VkOiAiICsgY29uZGl0aW9uKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNNb2RlbFZhbGlkYXRpb24oQmVhblZhbGlkYXRpb24gYmVhblZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBiZWFuVmFsaWRhdGlvbi5tb2RlbFZhbGlkYXRpb24oKS5pc0FjdGl2ZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRNb2RlbFZhbGlkYXRpb25FbnRyeShCZWFuVmFsaWRhdGlvbiBiZWFuVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5ID0gbmV3IE1vZGVsVmFsaWRhdGlvbkVudHJ5KCk7DQotDQotICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5zZXRHcm91cHMoQXJyYXlzLmFzTGlzdChiZWFuVmFsaWRhdGlvbi51c2VHcm91cHMoKSkpOw0KLSAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuc2V0RGlzcGxheU1lc3NhZ2VJbmxpbmUoYmVhblZhbGlkYXRpb24ubW9kZWxWYWxpZGF0aW9uKCkuZGlzcGxheUlubGluZSgpKTsNCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LnNldEN1c3RvbU1lc3NhZ2UoYmVhblZhbGlkYXRpb24ubW9kZWxWYWxpZGF0aW9uKCkubWVzc2FnZSgpKTsNCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LnNldE1ldGFEYXRhU291cmNlT2JqZWN0KG1ldGFEYXRhU291cmNlT2JqZWN0KTsNCi0NCi0gICAgICAgIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0Ow0KLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvblRhcmdldEV4cHJlc3Npb24gOiBiZWFuVmFsaWRhdGlvbi5tb2RlbFZhbGlkYXRpb24oKS52YWxpZGF0aW9uVGFyZ2V0cygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChNb2RlbFZhbGlkYXRpb24uREVGQVVMVC5lcXVhbHModmFsaWRhdGlvblRhcmdldEV4cHJlc3Npb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQgPSB0cnlUb1Jlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RXhwcmVzc2lvbih2YWxpZGF0aW9uVGFyZ2V0RXhwcmVzc2lvbik7DQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25UYXJnZXQgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmFkZFZhbGlkYXRpb25UYXJnZXQodmFsaWRhdGlvblRhcmdldCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGJlYW5WYWxpZGF0aW9uLnJlc3RyaWN0R3JvdXBzKCkubGVuZ3RoID4gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLmFkZEFsbChBcnJheXMuYXNMaXN0KGJlYW5WYWxpZGF0aW9uLnJlc3RyaWN0R3JvdXBzKCkpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRWYWxpZGF0aW9uVGFyZ2V0cygpLmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5hZGRWYWxpZGF0aW9uVGFyZ2V0KG1ldGFEYXRhU291cmNlT2JqZWN0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdC5hZGQobW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IHRyeVRvUmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFeHByZXNzaW9uKFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0RXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsaWRhdGlvblRhcmdldEV4cHJlc3Npb24pOw0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldFZhbHVlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NHcm91cHMoQmVhblZhbGlkYXRpb24gYmVhblZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChiZWFuVmFsaWRhdGlvbi51c2VHcm91cHMoKSkpOw0KLQ0KLSAgICAgICAgaWYgKGJlYW5WYWxpZGF0aW9uLnJlc3RyaWN0R3JvdXBzKCkubGVuZ3RoID4gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLmFkZEFsbChBcnJheXMuYXNMaXN0KGJlYW5WYWxpZGF0aW9uLnJlc3RyaWN0R3JvdXBzKCkpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBTdHJpbmcgY3JlYXRlTGFiZWxlZE1lc3NhZ2UoU3RyaW5nIHZpb2xhdGlvbk1lc3NhZ2UsIGJvb2xlYW4gaXNEZXRhaWxNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5sYWJlbGVkTWVzc2FnZUludGVybmFscy5jcmVhdGVMYWJlbGVkTWVzc2FnZSh2aW9sYXRpb25NZXNzYWdlLCBpc0RldGFpbE1lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBjYWxjU2V2ZXJpdHkoQ29uc3RyYWludFZpb2xhdGlvbjw/PiB2aW9sYXRpb24pDQotICAgIHsNCi0gICAgICAgIGZvciAoQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+IHBheWxvYWQgOiB2aW9sYXRpb24uZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKS5nZXRQYXlsb2FkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzKS5pc0Fzc2lnbmFibGVGcm9tKHBheWxvYWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmIChFeHRWYWxVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihWaW9sYXRpb25TZXZlcml0eS5JbmZvLmNsYXNzKS5pc0Fzc2lnbmFibGVGcm9tKHBheWxvYWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9JTkZPOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmIChFeHRWYWxVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihWaW9sYXRpb25TZXZlcml0eS5GYXRhbC5jbGFzcykuaXNBc3NpZ25hYmxlRnJvbShwYXlsb2FkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUjsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIHByb2Nlc3NGYWNlc01lc3NhZ2UoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlciA9IG5ldyBGYWNlc01lc3NhZ2VIb2xkZXIoZmFjZXNNZXNzYWdlKTsNCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZUhvbGRlci5zZXRDbGllbnRJZCh1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpKTsNCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZUhvbGRlckxpc3QuYWRkKGZhY2VzTWVzc2FnZUhvbGRlcik7DQotICAgIH0NCi0NCi0gICAgYm9vbGVhbiBleGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgIG51bGwsDQotICAgICAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBib29sZWFuIGlzTWVzc2FnZVRleHRVbmNoYW5nZWQoDQotICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwgU3RyaW5nIHZpb2xhdGlvblN1bW1hcnlNZXNzYWdlLCBTdHJpbmcgdmlvbGF0aW9uRGV0YWlsTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZpb2xhdGlvblN1bW1hcnlNZXNzYWdlLmVxdWFscyh2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U3VtbWFyeSgpKSAmJg0KLSAgICAgICAgICAgICAgICB2aW9sYXRpb25EZXRhaWxNZXNzYWdlLmVxdWFscyh2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0RGV0YWlsKCkpOw0KLSAgICB9DQotDQotICAgIFZhbGlkYXRvckV4Y2VwdGlvbiBjcmVhdGVWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgU3RyaW5nIHZpb2xhdGlvblN1bW1hcnlNZXNzYWdlLCBTdHJpbmcgdmlvbGF0aW9uRGV0YWlsTWVzc2FnZSwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKHNldmVyaXR5LCB2aW9sYXRpb25TdW1tYXJ5TWVzc2FnZSwgdmlvbGF0aW9uRGV0YWlsTWVzc2FnZSkpOw0KLSAgICB9DQotDQotICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBnZXRGYWNlc01lc3NhZ2VMaXN0V2l0aExvd1NldmVyaXR5KA0KLSAgICAgICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiB2aW9sYXRpb25NZXNzYWdlcykNCi0gICAgew0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPigpOw0KLQ0KLSAgICAgICAgZm9yIChGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyIDogdmlvbGF0aW9uTWVzc2FnZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOLmVxdWFscyhmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKSkgfHwNCi0gICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9JTkZPLmVxdWFscyhmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGZhY2VzTWVzc2FnZUhvbGRlcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZ2V0RmFjZXNNZXNzYWdlTGlzdFdpdGhIaWdoU2V2ZXJpdHkoDQotICAgICAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0KQ0KLSAgICB7DQotICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+KCk7DQotDQotICAgICAgICBmb3IgKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIgOiB2aW9sYXRpb25NZXNzYWdlSG9sZGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLmVxdWFscyhmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKSkgfHwNCi0gICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9GQVRBTC5lcXVhbHMoZmFjZXNNZXNzYWdlSG9sZGVyLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChmYWNlc01lc3NhZ2VIb2xkZXIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgdm9pZCBhZGRNZXNzYWdlcyhMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdFdpdGhMb3dTZXZlcml0eSkNCi0gICAgew0KLSAgICAgICAgZm9yIChGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyIDogZmFjZXNNZXNzYWdlSG9sZGVyTGlzdFdpdGhMb3dTZXZlcml0eSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb0FkZFZpb2xhdGlvbk1lc3NhZ2VGb3JDb21wb25lbnRJZCgNCi0gICAgICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZUhvbGRlci5nZXRDbGllbnRJZCgpLCBmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0RmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9MYWJlbGVkTWVzc2FnZUludGVybmFscy5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC91dGlsL0xhYmVsZWRNZXNzYWdlSW50ZXJuYWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MGI3ODMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC91dGlsL0xhYmVsZWRNZXNzYWdlSW50ZXJuYWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIExhYmVsZWRNZXNzYWdlSW50ZXJuYWxzDQotew0KLSAgICAvL3RoZXJlIGlzIG5vIGNvbmN1cnJlbmN5IGlzc3VlIGhlcmUgLSBpdCBhbHdheXMgbGVhZHMgdG8gdGhlIHNhbWUgcmVzdWx0DQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRlZmF1bHRTdW1tYXJ5TWVzc2FnZVRlbXBsYXRlID0gInsxfTogezB9IjsNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVmYXVsdERldGFpbE1lc3NhZ2VUZW1wbGF0ZSA9ICJ7MX06IHswfSI7DQotICAgIHByaXZhdGUgU3RyaW5nIHN1bW1hcnlNZXNzYWdlVGVtcGxhdGUgPSBkZWZhdWx0U3VtbWFyeU1lc3NhZ2VUZW1wbGF0ZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGV0YWlsTWVzc2FnZVRlbXBsYXRlID0gZGVmYXVsdERldGFpbE1lc3NhZ2VUZW1wbGF0ZTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX1ZBTElEQVRPUl9CRUFOVkFMSURBVE9SX01FU1NBR0UgPQ0KLSAgICAgICAgICAgICJqYXZheC5mYWNlcy52YWxpZGF0b3IuQmVhblZhbGlkYXRvci5NRVNTQUdFIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX1ZBTElEQVRPUl9CRUFOVkFMSURBVE9SX01FU1NBR0VfREVUQUlMID0NCi0gICAgICAgICAgICAiamF2YXguZmFjZXMudmFsaWRhdG9yLkJlYW5WYWxpZGF0b3IuTUVTU0FHRV9kZXRhaWwiOw0KLQ0KLSAgICBTdHJpbmcgY3JlYXRlTGFiZWxlZE1lc3NhZ2UoU3RyaW5nIHZpb2xhdGlvbk1lc3NhZ2UsIGJvb2xlYW4gaXNEZXRhaWxNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBpZihpc0RldGFpbE1lc3NhZ2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRyeVRvUmVzb2x2ZURldGFpbE1lc3NhZ2UodmlvbGF0aW9uTWVzc2FnZSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRyeVRvUmVzb2x2ZVN1bW1hcnlNZXNzYWdlKHZpb2xhdGlvbk1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvUmVzb2x2ZVN1bW1hcnlNZXNzYWdlKFN0cmluZyB2aW9sYXRpb25NZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBpZihzdW1tYXJ5TWVzc2FnZVRlbXBsYXRlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdFN1bW1hcnlNZXNzYWdlVGVtcGxhdGUucmVwbGFjZSgiezB9IiwgdmlvbGF0aW9uTWVzc2FnZSk7DQotICAgICAgICB9DQotDQotICAgICAgICB0aGlzLnN1bW1hcnlNZXNzYWdlVGVtcGxhdGUgPSBsb2FkU3RhbmRhcmRNZXNzYWdlVGVtcGxhdGUoZmFsc2UpOw0KLQ0KLSAgICAgICAgaWYoc3VtbWFyeU1lc3NhZ2VUZW1wbGF0ZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVMYWJlbGVkTWVzc2FnZSh2aW9sYXRpb25NZXNzYWdlLCBmYWxzZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3VtbWFyeU1lc3NhZ2VUZW1wbGF0ZS5yZXBsYWNlKCJ7MH0iLCB2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb1Jlc29sdmVEZXRhaWxNZXNzYWdlKFN0cmluZyB2aW9sYXRpb25NZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBpZihkZXRhaWxNZXNzYWdlVGVtcGxhdGUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0RGV0YWlsTWVzc2FnZVRlbXBsYXRlLnJlcGxhY2UoInswfSIsIHZpb2xhdGlvbk1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGhpcy5kZXRhaWxNZXNzYWdlVGVtcGxhdGUgPSBsb2FkU3RhbmRhcmRNZXNzYWdlVGVtcGxhdGUodHJ1ZSk7DQotDQotICAgICAgICBpZihkZXRhaWxNZXNzYWdlVGVtcGxhdGUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlTGFiZWxlZE1lc3NhZ2UodmlvbGF0aW9uTWVzc2FnZSwgdHJ1ZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZGV0YWlsTWVzc2FnZVRlbXBsYXRlLnJlcGxhY2UoInswfSIsIHZpb2xhdGlvbk1lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGxvYWRTdGFuZGFyZE1lc3NhZ2VUZW1wbGF0ZShib29sZWFuIGlzRGV0YWlsTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoaXNEZXRhaWxNZXNzYWdlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEpzZlV0aWxzLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEpBVkFYX0ZBQ0VTX1ZBTElEQVRPUl9CRUFOVkFMSURBVE9SX01FU1NBR0VfREVUQUlMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEpzZlV0aWxzLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEpBVkFYX0ZBQ0VTX1ZBTElEQVRPUl9CRUFOVkFMSURBVE9SX01FU1NBR0UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRjMjg5NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuQmVhblZhbGlkYXRpb25Nb2R1bGVLZXk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLkV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuTW9kZWxWYWxpZGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWwuQmVhblZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5GYWNlc01lc3NhZ2VIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5NZXNzYWdlSW50ZXJwb2xhdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBhdGg7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInJlZmFjdG9yIGltcGxlbWVudGF0aW9uIGRldGFpbHMiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzQ4MjIzMzg5MzE4NjcwODg3OEw7DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBwaGFzZUV2ZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJqc3IzMDMgc3RhcnQgbW9kZWwgdmFsaWRhdGlvbiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWFwPE9iamVjdCwgTGlzdDxDbGFzcz4+IHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBMaXN0PENsYXNzPj4oKTsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PigpOw0KLQ0KLSAgICAgICAgZm9yIChNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSA6IGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXNUb1ZhbGlkYXRlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbihtb2RlbFZhbGlkYXRpb25FbnRyeSwgcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMsIHJlc3VsdHMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvblJlc3VsdHMocmVzdWx0cyk7DQotDQotICAgICAgICBleGVjdXRlR2xvYmFsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzRm9yKHJlc3VsdHMpOw0KLQ0KLSAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgianNyMzAzIHZhbGlkYXRpb24gZmluaXNoZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXNUb1ZhbGlkYXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8T2JqZWN0LCBMaXN0PENsYXNzPj4gcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cykNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbjsNCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4+IHZpb2xhdGlvbnM7DQotICAgICAgICBDbGFzc1tdIGdyb3Vwc1RvVmFsaWRhdGU7DQotDQotICAgICAgICBmb3IgKE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0IDogbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0VmFsaWRhdGlvblRhcmdldHMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uID0gY3JlYXRlUHJvcGVydHlJbmZvcm1hdGlvbihtb2RlbFZhbGlkYXRpb25FbnRyeSwgdmFsaWRhdGlvblRhcmdldCk7DQotDQotICAgICAgICAgICAgaWYgKCFleGVjdXRlR2xvYmFsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCksIHZhbGlkYXRpb25UYXJnZXQsIHByb3BlcnR5SW5mb3JtYXRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmlzRGlzcGxheU1lc3NhZ2VJbmxpbmUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGdyb3Vwc1RvVmFsaWRhdGUgPSBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRHcm91cHMoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy9pZiB2aW9sYXRpb24gc2hvdWxkIGRpc3BsYXllZCBpbmxpbmUgdmFsaWRhdGlvbiBoYXMgdG8gdGFrZSBwbGFjZSB3aXRoIGFsbCBncm91cHMNCi0gICAgICAgICAgICAvL3doaWNoIG1lYW5zOiBnbG9iYWwgbWVzc2FnZXMgLT4gZmlsdGVyIGdyb3VwcyBhbHJlYWR5IHVzZWQgZm9yIHRoZSB2YWxpZGF0aW9uIHRhcmdldA0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGdyb3Vwc1RvVmFsaWRhdGUgPSBmaWx0ZXJHcm91cHNUb1ZhbGlkYXRlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0LCBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKCFzaG91bGRDb250aW51ZVZhbGlkYXRpb24obW9kZWxWYWxpZGF0aW9uRW50cnksIGdyb3Vwc1RvVmFsaWRhdGUpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGFkZFByb2Nlc3NlZFRhcmdldCh2YWxpZGF0aW9uVGFyZ2V0LCBncm91cHNUb1ZhbGlkYXRlLCBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cyk7DQotICAgICAgICAgICAgdmlvbGF0aW9ucyA9IHZhbGlkYXRlVGFyZ2V0KHZhbGlkYXRpb25UYXJnZXQsIGdyb3Vwc1RvVmFsaWRhdGUpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25zICE9IG51bGwgJiYgIXZpb2xhdGlvbnMuaXNFbXB0eSgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1Zpb2xhdGlvbnMoZmFjZXNDb250ZXh0LCBtb2RlbFZhbGlkYXRpb25FbnRyeSwgdmFsaWRhdGlvblRhcmdldCwgdmlvbGF0aW9ucywgcmVzdWx0cyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3NbXSBmaWx0ZXJHcm91cHNUb1ZhbGlkYXRlKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPE9iamVjdCwgTGlzdDxDbGFzcz4+IHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzKQ0KLSAgICB7DQotICAgICAgICBpZighcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMuY29udGFpbnNLZXkodmFsaWRhdGlvblRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldEdyb3VwcygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxDbGFzcz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IHZhbGlkYXRlZEdyb3VwcyA9IHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzLmdldCh2YWxpZGF0aW9uVGFyZ2V0KTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBncm91cCA6IG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldEdyb3VwcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCF2YWxpZGF0ZWRHcm91cHMuY29udGFpbnMoZ3JvdXApKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChncm91cCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBDbGFzc1tyZXN1bHQuc2l6ZSgpXSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZENvbnRpbnVlVmFsaWRhdGlvbihNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwgQ2xhc3NbXSBncm91cHNUb1ZhbGlkYXRlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIShncm91cHNUb1ZhbGlkYXRlID09IG51bGwgfHwgZ3JvdXBzVG9WYWxpZGF0ZS5sZW5ndGggPT0gMCkgfHwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuaXNEaXNwbGF5TWVzc2FnZUlubGluZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRQcm9jZXNzZWRUYXJnZXQoT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NbXSBncm91cHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPE9iamVjdCwgTGlzdDxDbGFzcz4+IHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzKQ0KLSAgICB7DQotICAgICAgICBpZighcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMuY29udGFpbnNLZXkodmFsaWRhdGlvblRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMucHV0KHZhbGlkYXRpb25UYXJnZXQsIG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxDbGFzcz4gdmFsaWRhdGVkR3JvdXBzID0gcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMuZ2V0KHZhbGlkYXRpb25UYXJnZXQpOw0KLQ0KLSAgICAgICAgZm9yKENsYXNzIGdyb3VwIDogZ3JvdXBzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCF2YWxpZGF0ZWRHcm91cHMuY29udGFpbnMoZ3JvdXApKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVkR3JvdXBzLmFkZChncm91cCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgUHJvcGVydHlJbmZvcm1hdGlvbiBjcmVhdGVQcm9wZXJ0eUluZm9ybWF0aW9uKA0KLSAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBPYmplY3QgdmFsaWRhdGlvblRhcmdldCkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uOw0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlsczsNCi0gICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsNCi0gICAgICAgIGlmIChtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzID0gbmV3IFByb3BlcnR5RGV0YWlscyhudWxsLCB2YWxpZGF0aW9uVGFyZ2V0LCBudWxsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uc2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBleGVjdXRlR2xvYmFsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmV4ZWN1dGVHbG9iYWxCZWZvcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uLCBCZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIEV4dFZhbFV0aWxzLmV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIHByb3BlcnR5SW5mb3JtYXRpb24sIEJlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4+IHZhbGlkYXRlVGFyZ2V0KE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LCBDbGFzc1tdIGdyb3VwcykNCi0gICAgew0KLSAgICAgICAgaWYoZ3JvdXBzID09IG51bGwgfHwgZ3JvdXBzLmxlbmd0aCA9PSAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVmFsaWRhdG9yRmFjdG9yeSB2YWxpZGF0b3JGYWN0b3J5ID0gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZhbGlkYXRvckZhY3RvcnkoKTsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5DQotICAgICAgICAgICAgICAgIC51c2luZ0NvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAubWVzc2FnZUludGVycG9sYXRvcihFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpKQ0KLSAgICAgICAgICAgICAgICAuY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkodmFsaWRhdG9yRmFjdG9yeS5nZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpKQ0KLSAgICAgICAgICAgICAgICAudHJhdmVyc2FibGVSZXNvbHZlcih2YWxpZGF0b3JGYWN0b3J5LmdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKSkNCi0gICAgICAgICAgICAgICAgLmdldFZhbGlkYXRvcigpDQotICAgICAgICAgICAgICAgIC52YWxpZGF0ZSh2YWxpZGF0aW9uVGFyZ2V0LCBncm91cHMpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzVmlvbGF0aW9ucyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4+IHZpb2xhdGlvbnMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMpDQotICAgIHsNCi0gICAgICAgIC8vanNmIDIuMCBpcyBhYmxlIHRvIGRpc3BsYXkgbXVsdGlwbGUgbWVzc2FnZXMgcGVyIGNvbXBvbmVudCAtIHNvIHByb2Nlc3MgYWxsIHZpb2xhdGlvbnMNCi0gICAgICAgIC8vanNmIDwgMi4wIHdpbGwganVzdCB1c2UgdGhlIGZpcnN0IG9uZSAoZm9yIGlubGluZSBtZXNzYWdlcyAtIHNvIGl0J3Mgb25seSBhIGxpdHRsZSBvdmVyaGVhZCkNCi0gICAgICAgIEl0ZXJhdG9yPENvbnN0cmFpbnRWaW9sYXRpb248T2JqZWN0Pj4gdmlvbGF0aW9uc0l0ZXJhdG9yID0gdmlvbGF0aW9ucy5pdGVyYXRvcigpOw0KLSAgICAgICAgQ29uc3RyYWludFZpb2xhdGlvbjxPYmplY3Q+IGNvbnN0cmFpbnRWaW9sYXRpb247DQotICAgICAgICBNb2RlbFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0Ow0KLSAgICAgICAgd2hpbGUgKHZpb2xhdGlvbnNJdGVyYXRvci5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9DcmVhdGVNb2RlbFZhbGlkYXRpb25SZXN1bHQoZmFjZXNDb250ZXh0LCBtb2RlbFZhbGlkYXRpb25FbnRyeSwgcmVzdWx0cyk7DQotDQotICAgICAgICAgICAgcmVzdWx0ID0gcmVzb2x2ZU1vZGVsVmFsaWRhdGlvblJlc3VsdChmYWNlc0NvbnRleHQsIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCByZXN1bHRzKTsNCi0NCi0gICAgICAgICAgICBjb25zdHJhaW50VmlvbGF0aW9uID0gdmlvbGF0aW9uc0l0ZXJhdG9yLm5leHQoKTsNCi0gICAgICAgICAgICBhZGRWaW9sYXRpb25NZXNzYWdlKG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0LCBjb25zdHJhaW50VmlvbGF0aW9uLCByZXN1bHQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0NyZWF0ZU1vZGVsVmFsaWRhdGlvblJlc3VsdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMpDQotICAgIHsNCi0gICAgICAgIE1vZGVsVmFsaWRhdGlvblJlc3VsdCByZXN1bHQ7DQotICAgICAgICBpZiAoIWlzTW9kZWxWYWxpZGF0aW9uUmVzdWx0QXZhaWxhYmxlRm9yKGZhY2VzQ29udGV4dCwgbW9kZWxWYWxpZGF0aW9uRW50cnksIHJlc3VsdHMpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBNb2RlbFZhbGlkYXRpb25SZXN1bHQoKTsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKS5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpLCByZXN1bHQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTW9kZWxWYWxpZGF0aW9uUmVzdWx0IHJlc29sdmVNb2RlbFZhbGlkYXRpb25SZXN1bHQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByZXN1bHRzLmdldChtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKS5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNNb2RlbFZhbGlkYXRpb25SZXN1bHRBdmFpbGFibGVGb3IoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcmVzdWx0cy5jb250YWluc0tleShtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKS5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkVmlvbGF0aW9uTWVzc2FnZShNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cmFpbnRWaW9sYXRpb248T2JqZWN0PiBjb25zdHJhaW50VmlvbGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBpZiAobW9kZWxWYWxpZGF0aW9uRW50cnkuaXNEaXNwbGF5TWVzc2FnZUlubGluZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRGYWNlc01lc3NhZ2VIb2xkZXIoY3JlYXRlRmFjZXNNZXNzYWdlSG9sZGVyRm9yQ29uc3RyYWludFZpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb24sIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0LCB0cnVlKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmFkZEZhY2VzTWVzc2FnZUhvbGRlcihjcmVhdGVGYWNlc01lc3NhZ2VIb2xkZXJGb3JDb25zdHJhaW50VmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludFZpb2xhdGlvbiwgbW9kZWxWYWxpZGF0aW9uRW50cnksIHZhbGlkYXRpb25UYXJnZXQsIGZhbHNlKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBGYWNlc01lc3NhZ2VIb2xkZXIgY3JlYXRlRmFjZXNNZXNzYWdlSG9sZGVyRm9yQ29uc3RyYWludFZpb2xhdGlvbihmaW5hbCBDb25zdHJhaW50VmlvbGF0aW9uIHZpb2xhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRpc3BsYXlBdENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgZmluYWwgU3RyaW5nIG5ld1Zpb2xhdGlvbk1lc3NhZ2UgPSB0cnlUb0NoYW5nZVZpb2xhdGlvbk1lc3NhZ2UoDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0LCB2aW9sYXRpb24pOw0KLQ0KLSAgICAgICAgQ29uc3RyYWludFZpb2xhdGlvbiBuZXdDb25zdHJhaW50VmlvbGF0aW9uID0gbmV3IENvbnN0cmFpbnRWaW9sYXRpb24oKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByaXZhdGUgQ29uc3RyYWludFZpb2xhdGlvbiB3cmFwcGVkID0gdmlvbGF0aW9uOw0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3VmlvbGF0aW9uTWVzc2FnZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlVGVtcGxhdGUoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0TWVzc2FnZVRlbXBsYXRlKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Um9vdEJlYW4oKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Um9vdEJlYW4oKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIENsYXNzIGdldFJvb3RCZWFuQ2xhc3MoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Um9vdEJlYW5DbGFzcygpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldExlYWZCZWFuKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldExlYWZCZWFuKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBQYXRoIGdldFByb3BlcnR5UGF0aCgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRQcm9wZXJ0eVBhdGgoKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRJbnZhbGlkVmFsdWUoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0SW52YWxpZFZhbHVlKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBDb25zdHJhaW50RGVzY3JpcHRvciBnZXRDb25zdHJhaW50RGVzY3JpcHRvcigpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRDb25zdHJhaW50RGVzY3JpcHRvcigpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH07DQotDQotDQotICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCA9IG51bGw7DQotICAgICAgICBTdHJpbmcgY2xpZW50SWQgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKGRpc3BsYXlBdENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB1aUNvbXBvbmVudCA9IG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpOw0KLSAgICAgICAgICAgIGNsaWVudElkID0gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZUhvbGRlciByZXN1bHQgPSBuZXcgRmFjZXNNZXNzYWdlSG9sZGVyKEJlYW5WYWxpZGF0aW9uVXRpbHMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZUZhY2VzTWVzc2FnZUZvckNvbnN0cmFpbnRWaW9sYXRpb24odWlDb21wb25lbnQsIHZhbGlkYXRpb25UYXJnZXQsIG5ld0NvbnN0cmFpbnRWaW9sYXRpb24pKTsNCi0gICAgICAgIHJlc3VsdC5zZXRDbGllbnRJZChjbGllbnRJZCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvQ2hhbmdlVmlvbGF0aW9uTWVzc2FnZShNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RyYWludFZpb2xhdGlvbiB2aW9sYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmICghaXNEZWZhdWx0TWVzc2FnZShtb2RlbFZhbGlkYXRpb25FbnRyeSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGludGVycG9sYXRlVmFsaWRhdGlvbkVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldEN1c3RvbU1lc3NhZ2UoKSwgdmFsaWRhdGlvblRhcmdldCwgdmlvbGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2aW9sYXRpb24uZ2V0TWVzc2FnZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHRNZXNzYWdlKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gTW9kZWxWYWxpZGF0aW9uLkRFRkFVTFQuZXF1YWxzKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldEN1c3RvbU1lc3NhZ2UoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgaW50ZXJwb2xhdGVWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKFN0cmluZyBleHRWYWxJbmxpbmVNZXNzYWdlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsIGZpbmFsIENvbnN0cmFpbnRWaW9sYXRpb24gdmlvbGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKQ0KLSAgICAgICAgICAgICAgICAuaW50ZXJwb2xhdGUoDQotICAgICAgICAgICAgICAgICAgICAgICAgZXh0VmFsSW5saW5lTWVzc2FnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWVzc2FnZUludGVycG9sYXRvci5Db250ZXh0KCkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDb25zdHJhaW50RGVzY3JpcHRvcjw/PiBnZXRDb25zdHJhaW50RGVzY3JpcHRvcigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2aW9sYXRpb24uZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFZhbGlkYXRlZFZhbHVlKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25UYXJnZXQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGVsVmFsaWRhdGlvblJlc3VsdHMoTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzKQ0KLSAgICB7DQotICAgICAgICBmb3IgKE1vZGVsVmFsaWRhdGlvblJlc3VsdCByZXN1bHQgOiByZXN1bHRzLnZhbHVlcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVXRpbHMucHJvY2Vzc1Zpb2xhdGlvbk1lc3NhZ2VzKHJlc3VsdC5nZXRGYWNlc01lc3NhZ2VIb2xkZXJMaXN0KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBleGVjdXRlR2xvYmFsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzRm9yKE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cykNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFVJQ29tcG9uZW50IGNvbXBvbmVudDsNCi0gICAgICAgIGZvciAoTW9kZWxWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA6IHJlc3VsdHMudmFsdWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yIChGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyIDogcmVzdWx0LmdldEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IG51bGw7DQotICAgICAgICAgICAgICAgIGlmIChmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0Q2xpZW50SWQoKSAhPSBudWxsICYmICFmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0Q2xpZW50SWQoKS5lcXVhbHMoIioiKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50ID0gZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZmluZENvbXBvbmVudChmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycyhmYWNlc0NvbnRleHQsIGNvbXBvbmVudCwgbnVsbCwgbnVsbCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgcGhhc2VFdmVudCkNCi0gICAgew0KLSAgICAgICAgLy9kbyBub3RoaW5nDQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLlVQREFURV9NT0RFTF9WQUxVRVM7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICBpZiAodGhpcyA9PSBvKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIE1vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvblJlc3VsdC5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvblJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2MxOThiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25SZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkZhY2VzTWVzc2FnZUhvbGRlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gInJlZmFjdG9yIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIE1vZGVsVmFsaWRhdGlvblJlc3VsdA0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRGYWNlc01lc3NhZ2VIb2xkZXIoRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5mYWNlc01lc3NhZ2VIb2xkZXJMaXN0LmFkZChmYWNlc01lc3NhZ2VIb2xkZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZ2V0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9tZXNzYWdlL2ludGVycG9sYXRvci9EZWZhdWx0TWVzc2FnZUludGVycG9sYXRvci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0RlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODM5MmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0RlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLm1lc3NhZ2UuaW50ZXJwb2xhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5NZXNzYWdlSW50ZXJwb2xhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvciBpbXBsZW1lbnRzIE1lc3NhZ2VJbnRlcnBvbGF0b3INCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotICAgIA0KLSAgICBwcml2YXRlIE1lc3NhZ2VJbnRlcnBvbGF0b3Igd3JhcHBlZDsNCi0NCi0gICAgcHVibGljIERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yKE1lc3NhZ2VJbnRlcnBvbGF0b3Igd3JhcHBlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGludGVycG9sYXRlKFN0cmluZyBtZXNzYWdlT3JLZXksIENvbnRleHQgY29udGV4dCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGludGVycG9sYXRlKG1lc3NhZ2VPcktleSwgY29udGV4dCwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBpbnRlcnBvbGF0ZShTdHJpbmcgbWVzc2FnZU9yS2V5LCBDb250ZXh0IGNvbnRleHQsIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQuaW50ZXJwb2xhdGUobWVzc2FnZU9yS2V5LCBjb250ZXh0LCBnZXRDdXJyZW50TG9jYWxlKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBMb2NhbGUgZ2V0Q3VycmVudExvY2FsZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vbWVzc2FnZS9pbnRlcnBvbGF0b3IvRXh0VmFsTWVzc2FnZUludGVycG9sYXRvckFkYXB0ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9tZXNzYWdlL2ludGVycG9sYXRvci9FeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmU5ZjMzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9tZXNzYWdlL2ludGVycG9sYXRvci9FeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5tZXNzYWdlLmludGVycG9sYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLk1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uTWVzc2FnZUludGVycG9sYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlciBleHRlbmRzIERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yDQotew0KLSAgICBwcml2YXRlIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXI7DQotDQotICAgIHB1YmxpYyBFeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlcihNZXNzYWdlSW50ZXJwb2xhdG9yIHdyYXBwZWQsIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXIpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKHdyYXBwZWQpOw0KLSAgICAgICAgdGhpcy5tZXNzYWdlUmVzb2x2ZXIgPSBtZXNzYWdlUmVzb2x2ZXI7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgaW50ZXJwb2xhdGUoU3RyaW5nIG1lc3NhZ2VPcktleSwgQ29udGV4dCBjb250ZXh0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZU9yS2V5LCBjb250ZXh0LCBnZXRDdXJyZW50TG9jYWxlKCkpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGludGVycG9sYXRlKFN0cmluZyBtZXNzYWdlT3JLZXksIENvbnRleHQgY29udGV4dCwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5tZXNzYWdlUmVzb2x2ZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihpc0JlYW5WYWxpZGF0aW9uTWVzc2FnZUtleUZvcm1hdChtZXNzYWdlT3JLZXkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld01lc3NhZ2VPcktleSA9IHRoaXMubWVzc2FnZVJlc29sdmVyLmdldE1lc3NhZ2UoZXh0cmFjdEtleShtZXNzYWdlT3JLZXkpLCBnZXRDdXJyZW50TG9jYWxlKCkpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZihpc1ZhbGlkZU1lc3NhZ2UobmV3TWVzc2FnZU9yS2V5KSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU9yS2V5ID0gbmV3TWVzc2FnZU9yS2V5Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJ5b3UgdHJpZWQgdG8gdXNlIGFuIGV4dHZhbCBtZXNzYWdlLXJlc29sdmVyIGZvciIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAianNyMzAzIHZhbGlkYXRpb24gd2l0aCBhbiBpbnZhbGlkIGtleSAtPiB1c2luZyBhIGRlZmF1bHQgaW50ZXJwb2xhdG9yIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3VwZXIuaW50ZXJwb2xhdGUobWVzc2FnZU9yS2V5LCBjb250ZXh0LCBnZXRDdXJyZW50TG9jYWxlKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0JlYW5WYWxpZGF0aW9uTWVzc2FnZUtleUZvcm1hdChTdHJpbmcgbWVzc2FnZU9yS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWVzc2FnZU9yS2V5LnN0YXJ0c1dpdGgoInsiKSAmJiBtZXNzYWdlT3JLZXkuZW5kc1dpdGgoIn0iKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBleHRyYWN0S2V5KFN0cmluZyBtZXNzYWdlT3JLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXNzYWdlT3JLZXkuc3Vic3RyaW5nKDEsIG1lc3NhZ2VPcktleS5sZW5ndGgoKSAtIDEpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkZU1lc3NhZ2UoU3RyaW5nIG5ld01lc3NhZ2VPcktleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICEobmV3TWVzc2FnZU9yS2V5LnN0YXJ0c1dpdGgoQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIpICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3TWVzc2FnZU9yS2V5LmVuZHNXaXRoKEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGRlZWY2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcml2YXRlIENvbnN0cmFpbnREZXNjcmlwdG9yIGNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLSAgICBwcml2YXRlIENsYXNzIGVsZW1lbnRDbGFzczsgLy9wcm9wZXJ0eSB0eXBlDQotDQotICAgIHB1YmxpYyBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3koQ29uc3RyYWludERlc2NyaXB0b3IgY29uc3RyYWludERlc2NyaXB0b3IsIENsYXNzIGVsZW1lbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb25zdHJhaW50RGVzY3JpcHRvciA9IGNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLSAgICAgICAgdGhpcy5lbGVtZW50Q2xhc3MgPSBlbGVtZW50Q2xhc3M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvbnN0cmFpbnREZXNjcmlwdG9yIGdldENvbnN0cmFpbnREZXNjcmlwdG9yKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzcyBnZXRFbGVtZW50Q2xhc3MoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZWxlbWVudENsYXNzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJhaW50RGVzY3JpcHRvci5nZXRBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcG9tLnhtbCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg3ZTM2YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgVmFsaWRhdGlvbi1Nb2R1bGVzPC9uYW1lPgotICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvdmFsaWRhdGlvbi1tb2R1bGVzPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8xXzJfcmMvdmFsaWRhdGlvbi1tb2R1bGVzPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzFfMl9yYy92YWxpZGF0aW9uLW1vZHVsZXM8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxtb2R1bGVzPgotICAgICAgICA8bW9kdWxlPnByb3BlcnR5LXZhbGlkYXRpb248L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5iZWFuLXZhbGlkYXRpb248L21vZHVsZT4KLSAgICA8L21vZHVsZXM+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U0MzkzZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgUHJvcGVydHktVmFsaWRhdGlvbi1Nb2R1bGU8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4xLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4xLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnBlcnNpc3RlbmNlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGVyc2lzdGVuY2UtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICAgICAgPCEtLSBUZXN0IGRlcGVuZGVuY2llcyAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldC5qc3A8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3AtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zaGFsZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNoYWxlLXRlc3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuNDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPgotICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9BYnN0cmFjdCouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL1Rlc3RVdGlscy5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKkJlYW4uamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4gICAgICAgICAgICAKLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MjBjNzUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPCFET0NUWVBFIGZhY2VzLWNvbmZpZyBQVUJMSUMNCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiINCi0gICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxmYWNlcy1jb25maWc+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYxY2Y5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Mzc4NWQ2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50Ci0gICAgICAgIC5BYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlUmVxdWlyZWRBdHRyaWJ1dGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYoKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKSkgfHwKLSAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSkKLSAgICAgICAgICAgICYmCi0gICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGlzQ29tcG9uZW50UmVxdWlyZWQodWlDb21wb25lbnQpKSkKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJgotICAgICAgICAgICAgICAgIUJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Kb2luVmFsaWRhdGlvbk1ldGFEYXRhU3RvcmFnZUZpbHRlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0pvaW5WYWxpZGF0aW9uTWV0YURhdGFTdG9yYWdlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMTIzY2QuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0pvaW5WYWxpZGF0aW9uTWV0YURhdGFTdG9yYWdlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NZXRhRGF0YVN0b3JhZ2VGaWx0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogRVhUVkFMLTU5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKb2luVmFsaWRhdGlvbk1ldGFEYXRhU3RvcmFnZUZpbHRlciBpbXBsZW1lbnRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRJQ19TRVBBUkFUT1IgPSAiOiI7DQotDQotICAgIHB1YmxpYyB2b2lkIGZpbHRlcihQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChwcm9wZXJ0eUluZm9ybWF0aW9uICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgTGlzdDxNZXRhRGF0YUVudHJ5PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE1ldGFEYXRhRW50cnk+KCk7DQotDQotICAgICAgICAgICAgcmVzb2x2ZUpvaW5WYWxpZGF0aW9uTWV0YURhdGEocHJvcGVydHlJbmZvcm1hdGlvbiwgcmVzdWx0KTsNCi0NCi0gICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnJlc2V0TWV0YURhdGFFbnRyaWVzKCk7DQotDQotICAgICAgICAgICAgc2V0RGVmYXVsdFByb3BlcnR5RGV0YWlscyhwcm9wZXJ0eUluZm9ybWF0aW9uLCByZXN1bHQpOw0KLQ0KLSAgICAgICAgICAgIGlmIChjb250YWluc0pvaW5WYWxpZGF0aW9uQ29uc3RyYWludChyZXN1bHQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmlsdGVyKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVzb2x2ZUpvaW5WYWxpZGF0aW9uTWV0YURhdGEoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uLCBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkgOiBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodHJ5VG9UcmFuc2Zvcm1FbnRyeShtZXRhRGF0YUVudHJ5KSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRQcm9wZXJ0eURldGFpbHMoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uLCBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkgOiByZXN1bHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5zZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLA0KLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5nZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTKSk7DQotICAgICAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5hZGRNZXRhRGF0YUVudHJ5KG1ldGFEYXRhRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc0pvaW5WYWxpZGF0aW9uQ29uc3RyYWludChMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogcmVzdWx0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgSm9pblZhbGlkYXRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhRW50cnk+IHRyeVRvVHJhbnNmb3JtRW50cnkoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFbnRyeT4oKTsNCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBKb2luVmFsaWRhdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBKb2luVmFsaWRhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShKb2luVmFsaWRhdGlvbi5jbGFzcyk7DQotDQotICAgICAgICAgICAgcmVwbGFjZU1ldGFEYXRhKGFubm90YXRpb24sIG1ldGFEYXRhRW50cnksIHJlc3VsdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmFkZChtZXRhRGF0YUVudHJ5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VNZXRhRGF0YShKb2luVmFsaWRhdGlvbiBhbm5vdGF0aW9uLCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIExpc3Q8TWV0YURhdGFFbnRyeT4gcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBmb3IgKFN0cmluZyB0YXJnZXQgOiBhbm5vdGF0aW9uLnZhbHVlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9SZXBsYWNlTWV0YURhdGFPZlRhcmdldCh0YXJnZXQsIG1ldGFEYXRhRW50cnksIHJlc3VsdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvUmVwbGFjZU1ldGFEYXRhT2ZUYXJnZXQoU3RyaW5nIHRhcmdldCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGlzU3RhdGljU3ludGF4KHRhcmdldCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNZXRhRGF0YShyZXN1bHQsIGV4dHJhY3RTdGF0aWNNZXRhRGF0YSh0YXJnZXQpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWV0YURhdGEocmVzdWx0LCBleHRyYWN0RHluYW1pY01ldGFEYXRhKG1ldGFEYXRhRW50cnksIHRhcmdldCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgYSBkaWZmZXJlbnQgZmlsdGVyIG1pZ2h0IGludHJvZHVjZSBhIG5ldyBzeW50YXggd2hpY2ggY2F1c2VzIHRoZSBleGNlcHRpb24NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkTWV0YURhdGEoTGlzdDxNZXRhRGF0YUVudHJ5PiByZXN1bHQsIE1ldGFEYXRhRW50cnlbXSBtZXRhRGF0YUVudHJpZXMpDQotICAgIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLmFkZEFsbChyZXN1bHQsIG1ldGFEYXRhRW50cmllcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3RhdGljU3ludGF4KFN0cmluZyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQuY29udGFpbnMoU1RBVElDX1NFUEFSQVRPUik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YUVudHJ5W10gZXh0cmFjdFN0YXRpY01ldGFEYXRhKFN0cmluZyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIGludCBzZXBhcmF0b3JJbmRleCA9IHRhcmdldC5sYXN0SW5kZXhPZihTVEFUSUNfU0VQQVJBVE9SKTsNCi0NCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gbG9hZENsYXNzKHRhcmdldC5zdWJzdHJpbmcoMCwgc2VwYXJhdG9ySW5kZXgpKTsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0YXJnZXQuc3Vic3RyaW5nKHNlcGFyYXRvckluZGV4ICsgMSk7DQotDQotICAgICAgICByZXR1cm4gbmV3IFN0YXRpY1N5bnRheE1ldGFEYXRhRXh0cmFjdG9yKCkuZXh0cmFjdCh0YXJnZXRDbGFzcywgcHJvcGVydHlOYW1lKS5nZXRNZXRhRGF0YUVudHJpZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3NVdGlscy5sb2FkQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YUVudHJ5W10gZXh0cmFjdER5bmFtaWNNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFN0cmluZyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscy5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0KTsNCi0NCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCkpOw0KLSAgICAgICAgcmV0dXJuIG5ldyBTdGF0aWNTeW50YXhNZXRhRGF0YUV4dHJhY3RvcigpLmV4dHJhY3QoDQotICAgICAgICAgICAgICAgIHRhcmdldENsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSkuZ2V0TWV0YURhdGFFbnRyaWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBjbGFzcyBTdGF0aWNTeW50YXhNZXRhRGF0YUV4dHJhY3RvciBleHRlbmRzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgICAgICB7DQotICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKCk7DQotDQotICAgICAgICAgICAgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyh0YXJnZXRDbGFzcywgdGFyZ2V0UHJvcGVydHksIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgICAgIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnModGFyZ2V0Q2xhc3MsIHRhcmdldFByb3BlcnR5LCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopDQotICAgIHsNCi0gICAgICAgIHJldHVybiBvYmogIT0gbnVsbCAmJiBnZXRDbGFzcygpLmVxdWFscyhvYmouZ2V0Q2xhc3MoKSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwY2RlMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0R3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotLyoqDQotICogbmFtZSBtYXBwZXIgZm9yIGdyb3VwIGltcGxlbWVudGF0aW9ucyB2aWEgdmFsaWRhdGlvbiBwYXJhbWV0ZXJzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoVmFsaWRhdGlvblBhcmFtZXRlci5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdEdyb3VwU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI3NDg0My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuVmFsaWRhdGlvbk1vZHVsZUtleTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVmFsaWRhdGlvbk1vZHVsZUtleQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5DQotew0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MDczNDIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VySG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkdyb3VwU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NZXRhRGF0YVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnJlY29yZGVyLkNyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkRlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLm1hcHBlci5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UubWFwcGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yNDc0MzYxNjEyODU3MjIyMjgzTDsNCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIGluaXRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycygpOw0KLSAgICAgICAgaW5pdFN0YXRpY1N0cmF0ZWd5TWFwcGluZ3MoKTsNCi0gICAgICAgIGluaXREZWZhdWx0Q29tcG9uZW50SW5pdGlhbGl6ZXIoKTsNCi0gICAgICAgIGFkZFNraXBWYWxpZGF0aW9uU3VwcG9ydCgpOw0KLSAgICAgICAgaW5pdFN0b3JhZ2VNYW5hZ2VyQW5kTmFtZU1hcHBlcnMoKTsNCi0gICAgICAgIGluaXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcigpOw0KLSAgICAgICAgaW5pdE1ldGFEYXRhU3RvcmFnZUZpbHRlcnMoKTsNCi0gICAgICAgIGluaXRQaGFzZUxpc3RlbmVycygpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKG5ldyBDcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFN0YXRpY1N0cmF0ZWd5TWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcganBhQmFzZWRWYWxpZGF0aW9uID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfSlBBX0JBU0VEX1ZBTElEQVRJT047DQotICAgICAgICBpZiAoanBhQmFzZWRWYWxpZGF0aW9uID09IG51bGwNCi0gICAgICAgICAgICAgICAgfHwgIWpwYUJhc2VkVmFsaWRhdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnID0gbmV3IFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgICAgIHN0YXRpY0NvbmZpZy5zZXRTb3VyY2VPZk1hcHBpbmcoDQotICAgICAgICAgICAgICAgIEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsiLmpwYV9zdHJhdGVneV9tYXBwaW5ncyIpOw0KLQ0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsIHN0YXRpY0NvbmZpZyk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXREZWZhdWx0Q29tcG9uZW50SW5pdGlhbGl6ZXIoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFNraXBWYWxpZGF0aW9uU3VwcG9ydCgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmluZm8oImFkZGluZyBzdXBwb3J0IGZvciBAU2tpcFZhbGlkYXRpb24iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmRlbnlSZW5kZXJlckludGVyY2VwdG9yKFZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcyk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsNCi0NCi0gICAgICAgIFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAvL2l0J3MganVzdCByZXF1aXJlZCB0byBzZXQgdGhlIHRhcmdldA0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTiwgU2tpcFZhbGlkYXRpb25TdXBwb3J0LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuU0tJUF9WQUxJREFUSU9OX1NVUFBPUlRfQ09ORklHLCBjb25maWcpOw0KLQ0KLSAgICAgICAgLy9jb25maWcuYWRkTWFwcGluZyhDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCBSZXF1aXJlZFN0cmF0ZWd5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdG9yYWdlTWFuYWdlckFuZE5hbWVNYXBwZXJzKCkNCi0gICAgew0KLSAgICAgICAgU3RvcmFnZU1hbmFnZXJIb2xkZXIgc3RvcmFnZU1hbmFnZXJIb2xkZXIgPQ0KLSAgICAgICAgICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlksIFN0b3JhZ2VNYW5hZ2VySG9sZGVyLmNsYXNzKSk7DQotDQotICAgICAgICAvL3Byb2Nlc3NlZC1pbmZvcm1hdGlvbg0KLSAgICAgICAgRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIgcHJvY2Vzc2VkSW5mb1N0b3JhZ2VNYW5hZ2VyID0NCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyKCk7DQotICAgICAgICBwcm9jZXNzZWRJbmZvU3RvcmFnZU1hbmFnZXIucmVnaXN0ZXIobmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBzdG9yYWdlTWFuYWdlckhvbGRlci5zZXRTdG9yYWdlTWFuYWdlcihQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MsIHByb2Nlc3NlZEluZm9TdG9yYWdlTWFuYWdlciwgZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9jcm9zcy12YWxpZGF0aW9uDQotICAgICAgICBEZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgPQ0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyKCk7DQotICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5yZWdpc3RlcihuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBzdG9yYWdlTWFuYWdlckhvbGRlci5zZXRTdG9yYWdlTWFuYWdlcihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlciwgZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ncm91cC12YWxpZGF0aW9uIGxpZ2h0DQotICAgICAgICBTdG9yYWdlTWFuYWdlciBzdG9yYWdlTWFuYWdlciA9IHN0b3JhZ2VNYW5hZ2VySG9sZGVyLmdldFN0b3JhZ2VNYW5hZ2VyKEdyb3VwU3RvcmFnZS5jbGFzcyk7DQotDQotICAgICAgICBpZihzdG9yYWdlTWFuYWdlciBpbnN0YW5jZW9mIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAoKEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxTdHJpbmc+KXN0b3JhZ2VNYW5hZ2VyKQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBQcm9wZXJ0eVZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5zZXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcihuZXcgUHJvcGVydHlWYWxpZGF0aW9uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TWV0YURhdGFTdG9yYWdlRmlsdGVycygpDQotICAgIHsNCi0gICAgICAgICBNZXRhRGF0YVN0b3JhZ2UgbWV0YURhdGFTdG9yYWdlID0gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZSgNCi0gICAgICAgICAgICAgICAgIE1ldGFEYXRhU3RvcmFnZS5jbGFzcywgTWV0YURhdGFTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBtZXRhRGF0YVN0b3JhZ2UucmVnaXN0ZXJGaWx0ZXIobmV3IEpvaW5WYWxpZGF0aW9uTWV0YURhdGFTdG9yYWdlRmlsdGVyKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0UGhhc2VMaXN0ZW5lcnMoKQ0KLSAgICB7DQotICAgICAgICBKc2ZVdGlscy5yZWdpc3RlclBoYXNlTGlzdGVuZXIobmV3IENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGM0NTI2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci0KLS8qKgotICogdGhlIHNraXAgdmFsaWRhdGlvbiBzdXBwb3J0IHdhcyByZWZhY3RvcmVkIHRvIGFuIGluZGVwZW5kZW50IG1lY2hhbmlzbQotICogc2VlIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJjaGFuZ2UgdGhlIGFkZC1vbnMiICsKLSAgICAgICAgIm9sZCBuYW1lOiBWYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0IikKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0TW9kdWxlS2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvblNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ0NWJmNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm9wZXJ0eVZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFByb3BlcnR5VmFsaWRhdGlvblNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIGltcGxlbWVudHMgU2tpcFZhbGlkYXRpb25FdmFsdWF0b3INCi17DQotICAgIHB1YmxpYyBib29sZWFuIHNraXBWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7DQotICAgICAgICANCi0gICAgICAgIGlmKEpzZlV0aWxzLmlzUmVuZGVyUmVzcG9uc2VQaGFzZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9ICFpc0NsaWVudFNpZGVWYWxpZGF0aW9uRW5hYmxlZChtZXRhRGF0YUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQgfHwgUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZGF0aW9uU2tpcHBlZChmYWNlc0NvbnRleHQsIHZhbGlkYXRpb25TdHJhdGVneSwgbWV0YURhdGFFbnRyeSk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xpZW50U2lkZVZhbGlkYXRpb25FbmFibGVkKE1ldGFEYXRhRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBrZXlzVG9EaXNhYmxlID0gZW50cnkuZ2V0UHJvcGVydHkoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25NZXRhRGF0YUtleXMuRElTQUJMRV9DTElFTlRfU0lERV9WQUxJREFUSU9OLCBMaXN0LmNsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiBrZXlzVG9EaXNhYmxlID09IG51bGwgfHwgIWtleXNUb0Rpc2FibGUuY29udGFpbnMoZW50cnkuZ2V0S2V5KCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZWViMjguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFybid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJkb2N1bWVudGF0aW9uIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fTUVTU0FHRVNfSlBBID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMiKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9KUEFfQkFTRURfVkFMSURBVElPTiIpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0RvdWJsZVJhbmdlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0RvdWJsZVJhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzN2MzYzUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIERvdWJsZVJhbmdlDQotew0KLSAgICBkb3VibGUgbWluaW11bSgpIGRlZmF1bHQgRG91YmxlLk1JTl9WQUxVRTsNCi0NCi0gICAgZG91YmxlIG1heGltdW0oKSBkZWZhdWx0IERvdWJsZS5NQVhfVkFMVUU7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjOWE4OTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Kb2luVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgSm9pblZhbGlkYXRpb24NCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTGVuZ3RoLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xlbmd0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmZjZjBmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTGVuZ3RoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgTGVuZ3RoDQotew0KLSAgICBpbnQgbWluaW11bSgpIGRlZmF1bHQgMDsNCi0NCi0gICAgaW50IG1heGltdW0oKSBkZWZhdWx0IEludGVnZXIuTUFYX1ZBTFVFOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Mb25nUmFuZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ODE4ZmMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Mb25nUmFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBMb25nUmFuZ2UNCi17DQotICAgIGxvbmcgbWluaW11bSgpIGRlZmF1bHQgTG9uZy5NSU5fVkFMVUU7DQotDQotICAgIGxvbmcgbWF4aW11bSgpIGRlZmF1bHQgTG9uZy5NQVhfVkFMVUU7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1BhdHRlcm4uamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDRiZThhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFBhdHRlcm4NCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJub19tYXRjaCI7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExY2UxMjguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFJlcXVpcmVkDQotew0KLSAgICAvKioNCi0gICAgICogdG8gY3VzdG9taXplIHRoZSBlcnJvciBtZXNzYWdlIG9yDQotICAgICAqIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGpzZiByZXF1aXJlZCBtZXNzYWdlIHdpdGggdGhlIHVzYWdlIG9mIHRoZSBtZXNzYWdlIHJlc29sdmVyIG1lY2hhbmlzbQ0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIGFuIG9wdGlvbmFsIGVycm9yIG1lc3NhZ2Uga2V5DQotICAgICAqLw0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZmllbGRfcmVxdWlyZWQiOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGQxZTBjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFNraXBWYWxpZGF0aW9uDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZSgpOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCB7fTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNmE0NzIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRhcmdldChUWVBFKQotQFJldGVudGlvbihSVU5USU1FKQotQERvY3VtZW50ZWQKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIEBpbnRlcmZhY2UgU2tpcFZhbGlkYXRpb25TdXBwb3J0Ci17Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1ZhbGlkYXRvci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdjOTkwMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFZhbGlkYXRvcg0KLXsNCi0gICAgQ2xhc3M8PyBleHRlbmRzIGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I+W10gdmFsdWUoKTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEwZWViYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ARGVwcmVjYXRlZAotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yIGV4dGVuZHMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yCi17Ci0gICAgcHJpdmF0ZSBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBnZXRJbnN0YW5jZSgpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvckZvcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvcigpLCBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkKLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsKLQotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBQcm9wZXJ0eURldGFpbHMpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG9iamVjdC5nZXRDbGFzcygpICsgIiBpcyBub3QgYSAiICsgUHJvcGVydHlEZXRhaWxzLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gKFByb3BlcnR5RGV0YWlscylvYmplY3Q7Ci0KLSAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKSk7Ci0KLSAgICAgICAgLy9UT0RPIHRlc3Qgd2l0aCBjb21wbGV4IGNvbXBvbmVudHMKLSAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5zZXRJbmZvcm1hdGlvbigKLSAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIHByb3BlcnR5RGV0YWlscyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZmluZCBhbmQgYWRkIGFubm90YXRpb25zCi0gICAgICAgICAqLwotICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTgwMTIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPVRoZSByZXF1aXJlZCBmb3JtYXRlIGlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YWI1NDMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPVx1MDYyN1x1MDY0NFx1MDYzNVx1MDY0YVx1MDYzYVx1MDYyOSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2MjZcdTA2MjkNCi1ub19tYXRjaF9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjM1XHUwNjRhXHUwNjNhXHUwNjI5IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzN1x1MDY0NFx1MDY0OFx1MDYyOFx1MDYyOSBcdTA2NDdcdTA2NDk6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcyBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThkNjQ5MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW5vX21hdGNoPUZvcm1hdCBpbnZcdTAwZTBsaWQKLW5vX21hdGNoX2RldGFpbD1FbCBmb3JtYXQgcmVxdWVyaXQgXHUwMGU5czogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWU3MDFiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1Vbmf8bHRpZ2VzIEZvcm1hdA0KLW5vX21hdGNoX2RldGFpbD1EYXMgZXJmb3JkZXJsaWNoZSBGb3JtYXQgaXN0OiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTgwMTIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPVRoZSByZXF1aXJlZCBmb3JtYXRlIGlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYjEwNzcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXRvIGludlx1MDBlMWxpZG8gCi1ub19tYXRjaF9kZXRhaWw9RWwgZm9ybWF0byByZXF1ZXJpZG8gZXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcyBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwYTIyMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9TGUgZm9ybWF0IGVzdCBpbnZhbGlkZQ0KLW5vX21hdGNoX2RldGFpbD1MZSBmb3JtYXQgZG9pdCAmZWNpcmM7dHJlIGRlIGxhIGZvcm1lOiB7MH0NCi0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxODc0OGMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXRvIG5vbiB2YWxpZG8KLW5vX21hdGNoX2RldGFpbD1JbCBmb3JtYXRvIHJpY2hpZXN0byAmZWdyYXZlOzogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTRiYzc0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1HZVx1MDBlN2Vyc2l6IGJpXHUwMGU3aW0NCi1ub19tYXRjaF9kZXRhaWw9Z2VyZWtlbiBiaVx1MDBlN2ltOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWU5NjdhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgICAgIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZU5hbWUgPSBudWxsOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VOYW1lID0gc3VwZXIuZ2V0QmFzZU5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBiYXNlTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9KcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk0ZWNlMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIHRoZSBqcGEgc3VwcG9ydCBpcyBhbiBleGNlcHRpb24gaW4gdmlldyBvZiBzb21lIG1lY2hhbmlzbXMgLSBzbyB0aGVyZSdzIG5vIGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZS4NCi0gKiBpbnN0ZWFkIG9mIHRoZSBjb252ZW50aW9uIHRoZXJlIGlzIGEgZ2xvYmFsIHByb3BlcnR5IHRvIGhhdmUgYW4gYWx0ZXJuYXRpdmUgdG8gd2ViLnhtbCBjb25maWd1cmF0aW9uDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTID0gIkpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTIjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX05BTUUgPSBXZWJYbWxQYXJhbWV0ZXIuVkFMSURBVElPTl9NRVNTQUdFU19KUEE7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX05BTUUgPSBKcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MNCi0gICAgICAgICAgICAuZ2V0UGFja2FnZSgpLmdldE5hbWUoKS5yZXBsYWNlKCIubWVzc2FnZS5yZXNvbHZlciIsICIubWVzc2FnZS5idW5kbGUiKSsgIi5qcGFfbWVzc2FnZXMiOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYoQ1VTVE9NX0JBU0VfTkFNRSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBDVVNUT01fQkFTRV9OQU1FOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQkFTRV9OQU1FOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0Fic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0Fic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1Y2Q0NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9BYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGlmIChpc0Jsb2NraW5nTWV0YURhdGEobWV0YURhdGEpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1NZXRhRGF0YShtZXRhRGF0YSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhKTsNCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNCbG9ja2luZ01ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIHRlc3RNZXNzYWdlID0gbmV3IEZhY2VzTWVzc2FnZSgpOw0KLSAgICAgICAgdGVzdE1lc3NhZ2Uuc2V0U2V2ZXJpdHkoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSA9IHRyeVRvVHJhbnNmb3JtVmlvbGF0aW9uU2V2ZXJpdHkobWV0YURhdGFFbnRyeSk7DQotDQotICAgICAgICBpZihzZXZlcml0eSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRlc3RNZXNzYWdlLnNldFNldmVyaXR5KHNldmVyaXR5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5zZXZlcml0eUJsb2Nrc1N1Ym1pdEZvckNvbXBvbmVudElkKG51bGwsIHRlc3RNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEZhY2VzTWVzc2FnZS5TZXZlcml0eSB0cnlUb1RyYW5zZm9ybVZpb2xhdGlvblNldmVyaXR5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2UuU2V2ZXJpdHk+IHJlc3VsdCA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKQ0KLSAgICAgICAgICAgICAgICAuZXh0cmFjdChtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihWaW9sYXRpb25TZXZlcml0eS5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5LmNsYXNzKTsNCi0NCi0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiAhcmVzdWx0LmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Lml0ZXJhdG9yKCkubmV4dCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Eb3VibGVSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlOWU0ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Eb3VibGVSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkRvdWJsZVJhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uUGFyYW1ldGVyQXdhcmVUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIERvdWJsZVJhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKERvdWJsZVJhbmdlLmNsYXNzKTsNCi0NCi0gICAgICAgIGRvdWJsZSBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW5pbXVtKCk7DQotDQotICAgICAgICBpZihtaW5pbXVtICE9IERvdWJsZS5NSU5fVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTiwgbWluaW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxULCBtaW5pbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGRvdWJsZSBtYXhpbXVtID0gYW5ub3RhdGlvbi5tYXhpbXVtKCk7DQotDQotICAgICAgICBpZihtYXhpbXVtICE9IERvdWJsZS5NQVhfVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCwgbWF4aW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWF9ERUZBVUxULCBtYXhpbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pvaW5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjM1MzI0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pvaW5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uZXh0cmFjdG9yLkRlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJvcGVydHlWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLUBEZXByZWNhdGVkDQotcHVibGljIGNsYXNzIEpvaW5NZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnQobWV0YURhdGFFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybigidGhpcyBjbGFzcyBpcyByZXBsYWNlZCBieSBhIG1ldGEtZGF0YSBzdG9yYWdlIGZpbHRlci4gIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgImlmIGl0IGdldHMgaW52b2tlZCBhbmQgYW4gZXhjZXB0aW9uIG9jY3VycywgYSBjdXN0b20gc3ludGF4IGlzIHVzZWQuIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgY2xhc3MgbWlnaHQgYmUgdXNlZCBieSBhbiBvbGQgYWRkLW9uLiBwbGVhc2UgY2hlY2sgZm9yIGEgbmV3ZXIgdmVyc2lvbi4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnQoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBleHRyYWN0b3IgPSBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmdldEluc3RhbmNlKCk7DQotDQotICAgICAgICBTdHJpbmdbXSB0YXJnZXRFeHByZXNzaW9ucyA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoSm9pblZhbGlkYXRpb24uY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdGFyZ2V0RXhwcmVzc2lvbiA6IHRhcmdldEV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogZXh0cmFjdG9yLmV4dHJhY3QoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscykuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSA9PSBudWxsIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZGF0aW9uU2tpcHBlZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3ksIGVudHJ5KSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IEV4dFZhbFV0aWxzLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoIShlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQW5ub3RhdGlvbiAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXh0cmFjdChlbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXRlcmF0b3IoKS5oYXNOZXh0KCkpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0QWxsKG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZTEwMTEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQmFzaWM7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpwYU1ldGFEYXRhVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiaW1wbC4gdGhlIHJlc3QiKQ0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmKGFubm90YXRpb24gaW5zdGFuY2VvZiBDb2x1bW4pDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoKCEoKENvbHVtbikgYW5ub3RhdGlvbikubnVsbGFibGUoKSkgJiYgRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RILCAoKENvbHVtbikgYW5ub3RhdGlvbikubGVuZ3RoKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihhbm5vdGF0aW9uIGluc3RhbmNlb2YgQmFzaWMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoISgoQmFzaWMpIGFubm90YXRpb24pLm9wdGlvbmFsKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIElkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotICAgICAgICAvL1RPRE8gaW1wbC4gdGhlIHJlc3QhISENCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM5MWY5YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9MZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXINCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBMZW5ndGggYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTGVuZ3RoLmNsYXNzKTsNCi0NCi0gICAgICAgIGludCBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW5pbXVtKCk7DQotDQotICAgICAgICBpZihtaW5pbXVtICE9IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEgsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIX0RFRkFVTFQsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW50IG1heGltdW0gPSBhbm5vdGF0aW9uLm1heGltdW0oKTsNCi0gICAgICAgIGlmKG1heGltdW0gIT0gSW50ZWdlci5NQVhfVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIX0RFRkFVTFQsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGEzMzJiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxvbmdSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTG9uZ1JhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKExvbmdSYW5nZS5jbGFzcyk7DQotDQotICAgICAgICBsb25nIG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gIT0gTG9uZy5NSU5fVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTiwgbWluaW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxULCBtaW5pbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGxvbmcgbWF4aW11bSA9IGFubm90YXRpb24ubWF4aW11bSgpOw0KLQ0KLSAgICAgICAgaWYobWF4aW11bSAhPSBMb25nLk1BWF9WQUxVRSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYLCBtYXhpbXVtKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1BhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMGJlNjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQYXR0ZXJuTWV0YURhdGFUcmFuc2Zvcm1lciAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgUGF0dGVybiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShQYXR0ZXJuLmNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4sIChhbm5vdGF0aW9uKS52YWx1ZSgpKTsNCi0NCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkgPSAoYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgICAgICBMb2NhbGUgY3VycmVudExvY2FsZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpOw0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSA9DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7DQotDQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnID0gRXh0VmFsVXRpbHMuZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAuZ2V0TWVzc2FnZSh2YWxpZGF0aW9uRXJyb3JNc2dLZXksIGN1cnJlbnRMb2NhbGUpOw0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFLCB2YWxpZGF0aW9uRXJyb3JNc2cpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9SZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJiZWNjOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9SZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uUGFyYW1ldGVyQXdhcmVUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NraXBNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ta2lwTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGM2NGFiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NraXBNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFNraXBNZXRhRGF0YVRyYW5zZm9ybWVyICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXINCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCB0cnVlKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1ZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1ZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQwNWFiMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lciAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgVmFsaWRhdG9yIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFZhbGlkYXRvci5jbGFzcyk7DQotDQotICAgICAgICBDbGFzc1tdIHZhbGlkYXRvcnMgPSBhbm5vdGF0aW9uLnZhbHVlKCk7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBjdXJyZW50Q2xhc3MgOiB2YWxpZGF0b3JzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRDbGFzcy5nZXRTaW1wbGVOYW1lKCkudG9Mb3dlckNhc2UoKS5jb250YWlucyhDb21tb25NZXRhRGF0YUtleXMuRU1BSUwpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsdWUuYWRkKENvbW1vbk1ldGFEYXRhS2V5cy5FTUFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZhbHVlLmFkZChjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00sIHZhbHVlKTsNCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3NTkzMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkRvdWJsZVJhbmdlVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEb3VibGVSYW5nZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIERvdWJsZVJhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKERvdWJsZVJhbmdlLmNsYXNzKTsNCi0gICAgICAgIERvdWJsZVJhbmdlVmFsaWRhdG9yIGRvdWJsZVJhbmdlVmFsaWRhdG9yID0gKERvdWJsZVJhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5Eb3VibGVSYW5nZSIpOw0KLQ0KLSAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSm9pblZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSm9pblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGRhMWFjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Kb2luVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5leHRyYWN0b3IuRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWNlc0V4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLUBEZXByZWNhdGVkDQotcHVibGljIGNsYXNzIEpvaW5WYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZUpvaW5WYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRmFjZXNFeGNlcHRpb24gdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyB0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oInRoaXMgY2xhc3MgaXMgcmVwbGFjZWQgYnkgYSBtZXRhLWRhdGEgc3RvcmFnZSBmaWx0ZXIuICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJpZiBpdCBnZXRzIGludm9rZWQgYW5kIGFuIGV4Y2VwdGlvbiBvY2N1cnMsIGEgY3VzdG9tIHN5bnRheCBpcyB1c2VkLiIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIGNsYXNzIG1pZ2h0IGJlIHVzZWQgYnkgYW4gb2xkIGFkZC1vbi4gcGxlYXNlIGNoZWNrIGZvciBhIG5ld2VyIHZlcnNpb24uIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUpvaW5WYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIGV4dHJhY3RvciA9IERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuZ2V0SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIFN0cmluZ1tdIHRhcmdldEV4cHJlc3Npb25zID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShKb2luVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdGFyZ2V0RXhwcmVzc2lvbiA6IHRhcmdldEV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogZXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCBwcm9wZXJ0eURldGFpbHMpLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLnByb2Nlc3NNZXRhRGF0YUVudHJ5QWZ0ZXJTa2lwVmFsaWRhdGlvbihQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKSwgZW50cnkpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyB2YWxpZGF0aW9uIHN0cmF0ZWd5IGZvdW5kIGZvciAiICsgZW50cnkuZ2V0VmFsdWUoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSnBhVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0MWE5My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLmV4Y2VwdGlvbi5SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQmFzaWM7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZTsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpwYVZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUZhY2VzQnVuZGxlID0gZmFsc2U7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFURV9MRU5HVEggPSAibGVuZ3RoIjsNCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmlvbGF0aW9uOw0KLSAgICBwcml2YXRlIGludCBtYXhMZW5ndGg7DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKTsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgQ29sdW1uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlQ29sdW1uQW5ub3RhdGlvbigoQ29sdW1uKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIEJhc2ljKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlQmFzaWNBbm5vdGF0aW9uKChCYXNpYykgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBJZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgT25lVG9PbmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVPbmVUb09uZUFubm90YXRpb24oKE9uZVRvT25lKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE1hbnlUb09uZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZU1hbnlUb09uZUFubm90YXRpb24oKE1hbnlUb09uZSkgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVDb2x1bW5Bbm5vdGF0aW9uKENvbHVtbiBjb2x1bW4sIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKCFjb2x1bW4ubnVsbGFibGUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCBpbnN0YW5jZW9mIFN0cmluZw0KLSAgICAgICAgICAgICAgICAmJiBjb2x1bW4ubGVuZ3RoKCkgPCAoKFN0cmluZykgY29udmVydGVkT2JqZWN0KS5sZW5ndGgoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbiA9IFZBTElEQVRFX0xFTkdUSDsNCi0gICAgICAgICAgICB0aGlzLm1heExlbmd0aCA9IGNvbHVtbi5sZW5ndGgoKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWVzc2FnZShudWxsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQmFzaWNBbm5vdGF0aW9uKEJhc2ljIGJhc2ljLCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICghYmFzaWMub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlT25lVG9PbmVBbm5vdGF0aW9uKE9uZVRvT25lIG9uZVRvT25lLCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIW9uZVRvT25lLm9wdGlvbmFsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU1hbnlUb09uZUFubm90YXRpb24oTWFueVRvT25lIG1hbnlUb09uZSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFtYW55VG9PbmUub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCB8fCAoIiIuZXF1YWxzKGNvbnZlcnRlZE9iamVjdCkgJiYgRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb24gPSBDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQ7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWVzc2FnZShudWxsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoVkFMSURBVEVfTEVOR1RILmVxdWFscyh0aGlzLnZpb2xhdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJmaWVsZF90b29fbG9uZyI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJmaWVsZF9yZXF1aXJlZCI7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHN1cGVyLmdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgIGlmIChWQUxJREFURV9MRU5HVEguZXF1YWxzKHRoaXMudmlvbGF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLCAiIiArIHRoaXMubWF4TGVuZ3RoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc3VwZXIucmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0gICAgICAgIFN0cmluZyBtYXJrZXIgPSBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5NSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0NCi0gICAgICAgIGlmKChtYXJrZXIgKyBrZXkgKyBtYXJrZXIpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudXNlRmFjZXNCdW5kbGUgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IGUuZ2V0RmFjZXNNZXNzYWdlKCk7DQotDQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKFZBTElEQVRFX0xFTkdUSC5lcXVhbHModGhpcy52aW9sYXRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0TWF4aW11bU1lc3NhZ2UoZmFjZXNNZXNzYWdlLCB0aGlzLm1heExlbmd0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTGVuZ3RoU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkMDU1OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMZW5ndGhTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBMZW5ndGggYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTGVuZ3RoLmNsYXNzKTsNCi0gICAgICAgIExlbmd0aFZhbGlkYXRvciBsZW5ndGhWYWxpZGF0b3IgPSAoTGVuZ3RoVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5MZW5ndGgiKTsNCi0NCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzU4MjAyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Mb25nUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5Mb25nUmFuZ2VWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExvbmdSYW5nZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIExvbmdSYW5nZSBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMb25nUmFuZ2UuY2xhc3MpOw0KLSAgICAgICAgTG9uZ1JhbmdlVmFsaWRhdG9yIGxvbmdSYW5nZVZhbGlkYXRvciA9IChMb25nUmFuZ2VWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigiamF2YXguZmFjZXMuTG9uZ1JhbmdlIik7DQotDQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bShhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9QYXR0ZXJuU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTNmNGVmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUGF0dGVyblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5PFBhdHRlcm4+DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBQYXR0ZXJuIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFBhdHRlcm4uY2xhc3MpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZXhwcmVzc2lvbiA6IGFubm90YXRpb24udmFsdWUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIWphdmEudXRpbC5yZWdleC5QYXR0ZXJuLmNvbXBpbGUoZXhwcmVzc2lvbikubWF0Y2hlcihjb252ZXJ0ZWRPYmplY3QudG9TdHJpbmcoKSkubWF0Y2hlcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihuZXcgRmFjZXNNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24pLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKS5yZXBsYWNlKCJ7MH0iLCBleHByZXNzaW9uKSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShQYXR0ZXJuIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5ZTRjNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZXF1aXJlZFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uZXhjZXB0aW9uLlJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLk51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBOdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBFbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZFN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5PFJlcXVpcmVkPg0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUZhY2VzQnVuZGxlID0gZmFsc2U7DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCB8fCBjb252ZXJ0ZWRPYmplY3QuZXF1YWxzKCIiKSB8fA0KLSAgICAgICAgICAgICAgICAoY29udmVydGVkT2JqZWN0IGluc3RhbmNlb2YgQ29sbGVjdGlvbiAmJiAoKENvbGxlY3Rpb24pY29udmVydGVkT2JqZWN0KS5pc0VtcHR5KCkpIHx8DQotICAgICAgICAgICAgICAgIChjb252ZXJ0ZWRPYmplY3QgaW5zdGFuY2VvZiBNYXAgJiYgKChNYXApY29udmVydGVkT2JqZWN0KS5pc0VtcHR5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgIGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWVzc2FnZShtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFJlcXVpcmVkLmNsYXNzKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KFJlcXVpcmVkIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShlLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZWE5M2QuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvU2tpcFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ci1ARW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ci1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFNraXBWYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBWYWxpZGF0aW9uU3RyYXRlZ3kKLXsKLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmdbXSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9ucyA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoU2tpcFZhbGlkYXRpb24uY2xhc3MpLnZhbHVlKCk7Ci0KLSAgICAgICAgZm9yKFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uIDogdmFsdWVCaW5kaW5nRXhwcmVzc2lvbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRWYWx1ZU9mRXhwcmVzc2lvbigKLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5zZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5TS0lQX1ZBTElEQVRJT04sIHRydWUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiM2NjOTEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLQ0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I+W10gdmFsaWRhdG9yQ2xhc3NlcyA9DQotICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShWYWxpZGF0b3IuY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yIHZhbGlkYXRvcjsNCi0gICAgICAgIGZvciAoQ2xhc3MgdmFsaWRhdG9yQ2xhc3NOYW1lIDogdmFsaWRhdG9yQ2xhc3NlcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0b3IgPSAoamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcikgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzcyh2YWxpZGF0b3JDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UodmFsaWRhdG9yQ2xhc3NOYW1lLmdldE5hbWUoKSArICIgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjZhYzYwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5LkFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWNlc0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogVGhpcyBwaGFzZSBsaXN0ZW5lciBwcm9jZXNzZXMgY3Jvc3MgdmFsaWRhdGlvbiBhcyBzb29uIGFzIGl0IGZpbmRzIGEgc3BlY2lhbCByZXF1ZXN0IHNjb3BlZCBzdG9yYWdlLjxici8+DQotICogU28gaXQncyBwb3NzaWJsZSB0byBhZGQgaW5mb3JtYXRpb24gZHVyaW5nIHRoZSBwcm9jZXNzIHZhbGlkYXRpb24gcGhhc2UuIEF0IHRoZSBlbmQgb2YgdGhpcyBwaGFzZSBpdCBnZXRzIHByb2Nlc3NlZC4NCi0gKiBBZnRlciB0aGF0IHRoZSBzdG9yYWdlIGdldHMgcmVzZXRlZC48cC8+DQotICogSWYgeW91IHByb3ZpZGUgYSBjdXN0b20gZXh0ZW5zaW9uIGFuZCB5b3UgYWRkIHRoZSBzYW1lIHN0b3JhZ2UgdHlwZSB3aXRoaW4gYSBkaWZmZXJlbnQgcGhhc2UsDQotICogaXQgYWxzbyBnZXRzIHByb2Nlc3NlZCBhdCB0aGUgZW5kIG9mIHRoYXQgcGhhc2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTUzMzM0MDU4OTc2MzU3NDI3MzJMOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSA9IENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKTsNCi0gICAgICAgICAgICBmb3IgKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA6IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UuZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZighRXh0VmFsVXRpbHMuZXhlY3V0ZUdsb2JhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0Q29tcG9uZW50KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuY2xhc3MuZ2V0TmFtZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIC8vY2FsbCBpbml0LW1ldGhvZA0KLSAgICAgICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkgaW5zdGFuY2VvZiBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLmdldENsYXNzKCkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5pdENyb3NzVmFsaWRhdGlvbiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAgICAgICAgICogdmFsaWRhdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICovDQotICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5wcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKGVudHJ5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhZGRNZXNzYWdlID0gdHJ1ZTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpIGluc3RhbmNlb2YgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1lc3NhZ2UgPSAoQm9vbGVhbilSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5nZXRDbGFzcygpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuY2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0Q2xhc3MoKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmKGFkZE1lc3NhZ2UpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjZXNNZXNzYWdlICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudElkKGVudHJ5LmdldENsaWVudElkKCksIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvQmxvY2tzTmF2aWdhdGlvbkZvckNvbXBvbmVudElkKGVudHJ5LmdldENsaWVudElkKCksIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZmluYWxseQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5leGVjdXRlR2xvYmFsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldENvbXBvbmVudCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmNsYXNzLmdldE5hbWUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBmaW5hbGx5DQotICAgICAgICB7DQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMucmVzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc0luaXRpYWxpemVkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04gIT0gbnVsbA0KLSAgICAgICAgICAgICAgICAgICAgJiYgV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEpzZlV0aWxzLmRlcmVnaXN0ZXJQaGFzZUxpc3RlbmVyKHRoaXMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpc0luaXRpYWxpemVkID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLkFOWV9QSEFTRTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICBpZiAodGhpcyA9PSBvKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjdmODliLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFybid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0NST1NTVkFMSURBVElPTiIpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXMuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzgwNjQwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgRGF0ZUlzDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZU9mKCk7DQotDQotICAgIC8qDQotICAgICAqIG9wdGlvbmFsIHNlY3Rpb24NCi0gICAgICovDQotDQotICAgIERhdGVJc1R5cGUgdHlwZSgpIGRlZmF1bHQgRGF0ZUlzVHlwZS5zYW1lOw0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiIjsNCi0NCi0gICAgU3RyaW5nIG5vdEJlZm9yZUVycm9yTXNnS2V5KCkgZGVmYXVsdCAid3JvbmdfZGF0ZV9ub3RfYmVmb3JlIjsNCi0NCi0gICAgU3RyaW5nIG5vdEFmdGVyRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJ3cm9uZ19kYXRlX25vdF9hZnRlciI7DQotDQotICAgIFN0cmluZyBub3RFcXVhbEVycm9yTXNnS2V5KCkgZGVmYXVsdCAid3JvbmdfZGF0ZV9ub3RfZXF1YWwiOw0KLQ0KLSAgICBpbnQgZXJyb3JNZXNzYWdlRGF0ZVN0eWxlKCkgZGVmYXVsdCBEYXRlRm9ybWF0Lk1FRElVTTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJc1R5cGUuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJc1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1ZjQ4Mi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJiZWZvcmVPclNhbWUsIGFmdGVyT3JTYW1lIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgZW51bSBEYXRlSXNUeXBlDQotew0KLSAgICBiZWZvcmUsIGFmdGVyLCBzYW1lDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0VxdWFscy5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwM2Q1NDEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIEVxdWFscw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZCI7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9Ob3RFcXVhbHMuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL05vdEVxdWFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODM4ZjE1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL05vdEVxdWFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBOb3RFcXVhbHMNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJkdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkIjsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJlN2ZhNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFJlcXVpcmVkSWYNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlT2YoKTsNCi0NCi0gICAgLyoNCi0gICAgICogb3B0aW9uYWwgc2VjdGlvbg0KLSAgICAgKi8NCi0NCi0gICAgUmVxdWlyZWRJZlR5cGUgaXMoKSBkZWZhdWx0IFJlcXVpcmVkSWZUeXBlLm5vdF9lbXB0eTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImVtcHR5X2ZpZWxkIjsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWZUeXBlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTBhYzkwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWZUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBlbnVtIFJlcXVpcmVkSWZUeXBlDQotew0KLSAgICBlbXB0eSwgbm90X2VtcHR5DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjYwNzU5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUlucHV0IGlzIGRpZmZlcmVudA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9SW5wdXQgaXMgZGlmZmVyZW50DQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi0NCi13cm9uZ19kYXRlPVdyb25nIGRhdGUNCi13cm9uZ19kYXRlX2RldGFpbD1Xcm9uZyBkYXRlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZmOTNjNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1cdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgXHUwNjQ1XHUwNjJlXHUwNjJhXHUwNjQ0XHUwNjQxDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgXHUwNjQ1XHUwNjJlXHUwNjJhXHUwNjQ0XHUwNjQxDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1cdTA2M2FcdTA2NGFcdTA2MzEgXHUwNjQ1XHUwNjMzXHUwNjQ1XHUwNjQ4XHUwNjJkIFx1MDYyOFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDYgXHUwNjQxXHUwNjMzIFx1MDY0Mlx1MDY0YVx1MDY0NVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1cdTA2M2FcdTA2NGFcdTA2MzEgXHUwNjQ1XHUwNjMzXHUwNjQ1XHUwNjQ4XHUwNjJkIFx1MDYyOFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCAgXHUwNjQ2XHUwNjQxXHUwNjMzIFx1MDY0Mlx1MDY0YVx1MDY0NVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQNCi0NCi13cm9uZ19kYXRlPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2NDlcdTA2MjENCi13cm9uZ19kYXRlX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjJlXHUwNjI3XHUwNjM3XHUwNjQ5XHUwNjIxDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0M1x1MDY0OCBcdTA2NDYgXHUwNjI4XHUwNjM5XHUwNjJmIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzIFx1MDY0OFx1MDY0NiBcdTA2MjhcdTA2MzlcdTA2MmYgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzXHUwNjQ4IFx1MDY0NiBcdTA2NDJcdTA2MjhcdTA2NDQgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0MyBcdTA2NDhcdTA2NDYgXHUwNjQyXHUwNjI4XHUwNjQ0IHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NDRcdTA2MjcgXHUwNjRhXHUwNjMzXHUwNjI3XHUwNjQ4XHUwNjQ5IHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjQ0XHUwNjI3IFx1MDY0YVx1MDYzM1x1MDYyN1x1MDY0OFx1MDY0OSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1NGVkMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9ZWwgdmFsb3IgXHUwMGU5IGRpZmVyZW50Ci1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPWVsIHZhbG9yIFx1MDBlOSBkaWZlcmVudAotCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPW5vIGVzIHBlcm1ldCBlbCBtYXRlaXggdmFsb3IKLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPW5vIGVzIHBlcm1ldCBlbCBtYXRlaXggdmFsb3IKLQotd3JvbmdfZGF0ZT1kYXRhIGVyclx1MDBmMm5pYQotd3JvbmdfZGF0ZV9kZXRhaWw9ZGF0YSBlcnJcdTAwZjJuaWEKLQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1sYSBkYXRhIGhhIGRlIHNlciBwb3N0ZXJpb3IgYSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9bGEgZGF0YSBoYSBkZSBzZXIgYW50ZXJpb3IgYSB7MH0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1sYSBkYXRhIGhhIGRlIHNlciBwb3N0ZXJpb3IgYSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9bGEgZGF0YSBubyBcdTAwMGU5cyBpZ3VhbCBhIHswfQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPWxhIGRhdGEgbm8gXHUwMDBlOXMgaWd1YWwgYSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4NzIzNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1FaW5nYWJlIGlzdCB1bnRlcnNjaGllZGxpY2gNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUVpbmdhYmUgaXN0IHVudGVyc2NoaWVkbGljaA0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9RGVyIGdsZWljaGUgV2VydCBpc3QgbmljaHQgZXJsYXVidA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPURlciBnbGVpY2hlIFdlcnQgaXN0IG5pY2h0IGVybGF1YnQNCi0NCi13cm9uZ19kYXRlPURhdHVtIGlua29ycmVrdA0KLXdyb25nX2RhdGVfZGV0YWlsPURhdHVtIGlua29ycmVrdA0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1EYXMgRGF0dW0gbXVzcyBuYWNoIGRlbSB7MH0gc2Vpbg0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9RGFzIERhdHVtIG11c3MgbmFjaCBkZW0gezB9IHNlaW4NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1EYXMgRGF0dW0gbXVzcyB2b3IgZGVtIHswfSBzZWluDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPURhcyBEYXR1bSBtdXNzIHZvciBkZW0gezB9IHNlaW4NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1EYXMgRGF0dW0gZW50c3ByaWNodCBuaWNodCBkZW0gezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPURhcyBEYXR1bSBlbnRzcHJpY2h0IG5pY2h0IGRlbSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2MDc1OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1JbnB1dCBpcyBkaWZmZXJlbnQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUlucHV0IGlzIGRpZmZlcmVudA0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotDQotd3JvbmdfZGF0ZT1Xcm9uZyBkYXRlDQotd3JvbmdfZGF0ZV9kZXRhaWw9V3JvbmcgZGF0ZQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcyBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMzg1MjQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPWxhIGVudHJhZGEgZXMgZGlmZXJlbnRlCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPWxhIGVudHJhZGEgZXMgZGlmZXJlbnRlCi0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9bm8gc2UgcGVybWl0ZW4gZW50cmFkYXMgaWd1YWxlcwotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9bm8gc2UgcGVybWl0ZW4gZW50cmFkYXMgaWd1YWxlcwotCi13cm9uZ19kYXRlPWZlY2hhIGVxdWl2b2NhZGEKLXdyb25nX2RhdGVfZGV0YWlsPWZlY2hhIGVxdWl2b2NhZGEKLQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgbHVlZ28gZGUgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgbHVlZ28gZGUgezB9Ci0KLXdyb25nX2RhdGVfbm90X2FmdGVyPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgYW50ZXMgZGUgezB9Ci13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBhbnRlcyBkZSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9bGEgZmVjaGEgbm8gZXMgaWd1YWwgYSB7MH0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1sYSBmZWNoYSBubyBlcyBpZ3VhbCBhIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWYwMjE4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUxlcyBjaGFtcHMgc29udCBkaWZmJmVhY3V0ZTtyZW50cw0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9TGVzIGNoYW1wcyBzb250IGRpZmYmZWFjdXRlO3JlbnRzDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1MZXMgY2hhbXBzIGRvaXZlbnQgJmVjaXJjO3RyZSBkaWZmJmVhY3V0ZTtyZW50cw0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPUxlcyBjaGFtcHMgZG9pdmVudCAmZWNpcmM7dHJlIGRpZmYmZWFjdXRlO3JlbnRzDQotDQotd3JvbmdfZGF0ZT1MYSBkYXRlIGVzdCBpbmNvcnJlY3RlDQotd3JvbmdfZGF0ZV9kZXRhaWw9TGEgZGF0ZSBlc3QgaW5jb3JyZWN0ZQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhcHImZWdyYXZlO3MgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhcHImZWdyYXZlO3MgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXZhbnQgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGF2YW50IHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPUxhIGRhdGUgbidlc3QgcGFzICZlYWN1dGU7Z2FsZSAmYWdyYXZlOyB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9TGEgZGF0ZSBuJ2VzdCBwYXMgJmVhY3V0ZTtnYWxlICZhZ3JhdmU7IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDQyODAxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1WYWxvcmkgbm9uIHVndWFsaQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1JIHZhbG9yaSBpbnNlcml0aSBub24gY29pbmNpZG9ubwotCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPUxvIHN0ZXNzbyB2YWxvcmUgbm9uICZlZ3JhdmU7IHBlcm1lc3NvCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1MbyBzdGVzc28gdmFsb3JlIG5vbiAmZWdyYXZlOyBwZXJtZXNzbwotCi13cm9uZ19kYXRlPURhdGEgZXJyYXRhCi13cm9uZ19kYXRlX2RldGFpbD1EYXRhIGVycmF0YQotCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9TGEgZGF0YSBkZXZlIGVzc2VyZSBkb3BvIGRpIHswfQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1MYSBkYXRhIGRldmUgZXNzZXJlIGRvcG8gZGkgezB9Ci0KLXdyb25nX2RhdGVfbm90X2FmdGVyPUxhIGRhdGEgZGV2ZSBlc3NlcmUgcHJpbWEgZGkgezB9Ci13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9TGEgZGF0YSBkZXZlIGVzc2VyZSBwcmltYSBkaSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9TGEgZGF0YSBub24gJmVncmF2ZTsgdWd1YWxlIGEgezB9Ci13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9TGEgZGF0YSBub24gJmVncmF2ZTsgdWd1YWxlIGEgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcyBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZjZhOWQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9Z2lyaWxlbiBkZVx1MDExZmVyIGZhcmtsXHUwMTMxDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1naXJpbGVuIGRlXHUwMTFmZXIgZmFya2xcdTAxMzENCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPWF5blx1MDEzMSBkZVx1MDExZmVyIGdpcmlsZW1leg0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPWF5blx1MDEzMSBkZVx1MDExZmVyIGdpcmlsZW1leg0KLQ0KLXdyb25nX2RhdGU9eWFubFx1MDEzMVx1MDE1ZiB0YXJpaA0KLXdyb25nX2RhdGVfZGV0YWlsPXlhbmxcdTAxMzFcdTAxNWYgdGFyaWgNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBzb25yYSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIHNvbnJhIG9sbWFsXHUwMTMxZFx1MDEzMXINCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIFx1MDBmNm5jZSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gXHUwMGY2bmNlIG9sbWFsXHUwMTMxZFx1MDEzMXINCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZSBlXHUwMTVmaXQgZGVcdTAxMWZpbA0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZSBlXHUwMTVmaXQgZGVcdTAxMWZpbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q3NjU5ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgICAgIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZU5hbWUgPSBudWxsOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VOYW1lID0gc3VwZXIuZ2V0QmFzZU5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBiYXNlTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcmVjb3JkZXIvQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWNvcmRlci9Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNiMDhkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWNvcmRlci9Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnJlY29yZGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlci5Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIgaW1wbGVtZW50cyBQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyDQotew0KLSAgICBwdWJsaWMgdm9pZCByZWNvcmRVc2VySW5wdXQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgaWYgKCEodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICAvL3RvIHN1cHBvcnQgbG9jYWwgY3Jvc3MtdmFsaWRhdGlvbiAod2l0aGluIHRoZSBzYW1lIGVudGl0eSkNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgPSBDcm9zc1ZhbGlkYXRpb25VdGlscw0KLSAgICAgICAgICAgIC5nZXRPckluaXRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UoKTsNCi0NCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5Ow0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBpZihwcm9wZXJ0eURldGFpbHMgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGVudHJ5ID0gbmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5KCk7DQotICAgICAgICBlbnRyeS5zZXRCZWFuKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkpOw0KLSAgICAgICAgZW50cnkuc2V0Q29udmVydGVkVmFsdWUodmFsdWUpOw0KLSAgICAgICAgZW50cnkuc2V0Q29tcG9uZW50KHVpQ29tcG9uZW50KTsNCi0gICAgICAgIGVudHJ5LnNldENsaWVudElkKHVpQ29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGtleSA9IHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKTsNCi0NCi0gICAgICAgIC8vZm9yIGxvY2FsIGNyb3NzLXZhbGlkYXRpb24NCi0gICAgICAgIGlmIChwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY29udGFpbnNFbnRyeShrZXkpICYmDQotICAgICAgICAgICAgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmdldEVudHJ5KGtleSkuZ2V0QmVhbigpICE9IG51bGwgJiYNCi0gICAgICAgICAgICAhcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmdldEVudHJ5KGtleSkuZ2V0QmVhbigpLmVxdWFscyhlbnRyeS5nZXRCZWFuKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZm9yIHRoZSB2YWxpZGF0aW9uIHdpdGhpbiBhIGNvbXBsZXggY29tcG9uZW50IGUuZy4gYSB0YWJsZQ0KLSAgICAgICAgICAgIC8vZG9uJ3Qgb3ZlcnJpZGUgZXhpc3RpbmcgZXhwcmVzc2lvbiAoc3R5bGU6ICN7ZW50cnkucHJvcGVydHl9KSAtIG1ha2UgYSBzcGVjaWFsIG1hcHBpbmcNCi0NCi0gICAgICAgICAgICBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5PiBmdXJ0aGVyRW50cmllcyA9DQotICAgICAgICAgICAgICAgIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5nZXRFbnRyeShrZXkpLmdldEZ1cnRoZXJFbnRyaWVzKCk7DQotDQotICAgICAgICAgICAgaWYgKGZ1cnRoZXJFbnRyaWVzID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmdXJ0aGVyRW50cmllcyA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk+KCk7DQotDQotICAgICAgICAgICAgICAgIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5nZXRFbnRyeShrZXkpLnNldEZ1cnRoZXJFbnRyaWVzKGZ1cnRoZXJFbnRyaWVzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgZnVydGhlckVudHJpZXMuYWRkKGVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2ZvciBub3JtYWwgdmFsaWRhdGlvbg0KLSAgICAgICAgICAgIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5zZXRFbnRyeShrZXksIGVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOWZhZDYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogbm9ybWFsbHkgaXQgc2hvdWxkIGJlIGluIHRoZSBzdG9yYWdlIHBhY2thZ2UgLSBkdWUgdG8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpdCBpc24ndCB0aGUgY2FzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlDQotew0KLSAgICB2b2lkIGFkZChDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkpOw0KLQ0KLSAgICBMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5ZTFlNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLQ0KLS8qKg0KLSAqIG5vcm1hbGx5IGl0IHNob3VsZCBiZSBpbiB0aGUgc3RvcmFnZSBwYWNrYWdlIC0gZHVlIHRvIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaXQgaXNuJ3QgdGhlIGNhc2UNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5DQotew0KLSAgICBwcml2YXRlIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeTsNCi0gICAgLy9mb3IgY29tcGxleCBjb21wb25lbnRzIChlLmcuIGEgdGFibGUpIHN0b3JlcyB0aGUgb2JqZWN0IG9mIGVudHJ5ICgje2VudHJ5LnByb3BlcnR5fSkNCi0gICAgcHJpdmF0ZSBVSUNvbXBvbmVudCBjb21wb25lbnQ7DQotICAgIHByaXZhdGUgT2JqZWN0IGNvbnZlcnRlZE9iamVjdDsNCi0gICAgcHJpdmF0ZSBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIC8vanVzdCBmb3IgaW5wdXQgY29tcG9uZW50cyB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzIGUuZy4gZGF0YVRhYmxlLC4uLg0KLSAgICBwcml2YXRlIFN0cmluZyBjbGllbnRJZDsNCi0NCi0gICAgcHVibGljIE1ldGFEYXRhRW50cnkgZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUVudHJ5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhRW50cnkoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhRW50cnkgPSBtZXRhRGF0YUVudHJ5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBVSUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudChVSUNvbXBvbmVudCBjb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkT2JqZWN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZE9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZWRPYmplY3QoT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb252ZXJ0ZWRPYmplY3QgPSBjb252ZXJ0ZWRPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblN0cmF0ZWd5KENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3kgPSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjbGllbnRJZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGllbnRJZChTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUxMGEzYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgaW1wbGVtZW50cyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlDQotew0KLSAgICBwcml2YXRlIExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcyA9DQotICAgICAgICBuZXcgQXJyYXlMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcy5hZGQoZW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMoTGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA0MWM5NWQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIGNyb3NzLXZhbGlkYXRpb24gZW50cmllcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlcg0KLSAgICBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIC8vZm9yIGJldHRlciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5DQotICAgICAgICByZXR1cm4gQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2QwZmM0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgaW1wbGVtZW50cyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk+IHByb2Nlc3NlZEluZm9ybWF0aW9uTWFwID0NCi0gICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVudHJ5KFN0cmluZyBrZXksIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb2Nlc3NlZEluZm9ybWF0aW9uTWFwLnB1dChrZXksIGVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0VudHJ5KFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9jZXNzZWRJbmZvcm1hdGlvbk1hcC5jb250YWluc0tleShrZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSBnZXRFbnRyeShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvY2Vzc2VkSW5mb3JtYXRpb25NYXAuZ2V0KGtleSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYmI1MDAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIHByb2Nlc3NlZCBpbmZvcm1hdGlvbiBlbnRyaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXINCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZT4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICAvL2ZvciBiZXR0ZXIgYmFja3dhcmQgY29tcGF0aWJpbGl0eQ0KLSAgICAgICAgcmV0dXJuIENyb3NzVmFsaWRhdGlvblV0aWxzLmNsYXNzLmdldE5hbWUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGIxNTZlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UNCi17DQotICAgIHZvaWQgc2V0RW50cnkoU3RyaW5nIGtleSwgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgZW50cnkpOw0KLQ0KLSAgICBib29sZWFuIGNvbnRhaW5zRW50cnkoU3RyaW5nIGtleSk7DQotDQotICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IGdldEVudHJ5KFN0cmluZyBrZXkpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmNzg5Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBJbiBvcmRlciB0byBidWlsZCB1cCBhIG1hcHBpbmcgd2hpY2ggaXMgdXNlZCBmb3IgY3Jvc3MtdmFsaWRhdGlvbi4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5Ci17Ci0gICAgcHJpdmF0ZSBPYmplY3QgYmVhbjsKLSAgICBwcml2YXRlIE9iamVjdCBjb252ZXJ0ZWRWYWx1ZTsKLSAgICBwcml2YXRlIFVJQ29tcG9uZW50IGNvbXBvbmVudDsKLSAgICAvL2ZvciBjb21wbGV4IGNvbXBvbmVudHMgKGUuZy4gYSB0YWJsZSB0aGVyZSBhcmUgbXVsdGlwbGUgZW50cmllcyB3aXRoCi0gICAgLy90aGUgc2FtZSBrZXkgKGhlcmUgdGhlIGVsIGV4cHJlc3Npb24gI3tlbnRyeS5wcm9wZXJ0eX0pCi0gICAgLy9ob3dldmVyLCBkb24ndCBvdmVycmlkZSB0aGUgcHJldmlvdXMgZW50cnkgLSB0aGV5IGFybid0IHRoZSBzYW1lOwotICAgIHByaXZhdGUgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4gZnVydGhlckVudHJpZXM7Ci0gICAgLy9qdXN0IGZvciBpbnB1dCBjb21wb25lbnRzIHdpdGhpbiBjb21wbGV4IGNvbXBvbmVudHMgZS5nLiBkYXRhVGFibGUsLi4uCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50SWQ7Ci0KLSAgICAvKgotICAgICAqIGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmVhbigpCi0gICAgewotICAgICAgICByZXR1cm4gYmVhbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCZWFuKE9iamVjdCBiZWFuKQotICAgIHsKLSAgICAgICAgdGhpcy5iZWFuID0gYmVhbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZWRWYWx1ZShPYmplY3QgY29udmVydGVkVmFsdWUpCi0gICAgewotICAgICAgICB0aGlzLmNvbnZlcnRlZFZhbHVlID0gY29udmVydGVkVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFVJQ29tcG9uZW50IGdldENvbXBvbmVudCgpCi0gICAgewotICAgICAgICByZXR1cm4gY29tcG9uZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudChVSUNvbXBvbmVudCBjb21wb25lbnQpCi0gICAgewotICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudElkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjbGllbnRJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGllbnRJZChTdHJpbmcgY2xpZW50SWQpCi0gICAgewotICAgICAgICB0aGlzLmNsaWVudElkID0gY2xpZW50SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk+IGdldEZ1cnRoZXJFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmdXJ0aGVyRW50cmllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGdXJ0aGVyRW50cmllcyhMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5PiBmdXJ0aGVyRW50cmllcykKLSAgICB7Ci0gICAgICAgIHRoaXMuZnVydGhlckVudHJpZXMgPSBmdXJ0aGVyRW50cmllczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL21hcHBlci9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGViZjNiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL21hcHBlci9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhrZXkpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvbWFwcGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL21hcHBlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2OTRkMTAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvbWFwcGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhrZXkpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzAyMDJiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneTxBIGV4dGVuZHMgQW5ub3RhdGlvbj4gZXh0ZW5kcyBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIExpc3Q8UmVmZXJlbmNpbmdTdHJhdGVneT4gcmVmZXJlbmNpbmdTdHJhdGVnaWVzOw0KLSAgICBwcm90ZWN0ZWQgTWFwPE9iamVjdCwgT2JqZWN0PiB2aW9sYXRpb25SZXN1bHRTdG9yYWdlID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIGluaXRSZWZlcmVuY2luZ1N0cmF0ZWdpZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UmVmZXJlbmNpbmdTdHJhdGVnaWVzKCkNCi0gICAgew0KLSAgICAgICAgaWYgKHJlZmVyZW5jaW5nU3RyYXRlZ2llcyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcyA9IG5ldyBBcnJheUxpc3Q8UmVmZXJlbmNpbmdTdHJhdGVneT4oKTsNCi0NCi0gICAgICAgICAgICBTdHJpbmcgY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneUNsYXNzTmFtZSA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQkFTRV9QQUNLQUdFKSArICJSZWZlcmVuY2luZ1N0cmF0ZWd5IjsNCi0NCi0gICAgICAgICAgICBSZWZlcmVuY2luZ1N0cmF0ZWd5IGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kgPSAoUmVmZXJlbmNpbmdTdHJhdGVneSkgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneUNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IEVMQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgICAgIC8vcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgQWxpYXNDb21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgTG9jYWxDb21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9pbml0Q3Jvc3NWYWxpZGF0aW9uIGlzIGRvbmUgaW4gdGhlIENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXINCi0NCi0gICAgICAgIFN0cmluZ1tdIHZhbGlkYXRpb25UYXJnZXRzID0gZ2V0VmFsaWRhdGlvblRhcmdldHMoKEEpDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQgOiB2YWxpZGF0aW9uVGFyZ2V0cykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0ID0gdmFsaWRhdGlvblRhcmdldC50cmltKCk7DQotDQotICAgICAgICAgICAgLy9zZWxlY3QgdmFsaWRhdGlvbiBtZXRob2QNCi0gICAgICAgICAgICB0cnlUb1ZhbGlkYXRlKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwgdmFsaWRhdGlvblRhcmdldCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIHRyeVRvVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQpDQotICAgIHsNCi0gICAgICAgIGZvciAoUmVmZXJlbmNpbmdTdHJhdGVneSByZWZlcmVuY2luZ1N0cmF0ZWd5IDogcmVmZXJlbmNpbmdTdHJhdGVnaWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChyZWZlcmVuY2luZ1N0cmF0ZWd5LmV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsIHZhbGlkYXRpb25UYXJnZXQsIHRoaXMpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVGhyb3dhYmxlSW5zdGFuY2VOZXZlclRocm93biJ9KQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UsDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZUYXJnZXQpDQotICAgIHsNCi0gICAgICAgIGlmICghaGFuZGxlVGFyZ2V0VmlvbGF0aW9uKGVudHJ5T2ZTb3VyY2UsIGVudHJ5T2ZUYXJnZXQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vbm8gdGFyZ2V0IC0gYmVjYXVzZSB0aGVyZSBpcyBubyB0YXJnZXQgY29tcG9uZW50IC0gdmFsdWUgd2FzIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBtb2RlbA0KLSAgICAgICAgICAgIGlmKGVudHJ5T2ZUYXJnZXQgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NUYXJnZXRDb21wb25lbnRBc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGVudHJ5T2ZTb3VyY2UpOw0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vZ2V0IHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSB0YXJnZXQgY29tcG9uZW50DQotICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldEVycm9yTWVzc2FnZVN1bW1hcnkoKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSwgdHJ1ZSk7DQotICAgICAgICBTdHJpbmcgZGV0YWlscyA9IGdldEVycm9yTWVzc2FnZURldGFpbCgoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpLCB0cnVlKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGlvbiB0YXJnZXQgaXNuJ3QgYm91bmQgdG8gYSBjb21wb25lbnQgd2l0aGluZyB0aGUgY3VycmVudCBwYWdlIA0KLSAgICAgICAgLy8oc2VlIHZhbGlkYXRlRm91bmRFbnRyeSwgdHJ5VG9WYWxpZGF0ZUxvY2FsbHkgYW5kIHRyeVRvVmFsaWRhdGVCaW5kaW5nT25seSkNCi0gICAgICAgIGlmIChlbnRyeU9mVGFyZ2V0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZW50cnlPZlRhcmdldCA9IGVudHJ5T2ZTb3VyY2U7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZTsNCi0gICAgICAgIGlmIChlbnRyeU9mVGFyZ2V0LmdldE1ldGFEYXRhRW50cnkoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1lc3NhZ2UgPSBnZXRUYXJnZXRDb21wb25lbnRFcnJvck1lc3NhZ2UoKEEpZW50cnlPZlRhcmdldC5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9UT0RPIGRvY3VtZW50IHBvc3NpYmxlIHNpZGUgZWZmZWN0cw0KLSAgICAgICAgICAgIC8vZHVlIHRvIGEgbWlzc2luZyB0YXJnZXQgYW5ub3RhdGlvbiAoc2VlOiB0cnlUb1ZhbGlkYXRlTG9jYWxseSkNCi0gICAgICAgICAgICBtZXNzYWdlID0gZ2V0VGFyZ2V0Q29tcG9uZW50RXJyb3JNZXNzYWdlKChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCksIHN1bW1hcnksIGRldGFpbHMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKChtZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsIHx8IG1lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkgJiYNCi0gICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldENsaWVudElkKCkgIT0gbnVsbCAmJiAhZW50cnlPZlNvdXJjZS5nZXRDbGllbnRJZCgpLmVxdWFscyhlbnRyeU9mVGFyZ2V0LmdldENsaWVudElkKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24gPSBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG1lc3NhZ2UpOw0KLQ0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNTb3VyY2VNZXRhRGF0YVVzZWQgPSBmYWxzZTsNCi0NCi0gICAgICAgICAgICBpZihlbnRyeU9mVGFyZ2V0LmdldE1ldGFEYXRhRW50cnkoKSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJlcGFyZVRhcmdldE1ldGFEYXRhRm9yU2V2ZXJpdHlBd2FyZUludGVyY2VwdGlvbihlbnRyeU9mU291cmNlLCBlbnRyeU9mVGFyZ2V0KTsNCi0gICAgICAgICAgICAgICAgaXNTb3VyY2VNZXRhRGF0YVVzZWQgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBpZihFeHRWYWxVdGlscy5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5T2ZUYXJnZXQuZ2V0Q29tcG9uZW50KCksIGVudHJ5T2ZUYXJnZXQuZ2V0TWV0YURhdGFFbnRyeSgpLA0KLSAgICAgICAgICAgICAgICAgICAgZW50cnlPZlRhcmdldC5nZXRDb252ZXJ0ZWRPYmplY3QoKSwgdmFsaWRhdG9yRXhjZXB0aW9uLCB0aGlzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudElkKGVudHJ5T2ZUYXJnZXQuZ2V0Q2xpZW50SWQoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb252ZXJ0RmFjZXNNZXNzYWdlKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZihpc1NvdXJjZU1ldGFEYXRhVXNlZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc2V0VGFyZ2V0TWV0YURhdGEoZW50cnlPZlRhcmdldCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcmVwYXJlVGFyZ2V0TWV0YURhdGFGb3JTZXZlcml0eUF3YXJlSW50ZXJjZXB0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlLCBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlRhcmdldCkNCi0gICAgew0KLSAgICAgICAgZW50cnlPZlRhcmdldC5zZXRNZXRhRGF0YUVudHJ5KGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRUYXJnZXRNZXRhRGF0YShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlRhcmdldCkNCi0gICAgew0KLSAgICAgICAgZW50cnlPZlRhcmdldC5zZXRNZXRhRGF0YUVudHJ5KG51bGwpOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVGhyb3dhYmxlSW5zdGFuY2VOZXZlclRocm93biJ9KQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1RhcmdldENvbXBvbmVudEFzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UpDQotICAgIHsNCi0gICAgICAgIC8vZ2V0IHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgICAgU3RyaW5nIHN1bW1hcnkgPSBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeSgoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpKTsNCi0gICAgICAgIFN0cmluZyBkZXRhaWxzID0gZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbCgoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlID0gZ2V0U291cmNlQ29tcG9uZW50RXJyb3JNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICAoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpLCBzdW1tYXJ5LCBkZXRhaWxzKTsNCi0NCi0gICAgICAgIGlmIChtZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsIHx8IG1lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8NCi0gICAgICAgICAgICBpZihFeHRWYWxVdGlscy5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycyhlbnRyeU9mU291cmNlLmdldENvbXBvbmVudCgpLA0KLSAgICAgICAgICAgICAgICAgICAgZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCksDQotICAgICAgICAgICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihtZXNzYWdlKSwNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudChlbnRyeU9mU291cmNlLmdldENvbXBvbmVudCgpLCBtZXNzYWdlLCBudWxsKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9UT0RPIGxvZ2dpbmcNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UpDQotICAgIHsNCi0gICAgICAgIGlmIChoYW5kbGVTb3VyY2VWaW9sYXRpb24oZW50cnlPZlNvdXJjZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9nZXQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAgICAgICAgU3RyaW5nIHN1bW1hcnkgPSBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCksIGZhbHNlKTsNCi0gICAgICAgICAgICBTdHJpbmcgZGV0YWlscyA9IGdldEVycm9yTWVzc2FnZURldGFpbCgoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpLCBmYWxzZSk7DQotDQotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIG1lc3NhZ2UgPSBnZXRTb3VyY2VDb21wb25lbnRFcnJvck1lc3NhZ2UoDQotICAgICAgICAgICAgICAgIChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCksIHN1bW1hcnksIGRldGFpbHMpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsIHx8IG1lc3NhZ2UuZ2V0RGV0YWlsKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vVE9ETw0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50KGVudHJ5T2ZTb3VyY2UuZ2V0Q29tcG9uZW50KCksIG1lc3NhZ2UsIG51bGwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vanVzdCB0aHJvdyBhIG5ldyBtZXNzYWdlIC0gdGhlIGVycm9yIG1lc3NhZ2UgaXMgYXQgdGhlIHRhcmdldA0KLSAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudCgNCi0gICAgICAgICAgICAgICAgZW50cnlPZlNvdXJjZS5nZXRDb21wb25lbnQoKSwgbmV3IEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsIG51bGwsIG51bGwpLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgRmFjZXNNZXNzYWdlIGdldFNvdXJjZUNvbXBvbmVudEVycm9yTWVzc2FnZShBIGFubm90YXRpb24sIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEZhY2VzTWVzc2FnZSBnZXRUYXJnZXRDb21wb25lbnRFcnJvck1lc3NhZ2UoQSBmb3VuZEFubm90YXRpb24sIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KEEgYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHJlc29sdmVNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKEEgYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgU3RyaW5nIGtleSA9IGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgICAgICAgICAgcmV0dXJuIChrZXkgIT0gbnVsbCkgPyByZXNvbHZlTWVzc2FnZShrZXkgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCkgOiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBrZXkgIiArIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleSgoQSlhbm5vdGF0aW9uLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlVGFyZ2V0VmlvbGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlLA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW50cnlPZlRhcmdldCAhPSBudWxsICYmIGVudHJ5T2ZUYXJnZXQuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVTb3VyY2VWaW9sYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBoYW5kbGVUYXJnZXRWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBubyB0YXJnZXQgY29tcG9uZW50ICh2YWxpZGF0aW9uIGFnYWluc3QgdGhlIG1vZGVsKSAtPiBnZXQgcmV2ZXJzZSBtZXNzYWdlIGZvciBzb3VyY2UgY29tcG9uZW50DQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KEEgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgLy9pZiB0aGUgbWVzc2FnZSBpcyBuZXV0cmFsDQotICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uLCB0cnVlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBubyB0YXJnZXQgY29tcG9uZW50ICh2YWxpZGF0aW9uIGFnYWluc3QgdGhlIG1vZGVsKSAtPiBnZXQgcmV2ZXJzZSBtZXNzYWdlIGZvciBzb3VyY2UgY29tcG9uZW50DQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwoQSBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICAvL2lmIHRoZSBtZXNzYWdlIGlzIG5ldXRyYWwNCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbiwgdHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogYWJzdHJhY3QgbWV0aG9kcw0KLSAgICAgKi8NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQSBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0NCi0gICAgLyoNCi0gICAgICogaW1wbGVtZW50cyB0aGUgc3BlY2lmaWMgdmFsaWRhdGlvbiBsb2dpYw0KLSAgICAgKi8NCi0NCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLCBBIGFubm90YXRpb24pOw0KLQ0KLSAgICAvKg0KLSAgICAgKiByZXR1cm5zIHRoZSByZWZlcmVuY2VkIHZhbGlkYXRpb24gdGFyZ2V0cyBvZiB0aGUgYW5ub3RhdGlvbg0KLSAgICAgKiBlLmcuIEBEYXRlSXModHlwZSA9IERhdGVJc1R5cGUuYmVmb3JlLCB2YWx1ZSA9ICJmaW5hbEV4YW0iKQ0KLSAgICAgKiAtPiBtZXRob2QgcmV0dXJucyBhbiBhcnJheSB3aXRoIG9uZSB2YWx1ZSAoImZpbmFsRXhhbSIpDQotICAgICAqLw0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQSBhbm5vdGF0aW9uKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1Mzc2MTIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgLy9pbml0IGNyb3NzLXZhbGlkYXRpb24NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA9DQotICAgICAgICAgICAgZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkuYWRkKGVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA9IG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoKTsNCi0NCi0gICAgICAgIGVudHJ5LnNldE1ldGFEYXRhRW50cnkobWV0YURhdGFFbnRyeSk7DQotICAgICAgICBlbnRyeS5zZXRDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgZW50cnkuc2V0Q2xpZW50SWQodWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIGVudHJ5LnNldFZhbGlkYXRpb25TdHJhdGVneSh0aGlzKTsNCi0NCi0gICAgICAgIHJldHVybiBlbnRyeTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgYXZhaWxhYmxlIGZvciBjcm9zcyB2YWxpZGF0aW9uIC0gdXNlIHByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IGF2YWlsYWJsZSBmb3IgY3Jvc3MgdmFsaWRhdGlvbiIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0VmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICAvL25vdCBhdmFpbGFibGUgZm9yIGNyb3NzIHZhbGlkYXRpb24gLSB1c2UgaW5pdENyb3NzVmFsaWRhdGlvbg0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDcm9zc1ZhbGlkYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICAvL292ZXJyaWRlIGlmIG5lZWRlZA0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLCB2YWxpZGF0b3JFeGNlcHRpb24sIHRoaXMpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25IZWxwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdkNDc2ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5LA0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNNb2RlbEF3YXJlVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGNvbXBhcmVTdHJhdGVneS5pc1Zpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9wcm9jZXNzIGFmdGVyIHZpb2xhdGlvbg0KLSAgICAgICAgICAgIC8vanVzdCBhZGQgbWVzc2FnZXMNCi0gICAgICAgICAgICBpZighaXNNb2RlbEF3YXJlVmFsaWRhdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NUYXJnZXRBZnRlckNyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1RhcmdldEFmdGVyTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vdGhvdyBleGNlcHRpb24NCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzVGFyZ2V0QWZ0ZXJDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5ID0gbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgpOw0KLQ0KLSAgICAgICAgaWYgKGNvbXBhcmVTdHJhdGVneS51c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb21wb25lbnQodmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q2xpZW50SWQodmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENsaWVudElkKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb21wb25lbnQoc291cmNlQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q2xpZW50SWQoc291cmNlQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENsaWVudElkKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbnZlcnRlZE9iamVjdCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSk7DQotICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0VmFsaWRhdGlvblN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSk7DQotDQotICAgICAgICAvL2FkZCBtZXNzYWdlDQotICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICBzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzVGFyZ2V0QWZ0ZXJNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICAvL25vIHRhcmdldCAtIGJlY2F1c2UgdGhlcmUgaXMgbm8gdGFyZ2V0IGNvbXBvbmVudCAtIHZhbHVlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbW9kZWwNCi0gICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBudWxsKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzI3ZGE1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICB2b2lkIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpDQotICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0RhdGVJc1N0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRGF0ZUlzU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhZmM4Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRGF0ZUlzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRGF0ZUlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXNUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEYXRlSXNTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5PERhdGVJcz4NCi17DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT19FQVJMWSA9ICJlYXJseSI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT19MQVRFID0gImxhdGUiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRVFVQUxfREFURV9USU1FID0gIm5vdCBlcXVhbCI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9LRVkgPSAicmVzdWx0IjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFSRURfVkFMVUVfS0VZID0gInRhcmdldCB2YWx1ZSI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVkVSU0VfQ09NUEFSRURfVkFMVUVfS0VZID0gInJldmVyc2UgdGFyZ2V0IHZhbHVlIjsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIC8vVE9ETyB0ZXN0ICYgcmVtb3ZlDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVTb3VyY2VWaW9sYXRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHZpb2xhdGlvbkZvdW5kOw0KLQ0KLSAgICAgICAgaWYgKGFubm90YXRpb24udHlwZSgpLmVxdWFscyhEYXRlSXNUeXBlLnNhbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsICYmICFvYmplY3QxLmVxdWFscyhvYmplY3QyKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFU1VMVF9LRVksIE5PVF9FUVVBTF9EQVRFX1RJTUUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24udHlwZSgpLmVxdWFscyhEYXRlSXNUeXBlLmJlZm9yZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSBvYmplY3QxICE9IG51bGwgJiYgb2JqZWN0MiAhPSBudWxsICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICghbmV3IERhdGUoKChEYXRlKSBvYmplY3QxKS5nZXRUaW1lKCkpLmJlZm9yZSgoRGF0ZSkgb2JqZWN0MikgfHwgb2JqZWN0MS5lcXVhbHMob2JqZWN0MikpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVTVUxUX0tFWSwgVE9PX0xBVEUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IG9iamVjdDEgIT0gbnVsbCAmJiBvYmplY3QyICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFuZXcgRGF0ZSgoKERhdGUpIG9iamVjdDEpLmdldFRpbWUoKSkuYWZ0ZXIoKERhdGUpIG9iamVjdDIpIHx8IG9iamVjdDEuZXF1YWxzKG9iamVjdDIpKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFU1VMVF9LRVksIFRPT19FQVJMWSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoQ09NUEFSRURfVkFMVUVfS0VZLCBvYmplY3QxKTsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFVkVSU0VfQ09NUEFSRURfVkFMVUVfS0VZLCBvYmplY3QyKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB2aW9sYXRpb25Gb3VuZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbHVlT2YoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBwcm90ZWN0ZWQNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KERhdGVJcyBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZykgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLmdldChSRVNVTFRfS0VZKTsNCi0NCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gcmV2ZXJzZVJlc3VsdChyZXN1bHQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKFRPT19FQVJMWS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0Tm90QWZ0ZXJFcnJvck1zZ0tleShhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKFRPT19MQVRFLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROb3RCZWZvcmVFcnJvck1zZ0tleShhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0Tm90RXF1YWxFcnJvck1zZ0tleShhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyByZXZlcnNlUmVzdWx0KFN0cmluZyByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIGlmIChUT09fRUFSTFkuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIFRPT19MQVRFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBUT09fRUFSTFk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShEYXRlSXMgYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCksIGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoRGF0ZUlzIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgICAgICB9DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgZmFsc2UpLCBhbm5vdGF0aW9uLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbChEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgZmFsc2UpDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBhbm5vdGF0aW9uLCBmYWxzZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZShTdHJpbmcga2V5LCBEYXRlSXMgYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSByZXNvbHZlTWVzc2FnZShrZXkpOw0KLQ0KLSAgICAgICAgRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoYW5ub3RhdGlvbi5lcnJvck1lc3NhZ2VEYXRlU3R5bGUoKSwNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKSk7DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0Ow0KLQ0KLSAgICAgICAgaWYoaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQuZm9ybWF0KChEYXRlKSB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UuZ2V0KENPTVBBUkVEX1ZBTFVFX0tFWSkpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBtZXNzYWdlLnJlcGxhY2UoInswfSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdC5mb3JtYXQoKERhdGUpIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5nZXQoUkVWRVJTRV9DT01QQVJFRF9WQUxVRV9LRVkpKSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL3JlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIG90aGVyIGNvbXBvbmVudA0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBwcml2YXRlDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBnZXROb3RBZnRlckVycm9yTXNnS2V5KERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uLm5vdEFmdGVyRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5vdEJlZm9yZUVycm9yTXNnS2V5KERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uLm5vdEJlZm9yZUVycm9yTXNnS2V5KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXROb3RFcXVhbEVycm9yTXNnS2V5KERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uLm5vdEVxdWFsRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VMQ29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OTExZDUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VMQ29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIHJlZmVyZW5jaW5nIHZhbGlkYXRpb24gdGFyZ2V0cyAtIHBvc3NpYmxlIGZvcm1hdHM6DQotICogIiN7W2JlYW5fbmFtZV0uW3Byb3BlcnR5X25hbWVdfSIgLi4uIGNyb3NzLWVudGl0eSB2YWxpZGF0aW9uIHdpdGggdmFsdWUgYmluZGluZw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBFTENvbXBhcmVTdHJhdGVneSBpbXBsZW1lbnRzIFJlZmVyZW5jaW5nU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYgKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKHZhbGlkYXRpb25UYXJnZXQpICYmDQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVZhbGlkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgdmFsaWRhdGlvblRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9WYWxpZGF0ZVZhbHVlQmluZGluZygNCi0gICAgICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbGlkYXRpb25UYXJnZXQpLCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLCBjb21wYXJlU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ0ZXN0IikNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZVZhbHVlQmluZGluZygNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkgPQ0KLSAgICAgICAgICAgICAgICByZXNvbHZlVGFyZ2V0Rm9yQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldCk7DQotDQotICAgICAgICBpZih2YWxpZGF0aW9uVGFyZ2V0RW50cnkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgcmVzb2x2ZVRhcmdldEZvckNyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsaWRhdGlvblRhcmdldCkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSA9DQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgcmV0dXJuIENyb3NzVmFsaWRhdGlvblV0aWxzLnJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgICAgIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuY29udmVydFZhbHVlQmluZGluZ0V4cHJlc3Npb25Ub1Byb2Nlc3NlZEluZm9ybWF0aW9uS2V5KHZhbGlkYXRpb25UYXJnZXQpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSkNCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWxpZGF0aW9uVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgT2JqZWN0IHRhcmdldFZhbHVlID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRWYWx1ZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsIHZhbGlkYXRpb25UYXJnZXQpOw0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdGFyZ2V0RW50cnkgPSBuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkoKTsNCi0gICAgICAgIHRhcmdldEVudHJ5LnNldEJlYW4oDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWxpZGF0aW9uVGFyZ2V0LmdldEJhc2VFeHByZXNzaW9uKCkpKTsNCi0gICAgICAgIHRhcmdldEVudHJ5LnNldENvbnZlcnRlZFZhbHVlKHRhcmdldFZhbHVlKTsNCi0NCi0gICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneShjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0RW50cnksIHRydWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FcXVhbHNTdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VxdWFsc1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZGIzZjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VxdWFsc1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLk51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEVxdWFsc1N0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKEVxdWFscykgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLCBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBvYmplY3QxICE9IG51bGwgJiYgIW9iamVjdDEuZXF1YWxzKG9iamVjdDIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKEVxdWFscykgYW5ub3RhdGlvbikudmFsdWUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxDb21wYXJlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzUyZjNjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbENvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLQ0KLS8qKg0KLSAqICJbcHJvcGVydHlfbmFtZV0iIC4uLiBsb2NhbCB2YWxpZGF0aW9uIC0+IGNyb3NzLWNvbXBvbmVudCwgYnV0IG5vIGNyb3NzLWVudGl0eSB2YWxpZGF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIExvY2FsQ29tcGFyZVN0cmF0ZWd5IGltcGxlbWVudHMgUmVmZXJlbmNpbmdTdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZih2YWxpZGF0aW9uVGFyZ2V0LmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kgd2lsbCBjb250aW51ZQ0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnlUb1ZhbGlkYXRlTG9jYWxseSgNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZUxvY2FsbHkoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSwNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgPQ0KLSAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UoKTsNCi0NCi0gICAgICAgIGJvb2xlYW4gaXNNb2RlbEF3YXJlVmFsaWRhdGlvbiA9DQotICAgICAgICAgICAgICAgIGlzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSwgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldEtleTsNCi0NCi0gICAgICAgIFN0cmluZyBzb3VyY2VLZXkgPSByZXNvbHZlU291cmNlS2V5KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICB0YXJnZXRLZXkgPSBzb3VyY2VLZXkuc3Vic3RyaW5nKDAsIHNvdXJjZUtleS5sYXN0SW5kZXhPZigiLiIpICsgMSkgKyB0YXJnZXRLZXk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkgPSBDcm9zc1ZhbGlkYXRpb25VdGlscy5yZXNvbHZlVmFsaWRhdGlvblRhcmdldEVudHJ5KA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UsIHRhcmdldEtleSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0NCi0gICAgICAgIGlmICh2YWxpZGF0aW9uVGFyZ2V0RW50cnkgIT0gbnVsbCAmJiB2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCAmJiAhaXNNb2RlbEF3YXJlVmFsaWRhdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9ubyB0YXJnZXQgLSBiZWNhdXNlIHRoZXJlIGlzIG5vIHRhcmdldCBjb21wb25lbnQgLSB2YWx1ZSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1vZGVsDQotICAgICAgICBlbHNlIGlmKGlzTW9kZWxBd2FyZVZhbGlkYXRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldFByb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB1bnN1cHBvcnRlZENhc2UoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlVGFyZ2V0S2V5KENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFN0cmluZyB0YXJnZXRLZXkpDQotICAgIHsNCi0gICAgICAgIC8vbm8gcmVhbCB2YWx1ZSBiaW5kaW5nIGV4cHJlc3Npb24NCi0gICAgICAgIC8vVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBqdXN0IGhlcGxzIHRvIHJlcGxhY2UgdGhlIHByb3BlcnR5IG9mIHRoZSBrZXkNCi0gICAgICAgIC8vaGVyZSBvbmx5IGRvdC1ub3RhdGlvbiBpcyBhbGxvd2VkIC0+IG5vIHByb2JsZW0NCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYmFzZUV4cHJlc3Npb24gPQ0KLSAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIjeyIgKyBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLA0KLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZXRhaWxzLmNsYXNzKS5nZXRLZXkoKSArICJ9Iik7DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlT3JBZGRQcm9wZXJ0eShiYXNlRXhwcmVzc2lvbiwgdGFyZ2V0S2V5KQ0KLSAgICAgICAgICAgIC5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0LnN1YnN0cmluZygyLCByZXN1bHQubGVuZ3RoKCkgLTEpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWVPZlByb3BlcnR5KE9iamVjdCBiYXNlLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHByb3BlcnR5ID0gcHJvcGVydHkuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSArIHByb3BlcnR5LnN1YnN0cmluZygxLCBwcm9wZXJ0eS5sZW5ndGgoKSk7DQotICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoYmFzZS5nZXRDbGFzcygpKTsNCi0gICAgICAgIE1ldGhvZCB0YXJnZXRNZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodGFyZ2V0Q2xhc3MsICJnZXQiICsgcHJvcGVydHkpOw0KLQ0KLSAgICAgICAgaWYodGFyZ2V0TWV0aG9kID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHRhcmdldENsYXNzLCAiaXMiICsgcHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYodGFyZ2V0TWV0aG9kID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgImNsYXNzICIgKyBiYXNlLmdldENsYXNzKCkgKyAiIGhhcyBubyBwdWJsaWMgZ2V0L2lzICIgKyBwcm9wZXJ0eS50b0xvd2VyQ2FzZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoYmFzZSwgdGFyZ2V0TWV0aG9kKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIGtleUNvbnZlcnRlZFZhbHVlTWFwcGluZywNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0S2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbmV3S2V5ID0gY3JlYXRlVGFyZ2V0S2V5KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIHJldHVybiAha2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLmNvbnRhaW5zRW50cnkobmV3S2V5KTsNCi0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyByZXNvbHZlU291cmNlS2V5KENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUtleSA9IHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKTsNCi0NCi0gICAgICAgIGlmKCFzb3VyY2VLZXkuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzb3VyY2UgcGF0aDogIiArIHNvdXJjZUtleSArICIgaW52YWxpZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHNvdXJjZUtleTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdW5zdXBwb3J0ZWRDYXNlKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQgY29udmVydGVkIG9iamVjdCBmb3IgIiArICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcykuZ2V0S2V5KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSkNCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB0YXJnZXRFbnRyeSA9IG5ldyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSgpOw0KLQ0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0QmVhbigNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpLmdldEJhc2VPYmplY3QoKSk7DQotICAgICAgICB0YXJnZXRFbnRyeQ0KLSAgICAgICAgICAgICAgICAuc2V0Q29udmVydGVkVmFsdWUoZ2V0VmFsdWVPZlByb3BlcnR5KHRhcmdldEVudHJ5LmdldEJlYW4oKSwgdGFyZ2V0UHJvcGVydHkpKTsNCi0NCi0gICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneShjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0RW50cnksIHRydWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRlYzYxZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiAiW2xvY2FsX3Byb3BlcnR5LnByb3BlcnR5MS5wcm9wZXJ0eTJdIg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBMb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kgZXh0ZW5kcyBMb2NhbENvbXBhcmVTdHJhdGVneQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYoIXZhbGlkYXRpb25UYXJnZXQuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL25vdCBzdXBwb3J0ZWQgLSBUT0RPIGFkZCBsb2dnaW5nDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZUxvY2FsbHkoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0S2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgPQ0KLSAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UoKTsNCi0NCi0gICAgICAgIFN0cmluZyBuZXdLZXkgPSBjcmVhdGVUYXJnZXRLZXkoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgaWYgKHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jb250YWluc0VudHJ5KG5ld0tleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5ID0gcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmdldEVudHJ5KG5ld0tleSk7DQotDQotICAgICAgICAgICAgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vbm8gdGFyZ2V0IC0gYmVjYXVzZSB0aGVyZSBpcyBubyB0YXJnZXQgY29tcG9uZW50IC0gdmFsdWUgd2FzIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBtb2RlbA0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRLZXkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdGFyZ2V0SW5mb3JtYXRpb25FbnRyeSkNCi0gICAgew0KLSAgICAgICAgaWYgKGNvbXBhcmVTdHJhdGVneS5pc1Zpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICB0YXJnZXRJbmZvcm1hdGlvbkVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCksDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgPSBuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KCk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbXBvbmVudChjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDbGllbnRJZCh0YXJnZXRJbmZvcm1hdGlvbkVudHJ5LmdldENsaWVudElkKCkpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb252ZXJ0ZWRPYmplY3QodGFyZ2V0SW5mb3JtYXRpb25FbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpKTsNCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0VmFsaWRhdGlvblN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSk7DQotDQotICAgICAgICAgICAgLy9wcm9jZXNzIGFmdGVyIHZpb2xhdGlvbg0KLSAgICAgICAgICAgIC8vanVzdCBhZGQgbWVzc2FnZXMNCi0gICAgICAgICAgICBpZihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgbnVsbCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vdGhvdyBleGNlcHRpb24NCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBTdHJpbmcgdGFyZ2V0S2V5KQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgT2JqZWN0IG5ld0Jhc2UgPSBSZWZsZWN0aW9uVXRpbHMNCi0gICAgICAgICAgICAuZ2V0QmFzZU9mUHJvcGVydHlDaGFpbihwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgaWYodGFyZ2V0S2V5LmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9maW5kIHRoZSBsYXN0IHByb3BlcnR5DQotICAgICAgICAgICAgdGFyZ2V0S2V5ID0gdGFyZ2V0S2V5LnN1YnN0cmluZyh0YXJnZXRLZXkubGFzdEluZGV4T2YoIi4iKSArIDEsIHRhcmdldEtleS5sZW5ndGgoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBPYmplY3QgdGFyZ2V0VmFsdWUgPSBnZXRWYWx1ZU9mUHJvcGVydHkobmV3QmFzZSwgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHRhcmdldEVudHJ5ID0gbmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5KCk7DQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRCZWFuKG5ld0Jhc2UpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0Q29udmVydGVkVmFsdWUodGFyZ2V0VmFsdWUpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRFbnRyeSwgdHJ1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L05vdEVxdWFsc1N0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwOWU4NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uTm90RXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLk51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIE5vdEVxdWFsc1N0cmF0ZWd5IGV4dGVuZHMgRXF1YWxzU3RyYXRlZ3kNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKE5vdEVxdWFscykgYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwNCi0gICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAhc3VwZXIuaXNWaW9sYXRpb24ob2JqZWN0MSwgb2JqZWN0MiwgYW5ub3RhdGlvbik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKE5vdEVxdWFscykgYW5ub3RhdGlvbikudmFsdWUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVmZXJlbmNpbmdTdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlZmVyZW5jaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU1NjRhMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVmZXJlbmNpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJbnRlcm5hbCBpbnRlcmZhY2UgdG8gYWxsb3cgbXVsdGlwbGUgcmVmZXJlbmNpbmcgc3RyYXRlZ2llcyBmb3IgY3Jvc3MgY29tcG9uZW50IHZhbGlkYXRpb24uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWludGVyZmFjZSBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgYWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVxdWlyZWRJZlN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVxdWlyZWRJZlN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NzUwYjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlcXVpcmVkSWZTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLk51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBOdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBFbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZElmU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneTxSZXF1aXJlZElmPg0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUZhY2VzQnVuZGxlID0gZmFsc2U7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHN1cGVyLnJlc29sdmVNZXNzYWdlKGtleSk7DQotICAgICAgICBTdHJpbmcgbWFya2VyID0gQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVI7DQotDQotICAgICAgICBpZigobWFya2VyICsga2V5ICsgbWFya2VyKS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnVzZUZhY2VzQnVuZGxlID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoUmVxdWlyZWRJZiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgc291cmNlLCBPYmplY3QgdGFyZ2V0LCBSZXF1aXJlZElmIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gdmlvbGF0aW9uRm91bmQgPSBmYWxzZTsNCi0NCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLmlzKCkuZXF1YWxzKFJlcXVpcmVkSWZUeXBlLmVtcHR5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IChpc1RhcmdldEVtcHR5KHRhcmdldCkgfHwgQm9vbGVhbi5GQUxTRS5lcXVhbHModGFyZ2V0KSkgJiYgaXNTb3VyY2VFbXB0eShzb3VyY2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbi5pcygpLmVxdWFscyhSZXF1aXJlZElmVHlwZS5ub3RfZW1wdHkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gKGlzVGFyZ2V0Tm90RW1wdHkodGFyZ2V0KSAmJiBpc1NvdXJjZUVtcHR5KHNvdXJjZSkgJiYgISh0YXJnZXQgaW5zdGFuY2VvZiBCb29sZWFuKSkgfHwNCi0gICAgICAgICAgICAgICAgICAgIChCb29sZWFuLlRSVUUuZXF1YWxzKHRhcmdldCkgJiYgaXNTb3VyY2VFbXB0eShzb3VyY2UpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB2aW9sYXRpb25Gb3VuZDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNUYXJnZXRFbXB0eShPYmplY3QgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGFyZ2V0ID09IG51bGwgfHwgdGFyZ2V0LmVxdWFscygiIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU291cmNlRW1wdHkoT2JqZWN0IHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHNvdXJjZSA9PSBudWxsIHx8IHNvdXJjZS5lcXVhbHMoIiIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1RhcmdldE5vdEVtcHR5KE9iamVjdCB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQgIT0gbnVsbCAmJiAhdGFyZ2V0LmVxdWFscygiIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKFJlcXVpcmVkSWYgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsdWVPZigpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZSh2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdG9yRXhjZXB0aW9uKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZDk5MjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2pwYV9zdHJhdGVneV9tYXBwaW5ncy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbj1vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5KcGFWYWxpZGF0aW9uU3RyYXRlZ3kNCi1qYXZheC5wZXJzaXN0ZW5jZS5CYXNpYz1vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5KcGFWYWxpZGF0aW9uU3RyYXRlZ3kNCi1qYXZheC5wZXJzaXN0ZW5jZS5JZD1vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5KcGFWYWxpZGF0aW9uU3RyYXRlZ3kNCi1qYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZT1vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5KcGFWYWxpZGF0aW9uU3RyYXRlZ3kNCi1qYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmU9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuamF2YSBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5Zjg1MmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBnZXRPckluaXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcywgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxVdGlscy5yZXNldFN0b3JhZ2UoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcywgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIGdldE9ySW5pdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKA0KLSAgICAgICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MsIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldEtleVRvQ29udmVydGVkVmFsdWVNYXBwaW5nKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVzZXRTdG9yYWdlKFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jbGFzcywgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSByZXNvbHZlVmFsaWRhdGlvblRhcmdldEVudHJ5KA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSwgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSA9DQotICAgICAgICAgICAgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmdldEVudHJ5KHRhcmdldEtleSk7DQotDQotICAgICAgICAvL3ZhbHVlIG5vdCBzdWJtaXR0ZWQgYXQgdGhpcyByZXF1ZXN0IC0gdXNlIG1vZGVsIHZhbHVlICh2YWxpZGF0aW9uIGFnYWluc3QgdGhlIG1vZGVsKQ0KLSAgICAgICAgaWYocHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9zaW1wbGUgY2FzZQ0KLSAgICAgICAgaWYgKHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuZ2V0RnVydGhlckVudHJpZXMoKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBPYmplY3QgdGFyZ2V0QmVhbiA9IHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCk7DQotDQotICAgICAgICAvL3Byb2Nlc3MgY29tcGxleCBjb21wb25lbnQgZW50cmllcyAoZS5nLiBhIHRhYmxlKQ0KLSAgICAgICAgLy9zdXBwb3J0ZWQ6IGNyb3NzLWNvbXBvbmVudCBidXQgbm8gY3Jvc3MtZW50aXR5IHZhbGlkYXRpb24gKD0gbG9jYWxlIHZhbGlkYXRpb24pDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5nZXRCZWFuKCkuZXF1YWxzKHRhcmdldEJlYW4pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZm9yIChQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSA6IHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuZ2V0RnVydGhlckVudHJpZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuZ2V0QmVhbigpLmVxdWFscyh0YXJnZXRCZWFuKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic3VwcG9ydCBmb3IgbWFwIHN5bnRheCIpDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uVG9Qcm9jZXNzZWRJbmZvcm1hdGlvbktleShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZiZS5nZXRFeHByZXNzaW9uU3RyaW5nKCkucmVwbGFjZSgiI3siLCAiIikucmVwbGFjZSgifSIsICIiKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Qcm9wZXJ0eVZhbGlkYXRpb25VdGlscy5qYXZhIGIvcHJlcGFyZV9yMy8xXzFfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIxOTIwYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Qcm9wZXJ0eVZhbGlkYXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFByb3BlcnR5VmFsaWRhdGlvblV0aWxzDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HR0VSID0gTG9nRmFjdG9yeS5nZXRMb2coUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuY2xhc3MpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZGF0aW9uU2tpcHBlZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgaWYoRXh0VmFsVXRpbHMuaXNTa2lwYWJsZVZhbGlkYXRpb25TdHJhdGVneSgNCi0gICAgICAgICAgICAgICAgUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQm9vbGVhbiBza2lwVmFsaWRhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoDQotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlNLSVBfVkFMSURBVElPTiwgQm9vbGVhbi5jbGFzcyk7DQotDQotICAgICAgICAgICAgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhza2lwVmFsaWRhdGlvbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihMT0dHRVIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgTE9HR0VSLnRyYWNlKCJ2YWxpZGF0aW9uIG9mICIgKyB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGNhbmNlbGVkIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZih2YWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGFuY2VvZiBTa2lwVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS52YWxpZGF0ZShmYWNlc0NvbnRleHQsIG51bGwsIG1ldGFEYXRhRW50cnksIG51bGwpOw0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMV8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWY4MjVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8xXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgUHJvcGVydHkgVmFsaWRhdGlvbiBNb2R1bGUNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBQcm9wZXJ0eSBWYWxpZGF0aW9uIE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFByb3BlcnR5IFZhbGlkYXRpb24gcHJvdmlkZXMgYW5ub3RhdGlvbiBiYXNlZCB2YWxpZGF0aW9uIGZvciBiZWFuIHByb3BlcnRpZXMuDQotICAgIEl0IGFsc28gcHJvdmlkZXMgSlBBIDEuMCBiYXNlZCB2YWxpZGF0aW9uIFN1cHBvcnQuDQotICANCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEueCBhbmQgSlNGIDIueC4gQWxsIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2Fzc2VtYmx5L3BvbS54bWwgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvYXNzZW1ibHkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRlMDdjMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvYXNzZW1ibHkvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYXNzZW1ibHkxMjwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEFzc2VtYmx5PC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5NeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEFzc2VtYmx5IGlzIHVzZWQgdG8gZ2VuZXJhdGUgCi0gICAgLnppcCBhbmQgLnRhci5neiBkaXN0cmlidXRpb25zIDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9hc3NlbWJseTwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2Fzc2VtYmx5PC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9hc3NlbWJseTwvdXJsPgotICAgIDwvc2NtPgotICAgIAotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRlcGVuZGVuY3ktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktamF2YWRvYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZW5lcmljLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2JlYW4tdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2phdmFkb2M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1zb3VyY2U8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjb3JlLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtiZWFuLXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zcmM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBFWEVDVVRFIG12biBwYWNrYWdlIHRvIGdlbmVyYXRlIGFzc2VtYmx5IGZpbGVzIC0tPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X3NyYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5teWZhY2VzLWV4dHZhbDEyLSR7dmVyc2lvbn0tc3JjPC9maW5hbE5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXR0YWNoZWQ8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X2JpbjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPiR7YmFzZWRpcn0vc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsMTItJHt2ZXJzaW9ufS1iaW48L2ZpbmFsTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgucGVyc2lzdGVuY2U8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnBlcnNpc3RlbmNlLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7YmVhbi12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgudmFsaWRhdGlvbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y2dsaWI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNnbGliPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8IS0tIFNpbmNlIGV4dHZhbCBjb3VsZCBiZSBhc3luYyByZWxlYXNlZCwgYW4gZ2VuZXJhdGVkIGFzc2VtYmx5IGNvdWxkIGNvbnRhaW4gZGlmZmVyZW50Ci0gICAgICAgICBhcnRpZmFjdCB2ZXJzaW9ucyAtLT4KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGNvcmUudmVyc2lvbj4xLjIuMzwvY29yZS52ZXJzaW9uPgotICAgICAgICA8dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9uPjEuMi4zPC90cmluaWRhZC1zdXBwb3J0LnZlcnNpb24+Ci0gICAgICAgIDxnZW5lcmljLXN1cHBvcnQudmVyc2lvbj4xLjIuMzwvZ2VuZXJpYy1zdXBwb3J0LnZlcnNpb24+Ci0gICAgICAgIDxwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb24+MS4yLjM8L3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbj4KLSAgICAgICAgPGJlYW4tdmFsaWRhdGlvbi52ZXJzaW9uPjEuMi4zPC9iZWFuLXZhbGlkYXRpb24udmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWwgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNjc5NWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmViaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+Y29yZWJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgIAk8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgIAk8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5SRUFETUUqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5MSUNFTlNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+Tk9USUNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+UkVMRUFTRSo8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L2phdmFkb2M8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+amF2YWRvYzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLmphcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3Jlc3JjLnhtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3Jlc3JjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUxODZjNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08YXNzZW1ibHk+Ci0gIDxpZD5jb3Jlc3JjPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+ICAKLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgIAk8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgIAk8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5SRUFETUUqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5MSUNFTlNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+Tk9USUNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+UkVMRUFTRSo8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4gICAKLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3NyYzwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5zcmM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+Ci0gCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1YjNhNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZjM2M2EuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcgotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvcG9tLnhtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ1ZGM3YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZTwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjIuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMi40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jZ2xpYjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNnbGliPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4xXzM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODQ2M2U2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj4NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5zdGFydHVwLkdlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXINCi0gICAgICAgIDwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJLaXQuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGJlZDdiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyS2l0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLQ0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kSW50ZXJjZXB0b3I7DQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5FbmhhbmNlcjsNCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZFByb3h5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbEdlbmVyaWNSZW5kZXJLaXQgZXh0ZW5kcyBFeHRWYWxSZW5kZXJLaXQgaW1wbGVtZW50cyBNZXRob2RJbnRlcmNlcHRvcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBSZW5kZXJLaXQgbmV3SW5zdGFuY2UoUmVuZGVyS2l0IHJlbmRlcktpdCkNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gcmVuZGVyS2l0LmdldENsYXNzKCk7DQotDQotICAgICAgICAvL2l0J3Mgbm90IHBvc3NpYmxlIHRvIHdyYXAgdGhlIGNvbnZlcnRlciBhZ2FpbiAtIG9jY3VycyBlLmcuIHVuZGVyIHNvbGFyaXMgKyBiZWEgd2VibG9naWMNCi0gICAgICAgIGlmIChQcm94eVV0aWxzLmlzUHJveGllZENsYXNzKGN1cnJlbnRDbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcktpdDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEVuaGFuY2VyIGVuaGFuY2VyID0gbmV3IEVuaGFuY2VyKCk7DQotICAgICAgICBlbmhhbmNlci5zZXRTdXBlcmNsYXNzKHJlbmRlcktpdC5nZXRDbGFzcygpKTsNCi0gICAgICAgIGVuaGFuY2VyLnNldENhbGxiYWNrKG5ldyBFeHRWYWxHZW5lcmljUmVuZGVyS2l0KHJlbmRlcktpdCkpOw0KLSAgICAgICAgZW5oYW5jZXIuc2V0Q2xhc3NMb2FkZXIoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7DQotDQotICAgICAgICByZXR1cm4gKFJlbmRlcktpdCkgZW5oYW5jZXIuY3JlYXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBpbnRlcmNlcHQoT2JqZWN0IG9iaiwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncywgTWV0aG9kUHJveHkgcHJveHkpIHRocm93cyBUaHJvd2FibGUNCi0gICAgew0KLSAgICAgICAgaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldFJlbmRlcmVyIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFJlbmRlcmVyKChTdHJpbmcpYXJnc1swXSwgKFN0cmluZylhcmdzWzFdKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImFkZFJlbmRlcmVyIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkUmVuZGVyZXIoKFN0cmluZylhcmdzWzBdLCAoU3RyaW5nKWFyZ3NbMV0sIChSZW5kZXJlcilhcmdzWzJdKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJveHkuaW52b2tlU3VwZXIob2JqLCBhcmdzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBFeHRWYWxHZW5lcmljUmVuZGVyS2l0KFJlbmRlcktpdCB3cmFwcGVkKQ0KLSAgICB7DQotICAgICAgICBzdXBlcih3cmFwcGVkKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIGNyZWF0ZVdyYXBwZXIoUmVuZGVyZXIgcmVuZGVyZXIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLm5ld0luc3RhbmNlKHJlbmRlcmVyKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTY1NTc1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZEludGVyY2VwdG9yOwotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5FbmhhbmNlcjsKLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuTWV0aG9kUHJveHk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBmaW5hbCBjbGFzcyBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyIGV4dGVuZHMgRXh0VmFsUmVuZGVyZXJXcmFwcGVyIGltcGxlbWVudHMgTWV0aG9kSW50ZXJjZXB0b3IKLXsKLSAgICBwdWJsaWMgc3RhdGljIFJlbmRlcmVyIG5ld0luc3RhbmNlKFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gcmVuZGVyZXIuZ2V0Q2xhc3MoKTsKLQotICAgICAgICAvL3RvIGF2b2lkIHJlLXdyYXBwaW5nIC0gb2NjdXJzIGUuZy4gdW5kZXIgc29sYXJpcyArIGJlYSB3ZWJsb2dpYwotICAgICAgICBpZiAoUHJveHlVdGlscy5pc1Byb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBFbmhhbmNlciBlbmhhbmNlciA9IG5ldyBFbmhhbmNlcigpOwotICAgICAgICBlbmhhbmNlci5zZXRTdXBlcmNsYXNzKHJlbmRlcmVyLmdldENsYXNzKCkpOwotICAgICAgICBlbmhhbmNlci5zZXRDYWxsYmFjayhuZXcgRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlcihyZW5kZXJlcikpOwotICAgICAgICBlbmhhbmNlci5zZXRDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLQotICAgICAgICByZXR1cm4gKFJlbmRlcmVyKSBlbmhhbmNlci5jcmVhdGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGludGVyY2VwdChPYmplY3Qgb2JqLCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzLCBNZXRob2RQcm94eSBwcm94eSkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJnZXRDb252ZXJ0ZWRWYWx1ZSIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldENvbnZlcnRlZFZhbHVlKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0sIGFyZ3NbMl0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJkZWNvZGUiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlY29kZSgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZW5jb2RlQmVnaW4iKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZUJlZ2luKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJlbmNvZGVDaGlsZHJlbiIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlQ2hpbGRyZW4oKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImVuY29kZUVuZCIpICYmIGFyZ3NbMV0gaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jb2RlRW5kKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJjb252ZXJ0Q2xpZW50SWQiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29udmVydENsaWVudElkKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFN0cmluZylhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0UmVuZGVyc0NoaWxkcmVuIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRSZW5kZXJzQ2hpbGRyZW4oKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibWV0aG9kICIgKyBtZXRob2QuZ2V0TmFtZSgpICsgIiBjYWxsZWQgd2l0aG91dCByZW5kZXJpbmctaW50ZXJjZXB0b3JzIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBwcm94eS5pbnZva2VTdXBlcihvYmosIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBFeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyKFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgewotICAgICAgICBzdXBlcih3cmFwcGVkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0dlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5MTdlNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0dlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkNCi17DQotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImV4dHZhbCByZW5kZXJraXQgd3JhcHBlciBjcmVhdGVkIGZvciAiICsgcmVuZGVyS2l0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB2aWEgY2dsaWIiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBFeHRWYWxHZW5lcmljUmVuZGVyS2l0Lm5ld0luc3RhbmNlKHJlbmRlcktpdCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3N0YXJ0dXAvR2VuZXJpY01vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3N0YXJ0dXAvR2VuZXJpY01vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTczMzE0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9zdGFydHVwL0dlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMucmVuZGVya2l0LkdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEdlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDM5MjE1NjAzMjg3NzUxOTU1Nkw7DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jbGFzcykuYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkobmV3IEdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWY2MzIwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGUNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGUgcHJvdmlkZXMgZ2VuZXJpYyBTdXBwb3J0IGZvciBKU0YgY29tcG9uZW50IGZyYW1ld29ya3Mgd2hpY2ggaGF2ZSBzcGVjaWFsIHJlcXVpcmVtZW50cyAoZS5nLiBSaWNoRmFjZXMsIE15RmFjZXMgVG9iYWdvLCAuLi4pLg0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS54IGFuZCBKU0YgMi54LiBBbGwgdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvcG9tLnhtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAyZDIzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQ29tcG9uZW50LVN1cHBvcnQgTW9kdWxlczwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjIuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvbXBvbmVudC1zdXBwb3J0PC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvY29tcG9uZW50LXN1cHBvcnQ8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvbXBvbmVudC1zdXBwb3J0PC91cmw+Ci0gICAgPC9zY20+Ci0KLSAgICA8bW9kdWxlcz4KLSAgICAgICAgPG1vZHVsZT50cmluaWRhZC1zdXBwb3J0PC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+Z2VuZXJpYy1zdXBwb3J0PC9tb2R1bGU+Ci0gICAgPC9tb2R1bGVzPgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8dHJpbmlkYWQudmVyc2lvbj4xLjIuOTwvdHJpbmlkYWQudmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvcG9tLnhtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMzZkZjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgVHJpbmlkYWQgU3VwcG9ydCBNb2R1bGU8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4yLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+Y29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOThiMmJiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+DQotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0YXJ0dXAuVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXINCi0gICAgICAgIDwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLQ0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPg0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyDQotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUwZWI2OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5DbGllbnRWYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLS8qKg0KLSAqIGluIGNhc2Ugb2YgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBhIHRyaW5pZGFkIGNsaWVudCB2YWxpZGF0b3IgaXMgYWRkZWQgdG8gdGhlIGNvbXBvbmVudCBiYXNlZCBvbiB0aGUgbWV0YS1kYXRhLg0KLSAqIGF0IHRoZSBwb3N0YmFjazogdGhlIGV4dHZhbCB2YWxpZGF0aW9uIHN0cmF0ZWd5IGdldHMgY2FsbGVkIGFuZCBhZnRlciB0aGF0IHRoZSBhZGRlZCB2YWxpZGF0b3IuDQotICogdGhpcyB3cmFwcGVyIHByZXZlbnRzIHN1Y2ggYSBzZXJ2ZXItc2lkZSBkb3VibGUgdmFsaWRhdGlvbi4NCi0gKiBpdCBqdXN0IGRlbGVnYXRlcyB0aGUgY2xpZW50LXNpZGUgZnVuY3Rpb25hbGl0eS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlciBpbXBsZW1lbnRzIFZhbGlkYXRvciwgQ2xpZW50VmFsaWRhdG9yLCBTZXJpYWxpemFibGUNCi17DQotICAgIHByaXZhdGUgdHJhbnNpZW50IENsaWVudFZhbGlkYXRvciB3cmFwcGVkOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxNDE0NTQ3ODQxNzAwNjIxNDEwTDsNCi0NCi0gICAgcHVibGljIEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcihDbGllbnRWYWxpZGF0b3IgY2xpZW50VmFsaWRhdG9yKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSBjbGllbnRWYWxpZGF0b3I7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgdmFsaWRhdGUgLSB0aGUgZXh0dmFsIHZhbGlkYXRpb24gc3RyYXRlZ3kgd2lsbCBkbyB0aGF0DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRMaWJyYXJ5U291cmNlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudExpYnJhcnlTb3VyY2UoZmFjZXNDb250ZXh0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldENsaWVudEltcG9ydE5hbWVzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q2xpZW50SW1wb3J0TmFtZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFNjcmlwdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q2xpZW50U2NyaXB0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50VmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q2xpZW50VmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9FeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NWQ5ZGIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQucmVuZGVya2l0LkV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWN0b3J5RmluZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3Rvcnk7DQotDQotLyoqDQotICogdXNlIHRoaXMgcGhhc2UtbGlzdGVuZXIgaW5zdGVhZCBvZiBhIEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZHVlIHRvIGEgdHJpbmlkYWQgaXNzdWUNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA5MTA5NzIxODMxODY0MTQ2MTY1TDsNCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIFJlbmRlcktpdEZhY3RvcnkgcmVuZGVyS2l0RmFjdG9yeSA9IGdldFJlbmRlcktpdEZhY3RvcnkoKTsNCi0NCi0gICAgICAgIFN0cmluZyByZW5kZXJLaXRJZCA9IGdldFJlbmRlcktpdElkKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBpZiAoaXNJbmNvbXBhdGlibGVSZW5kZXJLaXQocmVuZGVyS2l0SWQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoYW5nZVJlbmRlcktpdChmYWNlc0NvbnRleHQsIHJlbmRlcktpdEZhY3RvcnksIHJlbmRlcktpdElkKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRSZW5kZXJLaXRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZ2V0UmVuZGVyS2l0SWQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFJlbmRlcktpdEZhY3RvcnkgZ2V0UmVuZGVyS2l0RmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoUmVuZGVyS2l0RmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRmFjdG9yeUZpbmRlci5SRU5ERVJfS0lUX0ZBQ1RPUlkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0luY29tcGF0aWJsZVJlbmRlcktpdChTdHJpbmcgcmVuZGVyS2l0SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAhRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuSUQuZXF1YWxzKHJlbmRlcktpdElkKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgY2hhbmdlUmVuZGVyS2l0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFJlbmRlcktpdEZhY3RvcnkgcmVuZGVyS2l0RmFjdG9yeSwgU3RyaW5nIHJlbmRlcktpdElkKQ0KLSAgICB7DQotICAgICAgICBSZW5kZXJLaXQgcmVuZGVyS2l0ID0gcmVuZGVyS2l0RmFjdG9yeS5nZXRSZW5kZXJLaXQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCByZW5kZXJLaXRJZCk7DQotICAgICAgICByZW5kZXJLaXRGYWN0b3J5LmFkZFJlbmRlcktpdChFeHRWYWxUcmluaWRhZFJlbmRlcktpdC5JRCwgbmV3IEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0KHJlbmRlcktpdCkpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuc2V0UmVuZGVyS2l0SWQoRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuSUQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5SRU5ERVJfUkVTUE9OU0U7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICBpZiAodGhpcyA9PSBvKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEV4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUwY2I3NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFyZW4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICAvKg0KLSAgICAgKiBkZWFjdGl2YXRlDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfQ0xJRU5UX1NJREVfVFJJTklEQURfVkFMSURBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9DTElFTlRfU0lERV9UUklOSURBRF9WQUxJREFUSU9OIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9UUklOSURBRF9DT1JFX09VVFBVVF9MQUJFTF9JTklUSUFMSVpBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9UUklOSURBRF9DT1JFX09VVFBVVF9MQUJFTF9JTklUSUFMSVpBVElPTiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfVFJJTklEQURfVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfVFJJTklEQURfVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IiKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0RvdWJsZVJhbmdlSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMDAwZTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0RvdWJsZVJhbmdlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5Eb3VibGVSYW5nZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudmFsaWRhdG9yLkNsaWVudFZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJza2lwVmFsaWRhdGlvblN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24iKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIERvdWJsZVJhbmdlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW5mb3JtYXRpb25BZGRlZCA9IGZhbHNlOwotICAgICAgICBEb3VibGVSYW5nZVZhbGlkYXRvciBkb3VibGVSYW5nZVZhbGlkYXRvciA9IChEb3VibGVSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuRG91YmxlUmFuZ2UiKTsKLQotICAgICAgICBPYmplY3QgbWluID0gbnVsbDsKLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU5fREVGQVVMVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOX0RFRkFVTFQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWluIGluc3RhbmNlb2YgRG91YmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKChEb3VibGUpbWluKTsKLSAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IG1heCA9IG51bGw7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWF9ERUZBVUxUKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1heCBpbnN0YW5jZW9mIERvdWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bSgoRG91YmxlKW1heCk7Ci0gICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGluZm9ybWF0aW9uQWRkZWQgJiYKLSAgICAgICAgICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvciBpbnN0YW5jZW9mIENsaWVudFZhbGlkYXRvciAmJiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpZG91YmxlUmFuZ2VWYWxpZGF0b3IpKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9MZW5ndGhJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTI2YzhmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9MZW5ndGhJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBMZW5ndGhJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7Ci0gICAgICAgIC8vVE9ETwotICAgICAgICBMZW5ndGhWYWxpZGF0b3IgbGVuZ3RoVmFsaWRhdG9yID0gKExlbmd0aFZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTGVuZ3RoIik7Ci0KLSAgICAgICAgT2JqZWN0IG1pbkxlbmd0aCA9IG51bGw7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWluTGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIX0RFRkFVTFQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW5MZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEhfREVGQVVMVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtaW5MZW5ndGggaW5zdGFuY2VvZiBJbnRlZ2VyKQotICAgICAgICB7Ci0gICAgICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWluaW11bSgoSW50ZWdlciltaW5MZW5ndGgpOwotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbnVsbDsKLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEhfREVGQVVMVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heExlbmd0aCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSF9ERUZBVUxUKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1heExlbmd0aCBpbnN0YW5jZW9mIEludGVnZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudC5nZXRDbGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0TWF4aW11bUxlbmd0aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludC5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhMZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBsZW5ndGhWYWxpZGF0b3Iuc2V0TWF4aW11bSgoSW50ZWdlciltYXhMZW5ndGgpOwotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3JlSW5pdFZhbGlkYXRvcnMoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQsIG1ldGFEYXRhKTsgLy9zZWFyY2ggd3JhcHBlcnMgYW5kIGNhbGwgLmRlYWN0aXZhdGUKLQotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkICYmIGxlbmd0aFZhbGlkYXRvciBpbnN0YW5jZW9mIENsaWVudFZhbGlkYXRvcikKLSAgICAgICAgewotICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKWxlbmd0aFZhbGlkYXRvcikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobGVuZ3RoVmFsaWRhdG9yLmdldE1pbmltdW0oKSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgoQ29yZU91dHB1dExhYmVsKXVpQ29tcG9uZW50KS5zZXRTaG93UmVxdWlyZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Mb25nUmFuZ2VJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xvbmdSYW5nZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OWVlYjguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xvbmdSYW5nZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuTG9uZ1JhbmdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgTG9uZ1JhbmdlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gaW5mb3JtYXRpb25BZGRlZCA9IGZhbHNlOwotICAgICAgICBMb25nUmFuZ2VWYWxpZGF0b3IgbG9uZ1JhbmdlVmFsaWRhdG9yID0gKExvbmdSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTG9uZ1JhbmdlIik7Ci0KLSAgICAgICAgT2JqZWN0IG1pbiA9IG51bGw7Ci0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pKQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOX0RFRkFVTFQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxUKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1pbiBpbnN0YW5jZW9mIExvbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKChMb25nKW1pbik7Ci0gICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBtYXggPSBudWxsOwotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4ID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWF9ERUZBVUxUKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4ID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVhfREVGQVVMVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtYXggaW5zdGFuY2VvZiBMb25nKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bSgoTG9uZyltYXgpOwotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihpbmZvcm1hdGlvbkFkZGVkICYmCi0gICAgICAgICAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yIGluc3RhbmNlb2YgQ2xpZW50VmFsaWRhdG9yICYmIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikKLSAgICAgICAgewotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKWxvbmdSYW5nZVZhbGlkYXRvcikpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9QYXR0ZXJuSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9QYXR0ZXJuSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZmMDg4ZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuUmVnRXhwVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgUGF0dGVybkluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZighbWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4pKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBwYXR0ZXJucyA9IChTdHJpbmdbXSltZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4pOwotCi0gICAgICAgIFJlZ0V4cFZhbGlkYXRvciByZWdFeHBWYWxpZGF0b3I7Ci0KLSAgICAgICAgZm9yKFN0cmluZyBwYXR0ZXJuIDogcGF0dGVybnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZ0V4cFZhbGlkYXRvciA9IChSZWdFeHBWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5SZWdFeHAiKTsKLQotICAgICAgICAgICAgcmVnRXhwVmFsaWRhdG9yLnNldFBhdHRlcm4ocGF0dGVybik7Ci0gICAgICAgICAgICByZWdFeHBWYWxpZGF0b3Iuc2V0TWVzc2FnZURldGFpbE5vTWF0Y2goKFN0cmluZyltZXRhRGF0YS5nZXQoCi0gICAgICAgICAgICAgICAgQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFKSk7Ci0KLSAgICAgICAgICAgIGlmKHJlZ0V4cFZhbGlkYXRvciBpbnN0YW5jZW9mIENsaWVudFZhbGlkYXRvciAmJiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpcmVnRXhwVmFsaWRhdG9yKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1JlcXVpcmVkSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDRlYTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1JlcXVpcmVkSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudXRpbC5UcmluaWRhZFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIFJlcXVpcmVkSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCF2YWxpZGF0ZUVtcHR5RmllbGRzKCkgfHwgIUV4dFZhbFV0aWxzLmlzUmVxdWlyZWRJbml0aWFsaXphdGlvbkFjdGl2ZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpIHx8Ci0gICAgICAgICAgIG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKXx8Ci0gICAgICAgICAgIG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigoCi0gICAgICAgICAgICAgICAgICghQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpICYmCi0gICAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQpKSkgfHwKLSAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpCi0gICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGlzQ29tcG9uZW50UmVxdWlyZWQodWlDb21wb25lbnQpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIENvcmVPdXRwdXRMYWJlbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgoQ29yZU91dHB1dExhYmVsKXVpQ29tcG9uZW50KS5zZXRTaG93UmVxdWlyZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJgotICAgICAgICAgICAgICAgICAgICFCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIgJiYgRXh0VmFsVXRpbHMuaXNSZXF1aXJlZFJlc2V0QWN0aXZhdGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlRW1wdHlGaWVsZHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLnZhbGlkYXRlRW1wdHlGaWVsZHMoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQm9vbGVhbiBpc0NvbXBvbmVudFJlcXVpcmVkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpQ29tcG9uZW50ID0gVHJpbmlkYWRVdGlscy5maW5kTGFiZWxlZEVkaXRhYmxlQ29tcG9uZW50KChDb3JlT3V0cHV0TGFiZWwpIHVpQ29tcG9uZW50KTsKLQotICAgICAgICAgICAgaWYodWlDb21wb25lbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vY29tcGFyZSB3aXRoIGZhbHNlIHNvIHRydWUgPSB0cnVlIG9yIG51bGwKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc1JlYWRPbmx5IikpKTsKLSAgICAgICAgYm9vbGVhbiBpc0Rpc2FibGVkID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc0Rpc2FibGVkIikpKTsKLQotICAgICAgICByZXR1cm4gIShpc1JlYWRPbmx5IHx8IGlzRGlzYWJsZWQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODYwYWI1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLlRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29udGV4dC5SZXF1ZXN0Q29udGV4dDsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQEludm9jYXRpb25PcmRlcigzMDApCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dFRleHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX0RBVEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dERhdGUiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyPiBjb21wb25lbnRJbml0aWFsaXplcnMgPQotICAgICAgICBuZXcgQXJyYXlMaXN0PFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXI+KCk7Ci0KLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFJlcXVpcmVkSW5pdGlhbGl6ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IExlbmd0aEluaXRpYWxpemVyKCkpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBMb25nUmFuZ2VJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgRG91YmxlUmFuZ2VJbml0aWFsaXplcigpKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgUGF0dGVybkluaXRpYWxpemVyKCkpOwotICAgICAgICAvL2NvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFZhbGlkYXRvckluaXRpYWxpemVyKCkpOwotICAgIH0KLQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTE9XLCBkZXNjcmlwdGlvbiA9ICJjaGVjayBwcHIgaXNzdWUiKQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGZvcihUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyIDogY29tcG9uZW50SW5pdGlhbGl6ZXJzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihjb21wb25lbnRJbml0aWFsaXplci5jb25maWd1cmVUcmluaWRhZENvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkQ29tcG9uZW50VG9TdG9yYWdlKHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgICAgICB1cGRhdGVDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkQ29tcG9uZW50VG9TdG9yYWdlKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MsIFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpCi0gICAgICAgICAgICAgICAgLmFkZENvbXBvbmVudCh1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVC5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpIHx8Ci0gICAgICAgICAgICAgICBUUklOSURBRF9DT1JFX0lOUFVUX0RBVEUuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgaWYoUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuaXNQYXJ0aWFsUmVxdWVzdChmYWNlc0NvbnRleHQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXF1ZXN0Q29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5hZGRQYXJ0aWFsVGFyZ2V0KHVpQ29tcG9uZW50LmdldFBhcmVudCgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVmFsaWRhdG9ySW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzZmNGFkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQotQFVzYWdlSW5mb3JtYXRpb24odmFsdWUgPSBVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gImltcGwuIHRyaW5pZGFkIGUtbWFpbCB2YWxpZGF0b3IiKQotY2xhc3MgVmFsaWRhdG9ySW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcgotewotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmKCFtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuQ1VTVE9NKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00pOwotCi0gICAgICAgIGlmKCEodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKE9iamVjdCBjdXJyZW50VmFsdWUgOiAoTGlzdCl2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIShjdXJyZW50VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihDb21tb25NZXRhRGF0YUtleXMuRU1BSUwuZXF1YWxzKGN1cnJlbnRWYWx1ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9UT0RPCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNDY5NmIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3INCi0gICAgICAgIC5Db21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigzMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBleHRlbmRzIENvbXBvbmVudEluaXRpYWxpemF0aW9uQXdhcmVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nRm9yQ29tcG9uZW50SW5pdGlhbGl6YXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzTWV0YURhdGFFbnRyaWVzKHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0TWV0YURhdGFFbnRyaWVzKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTWV0YURhdGFFbnRyaWVzKE1ldGFEYXRhRW50cnlbXSBtZXRhRGF0YUVudHJpZXMpDQotICAgIHsNCi0gICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBlbnRyeSA6IG1ldGFEYXRhRW50cmllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAocHJvY2Vzc0VudHJ5KGVudHJ5KSAmJiBpc0NsaWVudFZhbGlkYXRpb25EaXNhYmxlZChlbnRyeSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBkaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24oZW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvL2UuZy4gcmV0dXJucyBmYWxzZSBmb3IganNyMzAzIGVudHJpZXMNCi0gICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NFbnRyeShNZXRhRGF0YUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb247DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xpZW50VmFsaWRhdGlvbkRpc2FibGVkKE1ldGFEYXRhRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkNCi0gICAgICAgICAgICAgICAgLmV4dHJhY3QoZW50cnkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5pdGVyYXRvcigpLmhhc05leHQoKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwcml2YXRlIHZvaWQgZGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uKE1ldGFEYXRhRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmKGVudHJ5LmdldFByb3BlcnR5KENvbW1vbk1ldGFEYXRhS2V5cy5ESVNBQkxFX0NMSUVOVF9TSURFX1ZBTElEQVRJT04pID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZW50cnkuc2V0UHJvcGVydHkoQ29tbW9uTWV0YURhdGFLZXlzLkRJU0FCTEVfQ0xJRU5UX1NJREVfVkFMSURBVElPTiwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGtleXNUb0Rpc2FibGUgPSBlbnRyeS5nZXRQcm9wZXJ0eShDb21tb25NZXRhRGF0YUtleXMuRElTQUJMRV9DTElFTlRfU0lERV9WQUxJREFUSU9OLCBMaXN0LmNsYXNzKTsNCi0gICAgICAgIGtleXNUb0Rpc2FibGUuYWRkKGVudHJ5LmdldEtleSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWUzYjYxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UuVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudXRpbC5UcmluaWRhZFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUuQ29yZUZvcm07DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotcHVibGljIGNsYXNzIFRyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvciBleHRlbmRzIEFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcg0KLXsNCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpDQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChmaWx0ZXJDb3JlT3V0cHV0TGFiZWwodWlDb21wb25lbnQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRDb3JlT3V0cHV0TGFiZWwoZmFjZXNDb250ZXh0LCAoQ29yZU91dHB1dExhYmVsKSB1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyRW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQ0KLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIENvcmVGb3JtKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNsZWFudXBFeHRWYWxDbGllbnRWYWxpZGF0b3JzKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFudXBFeHRWYWxDbGllbnRWYWxpZGF0b3JzKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MsIFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpDQotICAgICAgICAgICAgICAgIC5yb2xsYmFjaygpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBmaWx0ZXJDb3JlT3V0cHV0TGFiZWwoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb3JlT3V0cHV0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgQ29yZU91dHB1dExhYmVsIGNvcmVPdXRwdXRMYWJlbCkNCi0gICAgew0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gVHJpbmlkYWRVdGlscy5maW5kTGFiZWxlZEVkaXRhYmxlQ29tcG9uZW50KGNvcmVPdXRwdXRMYWJlbCk7DQotDQotICAgICAgICBpZiAodGFyZ2V0Q29tcG9uZW50ID09IG51bGwgfHwgIWlzQ29tcG9uZW50RWRpdGFibGUodGFyZ2V0Q29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhUmVzdWx0ID0gRXh0VmFsVXRpbHMuZ2V0VHJhbnNmb3JtZWRNZXRhRGF0YShmYWNlc0NvbnRleHQsIHRhcmdldENvbXBvbmVudCk7DQotDQotICAgICAgICAvL2dldCBjb21wb25lbnQgaW5pdGlhbGl6ZXIgZm9yIHRoZSBjdXJyZW50IGNvbXBvbmVudCBhbmQgY29uZmlndXJlIGl0DQotICAgICAgICAvL2Fsc28gaW4gY2FzZSBvZiBza2lwcGVkIHZhbGlkYXRpb24gdG8gcmVzZXQgZS5nLiB0aGUgcmVxdWlyZWQgYXR0cmlidXRlDQotICAgICAgICBpZiAoIW1ldGFEYXRhUmVzdWx0LmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5jb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoZmFjZXNDb250ZXh0LCBjb3JlT3V0cHV0TGFiZWwsIG1ldGFEYXRhUmVzdWx0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDb21wb25lbnRFZGl0YWJsZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgLy9jb21wYXJlIHdpdGggZmFsc2Ugc28gdHJ1ZSA9IHRydWUgb3IgbnVsbA0KLSAgICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNSZWFkT25seSIpKSk7DQotICAgICAgICBib29sZWFuIGlzRGlzYWJsZWQgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc0Rpc2FibGVkIikpKTsNCi0NCi0gICAgICAgIHJldHVybiAhKGlzUmVhZE9ubHkgfHwgaXNEaXNhYmxlZCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODU0NjEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5MYWJlbGVkTWVzc2FnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5leGNlcHRpb24uUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbnRleHQuUmVxdWVzdENvbnRleHQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dFRleHQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJTklEQURfQ09SRV9JTlBVVF9EQVRFDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUuaW5wdXQuQ29yZUlucHV0RGF0ZSI7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb1JlZnJlc2hDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgICAgIHRyeVRvUGxhY2VMYWJlbEluRmFjZXNNZXNzYWdlKHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvUGxhY2VMYWJlbEluRmFjZXNNZXNzYWdlKA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHRyeVRvSGFuZGxlUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24odWlDb21wb25lbnQsIHZhbGlkYXRvckV4Y2VwdGlvbik7DQotDQotICAgICAgICBTdHJpbmcgbGFiZWwgPSBkZXRlY3RMYWJlbFRleHQobWV0YURhdGFFbnRyeSwgdWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0xhYmVsKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSwgbGFiZWwpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGRldGVjdExhYmVsVGV4dChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbGFiZWwgPSBnZXRMYWJlbCh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBsYWJlbCA9IGdldENsaWVudElkQXNGYWxsYmFja0lmTmVlZGVkKHVpQ29tcG9uZW50LCBsYWJlbCk7DQotDQotICAgICAgICBsYWJlbCA9IHRyeVRvT3ZlcnJpZGVMYWJlbElmUHJvdmlkZWRNYW51YWxseShtZXRhRGF0YUVudHJ5LCBsYWJlbCk7DQotICAgICAgICByZXR1cm4gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NMYWJlbChGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIExhYmVsZWRNZXNzYWdlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgICgoTGFiZWxlZE1lc3NhZ2UpZmFjZXNNZXNzYWdlKS5zZXRMYWJlbFRleHQobGFiZWwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9pZiBzb21lb25lIHVzZXMgYSBub3JtYWwgZmFjZXMgbWVzc2FnZQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwoZmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvT3ZlcnJpZGVMYWJlbElmUHJvdmlkZWRNYW51YWxseShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwsIFN0cmluZy5jbGFzcyk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xpZW50SWRBc0ZhbGxiYWNrSWZOZWVkZWQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgaWYobGFiZWwgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBsYWJlbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9IYW5kbGVSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdG9yRXhjZXB0aW9uIGluc3RhbmNlb2YgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKTsNCi0gICAgICAgICAgICBTdHJpbmcgaW5saW5lTWVzc2FnZSA9IGdldElubGluZVJlcXVpcmVkTWVzc2FnZSh1aUNvbXBvbmVudCk7DQotDQotICAgICAgICAgICAgaWYoaW5saW5lTWVzc2FnZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoaW5saW5lTWVzc2FnZSk7DQotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoaW5saW5lTWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1JlZnJlc2hDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmKFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmlzUGFydGlhbFJlcXVlc3QoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBSZXF1ZXN0Q29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5hZGRQYXJ0aWFsVGFyZ2V0KHVpQ29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAoVFJJTklEQURfQ09SRV9JTlBVVF9URVhULmVxdWFscyh1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSkgfHwNCi0gICAgICAgICAgICAgICAgIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURS5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRMYWJlbChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldExhYmVsIikpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldElubGluZVJlcXVpcmVkTWVzc2FnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldFJlcXVpcmVkTWVzc2FnZURldGFpbCIpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGI0NWU5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcktpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcktpdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuUmVuZGVyS2l0RGVjb3JhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuY29yZS5Db3JlUmVuZGVyS2l0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZXNwb25zZVN0YXRlTWFuYWdlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVdyaXRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5Xcml0ZXI7DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0IGV4dGVuZHMgUmVuZGVyS2l0RGVjb3JhdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgRXh0VmFsUmVuZGVyS2l0IGV4dFZhbFJlbmRlcktpdDsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiRVhUVkFMX1RSSU5JREFEX1JFTkRFUktJVCI7DQotDQotICAgIHB1YmxpYyBFeHRWYWxUcmluaWRhZFJlbmRlcktpdChSZW5kZXJLaXQgd3JhcHBlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5leHRWYWxSZW5kZXJLaXQgPSBuZXcgRXh0VmFsUmVuZGVyS2l0KHdyYXBwZWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlLCBSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5leHRWYWxSZW5kZXJLaXQuYWRkUmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUsIHJlbmRlcmVyKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFJlbmRlcmVyIGdldFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5nZXRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBSZXNwb25zZVN0YXRlTWFuYWdlciBnZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5nZXRSZXNwb25zZVN0YXRlTWFuYWdlcigpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUmVzcG9uc2VXcml0ZXIgY3JlYXRlUmVzcG9uc2VXcml0ZXIoV3JpdGVyIHdyaXRlciwgU3RyaW5nIHMsIFN0cmluZyBzMSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmNyZWF0ZVJlc3BvbnNlV3JpdGVyKHdyaXRlciwgcywgczEpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdHJlYW0gY3JlYXRlUmVzcG9uc2VTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmNyZWF0ZVJlc3BvbnNlU3RyZWFtKG91dHB1dFN0cmVhbSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZWNvcmF0ZWRSZW5kZXJLaXRJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBDb3JlUmVuZGVyS2l0LkJBU0VfUkVOREVSX0tJVF9JRDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5LmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMjcwMWYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnJlbmRlcmtpdC5jb3JlLnhodG1sLnRhYmxlLlRhYmxlUmVuZGVyaW5nQ29udGV4dDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIHNvbHV0aW9uIGZvciB0cmluaWRhZCB0YWJsZSByZW5kZXJlciBpc3N1ZSAoaW4gY29ubmVjdGlvbiB3aXRoIGRvdWJsZSBjYWxsIHByZXZlbnRpb24gcHJveGllcykNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1wdWJsaWMgY2xhc3MgRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5IGV4dGVuZHMgRXh0VmFsUmVuZGVyZXJQcm94eQ0KLXsNCi0gICAgcHVibGljIEV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikNCi0gICAgew0KLSAgICAgICAgc3VwZXIocmVuZGVyZXIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wdGlvbmFsS2V5KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZihUYWJsZVJlbmRlcmluZ0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gInwiICsgVGFibGVSZW5kZXJpbmdDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFJlbmRlclN0YWdlKCkuZ2V0U3RhZ2UoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAiIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdGFydHVwL1RyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdGFydHVwL1RyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0Yjc1NmIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkFic3RyYWN0U3RhcnR1cExpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VySG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50LlRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLlRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UuRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudmFsaWRhdGlvbi5tZXNzYWdlLlRyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdC5FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvci5UcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yLlRyaW5pZGFkUmVuZGVyZXJJbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yLlRyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBhbHRlcm5hdGl2ZSBhcHByb2FjaCBmb3IgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFRyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04MDM0MDg5MjQ0OTAzOTY2OTk5TDsNCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIGRlYWN0aXZhdGVEZWZhdWx0RXh0VmFsUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsNCi0NCi0gICAgICAgIGluaXRDbGllbnRTaWRlVmFsaWRhdGlvblN1cHBvcnQoKTsNCi0NCi0gICAgICAgIGluaXRMYWJlbEluaXRpYWxpemF0aW9uU3VwcG9ydCgpOw0KLQ0KLSAgICAgICAgaW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRpb24oKTsNCi0NCi0gICAgICAgIHJlcGxhY2VEZWZhdWx0UHJveHlXaXRoVHJpbmlkYWRSZW5kZXJlclByb3h5KCk7DQotDQotICAgICAgICBpbml0VHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5KCk7DQotICAgICAgICAvKg0KLSAgICAgICAgICogaWYgdGhlcmUgYXJlIGZ1cnRoZXIgaW5jb21wYXRpYmxlIHJlbmRlcmVycyB1c2UgdGhlIGZvbGxvd2luZyBxdWljay1maXg6DQotICAgICAgICAgKiAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSwgbnVsbCk7DQotICAgICAgICAgICBhdHRlbnRpb246IGl0IGNhdXNlcyBkaXJlY3QgZGVsZWdhdGlvbiB3aXRob3V0IGEgY2hlY2sgb2YgZG91YmxlIGludm9jYXRpb25zDQotICAgICAgICAgKi8NCi0NCi0gICAgICAgIGluaXRUcmluaWRhZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKCk7DQotDQotICAgICAgICBpbml0VHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlKCk7DQotDQotICAgICAgICBpbml0UmVxdWlyZWRJbml0aWFsaXphdGlvbigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBkZWFjdGl2YXRlRGVmYXVsdEV4dFZhbFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpLmRlYWN0aXZhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdENsaWVudFNpZGVWYWxpZGF0aW9uU3VwcG9ydCgpDQotICAgIHsNCi0gICAgICAgIGlmKGlzQ2xpZW50U2lkZVZhbGlkYXRpb25TdXBwb3J0RW5hYmxlZChXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DTElFTlRfU0lERV9UUklOSURBRF9WQUxJREFUSU9OKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdExhYmVsSW5pdGlhbGl6YXRpb25TdXBwb3J0KCkNCi0gICAgew0KLSAgICAgICAgaWYoaXNMYWJlbEluaXRpYWxpemF0aW9uRW5hYmxlZChXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9UUklOSURBRF9DT1JFX09VVFBVVF9MQUJFTF9JTklUSUFMSVpBVElPTikpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKG5ldyBUcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0aW9uKCkNCi0gICAgew0KLSAgICAgICAgaWYodXNlVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdGlvbihXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9UUklOSURBRF9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUikpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKG5ldyBUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVwbGFjZURlZmF1bHRQcm94eVdpdGhUcmluaWRhZFJlbmRlcmVyUHJveHkoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVksIEV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0VHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY3RvcnlOYW1lcy5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkubmFtZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0VHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcigpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG5ldyBUcmluaWRhZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0VHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwgU3RvcmFnZU1hbmFnZXJIb2xkZXIuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5zZXRTdG9yYWdlTWFuYWdlcihUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTWFuYWdlcigpLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTGFiZWxJbml0aWFsaXphdGlvbkVuYWJsZWQoU3RyaW5nIGRlYWN0aXZhdGVJbml0Q29yZU91dHB1dExhYmVsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGVhY3RpdmF0ZUluaXRDb3JlT3V0cHV0TGFiZWwgPT0gbnVsbCB8fCAhZGVhY3RpdmF0ZUluaXRDb3JlT3V0cHV0TGFiZWwuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NsaWVudFNpZGVWYWxpZGF0aW9uU3VwcG9ydEVuYWJsZWQoU3RyaW5nIGRlYWN0aXZhdGVDbGllbnRTaWRlVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRlYWN0aXZhdGVDbGllbnRTaWRlVmFsaWRhdGlvbiA9PSBudWxsIHx8ICFkZWFjdGl2YXRlQ2xpZW50U2lkZVZhbGlkYXRpb24uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0aW9uKFN0cmluZyBkZWFjdGl2YXRlVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkZWFjdGl2YXRlVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgPT0gbnVsbCB8fA0KLSAgICAgICAgICAgICAgICAhZGVhY3RpdmF0ZVRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UmVxdWlyZWRJbml0aWFsaXphdGlvbigpDQotICAgIHsNCi0gICAgICAgIGlmKCFpc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25EZWFjdGl2YXRlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KCJtb2RlOmluaXQ6cmVxdWlyZWQiLCBCb29sZWFuLlRSVUUsIHRydWUpOw0KLQ0KLSAgICAgICAgICAgIC8vdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgc2V2ZXJpdHkgYXdhcmUgdmFsaWRhdGlvbiAtPiBkb24ndCByZXNldCB0aGUgdmFsdWUNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eSgibW9kZTpyZXNldDpyZXF1aXJlZCIsIEJvb2xlYW4uRkFMU0UsIGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNSZXF1aXJlZEluaXRpYWxpemF0aW9uRGVhY3RpdmF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gImZhbHNlIi5lcXVhbHNJZ25vcmVDYXNlKA0KLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXIuQUNUSVZBVEVfUkVRVUlSRURfSU5JVElBTElaQVRJT04pOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ1NDI1NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZSBpbXBsZW1lbnRzIFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZQ0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PFVJQ29tcG9uZW50PiBjb21wb25lbnRMaXN0ID0gbmV3IEFycmF5TGlzdDxVSUNvbXBvbmVudD4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkQ29tcG9uZW50KFVJQ29tcG9uZW50IHRyaW5pZGFkQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZighdGhpcy5jb21wb25lbnRMaXN0LmNvbnRhaW5zKHRyaW5pZGFkQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmNvbXBvbmVudExpc3QuYWRkKHRyaW5pZGFkQ29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByb2xsYmFjaygpDQotICAgIHsNCi0gICAgICAgIGZvciAoVUlDb21wb25lbnQgY29tcG9uZW50IDogdGhpcy5jb21wb25lbnRMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlbW92ZVRyaW5pZGFkVmFsaWRhdG9yV3JhcHBlcihjb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdGhpcy5jb21wb25lbnRMaXN0LmNsZWFyKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVRyaW5pZGFkVmFsaWRhdG9yV3JhcHBlcihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZW1vdmVXcmFwcGVyRnJvbUNvbXBvbmVudCh1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgLy90byBrZWVwIHRoZSBzb3VyY2UgaW4gc3luYyB3aXRoIG9sZGVyIHZlcnNpb25zDQotICAgICAgICAgICAgZm9yIChPYmplY3QgY2hpbGQgOiB1aUNvbXBvbmVudC5nZXRDaGlsZHJlbigpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVtb3ZlVHJpbmlkYWRWYWxpZGF0b3JXcmFwcGVyKChVSUNvbXBvbmVudCljaGlsZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZW1vdmVXcmFwcGVyRnJvbUNvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgZm9yIChWYWxpZGF0b3IgdmFsaWRhdG9yIDogKChFZGl0YWJsZVZhbHVlSG9sZGVyKSB1aUNvbXBvbmVudCkuZ2V0VmFsaWRhdG9ycygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpIHVpQ29tcG9uZW50KS5yZW1vdmVWYWxpZGF0b3IodmFsaWRhdG9yKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU1hbmFnZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MDFkYzUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5TdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBjb21wb25lbnQgZW50cmllcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyDQotICAgICAgICBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2U+DQotew0KLSAgICBwdWJsaWMgRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX1RSSU5JREFEX0NMSUVOVF9WQUxJREFUT1I6S0VZIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL1RyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9UcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc4M2NiOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL1RyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLQ0KLS8qKg0KLSAqIGV4dHZhbCBpbmplY3RzIGNsaWVudC12YWxpZGF0b3JzIGludG8gdHJpbmlkYWQgY29tcG9uZW50cyBiYXNlZCBvbiBtZXRhLWRhdGEuDQotICogc28gY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBpcyBzdXBwb3J0ZWQuIHNvbWUgYXBwLXNlcnZlcnMgc2hvdyBhIGRpZmZlcmVudCBiZWhhdmlvdXIuDQotICogdGhhdCdzIHRoZSByZWFzb24gZm9yIHN0b3JpbmcgdGhlc2UgY29tcG9uZW50cyBhbmQgcmVtb3ZlIHRoZSBpbmplY3RlZCB2YWxpZGF0b3JzIGFmdGVyIHRoZSByZW5kZXJpbmcgcGhhc2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlDQotew0KLSAgICB2b2lkIGFkZENvbXBvbmVudChVSUNvbXBvbmVudCB0cmluaWRhZENvbXBvbmVudCk7DQotICAgIHZvaWQgcm9sbGJhY2soKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL21hcHBlci9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlNjliMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL21hcHBlci9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UuVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZS5EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigzMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdXRpbC9UcmluaWRhZFV0aWxzLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC91dGlsL1RyaW5pZGFkVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE2MzgzMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC91dGlsL1RyaW5pZGFkVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImNoZWNrIHN1YmZvcm0iKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZFV0aWxzDQotew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhUcmluaWRhZFV0aWxzLmNsYXNzKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBVSUNvbXBvbmVudCBmaW5kTGFiZWxlZEVkaXRhYmxlQ29tcG9uZW50KENvcmVPdXRwdXRMYWJlbCBjb3JlT3V0cHV0TGFiZWwpDQotICAgIHsNCi0gICAgICAgIC8vVE9ETw0KLSAgICAgICAgaWYoaXNMYWJlbFRhcmdldEF2YWlsYWJsZShjb3JlT3V0cHV0TGFiZWwpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFVJQ29tcG9uZW50IHJlc3VsdCA9IHJlc29sdmVMYWJlbFRhcmdldChmYWNlc0NvbnRleHQsIGNvcmVPdXRwdXRMYWJlbCk7DQotDQotICAgICAgICBpZihyZXN1bHQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihMT0cuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBMT0cudHJhY2UoY29yZU91dHB1dExhYmVsLmdldENsaWVudElkKGZhY2VzQ29udGV4dCkgKyAiIGRvZXNuJ3QgcmVmZXJlbmNlIGFuIGVkaXRhYmxlIGNvbXBvbmVudCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgVUlDb21wb25lbnQgcmVzb2x2ZUxhYmVsVGFyZ2V0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIENvcmVPdXRwdXRMYWJlbCBjb3JlT3V0cHV0TGFiZWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5maW5kQ29tcG9uZW50KGNvcmVPdXRwdXRMYWJlbC5nZXRGb3IoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xhYmVsVGFyZ2V0QXZhaWxhYmxlKENvcmVPdXRwdXRMYWJlbCBjb3JlT3V0cHV0TGFiZWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb3JlT3V0cHV0TGFiZWwuZ2V0Rm9yKCkgPT0gbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYzIxY2MuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnZhbGlkYXRpb24ubWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkRlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkgZXh0ZW5kcyBEZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzTGFiZWxlZEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlIGluc3RhbmNlb2YgVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgRmFjZXNNZXNzYWdlIGNyZWF0ZShGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZShzZXZlcml0eSwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC92YWxpZGF0aW9uL21lc3NhZ2UvVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZTY5M2IuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5MYWJlbGVkTWVzc2FnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnV0aWwuTGFiZWxlZEZhY2VzTWVzc2FnZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIFRyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZSBleHRlbmRzIExhYmVsZWRGYWNlc01lc3NhZ2UgaW1wbGVtZW50cyBMYWJlbGVkTWVzc2FnZQ0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjM1NjgwMDY4OTk2MTUwNTE1NEw7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSID0gIj8/PyI7DQotDQotICAgIHB1YmxpYyBUcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UoU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihzZXZlcml0eSwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsVGV4dCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRMYWJlbEFzU3RyaW5nKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VtbWFyeSgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZSByZXN1bHQgPSB0cnlUb1BsYWNlTGFiZWwoc3VwZXIuZ2V0U3VtbWFyeSgpKTsNCi0NCi0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdXBlci5zZXRTdW1tYXJ5KHJlc3VsdC5nZXRTdW1tYXJ5KCkpOw0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQuZ2V0U3VtbWFyeSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFN1bW1hcnkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBnZXREZXRhaWwoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UgcmVzdWx0ID0gdHJ5VG9QbGFjZUxhYmVsKHN1cGVyLmdldERldGFpbCgpKTsNCi0NCi0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdXBlci5zZXREZXRhaWwocmVzdWx0LmdldERldGFpbCgpKTsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmdldERldGFpbCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldERldGFpbCgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgRmFjZXNNZXNzYWdlIHRyeVRvUGxhY2VMYWJlbChTdHJpbmcgb3JpZ2luYWxNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBpZiAoaXNWYWxpZE1lc3NhZ2Uob3JpZ2luYWxNZXNzYWdlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBGYWNlc01lc3NhZ2UgbmV3RmFjZXNNZXNzYWdlID0gY3JlYXRlT3JpZ2luYWxGYWNlc01lc3NhZ2UoKTsNCi0gICAgICAgICAgICB0cnlUb1BsYWNlTGFiZWxJbihuZXdGYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIHJldHVybiBuZXdGYWNlc01lc3NhZ2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEZhY2VzTWVzc2FnZSBjcmVhdGVPcmlnaW5hbEZhY2VzTWVzc2FnZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRmFjZXNNZXNzYWdlKHN1cGVyLmdldFNldmVyaXR5KCksIHN1cGVyLmdldFN1bW1hcnkoKSwgc3VwZXIuZ2V0RGV0YWlsKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1BsYWNlTGFiZWxJbihGYWNlc01lc3NhZ2UgbmV3RmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbGFiZWwgPSBnZXRMYWJlbFRleHQoKTsNCi0NCi0gICAgICAgIGlmKGxhYmVsICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwobmV3RmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkTWVzc2FnZShTdHJpbmcgb3JpZ2luYWxNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIShvcmlnaW5hbE1lc3NhZ2UgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICBvcmlnaW5hbE1lc3NhZ2Uuc3RhcnRzV2l0aChNSVNTSU5HX1JFU09VUkNFX01BUktFUikgJiYNCi0gICAgICAgICAgICAgICAgb3JpZ2luYWxNZXNzYWdlLmVuZHNXaXRoKE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyBsYWJlbCkNCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0TGFiZWwobGFiZWwpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQyOGMyZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIC0tLS0tLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgVHJpbmlkYWQgU3VwcG9ydCBNb2R1bGUgcHJvdmlkZXMgc3BlY2lhbCBUcmluaWRhZCBTdXBwb3J0IGZvciBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yLg0KLSAgICBGdXJ0aGVybW9yZSwgaXQgYWxsb3dzIHRvIGpvaW4gdGhlIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gbWVjaGFuaXNtIG9mIFRyaW5pZGFkLiBTYW1wbGUgdXNlLWNhc2U6IGFubm90YXRlIHlvdXIgbW9kZWwgd2l0aCBKUEEgMS4wIGFubm90YXRpb25zLCBiaW5kIHByb3BlcnRpZXMgdG8gSlNGIElucHV0IGNvbXBvbmVudHMgYW5kIGdldCBhdXRvbWF0aWMgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBqdXN0IGJ5IGFkZGluZyAzIEpBUiBmaWxlcyAoTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlLCBQcm9wZXJ0eSBWYWxpZGF0aW9uIGFuZCBUcmluaWRhZCBTdXBwb3J0KS4NCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEueCBhbmQgSlNGIDIueC4gQWxsIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvcG9tLnhtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZmZmZTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQ29yZTwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjIuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvY29yZTwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvcmU8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2NvcmU8L3VybD4KLSAgICA8L3NjbT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDRkYzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4NCi0gICAgPGZhY3Rvcnk+DQotICAgICAgICA8cmVuZGVyLWtpdC1mYWN0b3J5Pm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXRGYWN0b3J5PC9yZW5kZXIta2l0LWZhY3Rvcnk+DQotICAgIDwvZmFjdG9yeT4NCi0NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkV4dFZhbFN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkNWQxYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotDQotLyoqDQotICogZG9udCd0IG1vdmUgdG8gYW4gb3RoZXIgcGFja2FnZSEhIQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIEV4dFZhbEluZm9ybWF0aW9uDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FID0gRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJYTUxfUEFSQU1fUFJFRklYID0gRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gQ2xhc3NVdGlscy5nZXRKYXJWZXJzaW9uKEV4dFZhbEluZm9ybWF0aW9uLmNsYXNzKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9DdXN0b21JbmZvcm1hdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9DdXN0b21JbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmRhMzllLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ3VzdG9tSW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkNCi1wdWJsaWMgZW51bSBDdXN0b21JbmZvcm1hdGlvbg0KLXsNCi0gICAgQkFTRV9QQUNLQUdFLA0KLQ0KLSAgICBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiwNCi0gICAgVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SLA0KLQ0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgsDQotICAgIFZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYLA0KLSAgICBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfUE9TVEZJWCwNCi0NCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NU0dfUkVTT0xWRVJfTkFNRV9NQVBQRVIsDQotICAgIE1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSLA0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUiwNCi0NCi0gICAgU1RBUlRVUF9MSVNURU5FUiwNCi0gICAgQ09NUE9ORU5UX0lOSVRJQUxJWkVSLA0KLSAgICBWQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgUFJPUEVSVFlfVkFMSURBVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IsDQotDQotICAgIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwNCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLA0KLSAgICBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLA0KLSAgICBWQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWSwNCi0gICAgVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWSwNCi0gICAgTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksDQotICAgIEZBQ0VTX01FU1NBR0VfRkFDVE9SWSwNCi0gICAgU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlksDQotDQotICAgIE1FU1NBR0VfQlVORExFX05BTUUsDQotICAgIFNUQVRJQ19TVFJBVEVHWV9NQVBQSU5HX1NPVVJDRSwNCi0NCi0gICAgTUVUQV9EQVRBX1NUT1JBR0VfRklMVEVSDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0RlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGIzYzU0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyIGltcGxlbWVudHMgUHJvamVjdFN0YWdlUmVzb2x2ZXINCi17DQotICAgIHB1YmxpYyBQcm9qZWN0U3RhZ2UgZ2V0Q3VycmVudFByb2plY3RTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgdXNlIHRoZSBkZWZhdWx0IGV4dHZhbCBtZWNoYW5pc20gdG8gYXZvaWQgdG9vIGVhcmx5IGV2YWx1YXRpb24gd2l0aCBtb2phcnJhDQotICAgICAgICBTdHJpbmcgcmVzdWx0Ow0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcigiamF2YXguZmFjZXMuUFJPSkVDVF9TVEFHRSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVQcm9qZWN0U3RhZ2UoZ2V0RGVmYXVsdFByb2plY3RTdGFnZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsIHx8ICIiLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVQcm9qZWN0U3RhZ2UoZ2V0RGVmYXVsdFByb2plY3RTdGFnZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjcmVhdGVQcm9qZWN0U3RhZ2UoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShyZXN1bHQudHJpbSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFByb2plY3RTdGFnZSBjcmVhdGVQcm9qZWN0U3RhZ2UoUHJvamVjdFN0YWdlTmFtZSBwcm9qZWN0U3RhZ2VOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlKHByb2plY3RTdGFnZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgUHJvamVjdFN0YWdlTmFtZSBnZXREZWZhdWx0UHJvamVjdFN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldERlZmF1bHRTdGFnZU5hbWUoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHQuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mjg5NWJmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5EZWZhdWx0RmFjdG9yeUZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIEV4dFZhbENvbnRleHQKLXsKLSAgICBwcml2YXRlIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgc3RhdGljIEV4dFZhbENvbnRleHQgZXh0VmFsQ29udGV4dDsKLQotICAgIC8vZG9uJ3QgdHJ5IHRvIHJlc29sdmUgaXQgZHluYW1pY2FsbHkgZS5nLiB2aWEgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gLSB0aGVyZSdzIGEgbW9qYXJyYSBpc3N1ZQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fRVhUVkFMX0NPTlRFWFRfQ0xBU1NfTkFNRSA9Ci0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmNsYXNzLmdldE5hbWUoKS5yZXBsYWNlKCIuY29yZS4iLCAiLmN1c3RvbS4iKTsKLQotICAgIHByaXZhdGUgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOwotICAgIHByaXZhdGUgRmFjdG9yeUZpbmRlciBmYWN0b3J5RmluZGVyID0gRGVmYXVsdEZhY3RvcnlGaW5kZXIuZ2V0SW5zdGFuY2UoKTsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFJlbmRlcmVySW50ZXJjZXB0b3I+IHJlbmRlcmVySW50ZXJjZXB0b3JzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBSZW5kZXJlckludGVyY2VwdG9yPigpOwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGRlbmllZEludGVyY2VwdG9ycyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIHByaXZhdGUgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyPiBwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycyA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI+KCk7Ci0KLSAgICBwcml2YXRlIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGdsb2JhbFByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgIHByaXZhdGUgTWFwPFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcywgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4+IHN0YXRpY0NvbmZpZ01hcAotICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMsIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+PigpOwotCi0gICAgcHJpdmF0ZSBFeHRWYWxDb250ZXh0SW50ZXJuYWxzIGNvbnRleHRIZWxwZXI7Ci0gICAgcHJpdmF0ZSBFeHRWYWxDb250ZXh0SW52b2NhdGlvbk9yZGVyQXdhcmVJbnRlcm5hbHMgaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyOwotCi0gICAgcHJvdGVjdGVkIEV4dFZhbENvbnRleHQoKQotICAgIHsKLSAgICAgICAgdGhpcy5jb250ZXh0SGVscGVyID0gbmV3IEV4dFZhbENvbnRleHRJbnRlcm5hbHMoKTsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIgPSBuZXcgRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzKHRoaXMuY29udGV4dEhlbHBlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFeHRWYWxDb250ZXh0IGdldENvbnRleHQoKQotICAgIHsKLSAgICAgICAgaWYgKGV4dFZhbENvbnRleHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZXh0VmFsQ29udGV4dCA9IG5ldyBFeHRWYWxDb250ZXh0KCk7Ci0KLSAgICAgICAgICAgIHRyeVRvQ3JlYXRlQ3VzdG9tRXh0VmFsQ29udGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBleHRWYWxDb250ZXh0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdHJ5VG9DcmVhdGVDdXN0b21FeHRWYWxDb250ZXh0KCkKLSAgICB7Ci0gICAgICAgIE9iamVjdCBjdXN0b21FeHRWYWxDb250ZXh0ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKENVU1RPTV9FWFRWQUxfQ09OVEVYVF9DTEFTU19OQU1FKTsKLQotICAgICAgICBpZiAoY3VzdG9tRXh0VmFsQ29udGV4dCBpbnN0YW5jZW9mIEV4dFZhbENvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4dFZhbENvbnRleHQgPSAoRXh0VmFsQ29udGV4dCkgY3VzdG9tRXh0VmFsQ29udGV4dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKQotICAgIHsKLSAgICAgICAgc2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcih2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKAotICAgICAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLCBib29sZWFuIGZvcmNlT3ZlcnJpZGUpCi0gICAgewotICAgICAgICBpZiAodGhpcy52aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyID09IG51bGwgfHwgZm9yY2VPdmVycmlkZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRoaXMubG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSAmJiB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyh2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmdldENsYXNzKCkgKyAiIGlzIHVzZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciA9IHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBnZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCkKLSAgICB7Ci0gICAgICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgcmVxdWVzdFNjb3BlZEludGVycHJldGVyID0gdGhpcy5jb250ZXh0SGVscGVyCi0gICAgICAgICAgICAgICAgLmdldFJlcXVlc3RTY29wZWRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7Ci0KLSAgICAgICAgaWYocmVxdWVzdFNjb3BlZEludGVycHJldGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZXF1ZXN0U2NvcGVkSW50ZXJwcmV0ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpcy52aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBGYWN0b3J5RmluZGVyCi0gICAgKi8KLSAgICBwdWJsaWMgRmFjdG9yeUZpbmRlciBnZXRGYWN0b3J5RmluZGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZhY3RvcnlGaW5kZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmFjdG9yeUZpbmRlcihGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIpCi0gICAgewotICAgICAgICBpZiAoZmFjdG9yeUZpbmRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZhY3RvcnlGaW5kZXIgPSBmYWN0b3J5RmluZGVyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKQotICAgIHsKLSAgICAgICAgc2V0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3Ioc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLCBib29sZWFuIGZvcmNlT3ZlcnJpZGUpCi0gICAgewotICAgICAgICBpZiAodGhpcy5za2lwVmFsaWRhdGlvbkV2YWx1YXRvciA9PSBudWxsIHx8IGZvcmNlT3ZlcnJpZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc0luZm9FbmFibGVkKCkgJiYgc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmdldENsYXNzKCkgKyAiIGlzIHVzZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMuc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IgPSBza2lwVmFsaWRhdGlvbkV2YWx1YXRvcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvciBnZXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcigpCi0gICAgewotICAgICAgICBpZiAodGhpcy5za2lwVmFsaWRhdGlvbkV2YWx1YXRvciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBza2lwVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YUVudHJ5IGVudHJ5KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpcy5za2lwVmFsaWRhdGlvbkV2YWx1YXRvcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJlbmRlcmVySW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8UmVuZGVyZXJJbnRlcmNlcHRvcj4gZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8UmVuZGVyZXJJbnRlcmNlcHRvcj4odGhpcy5yZW5kZXJlckludGVyY2VwdG9ycy52YWx1ZXMoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoRXh0VmFsQ29udGV4dC5jbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRoaXMuZGVuaWVkSW50ZXJjZXB0b3JzLmNvbnRhaW5zKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRoaXMucmVuZGVyZXJJbnRlcmNlcHRvcnMucHV0KHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpLCByZW5kZXJlckludGVyY2VwdG9yKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihDbGFzczw/IGV4dGVuZHMgUmVuZGVyZXJJbnRlcmNlcHRvcj4gcmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3MocmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKEV4dFZhbENvbnRleHQuY2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucmVuZGVyZXJJbnRlcmNlcHRvcnMucmVtb3ZlKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vaWYgYW4gaW50ZXJjZXB0b3IgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZCBzbyBmYXIsIGl0IHNob3VsZCBiZSBkZW5pZWQgYXQgZnV0dXJlIHJlZ2lzdHJhdGlvbnMKLSAgICBwdWJsaWMgdm9pZCBkZW55UmVuZGVyZXJJbnRlcmNlcHRvcihDbGFzczw/IGV4dGVuZHMgUmVuZGVyZXJJbnRlcmNlcHRvcj4gcmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3MocmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKEV4dFZhbENvbnRleHQuY2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghdGhpcy5kZW5pZWRJbnRlcmNlcHRvcnMuY29udGFpbnMocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZGVuaWVkSW50ZXJjZXB0b3JzLmFkZChyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVyZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IocmVuZGVyZXJJbnRlcmNlcHRvckNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENvbXBvbmVudEluaXRpYWxpemVycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENvbXBvbmVudEluaXRpYWxpemVyKENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRDb21wb25lbnRJbml0aWFsaXplcnMoKTsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIoY29tcG9uZW50SW5pdGlhbGl6ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPiBnZXRDb21wb25lbnRJbml0aWFsaXplcnMoKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRDb21wb25lbnRJbml0aWFsaXplcnMoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmdldENvbXBvbmVudEluaXRpYWxpemVycygpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcihWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcih2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4gZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmdldFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYWxsIGdsb2JhbCB2YWxpZGF0aW9uIGludGVyY2VwdG9ycwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBnZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBnZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IoQ2xhc3MgbW9kdWxlS2V5KQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc0Zvcihtb2R1bGVLZXkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhbGwgZ2xvYmFsIG1ldGEtZGF0YSBleHRyYWN0aW9uIGludGVyY2VwdG9ycwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnNGb3IoQ2xhc3MgbW9kdWxlS2V5KQotICAgIHsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLSAgICAgICAgaWYobW9kdWxlS2V5ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpLCBtb2R1bGVLZXkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnNXaXRoKHByb3BlcnRpZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnNXaXRoKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmxhenlJbml0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHJldHVybiB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5nZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnNXaXRoKHByb3BlcnRpZXMpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyPiBnZXRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIgcHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcikKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMuYWRkKHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogSW5mb3JtYXRpb25Qcm92aWRlckJlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dEhlbHBlci5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogU3RhdGljQ29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBnZXRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcyBuYW1lKQotICAgIHsKLSAgICAgICAgaWYgKCF0aGlzLnN0YXRpY0NvbmZpZ01hcC5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gc3RhdGljQ29uZmlnTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgICAgICB0aGlzLnN0YXRpY0NvbmZpZ01hcC5wdXQobmFtZSwgc3RhdGljQ29uZmlnTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGljQ29uZmlnTWFwLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcyBuYW1lLCBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IHN0YXRpY0NvbmZpZ0xpc3Q7Ci0gICAgICAgICAgICBpZiAoIXRoaXMuc3RhdGljQ29uZmlnTWFwLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRpY0NvbmZpZ0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICAgICAgICAgIHRoaXMuc3RhdGljQ29uZmlnTWFwLnB1dChuYW1lLCBzdGF0aWNDb25maWdMaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMuc3RhdGljQ29uZmlnTWFwLmdldChuYW1lKS5hZGQoc3RhdGljQ29uZmlnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogR2xvYmFsIHByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRHbG9iYWxQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFkZEdsb2JhbFByb3BlcnR5KG5hbWUsIHZhbHVlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRHbG9iYWxQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIGZvcmNlT3ZlcnJpZGUpCi0gICAgewotICAgICAgICBpZiAodGhpcy5nbG9iYWxQcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWZvcmNlT3ZlcnJpZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oIm92ZXJyaWRlIGdsb2JhbCBwcm9wZXJ0eSAnIiArIG5hbWUgKyAiJyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoSnNmUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5EZXZlbG9wbWVudCkgJiYgdGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCJnbG9iYWwgcHJvcGVydHkgWyIgKyBuYW1lICsgIl0gYWRkZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuZ2xvYmFsUHJvcGVydGllcy5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEdsb2JhbFByb3BlcnR5KFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2xvYmFsUHJvcGVydGllcy5nZXQobmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0SW50ZXJuYWxzLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnRlcm5hbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJjZmQ1Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnRlcm5hbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIHgueC4zCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1jbGFzcyBFeHRWYWxDb250ZXh0SW50ZXJuYWxzCi17Ci0gICAgYm9vbGVhbiBpc0NvbXBvbmVudEluaXRpYWxpemF0aW9uQWN0aXZhdGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAhInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ09NUE9ORU5UX0lOSVRJQUxJWkFUSU9OKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQotICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGluaXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbihNYXAgYXBwbGljYXRpb25NYXApCi0gICAgewotICAgICAgICBMaXN0PFN0cmluZz4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4pOwotICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZXMuYWRkKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkNVU1RPTV9CRUFOKTsKLQotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbjsKLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChpbmZvcm1hdGlvblByb3ZpZGVyQmVhbiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uTWFwLnB1dChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUsIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnlUb0luaXRDdXN0b21Db25maWd1cmVkSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWUoYXBwbGljYXRpb25NYXApOwotCi0gICAgICAgIGlmIChhcHBsaWNhdGlvbk1hcC5jb250YWluc0tleShJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBhcHBsaWNhdGlvbk1hcC5nZXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkKLSAgICB2b2lkIHRyeVRvSW5pdEN1c3RvbUNvbmZpZ3VyZWRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZShNYXAgYXBwbGljYXRpb25NYXApCi0gICAgewotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBiZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpCi0gICAgICAgICAgICAgICAgLmdldEJlYW4oSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQ1VTVE9NX0JFQU4ucmVwbGFjZSgiLiIsICJfIikpOwotCi0gICAgICAgIGlmIChiZWFuICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uTWFwLnB1dChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUsIGJlYW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQotICAgIHsKLSAgICAgICAgTWFwIGFwcGxpY2F0aW9uTWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uTWFwKCk7Ci0gICAgICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGJlYW4gPSAoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4pIGFwcGxpY2F0aW9uTWFwLmdldChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5CRUFOX05BTUUpOwotCi0gICAgICAgIGlmIChiZWFuID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbml0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oYXBwbGljYXRpb25NYXApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgZ2V0UmVxdWVzdFNjb3BlZFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoCi0gICAgICAgICAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuY2xhc3MsIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSkKLSAgICAgICAgICAgICAgICAuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscy5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0SW52b2NhdGlvbk9yZGVyQXdhcmVJbnRlcm5hbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5MzY2Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSB4LnguMwotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBNYXA8Q2xhc3MsIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+PiBtb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4gdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPSBudWxsOwotICAgIHByaXZhdGUgTWFwPENsYXNzLCBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPj4gbW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPSBudWxsOwotICAgIHByaXZhdGUgTGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4gY29tcG9uZW50SW5pdGlhbGl6ZXJzID0gbnVsbDsKLQotICAgIHByaXZhdGUgRXh0VmFsQ29udGV4dEludGVybmFscyBjb250ZXh0SGVscGVyOwotCi0gICAgRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzKEV4dFZhbENvbnRleHRJbnRlcm5hbHMgY29udGV4dEhlbHBlcikKLSAgICB7Ci0gICAgICAgIHRoaXMuY29udGV4dEhlbHBlciA9IGNvbnRleHRIZWxwZXI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDb21wb25lbnRJbml0aWFsaXplcnMKLSAgICAgKi8KLSAgICB2b2lkIGFkZENvbXBvbmVudEluaXRpYWxpemVyKENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyKQotICAgIHsKLSAgICAgICAgdGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMuYWRkKGNvbXBvbmVudEluaXRpYWxpemVyKTsKLSAgICAgICAgc29ydENvbXBvbmVudEluaXRpYWxpemVycygpOwotICAgIH0KLQotICAgIExpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+IGdldENvbXBvbmVudEluaXRpYWxpemVycygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0SGVscGVyLmlzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25BY3RpdmF0ZWQoKSA/Ci0gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJbml0aWFsaXplcnMgOiBuZXcgQXJyYXlMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPigpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycwotICAgICAqLwotICAgIHZvaWQgYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMuYWRkKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgIHNvcnRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgfQotCi0gICAgTGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+IGdldFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycwotICAgICAqLwotICAgIHZvaWQgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBpZiAocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uTW9kdWxlQXdhcmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlcyhwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgICAgICBzb3J0TW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlKG51bGwsIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsKLSAgICAgICAgICAgIHNvcnRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IGdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzRm9yKENsYXNzIG1vZHVsZUtleSkKLSAgICB7Ci0gICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+KCk7Ci0KLSAgICAgICAgcmVzdWx0LmFkZEFsbChnZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKSk7Ci0KLSAgICAgICAgaWYgKG1vZHVsZUtleSAhPSBudWxsICYmIHRoaXMubW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMuY29udGFpbnNLZXkobW9kdWxlS2V5KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0aGlzLm1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzLmdldChtb2R1bGVLZXkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdChyZXN1bHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckZvck1vZHVsZXMoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBDbGFzcyBtb2R1bGVLZXk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGN1cnJlbnRNb2R1bGVLZXkgOiAoKFZhbGlkYXRpb25Nb2R1bGVBd2FyZSkgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpLmdldE1vZHVsZUtleXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbW9kdWxlS2V5ID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUoY3VycmVudE1vZHVsZUtleSk7Ci0KLSAgICAgICAgICAgIGlmIChtb2R1bGVLZXkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUobW9kdWxlS2V5LCBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUoCi0gICAgICAgICAgICBDbGFzcyBtb2R1bGVLZXksIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgaWYgKG1vZHVsZUtleSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5hZGQocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCBhcyBnbG9iYWwgaW50ZXJjZXB0b3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdDsKLSAgICAgICAgICAgIGlmICh0aGlzLm1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzLmNvbnRhaW5zS2V5KG1vZHVsZUtleSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0ID0gdGhpcy5tb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5nZXQobW9kdWxlS2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPigpOwotICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMucHV0KG1vZHVsZUtleSwgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdC5hZGQocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCBmb3IgIiArIG1vZHVsZUtleS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMKLSAgICAgKi8KLSAgICB2b2lkIGFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgaWYobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uTW9kdWxlQXdhcmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlcyhtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgICAgICBzb3J0TW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlKG51bGwsIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsKLSAgICAgICAgICAgIHNvcnRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckZvck1vZHVsZXMoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBDbGFzcyBtb2R1bGVLZXk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGN1cnJlbnRNb2R1bGVLZXkgOiAoKFZhbGlkYXRpb25Nb2R1bGVBd2FyZSkgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpLmdldE1vZHVsZUtleXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbW9kdWxlS2V5ID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUoY3VycmVudE1vZHVsZUtleSk7Ci0KLSAgICAgICAgICAgIGlmIChtb2R1bGVLZXkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUobW9kdWxlS2V5LCBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGUoCi0gICAgICAgICAgICBDbGFzcyBtb2R1bGVLZXksIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgaWYgKG1vZHVsZUtleSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5hZGQobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCBhcyBnbG9iYWwgaW50ZXJjZXB0b3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdDsKLSAgICAgICAgICAgIGlmICh0aGlzLm1vZHVsZVNwZWNpZmljTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLmNvbnRhaW5zS2V5KG1vZHVsZUtleSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0ID0gdGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5nZXQobW9kdWxlS2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QgPSBuZXcgQXJyYXlMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPigpOwotICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMucHV0KG1vZHVsZUtleSwgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdC5hZGQobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRlZCBmb3IgIiArIG1vZHVsZUtleS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnNXaXRoKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+KCk7Ci0KLSAgICAgICAgcmVzdWx0LmFkZEFsbChnZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKSk7Ci0KLSAgICAgICAgQ2xhc3MgbW9kdWxlS2V5ID0gdHJ5VG9SZXNvbHZlTW9kdWxlS2V5KHByb3BlcnRpZXMpOwotICAgICAgICBpZihtb2R1bGVLZXkgIT0gbnVsbCAmJiB0aGlzLm1vZHVsZVNwZWNpZmljTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLmNvbnRhaW5zS2V5KG1vZHVsZUtleSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5nZXQobW9kdWxlS2V5KSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdChyZXN1bHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ2xhc3MgdHJ5VG9SZXNvbHZlTW9kdWxlS2V5KE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIENsYXNzIG1vZHVsZUtleSA9IG51bGw7Ci0gICAgICAgIGlmKHByb3BlcnRpZXMgIT0gbnVsbCAmJiBwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IGZvdW5kVmFsdWUgPSBwcm9wZXJ0aWVzLmdldChWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBpZihmb3VuZFZhbHVlIGluc3RhbmNlb2YgQ2xhc3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9kdWxlS2V5ID0gKENsYXNzKWZvdW5kVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1vZHVsZUtleTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGluaXQKLSAgICAgKi8KLQotICAgIHZvaWQgbGF6eUluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGlmICh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMgPSBuZXcgQXJyYXlMaXN0PFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4oKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SKTsKLSAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQodGhpcy5jb250ZXh0SGVscGVyLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IpKTsKLQotICAgICAgICBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lIDogdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yID0KLSAgICAgICAgICAgICAgICAgICAgKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzLmFkZCh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpOwotCi0gICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGxhenlJbml0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4oKTsKLSAgICAgICAgbW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMgPSBuZXcgSGFzaE1hcDxDbGFzcywgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4+KCk7Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUik7Ci0gICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQodGhpcy5jb250ZXh0SGVscGVyLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IpKTsKLQotICAgICAgICBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsKLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSA6IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgPQotICAgICAgICAgICAgICAgICAgICAoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUpOwotCi0gICAgICAgICAgICBpZiAobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGxhenlJbml0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCkKLSAgICB7Ci0gICAgICAgIGlmIChjb21wb25lbnRJbml0aWFsaXplcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4oKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZCh0aGlzLmNvbnRleHRIZWxwZXIuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX0lOSVRJQUxJWkVSKSk7Ci0KLSAgICAgICAgQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXI7Ci0gICAgICAgIGZvciAoU3RyaW5nIGNvbXBvbmVudEluaXRpYWxpemVyTmFtZSA6IGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXIgPQotICAgICAgICAgICAgICAgICAgICAoQ29tcG9uZW50SW5pdGlhbGl6ZXIpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjb21wb25lbnRJbml0aWFsaXplck5hbWUpOwotCi0gICAgICAgICAgICBpZiAoY29tcG9uZW50SW5pdGlhbGl6ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKGNvbXBvbmVudEluaXRpYWxpemVyKTsKLQotICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShjb21wb25lbnRJbml0aWFsaXplci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGxhenlJbml0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4oKTsKLSAgICAgICAgbW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPSBuZXcgSGFzaE1hcDxDbGFzcywgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4+KCk7Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICB2YWxpZGF0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1BST1BFUlRZX1ZBTElEQVRJT05fSU5URVJDRVBUT1IpOwotICAgICAgICB2YWxpZGF0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZCh0aGlzLmNvbnRleHRIZWxwZXIuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5QUk9QRVJUWV9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SKSk7Ci0KLSAgICAgICAgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25JbnRlcmNlcHRvck5hbWUgOiB2YWxpZGF0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgIChQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodmFsaWRhdGlvbkludGVyY2VwdG9yTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBpbnN0YW5jZW9mIFZhbGlkYXRpb25Nb2R1bGVBd2FyZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlcyhwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlKG51bGwsIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHNvcnQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc29ydENvbXBvbmVudEluaXRpYWxpemVycygpCi0gICAgewotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRoaXMuY29tcG9uZW50SW5pdGlhbGl6ZXJzLCBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxDb21wb25lbnRJbml0aWFsaXplcj4oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNvcnRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0aGlzLnByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycywKLSAgICAgICAgICAgICAgICBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4oKSk7Ci0gICAgfQotCi0gICAgLy9zb3J0IGFsbCAtIGl0IGlzbid0IGEgaHVnZSBvdmVyaGVhZCBzaW5jZSBpdCdzIGp1c3QgZG9uZSBkdXJpbmcgdGhlIGluaXQtcGhhc2UKLSAgICBwcml2YXRlIHZvaWQgc29ydE1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGZvcihMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QgOgotICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMudmFsdWVzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNvcnRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gc29ydFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdCgKLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdCkKLSAgICB7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0LAotICAgICAgICAgICAgICAgICAgICBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4oKSk7Ci0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc29ydFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMsCi0gICAgICAgICAgICAgICAgbmV3IEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRoaXMubWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLAotICAgICAgICAgICAgICAgIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPigpKTsKLSAgICB9Ci0KLSAgICAvL3NvcnQgYWxsIC0gaXQgaXNuJ3QgYSBodWdlIG92ZXJoZWFkIHNpbmNlIGl0J3MganVzdCBkb25lIGR1cmluZyB0aGUgaW5pdC1waGFzZQotICAgIHByaXZhdGUgdm9pZCBzb3J0TW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgZm9yKExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdCA6Ci0gICAgICAgICAgICAgICAgdGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy52YWx1ZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBzb3J0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0KAotICAgICAgICAgICAgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0KQotICAgIHsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPigpKTsKLQotICAgICAgICByZXR1cm4gbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0luZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NTg3YTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBjZW50cmFsaXplZCBpbiBvcmRlciB0aGF0IHRoZXNlIGluZm9ybWF0aW9uIGFyZW4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICogKyBzb21lIG9mIHRoZW0gY2FuIGJlIGN1c3RvbWl6ZWQgd2l0aGluIGEgY3VzdG9tIGltcGwuIG9mIHRoZSBiZWFuDQotICogKGV4dGVuZCB0aGlzIGNsYXNzIGFuZCBwcm92aWRlIGl0IHZpYSBjb252ZW50aW9uIG9yIHdlYi54bWwpDQotICogPHAvPg0KLSAqIHRoZSBzdGF0aWMgYXBpIHNob3VsZCBvbmx5IGJlIHVzZWQNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LkFQSSwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVBTl9OQU1FID0gRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUNCi0gICAgICAgICsgIi4iICsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICAvL2N1c3RvbSBjbGFzcyB3aGljaCBpcyBhbiBvcHRpb25hbCByZXBsYWNlbWVudCBmb3IgdGhpcyBjbGFzcyAoaGFzIHRvIGV4dGVuZCB0aGlzIGNsYXNzKQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQkVBTiA9IChFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRQ0KLSAgICAgICAgKyAiLmN1c3RvbS4iICsgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsNCi0NCi0gICAgcHVibGljIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHNldHVwQ3VzdG9taXphYmxlSW5mb3JtYXRpb24oKTsNCi0gICAgICAgIGFwcGx5Q3VzdG9tVmFsdWVzKHRoaXMuY3VzdG9taXphYmxlSW5mb3MpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPEN1c3RvbUluZm9ybWF0aW9uLCBTdHJpbmc+IGN1c3RvbWl6YWJsZUluZm9zID0gbmV3IEhhc2hNYXA8Q3VzdG9tSW5mb3JtYXRpb24sIFN0cmluZz4oKTsNCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwQ3VzdG9taXphYmxlSW5mb3JtYXRpb24oKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgYmFzZVBhY2thZ2UgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0JBU0VfUEFDS0FHRTsNCi0NCi0gICAgICAgIGlmIChiYXNlUGFja2FnZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VQYWNrYWdlID0gRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgKyAiLmN1c3RvbS4iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFiYXNlUGFja2FnZS5lbmRzV2l0aCgiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VQYWNrYWdlID0gYmFzZVBhY2thZ2UgKyAiLiI7DQotICAgICAgICB9DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQkFTRV9QQUNLQUdFLCBiYXNlUGFja2FnZSk7DQotICAgICAgICANCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiwNCi0gICAgICAgICAgICAgICAgIkNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFUcmFuc2Zvcm1lciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX0lOSVRJQUxJWkVSLA0KLSAgICAgICAgICAgICAgICAiQ29tcG9uZW50SW5pdGlhbGl6ZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlBST1BFUlRZX1ZBTElEQVRJT05fSU5URVJDRVBUT1IsDQotICAgICAgICAgICAgICAgICJQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01TR19SRVNPTFZFUl9OQU1FX01BUFBFUiwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIsDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVJUVVBfTElTVEVORVIsDQotICAgICAgICAgICAgICAgICJTdGFydHVwTGlzdGVuZXIiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkZBQ0VTX01FU1NBR0VfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIkZhY2VzTWVzc2FnZUZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIlN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSIpOw0KLQ0KLSAgICAgICAgLy9jb252ZW50aW9ucyAodGhlIHJlc3Qgb2YgdGhlIGNvbnZlbnRpb25zIGFyZSBidWlsdCB3aXRoIHRoZSBoZWxwIG9mIG5hbWUgbWFwcGVycywuLi4NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX0JVTkRMRV9OQU1FLA0KLSAgICAgICAgICAgICAgICAidmFsaWRhdGlvbl9tZXNzYWdlcyIpOw0KLSAgICAgICAgLy9zdGF0aWMgc3RyYXRlZ3kgbWFwcGluZ3MgKG5hbWUgb2YgcHJvcGVydHkgZmlsZXMpDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBVElDX1NUUkFURUdZX01BUFBJTkdfU09VUkNFLA0KLSAgICAgICAgICAgICAgICAic3RyYXRlZ3lfbWFwcGluZ3MiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIsDQotICAgICAgICAgICAgICAgICJNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIiKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pDQotICAgIHByb3RlY3RlZCB2b2lkIGFwcGx5Q3VzdG9tVmFsdWVzKE1hcDxDdXN0b21JbmZvcm1hdGlvbiwgU3RyaW5nPiBtYXApDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgdG8gY3VzdG9taXplIGluZm9ybWF0aW9uDQotICAgIH0NCi0NCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXQoQ3VzdG9tSW5mb3JtYXRpb24gY3VzdG9tSW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGN1c3RvbWl6YWJsZUluZm9zLmdldChjdXN0b21JbmZvcm1hdGlvbik7DQotDQotICAgICAgICBzd2l0Y2ggKGN1c3RvbUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNhc2UgQkFTRV9QQUNLQUdFOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgKiBwb3N0Zml4IHVzZWQgYnkgdGhlIFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi0gICAgICAgICAgICAgKiB0aGUgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBpcyBmb3IgY3VzdG9tIHN0cmF0ZWdpZXMgb25seQ0KLSAgICAgICAgICAgICAqIChub3QgZm9yIHB1YmxpYyB2YWxpZGF0aW9uIG1vZHVsZXMpDQotICAgICAgICAgICAgICogc28gaXQncyBmaW5lIHRvIGN1c3RvbWl6ZSBpdA0KLSAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgY2FzZSBWQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgTUVUQV9EQVRBX1RSQU5TRk9STUVSX1BPU1RGSVg6DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0NCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9taXphYmxlSW5mb3MuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkJBU0VfUEFDS0FHRSkgKyB2YWx1ZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOWY4NjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2R1bGVNZXNzYWdlQnVuZGxlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuZXdQYWNrYWdlTmFtZTsNCi0gICAgICAgIGlmIChwYWNrYWdlTmFtZS5lbmRzV2l0aCgiLnJlc29sdmVyIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgbmV3UGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZS5yZXBsYWNlKCIucmVzb2x2ZXIiLCAiLmJ1bmRsZSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5ld1BhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUucmVwbGFjZSgiLnJlc29sdmVyLiIsICIuYnVuZGxlLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG5ld1BhY2thZ2VOYW1lICsgIi52YWxpZGF0aW9uX21lc3NhZ2VzIjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKA0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsICIubWVzc2FnZS5yZXNvbHZlci4iLCB0YXJnZXRDbGFzc05hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoDQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgU3RyaW5nIHRhcmdldENsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUJhc2VkTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcywgIi5tZXRhZGF0YS50cmFuc2Zvcm1lci4iLCB0YXJnZXRDbGFzc05hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UGFja2FnZU5hbWUsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXROYW1lKCk7DQotDQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUucmVwbGFjZSgiLnN0cmF0ZWd5LiIsIHRhcmdldFBhY2thZ2VOYW1lKTsNCi0NCi0gICAgICAgIGlmICh0YXJnZXRDbGFzc05hbWUgPT0gbnVsbCB8fCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSkgKyAiLiIgKyB0YXJnZXRDbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHVzZSBhIGN1c3RvbSBuYW1lIG1hcHBlciB0byBpbXBsZW1lbnQgY3VzdG9tIGNvbnZlbnRpb25zDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgIlZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB1c2UgYSBjdXN0b20gbmFtZSBtYXBwZXIgdG8gaW1wbGVtZW50IGN1c3RvbSBjb252ZW50aW9ucw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhS2V5LnJlcGxhY2UoIi5hbm5vdGF0aW9uLiIsICIuc3RyYXRlZ3kuIikgKyAiU3RyYXRlZ3kiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgIk1ldGFEYXRhVHJhbnNmb3JtZXIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0YXJnZXRQb3N0Zml4KQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5lbmRzV2l0aCgiVmFsaWRhdGlvblN0cmF0ZWd5IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneU5hbWUuc3Vic3RyaW5nKDAsIHZhbGlkYXRpb25TdHJhdGVneU5hbWUubGVuZ3RoKCkgLSAxOCkgKyB0YXJnZXRQb3N0Zml4Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAodmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5lbmRzV2l0aCgiU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5zdWJzdHJpbmcoMCwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZS5sZW5ndGgoKSAtIDgpICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VkYjlhMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7DQotDQotQFRhcmdldChUWVBFKQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLS8qKg0KLSAqIGFsbG93ZWQgdG8gdXNlIGZvciBjbGFzc2VzIHdoaWNoIGltcGxlbWVudCBpbnRlcmZhY2VzIHdoaWNoIGhhdmUgdGhlIG1hcmtlciBASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLSAqDQotICogc3VnZ2VzdGVkIHJhbmdlcyAobWFpbmx5IGZvciBuYW1lLW1hcHBlcnMpOg0KLSAqIG5lZ2F0aXZlIHZhbHVlcyBmb3IgImV4dHJlbWUiIGNhc2VzDQotICoNCi0gKiAwLTQ5IGZvciBjdXN0b20gYXJ0aWZhY3RzIHdoaWNoIHNob3VsZCBoYXZlIHRoZSBoaWdoZXN0IHByaW9yaXR5DQotICogNTAtOTkgZm9yIGFkZC1vbnMgd2hpY2ggcHJvdmlkZSBhcnRpZmFjdHMgd2hpY2ggc2hvdWxkIGhhdmUgYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGUgZGVmYXVsdCBhcnRpZmFjdHMNCi0gKiAxMDAtOTk5IGludGVybmFsIGFydGlmYWN0cw0KLSAqIDEwMDArIGZvciBjdXN0b20gYXJ0aWZhY3RzDQotICoNCi0gKiBzdWdnZXN0ZWQgcmFuZ2VzIGZvciBhcnRpZmFjdHMgbGlrZSBpbnRlcmNlcHRvcnMsLi4uDQotICogMXh4IC4uLiBhcnRpZmFjdHMgb2YgdGhlIGNvcmUNCi0gKiAyeHggLi4uIGFydGlmYWN0cyBvZiB2YWxpZGF0aW9uIG1vZHVsZXMNCi0gKiAzeHggLi4uIGFydGlmYWN0cyBvZiBjb21wb25lbnQgc3VwcG9ydCBtb2R1bGVzDQotICoNCi0gKiBhIHByaW9yaXR5IHNob3VsZCBiZSB1bmlxdWUgd2l0aGluIG9uZSBhcnRpZmFjdC10eXBlIC0gdGhhdCBtZWFucw0KLSAqIGlmIGEgbmFtZS1tYXBwZXIgaGFzIHByaW9yaXR5IDEwMCwgaXQncyBvayB0aGF0IGFuIGV4Y2VwdGlvbi1pbnRlcmNlcHRvciBhbHNvIGhhcyBwcmlvcml0eSAxMDAuDQotICogYnV0IGEgMm5kIG5hbWUtbWFwcGVyIHNob3VsZG4ndCBoYXZlIHByaW9yaXR5IDEwMA0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgSW52b2NhdGlvbk9yZGVyDQotew0KLSAgICAvKioNCi0gICAgICogZGVmYXVsdCBwcmlvcml0eSBmb3IgY3VzdG9tIGFydGlmYWN0cyAoaWYgdGhleSBzaG91bGQgZ2V0IGFkZGVkIGFmdGVyIHRoZSBpbnRlcm5hbCB2ZXJzaW9ucw0KLSAgICAgKiBAcmV0dXJuIHRoZSBwcmlvcml0eSBvZiBhbiBhcnRpZmFjdCBhbm5vdGF0ZWQgd2l0aCB0aGlzIGFubm90YXRpb24NCi0gICAgICovDQotICAgIGludCB2YWx1ZSgpIGRlZmF1bHQgMTAwMDsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlckNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4NTUyMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlckNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8VD4gaW1wbGVtZW50cyBDb21wYXJhdG9yPFQ+DQotew0KLSAgICBwdWJsaWMgaW50IGNvbXBhcmUoVCBubTEsIFQgbm0yKQ0KLSAgICB7DQotICAgICAgICBpZiAoaGFzUHJpb3JpdHkobm0xKSAmJiBoYXNQcmlvcml0eShubTIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBpc1ByaW9yaXR5SGlnaGVyKG5tMS5nZXRDbGFzcygpLmdldEFubm90YXRpb24oSW52b2NhdGlvbk9yZGVyLmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgIG5tMi5nZXRDbGFzcygpLmdldEFubm90YXRpb24oSW52b2NhdGlvbk9yZGVyLmNsYXNzKSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWhhc1ByaW9yaXR5KG5tMSkgJiYgIWhhc1ByaW9yaXR5KG5tMikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gaGFzUHJpb3JpdHkobm0xKSA/IC0xIDogMTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGludCBpc1ByaW9yaXR5SGlnaGVyKEludm9jYXRpb25PcmRlciBwcmlvcml0eTEsIEludm9jYXRpb25PcmRlciBwcmlvcml0eTIpDQotICAgIHsNCi0gICAgICAgIGlmIChwcmlvcml0eTEudmFsdWUoKSA9PSBwcmlvcml0eTIudmFsdWUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBwcmlvcml0eTEudmFsdWUoKSA8IHByaW9yaXR5Mi52YWx1ZSgpID8gLTEgOiAxOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNQcmlvcml0eShPYmplY3Qgbm0pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBubS5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoSW52b2NhdGlvbk9yZGVyLmNsYXNzKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlclN1cHBvcnQuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDM0ZTc5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi0NCi1AVGFyZ2V0KFRZUEUpDQotQERvY3VtZW50ZWQNCi0vKioNCi0gKiBtYXJrZXIgYW5ub3RhdGlvbiBmb3IgZWFzaWVyIHVzYWdlDQotICogaXQgbWFya3MgaW50ZXJmYWNlcyAtIGluc3RhbmNlcyBvZiBjbGFzc2VzIGltcGxlbWVudGluZyB0aGVzZSBpbnRlcmZhY2VzIHdpbGwgYmUgc29ydGVkDQotICogQHNlZSBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotew0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0pzZlByb2plY3RTdGFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Kc2ZQcm9qZWN0U3RhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc1ODkwYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0pzZlByb2plY3RTdGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBwcm9qZWN0IHN0YWdlIGVxdWl2YWxlbnQgdG8ganNmIDIuMA0KLSAqIGV4dHZhbCAyLnggaGFzIGEgc3BlY2lhbCByZXNvbHZlciB3aGljaCByZWRpcmVjdHMgdGhlIGNhbGwgdG8gdGhlIG5ldyBqc2YgYXBpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBlbnVtIEpzZlByb2plY3RTdGFnZQ0KLXsNCi0gICAgRGV2ZWxvcG1lbnQoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZSgiRGV2ZWxvcG1lbnQiKSksDQotICAgIFVuaXRUZXN0KFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoIlVuaXRUZXN0IikpLA0KLSAgICBTeXN0ZW1UZXN0KFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoIlN5c3RlbVRlc3QiKSksDQotICAgIFByb2R1Y3Rpb24oUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZSgiUHJvZHVjdGlvbiIpKTsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0U3RhZ2VOYW1lIHZhbHVlOw0KLQ0KLSAgICBKc2ZQcm9qZWN0U3RhZ2UoUHJvamVjdFN0YWdlTmFtZSB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpcyhKc2ZQcm9qZWN0U3RhZ2UganNmUHJvamVjdFN0YWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUHJvamVjdFN0YWdlLmlzKGpzZlByb2plY3RTdGFnZS5nZXRWYWx1ZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvamVjdFN0YWdlTmFtZSBnZXRWYWx1ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnZhbHVlOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvTmVzdGVkLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL05lc3RlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDY5MWU4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvTmVzdGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi0NCi0vKioNCi0gKiBtYXJrZXIgYW5ub3RhdGlvbiBlLmcuIHRvIG1hcmsgc3ViLW5hbWUtbWFwcGVycw0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBOZXN0ZWQNCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUGhhc2VJZFJlY29yZGluZ1BoYXNlTGlzdGVuZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUGhhc2VJZFJlY29yZGluZ1BoYXNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY5NTU0Mi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1BoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5GYWNlc0luZm9ybWF0aW9uU3RvcmFnZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi0NCi0vKioNCi0gKiBlLmcuIHRvIGFsbG93IGluIG1ldGFkYXRhIGV4dHJhY3Rpb24gaW50ZXJjZXB0b3JzIHRvIGtub3cgaWYgdGhleSBhcmUgaW52b2tlZCBkdXJpbmcgdmFsaWRhdGlvbiBvcg0KLSAqIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbiAoaWYgbmVlZGVkKQ0KLSAqIGV4YW1wbGU6IGNsaWVudC1zaWRlIHZhbGlkYXRpb24gLSBzb21lIGZ1bmN0aW9uYWxpdHkgc2hvdWxkbid0IGJlIHByb2Nlc3NlZCBkdXJpbmcgcmVuZGVyaW5nDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQaGFzZUlkUmVjb3JkaW5nUGhhc2VMaXN0ZW5lciBpbXBsZW1lbnRzIFBoYXNlTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI3OTEyNDA1MTQwMTQ4Njc0NTdMOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgcGhhc2VFdmVudCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgcGhhc2VFdmVudCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UgZmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UgPSBFeHRWYWxVdGlscw0KLSAgICAgICAgICAgICAgICAuZ2V0U3RvcmFnZShGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5jbGFzcywgRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLnNldEN1cnJlbnRQaGFzZUlkKHBoYXNlRXZlbnQuZ2V0UGhhc2VJZCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuQU5ZX1BIQVNFOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKHRoaXMgPT0gbykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBQaGFzZUlkUmVjb3JkaW5nUGhhc2VMaXN0ZW5lcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhNDQ0ZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotLyoqDQotICogZXh0ZW5zaWJsZSBwcm9qZWN0IHN0YWdlIGltcGxlbWVudGF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0U3RhZ2UNCi17DQotICAgIHByaXZhdGUgUHJvamVjdFN0YWdlTmFtZSB2YWx1ZTsNCi0NCi0gICAgcHJpdmF0ZSBQcm9qZWN0U3RhZ2UoUHJvamVjdFN0YWdlTmFtZSB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdFN0YWdlTmFtZSBjcmVhdGVTdGFnZU5hbWUoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVQcm9qZWN0U3RhZ2VOYW1lKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdFN0YWdlIGNyZWF0ZVN0YWdlKFByb2plY3RTdGFnZU5hbWUgbmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBQcm9qZWN0U3RhZ2UobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzKFByb2plY3RTdGFnZU5hbWUgcHJvamVjdFN0YWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0Q3VycmVudFByb2plY3RTdGFnZSgpLmVxdWFscyhwcm9qZWN0U3RhZ2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFByb2plY3RTdGFnZU5hbWUgZ2V0Q3VycmVudFByb2plY3RTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIC8vc2V0IFByb2plY3RTdGFnZVJlc29sdmVyIHRvIG51bGwgdG8gdHdlYWsgdGhlIHBlcmZvcm1hbmNlDQotICAgICAgICBPYmplY3QgcHJvamVjdFN0YWdlUmVzb2x2ZXIgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0R2xvYmFsUHJvcGVydHkoUHJvamVjdFN0YWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGlmKHByb2plY3RTdGFnZVJlc29sdmVyIGluc3RhbmNlb2YgUHJvamVjdFN0YWdlUmVzb2x2ZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICgoUHJvamVjdFN0YWdlUmVzb2x2ZXIpcHJvamVjdFN0YWdlUmVzb2x2ZXIpLmdldEN1cnJlbnRQcm9qZWN0U3RhZ2UoKS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldERlZmF1bHRTdGFnZU5hbWUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvamVjdFN0YWdlTmFtZSBnZXRWYWx1ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnZhbHVlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvamVjdFN0YWdlTmFtZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VOYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMjJiODYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBQcm9qZWN0U3RhZ2VOYW1lDQotew0KLSAgICBTdHJpbmcgZ2V0TmFtZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NGYyN2EuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvamVjdFN0YWdlUmVzb2x2ZXINCi17DQotICAgIFByb2plY3RTdGFnZSBnZXRDdXJyZW50UHJvamVjdFN0YWdlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvVmFsaWRhdGlvbk1vZHVsZUF3YXJlLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1ZhbGlkYXRpb25Nb2R1bGVBd2FyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTQyMGY1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvVmFsaWRhdGlvbk1vZHVsZUF3YXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGlmIGFuIGFydGlmYWN0ICh3aGljaCBzdXBwb3J0cyB0aGlzIGNvbmNlcHQpIHNob3VsZCBiZSB1c2VkIGp1c3QgZm9yIGEvc29tZSBzcGVjaWZpYyBtb2R1bGUocyksDQotICogdGhlIGFydGlmYWN0IGhhcyB0byBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvbk1vZHVsZUF3YXJlDQotew0KLSAgICAvKioNCi0gICAgICogZHVyaW5nIHRoZSByZWdpc3RyYXRpb24gcHJvY2VzcyB0aGUgaW5mb3JtYXRpb24gZ2V0cyBldmFsdWF0ZWQ8YnIvPg0KLSAgICAgKiBpbnN0ZWFkIG9mIGEgY2xhc3MgYXJyYXkgYSBzdHJpbmcgYXJyYXkgaXMgdXNlZCBzbyB0aGF0IGl0J3MgcG9zc2libGUgdG8gaW1wbGVtZW50DQotICAgICAqIGFuIGFydGlmYWN0IGZvciBkaWZmZXJlbnQgbW9kdWxlcy4gaWYgYW4gYWRkLW9uIHJlc3RyaWN0cyBhbiBhcnRpZmFjdCB0byBzcGVjaWZpYyBtb2R1bGVzLA0KLSAgICAgKiBub3QgYWxsIG1vZHVsZXMgaGF2ZSB0byBiZSB1c2VkIGJ5IHRoZSB3ZWJhcHAuIGlmIGEgbW9kdWxlIGtleSBpcyB1bmtub3duLCB0aGUgYXJ0aWZhY3Qgd29uJ3QgZ2V0IHJlZ2lzdGVyZWQNCi0gICAgICogZm9yIHRoaXMgbW9kdWxlLiBpZiBhbiBhcnRpZmFjdCBkb2Vzbid0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgaXQgZ2V0cyByZWdpc3RlcmVkIGZvciBhbGwgbW9kdWxlcw0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lcyBvZiB0aGUgbW9kdWxlIGtleXMNCi0gICAgICovDQotICAgIFN0cmluZ1tdIGdldE1vZHVsZUtleXMoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9WYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1ZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1MzQwZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1ZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLQ0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi0vKioNCi0gKiBtYXJrZXIgYW5ub3RhdGlvbiBmb3IgbW9kdWxlIGtleXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFZhbGlkYXRpb25Nb2R1bGVLZXkNCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTMxYWJlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcmVuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgLyoNCi0gICAgICogbWlzYw0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVTU0FHRV9CVU5ETEUgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVNTQUdFX0JVTkRMRSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX1BBQ0tBR0UgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9CQVNFX1BBQ0tBR0UiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fSU5GT1JNQVRJT05fUFJPVklERVJfQkVBTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fU1RBVElDX1ZBTElEQVRJT05fU1RSQVRFR1lfTUFQUElORyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OX1NUUkFURUdZX01BUFBJTkciKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX0lOSVRJQUxJWkVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fUFJPUEVSVFlfVkFMSURBVElPTl9JTlRFUkNFUFRPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1BST1BFUlRZX1ZBTElEQVRJT05fSU5URVJDRVBUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9QUk9YWV9IRUxQRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9QUk9YWV9IRUxQRVIiKTsNCi0NCi0gICAgLyoNCi0gICAgICogbmFtZSBtYXBwZXINCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIiKTsNCi0NCi0gICAgLyoNCi0gICAgICogZmlsdGVyDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIiKTsNCi0gICAgDQotICAgIC8qDQotICAgICAqIGZhY3Rvcmllcw0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9GQUNFU19NRVNTQUdFX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9GQUNFU19NRVNTQUdFX0ZBQ1RPUlkiKTsNCi0NCi0gICAgLyoNCi0gICAgICogYWN0aXZhdGUNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZBVEVfUkVRVUlSRURfSU5JVElBTElaQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkFDVElWQVRFX1JFUVVJUkVEX0lOSVRJQUxJWkFUSU9OIik7DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBkZWFjdGl2YXRlDQotICAgICAqLw0KLSAgICBARGVwcmVjYXRlZA0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfUkVOREVSS0lUID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1JFTkRFUktJVCIpOw0KLQ0KLSAgICAvL2N1cnJlbnRseSBqdXN0IHVzZWQgYnkgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0RFRkFVTFRfQ09OVkVOVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT04iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0RFRkFVTFRfTkFNRV9NQVBQRVJTID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0RFRkFVTFRfTkFNRV9NQVBQRVJTIik7DQotICAgIA0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfRUxfUkVTT0xWRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfRUxfUkVTT0xWRVIiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0NPTVBPTkVOVF9JTklUSUFMSVpBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9DT01QT05FTlRfSU5JVElBTElaQVRJT04iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX1ZBTElEQVRJT05fUEFSQU1FVEVSUyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9WQUxJREFUSU9OX1BBUkFNRVRFUlMiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX1JFTkRFUl9LSVRfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9SRU5ERVJfS0lUX0ZBQ1RPUlkiKTsNCi0NCi0gICAgLy90aGVyZSBpcyBub3RoaW5nIGxpa2UgREVBQ1RJVkFURV9ERUZBVUxUX1ZBTElEQVRJT05fSU5URVJDRVBUT1INCi0gICAgLy91c2UgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZGVueVJlbmRlcmVySW50ZXJjZXB0b3IoLi4uKSB3aXRoaW4gYW4gZXh0dmFsLVN0YXJ0dXBMaXN0ZW5lcg0KLQ0KLSAgICAvKg0KLSAgICAgKiBzcGVjIHBhcmFtZXRlcnMNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJQUkVUX0VNUFRZX1NUUklOR19TVUJNSVRURURfVkFMVUVTX0FTX05VTEwgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoImphdmF4LmZhY2VzIiwgIklOVEVSUFJFVF9FTVBUWV9TVFJJTkdfU1VCTUlUVEVEX1ZBTFVFU19BU19OVUxMIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVEVfRU1QVFlfRklFTERTID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJqYXZheC5mYWNlcyIsICJWQUxJREFURV9FTVBUWV9GSUVMRFMiKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9BYnN0cmFjdEVMSGVscGVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9BYnN0cmFjdEVMSGVscGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTQzZjI1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBkZXRhaWxzDQotICogQHNlZSBEZWZhdWx0RUxIZWxwZXINCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5IGN1c3RvbUVMSGVscGVyRmFjdG9yeTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21FTEhlbHBlckZhY3RvcnkoQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkgZWxIZWxwZXJGYWN0b3J5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmN1c3RvbUVMSGVscGVyRmFjdG9yeSA9IGVsSGVscGVyRmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgZmluYWwgRUxIZWxwZXIgY3JlYXRlKCkNCi0gICAgew0KLSAgICAgICAgRUxIZWxwZXIgcmVzdWx0ID0gbnVsbDsNCi0NCi0gICAgICAgIGlmKHRoaXMuY3VzdG9tRUxIZWxwZXJGYWN0b3J5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5jdXN0b21FTEhlbHBlckZhY3RvcnkuY3JlYXRlRUxIZWxwZXIoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVFTEhlbHBlcigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRUxIZWxwZXIgY3JlYXRlRUxIZWxwZXIoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMGU4MzYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsNCi1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmc7DQotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBpbiBvcmRlciB0byBjZW50cmFsaXplIHRoZSBqc2YgdmVyc2lvbiBkZXBlbmRlbmN5IHdpdGhpbiB0aGUgY29yZQ0KLSAqDQotICogdGhpcyBlbC1oZWxwZXIgc3VwcG9ydHMganNwIGFuZCBmYWNlbGV0cyAodGVzdGVkIHdpdGggMS4xLjE0KQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotLyoNCi0gKiB0aGVyZSBpcyBhIHNwZWNpYWwgZmFjZWxldHMgd29ya2Fyb3VuZCBmb3IgZWwtZXhwcmVzc2lvbnMgb2YgY3VzdG9tIGNvbXBvbmVudHMNCi0gKiBpdCdzIHBsdWdnYWJsZSBpbiBvcmRlciB0byBzdXBwb3J0IHNwZWNpYWwgbWVjaGFuaXNtcyBvZiBkaWZmZXJlbnQgdGVjaG5vbG9naWVzICh0aGFuIGpzcCBhbmQgZmFjZWxldHMpDQotICogc28geW91IGNhbiBwbHVnIGluIHlvdXIgb3duIGltcGwuIHdoaWNoIGltcGxlbWVudHMgYSBjdXN0b20gd29ya2Fyb3VuZCAobGlrZSB0aGUgZmFjZWxldHMgd29ya2Fyb3VuZCBvZiB0aGlzIGltcGwuKQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRFTEhlbHBlciBpbXBsZW1lbnRzIEVMSGVscGVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9FTF9SRVNPTFZFUiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0VMX1JFU09MVkVSOw0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdEVMSGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIC8vZHVlIHRvIGEgcmVzdHJpY3Rpb24gd2l0aCB0aGUgcmkNCi0gICAgICAgIE9iamVjdCBiZWFuID0gZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIHJldHVybiAoYmVhbiAhPSBudWxsKSA/IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoYmVhbi5nZXRDbGFzcygpKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRCZWFuKFN0cmluZyBiZWFuTmFtZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIHJldHVybiBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5nZXRFTFJlc29sdmVyKCkuZ2V0VmFsdWUoZmFjZXNDb250ZXh0LmdldEVMQ29udGV4dCgpLCBudWxsLCBiZWFuTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uICE9IG51bGwpID8gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZXZhbHVhdGVFeHByZXNzaW9uR2V0KA0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCksIE9iamVjdC5jbGFzcykgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmV2YWx1YXRlRXhwcmVzc2lvbkdldChmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIE9iamVjdC5jbGFzcyk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGdldFZhbHVlQmluZGluZ0V4cHJlc3Npb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQsIGJvb2xlYW4gYWxsb3dCbGFua0NoYXJhY3RlcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIC8vZm9yIGlucHV0IGNvbXBvbmVudHMgd2l0aG91dCB2YWx1ZS1iaW5kaW5nDQotICAgICAgICAvLyhlLmcuIGZvciBzcGVjaWFsIGNvbXBvbmVudCBsaWJzIC0+IGlzc3VlIHdpdGggRXh0VmFsUmVuZGVyZXJXcmFwcGVyI2VuY29kZUJlZ2luKQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudC5nZXRDbGFzcygpICsgIiBoYXMgbm8gdmFsdWUgYmluZGluZyAtIGNvbXBvbmVudCBpZDogIiArIHVpQ29tcG9uZW50LmdldElkKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKCFhbGxvd0JsYW5rQ2hhcmFjdGVycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlKCIgIiwgIiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pLmdldEJhc2VFeHByZXNzaW9uKCkpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXN1bHQgPSBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuDQotICAgICAgICAgICAgICAgIHRyeVRvQ3JlYXRlVmFsdWVCaW5kaW5nRm9yRmFjZWxldHNCaW5kaW5nKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCByZXNvbHZlIGV4cHJlc3Npb246ICIgKyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgIC5nZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgcmVzdWx0LmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLQ0KLSAgICAgICAgICAgIGlmKGVudGl0eUNsYXNzID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgcmVzb2x2ZSBleHByZXNzaW9uOiAiICsgcmVzdWx0LmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYoInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoREVBQ1RJVkFURV9FTF9SRVNPTFZFUikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5RGV0YWlsc1ZpYVJlZmxlY3Rpb25GYWxsYmFjayh1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgRXh0VmFsRUxSZXNvbHZlciBlbFJlc29sdmVyID0gbmV3IEV4dFZhbEVMUmVzb2x2ZXIoZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZ2V0RUxSZXNvbHZlcigpKTsNCi0gICAgICAgIEVMQ29udGV4dCBlbENvbnRleHQgPSBFeHRWYWxFTFJlc29sdmVyLmNyZWF0ZUNvbnRleHRXcmFwcGVyKGZhY2VzQ29udGV4dC5nZXRFTENvbnRleHQoKSwgZWxSZXNvbHZlcik7DQotDQotICAgICAgICBWYWx1ZUV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uID0gdWlDb21wb25lbnQuZ2V0VmFsdWVFeHByZXNzaW9uKCJ2YWx1ZSIpOw0KLQ0KLSAgICAgICAgaWYodmFsdWVFeHByZXNzaW9uID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWx1ZUV4cHJlc3Npb24uc2V0VmFsdWUoZWxDb250ZXh0LCBudWxsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAiZXJyb3IgYXQgYmluZGluZzogIiArIHZhbHVlRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkgKw0KLSAgICAgICAgICAgICAgICAiIC0tIGFuIGVsLXJlc29sdmVyIGVycm9yIG9jY3VycmVkISBtYXliZSB5b3UgdXNlZCBhbiBpbnZhbGlkIGJpbmRpbmcuIG90aGVyd2lzZTogIiArDQotICAgICAgICAgICAgICAgICJwbGVhc2UgcmVwb3J0IHRoZSBpc3N1ZSwgZGVhY3RpdmF0ZSB0aGUgZWwtcmVzb3ZsZXIgb2YgZXh0dmFsIHZpYSB3ZWIueG1sIGNvbnRleHQtcGFyYW06ICIgKw0KLSAgICAgICAgICAgICAgICBFeHRWYWxJbmZvcm1hdGlvbi5XRUJYTUxfUEFSQU1fUFJFRklYICsgIi5ERUFDVElWQVRFX0VMX1JFU09MVkVSIiArDQotICAgICAgICAgICAgICAgICIgYW5kIHRlc3QgYWdhaW4uIiwgdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihlbFJlc29sdmVyLmdldFBhdGgoKSA9PSBudWxsIHx8IGVsUmVzb2x2ZXIuZ2V0QmFzZU9iamVjdCgpID09IG51bGwgfHwgZWxSZXNvbHZlci5nZXRQcm9wZXJ0eSgpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscyhlbFJlc29sdmVyLmdldFBhdGgoKSwgZWxSZXNvbHZlci5nZXRCYXNlT2JqZWN0KCksIGVsUmVzb2x2ZXIuZ2V0UHJvcGVydHkoKSk7DQotICAgIH0NCi0NCi0gICAgLy9rZWVwIGluIHN5bmMgd2l0aCBEZWZhdWx0RUxIZWxwZXIjZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcgb2YgYnJhbmNoISEhDQotICAgIHByb3RlY3RlZCBQcm9wZXJ0eURldGFpbHMgZ2V0UHJvcGVydHlEZXRhaWxzVmlhUmVmbGVjdGlvbkZhbGxiYWNrKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gZ2V0VmFsdWVCaW5kaW5nRXhwcmVzc2lvbih1aUNvbXBvbmVudCwgZmFsc2UpOw0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9DQotICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHBhdGggPSBudWxsOw0KLQ0KLSAgICAgICAgd2hpbGUoY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHBhdGggPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHBhdGggPSBnZXRQcm9wZXJ0eU5hbWUoY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwYXRoID0gZ2V0UHJvcGVydHlOYW1lKGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKSArICIuIiArIHBhdGg7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBhdGggPSBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpICsgIi4iICsgcGF0aDsNCi0NCi0gICAgICAgIE9iamVjdCBiYXNlT2JqZWN0ID0gZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkpOw0KLQ0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGUuZy46ICN7YmVhbltiZWFuLnBhc3N3b3JkUmVwZWF0ZWRQcm9wZXJ0eU5hbWVdfQ0KLSAgICAgICAgLy8tPiBiZWFuLnBhc3N3b3JkUmVwZWF0ZWRQcm9wZXJ0eU5hbWUgaXMgbm90IHRoZSBmaW5hbCBwcm9wZXJ0eSBuYW1lDQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscyhwYXRoLCBiYXNlT2JqZWN0LCBnZXRQcm9wZXJ0eU5hbWUodmFsdWVCaW5kaW5nRXhwcmVzc2lvbikpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldFByb3BlcnR5TmFtZShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCk7DQotDQotICAgICAgICBpZihwcm9wZXJ0eU5hbWUuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBleHRyYWN0UHJvcGVydHlOYW1lT2ZQcm9wZXJ0eVBhdGgocHJvcGVydHlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInN1cHBvcnQgZm9yIG1vcmUgZHluYW1pYyBiaW5kaW5ncyAtIGRldGFpbHMgc2VlIGlubGluZSIpDQotICAgIHByaXZhdGUgU3RyaW5nIGV4dHJhY3RQcm9wZXJ0eU5hbWVPZlByb3BlcnR5UGF0aChTdHJpbmcgcHJvcGVydHlDaGFpbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nW10gcHJvcGVydGllcyA9IHByb3BlcnR5Q2hhaW4uc3BsaXQoIlxcLiIpOw0KLQ0KLSAgICAgICAgT2JqZWN0IGN1cnJlbnRQcm9wZXJ0eVZhbHVlID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKHByb3BlcnRpZXNbMF0pOw0KLQ0KLSAgICAgICAgTWV0aG9kIGN1cnJlbnRNZXRob2Q7DQotICAgICAgICBTdHJpbmcgY3VycmVudFByb3BlcnR5TmFtZTsNCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzc09mUHJvcGVydHlWYWx1ZTsNCi0gICAgICAgIGZvcihpbnQgaSA9IDE7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0aWVzW2ldOw0KLSAgICAgICAgICAgIGN1cnJlbnRDbGFzc09mUHJvcGVydHlWYWx1ZSA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudFByb3BlcnR5VmFsdWUuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgY3VycmVudE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZChjdXJyZW50Q2xhc3NPZlByb3BlcnR5VmFsdWUsDQotICAgICAgICAgICAgICAgICJnZXQiICsgY3VycmVudFByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIGN1cnJlbnRQcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpKTsNCi0NCi0gICAgICAgICAgICBpZihjdXJyZW50TWV0aG9kID09IG51bGwgJiYgY3VycmVudFByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBNYXApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL2l0J3Mgb2sgZm9yIHRoZSBzaW1wbGUgbWFwIGNhc2UgLSBidXQgbm90IGZvciBlLmcuOg0KLSAgICAgICAgICAgICAgICAvLyN7YmVhbjFbYmVhbjIucHJvcGVydHlOYW1lUHJvdmlkZXJbIGJlYW4zLmluZGV4XV19DQotICAgICAgICAgICAgICAgIC8vb3IgZXZlcnkgb3RoZXIgY29tcGxleCByZXBsYWNlbWVudCBmb3IgYmVhbjMuaW5kZXgNCi0gICAgICAgICAgICAgICAgLy9pdCBtaWdodCBhbHNvIHJlcXVpcmUgYW4gYWRqdXN0bWVudCBhdCBGYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIjdHJ5VG9UcmFuc2Zvcm1Ub1JlYWxCaW5kaW5nDQotICAgICAgICAgICAgICAgICgoTWFwKWN1cnJlbnRQcm9wZXJ0eVZhbHVlKS5nZXQoY3VycmVudFByb3BlcnR5TmFtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eVZhbHVlID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKGN1cnJlbnRQcm9wZXJ0eVZhbHVlLCBjdXJyZW50TWV0aG9kKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZihjdXJyZW50UHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFN0cmluZyljdXJyZW50UHJvcGVydHlWYWx1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoInVuZXhwZWN0ZWQgdmFsdWUgd2l0aGluIG1hcCBzeW50YXg6ICIgKyBwcm9wZXJ0eUNoYWluICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGxhc3QgcHJvcGVydHkgbmFtZTogIiArIGN1cnJlbnRQcm9wZXJ0eVZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgc3RhdGljIFN0cmluZyBnZXRPcmlnaW5hbFZhbHVlQmluZGluZ0V4cHJlc3Npb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFZhbHVlRXhwcmVzc2lvbiB2YWx1ZUV4cHJlc3Npb24gPSB1aUNvbXBvbmVudC5nZXRWYWx1ZUV4cHJlc3Npb24oInZhbHVlIik7DQotDQotICAgICAgICByZXR1cm4gKHZhbHVlRXhwcmVzc2lvbiAhPSBudWxsKSA/IHZhbHVlRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtV2VsbEZvcm1lZChPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBWYWx1ZUJpbmRpbmcgfHwgbyBpbnN0YW5jZW9mIEV4dGVybmFsaXphYmxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBzID0gby50b1N0cmluZygpOw0KLSAgICAgICAgcmV0dXJuICgocy5jb250YWlucygiIyIpIHx8IHMuY29udGFpbnMoIiQiKSkgJiYgcy5jb250YWlucygieyIpICYmIHMuY29udGFpbnMoIn0iKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRCaW5kaW5nT2ZDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdWlDb21wb25lbnQuZ2V0VmFsdWVFeHByZXNzaW9uKG5hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZmU1NmMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRFTEhlbHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeQ0KLXsNCi0gICAgcHJpdmF0ZSBFTEhlbHBlciBlbEhlbHBlciA9IG5ldyBEZWZhdWx0RUxIZWxwZXIoKTsNCi0gICAgDQotICAgIHByb3RlY3RlZCBFTEhlbHBlciBjcmVhdGVFTEhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmVsSGVscGVyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRUxIZWxwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRUxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGViMjU1My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0VMSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogaW4gb3JkZXIgdG8gY2VudHJhbGl6ZSB0aGUganNmIHZlcnNpb24gZGVwZW5kZW5jeSB3aXRoaW4gdGhlIGNvcmUNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRUxIZWxwZXINCi17DQotICAgIE9iamVjdCBnZXRCZWFuKFN0cmluZyBiZWFuTmFtZSk7DQotDQotICAgIE9iamVjdCBnZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLQ0KLSAgICBDbGFzcyBnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCk7DQotDQotICAgIGJvb2xlYW4gaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIGJvb2xlYW4gaXNFTFRlcm1XZWxsRm9ybWVkKE9iamVjdCBvKTsNCi0NCi0gICAgT2JqZWN0IGdldEJpbmRpbmdPZkNvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgU3RyaW5nIG5hbWUpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0V4dFZhbEVMUmVzb2x2ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRXh0VmFsRUxSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzk4MDUwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRXh0VmFsRUxSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsKLQotaW1wb3J0IGphdmF4LmVsLkVMUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0OwotaW1wb3J0IGphdmF4LmVsLlZhcmlhYmxlTWFwcGVyOwotaW1wb3J0IGphdmF4LmVsLkZ1bmN0aW9uTWFwcGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS5iZWFucy5GZWF0dXJlRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbEVMUmVzb2x2ZXIgZXh0ZW5kcyBFTFJlc29sdmVyCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgRUxSZXNvbHZlciB3cmFwcGVkOwotICAgIHByaXZhdGUgT2JqZWN0IGJhc2VPYmplY3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7Ci0gICAgLy9mb3JtcyB0aGUgaWQgZm9yIGNyb3NzLXZhbGlkYXRpb24gd2l0aGluIGNvbXBsZXggY29tcG9uZW50cwotICAgIHByaXZhdGUgU3RyaW5nIGV4cHJlc3Npb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGF0aFJlY29yZGluZ1N0b3BwZWQgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBFeHRWYWxFTFJlc29sdmVyKEVMUmVzb2x2ZXIgZWxSZXNvbHZlcikKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IGVsUmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRCYXNlT2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgiZXh0cmFjdGVkIHBhdGg6ICIgKyB0aGlzLmV4cHJlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKQotICAgIHsKLSAgICAgICAgdGhpcy5iYXNlT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IG51bGw7Ci0gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcGF0aCByZWNvcmRpbmcgaXMgcGVyZm9ybWVkIHRvIGdldCBhIGtleSBmb3IgY3Jvc3MtdmFsaWRhdGlvbjxici8+Ci0gICAgICogZXZlcnkgYmFzZSBhZnRlciB0aGUgZmlyc3QgY2FsbCB3aGljaCBpcyBudWxsIHN0b3BzIHJlY29yZGluZzxici8+Ci0gICAgICogd2l0aCBhIGR5bmFtaWMgbWFwIHN5bnRheCB0aGUgbGFzdCBwcm9wZXJ0eSBpbiB0aGUgbWlkZGxlIG9mIGFuIGV4cHJlc3Npb24gaGFzIHRvIGJlIGEgc3RyaW5nLgotICAgICAqIHN1Y2ggYSBzdHJpbmcgcmVzdWx0IGNvbnRpbnVlcyB0aGUgcGF0aCByZWNvcmRpbmcgYXQgdGhlIG5leHQgY2FsbCBmb3IgdGhlIGN1cnJlbnQgZXhwcmVzc2lvbi4KLSAgICAgKiA8cC8+Ci0gICAgICogZXhhbXBsZTogI3tiZWFuW2JlYW4ucHJvcGVydHlOYW1lUHJvdmlkZXJbJ25hbWVPZlByb3BlcnR5MSddXVsnZHluQmVhbiddLnByb3BlcnR5fQotICAgICAqIDxwLz4KLSAgICAgKiBsaW1pdGF0aW9uIGZvciBjcm9zcy12YWxpZGF0aW9uOiBuYW1lT2ZQcm9wZXJ0eTEgaGFzIHRvIGJlIG9mIHR5cGUgc3RyaW5nLgotICAgICAqIG90aGVyIGtleSB0eXBlcyBhcmVuJ3Qgc3VwcG9ydGVkIHlldAotICAgICAqCi0gICAgICogQHBhcmFtIGVsQ29udGV4dCB3cmFwcGVkIGVsLWNvbnRleHQKLSAgICAgKiBAcGFyYW0gYmFzZSBjdXJyZW50IGJhc2UKLSAgICAgKiBAcGFyYW0gcHJvcGVydHkgcHJvcGVydHkgdG8gcmVzb2x2ZQotICAgICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBkZWxlZ2F0ZWQgbWV0aG9kIGNhbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBiYXNlLCBPYmplY3QgcHJvcGVydHkpCi0gICAgewotICAgICAgICBPYmplY3QgcmVzdWx0ID0gdGhpcy53cmFwcGVkLmdldFZhbHVlKGVsQ29udGV4dCwgYmFzZSwgcHJvcGVydHkpOwotCi0gICAgICAgIC8vdmVyeSBmaXJzdCBjYWxsIGZvciBhbiBleHByZXNzaW9uCi0gICAgICAgIGlmKHRoaXMuZXhwcmVzc2lvbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSAoU3RyaW5nKXByb3BlcnR5OwotICAgICAgICB9Ci0gICAgICAgIC8vI3tiZWFuW2R5bkJhc2UucHJvcGVydHlOYW1lXX0gLT4gYmFzZSBvZiBkeW5CYXNlIGlzIG51bGwgLT4gc3RvcCBwYXRoIHJlY29yZGluZwotICAgICAgICBlbHNlIGlmKGJhc2UgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pc1BhdGhSZWNvcmRpbmdTdG9wcGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gcHJvcGVydHlFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eS50b1N0cmluZygpOwotICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHlOYW1lLnN1YnN0cmluZygxKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoYmFzZSBpbnN0YW5jZW9mIE1hcCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCgoTWFwKWJhc2UpLmNvbnRhaW5zS2V5KHByb3BlcnR5KSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhiYXNlLmdldENsYXNzKCkpLmdldE1ldGhvZCgiZ2V0IiArIHByb3BlcnR5TmFtZSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKGJhc2UuZ2V0Q2xhc3MoKSkuZ2V0TWV0aG9kKCJpcyIgKyBwcm9wZXJ0eU5hbWUpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoInByb3BlcnR5OiAiICsgcHJvcGVydHkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzbid0IHVzZWQgZm9yIHBhdGggLSBpdCBpc24ndCBhIHByb3BlcnR5IG9mICIgKyBiYXNlLmdldENsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2UuZy46ICN7YmVhbi5zdWJCYXNlLnByb3BlcnR5fSAtPiBoZXJlIHdlIGFyZSBhdCBzdWJCYXNlCi0gICAgICAgICAgICBpZihwcm9wZXJ0eUV4aXN0cyAmJiAhdGhpcy5pc1BhdGhSZWNvcmRpbmdTdG9wcGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbiArPSAiLiIgKyBwcm9wZXJ0eTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYocHJvcGVydHlFeGlzdHMgJiYgcmVzdWx0IGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuaXNQYXRoUmVjb3JkaW5nU3RvcHBlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgaWYodGhpcy5pc1BhdGhSZWNvcmRpbmdTdG9wcGVkICYmIHJlc3VsdCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uICs9ICIuIiArIHByb3BlcnR5OwotICAgICAgICB9Ci0gICAgICAgICovCi0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0VHlwZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbywgT2JqZWN0IG8xKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0VHlwZShlbENvbnRleHQsIG8sIG8xKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbywgT2JqZWN0IG8xLCBPYmplY3QgbzIpCi0gICAgewotICAgICAgICBleHByZXNzaW9uICs9ICIuIiArIG8xOwotICAgICAgICBwcm9wZXJ0eSA9IChTdHJpbmcpbzE7Ci0gICAgICAgIGJhc2VPYmplY3QgPSBvOwotICAgICAgICBlbENvbnRleHQuc2V0UHJvcGVydHlSZXNvbHZlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvLCBPYmplY3QgbzEpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5pc1JlYWRPbmx5KGVsQ29udGV4dCwgbywgbzEpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxGZWF0dXJlRGVzY3JpcHRvcj4gZ2V0RmVhdHVyZURlc2NyaXB0b3JzKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0RmVhdHVyZURlc2NyaXB0b3JzKGVsQ29udGV4dCwgbyk7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzPD8+IGdldENvbW1vblByb3BlcnR5VHlwZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbykKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENvbW1vblByb3BlcnR5VHlwZShlbENvbnRleHQsIG8pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRUxDb250ZXh0IGNyZWF0ZUNvbnRleHRXcmFwcGVyKGZpbmFsIEVMQ29udGV4dCBjb250ZXh0LCBmaW5hbCBFTFJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFTENvbnRleHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRMb2NhbGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVJlc29sdmVkKGJvb2xlYW4gdmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuc2V0UHJvcGVydHlSZXNvbHZlZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRQcm9wZXJ0eVJlc29sdmVkKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwdXRDb250ZXh0KENsYXNzIGNsYXp6LCBPYmplY3Qgb2JqZWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyLnB1dENvbnRleHQoY2xhenosIG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5wdXRDb250ZXh0KGNsYXp6LCBvYmplY3QpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udGV4dChDbGFzcyBjbGF6eikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRDb250ZXh0KGNsYXp6KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvY2FsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlci5zZXRMb2NhbGUobG9jYWxlKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldExvY2FsZShsb2NhbGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBFTFJlc29sdmVyIGdldEVMUmVzb2x2ZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgRnVuY3Rpb25NYXBwZXIgZ2V0RnVuY3Rpb25NYXBwZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldEZ1bmN0aW9uTWFwcGVyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFZhcmlhYmxlTWFwcGVyIGdldFZhcmlhYmxlTWFwcGVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRWYXJpYWJsZU1hcHBlcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMmI4OWYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogSGVscGVyIGNsYXNzIHRvIGdldCB0aGUgcmVhbC9mdWxsIHZhbHVlIGJpbmRpbmcgLSB0ZXN0ZWQgd2l0aCBmYWNlbGV0cyAxLjEuMTQNCi0gKiBUaGUgdGFyZ2V0IGlzIHRvIGdldCByaWQgb2YgdGhpcyBpbXBsLiAtIGN1cnJlbnRseSBpdCdzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IGN1c3RvbSBmYWNlbGV0cyBjb21wb25lbnRzLg0KLSAqIEFuIGFsdGVybmF0aXZlIHdvdWxkIGJlIGFuIEVMLVJlc29sdmVyIC0gdGhlcmUgYXJlIHN0aWxsIHNvbWUgb3BlbiBpc3N1ZXMgd2l0aCBzdWNoIGFuIGFwcHJvYWNoDQotICogKyBJdCBpc24ndCBhdmFpbGFibGUgd2l0aCBKU0YgMS4xLngNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9DcmVhdGVWYWx1ZUJpbmRpbmdGb3JGYWNlbGV0c0JpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBEZWZhdWx0RUxIZWxwZXIuZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEJpbmRpbmdzID0gZXh0cmFjdEVMVGVybXMoDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmluZGluZ09mQ29tcG9uZW50KHVpQ29tcG9uZW50LCAidmFsdWUiKSk7DQotDQotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZT0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIDEpICsgInsiICsgY3JlYXRlQmluZGluZyhmb3VuZEJpbmRpbmdzLCBtYXBwZWRGYWNlbGV0c1ZhcnMpICsgIn0iKTsNCi0NCi0gICAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YmUuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotDQotICAgICAgICAgICAgaWYoZW50aXR5Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnlUb1JlcGxhY2VWYXJzKHZiZSwgbWFwcGVkRmFjZWxldHNWYXJzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHZiZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVCaW5kaW5nKExpc3Q8U3RyaW5nPiBleHByZXNzaW9ucywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkZWRWaXJ0dWFsTmFtZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGVudHJ5IDogZXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoIlZhbHVlRXhwcmVzc2lvblsiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBmb3VuZEJpbmRpbmdEZXRhaWxzID0gZW50cnkuc3BsaXQoIiAiKTsNCi0gICAgICAgICAgICBpbmRleE9mQmluZGluZ0RldGFpbHMgPSBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKGZvdW5kQmluZGluZ0RldGFpbHMpOw0KLQ0KLSAgICAgICAgICAgIGlmIChpbmRleE9mQmluZGluZ0RldGFpbHMgPT0gLTEpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgYmluZGluZ0RldGFpbHMgPSBmb3VuZEJpbmRpbmdEZXRhaWxzW2luZGV4T2ZCaW5kaW5nRGV0YWlsc10uc3BsaXQoIj0iKTsNCi0NCi0gICAgICAgICAgICBpZiAoYmluZGluZ0RldGFpbHMubGVuZ3RoIDwgMikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGJpbmRpbmdEZXRhaWxzWzFdOw0KLQ0KLSAgICAgICAgICAgIC8vdG8gc3VwcG9ydCBibGFua3Mgd2l0aGluIGEgYmluZGluZyB3aXRoIG1hcCBzeW50YXgNCi0gICAgICAgICAgICBpZihjdXJyZW50QmluZGluZy5jb250YWlucygieyIpICYmICFjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgPSBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKGN1cnJlbnRCaW5kaW5nLCBmb3VuZEJpbmRpbmdEZXRhaWxzLCBpbmRleE9mQmluZGluZ0RldGFpbHMpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnNLZXkoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5wdXQoYmluZGluZ0RldGFpbHNbMF0sIGN1cnJlbnRCaW5kaW5nKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvL2VudHJ5IGZvciAidmlydHVhbCIgZmFjZWxldHMgdmFyDQotICAgICAgICAgICAgaWYoIShjdXJyZW50QmluZGluZy5jb250YWlucygieyIpIHx8IGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhcnMucHV0KGJpbmRpbmdEZXRhaWxzWzBdLCBiaW5kaW5nRGV0YWlsc1sxXS5zdWJzdHJpbmcoMSwgYmluZGluZ0RldGFpbHNbMV0ubGVuZ3RoKCktMikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBvcmlnaW5hbEJpbmRpbmcgPSBhZGRlZFZpcnR1YWxOYW1lcy5nZXQoInZhbHVlIik7DQotICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcuc3Vic3RyaW5nKG9yaWdpbmFsQmluZGluZy5pbmRleE9mKCJ7IikgKyAxLCBvcmlnaW5hbEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLnJlbW92ZSgidmFsdWUiKTsNCi0gICAgICAgIHJldHVybiB0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcob3JpZ2luYWxCaW5kaW5nLCBhZGRlZFZpcnR1YWxOYW1lcywgdmlydHVhbFZhcnMpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcoDQotICAgICAgICAgICAgU3RyaW5nIG9yaWdpbmFsQmluZGluZywgTWFwPFN0cmluZywgU3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gIiN7IiArIG9yaWdpbmFsQmluZGluZyArICJ9IjsNCi0gICAgICAgIEl0ZXJhdG9yIG5hbWVJdGVyYXRvciA9IGFkZGVkVmlydHVhbE5hbWVzLmtleVNldCgpLml0ZXJhdG9yKCk7DQotDQotICAgICAgICBTdHJpbmcgY3VycmVudEtleTsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50VmFsdWU7DQotICAgICAgICB3aGlsZShuYW1lSXRlcmF0b3IuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRLZXkgPSAoU3RyaW5nKSBuYW1lSXRlcmF0b3IubmV4dCgpOw0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGFkZGVkVmlydHVhbE5hbWVzLmdldChjdXJyZW50S2V5KTsNCi0gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGN1cnJlbnRWYWx1ZS5pbmRleE9mKCJ7IikgKyAxLCBjdXJyZW50VmFsdWUuaW5kZXhPZigifSIpKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIi4iLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJ7IiArIGN1cnJlbnRLZXkgKyAiWyIsICJ7IiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICIuIiwgIi4iICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiLiIgKyBjdXJyZW50S2V5ICsgIlsiLCAiLiIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiXSIsICJbJyIgKyBjdXJyZW50VmFsdWUgKyAiJ10iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIlsiLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiLiIsICJbIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICB9DQotDQotICAgICAgICBuYW1lSXRlcmF0b3IgPSB2aXJ0dWFsVmFycy5rZXlTZXQoKS5pdGVyYXRvcigpOw0KLQ0KLSAgICAgICAgd2hpbGUobmFtZUl0ZXJhdG9yLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50S2V5ID0gKFN0cmluZykgbmFtZUl0ZXJhdG9yLm5leHQoKTsNCi0NCi0gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSB2aXJ0dWFsVmFycy5nZXQoY3VycmVudEtleSk7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoInsiICsgY3VycmVudEtleSArICIuIiwgInsiICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIlsiLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCIuIiArIGN1cnJlbnRLZXkgKyAiLiIsICIuIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICJbIiwgIi4iICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIl0iLCAiWyciICsgY3VycmVudFZhbHVlICsgIiddIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIlsiICsgY3VycmVudEtleSArICJbIiwgIlsiICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIi4iLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG9yaWdpbmFsQmluZGluZy5zdWJzdHJpbmcoMiwgb3JpZ2luYWxCaW5kaW5nLmxlbmd0aCgpIC0gMSk7DQotICAgIH0NCi0NCi0gICAgLy90byBzdXBwb3J0IGJsYW5rcyAtIGUuZy4gd2l0aCBtYXAgc3ludGF4DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKFN0cmluZyBjdXJyZW50QmluZGluZywgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlscykNCi0gICAgew0KLSAgICAgICAgZm9yKGludCBpID0gaW5kZXhPZkJpbmRpbmdEZXRhaWxzICsgMTsgaSA8IGZvdW5kQmluZGluZ0RldGFpbHMubGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgKz0gZm91bmRCaW5kaW5nRGV0YWlsc1tpXTsNCi0gICAgICAgICAgICBpZihmb3VuZEJpbmRpbmdEZXRhaWxzW2ldLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEJpbmRpbmc7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRCaW5kaW5nOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBpbnQgY291bnQgPSAwOw0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBiaW5kaW5nRGV0YWlscykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuY29udGFpbnMoIj0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY291bnQrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZXh0cmFjdEVMVGVybXMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlRUxUZXJtcyhvLCBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKSwgZm91bmRFTFRlcm1zLCAwKSA+IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRFTFRlcm1zOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcmVzb2x2ZUVMVGVybXMoT2JqZWN0IG8sIE1hcDxPYmplY3QsIE9iamVjdD4gdmlzaXRlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMsIGludCBjb3VudCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAobyA9PSBudWxsIHx8IHZpc2l0ZWQuY29udGFpbnNLZXkobykgfHwgY291bnQgPiA1MCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZpc2l0ZWQucHV0KG8sIG51bGwpOw0KLQ0KLSAgICAgICAgaW50IGVsQ291bnQgPSAwOw0KLSAgICAgICAgQ2xhc3MgYyA9IG8uZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIC8vaW5zcGVjdCBtYXBzDQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1hcCkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBmb3IgKE9iamVjdCBlbnRyeSA6ICgoTWFwKSBvKS52YWx1ZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZm91bmQgZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICAgICAgaWYoZW50cnkudG9TdHJpbmcoKS5jb250YWlucygiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKGVudHJ5LnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoZW50cnksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGVsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQobykpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gKytlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9hbmFseXplIGFycmF5cw0KLSAgICAgICAgaWYgKGMuaXNBcnJheSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgobyk7DQotICAgICAgICAgICAgLy9jaGVjayBhcnJheSBbTCAtPiBubyBhcnJheSBvZiBwcmltaXRpdmUgdHlwZXMNCi0gICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMamF2YS5sYW5nLlN0cmluZyIpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChBcnJheS5nZXQobywgaSkpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKEFycmF5LmdldChvLCBpKSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxGaWVsZD4gYXR0cmlidXRlcyA9IGZpbmRBbGxBdHRyaWJ1dGVzKGMsIG5ldyBBcnJheUxpc3Q8RmllbGQ+KCkpOw0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBhdHRyaWJ1dGVzLnRvQXJyYXkobmV3IEZpZWxkW2F0dHJpYnV0ZXMuc2l6ZSgpXSk7DQotDQotICAgICAgICBBY2Nlc3NpYmxlT2JqZWN0LnNldEFjY2Vzc2libGUoZmllbGRzLCB0cnVlKTsNCi0gICAgICAgIGZvciAoRmllbGQgY3VycmVudEZpZWxkIDogZmllbGRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQuZ2V0KG8pID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5nZXRUeXBlKCkuZXF1YWxzKFN0cmluZy5jbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmdldChvKSAhPSBudWxsICYmIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKGN1cnJlbnRGaWVsZC5nZXQobykpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFjdXJyZW50RmllbGQuZ2V0VHlwZSgpLmlzUHJpbWl0aXZlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKGN1cnJlbnRGaWVsZC5nZXQobyksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZWxDb3VudDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEZpZWxkPiBmaW5kQWxsQXR0cmlidXRlcyhDbGFzcyBjLCBMaXN0PEZpZWxkPiBhdHRyaWJ1dGVzKQ0KLSAgICB7DQotICAgICAgICBpZiAoYyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluZEFsbEF0dHJpYnV0ZXMoYy5nZXRTdXBlcmNsYXNzKCksIGF0dHJpYnV0ZXMpOw0KLQ0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBjLmdldERlY2xhcmVkRmllbGRzKCk7DQotICAgICAgICBmb3IgKEZpZWxkIGN1cnJlbnRGaWVsZCA6IGZpZWxkcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzU3RhdGljKGN1cnJlbnRGaWVsZC5nZXRNb2RpZmllcnMoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChjdXJyZW50RmllbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9SZXBsYWNlVmFycyhWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eTsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0gICAgICAgIGJvb2xlYW4gbGFzdCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgd2hpbGUodHJ1ZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxhc3QgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0NCi0gICAgICAgICAgICBwcm9wZXJ0eSA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbg0KLSAgICAgICAgICAgICAgICAucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIGdldE5ld1Byb3BlcnR5KHByb3BlcnR5LCBtYXBwZWRGYWNlbGV0c1ZhcnMpKTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQubGVuZ3RoKCkgPT0gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpICsgIi4iICsgcmVzdWx0Ow0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpOw0KLQ0KLSAgICAgICAgICAgIGlmKGxhc3QpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcmVmaXgoKSArICJ7IiArIHJlc3VsdCArICJ9Iik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5ld1Byb3BlcnR5KFN0cmluZyBvbGRQcm9wZXJ0eSwgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFycyA9IGdldFBvdGVudGlhbFZpcnR1YWxWYXJzKG9sZFByb3BlcnR5KTsNCi0NCi0gICAgICAgIGZvcihTdHJpbmcgdmlydHVhbFZhciA6IHZpcnR1YWxWYXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1hcHBlZEZhY2VsZXRzVmFycy5jb250YWluc0tleSh2aXJ0dWFsVmFyKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG9sZFByb3BlcnR5ID0gcmVwbGFjZVByb3BlcnR5VmFsdWUob2xkUHJvcGVydHksIHZpcnR1YWxWYXIsIG1hcHBlZEZhY2VsZXRzVmFycy5nZXQodmlydHVhbFZhcikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvbGRQcm9wZXJ0eTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0UG90ZW50aWFsVmlydHVhbFZhcnMoU3RyaW5nIG9sZFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpbnQgc3RhcnQgPSAtMTsNCi0gICAgICAgIGludCBlbmQgPSAtMTsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG9sZFByb3BlcnR5Lmxlbmd0aCgpOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoc3RhcnQgPT0gLSAxICYmIG9sZFByb3BlcnR5LmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKChzdGFydCAhPSAtIDEgJiYgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICdbJykgfHwgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICddJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGVuZCA9IGk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKHN0YXJ0ICE9IC0xICYmIGVuZCAhPSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJMaXN0LmFkZChvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOw0KLSAgICAgICAgICAgICAgICBpZihvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbmQgPSAtMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlydHVhbFZhckxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcGxhY2VQcm9wZXJ0eVZhbHVlKFN0cmluZyBvbGRQcm9wZXJ0eSwgU3RyaW5nIHRhcmdldFZhciwgU3RyaW5nIG5ld1ZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpbnQgaW5kZXggPSBvbGRQcm9wZXJ0eS5pbmRleE9mKHRhcmdldFZhcik7DQotDQotICAgICAgICBpZihpbmRleCA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gb2xkUHJvcGVydHk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gb2xkUHJvcGVydHkuc3Vic3RyaW5nKDAsIGluZGV4KTsNCi0gICAgICAgIHJlc3VsdCArPSBuZXdWYWx1ZTsNCi0gICAgICAgIHJldHVybiByZXN1bHQgKyBvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoaW5kZXggKyB0YXJnZXRWYXIubGVuZ3RoKCksIG9sZFByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiByZXBsYWNlIHZpcnR1YWwgZmFjZWxldHMgdmFycyAobWFwIHN5bnRheCkNCi0gICAgICogdGVzdGVkIHN0eWxlcyAoc2ltcGxlIGFuZCBuZXN0ZWQpOiB0ZXN0W2l4W2l4MltpeDNdXV0NCi0gICAgICovDQotICAgIC8qDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBfY3JlYXRlQmluZGluZyhMaXN0PFN0cmluZz4gZXhwcmVzc2lvbnMsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmlydHVhbFZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0NCi0gICAgICAgIFN0cmluZyBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50QmluZGluZzsNCi0gICAgICAgIFN0cmluZyBwYXJ0T2ZCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBleHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aCgiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZvdW5kQmluZGluZ0RldGFpbHMgPSBlbnRyeS5zcGxpdCgiICIpOw0KLSAgICAgICAgICAgIGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoZm91bmRCaW5kaW5nRGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9PSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBiaW5kaW5nRGV0YWlscyA9IGZvdW5kQmluZGluZ0RldGFpbHNbaW5kZXhPZkJpbmRpbmdEZXRhaWxzXS5zcGxpdCgiPSIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nRGV0YWlscy5sZW5ndGggPCAyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYmluZGluZ0RldGFpbHNbMV07DQotDQotICAgICAgICAgICAgLy90byBzdXBwb3J0IGJsYW5rcyB3aXRoaW4gYSBiaW5kaW5nIHdpdGggbWFwIHN5bnRheA0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgJiYgIWN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoY3VycmVudEJpbmRpbmcsIGZvdW5kQmluZGluZ0RldGFpbHMsIGluZGV4T2ZCaW5kaW5nRGV0YWlscyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lICE9IG51bGwgJiYgY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnMoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBwYXJ0T2ZCaW5kaW5nID0gY3VycmVudEJpbmRpbmcuc3Vic3RyaW5nKGN1cnJlbnRCaW5kaW5nLmluZGV4T2YocHJldkZhY2VsZXRzQXR0cmlidXRlTmFtZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICArIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUubGVuZ3RoKCksIGN1cnJlbnRCaW5kaW5nLmluZGV4T2YoIn0iKSk7DQotDQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5hZGQoYmluZGluZ0RldGFpbHNbMF0pOw0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgcGFydE9mQmluZGluZzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICBlbHNlIGlmKCEoY3VycmVudEJpbmRpbmcuY29udGFpbnMoInsiKSB8fCBjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJzLnB1dChiaW5kaW5nRGV0YWlsc1swXSwgYmluZGluZ0RldGFpbHNbMV0uc3Vic3RyaW5nKDEsIGJpbmRpbmdEZXRhaWxzWzFdLmxlbmd0aCgpLTIpKTsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWlucyhiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLmFkZChiaW5kaW5nRGV0YWlsc1swXSk7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyZW50QmluZGluZy5zdWJzdHJpbmcoY3VycmVudEJpbmRpbmcuaW5kZXhPZigieyIpICsgMSwgY3VycmVudEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gYmluZGluZ0RldGFpbHNbMF07DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotICAgICovDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OGViNjYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRpZmZlcmVuY2UgYmV0d2VlbiBbIGFuZCBbJyAtIHRlc3Qgd2l0aCBtb3JlIGNvbnN0ZWxsYXRpb25zIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQ0KLXB1YmxpYyBjbGFzcyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotew0KLSAgICBwcml2YXRlIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYmFzZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7DQotICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdG9rZW47DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXBsYWNlT3JBZGRQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlcGxhY2VQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1Byb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICAvL1RPRE8gYWRqdXN0bWVudHMgZm9yIGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLmVuZHNXaXRoKCInXSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYWRkUHJvcGVydHkoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBzb3VyY2VFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc291cmNlRXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgc291cmNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpOw0KLQ0KLSAgICAgICAgLy9UT0RPIGFkanVzdG1lbnRzIGZvciBpc0R5bmFtaWNCYXNlQW5kUHJvcGVydHkNCi0gICAgICAgIGlmKG5ld1Byb3BlcnR5LnN0YXJ0c1dpdGgoIlsnIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHJlc3VsdCArIG5ld1Byb3BlcnR5ICsgIn0iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ocmVzdWx0ICsgIi4iICsgbmV3UHJvcGVydHkgKyAifSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKFN0cmluZyBleHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBpZighRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQoZXhwcmVzc2lvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihleHByZXNzaW9uICsgIiBpcyBubyB2YWxpZCBlbC1leHByZXNzaW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBib29sZWFuIGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSA9IGV4cHJlc3Npb24ubGFzdEluZGV4T2YoIiddIikgPT0gLTE7DQotICAgICAgICBpbnQgaW5kZXgxID0gaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5ID8gZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiXSIpIDogZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiJ10iKTsNCi0gICAgICAgIGludCBpbmRleDIgPSBleHByZXNzaW9uLmxhc3RJbmRleE9mKCIuIik7DQotDQotICAgICAgICBpZihpbmRleDEgPiBpbmRleDIpDQotICAgICAgICB7DQotICAgICAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGluZGV4MSk7DQotDQotICAgICAgICAgICAgaW50IGluZGV4MyA9IGZpbmRJbmRleE9mU3RhcnRpbmdCcmFja2V0KGV4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIGlmKGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZyhpbmRleDMgKyAxLCBpbmRleDEpOw0KLQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoaW5kZXgzICsgMiwgaW5kZXgxKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdGhpcy5iYXNlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgzKSArICJ9Iik7DQotICAgICAgICAgICAgdGhpcy50b2tlbiA9IGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSA/ICJbIiA6ICJbJyI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKCBpbmRleDIgPiBpbmRleDEpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKGluZGV4MiArIDEsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxICk7DQotICAgICAgICAgICAgdGhpcy5iYXNlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgyKSArICJ9Iik7DQotICAgICAgICAgICAgdGhpcy50b2tlbiA9ICIuIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoMiwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpOw0KLSAgICAgICAgICAgIHRoaXMucHJlZml4ID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgMSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnRyaW0oKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYoIlsiLmVxdWFscyh0aGlzLnRva2VuKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLnZhbHVlLnN0YXJ0c1dpdGgoIiciKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlLnN1YnN0cmluZygxLCB0aGlzLnZhbHVlLmxlbmd0aCgpIC0gMSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vcmV0dXJuIHRoaXMuYmFzZS52YWx1ZSArIHRoaXMudG9rZW4gKyB0aGlzLnZhbHVlLnN1YnN0cmluZygwLCB0aGlzLnZhbHVlLmxlbmd0aCgpKSArICInXSI7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gZ2V0QmFzZUV4cHJlc3Npb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmFzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4cHJlc3Npb25TdHJpbmcoKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgYmFzZUV4cHJlc3Npb24gPSB0aGlzLmJhc2UuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLQ0KLSAgICAgICAgICAgIGlmKCJbJyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAiJ119IjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZigiWyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAiXX0iOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gYmFzZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGJhc2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSkgKyB0aGlzLnRva2VuICsgdGhpcy52YWx1ZSArICJ9IjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVmaXggKyAieyIgKyB0aGlzLnZhbHVlICsgIn0iOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5iYXNlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZS5nZXRQcmVmaXgoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJlZml4Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmJhc2Uuc2V0UHJlZml4KHByZWZpeCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEV4cHJlc3Npb25TdHJpbmcoKS5oYXNoQ29kZSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gJiYgZ2V0RXhwcmVzc2lvblN0cmluZygpDQotICAgICAgICAgICAgLmVxdWFscygoKFZhbHVlQmluZGluZ0V4cHJlc3Npb24pIHRhcmdldCkuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGludCBmaW5kSW5kZXhPZlN0YXJ0aW5nQnJhY2tldChTdHJpbmcgZXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgaW50IGNsb3NlQ291bnQgPSAwOw0KLSAgICAgICAgZm9yKGludCBpID0gZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDE7IGkgPiAwOyBpLS0pDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoZXhwcmVzc2lvbi5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2xvc2VDb3VudC0tOw0KLSAgICAgICAgICAgICAgICBpZihjbG9zZUNvdW50IDwgMCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZihleHByZXNzaW9uLmNoYXJBdChpKSA9PSAnXScpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjbG9zZUNvdW50Kys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0Fic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0Fic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzEwMGIzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlckNvbXBhcmF0b3I7DQotDQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxUPiBpbXBsZW1lbnRzIE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8TmFtZU1hcHBlcjxUPj4NCi17DQotICAgIHByaXZhdGUgTGlzdDxDbGFzcz4gZGVuaWVkTmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLQ0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVnaXN0ZXIoTmFtZU1hcHBlcjxUPiBuYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICBpZighZGVuaWVkTmFtZU1hcHBlckxpc3QuY29udGFpbnMobmFtZU1hcHBlci5nZXRDbGFzcygpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBnZXROYW1lTWFwcGVyTGlzdCgpLmFkZChuYW1lTWFwcGVyKTsNCi0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGdldE5hbWVNYXBwZXJMaXN0KCksIGdldENvbXBhcmF0b3IoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIENvbXBhcmF0b3I8TmFtZU1hcHBlcjxUPj4gZ2V0Q29tcGFyYXRvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxOYW1lTWFwcGVyPFQ+PigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkZXJlZ2lzdGVyKENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBjbGFzc1RvRGVyZWdpc3RlcikNCi0gICAgew0KLSAgICAgICAgSXRlcmF0b3I8TmFtZU1hcHBlcjxUPj4gbmFtZU1hcHBlckl0ZXJhdG9yID0gZ2V0TmFtZU1hcHBlckxpc3QoKS5pdGVyYXRvcigpOw0KLSAgICAgICAgd2hpbGUobmFtZU1hcHBlckl0ZXJhdG9yLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihuYW1lTWFwcGVySXRlcmF0b3IubmV4dCgpLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc1RvRGVyZWdpc3Rlci5nZXROYW1lKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbmFtZU1hcHBlckl0ZXJhdG9yLnJlbW92ZSgpOw0KLSAgICAgICAgICAgICAgICAvL2Rvbid0IGJyZWFrIC0gZS5nLiB0byBkZXJlZ2lzdGVyIGFsbCB3cmFwcGVycy4uLg0KLSAgICAgICAgICAgICAgICAvL2JyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBkZW55KENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBjbGFzc1RvRGVueSkNCi0gICAgew0KLSAgICAgICAgZGVyZWdpc3RlcihjbGFzc1RvRGVueSk7DQotDQotICAgICAgICBzeW5jaHJvbml6ZWQgKGdldENsYXNzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZGVuaWVkTmFtZU1hcHBlckxpc3QuYWRkKGNsYXNzVG9EZW55KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdDxOYW1lTWFwcGVyPFQ+PiBnZXROYW1lTWFwcGVyTGlzdCgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2NjA3MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ2xhc3NNYXBwaW5nRmFjdG9yeTxQLCBSPg0KLXsNCi0gICAgUiBjcmVhdGUoUCBzb3VyY2UpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRGVmYXVsdEZhY3RvcnlGaW5kZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9EZWZhdWx0RmFjdG9yeUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjk3NTVmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9EZWZhdWx0RmFjdG9yeUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLkRlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRGVmYXVsdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8vZHluYW1pYyBhcHByb2FjaCB0byBjcmVhdGUgdGhlIGZhY3RvcmllcyBkdXJpbmcgdGhlIGZpcnN0IHJlcXVlc3QsIHdoZW4gYSBmYWNlcy1jb250ZXh0IGlzIGF2YWlsYWJsZQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWN0b3J5RmluZGVyIGltcGxlbWVudHMgRmFjdG9yeUZpbmRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJvdGVjdGVkIE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4gZmFjdG9yeU1hcCA9IG5ldyBIYXNoTWFwPEZhY3RvcnlOYW1lcywgT2JqZWN0PigpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIgPSBuZXcgRGVmYXVsdEZhY3RvcnlGaW5kZXIoKTsNCi0NCi0gICAgcHJvdGVjdGVkIERlZmF1bHRGYWN0b3J5RmluZGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY3RvcnlGaW5kZXIgZ2V0SW5zdGFuY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjdG9yeUZpbmRlcjsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgZmluYWwgPFQ+IFQgZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUsIENsYXNzPFQ+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZighKGZhY3RvcnlNYXAuY29udGFpbnNLZXkoZmFjdG9yeU5hbWUpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0RmFjdG9yeShmYWN0b3J5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKFQpZmFjdG9yeU1hcC5nZXQoZmFjdG9yeU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIHN3aXRjaCAoZmFjdG9yeU5hbWUpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2FzZSBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZU1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZU1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZVJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgRUxfSEVMUEVSX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVFTEhlbHBlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBGQUNFU19NRVNTQUdFX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVGYWNlc01lc3NhZ2VGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIFNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlU3RvcmFnZU1hbmFnZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZVZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICANCi0gICAgICAgICAgICBkZWZhdWx0OiAvL3JlcXVpcmVkIGJ5IGNoZWNrc3R5bGUNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgcG9zc2libGUgdG8gY3JlYXRlIGZhY3RvcnkgIiArIGZhY3RvcnlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZhY3RvcnlNYXAucHV0KGZhY3RvcnlOYW1lLCBmYWN0b3J5KTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkpOw0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSk7DQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotICAgICAgICBMaXN0PFN0cmluZz4gbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSk7DQotICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZICk7DQotICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUZhY2VzTWVzc2FnZUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0ZBQ0VTX01FU1NBR0VfRkFDVE9SWSk7DQotICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkpKTsNCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkubmFtZSgpKTsNCi0gICAgICAgIGlmKHRhcmdldCAhPSBudWxsICYmIHRhcmdldCBpbnN0YW5jZW9mIFN0cmluZykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoKFN0cmluZyl0YXJnZXQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlRUxIZWxwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0RUxIZWxwZXJGYWN0b3J5KCk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlkpOw0KLSAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSk7DQotICAgICAgICBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHN0b3JhZ2VNYW5hZ2VyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IHN0b3JhZ2VNYW5hZ2VyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWSk7DQotICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1BBUkFNRVRFUl9GQUNUT1JZKSk7DQotICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogdmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YmQ4YTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRmFjZXNNZXNzYWdlRmFjdG9yeQ0KLXsNCi0gICAgRmFjZXNNZXNzYWdlIGNvbnZlcnQoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSk7DQotDQotICAgIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGYyNjI1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnlGaW5kZXIKLXsKLSAgICA8VD4gVCBnZXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlOYW1lcy5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTJiMTVlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQotcHVibGljIGVudW0gRmFjdG9yeU5hbWVzCi17Ci0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwKLQotICAgIFZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZLAotICAgIFZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlksCi0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksCi0gICAgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLAotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLAotCi0gICAgRkFDRVNfTUVTU0FHRV9GQUNUT1JZLAotCi0gICAgUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwKLSAgICBFTF9IRUxQRVJfRkFDVE9SWSwKLQotICAgIFNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZCi19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L05hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQyZDFmMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8VCBleHRlbmRzIE5hbWVNYXBwZXI+DQotew0KLSAgICB2b2lkIHJlZ2lzdGVyKFQgY2xhc3NUb0FkZCk7DQotICAgIHZvaWQgZGVyZWdpc3RlcihDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gY2xhc3NUb0RlcmVnaXN0ZXIpOw0KLSAgICB2b2lkIGRlbnkoQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IGNsYXNzVG9EZW55KTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjUwMGMzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0Fic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRTZWNyZXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3g7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVMaXN0Ym94Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTWVudTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZVJhZGlvOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUNoZWNrYm94Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUxpc3Rib3g7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TWVudTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dGFyZWE7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyDQotew0KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbGlkYXRlRW1wdHlGaWVsZHMoKSAmJiBFeHRWYWxVdGlscy5pc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25BY3RpdmUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyZVJlcXVpcmVkQXR0cmlidXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgY29uZmlndXJlTWF4TGVuZ3RoQXR0cmlidXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUVtcHR5RmllbGRzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLnZhbGlkYXRlRW1wdHlGaWVsZHMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjb25maWd1cmVSZXF1aXJlZEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSk7DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRTZWNyZXQgfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94IHx8DQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lTWVudSB8fA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVSYWRpbyB8fA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUxpc3Rib3ggfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueU1lbnUgfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogaWYgdGhlcmUgaXMgbm8gc3BlY2lhbCBhdHRyaWJ1dGUgYXQgdGhlIGNvbXBvbmVudCB3aGljaCBzaG91bGQgb3ZlcnJ1bGUNCi0gICAgICogdGhlIGFubm90YXRlZCBwcm9wZXJ0eSByZXR1cm4gdHJ1ZSENCi0gICAgICoNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IGNvbXBvbmVudCB3aGljaCBpbXBsZW1lbnRzIHRoZSBFZGl0YWJsZVZhbHVlSG9sZGVyIGludGVyZmFjZQ0KLSAgICAgKiBAcmV0dXJuIGZhbHNlIHRvIG92ZXJydWxlIHRoZSBhbm5vdGF0ZWQgcHJvcGVydHkgZS5nLiBpZiBjb21wb25lbnQgaXMgcmVhZG9ubHkNCi0gICAgICovDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJyZWZhY3RvciIpDQotICAgIHByb3RlY3RlZCBCb29sZWFuIGlzQ29tcG9uZW50UmVxdWlyZWQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzUmVhZG9ubHkiKSkpOw0KLSAgICAgICAgYm9vbGVhbiBpc0Rpc2FibGVkID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNEaXNhYmxlZCIpKSk7DQotDQotICAgICAgICByZXR1cm4gIShpc1JlYWRPbmx5IHx8IGlzRGlzYWJsZWQpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZU1heExlbmd0aEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKTsNCi0NCi0gICAgICAgICAgICBpZighKG1heExlbmd0aCBpbnN0YW5jZW9mIEludGVnZXIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBIdG1sSW5wdXRUZXh0IGh0bWxJbnB1dFRleHQgPSAoSHRtbElucHV0VGV4dCl1aUNvbXBvbmVudDsNCi0gICAgICAgICAgICAgICAgaHRtbElucHV0VGV4dC5zZXRNYXhsZW5ndGgoKEludGVnZXIpbWF4TGVuZ3RoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEh0bWxJbnB1dFNlY3JldCBodG1sSW5wdXRTZWNyZXQgPSAoSHRtbElucHV0U2VjcmV0KXVpQ29tcG9uZW50Ow0KLSAgICAgICAgICAgICAgICBodG1sSW5wdXRTZWNyZXQuc2V0TWF4bGVuZ3RoKChJbnRlZ2VyKW1heExlbmd0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9Db21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzhlMzU1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gaW5pdGlhbGl6ZSBjb21wb25lbnRzIGJlZm9yZUVuY29kZUJlZ2luLjxici8+DQotICogZS5nLjogeW91IGNhbiBhZGQgaW5mb3JtYXRpb24gZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gbWVjaGFuaXNtcywuLi4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBDb21wb25lbnRJbml0aWFsaXplcg0KLXsNCi0gICAgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5YzA0MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXRpY0NvbmZpZ3VyYXRpb248VCwgUj4NCi17DQotICAgIHZvaWQgc2V0U291cmNlT2ZNYXBwaW5nKFN0cmluZyBwYXRoKTsNCi0gICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8VCwgUj4+IGdldE1hcHBpbmcoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjg0YWY1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgY2xhc3MgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFQsIFI+DQotew0KLSAgICBwcml2YXRlIFQgc291cmNlOw0KLSAgICBwcml2YXRlIFIgdGFyZ2V0Ow0KLQ0KLSAgICBwdWJsaWMgVCBnZXRTb3VyY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc291cmNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZShUIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFIgZ2V0VGFyZ2V0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoUiB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q3NWJmNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkKLXB1YmxpYyBlbnVtIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcwotewotICAgIE1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfQ09ORklHLAotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0NPTkZJRywKLSAgICBTVE9SQUdFX1RZUEVfVE9fU1RPUkFHRV9NQU5BR0VSX0NPTkZJRywKLQotICAgIFNLSVBfVkFMSURBVElPTl9TVVBQT1JUX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1BBUkFNRVRFUl9DT05GSUcKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwY2I2ZjQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3MKLSAgICAgICAgPSBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VPZk1hcHBpbmcoU3RyaW5nIHBhdGgpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGdldE1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2Uoc291cmNlKTsKLSAgICAgICAgZW50cnkuc2V0VGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgIHRoaXMubWFwcGluZ3MuYWRkKGVudHJ5KTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWE2M2M0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIFN0cmluZyBwYXRoOwotICAgIHByaXZhdGUgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5nczsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCkKLSAgICB7Ci0gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgICAgIC8vZm9yY2UgcmVsb2FkCi0gICAgICAgIG1hcHBpbmdzID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBnZXRNYXBwaW5nKCkKLSAgICB7Ci0gICAgICAgIGlmKG1hcHBpbmdzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtYXBwaW5nczsKLSAgICAgICAgfQotCi0gICAgICAgIG1hcHBpbmdzID0gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotCi0gICAgICAgIFJlc291cmNlQnVuZGxlIG1hcHBpbmcgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocGF0aCk7Ci0KLSAgICAgICAgaWYgKG1hcHBpbmcgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9sb2dnaW5nCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IG1hcHBpbmcuZ2V0S2V5cygpOwotCi0gICAgICAgIFN0cmluZyBtZXRhRGF0YUtleTsKLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsKLQotICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YURhdGFLZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSBtYXBwaW5nLmdldFN0cmluZyhtZXRhRGF0YUtleSk7Ci0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWV0YURhdGFLZXksIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBtZXRhRGF0YUtleSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2UobWV0YURhdGFLZXkpOwotICAgICAgICBlbnRyeS5zZXRUYXJnZXQodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsKLSAgICAgICAgdGhpcy5tYXBwaW5ncy5hZGQoZW50cnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTkzOTY4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yIGltcGxlbWVudHMgUmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRJbnRlcmNlcHRvcklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJldHVyblZhbHVlT25Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKAotICAgICAgICBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIHNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24sIE9iamVjdCBjdXJyZW50UmV0dXJuVmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gY3VycmVudFJldHVyblZhbHVlOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBiZWZvcmUKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJlZm9yZURlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGFmdGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyNzEyOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5WYWxpZGF0aW9uTW9kdWxlS2V5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZWwuUHJvcGVydHlOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgeC54LjMKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25JbnRlcmNlcHRvciBleHRlbmRzIEFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIHByb3RlY3RlZCBib29sZWFuIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvblN1cHBvcnRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgICAgICB0aHJvd3MgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBjb21wb25lbnQgaW5pdGlhbGl6YXRpb24gc2V0cyBhIGNvbXBvbmVudCB0byByZXF1aXJlZCBpZiB0aGVyZSBhcmUgY29uc3RyYWludHMgd2hpY2ggaW5kaWNhdGUgaXQKLSAgICAgICAgICogdGhlIHJlcXVpcmVkIGZsYWcgaW4gYSBjb21wb25lbnQgbGVhZHMgdG8gcHJvYmxlbXMgd2l0aCBoOm1lc3NhZ2VzIChhZGRpdGlvbmFsIG1lc3NhZ2UpIGFzIHdlbGwgYXMKLSAgICAgICAgICogaW5jb21wYXRpYmlsaXRpZXMgd2l0aCBza2lwIHZhbGlkYXRpb24gYW5kIHNldmVyaXRpZXMKLSAgICAgICAgICovCi0gICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlciAmJiBFeHRWYWxVdGlscy5pc1JlcXVpcmVkUmVzZXRBY3RpdmF0ZWQoKSAmJgotICAgICAgICAgICAgICAgIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvblN1cHBvcnRlZCgpICYmIEV4dFZhbFV0aWxzLmlzUmVxdWlyZWRJbml0aWFsaXphdGlvbkFjdGl2ZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSAmJiAhaXNDb21wb25lbnRJbml0aWFsaXphdGlvbkRlYWN0aXZhdGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0Q29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3Q7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdCA9IHdyYXBwZWQuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFByb3BlcnR5Tm90Rm91bmRFeGNlcHRpb24gcikKLSAgICAgICAgewotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNGYXRhbEVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5mYXRhbCgiaXQgc2VlbXMgeW91IGFyZSB1c2luZyBhbiBpbnZhbGlkIGJpbmRpbmcuICIgKyB3cmFwcGVkLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICI6IGNvbnZlcnNpb24gZmFpbGVkLiBub3JtYWxseSB0aGlzIGlzID5ub3Q8IGEgbXlmYWNlcyBleHR2YWwgaXNzdWUhIiwgcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydGllcyh1aUNvbXBvbmVudCk7Ci0gICAgICAgIAotICAgICAgICBpZihyZWNvcmRQcm9jZXNzZWRJbmZvcm1hdGlvbigpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL3JlY29yZGUgdXNlciBpbnB1dCBlLmcuIGZvciBjcm9zcy1jb21wb25lbnQgdmFsaWRhdGlvbgotICAgICAgICAgICAgZm9yKFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIgcmVjb3JkZXIgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlY29yZGVyLnJlY29yZFVzZXJJbnB1dCh1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHJlY29yZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjYWxsZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udmVydGVkT2JqZWN0ID0gdHJhbnNmb3JtVmFsdWVGb3JWYWxpZGF0aW9uKGNvbnZlcnRlZE9iamVjdCk7Ci0KLSAgICAgICAgICAgICAgICBpZih2YWxpZGF0ZVZhbHVlKGNvbnZlcnRlZE9iamVjdCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NCZWZvcmVWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVmFsaWRhdG9yRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBtaWdodCBkZWNpZGUgdGhhdCBpdCBpc24ndCBhbiBleGNlcHRpb24KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50KHVpQ29tcG9uZW50LCBlLmdldEZhY2VzTWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZmluYWxFeGNlcHRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbnZlcnRlckV4Y2VwdGlvbihlLmdldEZhY2VzTWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHByb2Nlc3NBZnRlclZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsKLSAgICAgICAgICAgIHJlc2V0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnRpZXModWlDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0JlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5leGVjdXRlR2xvYmFsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWx1ZSwKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uLmNsYXNzLmdldE5hbWUoKSwgZ2V0UHJvcGVydHlJbmZvcm1hdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KSwgZ2V0TW9kdWxlS2V5KCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NBZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIEV4dFZhbFV0aWxzLmV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsdWUsCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIGdldFByb3BlcnR5SW5mb3JtYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCksIGdldE1vZHVsZUtleSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUHJvcGVydHlJbmZvcm1hdGlvbiBnZXRQcm9wZXJ0eUluZm9ybWF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gZ2V0UHJvcGVydGllc0ZvckNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKHVpQ29tcG9uZW50KTsKLQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKHByb3BlcnRpZXMpOwotCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXNGb3JDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgICAgIGlmKGdldE1vZHVsZUtleSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpLCBnZXRNb2R1bGVLZXkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvcGVydGllcy5wdXQoVUlDb21wb25lbnQuY2xhc3MuZ2V0TmFtZSgpLCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpOwotCi0gICAgcHJvdGVjdGVkIE9iamVjdCB0cmFuc2Zvcm1WYWx1ZUZvclZhbGlkYXRpb24oT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkKLSAgICB7Ci0gICAgICAgIGlmICgiIi5lcXVhbHMoY29udmVydGVkT2JqZWN0KSAmJiBpbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRPYmplY3Q7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZShPYmplY3QgY29udmVydGVkT2JqZWN0KQotICAgIHsKLSAgICAgICAgaWYoaXNWYWx1ZVRvVmFsaWRhdGVFbXB0eShjb252ZXJ0ZWRPYmplY3QpICYmICF2YWxpZGF0ZUVtcHR5RmllbGRzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoImVtcHR5IGZpZWxkIHZhbGlkYXRpb24gaXMgZGVhY3RpdmF0ZWQgaW4gdGhlIHdlYi54bWwgLSBzZWU6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLlZBTElEQVRFX0VNUFRZX0ZJRUxEUyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbHVlVG9WYWxpZGF0ZUVtcHR5KE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpCi0gICAgewotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0ID09IG51bGwgfHwgIiIuZXF1YWxzKGNvbnZlcnRlZE9iamVjdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVFbXB0eUZpZWxkcygpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMudmFsaWRhdGVFbXB0eUZpZWxkcygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGludGVycHJldEVtcHR5U3RyaW5nVmFsdWVzQXNOdWxsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5pbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKAotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIgJiYgaXNWYWx1ZUJpbmRpbmdPZkNvbXBvbmVudFZhbGlkKHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWx1ZUJpbmRpbmdPZkNvbXBvbmVudFZhbGlkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKHVpQ29tcG9uZW50KSAhPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25EZWFjdGl2YXRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ09NUE9ORU5UX0lOSVRJQUxJWkFUSU9OKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWNvcmRQcm9jZXNzZWRJbmZvcm1hdGlvbigpCi0gICAgewotICAgICAgICAvL292ZXJyaWRlIGlmIG5lZWRlZAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENsYXNzIGdldE1vZHVsZUtleSgpCi0gICAgewotICAgICAgICAvL292ZXJyaWRlIGlmIG5lZWRlZAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRJbnRlcmNlcHRvclByb3BlcnRpZXMoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgICAgIGlmKGdldE1vZHVsZUtleSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5wdXQoVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCksIGdldE1vZHVsZUtleSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQucHV0KFVJQ29tcG9uZW50LmNsYXNzLmdldE5hbWUoKSwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0aWVzKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZSBpbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZSA9IGdldFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UoKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBnZXRJbnRlcmNlcHRvclByb3BlcnRpZXModWlDb21wb25lbnQpOwotICAgICAgICBmb3IoU3RyaW5nIGtleSA6IHByb3BlcnRpZXMua2V5U2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLnNldFByb3BlcnR5KGtleSwgcHJvcGVydGllcy5nZXQoa2V5KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydGllcyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UgaW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UgPSBnZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlKCk7Ci0KLSAgICAgICAgZm9yKFN0cmluZyBrZXkgOiBnZXRJbnRlcmNlcHRvclByb3BlcnRpZXModWlDb21wb25lbnQpLmtleVNldCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5yZW1vdmVQcm9wZXJ0eShrZXkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlIGdldFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5jbGFzcywKLSAgICAgICAgICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Db21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Bd2FyZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZjcxMTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Db21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlclN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Bd2FyZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKEpzZlV0aWxzLmlzUmVuZGVyUmVzcG9uc2VQaGFzZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFmdGVyRXh0cmFjdGluZ0ZvckNvbXBvbmVudEluaXRpYWxpemF0aW9uKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFmdGVyRXh0cmFjdGluZ0ZvckNvbXBvbmVudEluaXRpYWxpemF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbik7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2YjE2My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0ZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkZhY2VzTWVzc2FnZVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDkwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBGYWNlc01lc3NhZ2VQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2VTdG9yYWdlIGZhY2VzTWVzc2FnZVN0b3JhZ2UgPSBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKA0KLSAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLCBGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBpZihmYWNlc01lc3NhZ2VTdG9yYWdlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNNZXNzYWdlU3RvcmFnZS5hZGRBbGwoKTsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5yZXNldFN0b3JhZ2UoRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcywgRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0h0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDdjOTI4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5MYWJlbGVkTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLmV4Y2VwdGlvbi5SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFNlY3JldDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVMaXN0Ym94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVSYWRpbzsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueU1lbnU7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dGFyZWE7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpCi0gICAgewotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSBFeHRWYWxVdGlscy5jb252ZXJ0RmFjZXNNZXNzYWdlKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSk7Ci0KLSAgICAgICAgICAgIHRyeVRvVXNlSW5saW5lTWVzc2FnZSh1aUNvbXBvbmVudCwgdmFsaWRhdG9yRXhjZXB0aW9uKTsKLQotICAgICAgICAgICAgdHJ5VG9Vc2VMYWJlbChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBmYWNlc01lc3NhZ2UpOwotCi0gICAgICAgICAgICB0cnlUb0Jsb2Nrc05hdmlnYXRpb24odWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGZhY2VzTWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvVXNlSW5saW5lTWVzc2FnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCk7Ci0gICAgICAgIFN0cmluZyBpbmxpbmVNZXNzYWdlOwotCi0gICAgICAgIGlmKHZhbGlkYXRvckV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmxpbmVNZXNzYWdlID0gZ2V0SW5saW5lUmVxdWlyZWRNZXNzYWdlKHVpQ29tcG9uZW50KTsKLQotICAgICAgICAgICAgaWYoaW5saW5lTWVzc2FnZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGlubGluZU1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoaW5saW5lTWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgaW5saW5lTWVzc2FnZSA9IGdldElubGluZVZhbGlkYXRvck1lc3NhZ2UodWlDb21wb25lbnQpOwotCi0gICAgICAgICAgICBpZihpbmxpbmVNZXNzYWdlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoaW5saW5lTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldERldGFpbChpbmxpbmVNZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1VzZUxhYmVsKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpCi0gICAgewotICAgICAgICBTdHJpbmcgbGFiZWwgPSAoU3RyaW5nKSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsCi0gICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldExhYmVsIikpOwotCi0gICAgICAgIGlmKGxhYmVsID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxhYmVsID0gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vb3ZlcnJpZGUgdGhlIGxhYmVsIGlmIHRoZSBhbm5vdGF0aW9uIHByb3ZpZGVzIGEgbGFiZWwKLSAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxhYmVsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCwgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIExhYmVsZWRNZXNzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKExhYmVsZWRNZXNzYWdlKWZhY2VzTWVzc2FnZSkuc2V0TGFiZWxUZXh0KGxhYmVsKTsKLSAgICAgICAgfQotICAgICAgICAvL2lmIHNvbWVvbmUgdXNlcyBhIG5vcm1hbCBmYWNlcyBtZXNzYWdlCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwoZmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiY2hlY2sgaWYgaXQgaXMgc3RpbGwgcmVxdWlyZWQgaGVyZSIpCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvQmxvY2tzTmF2aWdhdGlvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQotICAgIHsKLSAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vY29ycmVjdCBzZXZlcml0eSBpcyBlLmcuIHByb3ZpZGVkIGJ5IFZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yCi0gICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnQodWlDb21wb25lbnQsIGZhY2VzTWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRJbmxpbmVSZXF1aXJlZE1lc3NhZ2UoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gKFN0cmluZylSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJnZXRSZXF1aXJlZE1lc3NhZ2UiKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW5saW5lVmFsaWRhdG9yTWVzc2FnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCh1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldFZhbGlkYXRvck1lc3NhZ2UiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lUmFkaW8gfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TGlzdGJveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZDIxZGUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlJbmZvcm1hdGlvbiB0aGUgaW5mb3JtYXRpb24gZW50cnkgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3BlcnR5DQotICAgICAqLw0KLSAgICB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0Y2Y1MjcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotew0KLSAgICAvKioNCi0gICAgICogQHJldHVybiBmYWxzZSBpZiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzIHNob3VsZCBiZSBieXBhc3NlZA0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpOw0KLQ0KLSAgICAvKioNCi0gICAgICogcHJvY2Vzc2VkIGlmIHZhbGlkYXRpb24gd2FzIGV4ZWN1dGVkDQotICAgICAqIGluIGNvbnRyYXN0IHRvIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpdCBnZXRzIGV4ZWN1dGVkIGluIGFueSBjYXNlDQotICAgICAqLw0KLSAgICB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9SZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxZjA1NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbGxvd3MgdG8gaW50ZXJjZXB0IHJlbmRlcmVyIG1ldGhvZHMuPGJyLz4KLSAqIEJhc2UgbWVjaGFuaXNtIG9mIGV4dHZhbC4gSXQgYWxsb3dzIHRvIGFkZCBjdXN0b20gaW5mcmFzdHJ1Y3R1cmVzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBSZW5kZXJlckludGVyY2VwdG9yCi17Ci0gICAgU3RyaW5nIGdldEludGVyY2VwdG9ySWQoKTsKLQotICAgIE9iamVjdCBnZXRSZXR1cm5WYWx1ZU9uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBza2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLCBPYmplY3QgY3VycmVudFJldHVyblZhbHVlKTsKLQotICAgIC8qCi0gICAgICogYmVmb3JlCi0gICAgICovCi0gICAgdm9pZCBiZWZvcmVEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKgotICAgICAqIGFmdGVyCi0gICAgICovCi0gICAgdm9pZCBhZnRlckRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRlYzNkMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlclN1cHBvcnQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gaW50ZXJjZXB0IHZhbGlkYXRpb3IgZXhjZXB0aW9ucy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAqIEBwYXJhbSBtZXRhRGF0YUVudHJ5IHRoZSBtZXRhIGRhdGEgZW50cnkgd2hpY2ggY29udGFpbnMgdGhlIG1ldGEgZGF0YSBvZiB0aGUgcHJvcGVydHkNCi0gICAgICogQHBhcmFtIGNvbnZlcnRlZE9iamVjdCB0aGUgY29udmVydGVkIHVzZXIgaW5wdXQNCi0gICAgICogQHBhcmFtIHZhbGlkYXRvckV4Y2VwdGlvbiB0aGUgY3VycmVudCBleGNlcHRpb24NCi0gICAgICogQHBhcmFtIHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IHdoaWNoIHRocmV3IHRoZSBleGNlcHRpb24NCi0gICAgICogQHJldHVybiBmYWxzZSB0byBzdG9wIHRocm93aW5nIHRoZSBleGNlcHRpb24NCi0gICAgICovDQotICAgIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmUxNWUwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkludGVyY2VwdG9yIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25TdXBwb3J0ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHRvIGluaXQgY29tcG9uZW50ICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhUmVzdWx0ID0gRXh0VmFsVXRpbHMKLSAgICAgICAgICAgICAgICAuZ2V0VHJhbnNmb3JtZWRNZXRhRGF0YUZvcihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBnZXRNb2R1bGVLZXkoKSk7Ci0KLSAgICAgICAgLy9nZXQgY29tcG9uZW50IGluaXRpYWxpemVyIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQgYW5kIGNvbmZpZ3VyZSBpdAotICAgICAgICAvL2Fsc28gaW4gY2FzZSBvZiBza2lwcGVkIHZhbGlkYXRpb24gdG8gcmVzZXQgZS5nLiB0aGUgcmVxdWlyZWQgYXR0cmlidXRlCi0gICAgICAgIGlmKCFtZXRhRGF0YVJlc3VsdC5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbmZpZ3VyZUNvbXBvbmVudFdpdGhNZXRhRGF0YShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YVJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJpbml0IGNvbXBvbmVudCBvZiAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkKLSAgICB7Ci0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gRXh0VmFsVXRpbHMKLSAgICAgICAgICAgICAgICAuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JXaXRoKGdldFByb3BlcnRpZXNGb3JDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcih1aUNvbXBvbmVudCkpOwotCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG1ldGFEYXRhRXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgdmFsaWRhdGlvbiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcm9jZXNzRmllbGRWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInZhbGlkYXRpb24gZmluaXNoZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JXaXRoKHByb3BlcnRpZXMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NGaWVsZFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7Ci0gICAgICAgIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKTsKLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogcHJvcGVydHlJbmZvcm1hdGlvbi5nZXRNZXRhRGF0YUVudHJpZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOwotCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgaXNWYWxpZGF0aW9uU3RyYXRlZ3lDb21wYXRpYmxlV2l0aFZhbHVlKHZhbGlkYXRpb25TdHJhdGVneSwgIGNvbnZlcnRlZE9iamVjdCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoc2tpcFZhbGlkYXRpb25FdmFsdWF0b3Iuc2tpcFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblN0cmF0ZWd5LCBlbnRyeSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJza2lwIHZhbGlkYXRpb24gb2YgIiArIGVudHJ5LmdldFZhbHVlKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggIiArIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy9kb24ndCBicmVhayBtYXliZSB0aGVyZSBhcmUgY29uc3RyYWludHMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCB0aGUgc2tpcC1tZWNoYW5pc20KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInZhbGlkYXRlICIgKyBlbnRyeS5nZXRWYWx1ZSgpICsgIiB3aXRoICIgKyB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb24pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFFeHRWYWxVdGlscy5leGVjdXRlTG9jYWxCZWZvcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiB2YWxpZGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZW50cnksIGNvbnZlcnRlZE9iamVjdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5leGVjdXRlTG9jYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIHByb3BlcnR5SW5mb3JtYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYodmFsaWRhdGlvblN0cmF0ZWd5ID09IG51bGwgJiYgbG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyB2YWxpZGF0aW9uIHN0cmF0ZWd5IGZvdW5kIGZvciAiICsgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkYXRpb25TdHJhdGVneUNvbXBhdGlibGVXaXRoVmFsdWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3MgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5pc0Fubm90YXRpb25QcmVzZW50KE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAhIiIuZXF1YWxzKHZhbHVlKSB8fCBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpKQotICAgICAgICAgICAgICAgIC5pc0Fubm90YXRpb25QcmVzZW50KEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneS5jbGFzcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgLyoqCi0gICAgICogdG8gZW5zdXJlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVjb3JkUHJvY2Vzc2VkSW5mb3JtYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WaW9sYXRpb25TZXZlcml0eVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WaW9sYXRpb25TZXZlcml0eVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTM0YzYxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmlvbGF0aW9uU2V2ZXJpdHlWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDkwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYoaXNFeHRWYWxNZXRhRGF0YShtZXRhRGF0YUVudHJ5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb1BsYWNlU2V2ZXJpdHkodmFsaWRhdG9yRXhjZXB0aW9uLCBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0V4dFZhbE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb247DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvUGxhY2VTZXZlcml0eShWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLCBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGZvcihGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkgOiBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkNCi0gICAgICAgICAgICAgICAgLmV4dHJhY3QoYW5ub3RhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eS5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLnNldFNldmVyaXR5KHNldmVyaXR5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2QzODY1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBBIGdlbmVyaWMgaW1wbGVtZW50YXRpb24uIFN1YmNsYXNzZXMganVzdCBoYXZlIHRvIG5vdyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIG5hbWUgbWFwcGVyLg0KLSAqDQotICogTmFtZU1hcHBlcnMgYXJlIHN0YXRlbGVzcy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxUPiBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VD4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotICAgIHByaXZhdGUgTmFtZU1hcHBlcjxUPiBjdXN0b21OYW1lTWFwcGVyOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVCBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIGlmIChjdXN0b21OYW1lTWFwcGVyID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKTsNCi0NCi0gICAgICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXN0b21OYW1lTWFwcGVyID0gKE5hbWVNYXBwZXI8VD4pIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoY3VzdG9tTmFtZU1hcHBlciAhPSBudWxsKSA/IGN1c3RvbU5hbWVNYXBwZXIuY3JlYXRlTmFtZShzb3VyY2UpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODMxY2I2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL05hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXJTdXBwb3J0Ow0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSBmb3IgbmFtZSBtYXBwZXJzLg0KLSAqIEEgbmFtZSBtYXBwZXIgY2FsY3VsYXRlcyBhIG5hbWUgZm9yIGEgZ2l2ZW4gc291cmNlIG9iamVjdC4NCi0gKiBlLmcuIE1ldGEtRGF0YSBLZXkgKGUuZy46IGFubm90YXRpb24gY2xhc3MgbmFtZSkgLT4gVmFsaWRhdGlvblN0cmF0ZWd5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgU3RyaW5nIGNyZWF0ZU5hbWUoVCBzb3VyY2UpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9TdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL1N1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTZkZGQyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL1N1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogaW50ZXJmYWNlIGZvciBuYW1lLW1hcHBlcnMgd2hpY2ggaGF2ZSB0byBkZWxlZ2F0ZSB0byBvdGhlciAoc3ViLSluYW1lLW1hcHBlcnMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyPFQ+IGV4dGVuZHMgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgdm9pZCBhZGROYW1lTWFwcGVyKE5hbWVNYXBwZXI8VD4gbmFtZU1hcHBlcik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvQ29tbW9uTWV0YURhdGFLZXlzLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL0NvbW1vbk1ldGFEYXRhS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWFlNjM3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvQ29tbW9uTWV0YURhdGFLZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGhlbHBlciBmb3IgZnJlcXVlbnQgbWV0YS1kYXRhIGtleXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogcGxhY2VkIGluIGNvcmUgdG8gYXZvaWQgZHVwbGljYXRlZCBpbmZvcm1hdGlvbiBpbiBtdWx0aXBsZSBtb2R1bGVzICh2YWxpZGF0aW9uIG1vZHVsZSBhbmQgY29tcG9uZW50LXN1cHBvcnQgbW9kdWxlKQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBDb21tb25NZXRhRGF0YUtleXMNCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRUQgPSAicmVxdWlyZWQiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQUtfUkVRVUlSRUQgPSAid2Vha19yZXF1aXJlZCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOX0xFTkdUSCA9ICJtaW5fbGVuZ3RoIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5fTEVOR1RIX0RFRkFVTFQgPSAibWluX2xlbmd0aF9kZWZhdWx0IjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfTEVOR1RIID0gIm1heF9sZW5ndGgiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9MRU5HVEhfREVGQVVMVCA9ICJtYXhfbGVuZ3RoX2RlZmF1bHQiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01JTiA9ICJyYW5nZV9taW4iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01JTl9ERUZBVUxUID0gInJhbmdlX21pbl9kZWZhdWx0IjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9NQVggPSAicmFuZ2VfbWF4IjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9NQVhfREVGQVVMVCA9ICJyYW5nZV9tYXhfZGVmYXVsdCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUVEVSTiA9ICJwYXR0ZXJuIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRURVJOX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRSA9ICJwYXR0ZXJuX3ZhbGlkYXRpb25fZXJyb3JfbWVzc2FnZSI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1BSUwgPSAiZW1haWwiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTSA9ICJjdXN0b20iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSVBfVkFMSURBVElPTiA9ICJza2lwX3ZhbGlkYXRpb24iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfQ0xJRU5UX1NJREVfVkFMSURBVElPTiA9ICJkaXNhYmxlX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24iOw0KLSAgICAvL2F2YWlsYWJsZSBmb3IgYWRkLW9ucyBub3QgdXNlZCBpbnRlcm5hbGx5IGR1ZSB0byBwZXJmb3JtYW5jZSByZWFzb25zDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRV9TSE9XX0lORElDQVRJT04gPSAiZGlzYWJsZV9zaG93X2luZGljYXRpb24iOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL01ldGFEYXRhRW50cnkuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvTWV0YURhdGFFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTU0NTgyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvTWV0YURhdGFFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIERhdGEgaG9sZGVyIHdoaWNoIHN0b3JlcyB0aGUgbWV0YS1kYXRhIGFuZCBzb21lIGluZm9ybWF0aW9uIHdoZXJlIHRoZSBtZXRhLWRhdGEgd2FzIGFyb3VuZC4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBNZXRhRGF0YUVudHJ5Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGtleTsKLSAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRLZXkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJzZXR0aW5nIG1ldGEtZGF0YSBrZXk6ICIgKyBrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIDxUPiBUIGdldFZhbHVlKENsYXNzPFQ+IHRhcmdldENsYXNzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUKWdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoInNldHRpbmcgbWV0YS1kYXRhIHZhbHVlOiAiICsgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmdldChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gVCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVClnZXRQcm9wZXJ0eShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJuZXcgcHJvcGVydHkgYWRkZWQga2V5OiAiICsga2V5ICsgIiB2YWx1ZTogIiArIHZhbHVlICsgIiBmb3IgbWV0YWRhdGEta2V5OiAiICsgdGhpcy5rZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWRjMjZkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGFsbCBmYWN0b3JpZXMgd2hpY2ggY3JlYXRlIG1ldGEtZGF0YSBleHRyYWN0b3JzCi0gKiAKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkKLXsKLSAgICBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGUoKTsKLQotICAgIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZVdpdGgoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NGNjY2EuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuTWV0YURhdGFTdG9yYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUHJvcGVydHlTdG9yYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBleHRyYWN0cyBtZXRhLWRhdGEgKGUuZy4gdGhlIGFubm90YXRpb25zKSBvZiB0aGUgdmFsdWUgYmluZGluZyBvZiBhIGNvbXBvbmVudC4KLSAqIEl0IGV4dHJhY3RzIHRoZSBtZXRhLWRhdGEgb2YgdGhlIGZpZWxkIGFuZCB0aGUgcHJvcGVydHkuCi0gKiAoQWxzbyB0aGUgYW5ub3RhdGlvbnMgb2Ygc3VwZXIgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcy4pCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3RvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkKLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsKLQotICAgICAgICAvL3Nob3VsZCBuZXZlciBvY2N1cgotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkgJiYgb2JqZWN0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihvYmplY3QuZ2V0Q2xhc3MoKSArICIgaXMgbm8gdmFsaWQgY29tcG9uZW50Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50ID0gKFVJQ29tcG9uZW50KSBvYmplY3Q7Ci0KLSAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGV4dHJhY3RpbmcgbWV0YS1kYXRhIG9mICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5RGV0YWlscyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGdldCBiZWFuIGNsYXNzIGFuZCBwcm9wZXJ0eSBuYW1lCi0gICAgICAgICAqLwotICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpKTsKLQotICAgICAgICAvL2NyZWF0ZQotICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnNldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIHByb3BlcnR5RGV0YWlscyk7Ci0KLSAgICAgICAgaWYgKGlzQ2FjaGVkKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5IDogZ2V0Q2FjaGVkTWV0YURhdGEoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLmFkZE1ldGFEYXRhRW50cnkobWV0YURhdGFFbnRyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBleHRyYWN0QW5ub3RhdGlvbnMocHJvcGVydHlJbmZvcm1hdGlvbiwgcHJvcGVydHlEZXRhaWxzLCBlbnRpdHlDbGFzcyk7Ci0gICAgICAgICAgICBjYWNoZU1ldGFEYXRhKHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImV4dHJhY3QgZmluaXNoZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NhY2hlZChDbGFzcyBlbnRpdHlDbGFzcywgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldE1ldGFEYXRhU3RvcmFnZSgpLmNvbnRhaW5zTWV0YURhdGFGb3IoZW50aXR5Q2xhc3MsIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2FjaGVNZXRhRGF0YShQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBnZXRNZXRhRGF0YVN0b3JhZ2UoKS5zdG9yZU1ldGFEYXRhT2YocHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRhRGF0YUVudHJ5W10gZ2V0Q2FjaGVkTWV0YURhdGEoQ2xhc3MgZW50aXR5Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRNZXRhRGF0YVN0b3JhZ2UoKS5nZXRNZXRhRGF0YShlbnRpdHlDbGFzcywgcHJvcGVydHkpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWV0YURhdGFTdG9yYWdlIGdldE1ldGFEYXRhU3RvcmFnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShNZXRhRGF0YVN0b3JhZ2UuY2xhc3MsIE1ldGFEYXRhU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NhY2hlZEZpZWxkKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5U3RvcmFnZSgpLmNvbnRhaW5zRmllbGQoZW50aXR5LCBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvQ2FjaGVkRmllbGQoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksIEZpZWxkIGZpZWxkKQotICAgIHsKLSAgICAgICAgUHJvcGVydHlTdG9yYWdlIHByb3BlcnR5U3RvcmFnZSA9IGdldFByb3BlcnR5U3RvcmFnZSgpOwotICAgICAgICBpZiAoIXByb3BlcnR5U3RvcmFnZS5jb250YWluc0ZpZWxkKGVudGl0eSwgcHJvcGVydHkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVN0b3JhZ2Uuc3RvcmVGaWVsZChlbnRpdHksIHByb3BlcnR5LCBmaWVsZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpZWxkIGdldENhY2hlZEZpZWxkKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5U3RvcmFnZSgpLmdldEZpZWxkKGVudGl0eSwgcHJvcGVydHkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NhY2hlZE1ldGhvZChDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eVN0b3JhZ2UoKS5jb250YWluc01ldGhvZChlbnRpdHksIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9DYWNoZWRNZXRob2QoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksIE1ldGhvZCBtZXRob2QpCi0gICAgewotICAgICAgICBQcm9wZXJ0eVN0b3JhZ2UgcHJvcGVydHlTdG9yYWdlID0gZ2V0UHJvcGVydHlTdG9yYWdlKCk7Ci0gICAgICAgIGlmICghcHJvcGVydHlTdG9yYWdlLmNvbnRhaW5zTWV0aG9kKGVudGl0eSwgcHJvcGVydHkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVN0b3JhZ2Uuc3RvcmVNZXRob2QoZW50aXR5LCBwcm9wZXJ0eSwgbWV0aG9kKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWV0aG9kIGdldENhY2hlZE1ldGhvZChDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eVN0b3JhZ2UoKS5nZXRNZXRob2QoZW50aXR5LCBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eVN0b3JhZ2UgZ2V0UHJvcGVydHlTdG9yYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKFByb3BlcnR5U3RvcmFnZS5jbGFzcywgUHJvcGVydHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZXh0cmFjdEFubm90YXRpb25zKAotICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uLCBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLCBDbGFzcyBlbnRpdHlDbGFzcykKLSAgICB7Ci0gICAgICAgIHdoaWxlICghT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoZW50aXR5Q2xhc3MuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICAgICAgYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9ucyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICAgICAgZW50aXR5Q2xhc3MgPSBlbnRpdHlDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ludGVyZmFjZXMoCi0gICAgICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MsIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMsIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IGN1cnJlbnRDbGFzcy5nZXRJbnRlcmZhY2VzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoY3VycmVudEludGVyZmFjZSwgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhjdXJyZW50SW50ZXJmYWNlLCBwcm9wZXJ0eURldGFpbHMsIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QgPSB0cnlUb0dldFJlYWRNZXRob2QoZW50aXR5LCBwcm9wZXJ0eSk7Ci0KLSAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRob2QgPSB0cnlUb0dldFJlYWRNZXRob2RNYW51YWxseShlbnRpdHksIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DYWNoZWRNZXRob2QoZW50aXR5LCBwcm9wZXJ0eSwgbWV0aG9kKTsKLSAgICAgICAgICAgIGFkZEFubm90YXRpb25Ub0Fubm90YXRpb25FbnRyaWVzKEFycmF5cy5hc0xpc3QobWV0aG9kLmdldEFubm90YXRpb25zKCkpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWV0aG9kIHRyeVRvR2V0UmVhZE1ldGhvZChDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIGlmIChpc0NhY2hlZE1ldGhvZChlbnRpdHksIHByb3BlcnR5KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldENhY2hlZE1ldGhvZChlbnRpdHksIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh1c2VCZWFuSW5mbygpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCZWFuSW5mbyBiZWFuSW5mbyA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhlbnRpdHkpOwotICAgICAgICAgICAgICAgIGZvciAoUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA6IGJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yLmdldE5hbWUoKSkgJiYgcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUJlYW5JbmZvKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBCb29sZWFuLlRSVUUuZXF1YWxzKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KEJlYW5JbmZvLmNsYXNzLmdldE5hbWUoKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWV0aG9kIHRyeVRvR2V0UmVhZE1ldGhvZE1hbnVhbGx5KENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHByb3BlcnR5LnN1YnN0cmluZygxKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgLy9jaGFuZ2VkIHRvIG9mZmljaWFsIGJlYW4gc3BlYy4gZHVlIHRvIGNhY2hpbmcgdGhlcmUgaXMgbm8gcGVyZm9ybWFuY2UgaXNzdWUgYW55IG1vcmUKLSAgICAgICAgICAgIHJldHVybiBlbnRpdHkuZ2V0RGVjbGFyZWRNZXRob2QoImlzIiArIHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHkuZ2V0RGVjbGFyZWRNZXRob2QoImdldCIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibWV0aG9kIG5vdCBmb3VuZCAtIGNsYXNzOiAiICsgZW50aXR5LmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtIG1ldGhvZHM6ICIgKyAiZ2V0IiArIHByb3BlcnR5ICsgIiAiICsgImlzIiArIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBGaWVsZCBmaWVsZDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmllbGQgPSBnZXREZWNsYXJlZEZpZWxkKGVudGl0eSwgcHJvcGVydHkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKCJfIiArIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5sZW5ndGgoKSA+IDEgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuaXNVcHBlckNhc2UocHJvcGVydHkuY2hhckF0KDApKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShwcm9wZXJ0eS5jaGFyQXQoMSkpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2Rvbid0IHVzZSBJbnRyb3NwZWN0b3IjZGVjYXBpdGFsaXplIGhlcmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gZW50aXR5LmdldERlY2xhcmVkRmllbGQocHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvTG93ZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgPSBlbnRpdHkuZ2V0RGVjbGFyZWRGaWVsZChJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKHByb3BlcnR5KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJmaWVsZCAiICsgcHJvcGVydHkgKyAiIG9yIF8iICsgcHJvcGVydHkgKyAiIG5vdCBmb3VuZCIsIGUxKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmllbGQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DYWNoZWRGaWVsZChlbnRpdHksIHByb3BlcnR5LCBmaWVsZCk7Ci0gICAgICAgICAgICBhZGRBbm5vdGF0aW9uVG9Bbm5vdGF0aW9uRW50cmllcyhBcnJheXMuYXNMaXN0KGZpZWxkLmdldEFubm90YXRpb25zKCkpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgRmllbGQgZ2V0RGVjbGFyZWRGaWVsZChDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoaXNDYWNoZWRGaWVsZChlbnRpdHksIHByb3BlcnR5KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldENhY2hlZEZpZWxkKGVudGl0eSwgcHJvcGVydHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uVG9Bbm5vdGF0aW9uRW50cmllcygKLSAgICAgICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMsIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uYWRkTWV0YURhdGFFbnRyeShjcmVhdGVNZXRhRGF0YUVudHJ5Rm9yQW5ub3RhdGlvbihhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoYW5ub3RhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBNZXRhRGF0YUVudHJ5IGNyZWF0ZU1ldGFEYXRhRW50cnlGb3JBbm5vdGF0aW9uKEFubm90YXRpb24gZm91bmRBbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgTWV0YURhdGFFbnRyeSBlbnRyeSA9IG5ldyBNZXRhRGF0YUVudHJ5KCk7Ci0KLSAgICAgICAgZW50cnkuc2V0S2V5KGZvdW5kQW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIGVudHJ5LnNldFZhbHVlKGZvdW5kQW5ub3RhdGlvbik7Ci0KLSAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3NjQ1Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyBmYWN0b3J5IGNyZWF0ZXMgYSBtZXRhLWRhdGEgZXh0cmFjdG9yIHdoaWNoIGV4dHJhY3RzIHRoZSBtZXRhLWRhdGEKLSAqIG9mIHRoZSB2YWx1ZSBiaW5kaW5nIG9mIGEgY29tcG9uZW50LgotICogPHAvPgotICogb3JkZXI6PGJyLz4KLSAqIDxvbD4KLSAqICAgPGxpPmNvbmZpZ3VyZWQgbWV0YS1kYXRhIGV4dHJhY3RvciAod2ViLnhtbCk8L2xpPgotICogICA8bGk+Y29uZmlndXJlZCBtZXRhLWRhdGEgZXh0cmFjdG9yIChpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKTwvbGk+Ci0gKiAgIDxsaT5kZWZhdWx0IGltcGxlbWVudGF0aW9uPC9saT4KLSAqIDwvb2w+Ci0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IG51bGw7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikKLSAgICBwdWJsaWMgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVXaXRoKG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGVXaXRoKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3RvciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUik7Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUikpOwotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yID0gKE1ldGFEYXRhRXh0cmFjdG9yKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3RvciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShtZXRhRGF0YUV4dHJhY3Rvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY3JlYXRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3JXaXRoKG1ldGFEYXRhRXh0cmFjdG9yLCBwcm9wZXJ0aWVzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9NZXRhRGF0YUV4dHJhY3Rvci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0MDUxZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9NZXRhRGF0YUV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotCi0vKioKLSAqIEFuIG1ldGEtZGF0YSBleHRyYWN0b3IgaXMgcmVzcG9uc2libGUgdG8gYW5hbHl6ZSBhbiBvYmplY3QKLSAqIGFuZCByZXR1cm5zIGFsbCBhdmFpbGFibGUgbWV0YS1kYXRhIGluZm9ybWF0aW9uCi0gKiAKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBNZXRhRGF0YUV4dHJhY3RvcgotewotICAgIFByb3BlcnR5SW5mb3JtYXRpb24gZXh0cmFjdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njk5MTJhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIGl0J3MganVzdCBhIGhlbHBlciBmb3IgcHJveGllcyAtIHlvdSBqdXN0IG5lZWQgaXQsIGlmIHlvdSBkZWZpbmUgdGhlIGVxdWl2YWxlbnQgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotICoNCi0gKiBpZiB0aGVyZSBpcyBhbHNvIGEgcHJveHkgZm9yIHRoZSBleHRyYWN0b3IgeW91IGNhbiB1c2UgdGhlIGNsYXNzTmFtZSBwcm9wZXJ0eSB0byBtYW51YWxseSByZXBlYXQgdGhlDQotICogZnVsbCBxdWFsaWZpZWQgY2xhc3MgbmFtZS4NCi0gKg0KLSAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBpbnRlcmZhY2UgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyIGV4dGVuZHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlYTgxOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSBlcXVpdmFsZW50IHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0Lg0KLSAqDQotICogaWYgdGhlcmUgaXMgYWxzbyBhIHByb3h5IGZvciB0aGUgdHJhbnNmb3JtZXIgeW91IGNhbiB1c2UgdGhlIGNsYXNzTmFtZSBwcm9wZXJ0eSB0byBtYW51YWxseSByZXBlYXQgdGhlDQotICogZnVsbCBxdWFsaWZpZWQgY2xhc3MgbmFtZS4NCi0gKg0KLSAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBjbGFzcyBCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lciwgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZTsNCi0NCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lci5jb252ZXJ0TWV0YURhdGEobWV0YURhdGFFbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZShTdHJpbmcgbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lID0gbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFUcmFuc2Zvcm1lciBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFUcmFuc2Zvcm1lcihNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lciA9IG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYzNhZWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLlN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuTmVzdGVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyLg0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyB0aGUgTWV0YURhdGFUcmFuc2Zvcm1lciBmb3IgYSBnaXZlbiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogVmFsaWRhdGlvblN0cmF0ZWd5IC0+IE1ldGFEYXRhVHJhbnNmb3JtZXIgaW5zdGVhZCBvZiBNZXRhLURhdGEgLT4gTWV0YURhdGFUcmFuc2Zvcm1lcg0KLSAqIHRvIGF2b2lkIGEgc2Vjb25kIHN0YXRpYyBtYXBwaW5nIGUuZy4gZm9yIGpwYSBhbm5vdGF0aW9ucw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotICAgICAgICBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YVRyYW5zZm9ybWVyPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmc7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KCk7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IHN1Yk5hbWVNYXBwZXJMaXN0ID0NCi0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotDQotICAgICAgICAvL3NpbmNlIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBzdGFydHVwIGxpc3RlbmVyIG9mIHRoZSBjb3JlIGdldHMgZXhlY3V0ZWQgZmlyc3QNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgY3JlYXRlKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lID0gY3JlYXRlVmFsaWRhdGlvblN0cmF0ZWd5TmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgdHJ5VG9Jbml0U3RhdGljTWFwcGluZ3MoKTsNCi0NCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lciA9DQotICAgICAgICAgICAgICAgIHRyeVRvUmVzb2x2ZUNhY2hlZE1ldGFEYXRhVHJhbnNmb3JtZXIodmFsaWRhdGlvblN0cmF0ZWd5LCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0NCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBjcmVhdGVBbmRDYWNoZU1ldGFEYXRhVHJhbnNmb3JtZXIodmFsaWRhdGlvblN0cmF0ZWd5LCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gaXNQcm94eURldGVjdGVkID0gaXNQcm94eSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGEgcHJveHkgYW5kIHRoZSB1c2FnZSBvZiBhIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICAgICAgICBpZiAoaXNQcm94eURldGVjdGVkICYmIHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoKEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKXZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuICFpc1Byb3h5RGV0ZWN0ZWQgPyBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0luaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUHJveHkoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSA9PSBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciBjcmVhdGVBbmRDYWNoZU1ldGFEYXRhVHJhbnNmb3JtZXIoDQotICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgIFN0cmluZyB0cmFuc2Zvcm1lck5hbWU7DQotICAgICAgICAvL251bGwgLT4gdXNlIG5hbWUgbWFwcGVycw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyYW5zZm9ybWVyTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lck5hbWUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyID0gdHJ5VG9DcmVhdGVBbmRDYWNoZU1ldGFEYXRhVHJhbnNmb3JtZXIoDQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3ksIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIHRyYW5zZm9ybWVyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIHRyeVRvUmVzb2x2ZUNhY2hlZE1ldGFEYXRhVHJhbnNmb3JtZXIoDQotICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHZhbGlkYXRpb25TdHJhdGVneU5hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoTWV0YURhdGFUcmFuc2Zvcm1lcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcuZ2V0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgbmV3VmFsaWRhdGlvblN0cmF0ZWd5TmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneU5hbWUgKyBJZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kuSURfUFJFRklYICsNCi0gICAgICAgICAgICAgICAgICAgICgoSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KXZhbGlkYXRpb25TdHJhdGVneSkuZ2V0SWQoKTsNCi0NCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZy5jb250YWluc0tleShuZXdWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiAoTWV0YURhdGFUcmFuc2Zvcm1lcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoDQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLmdldChuZXdWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIHRyeVRvQ3JlYXRlQW5kQ2FjaGVNZXRhRGF0YVRyYW5zZm9ybWVyKA0KLSAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgdHJhbnNmb3JtZXJOYW1lKQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSAoTWV0YURhdGFUcmFuc2Zvcm1lcikNCi0gICAgICAgICAgICAgICAgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHRyYW5zZm9ybWVyTmFtZSk7DQotDQotICAgICAgICBpZiAobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneU5hbWUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArPSBJZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kuSURfUFJFRklYICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kpdmFsaWRhdGlvblN0cmF0ZWd5KS5nZXRJZCgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGFkZE1hcHBpbmcodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgdHJhbnNmb3JtZXJOYW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0dXBNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBNYXBwaW5ncyhMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhtYXBwaW5nLmdldFNvdXJjZSgpLCBtYXBwaW5nLmdldFRhcmdldCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0cmFuc2Zvcm1lck5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkaW5nIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWV0YS1kYXRhIHRyYW5zZm9ybWVyIG1hcHBpbmc6ICINCi0gICAgICAgICAgICAgICAgKyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgIiAtPiAiICsgdHJhbnNmb3JtZXJOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcucHV0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIHRyYW5zZm9ybWVyTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgU29ydGVkTmFtZU1hcHBlckxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+Pih0aGlzLm5hbWVNYXBwZXJMaXN0LCB0aGlzLnN1Yk5hbWVNYXBwZXJMaXN0KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIHRyeVRvSW5pdE5hbWVNYXBwZXJXaXRoRXhpc3RpbmdTdWJNYXBwZXJzKHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpOw0KLSAgICAgICAgc3VwZXIucmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIGl0J3MgYSB2ZXJ5IHNwZWNpYWwgY2FzZSBkdWUgdG8gdGhlIG1pc3Npbmcgb3JkZXIgaW4gdGhlIGV4ZWN1dGlvbiBvZiBzdGFydHVwLWxpc3RlbmVycyAocGhhc2UgbGlzdGVuZXJzKQ0KLSAgICAgKiBwYWNrYWdlZCBpbiBmYWNlcy1jb25maWcueG1sIGZpbGVzIG9mIGphcnMNCi0gICAgICoNCi0gICAgICogbm9ybWFsbHkgdGhlIGRlZmF1bHQgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyIHNob3VsZCBiZSBlbm91Z2gNCi0gICAgICogYW55d2F5LCBpZiBhIG1vZHVsZSBhZGRzIGEgbmV3IFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlciwNCi0gICAgICogYWxsIHByZXZpb3VzIGFkZGVkIFN1Yk5hbWVNYXBwZXJzIGhhdmUgdG8gYmUgYWRkZWQgdG8gYXZvaWQgY29uZnVzaW9uIGluIHNwZWNpYWwgY2FzZXMuDQotICAgICAqIGlmIGEgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIGZpbmFsIGV4dGVuZCB0aGUgaW50ZXJmYWNlIGFuZCBmaWx0ZXIgaXQgaW4gYWRkTmFtZU1hcHBlcg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgd2hpY2ggaGFzIHRvIGJlIGFkZGVkDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9Jbml0TmFtZU1hcHBlcldpdGhFeGlzdGluZ1N1Yk1hcHBlcnMoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgaW5zdGFuY2VvZiBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yKE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiBuYW1lTWFwcGVyIDogdGhpcy5zdWJOYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKG5hbWVNYXBwZXIuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KE5lc3RlZC5jbGFzcykpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICgoU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4pdmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcikNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZE5hbWVNYXBwZXIobmFtZU1hcHBlcik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1MDRiMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQWxsb3dzIHRvIHRyYW5zZm9ybSBjb25jcmV0ZSBtZXRhLWRhdGEgdG8gYSBtb3JlIGFic3RyYWN0IGZvcm0uPGJyLz4NCi0gKiBlLmcuOiBAUmVxdWlyZWQsIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwuLi4pLCBATGVuZ3RoKG1pbmltdW0gPSAxKSwgLi4uIC0+IHJlcXVpcmVkID0gdHJ1ZQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLS8vKlRyYW5zZm9ybWVyIGluc3RlYWQgb2YgKkNvbnZlcnRlciB0byBhdm9pZCBuYW1pbmcgY29uZnVzaW9uIA0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YSk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU29ydGVkTmFtZU1hcHBlckxpc3QuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU29ydGVkTmFtZU1hcHBlckxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjYmI0OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NvcnRlZE5hbWVNYXBwZXJMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5OZXN0ZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7DQotDQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLWNsYXNzIFNvcnRlZE5hbWVNYXBwZXJMaXN0PFQgZXh0ZW5kcyBOYW1lTWFwcGVyPiBpbXBsZW1lbnRzIExpc3Q8VD4NCi17DQotICAgIHByaXZhdGUgTGlzdDxUPiB3cmFwcGVkOw0KLSAgICBwcml2YXRlIExpc3Q8VD4gZ2xvYmFsU3ViTmFtZU1hcHBlckxpc3Q7DQotDQotICAgIFNvcnRlZE5hbWVNYXBwZXJMaXN0KExpc3Q8VD4gd3JhcHBlZCwgTGlzdDxUPiBzdWJOYW1lTWFwcGVyTGlzdCkNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsNCi0gICAgICAgIHRoaXMuZ2xvYmFsU3ViTmFtZU1hcHBlckxpc3QgPSBzdWJOYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoVCB0KQ0KLSAgICB7DQotICAgICAgICBpZiAodCAhPSBudWxsICYmIHQuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KE5lc3RlZC5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkZFN1Yk5hbWVNYXBwZXIodCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB3cmFwcGVkLmFkZCh0KTsNCi0NCi0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHdyYXBwZWQsIG5ldyBDb21wYXJhdG9yPFQ+KCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShUIG5tMSwgVCBubTIpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChubTEgaW5zdGFuY2VvZiBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIgJiYgbm0yIGluc3RhbmNlb2YgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5tMSBpbnN0YW5jZW9mIFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlciA/IDEgOiAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHJpdmF0ZSBib29sZWFuIGFkZFN1Yk5hbWVNYXBwZXIoVCBzdWJOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyIG5hbWVNYXBwZXIgOiB0aGlzLndyYXBwZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKG5hbWVNYXBwZXIgaW5zdGFuY2VvZiBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAoKFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcikgbmFtZU1hcHBlcikuYWRkTmFtZU1hcHBlcihzdWJOYW1lTWFwcGVyKTsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICB0cnlUb0FkZE1hcHBlckFzR2xvYmFsU3ViTmFtZU1hcHBlcihzdWJOYW1lTWFwcGVyKTsNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvQWRkTWFwcGVyQXNHbG9iYWxTdWJOYW1lTWFwcGVyKFQgc3ViTmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgaWYoIXRoaXMuZ2xvYmFsU3ViTmFtZU1hcHBlckxpc3QuY29udGFpbnMoc3ViTmFtZU1hcHBlcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5nbG9iYWxTdWJOYW1lTWFwcGVyTGlzdC5hZGQoc3ViTmFtZU1hcHBlcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgaW50IHNpemUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5zaXplKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmlzRW1wdHkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udGFpbnMobyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaXRlcmF0b3IoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnRvQXJyYXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlN1c3BpY2lvdXNUb0FycmF5Q2FsbCJ9KQ0KLSAgICBwdWJsaWMgPFQ+IFRbXSB0b0FycmF5KFRbXSBhKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC50b0FycmF5KGEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVtb3ZlKG8pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udGFpbnNBbGwoYyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIFQ+IGMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmFkZEFsbChjKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUPiBjKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5hZGRBbGwoaW5kZXgsIGMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnJlbW92ZUFsbChjKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5yZXRhaW5BbGwoYyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKQ0KLSAgICB7DQotICAgICAgICB3cmFwcGVkLmNsZWFyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFQgZ2V0KGludCBpbmRleCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0KGluZGV4KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVCBzZXQoaW50IGluZGV4LCBUIGVsZW1lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnNldChpbmRleCwgZWxlbWVudCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgVCBlbGVtZW50KQ0KLSAgICB7DQotICAgICAgICB3cmFwcGVkLmFkZChpbmRleCwgZWxlbWVudCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFQgcmVtb3ZlKGludCBpbmRleCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVtb3ZlKGluZGV4KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmluZGV4T2Yobyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQubGFzdEluZGV4T2Yobyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3RJdGVyYXRvcjxUPiBsaXN0SXRlcmF0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5saXN0SXRlcmF0b3IoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yPFQ+IGxpc3RJdGVyYXRvcihpbnQgaW5kZXgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmxpc3RJdGVyYXRvcihpbmRleCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8VD4gc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuc3ViTGlzdChmcm9tSW5kZXgsIHRvSW5kZXgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYWRjMTYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODg5NGQxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciAtIGlmIHRoZXJlIGlzIGEgcHJveHkgYXJvdW5kIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5Lg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcig1MDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoKEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKXZhbGlkYXRpb25TdHJhdGVneSkuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMWFhZjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKiAoY29uZmlndXJlZCB2aWEgd2ViLnhtbCkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmQwODBmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKiAoY29uZmlndXJlZCB2aWEgaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbikNCi0gKiBUaGUgYmVhbiBwcm92aWRlcyB0aGUgZGVmYXVsdCBuYW1lIChjb252ZW50aW9uKS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gZnVsbCBxdWFsaWZpZWQgbmFtZS4gKD0gY3VzdG9taXphYmxlIGNvbnZlbnRpb24pDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGU4NTBkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotLyoqDQotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBtYXBzIEV4dFZhbCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MgPQ0KLSAgICAgICAgICAgICAgICBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLA0KLSAgICAgICAgICAgICAgICBnZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZjE3NWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIHRvIHBsYWNlIFZhbGlkYXRpb25TdHJhdGVnaWVzIGFuZCBNZXRhRGF0YVRyYW5zZm9ybWVycyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcig0MDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MgPQ0KLSAgICAgICAgICAgICAgICBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0UGFja2FnZSgpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZ2V0U2ltcGxlTWV0YURhdGFUcmFuc2Zvcm1lck5hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArICIuIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXRTaW1wbGVOYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTWV0YURhdGFUcmFuc2Zvcm1lck5hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneVBhY2thZ2VOYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcG9zdGZpeCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYKTsNCi0NCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5lbmRzV2l0aCgiVmFsaWRhdGlvblN0cmF0ZWd5IikgfHwNCi0gICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5lbmRzV2l0aCgiU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUgKyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCkgLHBvc3RmaXgpDQotICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgiVmFsaWRhdGlvblN0cmF0ZWd5IiwgcG9zdGZpeCkNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCJTdHJhdGVneSIsIHBvc3RmaXgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGEgc3RhdGljIHZhbGlkYXRpb24gc3RyYXRlZ3kgbWFwcGluZw0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneVBhY2thZ2VOYW1lICsgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lICsgcG9zdGZpeDsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1ZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmE1ODNiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1ZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLlN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuTmVzdGVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXINCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgaW1wbGVtZW50cyBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gc3ViTmFtZU1hcHBlcnMgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkTmFtZU1hcHBlcihOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgaWYoIXRoaXMuc3ViTmFtZU1hcHBlcnMuY29udGFpbnMobmFtZU1hcHBlcikgJiYgbmFtZU1hcHBlci5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoTmVzdGVkLmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnN1Yk5hbWVNYXBwZXJzLmFkZChuYW1lTWFwcGVyKTsNCi0gICAgICAgICAgICBzb3J0U3ViTmFtZU1hcHBlcnMoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc29ydFN1Yk5hbWVNYXBwZXJzKCkNCi0gICAgew0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0aGlzLnN1Yk5hbWVNYXBwZXJzLCBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsNCi0NCi0gICAgICAgIGZvcihOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbWFwcGVyIDogdGhpcy5zdWJOYW1lTWFwcGVycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBtYXBwZXIuY3JlYXRlTmFtZShzb3VyY2UpOw0KLQ0KLSAgICAgICAgICAgIGlmKHJlc3VsdCAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24uamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1ZjUyOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbiBpbXBsZW1lbnRzIFByb3BlcnR5SW5mb3JtYXRpb24KLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGluZm9ybWF0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhRW50cnk+IG1ldGFEYXRhTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFbnRyeT4oKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zSW5mb3JtYXRpb24oU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbk1hcC5jb250YWluc0tleShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbk1hcC5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpIGdldEluZm9ybWF0aW9uKGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoIm5ldyBpbmZvcm1hdGlvbiBhZGRlZCBrZXk6ICIgKyBrZXkgKyAiIHZhbHVlOiAiICsgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5mb3JtYXRpb25NYXAucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRhRGF0YUVudHJ5W10gZ2V0TWV0YURhdGFFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtZXRhRGF0YUxpc3QudG9BcnJheShuZXcgTWV0YURhdGFFbnRyeVttZXRhRGF0YUxpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpCi0gICAgewotICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnRpZXModGhpcy5pbmZvcm1hdGlvbk1hcCk7Ci0gICAgICAgIHRoaXMubWV0YURhdGFMaXN0LmFkZChtZXRhRGF0YUVudHJ5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldE1ldGFEYXRhRW50cmllcygpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgicmVzZXR0aW5nIG1ldGEtZGF0YSBlbnRyaWVzIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLm1ldGFEYXRhTGlzdC5jbGVhcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlEZXRhaWxzLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTAzN2NmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlEZXRhaWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlEZXRhaWxzCi17Ci0gICAgLy9mb3JtcyB0aGUgaWQgZm9yIGNyb3NzLXZhbGlkYXRpb24gd2l0aGluIGNvbXBsZXggY29tcG9uZW50cwotICAgIHByaXZhdGUgU3RyaW5nIGtleTsKLSAgICBwcml2YXRlIE9iamVjdCBiYXNlT2JqZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5OwotCi0gICAgcHVibGljIFByb3BlcnR5RGV0YWlscyhTdHJpbmcga2V5LCBPYmplY3QgYmFzZU9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICAgIHRoaXMuYmFzZU9iamVjdCA9IGJhc2VPYmplY3Q7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gICAgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRCYXNlT2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VPYmplY3QoT2JqZWN0IGJhc2VPYmplY3QpCi0gICAgewotICAgICAgICB0aGlzLmJhc2VPYmplY3QgPSBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb24uamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDkyODRmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUluZm9ybWF0aW9uCi17Ci0gICAgYm9vbGVhbiBjb250YWluc0luZm9ybWF0aW9uKFN0cmluZyBrZXkpOwotICAgIE9iamVjdCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5KTsKLSAgICA8VD4gVCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcyk7Ci0gICAgdm9pZCBzZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpOwotCi0gICAgTWV0YURhdGFFbnRyeVtdIGdldE1ldGFEYXRhRW50cmllcygpOwotICAgIHZvaWQgYWRkTWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpOwotICAgIHZvaWQgcmVzZXRNZXRhRGF0YUVudHJpZXMoKTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZlZjQzMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzCi17Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ERVRBSUxTID0gInByb3BlcnR5X2RldGFpbHMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9WQUxJREFUSU9OID0gInNraXBfdmFsaWRhdGlvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJsYWJlbCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fUFJPUEVSVElFUyA9ICJjdXN0b21fcHJvcGVydGllcyI7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L0RlZmF1bHRQcm94eUhlbHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm94eS9EZWZhdWx0UHJveHlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4NWI5Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L0RlZmF1bHRQcm94eUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRQcm94eUhlbHBlciBpbXBsZW1lbnRzIFByb3h5SGVscGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdFByb3h5SGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIDxUPiBDbGFzczxUPiBnZXRVbnByb3hpZWRDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MsIENsYXNzPFQ+IHRhcmdldFR5cGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoQ2xhc3M8VD4pZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudENsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VW5wcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZihpc1Byb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVPZkNsYXNzKENsYXNzIGN1cnJlbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYgKGlzUHJveGllZENsYXNzKGN1cnJlbnRDbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzcy5nZXROYW1lKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWVPZk9iamVjdChPYmplY3Qgb2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZihvYmplY3QgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0TmFtZU9mQ2xhc3Mob2JqZWN0LmdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRFbmhhbmNlckJ5Q0dMSUIkJCIpIHx8DQotICAgICAgICAgICAgY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRGYXN0Q2xhc3NCeUNHTElCJCQiKSB8fA0KLSAgICAgICAgICAgIGN1cnJlbnRDbGFzcy5nZXROYW1lKCkuY29udGFpbnMoIl8kJF9qYXZhc3Npc3QiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3hpZWRPYmplY3QoT2JqZWN0IHByb3hpZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm94aWVkT2JqZWN0ICE9IG51bGwgJiYgaXNQcm94aWVkQ2xhc3MocHJveGllZE9iamVjdC5nZXRDbGFzcygpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L1Byb3h5SGVscGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L1Byb3h5SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZTdlNGEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm94eS9Qcm94eUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFByb3h5SGVscGVyDQotew0KLSAgICBDbGFzcyBnZXRVbnByb3hpZWRDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MpOw0KLQ0KLSAgICA8VD4gQ2xhc3M8VD4gZ2V0VW5wcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzLCBDbGFzczxUPiB0YXJnZXRUeXBlKTsNCi0NCi0gICAgU3RyaW5nIGdldE5hbWVPZkNsYXNzKENsYXNzIHByb3hpZWRDbGFzcyk7DQotDQotICAgIFN0cmluZyBnZXRDbGFzc05hbWVPZk9iamVjdChPYmplY3QgcHJveGllZE9iamVjdCk7DQotDQotICAgIGJvb2xlYW4gaXNQcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKTsNCi0NCi0gICAgYm9vbGVhbiBpc1Byb3hpZWRPYmplY3QoT2JqZWN0IHByb3hpZWRPYmplY3QpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlY29yZGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzBmMjNmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLQotLyoqCi0gKiBBbGxvd3MgdG8gY2FwdHVyZSBjb252ZXJ0ZWQgdmFsdWVzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyCi17Ci0gICAgdm9pZCByZWNvcmRVc2VySW5wdXQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNTkyMGMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci0KLS8qKgotICogQmFzZSBmb3IgYWxsIFJlbmRlcktpdFdyYXBwZXJGYWN0b3JpZXMgdG8gZm9yY2UgYSBzcGVjaWZpYyBiZWhhdmlvdXIKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxSZW5kZXJLaXQsIFJlbmRlcktpdD4KLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnkgd3JhcHBlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZGVhY3RpdmF0ZWQgPSBmYWxzZTsKLQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSByZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UocmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLndyYXBwZWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy53cmFwcGVkLmFkZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZGVhY3RpdmF0ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuZGVhY3RpdmF0ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVhY3RpdmF0ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlYWN0aXZhdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBSZW5kZXJLaXQgY3JlYXRlKFJlbmRlcktpdCByZW5kZXJLaXQpCi0gICAgewotICAgICAgICBpZihpc0RlYWN0aXZhdGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVuZGVyS2l0IHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYodGhpcy53cmFwcGVkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMud3JhcHBlZC5jcmVhdGUocmVuZGVyS2l0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlV3JhcHBlcihyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgUmVuZGVyS2l0IGNyZWF0ZVdyYXBwZXIoUmVuZGVyS2l0IHJlbmRlcktpdCk7Ci0KLSAgICAvKioKLSAgICAgKiBzaW1wbGUgdGVzdCBmb3IgZWFybHkgY29uZmlnIGluIGNhc2Ugb2YgbW9qYXJyYSAoaW5jbC4gdGhlIGNvbWJpbmF0aW9uIHdpdGggdHJpbmlkYWQpLgotICAgICAqIHVzZSBhIGN1c3RvbSBleHR2YWwgY29udGV4dCBpbXBsLiAoc2VlIEVYVFZBTC01OCkgdG8gb3B0aW1pemUgdGhpcyBjaGVjayBmb3IgdGhlIHRhcmdldCBydW50aW1lLgotICAgICAqIHRoaXMgY2hlY2sgd29ya3MgZm9yIGFsbCBjdXJyZW50IGltcGxlbWVudGF0aW9ucyBzaW5jZSB0aGUganNmIGludGVybmFscyBhcmUgYXV0b20uIHJlYWR5IGR1cmluZyBhIHJlcXVlc3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGpzZiBpbXBsLiBpcyBpbml0aWFsaXplZCBhbmQgaXQncyBwb3NzaWJsZSB0byB1c2UgaXQgYXMgZXhwZWN0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FwcGxpY2F0aW9uSW5pdGlhbGl6ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEpzZlV0aWxzLmlzQXBwbGljYXRpb25Jbml0aWFsaXplZCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0RlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMjZiNzIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkKLXsKLSAgICBwcml2YXRlIFJlbmRlcktpdCByZW5kZXJLaXQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSSUNfUkVOREVSX0tJVF9XUkFQUEVSX0ZBQ1RPUlkgPQotICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdC5HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkiOwotICAgIHByaXZhdGUgc3RhdGljIEJvb2xlYW4gdXNlR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0dmFsIHJlbmRlcmtpdCB3cmFwcGVyIGNyZWF0ZWQgZm9yICIgKyByZW5kZXJLaXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy93b3JrYXJvdW5kIGZvciBtb2phcnJhIChFWFRWQUwtMzgpCi0gICAgICAgIGlmKHVzZUdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyBnZW5lcmljRmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKEdFTkVSSUNfUkVOREVSX0tJVF9XUkFQUEVSX0ZBQ1RPUlkpOwotICAgICAgICAgICAgdXNlR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID0gZ2VuZXJpY0ZhY3RvcnkgIT0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHVzZUdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSkKLSAgICAgICAgewotICAgICAgICAgICAgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSByZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSA9IChBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KUNsYXNzVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoR0VORVJJQ19SRU5ERVJfS0lUX1dSQVBQRVJfRkFDVE9SWSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY3JlYXRlV3JhcHBlcihyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGhpcy5yZW5kZXJLaXQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5yZW5kZXJLaXQgPSBuZXcgRXh0VmFsUmVuZGVyS2l0KHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyS2l0OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxMYXp5UmVuZGVyZXJQcm94eS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzNjI4Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxMYXp5UmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLQotLyoqCi0gKiB0byBzdXBwb3J0IGEgY3VzdG9tIHByb3h5Ci0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIEV4dFZhbExhenlSZW5kZXJlclByb3h5IGV4dGVuZHMgUmVuZGVyZXIKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBSZW5kZXJlciB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbExhenlSZW5kZXJlclByb3h5KFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyZXI7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic2ltcGxlIHByb3h5IGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBnZXRMYXp5UmVuZGVyZXIoKS5kZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRMYXp5UmVuZGVyZXIoKS5jb252ZXJ0Q2xpZW50SWQoZmFjZXNDb250ZXh0LCBzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldExhenlSZW5kZXJlcigpLmdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJlciBnZXRMYXp5UmVuZGVyZXIoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHByb3h5Q2xhc3NOYW1lID0gKFN0cmluZykgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVkpOwotCi0gICAgICAgIGlmKHByb3h5Q2xhc3NOYW1lICE9IG51bGwgJiYgIXByb3h5Q2xhc3NOYW1lLmVuZHNXaXRoKGdldENsYXNzKCkuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShwcm94eUNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmKHRhcmdldENsYXNzID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYSBjdXN0b20gaW52YWxpZCByZW5kZXJlciBwcm94eSBpcyBjb25maWd1cmVkOiAiICsgcHJveHlDbGFzc05hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDbGFzc1tdIGFyZ0NsYXNzZXMgPSBuZXcgQ2xhc3NbMV07Ci0gICAgICAgICAgICBhcmdDbGFzc2VzWzBdID0gUmVuZGVyZXIuY2xhc3M7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGFyZ2V0Q2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJnQ2xhc3Nlcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChSZW5kZXJlciljb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSh0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgY3JlYXRlOiAiICsgdGFyZ2V0Q2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZDsKLSAgICAgICAgfQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMzU0ZTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LlJlc3BvbnNlU3RyZWFtOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VXcml0ZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlc3BvbnNlU3RhdGVNYW5hZ2VyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyS2l0IGV4dGVuZHMgUmVuZGVyS2l0Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLSAgICBwcm90ZWN0ZWQgUmVuZGVyS2l0IHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyS2l0KFJlbmRlcktpdCB3cmFwcGVkKQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsKLQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgaWYgKHJlbmRlcmVyIGluc3RhbmNlb2YgRXh0VmFsUmVuZGVyZXJXcmFwcGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCByZW5kZXJlcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCBjcmVhdGVXcmFwcGVyKHJlbmRlcmVyKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVuZGVyZXIgZ2V0UmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSkKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyIHJlbmRlcmVyID0gd3JhcHBlZC5nZXRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSk7Ci0KLSAgICAgICAgaWYocmVuZGVyZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyIGluc3RhbmNlb2YgRXh0VmFsUmVuZGVyZXJXcmFwcGVyID8gcmVuZGVyZXIgOiBjcmVhdGVXcmFwcGVyKHJlbmRlcmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIud2Fybigibm8gcmVuZGVyZXIgZm91bmQgZm9yIGZhbWlseSAiICsgZmFtaWx5ICsgIiBhbmQgdHlwZSAiICsgcmVuZGVyZXJUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZW5kZXJlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdGF0ZU1hbmFnZXIgZ2V0UmVzcG9uc2VTdGF0ZU1hbmFnZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UmVzcG9uc2VTdGF0ZU1hbmFnZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2VXcml0ZXIgY3JlYXRlUmVzcG9uc2VXcml0ZXIoV3JpdGVyIHdyaXRlciwgU3RyaW5nIHMsIFN0cmluZyBzMSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmNyZWF0ZVJlc3BvbnNlV3JpdGVyKHdyaXRlciwgcywgczEpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZVN0cmVhbSBjcmVhdGVSZXNwb25zZVN0cmVhbShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY3JlYXRlUmVzcG9uc2VTdHJlYW0ob3V0cHV0U3RyZWFtKTsKLSAgICB9Ci0KLSAgICBAVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQotICAgIHByb3RlY3RlZCBSZW5kZXJlciBjcmVhdGVXcmFwcGVyKFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxSZW5kZXJlcldyYXBwZXIocmVuZGVyZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM3NmI5OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0RmFjdG9yeTsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBjZW50cmFsIG1lY2hhbmlzbSB3aGljaCBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgYSB3cmFwcGVyIGZvciBhIHJlbmRlcmVyIC0gc3RhcnRpbmcgcG9pbnQgb2YgZXh0dmFsLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeSBleHRlbmRzIFJlbmRlcktpdEZhY3RvcnkKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotICAgIHByaXZhdGUgUmVuZGVyS2l0RmFjdG9yeSB3cmFwcGVkOwotICAgIHByaXZhdGUgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBkZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIGlzRGVhY3RpdmF0ZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyS2l0RmFjdG9yeShSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnkpCi0gICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSByZW5kZXJLaXRGYWN0b3J5OwotCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyS2l0KFN0cmluZyBzLCBSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkLmFkZFJlbmRlcktpdChzLCByZW5kZXJLaXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZW5kZXJLaXQgZ2V0UmVuZGVyS2l0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgUmVuZGVyS2l0IHJlbmRlcktpdCA9IHRoaXMud3JhcHBlZC5nZXRSZW5kZXJLaXQoZmFjZXNDb250ZXh0LCBzKTsKLQotICAgICAgICAvL2ZvciBtb2phcnJhICsgdHJpbmlkYWQKLSAgICAgICAgaWYocmVuZGVyS2l0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5VG9Jbml0RGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7Ci0KLSAgICAgICAgY2hlY2tSZW5kZXJLaXRGYWN0b3J5RGVhY3RpdmF0aW9uKCk7Ci0KLSAgICAgICAgaWYodGhpcy5pc0RlYWN0aXZhdGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy90ZXN0IGVhcmx5IGNvbmZpZyBpbiBjYXNlIG9mIG1vamFycmEKLSAgICAgICAgaWYoIXRoaXMuZGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmlzQXBwbGljYXRpb25Jbml0aWFsaXplZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY3JlYXRlV3JhcHBlcihyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRyeVRvQ3JlYXRlV3JhcHBlcldpdGhXcmFwcGVyRmFjdG9yeShyZW5kZXJLaXQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja1JlbmRlcktpdEZhY3RvcnlEZWFjdGl2YXRpb24oKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5pc0RlYWN0aXZhdGVkID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLmlzRXh0VmFsRGVhY3RpdmF0ZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmlzRGVhY3RpdmF0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYodGhpcy5kZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuaXNBcHBsaWNhdGlvbkluaXRpYWxpemVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc0RlYWN0aXZhdGVkID0gaXNSZW5kZXJLaXRGYWN0b3J5RGVhY3RpdmF0ZWRWaWFXZWJYbWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmlzRGVhY3RpdmF0ZWQgPSBpc1JlbmRlcktpdEZhY3RvcnlEZWFjdGl2YXRlZFZpYVZNUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHRyeVRvSW5pdERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpCi0gICAgewotICAgICAgICBpZih0aGlzLmRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL3dvcmthcm91bmQgZm9yIG1vamFycmEgdG8gYWxsb3cgYSBjdXN0b20gZmFjdG9yeSBkdXJpbmcgdGhlIGVhcmx5IGNvbmZpZyBwaGFzZQotICAgICAgICAgICAgLy9qdXN0IGNyZWF0ZSB0aGUgZmFjdG9yeSB3aXRoIHRoZSBnaXZlbiBuYW1lCi0gICAgICAgICAgICAvLytpdCBzaG91bGQgZXh0ZW5kIHlvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIHdoaWNoIHlvdSByZWdpc3RlciBhcyB1c3VhbAotICAgICAgICAgICAgT2JqZWN0IGN1c3RvbUZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoCi0gICAgICAgICAgICAgICAgICAgIEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsgIi5jdXN0b20uUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkiKTsKLQotICAgICAgICAgICAgaWYoY3VzdG9tRmFjdG9yeSBpbnN0YW5jZW9mIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgPSAoQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSljdXN0b21GYWN0b3J5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID0gbmV3IERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJLaXQgdHJ5VG9DcmVhdGVXcmFwcGVyV2l0aFdyYXBwZXJGYWN0b3J5KFJlbmRlcktpdCByZW5kZXJLaXQpCi0gICAgewotICAgICAgICBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IHdyYXBwZXJGYWN0b3J5ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpCi0gICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgLy9zb21lIGNvbXBvbmVudCBsaWJzIGUuZy4gbXlmYWNlcy10cmluaWRhZCBhcmVuJ3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgY2xlYW4gYXBwcm9hY2gKLSAgICAgICAgLy9leGFtcGxlIHNlZSBUcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lcgotICAgICAgICBpZih3cmFwcGVyRmFjdG9yeS5pc0RlYWN0aXZhdGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJLaXQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gd3JhcHBlckZhY3RvcnkuY3JlYXRlKHJlbmRlcktpdCk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gZ2V0UmVuZGVyS2l0SWRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQuZ2V0UmVuZGVyS2l0SWRzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVuZGVyS2l0RmFjdG9yeURlYWN0aXZhdGVkVmlhV2ViWG1sKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9SRU5ERVJfS0lUX0ZBQ1RPUlkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlbmRlcktpdEZhY3RvcnlEZWFjdGl2YXRlZFZpYVZNUGFyYW1ldGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShTeXN0ZW0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgKwotICAgICAgICAgICAgICAgICAgICAiLkRFQUNUSVZBVEVfUkVOREVSX0tJVF9GQUNUT1JZIiwgImZhbHNlIikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyUHJveHkuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzNjEzYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5SZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUmVuZGVyZXJQcm94eVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSnNmUHJvamVjdFN0YWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIHRvIGF2b2lkIG11bHRpcGxlIGNhbGxzIG9mIHJlbmRlcmVyIG1ldGhvZHMgd2l0aGluIHJlbmRlcmVyIGludGVyY2VwdG9ycyAoZS5nLiBmb3IgZW5jb2RlLCBkZWNvZGUsLi4uKQotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyZXJQcm94eSBleHRlbmRzIFJlbmRlcmVyCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZID0gRXh0VmFsUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCkgKyAiOktFWSI7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgd3JhcHBlZDsKLQotICAgIHB1YmxpYyBFeHRWYWxSZW5kZXJlclByb3h5KFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyZXI7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgicHJveHkgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkgPSBnZXRSZW5kZXJlckVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNEZWNvZGVDYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RGVjb2RlQ2FsbGVkKHRydWUpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLndyYXBwZWQuZGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnlUb0NyZWF0ZU1lc3NhZ2UoImRlY29kZSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBlbnRyeSA9IGdldFJlbmRlcmVyRW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0VuY29kZUJlZ2luQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldEVuY29kZUJlZ2luQ2FsbGVkKHRydWUpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVkLmVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnlUb0NyZWF0ZU1lc3NhZ2UoImVuY29kZUJlZ2luIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGVudHJ5ID0gZ2V0UmVuZGVyZXJFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRW5jb2RlQ2hpbGRyZW5DYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RW5jb2RlQ2hpbGRyZW5DYWxsZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlZC5lbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DcmVhdGVNZXNzYWdlKCJlbmNvZGVDaGlsZHJlbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkgPSBnZXRSZW5kZXJlckVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNFbmNvZGVFbmRDYWxsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnkuc2V0RW5jb2RlRW5kQ2FsbGVkKHRydWUpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLndyYXBwZWQuZW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnlUb0NyZWF0ZU1lc3NhZ2UoImVuY29kZUVuZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0Q2xpZW50SWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udmVydENsaWVudElkKGZhY2VzQ29udGV4dCwgcyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgewotICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICB0aHJvdyB0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkgPSBnZXRSZW5kZXJlckVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmIChlbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVudHJ5LnNldENvbnZlcnRlZFZhbHVlKHdyYXBwZWQuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnlUb0NyZWF0ZU1lc3NhZ2UoImdldENvbnZlcnRlZFZhbHVlIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZ2V0UmVuZGVyZXJFbnRyeShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpOwotCi0gICAgICAgIGtleSArPSBnZXRPcHRpb25hbEtleShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWdldFJlbmRlcmVyU3RvcmFnZSgpLmNvbnRhaW5zRW50cnkoZ2V0UmVuZGVyZXJLZXkoKSwga2V5KSkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0UmVuZGVyZXJTdG9yYWdlKCkuc2V0RW50cnkoZ2V0UmVuZGVyZXJLZXkoKSwga2V5LCBuZXcgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZXJTdG9yYWdlKCkuZ2V0RW50cnkoZ2V0UmVuZGVyZXJLZXkoKSwga2V5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wdGlvbmFsS2V5KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVuZGVyZXJLZXkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFByb3h5VXRpbHMuZ2V0Q2xhc3NOYW1lKHRoaXMud3JhcHBlZC5nZXRDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlbmRlcmVyUHJveHlTdG9yYWdlIGdldFJlbmRlcmVyU3RvcmFnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShSZW5kZXJlclByb3h5U3RvcmFnZS5jbGFzcywgUmVuZGVyZXJQcm94eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgLy9yZXNldCBjb21wb25lbnQgcHJveHkgbWFwcGluZwotICAgICAgICBFeHRWYWxVdGlscy5yZXNldFN0b3JhZ2UoUmVuZGVyZXJQcm94eVN0b3JhZ2UuY2xhc3MsIFJlbmRlcmVyUHJveHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvQ3JlYXRlTWVzc2FnZShTdHJpbmcgbWV0aG9kTmFtZSkKLSAgICB7Ci0gICAgICAgIGlmKEpzZlByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuRGV2ZWxvcG1lbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJkb3VibGUgY2FsbCBvZiAiICsgdGhpcy53cmFwcGVkLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiMiICsgbWV0aG9kTmFtZSArICIgZmlsdGVyZWQuICIgKwotICAgICAgICAgICAgICAgICAgICAidGhpcyBvcHRpbWl6YXRpb24gbWlnaHQgbGVhZCB0byBpbmNvbXBhdGliaWxpdGllcyB3aXRoIHNvbWUgY29tcG9uZW50IGxpYnMuICIgKwotICAgICAgICAgICAgICAgICAgICAiaW4gc3VjaCBhIGNhc2UgdXNlIHRoZSBzdXBwb3J0IG1vZHVsZSBmb3IgdGhlIGNvbXBvbmVudCBsaWIgb3IgdXNlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgIkV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZLCBudWxsKTsgIiArCi0gICAgICAgICAgICAgICAgICAgICJpbiBhIHN0YXJ0dXAgbGlzdGVuZXIiOwotCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgLmFkZE1lc3NhZ2UobnVsbCwgRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOLCBtZXNzYWdlLCBtZXNzYWdlKSk7Ci0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4obWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJ0dXJuIG9uIHRoZSBkZXZlbG9wbWVudCBtb2RlIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCBpZiBzb21ldGhpbmcgaXMgZGlzcGxheWVkIHdyb25nLiIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjMzA1ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotCi0vKioKLSAqIERlZmF1bHQgYXBwcm9hY2ggdG8gYXZvaWQgcHJveGllcyBmb3IgY29udmVydGVycyBhbmQgdGhlIGFkYXB0ZXIgZmFsbGJhY2suCi0gKiBJdCByZXF1aXJlcyB0aGF0IGNvbXBvbmVudHMgZGVsZWdhdGUgZ2V0Q29udmVydGVkVmFsdWUgdG8gYSByZW5kZXJlci48YnIvPgotICogSWYgaXQgaXNuJ3QgdGhlIGNhc2UgZm9yIHlvdXIgY29tcG9uZW50IGxpYiB1c2U6Ci0gKiBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5FeHRWYWxBcHBsaWNhdGlvbkZhY3Rvcnk8YnIvPgotICogYW5kPGJyLz4KLSAqIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5LlByb3h5TWFwcGluZ1BoYXNlTGlzdGVuZXIKLSAqIDxwLz4KLSAqIFRoaXMgd3JhcHBlciB3aWxsIGFsc28gaW1wbGVtZW50IGNsaWVudC1zaWRlIHZhbGlkYXRpb24gYmVoYXZpb3VyCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBFeHRWYWxSZW5kZXJlcldyYXBwZXIgZXh0ZW5kcyBSZW5kZXJlcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgd3JhcHBlZDsKLSAgICBwcm90ZWN0ZWQgRXh0VmFsQ29udGV4dCBleHRWYWxDb250ZXh0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCk7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyZXJXcmFwcGVyKFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHByb3h5Q2xhc3NOYW1lID0gKFN0cmluZylFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSk7Ci0KLSAgICAgICAgaWYocHJveHlDbGFzc05hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyBleHR2YWwgcmVuZGVyZXIgcHJveHkgY29uZmlndXJlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSBuZXcgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkocmVuZGVyZXIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShwcm94eUNsYXNzTmFtZSk7Ci0KLSAgICAgICAgaWYodGFyZ2V0Q2xhc3MgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyBleHR2YWwgcmVuZGVyZXIgcHJveHkgY29uZmlndXJlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSBuZXcgRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkocmVuZGVyZXIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xhc3NbXSBhcmdDbGFzc2VzID0gbmV3IENsYXNzWzFdOwotICAgICAgICBhcmdDbGFzc2VzWzBdID0gUmVuZGVyZXIuY2xhc3M7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGFyZ2V0Q2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJnQ2xhc3Nlcyk7Ci0gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSAoUmVuZGVyZXIpY29uc3RydWN0b3IubmV3SW5zdGFuY2UocmVuZGVyZXIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIud2Fybigibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVyZXIgd3JhcHBlciBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZGVjb2RlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJkZWNvZGUgZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRGVjb2RlIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRGVjb2RlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJEZWNvZGUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckRlY29kZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImVuY29kZUJlZ2luIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUJlZ2luIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUJlZ2luIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5iZWZvcmVFbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZW5jb2RlQ2hpbGRyZW4gZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlQ2hpbGRyZW4gb2YgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUNoaWxkcmVuIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZGVsZWdhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuZW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJFbmNvZGVDaGlsZHJlbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVDaGlsZHJlbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQ2hpbGRyZW4gaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBlbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYmVmb3JlRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlRW5kKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJlbmNvZGVFbmQgZGVsZWdhdGlvbiBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGUuaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUVuZCBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlRW5kIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVFbmQgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGdldFJlbmRlcnNDaGlsZHJlbigpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZW5kZXJzQ2hpbGRyZW4oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gdHJ1ZTsKLSAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlR2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbywgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdCA9IGUuZ2V0UmV0dXJuVmFsdWVPbkV4Y2VwdGlvbihjb252ZXJ0ZWRPYmplY3QpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImdldENvbnZlcnRlZFZhbHVlIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUdldENvbnZlcnRlZFZhbHVlIG9mICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QgPSB3cmFwcGVkLmdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8pOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyR2V0Q29udmVydGVkVmFsdWUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvLCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyR2V0Q29udmVydGVkVmFsdWUgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckdldENvbnZlcnRlZFZhbHVlIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZE9iamVjdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMmZmZGEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNDcyNzkwNDk4NzY2MjUxMzQ2TDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThjMjBhNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDE4NDI0MDUxNDY0ODE0ODg4TDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkyMGZiZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9leGNlcHRpb24vU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlJlbmRlcmVySW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgY2xhc3MgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICAgIHByb3RlY3RlZCBSZW5kZXJlckludGVyY2VwdG9yIGV4Y2VwdGlvblNvdXJjZTsKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGluZm9ybWF0aW9uOwotICAgIGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjM0MzA3NDA3NzUzMjkxNTcyMkw7Ci0KLSAgICBwdWJsaWMgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbigpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzKQotICAgIHsKLSAgICAgICAgdGhpcy5za2lwT3RoZXJJbnRlcmNlcHRvcnMgPSBza2lwT3RoZXJJbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgcHVibGljIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oYm9vbGVhbiBza2lwT3RoZXJJbnRlcmNlcHRvcnMsIFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHRoaXMoc2tpcE90aGVySW50ZXJjZXB0b3JzKTsKLSAgICAgICAgdGhpcy5leGNlcHRpb25Tb3VyY2UgPSByZW5kZXJlckludGVyY2VwdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEluZm9ybWF0aW9uKE9iamVjdCBpbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIHRoaXMuaW5mb3JtYXRpb24gPSBpbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEluZm9ybWF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NraXBPdGhlckludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gc2tpcE90aGVySW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmV0dXJuVmFsdWVPbkV4Y2VwdGlvbihPYmplY3QgY3VycmVudFJldHVyblZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMuZXhjZXB0aW9uU291cmNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmV4Y2VwdGlvblNvdXJjZS5nZXRSZXR1cm5WYWx1ZU9uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbih0aGlzLCBjdXJyZW50UmV0dXJuVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjdXJyZW50UmV0dXJuVmFsdWU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0Fic3RyYWN0U3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNzBhNmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0Fic3RyYWN0U3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Qcm9qZWN0U3RhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIGV4ZWN1dGUgbG9naWMganVzdCBvbmNlLg0KLSAqIGUuZy4gcmVnaXN0ZXIgYXJ0aWZhY3RzIHZpYSBhcGkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgLy9kb24ndCByZW1vdmUgLSBpdCdzIGEgZmFsbGJhY2sgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggZGVyZWdpc3RyYXRpb24NCi0gICAgLy90YXJnZXQ6IGRvbid0IHByb2Nlc3MgaW5pdCBsb2dpYyBtb3JlIHRoYW4gb25jZQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENsYXNzPiBpbml0aWFsaXplZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVySW5pdGlhbGl6ZWQgPSBmYWxzZTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKEFic3RyYWN0U3RhcnR1cExpc3RlbmVyLmNsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZWRMaXN0ZW5lcnMuY29udGFpbnMoZ2V0Q2xhc3MoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnQgaW5pdCBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWlzU3RhcnR1cExpc3RlbmVyRGVhY3RpdmF0ZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJpbml0IG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZGVhY3RpdmF0ZWQiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImluaXQgb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBKc2ZVdGlscy5kZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcih0aGlzKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBkZXJlZ2lzdGVyaW5nIHRoZSBwaGFzZS1saXN0ZW5lciINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtPiB0aGVyZSBpcyBqdXN0IGEgbGl0dGxlIG92ZXJoZWFkLCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBidXQgZXZlcnl0aGluZyBlbHNlIHdvcmtzIGNvcnJlY3RseS4iDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaG93ZXZlciwgcGxlYXNlIGluZm9ybSB0aGUgY29tbXVuaXR5IGFib3V0IHlvdXIgY29uZmlndXJhdGlvbiIsIHQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWRMaXN0ZW5lcnMuYWRkKGdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5SRVNUT1JFX1ZJRVc7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTdGFydHVwTGlzdGVuZXJEZWFjdGl2YXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5pc0V4dFZhbERlYWN0aXZhdGVkKCkgfHwNCi0gICAgICAgICAgICAgICAgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sVXRpbHMuZ2V0SW5pdFBhcmFtZXRlcihudWxsLCBnZXRDbGFzcygpLmdldE5hbWUoKSArICI6REVBQ1RJVkFURUQiKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFByb2plY3RTdGFnZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgaWYoIWRlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlckluaXRpYWxpemVkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoUHJvamVjdFN0YWdlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpLCBnZXRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpLCBmYWxzZSk7DQotICAgICAgICAgICAgZGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVySW5pdGlhbGl6ZWQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBQcm9qZWN0U3RhZ2VSZXNvbHZlciBnZXRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdCgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvRXh0VmFsU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZDMyODEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0V4dFZhbFN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlBoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXIKLSAgICAgICAgLkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjUwNDgyNjQyMTA4NjU3MjAxMkw7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKEV4dFZhbEluZm9ybWF0aW9uLlZFUlNJT04gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnRpbmcgdXAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciB2IiArIEV4dFZhbEluZm9ybWF0aW9uLlZFUlNJT04pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydGluZyB1cCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsKLQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSwgRXh0VmFsUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCksIGZhbHNlKTsKLQotICAgICAgICBpbml0TmFtZU1hcHBlcnMoKTsKLSAgICAgICAgaW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgaW5pdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsKLSAgICAgICAgaW5pdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICBpbml0UGhhc2VMaXN0ZW5lcnMoKTsKLSAgICAgICAgaW5pdFZpb2xhdGlvblNldmVyaXR5S2V5KCk7Ci0gICAgICAgIGluaXREaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb25LZXkoKTsKLSAgICAgICAgaW5pdFJlcXVpcmVkSW5pdGlhbGl6YXRpb24oKTsKLSAgICAgICAgZXhlY3V0ZUN1c3RvbVN0YXJ0dXBMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0TmFtZU1hcHBlcnMoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGRlYWN0aXZhdGVEZWZhdWx0TmFtZU1hcHBlcnMgPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9ERUZBVUxUX05BTUVfTUFQUEVSUzsKLSAgICAgICAgaWYgKChkZWFjdGl2YXRlRGVmYXVsdE5hbWVNYXBwZXJzICE9IG51bGwgJiYgZGVhY3RpdmF0ZURlZmF1bHROYW1lTWFwcGVycy5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvL3JlZ2lzdGVyIG1ldGFkYXRhIHRvIHZhbGlkYXRpb24gc3RyYXRlZ3kgbmFtZSBtYXBwZXIKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsKLQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsKLQotICAgICAgICAvL3JlZ2lzdGVyIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWVzc2FnZSByZXNvbHZlciBuYW1lIG1hcHBlcgotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKSk7Ci0KLSAgICAgICAgLy9yZWdpc3RlciB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1ldGFkYXRhIHRyYW5zZm9ybWVyIG5hbWUgbWFwcGVyCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUN1c3RvbVN0YXJ0dXBMaXN0ZW5lcigpCi0gICAgewotICAgICAgICBTdHJpbmcgY3VzdG9tU3RhcnR1cExpc3RlbmVyTmFtZSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RBUlRVUF9MSVNURU5FUik7Ci0gICAgICAgIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lciA9Ci0gICAgICAgICAgICAoQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGN1c3RvbVN0YXJ0dXBMaXN0ZW5lck5hbWUpOwotCi0gICAgICAgIGlmKGN1c3RvbVN0YXJ0dXBMaXN0ZW5lciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJzdGFydCBpbml0IG9mICIgKyBjdXN0b21TdGFydHVwTGlzdGVuZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjdXN0b21TdGFydHVwTGlzdGVuZXIuaW5pdCgpOwotCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJpbml0IG9mICIgKyBjdXN0b21TdGFydHVwTGlzdGVuZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKAotICAgICAgICAgICAgICAgIG5ldyBIdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigKLSAgICAgICAgICAgICAgICBuZXcgVmlvbGF0aW9uU2V2ZXJpdHlWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCkKLSAgICB7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnNldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIobmV3IERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCksIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRQaGFzZUxpc3RlbmVycygpCi0gICAgewotICAgICAgICBKc2ZVdGlscy5yZWdpc3RlclBoYXNlTGlzdGVuZXIobmV3IFBoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0VmlvbGF0aW9uU2V2ZXJpdHlLZXkoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MuZ2V0TmFtZSgpLCBWaW9sYXRpb25TZXZlcml0eS5jbGFzcywgZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0RGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uS2V5KCkKLSAgICB7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KAotICAgICAgICAgICAgICAgIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCksIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcywgZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0UmVxdWlyZWRJbml0aWFsaXphdGlvbigpCi0gICAgewotICAgICAgICBpZihXZWJYbWxQYXJhbWV0ZXIuQUNUSVZBVEVfUkVRVUlSRURfSU5JVElBTElaQVRJT04gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiByZXF1aXJlZEluaXRpYWxpemF0aW9uID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkFDVElWQVRFX1JFUVVJUkVEX0lOSVRJQUxJWkFUSU9OKTsKLQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoIm1vZGU6aW5pdDpyZXF1aXJlZCIsIHJlcXVpcmVkSW5pdGlhbGl6YXRpb24sIGZhbHNlKTsKLQotICAgICAgICAgICAgaWYocmVxdWlyZWRJbml0aWFsaXphdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWFjdGl2YXRlUmVxdWlyZWRBdHRyaWJ1dGVTdXBwb3J0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpZiBpdCdzIGNvbmZpZ3VyZWQgdGhhdCByZXF1aXJlZCBpbml0IHNob3VsZCBoYXBwZW4sCi0gICAgICogaXQncyByZXF1aXJlZCB0byBkZWFjdGl2YXRlIHRoZSBzdXBwb3J0IGZvciB0aGUgcmVxdWlyZWQgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRlYWN0aXZhdGVSZXF1aXJlZEF0dHJpYnV0ZVN1cHBvcnQoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoIm1vZGU6cmVzZXQ6cmVxdWlyZWQiLCBCb29sZWFuLlRSVUUsIGZhbHNlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0QXBwbGljYXRpb25TY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIzOGJkZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5SRVVTRTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIGdlbmVyaWMgc3RvcmFnZSBtYW5hZ2VyIGltcGxlbWVudGF0aW9uIHdoaWNoIHN0b3JlcyB0aGUgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbnMgaW4gdGhlIGFwcGxpY2F0aW9uIHNjb3BlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihSRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxUPiBleHRlbmRzIEFic3RyYWN0U3RvcmFnZU1hbmFnZXI8VD4NCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBUPiByZXNvbHZlU3RvcmFnZU1hcCgpDQotICAgIHsNCi0gICAgICAgIE1hcCBhcHBsaWNhdGlvbk1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbk1hcCgpOw0KLSAgICAgICAgTWFwPFN0cmluZywgVD4gc3RvcmFnZU1hcDsNCi0NCi0gICAgICAgIGlmKCFhcHBsaWNhdGlvbk1hcC5jb250YWluc0tleShnZXRTdG9yYWdlTWFuYWdlcktleSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUPigpOw0KLSAgICAgICAgICAgIGFwcGxpY2F0aW9uTWFwLnB1dChnZXRTdG9yYWdlTWFuYWdlcktleSgpLCBzdG9yYWdlTWFwKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoTWFwPFN0cmluZywgVD4pYXBwbGljYXRpb25NYXAuZ2V0KGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY2NjE0ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LlJFVVNFOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogZ2VuZXJpYyBzdG9yYWdlIG1hbmFnZXIgaW1wbGVtZW50YXRpb24gd2hpY2ggc3RvcmVzIHRoZSBzdG9yYWdlIGltcGxlbWVudGF0aW9ucyBpbiB0aGUgcmVxdWVzdCBzY29wZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxUPiBleHRlbmRzIEFic3RyYWN0U3RvcmFnZU1hbmFnZXI8VD4NCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBUPiByZXNvbHZlU3RvcmFnZU1hcCgpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFQ+IHN0b3JhZ2VNYXA7DQotDQotICAgICAgICBpZighcmVxdWVzdE1hcC5jb250YWluc0tleShnZXRTdG9yYWdlTWFuYWdlcktleSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUPigpOw0KLSAgICAgICAgICAgIHJlcXVlc3RNYXAucHV0KGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCksIHN0b3JhZ2VNYXApOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChNYXA8U3RyaW5nLCBUPilyZXF1ZXN0TWFwLmdldChnZXRTdG9yYWdlTWFuYWdlcktleSgpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RTdG9yYWdlTWFuYWdlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0U3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg5OGI5Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5SRVVTRTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBnZW5lcmljIHN0b3JhZ2UgbWFuYWdlciBpbXBsZW1lbnRhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RvcmFnZU1hbmFnZXI8VD4gZXh0ZW5kcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8U3RyaW5nPg0KLSAgICAgICAgaW1wbGVtZW50cyBTdG9yYWdlTWFuYWdlcjxUPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4oKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0U3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBUIGNyZWF0ZShTdHJpbmcgc3RvcmFnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIFQgc3RvcmFnZU1hbmFnZXI7DQotICAgICAgICBTdHJpbmcgc3RvcmFnZUNsYXNzTmFtZTsNCi0gICAgICAgIC8vbnVsbCAtPiB1c2UgbmFtZSBtYXBwZXJzDQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8U3RyaW5nPiBuYW1lTWFwcGVyIDogdGhpcy5uYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlQ2xhc3NOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKHN0b3JhZ2VOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoc3RvcmFnZUNsYXNzTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHN0b3JhZ2VNYW5hZ2VyID0gcmVzb2x2ZVN0b3JhZ2Uoc3RvcmFnZU5hbWUsIHN0b3JhZ2VDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChzdG9yYWdlTWFuYWdlciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2VNYW5hZ2VyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBUIHJlc29sdmVTdG9yYWdlKFN0cmluZyBzdG9yYWdlS2V5LCBTdHJpbmcgc3RvcmFnZUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgVD4gc3RvcmFnZU1hcCA9IHJlc29sdmVTdG9yYWdlTWFwKCk7DQotDQotICAgICAgICBpZighc3RvcmFnZU1hcC5jb250YWluc0tleShzdG9yYWdlS2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlTWFwLnB1dChzdG9yYWdlS2V5LCAoVClDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoc3RvcmFnZUNsYXNzTmFtZSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHN0b3JhZ2VNYXAuZ2V0KHN0b3JhZ2VLZXkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNYXA8U3RyaW5nLCBUPiByZXNvbHZlU3RvcmFnZU1hcCgpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgc3RvcmFnZUtleSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgVD4gc3RvcmFnZU1hcCA9IHJlc29sdmVTdG9yYWdlTWFwKCk7DQotDQotICAgICAgICBpZihzdG9yYWdlTWFwICE9IG51bGwgJiYgc3RvcmFnZU1hcC5jb250YWluc0tleShzdG9yYWdlS2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDbGFzcyBzdG9yYWdlQ2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHN0b3JhZ2VNYXAuZ2V0KHN0b3JhZ2VLZXkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgIHN0b3JhZ2VNYXAucHV0KHN0b3JhZ2VLZXksIChUKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHN0b3JhZ2VDbGFzcykpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gZ2V0TmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5uYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdhZjAzMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlIGltcGxlbWVudHMgRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgUGhhc2VJZCBjdXJyZW50UGhhc2VJZDsNCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q3VycmVudFBoYXNlSWQoUGhhc2VJZCBwaGFzZUlkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmN1cnJlbnRQaGFzZUlkID0gcGhhc2VJZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRDdXJyZW50UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRQaGFzZUlkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTEzYmRmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlci5EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIGpzZiBpbmZvcm1hdGlvbiBub3QgYXZhaWxhYmxlIHZpYSBqc2YtYXBpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIgZXh0ZW5kcw0KLSAgICAgICAgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlPg0KLXsNCi0gICAgRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBEZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfRkFDRVNfSU5GT1JNQVRJT05fU1RPUkFHRTpLRVkiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDZiN2MuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuRmFjZXNNZXNzYWdlSG9sZGVyOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gIm9wdGlvbmFsIHBhcmFtZXRlciB0byBkZWFjdGl2YXRlIHNvcnRpbmciKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlIGltcGxlbWVudHMgRmFjZXNNZXNzYWdlU3RvcmFnZQ0KLXsNCi0gICAgTWFwPFN0cmluZywgVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgVmFsaWRhdGlvblJlc3VsdD4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkRmFjZXNNZXNzYWdlKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYoY2xpZW50SWQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjbGllbnRJZCA9ICIqIjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKCF0aGlzLnJlc3VsdHMuY29udGFpbnNLZXkoY2xpZW50SWQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMucmVzdWx0cy5wdXQoY2xpZW50SWQsIG5ldyBWYWxpZGF0aW9uUmVzdWx0KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGhpcy5yZXN1bHRzLmdldChjbGllbnRJZCkuYWRkRmFjZXNNZXNzYWdlSG9sZGVyKG5ldyBGYWNlc01lc3NhZ2VIb2xkZXIoZmFjZXNNZXNzYWdlLCBjbGllbnRJZCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZ2V0RmFjZXNNZXNzYWdlcygpDQotICAgIHsNCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgICAgIGZvcihWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRpb25SZXN1bHQgOiB0aGlzLnJlc3VsdHMudmFsdWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh2YWxpZGF0aW9uUmVzdWx0LmdldEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEFsbCgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdDsNCi0NCi0gICAgICAgIGZvcihWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRpb25SZXN1bHQgOiB0aGlzLnJlc3VsdHMudmFsdWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCA9IHZhbGlkYXRpb25SZXN1bHQuZ2V0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdCgpOw0KLSAgICAgICAgICAgIHNvcnRGYWNlc01lc3NhZ2VIb2xkZXJMaXN0KGZhY2VzTWVzc2FnZUhvbGRlckxpc3QpOw0KLQ0KLSAgICAgICAgICAgIGZvcihGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyIDogZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dC5hZGRNZXNzYWdlKGZhY2VzTWVzc2FnZUhvbGRlci5nZXRDbGllbnRJZCgpLCBmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0RmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc29ydEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QpDQotICAgIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCwgZ2V0RmFjZXNNZXNzYWdlQ29tcGFyYXRvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgQ29tcGFyYXRvcjxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZUNvbXBhcmF0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IENvbXBhcmF0b3I8RmFjZXNNZXNzYWdlSG9sZGVyPigpIHsNCi0gICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoRmFjZXNNZXNzYWdlSG9sZGVyIGhvbGRlcjEsIEZhY2VzTWVzc2FnZUhvbGRlciBob2xkZXIyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoaG9sZGVyMS5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpID09IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKGlzU2FtZVNldmVyaXR5KGhvbGRlcjEsIGhvbGRlcjIpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZU1lc3NhZ2VUZXh0KGhvbGRlcjEuZ2V0RmFjZXNNZXNzYWdlKCksIGhvbGRlcjIuZ2V0RmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmKGhvbGRlcjEuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKS5nZXRPcmRpbmFsKCkgPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlcjIuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKS5nZXRPcmRpbmFsKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByaXZhdGUgaW50IGNvbXBhcmVNZXNzYWdlVGV4dChGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlMSwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZTIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dDEgPSBmYWNlc01lc3NhZ2UxLmdldERldGFpbCgpOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dDIgPSBmYWNlc01lc3NhZ2UyLmdldERldGFpbCgpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZih0ZXh0MSA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0ZXh0MSA9IGZhY2VzTWVzc2FnZTEuZ2V0U3VtbWFyeSgpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmKHRleHQyID09IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRleHQyID0gZmFjZXNNZXNzYWdlMi5nZXRTdW1tYXJ5KCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYodGV4dDEgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYodGV4dDIgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0MS5jb21wYXJlVG9JZ25vcmVDYXNlKHRleHQyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NhbWVTZXZlcml0eShGYWNlc01lc3NhZ2VIb2xkZXIgaG9sZGVyMSwgRmFjZXNNZXNzYWdlSG9sZGVyIGhvbGRlcjIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBob2xkZXIxLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkuZXF1YWxzKGhvbGRlcjIuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTWFuYWdlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTIzMjZmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTmFtZU1hcHBlcjsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgZmFjZXMgbWVzc2FnZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTWFuYWdlciBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxGYWNlc01lc3NhZ2VTdG9yYWdlPg0KLXsNCi0gICAgRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX0ZBQ0VTX01FU1NBR0VTOktFWSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0R3JvdXBTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YjRkNjEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Hcm91cFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGdyb3Vwcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRHcm91cFN0b3JhZ2UgaW1wbGVtZW50cyBHcm91cFN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IGFkZGVkR3JvdXBzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PENsYXNzPj4oKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PENsYXNzPj4gcmVzdHJpY3RlZEdyb3VwcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgYWRkR3JvdXBUb0dyb3VwU3RvcmFnZShncm91cENsYXNzLCB2aWV3SWQsIGNsaWVudElkLCB0aGlzLmFkZGVkR3JvdXBzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZXN0cmljdEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgYWRkR3JvdXBUb0dyb3VwU3RvcmFnZShncm91cENsYXNzLCB2aWV3SWQsIGNsaWVudElkLCB0aGlzLnJlc3RyaWN0ZWRHcm91cHMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzc1tdIGdldEdyb3VwcyhTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMuYWRkZWRHcm91cHMuc2l6ZSgpIDwgMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vYWRkIGZvdW5kIGdyb3Vwcw0KLSAgICAgICAgU3RyaW5nIGtleSA9IEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBudWxsKTsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IHJlc3VsdExpc3RGb3JQYWdlID0gYnVpbGRHcm91cExpc3Qoa2V5LCB0aGlzLmFkZGVkR3JvdXBzKTsNCi0NCi0gICAgICAgIGtleSA9IEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBjbGllbnRJZCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN1bHRMaXN0Rm9yQ29tcG9uZW50ID0gYnVpbGRHcm91cExpc3Qoa2V5LCB0aGlzLmFkZGVkR3JvdXBzKTsNCi0NCi0gICAgICAgIC8vcmVtb3ZlIHJlc3RyaWN0ZWQgZ3JvdXBzDQotICAgICAgICBDbGFzc1tdIHJlc3VsdHNGb3JQYWdlID0NCi0gICAgICAgICAgICAgICAgZmlsdGVyR3JvdXBMaXN0KEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBudWxsKSwgcmVzdWx0TGlzdEZvclBhZ2UpOw0KLSAgICAgICAgQ2xhc3NbXSByZXN1bHRzRm9yQ29tcG9uZW50ID0NCi0gICAgICAgICAgICAgICAgZmlsdGVyR3JvdXBMaXN0KEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBjbGllbnRJZCksIHJlc3VsdExpc3RGb3JDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0c0ZvclBhZ2UubGVuZ3RoID09IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYocmVzdWx0c0ZvckNvbXBvbmVudC5sZW5ndGggPT0gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCJubyBncm91cHMgZm9yIGdyb3VwLXZhbGlkYXRpb24gYXZhaWxhYmxlLiIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF5YmUgeW91IHJlc3RyaWN0ZWQgYWxsIGdyb3VwcyBvciB5b3UgYXJlbid0IHVzaW5nIGdyb3Vwcy4iICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlYW4gdmFsaWRhdGlvbiB3aWxsIHVzZSB0aGUgZGVmYXVsdCBncm91cCBmb3IgdmFsaWRhdGlvbiIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRzRm9yQ29tcG9uZW50Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihyZXN1bHRzRm9yQ29tcG9uZW50Lmxlbmd0aCA9PSAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRzRm9yUGFnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBtZXJnZVJlc3VsdHMocmVzdWx0c0ZvclBhZ2UsIHJlc3VsdHNGb3JDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRHcm91cFRvR3JvdXBTdG9yYWdlKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IGdyb3VwU3RvcmFnZSkNCi0gICAgew0KLSAgICAgICAgTGlzdDxDbGFzcz4gZ3JvdXBMaXN0ID0gZ3JvdXBTdG9yYWdlLmdldChHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgY2xpZW50SWQpKTsNCi0NCi0gICAgICAgIGlmKGdyb3VwTGlzdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGdyb3VwTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgICAgICAgICAgZ3JvdXBTdG9yYWdlLnB1dChHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgY2xpZW50SWQpLCBncm91cExpc3QpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoIWdyb3VwTGlzdC5jb250YWlucyhncm91cENsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBncm91cExpc3QuYWRkKGdyb3VwQ2xhc3MpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxDbGFzcz4gYnVpbGRHcm91cExpc3QoU3RyaW5nIGtleSwgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IGdyb3VwU3RvcmFnZSkNCi0gICAgew0KLSAgICAgICAgTGlzdDxDbGFzcz4gbGlzdCA9IGdyb3VwU3RvcmFnZS5nZXQoa2V5KTsNCi0gICAgICAgIHJldHVybiAobGlzdCAhPSBudWxsKSA/IGxpc3QgOiBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3NbXSBmaWx0ZXJHcm91cExpc3QoU3RyaW5nIGtleSwgTGlzdDxDbGFzcz4gYWRkZWRHcm91cHMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHMgPSBidWlsZEdyb3VwTGlzdChrZXksIHRoaXMucmVzdHJpY3RlZEdyb3Vwcyk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBjdXJyZW50R3JvdXAgOiBhZGRlZEdyb3VwcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighcmVzdHJpY3RlZEdyb3Vwcy5jb250YWlucyhjdXJyZW50R3JvdXApKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoY3VycmVudEdyb3VwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0cy50b0FycmF5KG5ldyBDbGFzc1tyZXN1bHRzLnNpemUoKV0pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3NbXSBtZXJnZVJlc3VsdHMoQ2xhc3NbXSByZXN1bHRzRm9yUGFnZSwgQ2xhc3NbXSByZXN1bHRzRm9yQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBDbGFzc1tdIG1lcmdlZFJlc3VsdCA9IG5ldyBDbGFzc1tyZXN1bHRzRm9yUGFnZS5sZW5ndGggKyByZXN1bHRzRm9yQ29tcG9uZW50Lmxlbmd0aF07DQotDQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdHNGb3JQYWdlLCAwLCBtZXJnZWRSZXN1bHQsIDAsIHJlc3VsdHNGb3JQYWdlLmxlbmd0aCk7DQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdHNGb3JDb21wb25lbnQsIDAsIG1lcmdlZFJlc3VsdCwgcmVzdWx0c0ZvclBhZ2UubGVuZ3RoLCByZXN1bHRzRm9yQ29tcG9uZW50Lmxlbmd0aCk7DQotDQotICAgICAgICByZXR1cm4gbWVyZ2VkUmVzdWx0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0R3JvdXBTdG9yYWdlTWFuYWdlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNmI1YmMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRHcm91cFN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBncm91cHMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRHcm91cFN0b3JhZ2VNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPEdyb3VwU3RvcmFnZT4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfR1JPVVBTOktFWSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWV0YURhdGFTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZDdiNTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRNZXRhRGF0YVN0b3JhZ2UgaW1wbGVtZW50cyBNZXRhRGF0YVN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWFwPFN0cmluZywgUHJvcGVydHlJbmZvcm1hdGlvbj4+IGNhY2hlZFByb3BlcnR5SW5mb3JtYXRpb24gPQ0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgUHJvcGVydHlJbmZvcm1hdGlvbj4+KCk7DQotDQotICAgIHByaXZhdGUgTGlzdDxNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IG1ldGFEYXRhU3RvcmFnZUZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4oKTsNCi0gICAgcHJpdmF0ZSBMaXN0PENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+PiBkZW5pZWRNZXRhRGF0YUZpbHRlcnMgPQ0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8Q2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0TWV0YURhdGFTdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgaW5pdEZpbHRlcnMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdEZpbHRlcnMoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIpOw0KLSAgICAgICAgbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoDQotICAgICAgICAgICAgICAgICAgICBDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfU1RPUkFHRV9GSUxURVIpKTsNCi0NCi0gICAgICAgIE1ldGFEYXRhU3RvcmFnZUZpbHRlciBtZXRhRGF0YVN0b3JhZ2VGaWx0ZXI7DQotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lIDogbWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgPQ0KLSAgICAgICAgICAgICAgICAoTWV0YURhdGFTdG9yYWdlRmlsdGVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAobWV0YURhdGFTdG9yYWdlRmlsdGVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLm1ldGFEYXRhU3RvcmFnZUZpbHRlcnMuYWRkKG1ldGFEYXRhU3RvcmFnZUZpbHRlcik7DQotDQotICAgICAgICAgICAgICAgIGxvZ0FkZGVkRmlsdGVyKG1ldGFEYXRhU3RvcmFnZUZpbHRlci5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc3RvcmVNZXRhRGF0YU9mKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgaW52b2tlRmlsdGVycyhwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvblRvU3RvcmUgPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBwcm9wZXJ0eUluZm9ybWF0aW9uDQotICAgICAgICAgICAgICAgIC5nZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgY29weU1ldGFEYXRhKHByb3BlcnR5SW5mb3JtYXRpb24sIHByb3BlcnR5SW5mb3JtYXRpb25Ub1N0b3JlKTsNCi0NCi0gICAgICAgIGdldE1hcEZvckNsYXNzKFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpKSkNCi0gICAgICAgICAgICAgICAgLnB1dChwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvblRvU3RvcmUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbnZva2VGaWx0ZXJzKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgZm9yKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBmaWx0ZXIgOiB0aGlzLm1ldGFEYXRhU3RvcmFnZUZpbHRlcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmlsdGVyLmZpbHRlcihwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeVtdIGdldE1ldGFEYXRhKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IGdldE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5nZXQodGFyZ2V0UHJvcGVydHkpOw0KLQ0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBjbG9uZWRQcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKCk7DQotICAgICAgICBjb3B5TWV0YURhdGEocHJvcGVydHlJbmZvcm1hdGlvbiwgY2xvbmVkUHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgICAgICByZXR1cm4gY2xvbmVkUHJvcGVydHlJbmZvcm1hdGlvbi5nZXRNZXRhRGF0YUVudHJpZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc01ldGFEYXRhRm9yKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykuY29udGFpbnNLZXkodGFyZ2V0UHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRmlsdGVyKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBzdG9yYWdlRmlsdGVyKQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoIWlzRmlsdGVyRGVuaWVkKHN0b3JhZ2VGaWx0ZXIpICYmICFpc0ZpbHRlckFscmVhZHlSZWdpc3RlcmVkKHN0b3JhZ2VGaWx0ZXIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5tZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzLmFkZChzdG9yYWdlRmlsdGVyKTsNCi0gICAgICAgICAgICAgICAgbG9nQWRkZWRGaWx0ZXIoc3RvcmFnZUZpbHRlci5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRmlsdGVyRGVuaWVkKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBzdG9yYWdlRmlsdGVyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5kZW5pZWRNZXRhRGF0YUZpbHRlcnMuY29udGFpbnMoZ2V0U3RvcmFnZUZpbHRlckNsYXNzKHN0b3JhZ2VGaWx0ZXIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNGaWx0ZXJBbHJlYWR5UmVnaXN0ZXJlZChNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgc3RvcmFnZUZpbHRlcikNCi0gICAgew0KLSAgICAgICAgZm9yKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBmaWx0ZXIgOiB0aGlzLm1ldGFEYXRhU3RvcmFnZUZpbHRlcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoZmlsdGVyLmdldENsYXNzKCkuZXF1YWxzKGdldFN0b3JhZ2VGaWx0ZXJDbGFzcyhzdG9yYWdlRmlsdGVyKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZGVyZWdpc3RlckZpbHRlcihDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPiBmaWx0ZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgTWV0YURhdGFTdG9yYWdlRmlsdGVyIHN0b3JhZ2VGaWx0ZXIgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzcyhmaWx0ZXJDbGFzcyk7DQotDQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5tZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzLnJlbW92ZShzdG9yYWdlRmlsdGVyKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGxvZ1JlbW92ZWRGaWx0ZXIoc3RvcmFnZUZpbHRlci5nZXRDbGFzcygpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBkZW55RmlsdGVyKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlcklkIDogdGhpcy5kZW5pZWRNZXRhRGF0YUZpbHRlcnMpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihmaWx0ZXJJZC5lcXVhbHMoZmlsdGVyQ2xhc3MpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdGhpcy5kZW5pZWRNZXRhRGF0YUZpbHRlcnMuYWRkKGZpbHRlckNsYXNzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGRlcmVnaXN0ZXJGaWx0ZXIoZmlsdGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkNCi0gICAgcHJpdmF0ZSB2b2lkIGNvcHlNZXRhRGF0YShQcm9wZXJ0eUluZm9ybWF0aW9uIHNvdXJjZSwgUHJvcGVydHlJbmZvcm1hdGlvbiB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRW50cnkgbmV3TWV0YURhdGFFbnRyeTsNCi0gICAgICAgIGZvcihNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkgOiBzb3VyY2UuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbmV3TWV0YURhdGFFbnRyeSA9IG5ldyBNZXRhRGF0YUVudHJ5KCk7DQotICAgICAgICAgICAgbmV3TWV0YURhdGFFbnRyeS5zZXRLZXkobWV0YURhdGFFbnRyeS5nZXRLZXkoKSk7DQotICAgICAgICAgICAgbmV3TWV0YURhdGFFbnRyeS5zZXRWYWx1ZShtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkpOw0KLQ0KLSAgICAgICAgICAgIHRhcmdldC5hZGRNZXRhRGF0YUVudHJ5KG5ld01ldGFEYXRhRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBsb2dBZGRlZEZpbHRlcihDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPiBmaWx0ZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oZmlsdGVyQ2xhc3MuZ2V0TmFtZSgpICsgIiBhZGRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBsb2dSZW1vdmVkRmlsdGVyKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhmaWx0ZXJDbGFzcy5nZXROYW1lKCkgKyAiIHJlbW92ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFByb3BlcnR5SW5mb3JtYXRpb24+IGdldE1hcEZvckNsYXNzKENsYXNzIHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGtleSA9IFByb3h5VXRpbHMuZ2V0Q2xhc3NOYW1lKHRhcmdldCk7DQotICAgICAgICBpZighdGhpcy5jYWNoZWRQcm9wZXJ0eUluZm9ybWF0aW9uLmNvbnRhaW5zS2V5KGtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5jYWNoZWRQcm9wZXJ0eUluZm9ybWF0aW9uLnB1dChrZXksIG5ldyBIYXNoTWFwPFN0cmluZywgUHJvcGVydHlJbmZvcm1hdGlvbj4oKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRQcm9wZXJ0eUluZm9ybWF0aW9uLmdldChrZXkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gZ2V0U3RvcmFnZUZpbHRlckNsYXNzKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBzdG9yYWdlRmlsdGVyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhzdG9yYWdlRmlsdGVyLmdldENsYXNzKCksIE1ldGFEYXRhU3RvcmFnZUZpbHRlci5jbGFzcyk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNjNjliZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRNZXRhRGF0YVN0b3JhZ2VOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIHByb3BlcnR5IGluZm9ybWF0aW9uIGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdEFwcGxpY2F0aW9uU2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPE1ldGFEYXRhU3RvcmFnZT4NCi17DQotICAgIERlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRNZXRhRGF0YVN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfTUVUQV9EQVRBX0NBQ0hFOktFWSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UHJvcGVydHlTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMGE3ZjAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9wZXJ0eVN0b3JhZ2UgaW1wbGVtZW50cyBQcm9wZXJ0eVN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWFwPFN0cmluZywgRmllbGQ+PiBmaWVsZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgRmllbGQ+PigpOw0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIE1ldGhvZD4+IG1ldGhvZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgTWV0aG9kPj4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgc3RvcmVGaWVsZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5LCBGaWVsZCBmaWVsZCkNCi0gICAgew0KLSAgICAgICAgZ2V0RmllbGRNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykucHV0KHByb3BlcnR5LCBmaWVsZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc3RvcmVNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSwgTWV0aG9kIG1ldGhvZCkNCi0gICAgew0KLSAgICAgICAgZ2V0TWV0aG9kTWFwRm9yQ2xhc3ModGFyZ2V0Q2xhc3MpLnB1dChwcm9wZXJ0eSwgIG1ldGhvZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZpZWxkIGdldEZpZWxkKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRGaWVsZE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5nZXQocHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRNZXRob2RNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykuZ2V0KHByb3BlcnR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0ZpZWxkKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRGaWVsZE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5jb250YWluc0tleShwcm9wZXJ0eSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldE1ldGhvZE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5jb250YWluc0tleShwcm9wZXJ0eSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBGaWVsZD4gZ2V0RmllbGRNYXBGb3JDbGFzcyhDbGFzcyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBrZXkgPSBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh0YXJnZXQpOw0KLSAgICAgICAgaWYgKCF0aGlzLmZpZWxkTWFwLmNvbnRhaW5zS2V5KGtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5maWVsZE1hcC5wdXQoa2V5LCBuZXcgSGFzaE1hcDxTdHJpbmcsIEZpZWxkPigpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0aGlzLmZpZWxkTWFwLmdldChrZXkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWV0aG9kPiBnZXRNZXRob2RNYXBGb3JDbGFzcyhDbGFzcyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBrZXkgPSBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh0YXJnZXQpOw0KLSAgICAgICAgaWYgKCF0aGlzLm1ldGhvZE1hcC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubWV0aG9kTWFwLnB1dChrZXksIG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kPigpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0aGlzLm1ldGhvZE1hcC5nZXQoa2V5KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFByb3BlcnR5U3RvcmFnZU1hbmFnZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UHJvcGVydHlTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzVhMTA0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UHJvcGVydHlTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdFByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXI7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIHByb3BlcnR5IGluZm9ybWF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0UHJvcGVydHlTdG9yYWdlTWFuYWdlciBleHRlbmRzIEFic3RyYWN0QXBwbGljYXRpb25TY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8UHJvcGVydHlTdG9yYWdlPg0KLXsNCi0gICAgRGVmYXVsdFByb3BlcnR5U3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdFByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBTdG9yYWdlTWFuYWdlci5jbGFzcy5nZXROYW1lKCkgKyAiX0ZPUl9QUk9QRVJUWTpLRVkiOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMzRjZTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZSBpbXBsZW1lbnRzIFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuZ2V0KGtleSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIDxUPiBUIGdldFByb3BlcnR5KFN0cmluZyBrZXksIENsYXNzPFQ+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFQpdGhpcy5wcm9wZXJ0aWVzLmdldChrZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydGllcy5yZW1vdmUoa2V5KTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NWJjMzAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciByZW5kZXJlciBpbnRlcmNlcHRvciBwcm9wZXJ0aWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU1hbmFnZXINCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2U+DQotew0KLSAgICBEZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfUkVOREVSRVJfSU5URVJDRVBUT1JfUFJPUEVSVFk6S0VZIjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMjdlZjguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlIGltcGxlbWVudGF0aW9uIGZvciBncm91cHMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2UgaW1wbGVtZW50cyBSZW5kZXJlclByb3h5U3RvcmFnZQ0KLXsNCi0gICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeT4+IHByb3h5U3RvcmFnZSA9DQotICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnk+PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnRyeShTdHJpbmcgcmVuZGVyZXJLZXksIFN0cmluZyBjbGllbnRJZCwgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBlbnRyeSkNCi0gICAgew0KLSAgICAgICAgZ2V0UmVuZGVyZXJTdG9yYWdlKHJlbmRlcmVyS2V5KS5wdXQoY2xpZW50SWQsIGVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0VudHJ5KFN0cmluZyByZW5kZXJlcktleSwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZXJTdG9yYWdlKHJlbmRlcmVyS2V5KS5jb250YWluc0tleShjbGllbnRJZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZ2V0RW50cnkoU3RyaW5nIHJlbmRlcmVyS2V5LCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRSZW5kZXJlclN0b3JhZ2UocmVuZGVyZXJLZXkpLmdldChjbGllbnRJZCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5PiBnZXRSZW5kZXJlclN0b3JhZ2UoU3RyaW5nIHJlbmRlcmVyS2V5KQ0KLSAgICB7DQotICAgICAgICBpZighcHJveHlTdG9yYWdlLmNvbnRhaW5zS2V5KHJlbmRlcmVyS2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm94eVN0b3JhZ2UucHV0KHJlbmRlcmVyS2V5LCBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnk+KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHByb3h5U3RvcmFnZS5nZXQocmVuZGVyZXJLZXkpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2QzYWNkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciByZW5kZXJlciBwcm94eSBlbnRyaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU1hbmFnZXINCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8UmVuZGVyZXJQcm94eVN0b3JhZ2U+DQotew0KLSAgICBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIC8vZm9yIGJldHRlciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5DQotICAgICAgICByZXR1cm4gRXh0VmFsUmVuZGVyZXJQcm94eS5jbGFzcy5nZXROYW1lKCkgKyAiOlNUT1JBR0UiOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0U3RvcmFnZU1hbmFnZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTU2NmRlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0U3RvcmFnZU1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBzdG9yYWdlLW1hbmFnZXIgY3JlYXRpb24gYW5kIGNhY2hpbmcNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0U3RvcmFnZU1hbmFnZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PENsYXNzPg0KLSAgICAgICAgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PENsYXNzLCBTdG9yYWdlTWFuYWdlcj4sIFN0b3JhZ2VNYW5hZ2VySG9sZGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gbGF6eVN0YXRpY01hcHBpbmdBcHBsaWVkID0gZmFsc2U7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPENsYXNzPj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8Q2xhc3M+PigpOw0KLSAgICBwcml2YXRlIE1hcDxDbGFzcywgU3RvcmFnZU1hbmFnZXI+IHN0b3JhZ2VUeXBlVG9TdG9yYWdlTWFuYWdlck1hcCA9IG5ldyBIYXNoTWFwPENsYXNzLCBTdG9yYWdlTWFuYWdlcj4oKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoUmVuZGVyZXJQcm94eVN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKEdyb3VwU3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRHcm91cFN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKE1ldGFEYXRhU3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKEZhY2VzTWVzc2FnZVN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoUHJvcGVydHlTdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFByb3BlcnR5U3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTWFuYWdlcigpLCBmYWxzZSk7DQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLQ0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RvcmFnZU1hbmFnZXIgY3JlYXRlKENsYXNzIHN0b3JhZ2VUeXBlKQ0KLSAgICB7DQotICAgICAgICBpZiAoIXRoaXMubGF6eVN0YXRpY01hcHBpbmdBcHBsaWVkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRTdGF0aWNNYXBwaW5ncygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RvcmFnZU1hbmFnZXIgc3RvcmFnZU1hbmFnZXI7DQotICAgICAgICBTdHJpbmcgc3RvcmFnZU1hbmFnZXJOYW1lOw0KLSAgICAgICAgLy9udWxsIC0+IHVzZSBuYW1lIG1hcHBlcnMNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxDbGFzcz4gbmFtZU1hcHBlciA6IHRoaXMubmFtZU1hcHBlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RvcmFnZU1hbmFnZXJOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKHN0b3JhZ2VUeXBlKTsNCi0NCi0gICAgICAgICAgICBpZiAoc3RvcmFnZU1hbmFnZXJOYW1lID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgc3RvcmFnZU1hbmFnZXIgPSAoU3RvcmFnZU1hbmFnZXIpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHN0b3JhZ2VNYW5hZ2VyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHN0b3JhZ2VNYW5hZ2VyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKHN0b3JhZ2VUeXBlLCBzdG9yYWdlTWFuYWdlcik7DQotICAgICAgICAgICAgICAgIHJldHVybiBzdG9yYWdlTWFuYWdlcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZ2V0U3RvcmFnZU1hbmFnZXIoc3RvcmFnZVR5cGUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkTWFwcGluZyhDbGFzcyBzdG9yYWdlVHlwZSwgU3RvcmFnZU1hbmFnZXIgc3RvcmFnZU1hbmFnZXIpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gaXNWYWxpZEVudHJ5ID0gdHJ1ZTsNCi0gICAgICAgIGlmKHN0b3JhZ2VUeXBlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaXNWYWxpZEVudHJ5ID0gZmFsc2U7DQotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNFcnJvckVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCJ5b3UgdHJpZWQgdG8gYWRkIGFuIGludmFsaWQgc3RvcmFnZSB0eXBlIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoc3RvcmFnZU1hbmFnZXIgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpc1ZhbGlkRW50cnkgPSBmYWxzZTsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoInlvdSB0cmllZCB0byBhZGQgYW4gaW52YWxpZCBzdG9yYWdlIG1hbmFnZXIiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZighaXNWYWxpZEVudHJ5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKHN0b3JhZ2VUeXBlLCBzdG9yYWdlTWFuYWdlciwgdHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGF6eVN0YXRpY01hcHBpbmdBcHBsaWVkID0gdHJ1ZTsNCi0NCi0gICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlNUT1JBR0VfVFlQRV9UT19TVE9SQUdFX01BTkFHRVJfQ09ORklHKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXR1cE1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cE1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3MpDQotICAgIHsNCi0gICAgICAgIGZvcihTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IG1hcHBpbmcgOiBtYXBwaW5ncykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNYXBwaW5nKENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKG1hcHBpbmcuZ2V0U291cmNlKCkpLA0KLSAgICAgICAgICAgICAgICAgICAgKFN0b3JhZ2VNYW5hZ2VyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShtYXBwaW5nLmdldFRhcmdldCgpKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxDbGFzcz4+IGdldE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZU1hcHBlckxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0U3RvcmFnZU1hbmFnZXIoQ2xhc3Mgc3RvcmFnZVR5cGUsIFN0b3JhZ2VNYW5hZ2VyIHN0b3JhZ2VNYW5hZ2VyLCBib29sZWFuIG92ZXJyaWRlKQ0KLSAgICB7DQotICAgICAgICBpZighdGhpcy5zdG9yYWdlVHlwZVRvU3RvcmFnZU1hbmFnZXJNYXAuY29udGFpbnNLZXkoc3RvcmFnZVR5cGUpIHx8DQotICAgICAgICAgICAgICAgICh0aGlzLnN0b3JhZ2VUeXBlVG9TdG9yYWdlTWFuYWdlck1hcC5jb250YWluc0tleShzdG9yYWdlVHlwZSkgJiYgb3ZlcnJpZGUpKQ0KLSAgICAgICAgew0KLQ0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZGRpbmcgdHlwZSB0byBzdG9yYWdlLW1hbmFnZXIgbWFwcGluZzogIg0KLSAgICAgICAgICAgICAgICAgICAgKyBzdG9yYWdlVHlwZS5nZXROYW1lKCkgKyAiIC0+ICIgKyBzdG9yYWdlTWFuYWdlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHRoaXMuc3RvcmFnZVR5cGVUb1N0b3JhZ2VNYW5hZ2VyTWFwLnB1dChzdG9yYWdlVHlwZSwgc3RvcmFnZU1hbmFnZXIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdG9yYWdlTWFuYWdlciBnZXRTdG9yYWdlTWFuYWdlcihDbGFzcyB0eXBlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlVHlwZVRvU3RvcmFnZU1hbmFnZXJNYXAuZ2V0KHR5cGUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYwNjlkNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZSBpbXBsZW1lbnRzIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgdmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsNCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcihWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciA9IHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU1hbmFnZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZjc3ZmQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgYSBjdXN0b20gVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VNYW5hZ2VyIGV4dGVuZHMNCi0gICAgICAgIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZT4NCi17DQotICAgIERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX1ZJT0xBVElPTlNFVkVSSVRZX0lOVEVSUFJFVEVSOktFWSI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYwMTgzNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi0NCi0vKioNCi0gKiBzdG9yYWdlIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IGZhY2VzIHJlcXVlc3QNCi0gKiBmb3Igbm93IGl0IGp1c3QgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgcGhhc2Ugb2YgdGhlIGxpZmVjeWNsZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlDQotew0KLSAgICB2b2lkIHNldEN1cnJlbnRQaGFzZUlkKFBoYXNlSWQgcGhhc2VJZCk7DQotDQotICAgIFBoYXNlSWQgZ2V0Q3VycmVudFBoYXNlSWQoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9GYWNlc01lc3NhZ2VTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMDA5NWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkZhY2VzTWVzc2FnZUhvbGRlcjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRmFjZXNNZXNzYWdlU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBhZGRGYWNlc01lc3NhZ2UoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKTsNCi0NCi0gICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZXMoKTsNCi0NCi0gICAgdm9pZCBhZGRBbGwoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0dyb3VwU3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0dyb3VwU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmMwMTRiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Hcm91cFN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBzdWdnZXN0ZWQgaW50ZXJmYWNlIGZvciBhIGdyb3VwIHN0b3JhZ2UNCi0gKiB1c2VkIGJ5IHRoZSBidmkgbW9kdWxlIGFuZCBhZGQtb25zDQotICogPHAvPg0KLSAqIGl0IGFsbG93cyB0byBtYW5hZ2UgZ3JvdXBzIGZvciB0aGUgY3VycmVudCByZXF1ZXN0DQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBHcm91cFN0b3JhZ2UNCi17DQotICAgIHZvaWQgYWRkR3JvdXAoQ2xhc3MgZ3JvdXBDbGFzcywgU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKTsNCi0NCi0gICAgdm9pZCByZXN0cmljdEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCk7DQotDQotICAgIENsYXNzW10gZ2V0R3JvdXBzKFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NZXRhRGF0YVN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NZXRhRGF0YVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjllY2ViZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWV0YURhdGFTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBNZXRhRGF0YVN0b3JhZ2UNCi17DQotICAgIHZvaWQgc3RvcmVNZXRhRGF0YU9mKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgIE1ldGFEYXRhRW50cnlbXSBnZXRNZXRhRGF0YShDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldFByb3BlcnR5KTsNCi0NCi0gICAgYm9vbGVhbiBjb250YWluc01ldGFEYXRhRm9yKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpOw0KLQ0KLSAgICB2b2lkIHJlZ2lzdGVyRmlsdGVyKE1ldGFEYXRhU3RvcmFnZUZpbHRlciBzdG9yYWdlRmlsdGVyKTsNCi0NCi0gICAgdm9pZCBkZXJlZ2lzdGVyRmlsdGVyKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlckNsYXNzKTsNCi0NCi0gICAgdm9pZCBkZW55RmlsdGVyKENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGZpbHRlckNsYXNzKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01ldGFEYXRhU3RvcmFnZUZpbHRlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01ldGFEYXRhU3RvcmFnZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjJmZGI2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhU3RvcmFnZUZpbHRlcg0KLXsNCi0gICAgdm9pZCBmaWx0ZXIoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1Byb3BlcnR5U3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1Byb3BlcnR5U3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODczMjdkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Qcm9wZXJ0eVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlTdG9yYWdlDQotew0KLSAgICB2b2lkIHN0b3JlRmllbGQoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSwgRmllbGQgZmllbGQpOw0KLQ0KLSAgICB2b2lkIHN0b3JlTWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHksIE1ldGhvZCBtZXRob2QpOw0KLQ0KLSAgICBGaWVsZCBnZXRGaWVsZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5KTsNCi0NCi0gICAgTWV0aG9kIGdldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5KTsNCi0NCi0gICAgYm9vbGVhbiBjb250YWluc0ZpZWxkKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpOw0KLQ0KLSAgICBib29sZWFuIGNvbnRhaW5zTWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRmYWE5MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGEgc3RvcmFnZSB3aGljaCBpc24ndCB1c2VkIGludGVybmFsbHkuIGl0J3MgZm9yIGFkZC1vbnMgdG8gZWFzaWx5IHN0b3JlIHByb3BlcnRpZXMgb2YgaW50ZXJjZXB0b3JzLg0KLSAqIHdpdGhvdXQgYnJha2luZyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBpdCdzIHBvc3NpYmxlIHRvIHVzZSB0aGVzZSBwcm9wZXJ0aWVzIGluIGN1c3RvbSBhcnRpZmFjdHMuDQotICogcmVuZGVyaW5nIGludGVyY2VwdGlvbiBpcyBhbiBpbnRlcm5hbCBjb25jZXB0LiBzbyBwcm9wZXJ0aWVzLC4uLiBvZiBpdCB3b24ndCBnZXQgaW50byB0aGUgYXBpLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UNCi17DQotICAgIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKTsNCi0NCi0gICAgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpOw0KLQ0KLSAgICA8VD4gVCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcyk7DQotDQotICAgIHZvaWQgcmVtb3ZlUHJvcGVydHkoU3RyaW5nIGtleSk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVyUHJveHlTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MWE3NWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVyUHJveHlTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXJQcm94eVN0b3JhZ2UNCi17DQotICAgIHZvaWQgc2V0RW50cnkoU3RyaW5nIHJlbmRlcmVyS2V5LCBTdHJpbmcgY2xpZW50SWQsIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkpOw0KLQ0KLSAgICBib29sZWFuIGNvbnRhaW5zRW50cnkoU3RyaW5nIHJlbmRlcmVyS2V5LCBTdHJpbmcgY2xpZW50SWQpOw0KLQ0KLSAgICBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGdldEVudHJ5KFN0cmluZyByZW5kZXJlcktleSwgU3RyaW5nIGNsaWVudElkKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MzQ3NzguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkKLXsKLSAgICBwcml2YXRlIGJvb2xlYW4gZGVjb2RlQ2FsbGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGVuY29kZUJlZ2luQ2FsbGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGVuY29kZUNoaWxkcmVuQ2FsbGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGVuY29kZUVuZENhbGxlZCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBPYmplY3QgY29udmVydGVkVmFsdWUgPSBudWxsOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWNvZGVDYWxsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlY29kZUNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWNvZGVDYWxsZWQoYm9vbGVhbiBkZWNvZGVDYWxsZWQpCi0gICAgewotICAgICAgICB0aGlzLmRlY29kZUNhbGxlZCA9IGRlY29kZUNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuY29kZUJlZ2luQ2FsbGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbmNvZGVCZWdpbkNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVCZWdpbkNhbGxlZChib29sZWFuIGVuY29kZUJlZ2luQ2FsbGVkKQotICAgIHsKLSAgICAgICAgdGhpcy5lbmNvZGVCZWdpbkNhbGxlZCA9IGVuY29kZUJlZ2luQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlQ2hpbGRyZW5DYWxsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVuY29kZUNoaWxkcmVuQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kZUNoaWxkcmVuQ2FsbGVkKGJvb2xlYW4gZW5jb2RlQ2hpbGRyZW5DYWxsZWQpCi0gICAgewotICAgICAgICB0aGlzLmVuY29kZUNoaWxkcmVuQ2FsbGVkID0gZW5jb2RlQ2hpbGRyZW5DYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmNvZGVFbmRDYWxsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVuY29kZUVuZENhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVFbmRDYWxsZWQoYm9vbGVhbiBlbmNvZGVFbmRDYWxsZWQpCi0gICAgewotICAgICAgICB0aGlzLmVuY29kZUVuZENhbGxlZCA9IGVuY29kZUVuZENhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldENvbnZlcnRlZFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZWRWYWx1ZShPYmplY3QgY29udmVydGVkVmFsdWUpCi0gICAgewotICAgICAgICB0aGlzLmNvbnZlcnRlZFZhbHVlID0gY29udmVydGVkVmFsdWU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYzgzOTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LkFQSTsNCi0NCi0vKioNCi0gKiBtYW5hZ2VyIHRvIGNyZWF0ZSBhbmQgcmVzZXQgc3BlY2lmaWMgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbnMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKEFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFN0b3JhZ2VNYW5hZ2VyPFQ+DQotew0KLSAgICBUIGNyZWF0ZShTdHJpbmcga2V5KTsNCi0gICAgdm9pZCByZXNldChTdHJpbmcga2V5KTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VySG9sZGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXJIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmOTUzOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXJIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuQVBJOw0KLQ0KLS8qKg0KLSAqIGludGVyZmFjZSB0byBtYW5hZ2Ugc3RvcmFnZS1tYW5hZ2VyIGluc3RhbmNlcw0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKEFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFN0b3JhZ2VNYW5hZ2VySG9sZGVyDQotew0KLSAgICB2b2lkIHNldFN0b3JhZ2VNYW5hZ2VyKENsYXNzIHR5cGUsIFN0b3JhZ2VNYW5hZ2VyIHN0b3JhZ2VNYW5hZ2VyLCBib29sZWFuIG92ZXJyaWRlKTsNCi0gICAgU3RvcmFnZU1hbmFnZXIgZ2V0U3RvcmFnZU1hbmFnZXIoQ2xhc3MgdHlwZSk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WYWxpZGF0aW9uUmVzdWx0LmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvVmFsaWRhdGlvblJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzkzMjdjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WYWxpZGF0aW9uUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5GYWNlc01lc3NhZ2VIb2xkZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTE9XLCBkZXNjcmlwdGlvbiA9ICJyZWZhY3RvciBpdCIpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBWYWxpZGF0aW9uUmVzdWx0DQotew0KLSAgICBwcml2YXRlIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEZhY2VzTWVzc2FnZUhvbGRlcihGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZhY2VzTWVzc2FnZUhvbGRlckxpc3QuYWRkKGZhY2VzTWVzc2FnZUhvbGRlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBnZXRGYWNlc01lc3NhZ2VIb2xkZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZUhvbGRlckxpc3Q7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1Zpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVhYzExYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsNCi0NCi0vKioNCi0gKiBzdWdnZXN0ZWQgaW50ZXJmYWNlIGZvciBhIHZpb2xhdGlvbi1zZXZlcml0eS1pbnRlcnByZXRlciBzdG9yYWdlDQotICogdXNlZCBieSBhZGQtb25zIHRvIGNoYW5nZSB0aGUgaW50ZXJwcmV0ZXIgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlDQotew0KLSAgICB2b2lkIHNldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKTsNCi0NCi0gICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBnZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMTAyOTYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiB1c2UgYSBwdWJsaWMgY2xhc3MgdG8gYWxsb3cgb3B0aW9uYWwgZGVyZWdpc3RyYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhlOTdmMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkZhY2VzTWVzc2FnZVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDViZmU5Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuTWV0YURhdGFTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRNZXRhRGF0YVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1ldGFEYXRhU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKE1ldGFEYXRhU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdE1ldGFEYXRhU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEyMjY0MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdFByb3BlcnR5U3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5Qcm9wZXJ0eVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFByb3BlcnR5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdFByb3BlcnR5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTQ3NTI4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQyNGYzYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUmVuZGVyZXJQcm94eVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoUmVuZGVyZXJQcm94eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZWM4ZDcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiB1c2UgYSBwdWJsaWMgY2xhc3MgdG8gYWxsb3cgb3B0aW9uYWwgZGVyZWdpc3RyYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNGVhMmQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL0VtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSB4LnguMwotICovCi1AVGFyZ2V0KFRZUEUpCi1AUmV0ZW50aW9uKFJVTlRJTUUpCi1ARG9jdW1lbnRlZAotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgQGludGVyZmFjZSBFbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kKLXsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmQ0NjliLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSB4LnguMwotICovCi1AVGFyZ2V0KFRZUEUpCi1AUmV0ZW50aW9uKFJVTlRJTUUpCi1ARG9jdW1lbnRlZAotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgQGludGVyZmFjZSBOdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQotewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL1NraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNGNhYTQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL1NraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgU2tpcFZhbGlkYXRpb25FdmFsdWF0b3INCi17DQotICAgIGJvb2xlYW4gc2tpcFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwgTWV0YURhdGFFbnRyeSBlbnRyeSk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9leGNlcHRpb24vUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24uamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9leGNlcHRpb24vUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZiMmJiMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vZXhjZXB0aW9uL1JlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLmV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogdG8gaGFuZGxlIHNwZWNpYWwgY2FzZXMgaW4gVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGNsYXNzIFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uIGV4dGVuZHMgVmFsaWRhdG9yRXhjZXB0aW9uDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDY0NjMzMTczNjQyODQ5NTg4NEw7DQotDQotICAgIHB1YmxpYyBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihmYWNlc01lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihmYWNlc01lc3NhZ2UsIHRocm93YWJsZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MjUxMGMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY2VzTWVzc2FnZUZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeSBpbXBsZW1lbnRzIEZhY2VzTWVzc2FnZUZhY3RvcnkNCi17DQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2UgY29udmVydChGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBpZihpc0xhYmVsZWRGYWNlc01lc3NhZ2UoZmFjZXNNZXNzYWdlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZShmYWNlc01lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSwgZmFjZXNNZXNzYWdlLmdldFN1bW1hcnkoKSwgZmFjZXNNZXNzYWdlLmdldERldGFpbCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRmFjZXNNZXNzYWdlIGNyZWF0ZShGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFZpb2xhdGlvbk1lc3NhZ2Uoc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNMYWJlbGVkRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgdXNlIHRoZSBpbnRlcmZhY2UgaGVyZQ0KLSAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIFZpb2xhdGlvbk1lc3NhZ2U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRmFjZXNNZXNzYWdlSG9sZGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9GYWNlc01lc3NhZ2VIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMxYzM2Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9GYWNlc01lc3NhZ2VIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRmFjZXNNZXNzYWdlSG9sZGVyDQotew0KLSAgICBwcml2YXRlIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2U7DQotICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudElkOw0KLQ0KLSAgICBwdWJsaWMgRmFjZXNNZXNzYWdlSG9sZGVyKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmFjZXNNZXNzYWdlID0gZmFjZXNNZXNzYWdlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGYWNlc01lc3NhZ2VIb2xkZXIoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZhY2VzTWVzc2FnZSA9IGZhY2VzTWVzc2FnZTsNCi0gICAgICAgIHNldENsaWVudElkKGNsaWVudElkKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRmFjZXNNZXNzYWdlIGdldEZhY2VzTWVzc2FnZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjbGllbnRJZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGllbnRJZChTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIGlmKCEiKiIuZXF1YWxzKGNsaWVudElkKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmNsaWVudElkID0gY2xpZW50SWQ7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvTGFiZWxlZE1lc3NhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0xhYmVsZWRNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZjdhZTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvTGFiZWxlZE1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGRvbid0IHJlbW92ZSAqVGV4dCAtIGl0IHdvdWxkIGxlYWQgdG8gYW4gb3ZlcmxhcCB3aXRoIHRyaW5pZGFkDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBMYWJlbGVkTWVzc2FnZQ0KLXsNCi0gICAgU3RyaW5nIGdldExhYmVsVGV4dCgpOw0KLSAgICB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgbGFiZWwpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9WaW9sYXRpb25NZXNzYWdlLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9WaW9sYXRpb25NZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NDRjNzYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvVmlvbGF0aW9uTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBWaW9sYXRpb25NZXNzYWdlIGV4dGVuZHMgRmFjZXNNZXNzYWdlIGltcGxlbWVudHMgTGFiZWxlZE1lc3NhZ2UNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY5MDM5NTg5NDI5ODc3MTEyMzFMOw0KLSAgICBwcml2YXRlIFN0cmluZyBsYWJlbDsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHN1bW1hcnlMYWJlbFJlcGxhY2VkID0gZmFsc2U7DQotICAgIHByaXZhdGUgYm9vbGVhbiBkZXRhaWxMYWJlbFJlcGxhY2VkID0gZmFsc2U7DQotDQotICAgIHB1YmxpYyBWaW9sYXRpb25NZXNzYWdlKFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzKFNFVkVSSVRZX0VSUk9SLCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWaW9sYXRpb25NZXNzYWdlKFNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOw0KLSAgICAgICAgc2V0U3VtbWFyeShzdW1tYXJ5KTsNCi0gICAgICAgIHNldERldGFpbChkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxhYmVsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBnZXRTdW1tYXJ5KCkNCi0gICAgew0KLSAgICAgICAgaWYobGFiZWwgIT0gbnVsbCAmJiAhdGhpcy5zdW1tYXJ5TGFiZWxSZXBsYWNlZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXRTdW1tYXJ5KGdldExhYmVsZWRNZXNzc2FnZShzdXBlci5nZXRTdW1tYXJ5KCksIGdldExhYmVsVGV4dCgpKSk7DQotICAgICAgICAgICAgdGhpcy5zdW1tYXJ5TGFiZWxSZXBsYWNlZCA9IHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0U3VtbWFyeSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERldGFpbCgpDQotICAgIHsNCi0gICAgICAgIGlmKGxhYmVsICE9IG51bGwgJiYgIXRoaXMuZGV0YWlsTGFiZWxSZXBsYWNlZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXREZXRhaWwoZ2V0TGFiZWxlZE1lc3NzYWdlKHN1cGVyLmdldERldGFpbCgpLCBnZXRMYWJlbFRleHQoKSkpOw0KLSAgICAgICAgICAgIHRoaXMuZGV0YWlsTGFiZWxSZXBsYWNlZCA9IHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RGV0YWlsKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGFiZWxlZE1lc3NzYWdlKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UuY29udGFpbnMoInsiICsgaSArICJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCJ7IiArIGkgKyAifSIsIGxhYmVsKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgc2V0U3VtbWFyeShTdHJpbmcgcykNCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0U3VtbWFyeShzKTsNCi0gICAgICAgIHRoaXMuc3VtbWFyeUxhYmVsUmVwbGFjZWQgPSBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgc2V0RGV0YWlsKFN0cmluZyBzKQ0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXREZXRhaWwocyk7DQotICAgICAgICB0aGlzLmRldGFpbExhYmVsUmVwbGFjZWQgPSBmYWxzZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzOTZkNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7DQotDQotLyoqDQotICogTWVzc2FnZVJlc29sdmVyIHdoaWNoIHVzZXMgcHJvcGVydHkgZmlsZXMuDQotICogU3ViY2xhc3NlcyBqdXN0IGhhdmUgdG8gcHJvdmlkZSB0aGUgcGFja2FnZSB0byBsb29rIGF0Lg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIGNhbiBhbHNvIHByb3ZpZGUgYSBjdXN0b20gbmFtZSB3aGljaCBpcyBlLmcuIGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciBpbXBsZW1lbnRzIE1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIgPSAiPz8/IjsNCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbiA9IFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0RFRkFVTFRfQ09OVkVOVElPTjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZGVmYXVsdEJ1bmRsZSA9IG51bGw7DQotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VCdW5kbGVCYXNlTmFtZTsNCi0gICAgLy93aXRoIGpzZiAxLjEgb25seSBhdmFpbGFibGUgaWYgdGhlcmUgaXMgYSBjdXN0b20gYmVhbg0KLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlQnVuZGxlVmFyTmFtZTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGtleSA9PSBudWxsIHx8IGtleS5lcXVhbHMoIiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoa2V5LmNvbnRhaW5zKCIgIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoa2V5LmVuZHNXaXRoKCJfZGV0YWlsIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKDAsIGtleS5sZW5ndGgoKSAtIDcpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4ga2V5Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIGN1c3RvbU1lc3NhZ2UgPSBudWxsOw0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHRyeVRvRmluZEN1c3RvbU1lc3NhZ2Uoa2V5LCBsb2NhbGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGN1c3RvbU1lc3NhZ2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qDQotICAgICAgICAgKiB0cnkgdG8gdXNlIHRoZSBjb252ZW50aW9uIGZvciB0aGUgbWVzc2FnZSBidW5kbGUNCi0gICAgICAgICAqLw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHRyeVRvVXNlTWVzc2FnZUJ1bmRsZUNvbnZlbnRpb24oa2V5LCBsb2NhbGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGN1c3RvbU1lc3NhZ2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3VzdG9tTWVzc2FnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qDQotICAgICAgICAgKiBubyBtZXNzYWdlIGJ1bmRsZSBvciBtZXNzYWdlIGZvdW5kICh3aXRoIHRoZSBjb252ZW50aW9uKT8NCi0gICAgICAgICAqLw0KLQ0KLSAgICAgICAgLy90cnkgdG8gbG9hZCBjdXN0b20gbWVzc2FnZXMNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSB0cnlUb0ZpbmRDdXN0b21NZXNzYWdlSW5DdXN0b21SZXNvdXJjZUJ1bmRsZShrZXksIGxvY2FsZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBkZXRlcm1pbmVNZXNzYWdlKGtleSwgbG9jYWxlLCBjdXN0b21NZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb0ZpbmRDdXN0b21NZXNzYWdlKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOw0KLSAgICAgICAgU3RyaW5nIGN1c3RvbU1lc3NhZ2UgPSBudWxsOw0KLQ0KLSAgICAgICAgLy9vbmx5IGluIGNhc2Ugb2YgYSBWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggaXMgY29uZmlndXJlZCBhcyBiZWFuDQotICAgICAgICBpZiAodGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSh0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSwgbG9jYWxlKTsNCi0gICAgICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm1lc3NhZ2UgYnVuZGxlICIgKyB0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSArICIgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvL29ubHkgaW4gY2FzZSBvZiBhIFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciB3aGljaCBpcyBjb25maWd1cmVkIGFzIGJlYW4NCi0gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VCdW5kbGVWYXJOYW1lICE9IG51bGwgJiYgY3VzdG9tTWVzc2FnZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0gKFJlc291cmNlQnVuZGxlKSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4obWVzc2FnZUJ1bmRsZVZhck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigibWVzc2FnZSBidW5kbGUgdmFyIG5hbWUgIiArIHRoaXMubWVzc2FnZUJ1bmRsZVZhck5hbWUgKyAiIG5vdCBmb3VuZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHJ5VG9Vc2VNZXNzYWdlQnVuZGxlQ29udmVudGlvbihTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICBpZiAoKGRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvbiA9PSBudWxsIHx8ICFkZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb24uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgICAgICYmIGlzRGVmYXVsdE1lc3NhZ2VCdW5kbGVDb252ZW50aW9uQWN0aXZlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGRlZmF1bHRCdW5kbGUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0QnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FU1NBR0VfQlVORExFX05BTUUpLCBsb2NhbGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nDQotICAgICAgICAgICAgICAgICAgICBkZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb24gPSAidHJ1ZSI7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGRlZmF1bHRCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0QnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvRmluZEN1c3RvbU1lc3NhZ2VJbkN1c3RvbVJlc291cmNlQnVuZGxlKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0gdHJ5VG9Mb2FkQ3VzdG9tUmVzb3VyY2VCdW5kbGUobG9jYWxlKTsNCi0NCi0gICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyBjdXN0b20gbWVzc2FnZSBmb3IgIiArIGtleSArICIgd2l0aGluICIgKyBnZXRDdXN0b21CYXNlTmFtZSgpLCBlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgUmVzb3VyY2VCdW5kbGUgdHJ5VG9Mb2FkQ3VzdG9tUmVzb3VyY2VCdW5kbGUoTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1c3RvbUJhc2VOYW1lID0gZ2V0Q3VzdG9tQmFzZU5hbWUoKTsNCi0NCi0gICAgICAgIGlmKGN1c3RvbUJhc2VOYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShjdXN0b21CYXNlTmFtZSwgbG9jYWxlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGRldGVybWluZU1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSwgU3RyaW5nIGN1c3RvbU1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIC8vdXNlIGN1c3RvbSBuYW1lIChpZiBwb3NzaWJsZSkgb3RoZXJ3aXNlOiBmYWxsYmFjayB0byBkZWZhdWx0IG1lc3NhZ2UgKGlmIHBvc3NpYmxlKQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChjdXN0b21NZXNzYWdlICE9IG51bGwpID8gY3VzdG9tTWVzc2FnZQ0KLSAgICAgICAgICAgICAgICAgICAgOiAoZ2V0QmFzZU5hbWUoKSAhPSBudWxsKSA/IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShnZXRCYXNlTmFtZSgpLCBsb2NhbGUpLmdldFN0cmluZyhrZXkpIDogbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIgKyBrZXkgKyBNSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlZmF1bHRNZXNzYWdlQnVuZGxlQ29udmVudGlvbkFjdGl2ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0QmFzZU5hbWUoKTsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21CYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VCdW5kbGVCYXNlTmFtZShTdHJpbmcgbWVzc2FnZUJ1bmRsZUJhc2VOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1lc3NhZ2VCdW5kbGVCYXNlTmFtZSA9IG1lc3NhZ2VCdW5kbGVCYXNlTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlQnVuZGxlVmFyTmFtZShTdHJpbmcgbWVzc2FnZUJ1bmRsZVZhck5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZUJ1bmRsZVZhck5hbWUgPSBtZXNzYWdlQnVuZGxlVmFyTmFtZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgxODAzNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBGYWN0b3J5IHdoaWNoIGNyZWF0ZXMgYSBNZXNzYWdlUmVzb2x2ZXIgZm9yIGEgZ2l2ZW4gVmFsaWRhdGlvblN0cmF0ZWd5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdlbmVyaWMgamF2YSBhcGkgKGRlLS9yZWdpc3RlciBtYXBwaW5nKSIpDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLSAgICAgICAgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWVzc2FnZVJlc29sdmVyPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZzsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gbmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZVJlc29sdmVyIGNyZWF0ZShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgc3RyYXRlZ3lOYW1lID0gUHJveHlVdGlscy5nZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkpOw0KLQ0KLSAgICAgICAgaWYgKHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGluaXRTdGF0aWNNYXBwaW5ncygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZy5jb250YWluc0tleShzdHJhdGVneU5hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoTWVzc2FnZVJlc29sdmVyKSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgIC50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZy5nZXQoc3RyYXRlZ3lOYW1lKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOw0KLSAgICAgICAgU3RyaW5nIHJlc29sdmVyTmFtZTsNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IG5hbWVNYXBwZXIgOiBuYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2J1aWxkIGNvbnZlbnRpb24gKFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcikNCi0gICAgICAgICAgICByZXNvbHZlck5hbWUgPSBuYW1lTWFwcGVyLmNyZWF0ZU5hbWUodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAvL25hbWUgd2Fzbid0IG1hcHBlZA0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlck5hbWUgPT0gbnVsbCB8fCBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSkuZXF1YWxzKHJlc29sdmVyTmFtZSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgbWVzc2FnZVJlc29sdmVyID0gKE1lc3NhZ2VSZXNvbHZlcikgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHJlc29sdmVyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKG1lc3NhZ2VSZXNvbHZlciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyhzdHJhdGVneU5hbWUsIHJlc29sdmVyTmFtZSk7DQotDQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UocmVzb2x2ZXJOYW1lICsgIiB1c2VkIGZvciAiICsgc3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZVJlc29sdmVyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGFkZE1hcHBpbmcoc3RyYXRlZ3lOYW1lLCBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgLy9zZXR1cCBpbnRlcm5hbCBzdGF0aWMgbWFwcGluZ3MNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnIDoNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTdGF0aWNDb25maWd1cmF0aW9uKA0KLSAgICAgICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0dXBNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBNYXBwaW5ncyhMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsU3RyaW5nPj4gbWFwcGluZ3MpDQotICAgIHsNCi0gICAgICAgIGZvcihTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IG1hcHBpbmcgOiBtYXBwaW5ncykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNYXBwaW5nKG1hcHBpbmcuZ2V0U291cmNlKCksIG1hcHBpbmcuZ2V0VGFyZ2V0KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikNCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgbWVzc2FnZVJlc29sdmVyTmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZGRpbmcgc3RhdGljIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWVzc2FnZSByZXNvbHZlciBtYXBwaW5nOiAiDQotICAgICAgICAgICAgICAgICsgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArICIgLT4gIiArIG1lc3NhZ2VSZXNvbHZlck5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc3RyYXRlZ3lNZXNzYWdlUmVzb2x2ZXJNYXBwaW5nLnB1dCh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBtZXNzYWdlUmVzb2x2ZXJOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IGdldE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5hbWVNYXBwZXJMaXN0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5ZWRjNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IE1lc3NhZ2VSZXNvbHZlciB3aGljaCB1c2VzIHRoZSBkZWZhdWx0IGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gbWVzc2FnZSBidW5kbGUgdmlhIHdlYi54bWwNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CVU5ETEUgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FU1NBR0VfQlVORExFOw0KLQ0KLSAgICAvL25vdCB1c2VkIGF0IHRoZSBtb21lbnQgLSBqdXN0IGZvciBhIGNvbnZlbnRpb24NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNb2R1bGVNZXNzYWdlQnVuZGxlTmFtZShnZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tQmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ1VTVE9NX0JVTkRMRTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL01lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2NhMWMxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL01lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBNZXNzYWdlUmVzb2x2ZXJzIGluZGVwZW5kZW50IG9mIHRoZSBtZXNzYWdlIHNvdXJjZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZDQwYjYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZjMDhlOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIE1lc3NhZ2VSZXNvbHZlcnMuDQotICogKGNvbmZpZ3VyZWQgdmlhIHdlYi54bWwpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVNTQUdFX1JFU09MVkVSX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQzYzAxMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgVmFsaWRhdGlvblN0cmF0ZWd5IHRvIE1lc3NhZ2VSZXNvbHZlci4NCi0gKiAoY29uZmlndXJlZCB2aWEgaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbikNCi0gKiBUaGUgYmVhbiBwcm92aWRlcyB0aGUgZGVmYXVsdCBuYW1lIChjb252ZW50aW9uKS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gZnVsbCBxdWFsaWZpZWQgbmFtZS4gKD0gY3VzdG9taXphYmxlIGNvbnZlbnRpb24pDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTVNHX1JFU09MVkVSX05BTUVfTUFQUEVSKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYmI0ZDYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEluIG9yZGVyIHRvIHByb3ZpZGUgYSBOYW1lTWFwcGVyIHBlciB2YWxpZGF0aW9uIG1vZHVsZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMzEwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBzdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhNDc3Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFwcyBFeHRWYWwgVmFsaWRhdGlvblN0cmF0ZWdpZXMgdG8gRXh0VmFsIE1lc3NhZ2VSZXNvbHZlcnMuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MgPSBQcm94eVV0aWxzDQotICAgICAgICAgICAgICAgIC5nZXRVbnByb3hpZWRDbGFzcyh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKTsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRNZXNzYWdlUmVzb2x2ZXJDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKHN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjNkOTcwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciB0byBwbGFjZSBWYWxpZGF0aW9uU3RyYXRlZ2llcyBhbmQgTWVzc2FnZVJlc29sdmVycyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcig0MDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VzdG9tUG9zdGZpeCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYKTsNCi0gICAgICAgIHJldHVybiBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUoc3RyYXRlZ3lDbGFzc05hbWUsIGN1c3RvbVBvc3RmaXgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQzOGY1NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljQXJyYXlUeXBlOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5XaWxkY2FyZFR5cGU7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBleHRyYWN0QnlJZChhbm5vdGF0aW9uLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZXh0cmFjdEJ5SWQoYW5ub3RhdGlvbiwga2V5LCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgPFQ+IExpc3Q8VD4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGV4dHJhY3RCeUlkKGFubm90YXRpb24sIGtleSwgdmFsdWVUeXBlLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgPFQ+IFQgZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxUPiByZXN1bHRzID0gZXh0cmFjdEJ5SWQoYW5ub3RhdGlvbiwga2V5LCB2YWx1ZVR5cGUsIHZhbHVlSWQpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0cy5pdGVyYXRvcigpLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0cy5pdGVyYXRvcigpLm5leHQoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyA8VD4gTGlzdDxUPiBleHRyYWN0QnlJZChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxPYmplY3Q+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KLQ0KLSAgICAgICAgZm9yKE9iamVjdCBlbnRyeSA6IGV4dHJhY3RCeUlkKGFubm90YXRpb24sIGtleSwgdmFsdWVJZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodmFsdWVUeXBlLmlzQXNzaWduYWJsZUZyb20oZW50cnkuZ2V0Q2xhc3MoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKExpc3Q8VD4pcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZXh0cmFjdEJ5SWQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzcyB2YWx1ZUlkKQ0KLSAgICB7DQotICAgICAgICBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+IGZ1bGxSZXN1bHQgPSBleHRyYWN0QnlJZChhbm5vdGF0aW9uLCB2YWx1ZUlkKTsNCi0NCi0gICAgICAgIGlmKGZ1bGxSZXN1bHQuY29udGFpbnNLZXkoa2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZnVsbFJlc3VsdC5nZXQoa2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIHdlYi54bWwgcGFyYW1ldGVyIGZvciBwZXJmb3JtYW5jZSB0dW5pbmcgdG8gZGVhY3RpdmF0ZSB0aGUgc2NhbiIpDQotICAgIHB1YmxpYyBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+IGV4dHJhY3RCeUlkKEFubm90YXRpb24gYW5ub3RhdGlvbiwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4oKTsNCi0NCi0gICAgICAgIGZvcihNZXRob2QgY3VycmVudEFubm90YXRpb25BdHRyaWJ1dGUgOiBhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0RGVjbGFyZWRNZXRob2RzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZighaXNWYWxpZGF0aW9uUGFyYW1ldGVyKGN1cnJlbnRBbm5vdGF0aW9uQXR0cmlidXRlLmdldEdlbmVyaWNSZXR1cm5UeXBlKCkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBPYmplY3QgcGFyYW1ldGVyVmFsdWUgPSBjdXJyZW50QW5ub3RhdGlvbkF0dHJpYnV0ZS5pbnZva2UoYW5ub3RhdGlvbik7DQotDQotICAgICAgICAgICAgICAgIGlmKHBhcmFtZXRlclZhbHVlIGluc3RhbmNlb2YgQ2xhc3NbXSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRQYXJhbWV0ZXJWYWx1ZSA6IChDbGFzc1tdKXBhcmFtZXRlclZhbHVlKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8va2VlcCBjaGVjayBzbyB0aGF0IGZvbGxvd2luZyBpcyB0cnVlOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBmb3VuZCB3aGljaCB0ZWxscyB0aGF0IGl0IGlzbid0IGEgYmxvY2tpbmcgZXJyb3IsIGxldCBpdCBwYXNzDQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1BhcmFtZXRlclZhbHVlKGFubm90YXRpb24sIGN1cnJlbnRQYXJhbWV0ZXJWYWx1ZSwgcmVzdWx0LCB2YWx1ZUlkKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKHBhcmFtZXRlclZhbHVlIGluc3RhbmNlb2YgQ2xhc3MpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8va2VlcCBjaGVjayBzbyB0aGF0IGZvbGxvd2luZyBpcyB0cnVlOg0KLSAgICAgICAgICAgICAgICAgICAgLy9pZiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIGZvdW5kIHdoaWNoIHRlbGxzIHRoYXQgaXQgaXNuJ3QgYSBibG9ja2luZyBlcnJvciwgbGV0IGl0IHBhc3MNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQYXJhbWV0ZXJWYWx1ZShhbm5vdGF0aW9uLCAoQ2xhc3MpcGFyYW1ldGVyVmFsdWUsIHJlc3VsdCwgdmFsdWVJZCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBkb24ndCB1c2UgdGhlIEludHJvc3BlY3RvciBpbiB0aGlzIGNhc2UNCi0gICAgICogaWYgeW91IGhhdmUgYSBiZXR0ZXIgc29sdXRpb24gd2hpY2ggc3VwcG9ydHMgYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXIgc3R5bGVzIChzZWUgZXh0dmFsIHdpa2kpLA0KLSAgICAgKiB5b3UgY2FuIGltcGwuIGl0IGFuZCB1c2UgaXQgKGV4Y2hhbmdlIHRoZSBpbXBscy4gdmlhIHRoZSBFeHRWYWxDb250ZXh0KS4NCi0gICAgICogZnVydGhlcm1vcmUsIHlvdSBjYW4gcHJvdmlkZSB0aGUgZml4IGZvciB0aGUgY29tbXVuaXR5DQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1BhcmFtZXRlclZhbHVlKA0KLSAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiwgQ2xhc3MgcGFyYW1DbGFzcywgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiByZXN1bHQsIENsYXNzIHZhbHVlSWQpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGtleSA9IG51bGw7DQotICAgICAgICBMaXN0PE9iamVjdD4gcGFyYW1ldGVyVmFsdWVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7DQotDQotICAgICAgICBpZihWYWxpZGF0aW9uUGFyYW1ldGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocGFyYW1DbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgTGlzdDxGaWVsZD4gcHJvY2Vzc2VkRmllbGRzID0gbmV3IEFycmF5TGlzdDxGaWVsZD4oKTsNCi0gICAgICAgICAgICBMaXN0PE1ldGhvZD4gcHJvY2Vzc2VkTWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kPigpOw0KLQ0KLSAgICAgICAgICAgIENsYXNzIGN1cnJlbnRQYXJhbUNsYXNzID0gcGFyYW1DbGFzczsNCi0gICAgICAgICAgICB3aGlsZSAoY3VycmVudFBhcmFtQ2xhc3MgIT0gbnVsbCAmJiAhT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY3VycmVudFBhcmFtQ2xhc3MuZ2V0TmFtZSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICAgICAqIHByb2Nlc3MgY2xhc3MNCi0gICAgICAgICAgICAgICAgICovDQotICAgICAgICAgICAgICAgIC8vc3VwcG9ydCBwdXJlIGludGVyZmFjZSBhcHByb2FjaCBlLmcuIFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MNCi0gICAgICAgICAgICAgICAgZm9yKEZpZWxkIGN1cnJlbnRGaWVsZCA6IGN1cnJlbnRQYXJhbUNsYXNzLmdldERlY2xhcmVkRmllbGRzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFwcm9jZXNzZWRGaWVsZHMuY29udGFpbnMoY3VycmVudEZpZWxkKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBwcm9jZXNzRm91bmRGaWVsZChhbm5vdGF0aW9uLCBjdXJyZW50RmllbGQsIHBhcmFtZXRlclZhbHVlcywga2V5LCB2YWx1ZUlkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRGaWVsZHMuYWRkKGN1cnJlbnRGaWVsZCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgLy9pbnNwZWN0IHRoZSBvdGhlciBtZXRob2RzIG9mIHRoZSBpbXBsZW1lbnRpbmcgY2xhc3MNCi0gICAgICAgICAgICAgICAgZm9yKE1ldGhvZCBjdXJyZW50TWV0aG9kIDogY3VycmVudFBhcmFtQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFwcm9jZXNzZWRNZXRob2RzLmNvbnRhaW5zKGN1cnJlbnRNZXRob2QpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHByb2Nlc3NGb3VuZE1ldGhvZChjdXJyZW50UGFyYW1DbGFzcywgY3VycmVudE1ldGhvZCwgcGFyYW1ldGVyVmFsdWVzLCBrZXksIHZhbHVlSWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZE1ldGhvZHMuYWRkKGN1cnJlbnRNZXRob2QpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICAgICAqIHByb2Nlc3MgaW50ZXJmYWNlcw0KLSAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRJbnRlcmZhY2UgOiBjdXJyZW50UGFyYW1DbGFzcy5nZXRJbnRlcmZhY2VzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFWYWxpZGF0aW9uUGFyYW1ldGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY3VycmVudEludGVyZmFjZSkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAvL3N1cHBvcnQgaW50ZXJmYWNlICsgaW1wbC4gYXBwcm9hY2ggZS5nLiBNeVBhcmFtSW1wbC5jbGFzcw0KLSAgICAgICAgICAgICAgICAgICAgLy8oTXlQYXJhbUltcGwgaW1wbGVtZW50cyBNeVBhcmFtDQotICAgICAgICAgICAgICAgICAgICAvL015UGFyYW0gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotICAgICAgICAgICAgICAgICAgICAvL21ldGhvZHMgaW4gdGhlIGludGVyZmFjZSBoYXZlIHRvIGJlIG1hcmtlZCB3aXRoIEBQYXJhbWV0ZXJWYWx1ZSBhbmQgQFBhcmFtZXRlcktleQ0KLSAgICAgICAgICAgICAgICAgICAgZm9yKE1ldGhvZCBjdXJyZW50TWV0aG9kIDogY3VycmVudEludGVyZmFjZS5nZXREZWNsYXJlZE1ldGhvZHMoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZighcHJvY2Vzc2VkTWV0aG9kcy5jb250YWlucyhjdXJyZW50TWV0aG9kKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHByb2Nlc3NGb3VuZE1ldGhvZChjdXJyZW50UGFyYW1DbGFzcywgY3VycmVudE1ldGhvZCwgcGFyYW1ldGVyVmFsdWVzLCBrZXksIHZhbHVlSWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRNZXRob2RzLmFkZChjdXJyZW50TWV0aG9kKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBmb3IoRmllbGQgY3VycmVudEZpZWxkIDogY3VycmVudEludGVyZmFjZS5nZXREZWNsYXJlZEZpZWxkcygpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwcm9jZXNzZWRGaWVsZHMuY29udGFpbnMoY3VycmVudEZpZWxkKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHByb2Nlc3NGb3VuZEZpZWxkKGFubm90YXRpb24sIGN1cnJlbnRGaWVsZCwgcGFyYW1ldGVyVmFsdWVzLCBrZXksIHZhbHVlSWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRGaWVsZHMuYWRkKGN1cnJlbnRGaWVsZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGN1cnJlbnRQYXJhbUNsYXNzID0gY3VycmVudFBhcmFtQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGtleSA9IGNyZWF0ZURlZmF1bHRLZXkoa2V5LCBwYXJhbUNsYXNzKTsNCi0NCi0gICAgICAgIGlmKHBhcmFtZXRlclZhbHVlcy5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9AUGFyYW1ldGVyVmFsdWUgaXMgb3B0aW9uYWwgYXMgd2VsbA0KLSAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlcy5hZGQoa2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHJlc3VsdC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5nZXQoa2V5KS5hZGRBbGwocGFyYW1ldGVyVmFsdWVzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQucHV0KGtleSwgcGFyYW1ldGVyVmFsdWVzKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBjcmVhdGVEZWZhdWx0S2V5KE9iamVjdCBrZXksIENsYXNzIGN1cnJlbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYoa2V5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9jaGVjayBmb3Igc3VwZXItaW50ZXJmYWNlIChleGNsdWRlIFZhbGlkYXRpb25QYXJhbWV0ZXIgaXRzZWxmKQ0KLSAgICAgICAgICAgIGZvcihDbGFzcyBpbnRlcmZhY2VDbGFzcyA6IGN1cnJlbnRDbGFzcy5nZXRJbnRlcmZhY2VzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihWYWxpZGF0aW9uUGFyYW1ldGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaW50ZXJmYWNlQ2xhc3MpICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgKCFpbnRlcmZhY2VDbGFzcy5nZXROYW1lKCkuZXF1YWxzKFZhbGlkYXRpb25QYXJhbWV0ZXIuY2xhc3MuZ2V0TmFtZSgpKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGtleSA9IGludGVyZmFjZUNsYXNzOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZihrZXkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBrZXkgPSBjdXJyZW50Q2xhc3M7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4ga2V5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IHByb2Nlc3NGb3VuZEZpZWxkKA0KLSAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZSwgRmllbGQgY3VycmVudEZpZWxkLCBMaXN0PE9iamVjdD4gcGFyYW1WYWx1ZXMsIE9iamVjdCBrZXksIENsYXNzIHZhbHVlSWQpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBuZXdLZXkgPSBudWxsOw0KLSAgICAgICAgaWYoa2V5ID09IG51bGwgJiYgY3VycmVudEZpZWxkLmlzQW5ub3RhdGlvblByZXNlbnQoUGFyYW1ldGVyS2V5LmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG5ld0tleSA9IGN1cnJlbnRGaWVsZC5nZXQoaW5zdGFuY2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICAvL25vICJlbHNlIGlmIiB0byBhbGxvdyBib3RoIGF0IG9uZSBmaWVsZA0KLSAgICAgICAgaWYoY3VycmVudEZpZWxkLmlzQW5ub3RhdGlvblByZXNlbnQoUGFyYW1ldGVyVmFsdWUuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbHVlSWQgPT0gbnVsbCB8fCB2YWx1ZUlkLmVxdWFscyhjdXJyZW50RmllbGQuZ2V0QW5ub3RhdGlvbihQYXJhbWV0ZXJWYWx1ZS5jbGFzcykuaWQoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50RmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtVmFsdWVzLmFkZChjdXJyZW50RmllbGQuZ2V0KGluc3RhbmNlKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXdLZXkgIT0gbnVsbCA/IG5ld0tleSA6IGtleTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBwcm9jZXNzRm91bmRNZXRob2QoDQotICAgICAgICAgICAgQ2xhc3MgcGFyYW1DbGFzcywgTWV0aG9kIGN1cnJlbnRNZXRob2QsIExpc3Q8T2JqZWN0PiBwYXJhbWV0ZXJWYWx1ZXMsIE9iamVjdCBrZXksIENsYXNzIHZhbHVlSWQpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBuZXdLZXkgPSBudWxsOw0KLSAgICAgICAgaWYoa2V5ID09IG51bGwgJiYgY3VycmVudE1ldGhvZC5pc0Fubm90YXRpb25QcmVzZW50KFBhcmFtZXRlcktleS5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZighKE1vZGlmaWVyLmlzQWJzdHJhY3QocGFyYW1DbGFzcy5nZXRNb2RpZmllcnMoKSkgfHwgTW9kaWZpZXIuaXNJbnRlcmZhY2UocGFyYW1DbGFzcy5nZXRNb2RpZmllcnMoKSkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBuZXdLZXkgPSBjdXJyZW50TWV0aG9kLmludm9rZShwYXJhbUNsYXNzLm5ld0luc3RhbmNlKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIC8vbm8gImVsc2UgaWYiIHRvIGFsbG93IGJvdGggYXQgb25lIGZpZWxkDQotICAgICAgICBpZihjdXJyZW50TWV0aG9kLmlzQW5ub3RhdGlvblByZXNlbnQoUGFyYW1ldGVyVmFsdWUuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbHVlSWQgPT0gbnVsbCB8fCB2YWx1ZUlkLmVxdWFscyhjdXJyZW50TWV0aG9kLmdldEFubm90YXRpb24oUGFyYW1ldGVyVmFsdWUuY2xhc3MpLmlkKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudE1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOw0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWVzLmFkZChjdXJyZW50TWV0aG9kLmludm9rZShwYXJhbUNsYXNzLm5ld0luc3RhbmNlKCkpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgaXQncyBhIG5vbmUtc3RhdGljIGlubmVyIGNsYXNzIC0+IHJldHVybiB0aGlzIGNsYXNzDQotICAgICAgICAgICAgICAgICAgICBpZihwYXJhbUNsYXNzLmdldEVuY2xvc2luZ0NsYXNzKCkgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJWYWx1ZXMuYWRkKHBhcmFtQ2xhc3MpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXdLZXkgIT0gbnVsbCA/IG5ld0tleSA6IGtleTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZGF0aW9uUGFyYW1ldGVyKFR5cGUgZ2VuZXJpY1JldHVyblR5cGUpDQotICAgIHsNCi0gICAgICAgIGlmKGdlbmVyaWNSZXR1cm5UeXBlIGluc3RhbmNlb2YgR2VuZXJpY0FycmF5VHlwZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZigoKEdlbmVyaWNBcnJheVR5cGUpZ2VuZXJpY1JldHVyblR5cGUpLmdldEdlbmVyaWNDb21wb25lbnRUeXBlKCkgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBhbmFseXplUGFyYW1ldGVyaXplZFR5cGUoDQotICAgICAgICAgICAgICAgICAgICAgICAgKFBhcmFtZXRlcml6ZWRUeXBlKSgoR2VuZXJpY0FycmF5VHlwZSlnZW5lcmljUmV0dXJuVHlwZSkuZ2V0R2VuZXJpY0NvbXBvbmVudFR5cGUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihnZW5lcmljUmV0dXJuVHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhbmFseXplUGFyYW1ldGVyaXplZFR5cGUoDQotICAgICAgICAgICAgICAgICAgICAoUGFyYW1ldGVyaXplZFR5cGUpZ2VuZXJpY1JldHVyblR5cGUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBhbmFseXplUGFyYW1ldGVyaXplZFR5cGUoUGFyYW1ldGVyaXplZFR5cGUgcGFyYW1ldGVyaXplZFR5cGUpDQotICAgIHsNCi0gICAgICAgIGZvcihUeXBlIHR5cGUgOiBwYXJhbWV0ZXJpemVkVHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodHlwZSBpbnN0YW5jZW9mIFdpbGRjYXJkVHlwZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZvcihUeXBlIHVwcGVyQm91bmRzIDogKChXaWxkY2FyZFR5cGUpdHlwZSkuZ2V0VXBwZXJCb3VuZHMoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYodXBwZXJCb3VuZHMgaW5zdGFuY2VvZiBDbGFzcyAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZvciBhdHRyaWJ1dGVzIGxpa2U6IENsYXNzPD8gZXh0ZW5kcyBJbmhlcml0ZWRGcm9tVmFsaWRhdGlvblBhcmFtZXRlcj4gdmFsdWUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblBhcmFtZXRlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKChDbGFzcyl1cHBlckJvdW5kcykpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMmE3M2MuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5IGltcGxlbWVudHMgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkNCi17DQotICAgIHByaXZhdGUgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBjcmVhdGUoKQ0KLSAgICB7DQotICAgICAgICBpZiAodmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUik7DQotICAgICAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckNsYXNzTmFtZXMNCi0gICAgICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUikpOw0KLSAgICAgICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JDbGFzc05hbWVzKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciA9IChWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSh2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjcmVhdGVkIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI3YWU5My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBtYXBzIGludGVybmFsIHBhcmFtZXRlcnMgdG8gb3B0aW9uYWxseSBhdmFpbGFibGUgY3VzdG9tIHBhcmFtZXRlcnMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeSBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8Q2xhc3MsIENsYXNzPg0KLXsNCi0gICAgcHJpdmF0ZSBNYXA8Q2xhc3MsIENsYXNzPiBwYXJhbWV0ZXJNYXBwaW5nID0gbmV3IEhhc2hNYXA8Q2xhc3MsIENsYXNzPigpOw0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgY3JlYXRlKENsYXNzIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHRoaXMucGFyYW1ldGVyTWFwcGluZy5jb250YWluc0tleShzb3VyY2UpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmFtZXRlck1hcHBpbmcuZ2V0KHNvdXJjZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBDbGFzcyByZXN1bHQ7DQotDQotICAgICAgICAvL2l0J3MgaW1wb3J0YW50IHRvIGxvb2sgZm9yIHRoZSBzdGF0aWMgY29uZmlncyBmaXJzdCAtIGdsb2JhbCBwYXJhbWV0ZXJzIGFyZSB1c2VkIGludGVybmFsbHkNCi0gICAgICAgIHJlc3VsdCA9IHRyeVRvRmluZFN0YXRpY0NvbmZpZyhzb3VyY2UpOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHRyeVRvRmluZEdsb2JhbFBhcmFtZXRlcihzb3VyY2UpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHNvdXJjZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGNhY2hlTWFwcGluZyhzb3VyY2UsIHJlc3VsdCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3MgdHJ5VG9GaW5kR2xvYmFsUGFyYW1ldGVyKENsYXNzIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IHRhcmdldCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KHNvdXJjZS5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIENsYXNzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoQ2xhc3MpIHRhcmdldDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3MgdHJ5VG9GaW5kU3RhdGljQ29uZmlnKENsYXNzIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgcmVzdWx0ID0gbnVsbDsNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gY29uZmlnIDogRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlZBTElEQVRJT05fUEFSQU1FVEVSX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gdHJ5VG9NYXAoc291cmNlLCBjb25maWcuZ2V0TWFwcGluZygpKTsNCi0NCi0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3MgdHJ5VG9NYXAoQ2xhc3Mgc291cmNlLCBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmcpDQotICAgIHsNCi0gICAgICAgIENsYXNzIHRhcmdldCA9IG51bGw7DQotDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBtYXBwaW5nKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscyhlbnRyeS5nZXRTb3VyY2UoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0YXJnZXQgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShlbnRyeS5nZXRUYXJnZXQoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdGFyZ2V0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjYWNoZU1hcHBpbmcoQ2xhc3Mgc291cmNlLCBDbGFzcyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGFyYW1ldGVyTWFwcGluZy5wdXQoc291cmNlLCB0YXJnZXQpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2YzdmMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogbWVjaGFuaXNtIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBleHR2YWwNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGltcGxlbWVudHMgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcg0KLXsNCi0gICAgcHVibGljIGJvb2xlYW4gc2V2ZXJpdHlCbG9ja3NOYXZpZ2F0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IuZXF1YWxzKHNldmVyaXR5KSB8fCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUwuZXF1YWxzKHNldmVyaXR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXZlcml0eUNhdXNlc1ZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLmVxdWFscyhzZXZlcml0eSkgfHwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMLmVxdWFscyhzZXZlcml0eSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gc2V2ZXJpdHlDYXVzZXNWaW9sYXRpb25NZXNzYWdlKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHNldmVyaXR5QmxvY2tzU3VibWl0KA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IuZXF1YWxzKHNldmVyaXR5KSB8fCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUwuZXF1YWxzKHNldmVyaXR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXZlcml0eVNob3dzSW5kaWNhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLmVxdWFscyhzZXZlcml0eSkgfHwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMLmVxdWFscyhzZXZlcml0eSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMDA4NmIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotew0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlcktleS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9QYXJhbWV0ZXJLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMwMmJiYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlcktleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUYXJnZXQoe0ZJRUxELCBNRVRIT0R9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBQYXJhbWV0ZXJLZXkNCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvUGFyYW1ldGVyVmFsdWUuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvUGFyYW1ldGVyVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZkYzhmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlclZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRhcmdldCh7RklFTEQsIE1FVEhPRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFBhcmFtZXRlclZhbHVlDQotew0KLSAgICBDbGFzcyBpZCgpIGRlZmF1bHQgUGFyYW1ldGVyVmFsdWUuY2xhc3M7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNTljNzYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvblBhcmFtZXRlcg0KLXsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIwOTkwMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvcg0KLXsNCi0gICAgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbik7DQotICAgIExpc3Q8T2JqZWN0PiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSk7DQotICAgIDxUPiBMaXN0PFQ+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzczxUPiB2YWx1ZVR5cGUpOw0KLSAgICA8VD4gVCBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSwgQ2xhc3M8VD4gdmFsdWVUeXBlLCBDbGFzcyB2YWx1ZUlkKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGNkZGQyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeQ0KLXsNCi0gICAgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBjcmVhdGUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WaW9sYXRpb25TZXZlcml0eS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WaW9sYXRpb25TZXZlcml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzI4ODdjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZpb2xhdGlvblNldmVyaXR5DQotew0KLSAgICBpbnRlcmZhY2UgSW5mbyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi0gICAgew0KLSAgICAgICAgQFBhcmFtZXRlcktleQ0KLSAgICAgICAgcHVibGljIENsYXNzIEtFWSA9IFZpb2xhdGlvblNldmVyaXR5LmNsYXNzOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgcHVibGljIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBTRVZFUklUWSA9IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9JTkZPOw0KLQ0KLSAgICAgICAgLy9AUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIC8vTWVzc2FnZVR5cGUgcG9zdGZpeCA9IE1lc3NhZ2VUeXBlLklORk87DQotICAgIH0NCi0NCi0gICAgaW50ZXJmYWNlIFdhcm4gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotICAgIHsNCi0gICAgICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgICAgIHB1YmxpYyBDbGFzcyBLRVkgPSBWaW9sYXRpb25TZXZlcml0eS5jbGFzczsNCi0NCi0gICAgICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFNFVkVSSVRZID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk47DQotDQotICAgICAgICAvL0BQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgLy9NZXNzYWdlVHlwZSBwb3N0Zml4ID0gTWVzc2FnZVR5cGUuV0FSTjsNCi0gICAgfQ0KLQ0KLSAgICBpbnRlcmZhY2UgRXJyb3IgZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotICAgIHsNCi0gICAgICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgICAgIHB1YmxpYyBDbGFzcyBLRVkgPSBWaW9sYXRpb25TZXZlcml0eS5jbGFzczsNCi0NCi0gICAgICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFNFVkVSSVRZID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SOw0KLQ0KLSAgICAgICAgLy9AUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIC8vTWVzc2FnZVR5cGUgcG9zdGZpeCA9IE1lc3NhZ2VUeXBlLkVSUk9SOw0KLSAgICB9DQotDQotICAgIGludGVyZmFjZSBGYXRhbCBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi0gICAgew0KLSAgICAgICAgQFBhcmFtZXRlcktleQ0KLSAgICAgICAgcHVibGljIENsYXNzIEtFWSA9IFZpb2xhdGlvblNldmVyaXR5LmNsYXNzOw0KLQ0KLSAgICAgICAgQFBhcmFtZXRlclZhbHVlDQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgU0VWRVJJVFkgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUw7DQotDQotICAgICAgICAvL0BQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgLy9NZXNzYWdlVHlwZSBwb3N0Zml4ID0gTWVzc2FnZVR5cGUuRkFUQUw7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1Zpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc2YmQ5NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1Zpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBtZWNoYW5pc20gdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGV4dHZhbA0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcg0KLXsNCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHNldmVyaXR5IHNob3VsZCBibG9jayB0aGUgbmF2aWdhdGlvbg0KLSAgICAgKiBpZiAjc2V2ZXJpdHlDYXVzZXNWYWxpZGF0b3JFeGNlcHRpb24gcmV0dXJucyBmYWxscyB2YWxpZGF0aW9uIHdpbGwgYmUgY29udGludWVkIGZvciB0aGUgY3VycmVudCBwcm9wZXJ0eQ0KLSAgICAgKiBhbGwgbWVzc2FnZXMgd2hpY2ggZG9uJ3QgbGVhZCB0byBhbiBleGNlcHRpb24gc2hvdWxkIGJlIHN0b3JlZCBpbiBhbiBzdG9yYWdlIGFuZA0KLSAgICAgKiBhZGRlZCBhZnRlciB0aGUgZmlyc3QgbWVzc2FnZSB3aGljaCBnZXRzIHRocm93biBhcyBleGNlcHRpb24NCi0gICAgICogYSBnbG9iYWwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgYWRkIHRoZSBtZXNzYWdlcyBvZiB0aGUgc3RvcmFnZSBhcyBmYWNlcyBtZXNzYWdlDQotICAgICAqLw0KLSAgICBib29sZWFuIHNldmVyaXR5QmxvY2tzTmF2aWdhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KTsNCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHNldmVyaXR5IHNob3VsZCBjYXVzZSBhIHZhbGlkYXRvciBleGNlcHRpb24NCi0gICAgICovDQotICAgIGJvb2xlYW4gc2V2ZXJpdHlDYXVzZXNWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSk7DQotDQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IGN1cnJlbnQgZmFjZXMgY29udGV4dA0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgY3VycmVudCBjb21wb25lbnQNCi0gICAgICogQHBhcmFtIHNldmVyaXR5IGpzZiBzZXZlcml0eSBmb3IgZmFjZXMgbWVzc2FnZXMNCi0gICAgICogQHJldHVybiB0cnVlIGlmIGEgdmlvbGF0aW9uIG1lc3NhZ2UgbGVhZHMgdG8gYSBmYWNlcyBtZXNzYWdlDQotICAgICAqLw0KLSAgICBib29sZWFuIHNldmVyaXR5Q2F1c2VzVmlvbGF0aW9uTWVzc2FnZSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KTsNCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnN0cmFpbnQgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkgc2hvdWxkIGJlIHZhbGlkYXRlZCBvbiB0aGUgY2xpZW50IHNpZGUgKGlmIHN1cHBvcnRlZCkNCi0gICAgICovDQotICAgIGJvb2xlYW4gc2V2ZXJpdHlCbG9ja3NTdWJtaXQoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSk7DQotDQotICAgIC8qKg0KLSAgICAgKiBhdmFpbGFibGUgZm9yIGFkZC1vbnMgLSBub3QgdXNlZCBpbnRlcm5hbGx5IGR1ZSB0byBwZXJmb3JtYW5jZSByZWFzb25zDQotICAgICAqDQotICAgICAqIEBwYXJhbSBmYWNlc0NvbnRleHQgY3VycmVudCBmYWNlcyBjb250ZXh0DQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkganNmIHNldmVyaXR5IGZvciBmYWNlcyBtZXNzYWdlcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnN0cmFpbnQgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkNCi0gICAgICogc2hvdWxkIGNhdXNlIGUuZy4gYSByZXF1aXJlZCBtYXJrZXIgaW5kZXBlbmRlbnQgb2YgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiAoaWYgc3VwcG9ydGVkKQ0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBzZXZlcml0eVNob3dzSW5kaWNhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTljOTM0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLk1lc3NhZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotCi0vKioKLSAqIFByb3ZpZGVzIHRoZSBhYmlsaXR5IG9mIG1lc3NhZ2UgcmVzb2x2aW5nIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuUkVVU0V9KQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTxBIGV4dGVuZHMgQW5ub3RhdGlvbj4gZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQotewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYID0gIl9kZXRhaWwiOwotICAgIC8vZS5nLiBmb3IgaW5qZWN0aW5nIGEgbWVzc2FnZSByZXNvbHZlciB2aWEgc3ByaW5nCi0gICAgcHJpdmF0ZSBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgTG9jYWxlIGxvY2FsZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpOwotCi0gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VSZXNvbHZlciAhPSBudWxsID8gdGhpcy5tZXNzYWdlUmVzb2x2ZXIuZ2V0TWVzc2FnZShrZXksIGxvY2FsZSkgOgotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHRoaXMpLmdldE1lc3NhZ2Uoa2V5LCBsb2NhbGUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShBIGFubm90YXRpb24pCi0gICAgewotICAgICAgICByZXR1cm4gcmVzb2x2ZU1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChBIGFubm90YXRpb24pCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiAoa2V5ICE9IG51bGwpID8gcmVzb2x2ZU1lc3NhZ2Uoa2V5ICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgpIDogbnVsbDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbikgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBGYWNlc01lc3NhZ2UgZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNZXNzYWdlKEEgYW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2UoZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShhbm5vdGF0aW9uKSwgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBIGFubm90YXRpb24pOwotCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZVJlc29sdmVyKE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXIpCi0gICAgewotICAgICAgICB0aGlzLm1lc3NhZ2VSZXNvbHZlciA9IG1lc3NhZ2VSZXNvbHZlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICAgIG1ldGFEYXRhRW50cnkuc2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwsIGdldExhYmVsKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnkpKTsKLQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uKTsKLSAgICB9Ci0KLSAgICAvL2UuZy4gZm9yIGN1c3RvbSBhbm5vdGF0aW9ucyAtIG92ZXJyaWRlIGlmIG5lZWRlZAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMWYzZWQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5leGNlcHRpb24uUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBQcm92aWRlcyB0aGUgYWJpbGl0eSB0byB1c2UgVmFsaWRhdG9yRXhjZXB0aW9uIChhcyBleHBlY3RlZCBieSB0aGUgdXNlcikgaW5zdGVhZCBvZiBDb252ZXJ0ZXJFeGNlcHRpb24uDQotICogRnVydGhlcm1vcmUgaXQgcHJvdmlkZXM6PGJyLz4NCi0gKiBpbml0VmFsaWRhdGlvbjxici8+DQotICogcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgaW5pdFZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGluaXRWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImluaXRWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBwcm9jZXNzVmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcm9jZXNzVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJwcm9jZXNzVmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0gICAgICAgICAgICBpZihlIGluc3RhbmNlb2YgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24gPSBuZXcgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29udmVydEZhY2VzTWVzc2FnZShlLmdldEZhY2VzTWVzc2FnZSgpKSwgZS5nZXRDYXVzZSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uID0gbmV3IFZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb252ZXJ0RmFjZXNNZXNzYWdlKGUuZ2V0RmFjZXNNZXNzYWdlKCkpLCBlLmdldENhdXNlKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBpZiAocHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgIjogdGhyb3cgb3JpZ2luYWwgZXhjZXB0aW9uIGFmdGVyIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvVGhyb3dWYWxpZGF0b3JFeGNlcHRpb25Gb3JDb21wb25lbnQoDQotICAgICAgICAgICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSwgdmFsaWRhdG9yRXhjZXB0aW9uKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgIjogb3JpZ2luYWwgZXhjZXB0aW9uIGFmdGVyIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbiwgdGhpcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmlydHVhbFZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0Fic3RyYWN0VmlydHVhbFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmE4Y2ZlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi0NCi0vKioNCi0gKiB0byBtYXAgY29uc3RyYWludHMgZGlyZWN0bHkgdG8gYSBtZXRhLWRhdGEgdHJhbnNmb3JtZXIgaWYgdGhlcmUgaXMgbm8gdmFsaWRhdGlvbiBzdHJhdGVneSAocmVxdWlyZWQgYnkganNyIDMwMykNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGUoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ0aGlzIGlzIGp1c3QgYW4gYWRhcHRlciBlLmcuIGZvciBjb21wb25lbnQgaW5pdGlhbGl6YXRpb24iKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzNkNTkwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIGl0IGlzbid0IGxpbmtlZCB0byBqc3IgMzAzDQotICoNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0NCi0gKiBhZGFwdGVyIHRvIGNvbm5lY3QgdmFsaWRhdGlvbiBzdHJhdGVnaWVzIHdpdGggbWV0YS1kYXRhIHRyYW5zZm9ybWVycywNCi0gKiBpZiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBkZWZpbmVkIGFzIGJlYW4gYW5kIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBpbnRlcmZhY2UgQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIgZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIC8vdG8gZ2V0IGJhY2sgdGhlIGludGVybmFsIGNhc2hpbmcNCi0gICAgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpOw0KLQ0KLSAgICBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMTE2ZjIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLkJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogaXQgaXNuJ3QgbGlua2VkIHRvIGpzciAzMDMNCi0gKg0KLSAqIGl0J3MganVzdCBhIGhlbHBlciBmb3IgcHJveGllcyAtIHlvdSBqdXN0IG5lZWQgaXQsIGlmIHlvdSBkZWZpbmUgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0Lg0KLQ0KLSAqIGFkYXB0ZXIgdG8gY29ubmVjdCB2YWxpZGF0aW9uIHN0cmF0ZWdpZXMgd2l0aCBtZXRhLWRhdGEgdHJhbnNmb3JtZXJzLA0KLSAqIGlmIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIGRlZmluZWQgYXMgYmVhbiBhbmQgZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbCBpbXBsZW1lbnRzIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgcHJpdmF0ZSBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAvL29wdGlvbmFsIGZhbGxiYWNrIGZvciBpbnRlcm5hbCBjYXNoaW5nDQotICAgIHByaXZhdGUgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsNCi0NCi0gICAgcHVibGljIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbCgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciBpbnN0YW5jZW9mIEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcikNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyKSBtZXRhRGF0YVRyYW5zZm9ybWVyICkuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgTWV0YURhdGFUcmFuc2Zvcm1lciBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFUcmFuc2Zvcm1lcihNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lciA9IG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25TdHJhdGVneShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneSA9IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEwYTExZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcg0KLSAgICAuQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyB0aGUgVmFsaWRhdGlvblN0cmF0ZWd5IGZvciBhIGdpdmVuIE1ldGEtRGF0YSBLZXkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFN0cmluZz4NCi0gICAgICAgIGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxTdHJpbmcsIFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZyA9IG51bGw7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBjcmVhdGUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICBpZiAobWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljTWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZy5jb250YWluc0tleShtZXRhRGF0YUtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nLmdldChtZXRhRGF0YUtleSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgIFN0cmluZyBzdHJhdGVneU5hbWU7DQotICAgICAgICAvL251bGwgLT4gdXNlIG5hbWUgbWFwcGVycw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFN0cmluZz4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0cmF0ZWd5TmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZShtZXRhRGF0YUtleSk7DQotDQotICAgICAgICAgICAgaWYgKHN0cmF0ZWd5TmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IGdldFZhbGlkYXRpb25TdHJhdGVneUluc3RhbmNlKHN0cmF0ZWd5TmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyhtZXRhRGF0YUtleSwgc3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lJbnN0YW5jZShTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUNCi0gICAgICAgICAgICAuc3RhcnRzV2l0aChBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5QUkVGSVhfRk9SX0JFQU5fTUFQUElORykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbih2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLlBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HLmxlbmd0aCgpKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uU3RyYXRlZ3kpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIG1ldGFEYXRhS2V5LCBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZGRpbmcgbWV0YS1kYXRhIGtleSB0byB2YWxpZGF0aW9uIHN0cmF0ZWd5IG1hcHBpbmc6ICINCi0gICAgICAgICAgICAgICAgKyBtZXRhRGF0YUtleSArICIgLT4gIiArIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcucHV0KG1ldGFEYXRhS2V5LCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdFN0YXRpY01hcHBpbmdzKCkNCi0gICAgew0KLSAgICAgICAgbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnID0gbmV3IFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgLy90cnkgdG8gc2V0dXAgbWFwcGluZyB3aXRoIGJhc2UgbmFtZSBieSBjb252ZW50aW9uIC0gb3ZlcnJpZGVzIGRlZmF1bHQgbWFwcGluZw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgLy9idWlsZCBjb252ZW50aW9uIChzdHJhdGVneSBtYXBwaW5nKQ0KLSAgICAgICAgICAgIHN0YXRpY0NvbmZpZy5zZXRTb3VyY2VPZk1hcHBpbmcoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVRJQ19TVFJBVEVHWV9NQVBQSU5HX1NPVVJDRSkpOw0KLQ0KLSAgICAgICAgICAgIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9zZXR1cCBjdXN0b20gbWFwcGluZyAtIG92ZXJyaWRlcyBhbGwgb3RoZXIgbWFwcGluZ3MNCi0gICAgICAgIFN0cmluZyBjdXN0b21NYXBwaW5nQmFzZU5hbWUgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OX1NUUkFURUdZX01BUFBJTkc7DQotICAgICAgICBpZiAoY3VzdG9tTWFwcGluZ0Jhc2VOYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzdGF0aWNDb25maWcgPSBuZXcgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAgICAgICAgIHN0YXRpY0NvbmZpZy5zZXRTb3VyY2VPZk1hcHBpbmcoY3VzdG9tTWFwcGluZ0Jhc2VOYW1lKTsNCi0gICAgICAgICAgICAgICAgc2V0dXBTdHJhdGVneU1hcHBpbmdzKHN0YXRpY0NvbmZpZy5nZXRNYXBwaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBTdHJhdGVneU1hcHBpbmdzKExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZyxTdHJpbmc+PiBtYXBwaW5ncykNCi0gICAgew0KLSAgICAgICAgZm9yKFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwcGluZyA6IG1hcHBpbmdzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWFwcGluZy5nZXRTb3VyY2UoKSwgbWFwcGluZy5nZXRUYXJnZXQoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxTdHJpbmc+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm5hbWVNYXBwZXJMaXN0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9JZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9JZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYzYTJhYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogaWYgYW4gYWRhcHRlciBpcyB1c2VkIGZvciBzZXZlcmFsIGNvbnN0cmFpbnRzLCB0aGlzIGludGVyZmFjZSBhbGxvd3MgdG8gaWRlbnRpZnkgaW5zdGFuY2VzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgU3RyaW5nIElEX1BSRUZJWCA9ICI6IjsNCi0NCi0gICAgU3RyaW5nIGdldElkKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1NTIzZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQmFzZSBpbnRlcmZhY2UgZm9yIFZhbGlkYXRpb25TdHJhdGVnaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi0vLypWYWxpZGF0aW9uU3RyYXRlZ3kgaW5zdGVhZCBvZiAqVmFsaWRhdG9yIHRvIGF2b2lkIG5hbWluZyBjb25mdXNpb24gDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9BYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjliM2YwZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkOTRmNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsNCi0NCi0vKioNCi0gKiBOYW1lIE1hcHBlciB3aGljaCBkZWxlZ2F0ZXMgdGhlIG5hbWUgbWFwcGluZywgZXh0cmFjdCB0aGUgbmFtZSBhbmQgY29udmVydCBpdCB0byBhIGJlYW4gbmFtZSArIHByZWZpeA0KLSAqIHRhcmdldDogY29uZmlndXJlIGEgdmFsaWRhdGlvbiBzdHJhdGVneSB2aWEgYSBtYW5hZ2VkIGJlYW4gZmFjaWxpdHkgLT4gYWxsb3dzIHRvIGluamVjdCBvdGhlciBiZWFucw0KLSAqIGluc3RlYWQgb2YgYXBpIGNhbGxzICsgaGFyZGNvZGVkIGJlYW4gbmFtZXMNCi0gKiA8cC8+DQotICogYWxsb3dlZCBiZWFuIHNjb3BlczoNCi0gKiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBzdGF0ZWxlc3M6IGFwcGxpY2F0aW9uL3NpbmdsZXRvbg0KLSAqIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGlzIHN0YXRlZnVsOiBub25lL3Byb3RvdHlwZQ0KLSAqIGRvbid0IHVzZSB0aGUgc2Vzc2lvbiBvciBhIGNvbnZlcnNhdGlvbiBzY29wZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcig1MDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfRk9SX0JFQU5fTUFQUElORyA9ICJiZWFuOiI7DQotICAgIHByaXZhdGUgTmFtZU1hcHBlcjxTdHJpbmc+IHdyYXBwZWQ7DQotDQotICAgIHB1YmxpYyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcihOYW1lTWFwcGVyPFN0cmluZz4gbmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gbmFtZU1hcHBlcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSB3cmFwcGVkLmNyZWF0ZU5hbWUoc291cmNlKTsNCi0NCi0gICAgICAgIGlmIChuYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7DQotICAgICAgICByZXR1cm4gUFJFRklYX0ZPUl9CRUFOX01BUFBJTkcgKyBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKG5hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQwMzIwNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIEFubm90YXRpb25zIHRvIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqIChjb25maWd1cmVkIHZpYSB3ZWIueG1sKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWU4MzAyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBBbm5vdGF0aW9ucyB0byBWYWxpZGF0aW9uU3RyYXRlZ2llcy4NCi0gKiAoY29uZmlndXJlZCB2aWEgaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbikNCi0gKiBUaGUgYmVhbiBwcm92aWRlcyB0aGUgZGVmYXVsdCBuYW1lIChjb252ZW50aW9uKS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gZnVsbCBxdWFsaWZpZWQgbmFtZS4gKD0gY3VzdG9taXphYmxlIGNvbnZlbnRpb24pDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMzOGQ4Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFwcyBFeHRWYWwgQW5ub3RhdGlvbnMgdG8gRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigzMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKG1ldGFEYXRhS2V5KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzgyMDUzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciB0byBwbGFjZSBBbm5vdGF0aW9ucyBhbmQgVmFsaWRhdGlvblN0cmF0ZWdpZXMgaW4gdGhlIHNhbWUgcGFja2FnZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoNDAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUtleSArDQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKS5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9QT1NURklYKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Qcmlvcml0eS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvUHJpb3JpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTExYWEzMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Qcmlvcml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLXB1YmxpYyBlbnVtIFByaW9yaXR5Ci17Ci0gICAgQkxPQ0tJTkcsCi0gICAgSElHSCwKLSAgICBNRURJVU0sCi0gICAgTE9XCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVG9Eby5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVG9Eby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDI1YTBhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5DT05TVFJVQ1RPUjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRCwgQ09OU1RSVUNUT1J9KQotcHVibGljIEBpbnRlcmZhY2UgVG9EbwotewotICAgIFByaW9yaXR5IHZhbHVlKCk7Ci0gICAgU3RyaW5nIGRlc2NyaXB0aW9uKCkgZGVmYXVsdCAiIjsKLQotICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgIEBpbnRlcmZhY2UgTGlzdAotICAgIHsKLSAgICAgICAgVG9Eb1tdIHZhbHVlKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlQ2F0ZWdvcnkuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ3YjM4NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLS8qKgotICogQVBJOjxici8+Ci0gKiBwYXJ0cyB5b3UgbWlnaHQgbmVlZCBmb3IgY3VzdG9tIGltcGxlbWVudGF0aW9ucyBhbmQgd2hpY2ggYXJlIHF1aXRlIHN0YWJsZSBpbiB2aWV3IG9mIGNoYW5nZXMKLSAqIDxwLz4KLSAqIElOVEVSTkFMOjxici8+Ci0gKiBpZiB5b3UgdGhpbmsgYWJvdXQgcmVmZXJlbmNpbmcgYW4gYXJ0aWZhY3Qgd2hpY2ggaXMgbWFya2VkIGFzIGludGVybmFsLCBhc2sgZm9yIHN1cHBvcnQuCi0gKiB0aGVyZSBzaG91bGQgYmUgYSBiZXR0ZXIgc29sdXRpb24KLSAqIDxwLz4KLSAqIENVU1RPTUlaQUJMRTo8YnIvPgotICogYSBwbGFubmVkIGV4dGVuc2lvbiBwb2ludCB3aGljaCBjb250YWlucyBsb2dpYyB0byBjdXN0b21pemUgdGhlIGZyYW1ld29yay4KLSAqIGlmIGl0IGlzbid0IGFsc28gbWFya2VkIGFzIEFQSSBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotICogaG93ZXZlciwgd2UgdHJ5IHRvIGtlZXAgaXQgYXMgc3RhYmxlIGFzIHBvc3NpYmxlIGFuZCByZWFzb25hYmxlLgotICogPHAvPgotICogUkVVU0U6PGJyLz4KLSAqIGFuIGFydGlmYWN0IHdoaWNoIHlvdSBjYW4gcmV1c2UgZm9yIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uLgotICogaWYgaXQgaXNuJ3QgbWFya2VkIGFzIEFQSSBpdCBtaWdodCBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotICogaG93ZXZlciwgd2UgdHJ5IHRvIGtlZXAgaXQgYXMgc3RhYmxlIGFzIHBvc3NpYmxlIGFuZCByZWFzb25hYmxlLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLXB1YmxpYyBlbnVtIFVzYWdlQ2F0ZWdvcnkKLXsKLSAgICBBUEksCi0gICAgSU5URVJOQUwsCi0gICAgQ1VTVE9NSVpBQkxFLAotICAgIFJFVVNFCi19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MzdlYmMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIGl0J3MgYW4gaW50ZXJuYWwgYW5ub3RhdGlvbiB0byBwcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gY29uY2VybmluZyB1c2FnZS1jYXRlZ29yaWVzCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkKLSAqLwotQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi1wdWJsaWMgQGludGVyZmFjZSBVc2FnZUluZm9ybWF0aW9uCi17Ci0gICAgVXNhZ2VDYXRlZ29yeVtdIHZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0NsYXNzVXRpbHMuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2UyMDU2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ2xhc3NVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsNCi1pbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ2xhc3NVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENsYXNzVXRpbHMuY2xhc3MpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIHRyeVRvTG9hZENsYXNzRm9yTmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGxvYWRDbGFzc0Zvck5hbWUobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGxvYWRDbGFzc0Zvck5hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIFRyeSBXZWJBcHAgQ2xhc3NMb2FkZXIgZmlyc3QNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwDQotICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWdub3JlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIGZhbGxiYWNrOiBUcnkgQ2xhc3NMb2FkZXIgZm9yIENsYXNzVXRpbHMgKGkuZS4gdGhlIG15ZmFjZXMuamFyIGxpYikNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgLy8gZG8gbm90IGluaXRpYWxpemUgZm9yIGZhc3RlciBzdGFydHVwDQotICAgICAgICAgICAgICAgIENsYXNzVXRpbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyA8VD4gVCB0cnlUb0luc3RhbnRpYXRlQ2xhc3MoQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0YXJnZXRDbGFzcy5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKFN0cmluZyBjbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxvYWRDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEphclZlcnNpb24oQ2xhc3MgdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjbGFzc0ZpbGVQYXRoID0gdGFyZ2V0Q2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyI7DQotICAgICAgICBTdHJpbmcgbWFuaWZlc3RGaWxlUGF0aCA9ICIvTUVUQS1JTkYvTUFOSUZFU1QuTUYiOw0KLQ0KLSAgICAgICAgU3RyaW5nIGNsYXNzTG9jYXRpb24gPSB0YXJnZXRDbGFzcy5nZXRSZXNvdXJjZSh0YXJnZXRDbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiLmNsYXNzIikudG9TdHJpbmcoKTsNCi0gICAgICAgIFN0cmluZyBtYW5pZmVzdEZpbGVMb2NhdGlvbiA9IGNsYXNzTG9jYXRpb24NCi0gICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCBjbGFzc0xvY2F0aW9uLmluZGV4T2YoY2xhc3NGaWxlUGF0aCkgLSAxKSArIG1hbmlmZXN0RmlsZVBhdGg7DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IE1hbmlmZXN0KG5ldyBVUkwobWFuaWZlc3RGaWxlTG9jYXRpb24pLm9wZW5TdHJlYW0oKSkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNYWluQXR0cmlidXRlcygpLmdldFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5JTVBMRU1FTlRBVElPTl9WRVJTSU9OKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoTE9HLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBMT0cudHJhY2UoImNvdWxkbid0IGxvYWQgdmVyc2lvbiBvZiBqYXIgZmlsZSB3aGljaCBjb250YWlucyAiICsgdGFyZ2V0Q2xhc3MuZ2V0TmFtZSgpLCB0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9EZWZhdWx0UHJvamVjdE5hbWUuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRGVmYXVsdFByb2plY3ROYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZDYzOTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9EZWZhdWx0UHJvamVjdE5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Qcm9qZWN0U3RhZ2VOYW1lOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0UHJvamVjdE5hbWUgaW1wbGVtZW50cyBQcm9qZWN0U3RhZ2VOYW1lDQotew0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOw0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pDQotICAgIHByaXZhdGUgRGVmYXVsdFByb2plY3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIERlZmF1bHRQcm9qZWN0TmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBzdGF0aWMgUHJvamVjdFN0YWdlTmFtZSBjcmVhdGVQcm9qZWN0U3RhZ2VOYW1lKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRQcm9qZWN0TmFtZShuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5uYW1lOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmICh0aGlzID09IG8pDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgRGVmYXVsdFByb2plY3ROYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBEZWZhdWx0UHJvamVjdE5hbWUgdGhhdCA9IChEZWZhdWx0UHJvamVjdE5hbWUpIG87DQotDQotICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKHRoYXQubmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmFtZS5oYXNoQ29kZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRXh0VmFsVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJlZTNkYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NjQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5WYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Qcm9qZWN0U3RhZ2VOYW1lOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5BYnN0cmFjdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5OYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQuQ29tcG9uZW50SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5GYWNlc01lc3NhZ2VTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbFV0aWxzDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HR0VSID0gTG9nRmFjdG9yeS5nZXRMb2coRXh0VmFsVXRpbHMuY2xhc3MpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfUkVRVUlSRUQgPSAiamF2YXguZmFjZXMuY29tcG9uZW50LlVJSW5wdXQuUkVRVUlSRUQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfUkVRVUlSRURfREVUQUlMID0gImphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUlucHV0LlJFUVVJUkVEX2RldGFpbCI7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19NQVhJTVVNID0gImphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3IuTUFYSU1VTSI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19NQVhJTVVNX0RFVEFJTCA9ICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yLk1BWElNVU1fZGV0YWlsIjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChDbGFzc01hcHBpbmdGYWN0b3J5PFN0cmluZywgVmFsaWRhdGlvblN0cmF0ZWd5PikgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZShtZXRhRGF0YUtleSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgTmFtZU1hcHBlcjxTdHJpbmc+IG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlcmVnaXN0ZXIobWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbnlNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gbWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZW55KG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFUcmFuc2Zvcm1lciBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YVRyYW5zZm9ybWVyPikgRXh0VmFsQ29udGV4dA0KLSAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlKHZhbGlkYXRpb25TdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLnJlZ2lzdGVyKHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVyZWdpc3Rlcih2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZW55VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVueSh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLCBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yV2l0aChNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlksIENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVdpdGgocHJvcGVydGllcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudFdpdGhNZXRhRGF0YShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGZvciAoQ29tcG9uZW50SW5pdGlhbGl6ZXIgY29tcG9uZW50SW5pdGlhbGl6ZXIgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRDb21wb25lbnRJbml0aWFsaXplcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjb21wb25lbnRJbml0aWFsaXplci5jb25maWd1cmVDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOw0KLQ0KLSAgICAgICAgaWYgKG1ldGFEYXRhRW50cnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YUVudHJ5ID0gbmV3IE1ldGFEYXRhRW50cnkoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAoVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCF2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJUaHJvd2luZygNCi0gICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbiwgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGVJbnRlcmNlcHRlZE1ldGFEYXRhRXh0cmFjdG9yKGZpbmFsIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvcldpdGgobWV0YURhdGFFeHRyYWN0b3IsIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvckZvcigNCi0gICAgICAgICAgICBmaW5hbCBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciwgQ2xhc3MgbW9kdWxlS2V5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIGlmKG1vZHVsZUtleSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpLCBtb2R1bGVLZXkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3JXaXRoKG1ldGFEYXRhRXh0cmFjdG9yLCBwcm9wZXJ0aWVzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3JXaXRoKA0KLSAgICAgICAgICAgIGZpbmFsIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yLCBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgTWV0YURhdGFFeHRyYWN0b3IoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcmVzdWx0ID0gbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIG9iamVjdCk7DQotDQotICAgICAgICAgICAgICAgIGFkZFByb3BlcnRpZXMocmVzdWx0LCBwcm9wZXJ0aWVzKTsNCi0gICAgICAgICAgICAgICAgaW52b2tlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKHJlc3VsdCwgcHJvcGVydGllcyk7DQotDQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFByb3BlcnRpZXMoUHJvcGVydHlJbmZvcm1hdGlvbiByZXN1bHQsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgaWYocHJvcGVydGllcyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY3VzdG9tUHJvcGVydGllcyA9IGdldEN1c3RvbVByb3BlcnRpZXMocmVzdWx0KTsNCi0gICAgICAgICAgICBjdXN0b21Qcm9wZXJ0aWVzLnB1dEFsbChwcm9wZXJ0aWVzKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEN1c3RvbVByb3BlcnRpZXMoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZighcHJvcGVydHlJbmZvcm1hdGlvbi5jb250YWluc0luZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkNVU1RPTV9QUk9QRVJUSUVTKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnNldEluZm9ybWF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuQ1VTVE9NX1BST1BFUlRJRVMsIG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoTWFwPFN0cmluZywgT2JqZWN0PikgcHJvcGVydHlJbmZvcm1hdGlvbi5nZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5DVVNUT01fUFJPUEVSVElFUyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbnZva2VNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoUHJvcGVydHlJbmZvcm1hdGlvbiByZXN1bHQsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgZm9yIChNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciA6DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yc1dpdGgocHJvcGVydGllcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJFeHRyYWN0aW5nKHJlc3VsdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlUmVzb2x2ZXIgZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXNzYWdlUmVzb2x2ZXI+KSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlKHZhbGlkYXRpb25TdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5yZWdpc3Rlcih2YWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlcmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IHZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzKQ0KLSAgICB7DQotICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlcmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZW55VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZW55KHZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEVMSGVscGVyIGdldEVMSGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRUxfSEVMUEVSX0ZBQ1RPUlksIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmNsYXNzKS5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY2VzTWVzc2FnZSBjcmVhdGVGYWNlc01lc3NhZ2UoU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcmVhdGVGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjZXNNZXNzYWdlIGNyZWF0ZUZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHksIFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5GQUNFU19NRVNTQUdFX0ZBQ1RPUlksIEZhY2VzTWVzc2FnZUZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUoc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBGYWNlc01lc3NhZ2UgY29udmVydEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5GQUNFU19NRVNTQUdFX0ZBQ1RPUlksIEZhY2VzTWVzc2FnZUZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5jb252ZXJ0KGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eURldGFpbHMgY3JlYXRlUHJvcGVydHlEZXRhaWxzRm9yTmV3VGFyZ2V0KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgYmFzZU9iamVjdDsNCi0gICAgICAgIGlmIChnZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZCh0YXJnZXRFeHByZXNzaW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZSA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHRhcmdldEV4cHJlc3Npb24pOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyBleHByZXNzaW9uID0gdmJlLmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgICAgICBiYXNlT2JqZWN0ID0gZ2V0RUxIZWxwZXIoKS5nZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZiZS5nZXRCYXNlRXhwcmVzc2lvbigpKTsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uc3Vic3RyaW5nKDIsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxKSwgYmFzZU9iamVjdCwgdmJlLmdldFByb3BlcnR5KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIG9yaWdpbmFsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eSgNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIFN0cmluZyBuZXdCYXNlS2V5ID0gb3JpZ2luYWwuZ2V0S2V5KCkuc3Vic3RyaW5nKDAsIG9yaWdpbmFsLmdldEtleSgpLmxhc3RJbmRleE9mKCIuIikgKyAxKTsNCi0gICAgICAgIFN0cmluZyBuZXdLZXkgPSBuZXdCYXNlS2V5ICsgdGFyZ2V0RXhwcmVzc2lvbjsNCi0NCi0gICAgICAgIGJhc2VPYmplY3QgPSBSZWZsZWN0aW9uVXRpbHMuZ2V0QmFzZU9mUHJvcGVydHlDaGFpbihvcmlnaW5hbC5nZXRCYXNlT2JqZWN0KCksIHRhcmdldEV4cHJlc3Npb24pOw0KLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURldGFpbHMoDQotICAgICAgICAgICAgICAgIG5ld0tleSwgYmFzZU9iamVjdCwgdGFyZ2V0RXhwcmVzc2lvbi5zdWJzdHJpbmcodGFyZ2V0RXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiLiIpICsgMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRFeHByZXNzaW9uLmxlbmd0aCgpKSk7DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvUGxhY2VMYWJlbChGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBTdHJpbmcgbGFiZWwsIGludCBpbmRleCkNCi0gICAgew0KLSAgICAgICAgaWYgKGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCAmJiBmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLmNvbnRhaW5zKCJ7IiArIGluZGV4ICsgIn0iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpLnJlcGxhY2UoInsiICsgaW5kZXggKyAifSIsIGxhYmVsKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoZmFjZXNNZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwgJiYgZmFjZXNNZXNzYWdlLmdldERldGFpbCgpLmNvbnRhaW5zKCJ7IiArIGluZGV4ICsgIn0iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKS5yZXBsYWNlKCJ7IiArIGluZGV4ICsgIn0iLCBsYWJlbCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBsYWNlV2l0aERlZmF1bHRNYXhpbXVtTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBpbnQgbWF4TGVuZ3RoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2UgPSBKc2ZVdGlscy5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZShKQVZBWF9GQUNFU19NQVhJTVVNKTsNCi0gICAgICAgIFN0cmluZyBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlOw0KLQ0KLSAgICAgICAgLy91c2UgdHJ5L2NhdGNoIGZvciBlYXNpZXIgc3luYyBiZXR3ZWVuIHRydW5rL2JyYW5jaA0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKEpzZlV0aWxzLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKEpBVkFYX0ZBQ0VTX01BWElNVU1fREVUQUlMKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBKc2ZVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZShKQVZBWF9GQUNFU19NQVhJTVVNX0RFVEFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9qc2YgMS4yIGRvZXNuJ3QgaGF2ZSBhIGRldGFpbCBtZXNzYWdlDQotICAgICAgICB9DQotDQotICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZSA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlLnJlcGxhY2UoInswfSIsICIiICsgbWF4TGVuZ3RoKTsNCi0gICAgICAgIGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsID0gZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwucmVwbGFjZSgiezB9IiwgIiIgKyBtYXhMZW5ndGgpOw0KLQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoZmFjZXNSZXF1aXJlZE1lc3NhZ2UpOw0KLSAgICAgICAgZmFjZXNNZXNzYWdlLnNldERldGFpbChmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCk7DQotICAgIH0NCi0NCi0gICAgQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2UgPSBKc2ZVdGlscy5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZShKQVZBWF9GQUNFU19SRVFVSVJFRCk7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZTsNCi0NCi0gICAgICAgIC8vdXNlIHRyeS9jYXRjaCBmb3IgZWFzaWVyIHN5bmMgYmV0d2VlbiB0cnVuay9icmFuY2gNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChKc2ZVdGlscy5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZShKQVZBWF9GQUNFU19SRVFVSVJFRF9ERVRBSUwpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IEpzZlV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKEpBVkFYX0ZBQ0VTX1JFUVVJUkVEX0RFVEFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9qc2YgMS4yIGRvZXNuJ3QgaGF2ZSBhIGRldGFpbCBtZXNzYWdlDQotICAgICAgICB9DQotDQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0U3VtbWFyeShmYWNlc1JlcXVpcmVkTWVzc2FnZSk7DQotICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTa2lwYWJsZVZhbGlkYXRpb25TdHJhdGVneShDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50Q2xhc3MgOiBnZXRTa2lwVmFsaWRhdGlvblN1cHBvcnRDbGFzc0xpc3QoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoaXNTa2lwVmFsaWRhdGlvblN1cHBvcnRlZChjdXJyZW50Q2xhc3MsIHRhcmdldENsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvY2Vzc01ldGFEYXRhRW50cnlBZnRlclNraXBWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHRhcmdldENsYXNzLCBNZXRhRGF0YUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gaXNTa2lwYWJsZVZhbGlkYXRpb25TdHJhdGVneSh0YXJnZXRDbGFzcykgJiYNCi0gICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhlbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5TS0lQX1ZBTElEQVRJT04sIEJvb2xlYW4uY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8Q2xhc3M+IGdldFNraXBWYWxpZGF0aW9uU3VwcG9ydENsYXNzTGlzdCgpDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IHN0YXRpY0NvbmZpZ3VyYXRpb25MaXN0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlNLSVBfVkFMSURBVElPTl9TVVBQT1JUX0NPTkZJRyk7DQotDQotICAgICAgICBMaXN0PENsYXNzPiBtYXJrZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzczsNCi0gICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gY3VycmVudEVudHJ5IDogc3RhdGljQ29uZmlndXJhdGlvbkxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IGN1cnJlbnRDb25maWd1cmF0aW9uRW50cnkgOiBjdXJyZW50RW50cnkuZ2V0TWFwcGluZygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudENsYXNzID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUoY3VycmVudENvbmZpZ3VyYXRpb25FbnRyeS5nZXRUYXJnZXQoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q2xhc3MgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbWFya2VyTGlzdC5hZGQoY3VycmVudENsYXNzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChMT0dHRVIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi53YXJuKCJjb25maWd1cmF0aW9uIGVudHJ5IHByb3ZpZGVzIGFuIGludmFsaWQgZW50cnk6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY3VycmVudENvbmZpZ3VyYXRpb25FbnRyeS5nZXRUYXJnZXQoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWFya2VyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTa2lwVmFsaWRhdGlvblN1cHBvcnRlZChDbGFzcyBjdXJyZW50Q2xhc3MsIENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZiAoY3VycmVudENsYXNzLmlzQW5ub3RhdGlvbigpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh0YXJnZXRDbGFzcy5pc0Fubm90YXRpb25QcmVzZW50KGN1cnJlbnRDbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGN1cnJlbnRDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRhcmdldENsYXNzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgZ2V0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpDQotICAgIHsNCi0gICAgICAgIGlmKGlzVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rpb25EZWFjdGl2YXRlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpIHsNCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4oKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5KQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIDxUPiBMaXN0PFQ+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzczxUPiB2YWx1ZVR5cGUpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFQ+KCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIDxUPiBUIGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzczxUPiB2YWx1ZVR5cGUsIENsYXNzIHZhbHVlSWQpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkuZ2V0RmFjdG9yeSgNCi0gICAgICAgICAgICAgICAgRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZLCBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKENsYXNzIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgIENsYXNzTWFwcGluZ0ZhY3Rvcnk8Q2xhc3MsIENsYXNzPiB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlksIENsYXNzTWFwcGluZ0ZhY3RvcnkuY2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5LmNyZWF0ZShzb3VyY2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdGlvbkRlYWN0aXZhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX1ZBTElEQVRJT05fUEFSQU1FVEVSUyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGV4ZWN1dGVMb2NhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHByb3BlcnRpZXMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0gZ2V0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpLmV4dHJhY3QoDQotICAgICAgICAgICAgICAgIGFubm90YXRpb24sIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLCBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcyk7DQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7DQotDQotICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5TWFwLnB1dChwcm9wZXJ0eUtleSwgcHJvcGVydGllcyk7DQotICAgICAgICB9DQotICAgICAgICBwcm9wZXJ0eU1hcC5wdXQoQW5ub3RhdGlvbi5jbGFzcy5nZXROYW1lKCksIGFubm90YXRpb24pOw0KLQ0KLSAgICAgICAgZm9yIChQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciA6IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIXByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgICAgICAgICAgICAgICAgICAuYmVmb3JlVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHByb3BlcnR5TWFwKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGV4ZWN1dGVMb2NhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5S2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwcm9wZXJ0aWVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0gZ2V0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpLmV4dHJhY3QoDQotICAgICAgICAgICAgICAgIGFubm90YXRpb24sIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLCBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcyk7DQotDQotICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5TWFwLnB1dChwcm9wZXJ0eUtleSwgcHJvcGVydGllcyk7DQotICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KEFubm90YXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBhbm5vdGF0aW9uKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgOiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlNYXApOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJpcyByZW5hbWluZyBvaz8iKQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXhlY3V0ZUdsb2JhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwcm9wZXJ0aWVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgbW9kdWxlS2V5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7DQotDQotICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5TWFwLnB1dChwcm9wZXJ0eUtleSwgcHJvcGVydGllcyk7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IobW9kdWxlS2V5KTsNCi0NCi0gICAgICAgIGZvciAoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgOiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLSAgICAgICAgICAgICAgICAgICAgLmJlZm9yZVZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eU1hcCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJpcyByZW5hbWluZyBvaz8iKQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5S2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcHJvcGVydGllcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgbW9kdWxlS2V5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5TWFwLnB1dChwcm9wZXJ0eUtleSwgcHJvcGVydGllcyk7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IobW9kdWxlS2V5KTsNCi0NCi0gICAgICAgIGZvciAoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgOiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuYWZ0ZXJWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlNYXApOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgZ2V0U3RvcmFnZShDbGFzczxUPiBzdG9yYWdlVHlwZSwgU3RyaW5nIHN0b3JhZ2VOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFQpIGdldFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSgpLmNyZWF0ZShzdG9yYWdlVHlwZSkuY3JlYXRlKHN0b3JhZ2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRTdG9yYWdlKENsYXNzIHN0b3JhZ2VUeXBlLCBTdHJpbmcgc3RvcmFnZU5hbWUpDQotICAgIHsNCi0gICAgICAgIGdldFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSgpLmNyZWF0ZShzdG9yYWdlVHlwZSkucmVzZXQoc3RvcmFnZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIENsYXNzTWFwcGluZ0ZhY3Rvcnk8Q2xhc3MsIFN0b3JhZ2VNYW5hZ2VyPiBnZXRTdG9yYWdlTWFuYWdlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFRyYW5zZm9ybWVkTWV0YURhdGEoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRUcmFuc2Zvcm1lZE1ldGFEYXRhRm9yKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRUcmFuc2Zvcm1lZE1ldGFEYXRhRm9yKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBDbGFzcyBtb2R1bGVLZXkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgaWYobW9kdWxlS2V5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCksIG1vZHVsZUtleSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZ2V0VHJhbnNmb3JtZWRNZXRhRGF0YVdpdGgoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgcHJvcGVydGllcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFRyYW5zZm9ybWVkTWV0YURhdGFXaXRoKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotICAgICAgICBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvciBza2lwVmFsaWRhdGlvbkV2YWx1YXRvciA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKCk7DQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yV2l0aChwcm9wZXJ0aWVzKTsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGE7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhUmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGFEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gdHJhbnNmb3JtTWV0YURhdGEoDQotICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblN0cmF0ZWd5LCBza2lwVmFsaWRhdGlvbkV2YWx1YXRvciwgbWV0YURhdGEsIGVudHJ5KTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKCFpc0NvbXBvbmVudEluaXRpYWxpemF0aW9uU2tpcHBlZChtZXRhRGF0YSwgZW50cnksIHZhbGlkYXRpb25TdHJhdGVneSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vZG9uJ3QgYnJlYWsgbWF5YmUgdGhlcmUgYXJlIGNvbnN0cmFpbnRzIHdoaWNoIGRvbid0IHN1cHBvcnQgdGhlIHNraXAtbWVjaGFuaXNtDQotICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YVJlc3VsdC5wdXRBbGwobWV0YURhdGEpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhUmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEsIE1ldGFEYXRhRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmICghc2tpcFZhbGlkYXRpb25FdmFsdWF0b3Iuc2tpcFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblN0cmF0ZWd5LCBlbnRyeSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyID0gZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckZvclZhbGlkYXRpb25TdHJhdGVneSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIExPR0dFUi5kZWJ1ZyhtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWV0YURhdGEgPSBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAobWV0YURhdGEgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbWV0YURhdGE7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvbXBvbmVudEluaXRpYWxpemF0aW9uU2tpcHBlZChNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhLCBNZXRhRGF0YUVudHJ5IGVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YS5pc0VtcHR5KCkgfHwNCi0gICAgICAgICAgICAgICAgKEJvb2xlYW4uVFJVRS5lcXVhbHMoZW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCBCb29sZWFuLmNsYXNzKSkgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICBpc1NraXBhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKSkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpDQotICAgIHsNCi0gICAgICAgIC8vdG8gZGVhY3RpdmF0ZTogdGhlIHBhcmFtZXRlciBoYXMgdG8gYmUgZXhwbGljaXRseSBmYWxzZQ0KLSAgICAgICAgcmV0dXJuICEiZmFsc2UiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLklOVEVSUFJFVF9FTVBUWV9TVFJJTkdfU1VCTUlUVEVEX1ZBTFVFU19BU19OVUxMKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVFbXB0eUZpZWxkcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAhImZhbHNlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFBhcmFtZXRlci5WQUxJREFURV9FTVBUWV9GSUVMRFMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHlEZXRhaWxzIGdldFByb3BlcnR5RGV0YWlscyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvVGhyb3dWYWxpZGF0b3JFeGNlcHRpb25Gb3JDb21wb25lbnRJZCgNCi0gICAgICAgICAgICBTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpDQotICAgIHsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IGZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgdHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudCh0YXJnZXRDb21wb25lbnQsIGZhY2VzTWVzc2FnZSwgdGhyb3dhYmxlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudCgNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkNCi0gICAgew0KLSAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBpbnRlcnByZXRlciA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBpZiAoaW50ZXJwcmV0ZXIuc2V2ZXJpdHlDYXVzZXNWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh0aHJvd2FibGUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc01lc3NhZ2UsIHRocm93YWJsZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudCh1aUNvbXBvbmVudCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50SWQoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBVSUNvbXBvbmVudCB0YXJnZXRDb21wb25lbnQgPSBmaW5kQ29tcG9uZW50KGNsaWVudElkKTsNCi0NCi0gICAgICAgIGlmICh0YXJnZXRDb21wb25lbnQgPT0gbnVsbCAmJiBjbGllbnRJZCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvclRlc3RDbGllbnRJZChjbGllbnRJZCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICB0cnlUb0FkZFZpb2xhdGlvbk1lc3NhZ2VGb3JDb21wb25lbnQodGFyZ2V0Q29tcG9uZW50LCBmYWNlc01lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJyZXF1aXJlZCBmb3IgdGVzdCBmcmFtZXdvcmtzIC0gZ29hbDogcmVtb3ZlIGl0IikNCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0cnlUb0FkZFZpb2xhdGlvbk1lc3NhZ2VGb3JUZXN0Q2xpZW50SWQoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGludGVycHJldGVyID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIGlmIChpbnRlcnByZXRlci5zZXZlcml0eUNhdXNlc1Zpb2xhdGlvbk1lc3NhZ2UoZmFjZXNDb250ZXh0LCBudWxsLCBmYWNlc01lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkRmFjZXNNZXNzYWdlKGNsaWVudElkLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50KG51bGwsIGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBpbnRlcnByZXRlciA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBpZiAoaW50ZXJwcmV0ZXIuc2V2ZXJpdHlDYXVzZXNWaW9sYXRpb25NZXNzYWdlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGZhY2VzTWVzc2FnZS5nZXRTZXZlcml0eSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodWlDb21wb25lbnQgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFkZEZhY2VzTWVzc2FnZSh1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRGYWNlc01lc3NhZ2UobnVsbCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICB0cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnQodWlDb21wb25lbnQsIGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBhZGRGYWNlc01lc3NhZ2UobnVsbCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRmFjZXNNZXNzYWdlKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlU3RvcmFnZSBzdG9yYWdlID0gZ2V0U3RvcmFnZShGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLCBGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBpZiAoc3RvcmFnZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0b3JhZ2UuYWRkRmFjZXNNZXNzYWdlKGNsaWVudElkLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5hZGRNZXNzYWdlKGNsaWVudElkLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnRJZChTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IGZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgdHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50KHRhcmdldENvbXBvbmVudCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGludGVycHJldGVyID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIGlmIChpbnRlcnByZXRlci5zZXZlcml0eUJsb2Nrc05hdmlnYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5yZW5kZXJSZXNwb25zZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXZlcml0eUJsb2Nrc1N1Ym1pdEZvckNvbXBvbmVudElkKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBpbnRlcnByZXRlciA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBVSUNvbXBvbmVudCB0YXJnZXRDb21wb25lbnQgPSBmaW5kQ29tcG9uZW50KGNsaWVudElkKTsNCi0NCi0gICAgICAgIHJldHVybiBpbnRlcnByZXRlci5zZXZlcml0eUJsb2Nrc1N1Ym1pdChmYWNlc0NvbnRleHQsIHRhcmdldENvbXBvbmVudCwgZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCkpOw0KLSAgICB9DQotDQotICAgIC8vYXZhaWxhYmxlIGZvciBhZGQtb25zIC0gbm90IHVzZWQgaW50ZXJuYWxseSBkdWUgdG8gcGVyZm9ybWFuY2UgcmVhc29ucw0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2V2ZXJpdHlTaG93c0luZGljYXRpb25Gb3JDb21wb25lbnRJZChTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gZmluZENvbXBvbmVudChjbGllbnRJZCk7DQotDQotICAgICAgICByZXR1cm4gaW50ZXJwcmV0ZXIuc2V2ZXJpdHlTaG93c0luZGljYXRpb24oZmFjZXNDb250ZXh0LCB0YXJnZXRDb21wb25lbnQsIGZhY2VzTWVzc2FnZS5nZXRTZXZlcml0eSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBVSUNvbXBvbmVudCBmaW5kQ29tcG9uZW50KFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgICAgIGlmIChjbGllbnRJZCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldENvbXBvbmVudCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRhcmdldENvbXBvbmVudDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQHJldHVybiB0cnVlIGlmIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbiBmb3IgcmVxdWlyZWQgdmFsaWRhdGlvbiBpcyBhY3RpdmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25BY3RpdmUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFLmVxdWFscyhFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eSgibW9kZTppbml0OnJlcXVpcmVkIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBuZWVkZWQgZm9yIHNvbWUgY29tcG9uZW50IGxpYnMgLSBpZiByZXF1aXJlZCBpbml0aWFsaXphdGlvbiBpcyB1c2VkIGUuZy4gZm9yIHZpc3VhbCBpbmRpY2F0b3JzDQotICAgICAqIGJ1dCBmZWF0dXJlcyBsaWtlIHNldmVyaXR5IGF3YXJlIHZhbGlkYXRpb24gYXJlbid0IHVzZWQuDQotICAgICAqIGluIHN1Y2ggYSBjYXNlIGl0J3MgcG9zc2libGUgdG8gdXNlIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGUuDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuIGZhbHNlIHRvIGRlYWN0aXZhdGUgdGhlIGZpbmFsIHJlc2V0IG9mIHRoZSB2YWx1ZSBvZiB0aGUgcmVxdWlyZWQgYXR0cmlidXRlDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZXF1aXJlZFJlc2V0QWN0aXZhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRS5lcXVhbHMoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoIm1vZGU6cmVzZXQ6cmVxdWlyZWQiKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0U3RhZ2VOYW1lIGdldERlZmF1bHRTdGFnZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY3JlYXRlUHJvamVjdFN0YWdlTmFtZSgiUHJvZHVjdGlvbiIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdFN0YWdlTmFtZSBjcmVhdGVQcm9qZWN0U3RhZ2VOYW1lKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRGVmYXVsdFByb2plY3ROYW1lLmNyZWF0ZVByb2plY3RTdGFnZU5hbWUobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXh0VmFsRGVhY3RpdmF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoU3lzdGVtDQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSArDQotICAgICAgICAgICAgICAgICAgICAiLkRFQUNUSVZBVEVfQUxMIiwgImZhbHNlIikpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvR3JvdXBVdGlscy5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Hcm91cFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMDkyODEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Hcm91cFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEdyb3VwVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEdyb3VwS2V5KFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNsaWVudElkID09IG51bGwgPyB2aWV3SWQgOiB2aWV3SWQgKyAiQCIgKyBjbGllbnRJZDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0pzZlV0aWxzLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0pzZlV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNzZlY2EuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkZhY2VzSW5mb3JtYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY3RvcnlGaW5kZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGU7DQotaW1wb3J0IGphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGVGYWN0b3J5Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsNCi0NCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKc2ZVdGlscw0KLXsNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlcmVnaXN0ZXJQaGFzZUxpc3RlbmVyKFBoYXNlTGlzdGVuZXIgcGhhc2VMaXN0ZW5lcikNCi0gICAgew0KLSAgICAgICAgTGlmZWN5Y2xlRmFjdG9yeSBsaWZlY3ljbGVGYWN0b3J5ID0gKExpZmVjeWNsZUZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEZhY3RvcnlGaW5kZXIuTElGRUNZQ0xFX0ZBQ1RPUlkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRJZDsNCi0gICAgICAgIExpZmVjeWNsZSBjdXJyZW50TGlmZWN5Y2xlOw0KLSAgICAgICAgSXRlcmF0b3IgbGlmZWN5Y2xlSWRzID0gbGlmZWN5Y2xlRmFjdG9yeS5nZXRMaWZlY3ljbGVJZHMoKTsNCi0gICAgICAgIHdoaWxlIChsaWZlY3ljbGVJZHMuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRJZCA9IChTdHJpbmcpIGxpZmVjeWNsZUlkcy5uZXh0KCk7DQotICAgICAgICAgICAgY3VycmVudExpZmVjeWNsZSA9IGxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlKGN1cnJlbnRJZCk7DQotICAgICAgICAgICAgY3VycmVudExpZmVjeWNsZS5yZW1vdmVQaGFzZUxpc3RlbmVyKHBoYXNlTGlzdGVuZXIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlclBoYXNlTGlzdGVuZXIoUGhhc2VMaXN0ZW5lciBwaGFzZUxpc3RlbmVyKQ0KLSAgICB7DQotICAgICAgICBMaWZlY3ljbGVGYWN0b3J5IGxpZmVjeWNsZUZhY3RvcnkgPSAoTGlmZWN5Y2xlRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRmFjdG9yeUZpbmRlci5MSUZFQ1lDTEVfRkFDVE9SWSk7DQotDQotICAgICAgICBTdHJpbmcgY3VycmVudElkOw0KLSAgICAgICAgTGlmZWN5Y2xlIGN1cnJlbnRMaWZlY3ljbGU7DQotICAgICAgICBJdGVyYXRvciBsaWZlY3ljbGVJZHMgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZUlkcygpOw0KLSAgICAgICAgd2hpbGUgKGxpZmVjeWNsZUlkcy5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudElkID0gKFN0cmluZykgbGlmZWN5Y2xlSWRzLm5leHQoKTsNCi0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlID0gbGlmZWN5Y2xlRmFjdG9yeS5nZXRMaWZlY3ljbGUoY3VycmVudElkKTsNCi0gICAgICAgICAgICBjdXJyZW50TGlmZWN5Y2xlLmFkZFBoYXNlTGlzdGVuZXIocGhhc2VMaXN0ZW5lcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIHJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoRmFjZXNNZXNzYWdlLkZBQ0VTX01FU1NBR0VTLCBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRDdXN0b21GYWNlc01lc3NhZ2VCdW5kbGUoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgU3RyaW5nIGJ1bmRsZU5hbWUgPSBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5nZXRNZXNzYWdlQnVuZGxlKCk7DQotDQotICAgICAgICBpZiAoYnVuZGxlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShidW5kbGVOYW1lLCBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZUZyb21BcHBsaWNhdGlvbk1lc3NhZ2VCdW5kbGUoU3RyaW5nIG1lc3NhZ2VLZXkpDQotICAgIHsNCi0gICAgICAgIFJlc291cmNlQnVuZGxlIGN1c3RvbVJlc291cmNlQnVuZGxlID0gZ2V0Q3VzdG9tRmFjZXNNZXNzYWdlQnVuZGxlKCk7DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoY3VzdG9tUmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjdXN0b21SZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcobWVzc2FnZUtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vbm8gY3VzdG9tIG1lc3NhZ2UgaXMgYXZhaWxhYmxlIC0gZG8gbm90aGluZw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGdldERlZmF1bHRGYWNlc01lc3NhZ2VCdW5kbGUoKS5nZXRTdHJpbmcobWVzc2FnZUtleSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVuZGVyUmVzcG9uc2VQaGFzZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLlJFTkRFUl9SRVNQT05TRS5lcXVhbHMoZ2V0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UoKS5nZXRDdXJyZW50UGhhc2VJZCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFBoYXNlSWQgZ2V0Q3VycmVudFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UoKS5nZXRDdXJyZW50UGhhc2VJZCgpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBzaW1wbGUgdGVzdCBmb3IgZWFybHkgY29uZmlnIGluIGNhc2Ugb2YgbW9qYXJyYQ0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGpzZiBpbXBsLiBpcyBpbml0aWFsaXplZCBhbmQgaXQncyBwb3NzaWJsZSB0byB1c2UgaXQgYXMgZXhwZWN0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FwcGxpY2F0aW9uSW5pdGlhbGl6ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldENsYXNzKCkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIm9yZy5hcGFjaGUubXlmYWNlcyIpIHx8DQotICAgICAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICFGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLmlzRW1wdHkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBGYWNlc0luZm9ybWF0aW9uU3RvcmFnZSBnZXRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLCBGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUHJveHlVdGlscy5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Qcm94eVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NWMyM2UuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Qcm94eVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHkuUHJveHlIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5LkRlZmF1bHRQcm94eUhlbHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJveHlVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgUHJveHlIZWxwZXIgcHJveHlIZWxwZXI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IENsYXNzPFQ+IGdldFVucHJveGllZENsYXNzKENsYXNzIGN1cnJlbnRDbGFzcywgQ2xhc3M8VD4gdGFyZ2V0VHlwZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFByb3h5SGVscGVyKCkuZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudENsYXNzLCB0YXJnZXRUeXBlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldFVucHJveGllZENsYXNzKENsYXNzIGN1cnJlbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFByb3h5SGVscGVyKCkuZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudENsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGFzc05hbWUoQ2xhc3MgcHJveGllZENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UHJveHlIZWxwZXIoKS5nZXROYW1lT2ZDbGFzcyhwcm94aWVkQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsYXNzTmFtZU9mT2JqZWN0KE9iamVjdCBwcm94aWVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UHJveHlIZWxwZXIoKS5nZXRDbGFzc05hbWVPZk9iamVjdChwcm94aWVkT2JqZWN0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UHJveHlIZWxwZXIoKS5pc1Byb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb3hpZWRPYmplY3QoT2JqZWN0IHByb3hpZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRQcm94eUhlbHBlcigpLmlzUHJveGllZE9iamVjdChwcm94aWVkT2JqZWN0KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBQcm94eUhlbHBlciBnZXRQcm94eUhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIGlmIChwcm94eUhlbHBlciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vd29ya2Fyb3VuZCBmb3IgbW9qYXJyYQ0KLSAgICAgICAgICAgIGlmKCFKc2ZVdGlscy5pc0FwcGxpY2F0aW9uSW5pdGlhbGl6ZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFByb3h5SGVscGVyKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByb3h5SGVscGVyID0gY3JlYXRlUHJveHlIZWxwZXIoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBwcm94eUhlbHBlcjsNCi0gICAgfQ0KLQ0KLSAgICAvL2Rvbid0IHVzZSB0aGUgZGVmYXVsdCBhcHByb2FjaCAoZmFjdG9yeSBmaW5kZXIpIC0gUHJveHlIZWxwZXIgaXMgY2FsbGVkIHRvbyBvZnRlbi4uLg0KLSAgICBwcml2YXRlIHN0YXRpYyBQcm94eUhlbHBlciBjcmVhdGVQcm94eUhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjdXN0b21Qcm94eUhlbHBlckNsYXNzTmFtZSA9IFdlYlhtbFBhcmFtZXRlci5DVVNUT01fUFJPWFlfSEVMUEVSOw0KLQ0KLSAgICAgICAgUHJveHlIZWxwZXIgcmVzdWx0ID0gbnVsbDsNCi0gICAgICAgIGlmKGN1c3RvbVByb3h5SGVscGVyQ2xhc3NOYW1lICE9IG51bGwgJiYgISIiLmVxdWFscyhjdXN0b21Qcm94eUhlbHBlckNsYXNzTmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gKFByb3h5SGVscGVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjdXN0b21Qcm94eUhlbHBlckNsYXNzTmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBuZXcgRGVmYXVsdFByb3h5SGVscGVyKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1JlZmxlY3Rpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTA2MmJmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUmVmbGVjdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBSZWZsZWN0aW9uVXRpbHMKLXsKLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCB0cnlUb0dldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ5VG9HZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIHRyeVRvR2V0TWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0TWV0aG9kTmFtZSwgQ2xhc3MuLi4gcGFyYW1ldGVyVHlwZXMpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldE1ldGhvZCh0YXJnZXRDbGFzcywgdGFyZ2V0TWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUpCi0gICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUsIENsYXNzLi4uIHBhcmFtZXRlclR5cGVzKQotICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSB0YXJnZXRDbGFzczsKLSAgICAgICAgTWV0aG9kIHRhcmdldE1ldGhvZCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAoIU9iamVjdC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0YXJnZXRNZXRob2QgPSBjdXJyZW50Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QodGFyZ2V0TWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50SW50ZXJmYWNlIDogdGFyZ2V0Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRJbnRlcmZhY2U7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudENsYXNzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gY3VycmVudENsYXNzLmdldERlY2xhcmVkTWV0aG9kKHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudENsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0TWV0aG9kOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbigidGhlcmUgaXMgbm8gbWV0aG9kIHdpdGggdGhlIG5hbWUgJyIgKyB0YXJnZXRNZXRob2ROYW1lICsgIiciICsKLSAgICAgICAgICAgICAgICAiIGNsYXNzOiAiICsgdGFyZ2V0Q2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvSW52b2tlTWV0aG9kKHRhcmdldCwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvSW52b2tlTWV0aG9kT2ZDbGFzcyh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kT2ZDbGFzcyh0YXJnZXQsIG1ldGhvZCwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldC5uZXdJbnN0YW5jZSgpLCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kLCBPYmplY3QuLi4gYXJncykKLSAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0Lm5ld0luc3RhbmNlKCksIG1ldGhvZCwgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QpCi0gICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldCwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgewotICAgICAgICBtZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2UodGFyZ2V0LCBhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKE9iamVjdCBiYXNlT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlDaGFpbikKLSAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHByb3BlcnR5Q2hhaW4sICIuIik7Ci0KLSAgICAgICAgT2JqZWN0IGN1cnJlbnRCYXNlID0gYmFzZU9iamVjdDsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnRQcm9wZXJ0eTsKLSAgICAgICAgTWV0aG9kIGN1cnJlbnRNZXRob2Q7Ci0KLSAgICAgICAgd2hpbGUodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudFByb3BlcnR5ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCi0gICAgICAgICAgICAvL2lnbm9yZSB0aGUgbGFzdCBwcm9wZXJ0eQotICAgICAgICAgICAgaWYoIXRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vbm8gaXMgLSBpdCdzIG9ubHkgcG9zc2libGUgYXQgcHJvcGVydGllcyBub3QgYXQgYmVhbiBsZXZlbAotICAgICAgICAgICAgY3VycmVudE1ldGhvZCA9IHRyeVRvR2V0TWV0aG9kKFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudEJhc2UuZ2V0Q2xhc3MoKSksCi0gICAgICAgICAgICAgICAgImdldCIgKyBjdXJyZW50UHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50UHJvcGVydHkuc3Vic3RyaW5nKDEsIGN1cnJlbnRQcm9wZXJ0eS5sZW5ndGgoKSkpOwotICAgICAgICAgICAgY3VycmVudEJhc2UgPSB0cnlUb0ludm9rZU1ldGhvZChjdXJyZW50QmFzZSwgY3VycmVudE1ldGhvZCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY3VycmVudEJhc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9XZWJYbWxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjA3NjljLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvV2ViWG1sVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuRXh0VmFsSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgV2ViWG1sVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEluaXRQYXJhbWV0ZXIoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEluaXRQYXJhbWV0ZXIoRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCwga2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZSA9IG5hbWU7DQotICAgICAgICBpZihwcmVmaXggIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwYXJhbWV0ZXJOYW1lID0gcHJlZml4ICsgIi4iICsgbmFtZTsNCi0gICAgICAgIH0NCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRJbml0UGFyYW1ldGVyKHBhcmFtZXRlck5hbWUpOw0KLSAgICAgICAgcmV0dXJuICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlLnJlcGxhY2UoIiAiLCAiIikudHJpbSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9jb3JlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMDkyZmIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2NvcmUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlIE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlIE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIENvcmUgTW9kdWxlIHByb3ZpZGVzIGFuIGV4dGVuc2libGUgdmFsaWRhdGlvbiBwbGF0Zm9ybSB0byBpbXBsZW1lbnQgdmFsaWRhdGlvbiBiYXNlZCBvbiBtZXRhLWRhdGEuDQotICAgIEJhc2VkIG9uIHRoaXMgbW9kdWxlIGl0IGlzIHBvc3NpYmxlIHRvIGltcGxlbWVudCB2YWxpZGF0aW9uIG1vZHVsZXMuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLnggYW5kIEpTRiAyLnguIEFsbCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9wb20ueG1sIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNTY2ZmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEV4YW1wbGVzIEFzc2VtYmx5PC9uYW1lPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1leGFtcGxlcy1hc3NlbWJseTEyPC9hcnRpZmFjdElkPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRlcGVuZGVuY3ktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktd2FyPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fd29ybGQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+CQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWZlYXR1cmUtc2V0XzAxPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS93YXI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1zcmM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1oZWxsb193b3JsZDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPmphdmEtc291cmNlPC90eXBlPiAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPmphdmEtc291cmNlPC90eXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zcmM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tIEVYRUNVVEUgbXZuIHBhY2thZ2UgdG8gZ2VuZXJhdGUgYXNzZW1ibHkgZmlsZXMgLS0+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X3NyYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXNzZW1ibHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPiAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5teWZhY2VzLWV4dHZhbC1leGFtcGxlcy0ke3Byb2plY3QudmVyc2lvbn0tc3JjPC9maW5hbE5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9iaW48L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmFzc2VtYmx5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLQkgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotCSAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4gICAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvZGVwLnhtbDwvZGVzY3JpcHRvcj4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotCSAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwtZXhhbXBsZXMtJHtwcm9qZWN0LnZlcnNpb259PC9maW5hbE5hbWU+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLQkgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS93b3JrPC93b3JrRGlyZWN0b3J5PgotCSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQkgICAgCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD53YWdvbi1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxpZD5teWZhY2VzLW5pZ2h0bHktYnVpbGRzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9taW5vdGF1ci5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9idWlsZHMvbXlmYWNlcy9uaWdodGx5PC91cmw+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9vdXQ8L2lucHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotCi0gICAgICAgIDwvcGx1Z2lucz4KLQotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXAueG1sIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZjdiODEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08YXNzZW1ibHk+Ci0gIDxpZD5iaW48L2lkPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4JCi0gIDxmaWxlU2V0cz4gICAgCi0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC93YXI8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPioud2FyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+ICAgICAKLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvZGVwc3JjLnhtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTcwY2NjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8aWQ+c3JjPC9pZD4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+CQotICA8ZmlsZVNldHM+ICAgIAotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvc3JjPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLmphcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPioudHh0PC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNWIzYTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGYzNjNhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IKLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvcG9tLnhtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTQxNGNjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBleGFtcGxlcyBmZWF0dXJlLXNldCAwMTwvbmFtZT4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmZhY2VsZXRzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzZi1mYWNlbGV0czwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMTQ8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDwhLS0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgLS0+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudG9tYWhhd2s8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dG9tYWhhd2s8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjY8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jdXN0b20vdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDAxZGY3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jdXN0b20vdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLSMgdGhpcyBtZXNzYWdlIGJ1bmRsZSBpcyBwaWNrZWQgdXAgdmlhIGNvbnZlbnRpb24NCi1yZXBlYXRlZF9wYXNzd29yZF9yZXF1aXJlZD1wbGVhc2UgcmV0eXBlIHRoZSBwYXNzd29yZA0KLXJlcGVhdGVkX3Bhc3N3b3JkX3JlcXVpcmVkX2RldGFpbD1wbGVhc2UgcmV0eXBlIHRoZSBwYXNzd29yZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2RvbWFpbi9QZXJzb24uamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2RvbWFpbi9QZXJzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI1MTFkZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9kb21haW4vUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJc1R5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLk5vdEVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlRlbXBvcmFsOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbFR5cGU7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLXB1YmxpYyBjbGFzcyBQZXJzb24NCi17DQotICAgIEBMZW5ndGgobWluaW11bSA9IDIpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMjApDQotICAgIEBOb3RFcXVhbHMoImxhc3ROYW1lIikNCi0gICAgQFBhdHRlcm4oIltBLVpdW2Etel0rIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOw0KLQ0KLSAgICBAUmVxdWlyZWQocGFyYW1ldGVycyA9IERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykNCi0gICAgQExlbmd0aChtaW5pbXVtID0gMiwgcGFyYW1ldGVycyA9IERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcykNCi0gICAgQENvbHVtbihsZW5ndGggPSAyMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7DQotDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwKQ0KLSAgICBwcml2YXRlIFN0cmluZyByb2xlID0gInVzZXIiOw0KLQ0KLSAgICBARGF0ZUlzKHR5cGUgPSBEYXRlSXNUeXBlLmJlZm9yZSwgdmFsdWVPZiA9ICJmaW5hbEV4YW0iKQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIEBUZW1wb3JhbChUZW1wb3JhbFR5cGUuREFURSkNCi0gICAgcHJpdmF0ZSBEYXRlIGJpcnRoZGF5Ow0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIEBUZW1wb3JhbChUZW1wb3JhbFR5cGUuREFURSkNCi0gICAgcHJpdmF0ZSBEYXRlIGZpbmFsRXhhbTsNCi0NCi0gICAgQExlbmd0aChtaW5pbXVtID0gMikNCi0gICAgQENvbHVtbihudWxsYWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmlja05hbWU7DQotDQotICAgIEBMZW5ndGgobWluaW11bSA9IDYpDQotICAgIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gNjApDQotICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOw0KLQ0KLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpDQotICAgIHByaXZhdGUgaW50IG51bWJlck9mU2libGluZ3M7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByb2xlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFJvbGUoU3RyaW5nIHJvbGUpDQotICAgIHsNCi0gICAgICAgIHRoaXMucm9sZSA9IHJvbGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0QmlydGhkYXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmlydGhkYXk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0QmlydGhkYXkoRGF0ZSBiaXJ0aGRheSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5iaXJ0aGRheSA9IGJpcnRoZGF5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldEZpbmFsRXhhbSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmaW5hbEV4YW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RmluYWxFeGFtKERhdGUgZmluYWxFeGFtKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpbmFsRXhhbSA9IGZpbmFsRXhhbTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5pY2tOYW1lKFN0cmluZyBuaWNrTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uaWNrTmFtZSA9IG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNpYmxpbmdzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG51bWJlck9mU2libGluZ3M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyT2ZTaWJsaW5ncyhpbnQgbnVtYmVyT2ZTaWJsaW5ncykNCi0gICAgew0KLSAgICAgICAgdGhpcy5udW1iZXJPZlNpYmxpbmdzID0gbnVtYmVyT2ZTaWJsaW5nczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI3NDQyMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmd1aS5iZWFuczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluLlBlcnNvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5Ob3RFcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTG9uZ1JhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmN1c3RvbS5lbWFpbHZhbGlkYXRvci5FbWFpbFZhbGlkYXRvcjsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uUGFnZQ0KLXsNCi0NCi0gICAgLy90aGUgb2xkIHBhc3N3b3JkIG9mIHRoZSBwZXJzb24gaXNuJ3QgdXNlZCB3aXRoaW4gdGhlIHBhZ2UNCi0gICAgLy8tPiB2YWxpZGF0ZSB3aXRoIHZhbHVlIG9mIHRoZSBtb2RlbA0KLSAgICBAU2tpcFZhbGlkYXRpb24oIiN7cGVyc29uLnJvbGUgZXEgJ2FkbWluJ30iKQ0KLSAgICBAUmVxdWlyZWQNCi0gICAgQEVxdWFscygicGVyc29uLnBhc3N3b3JkIikNCi0gICAgQE5vdEVxdWFscygicGFzc3dvcmQiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBvbGRQYXNzd29yZDsNCi0NCi0gICAgQEVxdWFscygicGFzc3dvcmRSZXBlYXRlZCIpDQotICAgIC8vY29tYmluZSBndWkgcmVsYXRlZCBhbm5vdGF0aW9ucyB3aXRoIHRoZSBhbm5vYXRpb25zIG9mIHRoZSBkb21haW4gbW9kZWwNCi0gICAgQEpvaW5WYWxpZGF0aW9uKHZhbHVlID0gIiN7cmVnaXN0cmF0aW9uUGFnZS5wZXJzb24ucGFzc3dvcmR9IikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7DQotDQotICAgIEBSZXF1aXJlZCh2YWxpZGF0aW9uRXJyb3JNc2dLZXkgPSAicmVwZWF0ZWRfcGFzc3dvcmRfcmVxdWlyZWQiLA0KLSAgICAgICAgICAgIHBhcmFtZXRlcnMgPSB7RGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLCBWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzfSkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmRSZXBlYXRlZDsNCi0NCi0gICAgLy91c2UgI3tyZWdpc3RyYXRpb25QYWdlLnBlcnNvbi5uaWNrTmFtZX0sICN7cGVyc29uLm5pY2tOYW1lfQ0KLSAgICAvL3VzZSByZWdpc3RyYXRpb25QYWdlIHRvIGRpc3BsYXkgdGhlIHNlY29uZCBlcnJvciBtZXNzYWdlIGF0IG9sZCBuaWNrbmFtZQ0KLSAgICAvL29yIGxvY2FsIHByb3BlcnR5IGNoYWluaW5nICh0byBhdm9pZCB0aGUgdXNhZ2Ugb2YgdGhlIGJlYW4gbmFtZSkgLSBsaWtlOg0KLSAgICBAU2tpcFZhbGlkYXRpb24oIiN7cGVyc29uLnJvbGUgZXEgJ2FkbWluJ30iKQ0KLSAgICBATm90RXF1YWxzKCJwZXJzb24ubmlja05hbWUiKQ0KLSAgICBASm9pblZhbGlkYXRpb24oInBlcnNvbi5uaWNrTmFtZSIpDQotICAgIHByaXZhdGUgU3RyaW5nIG5ld05pY2tOYW1lOw0KLQ0KLSAgICBwcml2YXRlIFBlcnNvbiBwZXJzb247DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZmluaXNoKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0UGFzc3dvcmQodGhpcy5wYXNzd29yZCk7DQotICAgICAgICByZXR1cm4gImhvbWUiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgdXBkYXRlTmlja05hbWUoKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXROaWNrTmFtZSh0aGlzLm5ld05pY2tOYW1lKTsNCi0gICAgICAgIHJldHVybiAiaG9tZSI7DQotICAgIH0NCi0NCi0gICAgLy9qdXN0IGEgcXVpY2sgaWxsdXN0cmF0aW9uIG9mIHNraXBWYWxpZGF0aW9uDQotICAgIHB1YmxpYyBTdHJpbmcgc3dpdGNoTW9kZSgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50Um9sZSA9IHRoaXMucGVyc29uLmdldFJvbGUoKTsNCi0NCi0gICAgICAgIGlmKGN1cnJlbnRSb2xlLmVxdWFscygiYWRtaW4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnBlcnNvbi5zZXRSb2xlKCJ1c2VyIik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5wZXJzb24uc2V0Um9sZSgiYWRtaW4iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAiIjsNCi0gICAgfQ0KLQ0KLSAgICBASm9pblZhbGlkYXRpb24oIm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb246ZW1haWwiKQ0KLSAgICBAVmFsaWRhdG9yKEVtYWlsVmFsaWRhdG9yLmNsYXNzKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uLmdldEVtYWlsKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBlcnNvbi5zZXRFbWFpbChlbWFpbCk7DQotICAgIH0NCi0NCi0gICAgQEpvaW5WYWxpZGF0aW9uKCIje3BlcnNvbi5udW1iZXJPZlNpYmxpbmdzfSIpDQotICAgIEBMb25nUmFuZ2UobWF4aW11bSA9IDIwKQ0KLSAgICBwdWJsaWMgaW50IGdldE51bWJlck9mU2libGluZ3MoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5wZXJzb24uZ2V0TnVtYmVyT2ZTaWJsaW5ncygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlck9mU2libGluZ3MoaW50IG51bWJlck9mU2libGluZ3MpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldE51bWJlck9mU2libGluZ3MobnVtYmVyT2ZTaWJsaW5ncyk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9sZFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG9sZFBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE9sZFBhc3N3b3JkKFN0cmluZyBvbGRQYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5vbGRQYXNzd29yZCA9IG9sZFBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZFJlcGVhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkUmVwZWF0ZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRSZXBlYXRlZChTdHJpbmcgcGFzc3dvcmRSZXBlYXRlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZFJlcGVhdGVkID0gcGFzc3dvcmRSZXBlYXRlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwZXJzb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbiBwZXJzb24pDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uID0gcGVyc29uOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmV3Tmlja05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3Tmlja05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TmV3Tmlja05hbWUoU3RyaW5nIG5ld05pY2tOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm5ld05pY2tOYW1lID0gbmV3Tmlja05hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0IGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MThkNjYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCIKLSAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4KLSAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgIDwhLS0gdHJpbmlkYWQgLS0+Ci0gICAgICAgIDxkZWZhdWx0LXJlbmRlci1raXQtaWQ+Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29yZQotICAgICAgICA8L2RlZmF1bHQtcmVuZGVyLWtpdC1pZD4KLQotICAgIDwvYXBwbGljYXRpb24+Ci0KLSAgICA8bWFuYWdlZC1iZWFuPgotICAgICAgICA8bWFuYWdlZC1iZWFuLW5hbWU+cmVnaXN0cmF0aW9uUGFnZTwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZ3VpLmJlYW5zLlJlZ2lzdHJhdGlvblBhZ2U8L21hbmFnZWQtYmVhbi1jbGFzcz4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0KLSAgICAgICAgPG1hbmFnZWQtcHJvcGVydHk+Ci0gICAgICAgICAgICA8cHJvcGVydHktbmFtZT5wZXJzb248L3Byb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8dmFsdWU+I3twZXJzb259PC92YWx1ZT4KLSAgICAgICAgPC9tYW5hZ2VkLXByb3BlcnR5PgotICAgIDwvbWFuYWdlZC1iZWFuPgotCi0gICAgPG1hbmFnZWQtYmVhbj4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1uYW1lPnBlcnNvbjwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZG9tYWluLlBlcnNvbjwvbWFuYWdlZC1iZWFuLWNsYXNzPgotICAgICAgICA8bWFuYWdlZC1iZWFuLXNjb3BlPnNlc3Npb248L21hbmFnZWQtYmVhbi1zY29wZT4KLSAgICA8L21hbmFnZWQtYmVhbj4KLQotICAgIDxuYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgICAgIDxmcm9tLXZpZXctaWQ+L3BhZ2VzL2hvbWUueGh0bWw8L2Zyb20tdmlldy1pZD4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+YWRkVXNlcjwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmNoYW5nZU5pY2tOYW1lPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+Y2hhbmdlUGFzc3dvcmQ8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9jaGFuZ2VfcGFzc3dvcmQueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgIDwvbmF2aWdhdGlvbi1ydWxlPgotICAgIDxuYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgICAgIDxmcm9tLXZpZXctaWQ+KjwvZnJvbS12aWV3LWlkPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5ob21lPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvaG9tZS54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgPC9uYXZpZ2F0aW9uLXJ1bGU+Ci08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzOTM2Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgZmFjZWxldC10YWdsaWIgUFVCTElDCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRmFjZWxldCBUYWdsaWIgMS4wLy9FTiIKLSAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2ZhY2VsZXQtdGFnbGliXzFfMC5kdGQiPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlbGV0LXRhZ2xpYj4KLSAgICA8bmFtZXNwYWNlPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0dmFsL2RlbW8vY29tcG9uZW50czwvbmFtZXNwYWNlPgotCi0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPnVzZXJGb3JtPC90YWctbmFtZT4KLSAgICAgICAgPHNvdXJjZT4KLSAgICAgICAgICAgIC4uL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sCi0gICAgICAgIDwvc291cmNlPgotICAgIDwvdGFnPgotCi08L2ZhY2VsZXQtdGFnbGliPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YzAxYWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLSAgICAgICAgIHZlcnNpb249IjIuNCI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+TXlQcm9qZWN0IHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkRFRkFVTFRfU1VGRklYPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+LnhodG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+ZmFjZWxldHMuTElCUkFSSUVTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L1dFQi1JTkYvbWFpbi50YWdsaWIueG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkVOQUJMRV9MSUdIVFdFSUdIVF9ESUFMT0dTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5ESVNBQkxFX0NPTlRFTlRfQ09NUFJFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkFMVEVSTkFURV9WSUVXX0hBTkRMRVI8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jb20uc3VuLmZhY2VsZXRzLkZhY2VsZXRWaWV3SGFuZGxlcjwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5VU0VfQVBQTElDQVRJT05fVklFV19DQUNIRTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkNIQU5HRV9QRVJTSVNURU5DRTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnNlc3Npb248L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+U3RhdGUgc2F2aW5nIG1ldGhvZDogImNsaWVudCIgb3IgInNlcnZlciIgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIFNlZSBKU0YgU3BlY2lmaWNhdGlvbiAyLjUuMwotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIGFtb3VudCAoZGVmYXVsdCA9IDIwKSBvZiB0aGUgbGF0ZXN0IHZpZXdzIGFyZSBzdG9yZWQgaW4gc2Vzc2lvbi4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLk5VTUJFUl9PRl9WSUVXU19JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpIGFuZCBpZgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OIGlzIHRydWUgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzZXJpYWxpemVkIHN0YXRlIHdpbGwgYmUgY29tcHJlc3NlZCBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBjb21wcmVzc2VkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcGFyYW1ldGVyIHRlbGxzIE15RmFjZXMgaWYgamF2YXNjcmlwdCBjb2RlIHNob3VsZCBiZSBhbGxvd2VkIGluIHRoZQotICAgICAgICAgICAgcmVuZGVyZWQgSFRNTCBvdXRwdXQuCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUKLSAgICAgICAgICAgIHRoYXQgc3VibWl0cyB0aGUgY29ycmVzcG9uZGluZyBmb3JtLgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBub3QgYWxsb3dlZCwgdGhlIHN0YXRlIHNhdmluZyBpbmZvIGFuZCBuZXN0ZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLgotICAgICAgICAgICAgaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90Ci0gICAgICAgICAgICBpbmZsdWVuY2UgdGhlIEhUTUwgY29kZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUFJFVFRZX0hUTUw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCBhIGphdmFzY3JpcHQgZnVuY3Rpb24gd2lsbCBiZSByZW5kZXJlZCB0aGF0IGlzIGFibGUgdG8gcmVzdG9yZSB0aGUKLSAgICAgICAgICAgIGZvcm1lciB2ZXJ0aWNhbCBzY3JvbGwgb24gZXZlcnkgcmVxdWVzdC4gQ29udmVuaWVudCBmZWF0dXJlIGlmIHlvdSBoYXZlIHBhZ2VzCi0gICAgICAgICAgICB3aXRoIGxvbmcgbGlzdHMgYW5kIHlvdSBkbyBub3Qgd2FudCB0aGUgYnJvd3NlciBwYWdlIHRvIGFsd2F5cyBqdW1wIHRvIHRoZSB0b3AKLSAgICAgICAgICAgIGlmIHlvdSB0cmlnZ2VyIGEgbGluayBvciBidXR0b24gYWN0aW9uIHRoYXQgc3RheXMgb24gdGhlIHNhbWUgcGFnZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJmYWxzZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFVVE9fU0NST0xMPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Vc2VkIGZvciBlbmNyeXB0aW5nIHZpZXcgc3RhdGUuIE9ubHkgcmVsZXZhbnQgZm9yIGNsaWVudCBzaWRlCi0gICAgICAgICAgICBzdGF0ZSBzYXZpbmcuIFNlZSBNeUZhY2VzIHdpa2kvd2ViIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRUNSRVQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWYWxpZGF0ZSBtYW5hZ2VkIGJlYW5zLCBuYXZpZ2F0aW9uIHJ1bGVzIGFuZCBlbnN1cmUgdGhhdCBmb3JtcyBhcmUgbm90IG5lc3RlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlZBTElEQVRFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPCEtLSBMaXN0ZW5lciwgdG8gYWxsb3cgSmV0dHkgc2VydmluZyBNeUZhY2VzIGFwcHMgLS0+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLndlYmFwcC5TdGFydHVwU2VydmxldENvbnRleHRMaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+Ci0gICAgPC9saXN0ZW5lcj4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCAtLT4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICAgIDwvc2VydmxldD4KLQotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPnJlc291cmNlczwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlJlc291cmNlU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8ZmlsdGVyPgotICAgICAgICA8ZmlsdGVyLW5hbWU+dHJpbmlkYWQ8L2ZpbHRlci1uYW1lPgotICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC53ZWJhcHAuVHJpbmlkYWRGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KLSAgICA8L2ZpbHRlcj4KLQotICAgIDxmaWx0ZXItbWFwcGluZz4KLSAgICAgICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgPC9maWx0ZXItbWFwcGluZz4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCBNYXBwaW5ncyAtLT4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9mYWNlcy8qPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+cmVzb3VyY2VzPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4vYWRmLyo8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPCEtLSBXZWxjb21lIGZpbGVzIC0tPgotICAgIDx3ZWxjb21lLWZpbGUtbGlzdD4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+Ci0gICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KLQotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYmM5MWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyIKLSAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiCi0gICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIgotICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiCi0gICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+Ci0KLTx1aTpjb21wb3NpdGlvbj4KLSAgICA8dHI6cGFuZWxGb3JtTGF5b3V0PgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im5pY2sgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb25bICduaWNrTmFtZScgXX0iLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0iZS1tYWlsIiB2YWx1ZT0iI3tiZWFuLmVtYWlsfSIvPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9ImZpcnN0IG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uLmZpcnN0TmFtZX0iLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibGFzdCBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5sYXN0TmFtZX0iLz4KLSAgICAgICAgPCEtLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJsYXN0IG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uLmxhc3ROYW1lfSIgcmVxdWlyZWRNZXNzYWdlRGV0YWlsPSJ7MH0gaXMgcmVxdWlyZWQiLz4KLSAgICAgICAgLS0+Ci0gICAgICAgIDx0cjppbnB1dERhdGUgbGFiZWw9ImJpcnRoZGF5IiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5iaXJ0aGRheX0iPgotICAgICAgICAgICAgPHRyOmNvbnZlcnREYXRlVGltZSB0eXBlPSJkYXRlIiBwYXR0ZXJuPSJkZC5NTS55eXl5Ii8+Ci0gICAgICAgIDwvdHI6aW5wdXREYXRlPgotICAgICAgICA8dHI6aW5wdXREYXRlIGxhYmVsPSJmaW5hbCBleGFtIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5maW5hbEV4YW19Ij4KLSAgICAgICAgICAgIDx0cjpjb252ZXJ0RGF0ZVRpbWUgdHlwZT0iZGF0ZSIgcGF0dGVybj0iZGQuTU0ueXl5eSIvPgotICAgICAgICA8L3RyOmlucHV0RGF0ZT4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJudW1iZXIgb2Ygc2libGluZ3MiIHZhbHVlPSIje2JlYW4ubnVtYmVyT2ZTaWJsaW5nc30iLz4KLQotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJwYXNzd29yZCIgdmFsdWU9IiN7YmVhbi5wYXNzd29yZH0iIHNlY3JldD0idHJ1ZSIvPgotICAgICAgICA8dHI6aW5wdXRUZXh0IGxhYmVsPSJyZS1lbnRlciBwYXNzd29yZCIgdmFsdWU9IiN7YmVhbi5wYXNzd29yZFJlcGVhdGVkfSIgc2VjcmV0PSJ0cnVlIi8+Ci0KLSAgICA8L3RyOnBhbmVsRm9ybUxheW91dD4KLTwvdWk6Y29tcG9zaXRpb24+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1Y2QxNDguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotICAgICAgICANCi08aHRtbD4NCi0NCi08aGVhZD4NCi0gICAgPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDsgVVJMPWZhY2VzL3BhZ2VzL2hvbWUueGh0bWwiPg0KLTwvaGVhZD4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9sYXlvdXQvdGVtcGxhdGUueGh0bWwgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBjMWVhOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTx0cjpkb2N1bWVudA0KLSAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIg0KLSAgICAgICAgeG1sbnM6Yz0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3RsL2NvcmUiPg0KLSAgICA8ZjpmYWNldCBuYW1lPSJtZXRhQ29udGFpbmVyIj4NCi0gICAgICAgIDx0aXRsZT5zZXYtZW4gZmVhdHVyZS1zZXQgZGVtbyAwMTwvdGl0bGU+DQotICAgIDwvZjpmYWNldD4NCi0NCi0gICAgPHRyaDpib2R5Pg0KLQ0KLSAgICAgICAgPCEtLSBvcmlnaW5hbCAtLT4NCi0gICAgICAgIDxkaXYgaWQ9IndyYXAiPg0KLQ0KLSAgICAgICAgICAgIDx0cjpmb3JtIGlkPSJmb3JtIiBkZWZhdWx0Q29tbWFuZD0iZGVmYXVsdEJ1dHRvbiI+DQotICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1haW4iPg0KLSAgICAgICAgICAgICAgICAgICAgPHVpOmluc2VydCBuYW1lPSJjb250ZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ1bmRlcl9jb25zdHJ1Y3Rpb24iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+IXNpdGUgdW5kZXIgY29uc3RydWN0aW9uITwvaDI+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBjb250ZW50IG9mIHRoaXMgc2l0ZSBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSBtb21lbnQuPC9wPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC91aTppbnNlcnQ+DQotICAgICAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICAgIDwvdHI6Zm9ybT4NCi0gICAgICAgICAgICA8dHI6bWVzc2FnZXMgZ2xvYmFsT25seT0idHJ1ZSIvPg0KLQ0KLSAgICAgICAgPC9kaXY+DQotICAgIDwvdHJoOmJvZHk+DQotDQotDQotPC90cjpkb2N1bWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9uaWNrTmFtZS54aHRtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODkzZmFlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX25pY2tOYW1lLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDx0cjpwYW5lbEZvcm1MYXlvdXQ+DQotDQotICAgICAgICAgICAgPHVpOnJlbW92ZT4NCi0gICAgICAgICAgICAgICAganVzdCBmb3IgdGhlIGRlbW8gd2UgYXJlIHVzaW5nIHR3byBpbnB1dCBjb21wb25lbnRzDQotICAgICAgICAgICAgPC91aTpyZW1vdmU+DQotICAgICAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ib2xkIG5pY2sgbmFtZSIgcmVhZE9ubHk9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLm5pY2tOYW1lfSIvPg0KLQ0KLSAgICAgICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im5pY2sgbmFtZSIgdmFsdWU9IiN7cmVnaXN0cmF0aW9uUGFnZS5uZXdOaWNrTmFtZX0iLz4NCi0NCi0gICAgICAgIDwvdHI6cGFuZWxGb3JtTGF5b3V0Pg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UudXBkYXRlTmlja05hbWV9Ii8+DQotDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2NoYW5nZV9wYXNzd29yZC54aHRtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTA5NzVhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvY2hhbmdlX3Bhc3N3b3JkLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIj4NCi0NCi0gICAgPHVpOmRlZmluZSBuYW1lPSJjb250ZW50Ij4NCi0NCi0gICAgICAgIDx0YWJsZT4NCi0gICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgIDx0ZD48dHI6b3V0cHV0TGFiZWwgdmFsdWU9Im9sZCBwYXNzd29yZCIgZm9yPSJvbGRfcGFzc3dvcmQiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOmlucHV0VGV4dCBpZD0ib2xkX3Bhc3N3b3JkIiBzaW1wbGU9InRydWUiIHZhbHVlPSIje3JlZ2lzdHJhdGlvblBhZ2Uub2xkUGFzc3dvcmR9IiBzZWNyZXQ9InRydWUiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm1lc3NhZ2UgZm9yPSJvbGRfcGFzc3dvcmQiLz48L3RkPg0KLSAgICAgICAgICAgIDwvdHI+DQotDQotICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm91dHB1dExhYmVsIHZhbHVlPSJuZXcgcGFzc3dvcmQiIGZvcj0ibmV3X3Bhc3N3b3JkIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjppbnB1dFRleHQgaWQ9Im5ld19wYXNzd29yZCIgc2ltcGxlPSJ0cnVlIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjptZXNzYWdlIGZvcj0ibmV3X3Bhc3N3b3JkIi8+PC90ZD4NCi0gICAgICAgICAgICA8L3RyPg0KLQ0KLSAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjpvdXRwdXRMYWJlbCB2YWx1ZT0icmUtZW50ZXIgcGFzc3dvcmQiIGZvcj0icmVlbnRlcmVkIi8+PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRkPjx0cjppbnB1dFRleHQgaWQ9InJlZW50ZXJlZCIgc2ltcGxlPSJ0cnVlIiB2YWx1ZT0iI3tyZWdpc3RyYXRpb25QYWdlLnBhc3N3b3JkUmVwZWF0ZWR9IiBzZWNyZXQ9InRydWUiLz48L3RkPg0KLSAgICAgICAgICAgICAgICA8dGQ+PHRyOm1lc3NhZ2UgZm9yPSJyZWVudGVyZWQiLz48L3RkPg0KLSAgICAgICAgICAgIDwvdHI+DQotDQotICAgICAgICA8L3RhYmxlPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UuZmluaXNofSIvPg0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9ob21lLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTdlYmQ5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMS9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJhZGQgdXNlciIgYWN0aW9uPSJhZGRVc2VyIi8+PGJyLz4NCi0gICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIHRleHQ9ImNoYW5nZSBuaWNrIG5hbWUiIGFjdGlvbj0iY2hhbmdlTmlja05hbWUiLz48YnIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0iY2hhbmdlIHBhc3N3b3JkIiBhY3Rpb249ImNoYW5nZVBhc3N3b3JkIi8+PGJyLz4NCi0gICAgICAgIDx0cjpjb21tYW5kTGluayB0ZXh0PSJtb2RlOiAje3JlZ2lzdHJhdGlvblBhZ2UucGVyc29uLnJvbGV9Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2Uuc3dpdGNoTW9kZX0iIGltbWVkaWF0ZT0idHJ1ZSIvPg0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAxL3NyYy9tYWluL3dlYmFwcC9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWwgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmNmIwNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDEvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQw0KLSAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLQ0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyI+DQotDQotPGJvZHk+DQotDQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIuLi9sYXlvdXQvdGVtcGxhdGUueGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgICAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6Yz0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHR2YWwvZGVtby9jb21wb25lbnRzIg0KLSAgICAgICAgPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgPGM6dXNlckZvcm0gYmVhbj0iI3tyZWdpc3RyYXRpb25QYWdlfSIvPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0ic2F2ZSIgYWN0aW9uPSIje3JlZ2lzdHJhdGlvblBhZ2UuZmluaXNofSIvPg0KLQ0KLSAgICA8L3VpOmRlZmluZT4NCi08L3VpOmNvbXBvc2l0aW9uPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3BvbS54bWwgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMwODE1My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtZmVhdHVyZS1zZXRfMDI8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgZmVhdHVyZS1zZXQgMDI8L25hbWU+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGliZXJuYXRlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmhpYmVybmF0ZS12YWxpZGF0b3I8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+NC4wLjAuR0E8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuNC4yPC92ZXJzaW9uPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS40LjI8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmZhY2VsZXRzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzZi1mYWNlbGV0czwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMTQ8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpbmlkYWQtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDwhLS0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgLS0+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2NvbnN0cmFpbnRzL0JpcnRoZGF5LmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9jb25zdHJhaW50cy9CaXJ0aGRheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWI0ZTcyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2NvbnN0cmFpbnRzL0JpcnRoZGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5jb25zdHJhaW50czsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlBhc3Q7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuQU5OT1RBVElPTl9UWVBFOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotDQotQFBhc3QNCi1ATm90TnVsbA0KLQ0KLUBDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0ge30pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBUYXJnZXQoe01FVEhPRCwgRklFTEQsIEFOTk9UQVRJT05fVFlQRX0pDQotcHVibGljIEBpbnRlcmZhY2UgQmlydGhkYXkNCi17DQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAibm8gdmFsaWQgYmlydGhkYXkiOw0KLQ0KLSAgICBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQge307DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHt9Ow0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9jb25zdHJhaW50cy9OYW1lLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9jb25zdHJhaW50cy9OYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MjAwZjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vY29uc3RyYWludHMvTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uY29uc3RyYWludHM7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5PdmVycmlkZXNBdHRyaWJ1dGU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5BTk5PVEFUSU9OX1RZUEU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi0NCi1ATm90TnVsbA0KLUBTaXplKG1pbiA9IDIpDQotDQotQENvbnN0cmFpbnQodmFsaWRhdGVkQnkgPSB7fSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgQU5OT1RBVElPTl9UWVBFfSkNCi1wdWJsaWMgQGludGVyZmFjZSBOYW1lDQotew0KLSAgICBTdHJpbmcgbWVzc2FnZSgpIGRlZmF1bHQgImludmFsaWQgbmFtZSI7IC8vbm90IHVzZWQNCi0NCi0gICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9Ow0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsNCi0NCi0gICAgQE92ZXJyaWRlc0F0dHJpYnV0ZShjb25zdHJhaW50ID0gU2l6ZS5jbGFzcywgbmFtZSA9ICJtYXgiKQ0KLSAgICBpbnQgbWF4TGVuZ3RoKCkgZGVmYXVsdCAyMDsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZG9tYWluL1BlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTA3M2NlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9kZW1vL2RvbWFpbi9QZXJzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5kb21haW47DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmNvbnN0cmFpbnRzLk5hbWU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmNvbnN0cmFpbnRzLkJpcnRoZGF5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5QYXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi1wdWJsaWMgY2xhc3MgUGVyc29uDQotew0KLSAgICBATmFtZShtYXhMZW5ndGggPSAzMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOw0KLQ0KLSAgICBATmFtZShtYXhMZW5ndGggPSAzMCkNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7DQotDQotICAgIEBTaXplKG1pbiA9IDIsIG1heCA9IDEwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsNCi0NCi0gICAgQEJpcnRoZGF5DQotICAgIHByaXZhdGUgRGF0ZSBiaXJ0aGRheTsNCi0NCi0gICAgQFBhc3QNCi0gICAgcHJpdmF0ZSBEYXRlIGZpbmFsRXhhbTsNCi0NCi0gICAgQE5vdE51bGwNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmlja05hbWU7DQotDQotICAgIEBTaXplKG1pbiA9IDYsIG1heCA9IDYwKQ0KLSAgICBwcml2YXRlIFN0cmluZyBlbWFpbDsNCi0NCi0gICAgQE5vdE51bGwNCi0gICAgcHJpdmF0ZSBpbnQgbnVtYmVyT2ZTaWJsaW5nczsNCi0NCi0gICAgQFNpemUobWluID0gMiwgbWF4ID0gMTApDQotICAgIHByaXZhdGUgU3RyaW5nIHJvbGUgPSAidXNlciI7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByb2xlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFJvbGUoU3RyaW5nIHJvbGUpDQotICAgIHsNCi0gICAgICAgIHRoaXMucm9sZSA9IHJvbGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0QmlydGhkYXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmlydGhkYXk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0QmlydGhkYXkoRGF0ZSBiaXJ0aGRheSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5iaXJ0aGRheSA9IGJpcnRoZGF5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRlIGdldEZpbmFsRXhhbSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmaW5hbEV4YW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RmluYWxFeGFtKERhdGUgZmluYWxFeGFtKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpbmFsRXhhbSA9IGZpbmFsRXhhbTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5pY2tOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5pY2tOYW1lKFN0cmluZyBuaWNrTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uaWNrTmFtZSA9IG5pY2tOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZlNpYmxpbmdzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG51bWJlck9mU2libGluZ3M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyT2ZTaWJsaW5ncyhpbnQgbnVtYmVyT2ZTaWJsaW5ncykNCi0gICAgew0KLSAgICAgICAgdGhpcy5udW1iZXJPZlNpYmxpbmdzID0gbnVtYmVyT2ZTaWJsaW5nczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2RlbW8vZ3VpL2JlYW5zL1JlZ2lzdHJhdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQyMGY5NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZGVtby9ndWkvYmVhbnMvUmVnaXN0cmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmRlbW8uZ3VpLmJlYW5zOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZGVtby5kb21haW4uUGVyc29uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwucGF5bG9hZC5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvblBhZ2UNCi17DQotICAgIEBOb3ROdWxsKHBheWxvYWQgPSBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpDQotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOw0KLQ0KLSAgICBATm90TnVsbChwYXlsb2FkID0gVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcykNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmRSZXBlYXRlZDsNCi0NCi0gICAgcHJpdmF0ZSBQZXJzb24gcGVyc29uOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGZpbmlzaCgpDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uLnNldFBhc3N3b3JkKHRoaXMucGFzc3dvcmQpOw0KLSAgICAgICAgcmV0dXJuICJob21lIjsNCi0gICAgfQ0KLQ0KLSAgICBAU2l6ZShtaW4gPSA2LCBtYXggPSA2MCkNCi0gICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbi5nZXRFbWFpbCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKFN0cmluZyBlbWFpbCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0RW1haWwoZW1haWwpOw0KLSAgICB9DQotDQotICAgIEBOb3ROdWxsDQotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZTaWJsaW5ncygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbi5nZXROdW1iZXJPZlNpYmxpbmdzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyT2ZTaWJsaW5ncyhpbnQgbnVtYmVyT2ZTaWJsaW5ncykNCi0gICAgew0KLSAgICAgICAgdGhpcy5wZXJzb24uc2V0TnVtYmVyT2ZTaWJsaW5ncyhudW1iZXJPZlNpYmxpbmdzKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZFJlcGVhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBhc3N3b3JkUmVwZWF0ZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRSZXBlYXRlZChTdHJpbmcgcGFzc3dvcmRSZXBlYXRlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wYXNzd29yZFJlcGVhdGVkID0gcGFzc3dvcmRSZXBlYXRlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwZXJzb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbiBwZXJzb24pDQotICAgIHsNCi0gICAgICAgIHRoaXMucGVyc29uID0gcGVyc29uOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzE4OTNjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+Ci0gICAgPGFwcGxpY2F0aW9uPgotICAgICAgICA8IS0tIHRyaW5pZGFkIC0tPgotICAgICAgICA8ZGVmYXVsdC1yZW5kZXIta2l0LWlkPgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvcmUKLSAgICAgICAgPC9kZWZhdWx0LXJlbmRlci1raXQtaWQ+Ci0KLSAgICA8L2FwcGxpY2F0aW9uPgotCi0gICAgPG1hbmFnZWQtYmVhbj4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1uYW1lPnJlZ2lzdHJhdGlvblBhZ2U8L21hbmFnZWQtYmVhbi1uYW1lPgotICAgICAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmd1aS5iZWFucy5SZWdpc3RyYXRpb25QYWdlPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPgotCi0gICAgICAgIDxtYW5hZ2VkLXByb3BlcnR5PgotICAgICAgICAgICAgPHByb3BlcnR5LW5hbWU+cGVyc29uPC9wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPHZhbHVlPiN7cGVyc29ufTwvdmFsdWU+Ci0gICAgICAgIDwvbWFuYWdlZC1wcm9wZXJ0eT4KLSAgICA8L21hbmFnZWQtYmVhbj4KLQotICAgIDxtYW5hZ2VkLWJlYW4+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tbmFtZT5wZXJzb248L21hbmFnZWQtYmVhbi1uYW1lPgotICAgICAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5kZW1vLmRvbWFpbi5QZXJzb248L21hbmFnZWQtYmVhbi1jbGFzcz4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5zZXNzaW9uPC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0gICAgPC9tYW5hZ2VkLWJlYW4+Ci0KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8ZnJvbS12aWV3LWlkPi9wYWdlcy9ob21lLnhodG1sPC9mcm9tLXZpZXctaWQ+Ci0gICAgICAgIDxuYXZpZ2F0aW9uLWNhc2U+Ci0gICAgICAgICAgICA8ZnJvbS1vdXRjb21lPmFkZFVzZXI8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi9wYWdlcy9yZWdpc3RyYXRpb24ueGh0bWw8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgIDwvbmF2aWdhdGlvbi1ydWxlPgotICAgIDxuYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgICAgIDxmcm9tLXZpZXctaWQ+KjwvZnJvbS12aWV3LWlkPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5ob21lPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vcGFnZXMvaG9tZS54aHRtbDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgPC9uYXZpZ2F0aW9uLXJ1bGU+Ci08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL21haW4udGFnbGliLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzOTM2Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvbWFpbi50YWdsaWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgZmFjZWxldC10YWdsaWIgUFVCTElDCi0gICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRmFjZWxldCBUYWdsaWIgMS4wLy9FTiIKLSAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2ZhY2VsZXQtdGFnbGliXzFfMC5kdGQiPgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxmYWNlbGV0LXRhZ2xpYj4KLSAgICA8bmFtZXNwYWNlPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0dmFsL2RlbW8vY29tcG9uZW50czwvbmFtZXNwYWNlPgotCi0gICAgPHRhZz4KLSAgICAgICAgPHRhZy1uYW1lPnVzZXJGb3JtPC90YWctbmFtZT4KLSAgICAgICAgPHNvdXJjZT4KLSAgICAgICAgICAgIC4uL2NvbXBvbmVudHMvdXNlcl9mb3JtLnhodG1sCi0gICAgICAgIDwvc291cmNlPgotICAgIDwvdGFnPgotCi08L2ZhY2VsZXQtdGFnbGliPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YzAxYWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLSAgICAgICAgIHZlcnNpb249IjIuNCI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+TXlQcm9qZWN0IHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkRFRkFVTFRfU1VGRklYPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+LnhodG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+ZmFjZWxldHMuTElCUkFSSUVTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L1dFQi1JTkYvbWFpbi50YWdsaWIueG1sPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkVOQUJMRV9MSUdIVFdFSUdIVF9ESUFMT0dTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5ESVNBQkxFX0NPTlRFTlRfQ09NUFJFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkFMVEVSTkFURV9WSUVXX0hBTkRMRVI8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jb20uc3VuLmZhY2VsZXRzLkZhY2VsZXRWaWV3SGFuZGxlcjwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5VU0VfQVBQTElDQVRJT05fVklFV19DQUNIRTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkNIQU5HRV9QRVJTSVNURU5DRTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnNlc3Npb248L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+U3RhdGUgc2F2aW5nIG1ldGhvZDogImNsaWVudCIgb3IgInNlcnZlciIgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIFNlZSBKU0YgU3BlY2lmaWNhdGlvbiAyLjUuMwotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIGFtb3VudCAoZGVmYXVsdCA9IDIwKSBvZiB0aGUgbGF0ZXN0IHZpZXdzIGFyZSBzdG9yZWQgaW4gc2Vzc2lvbi4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLk5VTUJFUl9PRl9WSUVXU19JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0uCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpIGFuZCBpZgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OIGlzIHRydWUgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzZXJpYWxpemVkIHN0YXRlIHdpbGwgYmUgY29tcHJlc3NlZCBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBjb21wcmVzc2VkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQ09NUFJFU1NfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRoaXMgcGFyYW1ldGVyIHRlbGxzIE15RmFjZXMgaWYgamF2YXNjcmlwdCBjb2RlIHNob3VsZCBiZSBhbGxvd2VkIGluIHRoZQotICAgICAgICAgICAgcmVuZGVyZWQgSFRNTCBvdXRwdXQuCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIGFsbG93ZWQsIGNvbW1hbmRfbGluayBhbmNob3JzIHdpbGwgaGF2ZSBqYXZhc2NyaXB0IGNvZGUKLSAgICAgICAgICAgIHRoYXQgc3VibWl0cyB0aGUgY29ycmVzcG9uZGluZyBmb3JtLgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBub3QgYWxsb3dlZCwgdGhlIHN0YXRlIHNhdmluZyBpbmZvIGFuZCBuZXN0ZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgd2lsbCBiZSBhZGRlZCBhcyB1cmwgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLgotICAgICAgICAgICAgaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90Ci0gICAgICAgICAgICBpbmZsdWVuY2UgdGhlIEhUTUwgY29kZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUFJFVFRZX0hUTUw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCBhIGphdmFzY3JpcHQgZnVuY3Rpb24gd2lsbCBiZSByZW5kZXJlZCB0aGF0IGlzIGFibGUgdG8gcmVzdG9yZSB0aGUKLSAgICAgICAgICAgIGZvcm1lciB2ZXJ0aWNhbCBzY3JvbGwgb24gZXZlcnkgcmVxdWVzdC4gQ29udmVuaWVudCBmZWF0dXJlIGlmIHlvdSBoYXZlIHBhZ2VzCi0gICAgICAgICAgICB3aXRoIGxvbmcgbGlzdHMgYW5kIHlvdSBkbyBub3Qgd2FudCB0aGUgYnJvd3NlciBwYWdlIHRvIGFsd2F5cyBqdW1wIHRvIHRoZSB0b3AKLSAgICAgICAgICAgIGlmIHlvdSB0cmlnZ2VyIGEgbGluayBvciBidXR0b24gYWN0aW9uIHRoYXQgc3RheXMgb24gdGhlIHNhbWUgcGFnZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJmYWxzZSIKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFVVE9fU0NST0xMPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Vc2VkIGZvciBlbmNyeXB0aW5nIHZpZXcgc3RhdGUuIE9ubHkgcmVsZXZhbnQgZm9yIGNsaWVudCBzaWRlCi0gICAgICAgICAgICBzdGF0ZSBzYXZpbmcuIFNlZSBNeUZhY2VzIHdpa2kvd2ViIHNpdGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBvbiBob3cgdG8gY29uZmlndXJlIGFuIGFwcGxpY2F0aW9uIGZvciBkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRUNSRVQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWYWxpZGF0ZSBtYW5hZ2VkIGJlYW5zLCBuYXZpZ2F0aW9uIHJ1bGVzIGFuZCBlbnN1cmUgdGhhdCBmb3JtcyBhcmUgbm90IG5lc3RlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlZBTElEQVRFPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPCEtLSBMaXN0ZW5lciwgdG8gYWxsb3cgSmV0dHkgc2VydmluZyBNeUZhY2VzIGFwcHMgLS0+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLndlYmFwcC5TdGFydHVwU2VydmxldENvbnRleHRMaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+Ci0gICAgPC9saXN0ZW5lcj4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCAtLT4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICAgIDwvc2VydmxldD4KLQotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPnJlc291cmNlczwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlJlc291cmNlU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8ZmlsdGVyPgotICAgICAgICA8ZmlsdGVyLW5hbWU+dHJpbmlkYWQ8L2ZpbHRlci1uYW1lPgotICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC53ZWJhcHAuVHJpbmlkYWRGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KLSAgICA8L2ZpbHRlcj4KLQotICAgIDxmaWx0ZXItbWFwcGluZz4KLSAgICAgICAgPGZpbHRlci1uYW1lPnRyaW5pZGFkPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgPC9maWx0ZXItbWFwcGluZz4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCBNYXBwaW5ncyAtLT4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9mYWNlcy8qPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+cmVzb3VyY2VzPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4vYWRmLyo8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPCEtLSBXZWxjb21lIGZpbGVzIC0tPgotICAgIDx3ZWxjb21lLWZpbGUtbGlzdD4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+Ci0gICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KLQotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvY29tcG9uZW50cy91c2VyX2Zvcm0ueGh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NGQ2NDguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2ZlYXR1cmUtc2V0XzAyL3NyYy9tYWluL3dlYmFwcC9jb21wb25lbnRzL3VzZXJfZm9ybS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyIKLSAgICAgIHhtbG5zOmg9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiCi0gICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIgotICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiCi0gICAgICB4bWxuczp0cmg9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQvaHRtbCI+Ci0KLTx1aTpjb21wb3NpdGlvbj4KLSAgICA8dHI6cGFuZWxGb3JtTGF5b3V0PgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im5pY2sgbmFtZSIgdmFsdWU9IiN7YmVhbi5wZXJzb25bICduaWNrTmFtZScgXX0iLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0iZS1tYWlsIiB2YWx1ZT0iI3tiZWFuLmVtYWlsfSIvPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9ImZpcnN0IG5hbWUiIHZhbHVlPSIje2JlYW4ucGVyc29uLmZpcnN0TmFtZX0iLz4KLSAgICAgICAgPHRyOmlucHV0VGV4dCBsYWJlbD0ibGFzdCBuYW1lIiB2YWx1ZT0iI3tiZWFuLnBlcnNvbi5sYXN0TmFtZX0iLz4KLSAgICAgICAgPHRyOmlucHV0RGF0ZSBsYWJlbD0iYmlydGhkYXkiIHZhbHVlPSIje2JlYW4ucGVyc29uLmJpcnRoZGF5fSI+Ci0gICAgICAgICAgICA8dHI6Y29udmVydERhdGVUaW1lIHR5cGU9ImRhdGUiIHBhdHRlcm49ImRkLk1NLnl5eXkiLz4KLSAgICAgICAgPC90cjppbnB1dERhdGU+Ci0gICAgICAgIDx0cjppbnB1dERhdGUgbGFiZWw9ImZpbmFsIGV4YW0iIHZhbHVlPSIje2JlYW4ucGVyc29uLmZpbmFsRXhhbX0iPgotICAgICAgICAgICAgPHRyOmNvbnZlcnREYXRlVGltZSB0eXBlPSJkYXRlIiBwYXR0ZXJuPSJkZC5NTS55eXl5Ii8+Ci0gICAgICAgIDwvdHI6aW5wdXREYXRlPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9Im51bWJlciBvZiBzaWJsaW5ncyIgdmFsdWU9IiN7YmVhbi5udW1iZXJPZlNpYmxpbmdzfSIvPgotCi0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9InBhc3N3b3JkIiB2YWx1ZT0iI3tiZWFuLnBhc3N3b3JkfSIgc2VjcmV0PSJ0cnVlIi8+Ci0gICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9InJlLWVudGVyIHBhc3N3b3JkIiB2YWx1ZT0iI3tiZWFuLnBhc3N3b3JkUmVwZWF0ZWR9IiBzZWNyZXQ9InRydWUiLz4KLQotICAgIDwvdHI6cGFuZWxGb3JtTGF5b3V0PgotPC91aTpjb21wb3NpdGlvbj4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjZDE0OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0gICAgICAgIA0KLTxodG1sPg0KLQ0KLTxoZWFkPg0KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIwOyBVUkw9ZmFjZXMvcGFnZXMvaG9tZS54aHRtbCI+DQotPC9oZWFkPg0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL2xheW91dC90ZW1wbGF0ZS54aHRtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGMxZWE4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvbGF5b3V0L3RlbXBsYXRlLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPHRyOmRvY3VtZW50DQotICAgICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiDQotICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiDQotICAgICAgICB4bWxuczpjPSJodHRwOi8vamF2YS5zdW4uY29tL2pzdGwvY29yZSI+DQotICAgIDxmOmZhY2V0IG5hbWU9Im1ldGFDb250YWluZXIiPg0KLSAgICAgICAgPHRpdGxlPnNldi1lbiBmZWF0dXJlLXNldCBkZW1vIDAxPC90aXRsZT4NCi0gICAgPC9mOmZhY2V0Pg0KLQ0KLSAgICA8dHJoOmJvZHk+DQotDQotICAgICAgICA8IS0tIG9yaWdpbmFsIC0tPg0KLSAgICAgICAgPGRpdiBpZD0id3JhcCI+DQotDQotICAgICAgICAgICAgPHRyOmZvcm0gaWQ9ImZvcm0iIGRlZmF1bHRDb21tYW5kPSJkZWZhdWx0QnV0dG9uIj4NCi0gICAgICAgICAgICAgICAgPGRpdiBpZD0ibWFpbiI+DQotICAgICAgICAgICAgICAgICAgICA8dWk6aW5zZXJ0IG5hbWU9ImNvbnRlbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InVuZGVyX2NvbnN0cnVjdGlvbiI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj4hc2l0ZSB1bmRlciBjb25zdHJ1Y3Rpb24hPC9oMj4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIGNvbnRlbnQgb2YgdGhpcyBzaXRlIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhlIG1vbWVudC48L3A+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICA8L3VpOmluc2VydD4NCi0gICAgICAgICAgICAgICAgPC9kaXY+DQotDQotICAgICAgICAgICAgPC90cjpmb3JtPg0KLSAgICAgICAgICAgIDx0cjptZXNzYWdlcyBnbG9iYWxPbmx5PSJ0cnVlIi8+DQotDQotICAgICAgICA8L2Rpdj4NCi0gICAgPC90cmg6Ym9keT4NCi0NCi0NCi08L3RyOmRvY3VtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvaG9tZS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE3YjE1My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL3BhZ2VzL2hvbWUueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMNCi0gICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICB4bWxuczp1aT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvZmFjZWxldHMiPg0KLQ0KLTxib2R5Pg0KLQ0KLTx1aTpjb21wb3NpdGlvbiB0ZW1wbGF0ZT0iLi4vbGF5b3V0L3RlbXBsYXRlLnhodG1sIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLSAgICAgICAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICAgICAgICB4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHJoPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkL2h0bWwiPg0KLQ0KLSAgICA8dWk6ZGVmaW5lIG5hbWU9ImNvbnRlbnQiPg0KLSAgICAgICAgPHRyOmNvbW1hbmRCdXR0b24gdGV4dD0iYWRkIHVzZXIiIGFjdGlvbj0iYWRkVXNlciIvPjxici8+DQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvZmVhdHVyZS1zZXRfMDIvc3JjL21haW4vd2ViYXBwL3BhZ2VzL3JlZ2lzdHJhdGlvbi54aHRtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGY2YjA2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9mZWF0dXJlLXNldF8wMi9zcmMvbWFpbi93ZWJhcHAvcGFnZXMvcmVnaXN0cmF0aW9uLnhodG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDDQotICAgICAgICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotDQotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIj4NCi0NCi08Ym9keT4NCi0NCi08dWk6Y29tcG9zaXRpb24gdGVtcGxhdGU9Ii4uL2xheW91dC90ZW1wbGF0ZS54aHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgICAgICAgICAgICAgIHhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0gICAgICAgICAgICAgICAgeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0gICAgICAgICAgICAgICAgeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCINCi0gICAgICAgICAgICAgICAgeG1sbnM6dHI9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvdHJpbmlkYWQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnRyaD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZC9odG1sIg0KLSAgICAgICAgICAgICAgICB4bWxuczpjPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dHZhbC9kZW1vL2NvbXBvbmVudHMiDQotICAgICAgICA+DQotDQotICAgIDx1aTpkZWZpbmUgbmFtZT0iY29udGVudCI+DQotDQotICAgICAgICA8Yzp1c2VyRm9ybSBiZWFuPSIje3JlZ2lzdHJhdGlvblBhZ2V9Ii8+DQotICAgICAgICA8dHI6Y29tbWFuZEJ1dHRvbiB0ZXh0PSJzYXZlIiBhY3Rpb249IiN7cmVnaXN0cmF0aW9uUGFnZS5maW5pc2h9Ii8+DQotDQotICAgIDwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3BvbS54bWwgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNzY1NmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1oZWxsb19iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgaGVsbG8gYmVhbi12YWxpZGF0aW9uPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmpzdGw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anN0bDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhpYmVybmF0ZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5oaWJlcm5hdGUtdmFsaWRhdG9yPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjQuMC4wLkdBPC92ZXJzaW9uPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjQuMjwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1sb2c0ajEyPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuNC4yPC92ZXJzaW9uPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjOGY3OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLmRvbWFpbi5QZXJzb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb24uZ3JvdXAuQWRtaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb24uZ3JvdXAuVXNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cC5OYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uQmVhblZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmdyb3Vwcy5EZWZhdWx0OwotCi1wdWJsaWMgY2xhc3MgSGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyCi17Ci0gICAgQEJlYW5WYWxpZGF0aW9uLkxpc3QoewotICAgICAgICAgICAgQEJlYW5WYWxpZGF0aW9uKHVzZUdyb3VwcyA9IERlZmF1bHQuY2xhc3MpLAotICAgICAgICAgICAgQEJlYW5WYWxpZGF0aW9uKHZpZXdJZHMgPSAiL2dyb3VwVmFsaWRhdGlvbjAxLmpzcCIsIHVzZUdyb3VwcyA9IFVzZXIuY2xhc3MpLAotICAgICAgICAgICAgQEJlYW5WYWxpZGF0aW9uKHZpZXdJZHMgPSAiL2dyb3VwVmFsaWRhdGlvbjAyLmpzcCIsIHVzZUdyb3VwcyA9IEFkbWluLmNsYXNzKSwKLSAgICAgICAgICAgIEBCZWFuVmFsaWRhdGlvbih2aWV3SWRzID0gIi9tb2RlbFZhbGlkYXRpb24wMS5qc3AiLCB1c2VHcm91cHMgPSBBZG1pbi5jbGFzcyksCi0gICAgICAgICAgICBAQmVhblZhbGlkYXRpb24odmlld0lkcyA9ICIvbW9kZWxWYWxpZGF0aW9uMDEuanNwIiwgdXNlR3JvdXBzID0gTmFtZS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uID0gQE1vZGVsVmFsaWRhdGlvbihpc0FjdGl2ZSA9IHRydWUpKQotICAgIH0pCi0gICAgcHJpdmF0ZSBQZXJzb24gcGVyc29uID0gbmV3IFBlcnNvbigpOwotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBlbXB0eSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBIZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHNlbmQoKQotICAgIHsKLSAgICAgICAgLy9kbyByZWFsIGxvZ2ljLCByZXR1cm4gYSBzdHJpbmcgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciB0aGUgbmF2aWdhdGlvbiBzeXN0ZW0gb2YgSlNGCi0gICAgICAgIHJldHVybiAic3VjY2VzcyI7Ci0gICAgfQotCi0gICAgcHVibGljIFBlcnNvbiBnZXRQZXJzb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBlcnNvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzb24oUGVyc29uIHBlcnNvbikKLSAgICB7Ci0gICAgICAgIHRoaXMucGVyc29uID0gcGVyc29uOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNGU2OGIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLmRvbWFpbi5QZXJzb247Ci0KLS8qKgotICogQSB0eXBpY2FsIHNpbXBsZSBiYWNraW5nIGJlYW4sIHRoYXQgaXMgYmFja2VkIHRvIDxjb2RlPmhlbGxvd29ybGQuanNwPC9jb2RlPgotICovCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZENvbnRyb2xsZXIKLXsKLSAgICBwcml2YXRlIFBlcnNvbiBwZXJzb24gPSBuZXcgUGVyc29uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBkZWZhdWx0IGVtcHR5IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIEhlbGxvV29ybGRDb250cm9sbGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBzZW5kKCkKLSAgICB7Ci0gICAgICAgIC8vZG8gcmVhbCBsb2dpYywgcmV0dXJuIGEgc3RyaW5nIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgdGhlIG5hdmlnYXRpb24gc3lzdGVtIG9mIEpTRgotICAgICAgICByZXR1cm4gInN1Y2Nlc3MiOwotICAgIH0KLQotICAgIHB1YmxpYyBQZXJzb24gZ2V0UGVyc29uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwZXJzb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbiBwZXJzb24pCi0gICAgewotICAgICAgICB0aGlzLnBlcnNvbiA9IHBlcnNvbjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4OTgwYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL2RvbWFpbi9QZXJzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5kb21haW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5OYW1lQ29uc3RyYWludDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cC5BZG1pbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cC5Vc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay52YWxpZGF0aW9uLmdyb3VwLk5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwucGF5bG9hZC5WaW9sYXRpb25TZXZlcml0eTsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7Ci0KLUBOYW1lQ29uc3RyYWludChncm91cHMgPSBOYW1lLmNsYXNzKQotcHVibGljIGNsYXNzIFBlcnNvbgotewotICAgIEBOb3ROdWxsKHBheWxvYWQgPSBWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzKQotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsKLQotICAgIC8vZGVtbyBmb3IgYmVhbiB2YWxpZGF0aW9uIGJhc2VkIHZhbGlkYXRpb24gc3VwcG9ydAotICAgIEBOb3ROdWxsCi0gICAgQFNpemUuTGlzdCh7Ci0gICAgICAgICAgICBAU2l6ZShtaW4gPSAzLCBtYXggPSA2LCBncm91cHMgPSBVc2VyLmNsYXNzKSwKLSAgICAgICAgICAgIEBTaXplKG1pbiA9IDMsIG1heCA9IDEyLCBncm91cHMgPSBBZG1pbi5jbGFzcykKLSAgICB9KQotICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGxhc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vTmFtZUNvbnN0cmFpbnQuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9OYW1lQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2MzN2Y0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9OYW1lQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLnZhbGlkYXRpb247DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi0NCi1AQ29uc3RyYWludCh2YWxpZGF0ZWRCeSA9IE5hbWVDb25zdHJhaW50VmFsaWRhdG9yLmNsYXNzKQ0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotcHVibGljIEBpbnRlcmZhY2UgTmFtZUNvbnN0cmFpbnQNCi17DQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAiaW52YWxpZCBuYW1lIjsNCi0NCi0gICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9Ow0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL05hbWVDb25zdHJhaW50VmFsaWRhdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vTmFtZUNvbnN0cmFpbnRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDViODkyYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vTmFtZUNvbnN0cmFpbnRWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluLlBlcnNvbjsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBOYW1lQ29uc3RyYWludFZhbGlkYXRvciBpbXBsZW1lbnRzDQotICAgICAgICBDb25zdHJhaW50VmFsaWRhdG9yPE5hbWVDb25zdHJhaW50LCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluLlBlcnNvbj4NCi17DQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoTmFtZUNvbnN0cmFpbnQgZGlmZmVyZW50TmFtZSkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoUGVyc29uIHBlcnNvbiwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29uc3RyYWludFZhbGlkYXRvckNvbnRleHQpDQotICAgIHsNCi0gICAgICAgIGlmKHBlcnNvbiA9PSBudWxsIHx8IGlzRW1wdHkocGVyc29uLmdldEZpcnN0TmFtZSgpKSB8fCBpc0VtcHR5KHBlcnNvbi5nZXRMYXN0TmFtZSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAhKHBlcnNvbi5nZXRGaXJzdE5hbWUoKS5lcXVhbHMocGVyc29uLmdldExhc3ROYW1lKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFbXB0eShTdHJpbmcgdmFsdWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8ICIiLmVxdWFscyh2YWx1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay92YWxpZGF0aW9uL2dyb3VwL0FkbWluLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvQWRtaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EyNWZkMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvQWRtaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay52YWxpZGF0aW9uLmdyb3VwOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgQWRtaW4NCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9OYW1lLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTE3MDM4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9OYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cDsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWUNCi17DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9Vc2VyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL3ZhbGlkYXRpb24vZ3JvdXAvVXNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmY4ZGQ1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvdmFsaWRhdGlvbi9ncm91cC9Vc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsudmFsaWRhdGlvbi5ncm91cDsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIFVzZXINCi17DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4OGMyOWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZmFjZXMtY29uZmlnIHZlcnNpb249IjEuMiIgCi0gICAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiPgotCQotCTwhLS0gbWFuYWdlZCBiZWFucyBvZiB0aGUgc2ltcGxlIGhlbGxvIHdvcmxkIGFwcCAtLT4KLQk8bWFuYWdlZC1iZWFuPgotCQk8bWFuYWdlZC1iZWFuLW5hbWU+aGVsbG9Xb3JsZDwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0JCTxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLkhlbGxvV29ybGRDb250cm9sbGVyPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0JCTxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPgotCTwvbWFuYWdlZC1iZWFuPgotCQotCTxtYW5hZ2VkLWJlYW4+Ci0JCTxtYW5hZ2VkLWJlYW4tbmFtZT5oZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXI8L21hbmFnZWQtYmVhbi1uYW1lPgotCQk8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy5ibGFuay5IZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXI8L21hbmFnZWQtYmVhbi1jbGFzcz4KLQkJPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0JPC9tYW5hZ2VkLWJlYW4+Ci0KLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIGhlbGxvV29ybGQuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+KjwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5zdWNjZXNzPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vcmVzdWx0LmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPmV4YW1wbGUwMTwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L2dyb3VwVmFsaWRhdGlvbjAxLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPmV4YW1wbGUwMjwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L2dyb3VwVmFsaWRhdGlvbjAyLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPmV4YW1wbGUwMzwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L21vZGVsVmFsaWRhdGlvbjAxLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0JCi0JPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciByZXN1bHQuanNwIC0tPgotCTxuYXZpZ2F0aW9uLXJ1bGU+Ci0JCTxmcm9tLXZpZXctaWQ+L3Jlc3VsdC5qc3A8L2Zyb20tdmlldy1pZD4KLQkJPG5hdmlnYXRpb24tY2FzZT4KLQkJCTxmcm9tLW91dGNvbWU+YmFjazwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L2hlbGxvV29ybGQuanNwPC90by12aWV3LWlkPgotCQk8L25hdmlnYXRpb24tY2FzZT4KLQk8L25hdmlnYXRpb24tcnVsZT4KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE0YTE4My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLSAgICAgICAgIHZlcnNpb249IjIuNCI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+TXlQcm9qZWN0IHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0gICAgPCEtLW9wdGlvbmFsOiBjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgVVJJcyBvZiAoYWRkaXRpb25hbCkgZmFjZXMgY29uZmlnIGZpbGVzLgotICAgICAgICAgICAgKGUuZy4gL1dFQi1JTkYvbXktY29uZmlnLnhtbCkKLSAgICAgICAgICAgIFNlZSBKU0YgMS4wIFBSRDIsIDEwLjMuMgotICAgICAgICAgICAgQXR0ZW50aW9uOiBZb3UgZG8gbm90IG5lZWQgdG8gcHV0IC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgaW4gaGVyZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuQ09ORklHX0ZJTEVTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L1dFQi1JTkYvZXhhbXBsZXMtY29uZmlnLnhtbDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtLS0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5TdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmNsaWVudDwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkuCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBhbW91bnQgKGRlZmF1bHQgPSAyMCkgb2YgdGhlIGxhdGVzdCB2aWV3cyBhcmUgc3RvcmVkIGluIHNlc3Npb24uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLk5VTUJFUl9PRl9WSUVXU19JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHN0YXRlIHdpbGwgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBzZXJpYWxpemVkIHRvIGEgYnl0ZSBzdHJlYW0uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+T25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0gZGVmYXVsdCkgYW5kIGlmCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04gaXMgdHJ1ZSAoPSBkZWZhdWx0KQotICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZSBjb21wcmVzc2VkIGJlZm9yZSBpdAotICAgICAgICAgICAgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4gSWYgZmFsc2UgdGhlIHN0YXRlIHdpbGwgbm90IGJlIGNvbXByZXNzZWQuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNPTVBSRVNTX1NUQVRFX0lOX1NFU1NJT048L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHBhcmFtZXRlciB0ZWxscyBNeUZhY2VzIGlmIGphdmFzY3JpcHQgY29kZSBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUKLSAgICAgICAgICAgIHJlbmRlcmVkIEhUTUwgb3V0cHV0LgotICAgICAgICAgICAgSWYgamF2YXNjcmlwdCBpcyBhbGxvd2VkLCBjb21tYW5kX2xpbmsgYW5jaG9ycyB3aWxsIGhhdmUgamF2YXNjcmlwdCBjb2RlCi0gICAgICAgICAgICB0aGF0IHN1Ym1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybS4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgbm90IGFsbG93ZWQsIHRoZSBzdGF0ZSBzYXZpbmcgaW5mbyBhbmQgbmVzdGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgYXMgdXJsIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUxMT1dfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkRFVEVDVF9KQVZBU0NSSVBUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcyAiaHVtYW4gcmVhZGFibGUiLgotICAgICAgICAgICAgaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSB3aWxsIGJlIHdyaXR0ZW4sIHRoYXQgZG8gbm90Ci0gICAgICAgICAgICBpbmZsdWVuY2UgdGhlIEhUTUwgY29kZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJ0cnVlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5QUkVUVFlfSFRNTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklmIHRydWUsIGEgamF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRoYXQgaXMgYWJsZSB0byByZXN0b3JlIHRoZQotICAgICAgICAgICAgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LiBDb252ZW5pZW50IGZlYXR1cmUgaWYgeW91IGhhdmUgcGFnZXMKLSAgICAgICAgICAgIHdpdGggbG9uZyBsaXN0cyBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBicm93c2VyIHBhZ2UgdG8gYWx3YXlzIGp1bXAgdG8gdGhlIHRvcAotICAgICAgICAgICAgaWYgeW91IHRyaWdnZXIgYSBsaW5rIG9yIGJ1dHRvbiBhY3Rpb24gdGhhdCBzdGF5cyBvbiB0aGUgc2FtZSBwYWdlLgotICAgICAgICAgICAgRGVmYXVsdDogImZhbHNlIjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BVVRPX1NDUk9MTDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VXNlZCBmb3IgZW5jcnlwdGluZyB2aWV3IHN0YXRlLiBPbmx5IHJlbGV2YW50IGZvciBjbGllbnQgc2lkZQotICAgICAgICAgICAgc3RhdGUgc2F2aW5nLiBTZWUgTXlGYWNlcyB3aWtpL3dlYiBzaXRlIGRvY3VtZW50YXRpb24gZm9yIGluc3RydWN0aW9ucwotICAgICAgICAgICAgb24gaG93IHRvIGNvbmZpZ3VyZSBhbiBhcHBsaWNhdGlvbiBmb3IgZGlmZmVuZW50IGVuY3J5cHRpb24gc3RyZW5ndGhzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuU0VDUkVUPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+TnpZMU5ETXlNVEE9PC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVmFsaWRhdGUgbWFuYWdlZCBiZWFucywgbmF2aWdhdGlvbiBydWxlcyBhbmQgZW5zdXJlIHRoYXQgZm9ybXMgYXJlIG5vdCBuZXN0ZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVHJlYXQgcmVhZG9ubHkgc2FtZSBhcyBpZiBkaXNhYmxlZCBhdHRyaWJ1dGUgd2FzIHNldCBmb3Igc2VsZWN0IGVsZW1lbnRzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUkVBRE9OTFlfQVNfRElTQUJMRURfRk9SX1NFTEVDVFM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBVc2UgdGhlIGRlZmluZWQgY2xhc3MgYXMgdGhlIGNsYXNzIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSByZXNvdXJjZSBpcyBhZGRlZCB0byB0aGUKLSAgICAgICAgICAgIEV4dGVuc2lvbkZpbHRlciBoYW5kbGluZy4gVXNpbmcgU3RyZWFtaW5nQWRkUmVzb3VyY2UgaGVyZSBoZWxwcyB3aXRoIHBlcmZvcm1hbmNlLiBJZiB5b3Ugd2FudCB0byBhZGQKLSAgICAgICAgICAgIGN1c3RvbSBjb21wb25lbnRzIGFuZCB3YW50IHRvIHVzZSB0aGUgRXh0ZW5zaW9uRmlsdGVyLCB5b3UgbmVlZCB0byBwcm92aWRlIHlvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uIGhlcmUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5BRERfUkVTT1VSQ0VfQ0xBU1M8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwudXRpbC5EZWZhdWx0QWRkUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgICAgIAotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZpcnR1YWwgcGF0aCBpbiB0aGUgVVJMIHdoaWNoIHRyaWdnZXJzIGxvYWRpbmcgb2YgcmVzb3VyY2VzIGZvciB0aGUgTXlGYWNlcyBleHRlbmRlZCBjb21wb25lbnRzCi0gICAgICAgICAgICBpbiB0aGUgRXh0ZW5zaW9uRmlsdGVyLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUkVTT1VSQ0VfVklSVFVBTF9QQVRIPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+L2ZhY2VzL215RmFjZXNFeHRlbnNpb25SZXNvdXJjZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIAotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBDaGVjayBpZiB0aGUgZXh0ZW5zaW9ucy1maWx0ZXIgaGFzIGJlZW4gcHJvcGVybHkgY29uZmlndXJlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkNIRUNLX0VYVEVOU0lPTlNfRklMVEVSPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBEZWZpbmUgcGFydGlhbCBzdGF0ZSBzYXZpbmcgYXMgdHJ1ZS9mYWxzZS4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuUEFSVElBTF9TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0KLSAgICA8IS0tIExpc3RlbmVyLCB0byBhbGxvdyBKZXR0eSBzZXJ2aW5nIE15RmFjZXMgYXBwcyAtLT4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMud2ViYXBwLlN0YXJ0dXBTZXJ2bGV0Q29udGV4dExpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IC0tPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmcgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4qLmpzZjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4LmpzcDwvd2VsY29tZS1maWxlPgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9ncm91cFZhbGlkYXRpb24wMS5qc3AgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9ncm91cFZhbGlkYXRpb24wMS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZjAzOWQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvZ3JvdXBWYWxpZGF0aW9uMDEuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDx0aXRsZT5IZWxsbyBXb3JsZDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgICA8Zjp2aWV3PgotICAgICAgICAgICAgPGg6Zm9ybSBpZD0ibWFpbkZvcm0iPgotICAgICAgICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMyI+Ci0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJmaXJzdF9uYW1lIiB2YWx1ZT0iRmlyc3QgbmFtZSo6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJmaXJzdF9uYW1lIiBsYWJlbD0iRmlyc3QgbmFtZSIgdmFsdWU9IiN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyWydwZXJzb24nXS5maXJzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9ImZpcnN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4KLQotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0ibGFzdF9uYW1lIiB2YWx1ZT0iTGFzdCBuYW1lKio6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJsYXN0X25hbWUiIGxhYmVsPSJMYXN0IG5hbWUiIHZhbHVlPSIje2hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlci5wZXJzb24ubGFzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9Imxhc3RfbmFtZSIgc2hvd1N1bW1hcnk9InRydWUiIHNob3dEZXRhaWw9ImZhbHNlIiBlcnJvclN0eWxlPSJjb2xvcjogcmVkOyIgd2FyblN0eWxlPSJjb2xvcjogb3JhbmdlOyIvPgotCi0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiB2YWx1ZT0iUHJlc3MgbWUiIGFjdGlvbj0iI3toZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIuc2VuZH0iLz4KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4KLSAgICAgICAgICAgICAgICA8aDpwYW5lbEdyb3VwLz4KLSAgICAgICAgICAgICAgPC9oOnBhbmVsR3JpZD4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICAgICAgPGg6bWVzc2FnZXMgZ2xvYmFsT25seT0idHJ1ZSIgc2hvd0RldGFpbD0idHJ1ZSIgc2hvd1N1bW1hcnk9ImZhbHNlIi8+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgICAgICA8aHIvPgotCi0gICAgICAgICogcmVxdWlyZWQ8YnIvPgotICAgICAgICAqKiByZXF1aXJlZDsgbGVuZ3RoOiAzLTYgY2hhcmFjdGVycwotICAgIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2dyb3VwVmFsaWRhdGlvbjAyLmpzcCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2dyb3VwVmFsaWRhdGlvbjAyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VmYTA0Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9ncm91cFZhbGlkYXRpb24wMi5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIzIj4KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9ImZpcnN0X25hbWUiIHZhbHVlPSJGaXJzdCBuYW1lKjoiLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9ImZpcnN0X25hbWUiIGxhYmVsPSJGaXJzdCBuYW1lIiB2YWx1ZT0iI3toZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXJbJ3BlcnNvbiddLmZpcnN0TmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0iZmlyc3RfbmFtZSIgc2hvd1N1bW1hcnk9InRydWUiIHNob3dEZXRhaWw9ImZhbHNlIiBlcnJvclN0eWxlPSJjb2xvcjogcmVkOyIgd2FyblN0eWxlPSJjb2xvcjogb3JhbmdlOyIvPgotCi0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJsYXN0X25hbWUiIHZhbHVlPSJMYXN0IG5hbWUqKjoiLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9Imxhc3RfbmFtZSIgbGFiZWw9Ikxhc3QgbmFtZSIgdmFsdWU9IiN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLnBlcnNvbi5sYXN0TmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0ibGFzdF9uYW1lIiBzaG93U3VtbWFyeT0idHJ1ZSIgc2hvd0RldGFpbD0iZmFsc2UiIGVycm9yU3R5bGU9ImNvbG9yOiByZWQ7IiB3YXJuU3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ii8+Ci0KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJQcmVzcyBtZSIgYWN0aW9uPSIje2hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlci5zZW5kfSIvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgICAgICAgPC9oOmZvcm0+Ci0gICAgICAgICAgICA8aDptZXNzYWdlcyBnbG9iYWxPbmx5PSJ0cnVlIiBzaG93RGV0YWlsPSJ0cnVlIiBzaG93U3VtbWFyeT0iZmFsc2UiLz4KLSAgICAgICAgPC9mOnZpZXc+Ci0gICAgICAgIDxoci8+Ci0KLSAgICAgICAgKiByZXF1aXJlZDxici8+Ci0gICAgICAgICoqIHJlcXVpcmVkOyBsZW5ndGg6IDMtMTIgY2hhcmFjdGVycwotICAgIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNDk3MzMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIzIj4KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9ImZpcnN0X25hbWUiIHZhbHVlPSJGaXJzdCBuYW1lKjoiLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9ImZpcnN0X25hbWUiIGxhYmVsPSJGaXJzdCBuYW1lIiB2YWx1ZT0iI3toZWxsb1dvcmxkLnBlcnNvbi5maXJzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9ImZpcnN0X25hbWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIgc2hvd0RldGFpbD0idHJ1ZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4KLQotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0ibGFzdF9uYW1lIiB2YWx1ZT0iTGFzdCBuYW1lKio6Ii8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJsYXN0X25hbWUiIGxhYmVsPSJMYXN0IG5hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJsYXN0X25hbWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIgc2hvd0RldGFpbD0idHJ1ZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4KLQotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Xb3JsZC5zZW5kfSIvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICAgIDxoOnBhbmVsR3JvdXAvPgotICAgICAgICAgICAgICA8L2g6cGFuZWxHcmlkPgotCi0gICAgICAgICAgICAgIDxoci8+Ci0gICAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIHZhbHVlPSJncm91cCB2YWxpZGF0aW9uIGV4YW1wbGUgMSIgYWN0aW9uPSJleGFtcGxlMDEiIGltbWVkaWF0ZT0idHJ1ZSIvPjxici8+Ci0gICAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIHZhbHVlPSJncm91cCB2YWxpZGF0aW9uIGV4YW1wbGUgMiIgYWN0aW9uPSJleGFtcGxlMDIiIGltbWVkaWF0ZT0idHJ1ZSIvPjxici8+Ci0gICAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIHZhbHVlPSJtb2RlbCB2YWxpZGF0aW9uIGV4YW1wbGUgMSIgYWN0aW9uPSJleGFtcGxlMDMiIGltbWVkaWF0ZT0idHJ1ZSIvPjxici8+Ci0gICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgPC9mOnZpZXc+Ci0gICAgICAgIDxoci8+Ci0gICAgICAgICogbm9uIGJsb2NraW5nIHdhcm4gbW9kZTxici8+Ci0gICAgICAgICoqIGJsb2NraW5nIGVycm9yIG1vZGUKLSAgICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ODJkNTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPCUtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0lPgotCi08JUAgcGFnZSBzZXNzaW9uPSJmYWxzZSIlPgotPCUKLXJlc3BvbnNlLnNlbmRSZWRpcmVjdCgiaGVsbG9Xb3JsZC5qc2YiKTsKLSU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvbW9kZWxWYWxpZGF0aW9uMDEuanNwIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi93ZWJhcHAvbW9kZWxWYWxpZGF0aW9uMDEuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODFmN2RlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL21vZGVsVmFsaWRhdGlvbjAxLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwlLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tJT4KLQotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgICAgPGY6dmlldz4KLSAgICAgICAgICAgIDxoOmZvcm0gaWQ9Im1haW5Gb3JtIj4KLSAgICAgICAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjMiPgotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0iZmlyc3RfbmFtZSIgdmFsdWU9IkZpcnN0IG5hbWUqOiIvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0iZmlyc3RfbmFtZSIgbGFiZWw9IkZpcnN0IG5hbWUiIHZhbHVlPSIje2hlbGxvR3JvdXBWYWxpZGF0aW9uQ29udHJvbGxlclsncGVyc29uJ10uZmlyc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJmaXJzdF9uYW1lIiBzaG93U3VtbWFyeT0idHJ1ZSIgc2hvd0RldGFpbD0iZmFsc2UiIGVycm9yU3R5bGU9ImNvbG9yOiByZWQ7IiB3YXJuU3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ii8+Ci0KLSAgICAgICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9Imxhc3RfbmFtZSIgdmFsdWU9Ikxhc3QgbmFtZSoqOiIvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0ibGFzdF9uYW1lIiBsYWJlbD0iTGFzdCBuYW1lIiB2YWx1ZT0iI3toZWxsb0dyb3VwVmFsaWRhdGlvbkNvbnRyb2xsZXIucGVyc29uLmxhc3ROYW1lfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2UgZm9yPSJsYXN0X25hbWUiIHNob3dTdW1tYXJ5PSJ0cnVlIiBzaG93RGV0YWlsPSJmYWxzZSIgZXJyb3JTdHlsZT0iY29sb3I6IHJlZDsiIHdhcm5TdHlsZT0iY29sb3I6IG9yYW5nZTsiLz4KLQotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLnNlbmR9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+Ci0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+Ci0gICAgICAgICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0gICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgICAgIDxoOm1lc3NhZ2VzIGdsb2JhbE9ubHk9InRydWUiIHNob3dEZXRhaWw9InRydWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIvPgotICAgICAgICA8L2Y6dmlldz4KLSAgICAgICAgPGhyLz4KLSAgICAgICAgbW9kZWwgdmFsaWRhdGlvbjogZmlyc3QgYW5kIGxhc3QgbmFtZSBoYXZlIHRvIGJlIGRpZmZlcmVudDxici8+Ci0KLSAgICAgICAgKiByZXF1aXJlZDxici8+Ci0gICAgICAgICoqIHJlcXVpcmVkOyBsZW5ndGggb2YgcHJvdmlkZWQgdmFsdWU6IDMtMTIgY2hhcmFjdGVycwotICAgIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL3Jlc3VsdC5qc3AgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3dlYmFwcC9yZXN1bHQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZThiMWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb19iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vd2ViYXBwL3Jlc3VsdC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgICAgPGgyPjxoOm91dHB1dFRleHQgdmFsdWU9IkhlbGxvICN7aGVsbG9Xb3JsZC5wZXJzb24uZmlyc3ROYW1lfSAje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfSN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLnBlcnNvbi5maXJzdE5hbWV9ICN7aGVsbG9Hcm91cFZhbGlkYXRpb25Db250cm9sbGVyLnBlcnNvbi5sYXN0TmFtZX0uIFdlIGhvcGUgeW91IGVuam95IEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yISIvPjwvaDI+Ci0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZExpbmsgYWN0aW9uPSJiYWNrIj4KLSAgICAgICAgICAgICAgICAgICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iSG9tZSIvPgotICAgICAgICAgICAgICAgIDwvaDpjb21tYW5kTGluaz4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICAgICAgPGg6bWVzc2FnZXMgZ2xvYmFsT25seT0idHJ1ZSIgc2hvd0RldGFpbD0idHJ1ZSIgc2hvd1N1bW1hcnk9ImZhbHNlIi8+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgIDwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvcG9tLnhtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjczNWYzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWhlbGxvX3dvcmxkPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIGhlbGxvIHdvcmxkPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmpzdGw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anN0bDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5PiAgICAgICAgDQotDQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYWZiMzkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2JsYW5rL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbms7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluLlBlcnNvbjsKLQotLyoqCi0gKiBBIHR5cGljYWwgc2ltcGxlIGJhY2tpbmcgYmVhbiwgdGhhdCBpcyBiYWNrZWQgdG8gPGNvZGU+aGVsbG93b3JsZC5qc3A8L2NvZGU+Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEhlbGxvV29ybGRDb250cm9sbGVyCi17Ci0gICAgcHJpdmF0ZSBQZXJzb24gcGVyc29uID0gbmV3IFBlcnNvbigpOwotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBlbXB0eSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBIZWxsb1dvcmxkQ29udHJvbGxlcigpCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB0aGF0IGlzIGJhY2tlZCB0byBhIHN1Ym1pdCBidXR0b24gb2YgYSBmb3JtLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgc2VuZCgpCi0gICAgewotICAgICAgICAvL2RvIHJlYWwgbG9naWMsIHJldHVybiBhIHN0cmluZyB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuYXZpZ2F0aW9uIHN5c3RlbSBvZiBKU0YKLSAgICAgICAgcmV0dXJuICJzdWNjZXNzIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGVyc29uIGdldFBlcnNvbigpCi0gICAgewotICAgICAgICByZXR1cm4gcGVyc29uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNvbihQZXJzb24gcGVyc29uKQotICAgIHsKLSAgICAgICAgdGhpcy5wZXJzb24gPSBwZXJzb247Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYmxhbmsvZG9tYWluL1BlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDA3NmNjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9ibGFuay9kb21haW4vUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYmxhbmsuZG9tYWluOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsKLQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsKLQotcHVibGljIGNsYXNzIFBlcnNvbgotewotICAgIC8vaGVsbG8gd29ybGQgZGVtbwotICAgIEBSZXF1aXJlZChwYXJhbWV0ZXJzID0gVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcykKLSAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7Ci0KLSAgICAvL2RlbW8gZm9yIGpwYSBiYXNlZCB2YWxpZGF0aW9uIHN1cHBvcnQKLSAgICBAQ29sdW1uKG51bGxhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEwIC8qLi4uKi8pCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbGFzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKQotICAgIHsKLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmJlYWU3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08ZmFjZXMtY29uZmlnIHZlcnNpb249IjEuMiIgCi0gICAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiPgotCQotCTwhLS0gbWFuYWdlZCBiZWFucyBvZiB0aGUgc2ltcGxlIGhlbGxvIHdvcmxkIGFwcCAtLT4KLQk8bWFuYWdlZC1iZWFuPgotCQk8bWFuYWdlZC1iZWFuLW5hbWU+aGVsbG9Xb3JsZDwvbWFuYWdlZC1iZWFuLW5hbWU+Ci0JCTxtYW5hZ2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLmJsYW5rLkhlbGxvV29ybGRDb250cm9sbGVyPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0JCTxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPgotCTwvbWFuYWdlZC1iZWFuPgotCQotCTwhLS0gbmF2aWdhdGlvbiBydWxlcyBmb3IgaGVsbG9Xb3JsZC5qc3AgLS0+Ci0JPG5hdmlnYXRpb24tcnVsZT4KLQkJPGZyb20tdmlldy1pZD4vaGVsbG9Xb3JsZC5qc3A8L2Zyb20tdmlldy1pZD4KLQkJPG5hdmlnYXRpb24tY2FzZT4KLQkJCTxmcm9tLW91dGNvbWU+c3VjY2VzczwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L3BhZ2UyLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0JCi0JPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciBwYWdlMi5qc3AgLS0+Ci0JPG5hdmlnYXRpb24tcnVsZT4KLQkJPGZyb20tdmlldy1pZD4vcGFnZTIuanNwPC9mcm9tLXZpZXctaWQ+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPmJhY2s8L2Zyb20tb3V0Y29tZT4KLQkJCTx0by12aWV3LWlkPi9oZWxsb1dvcmxkLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTRhMTgzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCi0gICAgICAgICB2ZXJzaW9uPSIyLjQiPgotCi0gICAgPGRlc2NyaXB0aW9uPk15UHJvamVjdCB3ZWIueG1sPC9kZXNjcmlwdGlvbj4KLQotICAgIDwhLS1vcHRpb25hbDogY29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIFVSSXMgb2YgKGFkZGl0aW9uYWwpIGZhY2VzIGNvbmZpZyBmaWxlcy4KLSAgICAgICAgICAgIChlLmcuIC9XRUItSU5GL215LWNvbmZpZy54bWwpCi0gICAgICAgICAgICBTZWUgSlNGIDEuMCBQUkQyLCAxMC4zLjIKLSAgICAgICAgICAgIEF0dGVudGlvbjogWW91IGRvIG5vdCBuZWVkIHRvIHB1dCAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGluIGhlcmUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkNPTkZJR19GSUxFUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi9XRUItSU5GL2V4YW1wbGVzLWNvbmZpZy54bWw8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbS0tPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+U3RhdGUgc2F2aW5nIG1ldGhvZDogImNsaWVudCIgb3IgInNlcnZlciIgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIFNlZSBKU0YgU3BlY2lmaWNhdGlvbiAyLjUuMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jbGllbnQ8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgRGVmaW5lcyB0aGUgYW1vdW50IChkZWZhdWx0ID0gMjApIG9mIHRoZSBsYXRlc3Qgdmlld3MgYXJlIHN0b3JlZCBpbiBzZXNzaW9uLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5OVU1CRVJfT0ZfVklFV1NfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPjIwPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzdGF0ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbSBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uCi0gICAgICAgICAgICBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpIGFuZCBpZgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OIGlzIHRydWUgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzZXJpYWxpemVkIHN0YXRlIHdpbGwgYmUgY29tcHJlc3NlZCBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBjb21wcmVzc2VkLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DT01QUkVTU19TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhpcyBwYXJhbWV0ZXIgdGVsbHMgTXlGYWNlcyBpZiBqYXZhc2NyaXB0IGNvZGUgc2hvdWxkIGJlIGFsbG93ZWQgaW4gdGhlCi0gICAgICAgICAgICByZW5kZXJlZCBIVE1MIG91dHB1dC4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgYWxsb3dlZCwgY29tbWFuZF9saW5rIGFuY2hvcnMgd2lsbCBoYXZlIGphdmFzY3JpcHQgY29kZQotICAgICAgICAgICAgdGhhdCBzdWJtaXRzIHRoZSBjb3JyZXNwb25kaW5nIGZvcm0uCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIG5vdCBhbGxvd2VkLCB0aGUgc3RhdGUgc2F2aW5nIGluZm8gYW5kIG5lc3RlZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICB3aWxsIGJlIGFkZGVkIGFzIHVybCBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFMTE9XX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5ERVRFQ1RfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCByZW5kZXJlZCBIVE1MIGNvZGUgd2lsbCBiZSBmb3JtYXR0ZWQsIHNvIHRoYXQgaXQgaXMgImh1bWFuIHJlYWRhYmxlIi4KLSAgICAgICAgICAgIGkuZS4gYWRkaXRpb25hbCBsaW5lIHNlcGFyYXRvcnMgYW5kIHdoaXRlc3BhY2Ugd2lsbCBiZSB3cml0dGVuLCB0aGF0IGRvIG5vdAotICAgICAgICAgICAgaW5mbHVlbmNlIHRoZSBIVE1MIGNvZGUuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUFJFVFRZX0hUTUw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCBhIGphdmFzY3JpcHQgZnVuY3Rpb24gd2lsbCBiZSByZW5kZXJlZCB0aGF0IGlzIGFibGUgdG8gcmVzdG9yZSB0aGUKLSAgICAgICAgICAgIGZvcm1lciB2ZXJ0aWNhbCBzY3JvbGwgb24gZXZlcnkgcmVxdWVzdC4gQ29udmVuaWVudCBmZWF0dXJlIGlmIHlvdSBoYXZlIHBhZ2VzCi0gICAgICAgICAgICB3aXRoIGxvbmcgbGlzdHMgYW5kIHlvdSBkbyBub3Qgd2FudCB0aGUgYnJvd3NlciBwYWdlIHRvIGFsd2F5cyBqdW1wIHRvIHRoZSB0b3AKLSAgICAgICAgICAgIGlmIHlvdSB0cmlnZ2VyIGEgbGluayBvciBidXR0b24gYWN0aW9uIHRoYXQgc3RheXMgb24gdGhlIHNhbWUgcGFnZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJmYWxzZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQVVUT19TQ1JPTEw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlVzZWQgZm9yIGVuY3J5cHRpbmcgdmlldyBzdGF0ZS4gT25seSByZWxldmFudCBmb3IgY2xpZW50IHNpZGUKLSAgICAgICAgICAgIHN0YXRlIHNhdmluZy4gU2VlIE15RmFjZXMgd2lraS93ZWIgc2l0ZSBkb2N1bWVudGF0aW9uIGZvciBpbnN0cnVjdGlvbnMKLSAgICAgICAgICAgIG9uIGhvdyB0byBjb25maWd1cmUgYW4gYXBwbGljYXRpb24gZm9yIGRpZmZlbmVudCBlbmNyeXB0aW9uIHN0cmVuZ3Rocy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFQ1JFVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPk56WTFORE15TVRBPTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZhbGlkYXRlIG1hbmFnZWQgYmVhbnMsIG5hdmlnYXRpb24gcnVsZXMgYW5kIGVuc3VyZSB0aGF0IGZvcm1zIGFyZSBub3QgbmVzdGVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuVkFMSURBVEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRyZWF0IHJlYWRvbmx5IHNhbWUgYXMgaWYgZGlzYWJsZWQgYXR0cmlidXRlIHdhcyBzZXQgZm9yIHNlbGVjdCBlbGVtZW50cy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlJFQURPTkxZX0FTX0RJU0FCTEVEX0ZPUl9TRUxFQ1RTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVXNlIHRoZSBkZWZpbmVkIGNsYXNzIGFzIHRoZSBjbGFzcyB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgcmVzb3VyY2UgaXMgYWRkZWQgdG8gdGhlCi0gICAgICAgICAgICBFeHRlbnNpb25GaWx0ZXIgaGFuZGxpbmcuIFVzaW5nIFN0cmVhbWluZ0FkZFJlc291cmNlIGhlcmUgaGVscHMgd2l0aCBwZXJmb3JtYW5jZS4gSWYgeW91IHdhbnQgdG8gYWRkCi0gICAgICAgICAgICBjdXN0b20gY29tcG9uZW50cyBhbmQgd2FudCB0byB1c2UgdGhlIEV4dGVuc2lvbkZpbHRlciwgeW91IG5lZWQgdG8gcHJvdmlkZSB5b3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBoZXJlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUREX1JFU09VUkNFX0NMQVNTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLnV0aWwuRGVmYXVsdEFkZFJlc291cmNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgICAgICAKLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWaXJ0dWFsIHBhdGggaW4gdGhlIFVSTCB3aGljaCB0cmlnZ2VycyBsb2FkaW5nIG9mIHJlc291cmNlcyBmb3IgdGhlIE15RmFjZXMgZXh0ZW5kZWQgY29tcG9uZW50cwotICAgICAgICAgICAgaW4gdGhlIEV4dGVuc2lvbkZpbHRlci4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlJFU09VUkNFX1ZJUlRVQUxfUEFUSDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi9mYWNlcy9teUZhY2VzRXh0ZW5zaW9uUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgQ2hlY2sgaWYgdGhlIGV4dGVuc2lvbnMtZmlsdGVyIGhhcyBiZWVuIHByb3Blcmx5IGNvbmZpZ3VyZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DSEVDS19FWFRFTlNJT05TX0ZJTFRFUjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgRGVmaW5lIHBhcnRpYWwgc3RhdGUgc2F2aW5nIGFzIHRydWUvZmFsc2UuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlBBUlRJQUxfU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotCi0gICAgPCEtLSBMaXN0ZW5lciwgdG8gYWxsb3cgSmV0dHkgc2VydmluZyBNeUZhY2VzIGFwcHMgLS0+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLndlYmFwcC5TdGFydHVwU2VydmxldENvbnRleHRMaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+Ci0gICAgPC9saXN0ZW5lcj4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCAtLT4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICAgIDwvc2VydmxldD4KLQotICAgIDwhLS0gRmFjZXMgU2VydmxldCBNYXBwaW5nIC0tPgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+Ki5qc2Y8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPCEtLSBXZWxjb21lIGZpbGVzIC0tPgotICAgIDx3ZWxjb21lLWZpbGUtbGlzdD4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5qc3A8L3dlbGNvbWUtZmlsZT4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+Ci0gICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KLQotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZDliNTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwlLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tJT4KLQotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgICAgPGY6dmlldz4KLSAgICAgICAgICAgIDxoOmZvcm0gaWQ9Im1haW5Gb3JtIj4KLSAgICAgICAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjMiPgotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0iZmlyc3RfbmFtZSIgdmFsdWU9IkZpcnN0IG5hbWUqOiIvPgotICAgICAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0iZmlyc3RfbmFtZSIgbGFiZWw9IkZpcnN0IG5hbWUiIHZhbHVlPSIje2hlbGxvV29ybGQucGVyc29uLmZpcnN0TmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8aDptZXNzYWdlIGZvcj0iZmlyc3RfbmFtZSIgc2hvd1N1bW1hcnk9ImZhbHNlIiBzaG93RGV0YWlsPSJ0cnVlIiBlcnJvclN0eWxlPSJjb2xvcjogcmVkOyIgd2FyblN0eWxlPSJjb2xvcjogb3JhbmdlOyIvPgotCi0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJsYXN0X25hbWUiIHZhbHVlPSJMYXN0IG5hbWUqKjoiLz4KLSAgICAgICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9Imxhc3RfbmFtZSIgbGFiZWw9Ikxhc3QgbmFtZSIgdmFsdWU9IiN7aGVsbG9Xb3JsZC5wZXJzb24ubGFzdE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6bWVzc2FnZSBmb3I9Imxhc3RfbmFtZSIgc2hvd1N1bW1hcnk9ImZhbHNlIiBzaG93RGV0YWlsPSJ0cnVlIiBlcnJvclN0eWxlPSJjb2xvcjogcmVkOyIgd2FyblN0eWxlPSJjb2xvcjogb3JhbmdlOyIvPgotCi0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZEJ1dHRvbiB2YWx1ZT0iUHJlc3MgbWUiIGFjdGlvbj0iI3toZWxsb1dvcmxkLnNlbmR9Ii8+Ci0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+Ci0gICAgICAgICAgICAgICAgPGg6cGFuZWxHcm91cC8+Ci0gICAgICAgICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0gICAgICAgICAgICA8L2g6Zm9ybT4KLSAgICAgICAgPC9mOnZpZXc+Ci0gICAgICAgIDxoci8+Ci0gICAgICAgICogbm9uZSBibG9ja2luZyB3YXJuIG1vZGU8YnIvPgotICAgICAgICAqKiBibG9ja2luZyBlcnJvciBtb2RlCi0gICAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ4MmQ1My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvaGVsbG9fd29ybGQvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTwlLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tJT4KLQotPCVAIHBhZ2Ugc2Vzc2lvbj0iZmFsc2UiJT4KLTwlCi1yZXNwb25zZS5zZW5kUmVkaXJlY3QoImhlbGxvV29ybGQuanNmIik7Ci0lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9oZWxsb193b3JsZC9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYzg1MjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08JS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLSU+Ci0KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiU+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICAgIDxmOnZpZXc+Ci0gICAgICAgICAgICA8aDpmb3JtIGlkPSJtYWluRm9ybSI+Ci0gICAgICAgICAgICAgICAgPGgyPjxoOm91dHB1dFRleHQgdmFsdWU9IkhlbGxvICN7aGVsbG9Xb3JsZC5wZXJzb24uZmlyc3ROYW1lfSAje2hlbGxvV29ybGQucGVyc29uLmxhc3ROYW1lfS4gV2UgaG9wZSB5b3UgZW5qb3kgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IhIi8+PC9oMj4KLSAgICAgICAgICAgICAgICA8aDpjb21tYW5kTGluayBhY3Rpb249ImJhY2siPgotICAgICAgICAgICAgICAgICAgICA8aDpvdXRwdXRUZXh0IHZhbHVlPSJIb21lIi8+Ci0gICAgICAgICAgICAgICAgPC9oOmNvbW1hbmRMaW5rPgotICAgICAgICAgICAgPC9oOmZvcm0+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgIDwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvZXhhbXBsZXMvcG9tLnhtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmExYzk5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9leGFtcGxlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgZXhhbXBsZXMgcHJvamVjdDwvbmFtZT4NCi0gICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxzY20+DQotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9leGFtcGxlczwvY29ubmVjdGlvbj4NCi0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9leGFtcGxlczwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4NCi0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL2V4YW1wbGVzPC91cmw+DQotICAgIDwvc2NtPg0KLSAgICANCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPCEtLVRoaXMgcGx1Z2luIGFsbG93cyB0byBydW4gdGhlIGV4YW1wbGUgdXNpbmcgbXZuIGpldHR5OnJ1biAtLT4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpldHR5LXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Ni4xLjg8L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+MTA8L3NjYW5JbnRlcnZhbFNlY29uZHM+DQotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi0gICAgPG1vZHVsZXM+DQotICAgICAgICA8bW9kdWxlPmhlbGxvX3dvcmxkPC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPmhlbGxvX2JlYW4tdmFsaWRhdGlvbjwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5mZWF0dXJlLXNldF8wMTwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5mZWF0dXJlLXNldF8wMjwvbW9kdWxlPg0KLSAgICA8L21vZHVsZXM+DQotDQotICAgIDxwcm9maWxlcz4NCi0gICAgICAgIDwhLS0gVGhpcyBwcm9maWxlIGlzIGludm9rZWQgYnkgLURwcmVwYXJlUmVsZWFzZT10cnVlLiAgVGhpcyBhbGxvd3MgbXZuIHJlbGVhc2U6cHJlcGFyZSB0bw0KLSAgICAgICAgICAgIHJ1biBzdWNjZXNzZnVsbHkgb24gdGhlIGFzc2VtYmx5IHByb2plY3RzLiAtLT4NCi0gICAgICAgIDxwcm9maWxlPg0KLSAgICAgICAgICAgIDxpZD5wcmVwYXJlLXJlbGVhc2U8L2lkPg0KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPg0KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+DQotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wcmVwYXJlUmVsZWFzZTwvbmFtZT4NCi0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8L2FjdGl2YXRpb24+DQotICAgICAgICAgICAgPG1vZHVsZXM+DQotICAgICAgICAgICAgICAgIDxtb2R1bGU+YXNzZW1ibHk8L21vZHVsZT4NCi0gICAgICAgICAgICA8L21vZHVsZXM+DQotICAgICAgICAgICAgPGJ1aWxkPg0KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVsZWFzZS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+LURwcmVwYXJlUmVsZWFzZTwvYXJndW1lbnRzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+DQotICAgICAgICAgICAgPC9idWlsZD4NCi0gICAgICAgIDwvcHJvZmlsZT4NCi0gICAgPC9wcm9maWxlcz4NCi0NCi0gICAgPHByb3BlcnRpZXM+DQotICAgICAgICA8dHJpbmlkYWQudmVyc2lvbj4xLjIuOTwvdHJpbmlkYWQudmVyc2lvbj4NCi0gICAgPC9wcm9wZXJ0aWVzPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvbG9nby9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9sb2dvL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9sb2dvL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvbG9nby9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2xvZ28vTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvbG9nby9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2xvZ28vZXh0dmFsLWxvZ28uc3ZnIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL2xvZ28vZXh0dmFsLWxvZ28uc3ZnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzJiNTM5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9sb2dvL2V4dHZhbC1sb2dvLnN2ZworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPCEtLSBDcmVhdGVkIHdpdGggSW5rc2NhcGUgKGh0dHA6Ly93d3cuaW5rc2NhcGUub3JnLykgLS0+Ci0KLQotPCEtLQotCUNvcHlyaWdodCAyMDA5IEVucmljbyBCZXJ0aSAoZW5yaWNvLmJlcnRpQGdtYWlsLmNvbSkKLQotCUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotCXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLQlZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotCSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotCVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLQlkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotCVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotCVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLQlsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0KLTxzdmcKLSAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCi0gICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCi0gICB2ZXJzaW9uPSIxLjAiCi0gICB3aWR0aD0iNzQ0LjA5NDQ4IgotICAgaGVpZ2h0PSIxMDUyLjM2MjIiCi0gICBpZD0ic3ZnMiI+Ci0gIDxkZWZzCi0gICAgIGlkPSJkZWZzNCIgLz4KLSAgPGcKLSAgICAgaWQ9ImxheWVyMiI+Ci0gICAgPHJlY3QKLSAgICAgICB3aWR0aD0iMzUzLjQxOTUzIgotICAgICAgIGhlaWdodD0iMTEzLjEwODQiCi0gICAgICAgcnk9IjExIgotICAgICAgIHg9IjE4Mi4yMzAxNSIKLSAgICAgICB5PSIzODEuMzMyOTIiCi0gICAgICAgaWQ9InJlY3QyNDg0IgotICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiM2NjY2NmY7c3Ryb2tlLXdpZHRoOjAuODAxODgyNjI7c3Ryb2tlLW9wYWNpdHk6MC45NDExNzY0NyIgLz4KLSAgPC9nPgotICA8ZwotICAgICBpZD0ibGF5ZXIxIj4KLSAgICA8cGF0aAotICAgICAgIGQ9Ik0gMTA3LjE4NzUsMzkzLjU2NjM4IEwgMTIyLjMwNDY5LDM5My41NjYzOCBMIDE3Ny41LDQ2Ny4zOTQ1MSBMIDE2Mi4zODI4MSw0NjcuMzk0NTEgTCAxMDcuMTg3NSwzOTMuNTY2MzggTSAxMjIuMzA0NjksNDY3LjM5NDUxIEwgMTA3LjE4NzUsNDY3LjM5NDUxIEwgMTYyLjM4MjgxLDM5My41NjYzOCBMIDE3Ny41LDM5My41NjYzOCBMIDEyMi4zMDQ2OSw0NjcuMzk0NTEgTSAxODUuOTM3NSwzODEuNjEzMjYgTCAxOTQuMDkzNzUsMzgxLjYxMzI2IEwgMTk2LjkwNjI1LDM5My41NjYzOCBMIDIxNC4wNjI1LDM5My41NjYzOCBMIDIxNC4wNjI1LDQwNC4xMTMyNiBMIDE5OC45NDUzMSw0MDQuMTEzMjYgTCAxOTguOTQ1MzEsNDQ2LjUxMTY5IEMgMTk4Ljk0NTMsNDUzLjQwMjMzIDIwMS45MjE4Niw0NTYuODQ3NjQgMjA3Ljg3NSw0NTYuODQ3NjMgTCAyMTQuMDYyNSw0NTYuODQ3NjMgTCAyMTQuMDYyNSw0NjcuMzk0NTEgTCAyMDQuNSw0NjcuMzk0NTEgQyAxOTIuMTI0OTksNDY3LjM5NDUxIDE4NS45Mzc1LDQ2MC43NjE3IDE4NS45Mzc1LDQ0Ny40OTYwNyBMIDE4NS45Mzc1LDM4MS42MTMyNiIKLSAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNDcuNTIxNzMsMTkuMjkxOTIyKSIKLSAgICAgICBpZD0iZmxvd1Jvb3QyNDYxIgotICAgICAgIHN0eWxlPSJmb250LXNpemU6NDBweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjE7Zm9udC1mYW1pbHk6U2Fuc2F0aW9uOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246U2Fuc2F0aW9uIiAvPgotICAgIDxwYXRoCi0gICAgICAgZD0iTSA0ODQuMTU2MjUsMzM3LjkzNzUgQyA0NzkuOTUwMDcsMzQxLjE4MTA1IDQ3Ni45MDg2MSwzNDUuNjAxMjEgNDczLjcxODc1LDM0OS43ODEyNSBDIDQ2Ni4wNzE5MiwzNjAuMTU5MDIgNDU4LjM1MzQ3LDM3MC40ODQ2MSA0NTAuODM3MzksMzgwLjk1Nzk2IEMgNDQwLjk4MTIzLDM5NC40NDg3MyA0MzEuMjk1OTMsNDA4LjA2NDQ5IDQyMS44MzI5OCw0MjEuODM0MTMgQyA0MTMuNjUwMDcsNDMzLjcyNzk5IDQwNS40NTU2OCw0NDUuNjE0MTIgMzk3LjM1ODU3LDQ1Ny41NjY2NiBDIDM5Ni43NDQ2LDQ1OC4zMzMwOSAzOTYuMzUxMTksNDU5LjMwNDI3IDM5NS41OTM3NSw0NTkuOTM3NSBDIDM5NC43ODMwMyw0NjAuNTA2MjcgMzkzLjM5Njk3LDQ2MC4wNzQyNSAzOTMuMzA5OTUsNDU5LjAwNzg1IEMgMzkwLjA1NzgyLDQ0MS42NDUxNCAzODYuNzcyNTYsNDI0LjI4ODY1IDM4My4zOTc0Miw0MDYuOTQ5MzggQyAzODIuMDI2LDM5OS43NzQyMiAzODAuNjI2NDMsMzkyLjYwMzQ0IDM3OS4wNjg2NiwzODUuNDY2MjUgQyAzNzguMzMzMDIsMzgyLjEyOTI0IDM3Ny41NTc2NCwzNzguNzg4NTQgMzc2LjQ1NTYsMzc1LjU1MjMzIEMgMzc2LjA4MTg5LDM3NC42OTM3MyAzNzUuOTI4NDYsMzczLjQ4NzM5IDM3NC44NjE1MiwzNzMuMjEzMzYgQyAzNzMuOTA5NDUsMzcyLjc3MzU5IDM3Mi44NzExMywzNzMuMzUwNTQgMzcyLjM2MTIzLDM3NC4xNzkwOSBDIDM3MS40MTQ4MSwzNzUuNTU2OTEgMzcwLjYxNTcxLDM3Ny4wNTc5OCAzNzAuMTYyNjMsMzc4LjY3Mzk4IEMgMzY5LjE1OTQ2LDM4MS43MDAxOSAzNjguODUwOTcsMzg0LjkwNDkyIDM2OC43MzQ0NSwzODguMDc0ODEgQyAzNjguNjY4NzYsMzkyLjc3NDE3IDM2OS40MDg4OCwzOTcuNDMzNjkgMzcwLjEyMTYyLDQwMi4wNjQ3OSBDIDM3MS45NDUxOCw0MTMuMzMzOTMgMzc0LjMyNDE3LDQyNC41MDM3MyAzNzYuMTc0ODYsNDM1Ljc2ODEzIEMgMzc2Ljg2MDU1LDQzOS41NzEwNyAzNzcuNTAyOTcsNDQzLjM4MzMgMzc3LjkxOTczLDQ0Ny4yMjY2OSBDIDM3OC40NTgxOCw0NTIuMTg3MDggMzc4LjU3ODQ3LDQ1Ny4xODI3OSAzNzguNjI1LDQ2Mi4xNjg3MyBDIDM3OC42NDg5Myw0NzAuNzM3MDkgMzc4LjA1MDM4LDQ3OS4zMDA4NSAzNzguMjY0MzksNDg3Ljg2OTc0IEMgMzc4LjUwNjk5LDQ5MS4wNjUxNSAzNzguOTQzNjksNDk0LjM5NDI5IDM4MC42MzY3Niw0OTcuMTgxNTUgQyAzODEuNzE4MTgsNDk4LjkxNjEgMzgzLjU3NDcsNTAwLjI1Nzg2IDM4NS42NzExNyw1MDAuMjk5NjUgQyAzODcuNzk1ODQsNTAwLjM0ODAzIDM4OS44OTcwNCw0OTkuNTU5NzUgMzkxLjYzMzU0LDQ5OC4zNzA4MyBDIDM5Mi45ODAxMSw0OTcuMzQ0MjggMzk0LjEwMDQ0LDQ5Ni4wMjM2NyAzOTQuOTk4ODksNDk0LjU5MTcyIEMgMzk2LjQ5ODMxLDQ5Mi4wNTI0NiAzOTguMDYzMDcsNDg5LjUzOTEzIDM5OS4yMzAyOCw0ODYuODI3OTcgQyA0MDAuNjEzNTMsNDgzLjcyODgzIDQwMS45NjQ3Miw0ODAuNjE0IDQwMy4xNzAyNiw0NzcuNDM5ODkgQyA0MDQuNzkzMzgsNDczLjIxNjQ1IDQwNi40MjU2Nyw0NjguOTkwMTIgNDA4LjQ0MDc0LDQ2NC45MzQyIEMgNDExLjc3NzkxLDQ1Ny44NTI1MSA0MTUuMzQyNjYsNDUwLjg4MDExIDQxOS4wMDgyLDQ0My45NjM2MiBDIDQyMS4wNTA2MSw0NDAuMTMwNDIgNDIzLjIwOTIxLDQzNi4zNTYzMSA0MjUuNTU4NjUsNDMyLjcwMjkzIEMgNDI4LjQwMjU0LDQyOC41MTM0NyA0MzEuNDE2NjEsNDI0LjQ0MzE4IDQzNC40MjkxMiw0MjAuMzc0NjUgQyA0NDAuMjg2NSw0MTIuNTc0NTYgNDQ2LjMzMzY3LDQwNC45MTk2NCA0NTIuMjM2OTEsMzk3LjE1NDQ3IEMgNDU2Ljk3ODc5LDM5MC45ODYxNSA0NjEuNzUyMzUsMzg0Ljg0MDcxIDQ2Ni4zOTMxNywzNzguNTk1ODcgQyA0NjkuMzUzNzMsMzc0LjU5MTY2IDQ3Mi4yMjE2MywzNzAuNTE2MzIgNDc0Ljk0MjkzLDM2Ni4zNDU2OCBDIDQ3Ny44NDQwNiwzNjEuNzY4NDcgNDgwLjUyNzU3LDM1Ny4wMzUwNSA0ODIuNjc0MjksMzUyLjA1NDA1IEMgNDg0LjA3OTkzLDM0OC42NzM3OSA0ODUuMjcwMzYsMzQ1LjEzOSA0ODUuNDQyNzMsMzQxLjQ1Mjc5IEMgNDg1LjQ1OTkxLDM0MC41MzQxOSA0ODUuNTU4MjMsMzM5LjU4MjY5IDQ4NS4zMTI1LDMzOC42ODc1IEMgNDg1LjExNzgzLDMzOC4yMzM1OSA0ODQuNzAyNDYsMzM3Ljc4MTA5IDQ4NC4xNTYyNSwzMzcuOTM3NSB6IgotICAgICAgIGlkPSJ0ZXh0MjQ3NSIKLSAgICAgICBzdHlsZT0iZm9udC1zaXplOjQ5LjMyMTY5MzQycHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiM5OWNjMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO2ZvbnQtZmFtaWx5OlNhbnNhdGlvbjstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlNhbnNhdGlvbiIgLz4KLSAgICA8cGF0aAotICAgICAgIGQ9Ik0gMTQyLjU1NDY5LDM5My41NjYzOCBDIDE2NS4xNDgzOCwzOTMuNTY2NDYgMTc0LjI2NTU2LDQwNy4xMTMzMiAxNjkuOTA2MjUsNDM0LjIwNzAxIEwgMTIwLjE5NTMxLDQzNC4yMDcwMSBDIDEyMC4xOTUzLDQ0OS4zMDA3NyAxMjkuNzEwOTEsNDU2Ljg0NzY0IDE0OC43NDIxOSw0NTYuODQ3NjMgQyAxNTUuMjU3NzYsNDU2Ljg0NzY0IDE2MS43NzMzOCw0NTYuMTQ0NTIgMTY4LjI4OTA2LDQ1NC43MzgyNiBMIDE2OC4yODkwNiw0NjUuMjg1MTMgQyAxNjEuNzczMzgsNDY2LjY5MTM4IDE1My44NTE1Miw0NjcuMzk0NTEgMTQ0LjUyMzQ0LDQ2Ny4zOTQ1MSBDIDExOS42MzI4LDQ2Ny4zOTQ1MSAxMDcuMTg3NSw0NTQuODA4NTggMTA3LjE4NzUsNDI5LjYzNjY5IEMgMTA3LjE4NzUsNDA1LjU4OTg4IDExOC45NzY1NSwzOTMuNTY2NDYgMTQyLjU1NDY5LDM5My41NjYzOCBNIDEyMC4xOTUzMSw0MjMuMzc4ODggTCAxNTguMDIzNDQsNDIzLjM3ODg4IEMgMTU4LjY3OTY0LDQxMC40NDE0NCAxNTIuODIwMjcsNDAzLjk3MjY5IDE0MC40NDUzMSw0MDMuOTcyNjMgQyAxMjcuNzg5MDQsNDAzLjk3MjY5IDEyMS4wMzkwNSw0MTAuNDQxNDQgMTIwLjE5NTMxLDQyMy4zNzg4OCIKLSAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg4MS4wNDI1LDE5LjI5MTY3NikiCi0gICAgICAgaWQ9ImZsb3dSb290NDc4MyIKLSAgICAgICBzdHlsZT0iZm9udC1zaXplOjQwcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxO2ZvbnQtZmFtaWx5OlNhbnNhdGlvbjstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlNhbnNhdGlvbiIgLz4KLSAgICA8cGF0aAotICAgICAgIGQ9Ik0gMTA3LjE4NzUsNDQ0LjQwMjMyIEMgMTA3LjE4NzUsNDI5LjI2MTczIDExNy4xNzE4Nyw0MjEuNjkxNDMgMTM3LjE0MDYyLDQyMS42OTEzOCBDIDE0NC40OTk5Niw0MjEuNjkxNDMgMTUwLjkyMTgzLDQyMi4xNjAxOCAxNTYuNDA2MjUsNDIzLjA5NzYzIEwgMTU2LjQwNjI1LDQxNi4xMzY2OSBDIDE1Ni40MDYyLDQwOC4xMjExMyAxNDkuNzczMzksNDA0LjExMzMyIDEzNi41MDc4MSw0MDQuMTEzMjYgQyAxMjguOTE0MDQsNDA0LjExMzMyIDEyMS4xMzI4LDQwNS4yODUxOSAxMTMuMTY0MDYsNDA3LjYyODg4IEwgMTEzLjE2NDA2LDM5Ny4wODIwMSBDIDEyMS4xMzI4LDM5NC43MzgzMyAxMjguOTE0MDQsMzkzLjU2NjQ2IDEzNi41MDc4MSwzOTMuNTY2MzggQyAxNTguNDQ1MjYsMzkzLjU2NjQ2IDE2OS40MTQsNDAxLjQ0MTQ1IDE2OS40MTQwNiw0MTcuMTkxMzggTCAxNjkuNDE0MDYsNDY3LjM5NDUxIEwgMTYyLjgwNDY5LDQ2Ny4zOTQ1MSBMIDE1Ny42MDE1Niw0NjIuMTkxMzggQyAxNTEuMTc5NjQsNDY1LjY2MDEzIDE0My42MzI3OCw0NjcuMzk0NTEgMTM0Ljk2MDk0LDQ2Ny4zOTQ1MSBDIDExNi40NDUzLDQ2Ny4zOTQ1MSAxMDcuMTg3NSw0NTkuNzMwNDUgMTA3LjE4NzUsNDQ0LjQwMjMyIE0gMTU2LjQwNjI1LDQzMy42NDQ1MSBDIDE1MS4yNDk5Niw0MzIuNzA3MDQgMTQ0LjgyODA5LDQzMi4yMzgyOSAxMzcuMTQwNjIsNDMyLjIzODI2IEMgMTI1Ljg0MzczLDQzMi4yMzgyOSAxMjAuMTk1Myw0MzYuMjIyNjYgMTIwLjE5NTMxLDQ0NC4xOTEzOCBDIDEyMC4xOTUzLDQ1Mi42Mjg5IDEyNS4xMTcxNyw0NTYuODQ3NjQgMTM0Ljk2MDk0LDQ1Ni44NDc2MyBDIDE0My45NjA5LDQ1Ni44NDc2NCAxNTEuMTA5MzMsNDU0LjkyNTc3IDE1Ni40MDYyNSw0NTEuMDgyMDEgTCAxNTYuNDA2MjUsNDMzLjY0NDUxIgotICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDAwMDAyLDAsMCwxLDMyOS43MzgyOSwxOS4yOTE2NzYpIgotICAgICAgIGlkPSJmbG93Um9vdDQ4MDciCi0gICAgICAgc3R5bGU9ImZvbnQtc2l6ZTo0MHB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojNjY2NjY2O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtmb250LWZhbWlseTpTYW5zYXRpb247LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpTYW5zYXRpb24iIC8+Ci0gICAgPHBhdGgKLSAgICAgICBkPSJNIDEwNy4xODc1LDM2Ni44NDc2MyBMIDEwNy4xODc1LDQ2Ny4zOTQ1MSBMIDEyMC4xOTUzMSw0NjcuMzk0NTEgTCAxMjAuMTk1MzEsMzY2Ljg0NzYzIEwgMTA3LjE4NzUsMzY2Ljg0NzYzIgotICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDAwMDAyLDAsMCwxLDQwMy43OTkyOSwxOS4yOTE2NzYpIgotICAgICAgIGlkPSJmbG93Um9vdDQ4MTkiCi0gICAgICAgc3R5bGU9ImZvbnQtc2l6ZTo0MHB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7ZmlsbDojNjY2NjY2O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTtmb250LWZhbWlseTpTYW5zYXRpb247LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpTYW5zYXRpb24iIC8+Ci0gIDwvZz4KLSAgPGcKLSAgICAgaWQ9ImxheWVyMyI+Ci0gICAgPHJlY3QKLSAgICAgICB3aWR0aD0iMTEuODkxNTk3IgotICAgICAgIGhlaWdodD0iMTIuODA2MzM1IgotICAgICAgIHg9IjMzMy41NzQ1NSIKLSAgICAgICB5PSI0MDAuODczODQiCi0gICAgICAgaWQ9InJlY3Q0Njk1IgotICAgICAgIHN0eWxlPSJmaWxsOiM2NjY2NjY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KLSAgICA8cmVjdAotICAgICAgIHdpZHRoPSIxNS4wNzE0NzMiCi0gICAgICAgaGVpZ2h0PSIyMC4xMjQxNTciCi0gICAgICAgcnk9IjAuMzE0NDQxMzIiCi0gICAgICAgeD0iMjgxLjg5MTgyIgotICAgICAgIHk9IjQzOS43OTI0OCIKLSAgICAgICBpZD0icmVjdDQ2OTciCi0gICAgICAgc3R5bGU9ImZpbGw6IzY2NjY2NjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utb3BhY2l0eToxIiAvPgotICAgIDxyZWN0Ci0gICAgICAgd2lkdGg9IjExLjg5MTU5NyIKLSAgICAgICBoZWlnaHQ9IjEwLjUzMDY0NSIKLSAgICAgICB4PSIzMjcuNjk2OTkiCi0gICAgICAgeT0iNDEyLjg3MTU1IgotICAgICAgIGlkPSJyZWN0NDg5MSIKLSAgICAgICBzdHlsZT0iZmlsbDojNjY2NjY2O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+Ci0gIDwvZz4KLTwvc3ZnPgpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3BhcmVudC9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9wYXJlbnQvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDU2OTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3BhcmVudC9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3BhcmVudC9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3BhcmVudC9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGYzNjNhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9wYXJlbnQvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IKLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvcGFyZW50L3BvbS54bWwgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvcGFyZW50L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MzllZGYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3BhcmVudC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+NjwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4yLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBQcm9qZWN0IFBhcmVudDwvbmFtZT4KLSAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMjwvdXJsPgotCi0gICAgPGlzc3VlTWFuYWdlbWVudD4KLSAgICAgICAgPHN5c3RlbT5qaXJhPC9zeXN0ZW0+Ci0gICAgICAgIDx1cmw+aHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0VYVFZBTDwvdXJsPgotICAgIDwvaXNzdWVNYW5hZ2VtZW50PgotCi0gICAgPGNpTWFuYWdlbWVudD4KLSAgICAgICAgPHN5c3RlbT5jb250aW51dW08L3N5c3RlbT4KLSAgICAgICAgPHVybD5odHRwOi8vbXlmYWNlcy56b25lcy5hcGFjaGUub3JnOjgwODAvY29udGludXVtPC91cmw+Ci0gICAgICAgIDxub3RpZmllcnM+Ci0gICAgICAgICAgICA8bm90aWZpZXI+Ci0gICAgICAgICAgICAgICAgPHR5cGU+bWFpbDwvdHlwZT4KLSAgICAgICAgICAgICAgICA8c2VuZE9uU3VjY2Vzcz50cnVlPC9zZW5kT25TdWNjZXNzPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8YWRkcmVzcz5jb21taXRzQG15ZmFjZXMuYXBhY2hlLm9yZzwvYWRkcmVzcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L25vdGlmaWVyPgotICAgICAgICA8L25vdGlmaWVycz4KLSAgICA8L2NpTWFuYWdlbWVudD4KLSAgICAKLSAgICA8aW5jZXB0aW9uWWVhcj4yMDA4PC9pbmNlcHRpb25ZZWFyPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfTwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0KLSAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+Ci0gICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFyY2hpdmU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmU+Ci0gICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgotCi0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgICAgICAgIC0gQ29weSBMSUNFTlNFLnR4dCBhbmQgTk9USUNFLnR4dCBzbyB0aGF0IHRoZXkgYXJlIGluY2x1ZGVkCi0gICAgICAgICAgICAgICAgICAgIC0gaW4gdGhlIC1qYXZhZG9jIGphciBmaWxlIGZvciB0aGUgY29tcG9uZW50LgotICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmphdmFkb2MucmVzb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1zb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vYXBpZG9jcy9NRVRBLUlORiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IkxJQ0VOU0UudHh0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik5PVElDRS50eHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5qYXZhZG9jLnNpdGUuY29weTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+c2l0ZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDb3B5IGphdmFkb2MgdG8gYW5vdGhlciBkaXJlY3RvcnksIHRvIGtlZXAgamF2YWRvYyBvZiBwcmV2aW91cyB2ZXJzaW9ucyBvbiBzaXRlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc2l0ZS9hcGlkb2NzLSR7cHJvamVjdC52ZXJzaW9ufSIgZmFpbG9uZXJyb3I9ImZhbHNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3NpdGUvYXBpZG9jcyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPCEtLQotICAgICAgICAgICAgICAgIC0gTWFrZSBhIGNoZWNrc3R5bGUgdmlvbGF0aW9uIGEgY29tcGlsZSBlcnJvci4gTm90ZSB0aGF0IGlmIGEgY29tcGlsZSBlcnJvciBvY2N1cnMsCi0gICAgICAgICAgICAgICAgLSBmdXJ0aGVyIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0YXJnZXQvc2l0ZS9jaGVja3N0eWxlLmh0bWwgKHByZXNlbnQgZXZlbiB3aGVuCi0gICAgICAgICAgICAgICAgLSBqdXN0IHRoZSBjb21waWxlIGdvYWwgYW5kIG5vdCB0aGUgc2l0ZSBnb2FsIGhhcyBiZWVuIHJ1bikuIE5vdGUgYWxzbyB0aGF0IGNoaWxkCi0gICAgICAgICAgICAgICAgLSBwcm9qZWN0cyBtYXkgcmVkZWNsYXJlIHRoaXMgcGx1Z2luIGFuZCBwcm92aWRlIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIHNldHRpbmdzCi0gICAgICAgICAgICAgICAgLSB0byB1c2UgZGlmZmVyZW50IGNoZWNrcyAobW9yZSBvciBsZXNzIHN0cmljdCB0aGFuIHRoZSBkZWZhdWx0KS4KLSAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGVja3N0eWxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+dmVyaWZ5LXN0eWxlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNoZWNrPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlnTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdGFuZGFyZC54bWw8L2NvbmZpZ0xvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aGVhZGVyTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWhlYWRlci50eHQ8L2hlYWRlckxvY2F0aW9uPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBTZXQgY29tcGlsZSBzb3VyY2UgYXQgMS41LCBzaW5jZSB0aGUgdGFyZ2V0IEpTRiBpbXBsIGlzIDEuMiAtLT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgotICAgICAgICAgICAgICAgICAgICA8b3B0aW1pemU+ZmFsc2U8L29wdGltaXplPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgICAgICAgICAgIAotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotICAgIDxyZXBvc2l0b3JpZXM+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPm1hdmVuMi1yZXBvc2l0b3J5LmRldi5qYXZhLm5ldDwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5KYXZhLm5ldCBSZXBvc2l0b3J5IGZvciBNYXZlbjwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL2Rvd25sb2FkLmphdmEubmV0L21hdmVuLzEvPC91cmw+Ci0gICAgICAgICAgICA8bGF5b3V0PmxlZ2FjeTwvbGF5b3V0PgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgPC9yZXBvc2l0b3JpZXM+Ci0KLSAgICA8cmVwb3J0aW5nPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWp4ci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXJlcG9ydC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40LjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBtZC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cnVsZXNldHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvYmFzaWMueG1sPC9ydWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL3VudXNlZGNvZGUueG1sPC9ydWxlc2V0PgotICAgICAgICAgICAgICAgICAgICA8L3J1bGVzZXRzPgotICAgICAgICAgICAgICAgICAgICA8bGlua1hyZWY+dHJ1ZTwvbGlua1hyZWY+Ci0gICAgICAgICAgICAgICAgICAgIDxtaW5pbXVtVG9rZW5zPjEwMDwvbWluaW11bVRva2Vucz4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldEpkaz4xLjU8L3RhcmdldEpkaz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1jaGVja3Mtc3RhbmRhcmQueG1sPC9jb25maWdMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGhlYWRlckxvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1oZWFkZXIudHh0PC9oZWFkZXJMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvcmVwb3J0aW5nPgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvcGFyZW50PC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvcGFyZW50PC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9wYXJlbnQ8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgICAgICA8c25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICAgICAgPHVuaXF1ZVZlcnNpb24+ZmFsc2U8L3VuaXF1ZVZlcnNpb24+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLnNuYXBzaG90czwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgTWF2ZW4gU25hcHNob3QgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgPHNpdGU+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTI8L3VybD4KLSAgICAgICAgPC9zaXRlPgotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtYXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5wZXJmb3JtUmVsZWFzZTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvY3M8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxqc2YudmVyc2lvbj4xLjIuNDwvanNmLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzZTIwOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSAtLS0tLS0NCi1PdmVydmlldw0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBmb3IgSlNGIDEuMg0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS54IGFuZCBKU0YgMi54LiBBbGwgdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsNCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvcGFyZW50L3NyYy9zaXRlL2FwdC9qYXZhZG9jLmFwdCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9wYXJlbnQvc3JjL3NpdGUvYXB0L2phdmFkb2MuYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWZkMzZmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9wYXJlbnQvc3JjL3NpdGUvYXB0L2phdmFkb2MuYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIC0tLS0tLQ0KLUphdmFkb2MNCi0gLS0tLS0tDQotDQotSmF2YWRvYw0KLQ0KLSAgICBIZXJlIHlvdSBjYW4gZmluZCB0aGUgamF2YWRvYyBvZiBwcmV2aW91cyBleHR2YWwgdmVyc2lvbnMuDQotDQotICAgICoge3t7aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL215ZmFjZXMtZXh0dmFsLWNvcmUvYXBpZG9jcy0xLjIuMS9pbmRleC5odG1sfU15ZmFjZXMgRXh0VmFsIENvcmUgVmVyc2lvbiAxLjIuMX19DQotDQotICAgICoge3t7aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL3ZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb24vYXBpZG9jcy0xLjIuMS9pbmRleC5odG1sfU15ZmFjZXMgRXh0VmFsIFByb3BlcnR5IFZhbGlkYXRpb24gVmVyc2lvbiAxLjIuMX19DQotDQotICAgICoge3t7aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL215ZmFjZXMtZXh0dmFsLWNvcmUvYXBpZG9jcy0xLjIuMi9pbmRleC5odG1sfU15ZmFjZXMgRXh0VmFsIENvcmUgVmVyc2lvbiAxLjIuMn19DQotDQotICAgICoge3t7aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL3ZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb24vYXBpZG9jcy0xLjIuMi9pbmRleC5odG1sfU15ZmFjZXMgRXh0VmFsIFByb3BlcnR5IFZhbGlkYXRpb24gVmVyc2lvbiAxLjIuMn19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3BhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9wYXJlbnQvc3JjL3NpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ODY0OWYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3BhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCBuYW1lPSJBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciI+Ci0gIDxiYW5uZXJMZWZ0PgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dFZhbDwvbmFtZT4KLSAgICA8c3JjPmltYWdlcy9leHR2YWxfbG9nby5wbmc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2luZGV4Lmh0bWw8L2hyZWY+Ci0gIDwvYmFubmVyTGVmdD4KLQotICA8YmFubmVyUmlnaHQ+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXM8L25hbWU+Ci0gICAgPHNyYz5pbWcvYmFubmVycy9NeUZhY2VzX2xvZ28uanBnPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sPC9ocmVmPgotICA8L2Jhbm5lclJpZ2h0PgotCi0gIDxwdWJsaXNoRGF0ZSBmb3JtYXQ9ImRkIE1NTSB5eXl5Ii8+Ci0KLSAgPHNraW4+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLm1hdmVuPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtc2l0ZS1za2luPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvc2tpbj4KLQotICA8Ym9keT4KLSAgICA8bGlua3M+Ci0gICAgICA8aXRlbSBuYW1lPSJBcGFjaGUiIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZyIvPgotICAgICAgPGl0ZW0gbmFtZT0iTXlGYWNlcyIgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCBNeWZhY2VzIEV4dFZhbCIgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9kb3dubG9hZC5odG1sIi8+Ci0gICAgPC9saW5rcz4KLQotICAgIDxtZW51IG5hbWU9IkFwYWNoZSBNeUZhY2VzIiBpbmhlcml0PSJ0b3AiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZG93bmxvYWQuaHRtbCIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IG5hbWU9IkNvbnRlbnRzIiBpbmhlcml0PSJ0b3AiPgotICAgICAgICA8aXRlbSBuYW1lPSJNYWluIFNpdGUiICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sIi8+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkV4dFZhbCBmb3IgSlNGIDEuMSIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExL2luZGV4Lmh0bWwiIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9ImR1bW15IiAgICAgICAgaHJlZj0iZHVtbXkiLz4KLSAgICAgICAgPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjIiICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJDb3JlIE1vZHVsZSIgICAgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9teWZhY2VzLWV4dHZhbC1jb3JlL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iUHJvcGVydHkgVmFsaWRhdGlvbiIgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvdmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbi9pbmRleC5odG1sIi8+Ci0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IlRyaW5pZGFkIFN1cHBvcnQiICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2NvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdC9teWZhY2VzLWV4dHZhbC10cmluaWRhZC1zdXBwb3J0L2luZGV4Lmh0bWwiLz4KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iR2VuZXJpYyBTdXBwb3J0IiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydC9pbmRleC5odG1sIi8+Ci0gICAgICAgIDwvaXRlbT4KLSAgICA8L21lbnU+Ci0JCi0gICAgPG1lbnUgbmFtZT0iRG9jdW1lbnRhdGlvbiI+Ci0gICAgICA8aXRlbSBuYW1lPSJXaWtpIiAgICAgICAgIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvbXlmYWNlcy9FeHRlbnNpb25zL1ZhbGlkYXRvci8iLz4KLSAgICAgIDxpdGVtIG5hbWU9IkphdmFkb2MiICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2phdmFkb2MuaHRtbCIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IHJlZj0icmVwb3J0cyIvPgotCi0gICAgPG1lbnUgbmFtZT0iRm91bmRhdGlvbiIgaW5oZXJpdD0iYm90dG9tIj4KLSAgICAgIDxpdGVtIG5hbWU9IkFTRiIgICAgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIiAvPgotICAgICAgPGl0ZW0gbmFtZT0iU3BvbnNvcnNoaXAiICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3Nwb25zb3JzaGlwLmh0bWwiIC8+Ci0gICAgICA8aXRlbSBuYW1lPSJUaGFua3MiICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vdGhhbmtzLmh0bWwiIC8+Ci0gICAgPC9tZW51PgotICA8L2JvZHk+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvcG9tLnhtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2M3NTYxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj42PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLW1vZHVsZTwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjIuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIE1vZHVsZTwvbmFtZT4KLSAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMjwvdXJsPgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay88L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgICAgICA8c25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICAgICAgPHVuaXF1ZVZlcnNpb24+ZmFsc2U8L3VuaXF1ZVZlcnNpb24+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLnNuYXBzaG90czwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgTWF2ZW4gU25hcHNob3QgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgPHNpdGU+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTI8L3VybD4KLSAgICAgICAgPC9zaXRlPgotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotICAgIDwhLS0gV0FSTklORzogRE8gTk9UIEdFTkVSQVRFIFNJVEUgRlJPTSBIRVJFIERJUkVDVExZCi0gICAgU2luY2UgdGhpcyBwcm9qZWN0IGhhcyBhbiBhc3luYyByZWxlYXNlIHByb2NlZHVyZSAobm90Ci0gICAgYWxsIG1vZHVsZXMgc2hvdWxkIGJlIHJlbGVhc2VkIGF0IG9uY2UpLCB0aGUgcGFyZW50IHBvbS54bWwgCi0gICAgaXMgbm90IHRoaXMgKHRoZXJlIGlzIGEgbW9kdWxlIGZvciB0aGF0KS4gVXNlIG1hdmVuIHNpdGUgCi0gICAgcGx1Z2luIGhlcmUgY2F1c2UgcHJvYmxlbXMgd2hlbiB0aGUgc2l0ZSBpcyBnZW5lcmF0ZWQuCi0gICAgVGhlIHByb2NlZHVyZSBtdXN0IGV4ZWN1dGUgc2l0ZSBjb21tbWFuZCBmaXJzdCBvbiBwYXJlbnQgCi0gICAgbW9kdWxlIGFuZCB0aGVuIG9uIGVhY2ggbW9kdWxlIGxpc3RlZCBiZWxvdy4gCi0gICAgIC0tPgotCi0gICAgPG1vZHVsZXM+Ci0gICAgICAgIDxtb2R1bGU+cGFyZW50PC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+Y29yZTwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPnZhbGlkYXRpb24tbW9kdWxlczwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmNvbXBvbmVudC1zdXBwb3J0PC9tb2R1bGU+Ci0gICAgICAgIDwhLS1tb2R1bGU+dGVzdC1tb2R1bGVzPC9tb2R1bGUtLT4KLSAgICAgICAgPCEtLW1vZHVsZT5leGFtcGxlczwvbW9kdWxlLS0+Ci0gICAgPC9tb2R1bGVzPgotCi0gICAgPHByb2ZpbGVzPgotICAgICAgICA8IS0tIFRoaXMgcHJvZmlsZSBpcyBpbnZva2VkIGJ5IC1EcHJlcGFyZVJlbGVhc2U9dHJ1ZS4gIFRoaXMgYWxsb3dzIG12biByZWxlYXNlOnByZXBhcmUgdG8KLSAgICAgICAgICAgIHJ1biBzdWNjZXNzZnVsbHkgb24gdGhlIGFzc2VtYmx5IHByb2plY3RzLiAtLT4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+cHJlcGFyZS1yZWxlYXNlPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+cHJlcGFyZVJlbGVhc2U8L25hbWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxtb2R1bGVzPgotICAgICAgICAgICAgICAgIDxtb2R1bGU+YXNzZW1ibHk8L21vZHVsZT4KLSAgICAgICAgICAgIDwvbW9kdWxlcz4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ3VtZW50cz4tRHByZXBhcmVSZWxlYXNlPC9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotCi0gICAgPHJlcG9ydGluZz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kb2FwLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjYXRlZ29yeT53ZWItZnJhbWV3b3JrLCB2YWxpZGF0aW9uPC9jYXRlZ29yeT4KLSAgICAgICAgICAgICAgICAgICAgPGxhbmd1YWdlPkphdmE8L2xhbmd1YWdlPgotICAgICAgICAgICAgICAgICAgICA8c2hvcnRkZXNjPkpTRiBjZW50cmljIHZhbGlkYXRpb24gZnJhbWV3b3JrIGZvciBtZXRhZGF0YSBiYXNlZCB2YWxpZGF0aW9uLjwvc2hvcnRkZXNjPgotICAgICAgICAgICAgICAgICAgICA8cG1jPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmc8L3BtYz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvcmVwb3J0aW5nPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxqc2YudmVyc2lvbj4xLjIuNDwvanNmLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9zaXRlL3BvbS54bWwgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvc2l0ZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODY4ZTAyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9zaXRlL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gICAgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgICAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgICAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICAgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgICAqCi0gICAgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAgICoKLSAgICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+NjwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtc2l0ZTwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yPC9uYW1lPgotICAgIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjwvdXJsPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8ZGVmYXVsdEdvYWw+c2l0ZTwvZGVmYXVsdEdvYWw+Ci0gICAgICAgIDxleHRlbnNpb25zPgotICAgICAgICAgIDxleHRlbnNpb24+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLndhZ29uPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+d2Fnb24tc3NoLWV4dGVybmFsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wLWFscGhhLTU8L3ZlcnNpb24+Ci0gICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgIDwvZXh0ZW5zaW9ucz4KLSAgICA8L2J1aWxkPgotICAgIDxyZXBvcnRpbmc+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvcmVwb3J0aW5nPgotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rL3NpdGU8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay9zaXRlPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RydW5rL3NpdGU8L3VybD4KLSAgICA8L3NjbT4KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgIDxzaXRlPgotICAgICAgICA8aWQ+YXBhY2hlLXNpdGU8L2lkPgotICAgICAgICA8bmFtZT5BcGFjaGUgV2Vic2l0ZTwvbmFtZT4KLSAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yPC91cmw+Ci0gICAgICA8L3NpdGU+Ci0gICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvc2l0ZS9zcmMvc2l0ZS9hcHQvZG93bmxvYWQuYXB0IGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3NpdGUvc3JjL3NpdGUvYXB0L2Rvd25sb2FkLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1MTRlMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvc2l0ZS9zcmMvc2l0ZS9hcHQvZG93bmxvYWQuYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLSB+fiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gfn4gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotIH5+IHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gfn4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gfn4gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gfn4gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gfn4NCi0gfn4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gfn4NCi0gfn4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSB+fiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSB+fiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gfn4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSB+fiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gDQotIC0tLS0tLQ0KLURvd25sb2FkIEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotIC0tLS0tLQ0KLQ0KLURvd25sb2FkIEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotDQotDQotICBVc2UgdGhlIGxpbmtzIGJlbG93IHRvIGRvd25sb2FkIGEgZGlzdHJpYnV0aW9uIG9mIEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZyb20NCi0gIG9uZSBvZiBvdXIgbWlycm9ycy4gSXQgaXMgZ29vZCBwcmFjdGljZSB0byB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGUNCi0gIGRpc3RyaWJ1dGlvbiBmaWxlcy4NCi0NCi0gIFlvdSB3aWxsIGJlIHByb21wdGVkIGZvciBhIG1pcnJvciAtIGlmIHRoZSBmaWxlIGlzIG5vdCBmb3VuZCBvbiB5b3VycywgcGxlYXNlIGJlIHBhdGllbnQsIGFzIGl0IG1heSB0YWtlIDI0DQotICBob3VycyB0byByZWFjaCBhbGwgbWlycm9ycy4NCi0NCi0gIEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGRpc3RyaWJ1dGVkIGFzIGEgPDw8emlwPj4+IGFyY2hpdmUgKGZvciBXaW5kb3dzKSBhbmQNCi0gIGFzIGEgPDw8dGFyLmd6Pj4+IGFyY2hpdmUgKGZvciBVTklYKS4gVGhlIGNvbnRlbnQgaXMgdGhlIHNhbWUuIFBsZWFzZSBub3RlDQotICB0aGF0IHRoZSA8PDx0YXIuZ3o+Pj4gYXJjaGl2ZXMgY29udGFpbiBmaWxlIG5hbWVzIGxvbmdlciB0aGFuIDEwMCBjaGFyYWN0ZXJzIGFuZCBoYXZlIGJlZW4NCi0gIGNyZWF0ZWQgdXNpbmcgR05VIHRhciBleHRlbnNpb25zLiBUaHVzIHRoZXkgbXVzdCBiZSB1bnRhcnJlZCB3aXRoIGEgR05VIGNvbXBhdGlibGUNCi0gIHZlcnNpb24gb2YgdGFyLg0KLQ0KLSAgPDwgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgMS4wLjAgRGlzdHJpYnV0aW9uID4+DQotDQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCAgICAgICAgICAgICAgICAgICAgICAgICB8IE1pcnJvcnMgfCBDaGVja3N1bSB8IFNpZ25hdHVyZSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4xIDEuMS4yICh0YXIuZ3opICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nen0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nei5tZDV9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nei5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6LmFzY30gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6LmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjEgMS4xLjIgKHppcCkgICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnppcH0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4uemlwfX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnppcC5tZDV9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnppcC5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4uemlwLmFzY30gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4uemlwLmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjEgMS4xLjIgU291cmNlICh0YXIuZ3opICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy50YXIuZ3p9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnRhci5nen19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMudGFyLmd6Lm1kNX0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMudGFyLmd6Lm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMudGFyLmd6LmFzY30gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMudGFyLmd6LmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjEgMS4xLjIgU291cmNlICh6aXApICAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMuemlwfSBteWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy56aXB9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnppcC5tZDV9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnppcC5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnppcC5hc2N9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnppcC5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4yIDEuMi4yICh0YXIuZ3opICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnRhci5nen0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4udGFyLmd6fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnRhci5nei5tZDV9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnRhci5nei5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4udGFyLmd6LmFzY30gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4udGFyLmd6LmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjIgMS4yLjIgKHppcCkgICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnppcH0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4uemlwfX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnppcC5tZDV9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnppcC5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4uemlwLmFzY30gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4uemlwLmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjIgMS4yLjIgU291cmNlICh0YXIuZ3opICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy50YXIuZ3p9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnRhci5nen19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMudGFyLmd6Lm1kNX0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMudGFyLmd6Lm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMudGFyLmd6LmFzY30gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMudGFyLmd6LmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjIgMS4yLjIgU291cmNlICh6aXApICAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMuemlwfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy56aXB9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnppcC5tZDV9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnppcC5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnppcC5hc2N9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnppcC5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotDQotTGF0ZXN0IHNvdXJjZSBjb2RlIGZyb20gU1ZOIHJlcG9zaXRvcnkNCi0NCi0gICAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBsYXRlc3QgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZmVhdHVyZXMsIHRoZSBzb3VyY2UgY29kZSBpcyB1bmRlcg0KLSAgICB2ZXJzaW9uIGNvbnRyb2wgd2l0aCBTVk4uICBDbGljayB7e3tzb3VyY2UtcmVwb3NpdG9yeS5odG1sfSBoZXJlIH19DQotICAgIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIHRoZSBBU0YgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgU1ZOIFJlcG9zaXRvcnkuDQotDQotVmVyaWZ5aW5nIGNoZWNrc3Vtcw0KLQ0KLSAgICBJdCBpcyBlc3NlbnRpYWwgdGhhdCB5b3UgdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGRvd25sb2FkZWQNCi0gICAgZmlsZXMgdXNpbmcgdGhlIFBHUCBhbmQgTUQ1IHNpZ25hdHVyZXMuIE1ENSB2ZXJpZmljYXRpb24gZW5zdXJlcyB0aGUNCi0gICAgZmlsZSB3YXMgbm90IGNvcnJ1cHRlZCBkdXJpbmcgdGhlIGRvd25sb2FkIHByb2Nlc3MuIFBHUCB2ZXJpZmljYXRpb24NCi0gICAgZW5zdXJlcyB0aGF0IHRoZSBmaWxlIGNhbWUgZnJvbSBhIGNlcnRhaW4gcGVyc29uLg0KLQ0KLSAgICBUbyB2ZXJpZnkgdGhlIE1ENSBzaWduYXR1cmUgb24gdGhlIGZpbGVzLCB5b3UgbmVlZCB0byB1c2UgYSBwcm9ncmFtDQotICAgIGNhbGxlZCA8PDxtZDU+Pj4gb3IgPDw8bWQ1c3VtPj4+LCB3aGljaCBpcw0KLSAgICBpbmNsdWRlZCBpbiBtYW55IFVOSVggZGlzdHJpYnV0aW9ucy4gIEl0IGlzIGFsc28gYXZhaWxhYmxlIGFzIHBhcnQgb2YNCi0gICAge3t7aHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL3RleHR1dGlscy90ZXh0dXRpbHMuaHRtbH1HTlUgVGV4dHV0aWxzfX0uDQotICAgIFdpbmRvd3MgdXNlcnMgY2FuIGdldCBiaW5hcnkgbWQ1IHByb2dyYW1zIGZyb20ge3t7aHR0cDovL3d3dy5mb3VybWlsYWIuY2gvbWQ1L31oZXJlfX0sDQotICAgIHt7e2h0dHA6Ly93d3cucGMtdG9vbHMubmV0L3dpbjMyL2ZyZWV3YXJlL2NvbnNvbGUvfWhlcmV9fSwgb3INCi0gICAge3t7aHR0cDovL3d3dy5zbGF2YXNvZnQuY29tL2ZzdW0vfWhlcmV9fS4NCi0NCi1WZXJpZnlpbmcgc2lnbmF0dXJlcw0KLQ0KLSAgCVBHUCB2ZXJpZmljYXRpb24gZW5zdXJlcyB0aGF0IHRoZSBmaWxlIGNhbWUgZnJvbSBhIGNlcnRhaW4gcGVyc29uLiAgV2Ugc3Ryb25nbHkgcmVjb21tZW5kDQotCSAgeW91IHZlcmlmeSB5b3VyIGRvd25sb2FkcyB3aXRoIGJvdGggUEdQIGFuZCBNRDUuDQotDQotCVRoZSBQR1Agc2lnbmF0dXJlcyBjYW4gYmUgdmVyaWZpZWQgdXNpbmcge3t7aHR0cDovL3d3dy5wZ3BpLm9yZy99UEdQfX0gb3IgDQotCXt7e2h0dHA6Ly93d3cuZ251cGcub3JnL31HUEd9fS4gIEZpcnN0IGRvd25sb2FkIHRoZSBBcGFjaGUgTXlGYWNlcyANCi0Je3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9LRVlTfUtFWVN9fQlhcyB3ZWxsIGFzIHRoZSA8PDxhc2M+Pj4gc2lnbmF0dXJlIGZpbGUgDQotCWZvciB0aGUgcGFydGljdWxhciBkaXN0cmlidXRpb24uIEl0IGlzIGltcG9ydGFudCB0aGF0IHlvdSBnZXQgdGhlc2UgZmlsZXMgZnJvbSB0aGUgdWx0aW1hdGUNCi0JdHJ1c3RlZCBzb3VyY2UgLSB0aGUgbWFpbiBBU0YgZGlzdHJpYnV0aW9uIHNpdGUsIHJhdGhlciB0aGFuIGZyb20gYSBtaXJyb3IuDQotCVRoZW4gdmVyaWZ5IHRoZSBzaWduYXR1cmVzIHVzaW5nIC4uLg0KLQ0KLQkgIDw8PA0KLQkgICUgcGdwayAtYSBLRVlTDQotCSAgJSBwZ3B2IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nei5hc2MgbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6DQotCSAgPj4+DQotDQotCSAgPG9yPg0KLQ0KLQkgIDw8PA0KLQkgICUgcGdwIC1rYSBLRVlTDQotCSAgJSBwZ3AgbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6LmFzYyBteWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi50YXIuZ3oNCi0JICA+Pj4NCi0NCi0JICA8b3I+DQotDQotCSAgPDw8DQotICAJJSBncGcgLS1pbXBvcnQgS0VZUw0KLQkgICUgZ3BnIC0tdmVyaWZ5IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nei5hc2MgbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6DQotCSAgPj4+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3NpdGUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS9zaXRlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMDk1NTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3NpdGUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGEgSlNGIGNlbnRyaWMgdmFsaWRhdGlvbiBmcmFtZXdvcmsuDQotICANCi0gICAgSXQgb2ZmZXJzIHBvd2VyZnVsIGFuZCBlYXN5IHRvIHVzZSBmaWVsZCBiYXNlZCB2YWxpZGF0aW9uIGJhc2VkIG9uIGFubm90YXRpb25zLg0KLUl0IGhhcyBhIHBsdWdnYWJsZSBhcmNoaXRlY3R1cmUsIHNvIGl0IGlzIHBvc3NpYmxlIHRvIGFkZCBuZXcgdmFsaWRhdGlvbiBtb2R1bGVzIG9yIHN1cHBvcnQgZm9yIGNvbXBvbmVudCBsaWJyYXJpZXMgbGlrZSBUcmluaWRhZCBvciBvdGhlciAzcmQgcGFydHkgZnJhbWV3b3Jrcy4NCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEueCBhbmQgSlNGIDIueC4gQWxsIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrDQotDQotICAgIEZ1cnRoZXIgaW5mb3JtYXRpb24gYXJlIGF2YWlsYWJsZSBhdCB0aGUge3t7aHR0cDovL3dpa2kuYXBhY2hlLm9yZy9teWZhY2VzL0V4dGVuc2lvbnMvVmFsaWRhdG9yL31XaWtpfX0uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3NpdGUvc3JjL3NpdGUvc2l0ZS54bWwgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvc2l0ZS9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJjOWU4NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvc2l0ZS9zcmMvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCBuYW1lPSJBcGFjaGUgTXlmYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciI+Ci0gIDxiYW5uZXJMZWZ0PgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dFZhbDwvbmFtZT4KLSAgICA8c3JjPmltYWdlcy9leHR2YWxfbG9nby5wbmc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2luZGV4Lmh0bWw8L2hyZWY+Ci0gIDwvYmFubmVyTGVmdD4KLQotICA8YmFubmVyUmlnaHQ+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXM8L25hbWU+Ci0gICAgPHNyYz5pbWcvYmFubmVycy9NeUZhY2VzX2xvZ28uanBnPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sPC9ocmVmPgotICA8L2Jhbm5lclJpZ2h0PiAKLQotICA8cHVibGlzaERhdGUgZm9ybWF0PSJkZCBNTU0geXl5eSIvPgotCi0gIDxza2luPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5tYXZlbjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLXNpdGUtc2tpbjwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3NraW4+Ci0KLSAgPGJvZHk+Ci0gICAgPGxpbmtzPgotICAgICAgPGl0ZW0gbmFtZT0iQXBhY2hlIiBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmciLz4KLSAgICAgIDxpdGVtIG5hbWU9Ik15RmFjZXMiIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQgTXlmYWNlcyBFeHRWYWwiICAgICAgIGhyZWY9ImRvd25sb2FkLmh0bWwiLz4KLSAgICA8L2xpbmtzPgotCi0gICAgPG1lbnUgbmFtZT0iQXBhY2hlIE15RmFjZXMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9kb3dubG9hZC5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgbmFtZT0iQ29udGVudHMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9Ik1haW4gU2l0ZSIgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2luZGV4Lmh0bWwiLz4KLSAgICAgICAgPGl0ZW0gbmFtZT0iRXh0VmFsIGZvciBKU0YgMS4xIiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvaW5kZXguaHRtbCIgY29sbGFwc2U9InRydWUiPgotICAgICAgICAgICAgPGl0ZW0gbmFtZT0iZHVtbXkiICAgICAgICBocmVmPSJkdW1teSIvPgotICAgICAgICA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkV4dFZhbCBmb3IgSlNGIDEuMiIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2luZGV4Lmh0bWwiIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9ImR1bW15IiAgICAgICAgaHJlZj0iZHVtbXkiLz4KLSAgICAgICAgPC9pdGVtPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IG5hbWU9IkRvY3VtZW50YXRpb24iPgotICAgICAgPGl0ZW0gbmFtZT0iV2lraSIgICAgICAgICBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL215ZmFjZXMvRXh0ZW5zaW9ucy9WYWxpZGF0b3IvIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgcmVmPSJyZXBvcnRzIi8+Ci0KLSAgICA8bWVudSBuYW1lPSJGb3VuZGF0aW9uIiBpbmhlcml0PSJ0b3AiPgotICAgICAgPGl0ZW0gbmFtZT0iQVNGIiAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iIC8+Ci0gICAgICA8aXRlbSBuYW1lPSJTcG9uc29yc2hpcCIgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vc3BvbnNvcnNoaXAuaHRtbCIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlRoYW5rcyIgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi90aGFua3MuaHRtbCIgLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3BvbS54bWwgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTk5MWJlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZTwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBCYXNlLVRlc3QtSW5mcmFzdHJ1Y3R1cmU8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPnRlc3QtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL0Fic3RyYWN0RXhWYWxUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL0Fic3RyYWN0RXhWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjI3YjE2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9BYnN0cmFjdEV4VmFsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLio7DQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5lbC5Nb2NrRXhwcmVzc2lvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrLio7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UudXRpbC5UZXN0VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkV4dFZhbFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5EZWZhdWx0RmFjdG9yeUZpbmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlByb2plY3RTdGFnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5BYnN0cmFjdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWRfaW1wbC5jb25maWcuTXlmYWNlc0NvbmZpZzsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY3RvcnlGaW5kZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlJbnB1dDsNCi1pbXBvcnQgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogQWJzdHJhY3QgU2hhbGUgVGVzdCBiYXNlIGNsYXNzLCB3aGljaCBzZXRzIHVwIHRoZSBKU0YgZW52aXJvbm1lbnQuICBJZiB0aGUgdGVzdA0KLSAqIG92ZXJyaWRlcyA8Y29kZT5zZXRVcCgpPC9jb2RlPiBhbmQvb3IgPGNvZGU+dGVhckRvd24oKTwvY29kZT4sIHRoZW4gdGhvc2UNCi0gKiBtZXRob2RzIGJ1dCBjYWxsIHRoZSBvdmVyd2l0dGVuIG1ldGhvZCB0byBpbnN1cmUgYSB2YWxpZCB0ZXN0IGVudmlyb25tZW50Lg0KLSAqLw0KLUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RXhWYWxUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlDQotew0KLSAgICBwcm90ZWN0ZWQgTW9ja0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uOw0KLSAgICBwcm90ZWN0ZWQgTW9ja1NlcnZsZXRDb25maWcgY29uZmlnOw0KLSAgICBwcm90ZWN0ZWQgTW9ja0V4dGVybmFsQ29udGV4dCBleHRlcm5hbENvbnRleHQ7DQotICAgIHByb3RlY3RlZCBNb2NrRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dDsNCi0gICAgcHJvdGVjdGVkIE1vY2tGYWNlc0NvbnRleHRGYWN0b3J5IGZhY2VzQ29udGV4dEZhY3Rvcnk7DQotICAgIHByb3RlY3RlZCBNb2NrTGlmZWN5Y2xlIGxpZmVjeWNsZTsNCi0gICAgcHJvdGVjdGVkIE1vY2tMaWZlY3ljbGVGYWN0b3J5IGxpZmVjeWNsZUZhY3Rvcnk7DQotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgcmVuZGVyS2l0Ow0KLSAgICBwcm90ZWN0ZWQgTW9ja0h0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0Ow0KLSAgICBwcm90ZWN0ZWQgTW9ja0h0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2U7DQotICAgIHByb3RlY3RlZCBNb2NrU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQ7DQotICAgIHByb3RlY3RlZCBNb2NrSHR0cFNlc3Npb24gc2Vzc2lvbjsNCi0gICAgcHJvdGVjdGVkIE1vY2tFeHByZXNzaW9uRmFjdG9yeSBleHByZXNzaW9uRmFjdG9yeTsNCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciB0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXI7DQotDQotICAgIC8qKiBSZXNwb25zZSBXcml0ZXIgKi8NCi0gICAgcHJpdmF0ZSBNb2NrUmVzcG9uc2VXcml0ZXIgd3JpdGVyOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIEFic3RyYWN0RXhWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgICAgICBhcHBsaWNhdGlvbiA9IG51bGw7DQotICAgICAgICBjb25maWcgPSBudWxsOw0KLSAgICAgICAgZXh0ZXJuYWxDb250ZXh0ID0gbnVsbDsNCi0gICAgICAgIGZhY2VzQ29udGV4dCA9IG51bGw7DQotICAgICAgICBmYWNlc0NvbnRleHRGYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIGxpZmVjeWNsZSA9IG51bGw7DQotICAgICAgICBsaWZlY3ljbGVGYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIHJlbmRlcktpdCA9IG51bGw7DQotICAgICAgICByZXF1ZXN0ID0gbnVsbDsNCi0gICAgICAgIHJlc3BvbnNlID0gbnVsbDsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0ID0gbnVsbDsNCi0gICAgICAgIHNlc3Npb24gPSBudWxsOw0KLSAgICAgICAgZXhwcmVzc2lvbkZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogIFNldHVwIHRoZSB0ZXN0IGVudmlyb25tZW50LCBpbmNsdWRpbmcgdGhlIGZvbGxvd2luZzoNCi0gICAgICogIDx1bD4NCi0gICAgICogIDxsaT5TZXQgdGhlIEFwcGxpY2F0aW9uIE1hcC48L2xpPg0KLSAgICAgKiAgPGxpPlNldCBhIHJlc3BvbnNlIHdyaXRlcjwvbGk+DQotICAgICAqICA8bGk+QWRkIFRvbWFoYXdrJ3MgcmVuZGVyZXJzIHRvIHRoZSBmYWNlcyBjb250ZXh0LjwvbGk+DQotICAgICAqICA8L3VsPg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHRocmVhZENvbnRleHRDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7DQotICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFswXSwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKSk7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dCA9IG5ldyBNb2NrU2VydmxldENvbnRleHQoKTsNCi0gICAgICAgIC8vZm9yIHRlc3RpbmcgdGhlIGZhbGxiYWNrDQotICAgICAgICAvL3NlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCArICIuREVBQ1RJVkFURV9FTF9SRVNPTFZFUiIsICJ0cnVlIik7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVggKyAiLkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkiLCBNb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihFeHRWYWxJbmZvcm1hdGlvbi5XRUJYTUxfUEFSQU1fUFJFRklYICsgIi5DVVNUT01fTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZIiwgTW9ja01lc3NhZ2VSZXNvbHZlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoRXh0VmFsSW5mb3JtYXRpb24uV0VCWE1MX1BBUkFNX1BSRUZJWCArICIuQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZIiwgTW9ja01ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICBjb25maWcgPSBuZXcgTW9ja1NlcnZsZXRDb25maWcoc2VydmxldENvbnRleHQpOw0KLSAgICAgICAgc2Vzc2lvbiA9IG5ldyBNb2NrSHR0cFNlc3Npb24oKTsNCi0gICAgICAgIHNlc3Npb24uc2V0U2VydmxldENvbnRleHQoc2VydmxldENvbnRleHQpOw0KLSAgICAgICAgcmVxdWVzdCA9IG5ldyBNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0KHNlc3Npb24pOw0KLSAgICAgICAgcmVxdWVzdC5zZXRTZXJ2bGV0Q29udGV4dChzZXJ2bGV0Q29udGV4dCk7DQotICAgICAgICByZXNwb25zZSA9IG5ldyBNb2NrSHR0cFNlcnZsZXRSZXNwb25zZSgpOw0KLSAgICAgICAgRmFjdG9yeUZpbmRlci5yZWxlYXNlRmFjdG9yaWVzKCk7DQotICAgICAgICBGYWN0b3J5RmluZGVyLnNldEZhY3RvcnkoImphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeSIsIEV4dFZhbE1vY2tBcHBsaWNhdGlvbkZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIEZhY3RvcnlGaW5kZXIuc2V0RmFjdG9yeSgiamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHRGYWN0b3J5IiwgIm9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tGYWNlc0NvbnRleHRGYWN0b3J5Iik7DQotICAgICAgICBGYWN0b3J5RmluZGVyLnNldEZhY3RvcnkoImphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGVGYWN0b3J5IiwgIm9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tMaWZlY3ljbGVGYWN0b3J5Iik7DQotICAgICAgICBGYWN0b3J5RmluZGVyLnNldEZhY3RvcnkoImphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5IiwgIm9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tSZW5kZXJLaXRGYWN0b3J5Iik7DQotICAgICAgICBleHRlcm5hbENvbnRleHQgPSBuZXcgTW9ja0V4dGVybmFsQ29udGV4dChzZXJ2bGV0Q29udGV4dCwgcmVxdWVzdCwgcmVzcG9uc2UpOw0KLSAgICAgICAgbGlmZWN5Y2xlRmFjdG9yeSA9IChNb2NrTGlmZWN5Y2xlRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoImphdmF4LmZhY2VzLmxpZmVjeWNsZS5MaWZlY3ljbGVGYWN0b3J5Iik7DQotICAgICAgICBsaWZlY3ljbGUgPSAoTW9ja0xpZmVjeWNsZSlsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZSgiREVGQVVMVCIpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0RmFjdG9yeSA9IChNb2NrRmFjZXNDb250ZXh0RmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoImphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0RmFjdG9yeSIpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0ID0gKE1vY2tGYWNlc0NvbnRleHQpZmFjZXNDb250ZXh0RmFjdG9yeS5nZXRGYWNlc0NvbnRleHQoc2VydmxldENvbnRleHQsIHJlcXVlc3QsIHJlc3BvbnNlLCBsaWZlY3ljbGUpOw0KLSAgICAgICAgZXh0ZXJuYWxDb250ZXh0ID0gKE1vY2tFeHRlcm5hbENvbnRleHQpZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpOw0KLSAgICAgICAgVUlWaWV3Um9vdCByb290ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIHJvb3Quc2V0Vmlld0lkKCIvdmlld0lkIik7DQotICAgICAgICByb290LnNldFJlbmRlcktpdElkKCJIVE1MX0JBU0lDIik7DQotICAgICAgICBmYWNlc0NvbnRleHQuc2V0Vmlld1Jvb3Qocm9vdCk7DQotICAgICAgICBBcHBsaWNhdGlvbkZhY3RvcnkgYXBwbGljYXRpb25GYWN0b3J5ID0gKEFwcGxpY2F0aW9uRmFjdG9yeSlGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoImphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeSIpOw0KLSAgICAgICAgYXBwbGljYXRpb24gPSAoTW9ja0FwcGxpY2F0aW9uKWFwcGxpY2F0aW9uRmFjdG9yeS5nZXRBcHBsaWNhdGlvbigpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0LnNldEFwcGxpY2F0aW9uKGFwcGxpY2F0aW9uKTsNCi0gICAgICAgIFJlbmRlcktpdEZhY3RvcnkgcmVuZGVyS2l0RmFjdG9yeSA9IChSZW5kZXJLaXRGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeSgiamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3RvcnkiKTsNCi0gICAgICAgIC8vV3JhcCByZW5kZXJlcnMgd2l0aCBwcm9wZXIgZXh2YWwgd3JhcHBlcg0KLSAgICAgICAgcmVuZGVyS2l0ID0gbmV3IERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpLmNyZWF0ZShuZXcgTW9ja1JlbmRlcktpdCgpKTsNCi0gICAgICAgIHJlbmRlcktpdEZhY3RvcnkuYWRkUmVuZGVyS2l0KCJIVE1MX0JBU0lDIiwgcmVuZGVyS2l0KTsNCi0NCi0gICAgICAgIC8vIGFkZGl0aW9uYWwgc2V0dXAgbm90IHByb3ZpZGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHNoYWxlIG1vY2sgc3R1ZmYNCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbk1hcCgpLnB1dChNeWZhY2VzQ29uZmlnLmNsYXNzLmdldE5hbWUoKSwgbmV3IE15ZmFjZXNDb25maWcoKSk7DQotICAgICAgICB3cml0ZXIgPSBuZXcgTW9ja1Jlc3BvbnNlV3JpdGVyKG5ldyBTdHJpbmdXcml0ZXIoKSwgbnVsbCwgbnVsbCk7DQotICAgICAgICBmYWNlc0NvbnRleHQuc2V0UmVzcG9uc2VXcml0ZXIod3JpdGVyKTsNCi0NCi0gICAgICAgIFRlc3RVdGlscy5hZGREZWZhdWx0UmVuZGVyZXJzKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBUZXN0VXRpbHMuYWRkRGVmYXVsdFZhbGlkYXRvcnMoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGV4cHJlc3Npb25GYWN0b3J5ID0gKE1vY2tFeHByZXNzaW9uRmFjdG9yeSlhcHBsaWNhdGlvbi5nZXRFeHByZXNzaW9uRmFjdG9yeSgpOw0KLQ0KLSAgICAgICAgZmluYWwgRUxIZWxwZXIgZGVmYXVsdEVsSGVscGVyID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRUxfSEVMUEVSX0ZBQ1RPUlksIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuc2V0Q3VzdG9tRUxIZWxwZXJGYWN0b3J5KG5ldyBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeSgpIHsNCi0NCi0gICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBFTEhlbHBlciBjcmVhdGVFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2NrRUxIZWxwZXIoZGVmYXVsdEVsSGVscGVyKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSk7DQotDQotICAgICAgICAvL2V4ZWN1dGUgc3RhcnR1cCBsaXN0ZW5lcg0KLSAgICAgICAgbmV3IEV4dFZhbFN0YXJ0dXBMaXN0ZW5lcigpIHsNCi0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzg2MTgxMDYwNTE2MDI4MTg4NEw7DQotDQotICAgICAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShQcm9qZWN0U3RhZ2VSZXNvbHZlci5jbGFzcy5nZXROYW1lKCksIGdldFByb2plY3RTdGFnZVJlc29sdmVyKCksIGZhbHNlKTsNCi0gICAgICAgICAgICAgICAgc3VwZXIuaW5pdCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0uaW5pdCgpOw0KLQ0KLSAgICAgICAgaW52b2tlU3RhcnR1cExpc3RlbmVycygpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGludm9rZVN0YXJ0dXBMaXN0ZW5lcnMoKTsNCi0NCi0gICAgLyoqDQotICAgICAqIFRlYXIgZG93biB0aGUgdGVzdCBlbnZpcm9ubWVudC4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICByZXNldEZhY3RvcnlGaW5kZXIoKTsNCi0gICAgICAgIHJlc2V0RXh0VmFsQ29udGV4dCgpOw0KLQ0KLSAgICAgICAgYXBwbGljYXRpb24gPSBudWxsOw0KLSAgICAgICAgY29uZmlnID0gbnVsbDsNCi0gICAgICAgIGV4dGVybmFsQ29udGV4dCA9IG51bGw7DQotICAgICAgICBmYWNlc0NvbnRleHQucmVsZWFzZSgpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0ID0gbnVsbDsNCi0gICAgICAgIGxpZmVjeWNsZSA9IG51bGw7DQotICAgICAgICBsaWZlY3ljbGVGYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIHJlbmRlcktpdCA9IG51bGw7DQotICAgICAgICByZXF1ZXN0ID0gbnVsbDsNCi0gICAgICAgIHJlc3BvbnNlID0gbnVsbDsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0ID0gbnVsbDsNCi0gICAgICAgIHNlc3Npb24gPSBudWxsOw0KLSAgICAgICAgRmFjdG9yeUZpbmRlci5yZWxlYXNlRmFjdG9yaWVzKCk7DQotICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcih0aHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIpOw0KLSAgICAgICAgZXhwcmVzc2lvbkZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgdGhyZWFkQ29udGV4dENsYXNzTG9hZGVyID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgRmllbGQgZmFjdG9yeU1hcCA9IERlZmF1bHRGYWN0b3J5RmluZGVyLmNsYXNzLmdldERlY2xhcmVkRmllbGQoImZhY3RvcnlNYXAiKTsNCi0gICAgICAgICAgICBmYWN0b3J5TWFwLnNldEFjY2Vzc2libGUodHJ1ZSk7DQotICAgICAgICAgICAgZmFjdG9yeU1hcC5zZXQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpLCBuZXcgSGFzaE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4oKSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY2Fubm90IHJlc2V0IHRoZSBmYWN0b3J5IGZpbmRlciIsIHQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlc2V0RXh0VmFsQ29udGV4dCgpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZpZWxkIGNvbnRleHQgPSBFeHRWYWxDb250ZXh0LmNsYXNzLmdldERlY2xhcmVkRmllbGQoImV4dFZhbENvbnRleHQiKTsNCi0gICAgICAgICAgICBjb250ZXh0LnNldEFjY2Vzc2libGUodHJ1ZSk7DQotICAgICAgICAgICAgY29udGV4dC5zZXQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCksIG51bGwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbm5vdCByZXNldCB0aGUgZXh0dmFsLWNvbnRleHQiLCB0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja01lc3NhZ2VDb3VudChpbnQgZXhwZWN0ZWQpDQotICAgIHsNCi0gICAgICAgIGludCBpID0gMDsNCi0gICAgICAgIGZvcihJdGVyYXRvciBtZXNzYWdlcyA9IGZhY2VzQ29udGV4dC5nZXRNZXNzYWdlcygpOyBtZXNzYWdlcy5oYXNOZXh0KCk7KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1lc3NhZ2VzLm5leHQoKTsNCi0gICAgICAgICAgICBpKys7DQotICAgICAgICB9DQotDQotICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbXBsZXRlIG1lc3NhZ2UgY291bnQiLCBleHBlY3RlZCwgaSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tNZXNzYWdlQ291bnQoU3RyaW5nIGNsaWVudElkLCBpbnQgZXhwZWN0ZWQpDQotICAgIHsNCi0gICAgICAgIGludCBpID0gMDsNCi0gICAgICAgIGZvcihJdGVyYXRvciBtZXNzYWdlcyA9IGZhY2VzQ29udGV4dC5nZXRNZXNzYWdlcyhjbGllbnRJZCk7IG1lc3NhZ2VzLmhhc05leHQoKTspDQotICAgICAgICB7DQotICAgICAgICAgICAgbWVzc2FnZXMubmV4dCgpOw0KLSAgICAgICAgICAgIGkrKzsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGFzc2VydEVxdWFscygiQ29tcGxldGUgbWVzc2FnZSBjb3VudCIsIGV4cGVjdGVkLCBpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TZXZlcml0eS4uLiBzZXZlcml0aWVzKQ0KLSAgICB7DQotICAgICAgICBpbnQgaSA9IDA7DQotICAgICAgICBmb3IoSXRlcmF0b3IgbWVzc2FnZXMgPSBmYWNlc0NvbnRleHQuZ2V0TWVzc2FnZXMoKTsgbWVzc2FnZXMuaGFzTmV4dCgpOykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc2V2ZXJpdGllc1tpXSwgKChGYWNlc01lc3NhZ2UpbWVzc2FnZXMubmV4dCgpKS5nZXRTZXZlcml0eSgpKTsNCi0gICAgICAgICAgICBpKys7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoYm9vbGVhbiBpc0Jsb2NrZWQpDQotICAgIHsNCi0gICAgICAgIGFzc2VydEVxdWFscyhpc0Jsb2NrZWQsIHRoaXMuZmFjZXNDb250ZXh0LmdldFJlbmRlclJlc3BvbnNlKCkpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBWZXJpZnkgdGhlIGZvbGxvd2luZzoNCi0gICAgICogPHVsPg0KLSAgICAgKiA8bGk+aWQgaXMgbm90IG51bGw8L2xpPg0KLSAgICAgKiA8bGk+UmVzcG9uc2UgaXMgY29tcGxldGU8L2xpPg0KLSAgICAgKiA8bGk+UmVzcG9uY2UgY29udGFpbnMgdGhlIGlkPC9saT4NCi0gICAgICogPC91bD4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIGlkIElEIHRvIHZlcmlmeQ0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0SWRFeGlzdHMoU3RyaW5nIGlkKQ0KLSAgICB7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJJRCBpcyBub3QgbnVsbCIsIGlkKTsNCi0gICAgICAgIGFzc2VydFRydWUoIlJlc3BvbnNlIENvbXBsZXRlIiwgZmFjZXNDb250ZXh0LmdldFJlc3BvbnNlQ29tcGxldGUoKSk7DQotICAgICAgICBTdHJpbmcgb3V0cHV0ID0gd3JpdGVyLmdldFdyaXRlcigpLnRvU3RyaW5nKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJIYXMgb3V0cHV0Iiwgb3V0cHV0KTsNCi0gICAgICAgIGFzc2VydFRydWUoIkNvbnRhaW5zIGlkICciICsgaWQgKyAiJyIsIG91dHB1dC5pbmRleE9mKGlkKSAhPSAtMSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmFsdWVCaW5kaW5nKFVJSW5wdXQgdWlJbnB1dCwgU3RyaW5nIG5hbWUsIFN0cmluZyBleHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmcgdmFsdWVCaW5kaW5nID0gYXBwbGljYXRpb24uY3JlYXRlVmFsdWVCaW5kaW5nKGV4cHJlc3Npb24pOw0KLSAgICAgICAgVmFsdWVFeHByZXNzaW9uIHZhbHVlRXhwcmVzc2lvbiA9IGV4cHJlc3Npb25GYWN0b3J5LmNyZWF0ZVZhbHVlRXhwcmVzc2lvbigNCi0gICAgICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RUxDb250ZXh0KCksIGV4cHJlc3Npb24sIE9iamVjdC5jbGFzcyk7DQotDQotICAgICAgICBpZih1aUlucHV0ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdWlJbnB1dC5zZXRWYWx1ZUJpbmRpbmcobmFtZSwgdmFsdWVCaW5kaW5nKTsNCi0gICAgICAgICAgICB1aUlucHV0LnNldFZhbHVlRXhwcmVzc2lvbihuYW1lLCB2YWx1ZUV4cHJlc3Npb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKFN0cmluZyBuYW1lLCBPYmplY3QgaW5zdGFuY2UpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhudWxsLCAidmFsdWUiLCAiI3siICsgbmFtZSArICJ9Iik7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dChuYW1lLCBpbnN0YW5jZSk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiIsICJ1bmNoZWNrZWQifSkNCi0gICAgcHJvdGVjdGVkIDxUPiBUIHJlc29sdmVCZWFuKFN0cmluZyBuYW1lLCBDbGFzczxUPiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChUKSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4obmFtZSk7DQotICAgIH0NCi19DQotDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9FeHRWYWxNb2NrQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI1YjNlMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9FeHRWYWxNb2NrQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UubW9jazsKLQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbjsKLQotaW1wb3J0IGphdmF4LmVsLkVMQ29udGV4dExpc3RlbmVyOwotaW1wb3J0IGphdmF4LmVsLkVMUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXguZWwuRXhwcmVzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguZWwuRUxFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRWYWxNb2NrQXBwbGljYXRpb24gZXh0ZW5kcyBNb2NrQXBwbGljYXRpb24KLXsKLSAgICBwcml2YXRlIEFwcGxpY2F0aW9uIHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsTW9ja0FwcGxpY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEV4dFZhbE1vY2tBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IGFwcGxpY2F0aW9uOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFTENvbnRleHRMaXN0ZW5lcltdIGdldEVMQ29udGV4dExpc3RlbmVycygpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEVMQ29udGV4dExpc3RlbmVyWzBdOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFTFJlc29sdmVyIGdldEVMUmVzb2x2ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZC5nZXRFTFJlc29sdmVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEV4cHJlc3Npb25GYWN0b3J5IGdldEV4cHJlc3Npb25GYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRXh0VmFsTW9ja0V4cHJlc3Npb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBldmFsdWF0ZUV4cHJlc3Npb25HZXQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIGV4cHJlc3Npb24sIENsYXNzIGFDbGFzcykgdGhyb3dzIEVMRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5ldmFsdWF0ZUV4cHJlc3Npb25HZXQoZmFjZXNDb250ZXh0LCBleHByZXNzaW9uLCBhQ2xhc3MpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9FeHRWYWxNb2NrQXBwbGljYXRpb25GYWN0b3J5LmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9FeHRWYWxNb2NrQXBwbGljYXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjJjMzguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svRXh0VmFsTW9ja0FwcGxpY2F0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja0FwcGxpY2F0aW9uRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICovCi1wdWJsaWMgY2xhc3MgRXh0VmFsTW9ja0FwcGxpY2F0aW9uRmFjdG9yeSBleHRlbmRzIE1vY2tBcHBsaWNhdGlvbkZhY3RvcnkKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxNb2NrQXBwbGljYXRpb24oc3VwZXIuZ2V0QXBwbGljYXRpb24oKSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL0V4dFZhbE1vY2tFeHByZXNzaW9uRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svRXh0VmFsTW9ja0V4cHJlc3Npb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NTgxMTYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svRXh0VmFsTW9ja0V4cHJlc3Npb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLm1vY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QuZWwuTW9ja0V4cHJlc3Npb25GYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZWwuRUxDb250ZXh0OwotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqLwotcHVibGljIGNsYXNzIEV4dFZhbE1vY2tFeHByZXNzaW9uRmFjdG9yeSBleHRlbmRzIE1vY2tFeHByZXNzaW9uRmFjdG9yeQotewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWYWx1ZUV4cHJlc3Npb24gY3JlYXRlVmFsdWVFeHByZXNzaW9uKEVMQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgZXhwcmVzc2lvbiwgQ2xhc3MgZXhwZWN0ZWRUeXBlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uKGV4cHJlc3Npb24sIGV4cGVjdGVkVHlwZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL0V4dFZhbE1vY2tWYWx1ZUV4cHJlc3Npb24uamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL0V4dFZhbE1vY2tWYWx1ZUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4MmQ4OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9FeHRWYWxNb2NrVmFsdWVFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRXh0VmFsRUxSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QuZWwuTW9ja1ZhbHVlRXhwcmVzc2lvbjsKLQotaW1wb3J0IGphdmF4LmVsLkVMQ29udGV4dDsKLWltcG9ydCBqYXZheC5lbC5FTFJlc29sdmVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICovCi0vL1RPRE8gaW1wcm92ZQotcHVibGljIGNsYXNzIEV4dFZhbE1vY2tWYWx1ZUV4cHJlc3Npb24gZXh0ZW5kcyBNb2NrVmFsdWVFeHByZXNzaW9uCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBlbGVtZW50cyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZXhwcmVzc2lvbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTg1ODg3MTY1NDU2MTk0MjEwNDFMOwotCi0gICAgcHVibGljIEV4dFZhbE1vY2tWYWx1ZUV4cHJlc3Npb24oU3RyaW5nIGV4cHJlc3Npb24sIENsYXNzIGV4cGVjdGVkVHlwZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKGV4cHJlc3Npb24sIGV4cGVjdGVkVHlwZSk7Ci0KLSAgICAgICAgaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJFeHByZXNzaW9uIHN0cmluZyBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKLSAgICAgICAgcGFyc2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKEVMQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgRUxSZXNvbHZlciByZXNvbHZlciA9IGNvbnRleHQuZ2V0RUxSZXNvbHZlcigpOwotCi0gICAgICAgIGlmIChyZXNvbHZlciBpbnN0YW5jZW9mIEV4dFZhbEVMUmVzb2x2ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRCYXNlKGNvbnRleHQsIHJlc29sdmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRWYWx1ZShjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShFTENvbnRleHQgY29udGV4dCwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKGNvbnRleHQuZ2V0RUxSZXNvbHZlcigpIGluc3RhbmNlb2YgRXh0VmFsRUxSZXNvbHZlcikKLSAgICAgICAgewotICAgICAgICAgICAgY29udGV4dC5nZXRFTFJlc29sdmVyKCkuc2V0VmFsdWUoY29udGV4dCwgZ2V0VmFsdWUoY29udGV4dCksIGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBiYXNlID0gZ2V0QmFzZShjb250ZXh0LCBjb250ZXh0LmdldEVMUmVzb2x2ZXIoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgc2V0dGVyID0gInNldCIgKyBjcmVhdGVQcm9wZXJ0eVN0cmluZygpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNZXRob2Qgc2V0dGVyTWV0aG9kID0gYmFzZS5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKHNldHRlciwgdmFsdWUgIT0gbnVsbCA/IHZhbHVlLmdldENsYXNzKCkgOiBPYmplY3QuY2xhc3MpOwotICAgICAgICAgICAgICAgIHNldHRlck1ldGhvZC5pbnZva2UoYmFzZSwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKEVMQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgYmFzZSA9IGdldEJhc2UoY29udGV4dCwgY29udGV4dC5nZXRFTFJlc29sdmVyKCkpOwotCi0gICAgICAgIGlmIChiYXNlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGdldHRlciA9ICJnZXQiICsgY3JlYXRlUHJvcGVydHlTdHJpbmcoKTsKLQotICAgICAgICAgICAgTWV0aG9kIGdldHRlck1ldGhvZDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldHRlck1ldGhvZCA9IGJhc2UuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZChnZXR0ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiBnZXR0ZXJNZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldHRlciA9ICJpcyIgKyBjcmVhdGVQcm9wZXJ0eVN0cmluZygpOwotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBnZXR0ZXJNZXRob2QgPSBiYXNlLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2QoZ2V0dGVyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldHRlck1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZTEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlKCkKLSAgICB7Ci0KLSAgICAgICAgaWYgKGlzTGl0ZXJhbFRleHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZWxlbWVudHMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4cHJlc3Npb24uc3RhcnRzV2l0aCgiJHsiKSB8fCBleHByZXNzaW9uLnN0YXJ0c1dpdGgoIiN7IikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChleHByZXNzaW9uLmVuZHNXaXRoKCJ9IikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgZXhwciA9IG5ldyBTdHJpbmdCdWZmZXIoZXhwcmVzc2lvbi5zdWJzdHJpbmcoMiwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpLnJlcGxhY2VBbGwoIiAiLCAiIikpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNCbG9ja09uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGV4cHIubGVuZ3RoKCkgLSAxOyBpID4gLTE7IGktLSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChleHByLmNoYXJBdChpKSA9PSAnICcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZGVsZXRlQ2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4cHIuY2hhckF0KGkpID09ICddJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhwci5kZWxldGVDaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhwci5jaGFyQXQoaSkgPT0gJ1snKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHByLmRlbGV0ZUNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHByLmNoYXJBdChpKSA9PSAnXCcnKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQmxvY2tPbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLmRlbGV0ZUNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcy5hZGQoMCwgZXhwci5zdWJzdHJpbmcoaSArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLmRlbGV0ZShpLCBleHByLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlzQmxvY2tPbiA9ICFpc0Jsb2NrT247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhwci5jaGFyQXQoaSkgPT0gJy4nICYmICFpc0Jsb2NrT24pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZCgwLCBleHByLnN1YnN0cmluZyhpICsgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXhwci5kZWxldGUoaSwgZXhwci5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGV4cHIubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXMuYWRkKDAsIGV4cHIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZWxlbWVudHMgPSAoU3RyaW5nW10pIG5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tuYW1lcy5zaXplKCldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV4cHJlc3Npb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihleHByZXNzaW9uKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRCYXNlKEVMQ29udGV4dCBjb250ZXh0LCBFTFJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgT2JqZWN0IGJhc2UgPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aCAtIDE7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgYmFzZSA9IHJlc29sdmVyLmdldFZhbHVlKGNvbnRleHQsIGJhc2UsIGVsZW1lbnRzW2ldKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmFzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVQcm9wZXJ0eVN0cmluZygpCi0gICAgewotICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBlbGVtZW50c1tlbGVtZW50cy5sZW5ndGggLSAxXTsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEsIHByb3BlcnR5Lmxlbmd0aCgpKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svTW9ja0VMSGVscGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrRUxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGViMjFlMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrRUxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UubW9jazsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRUxIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi0NCi1wdWJsaWMgY2xhc3MgTW9ja0VMSGVscGVyIGltcGxlbWVudHMgRUxIZWxwZXINCi17DQotICAgIHByaXZhdGUgRUxIZWxwZXIgd3JhcHBlZDsNCi0NCi0gICAgcHVibGljIE1vY2tFTEhlbHBlcihFTEhlbHBlciB3cmFwcGVkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmVhbihTdHJpbmcgYmVhbk5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldEJlYW4oYmVhbk5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBpZigiI3t0cnVlfSIuZXF1YWxzKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFR5cGVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvcGVydHlEZXRhaWxzIGdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaXNFTFRlcm1WYWxpZChmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRUxUZXJtV2VsbEZvcm1lZChPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaXNFTFRlcm1XZWxsRm9ybWVkKG8pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QmluZGluZ09mQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0QmluZGluZ09mQ29tcG9uZW50KHVpQ29tcG9uZW50LCBuYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svTW9ja01lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q1Mzg5Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTW9ja01lc3NhZ2VSZXNvbHZlckZhY3RvcnkgZXh0ZW5kcyBEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeQ0KLXsNCi0gICAgcHVibGljIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXRSZWdpc3RlcmVkTmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TmFtZU1hcHBlckxpc3QoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL01vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTBkNWQ4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL01vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIE1vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSBleHRlbmRzIERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeQ0KLXsNCi0gICAgcHVibGljIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXRSZWdpc3RlcmVkTmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TmFtZU1hcHBlckxpc3QoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk2NDJiYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIE1vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5IGV4dGVuZHMgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGNyZWF0ZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIC8vZm9yY2UgaW5pdCBzbyB0aGF0IGV2ZXJ5IHRlc3QtY2FzZSBzZXR1cCBtZXRob2QgY2FuIGFkZCBhIG1vY2sgdmFsaWRhdGlvbiBzdHJhdGVneSB2aWEgZXh0dmFsIGphdmEtYXBpDQotICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodGhpcyxSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoZ2V0Q2xhc3MoKSwgImluaXRTdGF0aWNNYXBwaW5ncyIpKTsNCi0gICAgICAgIHJldHVybiBzdXBlci5jcmVhdGUobWV0YURhdGFLZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gZ2V0UmVnaXN0ZXJlZE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldE5hbWVNYXBwZXJMaXN0KCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvTWV0aG9kVXRpbHMuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS91dGlsL01ldGhvZFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZjJlMjQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvTWV0aG9kVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UudXRpbDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotLy9UT0RPDQotcHVibGljIGNsYXNzIE1ldGhvZFV0aWxzDQotew0KLSAgICBwcml2YXRlIE1ldGhvZFV0aWxzKCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja01ldGhvZENhbGxlZChDbGFzcyB1c2VkQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBpbnQgY2FsbENvdW50KQ0KLSAgICB7DQotICAgICAgICBjaGVja1JlcXVpcmVkQ2xhc3ModXNlZENsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiBjYWxsQ291bnQgPT0gZ2V0TWV0aG9kQ2FsbENvdW50KHVzZWRDbGFzcywgbWV0aG9kTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWV0aG9kQ2FsbGVkKENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpDQotICAgIHsNCi0gICAgICAgIGNoZWNrUmVxdWlyZWRDbGFzcyh1c2VkQ2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkNCi0gICAgICAgICAgICAgICAgLmNvbnRhaW5zS2V5KHVzZWRDbGFzcy5nZXROYW1lKCkgKyAiIyIgKyBtZXRob2ROYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2lnbmFsTWV0aG9kQ2FsbGVkKENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIGludCBtZXRob2RDYWxsQ291bnQgPSAwOw0KLSAgICAgICAgU3RyaW5nIGtleSA9IHVzZWRDbGFzcy5nZXROYW1lKCkgKyAiIyIgKyBtZXRob2ROYW1lOw0KLQ0KLSAgICAgICAgaWYocmVxdWVzdE1hcC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGhvZENhbGxDb3VudCA9IChJbnRlZ2VyKXJlcXVlc3RNYXAuZ2V0KGtleSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXF1ZXN0TWFwLnB1dChrZXksICsrbWV0aG9kQ2FsbENvdW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TWV0aG9kQ2FsbENvdW50KENsYXNzIHVzZWRDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpDQotICAgIHsNCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIFN0cmluZyBrZXkgPSB1c2VkQ2xhc3MuZ2V0TmFtZSgpICsgIiMiICsgbWV0aG9kTmFtZTsNCi0NCi0gICAgICAgIGlmKHJlcXVlc3RNYXAuY29udGFpbnNLZXkoa2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKEludGVnZXIpcmVxdWVzdE1hcC5nZXQoa2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaWduYWxDbGFzc1VzZWQoQ2xhc3MgbW9ja0NsYXNzKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgICAgIC5wdXQobW9ja0NsYXNzLmdldE5hbWUoKSArICI6dXNlZCIsIHRydWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NsYXNzVXNlZChDbGFzcyBtb2NrQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpDQotICAgICAgICAgICAgICAgIC5jb250YWluc0tleShtb2NrQ2xhc3MuZ2V0TmFtZSgpICsgIjp1c2VkIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1JlcXVpcmVkQ2xhc3MoQ2xhc3MgdXNlZENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzQ2xhc3NVc2VkKHVzZWRDbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbih1c2VkQ2xhc3MuZ2V0TmFtZSgpICsgIiBub3QgdXNlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS91dGlsL1Rlc3RVdGlscy5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvVGVzdFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNGYxNDkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvVGVzdFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS51dGlsOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWNlc0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotcHVibGljIGZpbmFsIGNsYXNzIFRlc3RVdGlscw0KLXsNCi0gICAgLyoqIERlZmF1bHQgTG9nZ2VyICovDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUZXN0VXRpbHMuY2xhc3MpOw0KLQ0KLSAgICAvKiogdXRpbGl0eSBjbGFzcywgZG8gbm90IGluc3RhbnRpYXRlICovDQotICAgIHByaXZhdGUgVGVzdFV0aWxzKCkNCi0gICAgew0KLSAgICAgICAgLy8gdXRpbGl0eSBjbGFzcywgZGlzYWJsZSBpbnN0YW50aWF0aW9uDQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZERlZmF1bHRWYWxpZGF0b3JzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpDQotICAgIHsNCi0gICAgICAgIGFkZFZhbGlkYXRvcihmYWNlc0NvbnRleHQsImphdmF4LmZhY2VzLkRvdWJsZVJhbmdlIiwgImphdmF4LmZhY2VzLnZhbGlkYXRvci5Eb3VibGVSYW5nZVZhbGlkYXRvciIpOw0KLSAgICAgICAgYWRkVmFsaWRhdG9yKGZhY2VzQ29udGV4dCwiamF2YXguZmFjZXMuTGVuZ3RoIiwgImphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3IiKTsNCi0gICAgICAgIGFkZFZhbGlkYXRvcihmYWNlc0NvbnRleHQsImphdmF4LmZhY2VzLkxvbmdSYW5nZSIsICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTG9uZ1JhbmdlVmFsaWRhdG9yIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFZhbGlkYXRvcihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0b3JJZCwgU3RyaW5nIHZhbGlkYXRvckNsYXNzKQ0KLSAgICB7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5hZGRWYWxpZGF0b3IodmFsaWRhdG9ySWQsIHZhbGlkYXRvckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQWRkIGFsbCBvZiBKU0YgMS4yIGRlZmF1bHQgcmVuZGVyZXJzLiAgQ3VycmVudGx5IHRoaXMgaXMgbm90IHRpZWQgdG8NCi0gICAgICogZmFjZXMtY29uZmlnLnhtbCwgc28gYWxsIGNoYW5nZSB0byB0aGUgZmlsZSBNVVNUIGFsc28gYmUgbWFkZSBoZXJlLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0DQotICAgICAqIEB0b2RvIERvIG5vdCBhZGQgcmVuZGVyZXIgaWYgcmVuZGVyZXIgaXMgYWxyZWFkeSBhZGRlZC4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGREZWZhdWx0UmVuZGVyZXJzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpDQotICAgIHsNCi0gICAgICAgIC8vIFN0YW5kYXJkIEhUTUwgUmVuZGVyZXJzDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5Db21tYW5kIiwgImphdmF4LmZhY2VzLkJ1dHRvbiIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEJ1dHRvblJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RCb29sZWFuIiwNCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkNoZWNrYm94IiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sQ2hlY2tib3hSZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuU2VsZWN0TWFueSIsDQotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5DaGVja2JveCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbENoZWNrYm94UmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLkZvcm0iLCAiamF2YXguZmFjZXMuRm9ybSIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEZvcm1SZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuUGFuZWwiLCAiamF2YXguZmFjZXMuR3JpZCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEdyaWRSZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuUGFuZWwiLCAiamF2YXguZmFjZXMuR3JvdXAiLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxHcm91cFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5IaWRkZW4iLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxIaWRkZW5SZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuR3JhcGhpYyIsICJqYXZheC5mYWNlcy5JbWFnZSIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEltYWdlUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5MYWJlbCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbExhYmVsUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk91dHB1dCIsICJqYXZheC5mYWNlcy5MaW5rIiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlua1JlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5Db21tYW5kIiwgImphdmF4LmZhY2VzLkxpbmsiLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMaW5rUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsDQotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5MaXN0Ym94IiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTGlzdGJveFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RNYW55IiwNCi0gICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLkxpc3Rib3giLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxMaXN0Ym94UmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsICJqYXZheC5mYWNlcy5NZW51IiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sTWVudVJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5TZWxlY3RNYW55IiwgImphdmF4LmZhY2VzLk1lbnUiLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxNZW51UmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLk1lc3NhZ2UiLCAiamF2YXguZmFjZXMuTWVzc2FnZSIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lc3NhZ2VSZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuT3V0cHV0IiwgImphdmF4LmZhY2VzLkZvcm1hdCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbEZvcm1hdFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5NZXNzYWdlcyIsDQotICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5NZXNzYWdlcyIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbE1lc3NhZ2VzUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLlNlbGVjdE9uZSIsICJqYXZheC5mYWNlcy5SYWRpbyIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFJhZGlvUmVuZGVyZXIiKTsNCi0NCi0gICAgICAgIGFkZFJlbmRlcmVyKGZhY2VzQ29udGV4dCwgImphdmF4LmZhY2VzLklucHV0IiwgImphdmF4LmZhY2VzLlNlY3JldCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFNlY3JldFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5EYXRhIiwgImphdmF4LmZhY2VzLlRhYmxlIiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGFibGVSZW5kZXJlciIpOw0KLQ0KLSAgICAgICAgYWRkUmVuZGVyZXIoZmFjZXNDb250ZXh0LCAiamF2YXguZmFjZXMuSW5wdXQiLCAiamF2YXguZmFjZXMuVGV4dGFyZWEiLA0KLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLkh0bWxUZXh0YXJlYVJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5JbnB1dCIsICJqYXZheC5mYWNlcy5UZXh0IiwNCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5yZW5kZXJraXQuaHRtbC5IdG1sVGV4dFJlbmRlcmVyIik7DQotDQotICAgICAgICBhZGRSZW5kZXJlcihmYWNlc0NvbnRleHQsICJqYXZheC5mYWNlcy5PdXRwdXQiLCAiamF2YXguZmFjZXMuVGV4dCIsDQotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwuSHRtbFRleHRSZW5kZXJlciIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBZGQgYSByZW5kZXJlciB0byB0aGUgRmFjZXNDb250ZXh0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IEZhY2VzIENvbnRleHQNCi0gICAgICogQHBhcmFtIGZhbWlseSBDb21wb25lbmV0IEZhbWlseQ0KLSAgICAgKiBAcGFyYW0gcmVuZGVyZXJUeXBlIENvbXBvbmVudCBUeXBlDQotICAgICAqIEBwYXJhbSByZW5kZXJDbGFzc05hbWUgQ2xhc3MgTmFtZSBvZiBSZW5kZXJlcg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFJlbmRlcmVyKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBmYW1pbHksDQotICAgICAgICAgICAgU3RyaW5nIHJlbmRlcmVyVHlwZSwgU3RyaW5nIHJlbmRlckNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSAoUmVuZGVyZXIpIG5ld0luc3RhbmNlKHJlbmRlckNsYXNzTmFtZSk7DQotICAgICAgICBSZW5kZXJLaXQga2l0ID0gZmFjZXNDb250ZXh0LmdldFJlbmRlcktpdCgpOw0KLSAgICAgICAga2l0LmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCByZW5kZXJlcik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRyaWVzIGEgQ2xhc3MubG9hZENsYXNzIHdpdGggdGhlIGNvbnRleHQgY2xhc3MgbG9hZGVyIG9mIHRoZSBjdXJyZW50IHRocmVhZCBmaXJzdCBhbmQNCi0gICAgICogYXV0b21hdGljYWxseSBmYWxscyBiYWNrIHRvIHRoZSBDbGFzc1V0aWxzIGNsYXNzIGxvYWRlciAoaS5lLiB0aGUgbG9hZGVyIG9mIHRoZQ0KLSAgICAgKiBteWZhY2VzLmphciBsaWIpIGlmIG5lY2Vzc2FyeS4NCi0gICAgICoNCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMNCi0gICAgICoNCi0gICAgICogQHBhcmFtIHR5cGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBub24tcHJpbWl0aXZlIG5vbi1hcnJheSBjbGFzcw0KLSAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIENsYXNzDQotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdHlwZSBpcyBudWxsDQotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgY2xhc3NGb3JOYW1lKFN0cmluZyB0eXBlKQ0KLSAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpDQotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0eXBlIik7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvLyBUcnkgV2ViQXBwIENsYXNzTG9hZGVyIGZpcnN0DQotICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUodHlwZSwgZmFsc2UsIC8vIGRvIG5vdCBpbml0aWFsaXplIGZvciBmYXN0ZXIgc3RhcnR1cA0KLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gZmFsbGJhY2s6IFRyeSBDbGFzc0xvYWRlciBmb3IgQ2xhc3NVdGlscyAoaS5lLiB0aGUgbXlmYWNlcy5qYXIgbGliKQ0KLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKHR5cGUsIGZhbHNlLCAvLyBkbyBub3QgaW5pdGlhbGl6ZSBmb3IgZmFzdGVyIHN0YXJ0dXANCi0gICAgICAgICAgICAgICAgICAgIFRlc3RVdGlscy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2FtZSBhcyB7QGxpbmsgI2NsYXNzRm9yTmFtZShTdHJpbmcpfSwgYnV0IHRocm93cyBhIFJ1bnRpbWVFeGNlcHRpb24NCi0gICAgICogKEZhY2VzRXhjZXB0aW9uKSBpbnN0ZWFkIG9mIGEgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi4NCi0gICAgICoNCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMNCi0gICAgICoNCi0gICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBDbGFzcw0KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHR5cGUgaXMgbnVsbA0KLSAgICAgKiBAdGhyb3dzIGphdmF4LmZhY2VzLkZhY2VzRXhjZXB0aW9uIGlmIGNsYXNzIG5vdCBmb3VuZA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3Mgc2ltcGxlQ2xhc3NGb3JOYW1lKFN0cmluZyB0eXBlKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY2xhc3NGb3JOYW1lKHR5cGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2cuZXJyb3IoIkNsYXNzICIgKyB0eXBlICsgIiBub3QgZm91bmQiLCBlKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3Mgd2l0aCB0aGUgdHlwZSBvZiA8Y29kZT50eXBlPC9jb2RlPi4NCi0gICAgICoNCi0gICAgICogTm90ZTogVGhpcyB3YXMgY29waWVkIGZyb20gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZC51dGlsLkNsYXNzVXRpbHMNCi0gICAgICoNCi0gICAgICogQHBhcmFtIHR5cGUgVHlwZSBvZiBuZXcgY2xhc3MuDQotICAgICAqIEByZXR1cm4gSW5zdGFuY2Ugb2YgdGhlIGNsYXNzIDxjb2RlPnR5cGU8L2NvZGU+DQotICAgICAqIEB0aHJvd3MgamF2YXguZmFjZXMuRmFjZXNFeGNlcHRpb24NCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgdHlwZSkgdGhyb3dzIEZhY2VzRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpDQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2Uoc2ltcGxlQ2xhc3NGb3JOYW1lKHR5cGUpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyA8Y29kZT5jbGF6ejwvY29kZT4uDQotICAgICAqDQotICAgICAqIE5vdGU6IFRoaXMgd2FzIGNvcGllZCBmcm9tIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWQudXRpbC5DbGFzc1V0aWxzDQotICAgICAqDQotICAgICAqIEBwYXJhbSBjbGF6eiBDbGFzcyB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YuDQotICAgICAqIEByZXR1cm4gSW5zdGFuY2Ugb2YgdGhlIGNsYXNzIDxjb2RlPmNsYXp6PC9jb2RlPg0KLSAgICAgKiBAdGhyb3dzIGphdmF4LmZhY2VzLkZhY2VzRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoQ2xhc3MgY2xhenopIHRocm93cyBGYWNlc0V4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY2xhenoubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ2xhc3MgOiAiICsgY2xhenouZ2V0TmFtZSgpICsgIiBub3QgZm91bmQuIiwgZSk7DQotICAgICAgICAgICAgdGhyb3cgbmV3IEZhY2VzRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBGYWNlc0V4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJlbmRlcmVyZWQgYSBjb21wb25lbnQsIGluY2x1ZGluZyBpdCdzIGNoaWxkcmVuLCB0aGVuIGNvbXBsZXRlIHRoZSByZXBvbnNlLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gY29udGV4dCBGYWNlcyBDb250ZXh0DQotICAgICAqIEBwYXJhbSBjb21wb25lbnQgQ29tcG9uZW50IHRvIGJlIHJlbmRlcmVkLg0KLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gVGhyb3duIHdoaWxlIHJlbmRlcmluZy4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW5kZXJDb21wb25lbnQoRmFjZXNDb250ZXh0IGNvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgUmVuZGVyZXIgcmVuZGVyZXIgPSBjb250ZXh0LmdldFJlbmRlcktpdCgpLmdldFJlbmRlcmVyKA0KLSAgICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0RmFtaWx5KCksIGNvbXBvbmVudC5nZXRSZW5kZXJlclR5cGUoKSk7DQotICAgICAgICByZW5kZXJlci5lbmNvZGVCZWdpbihjb250ZXh0LCBjb21wb25lbnQpOw0KLSAgICAgICAgcmVuZGVyZXIuZW5jb2RlQ2hpbGRyZW4oY29udGV4dCwgY29tcG9uZW50KTsNCi0gICAgICAgIHJlbmRlcmVyLmVuY29kZUVuZChjb250ZXh0LCBjb21wb25lbnQpOw0KLSAgICAgICAgY29udGV4dC5yZXNwb25zZUNvbXBsZXRlKCk7DQotICAgICAgICBjb250ZXh0LnJlbmRlclJlc3BvbnNlKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvcG9tLnhtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNjE4MmMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbi10ZXN0czwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBCZWFuLVZhbGlkYXRpb24tSW50ZWdyYXRpb24tVGVzdHM8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPnRlc3QtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8cmVwb3NpdG9yaWVzPg0KLSAgICAgICAgPHJlcG9zaXRvcnk+DQotICAgICAgICAgICAgPGlkPmpib3NzPC9pZD4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvc2l0b3J5Lmpib3NzLmNvbS9tYXZlbjI8L3VybD4NCi0gICAgICAgICAgICA8cmVsZWFzZXM+DQotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+DQotICAgICAgICAgICAgPC9yZWxlYXNlcz4NCi0gICAgICAgICAgICA8c25hcHNob3RzPg0KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4NCi0gICAgICAgICAgICA8L3NuYXBzaG90cz4NCi0gICAgICAgIDwvcmVwb3NpdG9yeT4NCi0gICAgICAgIDxyZXBvc2l0b3J5Pg0KLSAgICAgICAgICAgIDxpZD5qYm9zcy1zbmFwc2hvdDwvaWQ+DQotICAgICAgICAgICAgPHVybD5odHRwOi8vc25hcHNob3RzLmpib3NzLm9yZy9tYXZlbjI8L3VybD4NCi0gICAgICAgICAgICA8cmVsZWFzZXM+DQotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+DQotICAgICAgICAgICAgPC9yZWxlYXNlcz4NCi0gICAgICAgICAgICA8c25hcHNob3RzPg0KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPg0KLSAgICAgICAgICAgIDwvc25hcHNob3RzPg0KLSAgICAgICAgPC9yZXBvc2l0b3J5Pg0KLSAgICA8L3JlcG9zaXRvcmllcz4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnZhbGlkYXRpb248L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjAuR0E8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlLXRlc3RzPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5oaWJlcm5hdGU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGliZXJuYXRlLXZhbGlkYXRvcjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj40LjAuMC5HQTwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS40LjI8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjQuMjwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQWJzdHJhY3RCZWFuVmFsaWRhdGlvblRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQWJzdHJhY3RCZWFuVmFsaWRhdGlvblRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YzRiN2UuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0Fic3RyYWN0QmVhblZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5BYnN0cmFjdEV4VmFsVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0YXJ0dXAuQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi0NCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RCZWFuVmFsaWRhdGlvblRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgQWJzdHJhY3RCZWFuVmFsaWRhdGlvblRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbnZva2VTdGFydHVwTGlzdGVuZXJzKCkNCi0gICAgew0KLSAgICAgICAgbmV3IEJlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyKCkgew0KLQ0KLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zMTI0MTgyMzU1NDQ0NzU0NDk3TDsNCi0NCi0gICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHN1cGVyLmluaXQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9LmluaXQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgbmV3IE1vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIoKS5hZnRlclBoYXNlKG5ldyBQaGFzZUV2ZW50KGZhY2VzQ29udGV4dCwgUGhhc2VJZC5VUERBVEVfTU9ERUxfVkFMVUVTLCBsaWZlY3ljbGUpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0Jhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc2OGFkMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWw7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJSW5wdXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTxUPiBleHRlbmRzIEFic3RyYWN0QmVhblZhbGlkYXRpb25UZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDMgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgICAgICBiZWFuID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICBwcm90ZWN0ZWQgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICBwcm90ZWN0ZWQgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDMgPSBudWxsOw0KLQ0KLSAgICBwcml2YXRlIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHByb3RlY3RlZCBUIGJlYW47DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgYmVhbiA9IGdldEJlYW5Ub1Rlc3QoKTsNCi0gICAgICAgIGJpbmRCZWFuVG9FeHByZXNzaW9uKCk7DQotDQotICAgICAgICBjcmVhdGVDb21wb25lbnRzKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbXBvbmVudHMoKQ0KLSAgICB7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsNCi0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsNCi0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MyA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Myk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0SWQoImlucHV0MSIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50My5zZXRJZCgiaW5wdXQzIik7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQ0KLSAgICBwcml2YXRlIHZvaWQgYmluZEJlYW5Ub0V4cHJlc3Npb24oKQ0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmcgdmIgPSBhcHBsaWNhdGlvbi5jcmVhdGVWYWx1ZUJpbmRpbmcoIiN7dGVzdEJlYW59Iik7DQotICAgICAgICBmYWNlc0NvbnRleHQuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpLnB1dCgidGVzdEJlYW4iLCBiZWFuKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVCBnZXRCZWFuVG9UZXN0KCk7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQzID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgYmVhbiA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KFVJSW5wdXQgdWlDb21wb25lbnQsIFN0cmluZyB2YWx1ZUJpbmRpbmcpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyh1aUNvbXBvbmVudCwgInZhbHVlIiwgdmFsdWVCaW5kaW5nKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZVRvVmFsaWRhdGUoVUlJbnB1dCB1aUNvbXBvbmVudCwgU3RyaW5nIHZhbHVlVG9WYWxpZGF0ZSkNCi0gICAgew0KLSAgICAgICAgdWlDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVUb1ZhbGlkYXRlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbXBvbmVudHMoKQ0KLSAgICB7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEucHJvY2Vzc1ZhbGlkYXRvcnMoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5wcm9jZXNzVmFsaWRhdG9ycyhmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQzLnByb2Nlc3NWYWxpZGF0b3JzKGZhY2VzQ29udGV4dCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29tcG9uZW50cygpDQotICAgIHsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5wcm9jZXNzVXBkYXRlcyhmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnByb2Nlc3NVcGRhdGVzKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDMucHJvY2Vzc1VwZGF0ZXMoZmFjZXNDb250ZXh0KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRDb21wb25lbnRWYWxpZChVSUlucHV0IHVpSW5wdXQpDQotICAgIHsNCi0gICAgICAgIGFzc2VydFRydWUoaXNDb21wb25lbnRWYWxpZCh1aUlucHV0KSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Q29tcG9uZW50SW52YWxpZChVSUlucHV0IHVpSW5wdXQpDQotICAgIHsNCi0gICAgICAgIGFzc2VydEZhbHNlKGlzQ29tcG9uZW50VmFsaWQodWlJbnB1dCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbXBvbmVudFZhbGlkKFVJSW5wdXQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudC5pc1ZhbGlkKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0N1c3RvbVNldmVyaXR5MVRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFkZWFlMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXcuQ3VzdG9tU2V2ZXJpdHlUZXN0Q2FzZTFQYWdlQmVhbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5jdXN0b20uQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21TZXZlcml0eTFUZXN0Q2FzZSBleHRlbmRzIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8Q3VzdG9tU2V2ZXJpdHlUZXN0Q2FzZTFQYWdlQmVhbj4NCi17DQotICAgIHB1YmxpYyBDdXN0b21TZXZlcml0eTFUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBDdXN0b21TZXZlcml0eVRlc3RDYXNlMVBhZ2VCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEN1c3RvbVNldmVyaXR5VGVzdENhc2UxUGFnZUJlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tUGF5bG9hZFZpYUdsb2JhbFByb3BlcnR5KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MuZ2V0TmFtZSgpLCBDdXN0b21WaW9sYXRpb25TZXZlcml0eS5XYXJuaW5nLmNsYXNzKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfV0FSTik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbVBheWxvYWRWaWFTdGF0aWNDb25maWcoKQ0KLSAgICB7DQotICAgICAgICBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcy5nZXROYW1lKCksIEN1c3RvbVZpb2xhdGlvblNldmVyaXR5Lldhcm5pbmcuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5WQUxJREFUSU9OX1BBUkFNRVRFUl9DT05GSUcsIGNvbmZpZyk7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmtub3duUGF5bG9hZCgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvRGVmYXVsdEdyb3VwVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9EZWZhdWx0R3JvdXBUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmYzYzYxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9EZWZhdWx0R3JvdXBUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5UZXN0Q2FzZTFCZWFuOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0R3JvdXBUZXN0Q2FzZSBleHRlbmRzIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8VGVzdENhc2UxQmVhbj4NCi17DQotICAgIHB1YmxpYyBEZWZhdWx0R3JvdXBUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRGVmYXVsdEdyb3VwVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBUZXN0Q2FzZTFCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RDYXNlMUJlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90TnVsbFNldmVyaXR5RXJyb3IoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE5vdE51bGxTZXZlcml0eVdhcm4oKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXZlcml0eU9yZGVyKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTN9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICJhYiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4pOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9MYWJlbFJlcGxhY2VtZW50VGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9MYWJlbFJlcGxhY2VtZW50VGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJjNWUzYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTGFiZWxSZXBsYWNlbWVudFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLlRlc3RDYXNlMUJlYW47DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotcHVibGljIGNsYXNzIExhYmVsUmVwbGFjZW1lbnRUZXN0Q2FzZSBleHRlbmRzIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8VGVzdENhc2UxQmVhbj4NCi17DQotICAgIHB1YmxpYyBMYWJlbFJlcGxhY2VtZW50VGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKExhYmVsUmVwbGFjZW1lbnRUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFRlc3RDYXNlMUJlYW4gZ2V0QmVhblRvVGVzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdENhc2UxQmVhbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RMYWJlbFJlcGxhY2VtZW50KCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCA9ICJwcm9wZXJ0eTEiOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICB0aGlzLmlucHV0Q29tcG9uZW50MS5zZXRMYWJlbChsYWJlbFRleHQpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9ICgoRmFjZXNNZXNzYWdlKWZhY2VzQ29udGV4dC5nZXRNZXNzYWdlcygpLm5leHQoKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCkuc3RhcnRzV2l0aChsYWJlbFRleHQpKTsNCi0gICAgICAgIGFzc2VydFRydWUoZmFjZXNNZXNzYWdlLmdldERldGFpbCgpLnN0YXJ0c1dpdGgobGFiZWxUZXh0KSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL01vZGVsVmFsaWRhdGlvbjFUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL01vZGVsVmFsaWRhdGlvbjFUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzJkMTUzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24xVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXcuTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuU2ltdWxhdGVkVXNlckluZm9ybWF0aW9uOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb24xVGVzdENhc2UgZXh0ZW5kcw0KLSAgICAgICAgQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTxNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbj4NCi17DQotICAgIHB1YmxpYyBNb2RlbFZhbGlkYXRpb24xVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKE1vZGVsVmFsaWRhdGlvbjFUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmFsaWRhdGlvbigpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwxLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIjEyMyIpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDEucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiMTIzIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHVwZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFZpb2xhdGlvbldpdGhHbG9iYWxWaW9sYXRpb25NZXNzYWdlVmlhUHJvcGVydHkoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMS5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIxMjMiKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwxLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIjQ1NiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICB1cGRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFZpb2xhdGlvbldpdGhJbmxpbmVWaW9sYXRpb25NZXNzYWdlVmlhUHJvcGVydHkoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIxMjMiKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwyLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIjQ1NiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICB1cGRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICAvL2R1ZSB0byBkaXNwbGF5TWVzc2FnZUlubGluZQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxWaW9sYXRpb25XaXRoR2xvYmFsVmlvbGF0aW9uTWVzc2FnZVZpYUZpZWxkKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDMucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiMTIzIik7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMy5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICI0NTYiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgdXBkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxWaW9sYXRpb25XaXRoSW5saW5lVmlvbGF0aW9uTWVzc2FnZVZpYUZpZWxkKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDQucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiMTIzIik7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsNC5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICI0NTYiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgdXBkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgLy9kdWUgdG8gZGlzcGxheU1lc3NhZ2VJbmxpbmUNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDIpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmlvbGF0aW9uV2l0aEFkbWluUm9sZSgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJjdXJyZW50VXNlciIsIG5ldyBTaW11bGF0ZWRVc2VySW5mb3JtYXRpb24oImFkbWluIikpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDUucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiMTIzIik7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsNS5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICI0NTYiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgdXBkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmlvbGF0aW9uV2l0aFVzZXJSb2xlKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlUmVxdWVzdFNjb3BlZEJlYW4oImN1cnJlbnRVc2VyIiwgbmV3IFNpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbigidXNlciIpKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWw1LnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIjEyMyIpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDUucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiNDU2Iik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHVwZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL01vZGVsVmFsaWRhdGlvbjJUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL01vZGVsVmFsaWRhdGlvbjJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzQxMjVlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24yVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldy5Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbjsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi1wdWJsaWMgY2xhc3MgTW9kZWxWYWxpZGF0aW9uMlRlc3RDYXNlIGV4dGVuZHMNCi0gICAgICAgIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8TW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4+DQotew0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uMlRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShNb2RlbFZhbGlkYXRpb24yVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbiBnZXRCZWFuVG9UZXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFZhbGlkYXRpb24oKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIjEyMyIpOw0KLQ0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbC5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICIxMjMiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgdXBkYXRlQ29tcG9uZW50cygpOw0KLSAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsVmlvbGF0aW9uV2l0aEdsb2JhbFZpb2xhdGlvbk1lc3NhZ2VDbGFzc0xldmVsKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbC5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIxMjMiKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiNDU2Iik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHVwZGF0ZUNvbXBvbmVudHMoKTsNCi0gICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL01vZGVsVmFsaWRhdGlvbjNUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL01vZGVsVmFsaWRhdGlvbjNUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGEzNmU3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24zVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldy5Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTNQYWdlQmVhbjsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvbjNUZXN0Q2FzZSBleHRlbmRzDQotICAgICAgICBCYXNlQmVhblZhbFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlPE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlM1BhZ2VCZWFuPg0KLXsNCi0gICAgcHVibGljIE1vZGVsVmFsaWRhdGlvbjNUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTW9kZWxWYWxpZGF0aW9uM1Rlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UzUGFnZUJlYW4gZ2V0QmVhblRvVGVzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UzUGFnZUJlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxWYWxpZGF0aW9uTm9WaWV3SWRNYXRjaCgpDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlKCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxWYWxpZGF0aW9uVmlld0lkTWF0Y2goKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5zZXRWaWV3SWQoIi9wYWdlcy9tb2RlbFZhbGlkYXRpb25Bd2FyZVBhZ2UueGh0bWwiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlKCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiMTIzIik7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIjQ1NiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICB1cGRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL01vZGVsVmFsaWRhdGlvbjRUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL01vZGVsVmFsaWRhdGlvbjRUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGQzMzc4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb240VGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldy5Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTRQYWdlQmVhbjsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvbjRUZXN0Q2FzZSBleHRlbmRzDQotICAgICAgICBCYXNlQmVhblZhbFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlPE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlNFBhZ2VCZWFuPg0KLXsNCi0gICAgcHVibGljIE1vZGVsVmFsaWRhdGlvbjRUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTW9kZWxWYWxpZGF0aW9uNFRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2U0UGFnZUJlYW4gZ2V0QmVhblRvVGVzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2U0UGFnZUJlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxWYWxpZGF0aW9uTm9WaWV3SWRNYXRjaCgpDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRlKCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxWYWxpZGF0aW9uVmlld0lkTWF0Y2goKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5zZXRWaWV3SWQoIi9wYWdlcy9tb2RlbFZhbGlkYXRpb25Bd2FyZVBhZ2UueGh0bWwiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlKCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiMTIzIik7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIjQ1NiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICB1cGRhdGVDb21wb25lbnRzKCk7DQotICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL1Jlc3RyaWN0R3JvdXBzVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9SZXN0cmljdEdyb3Vwc1Rlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZDk2OTAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL1Jlc3RyaWN0R3JvdXBzVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXcuUmVzdHJpY3RHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5TaW11bGF0ZWRVc2VySW5mb3JtYXRpb247DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZXN0cmljdEdyb3Vwc1Rlc3RDYXNlIGV4dGVuZHMgQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTxSZXN0cmljdEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuPg0KLXsNCi0gICAgcHVibGljIFJlc3RyaWN0R3JvdXBzVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlc3RyaWN0R3JvdXBzVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBSZXN0cmljdEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFJlc3RyaWN0R3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdHJpY3RlZEdyb3VwKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDEucHJvcGVydHkxfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN0cmljdGVkR3JvdXBXaXRoQWRtaW5Sb2xlKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlUmVxdWVzdFNjb3BlZEJlYW4oImN1cnJlbnRVc2VyIiwgbmV3IFNpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbigiYWRtaW4iKSk7DQotDQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMi5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIiKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdHJpY3RlZEdyb3VwV2l0aFVzZXJSb2xlKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlUmVxdWVzdFNjb3BlZEJlYW4oImN1cnJlbnRVc2VyIiwgbmV3IFNpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbigidXNlciIpKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwyLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwyLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdHJpY3RlZEdyb3VwV2l0aENvcnJlY3RWaWV3SWQoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5zZXRWaWV3SWQoIi9wYWdlcy9ncm91cFZhbGlkYXRpb25Bd2FyZVBhZ2UueGh0bWwiKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwzLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwzLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN0cmljdGVkR3JvdXBXaXRoV3JvbmdWaWV3SWQoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMy5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMy5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIiKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFVzZWRBbmRSZXN0cmljdGVkR3JvdXAoKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsNC5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsNC5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICIiKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL1VzZUdyb3VwVmFsaWRhdGlvbjFUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL1VzZUdyb3VwVmFsaWRhdGlvbjFUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGZmMmY1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Vc2VHcm91cFZhbGlkYXRpb24xVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52aWV3LlVzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLlNpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgVXNlR3JvdXBWYWxpZGF0aW9uMVRlc3RDYXNlIGV4dGVuZHMgQmFzZUJlYW5WYWxQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTxVc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbj4NCi17DQotICAgIHB1YmxpYyBVc2VHcm91cFZhbGlkYXRpb24xVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFVzZUdyb3VwVmFsaWRhdGlvbjFUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFVzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuIGdldEJlYW5Ub1Rlc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFVzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEdyb3VwMUF3YXJlVmFsaWRhdGlvbigpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwxLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwxLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAiIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXAxQW5kR3JvdXAyQXdhcmVWYWxpZGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDIucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDIucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXAyQW5kR3JvdXAzQXdhcmVWYWxpZGF0aW9uV2l0aFdyb25nVmlld0lkKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQxLCAiI3t0ZXN0QmVhbi5tb2RlbDMucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nRm9yQ29tcG9uZW50KHRoaXMuaW5wdXRDb21wb25lbnQyLCAiI3t0ZXN0QmVhbi5tb2RlbDMucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiZyIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQyLCAicCIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXAyQW5kR3JvdXAzQXdhcmVWYWxpZGF0aW9uV2l0aENvcnJlY3RWaWV3SWQxKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuc2V0Vmlld0lkKCIvcGFnZXMvcGFnZTEueGh0bWwiKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MSwgIiN7dGVzdEJlYW4ubW9kZWwzLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwzLnByb3BlcnR5Mn0iKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MSwgImciKTsNCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgInAiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50VmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDIpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IsIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEdyb3VwMkFuZEdyb3VwM0F3YXJlVmFsaWRhdGlvbldpdGhDb3JyZWN0Vmlld0lkMigpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLnNldFZpZXdJZCgiL3BhZ2VzL3BhZ2UyLnhodG1sIik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsMy5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsMy5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICJnIik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICJwIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgyKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcm91cDJBd2FyZVZhbGlkYXRpb25XaXRoUm9sZUFkbWluKCkNCi0gICAgew0KLSAgICAgICAgY3JlYXRlUmVxdWVzdFNjb3BlZEJlYW4oImN1cnJlbnRVc2VyIiwgbmV3IFNpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbigiYWRtaW4iKSk7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsNC5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsNC5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICJnIik7IC8vZG9uJ3QgZm9yY2UgYSB2aW9sYXRpb24gd2l0aCBHcm91cDENCi0gICAgICAgIHNldFZhbHVlVG9WYWxpZGF0ZSh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiIpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGVDb21wb25lbnRzKCk7DQotDQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRJbnZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQyKTsNCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEdyb3VwMkFuZEdyb3VwM0F3YXJlVmFsaWRhdGlvbldpdGhSb2xlVXNlcigpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJjdXJyZW50VXNlciIsIG5ldyBTaW11bGF0ZWRVc2VySW5mb3JtYXRpb24oInVzZXIiKSk7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsNC5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDIsICIje3Rlc3RCZWFuLm1vZGVsNC5wcm9wZXJ0eTJ9Iik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDEsICJnIik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICJwIik7DQotDQotICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudHMoKTsNCi0NCi0gICAgICAgIGFzc2VydENvbXBvbmVudFZhbGlkKHRoaXMuaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGFzc2VydENvbXBvbmVudEludmFsaWQodGhpcy5pbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgyKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLCBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Vc2VHcm91cFZhbGlkYXRpb24yVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Vc2VHcm91cFZhbGlkYXRpb24yVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY3ZjEyZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvVXNlR3JvdXBWYWxpZGF0aW9uMlRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52aWV3LlVzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotcHVibGljIGNsYXNzIFVzZUdyb3VwVmFsaWRhdGlvbjJUZXN0Q2FzZSBleHRlbmRzIEJhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U8VXNlR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4+DQotew0KLSAgICBwdWJsaWMgVXNlR3JvdXBWYWxpZGF0aW9uMlRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShVc2VHcm91cFZhbGlkYXRpb24yVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBVc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbiBnZXRCZWFuVG9UZXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBVc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcm91cDFBd2FyZVZhbGlkYXRpb24oKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmdGb3JDb21wb25lbnQodGhpcy5pbnB1dENvbXBvbmVudDEsICIje3Rlc3RCZWFuLm1vZGVsLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZ0ZvckNvbXBvbmVudCh0aGlzLmlucHV0Q29tcG9uZW50MiwgIiN7dGVzdEJlYW4ubW9kZWwucHJvcGVydHkyfSIpOw0KLSAgICAgICAgc2V0VmFsdWVUb1ZhbGlkYXRlKHRoaXMuaW5wdXRDb21wb25lbnQxLCAiIik7DQotICAgICAgICBzZXRWYWx1ZVRvVmFsaWRhdGUodGhpcy5pbnB1dENvbXBvbmVudDIsICIiKTsNCi0NCi0gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50cygpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Q29tcG9uZW50SW52YWxpZCh0aGlzLmlucHV0Q29tcG9uZW50MSk7DQotICAgICAgICBhc3NlcnRDb21wb25lbnRWYWxpZCh0aGlzLmlucHV0Q29tcG9uZW50Mik7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9jdXN0b20vQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHkuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9jdXN0b20vQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA4MzA3Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvY3VzdG9tL0N1c3RvbVZpb2xhdGlvblNldmVyaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLmN1c3RvbTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHkNCi17DQotICAgIGludGVyZmFjZSBXYXJuaW5nIGV4dGVuZHMgUGF5bG9hZA0KLSAgICB7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0dyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4uamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Hcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTNjMTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0dyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmFsaWRhdGlvbi5Hcm91cDE7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmFsaWRhdGlvbi5Hcm91cDI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmFsaWRhdGlvbi5Hcm91cDM7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlBhdHRlcm47DQotDQotcHVibGljIGNsYXNzIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4NCi17DQotICAgIEBOb3ROdWxsKGdyb3VwcyA9IEdyb3VwMS5jbGFzcykNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkxOw0KLQ0KLSAgICBAUGF0dGVybihyZWdleHAgPSAiW0EtWl1bYS16XSIsIGdyb3VwcyA9IEdyb3VwMy5jbGFzcykNCi0gICAgQFNpemUobWluID0gMywgZ3JvdXBzID0gR3JvdXAyLmNsYXNzKQ0KLSAgICBATm90TnVsbChncm91cHMgPSBHcm91cDIuY2xhc3MpDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MjsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MShTdHJpbmcgcHJvcGVydHkxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MSA9IHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkyKFN0cmluZyBwcm9wZXJ0eTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkyID0gcHJvcGVydHkyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Hcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2YyOWQ5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Hcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAxOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotDQotcHVibGljIGNsYXNzIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4NCi17DQotICAgIEBCZWFuVmFsaWRhdGlvbih1c2VHcm91cHMgPSBHcm91cDEuY2xhc3MpDQotICAgIEBOb3ROdWxsKGdyb3VwcyA9IEdyb3VwMS5jbGFzcykNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkxOw0KLQ0KLSAgICBATm90TnVsbChncm91cHMgPSBHcm91cDIuY2xhc3MpDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MjsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MShTdHJpbmcgcHJvcGVydHkxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MSA9IHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkyKFN0cmluZyBwcm9wZXJ0eTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkyID0gcHJvcGVydHkyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGNkYjIyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uQ2xhc3NMZXZlbEVxdWFsOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7DQotDQotQENsYXNzTGV2ZWxFcXVhbA0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuDQotew0KLSAgICBATm90TnVsbA0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTE7DQotDQotICAgIEBOb3ROdWxsDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MjsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MShTdHJpbmcgcHJvcGVydHkxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MSA9IHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkyKFN0cmluZyBwcm9wZXJ0eTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkyID0gcHJvcGVydHkyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTU0MzIzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uQ2xhc3NMZXZlbEVxdWFsOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLQ0KLUBDbGFzc0xldmVsRXF1YWwNCi1AQmVhblZhbGlkYXRpb24odmlld0lkcyA9ICIvcGFnZXMvbW9kZWxWYWxpZGF0aW9uQXdhcmVQYWdlLnhodG1sIiwNCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbiA9IEBNb2RlbFZhbGlkYXRpb24oaXNBY3RpdmUgPSB0cnVlKSkNCi1wdWJsaWMgY2xhc3MgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyQmVhbg0KLXsNCi0gICAgQE5vdE51bGwNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkxOw0KLQ0KLSAgICBATm90TnVsbA0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvU2ltdWxhdGVkVXNlckluZm9ybWF0aW9uLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvU2ltdWxhdGVkVXNlckluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMGVkMWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1NpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbDsNCi0NCi1wdWJsaWMgY2xhc3MgU2ltdWxhdGVkVXNlckluZm9ybWF0aW9uDQotew0KLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsNCi0NCi0gICAgcHVibGljIFNpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbihTdHJpbmcgdmFsdWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkbWluUm9sZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAiYWRtaW4iLmVxdWFscyh2YWx1ZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNVc2VyUm9sZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAidXNlciIuZXF1YWxzKHZhbHVlKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvVGVzdENhc2UxQmVhbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1Rlc3RDYXNlMUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiYmNkZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvVGVzdENhc2UxQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwucGF5bG9hZC5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlBhdHRlcm47DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdENhc2UxQmVhbg0KLXsNCi0gICAgQE5vdE51bGwNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkxOw0KLQ0KLSAgICBATm90TnVsbChwYXlsb2FkID0gVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcykNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkyOw0KLQ0KLSAgICBAU2l6ZShtaW4gPSAzLCBwYXlsb2FkID0gVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcykNCi0gICAgQFBhdHRlcm4ocmVnZXhwID0gIltBLVpdW2Etel0rIiwgcGF5bG9hZCA9IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTM7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkzKFN0cmluZyBwcm9wZXJ0eTMpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkzID0gcHJvcGVydHkzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0NsYXNzTGV2ZWxFcXVhbC5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vQ2xhc3NMZXZlbEVxdWFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNjBmZmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vQ2xhc3NMZXZlbEVxdWFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb247DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi0NCi1AamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0KFRZUEUpDQotQGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbihSVU5USU1FKQ0KLUBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkDQotQGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludCh2YWxpZGF0ZWRCeSA9IHtDbGFzc0xldmVsRXF1YWxzVmFsaWRhdG9yMS5jbGFzcywgQ2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjIuY2xhc3N9KQ0KLXB1YmxpYyBAaW50ZXJmYWNlIENsYXNzTGV2ZWxFcXVhbA0KLXsNCi0gICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJjbGFzcy1sZXZlbCBlcXVhbCB2aW9sYXRpb24iOw0KLQ0KLSAgICBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQge307DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHt9Ow0KLQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9DbGFzc0xldmVsRXF1YWxzVmFsaWRhdG9yMS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vQ2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxZTE0OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9DbGFzc0xldmVsRXF1YWxzVmFsaWRhdG9yMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLk1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW47DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgQ2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjEgaW1wbGVtZW50cw0KLSAgICAgICAgQ29uc3RyYWludFZhbGlkYXRvcjxDbGFzc0xldmVsRXF1YWwsIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4+DQotew0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKENsYXNzTGV2ZWxFcXVhbCBwYXJhbWV0ZXJzKQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIHBhZ2VCZWFuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcHJvcGVydHkxID0gcGFnZUJlYW4uZ2V0UHJvcGVydHkxKCk7DQotICAgICAgICBTdHJpbmcgcHJvcGVydHkyID0gcGFnZUJlYW4uZ2V0UHJvcGVydHkyKCk7DQotDQotICAgICAgICByZXR1cm4gcHJvcGVydHkxID09IG51bGwgJiYgcHJvcGVydHkyID09IG51bGwgfHwgcHJvcGVydHkxICE9IG51bGwgJiYgcHJvcGVydHkxLmVxdWFscyhwcm9wZXJ0eTIpOw0KLQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0NsYXNzTGV2ZWxFcXVhbHNWYWxpZGF0b3IyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9DbGFzc0xldmVsRXF1YWxzVmFsaWRhdG9yMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGFkOTFlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0NsYXNzTGV2ZWxFcXVhbHNWYWxpZGF0b3IyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyQmVhbjsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBDbGFzc0xldmVsRXF1YWxzVmFsaWRhdG9yMiBpbXBsZW1lbnRzDQotICAgICAgICBDb25zdHJhaW50VmFsaWRhdG9yPENsYXNzTGV2ZWxFcXVhbCwgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyQmVhbj4NCi17DQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ2xhc3NMZXZlbEVxdWFsIHBhcmFtZXRlcnMpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4gcGFnZUJlYW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29uc3RyYWludFZhbGlkYXRvckNvbnRleHQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eTEgPSBwYWdlQmVhbi5nZXRQcm9wZXJ0eTEoKTsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eTIgPSBwYWdlQmVhbi5nZXRQcm9wZXJ0eTIoKTsNCi0NCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTEgPT0gbnVsbCAmJiBwcm9wZXJ0eTIgPT0gbnVsbCB8fCBwcm9wZXJ0eTEgIT0gbnVsbCAmJiBwcm9wZXJ0eTEuZXF1YWxzKHByb3BlcnR5Mik7DQotDQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAxLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9Hcm91cDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI4OTQ4MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9Hcm91cDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmFsaWRhdGlvbjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIEdyb3VwMQ0KLXsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9Hcm91cDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE2NWI1My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9Hcm91cDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmFsaWRhdGlvbjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIEdyb3VwMg0KLXsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAzLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9Hcm91cDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJiYWNmYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9Hcm91cDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmFsaWRhdGlvbjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIEdyb3VwMw0KLXsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvQ3VzdG9tU2V2ZXJpdHlUZXN0Q2FzZTFQYWdlQmVhbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvQ3VzdG9tU2V2ZXJpdHlUZXN0Q2FzZTFQYWdlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODA5Y2YwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L0N1c3RvbVNldmVyaXR5VGVzdENhc2UxUGFnZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5jdXN0b20uQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ3VzdG9tU2V2ZXJpdHlUZXN0Q2FzZTFQYWdlQmVhbg0KLXsNCi0gICAgQE5vdE51bGwocGF5bG9hZCA9IEN1c3RvbVZpb2xhdGlvblNldmVyaXR5Lldhcm5pbmcuY2xhc3MpDQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MShTdHJpbmcgcHJvcGVydHkxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MSA9IHByb3BlcnR5MTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFhMDczNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52aWV3Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuOw0KLQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsMSA9IG5ldyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIHByaXZhdGUgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDIgPSBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24obW9kZWxWYWxpZGF0aW9uID0gQE1vZGVsVmFsaWRhdGlvbihpc0FjdGl2ZSA9IHRydWUpKQ0KLSAgICBwcml2YXRlIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gbW9kZWwzID0gbmV3IE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgQEJlYW5WYWxpZGF0aW9uKG1vZGVsVmFsaWRhdGlvbiA9IEBNb2RlbFZhbGlkYXRpb24oaXNBY3RpdmUgPSB0cnVlLCBkaXNwbGF5SW5saW5lID0gdHJ1ZSkpDQotICAgIHByaXZhdGUgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDQgPSBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24oY29uZGl0aW9ucyA9ICIje2N1cnJlbnRVc2VyLnVzZXJSb2xlfSIsIG1vZGVsVmFsaWRhdGlvbiA9IEBNb2RlbFZhbGlkYXRpb24oaXNBY3RpdmUgPSB0cnVlKSkNCi0gICAgcHJpdmF0ZSBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsNSA9IG5ldyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIEBCZWFuVmFsaWRhdGlvbihtb2RlbFZhbGlkYXRpb24gPSBATW9kZWxWYWxpZGF0aW9uKGlzQWN0aXZlID0gdHJ1ZSkpDQotICAgIHB1YmxpYyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIGdldE1vZGVsMSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDE7DQotICAgIH0NCi0NCi0gICAgQEJlYW5WYWxpZGF0aW9uKG1vZGVsVmFsaWRhdGlvbiA9IEBNb2RlbFZhbGlkYXRpb24oaXNBY3RpdmUgPSB0cnVlLCBkaXNwbGF5SW5saW5lID0gdHJ1ZSkpDQotICAgIHB1YmxpYyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIGdldE1vZGVsMigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWwzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1vZGVsMzsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWw0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIGdldE1vZGVsNSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDU7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4uamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZTQ5MjQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbjsNCi0NCi1AQmVhblZhbGlkYXRpb24obW9kZWxWYWxpZGF0aW9uID0gQE1vZGVsVmFsaWRhdGlvbihpc0FjdGl2ZSA9IHRydWUsIHZhbGlkYXRpb25UYXJnZXRzID0gIiN7dGVzdEJlYW4ubW9kZWx9IikpDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuDQotew0KLSAgICBwcml2YXRlIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gbW9kZWwgPSBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTNQYWdlQmVhbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UzUGFnZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY2Y2MwZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTNQYWdlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52aWV3Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuOw0KLQ0KLUBCZWFuVmFsaWRhdGlvbih2aWV3SWRzID0gIi9wYWdlcy9tb2RlbFZhbGlkYXRpb25Bd2FyZVBhZ2UueGh0bWwiLA0KLSAgICAgICAgbW9kZWxWYWxpZGF0aW9uID0gQE1vZGVsVmFsaWRhdGlvbihpc0FjdGl2ZSA9IHRydWUsIHZhbGlkYXRpb25UYXJnZXRzID0gIiN7dGVzdEJlYW4ubW9kZWx9IikpDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlM1BhZ2VCZWFuDQotew0KLSAgICBwcml2YXRlIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gbW9kZWwgPSBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTRQYWdlQmVhbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2U0UGFnZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdjNzRjMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTRQYWdlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52aWV3Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLk1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW47DQotDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlNFBhZ2VCZWFuDQotew0KLSAgICBwcml2YXRlIE1vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4gbW9kZWwgPSBuZXcgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyQmVhbigpOw0KLQ0KLSAgICBwdWJsaWMgTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyQmVhbiBnZXRNb2RlbCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9SZXN0cmljdEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9SZXN0cmljdEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNzI0ZWQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvUmVzdHJpY3RHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC52aWV3Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLm1vZGVsLkdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmFsaWRhdGlvbi5Hcm91cDE7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmFsaWRhdGlvbi5Hcm91cDI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uQmVhblZhbGlkYXRpb247DQotDQotQEJlYW5WYWxpZGF0aW9uKHVzZUdyb3VwcyA9IEdyb3VwMS5jbGFzcykNCi1wdWJsaWMgY2xhc3MgUmVzdHJpY3RHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbg0KLXsNCi0gICAgQEJlYW5WYWxpZGF0aW9uKHJlc3RyaWN0R3JvdXBzID0gR3JvdXAxLmNsYXNzKQ0KLSAgICBwcml2YXRlIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gbW9kZWwxID0gbmV3IEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgcHJpdmF0ZSBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsMiA9IG5ldyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIEBCZWFuVmFsaWRhdGlvbih2aWV3SWRzID0gIi9wYWdlcy9ncm91cFZhbGlkYXRpb25Bd2FyZVBhZ2UueGh0bWwiLCByZXN0cmljdEdyb3VwcyA9IEdyb3VwMS5jbGFzcykNCi0gICAgcHJpdmF0ZSBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsMyA9IG5ldyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIEBCZWFuVmFsaWRhdGlvbihyZXN0cmljdEdyb3VwcyA9IEdyb3VwMS5jbGFzcywgdXNlR3JvdXBzID0gR3JvdXAyLmNsYXNzKQ0KLSAgICBwcml2YXRlIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gbW9kZWw0ID0gbmV3IEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgcHVibGljIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWwxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1vZGVsMTsNCi0gICAgfQ0KLQ0KLSAgICBAQmVhblZhbGlkYXRpb24oY29uZGl0aW9ucyA9ICIje2N1cnJlbnRVc2VyLmFkbWluUm9sZX0iLCByZXN0cmljdEdyb3VwcyA9IEdyb3VwMS5jbGFzcykNCi0gICAgcHVibGljIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWwyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1vZGVsMjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWwzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIGdldE1vZGVsNCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDQ7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvVXNlR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4uamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L1VzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MmU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvVXNlR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwudmlldzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmVhbnZhbC5tb2RlbC5Hcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAxOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZhbGlkYXRpb24uR3JvdXAzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLQ0KLUBCZWFuVmFsaWRhdGlvbih1c2VHcm91cHMgPSBHcm91cDEuY2xhc3MpDQotcHVibGljIGNsYXNzIFVzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuDQotew0KLSAgICBwcml2YXRlIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gbW9kZWwxID0gbmV3IEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4oKTsNCi0NCi0gICAgcHJpdmF0ZSBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsMiA9IG5ldyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIEBCZWFuVmFsaWRhdGlvbih2aWV3SWRzID0geyIvcGFnZXMvcGFnZTEueGh0bWwiLCAiL3BhZ2VzL3BhZ2UyLnhodG1sIn0sdXNlR3JvdXBzID0ge0dyb3VwMi5jbGFzcywgR3JvdXAzLmNsYXNzfSkNCi0gICAgcHJpdmF0ZSBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIG1vZGVsMyA9IG5ldyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuKCk7DQotDQotICAgIEBCZWFuVmFsaWRhdGlvbi5MaXN0KHsNCi0gICAgICAgIEBCZWFuVmFsaWRhdGlvbih1c2VHcm91cHMgPSBHcm91cDIuY2xhc3MsIGNvbmRpdGlvbnMgPSAiI3tjdXJyZW50VXNlci5hZG1pblJvbGV9IiksDQotICAgICAgICBAQmVhblZhbGlkYXRpb24odXNlR3JvdXBzID0ge0dyb3VwMi5jbGFzcywgR3JvdXAzLmNsYXNzfSwgY29uZGl0aW9ucyA9ICIje2N1cnJlbnRVc2VyLnVzZXJSb2xlfSIpDQotICAgIH0pDQotICAgIHByaXZhdGUgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBtb2RlbDQgPSBuZXcgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbigpOw0KLQ0KLSAgICBwdWJsaWMgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWwxOw0KLSAgICB9DQotDQotICAgIEBCZWFuVmFsaWRhdGlvbih1c2VHcm91cHMgPSBHcm91cDIuY2xhc3MpDQotICAgIHB1YmxpYyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuIGdldE1vZGVsMigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtb2RlbDI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4gZ2V0TW9kZWwzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1vZGVsMzsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbiBnZXRNb2RlbDQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbW9kZWw0Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L1VzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Vc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJQYWdlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmY4NWRkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L1VzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iZWFudmFsLnZpZXc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJlYW52YWwubW9kZWwuR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyQmVhbjsNCi0NCi1wdWJsaWMgY2xhc3MgVXNlR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4NCi17DQotICAgIHByaXZhdGUgR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyQmVhbiBtb2RlbCA9IG5ldyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuKCk7DQotDQotICAgIHB1YmxpYyBHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuIGdldE1vZGVsKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1vZGVsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9wb20ueG1sIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZmJmNWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+DQotDQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmUtdGVzdHM8L2FydGlmYWN0SWQ+DQotDQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQ29yZS1UZXN0czwvbmFtZT4NCi0gICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotDQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+dGVzdC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL0Fic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRmMDc5My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL0Fic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UuQWJzdHJhY3RFeFZhbFRlc3RDYXNlOw0KLQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbFRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW52b2tlU3RhcnR1cExpc3RlbmVycygpDQotICAgIHsNCi0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb25UZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjZmVlMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb25UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotcHVibGljIGNsYXNzIFZhbHVlQmluZGluZ0V4cHJlc3Npb25UZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIHB1YmxpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFZhbHVlQmluZGluZ0V4cHJlc3Npb25UZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhbmRhcmRTeW50YXgoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xLnByb3BlcnR5MX0iKTsNCi0NCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjEucHJvcGVydHkxfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjF9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTEiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydwcm9wZXJ0eTEnXX0iKTsNCi0NCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjFbJ3Byb3BlcnR5MSddfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjF9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTEiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydiZWFuMiddLnByb3BlcnR5MX0iKTsNCi0NCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjFbJ2JlYW4yJ10ucHJvcGVydHkxfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjFbJ2JlYW4yJ119IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTEiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFyZFN5bnRheFJlcGxhY2VQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjEucHJvcGVydHkxfSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sICJwcm9wZXJ0eTIiKTsNCi0NCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjEucHJvcGVydHkyfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjF9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTIiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydwcm9wZXJ0eTEnXX0iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2VQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAicHJvcGVydHkyIik7DQotDQotICAgICAgICAvL1RPRE8gcmVzdG9yZSBvcmlnaW5hbCBzeW50YXgNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjEucHJvcGVydHkyfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjF9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTIiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydiZWFuMiddLnByb3BlcnR5MX0iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2VQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAicHJvcGVydHkyIik7DQotDQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xWydiZWFuMiddLnByb3BlcnR5Mn0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xWydiZWFuMiddfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tiZWFuMX0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygicHJvcGVydHkyIiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhbmRhcmRTeW50YXhBZGRQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7YmVhbjEuYmVhbjJ9Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5hZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCAicHJvcGVydHkxIik7DQotDQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xLmJlYW4yLnByb3BlcnR5MX0iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2JlYW4xLmJlYW4yfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygicHJvcGVydHkxIiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVsnYmVhbjInXX0iKTsNCi0NCi0gICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sICJwcm9wZXJ0eTEiKTsNCi0NCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjFbJ2JlYW4yJ10ucHJvcGVydHkxfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjFbJ2JlYW4yJ119IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTEiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKCIje2JlYW4xWydiZWFuMiddLmJlYW4zfSIpOw0KLQ0KLSAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24uYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgInByb3BlcnR5MSIpOw0KLQ0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tiZWFuMVsnYmVhbjInXS5iZWFuMy5wcm9wZXJ0eTF9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tiZWFuMVsnYmVhbjInXS5iZWFuM30iLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7YmVhbjFbJ2JlYW4yJ119IiwNCi0gICAgICAgICAgICAgICAgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEJhc2VFeHByZXNzaW9uKCkuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInByb3BlcnR5MSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhY2VsZXRzQ3VzdG9tQ29tcG9uZW50U3ludGF4KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tlbnRpdHlbZmllbGROYW1lXX0iKTsNCi0NCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiN7ZW50aXR5W2ZpZWxkTmFtZV19IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tlbnRpdHl9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJmaWVsZE5hbWUiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWNlbGV0c0N1c3RvbUNvbXBvbmVudFN5bnRheFJlcGxhY2VQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7ZW50aXR5W2ZpZWxkTmFtZV19Iik7DQotDQotICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5yZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgIm5ld0ZpZWxkTmFtZSIpOw0KLQ0KLSAgICAgICAgLy9UT0RPIHJlc3RvcmUgb3JpZ2luYWwgc3ludGF4DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIje2VudGl0eS5uZXdGaWVsZE5hbWV9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiI3tlbnRpdHl9IiwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJuZXdGaWVsZE5hbWUiLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wbGV4TWFwU3ludGF4KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24NCi0gICAgICAgICAgICAgICAgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3tiZWFuMVtiZWFuMltiZWFuM1sna2V5MSddXV0ucHJvcGVydHkxfSIpOw0KLQ0KLSAgICAgICAgLy9UT0RPDQotICAgICAgICAvL2Fzc2VydEVxdWFscygiI3tiZWFuMVtiZWFuMltiZWFuM1sna2V5MSddXV0ucHJvcGVydHkxfSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInByb3BlcnR5MSIsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbml0aWFsaXplci9SZWdpc3RyYXRpb25Db21wb25lbnRJbml0aWFsaXplclRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2luaXRpYWxpemVyL1JlZ2lzdHJhdGlvbkNvbXBvbmVudEluaXRpYWxpemVyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM5ZjRjMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2luaXRpYWxpemVyL1JlZ2lzdHJhdGlvbkNvbXBvbmVudEluaXRpYWxpemVyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLmluaXRpYWxpemVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvbkNvbXBvbmVudEluaXRpYWxpemVyVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlZ2lzdHJhdGlvbkNvbXBvbmVudEluaXRpYWxpemVyVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvbkNvbXBvbmVudEluaXRpYWxpemVyVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wb25lbnRJbml0aWFsaXplckluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IFRlc3RDb21wb25lbnRJbml0aWFsaXplcjEwMDAoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZENvbXBvbmVudEluaXRpYWxpemVyKG5ldyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMygpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZENvbXBvbmVudEluaXRpYWxpemVyKG5ldyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIxKCkpOw0KLQ0KLSAgICAgICAgTGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4gcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7DQotDQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gNTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5zaXplKCkgPT0gcmVzdWx0TGVuZ3RoKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjIpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIzKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMTAwMCk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RDb21wb25lbnRJbml0aWFsaXplcik7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdENvbXBvbmVudEluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMSkNCi0gICAgY2xhc3MgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMSBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDIpDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjIgaW1wbGVtZW50cyBDb21wb25lbnRJbml0aWFsaXplcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigzKQ0KLSAgICBjbGFzcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIzIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTAwMCkNCi0gICAgY2xhc3MgVGVzdENvbXBvbmVudEluaXRpYWxpemVyMTAwMCBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTc4NTgwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZQ0KLXsNCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBSZWdpc3RyYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWdpc3RyYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JJbml0aWFsaXphdGlvbigpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxMDAwKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjMoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMSgpKTsNCi0NCi0gICAgICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOw0KLQ0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDU7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3VsdExlbmd0aCwgcmVzdWx0LnNpemUoKSk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMi5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjMuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxMDAwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdENvbXBvbmVudEluaXRpYWxpemVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxKQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDIpDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMykNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMyBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxMDAwKQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxMDAwIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvblByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTBkMzI4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUmVnaXN0cmF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVnaXN0cmF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ySW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEwMDAoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IzKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEoKSk7DQotDQotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsNCi0NCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSA2Ow0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHRMZW5ndGgsIHJlc3VsdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMS5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IzLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxMDAwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdENvbXBvbmVudEluaXRpYWxpemVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMSkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMSBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMikNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMiBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMykNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMyBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTAwMCkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMCBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU0ZDM2OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5IdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUmVnaXN0cmF0aW9uVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvblZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ySW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IxKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcihuZXcgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjMoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IxMDAwKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkpOw0KLQ0KLSAgICAgICAgTGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKTsNCi0NCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSA3Ow0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHRMZW5ndGgsIHJlc3VsdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjEuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMi5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IzLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVmlvbGF0aW9uU2V2ZXJpdHlWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhIdG1sQ29yZUNvbXBvbmVudHNWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA1Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMTAwMC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDY6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMSBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigyKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMiBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigzKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMyBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxMDAwKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yMTAwMCBpbXBsZW1lbnRzIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9tYXBwZXIvUmVnaXN0cmF0aW9uTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9tYXBwZXIvUmVnaXN0cmF0aW9uTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTAxYjAxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvbk1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5OYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIuKjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrLk1vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvbk1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlZ2lzdHJhdGlvbk1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvbk1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyNjUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyMTUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyNDUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyMjUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyNTUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOTkoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIzNTAoKSk7DQotDQotICAgICAgICBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gcmVzdWx0ID0gZ2V0TmFtZU1hcHBlcnMoKTsNCi0gICAgICAgIGludCByZXN1bHRMZW5ndGggPSAxNjsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0TGVuZ3RoLCByZXN1bHQuc2l6ZSgpKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOTkuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhDdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyMTUwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjI1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDU6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKERlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIzNTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA3Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgODoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI0NTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA5Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDEwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDExOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDEyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDEzOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjU1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjY1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDE1Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxTdHJpbmc+PiBnZXROYW1lTWFwcGVycygpDQotICAgIHsNCi0gICAgICAgIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkgcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiAoKE1vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5KXJlc3VsdCkuZ2V0UmVnaXN0ZXJlZE5hbWVNYXBwZXJMaXN0KCk7DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoOTkpDQotICAgIGNsYXNzIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOTkgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTUwKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjE1MCBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigyNTApDQotICAgIGNsYXNzIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyMjUwIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDM1MCkNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIzNTAgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoNDUwKQ0KLSAgICBjbGFzcyBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjQ1MCBleHRlbmRzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcig1NTApDQotICAgIGNsYXNzIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyNTUwIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDY1MCkNCi0gICAgY2xhc3MgVGVzdFZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI2NTAgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlclRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTY3YjQzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5OYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyLio7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UubW9jay5Nb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVySW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjMwMSgpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIxNTAoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyNDUwKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjI1MCgpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgICAgICBuZXcgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXI1NTAoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyOTkoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyMzUwKCkpOw0KLQ0KLSAgICAgICAgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IHJlc3VsdCA9IGdldE5hbWVNYXBwZXJzKCk7DQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gMTM7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3VsdExlbmd0aCwgcmVzdWx0LnNpemUoKSk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjk5LmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIxNTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjI1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDU6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDY6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyMzAxLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNzoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgODoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIzNTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA5Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDEwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjQ1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDExOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjU1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDEyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXROYW1lTWFwcGVycygpDQotICAgIHsNCi0gICAgICAgIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkgcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiAoKE1vY2tNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5KXJlc3VsdCkuZ2V0UmVnaXN0ZXJlZE5hbWVNYXBwZXJMaXN0KCk7DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoOTkpDQotICAgIGNsYXNzIFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyOTkgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTUwKQ0KLSAgICBjbGFzcyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjE1MCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigyNTApDQotICAgIGNsYXNzIFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyMjUwIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDMwMSkNCi0gICAgY2xhc3MgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIzMDEgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMzUwKQ0KLSAgICBjbGFzcyBUZXN0TWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcjM1MCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcig0NTApDQotICAgIGNsYXNzIFRlc3RNZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyNDUwIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDU1MCkNCi0gICAgY2xhc3MgVGVzdE1lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXI1NTAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9tYXBwZXIvUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZGNlMzMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9tYXBwZXIvUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuTmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyLio7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS5tb2NrLk1vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGVySW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIxNTAoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI0NTAoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIyNTAoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI1NTAoKSk7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgICAgIG5ldyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI5OSgpKTsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICAgICAgbmV3IFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjM1MCgpKTsNCi0NCi0gICAgICAgIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiByZXN1bHQgPSBnZXROYW1lTWFwcGVycygpOw0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDEzOw0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXN1bHRMZW5ndGgsIHJlc3VsdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoaSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOTkuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhDdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjE1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDQ6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyMjUwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA3Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIzNTAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA4Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgOToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyNDUwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMTA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMTE6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjU1MC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDEyOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gZ2V0TmFtZU1hcHBlcnMoKQ0KLSAgICB7DQotICAgICAgICBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiAoKE1vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSlyZXN1bHQpLmdldFJlZ2lzdGVyZWROYW1lTWFwcGVyTGlzdCgpOw0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDk5KQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI5OSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDE1MCkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyMTUwIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMjUwKQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIyNTAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigzNTApDQotICAgIGNsYXNzIFRlc3RNZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjM1MCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHNvdXJjZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDQ1MCkNCi0gICAgY2xhc3MgVGVzdE1ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyNDUwIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoNTUwKQ0KLSAgICBjbGFzcyBUZXN0TWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI1NTAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSBzb3VyY2UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9DdXN0b21Qcm9qZWN0U3RhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvQ3VzdG9tUHJvamVjdFN0YWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZjE2YjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9DdXN0b21Qcm9qZWN0U3RhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuc3RhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuUHJvamVjdFN0YWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Qcm9qZWN0U3RhZ2VOYW1lOw0KLQ0KLS8qKg0KLSAqIGN1c3RvbSBwcm9qZWN0IHN0YWdlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWVudW0gQ3VzdG9tUHJvamVjdFN0YWdlDQotew0KLSAgICBEZXYoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZSgiRGV2IikpLA0KLSAgICBUZXN0KFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoIlRlc3QiKSksDQotICAgIFByb2QoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZSgiUHJvZCIpKTsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0U3RhZ2VOYW1lIHZhbHVlOw0KLQ0KLSAgICBDdXN0b21Qcm9qZWN0U3RhZ2UoUHJvamVjdFN0YWdlTmFtZSB2YWx1ZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpcyhDdXN0b21Qcm9qZWN0U3RhZ2UgY3VzdG9tUHJvamVjdFN0YWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUHJvamVjdFN0YWdlLmlzKGN1c3RvbVByb2plY3RTdGFnZS5nZXRWYWx1ZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvamVjdFN0YWdlTmFtZSBnZXRWYWx1ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnZhbHVlOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvQ3VzdG9tUHJvamVjdFN0YWdlVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvQ3VzdG9tUHJvamVjdFN0YWdlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEyMzlkOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0N1c3RvbVByb2plY3RTdGFnZVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLnN0YWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5Kc2ZQcm9qZWN0U3RhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlByb2plY3RTdGFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1wdWJsaWMgY2xhc3MgQ3VzdG9tUHJvamVjdFN0YWdlVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9TVEFHRSA9ICJqYXZheC5mYWNlcy5QUk9KRUNUX1NUQUdFIjsNCi0gICAgDQotICAgIHB1YmxpYyBDdXN0b21Qcm9qZWN0U3RhZ2VUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ3VzdG9tUHJvamVjdFN0YWdlVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3REZXZlbG9wbWVudFN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihQUk9KRUNUX1NUQUdFLCAiRGV2Iik7DQotICAgICAgICBhc3NlcnRUcnVlKEN1c3RvbVByb2plY3RTdGFnZS5pcyhDdXN0b21Qcm9qZWN0U3RhZ2UuRGV2KSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFRlc3RTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoUFJPSkVDVF9TVEFHRSwgIlRlc3QiKTsNCi0gICAgICAgIGFzc2VydFRydWUoQ3VzdG9tUHJvamVjdFN0YWdlLmlzKEN1c3RvbVByb2plY3RTdGFnZS5UZXN0KSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFByb2R1Y3Rpb25TdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoUFJPSkVDVF9TVEFHRSwgIlByb2QiKTsNCi0gICAgICAgIGFzc2VydFRydWUoQ3VzdG9tUHJvamVjdFN0YWdlLmlzKEN1c3RvbVByb2plY3RTdGFnZS5Qcm9kKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIGFzc2VydFRydWUoUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5Qcm9kdWN0aW9uLmdldFZhbHVlKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdEZWZhdWx0U3RhZ2UxKCkNCi0gICAgew0KLSAgICAgICAgYXNzZXJ0RmFsc2UoQ3VzdG9tUHJvamVjdFN0YWdlLmlzKEN1c3RvbVByb2plY3RTdGFnZS5EZXYpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdEZWZhdWx0U3RhZ2UyKCkNCi0gICAgew0KLSAgICAgICAgYXNzZXJ0RmFsc2UoQ3VzdG9tUHJvamVjdFN0YWdlLmlzKEN1c3RvbVByb2plY3RTdGFnZS5UZXN0KSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9JbmRlcGVuZGVudFByb2plY3RTdGFnZVRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0luZGVwZW5kZW50UHJvamVjdFN0YWdlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY2YTRmOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0luZGVwZW5kZW50UHJvamVjdFN0YWdlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLnN0YWdlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgSW5kZXBlbmRlbnRQcm9qZWN0U3RhZ2VUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFUEVOREVOVF9QUk9KRUNUX1NUQUdFID0gImN1c3RvbS5QUk9KRUNUX1NUQUdFIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTRl9QUk9KRUNUX1NUQUdFID0gImphdmF4LmZhY2VzLlBST0pFQ1RfU1RBR0UiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0RFViA9ICJjdXN0b21fZGV2IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9QUk9EID0gImN1c3RvbV9wcm9kIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9URVNUID0gImN1c3RvbV90ZXN0IjsNCi0NCi0gICAgcHVibGljIEluZGVwZW5kZW50UHJvamVjdFN0YWdlVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEluZGVwZW5kZW50UHJvamVjdFN0YWdlVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KFByb2plY3RTdGFnZVJlc29sdmVyLmNsYXNzLmdldE5hbWUoKSwgbmV3IERlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpDQotICAgICAgICB7DQotICAgICAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICAgICAgcHVibGljIFByb2plY3RTdGFnZSBnZXRDdXJyZW50UHJvamVjdFN0YWdlKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFN0cmluZyBqc2ZQcm9qZWN0U3RhZ2VOYW1lID0gcmVzb2x2ZVByb2plY3RTdGFnZU5hbWUoImphdmF4LmZhY2VzLlBST0pFQ1RfU1RBR0UiKTsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIGluZGVwZW5kZW50UHJvamVjdFN0YWdlTmFtZSA9IHJlc29sdmVQcm9qZWN0U3RhZ2VOYW1lKElOREVQRU5ERU5UX1BST0pFQ1RfU1RBR0UpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoIShqc2ZQcm9qZWN0U3RhZ2VOYW1lID09IG51bGwgfHwgIiIuZXF1YWxzKGpzZlByb2plY3RTdGFnZU5hbWUpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgUHJvamVjdFN0YWdlTmFtZSByZXN1bHQgPSBQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKGpzZlByb2plY3RTdGFnZU5hbWUudHJpbSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIGZvcihKc2ZQcm9qZWN0U3RhZ2UganNmUHJvamVjdFN0YWdlIDogSnNmUHJvamVjdFN0YWdlLnZhbHVlcygpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGpzZlByb2plY3RTdGFnZS5nZXRWYWx1ZSgpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZShyZXN1bHQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZighKGluZGVwZW5kZW50UHJvamVjdFN0YWdlTmFtZSA9PSBudWxsIHx8ICIiLmVxdWFscyhpbmRlcGVuZGVudFByb2plY3RTdGFnZU5hbWUpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgUHJvamVjdFN0YWdlTmFtZSBpbmRlcGVuZGVudFJlc3VsdCA9IFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoaW5kZXBlbmRlbnRQcm9qZWN0U3RhZ2VOYW1lLnRyaW0oKSk7DQotDQotICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGpzZiBzdGFnZSB2YWx1ZXMgZmlyc3QNCi0gICAgICAgICAgICAgICAgICAgIFByb2plY3RTdGFnZU5hbWUgcmVzdWx0ID0gUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShpbmRlcGVuZGVudFByb2plY3RTdGFnZU5hbWUudHJpbSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIGZvcihKc2ZQcm9qZWN0U3RhZ2UganNmUHJvamVjdFN0YWdlIDogSnNmUHJvamVjdFN0YWdlLnZhbHVlcygpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGpzZlByb2plY3RTdGFnZS5nZXRWYWx1ZSgpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZShyZXN1bHQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgY3VzdG9tIHN0YWdlIHZhbHVlcw0KLSAgICAgICAgICAgICAgICAgICAgaWYoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShDVVNUT01fREVWKS5lcXVhbHMoaW5kZXBlbmRlbnRSZXN1bHQpIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoQ1VTVE9NX1RFU1QpLmVxdWFscyhpbmRlcGVuZGVudFJlc3VsdCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZShpbmRlcGVuZGVudFJlc3VsdCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVByb2plY3RTdGFnZShQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKENVU1RPTV9QUk9EKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZVByb2plY3RTdGFnZU5hbWUoU3RyaW5nIHBhcmFtZXRlck5hbWUpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRJbml0UGFyYW1ldGVyKHBhcmFtZXRlck5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KFByb2plY3RTdGFnZVJlc29sdmVyLmNsYXNzLmdldE5hbWUoKSwgbmV3IERlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGV2ZWxvcG1lbnRTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoSU5ERVBFTkRFTlRfUFJPSkVDVF9TVEFHRSwgQ1VTVE9NX0RFVik7DQotICAgICAgICBhc3NlcnRUcnVlKFByb2plY3RTdGFnZS5pcyhQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKENVU1RPTV9ERVYpKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFRlc3RTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoSU5ERVBFTkRFTlRfUFJPSkVDVF9TVEFHRSwgQ1VTVE9NX1RFU1QpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQcm9qZWN0U3RhZ2UuaXMoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShDVVNUT01fVEVTVCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFsbGJhY2tTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoSU5ERVBFTkRFTlRfUFJPSkVDVF9TVEFHRSwgIlN5c3RlbVRlc3QiKTsNCi0gICAgICAgIGFzc2VydFRydWUoSnNmUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5TeXN0ZW1UZXN0KSk7DQotICAgICAgICBhc3NlcnRUcnVlKFByb2plY3RTdGFnZS5pcyhQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKCJTeXN0ZW1UZXN0IikpKTsNCi0gICAgICAgIGFzc2VydFRydWUoUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5TeXN0ZW1UZXN0LmdldFZhbHVlKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGVKc2ZTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoSU5ERVBFTkRFTlRfUFJPSkVDVF9TVEFHRSwgQ1VTVE9NX0RFVik7DQotICAgICAgICBzZXJ2bGV0Q29udGV4dC5hZGRJbml0UGFyYW1ldGVyKEpTRl9QUk9KRUNUX1NUQUdFLCAiU3lzdGVtVGVzdCIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLlN5c3RlbVRlc3QpKTsNCi0gICAgICAgIGFzc2VydFRydWUoUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5TeXN0ZW1UZXN0LmdldFZhbHVlKCkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZHVjdGlvblN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihJTkRFUEVOREVOVF9QUk9KRUNUX1NUQUdFLCBDVVNUT01fUFJPRCk7DQotICAgICAgICBhc3NlcnRUcnVlKFByb2plY3RTdGFnZS5pcyhQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKENVU1RPTV9QUk9EKSkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICBhc3NlcnRUcnVlKFByb2plY3RTdGFnZS5pcyhQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKENVU1RPTV9QUk9EKSkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ0RlZmF1bHRTdGFnZTEoKQ0KLSAgICB7DQotICAgICAgICBhc3NlcnRGYWxzZShQcm9qZWN0U3RhZ2UuaXMoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShDVVNUT01fREVWKSkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ0RlZmF1bHRTdGFnZTIoKQ0KLSAgICB7DQotICAgICAgICBhc3NlcnRGYWxzZShQcm9qZWN0U3RhZ2UuaXMoUHJvamVjdFN0YWdlLmNyZWF0ZVN0YWdlTmFtZShDVVNUT01fVEVTVCkpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0pzZlByb2plY3RTdGFnZVRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0pzZlByb2plY3RTdGFnZVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MDE1NWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9Kc2ZQcm9qZWN0U3RhZ2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5zdGFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSnNmUHJvamVjdFN0YWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLXB1YmxpYyBjbGFzcyBKc2ZQcm9qZWN0U3RhZ2VUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX1NUQUdFID0gImphdmF4LmZhY2VzLlBST0pFQ1RfU1RBR0UiOw0KLSAgICBwdWJsaWMgSnNmUHJvamVjdFN0YWdlVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEpzZlByb2plY3RTdGFnZVRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGV2ZWxvcG1lbnRTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoUFJPSkVDVF9TVEFHRSwgIkRldmVsb3BtZW50Iik7DQotICAgICAgICBhc3NlcnRUcnVlKEpzZlByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuRGV2ZWxvcG1lbnQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pdFRlc3RTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEluaXRQYXJhbWV0ZXIoUFJPSkVDVF9TVEFHRSwgIlVuaXRUZXN0Iik7DQotICAgICAgICBhc3NlcnRUcnVlKEpzZlByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuVW5pdFRlc3QpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3lzdGVtVGVzdFN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihQUk9KRUNUX1NUQUdFLCAiU3lzdGVtVGVzdCIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLlN5c3RlbVRlc3QpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZHVjdGlvblN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgc2VydmxldENvbnRleHQuYWRkSW5pdFBhcmFtZXRlcihQUk9KRUNUX1NUQUdFLCAiUHJvZHVjdGlvbiIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLlByb2R1Y3Rpb24pKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFN0YWdlKCkNCi0gICAgew0KLSAgICAgICAgYXNzZXJ0VHJ1ZShKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLlByb2R1Y3Rpb24pKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdEZWZhdWx0U3RhZ2UxKCkNCi0gICAgew0KLSAgICAgICAgYXNzZXJ0RmFsc2UoSnNmUHJvamVjdFN0YWdlLmlzKEpzZlByb2plY3RTdGFnZS5EZXZlbG9wbWVudCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ0RlZmF1bHRTdGFnZTIoKQ0KLSAgICB7DQotICAgICAgICBhc3NlcnRGYWxzZShKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLlVuaXRUZXN0KSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFdyb25nRGVmYXVsdFN0YWdlMygpDQotICAgIHsNCi0gICAgICAgIGFzc2VydEZhbHNlKEpzZlByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuU3lzdGVtVGVzdCkpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcG9tLnhtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1NGQwYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD50ZXN0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0NCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBUZXN0LU1vZHVsZXM8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+DQotICAgICAgICAgICAgc2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvdmFsaWRhdGlvbi1tb2R1bGVzDQotICAgICAgICA8L2Nvbm5lY3Rpb24+DQotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj4NCi0gICAgICAgICAgICBzY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvdmFsaWRhdGlvbi1tb2R1bGVzDQotICAgICAgICA8L2RldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy92YWxpZGF0aW9uLW1vZHVsZXM8L3VybD4NCi0gICAgPC9zY20+DQotDQotICAgIDxtb2R1bGVzPg0KLSAgICAgICAgPG1vZHVsZT5iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmU8L21vZHVsZT4NCi0gICAgICAgIDxtb2R1bGU+Y29yZS10ZXN0czwvbW9kdWxlPg0KLSAgICAgICAgPG1vZHVsZT5wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzPC9tb2R1bGU+DQotICAgICAgICA8bW9kdWxlPmJlYW4tdmFsaWRhdGlvbi10ZXN0czwvbW9kdWxlPg0KLSAgICA8L21vZHVsZXM+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjU8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldC5qc3A8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNwLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zaGFsZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zaGFsZS10ZXN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC40PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4NCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5teWZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgPC9leGNsdXNpb25zPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICA8L2RlcGVuZGVuY2llcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQotICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgPC9yZXNvdXJjZXM+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLQ0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+dGVzdC1qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotDQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQuMjwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovQWJzdHJhY3QqLmphdmE8L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovQmFzZSouamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9UZXN0VXRpbHMuamF2YTwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qQmVhbi5qYXZhPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgPC9wbHVnaW5zPg0KLSAgICA8L2J1aWxkPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvcG9tLnhtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjI0MzBkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC1tb2R1bGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFByb3BlcnR5LVZhbGlkYXRpb24tVGVzdHM8L25hbWU+DQotICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPnRlc3QtbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmU8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLQ0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QtbW9kdWxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlLXRlc3RzPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPg0KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9BYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL0Fic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5NTNkNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL0Fic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmJhc2UuQWJzdHJhY3RFeFZhbFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0RXhWYWxUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIEFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGludm9rZVN0YXJ0dXBMaXN0ZW5lcnMoKQ0KLSAgICB7DQotICAgICAgICBuZXcgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyKCl7DQotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDIzMDc2OTIwOTI2NzUyNjQ2TDsNCi0NCi0gICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHN1cGVyLmluaXQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9LmluaXQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgbmV3IENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIoKS5hZnRlclBoYXNlKG5ldyBQaGFzZUV2ZW50KGZhY2VzQ29udGV4dCwgUGhhc2VJZC5BTllfUEhBU0UsbGlmZWN5Y2xlKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9CYXNlVmFsVGVzdEJlYW4uamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvQmFzZVZhbFRlc3RCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NTQzZjguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9CYXNlVmFsVGVzdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uRG91YmxlUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUmVxdWlyZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBCYXNlVmFsVGVzdEJlYW4NCi17DQotICAgIEBSZXF1aXJlZA0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOw0KLQ0KLSAgICBATGVuZ3RoKG1pbmltdW09MixtYXhpbXVtPTMpDQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWUxOw0KLQ0KLSAgICBAUGF0dGVybigiW0EtWl1bYS16XSsiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwYXR0ZXJuTmFtZTsNCi0NCi0gICAgQERvdWJsZVJhbmdlKG1pbmltdW09LTMwMGQpDQotICAgIHByaXZhdGUgRG91YmxlIGRvdWJsZVZhbHVlMTsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5hbWUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUxKFN0cmluZyBuYW1lMSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uYW1lMSA9IG5hbWUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0dGVybk5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcGF0dGVybk5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGF0dGVybk5hbWUoU3RyaW5nIHBhdHRlcm5OYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhdHRlcm5OYW1lID0gcGF0dGVybk5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERvdWJsZSBnZXREb3VibGVWYWx1ZTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZG91YmxlVmFsdWUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERvdWJsZVZhbHVlMShEb3VibGUgZG91YmxlVmFsdWUxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRvdWJsZVZhbHVlMSA9IGRvdWJsZVZhbHVlMTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL0N1c3RvbVNldmVyaXR5VGVzdEJlYW4uamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvQ3VzdG9tU2V2ZXJpdHlUZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTc3ZmZlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvQ3VzdG9tU2V2ZXJpdHlUZXN0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jdXN0b20uQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotcHVibGljIGNsYXNzIEN1c3RvbVNldmVyaXR5VGVzdEJlYW4NCi17DQotICAgIEBSZXF1aXJlZChwYXJhbWV0ZXJzID0gQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHkuV2FybmluZy5jbGFzcykNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvQmFzZVZhbFRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvQmFzZVZhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZDA3NjEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL0Jhc2VWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuYmFzZXZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLkFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuQmFzZVZhbFRlc3RCZWFuOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQmFzZVZhbFRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZQ0KLXsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIEJhc2VWYWxUZXN0QmVhbiBiZWFuID0gbnVsbDsNCi0NCi0gICAgcHVibGljIEJhc2VWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudCA9IG51bGw7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgICAgIGJlYW4gPSBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEJhc2VWYWxUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgICAgICBiZWFuID0gbmV3IEJhc2VWYWxUZXN0QmVhbigpOw0KLSAgICAgICAgVmFsdWVCaW5kaW5nIHZiID0gYXBwbGljYXRpb24uY3JlYXRlVmFsdWVCaW5kaW5nKCIje3Rlc3RCZWFufSIpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKS5wdXQoInRlc3RCZWFuIiwgYmVhbik7DQotDQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsNCi0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsNCi0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudCA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldElkKCJpbnB1dDEiKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudCA9IG51bGw7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgICAgIGJlYW4gPSBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lUmVxdWlyZWRGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLm5hbWV9Iik7DQotDQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lMUxlbmdodE1heEZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZTF9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIjEyMzQ1Iik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lMUxlbmdodENvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZTF9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lMUxlbmdodE1pbkZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZTF9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIngiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRGYWxzZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWUxTm9MZW5naHQoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZTF9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoaW5wdXRDb21wb25lbnQuaXNWYWxpZCgpKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXR0ZXJuTmFtZUZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucGF0dGVybk5hbWV9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIlBldGVyMSIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0dGVybk5vTmFtZSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wYXR0ZXJuTmFtZX0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFBhdHRlcm5OYW1lQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wYXR0ZXJuTmFtZX0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiUGV0ZXIiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWVGYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLmRvdWJsZVZhbHVlMX0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiLTMwMSIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVmFsdWVDb3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLmRvdWJsZVZhbHVlMX0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiMjAwIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMjAwZCwgaW5wdXRDb21wb25lbnQuZ2V0VmFsdWUoKSk7DQotDQotICAgICAgICBpbnB1dENvbXBvbmVudC51cGRhdGVNb2RlbChmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMGQsIGJlYW4uZ2V0RG91YmxlVmFsdWUxKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVOb1ZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLmRvdWJsZVZhbHVlMX0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudC5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudC52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dENvbXBvbmVudC5pc1ZhbGlkKCkpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL0N1c3RvbVNldmVyaXR5MVRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M2YThjYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLkFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuQ3VzdG9tU2V2ZXJpdHlUZXN0QmVhbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jdXN0b20uQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotcHVibGljIGNsYXNzIEN1c3RvbVNldmVyaXR5MVRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZQ0KLXsNCi0gICAgcHJpdmF0ZSBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgcHJpdmF0ZSBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICBwcml2YXRlIEN1c3RvbVNldmVyaXR5VGVzdEJlYW4gYmVhbiA9IG51bGw7DQotDQotICAgIHB1YmxpYyBDdXN0b21TZXZlcml0eTFUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudCA9IG51bGw7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgICAgIGJlYW4gPSBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEN1c3RvbVNldmVyaXR5MVRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0gICAgICAgIGJlYW4gPSBuZXcgQ3VzdG9tU2V2ZXJpdHlUZXN0QmVhbigpOw0KLSAgICAgICAgVmFsdWVCaW5kaW5nIHZiID0gYXBwbGljYXRpb24uY3JlYXRlVmFsdWVCaW5kaW5nKCIje3Rlc3RCZWFufSIpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKS5wdXQoInRlc3RCZWFuIiwgYmVhbik7DQotDQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsNCi0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsNCi0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudCA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldElkKCJpbnB1dDEiKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudCA9IG51bGw7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgICAgIGJlYW4gPSBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21WYWxpZGF0aW9uUGFyYW1ldGVyVmlhR2xvYmFsUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eShWaW9sYXRpb25TZXZlcml0eS5jbGFzcy5nZXROYW1lKCksIEN1c3RvbVZpb2xhdGlvblNldmVyaXR5LmNsYXNzKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZX0iKTsNCi0NCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21WYWxpZGF0aW9uUGFyYW1ldGVyVmlhU3RhdGljQ29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MuZ2V0TmFtZSgpLCBDdXN0b21WaW9sYXRpb25TZXZlcml0eS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlZBTElEQVRJT05fUEFSQU1FVEVSX0NPTkZJRywgY29uZmlnKTsNCi0NCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudCwgInZhbHVlIiwgIiN7dGVzdEJlYW4ubmFtZX0iKTsNCi0NCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIGlucHV0Q29tcG9uZW50LnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBhc3NlcnRUcnVlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZVNldmVyaXRpZXMoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmtub3duVmFsaWRhdGlvblBhcmFtZXRlcigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50LCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5uYW1lfSIpOw0KLQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIGFzc2VydEZhbHNlKGlucHV0Q29tcG9uZW50LmlzVmFsaWQoKSk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZCh0cnVlKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvQWRkaXRpb25hbFZhbGlkYXRvci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9BZGRpdGlvbmFsVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNDJkMjEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9BZGRpdGlvbmFsVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlBhcmFtZXRlclZhbHVlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBBZGRpdGlvbmFsVmFsaWRhdG9yIGV4dGVuZHMgVGVzdFZhbGlkYXRvclByb3ZpZGVyDQotew0KLSAgICBAUGFyYW1ldGVyVmFsdWUNCi0gICAgcHVibGljIENsYXNzIGdldFByb3ZpZGVyQ2xhc3MoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQWRkaXRpb25hbFZhbGlkYXRvci5jbGFzczsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuICJ2YWxpZGF0aW9uX2ZhaWxlZCI7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1BhcmFtZXRlclRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1BhcmFtZXRlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MTMxODUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9QYXJhbWV0ZXJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuYmFzZXZhbC5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShQYXJhbWV0ZXJUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlclN0eWxlT25lKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpOw0KLQ0KLSAgICAgICAgVGVzdFBlcnNvbiBwZXJzb24gPSBuZXcgVGVzdFBlcnNvbigpOw0KLSAgICAgICAgUmVxdWlyZWQgcmVxdWlyZWQgPSBwZXJzb24uZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJmaXJzdE5hbWUiKS5nZXRBbm5vdGF0aW9uKFJlcXVpcmVkLmNsYXNzKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQpLmNvbnRhaW5zS2V5KFZpb2xhdGlvblNldmVyaXR5LmNsYXNzKSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBWaW9sYXRpb25TZXZlcml0eS5jbGFzcykuaXRlcmF0b3IoKS5uZXh0KCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOLCBleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MpLml0ZXJhdG9yKCkubmV4dCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyU3R5bGVUd28oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCk7DQotDQotICAgICAgICBUZXN0UGVyc29uIHBlcnNvbiA9IG5ldyBUZXN0UGVyc29uKCk7DQotICAgICAgICBSZXF1aXJlZCByZXF1aXJlZCA9IHBlcnNvbi5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoImxhc3ROYW1lIikuZ2V0QW5ub3RhdGlvbihSZXF1aXJlZC5jbGFzcyk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkKS5jb250YWluc0tleSgiY2xpZW50X3NpZGVfdmFsaWRhdGlvbl9zdXBwb3J0IikpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgImNsaWVudF9zaWRlX3ZhbGlkYXRpb25fc3VwcG9ydCIpLml0ZXJhdG9yKCkubmV4dCgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsICJjbGllbnRfc2lkZV92YWxpZGF0aW9uX3N1cHBvcnQiKS5pdGVyYXRvcigpLm5leHQoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlclN0eWxlVGhyZWUoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCk7DQotDQotICAgICAgICBUZXN0UGVyc29uIHBlcnNvbiA9IG5ldyBUZXN0UGVyc29uKCk7DQotICAgICAgICBSZXF1aXJlZCByZXF1aXJlZCA9IHBlcnNvbi5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoImxhc3ROYW1lIikuZ2V0QW5ub3RhdGlvbihSZXF1aXJlZC5jbGFzcyk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkKS5jb250YWluc0tleShUZXN0UHJpb3JpdHkuY2xhc3MpKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFRlc3RQcmlvcml0eS5jbGFzcykuaXRlcmF0b3IoKS5uZXh0KCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEpLCBleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgVGVzdFByaW9yaXR5LmNsYXNzLCBJbnRlZ2VyLmNsYXNzKS5pdGVyYXRvcigpLm5leHQoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFRlc3RQcmlvcml0eS5jbGFzcywgU3RyaW5nLmNsYXNzKS5zaXplKCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJkbyBpdCBhc2FwIiwgZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFRlc3RQcmlvcml0eS5jbGFzcywgU3RyaW5nLmNsYXNzLCBUZXN0UHJpb3JpdHkuU2hvcnREZXNjcmlwdGlvbi5jbGFzcykpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJkbyBpdCBpbW1lZGlhdGVseSIsIGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBUZXN0UHJpb3JpdHkuY2xhc3MsIFN0cmluZy5jbGFzcywgVGVzdFByaW9yaXR5LkxvbmdEZXNjcmlwdGlvbi5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJTdHlsZUZvdXIoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCk7DQotDQotICAgICAgICBUZXN0UGVyc29uIHBlcnNvbiA9IG5ldyBUZXN0UGVyc29uKCk7DQotICAgICAgICBSZXF1aXJlZCByZXF1aXJlZCA9IHBlcnNvbi5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoImxhc3ROYW1lIikuZ2V0QW5ub3RhdGlvbihSZXF1aXJlZC5jbGFzcyk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkKS5jb250YWluc0tleShQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcykpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MpLml0ZXJhdG9yKCkubmV4dCgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MpLnNpemUoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoVGVzdFZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcy5nZXROYW1lKCksIGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcywgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MpLml0ZXJhdG9yKCkubmV4dCgpLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyU3R5bGVGaXZlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpOw0KLQ0KLSAgICAgICAgVGVzdFBlcnNvbiBwZXJzb24gPSBuZXcgVGVzdFBlcnNvbigpOw0KLSAgICAgICAgUmVxdWlyZWQgcmVxdWlyZWQgPSBwZXJzb24uZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJsYXN0TmFtZSIpLmdldEFubm90YXRpb24oUmVxdWlyZWQuY2xhc3MpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCkuY29udGFpbnNLZXkoRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzKSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpLml0ZXJhdG9yKCkubmV4dCgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzKS5zaXplKCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MsIENsYXNzLmNsYXNzKS5zaXplKCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCksIGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkLCBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MsIENsYXNzLmNsYXNzKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIFRPRE8gdGhlc2UgdGVzdHMgd29yayBpbiBhbiBpZGUgYnV0IG5vdCB2aWEgY29tbWFuZGxpbmUgLSBpdCdzIGEgU3VyZWZpcmUgaXNzdWUNCi0gICAgICovDQotICAgIC8qDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJTdHlsZVNpeCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKTsNCi0NCi0gICAgICAgIFRlc3RQZXJzb24gcGVyc29uID0gbmV3IFRlc3RQZXJzb24oKTsNCi0gICAgICAgIFJlcXVpcmVkIHJlcXVpcmVkID0gcGVyc29uLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgibGFzdE5hbWUiKS5nZXRBbm5vdGF0aW9uKFJlcXVpcmVkLmNsYXNzKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQpLmNvbnRhaW5zS2V5KFRlc3RWYWxpZGF0b3JQcm92aWRlci5jbGFzcykpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHRyYWN0b3IuZXh0cmFjdChyZXF1aXJlZCwgVGVzdFZhbGlkYXRvclByb3ZpZGVyLmNsYXNzKS5pdGVyYXRvcigpLm5leHQoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFRlc3RWYWxpZGF0b3JQcm92aWRlci5jbGFzcywgQ2xhc3MuY2xhc3MpLnNpemUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlclN0eWxlU2V2ZW4oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCk7DQotDQotICAgICAgICBUZXN0UGVyc29uIHBlcnNvbiA9IG5ldyBUZXN0UGVyc29uKCk7DQotICAgICAgICBSZXF1aXJlZCByZXF1aXJlZCA9IHBlcnNvbi5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoImxhc3ROYW1lIikuZ2V0QW5ub3RhdGlvbihSZXF1aXJlZC5jbGFzcyk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4dHJhY3Rvci5leHRyYWN0KHJlcXVpcmVkKS5jb250YWluc0tleShUZXN0VmFsaWRhdG9yUHJvdmlkZXIuY2xhc3MpKTsNCi0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudENsYXNzIDogZXh0cmFjdG9yLmV4dHJhY3QocmVxdWlyZWQsIFRlc3RWYWxpZGF0b3JQcm92aWRlci5jbGFzcywgQ2xhc3MuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFzc2VydFRydWUoVGVzdFZhbGlkYXRvclByb3ZpZGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY3VycmVudENsYXNzKSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgKi8NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0QWxsb3dDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0QWxsb3dDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjNiOTczLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdEFsbG93Q2xpZW50U2lkZVZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuYmFzZXZhbC5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlBhcmFtZXRlclZhbHVlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5QYXJhbWV0ZXJLZXk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotDQotcHVibGljIGludGVyZmFjZSBUZXN0QWxsb3dDbGllbnRTaWRlVmFsaWRhdGlvbiBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi17DQotICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgcHVibGljIFN0cmluZyBLRVkgPSAiY2xpZW50X3NpZGVfdmFsaWRhdGlvbl9zdXBwb3J0IjsNCi0NCi0gICAgQFBhcmFtZXRlclZhbHVlDQotICAgIGJvb2xlYW4gdmFsdWUgPSB0cnVlOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3REZW55Q2xpZW50U2lkZVZhbGlkYXRpb24uamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdERlbnlDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjkzZGNkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdERlbnlDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5iYXNldmFsLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuUGFyYW1ldGVyVmFsdWU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlBhcmFtZXRlcktleTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIFRlc3REZW55Q2xpZW50U2lkZVZhbGlkYXRpb24gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotew0KLSAgICBAUGFyYW1ldGVyS2V5DQotICAgIHB1YmxpYyBTdHJpbmcga2V5ID0gImNsaWVudF9zaWRlX3ZhbGlkYXRpb25fc3VwcG9ydCI7DQotDQotICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICBib29sZWFuIHZhbHVlID0gZmFsc2U7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFBlcnNvbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODM0OTQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5iYXNldmFsLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdFBlcnNvbg0KLXsNCi0gICAgQFJlcXVpcmVkKHBhcmFtZXRlcnMgPSB7VmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcywgVGVzdEFsbG93Q2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3N9KQ0KLSAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7DQotDQotICAgIEBSZXF1aXJlZChwYXJhbWV0ZXJzID0gew0KLSAgICAgICAgICAgIFZpb2xhdGlvblNldmVyaXR5LkluZm8uY2xhc3MsDQotICAgICAgICAgICAgVGVzdERlbnlDbGllbnRTaWRlVmFsaWRhdGlvbi5jbGFzcywNCi0gICAgICAgICAgICBUZXN0UHJpb3JpdHlIaWdoLmNsYXNzLA0KLSAgICAgICAgICAgIFRlc3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsDQotICAgICAgICAgICAgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLA0KLSAgICAgICAgICAgIC8vTG9naW5WYWxpZGF0b3IuY2xhc3MsDQotICAgICAgICAgICAgQWRkaXRpb25hbFZhbGlkYXRvci5jbGFzc30pDQotICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOw0KLQ0KLSAgICBwcml2YXRlIGludCBmYWlsZWRMb2dpbnMgPSAwOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlckxvY2tlZDsNCi0NCi0gICAgLyoNCi0gICAgICogVE9ETyB0aGVzZSB0ZXN0cyB3b3JrIGluIGFuIGlkZSBidXQgbm90IHZpYSBjb21tYW5kbGluZSAtIGl0J3MgYSBTdXJlZmlyZSBpc3N1ZQ0KLSAgICAgKi8NCi0gICAgLyoNCi0gICAgcHVibGljIGNsYXNzIExvZ2luVmFsaWRhdG9yIGV4dGVuZHMgVGVzdFZhbGlkYXRvclByb3ZpZGVyDQotICAgIHsNCi0gICAgICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgcHVibGljIFRlc3RWYWxpZGF0aW9uU3RyYXRlZ3lQcm92aWRlciBnZXRWYWx1ZSgpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQotICAgICAgICB9DQotDQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHB1YmxpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25TdHJhdGVneSgpIHsNCi0NCi0gICAgICAgICAgICAgICAgaW50IGZhaWxlZExvZ2luczsNCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoKHRoaXMuZmFpbGVkTG9naW5zID0gaXNMb2dpblN1Y2Nlc3NmdWwoKSkgPiAwKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuZmFpbGVkTG9naW5zID4gMykNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2soKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgICovDQotDQotICAgIHByaXZhdGUgaW50IGlzTG9naW5TdWNjZXNzZnVsKCkNCi0gICAgew0KLSAgICAgICAgLy9mb3JjZSBhbiBleGNlcHRpb24NCi0gICAgICAgIHJldHVybiArK3RoaXMuZmFpbGVkTG9naW5zOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzTG9ja2VkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHVzZXJMb2NrZWQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGxvY2soKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnVzZXJMb2NrZWQgPSB0cnVlOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGxhc3ROYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5LmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQcmlvcml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTllOGM0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5QYXJhbWV0ZXJWYWx1ZTsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIFRlc3RQcmlvcml0eSBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi17DQotICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICBJbnRlZ2VyIGdldFZhbHVlKCk7DQotDQotICAgIEBQYXJhbWV0ZXJWYWx1ZShpZCA9IFNob3J0RGVzY3JpcHRpb24uY2xhc3MpDQotICAgIFN0cmluZyBnZXRTaG9ydERlc2NyaXB0aW9uKCk7DQotDQotICAgIEBQYXJhbWV0ZXJWYWx1ZShpZCA9IExvbmdEZXNjcmlwdGlvbi5jbGFzcykNCi0gICAgU3RyaW5nIGdldExvbmdEZXNjcmlwdGlvbigpOw0KLQ0KLSAgICBpbnRlcmZhY2UgU2hvcnREZXNjcmlwdGlvbnt9DQotICAgIGludGVyZmFjZSBMb25nRGVzY3JpcHRpb257fQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQcmlvcml0eUhpZ2guamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5SGlnaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWZhMmRhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5SGlnaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5iYXNldmFsLnBhcmFtZXRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdFByaW9yaXR5SGlnaCBpbXBsZW1lbnRzIFRlc3RQcmlvcml0eQ0KLXsNCi0gICAgcHVibGljIEludGVnZXIgZ2V0VmFsdWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNob3J0RGVzY3JpcHRpb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gImRvIGl0IGFzYXAiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9uZ0Rlc2NyaXB0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICJkbyBpdCBpbW1lZGlhdGVseSI7DQotICAgIH0NCi0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UHJpb3JpdHlMb3cuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5TG93LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MmY1ZWQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UHJpb3JpdHlMb3cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuYmFzZXZhbC5wYXJhbWV0ZXI7DQotDQotcHVibGljIGNsYXNzIFRlc3RQcmlvcml0eUxvdyBpbXBsZW1lbnRzIFRlc3RQcmlvcml0eQ0KLXsNCi0gICAgcHVibGljIEludGVnZXIgZ2V0VmFsdWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gMzsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNob3J0RGVzY3JpcHRpb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIm5vdCB0aGF0IGltcG9ydGFudCI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMb25nRGVzY3JpcHRpb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gInRoZSB0b3BpYyBpcyBub3QgdGhhdCBpbXBvcnRhbnQiOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MTIyODMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuUGFyYW1ldGVyVmFsdWU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1ASW52b2NhdGlvbk9yZGVyKDIxMCkNCi1wdWJsaWMgY2xhc3MgVGVzdFZhbGlkYXRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi0NCi0gICAgQFBhcmFtZXRlclZhbHVlDQotICAgIHB1YmxpYyBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBnZXRJbnN0YW5jZSgpDQotICAgIHsNCi0gICAgICAgIGlmKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgPSBuZXcgVGVzdFZhbGlkYXRpb25JbnRlcmNlcHRvcigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGJlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJpdCdzIGEgdGVzdCBjbGFzcyIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIml0J3MgYSB0ZXN0IGNsYXNzIik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdGlvblN0cmF0ZWd5UHJvdmlkZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFZhbGlkYXRpb25TdHJhdGVneVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNzllMmQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdGlvblN0cmF0ZWd5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuYmFzZXZhbC5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgVGVzdFZhbGlkYXRpb25TdHJhdGVneVByb3ZpZGVyDQotew0KLSAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFZhbGlkYXRvclByb3ZpZGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0b3JQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjY1OGU5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFZhbGlkYXRvclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmJhc2V2YWwucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuUGFyYW1ldGVyS2V5Ow0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0VmFsaWRhdG9yUHJvdmlkZXIgaW1wbGVtZW50cyBWYWxpZGF0aW9uUGFyYW1ldGVyLCBUZXN0VmFsaWRhdGlvblN0cmF0ZWd5UHJvdmlkZXINCi17DQotICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgcHVibGljIENsYXNzIGdldEtleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBUZXN0VmFsaWRhdG9yUHJvdmlkZXIuY2xhc3M7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIGl0IGlzbid0IGFsbG93ZWQgdG8gaGF2ZSBhbiBhYnN0cmFjdCBjbGFzcyBpbiB0aGlzIGNhc2UgLSBzbyB0aGlzIGltcGwuIGlzIHJlcXVpcmVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneSgpDQotICAgIHsNCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInlvdSBoYXZlIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kIik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RCZWFuLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFmMjczOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlDQotICovDQotcHVibGljIGNsYXNzIENyb3NzVmFsVGVzdEJlYW4NCi17DQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0NCi0gICAgQEVxdWFscygicHJvcGVydHkxIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkyOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTE7DQotICAgIH0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKFN0cmluZyBwcm9wZXJ0eTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOw0KLSAgICB9DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsNCi0gICAgfQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwNDdlZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLkFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U7DQotDQotLyoqDQotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbFRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZQ0KLXsNCi0NCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotDQotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHB1YmxpYyBDcm9zc1ZhbFRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ3Jvc3NWYWxUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgQ3Jvc3NWYWxUZXN0QmVhbiBiZWFuID0gbmV3IENyb3NzVmFsVGVzdEJlYW4oKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhudWxsLCAidmFsdWUiLCAiI3t0ZXN0QmVhbn0iKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucHV0KCJ0ZXN0QmVhbiIsYmVhbik7DQotDQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsNCi0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsNCi0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldElkKCJpbnB1dDEiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0SWQoImlucHV0MiIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc0ZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDQiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgyKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRUxDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRUxDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJiY2QxMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VMQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWwubW9jay5Nb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLnV0aWwuTWV0aG9kVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIEVMQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlIGV4dGVuZHMgRUxDcm9zc1ZhbFRlc3RDYXNlDQotew0KLSAgICBwdWJsaWMgRUxDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEVMQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotDQotICAgICAgICBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbigpOw0KLQ0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoRXF1YWxzLmNsYXNzLmdldE5hbWUoKSwgTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfQ09ORklHLCBjb25maWcpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCByZXRlc3QgdGhpcyB0ZXN0LWNhc2UNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdENyb3NzQ29tcG9uZW50RXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgcmV0ZXN0IHRoaXMgdGVzdC1jYXNlDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKTsNCi0gICAgICAgIGFzc2VydEZhbHNlKE1ldGhvZFV0aWxzLmlzTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShNZXRob2RVdGlscy5pc01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiKSk7DQotICAgICAgICAvLzF4IGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5IGFuZCAxeCBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsDQotICAgICAgICBhc3NlcnRUcnVlKE1ldGhvZFV0aWxzLmNoZWNrTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIsIDIpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FTENyb3NzVmFsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q4ZTkzMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5EYXRlVGltZUNvbnZlcnRlcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIEVMQ3Jvc3NWYWxUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UNCi17DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLQ0KLSAgICBVSVZpZXdSb290IHJvb3RDb21wb25lbnQgPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgRUxDcm9zc1ZhbFRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRUxDcm9zc1ZhbFRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgICAgICBjcmVhdGVSZXF1ZXN0U2NvcGVkQmVhbigiYmVhbjEiLCBnZXRFbnRpdHlJbnN0YW5jZSgpKTsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJiZWFuMiIsIGdldEVudGl0eUluc3RhbmNlKCkpOw0KLQ0KLQ0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7DQotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7DQotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7DQotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOw0KLQ0KLSAgICAgICAgLy9pbnB1dDENCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0SWQoImlucHV0MSIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldENvbnZlcnRlcihuZXcgRGF0ZVRpbWVDb252ZXJ0ZXIoKSk7DQotICAgICAgICAoKERhdGVUaW1lQ29udmVydGVyKWlucHV0Q29tcG9uZW50MS5nZXRDb252ZXJ0ZXIoKSkuc2V0UGF0dGVybigiZGQuTU0ueXl5eSIpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDEpOw0KLQ0KLSAgICAgICAgLy9pbnB1dDINCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0SWQoImlucHV0MiIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldENvbnZlcnRlcihuZXcgRGF0ZVRpbWVDb252ZXJ0ZXIoKSk7DQotICAgICAgICAoKERhdGVUaW1lQ29udmVydGVyKWlucHV0Q29tcG9uZW50Mi5nZXRDb252ZXJ0ZXIoKSkuc2V0UGF0dGVybigiZGQuTU0ueXl5eSIpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTENyb3NzQ29tcG9uZW50VmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZUVMQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTIuMTIuMjAwOCIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRUxDcm9zc0NvbXBvbmVudFZhbGlkYXRpb25Vc2VDYXNlKFN0cmluZyB2YWx1ZUJlYW4xUHJvcGVydHkxLCBTdHJpbmcgdmFsdWVCZWFuMVByb3BlcnR5MiwgU3RyaW5nIHZhbHVlQmVhbjJQcm9wZXJ0eTEsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3tiZWFuMS5kYXRlMX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje2JlYW4yLmRhdGUyfSIpOw0KLQ0KLSAgICAgICAgLy9zZXQgbW9kZWwgdmFsdWVzDQotICAgICAgICByZXNvbHZlQmVhbigiYmVhbjEiLCBnZXRFbnRpdHlJbnN0YW5jZSgpLmdldENsYXNzKCkpLnNldERhdGUyKChEYXRlKWlucHV0Q29tcG9uZW50MS5nZXRDb252ZXJ0ZXIoKS5nZXRBc09iamVjdChmYWNlc0NvbnRleHQsIGlucHV0Q29tcG9uZW50MSwgdmFsdWVCZWFuMVByb3BlcnR5MikpOw0KLSAgICAgICAgcmVzb2x2ZUJlYW4oImJlYW4yIiwgZ2V0RW50aXR5SW5zdGFuY2UoKS5nZXRDbGFzcygpKS5zZXREYXRlMSgoRGF0ZSlpbnB1dENvbXBvbmVudDIuZ2V0Q29udmVydGVyKCkuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dENvbXBvbmVudDIsIHZhbHVlQmVhbjJQcm9wZXJ0eTEpKTsNCi0NCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVCZWFuMVByb3BlcnR5MSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVCZWFuMlByb3BlcnR5Mik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZUVMTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiKTsNCi0NCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKCIxNC4wNS4xOTgzIiwgIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIsICIxMi4xMi4yMDA4Iik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVFTE1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb25Vc2VDYXNlKFN0cmluZyB2YWx1ZUJlYW4xUHJvcGVydHkxLCBTdHJpbmcgdmFsdWVCZWFuMVByb3BlcnR5MiwgU3RyaW5nIHZhbHVlQmVhbjJQcm9wZXJ0eTEsIFN0cmluZyB2YWx1ZUJlYW4yUHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3tiZWFuMS5kYXRlMX0iKTsNCi0NCi0gICAgICAgIC8vc2V0IG1vZGVsIHZhbHVlcw0KLSAgICAgICAgcmVzb2x2ZUJlYW4oImJlYW4xIiwgZ2V0RW50aXR5SW5zdGFuY2UoKS5nZXRDbGFzcygpKS5zZXREYXRlMigoRGF0ZSlpbnB1dENvbXBvbmVudDEuZ2V0Q29udmVydGVyKCkuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dENvbXBvbmVudDEsIHZhbHVlQmVhbjFQcm9wZXJ0eTIpKTsNCi0gICAgICAgIHJlc29sdmVCZWFuKCJiZWFuMiIsIGdldEVudGl0eUluc3RhbmNlKCkuZ2V0Q2xhc3MoKSkuc2V0RGF0ZTEoKERhdGUpaW5wdXRDb21wb25lbnQyLmdldENvbnZlcnRlcigpLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgaW5wdXRDb21wb25lbnQyLCB2YWx1ZUJlYW4yUHJvcGVydHkxKSk7DQotICAgICAgICByZXNvbHZlQmVhbigiYmVhbjIiLCBnZXRFbnRpdHlJbnN0YW5jZSgpLmdldENsYXNzKCkpLnNldERhdGUyKChEYXRlKWlucHV0Q29tcG9uZW50Mi5nZXRDb252ZXJ0ZXIoKS5nZXRBc09iamVjdChmYWNlc0NvbnRleHQsIGlucHV0Q29tcG9uZW50MiwgdmFsdWVCZWFuMlByb3BlcnR5MikpOw0KLQ0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSh2YWx1ZUJlYW4xUHJvcGVydHkxKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEVMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4gZ2V0RW50aXR5SW5zdGFuY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEVMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4oKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRUxDcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTczZDEyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRUxDcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRUxDcm9zc1ZhbFRlc3REYXRlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZSBERUZBVUxUX0RBVEUgPSBuZXcgRGF0ZSgpOw0KLQ0KLSAgICBARXF1YWxzKCIje2JlYW4yLmRhdGUyfSIpDQotICAgIHByaXZhdGUgRGF0ZSBkYXRlMSA9IERFRkFVTFRfREFURTsNCi0NCi0gICAgcHJpdmF0ZSBEYXRlIGRhdGUyID0gREVGQVVMVF9EQVRFOw0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlMSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkYXRlMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlMShEYXRlIGRhdGUxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRhdGUxID0gZGF0ZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGF0ZTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZTIoRGF0ZSBkYXRlMikNCi0gICAgew0KLSAgICAgICAgdGhpcy5kYXRlMiA9IGRhdGUyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxY2E0ZWYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWwubW9jay5Nb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLnV0aWwuTWV0aG9kVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIExvY2FsUHJvcGVydHlDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UgZXh0ZW5kcyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTG9jYWxQcm9wZXJ0eUNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLQ0KLSAgICAgICAgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24oKTsNCi0NCi0gICAgICAgIGNvbmZpZy5hZGRNYXBwaW5nKEVxdWFscy5jbGFzcy5nZXROYW1lKCksIE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRywgY29uZmlnKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHJldGVzdCB0aGlzIHRlc3QtY2FzZQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCByZXRlc3QgdGhpcyB0ZXN0LWNhc2UNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKTsNCi0gICAgICAgIGFzc2VydEZhbHNlKE1ldGhvZFV0aWxzLmlzTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci50ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkZhaWxlZFZhbGlkYXRpb24oKTsNCi0gICAgICAgIGFzc2VydFRydWUoTWV0aG9kVXRpbHMuaXNNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIikpOw0KLSAgICAgICAgLy8xeCBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeSBhbmQgMXggZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShNZXRob2RVdGlscy5jaGVja01ldGhvZENhbGxlZChNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLCAicmV2ZXJzZU1lc3NhZ2UiLCAyKSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2M3ZjliLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZSBleHRlbmRzIEVMQ3Jvc3NWYWxUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBFTENyb3NzVmFsVGVzdERhdGVCZWFuIGdldEVudGl0eUluc3RhbmNlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBMb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4oKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU3ZTIxNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdERhdGVCZWFuIGV4dGVuZHMgRUxDcm9zc1ZhbFRlc3REYXRlQmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZSBERUZBVUxUX0RBVEUgPSBuZXcgRGF0ZSgpOw0KLQ0KLSAgICBARXF1YWxzKCJkYXRlMiIpDQotICAgIHByaXZhdGUgRGF0ZSBkYXRlMSA9IERFRkFVTFRfREFURTsNCi0NCi0gICAgcHJpdmF0ZSBEYXRlIGRhdGUyID0gREVGQVVMVF9EQVRFOw0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlMSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkYXRlMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlMShEYXRlIGRhdGUxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRhdGUxID0gZGF0ZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGF0ZTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZTIoRGF0ZSBkYXRlMikNCi0gICAgew0KLSAgICAgICAgdGhpcy5kYXRlMiA9IGRhdGUyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOGIwYTQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRXF1YWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWwubW9jay5Nb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5iYXNlLnV0aWwuTWV0aG9kVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICovDQotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UgZXh0ZW5kcyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZQ0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUHJvcGVydHlDaGFpbkNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0NCi0gICAgICAgIFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uKCk7DQotDQotICAgICAgICBjb25maWcuYWRkTWFwcGluZyhFcXVhbHMuY2xhc3MuZ2V0TmFtZSgpLCBNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsIGNvbmZpZyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcm9zc0NvbXBvbmVudEVxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHJldGVzdCB0aGlzIHRlc3QtY2FzZQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgLy9kb24ndCByZXRlc3QgdGhpcyB0ZXN0LWNhc2UNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZWxBd2FyZUNyb3NzRXF1YWxzVmFsaWRhdGlvbkNvcnJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpOw0KLSAgICAgICAgYXNzZXJ0RmFsc2UoTWV0aG9kVXRpbHMuaXNNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIikpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbEF3YXJlQ3Jvc3NFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCk7DQotICAgICAgICBhc3NlcnRUcnVlKE1ldGhvZFV0aWxzLmlzTWV0aG9kQ2FsbGVkKE1vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MsICJyZXZlcnNlTWVzc2FnZSIpKTsNCi0gICAgICAgIC8vMXggZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkgYW5kIDF4IGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwNCi0gICAgICAgIGFzc2VydFRydWUoTWV0aG9kVXRpbHMuY2hlY2tNZXRob2RDYWxsZWQoTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5jbGFzcywgInJldmVyc2VNZXNzYWdlIiwgMikpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1OGMwZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkRhdGVUaW1lQ29udmVydGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlDQotew0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0NCi0gICAgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0gICAgICAgIHJvb3RDb21wb25lbnQgPSBudWxsOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0VXAoKTsNCi0gICAgICAgIGNyZWF0ZVJlcXVlc3RTY29wZWRCZWFuKCJiZWFuMSIsIGdldEVudGl0eUluc3RhbmNlKCkpOw0KLQ0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7DQotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7DQotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7DQotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOw0KLQ0KLSAgICAgICAgLy9pbnB1dDENCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0SWQoImlucHV0MSIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldENvbnZlcnRlcihuZXcgRGF0ZVRpbWVDb252ZXJ0ZXIoKSk7DQotICAgICAgICAoKERhdGVUaW1lQ29udmVydGVyKWlucHV0Q29tcG9uZW50MS5nZXRDb252ZXJ0ZXIoKSkuc2V0UGF0dGVybigiZGQuTU0ueXl5eSIpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDEpOw0KLQ0KLSAgICAgICAgLy9pbnB1dDINCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0SWQoImlucHV0MiIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldENvbnZlcnRlcihuZXcgRGF0ZVRpbWVDb252ZXJ0ZXIoKSk7DQotICAgICAgICAoKERhdGVUaW1lQ29udmVydGVyKWlucHV0Q29tcG9uZW50Mi5nZXRDb252ZXJ0ZXIoKSkuc2V0UGF0dGVybigiZGQuTU0ueXl5eSIpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uQ29ycmVjdCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVQcm9wZXJ0eUNoYWluQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxNC4wNS4xOTgzIik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NDb21wb25lbnRFcXVhbHNWYWxpZGF0aW9uRmFpbGVkVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdmFsaWRhdGVQcm9wZXJ0eUNoYWluQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uVXNlQ2FzZSgiMTQuMDUuMTk4MyIsICIxMi4xMi4yMDA4Iik7DQotDQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgyKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVQcm9wZXJ0eUNoYWluQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uVXNlQ2FzZShTdHJpbmcgdmFsdWVCZWFuMVByb3BlcnR5MSwgU3RyaW5nIHZhbHVlQmVhbjJQcm9wZXJ0eTIpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje2JlYW4xLmRhdGUxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7YmVhbjEuc3ViQmVhbi5kYXRlMn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVCZWFuMVByb3BlcnR5MSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVCZWFuMlByb3BlcnR5Mik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25Db3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZUVMTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTQuMDUuMTk4MyIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVsQXdhcmVDcm9zc0VxdWFsc1ZhbGlkYXRpb25GYWlsZWRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB2YWxpZGF0ZUVMTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvblVzZUNhc2UoIjE0LjA1LjE5ODMiLCAiMTIuMTIuMjAwOCIpOw0KLQ0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRUxNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uVXNlQ2FzZShTdHJpbmcgdmFsdWVCZWFuMVByb3BlcnR5MSwgU3RyaW5nIHZhbHVlQmVhbjJQcm9wZXJ0eTEpDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje2JlYW4xLmRhdGUxfSIpOw0KLQ0KLSAgICAgICAgLy9zZXQgbW9kZWwgdmFsdWVzDQotICAgICAgICByZXNvbHZlQmVhbigiYmVhbjEiLCBnZXRFbnRpdHlJbnN0YW5jZSgpLmdldENsYXNzKCkpLmdldFN1YkJlYW4oKS5zZXREYXRlMigoRGF0ZSlpbnB1dENvbXBvbmVudDIuZ2V0Q29udmVydGVyKCkuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dENvbXBvbmVudDIsIHZhbHVlQmVhbjJQcm9wZXJ0eTEpKTsNCi0NCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUodmFsdWVCZWFuMVByb3BlcnR5MSk7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4gZ2V0RW50aXR5SW5zdGFuY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbigpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzU1YzEyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4NCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERhdGUgREVGQVVMVF9EQVRFID0gbmV3IERhdGUoKTsNCi0NCi0gICAgQEVxdWFscygic3ViQmVhbi5kYXRlMiIpDQotICAgIHByaXZhdGUgRGF0ZSBkYXRlMSA9IERFRkFVTFRfREFURTsNCi0NCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4gc3ViQmVhbiA9IG5ldyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4oKTsNCi0NCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZTEoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGF0ZTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZTEoRGF0ZSBkYXRlMSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5kYXRlMSA9IGRhdGUxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4gZ2V0U3ViQmVhbigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzdWJCZWFuOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFN1YkJlYW4oUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuIHN1YkJlYW4pDQotICAgIHsNCi0gICAgICAgIHRoaXMuc3ViQmVhbiA9IHN1YkJlYW47DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4uamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYzJhMmQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4NCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERhdGUgREVGQVVMVF9EQVRFID0gbmV3IERhdGUoKTsNCi0NCi0gICAgcHJpdmF0ZSBEYXRlIGRhdGUyID0gREVGQVVMVF9EQVRFOw0KLQ0KLSAgICBwdWJsaWMgRGF0ZSBnZXREYXRlMigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkYXRlMjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlMihEYXRlIGRhdGUyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRhdGUyID0gZGF0ZTI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMVRlc3RCZWFuLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYxVGVzdEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlNThlOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYxVGVzdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkSWY7DQotDQotcHVibGljIGNsYXNzIFJlcXVpcmVkSWYxVGVzdEJlYW4NCi17DQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0NCi0gICAgQFJlcXVpcmVkSWYodmFsdWVPZiA9ICJwcm9wZXJ0eTEiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYxVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjFUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjRiNmVhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjFUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLkFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZElmMVRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZQ0KLXsNCi0NCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotDQotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHB1YmxpYyBSZXF1aXJlZElmMVRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVxdWlyZWRJZjFUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgUmVxdWlyZWRJZjFUZXN0QmVhbiBiZWFuID0gbmV3IFJlcXVpcmVkSWYxVGVzdEJlYW4oKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhudWxsLCAidmFsdWUiLCAiI3t0ZXN0QmVhbn0iKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucHV0KCJ0ZXN0QmVhbiIsIGJlYW4pOw0KLQ0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7DQotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7DQotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7DQotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRJZCgiaW5wdXQxIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZUYXJnZXROb3RFbXB0eUZhaWxlZCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZlRhcmdldE5vdEVtcHR5Q29ycmVjdDEoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmVGFyZ2V0Tm90RW1wdHlDb3JyZWN0MigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZUYXJnZXROb3RFbXB0eUNvcnJlY3QzKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYyVGVzdEJlYW4uamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjJUZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2UyZjljLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjJUZXN0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkSWZUeXBlLio7DQotDQotcHVibGljIGNsYXNzIFJlcXVpcmVkSWYyVGVzdEJlYW4NCi17DQotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsNCi0gICAgQFJlcXVpcmVkSWYodmFsdWVPZiA9ICJwcm9wZXJ0eTEiLCBpcyA9IGVtcHR5KQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoU3RyaW5nIHByb3BlcnR5MSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHkyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihTdHJpbmcgcHJvcGVydHkyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MiA9IHByb3BlcnR5MjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYyVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGRiMjFiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuY3Jvc3N2YWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLkFic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSVZpZXdSb290Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sRm9ybTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZElmMlRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZQ0KLXsNCi0NCi0gICAgSHRtbElucHV0VGV4dCBpbnB1dENvbXBvbmVudDEgPSBudWxsOw0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotDQotICAgIFVJVmlld1Jvb3Qgcm9vdENvbXBvbmVudCA9IG51bGw7DQotDQotICAgIHB1YmxpYyBSZXF1aXJlZElmMlRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBudWxsOw0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVxdWlyZWRJZjJUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgUmVxdWlyZWRJZjJUZXN0QmVhbiBiZWFuID0gbmV3IFJlcXVpcmVkSWYyVGVzdEJlYW4oKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhudWxsLCAidmFsdWUiLCAiI3t0ZXN0QmVhbn0iKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCkucHV0KCJ0ZXN0QmVhbiIsIGJlYW4pOw0KLQ0KLSAgICAgICAgcm9vdENvbXBvbmVudCA9IG5ldyBVSVZpZXdSb290KCk7DQotICAgICAgICBIdG1sRm9ybSBmb3JtID0gbmV3IEh0bWxGb3JtKCk7DQotICAgICAgICBmb3JtLnNldElkKCJmb3JtIik7DQotICAgICAgICByb290Q29tcG9uZW50LmdldENoaWxkcmVuKCkuYWRkKGZvcm0pOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbmV3IEh0bWxJbnB1dFRleHQoKTsNCi0gICAgICAgIGZvcm0uZ2V0Q2hpbGRyZW4oKS5hZGQoaW5wdXRDb21wb25lbnQxKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRJZCgiaW5wdXQxIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldElkKCJpbnB1dDIiKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZUYXJnZXRFbXB0eUZhaWxlZCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZlRhcmdldEVtcHR5Q29ycmVjdDEoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmVGFyZ2V0RW1wdHlDb3JyZWN0MigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIjFkMyIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZUYXJnZXRFbXB0eUNvcnJlY3QzKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYzVGVzdEJlYW4uamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjNUZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjM0NGRmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjNUZXN0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZjsNCi0NCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRJZjNUZXN0QmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBCb29sZWFuIHByb3BlcnR5MTsNCi0gICAgQFJlcXVpcmVkSWYodmFsdWVPZiA9ICJwcm9wZXJ0eTEiKQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7DQotDQotICAgIHB1YmxpYyBCb29sZWFuIGdldFByb3BlcnR5MSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKEJvb2xlYW4gcHJvcGVydHkxKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnR5MSA9IHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkyKFN0cmluZyBwcm9wZXJ0eTIpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkyID0gcHJvcGVydHkyOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjNUZXN0Q2FzZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmM1Rlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZDgwM2UuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmM1Rlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJVmlld1Jvb3Q7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxGb3JtOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotcHVibGljIGNsYXNzIFJlcXVpcmVkSWYzVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlDQotew0KLQ0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0NCi0gICAgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgcHVibGljIFJlcXVpcmVkSWYzVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZXF1aXJlZElmM1Rlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgICAgICBSZXF1aXJlZElmM1Rlc3RCZWFuIGJlYW4gPSBuZXcgUmVxdWlyZWRJZjNUZXN0QmVhbigpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKG51bGwsICJ2YWx1ZSIsICIje3Rlc3RCZWFufSIpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKS5wdXQoInRlc3RCZWFuIiwgYmVhbik7DQotDQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsNCi0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsNCi0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldElkKCJpbnB1dDEiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0SWQoImlucHV0MiIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZkJvb2xlYW5UYXJnZXROb3RFbXB0eUZhaWxlZCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZShCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDEpOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQodHJ1ZSk7DQotICAgICAgICBjaGVja01lc3NhZ2VTZXZlcml0aWVzKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUik7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZkJvb2xlYW5UYXJnZXROb3RFbXB0eUNvcnJlY3QxKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi5zZXRTdWJtaXR0ZWRWYWx1ZSgiMWQzIik7DQotDQotICAgICAgICAvL3ZhbGlkYXRlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50Mi52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlQ291bnQoMCk7DQotDQotICAgICAgICBhc3NlcnROYXZpZ2F0aW9uQmxvY2tlZChmYWxzZSk7DQotDQotICAgICAgICAvL25vIHVwZGF0ZSBtb2RlbCBuZWVkZWQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZkJvb2xlYW5UYXJnZXROb3RFbXB0eUNvcnJlY3QyKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQxLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTF9Iik7DQotICAgICAgICBjcmVhdGVWYWx1ZUJpbmRpbmcoaW5wdXRDb21wb25lbnQyLCAidmFsdWUiLCAiI3t0ZXN0QmVhbi5wcm9wZXJ0eTJ9Iik7DQotDQotICAgICAgICAvL2RlY29kZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldFN1Ym1pdHRlZFZhbHVlKEJvb2xlYW4uRkFMU0UudG9TdHJpbmcoKSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0U3VibWl0dGVkVmFsdWUoIiIpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0ZQ0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIudmFsaWRhdGUoZmFjZXNDb250ZXh0KTsNCi0NCi0gICAgICAgIHByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oKTsNCi0gICAgICAgIGNoZWNrTWVzc2FnZUNvdW50KDApOw0KLQ0KLSAgICAgICAgYXNzZXJ0TmF2aWdhdGlvbkJsb2NrZWQoZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZCb29sZWFuVGFyZ2V0Tm90RW1wdHlDb3JyZWN0MygpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZShCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjRUZXN0QmVhbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmNFRlc3RCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxM2I2OWQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmNFRlc3RCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZElmOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZlR5cGUuKjsNCi0NCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRJZjRUZXN0QmVhbg0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHByb3BlcnR5MTsNCi0gICAgQFJlcXVpcmVkSWYodmFsdWVPZiA9ICJwcm9wZXJ0eTEiLCBpcyA9IGVtcHR5KQ0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzUHJvcGVydHkxKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoYm9vbGVhbiBwcm9wZXJ0eTEpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTIoU3RyaW5nIHByb3BlcnR5MikNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmNFRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWY0VGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FmYWFjZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWY0VGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5BYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlWaWV3Um9vdDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbEZvcm07DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlDQotICovDQotcHVibGljIGNsYXNzIFJlcXVpcmVkSWY0VGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlDQotew0KLQ0KLSAgICBIdG1sSW5wdXRUZXh0IGlucHV0Q29tcG9uZW50MSA9IG51bGw7DQotICAgIEh0bWxJbnB1dFRleHQgaW5wdXRDb21wb25lbnQyID0gbnVsbDsNCi0NCi0gICAgVUlWaWV3Um9vdCByb290Q29tcG9uZW50ID0gbnVsbDsNCi0NCi0gICAgcHVibGljIFJlcXVpcmVkSWY0VGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxID0gbnVsbDsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG51bGw7DQotICAgICAgICByb290Q29tcG9uZW50ID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZXF1aXJlZElmNFRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgICAgICBSZXF1aXJlZElmNFRlc3RCZWFuIGJlYW4gPSBuZXcgUmVxdWlyZWRJZjRUZXN0QmVhbigpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKG51bGwsICJ2YWx1ZSIsICIje3Rlc3RCZWFufSIpOw0KLSAgICAgICAgZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKS5wdXQoInRlc3RCZWFuIiwgYmVhbik7DQotDQotICAgICAgICByb290Q29tcG9uZW50ID0gbmV3IFVJVmlld1Jvb3QoKTsNCi0gICAgICAgIEh0bWxGb3JtIGZvcm0gPSBuZXcgSHRtbEZvcm0oKTsNCi0gICAgICAgIGZvcm0uc2V0SWQoImZvcm0iKTsNCi0gICAgICAgIHJvb3RDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKS5hZGQoZm9ybSk7DQotICAgICAgICBpbnB1dENvbXBvbmVudDEgPSBuZXcgSHRtbElucHV0VGV4dCgpOw0KLSAgICAgICAgZm9ybS5nZXRDaGlsZHJlbigpLmFkZChpbnB1dENvbXBvbmVudDEpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQxLnNldElkKCJpbnB1dDEiKTsNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MiA9IG5ldyBIdG1sSW5wdXRUZXh0KCk7DQotICAgICAgICBmb3JtLmdldENoaWxkcmVuKCkuYWRkKGlucHV0Q29tcG9uZW50Mik7DQotICAgICAgICBpbnB1dENvbXBvbmVudDIuc2V0SWQoImlucHV0MiIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRJZkJvb2xlYW5UYXJnZXRFbXB0eUZhaWxlZCgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZShCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgxKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKHRydWUpOw0KLSAgICAgICAgY2hlY2tNZXNzYWdlU2V2ZXJpdGllcyhGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLQ0KLSAgICAgICAgLy9ubyB1cGRhdGUgbW9kZWwgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkSWZCb29sZWFuVGFyZ2V0RW1wdHlDb3JyZWN0MSgpIHRocm93cyBFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MSwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkxfSIpOw0KLSAgICAgICAgY3JlYXRlVmFsdWVCaW5kaW5nKGlucHV0Q29tcG9uZW50MiwgInZhbHVlIiwgIiN7dGVzdEJlYW4ucHJvcGVydHkyfSIpOw0KLQ0KLSAgICAgICAgLy9kZWNvZGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS5zZXRTdWJtaXR0ZWRWYWx1ZShCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmQm9vbGVhblRhcmdldEVtcHR5Q29ycmVjdDIoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIxZDMiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZElmQm9vbGVhblRhcmdldEVtcHR5Q29ycmVjdDMoKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDEsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5MX0iKTsNCi0gICAgICAgIGNyZWF0ZVZhbHVlQmluZGluZyhpbnB1dENvbXBvbmVudDIsICJ2YWx1ZSIsICIje3Rlc3RCZWFuLnByb3BlcnR5Mn0iKTsNCi0NCi0gICAgICAgIC8vZGVjb2RlDQotICAgICAgICBpbnB1dENvbXBvbmVudDEuc2V0U3VibWl0dGVkVmFsdWUoQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnNldFN1Ym1pdHRlZFZhbHVlKCIiKTsNCi0NCi0gICAgICAgIC8vdmFsaWRhdGUNCi0gICAgICAgIGlucHV0Q29tcG9uZW50MS52YWxpZGF0ZShmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5wdXRDb21wb25lbnQyLnZhbGlkYXRlKGZhY2VzQ29udGV4dCk7DQotDQotICAgICAgICBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKCk7DQotICAgICAgICBjaGVja01lc3NhZ2VDb3VudCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5hdmlnYXRpb25CbG9ja2VkKGZhbHNlKTsNCi0NCi0gICAgICAgIC8vbm8gdXBkYXRlIG1vZGVsIG5lZWRlZA0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvbW9jay9Nb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL21vY2svTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjVkNDgyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvbW9jay9Nb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmNyb3NzdmFsLm1vY2s7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneS5FcXVhbHNTdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuYmFzZS51dGlsLk1ldGhvZFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgRXF1YWxzU3RyYXRlZ3kNCi17DQotICAgIHB1YmxpYyBNb2NrRXF1YWxzVmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgTWV0aG9kVXRpbHMuc2lnbmFsQ2xhc3NVc2VkKGdldENsYXNzKCkpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgTWV0aG9kVXRpbHMuc2lnbmFsTWV0aG9kQ2FsbGVkKGdldENsYXNzKCksICJyZXZlcnNlTWVzc2FnZSIpOw0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24pOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBNZXRob2RVdGlscy5zaWduYWxNZXRob2RDYWxsZWQoZ2V0Q2xhc3MoKSwgInJldmVyc2VNZXNzYWdlIik7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2N1c3RvbS9DdXN0b21WaW9sYXRpb25TZXZlcml0eS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jdXN0b20vQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlkMDQ3ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2N1c3RvbS9DdXN0b21WaW9sYXRpb25TZXZlcml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QucHJvcHZhbC5jdXN0b207DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlBhcmFtZXRlcktleTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuUGFyYW1ldGVyVmFsdWU7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIEN1c3RvbVZpb2xhdGlvblNldmVyaXR5DQotew0KLSAgICBpbnRlcmZhY2UgV2FybmluZyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXINCi0gICAgew0KLSAgICAgICAgQFBhcmFtZXRlcktleQ0KLSAgICAgICAgcHVibGljIENsYXNzIEtFWSA9IEN1c3RvbVZpb2xhdGlvblNldmVyaXR5LmNsYXNzOw0KLQ0KLSAgICAgICAgQFBhcmFtZXRlclZhbHVlDQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgU0VWRVJJVFkgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfV0FSTjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvbk1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uTW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTU4MGFmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uTW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuVmFsaWRhdGlvbk1vZHVsZUF3YXJlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRlc3QuY29yZS5BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGNsYXNzIFJlZ2lzdHJhdGlvbk1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlDQotew0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlZ2lzdHJhdGlvbk1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvbk1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yVGVzdENhc2UuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckluaXRpYWxpemF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgcmVzZXRFeHRWYWxDb250ZXh0KCk7DQotDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RHbG9iYWxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEwMDAoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgVGVzdE1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0TW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IzKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RHbG9iYWxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEoKSk7DQotDQotICAgICAgICBjaGVja0dsb2JhbE9ubHlQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsNCi0gICAgICAgIGNoZWNrTW9kdWxlQXdhcmVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNXaXRoVGVzdE1vZHVsZSgpOw0KLSAgICAgICAgY2hlY2tNb2R1bGVBd2FyZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc1dpdGhQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tHbG9iYWxPbmx5UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7DQotDQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gMzsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzdWx0TGVuZ3RoLCByZXN1bHQuc2l6ZSgpKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RHbG9iYWxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0R2xvYmFsTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IxMDAwLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjaGVja01vZHVsZUF3YXJlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzV2l0aFRlc3RNb2R1bGUoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnNGb3IoVGVzdE1vZHVsZS5jbGFzcyk7DQotDQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gNTsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5zaXplKCkgPT0gcmVzdWx0TGVuZ3RoKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdEdsb2JhbE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RNb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjIpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0TW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IzKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdEdsb2JhbE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMCk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSA0Og0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrTW9kdWxlQXdhcmVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNXaXRoUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlKCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzRm9yKFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcyk7DQotDQotICAgICAgICBpbnQgcmVzdWx0TGVuZ3RoID0gNDsNCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5zaXplKCkgPT0gcmVzdWx0TGVuZ3RoKTsNCi0NCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2ggKGkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIDA6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RHbG9iYWxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjEuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0TW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IyLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEdsb2JhbE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDM6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMSkNCi0gICAgY2xhc3MgVGVzdEdsb2JhbE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMSBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigyKQ0KLSAgICBjbGFzcyBUZXN0TW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IyIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IsIFZhbGlkYXRpb25Nb2R1bGVBd2FyZQ0KLSAgICB7DQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlckV4dHJhY3RpbmcoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldE1vZHVsZUtleXMoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCksIFRlc3RNb2R1bGUuY2xhc3MuZ2V0TmFtZSgpfTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBASW52b2NhdGlvbk9yZGVyKDMpDQotICAgIGNsYXNzIFRlc3RNb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjMgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciwgVmFsaWRhdGlvbk1vZHVsZUF3YXJlDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TW9kdWxlS2V5cygpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7VGVzdE1vZHVsZS5jbGFzcy5nZXROYW1lKCl9Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RNb2R1bGUNCi0gICAgew0KLSAgICB9DQotDQotICAgIEBJbnZvY2F0aW9uT3JkZXIoMTAwMCkNCi0gICAgY2xhc3MgVGVzdEdsb2JhbE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yMTAwMCBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25Nb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvbk1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI0NTg0NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvbk1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5wcm9wdmFsLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLlZhbGlkYXRpb25Nb2R1bGVBd2FyZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LmNvcmUuQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyYXRpb25Nb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvclRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZQ0KLXsNCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBSZWdpc3RyYXRpb25Nb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvclRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWdpc3RyYXRpb25Nb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbml0aWFsaXphdGlvbigpDQotICAgIHsNCi0gICAgICAgIHJlc2V0RXh0VmFsQ29udGV4dCgpOw0KLQ0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxMDAwKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IFRlc3RNb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjIoKSk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihuZXcgVGVzdE1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMygpKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKG5ldyBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxKCkpOw0KLQ0KLSAgICAgICAgY2hlY2tHbG9iYWxPbmx5UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7DQotICAgICAgICBjaGVja01vZHVsZUF3YXJlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzV2l0aFRlc3RNb2R1bGUoKTsNCi0gICAgICAgIGNoZWNrTW9kdWxlQXdhcmVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNXaXRoUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrR2xvYmFsT25seVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpDQotICAgIHsNCi0gICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpOw0KLQ0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDM7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3VsdExlbmd0aCwgcmVzdWx0LnNpemUoKSk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMTAwMC5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tNb2R1bGVBd2FyZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc1dpdGhUZXN0TW9kdWxlKCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcmVzdWx0ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzRm9yKFRlc3RNb2R1bGUuY2xhc3MpOw0KLQ0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDU7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuc2l6ZSgpID09IHJlc3VsdExlbmd0aCk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjEpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0TW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IyKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0KGkpIGluc3RhbmNlb2YgVGVzdE1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMyk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0LmdldChpKSBpbnN0YW5jZW9mIFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjEwMDApOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5nZXQoaSkgaW5zdGFuY2VvZiBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjaGVja01vZHVsZUF3YXJlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzV2l0aFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZSgpDQotICAgIHsNCi0gICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc0ZvcihQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MpOw0KLQ0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDQ7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHQuc2l6ZSgpID09IHJlc3VsdExlbmd0aCk7DQotDQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxLmNsYXNzLCByZXN1bHQuZ2V0KGkpLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdE1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yMi5jbGFzcywgcmVzdWx0LmdldChpKS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBjYXNlIDI6DQotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RHbG9iYWxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjEwMDAuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MsIHJlc3VsdC5nZXQoaSkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdEdsb2JhbFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYmVmb3JlVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxKQ0KLSAgICBjbGFzcyBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxIGltcGxlbWVudHMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYmVmb3JlVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigyKQ0KLSAgICBjbGFzcyBUZXN0TW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IyIGltcGxlbWVudHMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IsIFZhbGlkYXRpb25Nb2R1bGVBd2FyZQ0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNb2R1bGVLZXlzKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpLCBUZXN0TW9kdWxlLmNsYXNzLmdldE5hbWUoKX07DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigzKQ0KLSAgICBjbGFzcyBUZXN0TW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IzIGltcGxlbWVudHMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IsIFZhbGlkYXRpb25Nb2R1bGVBd2FyZQ0KLSAgICB7DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgICAgIHsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNb2R1bGVLZXlzKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtUZXN0TW9kdWxlLmNsYXNzLmdldE5hbWUoKX07DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgY2xhc3MgVGVzdE1vZHVsZQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgQEludm9jYXRpb25PcmRlcigxMDAwKQ0KLSAgICBjbGFzcyBUZXN0R2xvYmFsUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IxMDAwIGltcGxlbWVudHMgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3INCi0gICAgew0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gYmVmb3JlVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgICAgICB7DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25SZW5kZXJlckludGVyY2VwdG9yVGVzdENhc2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uUmVuZGVyZXJJbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NzQ3NGQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25SZW5kZXJlckludGVyY2VwdG9yVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50ZXN0LnByb3B2YWwuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlJlbmRlcmVySW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC5jb3JlLkFic3RyYWN0RXhWYWxDb3JlVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVnaXN0cmF0aW9uUmVuZGVyZXJJbnRlcmNlcHRvclRlc3RDYXNlIGV4dGVuZHMgQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZQ0KLXsNCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBSZWdpc3RyYXRpb25SZW5kZXJlckludGVyY2VwdG9yVGVzdENhc2UoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlZ2lzdHJhdGlvblJlbmRlcmVySW50ZXJjZXB0b3JUZXN0Q2FzZS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJDb25zdGFudENvbmRpdGlvbnMifSkNCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbmRlcmVySW50ZXJjZXB0b3JJbml0aWFsaXphdGlvbigpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgVGVzdENvbXBvbmVudEluaXRpYWxpemVyKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKG5ldyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIxKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKG5ldyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIyKCkpOw0KLQ0KLSAgICAgICAgTGlzdDxSZW5kZXJlckludGVyY2VwdG9yPiByZXN1bHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpOw0KLQ0KLSAgICAgICAgaW50IHJlc3VsdExlbmd0aCA9IDQ7DQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3VsdExlbmd0aCwgcmVzdWx0LnNpemUoKSk7DQotDQotICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yIHRtcDsNCi0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0bXAgPSByZXN1bHQuZ2V0KGkpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUodG1wIGluc3RhbmNlb2YgVGVzdENvbXBvbmVudEluaXRpYWxpemVyIHx8DQotICAgICAgICAgICAgICAgICAgICB0bXAgaW5zdGFuY2VvZiBWYWxpZGF0aW9uSW50ZXJjZXB0b3IgfHwgIC8qZHVlIHRvIGEganVuaXQgaXNzdWUqLw0KLSAgICAgICAgICAgICAgICAgICAgdG1wIGluc3RhbmNlb2YgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3INCi0gICAgew0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjEgZXh0ZW5kcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXINCi0gICAgew0KLSAgICB9DQotDQotICAgIGNsYXNzIFRlc3RDb21wb25lbnRJbml0aWFsaXplcjIgZXh0ZW5kcyBUZXN0Q29tcG9uZW50SW5pdGlhbGl6ZXINCi0gICAgew0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3BvbS54bWwgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWUyNTc1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgQmVhbi1WYWxpZGF0aW9uLUludGVncmF0aW9uLU1vZHVsZSAoSlNSIDMwMyk8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4yLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8cmVwb3NpdG9yaWVzPgotICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5qYm9zczwvaWQ+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvc2l0b3J5Lmpib3NzLmNvbS9tYXZlbjI8L3VybD4KLSAgICAgICAgICAgIDxyZWxlYXNlcz4KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPgotICAgICAgICAgICAgPC9yZWxlYXNlcz4KLSAgICAgICAgICAgIDxzbmFwc2hvdHM+Ci0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+ZmFsc2U8L2VuYWJsZWQ+Ci0gICAgICAgICAgICA8L3NuYXBzaG90cz4KLSAgICAgICAgPC9yZXBvc2l0b3J5PgotICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5qYm9zcy1zbmFwc2hvdDwvaWQ+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9zbmFwc2hvdHMuamJvc3Mub3JnL21hdmVuMjwvdXJsPgotICAgICAgICAgICAgPHJlbGVhc2VzPgotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+Ci0gICAgICAgICAgICA8L3JlbGVhc2VzPgotICAgICAgICAgICAgPHNuYXBzaG90cz4KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPgotICAgICAgICAgICAgPC9zbmFwc2hvdHM+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICA8L3JlcG9zaXRvcmllcz4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgudmFsaWRhdGlvbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnZhbGlkYXRpb24tYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjAuR0E8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgICAgICA8IS0tIFRlc3QgZGVwZW5kZW5jaWVzIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjU8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0LmpzcDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnNoYWxlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2hhbGUtdGVzdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC40PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9BYnN0cmFjdCouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL1Rlc3RVdGlscy5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKkJlYW4uamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4gICAgICAgICAgICAKLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzI5ZDE4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RhcnR1cC5CZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5Bd2FyZUNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5LmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5Bd2FyZUNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YTc0MDQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuQXdhcmVDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBCZWFuQXdhcmVDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5DQotew0KLSAgICBwcml2YXRlIENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5Ow0KLQ0KLSAgICBwdWJsaWMgQmVhbkF3YXJlQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkpDQotICAgIHsNCi0gICAgICAgIHNldENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeShDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBjb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSkNCi0gICAgew0KLSAgICAgICAgaWYoY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJudWxsIGlzIG5vdCBhbGxvd2VkIGhlcmUiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRoaXMuY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgPSBjb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWxsb3cgdGhlIHJlZ2lzdHJhdGlvbiBvZiBhIGN1c3RvbSBwcmVmaXgiKQ0KLSAgICBwdWJsaWMgPFQgZXh0ZW5kcyBDb25zdHJhaW50VmFsaWRhdG9yPD8sID8+PiBUIGdldEluc3RhbmNlKENsYXNzPFQ+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsaWRhdG9yQ2xhc3NOYW1lID0gdGFyZ2V0Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpOw0KLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbihjcmVhdGVCZWFuTmFtZSh2YWxpZGF0b3JDbGFzc05hbWUpKTsNCi0NCi0gICAgICAgIGlmKHJlc3VsdCAhPSBudWxsICYmIHRhcmdldENsYXNzLmlzQXNzaWduYWJsZUZyb20ocmVzdWx0LmdldENsYXNzKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoVClyZXN1bHQ7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeS5nZXRJbnN0YW5jZSh0YXJnZXRDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlQmVhbk5hbWUoU3RyaW5nIHZhbGlkYXRvckNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUodmFsaWRhdG9yQ2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5Bd2FyZVZhbGlkYXRvckZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzEwN2QzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JDb250ZXh0Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVHJhdmVyc2FibGVSZXNvbHZlcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBCZWFuQXdhcmVWYWxpZGF0b3JGYWN0b3J5IGltcGxlbWVudHMgVmFsaWRhdG9yRmFjdG9yeQ0KLXsNCi0gICAgcHJpdmF0ZSBWYWxpZGF0b3JGYWN0b3J5IHZhbGlkYXRvckZhY3Rvcnk7DQotDQotICAgIHB1YmxpYyBCZWFuQXdhcmVWYWxpZGF0b3JGYWN0b3J5KFZhbGlkYXRvckZhY3RvcnkgdmFsaWRhdG9yRmFjdG9yeSkNCi0gICAgew0KLSAgICAgICAgc2V0VmFsaWRhdG9yRmFjdG9yeSh2YWxpZGF0b3JGYWN0b3J5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3JGYWN0b3J5KFZhbGlkYXRvckZhY3RvcnkgdmFsaWRhdG9yRmFjdG9yeSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdG9yRmFjdG9yeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm51bGwgaXMgbm90IGFsbG93ZWQgaGVyZSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdGhpcy52YWxpZGF0b3JGYWN0b3J5ID0gdmFsaWRhdG9yRmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5LmdldFZhbGlkYXRvcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWxpZGF0b3JDb250ZXh0IHVzaW5nQ29udGV4dCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5LnVzaW5nQ29udGV4dCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlSW50ZXJwb2xhdG9yIGdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeS5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFRyYXZlcnNhYmxlUmVzb2x2ZXIgZ2V0VHJhdmVyc2FibGVSZXNvbHZlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5LmdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgZ2V0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEJlYW5Bd2FyZUNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KHZhbGlkYXRvckZhY3RvcnkuZ2V0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIDxUPiBUIHVud3JhcChDbGFzczxUPiB0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5LnVud3JhcCh0Q2xhc3MpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1MzYyNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5WYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBWYWxpZGF0aW9uTW9kdWxlS2V5DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBCZWFuVmFsaWRhdGlvbk1vZHVsZUtleQ0KLXsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOThjOTEwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWwuQmVhblZhbGlkYXRpb25VdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzIGJ2aVV0aWxzID0NCi0gICAgICAgICAgICBuZXcgQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHModGhpcy5sb2dnZXIpOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXF1aXJlZEluaXRpYWxpemF0aW9uU3VwcG9ydGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgdG8gaW5pdCBjb21wb25lbnQgIiArIHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBidmlVdGlscy5leHRyYWN0UHJvcGVydHlEZXRhaWxzKA0KLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBnZXRQcm9wZXJ0aWVzRm9yQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IodWlDb21wb25lbnQpKTsNCi0NCi0gICAgICAgIGlmIChwcm9wZXJ0eURldGFpbHMgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0Q29tcG9uZW50V2l0aFByb3BlcnR5RGV0YWlscyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBwcm9wZXJ0eURldGFpbHMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiaW5pdCBjb21wb25lbnQgb2YgIiArIHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb21wb25lbnRXaXRoUHJvcGVydHlEZXRhaWxzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmJ2aVV0aWxzLmluaXRDb21wb25lbnRXaXRoUHJvcGVydHlEZXRhaWxzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHByb3BlcnR5RGV0YWlscyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IGdldFByb3BlcnR5SW5mb3JtYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotDQotICAgICAgICBib29sZWFuIHZhbGlkYXRlUHJvcGVydHkgPSBoYXNCZWFuVmFsaWRhdGlvbkNvbnN0cmFpbnRzKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHZhbGlkYXRlUHJvcGVydHkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgianNyMzAzIHN0YXJ0IHZhbGlkYXRpb24iKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBwcm9jZXNzRmllbGRWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlJbmZvcm1hdGlvbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluYWxseQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZVByb3BlcnR5KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImpzcjMwMyB2YWxpZGF0aW9uIGZpbmlzaGVkIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE1ldGFEYXRhRXh0cmFjdG9yIGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGJ2aVV0aWxzLmdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKHByb3BlcnRpZXMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhc0JlYW5WYWxpZGF0aW9uQ29uc3RyYWludHMoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5idmlVdGlscy5oYXNCZWFuVmFsaWRhdGlvbkNvbnN0cmFpbnRzKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NGaWVsZFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgLypub3QgdXNlZCB5ZXQgc3VwcG9ydE11bHRpcGxlVmlvbGF0aW9uc1BlckZpZWxkKCkqLw0KLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb24+IHZpb2xhdGlvbnMgPSB0aGlzLmJ2aVV0aWxzDQotICAgICAgICAgICAgICAgIC52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgcHJvY2Vzc0NvbnN0cmFpbnRWaW9sYXRpb25zKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgdmlvbGF0aW9ucyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NvbnN0cmFpbnRWaW9sYXRpb25zKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbj4gdmlvbGF0aW9ucykNCi0gICAgew0KLSAgICAgICAgaWYodmlvbGF0aW9ucyAhPSBudWxsICYmICF2aW9sYXRpb25zLmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBCZWFuVmFsaWRhdGlvblV0aWxzLnByb2Nlc3NDb25zdHJhaW50VmlvbGF0aW9ucyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHZpb2xhdGlvbnMpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0TW9kdWxlS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEJlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHMuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBmOGE3Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uZ3JvdXBzLkRlZmF1bHQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQmVhbkRlc2NyaXB0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuRWxlbWVudERlc2NyaXB0b3I7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHMNCi17DQotICAgIHByaXZhdGUgTG9nIGxvZ2dlcjsNCi0NCi0gICAgQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHMoTG9nIGxvZ2dlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7DQotICAgIH0NCi0NCi0gICAgUHJvcGVydHlEZXRhaWxzIGV4dHJhY3RQcm9wZXJ0eURldGFpbHMoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllc0ZvckV4dHJhY3Rpb24pDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyByZXN1bHQgPSBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcihwcm9wZXJ0aWVzRm9yRXh0cmFjdGlvbikNCi0gICAgICAgICAgICAgICAgLmV4dHJhY3QoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgLmdldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBpZiAocmVzdWx0LmdldEJhc2VPYmplY3QoKSA9PSBudWxsICYmIHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCJubyBiYXNlIG9iamVjdCBhdCAiICsgcmVzdWx0LmdldEtleSgpICsNCi0gICAgICAgICAgICAgICAgICAgICIgY29tcG9uZW50LWlkOiAiICsgdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0LmdldEJhc2VPYmplY3QoKSAhPSBudWxsID8gcmVzdWx0IDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBhbHNvIGludm9rZXMgbWV0YS1kYXRhIGV4dHJhY3Rpb24gaW50ZXJjZXB0b3JzDQotICAgICAqIChzZWUgZS5nLiBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKQ0KLSAgICAgKi8NCi0gICAgTWV0YURhdGFFeHRyYWN0b3IgZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JXaXRoKHByb3BlcnRpZXMpOw0KLSAgICB9DQotDQotICAgIHZvaWQgaW5pdENvbXBvbmVudFdpdGhQcm9wZXJ0eURldGFpbHMoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMpDQotICAgIHsNCi0gICAgICAgIENsYXNzW10gZm91bmRHcm91cHMgPSByZXNvbHZlR3JvdXBzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgaWYgKGZvdW5kR3JvdXBzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoZm91bmRHcm91cHMubGVuZ3RoID09IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgZm91bmRHcm91cHMgPSBuZXcgQ2xhc3NbXXtEZWZhdWx0LmNsYXNzfTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpOw0KLQ0KLSAgICAgICAgdGFyZ2V0Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHRhcmdldENsYXNzKTsNCi0NCi0gICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIGVsZW1lbnREZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvckZvcih0YXJnZXRDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCkpOw0KLQ0KLSAgICAgICAgaWYgKGVsZW1lbnREZXNjcmlwdG9yID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHJvY2Vzc0VsZW1lbnREZXNjcmlwdG9yKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGZvdW5kR3JvdXBzLCBlbGVtZW50RGVzY3JpcHRvcik7DQotICAgIH0NCi0NCi0gICAgdm9pZCBwcm9jZXNzRWxlbWVudERlc2NyaXB0b3IoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzW10gZm91bmRHcm91cHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIGVsZW1lbnREZXNjcmlwdG9yKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhOw0KLQ0KLSAgICAgICAgZm9yIChDb25zdHJhaW50RGVzY3JpcHRvcjw/PiBjb25zdHJhaW50RGVzY3JpcHRvciA6DQotICAgICAgICAgICAgICAgIGVsZW1lbnREZXNjcmlwdG9yLmZpbmRDb25zdHJhaW50cygpLnVub3JkZXJlZEFuZE1hdGNoaW5nR3JvdXBzKGZvdW5kR3JvdXBzKS5nZXRDb25zdHJhaW50RGVzY3JpcHRvcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YSA9IHRyYW5zZm9ybUNvbnN0cmFpbnREZXNjcmlwdG9yVG9NZXRhRGF0YSgNCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnREZXNjcmlwdG9yLCBlbGVtZW50RGVzY3JpcHRvci5nZXRFbGVtZW50Q2xhc3MoKSk7DQotDQotICAgICAgICAgICAgaWYgKG1ldGFEYXRhICE9IG51bGwgJiYgIW1ldGFEYXRhLmlzRW1wdHkoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbmZpZ3VyZUNvbXBvbmVudFdpdGhNZXRhRGF0YShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJDb25zdHJhaW50RGVzY3JpcHRvciNpc1JlcG9ydEFzU2luZ2xlVmlvbGF0aW9uIikNCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybUNvbnN0cmFpbnREZXNjcmlwdG9yVG9NZXRhRGF0YSgNCi0gICAgICAgICAgICBDb25zdHJhaW50RGVzY3JpcHRvcjw/PiBjb25zdHJhaW50RGVzY3JpcHRvciwgQ2xhc3MgZWxlbWVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLQ0KLSAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IEV4dFZhbFV0aWxzLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgIG5ldyBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3koY29uc3RyYWludERlc2NyaXB0b3IsIGVsZW1lbnRDbGFzcykpOw0KLQ0KLSAgICAgICAgaWYgKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQucHV0QWxsKHRyYW5zZm9ybU1ldGFEYXRhKG1ldGFEYXRhVHJhbnNmb3JtZXIsIGNvbnN0cmFpbnREZXNjcmlwdG9yKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoIWNvbnN0cmFpbnREZXNjcmlwdG9yLmlzUmVwb3J0QXNTaW5nbGVWaW9sYXRpb24oKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTZXQ8Q29uc3RyYWludERlc2NyaXB0b3I8Pz4+IGNvbXBvc2luZ0NvbnN0cmFpbnRzID0gY29uc3RyYWludERlc2NyaXB0b3IuZ2V0Q29tcG9zaW5nQ29uc3RyYWludHMoKTsNCi0gICAgICAgICAgICBpZiAoY29tcG9zaW5nQ29uc3RyYWludHMgIT0gbnVsbCAmJiAhY29tcG9zaW5nQ29uc3RyYWludHMuaXNFbXB0eSgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0LnB1dEFsbCh0cmFuc2Zvcm1Db21wb3NpbmdDb25zdHJhaW50cyhjb21wb3NpbmdDb25zdHJhaW50cywgZWxlbWVudENsYXNzKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtQ29tcG9zaW5nQ29uc3RyYWludHMoDQotICAgICAgICAgICAgU2V0PENvbnN0cmFpbnREZXNjcmlwdG9yPD8+PiBjb21wb3NpbmdDb25zdHJhaW50cywgQ2xhc3MgZWxlbWVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgZm9yIChDb25zdHJhaW50RGVzY3JpcHRvciBjb25zdHJhaW50RGVzY3JpcHRvciA6IGNvbXBvc2luZ0NvbnN0cmFpbnRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5wdXRBbGwodHJhbnNmb3JtQ29uc3RyYWludERlc2NyaXB0b3JUb01ldGFEYXRhKGNvbnN0cmFpbnREZXNjcmlwdG9yLCBlbGVtZW50Q2xhc3MpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKA0KLSAgICAgICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lciwgQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gY29uc3RyYWludERlc2NyaXB0b3IpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRW50cnkgZW50cnk7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdDsNCi0gICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZW50cnkgPSBuZXcgTWV0YURhdGFFbnRyeSgpOw0KLSAgICAgICAgZW50cnkuc2V0S2V5KGNvbnN0cmFpbnREZXNjcmlwdG9yLmdldEFubm90YXRpb24oKS5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7DQotICAgICAgICBlbnRyeS5zZXRWYWx1ZShjb25zdHJhaW50RGVzY3JpcHRvcik7DQotDQotICAgICAgICByZXN1bHQgPSBtZXRhRGF0YVRyYW5zZm9ybWVyLmNvbnZlcnRNZXRhRGF0YShlbnRyeSk7DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIGJvb2xlYW4gaGFzQmVhblZhbGlkYXRpb25Db25zdHJhaW50cyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscy5nZXRQcm9wZXJ0eURldGFpbHMocHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpKTsNCi0NCi0gICAgICAgIHJldHVybiBnZXREZXNjcmlwdG9yRm9yKHRhcmdldENsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSkgIT0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbj4gdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgYmFzZUJlYW5DbGFzcyA9IGdldEJhc2VDbGFzc1R5cGUocHJvcGVydHlJbmZvcm1hdGlvbik7DQotICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gZ2V0UHJvcGVydHlUb1ZhbGlkYXRlKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgQ2xhc3NbXSBncm91cHMgPSByZXNvbHZlR3JvdXBzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgaWYgKGdyb3VwcyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVmFsaWRhdG9yRmFjdG9yeSB2YWxpZGF0b3JGYWN0b3J5ID0gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZhbGlkYXRvckZhY3RvcnkoKTsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5DQotICAgICAgICAgICAgICAgIC51c2luZ0NvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAubWVzc2FnZUludGVycG9sYXRvcihFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpKQ0KLSAgICAgICAgICAgICAgICAuY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkodmFsaWRhdG9yRmFjdG9yeS5nZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpKQ0KLSAgICAgICAgICAgICAgICAudHJhdmVyc2FibGVSZXNvbHZlcih2YWxpZGF0b3JGYWN0b3J5LmdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKSkNCi0gICAgICAgICAgICAgICAgLmdldFZhbGlkYXRvcigpDQotICAgICAgICAgICAgICAgIC52YWxpZGF0ZVZhbHVlKGJhc2VCZWFuQ2xhc3MsIHByb3BlcnR5TmFtZSwgY29udmVydGVkT2JqZWN0LCBncm91cHMpOw0KLSAgICB9DQotDQotICAgIENsYXNzIGdldEJhc2VDbGFzc1R5cGUoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBDbGFzcyByZXN1bHQgPSBFeHRWYWxVdGlscy5nZXRQcm9wZXJ0eURldGFpbHMocHJvcGVydHlJbmZvcm1hdGlvbikuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCk7DQotDQotICAgICAgICByZXR1cm4gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhyZXN1bHQpOw0KLSAgICB9DQotDQotICAgIFN0cmluZyBnZXRQcm9wZXJ0eVRvVmFsaWRhdGUoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5SW5mb3JtYXRpb24pLmdldFByb3BlcnR5KCk7DQotICAgIH0NCi0NCi0gICAgQ2xhc3NbXSByZXNvbHZlR3JvdXBzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEdyb3VwcygNCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZ2V0Vmlld0lkKCksDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCkpOw0KLSAgICB9DQotDQotICAgIEVsZW1lbnREZXNjcmlwdG9yIGdldERlc2NyaXB0b3JGb3IoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgQmVhbkRlc2NyaXB0b3IgYmVhbkRlc2NyaXB0b3IgPSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0VmFsaWRhdG9yRmFjdG9yeSgpDQotICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0b3IoKS5nZXRDb25zdHJhaW50c0ZvckNsYXNzKHRhcmdldENsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiBiZWFuRGVzY3JpcHRvci5nZXRDb25zdHJhaW50c0ZvclByb3BlcnR5KHByb3BlcnR5KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0V4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M3Yzg1Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0V4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLm1lc3NhZ2UuaW50ZXJwb2xhdG9yLkRlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLm1lc3NhZ2UuaW50ZXJwb2xhdG9yLkV4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5Nb2RlbFZhbGlkYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5Nb2RlbFZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLkJlYW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbC5CZWFuVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5Hcm91cFN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uTWVzc2FnZUludGVycG9sYXRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGltcGxlbWVudHMgR3JvdXBTdG9yYWdlLCBNb2RlbFZhbGlkYXRpb25TdG9yYWdlDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZID0gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmNsYXNzLmdldE5hbWUoKSArICI6S0VZIjsNCi0NCi0gICAgcHJpdmF0ZSBNZXNzYWdlSW50ZXJwb2xhdG9yIGRlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yOw0KLQ0KLSAgICBwcml2YXRlIE1lc3NhZ2VSZXNvbHZlciBtZXNzYWdlUmVzb2x2ZXI7DQotDQotICAgIHByaXZhdGUgR3JvdXBTdG9yYWdlIGdyb3VwU3RvcmFnZTsNCi0NCi0gICAgcHJpdmF0ZSBNb2RlbFZhbGlkYXRpb25TdG9yYWdlIG1vZGVsVmFsaWRhdGlvblN0b3JhZ2U7DQotDQotICAgIHByaXZhdGUgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0KCkNCi0gICAgew0KLSAgICAgICAgaW5pdEdyb3VwU3RvcmFnZSgpOw0KLSAgICAgICAgaW5pdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UoKTsNCi0NCi0gICAgICAgIGluaXRNZXNzYWdlUmVzb2x2ZXIoKTsNCi0gICAgICAgIGluaXRNZXNzYWdlSW50ZXJwb2xhdG9yKCk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHVibGljIHN0YXRpYyBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgZ2V0Q3VycmVudEluc3RhbmNlKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIE1hcCByZXF1ZXN0TWFwID0gZmFjZXNDb250ZXh0LmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKTsNCi0NCi0gICAgICAgIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBjdXJyZW50Q29udGV4dCA9IChFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQpcmVxdWVzdE1hcC5nZXQoS0VZKTsNCi0NCi0gICAgICAgIGlmKGN1cnJlbnRDb250ZXh0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudENvbnRleHQgPSBuZXcgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0KCk7DQotICAgICAgICAgICAgcmVxdWVzdE1hcC5wdXQoS0VZLCBjdXJyZW50Q29udGV4dCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gY3VycmVudENvbnRleHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRvckZhY3RvcnkgZ2V0VmFsaWRhdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCB2YWxpZGF0b3JGYWN0b3J5ID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoVmFsaWRhdG9yRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgaWYodmFsaWRhdG9yRmFjdG9yeSBpbnN0YW5jZW9mIFZhbGlkYXRvckZhY3RvcnkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0b3JGYWN0b3J5KXZhbGlkYXRvckZhY3Rvcnk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybigiZmFsbGJhY2sgdG8gdGhlIGRlZmF1bHQgYnYgdmFsaWRhdG9yIGZhY3RvcnkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBCZWFuVmFsaWRhdGlvblV0aWxzLmdldERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1lc3NhZ2VJbnRlcnBvbGF0b3IgZ2V0TWVzc2FnZUludGVycG9sYXRvcigpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMubWVzc2FnZVJlc29sdmVyICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlcih0aGlzLmRlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yLCB0aGlzLm1lc3NhZ2VSZXNvbHZlcik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRHcm91cChDbGFzcyBncm91cENsYXNzLCBTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZ3JvdXBTdG9yYWdlLmFkZEdyb3VwKGdyb3VwQ2xhc3MsIHZpZXdJZCwgY2xpZW50SWQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlc3RyaWN0R3JvdXAoQ2xhc3MgZ3JvdXBDbGFzcywgU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmdyb3VwU3RvcmFnZS5yZXN0cmljdEdyb3VwKGdyb3VwQ2xhc3MsIHZpZXdJZCwgY2xpZW50SWQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzc1tdIGdldEdyb3VwcyhTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmdyb3VwU3RvcmFnZS5nZXRHcm91cHModmlld0lkLCBjbGllbnRJZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMubW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5hZGRNb2RlbFZhbGlkYXRpb25FbnRyeShtb2RlbFZhbGlkYXRpb25FbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXNUb1ZhbGlkYXRlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5nZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0R3JvdXBTdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5ncm91cFN0b3JhZ2UgPSBFeHRWYWxVdGlscw0KLSAgICAgICAgICAgICAgICAuZ2V0U3RvcmFnZShHcm91cFN0b3JhZ2UuY2xhc3MsIEJlYW5WYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRNb2RlbFZhbGlkYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tb2RlbFZhbGlkYXRpb25TdG9yYWdlID0gRXh0VmFsVXRpbHMuDQotICAgICAgICAgICAgICAgIGdldFN0b3JhZ2UoTW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcywgTW9kZWxWYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZvdW5kQmVhbiA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmVhbihNZXNzYWdlSW50ZXJwb2xhdG9yLmNsYXNzLmdldE5hbWUoKS5yZXBsYWNlKCIuIiwgIl8iKSk7DQotDQotICAgICAgICBpZihmb3VuZEJlYW4gaW5zdGFuY2VvZiBNZXNzYWdlSW50ZXJwb2xhdG9yKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuZGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IgPSAoTWVzc2FnZUludGVycG9sYXRvcilmb3VuZEJlYW47DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5kZWZhdWx0TWVzc2FnZUludGVycG9sYXRvciA9IG5ldyBEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcigNCi0gICAgICAgICAgICAgICAgQmVhblZhbGlkYXRpb25VdGlscy5nZXREZWZhdWx0VmFsaWRhdG9yRmFjdG9yeSgpLmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRNZXNzYWdlUmVzb2x2ZXIoKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1lc3NhZ2VSZXNvbHZlciA9IEV4dFZhbFV0aWxzLmdldE1lc3NhZ2VSZXNvbHZlckZvclZhbGlkYXRpb25TdHJhdGVneShnZXRCZWFuVmFsaWRhdGlvblN0cmF0ZWd5KCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgVmFsaWRhdGlvblN0cmF0ZWd5IGdldEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneShudWxsLCBudWxsKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzY5ZDMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQKLSAgICAgICAgLkFic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIHgueC4zCi0gKi8KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVSZXF1aXJlZEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZighRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkgfHwKLSAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGlzQ29tcG9uZW50UmVxdWlyZWQodWlDb21wb25lbnQpKSkKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9CZWFuVmFsaWRhdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL0JlYW5WYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OTMzYTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL0JlYW5WYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uZ3JvdXBzLkRlZmF1bHQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgVFlQRX0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLUBEb2N1bWVudGVkDQotcHVibGljIEBpbnRlcmZhY2UgQmVhblZhbGlkYXRpb24NCi17DQotICAgIFN0cmluZ1tdIHZpZXdJZHMoKSBkZWZhdWx0ICIqIjsNCi0NCi0gICAgQ2xhc3NbXSB1c2VHcm91cHMoKSBkZWZhdWx0IERlZmF1bHQuY2xhc3M7DQotDQotICAgIENsYXNzW10gcmVzdHJpY3RHcm91cHMoKSBkZWZhdWx0IHt9Ow0KLQ0KLSAgICBTdHJpbmdbXSBjb25kaXRpb25zKCkgZGVmYXVsdCAiI3t0cnVlfSI7DQotDQotICAgIE1vZGVsVmFsaWRhdGlvbiBtb2RlbFZhbGlkYXRpb24oKSBkZWZhdWx0IEBNb2RlbFZhbGlkYXRpb247DQotICAgIA0KLSAgICBAUmV0ZW50aW9uKFJVTlRJTUUpIHN0YXRpYyBAaW50ZXJmYWNlIExpc3QNCi0gICAgew0KLSAgICAgICAgQmVhblZhbGlkYXRpb25bXSB2YWx1ZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9Nb2RlbFZhbGlkYXRpb24uamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9Nb2RlbFZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjNzhkZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vTW9kZWxWYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgVFlQRX0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLUBEb2N1bWVudGVkDQotcHVibGljIEBpbnRlcmZhY2UgTW9kZWxWYWxpZGF0aW9uDQotew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUID0gIiI7DQotDQotICAgIGJvb2xlYW4gaXNBY3RpdmUoKSBkZWZhdWx0IGZhbHNlOw0KLQ0KLSAgICBib29sZWFuIGRpc3BsYXlJbmxpbmUoKSBkZWZhdWx0IGZhbHNlOw0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic3VwcG9ydCBwcm9wZXJ0eSBjaGFpbiBzeW50YXgiKQ0KLSAgICBTdHJpbmdbXSB2YWxpZGF0aW9uVGFyZ2V0cygpIGRlZmF1bHQgREVGQVVMVDsNCi0NCi0gICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0IERFRkFVTFQ7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdEdyb3VwQ29udHJvbGxlclNjYW5uaW5nRXh0cmFjdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTZmMTM1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdEdyb3VwQ29udHJvbGxlclNjYW5uaW5nRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLmV4dHJhY3RvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLkRlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInVzZSBtZXRhLWRhdGEgc3RvcmFnZSAtIGJ1dCBhIHNwZWNpYWwgaW1wbC4iKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3RvciBleHRlbmRzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcg0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgUHJvcGVydHlEZXRhaWxzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG9iamVjdC5nZXRDbGFzcygpICsgIiBpcyBub3QgYSAiICsgUHJvcGVydHlEZXRhaWxzLmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gKFByb3BlcnR5RGV0YWlscylvYmplY3Q7DQotDQotICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpKTsNCi0NCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOw0KLSAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5zZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBwcm9wZXJ0eURldGFpbHMpOw0KLQ0KLSAgICAgICAgZXh0cmFjdEFubm90YXRpb25zKHByb3BlcnR5SW5mb3JtYXRpb24sIHByb3BlcnR5RGV0YWlscywgZW50aXR5Q2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9CZWFuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0JlYW5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM3NzVjNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0JlYW5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogZXh0cmFjdHMgYW5kIGFkZHMgdGhlIGV4dHZhbCBidiBtZXRhLWRhdGEgKGUuZy4gdmFsaWRhdGlvbiBncm91cHMpIHRvIHRoZSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIgJiYgaXNCbG9ja2luZ0V4Y2VwdGlvbih1aUNvbXBvbmVudCwgdmFsaWRhdG9yRXhjZXB0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2J2IGludGVncmF0aW9uIGRvZXNuJ3QgdGhyb3cgZXhjZXB0aW9ucyB0byBzdXBwb3J0IG11bHRpcGxlIG1lc3NhZ2VzIC0+IHNldCBjb21wb25lbnQgc3RhdGUNCi0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFZhbGlkKGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0Jsb2NraW5nRXhjZXB0aW9uKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpLnNldmVyaXR5Q2F1c2VzVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0V4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjZjcwZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0V4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5WYWxpZGF0aW9uTW9kdWxlQXdhcmU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuQmVhblZhbGlkYXRpb25Nb2R1bGVLZXk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWwuQmVhblZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogZXh0cmFjdHMgYW5kIGFkZHMgdGhlIGV4dHZhbCBidiBtZXRhLWRhdGEgKGUuZy4gdmFsaWRhdGlvbiBncm91cHMpIHRvIHRoZSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi0gICAgICAgIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IsIFZhbGlkYXRpb25Nb2R1bGVBd2FyZQ0KLXsNCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFeHRyYWN0aW5nKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYocHJvcGVydHlJbmZvcm1hdGlvbi5jb250YWluc0luZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkNVU1RPTV9QUk9QRVJUSUVTKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBNYXAgcHJvcGVydGllcyA9IHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuQ1VTVE9NX1BST1BFUlRJRVMsIE1hcC5jbGFzcyk7DQotDQotICAgICAgICAgICAgaWYocHJvcGVydGllcyAhPSBudWxsICYmIHByb3BlcnRpZXMuY29udGFpbnNLZXkoVUlDb21wb25lbnQuY2xhc3MuZ2V0TmFtZSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50ID0gKFVJQ29tcG9uZW50KXByb3BlcnRpZXMuZ2V0KFVJQ29tcG9uZW50LmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscy5nZXRQcm9wZXJ0eURldGFpbHMocHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgICAgICAgICAgICAgIHByb2Nlc3NFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhKHVpQ29tcG9uZW50LCBwcm9wZXJ0eURldGFpbHMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogYWRkcyB0aGUgZXh0dmFsIGJ2IG1ldGEtZGF0YSB0byB0aGUgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0DQotICAgICAqDQotICAgICAqIEBwYXJhbSB1aUNvbXBvbmVudCBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlEZXRhaWxzIHByb3BlcnR5IGRldGFpbHMgb2YgdGhlIHZhbHVlLWJpbmRpbmcNCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscykNCi0gICAgew0KLSAgICAgICAgaWYoSnNmVXRpbHMuaXNSZW5kZXJSZXNwb25zZVBoYXNlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQmVhblZhbGlkYXRpb25VdGlscy5hZGRNZXRhRGF0YVRvQ29udGV4dCh1aUNvbXBvbmVudCwgcHJvcGVydHlEZXRhaWxzLCBmYWxzZSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgQmVhblZhbGlkYXRpb25VdGlscy5hZGRNZXRhRGF0YVRvQ29udGV4dCh1aUNvbXBvbmVudCwgcHJvcGVydHlEZXRhaWxzLCB0cnVlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TW9kdWxlS2V5cygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge0JlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzLmdldE5hbWUoKX07DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmZkYTBkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QmVhblZhbGlkYXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyPFQgZXh0ZW5kcyBBbm5vdGF0aW9uPiBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIENvbnN0cmFpbnREZXNjcmlwdG9yPD8gZXh0ZW5kcyBUPiBjb25zdHJhaW50RGVzY3JpcHRvciA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoQ29uc3RyYWludERlc2NyaXB0b3IuY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYoaXNDbGllbnRTaWRlVmFsaWRhdGlvbkVuYWJsZWQoY29uc3RyYWludERlc2NyaXB0b3IpICYmIGlzQmxvY2tpbmdDb25zdHJhaW50KGNvbnN0cmFpbnREZXNjcmlwdG9yKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtTWV0YURhdGEoKENvbnN0cmFpbnREZXNjcmlwdG9yPFQ+KWNvbnN0cmFpbnREZXNjcmlwdG9yKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ2xpZW50U2lkZVZhbGlkYXRpb25FbmFibGVkKENvbnN0cmFpbnREZXNjcmlwdG9yPD8gZXh0ZW5kcyBUPiBjb25zdHJhaW50RGVzY3JpcHRvcikNCi0gICAgew0KLSAgICAgICAgZm9yKENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPiBwYXlsb2FkIDogY29uc3RyYWludERlc2NyaXB0b3IuZ2V0UGF5bG9hZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNCbG9ja2luZ0NvbnN0cmFpbnQoQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gY29uc3RyYWludERlc2NyaXB0b3IpDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZSB0ZXN0TWVzc2FnZSA9IG5ldyBGYWNlc01lc3NhZ2UoKTsNCi0gICAgICAgIHRlc3RNZXNzYWdlLnNldFNldmVyaXR5KFZpb2xhdGlvblNldmVyaXR5LkVycm9yLlZBTFVFKTsNCi0NCi0gICAgICAgIGZvciAoQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+IHBheWxvYWQgOiBjb25zdHJhaW50RGVzY3JpcHRvci5nZXRQYXlsb2FkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzKS5pc0Fzc2lnbmFibGVGcm9tKHBheWxvYWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGVzdE1lc3NhZ2Uuc2V0U2V2ZXJpdHkoVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5WQUxVRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYoRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKFZpb2xhdGlvblNldmVyaXR5LkluZm8uY2xhc3MpLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0ZXN0TWVzc2FnZS5zZXRTZXZlcml0eShWaW9sYXRpb25TZXZlcml0eS5JbmZvLlZBTFVFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZihFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoVmlvbGF0aW9uU2V2ZXJpdHkuRmF0YWwuY2xhc3MpLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0ZXN0TWVzc2FnZS5zZXRTZXZlcml0eShWaW9sYXRpb25TZXZlcml0eS5GYXRhbC5WQUxVRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLnNldmVyaXR5QmxvY2tzU3VibWl0Rm9yQ29tcG9uZW50SWQobnVsbCwgdGVzdE1lc3NhZ2UpOw0KLSAgICB9DQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKENvbnN0cmFpbnREZXNjcmlwdG9yPFQ+IGNvbnN0cmFpbnREZXNjcmlwdG9yKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ob3ROdWxsTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ob3ROdWxsTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmM3NWVlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdEJlYW5WYWxpZGF0aW9uTWV0YURhdGFUcmFuc2Zvcm1lcjxOb3ROdWxsPg0KLXsNCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoQ29uc3RyYWludERlc2NyaXB0b3I8Tm90TnVsbD4gY29uc3RyYWludERlc2NyaXB0b3IpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgaWYoRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1N0cmluZ1NpemVNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1N0cmluZ1NpemVNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOWZmNTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9TdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFN0cmluZ1NpemVNZXRhRGF0YVRyYW5zZm9ybWVyIGV4dGVuZHMgQWJzdHJhY3RCZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXI8U2l6ZT4NCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKENvbnN0cmFpbnREZXNjcmlwdG9yPFNpemU+IGNvbnN0cmFpbnREZXNjcmlwdG9yKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIFNpemUgYW5ub3RhdGlvbiA9IGNvbnN0cmFpbnREZXNjcmlwdG9yLmdldEFubm90YXRpb24oKTsNCi0NCi0gICAgICAgIGludCBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW4oKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gIT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSCwgbWluaW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEhfREVGQVVMVCwgbWluaW11bSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpbnQgbWF4aW11bSA9IGFubm90YXRpb24ubWF4KCk7DQotICAgICAgICBpZihtYXhpbXVtICE9IEludGVnZXIuTUFYX1ZBTFVFKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RILCBtYXhpbXVtKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSF9ERUZBVUxULCBtYXhpbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0QmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZTAzMWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcg0KLSAgICAgICAgLkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZihpc0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3koc291cmNlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgYmVhblZhbGlkYXRpb25BZGFwdGVyID0NCi0gICAgICAgICAgICAgICAgICAgIChCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kpc291cmNlOw0KLQ0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVCZWFuVmFsaWRhdGlvblRyYW5zZm9ybWVyTmFtZShiZWFuVmFsaWRhdGlvbkFkYXB0ZXIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQmVhblZhbGlkYXRpb25TdHJhdGVneShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc291cmNlIGluc3RhbmNlb2YgQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCAgYWJzdHJhY3QgU3RyaW5nIGNyZWF0ZUJlYW5WYWxpZGF0aW9uVHJhbnNmb3JtZXJOYW1lKA0KLSAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9Ob3ROdWxsTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvTm90TnVsbE5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMyODc4Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9Ob3ROdWxsTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5Ob3ROdWxsTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLk5lc3RlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ATmVzdGVkDQotQEludm9jYXRpb25PcmRlcigyMDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBOb3ROdWxsTmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0QmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVCZWFuVmFsaWRhdGlvblRyYW5zZm9ybWVyTmFtZShCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgYWRhcHRlcikNCi0gICAgew0KLSAgICAgICAgaWYoaXNOb3ROdWxsQ29uc3RyYWludChhZGFwdGVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXIuY2xhc3MuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTm90TnVsbENvbnN0cmFpbnQoQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5IGFkYXB0ZXIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBOb3ROdWxsLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoDQotICAgICAgICAgICAgICAgIGFkYXB0ZXIuZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKS5nZXRBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpemVOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaXplTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzg5MGM2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpemVOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLk5lc3RlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5TdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBOZXN0ZWQNCi1ASW52b2NhdGlvbk9yZGVyKDIxMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIFNpemVOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZUJlYW5WYWxpZGF0aW9uVHJhbnNmb3JtZXJOYW1lKEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSBhZGFwdGVyKQ0KLSAgICB7DQotICAgICAgICBpZihpc1N0cmluZ1NpemVDb25zdHJhaW50KGFkYXB0ZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBTdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lci5jbGFzcy5nZXROYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTdHJpbmdTaXplQ29uc3RyYWludChCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgYWRhcHRlcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFNpemUuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscygNCi0gICAgICAgICAgICAgICAgYWRhcHRlci5nZXRDb25zdHJhaW50RGVzY3JpcHRvcigpLmdldEFubm90YXRpb24oKS5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSkgJiYNCi0gICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoYWRhcHRlci5nZXRFbGVtZW50Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvcGF5bG9hZC9EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvcGF5bG9hZC9EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIyZDIyZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3BheWxvYWQvRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbiBleHRlbmRzIFBheWxvYWQNCi17DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvcGF5bG9hZC9WaW9sYXRpb25TZXZlcml0eS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wYXlsb2FkL1Zpb2xhdGlvblNldmVyaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzODhiMmQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wYXlsb2FkL1Zpb2xhdGlvblNldmVyaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmlvbGF0aW9uU2V2ZXJpdHkNCi17DQotICAgIGludGVyZmFjZSBJbmZvIGV4dGVuZHMgUGF5bG9hZA0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgVkFMVUUgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfSU5GTzsNCi0gICAgfQ0KLQ0KLSAgICBpbnRlcmZhY2UgV2FybiBleHRlbmRzIFBheWxvYWQNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFZBTFVFID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk47DQotICAgIH0NCi0NCi0gICAgaW50ZXJmYWNlIEVycm9yIGV4dGVuZHMgUGF5bG9hZA0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgVkFMVUUgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1I7DQotICAgIH0NCi0NCi0gICAgaW50ZXJmYWNlIEZhdGFsIGV4dGVuZHMgUGF5bG9hZA0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgVkFMVUUgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdGFydHVwL0JlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0YXJ0dXAvQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JhYzZmOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0YXJ0dXAvQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLkJlYW5Bd2FyZVZhbGlkYXRvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC51dGlsLkJlYW5WYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yLkV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yLkJlYW5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyLlNpemVOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIuTm90TnVsbE5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLk1vZGVsVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UubWFwcGVyLkJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5tYXBwZXIuTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5Hcm91cFN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXJIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTUwMjU3NDgzOTk4NzY4MzMzOTRMOw0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXJWYWxpZGF0b3JGYWN0b3J5KCk7DQotICAgICAgICByZWdpc3RlckJlYW5WYWxpZGF0aW9uSW50ZXJjZXB0b3IoKTsNCi0gICAgICAgIHJlZ2lzdGVyTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKTsNCi0gICAgICAgIHJlZ2lzdGVyR3JvdXBTdG9yYWdlTmFtZU1hcHBlcigpOw0KLSAgICAgICAgcmVnaXN0ZXJNb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlcigpOw0KLSAgICAgICAgcmVnaXN0ZXJDb21wb25lbnRJbml0aWFsaXplcnMoKTsNCi0gICAgICAgIHJlZ2lzdGVyTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7DQotICAgICAgICByZWdpc3RlclBoYXNlTGlzdGVuZXJzKCk7DQotICAgICAgICByZWdpc3RlckV4Y2VwdGlvbkludGVyY2VwdG9yKCk7DQotICAgICAgICByZWdpc3RlclZpb2xhdGlvblNldmVyaXR5UGF5bG9hZCgpOw0KLSAgICAgICAgcmVnaXN0ZXJEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb25QYXlsb2FkKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJWYWxpZGF0b3JGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoVmFsaWRhdG9yRmFjdG9yeS5jbGFzcy5nZXROYW1lKCksDQotICAgICAgICAgICAgICAgIG5ldyBCZWFuQXdhcmVWYWxpZGF0b3JGYWN0b3J5KEJlYW5WYWxpZGF0aW9uVXRpbHMuZ2V0RGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKSksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckJlYW5WYWxpZGF0aW9uSW50ZXJjZXB0b3IoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIobmV3IFNpemVOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKG5ldyBOb3ROdWxsTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlckdyb3VwU3RvcmFnZU5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBTdG9yYWdlTWFuYWdlciBzdG9yYWdlTWFuYWdlciA9IGdldFN0b3JhZ2VNYW5hZ2VySG9sZGVyKCkuZ2V0U3RvcmFnZU1hbmFnZXIoR3JvdXBTdG9yYWdlLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmIChzdG9yYWdlTWFuYWdlciBpbnN0YW5jZW9mIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAoKEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxTdHJpbmc+KSBzdG9yYWdlTWFuYWdlcikNCi0gICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgQmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKHN0b3JhZ2VNYW5hZ2VyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGhhcyB0byBpbXBsZW1lbnQgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5ICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgIiBjb3VsZG4ndCByZWdpc3RlciAiICsgQmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyLmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBEZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgbW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgPSBuZXcgRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyKCk7DQotICAgICAgICBtb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5yZWdpc3RlcihuZXcgTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBnZXRTdG9yYWdlTWFuYWdlckhvbGRlcigpLnNldFN0b3JhZ2VNYW5hZ2VyKE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MsIG1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJDb21wb25lbnRJbml0aWFsaXplcnMoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0b3JhZ2VNYW5hZ2VySG9sZGVyIGdldFN0b3JhZ2VNYW5hZ2VySG9sZGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwgU3RvcmFnZU1hbmFnZXJIb2xkZXIuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlck1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclBoYXNlTGlzdGVuZXJzKCkNCi0gICAgew0KLSAgICAgICAgSnNmVXRpbHMucmVnaXN0ZXJQaGFzZUxpc3RlbmVyKG5ldyBNb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyRXhjZXB0aW9uSW50ZXJjZXB0b3IoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IobmV3IEJlYW5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJWaW9sYXRpb25TZXZlcml0eVBheWxvYWQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0IGV4dFZhbENvbnRleHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKTsNCi0NCi0gICAgICAgIGV4dFZhbENvbnRleHQuYWRkR2xvYmFsUHJvcGVydHkoVmlvbGF0aW9uU2V2ZXJpdHkuSW5mby5jbGFzcy5nZXROYW1lKCksIFZpb2xhdGlvblNldmVyaXR5LkluZm8uY2xhc3MsIGZhbHNlKTsNCi0gICAgICAgIGV4dFZhbENvbnRleHQuYWRkR2xvYmFsUHJvcGVydHkoVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcy5nZXROYW1lKCksIFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MsIGZhbHNlKTsNCi0gICAgICAgIGV4dFZhbENvbnRleHQuYWRkR2xvYmFsUHJvcGVydHkoVmlvbGF0aW9uU2V2ZXJpdHkuRmF0YWwuY2xhc3MuZ2V0TmFtZSgpLCBWaW9sYXRpb25TZXZlcml0eS5GYXRhbC5jbGFzcywgZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyBuZWVkIHRvIHJlZ2lzdGVyICJlcnJvciIgaXQncyB0aGUgZGVmYXVsdA0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvblBheWxvYWQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eSgNCi0gICAgICAgICAgICAgICAgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKSwgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLCBmYWxzZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRCZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRCZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjAzNzZlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdEdyb3VwU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGJlYW4tdmFsaWRhdGlvbiBncm91cHMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UgZXh0ZW5kcyBEZWZhdWx0R3JvdXBTdG9yYWdlDQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIENsYXNzW10gZ2V0R3JvdXBzKFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgQ2xhc3NbXSByZXN1bHQgPSBzdXBlci5nZXRHcm91cHModmlld0lkLCBjbGllbnRJZCk7DQotDQotICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL3RoZSBkZWZhdWx0IGdyb3VwIHdpbGwgYmUgdmFsaWRhdGVkIGF1dG9tYXRpY2FsbHkNCi0gICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzW10ge307DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MDBmOGIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuR3JvdXBVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBzdG9yYWdlIGltcGxlbWVudGF0aW9uIGZvciBtb2RlbC12YWxpZGF0aW9uIGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZSBpbXBsZW1lbnRzIE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4+IG1vZGVsVmFsaWRhdGlvbkVudHJpZXMgPQ0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4+KCk7DQotDQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGNvbXBvbmVudHNPZlJlcXVlc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjbGllbnRJZCA9IGdldEN1cnJlbnRDbGllbnRJZChtb2RlbFZhbGlkYXRpb25FbnRyeSk7DQotDQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QgPSByZXNvbHZlTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeSwgY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkobW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LCBtb2RlbFZhbGlkYXRpb25FbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q3VycmVudENsaWVudElkKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY2xpZW50SWQgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjbGllbnRJZCA9IG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpLmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotDQotICAgICAgICAgICAgaWYoIXRoaXMuY29tcG9uZW50c09mUmVxdWVzdC5jb250YWlucyhjbGllbnRJZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNPZlJlcXVlc3QuYWRkKGNsaWVudElkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY2xpZW50SWQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXNvbHZlTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KA0KLSAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9DQotICAgICAgICAgICAgICAgIHRoaXMubW9kZWxWYWxpZGF0aW9uRW50cmllcy5nZXQoR3JvdXBVdGlscy5nZXRHcm91cEtleSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRWaWV3SWQoKSwgY2xpZW50SWQpKTsNCi0NCi0gICAgICAgIGlmKG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICAgICAgdGhpcy5tb2RlbFZhbGlkYXRpb25FbnRyaWVzLnB1dChHcm91cFV0aWxzLmdldEdyb3VwS2V5KA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Vmlld0lkKCksIGNsaWVudElkKSwgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KA0KLSAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmKCFtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QuY29udGFpbnMobW9kZWxWYWxpZGF0aW9uRW50cnkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdC5hZGQobW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2aWV3SWQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRWaWV3SWQoKTsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotDQotICAgICAgICBhZGRFbnRyaWVzRm9yQ29tcG9uZW50cyh2aWV3SWQsIHJlc3VsdCk7DQotDQotICAgICAgICBhZGRFbnRyaWVzRm9yUGFnZSh2aWV3SWQsIHJlc3VsdCk7DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRFbnRyaWVzRm9yQ29tcG9uZW50cyhTdHJpbmcgdmlld0lkLCBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIGZvcihTdHJpbmcgY3VycmVudENsaWVudElkIDogdGhpcy5jb21wb25lbnRzT2ZSZXF1ZXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwoZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllcyh2aWV3SWQsIGN1cnJlbnRDbGllbnRJZCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRFbnRyaWVzRm9yUGFnZShTdHJpbmcgdmlld0lkLCBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIHJlc3VsdC5hZGRBbGwoZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllcyh2aWV3SWQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGJ1aWxkTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KA0KLSAgICAgICAgICAgIFN0cmluZyBrZXksIE1hcDxTdHJpbmcsIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+PiBncm91cFN0b3JhZ2UpDQotICAgIHsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGxpc3Q7DQotDQotICAgICAgICBpZihrZXkgIT0gbnVsbCAmJiBrZXkuZW5kc1dpdGgoIioiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4oKTsNCi0gICAgICAgICAgICBmb3IoTWFwLkVudHJ5PFN0cmluZyxMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5Pj4gZW50cnkgOiBncm91cFN0b3JhZ2UuZW50cnlTZXQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldEtleSgpLnN1YnN0cmluZygwLCBlbnRyeS5nZXRLZXkoKS5pbmRleE9mKCJAIikpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhrZXkuc3Vic3RyaW5nKDAsIGtleS5pbmRleE9mKCJAIikpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGRBbGwoZW50cnkuZ2V0VmFsdWUoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGxpc3Q7DQotICAgICAgICB9DQotDQotICAgICAgICBsaXN0ID0gZ3JvdXBTdG9yYWdlLmdldChrZXkpOw0KLSAgICAgICAgcmV0dXJuIChsaXN0ICE9IG51bGwpID8gbGlzdCA6IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzKFN0cmluZyB2aWV3SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzKHZpZXdJZCwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzKFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5tb2RlbFZhbGlkYXRpb25FbnRyaWVzLnNpemUoKSA8IDEpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2FkZCBmb3VuZCBncm91cHMNCi0gICAgICAgIFN0cmluZyBrZXk7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHRMaXN0Rm9yUGFnZSA9IG51bGw7DQotDQotICAgICAgICBpZighIioiLmVxdWFscyhjbGllbnRJZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAga2V5ID0gR3JvdXBVdGlscy5nZXRHcm91cEtleSh2aWV3SWQsIG51bGwpOw0KLSAgICAgICAgICAgIHJlc3VsdExpc3RGb3JQYWdlID0NCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KGtleSwgdGhpcy5tb2RlbFZhbGlkYXRpb25FbnRyaWVzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGtleSA9IEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBjbGllbnRJZCk7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHRMaXN0Rm9yQ29tcG9uZW50ID0NCi0gICAgICAgICAgICAgICAgYnVpbGRNb2RlbFZhbGlkYXRpb25FbnRyeUxpc3Qoa2V5LCB0aGlzLm1vZGVsVmFsaWRhdGlvbkVudHJpZXMpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0TGlzdEZvclBhZ2UgPT0gbnVsbCB8fCByZXN1bHRMaXN0Rm9yUGFnZS5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdExpc3RGb3JDb21wb25lbnQ7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKHJlc3VsdExpc3RGb3JDb21wb25lbnQuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRMaXN0Rm9yUGFnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBtZXJnZVJlc3VsdHMocmVzdWx0TGlzdEZvclBhZ2UsIHJlc3VsdExpc3RGb3JDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbWVyZ2VSZXN1bHRzKA0KLSAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IHJlc3VsdExpc3RGb3JQYWdlLCBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHRMaXN0Rm9yQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtZXJnZWRSZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PigpOw0KLSAgICAgICAgbWVyZ2VkUmVzdWx0LmFkZEFsbChyZXN1bHRMaXN0Rm9yUGFnZSk7DQotICAgICAgICBtZXJnZWRSZXN1bHQuYWRkQWxsKHJlc3VsdExpc3RGb3JDb21wb25lbnQpOw0KLSAgICAgICAgcmV0dXJuIG1lcmdlZFJlc3VsdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MzEwMTIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5TdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIG1vZGVsLXZhbGlkYXRpb24gZW50cmllcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlcg0KLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8TW9kZWxWYWxpZGF0aW9uU3RvcmFnZT4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfTU9ERUxfVkFMSURBVElPTjpLRVkiOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25FbnRyeS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvbkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OGE4ZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5BUEk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihBUEkpDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvbkVudHJ5DQotew0KLSAgICBwcml2YXRlIFVJQ29tcG9uZW50IGNvbXBvbmVudDsNCi0gICAgcHJpdmF0ZSBMaXN0PENsYXNzPiBncm91cHMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLSAgICBwcml2YXRlIExpc3Q8T2JqZWN0PiB2YWxpZGF0aW9uVGFyZ2V0cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGlzcGxheU1lc3NhZ2VJbmxpbmUgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgY3VzdG9tTWVzc2FnZSA9IE1vZGVsVmFsaWRhdGlvbi5ERUZBVUxUOw0KLSAgICANCi0gICAgLy90aGUgb3JpZ2luYWwgc291cmNlIHdoZXJlIHRoZSBleHR2YWwtYnYgbWV0YS1kYXRhIGhhcyBiZWVuIGZvdW5kDQotICAgIHByaXZhdGUgT2JqZWN0IG1ldGFEYXRhU291cmNlT2JqZWN0Ow0KLSAgICBwcml2YXRlIFN0cmluZyB2aWV3SWQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRWaWV3SWQoKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkR3JvdXAoQ2xhc3MgZ3JvdXApDQotICAgIHsNCi0gICAgICAgIGlmKCF0aGlzLmdyb3Vwcy5jb250YWlucyhncm91cCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoISh0aGlzLmdyb3VwcyBpbnN0YW5jZW9mIEFycmF5TGlzdCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBuZXdHcm91cExpc3QgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLQ0KLSAgICAgICAgICAgICAgICBmb3IoQ2xhc3MgY3VycmVudENsYXNzIDogdGhpcy5ncm91cHMpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG5ld0dyb3VwTGlzdC5hZGQoY3VycmVudENsYXNzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB0aGlzLmdyb3VwcyA9IG5ld0dyb3VwTGlzdDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdGhpcy5ncm91cHMuYWRkKGdyb3VwKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVHcm91cChDbGFzcyBncm91cCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5ncm91cHMucmVtb3ZlKGdyb3VwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRWYWxpZGF0aW9uVGFyZ2V0KE9iamVjdCB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIGlmKCF0aGlzLnZhbGlkYXRpb25UYXJnZXRzLmNvbnRhaW5zKHRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoISh0aGlzLnZhbGlkYXRpb25UYXJnZXRzIGluc3RhbmNlb2YgQXJyYXlMaXN0KSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIExpc3Q8T2JqZWN0PiB2YWxpZGF0aW9uVGFyZ2V0TGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KLQ0KLSAgICAgICAgICAgICAgICBmb3IoT2JqZWN0IGN1cnJlbnRUYXJnZXQgOiB0aGlzLnZhbGlkYXRpb25UYXJnZXRzKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0TGlzdC5hZGQoY3VycmVudFRhcmdldCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uVGFyZ2V0cyA9IHZhbGlkYXRpb25UYXJnZXRMaXN0Ow0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25UYXJnZXRzLmFkZCh0YXJnZXQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIFVJQ29tcG9uZW50IGdldENvbXBvbmVudCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KFVJQ29tcG9uZW50IGNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENsYXNzW10gZ2V0R3JvdXBzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzLnRvQXJyYXkobmV3IENsYXNzW3RoaXMuZ3JvdXBzLnNpemUoKV0pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwcyhMaXN0PENsYXNzPiBncm91cHMpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZ3JvdXBzID0gZ3JvdXBzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZ2V0VmFsaWRhdGlvblRhcmdldHMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblRhcmdldHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRNZXRhRGF0YVNvdXJjZU9iamVjdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YVNvdXJjZU9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVNvdXJjZU9iamVjdChPYmplY3QgbWV0YURhdGFTb3VyY2VPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFTb3VyY2VPYmplY3QgPSBtZXRhRGF0YVNvdXJjZU9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlJlZHVuZGFudElmU3RhdGVtZW50In0pDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmICh0aGlzID09IG8pDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IHRoYXQgPSAoTW9kZWxWYWxpZGF0aW9uRW50cnkpIG87DQotDQotICAgICAgICBpZiAoY29tcG9uZW50ICE9IG51bGwgPyAhY29tcG9uZW50LmVxdWFscyh0aGF0LmNvbXBvbmVudCkgOiB0aGF0LmNvbXBvbmVudCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghZ3JvdXBzLmVxdWFscyh0aGF0Lmdyb3VwcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCF2YWxpZGF0aW9uVGFyZ2V0cy5lcXVhbHModGhhdC52YWxpZGF0aW9uVGFyZ2V0cykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNEaXNwbGF5TWVzc2FnZUlubGluZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkaXNwbGF5TWVzc2FnZUlubGluZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TWVzc2FnZUlubGluZShib29sZWFuIGRpc3BsYXlNZXNzYWdlSW5saW5lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRpc3BsYXlNZXNzYWdlSW5saW5lID0gZGlzcGxheU1lc3NhZ2VJbmxpbmU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDdXN0b21NZXNzYWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tTWVzc2FnZShTdHJpbmcgY3VzdG9tTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jdXN0b21NZXNzYWdlID0gY3VzdG9tTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIGludCByZXN1bHQgPSBjb21wb25lbnQgIT0gbnVsbCA/IGNvbXBvbmVudC5oYXNoQ29kZSgpIDogMDsNCi0gICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgZ3JvdXBzLmhhc2hDb2RlKCk7DQotICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIHZhbGlkYXRpb25UYXJnZXRzLmhhc2hDb2RlKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Vmlld0lkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZpZXdJZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWaWV3SWQoU3RyaW5nIHZpZXdJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy52aWV3SWQgPSB2aWV3SWQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmRmOTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogc3VnZ2VzdGVkIGludGVyZmFjZSBmb3IgYSBtb2RlbC12YWxpZGF0aW9uIHN0b3JhZ2UNCi0gKiA8cC8+DQotICogaXQgYWxsb3dzIHRvIG1hbmFnZSBtb2RlbC12YWxpZGF0aW9uLWVudHJpZXMgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHZvaWQgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLQ0KLSAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvbWFwcGVyL0JlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9CZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjMmUzOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvbWFwcGVyL0JlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uQmVhblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuRGVmYXVsdEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEJlYW5WYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoa2V5KSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvbWFwcGVyL01vZGVsVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvbWFwcGVyL01vZGVsVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNjIwNTAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLkRlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoTW9kZWxWYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoa2V5KSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9CZWFuVmFsaWRhdGlvblV0aWxzLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvQmVhblZhbGlkYXRpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzZkMTczLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9CZWFuVmFsaWRhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLk1vZGVsVmFsaWRhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5GYWNlc01lc3NhZ2VIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25VdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPR0dFUiA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEJlYW5WYWxpZGF0aW9uVXRpbHMuY2xhc3MpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzIGJ2bWkgPSBuZXcgRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscyhMT0dHRVIpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVE9SX0ZBQ1RPUllfS0VZID0gImphdmF4LmZhY2VzLnZhbGlkYXRvci5iZWFuVmFsaWRhdG9yLlZhbGlkYXRvckZhY3RvcnkiOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTWV0YURhdGFUb0NvbnRleHQoDQotICAgICAgICAgICAgVUlDb21wb25lbnQgY29tcG9uZW50LCBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLCBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZ1tdIGtleSA9IHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKS5zcGxpdCgiXFwuIik7DQotDQotICAgICAgICBPYmplY3QgZmlyc3RCZWFuID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKGtleVswXSk7DQotDQotICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgIGJ2bWkuZXh0cmFjdEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGEocHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBrZXksDQotICAgICAgICAgICAgICAgIGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotDQotICAgICAgICBidm1pLnByb2Nlc3NFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhKGNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc0NvbnN0cmFpbnRWaW9sYXRpb25zKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbj4gdmlvbGF0aW9ucykNCi0gICAgew0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2U7DQotICAgICAgICBmb3IgKENvbnN0cmFpbnRWaW9sYXRpb24gdmlvbGF0aW9uIDogdmlvbGF0aW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2UgPSBjcmVhdGVGYWNlc01lc3NhZ2VGb3JDb25zdHJhaW50VmlvbGF0aW9uKHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHZpb2xhdGlvbik7DQotDQotICAgICAgICAgICAgaWYgKGZhY2VzTWVzc2FnZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGJ2bWkucHJvY2Vzc0ZhY2VzTWVzc2FnZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0LCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHJvY2Vzc1Zpb2xhdGlvbk1lc3NhZ2VzKGZhY2VzTWVzc2FnZUhvbGRlckxpc3QpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjZXNNZXNzYWdlIGNyZWF0ZUZhY2VzTWVzc2FnZUZvckNvbnN0cmFpbnRWaW9sYXRpb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJhaW50VmlvbGF0aW9uIHZpb2xhdGlvbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZpb2xhdGlvbk1lc3NhZ2UgPSB2aW9sYXRpb24uZ2V0TWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGxhYmVsZWRNZXNzYWdlU3VtbWFyeSA9IGJ2bWkuY3JlYXRlTGFiZWxlZE1lc3NhZ2UodmlvbGF0aW9uTWVzc2FnZSwgZmFsc2UpOw0KLSAgICAgICAgU3RyaW5nIGxhYmVsZWRNZXNzYWdlRGV0YWlsID0gYnZtaS5jcmVhdGVMYWJlbGVkTWVzc2FnZSh2aW9sYXRpb25NZXNzYWdlLCB0cnVlKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSA9IGJ2bWkuY2FsY1NldmVyaXR5KHZpb2xhdGlvbik7DQotDQotICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uID0gYnZtaQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yRXhjZXB0aW9uKGxhYmVsZWRNZXNzYWdlU3VtbWFyeSwgbGFiZWxlZE1lc3NhZ2VEZXRhaWwsIHNldmVyaXR5KTsNCi0NCi0gICAgICAgIGlmICghYnZtaS5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycyh1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGJ2bWkuaXNNZXNzYWdlVGV4dFVuY2hhbmdlZCh2YWxpZGF0b3JFeGNlcHRpb24sIGxhYmVsZWRNZXNzYWdlU3VtbWFyeSwgbGFiZWxlZE1lc3NhZ2VEZXRhaWwpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc2V2ZXJpdHksIHZpb2xhdGlvbk1lc3NhZ2UsIHZpb2xhdGlvbk1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc2V2ZXJpdHksDQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U3VtbWFyeSgpLA0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldERldGFpbCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc1Zpb2xhdGlvbk1lc3NhZ2VzKExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiB2aW9sYXRpb25NZXNzYWdlSG9sZGVyTGlzdCkNCi0gICAgew0KLSAgICAgICAgaWYgKHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0ID09IG51bGwgfHwgdmlvbGF0aW9uTWVzc2FnZUhvbGRlckxpc3QuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VMaXN0V2l0aExvd1NldmVyaXR5ID0NCi0gICAgICAgICAgICAgICAgYnZtaS5nZXRGYWNlc01lc3NhZ2VMaXN0V2l0aExvd1NldmVyaXR5KHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0KTsNCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VMaXN0V2l0aEhpZ2hTZXZlcml0eSA9DQotICAgICAgICAgICAgICAgIGJ2bWkuZ2V0RmFjZXNNZXNzYWdlTGlzdFdpdGhIaWdoU2V2ZXJpdHkodmlvbGF0aW9uTWVzc2FnZUhvbGRlckxpc3QpOw0KLQ0KLSAgICAgICAgYnZtaS5hZGRNZXNzYWdlcyhmYWNlc01lc3NhZ2VMaXN0V2l0aEhpZ2hTZXZlcml0eSk7DQotICAgICAgICBidm1pLmFkZE1lc3NhZ2VzKGZhY2VzTWVzc2FnZUxpc3RXaXRoTG93U2V2ZXJpdHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yRmFjdG9yeSBnZXREZWZhdWx0VmFsaWRhdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gYXBwbGljYXRpb25NYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25NYXAoKTsNCi0gICAgICAgIFZhbGlkYXRvckZhY3RvcnkgdmFsaWRhdG9yRmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBpZiAoYXBwbGljYXRpb25NYXAuY29udGFpbnNLZXkoVkFMSURBVE9SX0ZBQ1RPUllfS0VZKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoYXBwbGljYXRpb25NYXAuZ2V0KFZBTElEQVRPUl9GQUNUT1JZX0tFWSkgaW5zdGFuY2VvZiBWYWxpZGF0b3JGYWN0b3J5KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yRmFjdG9yeSA9IChWYWxpZGF0b3JGYWN0b3J5KSBhcHBsaWNhdGlvbk1hcC5nZXQoVkFMSURBVE9SX0ZBQ1RPUllfS0VZKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmFsaWRhdG9yRmFjdG9yeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRvckZhY3RvcnkgPSBWYWxpZGF0aW9uLmJ1aWxkRGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKTsNCi0gICAgICAgICAgICBhcHBsaWNhdGlvbk1hcC5wdXQoVkFMSURBVE9SX0ZBQ1RPUllfS0VZLCB2YWxpZGF0b3JGYWN0b3J5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGE2NzllLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uQmVhblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLmV4dHJhY3Rvci5EZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuTW9kZWxWYWxpZGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkVMSGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5GYWNlc01lc3NhZ2VIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFJbnRlcm5hbHMNCi17DQotICAgIHByaXZhdGUgTG9nIGxvZ2dlcjsNCi0gICAgcHJpdmF0ZSBMYWJlbGVkTWVzc2FnZUludGVybmFscyBsYWJlbGVkTWVzc2FnZUludGVybmFscyA9IG5ldyBMYWJlbGVkTWVzc2FnZUludGVybmFscygpOw0KLQ0KLSAgICBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzKExvZyBsb2dnZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyOw0KLSAgICB9DQotDQotICAgIHZvaWQgZXh0cmFjdEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGEoUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10ga2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgaW5zcGVjdEZpcnN0QmVhbihwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgaW5zcGVjdEZpcnN0UHJvcGVydHkocHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAga2V5LA0KLSAgICAgICAgICAgICAgICBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIGtleS5sZW5ndGggPT0gMik7DQotDQotICAgICAgICBpbnNwZWN0QmFzZU9mUHJvcGVydHkocHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgIGluc3BlY3RMYXN0UHJvcGVydHkocHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIHByb2Nlc3NFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhKFVJQ29tcG9uZW50IGNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgPSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBTdHJpbmcgY3VycmVudFZpZXdJZCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldFZpZXdJZCgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGNsaWVudElkID0gY29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotDQotICAgICAgICBwcm9jZXNzRm91bmRHcm91cHMoZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LCBjdXJyZW50Vmlld0lkLCBjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgcHJvY2Vzc1Jlc3RyaWN0ZWRHcm91cHMoZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LCBjdXJyZW50Vmlld0lkLCBjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbik7DQotDQotICAgICAgICBpbml0TW9kZWxWYWxpZGF0aW9uKGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCwgY29tcG9uZW50LCBwcm9wZXJ0eURldGFpbHMsDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RGaXJzdEJlYW4oYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgZmlyc3RCZWFuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzQ2xhc3MoZmlyc3RCZWFuLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5zcGVjdEZpcnN0UHJvcGVydHkoYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10ga2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzTGFzdFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzRmllbGRzQW5kUHJvcGVydGllcyhrZXlbMF0gKyAiLiIgKyBrZXlbMV0sDQotICAgICAgICAgICAgICAgIGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAga2V5WzFdLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBpc0xhc3RQcm9wZXJ0eSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RCYXNlT2ZQcm9wZXJ0eShQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RMYXN0UHJvcGVydHkoUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzRmllbGRzQW5kUHJvcGVydGllcygNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzLmdldEtleSgpLA0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgdHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDbGFzcyhPYmplY3Qgb2JqZWN0VG9JbnNwZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBDbGFzcyBjbGFzc1RvSW5zcGVjdCA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3Mob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCkpOw0KLQ0KLSAgICAgICAgd2hpbGUgKCFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc1RvSW5zcGVjdC5nZXROYW1lKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyYW5zZmVyR3JvdXBWYWxpZGF0aW9uSW5mb3JtYXRpb25Ub0ZvdW5kR3JvdXBzKG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhvYmplY3RUb0luc3BlY3QuZ2V0Q2xhc3MoKSwgb2JqZWN0VG9JbnNwZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgICAgIGNsYXNzVG9JbnNwZWN0ID0gY2xhc3NUb0luc3BlY3QuZ2V0U3VwZXJjbGFzcygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmllbGRzQW5kUHJvcGVydGllcyhTdHJpbmcga2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGJhc2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0xhc3RQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3RvcigpDQotICAgICAgICAgICAgICAgIC5leHRyYWN0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgbmV3IFByb3BlcnR5RGV0YWlscyhrZXksIGJhc2UsIHByb3BlcnR5KSk7DQotDQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSA6IHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5VG9Qcm9jZXNzTWV0YURhdGEoKEJlYW5WYWxpZGF0aW9uKSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5VG9DcmVhdGVOZXdUYXJnZXQoYmFzZSwgcHJvcGVydHksIGlzTGFzdFByb3BlcnR5KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmIChtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdGlvbi5MaXN0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm9yIChCZWFuVmFsaWRhdGlvbiBjdXJyZW50QmVhblZhbGlkYXRpb24gOiAoKEJlYW5WYWxpZGF0aW9uLkxpc3QpIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSkudmFsdWUoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdHJ5VG9Qcm9jZXNzTWV0YURhdGEoY3VycmVudEJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlUb0NyZWF0ZU5ld1RhcmdldChiYXNlLCBwcm9wZXJ0eSwgaXNMYXN0UHJvcGVydHkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCB0cnlUb0NyZWF0ZU5ld1RhcmdldChPYmplY3QgYmFzZSwgU3RyaW5nIHByb3BlcnR5LCBib29sZWFuIGlzTGFzdFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpZihpc0xhc3RQcm9wZXJ0eSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYmFzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE9iamVjdCByZXN1bHQgPSBnZXRWYWx1ZU9mUHJvcGVydHkoYmFzZSwgcHJvcGVydHkpOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBiYXNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBnZXRWYWx1ZU9mUHJvcGVydHkoT2JqZWN0IGJhc2UsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHByb3BlcnR5LnN1YnN0cmluZygxLCBwcm9wZXJ0eS5sZW5ndGgoKSk7DQotDQotICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoYmFzZS5nZXRDbGFzcygpKTsNCi0NCi0gICAgICAgIE1ldGhvZCB0YXJnZXRNZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodGFyZ2V0Q2xhc3MsICJnZXQiICsgcHJvcGVydHkpOw0KLQ0KLSAgICAgICAgaWYgKHRhcmdldE1ldGhvZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh0YXJnZXRDbGFzcywgImlzIiArIHByb3BlcnR5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgImNsYXNzICIgKyB0YXJnZXRDbGFzcyArICIgaGFzIG5vIHB1YmxpYyBnZXQvaXMgIiArIHByb3BlcnR5LnRvTG93ZXJDYXNlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZChiYXNlLCB0YXJnZXRNZXRob2QpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRm91bmRHcm91cHMoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudFZpZXdJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xpZW50SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIC8qDQotICAgICAgICAgKiBhZGQgZm91bmQgZ3JvdXBzIHRvIGNvbnRleHQNCi0gICAgICAgICAqLw0KLSAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50R3JvdXBDbGFzcyA6IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5hZGRHcm91cChjdXJyZW50R3JvdXBDbGFzcywgY3VycmVudFZpZXdJZCwgY2xpZW50SWQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUmVzdHJpY3RlZEdyb3VwcyhFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRWaWV3SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xpZW50SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICAvKg0KLSAgICAgICAgICogYWRkIHJlc3RyaWN0ZWQgZ3JvdXBzDQotICAgICAgICAgKi8NCi0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEdyb3VwQ2xhc3MgOiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5yZXN0cmljdEdyb3VwKGN1cnJlbnRHcm91cENsYXNzLCBjdXJyZW50Vmlld0lkLCBjbGllbnRJZCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRNb2RlbFZhbGlkYXRpb24oRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgY29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIC8qDQotICAgICAgICAgKiBhZGQgbW9kZWwgdmFsaWRhdGlvbiBlbnRyeSBsaXN0DQotICAgICAgICAgKi8NCi0gICAgICAgIGZvciAoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkgOiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yIChDbGFzcyByZXN0cmljdGVkR3JvdXAgOiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkucmVtb3ZlR3JvdXAocmVzdHJpY3RlZEdyb3VwKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldEdyb3VwcygpLmxlbmd0aCA+IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0VmFsaWRhdGlvblRhcmdldHMoKS5pc0VtcHR5KCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmFkZFZhbGlkYXRpb25UYXJnZXQocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuc2V0Q29tcG9uZW50KGNvbXBvbmVudCk7DQotICAgICAgICAgICAgICAgIGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5hZGRNb2RlbFZhbGlkYXRpb25FbnRyeShtb2RlbFZhbGlkYXRpb25FbnRyeSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ0ZXN0IHByb3h5IHN1cHBvcnQiKQ0KLSAgICBwcml2YXRlIHZvaWQgdHJhbnNmZXJHcm91cFZhbGlkYXRpb25JbmZvcm1hdGlvblRvRm91bmRHcm91cHMoDQotICAgICAgICAgICAgT2JqZWN0IG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKG9iamVjdFRvSW5zcGVjdC5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoQmVhblZhbGlkYXRpb24uY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvUHJvY2Vzc01ldGFEYXRhKG9iamVjdFRvSW5zcGVjdC5nZXRDbGFzcygpLmdldEFubm90YXRpb24oQmVhblZhbGlkYXRpb24uY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0VG9JbnNwZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCkuaXNBbm5vdGF0aW9uUHJlc2VudChCZWFuVmFsaWRhdGlvbi5MaXN0LmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IgKEJlYW5WYWxpZGF0aW9uIGN1cnJlbnRCZWFuVmFsaWRhdGlvbiA6DQotICAgICAgICAgICAgICAgICAgICAob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCkuZ2V0QW5ub3RhdGlvbihCZWFuVmFsaWRhdGlvbi5MaXN0LmNsYXNzKSkudmFsdWUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRyeVRvUHJvY2Vzc01ldGFEYXRhKGN1cnJlbnRCZWFuVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RUb0luc3BlY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbnRlcmZhY2VzKENsYXNzIGN1cnJlbnRDbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IGN1cnJlbnRDbGFzcy5nZXRJbnRlcmZhY2VzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJhbnNmZXJHcm91cFZhbGlkYXRpb25JbmZvcm1hdGlvblRvRm91bmRHcm91cHMobWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotDQotICAgICAgICAgICAgcHJvY2Vzc0ludGVyZmFjZXMoY3VycmVudEludGVyZmFjZSwgbWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvUHJvY2Vzc01ldGFEYXRhKEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgZm9yIChTdHJpbmcgY3VycmVudFZpZXdJZCA6IGJlYW5WYWxpZGF0aW9uLnZpZXdJZHMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodXNlTWV0YURhdGFGb3JWaWV3SWQoYmVhblZhbGlkYXRpb24sIGN1cnJlbnRWaWV3SWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01ldGFEYXRhKGJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlTWV0YURhdGFGb3JWaWV3SWQoQmVhblZhbGlkYXRpb24gYmVhblZhbGlkYXRpb24sIFN0cmluZyBjdXJyZW50Vmlld0lkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKGN1cnJlbnRWaWV3SWQuZXF1YWxzKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldFZpZXdJZCgpKSB8fA0KLSAgICAgICAgICAgICAgICBjdXJyZW50Vmlld0lkLmVxdWFscygiKiIpKSAmJiBpc1ZhbGlkYXRpb25QZXJtaXR0ZWQoYmVhblZhbGlkYXRpb24pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTWV0YURhdGEoQmVhblZhbGlkYXRpb24gYmVhblZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAocHJvY2Vzc01vZGVsVmFsaWRhdGlvbiAmJiBpc01vZGVsVmFsaWRhdGlvbihiZWFuVmFsaWRhdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoDQotICAgICAgICAgICAgICAgICAgICBiZWFuVmFsaWRhdGlvbiwgbWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoIWlzTW9kZWxWYWxpZGF0aW9uKGJlYW5WYWxpZGF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzR3JvdXBzKA0KLSAgICAgICAgICAgICAgICAgICAgYmVhblZhbGlkYXRpb24sIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLCByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZGF0aW9uUGVybWl0dGVkKEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBFTEhlbHBlciBlbEhlbHBlciA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjb25kaXRpb24gOiBiZWFuVmFsaWRhdGlvbi5jb25kaXRpb25zKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVsSGVscGVyLmlzRUxUZXJtV2VsbEZvcm1lZChjb25kaXRpb24pICYmDQotICAgICAgICAgICAgICAgICAgICBlbEhlbHBlci5pc0VMVGVybVZhbGlkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgY29uZGl0aW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGVsSGVscGVyLmdldFZhbHVlT2ZFeHByZXNzaW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oY29uZGl0aW9uKSkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAodGhpcy5sb2dnZXIuaXNFcnJvckVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoImFuIGludmFsaWQgY29uZGl0aW9uIGlzIHVzZWQ6ICIgKyBjb25kaXRpb24pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc01vZGVsVmFsaWRhdGlvbihCZWFuVmFsaWRhdGlvbiBiZWFuVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGJlYW5WYWxpZGF0aW9uLm1vZGVsVmFsaWRhdGlvbigpLmlzQWN0aXZlKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkgPSBuZXcgTW9kZWxWYWxpZGF0aW9uRW50cnkoKTsNCi0NCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LnNldEdyb3VwcyhBcnJheXMuYXNMaXN0KGJlYW5WYWxpZGF0aW9uLnVzZUdyb3VwcygpKSk7DQotICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5zZXREaXNwbGF5TWVzc2FnZUlubGluZShiZWFuVmFsaWRhdGlvbi5tb2RlbFZhbGlkYXRpb24oKS5kaXNwbGF5SW5saW5lKCkpOw0KLSAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuc2V0Q3VzdG9tTWVzc2FnZShiZWFuVmFsaWRhdGlvbi5tb2RlbFZhbGlkYXRpb24oKS5tZXNzYWdlKCkpOw0KLSAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuc2V0TWV0YURhdGFTb3VyY2VPYmplY3QobWV0YURhdGFTb3VyY2VPYmplY3QpOw0KLQ0KLSAgICAgICAgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQ7DQotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0RXhwcmVzc2lvbiA6IGJlYW5WYWxpZGF0aW9uLm1vZGVsVmFsaWRhdGlvbigpLnZhbGlkYXRpb25UYXJnZXRzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKE1vZGVsVmFsaWRhdGlvbi5ERUZBVUxULmVxdWFscyh2YWxpZGF0aW9uVGFyZ2V0RXhwcmVzc2lvbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCA9IHRyeVRvUmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFeHByZXNzaW9uKHZhbGlkYXRpb25UYXJnZXRFeHByZXNzaW9uKTsNCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblRhcmdldCAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuYWRkVmFsaWRhdGlvblRhcmdldCh2YWxpZGF0aW9uVGFyZ2V0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoYmVhblZhbGlkYXRpb24ucmVzdHJpY3RHcm91cHMoKS5sZW5ndGggPiAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24uYWRkQWxsKEFycmF5cy5hc0xpc3QoYmVhblZhbGlkYXRpb24ucmVzdHJpY3RHcm91cHMoKSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldFZhbGlkYXRpb25UYXJnZXRzKCkuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmFkZFZhbGlkYXRpb25UYXJnZXQobWV0YURhdGFTb3VyY2VPYmplY3QpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LmFkZChtb2RlbFZhbGlkYXRpb25FbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgdHJ5VG9SZXNvbHZlVmFsaWRhdGlvblRhcmdldEV4cHJlc3Npb24oU3RyaW5nIHZhbGlkYXRpb25UYXJnZXRFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWxpZGF0aW9uVGFyZ2V0RXhwcmVzc2lvbik7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0dyb3VwcyhCZWFuVmFsaWRhdGlvbiBiZWFuVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLmFkZEFsbChBcnJheXMuYXNMaXN0KGJlYW5WYWxpZGF0aW9uLnVzZUdyb3VwcygpKSk7DQotDQotICAgICAgICBpZiAoYmVhblZhbGlkYXRpb24ucmVzdHJpY3RHcm91cHMoKS5sZW5ndGggPiAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24uYWRkQWxsKEFycmF5cy5hc0xpc3QoYmVhblZhbGlkYXRpb24ucmVzdHJpY3RHcm91cHMoKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIFN0cmluZyBjcmVhdGVMYWJlbGVkTWVzc2FnZShTdHJpbmcgdmlvbGF0aW9uTWVzc2FnZSwgYm9vbGVhbiBpc0RldGFpbE1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmxhYmVsZWRNZXNzYWdlSW50ZXJuYWxzLmNyZWF0ZUxhYmVsZWRNZXNzYWdlKHZpb2xhdGlvbk1lc3NhZ2UsIGlzRGV0YWlsTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IGNhbGNTZXZlcml0eShDb25zdHJhaW50VmlvbGF0aW9uPD8+IHZpb2xhdGlvbikNCi0gICAgew0KLSAgICAgICAgZm9yIChDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD4gcGF5bG9hZCA6IHZpb2xhdGlvbi5nZXRDb25zdHJhaW50RGVzY3JpcHRvcigpLmdldFBheWxvYWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MpLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKFZpb2xhdGlvblNldmVyaXR5LkluZm8uY2xhc3MpLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0lORk87DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKFZpb2xhdGlvblNldmVyaXR5LkZhdGFsLmNsYXNzKS5pc0Fzc2lnbmFibGVGcm9tKHBheWxvYWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9GQVRBTDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SOw0KLSAgICB9DQotDQotICAgIHZvaWQgcHJvY2Vzc0ZhY2VzTWVzc2FnZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0LCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyID0gbmV3IEZhY2VzTWVzc2FnZUhvbGRlcihmYWNlc01lc3NhZ2UpOw0KLQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlSG9sZGVyLnNldENsaWVudElkKHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCkpOw0KLQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlSG9sZGVyTGlzdC5hZGQoZmFjZXNNZXNzYWdlSG9sZGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBib29sZWFuIGV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgbnVsbCwNCi0gICAgICAgICAgICAgICAgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgIG51bGwpOw0KLSAgICB9DQotDQotICAgIGJvb2xlYW4gaXNNZXNzYWdlVGV4dFVuY2hhbmdlZCgNCi0gICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLCBTdHJpbmcgdmlvbGF0aW9uU3VtbWFyeU1lc3NhZ2UsIFN0cmluZyB2aW9sYXRpb25EZXRhaWxNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmlvbGF0aW9uU3VtbWFyeU1lc3NhZ2UuZXF1YWxzKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTdW1tYXJ5KCkpICYmDQotICAgICAgICAgICAgICAgIHZpb2xhdGlvbkRldGFpbE1lc3NhZ2UuZXF1YWxzKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKS5nZXREZXRhaWwoKSk7DQotICAgIH0NCi0NCi0gICAgVmFsaWRhdG9yRXhjZXB0aW9uIGNyZWF0ZVZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICBTdHJpbmcgdmlvbGF0aW9uU3VtbWFyeU1lc3NhZ2UsIFN0cmluZyB2aW9sYXRpb25EZXRhaWxNZXNzYWdlLCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc2V2ZXJpdHksIHZpb2xhdGlvblN1bW1hcnlNZXNzYWdlLCB2aW9sYXRpb25EZXRhaWxNZXNzYWdlKSk7DQotICAgIH0NCi0NCi0gICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZUxpc3RXaXRoTG93U2V2ZXJpdHkoDQotICAgICAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IHZpb2xhdGlvbk1lc3NhZ2VzKQ0KLSAgICB7DQotICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+KCk7DQotDQotICAgICAgICBmb3IgKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIgOiB2aW9sYXRpb25NZXNzYWdlcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk4uZXF1YWxzKGZhY2VzTWVzc2FnZUhvbGRlci5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0lORk8uZXF1YWxzKGZhY2VzTWVzc2FnZUhvbGRlci5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZmFjZXNNZXNzYWdlSG9sZGVyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBnZXRGYWNlc01lc3NhZ2VMaXN0V2l0aEhpZ2hTZXZlcml0eSgNCi0gICAgICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gdmlvbGF0aW9uTWVzc2FnZUhvbGRlckxpc3QpDQotICAgIHsNCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgICAgIGZvciAoRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlciA6IHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IuZXF1YWxzKGZhY2VzTWVzc2FnZUhvbGRlci5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMLmVxdWFscyhmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGZhY2VzTWVzc2FnZUhvbGRlcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIGFkZE1lc3NhZ2VzKExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0V2l0aExvd1NldmVyaXR5KQ0KLSAgICB7DQotICAgICAgICBmb3IgKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIgOiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0V2l0aExvd1NldmVyaXR5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudElkKA0KLSAgICAgICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlSG9sZGVyLmdldENsaWVudElkKCksIGZhY2VzTWVzc2FnZUhvbGRlci5nZXRGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC91dGlsL0xhYmVsZWRNZXNzYWdlSW50ZXJuYWxzLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvTGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwYjc4My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvTGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgTGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMNCi17DQotICAgIC8vdGhlcmUgaXMgbm8gY29uY3VycmVuY3kgaXNzdWUgaGVyZSAtIGl0IGFsd2F5cyBsZWFkcyB0byB0aGUgc2FtZSByZXN1bHQNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVmYXVsdFN1bW1hcnlNZXNzYWdlVGVtcGxhdGUgPSAiezF9OiB7MH0iOw0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZWZhdWx0RGV0YWlsTWVzc2FnZVRlbXBsYXRlID0gInsxfTogezB9IjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3VtbWFyeU1lc3NhZ2VUZW1wbGF0ZSA9IGRlZmF1bHRTdW1tYXJ5TWVzc2FnZVRlbXBsYXRlOw0KLSAgICBwcml2YXRlIFN0cmluZyBkZXRhaWxNZXNzYWdlVGVtcGxhdGUgPSBkZWZhdWx0RGV0YWlsTWVzc2FnZVRlbXBsYXRlOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfVkFMSURBVE9SX0JFQU5WQUxJREFUT1JfTUVTU0FHRSA9DQotICAgICAgICAgICAgImphdmF4LmZhY2VzLnZhbGlkYXRvci5CZWFuVmFsaWRhdG9yLk1FU1NBR0UiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfVkFMSURBVE9SX0JFQU5WQUxJREFUT1JfTUVTU0FHRV9ERVRBSUwgPQ0KLSAgICAgICAgICAgICJqYXZheC5mYWNlcy52YWxpZGF0b3IuQmVhblZhbGlkYXRvci5NRVNTQUdFX2RldGFpbCI7DQotDQotICAgIFN0cmluZyBjcmVhdGVMYWJlbGVkTWVzc2FnZShTdHJpbmcgdmlvbGF0aW9uTWVzc2FnZSwgYm9vbGVhbiBpc0RldGFpbE1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIGlmKGlzRGV0YWlsTWVzc2FnZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ5VG9SZXNvbHZlRGV0YWlsTWVzc2FnZSh2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ5VG9SZXNvbHZlU3VtbWFyeU1lc3NhZ2UodmlvbGF0aW9uTWVzc2FnZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHJ5VG9SZXNvbHZlU3VtbWFyeU1lc3NhZ2UoU3RyaW5nIHZpb2xhdGlvbk1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIGlmKHN1bW1hcnlNZXNzYWdlVGVtcGxhdGUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0U3VtbWFyeU1lc3NhZ2VUZW1wbGF0ZS5yZXBsYWNlKCJ7MH0iLCB2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRoaXMuc3VtbWFyeU1lc3NhZ2VUZW1wbGF0ZSA9IGxvYWRTdGFuZGFyZE1lc3NhZ2VUZW1wbGF0ZShmYWxzZSk7DQotDQotICAgICAgICBpZihzdW1tYXJ5TWVzc2FnZVRlbXBsYXRlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxhYmVsZWRNZXNzYWdlKHZpb2xhdGlvbk1lc3NhZ2UsIGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzdW1tYXJ5TWVzc2FnZVRlbXBsYXRlLnJlcGxhY2UoInswfSIsIHZpb2xhdGlvbk1lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvUmVzb2x2ZURldGFpbE1lc3NhZ2UoU3RyaW5nIHZpb2xhdGlvbk1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIGlmKGRldGFpbE1lc3NhZ2VUZW1wbGF0ZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHREZXRhaWxNZXNzYWdlVGVtcGxhdGUucmVwbGFjZSgiezB9IiwgdmlvbGF0aW9uTWVzc2FnZSk7DQotICAgICAgICB9DQotDQotICAgICAgICB0aGlzLmRldGFpbE1lc3NhZ2VUZW1wbGF0ZSA9IGxvYWRTdGFuZGFyZE1lc3NhZ2VUZW1wbGF0ZSh0cnVlKTsNCi0NCi0gICAgICAgIGlmKGRldGFpbE1lc3NhZ2VUZW1wbGF0ZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVMYWJlbGVkTWVzc2FnZSh2aW9sYXRpb25NZXNzYWdlLCB0cnVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBkZXRhaWxNZXNzYWdlVGVtcGxhdGUucmVwbGFjZSgiezB9IiwgdmlvbGF0aW9uTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgbG9hZFN0YW5kYXJkTWVzc2FnZVRlbXBsYXRlKGJvb2xlYW4gaXNEZXRhaWxNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihpc0RldGFpbE1lc3NhZ2UpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gSnNmVXRpbHMuZ2V0TWVzc2FnZUZyb21BcHBsaWNhdGlvbk1lc3NhZ2VCdW5kbGUoDQotICAgICAgICAgICAgICAgICAgICAgICAgSkFWQVhfRkFDRVNfVkFMSURBVE9SX0JFQU5WQUxJREFUT1JfTUVTU0FHRV9ERVRBSUwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gSnNmVXRpbHMuZ2V0TWVzc2FnZUZyb21BcHBsaWNhdGlvbk1lc3NhZ2VCdW5kbGUoDQotICAgICAgICAgICAgICAgICAgICAgICAgSkFWQVhfRkFDRVNfVkFMSURBVE9SX0JFQU5WQUxJREFUT1JfTUVTU0FHRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGMyODk1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5CZWFuVmFsaWRhdGlvbk1vZHVsZUtleTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLk1vZGVsVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5Nb2RlbFZhbGlkYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbC5CZWFuVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkZhY2VzTWVzc2FnZUhvbGRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF0aDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAicmVmYWN0b3IgaW1wbGVtZW50YXRpb24gZGV0YWlscyIpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lciBpbXBsZW1lbnRzIFBoYXNlTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zNDgyMjMzODkzMTg2NzA4ODc4TDsNCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IHBoYXNlRXZlbnQpDQotICAgIHsNCi0gICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImpzcjMwMyBzdGFydCBtb2RlbCB2YWxpZGF0aW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBNYXA8T2JqZWN0LCBMaXN0PENsYXNzPj4gcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIExpc3Q8Q2xhc3M+PigpOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+KCk7DQotDQotICAgICAgICBmb3IgKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5IDogZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllc1RvVmFsaWRhdGUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cywgcmVzdWx0cyk7DQotICAgICAgICB9DQotDQotICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uUmVzdWx0cyhyZXN1bHRzKTsNCi0NCi0gICAgICAgIGV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IocmVzdWx0cyk7DQotDQotICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJqc3IzMDMgdmFsaWRhdGlvbiBmaW5pc2hlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllc1RvVmFsaWRhdGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldE1vZGVsVmFsaWRhdGlvbkVudHJpZXNUb1ZhbGlkYXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24oTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxPYmplY3QsIExpc3Q8Q2xhc3M+PiBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uOw0KLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248T2JqZWN0Pj4gdmlvbGF0aW9uczsNCi0gICAgICAgIENsYXNzW10gZ3JvdXBzVG9WYWxpZGF0ZTsNCi0NCi0gICAgICAgIGZvciAoT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQgOiBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRWYWxpZGF0aW9uVGFyZ2V0cygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24gPSBjcmVhdGVQcm9wZXJ0eUluZm9ybWF0aW9uKG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0NCi0gICAgICAgICAgICBpZiAoIWV4ZWN1dGVHbG9iYWxCZWZvcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKSwgdmFsaWRhdGlvblRhcmdldCwgcHJvcGVydHlJbmZvcm1hdGlvbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYobW9kZWxWYWxpZGF0aW9uRW50cnkuaXNEaXNwbGF5TWVzc2FnZUlubGluZSgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZ3JvdXBzVG9WYWxpZGF0ZSA9IG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldEdyb3VwcygpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvL2lmIHZpb2xhdGlvbiBzaG91bGQgZGlzcGxheWVkIGlubGluZSB2YWxpZGF0aW9uIGhhcyB0byB0YWtlIHBsYWNlIHdpdGggYWxsIGdyb3Vwcw0KLSAgICAgICAgICAgIC8vd2hpY2ggbWVhbnM6IGdsb2JhbCBtZXNzYWdlcyAtPiBmaWx0ZXIgZ3JvdXBzIGFscmVhZHkgdXNlZCBmb3IgdGhlIHZhbGlkYXRpb24gdGFyZ2V0DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZ3JvdXBzVG9WYWxpZGF0ZSA9IGZpbHRlckdyb3Vwc1RvVmFsaWRhdGUoDQotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnksIHZhbGlkYXRpb25UYXJnZXQsIHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYoIXNob3VsZENvbnRpbnVlVmFsaWRhdGlvbihtb2RlbFZhbGlkYXRpb25FbnRyeSwgZ3JvdXBzVG9WYWxpZGF0ZSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgYWRkUHJvY2Vzc2VkVGFyZ2V0KHZhbGlkYXRpb25UYXJnZXQsIGdyb3Vwc1RvVmFsaWRhdGUsIHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzKTsNCi0gICAgICAgICAgICB2aW9sYXRpb25zID0gdmFsaWRhdGVUYXJnZXQodmFsaWRhdGlvblRhcmdldCwgZ3JvdXBzVG9WYWxpZGF0ZSk7DQotDQotICAgICAgICAgICAgaWYgKHZpb2xhdGlvbnMgIT0gbnVsbCAmJiAhdmlvbGF0aW9ucy5pc0VtcHR5KCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzVmlvbGF0aW9ucyhmYWNlc0NvbnRleHQsIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0LCB2aW9sYXRpb25zLCByZXN1bHRzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBDbGFzc1tdIGZpbHRlckdyb3Vwc1RvVmFsaWRhdGUoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8T2JqZWN0LCBMaXN0PENsYXNzPj4gcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMpDQotICAgIHsNCi0gICAgICAgIGlmKCFwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cy5jb250YWluc0tleSh2YWxpZGF0aW9uVGFyZ2V0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0R3JvdXBzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PENsYXNzPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLSAgICAgICAgTGlzdDxDbGFzcz4gdmFsaWRhdGVkR3JvdXBzID0gcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMuZ2V0KHZhbGlkYXRpb25UYXJnZXQpOw0KLQ0KLSAgICAgICAgZm9yKENsYXNzIGdyb3VwIDogbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0R3JvdXBzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoIXZhbGlkYXRlZEdyb3Vwcy5jb250YWlucyhncm91cCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGdyb3VwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IENsYXNzW3Jlc3VsdC5zaXplKCldKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkQ29udGludWVWYWxpZGF0aW9uKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBDbGFzc1tdIGdyb3Vwc1RvVmFsaWRhdGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAhKGdyb3Vwc1RvVmFsaWRhdGUgPT0gbnVsbCB8fCBncm91cHNUb1ZhbGlkYXRlLmxlbmd0aCA9PSAwKSB8fA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5pc0Rpc3BsYXlNZXNzYWdlSW5saW5lKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFByb2Nlc3NlZFRhcmdldChPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1tdIGdyb3VwcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8T2JqZWN0LCBMaXN0PENsYXNzPj4gcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMpDQotICAgIHsNCi0gICAgICAgIGlmKCFwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cy5jb250YWluc0tleSh2YWxpZGF0aW9uVGFyZ2V0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cy5wdXQodmFsaWRhdGlvblRhcmdldCwgbmV3IEFycmF5TGlzdDxDbGFzcz4oKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PENsYXNzPiB2YWxpZGF0ZWRHcm91cHMgPSBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cy5nZXQodmFsaWRhdGlvblRhcmdldCk7DQotDQotICAgICAgICBmb3IoQ2xhc3MgZ3JvdXAgOiBncm91cHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoIXZhbGlkYXRlZEdyb3Vwcy5jb250YWlucyhncm91cCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0ZWRHcm91cHMuYWRkKGdyb3VwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eUluZm9ybWF0aW9uIGNyZWF0ZVByb3BlcnR5SW5mb3JtYXRpb24oDQotICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb247DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzOw0KLSAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOw0KLSAgICAgICAgaWYgKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMgPSBuZXcgUHJvcGVydHlEZXRhaWxzKG51bGwsIHZhbGlkYXRpb25UYXJnZXQsIG51bGwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5zZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBwcm9wZXJ0eURldGFpbHMpOw0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5SW5mb3JtYXRpb247DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGV4ZWN1dGVHbG9iYWxCZWZvcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUdsb2JhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIHByb3BlcnR5SW5mb3JtYXRpb24sIEJlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMuZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uLmNsYXNzLmdldE5hbWUoKSwgcHJvcGVydHlJbmZvcm1hdGlvbiwgQmVhblZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248T2JqZWN0Pj4gdmFsaWRhdGVUYXJnZXQoT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsIENsYXNzW10gZ3JvdXBzKQ0KLSAgICB7DQotICAgICAgICBpZihncm91cHMgPT0gbnVsbCB8fCBncm91cHMubGVuZ3RoID09IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBWYWxpZGF0b3JGYWN0b3J5IHZhbGlkYXRvckZhY3RvcnkgPSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0VmFsaWRhdG9yRmFjdG9yeSgpOw0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRvckZhY3RvcnkNCi0gICAgICAgICAgICAgICAgLnVzaW5nQ29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5tZXNzYWdlSW50ZXJwb2xhdG9yKEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkpDQotICAgICAgICAgICAgICAgIC5jb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSh2YWxpZGF0b3JGYWN0b3J5LmdldENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KCkpDQotICAgICAgICAgICAgICAgIC50cmF2ZXJzYWJsZVJlc29sdmVyKHZhbGlkYXRvckZhY3RvcnkuZ2V0VHJhdmVyc2FibGVSZXNvbHZlcigpKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdG9yKCkNCi0gICAgICAgICAgICAgICAgLnZhbGlkYXRlKHZhbGlkYXRpb25UYXJnZXQsIGdyb3Vwcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NWaW9sYXRpb25zKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248T2JqZWN0Pj4gdmlvbGF0aW9ucywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cykNCi0gICAgew0KLSAgICAgICAgLy9qc2YgMi4wIGlzIGFibGUgdG8gZGlzcGxheSBtdWx0aXBsZSBtZXNzYWdlcyBwZXIgY29tcG9uZW50IC0gc28gcHJvY2VzcyBhbGwgdmlvbGF0aW9ucw0KLSAgICAgICAgLy9qc2YgPCAyLjAgd2lsbCBqdXN0IHVzZSB0aGUgZmlyc3Qgb25lIChmb3IgaW5saW5lIG1lc3NhZ2VzIC0gc28gaXQncyBvbmx5IGEgbGl0dGxlIG92ZXJoZWFkKQ0KLSAgICAgICAgSXRlcmF0b3I8Q29uc3RyYWludFZpb2xhdGlvbjxPYmplY3Q+PiB2aW9sYXRpb25zSXRlcmF0b3IgPSB2aW9sYXRpb25zLml0ZXJhdG9yKCk7DQotICAgICAgICBDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4gY29uc3RyYWludFZpb2xhdGlvbjsNCi0gICAgICAgIE1vZGVsVmFsaWRhdGlvblJlc3VsdCByZXN1bHQ7DQotICAgICAgICB3aGlsZSAodmlvbGF0aW9uc0l0ZXJhdG9yLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb0NyZWF0ZU1vZGVsVmFsaWRhdGlvblJlc3VsdChmYWNlc0NvbnRleHQsIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCByZXN1bHRzKTsNCi0NCi0gICAgICAgICAgICByZXN1bHQgPSByZXNvbHZlTW9kZWxWYWxpZGF0aW9uUmVzdWx0KGZhY2VzQ29udGV4dCwgbW9kZWxWYWxpZGF0aW9uRW50cnksIHJlc3VsdHMpOw0KLQ0KLSAgICAgICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb24gPSB2aW9sYXRpb25zSXRlcmF0b3IubmV4dCgpOw0KLSAgICAgICAgICAgIGFkZFZpb2xhdGlvbk1lc3NhZ2UobW9kZWxWYWxpZGF0aW9uRW50cnksIHZhbGlkYXRpb25UYXJnZXQsIGNvbnN0cmFpbnRWaW9sYXRpb24sIHJlc3VsdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvQ3JlYXRlTW9kZWxWYWxpZGF0aW9uUmVzdWx0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cykNCi0gICAgew0KLSAgICAgICAgTW9kZWxWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdDsNCi0gICAgICAgIGlmICghaXNNb2RlbFZhbGlkYXRpb25SZXN1bHRBdmFpbGFibGVGb3IoZmFjZXNDb250ZXh0LCBtb2RlbFZhbGlkYXRpb25FbnRyeSwgcmVzdWx0cykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IE1vZGVsVmFsaWRhdGlvblJlc3VsdCgpOw0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpLmdldENsaWVudElkKGZhY2VzQ29udGV4dCksIHJlc3VsdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNb2RlbFZhbGlkYXRpb25SZXN1bHQgcmVzb2x2ZU1vZGVsVmFsaWRhdGlvblJlc3VsdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHMuZ2V0KG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpLmdldENsaWVudElkKGZhY2VzQ29udGV4dCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc01vZGVsVmFsaWRhdGlvblJlc3VsdEF2YWlsYWJsZUZvcihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByZXN1bHRzLmNvbnRhaW5zS2V5KG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpLmdldENsaWVudElkKGZhY2VzQ29udGV4dCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRWaW9sYXRpb25NZXNzYWdlKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RyYWludFZpb2xhdGlvbjxPYmplY3Q+IGNvbnN0cmFpbnRWaW9sYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvblJlc3VsdCByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIGlmIChtb2RlbFZhbGlkYXRpb25FbnRyeS5pc0Rpc3BsYXlNZXNzYWdlSW5saW5lKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmFkZEZhY2VzTWVzc2FnZUhvbGRlcihjcmVhdGVGYWNlc01lc3NhZ2VIb2xkZXJGb3JDb25zdHJhaW50VmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludFZpb2xhdGlvbiwgbW9kZWxWYWxpZGF0aW9uRW50cnksIHZhbGlkYXRpb25UYXJnZXQsIHRydWUpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQuYWRkRmFjZXNNZXNzYWdlSG9sZGVyKGNyZWF0ZUZhY2VzTWVzc2FnZUhvbGRlckZvckNvbnN0cmFpbnRWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50VmlvbGF0aW9uLCBtb2RlbFZhbGlkYXRpb25FbnRyeSwgdmFsaWRhdGlvblRhcmdldCwgZmFsc2UpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEZhY2VzTWVzc2FnZUhvbGRlciBjcmVhdGVGYWNlc01lc3NhZ2VIb2xkZXJGb3JDb25zdHJhaW50VmlvbGF0aW9uKGZpbmFsIENvbnN0cmFpbnRWaW9sYXRpb24gdmlvbGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGlzcGxheUF0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBmaW5hbCBTdHJpbmcgbmV3VmlvbGF0aW9uTWVzc2FnZSA9IHRyeVRvQ2hhbmdlVmlvbGF0aW9uTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnksIHZhbGlkYXRpb25UYXJnZXQsIHZpb2xhdGlvbik7DQotDQotICAgICAgICBDb25zdHJhaW50VmlvbGF0aW9uIG5ld0NvbnN0cmFpbnRWaW9sYXRpb24gPSBuZXcgQ29uc3RyYWludFZpb2xhdGlvbigpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJpdmF0ZSBDb25zdHJhaW50VmlvbGF0aW9uIHdyYXBwZWQgPSB2aW9sYXRpb247DQotDQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBuZXdWaW9sYXRpb25NZXNzYWdlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VUZW1wbGF0ZSgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRNZXNzYWdlVGVtcGxhdGUoKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRSb290QmVhbigpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSb290QmVhbigpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgQ2xhc3MgZ2V0Um9vdEJlYW5DbGFzcygpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSb290QmVhbkNsYXNzKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0TGVhZkJlYW4oKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0TGVhZkJlYW4oKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIFBhdGggZ2V0UHJvcGVydHlQYXRoKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldFByb3BlcnR5UGF0aCgpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEludmFsaWRWYWx1ZSgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRJbnZhbGlkVmFsdWUoKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIENvbnN0cmFpbnREZXNjcmlwdG9yIGdldENvbnN0cmFpbnREZXNjcmlwdG9yKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldENvbnN0cmFpbnREZXNjcmlwdG9yKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0NCi0NCi0gICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50ID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjbGllbnRJZCA9IG51bGw7DQotDQotICAgICAgICBpZiAoZGlzcGxheUF0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHVpQ29tcG9uZW50ID0gbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCk7DQotICAgICAgICAgICAgY2xpZW50SWQgPSB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlSG9sZGVyIHJlc3VsdCA9IG5ldyBGYWNlc01lc3NhZ2VIb2xkZXIoQmVhblZhbGlkYXRpb25VdGlscw0KLSAgICAgICAgICAgICAgICAuY3JlYXRlRmFjZXNNZXNzYWdlRm9yQ29uc3RyYWludFZpb2xhdGlvbih1aUNvbXBvbmVudCwgdmFsaWRhdGlvblRhcmdldCwgbmV3Q29uc3RyYWludFZpb2xhdGlvbikpOw0KLSAgICAgICAgcmVzdWx0LnNldENsaWVudElkKGNsaWVudElkKTsNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHJ5VG9DaGFuZ2VWaW9sYXRpb25NZXNzYWdlKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJhaW50VmlvbGF0aW9uIHZpb2xhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc0RlZmF1bHRNZXNzYWdlKG1vZGVsVmFsaWRhdGlvbkVudHJ5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGVWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q3VzdG9tTWVzc2FnZSgpLCB2YWxpZGF0aW9uVGFyZ2V0LCB2aW9sYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHZpb2xhdGlvbi5nZXRNZXNzYWdlKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdE1lc3NhZ2UoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBNb2RlbFZhbGlkYXRpb24uREVGQVVMVC5lcXVhbHMobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q3VzdG9tTWVzc2FnZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBpbnRlcnBvbGF0ZVZhbGlkYXRpb25FcnJvck1lc3NhZ2UoU3RyaW5nIGV4dFZhbElubGluZU1lc3NhZ2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwgZmluYWwgQ29uc3RyYWludFZpb2xhdGlvbiB2aW9sYXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpDQotICAgICAgICAgICAgICAgIC5pbnRlcnBvbGF0ZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRWYWxJbmxpbmVNZXNzYWdlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZXNzYWdlSW50ZXJwb2xhdG9yLkNvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IGdldENvbnN0cmFpbnREZXNjcmlwdG9yKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZpb2xhdGlvbi5nZXRDb25zdHJhaW50RGVzY3JpcHRvcigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsaWRhdGVkVmFsdWUoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblRhcmdldDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9EbyhQcmlvcml0eS5NRURJVU0pDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uUmVzdWx0cyhNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMpDQotICAgIHsNCi0gICAgICAgIGZvciAoTW9kZWxWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA6IHJlc3VsdHMudmFsdWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQmVhblZhbGlkYXRpb25VdGlscy5wcm9jZXNzVmlvbGF0aW9uTWVzc2FnZXMocmVzdWx0LmdldEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IoTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgVUlDb21wb25lbnQgY29tcG9uZW50Ow0KLSAgICAgICAgZm9yIChNb2RlbFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0IDogcmVzdWx0cy52YWx1ZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IgKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIgOiByZXN1bHQuZ2V0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29tcG9uZW50ID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgaWYgKGZhY2VzTWVzc2FnZUhvbGRlci5nZXRDbGllbnRJZCgpICE9IG51bGwgJiYgIWZhY2VzTWVzc2FnZUhvbGRlci5nZXRDbGllbnRJZCgpLmVxdWFscygiKiIpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5maW5kQ29tcG9uZW50KGZhY2VzTWVzc2FnZUhvbGRlci5nZXRDbGllbnRJZCgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBleGVjdXRlR2xvYmFsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKGZhY2VzQ29udGV4dCwgY29tcG9uZW50LCBudWxsLCBudWxsKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBwaGFzZUV2ZW50KQ0KLSAgICB7DQotICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuVVBEQVRFX01PREVMX1ZBTFVFUzsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmICh0aGlzID09IG8pDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vTW9kZWxWYWxpZGF0aW9uUmVzdWx0LmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vTW9kZWxWYWxpZGF0aW9uUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYzE5OGIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvblJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuRmFjZXNNZXNzYWdlSG9sZGVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkxPVywgZGVzY3JpcHRpb24gPSAicmVmYWN0b3IiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgTW9kZWxWYWxpZGF0aW9uUmVzdWx0DQotew0KLSAgICBwcml2YXRlIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEZhY2VzTWVzc2FnZUhvbGRlcihGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZhY2VzTWVzc2FnZUhvbGRlckxpc3QuYWRkKGZhY2VzTWVzc2FnZUhvbGRlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBnZXRGYWNlc01lc3NhZ2VIb2xkZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZUhvbGRlckxpc3Q7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0RlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vbWVzc2FnZS9pbnRlcnBvbGF0b3IvRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk5MzJmMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vbWVzc2FnZS9pbnRlcnBvbGF0b3IvRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24ubWVzc2FnZS5pbnRlcnBvbGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yIGltcGxlbWVudHMgTWVzc2FnZUludGVycG9sYXRvcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgDQotICAgIHByaXZhdGUgTWVzc2FnZUludGVycG9sYXRvciB3cmFwcGVkOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IoTWVzc2FnZUludGVycG9sYXRvciB3cmFwcGVkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgaW50ZXJwb2xhdGUoU3RyaW5nIG1lc3NhZ2VPcktleSwgQ29udGV4dCBjb250ZXh0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZU9yS2V5LCBjb250ZXh0LCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGludGVycG9sYXRlKFN0cmluZyBtZXNzYWdlT3JLZXksIENvbnRleHQgY29udGV4dCwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZC5pbnRlcnBvbGF0ZShtZXNzYWdlT3JLZXksIGNvbnRleHQsIGdldEN1cnJlbnRMb2NhbGUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExvY2FsZSBnZXRDdXJyZW50TG9jYWxlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9tZXNzYWdlL2ludGVycG9sYXRvci9FeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0V4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZTlmMzMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0V4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLm1lc3NhZ2UuaW50ZXJwb2xhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5NZXNzYWdlSW50ZXJwb2xhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEV4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyIGV4dGVuZHMgRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3INCi17DQotICAgIHByaXZhdGUgTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcjsNCi0NCi0gICAgcHVibGljIEV4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyKE1lc3NhZ2VJbnRlcnBvbGF0b3Igd3JhcHBlZCwgTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcikNCi0gICAgew0KLSAgICAgICAgc3VwZXIod3JhcHBlZCk7DQotICAgICAgICB0aGlzLm1lc3NhZ2VSZXNvbHZlciA9IG1lc3NhZ2VSZXNvbHZlcjsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBpbnRlcnBvbGF0ZShTdHJpbmcgbWVzc2FnZU9yS2V5LCBDb250ZXh0IGNvbnRleHQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShtZXNzYWdlT3JLZXksIGNvbnRleHQsIGdldEN1cnJlbnRMb2NhbGUoKSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgaW50ZXJwb2xhdGUoU3RyaW5nIG1lc3NhZ2VPcktleSwgQ29udGV4dCBjb250ZXh0LCBMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLm1lc3NhZ2VSZXNvbHZlciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGlzQmVhblZhbGlkYXRpb25NZXNzYWdlS2V5Rm9ybWF0KG1lc3NhZ2VPcktleSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbmV3TWVzc2FnZU9yS2V5ID0gdGhpcy5tZXNzYWdlUmVzb2x2ZXIuZ2V0TWVzc2FnZShleHRyYWN0S2V5KG1lc3NhZ2VPcktleSksIGdldEN1cnJlbnRMb2NhbGUoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmKGlzVmFsaWRlTWVzc2FnZShuZXdNZXNzYWdlT3JLZXkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlT3JLZXkgPSBuZXdNZXNzYWdlT3JLZXk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoInlvdSB0cmllZCB0byB1c2UgYW4gZXh0dmFsIG1lc3NhZ2UtcmVzb2x2ZXIgZm9yIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqc3IzMDMgdmFsaWRhdGlvbiB3aXRoIGFuIGludmFsaWQga2V5IC0+IHVzaW5nIGEgZGVmYXVsdCBpbnRlcnBvbGF0b3IiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzdXBlci5pbnRlcnBvbGF0ZShtZXNzYWdlT3JLZXksIGNvbnRleHQsIGdldEN1cnJlbnRMb2NhbGUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQmVhblZhbGlkYXRpb25NZXNzYWdlS2V5Rm9ybWF0KFN0cmluZyBtZXNzYWdlT3JLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXNzYWdlT3JLZXkuc3RhcnRzV2l0aCgieyIpICYmIG1lc3NhZ2VPcktleS5lbmRzV2l0aCgifSIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGV4dHJhY3RLZXkoU3RyaW5nIG1lc3NhZ2VPcktleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VPcktleS5zdWJzdHJpbmcoMSwgbWVzc2FnZU9yS2V5Lmxlbmd0aCgpIC0gMSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRlTWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZU9yS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIShuZXdNZXNzYWdlT3JLZXkuc3RhcnRzV2l0aChBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5NSVNTSU5HX1JFU09VUkNFX01BUktFUikgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXdNZXNzYWdlT3JLZXkuZW5kc1dpdGgoQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZGVlZjYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByaXZhdGUgQ29uc3RyYWludERlc2NyaXB0b3IgY29uc3RyYWludERlc2NyaXB0b3I7DQotICAgIHByaXZhdGUgQ2xhc3MgZWxlbWVudENsYXNzOyAvL3Byb3BlcnR5IHR5cGUNCi0NCi0gICAgcHVibGljIEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneShDb25zdHJhaW50RGVzY3JpcHRvciBjb25zdHJhaW50RGVzY3JpcHRvciwgQ2xhc3MgZWxlbWVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbnN0cmFpbnREZXNjcmlwdG9yID0gY29uc3RyYWludERlc2NyaXB0b3I7DQotICAgICAgICB0aGlzLmVsZW1lbnRDbGFzcyA9IGVsZW1lbnRDbGFzczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29uc3RyYWludERlc2NyaXB0b3IgZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29uc3RyYWludERlc2NyaXB0b3I7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENsYXNzIGdldEVsZW1lbnRDbGFzcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBlbGVtZW50Q2xhc3M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmNvbnN0cmFpbnREZXNjcmlwdG9yLmdldEFubm90YXRpb24oKS5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wb20ueG1sIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzU0MmNiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPnZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBWYWxpZGF0aW9uLU1vZHVsZXM8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4yLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjQtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy92YWxpZGF0aW9uLW1vZHVsZXM8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy92YWxpZGF0aW9uLW1vZHVsZXM8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzFfMl8yX3JjL3ZhbGlkYXRpb24tbW9kdWxlczwvdXJsPgotICAgIDwvc2NtPgotCi0gICAgPG1vZHVsZXM+Ci0gICAgICAgIDxtb2R1bGU+cHJvcGVydHktdmFsaWRhdGlvbjwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmJlYW4tdmFsaWRhdGlvbjwvbW9kdWxlPgotICAgIDwvbW9kdWxlcz4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODJlZGY4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBQcm9wZXJ0eS1WYWxpZGF0aW9uLU1vZHVsZTwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjIuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPnZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjIuNC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgucGVyc2lzdGVuY2U8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5wZXJzaXN0ZW5jZS1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgICAgICA8IS0tIFRlc3QgZGVwZW5kZW5jaWVzIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjU8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0LmpzcDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnNoYWxlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2hhbGUtdGVzdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC40PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5teWZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9BYnN0cmFjdCouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL1Rlc3RVdGlscy5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKkJlYW4uamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4gICAgICAgICAgICAKLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNmJlZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjEuMiI+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Mzc4NWQ2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50Ci0gICAgICAgIC5BYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlUmVxdWlyZWRBdHRyaWJ1dGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYoKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKSkgfHwKLSAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQpKSkKLSAgICAgICAgICAgICYmCi0gICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKGlzQ29tcG9uZW50UmVxdWlyZWQodWlDb21wb25lbnQpKSkKLSAgICAgICAgewotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5zZXRSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJgotICAgICAgICAgICAgICAgIUJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Kb2luVmFsaWRhdGlvbk1ldGFEYXRhU3RvcmFnZUZpbHRlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0pvaW5WYWxpZGF0aW9uTWV0YURhdGFTdG9yYWdlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMTIzY2QuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0pvaW5WYWxpZGF0aW9uTWV0YURhdGFTdG9yYWdlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NZXRhRGF0YVN0b3JhZ2VGaWx0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogRVhUVkFMLTU5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKb2luVmFsaWRhdGlvbk1ldGFEYXRhU3RvcmFnZUZpbHRlciBpbXBsZW1lbnRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRJQ19TRVBBUkFUT1IgPSAiOiI7DQotDQotICAgIHB1YmxpYyB2b2lkIGZpbHRlcihQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChwcm9wZXJ0eUluZm9ybWF0aW9uICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgTGlzdDxNZXRhRGF0YUVudHJ5PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE1ldGFEYXRhRW50cnk+KCk7DQotDQotICAgICAgICAgICAgcmVzb2x2ZUpvaW5WYWxpZGF0aW9uTWV0YURhdGEocHJvcGVydHlJbmZvcm1hdGlvbiwgcmVzdWx0KTsNCi0NCi0gICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnJlc2V0TWV0YURhdGFFbnRyaWVzKCk7DQotDQotICAgICAgICAgICAgc2V0RGVmYXVsdFByb3BlcnR5RGV0YWlscyhwcm9wZXJ0eUluZm9ybWF0aW9uLCByZXN1bHQpOw0KLQ0KLSAgICAgICAgICAgIGlmIChjb250YWluc0pvaW5WYWxpZGF0aW9uQ29uc3RyYWludChyZXN1bHQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmlsdGVyKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVzb2x2ZUpvaW5WYWxpZGF0aW9uTWV0YURhdGEoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uLCBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkgOiBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodHJ5VG9UcmFuc2Zvcm1FbnRyeShtZXRhRGF0YUVudHJ5KSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRQcm9wZXJ0eURldGFpbHMoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uLCBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkgOiByZXN1bHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGFFbnRyeS5zZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLA0KLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5nZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTKSk7DQotICAgICAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5hZGRNZXRhRGF0YUVudHJ5KG1ldGFEYXRhRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc0pvaW5WYWxpZGF0aW9uQ29uc3RyYWludChMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogcmVzdWx0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgSm9pblZhbGlkYXRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhRW50cnk+IHRyeVRvVHJhbnNmb3JtRW50cnkoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFbnRyeT4oKTsNCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBKb2luVmFsaWRhdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBKb2luVmFsaWRhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShKb2luVmFsaWRhdGlvbi5jbGFzcyk7DQotDQotICAgICAgICAgICAgcmVwbGFjZU1ldGFEYXRhKGFubm90YXRpb24sIG1ldGFEYXRhRW50cnksIHJlc3VsdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmFkZChtZXRhRGF0YUVudHJ5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VNZXRhRGF0YShKb2luVmFsaWRhdGlvbiBhbm5vdGF0aW9uLCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIExpc3Q8TWV0YURhdGFFbnRyeT4gcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBmb3IgKFN0cmluZyB0YXJnZXQgOiBhbm5vdGF0aW9uLnZhbHVlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9SZXBsYWNlTWV0YURhdGFPZlRhcmdldCh0YXJnZXQsIG1ldGFEYXRhRW50cnksIHJlc3VsdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvUmVwbGFjZU1ldGFEYXRhT2ZUYXJnZXQoU3RyaW5nIHRhcmdldCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGlzU3RhdGljU3ludGF4KHRhcmdldCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNZXRhRGF0YShyZXN1bHQsIGV4dHJhY3RTdGF0aWNNZXRhRGF0YSh0YXJnZXQpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWV0YURhdGEocmVzdWx0LCBleHRyYWN0RHluYW1pY01ldGFEYXRhKG1ldGFEYXRhRW50cnksIHRhcmdldCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgYSBkaWZmZXJlbnQgZmlsdGVyIG1pZ2h0IGludHJvZHVjZSBhIG5ldyBzeW50YXggd2hpY2ggY2F1c2VzIHRoZSBleGNlcHRpb24NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkTWV0YURhdGEoTGlzdDxNZXRhRGF0YUVudHJ5PiByZXN1bHQsIE1ldGFEYXRhRW50cnlbXSBtZXRhRGF0YUVudHJpZXMpDQotICAgIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLmFkZEFsbChyZXN1bHQsIG1ldGFEYXRhRW50cmllcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3RhdGljU3ludGF4KFN0cmluZyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQuY29udGFpbnMoU1RBVElDX1NFUEFSQVRPUik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YUVudHJ5W10gZXh0cmFjdFN0YXRpY01ldGFEYXRhKFN0cmluZyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIGludCBzZXBhcmF0b3JJbmRleCA9IHRhcmdldC5sYXN0SW5kZXhPZihTVEFUSUNfU0VQQVJBVE9SKTsNCi0NCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gbG9hZENsYXNzKHRhcmdldC5zdWJzdHJpbmcoMCwgc2VwYXJhdG9ySW5kZXgpKTsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0YXJnZXQuc3Vic3RyaW5nKHNlcGFyYXRvckluZGV4ICsgMSk7DQotDQotICAgICAgICByZXR1cm4gbmV3IFN0YXRpY1N5bnRheE1ldGFEYXRhRXh0cmFjdG9yKCkuZXh0cmFjdCh0YXJnZXRDbGFzcywgcHJvcGVydHlOYW1lKS5nZXRNZXRhRGF0YUVudHJpZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gQ2xhc3NVdGlscy5sb2FkQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YUVudHJ5W10gZXh0cmFjdER5bmFtaWNNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIFN0cmluZyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscy5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0KTsNCi0NCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLmdldENsYXNzKCkpOw0KLSAgICAgICAgcmV0dXJuIG5ldyBTdGF0aWNTeW50YXhNZXRhRGF0YUV4dHJhY3RvcigpLmV4dHJhY3QoDQotICAgICAgICAgICAgICAgIHRhcmdldENsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSkuZ2V0TWV0YURhdGFFbnRyaWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBjbGFzcyBTdGF0aWNTeW50YXhNZXRhRGF0YUV4dHJhY3RvciBleHRlbmRzIERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgICAgICB7DQotICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKCk7DQotDQotICAgICAgICAgICAgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyh0YXJnZXRDbGFzcywgdGFyZ2V0UHJvcGVydHksIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgICAgIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnModGFyZ2V0Q2xhc3MsIHRhcmdldFByb3BlcnR5LCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopDQotICAgIHsNCi0gICAgICAgIHJldHVybiBvYmogIT0gbnVsbCAmJiBnZXRDbGFzcygpLmVxdWFscyhvYmouZ2V0Q2xhc3MoKSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwY2RlMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0R3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotLyoqDQotICogbmFtZSBtYXBwZXIgZm9yIGdyb3VwIGltcGxlbWVudGF0aW9ucyB2aWEgdmFsaWRhdGlvbiBwYXJhbWV0ZXJzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoVmFsaWRhdGlvblBhcmFtZXRlci5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdEdyb3VwU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI3NDg0My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuVmFsaWRhdGlvbk1vZHVsZUtleTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVmFsaWRhdGlvbk1vZHVsZUtleQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5DQotew0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MDczNDIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VySG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkdyb3VwU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5NZXRhRGF0YVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnJlY29yZGVyLkNyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkRlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLm1hcHBlci5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UubWFwcGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yNDc0MzYxNjEyODU3MjIyMjgzTDsNCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpDQotICAgIHsNCi0gICAgICAgIGluaXRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycygpOw0KLSAgICAgICAgaW5pdFN0YXRpY1N0cmF0ZWd5TWFwcGluZ3MoKTsNCi0gICAgICAgIGluaXREZWZhdWx0Q29tcG9uZW50SW5pdGlhbGl6ZXIoKTsNCi0gICAgICAgIGFkZFNraXBWYWxpZGF0aW9uU3VwcG9ydCgpOw0KLSAgICAgICAgaW5pdFN0b3JhZ2VNYW5hZ2VyQW5kTmFtZU1hcHBlcnMoKTsNCi0gICAgICAgIGluaXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcigpOw0KLSAgICAgICAgaW5pdE1ldGFEYXRhU3RvcmFnZUZpbHRlcnMoKTsNCi0gICAgICAgIGluaXRQaGFzZUxpc3RlbmVycygpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKG5ldyBDcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFN0YXRpY1N0cmF0ZWd5TWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcganBhQmFzZWRWYWxpZGF0aW9uID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfSlBBX0JBU0VEX1ZBTElEQVRJT047DQotICAgICAgICBpZiAoanBhQmFzZWRWYWxpZGF0aW9uID09IG51bGwNCi0gICAgICAgICAgICAgICAgfHwgIWpwYUJhc2VkVmFsaWRhdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnID0gbmV3IFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgICAgIHN0YXRpY0NvbmZpZy5zZXRTb3VyY2VPZk1hcHBpbmcoDQotICAgICAgICAgICAgICAgIEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsiLmpwYV9zdHJhdGVneV9tYXBwaW5ncyIpOw0KLQ0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcsIHN0YXRpY0NvbmZpZyk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXREZWZhdWx0Q29tcG9uZW50SW5pdGlhbGl6ZXIoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFNraXBWYWxpZGF0aW9uU3VwcG9ydCgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmluZm8oImFkZGluZyBzdXBwb3J0IGZvciBAU2tpcFZhbGlkYXRpb24iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmRlbnlSZW5kZXJlckludGVyY2VwdG9yKFZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcyk7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvcigpKTsNCi0NCi0gICAgICAgIFN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAvL2l0J3MganVzdCByZXF1aXJlZCB0byBzZXQgdGhlIHRhcmdldA0KLSAgICAgICAgY29uZmlnLmFkZE1hcHBpbmcoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTiwgU2tpcFZhbGlkYXRpb25TdXBwb3J0LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuU0tJUF9WQUxJREFUSU9OX1NVUFBPUlRfQ09ORklHLCBjb25maWcpOw0KLQ0KLSAgICAgICAgLy9jb25maWcuYWRkTWFwcGluZyhDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCBSZXF1aXJlZFN0cmF0ZWd5LmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTdG9yYWdlTWFuYWdlckFuZE5hbWVNYXBwZXJzKCkNCi0gICAgew0KLSAgICAgICAgU3RvcmFnZU1hbmFnZXJIb2xkZXIgc3RvcmFnZU1hbmFnZXJIb2xkZXIgPQ0KLSAgICAgICAgICAgICAgICAoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlksIFN0b3JhZ2VNYW5hZ2VySG9sZGVyLmNsYXNzKSk7DQotDQotICAgICAgICAvL3Byb2Nlc3NlZC1pbmZvcm1hdGlvbg0KLSAgICAgICAgRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIgcHJvY2Vzc2VkSW5mb1N0b3JhZ2VNYW5hZ2VyID0NCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyKCk7DQotICAgICAgICBwcm9jZXNzZWRJbmZvU3RvcmFnZU1hbmFnZXIucmVnaXN0ZXIobmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBzdG9yYWdlTWFuYWdlckhvbGRlci5zZXRTdG9yYWdlTWFuYWdlcihQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MsIHByb2Nlc3NlZEluZm9TdG9yYWdlTWFuYWdlciwgZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9jcm9zcy12YWxpZGF0aW9uDQotICAgICAgICBEZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgPQ0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyKCk7DQotICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5yZWdpc3RlcihuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBzdG9yYWdlTWFuYWdlckhvbGRlci5zZXRTdG9yYWdlTWFuYWdlcihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlciwgZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ncm91cC12YWxpZGF0aW9uIGxpZ2h0DQotICAgICAgICBTdG9yYWdlTWFuYWdlciBzdG9yYWdlTWFuYWdlciA9IHN0b3JhZ2VNYW5hZ2VySG9sZGVyLmdldFN0b3JhZ2VNYW5hZ2VyKEdyb3VwU3RvcmFnZS5jbGFzcyk7DQotDQotICAgICAgICBpZihzdG9yYWdlTWFuYWdlciBpbnN0YW5jZW9mIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAoKEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxTdHJpbmc+KXN0b3JhZ2VNYW5hZ2VyKQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBQcm9wZXJ0eVZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5zZXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcihuZXcgUHJvcGVydHlWYWxpZGF0aW9uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TWV0YURhdGFTdG9yYWdlRmlsdGVycygpDQotICAgIHsNCi0gICAgICAgICBNZXRhRGF0YVN0b3JhZ2UgbWV0YURhdGFTdG9yYWdlID0gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZSgNCi0gICAgICAgICAgICAgICAgIE1ldGFEYXRhU3RvcmFnZS5jbGFzcywgTWV0YURhdGFTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBtZXRhRGF0YVN0b3JhZ2UucmVnaXN0ZXJGaWx0ZXIobmV3IEpvaW5WYWxpZGF0aW9uTWV0YURhdGFTdG9yYWdlRmlsdGVyKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0UGhhc2VMaXN0ZW5lcnMoKQ0KLSAgICB7DQotICAgICAgICBKc2ZVdGlscy5yZWdpc3RlclBoYXNlTGlzdGVuZXIobmV3IENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWZhMjQ3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci0KLS8qKgotICogdGhlIHNraXAgdmFsaWRhdGlvbiBzdXBwb3J0IHdhcyByZWZhY3RvcmVkIHRvIGFuIGluZGVwZW5kZW50IG1lY2hhbmlzbQotICogc2VlIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJjaGFuZ2UgdGhlIGFkZC1vbnMiICsKLSAgICAgICAgIm9sZCBuYW1lOiBWYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0IikKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0TW9kdWxlS2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3M7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvblNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YTZhZGMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvblNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3BlcnR5VmFsaWRhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIHgueC4zCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0aW9uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IgaW1wbGVtZW50cyBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcgotewotICAgIHB1YmxpYyBib29sZWFuIHNraXBWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpCi0gICAgewotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgaWYoSnNmVXRpbHMuaXNSZW5kZXJSZXNwb25zZVBoYXNlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9ICFpc0NsaWVudFNpZGVWYWxpZGF0aW9uRW5hYmxlZChtZXRhRGF0YUVudHJ5KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0IHx8IFByb3BlcnR5VmFsaWRhdGlvblV0aWxzLmlzVmFsaWRhdGlvblNraXBwZWQoZmFjZXNDb250ZXh0LCB2YWxpZGF0aW9uU3RyYXRlZ3ksIG1ldGFEYXRhRW50cnkpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xpZW50U2lkZVZhbGlkYXRpb25FbmFibGVkKE1ldGFEYXRhRW50cnkgZW50cnkpCi0gICAgewotICAgICAgICBMaXN0PFN0cmluZz4ga2V5c1RvRGlzYWJsZSA9IGVudHJ5LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25NZXRhRGF0YUtleXMuRElTQUJMRV9DTElFTlRfU0lERV9WQUxJREFUSU9OLCBMaXN0LmNsYXNzKTsKLQotICAgICAgICByZXR1cm4ga2V5c1RvRGlzYWJsZSA9PSBudWxsIHx8ICFrZXlzVG9EaXNhYmxlLmNvbnRhaW5zKGVudHJ5LmdldEtleSgpKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc3N2E0ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRvY3VtZW50YXRpb24iKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NRVNTQUdFU19KUEEgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJKUEFfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFUyIpOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfSlBBX0JBU0VEX1ZBTElEQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0pQQV9CQVNFRF9WQUxJREFUSU9OIik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vRG91YmxlUmFuZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vRG91YmxlUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I0ZTAyZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0RvdWJsZVJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgRG91YmxlUmFuZ2UNCi17DQotICAgIGRvdWJsZSBtaW5pbXVtKCkgZGVmYXVsdCBEb3VibGUuTUlOX1ZBTFVFOw0KLQ0KLSAgICBkb3VibGUgbWF4aW11bSgpIGRlZmF1bHQgRG91YmxlLk1BWF9WQUxVRTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vSm9pblZhbGlkYXRpb24uamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vSm9pblZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM5YTg5OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBKb2luVmFsaWRhdGlvbg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTGVuZ3RoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNDM3ZDEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBMZW5ndGgNCi17DQotICAgIGludCBtaW5pbXVtKCkgZGVmYXVsdCAwOw0KLQ0KLSAgICBpbnQgbWF4aW11bSgpIGRlZmF1bHQgSW50ZWdlci5NQVhfVkFMVUU7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Mb25nUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyNTFlZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIExvbmdSYW5nZQ0KLXsNCi0gICAgbG9uZyBtaW5pbXVtKCkgZGVmYXVsdCBMb25nLk1JTl9WQUxVRTsNCi0NCi0gICAgbG9uZyBtYXhpbXVtKCkgZGVmYXVsdCBMb25nLk1BWF9WQUxVRTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUGF0dGVybi5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NzVkODkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUGF0dGVybg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgIm5vX21hdGNoIjsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUmVxdWlyZWQuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUmVxdWlyZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFjZTEyOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUmVxdWlyZWQNCi17DQotICAgIC8qKg0KLSAgICAgKiB0byBjdXN0b21pemUgdGhlIGVycm9yIG1lc3NhZ2Ugb3INCi0gICAgICogdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQganNmIHJlcXVpcmVkIG1lc3NhZ2Ugd2l0aCB0aGUgdXNhZ2Ugb2YgdGhlIG1lc3NhZ2UgcmVzb2x2ZXIgbWVjaGFuaXNtDQotICAgICAqDQotICAgICAqIEByZXR1cm4gYW4gb3B0aW9uYWwgZXJyb3IgbWVzc2FnZSBrZXkNCi0gICAgICovDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJmaWVsZF9yZXF1aXJlZCI7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYzUyOWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgU2tpcFZhbGlkYXRpb24NCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IHt9Ow0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uU3VwcG9ydC5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEwNzYyMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVGFyZ2V0KFRZUEUpCi1AUmV0ZW50aW9uKFJVTlRJTUUpCi1ARG9jdW1lbnRlZAotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgQGludGVyZmFjZSBTa2lwVmFsaWRhdGlvblN1cHBvcnQKLXsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1ZhbGlkYXRvci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzOGFjYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIFZhbGlkYXRvcg0KLXsNCi0gICAgQ2xhc3M8PyBleHRlbmRzIGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I+W10gdmFsdWUoKTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEwZWViYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ARGVwcmVjYXRlZAotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yIGV4dGVuZHMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yCi17Ci0gICAgcHJpdmF0ZSBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBnZXRJbnN0YW5jZSgpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvckZvcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvcigpLCBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkKLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsKLQotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBQcm9wZXJ0eURldGFpbHMpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG9iamVjdC5nZXRDbGFzcygpICsgIiBpcyBub3QgYSAiICsgUHJvcGVydHlEZXRhaWxzLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gKFByb3BlcnR5RGV0YWlscylvYmplY3Q7Ci0KLSAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKSk7Ci0KLSAgICAgICAgLy9UT0RPIHRlc3Qgd2l0aCBjb21wbGV4IGNvbXBvbmVudHMKLSAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5zZXRJbmZvcm1hdGlvbigKLSAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIHByb3BlcnR5RGV0YWlscyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogZmluZCBhbmQgYWRkIGFubm90YXRpb25zCi0gICAgICAgICAqLwotICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTgwMTIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPVRoZSByZXF1aXJlZCBmb3JtYXRlIGlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YWI1NDMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPVx1MDYyN1x1MDY0NFx1MDYzNVx1MDY0YVx1MDYzYVx1MDYyOSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2MjZcdTA2MjkNCi1ub19tYXRjaF9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjM1XHUwNjRhXHUwNjNhXHUwNjI5IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzN1x1MDY0NFx1MDY0OFx1MDYyOFx1MDYyOSBcdTA2NDdcdTA2NDk6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcyBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThkNjQ5MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW5vX21hdGNoPUZvcm1hdCBpbnZcdTAwZTBsaWQKLW5vX21hdGNoX2RldGFpbD1FbCBmb3JtYXQgcmVxdWVyaXQgXHUwMGU5czogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWU3MDFiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1Vbmf8bHRpZ2VzIEZvcm1hdA0KLW5vX21hdGNoX2RldGFpbD1EYXMgZXJmb3JkZXJsaWNoZSBGb3JtYXQgaXN0OiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTgwMTIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUludmFsaWQgZm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPVRoZSByZXF1aXJlZCBmb3JtYXRlIGlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYjEwNzcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXRvIGludlx1MDBlMWxpZG8gCi1ub19tYXRjaF9kZXRhaWw9RWwgZm9ybWF0byByZXF1ZXJpZG8gZXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcyBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwYTIyMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9TGUgZm9ybWF0IGVzdCBpbnZhbGlkZQ0KLW5vX21hdGNoX2RldGFpbD1MZSBmb3JtYXQgZG9pdCAmZWNpcmM7dHJlIGRlIGxhIGZvcm1lOiB7MH0NCi0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxODc0OGMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ub19tYXRjaD1Gb3JtYXRvIG5vbiB2YWxpZG8KLW5vX21hdGNoX2RldGFpbD1JbCBmb3JtYXRvIHJpY2hpZXN0byAmZWdyYXZlOzogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTRiYzc0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1HZVx1MDBlN2Vyc2l6IGJpXHUwMGU3aW0NCi1ub19tYXRjaF9kZXRhaWw9Z2VyZWtlbiBiaVx1MDBlN2ltOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWFlNjRiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi0gICAgICAgIGV4dGVuZHMNCi0gICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZU5hbWUgPSBudWxsOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJhc2VOYW1lID0gc3VwZXIuZ2V0QmFzZU5hbWUoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBiYXNlTmFtZTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9KcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ3NmFkOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIHRoZSBqcGEgc3VwcG9ydCBpcyBhbiBleGNlcHRpb24gaW4gdmlldyBvZiBzb21lIG1lY2hhbmlzbXMgLSBzbyB0aGVyZSdzIG5vIGNvbnZlbnRpb24gZm9yIHRoZSBtZXNzYWdlIGJ1bmRsZS4NCi0gKiBpbnN0ZWFkIG9mIHRoZSBjb252ZW50aW9uIHRoZXJlIGlzIGEgZ2xvYmFsIHByb3BlcnR5IHRvIGhhdmUgYW4gYWx0ZXJuYXRpdmUgdG8gd2ViLnhtbCBjb25maWd1cmF0aW9uDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTID0gIkpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTIjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9CQVNFX05BTUUgPSBXZWJYbWxQYXJhbWV0ZXIuVkFMSURBVElPTl9NRVNTQUdFU19KUEE7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX05BTUUgPSBKcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuY2xhc3MNCi0gICAgICAgICAgICAuZ2V0UGFja2FnZSgpLmdldE5hbWUoKS5yZXBsYWNlKCIubWVzc2FnZS5yZXNvbHZlciIsICIubWVzc2FnZS5idW5kbGUiKSsgIi5qcGFfbWVzc2FnZXMiOw0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYoQ1VTVE9NX0JBU0VfTkFNRSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBDVVNUT01fQkFTRV9OQU1FOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQkFTRV9OQU1FOw0KLSAgICB9DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0Fic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0Fic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1Y2Q0NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9BYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGlmIChpc0Jsb2NraW5nTWV0YURhdGEobWV0YURhdGEpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1NZXRhRGF0YShtZXRhRGF0YSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhKTsNCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNCbG9ja2luZ01ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIHRlc3RNZXNzYWdlID0gbmV3IEZhY2VzTWVzc2FnZSgpOw0KLSAgICAgICAgdGVzdE1lc3NhZ2Uuc2V0U2V2ZXJpdHkoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSA9IHRyeVRvVHJhbnNmb3JtVmlvbGF0aW9uU2V2ZXJpdHkobWV0YURhdGFFbnRyeSk7DQotDQotICAgICAgICBpZihzZXZlcml0eSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRlc3RNZXNzYWdlLnNldFNldmVyaXR5KHNldmVyaXR5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5zZXZlcml0eUJsb2Nrc1N1Ym1pdEZvckNvbXBvbmVudElkKG51bGwsIHRlc3RNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEZhY2VzTWVzc2FnZS5TZXZlcml0eSB0cnlUb1RyYW5zZm9ybVZpb2xhdGlvblNldmVyaXR5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2UuU2V2ZXJpdHk+IHJlc3VsdCA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKQ0KLSAgICAgICAgICAgICAgICAuZXh0cmFjdChtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihWaW9sYXRpb25TZXZlcml0eS5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5LmNsYXNzKTsNCi0NCi0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiAhcmVzdWx0LmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Lml0ZXJhdG9yKCkubmV4dCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Eb3VibGVSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlOWU0ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Eb3VibGVSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkRvdWJsZVJhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uUGFyYW1ldGVyQXdhcmVUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIERvdWJsZVJhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKERvdWJsZVJhbmdlLmNsYXNzKTsNCi0NCi0gICAgICAgIGRvdWJsZSBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW5pbXVtKCk7DQotDQotICAgICAgICBpZihtaW5pbXVtICE9IERvdWJsZS5NSU5fVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTiwgbWluaW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxULCBtaW5pbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGRvdWJsZSBtYXhpbXVtID0gYW5ub3RhdGlvbi5tYXhpbXVtKCk7DQotDQotICAgICAgICBpZihtYXhpbXVtICE9IERvdWJsZS5NQVhfVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCwgbWF4aW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWF9ERUZBVUxULCBtYXhpbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pvaW5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Kb2luTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjM1MzI0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pvaW5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uZXh0cmFjdG9yLkRlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJvcGVydHlWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLUBEZXByZWNhdGVkDQotcHVibGljIGNsYXNzIEpvaW5NZXRhRGF0YVRyYW5zZm9ybWVyIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnQobWV0YURhdGFFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybigidGhpcyBjbGFzcyBpcyByZXBsYWNlZCBieSBhIG1ldGEtZGF0YSBzdG9yYWdlIGZpbHRlci4gIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgImlmIGl0IGdldHMgaW52b2tlZCBhbmQgYW4gZXhjZXB0aW9uIG9jY3VycywgYSBjdXN0b20gc3ludGF4IGlzIHVzZWQuIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgY2xhc3MgbWlnaHQgYmUgdXNlZCBieSBhbiBvbGQgYWRkLW9uLiBwbGVhc2UgY2hlY2sgZm9yIGEgbmV3ZXIgdmVyc2lvbi4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnQoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBleHRyYWN0b3IgPSBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmdldEluc3RhbmNlKCk7DQotDQotICAgICAgICBTdHJpbmdbXSB0YXJnZXRFeHByZXNzaW9ucyA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoSm9pblZhbGlkYXRpb24uY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAgICAgTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdGFyZ2V0RXhwcmVzc2lvbiA6IHRhcmdldEV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogZXh0cmFjdG9yLmV4dHJhY3QoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscykuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSA9PSBudWxsIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZGF0aW9uU2tpcHBlZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3ksIGVudHJ5KSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lciA9IEV4dFZhbFV0aWxzLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoIShlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQW5ub3RhdGlvbiAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXh0cmFjdChlbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXRlcmF0b3IoKS5oYXNOZXh0KCkpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0QWxsKG1ldGFEYXRhVHJhbnNmb3JtZXIuY29udmVydE1ldGFEYXRhKGVudHJ5KSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZTEwMTEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQmFzaWM7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpwYU1ldGFEYXRhVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiaW1wbC4gdGhlIHJlc3QiKQ0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmKGFubm90YXRpb24gaW5zdGFuY2VvZiBDb2x1bW4pDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoKCEoKENvbHVtbikgYW5ub3RhdGlvbikubnVsbGFibGUoKSkgJiYgRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RILCAoKENvbHVtbikgYW5ub3RhdGlvbikubGVuZ3RoKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihhbm5vdGF0aW9uIGluc3RhbmNlb2YgQmFzaWMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoISgoQmFzaWMpIGFubm90YXRpb24pLm9wdGlvbmFsKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIElkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotICAgICAgICAvL1RPRE8gaW1wbC4gdGhlIHJlc3QhISENCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM5MWY5YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9MZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXINCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBMZW5ndGggYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTGVuZ3RoLmNsYXNzKTsNCi0NCi0gICAgICAgIGludCBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW5pbXVtKCk7DQotDQotICAgICAgICBpZihtaW5pbXVtICE9IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEgsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIX0RFRkFVTFQsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW50IG1heGltdW0gPSBhbm5vdGF0aW9uLm1heGltdW0oKTsNCi0gICAgICAgIGlmKG1heGltdW0gIT0gSW50ZWdlci5NQVhfVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIX0RFRkFVTFQsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGEzMzJiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxvbmdSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgTG9uZ1JhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKExvbmdSYW5nZS5jbGFzcyk7DQotDQotICAgICAgICBsb25nIG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gIT0gTG9uZy5NSU5fVkFMVUUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTiwgbWluaW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxULCBtaW5pbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGxvbmcgbWF4aW11bSA9IGFubm90YXRpb24ubWF4aW11bSgpOw0KLQ0KLSAgICAgICAgaWYobWF4aW11bSAhPSBMb25nLk1BWF9WQUxVRSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYLCBtYXhpbXVtKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1BhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMGJlNjUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlBhdHRlcm47DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQYXR0ZXJuTWV0YURhdGFUcmFuc2Zvcm1lciAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgUGF0dGVybiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShQYXR0ZXJuLmNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4sIChhbm5vdGF0aW9uKS52YWx1ZSgpKTsNCi0NCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkgPSAoYW5ub3RhdGlvbikudmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgICAgICBMb2NhbGUgY3VycmVudExvY2FsZSA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpOw0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSA9DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7DQotDQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnID0gRXh0VmFsVXRpbHMuZ2V0TWVzc2FnZVJlc29sdmVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAuZ2V0TWVzc2FnZSh2YWxpZGF0aW9uRXJyb3JNc2dLZXksIGN1cnJlbnRMb2NhbGUpOw0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFLCB2YWxpZGF0aW9uRXJyb3JNc2cpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9SZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJiZWNjOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9SZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uUGFyYW1ldGVyQXdhcmVUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NraXBNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ta2lwTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGM2NGFiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NraXBNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFNraXBNZXRhRGF0YVRyYW5zZm9ybWVyICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXINCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCB0cnVlKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1ZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1ZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQwNWFiMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lciAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgVmFsaWRhdG9yIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFZhbGlkYXRvci5jbGFzcyk7DQotDQotICAgICAgICBDbGFzc1tdIHZhbGlkYXRvcnMgPSBhbm5vdGF0aW9uLnZhbHVlKCk7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBjdXJyZW50Q2xhc3MgOiB2YWxpZGF0b3JzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRDbGFzcy5nZXRTaW1wbGVOYW1lKCkudG9Mb3dlckNhc2UoKS5jb250YWlucyhDb21tb25NZXRhRGF0YUtleXMuRU1BSUwpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsdWUuYWRkKENvbW1vbk1ldGFEYXRhS2V5cy5FTUFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZhbHVlLmFkZChjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00sIHZhbHVlKTsNCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3NTkzMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Eb3VibGVSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkRvdWJsZVJhbmdlVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEb3VibGVSYW5nZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIERvdWJsZVJhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKERvdWJsZVJhbmdlLmNsYXNzKTsNCi0gICAgICAgIERvdWJsZVJhbmdlVmFsaWRhdG9yIGRvdWJsZVJhbmdlVmFsaWRhdG9yID0gKERvdWJsZVJhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5Eb3VibGVSYW5nZSIpOw0KLQ0KLSAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSm9pblZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSm9pblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGRhMWFjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Kb2luVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5leHRyYWN0b3IuRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWNlc0V4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLUBEZXByZWNhdGVkDQotcHVibGljIGNsYXNzIEpvaW5WYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZUpvaW5WYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRmFjZXNFeGNlcHRpb24gdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyB0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oInRoaXMgY2xhc3MgaXMgcmVwbGFjZWQgYnkgYSBtZXRhLWRhdGEgc3RvcmFnZSBmaWx0ZXIuICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJpZiBpdCBnZXRzIGludm9rZWQgYW5kIGFuIGV4Y2VwdGlvbiBvY2N1cnMsIGEgY3VzdG9tIHN5bnRheCBpcyB1c2VkLiIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIGNsYXNzIG1pZ2h0IGJlIHVzZWQgYnkgYW4gb2xkIGFkZC1vbi4gcGxlYXNlIGNoZWNrIGZvciBhIG5ld2VyIHZlcnNpb24uIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUpvaW5WYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIGV4dHJhY3RvciA9IERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuZ2V0SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIFN0cmluZ1tdIHRhcmdldEV4cHJlc3Npb25zID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShKb2luVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdGFyZ2V0RXhwcmVzc2lvbiA6IHRhcmdldEV4cHJlc3Npb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVQcm9wZXJ0eURldGFpbHNGb3JOZXdUYXJnZXQobWV0YURhdGFFbnRyeSwgdGFyZ2V0RXhwcmVzc2lvbik7DQotDQotICAgICAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogZXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCBwcm9wZXJ0eURldGFpbHMpLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLnByb2Nlc3NNZXRhRGF0YUVudHJ5QWZ0ZXJTa2lwVmFsaWRhdGlvbihQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSwgVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKSwgZW50cnkpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyB2YWxpZGF0aW9uIHN0cmF0ZWd5IGZvdW5kIGZvciAiICsgZW50cnkuZ2V0VmFsdWUoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSnBhVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0MWE5My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLmV4Y2VwdGlvbi5SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQmFzaWM7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZTsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpwYVZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUZhY2VzQnVuZGxlID0gZmFsc2U7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFURV9MRU5HVEggPSAibGVuZ3RoIjsNCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmlvbGF0aW9uOw0KLSAgICBwcml2YXRlIGludCBtYXhMZW5ndGg7DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKTsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgQ29sdW1uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlQ29sdW1uQW5ub3RhdGlvbigoQ29sdW1uKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIEJhc2ljKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlQmFzaWNBbm5vdGF0aW9uKChCYXNpYykgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBJZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgT25lVG9PbmUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVPbmVUb09uZUFubm90YXRpb24oKE9uZVRvT25lKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE1hbnlUb09uZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZU1hbnlUb09uZUFubm90YXRpb24oKE1hbnlUb09uZSkgYW5ub3RhdGlvbiwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVDb2x1bW5Bbm5vdGF0aW9uKENvbHVtbiBjb2x1bW4sIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKCFjb2x1bW4ubnVsbGFibGUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCBpbnN0YW5jZW9mIFN0cmluZw0KLSAgICAgICAgICAgICAgICAmJiBjb2x1bW4ubGVuZ3RoKCkgPCAoKFN0cmluZykgY29udmVydGVkT2JqZWN0KS5sZW5ndGgoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbiA9IFZBTElEQVRFX0xFTkdUSDsNCi0gICAgICAgICAgICB0aGlzLm1heExlbmd0aCA9IGNvbHVtbi5sZW5ndGgoKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWVzc2FnZShudWxsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQmFzaWNBbm5vdGF0aW9uKEJhc2ljIGJhc2ljLCBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmICghYmFzaWMub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlT25lVG9PbmVBbm5vdGF0aW9uKE9uZVRvT25lIG9uZVRvT25lLCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIW9uZVRvT25lLm9wdGlvbmFsKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU1hbnlUb09uZUFubm90YXRpb24oTWFueVRvT25lIG1hbnlUb09uZSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFtYW55VG9PbmUub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXF1aXJlZENvbnZlcnRlZE9iamVjdChPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCB8fCAoIiIuZXF1YWxzKGNvbnZlcnRlZE9iamVjdCkgJiYgRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb24gPSBDb21tb25NZXRhRGF0YUtleXMuUkVRVUlSRUQ7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWVzc2FnZShudWxsKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoVkFMSURBVEVfTEVOR1RILmVxdWFscyh0aGlzLnZpb2xhdGlvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJmaWVsZF90b29fbG9uZyI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJmaWVsZF9yZXF1aXJlZCI7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHN1cGVyLmdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgIGlmIChWQUxJREFURV9MRU5HVEguZXF1YWxzKHRoaXMudmlvbGF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLCAiIiArIHRoaXMubWF4TGVuZ3RoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc3VwZXIucmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0gICAgICAgIFN0cmluZyBtYXJrZXIgPSBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5NSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0NCi0gICAgICAgIGlmKChtYXJrZXIgKyBrZXkgKyBtYXJrZXIpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudXNlRmFjZXNCdW5kbGUgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSA9IGUuZ2V0RmFjZXNNZXNzYWdlKCk7DQotDQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKFZBTElEQVRFX0xFTkdUSC5lcXVhbHModGhpcy52aW9sYXRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0TWF4aW11bU1lc3NhZ2UoZmFjZXNNZXNzYWdlLCB0aGlzLm1heExlbmd0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTGVuZ3RoU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkMDU1OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTGVuZ3RoOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBMZW5ndGhTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBMZW5ndGggYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTGVuZ3RoLmNsYXNzKTsNCi0gICAgICAgIExlbmd0aFZhbGlkYXRvciBsZW5ndGhWYWxpZGF0b3IgPSAoTGVuZ3RoVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5MZW5ndGgiKTsNCi0NCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGxlbmd0aFZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzU4MjAyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Mb25nUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5Mb25nUmFuZ2VWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExvbmdSYW5nZVN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIExvbmdSYW5nZSBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMb25nUmFuZ2UuY2xhc3MpOw0KLSAgICAgICAgTG9uZ1JhbmdlVmFsaWRhdG9yIGxvbmdSYW5nZVZhbGlkYXRvciA9IChMb25nUmFuZ2VWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigiamF2YXguZmFjZXMuTG9uZ1JhbmdlIik7DQotDQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWluaW11bShhbm5vdGF0aW9uLm1pbmltdW0oKSk7DQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bShhbm5vdGF0aW9uLm1heGltdW0oKSk7DQotDQotICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9QYXR0ZXJuU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTNmNGVmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUGF0dGVyblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5PFBhdHRlcm4+DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBQYXR0ZXJuIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFBhdHRlcm4uY2xhc3MpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZXhwcmVzc2lvbiA6IGFubm90YXRpb24udmFsdWUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIWphdmEudXRpbC5yZWdleC5QYXR0ZXJuLmNvbXBpbGUoZXhwcmVzc2lvbikubWF0Y2hlcihjb252ZXJ0ZWRPYmplY3QudG9TdHJpbmcoKSkubWF0Y2hlcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihuZXcgRmFjZXNNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24pLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKS5yZXBsYWNlKCJ7MH0iLCBleHByZXNzaW9uKSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShQYXR0ZXJuIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5ZTRjNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZXF1aXJlZFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5SZXF1aXJlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uZXhjZXB0aW9uLlJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLk51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBOdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBFbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZFN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5PFJlcXVpcmVkPg0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUZhY2VzQnVuZGxlID0gZmFsc2U7DQotDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCB8fCBjb252ZXJ0ZWRPYmplY3QuZXF1YWxzKCIiKSB8fA0KLSAgICAgICAgICAgICAgICAoY29udmVydGVkT2JqZWN0IGluc3RhbmNlb2YgQ29sbGVjdGlvbiAmJiAoKENvbGxlY3Rpb24pY29udmVydGVkT2JqZWN0KS5pc0VtcHR5KCkpIHx8DQotICAgICAgICAgICAgICAgIChjb252ZXJ0ZWRPYmplY3QgaW5zdGFuY2VvZiBNYXAgJiYgKChNYXApY29udmVydGVkT2JqZWN0KS5pc0VtcHR5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgIGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWVzc2FnZShtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFJlcXVpcmVkLmNsYXNzKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KFJlcXVpcmVkIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLnVzZUZhY2VzQnVuZGxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLnJlcGxhY2VXaXRoRGVmYXVsdFJlcXVpcmVkTWVzc2FnZShlLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MjViNzAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvU2tpcFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFNraXBWYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgU3RyaW5nW10gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbnMgPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFNraXBWYWxpZGF0aW9uLmNsYXNzKS52YWx1ZSgpOw0KLQ0KLSAgICAgICAgZm9yKFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uIDogdmFsdWVCaW5kaW5nRXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFZhbHVlT2ZFeHByZXNzaW9uKA0KLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbHVlQmluZGluZ0V4cHJlc3Npb24pKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlNLSVBfVkFMSURBVElPTiwgdHJ1ZSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9WYWxpZGF0b3JTdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIzY2M5MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9WYWxpZGF0b3JTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uVmFsaWRhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotDQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcj5bXSB2YWxpZGF0b3JDbGFzc2VzID0NCi0gICAgICAgICAgICBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFZhbGlkYXRvci5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3IgdmFsaWRhdG9yOw0KLSAgICAgICAgZm9yIChDbGFzcyB2YWxpZGF0b3JDbGFzc05hbWUgOiB2YWxpZGF0b3JDbGFzc2VzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRvciA9IChqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yKSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHZhbGlkYXRvckNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHZhbGlkYXRvciA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSh2YWxpZGF0b3JDbGFzc05hbWUuZ2V0TmFtZSgpICsgIiBub3QgZm91bmQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NmFjNjAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3kuQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY2VzRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBUaGlzIHBoYXNlIGxpc3RlbmVyIHByb2Nlc3NlcyBjcm9zcyB2YWxpZGF0aW9uIGFzIHNvb24gYXMgaXQgZmluZHMgYSBzcGVjaWFsIHJlcXVlc3Qgc2NvcGVkIHN0b3JhZ2UuPGJyLz4NCi0gKiBTbyBpdCdzIHBvc3NpYmxlIHRvIGFkZCBpbmZvcm1hdGlvbiBkdXJpbmcgdGhlIHByb2Nlc3MgdmFsaWRhdGlvbiBwaGFzZS4gQXQgdGhlIGVuZCBvZiB0aGlzIHBoYXNlIGl0IGdldHMgcHJvY2Vzc2VkLg0KLSAqIEFmdGVyIHRoYXQgdGhlIHN0b3JhZ2UgZ2V0cyByZXNldGVkLjxwLz4NCi0gKiBJZiB5b3UgcHJvdmlkZSBhIGN1c3RvbSBleHRlbnNpb24gYW5kIHlvdSBhZGQgdGhlIHNhbWUgc3RvcmFnZSB0eXBlIHdpdGhpbiBhIGRpZmZlcmVudCBwaGFzZSwNCi0gKiBpdCBhbHNvIGdldHMgcHJvY2Vzc2VkIGF0IHRoZSBlbmQgb2YgdGhhdCBwaGFzZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTMzMzQwNTg5NzYzNTc0MjczMkw7DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlID0gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpOw0KLSAgICAgICAgICAgIGZvciAoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5IDogY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5nZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKCFFeHRWYWxVdGlscy5leGVjdXRlR2xvYmFsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRDb21wb25lbnQoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5jbGFzcy5nZXROYW1lKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgLy9jYWxsIGluaXQtbWV0aG9kDQotICAgICAgICAgICAgICAgICAgICBpZihlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKSBpbnN0YW5jZW9mIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkuZ2V0Q2xhc3MoKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbml0Q3Jvc3NWYWxpZGF0aW9uIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICAgICAgICAgKiB2YWxpZGF0aW9uDQotICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLnByb2Nlc3NDcm9zc1ZhbGlkYXRpb24oZW50cnksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFkZE1lc3NhZ2UgPSB0cnVlOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkgaW5zdGFuY2VvZiBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWVzc2FnZSA9IChCb29sZWFuKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLmdldENsYXNzKCkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5jbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRDbGFzcygpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFjZXNFeGNlcHRpb24oZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYoYWRkTWVzc2FnZSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWNlc01lc3NhZ2UgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLmdldFN1bW1hcnkoKSAhPSBudWxsICYmIGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50SWQoZW50cnkuZ2V0Q2xpZW50SWQoKSwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50SWQoZW50cnkuZ2V0Q2xpZW50SWQoKSwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBmaW5hbGx5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0Q29tcG9uZW50KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldENvbnZlcnRlZE9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuY2xhc3MuZ2V0TmFtZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGZpbmFsbHkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5yZXNldENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzSW5pdGlhbGl6ZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NST1NTVkFMSURBVElPTiAhPSBudWxsDQotICAgICAgICAgICAgICAgICAgICAmJiBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgSnNmVXRpbHMuZGVyZWdpc3RlclBoYXNlTGlzdGVuZXIodGhpcyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuQU5ZX1BIQVNFOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmICh0aGlzID09IG8pDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNDAyNzkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0NST1NTVkFMSURBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OIik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJcy5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NGQyYTQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBEYXRlSXMNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlT2YoKTsNCi0NCi0gICAgLyoNCi0gICAgICogb3B0aW9uYWwgc2VjdGlvbg0KLSAgICAgKi8NCi0NCi0gICAgRGF0ZUlzVHlwZSB0eXBlKCkgZGVmYXVsdCBEYXRlSXNUeXBlLnNhbWU7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICIiOw0KLQ0KLSAgICBTdHJpbmcgbm90QmVmb3JlRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJ3cm9uZ19kYXRlX25vdF9iZWZvcmUiOw0KLQ0KLSAgICBTdHJpbmcgbm90QWZ0ZXJFcnJvck1zZ0tleSgpIGRlZmF1bHQgIndyb25nX2RhdGVfbm90X2FmdGVyIjsNCi0NCi0gICAgU3RyaW5nIG5vdEVxdWFsRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJ3cm9uZ19kYXRlX25vdF9lcXVhbCI7DQotDQotICAgIGludCBlcnJvck1lc3NhZ2VEYXRlU3R5bGUoKSBkZWZhdWx0IERhdGVGb3JtYXQuTUVESVVNOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzVHlwZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzVmNDgyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJc1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImJlZm9yZU9yU2FtZSwgYWZ0ZXJPclNhbWUiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBlbnVtIERhdGVJc1R5cGUNCi17DQotICAgIGJlZm9yZSwgYWZ0ZXIsIHNhbWUNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlNzZiNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgRXF1YWxzDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZSgpOw0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkIjsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL05vdEVxdWFscy5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyN2JjNDQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIE5vdEVxdWFscw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQiOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDVkYjI0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUmVxdWlyZWRJZg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWVPZigpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBvcHRpb25hbCBzZWN0aW9uDQotICAgICAqLw0KLQ0KLSAgICBSZXF1aXJlZElmVHlwZSBpcygpIGRlZmF1bHQgUmVxdWlyZWRJZlR5cGUubm90X2VtcHR5Ow0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZW1wdHlfZmllbGQiOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZlR5cGUuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWZUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYzU4ZDkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGVudW0gUmVxdWlyZWRJZlR5cGUNCi17DQotICAgIGVtcHR5LCBub3RfZW1wdHkNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNjA3NTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9SW5wdXQgaXMgZGlmZmVyZW50DQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1JbnB1dCBpcyBkaWZmZXJlbnQNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLQ0KLXdyb25nX2RhdGU9V3JvbmcgZGF0ZQ0KLXdyb25nX2RhdGVfZGV0YWlsPVdyb25nIGRhdGUNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmY5M2M0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPVx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDVcdTA2MmVcdTA2MmFcdTA2NDRcdTA2NDENCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NCBcdTA2NDVcdTA2MmVcdTA2MmFcdTA2NDRcdTA2NDENCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPVx1MDYzYVx1MDY0YVx1MDYzMSBcdTA2NDVcdTA2MzNcdTA2NDVcdTA2NDhcdTA2MmQgXHUwNjI4XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0IFx1MDY0NiBcdTA2NDFcdTA2MzMgXHUwNjQyXHUwNjRhXHUwNjQ1XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPVx1MDYzYVx1MDY0YVx1MDYzMSBcdTA2NDVcdTA2MzNcdTA2NDVcdTA2NDhcdTA2MmQgXHUwNjI4XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0ICBcdTA2NDZcdTA2NDFcdTA2MzMgXHUwNjQyXHUwNjRhXHUwNjQ1XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyZlx1MDYyZVx1MDYyN1x1MDY0NA0KLQ0KLXdyb25nX2RhdGU9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDYyZVx1MDYyN1x1MDYzN1x1MDY0OVx1MDYyMQ0KLXdyb25nX2RhdGVfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2MmVcdTA2MjdcdTA2MzdcdTA2NDlcdTA2MjENCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzXHUwNjQ4IFx1MDY0NiBcdTA2MjhcdTA2MzlcdTA2MmYgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDMgXHUwNjQ4XHUwNjQ2IFx1MDYyOFx1MDYzOVx1MDYyZiB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDNcdTA2NDggXHUwNjQ2IFx1MDY0Mlx1MDYyOFx1MDY0NCB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0YVx1MDYyY1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjRhXHUwNjQzIFx1MDY0OFx1MDY0NiBcdTA2NDJcdTA2MjhcdTA2NDQgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0NFx1MDYyNyBcdTA2NGFcdTA2MzNcdTA2MjdcdTA2NDhcdTA2NDkgezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NDRcdTA2MjcgXHUwNjRhXHUwNjMzXHUwNjI3XHUwNjQ4XHUwNjQ5IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODU0ZWQyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1lbCB2YWxvciBcdTAwZTkgZGlmZXJlbnQKLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9ZWwgdmFsb3IgXHUwMGU5IGRpZmVyZW50Ci0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9bm8gZXMgcGVybWV0IGVsIG1hdGVpeCB2YWxvcgotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9bm8gZXMgcGVybWV0IGVsIG1hdGVpeCB2YWxvcgotCi13cm9uZ19kYXRlPWRhdGEgZXJyXHUwMGYybmlhCi13cm9uZ19kYXRlX2RldGFpbD1kYXRhIGVyclx1MDBmMm5pYQotCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9bGEgZGF0YSBoYSBkZSBzZXIgcG9zdGVyaW9yIGEgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotCi13cm9uZ19kYXRlX25vdF9hZnRlcj1sYSBkYXRhIGhhIGRlIHNlciBhbnRlcmlvciBhIHswfQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPWxhIGRhdGEgaGEgZGUgc2VyIHBvc3RlcmlvciBhIHswfQotCi13cm9uZ19kYXRlX25vdF9lcXVhbD1sYSBkYXRhIG5vIFx1MDAwZTlzIGlndWFsIGEgezB9Ci13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9bGEgZGF0YSBubyBcdTAwMGU5cyBpZ3VhbCBhIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDg3MjM0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUVpbmdhYmUgaXN0IHVudGVyc2NoaWVkbGljaA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9RWluZ2FiZSBpc3QgdW50ZXJzY2hpZWRsaWNoDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1EZXIgZ2xlaWNoZSBXZXJ0IGlzdCBuaWNodCBlcmxhdWJ0DQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9RGVyIGdsZWljaGUgV2VydCBpc3QgbmljaHQgZXJsYXVidA0KLQ0KLXdyb25nX2RhdGU9RGF0dW0gaW5rb3JyZWt0DQotd3JvbmdfZGF0ZV9kZXRhaWw9RGF0dW0gaW5rb3JyZWt0DQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhcyBEYXR1bSBtdXNzIG5hY2ggZGVtIHswfSBzZWluDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1EYXMgRGF0dW0gbXVzcyBuYWNoIGRlbSB7MH0gc2Vpbg0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPURhcyBEYXR1bSBtdXNzIHZvciBkZW0gezB9IHNlaW4NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9RGFzIERhdHVtIG11c3Mgdm9yIGRlbSB7MH0gc2Vpbg0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPURhcyBEYXR1bSBlbnRzcHJpY2h0IG5pY2h0IGRlbSB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGFzIERhdHVtIGVudHNwcmljaHQgbmljaHQgZGVtIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjYwNzU5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPUlucHV0IGlzIGRpZmZlcmVudA0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9SW5wdXQgaXMgZGlmZmVyZW50DQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1TYW1lIGlucHV0IGlzbid0IGFsbG93ZWQNCi0NCi13cm9uZ19kYXRlPVdyb25nIGRhdGUNCi13cm9uZ19kYXRlX2RldGFpbD1Xcm9uZyBkYXRlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9RGF0ZSBpc24ndCBlcXVhbCB0byB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzODUyNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9bGEgZW50cmFkYSBlcyBkaWZlcmVudGUKLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9bGEgZW50cmFkYSBlcyBkaWZlcmVudGUKLQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1ubyBzZSBwZXJtaXRlbiBlbnRyYWRhcyBpZ3VhbGVzCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1ubyBzZSBwZXJtaXRlbiBlbnRyYWRhcyBpZ3VhbGVzCi0KLXdyb25nX2RhdGU9ZmVjaGEgZXF1aXZvY2FkYQotd3JvbmdfZGF0ZV9kZXRhaWw9ZmVjaGEgZXF1aXZvY2FkYQotCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBsdWVnbyBkZSB7MH0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBsdWVnbyBkZSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9bGEgZmVjaGEgdGllbmUgcXVlIHNlciBhbnRlcyBkZSB7MH0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGFudGVzIGRlIHswfQotCi13cm9uZ19kYXRlX25vdF9lcXVhbD1sYSBmZWNoYSBubyBlcyBpZ3VhbCBhIHswfQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPWxhIGZlY2hhIG5vIGVzIGlndWFsIGEgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcyBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZjAyMTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9TGVzIGNoYW1wcyBzb250IGRpZmYmZWFjdXRlO3JlbnRzDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1MZXMgY2hhbXBzIHNvbnQgZGlmZiZlYWN1dGU7cmVudHMNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPUxlcyBjaGFtcHMgZG9pdmVudCAmZWNpcmM7dHJlIGRpZmYmZWFjdXRlO3JlbnRzDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9TGVzIGNoYW1wcyBkb2l2ZW50ICZlY2lyYzt0cmUgZGlmZiZlYWN1dGU7cmVudHMNCi0NCi13cm9uZ19kYXRlPUxhIGRhdGUgZXN0IGluY29ycmVjdGUNCi13cm9uZ19kYXRlX2RldGFpbD1MYSBkYXRlIGVzdCBpbmNvcnJlY3RlDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGFwciZlZ3JhdmU7cyB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGFwciZlZ3JhdmU7cyB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhdmFudCB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXZhbnQgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9TGEgZGF0ZSBuJ2VzdCBwYXMgJmVhY3V0ZTtnYWxlICZhZ3JhdmU7IHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1MYSBkYXRlIG4nZXN0IHBhcyAmZWFjdXRlO2dhbGUgJmFncmF2ZTsgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcyBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNDI4MDEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPVZhbG9yaSBub24gdWd1YWxpCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUkgdmFsb3JpIGluc2VyaXRpIG5vbiBjb2luY2lkb25vCi0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9TG8gc3Rlc3NvIHZhbG9yZSBub24gJmVncmF2ZTsgcGVybWVzc28KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPUxvIHN0ZXNzbyB2YWxvcmUgbm9uICZlZ3JhdmU7IHBlcm1lc3NvCi0KLXdyb25nX2RhdGU9RGF0YSBlcnJhdGEKLXdyb25nX2RhdGVfZGV0YWlsPURhdGEgZXJyYXRhCi0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1MYSBkYXRhIGRldmUgZXNzZXJlIGRvcG8gZGkgezB9Ci13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPUxhIGRhdGEgZGV2ZSBlc3NlcmUgZG9wbyBkaSB7MH0KLQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9TGEgZGF0YSBkZXZlIGVzc2VyZSBwcmltYSBkaSB7MH0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1MYSBkYXRhIGRldmUgZXNzZXJlIHByaW1hIGRpIHswfQotCi13cm9uZ19kYXRlX25vdF9lcXVhbD1MYSBkYXRhIG5vbiAmZWdyYXZlOyB1Z3VhbGUgYSB7MH0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1MYSBkYXRhIG5vbiAmZWdyYXZlOyB1Z3VhbGUgYSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFmNmE5ZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1naXJpbGVuIGRlXHUwMTFmZXIgZmFya2xcdTAxMzENCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPWdpcmlsZW4gZGVcdTAxMWZlciBmYXJrbFx1MDEzMQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9YXluXHUwMTMxIGRlXHUwMTFmZXIgZ2lyaWxlbWV6DQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9YXluXHUwMTMxIGRlXHUwMTFmZXIgZ2lyaWxlbWV6DQotDQotd3JvbmdfZGF0ZT15YW5sXHUwMTMxXHUwMTVmIHRhcmloDQotd3JvbmdfZGF0ZV9kZXRhaWw9eWFubFx1MDEzMVx1MDE1ZiB0YXJpaA0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIHNvbnJhIG9sbWFsXHUwMTMxZFx1MDEzMXINCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gc29ucmEgb2xtYWxcdTAxMzFkXHUwMTMxcg0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gXHUwMGY2bmNlIG9sbWFsXHUwMTMxZFx1MDEzMXINCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBcdTAwZjZuY2Ugb2xtYWxcdTAxMzFkXHUwMTMxcg0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPXRhcmloIHswfSBkZVx1MDExZmVyaW5lIGVcdTAxNWZpdCBkZVx1MDExZmlsDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPXRhcmloIHswfSBkZVx1MDExZmVyaW5lIGVcdTAxNWZpdCBkZVx1MDExZmlsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDc2NTllLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLSAgICAgICAgZXh0ZW5kcw0KLSAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBiYXNlTmFtZSA9IG51bGw7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYgKGJhc2VOYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZU5hbWUgPSBzdXBlci5nZXRCYXNlTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGJhc2VOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWNvcmRlci9Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlY29yZGVyL0Nyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkM2IwOGQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlY29yZGVyL0Nyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwucmVjb3JkZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlciBpbXBsZW1lbnRzIFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXINCi17DQotICAgIHB1YmxpYyB2b2lkIHJlY29yZFVzZXJJbnB1dChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IHZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpZiAoISh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vdG8gc3VwcG9ydCBsb2NhbCBjcm9zcy12YWxpZGF0aW9uICh3aXRoaW4gdGhlIHNhbWUgZW50aXR5KQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSA9IENyb3NzVmFsaWRhdGlvblV0aWxzDQotICAgICAgICAgICAgLmdldE9ySW5pdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgZW50cnk7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0NCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmKHByb3BlcnR5RGV0YWlscyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgZW50cnkgPSBuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkoKTsNCi0gICAgICAgIGVudHJ5LnNldEJlYW4ocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSk7DQotICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh2YWx1ZSk7DQotICAgICAgICBlbnRyeS5zZXRDb21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgZW50cnkuc2V0Q2xpZW50SWQodWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpKSk7DQotDQotICAgICAgICBTdHJpbmcga2V5ID0gcHJvcGVydHlEZXRhaWxzLmdldEtleSgpOw0KLQ0KLSAgICAgICAgLy9mb3IgbG9jYWwgY3Jvc3MtdmFsaWRhdGlvbg0KLSAgICAgICAgaWYgKHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jb250YWluc0VudHJ5KGtleSkgJiYNCi0gICAgICAgICAgICBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkoa2V5KS5nZXRCZWFuKCkgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICFwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkoa2V5KS5nZXRCZWFuKCkuZXF1YWxzKGVudHJ5LmdldEJlYW4oKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9mb3IgdGhlIHZhbGlkYXRpb24gd2l0aGluIGEgY29tcGxleCBjb21wb25lbnQgZS5nLiBhIHRhYmxlDQotICAgICAgICAgICAgLy9kb24ndCBvdmVycmlkZSBleGlzdGluZyBleHByZXNzaW9uIChzdHlsZTogI3tlbnRyeS5wcm9wZXJ0eX0pIC0gbWFrZSBhIHNwZWNpYWwgbWFwcGluZw0KLQ0KLSAgICAgICAgICAgIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk+IGZ1cnRoZXJFbnRyaWVzID0NCi0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmdldEVudHJ5KGtleSkuZ2V0RnVydGhlckVudHJpZXMoKTsNCi0NCi0gICAgICAgICAgICBpZiAoZnVydGhlckVudHJpZXMgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZ1cnRoZXJFbnRyaWVzID0gbmV3IEFycmF5TGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4oKTsNCi0NCi0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmdldEVudHJ5KGtleSkuc2V0RnVydGhlckVudHJpZXMoZnVydGhlckVudHJpZXMpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBmdXJ0aGVyRW50cmllcy5hZGQoZW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZm9yIG5vcm1hbCB2YWxpZGF0aW9uDQotICAgICAgICAgICAgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLnNldEVudHJ5KGtleSwgZW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5ZmFkNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBub3JtYWxseSBpdCBzaG91bGQgYmUgaW4gdGhlIHN0b3JhZ2UgcGFja2FnZSAtIGR1ZSB0byBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGl0IGlzbid0IHRoZSBjYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHZvaWQgYWRkKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSk7DQotDQotICAgIExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcygpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDllMWU3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneS5Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotDQotLyoqDQotICogbm9ybWFsbHkgaXQgc2hvdWxkIGJlIGluIHRoZSBzdG9yYWdlIHBhY2thZ2UgLSBkdWUgdG8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpdCBpc24ndCB0aGUgY2FzZQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkNCi17DQotICAgIHByaXZhdGUgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5Ow0KLSAgICAvL2ZvciBjb21wbGV4IGNvbXBvbmVudHMgKGUuZy4gYSB0YWJsZSkgc3RvcmVzIHRoZSBvYmplY3Qgb2YgZW50cnkgKCN7ZW50cnkucHJvcGVydHl9KQ0KLSAgICBwcml2YXRlIFVJQ29tcG9uZW50IGNvbXBvbmVudDsNCi0gICAgcHJpdmF0ZSBPYmplY3QgY29udmVydGVkT2JqZWN0Ow0KLSAgICBwcml2YXRlIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgLy9qdXN0IGZvciBpbnB1dCBjb21wb25lbnRzIHdpdGhpbiBjb21wbGV4IGNvbXBvbmVudHMgZS5nLiBkYXRhVGFibGUsLi4uDQotICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudElkOw0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeSBnZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhRW50cnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFFbnRyeSA9IG1ldGFEYXRhRW50cnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFVJQ29tcG9uZW50IGdldENvbXBvbmVudCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KFVJQ29tcG9uZW50IGNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRPYmplY3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlZE9iamVjdChPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbnZlcnRlZE9iamVjdCA9IGNvbnZlcnRlZE9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uU3RyYXRlZ3koQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbGlkYXRpb25TdHJhdGVneSA9IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudElkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNsaWVudElkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudElkKFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTEwYTNiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBpbXBsZW1lbnRzIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgTGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzID0NCi0gICAgICAgIG5ldyBBcnJheUxpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGQoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzLmFkZChlbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcyhMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDQxYzk1ZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgY3Jvc3MtdmFsaWRhdGlvbiBlbnRyaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyDQotICAgIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPENyb3NzVmFsaWRhdGlvblN0b3JhZ2U+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgLy9mb3IgYmV0dGVyIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkNCi0gICAgICAgIHJldHVybiBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOGUxODcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSBpbXBsZW1lbnRzIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4gcHJvY2Vzc2VkSW5mb3JtYXRpb25NYXAgPQ0KLSAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW50cnkoU3RyaW5nIGtleSwgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvY2Vzc2VkSW5mb3JtYXRpb25NYXAucHV0KGtleSwgZW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zRW50cnkoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uTWFwLmNvbnRhaW5zS2V5KGtleSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IGdldEVudHJ5KFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm9jZXNzZWRJbmZvcm1hdGlvbk1hcC5nZXQoa2V5KTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxODJjOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgcHJvY2Vzc2VkIGluZm9ybWF0aW9uIGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlcg0KLSAgICBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIC8vZm9yIGJldHRlciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5DQotICAgICAgICByZXR1cm4gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuY2xhc3MuZ2V0TmFtZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYjE1NmUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBzZXRFbnRyeShTdHJpbmcga2V5LCBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSk7DQotDQotICAgIGJvb2xlYW4gY29udGFpbnNFbnRyeShTdHJpbmcga2V5KTsNCi0NCi0gICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgZ2V0RW50cnkoU3RyaW5nIGtleSk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5LmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2Y3ODljLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEluIG9yZGVyIHRvIGJ1aWxkIHVwIGEgbWFwcGluZyB3aGljaCBpcyB1c2VkIGZvciBjcm9zcy12YWxpZGF0aW9uLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkKLXsKLSAgICBwcml2YXRlIE9iamVjdCBiZWFuOwotICAgIHByaXZhdGUgT2JqZWN0IGNvbnZlcnRlZFZhbHVlOwotICAgIHByaXZhdGUgVUlDb21wb25lbnQgY29tcG9uZW50OwotICAgIC8vZm9yIGNvbXBsZXggY29tcG9uZW50cyAoZS5nLiBhIHRhYmxlIHRoZXJlIGFyZSBtdWx0aXBsZSBlbnRyaWVzIHdpdGgKLSAgICAvL3RoZSBzYW1lIGtleSAoaGVyZSB0aGUgZWwgZXhwcmVzc2lvbiAje2VudHJ5LnByb3BlcnR5fSkKLSAgICAvL2hvd2V2ZXIsIGRvbid0IG92ZXJyaWRlIHRoZSBwcmV2aW91cyBlbnRyeSAtIHRoZXkgYXJuJ3QgdGhlIHNhbWU7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5PiBmdXJ0aGVyRW50cmllczsKLSAgICAvL2p1c3QgZm9yIGlucHV0IGNvbXBvbmVudHMgd2l0aGluIGNvbXBsZXggY29tcG9uZW50cyBlLmcuIGRhdGFUYWJsZSwuLi4KLSAgICBwcml2YXRlIFN0cmluZyBjbGllbnRJZDsKLQotICAgIC8qCi0gICAgICogZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRCZWFuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJlYW4oT2JqZWN0IGJlYW4pCi0gICAgewotICAgICAgICB0aGlzLmJlYW4gPSBiZWFuOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlZFZhbHVlKE9iamVjdCBjb252ZXJ0ZWRWYWx1ZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29udmVydGVkVmFsdWUgPSBjb252ZXJ0ZWRWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVUlDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb21wb25lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KFVJQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNsaWVudElkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudElkKFN0cmluZyBjbGllbnRJZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4gZ2V0RnVydGhlckVudHJpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZ1cnRoZXJFbnRyaWVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZ1cnRoZXJFbnRyaWVzKExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk+IGZ1cnRoZXJFbnRyaWVzKQotICAgIHsKLSAgICAgICAgdGhpcy5mdXJ0aGVyRW50cmllcyA9IGZ1cnRoZXJFbnRyaWVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL21hcHBlci9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvbWFwcGVyL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZWJmM2IuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvbWFwcGVyL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkRlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGtleSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvbWFwcGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg3NTMwMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkRlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigyMDApDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGtleSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMDIwMmIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5PEEgZXh0ZW5kcyBBbm5vdGF0aW9uPiBleHRlbmRzIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBzdGF0aWMgTGlzdDxSZWZlcmVuY2luZ1N0cmF0ZWd5PiByZWZlcmVuY2luZ1N0cmF0ZWdpZXM7DQotICAgIHByb3RlY3RlZCBNYXA8T2JqZWN0LCBPYmplY3Q+IHZpb2xhdGlvblJlc3VsdFN0b3JhZ2UgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsNCi0NCi0gICAgcHVibGljIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgaW5pdFJlZmVyZW5jaW5nU3RyYXRlZ2llcygpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRSZWZlcmVuY2luZ1N0cmF0ZWdpZXMoKQ0KLSAgICB7DQotICAgICAgICBpZiAocmVmZXJlbmNpbmdTdHJhdGVnaWVzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzID0gbmV3IEFycmF5TGlzdDxSZWZlcmVuY2luZ1N0cmF0ZWd5PigpOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyBjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5Q2xhc3NOYW1lID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5CQVNFX1BBQ0tBR0UpICsgIlJlZmVyZW5jaW5nU3RyYXRlZ3kiOw0KLQ0KLSAgICAgICAgICAgIFJlZmVyZW5jaW5nU3RyYXRlZ3kgY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneSA9IChSZWZlcmVuY2luZ1N0cmF0ZWd5KSBDbGFzc1V0aWxzDQotICAgICAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoY3VzdG9tUmVmZXJlbmNpbmdTdHJhdGVneSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5KTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmVmZXJlbmNpbmdTdHJhdGVnaWVzLmFkZChuZXcgRUxDb21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICAgICAgLy9yZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBBbGlhc0NvbXBhcmVTdHJhdGVneSgpKTsNCi0gICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBMb2NhbENvbXBhcmVTdHJhdGVneSgpKTsNCi0gICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBMb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3koKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2luaXRDcm9zc1ZhbGlkYXRpb24gaXMgZG9uZSBpbiB0aGUgQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcg0KLQ0KLSAgICAgICAgU3RyaW5nW10gdmFsaWRhdGlvblRhcmdldHMgPSBnZXRWYWxpZGF0aW9uVGFyZ2V0cygoQSkNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvblRhcmdldCA6IHZhbGlkYXRpb25UYXJnZXRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQgPSB2YWxpZGF0aW9uVGFyZ2V0LnRyaW0oKTsNCi0NCi0gICAgICAgICAgICAvL3NlbGVjdCB2YWxpZGF0aW9uIG1ldGhvZA0KLSAgICAgICAgICAgIHRyeVRvVmFsaWRhdGUoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gdHJ5VG9WYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCkNCi0gICAgew0KLSAgICAgICAgZm9yIChSZWZlcmVuY2luZ1N0cmF0ZWd5IHJlZmVyZW5jaW5nU3RyYXRlZ3kgOiByZWZlcmVuY2luZ1N0cmF0ZWdpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHJlZmVyZW5jaW5nU3RyYXRlZ3kuZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwgdmFsaWRhdGlvblRhcmdldCwgdGhpcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJUaHJvd2FibGVJbnN0YW5jZU5ldmVyVGhyb3duIn0pDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlRhcmdldCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFoYW5kbGVUYXJnZXRWaW9sYXRpb24oZW50cnlPZlNvdXJjZSwgZW50cnlPZlRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9ubyB0YXJnZXQgLSBiZWNhdXNlIHRoZXJlIGlzIG5vIHRhcmdldCBjb21wb25lbnQgLSB2YWx1ZSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1vZGVsDQotICAgICAgICAgICAgaWYoZW50cnlPZlRhcmdldCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1RhcmdldENvbXBvbmVudEFzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oZW50cnlPZlNvdXJjZSk7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9nZXQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIHRhcmdldCBjb21wb25lbnQNCi0gICAgICAgIFN0cmluZyBzdW1tYXJ5ID0gZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeSgoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpLCB0cnVlKTsNCi0gICAgICAgIFN0cmluZyBkZXRhaWxzID0gZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCksIHRydWUpOw0KLQ0KLSAgICAgICAgLy92YWxpZGF0aW9uIHRhcmdldCBpc24ndCBib3VuZCB0byBhIGNvbXBvbmVudCB3aXRoaW5nIHRoZSBjdXJyZW50IHBhZ2UgDQotICAgICAgICAvLyhzZWUgdmFsaWRhdGVGb3VuZEVudHJ5LCB0cnlUb1ZhbGlkYXRlTG9jYWxseSBhbmQgdHJ5VG9WYWxpZGF0ZUJpbmRpbmdPbmx5KQ0KLSAgICAgICAgaWYgKGVudHJ5T2ZUYXJnZXQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBlbnRyeU9mVGFyZ2V0ID0gZW50cnlPZlNvdXJjZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlOw0KLSAgICAgICAgaWYgKGVudHJ5T2ZUYXJnZXQuZ2V0TWV0YURhdGFFbnRyeSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWVzc2FnZSA9IGdldFRhcmdldENvbXBvbmVudEVycm9yTWVzc2FnZSgoQSllbnRyeU9mVGFyZ2V0LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpLCBzdW1tYXJ5LCBkZXRhaWxzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8gZG9jdW1lbnQgcG9zc2libGUgc2lkZSBlZmZlY3RzDQotICAgICAgICAgICAgLy9kdWUgdG8gYSBtaXNzaW5nIHRhcmdldCBhbm5vdGF0aW9uIChzZWU6IHRyeVRvVmFsaWRhdGVMb2NhbGx5KQ0KLSAgICAgICAgICAgIG1lc3NhZ2UgPSBnZXRUYXJnZXRDb21wb25lbnRFcnJvck1lc3NhZ2UoKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoKG1lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgfHwgbWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKSAmJg0KLSAgICAgICAgICAgIGVudHJ5T2ZTb3VyY2UuZ2V0Q2xpZW50SWQoKSAhPSBudWxsICYmICFlbnRyeU9mU291cmNlLmdldENsaWVudElkKCkuZXF1YWxzKGVudHJ5T2ZUYXJnZXQuZ2V0Q2xpZW50SWQoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiA9IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24obWVzc2FnZSk7DQotDQotICAgICAgICAgICAgYm9vbGVhbiBpc1NvdXJjZU1ldGFEYXRhVXNlZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgICAgIGlmKGVudHJ5T2ZUYXJnZXQuZ2V0TWV0YURhdGFFbnRyeSgpID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcmVwYXJlVGFyZ2V0TWV0YURhdGFGb3JTZXZlcml0eUF3YXJlSW50ZXJjZXB0aW9uKGVudHJ5T2ZTb3VyY2UsIGVudHJ5T2ZUYXJnZXQpOw0KLSAgICAgICAgICAgICAgICBpc1NvdXJjZU1ldGFEYXRhVXNlZCA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICAgICAgZW50cnlPZlRhcmdldC5nZXRDb21wb25lbnQoKSwgZW50cnlPZlRhcmdldC5nZXRNZXRhRGF0YUVudHJ5KCksDQotICAgICAgICAgICAgICAgICAgICBlbnRyeU9mVGFyZ2V0LmdldENvbnZlcnRlZE9iamVjdCgpLCB2YWxpZGF0b3JFeGNlcHRpb24sIHRoaXMpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50SWQoZW50cnlPZlRhcmdldC5nZXRDbGllbnRJZCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbnZlcnRGYWNlc01lc3NhZ2UodmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKGlzU291cmNlTWV0YURhdGFVc2VkKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzZXRUYXJnZXRNZXRhRGF0YShlbnRyeU9mVGFyZ2V0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVUYXJnZXRNZXRhRGF0YUZvclNldmVyaXR5QXdhcmVJbnRlcmNlcHRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UsIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBlbnRyeU9mVGFyZ2V0LnNldE1ldGFEYXRhRW50cnkoZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZXNldFRhcmdldE1ldGFEYXRhKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBlbnRyeU9mVGFyZ2V0LnNldE1ldGFEYXRhRW50cnkobnVsbCk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJUaHJvd2FibGVJbnN0YW5jZU5ldmVyVGhyb3duIn0pDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzVGFyZ2V0Q29tcG9uZW50QXNTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgLy9nZXQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCkpOw0KLSAgICAgICAgU3RyaW5nIGRldGFpbHMgPSBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsKChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCkpOw0KLQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlIG1lc3NhZ2UgPSBnZXRTb3VyY2VDb21wb25lbnRFcnJvck1lc3NhZ2UoDQotICAgICAgICAgICAgICAgIChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCksIHN1bW1hcnksIGRldGFpbHMpOw0KLQ0KLSAgICAgICAgaWYgKG1lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgfHwgbWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vVE9ETw0KLSAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKGVudHJ5T2ZTb3VyY2UuZ2V0Q29tcG9uZW50KCksDQotICAgICAgICAgICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKSwNCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5T2ZTb3VyY2UuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgICAgICBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG1lc3NhZ2UpLA0KLSAgICAgICAgICAgICAgICAgICAgdGhpcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50KGVudHJ5T2ZTb3VyY2UuZ2V0Q29tcG9uZW50KCksIG1lc3NhZ2UsIG51bGwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL1RPRE8gbG9nZ2luZw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHByb2Nlc3NTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGhhbmRsZVNvdXJjZVZpb2xhdGlvbihlbnRyeU9mU291cmNlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2dldCB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQNCi0gICAgICAgICAgICBTdHJpbmcgc3VtbWFyeSA9IGdldEVycm9yTWVzc2FnZVN1bW1hcnkoKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSwgZmFsc2UpOw0KLSAgICAgICAgICAgIFN0cmluZyBkZXRhaWxzID0gZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCksIGZhbHNlKTsNCi0NCi0gICAgICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZSA9IGdldFNvdXJjZUNvbXBvbmVudEVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgfHwgbWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy9UT0RPDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvVGhyb3dWYWxpZGF0b3JFeGNlcHRpb25Gb3JDb21wb25lbnQoZW50cnlPZlNvdXJjZS5nZXRDb21wb25lbnQoKSwgbWVzc2FnZSwgbnVsbCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9qdXN0IHRocm93IGEgbmV3IG1lc3NhZ2UgLSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBhdCB0aGUgdGFyZ2V0DQotICAgICAgICBFeHRWYWxVdGlscy50cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50KA0KLSAgICAgICAgICAgICAgICBlbnRyeU9mU291cmNlLmdldENvbXBvbmVudCgpLCBuZXcgRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwgbnVsbCwgbnVsbCksIG51bGwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBGYWNlc01lc3NhZ2UgZ2V0U291cmNlQ29tcG9uZW50RXJyb3JNZXNzYWdlKEEgYW5ub3RhdGlvbiwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgRmFjZXNNZXNzYWdlIGdldFRhcmdldENvbXBvbmVudEVycm9yTWVzc2FnZShBIGZvdW5kQW5ub3RhdGlvbiwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoQSBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcmVzb2x2ZU1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQSBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcga2V5ID0gZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgICAgICByZXR1cm4gKGtleSAhPSBudWxsKSA/IHJlc29sdmVNZXNzYWdlKGtleSArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYKSA6IG51bGw7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KChBKWFubm90YXRpb24sIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVUYXJnZXRWaW9sYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZTb3VyY2UsDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZUYXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBlbnRyeU9mVGFyZ2V0ICE9IG51bGwgJiYgZW50cnlPZlRhcmdldC5nZXRDb21wb25lbnQoKSAhPSBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVNvdXJjZVZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGhhbmRsZVRhcmdldFZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIG51bGwpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIG5vIHRhcmdldCBjb21wb25lbnQgKHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbW9kZWwpIC0+IGdldCByZXZlcnNlIG1lc3NhZ2UgZm9yIHNvdXJjZSBjb21wb25lbnQNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkoQSBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICAvL2lmIHRoZSBtZXNzYWdlIGlzIG5ldXRyYWwNCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24sIHRydWUpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIG5vIHRhcmdldCBjb21wb25lbnQgKHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbW9kZWwpIC0+IGdldCByZXZlcnNlIG1lc3NhZ2UgZm9yIHNvdXJjZSBjb21wb25lbnQNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZURldGFpbChBIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIC8vaWYgdGhlIG1lc3NhZ2UgaXMgbmV1dHJhbA0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uLCB0cnVlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBhYnN0cmFjdCBtZXRob2RzDQotICAgICAqLw0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBpbXBsZW1lbnRzIHRoZSBzcGVjaWZpYyB2YWxpZGF0aW9uIGxvZ2ljDQotICAgICAqLw0KLQ0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEEgYW5ub3RhdGlvbik7DQotDQotICAgIC8qDQotICAgICAqIHJldHVybnMgdGhlIHJlZmVyZW5jZWQgdmFsaWRhdGlvbiB0YXJnZXRzIG9mIHRoZSBhbm5vdGF0aW9uDQotICAgICAqIGUuZy4gQERhdGVJcyh0eXBlID0gRGF0ZUlzVHlwZS5iZWZvcmUsIHZhbHVlID0gImZpbmFsRXhhbSIpDQotICAgICAqIC0+IG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IHdpdGggb25lIHZhbHVlICgiZmluYWxFeGFtIikNCi0gICAgICovDQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhBIGFubm90YXRpb24pOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUzNzYxMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzDQotICAgIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICAvL2luaXQgY3Jvc3MtdmFsaWRhdGlvbg0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5ID0NCi0gICAgICAgICAgICBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKS5hZGQoZW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5ID0gbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgpOw0KLQ0KLSAgICAgICAgZW50cnkuc2V0TWV0YURhdGFFbnRyeShtZXRhRGF0YUVudHJ5KTsNCi0gICAgICAgIGVudHJ5LnNldENvbXBvbmVudCh1aUNvbXBvbmVudCk7DQotICAgICAgICBlbnRyeS5zZXRDbGllbnRJZCh1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpKTsNCi0gICAgICAgIGVudHJ5LnNldENvbnZlcnRlZE9iamVjdChjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgZW50cnkuc2V0VmFsaWRhdGlvblN0cmF0ZWd5KHRoaXMpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGVudHJ5Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vdCBhdmFpbGFibGUgZm9yIGNyb3NzIHZhbGlkYXRpb24gLSB1c2UgcHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24iKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRMYWJlbChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgYXZhaWxhYmxlIGZvciBjcm9zcyB2YWxpZGF0aW9uIik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIC8vbm90IGF2YWlsYWJsZSBmb3IgY3Jvc3MgdmFsaWRhdGlvbiAtIHVzZSBpbml0Q3Jvc3NWYWxpZGF0aW9uDQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdENyb3NzVmFsaWRhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICAvL292ZXJyaWRlIGlmIG5lZWRlZA0KLSAgICB9DQotDQotICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbXBvbmVudCgpLCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksIHZhbGlkYXRvckV4Y2VwdGlvbiwgdGhpcyk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvbkhlbHBlci5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2Q0NzZlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneShBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnksDQotICAgICAgICAgICAgYm9vbGVhbiBpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LmlzVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL3Byb2Nlc3MgYWZ0ZXIgdmlvbGF0aW9uDQotICAgICAgICAgICAgLy9qdXN0IGFkZCBtZXNzYWdlcw0KLSAgICAgICAgICAgIGlmKCFpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1RhcmdldEFmdGVyQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzVGFyZ2V0QWZ0ZXJNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy90aG93IGV4Y2VwdGlvbg0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NUYXJnZXRBZnRlckNyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgPSBuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KCk7DQotDQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LnVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbXBvbmVudCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDbGllbnRJZCh2YWxpZGF0aW9uVGFyZ2V0RW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbXBvbmVudChzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDbGllbnRJZChzb3VyY2VDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29udmVydGVkT2JqZWN0KHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpKTsNCi0gICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5KTsNCi0NCi0gICAgICAgIC8vYWRkIG1lc3NhZ2UNCi0gICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgIHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NUYXJnZXRBZnRlck1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIC8vbm8gdGFyZ2V0IC0gYmVjYXVzZSB0aGVyZSBpcyBubyB0YXJnZXQgY29tcG9uZW50IC0gdmFsdWUgd2FzIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBtb2RlbA0KLSAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIG51bGwpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMjdkYTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCk7DQotDQotICAgIHZvaWQgcHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSkNCi0gICAgICAgICAgICB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRGF0ZUlzU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGFmYzhmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5EYXRlSXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJc1R5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsNCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERhdGVJc1N0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3k8RGF0ZUlzPg0KLXsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PX0VBUkxZID0gImVhcmx5IjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PX0xBVEUgPSAibGF0ZSI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9FUVVBTF9EQVRFX1RJTUUgPSAibm90IGVxdWFsIjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0tFWSA9ICJyZXN1bHQiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QQVJFRF9WQUxVRV9LRVkgPSAidGFyZ2V0IHZhbHVlIjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVWRVJTRV9DT01QQVJFRF9WQUxVRV9LRVkgPSAicmV2ZXJzZSB0YXJnZXQgdmFsdWUiOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgLy9UT0RPIHRlc3QgJiByZW1vdmUNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVNvdXJjZVZpb2xhdGlvbihDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwgRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gdmlvbGF0aW9uRm91bmQ7DQotDQotICAgICAgICBpZiAoYW5ub3RhdGlvbi50eXBlKCkuZXF1YWxzKERhdGVJc1R5cGUuc2FtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSBvYmplY3QxICE9IG51bGwgJiYgIW9iamVjdDEuZXF1YWxzKG9iamVjdDIpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVTVUxUX0tFWSwgTk9UX0VRVUFMX0RBVEVfVElNRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbi50eXBlKCkuZXF1YWxzKERhdGVJc1R5cGUuYmVmb3JlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IG9iamVjdDEgIT0gbnVsbCAmJiBvYmplY3QyICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFuZXcgRGF0ZSgoKERhdGUpIG9iamVjdDEpLmdldFRpbWUoKSkuYmVmb3JlKChEYXRlKSBvYmplY3QyKSB8fCBvYmplY3QxLmVxdWFscyhvYmplY3QyKSk7DQotDQotICAgICAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVNVTFRfS0VZLCBUT09fTEFURSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsICYmIG9iamVjdDIgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW5ldyBEYXRlKCgoRGF0ZSkgb2JqZWN0MSkuZ2V0VGltZSgpKS5hZnRlcigoRGF0ZSkgb2JqZWN0MikgfHwgb2JqZWN0MS5lcXVhbHMob2JqZWN0MikpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVTVUxUX0tFWSwgVE9PX0VBUkxZKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChDT01QQVJFRF9WQUxVRV9LRVksIG9iamVjdDEpOw0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5wdXQoUkVWRVJTRV9DT01QQVJFRF9WQUxVRV9LRVksIG9iamVjdDIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZpb2xhdGlvbkZvdW5kOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsdWVPZigpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHByb3RlY3RlZA0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAoU3RyaW5nKSB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UuZ2V0KFJFU1VMVF9LRVkpOw0KLQ0KLSAgICAgICAgaWYgKCFpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSByZXZlcnNlUmVzdWx0KHJlc3VsdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoVE9PX0VBUkxZLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROb3RBZnRlckVycm9yTXNnS2V5KGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoVE9PX0xBVEUuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldE5vdEJlZm9yZUVycm9yTXNnS2V5KGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXROb3RFcXVhbEVycm9yTXNnS2V5KGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHJldmVyc2VSZXN1bHQoU3RyaW5nIHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgaWYgKFRPT19FQVJMWS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gVE9PX0xBVEU7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIFRPT19FQVJMWTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KERhdGVJcyBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KSwgYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChEYXRlSXMgYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKCFpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBrZXkgIiArIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VTdW1tYXJ5KERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBmYWxzZSksIGFubm90YXRpb24sIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsKERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uLCBmYWxzZSkNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGFubm90YXRpb24sIGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbikNCi0gICAgICAgICAgICAgICAgICAgICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKFN0cmluZyBrZXksIERhdGVJcyBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHJlc29sdmVNZXNzYWdlKGtleSk7DQotDQotICAgICAgICBEYXRlRm9ybWF0IGRhdGVGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZShhbm5vdGF0aW9uLmVycm9yTWVzc2FnZURhdGVTdHlsZSgpLA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldExvY2FsZSgpKTsNCi0NCi0gICAgICAgIFN0cmluZyByZXN1bHQ7DQotDQotICAgICAgICBpZihpc1RhcmdldENvbXBvbmVudCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBtZXNzYWdlLnJlcGxhY2UoInswfSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdC5mb3JtYXQoKERhdGUpIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5nZXQoQ09NUEFSRURfVkFMVUVfS0VZKSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IG1lc3NhZ2UucmVwbGFjZSgiezB9IiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0LmZvcm1hdCgoRGF0ZSkgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLmdldChSRVZFUlNFX0NPTVBBUkVEX1ZBTFVFX0tFWSkpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vcmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgb3RoZXIgY29tcG9uZW50DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIHByaXZhdGUNCi0gICAgICovDQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5vdEFmdGVyRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpLmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24ubm90QWZ0ZXJFcnJvck1zZ0tleSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90QmVmb3JlRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpLmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24ubm90QmVmb3JlRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5vdEVxdWFsRXJyb3JNc2dLZXkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpLmVxdWFscygiIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24ubm90RXF1YWxFcnJvck1zZ0tleSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VMQ29tcGFyZVN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRUxDb21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5MTFkNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRUxDb21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogcmVmZXJlbmNpbmcgdmFsaWRhdGlvbiB0YXJnZXRzIC0gcG9zc2libGUgZm9ybWF0czoNCi0gKiAiI3tbYmVhbl9uYW1lXS5bcHJvcGVydHlfbmFtZV19IiAuLi4gY3Jvc3MtZW50aXR5IHZhbGlkYXRpb24gd2l0aCB2YWx1ZSBiaW5kaW5nDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIEVMQ29tcGFyZVN0cmF0ZWd5IGltcGxlbWVudHMgUmVmZXJlbmNpbmdTdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQodmFsaWRhdGlvblRhcmdldCkgJiYNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YWxpZGF0aW9uVGFyZ2V0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb1ZhbGlkYXRlVmFsdWVCaW5kaW5nKA0KLSAgICAgICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsaWRhdGlvblRhcmdldCksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsIGNvbXBhcmVTdHJhdGVneSk7DQotDQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInRlc3QiKQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlVmFsdWVCaW5kaW5nKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9DQotICAgICAgICAgICAgICAgIHJlc29sdmVUYXJnZXRGb3JDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0NCi0gICAgICAgIGlmKHZhbGlkYXRpb25UYXJnZXRFbnRyeSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSByZXNvbHZlVGFyZ2V0Rm9yQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWxpZGF0aW9uVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlID0NCi0gICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlKCk7DQotDQotICAgICAgICByZXR1cm4gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMucmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFbnRyeSgNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5jb252ZXJ0VmFsdWVCaW5kaW5nRXhwcmVzc2lvblRvUHJvY2Vzc2VkSW5mb3JtYXRpb25LZXkodmFsaWRhdGlvblRhcmdldCksDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbGlkYXRpb25UYXJnZXQpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBPYmplY3QgdGFyZ2V0VmFsdWUgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFZhbHVlT2ZFeHByZXNzaW9uKGZhY2VzQ29udGV4dCwgdmFsaWRhdGlvblRhcmdldCk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB0YXJnZXRFbnRyeSA9IG5ldyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSgpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0QmVhbigNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRWYWx1ZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsIHZhbGlkYXRpb25UYXJnZXQuZ2V0QmFzZUV4cHJlc3Npb24oKSkpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0Q29udmVydGVkVmFsdWUodGFyZ2V0VmFsdWUpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRFbnRyeSwgdHJ1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VxdWFsc1N0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlOTc1Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5FcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1ATnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1ARW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXF1YWxzU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRXF1YWxzKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG9iamVjdDEgIT0gbnVsbCAmJiAhb2JqZWN0MS5lcXVhbHMob2JqZWN0Mik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoRXF1YWxzKSBhbm5vdGF0aW9uKS52YWx1ZSgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbENvbXBhcmVTdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NTJmM2MuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotDQotLyoqDQotICogIltwcm9wZXJ0eV9uYW1lXSIgLi4uIGxvY2FsIHZhbGlkYXRpb24gLT4gY3Jvc3MtY29tcG9uZW50LCBidXQgbm8gY3Jvc3MtZW50aXR5IHZhbGlkYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgTG9jYWxDb21wYXJlU3RyYXRlZ3kgaW1wbGVtZW50cyBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LCBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25UYXJnZXQuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneSB3aWxsIGNvbnRpbnVlDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlTG9jYWxseSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0S2V5LA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSA9DQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgYm9vbGVhbiBpc01vZGVsQXdhcmVWYWxpZGF0aW9uID0NCi0gICAgICAgICAgICAgICAgaXNNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHRhcmdldFByb3BlcnR5ID0gdGFyZ2V0S2V5Ow0KLQ0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUtleSA9IHJlc29sdmVTb3VyY2VLZXkoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIHRhcmdldEtleSA9IHNvdXJjZUtleS5zdWJzdHJpbmcoMCwgc291cmNlS2V5Lmxhc3RJbmRleE9mKCIuIikgKyAxKSArIHRhcmdldEtleTsNCi0NCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9IENyb3NzVmFsaWRhdGlvblV0aWxzLnJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgICAgIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSwgdGFyZ2V0S2V5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLQ0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25UYXJnZXRFbnRyeSAhPSBudWxsICYmIHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb21wb25lbnQoKSAhPSBudWxsICYmICFpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICAvL25vIHRhcmdldCAtIGJlY2F1c2UgdGhlcmUgaXMgbm8gdGFyZ2V0IGNvbXBvbmVudCAtIHZhbHVlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbW9kZWwNCi0gICAgICAgIGVsc2UgaWYoaXNNb2RlbEF3YXJlVmFsaWRhdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHVuc3VwcG9ydGVkQ2FzZShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVUYXJnZXRLZXkoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgU3RyaW5nIHRhcmdldEtleSkNCi0gICAgew0KLSAgICAgICAgLy9ubyByZWFsIHZhbHVlIGJpbmRpbmcgZXhwcmVzc2lvbg0KLSAgICAgICAgLy9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGp1c3QgaGVwbHMgdG8gcmVwbGFjZSB0aGUgcHJvcGVydHkgb2YgdGhlIGtleQ0KLSAgICAgICAgLy9oZXJlIG9ubHkgZG90LW5vdGF0aW9uIGlzIGFsbG93ZWQgLT4gbm8gcHJvYmxlbQ0KLSAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiBiYXNlRXhwcmVzc2lvbiA9DQotICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oIiN7IiArIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsDQotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMuY2xhc3MpLmdldEtleSgpICsgIn0iKTsNCi0NCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2VPckFkZFByb3BlcnR5KGJhc2VFeHByZXNzaW9uLCB0YXJnZXRLZXkpDQotICAgICAgICAgICAgLmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgIHJldHVybiByZXN1bHQuc3Vic3RyaW5nKDIsIHJlc3VsdC5sZW5ndGgoKSAtMSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRWYWx1ZU9mUHJvcGVydHkoT2JqZWN0IGJhc2UsIFN0cmluZyBwcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEsIHByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhiYXNlLmdldENsYXNzKCkpOw0KLSAgICAgICAgTWV0aG9kIHRhcmdldE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh0YXJnZXRDbGFzcywgImdldCIgKyBwcm9wZXJ0eSk7DQotDQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0YXJnZXRNZXRob2QgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodGFyZ2V0Q2xhc3MsICJpcyIgKyBwcm9wZXJ0eSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZih0YXJnZXRNZXRob2QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAiY2xhc3MgIiArIGJhc2UuZ2V0Q2xhc3MoKSArICIgaGFzIG5vIHB1YmxpYyBnZXQvaXMgIiArIHByb3BlcnR5LnRvTG93ZXJDYXNlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZChiYXNlLCB0YXJnZXRNZXRob2QpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2Uga2V5Q29udmVydGVkVmFsdWVNYXBwaW5nLA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuZXdLZXkgPSBjcmVhdGVUYXJnZXRLZXkoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgcmV0dXJuICFrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcuY29udGFpbnNFbnRyeShuZXdLZXkpOw0KLQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHJlc29sdmVTb3VyY2VLZXkoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBTdHJpbmcgc291cmNlS2V5ID0gcHJvcGVydHlEZXRhaWxzLmdldEtleSgpOw0KLQ0KLSAgICAgICAgaWYoIXNvdXJjZUtleS5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNvdXJjZSBwYXRoOiAiICsgc291cmNlS2V5ICsgIiBpbnZhbGlkIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc291cmNlS2V5Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB1bnN1cHBvcnRlZENhc2UoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBjb252ZXJ0ZWQgb2JqZWN0IGZvciAiICsgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKS5nZXRLZXkoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHRhcmdldEVudHJ5ID0gbmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5KCk7DQotDQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRCZWFuKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcykuZ2V0QmFzZU9iamVjdCgpKTsNCi0gICAgICAgIHRhcmdldEVudHJ5DQotICAgICAgICAgICAgICAgIC5zZXRDb252ZXJ0ZWRWYWx1ZShnZXRWYWx1ZU9mUHJvcGVydHkodGFyZ2V0RW50cnkuZ2V0QmVhbigpLCB0YXJnZXRQcm9wZXJ0eSkpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uSGVscGVyDQotICAgICAgICAgICAgICAgIC5jcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRFbnRyeSwgdHJ1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWI2NTZjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqICJbbG9jYWxfcHJvcGVydHkucHJvcGVydHkxLnByb3BlcnR5Ml0iDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIExvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneSBleHRlbmRzIExvY2FsQ29tcGFyZVN0cmF0ZWd5DQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBpZighdmFsaWRhdGlvblRhcmdldC5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vbm90IHN1cHBvcnRlZCAtIFRPRE8gYWRkIGxvZ2dpbmcNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ5VG9WYWxpZGF0ZUxvY2FsbHkoDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlTG9jYWxseShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSA9DQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmdldE9ySW5pdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IGNyZWF0ZVRhcmdldEtleShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEtleSk7DQotDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNvbnRhaW5zRW50cnkobmV3S2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkgPSBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkobmV3S2V5KTsNCi0NCi0gICAgICAgICAgICBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9ubyB0YXJnZXQgLSBiZWNhdXNlIHRoZXJlIGlzIG5vIHRhcmdldCBjb21wb25lbnQgLSB2YWx1ZSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1vZGVsDQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEtleSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB0YXJnZXRJbmZvcm1hdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZiAoY29tcGFyZVN0cmF0ZWd5LmlzVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgIHRhcmdldEluZm9ybWF0aW9uRW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSA9IG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoKTsNCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29tcG9uZW50KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENsaWVudElkKHRhcmdldEluZm9ybWF0aW9uRW50cnkuZ2V0Q2xpZW50SWQoKSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENvbnZlcnRlZE9iamVjdCh0YXJnZXRJbmZvcm1hdGlvbkVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCkpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICAvL3Byb2Nlc3MgYWZ0ZXIgdmlvbGF0aW9uDQotICAgICAgICAgICAgLy9qdXN0IGFkZCBtZXNzYWdlcw0KLSAgICAgICAgICAgIGlmKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzVGFyZ2V0Q29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBudWxsKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy90aG93IGV4Y2VwdGlvbg0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneS5wcm9jZXNzU291cmNlQ29tcG9uZW50QWZ0ZXJWaW9sYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFN0cmluZyB0YXJnZXRLZXkpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgLmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBPYmplY3QgbmV3QmFzZSA9IFJlZmxlY3Rpb25VdGlscw0KLSAgICAgICAgICAgIC5nZXRCYXNlT2ZQcm9wZXJ0eUNoYWluKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCksIHRhcmdldEtleSk7DQotDQotICAgICAgICBpZih0YXJnZXRLZXkuY29udGFpbnMoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2ZpbmQgdGhlIGxhc3QgcHJvcGVydHkNCi0gICAgICAgICAgICB0YXJnZXRLZXkgPSB0YXJnZXRLZXkuc3Vic3RyaW5nKHRhcmdldEtleS5sYXN0SW5kZXhPZigiLiIpICsgMSwgdGFyZ2V0S2V5Lmxlbmd0aCgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXRWYWx1ZSA9IGdldFZhbHVlT2ZQcm9wZXJ0eShuZXdCYXNlLCB0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdGFyZ2V0RW50cnkgPSBuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkoKTsNCi0gICAgICAgIHRhcmdldEVudHJ5LnNldEJlYW4obmV3QmFzZSk7DQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh0YXJnZXRWYWx1ZSk7DQotDQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEVudHJ5LCB0cnVlKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Ob3RFcXVhbHNTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTA5ZTg0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Ob3RFcXVhbHNTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuYW5ub3RhdGlvbi5Ob3RFcXVhbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1ATnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1ARW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTm90RXF1YWxzU3RyYXRlZ3kgZXh0ZW5kcyBFcXVhbHNTdHJhdGVneQ0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEFubm90YXRpb24gYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoTm90RXF1YWxzKSBhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLA0KLSAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICFzdXBlci5pc1Zpb2xhdGlvbihvYmplY3QxLCBvYmplY3QyLCBhbm5vdGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEFubm90YXRpb24gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoTm90RXF1YWxzKSBhbm5vdGF0aW9uKS52YWx1ZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVmZXJlbmNpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGM1MDExLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEludGVybmFsIGludGVyZmFjZSB0byBhbGxvdyBtdWx0aXBsZSByZWZlcmVuY2luZyBzdHJhdGVnaWVzIGZvciBjcm9zcyBjb21wb25lbnQgdmFsaWRhdGlvbi4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotaW50ZXJmYWNlIFJlZmVyZW5jaW5nU3RyYXRlZ3kNCi17DQotICAgIGJvb2xlYW4gZXZhbHVhdGVSZWZlcmVuY2VBbmRWYWxpZGF0ZSgNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBhYnN0cmFjdENvbXBhcmVTdHJhdGVneSk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg3NTBiMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVxdWlyZWRJZlN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkSWY7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkSWZUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFJlcXVpcmVkSWZTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5PFJlcXVpcmVkSWY+DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRmFjZXNCdW5kbGUgPSBmYWxzZTsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIHVzZVRhcmdldENvbXBvbmVudFRvRGlzcGxheUVycm9yTXNnKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTWVzc2FnZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc3VwZXIucmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0gICAgICAgIFN0cmluZyBtYXJrZXIgPSBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5NSVNTSU5HX1JFU09VUkNFX01BUktFUjsNCi0NCi0gICAgICAgIGlmKChtYXJrZXIgKyBrZXkgKyBtYXJrZXIpLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudXNlRmFjZXNCdW5kbGUgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShSZXF1aXJlZElmIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBzb3VyY2UsIE9iamVjdCB0YXJnZXQsIFJlcXVpcmVkSWYgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiB2aW9sYXRpb25Gb3VuZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgaWYgKGFubm90YXRpb24uaXMoKS5lcXVhbHMoUmVxdWlyZWRJZlR5cGUuZW1wdHkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gKGlzVGFyZ2V0RW1wdHkodGFyZ2V0KSB8fCBCb29sZWFuLkZBTFNFLmVxdWFscyh0YXJnZXQpKSAmJiBpc1NvdXJjZUVtcHR5KHNvdXJjZSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uLmlzKCkuZXF1YWxzKFJlcXVpcmVkSWZUeXBlLm5vdF9lbXB0eSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSAoaXNUYXJnZXROb3RFbXB0eSh0YXJnZXQpICYmIGlzU291cmNlRW1wdHkoc291cmNlKSAmJiAhKHRhcmdldCBpbnN0YW5jZW9mIEJvb2xlYW4pKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgKEJvb2xlYW4uVFJVRS5lcXVhbHModGFyZ2V0KSAmJiBpc1NvdXJjZUVtcHR5KHNvdXJjZSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZpb2xhdGlvbkZvdW5kOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1RhcmdldEVtcHR5KE9iamVjdCB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQuZXF1YWxzKCIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTb3VyY2VFbXB0eShPYmplY3Qgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc291cmNlID09IG51bGwgfHwgc291cmNlLmVxdWFscygiIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVGFyZ2V0Tm90RW1wdHkoT2JqZWN0IHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldCAhPSBudWxsICYmICF0YXJnZXQuZXF1YWxzKCIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoUmVxdWlyZWRJZiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWx1ZU9mKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlckNyb3NzVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMudXNlRmFjZXNCdW5kbGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcyBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkOTkyOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLkJhc2ljPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLklkPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQ0KLWphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZT1vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneS5KcGFWYWxpZGF0aW9uU3RyYXRlZ3kKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Dcm9zc1ZhbGlkYXRpb25VdGlscy5qYXZhIGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlmODUyYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Dcm9zc1ZhbGlkYXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBDcm9zc1ZhbGlkYXRpb25VdGlscw0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGdldE9ySW5pdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLCBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlc2V0U3RvcmFnZShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLCBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgZ2V0T3JJbml0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoDQotICAgICAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jbGFzcywgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0S2V5VG9Db252ZXJ0ZWRWYWx1ZU1hcHBpbmcoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxVdGlscy5yZXNldFN0b3JhZ2UoUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLCBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHJlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RW50cnkoDQotICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0S2V5LCBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5ID0NCi0gICAgICAgICAgICBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkodGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIC8vdmFsdWUgbm90IHN1Ym1pdHRlZCBhdCB0aGlzIHJlcXVlc3QgLSB1c2UgbW9kZWwgdmFsdWUgKHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbW9kZWwpDQotICAgICAgICBpZihwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICAvL3NpbXBsZSBjYXNlDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5nZXRGdXJ0aGVyRW50cmllcygpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXRCZWFuID0gcHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKTsNCi0NCi0gICAgICAgIC8vcHJvY2VzcyBjb21wbGV4IGNvbXBvbmVudCBlbnRyaWVzIChlLmcuIGEgdGFibGUpDQotICAgICAgICAvL3N1cHBvcnRlZDogY3Jvc3MtY29tcG9uZW50IGJ1dCBubyBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbiAoPSBsb2NhbGUgdmFsaWRhdGlvbikNCi0gICAgICAgIGlmIChwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEJlYW4oKS5lcXVhbHModGFyZ2V0QmVhbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnk7DQotICAgICAgICB9DQotDQotICAgICAgICBmb3IgKFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5IDogcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeS5nZXRGdXJ0aGVyRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChlbnRyeS5nZXRCZWFuKCkuZXF1YWxzKHRhcmdldEJlYW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJzdXBwb3J0IGZvciBtYXAgc3ludGF4IikNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFZhbHVlQmluZGluZ0V4cHJlc3Npb25Ub1Byb2Nlc3NlZEluZm9ybWF0aW9uS2V5KFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmJlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmJlLmdldEV4cHJlc3Npb25TdHJpbmcoKS5yZXBsYWNlKCIjeyIsICIiKS5yZXBsYWNlKCJ9IiwgIiIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Byb3BlcnR5VmFsaWRhdGlvblV0aWxzLmphdmEgYi9wcmVwYXJlX3IzLzFfMl8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Qcm9wZXJ0eVZhbGlkYXRpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjE5MjBjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Byb3BlcnR5VmFsaWRhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LlNraXBWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0dHRVIgPSBMb2dGYWN0b3J5LmdldExvZyhQcm9wZXJ0eVZhbGlkYXRpb25VdGlscy5jbGFzcyk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkYXRpb25Ta2lwcGVkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZihFeHRWYWxVdGlscy5pc1NraXBhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KA0KLSAgICAgICAgICAgICAgICBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBCb29sZWFuIHNraXBWYWxpZGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eSgNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCBCb29sZWFuLmNsYXNzKTsNCi0NCi0gICAgICAgICAgICBpZihCb29sZWFuLlRSVUUuZXF1YWxzKHNraXBWYWxpZGF0aW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKExPR0dFUi5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBMT0dHRVIudHJhY2UoInZhbGlkYXRpb24gb2YgIiArIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY2FuY2VsZWQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIFNraXBWYWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgbnVsbCwgbWV0YURhdGFFbnRyeSwgbnVsbCk7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMV8yXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZjgyNWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8xXzJfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBQcm9wZXJ0eSBWYWxpZGF0aW9uIE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFByb3BlcnR5IFZhbGlkYXRpb24gTW9kdWxlIE92ZXJ2aWV3DQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgUHJvcGVydHkgVmFsaWRhdGlvbiBwcm92aWRlcyBhbm5vdGF0aW9uIGJhc2VkIHZhbGlkYXRpb24gZm9yIGJlYW4gcHJvcGVydGllcy4NCi0gICAgSXQgYWxzbyBwcm92aWRlcyBKUEEgMS4wIGJhc2VkIHZhbGlkYXRpb24gU3VwcG9ydC4NCi0gIA0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS54IGFuZCBKU0YgMi54LiBBbGwgdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvYXNzZW1ibHkvcG9tLnhtbCBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9hc3NlbWJseS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmEwOTU2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9hc3NlbWJseS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1hc3NlbWJseTIwPC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQXNzZW1ibHk8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPk15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQXNzZW1ibHkgaXMgdXNlZCB0byBnZW5lcmF0ZSAKLSAgICAuemlwIGFuZCAudGFyLmd6IGRpc3RyaWJ1dGlvbnMgPC9kZXNjcmlwdGlvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjAuMzwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RhZ3MvMl8wXzM8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8yXzBfMzwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGFncy8yXzBfMzwvdXJsPgotICAgIDwvc2NtPgotICAgIAotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRlcGVuZGVuY3ktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktamF2YWRvYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZW5lcmljLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb3BlcnR5LXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5qYXZhZG9jPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2JlYW4tdmFsaWRhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmphdmFkb2M8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2phdmFkb2M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1zb3VyY2U8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHk8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjb3JlLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLXN1cHBvcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudmFsaWRhdGlvbi1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtiZWFuLXZhbGlkYXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zcmM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBFWEVDVVRFIG12biBwYWNrYWdlIHRvIGdlbmVyYXRlIGFzc2VtYmx5IGZpbGVzIC0tPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X3NyYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5teWZhY2VzLWV4dHZhbDIwLSR7dmVyc2lvbn0tc3JjPC9maW5hbE5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvb3V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+dGFyZ2V0L2Fzc2VtYmx5L3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXR0YWNoZWQ8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlX2Fzc2VtYmx5X2JpbjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPiR7YmFzZWRpcn0vc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsMjAtJHt2ZXJzaW9ufS1iaW48L2ZpbmFsTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS9vdXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d29ya0RpcmVjdG9yeT50YXJnZXQvYXNzZW1ibHkvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2NvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgucGVyc2lzdGVuY2U8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnBlcnNpc3RlbmNlLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7YmVhbi12YWxpZGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgudmFsaWRhdGlvbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1nZW5lcmljLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNnbGliPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZ2xpYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPCEtLSBTaW5jZSBleHR2YWwgY291bGQgYmUgYXN5bmMgcmVsZWFzZWQsIGFuIGdlbmVyYXRlZCBhc3NlbWJseSBjb3VsZCBjb250YWluIGRpZmZlcmVudAotICAgICAgICAgYXJ0aWZhY3QgdmVyc2lvbnMgLS0+Ci0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxjb3JlLnZlcnNpb24+Mi4wLjM8L2NvcmUudmVyc2lvbj4KLSAgICAgICAgPHRyaW5pZGFkLXN1cHBvcnQudmVyc2lvbj4yLjAuMzwvdHJpbmlkYWQtc3VwcG9ydC52ZXJzaW9uPgotICAgICAgICA8Z2VuZXJpYy1zdXBwb3J0LnZlcnNpb24+Mi4wLjM8L2dlbmVyaWMtc3VwcG9ydC52ZXJzaW9uPgotICAgICAgICA8cHJvcGVydHktdmFsaWRhdGlvbi52ZXJzaW9uPjIuMC4zPC9wcm9wZXJ0eS12YWxpZGF0aW9uLnZlcnNpb24+Ci0gICAgICAgIDxiZWFuLXZhbGlkYXRpb24udmVyc2lvbj4yLjAuMzwvYmVhbi12YWxpZGF0aW9uLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbCBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9jb3JlYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY3MTJmMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZWJpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08YXNzZW1ibHk+DQotICA8aWQ+Y29yZWJpbjwvaWQ+DQotICA8Zm9ybWF0cz4NCi0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4NCi0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4NCi0gIDwvZm9ybWF0cz4NCi0gIDxkZXBlbmRlbmN5U2V0cz4NCi0gICAgPGRlcGVuZGVuY3lTZXQ+DQotICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4NCi0gICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+DQotICAgIDwvZGVwZW5kZW5jeVNldD4NCi0gIDwvZGVwZW5kZW5jeVNldHM+DQotICA8ZmlsZVNldHM+DQotICAgIDxmaWxlU2V0Pg0KLSAgICAJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgCTxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+DQotICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgPGluY2x1ZGU+UkVBRE1FKjwvaW5jbHVkZT4NCi0gICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UqPC9pbmNsdWRlPg0KLSAgICAgICAgPGluY2x1ZGU+Tk9USUNFKjwvaW5jbHVkZT4NCi0gICAgICAgIDxpbmNsdWRlPlJFTEVBU0UqPC9pbmNsdWRlPg0KLSAgICAgIDwvaW5jbHVkZXM+DQotICAgIDwvZmlsZVNldD4NCi0gICAgPGZpbGVTZXQ+DQotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvamF2YWRvYzwvZGlyZWN0b3J5Pg0KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+amF2YWRvYzwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPg0KLSAgICAgIDwvaW5jbHVkZXM+DQotICAgIDwvZmlsZVNldD4NCi0gIDwvZmlsZVNldHM+DQotPC9hc3NlbWJseT4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWwgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvYXNzZW1ibHkvc3JjL21haW4vYXNzZW1ibHkvY29yZXNyYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMWVjZTEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2NvcmVzcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPGFzc2VtYmx5Pg0KLSAgPGlkPmNvcmVzcmM8L2lkPg0KLSAgPGZvcm1hdHM+DQotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+DQotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+DQotICA8L2Zvcm1hdHM+ICANCi0gIDxmaWxlU2V0cz4NCi0gICAgPGZpbGVTZXQ+DQotICAgIAk8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5Pg0KLSAgICAJPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4NCi0gICAgICA8aW5jbHVkZXM+DQotICAgICAgICA8aW5jbHVkZT5SRUFETUUqPC9pbmNsdWRlPg0KLSAgICAgICAgPGluY2x1ZGU+TElDRU5TRSo8L2luY2x1ZGU+DQotICAgICAgICA8aW5jbHVkZT5OT1RJQ0UqPC9pbmNsdWRlPg0KLSAgICAgICAgPGluY2x1ZGU+UkVMRUFTRSo8L2luY2x1ZGU+DQotICAgICAgPC9pbmNsdWRlcz4NCi0gICAgPC9maWxlU2V0PiAgIA0KLSAgICA8ZmlsZVNldD4NCi0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9zcmM8L2RpcmVjdG9yeT4NCi0gICAgICA8b3V0cHV0RGlyZWN0b3J5PnNyYzwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPg0KLSAgICAgIDwvaW5jbHVkZXM+DQotICAgIDwvZmlsZVNldD4NCi0gIDwvZmlsZVNldHM+DQotPC9hc3NlbWJseT4NCi0gDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9hc3NlbWJseS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvcG9tLnhtbCBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAzMzAzNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydDwvYXJ0aWZhY3RJZD4KLQotICAgIDxuYW1lPk15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgR2VuZXJpYyBTdXBwb3J0IE1vZHVsZTwvbmFtZT4KLSAgICA8dmVyc2lvbj4yLjAuMzwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMC4zPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y2dsaWI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZ2xpYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMV8zPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyp4bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qcHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0YTI1Mi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCEtLQ0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMl8wLnhzZCINCi0gICAgICAgICAgICAgIHZlcnNpb249IjIuMCI+DQotICAgIDxsaWZlY3ljbGU+DQotICAgICAgICA8cGhhc2UtbGlzdGVuZXI+DQotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmdlbmVyaWMuc3RhcnR1cC5HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyDQotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyS2l0LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJLaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RiZWQ3Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcktpdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyS2l0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi0NCi1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZEludGVyY2VwdG9yOw0KLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuRW5oYW5jZXI7DQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RQcm94eTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxHZW5lcmljUmVuZGVyS2l0IGV4dGVuZHMgRXh0VmFsUmVuZGVyS2l0IGltcGxlbWVudHMgTWV0aG9kSW50ZXJjZXB0b3INCi17DQotICAgIHB1YmxpYyBzdGF0aWMgUmVuZGVyS2l0IG5ld0luc3RhbmNlKFJlbmRlcktpdCByZW5kZXJLaXQpDQotICAgIHsNCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IHJlbmRlcktpdC5nZXRDbGFzcygpOw0KLQ0KLSAgICAgICAgLy9pdCdzIG5vdCBwb3NzaWJsZSB0byB3cmFwIHRoZSBjb252ZXJ0ZXIgYWdhaW4gLSBvY2N1cnMgZS5nLiB1bmRlciBzb2xhcmlzICsgYmVhIHdlYmxvZ2ljDQotICAgICAgICBpZiAoUHJveHlVdGlscy5pc1Byb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZW5kZXJLaXQ7DQotICAgICAgICB9DQotDQotICAgICAgICBFbmhhbmNlciBlbmhhbmNlciA9IG5ldyBFbmhhbmNlcigpOw0KLSAgICAgICAgZW5oYW5jZXIuc2V0U3VwZXJjbGFzcyhyZW5kZXJLaXQuZ2V0Q2xhc3MoKSk7DQotICAgICAgICBlbmhhbmNlci5zZXRDYWxsYmFjayhuZXcgRXh0VmFsR2VuZXJpY1JlbmRlcktpdChyZW5kZXJLaXQpKTsNCi0gICAgICAgIGVuaGFuY2VyLnNldENsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOw0KLQ0KLSAgICAgICAgcmV0dXJuIChSZW5kZXJLaXQpIGVuaGFuY2VyLmNyZWF0ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgaW50ZXJjZXB0KE9iamVjdCBvYmosIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MsIE1ldGhvZFByb3h5IHByb3h5KSB0aHJvd3MgVGhyb3dhYmxlDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJnZXRSZW5kZXJlciIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRSZW5kZXJlcigoU3RyaW5nKWFyZ3NbMF0sIChTdHJpbmcpYXJnc1sxXSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJhZGRSZW5kZXJlciIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZFJlbmRlcmVyKChTdHJpbmcpYXJnc1swXSwgKFN0cmluZylhcmdzWzFdLCAoUmVuZGVyZXIpYXJnc1syXSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHByb3h5Lmludm9rZVN1cGVyKG9iaiwgYXJncyk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRXh0VmFsR2VuZXJpY1JlbmRlcktpdChSZW5kZXJLaXQgd3JhcHBlZCkNCi0gICAgew0KLSAgICAgICAgc3VwZXIod3JhcHBlZCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBSZW5kZXJlciBjcmVhdGVXcmFwcGVyKFJlbmRlcmVyIHJlbmRlcmVyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlci5uZXdJbnN0YW5jZShyZW5kZXJlcik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9FeHRWYWxHZW5lcmljUmVuZGVyZXJXcmFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2NTU3NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvcmVuZGVya2l0L0V4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG5ldC5zZi5jZ2xpYi5wcm94eS5NZXRob2RJbnRlcmNlcHRvcjsKLWltcG9ydCBuZXQuc2YuY2dsaWIucHJveHkuRW5oYW5jZXI7Ci1pbXBvcnQgbmV0LnNmLmNnbGliLnByb3h5Lk1ldGhvZFByb3h5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgZmluYWwgY2xhc3MgRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlciBleHRlbmRzIEV4dFZhbFJlbmRlcmVyV3JhcHBlciBpbXBsZW1lbnRzIE1ldGhvZEludGVyY2VwdG9yCi17Ci0gICAgcHVibGljIHN0YXRpYyBSZW5kZXJlciBuZXdJbnN0YW5jZShSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzcyA9IHJlbmRlcmVyLmdldENsYXNzKCk7Ci0KLSAgICAgICAgLy90byBhdm9pZCByZS13cmFwcGluZyAtIG9jY3VycyBlLmcuIHVuZGVyIHNvbGFyaXMgKyBiZWEgd2VibG9naWMKLSAgICAgICAgaWYgKFByb3h5VXRpbHMuaXNQcm94aWVkQ2xhc3MoY3VycmVudENsYXNzKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgRW5oYW5jZXIgZW5oYW5jZXIgPSBuZXcgRW5oYW5jZXIoKTsKLSAgICAgICAgZW5oYW5jZXIuc2V0U3VwZXJjbGFzcyhyZW5kZXJlci5nZXRDbGFzcygpKTsKLSAgICAgICAgZW5oYW5jZXIuc2V0Q2FsbGJhY2sobmV3IEV4dFZhbEdlbmVyaWNSZW5kZXJlcldyYXBwZXIocmVuZGVyZXIpKTsKLSAgICAgICAgZW5oYW5jZXIuc2V0Q2xhc3NMb2FkZXIoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0KLSAgICAgICAgcmV0dXJuIChSZW5kZXJlcikgZW5oYW5jZXIuY3JlYXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBpbnRlcmNlcHQoT2JqZWN0IG9iaiwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncywgTWV0aG9kUHJveHkgcHJveHkpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0Q29udmVydGVkVmFsdWUiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDb252ZXJ0ZWRWYWx1ZSgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdLCBhcmdzWzJdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZGVjb2RlIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWNvZGUoKEZhY2VzQ29udGV4dClhcmdzWzBdLCAoVUlDb21wb25lbnQpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImVuY29kZUJlZ2luIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNvZGVCZWdpbigoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZW5jb2RlQ2hpbGRyZW4iKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZUNoaWxkcmVuKChGYWNlc0NvbnRleHQpYXJnc1swXSwgKFVJQ29tcG9uZW50KWFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJlbmNvZGVFbmQiKSAmJiBhcmdzWzFdIGluc3RhbmNlb2YgVUlDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kZUVuZCgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChVSUNvbXBvbmVudClhcmdzWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiY29udmVydENsaWVudElkIikgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRDbGllbnRJZCgoRmFjZXNDb250ZXh0KWFyZ3NbMF0sIChTdHJpbmcpYXJnc1sxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldFJlbmRlcnNDaGlsZHJlbiIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm1ldGhvZCAiICsgbWV0aG9kLmdldE5hbWUoKSArICIgY2FsbGVkIHdpdGhvdXQgcmVuZGVyaW5nLWludGVyY2VwdG9ycyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcHJveHkuaW52b2tlU3VwZXIob2JqLCBhcmdzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXh0VmFsR2VuZXJpY1JlbmRlcmVyV3JhcHBlcihSZW5kZXJlciB3cmFwcGVkKQotICAgIHsKLSAgICAgICAgc3VwZXIod3JhcHBlZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9yZW5kZXJraXQvR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOTE3ZTYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9nZW5lcmljL3JlbmRlcmtpdC9HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5DQotew0KLSAgICBwcm90ZWN0ZWQgUmVuZGVyS2l0IGNyZWF0ZVdyYXBwZXIoUmVuZGVyS2l0IHJlbmRlcktpdCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJleHR2YWwgcmVuZGVya2l0IHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcktpdC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgdmlhIGNnbGliIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gRXh0VmFsR2VuZXJpY1JlbmRlcktpdC5uZXdJbnN0YW5jZShyZW5kZXJLaXQpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9zdGFydHVwL0dlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZ2VuZXJpYy9zdGFydHVwL0dlbmVyaWNNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU3MzMxNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2dlbmVyaWMvc3RhcnR1cC9HZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZ2VuZXJpYy5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdC5HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBHZW5lcmljTW9kdWxlU3RhcnR1cExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydHVwTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQzOTIxNTYwMzI4Nzc1MTk1NTZMOw0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpLmFkZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KG5ldyBHZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L2dlbmVyaWMtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC9nZW5lcmljLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmNjMyMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvZ2VuZXJpYy1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIEdlbmVyaWMgU3VwcG9ydCBNb2R1bGUgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBHZW5lcmljIFN1cHBvcnQgTW9kdWxlIHByb3ZpZGVzIGdlbmVyaWMgU3VwcG9ydCBmb3IgSlNGIGNvbXBvbmVudCBmcmFtZXdvcmtzIHdoaWNoIGhhdmUgc3BlY2lhbCByZXF1aXJlbWVudHMgKGUuZy4gUmljaEZhY2VzLCBNeUZhY2VzIFRvYmFnbywgLi4uKS4NCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEueCBhbmQgSlNGIDIueC4gQWxsIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3BvbS54bWwgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFmNzAxZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIENvbXBvbmVudC1TdXBwb3J0IE1vZHVsZXM8L25hbWU+Ci0gICAgPHZlcnNpb24+Mi4wLjM8L3ZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4wLjM8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90YWdzLzJfMF8zPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMl8wXzM8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RhZ3MvMl8wXzM8L3VybD4KLSAgICA8L3NjbT4KLQotICAgIDxtb2R1bGVzPgotICAgICAgICA8bW9kdWxlPnRyaW5pZGFkLXN1cHBvcnQ8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5nZW5lcmljLXN1cHBvcnQ8L21vZHVsZT4KLSAgICA8L21vZHVsZXM+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjAuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDx0cmluaWRhZC52ZXJzaW9uPjIuMC4wLWFscGhhLTI8L3RyaW5pZGFkLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjllZGJkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlPC9uYW1lPgotICAgIDx2ZXJzaW9uPjIuMC4zPC92ZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmNvbXBvbmVudC1zdXBwb3J0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4wLjM8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHJpbmlkYWQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmluaWRhZC1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ1NzFmNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzJfMC54c2QiDQotICAgICAgICAgICAgICB2ZXJzaW9uPSIyLjAiPg0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPg0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdGFydHVwLlRyaW5pZGFkTW9kdWxlU3RhcnR1cExpc3RlbmVyDQotICAgICAgICA8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi0NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj4NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcg0KLSAgICAgICAgPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotPC9mYWNlcy1jb25maWc+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYxY2Y5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MGViNjguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi0vKioNCi0gKiBpbiBjYXNlIG9mIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gYSB0cmluaWRhZCBjbGllbnQgdmFsaWRhdG9yIGlzIGFkZGVkIHRvIHRoZSBjb21wb25lbnQgYmFzZWQgb24gdGhlIG1ldGEtZGF0YS4NCi0gKiBhdCB0aGUgcG9zdGJhY2s6IHRoZSBleHR2YWwgdmFsaWRhdGlvbiBzdHJhdGVneSBnZXRzIGNhbGxlZCBhbmQgYWZ0ZXIgdGhhdCB0aGUgYWRkZWQgdmFsaWRhdG9yLg0KLSAqIHRoaXMgd3JhcHBlciBwcmV2ZW50cyBzdWNoIGEgc2VydmVyLXNpZGUgZG91YmxlIHZhbGlkYXRpb24uDQotICogaXQganVzdCBkZWxlZ2F0ZXMgdGhlIGNsaWVudC1zaWRlIGZ1bmN0aW9uYWxpdHkuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIgaW1wbGVtZW50cyBWYWxpZGF0b3IsIENsaWVudFZhbGlkYXRvciwgU2VyaWFsaXphYmxlDQotew0KLSAgICBwcml2YXRlIHRyYW5zaWVudCBDbGllbnRWYWxpZGF0b3Igd3JhcHBlZDsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTQxNDU0Nzg0MTcwMDYyMTQxMEw7DQotDQotICAgIHB1YmxpYyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIoQ2xpZW50VmFsaWRhdG9yIGNsaWVudFZhbGlkYXRvcikNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gY2xpZW50VmFsaWRhdG9yOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbykgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHZhbGlkYXRlIC0gdGhlIGV4dHZhbCB2YWxpZGF0aW9uIHN0cmF0ZWd5IHdpbGwgZG8gdGhhdA0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50TGlicmFyeVNvdXJjZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRDbGllbnRMaWJyYXJ5U291cmNlKGZhY2VzQ29udGV4dCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRDbGllbnRJbXBvcnROYW1lcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudEltcG9ydE5hbWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRTY3JpcHQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudFNjcmlwdChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvRXh0VmFsVHJpbmlkYWRWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzVkOWRiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL0V4dFZhbFRyaW5pZGFkVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnJlbmRlcmtpdC5FeHRWYWxUcmluaWRhZFJlbmRlcktpdDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjdG9yeUZpbmRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXRGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSB0aGlzIHBoYXNlLWxpc3RlbmVyIGluc3RlYWQgb2YgYSBFeHRWYWxUcmluaWRhZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGR1ZSB0byBhIHRyaW5pZGFkIGlzc3VlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gOTEwOTcyMTgzMTg2NDE0NjE2NUw7DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnkgPSBnZXRSZW5kZXJLaXRGYWN0b3J5KCk7DQotDQotICAgICAgICBTdHJpbmcgcmVuZGVyS2l0SWQgPSBnZXRSZW5kZXJLaXRJZChmYWNlc0NvbnRleHQpOw0KLQ0KLSAgICAgICAgaWYgKGlzSW5jb21wYXRpYmxlUmVuZGVyS2l0KHJlbmRlcktpdElkKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGFuZ2VSZW5kZXJLaXQoZmFjZXNDb250ZXh0LCByZW5kZXJLaXRGYWN0b3J5LCByZW5kZXJLaXRJZCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmVuZGVyS2l0SWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldFJlbmRlcktpdElkKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBSZW5kZXJLaXRGYWN0b3J5IGdldFJlbmRlcktpdEZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFJlbmRlcktpdEZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEZhY3RvcnlGaW5kZXIuUkVOREVSX0tJVF9GQUNUT1JZKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbmNvbXBhdGlibGVSZW5kZXJLaXQoU3RyaW5nIHJlbmRlcktpdElkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIUV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LklELmVxdWFscyhyZW5kZXJLaXRJZCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNoYW5nZVJlbmRlcktpdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBSZW5kZXJLaXRGYWN0b3J5IHJlbmRlcktpdEZhY3RvcnksIFN0cmluZyByZW5kZXJLaXRJZCkNCi0gICAgew0KLSAgICAgICAgUmVuZGVyS2l0IHJlbmRlcktpdCA9IHJlbmRlcktpdEZhY3RvcnkuZ2V0UmVuZGVyS2l0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgcmVuZGVyS2l0SWQpOw0KLSAgICAgICAgcmVuZGVyS2l0RmFjdG9yeS5hZGRSZW5kZXJLaXQoRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuSUQsIG5ldyBFeHRWYWxUcmluaWRhZFJlbmRlcktpdChyZW5kZXJLaXQpKTsNCi0gICAgICAgIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLnNldFJlbmRlcktpdElkKEV4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LklEKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuUkVOREVSX1JFU1BPTlNFOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKHRoaXMgPT0gbykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBFeHRWYWxUcmluaWRhZFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhN2QwZTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuV2ViWG1sVXRpbHM7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcmVuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgLyoNCi0gICAgICogZGVhY3RpdmF0ZQ0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0NMSUVOVF9TSURFX1RSSU5JREFEX1ZBTElEQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfQ0xJRU5UX1NJREVfVFJJTklEQURfVkFMSURBVElPTiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfVFJJTklEQURfQ09SRV9PVVRQVVRfTEFCRUxfSU5JVElBTElaQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfVFJJTklEQURfQ09SRV9PVVRQVVRfTEFCRUxfSU5JVElBTElaQVRJT04iKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX1RSSU5JREFEX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX1RSSU5JREFEX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SIik7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvRG91YmxlUmFuZ2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzFhNjFkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Eb3VibGVSYW5nZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5Eb3VibGVSYW5nZVZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5DbGllbnRWYWxpZGF0b3I7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJza2lwVmFsaWRhdGlvblN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24iKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRG91YmxlUmFuZ2VJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXINCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7DQotICAgICAgICBEb3VibGVSYW5nZVZhbGlkYXRvciBkb3VibGVSYW5nZVZhbGlkYXRvciA9IChEb3VibGVSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVZhbGlkYXRvcigib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkRvdWJsZVJhbmdlIik7DQotDQotICAgICAgICBPYmplY3QgbWluID0gbnVsbDsNCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxUKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxUKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKG1pbiBpbnN0YW5jZW9mIERvdWJsZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKChEb3VibGUpbWluKTsNCi0gICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE9iamVjdCBtYXggPSBudWxsOw0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWF4ID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1heCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYobWF4IGluc3RhbmNlb2YgRG91YmxlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oKERvdWJsZSltYXgpOw0KLSAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoaW5mb3JtYXRpb25BZGRlZCAmJg0KLSAgICAgICAgICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvciBpbnN0YW5jZW9mIENsaWVudFZhbGlkYXRvciAmJiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IoDQotICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpZG91YmxlUmFuZ2VWYWxpZGF0b3IpKTsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvTGVuZ3RoSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9MZW5ndGhJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGM2ZGZjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9MZW5ndGhJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5FeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInNraXBWYWxpZGF0aW9uU3VwcG9ydCBmb3IgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiIpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBMZW5ndGhJbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXINCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiBpbmZvcm1hdGlvbkFkZGVkID0gZmFsc2U7DQotICAgICAgICAvL1RPRE8NCi0gICAgICAgIExlbmd0aFZhbGlkYXRvciBsZW5ndGhWYWxpZGF0b3IgPSAoTGVuZ3RoVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTGVuZ3RoIik7DQotDQotICAgICAgICBPYmplY3QgbWluTGVuZ3RoID0gbnVsbDsNCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NSU5fTEVOR1RIKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtaW5MZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSF9ERUZBVUxUKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtaW5MZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEhfREVGQVVMVCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihtaW5MZW5ndGggaW5zdGFuY2VvZiBJbnRlZ2VyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNaW5pbXVtKChJbnRlZ2VyKW1pbkxlbmd0aCk7DQotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbnVsbDsNCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSF9ERUZBVUxUKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtYXhMZW5ndGggPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEhfREVGQVVMVCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihtYXhMZW5ndGggaW5zdGFuY2VvZiBJbnRlZ2VyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0TWF4aW11bUxlbmd0aCIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQuY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1heExlbmd0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGxlbmd0aFZhbGlkYXRvci5zZXRNYXhpbXVtKChJbnRlZ2VyKW1heExlbmd0aCk7DQotICAgICAgICAgICAgaW5mb3JtYXRpb25BZGRlZCA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICAvL3JlSW5pdFZhbGlkYXRvcnMoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQsIG1ldGFEYXRhKTsgLy9zZWFyY2ggd3JhcHBlcnMgYW5kIGNhbGwgLmRlYWN0aXZhdGUNCi0NCi0gICAgICAgIGlmKGluZm9ybWF0aW9uQWRkZWQgJiYgbGVuZ3RoVmFsaWRhdG9yIGluc3RhbmNlb2YgQ2xpZW50VmFsaWRhdG9yKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuYWRkVmFsaWRhdG9yKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeHRWYWxUcmluaWRhZENsaWVudFZhbGlkYXRvcldyYXBwZXIoKENsaWVudFZhbGlkYXRvcilsZW5ndGhWYWxpZGF0b3IpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsZW5ndGhWYWxpZGF0b3IuZ2V0TWluaW11bSgpID4gMCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgKChDb3JlT3V0cHV0TGFiZWwpdWlDb21wb25lbnQpLnNldFNob3dSZXF1aXJlZCh0cnVlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZihCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICgoQ29yZU91dHB1dExhYmVsKXVpQ29tcG9uZW50KS5zZXRTaG93UmVxdWlyZWQoZmFsc2UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9Mb25nUmFuZ2VJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xvbmdSYW5nZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYmFjYzguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0xvbmdSYW5nZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5Mb25nUmFuZ2VWYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIExvbmdSYW5nZUluaXRpYWxpemVyIGV4dGVuZHMgVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplcg0KLXsNCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZVRyaW5pZGFkQ29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIGluZm9ybWF0aW9uQWRkZWQgPSBmYWxzZTsNCi0gICAgICAgIExvbmdSYW5nZVZhbGlkYXRvciBsb25nUmFuZ2VWYWxpZGF0b3IgPSAoTG9uZ1JhbmdlVmFsaWRhdG9yKWZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuTG9uZ1JhbmdlIik7DQotDQotICAgICAgICBPYmplY3QgbWluID0gbnVsbDsNCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NSU4pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1pbiA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxUKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtaW4gPSBtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01JTl9ERUZBVUxUKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKG1pbiBpbnN0YW5jZW9mIExvbmcpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9uZ1JhbmdlVmFsaWRhdG9yLnNldE1pbmltdW0oKExvbmcpbWluKTsNCi0gICAgICAgICAgICBpbmZvcm1hdGlvbkFkZGVkID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE9iamVjdCBtYXggPSBudWxsOw0KLSAgICAgICAgaWYobWV0YURhdGEuY29udGFpbnNLZXkoQ29tbW9uTWV0YURhdGFLZXlzLlJBTkdFX01BWCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWF4ID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1heCA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYobWF4IGluc3RhbmNlb2YgTG9uZykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3Iuc2V0TWF4aW11bSgoTG9uZyltYXgpOw0KLSAgICAgICAgICAgIGluZm9ybWF0aW9uQWRkZWQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoaW5mb3JtYXRpb25BZGRlZCAmJg0KLSAgICAgICAgICAgICAgICBsb25nUmFuZ2VWYWxpZGF0b3IgaW5zdGFuY2VvZiBDbGllbnRWYWxpZGF0b3IgJiYgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmFkZFZhbGlkYXRvcigNCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKChDbGllbnRWYWxpZGF0b3IpbG9uZ1JhbmdlVmFsaWRhdG9yKSk7DQotDQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9QYXR0ZXJuSW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9QYXR0ZXJuSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUxMWUzOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUGF0dGVybkluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW5pdGlhbGl6ZXIuY29tcG9uZW50Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5SZWdFeHBWYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC52YWxpZGF0b3IuQ2xpZW50VmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic2tpcFZhbGlkYXRpb25TdXBwb3J0IGZvciBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIFBhdHRlcm5Jbml0aWFsaXplciBleHRlbmRzIFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXINCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgaWYoIW1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5QQVRURVJOKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmdbXSBwYXR0ZXJucyA9IChTdHJpbmdbXSltZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlBBVFRFUk4pOw0KLQ0KLSAgICAgICAgUmVnRXhwVmFsaWRhdG9yIHJlZ0V4cFZhbGlkYXRvcjsNCi0NCi0gICAgICAgIGZvcihTdHJpbmcgcGF0dGVybiA6IHBhdHRlcm5zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlZ0V4cFZhbGlkYXRvciA9IChSZWdFeHBWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuUmVnRXhwIik7DQotDQotICAgICAgICAgICAgcmVnRXhwVmFsaWRhdG9yLnNldFBhdHRlcm4ocGF0dGVybik7DQotICAgICAgICAgICAgcmVnRXhwVmFsaWRhdG9yLnNldE1lc3NhZ2VEZXRhaWxOb01hdGNoKChTdHJpbmcpbWV0YURhdGEuZ2V0KA0KLSAgICAgICAgICAgICAgICBDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTl9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UpKTsNCi0NCi0gICAgICAgICAgICBpZihyZWdFeHBWYWxpZGF0b3IgaW5zdGFuY2VvZiBDbGllbnRWYWxpZGF0b3IgJiYgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKXVpQ29tcG9uZW50KS5hZGRWYWxpZGF0b3IoDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcigoQ2xpZW50VmFsaWRhdG9yKXJlZ0V4cFZhbGlkYXRvcikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvUmVxdWlyZWRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDEzNTFkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9SZXF1aXJlZEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC51dGlsLlRyaW5pZGFkVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5vdXRwdXQuQ29yZU91dHB1dExhYmVsOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIFJlcXVpcmVkSW5pdGlhbGl6ZXIgZXh0ZW5kcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyDQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlVHJpbmlkYWRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGlmKCF2YWxpZGF0ZUVtcHR5RmllbGRzKCkgfHwgIUV4dFZhbFV0aWxzLmlzUmVxdWlyZWRJbml0aWFsaXphdGlvbkFjdGl2ZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkgfHwNCi0gICAgICAgICAgIG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5XRUFLX1JFUVVJUkVEKXx8DQotICAgICAgICAgICBtZXRhRGF0YS5jb250YWluc0tleShDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZigoDQotICAgICAgICAgICAgICAgICAoIUJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJg0KLSAgICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUuZXF1YWxzKG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCkpKSB8fA0KLSAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpDQotICAgICAgICAgICAgICAgICYmDQotICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMoaXNDb21wb25lbnRSZXF1aXJlZCh1aUNvbXBvbmVudCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBFZGl0YWJsZVZhbHVlSG9sZGVyKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKHRydWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgQ29yZU91dHB1dExhYmVsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKHRydWUpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04pKSAmJg0KLSAgICAgICAgICAgICAgICAgICAhQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIgJiYgRXh0VmFsVXRpbHMuaXNSZXF1aXJlZFJlc2V0QWN0aXZhdGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQoZmFsc2UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgQ29yZU91dHB1dExhYmVsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAoKENvcmVPdXRwdXRMYWJlbCl1aUNvbXBvbmVudCkuc2V0U2hvd1JlcXVpcmVkKGZhbHNlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVFbXB0eUZpZWxkcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy52YWxpZGF0ZUVtcHR5RmllbGRzKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEJvb2xlYW4gaXNDb21wb25lbnRSZXF1aXJlZChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlT3V0cHV0TGFiZWwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdWlDb21wb25lbnQgPSBUcmluaWRhZFV0aWxzLmZpbmRMYWJlbGVkRWRpdGFibGVDb21wb25lbnQoKENvcmVPdXRwdXRMYWJlbCkgdWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgICAgIGlmKHVpQ29tcG9uZW50ID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvL2NvbXBhcmUgd2l0aCBmYWxzZSBzbyB0cnVlID0gdHJ1ZSBvciBudWxsDQotICAgICAgICBib29sZWFuIGlzUmVhZE9ubHkgPSAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJpc1JlYWRPbmx5IikpKTsNCi0gICAgICAgIGJvb2xlYW4gaXNEaXNhYmxlZCA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzRGlzYWJsZWQiKSkpOw0KLQ0KLSAgICAgICAgcmV0dXJuICEoaXNSZWFkT25seSB8fCBpc0Rpc2FibGVkKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW5pdGlhbGl6ZXIvY29tcG9uZW50L1RyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcyYWVlZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbml0aWFsaXplci5jb21wb25lbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZS5UcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb250ZXh0LlJlcXVlc3RDb250ZXh0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXRUZXh0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dERhdGUiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXI+IGNvbXBvbmVudEluaXRpYWxpemVycyA9DQotICAgICAgICBuZXcgQXJyYXlMaXN0PFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXI+KCk7DQotDQotICAgIHN0YXRpYw0KLSAgICB7DQotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBSZXF1aXJlZEluaXRpYWxpemVyKCkpOw0KLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChuZXcgTGVuZ3RoSW5pdGlhbGl6ZXIoKSk7DQotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBMb25nUmFuZ2VJbml0aWFsaXplcigpKTsNCi0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IERvdWJsZVJhbmdlSW5pdGlhbGl6ZXIoKSk7DQotICAgICAgICBjb21wb25lbnRJbml0aWFsaXplcnMuYWRkKG5ldyBQYXR0ZXJuSW5pdGlhbGl6ZXIoKSk7DQotICAgICAgICAvL2NvbXBvbmVudEluaXRpYWxpemVycy5hZGQobmV3IFZhbGlkYXRvckluaXRpYWxpemVyKCkpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTE9XLCBkZXNjcmlwdGlvbiA9ICJjaGVjayBwcHIgaXNzdWUiKQ0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICB7DQotICAgICAgICBmb3IoVHJpbmlkYWRDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplciA6IGNvbXBvbmVudEluaXRpYWxpemVycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihjb21wb25lbnRJbml0aWFsaXplci5jb25maWd1cmVUcmluaWRhZENvbXBvbmVudChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRDb21wb25lbnRUb1N0b3JhZ2UodWlDb21wb25lbnQpOw0KLSAgICAgICAgICAgICAgICB1cGRhdGVDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRDb21wb25lbnRUb1N0b3JhZ2UoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmNsYXNzLCBUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKQ0KLSAgICAgICAgICAgICAgICAuYWRkQ29tcG9uZW50KHVpQ29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25maWd1cmVUcmluaWRhZENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKSB8fA0KLSAgICAgICAgICAgICAgIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURS5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmKFJlcXVlc3RDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmlzUGFydGlhbFJlcXVlc3QoZmFjZXNDb250ZXh0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBSZXF1ZXN0Q29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5hZGRQYXJ0aWFsVGFyZ2V0KHVpQ29tcG9uZW50LmdldFBhcmVudCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbml0aWFsaXplci9jb21wb25lbnQvVmFsaWRhdG9ySW5pdGlhbGl6ZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmFjOWM4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2luaXRpYWxpemVyL2NvbXBvbmVudC9WYWxpZGF0b3JJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih2YWx1ZSA9IFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5MT1csIGRlc2NyaXB0aW9uID0gImltcGwuIHRyaW5pZGFkIGUtbWFpbCB2YWxpZGF0b3IiKQ0KLWNsYXNzIFZhbGlkYXRvckluaXRpYWxpemVyIGltcGxlbWVudHMgQ29tcG9uZW50SW5pdGlhbGl6ZXINCi17DQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgaWYoIW1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5DVVNUT00pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG1ldGFEYXRhLmdldChDb21tb25NZXRhRGF0YUtleXMuQ1VTVE9NKTsNCi0NCi0gICAgICAgIGlmKCEodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBmb3IoT2JqZWN0IGN1cnJlbnRWYWx1ZSA6IChMaXN0KXZhbHVlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCEoY3VycmVudFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZihDb21tb25NZXRhRGF0YUtleXMuRU1BSUwuZXF1YWxzKGN1cnJlbnRWYWx1ZSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL1RPRE8NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTQ2OTZiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yDQotICAgICAgICAuQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Bd2FyZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFRyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBDb21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHByb3RlY3RlZCB2b2lkIGFmdGVyRXh0cmFjdGluZ0ZvckNvbXBvbmVudEluaXRpYWxpemF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgcHJvY2Vzc01ldGFEYXRhRW50cmllcyhwcm9wZXJ0eUluZm9ybWF0aW9uLmdldE1ldGFEYXRhRW50cmllcygpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01ldGFEYXRhRW50cmllcyhNZXRhRGF0YUVudHJ5W10gbWV0YURhdGFFbnRyaWVzKQ0KLSAgICB7DQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBtZXRhRGF0YUVudHJpZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHByb2Nlc3NFbnRyeShlbnRyeSkgJiYgaXNDbGllbnRWYWxpZGF0aW9uRGlzYWJsZWQoZW50cnkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uKGVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLy9lLmcuIHJldHVybnMgZmFsc2UgZm9yIGpzcjMwMyBlbnRyaWVzDQotICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzRW50cnkoTWV0YURhdGFFbnRyeSBlbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBBbm5vdGF0aW9uOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NsaWVudFZhbGlkYXRpb25EaXNhYmxlZChNZXRhRGF0YUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpDQotICAgICAgICAgICAgICAgIC5leHRyYWN0KGVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuaXRlcmF0b3IoKS5oYXNOZXh0KCk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHJpdmF0ZSB2b2lkIGRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbihNZXRhRGF0YUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZihlbnRyeS5nZXRQcm9wZXJ0eShDb21tb25NZXRhRGF0YUtleXMuRElTQUJMRV9DTElFTlRfU0lERV9WQUxJREFUSU9OKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGVudHJ5LnNldFByb3BlcnR5KENvbW1vbk1ldGFEYXRhS2V5cy5ESVNBQkxFX0NMSUVOVF9TSURFX1ZBTElEQVRJT04sIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBrZXlzVG9EaXNhYmxlID0gZW50cnkuZ2V0UHJvcGVydHkoQ29tbW9uTWV0YURhdGFLZXlzLkRJU0FCTEVfQ0xJRU5UX1NJREVfVkFMSURBVElPTiwgTGlzdC5jbGFzcyk7DQotICAgICAgICBrZXlzVG9EaXNhYmxlLmFkZChlbnRyeS5nZXRLZXkoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvaW50ZXJjZXB0b3IvVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVlM2I2MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLlRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnV0aWwuVHJpbmlkYWRVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLkNvcmVGb3JtOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW50ZXJjZXB0b3INCi17DQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQ0KLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoZmlsdGVyQ29yZU91dHB1dExhYmVsKHVpQ29tcG9uZW50KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0Q29yZU91dHB1dExhYmVsKGZhY2VzQ29udGV4dCwgKENvcmVPdXRwdXRMYWJlbCkgdWlDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlckVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkNCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBDb3JlRm9ybSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjbGVhbnVwRXh0VmFsQ2xpZW50VmFsaWRhdG9ycygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjbGVhbnVwRXh0VmFsQ2xpZW50VmFsaWRhdG9ycygpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmNsYXNzLCBUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKQ0KLSAgICAgICAgICAgICAgICAucm9sbGJhY2soKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gZmlsdGVyQ29yZU91dHB1dExhYmVsKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgQ29yZU91dHB1dExhYmVsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q29yZU91dHB1dExhYmVsKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIENvcmVPdXRwdXRMYWJlbCBjb3JlT3V0cHV0TGFiZWwpDQotICAgIHsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IFRyaW5pZGFkVXRpbHMuZmluZExhYmVsZWRFZGl0YWJsZUNvbXBvbmVudChjb3JlT3V0cHV0TGFiZWwpOw0KLQ0KLSAgICAgICAgaWYgKHRhcmdldENvbXBvbmVudCA9PSBudWxsIHx8ICFpc0NvbXBvbmVudEVkaXRhYmxlKHRhcmdldENvbXBvbmVudCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YVJlc3VsdCA9IEV4dFZhbFV0aWxzLmdldFRyYW5zZm9ybWVkTWV0YURhdGEoZmFjZXNDb250ZXh0LCB0YXJnZXRDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgLy9nZXQgY29tcG9uZW50IGluaXRpYWxpemVyIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQgYW5kIGNvbmZpZ3VyZSBpdA0KLSAgICAgICAgLy9hbHNvIGluIGNhc2Ugb2Ygc2tpcHBlZCB2YWxpZGF0aW9uIHRvIHJlc2V0IGUuZy4gdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZQ0KLSAgICAgICAgaWYgKCFtZXRhRGF0YVJlc3VsdC5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29uZmlndXJlQ29tcG9uZW50V2l0aE1ldGFEYXRhKGZhY2VzQ29udGV4dCwgY29yZU91dHB1dExhYmVsLCBtZXRhRGF0YVJlc3VsdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcG9uZW50RWRpdGFibGUoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIC8vY29tcGFyZSB3aXRoIGZhbHNlIHNvIHRydWUgPSB0cnVlIG9yIG51bGwNCi0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzUmVhZE9ubHkiKSkpOw0KLSAgICAgICAgYm9vbGVhbiBpc0Rpc2FibGVkID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNEaXNhYmxlZCIpKSk7DQotDQotICAgICAgICByZXR1cm4gIShpc1JlYWRPbmx5IHx8IGlzRGlzYWJsZWQpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9pbnRlcmNlcHRvci9UcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDg1NDYxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL2ludGVyY2VwdG9yL1RyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuTGFiZWxlZE1lc3NhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uZXhjZXB0aW9uLlJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb250ZXh0LlJlcXVlc3RDb250ZXh0Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigzMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklOSURBRF9DT1JFX0lOUFVUX1RFWFQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuY29yZS5pbnB1dC5Db3JlSW5wdXRUZXh0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSU5JREFEX0NPUkVfSU5QVVRfREFURQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5jb3JlLmlucHV0LkNvcmVJbnB1dERhdGUiOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9SZWZyZXNoQ29tcG9uZW50KHVpQ29tcG9uZW50KTsNCi0gICAgICAgICAgICB0cnlUb1BsYWNlTGFiZWxJbkZhY2VzTWVzc2FnZSh1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgdmFsaWRhdG9yRXhjZXB0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1BsYWNlTGFiZWxJbkZhY2VzTWVzc2FnZSgNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICB0cnlUb0hhbmRsZVJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKHVpQ29tcG9uZW50LCB2YWxpZGF0b3JFeGNlcHRpb24pOw0KLQ0KLSAgICAgICAgU3RyaW5nIGxhYmVsID0gZGV0ZWN0TGFiZWxUZXh0KG1ldGFEYXRhRW50cnksIHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIHByb2Nlc3NMYWJlbCh2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCksIGxhYmVsKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBkZXRlY3RMYWJlbFRleHQoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGxhYmVsID0gZ2V0TGFiZWwodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgbGFiZWwgPSBnZXRDbGllbnRJZEFzRmFsbGJhY2tJZk5lZWRlZCh1aUNvbXBvbmVudCwgbGFiZWwpOw0KLQ0KLSAgICAgICAgbGFiZWwgPSB0cnlUb092ZXJyaWRlTGFiZWxJZlByb3ZpZGVkTWFudWFsbHkobWV0YURhdGFFbnRyeSwgbGFiZWwpOw0KLSAgICAgICAgcmV0dXJuIGxhYmVsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTGFiZWwoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgU3RyaW5nIGxhYmVsKQ0KLSAgICB7DQotICAgICAgICBpZihmYWNlc01lc3NhZ2UgaW5zdGFuY2VvZiBMYWJlbGVkTWVzc2FnZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAoKExhYmVsZWRNZXNzYWdlKWZhY2VzTWVzc2FnZSkuc2V0TGFiZWxUZXh0KGxhYmVsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vaWYgc29tZW9uZSB1c2VzIGEgbm9ybWFsIGZhY2VzIG1lc3NhZ2UNCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9QbGFjZUxhYmVsKGZhY2VzTWVzc2FnZSwgbGFiZWwsIGkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb092ZXJyaWRlTGFiZWxJZlByb3ZpZGVkTWFudWFsbHkoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhRW50cnkgIT0gbnVsbCAmJiBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMLCBTdHJpbmcuY2xhc3MpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGxhYmVsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldENsaWVudElkQXNGYWxsYmFja0lmTmVlZGVkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIGlmKGxhYmVsID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHVpQ29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvSGFuZGxlUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRvckV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCk7DQotICAgICAgICAgICAgU3RyaW5nIGlubGluZU1lc3NhZ2UgPSBnZXRJbmxpbmVSZXF1aXJlZE1lc3NhZ2UodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgICAgIGlmKGlubGluZU1lc3NhZ2UgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGlubGluZU1lc3NhZ2UpOw0KLSAgICAgICAgICAgICAgICBmYWNlc01lc3NhZ2Uuc2V0RGV0YWlsKGlubGluZU1lc3NhZ2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9SZWZyZXNoQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZihSZXF1ZXN0Q29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5pc1BhcnRpYWxSZXF1ZXN0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuYWRkUGFydGlhbFRhcmdldCh1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHVpQ29tcG9uZW50ICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgKFRSSU5JREFEX0NPUkVfSU5QVVRfVEVYVC5lcXVhbHModWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpIHx8DQotICAgICAgICAgICAgICAgICBUUklOSURBRF9DT1JFX0lOUFVUX0RBVEUuZXF1YWxzKHVpQ29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGFiZWwoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoU3RyaW5nKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCh1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJnZXRMYWJlbCIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRJbmxpbmVSZXF1aXJlZE1lc3NhZ2UoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoU3RyaW5nKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCh1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJnZXRSZXF1aXJlZE1lc3NhZ2VEZXRhaWwiKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyS2l0LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFhYmFkNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9yZW5kZXJraXQvRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwucmVuZGVya2l0LlJlbmRlcktpdERlY29yYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwucmVuZGVya2l0LmNvcmUuQ29yZVJlbmRlcktpdDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVzcG9uc2VTdGF0ZU1hbmFnZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VXcml0ZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uV3JpdGVyOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxUcmluaWRhZFJlbmRlcktpdCBleHRlbmRzIFJlbmRlcktpdERlY29yYXRvcg0KLXsNCi0gICAgcHJvdGVjdGVkIEV4dFZhbFJlbmRlcktpdCBleHRWYWxSZW5kZXJLaXQ7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIkVYVFZBTF9UUklOSURBRF9SRU5ERVJLSVQiOw0KLQ0KLSAgICBwdWJsaWMgRXh0VmFsVHJpbmlkYWRSZW5kZXJLaXQoUmVuZGVyS2l0IHdyYXBwZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZXh0VmFsUmVuZGVyS2l0ID0gbmV3IEV4dFZhbFJlbmRlcktpdCh3cmFwcGVkKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyZXIoU3RyaW5nIGZhbWlseSwgU3RyaW5nIHJlbmRlcmVyVHlwZSwgUmVuZGVyZXIgcmVuZGVyZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZXh0VmFsUmVuZGVyS2l0LmFkZFJlbmRlcmVyKGZhbWlseSwgcmVuZGVyZXJUeXBlLCByZW5kZXJlcik7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBSZW5kZXJlciBnZXRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5leHRWYWxSZW5kZXJLaXQuZ2V0UmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdGF0ZU1hbmFnZXIgZ2V0UmVzcG9uc2VTdGF0ZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5leHRWYWxSZW5kZXJLaXQuZ2V0UmVzcG9uc2VTdGF0ZU1hbmFnZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFJlc3BvbnNlV3JpdGVyIGNyZWF0ZVJlc3BvbnNlV3JpdGVyKFdyaXRlciB3cml0ZXIsIFN0cmluZyBzLCBTdHJpbmcgczEpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5jcmVhdGVSZXNwb25zZVdyaXRlcih3cml0ZXIsIHMsIHMxKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFJlc3BvbnNlU3RyZWFtIGNyZWF0ZVJlc3BvbnNlU3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmV4dFZhbFJlbmRlcktpdC5jcmVhdGVSZXNwb25zZVN0cmVhbShvdXRwdXRTdHJlYW0pOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVjb3JhdGVkUmVuZGVyS2l0SWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ29yZVJlbmRlcktpdC5CQVNFX1JFTkRFUl9LSVRfSUQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvcmVuZGVya2l0L0V4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjI3MDFmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3JlbmRlcmtpdC9FeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5yZW5kZXJraXQuY29yZS54aHRtbC50YWJsZS5UYWJsZVJlbmRlcmluZ0NvbnRleHQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBzb2x1dGlvbiBmb3IgdHJpbmlkYWQgdGFibGUgcmVuZGVyZXIgaXNzdWUgKGluIGNvbm5lY3Rpb24gd2l0aCBkb3VibGUgY2FsbCBwcmV2ZW50aW9uIHByb3hpZXMpDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotcHVibGljIGNsYXNzIEV4dFZhbFRyaW5pZGFkUmVuZGVyZXJQcm94eSBleHRlbmRzIEV4dFZhbFJlbmRlcmVyUHJveHkNCi17DQotICAgIHB1YmxpYyBFeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkoUmVuZGVyZXIgcmVuZGVyZXIpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKHJlbmRlcmVyKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcHRpb25hbEtleShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYoVGFibGVSZW5kZXJpbmdDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICJ8IiArIFRhYmxlUmVuZGVyaW5nQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRSZW5kZXJTdGFnZSgpLmdldFN0YWdlKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gIiI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RhcnR1cC9UcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGI3NTZiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0YXJ0dXAvVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RhcnR1cDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5TdG9yYWdlTWFuYWdlckhvbGRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJlclByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLmluaXRpYWxpemVyLmNvbXBvbmVudC5UcmluaWRhZENvbXBvbmVudEluaXRpYWxpemVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZS5UcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLkRlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnZhbGlkYXRpb24ubWVzc2FnZS5UcmluaWRhZEZhY2VzTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5yZW5kZXJraXQuRXh0VmFsVHJpbmlkYWRSZW5kZXJlclByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuaW50ZXJjZXB0b3IuVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvci5UcmluaWRhZFJlbmRlcmVySW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5pbnRlcmNlcHRvci5UcmluaWRhZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogYWx0ZXJuYXRpdmUgYXBwcm9hY2ggZm9yIEV4dFZhbFJlbmRlcktpdEZhY3RvcnkNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBUcmluaWRhZE1vZHVsZVN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODAzNDA4OTI0NDkwMzk2Njk5OUw7DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBkZWFjdGl2YXRlRGVmYXVsdEV4dFZhbFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7DQotDQotICAgICAgICBpbml0Q2xpZW50U2lkZVZhbGlkYXRpb25TdXBwb3J0KCk7DQotDQotICAgICAgICBpbml0TGFiZWxJbml0aWFsaXphdGlvblN1cHBvcnQoKTsNCi0NCi0gICAgICAgIGluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0aW9uKCk7DQotDQotICAgICAgICByZXBsYWNlRGVmYXVsdFByb3h5V2l0aFRyaW5pZGFkUmVuZGVyZXJQcm94eSgpOw0KLQ0KLSAgICAgICAgaW5pdFRyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeSgpOw0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIGlmIHRoZXJlIGFyZSBmdXJ0aGVyIGluY29tcGF0aWJsZSByZW5kZXJlcnMgdXNlIHRoZSBmb2xsb3dpbmcgcXVpY2stZml4Og0KLSAgICAgICAgICogICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVksIG51bGwpOw0KLSAgICAgICAgICAgYXR0ZW50aW9uOiBpdCBjYXVzZXMgZGlyZWN0IGRlbGVnYXRpb24gd2l0aG91dCBhIGNoZWNrIG9mIGRvdWJsZSBpbnZvY2F0aW9ucw0KLSAgICAgICAgICovDQotDQotICAgICAgICBpbml0VHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcigpOw0KLQ0KLSAgICAgICAgaW5pdFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZSgpOw0KLQ0KLSAgICAgICAgaW5pdFJlcXVpcmVkSW5pdGlhbGl6YXRpb24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgZGVhY3RpdmF0ZURlZmF1bHRFeHRWYWxSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5SRU5ERVJLSVRfV1JBUFBFUl9GQUNUT1JZLCBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmNsYXNzKS5kZWFjdGl2YXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRDbGllbnRTaWRlVmFsaWRhdGlvblN1cHBvcnQoKQ0KLSAgICB7DQotICAgICAgICBpZihpc0NsaWVudFNpZGVWYWxpZGF0aW9uU3VwcG9ydEVuYWJsZWQoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ0xJRU5UX1NJREVfVFJJTklEQURfVkFMSURBVElPTikpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkQ29tcG9uZW50SW5pdGlhbGl6ZXIobmV3IFRyaW5pZGFkQ29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRMYWJlbEluaXRpYWxpemF0aW9uU3VwcG9ydCgpDQotICAgIHsNCi0gICAgICAgIGlmKGlzTGFiZWxJbml0aWFsaXphdGlvbkVuYWJsZWQoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfVFJJTklEQURfQ09SRV9PVVRQVVRfTEFCRUxfSU5JVElBTElaQVRJT04pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgVHJpbmlkYWRSZW5kZXJlckludGVyY2VwdG9yKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdGlvbigpDQotICAgIHsNCi0gICAgICAgIGlmKHVzZVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRpb24oV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfVFJJTklEQURfVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcihuZXcgVHJpbmlkYWRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VEZWZhdWx0UHJveHlXaXRoVHJpbmlkYWRSZW5kZXJlclByb3h5KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KEV4dFZhbFJlbmRlcmVyUHJveHkuS0VZLCBFeHRWYWxUcmluaWRhZFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFRyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRHbG9iYWxQcm9wZXJ0eSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5TmFtZXMuRkFDRVNfTUVTU0FHRV9GQUNUT1JZLm5hbWUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBUcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFRyaW5pZGFkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgVHJpbmlkYWRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlksIFN0b3JhZ2VNYW5hZ2VySG9sZGVyLmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuc2V0U3RvcmFnZU1hbmFnZXIoVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0xhYmVsSW5pdGlhbGl6YXRpb25FbmFibGVkKFN0cmluZyBkZWFjdGl2YXRlSW5pdENvcmVPdXRwdXRMYWJlbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGRlYWN0aXZhdGVJbml0Q29yZU91dHB1dExhYmVsID09IG51bGwgfHwgIWRlYWN0aXZhdGVJbml0Q29yZU91dHB1dExhYmVsLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDbGllbnRTaWRlVmFsaWRhdGlvblN1cHBvcnRFbmFibGVkKFN0cmluZyBkZWFjdGl2YXRlQ2xpZW50U2lkZVZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkZWFjdGl2YXRlQ2xpZW50U2lkZVZhbGlkYXRpb24gPT0gbnVsbCB8fCAhZGVhY3RpdmF0ZUNsaWVudFNpZGVWYWxpZGF0aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdGlvbihTdHJpbmcgZGVhY3RpdmF0ZVRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZGVhY3RpdmF0ZVRyaW5pZGFkVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yID09IG51bGwgfHwNCi0gICAgICAgICAgICAgICAgIWRlYWN0aXZhdGVUcmluaWRhZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFJlcXVpcmVkSW5pdGlhbGl6YXRpb24oKQ0KLSAgICB7DQotICAgICAgICBpZighaXNSZXF1aXJlZEluaXRpYWxpemF0aW9uRGVhY3RpdmF0ZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eSgibW9kZTppbml0OnJlcXVpcmVkIiwgQm9vbGVhbi5UUlVFLCB0cnVlKTsNCi0NCi0gICAgICAgICAgICAvL3RoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIGNsaWVudC1zaWRlIHNldmVyaXR5IGF3YXJlIHZhbGlkYXRpb24gLT4gZG9uJ3QgcmVzZXQgdGhlIHZhbHVlDQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoIm1vZGU6cmVzZXQ6cmVxdWlyZWQiLCBCb29sZWFuLkZBTFNFLCBmYWxzZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvbkRlYWN0aXZhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICJmYWxzZSIuZXF1YWxzSWdub3JlQ2FzZSgNCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyLkFDVElWQVRFX1JFUVVJUkVEX0lOSVRJQUxJWkFUSU9OKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwODYxZDUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLkV4dFZhbFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yV3JhcHBlcjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2UgaW1wbGVtZW50cyBUcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgTGlzdDxVSUNvbXBvbmVudD4gY29tcG9uZW50TGlzdCA9IG5ldyBBcnJheUxpc3Q8VUlDb21wb25lbnQ+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZENvbXBvbmVudChVSUNvbXBvbmVudCB0cmluaWRhZENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYoIXRoaXMuY29tcG9uZW50TGlzdC5jb250YWlucyh0cmluaWRhZENvbXBvbmVudCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5jb21wb25lbnRMaXN0LmFkZCh0cmluaWRhZENvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcm9sbGJhY2soKQ0KLSAgICB7DQotICAgICAgICBmb3IgKFVJQ29tcG9uZW50IGNvbXBvbmVudCA6IHRoaXMuY29tcG9uZW50TGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZW1vdmVUcmluaWRhZFZhbGlkYXRvcldyYXBwZXIoY29tcG9uZW50KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRoaXMuY29tcG9uZW50TGlzdC5jbGVhcigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZW1vdmVUcmluaWRhZFZhbGlkYXRvcldyYXBwZXIoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICh1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVtb3ZlV3JhcHBlckZyb21Db21wb25lbnQodWlDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vdG8ga2VlcCB0aGUgc291cmNlIGluIHN5bmMgd2l0aCBvbGRlciB2ZXJzaW9ucw0KLSAgICAgICAgICAgIGZvciAoT2JqZWN0IGNoaWxkIDogdWlDb21wb25lbnQuZ2V0Q2hpbGRyZW4oKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlbW92ZVRyaW5pZGFkVmFsaWRhdG9yV3JhcHBlcigoVUlDb21wb25lbnQpY2hpbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlV3JhcHBlckZyb21Db21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGZvciAoVmFsaWRhdG9yIHZhbGlkYXRvciA6ICgoRWRpdGFibGVWYWx1ZUhvbGRlcikgdWlDb21wb25lbnQpLmdldFZhbGlkYXRvcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgRXh0VmFsVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JXcmFwcGVyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgKChFZGl0YWJsZVZhbHVlSG9sZGVyKSB1aUNvbXBvbmVudCkucmVtb3ZlVmFsaWRhdG9yKHZhbGlkYXRvcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cmluaWRhZC9zdG9yYWdlL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDAxZGM1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLm1hcHBlci5EZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgY29tcG9uZW50IGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTWFuYWdlcg0KLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8VHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlPg0KLXsNCi0gICAgcHVibGljIERlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBEZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBTdG9yYWdlTWFuYWdlci5jbGFzcy5nZXROYW1lKCkgKyAiX0ZPUl9UUklOSURBRF9DTElFTlRfVkFMSURBVE9SOktFWSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9UcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODNjYjguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9UcmluaWRhZENsaWVudFZhbGlkYXRvclN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi0NCi0vKioNCi0gKiBleHR2YWwgaW5qZWN0cyBjbGllbnQtdmFsaWRhdG9ycyBpbnRvIHRyaW5pZGFkIGNvbXBvbmVudHMgYmFzZWQgb24gbWV0YS1kYXRhLg0KLSAqIHNvIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gaXMgc3VwcG9ydGVkLiBzb21lIGFwcC1zZXJ2ZXJzIHNob3cgYSBkaWZmZXJlbnQgYmVoYXZpb3VyLg0KLSAqIHRoYXQncyB0aGUgcmVhc29uIGZvciBzdG9yaW5nIHRoZXNlIGNvbXBvbmVudHMgYW5kIHJlbW92ZSB0aGUgaW5qZWN0ZWQgdmFsaWRhdG9ycyBhZnRlciB0aGUgcmVuZGVyaW5nIHBoYXNlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBhZGRDb21wb25lbnQoVUlDb21wb25lbnQgdHJpbmlkYWRDb21wb25lbnQpOw0KLSAgICB2b2lkIHJvbGxiYWNrKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZTY5YjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC5zdG9yYWdlLlRyaW5pZGFkQ2xpZW50VmFsaWRhdG9yU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnRyaW5pZGFkLnN0b3JhZ2UuRGVmYXVsdENsaWVudFZhbGlkYXRvclN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiB1c2UgYSBwdWJsaWMgY2xhc3MgdG8gYWxsb3cgb3B0aW9uYWwgZGVyZWdpc3RyYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRDbGllbnRWYWxpZGF0b3JTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoVHJpbmlkYWRDbGllbnRWYWxpZGF0b3JTdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0Q2xpZW50VmFsaWRhdG9yU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3V0aWwvVHJpbmlkYWRVdGlscy5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdXRpbC9UcmluaWRhZFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNjM4MzIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdXRpbC9UcmluaWRhZFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LmNvcmUub3V0cHV0LkNvcmVPdXRwdXRMYWJlbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJjaGVjayBzdWJmb3JtIikNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRVdGlscw0KLXsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coVHJpbmlkYWRVdGlscy5jbGFzcyk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVUlDb21wb25lbnQgZmluZExhYmVsZWRFZGl0YWJsZUNvbXBvbmVudChDb3JlT3V0cHV0TGFiZWwgY29yZU91dHB1dExhYmVsKQ0KLSAgICB7DQotICAgICAgICAvL1RPRE8NCi0gICAgICAgIGlmKGlzTGFiZWxUYXJnZXRBdmFpbGFibGUoY29yZU91dHB1dExhYmVsKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBVSUNvbXBvbmVudCByZXN1bHQgPSByZXNvbHZlTGFiZWxUYXJnZXQoZmFjZXNDb250ZXh0LCBjb3JlT3V0cHV0TGFiZWwpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoTE9HLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgTE9HLnRyYWNlKGNvcmVPdXRwdXRMYWJlbC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpICsgIiBkb2Vzbid0IHJlZmVyZW5jZSBhbiBlZGl0YWJsZSBjb21wb25lbnQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFVJQ29tcG9uZW50IHJlc29sdmVMYWJlbFRhcmdldChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBDb3JlT3V0cHV0TGFiZWwgY29yZU91dHB1dExhYmVsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZmluZENvbXBvbmVudChjb3JlT3V0cHV0TGFiZWwuZ2V0Rm9yKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMYWJlbFRhcmdldEF2YWlsYWJsZShDb3JlT3V0cHV0TGFiZWwgY29yZU91dHB1dExhYmVsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY29yZU91dHB1dExhYmVsLmdldEZvcigpID09IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkRmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2MyMWNjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZEZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci50cmluaWRhZC52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRGYWNlc01lc3NhZ2VGYWN0b3J5IGV4dGVuZHMgRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xhYmVsZWRGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIFRyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2Uoc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJpbmlkYWQvdmFsaWRhdGlvbi9tZXNzYWdlL1RyaW5pZGFkVmlvbGF0aW9uTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmU2OTNiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RyaW5pZGFkL3ZhbGlkYXRpb24vbWVzc2FnZS9UcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudHJpbmlkYWQudmFsaWRhdGlvbi5tZXNzYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuTGFiZWxlZE1lc3NhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC51dGlsLkxhYmVsZWRGYWNlc01lc3NhZ2U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBUcmluaWRhZFZpb2xhdGlvbk1lc3NhZ2UgZXh0ZW5kcyBMYWJlbGVkRmFjZXNNZXNzYWdlIGltcGxlbWVudHMgTGFiZWxlZE1lc3NhZ2UNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYzNTY4MDA2ODk5NjE1MDUxNTRMOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX1JFU09VUkNFX01BUktFUiA9ICI/Pz8iOw0KLQ0KLSAgICBwdWJsaWMgVHJpbmlkYWRWaW9sYXRpb25NZXNzYWdlKFNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgc3VwZXIoc2V2ZXJpdHksIHN1bW1hcnksIGRldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TGFiZWxBc1N0cmluZyhGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN1bW1hcnkoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UgcmVzdWx0ID0gdHJ5VG9QbGFjZUxhYmVsKHN1cGVyLmdldFN1bW1hcnkoKSk7DQotDQotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3VwZXIuc2V0U3VtbWFyeShyZXN1bHQuZ2V0U3VtbWFyeSgpKTsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmdldFN1bW1hcnkoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRTdW1tYXJ5KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGV0YWlsKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlIHJlc3VsdCA9IHRyeVRvUGxhY2VMYWJlbChzdXBlci5nZXREZXRhaWwoKSk7DQotDQotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3VwZXIuc2V0RGV0YWlsKHJlc3VsdC5nZXREZXRhaWwoKSk7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5nZXREZXRhaWwoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5nZXREZXRhaWwoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEZhY2VzTWVzc2FnZSB0cnlUb1BsYWNlTGFiZWwoU3RyaW5nIG9yaWdpbmFsTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYgKGlzVmFsaWRNZXNzYWdlKG9yaWdpbmFsTWVzc2FnZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgRmFjZXNNZXNzYWdlIG5ld0ZhY2VzTWVzc2FnZSA9IGNyZWF0ZU9yaWdpbmFsRmFjZXNNZXNzYWdlKCk7DQotICAgICAgICAgICAgdHJ5VG9QbGFjZUxhYmVsSW4obmV3RmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICByZXR1cm4gbmV3RmFjZXNNZXNzYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBGYWNlc01lc3NhZ2UgY3JlYXRlT3JpZ2luYWxGYWNlc01lc3NhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEZhY2VzTWVzc2FnZShzdXBlci5nZXRTZXZlcml0eSgpLCBzdXBlci5nZXRTdW1tYXJ5KCksIHN1cGVyLmdldERldGFpbCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9QbGFjZUxhYmVsSW4oRmFjZXNNZXNzYWdlIG5ld0ZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGxhYmVsID0gZ2V0TGFiZWxUZXh0KCk7DQotDQotICAgICAgICBpZihsYWJlbCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9QbGFjZUxhYmVsKG5ld0ZhY2VzTWVzc2FnZSwgbGFiZWwsIGkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZE1lc3NhZ2UoU3RyaW5nIG9yaWdpbmFsTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICEob3JpZ2luYWxNZXNzYWdlICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgb3JpZ2luYWxNZXNzYWdlLnN0YXJ0c1dpdGgoTUlTU0lOR19SRVNPVVJDRV9NQVJLRVIpICYmDQotICAgICAgICAgICAgICAgIG9yaWdpbmFsTWVzc2FnZS5lbmRzV2l0aChNSVNTSU5HX1JFU09VUkNFX01BUktFUikpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgbGFiZWwpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldExhYmVsKGxhYmVsKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29tcG9uZW50LXN1cHBvcnQvdHJpbmlkYWQtc3VwcG9ydC9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYxY2Y5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb21wb25lbnQtc3VwcG9ydC90cmluaWRhZC1zdXBwb3J0L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMjhjMmUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvbXBvbmVudC1zdXBwb3J0L3RyaW5pZGFkLXN1cHBvcnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZQ0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBUcmluaWRhZCBTdXBwb3J0IE1vZHVsZSBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIFRyaW5pZGFkIFN1cHBvcnQgTW9kdWxlIHByb3ZpZGVzIHNwZWNpYWwgVHJpbmlkYWQgU3VwcG9ydCBmb3IgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvci4NCi0gICAgRnVydGhlcm1vcmUsIGl0IGFsbG93cyB0byBqb2luIHRoZSBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIG1lY2hhbmlzbSBvZiBUcmluaWRhZC4gU2FtcGxlIHVzZS1jYXNlOiBhbm5vdGF0ZSB5b3VyIG1vZGVsIHdpdGggSlBBIDEuMCBhbm5vdGF0aW9ucywgYmluZCBwcm9wZXJ0aWVzIHRvIEpTRiBJbnB1dCBjb21wb25lbnRzIGFuZCBnZXQgYXV0b21hdGljIGNsaWVudC1zaWRlIHZhbGlkYXRpb24ganVzdCBieSBhZGRpbmcgMyBKQVIgZmlsZXMgKE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSwgUHJvcGVydHkgVmFsaWRhdGlvbiBhbmQgVHJpbmlkYWQgU3VwcG9ydCkuDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLnggYW5kIEpTRiAyLnguIEFsbCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3BvbS54bWwgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjY3ZDllLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4wLjM8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIENvcmU8L25hbWU+Ci0gICAgPHZlcnNpb24+Mi4wLjM8L3ZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RhZ3MvMl8wXzM8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8yXzBfMzwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGFncy8yXzBfMzwvdXJsPgotICAgIDwvc2NtPgotICAgIAotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MTk1NmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18yXzAueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMi4wIj4NCi0gICAgPGZhY3Rvcnk+DQotICAgICAgICA8cmVuZGVyLWtpdC1mYWN0b3J5Pm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5FeHRWYWxSZW5kZXJLaXRGYWN0b3J5PC9yZW5kZXIta2l0LWZhY3Rvcnk+DQotICAgIDwvZmFjdG9yeT4NCi0NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkV4dFZhbFN0YXJ0dXBMaXN0ZW5lcjwvcGhhc2UtbGlzdGVuZXI+DQotICAgIDwvbGlmZWN5Y2xlPg0KLTwvZmFjZXMtY29uZmlnPg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvRXh0VmFsSW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkNWQxYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9FeHRWYWxJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotDQotLyoqDQotICogZG9udCd0IG1vdmUgdG8gYW4gb3RoZXIgcGFja2FnZSEhIQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIEV4dFZhbEluZm9ybWF0aW9uDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FID0gRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJYTUxfUEFSQU1fUFJFRklYID0gRXh0VmFsSW5mb3JtYXRpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gQ2xhc3NVdGlscy5nZXRKYXJWZXJzaW9uKEV4dFZhbEluZm9ybWF0aW9uLmNsYXNzKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9DdXN0b21JbmZvcm1hdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9DdXN0b21JbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmRhMzllLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvQ3VzdG9tSW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkNCi1wdWJsaWMgZW51bSBDdXN0b21JbmZvcm1hdGlvbg0KLXsNCi0gICAgQkFTRV9QQUNLQUdFLA0KLQ0KLSAgICBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUiwNCi0gICAgVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SLA0KLQ0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgsDQotICAgIFZBTElEQVRJT05fRVJST1JfTUVTU0FHRV9SRVNPTFZFUl9QT1NURklYLA0KLSAgICBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfUE9TVEZJWCwNCi0NCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9UT19NU0dfUkVTT0xWRVJfTkFNRV9NQVBQRVIsDQotICAgIE1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSLA0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUiwNCi0NCi0gICAgU1RBUlRVUF9MSVNURU5FUiwNCi0gICAgQ09NUE9ORU5UX0lOSVRJQUxJWkVSLA0KLSAgICBWQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgUFJPUEVSVFlfVkFMSURBVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IsDQotDQotICAgIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwNCi0gICAgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZLA0KLSAgICBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLA0KLSAgICBWQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWSwNCi0gICAgVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWSwNCi0gICAgTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlksDQotICAgIEZBQ0VTX01FU1NBR0VfRkFDVE9SWSwNCi0gICAgU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlksDQotDQotICAgIE1FU1NBR0VfQlVORExFX05BTUUsDQotICAgIFNUQVRJQ19TVFJBVEVHWV9NQVBQSU5HX1NPVVJDRSwNCi0NCi0gICAgTUVUQV9EQVRBX1NUT1JBR0VfRklMVEVSDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0RlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzRkMTBhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFByb2plY3RTdGFnZVJlc29sdmVyIGltcGxlbWVudHMgUHJvamVjdFN0YWdlUmVzb2x2ZXINCi17DQotICAgIHB1YmxpYyBQcm9qZWN0U3RhZ2UgZ2V0Q3VycmVudFByb2plY3RTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgdXNlIHRoZSBkZWZhdWx0IGV4dHZhbCBtZWNoYW5pc20gdG8gYXZvaWQgdG9vIGVhcmx5IGV2YWx1YXRpb24gd2l0aCBtb2phcnJhDQotICAgICAgICBTdHJpbmcgcmVzdWx0Ow0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEFwcGxpY2F0aW9uKCkuZ2V0UHJvamVjdFN0YWdlKCkudG9TdHJpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlUHJvamVjdFN0YWdlKGdldERlZmF1bHRQcm9qZWN0U3RhZ2UoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCB8fCAiIi5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlUHJvamVjdFN0YWdlKGdldERlZmF1bHRQcm9qZWN0U3RhZ2UoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY3JlYXRlUHJvamVjdFN0YWdlKFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUocmVzdWx0LnRyaW0oKSkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBQcm9qZWN0U3RhZ2UgY3JlYXRlUHJvamVjdFN0YWdlKFByb2plY3RTdGFnZU5hbWUgcHJvamVjdFN0YWdlTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZShwcm9qZWN0U3RhZ2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFByb2plY3RTdGFnZU5hbWUgZ2V0RGVmYXVsdFByb2plY3RTdGFnZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXREZWZhdWx0U3RhZ2VOYW1lKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4OTViZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0V4dFZhbENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRGVmYXVsdEZhY3RvcnlGaW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5RmluZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUmVuZGVyZXJJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZWNvcmRlci5Qcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBFeHRWYWxDb250ZXh0Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBFeHRWYWxDb250ZXh0IGV4dFZhbENvbnRleHQ7Ci0KLSAgICAvL2Rvbid0IHRyeSB0byByZXNvbHZlIGl0IGR5bmFtaWNhbGx5IGUuZy4gdmlhIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIC0gdGhlcmUncyBhIG1vamFycmEgaXNzdWUKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0VYVFZBTF9DT05URVhUX0NMQVNTX05BTUUgPQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5jbGFzcy5nZXROYW1lKCkucmVwbGFjZSgiLmNvcmUuIiwgIi5jdXN0b20uIik7Ci0KLSAgICBwcml2YXRlIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgdmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsKLSAgICBwcml2YXRlIEZhY3RvcnlGaW5kZXIgZmFjdG9yeUZpbmRlciA9IERlZmF1bHRGYWN0b3J5RmluZGVyLmdldEluc3RhbmNlKCk7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZW5kZXJlckludGVyY2VwdG9yPiByZW5kZXJlckludGVyY2VwdG9ycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUmVuZGVyZXJJbnRlcmNlcHRvcj4oKTsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBkZW5pZWRJbnRlcmNlcHRvcnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICBwcml2YXRlIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcj4gcHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMgPQotICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyPigpOwotCi0gICAgcHJpdmF0ZSBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvciBza2lwVmFsaWRhdGlvbkV2YWx1YXRvcjsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBnbG9iYWxQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLSAgICBwcml2YXRlIE1hcDxTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMsIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+PiBzdGF0aWNDb25maWdNYXAKLSAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLCBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+Pj4oKTsKLQotICAgIHByaXZhdGUgRXh0VmFsQ29udGV4dEludGVybmFscyBjb250ZXh0SGVscGVyOwotICAgIHByaXZhdGUgRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzIGludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlcjsKLQotICAgIHByb3RlY3RlZCBFeHRWYWxDb250ZXh0KCkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29udGV4dEhlbHBlciA9IG5ldyBFeHRWYWxDb250ZXh0SW50ZXJuYWxzKCk7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyID0gbmV3IEV4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscyh0aGlzLmNvbnRleHRIZWxwZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRXh0VmFsQ29udGV4dCBnZXRDb250ZXh0KCkKLSAgICB7Ci0gICAgICAgIGlmIChleHRWYWxDb250ZXh0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4dFZhbENvbnRleHQgPSBuZXcgRXh0VmFsQ29udGV4dCgpOwotCi0gICAgICAgICAgICB0cnlUb0NyZWF0ZUN1c3RvbUV4dFZhbENvbnRleHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXh0VmFsQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRyeVRvQ3JlYXRlQ3VzdG9tRXh0VmFsQ29udGV4dCgpCi0gICAgewotICAgICAgICBPYmplY3QgY3VzdG9tRXh0VmFsQ29udGV4dCA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShDVVNUT01fRVhUVkFMX0NPTlRFWFRfQ0xBU1NfTkFNRSk7Ci0KLSAgICAgICAgaWYgKGN1c3RvbUV4dFZhbENvbnRleHQgaW5zdGFuY2VvZiBFeHRWYWxDb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBleHRWYWxDb250ZXh0ID0gKEV4dFZhbENvbnRleHQpIGN1c3RvbUV4dFZhbENvbnRleHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgdmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcikKLSAgICB7Ci0gICAgICAgIHNldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIodmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigKLSAgICAgICAgICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgdmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciwgYm9vbGVhbiBmb3JjZU92ZXJyaWRlKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMudmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciA9PSBudWxsIHx8IGZvcmNlT3ZlcnJpZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc0luZm9FbmFibGVkKCkgJiYgdmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8odmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlci5nZXRDbGFzcygpICsgIiBpcyB1c2VkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgPSB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpCi0gICAgewotICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHJlcXVlc3RTY29wZWRJbnRlcnByZXRlciA9IHRoaXMuY29udGV4dEhlbHBlcgotICAgICAgICAgICAgICAgIC5nZXRSZXF1ZXN0U2NvcGVkVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOwotCi0gICAgICAgIGlmKHJlcXVlc3RTY29wZWRJbnRlcnByZXRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVxdWVzdFNjb3BlZEludGVycHJldGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMudmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICogRmFjdG9yeUZpbmRlcgotICAgICovCi0gICAgcHVibGljIEZhY3RvcnlGaW5kZXIgZ2V0RmFjdG9yeUZpbmRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5mYWN0b3J5RmluZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZhY3RvcnlGaW5kZXIoRmFjdG9yeUZpbmRlciBmYWN0b3J5RmluZGVyKQotICAgIHsKLSAgICAgICAgaWYgKGZhY3RvcnlGaW5kZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5mYWN0b3J5RmluZGVyID0gZmFjdG9yeUZpbmRlcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcihTa2lwVmFsaWRhdGlvbkV2YWx1YXRvciBza2lwVmFsaWRhdGlvbkV2YWx1YXRvcikKLSAgICB7Ci0gICAgICAgIHNldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcihTa2lwVmFsaWRhdGlvbkV2YWx1YXRvciBza2lwVmFsaWRhdGlvbkV2YWx1YXRvciwgYm9vbGVhbiBmb3JjZU92ZXJyaWRlKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMuc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IgPT0gbnVsbCB8fCBmb3JjZU92ZXJyaWRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpICYmIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhza2lwVmFsaWRhdGlvbkV2YWx1YXRvci5nZXRDbGFzcygpICsgIiBpcyB1c2VkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLnNraXBWYWxpZGF0aW9uRXZhbHVhdG9yID0gc2tpcFZhbGlkYXRpb25FdmFsdWF0b3I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IgZ2V0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMuc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gc2tpcFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwgTWV0YURhdGFFbnRyeSBlbnRyeSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMuc2tpcFZhbGlkYXRpb25FdmFsdWF0b3I7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZW5kZXJlckludGVyY2VwdG9ycwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFJlbmRlcmVySW50ZXJjZXB0b3I+IGdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFJlbmRlcmVySW50ZXJjZXB0b3I+KHRoaXMucmVuZGVyZXJJbnRlcmNlcHRvcnMudmFsdWVzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKEV4dFZhbENvbnRleHQuY2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmRlbmllZEludGVyY2VwdG9ycy5jb250YWlucyhyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLnJlbmRlcmVySW50ZXJjZXB0b3JzLnB1dChyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSwgcmVuZGVyZXJJbnRlcmNlcHRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVyZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IoQ2xhc3M8PyBleHRlbmRzIFJlbmRlcmVySW50ZXJjZXB0b3I+IHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcykKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcyk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChFeHRWYWxDb250ZXh0LmNsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnJlbmRlcmVySW50ZXJjZXB0b3JzLnJlbW92ZShyZW5kZXJlckludGVyY2VwdG9yLmdldEludGVyY2VwdG9ySWQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvL2lmIGFuIGludGVyY2VwdG9yIGhhc24ndCBiZWVuIHJlZ2lzdGVyZWQgc28gZmFyLCBpdCBzaG91bGQgYmUgZGVuaWVkIGF0IGZ1dHVyZSByZWdpc3RyYXRpb25zCi0gICAgcHVibGljIHZvaWQgZGVueVJlbmRlcmVySW50ZXJjZXB0b3IoQ2xhc3M8PyBleHRlbmRzIFJlbmRlcmVySW50ZXJjZXB0b3I+IHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcykKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzKHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcyk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChFeHRWYWxDb250ZXh0LmNsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMuZGVuaWVkSW50ZXJjZXB0b3JzLmNvbnRhaW5zKHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0SW50ZXJjZXB0b3JJZCgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmRlbmllZEludGVyY2VwdG9ycy5hZGQocmVuZGVyZXJJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcklkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRlcmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKHJlbmRlcmVySW50ZXJjZXB0b3JDbGFzcyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDb21wb25lbnRJbml0aWFsaXplcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDb21wb25lbnRJbml0aWFsaXplcihDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplcikKLSAgICB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmxhenlJbml0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmFkZENvbXBvbmVudEluaXRpYWxpemVyKGNvbXBvbmVudEluaXRpYWxpemVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4gZ2V0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCkKLSAgICB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmxhenlJbml0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCk7Ci0gICAgICAgIHJldHVybiB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5nZXRDb21wb25lbnRJbml0aWFsaXplcnMoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmxhenlJbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+IGdldFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHJldHVybiB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5nZXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcihQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmxhenlJbml0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGFsbCBnbG9iYWwgdmFsaWRhdGlvbiBpbnRlcmNlcHRvcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmxhenlJbml0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHJldHVybiB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5nZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzRm9yKENsYXNzIG1vZHVsZUtleSkKLSAgICB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmxhenlJbml0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHJldHVybiB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5nZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnNGb3IobW9kdWxlS2V5KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIubGF6eUluaXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYWxsIGdsb2JhbCBtZXRhLWRhdGEgZXh0cmFjdGlvbiBpbnRlcmNlcHRvcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIHRoaXMuaW52b2NhdGlvbk9yZGVyQXdhcmVDb250ZXh0SGVscGVyLmxhenlJbml0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIHJldHVybiB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5nZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzRm9yKENsYXNzIG1vZHVsZUtleSkKLSAgICB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgICAgIGlmKG1vZHVsZUtleSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzLmdldE5hbWUoKSwgbW9kdWxlS2V5KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzV2l0aChwcm9wZXJ0aWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzV2l0aChNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICB0aGlzLmludm9jYXRpb25PcmRlckF3YXJlQ29udGV4dEhlbHBlci5sYXp5SW5pdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpOwotICAgICAgICByZXR1cm4gdGhpcy5pbnZvY2F0aW9uT3JkZXJBd2FyZUNvbnRleHRIZWxwZXIuZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzV2l0aChwcm9wZXJ0aWVzKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcj4gZ2V0UHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcihQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyIHByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIpCi0gICAgewotICAgICAgICB0aGlzLnByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzLmFkZChwcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuCi0gICAgICovCi0gICAgcHVibGljIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHRIZWxwZXIuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFN0YXRpY0NvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4gZ2V0U3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMgbmFtZSkKLSAgICB7Ci0gICAgICAgIGlmICghdGhpcy5zdGF0aWNDb25maWdNYXAuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4+IHN0YXRpY0NvbmZpZ0xpc3QgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICAgICAgdGhpcy5zdGF0aWNDb25maWdNYXAucHV0KG5hbWUsIHN0YXRpY0NvbmZpZ0xpc3QpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnN0YXRpY0NvbmZpZ01hcC5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkU3RhdGljQ29uZmlndXJhdGlvbihTdGF0aWNDb25maWd1cmF0aW9uTmFtZXMgbmFtZSwgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4gc3RhdGljQ29uZmlnKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBzdGF0aWNDb25maWdMaXN0OwotICAgICAgICAgICAgaWYgKCF0aGlzLnN0YXRpY0NvbmZpZ01hcC5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0aWNDb25maWdMaXN0ID0gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPj4oKTsKLSAgICAgICAgICAgICAgICB0aGlzLnN0YXRpY0NvbmZpZ01hcC5wdXQobmFtZSwgc3RhdGljQ29uZmlnTGlzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLnN0YXRpY0NvbmZpZ01hcC5nZXQobmFtZSkuYWRkKHN0YXRpY0NvbmZpZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEdsb2JhbCBwcm9wZXJ0aWVzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYWRkR2xvYmFsUHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhZGRHbG9iYWxQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYWRkR2xvYmFsUHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBmb3JjZU92ZXJyaWRlKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMuZ2xvYmFsUHJvcGVydGllcy5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFmb3JjZU92ZXJyaWRlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRoaXMubG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCJvdmVycmlkZSBnbG9iYWwgcHJvcGVydHkgJyIgKyBuYW1lICsgIiciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKEpzZlByb2plY3RTdGFnZS5pcyhKc2ZQcm9qZWN0U3RhZ2UuRGV2ZWxvcG1lbnQpICYmIHRoaXMubG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygiZ2xvYmFsIHByb3BlcnR5IFsiICsgbmFtZSArICJdIGFkZGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmdsb2JhbFByb3BlcnRpZXMucHV0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRHbG9iYWxQcm9wZXJ0eShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLmdsb2JhbFByb3BlcnRpZXMuZ2V0KG5hbWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dEludGVybmFscy5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0SW50ZXJuYWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyY2ZkNWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0SW50ZXJuYWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSB4LnguMwotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotY2xhc3MgRXh0VmFsQ29udGV4dEludGVybmFscwotewotICAgIGJvb2xlYW4gaXNDb21wb25lbnRJbml0aWFsaXphdGlvbkFjdGl2YXRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gISJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NPTVBPTkVOVF9JTklUSUFMSVpBVElPTik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkKLSAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBpbml0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oTWFwIGFwcGxpY2F0aW9uTWFwKQotICAgIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9JTkZPUk1BVElPTl9QUk9WSURFUl9CRUFOKTsKLSAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVzLmFkZChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5DVVNUT01fQkVBTik7Ci0KLSAgICAgICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gaW5mb3JtYXRpb25Qcm92aWRlckJlYW47Ci0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgaW5mb3JtYXRpb25Qcm92aWRlckJlYW4gPSAoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4pIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOwotCi0gICAgICAgICAgICBpZiAoaW5mb3JtYXRpb25Qcm92aWRlckJlYW4gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbk1hcC5wdXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FLCBpbmZvcm1hdGlvblByb3ZpZGVyQmVhbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluZm9ybWF0aW9uUHJvdmlkZXJCZWFuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5VG9Jbml0Q3VzdG9tQ29uZmlndXJlZEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lKGFwcGxpY2F0aW9uTWFwKTsKLQotICAgICAgICBpZiAoYXBwbGljYXRpb25NYXAuY29udGFpbnNLZXkoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgYXBwbGljYXRpb25NYXAuZ2V0KEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkJFQU5fTkFNRSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pCi0gICAgdm9pZCB0cnlUb0luaXRDdXN0b21Db25maWd1cmVkSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWUoTWFwIGFwcGxpY2F0aW9uTWFwKQotICAgIHsKLSAgICAgICAgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4gYmVhbiA9IChJbmZvcm1hdGlvblByb3ZpZGVyQmVhbikgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKQotICAgICAgICAgICAgICAgIC5nZXRCZWFuKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLkNVU1RPTV9CRUFOLnJlcGxhY2UoIi4iLCAiXyIpKTsKLQotICAgICAgICBpZiAoYmVhbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcHBsaWNhdGlvbk1hcC5wdXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FLCBiZWFuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuIGdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICB7Ci0gICAgICAgIE1hcCBhcHBsaWNhdGlvbk1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbk1hcCgpOwotICAgICAgICBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbiBiZWFuID0gKEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKSBhcHBsaWNhdGlvbk1hcC5nZXQoSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uQkVBTl9OQU1FKTsKLQotICAgICAgICBpZiAoYmVhbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW5pdEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKGFwcGxpY2F0aW9uTWFwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmVhbjsKLSAgICB9Ci0KLSAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGdldFJlcXVlc3RTY29wZWRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKAotICAgICAgICAgICAgICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmNsYXNzLCBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpCi0gICAgICAgICAgICAgICAgLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0SW52b2NhdGlvbk9yZGVyQXdhcmVJbnRlcm5hbHMuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvRXh0VmFsQ29udGV4dEludm9jYXRpb25PcmRlckF3YXJlSW50ZXJuYWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOTM2NmMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9FeHRWYWxDb250ZXh0SW52b2NhdGlvbk9yZGVyQXdhcmVJbnRlcm5hbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbXBvbmVudC5Db21wb25lbnRJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgeC54LjMKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIEV4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscwotewotICAgIHByaXZhdGUgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMgPSBudWxsOwotICAgIHByaXZhdGUgTWFwPENsYXNzLCBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPj4gbW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMgPSBudWxsOwotICAgIHByaXZhdGUgTGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+IHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMgPSBudWxsOwotICAgIHByaXZhdGUgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0gbnVsbDsKLSAgICBwcml2YXRlIE1hcDxDbGFzcywgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4+IG1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0gbnVsbDsKLSAgICBwcml2YXRlIExpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+IGNvbXBvbmVudEluaXRpYWxpemVycyA9IG51bGw7Ci0KLSAgICBwcml2YXRlIEV4dFZhbENvbnRleHRJbnRlcm5hbHMgY29udGV4dEhlbHBlcjsKLQotICAgIEV4dFZhbENvbnRleHRJbnZvY2F0aW9uT3JkZXJBd2FyZUludGVybmFscyhFeHRWYWxDb250ZXh0SW50ZXJuYWxzIGNvbnRleHRIZWxwZXIpCi0gICAgewotICAgICAgICB0aGlzLmNvbnRleHRIZWxwZXIgPSBjb250ZXh0SGVscGVyOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ29tcG9uZW50SW5pdGlhbGl6ZXJzCi0gICAgICovCi0gICAgdm9pZCBhZGRDb21wb25lbnRJbml0aWFsaXplcihDb21wb25lbnRJbml0aWFsaXplciBjb21wb25lbnRJbml0aWFsaXplcikKLSAgICB7Ci0gICAgICAgIHRoaXMuY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChjb21wb25lbnRJbml0aWFsaXplcik7Ci0gICAgICAgIHNvcnRDb21wb25lbnRJbml0aWFsaXplcnMoKTsKLSAgICB9Ci0KLSAgICBMaXN0PENvbXBvbmVudEluaXRpYWxpemVyPiBnZXRDb21wb25lbnRJbml0aWFsaXplcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dEhlbHBlci5pc0NvbXBvbmVudEluaXRpYWxpemF0aW9uQWN0aXZhdGVkKCkgPwotICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50SW5pdGlhbGl6ZXJzIDogbmV3IEFycmF5TGlzdDxDb21wb25lbnRJbml0aWFsaXplcj4oKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMKLSAgICAgKi8KLSAgICB2b2lkIGFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcihWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgdGhpcy52YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzLmFkZCh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpOwotICAgICAgICBzb3J0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpOwotICAgIH0KLQotICAgIExpc3Q8VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yPiBnZXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMKLSAgICAgKi8KLSAgICB2b2lkIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgaWYgKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIGluc3RhbmNlb2YgVmFsaWRhdGlvbk1vZHVsZUF3YXJlKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckZvck1vZHVsZXMocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOwotICAgICAgICAgICAgc29ydE1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckZvck1vZHVsZShudWxsLCBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgICAgICBzb3J0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBnZXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IGdldFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yc0ZvcihDbGFzcyBtb2R1bGVLZXkpCi0gICAgewotICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPigpOwotCi0gICAgICAgIHJlc3VsdC5hZGRBbGwoZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkpOwotCi0gICAgICAgIGlmIChtb2R1bGVLZXkgIT0gbnVsbCAmJiB0aGlzLm1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzLmNvbnRhaW5zS2V5KG1vZHVsZUtleSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodGhpcy5tb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5nZXQobW9kdWxlS2V5KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNvcnRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QocmVzdWx0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGVzKFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgQ2xhc3MgbW9kdWxlS2V5OwotICAgICAgICBmb3IgKFN0cmluZyBjdXJyZW50TW9kdWxlS2V5IDogKChWYWxpZGF0aW9uTW9kdWxlQXdhcmUpIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKS5nZXRNb2R1bGVLZXlzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vZHVsZUtleSA9IENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKGN1cnJlbnRNb2R1bGVLZXkpOwotCi0gICAgICAgICAgICBpZiAobW9kdWxlS2V5ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlKG1vZHVsZUtleSwgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlKAotICAgICAgICAgICAgQ2xhc3MgbW9kdWxlS2V5LCBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIGlmIChtb2R1bGVLZXkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMuYWRkKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsKLQotICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQgYXMgZ2xvYmFsIGludGVyY2VwdG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3Q7Ci0gICAgICAgICAgICBpZiAodGhpcy5tb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycy5jb250YWluc0tleShtb2R1bGVLZXkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdCA9IHRoaXMubW9kdWxlU3BlY2lmaWNQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMuZ2V0KG1vZHVsZUtleSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4oKTsKLSAgICAgICAgICAgICAgICB0aGlzLm1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzLnB1dChtb2R1bGVLZXksIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QuYWRkKHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKTsKLQotICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQgZm9yICIgKyBtb2R1bGVLZXkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzCi0gICAgICovCi0gICAgdm9pZCBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIGlmKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIGluc3RhbmNlb2YgVmFsaWRhdGlvbk1vZHVsZUF3YXJlKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckZvck1vZHVsZXMobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpOwotICAgICAgICAgICAgc29ydE1vZHVsZVNwZWNpZmljTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckZvck1vZHVsZShudWxsLCBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgICAgICBzb3J0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JGb3JNb2R1bGVzKE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKQotICAgIHsKLSAgICAgICAgQ2xhc3MgbW9kdWxlS2V5OwotICAgICAgICBmb3IgKFN0cmluZyBjdXJyZW50TW9kdWxlS2V5IDogKChWYWxpZGF0aW9uTW9kdWxlQXdhcmUpIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKS5nZXRNb2R1bGVLZXlzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vZHVsZUtleSA9IENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKGN1cnJlbnRNb2R1bGVLZXkpOwotCi0gICAgICAgICAgICBpZiAobW9kdWxlS2V5ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlKG1vZHVsZUtleSwgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yRm9yTW9kdWxlKAotICAgICAgICAgICAgQ2xhc3MgbW9kdWxlS2V5LCBNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvciBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcikKLSAgICB7Ci0gICAgICAgIGlmIChtb2R1bGVLZXkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5tZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMuYWRkKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsKLQotICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQgYXMgZ2xvYmFsIGludGVyY2VwdG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3Q7Ci0gICAgICAgICAgICBpZiAodGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5jb250YWluc0tleShtb2R1bGVLZXkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdCA9IHRoaXMubW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMuZ2V0KG1vZHVsZUtleSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4oKTsKLSAgICAgICAgICAgICAgICB0aGlzLm1vZHVsZVNwZWNpZmljTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzLnB1dChtb2R1bGVLZXksIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QuYWRkKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKTsKLQotICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYWRkZWQgZm9yICIgKyBtb2R1bGVLZXkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IGdldE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5tZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnM7Ci0gICAgfQotCi0gICAgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzV2l0aChNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICBMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPigpOwotCi0gICAgICAgIHJlc3VsdC5hZGRBbGwoZ2V0TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkpOwotCi0gICAgICAgIENsYXNzIG1vZHVsZUtleSA9IHRyeVRvUmVzb2x2ZU1vZHVsZUtleShwcm9wZXJ0aWVzKTsKLSAgICAgICAgaWYobW9kdWxlS2V5ICE9IG51bGwgJiYgdGhpcy5tb2R1bGVTcGVjaWZpY01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycy5jb250YWluc0tleShtb2R1bGVLZXkpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRoaXMubW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMuZ2V0KG1vZHVsZUtleSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNvcnRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QocmVzdWx0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENsYXNzIHRyeVRvUmVzb2x2ZU1vZHVsZUtleShNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICBDbGFzcyBtb2R1bGVLZXkgPSBudWxsOwotICAgICAgICBpZihwcm9wZXJ0aWVzICE9IG51bGwgJiYgcHJvcGVydGllcy5jb250YWluc0tleShWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzLmdldE5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBmb3VuZFZhbHVlID0gcHJvcGVydGllcy5nZXQoVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgaWYoZm91bmRWYWx1ZSBpbnN0YW5jZW9mIENsYXNzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vZHVsZUtleSA9IChDbGFzcylmb3VuZFZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtb2R1bGVLZXk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBpbml0Ci0gICAgICovCi0KLSAgICB2b2lkIGxhenlJbml0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBpZiAodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzID0gbmV3IEFycmF5TGlzdDxWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I+KCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUik7Ci0gICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKHRoaXMuY29udGV4dEhlbHBlci5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SKSk7Ci0KLSAgICAgICAgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsKLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSA6IHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgIChWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUpOwotCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycy5hZGQodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKTsKLQotICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBsYXp5SW5pdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBpZiAobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+KCk7Ci0gICAgICAgIG1vZHVsZVNwZWNpZmljTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzID0gbmV3IEhhc2hNYXA8Q2xhc3MsIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+PigpOwotCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IpOwotICAgICAgICBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKHRoaXMuY29udGV4dEhlbHBlci5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpLmdldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SKSk7Ci0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7Ci0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvck5hbWUgOiBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckNsYXNzTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yID0KLSAgICAgICAgICAgICAgICAgICAgKE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZSh2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JOYW1lKTsKLQotICAgICAgICAgICAgaWYgKG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBsYXp5SW5pdENvbXBvbmVudEluaXRpYWxpemVycygpCi0gICAgewotICAgICAgICBpZiAoY29tcG9uZW50SW5pdGlhbGl6ZXJzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVycyA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50SW5pdGlhbGl6ZXI+KCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVzCi0gICAgICAgICAgICAgICAgLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9JTklUSUFMSVpFUik7Ci0gICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQodGhpcy5jb250ZXh0SGVscGVyLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9JTklUSUFMSVpFUikpOwotCi0gICAgICAgIENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyOwotICAgICAgICBmb3IgKFN0cmluZyBjb21wb25lbnRJbml0aWFsaXplck5hbWUgOiBjb21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbXBvbmVudEluaXRpYWxpemVyID0KLSAgICAgICAgICAgICAgICAgICAgKENvbXBvbmVudEluaXRpYWxpemVyKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY29tcG9uZW50SW5pdGlhbGl6ZXJOYW1lKTsKLQotICAgICAgICAgICAgaWYgKGNvbXBvbmVudEluaXRpYWxpemVyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXJzLmFkZChjb21wb25lbnRJbml0aWFsaXplcik7Ci0KLSAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoY29tcG9uZW50SW5pdGlhbGl6ZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBsYXp5SW5pdFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBpZiAocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+KCk7Ci0gICAgICAgIG1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0gbmV3IEhhc2hNYXA8Q2xhc3MsIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+PigpOwotCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgdmFsaWRhdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9QUk9QRVJUWV9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SKTsKLSAgICAgICAgdmFsaWRhdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcwotICAgICAgICAgICAgICAgIC5hZGQodGhpcy5jb250ZXh0SGVscGVyLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tSW5mb3JtYXRpb24uUFJPUEVSVFlfVkFMSURBVElPTl9JTlRFUkNFUFRPUikpOwotCi0gICAgICAgIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOwotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uSW50ZXJjZXB0b3JOYW1lIDogdmFsaWRhdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgPQotICAgICAgICAgICAgICAgICAgICAoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHZhbGlkYXRpb25JbnRlcmNlcHRvck5hbWUpOwotCi0gICAgICAgICAgICBpZiAocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uTW9kdWxlQXdhcmUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckZvck1vZHVsZXMocHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckZvck1vZHVsZShudWxsLCBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBzb3J0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNvcnRDb21wb25lbnRJbml0aWFsaXplcnMoKQotICAgIHsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0aGlzLmNvbXBvbmVudEluaXRpYWxpemVycywgbmV3IEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8Q29tcG9uZW50SW5pdGlhbGl6ZXI+KCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzb3J0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQodGhpcy5wcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMsCi0gICAgICAgICAgICAgICAgbmV3IEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+KCkpOwotICAgIH0KLQotICAgIC8vc29ydCBhbGwgLSBpdCBpc24ndCBhIGh1Z2Ugb3ZlcmhlYWQgc2luY2UgaXQncyBqdXN0IGRvbmUgZHVyaW5nIHRoZSBpbml0LXBoYXNlCi0gICAgcHJpdmF0ZSB2b2lkIHNvcnRNb2R1bGVTcGVjaWZpY1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycygpCi0gICAgewotICAgICAgICBmb3IoTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0IDoKLSAgICAgICAgICAgICAgICB0aGlzLm1vZHVsZVNwZWNpZmljUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzLnZhbHVlcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzb3J0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JMaXN0KHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHNvcnRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QoCi0gICAgICAgICAgICBMaXN0PFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yPiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3QpCi0gICAgewotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEludm9jYXRpb25PcmRlckNvbXBhcmF0b3I8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+KCkpOwotCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckxpc3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNvcnRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQodGhpcy52YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzLAotICAgICAgICAgICAgICAgIG5ldyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcj4oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNvcnRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0aGlzLm1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycywKLSAgICAgICAgICAgICAgICBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4oKSk7Ci0gICAgfQotCi0gICAgLy9zb3J0IGFsbCAtIGl0IGlzbid0IGEgaHVnZSBvdmVyaGVhZCBzaW5jZSBpdCdzIGp1c3QgZG9uZSBkdXJpbmcgdGhlIGluaXQtcGhhc2UKLSAgICBwcml2YXRlIHZvaWQgc29ydE1vZHVsZVNwZWNpZmljTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIGZvcihMaXN0PE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yPiBtZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QgOgotICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlU3BlY2lmaWNNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnMudmFsdWVzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNvcnRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckxpc3QobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdDxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4gc29ydE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdCgKLSAgICAgICAgICAgIExpc3Q8TWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I+IG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdCkKLSAgICB7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQobWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JMaXN0LAotICAgICAgICAgICAgICAgICAgICBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcj4oKSk7Ci0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yTGlzdDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbmZvcm1hdGlvblByb3ZpZGVyQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTU4N2E1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW5mb3JtYXRpb25Qcm92aWRlckJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcmVuJ3Qgc3ByZWFkIG92ZXIgdGhlIGNvbXBsZXRlIGNvZGUgYmFzZQ0KLSAqICsgc29tZSBvZiB0aGVtIGNhbiBiZSBjdXN0b21pemVkIHdpdGhpbiBhIGN1c3RvbSBpbXBsLiBvZiB0aGUgYmVhbg0KLSAqIChleHRlbmQgdGhpcyBjbGFzcyBhbmQgcHJvdmlkZSBpdCB2aWEgY29udmVudGlvbiBvciB3ZWIueG1sKQ0KLSAqIDxwLz4NCi0gKiB0aGUgc3RhdGljIGFwaSBzaG91bGQgb25seSBiZSB1c2VkDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEksIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgSW5mb3JtYXRpb25Qcm92aWRlckJlYW4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFQU5fTkFNRSA9IEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FDQotICAgICAgICArICIuIiArIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsNCi0gICAgLy9jdXN0b20gY2xhc3Mgd2hpY2ggaXMgYW4gb3B0aW9uYWwgcmVwbGFjZW1lbnQgZm9yIHRoaXMgY2xhc3MgKGhhcyB0byBleHRlbmQgdGhpcyBjbGFzcykNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0JFQU4gPSAoRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUNCi0gICAgICAgICsgIi5jdXN0b20uIiArIEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7DQotDQotICAgIHB1YmxpYyBJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotDQotICAgICAgICBzZXR1cEN1c3RvbWl6YWJsZUluZm9ybWF0aW9uKCk7DQotICAgICAgICBhcHBseUN1c3RvbVZhbHVlcyh0aGlzLmN1c3RvbWl6YWJsZUluZm9zKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxDdXN0b21JbmZvcm1hdGlvbiwgU3RyaW5nPiBjdXN0b21pemFibGVJbmZvcyA9IG5ldyBIYXNoTWFwPEN1c3RvbUluZm9ybWF0aW9uLCBTdHJpbmc+KCk7DQotDQotICAgIHByaXZhdGUgdm9pZCBzZXR1cEN1c3RvbWl6YWJsZUluZm9ybWF0aW9uKCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGJhc2VQYWNrYWdlID0gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9CQVNFX1BBQ0tBR0U7DQotDQotICAgICAgICBpZiAoYmFzZVBhY2thZ2UgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBiYXNlUGFja2FnZSA9IEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsgIi5jdXN0b20uIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghYmFzZVBhY2thZ2UuZW5kc1dpdGgoIi4iKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBiYXNlUGFja2FnZSA9IGJhc2VQYWNrYWdlICsgIi4iOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkJBU0VfUEFDS0FHRSwgYmFzZVBhY2thZ2UpOw0KLSAgICAgICAgDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IsDQotICAgICAgICAgICAgICAgICJDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUiwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1BPU1RGSVgsDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uU3RyYXRlZ3kiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfUE9TVEZJWCwNCi0gICAgICAgICAgICAgICAgIk1ldGFEYXRhVHJhbnNmb3JtZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWCwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlciIpOw0KLQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9JTklUSUFMSVpFUiwNCi0gICAgICAgICAgICAgICAgIkNvbXBvbmVudEluaXRpYWxpemVyIik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9FWENFUFRJT05fSU5URVJDRVBUT1IsDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5QUk9QRVJUWV9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SLA0KLSAgICAgICAgICAgICAgICAiUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5NRVRBX0RBVEFfRVhUUkFDVElPTl9JTlRFUkNFUFRPUiwNCi0gICAgICAgICAgICAgICAgIk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NU0dfUkVTT0xWRVJfTkFNRV9NQVBQRVIsDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlciIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUiwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIiKTsNCi0NCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5TVEFSVFVQX0xJU1RFTkVSLA0KLSAgICAgICAgICAgICAgICAiU3RhcnR1cExpc3RlbmVyIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiTWVzc2FnZVJlc29sdmVyRmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwNCi0gICAgICAgICAgICAgICAgIlZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeSIpOw0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkiKTsNCi0gICAgICAgIGN1c3RvbWl6YWJsZUluZm9zLnB1dChDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJGYWNlc01lc3NhZ2VGYWN0b3J5Iik7DQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlksDQotICAgICAgICAgICAgICAgICJTdG9yYWdlTWFuYWdlckZhY3RvcnkiKTsNCi0NCi0gICAgICAgIC8vY29udmVudGlvbnMgKHRoZSByZXN0IG9mIHRoZSBjb252ZW50aW9ucyBhcmUgYnVpbHQgd2l0aCB0aGUgaGVscCBvZiBuYW1lIG1hcHBlcnMsLi4uDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVTU0FHRV9CVU5ETEVfTkFNRSwNCi0gICAgICAgICAgICAgICAgInZhbGlkYXRpb25fbWVzc2FnZXMiKTsNCi0gICAgICAgIC8vc3RhdGljIHN0cmF0ZWd5IG1hcHBpbmdzIChuYW1lIG9mIHByb3BlcnR5IGZpbGVzKQ0KLSAgICAgICAgY3VzdG9taXphYmxlSW5mb3MucHV0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVRJQ19TVFJBVEVHWV9NQVBQSU5HX1NPVVJDRSwNCi0gICAgICAgICAgICAgICAgInN0cmF0ZWd5X21hcHBpbmdzIik7DQotDQotICAgICAgICBjdXN0b21pemFibGVJbmZvcy5wdXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1NUT1JBR0VfRklMVEVSLA0KLSAgICAgICAgICAgICAgICAiTWV0YURhdGFTdG9yYWdlRmlsdGVyIik7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcHBseUN1c3RvbVZhbHVlcyhNYXA8Q3VzdG9tSW5mb3JtYXRpb24sIFN0cmluZz4gbWFwKQ0KLSAgICB7DQotICAgICAgICAvL292ZXJyaWRlIHRvIGN1c3RvbWl6ZSBpbmZvcm1hdGlvbg0KLSAgICB9DQotDQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0KEN1c3RvbUluZm9ybWF0aW9uIGN1c3RvbUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBjdXN0b21pemFibGVJbmZvcy5nZXQoY3VzdG9tSW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgc3dpdGNoIChjdXN0b21JbmZvcm1hdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjYXNlIEJBU0VfUEFDS0FHRToNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICogcG9zdGZpeCB1c2VkIGJ5IHRoZSBTaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotICAgICAgICAgICAgICogdGhlIFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgaXMgZm9yIGN1c3RvbSBzdHJhdGVnaWVzIG9ubHkNCi0gICAgICAgICAgICAgKiAobm90IGZvciBwdWJsaWMgdmFsaWRhdGlvbiBtb2R1bGVzKQ0KLSAgICAgICAgICAgICAqIHNvIGl0J3MgZmluZSB0byBjdXN0b21pemUgaXQNCi0gICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICBjYXNlIFZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFX1JFU09MVkVSX1BPU1RGSVg6DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYOg0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotDQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbWl6YWJsZUluZm9zLmdldChDdXN0b21JbmZvcm1hdGlvbi5CQVNFX1BBQ0tBR0UpICsgdmFsdWU7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDlmODY5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBJbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TW9kdWxlTWVzc2FnZUJ1bmRsZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgbmV3UGFja2FnZU5hbWU7DQotICAgICAgICBpZiAocGFja2FnZU5hbWUuZW5kc1dpdGgoIi5yZXNvbHZlciIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5ld1BhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUucmVwbGFjZSgiLnJlc29sdmVyIiwgIi5idW5kbGUiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBuZXdQYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lLnJlcGxhY2UoIi5yZXNvbHZlci4iLCAiLmJ1bmRsZS4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXdQYWNrYWdlTmFtZSArICIudmFsaWRhdGlvbl9tZXNzYWdlcyI7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHVzZSBhIGN1c3RvbSBuYW1lIG1hcHBlciB0byBpbXBsZW1lbnQgY3VzdG9tIGNvbnZlbnRpb25zDQotICAgICAqLw0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VSZXNvbHZlckNsYXNzTmFtZSgNCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLCBTdHJpbmcgdGFyZ2V0Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLCAiLm1lc3NhZ2UucmVzb2x2ZXIuIiwgdGFyZ2V0Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKA0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsIFN0cmluZyB0YXJnZXRDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lCYXNlZE5hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MsICIubWV0YWRhdGEudHJhbnNmb3JtZXIuIiwgdGFyZ2V0Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldFBhY2thZ2VOYW1lLCBTdHJpbmcgdGFyZ2V0Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0TmFtZSgpOw0KLQ0KLSAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLnJlcGxhY2UoIi5zdHJhdGVneS4iLCB0YXJnZXRQYWNrYWdlTmFtZSk7DQotDQotICAgICAgICBpZiAodGFyZ2V0Q2xhc3NOYW1lID09IG51bGwgfHwgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgPT0gLTEpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lDQotICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikpICsgIi4iICsgdGFyZ2V0Q2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB1c2UgYSBjdXN0b20gbmFtZSBtYXBwZXIgdG8gaW1wbGVtZW50IGN1c3RvbSBjb252ZW50aW9ucw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneU5hbWUsICJWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIiKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdXNlIGEgY3VzdG9tIG5hbWUgbWFwcGVyIHRvIGltcGxlbWVudCBjdXN0b20gY29udmVudGlvbnMNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZShTdHJpbmcgbWV0YURhdGFLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUtleS5yZXBsYWNlKCIuYW5ub3RhdGlvbi4iLCAiLnN0cmF0ZWd5LiIpICsgIlN0cmF0ZWd5IjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHZhbGlkYXRpb25TdHJhdGVneU5hbWUsICJNZXRhRGF0YVRyYW5zZm9ybWVyIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgdGFyZ2V0UG9zdGZpeCkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUuZW5kc1dpdGgoIlZhbGlkYXRpb25TdHJhdGVneSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLnN1YnN0cmluZygwLCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLmxlbmd0aCgpIC0gMTgpICsgdGFyZ2V0UG9zdGZpeDsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKHZhbGlkYXRpb25TdHJhdGVneU5hbWUuZW5kc1dpdGgoIlN0cmF0ZWd5IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneU5hbWUuc3Vic3RyaW5nKDAsIHZhbGlkYXRpb25TdHJhdGVneU5hbWUubGVuZ3RoKCkgLSA4KSArIHRhcmdldFBvc3RmaXg7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArIHRhcmdldFBvc3RmaXg7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZmZhZDguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOw0KLQ0KLUBUYXJnZXQoVFlQRSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi0vKioNCi0gKiBhbGxvd2VkIHRvIHVzZSBmb3IgY2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgaW50ZXJmYWNlcyB3aGljaCBoYXZlIHRoZSBtYXJrZXIgQEludm9jYXRpb25PcmRlclN1cHBvcnQNCi0gKg0KLSAqIHN1Z2dlc3RlZCByYW5nZXMgKG1haW5seSBmb3IgbmFtZS1tYXBwZXJzKToNCi0gKiBuZWdhdGl2ZSB2YWx1ZXMgZm9yICJleHRyZW1lIiBjYXNlcw0KLSAqDQotICogMC00OSBmb3IgY3VzdG9tIGFydGlmYWN0cyB3aGljaCBzaG91bGQgaGF2ZSB0aGUgaGlnaGVzdCBwcmlvcml0eQ0KLSAqIDUwLTk5IGZvciBhZGQtb25zIHdoaWNoIHByb3ZpZGUgYXJ0aWZhY3RzIHdoaWNoIHNob3VsZCBoYXZlIGEgaGlnaGVyIHByaW9yaXR5IHRoYW4gdGhlIGRlZmF1bHQgYXJ0aWZhY3RzDQotICogMTAwLTk5OSBpbnRlcm5hbCBhcnRpZmFjdHMNCi0gKiAxMDAwKyBmb3IgY3VzdG9tIGFydGlmYWN0cw0KLSAqDQotICogc3VnZ2VzdGVkIHJhbmdlcyBmb3IgYXJ0aWZhY3RzIGxpa2UgaW50ZXJjZXB0b3JzLC4uLg0KLSAqIDF4eCAuLi4gYXJ0aWZhY3RzIG9mIHRoZSBjb3JlDQotICogMnh4IC4uLiBhcnRpZmFjdHMgb2YgdmFsaWRhdGlvbiBtb2R1bGVzDQotICogM3h4IC4uLiBhcnRpZmFjdHMgb2YgY29tcG9uZW50IHN1cHBvcnQgbW9kdWxlcw0KLSAqDQotICogYSBwcmlvcml0eSBzaG91bGQgYmUgdW5pcXVlIHdpdGhpbiBvbmUgYXJ0aWZhY3QtdHlwZSAtIHRoYXQgbWVhbnMNCi0gKiBpZiBhIG5hbWUtbWFwcGVyIGhhcyBwcmlvcml0eSAxMDAsIGl0J3Mgb2sgdGhhdCBhbiBleGNlcHRpb24taW50ZXJjZXB0b3IgYWxzbyBoYXMgcHJpb3JpdHkgMTAwLg0KLSAqIGJ1dCBhIDJuZCBuYW1lLW1hcHBlciBzaG91bGRuJ3QgaGF2ZSBwcmlvcml0eSAxMDANCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIEludm9jYXRpb25PcmRlcg0KLXsNCi0gICAgLyoqDQotICAgICAqIGRlZmF1bHQgcHJpb3JpdHkgZm9yIGN1c3RvbSBhcnRpZmFjdHMgKGlmIHRoZXkgc2hvdWxkIGdldCBhZGRlZCBhZnRlciB0aGUgaW50ZXJuYWwgdmVyc2lvbnMNCi0gICAgICogQHJldHVybiB0aGUgcHJpb3JpdHkgb2YgYW4gYXJ0aWZhY3QgYW5ub3RhdGVkIHdpdGggdGhpcyBhbm5vdGF0aW9uDQotICAgICAqLw0KLSAgICBpbnQgdmFsdWUoKSBkZWZhdWx0IDEwMDA7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxODA3MWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBJbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yPFQ+IGltcGxlbWVudHMgQ29tcGFyYXRvcjxUPg0KLXsNCi0gICAgcHVibGljIGludCBjb21wYXJlKFQgbm0xLCBUIG5tMikNCi0gICAgew0KLSAgICAgICAgaWYgKGhhc1ByaW9yaXR5KG5tMSkgJiYgaGFzUHJpb3JpdHkobm0yKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gaXNQcmlvcml0eUhpZ2hlcihubTEuZ2V0Q2xhc3MoKS5nZXRBbm5vdGF0aW9uKEludm9jYXRpb25PcmRlci5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICBubTIuZ2V0Q2xhc3MoKS5nZXRBbm5vdGF0aW9uKEludm9jYXRpb25PcmRlci5jbGFzcykpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFoYXNQcmlvcml0eShubTEpICYmICFoYXNQcmlvcml0eShubTIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGhhc1ByaW9yaXR5KG5tMSkgPyAtMSA6IDE7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBpbnQgaXNQcmlvcml0eUhpZ2hlcihJbnZvY2F0aW9uT3JkZXIgcHJpb3JpdHkxLCBJbnZvY2F0aW9uT3JkZXIgcHJpb3JpdHkyKQ0KLSAgICB7DQotICAgICAgICBpZiAocHJpb3JpdHkxLnZhbHVlKCkgPT0gcHJpb3JpdHkyLnZhbHVlKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcHJpb3JpdHkxLnZhbHVlKCkgPCBwcmlvcml0eTIudmFsdWUoKSA/IC0xIDogMTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzUHJpb3JpdHkoT2JqZWN0IG5tKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbm0uZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KEludm9jYXRpb25PcmRlci5jbGFzcyk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9JbnZvY2F0aW9uT3JkZXJTdXBwb3J0LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlclN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQzNGU3OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL0ludm9jYXRpb25PcmRlclN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7DQotDQotQFRhcmdldChUWVBFKQ0KLUBEb2N1bWVudGVkDQotLyoqDQotICogbWFya2VyIGFubm90YXRpb24gZm9yIGVhc2llciB1c2FnZQ0KLSAqIGl0IG1hcmtzIGludGVyZmFjZXMgLSBpbnN0YW5jZXMgb2YgY2xhc3NlcyBpbXBsZW1lbnRpbmcgdGhlc2UgaW50ZXJmYWNlcyB3aWxsIGJlIHNvcnRlZA0KLSAqIEBzZWUgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgSW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLXsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Kc2ZQcm9qZWN0U3RhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvSnNmUHJvamVjdFN0YWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjMwYmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Kc2ZQcm9qZWN0U3RhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogcHJvamVjdCBzdGFnZSBlcXVpdmFsZW50IHRvIGpzZiAyLjANCi0gKiBleHR2YWwgMi54IGhhcyBhIHNwZWNpYWwgcmVzb2x2ZXIgd2hpY2ggcmVkaXJlY3RzIHRoZSBjYWxsIHRvIHRoZSBuZXcganNmIGFwaQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgZW51bSBKc2ZQcm9qZWN0U3RhZ2UNCi17DQotICAgIERldmVsb3BtZW50KFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoIkRldmVsb3BtZW50IikpLA0KLSAgICBVbml0VGVzdChQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKCJVbml0VGVzdCIpKSwNCi0gICAgU3lzdGVtVGVzdChQcm9qZWN0U3RhZ2UuY3JlYXRlU3RhZ2VOYW1lKCJTeXN0ZW1UZXN0IikpLA0KLSAgICBQcm9kdWN0aW9uKFByb2plY3RTdGFnZS5jcmVhdGVTdGFnZU5hbWUoIlByb2R1Y3Rpb24iKSk7DQotDQotICAgIHByaXZhdGUgZmluYWwgUHJvamVjdFN0YWdlTmFtZSB2YWx1ZTsNCi0NCi0gICAgSnNmUHJvamVjdFN0YWdlKFByb2plY3RTdGFnZU5hbWUgdmFsdWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXMoSnNmUHJvamVjdFN0YWdlIGpzZlByb2plY3RTdGFnZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFByb2plY3RTdGFnZS5pcyhqc2ZQcm9qZWN0U3RhZ2UuZ2V0VmFsdWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb2plY3RTdGFnZU5hbWUgZ2V0VmFsdWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL05lc3RlZC5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9OZXN0ZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA2OTFlOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL05lc3RlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7DQotDQotLyoqDQotICogbWFya2VyIGFubm90YXRpb24gZS5nLiB0byBtYXJrIHN1Yi1uYW1lLW1hcHBlcnMNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVGFyZ2V0KFRZUEUpDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgTmVzdGVkDQotew0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1BoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1BoYXNlSWRSZWNvcmRpbmdQaGFzZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OTU1NDIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9QaGFzZUlkUmVjb3JkaW5nUGhhc2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlRXZlbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotDQotLyoqDQotICogZS5nLiB0byBhbGxvdyBpbiBtZXRhZGF0YSBleHRyYWN0aW9uIGludGVyY2VwdG9ycyB0byBrbm93IGlmIHRoZXkgYXJlIGludm9rZWQgZHVyaW5nIHZhbGlkYXRpb24gb3INCi0gKiBjb21wb25lbnQgaW5pdGlhbGl6YXRpb24gKGlmIG5lZWRlZCkNCi0gKiBleGFtcGxlOiBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIC0gc29tZSBmdW5jdGlvbmFsaXR5IHNob3VsZG4ndCBiZSBwcm9jZXNzZWQgZHVyaW5nIHJlbmRlcmluZw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUGhhc2VJZFJlY29yZGluZ1BoYXNlTGlzdGVuZXIgaW1wbGVtZW50cyBQaGFzZUxpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNzkxMjQwNTE0MDE0ODY3NDU3TDsNCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IHBoYXNlRXZlbnQpDQotICAgIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IHBoYXNlRXZlbnQpDQotICAgIHsNCi0gICAgICAgIEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlIGZhY2VzSW5mb3JtYXRpb25TdG9yYWdlID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmdldFN0b3JhZ2UoRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MsIEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5zZXRDdXJyZW50UGhhc2VJZChwaGFzZUV2ZW50LmdldFBoYXNlSWQoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0UGhhc2VJZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBQaGFzZUlkLkFOWV9QSEFTRTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBnZW5lcmF0ZWQNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmICh0aGlzID09IG8pDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgUGhhc2VJZFJlY29yZGluZ1BoYXNlTGlzdGVuZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvamVjdFN0YWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYTQ0NGQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLS8qKg0KLSAqIGV4dGVuc2libGUgcHJvamVjdCBzdGFnZSBpbXBsZW1lbnRhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJvamVjdFN0YWdlDQotew0KLSAgICBwcml2YXRlIFByb2plY3RTdGFnZU5hbWUgdmFsdWU7DQotDQotICAgIHByaXZhdGUgUHJvamVjdFN0YWdlKFByb2plY3RTdGFnZU5hbWUgdmFsdWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFByb2plY3RTdGFnZU5hbWUgY3JlYXRlU3RhZ2VOYW1lKFN0cmluZyBuYW1lKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlUHJvamVjdFN0YWdlTmFtZShuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFByb2plY3RTdGFnZSBjcmVhdGVTdGFnZShQcm9qZWN0U3RhZ2VOYW1lIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgUHJvamVjdFN0YWdlKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpcyhQcm9qZWN0U3RhZ2VOYW1lIHByb2plY3RTdGFnZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRQcm9qZWN0U3RhZ2UoKS5lcXVhbHMocHJvamVjdFN0YWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBQcm9qZWN0U3RhZ2VOYW1lIGdldEN1cnJlbnRQcm9qZWN0U3RhZ2UoKQ0KLSAgICB7DQotICAgICAgICAvL3NldCBQcm9qZWN0U3RhZ2VSZXNvbHZlciB0byBudWxsIHRvIHR3ZWFrIHRoZSBwZXJmb3JtYW5jZQ0KLSAgICAgICAgT2JqZWN0IHByb2plY3RTdGFnZVJlc29sdmVyID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEdsb2JhbFByb3BlcnR5KFByb2plY3RTdGFnZVJlc29sdmVyLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBpZihwcm9qZWN0U3RhZ2VSZXNvbHZlciBpbnN0YW5jZW9mIFByb2plY3RTdGFnZVJlc29sdmVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoKFByb2plY3RTdGFnZVJlc29sdmVyKXByb2plY3RTdGFnZVJlc29sdmVyKS5nZXRDdXJyZW50UHJvamVjdFN0YWdlKCkuZ2V0VmFsdWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXREZWZhdWx0U3RhZ2VOYW1lKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb2plY3RTdGFnZU5hbWUgZ2V0VmFsdWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1Byb2plY3RTdGFnZU5hbWUuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvamVjdFN0YWdlTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDIyYjg2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvamVjdFN0YWdlTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvamVjdFN0YWdlTmFtZQ0KLXsNCi0gICAgU3RyaW5nIGdldE5hbWUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9Qcm9qZWN0U3RhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDRmMjdhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvUHJvamVjdFN0YWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFByb2plY3RTdGFnZVJlc29sdmVyDQotew0KLSAgICBQcm9qZWN0U3RhZ2UgZ2V0Q3VycmVudFByb2plY3RTdGFnZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1ZhbGlkYXRpb25Nb2R1bGVBd2FyZS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9WYWxpZGF0aW9uTW9kdWxlQXdhcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0MjBmNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1ZhbGlkYXRpb25Nb2R1bGVBd2FyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBpZiBhbiBhcnRpZmFjdCAod2hpY2ggc3VwcG9ydHMgdGhpcyBjb25jZXB0KSBzaG91bGQgYmUgdXNlZCBqdXN0IGZvciBhL3NvbWUgc3BlY2lmaWMgbW9kdWxlKHMpLA0KLSAqIHRoZSBhcnRpZmFjdCBoYXMgdG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25Nb2R1bGVBd2FyZQ0KLXsNCi0gICAgLyoqDQotICAgICAqIGR1cmluZyB0aGUgcmVnaXN0cmF0aW9uIHByb2Nlc3MgdGhlIGluZm9ybWF0aW9uIGdldHMgZXZhbHVhdGVkPGJyLz4NCi0gICAgICogaW5zdGVhZCBvZiBhIGNsYXNzIGFycmF5IGEgc3RyaW5nIGFycmF5IGlzIHVzZWQgc28gdGhhdCBpdCdzIHBvc3NpYmxlIHRvIGltcGxlbWVudA0KLSAgICAgKiBhbiBhcnRpZmFjdCBmb3IgZGlmZmVyZW50IG1vZHVsZXMuIGlmIGFuIGFkZC1vbiByZXN0cmljdHMgYW4gYXJ0aWZhY3QgdG8gc3BlY2lmaWMgbW9kdWxlcywNCi0gICAgICogbm90IGFsbCBtb2R1bGVzIGhhdmUgdG8gYmUgdXNlZCBieSB0aGUgd2ViYXBwLiBpZiBhIG1vZHVsZSBrZXkgaXMgdW5rbm93biwgdGhlIGFydGlmYWN0IHdvbid0IGdldCByZWdpc3RlcmVkDQotICAgICAqIGZvciB0aGlzIG1vZHVsZS4gaWYgYW4gYXJ0aWZhY3QgZG9lc24ndCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UsIGl0IGdldHMgcmVnaXN0ZXJlZCBmb3IgYWxsIG1vZHVsZXMNCi0gICAgICoNCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZXMgb2YgdGhlIG1vZHVsZSBrZXlzDQotICAgICAqLw0KLSAgICBTdHJpbmdbXSBnZXRNb2R1bGVLZXlzKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvVmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9WYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNTM0MGQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9WYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi0NCi1AVGFyZ2V0KFRZUEUpDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotLyoqDQotICogbWFya2VyIGFubm90YXRpb24gZm9yIG1vZHVsZSBrZXlzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBWYWxpZGF0aW9uTW9kdWxlS2V5DQotew0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE4YTE3OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLQ0KLS8qKg0KLSAqIGNlbnRyYWxpemVkIGluIG9yZGVyIHRoYXQgdGhlc2UgaW5mb3JtYXRpb24gYXJlbid0IHNwcmVhZCBvdmVyIHRoZSBjb21wbGV0ZSBjb2RlIGJhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBXZWJYbWxQYXJhbWV0ZXINCi17DQotICAgIC8qDQotICAgICAqIG1pc2MNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FU1NBR0VfQlVORExFID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVTU0FHRV9CVU5ETEUiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQkFTRV9QQUNLQUdFID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQkFTRV9QQUNLQUdFIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0lORk9STUFUSU9OX1BST1ZJREVSX0JFQU4gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9JTkZPUk1BVElPTl9QUk9WSURFUl9CRUFOIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1NUQVRJQ19WQUxJREFUSU9OX1NUUkFURUdZX01BUFBJTkcgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9TVEFUSUNfVkFMSURBVElPTl9TVFJBVEVHWV9NQVBQSU5HIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NPTVBPTkVOVF9JTklUSUFMSVpFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0NPTVBPTkVOVF9JTklUSUFMSVpFUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX0VYQ0VQVElPTl9JTlRFUkNFUFRPUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fRVhDRVBUSU9OX0lOVEVSQ0VQVE9SIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1BST1BFUlRZX1ZBTElEQVRJT05fSU5URVJDRVBUT1IgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9QUk9QRVJUWV9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX01FVEFfREFUQV9FWFRSQUNUSU9OX0lOVEVSQ0VQVE9SID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVUQV9EQVRBX0VYVFJBQ1RJT05fSU5URVJDRVBUT1IiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fUFJPWFlfSEVMUEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fUFJPWFlfSEVMUEVSIik7DQotDQotICAgIC8qDQotICAgICAqIG5hbWUgbWFwcGVyDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfTkFNRV9NQVBQRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfTkFNRV9NQVBQRVIiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVUQV9EQVRBX1RPX1ZBTElEQVRJT05fU1RSQVRFR1lfTkFNRV9NQVBQRVIgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9OQU1FX01BUFBFUiIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9WQUxJREFUSU9OX1NUUkFURUdZX1RPX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9OQU1FX01BUFBFUiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSIik7DQotDQotICAgIC8qDQotICAgICAqIGZpbHRlcg0KLSAgICAgKi8NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fTUVUQV9EQVRBX1NUT1JBR0VfRklMVEVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fTUVUQV9EQVRBX1NUT1JBR0VfRklMVEVSIik7DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBmYWN0b3JpZXMNCi0gICAgICovDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkNVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWSIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1NUT1JBR0VfTUFOQUdFUl9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlkiKTsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fRkFDRVNfTUVTU0FHRV9GQUNUT1JZID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJDVVNUT01fRkFDRVNfTUVTU0FHRV9GQUNUT1JZIik7DQotDQotICAgIC8qDQotICAgICAqIGFjdGl2YXRlDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWQVRFX1JFUVVJUkVEX0lOSVRJQUxJWkFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJBQ1RJVkFURV9SRVFVSVJFRF9JTklUSUFMSVpBVElPTiIpOw0KLSAgICANCi0gICAgLyoNCi0gICAgICogZGVhY3RpdmF0ZQ0KLSAgICAgKi8NCi0gICAgQERlcHJlY2F0ZWQNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX1JFTkRFUktJVCA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9SRU5ERVJLSVQiKTsNCi0NCi0gICAgLy9jdXJyZW50bHkganVzdCB1c2VkIGJ5IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfREVGQVVMVF9DT05WRU5USU9OIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9ERUZBVUxUX05BTUVfTUFQUEVSUyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9ERUZBVUxUX05BTUVfTUFQUEVSUyIpOw0KLSAgICANCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0VMX1JFU09MVkVSID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJERUFDVElWQVRFX0VMX1JFU09MVkVSIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9DT01QT05FTlRfSU5JVElBTElaQVRJT04gPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfQ09NUE9ORU5UX0lOSVRJQUxJWkFUSU9OIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9WQUxJREFUSU9OX1BBUkFNRVRFUlMgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfVkFMSURBVElPTl9QQVJBTUVURVJTIik7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9SRU5ERVJfS0lUX0ZBQ1RPUlkgPSBXZWJYbWxVdGlscw0KLSAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfUkVOREVSX0tJVF9GQUNUT1JZIik7DQotDQotICAgIC8vdGhlcmUgaXMgbm90aGluZyBsaWtlIERFQUNUSVZBVEVfREVGQVVMVF9WQUxJREFUSU9OX0lOVEVSQ0VQVE9SDQotICAgIC8vdXNlIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmRlbnlSZW5kZXJlckludGVyY2VwdG9yKC4uLikgd2l0aGluIGFuIGV4dHZhbC1TdGFydHVwTGlzdGVuZXINCi0NCi0gICAgLyoNCi0gICAgICogc3BlYyBwYXJhbWV0ZXJzDQotICAgICAqLw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSUFJFVF9FTVBUWV9TVFJJTkdfU1VCTUlUVEVEX1ZBTFVFU19BU19OVUxMID0gV2ViWG1sVXRpbHMNCi0gICAgICAgIC5nZXRJbml0UGFyYW1ldGVyKCJqYXZheC5mYWNlcyIsICJJTlRFUlBSRVRfRU1QVFlfU1RSSU5HX1NVQk1JVFRFRF9WQUxVRVNfQVNfTlVMTCIpOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRFX0VNUFRZX0ZJRUxEUyA9IFdlYlhtbFV0aWxzDQotICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiamF2YXguZmFjZXMiLCAiVkFMSURBVEVfRU1QVFlfRklFTERTIik7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE0M2YyNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0Fic3RyYWN0RUxIZWxwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogZGV0YWlscw0KLSAqIEBzZWUgRGVmYXVsdEVMSGVscGVyDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFTEhlbHBlckZhY3RvcnkNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotICAgIHByb3RlY3RlZCBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeSBjdXN0b21FTEhlbHBlckZhY3Rvcnk7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tRUxIZWxwZXJGYWN0b3J5KEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5IGVsSGVscGVyRmFjdG9yeSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jdXN0b21FTEhlbHBlckZhY3RvcnkgPSBlbEhlbHBlckZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGZpbmFsIEVMSGVscGVyIGNyZWF0ZSgpDQotICAgIHsNCi0gICAgICAgIEVMSGVscGVyIHJlc3VsdCA9IG51bGw7DQotDQotICAgICAgICBpZih0aGlzLmN1c3RvbUVMSGVscGVyRmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuY3VzdG9tRUxIZWxwZXJGYWN0b3J5LmNyZWF0ZUVMSGVscGVyKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlRUxIZWxwZXIoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IEVMSGVscGVyIGNyZWF0ZUVMSGVscGVyKCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzEwOWYwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRGVmYXVsdEVMSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uOw0KLWltcG9ydCBqYXZheC5lbC5FTENvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzsNCi1pbXBvcnQgamF2YS5pby5FeHRlcm5hbGl6YWJsZTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIGluIG9yZGVyIHRvIGNlbnRyYWxpemUgdGhlIGpzZiB2ZXJzaW9uIGRlcGVuZGVuY3kgd2l0aGluIHRoZSBjb3JlDQotICoNCi0gKiB0aGlzIGVsLWhlbHBlciBzdXBwb3J0cyBqc3AgYW5kIGZhY2VsZXRzICh0ZXN0ZWQgd2l0aCAxLjEuMTQpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi0vKg0KLSAqIHRoZXJlIGlzIGEgc3BlY2lhbCBmYWNlbGV0cyB3b3JrYXJvdW5kIGZvciBlbC1leHByZXNzaW9ucyBvZiBjdXN0b20gY29tcG9uZW50cw0KLSAqIGl0J3MgcGx1Z2dhYmxlIGluIG9yZGVyIHRvIHN1cHBvcnQgc3BlY2lhbCBtZWNoYW5pc21zIG9mIGRpZmZlcmVudCB0ZWNobm9sb2dpZXMgKHRoYW4ganNwIGFuZCBmYWNlbGV0cykNCi0gKiBzbyB5b3UgY2FuIHBsdWcgaW4geW91ciBvd24gaW1wbC4gd2hpY2ggaW1wbGVtZW50cyBhIGN1c3RvbSB3b3JrYXJvdW5kIChsaWtlIHRoZSBmYWNlbGV0cyB3b3JrYXJvdW5kIG9mIHRoaXMgaW1wbC4pDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEVMSGVscGVyIGltcGxlbWVudHMgRUxIZWxwZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUFDVElWQVRFX0VMX1JFU09MVkVSID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfRUxfUkVTT0xWRVI7DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0RUxIZWxwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgLy9kdWUgdG8gYSByZXN0cmljdGlvbiB3aXRoIHRoZSByaQ0KLSAgICAgICAgT2JqZWN0IGJlYW4gPSBnZXRWYWx1ZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgcmV0dXJuIChiZWFuICE9IG51bGwpID8gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhiZWFuLmdldENsYXNzKCkpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oU3RyaW5nIGJlYW5OYW1lKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgcmV0dXJuIGZhY2VzQ29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmdldEVMUmVzb2x2ZXIoKS5nZXRWYWx1ZShmYWNlc0NvbnRleHQuZ2V0RUxDb250ZXh0KCksIG51bGwsIGJlYW5OYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKHZhbHVlQmluZGluZ0V4cHJlc3Npb24gIT0gbnVsbCkgPyBmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5ldmFsdWF0ZUV4cHJlc3Npb25HZXQoDQotICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSwgT2JqZWN0LmNsYXNzKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZXZhbHVhdGVFeHByZXNzaW9uR2V0KGZhY2VzQ29udGV4dCwgdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgT2JqZWN0LmNsYXNzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gZ2V0VmFsdWVCaW5kaW5nRXhwcmVzc2lvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgYm9vbGVhbiBhbGxvd0JsYW5rQ2hhcmFjdGVycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBnZXRPcmlnaW5hbFZhbHVlQmluZGluZ0V4cHJlc3Npb24odWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgLy9mb3IgaW5wdXQgY29tcG9uZW50cyB3aXRob3V0IHZhbHVlLWJpbmRpbmcNCi0gICAgICAgIC8vKGUuZy4gZm9yIHNwZWNpYWwgY29tcG9uZW50IGxpYnMgLT4gaXNzdWUgd2l0aCBFeHRWYWxSZW5kZXJlcldyYXBwZXIjZW5jb2RlQmVnaW4pDQotICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LmdldENsYXNzKCkgKyAiIGhhcyBubyB2YWx1ZSBiaW5kaW5nIC0gY29tcG9uZW50IGlkOiAiICsgdWlDb21wb25lbnQuZ2V0SWQoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoIWFsbG93QmxhbmtDaGFyYWN0ZXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLnJlcGxhY2UoIiAiLCAiIik7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoZ2V0VHlwZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbikuZ2V0QmFzZUV4cHJlc3Npb24oKSkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlc3VsdCA9IEZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlci4NCi0gICAgICAgICAgICAgICAgdHJ5VG9DcmVhdGVWYWx1ZUJpbmRpbmdGb3JGYWNlbGV0c0JpbmRpbmcodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IHJlc29sdmUgZXhwcmVzc2lvbjogIiArIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCByZXN1bHQuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotDQotICAgICAgICAgICAgaWYoZW50aXR5Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCByZXNvbHZlIGV4cHJlc3Npb246ICIgKyByZXN1bHQuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkhJR0gsIGRlc2NyaXB0aW9uID0gImNoZWNrIGlmIGl0IHdvcmtzIHdpdGggbmVzdGVkIGNvbXBvc2l0ZSBjb21wb25lbnRzIikNCi0gICAgcHVibGljIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgaWYoInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoREVBQ1RJVkFURV9FTF9SRVNPTFZFUikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5RGV0YWlsc1ZpYVJlZmxlY3Rpb25GYWxsYmFjayh1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgVmFsdWVFeHByZXNzaW9uIHZhbHVlRXhwcmVzc2lvbiA9IHVpQ29tcG9uZW50LmdldFZhbHVlRXhwcmVzc2lvbigidmFsdWUiKTsNCi0NCi0gICAgICAgIGlmKHZhbHVlRXhwcmVzc2lvbiA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRXh0VmFsRUxSZXNvbHZlciBlbFJlc29sdmVyID0gY3JlYXRlV3JhcHBlZEVMQ29udGV4dChmYWNlc0NvbnRleHQpOw0KLSAgICAgICAgaW5zcGVjdFRhcmdldCh2YWx1ZUV4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgIEV4dFZhbEVMUmVzb2x2ZXIuY3JlYXRlQ29udGV4dFdyYXBwZXIoZmFjZXNDb250ZXh0LmdldEVMQ29udGV4dCgpLCBlbFJlc29sdmVyKSwgZmFsc2UpOw0KLQ0KLSAgICAgICAgRXh0VmFsRUxSZXNvbHZlciBjb21wb3NpdGVDb21wb25lbnRFTFJlc29sdmVyID0gbnVsbDsNCi0NCi0gICAgICAgIC8vcmUtY2hlY2sgdG8gZ2V0IGZ1bGwga2V5IGZvciBjcm9zcy12YWxpZGF0aW9uDQotICAgICAgICBpZiAoZWxSZXNvbHZlci5nZXRDb21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBWYWx1ZUV4cHJlc3Npb24gY29tcG9zaXRlRXhwcmVzc2lvbiA9IGVsUmVzb2x2ZXIuZ2V0Q29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbigpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGNvbXBvc2l0ZUNvbXBvbmVudEVMUmVzb2x2ZXIgPSBjcmVhdGVXcmFwcGVkRUxDb250ZXh0KGZhY2VzQ29udGV4dCk7DQotICAgICAgICAgICAgaW5zcGVjdFRhcmdldChjb21wb3NpdGVFeHByZXNzaW9uLA0KLSAgICAgICAgICAgICAgICAgICAgRXh0VmFsRUxSZXNvbHZlci5jcmVhdGVDb250ZXh0V3JhcHBlcigNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LmdldEVMQ29udGV4dCgpLCBjb21wb3NpdGVDb21wb25lbnRFTFJlc29sdmVyKSwgdHJ1ZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihlbFJlc29sdmVyLmdldFBhdGgoKSA9PSBudWxsIHx8IGVsUmVzb2x2ZXIuZ2V0QmFzZU9iamVjdCgpID09IG51bGwgfHwgZWxSZXNvbHZlci5nZXRQcm9wZXJ0eSgpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcga2V5Ow0KLSAgICAgICAgaWYoY29tcG9zaXRlQ29tcG9uZW50RUxSZXNvbHZlciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGtleSA9IGNvbXBvc2l0ZUNvbXBvbmVudEVMUmVzb2x2ZXIuZ2V0UGF0aCgpICsNCi0gICAgICAgICAgICAgICAgICAgIGVsUmVzb2x2ZXIuZ2V0UGF0aCgpLnN1YnN0cmluZyhlbFJlc29sdmVyLmdldFBhdGgoKS5pbmRleE9mKCIuIikpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGtleSA9IGVsUmVzb2x2ZXIuZ2V0UGF0aCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURldGFpbHMoa2V5LCBlbFJlc29sdmVyLmdldEJhc2VPYmplY3QoKSwgZWxSZXNvbHZlci5nZXRQcm9wZXJ0eSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5zcGVjdFRhcmdldChWYWx1ZUV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uLCBFTENvbnRleHQgZWxDb250ZXh0LCBib29sZWFuIGluc3BlY3RDb21wb3NpdGVDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbHVlRXhwcmVzc2lvbi5zZXRWYWx1ZShlbENvbnRleHQsIG51bGwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGluc3BlY3RDb21wb3NpdGVDb21wb25lbnQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciBhdCBiaW5kaW5nOiAiICsgdmFsdWVFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIC0tIGFuIGVsLXJlc29sdmVyIGVycm9yIG9jY3VycmVkISBtYXliZSB5b3UgdXNlZCBhbiBpbnZhbGlkIGJpbmRpbmcuIiwgdCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgRXh0VmFsRUxSZXNvbHZlciBjcmVhdGVXcmFwcGVkRUxDb250ZXh0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgRXh0VmFsRUxSZXNvbHZlcihmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5nZXRFTFJlc29sdmVyKCkpOw0KLSAgICB9DQotDQotICAgIC8va2VlcCBpbiBzeW5jIHdpdGggRGVmYXVsdEVMSGVscGVyI2dldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nIG9mIGJyYW5jaCEhIQ0KLSAgICBwcml2YXRlIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHNWaWFSZWZsZWN0aW9uRmFsbGJhY2soVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBnZXRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50LCBmYWxzZSk7DQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uID0NCi0gICAgICAgICAgICBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSk7DQotDQotICAgICAgICBTdHJpbmcgcGF0aCA9IG51bGw7DQotDQotICAgICAgICB3aGlsZShjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYocGF0aCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcGF0aCA9IGdldFByb3BlcnR5TmFtZShjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHBhdGggPSBnZXRQcm9wZXJ0eU5hbWUoY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24pICsgIi4iICsgcGF0aDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgY3VycmVudFZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBjdXJyZW50VmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcGF0aCA9IGN1cnJlbnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldFByb3BlcnR5KCkgKyAiLiIgKyBwYXRoOw0KLQ0KLSAgICAgICAgT2JqZWN0IGJhc2VPYmplY3QgPSBnZXRWYWx1ZU9mRXhwcmVzc2lvbihmYWNlc0NvbnRleHQsIHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotDQotICAgICAgICAvL2luIGNhc2Ugb2YgZS5nLjogI3tiZWFuW2JlYW4ucGFzc3dvcmRSZXBlYXRlZFByb3BlcnR5TmFtZV19DQotICAgICAgICAvLy0+IGJlYW4ucGFzc3dvcmRSZXBlYXRlZFByb3BlcnR5TmFtZSBpcyBub3QgdGhlIGZpbmFsIHByb3BlcnR5IG5hbWUNCi0gICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlEZXRhaWxzKHBhdGgsIGJhc2VPYmplY3QsIGdldFByb3BlcnR5TmFtZSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0NCi0gICAgICAgIGlmKHByb3BlcnR5TmFtZS5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IGV4dHJhY3RQcm9wZXJ0eU5hbWVPZlByb3BlcnR5UGF0aChwcm9wZXJ0eU5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAic3VwcG9ydCBmb3IgbW9yZSBkeW5hbWljIGJpbmRpbmdzIC0gZGV0YWlscyBzZWUgaW5saW5lIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXh0cmFjdFByb3BlcnR5TmFtZU9mUHJvcGVydHlQYXRoKFN0cmluZyBwcm9wZXJ0eUNoYWluKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmdbXSBwcm9wZXJ0aWVzID0gcHJvcGVydHlDaGFpbi5zcGxpdCgiXFwuIik7DQotDQotICAgICAgICBPYmplY3QgY3VycmVudFByb3BlcnR5VmFsdWUgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4ocHJvcGVydGllc1swXSk7DQotDQotICAgICAgICBNZXRob2QgY3VycmVudE1ldGhvZDsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50UHJvcGVydHlOYW1lOw0KLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzT2ZQcm9wZXJ0eVZhbHVlOw0KLSAgICAgICAgZm9yKGludCBpID0gMTsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudFByb3BlcnR5TmFtZSA9IHByb3BlcnRpZXNbaV07DQotICAgICAgICAgICAgY3VycmVudENsYXNzT2ZQcm9wZXJ0eVZhbHVlID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhjdXJyZW50UHJvcGVydHlWYWx1ZS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICBjdXJyZW50TWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKGN1cnJlbnRDbGFzc09mUHJvcGVydHlWYWx1ZSwNCi0gICAgICAgICAgICAgICAgImdldCIgKyBjdXJyZW50UHJvcGVydHlOYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgY3VycmVudFByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMSkpOw0KLQ0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRNZXRob2QgPT0gbnVsbCAmJiBjdXJyZW50UHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIE1hcCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vaXQncyBvayBmb3IgdGhlIHNpbXBsZSBtYXAgY2FzZSAtIGJ1dCBub3QgZm9yIGUuZy46DQotICAgICAgICAgICAgICAgIC8vI3tiZWFuMVtiZWFuMi5wcm9wZXJ0eU5hbWVQcm92aWRlclsgYmVhbjMuaW5kZXhdXX0NCi0gICAgICAgICAgICAgICAgLy9vciBldmVyeSBvdGhlciBjb21wbGV4IHJlcGxhY2VtZW50IGZvciBiZWFuMy5pbmRleA0KLSAgICAgICAgICAgICAgICAvL2l0IG1pZ2h0IGFsc28gcmVxdWlyZSBhbiBhZGp1c3RtZW50IGF0IEZhY2VsZXRzVGFnbGliRXhwcmVzc2lvbkhlbHBlciN0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcNCi0gICAgICAgICAgICAgICAgKChNYXApY3VycmVudFByb3BlcnR5VmFsdWUpLmdldChjdXJyZW50UHJvcGVydHlOYW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudFByb3BlcnR5VmFsdWUgPSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoY3VycmVudFByb3BlcnR5VmFsdWUsIGN1cnJlbnRNZXRob2QpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGN1cnJlbnRQcm9wZXJ0eVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKWN1cnJlbnRQcm9wZXJ0eVZhbHVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRXJyb3JFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigidW5leHBlY3RlZCB2YWx1ZSB3aXRoaW4gbWFwIHN5bnRheDogIiArIHByb3BlcnR5Q2hhaW4gKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICIgbGFzdCBwcm9wZXJ0eSBuYW1lOiAiICsgY3VycmVudFByb3BlcnR5VmFsdWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBzdGF0aWMgU3RyaW5nIGdldE9yaWdpbmFsVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgVmFsdWVFeHByZXNzaW9uIHZhbHVlRXhwcmVzc2lvbiA9IHVpQ29tcG9uZW50LmdldFZhbHVlRXhwcmVzc2lvbigidmFsdWUiKTsNCi0NCi0gICAgICAgIHJldHVybiAodmFsdWVFeHByZXNzaW9uICE9IG51bGwpID8gdmFsdWVFeHByZXNzaW9uLmdldEV4cHJlc3Npb25TdHJpbmcoKSA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFTFRlcm1XZWxsRm9ybWVkKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFZhbHVlQmluZGluZyB8fCBvIGluc3RhbmNlb2YgRXh0ZXJuYWxpemFibGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIHMgPSBvLnRvU3RyaW5nKCk7DQotICAgICAgICByZXR1cm4gKChzLmNvbnRhaW5zKCIjIikgfHwgcy5jb250YWlucygiJCIpKSAmJiBzLmNvbnRhaW5zKCJ7IikgJiYgcy5jb250YWlucygifSIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJpbmRpbmdPZkNvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudC5nZXRWYWx1ZUV4cHJlc3Npb24obmFtZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9EZWZhdWx0RUxIZWxwZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmZTU2Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2VsL0RlZmF1bHRFTEhlbHBlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEVMSGVscGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0RUxIZWxwZXJGYWN0b3J5DQotew0KLSAgICBwcml2YXRlIEVMSGVscGVyIGVsSGVscGVyID0gbmV3IERlZmF1bHRFTEhlbHBlcigpOw0KLSAgICANCi0gICAgcHJvdGVjdGVkIEVMSGVscGVyIGNyZWF0ZUVMSGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZWxIZWxwZXI7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FTEhlbHBlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FTEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWIyNTUzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRUxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBpbiBvcmRlciB0byBjZW50cmFsaXplIHRoZSBqc2YgdmVyc2lvbiBkZXBlbmRlbmN5IHdpdGhpbiB0aGUgY29yZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBFTEhlbHBlcg0KLXsNCi0gICAgT2JqZWN0IGdldEJlYW4oU3RyaW5nIGJlYW5OYW1lKTsNCi0NCi0gICAgT2JqZWN0IGdldFZhbHVlT2ZFeHByZXNzaW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbik7DQotDQotICAgIENsYXNzIGdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0NCi0gICAgUHJvcGVydHlEZXRhaWxzIGdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KTsNCi0NCi0gICAgYm9vbGVhbiBpc0VMVGVybVZhbGlkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0NCi0gICAgYm9vbGVhbiBpc0VMVGVybVdlbGxGb3JtZWQoT2JqZWN0IG8pOw0KLQ0KLSAgICBPYmplY3QgZ2V0QmluZGluZ09mQ29tcG9uZW50KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBTdHJpbmcgbmFtZSk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRXh0VmFsRUxSZXNvbHZlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FeHRWYWxFTFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYjFkNTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9FeHRWYWxFTFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOwotCi1pbXBvcnQgamF2YXguZWwuRUxSZXNvbHZlcjsKLWltcG9ydCBqYXZheC5lbC5FTENvbnRleHQ7Ci1pbXBvcnQgamF2YXguZWwuVmFyaWFibGVNYXBwZXI7Ci1pbXBvcnQgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uOwotaW1wb3J0IGphdmF4LmVsLkZ1bmN0aW9uTWFwcGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmVsLkNvbXBvc2l0ZUNvbXBvbmVudEV4cHJlc3Npb25Ib2xkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLmJlYW5zLkZlYXR1cmVEZXNjcmlwdG9yOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsRUxSZXNvbHZlciBleHRlbmRzIEVMUmVzb2x2ZXIKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBFTFJlc29sdmVyIHdyYXBwZWQ7Ci0gICAgcHJpdmF0ZSBPYmplY3QgYmFzZU9iamVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKLSAgICAvL2Zvcm1zIHRoZSBpZCBmb3IgY3Jvc3MtdmFsaWRhdGlvbiB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXhwcmVzc2lvbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQYXRoUmVjb3JkaW5nU3RvcHBlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgQ29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbkhvbGRlciBjb21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uSG9sZGVyOwotICAgIHByaXZhdGUgU3RyaW5nIGNvbXBvc2l0ZUNvbXBvbmVudEV4cHJlc3Npb25CYXNlOwotCi0gICAgcHVibGljIEV4dFZhbEVMUmVzb2x2ZXIoRUxSZXNvbHZlciBlbFJlc29sdmVyKQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gZWxSZXNvbHZlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJhc2VPYmplY3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJhc2VPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJleHRyYWN0ZWQgcGF0aDogIiArIHRoaXMuZXhwcmVzc2lvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpCi0gICAgewotICAgICAgICB0aGlzLmJhc2VPYmplY3QgPSBudWxsOwotICAgICAgICB0aGlzLnByb3BlcnR5ID0gbnVsbDsKLSAgICAgICAgdGhpcy5leHByZXNzaW9uID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBwYXRoIHJlY29yZGluZyBpcyBwZXJmb3JtZWQgdG8gZ2V0IGEga2V5IGZvciBjcm9zcy12YWxpZGF0aW9uPGJyLz4KLSAgICAgKiBldmVyeSBiYXNlIGFmdGVyIHRoZSBmaXJzdCBjYWxsIHdoaWNoIGlzIG51bGwgc3RvcHMgcmVjb3JkaW5nPGJyLz4KLSAgICAgKiB3aXRoIGEgZHluYW1pYyBtYXAgc3ludGF4IHRoZSBsYXN0IHByb3BlcnR5IGluIHRoZSBtaWRkbGUgb2YgYW4gZXhwcmVzc2lvbiBoYXMgdG8gYmUgYSBzdHJpbmcuCi0gICAgICogc3VjaCBhIHN0cmluZyByZXN1bHQgY29udGludWVzIHRoZSBwYXRoIHJlY29yZGluZyBhdCB0aGUgbmV4dCBjYWxsIGZvciB0aGUgY3VycmVudCBleHByZXNzaW9uLgotICAgICAqIDxwLz4KLSAgICAgKiBleGFtcGxlOiAje2JlYW5bYmVhbi5wcm9wZXJ0eU5hbWVQcm92aWRlclsnbmFtZU9mUHJvcGVydHkxJ11dWydkeW5CZWFuJ10ucHJvcGVydHl9Ci0gICAgICogPHAvPgotICAgICAqIGxpbWl0YXRpb24gZm9yIGNyb3NzLXZhbGlkYXRpb246IG5hbWVPZlByb3BlcnR5MSBoYXMgdG8gYmUgb2YgdHlwZSBzdHJpbmcuCi0gICAgICogb3RoZXIga2V5IHR5cGVzIGFyZW4ndCBzdXBwb3J0ZWQgeWV0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxDb250ZXh0IHdyYXBwZWQgZWwtY29udGV4dAotICAgICAqIEBwYXJhbSBiYXNlIGN1cnJlbnQgYmFzZQotICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBwcm9wZXJ0eSB0byByZXNvbHZlCi0gICAgICogQHJldHVybiByZXN1bHQgb2YgdGhlIGRlbGVnYXRlZCBtZXRob2QgY2FsbAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoRUxDb250ZXh0IGVsQ29udGV4dCwgT2JqZWN0IGJhc2UsIE9iamVjdCBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIE9iamVjdCByZXN1bHQgPSB0aGlzLndyYXBwZWQuZ2V0VmFsdWUoZWxDb250ZXh0LCBiYXNlLCBwcm9wZXJ0eSk7Ci0KLSAgICAgICAgaWYodGhpcy5jb21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uSG9sZGVyICE9IG51bGwgJiYgdGhpcy5jb21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uQmFzZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmNvbXBvc2l0ZUNvbXBvbmVudEV4cHJlc3Npb25CYXNlID0gKFN0cmluZylwcm9wZXJ0eTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHRoaXMuY29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbkhvbGRlciA9PSBudWxsICYmIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBvc2l0ZUNvbXBvbmVudEV4cHJlc3Npb25Ib2xkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuY29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbkhvbGRlciA9ICgoQ29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbkhvbGRlcilyZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy92ZXJ5IGZpcnN0IGNhbGwgZm9yIGFuIGV4cHJlc3Npb24KLSAgICAgICAgaWYodGhpcy5leHByZXNzaW9uID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IChTdHJpbmcpcHJvcGVydHk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8je2JlYW5bZHluQmFzZS5wcm9wZXJ0eU5hbWVdfSAtPiBiYXNlIG9mIGR5bkJhc2UgaXMgbnVsbCAtPiBzdG9wIHBhdGggcmVjb3JkaW5nCi0gICAgICAgIGVsc2UgaWYoYmFzZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmlzUGF0aFJlY29yZGluZ1N0b3BwZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBwcm9wZXJ0eUV4aXN0cyA9IGZhbHNlOwotICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IChTdHJpbmcpcHJvcGVydHk7Ci0gICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihiYXNlIGluc3RhbmNlb2YgTWFwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoKChNYXApYmFzZSkuY29udGFpbnNLZXkocHJvcGVydHkpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZihQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKGJhc2UuZ2V0Q2xhc3MoKSkuZ2V0TWV0aG9kKCJnZXQiICsgcHJvcGVydHlOYW1lKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoYmFzZS5nZXRDbGFzcygpKS5nZXRNZXRob2QoImlzIiArIHByb3BlcnR5TmFtZSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZTEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpICYmICEiYXR0cnMiLmVxdWFscyhwcm9wZXJ0eSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJwcm9wZXJ0eTogIiArIHByb3BlcnR5ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpc24ndCB1c2VkIGZvciBwYXRoIC0gaXQgaXNuJ3QgYSBwcm9wZXJ0eSBvZiAiICsgYmFzZS5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2UuZy46ICN7YmVhbi5zdWJCYXNlLnByb3BlcnR5fSAtPiBoZXJlIHdlIGFyZSBhdCBzdWJCYXNlCi0gICAgICAgICAgICBpZihwcm9wZXJ0eUV4aXN0cyAmJiAhdGhpcy5pc1BhdGhSZWNvcmRpbmdTdG9wcGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbiArPSAiLiIgKyBwcm9wZXJ0eTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYocHJvcGVydHlFeGlzdHMgJiYgcmVzdWx0IGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuaXNQYXRoUmVjb3JkaW5nU3RvcHBlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgaWYodGhpcy5pc1BhdGhSZWNvcmRpbmdTdG9wcGVkICYmIHJlc3VsdCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uICs9ICIuIiArIHByb3BlcnR5OwotICAgICAgICB9Ci0gICAgICAgICovCi0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0VHlwZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbywgT2JqZWN0IG8xKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0VHlwZShlbENvbnRleHQsIG8sIG8xKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbywgT2JqZWN0IG8xLCBPYmplY3QgbzIpCi0gICAgewotICAgICAgICBleHByZXNzaW9uICs9ICIuIiArIG8xOwotICAgICAgICBwcm9wZXJ0eSA9IChTdHJpbmcpbzE7Ci0gICAgICAgIGJhc2VPYmplY3QgPSBvOwotICAgICAgICBlbENvbnRleHQuc2V0UHJvcGVydHlSZXNvbHZlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvLCBPYmplY3QgbzEpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5pc1JlYWRPbmx5KGVsQ29udGV4dCwgbywgbzEpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxGZWF0dXJlRGVzY3JpcHRvcj4gZ2V0RmVhdHVyZURlc2NyaXB0b3JzKEVMQ29udGV4dCBlbENvbnRleHQsIE9iamVjdCBvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0RmVhdHVyZURlc2NyaXB0b3JzKGVsQ29udGV4dCwgbyk7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzPD8+IGdldENvbW1vblByb3BlcnR5VHlwZShFTENvbnRleHQgZWxDb250ZXh0LCBPYmplY3QgbykKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENvbW1vblByb3BlcnR5VHlwZShlbENvbnRleHQsIG8pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRUxDb250ZXh0IGNyZWF0ZUNvbnRleHRXcmFwcGVyKGZpbmFsIEVMQ29udGV4dCBjb250ZXh0LCBmaW5hbCBFTFJlc29sdmVyIHJlc29sdmVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFTENvbnRleHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRMb2NhbGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVJlc29sdmVkKGJvb2xlYW4gdmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuc2V0UHJvcGVydHlSZXNvbHZlZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRQcm9wZXJ0eVJlc29sdmVkKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwdXRDb250ZXh0KENsYXNzIGNsYXp6LCBPYmplY3Qgb2JqZWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyLnB1dENvbnRleHQoY2xhenosIG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5wdXRDb250ZXh0KGNsYXp6LCBvYmplY3QpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udGV4dChDbGFzcyBjbGF6eikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRDb250ZXh0KGNsYXp6KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvY2FsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlci5zZXRMb2NhbGUobG9jYWxlKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldExvY2FsZShsb2NhbGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBFTFJlc29sdmVyIGdldEVMUmVzb2x2ZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgRnVuY3Rpb25NYXBwZXIgZ2V0RnVuY3Rpb25NYXBwZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldEZ1bmN0aW9uTWFwcGVyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFZhcmlhYmxlTWFwcGVyIGdldFZhcmlhYmxlTWFwcGVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRWYXJpYWJsZU1hcHBlcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH07Ci0gICAgfQotCi0gICAgcHVibGljIFZhbHVlRXhwcmVzc2lvbiBnZXRDb21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMuY29tcG9zaXRlQ29tcG9uZW50RXhwcmVzc2lvbkhvbGRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uSG9sZGVyLmdldEV4cHJlc3Npb24odGhpcy5jb21wb3NpdGVDb21wb25lbnRFeHByZXNzaW9uQmFzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMmI4OWYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9GYWNlbGV0c1RhZ2xpYkV4cHJlc3Npb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogSGVscGVyIGNsYXNzIHRvIGdldCB0aGUgcmVhbC9mdWxsIHZhbHVlIGJpbmRpbmcgLSB0ZXN0ZWQgd2l0aCBmYWNlbGV0cyAxLjEuMTQNCi0gKiBUaGUgdGFyZ2V0IGlzIHRvIGdldCByaWQgb2YgdGhpcyBpbXBsLiAtIGN1cnJlbnRseSBpdCdzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IGN1c3RvbSBmYWNlbGV0cyBjb21wb25lbnRzLg0KLSAqIEFuIGFsdGVybmF0aXZlIHdvdWxkIGJlIGFuIEVMLVJlc29sdmVyIC0gdGhlcmUgYXJlIHN0aWxsIHNvbWUgb3BlbiBpc3N1ZXMgd2l0aCBzdWNoIGFuIGFwcHJvYWNoDQotICogKyBJdCBpc24ndCBhdmFpbGFibGUgd2l0aCBKU0YgMS4xLngNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRmFjZWxldHNUYWdsaWJFeHByZXNzaW9uSGVscGVyDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9DcmVhdGVWYWx1ZUJpbmRpbmdGb3JGYWNlbGV0c0JpbmRpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBmYWNlbGV0c1ZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSBEZWZhdWx0RUxIZWxwZXIuZ2V0T3JpZ2luYWxWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEJpbmRpbmdzID0gZXh0cmFjdEVMVGVybXMoDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0QmluZGluZ09mQ29tcG9uZW50KHVpQ29tcG9uZW50LCAidmFsdWUiKSk7DQotDQotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZiZT0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIDEpICsgInsiICsgY3JlYXRlQmluZGluZyhmb3VuZEJpbmRpbmdzLCBtYXBwZWRGYWNlbGV0c1ZhcnMpICsgIn0iKTsNCi0NCi0gICAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YmUuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotDQotICAgICAgICAgICAgaWYoZW50aXR5Q2xhc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnlUb1JlcGxhY2VWYXJzKHZiZSwgbWFwcGVkRmFjZWxldHNWYXJzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHZiZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZmFjZWxldHNWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVCaW5kaW5nKExpc3Q8U3RyaW5nPiBleHByZXNzaW9ucywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkZWRWaXJ0dWFsTmFtZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGVudHJ5IDogZXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoIlZhbHVlRXhwcmVzc2lvblsiKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBmb3VuZEJpbmRpbmdEZXRhaWxzID0gZW50cnkuc3BsaXQoIiAiKTsNCi0gICAgICAgICAgICBpbmRleE9mQmluZGluZ0RldGFpbHMgPSBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKGZvdW5kQmluZGluZ0RldGFpbHMpOw0KLQ0KLSAgICAgICAgICAgIGlmIChpbmRleE9mQmluZGluZ0RldGFpbHMgPT0gLTEpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgYmluZGluZ0RldGFpbHMgPSBmb3VuZEJpbmRpbmdEZXRhaWxzW2luZGV4T2ZCaW5kaW5nRGV0YWlsc10uc3BsaXQoIj0iKTsNCi0NCi0gICAgICAgICAgICBpZiAoYmluZGluZ0RldGFpbHMubGVuZ3RoIDwgMikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGJpbmRpbmdEZXRhaWxzWzFdOw0KLQ0KLSAgICAgICAgICAgIC8vdG8gc3VwcG9ydCBibGFua3Mgd2l0aGluIGEgYmluZGluZyB3aXRoIG1hcCBzeW50YXgNCi0gICAgICAgICAgICBpZihjdXJyZW50QmluZGluZy5jb250YWlucygieyIpICYmICFjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgPSBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKGN1cnJlbnRCaW5kaW5nLCBmb3VuZEJpbmRpbmdEZXRhaWxzLCBpbmRleE9mQmluZGluZ0RldGFpbHMpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnNLZXkoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5wdXQoYmluZGluZ0RldGFpbHNbMF0sIGN1cnJlbnRCaW5kaW5nKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvL2VudHJ5IGZvciAidmlydHVhbCIgZmFjZWxldHMgdmFyDQotICAgICAgICAgICAgaWYoIShjdXJyZW50QmluZGluZy5jb250YWlucygieyIpIHx8IGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmlydHVhbFZhcnMucHV0KGJpbmRpbmdEZXRhaWxzWzBdLCBiaW5kaW5nRGV0YWlsc1sxXS5zdWJzdHJpbmcoMSwgYmluZGluZ0RldGFpbHNbMV0ubGVuZ3RoKCktMikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBvcmlnaW5hbEJpbmRpbmcgPSBhZGRlZFZpcnR1YWxOYW1lcy5nZXQoInZhbHVlIik7DQotICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcuc3Vic3RyaW5nKG9yaWdpbmFsQmluZGluZy5pbmRleE9mKCJ7IikgKyAxLCBvcmlnaW5hbEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLnJlbW92ZSgidmFsdWUiKTsNCi0gICAgICAgIHJldHVybiB0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcob3JpZ2luYWxCaW5kaW5nLCBhZGRlZFZpcnR1YWxOYW1lcywgdmlydHVhbFZhcnMpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0cnlUb1RyYW5zZm9ybVRvUmVhbEJpbmRpbmcoDQotICAgICAgICAgICAgU3RyaW5nIG9yaWdpbmFsQmluZGluZywgTWFwPFN0cmluZywgU3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcywgTWFwPFN0cmluZywgU3RyaW5nPiB2aXJ0dWFsVmFycykNCi0gICAgew0KLSAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gIiN7IiArIG9yaWdpbmFsQmluZGluZyArICJ9IjsNCi0gICAgICAgIEl0ZXJhdG9yIG5hbWVJdGVyYXRvciA9IGFkZGVkVmlydHVhbE5hbWVzLmtleVNldCgpLml0ZXJhdG9yKCk7DQotDQotICAgICAgICBTdHJpbmcgY3VycmVudEtleTsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50VmFsdWU7DQotICAgICAgICB3aGlsZShuYW1lSXRlcmF0b3IuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRLZXkgPSAoU3RyaW5nKSBuYW1lSXRlcmF0b3IubmV4dCgpOw0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGFkZGVkVmlydHVhbE5hbWVzLmdldChjdXJyZW50S2V5KTsNCi0gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGN1cnJlbnRWYWx1ZS5pbmRleE9mKCJ7IikgKyAxLCBjdXJyZW50VmFsdWUuaW5kZXhPZigifSIpKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIi4iLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgICAgIC8vZHluYW1pYyBiYXNlIGFuZCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJ7IiArIGN1cnJlbnRLZXkgKyAiWyIsICJ7IiArIGN1cnJlbnRWYWx1ZSArICJbIik7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICIuIiwgIi4iICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiLiIgKyBjdXJyZW50S2V5ICsgIlsiLCAiLiIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiXSIsICJbJyIgKyBjdXJyZW50VmFsdWUgKyAiJ10iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIlsiLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCJbIiArIGN1cnJlbnRLZXkgKyAiLiIsICJbIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICB9DQotDQotICAgICAgICBuYW1lSXRlcmF0b3IgPSB2aXJ0dWFsVmFycy5rZXlTZXQoKS5pdGVyYXRvcigpOw0KLQ0KLSAgICAgICAgd2hpbGUobmFtZUl0ZXJhdG9yLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50S2V5ID0gKFN0cmluZykgbmFtZUl0ZXJhdG9yLm5leHQoKTsNCi0NCi0gICAgICAgICAgICBjdXJyZW50VmFsdWUgPSB2aXJ0dWFsVmFycy5nZXQoY3VycmVudEtleSk7DQotDQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoInsiICsgY3VycmVudEtleSArICIuIiwgInsiICsgY3VycmVudFZhbHVlICsgIi4iKTsNCi0gICAgICAgICAgICAvL2R5bmFtaWMgYmFzZSBhbmQgcHJvcGVydHkNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgieyIgKyBjdXJyZW50S2V5ICsgIlsiLCAieyIgKyBjdXJyZW50VmFsdWUgKyAiWyIpOw0KLQ0KLSAgICAgICAgICAgIG9yaWdpbmFsQmluZGluZyA9IG9yaWdpbmFsQmluZGluZy5yZXBsYWNlKCIuIiArIGN1cnJlbnRLZXkgKyAiLiIsICIuIiArIGN1cnJlbnRWYWx1ZSArICIuIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIi4iICsgY3VycmVudEtleSArICJbIiwgIi4iICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0NCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIl0iLCAiWyciICsgY3VycmVudFZhbHVlICsgIiddIik7DQotICAgICAgICAgICAgLy9keW5hbWljIGJhc2UgYW5kIHByb3BlcnR5DQotICAgICAgICAgICAgb3JpZ2luYWxCaW5kaW5nID0gb3JpZ2luYWxCaW5kaW5nLnJlcGxhY2UoIlsiICsgY3VycmVudEtleSArICJbIiwgIlsiICsgY3VycmVudFZhbHVlICsgIlsiKTsNCi0gICAgICAgICAgICBvcmlnaW5hbEJpbmRpbmcgPSBvcmlnaW5hbEJpbmRpbmcucmVwbGFjZSgiWyIgKyBjdXJyZW50S2V5ICsgIi4iLCAiWyIgKyBjdXJyZW50VmFsdWUgKyAiLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG9yaWdpbmFsQmluZGluZy5zdWJzdHJpbmcoMiwgb3JpZ2luYWxCaW5kaW5nLmxlbmd0aCgpIC0gMSk7DQotICAgIH0NCi0NCi0gICAgLy90byBzdXBwb3J0IGJsYW5rcyAtIGUuZy4gd2l0aCBtYXAgc3ludGF4DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhZGRGdXJ0aGVyQmluZGluZ1BhcnRzKFN0cmluZyBjdXJyZW50QmluZGluZywgU3RyaW5nW10gZm91bmRCaW5kaW5nRGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlscykNCi0gICAgew0KLSAgICAgICAgZm9yKGludCBpID0gaW5kZXhPZkJpbmRpbmdEZXRhaWxzICsgMTsgaSA8IGZvdW5kQmluZGluZ0RldGFpbHMubGVuZ3RoOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgKz0gZm91bmRCaW5kaW5nRGV0YWlsc1tpXTsNCi0gICAgICAgICAgICBpZihmb3VuZEJpbmRpbmdEZXRhaWxzW2ldLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEJpbmRpbmc7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRCaW5kaW5nOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kSW5kZXhPZkJpbmRpbmdEZXRhaWxzKFN0cmluZ1tdIGJpbmRpbmdEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBpbnQgY291bnQgPSAwOw0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBiaW5kaW5nRGV0YWlscykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuY29udGFpbnMoIj0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY291bnQrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZXh0cmFjdEVMVGVybXMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlRUxUZXJtcyhvLCBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKSwgZm91bmRFTFRlcm1zLCAwKSA+IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRFTFRlcm1zOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcmVzb2x2ZUVMVGVybXMoT2JqZWN0IG8sIE1hcDxPYmplY3QsIE9iamVjdD4gdmlzaXRlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb3VuZEVMVGVybXMsIGludCBjb3VudCkgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAobyA9PSBudWxsIHx8IHZpc2l0ZWQuY29udGFpbnNLZXkobykgfHwgY291bnQgPiA1MCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZpc2l0ZWQucHV0KG8sIG51bGwpOw0KLQ0KLSAgICAgICAgaW50IGVsQ291bnQgPSAwOw0KLSAgICAgICAgQ2xhc3MgYyA9IG8uZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIC8vaW5zcGVjdCBtYXBzDQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1hcCkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBmb3IgKE9iamVjdCBlbnRyeSA6ICgoTWFwKSBvKS52YWx1ZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZm91bmQgZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICAgICAgaWYoZW50cnkudG9TdHJpbmcoKS5jb250YWlucygiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKGVudHJ5LnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsQ291bnQgKz0gcmVzb2x2ZUVMVGVybXMoZW50cnksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGVsQ291bnQ7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQobykpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gKytlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9hbmFseXplIGFycmF5cw0KLSAgICAgICAgaWYgKGMuaXNBcnJheSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgobyk7DQotICAgICAgICAgICAgLy9jaGVjayBhcnJheSBbTCAtPiBubyBhcnJheSBvZiBwcmltaXRpdmUgdHlwZXMNCi0gICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoby50b1N0cmluZygpLnN0YXJ0c1dpdGgoIltMamF2YS5sYW5nLlN0cmluZyIpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZChBcnJheS5nZXQobywgaSkpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kRUxUZXJtcyAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEVMVGVybXMuYWRkKG8udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKEFycmF5LmdldChvLCBpKSwgdmlzaXRlZCwgZm91bmRFTFRlcm1zLCBjb3VudCArIDEpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBlbENvdW50Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxGaWVsZD4gYXR0cmlidXRlcyA9IGZpbmRBbGxBdHRyaWJ1dGVzKGMsIG5ldyBBcnJheUxpc3Q8RmllbGQ+KCkpOw0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBhdHRyaWJ1dGVzLnRvQXJyYXkobmV3IEZpZWxkW2F0dHJpYnV0ZXMuc2l6ZSgpXSk7DQotDQotICAgICAgICBBY2Nlc3NpYmxlT2JqZWN0LnNldEFjY2Vzc2libGUoZmllbGRzLCB0cnVlKTsNCi0gICAgICAgIGZvciAoRmllbGQgY3VycmVudEZpZWxkIDogZmllbGRzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQuZ2V0KG8pID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5nZXRUeXBlKCkuZXF1YWxzKFN0cmluZy5jbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkLmdldChvKSAhPSBudWxsICYmIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1XZWxsRm9ybWVkKGN1cnJlbnRGaWVsZC5nZXQobykpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRFTFRlcm1zICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFTFRlcm1zLmFkZChvLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxDb3VudCsrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFjdXJyZW50RmllbGQuZ2V0VHlwZSgpLmlzUHJpbWl0aXZlKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBlbENvdW50ICs9IHJlc29sdmVFTFRlcm1zKGN1cnJlbnRGaWVsZC5nZXQobyksIHZpc2l0ZWQsIGZvdW5kRUxUZXJtcywgY291bnQgKyAxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZWxDb3VudDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEZpZWxkPiBmaW5kQWxsQXR0cmlidXRlcyhDbGFzcyBjLCBMaXN0PEZpZWxkPiBhdHRyaWJ1dGVzKQ0KLSAgICB7DQotICAgICAgICBpZiAoYyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluZEFsbEF0dHJpYnV0ZXMoYy5nZXRTdXBlcmNsYXNzKCksIGF0dHJpYnV0ZXMpOw0KLQ0KLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBjLmdldERlY2xhcmVkRmllbGRzKCk7DQotICAgICAgICBmb3IgKEZpZWxkIGN1cnJlbnRGaWVsZCA6IGZpZWxkcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzU3RhdGljKGN1cnJlbnRGaWVsZC5nZXRNb2RpZmllcnMoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChjdXJyZW50RmllbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdHJ5VG9SZXBsYWNlVmFycyhWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eTsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0gICAgICAgIGJvb2xlYW4gbGFzdCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgd2hpbGUodHJ1ZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxhc3QgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0NCi0gICAgICAgICAgICBwcm9wZXJ0eSA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gVmFsdWVCaW5kaW5nRXhwcmVzc2lvbg0KLSAgICAgICAgICAgICAgICAucmVwbGFjZVByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIGdldE5ld1Byb3BlcnR5KHByb3BlcnR5LCBtYXBwZWRGYWNlbGV0c1ZhcnMpKTsNCi0NCi0gICAgICAgICAgICBpZihyZXN1bHQubGVuZ3RoKCkgPT0gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0UHJvcGVydHkoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpICsgIi4iICsgcmVzdWx0Ow0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpOw0KLQ0KLSAgICAgICAgICAgIGlmKGxhc3QpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcmVmaXgoKSArICJ7IiArIHJlc3VsdCArICJ9Iik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5ld1Byb3BlcnR5KFN0cmluZyBvbGRQcm9wZXJ0eSwgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRGYWNlbGV0c1ZhcnMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFycyA9IGdldFBvdGVudGlhbFZpcnR1YWxWYXJzKG9sZFByb3BlcnR5KTsNCi0NCi0gICAgICAgIGZvcihTdHJpbmcgdmlydHVhbFZhciA6IHZpcnR1YWxWYXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1hcHBlZEZhY2VsZXRzVmFycy5jb250YWluc0tleSh2aXJ0dWFsVmFyKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG9sZFByb3BlcnR5ID0gcmVwbGFjZVByb3BlcnR5VmFsdWUob2xkUHJvcGVydHksIHZpcnR1YWxWYXIsIG1hcHBlZEZhY2VsZXRzVmFycy5nZXQodmlydHVhbFZhcikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvbGRQcm9wZXJ0eTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0UG90ZW50aWFsVmlydHVhbFZhcnMoU3RyaW5nIG9sZFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpbnQgc3RhcnQgPSAtMTsNCi0gICAgICAgIGludCBlbmQgPSAtMTsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsVmFyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG9sZFByb3BlcnR5Lmxlbmd0aCgpOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoc3RhcnQgPT0gLSAxICYmIG9sZFByb3BlcnR5LmNoYXJBdChpKSA9PSAnWycpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKChzdGFydCAhPSAtIDEgJiYgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICdbJykgfHwgb2xkUHJvcGVydHkuY2hhckF0KGkpID09ICddJykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGVuZCA9IGk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKHN0YXJ0ICE9IC0xICYmIGVuZCAhPSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJMaXN0LmFkZChvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOw0KLSAgICAgICAgICAgICAgICBpZihvbGRQcm9wZXJ0eS5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbmQgPSAtMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlydHVhbFZhckxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcGxhY2VQcm9wZXJ0eVZhbHVlKFN0cmluZyBvbGRQcm9wZXJ0eSwgU3RyaW5nIHRhcmdldFZhciwgU3RyaW5nIG5ld1ZhbHVlKQ0KLSAgICB7DQotICAgICAgICBpbnQgaW5kZXggPSBvbGRQcm9wZXJ0eS5pbmRleE9mKHRhcmdldFZhcik7DQotDQotICAgICAgICBpZihpbmRleCA9PSAtMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gb2xkUHJvcGVydHk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gb2xkUHJvcGVydHkuc3Vic3RyaW5nKDAsIGluZGV4KTsNCi0gICAgICAgIHJlc3VsdCArPSBuZXdWYWx1ZTsNCi0gICAgICAgIHJldHVybiByZXN1bHQgKyBvbGRQcm9wZXJ0eS5zdWJzdHJpbmcoaW5kZXggKyB0YXJnZXRWYXIubGVuZ3RoKCksIG9sZFByb3BlcnR5Lmxlbmd0aCgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiByZXBsYWNlIHZpcnR1YWwgZmFjZWxldHMgdmFycyAobWFwIHN5bnRheCkNCi0gICAgICogdGVzdGVkIHN0eWxlcyAoc2ltcGxlIGFuZCBuZXN0ZWQpOiB0ZXN0W2l4W2l4MltpeDNdXV0NCi0gICAgICovDQotICAgIC8qDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBfY3JlYXRlQmluZGluZyhMaXN0PFN0cmluZz4gZXhwcmVzc2lvbnMsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmlydHVhbFZhcnMpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsNCi0NCi0gICAgICAgIFN0cmluZyBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjdXJyZW50QmluZGluZzsNCi0gICAgICAgIFN0cmluZyBwYXJ0T2ZCaW5kaW5nOw0KLQ0KLSAgICAgICAgaW50IGluZGV4T2ZCaW5kaW5nRGV0YWlsczsNCi0gICAgICAgIFN0cmluZ1tdIGZvdW5kQmluZGluZ0RldGFpbHM7DQotICAgICAgICBTdHJpbmdbXSBiaW5kaW5nRGV0YWlsczsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBhZGRlZFZpcnR1YWxOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBleHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aCgiVmFsdWVFeHByZXNzaW9uWyIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZvdW5kQmluZGluZ0RldGFpbHMgPSBlbnRyeS5zcGxpdCgiICIpOw0KLSAgICAgICAgICAgIGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9IGZpbmRJbmRleE9mQmluZGluZ0RldGFpbHMoZm91bmRCaW5kaW5nRGV0YWlscyk7DQotDQotICAgICAgICAgICAgaWYgKGluZGV4T2ZCaW5kaW5nRGV0YWlscyA9PSAtMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBiaW5kaW5nRGV0YWlscyA9IGZvdW5kQmluZGluZ0RldGFpbHNbaW5kZXhPZkJpbmRpbmdEZXRhaWxzXS5zcGxpdCgiPSIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nRGV0YWlscy5sZW5ndGggPCAyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nID0gYmluZGluZ0RldGFpbHNbMV07DQotDQotICAgICAgICAgICAgLy90byBzdXBwb3J0IGJsYW5rcyB3aXRoaW4gYSBiaW5kaW5nIHdpdGggbWFwIHN5bnRheA0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ7IikgJiYgIWN1cnJlbnRCaW5kaW5nLmNvbnRhaW5zKCJ9IikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50QmluZGluZyA9IGFkZEZ1cnRoZXJCaW5kaW5nUGFydHMoY3VycmVudEJpbmRpbmcsIGZvdW5kQmluZGluZ0RldGFpbHMsIGluZGV4T2ZCaW5kaW5nRGV0YWlscyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lICE9IG51bGwgJiYgY3VycmVudEJpbmRpbmcuY29udGFpbnMoIn0iKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyBiZWFucw0KLSAgICAgICAgICAgICAgICBpZighYWRkZWRWaXJ0dWFsTmFtZXMuY29udGFpbnMoYmluZGluZ0RldGFpbHNbMF0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBwYXJ0T2ZCaW5kaW5nID0gY3VycmVudEJpbmRpbmcuc3Vic3RyaW5nKGN1cnJlbnRCaW5kaW5nLmluZGV4T2YocHJldkZhY2VsZXRzQXR0cmlidXRlTmFtZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICArIHByZXZGYWNlbGV0c0F0dHJpYnV0ZU5hbWUubGVuZ3RoKCksIGN1cnJlbnRCaW5kaW5nLmluZGV4T2YoIn0iKSk7DQotDQotICAgICAgICAgICAgICAgICAgICBhZGRlZFZpcnR1YWxOYW1lcy5hZGQoYmluZGluZ0RldGFpbHNbMF0pOw0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgcGFydE9mQmluZGluZzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vZW50cnkgZm9yICJ2aXJ0dWFsIiBmYWNlbGV0cyB2YXINCi0gICAgICAgICAgICBlbHNlIGlmKCEoY3VycmVudEJpbmRpbmcuY29udGFpbnMoInsiKSB8fCBjdXJyZW50QmluZGluZy5jb250YWlucygifSIpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZpcnR1YWxWYXJzLnB1dChiaW5kaW5nRGV0YWlsc1swXSwgYmluZGluZ0RldGFpbHNbMV0uc3Vic3RyaW5nKDEsIGJpbmRpbmdEZXRhaWxzWzFdLmxlbmd0aCgpLTIpKTsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKCFhZGRlZFZpcnR1YWxOYW1lcy5jb250YWlucyhiaW5kaW5nRGV0YWlsc1swXSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZGVkVmlydHVhbE5hbWVzLmFkZChiaW5kaW5nRGV0YWlsc1swXSk7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyZW50QmluZGluZy5zdWJzdHJpbmcoY3VycmVudEJpbmRpbmcuaW5kZXhPZigieyIpICsgMSwgY3VycmVudEJpbmRpbmcuaW5kZXhPZigifSIpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcmV2RmFjZWxldHNBdHRyaWJ1dGVOYW1lID0gYmluZGluZ0RldGFpbHNbMF07DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotICAgICovDQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZWwvVmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OGViNjYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImRpZmZlcmVuY2UgYmV0d2VlbiBbIGFuZCBbJyAtIHRlc3Qgd2l0aCBtb3JlIGNvbnN0ZWxsYXRpb25zIikNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQ0KLXB1YmxpYyBjbGFzcyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uDQotew0KLSAgICBwcml2YXRlIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYmFzZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7DQotICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdG9rZW47DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiByZXBsYWNlT3JBZGRQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbHVlQmluZGluZ0V4cHJlc3Npb24uZ2V0QmFzZUV4cHJlc3Npb24oKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXBsYWNlUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbiwgbmV3UHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGRQcm9wZXJ0eSh2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHJlcGxhY2VQcm9wZXJ0eShWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbHVlQmluZGluZ0V4cHJlc3Npb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1Byb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICAvL1RPRE8gYWRqdXN0bWVudHMgZm9yIGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eQ0KLSAgICAgICAgaWYodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLmVuZHNXaXRoKCInXSIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gPSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZih2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLmdldEJhc2VFeHByZXNzaW9uKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYWRkUHJvcGVydHkodmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRCYXNlRXhwcmVzc2lvbigpLCBuZXdQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkZFByb3BlcnR5KHZhbHVlQmluZGluZ0V4cHJlc3Npb24sIG5ld1Byb3BlcnR5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gYWRkUHJvcGVydHkoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9uLCBTdHJpbmcgbmV3UHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBzb3VyY2VFeHByZXNzaW9uID0gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc291cmNlRXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgc291cmNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpOw0KLQ0KLSAgICAgICAgLy9UT0RPIGFkanVzdG1lbnRzIGZvciBpc0R5bmFtaWNCYXNlQW5kUHJvcGVydHkNCi0gICAgICAgIGlmKG5ld1Byb3BlcnR5LnN0YXJ0c1dpdGgoIlsnIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHJlc3VsdCArIG5ld1Byb3BlcnR5ICsgIn0iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ocmVzdWx0ICsgIi4iICsgbmV3UHJvcGVydHkgKyAifSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKFN0cmluZyBleHByZXNzaW9uKQ0KLSAgICB7DQotICAgICAgICBpZighRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQoZXhwcmVzc2lvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihleHByZXNzaW9uICsgIiBpcyBubyB2YWxpZCBlbC1leHByZXNzaW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBib29sZWFuIGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSA9IGV4cHJlc3Npb24ubGFzdEluZGV4T2YoIiddIikgPT0gLTE7DQotICAgICAgICBpbnQgaW5kZXgxID0gaXNEeW5hbWljQmFzZUFuZFByb3BlcnR5ID8gZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiXSIpIDogZXhwcmVzc2lvbi5sYXN0SW5kZXhPZigiJ10iKTsNCi0gICAgICAgIGludCBpbmRleDIgPSBleHByZXNzaW9uLmxhc3RJbmRleE9mKCIuIik7DQotDQotICAgICAgICBpZihpbmRleDEgPiBpbmRleDIpDQotICAgICAgICB7DQotICAgICAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGluZGV4MSk7DQotDQotICAgICAgICAgICAgaW50IGluZGV4MyA9IGZpbmRJbmRleE9mU3RhcnRpbmdCcmFja2V0KGV4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIGlmKGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBleHByZXNzaW9uLnN1YnN0cmluZyhpbmRleDMgKyAxLCBpbmRleDEpOw0KLQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoaW5kZXgzICsgMiwgaW5kZXgxKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdGhpcy5iYXNlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgzKSArICJ9Iik7DQotICAgICAgICAgICAgdGhpcy50b2tlbiA9IGlzRHluYW1pY0Jhc2VBbmRQcm9wZXJ0eSA/ICJbIiA6ICJbJyI7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKCBpbmRleDIgPiBpbmRleDEpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKGluZGV4MiArIDEsIGV4cHJlc3Npb24ubGVuZ3RoKCkgLSAxICk7DQotICAgICAgICAgICAgdGhpcy5iYXNlID0gbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24oZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgyKSArICJ9Iik7DQotICAgICAgICAgICAgdGhpcy50b2tlbiA9ICIuIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZhbHVlID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoMiwgZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpOw0KLSAgICAgICAgICAgIHRoaXMucHJlZml4ID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgMSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnRyaW0oKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYoIlsiLmVxdWFscyh0aGlzLnRva2VuKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLnZhbHVlLnN0YXJ0c1dpdGgoIiciKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlLnN1YnN0cmluZygxLCB0aGlzLnZhbHVlLmxlbmd0aCgpIC0gMSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vcmV0dXJuIHRoaXMuYmFzZS52YWx1ZSArIHRoaXMudG9rZW4gKyB0aGlzLnZhbHVlLnN1YnN0cmluZygwLCB0aGlzLnZhbHVlLmxlbmd0aCgpKSArICInXSI7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gZ2V0QmFzZUV4cHJlc3Npb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmFzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4cHJlc3Npb25TdHJpbmcoKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgYmFzZUV4cHJlc3Npb24gPSB0aGlzLmJhc2UuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLQ0KLSAgICAgICAgICAgIGlmKCJbJyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAiJ119IjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZigiWyIuZXF1YWxzKHRoaXMudG9rZW4pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VFeHByZXNzaW9uLnN1YnN0cmluZygwLCBiYXNlRXhwcmVzc2lvbi5sZW5ndGgoKSAtIDEpICsgdGhpcy50b2tlbiArIHRoaXMudmFsdWUgKyAiXX0iOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gYmFzZUV4cHJlc3Npb24uc3Vic3RyaW5nKDAsIGJhc2VFeHByZXNzaW9uLmxlbmd0aCgpIC0gMSkgKyB0aGlzLnRva2VuICsgdGhpcy52YWx1ZSArICJ9IjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVmaXggKyAieyIgKyB0aGlzLnZhbHVlICsgIn0iOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5iYXNlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZS5nZXRQcmVmaXgoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJlZml4Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmJhc2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmJhc2Uuc2V0UHJlZml4KHByZWZpeCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEV4cHJlc3Npb25TdHJpbmcoKS5oYXNoQ29kZSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gJiYgZ2V0RXhwcmVzc2lvblN0cmluZygpDQotICAgICAgICAgICAgLmVxdWFscygoKFZhbHVlQmluZGluZ0V4cHJlc3Npb24pIHRhcmdldCkuZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGludCBmaW5kSW5kZXhPZlN0YXJ0aW5nQnJhY2tldChTdHJpbmcgZXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgaW50IGNsb3NlQ291bnQgPSAwOw0KLSAgICAgICAgZm9yKGludCBpID0gZXhwcmVzc2lvbi5sZW5ndGgoKSAtIDE7IGkgPiAwOyBpLS0pDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoZXhwcmVzc2lvbi5jaGFyQXQoaSkgPT0gJ1snKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY2xvc2VDb3VudC0tOw0KLSAgICAgICAgICAgICAgICBpZihjbG9zZUNvdW50IDwgMCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZihleHByZXNzaW9uLmNoYXJBdChpKSA9PSAnXScpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjbG9zZUNvdW50Kys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0Fic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0Fic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzEwMGIzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlckNvbXBhcmF0b3I7DQotDQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxUPiBpbXBsZW1lbnRzIE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8TmFtZU1hcHBlcjxUPj4NCi17DQotICAgIHByaXZhdGUgTGlzdDxDbGFzcz4gZGVuaWVkTmFtZU1hcHBlckxpc3QgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLQ0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVnaXN0ZXIoTmFtZU1hcHBlcjxUPiBuYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICBpZighZGVuaWVkTmFtZU1hcHBlckxpc3QuY29udGFpbnMobmFtZU1hcHBlci5nZXRDbGFzcygpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBnZXROYW1lTWFwcGVyTGlzdCgpLmFkZChuYW1lTWFwcGVyKTsNCi0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGdldE5hbWVNYXBwZXJMaXN0KCksIGdldENvbXBhcmF0b3IoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIENvbXBhcmF0b3I8TmFtZU1hcHBlcjxUPj4gZ2V0Q29tcGFyYXRvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxOYW1lTWFwcGVyPFQ+PigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkZXJlZ2lzdGVyKENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBjbGFzc1RvRGVyZWdpc3RlcikNCi0gICAgew0KLSAgICAgICAgSXRlcmF0b3I8TmFtZU1hcHBlcjxUPj4gbmFtZU1hcHBlckl0ZXJhdG9yID0gZ2V0TmFtZU1hcHBlckxpc3QoKS5pdGVyYXRvcigpOw0KLSAgICAgICAgd2hpbGUobmFtZU1hcHBlckl0ZXJhdG9yLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihuYW1lTWFwcGVySXRlcmF0b3IubmV4dCgpLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc1RvRGVyZWdpc3Rlci5nZXROYW1lKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbmFtZU1hcHBlckl0ZXJhdG9yLnJlbW92ZSgpOw0KLSAgICAgICAgICAgICAgICAvL2Rvbid0IGJyZWFrIC0gZS5nLiB0byBkZXJlZ2lzdGVyIGFsbCB3cmFwcGVycy4uLg0KLSAgICAgICAgICAgICAgICAvL2JyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBkZW55KENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiBjbGFzc1RvRGVueSkNCi0gICAgew0KLSAgICAgICAgZGVyZWdpc3RlcihjbGFzc1RvRGVueSk7DQotDQotICAgICAgICBzeW5jaHJvbml6ZWQgKGdldENsYXNzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZGVuaWVkTmFtZU1hcHBlckxpc3QuYWRkKGNsYXNzVG9EZW55KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdDxOYW1lTWFwcGVyPFQ+PiBnZXROYW1lTWFwcGVyTGlzdCgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0NsYXNzTWFwcGluZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2NjA3MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvQ2xhc3NNYXBwaW5nRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ2xhc3NNYXBwaW5nRmFjdG9yeTxQLCBSPg0KLXsNCi0gICAgUiBjcmVhdGUoUCBzb3VyY2UpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRGVmYXVsdEZhY3RvcnlGaW5kZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9EZWZhdWx0RmFjdG9yeUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjk3NTVmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9EZWZhdWx0RmFjdG9yeUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLkRlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuRGVmYXVsdEVMSGVscGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIuRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8vZHluYW1pYyBhcHByb2FjaCB0byBjcmVhdGUgdGhlIGZhY3RvcmllcyBkdXJpbmcgdGhlIGZpcnN0IHJlcXVlc3QsIHdoZW4gYSBmYWNlcy1jb250ZXh0IGlzIGF2YWlsYWJsZQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWN0b3J5RmluZGVyIGltcGxlbWVudHMgRmFjdG9yeUZpbmRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0gICAgcHJvdGVjdGVkIE1hcDxGYWN0b3J5TmFtZXMsIE9iamVjdD4gZmFjdG9yeU1hcCA9IG5ldyBIYXNoTWFwPEZhY3RvcnlOYW1lcywgT2JqZWN0PigpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBGYWN0b3J5RmluZGVyIGZhY3RvcnlGaW5kZXIgPSBuZXcgRGVmYXVsdEZhY3RvcnlGaW5kZXIoKTsNCi0NCi0gICAgcHJvdGVjdGVkIERlZmF1bHRGYWN0b3J5RmluZGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY3RvcnlGaW5kZXIgZ2V0SW5zdGFuY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjdG9yeUZpbmRlcjsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgZmluYWwgPFQ+IFQgZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUsIENsYXNzPFQ+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZighKGZhY3RvcnlNYXAuY29udGFpbnNLZXkoZmFjdG9yeU5hbWUpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0RmFjdG9yeShmYWN0b3J5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKFQpZmFjdG9yeU1hcC5nZXQoZmFjdG9yeU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0RmFjdG9yeShGYWN0b3J5TmFtZXMgZmFjdG9yeU5hbWUpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0gICAgICAgIHN3aXRjaCAoZmFjdG9yeU5hbWUpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2FzZSBDT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9TVFJBVEVHWV9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIE1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZU1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBNRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZU1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZVJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgRUxfSEVMUEVSX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVFTEhlbHBlckZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgY2FzZSBGQUNFU19NRVNTQUdFX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVGYWNlc01lc3NhZ2VGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlk6DQotICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICBjYXNlIFNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZOg0KLSAgICAgICAgICAgICAgICBmYWN0b3J5ID0gY3JlYXRlU3RvcmFnZU1hbmFnZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIGNhc2UgVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWToNCi0gICAgICAgICAgICAgICAgZmFjdG9yeSA9IGNyZWF0ZVZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5KCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICANCi0gICAgICAgICAgICBkZWZhdWx0OiAvL3JlcXVpcmVkIGJ5IGNoZWNrc3R5bGUNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgcG9zc2libGUgdG8gY3JlYXRlIGZhY3RvcnkgIiArIGZhY3RvcnlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZhY3RvcnlNYXAucHV0KGZhY3RvcnlOYW1lLCBmYWN0b3J5KTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0NPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkpOw0KLSAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkNPTVBPTkVOVF9NRVRBX0RBVEFfRVhUUkFDVE9SX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IG1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSk7DQotICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnlDbGFzc05hbWVzLmFkZChEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogdmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1lc3NhZ2VSZXNvbHZlckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotICAgICAgICBMaXN0PFN0cmluZz4gbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSk7DQotICAgICAgICBtZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWVzc2FnZVJlc29sdmVyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBudWxsOw0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgbWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZICk7DQotICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1RSQU5TRk9STUVSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBtZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYWRkIGdsb2JhbCBwcm9wZXJ0eSBleHRlbnNpb24gcG9pbnQiKQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUZhY2VzTWVzc2FnZUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVzLmFkZChXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX0ZBQ0VTX01FU1NBR0VfRkFDVE9SWSk7DQotICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkpKTsNCi0NCi0gICAgICAgIE9iamVjdCB0YXJnZXQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShDdXN0b21JbmZvcm1hdGlvbi5GQUNFU19NRVNTQUdFX0ZBQ1RPUlkubmFtZSgpKTsNCi0gICAgICAgIGlmKHRhcmdldCAhPSBudWxsICYmIHRhcmdldCBpbnN0YW5jZW9mIFN0cmluZykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoKFN0cmluZyl0YXJnZXQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBmYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWN0b3J5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlRUxIZWxwZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0RUxIZWxwZXJGYWN0b3J5KCk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnbG9iYWwgcHJvcGVydHkgZXh0ZW5zaW9uIHBvaW50IikNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlkpOw0KLSAgICAgICAgdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9QQVJBTUVURVJfRVhUUkFDVE9SX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lcy5hZGQoRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgICAgIC5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSk7DQotICAgICAgICBzdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVzDQotICAgICAgICAgICAgLmFkZChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uU1RPUkFHRV9NQU5BR0VSX0ZBQ1RPUlkpKTsNCi0gICAgICAgIHN0b3JhZ2VNYW5hZ2VyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IHN0b3JhZ2VNYW5hZ2VyRmFjdG9yeUNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFjdG9yeTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBjcmVhdGVWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmYWN0b3J5ID0gbnVsbDsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5Q2xhc3NOYW1lcw0KLSAgICAgICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fVkFMSURBVElPTl9QQVJBTUVURVJfRkFDVE9SWSk7DQotICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1BBUkFNRVRFUl9GQUNUT1JZKSk7DQotICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZXMuYWRkKERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogdmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnlDbGFzc05hbWVzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY3RvcnkgPSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YmQ4YTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY2VzTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRmFjZXNNZXNzYWdlRmFjdG9yeQ0KLXsNCi0gICAgRmFjZXNNZXNzYWdlIGNvbnZlcnQoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSk7DQotDQotICAgIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvRmFjdG9yeUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGYyNjI1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpCi1wdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnlGaW5kZXIKLXsKLSAgICA8VD4gVCBnZXRGYWN0b3J5KEZhY3RvcnlOYW1lcyBmYWN0b3J5TmFtZSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlOYW1lcy5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L0ZhY3RvcnlOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTJiMTVlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvZmFjdG9yeS9GYWN0b3J5TmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5BUEl9KQotcHVibGljIGVudW0gRmFjdG9yeU5hbWVzCi17Ci0gICAgQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwKLQotICAgIFZBTElEQVRJT05fUEFSQU1FVEVSX0VYVFJBQ1RPUl9GQUNUT1JZLAotICAgIFZBTElEQVRJT05fUEFSQU1FVEVSX0ZBQ1RPUlksCi0KLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksCi0gICAgTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLAotICAgIE1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLAotCi0gICAgRkFDRVNfTUVTU0FHRV9GQUNUT1JZLAotCi0gICAgUkVOREVSS0lUX1dSQVBQRVJfRkFDVE9SWSwKLSAgICBFTF9IRUxQRVJfRkFDVE9SWSwKLQotICAgIFNUT1JBR0VfTUFOQUdFUl9GQUNUT1JZCi19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9mYWN0b3J5L05hbWVNYXBwZXJBd2FyZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQyZDFmMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ZhY3RvcnkvTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk8VCBleHRlbmRzIE5hbWVNYXBwZXI+DQotew0KLSAgICB2b2lkIHJlZ2lzdGVyKFQgY2xhc3NUb0FkZCk7DQotICAgIHZvaWQgZGVyZWdpc3RlcihDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gY2xhc3NUb0RlcmVnaXN0ZXIpOw0KLSAgICB2b2lkIGRlbnkoQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IGNsYXNzVG9EZW55KTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb21wb25lbnQvQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjUwMGMzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0Fic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRTZWNyZXQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RCb29sZWFuQ2hlY2tib3g7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVMaXN0Ym94Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0T25lTWVudTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbFNlbGVjdE9uZVJhZGlvOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUNoZWNrYm94Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUxpc3Rib3g7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TWVudTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dGFyZWE7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplciBpbXBsZW1lbnRzIENvbXBvbmVudEluaXRpYWxpemVyDQotew0KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGlmKHByb2Nlc3NDb21wb25lbnQodWlDb21wb25lbnQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbGlkYXRlRW1wdHlGaWVsZHMoKSAmJiBFeHRWYWxVdGlscy5pc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25BY3RpdmUoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyZVJlcXVpcmVkQXR0cmlidXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgY29uZmlndXJlTWF4TGVuZ3RoQXR0cmlidXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUVtcHR5RmllbGRzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLnZhbGlkYXRlRW1wdHlGaWVsZHMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjb25maWd1cmVSZXF1aXJlZEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSk7DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRTZWNyZXQgfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94IHx8DQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lTWVudSB8fA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVSYWRpbyB8fA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueUxpc3Rib3ggfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0TWFueU1lbnUgfHwNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogaWYgdGhlcmUgaXMgbm8gc3BlY2lhbCBhdHRyaWJ1dGUgYXQgdGhlIGNvbXBvbmVudCB3aGljaCBzaG91bGQgb3ZlcnJ1bGUNCi0gICAgICogdGhlIGFubm90YXRlZCBwcm9wZXJ0eSByZXR1cm4gdHJ1ZSENCi0gICAgICoNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IGNvbXBvbmVudCB3aGljaCBpbXBsZW1lbnRzIHRoZSBFZGl0YWJsZVZhbHVlSG9sZGVyIGludGVyZmFjZQ0KLSAgICAgKiBAcmV0dXJuIGZhbHNlIHRvIG92ZXJydWxlIHRoZSBhbm5vdGF0ZWQgcHJvcGVydHkgZS5nLiBpZiBjb21wb25lbnQgaXMgcmVhZG9ubHkNCi0gICAgICovDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJyZWZhY3RvciIpDQotICAgIHByb3RlY3RlZCBCb29sZWFuIGlzQ29tcG9uZW50UmVxdWlyZWQoVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFCb29sZWFuLkZBTFNFLmVxdWFscyhSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImlzUmVhZG9ubHkiKSkpOw0KLSAgICAgICAgYm9vbGVhbiBpc0Rpc2FibGVkID0gIUJvb2xlYW4uRkFMU0UuZXF1YWxzKFJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCgNCi0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQsIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh1aUNvbXBvbmVudC5nZXRDbGFzcygpLCAiaXNEaXNhYmxlZCIpKSk7DQotDQotICAgICAgICByZXR1cm4gIShpc1JlYWRPbmx5IHx8IGlzRGlzYWJsZWQpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZU1heExlbmd0aEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpDQotICAgIHsNCi0gICAgICAgIGlmKG1ldGFEYXRhLmNvbnRhaW5zS2V5KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBPYmplY3QgbWF4TGVuZ3RoID0gbWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RIKTsNCi0NCi0gICAgICAgICAgICBpZighKG1heExlbmd0aCBpbnN0YW5jZW9mIEludGVnZXIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBIdG1sSW5wdXRUZXh0IGh0bWxJbnB1dFRleHQgPSAoSHRtbElucHV0VGV4dCl1aUNvbXBvbmVudDsNCi0gICAgICAgICAgICAgICAgaHRtbElucHV0VGV4dC5zZXRNYXhsZW5ndGgoKEludGVnZXIpbWF4TGVuZ3RoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEh0bWxJbnB1dFNlY3JldCBodG1sSW5wdXRTZWNyZXQgPSAoSHRtbElucHV0U2VjcmV0KXVpQ29tcG9uZW50Ow0KLSAgICAgICAgICAgICAgICBodG1sSW5wdXRTZWNyZXQuc2V0TWF4bGVuZ3RoKChJbnRlZ2VyKW1heExlbmd0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbXBvbmVudC9Db21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzhlMzU1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29tcG9uZW50L0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gaW5pdGlhbGl6ZSBjb21wb25lbnRzIGJlZm9yZUVuY29kZUJlZ2luLjxici8+DQotICogZS5nLjogeW91IGNhbiBhZGQgaW5mb3JtYXRpb24gZm9yIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gbWVjaGFuaXNtcywuLi4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBDb21wb25lbnRJbml0aWFsaXplcg0KLXsNCi0gICAgdm9pZCBjb25maWd1cmVDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5YzA0MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXRpY0NvbmZpZ3VyYXRpb248VCwgUj4NCi17DQotICAgIHZvaWQgc2V0U291cmNlT2ZNYXBwaW5nKFN0cmluZyBwYXRoKTsNCi0gICAgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8VCwgUj4+IGdldE1hcHBpbmcoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjg0YWY1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgY2xhc3MgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFQsIFI+DQotew0KLSAgICBwcml2YXRlIFQgc291cmNlOw0KLSAgICBwcml2YXRlIFIgdGFyZ2V0Ow0KLQ0KLSAgICBwdWJsaWMgVCBnZXRTb3VyY2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc291cmNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZShUIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFIgZ2V0VGFyZ2V0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoUiB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNDb25maWd1cmF0aW9uTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q3NWJmNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuQVBJfSkKLXB1YmxpYyBlbnVtIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcwotewotICAgIE1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1NUUkFURUdZX1RPX01FU1NBR0VfUkVTT0xWRVJfQ09ORklHLAotICAgIFZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0NPTkZJRywKLSAgICBTVE9SQUdFX1RZUEVfVE9fU1RPUkFHRV9NQU5BR0VSX0NPTkZJRywKLQotICAgIFNLSVBfVkFMSURBVElPTl9TVVBQT1JUX0NPTkZJRywKLSAgICBWQUxJREFUSU9OX1BBUkFNRVRFUl9DT05GSUcKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2luaXRpYWxpemVyL2NvbmZpZ3VyYXRpb24vU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwY2I2ZjQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIExpc3Q8U3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPj4gbWFwcGluZ3MKLSAgICAgICAgPSBuZXcgQXJyYXlMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VPZk1hcHBpbmcoU3RyaW5nIHBhdGgpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGdldE1hcHBpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2Uoc291cmNlKTsKLSAgICAgICAgZW50cnkuc2V0VGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgIHRoaXMubWFwcGluZ3MuYWRkKGVudHJ5KTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbml0aWFsaXplci9jb25maWd1cmF0aW9uL1N0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWE2M2M0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW5pdGlhbGl6ZXIvY29uZmlndXJhdGlvbi9TdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5SRVVTRX0pCi1wdWJsaWMgY2xhc3MgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uIGltcGxlbWVudHMgU3RhdGljQ29uZmlndXJhdGlvbjxTdHJpbmcsIFN0cmluZz4KLXsKLSAgICBwcml2YXRlIFN0cmluZyBwYXRoOwotICAgIHByaXZhdGUgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5nczsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZU9mTWFwcGluZyhTdHJpbmcgcGF0aCkKLSAgICB7Ci0gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgICAgIC8vZm9yY2UgcmVsb2FkCi0gICAgICAgIG1hcHBpbmdzID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBnZXRNYXBwaW5nKCkKLSAgICB7Ci0gICAgICAgIGlmKG1hcHBpbmdzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtYXBwaW5nczsKLSAgICAgICAgfQotCi0gICAgICAgIG1hcHBpbmdzID0gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotCi0gICAgICAgIFJlc291cmNlQnVuZGxlIG1hcHBpbmcgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocGF0aCk7Ci0KLSAgICAgICAgaWYgKG1hcHBpbmcgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9sb2dnaW5nCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IG1hcHBpbmcuZ2V0S2V5cygpOwotCi0gICAgICAgIFN0cmluZyBtZXRhRGF0YUtleTsKLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsKLQotICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YURhdGFLZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUgPSBtYXBwaW5nLmdldFN0cmluZyhtZXRhRGF0YUtleSk7Ci0KLSAgICAgICAgICAgIGFkZE1hcHBpbmcobWV0YURhdGFLZXksIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcHBpbmdzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBtZXRhRGF0YUtleSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBuZXcgU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBlbnRyeS5zZXRTb3VyY2UobWV0YURhdGFLZXkpOwotICAgICAgICBlbnRyeS5zZXRUYXJnZXQodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsKLSAgICAgICAgdGhpcy5tYXBwaW5ncy5hZGQoZW50cnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTkzOTY4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yIGltcGxlbWVudHMgUmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRJbnRlcmNlcHRvcklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJldHVyblZhbHVlT25Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKAotICAgICAgICBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIHNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24sIE9iamVjdCBjdXJyZW50UmV0dXJuVmFsdWUpCi0gICAgewotICAgICAgICByZXR1cm4gY3VycmVudFJldHVyblZhbHVlOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBiZWZvcmUKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJlZm9yZURlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbiwgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGFmdGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFmdGVyR2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvLCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uLCBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyNzEyOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0Fic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5WYWxpZGF0aW9uTW9kdWxlS2V5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5NZXRhRGF0YUV4dHJhY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlY29yZGVyLlByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkVkaXRhYmxlVmFsdWVIb2xkZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguZWwuUHJvcGVydHlOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgeC54LjMKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25JbnRlcmNlcHRvciBleHRlbmRzIEFic3RyYWN0UmVuZGVyZXJJbnRlcmNlcHRvcgotewotICAgIHByb3RlY3RlZCBib29sZWFuIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvblN1cHBvcnRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpCi0gICAgICAgICAgICB0aHJvd3MgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBjb21wb25lbnQgaW5pdGlhbGl6YXRpb24gc2V0cyBhIGNvbXBvbmVudCB0byByZXF1aXJlZCBpZiB0aGVyZSBhcmUgY29uc3RyYWludHMgd2hpY2ggaW5kaWNhdGUgaXQKLSAgICAgICAgICogdGhlIHJlcXVpcmVkIGZsYWcgaW4gYSBjb21wb25lbnQgbGVhZHMgdG8gcHJvYmxlbXMgd2l0aCBoOm1lc3NhZ2VzIChhZGRpdGlvbmFsIG1lc3NhZ2UpIGFzIHdlbGwgYXMKLSAgICAgICAgICogaW5jb21wYXRpYmlsaXRpZXMgd2l0aCBza2lwIHZhbGlkYXRpb24gYW5kIHNldmVyaXRpZXMKLSAgICAgICAgICovCi0gICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlciAmJiBFeHRWYWxVdGlscy5pc1JlcXVpcmVkUmVzZXRBY3RpdmF0ZWQoKSAmJgotICAgICAgICAgICAgICAgIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvblN1cHBvcnRlZCgpICYmIEV4dFZhbFV0aWxzLmlzUmVxdWlyZWRJbml0aWFsaXphdGlvbkFjdGl2ZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciB3cmFwcGVkKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSAmJiAhaXNDb21wb25lbnRJbml0aWFsaXphdGlvbkRlYWN0aXZhdGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRDb21wb25lbnQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0Q29tcG9uZW50KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgd3JhcHBlZCkKLSAgICAgICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3Q7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnZlcnRlZE9iamVjdCA9IHdyYXBwZWQuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFByb3BlcnR5Tm90Rm91bmRFeGNlcHRpb24gcikKLSAgICAgICAgewotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNGYXRhbEVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5mYXRhbCgiaXQgc2VlbXMgeW91IGFyZSB1c2luZyBhbiBpbnZhbGlkIGJpbmRpbmcuICIgKyB3cmFwcGVkLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICI6IGNvbnZlcnNpb24gZmFpbGVkLiBub3JtYWxseSB0aGlzIGlzID5ub3Q8IGEgbXlmYWNlcyBleHR2YWwgaXNzdWUhIiwgcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRocm93IHI7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydGllcyh1aUNvbXBvbmVudCk7Ci0gICAgICAgIAotICAgICAgICBpZihyZWNvcmRQcm9jZXNzZWRJbmZvcm1hdGlvbigpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL3JlY29yZGUgdXNlciBpbnB1dCBlLmcuIGZvciBjcm9zcy1jb21wb25lbnQgdmFsaWRhdGlvbgotICAgICAgICAgICAgZm9yKFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIgcmVjb3JkZXIgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlY29yZGVyLnJlY29yZFVzZXJJbnB1dCh1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHJlY29yZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjYWxsZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocHJvY2Vzc0NvbXBvbmVudCh1aUNvbXBvbmVudCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udmVydGVkT2JqZWN0ID0gdHJhbnNmb3JtVmFsdWVGb3JWYWxpZGF0aW9uKGNvbnZlcnRlZE9iamVjdCk7Ci0KLSAgICAgICAgICAgICAgICBpZih2YWxpZGF0ZVZhbHVlKGNvbnZlcnRlZE9iamVjdCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NCZWZvcmVWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVmFsaWRhdG9yRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBtaWdodCBkZWNpZGUgdGhhdCBpdCBpc24ndCBhbiBleGNlcHRpb24KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50KHVpQ29tcG9uZW50LCBlLmdldEZhY2VzTWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZmluYWxFeGNlcHRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbnZlcnRlckV4Y2VwdGlvbihlLmdldEZhY2VzTWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHByb2Nlc3NBZnRlclZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsKLSAgICAgICAgICAgIHJlc2V0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnRpZXModWlDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0JlZm9yZVZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5leGVjdXRlR2xvYmFsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWx1ZSwKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uLmNsYXNzLmdldE5hbWUoKSwgZ2V0UHJvcGVydHlJbmZvcm1hdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KSwgZ2V0TW9kdWxlS2V5KCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NBZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIEV4dFZhbFV0aWxzLmV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsdWUsCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIGdldFByb3BlcnR5SW5mb3JtYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCksIGdldE1vZHVsZUtleSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUHJvcGVydHlJbmZvcm1hdGlvbiBnZXRQcm9wZXJ0eUluZm9ybWF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gZ2V0UHJvcGVydGllc0ZvckNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKHVpQ29tcG9uZW50KTsKLQotICAgICAgICBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKHByb3BlcnRpZXMpOwotCi0gICAgICAgIHJldHVybiBtZXRhRGF0YUV4dHJhY3Rvci5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXNGb3JDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgICAgIGlmKGdldE1vZHVsZUtleSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpLCBnZXRNb2R1bGVLZXkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvcGVydGllcy5wdXQoVUlDb21wb25lbnQuY2xhc3MuZ2V0TmFtZSgpLCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpOwotCi0gICAgcHJvdGVjdGVkIE9iamVjdCB0cmFuc2Zvcm1WYWx1ZUZvclZhbGlkYXRpb24oT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkKLSAgICB7Ci0gICAgICAgIGlmICgiIi5lcXVhbHMoY29udmVydGVkT2JqZWN0KSAmJiBpbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRPYmplY3Q7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZShPYmplY3QgY29udmVydGVkT2JqZWN0KQotICAgIHsKLSAgICAgICAgaWYoaXNWYWx1ZVRvVmFsaWRhdGVFbXB0eShjb252ZXJ0ZWRPYmplY3QpICYmICF2YWxpZGF0ZUVtcHR5RmllbGRzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoImVtcHR5IGZpZWxkIHZhbGlkYXRpb24gaXMgZGVhY3RpdmF0ZWQgaW4gdGhlIHdlYi54bWwgLSBzZWU6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImphdmF4LmZhY2VzLlZBTElEQVRFX0VNUFRZX0ZJRUxEUyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbHVlVG9WYWxpZGF0ZUVtcHR5KE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpCi0gICAgewotICAgICAgICByZXR1cm4gY29udmVydGVkT2JqZWN0ID09IG51bGwgfHwgIiIuZXF1YWxzKGNvbnZlcnRlZE9iamVjdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVFbXB0eUZpZWxkcygpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMudmFsaWRhdGVFbXB0eUZpZWxkcygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGludGVycHJldEVtcHR5U3RyaW5nVmFsdWVzQXNOdWxsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5pbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKAotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIgJiYgaXNWYWx1ZUJpbmRpbmdPZkNvbXBvbmVudFZhbGlkKHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWx1ZUJpbmRpbmdPZkNvbXBvbmVudFZhbGlkKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFByb3BlcnR5RGV0YWlsc09mVmFsdWVCaW5kaW5nKHVpQ29tcG9uZW50KSAhPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcG9uZW50SW5pdGlhbGl6YXRpb25EZWFjdGl2YXRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ09NUE9ORU5UX0lOSVRJQUxJWkFUSU9OKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWNvcmRQcm9jZXNzZWRJbmZvcm1hdGlvbigpCi0gICAgewotICAgICAgICAvL292ZXJyaWRlIGlmIG5lZWRlZAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENsYXNzIGdldE1vZHVsZUtleSgpCi0gICAgewotICAgICAgICAvL292ZXJyaWRlIGlmIG5lZWRlZAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRJbnRlcmNlcHRvclByb3BlcnRpZXMoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgICAgIGlmKGdldE1vZHVsZUtleSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5wdXQoVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCksIGdldE1vZHVsZUtleSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQucHV0KFVJQ29tcG9uZW50LmNsYXNzLmdldE5hbWUoKSwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0aWVzKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgIHsKLSAgICAgICAgUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZSBpbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZSA9IGdldFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UoKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBnZXRJbnRlcmNlcHRvclByb3BlcnRpZXModWlDb21wb25lbnQpOwotICAgICAgICBmb3IoU3RyaW5nIGtleSA6IHByb3BlcnRpZXMua2V5U2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLnNldFByb3BlcnR5KGtleSwgcHJvcGVydGllcy5nZXQoa2V5KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydGllcyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UgaW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UgPSBnZXRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlKCk7Ci0KLSAgICAgICAgZm9yKFN0cmluZyBrZXkgOiBnZXRJbnRlcmNlcHRvclByb3BlcnRpZXModWlDb21wb25lbnQpLmtleVNldCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5yZW1vdmVQcm9wZXJ0eShrZXkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlIGdldFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoUmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5jbGFzcywKLSAgICAgICAgICAgICAgICBSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Db21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Bd2FyZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZjcxMTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Db21wb25lbnRJbml0aWFsaXphdGlvbkF3YXJlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlclN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5SRVVTRSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50SW5pdGlhbGl6YXRpb25Bd2FyZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKEpzZlV0aWxzLmlzUmVuZGVyUmVzcG9uc2VQaGFzZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFmdGVyRXh0cmFjdGluZ0ZvckNvbXBvbmVudEluaXRpYWxpemF0aW9uKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFmdGVyRXh0cmFjdGluZ0ZvckNvbXBvbmVudEluaXRpYWxpemF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbik7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvRmFjZXNNZXNzYWdlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2YjE2My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0ZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkZhY2VzTWVzc2FnZVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDkwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBGYWNlc01lc3NhZ2VQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFmdGVyVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2VTdG9yYWdlIGZhY2VzTWVzc2FnZVN0b3JhZ2UgPSBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKA0KLSAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLCBGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBpZihmYWNlc01lc3NhZ2VTdG9yYWdlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNNZXNzYWdlU3RvcmFnZS5hZGRBbGwoKTsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5yZXNldFN0b3JhZ2UoRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcywgRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL0h0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDdjOTI4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5MYWJlbGVkTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLmV4Y2VwdGlvbi5SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFNlY3JldDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0Qm9vbGVhbkNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVMaXN0Ym94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVNZW51OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RPbmVSYWRpbzsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueUNoZWNrYm94OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxTZWxlY3RNYW55TGlzdGJveDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sU2VsZWN0TWFueU1lbnU7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50Lmh0bWwuSHRtbElucHV0VGV4dGFyZWE7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yCi17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpCi0gICAgewotICAgICAgICBpZihwcm9jZXNzQ29tcG9uZW50KHVpQ29tcG9uZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSBFeHRWYWxVdGlscy5jb252ZXJ0RmFjZXNNZXNzYWdlKHZhbGlkYXRvckV4Y2VwdGlvbi5nZXRGYWNlc01lc3NhZ2UoKSk7Ci0KLSAgICAgICAgICAgIHRyeVRvVXNlSW5saW5lTWVzc2FnZSh1aUNvbXBvbmVudCwgdmFsaWRhdG9yRXhjZXB0aW9uKTsKLQotICAgICAgICAgICAgdHJ5VG9Vc2VMYWJlbChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBmYWNlc01lc3NhZ2UpOwotCi0gICAgICAgICAgICB0cnlUb0Jsb2Nrc05hdmlnYXRpb24odWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGZhY2VzTWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvVXNlSW5saW5lTWVzc2FnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCk7Ci0gICAgICAgIFN0cmluZyBpbmxpbmVNZXNzYWdlOwotCi0gICAgICAgIGlmKHZhbGlkYXRvckV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmxpbmVNZXNzYWdlID0gZ2V0SW5saW5lUmVxdWlyZWRNZXNzYWdlKHVpQ29tcG9uZW50KTsKLQotICAgICAgICAgICAgaWYoaW5saW5lTWVzc2FnZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGlubGluZU1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoaW5saW5lTWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgaW5saW5lTWVzc2FnZSA9IGdldElubGluZVZhbGlkYXRvck1lc3NhZ2UodWlDb21wb25lbnQpOwotCi0gICAgICAgICAgICBpZihpbmxpbmVNZXNzYWdlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoaW5saW5lTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldERldGFpbChpbmxpbmVNZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0cnlUb1VzZUxhYmVsKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpCi0gICAgewotICAgICAgICBTdHJpbmcgbGFiZWwgPSAoU3RyaW5nKSBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsCi0gICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldExhYmVsIikpOwotCi0gICAgICAgIGlmKGxhYmVsID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxhYmVsID0gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vb3ZlcnJpZGUgdGhlIGxhYmVsIGlmIHRoZSBhbm5vdGF0aW9uIHByb3ZpZGVzIGEgbGFiZWwKLSAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuTEFCRUwpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxhYmVsID0gbWV0YURhdGFFbnRyeS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5MQUJFTCwgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGZhY2VzTWVzc2FnZSBpbnN0YW5jZW9mIExhYmVsZWRNZXNzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKExhYmVsZWRNZXNzYWdlKWZhY2VzTWVzc2FnZSkuc2V0TGFiZWxUZXh0KGxhYmVsKTsKLSAgICAgICAgfQotICAgICAgICAvL2lmIHNvbWVvbmUgdXNlcyBhIG5vcm1hbCBmYWNlcyBtZXNzYWdlCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1BsYWNlTGFiZWwoZmFjZXNNZXNzYWdlLCBsYWJlbCwgaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiY2hlY2sgaWYgaXQgaXMgc3RpbGwgcmVxdWlyZWQgaGVyZSIpCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvQmxvY2tzTmF2aWdhdGlvbihVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQotICAgIHsKLSAgICAgICAgaWYobWV0YURhdGFFbnRyeSAhPSBudWxsICYmIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vY29ycmVjdCBzZXZlcml0eSBpcyBlLmcuIHByb3ZpZGVkIGJ5IFZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yCi0gICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnQodWlDb21wb25lbnQsIGZhY2VzTWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRJbmxpbmVSZXF1aXJlZE1lc3NhZ2UoVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gKFN0cmluZylSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QodWlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHVpQ29tcG9uZW50LmdldENsYXNzKCksICJnZXRSZXF1aXJlZE1lc3NhZ2UiKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW5saW5lVmFsaWRhdG9yTWVzc2FnZShVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKVJlZmxlY3Rpb25VdGlscy50cnlUb0ludm9rZU1ldGhvZCh1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9HZXRNZXRob2QodWlDb21wb25lbnQuZ2V0Q2xhc3MoKSwgImdldFZhbGlkYXRvck1lc3NhZ2UiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0NvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFRleHQgfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxJbnB1dFNlY3JldCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdEJvb2xlYW5DaGVja2JveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE9uZUxpc3Rib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RPbmVNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sU2VsZWN0T25lUmFkaW8gfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55Q2hlY2tib3ggfHwKLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEh0bWxTZWxlY3RNYW55TGlzdGJveCB8fAotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50IGluc3RhbmNlb2YgSHRtbFNlbGVjdE1hbnlNZW51IHx8Ci0gICAgICAgICAgICAgICAgdWlDb21wb25lbnQgaW5zdGFuY2VvZiBIdG1sSW5wdXRUZXh0YXJlYTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL01ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZDIxZGUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjINCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlJbmZvcm1hdGlvbiB0aGUgaW5mb3JtYXRpb24gZW50cnkgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3BlcnR5DQotICAgICAqLw0KLSAgICB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1Byb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0Y2Y1MjcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyU3VwcG9ydDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotew0KLSAgICAvKioNCi0gICAgICogQHJldHVybiBmYWxzZSBpZiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzIHNob3VsZCBiZSBieXBhc3NlZA0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpOw0KLQ0KLSAgICAvKioNCi0gICAgICogcHJvY2Vzc2VkIGlmIHZhbGlkYXRpb24gd2FzIGV4ZWN1dGVkDQotICAgICAqIGluIGNvbnRyYXN0IHRvIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciBpdCBnZXRzIGV4ZWN1dGVkIGluIGFueSBjYXNlDQotICAgICAqLw0KLSAgICB2b2lkIGFmdGVyVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9SZW5kZXJlckludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxZjA1NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1JlbmRlcmVySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LmV4Y2VwdGlvbi5Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbGxvd3MgdG8gaW50ZXJjZXB0IHJlbmRlcmVyIG1ldGhvZHMuPGJyLz4KLSAqIEJhc2UgbWVjaGFuaXNtIG9mIGV4dHZhbC4gSXQgYWxsb3dzIHRvIGFkZCBjdXN0b20gaW5mcmFzdHJ1Y3R1cmVzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBSZW5kZXJlckludGVyY2VwdG9yCi17Ci0gICAgU3RyaW5nIGdldEludGVyY2VwdG9ySWQoKTsKLQotICAgIE9iamVjdCBnZXRSZXR1cm5WYWx1ZU9uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBza2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLCBPYmplY3QgY3VycmVudFJldHVyblZhbHVlKTsKLQotICAgIC8qCi0gICAgICogYmVmb3JlCi0gICAgICovCi0gICAgdm9pZCBiZWZvcmVEZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiwgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBSZW5kZXJlciByZW5kZXJlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uOwotCi0gICAgdm9pZCBiZWZvcmVFbmNvZGVFbmQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICB2b2lkIGJlZm9yZUdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24sIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKgotICAgICAqIGFmdGVyCi0gICAgICovCi0gICAgdm9pZCBhZnRlckRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb247Ci0KLSAgICB2b2lkIGFmdGVyRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHJlbmRlcmVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLQotICAgIHZvaWQgYWZ0ZXJFbmNvZGVDaGlsZHJlbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uOwotCi0gICAgdm9pZCBhZnRlckdldENvbnZlcnRlZFZhbHVlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgbywgUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24sIFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRlYzNkMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlclN1cHBvcnQ7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBBbGxvd3MgdG8gaW50ZXJjZXB0IHZhbGlkYXRpb3IgZXhjZXB0aW9ucy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXJTdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgdGhlIGN1cnJlbnQgY29tcG9uZW50DQotICAgICAqIEBwYXJhbSBtZXRhRGF0YUVudHJ5IHRoZSBtZXRhIGRhdGEgZW50cnkgd2hpY2ggY29udGFpbnMgdGhlIG1ldGEgZGF0YSBvZiB0aGUgcHJvcGVydHkNCi0gICAgICogQHBhcmFtIGNvbnZlcnRlZE9iamVjdCB0aGUgY29udmVydGVkIHVzZXIgaW5wdXQNCi0gICAgICogQHBhcmFtIHZhbGlkYXRvckV4Y2VwdGlvbiB0aGUgY3VycmVudCBleGNlcHRpb24NCi0gICAgICogQHBhcmFtIHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IHdoaWNoIHRocmV3IHRoZSBleGNlcHRpb24NCi0gICAgICogQHJldHVybiBmYWxzZSB0byBzdG9wIHRocm93aW5nIHRoZSBleGNlcHRpb24NCi0gICAgICovDQotICAgIGJvb2xlYW4gYWZ0ZXJUaHJvd2luZyhVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2ludGVyY2VwdG9yL1ZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmUxNWUwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLlNraXBWYWxpZGF0aW9uRXZhbHVhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkludGVyY2VwdG9yIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcXVpcmVkSW5pdGlhbGl6YXRpb25TdXBwb3J0ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdENvbXBvbmVudChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHRvIGluaXQgY29tcG9uZW50ICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhUmVzdWx0ID0gRXh0VmFsVXRpbHMKLSAgICAgICAgICAgICAgICAuZ2V0VHJhbnNmb3JtZWRNZXRhRGF0YUZvcihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBnZXRNb2R1bGVLZXkoKSk7Ci0KLSAgICAgICAgLy9nZXQgY29tcG9uZW50IGluaXRpYWxpemVyIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQgYW5kIGNvbmZpZ3VyZSBpdAotICAgICAgICAvL2Fsc28gaW4gY2FzZSBvZiBza2lwcGVkIHZhbGlkYXRpb24gdG8gcmVzZXQgZS5nLiB0aGUgcmVxdWlyZWQgYXR0cmlidXRlCi0gICAgICAgIGlmKCFtZXRhRGF0YVJlc3VsdC5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbmZpZ3VyZUNvbXBvbmVudFdpdGhNZXRhRGF0YShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YVJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJpbml0IGNvbXBvbmVudCBvZiAiICsgdWlDb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkKLSAgICB7Ci0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIG1ldGFEYXRhRXh0cmFjdG9yID0gRXh0VmFsVXRpbHMKLSAgICAgICAgICAgICAgICAuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JXaXRoKGdldFByb3BlcnRpZXNGb3JDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcih1aUNvbXBvbmVudCkpOwotCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG1ldGFEYXRhRXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgdmFsaWRhdGlvbiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcm9jZXNzRmllbGRWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInZhbGlkYXRpb24gZmluaXNoZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JXaXRoKHByb3BlcnRpZXMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NGaWVsZFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7Ci0gICAgICAgIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yIHNraXBWYWxpZGF0aW9uRXZhbHVhdG9yID0gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U2tpcFZhbGlkYXRpb25FdmFsdWF0b3IoKTsKLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogcHJvcGVydHlJbmZvcm1hdGlvbi5nZXRNZXRhRGF0YUVudHJpZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5Rm9yTWV0YURhdGEoZW50cnkuZ2V0S2V5KCkpOwotCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgaXNWYWxpZGF0aW9uU3RyYXRlZ3lDb21wYXRpYmxlV2l0aFZhbHVlKHZhbGlkYXRpb25TdHJhdGVneSwgIGNvbnZlcnRlZE9iamVjdCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoc2tpcFZhbGlkYXRpb25FdmFsdWF0b3Iuc2tpcFZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdmFsaWRhdGlvblN0cmF0ZWd5LCBlbnRyeSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJza2lwIHZhbGlkYXRpb24gb2YgIiArIGVudHJ5LmdldFZhbHVlKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggIiArIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy9kb24ndCBicmVhayBtYXliZSB0aGVyZSBhcmUgY29uc3RyYWludHMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCB0aGUgc2tpcC1tZWNoYW5pc20KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInZhbGlkYXRlICIgKyBlbnRyeS5nZXRWYWx1ZSgpICsgIiB3aXRoICIgKyB2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb24pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFFeHRWYWxVdGlscy5leGVjdXRlTG9jYWxCZWZvcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWx1ZShBbm5vdGF0aW9uLmNsYXNzKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiB2YWxpZGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZW50cnksIGNvbnZlcnRlZE9iamVjdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5leGVjdXRlTG9jYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCksIHByb3BlcnR5SW5mb3JtYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYodmFsaWRhdGlvblN0cmF0ZWd5ID09IG51bGwgJiYgbG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJubyB2YWxpZGF0aW9uIHN0cmF0ZWd5IGZvdW5kIGZvciAiICsgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkYXRpb25TdHJhdGVneUNvbXBhdGlibGVXaXRoVmFsdWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3MgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5pc0Fubm90YXRpb25QcmVzZW50KE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAhIiIuZXF1YWxzKHZhbHVlKSB8fCBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpKQotICAgICAgICAgICAgICAgIC5pc0Fubm90YXRpb25QcmVzZW50KEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneS5jbGFzcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgLyoqCi0gICAgICogdG8gZW5zdXJlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVjb3JkUHJvY2Vzc2VkSW5mb3JtYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WaW9sYXRpb25TZXZlcml0eVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9pbnRlcmNlcHRvci9WaW9sYXRpb25TZXZlcml0eVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTM0YzYxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvaW50ZXJjZXB0b3IvVmlvbGF0aW9uU2V2ZXJpdHlWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDkwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZnRlclRocm93aW5nKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgaWYoaXNFeHRWYWxNZXRhRGF0YShtZXRhRGF0YUVudHJ5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb1BsYWNlU2V2ZXJpdHkodmFsaWRhdG9yRXhjZXB0aW9uLCBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0V4dFZhbE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb247DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvUGxhY2VTZXZlcml0eShWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uLCBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGZvcihGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkgOiBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yKCkNCi0gICAgICAgICAgICAgICAgLmV4dHJhY3QoYW5ub3RhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eS5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLnNldFNldmVyaXR5KHNldmVyaXR5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2QzODY1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL0Fic3RyYWN0Q3VzdG9tTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBBIGdlbmVyaWMgaW1wbGVtZW50YXRpb24uIFN1YmNsYXNzZXMganVzdCBoYXZlIHRvIG5vdyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIG5hbWUgbWFwcGVyLg0KLSAqDQotICogTmFtZU1hcHBlcnMgYXJlIHN0YXRlbGVzcy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxUPiBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8VD4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotICAgIHByaXZhdGUgTmFtZU1hcHBlcjxUPiBjdXN0b21OYW1lTWFwcGVyOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVCBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIGlmIChjdXN0b21OYW1lTWFwcGVyID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKTsNCi0NCi0gICAgICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXN0b21OYW1lTWFwcGVyID0gKE5hbWVNYXBwZXI8VD4pIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjbGFzc05hbWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoY3VzdG9tTmFtZU1hcHBlciAhPSBudWxsKSA/IGN1c3RvbU5hbWVNYXBwZXIuY3JlYXRlTmFtZShzb3VyY2UpIDogbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tYXBwZXIvTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODMxY2I2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL05hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXJTdXBwb3J0Ow0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSBmb3IgbmFtZSBtYXBwZXJzLg0KLSAqIEEgbmFtZSBtYXBwZXIgY2FsY3VsYXRlcyBhIG5hbWUgZm9yIGEgZ2l2ZW4gc291cmNlIG9iamVjdC4NCi0gKiBlLmcuIE1ldGEtRGF0YSBLZXkgKGUuZy46IGFubm90YXRpb24gY2xhc3MgbmFtZSkgLT4gVmFsaWRhdGlvblN0cmF0ZWd5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgU3RyaW5nIGNyZWF0ZU5hbWUoVCBzb3VyY2UpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21hcHBlci9TdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL1N1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTZkZGQyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWFwcGVyL1N1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotLyoqDQotICogaW50ZXJmYWNlIGZvciBuYW1lLW1hcHBlcnMgd2hpY2ggaGF2ZSB0byBkZWxlZ2F0ZSB0byBvdGhlciAoc3ViLSluYW1lLW1hcHBlcnMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyPFQ+IGV4dGVuZHMgTmFtZU1hcHBlcjxUPg0KLXsNCi0gICAgdm9pZCBhZGROYW1lTWFwcGVyKE5hbWVNYXBwZXI8VD4gbmFtZU1hcHBlcik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvQ29tbW9uTWV0YURhdGFLZXlzLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL0NvbW1vbk1ldGFEYXRhS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWFlNjM3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvQ29tbW9uTWV0YURhdGFLZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGhlbHBlciBmb3IgZnJlcXVlbnQgbWV0YS1kYXRhIGtleXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogcGxhY2VkIGluIGNvcmUgdG8gYXZvaWQgZHVwbGljYXRlZCBpbmZvcm1hdGlvbiBpbiBtdWx0aXBsZSBtb2R1bGVzICh2YWxpZGF0aW9uIG1vZHVsZSBhbmQgY29tcG9uZW50LXN1cHBvcnQgbW9kdWxlKQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBDb21tb25NZXRhRGF0YUtleXMNCi17DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRUQgPSAicmVxdWlyZWQiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQUtfUkVRVUlSRUQgPSAid2Vha19yZXF1aXJlZCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOX0xFTkdUSCA9ICJtaW5fbGVuZ3RoIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5fTEVOR1RIX0RFRkFVTFQgPSAibWluX2xlbmd0aF9kZWZhdWx0IjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfTEVOR1RIID0gIm1heF9sZW5ndGgiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9MRU5HVEhfREVGQVVMVCA9ICJtYXhfbGVuZ3RoX2RlZmF1bHQiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01JTiA9ICJyYW5nZV9taW4iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTkdFX01JTl9ERUZBVUxUID0gInJhbmdlX21pbl9kZWZhdWx0IjsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9NQVggPSAicmFuZ2VfbWF4IjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9NQVhfREVGQVVMVCA9ICJyYW5nZV9tYXhfZGVmYXVsdCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUVEVSTiA9ICJwYXR0ZXJuIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRURVJOX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRSA9ICJwYXR0ZXJuX3ZhbGlkYXRpb25fZXJyb3JfbWVzc2FnZSI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1BSUwgPSAiZW1haWwiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTSA9ICJjdXN0b20iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSVBfVkFMSURBVElPTiA9ICJza2lwX3ZhbGlkYXRpb24iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfQ0xJRU5UX1NJREVfVkFMSURBVElPTiA9ICJkaXNhYmxlX2NsaWVudF9zaWRlX3ZhbGlkYXRpb24iOw0KLSAgICAvL2F2YWlsYWJsZSBmb3IgYWRkLW9ucyBub3QgdXNlZCBpbnRlcm5hbGx5IGR1ZSB0byBwZXJmb3JtYW5jZSByZWFzb25zDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRV9TSE9XX0lORElDQVRJT04gPSAiZGlzYWJsZV9zaG93X2luZGljYXRpb24iOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL01ldGFEYXRhRW50cnkuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvTWV0YURhdGFFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTU0NTgyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvTWV0YURhdGFFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIERhdGEgaG9sZGVyIHdoaWNoIHN0b3JlcyB0aGUgbWV0YS1kYXRhIGFuZCBzb21lIGluZm9ybWF0aW9uIHdoZXJlIHRoZSBtZXRhLWRhdGEgd2FzIGFyb3VuZC4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBNZXRhRGF0YUVudHJ5Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGtleTsKLSAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRLZXkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJzZXR0aW5nIG1ldGEtZGF0YSBrZXk6ICIgKyBrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIDxUPiBUIGdldFZhbHVlKENsYXNzPFQ+IHRhcmdldENsYXNzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUKWdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoInNldHRpbmcgbWV0YS1kYXRhIHZhbHVlOiAiICsgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmdldChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gVCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoVClnZXRQcm9wZXJ0eShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKCJuZXcgcHJvcGVydHkgYWRkZWQga2V5OiAiICsga2V5ICsgIiB2YWx1ZTogIiArIHZhbHVlICsgIiBmb3IgbWV0YWRhdGEta2V5OiAiICsgdGhpcy5rZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWRjMjZkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0NvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGFsbCBmYWN0b3JpZXMgd2hpY2ggY3JlYXRlIG1ldGEtZGF0YSBleHRyYWN0b3JzCi0gKiAKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkKLXsKLSAgICBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGUoKTsKLQotICAgIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZVdpdGgoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NGNjY2EuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuTWV0YURhdGFTdG9yYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUHJvcGVydHlTdG9yYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBleHRyYWN0cyBtZXRhLWRhdGEgKGUuZy4gdGhlIGFubm90YXRpb25zKSBvZiB0aGUgdmFsdWUgYmluZGluZyBvZiBhIGNvbXBvbmVudC4KLSAqIEl0IGV4dHJhY3RzIHRoZSBtZXRhLWRhdGEgb2YgdGhlIGZpZWxkIGFuZCB0aGUgcHJvcGVydHkuCi0gKiAoQWxzbyB0aGUgYW5ub3RhdGlvbnMgb2Ygc3VwZXIgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcy4pCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IgaW1wbGVtZW50cyBNZXRhRGF0YUV4dHJhY3RvcgotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkKLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsKLQotICAgICAgICAvL3Nob3VsZCBuZXZlciBvY2N1cgotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkgJiYgb2JqZWN0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihvYmplY3QuZ2V0Q2xhc3MoKSArICIgaXMgbm8gdmFsaWQgY29tcG9uZW50Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50ID0gKFVJQ29tcG9uZW50KSBvYmplY3Q7Ci0KLSAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGV4dHJhY3RpbmcgbWV0YS1kYXRhIG9mICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRQcm9wZXJ0eURldGFpbHNPZlZhbHVlQmluZGluZyh1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5RGV0YWlscyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGdldCBiZWFuIGNsYXNzIGFuZCBwcm9wZXJ0eSBuYW1lCi0gICAgICAgICAqLwotICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpKTsKLQotICAgICAgICAvL2NyZWF0ZQotICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnNldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIHByb3BlcnR5RGV0YWlscyk7Ci0KLSAgICAgICAgaWYgKGlzQ2FjaGVkKGVudGl0eUNsYXNzLCBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5IDogZ2V0Q2FjaGVkTWV0YURhdGEoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLmFkZE1ldGFEYXRhRW50cnkobWV0YURhdGFFbnRyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBleHRyYWN0QW5ub3RhdGlvbnMocHJvcGVydHlJbmZvcm1hdGlvbiwgcHJvcGVydHlEZXRhaWxzLCBlbnRpdHlDbGFzcyk7Ci0gICAgICAgICAgICBjYWNoZU1ldGFEYXRhKHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImV4dHJhY3QgZmluaXNoZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NhY2hlZChDbGFzcyBlbnRpdHlDbGFzcywgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldE1ldGFEYXRhU3RvcmFnZSgpLmNvbnRhaW5zTWV0YURhdGFGb3IoZW50aXR5Q2xhc3MsIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2FjaGVNZXRhRGF0YShQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBnZXRNZXRhRGF0YVN0b3JhZ2UoKS5zdG9yZU1ldGFEYXRhT2YocHJvcGVydHlJbmZvcm1hdGlvbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRhRGF0YUVudHJ5W10gZ2V0Q2FjaGVkTWV0YURhdGEoQ2xhc3MgZW50aXR5Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRNZXRhRGF0YVN0b3JhZ2UoKS5nZXRNZXRhRGF0YShlbnRpdHlDbGFzcywgcHJvcGVydHkpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWV0YURhdGFTdG9yYWdlIGdldE1ldGFEYXRhU3RvcmFnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShNZXRhRGF0YVN0b3JhZ2UuY2xhc3MsIE1ldGFEYXRhU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NhY2hlZEZpZWxkKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5U3RvcmFnZSgpLmNvbnRhaW5zRmllbGQoZW50aXR5LCBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvQ2FjaGVkRmllbGQoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksIEZpZWxkIGZpZWxkKQotICAgIHsKLSAgICAgICAgUHJvcGVydHlTdG9yYWdlIHByb3BlcnR5U3RvcmFnZSA9IGdldFByb3BlcnR5U3RvcmFnZSgpOwotICAgICAgICBpZiAoIXByb3BlcnR5U3RvcmFnZS5jb250YWluc0ZpZWxkKGVudGl0eSwgcHJvcGVydHkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVN0b3JhZ2Uuc3RvcmVGaWVsZChlbnRpdHksIHByb3BlcnR5LCBmaWVsZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpZWxkIGdldENhY2hlZEZpZWxkKENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5U3RvcmFnZSgpLmdldEZpZWxkKGVudGl0eSwgcHJvcGVydHkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NhY2hlZE1ldGhvZChDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eVN0b3JhZ2UoKS5jb250YWluc01ldGhvZChlbnRpdHksIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9DYWNoZWRNZXRob2QoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksIE1ldGhvZCBtZXRob2QpCi0gICAgewotICAgICAgICBQcm9wZXJ0eVN0b3JhZ2UgcHJvcGVydHlTdG9yYWdlID0gZ2V0UHJvcGVydHlTdG9yYWdlKCk7Ci0gICAgICAgIGlmICghcHJvcGVydHlTdG9yYWdlLmNvbnRhaW5zTWV0aG9kKGVudGl0eSwgcHJvcGVydHkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVN0b3JhZ2Uuc3RvcmVNZXRob2QoZW50aXR5LCBwcm9wZXJ0eSwgbWV0aG9kKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWV0aG9kIGdldENhY2hlZE1ldGhvZChDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eVN0b3JhZ2UoKS5nZXRNZXRob2QoZW50aXR5LCBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eVN0b3JhZ2UgZ2V0UHJvcGVydHlTdG9yYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKFByb3BlcnR5U3RvcmFnZS5jbGFzcywgUHJvcGVydHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZXh0cmFjdEFubm90YXRpb25zKAotICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uLCBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLCBDbGFzcyBlbnRpdHlDbGFzcykKLSAgICB7Ci0gICAgICAgIHdoaWxlICghT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoZW50aXR5Q2xhc3MuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICAgICAgYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9ucyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLQotICAgICAgICAgICAgZW50aXR5Q2xhc3MgPSBlbnRpdHlDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ludGVyZmFjZXMoCi0gICAgICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MsIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMsIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IGN1cnJlbnRDbGFzcy5nZXRJbnRlcmZhY2VzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoY3VycmVudEludGVyZmFjZSwgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhjdXJyZW50SW50ZXJmYWNlLCBwcm9wZXJ0eURldGFpbHMsIHByb3BlcnR5SW5mb3JtYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlBY2Nlc3NBbm5vdGF0aW9ucyhDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QgPSB0cnlUb0dldFJlYWRNZXRob2QoZW50aXR5LCBwcm9wZXJ0eSk7Ci0KLSAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRob2QgPSB0cnlUb0dldFJlYWRNZXRob2RNYW51YWxseShlbnRpdHksIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DYWNoZWRNZXRob2QoZW50aXR5LCBwcm9wZXJ0eSwgbWV0aG9kKTsKLSAgICAgICAgICAgIGFkZEFubm90YXRpb25Ub0Fubm90YXRpb25FbnRyaWVzKEFycmF5cy5hc0xpc3QobWV0aG9kLmdldEFubm90YXRpb25zKCkpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWV0aG9kIHRyeVRvR2V0UmVhZE1ldGhvZChDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIGlmIChpc0NhY2hlZE1ldGhvZChlbnRpdHksIHByb3BlcnR5KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldENhY2hlZE1ldGhvZChlbnRpdHksIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh1c2VCZWFuSW5mbygpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCZWFuSW5mbyBiZWFuSW5mbyA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhlbnRpdHkpOwotICAgICAgICAgICAgICAgIGZvciAoUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA6IGJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yLmdldE5hbWUoKSkgJiYgcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUJlYW5JbmZvKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBCb29sZWFuLlRSVUUuZXF1YWxzKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KEJlYW5JbmZvLmNsYXNzLmdldE5hbWUoKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWV0aG9kIHRyeVRvR2V0UmVhZE1ldGhvZE1hbnVhbGx5KENsYXNzIGVudGl0eSwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHByb3BlcnR5LnN1YnN0cmluZygxKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgLy9jaGFuZ2VkIHRvIG9mZmljaWFsIGJlYW4gc3BlYy4gZHVlIHRvIGNhY2hpbmcgdGhlcmUgaXMgbm8gcGVyZm9ybWFuY2UgaXNzdWUgYW55IG1vcmUKLSAgICAgICAgICAgIHJldHVybiBlbnRpdHkuZ2V0RGVjbGFyZWRNZXRob2QoImlzIiArIHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHkuZ2V0RGVjbGFyZWRNZXRob2QoImdldCIgKyBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibWV0aG9kIG5vdCBmb3VuZCAtIGNsYXNzOiAiICsgZW50aXR5LmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtIG1ldGhvZHM6ICIgKyAiZ2V0IiArIHByb3BlcnR5ICsgIiAiICsgImlzIiArIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEZpZWxkQWNjZXNzQW5ub3RhdGlvbnMoQ2xhc3MgZW50aXR5LCBTdHJpbmcgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICBGaWVsZCBmaWVsZDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmllbGQgPSBnZXREZWNsYXJlZEZpZWxkKGVudGl0eSwgcHJvcGVydHkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKCJfIiArIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5sZW5ndGgoKSA+IDEgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuaXNVcHBlckNhc2UocHJvcGVydHkuY2hhckF0KDApKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShwcm9wZXJ0eS5jaGFyQXQoMSkpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2Rvbid0IHVzZSBJbnRyb3NwZWN0b3IjZGVjYXBpdGFsaXplIGhlcmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gZW50aXR5LmdldERlY2xhcmVkRmllbGQocHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvTG93ZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgPSBlbnRpdHkuZ2V0RGVjbGFyZWRGaWVsZChJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKHByb3BlcnR5KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJmaWVsZCAiICsgcHJvcGVydHkgKyAiIG9yIF8iICsgcHJvcGVydHkgKyAiIG5vdCBmb3VuZCIsIGUxKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmllbGQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DYWNoZWRGaWVsZChlbnRpdHksIHByb3BlcnR5LCBmaWVsZCk7Ci0gICAgICAgICAgICBhZGRBbm5vdGF0aW9uVG9Bbm5vdGF0aW9uRW50cmllcyhBcnJheXMuYXNMaXN0KGZpZWxkLmdldEFubm90YXRpb25zKCkpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgRmllbGQgZ2V0RGVjbGFyZWRGaWVsZChDbGFzcyBlbnRpdHksIFN0cmluZyBwcm9wZXJ0eSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoaXNDYWNoZWRGaWVsZChlbnRpdHksIHByb3BlcnR5KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldENhY2hlZEZpZWxkKGVudGl0eSwgcHJvcGVydHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVudGl0eS5nZXREZWNsYXJlZEZpZWxkKHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uVG9Bbm5vdGF0aW9uRW50cmllcygKLSAgICAgICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMsIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikKLSAgICB7Ci0gICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uYWRkTWV0YURhdGFFbnRyeShjcmVhdGVNZXRhRGF0YUVudHJ5Rm9yQW5ub3RhdGlvbihhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoYW5ub3RhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBNZXRhRGF0YUVudHJ5IGNyZWF0ZU1ldGFEYXRhRW50cnlGb3JBbm5vdGF0aW9uKEFubm90YXRpb24gZm91bmRBbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgTWV0YURhdGFFbnRyeSBlbnRyeSA9IG5ldyBNZXRhRGF0YUVudHJ5KCk7Ci0KLSAgICAgICAgZW50cnkuc2V0S2V5KGZvdW5kQW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIGVudHJ5LnNldFZhbHVlKGZvdW5kQW5ub3RhdGlvbik7Ci0KLSAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvZXh0cmFjdG9yL0RlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3NjQ1Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyBmYWN0b3J5IGNyZWF0ZXMgYSBtZXRhLWRhdGEgZXh0cmFjdG9yIHdoaWNoIGV4dHJhY3RzIHRoZSBtZXRhLWRhdGEKLSAqIG9mIHRoZSB2YWx1ZSBiaW5kaW5nIG9mIGEgY29tcG9uZW50LgotICogPHAvPgotICogb3JkZXI6PGJyLz4KLSAqIDxvbD4KLSAqICAgPGxpPmNvbmZpZ3VyZWQgbWV0YS1kYXRhIGV4dHJhY3RvciAod2ViLnhtbCk8L2xpPgotICogICA8bGk+Y29uZmlndXJlZCBtZXRhLWRhdGEgZXh0cmFjdG9yIChpbmZvcm1hdGlvbiBwcm92aWRlciBiZWFuKTwvbGk+Ci0gKiAgIDxsaT5kZWZhdWx0IGltcGxlbWVudGF0aW9uPC9saT4KLSAqIDwvb2w+Ci0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciA9IG51bGw7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeSgpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJsb2dnaW5nIikKLSAgICBwdWJsaWMgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVXaXRoKG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGVXaXRoKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKLSAgICB7Ci0gICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3RvciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUik7Ci0gICAgICAgICAgICBtZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZXMKLSAgICAgICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUikpOwotICAgICAgICAgICAgbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzLmFkZChEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogbWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdG9yID0gKE1ldGFEYXRhRXh0cmFjdG9yKSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgICAgIGlmIChtZXRhRGF0YUV4dHJhY3RvciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShtZXRhRGF0YUV4dHJhY3Rvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY3JlYXRlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3JXaXRoKG1ldGFEYXRhRXh0cmFjdG9yLCBwcm9wZXJ0aWVzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9NZXRhRGF0YUV4dHJhY3Rvci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS9leHRyYWN0b3IvTWV0YURhdGFFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0MDUxZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL2V4dHJhY3Rvci9NZXRhRGF0YUV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotCi0vKioKLSAqIEFuIG1ldGEtZGF0YSBleHRyYWN0b3IgaXMgcmVzcG9uc2libGUgdG8gYW5hbHl6ZSBhbiBvYmplY3QKLSAqIGFuZCByZXR1cm5zIGFsbCBhdmFpbGFibGUgbWV0YS1kYXRhIGluZm9ybWF0aW9uCi0gKiAKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBNZXRhRGF0YUV4dHJhY3RvcgotewotICAgIFByb3BlcnR5SW5mb3JtYXRpb24gZXh0cmFjdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njk5MTJhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIGl0J3MganVzdCBhIGhlbHBlciBmb3IgcHJveGllcyAtIHlvdSBqdXN0IG5lZWQgaXQsIGlmIHlvdSBkZWZpbmUgdGhlIGVxdWl2YWxlbnQgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotICoNCi0gKiBpZiB0aGVyZSBpcyBhbHNvIGEgcHJveHkgZm9yIHRoZSBleHRyYWN0b3IgeW91IGNhbiB1c2UgdGhlIGNsYXNzTmFtZSBwcm9wZXJ0eSB0byBtYW51YWxseSByZXBlYXQgdGhlDQotICogZnVsbCBxdWFsaWZpZWQgY2xhc3MgbmFtZS4NCi0gKg0KLSAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBpbnRlcmZhY2UgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyIGV4dGVuZHMgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlYTgxOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL0JlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSBlcXVpdmFsZW50IHZhbGlkYXRpb24gc3RyYXRlZ3kgYXMgYmVhbiBhbmQNCi0gKiBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkgZm9yIGl0Lg0KLSAqDQotICogaWYgdGhlcmUgaXMgYWxzbyBhIHByb3h5IGZvciB0aGUgdHJhbnNmb3JtZXIgeW91IGNhbiB1c2UgdGhlIGNsYXNzTmFtZSBwcm9wZXJ0eSB0byBtYW51YWxseSByZXBlYXQgdGhlDQotICogZnVsbCBxdWFsaWZpZWQgY2xhc3MgbmFtZS4NCi0gKg0KLSAqIEBzZWUgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBjbGFzcyBCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXJJbXBsIGltcGxlbWVudHMgTWV0YURhdGFUcmFuc2Zvcm1lciwgQmVhbk1ldGFEYXRhVHJhbnNmb3JtZXJBZGFwdGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZTsNCi0NCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydE1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lci5jb252ZXJ0TWV0YURhdGEobWV0YURhdGFFbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZShTdHJpbmcgbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YVRyYW5zZm9ybWVyQ2xhc3NOYW1lID0gbWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWV0YURhdGFUcmFuc2Zvcm1lciBnZXRNZXRhRGF0YVRyYW5zZm9ybWVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YURhdGFUcmFuc2Zvcm1lcihNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFUcmFuc2Zvcm1lciA9IG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRGVmYXVsdE1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYzNhZWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9EZWZhdWx0TWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLlN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuTmVzdGVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyLg0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLQ0KLS8qKg0KLSAqIEZhY3Rvcnkgd2hpY2ggY3JlYXRlcyB0aGUgTWV0YURhdGFUcmFuc2Zvcm1lciBmb3IgYSBnaXZlbiBWYWxpZGF0aW9uU3RyYXRlZ3kNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogVmFsaWRhdGlvblN0cmF0ZWd5IC0+IE1ldGFEYXRhVHJhbnNmb3JtZXIgaW5zdGVhZCBvZiBNZXRhLURhdGEgLT4gTWV0YURhdGFUcmFuc2Zvcm1lcg0KLSAqIHRvIGF2b2lkIGEgc2Vjb25kIHN0YXRpYyBtYXBwaW5nIGUuZy4gZm9yIGpwYSBhbm5vdGF0aW9ucw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotICAgICAgICBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8VmFsaWRhdGlvblN0cmF0ZWd5LCBNZXRhRGF0YVRyYW5zZm9ybWVyPg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmc7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KCk7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IHN1Yk5hbWVNYXBwZXJMaXN0ID0NCi0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0NCi0gICAgcHVibGljIERlZmF1bHRNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotDQotICAgICAgICAvL3NpbmNlIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBzdGFydHVwIGxpc3RlbmVyIG9mIHRoZSBjb3JlIGdldHMgZXhlY3V0ZWQgZmlyc3QNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgY3JlYXRlKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lID0gY3JlYXRlVmFsaWRhdGlvblN0cmF0ZWd5TmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgdHJ5VG9Jbml0U3RhdGljTWFwcGluZ3MoKTsNCi0NCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lciA9DQotICAgICAgICAgICAgICAgIHRyeVRvUmVzb2x2ZUNhY2hlZE1ldGFEYXRhVHJhbnNmb3JtZXIodmFsaWRhdGlvblN0cmF0ZWd5LCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0NCi0gICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBjcmVhdGVBbmRDYWNoZU1ldGFEYXRhVHJhbnNmb3JtZXIodmFsaWRhdGlvblN0cmF0ZWd5LCB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gaXNQcm94eURldGVjdGVkID0gaXNQcm94eSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGEgcHJveHkgYW5kIHRoZSB1c2FnZSBvZiBhIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyDQotICAgICAgICBpZiAoaXNQcm94eURldGVjdGVkICYmIHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoKEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKXZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuICFpc1Byb3h5RGV0ZWN0ZWQgPyBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKSkgOiBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0luaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUHJveHkoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSA9PSBudWxsOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWV0YURhdGFUcmFuc2Zvcm1lciBjcmVhdGVBbmRDYWNoZU1ldGFEYXRhVHJhbnNmb3JtZXIoDQotICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0gICAgICAgIFN0cmluZyB0cmFuc2Zvcm1lck5hbWU7DQotICAgICAgICAvL251bGwgLT4gdXNlIG5hbWUgbWFwcGVycw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlciA6IG5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyYW5zZm9ybWVyTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lck5hbWUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyID0gdHJ5VG9DcmVhdGVBbmRDYWNoZU1ldGFEYXRhVHJhbnNmb3JtZXIoDQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3ksIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIHRyYW5zZm9ybWVyTmFtZSk7DQotDQotICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIHRyeVRvUmVzb2x2ZUNhY2hlZE1ldGFEYXRhVHJhbnNmb3JtZXIoDQotICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLmNvbnRhaW5zS2V5KHZhbGlkYXRpb25TdHJhdGVneU5hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoTWV0YURhdGFUcmFuc2Zvcm1lcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcuZ2V0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdHJpbmcgbmV3VmFsaWRhdGlvblN0cmF0ZWd5TmFtZSA9IHZhbGlkYXRpb25TdHJhdGVneU5hbWUgKyBJZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kuSURfUFJFRklYICsNCi0gICAgICAgICAgICAgICAgICAgICgoSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5KXZhbGlkYXRpb25TdHJhdGVneSkuZ2V0SWQoKTsNCi0NCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTWFwcGluZy5jb250YWluc0tleShuZXdWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiAoTWV0YURhdGFUcmFuc2Zvcm1lcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoDQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJNYXBwaW5nLmdldChuZXdWYWxpZGF0aW9uU3RyYXRlZ3lOYW1lKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIHRyeVRvQ3JlYXRlQW5kQ2FjaGVNZXRhRGF0YVRyYW5zZm9ybWVyKA0KLSAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lLCBTdHJpbmcgdHJhbnNmb3JtZXJOYW1lKQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSAoTWV0YURhdGFUcmFuc2Zvcm1lcikNCi0gICAgICAgICAgICAgICAgQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHRyYW5zZm9ybWVyTmFtZSk7DQotDQotICAgICAgICBpZiAobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneU5hbWUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIElkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSArPSBJZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kuSURfUFJFRklYICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kpdmFsaWRhdGlvblN0cmF0ZWd5KS5nZXRJZCgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGFkZE1hcHBpbmcodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgdHJhbnNmb3JtZXJOYW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0dXBNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBNYXBwaW5ncyhMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhtYXBwaW5nLmdldFNvdXJjZSgpLCBtYXBwaW5nLmdldFRhcmdldCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIFN0cmluZyB0cmFuc2Zvcm1lck5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkaW5nIHZhbGlkYXRpb24gc3RyYXRlZ3kgdG8gbWV0YS1kYXRhIHRyYW5zZm9ybWVyIG1hcHBpbmc6ICINCi0gICAgICAgICAgICAgICAgKyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lICsgIiAtPiAiICsgdHJhbnNmb3JtZXJOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck1hcHBpbmcucHV0KHZhbGlkYXRpb25TdHJhdGVneU5hbWUsIHRyYW5zZm9ybWVyTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuZXcgU29ydGVkTmFtZU1hcHBlckxpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+Pih0aGlzLm5hbWVNYXBwZXJMaXN0LCB0aGlzLnN1Yk5hbWVNYXBwZXJMaXN0KTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIHRyeVRvSW5pdE5hbWVNYXBwZXJXaXRoRXhpc3RpbmdTdWJNYXBwZXJzKHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpOw0KLSAgICAgICAgc3VwZXIucmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIGl0J3MgYSB2ZXJ5IHNwZWNpYWwgY2FzZSBkdWUgdG8gdGhlIG1pc3Npbmcgb3JkZXIgaW4gdGhlIGV4ZWN1dGlvbiBvZiBzdGFydHVwLWxpc3RlbmVycyAocGhhc2UgbGlzdGVuZXJzKQ0KLSAgICAgKiBwYWNrYWdlZCBpbiBmYWNlcy1jb25maWcueG1sIGZpbGVzIG9mIGphcnMNCi0gICAgICoNCi0gICAgICogbm9ybWFsbHkgdGhlIGRlZmF1bHQgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyIHNob3VsZCBiZSBlbm91Z2gNCi0gICAgICogYW55d2F5LCBpZiBhIG1vZHVsZSBhZGRzIGEgbmV3IFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlciwNCi0gICAgICogYWxsIHByZXZpb3VzIGFkZGVkIFN1Yk5hbWVNYXBwZXJzIGhhdmUgdG8gYmUgYWRkZWQgdG8gYXZvaWQgY29uZnVzaW9uIGluIHNwZWNpYWwgY2FzZXMuDQotICAgICAqIGlmIGEgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIGZpbmFsIGV4dGVuZCB0aGUgaW50ZXJmYWNlIGFuZCBmaWx0ZXIgaXQgaW4gYWRkTmFtZU1hcHBlcg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgd2hpY2ggaGFzIHRvIGJlIGFkZGVkDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9Jbml0TmFtZU1hcHBlcldpdGhFeGlzdGluZ1N1Yk1hcHBlcnMoTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgaW5zdGFuY2VvZiBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yKE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiBuYW1lTWFwcGVyIDogdGhpcy5zdWJOYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKG5hbWVNYXBwZXIuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KE5lc3RlZC5jbGFzcykpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICgoU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4pdmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcikNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZE5hbWVNYXBwZXIobmFtZU1hcHBlcik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1MDRiMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL01ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQWxsb3dzIHRvIHRyYW5zZm9ybSBjb25jcmV0ZSBtZXRhLWRhdGEgdG8gYSBtb3JlIGFic3RyYWN0IGZvcm0uPGJyLz4NCi0gKiBlLmcuOiBAUmVxdWlyZWQsIEBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSwuLi4pLCBATGVuZ3RoKG1pbmltdW0gPSAxKSwgLi4uIC0+IHJlcXVpcmVkID0gdHJ1ZQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLS8vKlRyYW5zZm9ybWVyIGluc3RlYWQgb2YgKkNvbnZlcnRlciB0byBhdm9pZCBuYW1pbmcgY29uZnVzaW9uIA0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFUcmFuc2Zvcm1lcg0KLXsNCi0gICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YSk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU29ydGVkTmFtZU1hcHBlckxpc3QuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU29ydGVkTmFtZU1hcHBlckxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjYmI0OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NvcnRlZE5hbWVNYXBwZXJMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5OZXN0ZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7DQotDQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLWNsYXNzIFNvcnRlZE5hbWVNYXBwZXJMaXN0PFQgZXh0ZW5kcyBOYW1lTWFwcGVyPiBpbXBsZW1lbnRzIExpc3Q8VD4NCi17DQotICAgIHByaXZhdGUgTGlzdDxUPiB3cmFwcGVkOw0KLSAgICBwcml2YXRlIExpc3Q8VD4gZ2xvYmFsU3ViTmFtZU1hcHBlckxpc3Q7DQotDQotICAgIFNvcnRlZE5hbWVNYXBwZXJMaXN0KExpc3Q8VD4gd3JhcHBlZCwgTGlzdDxUPiBzdWJOYW1lTWFwcGVyTGlzdCkNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsNCi0gICAgICAgIHRoaXMuZ2xvYmFsU3ViTmFtZU1hcHBlckxpc3QgPSBzdWJOYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoVCB0KQ0KLSAgICB7DQotICAgICAgICBpZiAodCAhPSBudWxsICYmIHQuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KE5lc3RlZC5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkZFN1Yk5hbWVNYXBwZXIodCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB3cmFwcGVkLmFkZCh0KTsNCi0NCi0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHdyYXBwZWQsIG5ldyBDb21wYXJhdG9yPFQ+KCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShUIG5tMSwgVCBubTIpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChubTEgaW5zdGFuY2VvZiBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIgJiYgbm0yIGluc3RhbmNlb2YgU3ViTWFwcGVyQXdhcmVOYW1lTWFwcGVyKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5tMSBpbnN0YW5jZW9mIFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlciA/IDEgOiAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHJpdmF0ZSBib29sZWFuIGFkZFN1Yk5hbWVNYXBwZXIoVCBzdWJOYW1lTWFwcGVyKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyIG5hbWVNYXBwZXIgOiB0aGlzLndyYXBwZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKG5hbWVNYXBwZXIgaW5zdGFuY2VvZiBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAoKFN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcikgbmFtZU1hcHBlcikuYWRkTmFtZU1hcHBlcihzdWJOYW1lTWFwcGVyKTsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICB0cnlUb0FkZE1hcHBlckFzR2xvYmFsU3ViTmFtZU1hcHBlcihzdWJOYW1lTWFwcGVyKTsNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVRvQWRkTWFwcGVyQXNHbG9iYWxTdWJOYW1lTWFwcGVyKFQgc3ViTmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgaWYoIXRoaXMuZ2xvYmFsU3ViTmFtZU1hcHBlckxpc3QuY29udGFpbnMoc3ViTmFtZU1hcHBlcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5nbG9iYWxTdWJOYW1lTWFwcGVyTGlzdC5hZGQoc3ViTmFtZU1hcHBlcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZ2VuZXJhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgaW50IHNpemUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5zaXplKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmlzRW1wdHkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udGFpbnMobyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaXRlcmF0b3IoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnRvQXJyYXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlN1c3BpY2lvdXNUb0FycmF5Q2FsbCJ9KQ0KLSAgICBwdWJsaWMgPFQ+IFRbXSB0b0FycmF5KFRbXSBhKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC50b0FycmF5KGEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVtb3ZlKG8pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udGFpbnNBbGwoYyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIFQ+IGMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmFkZEFsbChjKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUPiBjKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5hZGRBbGwoaW5kZXgsIGMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnJlbW92ZUFsbChjKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5yZXRhaW5BbGwoYyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKQ0KLSAgICB7DQotICAgICAgICB3cmFwcGVkLmNsZWFyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFQgZ2V0KGludCBpbmRleCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0KGluZGV4KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVCBzZXQoaW50IGluZGV4LCBUIGVsZW1lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLnNldChpbmRleCwgZWxlbWVudCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgVCBlbGVtZW50KQ0KLSAgICB7DQotICAgICAgICB3cmFwcGVkLmFkZChpbmRleCwgZWxlbWVudCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFQgcmVtb3ZlKGludCBpbmRleCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVtb3ZlKGluZGV4KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmluZGV4T2Yobyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQubGFzdEluZGV4T2Yobyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3RJdGVyYXRvcjxUPiBsaXN0SXRlcmF0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5saXN0SXRlcmF0b3IoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yPFQ+IGxpc3RJdGVyYXRvcihpbnQgaW5kZXgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmxpc3RJdGVyYXRvcihpbmRleCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8VD4gc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuc3ViTGlzdChmcm9tSW5kZXgsIHRvSW5kZXgpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYWRjMTYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODg5NGQxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJdCdzIGFuIGFsdGVybmF0aXZlIE1hcHBlciAtIGlmIHRoZXJlIGlzIGEgcHJveHkgYXJvdW5kIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5Lg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcig1MDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoKEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyKXZhbGlkYXRpb25TdHJhdGVneSkuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckNsYXNzTmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMWFhZjkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKiAoY29uZmlndXJlZCB2aWEgd2ViLnhtbCkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVUQV9EQVRBX1RSQU5TRk9STUVSX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9DdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmQwODBmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKiAoY29uZmlndXJlZCB2aWEgaW5mb3JtYXRpb24gcHJvdmlkZXIgYmVhbikNCi0gKiBUaGUgYmVhbiBwcm92aWRlcyB0aGUgZGVmYXVsdCBuYW1lIChjb252ZW50aW9uKS4NCi0gKiBJdCdzIHBvc3NpYmxlIHRvIHByb3ZpZGUgYSBjdXN0b20gZnVsbCBxdWFsaWZpZWQgbmFtZS4gKD0gY3VzdG9taXphYmxlIGNvbnZlbnRpb24pDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBDdXN0b21Db252ZW50aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlciBleHRlbmRzDQotICAgIEFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbU5hbWVNYXBwZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgIC5nZXQoQ3VzdG9tSW5mb3JtYXRpb24uVkFMSURBVElPTl9TVFJBVEVHWV9UT19NRVRBX0RBVEFfVFJBTlNGT1JNRVJfTkFNRV9NQVBQRVIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGU4NTBkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotLyoqDQotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBtYXBzIEV4dFZhbCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXRhRGF0YVRyYW5zZm9ybWVycy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MgPQ0KLSAgICAgICAgICAgICAgICBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoDQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLA0KLSAgICAgICAgICAgICAgICBnZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZjE3NWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLQ0KLS8qKg0KLSAqIEl0J3MgYW4gYWx0ZXJuYXRpdmUgTWFwcGVyIHRvIHBsYWNlIFZhbGlkYXRpb25TdHJhdGVnaWVzIGFuZCBNZXRhRGF0YVRyYW5zZm9ybWVycyBpbiB0aGUgc2FtZSBwYWNrYWdlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcig0MDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MgPQ0KLSAgICAgICAgICAgICAgICBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0UGFja2FnZSgpID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZ2V0U2ltcGxlTWV0YURhdGFUcmFuc2Zvcm1lck5hbWUodmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArICIuIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzcy5nZXRTaW1wbGVOYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTWV0YURhdGFUcmFuc2Zvcm1lck5hbWUoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneVBhY2thZ2VOYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcG9zdGZpeCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9QT1NURklYKTsNCi0NCi0gICAgICAgIGlmKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5lbmRzV2l0aCgiVmFsaWRhdGlvblN0cmF0ZWd5IikgfHwNCi0gICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZS5lbmRzV2l0aCgiU3RyYXRlZ3kiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5UGFja2FnZU5hbWUgKyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCkgLHBvc3RmaXgpDQotICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgiVmFsaWRhdGlvblN0cmF0ZWd5IiwgcG9zdGZpeCkNCi0gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCJTdHJhdGVneSIsIHBvc3RmaXgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9pbiBjYXNlIG9mIGEgc3RhdGljIHZhbGlkYXRpb24gc3RyYXRlZ3kgbWFwcGluZw0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneVBhY2thZ2VOYW1lICsgdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lICsgcG9zdGZpeDsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1ZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmE1ODNiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1ZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lclN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLlN1Yk1hcHBlckF3YXJlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuTmVzdGVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXJDb21wYXJhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXINCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgaW1wbGVtZW50cyBTdWJNYXBwZXJBd2FyZU5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pg0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4gc3ViTmFtZU1hcHBlcnMgPSBuZXcgQXJyYXlMaXN0PE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5Pj4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkTmFtZU1hcHBlcihOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgaWYoIXRoaXMuc3ViTmFtZU1hcHBlcnMuY29udGFpbnMobmFtZU1hcHBlcikgJiYgbmFtZU1hcHBlci5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoTmVzdGVkLmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnN1Yk5hbWVNYXBwZXJzLmFkZChuYW1lTWFwcGVyKTsNCi0gICAgICAgICAgICBzb3J0U3ViTmFtZU1hcHBlcnMoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc29ydFN1Yk5hbWVNYXBwZXJzKCkNCi0gICAgew0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0aGlzLnN1Yk5hbWVNYXBwZXJzLCBuZXcgSW52b2NhdGlvbk9yZGVyQ29tcGFyYXRvcjxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsNCi0NCi0gICAgICAgIGZvcihOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gbWFwcGVyIDogdGhpcy5zdWJOYW1lTWFwcGVycykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBtYXBwZXIuY3JlYXRlTmFtZShzb3VyY2UpOw0KLQ0KLSAgICAgICAgICAgIGlmKHJlc3VsdCAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24uamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1ZjUyOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L0RlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbiBpbXBsZW1lbnRzIFByb3BlcnR5SW5mb3JtYXRpb24KLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGluZm9ybWF0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PE1ldGFEYXRhRW50cnk+IG1ldGFEYXRhTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFbnRyeT4oKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zSW5mb3JtYXRpb24oU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbk1hcC5jb250YWluc0tleShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmZvcm1hdGlvbk1hcC5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpCi0gICAgewotICAgICAgICByZXR1cm4gKFQpIGdldEluZm9ybWF0aW9uKGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5mb3JtYXRpb24oU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoIm5ldyBpbmZvcm1hdGlvbiBhZGRlZCBrZXk6ICIgKyBrZXkgKyAiIHZhbHVlOiAiICsgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5mb3JtYXRpb25NYXAucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRhRGF0YUVudHJ5W10gZ2V0TWV0YURhdGFFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtZXRhRGF0YUxpc3QudG9BcnJheShuZXcgTWV0YURhdGFFbnRyeVttZXRhRGF0YUxpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpCi0gICAgewotICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnRpZXModGhpcy5pbmZvcm1hdGlvbk1hcCk7Ci0gICAgICAgIHRoaXMubWV0YURhdGFMaXN0LmFkZChtZXRhRGF0YUVudHJ5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldE1ldGFEYXRhRW50cmllcygpCi0gICAgewotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgicmVzZXR0aW5nIG1ldGEtZGF0YSBlbnRyaWVzIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLm1ldGFEYXRhTGlzdC5jbGVhcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlEZXRhaWxzLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5RGV0YWlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTAzN2NmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlEZXRhaWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlEZXRhaWxzCi17Ci0gICAgLy9mb3JtcyB0aGUgaWQgZm9yIGNyb3NzLXZhbGlkYXRpb24gd2l0aGluIGNvbXBsZXggY29tcG9uZW50cwotICAgIHByaXZhdGUgU3RyaW5nIGtleTsKLSAgICBwcml2YXRlIE9iamVjdCBiYXNlT2JqZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5OwotCi0gICAgcHVibGljIFByb3BlcnR5RGV0YWlscyhTdHJpbmcga2V5LCBPYmplY3QgYmFzZU9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICAgIHRoaXMuYmFzZU9iamVjdCA9IGJhc2VPYmplY3Q7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gICAgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KQotICAgIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRCYXNlT2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VPYmplY3QoT2JqZWN0IGJhc2VPYmplY3QpCi0gICAgewotICAgICAgICB0aGlzLmJhc2VPYmplY3QgPSBiYXNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb24uamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDkyODRmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUluZm9ybWF0aW9uCi17Ci0gICAgYm9vbGVhbiBjb250YWluc0luZm9ybWF0aW9uKFN0cmluZyBrZXkpOwotICAgIE9iamVjdCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5KTsKLSAgICA8VD4gVCBnZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcyk7Ci0gICAgdm9pZCBzZXRJbmZvcm1hdGlvbihTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpOwotCi0gICAgTWV0YURhdGFFbnRyeVtdIGdldE1ldGFEYXRhRW50cmllcygpOwotICAgIHZvaWQgYWRkTWV0YURhdGFFbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpOwotICAgIHZvaWQgcmVzZXRNZXRhRGF0YUVudHJpZXMoKTsKLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcHJvcGVydHkvUHJvcGVydHlJbmZvcm1hdGlvbktleXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZlZjQzMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3BlcnR5L1Byb3BlcnR5SW5mb3JtYXRpb25LZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzCi17Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ERVRBSUxTID0gInByb3BlcnR5X2RldGFpbHMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9WQUxJREFUSU9OID0gInNraXBfdmFsaWRhdGlvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJsYWJlbCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fUFJPUEVSVElFUyA9ICJjdXN0b21fcHJvcGVydGllcyI7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L0RlZmF1bHRQcm94eUhlbHBlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm94eS9EZWZhdWx0UHJveHlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4NWI5Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L0RlZmF1bHRQcm94eUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRQcm94eUhlbHBlciBpbXBsZW1lbnRzIFByb3h5SGVscGVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdFByb3h5SGVscGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIDxUPiBDbGFzczxUPiBnZXRVbnByb3hpZWRDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MsIENsYXNzPFQ+IHRhcmdldFR5cGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoQ2xhc3M8VD4pZ2V0VW5wcm94aWVkQ2xhc3MoY3VycmVudENsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VW5wcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICBpZihpc1Byb3hpZWRDbGFzcyhjdXJyZW50Q2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVPZkNsYXNzKENsYXNzIGN1cnJlbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYgKGlzUHJveGllZENsYXNzKGN1cnJlbnRDbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzcy5nZXROYW1lKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWVPZk9iamVjdChPYmplY3Qgb2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZihvYmplY3QgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0TmFtZU9mQ2xhc3Mob2JqZWN0LmdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRFbmhhbmNlckJ5Q0dMSUIkJCIpIHx8DQotICAgICAgICAgICAgY3VycmVudENsYXNzLmdldE5hbWUoKS5jb250YWlucygiJCRGYXN0Q2xhc3NCeUNHTElCJCQiKSB8fA0KLSAgICAgICAgICAgIGN1cnJlbnRDbGFzcy5nZXROYW1lKCkuY29udGFpbnMoIl8kJF9qYXZhc3Npc3QiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3hpZWRPYmplY3QoT2JqZWN0IHByb3hpZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBwcm94aWVkT2JqZWN0ICE9IG51bGwgJiYgaXNQcm94aWVkQ2xhc3MocHJveGllZE9iamVjdC5nZXRDbGFzcygpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L1Byb3h5SGVscGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3Byb3h5L1Byb3h5SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZTdlNGEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9wcm94eS9Qcm94eUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFByb3h5SGVscGVyDQotew0KLSAgICBDbGFzcyBnZXRVbnByb3hpZWRDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MpOw0KLQ0KLSAgICA8VD4gQ2xhc3M8VD4gZ2V0VW5wcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzLCBDbGFzczxUPiB0YXJnZXRUeXBlKTsNCi0NCi0gICAgU3RyaW5nIGdldE5hbWVPZkNsYXNzKENsYXNzIHByb3hpZWRDbGFzcyk7DQotDQotICAgIFN0cmluZyBnZXRDbGFzc05hbWVPZk9iamVjdChPYmplY3QgcHJveGllZE9iamVjdCk7DQotDQotICAgIGJvb2xlYW4gaXNQcm94aWVkQ2xhc3MoQ2xhc3MgY3VycmVudENsYXNzKTsNCi0NCi0gICAgYm9vbGVhbiBpc1Byb3hpZWRPYmplY3QoT2JqZWN0IHByb3hpZWRPYmplY3QpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlY29yZGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzBmMjNmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVjb3JkZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLQotLyoqCi0gKiBBbGxvd3MgdG8gY2FwdHVyZSBjb252ZXJ0ZWQgdmFsdWVzLgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGludGVyZmFjZSBQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVyCi17Ci0gICAgdm9pZCByZWNvcmRVc2VySW5wdXQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9BYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNTkyMGMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJLaXQ7Ci0KLS8qKgotICogQmFzZSBmb3IgYWxsIFJlbmRlcktpdFdyYXBwZXJGYWN0b3JpZXMgdG8gZm9yY2UgYSBzcGVjaWZpYyBiZWhhdmlvdXIKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5IGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxSZW5kZXJLaXQsIFJlbmRlcktpdD4KLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3Rvcnkgd3JhcHBlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZGVhY3RpdmF0ZWQgPSBmYWxzZTsKLQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSByZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSkKLSAgICB7Ci0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UocmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGFkZGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLndyYXBwZWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy53cmFwcGVkLmFkZFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IHJlbmRlcktpdFdyYXBwZXJGYWN0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZGVhY3RpdmF0ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuZGVhY3RpdmF0ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVhY3RpdmF0ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlYWN0aXZhdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBSZW5kZXJLaXQgY3JlYXRlKFJlbmRlcktpdCByZW5kZXJLaXQpCi0gICAgewotICAgICAgICBpZihpc0RlYWN0aXZhdGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVuZGVyS2l0IHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYodGhpcy53cmFwcGVkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMud3JhcHBlZC5jcmVhdGUocmVuZGVyS2l0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlV3JhcHBlcihyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgUmVuZGVyS2l0IGNyZWF0ZVdyYXBwZXIoUmVuZGVyS2l0IHJlbmRlcktpdCk7Ci0KLSAgICAvKioKLSAgICAgKiBzaW1wbGUgdGVzdCBmb3IgZWFybHkgY29uZmlnIGluIGNhc2Ugb2YgbW9qYXJyYSAoaW5jbC4gdGhlIGNvbWJpbmF0aW9uIHdpdGggdHJpbmlkYWQpLgotICAgICAqIHVzZSBhIGN1c3RvbSBleHR2YWwgY29udGV4dCBpbXBsLiAoc2VlIEVYVFZBTC01OCkgdG8gb3B0aW1pemUgdGhpcyBjaGVjayBmb3IgdGhlIHRhcmdldCBydW50aW1lLgotICAgICAqIHRoaXMgY2hlY2sgd29ya3MgZm9yIGFsbCBjdXJyZW50IGltcGxlbWVudGF0aW9ucyBzaW5jZSB0aGUganNmIGludGVybmFscyBhcmUgYXV0b20uIHJlYWR5IGR1cmluZyBhIHJlcXVlc3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGpzZiBpbXBsLiBpcyBpbml0aWFsaXplZCBhbmQgaXQncyBwb3NzaWJsZSB0byB1c2UgaXQgYXMgZXhwZWN0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FwcGxpY2F0aW9uSW5pdGlhbGl6ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEpzZlV0aWxzLmlzQXBwbGljYXRpb25Jbml0aWFsaXplZCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0RlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMjZiNzIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkKLXsKLSAgICBwcml2YXRlIFJlbmRlcktpdCByZW5kZXJLaXQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSSUNfUkVOREVSX0tJVF9XUkFQUEVSX0ZBQ1RPUlkgPQotICAgICAgICAgICAgIm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5nZW5lcmljLnJlbmRlcmtpdC5HZW5lcmljUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkiOwotICAgIHByaXZhdGUgc3RhdGljIEJvb2xlYW4gdXNlR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBSZW5kZXJLaXQgY3JlYXRlV3JhcHBlcihSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0dmFsIHJlbmRlcmtpdCB3cmFwcGVyIGNyZWF0ZWQgZm9yICIgKyByZW5kZXJLaXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy93b3JrYXJvdW5kIGZvciBtb2phcnJhIChFWFRWQUwtMzgpCi0gICAgICAgIGlmKHVzZUdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyBnZW5lcmljRmFjdG9yeSA9IENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKEdFTkVSSUNfUkVOREVSX0tJVF9XUkFQUEVSX0ZBQ1RPUlkpOwotICAgICAgICAgICAgdXNlR2VuZXJpY1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID0gZ2VuZXJpY0ZhY3RvcnkgIT0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHVzZUdlbmVyaWNSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSkKLSAgICAgICAgewotICAgICAgICAgICAgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSByZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSA9IChBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KUNsYXNzVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoR0VORVJJQ19SRU5ERVJfS0lUX1dSQVBQRVJfRkFDVE9SWSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY3JlYXRlV3JhcHBlcihyZW5kZXJLaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGhpcy5yZW5kZXJLaXQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5yZW5kZXJLaXQgPSBuZXcgRXh0VmFsUmVuZGVyS2l0KHJlbmRlcktpdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyS2l0OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxMYXp5UmVuZGVyZXJQcm94eS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsTGF6eVJlbmRlcmVyUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzNjI4Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxMYXp5UmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5SZW5kZXJlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLQotLyoqCi0gKiB0byBzdXBwb3J0IGEgY3VzdG9tIHByb3h5Ci0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLWNsYXNzIEV4dFZhbExhenlSZW5kZXJlclByb3h5IGV4dGVuZHMgUmVuZGVyZXIKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBSZW5kZXJlciB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbExhenlSZW5kZXJlclByb3h5KFJlbmRlcmVyIHJlbmRlcmVyKQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyZXI7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic2ltcGxlIHByb3h5IGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBnZXRMYXp5UmVuZGVyZXIoKS5kZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0TGF6eVJlbmRlcmVyKCkuZW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdldExhenlSZW5kZXJlcigpLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRDbGllbnRJZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRMYXp5UmVuZGVyZXIoKS5jb252ZXJ0Q2xpZW50SWQoZmFjZXNDb250ZXh0LCBzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldExhenlSZW5kZXJlcigpLmdldFJlbmRlcnNDaGlsZHJlbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TGF6eVJlbmRlcmVyKCkuZ2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJlciBnZXRMYXp5UmVuZGVyZXIoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHByb3h5Q2xhc3NOYW1lID0gKFN0cmluZykgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVkpOwotCi0gICAgICAgIGlmKHByb3h5Q2xhc3NOYW1lICE9IG51bGwgJiYgIXByb3h5Q2xhc3NOYW1lLmVuZHNXaXRoKGdldENsYXNzKCkuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShwcm94eUNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmKHRhcmdldENsYXNzID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYSBjdXN0b20gaW52YWxpZCByZW5kZXJlciBwcm94eSBpcyBjb25maWd1cmVkOiAiICsgcHJveHlDbGFzc05hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDbGFzc1tdIGFyZ0NsYXNzZXMgPSBuZXcgQ2xhc3NbMV07Ci0gICAgICAgICAgICBhcmdDbGFzc2VzWzBdID0gUmVuZGVyZXIuY2xhc3M7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGFyZ2V0Q2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJnQ2xhc3Nlcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChSZW5kZXJlciljb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSh0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgY3JlYXRlOiAiICsgdGFyZ2V0Q2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZDsKLSAgICAgICAgfQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcktpdC5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0N2U2ZjQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LlJlc3BvbnNlU3RyZWFtOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuUmVzcG9uc2VXcml0ZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlc3BvbnNlU3RhdGVNYW5hZ2VyOwotaW1wb3J0IGphdmF4LmZhY2VzLnJlbmRlci5DbGllbnRCZWhhdmlvclJlbmRlcmVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcktpdCBleHRlbmRzIFJlbmRlcktpdAotewotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0gICAgcHJvdGVjdGVkIFJlbmRlcktpdCB3cmFwcGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcktpdChSZW5kZXJLaXQgd3JhcHBlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW5kZXJlcihTdHJpbmcgZmFtaWx5LCBTdHJpbmcgcmVuZGVyZXJUeXBlLCBSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIGlmIChyZW5kZXJlciBpbnN0YW5jZW9mIEV4dFZhbFJlbmRlcmVyV3JhcHBlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgcmVuZGVyZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5hZGRSZW5kZXJlcihmYW1pbHksIHJlbmRlcmVyVHlwZSwgY3JlYXRlV3JhcHBlcihyZW5kZXJlcikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFJlbmRlcmVyIGdldFJlbmRlcmVyKFN0cmluZyBmYW1pbHksIFN0cmluZyByZW5kZXJlclR5cGUpCi0gICAgewotICAgICAgICBSZW5kZXJlciByZW5kZXJlciA9IHdyYXBwZWQuZ2V0UmVuZGVyZXIoZmFtaWx5LCByZW5kZXJlclR5cGUpOwotCi0gICAgICAgIGlmKHJlbmRlcmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJlciBpbnN0YW5jZW9mIEV4dFZhbFJlbmRlcmVyV3JhcHBlciA/IHJlbmRlcmVyIDogY3JlYXRlV3JhcHBlcihyZW5kZXJlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oIm5vIHJlbmRlcmVyIGZvdW5kIGZvciBmYW1pbHkgIiArIGZhbWlseSArICIgYW5kIHR5cGUgIiArIHJlbmRlcmVyVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVuZGVyZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlU3RhdGVNYW5hZ2VyIGdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJlc3BvbnNlU3RhdGVNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlV3JpdGVyIGNyZWF0ZVJlc3BvbnNlV3JpdGVyKFdyaXRlciB3cml0ZXIsIFN0cmluZyBzLCBTdHJpbmcgczEpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jcmVhdGVSZXNwb25zZVdyaXRlcih3cml0ZXIsIHMsIHMxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2VTdHJlYW0gY3JlYXRlUmVzcG9uc2VTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmNyZWF0ZVJlc3BvbnNlU3RyZWFtKG91dHB1dFN0cmVhbSk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gZ2V0Q29tcG9uZW50RmFtaWxpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q29tcG9uZW50RmFtaWxpZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBnZXRSZW5kZXJlclR5cGVzKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UmVuZGVyZXJUeXBlcyhzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDbGllbnRCZWhhdmlvclJlbmRlcmVyKFN0cmluZyBzLCBDbGllbnRCZWhhdmlvclJlbmRlcmVyIGNsaWVudEJlaGF2aW9yUmVuZGVyZXIpCi0gICAgewotICAgICAgICB3cmFwcGVkLmFkZENsaWVudEJlaGF2aW9yUmVuZGVyZXIocywgY2xpZW50QmVoYXZpb3JSZW5kZXJlcik7Ci0gICAgfQotCi0gICAgcHVibGljIENsaWVudEJlaGF2aW9yUmVuZGVyZXIgZ2V0Q2xpZW50QmVoYXZpb3JSZW5kZXJlcihTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudEJlaGF2aW9yUmVuZGVyZXIocyk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gZ2V0Q2xpZW50QmVoYXZpb3JSZW5kZXJlclR5cGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldENsaWVudEJlaGF2aW9yUmVuZGVyZXJUeXBlcygpOwotICAgIH0KLQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIGNyZWF0ZVdyYXBwZXIoUmVuZGVyZXIgcmVuZGVyZXIpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEV4dFZhbFJlbmRlcmVyV3JhcHBlcihyZW5kZXJlcik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXRGYWN0b3J5LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJLaXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNzZiOTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyS2l0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjdG9yeU5hbWVzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcktpdDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogY2VudHJhbCBtZWNoYW5pc20gd2hpY2ggaXMgcmVzcG9uc2libGUgdG8gY3JlYXRlIGEgd3JhcHBlciBmb3IgYSByZW5kZXJlciAtIHN0YXJ0aW5nIHBvaW50IG9mIGV4dHZhbC4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcktpdEZhY3RvcnkgZXh0ZW5kcyBSZW5kZXJLaXRGYWN0b3J5Ci17Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsKLSAgICBwcml2YXRlIFJlbmRlcktpdEZhY3Rvcnkgd3JhcHBlZDsKLSAgICBwcml2YXRlIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgZGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5OwotICAgIHByaXZhdGUgQm9vbGVhbiBpc0RlYWN0aXZhdGVkOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcktpdEZhY3RvcnkoUmVuZGVyS2l0RmFjdG9yeSByZW5kZXJLaXRGYWN0b3J5KQotICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gcmVuZGVyS2l0RmFjdG9yeTsKLQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbmRlcktpdChTdHJpbmcgcywgUmVuZGVyS2l0IHJlbmRlcktpdCkKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZC5hZGRSZW5kZXJLaXQocywgcmVuZGVyS2l0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVuZGVyS2l0IGdldFJlbmRlcktpdChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBTdHJpbmcgcykKLSAgICB7Ci0gICAgICAgIFJlbmRlcktpdCByZW5kZXJLaXQgPSB0aGlzLndyYXBwZWQuZ2V0UmVuZGVyS2l0KGZhY2VzQ29udGV4dCwgcyk7Ci0KLSAgICAgICAgLy9mb3IgbW9qYXJyYSArIHRyaW5pZGFkCi0gICAgICAgIGlmKHJlbmRlcktpdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeVRvSW5pdERlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSgpOwotCi0gICAgICAgIGNoZWNrUmVuZGVyS2l0RmFjdG9yeURlYWN0aXZhdGlvbigpOwotCi0gICAgICAgIGlmKHRoaXMuaXNEZWFjdGl2YXRlZCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlbmRlcktpdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vdGVzdCBlYXJseSBjb25maWcgaW4gY2FzZSBvZiBtb2phcnJhCi0gICAgICAgIGlmKCF0aGlzLmRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5pc0FwcGxpY2F0aW9uSW5pdGlhbGl6ZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmNyZWF0ZVdyYXBwZXIocmVuZGVyS2l0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnlUb0NyZWF0ZVdyYXBwZXJXaXRoV3JhcHBlckZhY3RvcnkocmVuZGVyS2l0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tSZW5kZXJLaXRGYWN0b3J5RGVhY3RpdmF0aW9uKCkKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMuaXNEZWFjdGl2YXRlZCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihFeHRWYWxVdGlscy5pc0V4dFZhbERlYWN0aXZhdGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc0RlYWN0aXZhdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKHRoaXMuZGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmlzQXBwbGljYXRpb25Jbml0aWFsaXplZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuaXNEZWFjdGl2YXRlZCA9IGlzUmVuZGVyS2l0RmFjdG9yeURlYWN0aXZhdGVkVmlhV2ViWG1sKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc0RlYWN0aXZhdGVkID0gaXNSZW5kZXJLaXRGYWN0b3J5RGVhY3RpdmF0ZWRWaWFWTVBhcmFtZXRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB0cnlUb0luaXREZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgaWYodGhpcy5kZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy93b3JrYXJvdW5kIGZvciBtb2phcnJhIHRvIGFsbG93IGEgY3VzdG9tIGZhY3RvcnkgZHVyaW5nIHRoZSBlYXJseSBjb25maWcgcGhhc2UKLSAgICAgICAgICAgIC8vanVzdCBjcmVhdGUgdGhlIGZhY3Rvcnkgd2l0aCB0aGUgZ2l2ZW4gbmFtZQotICAgICAgICAgICAgLy8raXQgc2hvdWxkIGV4dGVuZCB5b3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiB3aGljaCB5b3UgcmVnaXN0ZXIgYXMgdXN1YWwKLSAgICAgICAgICAgIE9iamVjdCBjdXN0b21GYWN0b3J5ID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKAotICAgICAgICAgICAgICAgICAgICBFeHRWYWxJbmZvcm1hdGlvbi5FWFRFTlNJT05TX1ZBTElEQVRPUl9CQVNFX1BBQ0tBR0VfTkFNRSArICIuY3VzdG9tLlJlbmRlcktpdFdyYXBwZXJGYWN0b3J5Iik7Ci0KLSAgICAgICAgICAgIGlmKGN1c3RvbUZhY3RvcnkgaW5zdGFuY2VvZiBBYnN0cmFjdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFJlbmRlcktpdFdyYXBwZXJGYWN0b3J5ID0gKEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkpY3VzdG9tRmFjdG9yeTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSA9IG5ldyBEZWZhdWx0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUmVuZGVyS2l0IHRyeVRvQ3JlYXRlV3JhcHBlcldpdGhXcmFwcGVyRmFjdG9yeShSZW5kZXJLaXQgcmVuZGVyS2l0KQotICAgIHsKLSAgICAgICAgQWJzdHJhY3RSZW5kZXJLaXRXcmFwcGVyRmFjdG9yeSB3cmFwcGVyRmFjdG9yeSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQotICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlJFTkRFUktJVF9XUkFQUEVSX0ZBQ1RPUlksIEFic3RyYWN0UmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgIC8vc29tZSBjb21wb25lbnQgbGlicyBlLmcuIG15ZmFjZXMtdHJpbmlkYWQgYXJlbid0IGNvbXBhdGlibGUgd2l0aCB0aGlzIGNsZWFuIGFwcHJvYWNoCi0gICAgICAgIC8vZXhhbXBsZSBzZWUgVHJpbmlkYWRNb2R1bGVTdGFydHVwTGlzdGVuZXIKLSAgICAgICAgaWYod3JhcHBlckZhY3RvcnkuaXNEZWFjdGl2YXRlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcmVuZGVyS2l0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJGYWN0b3J5LmNyZWF0ZShyZW5kZXJLaXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGdldFJlbmRlcktpdElkcygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkLmdldFJlbmRlcktpdElkcygpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlbmRlcktpdEZhY3RvcnlEZWFjdGl2YXRlZFZpYVdlYlhtbCgpCi0gICAgewotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfUkVOREVSX0tJVF9GQUNUT1JZKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNSZW5kZXJLaXRGYWN0b3J5RGVhY3RpdmF0ZWRWaWFWTVBhcmFtZXRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoU3lzdGVtCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KEV4dFZhbEluZm9ybWF0aW9uLkVYVEVOU0lPTlNfVkFMSURBVE9SX0JBU0VfUEFDS0FHRV9OQU1FICsKLSAgICAgICAgICAgICAgICAgICAgIi5ERUFDVElWQVRFX1JFTkRFUl9LSVRfRkFDVE9SWSIsICJmYWxzZSIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlclByb3h5LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3JlbmRlcmtpdC9FeHRWYWxSZW5kZXJlclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMzYxM2MuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlJlbmRlcmVyUHJveHlTdG9yYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkpzZlByb2plY3RTdGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiB0byBhdm9pZCBtdWx0aXBsZSBjYWxscyBvZiByZW5kZXJlciBtZXRob2RzIHdpdGhpbiByZW5kZXJlciBpbnRlcmNlcHRvcnMgKGUuZy4gZm9yIGVuY29kZSwgZGVjb2RlLC4uLikKLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFJlbmRlcmVyUHJveHkgZXh0ZW5kcyBSZW5kZXJlcgotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9IEV4dFZhbFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpICsgIjpLRVkiOwotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7Ci0gICAgCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIHdyYXBwZWQ7Ci0KLSAgICBwdWJsaWMgRXh0VmFsUmVuZGVyZXJQcm94eShSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHJlbmRlcmVyOwotCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInByb3h5IGNyZWF0ZWQgZm9yICIgKyByZW5kZXJlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGVudHJ5ID0gZ2V0UmVuZGVyZXJFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRGVjb2RlQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldERlY29kZUNhbGxlZCh0cnVlKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVkLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DcmVhdGVNZXNzYWdlKCJkZWNvZGUiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUJlZ2luKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkgPSBnZXRSZW5kZXJlckVudHJ5KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotCi0gICAgICAgIGlmICghZW50cnkuaXNFbmNvZGVCZWdpbkNhbGxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeS5zZXRFbmNvZGVCZWdpbkNhbGxlZCh0cnVlKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlZC5lbmNvZGVCZWdpbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DcmVhdGVNZXNzYWdlKCJlbmNvZGVCZWdpbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQ2hpbGRyZW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBlbnRyeSA9IGdldFJlbmRlcmVyRW50cnkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFlbnRyeS5pc0VuY29kZUNoaWxkcmVuQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldEVuY29kZUNoaWxkcmVuQ2FsbGVkKHRydWUpOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLndyYXBwZWQuZW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeVRvQ3JlYXRlTWVzc2FnZSgiZW5jb2RlQ2hpbGRyZW4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUVuZChGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGVudHJ5ID0gZ2V0UmVuZGVyZXJFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIWVudHJ5LmlzRW5jb2RlRW5kQ2FsbGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5LnNldEVuY29kZUVuZENhbGxlZCh0cnVlKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVkLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DcmVhdGVNZXNzYWdlKCJlbmNvZGVFbmQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydENsaWVudElkKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmNvbnZlcnRDbGllbnRJZChmYWNlc0NvbnRleHQsIHMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCk7Ci0gICAgICAgICAgICB0aHJvdyByOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UmVuZGVyc0NoaWxkcmVuKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRSZW5kZXJzQ2hpbGRyZW4oKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXNldENvbXBvbmVudFByb3h5TWFwcGluZygpOwotICAgICAgICAgICAgdGhyb3cgdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udmVydGVkVmFsdWUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE9iamVjdCBvKQotICAgICAgICB0aHJvd3MgQ29udmVydGVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGVudHJ5ID0gZ2V0UmVuZGVyZXJFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoZW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh3cmFwcGVkLmdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRQcm94eU1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5VG9DcmVhdGVNZXNzYWdlKCJnZXRDb252ZXJ0ZWRWYWx1ZSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGdldFJlbmRlcmVyRW50cnkoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBTdHJpbmcga2V5ID0gdWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KTsKLQotICAgICAgICBrZXkgKz0gZ2V0T3B0aW9uYWxLZXkoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKCFnZXRSZW5kZXJlclN0b3JhZ2UoKS5jb250YWluc0VudHJ5KGdldFJlbmRlcmVyS2V5KCksIGtleSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldFJlbmRlcmVyU3RvcmFnZSgpLnNldEVudHJ5KGdldFJlbmRlcmVyS2V5KCksIGtleSwgbmV3IFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldFJlbmRlcmVyU3RvcmFnZSgpLmdldEVudHJ5KGdldFJlbmRlcmVyS2V5KCksIGtleSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcHRpb25hbEtleShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbmRlcmVyS2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh0aGlzLndyYXBwZWQuZ2V0Q2xhc3MoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJlclByb3h5U3RvcmFnZSBnZXRSZW5kZXJlclN0b3JhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFN0b3JhZ2UoUmVuZGVyZXJQcm94eVN0b3JhZ2UuY2xhc3MsIFJlbmRlcmVyUHJveHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0Q29tcG9uZW50UHJveHlNYXBwaW5nKCkKLSAgICB7Ci0gICAgICAgIC8vcmVzZXQgY29tcG9uZW50IHByb3h5IG1hcHBpbmcKLSAgICAgICAgRXh0VmFsVXRpbHMucmVzZXRTdG9yYWdlKFJlbmRlcmVyUHJveHlTdG9yYWdlLmNsYXNzLCBSZW5kZXJlclByb3h5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0cnlUb0NyZWF0ZU1lc3NhZ2UoU3RyaW5nIG1ldGhvZE5hbWUpCi0gICAgewotICAgICAgICBpZihKc2ZQcm9qZWN0U3RhZ2UuaXMoSnNmUHJvamVjdFN0YWdlLkRldmVsb3BtZW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiZG91YmxlIGNhbGwgb2YgIiArIHRoaXMud3JhcHBlZC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIjIiArIG1ldGhvZE5hbWUgKyAiIGZpbHRlcmVkLiAiICsKLSAgICAgICAgICAgICAgICAgICAgInRoaXMgb3B0aW1pemF0aW9uIG1pZ2h0IGxlYWQgdG8gaW5jb21wYXRpYmlsaXRpZXMgd2l0aCBzb21lIGNvbXBvbmVudCBsaWJzLiAiICsKLSAgICAgICAgICAgICAgICAgICAgImluIHN1Y2ggYSBjYXNlIHVzZSB0aGUgc3VwcG9ydCBtb2R1bGUgZm9yIHRoZSBjb21wb25lbnQgbGliIG9yIHVzZTogIiArCi0gICAgICAgICAgICAgICAgICAgICJFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eShFeHRWYWxSZW5kZXJlclByb3h5LktFWSwgbnVsbCk7ICIgKwotICAgICAgICAgICAgICAgICAgICAiaW4gYSBzdGFydHVwIGxpc3RlbmVyIjsKLQotICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRNZXNzYWdlKG51bGwsIEV4dFZhbFV0aWxzLmNyZWF0ZUZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UuU0VWRVJJVFlfV0FSTiwgbWVzc2FnZSwgbWVzc2FnZSkpOwotCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKG1lc3NhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygidHVybiBvbiB0aGUgZGV2ZWxvcG1lbnQgbW9kZSBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiwgaWYgc29tZXRoaW5nIGlzIGRpc3BsYXllZCB3cm9uZy4iKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L0V4dFZhbFJlbmRlcmVyV3JhcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YzMwNWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvRXh0VmFsUmVuZGVyZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUmVuZGVyZXJJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLQotLyoqCi0gKiBEZWZhdWx0IGFwcHJvYWNoIHRvIGF2b2lkIHByb3hpZXMgZm9yIGNvbnZlcnRlcnMgYW5kIHRoZSBhZGFwdGVyIGZhbGxiYWNrLgotICogSXQgcmVxdWlyZXMgdGhhdCBjb21wb25lbnRzIGRlbGVnYXRlIGdldENvbnZlcnRlZFZhbHVlIHRvIGEgcmVuZGVyZXIuPGJyLz4KLSAqIElmIGl0IGlzbid0IHRoZSBjYXNlIGZvciB5b3VyIGNvbXBvbmVudCBsaWIgdXNlOgotICogb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJveHkuRXh0VmFsQXBwbGljYXRpb25GYWN0b3J5PGJyLz4KLSAqIGFuZDxici8+Ci0gKiBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5Qcm94eU1hcHBpbmdQaGFzZUxpc3RlbmVyCi0gKiA8cC8+Ci0gKiBUaGlzIHdyYXBwZXIgd2lsbCBhbHNvIGltcGxlbWVudCBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIGJlaGF2aW91cgotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgRXh0VmFsUmVuZGVyZXJXcmFwcGVyIGV4dGVuZHMgUmVuZGVyZXIKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOwotCi0gICAgcHJvdGVjdGVkIFJlbmRlcmVyIHdyYXBwZWQ7Ci0gICAgcHJvdGVjdGVkIEV4dFZhbENvbnRleHQgZXh0VmFsQ29udGV4dCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpOwotCi0gICAgcHVibGljIEV4dFZhbFJlbmRlcmVyV3JhcHBlcihSZW5kZXJlciByZW5kZXJlcikKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwcm94eUNsYXNzTmFtZSA9IChTdHJpbmcpRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVkpOwotCi0gICAgICAgIGlmKHByb3h5Q2xhc3NOYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNvbmZpZ3VyZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gbmV3IEV4dFZhbExhenlSZW5kZXJlclByb3h5KHJlbmRlcmVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUocHJveHlDbGFzc05hbWUpOwotCi0gICAgICAgIGlmKHRhcmdldENsYXNzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gZXh0dmFsIHJlbmRlcmVyIHByb3h5IGNvbmZpZ3VyZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gbmV3IEV4dFZhbExhenlSZW5kZXJlclByb3h5KHJlbmRlcmVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzW10gYXJnQ2xhc3NlcyA9IG5ldyBDbGFzc1sxXTsKLSAgICAgICAgYXJnQ2xhc3Nlc1swXSA9IFJlbmRlcmVyLmNsYXNzOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHRhcmdldENsYXNzLmdldENvbnN0cnVjdG9yKGFyZ0NsYXNzZXMpOwotICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gKFJlbmRlcmVyKWNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHJlbmRlcmVyKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm5vIGV4dHZhbCByZW5kZXJlciBwcm94eSBjcmVhdGVkIGZvciAiICsgcmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZXh0dmFsIHJlbmRlcmVyIHdyYXBwZXIgY3JlYXRlZCBmb3IgIiArIHJlbmRlcmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGRlY29kZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZURlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZURlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZGVjb2RlIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZURlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goU2tpcEJlZm9yZUludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZURlY29kZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckRlY29kZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5hZnRlckRlY29kZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRGVjb2RlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJEZWNvZGUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBlbmNvZGVCZWdpbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSB0cnVlOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJlbmNvZGVCZWdpbiBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVCZWdpbiBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVCZWdpbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUJlZ2luKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRW5jb2RlQmVnaW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyRW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUJlZ2luIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJFbmNvZGVCZWdpbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUNoaWxkcmVuIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYmVmb3JlRW5jb2RlQ2hpbGRyZW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImVuY29kZUNoaWxkcmVuIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUNoaWxkcmVuIG9mICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVDaGlsZHJlbiBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGRlbGVnYXRlCi0gICAgICAgICAqLwotICAgICAgICBpZihkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cmFwcGVkLmVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGFmdGVyRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVDaGlsZHJlbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlQ2hpbGRyZW4gb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUNoaWxkcmVuIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IgOiBleHRWYWxDb250ZXh0LmdldFJlbmRlcmVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGJlZm9yZUVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB0aGlzLndyYXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiZW5jb2RlRW5kIGRlbGVnYXRpb24gY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlVG9XcmFwcGVkUmVuZGVyZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlLmlzU2tpcE90aGVySW50ZXJjZXB0b3JzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImJlZm9yZUVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVFbmNvZGVFbmQgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgd3JhcHBlZC5lbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKFJlbmRlcmVySW50ZXJjZXB0b3IgcmVuZGVyZXJJbnRlcmNlcHRvciA6IGV4dFZhbENvbnRleHQuZ2V0UmVuZGVyZXJJbnRlcmNlcHRvcnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgYWZ0ZXJFbmNvZGVFbmQgb2YgIiArIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuYWZ0ZXJFbmNvZGVFbmQoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckVuY29kZUVuZCBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImFmdGVyRW5jb2RlRW5kIGludGVyY2VwdG9ycyBjYW5jZWxlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBjb252ZXJ0Q2xpZW50SWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgU3RyaW5nIHMpCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jb252ZXJ0Q2xpZW50SWQoZmFjZXNDb250ZXh0LCBzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBnZXRSZW5kZXJzQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UmVuZGVyc0NoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pCi0gICAgICAgIHRocm93cyBDb252ZXJ0ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlciA9IHRydWU7Ci0gICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsgcmVuZGVyZXJJbnRlcmNlcHRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmJlZm9yZUdldENvbnZlcnRlZFZhbHVlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG8sIHRoaXMud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QgPSBlLmdldFJldHVyblZhbHVlT25FeGNlcHRpb24oY29udmVydGVkT2JqZWN0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJnZXRDb252ZXJ0ZWRWYWx1ZSBkZWxlZ2F0aW9uIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVRvV3JhcHBlZFJlbmRlcmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZS5pc1NraXBPdGhlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJiZWZvcmVHZXRDb252ZXJ0ZWRWYWx1ZSBvZiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJjZXB0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYmVmb3JlR2V0Q29udmVydGVkVmFsdWUgaW50ZXJjZXB0b3JzIGNhbmNlbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGVsZWdhdGVUb1dyYXBwZWRSZW5kZXJlcikKLSAgICAgICAgewotICAgICAgICAgICAgY29udmVydGVkT2JqZWN0ID0gd3JhcHBlZC5nZXRDb252ZXJ0ZWRWYWx1ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBvKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoUmVuZGVyZXJJbnRlcmNlcHRvciByZW5kZXJlckludGVyY2VwdG9yIDogZXh0VmFsQ29udGV4dC5nZXRSZW5kZXJlckludGVyY2VwdG9ycygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCBhZnRlckdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZW5kZXJlckludGVyY2VwdG9yLmFmdGVyR2V0Q29udmVydGVkVmFsdWUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbywgdGhpcy53cmFwcGVkKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZnRlckdldENvbnZlcnRlZFZhbHVlIG9mICIgKyByZW5kZXJlckludGVyY2VwdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU2tpcEFmdGVySW50ZXJjZXB0b3JzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWZ0ZXJHZXRDb252ZXJ0ZWRWYWx1ZSBpbnRlcmNlcHRvcnMgY2FuY2VsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRPYmplY3Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBBZnRlckludGVyY2VwdG9yc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjJmZmRhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTa2lwQWZ0ZXJJbnRlcmNlcHRvcnNFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTQ3Mjc5MDQ5ODc2NjI1MTM0Nkw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YzIwYTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBjbGFzcyBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQxODQyNDA1MTQ2NDgxNDg4OEw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvcmVuZGVya2l0L2V4Y2VwdGlvbi9Ta2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MjBmYmUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9yZW5kZXJraXQvZXhjZXB0aW9uL1NraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5SZW5kZXJlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQotcHVibGljIGNsYXNzIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXJJbnRlcmNlcHRvciBleGNlcHRpb25Tb3VyY2U7Ci0gICAgcHJvdGVjdGVkIE9iamVjdCBpbmZvcm1hdGlvbjsKLSAgICBib29sZWFuIHNraXBPdGhlckludGVyY2VwdG9ycyA9IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIzNDMwNzQwNzc1MzI5MTU3MjJMOwotCi0gICAgcHVibGljIFNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24oKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbihib29sZWFuIHNraXBPdGhlckludGVyY2VwdG9ycykKLSAgICB7Ci0gICAgICAgIHRoaXMuc2tpcE90aGVySW50ZXJjZXB0b3JzID0gc2tpcE90aGVySW50ZXJjZXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uKGJvb2xlYW4gc2tpcE90aGVySW50ZXJjZXB0b3JzLCBSZW5kZXJlckludGVyY2VwdG9yIHJlbmRlcmVySW50ZXJjZXB0b3IpCi0gICAgewotICAgICAgICB0aGlzKHNraXBPdGhlckludGVyY2VwdG9ycyk7Ci0gICAgICAgIHRoaXMuZXhjZXB0aW9uU291cmNlID0gcmVuZGVyZXJJbnRlcmNlcHRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvbihPYmplY3QgaW5mb3JtYXRpb24pCi0gICAgewotICAgICAgICB0aGlzLmluZm9ybWF0aW9uID0gaW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gaW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTa2lwT3RoZXJJbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNraXBPdGhlckludGVyY2VwdG9yczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJldHVyblZhbHVlT25FeGNlcHRpb24oT2JqZWN0IGN1cnJlbnRSZXR1cm5WYWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzLmV4Y2VwdGlvblNvdXJjZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5leGNlcHRpb25Tb3VyY2UuZ2V0UmV0dXJuVmFsdWVPblNraXBSZW5kZXJlckRlbGVnYXRpb25FeGNlcHRpb24odGhpcywgY3VycmVudFJldHVyblZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3VycmVudFJldHVyblZhbHVlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0YXJ0dXAvQWJzdHJhY3RTdGFydHVwTGlzdGVuZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDcwYTZhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5XZWJYbWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuUHJvamVjdFN0YWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkRlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBJbiBvcmRlciB0byBleGVjdXRlIGxvZ2ljIGp1c3Qgb25jZS4NCi0gKiBlLmcuIHJlZ2lzdGVyIGFydGlmYWN0cyB2aWEgYXBpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lciBpbXBsZW1lbnRzIFBoYXNlTGlzdGVuZXINCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIC8vZG9uJ3QgcmVtb3ZlIC0gaXQncyBhIGZhbGxiYWNrIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIGRlcmVnaXN0cmF0aW9uDQotICAgIC8vdGFyZ2V0OiBkb24ndCBwcm9jZXNzIGluaXQgbG9naWMgbW9yZSB0aGFuIG9uY2UNCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxDbGFzcz4gaW5pdGlhbGl6ZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlckluaXRpYWxpemVkID0gZmFsc2U7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYmVmb3JlUGhhc2UoUGhhc2VFdmVudCBldmVudCkNCi0gICAgew0KLSAgICAgICAgc3luY2hyb25pemVkIChBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lci5jbGFzcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIWluaXRpYWxpemVkTGlzdGVuZXJzLmNvbnRhaW5zKGdldENsYXNzKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc0luZm9FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oInN0YXJ0IGluaXQgb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpc1N0YXJ0dXBMaXN0ZW5lckRlYWN0aXZhdGVkKCkpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0UHJvamVjdFN0YWdlUmVzb2x2ZXIoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiaW5pdCBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGRlYWN0aXZhdGVkIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJpbml0IG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBmaW5hbGx5DQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgSnNmVXRpbHMuZGVyZWdpc3RlclBoYXNlTGlzdGVuZXIodGhpcyk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJhbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgZGVyZWdpc3RlcmluZyB0aGUgcGhhc2UtbGlzdGVuZXIiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldENsYXNzKCkuZ2V0TmFtZSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgLT4gdGhlcmUgaXMganVzdCBhIGxpdHRsZSBvdmVyaGVhZCwiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYnV0IGV2ZXJ5dGhpbmcgZWxzZSB3b3JrcyBjb3JyZWN0bHkuIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGhvd2V2ZXIsIHBsZWFzZSBpbmZvcm0gdGhlIGNvbW11bml0eSBhYm91dCB5b3VyIGNvbmZpZ3VyYXRpb24iLCB0KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBmaW5hbGx5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkTGlzdGVuZXJzLmFkZChnZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGhhc2VJZCBnZXRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFBoYXNlSWQuUkVTVE9SRV9WSUVXOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzU3RhcnR1cExpc3RlbmVyRGVhY3RpdmF0ZWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuaXNFeHRWYWxEZWFjdGl2YXRlZCgpIHx8DQotICAgICAgICAgICAgICAgICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFV0aWxzLmdldEluaXRQYXJhbWV0ZXIobnVsbCwgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOkRFQUNUSVZBVEVEIikpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpDQotICAgIHsNCi0gICAgICAgIGlmKCFkZWZhdWx0UHJvamVjdFN0YWdlUmVzb2x2ZXJJbml0aWFsaXplZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAgICAgLmFkZEdsb2JhbFByb3BlcnR5KFByb2plY3RTdGFnZVJlc29sdmVyLmNsYXNzLmdldE5hbWUoKSwgZ2V0UHJvamVjdFN0YWdlUmVzb2x2ZXIoKSwgZmFsc2UpOw0KLSAgICAgICAgICAgIGRlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlckluaXRpYWxpemVkID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgUHJvamVjdFN0YWdlUmVzb2x2ZXIgZ2V0UHJvamVjdFN0YWdlUmVzb2x2ZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRQcm9qZWN0U3RhZ2VSZXNvbHZlcigpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXQoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0V4dFZhbFN0YXJ0dXBMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdGFydHVwL0V4dFZhbFN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWQzMjgxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RhcnR1cC9FeHRWYWxTdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkh0bWxDb3JlQ29tcG9uZW50c1ZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WaW9sYXRpb25TZXZlcml0eVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5GYWNlc01lc3NhZ2VQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5QaGFzZUlkUmVjb3JkaW5nUGhhc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIKLSAgICAgICAgLkJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIKLSAgICAgICAgLkRlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db25maWd1cmVkVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXIKLSAgICAgICAgLkRlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyCi0gICAgICAgIC5DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcgotICAgICAgICAuQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXIKLSAgICAgICAgLkN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyCi0gICAgICAgIC5EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcgotICAgICAgICAuRGVmYXVsdE1vZHVsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXIKLSAgICAgICAgLlNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLkRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuRXh0VmFsUmVuZGVyZXJQcm94eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIEV4dFZhbFN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTI1MDQ4MjY0MjEwODY1NzIwMTJMOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpCi0gICAgewotICAgICAgICBpZihsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihFeHRWYWxJbmZvcm1hdGlvbi5WRVJTSU9OICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oInN0YXJ0aW5nIHVwIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgdiIgKyBFeHRWYWxJbmZvcm1hdGlvbi5WRVJTSU9OKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnRpbmcgdXAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZW5kZXJlckludGVyY2VwdG9yKG5ldyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IoKSk7Ci0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkKLSAgICAgICAgICAgICAgICAuYWRkR2xvYmFsUHJvcGVydHkoRXh0VmFsUmVuZGVyZXJQcm94eS5LRVksIEV4dFZhbFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpLCBmYWxzZSk7Ci0KLSAgICAgICAgaW5pdE5hbWVNYXBwZXJzKCk7Ci0gICAgICAgIGluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIGluaXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7Ci0gICAgICAgIGluaXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgaW5pdFBoYXNlTGlzdGVuZXJzKCk7Ci0gICAgICAgIGluaXRWaW9sYXRpb25TZXZlcml0eUtleSgpOwotICAgICAgICBpbml0RGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uS2V5KCk7Ci0gICAgICAgIGluaXRSZXF1aXJlZEluaXRpYWxpemF0aW9uKCk7Ci0gICAgICAgIGV4ZWN1dGVDdXN0b21TdGFydHVwTGlzdGVuZXIoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdE5hbWVNYXBwZXJzKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBkZWFjdGl2YXRlRGVmYXVsdE5hbWVNYXBwZXJzID0gV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfREVGQVVMVF9OQU1FX01BUFBFUlM7Ci0gICAgICAgIGlmICgoZGVhY3RpdmF0ZURlZmF1bHROYW1lTWFwcGVycyAhPSBudWxsICYmIGRlYWN0aXZhdGVEZWZhdWx0TmFtZU1hcHBlcnMuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9yZWdpc3RlciBtZXRhZGF0YSB0byB2YWxpZGF0aW9uIHN0cmF0ZWd5IG5hbWUgbWFwcGVyCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSk7Ci0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ3VzdG9tQ29uZmlndXJlZEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoKSkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDdXN0b21Db252ZW50aW9uQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigpKSk7Ci0KLSAgICAgICAgLy9yZWdpc3RlciB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1lc3NhZ2UgcmVzb2x2ZXIgbmFtZSBtYXBwZXIKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcigpKTsKLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkpOwotCi0gICAgICAgIC8vcmVnaXN0ZXIgdmFsaWRhdGlvbiBzdHJhdGVneSB0byBtZXRhZGF0YSB0cmFuc2Zvcm1lciBuYW1lIG1hcHBlcgotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IEN1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKCkpOwotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoCi0gICAgICAgICAgICAgICAgbmV3IFNpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgICAgIEV4dFZhbFV0aWxzLnJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcigKLSAgICAgICAgICAgICAgICBuZXcgQmVhblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVDdXN0b21TdGFydHVwTGlzdGVuZXIoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIGN1c3RvbVN0YXJ0dXBMaXN0ZW5lck5hbWUgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlNUQVJUVVBfTElTVEVORVIpOwotICAgICAgICBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lciBjdXN0b21TdGFydHVwTGlzdGVuZXIgPQotICAgICAgICAgICAgKEFic3RyYWN0U3RhcnR1cExpc3RlbmVyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShjdXN0b21TdGFydHVwTGlzdGVuZXJOYW1lKTsKLQotICAgICAgICBpZihjdXN0b21TdGFydHVwTGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygic3RhcnQgaW5pdCBvZiAiICsgY3VzdG9tU3RhcnR1cExpc3RlbmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3VzdG9tU3RhcnR1cExpc3RlbmVyLmluaXQoKTsKLQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiaW5pdCBvZiAiICsgY3VzdG9tU3RhcnR1cExpc3RlbmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcigKLSAgICAgICAgICAgICAgICBuZXcgSHRtbENvcmVDb21wb25lbnRzVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkpOwotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoCi0gICAgICAgICAgICAgICAgbmV3IFZpb2xhdGlvblNldmVyaXR5VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpCi0gICAgewotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5zZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKG5ldyBEZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKQotICAgIHsKLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IEZhY2VzTWVzc2FnZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0UGhhc2VMaXN0ZW5lcnMoKQotICAgIHsKLSAgICAgICAgSnNmVXRpbHMucmVnaXN0ZXJQaGFzZUxpc3RlbmVyKG5ldyBQaGFzZUlkUmVjb3JkaW5nUGhhc2VMaXN0ZW5lcigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFZpb2xhdGlvblNldmVyaXR5S2V5KCkKLSAgICB7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KFZpb2xhdGlvblNldmVyaXR5LmNsYXNzLmdldE5hbWUoKSwgVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3MsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbktleSgpCi0gICAgewotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFJlcXVpcmVkSW5pdGlhbGl6YXRpb24oKQotICAgIHsKLSAgICAgICAgaWYoV2ViWG1sUGFyYW1ldGVyLkFDVElWQVRFX1JFUVVJUkVEX0lOSVRJQUxJWkFUSU9OICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gcmVxdWlyZWRJbml0aWFsaXphdGlvbiA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFBhcmFtZXRlci5BQ1RJVkFURV9SRVFVSVJFRF9JTklUSUFMSVpBVElPTik7Ci0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KCJtb2RlOmluaXQ6cmVxdWlyZWQiLCByZXF1aXJlZEluaXRpYWxpemF0aW9uLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgIGlmKHJlcXVpcmVkSW5pdGlhbGl6YXRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGVhY3RpdmF0ZVJlcXVpcmVkQXR0cmlidXRlU3VwcG9ydCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaWYgaXQncyBjb25maWd1cmVkIHRoYXQgcmVxdWlyZWQgaW5pdCBzaG91bGQgaGFwcGVuLAotICAgICAqIGl0J3MgcmVxdWlyZWQgdG8gZGVhY3RpdmF0ZSB0aGUgc3VwcG9ydCBmb3IgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkZWFjdGl2YXRlUmVxdWlyZWRBdHRyaWJ1dGVTdXBwb3J0KCkKLSAgICB7Ci0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZEdsb2JhbFByb3BlcnR5KCJtb2RlOnJlc2V0OnJlcXVpcmVkIiwgQm9vbGVhbi5UUlVFLCBmYWxzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0QXBwbGljYXRpb25TY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdEFwcGxpY2F0aW9uU2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMzhiZGYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0QXBwbGljYXRpb25TY29wZUF3YXJlU3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuUkVVU0U7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBnZW5lcmljIHN0b3JhZ2UgbWFuYWdlciBpbXBsZW1lbnRhdGlvbiB3aGljaCBzdG9yZXMgdGhlIHN0b3JhZ2UgaW1wbGVtZW50YXRpb25zIGluIHRoZSBhcHBsaWNhdGlvbiBzY29wZQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QXBwbGljYXRpb25TY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8VD4gZXh0ZW5kcyBBYnN0cmFjdFN0b3JhZ2VNYW5hZ2VyPFQ+DQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgVD4gcmVzb2x2ZVN0b3JhZ2VNYXAoKQ0KLSAgICB7DQotICAgICAgICBNYXAgYXBwbGljYXRpb25NYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25NYXAoKTsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFQ+IHN0b3JhZ2VNYXA7DQotDQotICAgICAgICBpZighYXBwbGljYXRpb25NYXAuY29udGFpbnNLZXkoZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RvcmFnZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgVD4oKTsNCi0gICAgICAgICAgICBhcHBsaWNhdGlvbk1hcC5wdXQoZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKSwgc3RvcmFnZU1hcCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKE1hcDxTdHJpbmcsIFQ+KWFwcGxpY2F0aW9uTWFwLmdldChnZXRTdG9yYWdlTWFuYWdlcktleSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNjYxNGUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5SRVVTRTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIGdlbmVyaWMgc3RvcmFnZSBtYW5hZ2VyIGltcGxlbWVudGF0aW9uIHdoaWNoIHN0b3JlcyB0aGUgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbnMgaW4gdGhlIHJlcXVlc3Qgc2NvcGUNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFJFVVNFKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8VD4gZXh0ZW5kcyBBYnN0cmFjdFN0b3JhZ2VNYW5hZ2VyPFQ+DQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgVD4gcmVzb2x2ZVN0b3JhZ2VNYXAoKQ0KLSAgICB7DQotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7DQotICAgICAgICBNYXA8U3RyaW5nLCBUPiBzdG9yYWdlTWFwOw0KLQ0KLSAgICAgICAgaWYoIXJlcXVlc3RNYXAuY29udGFpbnNLZXkoZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RvcmFnZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgVD4oKTsNCi0gICAgICAgICAgICByZXF1ZXN0TWFwLnB1dChnZXRTdG9yYWdlTWFuYWdlcktleSgpLCBzdG9yYWdlTWFwKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoTWFwPFN0cmluZywgVD4pcmVxdWVzdE1hcC5nZXQoZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0U3RvcmFnZU1hbmFnZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9BYnN0cmFjdFN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OThiOTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0Fic3RyYWN0U3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuUkVVU0U7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogZ2VuZXJpYyBzdG9yYWdlIG1hbmFnZXIgaW1wbGVtZW50YXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFJFVVNFKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0b3JhZ2VNYW5hZ2VyPFQ+IGV4dGVuZHMgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFN0cmluZz4NCi0gICAgICAgIGltcGxlbWVudHMgU3RvcmFnZU1hbmFnZXI8VD4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+KCk7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdFN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVCBjcmVhdGUoU3RyaW5nIHN0b3JhZ2VOYW1lKQ0KLSAgICB7DQotICAgICAgICBUIHN0b3JhZ2VNYW5hZ2VyOw0KLSAgICAgICAgU3RyaW5nIHN0b3JhZ2VDbGFzc05hbWU7DQotICAgICAgICAvL251bGwgLT4gdXNlIG5hbWUgbWFwcGVycw0KLSAgICAgICAgZm9yIChOYW1lTWFwcGVyPFN0cmluZz4gbmFtZU1hcHBlciA6IHRoaXMubmFtZU1hcHBlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RvcmFnZUNsYXNzTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZShzdG9yYWdlTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKHN0b3JhZ2VDbGFzc05hbWUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBzdG9yYWdlTWFuYWdlciA9IHJlc29sdmVTdG9yYWdlKHN0b3JhZ2VOYW1lLCBzdG9yYWdlQ2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAoc3RvcmFnZU1hbmFnZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBzdG9yYWdlTWFuYWdlcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgVCByZXNvbHZlU3RvcmFnZShTdHJpbmcgc3RvcmFnZUtleSwgU3RyaW5nIHN0b3JhZ2VDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFQ+IHN0b3JhZ2VNYXAgPSByZXNvbHZlU3RvcmFnZU1hcCgpOw0KLQ0KLSAgICAgICAgaWYoIXN0b3JhZ2VNYXAuY29udGFpbnNLZXkoc3RvcmFnZUtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgc3RvcmFnZU1hcC5wdXQoc3RvcmFnZUtleSwgKFQpQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKHN0b3JhZ2VDbGFzc05hbWUpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzdG9yYWdlTWFwLmdldChzdG9yYWdlS2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTWFwPFN0cmluZywgVD4gcmVzb2x2ZVN0b3JhZ2VNYXAoKTsNCi0NCi0gICAgcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIHN0b3JhZ2VLZXkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFQ+IHN0b3JhZ2VNYXAgPSByZXNvbHZlU3RvcmFnZU1hcCgpOw0KLQ0KLSAgICAgICAgaWYoc3RvcmFnZU1hcCAhPSBudWxsICYmIHN0b3JhZ2VNYXAuY29udGFpbnNLZXkoc3RvcmFnZUtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQ2xhc3Mgc3RvcmFnZUNsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhzdG9yYWdlTWFwLmdldChzdG9yYWdlS2V5KS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICBzdG9yYWdlTWFwLnB1dChzdG9yYWdlS2V5LCAoVClDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzcyhzdG9yYWdlQ2xhc3MpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTGlzdDxOYW1lTWFwcGVyPFN0cmluZz4+IGdldE5hbWVNYXBwZXJMaXN0KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZU1hcHBlckxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YWYwMzEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZSBpbXBsZW1lbnRzIEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlDQotew0KLSAgICBwcml2YXRlIFBoYXNlSWQgY3VycmVudFBoYXNlSWQ7DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRQaGFzZUlkKFBoYXNlSWQgcGhhc2VJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jdXJyZW50UGhhc2VJZCA9IHBoYXNlSWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBoYXNlSWQgZ2V0Q3VycmVudFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50UGhhc2VJZDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExM2JkZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXIuRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBqc2YgaW5mb3JtYXRpb24gbm90IGF2YWlsYWJsZSB2aWEganNmLWFwaQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyIGV4dGVuZHMNCi0gICAgICAgIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxGYWNlc0luZm9ybWF0aW9uU3RvcmFnZT4NCi17DQotICAgIERlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIoKQ0KLSAgICB7DQotICAgICAgICByZWdpc3RlcihuZXcgRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX0ZBQ0VTX0lORk9STUFUSU9OX1NUT1JBR0U6S0VZIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ2YjdjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLkZhY2VzTWVzc2FnZUhvbGRlcjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTE9XLCBkZXNjcmlwdGlvbiA9ICJvcHRpb25hbCBwYXJhbWV0ZXIgdG8gZGVhY3RpdmF0ZSBzb3J0aW5nIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZSBpbXBsZW1lbnRzIEZhY2VzTWVzc2FnZVN0b3JhZ2UNCi17DQotICAgIE1hcDxTdHJpbmcsIFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFZhbGlkYXRpb25SZXN1bHQ+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEZhY2VzTWVzc2FnZShTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIGlmKGNsaWVudElkID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2xpZW50SWQgPSAiKiI7DQotICAgICAgICB9DQotDQotICAgICAgICBpZighdGhpcy5yZXN1bHRzLmNvbnRhaW5zS2V5KGNsaWVudElkKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnJlc3VsdHMucHV0KGNsaWVudElkLCBuZXcgVmFsaWRhdGlvblJlc3VsdCgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRoaXMucmVzdWx0cy5nZXQoY2xpZW50SWQpLmFkZEZhY2VzTWVzc2FnZUhvbGRlcihuZXcgRmFjZXNNZXNzYWdlSG9sZGVyKGZhY2VzTWVzc2FnZSwgY2xpZW50SWQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZXMoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+KCk7DQotDQotICAgICAgICBmb3IoVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0aW9uUmVzdWx0IDogdGhpcy5yZXN1bHRzLnZhbHVlcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodmFsaWRhdGlvblJlc3VsdC5nZXRGYWNlc01lc3NhZ2VIb2xkZXJMaXN0KCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRBbGwoKQ0KLSAgICB7DQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3Q7DQotDQotICAgICAgICBmb3IoVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0aW9uUmVzdWx0IDogdGhpcy5yZXN1bHRzLnZhbHVlcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZhY2VzTWVzc2FnZUhvbGRlckxpc3QgPSB2YWxpZGF0aW9uUmVzdWx0LmdldEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoKTsNCi0gICAgICAgICAgICBzb3J0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdChmYWNlc01lc3NhZ2VIb2xkZXJMaXN0KTsNCi0NCi0gICAgICAgICAgICBmb3IoRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlciA6IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQuYWRkTWVzc2FnZShmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0Q2xpZW50SWQoKSwgZmFjZXNNZXNzYWdlSG9sZGVyLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNvcnRGYWNlc01lc3NhZ2VIb2xkZXJMaXN0KExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0KQ0KLSAgICB7DQotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGZhY2VzTWVzc2FnZUhvbGRlckxpc3QsIGdldEZhY2VzTWVzc2FnZUNvbXBhcmF0b3IoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIENvbXBhcmF0b3I8RmFjZXNNZXNzYWdlSG9sZGVyPiBnZXRGYWNlc01lc3NhZ2VDb21wYXJhdG9yKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBDb21wYXJhdG9yPEZhY2VzTWVzc2FnZUhvbGRlcj4oKSB7DQotICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKEZhY2VzTWVzc2FnZUhvbGRlciBob2xkZXIxLCBGYWNlc01lc3NhZ2VIb2xkZXIgaG9sZGVyMikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGhvbGRlcjEuZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKSA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZihpc1NhbWVTZXZlcml0eShob2xkZXIxLCBob2xkZXIyKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVNZXNzYWdlVGV4dChob2xkZXIxLmdldEZhY2VzTWVzc2FnZSgpLCBob2xkZXIyLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZihob2xkZXIxLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkuZ2V0T3JkaW5hbCgpID4NCi0gICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIyLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkuZ2V0T3JkaW5hbCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcml2YXRlIGludCBjb21wYXJlTWVzc2FnZVRleHQoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZTEsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UyKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRleHQxID0gZmFjZXNNZXNzYWdlMS5nZXREZXRhaWwoKTsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRleHQyID0gZmFjZXNNZXNzYWdlMi5nZXREZXRhaWwoKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYodGV4dDEgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdGV4dDEgPSBmYWNlc01lc3NhZ2UxLmdldFN1bW1hcnkoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZih0ZXh0MiA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0ZXh0MiA9IGZhY2VzTWVzc2FnZTIuZ2V0U3VtbWFyeSgpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmKHRleHQxID09IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmKHRleHQyID09IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDEuY29tcGFyZVRvSWdub3JlQ2FzZSh0ZXh0Mik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTYW1lU2V2ZXJpdHkoRmFjZXNNZXNzYWdlSG9sZGVyIGhvbGRlcjEsIEZhY2VzTWVzc2FnZUhvbGRlciBob2xkZXIyKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gaG9sZGVyMS5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpLmVxdWFscyhob2xkZXIyLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU1hbmFnZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEyMzI2Zi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlci5EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU5hbWVNYXBwZXI7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIGZhY2VzIG1lc3NhZ2VzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8RmFjZXNNZXNzYWdlU3RvcmFnZT4NCi17DQotICAgIERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBEZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBTdG9yYWdlTWFuYWdlci5jbGFzcy5nZXROYW1lKCkgKyAiX0ZPUl9GQUNFU19NRVNTQUdFUzpLRVkiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0R3JvdXBTdG9yYWdlLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEdyb3VwU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmI0ZDYxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0R3JvdXBTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuR3JvdXBVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlIGltcGxlbWVudGF0aW9uIGZvciBncm91cHMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0R3JvdXBTdG9yYWdlIGltcGxlbWVudHMgR3JvdXBTdG9yYWdlDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8Q2xhc3M+PiBhZGRlZEdyb3VwcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+KCk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IHJlc3RyaWN0ZWRHcm91cHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8Q2xhc3M+PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRHcm91cChDbGFzcyBncm91cENsYXNzLCBTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIGFkZEdyb3VwVG9Hcm91cFN0b3JhZ2UoZ3JvdXBDbGFzcywgdmlld0lkLCBjbGllbnRJZCwgdGhpcy5hZGRlZEdyb3Vwcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVzdHJpY3RHcm91cChDbGFzcyBncm91cENsYXNzLCBTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIGFkZEdyb3VwVG9Hcm91cFN0b3JhZ2UoZ3JvdXBDbGFzcywgdmlld0lkLCBjbGllbnRJZCwgdGhpcy5yZXN0cmljdGVkR3JvdXBzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3NbXSBnZXRHcm91cHMoU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLmFkZGVkR3JvdXBzLnNpemUoKSA8IDEpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2FkZCBmb3VuZCBncm91cHMNCi0gICAgICAgIFN0cmluZyBrZXkgPSBHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgbnVsbCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN1bHRMaXN0Rm9yUGFnZSA9IGJ1aWxkR3JvdXBMaXN0KGtleSwgdGhpcy5hZGRlZEdyb3Vwcyk7DQotDQotICAgICAgICBrZXkgPSBHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgY2xpZW50SWQpOw0KLSAgICAgICAgTGlzdDxDbGFzcz4gcmVzdWx0TGlzdEZvckNvbXBvbmVudCA9IGJ1aWxkR3JvdXBMaXN0KGtleSwgdGhpcy5hZGRlZEdyb3Vwcyk7DQotDQotICAgICAgICAvL3JlbW92ZSByZXN0cmljdGVkIGdyb3Vwcw0KLSAgICAgICAgQ2xhc3NbXSByZXN1bHRzRm9yUGFnZSA9DQotICAgICAgICAgICAgICAgIGZpbHRlckdyb3VwTGlzdChHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgbnVsbCksIHJlc3VsdExpc3RGb3JQYWdlKTsNCi0gICAgICAgIENsYXNzW10gcmVzdWx0c0ZvckNvbXBvbmVudCA9DQotICAgICAgICAgICAgICAgIGZpbHRlckdyb3VwTGlzdChHcm91cFV0aWxzLmdldEdyb3VwS2V5KHZpZXdJZCwgY2xpZW50SWQpLCByZXN1bHRMaXN0Rm9yQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmKHJlc3VsdHNGb3JQYWdlLmxlbmd0aCA9PSAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHJlc3VsdHNGb3JDb21wb25lbnQubGVuZ3RoID09IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1Zygibm8gZ3JvdXBzIGZvciBncm91cC12YWxpZGF0aW9uIGF2YWlsYWJsZS4iICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heWJlIHlvdSByZXN0cmljdGVkIGFsbCBncm91cHMgb3IgeW91IGFyZW4ndCB1c2luZyBncm91cHMuIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWFuIHZhbGlkYXRpb24gd2lsbCB1c2UgdGhlIGRlZmF1bHQgZ3JvdXAgZm9yIHZhbGlkYXRpb24iKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0c0ZvckNvbXBvbmVudDsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYocmVzdWx0c0ZvckNvbXBvbmVudC5sZW5ndGggPT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0c0ZvclBhZ2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbWVyZ2VSZXN1bHRzKHJlc3VsdHNGb3JQYWdlLCByZXN1bHRzRm9yQ29tcG9uZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkR3JvdXBUb0dyb3VwU3RvcmFnZShDbGFzcyBncm91cENsYXNzLCBTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8Q2xhc3M+PiBncm91cFN0b3JhZ2UpDQotICAgIHsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IGdyb3VwTGlzdCA9IGdyb3VwU3RvcmFnZS5nZXQoR3JvdXBVdGlscy5nZXRHcm91cEtleSh2aWV3SWQsIGNsaWVudElkKSk7DQotDQotICAgICAgICBpZihncm91cExpc3QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBncm91cExpc3QgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLSAgICAgICAgICAgIGdyb3VwU3RvcmFnZS5wdXQoR3JvdXBVdGlscy5nZXRHcm91cEtleSh2aWV3SWQsIGNsaWVudElkKSwgZ3JvdXBMaXN0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKCFncm91cExpc3QuY29udGFpbnMoZ3JvdXBDbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgZ3JvdXBMaXN0LmFkZChncm91cENsYXNzKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8Q2xhc3M+IGJ1aWxkR3JvdXBMaXN0KFN0cmluZyBrZXksIE1hcDxTdHJpbmcsIExpc3Q8Q2xhc3M+PiBncm91cFN0b3JhZ2UpDQotICAgIHsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IGxpc3QgPSBncm91cFN0b3JhZ2UuZ2V0KGtleSk7DQotICAgICAgICByZXR1cm4gKGxpc3QgIT0gbnVsbCkgPyBsaXN0IDogbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENsYXNzW10gZmlsdGVyR3JvdXBMaXN0KFN0cmluZyBrZXksIExpc3Q8Q2xhc3M+IGFkZGVkR3JvdXBzKQ0KLSAgICB7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzID0gYnVpbGRHcm91cExpc3Qoa2V5LCB0aGlzLnJlc3RyaWN0ZWRHcm91cHMpOw0KLSAgICAgICAgTGlzdDxDbGFzcz4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgICAgICBmb3IoQ2xhc3MgY3VycmVudEdyb3VwIDogYWRkZWRHcm91cHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoIXJlc3RyaWN0ZWRHcm91cHMuY29udGFpbnMoY3VycmVudEdyb3VwKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKGN1cnJlbnRHcm91cCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHMudG9BcnJheShuZXcgQ2xhc3NbcmVzdWx0cy5zaXplKCldKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENsYXNzW10gbWVyZ2VSZXN1bHRzKENsYXNzW10gcmVzdWx0c0ZvclBhZ2UsIENsYXNzW10gcmVzdWx0c0ZvckNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgQ2xhc3NbXSBtZXJnZWRSZXN1bHQgPSBuZXcgQ2xhc3NbcmVzdWx0c0ZvclBhZ2UubGVuZ3RoICsgcmVzdWx0c0ZvckNvbXBvbmVudC5sZW5ndGhdOw0KLQ0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZXN1bHRzRm9yUGFnZSwgMCwgbWVyZ2VkUmVzdWx0LCAwLCByZXN1bHRzRm9yUGFnZS5sZW5ndGgpOw0KLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZXN1bHRzRm9yQ29tcG9uZW50LCAwLCBtZXJnZWRSZXN1bHQsIHJlc3VsdHNGb3JQYWdlLmxlbmd0aCwgcmVzdWx0c0ZvckNvbXBvbmVudC5sZW5ndGgpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG1lcmdlZFJlc3VsdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdEdyb3VwU3RvcmFnZU1hbmFnZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0R3JvdXBTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTZiNWJjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0R3JvdXBTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgZ3JvdXBzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0R3JvdXBTdG9yYWdlTWFuYWdlciBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxHcm91cFN0b3JhZ2U+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX0dST1VQUzpLRVkiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWV0YURhdGFTdG9yYWdlLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdE1ldGFEYXRhU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmQ3YjU4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWV0YURhdGFTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWV0YURhdGFTdG9yYWdlIGltcGxlbWVudHMgTWV0YURhdGFTdG9yYWdlDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFByb3BlcnR5SW5mb3JtYXRpb24+PiBjYWNoZWRQcm9wZXJ0eUluZm9ybWF0aW9uID0NCi0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFByb3BlcnR5SW5mb3JtYXRpb24+PigpOw0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TWV0YURhdGFTdG9yYWdlRmlsdGVyPiBtZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+KCk7DQotICAgIHByaXZhdGUgTGlzdDxDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPj4gZGVuaWVkTWV0YURhdGFGaWx0ZXJzID0NCi0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+PigpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdE1ldGFEYXRhU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIGluaXRGaWx0ZXJzKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRGaWx0ZXJzKCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGFEYXRhU3RvcmFnZUZpbHRlckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIG1ldGFEYXRhU3RvcmFnZUZpbHRlckNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKFdlYlhtbFBhcmFtZXRlci5DVVNUT01fTUVUQV9EQVRBX1NUT1JBR0VfRklMVEVSKTsNCi0gICAgICAgIG1ldGFEYXRhU3RvcmFnZUZpbHRlckNsYXNzTmFtZXMNCi0gICAgICAgICAgICAuYWRkKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KA0KLSAgICAgICAgICAgICAgICAgICAgQ3VzdG9tSW5mb3JtYXRpb24uTUVUQV9EQVRBX1NUT1JBR0VfRklMVEVSKSk7DQotDQotICAgICAgICBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgbWV0YURhdGFTdG9yYWdlRmlsdGVyOw0KLSAgICAgICAgZm9yIChTdHJpbmcgdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSA6IG1ldGFEYXRhU3RvcmFnZUZpbHRlckNsYXNzTmFtZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGFTdG9yYWdlRmlsdGVyID0NCi0gICAgICAgICAgICAgICAgKE1ldGFEYXRhU3RvcmFnZUZpbHRlcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yTmFtZSk7DQotDQotICAgICAgICAgICAgaWYgKG1ldGFEYXRhU3RvcmFnZUZpbHRlciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5tZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzLmFkZChtZXRhRGF0YVN0b3JhZ2VGaWx0ZXIpOw0KLQ0KLSAgICAgICAgICAgICAgICBsb2dBZGRlZEZpbHRlcihtZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHN0b3JlTWV0YURhdGFPZihQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGludm9rZUZpbHRlcnMocHJvcGVydHlJbmZvcm1hdGlvbik7DQotDQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb25Ub1N0b3JlID0gbmV3IERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKCk7DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gcHJvcGVydHlJbmZvcm1hdGlvbg0KLSAgICAgICAgICAgICAgICAuZ2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIGNvcHlNZXRhRGF0YShwcm9wZXJ0eUluZm9ybWF0aW9uLCBwcm9wZXJ0eUluZm9ybWF0aW9uVG9TdG9yZSk7DQotDQotICAgICAgICBnZXRNYXBGb3JDbGFzcyhQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKSkpDQotICAgICAgICAgICAgICAgIC5wdXQocHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb25Ub1N0b3JlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW52b2tlRmlsdGVycyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGZvcihNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgZmlsdGVyIDogdGhpcy5tZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZpbHRlci5maWx0ZXIocHJvcGVydHlJbmZvcm1hdGlvbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1ldGFEYXRhRW50cnlbXSBnZXRNZXRhRGF0YShDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBnZXRNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykuZ2V0KHRhcmdldFByb3BlcnR5KTsNCi0NCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gY2xvbmVkUHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOw0KLSAgICAgICAgY29weU1ldGFEYXRhKHByb3BlcnR5SW5mb3JtYXRpb24sIGNsb25lZFByb3BlcnR5SW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgcmV0dXJuIGNsb25lZFByb3BlcnR5SW5mb3JtYXRpb24uZ2V0TWV0YURhdGFFbnRyaWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNNZXRhRGF0YUZvcihDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0TWFwRm9yQ2xhc3ModGFyZ2V0Q2xhc3MpLmNvbnRhaW5zS2V5KHRhcmdldFByb3BlcnR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZpbHRlcihNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgc3RvcmFnZUZpbHRlcikNCi0gICAgew0KLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKCFpc0ZpbHRlckRlbmllZChzdG9yYWdlRmlsdGVyKSAmJiAhaXNGaWx0ZXJBbHJlYWR5UmVnaXN0ZXJlZChzdG9yYWdlRmlsdGVyKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubWV0YURhdGFTdG9yYWdlRmlsdGVycy5hZGQoc3RvcmFnZUZpbHRlcik7DQotICAgICAgICAgICAgICAgIGxvZ0FkZGVkRmlsdGVyKHN0b3JhZ2VGaWx0ZXIuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0ZpbHRlckRlbmllZChNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgc3RvcmFnZUZpbHRlcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGVuaWVkTWV0YURhdGFGaWx0ZXJzLmNvbnRhaW5zKGdldFN0b3JhZ2VGaWx0ZXJDbGFzcyhzdG9yYWdlRmlsdGVyKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRmlsdGVyQWxyZWFkeVJlZ2lzdGVyZWQoTWV0YURhdGFTdG9yYWdlRmlsdGVyIHN0b3JhZ2VGaWx0ZXIpDQotICAgIHsNCi0gICAgICAgIGZvcihNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgZmlsdGVyIDogdGhpcy5tZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGZpbHRlci5nZXRDbGFzcygpLmVxdWFscyhnZXRTdG9yYWdlRmlsdGVyQ2xhc3Moc3RvcmFnZUZpbHRlcikpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGRlcmVnaXN0ZXJGaWx0ZXIoQ2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gZmlsdGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhU3RvcmFnZUZpbHRlciBzdG9yYWdlRmlsdGVyID0gQ2xhc3NVdGlscy50cnlUb0luc3RhbnRpYXRlQ2xhc3MoZmlsdGVyQ2xhc3MpOw0KLQ0KLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubWV0YURhdGFTdG9yYWdlRmlsdGVycy5yZW1vdmUoc3RvcmFnZUZpbHRlcik7DQotICAgICAgICB9DQotDQotICAgICAgICBsb2dSZW1vdmVkRmlsdGVyKHN0b3JhZ2VGaWx0ZXIuZ2V0Q2xhc3MoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZGVueUZpbHRlcihDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPiBmaWx0ZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvcihDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPiBmaWx0ZXJJZCA6IHRoaXMuZGVuaWVkTWV0YURhdGFGaWx0ZXJzKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoZmlsdGVySWQuZXF1YWxzKGZpbHRlckNsYXNzKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHRoaXMuZGVuaWVkTWV0YURhdGFGaWx0ZXJzLmFkZChmaWx0ZXJDbGFzcyk7DQotICAgICAgICB9DQotDQotICAgICAgICBkZXJlZ2lzdGVyRmlsdGVyKGZpbHRlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9EbyhQcmlvcml0eS5NRURJVU0pDQotICAgIHByaXZhdGUgdm9pZCBjb3B5TWV0YURhdGEoUHJvcGVydHlJbmZvcm1hdGlvbiBzb3VyY2UsIFByb3BlcnR5SW5mb3JtYXRpb24gdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUVudHJ5IG5ld01ldGFEYXRhRW50cnk7DQotICAgICAgICBmb3IoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5IDogc291cmNlLmdldE1ldGFEYXRhRW50cmllcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5ld01ldGFEYXRhRW50cnkgPSBuZXcgTWV0YURhdGFFbnRyeSgpOw0KLSAgICAgICAgICAgIG5ld01ldGFEYXRhRW50cnkuc2V0S2V5KG1ldGFEYXRhRW50cnkuZ2V0S2V5KCkpOw0KLSAgICAgICAgICAgIG5ld01ldGFEYXRhRW50cnkuc2V0VmFsdWUobWV0YURhdGFFbnRyeS5nZXRWYWx1ZSgpKTsNCi0NCi0gICAgICAgICAgICB0YXJnZXQuYWRkTWV0YURhdGFFbnRyeShuZXdNZXRhRGF0YUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgbG9nQWRkZWRGaWx0ZXIoQ2xhc3M8PyBleHRlbmRzIE1ldGFEYXRhU3RvcmFnZUZpbHRlcj4gZmlsdGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKGZpbHRlckNsYXNzLmdldE5hbWUoKSArICIgYWRkZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgbG9nUmVtb3ZlZEZpbHRlcihDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPiBmaWx0ZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oZmlsdGVyQ2xhc3MuZ2V0TmFtZSgpICsgIiByZW1vdmVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBQcm9wZXJ0eUluZm9ybWF0aW9uPiBnZXRNYXBGb3JDbGFzcyhDbGFzcyB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBrZXkgPSBQcm94eVV0aWxzLmdldENsYXNzTmFtZSh0YXJnZXQpOw0KLSAgICAgICAgaWYoIXRoaXMuY2FjaGVkUHJvcGVydHlJbmZvcm1hdGlvbi5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuY2FjaGVkUHJvcGVydHlJbmZvcm1hdGlvbi5wdXQoa2V5LCBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5SW5mb3JtYXRpb24+KCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkUHJvcGVydHlJbmZvcm1hdGlvbi5nZXQoa2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENsYXNzPD8gZXh0ZW5kcyBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXI+IGdldFN0b3JhZ2VGaWx0ZXJDbGFzcyhNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgc3RvcmFnZUZpbHRlcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3Moc3RvcmFnZUZpbHRlci5nZXRDbGFzcygpLCBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuY2xhc3MpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0TWV0YURhdGFTdG9yYWdlTWFuYWdlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYzY5YmUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlci5EZWZhdWx0TWV0YURhdGFTdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBwcm9wZXJ0eSBpbmZvcm1hdGlvbiBlbnRyaWVzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIERlZmF1bHRNZXRhRGF0YVN0b3JhZ2VNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RBcHBsaWNhdGlvblNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxNZXRhRGF0YVN0b3JhZ2U+DQotew0KLSAgICBEZWZhdWx0TWV0YURhdGFTdG9yYWdlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBEZWZhdWx0TWV0YURhdGFTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX01FVEFfREFUQV9DQUNIRTpLRVkiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UHJvcGVydHlTdG9yYWdlLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFByb3BlcnR5U3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTBhN2YwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UHJvcGVydHlTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvcGVydHlTdG9yYWdlIGltcGxlbWVudHMgUHJvcGVydHlTdG9yYWdlDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEZpZWxkPj4gZmllbGRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEZpZWxkPj4oKTsNCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBNZXRob2Q+PiBtZXRob2RNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIE1ldGhvZD4+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIHN0b3JlRmllbGQoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSwgRmllbGQgZmllbGQpDQotICAgIHsNCi0gICAgICAgIGdldEZpZWxkTWFwRm9yQ2xhc3ModGFyZ2V0Q2xhc3MpLnB1dChwcm9wZXJ0eSwgZmllbGQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHN0b3JlTWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHksIE1ldGhvZCBtZXRob2QpDQotICAgIHsNCi0gICAgICAgIGdldE1ldGhvZE1hcEZvckNsYXNzKHRhcmdldENsYXNzKS5wdXQocHJvcGVydHksICBtZXRob2QpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGaWVsZCBnZXRGaWVsZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RmllbGRNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykuZ2V0KHByb3BlcnR5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWV0aG9kIGdldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0TWV0aG9kTWFwRm9yQ2xhc3ModGFyZ2V0Q2xhc3MpLmdldChwcm9wZXJ0eSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNGaWVsZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0RmllbGRNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykuY29udGFpbnNLZXkocHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zTWV0aG9kKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRNZXRob2RNYXBGb3JDbGFzcyh0YXJnZXRDbGFzcykuY29udGFpbnNLZXkocHJvcGVydHkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgRmllbGQ+IGdldEZpZWxkTWFwRm9yQ2xhc3MoQ2xhc3MgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcga2V5ID0gUHJveHlVdGlscy5nZXRDbGFzc05hbWUodGFyZ2V0KTsNCi0gICAgICAgIGlmICghdGhpcy5maWVsZE1hcC5jb250YWluc0tleShrZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuZmllbGRNYXAucHV0KGtleSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBGaWVsZD4oKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdGhpcy5maWVsZE1hcC5nZXQoa2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1ldGhvZD4gZ2V0TWV0aG9kTWFwRm9yQ2xhc3MoQ2xhc3MgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcga2V5ID0gUHJveHlVdGlscy5nZXRDbGFzc05hbWUodGFyZ2V0KTsNCi0gICAgICAgIGlmICghdGhpcy5tZXRob2RNYXAuY29udGFpbnNLZXkoa2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLm1ldGhvZE1hcC5wdXQoa2V5LCBuZXcgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZD4oKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdGhpcy5tZXRob2RNYXAuZ2V0KGtleSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFByb3BlcnR5U3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzMDEwYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFByb3BlcnR5U3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBwcm9wZXJ0eSBpbmZvcm1hdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotY2xhc3MgRGVmYXVsdFByb3BlcnR5U3RvcmFnZU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdEFwcGxpY2F0aW9uU2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPFByb3BlcnR5U3RvcmFnZT4NCi17DQotICAgIERlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfUFJPUEVSVFk6S0VZIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTc5YzYyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UgaW1wbGVtZW50cyBSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMucHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmdldChrZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyA8VD4gVCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBDbGFzczxUPiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChUKXRoaXMucHJvcGVydGllcy5nZXQoa2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnByb3BlcnRpZXMucmVtb3ZlKGtleSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTWFuYWdlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjFiMTBhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlcjsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgcmVuZGVyZXIgaW50ZXJjZXB0b3IgcHJvcGVydGllcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotY2xhc3MgRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyDQotICAgICAgICBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFNjb3BlQXdhcmVTdG9yYWdlTWFuYWdlcjxSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlPg0KLXsNCi0gICAgRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFN0b3JhZ2VNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSArICJfRk9SX1JFTkRFUkVSX0lOVEVSQ0VQVE9SX1BST1BFUlRZOktFWSI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDI3ZWY4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbiBmb3IgZ3JvdXBzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlIGltcGxlbWVudHMgUmVuZGVyZXJQcm94eVN0b3JhZ2UNCi17DQotICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnk+PiBwcm94eVN0b3JhZ2UgPQ0KLSAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5Pj4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW50cnkoU3RyaW5nIHJlbmRlcmVyS2V5LCBTdHJpbmcgY2xpZW50SWQsIFJlbmRlcmVyUHJveHlTdG9yYWdlRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIGdldFJlbmRlcmVyU3RvcmFnZShyZW5kZXJlcktleSkucHV0KGNsaWVudElkLCBlbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNFbnRyeShTdHJpbmcgcmVuZGVyZXJLZXksIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFJlbmRlcmVyU3RvcmFnZShyZW5kZXJlcktleSkuY29udGFpbnNLZXkoY2xpZW50SWQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGdldEVudHJ5KFN0cmluZyByZW5kZXJlcktleSwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZXJTdG9yYWdlKHJlbmRlcmVyS2V5KS5nZXQoY2xpZW50SWQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeT4gZ2V0UmVuZGVyZXJTdG9yYWdlKFN0cmluZyByZW5kZXJlcktleSkNCi0gICAgew0KLSAgICAgICAgaWYoIXByb3h5U3RvcmFnZS5jb250YWluc0tleShyZW5kZXJlcktleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJveHlTdG9yYWdlLnB1dChyZW5kZXJlcktleSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5PigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBwcm94eVN0b3JhZ2UuZ2V0KHJlbmRlcmVyS2V5KTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTWFuYWdlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q4MTE5Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVuZGVya2l0LkV4dFZhbFJlbmRlcmVyUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyLkRlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UtbWFuYWdlciBmb3IgcmVuZGVyZXIgcHJveHkgZW50cmllcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VNYW5hZ2VyDQotICAgIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPFJlbmRlcmVyUHJveHlTdG9yYWdlPg0KLXsNCi0gICAgRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTWFuYWdlcigpDQotICAgIHsNCi0gICAgICAgIHJlZ2lzdGVyKG5ldyBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICAvL2ZvciBiZXR0ZXIgYmFja3dhcmQgY29tcGF0aWJpbGl0eQ0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFJlbmRlcmVyUHJveHkuY2xhc3MuZ2V0TmFtZSgpICsgIjpTVE9SQUdFIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRTdG9yYWdlTWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1NjZkZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3Igc3RvcmFnZS1tYW5hZ2VyIGNyZWF0aW9uIGFuZCBjYWNoaW5nDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFN0b3JhZ2VNYW5hZ2VyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxDbGFzcz4NCi0gICAgICAgIGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxDbGFzcywgU3RvcmFnZU1hbmFnZXI+LCBTdG9yYWdlTWFuYWdlckhvbGRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGxhenlTdGF0aWNNYXBwaW5nQXBwbGllZCA9IGZhbHNlOw0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxDbGFzcz4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPENsYXNzPj4oKTsNCi0gICAgcHJpdmF0ZSBNYXA8Q2xhc3MsIFN0b3JhZ2VNYW5hZ2VyPiBzdG9yYWdlVHlwZVRvU3RvcmFnZU1hbmFnZXJNYXAgPSBuZXcgSGFzaE1hcDxDbGFzcywgU3RvcmFnZU1hbmFnZXI+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0U3RvcmFnZU1hbmFnZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKFJlbmRlcmVyUHJveHlTdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTWFuYWdlcigpLCBmYWxzZSk7DQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihHcm91cFN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0R3JvdXBTdG9yYWdlTWFuYWdlcigpLCBmYWxzZSk7DQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihNZXRhRGF0YVN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0TWV0YURhdGFTdG9yYWdlTWFuYWdlcigpLCBmYWxzZSk7DQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihGYWNlc01lc3NhZ2VTdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKFByb3BlcnR5U3RvcmFnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU1hbmFnZXIoKSwgZmFsc2UpOw0KLSAgICAgICAgc2V0U3RvcmFnZU1hbmFnZXIoVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VNYW5hZ2VyKCksIGZhbHNlKTsNCi0NCi0gICAgICAgIHNldFN0b3JhZ2VNYW5hZ2VyKEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlcigpLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0b3JhZ2VNYW5hZ2VyIGNyZWF0ZShDbGFzcyBzdG9yYWdlVHlwZSkNCi0gICAgew0KLSAgICAgICAgaWYgKCF0aGlzLmxhenlTdGF0aWNNYXBwaW5nQXBwbGllZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljTWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0b3JhZ2VNYW5hZ2VyIHN0b3JhZ2VNYW5hZ2VyOw0KLSAgICAgICAgU3RyaW5nIHN0b3JhZ2VNYW5hZ2VyTmFtZTsNCi0gICAgICAgIC8vbnVsbCAtPiB1c2UgbmFtZSBtYXBwZXJzDQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8Q2xhc3M+IG5hbWVNYXBwZXIgOiB0aGlzLm5hbWVNYXBwZXJMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN0b3JhZ2VNYW5hZ2VyTmFtZSA9IG5hbWVNYXBwZXIuY3JlYXRlTmFtZShzdG9yYWdlVHlwZSk7DQotDQotICAgICAgICAgICAgaWYgKHN0b3JhZ2VNYW5hZ2VyTmFtZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHN0b3JhZ2VNYW5hZ2VyID0gKFN0b3JhZ2VNYW5hZ2VyKUNsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShzdG9yYWdlTWFuYWdlck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChzdG9yYWdlTWFuYWdlciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkTWFwcGluZyhzdG9yYWdlVHlwZSwgc3RvcmFnZU1hbmFnZXIpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmFnZU1hbmFnZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGdldFN0b3JhZ2VNYW5hZ2VyKHN0b3JhZ2VUeXBlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZE1hcHBpbmcoQ2xhc3Mgc3RvcmFnZVR5cGUsIFN0b3JhZ2VNYW5hZ2VyIHN0b3JhZ2VNYW5hZ2VyKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIGlzVmFsaWRFbnRyeSA9IHRydWU7DQotICAgICAgICBpZihzdG9yYWdlVHlwZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlzVmFsaWRFbnRyeSA9IGZhbHNlOw0KLSAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzRXJyb3JFbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigieW91IHRyaWVkIHRvIGFkZCBhbiBpbnZhbGlkIHN0b3JhZ2UgdHlwZSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHN0b3JhZ2VNYW5hZ2VyID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaXNWYWxpZEVudHJ5ID0gZmFsc2U7DQotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNFcnJvckVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCJ5b3UgdHJpZWQgdG8gYWRkIGFuIGludmFsaWQgc3RvcmFnZSBtYW5hZ2VyIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoIWlzVmFsaWRFbnRyeSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBzZXRTdG9yYWdlTWFuYWdlcihzdG9yYWdlVHlwZSwgc3RvcmFnZU1hbmFnZXIsIHRydWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0U3RhdGljTWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmxhenlTdGF0aWNNYXBwaW5nQXBwbGllZCA9IHRydWU7DQotDQotICAgICAgICAvL3NldHVwIGludGVybmFsIHN0YXRpYyBtYXBwaW5ncw0KLSAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgOg0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5TVE9SQUdFX1RZUEVfVE9fU1RPUkFHRV9NQU5BR0VSX0NPTkZJRykpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0dXBNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBNYXBwaW5ncyhMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsIFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhDbGFzc1V0aWxzLnRyeVRvTG9hZENsYXNzRm9yTmFtZShtYXBwaW5nLmdldFNvdXJjZSgpKSwNCi0gICAgICAgICAgICAgICAgICAgIChTdG9yYWdlTWFuYWdlcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUobWFwcGluZy5nZXRUYXJnZXQoKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBMaXN0PE5hbWVNYXBwZXI8Q2xhc3M+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm5hbWVNYXBwZXJMaXN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFN0b3JhZ2VNYW5hZ2VyKENsYXNzIHN0b3JhZ2VUeXBlLCBTdG9yYWdlTWFuYWdlciBzdG9yYWdlTWFuYWdlciwgYm9vbGVhbiBvdmVycmlkZSkNCi0gICAgew0KLSAgICAgICAgaWYoIXRoaXMuc3RvcmFnZVR5cGVUb1N0b3JhZ2VNYW5hZ2VyTWFwLmNvbnRhaW5zS2V5KHN0b3JhZ2VUeXBlKSB8fA0KLSAgICAgICAgICAgICAgICAodGhpcy5zdG9yYWdlVHlwZVRvU3RvcmFnZU1hbmFnZXJNYXAuY29udGFpbnNLZXkoc3RvcmFnZVR5cGUpICYmIG92ZXJyaWRlKSkNCi0gICAgICAgIHsNCi0NCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkaW5nIHR5cGUgdG8gc3RvcmFnZS1tYW5hZ2VyIG1hcHBpbmc6ICINCi0gICAgICAgICAgICAgICAgICAgICsgc3RvcmFnZVR5cGUuZ2V0TmFtZSgpICsgIiAtPiAiICsgc3RvcmFnZU1hbmFnZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB0aGlzLnN0b3JhZ2VUeXBlVG9TdG9yYWdlTWFuYWdlck1hcC5wdXQoc3RvcmFnZVR5cGUsIHN0b3JhZ2VNYW5hZ2VyKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RvcmFnZU1hbmFnZXIgZ2V0U3RvcmFnZU1hbmFnZXIoQ2xhc3MgdHlwZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZVR5cGVUb1N0b3JhZ2VNYW5hZ2VyTWFwLmdldCh0eXBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwN2JjM2QuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2UgaW1wbGVtZW50cyBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIHZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgPSB2aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy52aW9sYXRpb25TZXZlcml0eUludGVycHJldGVyOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDA4YjUzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlci5EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIGEgY3VzdG9tIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXINCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTWFuYWdlciBleHRlbmRzDQotICAgICAgICBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2U+DQotew0KLSAgICBEZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VNYW5hZ2VyKCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXIobmV3IERlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdG9yYWdlTWFuYWdlcktleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBTdG9yYWdlTWFuYWdlci5jbGFzcy5nZXROYW1lKCkgKyAiX0ZPUl9WSU9MQVRJT05TRVZFUklUWV9JTlRFUlBSRVRFUjpLRVkiOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9GYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MDE4MzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL0ZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7DQotDQotLyoqDQotICogc3RvcmFnZSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBmYWNlcyByZXF1ZXN0DQotICogZm9yIG5vdyBpdCBqdXN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHBoYXNlIG9mIHRoZSBsaWZlY3ljbGUNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBGYWNlc0luZm9ybWF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBzZXRDdXJyZW50UGhhc2VJZChQaGFzZUlkIHBoYXNlSWQpOw0KLQ0KLSAgICBQaGFzZUlkIGdldEN1cnJlbnRQaGFzZUlkKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9GYWNlc01lc3NhZ2VTdG9yYWdlLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvRmFjZXNNZXNzYWdlU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTUwZjRmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9GYWNlc01lc3NhZ2VTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5GYWNlc01lc3NhZ2VIb2xkZXI7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIEZhY2VzTWVzc2FnZVN0b3JhZ2UNCi17DQotICAgIHZvaWQgYWRkRmFjZXNNZXNzYWdlKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSk7DQotDQotICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBnZXRGYWNlc01lc3NhZ2VzKCk7DQotDQotICAgIHZvaWQgYWRkQWxsKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Hcm91cFN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Hcm91cFN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJjMDE0Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvR3JvdXBTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogc3VnZ2VzdGVkIGludGVyZmFjZSBmb3IgYSBncm91cCBzdG9yYWdlDQotICogdXNlZCBieSB0aGUgYnZpIG1vZHVsZSBhbmQgYWRkLW9ucw0KLSAqIDxwLz4NCi0gKiBpdCBhbGxvd3MgdG8gbWFuYWdlIGdyb3VwcyBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdA0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgR3JvdXBTdG9yYWdlDQotew0KLSAgICB2b2lkIGFkZEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCk7DQotDQotICAgIHZvaWQgcmVzdHJpY3RHcm91cChDbGFzcyBncm91cENsYXNzLCBTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQpOw0KLQ0KLSAgICBDbGFzc1tdIGdldEdyb3VwcyhTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWV0YURhdGFTdG9yYWdlLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWV0YURhdGFTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZWNlYmQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL01ldGFEYXRhU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTWV0YURhdGFTdG9yYWdlDQotew0KLSAgICB2b2lkIHN0b3JlTWV0YURhdGFPZihQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLQ0KLSAgICBNZXRhRGF0YUVudHJ5W10gZ2V0TWV0YURhdGEoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSk7DQotDQotICAgIGJvb2xlYW4gY29udGFpbnNNZXRhRGF0YUZvcihDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldFByb3BlcnR5KTsNCi0NCi0gICAgdm9pZCByZWdpc3RlckZpbHRlcihNZXRhRGF0YVN0b3JhZ2VGaWx0ZXIgc3RvcmFnZUZpbHRlcik7DQotDQotICAgIHZvaWQgZGVyZWdpc3RlckZpbHRlcihDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPiBmaWx0ZXJDbGFzcyk7DQotDQotICAgIHZvaWQgZGVueUZpbHRlcihDbGFzczw/IGV4dGVuZHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyPiBmaWx0ZXJDbGFzcyk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIyZmRiNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvTWV0YURhdGFTdG9yYWdlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBNZXRhRGF0YVN0b3JhZ2VGaWx0ZXINCi17DQotICAgIHZvaWQgZmlsdGVyKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Qcm9wZXJ0eVN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9Qcm9wZXJ0eVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTliZWQyNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUHJvcGVydHlTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5U3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBzdG9yZUZpZWxkKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHksIEZpZWxkIGZpZWxkKTsNCi0NCi0gICAgdm9pZCBzdG9yZU1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5LCBNZXRob2QgbWV0aG9kKTsNCi0NCi0gICAgRmllbGQgZ2V0RmllbGQoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSk7DQotDQotICAgIE1ldGhvZCBnZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcm9wZXJ0eSk7DQotDQotICAgIGJvb2xlYW4gY29udGFpbnNGaWVsZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5KTsNCi0NCi0gICAgYm9vbGVhbiBjb250YWluc01ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByb3BlcnR5KTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYzhjMWQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1JlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBhIHN0b3JhZ2Ugd2hpY2ggaXNuJ3QgdXNlZCBpbnRlcm5hbGx5LiBpdCdzIGZvciBhZGQtb25zIHRvIGVhc2lseSBzdG9yZSBwcm9wZXJ0aWVzIG9mIGludGVyY2VwdG9ycy4NCi0gKiB3aXRob3V0IGJyYWtpbmcgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgaXQncyBwb3NzaWJsZSB0byB1c2UgdGhlc2UgcHJvcGVydGllcyBpbiBjdXN0b20gYXJ0aWZhY3RzLg0KLSAqIHJlbmRlcmluZyBpbnRlcmNlcHRpb24gaXMgYW4gaW50ZXJuYWwgY29uY2VwdC4gc28gcHJvcGVydGllcywuLi4gb2YgaXQgd29uJ3QgZ2V0IGludG8gdGhlIGFwaS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGludGVyZmFjZSBSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlDQotew0KLSAgICB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSk7DQotDQotICAgIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KTsNCi0NCi0gICAgPFQ+IFQgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSwgQ2xhc3M8VD4gdGFyZ2V0Q2xhc3MpOw0KLQ0KLSAgICB2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBrZXkpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJQcm94eVN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzFhNzViLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlclByb3h5U3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFJlbmRlcmVyUHJveHlTdG9yYWdlDQotew0KLSAgICB2b2lkIHNldEVudHJ5KFN0cmluZyByZW5kZXJlcktleSwgU3RyaW5nIGNsaWVudElkLCBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5IGVudHJ5KTsNCi0NCi0gICAgYm9vbGVhbiBjb250YWluc0VudHJ5KFN0cmluZyByZW5kZXJlcktleSwgU3RyaW5nIGNsaWVudElkKTsNCi0NCi0gICAgUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeSBnZXRFbnRyeShTdHJpbmcgcmVuZGVyZXJLZXksIFN0cmluZyBjbGllbnRJZCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvUmVuZGVyZXJQcm94eVN0b3JhZ2VFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTM0Nzc4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9SZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBSZW5kZXJlclByb3h5U3RvcmFnZUVudHJ5Ci17Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRlY29kZUNhbGxlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVCZWdpbkNhbGxlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVDaGlsZHJlbkNhbGxlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVFbmRDYWxsZWQgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgT2JqZWN0IGNvbnZlcnRlZFZhbHVlID0gbnVsbDsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVjb2RlQ2FsbGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWNvZGVDYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVjb2RlQ2FsbGVkKGJvb2xlYW4gZGVjb2RlQ2FsbGVkKQotICAgIHsKLSAgICAgICAgdGhpcy5kZWNvZGVDYWxsZWQgPSBkZWNvZGVDYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmNvZGVCZWdpbkNhbGxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZW5jb2RlQmVnaW5DYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlQmVnaW5DYWxsZWQoYm9vbGVhbiBlbmNvZGVCZWdpbkNhbGxlZCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZW5jb2RlQmVnaW5DYWxsZWQgPSBlbmNvZGVCZWdpbkNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuY29kZUNoaWxkcmVuQ2FsbGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbmNvZGVDaGlsZHJlbkNhbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVDaGlsZHJlbkNhbGxlZChib29sZWFuIGVuY29kZUNoaWxkcmVuQ2FsbGVkKQotICAgIHsKLSAgICAgICAgdGhpcy5lbmNvZGVDaGlsZHJlbkNhbGxlZCA9IGVuY29kZUNoaWxkcmVuQ2FsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlRW5kQ2FsbGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbmNvZGVFbmRDYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RlRW5kQ2FsbGVkKGJvb2xlYW4gZW5jb2RlRW5kQ2FsbGVkKQotICAgIHsKLSAgICAgICAgdGhpcy5lbmNvZGVFbmRDYWxsZWQgPSBlbmNvZGVFbmRDYWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkVmFsdWUoT2JqZWN0IGNvbnZlcnRlZFZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy5jb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGM4Mzk3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5BUEk7DQotDQotLyoqDQotICogbWFuYWdlciB0byBjcmVhdGUgYW5kIHJlc2V0IHNwZWNpZmljIHN0b3JhZ2UgaW1wbGVtZW50YXRpb25zDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihBUEkpDQotcHVibGljIGludGVyZmFjZSBTdG9yYWdlTWFuYWdlcjxUPg0KLXsNCi0gICAgVCBjcmVhdGUoU3RyaW5nIGtleSk7DQotICAgIHZvaWQgcmVzZXQoU3RyaW5nIGtleSk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9TdG9yYWdlTWFuYWdlckhvbGRlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VySG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZjk1MzguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VySG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LkFQSTsNCi0NCi0vKioNCi0gKiBpbnRlcmZhY2UgdG8gbWFuYWdlIHN0b3JhZ2UtbWFuYWdlciBpbnN0YW5jZXMNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihBUEkpDQotcHVibGljIGludGVyZmFjZSBTdG9yYWdlTWFuYWdlckhvbGRlcg0KLXsNCi0gICAgdm9pZCBzZXRTdG9yYWdlTWFuYWdlcihDbGFzcyB0eXBlLCBTdG9yYWdlTWFuYWdlciBzdG9yYWdlTWFuYWdlciwgYm9vbGVhbiBvdmVycmlkZSk7DQotICAgIFN0b3JhZ2VNYW5hZ2VyIGdldFN0b3JhZ2VNYW5hZ2VyKENsYXNzIHR5cGUpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvVmFsaWRhdGlvblJlc3VsdC5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1ZhbGlkYXRpb25SZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc5MzI3Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvVmFsaWRhdGlvblJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuRmFjZXNNZXNzYWdlSG9sZGVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkxPVywgZGVzY3JpcHRpb24gPSAicmVmYWN0b3IgaXQiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgVmFsaWRhdGlvblJlc3VsdA0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRGYWNlc01lc3NhZ2VIb2xkZXIoRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlcikNCi0gICAgew0KLSAgICAgICAgdGhpcy5mYWNlc01lc3NhZ2VIb2xkZXJMaXN0LmFkZChmYWNlc01lc3NhZ2VIb2xkZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZ2V0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1Zpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNjY5ZWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL1Zpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7DQotDQotLyoqDQotICogc3VnZ2VzdGVkIGludGVyZmFjZSBmb3IgYSB2aW9sYXRpb24tc2V2ZXJpdHktaW50ZXJwcmV0ZXIgc3RvcmFnZQ0KLSAqIHVzZWQgYnkgYWRkLW9ucyB0byBjaGFuZ2UgdGhlIGludGVycHJldGVyIGZvciB0aGUgY3VycmVudCByZXF1ZXN0DQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBzZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgdmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcik7DQotDQotICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTEwMjk2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkZhY2VzSW5mb3JtYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRGYWNlc0luZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZTk3ZjIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0RmFjZXNNZXNzYWdlU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5GYWNlc01lc3NhZ2VTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiB1c2UgYSBwdWJsaWMgY2xhc3MgdG8gYWxsb3cgb3B0aW9uYWwgZGVyZWdpc3RyYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRGYWNlc01lc3NhZ2VTdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdEZhY2VzTWVzc2FnZVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRNZXRhRGF0YVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YmZlOTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0TWV0YURhdGFTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLk1ldGFEYXRhU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5EZWZhdWx0TWV0YURhdGFTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiB1c2UgYSBwdWJsaWMgY2xhc3MgdG8gYWxsb3cgb3B0aW9uYWwgZGVyZWdpc3RyYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRNZXRhRGF0YVN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChNZXRhRGF0YVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRNZXRhRGF0YVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Zjg2MjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRQcm9wZXJ0eVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuUHJvcGVydHlTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiB1c2UgYSBwdWJsaWMgY2xhc3MgdG8gYWxsb3cgb3B0aW9uYWwgZGVyZWdpc3RyYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChQcm9wZXJ0eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzb3VyY2UpKSA/DQotICAgICAgICAgICAgICAgIERlZmF1bHRQcm9wZXJ0eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk2ODQxZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIHVzZSBhIHB1YmxpYyBjbGFzcyB0byBhbGxvdyBvcHRpb25hbCBkZXJlZ2lzdHJhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFJlbmRlcmVySW50ZXJjZXB0b3JQcm9wZXJ0eVN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChSZW5kZXJlckludGVyY2VwdG9yUHJvcGVydHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0UmVuZGVyZXJJbnRlcmNlcHRvclByb3BlcnR5U3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZTlkZTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9zdG9yYWdlL21hcHBlci9EZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdFJlbmRlcmVyUHJveHlTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlJlbmRlcmVyUHJveHlTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiB1c2UgYSBwdWJsaWMgY2xhc3MgdG8gYWxsb3cgb3B0aW9uYWwgZGVyZWdpc3RyYXRpb24NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRSZW5kZXJlclByb3h5U3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKFJlbmRlcmVyUHJveHlTdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0UmVuZGVyZXJQcm94eVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3N0b3JhZ2UvbWFwcGVyL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTQ5NmQ3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvc3RvcmFnZS9tYXBwZXIvRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLlZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogdXNlIGEgcHVibGljIGNsYXNzIHRvIGFsbG93IG9wdGlvbmFsIGRlcmVnaXN0cmF0aW9uDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDEwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlclN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHNvdXJjZSkpID8NCi0gICAgICAgICAgICAgICAgRGVmYXVsdFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXJTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL0VtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL0VtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWZiZjY1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRhcmdldChUWVBFKQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL051bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I3NTBlYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFRhcmdldChUWVBFKQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjRjYWE0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yDQotew0KLSAgICBib29sZWFuIHNraXBWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksIE1ldGFEYXRhRW50cnkgZW50cnkpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vZXhjZXB0aW9uL1JlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vZXhjZXB0aW9uL1JlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYjJiYjAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL2V4Y2VwdGlvbi9SZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5leGNlcHRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIHRvIGhhbmRsZSBzcGVjaWFsIGNhc2VzIGluIFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcnMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZFZhbGlkYXRvckV4Y2VwdGlvbiBleHRlbmRzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ2NDYzMzE3MzY0Mjg0OTU4ODRMOw0KLQ0KLSAgICBwdWJsaWMgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIoZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIoZmFjZXNNZXNzYWdlLCB0aHJvd2FibGUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9EZWZhdWx0RmFjZXNNZXNzYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjI1MTBjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0RlZmF1bHRGYWNlc01lc3NhZ2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWNlc01lc3NhZ2VGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZhY2VzTWVzc2FnZUZhY3RvcnkgaW1wbGVtZW50cyBGYWNlc01lc3NhZ2VGYWN0b3J5DQotew0KLSAgICBwdWJsaWMgRmFjZXNNZXNzYWdlIGNvbnZlcnQoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYoaXNMYWJlbGVkRmFjZXNNZXNzYWdlKGZhY2VzTWVzc2FnZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhY2VzTWVzc2FnZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjcmVhdGUoZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCksIGZhY2VzTWVzc2FnZS5nZXRTdW1tYXJ5KCksIGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBjcmVhdGUoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBWaW9sYXRpb25NZXNzYWdlKHNldmVyaXR5LCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzTGFiZWxlZEZhY2VzTWVzc2FnZShGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICAvL2Rvbid0IHVzZSB0aGUgaW50ZXJmYWNlIGhlcmUNCi0gICAgICAgIHJldHVybiBmYWNlc01lc3NhZ2UgaW5zdGFuY2VvZiBWaW9sYXRpb25NZXNzYWdlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0ZhY2VzTWVzc2FnZUhvbGRlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRmFjZXNNZXNzYWdlSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMWMzNjcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvRmFjZXNNZXNzYWdlSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEZhY2VzTWVzc2FnZUhvbGRlcg0KLXsNCi0gICAgcHJpdmF0ZSBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlOw0KLSAgICBwcml2YXRlIFN0cmluZyBjbGllbnRJZDsNCi0NCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZUhvbGRlcihGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmZhY2VzTWVzc2FnZSA9IGZhY2VzTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRmFjZXNNZXNzYWdlSG9sZGVyKEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5mYWNlc01lc3NhZ2UgPSBmYWNlc01lc3NhZ2U7DQotICAgICAgICBzZXRDbGllbnRJZChjbGllbnRJZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZhY2VzTWVzc2FnZSBnZXRGYWNlc01lc3NhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY2xpZW50SWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50SWQoU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICBpZighIioiLmVxdWFscyhjbGllbnRJZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0xhYmVsZWRNZXNzYWdlLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9MYWJlbGVkTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGY3YWU3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL0xhYmVsZWRNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBkb24ndCByZW1vdmUgKlRleHQgLSBpdCB3b3VsZCBsZWFkIHRvIGFuIG92ZXJsYXAgd2l0aCB0cmluaWRhZA0KLSAqIA0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTGFiZWxlZE1lc3NhZ2UNCi17DQotICAgIFN0cmluZyBnZXRMYWJlbFRleHQoKTsNCi0gICAgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIGxhYmVsKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvVmlvbGF0aW9uTWVzc2FnZS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvVmlvbGF0aW9uTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTQ0Yzc2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL1Zpb2xhdGlvbk1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMg0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgVmlvbGF0aW9uTWVzc2FnZSBleHRlbmRzIEZhY2VzTWVzc2FnZSBpbXBsZW1lbnRzIExhYmVsZWRNZXNzYWdlDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2OTAzOTU4OTQyOTg3NzExMjMxTDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFiZWw7DQotICAgIHByaXZhdGUgYm9vbGVhbiBzdW1tYXJ5TGFiZWxSZXBsYWNlZCA9IGZhbHNlOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGV0YWlsTGFiZWxSZXBsYWNlZCA9IGZhbHNlOw0KLQ0KLSAgICBwdWJsaWMgVmlvbGF0aW9uTWVzc2FnZShTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgdGhpcyhTRVZFUklUWV9FUlJPUiwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmlvbGF0aW9uTWVzc2FnZShTZXZlcml0eSBzZXZlcml0eSwgU3RyaW5nIHN1bW1hcnksIFN0cmluZyBkZXRhaWwpDQotICAgIHsNCi0gICAgICAgIHNldFNldmVyaXR5KHNldmVyaXR5KTsNCi0gICAgICAgIHNldFN1bW1hcnkoc3VtbWFyeSk7DQotICAgICAgICBzZXREZXRhaWwoZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsVGV4dCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsYWJlbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIGxhYmVsKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VtbWFyeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxhYmVsICE9IG51bGwgJiYgIXRoaXMuc3VtbWFyeUxhYmVsUmVwbGFjZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0U3VtbWFyeShnZXRMYWJlbGVkTWVzc3NhZ2Uoc3VwZXIuZ2V0U3VtbWFyeSgpLCBnZXRMYWJlbFRleHQoKSkpOw0KLSAgICAgICAgICAgIHRoaXMuc3VtbWFyeUxhYmVsUmVwbGFjZWQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFN1bW1hcnkoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBnZXREZXRhaWwoKQ0KLSAgICB7DQotICAgICAgICBpZihsYWJlbCAhPSBudWxsICYmICF0aGlzLmRldGFpbExhYmVsUmVwbGFjZWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgc2V0RGV0YWlsKGdldExhYmVsZWRNZXNzc2FnZShzdXBlci5nZXREZXRhaWwoKSwgZ2V0TGFiZWxUZXh0KCkpKTsNCi0gICAgICAgICAgICB0aGlzLmRldGFpbExhYmVsUmVwbGFjZWQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldERldGFpbCgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldExhYmVsZWRNZXNzc2FnZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGxhYmVsKQ0KLSAgICB7DQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmNvbnRhaW5zKCJ7IiArIGkgKyAifSIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgieyIgKyBpICsgIn0iLCBsYWJlbCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHNldFN1bW1hcnkoU3RyaW5nIHMpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnNldFN1bW1hcnkocyk7DQotICAgICAgICB0aGlzLnN1bW1hcnlMYWJlbFJlcGxhY2VkID0gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHNldERldGFpbChTdHJpbmcgcykNCi0gICAgew0KLSAgICAgICAgc3VwZXIuc2V0RGV0YWlsKHMpOw0KLSAgICAgICAgdGhpcy5kZXRhaWxMYWJlbFJlcGxhY2VkID0gZmFsc2U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0Fic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2Mzk2ZDQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOw0KLQ0KLS8qKg0KLSAqIE1lc3NhZ2VSZXNvbHZlciB3aGljaCB1c2VzIHByb3BlcnR5IGZpbGVzLg0KLSAqIFN1YmNsYXNzZXMganVzdCBoYXZlIHRvIHByb3ZpZGUgdGhlIHBhY2thZ2UgdG8gbG9vayBhdC4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBjYW4gYWxzbyBwcm92aWRlIGEgY3VzdG9tIG5hbWUgd2hpY2ggaXMgZS5nLiBjb25maWd1cmVkIHZpYSB3ZWIueG1sLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgaW1wbGVtZW50cyBNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSID0gIj8/PyI7DQotDQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb24gPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9ERUZBVUxUX0NPTlZFTlRJT047DQotICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGRlZmF1bHRCdW5kbGUgPSBudWxsOw0KLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlQnVuZGxlQmFzZU5hbWU7DQotICAgIC8vd2l0aCBqc2YgMS4xIG9ubHkgYXZhaWxhYmxlIGlmIHRoZXJlIGlzIGEgY3VzdG9tIGJlYW4NCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZUJ1bmRsZVZhck5hbWU7DQotDQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcigpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIGlmIChrZXkgPT0gbnVsbCB8fCBrZXkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKGtleS5jb250YWlucygiICIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGtleS5lbmRzV2l0aCgiX2RldGFpbCIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAga2V5ID0ga2V5LnN1YnN0cmluZygwLCBrZXkubGVuZ3RoKCkgLSA3KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGtleTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBjdXN0b21NZXNzYWdlID0gbnVsbDsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSB0cnlUb0ZpbmRDdXN0b21NZXNzYWdlKGtleSwgbG9jYWxlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChjdXN0b21NZXNzYWdlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2U7DQotICAgICAgICB9DQotDQotICAgICAgICAvKg0KLSAgICAgICAgICogdHJ5IHRvIHVzZSB0aGUgY29udmVudGlvbiBmb3IgdGhlIG1lc3NhZ2UgYnVuZGxlDQotICAgICAgICAgKi8NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSB0cnlUb1VzZU1lc3NhZ2VCdW5kbGVDb252ZW50aW9uKGtleSwgbG9jYWxlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChjdXN0b21NZXNzYWdlICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2U7DQotICAgICAgICB9DQotDQotICAgICAgICAvKg0KLSAgICAgICAgICogbm8gbWVzc2FnZSBidW5kbGUgb3IgbWVzc2FnZSBmb3VuZCAod2l0aCB0aGUgY29udmVudGlvbik/DQotICAgICAgICAgKi8NCi0NCi0gICAgICAgIC8vdHJ5IHRvIGxvYWQgY3VzdG9tIG1lc3NhZ2VzDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gdHJ5VG9GaW5kQ3VzdG9tTWVzc2FnZUluQ3VzdG9tUmVzb3VyY2VCdW5kbGUoa2V5LCBsb2NhbGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0IHdhcyBqdXN0IGEgdHJ5DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZGV0ZXJtaW5lTWVzc2FnZShrZXksIGxvY2FsZSwgY3VzdG9tTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHJ5VG9GaW5kQ3VzdG9tTWVzc2FnZShTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsNCi0gICAgICAgIFN0cmluZyBjdXN0b21NZXNzYWdlID0gbnVsbDsNCi0NCi0gICAgICAgIC8vb25seSBpbiBjYXNlIG9mIGEgVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIHdoaWNoIGlzIGNvbmZpZ3VyZWQgYXMgYmVhbg0KLSAgICAgICAgaWYgKHRoaXMubWVzc2FnZUJ1bmRsZUJhc2VOYW1lICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUodGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUsIGxvY2FsZSk7DQotICAgICAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjdXN0b21NZXNzYWdlID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJtZXNzYWdlIGJ1bmRsZSAiICsgdGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUgKyAiIG5vdCBmb3VuZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9vbmx5IGluIGNhc2Ugb2YgYSBWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggaXMgY29uZmlndXJlZCBhcyBiZWFuDQotICAgICAgICBpZiAodGhpcy5tZXNzYWdlQnVuZGxlVmFyTmFtZSAhPSBudWxsICYmIGN1c3RvbU1lc3NhZ2UgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IChSZXNvdXJjZUJ1bmRsZSkgRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKG1lc3NhZ2VCdW5kbGVWYXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2UgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIm1lc3NhZ2UgYnVuZGxlIHZhciBuYW1lICIgKyB0aGlzLm1lc3NhZ2VCdW5kbGVWYXJOYW1lICsgIiBub3QgZm91bmQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBjdXN0b21NZXNzYWdlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHRyeVRvVXNlTWVzc2FnZUJ1bmRsZUNvbnZlbnRpb24oU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkNCi0gICAgew0KLSAgICAgICAgaWYgKChkZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb24gPT0gbnVsbCB8fCAhZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgICAgICAmJiBpc0RlZmF1bHRNZXNzYWdlQnVuZGxlQ29udmVudGlvbkFjdGl2ZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChkZWZhdWx0QnVuZGxlID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5NRVNTQUdFX0JVTkRMRV9OQU1FKSwgbG9jYWxlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZw0KLSAgICAgICAgICAgICAgICAgICAgZGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uID0gInRydWUiOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChkZWZhdWx0QnVuZGxlICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdEJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb0ZpbmRDdXN0b21NZXNzYWdlSW5DdXN0b21SZXNvdXJjZUJ1bmRsZShTdHJpbmcga2V5LCBMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IHRyeVRvTG9hZEN1c3RvbVJlc291cmNlQnVuZGxlKGxvY2FsZSk7DQotDQotICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgibm8gY3VzdG9tIG1lc3NhZ2UgZm9yICIgKyBrZXkgKyAiIHdpdGhpbiAiICsgZ2V0Q3VzdG9tQmFzZU5hbWUoKSwgZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFJlc291cmNlQnVuZGxlIHRyeVRvTG9hZEN1c3RvbVJlc291cmNlQnVuZGxlKExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjdXN0b21CYXNlTmFtZSA9IGdldEN1c3RvbUJhc2VOYW1lKCk7DQotDQotICAgICAgICBpZihjdXN0b21CYXNlTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoY3VzdG9tQmFzZU5hbWUsIGxvY2FsZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBkZXRlcm1pbmVNZXNzYWdlKFN0cmluZyBrZXksIExvY2FsZSBsb2NhbGUsIFN0cmluZyBjdXN0b21NZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICAvL3VzZSBjdXN0b20gbmFtZSAoaWYgcG9zc2libGUpIG90aGVyd2lzZTogZmFsbGJhY2sgdG8gZGVmYXVsdCBtZXNzYWdlIChpZiBwb3NzaWJsZSkNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoY3VzdG9tTWVzc2FnZSAhPSBudWxsKSA/IGN1c3RvbU1lc3NhZ2UNCi0gICAgICAgICAgICAgICAgICAgIDogKGdldEJhc2VOYW1lKCkgIT0gbnVsbCkgPyBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoZ2V0QmFzZU5hbWUoKSwgbG9jYWxlKS5nZXRTdHJpbmcoa2V5KSA6IG51bGw7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIE1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSICsga2V5ICsgTUlTU0lOR19SRVNPVVJDRV9NQVJLRVI7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWZhdWx0TWVzc2FnZUJ1bmRsZUNvbnZlbnRpb25BY3RpdmUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEJhc2VOYW1lKCk7DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tQmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlQnVuZGxlQmFzZU5hbWUoU3RyaW5nIG1lc3NhZ2VCdW5kbGVCYXNlTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlQnVuZGxlQmFzZU5hbWUgPSBtZXNzYWdlQnVuZGxlQmFzZU5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUJ1bmRsZVZhck5hbWUoU3RyaW5nIG1lc3NhZ2VCdW5kbGVWYXJOYW1lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1lc3NhZ2VCdW5kbGVWYXJOYW1lID0gbWVzc2FnZUJ1bmRsZVZhck5hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL0RlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MTgwMzcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdE1lc3NhZ2VSZXNvbHZlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQ2xhc3NNYXBwaW5nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uTmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogRmFjdG9yeSB3aGljaCBjcmVhdGVzIGEgTWVzc2FnZVJlc29sdmVyIGZvciBhIGdpdmVuIFZhbGlkYXRpb25TdHJhdGVneQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCBnZW5lcmljIGphdmEgYXBpIChkZS0vcmVnaXN0ZXIgbWFwcGluZykiKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIERlZmF1bHRNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneT4NCi0gICAgICAgIGltcGxlbWVudHMgQ2xhc3NNYXBwaW5nRmFjdG9yeTxWYWxpZGF0aW9uU3RyYXRlZ3ksIE1lc3NhZ2VSZXNvbHZlcj4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmc7DQotICAgIHByaXZhdGUgTGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+IG5hbWVNYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4+KCk7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0TWVzc2FnZVJlc29sdmVyRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1lc3NhZ2VSZXNvbHZlciBjcmVhdGUoVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHN0cmF0ZWd5TmFtZSA9IFByb3h5VXRpbHMuZ2V0Q2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpKTsNCi0NCi0gICAgICAgIGlmIChzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmcgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbml0U3RhdGljTWFwcGluZ3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmcuY29udGFpbnNLZXkoc3RyYXRlZ3lOYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKE1lc3NhZ2VSZXNvbHZlcikgQ2xhc3NVdGlscw0KLSAgICAgICAgICAgICAgICAudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmcuZ2V0KHN0cmF0ZWd5TmFtZSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcjsNCi0gICAgICAgIFN0cmluZyByZXNvbHZlck5hbWU7DQotICAgICAgICBmb3IgKE5hbWVNYXBwZXI8VmFsaWRhdGlvblN0cmF0ZWd5PiBuYW1lTWFwcGVyIDogbmFtZU1hcHBlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9idWlsZCBjb252ZW50aW9uIChWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIpDQotICAgICAgICAgICAgcmVzb2x2ZXJOYW1lID0gbmFtZU1hcHBlci5jcmVhdGVOYW1lKHZhbGlkYXRpb25TdHJhdGVneSk7DQotDQotICAgICAgICAgICAgLy9uYW1lIHdhc24ndCBtYXBwZWQNCi0gICAgICAgICAgICBpZiAocmVzb2x2ZXJOYW1lID09IG51bGwgfHwgUHJveHlVdGlscy5nZXRDbGFzc05hbWUodmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkpLmVxdWFscyhyZXNvbHZlck5hbWUpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIG1lc3NhZ2VSZXNvbHZlciA9IChNZXNzYWdlUmVzb2x2ZXIpIENsYXNzVXRpbHMudHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShyZXNvbHZlck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtZXNzYWdlUmVzb2x2ZXIgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFkZE1hcHBpbmcoc3RyYXRlZ3lOYW1lLCByZXNvbHZlck5hbWUpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHJlc29sdmVyTmFtZSArICIgdXNlZCBmb3IgIiArIHN0cmF0ZWd5TmFtZSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VSZXNvbHZlcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBhZGRNYXBwaW5nKHN0cmF0ZWd5TmFtZSwgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbml0U3RhdGljTWFwcGluZ3MoKQ0KLSAgICB7DQotICAgICAgICBzdHJhdGVneU1lc3NhZ2VSZXNvbHZlck1hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIC8vc2V0dXAgaW50ZXJuYWwgc3RhdGljIG1hcHBpbmdzDQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA6DQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9DT05GSUcpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHNldHVwTWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwTWFwcGluZ3MoTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLFN0cmluZz4+IG1hcHBpbmdzKQ0KLSAgICB7DQotICAgICAgICBmb3IoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXBwaW5nIDogbWFwcGluZ3MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkTWFwcGluZyhtYXBwaW5nLmdldFNvdXJjZSgpLCBtYXBwaW5nLmdldFRhcmdldCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAibG9nZ2luZyIpDQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkTWFwcGluZyhTdHJpbmcgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgU3RyaW5nIG1lc3NhZ2VSZXNvbHZlck5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkaW5nIHN0YXRpYyB2YWxpZGF0aW9uIHN0cmF0ZWd5IHRvIG1lc3NhZ2UgcmVzb2x2ZXIgbWFwcGluZzogIg0KLSAgICAgICAgICAgICAgICArIHZhbGlkYXRpb25TdHJhdGVneU5hbWUgKyAiIC0+ICIgKyBtZXNzYWdlUmVzb2x2ZXJOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHN0cmF0ZWd5TWVzc2FnZVJlc29sdmVyTWFwcGluZy5wdXQodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSwgbWVzc2FnZVJlc29sdmVyTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIExpc3Q8TmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+PiBnZXROYW1lTWFwcGVyTGlzdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBuYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OWVkYzYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogRGVmYXVsdCBNZXNzYWdlUmVzb2x2ZXIgd2hpY2ggdXNlcyB0aGUgZGVmYXVsdCBjb252ZW50aW9uIGZvciB0aGUgbWVzc2FnZSBidW5kbGUuDQotICogSXQncyBwb3NzaWJsZSB0byBwcm92aWRlIGEgY3VzdG9tIG1lc3NhZ2UgYnVuZGxlIHZpYSB3ZWIueG1sDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQlVORExFID0gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9NRVNTQUdFX0JVTkRMRTsNCi0NCi0gICAgLy9ub3QgdXNlZCBhdCB0aGUgbW9tZW50IC0ganVzdCBmb3IgYSBjb252ZW50aW9uDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TW9kdWxlTWVzc2FnZUJ1bmRsZU5hbWUoZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEN1c3RvbUJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIENVU1RPTV9CVU5ETEU7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNjYTFjMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9NZXNzYWdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSBmb3IgTWVzc2FnZVJlc29sdmVycyBpbmRlcGVuZGVudCBvZiB0aGUgbWVzc2FnZSBzb3VyY2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGQ0MGI2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YzA4ZTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5BYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBWYWxpZGF0aW9uU3RyYXRlZ2llcyB0byBNZXNzYWdlUmVzb2x2ZXJzLg0KLSAqIChjb25maWd1cmVkIHZpYSB3ZWIueG1sKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigxMDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlndXJlZFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1ZBTElEQVRJT05fU1RSQVRFR1lfVE9fTUVTU0FHRV9SRVNPTFZFUl9OQU1FX01BUFBFUjsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0M2MwMTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBUbyBwcm92aWRlIGEgY3VzdG9tIE5hbWVNYXBwZXIgdG8gbWFwIFZhbGlkYXRpb25TdHJhdGVneSB0byBNZXNzYWdlUmVzb2x2ZXIuDQotICogKGNvbmZpZ3VyZWQgdmlhIGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pDQotICogVGhlIGJlYW4gcHJvdmlkZXMgdGhlIGRlZmF1bHQgbmFtZSAoY29udmVudGlvbikuDQotICogSXQncyBwb3NzaWJsZSB0byBwcm92aWRlIGEgY3VzdG9tIGZ1bGwgcXVhbGlmaWVkIG5hbWUuICg9IGN1c3RvbWl6YWJsZSBjb252ZW50aW9uKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigyMDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29udmVudGlvblZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4NCi17DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1NUUkFURUdZX1RPX01TR19SRVNPTFZFUl9OQU1FX01BUFBFUik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRNb2R1bGVWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWJiNGQ2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9tZXNzYWdlL3Jlc29sdmVyL21hcHBlci9EZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBJbiBvcmRlciB0byBwcm92aWRlIGEgTmFtZU1hcHBlciBwZXIgdmFsaWRhdGlvbiBtb2R1bGUuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDMxMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TW9kdWxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgc3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYTQ3N2IuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIG1hcHMgRXh0VmFsIFZhbGlkYXRpb25TdHJhdGVnaWVzIHRvIEV4dFZhbCBNZXNzYWdlUmVzb2x2ZXJzLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigzMDApDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3lUb01zZ1Jlc29sdmVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneUNsYXNzID0gUHJveHlVdGlscw0KLSAgICAgICAgICAgICAgICAuZ2V0VW5wcm94aWVkQ2xhc3ModmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksIFZhbGlkYXRpb25TdHJhdGVneS5jbGFzcyk7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0TWVzc2FnZVJlc29sdmVyQ2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2xhc3NOYW1lKHZhbGlkYXRpb25TdHJhdGVneUNsYXNzLmdldFNpbXBsZU5hbWUoKSkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBzdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldE1lc3NhZ2VSZXNvbHZlckNsYXNzTmFtZShzdHJhdGVneUNsYXNzTmFtZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL21lc3NhZ2UvcmVzb2x2ZXIvbWFwcGVyL1NpbXBsZVZhbGlkYXRpb25TdHJhdGVneVRvTXNnUmVzb2x2ZXJOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYzZDk3MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vbWVzc2FnZS9yZXNvbHZlci9tYXBwZXIvU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnRlcm5hbENvbnZlbnRpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgdG8gcGxhY2UgVmFsaWRhdGlvblN0cmF0ZWdpZXMgYW5kIE1lc3NhZ2VSZXNvbHZlcnMgaW4gdGhlIHNhbWUgcGFja2FnZS4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoNDAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMfSkNCi1wdWJsaWMgY2xhc3MgU2ltcGxlVmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXINCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBzdHJhdGVneUNsYXNzTmFtZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGN1c3RvbVBvc3RmaXggPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VfUkVTT0xWRVJfUE9TVEZJWCk7DQotICAgICAgICByZXR1cm4gSW50ZXJuYWxDb252ZW50aW9uUHJvdmlkZXIuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5QmFzZWROYW1lKHN0cmF0ZWd5Q2xhc3NOYW1lLCBjdXN0b21Qb3N0Zml4KTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMzhmNTQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuR2VuZXJpY0FycmF5VHlwZTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuV2lsZGNhcmRUeXBlOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3INCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZXh0cmFjdEJ5SWQoYW5ub3RhdGlvbiwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8T2JqZWN0PiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGV4dHJhY3RCeUlkKGFubm90YXRpb24sIGtleSwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIDxUPiBMaXN0PFQ+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzczxUPiB2YWx1ZVR5cGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBleHRyYWN0QnlJZChhbm5vdGF0aW9uLCBrZXksIHZhbHVlVHlwZSwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIDxUPiBUIGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzczxUPiB2YWx1ZVR5cGUsIENsYXNzIHZhbHVlSWQpDQotICAgIHsNCi0gICAgICAgIExpc3Q8VD4gcmVzdWx0cyA9IGV4dHJhY3RCeUlkKGFubm90YXRpb24sIGtleSwgdmFsdWVUeXBlLCB2YWx1ZUlkKTsNCi0NCi0gICAgICAgIGlmKHJlc3VsdHMuaXRlcmF0b3IoKS5oYXNOZXh0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMuaXRlcmF0b3IoKS5uZXh0KCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwdWJsaWMgPFQ+IExpc3Q8VD4gZXh0cmFjdEJ5SWQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBPYmplY3Qga2V5LCBDbGFzczxUPiB2YWx1ZVR5cGUsIENsYXNzIHZhbHVlSWQpDQotICAgIHsNCi0gICAgICAgIExpc3Q8T2JqZWN0PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0NCi0gICAgICAgIGZvcihPYmplY3QgZW50cnkgOiBleHRyYWN0QnlJZChhbm5vdGF0aW9uLCBrZXksIHZhbHVlSWQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHZhbHVlVHlwZS5pc0Fzc2lnbmFibGVGcm9tKGVudHJ5LmdldENsYXNzKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChlbnRyeSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChMaXN0PFQ+KXJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGV4dHJhY3RCeUlkKEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSwgQ2xhc3MgdmFsdWVJZCkNCi0gICAgew0KLSAgICAgICAgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiBmdWxsUmVzdWx0ID0gZXh0cmFjdEJ5SWQoYW5ub3RhdGlvbiwgdmFsdWVJZCk7DQotDQotICAgICAgICBpZihmdWxsUmVzdWx0LmNvbnRhaW5zS2V5KGtleSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZ1bGxSZXN1bHQuZ2V0KGtleSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFkZCB3ZWIueG1sIHBhcmFtZXRlciBmb3IgcGVyZm9ybWFuY2UgdHVuaW5nIHRvIGRlYWN0aXZhdGUgdGhlIHNjYW4iKQ0KLSAgICBwdWJsaWMgTWFwPE9iamVjdCwgTGlzdDxPYmplY3Q+PiBleHRyYWN0QnlJZChBbm5vdGF0aW9uIGFubm90YXRpb24sIENsYXNzIHZhbHVlSWQpDQotICAgIHsNCi0gICAgICAgIE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+KCk7DQotDQotICAgICAgICBmb3IoTWV0aG9kIGN1cnJlbnRBbm5vdGF0aW9uQXR0cmlidXRlIDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldERlY2xhcmVkTWV0aG9kcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoIWlzVmFsaWRhdGlvblBhcmFtZXRlcihjdXJyZW50QW5ub3RhdGlvbkF0dHJpYnV0ZS5nZXRHZW5lcmljUmV0dXJuVHlwZSgpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgT2JqZWN0IHBhcmFtZXRlclZhbHVlID0gY3VycmVudEFubm90YXRpb25BdHRyaWJ1dGUuaW52b2tlKGFubm90YXRpb24pOw0KLQ0KLSAgICAgICAgICAgICAgICBpZihwYXJhbWV0ZXJWYWx1ZSBpbnN0YW5jZW9mIENsYXNzW10pDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGZvcihDbGFzcyBjdXJyZW50UGFyYW1ldGVyVmFsdWUgOiAoQ2xhc3NbXSlwYXJhbWV0ZXJWYWx1ZSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAvL2tlZXAgY2hlY2sgc28gdGhhdCBmb2xsb3dpbmcgaXMgdHJ1ZToNCi0gICAgICAgICAgICAgICAgICAgICAgICAvL2lmIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgZm91bmQgd2hpY2ggdGVsbHMgdGhhdCBpdCBpc24ndCBhIGJsb2NraW5nIGVycm9yLCBsZXQgaXQgcGFzcw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQYXJhbWV0ZXJWYWx1ZShhbm5vdGF0aW9uLCBjdXJyZW50UGFyYW1ldGVyVmFsdWUsIHJlc3VsdCwgdmFsdWVJZCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZSBpZihwYXJhbWV0ZXJWYWx1ZSBpbnN0YW5jZW9mIENsYXNzKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2tlZXAgY2hlY2sgc28gdGhhdCBmb2xsb3dpbmcgaXMgdHJ1ZToNCi0gICAgICAgICAgICAgICAgICAgIC8vaWYgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBmb3VuZCB3aGljaCB0ZWxscyB0aGF0IGl0IGlzbid0IGEgYmxvY2tpbmcgZXJyb3IsIGxldCBpdCBwYXNzDQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUGFyYW1ldGVyVmFsdWUoYW5ub3RhdGlvbiwgKENsYXNzKXBhcmFtZXRlclZhbHVlLCByZXN1bHQsIHZhbHVlSWQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKHRoaXMubG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogZG9uJ3QgdXNlIHRoZSBJbnRyb3NwZWN0b3IgaW4gdGhpcyBjYXNlDQotICAgICAqIGlmIHlvdSBoYXZlIGEgYmV0dGVyIHNvbHV0aW9uIHdoaWNoIHN1cHBvcnRzIGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVyIHN0eWxlcyAoc2VlIGV4dHZhbCB3aWtpKSwNCi0gICAgICogeW91IGNhbiBpbXBsLiBpdCBhbmQgdXNlIGl0IChleGNoYW5nZSB0aGUgaW1wbHMuIHZpYSB0aGUgRXh0VmFsQ29udGV4dCkuDQotICAgICAqIGZ1cnRoZXJtb3JlLCB5b3UgY2FuIHByb3ZpZGUgdGhlIGZpeCBmb3IgdGhlIGNvbW11bml0eQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NQYXJhbWV0ZXJWYWx1ZSgNCi0gICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24sIENsYXNzIHBhcmFtQ2xhc3MsIE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4gcmVzdWx0LCBDbGFzcyB2YWx1ZUlkKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBrZXkgPSBudWxsOw0KLSAgICAgICAgTGlzdDxPYmplY3Q+IHBhcmFtZXRlclZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KLQ0KLSAgICAgICAgaWYoVmFsaWRhdGlvblBhcmFtZXRlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHBhcmFtQ2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIExpc3Q8RmllbGQ+IHByb2Nlc3NlZEZpZWxkcyA9IG5ldyBBcnJheUxpc3Q8RmllbGQ+KCk7DQotICAgICAgICAgICAgTGlzdDxNZXRob2Q+IHByb2Nlc3NlZE1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZD4oKTsNCi0NCi0gICAgICAgICAgICBDbGFzcyBjdXJyZW50UGFyYW1DbGFzcyA9IHBhcmFtQ2xhc3M7DQotICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRQYXJhbUNsYXNzICE9IG51bGwgJiYgIU9iamVjdC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGN1cnJlbnRQYXJhbUNsYXNzLmdldE5hbWUoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAgICAgKiBwcm9jZXNzIGNsYXNzDQotICAgICAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgICAgICAvL3N1cHBvcnQgcHVyZSBpbnRlcmZhY2UgYXBwcm9hY2ggZS5nLiBWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzDQotICAgICAgICAgICAgICAgIGZvcihGaWVsZCBjdXJyZW50RmllbGQgOiBjdXJyZW50UGFyYW1DbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZighcHJvY2Vzc2VkRmllbGRzLmNvbnRhaW5zKGN1cnJlbnRGaWVsZCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcHJvY2Vzc0ZvdW5kRmllbGQoYW5ub3RhdGlvbiwgY3VycmVudEZpZWxkLCBwYXJhbWV0ZXJWYWx1ZXMsIGtleSwgdmFsdWVJZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkRmllbGRzLmFkZChjdXJyZW50RmllbGQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIC8vaW5zcGVjdCB0aGUgb3RoZXIgbWV0aG9kcyBvZiB0aGUgaW1wbGVtZW50aW5nIGNsYXNzDQotICAgICAgICAgICAgICAgIGZvcihNZXRob2QgY3VycmVudE1ldGhvZCA6IGN1cnJlbnRQYXJhbUNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZighcHJvY2Vzc2VkTWV0aG9kcy5jb250YWlucyhjdXJyZW50TWV0aG9kKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBwcm9jZXNzRm91bmRNZXRob2QoY3VycmVudFBhcmFtQ2xhc3MsIGN1cnJlbnRNZXRob2QsIHBhcmFtZXRlclZhbHVlcywga2V5LCB2YWx1ZUlkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRNZXRob2RzLmFkZChjdXJyZW50TWV0aG9kKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAgICAgKiBwcm9jZXNzIGludGVyZmFjZXMNCi0gICAgICAgICAgICAgICAgICovDQotICAgICAgICAgICAgICAgIGZvcihDbGFzcyBjdXJyZW50SW50ZXJmYWNlIDogY3VycmVudFBhcmFtQ2xhc3MuZ2V0SW50ZXJmYWNlcygpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZighVmFsaWRhdGlvblBhcmFtZXRlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGN1cnJlbnRJbnRlcmZhY2UpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgLy9zdXBwb3J0IGludGVyZmFjZSArIGltcGwuIGFwcHJvYWNoIGUuZy4gTXlQYXJhbUltcGwuY2xhc3MNCi0gICAgICAgICAgICAgICAgICAgIC8vKE15UGFyYW1JbXBsIGltcGxlbWVudHMgTXlQYXJhbQ0KLSAgICAgICAgICAgICAgICAgICAgLy9NeVBhcmFtIGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcg0KLSAgICAgICAgICAgICAgICAgICAgLy9tZXRob2RzIGluIHRoZSBpbnRlcmZhY2UgaGF2ZSB0byBiZSBtYXJrZWQgd2l0aCBAUGFyYW1ldGVyVmFsdWUgYW5kIEBQYXJhbWV0ZXJLZXkNCi0gICAgICAgICAgICAgICAgICAgIGZvcihNZXRob2QgY3VycmVudE1ldGhvZCA6IGN1cnJlbnRJbnRlcmZhY2UuZ2V0RGVjbGFyZWRNZXRob2RzKCkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXByb2Nlc3NlZE1ldGhvZHMuY29udGFpbnMoY3VycmVudE1ldGhvZCkpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBwcm9jZXNzRm91bmRNZXRob2QoY3VycmVudFBhcmFtQ2xhc3MsIGN1cnJlbnRNZXRob2QsIHBhcmFtZXRlclZhbHVlcywga2V5LCB2YWx1ZUlkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkTWV0aG9kcy5hZGQoY3VycmVudE1ldGhvZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgZm9yKEZpZWxkIGN1cnJlbnRGaWVsZCA6IGN1cnJlbnRJbnRlcmZhY2UuZ2V0RGVjbGFyZWRGaWVsZHMoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZighcHJvY2Vzc2VkRmllbGRzLmNvbnRhaW5zKGN1cnJlbnRGaWVsZCkpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBwcm9jZXNzRm91bmRGaWVsZChhbm5vdGF0aW9uLCBjdXJyZW50RmllbGQsIHBhcmFtZXRlclZhbHVlcywga2V5LCB2YWx1ZUlkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkRmllbGRzLmFkZChjdXJyZW50RmllbGQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBjdXJyZW50UGFyYW1DbGFzcyA9IGN1cnJlbnRQYXJhbUNsYXNzLmdldFN1cGVyY2xhc3MoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBrZXkgPSBjcmVhdGVEZWZhdWx0S2V5KGtleSwgcGFyYW1DbGFzcyk7DQotDQotICAgICAgICBpZihwYXJhbWV0ZXJWYWx1ZXMuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vQFBhcmFtZXRlclZhbHVlIGlzIG9wdGlvbmFsIGFzIHdlbGwNCi0gICAgICAgICAgICBwYXJhbWV0ZXJWYWx1ZXMuYWRkKGtleSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZihyZXN1bHQuY29udGFpbnNLZXkoa2V5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQuZ2V0KGtleSkuYWRkQWxsKHBhcmFtZXRlclZhbHVlcyk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LnB1dChrZXksIHBhcmFtZXRlclZhbHVlcyk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgY3JlYXRlRGVmYXVsdEtleShPYmplY3Qga2V5LCBDbGFzcyBjdXJyZW50Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIGlmKGtleSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vY2hlY2sgZm9yIHN1cGVyLWludGVyZmFjZSAoZXhjbHVkZSBWYWxpZGF0aW9uUGFyYW1ldGVyIGl0c2VsZikNCi0gICAgICAgICAgICBmb3IoQ2xhc3MgaW50ZXJmYWNlQ2xhc3MgOiBjdXJyZW50Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoVmFsaWRhdGlvblBhcmFtZXRlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGludGVyZmFjZUNsYXNzKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICghaW50ZXJmYWNlQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhWYWxpZGF0aW9uUGFyYW1ldGVyLmNsYXNzLmdldE5hbWUoKSkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBrZXkgPSBpbnRlcmZhY2VDbGFzczsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoa2V5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAga2V5ID0gY3VycmVudENsYXNzOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGtleTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBwcm9jZXNzRm91bmRGaWVsZCgNCi0gICAgICAgICAgICBPYmplY3QgaW5zdGFuY2UsIEZpZWxkIGN1cnJlbnRGaWVsZCwgTGlzdDxPYmplY3Q+IHBhcmFtVmFsdWVzLCBPYmplY3Qga2V5LCBDbGFzcyB2YWx1ZUlkKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgbmV3S2V5ID0gbnVsbDsNCi0gICAgICAgIGlmKGtleSA9PSBudWxsICYmIGN1cnJlbnRGaWVsZC5pc0Fubm90YXRpb25QcmVzZW50KFBhcmFtZXRlcktleS5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBuZXdLZXkgPSBjdXJyZW50RmllbGQuZ2V0KGluc3RhbmNlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9ubyAiZWxzZSBpZiIgdG8gYWxsb3cgYm90aCBhdCBvbmUgZmllbGQNCi0gICAgICAgIGlmKGN1cnJlbnRGaWVsZC5pc0Fubm90YXRpb25QcmVzZW50KFBhcmFtZXRlclZhbHVlLmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWx1ZUlkID09IG51bGwgfHwgdmFsdWVJZC5lcXVhbHMoY3VycmVudEZpZWxkLmdldEFubm90YXRpb24oUGFyYW1ldGVyVmFsdWUuY2xhc3MpLmlkKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudEZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7DQotICAgICAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlcy5hZGQoY3VycmVudEZpZWxkLmdldChpbnN0YW5jZSkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oZSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbmV3S2V5ICE9IG51bGwgPyBuZXdLZXkgOiBrZXk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgcHJvY2Vzc0ZvdW5kTWV0aG9kKA0KLSAgICAgICAgICAgIENsYXNzIHBhcmFtQ2xhc3MsIE1ldGhvZCBjdXJyZW50TWV0aG9kLCBMaXN0PE9iamVjdD4gcGFyYW1ldGVyVmFsdWVzLCBPYmplY3Qga2V5LCBDbGFzcyB2YWx1ZUlkKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgbmV3S2V5ID0gbnVsbDsNCi0gICAgICAgIGlmKGtleSA9PSBudWxsICYmIGN1cnJlbnRNZXRob2QuaXNBbm5vdGF0aW9uUHJlc2VudChQYXJhbWV0ZXJLZXkuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoIShNb2RpZmllci5pc0Fic3RyYWN0KHBhcmFtQ2xhc3MuZ2V0TW9kaWZpZXJzKCkpIHx8IE1vZGlmaWVyLmlzSW50ZXJmYWNlKHBhcmFtQ2xhc3MuZ2V0TW9kaWZpZXJzKCkpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbmV3S2V5ID0gY3VycmVudE1ldGhvZC5pbnZva2UocGFyYW1DbGFzcy5uZXdJbnN0YW5jZSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICAvL25vICJlbHNlIGlmIiB0byBhbGxvdyBib3RoIGF0IG9uZSBmaWVsZA0KLSAgICAgICAgaWYoY3VycmVudE1ldGhvZC5pc0Fubm90YXRpb25QcmVzZW50KFBhcmFtZXRlclZhbHVlLmNsYXNzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWx1ZUlkID09IG51bGwgfHwgdmFsdWVJZC5lcXVhbHMoY3VycmVudE1ldGhvZC5nZXRBbm5vdGF0aW9uKFBhcmFtZXRlclZhbHVlLmNsYXNzKS5pZCgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsNCi0gICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlcy5hZGQoY3VycmVudE1ldGhvZC5pbnZva2UocGFyYW1DbGFzcy5uZXdJbnN0YW5jZSgpKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIGl0J3MgYSBub25lLXN0YXRpYyBpbm5lciBjbGFzcyAtPiByZXR1cm4gdGhpcyBjbGFzcw0KLSAgICAgICAgICAgICAgICAgICAgaWYocGFyYW1DbGFzcy5nZXRFbmNsb3NpbmdDbGFzcygpICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWVzLmFkZChwYXJhbUNsYXNzKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oZSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbmV3S2V5ICE9IG51bGwgPyBuZXdLZXkgOiBrZXk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRhdGlvblBhcmFtZXRlcihUeXBlIGdlbmVyaWNSZXR1cm5UeXBlKQ0KLSAgICB7DQotICAgICAgICBpZihnZW5lcmljUmV0dXJuVHlwZSBpbnN0YW5jZW9mIEdlbmVyaWNBcnJheVR5cGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoKChHZW5lcmljQXJyYXlUeXBlKWdlbmVyaWNSZXR1cm5UeXBlKS5nZXRHZW5lcmljQ29tcG9uZW50VHlwZSgpIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gYW5hbHl6ZVBhcmFtZXRlcml6ZWRUeXBlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIChQYXJhbWV0ZXJpemVkVHlwZSkoKEdlbmVyaWNBcnJheVR5cGUpZ2VuZXJpY1JldHVyblR5cGUpLmdldEdlbmVyaWNDb21wb25lbnRUeXBlKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYoZ2VuZXJpY1JldHVyblR5cGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5hbHl6ZVBhcmFtZXRlcml6ZWRUeXBlKA0KLSAgICAgICAgICAgICAgICAgICAgKFBhcmFtZXRlcml6ZWRUeXBlKWdlbmVyaWNSZXR1cm5UeXBlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gYW5hbHl6ZVBhcmFtZXRlcml6ZWRUeXBlKFBhcmFtZXRlcml6ZWRUeXBlIHBhcmFtZXRlcml6ZWRUeXBlKQ0KLSAgICB7DQotICAgICAgICBmb3IoVHlwZSB0eXBlIDogcGFyYW1ldGVyaXplZFR5cGUuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHR5cGUgaW5zdGFuY2VvZiBXaWxkY2FyZFR5cGUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmb3IoVHlwZSB1cHBlckJvdW5kcyA6ICgoV2lsZGNhcmRUeXBlKXR5cGUpLmdldFVwcGVyQm91bmRzKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKHVwcGVyQm91bmRzIGluc3RhbmNlb2YgQ2xhc3MgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9mb3IgYXR0cmlidXRlcyBsaWtlOiBDbGFzczw/IGV4dGVuZHMgSW5oZXJpdGVkRnJvbVZhbGlkYXRpb25QYXJhbWV0ZXI+IHZhbHVlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25QYXJhbWV0ZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSgoQ2xhc3MpdXBwZXJCb3VuZHMpKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTJhNzNjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkN1c3RvbUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeSBpbXBsZW1lbnRzIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5DQotew0KLSAgICBwcml2YXRlIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvciB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yID0gbnVsbDsNCi0NCi0gICAgcHVibGljIERlZmF1bHRWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgY3JlYXRlKCkNCi0gICAgew0KLSAgICAgICAgaWYgKHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gdmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yQ2xhc3NOYW1lcy5hZGQoV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1IpOw0KLSAgICAgICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JDbGFzc05hbWVzDQotICAgICAgICAgICAgICAgIC5hZGQoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0SW5mb3JtYXRpb25Qcm92aWRlckJlYW4oKQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1IpKTsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yQ2xhc3NOYW1lcy5hZGQoRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiB2YWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yQ2xhc3NOYW1lcykNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgPSAoVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcikNCi0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UodmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgY3JlYXRlZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3I7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGVmYXVsdFZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNWM4ZmUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogbWFwcyBpbnRlcm5hbCBwYXJhbWV0ZXJzIHRvIG9wdGlvbmFsbHkgYXZhaWxhYmxlIGN1c3RvbSBwYXJhbWV0ZXJzDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnkgaW1wbGVtZW50cyBDbGFzc01hcHBpbmdGYWN0b3J5PENsYXNzLCBDbGFzcz4NCi17DQotICAgIHByaXZhdGUgTWFwPENsYXNzLCBDbGFzcz4gcGFyYW1ldGVyTWFwcGluZyA9IG5ldyBIYXNoTWFwPENsYXNzLCBDbGFzcz4oKTsNCi0NCi0gICAgcHVibGljIENsYXNzIGNyZWF0ZShDbGFzcyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIGlmICh0aGlzLnBhcmFtZXRlck1hcHBpbmcuY29udGFpbnNLZXkoc291cmNlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJNYXBwaW5nLmdldChzb3VyY2UpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQ2xhc3MgcmVzdWx0Ow0KLQ0KLSAgICAgICAgLy9pdCdzIGltcG9ydGFudCB0byBsb29rIGZvciB0aGUgc3RhdGljIGNvbmZpZ3MgZmlyc3QgLSBnbG9iYWwgcGFyYW1ldGVycyBhcmUgdXNlZCBpbnRlcm5hbGx5DQotICAgICAgICByZXN1bHQgPSB0cnlUb0ZpbmRTdGF0aWNDb25maWcoc291cmNlKTsNCi0NCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSB0cnlUb0ZpbmRHbG9iYWxQYXJhbWV0ZXIoc291cmNlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBzb3VyY2U7DQotICAgICAgICB9DQotDQotICAgICAgICBjYWNoZU1hcHBpbmcoc291cmNlLCByZXN1bHQpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENsYXNzIHRyeVRvRmluZEdsb2JhbFBhcmFtZXRlcihDbGFzcyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCB0YXJnZXQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShzb3VyY2UuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBDbGFzcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKENsYXNzKSB0YXJnZXQ7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENsYXNzIHRyeVRvRmluZFN0YXRpY0NvbmZpZyhDbGFzcyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIENsYXNzIHJlc3VsdCA9IG51bGw7DQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IGNvbmZpZyA6IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5WQUxJREFUSU9OX1BBUkFNRVRFUl9DT05GSUcpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHRyeVRvTWFwKHNvdXJjZSwgY29uZmlnLmdldE1hcHBpbmcoKSk7DQotDQotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENsYXNzIHRyeVRvTWFwKENsYXNzIHNvdXJjZSwgTGlzdDxTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBtYXBwaW5nKQ0KLSAgICB7DQotICAgICAgICBDbGFzcyB0YXJnZXQgPSBudWxsOw0KLQ0KLSAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogbWFwcGluZykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoc291cmNlLmdldE5hbWUoKS5lcXVhbHMoZW50cnkuZ2V0U291cmNlKCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGFyZ2V0ID0gQ2xhc3NVdGlscy50cnlUb0xvYWRDbGFzc0Zvck5hbWUoZW50cnkuZ2V0VGFyZ2V0KCkpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRhcmdldDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgY2FjaGVNYXBwaW5nKENsYXNzIHNvdXJjZSwgQ2xhc3MgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICB0aGlzLnBhcmFtZXRlck1hcHBpbmcucHV0KHNvdXJjZSwgdGFyZ2V0KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0RlZmF1bHRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNmM3ZjEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9EZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIG1lY2hhbmlzbSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgZXh0dmFsDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBpbXBsZW1lbnRzIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXINCi17DQotICAgIHB1YmxpYyBib29sZWFuIHNldmVyaXR5QmxvY2tzTmF2aWdhdGlvbigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLmVxdWFscyhzZXZlcml0eSkgfHwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMLmVxdWFscyhzZXZlcml0eSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gc2V2ZXJpdHlDYXVzZXNWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUi5lcXVhbHMoc2V2ZXJpdHkpIHx8IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9GQVRBTC5lcXVhbHMoc2V2ZXJpdHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHNldmVyaXR5Q2F1c2VzVmlvbGF0aW9uTWVzc2FnZSgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXZlcml0eUJsb2Nrc1N1Ym1pdCgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLmVxdWFscyhzZXZlcml0eSkgfHwgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMLmVxdWFscyhzZXZlcml0eSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gc2V2ZXJpdHlTaG93c0luZGljYXRpb24oDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUi5lcXVhbHMoc2V2ZXJpdHkpIHx8IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9GQVRBTC5lcXVhbHMoc2V2ZXJpdHkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzAwODZiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uIGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcg0KLXsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9QYXJhbWV0ZXJLZXkuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvUGFyYW1ldGVyS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMDJiYmEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9QYXJhbWV0ZXJLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVGFyZ2V0KHtGSUVMRCwgTUVUSE9EfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgUGFyYW1ldGVyS2V5DQotew0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlclZhbHVlLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1BhcmFtZXRlclZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZGM4ZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9QYXJhbWV0ZXJWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUYXJnZXQoe0ZJRUxELCBNRVRIT0R9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBQYXJhbWV0ZXJWYWx1ZQ0KLXsNCi0gICAgQ2xhc3MgaWQoKSBkZWZhdWx0IFBhcmFtZXRlclZhbHVlLmNsYXNzOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTU5Yzc2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25QYXJhbWV0ZXINCi17DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rvci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMDk5MDIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3INCi17DQotICAgIE1hcDxPYmplY3QsIExpc3Q8T2JqZWN0Pj4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24pOw0KLSAgICBMaXN0PE9iamVjdD4gZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXkpOw0KLSAgICA8VD4gTGlzdDxUPiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSwgQ2xhc3M8VD4gdmFsdWVUeXBlKTsNCi0gICAgPFQ+IFQgZXh0cmFjdChBbm5vdGF0aW9uIGFubm90YXRpb24sIE9iamVjdCBrZXksIENsYXNzPFQ+IHZhbHVlVHlwZSwgQ2xhc3MgdmFsdWVJZCk7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRjZGRkMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1ZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkNCi17DQotICAgIFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IgY3JlYXRlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMyODg3Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vcGFyYW1ldGVyL1Zpb2xhdGlvblNldmVyaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBWaW9sYXRpb25TZXZlcml0eQ0KLXsNCi0gICAgaW50ZXJmYWNlIEluZm8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotICAgIHsNCi0gICAgICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgICAgIHB1YmxpYyBDbGFzcyBLRVkgPSBWaW9sYXRpb25TZXZlcml0eS5jbGFzczsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICBAUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIHB1YmxpYyBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgU0VWRVJJVFkgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfSU5GTzsNCi0NCi0gICAgICAgIC8vQFBhcmFtZXRlclZhbHVlDQotICAgICAgICAvL01lc3NhZ2VUeXBlIHBvc3RmaXggPSBNZXNzYWdlVHlwZS5JTkZPOw0KLSAgICB9DQotDQotICAgIGludGVyZmFjZSBXYXJuIGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcg0KLSAgICB7DQotICAgICAgICBAUGFyYW1ldGVyS2V5DQotICAgICAgICBwdWJsaWMgQ2xhc3MgS0VZID0gVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3M7DQotDQotICAgICAgICBAUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBTRVZFUklUWSA9IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9XQVJOOw0KLQ0KLSAgICAgICAgLy9AUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIC8vTWVzc2FnZVR5cGUgcG9zdGZpeCA9IE1lc3NhZ2VUeXBlLldBUk47DQotICAgIH0NCi0NCi0gICAgaW50ZXJmYWNlIEVycm9yIGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcg0KLSAgICB7DQotICAgICAgICBAUGFyYW1ldGVyS2V5DQotICAgICAgICBwdWJsaWMgQ2xhc3MgS0VZID0gVmlvbGF0aW9uU2V2ZXJpdHkuY2xhc3M7DQotDQotICAgICAgICBAUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBTRVZFUklUWSA9IEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUjsNCi0NCi0gICAgICAgIC8vQFBhcmFtZXRlclZhbHVlDQotICAgICAgICAvL01lc3NhZ2VUeXBlIHBvc3RmaXggPSBNZXNzYWdlVHlwZS5FUlJPUjsNCi0gICAgfQ0KLQ0KLSAgICBpbnRlcmZhY2UgRmF0YWwgZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyDQotICAgIHsNCi0gICAgICAgIEBQYXJhbWV0ZXJLZXkNCi0gICAgICAgIHB1YmxpYyBDbGFzcyBLRVkgPSBWaW9sYXRpb25TZXZlcml0eS5jbGFzczsNCi0NCi0gICAgICAgIEBQYXJhbWV0ZXJWYWx1ZQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFNFVkVSSVRZID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMOw0KLQ0KLSAgICAgICAgLy9AUGFyYW1ldGVyVmFsdWUNCi0gICAgICAgIC8vTWVzc2FnZVR5cGUgcG9zdGZpeCA9IE1lc3NhZ2VUeXBlLkZBVEFMOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9wYXJhbWV0ZXIvVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NmJkOTQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3BhcmFtZXRlci9WaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotDQotLyoqDQotICogbWVjaGFuaXNtIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBleHR2YWwNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXINCi17DQotICAgIC8qKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IGN1cnJlbnQgZmFjZXMgY29udGV4dA0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgY3VycmVudCBjb21wb25lbnQNCi0gICAgICogQHBhcmFtIHNldmVyaXR5IGpzZiBzZXZlcml0eSBmb3IgZmFjZXMgbWVzc2FnZXMNCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzZXZlcml0eSBzaG91bGQgYmxvY2sgdGhlIG5hdmlnYXRpb24NCi0gICAgICogaWYgI3NldmVyaXR5Q2F1c2VzVmFsaWRhdG9yRXhjZXB0aW9uIHJldHVybnMgZmFsbHMgdmFsaWRhdGlvbiB3aWxsIGJlIGNvbnRpbnVlZCBmb3IgdGhlIGN1cnJlbnQgcHJvcGVydHkNCi0gICAgICogYWxsIG1lc3NhZ2VzIHdoaWNoIGRvbid0IGxlYWQgdG8gYW4gZXhjZXB0aW9uIHNob3VsZCBiZSBzdG9yZWQgaW4gYW4gc3RvcmFnZSBhbmQNCi0gICAgICogYWRkZWQgYWZ0ZXIgdGhlIGZpcnN0IG1lc3NhZ2Ugd2hpY2ggZ2V0cyB0aHJvd24gYXMgZXhjZXB0aW9uDQotICAgICAqIGEgZ2xvYmFsIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIGFkZCB0aGUgbWVzc2FnZXMgb2YgdGhlIHN0b3JhZ2UgYXMgZmFjZXMgbWVzc2FnZQ0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBzZXZlcml0eUJsb2Nrc05hdmlnYXRpb24oDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSk7DQotDQotICAgIC8qKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IGN1cnJlbnQgZmFjZXMgY29udGV4dA0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgY3VycmVudCBjb21wb25lbnQNCi0gICAgICogQHBhcmFtIHNldmVyaXR5IGpzZiBzZXZlcml0eSBmb3IgZmFjZXMgbWVzc2FnZXMNCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzZXZlcml0eSBzaG91bGQgY2F1c2UgYSB2YWxpZGF0b3IgZXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBib29sZWFuIHNldmVyaXR5Q2F1c2VzVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpOw0KLQ0KLSAgICAvKioNCi0gICAgICoNCi0gICAgICogQHBhcmFtIGZhY2VzQ29udGV4dCBjdXJyZW50IGZhY2VzIGNvbnRleHQNCi0gICAgICogQHBhcmFtIHVpQ29tcG9uZW50IGN1cnJlbnQgY29tcG9uZW50DQotICAgICAqIEBwYXJhbSBzZXZlcml0eSBqc2Ygc2V2ZXJpdHkgZm9yIGZhY2VzIG1lc3NhZ2VzDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhIHZpb2xhdGlvbiBtZXNzYWdlIGxlYWRzIHRvIGEgZmFjZXMgbWVzc2FnZQ0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBzZXZlcml0eUNhdXNlc1Zpb2xhdGlvbk1lc3NhZ2UoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSk7DQotDQotICAgIC8qKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IGN1cnJlbnQgZmFjZXMgY29udGV4dA0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgY3VycmVudCBjb21wb25lbnQNCi0gICAgICogQHBhcmFtIHNldmVyaXR5IGpzZiBzZXZlcml0eSBmb3IgZmFjZXMgbWVzc2FnZXMNCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb25zdHJhaW50IHdpdGggdGhlIGdpdmVuIHNldmVyaXR5IHNob3VsZCBiZSB2YWxpZGF0ZWQgb24gdGhlIGNsaWVudCBzaWRlIChpZiBzdXBwb3J0ZWQpDQotICAgICAqLw0KLSAgICBib29sZWFuIHNldmVyaXR5QmxvY2tzU3VibWl0KA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgc2V2ZXJpdHkpOw0KLQ0KLSAgICAvKioNCi0gICAgICogYXZhaWxhYmxlIGZvciBhZGQtb25zIC0gbm90IHVzZWQgaW50ZXJuYWxseSBkdWUgdG8gcGVyZm9ybWFuY2UgcmVhc29ucw0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZmFjZXNDb250ZXh0IGN1cnJlbnQgZmFjZXMgY29udGV4dA0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgY3VycmVudCBjb21wb25lbnQNCi0gICAgICogQHBhcmFtIHNldmVyaXR5IGpzZiBzZXZlcml0eSBmb3IgZmFjZXMgbWVzc2FnZXMNCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb25zdHJhaW50IHdpdGggdGhlIGdpdmVuIHNldmVyaXR5DQotICAgICAqIHNob3VsZCBjYXVzZSBlLmcuIGEgcmVxdWlyZWQgbWFya2VyIGluZGVwZW5kZW50IG9mIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gKGlmIHN1cHBvcnRlZCkNCi0gICAgICovDQotICAgIGJvb2xlYW4gc2V2ZXJpdHlTaG93c0luZGljYXRpb24oDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU5YzkzNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBQcm92aWRlcyB0aGUgYWJpbGl0eSBvZiBtZXNzYWdlIHJlc29sdmluZyB0byBWYWxpZGF0aW9uU3RyYXRlZ2llcwotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LlJFVVNFfSkKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k8QSBleHRlbmRzIEFubm90YXRpb24+IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kKLXsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCA9ICJfZGV0YWlsIjsKLSAgICAvL2UuZy4gZm9yIGluamVjdGluZyBhIG1lc3NhZ2UgcmVzb2x2ZXIgdmlhIHNwcmluZwotICAgIHByaXZhdGUgTWVzc2FnZVJlc29sdmVyIG1lc3NhZ2VSZXNvbHZlcjsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICAgIExvY2FsZSBsb2NhbGUgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRMb2NhbGUoKTsKLQotICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlUmVzb2x2ZXIgIT0gbnVsbCA/IHRoaXMubWVzc2FnZVJlc29sdmVyLmdldE1lc3NhZ2Uoa2V5LCBsb2NhbGUpIDoKLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldE1lc3NhZ2VSZXNvbHZlckZvclZhbGlkYXRpb25TdHJhdGVneSh0aGlzKS5nZXRNZXNzYWdlKGtleSwgbG9jYWxlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoQSBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlc29sdmVNZXNzYWdlKGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoQSBhbm5vdGF0aW9uKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gKGtleSAhPSBudWxsKSA/IHJlc29sdmVNZXNzYWdlKGtleSArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYKSA6IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24pICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRmFjZXNNZXNzYWdlIGdldFZhbGlkYXRpb25FcnJvckZhY2VzTWVzc2FnZShBIGFubm90YXRpb24pCi0gICAgewotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuY3JlYXRlRmFjZXNNZXNzYWdlKGdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiksIGdldEVycm9yTWVzc2FnZURldGFpbChhbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQSBhbm5vdGF0aW9uKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VSZXNvbHZlcihNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyKQotICAgIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlUmVzb2x2ZXIgPSBtZXNzYWdlUmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pCi0gICAgewotICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkxBQkVMLCBnZXRMYWJlbChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5KSk7Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIHZhbGlkYXRvckV4Y2VwdGlvbik7Ci0gICAgfQotCi0gICAgLy9lLmcuIGZvciBjdXN0b20gYW5ub3RhdGlvbnMgLSBvdmVycmlkZSBpZiBuZWVkZWQKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDFmM2VkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uZXhjZXB0aW9uLlJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogUHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gdXNlIFZhbGlkYXRvckV4Y2VwdGlvbiAoYXMgZXhwZWN0ZWQgYnkgdGhlIHVzZXIpIGluc3RlYWQgb2YgQ29udmVydGVyRXhjZXB0aW9uLg0KLSAqIEZ1cnRoZXJtb3JlIGl0IHByb3ZpZGVzOjxici8+DQotICogaW5pdFZhbGlkYXRpb248YnIvPg0KLSAqIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IGluaXRWYWxpZGF0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpbml0VmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICAgICAgaWYobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJpbml0VmFsaWRhdGlvbiBvZiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZpbmlzaGVkIik7DQotICAgICAgICB9DQotDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgcHJvY2Vzc1ZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHJvY2Vzc1ZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgicHJvY2Vzc1ZhbGlkYXRpb24gb2YgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmaW5pc2hlZCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChWYWxpZGF0b3JFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQgcHJvY2Vzc0FmdGVyVmFsaWRhdG9yRXhjZXB0aW9uIG9mICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb247DQotDQotICAgICAgICAgICAgaWYoZSBpbnN0YW5jZW9mIFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uID0gbmV3IFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNvbnZlcnRGYWNlc01lc3NhZ2UoZS5nZXRGYWNlc01lc3NhZ2UoKSksIGUuZ2V0Q2F1c2UoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbiA9IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29udmVydEZhY2VzTWVzc2FnZShlLmdldEZhY2VzTWVzc2FnZSgpKSwgZS5nZXRDYXVzZSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgaWYgKHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCwgdmFsaWRhdG9yRXhjZXB0aW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICI6IHRocm93IG9yaWdpbmFsIGV4Y2VwdGlvbiBhZnRlciBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24iKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LCB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCksIHZhbGlkYXRvckV4Y2VwdGlvbik7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGdldENsYXNzKCkuZ2V0TmFtZSgpICsNCi0gICAgICAgICAgICAgICAgICAgICI6IG9yaWdpbmFsIGV4Y2VwdGlvbiBhZnRlciBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24gbm90IHRocm93biIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0VmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICAvL292ZXJyaWRlIGlmIG5lZWRlZA0KLSAgICB9DQotDQotICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24sIHRoaXMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb247DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9BYnN0cmFjdFZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZhOGNmZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQWJzdHJhY3RWaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotDQotLyoqDQotICogdG8gbWFwIGNvbnN0cmFpbnRzIGRpcmVjdGx5IHRvIGEgbWV0YS1kYXRhIHRyYW5zZm9ybWVyIGlmIHRoZXJlIGlzIG5vIHZhbGlkYXRpb24gc3RyYXRlZ3kgKHJlcXVpcmVkIGJ5IGpzciAzMDMpDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LlJFVVNFKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgaW1wbGVtZW50cyBJZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidGhpcyBpcyBqdXN0IGFuIGFkYXB0ZXIgZS5nLiBmb3IgY29tcG9uZW50IGluaXRpYWxpemF0aW9uIik7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMyNWUwNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25TdHJhdGVneUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi0NCi0vKioNCi0gKiBpdCBpc24ndCBsaW5rZWQgdG8ganNyIDMwMw0KLSAqDQotICogaXQncyBqdXN0IGEgaGVscGVyIGZvciBwcm94aWVzIC0geW91IGp1c3QgbmVlZCBpdCwgaWYgeW91IGRlZmluZSB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBhcyBiZWFuIGFuZA0KLSAqIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eSBmb3IgaXQuDQotDQotICogYWRhcHRlciB0byBjb25uZWN0IHZhbGlkYXRpb24gc3RyYXRlZ2llcyB3aXRoIG1ldGEtZGF0YSB0cmFuc2Zvcm1lcnMsDQotICogaWYgdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgZGVmaW5lZCBhcyBiZWFuIGFuZCBlLmcuIHNwcmluZyBjcmVhdGVzIGEgcHJveHkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LlJFVVNFfSkNCi1wdWJsaWMgaW50ZXJmYWNlIEJlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVyIGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICAvL3RvIGdldCBiYWNrIHRoZSBpbnRlcm5hbCBjYXNoaW5nDQotICAgIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoKTsNCi0NCi0gICAgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3lBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzExNmYyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5CZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIGl0IGlzbid0IGxpbmtlZCB0byBqc3IgMzAzDQotICoNCi0gKiBpdCdzIGp1c3QgYSBoZWxwZXIgZm9yIHByb3hpZXMgLSB5b3UganVzdCBuZWVkIGl0LCBpZiB5b3UgZGVmaW5lIHRoZSB2YWxpZGF0aW9uIHN0cmF0ZWd5IGFzIGJlYW4gYW5kDQotICogZS5nLiBzcHJpbmcgY3JlYXRlcyBhIHByb3h5IGZvciBpdC4NCi0NCi0gKiBhZGFwdGVyIHRvIGNvbm5lY3QgdmFsaWRhdGlvbiBzdHJhdGVnaWVzIHdpdGggbWV0YS1kYXRhIHRyYW5zZm9ybWVycywNCi0gKiBpZiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBkZWZpbmVkIGFzIGJlYW4gYW5kIGUuZy4gc3ByaW5nIGNyZWF0ZXMgYSBwcm94eQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwgaW1wbGVtZW50cyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlcg0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotICAgIHByaXZhdGUgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgLy9vcHRpb25hbCBmYWxsYmFjayBmb3IgaW50ZXJuYWwgY2FzaGluZw0KLSAgICBwcml2YXRlIFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWU7DQotDQotICAgIHB1YmxpYyBCZWFuVmFsaWRhdGlvblN0cmF0ZWd5QWRhcHRlckltcGwoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsaWRhdGlvblN0cmF0ZWd5LnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhRW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZih2YWxpZGF0aW9uU3RyYXRlZ3kuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZihtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldFBhY2thZ2UoKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhVHJhbnNmb3JtZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKG1ldGFEYXRhVHJhbnNmb3JtZXIgaW5zdGFuY2VvZiBCZWFuTWV0YURhdGFUcmFuc2Zvcm1lckFkYXB0ZXIpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKEJlYW5NZXRhRGF0YVRyYW5zZm9ybWVyQWRhcHRlcikgbWV0YURhdGFUcmFuc2Zvcm1lciApLmdldE1ldGFEYXRhVHJhbnNmb3JtZXJDbGFzc05hbWUoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFEYXRhVHJhbnNmb3JtZXIoTWV0YURhdGFUcmFuc2Zvcm1lciBtZXRhRGF0YVRyYW5zZm9ybWVyKQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1ldGFEYXRhVHJhbnNmb3JtZXIgPSBtZXRhRGF0YVRyYW5zZm9ybWVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdHJhdGVneTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uU3RyYXRlZ3koVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RyYXRlZ3kgPSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lKFN0cmluZyB2YWxpZGF0aW9uU3RyYXRlZ3lDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lID0gdmFsaWRhdGlvblN0cmF0ZWd5Q2xhc3NOYW1lOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9EZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMGExMWQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0RlZmF1bHRWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5DbGFzc01hcHBpbmdGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuV2ViWG1sUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29uZmlndXJhdGlvbi5TdGF0aWNDb25maWd1cmF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXINCi0gICAgLkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi0NCi0NCi0vKioNCi0gKiBGYWN0b3J5IHdoaWNoIGNyZWF0ZXMgdGhlIFZhbGlkYXRpb25TdHJhdGVneSBmb3IgYSBnaXZlbiBNZXRhLURhdGEgS2V5DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCwgVXNhZ2VDYXRlZ29yeS5DVVNUT01JWkFCTEV9KQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxTdHJpbmc+DQotICAgICAgICBpbXBsZW1lbnRzIENsYXNzTWFwcGluZ0ZhY3Rvcnk8U3RyaW5nLCBWYWxpZGF0aW9uU3RyYXRlZ3k+DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gbWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcgPSBudWxsOw0KLSAgICBwcml2YXRlIExpc3Q8TmFtZU1hcHBlcjxTdHJpbmc+PiBuYW1lTWFwcGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZU1hcHBlcjxTdHJpbmc+PigpOw0KLQ0KLSAgICBwdWJsaWMgRGVmYXVsdFZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RhbnRpYXRlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWxpZGF0aW9uU3RyYXRlZ3kgY3JlYXRlKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgaWYgKG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdFN0YXRpY01hcHBpbmdzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobWV0YURhdGFLZXlUb1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmcuY29udGFpbnNLZXkobWV0YURhdGFLZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lJbnN0YW5jZShtZXRhRGF0YUtleVRvVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZy5nZXQobWV0YURhdGFLZXkpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgICAgICBTdHJpbmcgc3RyYXRlZ3lOYW1lOw0KLSAgICAgICAgLy9udWxsIC0+IHVzZSBuYW1lIG1hcHBlcnMNCi0gICAgICAgIGZvciAoTmFtZU1hcHBlcjxTdHJpbmc+IG5hbWVNYXBwZXIgOiBuYW1lTWFwcGVyTGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdHJhdGVneU5hbWUgPSBuYW1lTWFwcGVyLmNyZWF0ZU5hbWUobWV0YURhdGFLZXkpOw0KLQ0KLSAgICAgICAgICAgIGlmIChzdHJhdGVneU5hbWUgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3lJbnN0YW5jZShzdHJhdGVneU5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFkZE1hcHBpbmcobWV0YURhdGFLZXksIHN0cmF0ZWd5TmFtZSk7DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBWYWxpZGF0aW9uU3RyYXRlZ3kgZ2V0VmFsaWRhdGlvblN0cmF0ZWd5SW5zdGFuY2UoU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lDQotICAgICAgICAgICAgLnN0YXJ0c1dpdGgoQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIuUFJFRklYX0ZPUl9CRUFOX01BUFBJTkcpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoVmFsaWRhdGlvblN0cmF0ZWd5KSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4odmFsaWRhdGlvblN0cmF0ZWd5TmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZyhBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5QUkVGSVhfRk9SX0JFQU5fTUFQUElORy5sZW5ndGgoKSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoVmFsaWRhdGlvblN0cmF0ZWd5KSBDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUodmFsaWRhdGlvblN0cmF0ZWd5TmFtZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNYXBwaW5nKFN0cmluZyBtZXRhRGF0YUtleSwgU3RyaW5nIHZhbGlkYXRpb25TdHJhdGVneU5hbWUpDQotICAgIHsNCi0gICAgICAgIGlmKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkaW5nIG1ldGEtZGF0YSBrZXkgdG8gdmFsaWRhdGlvbiBzdHJhdGVneSBtYXBwaW5nOiAiDQotICAgICAgICAgICAgICAgICsgbWV0YURhdGFLZXkgKyAiIC0+ICIgKyB2YWxpZGF0aW9uU3RyYXRlZ3lOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nLnB1dChtZXRhRGF0YUtleSwgdmFsaWRhdGlvblN0cmF0ZWd5TmFtZSk7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImxvZ2dpbmciKQ0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluaXRTdGF0aWNNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIG1ldGFEYXRhS2V5VG9WYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotDQotICAgICAgICAvL3NldHVwIGludGVybmFsIHN0YXRpYyBtYXBwaW5ncw0KLSAgICAgICAgZm9yIChTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgOg0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFN0YXRpY0NvbmZpZ3VyYXRpb24oDQotICAgICAgICAgICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5NRVRBX0RBVEFfVE9fVkFMSURBVElPTl9TVFJBVEVHWV9DT05GSUcpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IHN0YXRpY0NvbmZpZyA9IG5ldyBTdGF0aWNSZXNvdXJjZUJ1bmRsZUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgIC8vdHJ5IHRvIHNldHVwIG1hcHBpbmcgd2l0aCBiYXNlIG5hbWUgYnkgY29udmVudGlvbiAtIG92ZXJyaWRlcyBkZWZhdWx0IG1hcHBpbmcNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vYnVpbGQgY29udmVudGlvbiAoc3RyYXRlZ3kgbWFwcGluZykNCi0gICAgICAgICAgICBzdGF0aWNDb25maWcuc2V0U291cmNlT2ZNYXBwaW5nKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAgICAgLmdldChDdXN0b21JbmZvcm1hdGlvbi5TVEFUSUNfU1RSQVRFR1lfTUFQUElOR19TT1VSQ0UpKTsNCi0NCi0gICAgICAgICAgICBzZXR1cFN0cmF0ZWd5TWFwcGluZ3Moc3RhdGljQ29uZmlnLmdldE1hcHBpbmcoKSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQgd2FzIGp1c3QgYSB0cnkNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vc2V0dXAgY3VzdG9tIG1hcHBpbmcgLSBvdmVycmlkZXMgYWxsIG90aGVyIG1hcHBpbmdzDQotICAgICAgICBTdHJpbmcgY3VzdG9tTWFwcGluZ0Jhc2VOYW1lID0gV2ViWG1sUGFyYW1ldGVyLkNVU1RPTV9TVEFUSUNfVkFMSURBVElPTl9TVFJBVEVHWV9NQVBQSU5HOw0KLSAgICAgICAgaWYgKGN1c3RvbU1hcHBpbmdCYXNlTmFtZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgc3RhdGljQ29uZmlnID0gbmV3IFN0YXRpY1Jlc291cmNlQnVuZGxlQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgICAgICAgICBzdGF0aWNDb25maWcuc2V0U291cmNlT2ZNYXBwaW5nKGN1c3RvbU1hcHBpbmdCYXNlTmFtZSk7DQotICAgICAgICAgICAgICAgIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhzdGF0aWNDb25maWcuZ2V0TWFwcGluZygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwU3RyYXRlZ3lNYXBwaW5ncyhMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb25FbnRyeTxTdHJpbmcsU3RyaW5nPj4gbWFwcGluZ3MpDQotICAgIHsNCi0gICAgICAgIGZvcihTdGF0aWNDb25maWd1cmF0aW9uRW50cnk8U3RyaW5nLCBTdHJpbmc+IG1hcHBpbmcgOiBtYXBwaW5ncykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNYXBwaW5nKG1hcHBpbmcuZ2V0U291cmNlKCksIG1hcHBpbmcuZ2V0VGFyZ2V0KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBMaXN0PE5hbWVNYXBwZXI8U3RyaW5nPj4gZ2V0TmFtZU1hcHBlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5uYW1lTWFwcGVyTGlzdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvSWRlbnRpZmlhYmxlVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmM2EyYWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L0lkZW50aWZpYWJsZVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIGlmIGFuIGFkYXB0ZXIgaXMgdXNlZCBmb3Igc2V2ZXJhbCBjb25zdHJhaW50cywgdGhpcyBpbnRlcmZhY2UgYWxsb3dzIHRvIGlkZW50aWZ5IGluc3RhbmNlcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBJZGVudGlmaWFibGVWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIFN0cmluZyBJRF9QUkVGSVggPSAiOiI7DQotDQotICAgIFN0cmluZyBnZXRJZCgpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NTUyM2QuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEJhc2UgaW50ZXJmYWNlIGZvciBWYWxpZGF0aW9uU3RyYXRlZ2llcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotLy8qVmFsaWRhdGlvblN0cmF0ZWd5IGluc3RlYWQgb2YgKlZhbGlkYXRvciB0byBhdm9pZCBuYW1pbmcgY29uZnVzaW9uIA0KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICB2b2lkIHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9BYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YjNmMGQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9BYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0Fubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZDk0ZjcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lCZWFuTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7DQotDQotLyoqDQotICogTmFtZSBNYXBwZXIgd2hpY2ggZGVsZWdhdGVzIHRoZSBuYW1lIG1hcHBpbmcsIGV4dHJhY3QgdGhlIG5hbWUgYW5kIGNvbnZlcnQgaXQgdG8gYSBiZWFuIG5hbWUgKyBwcmVmaXgNCi0gKiB0YXJnZXQ6IGNvbmZpZ3VyZSBhIHZhbGlkYXRpb24gc3RyYXRlZ3kgdmlhIGEgbWFuYWdlZCBiZWFuIGZhY2lsaXR5IC0+IGFsbG93cyB0byBpbmplY3Qgb3RoZXIgYmVhbnMNCi0gKiBpbnN0ZWFkIG9mIGFwaSBjYWxscyArIGhhcmRjb2RlZCBiZWFuIG5hbWVzDQotICogPHAvPg0KLSAqIGFsbG93ZWQgYmVhbiBzY29wZXM6DQotICogdGhlIHZhbGlkYXRpb24gc3RyYXRlZ3kgaXMgc3RhdGVsZXNzOiBhcHBsaWNhdGlvbi9zaW5nbGV0b24NCi0gKiB0aGUgdmFsaWRhdGlvbiBzdHJhdGVneSBpcyBzdGF0ZWZ1bDogbm9uZS9wcm90b3R5cGUNCi0gKiBkb24ndCB1c2UgdGhlIHNlc3Npb24gb3IgYSBjb252ZXJzYXRpb24gc2NvcGUNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoNTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneUJlYW5OYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0ZPUl9CRUFOX01BUFBJTkcgPSAiYmVhbjoiOw0KLSAgICBwcml2YXRlIE5hbWVNYXBwZXI8U3RyaW5nPiB3cmFwcGVkOw0KLQ0KLSAgICBwdWJsaWMgQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5QmVhbk5hbWVNYXBwZXIoTmFtZU1hcHBlcjxTdHJpbmc+IG5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IG5hbWVNYXBwZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBuYW1lID0gd3JhcHBlZC5jcmVhdGVOYW1lKHNvdXJjZSk7DQotDQotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOw0KLSAgICAgICAgcmV0dXJuIFBSRUZJWF9GT1JfQkVBTl9NQVBQSU5HICsgSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShuYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMDMyMDYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9DdXN0b21Db25maWd1cmVkQW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tYXBwZXIuQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogVG8gcHJvdmlkZSBhIGN1c3RvbSBOYW1lTWFwcGVyIHRvIG1hcCBBbm5vdGF0aW9ucyB0byBWYWxpZGF0aW9uU3RyYXRlZ2llcy4NCi0gKiAoY29uZmlndXJlZCB2aWEgd2ViLnhtbCkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMTAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKHtVc2FnZUNhdGVnb3J5LklOVEVSTkFMLCBVc2FnZUNhdGVnb3J5LkNVU1RPTUlaQUJMRX0pDQotcHVibGljIGNsYXNzIEN1c3RvbUNvbmZpZ3VyZWRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMNCi0gICAgQWJzdHJhY3RDdXN0b21OYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tTmFtZU1hcHBlckNsYXNzTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX01FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvdmFsaWRhdGlvbi9zdHJhdGVneS9tYXBwZXIvQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlODMwMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0N1c3RvbUNvbnZlbnRpb25Bbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5Lm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLkFic3RyYWN0Q3VzdG9tTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuQ3VzdG9tSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIFRvIHByb3ZpZGUgYSBjdXN0b20gTmFtZU1hcHBlciB0byBtYXAgQW5ub3RhdGlvbnMgdG8gVmFsaWRhdGlvblN0cmF0ZWdpZXMuDQotICogKGNvbmZpZ3VyZWQgdmlhIGluZm9ybWF0aW9uIHByb3ZpZGVyIGJlYW4pDQotICogVGhlIGJlYW4gcHJvdmlkZXMgdGhlIGRlZmF1bHQgbmFtZSAoY29udmVudGlvbikuDQotICogSXQncyBwb3NzaWJsZSB0byBwcm92aWRlIGEgY3VzdG9tIGZ1bGwgcXVhbGlmaWVkIG5hbWUuICg9IGN1c3RvbWl6YWJsZSBjb252ZW50aW9uKQ0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQEludm9jYXRpb25PcmRlcigyMDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUwsIFVzYWdlQ2F0ZWdvcnkuQ1VTVE9NSVpBQkxFfSkNCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29udmVudGlvbkFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcw0KLSAgICBBYnN0cmFjdEN1c3RvbU5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21OYW1lTWFwcGVyQ2xhc3NOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkNCi0gICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX05BTUVfTUFQUEVSKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL0RlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMzhkOGYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9EZWZhdWx0QW5ub3RhdGlvblRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludGVybmFsQ29udmVudGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIG1hcHMgRXh0VmFsIEFubm90YXRpb25zIHRvIEV4dFZhbCBWYWxpZGF0aW9uU3RyYXRlZ2llcy4NCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMzAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEludGVybmFsQ29udmVudGlvblByb3ZpZGVyLmdldFZhbGlkYXRpb25TdHJhdGVneUNsYXNzTmFtZShtZXRhRGF0YUtleSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS92YWxpZGF0aW9uL3N0cmF0ZWd5L21hcHBlci9TaW1wbGVBbm5vdGF0aW9uVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4MjA1My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL3ZhbGlkYXRpb24vc3RyYXRlZ3kvbWFwcGVyL1NpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSXQncyBhbiBhbHRlcm5hdGl2ZSBNYXBwZXIgdG8gcGxhY2UgQW5ub3RhdGlvbnMgYW5kIFZhbGlkYXRpb25TdHJhdGVnaWVzIGluIHRoZSBzYW1lIHBhY2thZ2UuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDQwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIFNpbXBsZUFubm90YXRpb25Ub1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdE1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyDQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIG1ldGFEYXRhS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFLZXkgKw0KLSAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEluZm9ybWF0aW9uUHJvdmlkZXJCZWFuKCkuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLlZBTElEQVRJT05fU1RSQVRFR1lfUE9TVEZJWCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvUHJpb3JpdHkuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1ByaW9yaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMWFhMzMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvUHJpb3JpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1wdWJsaWMgZW51bSBQcmlvcml0eQotewotICAgIEJMT0NLSU5HLAotICAgIEhJR0gsCi0gICAgTUVESVVNLAotICAgIExPVwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1RvRG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQyNWEwYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Ub0RvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuQ09OU1RSVUNUT1I7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTEQsIENPTlNUUlVDVE9SfSkKLXB1YmxpYyBAaW50ZXJmYWNlIFRvRG8KLXsKLSAgICBQcmlvcml0eSB2YWx1ZSgpOwotICAgIFN0cmluZyBkZXNjcmlwdGlvbigpIGRlZmF1bHQgIiI7Ci0KLSAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICBAaW50ZXJmYWNlIExpc3QKLSAgICB7Ci0gICAgICAgIFRvRG9bXSB2YWx1ZSgpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbnRlcm5hbC9Vc2FnZUNhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0N2IzODUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VDYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsOwotCi0vKioKLSAqIEFQSTo8YnIvPgotICogcGFydHMgeW91IG1pZ2h0IG5lZWQgZm9yIGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMgYW5kIHdoaWNoIGFyZSBxdWl0ZSBzdGFibGUgaW4gdmlldyBvZiBjaGFuZ2VzCi0gKiA8cC8+Ci0gKiBJTlRFUk5BTDo8YnIvPgotICogaWYgeW91IHRoaW5rIGFib3V0IHJlZmVyZW5jaW5nIGFuIGFydGlmYWN0IHdoaWNoIGlzIG1hcmtlZCBhcyBpbnRlcm5hbCwgYXNrIGZvciBzdXBwb3J0LgotICogdGhlcmUgc2hvdWxkIGJlIGEgYmV0dGVyIHNvbHV0aW9uCi0gKiA8cC8+Ci0gKiBDVVNUT01JWkFCTEU6PGJyLz4KLSAqIGEgcGxhbm5lZCBleHRlbnNpb24gcG9pbnQgd2hpY2ggY29udGFpbnMgbG9naWMgdG8gY3VzdG9taXplIHRoZSBmcmFtZXdvcmsuCi0gKiBpZiBpdCBpc24ndCBhbHNvIG1hcmtlZCBhcyBBUEkgaXQgbWlnaHQgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcy4KLSAqIGhvd2V2ZXIsIHdlIHRyeSB0byBrZWVwIGl0IGFzIHN0YWJsZSBhcyBwb3NzaWJsZSBhbmQgcmVhc29uYWJsZS4KLSAqIDxwLz4KLSAqIFJFVVNFOjxici8+Ci0gKiBhbiBhcnRpZmFjdCB3aGljaCB5b3UgY2FuIHJldXNlIGZvciBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbi4KLSAqIGlmIGl0IGlzbid0IG1hcmtlZCBhcyBBUEkgaXQgbWlnaHQgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcy4KLSAqIGhvd2V2ZXIsIHdlIHRyeSB0byBrZWVwIGl0IGFzIHN0YWJsZSBhcyBwb3NzaWJsZSBhbmQgcmVhc29uYWJsZS4KLSAqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSAxLnguMQotICovCi1wdWJsaWMgZW51bSBVc2FnZUNhdGVnb3J5Ci17Ci0gICAgQVBJLAotICAgIElOVEVSTkFMLAotICAgIENVU1RPTUlaQUJMRSwKLSAgICBSRVVTRQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW50ZXJuYWwvVXNhZ2VJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTM3ZWJjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2ludGVybmFsL1VzYWdlSW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBpdCdzIGFuIGludGVybmFsIGFubm90YXRpb24gdG8gcHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGNvbmNlcm5pbmcgdXNhZ2UtY2F0ZWdvcmllcwotICoKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKiBAc2VlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ci0gKi8KLUBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotcHVibGljIEBpbnRlcmZhY2UgVXNhZ2VJbmZvcm1hdGlvbgotewotICAgIFVzYWdlQ2F0ZWdvcnlbXSB2YWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9DbGFzc1V0aWxzLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0NsYXNzVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNlMjA1Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0NsYXNzVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7DQotaW1wb3J0IGphdmEudXRpbC5qYXIuQXR0cmlidXRlczsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENsYXNzVXRpbHMNCi17DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhDbGFzc1V0aWxzLmNsYXNzKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBDbGFzcyB0cnlUb0xvYWRDbGFzc0Zvck5hbWUoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBsb2FkQ2xhc3NGb3JOYW1lKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCdzIGp1c3QgYSB0cnkNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBDbGFzcyBsb2FkQ2xhc3NGb3JOYW1lKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvLyBUcnkgV2ViQXBwIENsYXNzTG9hZGVyIGZpcnN0DQotICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUobmFtZSwgZmFsc2UsIC8vIGRvIG5vdCBpbml0aWFsaXplIGZvciBmYXN0ZXIgc3RhcnR1cA0KLSAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlnbm9yZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvLyBmYWxsYmFjazogVHJ5IENsYXNzTG9hZGVyIGZvciBDbGFzc1V0aWxzIChpLmUuIHRoZSBteWZhY2VzLmphciBsaWIpDQotICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUobmFtZSwgZmFsc2UsIC8vIGRvIG5vdCBpbml0aWFsaXplIGZvciBmYXN0ZXIgc3RhcnR1cA0KLSAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgdHJ5VG9JbnN0YW50aWF0ZUNsYXNzKENsYXNzPFQ+IHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0Q2xhc3MubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnN0YW50aWF0ZUNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcgLSBpdCB3YXMganVzdCBhIHRyeQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoU3RyaW5nIGNsYXNzTmFtZSkNCi0gICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHJldHVybiBsb2FkQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKYXJWZXJzaW9uKENsYXNzIHRhcmdldENsYXNzKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY2xhc3NGaWxlUGF0aCA9IHRhcmdldENsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSArICIuY2xhc3MiOw0KLSAgICAgICAgU3RyaW5nIG1hbmlmZXN0RmlsZVBhdGggPSAiL01FVEEtSU5GL01BTklGRVNULk1GIjsNCi0NCi0gICAgICAgIFN0cmluZyBjbGFzc0xvY2F0aW9uID0gdGFyZ2V0Q2xhc3MuZ2V0UmVzb3VyY2UodGFyZ2V0Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi5jbGFzcyIpLnRvU3RyaW5nKCk7DQotICAgICAgICBTdHJpbmcgbWFuaWZlc3RGaWxlTG9jYXRpb24gPSBjbGFzc0xvY2F0aW9uDQotICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgY2xhc3NMb2NhdGlvbi5pbmRleE9mKGNsYXNzRmlsZVBhdGgpIC0gMSkgKyBtYW5pZmVzdEZpbGVQYXRoOw0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBNYW5pZmVzdChuZXcgVVJMKG1hbmlmZXN0RmlsZUxvY2F0aW9uKS5vcGVuU3RyZWFtKCkpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5nZXRWYWx1ZShBdHRyaWJ1dGVzLk5hbWUuSU1QTEVNRU5UQVRJT05fVkVSU0lPTik7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKExPRy5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTE9HLnRyYWNlKCJjb3VsZG4ndCBsb2FkIHZlcnNpb24gb2YgamFyIGZpbGUgd2hpY2ggY29udGFpbnMgIiArIHRhcmdldENsYXNzLmdldE5hbWUoKSwgdCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRGVmYXVsdFByb2plY3ROYW1lLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0RlZmF1bHRQcm9qZWN0TmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmQ2Mzk5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvRGVmYXVsdFByb2plY3ROYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuUHJvamVjdFN0YWdlTmFtZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRGVmYXVsdFByb2plY3ROYW1lIGltcGxlbWVudHMgUHJvamVjdFN0YWdlTmFtZQ0KLXsNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsNCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQ0KLSAgICBwcml2YXRlIERlZmF1bHRQcm9qZWN0TmFtZSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmFtZSA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBEZWZhdWx0UHJvamVjdE5hbWUoU3RyaW5nIG5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7DQotICAgIH0NCi0NCi0gICAgc3RhdGljIFByb2plY3RTdGFnZU5hbWUgY3JlYXRlUHJvamVjdFN0YWdlTmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UHJvamVjdE5hbWUobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQ0KLSAgICB7DQotICAgICAgICBpZiAodGhpcyA9PSBvKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIERlZmF1bHRQcm9qZWN0TmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRGVmYXVsdFByb2plY3ROYW1lIHRoYXQgPSAoRGVmYXVsdFByb2plY3ROYW1lKSBvOw0KLQ0KLSAgICAgICAgaWYgKCFuYW1lLmVxdWFscyh0aGF0Lm5hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5hbWUuaGFzaENvZGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0V4dFZhbFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZWUzZGEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9FeHRWYWxVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTY0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuVmFsaWRhdGlvbk1vZHVsZUtleTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuUHJvamVjdFN0YWdlTmFtZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuQWJzdHJhY3RFTEhlbHBlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkVMSGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkNsYXNzTWFwcGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuRmFjZXNNZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5GYWN0b3J5TmFtZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuTmFtZU1hcHBlckF3YXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50LkNvbXBvbmVudEluaXRpYWxpemVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRmFjZXNNZXNzYWdlU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5TdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLk1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5FeHRWYWxJbmZvcm1hdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxVdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPR0dFUiA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEV4dFZhbFV0aWxzLmNsYXNzKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX1JFUVVJUkVEID0gImphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUlucHV0LlJFUVVJUkVEIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX0ZBQ0VTX1JFUVVJUkVEX0RFVEFJTCA9ICJqYXZheC5mYWNlcy5jb21wb25lbnQuVUlJbnB1dC5SRVFVSVJFRF9kZXRhaWwiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfTUFYSU1VTSA9ICJqYXZheC5mYWNlcy52YWxpZGF0b3IuTGVuZ3RoVmFsaWRhdG9yLk1BWElNVU0iOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwgPSAiamF2YXguZmFjZXMudmFsaWRhdG9yLkxlbmd0aFZhbGlkYXRvci5NQVhJTVVNX2RldGFpbCI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsaWRhdGlvblN0cmF0ZWd5IGdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKFN0cmluZyBtZXRhRGF0YUtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgoQ2xhc3NNYXBwaW5nRmFjdG9yeTxTdHJpbmcsIFZhbGlkYXRpb25TdHJhdGVneT4pIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUobWV0YURhdGFLZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3Rlck1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIE5hbWVNYXBwZXI8U3RyaW5nPiBtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcikNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5yZWdpc3RlcihtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlcmVnaXN0ZXJNZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gbWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLlZBTElEQVRJT05fU1RSQVRFR1lfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZXJlZ2lzdGVyKG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZW55TWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IG1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1NUUkFURUdZX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVueShtZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhVHJhbnNmb3JtZXIgZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckZvclZhbGlkYXRpb25TdHJhdGVneShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWV0YURhdGFUcmFuc2Zvcm1lcj4pIEV4dFZhbENvbnRleHQNCi0gICAgICAgICAgICAgICAgLmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgTmFtZU1hcHBlcjxWYWxpZGF0aW9uU3RyYXRlZ3k+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVRBX0RBVEFfVFJBTlNGT1JNRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5yZWdpc3Rlcih2YWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVyZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlcmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVueVZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE5hbWVNYXBwZXI+IHZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FVEFfREFUQV9UUkFOU0ZPUk1FUl9GQUNUT1JZLCBOYW1lTWFwcGVyQXdhcmVGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmRlbnkodmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuQ09NUE9ORU5UX01FVEFfREFUQV9FWFRSQUNUT1JfRkFDVE9SWSwgQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcldpdGgoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5DT01QT05FTlRfTUVUQV9EQVRBX0VYVFJBQ1RPUl9GQUNUT1JZLCBDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5jcmVhdGVXaXRoKHByb3BlcnRpZXMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQ0KLSAgICB7DQotICAgICAgICBmb3IgKENvbXBvbmVudEluaXRpYWxpemVyIGNvbXBvbmVudEluaXRpYWxpemVyIDogRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0Q29tcG9uZW50SW5pdGlhbGl6ZXJzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY29tcG9uZW50SW5pdGlhbGl6ZXIuY29uZmlndXJlQ29tcG9uZW50KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIG1ldGFEYXRhKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0b3JFeGNlcHRpb25Tb3VyY2UpDQotICAgIHsNCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsNCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YUVudHJ5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGFFbnRyeSA9IG5ldyBNZXRhRGF0YUVudHJ5KCk7DQotICAgICAgICB9DQotDQotICAgICAgICBmb3IgKFZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvciB2YWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgOiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9ycygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghdmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmFmdGVyVGhyb3dpbmcoDQotICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24sIHZhbGlkYXRvckV4Y2VwdGlvblNvdXJjZSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWV0YURhdGFFeHRyYWN0b3IgY3JlYXRlSW50ZXJjZXB0ZWRNZXRhRGF0YUV4dHJhY3RvcihmaW5hbCBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3JXaXRoKG1ldGFEYXRhRXh0cmFjdG9yLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGNyZWF0ZUludGVyY2VwdGVkTWV0YURhdGFFeHRyYWN0b3JGb3IoDQotICAgICAgICAgICAgZmluYWwgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IsIENsYXNzIG1vZHVsZUtleSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBpZihtb2R1bGVLZXkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChWYWxpZGF0aW9uTW9kdWxlS2V5LmNsYXNzLmdldE5hbWUoKSwgbW9kdWxlS2V5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjcmVhdGVJbnRlcmNlcHRlZE1ldGFEYXRhRXh0cmFjdG9yV2l0aChtZXRhRGF0YUV4dHJhY3RvciwgcHJvcGVydGllcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBNZXRhRGF0YUV4dHJhY3RvciBjcmVhdGVJbnRlcmNlcHRlZE1ldGFEYXRhRXh0cmFjdG9yV2l0aCgNCi0gICAgICAgICAgICBmaW5hbCBNZXRhRGF0YUV4dHJhY3RvciBtZXRhRGF0YUV4dHJhY3RvciwgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IE1ldGFEYXRhRXh0cmFjdG9yKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHJlc3VsdCA9IG1ldGFEYXRhRXh0cmFjdG9yLmV4dHJhY3QoZmFjZXNDb250ZXh0LCBvYmplY3QpOw0KLQ0KLSAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0aWVzKHJlc3VsdCwgcHJvcGVydGllcyk7DQotICAgICAgICAgICAgICAgIGludm9rZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycyhyZXN1bHQsIHByb3BlcnRpZXMpOw0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH07DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRQcm9wZXJ0aWVzKFByb3BlcnR5SW5mb3JtYXRpb24gcmVzdWx0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIGlmKHByb3BlcnRpZXMgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGN1c3RvbVByb3BlcnRpZXMgPSBnZXRDdXN0b21Qcm9wZXJ0aWVzKHJlc3VsdCk7DQotICAgICAgICAgICAgY3VzdG9tUHJvcGVydGllcy5wdXRBbGwocHJvcGVydGllcyk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRDdXN0b21Qcm9wZXJ0aWVzKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYoIXByb3BlcnR5SW5mb3JtYXRpb24uY29udGFpbnNJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5DVVNUT01fUFJPUEVSVElFUykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbi5zZXRJbmZvcm1hdGlvbigNCi0gICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkNVU1RPTV9QUk9QRVJUSUVTLCBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKE1hcDxTdHJpbmcsIE9iamVjdD4pIHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuQ1VTVE9NX1BST1BFUlRJRVMpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaW52b2tlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKFByb3BlcnR5SW5mb3JtYXRpb24gcmVzdWx0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIGZvciAoTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgbWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IgOg0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcnNXaXRoKHByb3BlcnRpZXMpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmFmdGVyRXh0cmFjdGluZyhyZXN1bHQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZVJlc29sdmVyIGdldE1lc3NhZ2VSZXNvbHZlckZvclZhbGlkYXRpb25TdHJhdGVneShWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChDbGFzc01hcHBpbmdGYWN0b3J5PFZhbGlkYXRpb25TdHJhdGVneSwgTWVzc2FnZVJlc29sdmVyPikgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuTUVTU0FHRV9SRVNPTFZFUl9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKSkNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBOYW1lTWFwcGVyPFZhbGlkYXRpb25TdHJhdGVneT4gdmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAucmVnaXN0ZXIodmFsaWRhdGlvblN0cmF0ZWd5VG9Nc2dSZXNvbHZlck5hbWVNYXBwZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyKA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBOYW1lTWFwcGVyPiB2YWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzcykNCi0gICAgew0KLSAgICAgICAgKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLk1FU1NBR0VfUkVTT0xWRVJfRkFDVE9SWSwgTmFtZU1hcHBlckF3YXJlRmFjdG9yeS5jbGFzcykpDQotICAgICAgICAgICAgICAgIC5kZXJlZ2lzdGVyKHZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVueVZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlcigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTmFtZU1hcHBlcj4gdmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyQ2xhc3MpDQotICAgIHsNCi0gICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5NRVNTQUdFX1JFU09MVkVSX0ZBQ1RPUlksIE5hbWVNYXBwZXJBd2FyZUZhY3RvcnkuY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAuZGVueSh2YWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBFTEhlbHBlciBnZXRFTEhlbHBlcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoRmFjdG9yeU5hbWVzLkVMX0hFTFBFUl9GQUNUT1JZLCBBYnN0cmFjdEVMSGVscGVyRmFjdG9yeS5jbGFzcykuY3JlYXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBGYWNlc01lc3NhZ2UgY3JlYXRlRmFjZXNNZXNzYWdlKFN0cmluZyBzdW1tYXJ5LCBTdHJpbmcgZGV0YWlsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY3JlYXRlRmFjZXNNZXNzYWdlKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUiwgc3VtbWFyeSwgZGV0YWlsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEZhY2VzTWVzc2FnZSBjcmVhdGVGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5LCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRkFDRVNfTUVTU0FHRV9GQUNUT1JZLCBGYWNlc01lc3NhZ2VGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlKHNldmVyaXR5LCBzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjZXNNZXNzYWdlIGNvbnZlcnRGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEZhY3RvcnlGaW5kZXIoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShGYWN0b3J5TmFtZXMuRkFDRVNfTUVTU0FHRV9GQUNUT1JZLCBGYWNlc01lc3NhZ2VGYWN0b3J5LmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuY29udmVydChmYWNlc01lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHlEZXRhaWxzIGNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0RXhwcmVzc2lvbikNCi0gICAgew0KLSAgICAgICAgT2JqZWN0IGJhc2VPYmplY3Q7DQotICAgICAgICBpZiAoZ2V0RUxIZWxwZXIoKS5pc0VMVGVybVdlbGxGb3JtZWQodGFyZ2V0RXhwcmVzc2lvbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YmUgPSBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih0YXJnZXRFeHByZXNzaW9uKTsNCi0NCi0gICAgICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbiA9IHZiZS5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICAgICAgYmFzZU9iamVjdCA9IGdldEVMSGVscGVyKCkuZ2V0VmFsdWVPZkV4cHJlc3Npb24oRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCB2YmUuZ2V0QmFzZUV4cHJlc3Npb24oKSk7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURldGFpbHMoDQotICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uLnN1YnN0cmluZygyLCBleHByZXNzaW9uLmxlbmd0aCgpIC0gMSksIGJhc2VPYmplY3QsIHZiZS5nZXRQcm9wZXJ0eSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBvcmlnaW5hbCA9IG1ldGFEYXRhRW50cnkuZ2V0UHJvcGVydHkoDQotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIFByb3BlcnR5RGV0YWlscy5jbGFzcyk7DQotDQotICAgICAgICBTdHJpbmcgbmV3QmFzZUtleSA9IG9yaWdpbmFsLmdldEtleSgpLnN1YnN0cmluZygwLCBvcmlnaW5hbC5nZXRLZXkoKS5sYXN0SW5kZXhPZigiLiIpICsgMSk7DQotICAgICAgICBTdHJpbmcgbmV3S2V5ID0gbmV3QmFzZUtleSArIHRhcmdldEV4cHJlc3Npb247DQotDQotICAgICAgICBiYXNlT2JqZWN0ID0gUmVmbGVjdGlvblV0aWxzLmdldEJhc2VPZlByb3BlcnR5Q2hhaW4ob3JpZ2luYWwuZ2V0QmFzZU9iamVjdCgpLCB0YXJnZXRFeHByZXNzaW9uKTsNCi0gICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlEZXRhaWxzKA0KLSAgICAgICAgICAgICAgICBuZXdLZXksIGJhc2VPYmplY3QsIHRhcmdldEV4cHJlc3Npb24uc3Vic3RyaW5nKHRhcmdldEV4cHJlc3Npb24ubGFzdEluZGV4T2YoIi4iKSArIDEsDQotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RXhwcmVzc2lvbi5sZW5ndGgoKSkpOw0KLSAgICB9DQotDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb1BsYWNlTGFiZWwoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgU3RyaW5nIGxhYmVsLCBpbnQgaW5kZXgpDQotICAgIHsNCi0gICAgICAgIGlmIChmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgJiYgZmFjZXNNZXNzYWdlLmdldFN1bW1hcnkoKS5jb250YWlucygieyIgKyBpbmRleCArICJ9IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoZmFjZXNNZXNzYWdlLmdldFN1bW1hcnkoKS5yZXBsYWNlKCJ7IiArIGluZGV4ICsgIn0iLCBsYWJlbCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKSAhPSBudWxsICYmIGZhY2VzTWVzc2FnZS5nZXREZXRhaWwoKS5jb250YWlucygieyIgKyBpbmRleCArICJ9IikpDQotICAgICAgICB7DQotICAgICAgICAgICAgZmFjZXNNZXNzYWdlLnNldERldGFpbChmYWNlc01lc3NhZ2UuZ2V0RGV0YWlsKCkucmVwbGFjZSgieyIgKyBpbmRleCArICJ9IiwgbGFiZWwpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVwbGFjZVdpdGhEZWZhdWx0TWF4aW11bU1lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSwgaW50IG1heExlbmd0aCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGZhY2VzUmVxdWlyZWRNZXNzYWdlID0gSnNmVXRpbHMuZ2V0TWVzc2FnZUZyb21BcHBsaWNhdGlvbk1lc3NhZ2VCdW5kbGUoSkFWQVhfRkFDRVNfTUFYSU1VTSk7DQotICAgICAgICBTdHJpbmcgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZTsNCi0NCi0gICAgICAgIC8vdXNlIHRyeS9jYXRjaCBmb3IgZWFzaWVyIHN5bmMgYmV0d2VlbiB0cnVuay9icmFuY2gNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChKc2ZVdGlscy5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZShKQVZBWF9GQUNFU19NQVhJTVVNX0RFVEFJTCkgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsID0gSnNmVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZUZyb21BcHBsaWNhdGlvbk1lc3NhZ2VCdW5kbGUoSkFWQVhfRkFDRVNfTUFYSU1VTV9ERVRBSUwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vanNmIDEuMiBkb2Vzbid0IGhhdmUgYSBkZXRhaWwgbWVzc2FnZQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2UgPSBmYWNlc1JlcXVpcmVkTWVzc2FnZS5yZXBsYWNlKCJ7MH0iLCAiIiArIG1heExlbmd0aCk7DQotICAgICAgICBmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCA9IGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsLnJlcGxhY2UoInswfSIsICIiICsgbWF4TGVuZ3RoKTsNCi0NCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXRTdW1tYXJ5KGZhY2VzUmVxdWlyZWRNZXNzYWdlKTsNCi0gICAgICAgIGZhY2VzTWVzc2FnZS5zZXREZXRhaWwoZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwpOw0KLSAgICB9DQotDQotICAgIEBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBsYWNlV2l0aERlZmF1bHRSZXF1aXJlZE1lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGZhY2VzUmVxdWlyZWRNZXNzYWdlID0gSnNmVXRpbHMuZ2V0TWVzc2FnZUZyb21BcHBsaWNhdGlvbk1lc3NhZ2VCdW5kbGUoSkFWQVhfRkFDRVNfUkVRVUlSRUQpOw0KLSAgICAgICAgU3RyaW5nIGZhY2VzUmVxdWlyZWRNZXNzYWdlRGV0YWlsID0gZmFjZXNSZXF1aXJlZE1lc3NhZ2U7DQotDQotICAgICAgICAvL3VzZSB0cnkvY2F0Y2ggZm9yIGVhc2llciBzeW5jIGJldHdlZW4gdHJ1bmsvYnJhbmNoDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoSnNmVXRpbHMuZ2V0TWVzc2FnZUZyb21BcHBsaWNhdGlvbk1lc3NhZ2VCdW5kbGUoSkFWQVhfRkFDRVNfUkVRVUlSRURfREVUQUlMKSAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZmFjZXNSZXF1aXJlZE1lc3NhZ2VEZXRhaWwgPSBKc2ZVdGlscw0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZShKQVZBWF9GQUNFU19SRVFVSVJFRF9ERVRBSUwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vanNmIDEuMiBkb2Vzbid0IGhhdmUgYSBkZXRhaWwgbWVzc2FnZQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZmFjZXNNZXNzYWdlLnNldFN1bW1hcnkoZmFjZXNSZXF1aXJlZE1lc3NhZ2UpOw0KLSAgICAgICAgZmFjZXNNZXNzYWdlLnNldERldGFpbChmYWNlc1JlcXVpcmVkTWVzc2FnZURldGFpbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2tpcGFibGVWYWxpZGF0aW9uU3RyYXRlZ3koQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25TdHJhdGVneT4gdGFyZ2V0Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIGZvciAoQ2xhc3MgY3VycmVudENsYXNzIDogZ2V0U2tpcFZhbGlkYXRpb25TdXBwb3J0Q2xhc3NMaXN0KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGlzU2tpcFZhbGlkYXRpb25TdXBwb3J0ZWQoY3VycmVudENsYXNzLCB0YXJnZXRDbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHByb2Nlc3NNZXRhRGF0YUVudHJ5QWZ0ZXJTa2lwVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblN0cmF0ZWd5PiB0YXJnZXRDbGFzcywgTWV0YURhdGFFbnRyeSBlbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGlzU2tpcGFibGVWYWxpZGF0aW9uU3RyYXRlZ3kodGFyZ2V0Q2xhc3MpICYmDQotICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMoZW50cnkuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCBCb29sZWFuLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PENsYXNzPiBnZXRTa2lwVmFsaWRhdGlvblN1cHBvcnRDbGFzc0xpc3QoKQ0KLSAgICB7DQotICAgICAgICBMaXN0PFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+PiBzdGF0aWNDb25maWd1cmF0aW9uTGlzdCA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5nZXRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5TS0lQX1ZBTElEQVRJT05fU1VQUE9SVF9DT05GSUcpOw0KLQ0KLSAgICAgICAgTGlzdDxDbGFzcz4gbWFya2VyTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotDQotICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3M7DQotICAgICAgICBmb3IgKFN0YXRpY0NvbmZpZ3VyYXRpb248U3RyaW5nLCBTdHJpbmc+IGN1cnJlbnRFbnRyeSA6IHN0YXRpY0NvbmZpZ3VyYXRpb25MaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvciAoU3RhdGljQ29uZmlndXJhdGlvbkVudHJ5PFN0cmluZywgU3RyaW5nPiBjdXJyZW50Q29uZmlndXJhdGlvbkVudHJ5IDogY3VycmVudEVudHJ5LmdldE1hcHBpbmcoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKGN1cnJlbnRDb25maWd1cmF0aW9uRW50cnkuZ2V0VGFyZ2V0KCkpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudENsYXNzICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1hcmtlckxpc3QuYWRkKGN1cnJlbnRDbGFzcyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoTE9HR0VSLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIud2FybigiY29uZmlndXJhdGlvbiBlbnRyeSBwcm92aWRlcyBhbiBpbnZhbGlkIGVudHJ5OiAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGN1cnJlbnRDb25maWd1cmF0aW9uRW50cnkuZ2V0VGFyZ2V0KCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG1hcmtlckxpc3Q7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2tpcFZhbGlkYXRpb25TdXBwb3J0ZWQoQ2xhc3MgY3VycmVudENsYXNzLCBDbGFzcyB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgaWYgKGN1cnJlbnRDbGFzcy5pc0Fubm90YXRpb24oKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodGFyZ2V0Q2xhc3MuaXNBbm5vdGF0aW9uUHJlc2VudChjdXJyZW50Q2xhc3MpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChjdXJyZW50Q2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0YXJnZXRDbGFzcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBWYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yIGdldFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKQ0KLSAgICB7DQotICAgICAgICBpZihpc1ZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0aW9uRGVhY3RpdmF0ZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKSB7DQotDQotICAgICAgICAgICAgICAgIHB1YmxpYyBNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+IGV4dHJhY3QoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXA8T2JqZWN0LCBMaXN0PE9iamVjdD4+KCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIExpc3Q8T2JqZWN0PiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHB1YmxpYyA8VD4gTGlzdDxUPiBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSwgQ2xhc3M8VD4gdmFsdWVUeXBlKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxUPigpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHB1YmxpYyA8VD4gVCBleHRyYWN0KEFubm90YXRpb24gYW5ub3RhdGlvbiwgT2JqZWN0IGtleSwgQ2xhc3M8VD4gdmFsdWVUeXBlLCBDbGFzcyB2YWx1ZUlkKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH07DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0RmFjdG9yeUZpbmRlcigpLmdldEZhY3RvcnkoDQotICAgICAgICAgICAgICAgIEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1BBUkFNRVRFUl9FWFRSQUNUT1JfRkFDVE9SWSwgVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5jcmVhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihDbGFzcyBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgICBDbGFzc01hcHBpbmdGYWN0b3J5PENsYXNzLCBDbGFzcz4gdmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnkgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRGYWN0b3J5RmluZGVyKCkNCi0gICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5WQUxJREFUSU9OX1BBUkFNRVRFUl9GQUNUT1JZLCBDbGFzc01hcHBpbmdGYWN0b3J5LmNsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeS5jcmVhdGUoc291cmNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3Rpb25EZWFjdGl2YXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9WQUxJREFUSU9OX1BBUkFNRVRFUlMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGVjdXRlTG9jYWxCZWZvcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlLZXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwcm9wZXJ0aWVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydHlNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycyA9IGdldFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKS5leHRyYWN0KA0KLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLCBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcywgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MpOw0KLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOw0KLQ0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eU1hcC5wdXQocHJvcGVydHlLZXksIHByb3BlcnRpZXMpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHJvcGVydHlNYXAucHV0KEFubm90YXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBhbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgIGZvciAoUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgOiBwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcg0KLSAgICAgICAgICAgICAgICAgICAgLmJlZm9yZVZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eU1hcCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBleGVjdXRlTG9jYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcHJvcGVydGllcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydHlNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIExpc3Q8UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9ycyA9IGdldFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKS5leHRyYWN0KA0KLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLCBQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcywgUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eU1hcC5wdXQocHJvcGVydHlLZXksIHByb3BlcnRpZXMpOw0KLSAgICAgICAgICAgIHByb3BlcnR5TWFwLnB1dChBbm5vdGF0aW9uLmNsYXNzLmdldE5hbWUoKSwgYW5ub3RhdGlvbik7DQotICAgICAgICB9DQotDQotICAgICAgICBmb3IgKFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIDogcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmFmdGVyVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHByb3BlcnR5TWFwKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiaXMgcmVuYW1pbmcgb2s/IikNCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGV4ZWN1dGVHbG9iYWxCZWZvcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlLZXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcHJvcGVydGllcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIG1vZHVsZUtleSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOw0KLQ0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eU1hcC5wdXQocHJvcGVydHlLZXksIHByb3BlcnRpZXMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzRm9yKG1vZHVsZUtleSk7DQotDQotICAgICAgICBmb3IgKFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIDogcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3INCi0gICAgICAgICAgICAgICAgICAgIC5iZWZvcmVWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCwgcHJvcGVydHlNYXApKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiaXMgcmVuYW1pbmcgb2s/IikNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHByb3BlcnRpZXMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIG1vZHVsZUtleSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eU1hcC5wdXQocHJvcGVydHlLZXksIHByb3BlcnRpZXMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvcj4gcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0UHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzRm9yKG1vZHVsZUtleSk7DQotDQotICAgICAgICBmb3IgKFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yIDogcHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yLmFmdGVyVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHByb3BlcnR5TWFwKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGdldFN0b3JhZ2UoQ2xhc3M8VD4gc3RvcmFnZVR5cGUsIFN0cmluZyBzdG9yYWdlTmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChUKSBnZXRTdG9yYWdlTWFuYWdlckZhY3RvcnkoKS5jcmVhdGUoc3RvcmFnZVR5cGUpLmNyZWF0ZShzdG9yYWdlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0U3RvcmFnZShDbGFzcyBzdG9yYWdlVHlwZSwgU3RyaW5nIHN0b3JhZ2VOYW1lKQ0KLSAgICB7DQotICAgICAgICBnZXRTdG9yYWdlTWFuYWdlckZhY3RvcnkoKS5jcmVhdGUoc3RvcmFnZVR5cGUpLnJlc2V0KHN0b3JhZ2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzc01hcHBpbmdGYWN0b3J5PENsYXNzLCBTdG9yYWdlTWFuYWdlcj4gZ2V0U3RvcmFnZU1hbmFnZXJGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwgQ2xhc3NNYXBwaW5nRmFjdG9yeS5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRUcmFuc2Zvcm1lZE1ldGFEYXRhKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0VHJhbnNmb3JtZWRNZXRhRGF0YUZvcihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0VHJhbnNmb3JtZWRNZXRhRGF0YUZvcigNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgQ2xhc3MgbW9kdWxlS2V5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIGlmKG1vZHVsZUtleSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MuZ2V0TmFtZSgpLCBtb2R1bGVLZXkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGdldFRyYW5zZm9ybWVkTWV0YURhdGFXaXRoKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHByb3BlcnRpZXMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRUcmFuc2Zvcm1lZE1ldGFEYXRhV2l0aCgNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQ0KLSAgICB7DQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLQ0KLSAgICAgICAgU2tpcFZhbGlkYXRpb25FdmFsdWF0b3Igc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcigpOw0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgbWV0YURhdGFFeHRyYWN0b3IgPSBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcldpdGgocHJvcGVydGllcyk7DQotDQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhOw0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YVJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgZm9yIChNZXRhRGF0YUVudHJ5IGVudHJ5IDogbWV0YURhdGFFeHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KS5nZXRNZXRhRGF0YUVudHJpZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IGdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKGVudHJ5LmdldEtleSgpKTsNCi0NCi0gICAgICAgICAgICBpZiAodmFsaWRhdGlvblN0cmF0ZWd5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtZXRhRGF0YSA9IHRyYW5zZm9ybU1ldGFEYXRhKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHZhbGlkYXRpb25TdHJhdGVneSwgc2tpcFZhbGlkYXRpb25FdmFsdWF0b3IsIG1ldGFEYXRhLCBlbnRyeSk7DQotDQotICAgICAgICAgICAgICAgIGlmICghaXNDb21wb25lbnRJbml0aWFsaXphdGlvblNraXBwZWQobWV0YURhdGEsIGVudHJ5LCB2YWxpZGF0aW9uU3RyYXRlZ3kpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvL2Rvbid0IGJyZWFrIG1heWJlIHRoZXJlIGFyZSBjb25zdHJhaW50cyB3aGljaCBkb24ndCBzdXBwb3J0IHRoZSBza2lwLW1lY2hhbmlzbQ0KLSAgICAgICAgICAgICAgICAgICAgbWV0YURhdGFSZXN1bHQucHV0QWxsKG1ldGFEYXRhKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBtZXRhRGF0YVJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2lwVmFsaWRhdGlvbkV2YWx1YXRvciBza2lwVmFsaWRhdGlvbkV2YWx1YXRvciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhLCBNZXRhRGF0YUVudHJ5IGVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZiAoIXNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLnNraXBWYWxpZGF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHZhbGlkYXRpb25TdHJhdGVneSwgZW50cnkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lciA9IGdldE1ldGFEYXRhVHJhbnNmb3JtZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICBpZiAobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBMT0dHRVIuZGVidWcobWV0YURhdGFUcmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5zdGFudGlhdGVkIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgbWV0YURhdGEgPSBtZXRhRGF0YVRyYW5zZm9ybWVyLmNvbnZlcnRNZXRhRGF0YShlbnRyeSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1ldGFEYXRhID0gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKG1ldGFEYXRhID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDb21wb25lbnRJbml0aWFsaXphdGlvblNraXBwZWQoTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YSwgTWV0YURhdGFFbnRyeSBlbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGEuaXNFbXB0eSgpIHx8DQotICAgICAgICAgICAgICAgIChCb29sZWFuLlRSVUUuZXF1YWxzKGVudHJ5LmdldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlNLSVBfVkFMSURBVElPTiwgQm9vbGVhbi5jbGFzcykpICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgaXNTa2lwYWJsZVZhbGlkYXRpb25TdHJhdGVneShQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksIFZhbGlkYXRpb25TdHJhdGVneS5jbGFzcykpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKQ0KLSAgICB7DQotICAgICAgICAvL3RvIGRlYWN0aXZhdGU6IHRoZSBwYXJhbWV0ZXIgaGFzIHRvIGJlIGV4cGxpY2l0bHkgZmFsc2UNCi0gICAgICAgIHJldHVybiAhImZhbHNlIi5lcXVhbHNJZ25vcmVDYXNlKFdlYlhtbFBhcmFtZXRlci5JTlRFUlBSRVRfRU1QVFlfU1RSSU5HX1NVQk1JVFRFRF9WQUxVRVNfQVNfTlVMTCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlRW1wdHlGaWVsZHMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gISJmYWxzZSIuZXF1YWxzSWdub3JlQ2FzZShXZWJYbWxQYXJhbWV0ZXIuVkFMSURBVEVfRU1QVFlfRklFTERTKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5RGV0YWlscyBnZXRQcm9wZXJ0eURldGFpbHMoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbi5nZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb1Rocm93VmFsaWRhdG9yRXhjZXB0aW9uRm9yQ29tcG9uZW50SWQoDQotICAgICAgICAgICAgU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKQ0KLSAgICB7DQotICAgICAgICBVSUNvbXBvbmVudCB0YXJnZXRDb21wb25lbnQgPSBmaW5kQ29tcG9uZW50KGNsaWVudElkKTsNCi0NCi0gICAgICAgIHRyeVRvVGhyb3dWYWxpZGF0b3JFeGNlcHRpb25Gb3JDb21wb25lbnQodGFyZ2V0Q29tcG9uZW50LCBmYWNlc01lc3NhZ2UsIHRocm93YWJsZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvVGhyb3dWYWxpZGF0b3JFeGNlcHRpb25Gb3JDb21wb25lbnQoDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpDQotICAgIHsNCi0gICAgICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgaWYgKGludGVycHJldGVyLnNldmVyaXR5Q2F1c2VzVmFsaWRhdG9yRXhjZXB0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGZhY2VzTWVzc2FnZS5nZXRTZXZlcml0eSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodGhyb3dhYmxlID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKGZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oZmFjZXNNZXNzYWdlLCB0aHJvd2FibGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb0FkZFZpb2xhdGlvbk1lc3NhZ2VGb3JDb21wb25lbnQodWlDb21wb25lbnQsIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvQWRkVmlvbGF0aW9uTWVzc2FnZUZvckNvbXBvbmVudElkKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gZmluZENvbXBvbmVudChjbGllbnRJZCk7DQotDQotICAgICAgICBpZiAodGFyZ2V0Q29tcG9uZW50ID09IG51bGwgJiYgY2xpZW50SWQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb0FkZFZpb2xhdGlvbk1lc3NhZ2VGb3JUZXN0Q2xpZW50SWQoY2xpZW50SWQsIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50KHRhcmdldENvbXBvbmVudCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAicmVxdWlyZWQgZm9yIHRlc3QgZnJhbWV3b3JrcyAtIGdvYWw6IHJlbW92ZSBpdCIpDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yVGVzdENsaWVudElkKFN0cmluZyBjbGllbnRJZCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBpbnRlcnByZXRlciA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBpZiAoaW50ZXJwcmV0ZXIuc2V2ZXJpdHlDYXVzZXNWaW9sYXRpb25NZXNzYWdlKGZhY2VzQ29udGV4dCwgbnVsbCwgZmFjZXNNZXNzYWdlLmdldFNldmVyaXR5KCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGFkZEZhY2VzTWVzc2FnZShjbGllbnRJZCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRyeVRvQmxvY2tzTmF2aWdhdGlvbkZvckNvbXBvbmVudChudWxsLCBmYWNlc01lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnlUb0FkZFZpb2xhdGlvbk1lc3NhZ2VGb3JDb21wb25lbnQoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgaWYgKGludGVycHJldGVyLnNldmVyaXR5Q2F1c2VzVmlvbGF0aW9uTWVzc2FnZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBmYWNlc01lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHVpQ29tcG9uZW50ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRGYWNlc01lc3NhZ2UodWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYWRkRmFjZXNNZXNzYWdlKG51bGwsIGZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgdHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50KHVpQ29tcG9uZW50LCBmYWNlc01lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgYWRkRmFjZXNNZXNzYWdlKG51bGwsIGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEZhY2VzTWVzc2FnZShTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZVN0b3JhZ2Ugc3RvcmFnZSA9IGdldFN0b3JhZ2UoRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcywgRmFjZXNNZXNzYWdlU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgaWYgKHN0b3JhZ2UgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzdG9yYWdlLmFkZEZhY2VzTWVzc2FnZShjbGllbnRJZCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuYWRkTWVzc2FnZShjbGllbnRJZCwgZmFjZXNNZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9CbG9ja3NOYXZpZ2F0aW9uRm9yQ29tcG9uZW50SWQoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBVSUNvbXBvbmVudCB0YXJnZXRDb21wb25lbnQgPSBmaW5kQ29tcG9uZW50KGNsaWVudElkKTsNCi0NCi0gICAgICAgIHRyeVRvQmxvY2tzTmF2aWdhdGlvbkZvckNvbXBvbmVudCh0YXJnZXRDb21wb25lbnQsIGZhY2VzTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyeVRvQmxvY2tzTmF2aWdhdGlvbkZvckNvbXBvbmVudChVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgRmFjZXNNZXNzYWdlIGZhY2VzTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgVmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlciBpbnRlcnByZXRlciA9DQotICAgICAgICAgICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIoKTsNCi0NCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBpZiAoaW50ZXJwcmV0ZXIuc2V2ZXJpdHlCbG9ja3NOYXZpZ2F0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGZhY2VzTWVzc2FnZS5nZXRTZXZlcml0eSgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkucmVuZGVyUmVzcG9uc2UoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2V2ZXJpdHlCbG9ja3NTdWJtaXRGb3JDb21wb25lbnRJZChTdHJpbmcgY2xpZW50SWQsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIFZpb2xhdGlvblNldmVyaXR5SW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyKCk7DQotDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLSAgICAgICAgVUlDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gZmluZENvbXBvbmVudChjbGllbnRJZCk7DQotDQotICAgICAgICByZXR1cm4gaW50ZXJwcmV0ZXIuc2V2ZXJpdHlCbG9ja3NTdWJtaXQoZmFjZXNDb250ZXh0LCB0YXJnZXRDb21wb25lbnQsIGZhY2VzTWVzc2FnZS5nZXRTZXZlcml0eSgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvL2F2YWlsYWJsZSBmb3IgYWRkLW9ucyAtIG5vdCB1c2VkIGludGVybmFsbHkgZHVlIHRvIHBlcmZvcm1hbmNlIHJlYXNvbnMNCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNldmVyaXR5U2hvd3NJbmRpY2F0aW9uRm9yQ29tcG9uZW50SWQoU3RyaW5nIGNsaWVudElkLCBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlKQ0KLSAgICB7DQotICAgICAgICBWaW9sYXRpb25TZXZlcml0eUludGVycHJldGVyIGludGVycHJldGVyID0NCi0gICAgICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpOw0KLQ0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IGZpbmRDb21wb25lbnQoY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGludGVycHJldGVyLnNldmVyaXR5U2hvd3NJbmRpY2F0aW9uKGZhY2VzQ29udGV4dCwgdGFyZ2V0Q29tcG9uZW50LCBmYWNlc01lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgVUlDb21wb25lbnQgZmluZENvbXBvbmVudChTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIFVJQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IG51bGw7DQotDQotICAgICAgICBpZiAoY2xpZW50SWQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0YXJnZXRDb21wb25lbnQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5maW5kQ29tcG9uZW50KGNsaWVudElkKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0YXJnZXRDb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBjb21wb25lbnQgaW5pdGlhbGl6YXRpb24gZm9yIHJlcXVpcmVkIHZhbGlkYXRpb24gaXMgYWN0aXZhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZXF1aXJlZEluaXRpYWxpemF0aW9uQWN0aXZlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRS5lcXVhbHMoRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0R2xvYmFsUHJvcGVydHkoIm1vZGU6aW5pdDpyZXF1aXJlZCIpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogbmVlZGVkIGZvciBzb21lIGNvbXBvbmVudCBsaWJzIC0gaWYgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24gaXMgdXNlZCBlLmcuIGZvciB2aXN1YWwgaW5kaWNhdG9ycw0KLSAgICAgKiBidXQgZmVhdHVyZXMgbGlrZSBzZXZlcml0eSBhd2FyZSB2YWxpZGF0aW9uIGFyZW4ndCB1c2VkLg0KLSAgICAgKiBpbiBzdWNoIGEgY2FzZSBpdCdzIHBvc3NpYmxlIHRvIHVzZSB0aGUgcmVxdWlyZWQgYXR0cmlidXRlLg0KLSAgICAgKiANCi0gICAgICogQHJldHVybiBmYWxzZSB0byBkZWFjdGl2YXRlIHRoZSBmaW5hbCByZXNldCBvZiB0aGUgdmFsdWUgb2YgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVxdWlyZWRSZXNldEFjdGl2YXRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBCb29sZWFuLlRSVUUuZXF1YWxzKEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KCJtb2RlOnJlc2V0OnJlcXVpcmVkIikpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdFN0YWdlTmFtZSBnZXREZWZhdWx0U3RhZ2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZVByb2plY3RTdGFnZU5hbWUoIlByb2R1Y3Rpb24iKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFByb2plY3RTdGFnZU5hbWUgY3JlYXRlUHJvamVjdFN0YWdlTmFtZShTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIERlZmF1bHRQcm9qZWN0TmFtZS5jcmVhdGVQcm9qZWN0U3RhZ2VOYW1lKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0V4dFZhbERlYWN0aXZhdGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFN5c3RlbQ0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgKw0KLSAgICAgICAgICAgICAgICAgICAgIi5ERUFDVElWQVRFX0FMTCIsICJmYWxzZSIpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0dyb3VwVXRpbHMuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvR3JvdXBVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODVlYWIzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvR3JvdXBVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBHcm91cFV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHcm91cEtleShTdHJpbmcgdmlld0lkLCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjbGllbnRJZCA9PSBudWxsID8gdmlld0lkIDogdmlld0lkICsgIkAiICsgY2xpZW50SWQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Kc2ZVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTc2ZWNhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvSnNmVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5GYWNlc0luZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5GYWN0b3J5RmluZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy5saWZlY3ljbGUuTGlmZWN5Y2xlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5saWZlY3ljbGUuTGlmZWN5Y2xlRmFjdG9yeTsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7DQotDQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnNmVXRpbHMNCi17DQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcihQaGFzZUxpc3RlbmVyIHBoYXNlTGlzdGVuZXIpDQotICAgIHsNCi0gICAgICAgIExpZmVjeWNsZUZhY3RvcnkgbGlmZWN5Y2xlRmFjdG9yeSA9IChMaWZlY3ljbGVGYWN0b3J5KUZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShGYWN0b3J5RmluZGVyLkxJRkVDWUNMRV9GQUNUT1JZKTsNCi0NCi0gICAgICAgIFN0cmluZyBjdXJyZW50SWQ7DQotICAgICAgICBMaWZlY3ljbGUgY3VycmVudExpZmVjeWNsZTsNCi0gICAgICAgIEl0ZXJhdG9yIGxpZmVjeWNsZUlkcyA9IGxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlSWRzKCk7DQotICAgICAgICB3aGlsZSAobGlmZWN5Y2xlSWRzLmhhc05leHQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjdXJyZW50SWQgPSAoU3RyaW5nKSBsaWZlY3ljbGVJZHMubmV4dCgpOw0KLSAgICAgICAgICAgIGN1cnJlbnRMaWZlY3ljbGUgPSBsaWZlY3ljbGVGYWN0b3J5LmdldExpZmVjeWNsZShjdXJyZW50SWQpOw0KLSAgICAgICAgICAgIGN1cnJlbnRMaWZlY3ljbGUucmVtb3ZlUGhhc2VMaXN0ZW5lcihwaGFzZUxpc3RlbmVyKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJQaGFzZUxpc3RlbmVyKFBoYXNlTGlzdGVuZXIgcGhhc2VMaXN0ZW5lcikNCi0gICAgew0KLSAgICAgICAgTGlmZWN5Y2xlRmFjdG9yeSBsaWZlY3ljbGVGYWN0b3J5ID0gKExpZmVjeWNsZUZhY3RvcnkpRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEZhY3RvcnlGaW5kZXIuTElGRUNZQ0xFX0ZBQ1RPUlkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRJZDsNCi0gICAgICAgIExpZmVjeWNsZSBjdXJyZW50TGlmZWN5Y2xlOw0KLSAgICAgICAgSXRlcmF0b3IgbGlmZWN5Y2xlSWRzID0gbGlmZWN5Y2xlRmFjdG9yeS5nZXRMaWZlY3ljbGVJZHMoKTsNCi0gICAgICAgIHdoaWxlIChsaWZlY3ljbGVJZHMuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRJZCA9IChTdHJpbmcpIGxpZmVjeWNsZUlkcy5uZXh0KCk7DQotICAgICAgICAgICAgY3VycmVudExpZmVjeWNsZSA9IGxpZmVjeWNsZUZhY3RvcnkuZ2V0TGlmZWN5Y2xlKGN1cnJlbnRJZCk7DQotICAgICAgICAgICAgY3VycmVudExpZmVjeWNsZS5hZGRQaGFzZUxpc3RlbmVyKHBoYXNlTGlzdGVuZXIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0RGVmYXVsdEZhY2VzTWVzc2FnZUJ1bmRsZSgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICByZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEZhY2VzTWVzc2FnZS5GQUNFU19NRVNTQUdFUywgZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0Q3VzdG9tRmFjZXNNZXNzYWdlQnVuZGxlKCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIFN0cmluZyBidW5kbGVOYW1lID0gZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuZ2V0TWVzc2FnZUJ1bmRsZSgpOw0KLQ0KLSAgICAgICAgaWYgKGJ1bmRsZU5hbWUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoYnVuZGxlTmFtZSwgZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VGcm9tQXBwbGljYXRpb25NZXNzYWdlQnVuZGxlKFN0cmluZyBtZXNzYWdlS2V5KQ0KLSAgICB7DQotICAgICAgICBSZXNvdXJjZUJ1bmRsZSBjdXN0b21SZXNvdXJjZUJ1bmRsZSA9IGdldEN1c3RvbUZhY2VzTWVzc2FnZUJ1bmRsZSgpOw0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGN1c3RvbVJlc291cmNlQnVuZGxlICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9tUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKG1lc3NhZ2VLZXkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL25vIGN1c3RvbSBtZXNzYWdlIGlzIGF2YWlsYWJsZSAtIGRvIG5vdGhpbmcNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBnZXREZWZhdWx0RmFjZXNNZXNzYWdlQnVuZGxlKCkuZ2V0U3RyaW5nKG1lc3NhZ2VLZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlbmRlclJlc3BvbnNlUGhhc2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5SRU5ERVJfUkVTUE9OU0UuZXF1YWxzKGdldEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlKCkuZ2V0Q3VycmVudFBoYXNlSWQoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBQaGFzZUlkIGdldEN1cnJlbnRQaGFzZUlkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldEZhY2VzSW5mb3JtYXRpb25TdG9yYWdlKCkuZ2V0Q3VycmVudFBoYXNlSWQoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogc2ltcGxlIHRlc3QgZm9yIGVhcmx5IGNvbmZpZyBpbiBjYXNlIG9mIG1vamFycmENCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBqc2YgaW1wbC4gaXMgaW5pdGlhbGl6ZWQgYW5kIGl0J3MgcG9zc2libGUgdG8gdXNlIGl0IGFzIGV4cGVjdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcHBsaWNhdGlvbkluaXRpYWxpemVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRDbGFzcygpLmdldE5hbWUoKS5zdGFydHNXaXRoKCJvcmcuYXBhY2hlLm15ZmFjZXMiKSB8fA0KLSAgICAgICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0UmVxdWVzdE1hcCgpICE9IG51bGwgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAhRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldEV4dGVybmFsQ29udGV4dCgpLmdldFJlcXVlc3RNYXAoKS5pc0VtcHR5KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UgZ2V0RmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZShGYWNlc0luZm9ybWF0aW9uU3RvcmFnZS5jbGFzcywgRmFjZXNJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Byb3h5VXRpbHMuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUHJveHlVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzVjMjNlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUHJveHlVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3h5LlByb3h5SGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm94eS5EZWZhdWx0UHJveHlIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLldlYlhtbFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFByb3h5VXRpbHMNCi17DQotICAgIHByaXZhdGUgc3RhdGljIFByb3h5SGVscGVyIHByb3h5SGVscGVyOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIDxUPiBDbGFzczxUPiBnZXRVbnByb3hpZWRDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MsIENsYXNzPFQ+IHRhcmdldFR5cGUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRQcm94eUhlbHBlcigpLmdldFVucHJveGllZENsYXNzKGN1cnJlbnRDbGFzcywgdGFyZ2V0VHlwZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBDbGFzcyBnZXRVbnByb3hpZWRDbGFzcyhDbGFzcyBjdXJyZW50Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRQcm94eUhlbHBlcigpLmdldFVucHJveGllZENsYXNzKGN1cnJlbnRDbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKENsYXNzIHByb3hpZWRDbGFzcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFByb3h5SGVscGVyKCkuZ2V0TmFtZU9mQ2xhc3MocHJveGllZENsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGFzc05hbWVPZk9iamVjdChPYmplY3QgcHJveGllZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFByb3h5SGVscGVyKCkuZ2V0Q2xhc3NOYW1lT2ZPYmplY3QocHJveGllZE9iamVjdCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJveGllZENsYXNzKENsYXNzIGN1cnJlbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdldFByb3h5SGVscGVyKCkuaXNQcm94aWVkQ2xhc3MoY3VycmVudENsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcm94aWVkT2JqZWN0KE9iamVjdCBwcm94aWVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZ2V0UHJveHlIZWxwZXIoKS5pc1Byb3hpZWRPYmplY3QocHJveGllZE9iamVjdCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgUHJveHlIZWxwZXIgZ2V0UHJveHlIZWxwZXIoKQ0KLSAgICB7DQotICAgICAgICBpZiAocHJveHlIZWxwZXIgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL3dvcmthcm91bmQgZm9yIG1vamFycmENCi0gICAgICAgICAgICBpZighSnNmVXRpbHMuaXNBcHBsaWNhdGlvbkluaXRpYWxpemVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRQcm94eUhlbHBlcigpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcm94eUhlbHBlciA9IGNyZWF0ZVByb3h5SGVscGVyKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcHJveHlIZWxwZXI7DQotICAgIH0NCi0NCi0gICAgLy9kb24ndCB1c2UgdGhlIGRlZmF1bHQgYXBwcm9hY2ggKGZhY3RvcnkgZmluZGVyKSAtIFByb3h5SGVscGVyIGlzIGNhbGxlZCB0b28gb2Z0ZW4uLi4NCi0gICAgcHJpdmF0ZSBzdGF0aWMgUHJveHlIZWxwZXIgY3JlYXRlUHJveHlIZWxwZXIoKQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY3VzdG9tUHJveHlIZWxwZXJDbGFzc05hbWUgPSBXZWJYbWxQYXJhbWV0ZXIuQ1VTVE9NX1BST1hZX0hFTFBFUjsNCi0NCi0gICAgICAgIFByb3h5SGVscGVyIHJlc3VsdCA9IG51bGw7DQotICAgICAgICBpZihjdXN0b21Qcm94eUhlbHBlckNsYXNzTmFtZSAhPSBudWxsICYmICEiIi5lcXVhbHMoY3VzdG9tUHJveHlIZWxwZXJDbGFzc05hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IChQcm94eUhlbHBlcilDbGFzc1V0aWxzLnRyeVRvSW5zdGFudGlhdGVDbGFzc0Zvck5hbWUoY3VzdG9tUHJveHlIZWxwZXJDbGFzc05hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYocmVzdWx0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IERlZmF1bHRQcm94eUhlbHBlcigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1JlZmxlY3Rpb25VdGlscy5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9SZWZsZWN0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUwNjJiZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1JlZmxlY3Rpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGlvblV0aWxzCi17Ci0gICAgcHVibGljIHN0YXRpYyBNZXRob2QgdHJ5VG9HZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRyeVRvR2V0TWV0aG9kKHRhcmdldENsYXNzLCB0YXJnZXRNZXRob2ROYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCB0cnlUb0dldE1ldGhvZChDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHRhcmdldE1ldGhvZE5hbWUsIENsYXNzLi4uIHBhcmFtZXRlclR5cGVzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRNZXRob2QodGFyZ2V0Q2xhc3MsIHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vZG8gbm90aGluZyAtIGl0J3MganVzdCBhIHRyeQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lKQotICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TWV0aG9kKHRhcmdldENsYXNzLCB0YXJnZXRNZXRob2ROYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRNZXRob2ROYW1lLCBDbGFzcy4uLiBwYXJhbWV0ZXJUeXBlcykKLSAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ2xhc3MgY3VycmVudENsYXNzID0gdGFyZ2V0Q2xhc3M7Ci0gICAgICAgIE1ldGhvZCB0YXJnZXRNZXRob2QgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKCFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjdXJyZW50Q2xhc3MuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gY3VycmVudENsYXNzLmdldERlY2xhcmVkTWV0aG9kKHRhcmdldE1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYodGFyZ2V0TWV0aG9kID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoQ2xhc3MgY3VycmVudEludGVyZmFjZSA6IHRhcmdldENsYXNzLmdldEludGVyZmFjZXMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50SW50ZXJmYWNlOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRDbGFzcyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IGN1cnJlbnRDbGFzcy5nZXREZWNsYXJlZE1ldGhvZCh0YXJnZXRNZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0YXJnZXRNZXRob2QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRhcmdldE1ldGhvZDsKLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBOb1N1Y2hNZXRob2RFeGNlcHRpb24oInRoZXJlIGlzIG5vIG1ldGhvZCB3aXRoIHRoZSBuYW1lICciICsgdGFyZ2V0TWV0aG9kTmFtZSArICInIiArCi0gICAgICAgICAgICAgICAgIiBjbGFzczogIiArIHRhcmdldENsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2QoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0ludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdHJ5VG9JbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnlUb0ludm9rZU1ldGhvZE9mQ2xhc3ModGFyZ2V0LCBtZXRob2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kT2ZDbGFzcyhDbGFzcyB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZE9mQ2xhc3ModGFyZ2V0LCBtZXRob2QsIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE9mQ2xhc3MoQ2xhc3MgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQubmV3SW5zdGFuY2UoKSwgbWV0aG9kLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2RPZkNsYXNzKENsYXNzIHRhcmdldCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHRhcmdldC5uZXdJbnN0YW5jZSgpLCBtZXRob2QsIGFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHRyeVRvSW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdC4uLiBhcmdzKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbnZva2VNZXRob2QodGFyZ2V0LCBtZXRob2QsIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nIC0gaXQncyBqdXN0IGEgdHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZChPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKQotICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QsIE9iamVjdC4uLiBhcmdzKQotICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKHRhcmdldCwgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QmFzZU9mUHJvcGVydHlDaGFpbihPYmplY3QgYmFzZU9iamVjdCwgU3RyaW5nIHByb3BlcnR5Q2hhaW4pCi0gICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcm9wZXJ0eUNoYWluLCAiLiIpOwotCi0gICAgICAgIE9iamVjdCBjdXJyZW50QmFzZSA9IGJhc2VPYmplY3Q7Ci0gICAgICAgIFN0cmluZyBjdXJyZW50UHJvcGVydHk7Ci0gICAgICAgIE1ldGhvZCBjdXJyZW50TWV0aG9kOwotCi0gICAgICAgIHdoaWxlKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQotICAgICAgICAgICAgLy9pZ25vcmUgdGhlIGxhc3QgcHJvcGVydHkKLSAgICAgICAgICAgIGlmKCF0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL25vIGlzIC0gaXQncyBvbmx5IHBvc3NpYmxlIGF0IHByb3BlcnRpZXMgbm90IGF0IGJlYW4gbGV2ZWwKLSAgICAgICAgICAgIGN1cnJlbnRNZXRob2QgPSB0cnlUb0dldE1ldGhvZChQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKGN1cnJlbnRCYXNlLmdldENsYXNzKCkpLAotICAgICAgICAgICAgICAgICJnZXQiICsgY3VycmVudFByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFByb3BlcnR5LnN1YnN0cmluZygxLCBjdXJyZW50UHJvcGVydHkubGVuZ3RoKCkpKTsKLSAgICAgICAgICAgIGN1cnJlbnRCYXNlID0gdHJ5VG9JbnZva2VNZXRob2QoY3VycmVudEJhc2UsIGN1cnJlbnRNZXRob2QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRCYXNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvV2ViWG1sVXRpbHMuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvV2ViWG1sVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwNzY5Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1dlYlhtbFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLkV4dFZhbEluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFdlYlhtbFV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRJbml0UGFyYW1ldGVyKEV4dFZhbEluZm9ybWF0aW9uLldFQlhNTF9QQVJBTV9QUkVGSVgsIGtleSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW5pdFBhcmFtZXRlcihTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHBhcmFtZXRlck5hbWUgPSBuYW1lOw0KLSAgICAgICAgaWYocHJlZml4ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcGFyYW1ldGVyTmFtZSA9IHByZWZpeCArICIuIiArIG5hbWU7DQotICAgICAgICB9DQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lKTsNCi0gICAgICAgIHJldHVybiAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZS5yZXBsYWNlKCIgIiwgIiIpLnRyaW0oKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA1NWVjLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4Yzk1YS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvY29yZS9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDA5MmZiLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9jb3JlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0gLS0tLS0tDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSBNb2R1bGUNCi0gLS0tLS0tDQotDQotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgQ29yZSBNb2R1bGUgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBDb3JlIE1vZHVsZSBwcm92aWRlcyBhbiBleHRlbnNpYmxlIHZhbGlkYXRpb24gcGxhdGZvcm0gdG8gaW1wbGVtZW50IHZhbGlkYXRpb24gYmFzZWQgb24gbWV0YS1kYXRhLg0KLSAgICBCYXNlZCBvbiB0aGlzIG1vZHVsZSBpdCBpcyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgdmFsaWRhdGlvbiBtb2R1bGVzLg0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGNvbXBhdGlibGUgd2l0aCBKU0YgMS54IGFuZCBKU0YgMi54LiBBbGwgdmVyc2lvbnMgcmVxdWlyZSBKYXZhIDEuNSsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvcG9tLnhtbCBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDEwMjYwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBFeGFtcGxlcyBBc3NlbWJseTwvbmFtZT4NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1leGFtcGxlcy1hc3NlbWJseTEyPC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRlcGVuZGVuY3ktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktd2FyPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhhbXBsZXMtaGVsbG9fd29ybGQ8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4JDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4YW1wbGVzLWZlYXR1cmUtc2V0XzAxPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3dhcjwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1zcmM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHk8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1oZWxsb193b3JsZDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+amF2YS1zb3VyY2U8L3R5cGU+ICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5leGFtcGxlczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1mZWF0dXJlLXNldF8wMTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+amF2YS1zb3VyY2U8L3R5cGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3NyYzwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPiAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8IS0tIEVYRUNVVEUgbXZuIHBhY2thZ2UgdG8gZ2VuZXJhdGUgYXNzZW1ibHkgZmlsZXMgLS0+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2VfYXNzZW1ibHlfc3JjPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hc3NlbWJseTwvZ29hbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+ICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sPC9kZXNjcmlwdG9yPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15ZmFjZXMtZXh0dmFsLWV4YW1wbGVzLSR7cHJvamVjdC52ZXJzaW9ufS1zcmM8L2ZpbmFsTmFtZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9vdXRwdXREaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3dvcms8L3dvcmtEaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPiAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZV9hc3NlbWJseV9iaW48L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmFzc2VtYmx5PC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotCSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotCSAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4gICANCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWw8L2Rlc2NyaXB0b3I+DQotCSAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+DQotCSAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+bXlmYWNlcy1leHR2YWwtZXhhbXBsZXMtJHtwcm9qZWN0LnZlcnNpb259PC9maW5hbE5hbWU+DQotCSAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3V0PC9vdXRwdXREaXJlY3Rvcnk+DQotCSAgICAgICAgICAgICAgICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3dvcms8L3dvcmtEaXJlY3Rvcnk+DQotCSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0JICAgIA0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5tYXZlbjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+d2Fnb24tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8aWQ+bXlmYWNlcy1uaWdodGx5LWJ1aWxkczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICA8dXJsPnNjcGV4ZTovL21pbm90YXVyLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL2J1aWxkcy9teWZhY2VzL25pZ2h0bHk8L3VybD4NCi0gICAgICAgICAgICAgICAgICAgIDxpbnB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9vdXQ8L2lucHV0RGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotDQotICAgICAgICA8L3BsdWdpbnM+DQotDQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXAueG1sIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYjNlYzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08YXNzZW1ibHk+DQotICA8aWQ+YmluPC9pZD4NCi0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+DQotICA8Zm9ybWF0cz4NCi0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4NCi0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4NCi0gIDwvZm9ybWF0cz4JDQotICA8ZmlsZVNldHM+ICAgIA0KLSAgICA8ZmlsZVNldD4NCi0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC93YXI8L2RpcmVjdG9yeT4NCi0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgIDxpbmNsdWRlPioud2FyPC9pbmNsdWRlPg0KLSAgICAgIDwvaW5jbHVkZXM+DQotICAgIDwvZmlsZVNldD4gICAgIA0KLSAgPC9maWxlU2V0cz4NCi08L2Fzc2VtYmx5Pg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9leGFtcGxlcy9hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9kZXBzcmMueG1sIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYTU4MDMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNyYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08YXNzZW1ibHk+DQotICA8aWQ+c3JjPC9pZD4NCi0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+DQotICA8Zm9ybWF0cz4NCi0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4NCi0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4NCi0gIDwvZm9ybWF0cz4JDQotICA8ZmlsZVNldHM+ICAgIA0KLSAgICA8ZmlsZVNldD4NCi0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC9zcmM8L2RpcmVjdG9yeT4NCi0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPg0KLSAgICAgIDwvaW5jbHVkZXM+DQotICAgIDwvZmlsZVNldD4NCi0gICAgPGZpbGVTZXQ+DQotICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgIDxpbmNsdWRlPioudHh0PC9pbmNsdWRlPg0KLSAgICAgIDwvaW5jbHVkZXM+DQotICAgIDwvZmlsZVNldD4NCi0gIDwvZmlsZVNldHM+DQotPC9hc3NlbWJseT4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvZXhhbXBsZXMvYXNzZW1ibHkvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2V4YW1wbGVzL2Fzc2VtYmx5L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL2V4YW1wbGVzL3BvbS54bWwgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvZXhhbXBsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU0NDU0MS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvZXhhbXBsZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0NCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmV4YW1wbGVzPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5leGFtcGxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPg0KLQ0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIGV4YW1wbGVzIHByb2plY3Q8L25hbWU+DQotICAgIDx2ZXJzaW9uPjIuMC4zLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+Mi4wLjMtU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDwvcGFyZW50Pg0KLQ0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvZXhhbXBsZXM8L2Nvbm5lY3Rpb24+DQotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYnJhbmNoZXMvMV8yXzJfcmMvZXhhbXBsZXM8L2RldmVsb3BlckNvbm5lY3Rpb24+DQotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8xXzJfMl9yYy9leGFtcGxlczwvdXJsPg0KLSAgICA8L3NjbT4NCi0gICAgDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDwhLS1UaGlzIHBsdWdpbiBhbGxvd3MgdG8gcnVuIHRoZSBleGFtcGxlIHVzaW5nIG12biBqZXR0eTpydW4gLS0+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZXR0eS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjYuMS44PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjEwPC9zY2FuSW50ZXJ2YWxTZWNvbmRzPg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotICAgIDxtb2R1bGVzPg0KLSAgICAgICAgPCEtLW1vZHVsZT5oZWxsb193b3JsZDwvbW9kdWxlLS0+DQotICAgICAgICA8IS0tbW9kdWxlPmhlbGxvX2JlYW4tdmFsaWRhdGlvbjwvbW9kdWxlLS0+DQotICAgICAgICA8IS0tbW9kdWxlPmZlYXR1cmUtc2V0XzAxPC9tb2R1bGUtLT4NCi0gICAgPC9tb2R1bGVzPg0KLQ0KLSAgICA8cHJvZmlsZXM+DQotICAgICAgICA8IS0tIFRoaXMgcHJvZmlsZSBpcyBpbnZva2VkIGJ5IC1EcHJlcGFyZVJlbGVhc2U9dHJ1ZS4gIFRoaXMgYWxsb3dzIG12biByZWxlYXNlOnByZXBhcmUgdG8NCi0gICAgICAgICAgICBydW4gc3VjY2Vzc2Z1bGx5IG9uIHRoZSBhc3NlbWJseSBwcm9qZWN0cy4gLS0+DQotICAgICAgICA8cHJvZmlsZT4NCi0gICAgICAgICAgICA8aWQ+cHJlcGFyZS1yZWxlYXNlPC9pZD4NCi0gICAgICAgICAgICA8YWN0aXZhdGlvbj4NCi0gICAgICAgICAgICAgICAgPHByb3BlcnR5Pg0KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+cHJlcGFyZVJlbGVhc2U8L25hbWU+DQotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPg0KLSAgICAgICAgICAgIDxtb2R1bGVzPg0KLSAgICAgICAgICAgICAgICA8bW9kdWxlPmFzc2VtYmx5PC9tb2R1bGU+DQotICAgICAgICAgICAgPC9tb2R1bGVzPg0KLSAgICAgICAgICAgIDxidWlsZD4NCi0gICAgICAgICAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnRzPi1EcHJlcGFyZVJlbGVhc2U8L2FyZ3VtZW50cz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPg0KLSAgICAgICAgICAgIDwvYnVpbGQ+DQotICAgICAgICA8L3Byb2ZpbGU+DQotICAgIDwvcHJvZmlsZXM+DQotDQotICAgIDxwcm9wZXJ0aWVzPg0KLSAgICAgICAgPHRyaW5pZGFkLnZlcnNpb24+Mi4wLjAtYWxwaGEtMjwvdHJpbmlkYWQudmVyc2lvbj4NCi0gICAgPC9wcm9wZXJ0aWVzPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvcGFyZW50L0xJQ0VOU0UudHh0IGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3BhcmVudC9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViNTI0OC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvcGFyZW50L0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCi0NCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMNCi0NCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuDQotDQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcNCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iDQotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUNCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQ0KLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQ0KLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUNCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXINCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuDQotDQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdDQotDQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3BhcmVudC9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3BhcmVudC9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTVhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9wYXJlbnQvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9wYXJlbnQvcG9tLnhtbCBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9wYXJlbnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y4ZTNlNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvcGFyZW50L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj42PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4yLjAuMzwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFByb2plY3QgUGFyZW50PC9uYW1lPgotICAgIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjIwPC91cmw+Ci0KLSAgICA8aXNzdWVNYW5hZ2VtZW50PgotICAgICAgICA8c3lzdGVtPmppcmE8L3N5c3RlbT4KLSAgICAgICAgPHVybD5odHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvRVhUVkFMPC91cmw+Ci0gICAgPC9pc3N1ZU1hbmFnZW1lbnQ+Ci0KLSAgICA8Y2lNYW5hZ2VtZW50PgotICAgICAgICA8c3lzdGVtPmNvbnRpbnV1bTwvc3lzdGVtPgotICAgICAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLnpvbmVzLmFwYWNoZS5vcmc6ODA4MC9jb250aW51dW08L3VybD4KLSAgICAgICAgPG5vdGlmaWVycz4KLSAgICAgICAgICAgIDxub3RpZmllcj4KLSAgICAgICAgICAgICAgICA8dHlwZT5tYWlsPC90eXBlPgotICAgICAgICAgICAgICAgIDxzZW5kT25TdWNjZXNzPnRydWU8L3NlbmRPblN1Y2Nlc3M+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhZGRyZXNzPmNvbW1pdHNAbXlmYWNlcy5hcGFjaGUub3JnPC9hZGRyZXNzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvbm90aWZpZXI+Ci0gICAgICAgIDwvbm90aWZpZXJzPgotICAgIDwvY2lNYW5hZ2VtZW50PgotICAgIAotICAgIDxpbmNlcHRpb25ZZWFyPjIwMDg8L2luY2VwdGlvblllYXI+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+TUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLQotICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KLSAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+Ci0KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS0KLSAgICAgICAgICAgICAgICAgICAgLSBDb3B5IExJQ0VOU0UudHh0IGFuZCBOT1RJQ0UudHh0IHNvIHRoYXQgdGhleSBhcmUgaW5jbHVkZWQKLSAgICAgICAgICAgICAgICAgICAgLSBpbiB0aGUgLWphdmFkb2MgamFyIGZpbGUgZm9yIHRoZSBjb21wb25lbnQuCi0gICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+amF2YWRvYy5yZXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hcGlkb2NzL01FVEEtSU5GIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTElDRU5TRS50eHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTk9USUNFLnR4dCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmphdmFkb2Muc2l0ZS5jb3B5PC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5zaXRlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENvcHkgamF2YWRvYyB0byBhbm90aGVyIGRpcmVjdG9yeSwgdG8ga2VlcCBqYXZhZG9jIG9mIHByZXZpb3VzIHZlcnNpb25zIG9uIHNpdGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zaXRlL2FwaWRvY3MtJHtwcm9qZWN0LnZlcnNpb259IiBmYWlsb25lcnJvcj0iZmFsc2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc2l0ZS9hcGlkb2NzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgICAgLSBNYWtlIGEgY2hlY2tzdHlsZSB2aW9sYXRpb24gYSBjb21waWxlIGVycm9yLiBOb3RlIHRoYXQgaWYgYSBjb21waWxlIGVycm9yIG9jY3VycywKLSAgICAgICAgICAgICAgICAtIGZ1cnRoZXIgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRhcmdldC9zaXRlL2NoZWNrc3R5bGUuaHRtbCAocHJlc2VudCBldmVuIHdoZW4KLSAgICAgICAgICAgICAgICAtIGp1c3QgdGhlIGNvbXBpbGUgZ29hbCBhbmQgbm90IHRoZSBzaXRlIGdvYWwgaGFzIGJlZW4gcnVuKS4gTm90ZSBhbHNvIHRoYXQgY2hpbGQKLSAgICAgICAgICAgICAgICAtIHByb2plY3RzIG1heSByZWRlY2xhcmUgdGhpcyBwbHVnaW4gYW5kIHByb3ZpZGUgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MKLSAgICAgICAgICAgICAgICAtIHRvIHVzZSBkaWZmZXJlbnQgY2hlY2tzIChtb3JlIG9yIGxlc3Mgc3RyaWN0IHRoYW4gdGhlIGRlZmF1bHQpLgotICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD52ZXJpZnktc3R5bGU8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWdMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0YW5kYXJkLnhtbDwvY29uZmlnTG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxoZWFkZXJMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtaGVhZGVyLnR4dDwvaGVhZGVyTG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tIFNldCBjb21waWxlIHNvdXJjZSBhdCAxLjUsIHNpbmNlIHRoZSB0YXJnZXQgSlNGIGltcGwgaXMgMi4wIC0tPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvcHRpbWl6ZT5mYWxzZTwvb3B0aW1pemU+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+ICAgICAgICAgICAgCi0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi0gICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+bWF2ZW4yLXJlcG9zaXRvcnkuZGV2LmphdmEubmV0PC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkphdmEubmV0IFJlcG9zaXRvcnkgZm9yIE1hdmVuPC9uYW1lPgotICAgICAgICAgICAgPHVybD5odHRwOi8vZG93bmxvYWQuamF2YS5uZXQvbWF2ZW4vMi88L3VybD4KLSAgICAgICAgICAgIDxsYXlvdXQ+ZGVmYXVsdDwvbGF5b3V0PgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgPC9yZXBvc2l0b3JpZXM+Ci0KLSAgICA8cmVwb3J0aW5nPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWp4ci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXJlcG9ydC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40LjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBtZC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cnVsZXNldHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvYmFzaWMueG1sPC9ydWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL3VudXNlZGNvZGUueG1sPC9ydWxlc2V0PgotICAgICAgICAgICAgICAgICAgICA8L3J1bGVzZXRzPgotICAgICAgICAgICAgICAgICAgICA8bGlua1hyZWY+dHJ1ZTwvbGlua1hyZWY+Ci0gICAgICAgICAgICAgICAgICAgIDxtaW5pbXVtVG9rZW5zPjEwMDwvbWluaW11bVRva2Vucz4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldEpkaz4xLjU8L3RhcmdldEpkaz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1jaGVja3Mtc3RhbmRhcmQueG1sPC9jb25maWdMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGhlYWRlckxvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1oZWFkZXIudHh0PC9oZWFkZXJMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvcmVwb3J0aW5nPgotCi0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGFncy8yXzBfMzwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzJfMF8zPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90YWdzLzJfMF8zPC91cmw+Ci0gICAgPC9zY20+Ci0KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDx1bmlxdWVWZXJzaW9uPmZhbHNlPC91bmlxdWVWZXJzaW9uPgotICAgICAgICAgICAgPGlkPmFwYWNoZS5zbmFwc2hvdHM8L2lkPgotICAgICAgICAgICAgPG5hbWU+QXBhY2hlIE1hdmVuIFNuYXBzaG90IFJlcG9zaXRvcnk8L25hbWU+Ci0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4KLSAgICAgICAgPC9zbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgICAgIDxzaXRlPgotICAgICAgICAgICAgPGlkPmFwYWNoZS1zaXRlPC9pZD4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjIwPC91cmw+Ci0gICAgICAgIDwvc2l0ZT4KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0KLSAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmdlbmVyYXRlLWFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+cGVyZm9ybVJlbGVhc2U8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDx2YWx1ZT50cnVlPC92YWx1ZT4KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLWphdmFkb2NzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLQotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8anNmLnZlcnNpb24+Mi4wLjAtYmV0YS0yPC9qc2YudmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3BhcmVudC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3BhcmVudC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjVmYmM1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIC0tLS0tLQ0KLU92ZXJ2aWV3DQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMi4wDQotDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLnggYW5kIEpTRiAyLnguIEFsbCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41Kw0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9wYXJlbnQvc3JjL3NpdGUvYXB0L2phdmFkb2MuYXB0IGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3BhcmVudC9zcmMvc2l0ZS9hcHQvamF2YWRvYy5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZmQzNmYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3BhcmVudC9zcmMvc2l0ZS9hcHQvamF2YWRvYy5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0gLS0tLS0tDQotSmF2YWRvYw0KLSAtLS0tLS0NCi0NCi1KYXZhZG9jDQotDQotICAgIEhlcmUgeW91IGNhbiBmaW5kIHRoZSBqYXZhZG9jIG9mIHByZXZpb3VzIGV4dHZhbCB2ZXJzaW9ucy4NCi0NCi0gICAgKiB7e3todHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvbXlmYWNlcy1leHR2YWwtY29yZS9hcGlkb2NzLTEuMi4xL2luZGV4Lmh0bWx9TXlmYWNlcyBFeHRWYWwgQ29yZSBWZXJzaW9uIDEuMi4xfX0NCi0NCi0gICAgKiB7e3todHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvdmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbi9hcGlkb2NzLTEuMi4xL2luZGV4Lmh0bWx9TXlmYWNlcyBFeHRWYWwgUHJvcGVydHkgVmFsaWRhdGlvbiBWZXJzaW9uIDEuMi4xfX0NCi0NCi0gICAgKiB7e3todHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvbXlmYWNlcy1leHR2YWwtY29yZS9hcGlkb2NzLTEuMi4yL2luZGV4Lmh0bWx9TXlmYWNlcyBFeHRWYWwgQ29yZSBWZXJzaW9uIDEuMi4yfX0NCi0NCi0gICAgKiB7e3todHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvdmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbi9hcGlkb2NzLTEuMi4yL2luZGV4Lmh0bWx9TXlmYWNlcyBFeHRWYWwgUHJvcGVydHkgVmFsaWRhdGlvbiBWZXJzaW9uIDEuMi4yfX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvcGFyZW50L3NyYy9zaXRlL3NpdGUueG1sIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3BhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVhNGZmMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvcGFyZW50L3NyYy9zaXRlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pg0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxwcm9qZWN0IG5hbWU9IkFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIj4NCi0gIDxiYW5uZXJMZWZ0Pg0KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBFeHRWYWw8L25hbWU+DQotICAgIDxzcmM+aW1hZ2VzL2V4dHZhbF9sb2dvLnBuZzwvc3JjPg0KLSAgICA8aHJlZj5odHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2luZGV4Lmh0bWw8L2hyZWY+DQotICA8L2Jhbm5lckxlZnQ+DQotDQotICA8YmFubmVyUmlnaHQ+DQotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzPC9uYW1lPg0KLSAgICA8c3JjPmltZy9iYW5uZXJzL015RmFjZXNfbG9nby5qcGc8L3NyYz4NCi0gICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sPC9ocmVmPg0KLSAgPC9iYW5uZXJSaWdodD4NCi0NCi0gIDxwdWJsaXNoRGF0ZSBmb3JtYXQ9ImRkIE1NTSB5eXl5Ii8+DQotDQotICA8c2tpbj4NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLm1hdmVuPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLXNpdGUtc2tpbjwvYXJ0aWZhY3RJZD4NCi0gICAgPHZlcnNpb24+MS1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gIDwvc2tpbj4NCi0NCi0gIDxib2R5Pg0KLSAgICA8bGlua3M+DQotICAgICAgPGl0ZW0gbmFtZT0iQXBhY2hlIiBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmciLz4NCi0gICAgICA8aXRlbSBuYW1lPSJNeUZhY2VzIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4NCi0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCBNeWZhY2VzIEV4dFZhbCIgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9kb3dubG9hZC5odG1sIi8+DQotICAgIDwvbGlua3M+DQotDQotICAgIDxtZW51IG5hbWU9IkFwYWNoZSBNeUZhY2VzIiBpbmhlcml0PSJ0b3AiPg0KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4NCi0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9kb3dubG9hZC5odG1sIi8+DQotICAgIDwvbWVudT4NCi0NCi0gICAgPG1lbnUgbmFtZT0iQ29udGVudHMiIGluaGVyaXQ9InRvcCI+DQotICAgICAgICA8aXRlbSBuYW1lPSJNYWluIFNpdGUiICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sIi8+DQotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjEiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS9pbmRleC5odG1sIiBjb2xsYXBzZT0idHJ1ZSI+DQotICAgICAgICAgICAgPGl0ZW0gbmFtZT0iZHVtbXkiICAgICAgICBocmVmPSJkdW1teSIvPg0KLSAgICAgICAgPC9pdGVtPg0KLSAgICAgICAgPGl0ZW0gbmFtZT0iRXh0VmFsIGZvciBKU0YgMS4yIiAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9pbmRleC5odG1sIj4NCi0gICAgICAgICAgICAgIDxpdGVtIG5hbWU9IkNvcmUgTW9kdWxlIiAgICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL215ZmFjZXMtZXh0dmFsLWNvcmUvaW5kZXguaHRtbCIvPg0KLSAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iUHJvcGVydHkgVmFsaWRhdGlvbiIgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvdmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtcHJvcGVydHktdmFsaWRhdGlvbi9pbmRleC5odG1sIi8+DQotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJUcmluaWRhZCBTdXBwb3J0IiAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtdHJpbmlkYWQtc3VwcG9ydC9pbmRleC5odG1sIi8+DQotICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJHZW5lcmljIFN1cHBvcnQiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMi9jb21wb25lbnQtc3VwcG9ydC1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtZ2VuZXJpYy1zdXBwb3J0L2luZGV4Lmh0bWwiLz4NCi0gICAgICAgIDwvaXRlbT4NCi0gICAgPC9tZW51Pg0KLQkNCi0gICAgPG1lbnUgbmFtZT0iRG9jdW1lbnRhdGlvbiI+DQotICAgICAgPGl0ZW0gbmFtZT0iV2lraSIgICAgICAgICBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL215ZmFjZXMvRXh0ZW5zaW9ucy9WYWxpZGF0b3IvIi8+DQotICAgICAgPGl0ZW0gbmFtZT0iSmF2YWRvYyIgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvamF2YWRvYy5odG1sIi8+DQotICAgIDwvbWVudT4NCi0NCi0gICAgPG1lbnUgcmVmPSJyZXBvcnRzIi8+DQotDQotICAgIDxtZW51IG5hbWU9IkZvdW5kYXRpb24iIGluaGVyaXQ9ImJvdHRvbSI+DQotICAgICAgPGl0ZW0gbmFtZT0iQVNGIiAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iIC8+DQotICAgICAgPGl0ZW0gbmFtZT0iU3BvbnNvcnNoaXAiICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3Nwb25zb3JzaGlwLmh0bWwiIC8+DQotICAgICAgPGl0ZW0gbmFtZT0iVGhhbmtzIiAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3RoYW5rcy5odG1sIiAvPg0KLSAgICA8L21lbnU+DQotICA8L2JvZHk+DQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9wb20ueG1sIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMGY1MTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtbW9kdWxlPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjIuMC4zPC92ZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3IgTW9kdWxlPC9uYW1lPgotICAgIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjIwPC91cmw+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8yXzBfMzwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JyYW5jaGVzLzJfMF8zPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8yXzBfMzwvdXJsPgotICAgIDwvc2NtPgotCi0gICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgICAgIDxzbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8dW5pcXVlVmVyc2lvbj5mYWxzZTwvdW5pcXVlVmVyc2lvbj4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUuc25hcHNob3RzPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBNYXZlbiBTbmFwc2hvdCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1zbmFwc2hvdC1yZXBvc2l0b3J5PC91cmw+Ci0gICAgICAgIDwvc25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICA8c2l0ZT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc2l0ZTwvaWQ+Ci0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IyMDwvdXJsPgotICAgICAgICA8L3NpdGU+Ci0gICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgotCi0gICAgPCEtLSBXQVJOSU5HOiBETyBOT1QgR0VORVJBVEUgU0lURSBGUk9NIEhFUkUgRElSRUNUTFkKLSAgICBTaW5jZSB0aGlzIHByb2plY3QgaGFzIGFuIGFzeW5jIHJlbGVhc2UgcHJvY2VkdXJlIChub3QKLSAgICBhbGwgbW9kdWxlcyBzaG91bGQgYmUgcmVsZWFzZWQgYXQgb25jZSksIHRoZSBwYXJlbnQgcG9tLnhtbCAKLSAgICBpcyBub3QgdGhpcyAodGhlcmUgaXMgYSBtb2R1bGUgZm9yIHRoYXQpLiBVc2UgbWF2ZW4gc2l0ZSAKLSAgICBwbHVnaW4gaGVyZSBjYXVzZSBwcm9ibGVtcyB3aGVuIHRoZSBzaXRlIGlzIGdlbmVyYXRlZC4KLSAgICBUaGUgcHJvY2VkdXJlIG11c3QgZXhlY3V0ZSBzaXRlIGNvbW1tYW5kIGZpcnN0IG9uIHBhcmVudCAKLSAgICBtb2R1bGUgYW5kIHRoZW4gb24gZWFjaCBtb2R1bGUgbGlzdGVkIGJlbG93LiAKLSAgICAgLS0+Ci0KLSAgICA8bW9kdWxlcz4KLSAgICAgICAgPG1vZHVsZT5wYXJlbnQ8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5jb3JlPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+dmFsaWRhdGlvbi1tb2R1bGVzPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+Y29tcG9uZW50LXN1cHBvcnQ8L21vZHVsZT4KLSAgICAgICAgPCEtLW1vZHVsZT5leGFtcGxlczwvbW9kdWxlLS0+Ci0gICAgPC9tb2R1bGVzPgotCi0gICAgPHByb2ZpbGVzPgotICAgICAgICA8IS0tIFRoaXMgcHJvZmlsZSBpcyBpbnZva2VkIGJ5IC1EcHJlcGFyZVJlbGVhc2U9dHJ1ZS4gIFRoaXMgYWxsb3dzIG12biByZWxlYXNlOnByZXBhcmUgdG8KLSAgICAgICAgICAgIHJ1biBzdWNjZXNzZnVsbHkgb24gdGhlIGFzc2VtYmx5IHByb2plY3RzLiAtLT4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+cHJlcGFyZS1yZWxlYXNlPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+cHJlcGFyZVJlbGVhc2U8L25hbWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxtb2R1bGVzPgotICAgICAgICAgICAgICAgIDxtb2R1bGU+YXNzZW1ibHk8L21vZHVsZT4KLSAgICAgICAgICAgIDwvbW9kdWxlcz4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ3VtZW50cz4tRHByZXBhcmVSZWxlYXNlPC9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotICAgIAotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8anNmLnZlcnNpb24+Mi4wLjAtYmV0YS0yPC9qc2YudmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3NpdGUvcG9tLnhtbCBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9zaXRlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjODY0MzUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3NpdGUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAgICAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgICAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gICAgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAgICAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICAgICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gICAgKg0KLSAgICAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICAgICoNCi0gICAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICAgICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICAgICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0NCi0gICAgPHBhcmVudD4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj42PC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1zaXRlPC9hcnRpZmFjdElkPg0KLSAgICA8dmVyc2lvbj4yLjAuMy1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucy1WYWxpZGF0b3I8L25hbWU+DQotICAgIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjwvdXJsPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8ZGVmYXVsdEdvYWw+c2l0ZTwvZGVmYXVsdEdvYWw+DQotICAgICAgICA8ZXh0ZW5zaW9ucz4NCi0gICAgICAgICAgPGV4dGVuc2lvbj4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLndhZ29uPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPndhZ29uLXNzaC1leHRlcm5hbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtNTwvdmVyc2lvbj4NCi0gICAgICAgICAgPC9leHRlbnNpb24+DQotICAgICAgICA8L2V4dGVuc2lvbnM+DQotICAgIDwvYnVpbGQ+DQotICAgIDxyZXBvcnRpbmc+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvcmVwb3J0aW5nPg0KLSAgICA8c2NtPg0KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdHJ1bmsvc2l0ZTwvY29ubmVjdGlvbj4NCi0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay9zaXRlPC9kZXZlbG9wZXJDb25uZWN0aW9uPg0KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90cnVuay9zaXRlPC91cmw+DQotICAgIDwvc2NtPg0KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4NCi0gICAgICA8c2l0ZT4NCi0gICAgICAgIDxpZD5hcGFjaGUtc2l0ZTwvaWQ+DQotICAgICAgICA8bmFtZT5BcGFjaGUgV2Vic2l0ZTwvbmFtZT4NCi0gICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjwvdXJsPg0KLSAgICAgIDwvc2l0ZT4NCi0gICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50Pg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvc2l0ZS9zcmMvc2l0ZS9hcHQvZG93bmxvYWQuYXB0IGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3NpdGUvc3JjL3NpdGUvYXB0L2Rvd25sb2FkLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1MTRlMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvc2l0ZS9zcmMvc2l0ZS9hcHQvZG93bmxvYWQuYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLSB+fiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gfn4gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotIH5+IHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gfn4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gfn4gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gfn4gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gfn4NCi0gfn4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gfn4NCi0gfn4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSB+fiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSB+fiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gfn4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSB+fiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gDQotIC0tLS0tLQ0KLURvd25sb2FkIEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotIC0tLS0tLQ0KLQ0KLURvd25sb2FkIEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotDQotDQotICBVc2UgdGhlIGxpbmtzIGJlbG93IHRvIGRvd25sb2FkIGEgZGlzdHJpYnV0aW9uIG9mIEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZyb20NCi0gIG9uZSBvZiBvdXIgbWlycm9ycy4gSXQgaXMgZ29vZCBwcmFjdGljZSB0byB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGUNCi0gIGRpc3RyaWJ1dGlvbiBmaWxlcy4NCi0NCi0gIFlvdSB3aWxsIGJlIHByb21wdGVkIGZvciBhIG1pcnJvciAtIGlmIHRoZSBmaWxlIGlzIG5vdCBmb3VuZCBvbiB5b3VycywgcGxlYXNlIGJlIHBhdGllbnQsIGFzIGl0IG1heSB0YWtlIDI0DQotICBob3VycyB0byByZWFjaCBhbGwgbWlycm9ycy4NCi0NCi0gIEFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGRpc3RyaWJ1dGVkIGFzIGEgPDw8emlwPj4+IGFyY2hpdmUgKGZvciBXaW5kb3dzKSBhbmQNCi0gIGFzIGEgPDw8dGFyLmd6Pj4+IGFyY2hpdmUgKGZvciBVTklYKS4gVGhlIGNvbnRlbnQgaXMgdGhlIHNhbWUuIFBsZWFzZSBub3RlDQotICB0aGF0IHRoZSA8PDx0YXIuZ3o+Pj4gYXJjaGl2ZXMgY29udGFpbiBmaWxlIG5hbWVzIGxvbmdlciB0aGFuIDEwMCBjaGFyYWN0ZXJzIGFuZCBoYXZlIGJlZW4NCi0gIGNyZWF0ZWQgdXNpbmcgR05VIHRhciBleHRlbnNpb25zLiBUaHVzIHRoZXkgbXVzdCBiZSB1bnRhcnJlZCB3aXRoIGEgR05VIGNvbXBhdGlibGUNCi0gIHZlcnNpb24gb2YgdGFyLg0KLQ0KLSAgPDwgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgMS4wLjAgRGlzdHJpYnV0aW9uID4+DQotDQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCAgICAgICAgICAgICAgICAgICAgICAgICB8IE1pcnJvcnMgfCBDaGVja3N1bSB8IFNpZ25hdHVyZSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4xIDEuMS4yICh0YXIuZ3opICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nen0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nei5tZDV9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nei5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6LmFzY30gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6LmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjEgMS4xLjIgKHppcCkgICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnppcH0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4uemlwfX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnppcC5tZDV9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnppcC5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4uemlwLmFzY30gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4uemlwLmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjEgMS4xLjIgU291cmNlICh0YXIuZ3opICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy50YXIuZ3p9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnRhci5nen19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMudGFyLmd6Lm1kNX0gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMudGFyLmd6Lm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMudGFyLmd6LmFzY30gbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMudGFyLmd6LmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjEgMS4xLjIgU291cmNlICh6aXApICAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1zcmMuemlwfSBteWZhY2VzLWV4dHZhbDExLTEuMS4yLXNyYy56aXB9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnppcC5tZDV9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnppcC5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnppcC5hc2N9IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItc3JjLnppcC5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotfCBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGZvciBKU0YgMS4yIDEuMi4yICh0YXIuZ3opICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnRhci5nen0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4udGFyLmd6fX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnRhci5nei5tZDV9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnRhci5nei5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4udGFyLmd6LmFzY30gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4udGFyLmd6LmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjIgMS4yLjIgKHppcCkgICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnppcH0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4uemlwfX0gfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9teWZhY2VzL2JpbmFyaWVzL215ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnppcC5tZDV9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItYmluLnppcC5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvYmluYXJpZXMvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4uemlwLmFzY30gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1iaW4uemlwLmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjIgMS4yLjIgU291cmNlICh0YXIuZ3opICAgICB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS9teWZhY2VzL3NvdXJjZS9teWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy50YXIuZ3p9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnRhci5nen19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMudGFyLmd6Lm1kNX0gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMudGFyLmd6Lm1kNX19IHwge3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMudGFyLmd6LmFzY30gbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMudGFyLmd6LmFzY319IHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsNCi18IE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZm9yIEpTRiAxLjIgMS4yLjIgU291cmNlICh6aXApICAgICAgfCB7e3todHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvbXlmYWNlcy9zb3VyY2UvbXlmYWNlcy1leHR2YWwxMi0xLjIuMi1zcmMuemlwfSBteWZhY2VzLWV4dHZhbDEyLTEuMi4yLXNyYy56aXB9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnppcC5tZDV9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnppcC5tZDV9fSB8IHt7e2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L215ZmFjZXMvc291cmNlL215ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnppcC5hc2N9IG15ZmFjZXMtZXh0dmFsMTItMS4yLjItc3JjLnppcC5hc2N9fSB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rDQotDQotTGF0ZXN0IHNvdXJjZSBjb2RlIGZyb20gU1ZOIHJlcG9zaXRvcnkNCi0NCi0gICAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBsYXRlc3QgQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgZmVhdHVyZXMsIHRoZSBzb3VyY2UgY29kZSBpcyB1bmRlcg0KLSAgICB2ZXJzaW9uIGNvbnRyb2wgd2l0aCBTVk4uICBDbGljayB7e3tzb3VyY2UtcmVwb3NpdG9yeS5odG1sfSBoZXJlIH19DQotICAgIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIHRoZSBBU0YgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgU1ZOIFJlcG9zaXRvcnkuDQotDQotVmVyaWZ5aW5nIGNoZWNrc3Vtcw0KLQ0KLSAgICBJdCBpcyBlc3NlbnRpYWwgdGhhdCB5b3UgdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGRvd25sb2FkZWQNCi0gICAgZmlsZXMgdXNpbmcgdGhlIFBHUCBhbmQgTUQ1IHNpZ25hdHVyZXMuIE1ENSB2ZXJpZmljYXRpb24gZW5zdXJlcyB0aGUNCi0gICAgZmlsZSB3YXMgbm90IGNvcnJ1cHRlZCBkdXJpbmcgdGhlIGRvd25sb2FkIHByb2Nlc3MuIFBHUCB2ZXJpZmljYXRpb24NCi0gICAgZW5zdXJlcyB0aGF0IHRoZSBmaWxlIGNhbWUgZnJvbSBhIGNlcnRhaW4gcGVyc29uLg0KLQ0KLSAgICBUbyB2ZXJpZnkgdGhlIE1ENSBzaWduYXR1cmUgb24gdGhlIGZpbGVzLCB5b3UgbmVlZCB0byB1c2UgYSBwcm9ncmFtDQotICAgIGNhbGxlZCA8PDxtZDU+Pj4gb3IgPDw8bWQ1c3VtPj4+LCB3aGljaCBpcw0KLSAgICBpbmNsdWRlZCBpbiBtYW55IFVOSVggZGlzdHJpYnV0aW9ucy4gIEl0IGlzIGFsc28gYXZhaWxhYmxlIGFzIHBhcnQgb2YNCi0gICAge3t7aHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL3RleHR1dGlscy90ZXh0dXRpbHMuaHRtbH1HTlUgVGV4dHV0aWxzfX0uDQotICAgIFdpbmRvd3MgdXNlcnMgY2FuIGdldCBiaW5hcnkgbWQ1IHByb2dyYW1zIGZyb20ge3t7aHR0cDovL3d3dy5mb3VybWlsYWIuY2gvbWQ1L31oZXJlfX0sDQotICAgIHt7e2h0dHA6Ly93d3cucGMtdG9vbHMubmV0L3dpbjMyL2ZyZWV3YXJlL2NvbnNvbGUvfWhlcmV9fSwgb3INCi0gICAge3t7aHR0cDovL3d3dy5zbGF2YXNvZnQuY29tL2ZzdW0vfWhlcmV9fS4NCi0NCi1WZXJpZnlpbmcgc2lnbmF0dXJlcw0KLQ0KLSAgCVBHUCB2ZXJpZmljYXRpb24gZW5zdXJlcyB0aGF0IHRoZSBmaWxlIGNhbWUgZnJvbSBhIGNlcnRhaW4gcGVyc29uLiAgV2Ugc3Ryb25nbHkgcmVjb21tZW5kDQotCSAgeW91IHZlcmlmeSB5b3VyIGRvd25sb2FkcyB3aXRoIGJvdGggUEdQIGFuZCBNRDUuDQotDQotCVRoZSBQR1Agc2lnbmF0dXJlcyBjYW4gYmUgdmVyaWZpZWQgdXNpbmcge3t7aHR0cDovL3d3dy5wZ3BpLm9yZy99UEdQfX0gb3IgDQotCXt7e2h0dHA6Ly93d3cuZ251cGcub3JnL31HUEd9fS4gIEZpcnN0IGRvd25sb2FkIHRoZSBBcGFjaGUgTXlGYWNlcyANCi0Je3t7aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbXlmYWNlcy9LRVlTfUtFWVN9fQlhcyB3ZWxsIGFzIHRoZSA8PDxhc2M+Pj4gc2lnbmF0dXJlIGZpbGUgDQotCWZvciB0aGUgcGFydGljdWxhciBkaXN0cmlidXRpb24uIEl0IGlzIGltcG9ydGFudCB0aGF0IHlvdSBnZXQgdGhlc2UgZmlsZXMgZnJvbSB0aGUgdWx0aW1hdGUNCi0JdHJ1c3RlZCBzb3VyY2UgLSB0aGUgbWFpbiBBU0YgZGlzdHJpYnV0aW9uIHNpdGUsIHJhdGhlciB0aGFuIGZyb20gYSBtaXJyb3IuDQotCVRoZW4gdmVyaWZ5IHRoZSBzaWduYXR1cmVzIHVzaW5nIC4uLg0KLQ0KLQkgIDw8PA0KLQkgICUgcGdwayAtYSBLRVlTDQotCSAgJSBwZ3B2IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nei5hc2MgbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6DQotCSAgPj4+DQotDQotCSAgPG9yPg0KLQ0KLQkgIDw8PA0KLQkgICUgcGdwIC1rYSBLRVlTDQotCSAgJSBwZ3AgbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6LmFzYyBteWZhY2VzLWV4dHZhbDExLTEuMS4yLWJpbi50YXIuZ3oNCi0JICA+Pj4NCi0NCi0JICA8b3I+DQotDQotCSAgPDw8DQotICAJJSBncGcgLS1pbXBvcnQgS0VZUw0KLQkgICUgZ3BnIC0tdmVyaWZ5IG15ZmFjZXMtZXh0dmFsMTEtMS4xLjItYmluLnRhci5nei5hc2MgbXlmYWNlcy1leHR2YWwxMS0xLjEuMi1iaW4udGFyLmd6DQotCSAgPj4+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3NpdGUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS9zaXRlL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMDk1NTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3NpdGUvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLSAtLS0tLS0NCi0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBPdmVydmlldw0KLQ0KLSAgICBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yIGlzIGEgSlNGIGNlbnRyaWMgdmFsaWRhdGlvbiBmcmFtZXdvcmsuDQotICANCi0gICAgSXQgb2ZmZXJzIHBvd2VyZnVsIGFuZCBlYXN5IHRvIHVzZSBmaWVsZCBiYXNlZCB2YWxpZGF0aW9uIGJhc2VkIG9uIGFubm90YXRpb25zLg0KLUl0IGhhcyBhIHBsdWdnYWJsZSBhcmNoaXRlY3R1cmUsIHNvIGl0IGlzIHBvc3NpYmxlIHRvIGFkZCBuZXcgdmFsaWRhdGlvbiBtb2R1bGVzIG9yIHN1cHBvcnQgZm9yIGNvbXBvbmVudCBsaWJyYXJpZXMgbGlrZSBUcmluaWRhZCBvciBvdGhlciAzcmQgcGFydHkgZnJhbWV3b3Jrcy4NCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBpcyBjb21wYXRpYmxlIHdpdGggSlNGIDEueCBhbmQgSlNGIDIueC4gQWxsIHZlcnNpb25zIHJlcXVpcmUgSmF2YSAxLjUrDQotDQotICAgIEZ1cnRoZXIgaW5mb3JtYXRpb24gYXJlIGF2YWlsYWJsZSBhdCB0aGUge3t7aHR0cDovL3dpa2kuYXBhY2hlLm9yZy9teWZhY2VzL0V4dGVuc2lvbnMvVmFsaWRhdG9yL31XaWtpfX0uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3NpdGUvc3JjL3NpdGUvc2l0ZS54bWwgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvc2l0ZS9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ViYzlmZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvc2l0ZS9zcmMvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4NCi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08cHJvamVjdCBuYW1lPSJBcGFjaGUgTXlmYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciI+DQotICA8YmFubmVyTGVmdD4NCi0gICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0VmFsPC9uYW1lPg0KLSAgICA8c3JjPmltYWdlcy9leHR2YWxfbG9nby5wbmc8L3NyYz4NCi0gICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sPC9ocmVmPg0KLSAgPC9iYW5uZXJMZWZ0Pg0KLQ0KLSAgPGJhbm5lclJpZ2h0Pg0KLSAgICA8bmFtZT5BcGFjaGUgTXlGYWNlczwvbmFtZT4NCi0gICAgPHNyYz5pbWcvYmFubmVycy9NeUZhY2VzX2xvZ28uanBnPC9zcmM+DQotICAgIDxocmVmPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbDwvaHJlZj4NCi0gIDwvYmFubmVyUmlnaHQ+IA0KLQ0KLSAgPHB1Ymxpc2hEYXRlIGZvcm1hdD0iZGQgTU1NIHl5eXkiLz4NCi0NCi0gIDxza2luPg0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtc2l0ZS1za2luPC9hcnRpZmFjdElkPg0KLSAgICA8dmVyc2lvbj4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgPC9za2luPg0KLQ0KLSAgPGJvZHk+DQotICAgIDxsaW5rcz4NCi0gICAgICA8aXRlbSBuYW1lPSJBcGFjaGUiIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZyIvPg0KLSAgICAgIDxpdGVtIG5hbWU9Ik15RmFjZXMiIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPg0KLSAgICAgIDxpdGVtIG5hbWU9IkRvd25sb2FkIE15ZmFjZXMgRXh0VmFsIiAgICAgICBocmVmPSJkb3dubG9hZC5odG1sIi8+DQotICAgIDwvbGlua3M+DQotDQotICAgIDxtZW51IG5hbWU9IkFwYWNoZSBNeUZhY2VzIiBpbmhlcml0PSJ0b3AiPg0KLSAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4NCi0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9kb3dubG9hZC5odG1sIi8+DQotICAgIDwvbWVudT4NCi0NCi0gICAgPG1lbnUgbmFtZT0iQ29udGVudHMiIGluaGVyaXQ9InRvcCI+DQotICAgICAgICA8aXRlbSBuYW1lPSJNYWluIFNpdGUiICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sIi8+DQotICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjEiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS9pbmRleC5odG1sIiBjb2xsYXBzZT0idHJ1ZSI+DQotICAgICAgICAgICAgPGl0ZW0gbmFtZT0iZHVtbXkiICAgICAgICBocmVmPSJkdW1teSIvPg0KLSAgICAgICAgPC9pdGVtPg0KLSAgICAgICAgPGl0ZW0gbmFtZT0iRXh0VmFsIGZvciBKU0YgMS4yIiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTIvaW5kZXguaHRtbCIgY29sbGFwc2U9InRydWUiPg0KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9ImR1bW15IiAgICAgICAgaHJlZj0iZHVtbXkiLz4NCi0gICAgICAgIDwvaXRlbT4NCi0gICAgPC9tZW51Pg0KLQ0KLSAgICA8bWVudSBuYW1lPSJEb2N1bWVudGF0aW9uIj4NCi0gICAgICA8aXRlbSBuYW1lPSJXaWtpIiAgICAgICAgIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvbXlmYWNlcy9FeHRlbnNpb25zL1ZhbGlkYXRvci8iLz4NCi0gICAgPC9tZW51Pg0KLQ0KLSAgICA8bWVudSByZWY9InJlcG9ydHMiLz4NCi0NCi0gICAgPG1lbnUgbmFtZT0iRm91bmRhdGlvbiIgaW5oZXJpdD0idG9wIj4NCi0gICAgICA8aXRlbSBuYW1lPSJBU0YiICAgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIgLz4NCi0gICAgICA8aXRlbSBuYW1lPSJTcG9uc29yc2hpcCIgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vc3BvbnNvcnNoaXAuaHRtbCIgLz4NCi0gICAgICA8aXRlbSBuYW1lPSJUaGFua3MiICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vdGhhbmtzLmh0bWwiIC8+DQotICAgIDwvbWVudT4NCi0gIDwvYm9keT4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vcG9tLnhtbCBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZjAzYmIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBCZWFuLVZhbGlkYXRpb24tSW50ZWdyYXRpb24tTW9kdWxlIChKU1IgMzAzKTwvbmFtZT4KLSAgICA8dmVyc2lvbj4yLjAuMzwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPnZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjAuMzwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxyZXBvc2l0b3JpZXM+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPmpib3NzPC9pZD4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3JlcG9zaXRvcnkuamJvc3MuY29tL21hdmVuMjwvdXJsPgotICAgICAgICAgICAgPHJlbGVhc2VzPgotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+Ci0gICAgICAgICAgICA8L3JlbGVhc2VzPgotICAgICAgICAgICAgPHNuYXBzaG90cz4KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4KLSAgICAgICAgICAgIDwvc25hcHNob3RzPgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPmpib3NzLXNuYXBzaG90PC9pZD4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3NuYXBzaG90cy5qYm9zcy5vcmcvbWF2ZW4yPC91cmw+Ci0gICAgICAgICAgICA8cmVsZWFzZXM+Ci0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4KLSAgICAgICAgICAgIDwvcmVsZWFzZXM+Ci0gICAgICAgICAgICA8c25hcHNob3RzPgotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+Ci0gICAgICAgICAgICA8L3NuYXBzaG90cz4KLSAgICAgICAgPC9yZXBvc2l0b3J5PgotICAgIDwvcmVwb3NpdG9yaWVzPgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnZhbGlkYXRpb248L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wLkdBPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmVsLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40LjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL0Fic3RyYWN0Ki5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovVGVzdFV0aWxzLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qQmVhbi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgICAgICAgICAgIAotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2NvbmZpZy9mYWNlcy1jb25maWcueG1sIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZWUzMTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18yXzAueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMi4wIj4NCi0gICAgPGZhY3Rvcnk+DQotICAgICAgICA8YXBwbGljYXRpb24tZmFjdG9yeT5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5mYWN0b3J5LkV4dFZhbEFwcGxpY2F0aW9uRmFjdG9yeTwvYXBwbGljYXRpb24tZmFjdG9yeT4NCi0gICAgPC9mYWN0b3J5Pg0KLSAgICA8bGlmZWN5Y2xlPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0YXJ0dXAuSlNGMkF3YXJlQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICAgICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0YXJ0dXAuQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXI8L3BoYXNlLWxpc3RlbmVyPg0KLSAgICA8L2xpZmVjeWNsZT4NCi08L2ZhY2VzLWNvbmZpZz4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuQXdhcmVDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuQXdhcmVDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2E3NDA0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhbkF3YXJlQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7DQotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgQmVhbkF3YXJlQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeQ0KLXsNCi0gICAgcHJpdmF0ZSBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBjb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeTsNCi0NCi0gICAgcHVibGljIEJlYW5Bd2FyZUNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KQ0KLSAgICB7DQotICAgICAgICBzZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeShjb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkpDQotICAgIHsNCi0gICAgICAgIGlmKGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibnVsbCBpcyBub3QgYWxsb3dlZCBoZXJlIik7DQotICAgICAgICB9DQotICAgICAgICB0aGlzLmNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5ID0gY29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gImFsbG93IHRoZSByZWdpc3RyYXRpb24gb2YgYSBjdXN0b20gcHJlZml4IikNCi0gICAgcHVibGljIDxUIGV4dGVuZHMgQ29uc3RyYWludFZhbGlkYXRvcjw/LCA/Pj4gVCBnZXRJbnN0YW5jZShDbGFzczxUPiB0YXJnZXRDbGFzcykNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRvckNsYXNzTmFtZSA9IHRhcmdldENsYXNzLmdldFNpbXBsZU5hbWUoKTsNCi0gICAgICAgIE9iamVjdCByZXN1bHQgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4oY3JlYXRlQmVhbk5hbWUodmFsaWRhdG9yQ2xhc3NOYW1lKSk7DQotDQotICAgICAgICBpZihyZXN1bHQgIT0gbnVsbCAmJiB0YXJnZXRDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHJlc3VsdC5nZXRDbGFzcygpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKFQpcmVzdWx0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuZ2V0SW5zdGFuY2UodGFyZ2V0Q2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZUJlYW5OYW1lKFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKHZhbGlkYXRvckNsYXNzTmFtZSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuQXdhcmVWYWxpZGF0b3JGYWN0b3J5LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5Bd2FyZVZhbGlkYXRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkNzZjNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5Bd2FyZVZhbGlkYXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yQ29udGV4dDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5NZXNzYWdlSW50ZXJwb2xhdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlRyYXZlcnNhYmxlUmVzb2x2ZXI7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeSBpbXBsZW1lbnRzIFZhbGlkYXRvckZhY3RvcnkNCi17DQotICAgIHByaXZhdGUgVmFsaWRhdG9yRmFjdG9yeSB2YWxpZGF0b3JGYWN0b3J5Ow0KLQ0KLSAgICBwdWJsaWMgQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeShWYWxpZGF0b3JGYWN0b3J5IHZhbGlkYXRvckZhY3RvcnkpDQotICAgIHsNCi0gICAgICAgIHNldFZhbGlkYXRvckZhY3RvcnkodmFsaWRhdG9yRmFjdG9yeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yRmFjdG9yeShWYWxpZGF0b3JGYWN0b3J5IHZhbGlkYXRvckZhY3RvcnkpDQotICAgIHsNCi0gICAgICAgIGlmKHZhbGlkYXRvckZhY3RvcnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJudWxsIGlzIG5vdCBhbGxvd2VkIGhlcmUiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRoaXMudmFsaWRhdG9yRmFjdG9yeSA9IHZhbGlkYXRvckZhY3Rvcnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeS5nZXRWYWxpZGF0b3IoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVmFsaWRhdG9yQ29udGV4dCB1c2luZ0NvbnRleHQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeS51c2luZ0NvbnRleHQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZUludGVycG9sYXRvciBnZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRvckZhY3RvcnkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBUcmF2ZXJzYWJsZVJlc29sdmVyIGdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeS5nZXRUcmF2ZXJzYWJsZVJlc29sdmVyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGdldENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBCZWFuQXdhcmVDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSh2YWxpZGF0b3JGYWN0b3J5LmdldENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyA8VD4gVCB1bndyYXAoQ2xhc3M8VD4gdENsYXNzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeS51bndyYXAodENsYXNzKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NTM2MjcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuVmFsaWRhdGlvbk1vZHVsZUtleTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVmFsaWRhdGlvbk1vZHVsZUtleQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQmVhblZhbGlkYXRpb25Nb2R1bGVLZXkNCi17DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk4YzkxMC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLkFic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC51dGlsLkJlYW5WYWxpZGF0aW9uVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscyBidmlVdGlscyA9DQotICAgICAgICAgICAgbmV3IEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzKHRoaXMubG9nZ2VyKTsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzUmVxdWlyZWRJbml0aWFsaXphdGlvblN1cHBvcnRlZCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb21wb25lbnQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoInN0YXJ0IHRvIGluaXQgY29tcG9uZW50ICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gYnZpVXRpbHMuZXh0cmFjdFByb3BlcnR5RGV0YWlscygNCi0gICAgICAgICAgICAgICAgZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZ2V0UHJvcGVydGllc0ZvckNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKHVpQ29tcG9uZW50KSk7DQotDQotICAgICAgICBpZiAocHJvcGVydHlEZXRhaWxzICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5pdENvbXBvbmVudFdpdGhQcm9wZXJ0eURldGFpbHMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgcHJvcGVydHlEZXRhaWxzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImluaXQgY29tcG9uZW50IG9mICIgKyB1aUNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZmluaXNoZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q29tcG9uZW50V2l0aFByb3BlcnR5RGV0YWlscyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscykNCi0gICAgew0KLSAgICAgICAgdGhpcy5idmlVdGlscy5pbml0Q29tcG9uZW50V2l0aFByb3BlcnR5RGV0YWlscyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBwcm9wZXJ0eURldGFpbHMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBnZXRQcm9wZXJ0eUluZm9ybWF0aW9uKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgYm9vbGVhbiB2YWxpZGF0ZVByb3BlcnR5ID0gaGFzQmVhblZhbGlkYXRpb25Db25zdHJhaW50cyhwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZVByb3BlcnR5KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImpzcjMwMyBzdGFydCB2YWxpZGF0aW9uIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcHJvY2Vzc0ZpZWxkVmFsaWRhdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGZpbmFsbHkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodmFsaWRhdGVQcm9wZXJ0eSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJqc3IzMDMgdmFsaWRhdGlvbiBmaW5pc2hlZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBNZXRhRGF0YUV4dHJhY3RvciBnZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcihNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBidmlVdGlscy5nZXRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3Rvcihwcm9wZXJ0aWVzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNCZWFuVmFsaWRhdGlvbkNvbnN0cmFpbnRzKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuYnZpVXRpbHMuaGFzQmVhblZhbGlkYXRpb25Db25zdHJhaW50cyhwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRmllbGRWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIC8qbm90IHVzZWQgeWV0IHN1cHBvcnRNdWx0aXBsZVZpb2xhdGlvbnNQZXJGaWVsZCgpKi8NCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPiB2aW9sYXRpb25zID0gdGhpcy5idmlVdGlscw0KLSAgICAgICAgICAgICAgICAudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIHByb2Nlc3NDb25zdHJhaW50VmlvbGF0aW9ucyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHZpb2xhdGlvbnMpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NDb25zdHJhaW50VmlvbGF0aW9ucyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb24+IHZpb2xhdGlvbnMpDQotICAgIHsNCi0gICAgICAgIGlmKHZpb2xhdGlvbnMgIT0gbnVsbCAmJiAhdmlvbGF0aW9ucy5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgQmVhblZhbGlkYXRpb25VdGlscy5wcm9jZXNzQ29uc3RyYWludFZpb2xhdGlvbnMoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCB2aW9sYXRpb25zKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIENsYXNzIGdldE1vZHVsZUtleSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBCZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZjhhN2IuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmdyb3Vwcy5EZWZhdWx0Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkJlYW5EZXNjcmlwdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkVsZW1lbnREZXNjcmlwdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzDQotew0KLSAgICBwcml2YXRlIExvZyBsb2dnZXI7DQotDQotICAgIEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzKExvZyBsb2dnZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyOw0KLSAgICB9DQotDQotICAgIFByb3BlcnR5RGV0YWlscyBleHRyYWN0UHJvcGVydHlEZXRhaWxzKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXNGb3JFeHRyYWN0aW9uKQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcmVzdWx0ID0gZ2V0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IocHJvcGVydGllc0ZvckV4dHJhY3Rpb24pDQotICAgICAgICAgICAgICAgIC5leHRyYWN0KGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpDQotICAgICAgICAgICAgICAgIC5nZXRJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdC5nZXRCYXNlT2JqZWN0KCkgPT0gbnVsbCAmJiB0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5sb2dnZXIud2Fybigibm8gYmFzZSBvYmplY3QgYXQgIiArIHJlc3VsdC5nZXRLZXkoKSArDQotICAgICAgICAgICAgICAgICAgICAiIGNvbXBvbmVudC1pZDogIiArIHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC5nZXRCYXNlT2JqZWN0KCkgIT0gbnVsbCA/IHJlc3VsdCA6IG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogYWxzbyBpbnZva2VzIG1ldGEtZGF0YSBleHRyYWN0aW9uIGludGVyY2VwdG9ycw0KLSAgICAgKiAoc2VlIGUuZy4gRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcikNCi0gICAgICovDQotICAgIE1ldGFEYXRhRXh0cmFjdG9yIGdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yV2l0aChwcm9wZXJ0aWVzKTsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIGluaXRDb21wb25lbnRXaXRoUHJvcGVydHlEZXRhaWxzKA0KLSAgICAgICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzKQ0KLSAgICB7DQotICAgICAgICBDbGFzc1tdIGZvdW5kR3JvdXBzID0gcmVzb2x2ZUdyb3VwcyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmIChmb3VuZEdyb3VwcyA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGZvdW5kR3JvdXBzLmxlbmd0aCA9PSAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvdW5kR3JvdXBzID0gbmV3IENsYXNzW117RGVmYXVsdC5jbGFzc307DQotICAgICAgICB9DQotDQotICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKTsNCi0NCi0gICAgICAgIHRhcmdldENsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyh0YXJnZXRDbGFzcyk7DQotDQotICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBlbGVtZW50RGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3JGb3IodGFyZ2V0Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpKTsNCi0NCi0gICAgICAgIGlmIChlbGVtZW50RGVzY3JpcHRvciA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHByb2Nlc3NFbGVtZW50RGVzY3JpcHRvcihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBmb3VuZEdyb3VwcywgZWxlbWVudERlc2NyaXB0b3IpOw0KLSAgICB9DQotDQotICAgIHZvaWQgcHJvY2Vzc0VsZW1lbnREZXNjcmlwdG9yKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1tdIGZvdW5kR3JvdXBzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBlbGVtZW50RGVzY3JpcHRvcikNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZXRhRGF0YTsNCi0NCi0gICAgICAgIGZvciAoQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gY29uc3RyYWludERlc2NyaXB0b3IgOg0KLSAgICAgICAgICAgICAgICBlbGVtZW50RGVzY3JpcHRvci5maW5kQ29uc3RyYWludHMoKS51bm9yZGVyZWRBbmRNYXRjaGluZ0dyb3Vwcyhmb3VuZEdyb3VwcykuZ2V0Q29uc3RyYWludERlc2NyaXB0b3JzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbWV0YURhdGEgPSB0cmFuc2Zvcm1Db25zdHJhaW50RGVzY3JpcHRvclRvTWV0YURhdGEoDQotICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50RGVzY3JpcHRvciwgZWxlbWVudERlc2NyaXB0b3IuZ2V0RWxlbWVudENsYXNzKCkpOw0KLQ0KLSAgICAgICAgICAgIGlmIChtZXRhRGF0YSAhPSBudWxsICYmICFtZXRhRGF0YS5pc0VtcHR5KCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5jb25maWd1cmVDb21wb25lbnRXaXRoTWV0YURhdGEoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiQ29uc3RyYWludERlc2NyaXB0b3IjaXNSZXBvcnRBc1NpbmdsZVZpb2xhdGlvbiIpDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1Db25zdHJhaW50RGVzY3JpcHRvclRvTWV0YURhdGEoDQotICAgICAgICAgICAgQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gY29uc3RyYWludERlc2NyaXB0b3IsIENsYXNzIGVsZW1lbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIE1ldGFEYXRhVHJhbnNmb3JtZXIgbWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0NCi0gICAgICAgIG1ldGFEYXRhVHJhbnNmb3JtZXIgPSBFeHRWYWxVdGlscy5nZXRNZXRhRGF0YVRyYW5zZm9ybWVyRm9yVmFsaWRhdGlvblN0cmF0ZWd5KA0KLSAgICAgICAgICAgICAgICBuZXcgQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5KGNvbnN0cmFpbnREZXNjcmlwdG9yLCBlbGVtZW50Q2xhc3MpKTsNCi0NCi0gICAgICAgIGlmIChtZXRhRGF0YVRyYW5zZm9ybWVyICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LnB1dEFsbCh0cmFuc2Zvcm1NZXRhRGF0YShtZXRhRGF0YVRyYW5zZm9ybWVyLCBjb25zdHJhaW50RGVzY3JpcHRvcikpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKCFjb25zdHJhaW50RGVzY3JpcHRvci5pc1JlcG9ydEFzU2luZ2xlVmlvbGF0aW9uKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgU2V0PENvbnN0cmFpbnREZXNjcmlwdG9yPD8+PiBjb21wb3NpbmdDb25zdHJhaW50cyA9IGNvbnN0cmFpbnREZXNjcmlwdG9yLmdldENvbXBvc2luZ0NvbnN0cmFpbnRzKCk7DQotICAgICAgICAgICAgaWYgKGNvbXBvc2luZ0NvbnN0cmFpbnRzICE9IG51bGwgJiYgIWNvbXBvc2luZ0NvbnN0cmFpbnRzLmlzRW1wdHkoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXRBbGwodHJhbnNmb3JtQ29tcG9zaW5nQ29uc3RyYWludHMoY29tcG9zaW5nQ29uc3RyYWludHMsIGVsZW1lbnRDbGFzcykpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybUNvbXBvc2luZ0NvbnN0cmFpbnRzKA0KLSAgICAgICAgICAgIFNldDxDb25zdHJhaW50RGVzY3JpcHRvcjw/Pj4gY29tcG9zaW5nQ29uc3RyYWludHMsIENsYXNzIGVsZW1lbnRDbGFzcykNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIGZvciAoQ29uc3RyYWludERlc2NyaXB0b3IgY29uc3RyYWludERlc2NyaXB0b3IgOiBjb21wb3NpbmdDb25zdHJhaW50cykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQucHV0QWxsKHRyYW5zZm9ybUNvbnN0cmFpbnREZXNjcmlwdG9yVG9NZXRhRGF0YShjb25zdHJhaW50RGVzY3JpcHRvciwgZWxlbWVudENsYXNzKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YSgNCi0gICAgICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXIsIENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IGNvbnN0cmFpbnREZXNjcmlwdG9yKQ0KLSAgICB7DQotICAgICAgICBNZXRhRGF0YUVudHJ5IGVudHJ5Ow0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQ7DQotICAgICAgICBpZiAodGhpcy5sb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhtZXRhRGF0YVRyYW5zZm9ybWVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW50aWF0ZWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGVudHJ5ID0gbmV3IE1ldGFEYXRhRW50cnkoKTsNCi0gICAgICAgIGVudHJ5LnNldEtleShjb25zdHJhaW50RGVzY3JpcHRvci5nZXRBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgZW50cnkuc2V0VmFsdWUoY29uc3RyYWludERlc2NyaXB0b3IpOw0KLQ0KLSAgICAgICAgcmVzdWx0ID0gbWV0YURhdGFUcmFuc2Zvcm1lci5jb252ZXJ0TWV0YURhdGEoZW50cnkpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBib29sZWFuIGhhc0JlYW5WYWxpZGF0aW9uQ29uc3RyYWludHMoUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMuZ2V0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKSk7DQotDQotICAgICAgICByZXR1cm4gZ2V0RGVzY3JpcHRvckZvcih0YXJnZXRDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCkpICE9IG51bGw7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkNCi0gICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb24+IHZhbGlkYXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIENsYXNzIGJhc2VCZWFuQ2xhc3MgPSBnZXRCYXNlQ2xhc3NUeXBlKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGdldFByb3BlcnR5VG9WYWxpZGF0ZShwcm9wZXJ0eUluZm9ybWF0aW9uKTsNCi0NCi0gICAgICAgIENsYXNzW10gZ3JvdXBzID0gcmVzb2x2ZUdyb3VwcyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsNCi0NCi0gICAgICAgIGlmIChncm91cHMgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFZhbGlkYXRvckZhY3RvcnkgdmFsaWRhdG9yRmFjdG9yeSA9IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWYWxpZGF0b3JGYWN0b3J5KCk7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeQ0KLSAgICAgICAgICAgICAgICAudXNpbmdDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLm1lc3NhZ2VJbnRlcnBvbGF0b3IoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKSkNCi0gICAgICAgICAgICAgICAgLmNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KHZhbGlkYXRvckZhY3RvcnkuZ2V0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoKSkNCi0gICAgICAgICAgICAgICAgLnRyYXZlcnNhYmxlUmVzb2x2ZXIodmFsaWRhdG9yRmFjdG9yeS5nZXRUcmF2ZXJzYWJsZVJlc29sdmVyKCkpDQotICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0b3IoKQ0KLSAgICAgICAgICAgICAgICAudmFsaWRhdGVWYWx1ZShiYXNlQmVhbkNsYXNzLCBwcm9wZXJ0eU5hbWUsIGNvbnZlcnRlZE9iamVjdCwgZ3JvdXBzKTsNCi0gICAgfQ0KLQ0KLSAgICBDbGFzcyBnZXRCYXNlQ2xhc3NUeXBlKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgQ2xhc3MgcmVzdWx0ID0gRXh0VmFsVXRpbHMuZ2V0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5SW5mb3JtYXRpb24pLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpOw0KLQ0KLSAgICAgICAgcmV0dXJuIFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MocmVzdWx0KTsNCi0gICAgfQ0KLQ0KLSAgICBTdHJpbmcgZ2V0UHJvcGVydHlUb1ZhbGlkYXRlKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmdldFByb3BlcnR5RGV0YWlscyhwcm9wZXJ0eUluZm9ybWF0aW9uKS5nZXRQcm9wZXJ0eSgpOw0KLSAgICB9DQotDQotICAgIENsYXNzW10gcmVzb2x2ZUdyb3VwcyhGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRHcm91cHMoDQotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmdldFZpZXdJZCgpLA0KLSAgICAgICAgICAgICAgICB1aUNvbXBvbmVudC5nZXRDbGllbnRJZChmYWNlc0NvbnRleHQpKTsNCi0gICAgfQ0KLQ0KLSAgICBFbGVtZW50RGVzY3JpcHRvciBnZXREZXNjcmlwdG9yRm9yKENsYXNzIHRhcmdldENsYXNzLCBTdHJpbmcgcHJvcGVydHkpDQotICAgIHsNCi0gICAgICAgIEJlYW5EZXNjcmlwdG9yIGJlYW5EZXNjcmlwdG9yID0gRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZhbGlkYXRvckZhY3RvcnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdG9yKCkuZ2V0Q29uc3RyYWludHNGb3JDbGFzcyh0YXJnZXRDbGFzcyk7DQotDQotICAgICAgICByZXR1cm4gYmVhbkRlc2NyaXB0b3IuZ2V0Q29uc3RyYWludHNGb3JQcm9wZXJ0eShwcm9wZXJ0eSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjN2M4NTYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5tZXNzYWdlLmludGVycG9sYXRvci5EZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5tZXNzYWdlLmludGVycG9sYXRvci5FeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuTW9kZWxWYWxpZGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuTW9kZWxWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5CZWFuVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5Nb2RlbFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWwuQmVhblZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLk1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuR3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yRmFjdG9yeTsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGNsYXNzIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBpbXBsZW1lbnRzIEdyb3VwU3RvcmFnZSwgTW9kZWxWYWxpZGF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgcHJvdGVjdGVkIGZpbmFsIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhnZXRDbGFzcygpKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5jbGFzcy5nZXROYW1lKCkgKyAiOktFWSI7DQotDQotICAgIHByaXZhdGUgTWVzc2FnZUludGVycG9sYXRvciBkZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcjsNCi0NCi0gICAgcHJpdmF0ZSBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOw0KLQ0KLSAgICBwcml2YXRlIEdyb3VwU3RvcmFnZSBncm91cFN0b3JhZ2U7DQotDQotICAgIHByaXZhdGUgTW9kZWxWYWxpZGF0aW9uU3RvcmFnZSBtb2RlbFZhbGlkYXRpb25TdG9yYWdlOw0KLQ0KLSAgICBwcml2YXRlIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCgpDQotICAgIHsNCi0gICAgICAgIGluaXRHcm91cFN0b3JhZ2UoKTsNCi0gICAgICAgIGluaXRNb2RlbFZhbGlkYXRpb25TdG9yYWdlKCk7DQotDQotICAgICAgICBpbml0TWVzc2FnZVJlc29sdmVyKCk7DQotICAgICAgICBpbml0TWVzc2FnZUludGVycG9sYXRvcigpOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyBzdGF0aWMgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0IGdldEN1cnJlbnRJbnN0YW5jZSgpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotDQotICAgICAgICBNYXAgcmVxdWVzdE1hcCA9IGZhY2VzQ29udGV4dC5nZXRFeHRlcm5hbENvbnRleHQoKS5nZXRSZXF1ZXN0TWFwKCk7DQotDQotICAgICAgICBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgY3VycmVudENvbnRleHQgPSAoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0KXJlcXVlc3RNYXAuZ2V0KEtFWSk7DQotDQotICAgICAgICBpZihjdXJyZW50Q29udGV4dCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gbmV3IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCgpOw0KLSAgICAgICAgICAgIHJlcXVlc3RNYXAucHV0KEtFWSwgY3VycmVudENvbnRleHQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRDb250ZXh0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBWYWxpZGF0b3JGYWN0b3J5IGdldFZhbGlkYXRvckZhY3RvcnkoKQ0KLSAgICB7DQotICAgICAgICBPYmplY3QgdmFsaWRhdG9yRmFjdG9yeSA9IEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmdldEdsb2JhbFByb3BlcnR5KFZhbGlkYXRvckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIGlmKHZhbGlkYXRvckZhY3RvcnkgaW5zdGFuY2VvZiBWYWxpZGF0b3JGYWN0b3J5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoVmFsaWRhdG9yRmFjdG9yeSl2YWxpZGF0b3JGYWN0b3J5Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oImZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0IGJ2IHZhbGlkYXRvciBmYWN0b3J5Iik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gQmVhblZhbGlkYXRpb25VdGlscy5nZXREZWZhdWx0VmFsaWRhdG9yRmFjdG9yeSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlSW50ZXJwb2xhdG9yIGdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKQ0KLSAgICB7DQotICAgICAgICBpZih0aGlzLm1lc3NhZ2VSZXNvbHZlciAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgRXh0VmFsTWVzc2FnZUludGVycG9sYXRvckFkYXB0ZXIodGhpcy5kZWZhdWx0TWVzc2FnZUludGVycG9sYXRvciwgdGhpcy5tZXNzYWdlUmVzb2x2ZXIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkR3JvdXAoQ2xhc3MgZ3JvdXBDbGFzcywgU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmdyb3VwU3RvcmFnZS5hZGRHcm91cChncm91cENsYXNzLCB2aWV3SWQsIGNsaWVudElkKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZXN0cmljdEdyb3VwKENsYXNzIGdyb3VwQ2xhc3MsIFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5ncm91cFN0b3JhZ2UucmVzdHJpY3RHcm91cChncm91cENsYXNzLCB2aWV3SWQsIGNsaWVudElkKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3NbXSBnZXRHcm91cHMoU3RyaW5nIHZpZXdJZCwgU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy5ncm91cFN0b3JhZ2UuZ2V0R3JvdXBzKHZpZXdJZCwgY2xpZW50SWQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0aGlzLm1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkobW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLm1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllc1RvVmFsaWRhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdEdyb3VwU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZ3JvdXBTdG9yYWdlID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmdldFN0b3JhZ2UoR3JvdXBTdG9yYWdlLmNsYXNzLCBCZWFuVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIHRoaXMubW9kZWxWYWxpZGF0aW9uU3RvcmFnZSA9IEV4dFZhbFV0aWxzLg0KLSAgICAgICAgICAgICAgICBnZXRTdG9yYWdlKE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MsIE1vZGVsVmFsaWRhdGlvbi5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TWVzc2FnZUludGVycG9sYXRvcigpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCBmb3VuZEJlYW4gPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldEJlYW4oTWVzc2FnZUludGVycG9sYXRvci5jbGFzcy5nZXROYW1lKCkucmVwbGFjZSgiLiIsICJfIikpOw0KLQ0KLSAgICAgICAgaWYoZm91bmRCZWFuIGluc3RhbmNlb2YgTWVzc2FnZUludGVycG9sYXRvcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLmRlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yID0gKE1lc3NhZ2VJbnRlcnBvbGF0b3IpZm91bmRCZWFuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMuZGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IgPSBuZXcgRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IoDQotICAgICAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVXRpbHMuZ2V0RGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKS5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0TWVzc2FnZVJlc29sdmVyKCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlUmVzb2x2ZXIgPSBFeHRWYWxVdGlscy5nZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3koZ2V0QmVhblZhbGlkYXRpb25TdHJhdGVneSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFZhbGlkYXRpb25TdHJhdGVneSBnZXRCZWFuVmFsaWRhdGlvblN0cmF0ZWd5KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kobnVsbCwgbnVsbCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM2OWQzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW5pdGlhbGl6ZXIuY29tcG9uZW50Ci0gICAgICAgIC5BYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsKLSAqIEBzaW5jZSB4LnguMwotICovCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkKLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpCi1wdWJsaWMgY2xhc3MgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdEh0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyCi17Ci0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlUmVxdWlyZWRBdHRyaWJ1dGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFEYXRhKQotICAgIHsKLSAgICAgICAgaWYoIUV4dFZhbFV0aWxzLmludGVycHJldEVtcHR5U3RyaW5nVmFsdWVzQXNOdWxsKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpIHx8Ci0gICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhpc0NvbXBvbmVudFJlcXVpcmVkKHVpQ29tcG9uZW50KSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vQmVhblZhbGlkYXRpb24uamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9CZWFuVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjkzM2E5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9CZWFuVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmdyb3Vwcy5EZWZhdWx0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLQ0KLUBUYXJnZXQoe01FVEhPRCwgRklFTEQsIFRZUEV9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1ARG9jdW1lbnRlZA0KLXB1YmxpYyBAaW50ZXJmYWNlIEJlYW5WYWxpZGF0aW9uDQotew0KLSAgICBTdHJpbmdbXSB2aWV3SWRzKCkgZGVmYXVsdCAiKiI7DQotDQotICAgIENsYXNzW10gdXNlR3JvdXBzKCkgZGVmYXVsdCBEZWZhdWx0LmNsYXNzOw0KLQ0KLSAgICBDbGFzc1tdIHJlc3RyaWN0R3JvdXBzKCkgZGVmYXVsdCB7fTsNCi0NCi0gICAgU3RyaW5nW10gY29uZGl0aW9ucygpIGRlZmF1bHQgIiN7dHJ1ZX0iOw0KLQ0KLSAgICBNb2RlbFZhbGlkYXRpb24gbW9kZWxWYWxpZGF0aW9uKCkgZGVmYXVsdCBATW9kZWxWYWxpZGF0aW9uOw0KLSAgICANCi0gICAgQFJldGVudGlvbihSVU5USU1FKSBzdGF0aWMgQGludGVyZmFjZSBMaXN0DQotICAgIHsNCi0gICAgICAgIEJlYW5WYWxpZGF0aW9uW10gdmFsdWUoKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vTW9kZWxWYWxpZGF0aW9uLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vTW9kZWxWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2Yzc4ZGQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL01vZGVsVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLQ0KLUBUYXJnZXQoe01FVEhPRCwgRklFTEQsIFRZUEV9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1ARG9jdW1lbnRlZA0KLXB1YmxpYyBAaW50ZXJmYWNlIE1vZGVsVmFsaWRhdGlvbg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVCA9ICIiOw0KLQ0KLSAgICBib29sZWFuIGlzQWN0aXZlKCkgZGVmYXVsdCBmYWxzZTsNCi0NCi0gICAgYm9vbGVhbiBkaXNwbGF5SW5saW5lKCkgZGVmYXVsdCBmYWxzZTsNCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInN1cHBvcnQgcHJvcGVydHkgY2hhaW4gc3ludGF4IikNCi0gICAgU3RyaW5nW10gdmFsaWRhdGlvblRhcmdldHMoKSBkZWZhdWx0IERFRkFVTFQ7DQotDQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCBERUZBVUxUOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3Rvci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2ZjEzNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuYW5ub3RhdGlvbi5leHRyYWN0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJ1c2UgbWV0YS1kYXRhIHN0b3JhZ2UgLSBidXQgYSBzcGVjaWFsIGltcGwuIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3IgZXh0ZW5kcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3INCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgUHJvcGVydHlJbmZvcm1hdGlvbiBleHRyYWN0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBvYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFByb3BlcnR5RGV0YWlscykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihvYmplY3QuZ2V0Q2xhc3MoKSArICIgaXMgbm90IGEgIiArIFByb3BlcnR5RGV0YWlscy5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IChQcm9wZXJ0eURldGFpbHMpb2JqZWN0Ow0KLQ0KLSAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKSk7DQotDQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsNCi0gICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24uc2V0SW5mb3JtYXRpb24oUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsNCi0NCi0gICAgICAgIGV4dHJhY3RBbm5vdGF0aW9ucyhwcm9wZXJ0eUluZm9ybWF0aW9uLCBwcm9wZXJ0eURldGFpbHMsIGVudGl0eUNsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvZmFjdG9yeS9FeHRWYWxBcHBsaWNhdGlvbkZhY3RvcnkuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvZmFjdG9yeS9FeHRWYWxBcHBsaWNhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY3NWRjYS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ZhY3RvcnkvRXh0VmFsQXBwbGljYXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uV3JhcHBlcjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMi54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxBcHBsaWNhdGlvbkZhY3RvcnkgZXh0ZW5kcyBBcHBsaWNhdGlvbkZhY3RvcnkNCi17DQotICAgIHByaXZhdGUgQXBwbGljYXRpb25GYWN0b3J5IHdyYXBwZWQ7DQotDQotICAgIHB1YmxpYyBFeHRWYWxBcHBsaWNhdGlvbkZhY3RvcnkoQXBwbGljYXRpb25GYWN0b3J5IHdyYXBwZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEFwcGxpY2F0aW9uRmFjdG9yeSBnZXRXcmFwcGVkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0V3JhcHBlZCgpOw0KLSAgICB9DQotDQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuSElHSCwgZGVzY3JpcHRpb24gPSAiY29udGV4dCBwYXJhbS4gdG8gZGVhY3RpdmF0ZSB0aGlzIHdyYXBwZXIiKQ0KLSAgICBwdWJsaWMgQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uV3JhcHBlcigpIHsNCi0NCi0gICAgICAgICAgICBwdWJsaWMgQXBwbGljYXRpb24gZ2V0V3JhcHBlZCgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRBcHBsaWNhdGlvbigpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZhdWx0VmFsaWRhdG9ySWQoU3RyaW5nIHMpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZighImphdmF4LmZhY2VzLkJlYW4iLmVxdWFscyhzKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgc3VwZXIuYWRkRGVmYXVsdFZhbGlkYXRvcklkKHMpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikNCi0gICAgew0KLSAgICAgICAgd3JhcHBlZC5zZXRBcHBsaWNhdGlvbihhcHBsaWNhdGlvbik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9CZWFuVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0JlYW5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM3NzVjNy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0JlYW5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmludGVyY2VwdG9yLlZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotDQotLyoqDQotICogZXh0cmFjdHMgYW5kIGFkZHMgdGhlIGV4dHZhbCBidiBtZXRhLWRhdGEgKGUuZy4gdmFsaWRhdGlvbiBncm91cHMpIHRvIHRoZSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3INCi17DQotDQotICAgIHB1YmxpYyBib29sZWFuIGFmdGVyVGhyb3dpbmcoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdG9yRXhjZXB0aW9uU291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZih1aUNvbXBvbmVudCBpbnN0YW5jZW9mIEVkaXRhYmxlVmFsdWVIb2xkZXIgJiYgaXNCbG9ja2luZ0V4Y2VwdGlvbih1aUNvbXBvbmVudCwgdmFsaWRhdG9yRXhjZXB0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2J2IGludGVncmF0aW9uIGRvZXNuJ3QgdGhyb3cgZXhjZXB0aW9ucyB0byBzdXBwb3J0IG11bHRpcGxlIG1lc3NhZ2VzIC0+IHNldCBjb21wb25lbnQgc3RhdGUNCi0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFZhbGlkKGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0Jsb2NraW5nRXhjZXB0aW9uKFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZ2V0VmlvbGF0aW9uU2V2ZXJpdHlJbnRlcnByZXRlcigpLnNldmVyaXR5Q2F1c2VzVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U2V2ZXJpdHkoKSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9CZWFuVmFsaWRhdGlvblRhZ0F3YXJlVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0JlYW5WYWxpZGF0aW9uVGFnQXdhcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjNDYzOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0JlYW5WYWxpZGF0aW9uVGFnQXdhcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuQmVhblZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDIueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25UYWdBd2FyZVZhbGlkYXRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBiZWZvcmVWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpDQotICAgIHsNCi0gICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlciAmJiAvLyJmaWx0ZXIiIGNyb3NzLXZhbGlkYXRpb24gY2FsbHMNCi0gICAgICAgICAgICAgICAgcHJvcGVydGllcy5jb250YWluc0tleShQcm9wZXJ0eUluZm9ybWF0aW9uLmNsYXNzLmdldE5hbWUoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW5zcGVjdFZhbGlkYXRvcnMoZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuZ2V0Vmlld0lkKCksDQotICAgICAgICAgICAgICAgICAgICAoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCksDQotICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLmdldFZhbGlkYXRvcnMoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykNCi0gICAgew0KLSAgICAgICAgLy9ub3QgdXNlZA0KLSAgICB9DQotDQotICAgIEBUb0RvLkxpc3Qoe0BUb0RvKHZhbHVlID0gUHJpb3JpdHkuSElHSCwgZGVzY3JpcHRpb24gPSAib3B0aW1pemUiKSwNCi0gICAgICAgICAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5LkhJR0gsIGRlc2NyaXB0aW9uID0gInVzZSByZWZsZWN0aW9uIGluc3RlYWQgb2YgQmVhblZhbGlkYXRvciBmb3IganNmIDEueCB2ZXJzaW9ucyIpLA0KLSAgICAgICAgICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuSElHSCwgZGVzY3JpcHRpb24gPSAidGVzdCIpDQotICAgIH0pDQotICAgIHByaXZhdGUgdm9pZCBpbnNwZWN0VmFsaWRhdG9ycyhTdHJpbmcgdmlld0lkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdGFibGVWYWx1ZUhvbGRlciBlZGl0YWJsZVZhbHVlSG9sZGVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsaWVudElkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yW10gdmFsaWRhdG9ycykNCi0gICAgew0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbGlkYXRvcnNPZlRhZ0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgICAgIGZvciAoVmFsaWRhdG9yIHZhbGlkYXRvciA6IHZhbGlkYXRvcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9kb24ndCBjaGVjayB3aXRoIGluc3RhbmNlb2YNCi0gICAgICAgICAgICBpZiAodmFsaWRhdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscyhCZWFuVmFsaWRhdG9yLmNsYXNzLmdldE5hbWUoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3JzT2ZUYWdMaXN0LmFkZEFsbCgNCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCgoQmVhblZhbGlkYXRvcikgdmFsaWRhdG9yKS5nZXRWYWxpZGF0aW9uR3JvdXBzKCkuc3BsaXQoIiwiKSkpOw0KLQ0KLSAgICAgICAgICAgICAgICAvL3ByZXZlbnQgZG91YmxlLXZhbGlkYXRpb24NCi0gICAgICAgICAgICAgICAgZWRpdGFibGVWYWx1ZUhvbGRlci5yZW1vdmVWYWxpZGF0b3IodmFsaWRhdG9yKTsNCi0gICAgICAgICAgICAgICAgZWRpdGFibGVWYWx1ZUhvbGRlci5hZGRWYWxpZGF0b3IobmV3IEJlYW5WYWxpZGF0b3JXcmFwcGVyKChCZWFuVmFsaWRhdG9yKXZhbGlkYXRvcikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIENsYXNzIGN1cnJlbnRDbGFzczsNCi0gICAgICAgIGZvcihTdHJpbmcgZ3JvdXBDbGFzc05hbWUgOiB2YWxpZGF0b3JzT2ZUYWdMaXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGN1cnJlbnRDbGFzcyA9IENsYXNzVXRpbHMudHJ5VG9Mb2FkQ2xhc3NGb3JOYW1lKGdyb3VwQ2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZihjdXJyZW50Q2xhc3MgIT0gbnVsbCAmJiBjdXJyZW50Q2xhc3MuaXNJbnRlcmZhY2UoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5hZGRHcm91cChjdXJyZW50Q2xhc3MsIHZpZXdJZCwgY2xpZW50SWQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihncm91cENsYXNzTmFtZSArICIgaXMgbm8gdmFsaWQgZ3JvdXAgLSBvbmx5IGV4aXN0aW5nIGludGVyZmFjZXMgYXJlIGFsbG93ZWQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0JlYW5WYWxpZGF0b3JXcmFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0JlYW5WYWxpZGF0b3JXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZWMyOTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9CZWFuVmFsaWRhdG9yV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5CZWFuVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLQ0KLS8qKg0KLSAqIHJlcGxhY2VtZW50IGZvciBCZWFuVmFsaWRhdG9yIHdoaWNoIGdldHMgYWRkZWQgZHVlIHRvIGY6dmFsaWRhdGVCZWFuDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMi54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIEJlYW5WYWxpZGF0b3JXcmFwcGVyIGV4dGVuZHMgQmVhblZhbGlkYXRvcg0KLXsNCi0gICAgcHJpdmF0ZSBCZWFuVmFsaWRhdG9yIHdyYXBwZWQ7DQotDQotICAgIEJlYW5WYWxpZGF0b3JXcmFwcGVyKEJlYW5WYWxpZGF0b3Igd3JhcHBlZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQmVhblZhbGlkYXRvciBnZXRXcmFwcGVkQmVhblZhbGlkYXRvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB0aGlzLndyYXBwZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0V3JhcHBlZChCZWFuVmFsaWRhdG9yIHdyYXBwZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvbkdyb3VwcyhTdHJpbmcgcykNCi0gICAgew0KLSAgICAgICAgd3JhcHBlZC5zZXRWYWxpZGF0aW9uR3JvdXBzKHMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvbkdyb3VwcygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVkLmdldFZhbGlkYXRpb25Hcm91cHMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIC8vZG9uJ3QgdmFsaWRhdGUgLSB0aGUgZXh0dmFsIGJlYW4tdmFsaWRhdGlvbiBhZGFwdGVyIHdpbGwgZG8gdGhhdA0KLSAgICB9DQotDQotICAgIC8qDQotICAgIHB1YmxpYyBPYmplY3Qgc2F2ZVN0YXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpDQotICAgIHsNCi0gICAgICAgIE9iamVjdCByZXN1bHRbXSA9IG5ldyBPYmplY3RbMV07DQotICAgICAgICByZXN1bHRbMF0gPSB3cmFwcGVkLmdldFZhbGlkYXRpb25Hcm91cHMoKTsNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIE9iamVjdCBzdGF0ZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy53cmFwcGVkID0gbmV3IEJlYW5WYWxpZGF0b3IoKTsNCi0NCi0gICAgICAgIGlmIChzdGF0ZSAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZXNbXSA9IChPYmplY3RbXSkgc3RhdGU7DQotICAgICAgICAgICAgdGhpcy53cmFwcGVkLnNldFZhbGlkYXRpb25Hcm91cHMoKFN0cmluZykgdmFsdWVzWzBdKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICAqLw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBtYXJrSW5pdGlhbFN0YXRlKCkNCi0gICAgew0KLSAgICAgICAgd3JhcHBlZC5tYXJrSW5pdGlhbFN0YXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaW5pdGlhbFN0YXRlTWFya2VkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuaW5pdGlhbFN0YXRlTWFya2VkKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgY2xlYXJJbml0aWFsU3RhdGUoKQ0KLSAgICB7DQotICAgICAgICB3cmFwcGVkLmNsZWFySW5pdGlhbFN0YXRlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNUcmFuc2llbnQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gd3JhcHBlZC5pc1RyYW5zaWVudCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zaWVudChib29sZWFuIGIpDQotICAgIHsNCi0gICAgICAgIHdyYXBwZWQuc2V0VHJhbnNpZW50KGIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmY2Y3MGYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuVmFsaWRhdGlvbk1vZHVsZUF3YXJlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLkJlYW5WYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC51dGlsLkJlYW5WYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIGV4dHJhY3RzIGFuZCBhZGRzIHRoZSBleHR2YWwgYnYgbWV0YS1kYXRhIChlLmcuIHZhbGlkYXRpb24gZ3JvdXBzKSB0byB0aGUgRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0DQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yDQotICAgICAgICBpbXBsZW1lbnRzIE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLCBWYWxpZGF0aW9uTW9kdWxlQXdhcmUNCi17DQotICAgIHB1YmxpYyB2b2lkIGFmdGVyRXh0cmFjdGluZyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmKHByb3BlcnR5SW5mb3JtYXRpb24uY29udGFpbnNJbmZvcm1hdGlvbihQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5DVVNUT01fUFJPUEVSVElFUykpDQotICAgICAgICB7DQotICAgICAgICAgICAgTWFwIHByb3BlcnRpZXMgPSBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLkNVU1RPTV9QUk9QRVJUSUVTLCBNYXAuY2xhc3MpOw0KLQ0KLSAgICAgICAgICAgIGlmKHByb3BlcnRpZXMgIT0gbnVsbCAmJiBwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFVJQ29tcG9uZW50LmNsYXNzLmdldE5hbWUoKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCA9IChVSUNvbXBvbmVudClwcm9wZXJ0aWVzLmdldChVSUNvbXBvbmVudC5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMuZ2V0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgICAgICAgICBwcm9jZXNzRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YSh1aUNvbXBvbmVudCwgcHJvcGVydHlEZXRhaWxzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIGFkZHMgdGhlIGV4dHZhbCBidiBtZXRhLWRhdGEgdG8gdGhlIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dA0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gdWlDb21wb25lbnQgY3VycmVudCBjb21wb25lbnQNCi0gICAgICogQHBhcmFtIHByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eSBkZXRhaWxzIG9mIHRoZSB2YWx1ZS1iaW5kaW5nDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0V4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGEoVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMpDQotICAgIHsNCi0gICAgICAgIGlmKEpzZlV0aWxzLmlzUmVuZGVyUmVzcG9uc2VQaGFzZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVXRpbHMuYWRkTWV0YURhdGFUb0NvbnRleHQodWlDb21wb25lbnQsIHByb3BlcnR5RGV0YWlscywgZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVXRpbHMuYWRkTWV0YURhdGFUb0NvbnRleHQodWlDb21wb25lbnQsIHByb3BlcnR5RGV0YWlscywgdHJ1ZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldE1vZHVsZUtleXMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtCZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcy5nZXROYW1lKCl9Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvUmVzZXRCZWFuVmFsaWRhdGlvblJlbmRlcmVySW50ZXJjZXB0b3IuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvUmVzZXRCZWFuVmFsaWRhdGlvblJlbmRlcmVySW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIxZDEzMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL1Jlc2V0QmVhblZhbGlkYXRpb25SZW5kZXJlckludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5pbnRlcmNlcHRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuaW50ZXJjZXB0b3IuQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5yZW5kZXJraXQuZXhjZXB0aW9uLlNraXBCZWZvcmVJbnRlcmNlcHRvcnNFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnJlbmRlcmtpdC5leGNlcHRpb24uU2tpcFJlbmRlcmVyRGVsZWdhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMucmVuZGVyLlJlbmRlcmVyOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIHNlcGFyYXRlZCBmb3IgZWFzaWVyIHN5bmMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAyLnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFJlc2V0QmVhblZhbGlkYXRpb25SZW5kZXJlckludGVyY2VwdG9yIGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJlckludGVyY2VwdG9yDQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgYmVmb3JlRW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIFJlbmRlcmVyIHdyYXBwZWQpDQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTa2lwQmVmb3JlSW50ZXJjZXB0b3JzRXhjZXB0aW9uLCBTa2lwUmVuZGVyZXJEZWxlZ2F0aW9uRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIGlmKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzd2l0Y2hCYWNrVmFsaWRhdG9ycygoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHN3aXRjaEJhY2tWYWxpZGF0b3JzKEVkaXRhYmxlVmFsdWVIb2xkZXIgZWRpdGFibGVWYWx1ZUhvbGRlcikNCi0gICAgew0KLSAgICAgICAgZm9yKFZhbGlkYXRvciB2YWxpZGF0b3IgOiBlZGl0YWJsZVZhbHVlSG9sZGVyLmdldFZhbGlkYXRvcnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih2YWxpZGF0b3IgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdG9yV3JhcHBlcikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGVkaXRhYmxlVmFsdWVIb2xkZXIuYWRkVmFsaWRhdG9yKCgoQmVhblZhbGlkYXRvcldyYXBwZXIpdmFsaWRhdG9yKS5nZXRXcmFwcGVkQmVhblZhbGlkYXRvcigpKTsNCi0gICAgICAgICAgICAgICAgZWRpdGFibGVWYWx1ZUhvbGRlci5yZW1vdmVWYWxpZGF0b3IodmFsaWRhdG9yKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmZkYTBkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLk1ldGFEYXRhVHJhbnNmb3JtZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5SRVVTRX0pDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QmVhblZhbGlkYXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyPFQgZXh0ZW5kcyBBbm5vdGF0aW9uPiBpbXBsZW1lbnRzIE1ldGFEYXRhVHJhbnNmb3JtZXINCi17DQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRNZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIENvbnN0cmFpbnREZXNjcmlwdG9yPD8gZXh0ZW5kcyBUPiBjb25zdHJhaW50RGVzY3JpcHRvciA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoQ29uc3RyYWludERlc2NyaXB0b3IuY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYoaXNDbGllbnRTaWRlVmFsaWRhdGlvbkVuYWJsZWQoY29uc3RyYWludERlc2NyaXB0b3IpICYmIGlzQmxvY2tpbmdDb25zdHJhaW50KGNvbnN0cmFpbnREZXNjcmlwdG9yKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtTWV0YURhdGEoKENvbnN0cmFpbnREZXNjcmlwdG9yPFQ+KWNvbnN0cmFpbnREZXNjcmlwdG9yKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ2xpZW50U2lkZVZhbGlkYXRpb25FbmFibGVkKENvbnN0cmFpbnREZXNjcmlwdG9yPD8gZXh0ZW5kcyBUPiBjb25zdHJhaW50RGVzY3JpcHRvcikNCi0gICAgew0KLSAgICAgICAgZm9yKENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPiBwYXlsb2FkIDogY29uc3RyYWludERlc2NyaXB0b3IuZ2V0UGF5bG9hZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNCbG9ja2luZ0NvbnN0cmFpbnQoQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gY29uc3RyYWludERlc2NyaXB0b3IpDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZSB0ZXN0TWVzc2FnZSA9IG5ldyBGYWNlc01lc3NhZ2UoKTsNCi0gICAgICAgIHRlc3RNZXNzYWdlLnNldFNldmVyaXR5KFZpb2xhdGlvblNldmVyaXR5LkVycm9yLlZBTFVFKTsNCi0NCi0gICAgICAgIGZvciAoQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+IHBheWxvYWQgOiBjb25zdHJhaW50RGVzY3JpcHRvci5nZXRQYXlsb2FkKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihWaW9sYXRpb25TZXZlcml0eS5XYXJuLmNsYXNzKS5pc0Fzc2lnbmFibGVGcm9tKHBheWxvYWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGVzdE1lc3NhZ2Uuc2V0U2V2ZXJpdHkoVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5WQUxVRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYoRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKFZpb2xhdGlvblNldmVyaXR5LkluZm8uY2xhc3MpLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0ZXN0TWVzc2FnZS5zZXRTZXZlcml0eShWaW9sYXRpb25TZXZlcml0eS5JbmZvLlZBTFVFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZihFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoVmlvbGF0aW9uU2V2ZXJpdHkuRmF0YWwuY2xhc3MpLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0ZXN0TWVzc2FnZS5zZXRTZXZlcml0eShWaW9sYXRpb25TZXZlcml0eS5GYXRhbC5WQUxVRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLnNldmVyaXR5QmxvY2tzU3VibWl0Rm9yQ29tcG9uZW50SWQobnVsbCwgdGVzdE1lc3NhZ2UpOw0KLSAgICB9DQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKENvbnN0cmFpbnREZXNjcmlwdG9yPFQ+IGNvbnN0cmFpbnREZXNjcmlwdG9yKTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ob3ROdWxsTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ob3ROdWxsTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDA4ZDVhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdEJlYW5WYWxpZGF0aW9uTWV0YURhdGFUcmFuc2Zvcm1lcjxOb3ROdWxsPg0KLXsNCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoQ29uc3RyYWludERlc2NyaXB0b3I8Tm90TnVsbD4gY29uc3RyYWludERlc2NyaXB0b3IpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLQ0KLSAgICAgICAgaWYoRXh0VmFsVXRpbHMuaW50ZXJwcmV0RW1wdHlTdHJpbmdWYWx1ZXNBc051bGwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuV0VBS19SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1N0cmluZ1NpemVNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1N0cmluZ1NpemVNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOWZmNTguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9TdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFN0cmluZ1NpemVNZXRhRGF0YVRyYW5zZm9ybWVyIGV4dGVuZHMgQWJzdHJhY3RCZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXI8U2l6ZT4NCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKENvbnN0cmFpbnREZXNjcmlwdG9yPFNpemU+IGNvbnN0cmFpbnREZXNjcmlwdG9yKQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIFNpemUgYW5ub3RhdGlvbiA9IGNvbnN0cmFpbnREZXNjcmlwdG9yLmdldEFubm90YXRpb24oKTsNCi0NCi0gICAgICAgIGludCBtaW5pbXVtID0gYW5ub3RhdGlvbi5taW4oKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gIT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSCwgbWluaW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEhfREVGQVVMVCwgbWluaW11bSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpbnQgbWF4aW11bSA9IGFubm90YXRpb24ubWF4KCk7DQotICAgICAgICBpZihtYXhpbXVtICE9IEludGVnZXIuTUFYX1ZBTFVFKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5NQVhfTEVOR1RILCBtYXhpbXVtKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSF9ERUZBVUxULCBtYXhpbXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0QmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZTAzMWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLnRyYW5zZm9ybWVyLm1hcHBlcg0KLSAgICAgICAgLkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuUkVVU0V9KQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXINCi17DQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY3JlYXRlTmFtZShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZihpc0JlYW5WYWxpZGF0aW9uU3RyYXRlZ3koc291cmNlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgYmVhblZhbGlkYXRpb25BZGFwdGVyID0NCi0gICAgICAgICAgICAgICAgICAgIChCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kpc291cmNlOw0KLQ0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVCZWFuVmFsaWRhdGlvblRyYW5zZm9ybWVyTmFtZShiZWFuVmFsaWRhdGlvbkFkYXB0ZXIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQmVhblZhbGlkYXRpb25TdHJhdGVneShWYWxpZGF0aW9uU3RyYXRlZ3kgc291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gc291cmNlIGluc3RhbmNlb2YgQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCAgYWJzdHJhY3QgU3RyaW5nIGNyZWF0ZUJlYW5WYWxpZGF0aW9uVHJhbnNmb3JtZXJOYW1lKA0KLSAgICAgICAgICAgIEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9Ob3ROdWxsTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvTm90TnVsbE5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMyODc4Ni4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9Ob3ROdWxsTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5Ob3ROdWxsTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5zdHJhdGVneS5CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLk5lc3RlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ATmVzdGVkDQotQEludm9jYXRpb25PcmRlcigyMDApDQotQFVzYWdlSW5mb3JtYXRpb24oe1VzYWdlQ2F0ZWdvcnkuSU5URVJOQUx9KQ0KLXB1YmxpYyBjbGFzcyBOb3ROdWxsTmFtZU1hcHBlciBleHRlbmRzIEFic3RyYWN0QmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlcg0KLXsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVCZWFuVmFsaWRhdGlvblRyYW5zZm9ybWVyTmFtZShCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgYWRhcHRlcikNCi0gICAgew0KLSAgICAgICAgaWYoaXNOb3ROdWxsQ29uc3RyYWludChhZGFwdGVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXIuY2xhc3MuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTm90TnVsbENvbnN0cmFpbnQoQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5IGFkYXB0ZXIpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBOb3ROdWxsLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoDQotICAgICAgICAgICAgICAgIGFkYXB0ZXIuZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKS5nZXRBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpemVOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaXplTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzg5MGM2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpemVOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLk5lc3RlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuSW52b2NhdGlvbk9yZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uc3RyYXRlZ3kuQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5TdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBOZXN0ZWQNCi1ASW52b2NhdGlvbk9yZGVyKDIxMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbih7VXNhZ2VDYXRlZ29yeS5JTlRFUk5BTH0pDQotcHVibGljIGNsYXNzIFNpemVOYW1lTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyDQotew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZUJlYW5WYWxpZGF0aW9uVHJhbnNmb3JtZXJOYW1lKEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSBhZGFwdGVyKQ0KLSAgICB7DQotICAgICAgICBpZihpc1N0cmluZ1NpemVDb25zdHJhaW50KGFkYXB0ZXIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBTdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lci5jbGFzcy5nZXROYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTdHJpbmdTaXplQ29uc3RyYWludChCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kgYWRhcHRlcikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFNpemUuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscygNCi0gICAgICAgICAgICAgICAgYWRhcHRlci5nZXRDb25zdHJhaW50RGVzY3JpcHRvcigpLmdldEFubm90YXRpb24oKS5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSkgJiYNCi0gICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoYWRhcHRlci5nZXRFbGVtZW50Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvcGF5bG9hZC9EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvcGF5bG9hZC9EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIyZDIyZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3BheWxvYWQvRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIERpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbiBleHRlbmRzIFBheWxvYWQNCi17DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvcGF5bG9hZC9WaW9sYXRpb25TZXZlcml0eS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wYXlsb2FkL1Zpb2xhdGlvblNldmVyaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzODhiMmQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wYXlsb2FkL1Zpb2xhdGlvblNldmVyaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5wYXlsb2FkOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgVmlvbGF0aW9uU2V2ZXJpdHkNCi17DQotICAgIGludGVyZmFjZSBJbmZvIGV4dGVuZHMgUGF5bG9hZA0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgVkFMVUUgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfSU5GTzsNCi0gICAgfQ0KLQ0KLSAgICBpbnRlcmZhY2UgV2FybiBleHRlbmRzIFBheWxvYWQNCi0gICAgew0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IFZBTFVFID0gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX1dBUk47DQotICAgIH0NCi0NCi0gICAgaW50ZXJmYWNlIEVycm9yIGV4dGVuZHMgUGF5bG9hZA0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgVkFMVUUgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1I7DQotICAgIH0NCi0NCi0gICAgaW50ZXJmYWNlIEZhdGFsIGV4dGVuZHMgUGF5bG9hZA0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgVkFMVUUgPSBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdGFydHVwL0JlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0YXJ0dXAvQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQyNjllZi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0YXJ0dXAvQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdGFydHVwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLkJlYW5Bd2FyZVZhbGlkYXRvckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC51dGlsLkJlYW5WYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yLkV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yLkJlYW5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24uTW9kZWxWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwubWV0YWRhdGEudHJhbnNmb3JtZXIubWFwcGVyLlNpemVOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lci5tYXBwZXIuTm90TnVsbE5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLk1vZGVsVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UubWFwcGVyLkJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5tYXBwZXIuTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmZhY3RvcnkuQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RhcnR1cC5BYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5Hcm91cFN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXJIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTUwMjU3NDgzOTk4NzY4MzMzOTRMOw0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgcmVnaXN0ZXJWYWxpZGF0b3JGYWN0b3J5KCk7DQotICAgICAgICByZWdpc3RlckJlYW5WYWxpZGF0aW9uSW50ZXJjZXB0b3IoKTsNCi0gICAgICAgIHJlZ2lzdGVyTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKTsNCi0gICAgICAgIHJlZ2lzdGVyR3JvdXBTdG9yYWdlTmFtZU1hcHBlcigpOw0KLSAgICAgICAgcmVnaXN0ZXJNb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlcigpOw0KLSAgICAgICAgcmVnaXN0ZXJDb21wb25lbnRJbml0aWFsaXplcnMoKTsNCi0gICAgICAgIHJlZ2lzdGVyTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JzKCk7DQotICAgICAgICByZWdpc3RlclBoYXNlTGlzdGVuZXJzKCk7DQotICAgICAgICByZWdpc3RlckV4Y2VwdGlvbkludGVyY2VwdG9yKCk7DQotICAgICAgICByZWdpc3RlclZpb2xhdGlvblNldmVyaXR5UGF5bG9hZCgpOw0KLSAgICAgICAgcmVnaXN0ZXJEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb25QYXlsb2FkKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJWYWxpZGF0b3JGYWN0b3J5KCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkR2xvYmFsUHJvcGVydHkoVmFsaWRhdG9yRmFjdG9yeS5jbGFzcy5nZXROYW1lKCksDQotICAgICAgICAgICAgICAgIG5ldyBCZWFuQXdhcmVWYWxpZGF0b3JGYWN0b3J5KEJlYW5WYWxpZGF0aW9uVXRpbHMuZ2V0RGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKSksIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckJlYW5WYWxpZGF0aW9uSW50ZXJjZXB0b3IoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IEJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxVdGlscy5yZWdpc3RlclZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIobmV3IFNpemVOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVnaXN0ZXJWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyKG5ldyBOb3ROdWxsTmFtZU1hcHBlcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlckdyb3VwU3RvcmFnZU5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBTdG9yYWdlTWFuYWdlciBzdG9yYWdlTWFuYWdlciA9IGdldFN0b3JhZ2VNYW5hZ2VySG9sZGVyKCkuZ2V0U3RvcmFnZU1hbmFnZXIoR3JvdXBTdG9yYWdlLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmIChzdG9yYWdlTWFuYWdlciBpbnN0YW5jZW9mIEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAoKEFic3RyYWN0TmFtZU1hcHBlckF3YXJlRmFjdG9yeTxTdHJpbmc+KSBzdG9yYWdlTWFuYWdlcikNCi0gICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgQmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKHN0b3JhZ2VNYW5hZ2VyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGhhcyB0byBpbXBsZW1lbnQgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5ICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgIiBjb3VsZG4ndCByZWdpc3RlciAiICsgQmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyLmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKQ0KLSAgICB7DQotICAgICAgICBEZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgbW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIgPSBuZXcgRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyKCk7DQotICAgICAgICBtb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5yZWdpc3RlcihuZXcgTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgICAgICBnZXRTdG9yYWdlTWFuYWdlckhvbGRlcigpLnNldFN0b3JhZ2VNYW5hZ2VyKE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MsIG1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJDb21wb25lbnRJbml0aWFsaXplcnMoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRDb21wb25lbnRJbml0aWFsaXplcihuZXcgSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0b3JhZ2VNYW5hZ2VySG9sZGVyIGdldFN0b3JhZ2VNYW5hZ2VySG9sZGVyKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwgU3RvcmFnZU1hbmFnZXJIb2xkZXIuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlck1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9ycygpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcihuZXcgRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclBoYXNlTGlzdGVuZXJzKCkNCi0gICAgew0KLSAgICAgICAgSnNmVXRpbHMucmVnaXN0ZXJQaGFzZUxpc3RlbmVyKG5ldyBNb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyKCkpOw0KLSAgICAgICAgSnNmVXRpbHMucmVnaXN0ZXJQaGFzZUxpc3RlbmVyKG5ldyBNb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyRXhjZXB0aW9uSW50ZXJjZXB0b3IoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRWYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IobmV3IEJlYW5WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJWaW9sYXRpb25TZXZlcml0eVBheWxvYWQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0IGV4dFZhbENvbnRleHQgPSBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKTsNCi0NCi0gICAgICAgIGV4dFZhbENvbnRleHQuYWRkR2xvYmFsUHJvcGVydHkoVmlvbGF0aW9uU2V2ZXJpdHkuSW5mby5jbGFzcy5nZXROYW1lKCksIFZpb2xhdGlvblNldmVyaXR5LkluZm8uY2xhc3MsIGZhbHNlKTsNCi0gICAgICAgIGV4dFZhbENvbnRleHQuYWRkR2xvYmFsUHJvcGVydHkoVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcy5nZXROYW1lKCksIFZpb2xhdGlvblNldmVyaXR5Lldhcm4uY2xhc3MsIGZhbHNlKTsNCi0gICAgICAgIGV4dFZhbENvbnRleHQuYWRkR2xvYmFsUHJvcGVydHkoVmlvbGF0aW9uU2V2ZXJpdHkuRmF0YWwuY2xhc3MuZ2V0TmFtZSgpLCBWaW9sYXRpb25TZXZlcml0eS5GYXRhbC5jbGFzcywgZmFsc2UpOw0KLQ0KLSAgICAgICAgLy9ubyBuZWVkIHRvIHJlZ2lzdGVyICJlcnJvciIgaXQncyB0aGUgZGVmYXVsdA0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckRpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvblBheWxvYWQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5hZGRHbG9iYWxQcm9wZXJ0eSgNCi0gICAgICAgICAgICAgICAgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKSwgRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmNsYXNzLCBmYWxzZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdGFydHVwL0pTRjJBd2FyZUJlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0YXJ0dXAvSlNGMkF3YXJlQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE2OTRkOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0YXJ0dXAvSlNGMkF3YXJlQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0YXJ0dXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0YXJ0dXAuQWJzdHJhY3RTdGFydHVwTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkV4dFZhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmludGVyY2VwdG9yLlJlc2V0QmVhblZhbGlkYXRpb25SZW5kZXJlckludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5pbnRlcmNlcHRvci5CZWFuVmFsaWRhdGlvblRhZ0F3YXJlVmFsaWRhdGlvbkludGVyY2VwdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDIueC4zDQotICovDQotQFRvRG8odmFsdWUgPSBQcmlvcml0eS5ISUdILCBkZXNjcmlwdGlvbiA9ICJhZGQgb3B0aW9uYWwgd2ViLnhtbCBwYXJhbSB0byBkZWFjdGl2YXRlIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKU0YyQXdhcmVCZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0U3RhcnR1cExpc3RlbmVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTAyNTc0ODM5OTg3NjgzMzM5M0w7DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5yZWdpc3RlclJlbmRlcmVySW50ZXJjZXB0b3IobmV3IFJlc2V0QmVhblZhbGlkYXRpb25SZW5kZXJlckludGVyY2VwdG9yKCkpOw0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3IobmV3IEJlYW5WYWxpZGF0aW9uVGFnQXdhcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3IoKSk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRCZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRCZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjAzNzZlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuRGVmYXVsdEdyb3VwU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBkZWZhdWx0IHN0b3JhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGJlYW4tdmFsaWRhdGlvbiBncm91cHMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UgZXh0ZW5kcyBEZWZhdWx0R3JvdXBTdG9yYWdlDQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIENsYXNzW10gZ2V0R3JvdXBzKFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgQ2xhc3NbXSByZXN1bHQgPSBzdXBlci5nZXRHcm91cHModmlld0lkLCBjbGllbnRJZCk7DQotDQotICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL3RoZSBkZWZhdWx0IGdyb3VwIHdpbGwgYmUgdmFsaWRhdGVkIGF1dG9tYXRpY2FsbHkNCi0gICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzW10ge307DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MDBmOGIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuR3JvdXBVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBzdG9yYWdlIGltcGxlbWVudGF0aW9uIGZvciBtb2RlbC12YWxpZGF0aW9uIGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZSBpbXBsZW1lbnRzIE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4+IG1vZGVsVmFsaWRhdGlvbkVudHJpZXMgPQ0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4+KCk7DQotDQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGNvbXBvbmVudHNPZlJlcXVlc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBjbGllbnRJZCA9IGdldEN1cnJlbnRDbGllbnRJZChtb2RlbFZhbGlkYXRpb25FbnRyeSk7DQotDQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QgPSByZXNvbHZlTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeSwgY2xpZW50SWQpOw0KLQ0KLSAgICAgICAgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkobW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LCBtb2RlbFZhbGlkYXRpb25FbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q3VycmVudENsaWVudElkKE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY2xpZW50SWQgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjbGllbnRJZCA9IG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpLmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotDQotICAgICAgICAgICAgaWYoIXRoaXMuY29tcG9uZW50c09mUmVxdWVzdC5jb250YWlucyhjbGllbnRJZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNPZlJlcXVlc3QuYWRkKGNsaWVudElkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY2xpZW50SWQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXNvbHZlTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KA0KLSAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBTdHJpbmcgY2xpZW50SWQpDQotICAgIHsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9DQotICAgICAgICAgICAgICAgIHRoaXMubW9kZWxWYWxpZGF0aW9uRW50cmllcy5nZXQoR3JvdXBVdGlscy5nZXRHcm91cEtleSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRWaWV3SWQoKSwgY2xpZW50SWQpKTsNCi0NCi0gICAgICAgIGlmKG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICAgICAgdGhpcy5tb2RlbFZhbGlkYXRpb25FbnRyaWVzLnB1dChHcm91cFV0aWxzLmdldEdyb3VwS2V5KA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Vmlld0lkKCksIGNsaWVudElkKSwgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3Q7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KA0KLSAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmKCFtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QuY29udGFpbnMobW9kZWxWYWxpZGF0aW9uRW50cnkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdC5hZGQobW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyB2aWV3SWQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRWaWV3SWQoKTsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotDQotICAgICAgICBhZGRFbnRyaWVzRm9yQ29tcG9uZW50cyh2aWV3SWQsIHJlc3VsdCk7DQotDQotICAgICAgICBhZGRFbnRyaWVzRm9yUGFnZSh2aWV3SWQsIHJlc3VsdCk7DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRFbnRyaWVzRm9yQ29tcG9uZW50cyhTdHJpbmcgdmlld0lkLCBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIGZvcihTdHJpbmcgY3VycmVudENsaWVudElkIDogdGhpcy5jb21wb25lbnRzT2ZSZXF1ZXN0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwoZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllcyh2aWV3SWQsIGN1cnJlbnRDbGllbnRJZCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRFbnRyaWVzRm9yUGFnZShTdHJpbmcgdmlld0lkLCBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIHJlc3VsdC5hZGRBbGwoZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllcyh2aWV3SWQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGJ1aWxkTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KA0KLSAgICAgICAgICAgIFN0cmluZyBrZXksIE1hcDxTdHJpbmcsIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+PiBncm91cFN0b3JhZ2UpDQotICAgIHsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IGxpc3Q7DQotDQotICAgICAgICBpZihrZXkgIT0gbnVsbCAmJiBrZXkuZW5kc1dpdGgoIioiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4oKTsNCi0gICAgICAgICAgICBmb3IoTWFwLkVudHJ5PFN0cmluZyxMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5Pj4gZW50cnkgOiBncm91cFN0b3JhZ2UuZW50cnlTZXQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldEtleSgpLnN1YnN0cmluZygwLCBlbnRyeS5nZXRLZXkoKS5pbmRleE9mKCJAIikpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhrZXkuc3Vic3RyaW5nKDAsIGtleS5pbmRleE9mKCJAIikpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGRBbGwoZW50cnkuZ2V0VmFsdWUoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGxpc3Q7DQotICAgICAgICB9DQotDQotICAgICAgICBsaXN0ID0gZ3JvdXBTdG9yYWdlLmdldChrZXkpOw0KLSAgICAgICAgcmV0dXJuIChsaXN0ICE9IG51bGwpID8gbGlzdCA6IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzKFN0cmluZyB2aWV3SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzKHZpZXdJZCwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzKFN0cmluZyB2aWV3SWQsIFN0cmluZyBjbGllbnRJZCkNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy5tb2RlbFZhbGlkYXRpb25FbnRyaWVzLnNpemUoKSA8IDEpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL2FkZCBmb3VuZCBncm91cHMNCi0gICAgICAgIFN0cmluZyBrZXk7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHRMaXN0Rm9yUGFnZSA9IG51bGw7DQotDQotICAgICAgICBpZighIioiLmVxdWFscyhjbGllbnRJZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAga2V5ID0gR3JvdXBVdGlscy5nZXRHcm91cEtleSh2aWV3SWQsIG51bGwpOw0KLSAgICAgICAgICAgIHJlc3VsdExpc3RGb3JQYWdlID0NCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkTW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0KGtleSwgdGhpcy5tb2RlbFZhbGlkYXRpb25FbnRyaWVzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGtleSA9IEdyb3VwVXRpbHMuZ2V0R3JvdXBLZXkodmlld0lkLCBjbGllbnRJZCk7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHRMaXN0Rm9yQ29tcG9uZW50ID0NCi0gICAgICAgICAgICAgICAgYnVpbGRNb2RlbFZhbGlkYXRpb25FbnRyeUxpc3Qoa2V5LCB0aGlzLm1vZGVsVmFsaWRhdGlvbkVudHJpZXMpOw0KLQ0KLSAgICAgICAgaWYocmVzdWx0TGlzdEZvclBhZ2UgPT0gbnVsbCB8fCByZXN1bHRMaXN0Rm9yUGFnZS5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdExpc3RGb3JDb21wb25lbnQ7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKHJlc3VsdExpc3RGb3JDb21wb25lbnQuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRMaXN0Rm9yUGFnZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBtZXJnZVJlc3VsdHMocmVzdWx0TGlzdEZvclBhZ2UsIHJlc3VsdExpc3RGb3JDb21wb25lbnQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbWVyZ2VSZXN1bHRzKA0KLSAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IHJlc3VsdExpc3RGb3JQYWdlLCBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiByZXN1bHRMaXN0Rm9yQ29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtZXJnZWRSZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PigpOw0KLSAgICAgICAgbWVyZ2VkUmVzdWx0LmFkZEFsbChyZXN1bHRMaXN0Rm9yUGFnZSk7DQotICAgICAgICBtZXJnZWRSZXN1bHQuYWRkQWxsKHJlc3VsdExpc3RGb3JDb21wb25lbnQpOw0KLSAgICAgICAgcmV0dXJuIG1lcmdlZFJlc3VsdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MzEwMTIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5TdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotDQotLyoqDQotICogZGVmYXVsdCBzdG9yYWdlLW1hbmFnZXIgZm9yIG1vZGVsLXZhbGlkYXRpb24gZW50cmllcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlcg0KLSAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8TW9kZWxWYWxpZGF0aW9uU3RvcmFnZT4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gU3RvcmFnZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIl9GT1JfTU9ERUxfVkFMSURBVElPTjpLRVkiOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25FbnRyeS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvbkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OGE4ZjMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5BUEk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihBUEkpDQotcHVibGljIGNsYXNzIE1vZGVsVmFsaWRhdGlvbkVudHJ5DQotew0KLSAgICBwcml2YXRlIFVJQ29tcG9uZW50IGNvbXBvbmVudDsNCi0gICAgcHJpdmF0ZSBMaXN0PENsYXNzPiBncm91cHMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLSAgICBwcml2YXRlIExpc3Q8T2JqZWN0PiB2YWxpZGF0aW9uVGFyZ2V0cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGlzcGxheU1lc3NhZ2VJbmxpbmUgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgY3VzdG9tTWVzc2FnZSA9IE1vZGVsVmFsaWRhdGlvbi5ERUZBVUxUOw0KLSAgICANCi0gICAgLy90aGUgb3JpZ2luYWwgc291cmNlIHdoZXJlIHRoZSBleHR2YWwtYnYgbWV0YS1kYXRhIGhhcyBiZWVuIGZvdW5kDQotICAgIHByaXZhdGUgT2JqZWN0IG1ldGFEYXRhU291cmNlT2JqZWN0Ow0KLSAgICBwcml2YXRlIFN0cmluZyB2aWV3SWQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5nZXRWaWV3SWQoKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkR3JvdXAoQ2xhc3MgZ3JvdXApDQotICAgIHsNCi0gICAgICAgIGlmKCF0aGlzLmdyb3Vwcy5jb250YWlucyhncm91cCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoISh0aGlzLmdyb3VwcyBpbnN0YW5jZW9mIEFycmF5TGlzdCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBuZXdHcm91cExpc3QgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLQ0KLSAgICAgICAgICAgICAgICBmb3IoQ2xhc3MgY3VycmVudENsYXNzIDogdGhpcy5ncm91cHMpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG5ld0dyb3VwTGlzdC5hZGQoY3VycmVudENsYXNzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB0aGlzLmdyb3VwcyA9IG5ld0dyb3VwTGlzdDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdGhpcy5ncm91cHMuYWRkKGdyb3VwKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVHcm91cChDbGFzcyBncm91cCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5ncm91cHMucmVtb3ZlKGdyb3VwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRWYWxpZGF0aW9uVGFyZ2V0KE9iamVjdCB0YXJnZXQpDQotICAgIHsNCi0gICAgICAgIGlmKCF0aGlzLnZhbGlkYXRpb25UYXJnZXRzLmNvbnRhaW5zKHRhcmdldCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoISh0aGlzLnZhbGlkYXRpb25UYXJnZXRzIGluc3RhbmNlb2YgQXJyYXlMaXN0KSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIExpc3Q8T2JqZWN0PiB2YWxpZGF0aW9uVGFyZ2V0TGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KLQ0KLSAgICAgICAgICAgICAgICBmb3IoT2JqZWN0IGN1cnJlbnRUYXJnZXQgOiB0aGlzLnZhbGlkYXRpb25UYXJnZXRzKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0TGlzdC5hZGQoY3VycmVudFRhcmdldCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uVGFyZ2V0cyA9IHZhbGlkYXRpb25UYXJnZXRMaXN0Ow0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25UYXJnZXRzLmFkZCh0YXJnZXQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIFVJQ29tcG9uZW50IGdldENvbXBvbmVudCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KFVJQ29tcG9uZW50IGNvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENsYXNzW10gZ2V0R3JvdXBzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzLnRvQXJyYXkobmV3IENsYXNzW3RoaXMuZ3JvdXBzLnNpemUoKV0pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwcyhMaXN0PENsYXNzPiBncm91cHMpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZ3JvdXBzID0gZ3JvdXBzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZ2V0VmFsaWRhdGlvblRhcmdldHMoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblRhcmdldHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRNZXRhRGF0YVNvdXJjZU9iamVjdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBtZXRhRGF0YVNvdXJjZU9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YVNvdXJjZU9iamVjdChPYmplY3QgbWV0YURhdGFTb3VyY2VPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHRoaXMubWV0YURhdGFTb3VyY2VPYmplY3QgPSBtZXRhRGF0YVNvdXJjZU9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlJlZHVuZGFudElmU3RhdGVtZW50In0pDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pDQotICAgIHsNCi0gICAgICAgIGlmICh0aGlzID09IG8pDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IHRoYXQgPSAoTW9kZWxWYWxpZGF0aW9uRW50cnkpIG87DQotDQotICAgICAgICBpZiAoY29tcG9uZW50ICE9IG51bGwgPyAhY29tcG9uZW50LmVxdWFscyh0aGF0LmNvbXBvbmVudCkgOiB0aGF0LmNvbXBvbmVudCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghZ3JvdXBzLmVxdWFscyh0aGF0Lmdyb3VwcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCF2YWxpZGF0aW9uVGFyZ2V0cy5lcXVhbHModGhhdC52YWxpZGF0aW9uVGFyZ2V0cykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNEaXNwbGF5TWVzc2FnZUlubGluZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBkaXNwbGF5TWVzc2FnZUlubGluZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TWVzc2FnZUlubGluZShib29sZWFuIGRpc3BsYXlNZXNzYWdlSW5saW5lKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmRpc3BsYXlNZXNzYWdlSW5saW5lID0gZGlzcGxheU1lc3NhZ2VJbmxpbmU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDdXN0b21NZXNzYWdlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGN1c3RvbU1lc3NhZ2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tTWVzc2FnZShTdHJpbmcgY3VzdG9tTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jdXN0b21NZXNzYWdlID0gY3VzdG9tTWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIGludCByZXN1bHQgPSBjb21wb25lbnQgIT0gbnVsbCA/IGNvbXBvbmVudC5oYXNoQ29kZSgpIDogMDsNCi0gICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgZ3JvdXBzLmhhc2hDb2RlKCk7DQotICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIHZhbGlkYXRpb25UYXJnZXRzLmhhc2hDb2RlKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Vmlld0lkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHZpZXdJZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWaWV3SWQoU3RyaW5nIHZpZXdJZCkNCi0gICAgew0KLSAgICAgICAgdGhpcy52aWV3SWQgPSB2aWV3SWQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmRmOTMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogc3VnZ2VzdGVkIGludGVyZmFjZSBmb3IgYSBtb2RlbC12YWxpZGF0aW9uIHN0b3JhZ2UNCi0gKiA8cC8+DQotICogaXQgYWxsb3dzIHRvIG1hbmFnZSBtb2RlbC12YWxpZGF0aW9uLWVudHJpZXMgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QNCi0gKiANCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UNCi17DQotICAgIHZvaWQgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkpOw0KLQ0KLSAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvbWFwcGVyL0JlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9CZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjMmUzOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvbWFwcGVyL0JlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uQmVhblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuRGVmYXVsdEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBOYW1lTWFwcGVyPFN0cmluZz4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKEJlYW5WYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoa2V5KSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpIDogbnVsbDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvbWFwcGVyL01vZGVsVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvbWFwcGVyL01vZGVsVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNjIwNTAuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLkRlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoTW9kZWxWYWxpZGF0aW9uLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoa2V5KSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9CZWFuVmFsaWRhdGlvblV0aWxzLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvQmVhblZhbGlkYXRpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzZkMTczLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9CZWFuVmFsaWRhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLk1vZGVsVmFsaWRhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5GYWNlc01lc3NhZ2VIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25VdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPR0dFUiA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEJlYW5WYWxpZGF0aW9uVXRpbHMuY2xhc3MpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzIGJ2bWkgPSBuZXcgRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscyhMT0dHRVIpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVE9SX0ZBQ1RPUllfS0VZID0gImphdmF4LmZhY2VzLnZhbGlkYXRvci5iZWFuVmFsaWRhdG9yLlZhbGlkYXRvckZhY3RvcnkiOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTWV0YURhdGFUb0NvbnRleHQoDQotICAgICAgICAgICAgVUlDb21wb25lbnQgY29tcG9uZW50LCBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLCBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZ1tdIGtleSA9IHByb3BlcnR5RGV0YWlscy5nZXRLZXkoKS5zcGxpdCgiXFwuIik7DQotDQotICAgICAgICBPYmplY3QgZmlyc3RCZWFuID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKS5nZXRCZWFuKGtleVswXSk7DQotDQotICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+KCk7DQotICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0NCi0gICAgICAgIGJ2bWkuZXh0cmFjdEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGEocHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBrZXksDQotICAgICAgICAgICAgICAgIGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotDQotICAgICAgICBidm1pLnByb2Nlc3NFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhKGNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc0NvbnN0cmFpbnRWaW9sYXRpb25zKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbj4gdmlvbGF0aW9ucykNCi0gICAgew0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2U7DQotICAgICAgICBmb3IgKENvbnN0cmFpbnRWaW9sYXRpb24gdmlvbGF0aW9uIDogdmlvbGF0aW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmYWNlc01lc3NhZ2UgPSBjcmVhdGVGYWNlc01lc3NhZ2VGb3JDb25zdHJhaW50VmlvbGF0aW9uKHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QsIHZpb2xhdGlvbik7DQotDQotICAgICAgICAgICAgaWYgKGZhY2VzTWVzc2FnZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGJ2bWkucHJvY2Vzc0ZhY2VzTWVzc2FnZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0LCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHJvY2Vzc1Zpb2xhdGlvbk1lc3NhZ2VzKGZhY2VzTWVzc2FnZUhvbGRlckxpc3QpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRmFjZXNNZXNzYWdlIGNyZWF0ZUZhY2VzTWVzc2FnZUZvckNvbnN0cmFpbnRWaW9sYXRpb24oVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJhaW50VmlvbGF0aW9uIHZpb2xhdGlvbikNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHZpb2xhdGlvbk1lc3NhZ2UgPSB2aW9sYXRpb24uZ2V0TWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGxhYmVsZWRNZXNzYWdlU3VtbWFyeSA9IGJ2bWkuY3JlYXRlTGFiZWxlZE1lc3NhZ2UodmlvbGF0aW9uTWVzc2FnZSwgZmFsc2UpOw0KLSAgICAgICAgU3RyaW5nIGxhYmVsZWRNZXNzYWdlRGV0YWlsID0gYnZtaS5jcmVhdGVMYWJlbGVkTWVzc2FnZSh2aW9sYXRpb25NZXNzYWdlLCB0cnVlKTsNCi0NCi0gICAgICAgIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSA9IGJ2bWkuY2FsY1NldmVyaXR5KHZpb2xhdGlvbik7DQotDQotICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uID0gYnZtaQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yRXhjZXB0aW9uKGxhYmVsZWRNZXNzYWdlU3VtbWFyeSwgbGFiZWxlZE1lc3NhZ2VEZXRhaWwsIHNldmVyaXR5KTsNCi0NCi0gICAgICAgIGlmICghYnZtaS5leGVjdXRlQWZ0ZXJUaHJvd2luZ0ludGVyY2VwdG9ycyh1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0LCB2YWxpZGF0b3JFeGNlcHRpb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGJ2bWkuaXNNZXNzYWdlVGV4dFVuY2hhbmdlZCh2YWxpZGF0b3JFeGNlcHRpb24sIGxhYmVsZWRNZXNzYWdlU3VtbWFyeSwgbGFiZWxlZE1lc3NhZ2VEZXRhaWwpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc2V2ZXJpdHksIHZpb2xhdGlvbk1lc3NhZ2UsIHZpb2xhdGlvbk1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVGYWNlc01lc3NhZ2Uoc2V2ZXJpdHksDQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkuZ2V0U3VtbWFyeSgpLA0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldERldGFpbCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc1Zpb2xhdGlvbk1lc3NhZ2VzKExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiB2aW9sYXRpb25NZXNzYWdlSG9sZGVyTGlzdCkNCi0gICAgew0KLSAgICAgICAgaWYgKHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0ID09IG51bGwgfHwgdmlvbGF0aW9uTWVzc2FnZUhvbGRlckxpc3QuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VMaXN0V2l0aExvd1NldmVyaXR5ID0NCi0gICAgICAgICAgICAgICAgYnZtaS5nZXRGYWNlc01lc3NhZ2VMaXN0V2l0aExvd1NldmVyaXR5KHZpb2xhdGlvbk1lc3NhZ2VIb2xkZXJMaXN0KTsNCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiBmYWNlc01lc3NhZ2VMaXN0V2l0aEhpZ2hTZXZlcml0eSA9DQotICAgICAgICAgICAgICAgIGJ2bWkuZ2V0RmFjZXNNZXNzYWdlTGlzdFdpdGhIaWdoU2V2ZXJpdHkodmlvbGF0aW9uTWVzc2FnZUhvbGRlckxpc3QpOw0KLQ0KLSAgICAgICAgYnZtaS5hZGRNZXNzYWdlcyhmYWNlc01lc3NhZ2VMaXN0V2l0aEhpZ2hTZXZlcml0eSk7DQotICAgICAgICBidm1pLmFkZE1lc3NhZ2VzKGZhY2VzTWVzc2FnZUxpc3RXaXRoTG93U2V2ZXJpdHkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yRmFjdG9yeSBnZXREZWZhdWx0VmFsaWRhdG9yRmFjdG9yeSgpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gYXBwbGljYXRpb25NYXAgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0RXh0ZXJuYWxDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25NYXAoKTsNCi0gICAgICAgIFZhbGlkYXRvckZhY3RvcnkgdmFsaWRhdG9yRmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICBpZiAoYXBwbGljYXRpb25NYXAuY29udGFpbnNLZXkoVkFMSURBVE9SX0ZBQ1RPUllfS0VZKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoYXBwbGljYXRpb25NYXAuZ2V0KFZBTElEQVRPUl9GQUNUT1JZX0tFWSkgaW5zdGFuY2VvZiBWYWxpZGF0b3JGYWN0b3J5KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yRmFjdG9yeSA9IChWYWxpZGF0b3JGYWN0b3J5KSBhcHBsaWNhdGlvbk1hcC5nZXQoVkFMSURBVE9SX0ZBQ1RPUllfS0VZKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodmFsaWRhdG9yRmFjdG9yeSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRvckZhY3RvcnkgPSBWYWxpZGF0aW9uLmJ1aWxkRGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKTsNCi0gICAgICAgICAgICBhcHBsaWNhdGlvbk1hcC5wdXQoVkFMSURBVE9SX0ZBQ1RPUllfS0VZLCB2YWxpZGF0b3JGYWN0b3J5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjIxODk0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnBheWxvYWQuVmlvbGF0aW9uU2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uQmVhblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5hbm5vdGF0aW9uLmV4dHJhY3Rvci5EZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnN0b3JhZ2UuTW9kZWxWYWxpZGF0aW9uRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLkVMSGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5GYWNlc01lc3NhZ2VIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlJlZmxlY3Rpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJveHlVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLWNsYXNzIEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFJbnRlcm5hbHMNCi17DQotICAgIHByaXZhdGUgTG9nIGxvZ2dlcjsNCi0gICAgcHJpdmF0ZSBMYWJlbGVkTWVzc2FnZUludGVybmFscyBsYWJlbGVkTWVzc2FnZUludGVybmFscyA9IG5ldyBMYWJlbGVkTWVzc2FnZUludGVybmFscygpOw0KLQ0KLSAgICBFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzKExvZyBsb2dnZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyOw0KLSAgICB9DQotDQotICAgIHZvaWQgZXh0cmFjdEV4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGEoUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10ga2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgaW5zcGVjdEZpcnN0QmVhbihwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgaW5zcGVjdEZpcnN0UHJvcGVydHkocHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAga2V5LA0KLSAgICAgICAgICAgICAgICBmaXJzdEJlYW4sDQotICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIGtleS5sZW5ndGggPT0gMik7DQotDQotICAgICAgICBpbnNwZWN0QmFzZU9mUHJvcGVydHkocHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgIGluc3BlY3RMYXN0UHJvcGVydHkocHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICB2b2lkIHByb2Nlc3NFeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhKFVJQ29tcG9uZW50IGNvbXBvbmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgPSBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBTdHJpbmcgY3VycmVudFZpZXdJZCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLmdldFZpZXdJZCgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGNsaWVudElkID0gY29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotDQotICAgICAgICBwcm9jZXNzRm91bmRHcm91cHMoZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LCBjdXJyZW50Vmlld0lkLCBjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgcHJvY2Vzc1Jlc3RyaWN0ZWRHcm91cHMoZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LCBjdXJyZW50Vmlld0lkLCBjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbik7DQotDQotICAgICAgICBpbml0TW9kZWxWYWxpZGF0aW9uKGV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCwgY29tcG9uZW50LCBwcm9wZXJ0eURldGFpbHMsDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RGaXJzdEJlYW4oYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgZmlyc3RCZWFuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzQ2xhc3MoZmlyc3RCZWFuLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5zcGVjdEZpcnN0UHJvcGVydHkoYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10ga2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzTGFzdFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzRmllbGRzQW5kUHJvcGVydGllcyhrZXlbMF0gKyAiLiIgKyBrZXlbMV0sDQotICAgICAgICAgICAgICAgIGZpcnN0QmVhbiwNCi0gICAgICAgICAgICAgICAga2V5WzFdLA0KLSAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICBpc0xhc3RQcm9wZXJ0eSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RCYXNlT2ZQcm9wZXJ0eShQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluc3BlY3RMYXN0UHJvcGVydHkoUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBwcm9jZXNzRmllbGRzQW5kUHJvcGVydGllcygNCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzLmdldEtleSgpLA0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpLA0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMuZ2V0UHJvcGVydHkoKSwNCi0gICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgdHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDbGFzcyhPYmplY3Qgb2JqZWN0VG9JbnNwZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBDbGFzcyBjbGFzc1RvSW5zcGVjdCA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3Mob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCkpOw0KLQ0KLSAgICAgICAgd2hpbGUgKCFPYmplY3QuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc1RvSW5zcGVjdC5nZXROYW1lKCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyYW5zZmVyR3JvdXBWYWxpZGF0aW9uSW5mb3JtYXRpb25Ub0ZvdW5kR3JvdXBzKG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhvYmplY3RUb0luc3BlY3QuZ2V0Q2xhc3MoKSwgb2JqZWN0VG9JbnNwZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLQ0KLSAgICAgICAgICAgIGNsYXNzVG9JbnNwZWN0ID0gY2xhc3NUb0luc3BlY3QuZ2V0U3VwZXJjbGFzcygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmllbGRzQW5kUHJvcGVydGllcyhTdHJpbmcga2V5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGJhc2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0xhc3RQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRHcm91cENvbnRyb2xsZXJTY2FubmluZ0V4dHJhY3RvcigpDQotICAgICAgICAgICAgICAgIC5leHRyYWN0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgbmV3IFByb3BlcnR5RGV0YWlscyhrZXksIGJhc2UsIHByb3BlcnR5KSk7DQotDQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSA6IHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEJlYW5WYWxpZGF0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5VG9Qcm9jZXNzTWV0YURhdGEoKEJlYW5WYWxpZGF0aW9uKSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5VG9DcmVhdGVOZXdUYXJnZXQoYmFzZSwgcHJvcGVydHksIGlzTGFzdFByb3BlcnR5KSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmIChtZXRhRGF0YUVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBCZWFuVmFsaWRhdGlvbi5MaXN0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZm9yIChCZWFuVmFsaWRhdGlvbiBjdXJyZW50QmVhblZhbGlkYXRpb24gOiAoKEJlYW5WYWxpZGF0aW9uLkxpc3QpIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSkudmFsdWUoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdHJ5VG9Qcm9jZXNzTWV0YURhdGEoY3VycmVudEJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlUb0NyZWF0ZU5ld1RhcmdldChiYXNlLCBwcm9wZXJ0eSwgaXNMYXN0UHJvcGVydHkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCB0cnlUb0NyZWF0ZU5ld1RhcmdldChPYmplY3QgYmFzZSwgU3RyaW5nIHByb3BlcnR5LCBib29sZWFuIGlzTGFzdFByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBpZihpc0xhc3RQcm9wZXJ0eSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYmFzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGdldFZhbHVlT2ZQcm9wZXJ0eShiYXNlLCBwcm9wZXJ0eSk7DQotDQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGJhc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IGdldFZhbHVlT2ZQcm9wZXJ0eShPYmplY3QgYmFzZSwgU3RyaW5nIHByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnR5LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc3Vic3RyaW5nKDEsIHByb3BlcnR5Lmxlbmd0aCgpKTsNCi0NCi0gICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhiYXNlLmdldENsYXNzKCkpOw0KLQ0KLSAgICAgICAgTWV0aG9kIHRhcmdldE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh0YXJnZXRDbGFzcywgImdldCIgKyBwcm9wZXJ0eSk7DQotDQotICAgICAgICBpZiAodGFyZ2V0TWV0aG9kID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGFyZ2V0TWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHRhcmdldENsYXNzLCAiaXMiICsgcHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHRhcmdldE1ldGhvZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICAiY2xhc3MgIiArIHRhcmdldENsYXNzICsgIiBoYXMgbm8gcHVibGljIGdldC9pcyAiICsgcHJvcGVydHkudG9Mb3dlckNhc2UoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKGJhc2UsIHRhcmdldE1ldGhvZCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NGb3VuZEdyb3VwcyhFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50Vmlld0lkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIGFkZCBmb3VuZCBncm91cHMgdG8gY29udGV4dA0KLSAgICAgICAgICovDQotICAgICAgICBmb3IgKENsYXNzIGN1cnJlbnRHcm91cENsYXNzIDogZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmFkZEdyb3VwKGN1cnJlbnRHcm91cENsYXNzLCBjdXJyZW50Vmlld0lkLCBjbGllbnRJZCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NSZXN0cmljdGVkR3JvdXBzKEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dCBleHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudFZpZXdJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGllbnRJZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIC8qDQotICAgICAgICAgKiBhZGQgcmVzdHJpY3RlZCBncm91cHMNCi0gICAgICAgICAqLw0KLSAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50R3JvdXBDbGFzcyA6IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LnJlc3RyaWN0R3JvdXAoY3VycmVudEdyb3VwQ2xhc3MsIGN1cnJlbnRWaWV3SWQsIGNsaWVudElkKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdE1vZGVsVmFsaWRhdGlvbihFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQgZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCBjb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TW9kZWxWYWxpZGF0aW9uRW50cnk+IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIGFkZCBtb2RlbCB2YWxpZGF0aW9uIGVudHJ5IGxpc3QNCi0gICAgICAgICAqLw0KLSAgICAgICAgZm9yIChNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSA6IG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBmb3IgKENsYXNzIHJlc3RyaWN0ZWRHcm91cCA6IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5yZW1vdmVHcm91cChyZXN0cmljdGVkR3JvdXApOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0R3JvdXBzKCkubGVuZ3RoID4gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmIChtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRWYWxpZGF0aW9uVGFyZ2V0cygpLmlzRW1wdHkoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuYWRkVmFsaWRhdGlvblRhcmdldChwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5zZXRDb21wb25lbnQoY29tcG9uZW50KTsNCi0gICAgICAgICAgICAgICAgZXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmFkZE1vZGVsVmFsaWRhdGlvbkVudHJ5KG1vZGVsVmFsaWRhdGlvbkVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInRlc3QgcHJveHkgc3VwcG9ydCIpDQotICAgIHByaXZhdGUgdm9pZCB0cmFuc2Zlckdyb3VwVmFsaWRhdGlvbkluZm9ybWF0aW9uVG9Gb3VuZEdyb3VwcygNCi0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0VG9JbnNwZWN0LA0KLSAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCkuaXNBbm5vdGF0aW9uUHJlc2VudChCZWFuVmFsaWRhdGlvbi5jbGFzcykpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5VG9Qcm9jZXNzTWV0YURhdGEob2JqZWN0VG9JbnNwZWN0LmdldENsYXNzKCkuZ2V0QW5ub3RhdGlvbihCZWFuVmFsaWRhdGlvbi5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICBvYmplY3RUb0luc3BlY3QsDQotICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChvYmplY3RUb0luc3BlY3QuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KEJlYW5WYWxpZGF0aW9uLkxpc3QuY2xhc3MpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvciAoQmVhblZhbGlkYXRpb24gY3VycmVudEJlYW5WYWxpZGF0aW9uIDoNCi0gICAgICAgICAgICAgICAgICAgIChvYmplY3RUb0luc3BlY3QuZ2V0Q2xhc3MoKS5nZXRBbm5vdGF0aW9uKEJlYW5WYWxpZGF0aW9uLkxpc3QuY2xhc3MpKS52YWx1ZSgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdHJ5VG9Qcm9jZXNzTWV0YURhdGEoY3VycmVudEJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFRvSW5zcGVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ludGVyZmFjZXMoQ2xhc3MgY3VycmVudENsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG1ldGFEYXRhU291cmNlT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNb2RlbFZhbGlkYXRpb25FbnRyeT4gbW9kZWxWYWxpZGF0aW9uRW50cnlMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc01vZGVsVmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgZm9yIChDbGFzcyBjdXJyZW50SW50ZXJmYWNlIDogY3VycmVudENsYXNzLmdldEludGVyZmFjZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cmFuc2Zlckdyb3VwVmFsaWRhdGlvbkluZm9ybWF0aW9uVG9Gb3VuZEdyb3VwcyhtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0NCi0gICAgICAgICAgICBwcm9jZXNzSW50ZXJmYWNlcyhjdXJyZW50SW50ZXJmYWNlLCBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kR3JvdXBzRm9yUHJvcGVydHlWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwNCi0gICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0ZWRHcm91cHNGb3JNb2RlbFZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9Qcm9jZXNzTWV0YURhdGEoQmVhblZhbGlkYXRpb24gYmVhblZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBmb3IgKFN0cmluZyBjdXJyZW50Vmlld0lkIDogYmVhblZhbGlkYXRpb24udmlld0lkcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICh1c2VNZXRhRGF0YUZvclZpZXdJZChiZWFuVmFsaWRhdGlvbiwgY3VycmVudFZpZXdJZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzTWV0YURhdGEoYmVhblZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxWYWxpZGF0aW9uKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VNZXRhRGF0YUZvclZpZXdJZChCZWFuVmFsaWRhdGlvbiBiZWFuVmFsaWRhdGlvbiwgU3RyaW5nIGN1cnJlbnRWaWV3SWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoY3VycmVudFZpZXdJZC5lcXVhbHMoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0Vmlld0lkKCkpIHx8DQotICAgICAgICAgICAgICAgIGN1cnJlbnRWaWV3SWQuZXF1YWxzKCIqIikpICYmIGlzVmFsaWRhdGlvblBlcm1pdHRlZChiZWFuVmFsaWRhdGlvbik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNZXRhRGF0YShCZWFuVmFsaWRhdGlvbiBiZWFuVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChwcm9jZXNzTW9kZWxWYWxpZGF0aW9uICYmIGlzTW9kZWxWYWxpZGF0aW9uKGJlYW5WYWxpZGF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBhZGRNb2RlbFZhbGlkYXRpb25FbnRyeSgNCi0gICAgICAgICAgICAgICAgICAgIGJlYW5WYWxpZGF0aW9uLCBtZXRhRGF0YVNvdXJjZU9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5TGlzdCwgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmICghaXNNb2RlbFZhbGlkYXRpb24oYmVhblZhbGlkYXRpb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NHcm91cHMoDQotICAgICAgICAgICAgICAgICAgICBiZWFuVmFsaWRhdGlvbiwgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24sIHJlc3RyaWN0ZWRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkYXRpb25QZXJtaXR0ZWQoQmVhblZhbGlkYXRpb24gYmVhblZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIEVMSGVscGVyIGVsSGVscGVyID0gRXh0VmFsVXRpbHMuZ2V0RUxIZWxwZXIoKTsNCi0NCi0gICAgICAgIGZvciAoU3RyaW5nIGNvbmRpdGlvbiA6IGJlYW5WYWxpZGF0aW9uLmNvbmRpdGlvbnMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoZWxIZWxwZXIuaXNFTFRlcm1XZWxsRm9ybWVkKGNvbmRpdGlvbikgJiYNCi0gICAgICAgICAgICAgICAgICAgIGVsSGVscGVyLmlzRUxUZXJtVmFsaWQoRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCBjb25kaXRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoZWxIZWxwZXIuZ2V0VmFsdWVPZkV4cHJlc3Npb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLCBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbihjb25kaXRpb24pKSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmICh0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigiYW4gaW52YWxpZCBjb25kaXRpb24gaXMgdXNlZDogIiArIGNvbmRpdGlvbik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTW9kZWxWYWxpZGF0aW9uKEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYmVhblZhbGlkYXRpb24ubW9kZWxWYWxpZGF0aW9uKCkuaXNBY3RpdmUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkTW9kZWxWYWxpZGF0aW9uRW50cnkoQmVhblZhbGlkYXRpb24gYmVhblZhbGlkYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbWV0YURhdGFTb3VyY2VPYmplY3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiByZXN0cmljdGVkR3JvdXBzRm9yTW9kZWxWYWxpZGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSA9IG5ldyBNb2RlbFZhbGlkYXRpb25FbnRyeSgpOw0KLQ0KLSAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuc2V0R3JvdXBzKEFycmF5cy5hc0xpc3QoYmVhblZhbGlkYXRpb24udXNlR3JvdXBzKCkpKTsNCi0gICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LnNldERpc3BsYXlNZXNzYWdlSW5saW5lKGJlYW5WYWxpZGF0aW9uLm1vZGVsVmFsaWRhdGlvbigpLmRpc3BsYXlJbmxpbmUoKSk7DQotICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5zZXRDdXN0b21NZXNzYWdlKGJlYW5WYWxpZGF0aW9uLm1vZGVsVmFsaWRhdGlvbigpLm1lc3NhZ2UoKSk7DQotICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5zZXRNZXRhRGF0YVNvdXJjZU9iamVjdChtZXRhRGF0YVNvdXJjZU9iamVjdCk7DQotDQotICAgICAgICBPYmplY3QgdmFsaWRhdGlvblRhcmdldDsNCi0gICAgICAgIGZvciAoU3RyaW5nIHZhbGlkYXRpb25UYXJnZXRFeHByZXNzaW9uIDogYmVhblZhbGlkYXRpb24ubW9kZWxWYWxpZGF0aW9uKCkudmFsaWRhdGlvblRhcmdldHMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoTW9kZWxWYWxpZGF0aW9uLkRFRkFVTFQuZXF1YWxzKHZhbGlkYXRpb25UYXJnZXRFeHByZXNzaW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0ID0gdHJ5VG9SZXNvbHZlVmFsaWRhdGlvblRhcmdldEV4cHJlc3Npb24odmFsaWRhdGlvblRhcmdldEV4cHJlc3Npb24pOw0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uVGFyZ2V0ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5hZGRWYWxpZGF0aW9uVGFyZ2V0KHZhbGlkYXRpb25UYXJnZXQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChiZWFuVmFsaWRhdGlvbi5yZXN0cmljdEdyb3VwcygpLmxlbmd0aCA+IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0Zvck1vZGVsVmFsaWRhdGlvbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChiZWFuVmFsaWRhdGlvbi5yZXN0cmljdEdyb3VwcygpKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0VmFsaWRhdGlvblRhcmdldHMoKS5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbW9kZWxWYWxpZGF0aW9uRW50cnkuYWRkVmFsaWRhdGlvblRhcmdldChtZXRhRGF0YVNvdXJjZU9iamVjdCk7DQotICAgICAgICB9DQotDQotICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeUxpc3QuYWRkKG1vZGVsVmFsaWRhdGlvbkVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCB0cnlUb1Jlc29sdmVWYWxpZGF0aW9uVGFyZ2V0RXhwcmVzc2lvbihTdHJpbmcgdmFsaWRhdGlvblRhcmdldEV4cHJlc3Npb24pDQotICAgIHsNCi0gICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsdWVCaW5kaW5nRXhwcmVzc2lvbiA9IG5ldyBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uKHZhbGlkYXRpb25UYXJnZXRFeHByZXNzaW9uKTsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgIC5nZXRWYWx1ZU9mRXhwcmVzc2lvbihGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZhbHVlQmluZGluZ0V4cHJlc3Npb24pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzR3JvdXBzKEJlYW5WYWxpZGF0aW9uIGJlYW5WYWxpZGF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBmb3VuZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbikNCi0gICAgew0KLSAgICAgICAgZm91bmRHcm91cHNGb3JQcm9wZXJ0eVZhbGlkYXRpb24uYWRkQWxsKEFycmF5cy5hc0xpc3QoYmVhblZhbGlkYXRpb24udXNlR3JvdXBzKCkpKTsNCi0NCi0gICAgICAgIGlmIChiZWFuVmFsaWRhdGlvbi5yZXN0cmljdEdyb3VwcygpLmxlbmd0aCA+IDApDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdHJpY3RlZEdyb3Vwc0ZvclByb3BlcnR5VmFsaWRhdGlvbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChiZWFuVmFsaWRhdGlvbi5yZXN0cmljdEdyb3VwcygpKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgU3RyaW5nIGNyZWF0ZUxhYmVsZWRNZXNzYWdlKFN0cmluZyB2aW9sYXRpb25NZXNzYWdlLCBib29sZWFuIGlzRGV0YWlsTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMubGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMuY3JlYXRlTGFiZWxlZE1lc3NhZ2UodmlvbGF0aW9uTWVzc2FnZSwgaXNEZXRhaWxNZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkgY2FsY1NldmVyaXR5KENvbnN0cmFpbnRWaW9sYXRpb248Pz4gdmlvbGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBmb3IgKENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPiBwYXlsb2FkIDogdmlvbGF0aW9uLmdldENvbnN0cmFpbnREZXNjcmlwdG9yKCkuZ2V0UGF5bG9hZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoVmlvbGF0aW9uU2V2ZXJpdHkuV2Fybi5jbGFzcykuaXNBc3NpZ25hYmxlRnJvbShwYXlsb2FkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfV0FSTjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZiAoRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoVmlvbGF0aW9uU2V2ZXJpdHkuSW5mby5jbGFzcykuaXNBc3NpZ25hYmxlRnJvbShwYXlsb2FkKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfSU5GTzsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZiAoRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0aW9uUGFyYW1ldGVyQ2xhc3NGb3IoVmlvbGF0aW9uU2V2ZXJpdHkuRmF0YWwuY2xhc3MpLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0ZBVEFMOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1I7DQotICAgIH0NCi0NCi0gICAgdm9pZCBwcm9jZXNzRmFjZXNNZXNzYWdlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QsIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIgPSBuZXcgRmFjZXNNZXNzYWdlSG9sZGVyKGZhY2VzTWVzc2FnZSk7DQotDQotICAgICAgICBmYWNlc01lc3NhZ2VIb2xkZXIuc2V0Q2xpZW50SWQodWlDb21wb25lbnQuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotDQotICAgICAgICBmYWNlc01lc3NhZ2VIb2xkZXJMaXN0LmFkZChmYWNlc01lc3NhZ2VIb2xkZXIpOw0KLSAgICB9DQotDQotICAgIGJvb2xlYW4gZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICBudWxsLA0KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZWRPYmplY3QsDQotICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbiwNCi0gICAgICAgICAgICAgICAgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgYm9vbGVhbiBpc01lc3NhZ2VUZXh0VW5jaGFuZ2VkKA0KLSAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24sIFN0cmluZyB2aW9sYXRpb25TdW1tYXJ5TWVzc2FnZSwgU3RyaW5nIHZpb2xhdGlvbkRldGFpbE1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2aW9sYXRpb25TdW1tYXJ5TWVzc2FnZS5lcXVhbHModmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldFN1bW1hcnkoKSkgJiYNCi0gICAgICAgICAgICAgICAgdmlvbGF0aW9uRGV0YWlsTWVzc2FnZS5lcXVhbHModmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpLmdldERldGFpbCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBWYWxpZGF0b3JFeGNlcHRpb24gY3JlYXRlVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgIFN0cmluZyB2aW9sYXRpb25TdW1tYXJ5TWVzc2FnZSwgU3RyaW5nIHZpb2xhdGlvbkRldGFpbE1lc3NhZ2UsIEZhY2VzTWVzc2FnZS5TZXZlcml0eSBzZXZlcml0eSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmNyZWF0ZUZhY2VzTWVzc2FnZShzZXZlcml0eSwgdmlvbGF0aW9uU3VtbWFyeU1lc3NhZ2UsIHZpb2xhdGlvbkRldGFpbE1lc3NhZ2UpKTsNCi0gICAgfQ0KLQ0KLSAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gZ2V0RmFjZXNNZXNzYWdlTGlzdFdpdGhMb3dTZXZlcml0eSgNCi0gICAgICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4gdmlvbGF0aW9uTWVzc2FnZXMpDQotICAgIHsNCi0gICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgICAgIGZvciAoRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlciA6IHZpb2xhdGlvbk1lc3NhZ2VzKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChGYWNlc01lc3NhZ2UuU0VWRVJJVFlfV0FSTi5lcXVhbHMoZmFjZXNNZXNzYWdlSG9sZGVyLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkpIHx8DQotICAgICAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfSU5GTy5lcXVhbHMoZmFjZXNNZXNzYWdlSG9sZGVyLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChmYWNlc01lc3NhZ2VIb2xkZXIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZUxpc3RXaXRoSGlnaFNldmVyaXR5KA0KLSAgICAgICAgICAgIExpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPiB2aW9sYXRpb25NZXNzYWdlSG9sZGVyTGlzdCkNCi0gICAgew0KLSAgICAgICAgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RmFjZXNNZXNzYWdlSG9sZGVyPigpOw0KLQ0KLSAgICAgICAgZm9yIChGYWNlc01lc3NhZ2VIb2xkZXIgZmFjZXNNZXNzYWdlSG9sZGVyIDogdmlvbGF0aW9uTWVzc2FnZUhvbGRlckxpc3QpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKEZhY2VzTWVzc2FnZS5TRVZFUklUWV9FUlJPUi5lcXVhbHMoZmFjZXNNZXNzYWdlSG9sZGVyLmdldEZhY2VzTWVzc2FnZSgpLmdldFNldmVyaXR5KCkpIHx8DQotICAgICAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRkFUQUwuZXF1YWxzKGZhY2VzTWVzc2FnZUhvbGRlci5nZXRGYWNlc01lc3NhZ2UoKS5nZXRTZXZlcml0eSgpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZmFjZXNNZXNzYWdlSG9sZGVyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHZvaWQgYWRkTWVzc2FnZXMoTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3RXaXRoTG93U2V2ZXJpdHkpDQotICAgIHsNCi0gICAgICAgIGZvciAoRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlciA6IGZhY2VzTWVzc2FnZUhvbGRlckxpc3RXaXRoTG93U2V2ZXJpdHkpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9BZGRWaW9sYXRpb25NZXNzYWdlRm9yQ29tcG9uZW50SWQoDQotICAgICAgICAgICAgICAgICAgICBmYWNlc01lc3NhZ2VIb2xkZXIuZ2V0Q2xpZW50SWQoKSwgZmFjZXNNZXNzYWdlSG9sZGVyLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvTGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9MYWJlbGVkTWVzc2FnZUludGVybmFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDBiNzgzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9MYWJlbGVkTWVzc2FnZUludGVybmFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBMYWJlbGVkTWVzc2FnZUludGVybmFscw0KLXsNCi0gICAgLy90aGVyZSBpcyBubyBjb25jdXJyZW5jeSBpc3N1ZSBoZXJlIC0gaXQgYWx3YXlzIGxlYWRzIHRvIHRoZSBzYW1lIHJlc3VsdA0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZWZhdWx0U3VtbWFyeU1lc3NhZ2VUZW1wbGF0ZSA9ICJ7MX06IHswfSI7DQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRlZmF1bHREZXRhaWxNZXNzYWdlVGVtcGxhdGUgPSAiezF9OiB7MH0iOw0KLSAgICBwcml2YXRlIFN0cmluZyBzdW1tYXJ5TWVzc2FnZVRlbXBsYXRlID0gZGVmYXVsdFN1bW1hcnlNZXNzYWdlVGVtcGxhdGU7DQotICAgIHByaXZhdGUgU3RyaW5nIGRldGFpbE1lc3NhZ2VUZW1wbGF0ZSA9IGRlZmF1bHREZXRhaWxNZXNzYWdlVGVtcGxhdGU7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19WQUxJREFUT1JfQkVBTlZBTElEQVRPUl9NRVNTQUdFID0NCi0gICAgICAgICAgICAiamF2YXguZmFjZXMudmFsaWRhdG9yLkJlYW5WYWxpZGF0b3IuTUVTU0FHRSI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9GQUNFU19WQUxJREFUT1JfQkVBTlZBTElEQVRPUl9NRVNTQUdFX0RFVEFJTCA9DQotICAgICAgICAgICAgImphdmF4LmZhY2VzLnZhbGlkYXRvci5CZWFuVmFsaWRhdG9yLk1FU1NBR0VfZGV0YWlsIjsNCi0NCi0gICAgU3RyaW5nIGNyZWF0ZUxhYmVsZWRNZXNzYWdlKFN0cmluZyB2aW9sYXRpb25NZXNzYWdlLCBib29sZWFuIGlzRGV0YWlsTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYoaXNEZXRhaWxNZXNzYWdlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnlUb1Jlc29sdmVEZXRhaWxNZXNzYWdlKHZpb2xhdGlvbk1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0cnlUb1Jlc29sdmVTdW1tYXJ5TWVzc2FnZSh2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb1Jlc29sdmVTdW1tYXJ5TWVzc2FnZShTdHJpbmcgdmlvbGF0aW9uTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYoc3VtbWFyeU1lc3NhZ2VUZW1wbGF0ZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRTdW1tYXJ5TWVzc2FnZVRlbXBsYXRlLnJlcGxhY2UoInswfSIsIHZpb2xhdGlvbk1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGhpcy5zdW1tYXJ5TWVzc2FnZVRlbXBsYXRlID0gbG9hZFN0YW5kYXJkTWVzc2FnZVRlbXBsYXRlKGZhbHNlKTsNCi0NCi0gICAgICAgIGlmKHN1bW1hcnlNZXNzYWdlVGVtcGxhdGUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlTGFiZWxlZE1lc3NhZ2UodmlvbGF0aW9uTWVzc2FnZSwgZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHN1bW1hcnlNZXNzYWdlVGVtcGxhdGUucmVwbGFjZSgiezB9IiwgdmlvbGF0aW9uTWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHJ5VG9SZXNvbHZlRGV0YWlsTWVzc2FnZShTdHJpbmcgdmlvbGF0aW9uTWVzc2FnZSkNCi0gICAgew0KLSAgICAgICAgaWYoZGV0YWlsTWVzc2FnZVRlbXBsYXRlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdERldGFpbE1lc3NhZ2VUZW1wbGF0ZS5yZXBsYWNlKCJ7MH0iLCB2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRoaXMuZGV0YWlsTWVzc2FnZVRlbXBsYXRlID0gbG9hZFN0YW5kYXJkTWVzc2FnZVRlbXBsYXRlKHRydWUpOw0KLQ0KLSAgICAgICAgaWYoZGV0YWlsTWVzc2FnZVRlbXBsYXRlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxhYmVsZWRNZXNzYWdlKHZpb2xhdGlvbk1lc3NhZ2UsIHRydWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGRldGFpbE1lc3NhZ2VUZW1wbGF0ZS5yZXBsYWNlKCJ7MH0iLCB2aW9sYXRpb25NZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBsb2FkU3RhbmRhcmRNZXNzYWdlVGVtcGxhdGUoYm9vbGVhbiBpc0RldGFpbE1lc3NhZ2UpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGlzRGV0YWlsTWVzc2FnZSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBKc2ZVdGlscy5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVZBWF9GQUNFU19WQUxJREFUT1JfQkVBTlZBTElEQVRPUl9NRVNTQUdFX0RFVEFJTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBKc2ZVdGlscy5nZXRNZXNzYWdlRnJvbUFwcGxpY2F0aW9uTWVzc2FnZUJ1bmRsZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVZBWF9GQUNFU19WQUxJREFUT1JfQkVBTlZBTElEQVRPUl9NRVNTQUdFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYzI4OTUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLkJlYW5WYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLmFubm90YXRpb24uTW9kZWxWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC5zdG9yYWdlLk1vZGVsVmFsaWRhdGlvbkVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC51dGlsLkJlYW5WYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UuRmFjZXNNZXNzYWdlSG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUV2ZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUlkOw0KLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5QaGFzZUxpc3RlbmVyOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uTWVzc2FnZUludGVycG9sYXRvcjsNCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXRoOw0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJyZWZhY3RvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIikNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBNb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyIGltcGxlbWVudHMgUGhhc2VMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM0ODIyMzM4OTMxODY3MDg4NzhMOw0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZnRlclBoYXNlKFBoYXNlRXZlbnQgcGhhc2VFdmVudCkNCi0gICAgew0KLSAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgianNyMzAzIHN0YXJ0IG1vZGVsIHZhbGlkYXRpb24iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1hcDxPYmplY3QsIExpc3Q8Q2xhc3M+PiBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgTGlzdDxDbGFzcz4+KCk7DQotDQotICAgICAgICBNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4oKTsNCi0NCi0gICAgICAgIGZvciAoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnkgOiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb24obW9kZWxWYWxpZGF0aW9uRW50cnksIHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzLCByZXN1bHRzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHByb2Nlc3NNb2RlbFZhbGlkYXRpb25SZXN1bHRzKHJlc3VsdHMpOw0KLQ0KLSAgICAgICAgZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9yc0ZvcihyZXN1bHRzKTsNCi0NCi0gICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoImpzcjMwMyB2YWxpZGF0aW9uIGZpbmlzaGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PE1vZGVsVmFsaWRhdGlvbkVudHJ5PiBnZXRNb2RlbFZhbGlkYXRpb25FbnRyaWVzVG9WYWxpZGF0ZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0TW9kZWxWYWxpZGF0aW9uRW50cmllc1RvVmFsaWRhdGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGVsVmFsaWRhdGlvbihNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPE9iamVjdCwgTGlzdDxDbGFzcz4+IHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb247DQotICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxPYmplY3Q+PiB2aW9sYXRpb25zOw0KLSAgICAgICAgQ2xhc3NbXSBncm91cHNUb1ZhbGlkYXRlOw0KLQ0KLSAgICAgICAgZm9yIChPYmplY3QgdmFsaWRhdGlvblRhcmdldCA6IG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldFZhbGlkYXRpb25UYXJnZXRzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlJbmZvcm1hdGlvbiA9IGNyZWF0ZVByb3BlcnR5SW5mb3JtYXRpb24obW9kZWxWYWxpZGF0aW9uRW50cnksIHZhbGlkYXRpb25UYXJnZXQpOw0KLQ0KLSAgICAgICAgICAgIGlmICghZXhlY3V0ZUdsb2JhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgICAgICBmYWNlc0NvbnRleHQsIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmdldENvbXBvbmVudCgpLCB2YWxpZGF0aW9uVGFyZ2V0LCBwcm9wZXJ0eUluZm9ybWF0aW9uKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZihtb2RlbFZhbGlkYXRpb25FbnRyeS5pc0Rpc3BsYXlNZXNzYWdlSW5saW5lKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBncm91cHNUb1ZhbGlkYXRlID0gbW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0R3JvdXBzKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vaWYgdmlvbGF0aW9uIHNob3VsZCBkaXNwbGF5ZWQgaW5saW5lIHZhbGlkYXRpb24gaGFzIHRvIHRha2UgcGxhY2Ugd2l0aCBhbGwgZ3JvdXBzDQotICAgICAgICAgICAgLy93aGljaCBtZWFuczogZ2xvYmFsIG1lc3NhZ2VzIC0+IGZpbHRlciBncm91cHMgYWxyZWFkeSB1c2VkIGZvciB0aGUgdmFsaWRhdGlvbiB0YXJnZXQNCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBncm91cHNUb1ZhbGlkYXRlID0gZmlsdGVyR3JvdXBzVG9WYWxpZGF0ZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeSwgdmFsaWRhdGlvblRhcmdldCwgcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZighc2hvdWxkQ29udGludWVWYWxpZGF0aW9uKG1vZGVsVmFsaWRhdGlvbkVudHJ5LCBncm91cHNUb1ZhbGlkYXRlKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBhZGRQcm9jZXNzZWRUYXJnZXQodmFsaWRhdGlvblRhcmdldCwgZ3JvdXBzVG9WYWxpZGF0ZSwgcHJvY2Vzc2VkVmFsaWRhdGlvblRhcmdldHMpOw0KLSAgICAgICAgICAgIHZpb2xhdGlvbnMgPSB2YWxpZGF0ZVRhcmdldCh2YWxpZGF0aW9uVGFyZ2V0LCBncm91cHNUb1ZhbGlkYXRlKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9ucyAhPSBudWxsICYmICF2aW9sYXRpb25zLmlzRW1wdHkoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NWaW9sYXRpb25zKGZhY2VzQ29udGV4dCwgbW9kZWxWYWxpZGF0aW9uRW50cnksIHZhbGlkYXRpb25UYXJnZXQsIHZpb2xhdGlvbnMsIHJlc3VsdHMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENsYXNzW10gZmlsdGVyR3JvdXBzVG9WYWxpZGF0ZShNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxPYmplY3QsIExpc3Q8Q2xhc3M+PiBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cykNCi0gICAgew0KLSAgICAgICAgaWYoIXByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzLmNvbnRhaW5zS2V5KHZhbGlkYXRpb25UYXJnZXQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRHcm91cHMoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8Q2xhc3M+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgICAgICBMaXN0PENsYXNzPiB2YWxpZGF0ZWRHcm91cHMgPSBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cy5nZXQodmFsaWRhdGlvblRhcmdldCk7DQotDQotICAgICAgICBmb3IoQ2xhc3MgZ3JvdXAgOiBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRHcm91cHMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighdmFsaWRhdGVkR3JvdXBzLmNvbnRhaW5zKGdyb3VwKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZ3JvdXApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQudG9BcnJheShuZXcgQ2xhc3NbcmVzdWx0LnNpemUoKV0pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRDb250aW51ZVZhbGlkYXRpb24oTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksIENsYXNzW10gZ3JvdXBzVG9WYWxpZGF0ZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICEoZ3JvdXBzVG9WYWxpZGF0ZSA9PSBudWxsIHx8IGdyb3Vwc1RvVmFsaWRhdGUubGVuZ3RoID09IDApIHx8DQotICAgICAgICAgICAgICAgIG1vZGVsVmFsaWRhdGlvbkVudHJ5LmlzRGlzcGxheU1lc3NhZ2VJbmxpbmUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkUHJvY2Vzc2VkVGFyZ2V0KE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzW10gZ3JvdXBzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxPYmplY3QsIExpc3Q8Q2xhc3M+PiBwcm9jZXNzZWRWYWxpZGF0aW9uVGFyZ2V0cykNCi0gICAgew0KLSAgICAgICAgaWYoIXByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzLmNvbnRhaW5zS2V5KHZhbGlkYXRpb25UYXJnZXQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzLnB1dCh2YWxpZGF0aW9uVGFyZ2V0LCBuZXcgQXJyYXlMaXN0PENsYXNzPigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIExpc3Q8Q2xhc3M+IHZhbGlkYXRlZEdyb3VwcyA9IHByb2Nlc3NlZFZhbGlkYXRpb25UYXJnZXRzLmdldCh2YWxpZGF0aW9uVGFyZ2V0KTsNCi0NCi0gICAgICAgIGZvcihDbGFzcyBncm91cCA6IGdyb3VwcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighdmFsaWRhdGVkR3JvdXBzLmNvbnRhaW5zKGdyb3VwKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRlZEdyb3Vwcy5hZGQoZ3JvdXApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFByb3BlcnR5SW5mb3JtYXRpb24gY3JlYXRlUHJvcGVydHlJbmZvcm1hdGlvbigNCi0gICAgICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQpDQotICAgIHsNCi0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbjsNCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHM7DQotICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uID0gbmV3IERlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uKCk7DQotICAgICAgICBpZiAobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9wZXJ0eURldGFpbHMgPSBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb3BlcnR5RGV0YWlscyA9IG5ldyBQcm9wZXJ0eURldGFpbHMobnVsbCwgdmFsaWRhdGlvblRhcmdldCwgbnVsbCk7DQotICAgICAgICB9DQotICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnNldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsIHByb3BlcnR5RGV0YWlscyk7DQotICAgICAgICByZXR1cm4gcHJvcGVydHlJbmZvcm1hdGlvbjsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gZXhlY3V0ZUdsb2JhbEJlZm9yZVZhbGlkYXRpb25JbnRlcmNlcHRvcnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5leGVjdXRlR2xvYmFsQmVmb3JlVmFsaWRhdGlvbkludGVyY2VwdG9ycyhmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uLmNsYXNzLmdldE5hbWUoKSwgcHJvcGVydHlJbmZvcm1hdGlvbiwgQmVhblZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBleGVjdXRlR2xvYmFsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbiBwcm9wZXJ0eUluZm9ybWF0aW9uKQ0KLSAgICB7DQotICAgICAgICBFeHRWYWxVdGlscy5leGVjdXRlR2xvYmFsQWZ0ZXJWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uLCBCZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxPYmplY3Q+PiB2YWxpZGF0ZVRhcmdldChPYmplY3QgdmFsaWRhdGlvblRhcmdldCwgQ2xhc3NbXSBncm91cHMpDQotICAgIHsNCi0gICAgICAgIGlmKGdyb3VwcyA9PSBudWxsIHx8IGdyb3Vwcy5sZW5ndGggPT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFZhbGlkYXRvckZhY3RvcnkgdmFsaWRhdG9yRmFjdG9yeSA9IEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWYWxpZGF0b3JGYWN0b3J5KCk7DQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yRmFjdG9yeQ0KLSAgICAgICAgICAgICAgICAudXNpbmdDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgLm1lc3NhZ2VJbnRlcnBvbGF0b3IoRXh0VmFsQmVhblZhbGlkYXRpb25Db250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKSkNCi0gICAgICAgICAgICAgICAgLmNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KHZhbGlkYXRvckZhY3RvcnkuZ2V0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoKSkNCi0gICAgICAgICAgICAgICAgLnRyYXZlcnNhYmxlUmVzb2x2ZXIodmFsaWRhdG9yRmFjdG9yeS5nZXRUcmF2ZXJzYWJsZVJlc29sdmVyKCkpDQotICAgICAgICAgICAgICAgIC5nZXRWYWxpZGF0b3IoKQ0KLSAgICAgICAgICAgICAgICAudmFsaWRhdGUodmFsaWRhdGlvblRhcmdldCwgZ3JvdXBzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1Zpb2xhdGlvbnMoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxPYmplY3Q+PiB2aW9sYXRpb25zLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzKQ0KLSAgICB7DQotICAgICAgICAvL2pzZiAyLjAgaXMgYWJsZSB0byBkaXNwbGF5IG11bHRpcGxlIG1lc3NhZ2VzIHBlciBjb21wb25lbnQgLSBzbyBwcm9jZXNzIGFsbCB2aW9sYXRpb25zDQotICAgICAgICAvL2pzZiA8IDIuMCB3aWxsIGp1c3QgdXNlIHRoZSBmaXJzdCBvbmUgKGZvciBpbmxpbmUgbWVzc2FnZXMgLSBzbyBpdCdzIG9ubHkgYSBsaXR0bGUgb3ZlcmhlYWQpDQotICAgICAgICBJdGVyYXRvcjxDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4+IHZpb2xhdGlvbnNJdGVyYXRvciA9IHZpb2xhdGlvbnMuaXRlcmF0b3IoKTsNCi0gICAgICAgIENvbnN0cmFpbnRWaW9sYXRpb248T2JqZWN0PiBjb25zdHJhaW50VmlvbGF0aW9uOw0KLSAgICAgICAgTW9kZWxWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdDsNCi0gICAgICAgIHdoaWxlICh2aW9sYXRpb25zSXRlcmF0b3IuaGFzTmV4dCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvQ3JlYXRlTW9kZWxWYWxpZGF0aW9uUmVzdWx0KGZhY2VzQ29udGV4dCwgbW9kZWxWYWxpZGF0aW9uRW50cnksIHJlc3VsdHMpOw0KLQ0KLSAgICAgICAgICAgIHJlc3VsdCA9IHJlc29sdmVNb2RlbFZhbGlkYXRpb25SZXN1bHQoZmFjZXNDb250ZXh0LCBtb2RlbFZhbGlkYXRpb25FbnRyeSwgcmVzdWx0cyk7DQotDQotICAgICAgICAgICAgY29uc3RyYWludFZpb2xhdGlvbiA9IHZpb2xhdGlvbnNJdGVyYXRvci5uZXh0KCk7DQotICAgICAgICAgICAgYWRkVmlvbGF0aW9uTWVzc2FnZShtb2RlbFZhbGlkYXRpb25FbnRyeSwgdmFsaWRhdGlvblRhcmdldCwgY29uc3RyYWludFZpb2xhdGlvbiwgcmVzdWx0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9DcmVhdGVNb2RlbFZhbGlkYXRpb25SZXN1bHQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVsVmFsaWRhdGlvbkVudHJ5IG1vZGVsVmFsaWRhdGlvbkVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzKQ0KLSAgICB7DQotICAgICAgICBNb2RlbFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0Ow0KLSAgICAgICAgaWYgKCFpc01vZGVsVmFsaWRhdGlvblJlc3VsdEF2YWlsYWJsZUZvcihmYWNlc0NvbnRleHQsIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCByZXN1bHRzKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBuZXcgTW9kZWxWYWxpZGF0aW9uUmVzdWx0KCk7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSwgcmVzdWx0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1vZGVsVmFsaWRhdGlvblJlc3VsdCByZXNvbHZlTW9kZWxWYWxpZGF0aW9uUmVzdWx0KEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTW9kZWxWYWxpZGF0aW9uUmVzdWx0PiByZXN1bHRzKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcmVzdWx0cy5nZXQobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTW9kZWxWYWxpZGF0aW9uUmVzdWx0QXZhaWxhYmxlRm9yKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHMuY29udGFpbnNLZXkobW9kZWxWYWxpZGF0aW9uRW50cnkuZ2V0Q29tcG9uZW50KCkuZ2V0Q2xpZW50SWQoZmFjZXNDb250ZXh0KSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFZpb2xhdGlvbk1lc3NhZ2UoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4gY29uc3RyYWludFZpb2xhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgaWYgKG1vZGVsVmFsaWRhdGlvbkVudHJ5LmlzRGlzcGxheU1lc3NhZ2VJbmxpbmUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQuYWRkRmFjZXNNZXNzYWdlSG9sZGVyKGNyZWF0ZUZhY2VzTWVzc2FnZUhvbGRlckZvckNvbnN0cmFpbnRWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50VmlvbGF0aW9uLCBtb2RlbFZhbGlkYXRpb25FbnRyeSwgdmFsaWRhdGlvblRhcmdldCwgdHJ1ZSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRGYWNlc01lc3NhZ2VIb2xkZXIoY3JlYXRlRmFjZXNNZXNzYWdlSG9sZGVyRm9yQ29uc3RyYWludFZpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb24sIG1vZGVsVmFsaWRhdGlvbkVudHJ5LCB2YWxpZGF0aW9uVGFyZ2V0LCBmYWxzZSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgRmFjZXNNZXNzYWdlSG9sZGVyIGNyZWF0ZUZhY2VzTWVzc2FnZUhvbGRlckZvckNvbnN0cmFpbnRWaW9sYXRpb24oZmluYWwgQ29uc3RyYWludFZpb2xhdGlvbiB2aW9sYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkaXNwbGF5QXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGZpbmFsIFN0cmluZyBuZXdWaW9sYXRpb25NZXNzYWdlID0gdHJ5VG9DaGFuZ2VWaW9sYXRpb25NZXNzYWdlKA0KLSAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeSwgdmFsaWRhdGlvblRhcmdldCwgdmlvbGF0aW9uKTsNCi0NCi0gICAgICAgIENvbnN0cmFpbnRWaW9sYXRpb24gbmV3Q29uc3RyYWludFZpb2xhdGlvbiA9IG5ldyBDb25zdHJhaW50VmlvbGF0aW9uKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcml2YXRlIENvbnN0cmFpbnRWaW9sYXRpb24gd3JhcHBlZCA9IHZpb2xhdGlvbjsNCi0NCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ld1Zpb2xhdGlvbk1lc3NhZ2U7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZVRlbXBsYXRlKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldE1lc3NhZ2VUZW1wbGF0ZSgpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFJvb3RCZWFuKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJvb3RCZWFuKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBDbGFzcyBnZXRSb290QmVhbkNsYXNzKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldFJvb3RCZWFuQ2xhc3MoKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRMZWFmQmVhbigpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRMZWFmQmVhbigpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgUGF0aCBnZXRQcm9wZXJ0eVBhdGgoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0UHJvcGVydHlQYXRoKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0SW52YWxpZFZhbHVlKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldEludmFsaWRWYWx1ZSgpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgQ29uc3RyYWludERlc2NyaXB0b3IgZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9Ow0KLQ0KLQ0KLSAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIGNsaWVudElkID0gbnVsbDsNCi0NCi0gICAgICAgIGlmIChkaXNwbGF5QXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgdWlDb21wb25lbnQgPSBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDb21wb25lbnQoKTsNCi0gICAgICAgICAgICBjbGllbnRJZCA9IHVpQ29tcG9uZW50LmdldENsaWVudElkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBGYWNlc01lc3NhZ2VIb2xkZXIgcmVzdWx0ID0gbmV3IEZhY2VzTWVzc2FnZUhvbGRlcihCZWFuVmFsaWRhdGlvblV0aWxzDQotICAgICAgICAgICAgICAgIC5jcmVhdGVGYWNlc01lc3NhZ2VGb3JDb25zdHJhaW50VmlvbGF0aW9uKHVpQ29tcG9uZW50LCB2YWxpZGF0aW9uVGFyZ2V0LCBuZXdDb25zdHJhaW50VmlvbGF0aW9uKSk7DQotICAgICAgICByZXN1bHQuc2V0Q2xpZW50SWQoY2xpZW50SWQpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB0cnlUb0NoYW5nZVZpb2xhdGlvbk1lc3NhZ2UoTW9kZWxWYWxpZGF0aW9uRW50cnkgbW9kZWxWYWxpZGF0aW9uRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cmFpbnRWaW9sYXRpb24gdmlvbGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzRGVmYXVsdE1lc3NhZ2UobW9kZWxWYWxpZGF0aW9uRW50cnkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZVZhbGlkYXRpb25FcnJvck1lc3NhZ2UoDQotICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDdXN0b21NZXNzYWdlKCksIHZhbGlkYXRpb25UYXJnZXQsIHZpb2xhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmlvbGF0aW9uLmdldE1lc3NhZ2UoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0TWVzc2FnZShNb2RlbFZhbGlkYXRpb25FbnRyeSBtb2RlbFZhbGlkYXRpb25FbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIE1vZGVsVmFsaWRhdGlvbi5ERUZBVUxULmVxdWFscyhtb2RlbFZhbGlkYXRpb25FbnRyeS5nZXRDdXN0b21NZXNzYWdlKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGludGVycG9sYXRlVmFsaWRhdGlvbkVycm9yTWVzc2FnZShTdHJpbmcgZXh0VmFsSW5saW5lTWVzc2FnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWxpZGF0aW9uVGFyZ2V0LCBmaW5hbCBDb25zdHJhaW50VmlvbGF0aW9uIHZpb2xhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkNCi0gICAgICAgICAgICAgICAgLmludGVycG9sYXRlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dFZhbElubGluZU1lc3NhZ2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1lc3NhZ2VJbnRlcnBvbGF0b3IuQ29udGV4dCgpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlvbGF0aW9uLmdldENvbnN0cmFpbnREZXNjcmlwdG9yKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWxpZGF0ZWRWYWx1ZSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uVGFyZ2V0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICApOw0KLSAgICB9DQotDQotICAgIEBUb0RvKFByaW9yaXR5Lk1FRElVTSkNCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb2RlbFZhbGlkYXRpb25SZXN1bHRzKE1hcDxTdHJpbmcsIE1vZGVsVmFsaWRhdGlvblJlc3VsdD4gcmVzdWx0cykNCi0gICAgew0KLSAgICAgICAgZm9yIChNb2RlbFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0IDogcmVzdWx0cy52YWx1ZXMoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBCZWFuVmFsaWRhdGlvblV0aWxzLnByb2Nlc3NWaW9sYXRpb25NZXNzYWdlcyhyZXN1bHQuZ2V0RmFjZXNNZXNzYWdlSG9sZGVyTGlzdCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9yc0ZvcihNYXA8U3RyaW5nLCBNb2RlbFZhbGlkYXRpb25SZXN1bHQ+IHJlc3VsdHMpDQotICAgIHsNCi0gICAgICAgIEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQgPSBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7DQotICAgICAgICBVSUNvbXBvbmVudCBjb21wb25lbnQ7DQotICAgICAgICBmb3IgKE1vZGVsVmFsaWRhdGlvblJlc3VsdCByZXN1bHQgOiByZXN1bHRzLnZhbHVlcygpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGZvciAoRmFjZXNNZXNzYWdlSG9sZGVyIGZhY2VzTWVzc2FnZUhvbGRlciA6IHJlc3VsdC5nZXRGYWNlc01lc3NhZ2VIb2xkZXJMaXN0KCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBudWxsOw0KLSAgICAgICAgICAgICAgICBpZiAoZmFjZXNNZXNzYWdlSG9sZGVyLmdldENsaWVudElkKCkgIT0gbnVsbCAmJiAhZmFjZXNNZXNzYWdlSG9sZGVyLmdldENsaWVudElkKCkuZXF1YWxzKCIqIikpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLmZpbmRDb21wb25lbnQoZmFjZXNNZXNzYWdlSG9sZGVyLmdldENsaWVudElkKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGV4ZWN1dGVHbG9iYWxBZnRlclZhbGlkYXRpb25JbnRlcmNlcHRvcnMoZmFjZXNDb250ZXh0LCBjb21wb25lbnQsIG51bGwsIG51bGwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVQaGFzZShQaGFzZUV2ZW50IHBoYXNlRXZlbnQpDQotICAgIHsNCi0gICAgICAgIC8vZG8gbm90aGluZw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5VUERBVEVfTU9ERUxfVkFMVUVTOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGdlbmVyYXRlZA0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKHRoaXMgPT0gbykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25SZXN1bHQuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25SZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjMTk4Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vTW9kZWxWYWxpZGF0aW9uUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5GYWNlc01lc3NhZ2VIb2xkZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTE9XLCBkZXNjcmlwdGlvbiA9ICJyZWZhY3RvciIpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBNb2RlbFZhbGlkYXRpb25SZXN1bHQNCi17DQotICAgIHByaXZhdGUgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGZhY2VzTWVzc2FnZUhvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PEZhY2VzTWVzc2FnZUhvbGRlcj4oKTsNCi0NCi0gICAgcHVibGljIHZvaWQgYWRkRmFjZXNNZXNzYWdlSG9sZGVyKEZhY2VzTWVzc2FnZUhvbGRlciBmYWNlc01lc3NhZ2VIb2xkZXIpDQotICAgIHsNCi0gICAgICAgIHRoaXMuZmFjZXNNZXNzYWdlSG9sZGVyTGlzdC5hZGQoZmFjZXNNZXNzYWdlSG9sZGVyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxGYWNlc01lc3NhZ2VIb2xkZXI+IGdldEZhY2VzTWVzc2FnZUhvbGRlckxpc3QoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFjZXNNZXNzYWdlSG9sZGVyTGlzdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vbWVzc2FnZS9pbnRlcnBvbGF0b3IvRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9tZXNzYWdlL2ludGVycG9sYXRvci9EZWZhdWx0TWVzc2FnZUludGVycG9sYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTgzOTJmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9tZXNzYWdlL2ludGVycG9sYXRvci9EZWZhdWx0TWVzc2FnZUludGVycG9sYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJlYW52YWwudmFsaWRhdGlvbi5tZXNzYWdlLmludGVycG9sYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uTWVzc2FnZUludGVycG9sYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IgaW1wbGVtZW50cyBNZXNzYWdlSW50ZXJwb2xhdG9yDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLSAgICANCi0gICAgcHJpdmF0ZSBNZXNzYWdlSW50ZXJwb2xhdG9yIHdyYXBwZWQ7DQotDQotICAgIHB1YmxpYyBEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcihNZXNzYWdlSW50ZXJwb2xhdG9yIHdyYXBwZWQpDQotICAgIHsNCi0gICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBpbnRlcnBvbGF0ZShTdHJpbmcgbWVzc2FnZU9yS2V5LCBDb250ZXh0IGNvbnRleHQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShtZXNzYWdlT3JLZXksIGNvbnRleHQsIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgaW50ZXJwb2xhdGUoU3RyaW5nIG1lc3NhZ2VPcktleSwgQ29udGV4dCBjb250ZXh0LCBMb2NhbGUgbG9jYWxlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkLmludGVycG9sYXRlKG1lc3NhZ2VPcktleSwgY29udGV4dCwgZ2V0Q3VycmVudExvY2FsZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTG9jYWxlIGdldEN1cnJlbnRMb2NhbGUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0V4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vbWVzc2FnZS9pbnRlcnBvbGF0b3IvRXh0VmFsTWVzc2FnZUludGVycG9sYXRvckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZlOWYzMy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vbWVzc2FnZS9pbnRlcnBvbGF0b3IvRXh0VmFsTWVzc2FnZUludGVycG9sYXRvckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iZWFudmFsLnZhbGlkYXRpb24ubWVzc2FnZS5pbnRlcnBvbGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5NZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk1lc3NhZ2VJbnRlcnBvbGF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRXh0VmFsTWVzc2FnZUludGVycG9sYXRvckFkYXB0ZXIgZXh0ZW5kcyBEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcg0KLXsNCi0gICAgcHJpdmF0ZSBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyOw0KLQ0KLSAgICBwdWJsaWMgRXh0VmFsTWVzc2FnZUludGVycG9sYXRvckFkYXB0ZXIoTWVzc2FnZUludGVycG9sYXRvciB3cmFwcGVkLCBNZXNzYWdlUmVzb2x2ZXIgbWVzc2FnZVJlc29sdmVyKQ0KLSAgICB7DQotICAgICAgICBzdXBlcih3cmFwcGVkKTsNCi0gICAgICAgIHRoaXMubWVzc2FnZVJlc29sdmVyID0gbWVzc2FnZVJlc29sdmVyOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGludGVycG9sYXRlKFN0cmluZyBtZXNzYWdlT3JLZXksIENvbnRleHQgY29udGV4dCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGludGVycG9sYXRlKG1lc3NhZ2VPcktleSwgY29udGV4dCwgZ2V0Q3VycmVudExvY2FsZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBpbnRlcnBvbGF0ZShTdHJpbmcgbWVzc2FnZU9yS2V5LCBDb250ZXh0IGNvbnRleHQsIExvY2FsZSBsb2NhbGUpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMubWVzc2FnZVJlc29sdmVyICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoaXNCZWFuVmFsaWRhdGlvbk1lc3NhZ2VLZXlGb3JtYXQobWVzc2FnZU9yS2V5KSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFN0cmluZyBuZXdNZXNzYWdlT3JLZXkgPSB0aGlzLm1lc3NhZ2VSZXNvbHZlci5nZXRNZXNzYWdlKGV4dHJhY3RLZXkobWVzc2FnZU9yS2V5KSwgZ2V0Q3VycmVudExvY2FsZSgpKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYoaXNWYWxpZGVNZXNzYWdlKG5ld01lc3NhZ2VPcktleSkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VPcktleSA9IG5ld01lc3NhZ2VPcktleTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSgieW91IHRyaWVkIHRvIHVzZSBhbiBleHR2YWwgbWVzc2FnZS1yZXNvbHZlciBmb3IiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcjMwMyB2YWxpZGF0aW9uIHdpdGggYW4gaW52YWxpZCBrZXkgLT4gdXNpbmcgYSBkZWZhdWx0IGludGVycG9sYXRvciIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmludGVycG9sYXRlKG1lc3NhZ2VPcktleSwgY29udGV4dCwgZ2V0Q3VycmVudExvY2FsZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNCZWFuVmFsaWRhdGlvbk1lc3NhZ2VLZXlGb3JtYXQoU3RyaW5nIG1lc3NhZ2VPcktleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VPcktleS5zdGFydHNXaXRoKCJ7IikgJiYgbWVzc2FnZU9yS2V5LmVuZHNXaXRoKCJ9Iik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXh0cmFjdEtleShTdHJpbmcgbWVzc2FnZU9yS2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWVzc2FnZU9yS2V5LnN1YnN0cmluZygxLCBtZXNzYWdlT3JLZXkubGVuZ3RoKCkgLSAxKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZGVNZXNzYWdlKFN0cmluZyBuZXdNZXNzYWdlT3JLZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAhKG5ld01lc3NhZ2VPcktleS5zdGFydHNXaXRoKEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSKSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld01lc3NhZ2VPcktleS5lbmRzV2l0aChBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5NSVNTSU5HX1JFU09VUkNFX01BUktFUikpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRkZWVmNi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmVhbnZhbC52YWxpZGF0aW9uLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmlydHVhbFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmlydHVhbFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJpdmF0ZSBDb25zdHJhaW50RGVzY3JpcHRvciBjb25zdHJhaW50RGVzY3JpcHRvcjsNCi0gICAgcHJpdmF0ZSBDbGFzcyBlbGVtZW50Q2xhc3M7IC8vcHJvcGVydHkgdHlwZQ0KLQ0KLSAgICBwdWJsaWMgQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5KENvbnN0cmFpbnREZXNjcmlwdG9yIGNvbnN0cmFpbnREZXNjcmlwdG9yLCBDbGFzcyBlbGVtZW50Q2xhc3MpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29uc3RyYWludERlc2NyaXB0b3IgPSBjb25zdHJhaW50RGVzY3JpcHRvcjsNCi0gICAgICAgIHRoaXMuZWxlbWVudENsYXNzID0gZWxlbWVudENsYXNzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDb25zdHJhaW50RGVzY3JpcHRvciBnZXRDb25zdHJhaW50RGVzY3JpcHRvcigpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb25zdHJhaW50RGVzY3JpcHRvcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0RWxlbWVudENsYXNzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVsZW1lbnRDbGFzczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RyYWludERlc2NyaXB0b3IuZ2V0QW5ub3RhdGlvbigpLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dCBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0IGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgVmFsaWRhdG9yDQotQ29weXJpZ2h0IDIwMDctMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1TZWUgdGhlIGZpbGUgTElDRU5TRS50eHQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNjJmZDcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0KLSAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFZhbGlkYXRpb24tTW9kdWxlczwvbmFtZT4KLSAgICA8dmVyc2lvbj4yLjAuMzwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjAuMzwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3RhZ3MvMl8wXzM8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9icmFuY2hlcy8yXzBfMzwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGFncy8yXzBfMzwvdXJsPgotICAgIDwvc2NtPgotCi0gICAgPG1vZHVsZXM+Ci0gICAgICAgIDxtb2R1bGU+cHJvcGVydHktdmFsaWRhdGlvbjwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmJlYW4tdmFsaWRhdGlvbjwvbW9kdWxlPgotICAgIDwvbW9kdWxlcz4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4zPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbCBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njc5NDc4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnZhbGlkYXRpb24tbW9kdWxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWV4dHZhbC1wcm9wZXJ0eS12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgotCi0gICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBQcm9wZXJ0eS1WYWxpZGF0aW9uLU1vZHVsZTwvbmFtZT4KLSAgICA8dmVyc2lvbj4yLjAuMzwvdmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPnZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjAuMzwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4zPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgucGVyc2lzdGVuY2U8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5wZXJzaXN0ZW5jZS1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuNTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQuanNwPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNwLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc2hhbGU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zaGFsZS10ZXN0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi9NRVRBLUlORjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypwcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40LjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL0Fic3RyYWN0Ki5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovVGVzdFV0aWxzLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qQmVhbi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgICAgICAgICAgIAotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbCBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9jb25maWcvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzN2Y0Mi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vY29uZmlnL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08IS0tDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18yXzAueHNkIg0KLSAgICAgICAgICAgICAgdmVyc2lvbj0iMi4wIj4NCi0gICAgPGxpZmVjeWNsZT4NCi0gICAgICAgIDxwaGFzZS1saXN0ZW5lcj5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyPC9waGFzZS1saXN0ZW5lcj4NCi0gICAgPC9saWZlY3ljbGU+DQotPC9mYWNlcy1jb25maWc+DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL01FVEEtSU5GL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvTUVUQS1JTkYvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQXBhY2hlIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3INCi1Db3B5cmlnaHQgMjAwNy0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNzg1ZDYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb21wb25lbnQKLSAgICAgICAgLkFic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5FZGl0YWJsZVZhbHVlSG9sZGVyOwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0SHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIKLXsKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVSZXF1aXJlZEF0dHJpYnV0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWV0YURhdGEpCi0gICAgewotICAgICAgICBpZigoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQpKSB8fAotICAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMobWV0YURhdGEuZ2V0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCkpKQotICAgICAgICAgICAgJiYKLSAgICAgICAgICAgIEJvb2xlYW4uVFJVRS5lcXVhbHMoaXNDb21wb25lbnRSZXF1aXJlZCh1aUNvbXBvbmVudCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKEVkaXRhYmxlVmFsdWVIb2xkZXIpdWlDb21wb25lbnQpLnNldFJlcXVpcmVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlNLSVBfVkFMSURBVElPTikpICYmCi0gICAgICAgICAgICAgICAhQm9vbGVhbi5UUlVFLmVxdWFscyhtZXRhRGF0YS5nZXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVEKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWRpdGFibGVWYWx1ZUhvbGRlcil1aUNvbXBvbmVudCkuc2V0UmVxdWlyZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0pvaW5WYWxpZGF0aW9uTWV0YURhdGFTdG9yYWdlRmlsdGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSm9pblZhbGlkYXRpb25NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWExMjNjZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSm9pblZhbGlkYXRpb25NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uSm9pblZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLmV4dHJhY3Rvci5EZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LkRlZmF1bHRQcm9wZXJ0eUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLk1ldGFEYXRhU3RvcmFnZUZpbHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ2xhc3NVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBFWFRWQUwtNTkNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIEpvaW5WYWxpZGF0aW9uTWV0YURhdGFTdG9yYWdlRmlsdGVyIGltcGxlbWVudHMgTWV0YURhdGFTdG9yYWdlRmlsdGVyDQotew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVElDX1NFUEFSQVRPUiA9ICI6IjsNCi0NCi0gICAgcHVibGljIHZvaWQgZmlsdGVyKFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKHByb3BlcnR5SW5mb3JtYXRpb24gIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8TWV0YURhdGFFbnRyeT4oKTsNCi0NCi0gICAgICAgICAgICByZXNvbHZlSm9pblZhbGlkYXRpb25NZXRhRGF0YShwcm9wZXJ0eUluZm9ybWF0aW9uLCByZXN1bHQpOw0KLQ0KLSAgICAgICAgICAgIHByb3BlcnR5SW5mb3JtYXRpb24ucmVzZXRNZXRhRGF0YUVudHJpZXMoKTsNCi0NCi0gICAgICAgICAgICBzZXREZWZhdWx0UHJvcGVydHlEZXRhaWxzKHByb3BlcnR5SW5mb3JtYXRpb24sIHJlc3VsdCk7DQotDQotICAgICAgICAgICAgaWYgKGNvbnRhaW5zSm9pblZhbGlkYXRpb25Db25zdHJhaW50KHJlc3VsdCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBmaWx0ZXIocHJvcGVydHlJbmZvcm1hdGlvbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZXNvbHZlSm9pblZhbGlkYXRpb25NZXRhRGF0YShQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24sIExpc3Q8TWV0YURhdGFFbnRyeT4gcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSA6IHByb3BlcnR5SW5mb3JtYXRpb24uZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0cnlUb1RyYW5zZm9ybUVudHJ5KG1ldGFEYXRhRW50cnkpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0RGVmYXVsdFByb3BlcnR5RGV0YWlscyhQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24sIExpc3Q8TWV0YURhdGFFbnRyeT4gcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSA6IHJlc3VsdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXRhRGF0YUVudHJ5LnNldFByb3BlcnR5KFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMsDQotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLmdldEluZm9ybWF0aW9uKFByb3BlcnR5SW5mb3JtYXRpb25LZXlzLlBST1BFUlRZX0RFVEFJTFMpKTsNCi0gICAgICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLmFkZE1ldGFEYXRhRW50cnkobWV0YURhdGFFbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zSm9pblZhbGlkYXRpb25Db25zdHJhaW50KExpc3Q8TWV0YURhdGFFbnRyeT4gcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiByZXN1bHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBKb2luVmFsaWRhdGlvbikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8TWV0YURhdGFFbnRyeT4gdHJ5VG9UcmFuc2Zvcm1FbnRyeShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIExpc3Q8TWV0YURhdGFFbnRyeT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUVudHJ5PigpOw0KLQ0KLSAgICAgICAgaWYgKG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEpvaW5WYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEpvaW5WYWxpZGF0aW9uIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEpvaW5WYWxpZGF0aW9uLmNsYXNzKTsNCi0NCi0gICAgICAgICAgICByZXBsYWNlTWV0YURhdGEoYW5ub3RhdGlvbiwgbWV0YURhdGFFbnRyeSwgcmVzdWx0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHQuYWRkKG1ldGFEYXRhRW50cnkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcmVwbGFjZU1ldGFEYXRhKEpvaW5WYWxpZGF0aW9uIGFubm90YXRpb24sIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgTGlzdDxNZXRhRGF0YUVudHJ5PiByZXN1bHQpDQotICAgIHsNCi0gICAgICAgIGZvciAoU3RyaW5nIHRhcmdldCA6IGFubm90YXRpb24udmFsdWUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnlUb1JlcGxhY2VNZXRhRGF0YU9mVGFyZ2V0KHRhcmdldCwgbWV0YURhdGFFbnRyeSwgcmVzdWx0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdHJ5VG9SZXBsYWNlTWV0YURhdGFPZlRhcmdldChTdHJpbmcgdGFyZ2V0LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksIExpc3Q8TWV0YURhdGFFbnRyeT4gcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoaXNTdGF0aWNTeW50YXgodGFyZ2V0KSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGFkZE1ldGFEYXRhKHJlc3VsdCwgZXh0cmFjdFN0YXRpY01ldGFEYXRhKHRhcmdldCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBhZGRNZXRhRGF0YShyZXN1bHQsIGV4dHJhY3REeW5hbWljTWV0YURhdGEobWV0YURhdGFFbnRyeSwgdGFyZ2V0KSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZyBhIGRpZmZlcmVudCBmaWx0ZXIgbWlnaHQgaW50cm9kdWNlIGEgbmV3IHN5bnRheCB3aGljaCBjYXVzZXMgdGhlIGV4Y2VwdGlvbg0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRNZXRhRGF0YShMaXN0PE1ldGFEYXRhRW50cnk+IHJlc3VsdCwgTWV0YURhdGFFbnRyeVtdIG1ldGFEYXRhRW50cmllcykNCi0gICAgew0KLSAgICAgICAgQ29sbGVjdGlvbnMuYWRkQWxsKHJlc3VsdCwgbWV0YURhdGFFbnRyaWVzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTdGF0aWNTeW50YXgoU3RyaW5nIHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldC5jb250YWlucyhTVEFUSUNfU0VQQVJBVE9SKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhRW50cnlbXSBleHRyYWN0U3RhdGljTWV0YURhdGEoU3RyaW5nIHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgaW50IHNlcGFyYXRvckluZGV4ID0gdGFyZ2V0Lmxhc3RJbmRleE9mKFNUQVRJQ19TRVBBUkFUT1IpOw0KLQ0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBsb2FkQ2xhc3ModGFyZ2V0LnN1YnN0cmluZygwLCBzZXBhcmF0b3JJbmRleCkpOw0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRhcmdldC5zdWJzdHJpbmcoc2VwYXJhdG9ySW5kZXggKyAxKTsNCi0NCi0gICAgICAgIHJldHVybiBuZXcgU3RhdGljU3ludGF4TWV0YURhdGFFeHRyYWN0b3IoKS5leHRyYWN0KHRhcmdldENsYXNzLCBwcm9wZXJ0eU5hbWUpLmdldE1ldGFEYXRhRW50cmllcygpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBjbGFzc05hbWUpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBDbGFzc1V0aWxzLmxvYWRDbGFzc0Zvck5hbWUoY2xhc3NOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1ldGFEYXRhRW50cnlbXSBleHRyYWN0RHluYW1pY01ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgU3RyaW5nIHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IEV4dFZhbFV0aWxzLmNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChtZXRhRGF0YUVudHJ5LCB0YXJnZXQpOw0KLQ0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKHByb3BlcnR5RGV0YWlscy5nZXRCYXNlT2JqZWN0KCkuZ2V0Q2xhc3MoKSk7DQotICAgICAgICByZXR1cm4gbmV3IFN0YXRpY1N5bnRheE1ldGFEYXRhRXh0cmFjdG9yKCkuZXh0cmFjdCgNCi0gICAgICAgICAgICAgICAgdGFyZ2V0Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpKS5nZXRNZXRhRGF0YUVudHJpZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGNsYXNzIFN0YXRpY1N5bnRheE1ldGFEYXRhRXh0cmFjdG9yIGV4dGVuZHMgRGVmYXVsdENvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uIHByb3BlcnR5SW5mb3JtYXRpb24gPSBuZXcgRGVmYXVsdFByb3BlcnR5SW5mb3JtYXRpb24oKTsNCi0NCi0gICAgICAgICAgICBhZGRQcm9wZXJ0eUFjY2Vzc0Fubm90YXRpb25zKHRhcmdldENsYXNzLCB0YXJnZXRQcm9wZXJ0eSwgcHJvcGVydHlJbmZvcm1hdGlvbik7DQotICAgICAgICAgICAgYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9ucyh0YXJnZXRDbGFzcywgdGFyZ2V0UHJvcGVydHksIHByb3BlcnR5SW5mb3JtYXRpb24pOw0KLQ0KLSAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIG9iaiAhPSBudWxsICYmIGdldENsYXNzKCkuZXF1YWxzKG9iai5nZXRDbGFzcygpKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDBjZGUwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3I7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLkRlZmF1bHRHcm91cFN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi0NCi0vKioNCi0gKiBuYW1lIG1hcHBlciBmb3IgZ3JvdXAgaW1wbGVtZW50YXRpb25zIHZpYSB2YWxpZGF0aW9uIHBhcmFtZXRlcnMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBJbnZvY2F0aW9uT3JkZXIoMjAwKQ0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIHNvdXJjZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uUGFyYW1ldGVyLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoc291cmNlKSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0R3JvdXBTdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yjc0ODQzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5WYWxpZGF0aW9uTW9kdWxlS2V5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBWYWxpZGF0aW9uTW9kdWxlS2V5DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkNCi17DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhlMGY4ZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdGFydHVwLkFic3RyYWN0U3RhcnR1cExpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5mYWN0b3J5LkZhY3RvcnlOYW1lczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZmFjdG9yeS5BYnN0cmFjdE5hbWVNYXBwZXJBd2FyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXJIb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuR3JvdXBTdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5zdG9yYWdlLk1ldGFEYXRhU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmluaXRpYWxpemVyLmNvbmZpZ3VyYXRpb24uU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbml0aWFsaXplci5jb25maWd1cmF0aW9uLlN0YXRpY0luTWVtb3J5Q29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwucmVjb3JkZXIuQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkRlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UubWFwcGVyLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5tYXBwZXIuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLkNyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Kc2ZVdGlsczsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0dXBMaXN0ZW5lcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTI0NzQzNjE2MTI4NTcyMjIyODNMOw0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkNCi0gICAgew0KLSAgICAgICAgaW5pdFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXJzKCk7DQotICAgICAgICBpbml0U3RhdGljU3RyYXRlZ3lNYXBwaW5ncygpOw0KLSAgICAgICAgaW5pdERlZmF1bHRDb21wb25lbnRJbml0aWFsaXplcigpOw0KLSAgICAgICAgYWRkU2tpcFZhbGlkYXRpb25TdXBwb3J0KCk7DQotICAgICAgICBpbml0U3RvcmFnZU1hbmFnZXJBbmROYW1lTWFwcGVycygpOw0KLSAgICAgICAgaW5pdFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKCk7DQotICAgICAgICBpbml0TWV0YURhdGFTdG9yYWdlRmlsdGVycygpOw0KLSAgICAgICAgaW5pdFBoYXNlTGlzdGVuZXJzKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9jZXNzZWRJbmZvcm1hdGlvblJlY29yZGVycygpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZFByb2Nlc3NlZEluZm9ybWF0aW9uUmVjb3JkZXIobmV3IENyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0U3RhdGljU3RyYXRlZ3lNYXBwaW5ncygpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBqcGFCYXNlZFZhbGlkYXRpb24gPSBXZWJYbWxQYXJhbWV0ZXIuREVBQ1RJVkFURV9KUEFfQkFTRURfVkFMSURBVElPTjsNCi0gICAgICAgIGlmIChqcGFCYXNlZFZhbGlkYXRpb24gPT0gbnVsbA0KLSAgICAgICAgICAgICAgICB8fCAhanBhQmFzZWRWYWxpZGF0aW9uLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBTdGF0aWNDb25maWd1cmF0aW9uPFN0cmluZywgU3RyaW5nPiBzdGF0aWNDb25maWcgPSBuZXcgU3RhdGljUmVzb3VyY2VCdW5kbGVDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAgICAgc3RhdGljQ29uZmlnLnNldFNvdXJjZU9mTWFwcGluZygNCi0gICAgICAgICAgICAgICAgRXh0VmFsSW5mb3JtYXRpb24uRVhURU5TSU9OU19WQUxJREFUT1JfQkFTRV9QQUNLQUdFX05BTUUgKyIuanBhX3N0cmF0ZWd5X21hcHBpbmdzIik7DQotDQotICAgICAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuYWRkU3RhdGljQ29uZmlndXJhdGlvbigNCi0gICAgICAgICAgICAgU3RhdGljQ29uZmlndXJhdGlvbk5hbWVzLk1FVEFfREFUQV9UT19WQUxJREFUSU9OX1NUUkFURUdZX0NPTkZJRywgc3RhdGljQ29uZmlnKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdERlZmF1bHRDb21wb25lbnRJbml0aWFsaXplcigpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLmFkZENvbXBvbmVudEluaXRpYWxpemVyKG5ldyBIdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplcigpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkU2tpcFZhbGlkYXRpb25TdXBwb3J0KCkNCi0gICAgew0KLSAgICAgICAgaWYobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2dnZXIuaW5mbygiYWRkaW5nIHN1cHBvcnQgZm9yIEBTa2lwVmFsaWRhdGlvbiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRXh0VmFsQ29udGV4dC5nZXRDb250ZXh0KCkuZGVueVJlbmRlcmVySW50ZXJjZXB0b3IoVmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKTsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVuZGVyZXJJbnRlcmNlcHRvcihuZXcgUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yKCkpOw0KLQ0KLSAgICAgICAgU3RhdGljSW5NZW1vcnlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBTdGF0aWNJbk1lbW9yeUNvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgIC8vaXQncyBqdXN0IHJlcXVpcmVkIHRvIHNldCB0aGUgdGFyZ2V0DQotICAgICAgICBjb25maWcuYWRkTWFwcGluZyhDb21tb25NZXRhRGF0YUtleXMuU0tJUF9WQUxJREFUSU9OLCBTa2lwVmFsaWRhdGlvblN1cHBvcnQuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgIC5hZGRTdGF0aWNDb25maWd1cmF0aW9uKFN0YXRpY0NvbmZpZ3VyYXRpb25OYW1lcy5TS0lQX1ZBTElEQVRJT05fU1VQUE9SVF9DT05GSUcsIGNvbmZpZyk7DQotDQotICAgICAgICAvL2NvbmZpZy5hZGRNYXBwaW5nKENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04sIFJlcXVpcmVkU3RyYXRlZ3kuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFN0b3JhZ2VNYW5hZ2VyQW5kTmFtZU1hcHBlcnMoKQ0KLSAgICB7DQotICAgICAgICBTdG9yYWdlTWFuYWdlckhvbGRlciBzdG9yYWdlTWFuYWdlckhvbGRlciA9DQotICAgICAgICAgICAgICAgIChFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeUZpbmRlcigpDQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEZhY3RvcnlOYW1lcy5TVE9SQUdFX01BTkFHRVJfRkFDVE9SWSwgU3RvcmFnZU1hbmFnZXJIb2xkZXIuY2xhc3MpKTsNCi0NCi0gICAgICAgIC8vcHJvY2Vzc2VkLWluZm9ybWF0aW9uDQotICAgICAgICBEZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlciBwcm9jZXNzZWRJbmZvU3RvcmFnZU1hbmFnZXIgPQ0KLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU1hbmFnZXIoKTsNCi0gICAgICAgIHByb2Nlc3NlZEluZm9TdG9yYWdlTWFuYWdlci5yZWdpc3RlcihuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIHN0b3JhZ2VNYW5hZ2VySG9sZGVyLnNldFN0b3JhZ2VNYW5hZ2VyKFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jbGFzcywgcHJvY2Vzc2VkSW5mb1N0b3JhZ2VNYW5hZ2VyLCBmYWxzZSk7DQotDQotICAgICAgICAvL2Nyb3NzLXZhbGlkYXRpb24NCi0gICAgICAgIERlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlciBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlciA9DQotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIoKTsNCi0gICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLnJlZ2lzdGVyKG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlcigpKTsNCi0gICAgICAgIHN0b3JhZ2VNYW5hZ2VySG9sZGVyLnNldFN0b3JhZ2VNYW5hZ2VyKENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MsIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLCBmYWxzZSk7DQotDQotICAgICAgICAvL2dyb3VwLXZhbGlkYXRpb24gbGlnaHQNCi0gICAgICAgIFN0b3JhZ2VNYW5hZ2VyIHN0b3JhZ2VNYW5hZ2VyID0gc3RvcmFnZU1hbmFnZXJIb2xkZXIuZ2V0U3RvcmFnZU1hbmFnZXIoR3JvdXBTdG9yYWdlLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmKHN0b3JhZ2VNYW5hZ2VyIGluc3RhbmNlb2YgQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgICgoQWJzdHJhY3ROYW1lTWFwcGVyQXdhcmVGYWN0b3J5PFN0cmluZz4pc3RvcmFnZU1hbmFnZXIpDQotICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IFByb3BlcnR5VmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTa2lwVmFsaWRhdGlvbkV2YWx1YXRvcigpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbENvbnRleHQuZ2V0Q29udGV4dCgpLnNldFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yKG5ldyBQcm9wZXJ0eVZhbGlkYXRpb25Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvcigpLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRNZXRhRGF0YVN0b3JhZ2VGaWx0ZXJzKCkNCi0gICAgew0KLSAgICAgICAgIE1ldGFEYXRhU3RvcmFnZSBtZXRhRGF0YVN0b3JhZ2UgPSBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKA0KLSAgICAgICAgICAgICAgICAgTWV0YURhdGFTdG9yYWdlLmNsYXNzLCBNZXRhRGF0YVN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIG1ldGFEYXRhU3RvcmFnZS5yZWdpc3RlckZpbHRlcihuZXcgSm9pblZhbGlkYXRpb25NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIoKSk7DQotICAgICAgICAvL21ldGFEYXRhU3RvcmFnZS5yZWdpc3RlckZpbHRlcihuZXcgQ29tcG9zaXRlTWV0YURhdGFTdG9yYWdlRmlsdGVyKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbml0UGhhc2VMaXN0ZW5lcnMoKQ0KLSAgICB7DQotICAgICAgICBKc2ZVdGlscy5yZWdpc3RlclBoYXNlTGlzdGVuZXIobmV3IENyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIoKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGM0NTI2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Qcmlvcml0eTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7Ci0KLS8qKgotICogdGhlIHNraXAgdmFsaWRhdGlvbiBzdXBwb3J0IHdhcyByZWZhY3RvcmVkIHRvIGFuIGluZGVwZW5kZW50IG1lY2hhbmlzbQotICogc2VlIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLUBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJjaGFuZ2UgdGhlIGFkZC1vbnMiICsKLSAgICAgICAgIm9sZCBuYW1lOiBWYWxpZGF0aW9uSW50ZXJjZXB0b3JXaXRoU2tpcFZhbGlkYXRpb25TdXBwb3J0IikKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZXh0ZW5kcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0TW9kdWxlS2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvblNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVhNmFkYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUHJvcGVydHlWYWxpZGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuSnNmVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgeC54LjMKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvciBpbXBsZW1lbnRzIFNraXBWYWxpZGF0aW9uRXZhbHVhdG9yCi17Ci0gICAgcHVibGljIGJvb2xlYW4gc2tpcFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBpZihKc2ZVdGlscy5pc1JlbmRlclJlc3BvbnNlUGhhc2UoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gIWlzQ2xpZW50U2lkZVZhbGlkYXRpb25FbmFibGVkKG1ldGFEYXRhRW50cnkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQgfHwgUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZGF0aW9uU2tpcHBlZChmYWNlc0NvbnRleHQsIHZhbGlkYXRpb25TdHJhdGVneSwgbWV0YURhdGFFbnRyeSk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDbGllbnRTaWRlVmFsaWRhdGlvbkVuYWJsZWQoTWV0YURhdGFFbnRyeSBlbnRyeSkKLSAgICB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBrZXlzVG9EaXNhYmxlID0gZW50cnkuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbk1ldGFEYXRhS2V5cy5ESVNBQkxFX0NMSUVOVF9TSURFX1ZBTElEQVRJT04sIExpc3QuY2xhc3MpOwotCi0gICAgICAgIHJldHVybiBrZXlzVG9EaXNhYmxlID09IG51bGwgfHwgIWtleXNUb0Rpc2FibGUuY29udGFpbnMoZW50cnkuZ2V0S2V5KCkpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzc3YTRlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcm4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiZG9jdW1lbnRhdGlvbiIpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlhtbFBhcmFtZXRlcg0KLXsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01FU1NBR0VTX0pQQSA9IFdlYlhtbFV0aWxzDQotICAgICAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkpQQV9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0VTIik7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVBQ1RJVkFURV9KUEFfQkFTRURfVkFMSURBVElPTiA9IFdlYlhtbFV0aWxzDQotICAgICAgICAgICAgLmdldEluaXRQYXJhbWV0ZXIoIkRFQUNUSVZBVEVfSlBBX0JBU0VEX1ZBTElEQVRJT04iKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjRlMDJmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vRG91YmxlUmFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBEb3VibGVSYW5nZQ0KLXsNCi0gICAgZG91YmxlIG1pbmltdW0oKSBkZWZhdWx0IERvdWJsZS5NSU5fVkFMVUU7DQotDQotICAgIGRvdWJsZSBtYXhpbXVtKCkgZGVmYXVsdCBEb3VibGUuTUFYX1ZBTFVFOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Kb2luVmFsaWRhdGlvbi5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Kb2luVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzlhODk5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vSm9pblZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIEpvaW5WYWxpZGF0aW9uDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xlbmd0aC5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM0MzdkMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xlbmd0aC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WYWxpZGF0aW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi0NCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIExlbmd0aA0KLXsNCi0gICAgaW50IG1pbmltdW0oKSBkZWZhdWx0IDA7DQotDQotICAgIGludCBtYXhpbXVtKCkgZGVmYXVsdCBJbnRlZ2VyLk1BWF9WQUxVRTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDI1MWVmLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgTG9uZ1JhbmdlDQotew0KLSAgICBsb25nIG1pbmltdW0oKSBkZWZhdWx0IExvbmcuTUlOX1ZBTFVFOw0KLQ0KLSAgICBsb25nIG1heGltdW0oKSBkZWZhdWx0IExvbmcuTUFYX1ZBTFVFOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1BhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc3NWQ4OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1BhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBQYXR0ZXJuDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZSgpOw0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAibm9fbWF0Y2giOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZC5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWNlMTI4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUmVxdWlyZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBSZXF1aXJlZA0KLXsNCi0gICAgLyoqDQotICAgICAqIHRvIGN1c3RvbWl6ZSB0aGUgZXJyb3IgbWVzc2FnZSBvcg0KLSAgICAgKiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBqc2YgcmVxdWlyZWQgbWVzc2FnZSB3aXRoIHRoZSB1c2FnZSBvZiB0aGUgbWVzc2FnZSByZXNvbHZlciBtZWNoYW5pc20NCi0gICAgICoNCi0gICAgICogQHJldHVybiBhbiBvcHRpb25hbCBlcnJvciBtZXNzYWdlIGtleQ0KLSAgICAgKi8NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgImZpZWxkX3JlcXVpcmVkIjsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQgVmlvbGF0aW9uU2V2ZXJpdHkuRXJyb3IuY2xhc3M7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb24uamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJjNTI5Yi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBTa2lwVmFsaWRhdGlvbg0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWUoKTsNCi0NCi0gICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25QYXJhbWV0ZXI+W10gcGFyYW1ldGVycygpIGRlZmF1bHQge307DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTA3NjIxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb25TdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBUYXJnZXQoVFlQRSkKLUBSZXRlbnRpb24oUlVOVElNRSkKLUBEb2N1bWVudGVkCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkKLXB1YmxpYyBAaW50ZXJmYWNlIFNraXBWYWxpZGF0aW9uU3VwcG9ydAotewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vVmFsaWRhdG9yLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjM4YWNhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgVmFsaWRhdG9yDQotew0KLSAgICBDbGFzczw/IGV4dGVuZHMgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvcj5bXSB2YWx1ZSgpOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTBlZWJhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uZXh0cmFjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eUluZm9ybWF0aW9uS2V5czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5EZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLkRlZmF1bHRDb21wb25lbnRNZXRhRGF0YUV4dHJhY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlRvRG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLlByb3h5VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLlByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotCi0vKioKLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlawotICogQHNpbmNlIDEueC4xCi0gKi8KLUBEZXByZWNhdGVkCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IgZXh0ZW5kcyBEZWZhdWx0Q29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3IKLXsKLSAgICBwcml2YXRlIERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFEYXRhRXh0cmFjdG9yIGdldEluc3RhbmNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5jcmVhdGVJbnRlcmNlcHRlZE1ldGFEYXRhRXh0cmFjdG9yRm9yKAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yKCksIFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFRvRG8oUHJpb3JpdHkuTUVESVVNKQotICAgIHB1YmxpYyBQcm9wZXJ0eUluZm9ybWF0aW9uIGV4dHJhY3QoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICAgIFByb3BlcnR5SW5mb3JtYXRpb24gcHJvcGVydHlJbmZvcm1hdGlvbiA9IG5ldyBEZWZhdWx0UHJvcGVydHlJbmZvcm1hdGlvbigpOwotCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFByb3BlcnR5RGV0YWlscykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24ob2JqZWN0LmdldENsYXNzKCkgKyAiIGlzIG5vdCBhICIgKyBQcm9wZXJ0eURldGFpbHMuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSAoUHJvcGVydHlEZXRhaWxzKW9iamVjdDsKLQotICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcyA9IFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKS5nZXRDbGFzcygpKTsKLQotICAgICAgICAvL1RPRE8gdGVzdCB3aXRoIGNvbXBsZXggY29tcG9uZW50cwotICAgICAgICBwcm9wZXJ0eUluZm9ybWF0aW9uLnNldEluZm9ybWF0aW9uKAotICAgICAgICAgICAgUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgcHJvcGVydHlEZXRhaWxzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBmaW5kIGFuZCBhZGQgYW5ub3RhdGlvbnMKLSAgICAgICAgICovCi0gICAgICAgIGFkZFByb3BlcnR5QWNjZXNzQW5ub3RhdGlvbnMoZW50aXR5Q2xhc3MsIHByb3BlcnR5RGV0YWlscy5nZXRQcm9wZXJ0eSgpLCBwcm9wZXJ0eUluZm9ybWF0aW9uKTsKLSAgICAgICAgYWRkRmllbGRBY2Nlc3NBbm5vdGF0aW9ucyhlbnRpdHlDbGFzcywgcHJvcGVydHlEZXRhaWxzLmdldFByb3BlcnR5KCksIHByb3BlcnR5SW5mb3JtYXRpb24pOwotCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eUluZm9ybWF0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcyBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlODAxMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9SW52YWxpZCBmb3JtYXQNCi1ub19tYXRjaF9kZXRhaWw9VGhlIHJlcXVpcmVkIGZvcm1hdGUgaXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcyBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdhYjU0My4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9XHUwNjI3XHUwNjQ0XHUwNjM1XHUwNjRhXHUwNjNhXHUwNjI5IFx1MDYyZVx1MDYyN1x1MDYzN1x1MDYyNlx1MDYyOQ0KLW5vX21hdGNoX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MzVcdTA2NGFcdTA2M2FcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjM3XHUwNjQ0XHUwNjQ4XHUwNjI4XHUwNjI5IFx1MDY0N1x1MDY0OTogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGQ2NDkwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotbm9fbWF0Y2g9Rm9ybWF0IGludlx1MDBlMGxpZAotbm9fbWF0Y2hfZGV0YWlsPUVsIGZvcm1hdCByZXF1ZXJpdCBcdTAwZTlzOiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZTcwMWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPVVuZ/xsdGlnZXMgRm9ybWF0DQotbm9fbWF0Y2hfZGV0YWlsPURhcyBlcmZvcmRlcmxpY2hlIEZvcm1hdCBpc3Q6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcyBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlODAxMi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9SW52YWxpZCBmb3JtYXQNCi1ub19tYXRjaF9kZXRhaWw9VGhlIHJlcXVpcmVkIGZvcm1hdGUgaXM6IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcyBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiYjk4Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotbm9fbWF0Y2g9Rm9ybWF0byBpbnZcdTAwZTFsaWRvIA0KLW5vX21hdGNoX2RldGFpbD1FbCBmb3JtYXRvIHJlcXVlcmlkbyBlczogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjBhMjIzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1ub19tYXRjaD1MZSBmb3JtYXQgZXN0IGludmFsaWRlDQotbm9fbWF0Y2hfZGV0YWlsPUxlIGZvcm1hdCBkb2l0ICZlY2lyYzt0cmUgZGUgbGEgZm9ybWU6IHswfQ0KLQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcyBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE4NzQ4Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW5vX21hdGNoPUZvcm1hdG8gbm9uIHZhbGlkbwotbm9fbWF0Y2hfZGV0YWlsPUlsIGZvcm1hdG8gcmljaGllc3RvICZlZ3JhdmU7OiB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NGJjNzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLW5vX21hdGNoPUdlXHUwMGU3ZXJzaXogYmlcdTAwZTdpbQ0KLW5vX21hdGNoX2RldGFpbD1nZXJla2VuIGJpXHUwMGU3aW06IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYWU2NGIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLSAgICAgICAgZXh0ZW5kcw0KLSAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5tZXNzYWdlLnJlc29sdmVyLkRlZmF1bHRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXINCi17DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBiYXNlTmFtZSA9IG51bGw7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VOYW1lKCkNCi0gICAgew0KLSAgICAgICAgaWYgKGJhc2VOYW1lID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgYmFzZU5hbWUgPSBzdXBlci5nZXRCYXNlTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGJhc2VOYW1lOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL3Jlc29sdmVyL0pwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDc2YWQ5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXNzYWdlLnJlc29sdmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5XZWJYbWxQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuRXh0VmFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLS8qDQotICogdGhlIGpwYSBzdXBwb3J0IGlzIGFuIGV4Y2VwdGlvbiBpbiB2aWV3IG9mIHNvbWUgbWVjaGFuaXNtcyAtIHNvIHRoZXJlJ3Mgbm8gY29udmVudGlvbiBmb3IgdGhlIG1lc3NhZ2UgYnVuZGxlLg0KLSAqIGluc3RlYWQgb2YgdGhlIGNvbnZlbnRpb24gdGhlcmUgaXMgYSBnbG9iYWwgcHJvcGVydHkgdG8gaGF2ZSBhbiBhbHRlcm5hdGl2ZSB0byB3ZWIueG1sIGNvbmZpZ3VyYXRpb24NCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBKcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMgPSAiSlBBX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRVMiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0JBU0VfTkFNRSA9IFdlYlhtbFBhcmFtZXRlci5WQUxJREFUSU9OX01FU1NBR0VTX0pQQTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfTkFNRSA9IEpwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5jbGFzcw0KLSAgICAgICAgICAgIC5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLnJlcGxhY2UoIi5tZXNzYWdlLnJlc29sdmVyIiwgIi5tZXNzYWdlLmJ1bmRsZSIpKyAiLmpwYV9tZXNzYWdlcyI7DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9tQmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZihDVVNUT01fQkFTRV9OQU1FICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIENVU1RPTV9CQVNFX05BTUU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKFN0cmluZylFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRHbG9iYWxQcm9wZXJ0eShKUEFfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFUyk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlTmFtZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBCQVNFX05BTUU7DQotICAgIH0NCi0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQWJzdHJhY3RWYWxpZGF0aW9uUGFyYW1ldGVyQXdhcmVUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQWJzdHJhY3RWYWxpZGF0aW9uUGFyYW1ldGVyQXdhcmVUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTVjZDQ0Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0Fic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnBhcmFtZXRlci5WaW9sYXRpb25TZXZlcml0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuUkVVU0UpDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YSkNCi0gICAgew0KLSAgICAgICAgaWYgKGlzQmxvY2tpbmdNZXRhRGF0YShtZXRhRGF0YSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybU1ldGFEYXRhKG1ldGFEYXRhKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGEpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Jsb2NraW5nTWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UgdGVzdE1lc3NhZ2UgPSBuZXcgRmFjZXNNZXNzYWdlKCk7DQotICAgICAgICB0ZXN0TWVzc2FnZS5zZXRTZXZlcml0eShGYWNlc01lc3NhZ2UuU0VWRVJJVFlfRVJST1IpOw0KLQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHNldmVyaXR5ID0gdHJ5VG9UcmFuc2Zvcm1WaW9sYXRpb25TZXZlcml0eShtZXRhRGF0YUVudHJ5KTsNCi0NCi0gICAgICAgIGlmKHNldmVyaXR5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGVzdE1lc3NhZ2Uuc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLnNldmVyaXR5QmxvY2tzU3VibWl0Rm9yQ29tcG9uZW50SWQobnVsbCwgdGVzdE1lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgRmFjZXNNZXNzYWdlLlNldmVyaXR5IHRyeVRvVHJhbnNmb3JtVmlvbGF0aW9uU2V2ZXJpdHkoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBMaXN0PEZhY2VzTWVzc2FnZS5TZXZlcml0eT4gcmVzdWx0ID0gRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvcigpDQotICAgICAgICAgICAgICAgIC5leHRyYWN0KG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcyksDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZ2V0VmFsaWRhdGlvblBhcmFtZXRlckNsYXNzRm9yKFZpb2xhdGlvblNldmVyaXR5LmNsYXNzKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWNlc01lc3NhZ2UuU2V2ZXJpdHkuY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmICFyZXN1bHQuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQuaXRlcmF0b3IoKS5uZXh0KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Eb3VibGVSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU5ZTRlLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uRG91YmxlUmFuZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEb3VibGVSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgRG91YmxlUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoRG91YmxlUmFuZ2UuY2xhc3MpOw0KLQ0KLSAgICAgICAgZG91YmxlIG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gIT0gRG91YmxlLk1JTl9WQUxVRSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOLCBtaW5pbXVtKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOX0RFRkFVTFQsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZG91YmxlIG1heGltdW0gPSBhbm5vdGF0aW9uLm1heGltdW0oKTsNCi0NCi0gICAgICAgIGlmKG1heGltdW0gIT0gRG91YmxlLk1BWF9WQUxVRSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYLCBtYXhpbXVtKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUFYX0RFRkFVTFQsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSm9pbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pvaW5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMzUzMjQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSm9pbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Kb2luVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5leHRyYWN0b3IuRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuZXh0cmFjdG9yLk1ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS50cmFuc2Zvcm1lci5NZXRhRGF0YVRyYW5zZm9ybWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm9wZXJ0eVZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotQERlcHJlY2F0ZWQNCi1wdWJsaWMgY2xhc3MgSm9pbk1ldGFEYXRhVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBNZXRhRGF0YVRyYW5zZm9ybWVyDQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0TWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gY29udmVydChtZXRhRGF0YUVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZih0aGlzLmxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCJ0aGlzIGNsYXNzIGlzIHJlcGxhY2VkIGJ5IGEgbWV0YS1kYXRhIHN0b3JhZ2UgZmlsdGVyLiAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiaWYgaXQgZ2V0cyBpbnZva2VkIGFuZCBhbiBleGNlcHRpb24gb2NjdXJzLCBhIGN1c3RvbSBzeW50YXggaXMgdXNlZC4iICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBjbGFzcyBtaWdodCBiZSB1c2VkIGJ5IGFuIG9sZCBhZGQtb24uIHBsZWFzZSBjaGVjayBmb3IgYSBuZXdlciB2ZXJzaW9uLiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udmVydChNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1ldGFEYXRhRXh0cmFjdG9yIGV4dHJhY3RvciA9IERlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuZ2V0SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgIFN0cmluZ1tdIHRhcmdldEV4cHJlc3Npb25zID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShKb2luVmFsaWRhdGlvbi5jbGFzcykudmFsdWUoKTsNCi0NCi0gICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3k7DQotICAgICAgICBNZXRhRGF0YVRyYW5zZm9ybWVyIG1ldGFEYXRhVHJhbnNmb3JtZXI7DQotDQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHM7DQotICAgICAgICBmb3IgKFN0cmluZyB0YXJnZXRFeHByZXNzaW9uIDogdGFyZ2V0RXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChtZXRhRGF0YUVudHJ5LCB0YXJnZXRFeHByZXNzaW9uKTsNCi0NCi0gICAgICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBleHRyYWN0b3IuZXh0cmFjdChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzKS5nZXRNZXRhRGF0YUVudHJpZXMoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSA9IEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25TdHJhdGVneUZvck1ldGFEYXRhKGVudHJ5LmdldEtleSgpKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYodmFsaWRhdGlvblN0cmF0ZWd5ID09IG51bGwgfHwNCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbGlkYXRpb25VdGlscy5pc1ZhbGlkYXRpb25Ta2lwcGVkKEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneSwgZW50cnkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBtZXRhRGF0YVRyYW5zZm9ybWVyID0gRXh0VmFsVXRpbHMuZ2V0TWV0YURhdGFUcmFuc2Zvcm1lckZvclZhbGlkYXRpb25TdHJhdGVneSh2YWxpZGF0aW9uU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAobWV0YURhdGFUcmFuc2Zvcm1lciAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZighKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBBbm5vdGF0aW9uICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3IoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5leHRyYWN0KGVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbGlkYXRpb25QYXJhbWV0ZXJDbGFzc0ZvcihEaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uY2xhc3MpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pdGVyYXRvcigpLmhhc05leHQoKSkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXRBbGwobWV0YURhdGFUcmFuc2Zvcm1lci5jb252ZXJ0TWV0YURhdGEoZW50cnkpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pwYU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pwYU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNlMTAxMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5tZXRhZGF0YS50cmFuc2Zvcm1lcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5CYXNpYzsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhTWV0YURhdGFUcmFuc2Zvcm1lciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXINCi17DQotICAgIEBUb0RvKHZhbHVlID0gUHJpb3JpdHkuTUVESVVNLCBkZXNjcmlwdGlvbiA9ICJpbXBsLiB0aGUgcmVzdCIpDQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotDQotICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpOw0KLQ0KLSAgICAgICAgaWYoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIENvbHVtbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZigoISgoQ29sdW1uKSBhbm5vdGF0aW9uKS5udWxsYWJsZSgpKSAmJiBFeHRWYWxVdGlscy5pbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEgsICgoQ29sdW1uKSBhbm5vdGF0aW9uKS5sZW5ndGgoKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKGFubm90YXRpb24gaW5zdGFuY2VvZiBCYXNpYykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZighKChCYXNpYykgYW5ub3RhdGlvbikub3B0aW9uYWwoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRCwgdHJ1ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihhbm5vdGF0aW9uIGluc3RhbmNlb2YgSWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLlJFUVVJUkVELCB0cnVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vVE9ETyBpbXBsLiB0aGUgcmVzdCEhIQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTGVuZ3RoTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTGVuZ3RoTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzkxZjlhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxlbmd0aDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIgIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uUGFyYW1ldGVyQXdhcmVUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIExlbmd0aCBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMZW5ndGguY2xhc3MpOw0KLQ0KLSAgICAgICAgaW50IG1pbmltdW0gPSBhbm5vdGF0aW9uLm1pbmltdW0oKTsNCi0NCi0gICAgICAgIGlmKG1pbmltdW0gIT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUlOX0xFTkdUSCwgbWluaW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1JTl9MRU5HVEhfREVGQVVMVCwgbWluaW11bSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpbnQgbWF4aW11bSA9IGFubm90YXRpb24ubWF4aW11bSgpOw0KLSAgICAgICAgaWYobWF4aW11bSAhPSBJbnRlZ2VyLk1BWF9WQUxVRSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuTUFYX0xFTkdUSCwgbWF4aW11bSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLk1BWF9MRU5HVEhfREVGQVVMVCwgbWF4aW11bSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Mb25nUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Mb25nUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYTMzMmIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uTG9uZ1JhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXINCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBMb25nUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoTG9uZ1JhbmdlLmNsYXNzKTsNCi0NCi0gICAgICAgIGxvbmcgbWluaW11bSA9IGFubm90YXRpb24ubWluaW11bSgpOw0KLQ0KLSAgICAgICAgaWYobWluaW11bSAhPSBMb25nLk1JTl9WQUxVRSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOLCBtaW5pbXVtKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUkFOR0VfTUlOX0RFRkFVTFQsIG1pbmltdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbG9uZyBtYXhpbXVtID0gYW5ub3RhdGlvbi5tYXhpbXVtKCk7DQotDQotICAgICAgICBpZihtYXhpbXVtICE9IExvbmcuTUFYX1ZBTFVFKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVgsIG1heGltdW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5SQU5HRV9NQVhfREVGQVVMVCwgbWF4aW11bSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9QYXR0ZXJuTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEwYmU2NS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9QYXR0ZXJuTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uUGF0dGVybjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFBhdHRlcm5NZXRhRGF0YVRyYW5zZm9ybWVyICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXINCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBQYXR0ZXJuIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKFBhdHRlcm4uY2xhc3MpOw0KLSAgICAgICAgDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTiwgKGFubm90YXRpb24pLnZhbHVlKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSA9IChhbm5vdGF0aW9uKS52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgICAgIExvY2FsZSBjdXJyZW50TG9jYWxlID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCk7DQotDQotICAgICAgICBWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5ID0NCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2cgPSBFeHRWYWxVdGlscy5nZXRNZXNzYWdlUmVzb2x2ZXJGb3JWYWxpZGF0aW9uU3RyYXRlZ3kodmFsaWRhdGlvblN0cmF0ZWd5KQ0KLSAgICAgICAgICAgIC5nZXRNZXNzYWdlKHZhbGlkYXRpb25FcnJvck1zZ0tleSwgY3VycmVudExvY2FsZSk7DQotDQotICAgICAgICByZXN1bHRzLnB1dChDb21tb25NZXRhRGF0YUtleXMuUEFUVEVSTl9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UsIHZhbGlkYXRpb25FcnJvck1zZyk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9SZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmJlY2M5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwubWV0YWRhdGEudHJhbnNmb3JtZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLkNvbW1vbk1ldGFEYXRhS2V5czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyDQotew0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiB0cmFuc2Zvcm1NZXRhRGF0YShNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLldFQUtfUkVRVUlSRUQsIHRydWUpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU2tpcE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NraXBNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYzY0YWIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU2tpcE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4yDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgU2tpcE1ldGFEYXRhVHJhbnNmb3JtZXIgIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uUGFyYW1ldGVyQXdhcmVUcmFuc2Zvcm1lcg0KLXsNCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gdHJhbnNmb3JtTWV0YURhdGEoTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIHJlc3VsdHMucHV0KENvbW1vbk1ldGFEYXRhS2V5cy5TS0lQX1ZBTElEQVRJT04sIHRydWUpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDA1YWIwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1ZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLm1ldGFkYXRhLnRyYW5zZm9ybWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuQ29tbW9uTWV0YURhdGFLZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXINCi17DQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRyYW5zZm9ybU1ldGFEYXRhKE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBWYWxpZGF0b3IgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoVmFsaWRhdG9yLmNsYXNzKTsNCi0NCi0gICAgICAgIENsYXNzW10gdmFsaWRhdG9ycyA9IGFubm90YXRpb24udmFsdWUoKTsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgZm9yKENsYXNzIGN1cnJlbnRDbGFzcyA6IHZhbGlkYXRvcnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoY3VycmVudENsYXNzLmdldFNpbXBsZU5hbWUoKS50b0xvd2VyQ2FzZSgpLmNvbnRhaW5zKENvbW1vbk1ldGFEYXRhS2V5cy5FTUFJTCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWx1ZS5hZGQoQ29tbW9uTWV0YURhdGFLZXlzLkVNQUlMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdmFsdWUuYWRkKGN1cnJlbnRDbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmVzdWx0cy5wdXQoQ29tbW9uTWV0YURhdGFLZXlzLkNVU1RPTSwgdmFsdWUpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvRG91YmxlUmFuZ2VTdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvRG91YmxlUmFuZ2VTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTc1OTMzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkRvdWJsZVJhbmdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuRG91YmxlUmFuZ2VWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERvdWJsZVJhbmdlU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLQ0KLSAgICAgICAgRG91YmxlUmFuZ2UgYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoRG91YmxlUmFuZ2UuY2xhc3MpOw0KLSAgICAgICAgRG91YmxlUmFuZ2VWYWxpZGF0b3IgZG91YmxlUmFuZ2VWYWxpZGF0b3IgPSAoRG91YmxlUmFuZ2VWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoImphdmF4LmZhY2VzLkRvdWJsZVJhbmdlIik7DQotDQotICAgICAgICBkb3VibGVSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIGRvdWJsZVJhbmdlVmFsaWRhdG9yLnNldE1heGltdW0oYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgZG91YmxlUmFuZ2VWYWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Kb2luVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Kb2luVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZGExYWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSm9pblZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkpvaW5WYWxpZGF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLmV4dHJhY3Rvci5EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5leHRyYWN0b3IuTWV0YURhdGFFeHRyYWN0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLkZhY2VzRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotQERlcHJlY2F0ZWQNCi1wdWJsaWMgY2xhc3MgSm9pblZhbGlkYXRpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmFsaWRhdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlSm9pblZhbGlkYXRpb24oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgbWV0YURhdGFFbnRyeSwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChGYWNlc0V4Y2VwdGlvbiB0KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IHQ7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybigidGhpcyBjbGFzcyBpcyByZXBsYWNlZCBieSBhIG1ldGEtZGF0YSBzdG9yYWdlIGZpbHRlci4gIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgImlmIGl0IGdldHMgaW52b2tlZCBhbmQgYW4gZXhjZXB0aW9uIG9jY3VycywgYSBjdXN0b20gc3ludGF4IGlzIHVzZWQuIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgY2xhc3MgbWlnaHQgYmUgdXNlZCBieSBhbiBvbGQgYWRkLW9uLiBwbGVhc2UgY2hlY2sgZm9yIGEgbmV3ZXIgdmVyc2lvbi4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlSm9pblZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgTWV0YURhdGFFeHRyYWN0b3IgZXh0cmFjdG9yID0gRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5nZXRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgU3RyaW5nW10gdGFyZ2V0RXhwcmVzc2lvbnMgPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEpvaW5WYWxpZGF0aW9uLmNsYXNzKS52YWx1ZSgpOw0KLQ0KLSAgICAgICAgVmFsaWRhdGlvblN0cmF0ZWd5IHZhbGlkYXRpb25TdHJhdGVneTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHM7DQotICAgICAgICBmb3IgKFN0cmluZyB0YXJnZXRFeHByZXNzaW9uIDogdGFyZ2V0RXhwcmVzc2lvbnMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvcGVydHlEZXRhaWxzID0gRXh0VmFsVXRpbHMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVByb3BlcnR5RGV0YWlsc0Zvck5ld1RhcmdldChtZXRhRGF0YUVudHJ5LCB0YXJnZXRFeHByZXNzaW9uKTsNCi0NCi0gICAgICAgICAgICBmb3IgKE1ldGFEYXRhRW50cnkgZW50cnkgOiBleHRyYWN0b3IuZXh0cmFjdChmYWNlc0NvbnRleHQsIHByb3BlcnR5RGV0YWlscykuZ2V0TWV0YURhdGFFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kgPSBFeHRWYWxVdGlscy5nZXRWYWxpZGF0aW9uU3RyYXRlZ3lGb3JNZXRhRGF0YShlbnRyeS5nZXRLZXkoKSk7DQotDQotICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uU3RyYXRlZ3kgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoRXh0VmFsVXRpbHMucHJvY2Vzc01ldGFEYXRhRW50cnlBZnRlclNraXBWYWxpZGF0aW9uKFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdHJhdGVneS5nZXRDbGFzcygpLCBWYWxpZGF0aW9uU3RyYXRlZ3kuY2xhc3MpLCBlbnRyeSkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgZW50cnksIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm5vIHZhbGlkYXRpb24gc3RyYXRlZ3kgZm91bmQgZm9yICIgKyBlbnRyeS5nZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTQxYTkzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5Db21tb25NZXRhRGF0YUtleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uZXhjZXB0aW9uLlJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLk51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5CYXNpYzsNCi1pbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmU7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ATnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1ARW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgSnBhVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRmFjZXNCdW5kbGUgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRFX0xFTkdUSCA9ICJsZW5ndGgiOw0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB2aW9sYXRpb247DQotICAgIHByaXZhdGUgaW50IG1heExlbmd0aDsNCi0NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpOw0KLSAgICAgICAgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBDb2x1bW4pDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVDb2x1bW5Bbm5vdGF0aW9uKChDb2x1bW4pIGFubm90YXRpb24sIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgQmFzaWMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGVCYXNpY0Fubm90YXRpb24oKEJhc2ljKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIElkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBPbmVUb09uZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0ZU9uZVRvT25lQW5ub3RhdGlvbigoT25lVG9PbmUpIGFubm90YXRpb24sIGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTWFueVRvT25lKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZhbGlkYXRlTWFueVRvT25lQW5ub3RhdGlvbigoTWFueVRvT25lKSBhbm5vdGF0aW9uLCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUNvbHVtbkFubm90YXRpb24oQ29sdW1uIGNvbHVtbiwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoIWNvbHVtbi5udWxsYWJsZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChjb252ZXJ0ZWRPYmplY3QgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY29udmVydGVkT2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nDQotICAgICAgICAgICAgICAgICYmIGNvbHVtbi5sZW5ndGgoKSA8ICgoU3RyaW5nKSBjb252ZXJ0ZWRPYmplY3QpLmxlbmd0aCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uID0gVkFMSURBVEVfTEVOR1RIOw0KLSAgICAgICAgICAgIHRoaXMubWF4TGVuZ3RoID0gY29sdW1uLmxlbmd0aCgpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0b3JFeGNlcHRpb24oZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNZXNzYWdlKG51bGwpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVCYXNpY0Fubm90YXRpb24oQmFzaWMgYmFzaWMsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKCFiYXNpYy5vcHRpb25hbCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVPbmVUb09uZUFubm90YXRpb24oT25lVG9PbmUgb25lVG9PbmUsIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIGlmICghb25lVG9PbmUub3B0aW9uYWwoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTWFueVRvT25lQW5ub3RhdGlvbihNYW55VG9PbmUgbWFueVRvT25lLCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIW1hbnlUb09uZS5vcHRpb25hbCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNoZWNrUmVxdWlyZWRDb252ZXJ0ZWRPYmplY3QoY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAVG9EbyhQcmlvcml0eS5NRURJVU0pDQotICAgIHByaXZhdGUgdm9pZCBjaGVja1JlcXVpcmVkQ29udmVydGVkT2JqZWN0KE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCA9PSBudWxsIHx8ICgiIi5lcXVhbHMoY29udmVydGVkT2JqZWN0KSAmJiBFeHRWYWxVdGlscy5pbnRlcnByZXRFbXB0eVN0cmluZ1ZhbHVlc0FzTnVsbCgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbiA9IENvbW1vbk1ldGFEYXRhS2V5cy5SRVFVSVJFRDsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb24oZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNZXNzYWdlKG51bGwpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChWQUxJREFURV9MRU5HVEguZXF1YWxzKHRoaXMudmlvbGF0aW9uKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gImZpZWxkX3Rvb19sb25nIjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gImZpZWxkX3JlcXVpcmVkIjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24pOw0KLQ0KLSAgICAgICAgaWYgKFZBTElEQVRFX0xFTkdUSC5lcXVhbHModGhpcy52aW9sYXRpb24pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLnJlcGxhY2UoInswfSIsICIiICsgdGhpcy5tYXhMZW5ndGgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzQWZ0ZXJWYWxpZGF0b3JFeGNlcHRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvckV4Y2VwdGlvbiBlKQ0KLSAgICB7DQotICAgICAgICBGYWNlc01lc3NhZ2UgZmFjZXNNZXNzYWdlID0gZS5nZXRGYWNlc01lc3NhZ2UoKTsNCi0NCi0gICAgICAgIGlmKHRoaXMudXNlRmFjZXNCdW5kbGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoVkFMSURBVEVfTEVOR1RILmVxdWFscyh0aGlzLnZpb2xhdGlvbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5yZXBsYWNlV2l0aERlZmF1bHRNYXhpbXVtTWVzc2FnZShmYWNlc01lc3NhZ2UsIHRoaXMubWF4TGVuZ3RoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKGZhY2VzTWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIGUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xlbmd0aFN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2QwNTU4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xlbmd0aFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5MZW5ndGg7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5MZW5ndGhWYWxpZGF0b3I7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIExlbmd0aFN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIExlbmd0aCBhbm5vdGF0aW9uID0gbWV0YURhdGFFbnRyeS5nZXRWYWx1ZShMZW5ndGguY2xhc3MpOw0KLSAgICAgICAgTGVuZ3RoVmFsaWRhdG9yIGxlbmd0aFZhbGlkYXRvciA9IChMZW5ndGhWYWxpZGF0b3IpZmFjZXNDb250ZXh0LmdldEFwcGxpY2F0aW9uKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVWYWxpZGF0b3IoImphdmF4LmZhY2VzLkxlbmd0aCIpOw0KLQ0KLSAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1pbmltdW0oYW5ub3RhdGlvbi5taW5pbXVtKCkpOw0KLSAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnNldE1heGltdW0oYW5ub3RhdGlvbi5tYXhpbXVtKCkpOw0KLQ0KLSAgICAgICAgbGVuZ3RoVmFsaWRhdG9yLnZhbGlkYXRlKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQsIGNvbnZlcnRlZE9iamVjdCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTG9uZ1JhbmdlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNTgyMDIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTG9uZ1JhbmdlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLkxvbmdSYW5nZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLkxvbmdSYW5nZVZhbGlkYXRvcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgTG9uZ1JhbmdlU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLQ0KLSAgICAgICAgTG9uZ1JhbmdlIGFubm90YXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFZhbHVlKExvbmdSYW5nZS5jbGFzcyk7DQotICAgICAgICBMb25nUmFuZ2VWYWxpZGF0b3IgbG9uZ1JhbmdlVmFsaWRhdG9yID0gKExvbmdSYW5nZVZhbGlkYXRvcilmYWNlc0NvbnRleHQuZ2V0QXBwbGljYXRpb24oKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVmFsaWRhdG9yKCJqYXZheC5mYWNlcy5Mb25nUmFuZ2UiKTsNCi0NCi0gICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvci5zZXRNaW5pbXVtKGFubm90YXRpb24ubWluaW11bSgpKTsNCi0gICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvci5zZXRNYXhpbXVtKGFubm90YXRpb24ubWF4aW11bSgpKTsNCi0NCi0gICAgICAgIGxvbmdSYW5nZVZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBjb252ZXJ0ZWRPYmplY3QpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUGF0dGVyblN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhM2Y0ZWYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUGF0dGVyblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5QYXR0ZXJuOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQYXR0ZXJuU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k8UGF0dGVybj4NCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFBhdHRlcm4gYW5ub3RhdGlvbiA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoUGF0dGVybi5jbGFzcyk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyBleHByZXNzaW9uIDogYW5ub3RhdGlvbi52YWx1ZSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4uY29tcGlsZShleHByZXNzaW9uKS5tYXRjaGVyKGNvbnZlcnRlZE9iamVjdC50b1N0cmluZygpKS5tYXRjaGVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG5ldyBGYWNlc01lc3NhZ2UoDQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiksDQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24pLnJlcGxhY2UoInswfSIsIGV4cHJlc3Npb24pKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KFBhdHRlcm4gYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUmVxdWlyZWRTdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUmVxdWlyZWRTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDllNGM3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlJlcXVpcmVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5hbm5vdGF0aW9uLlNraXBWYWxpZGF0aW9uU3VwcG9ydDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5leGNlcHRpb24uUmVxdWlyZWRWYWxpZGF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uTnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uRW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQE51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQEVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFJlcXVpcmVkU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uU3RyYXRlZ3k8UmVxdWlyZWQ+DQotew0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRmFjZXNCdW5kbGUgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICBVSUNvbXBvbmVudCB1aUNvbXBvbmVudCwgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LA0KLSAgICAgICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgaWYgKGNvbnZlcnRlZE9iamVjdCA9PSBudWxsIHx8IGNvbnZlcnRlZE9iamVjdC5lcXVhbHMoIiIpIHx8DQotICAgICAgICAgICAgICAgIChjb252ZXJ0ZWRPYmplY3QgaW5zdGFuY2VvZiBDb2xsZWN0aW9uICYmICgoQ29sbGVjdGlvbiljb252ZXJ0ZWRPYmplY3QpLmlzRW1wdHkoKSkgfHwNCi0gICAgICAgICAgICAgICAgKGNvbnZlcnRlZE9iamVjdCBpbnN0YW5jZW9mIE1hcCAmJiAoKE1hcCljb252ZXJ0ZWRPYmplY3QpLmlzRW1wdHkoKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJlcXVpcmVkVmFsaWRhdG9yRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgZ2V0VmFsaWRhdGlvbkVycm9yRmFjZXNNZXNzYWdlKG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoUmVxdWlyZWQuY2xhc3MpKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoUmVxdWlyZWQgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU1lc3NhZ2UoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHN1cGVyLnJlc29sdmVNZXNzYWdlKGtleSk7DQotICAgICAgICBTdHJpbmcgbWFya2VyID0gQWJzdHJhY3RWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuTUlTU0lOR19SRVNPVVJDRV9NQVJLRVI7DQotDQotICAgICAgICBpZigobWFya2VyICsga2V5ICsgbWFya2VyKS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnVzZUZhY2VzQnVuZGxlID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIGUpDQotICAgIHsNCi0gICAgICAgIGlmKHRoaXMudXNlRmFjZXNCdW5kbGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgRXh0VmFsVXRpbHMucmVwbGFjZVdpdGhEZWZhdWx0UmVxdWlyZWRNZXNzYWdlKGUuZ2V0RmFjZXNNZXNzYWdlKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QsIGUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1NraXBWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1NraXBWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRmMGQ4ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1ldGFkYXRhLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24uc3RyYXRlZ3kuVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLk51bGxWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLkVtcHR5VmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1ATnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1ARW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgU2tpcFZhbGlkYXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIFZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBTdHJpbmdbXSB2YWx1ZUJpbmRpbmdFeHByZXNzaW9ucyA9IG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoU2tpcFZhbGlkYXRpb24uY2xhc3MpLnZhbHVlKCk7DQotDQotICAgICAgICBmb3IoU3RyaW5nIHZhbHVlQmluZGluZ0V4cHJlc3Npb24gOiB2YWx1ZUJpbmRpbmdFeHByZXNzaW9ucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihCb29sZWFuLlRSVUUuZXF1YWxzKEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0VmFsdWVPZkV4cHJlc3Npb24oDQotICAgICAgICAgICAgICAgIGZhY2VzQ29udGV4dCwgbmV3IFZhbHVlQmluZGluZ0V4cHJlc3Npb24odmFsdWVCaW5kaW5nRXhwcmVzc2lvbikpKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIG1ldGFEYXRhRW50cnkuc2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuU0tJUF9WQUxJREFUSU9OLCB0cnVlKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9WYWxpZGF0b3JTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjNjYzkxLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuYmFzZXZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0VmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5DbGFzc1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIFZhbGlkYXRvclN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0KSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0NCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yPltdIHZhbGlkYXRvckNsYXNzZXMgPQ0KLSAgICAgICAgICAgIG1ldGFEYXRhRW50cnkuZ2V0VmFsdWUoVmFsaWRhdG9yLmNsYXNzKS52YWx1ZSgpOw0KLQ0KLSAgICAgICAgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvciB2YWxpZGF0b3I7DQotICAgICAgICBmb3IgKENsYXNzIHZhbGlkYXRvckNsYXNzTmFtZSA6IHZhbGlkYXRvckNsYXNzZXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdG9yID0gKGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3IpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgIC50cnlUb0luc3RhbnRpYXRlQ2xhc3ModmFsaWRhdG9yQ2xhc3NOYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAodmFsaWRhdG9yID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKHZhbGlkYXRvckNsYXNzTmFtZS5nZXROYW1lKCkgKyAiIG5vdCBmb3VuZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCwgY29udmVydGVkT2JqZWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0Nyb3NzVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY2YWM2MC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkpzZlV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneS5BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmFwcGxpY2F0aW9uLkZhY2VzTWVzc2FnZTsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VFdmVudDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VJZDsNCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuUGhhc2VMaXN0ZW5lcjsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuRmFjZXNFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIFRoaXMgcGhhc2UgbGlzdGVuZXIgcHJvY2Vzc2VzIGNyb3NzIHZhbGlkYXRpb24gYXMgc29vbiBhcyBpdCBmaW5kcyBhIHNwZWNpYWwgcmVxdWVzdCBzY29wZWQgc3RvcmFnZS48YnIvPg0KLSAqIFNvIGl0J3MgcG9zc2libGUgdG8gYWRkIGluZm9ybWF0aW9uIGR1cmluZyB0aGUgcHJvY2VzcyB2YWxpZGF0aW9uIHBoYXNlLiBBdCB0aGUgZW5kIG9mIHRoaXMgcGhhc2UgaXQgZ2V0cyBwcm9jZXNzZWQuDQotICogQWZ0ZXIgdGhhdCB0aGUgc3RvcmFnZSBnZXRzIHJlc2V0ZWQuPHAvPg0KLSAqIElmIHlvdSBwcm92aWRlIGEgY3VzdG9tIGV4dGVuc2lvbiBhbmQgeW91IGFkZCB0aGUgc2FtZSBzdG9yYWdlIHR5cGUgd2l0aGluIGEgZGlmZmVyZW50IHBoYXNlLA0KLSAqIGl0IGFsc28gZ2V0cyBwcm9jZXNzZWQgYXQgdGhlIGVuZCBvZiB0aGF0IHBoYXNlLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lciBpbXBsZW1lbnRzIFBoYXNlTGlzdGVuZXINCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MzMzNDA1ODk3NjM1NzQyNzMyTDsNCi0NCi0gICAgcHVibGljIHZvaWQgYWZ0ZXJQaGFzZShQaGFzZUV2ZW50IGV2ZW50KQ0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UgPSBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCk7DQotICAgICAgICAgICAgZm9yIChDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkgOiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYoIUV4dFZhbFV0aWxzLmV4ZWN1dGVHbG9iYWxCZWZvcmVWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldENvbXBvbmVudCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmNsYXNzLmdldE5hbWUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5jbGFzcykpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAvL2NhbGwgaW5pdC1tZXRob2QNCi0gICAgICAgICAgICAgICAgICAgIGlmKGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpIGluc3RhbmNlb2YgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uVXRpbHMudHJ5VG9JbnZva2VNZXRob2QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJveHlVdGlscy5nZXRVbnByb3hpZWRDbGFzcyhlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKS5nZXRDbGFzcygpKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluaXRDcm9zc1ZhbGlkYXRpb24iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuY2xhc3MpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgICAgICAgICAqIHZhbGlkYXRpb24NCi0gICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkucHJvY2Vzc0Nyb3NzVmFsaWRhdGlvbihlbnRyeSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFZhbGlkYXRvckV4Y2VwdGlvbiB2YWxpZGF0b3JFeGNlcHRpb24pDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWRkTWVzc2FnZSA9IHRydWU7DQotDQotICAgICAgICAgICAgICAgICAgICBpZihlbnRyeS5nZXRWYWxpZGF0aW9uU3RyYXRlZ3koKSBpbnN0YW5jZW9mIEFic3RyYWN0Q3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRNZXNzYWdlID0gKEJvb2xlYW4pUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbGlkYXRpb25TdHJhdGVneSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3MoZW50cnkuZ2V0VmFsaWRhdGlvblN0cmF0ZWd5KCkuZ2V0Q2xhc3MoKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmNsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yRXhjZXB0aW9uLmdldENsYXNzKCkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvckV4Y2VwdGlvbik7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGYWNlc0V4Y2VwdGlvbihlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBpZihhZGRNZXNzYWdlKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBmYWNlc01lc3NhZ2UgPSB2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhY2VzTWVzc2FnZSAhPSBudWxsICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlc01lc3NhZ2UuZ2V0U3VtbWFyeSgpICE9IG51bGwgJiYgZmFjZXNNZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb0FkZFZpb2xhdGlvbk1lc3NhZ2VGb3JDb21wb25lbnRJZChlbnRyeS5nZXRDbGllbnRJZCgpLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb0Jsb2Nrc05hdmlnYXRpb25Gb3JDb21wb25lbnRJZChlbnRyeS5nZXRDbGllbnRJZCgpLCBmYWNlc01lc3NhZ2UpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGZpbmFsbHkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuZXhlY3V0ZUdsb2JhbEFmdGVyVmFsaWRhdGlvbkludGVyY2VwdG9ycygNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRDb21wb25lbnQoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0Q29udmVydGVkT2JqZWN0KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5jbGFzcy5nZXROYW1lKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuY2xhc3MpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluYWxseQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLnJlc2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVBoYXNlKFBoYXNlRXZlbnQgZXZlbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNJbml0aWFsaXplZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoV2ViWG1sUGFyYW1ldGVyLkRFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OICE9IG51bGwNCi0gICAgICAgICAgICAgICAgICAgICYmIFdlYlhtbFBhcmFtZXRlci5ERUFDVElWQVRFX0NST1NTVkFMSURBVElPTi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBKc2ZVdGlscy5kZXJlZ2lzdGVyUGhhc2VMaXN0ZW5lcih0aGlzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQaGFzZUlkIGdldFBoYXNlSWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gUGhhc2VJZC5BTllfUEhBU0U7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykNCi0gICAgew0KLSAgICAgICAgaWYgKHRoaXMgPT0gbykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBDcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM0MDI3OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLldlYlhtbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogY2VudHJhbGl6ZWQgaW4gb3JkZXIgdGhhdCB0aGVzZSBpbmZvcm1hdGlvbiBhcm4ndCBzcHJlYWQgb3ZlciB0aGUgY29tcGxldGUgY29kZSBiYXNlDQotICoNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViWG1sUGFyYW1ldGVyDQotew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQUNUSVZBVEVfQ1JPU1NWQUxJREFUSU9OID0gV2ViWG1sVXRpbHMNCi0gICAgICAgICAgICAuZ2V0SW5pdFBhcmFtZXRlcigiREVBQ1RJVkFURV9DUk9TU1ZBTElEQVRJT04iKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0ZDJhNC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQ0KLUBSZXRlbnRpb24oUlVOVElNRSkNCi1ARG9jdW1lbnRlZA0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBAaW50ZXJmYWNlIERhdGVJcw0KLXsNCi0gICAgU3RyaW5nW10gdmFsdWVPZigpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBvcHRpb25hbCBzZWN0aW9uDQotICAgICAqLw0KLQ0KLSAgICBEYXRlSXNUeXBlIHR5cGUoKSBkZWZhdWx0IERhdGVJc1R5cGUuc2FtZTsNCi0NCi0gICAgU3RyaW5nIHZhbGlkYXRpb25FcnJvck1zZ0tleSgpIGRlZmF1bHQgIiI7DQotDQotICAgIFN0cmluZyBub3RCZWZvcmVFcnJvck1zZ0tleSgpIGRlZmF1bHQgIndyb25nX2RhdGVfbm90X2JlZm9yZSI7DQotDQotICAgIFN0cmluZyBub3RBZnRlckVycm9yTXNnS2V5KCkgZGVmYXVsdCAid3JvbmdfZGF0ZV9ub3RfYWZ0ZXIiOw0KLQ0KLSAgICBTdHJpbmcgbm90RXF1YWxFcnJvck1zZ0tleSgpIGRlZmF1bHQgIndyb25nX2RhdGVfbm90X2VxdWFsIjsNCi0NCi0gICAgaW50IGVycm9yTWVzc2FnZURhdGVTdHlsZSgpIGRlZmF1bHQgRGF0ZUZvcm1hdC5NRURJVU07DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNWY0ODIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAiYmVmb3JlT3JTYW1lLCBhZnRlck9yU2FtZSIpDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGVudW0gRGF0ZUlzVHlwZQ0KLXsNCi0gICAgYmVmb3JlLCBhZnRlciwgc2FtZQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0VxdWFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmU3NmI3Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0VxdWFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBFcXVhbHMNCi17DQotICAgIFN0cmluZ1tdIHZhbHVlKCk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJkdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQiOw0KLQ0KLSAgICBDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblBhcmFtZXRlcj5bXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCBWaW9sYXRpb25TZXZlcml0eS5FcnJvci5jbGFzczsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9Ob3RFcXVhbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI3YmM0NC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9Ob3RFcXVhbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZhbGlkYXRpb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ucGFyYW1ldGVyLlZpb2xhdGlvblNldmVyaXR5Ow0KLQ0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7DQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pDQotQFJldGVudGlvbihSVU5USU1FKQ0KLUBEb2N1bWVudGVkDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIEBpbnRlcmZhY2UgTm90RXF1YWxzDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZSgpOw0KLQ0KLSAgICBTdHJpbmcgdmFsaWRhdGlvbkVycm9yTXNnS2V5KCkgZGVmYXVsdCAiZHVwbGljYXRlZF9jb250ZW50X2RlbmllZCI7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NWRiMjQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmFsaWRhdGlvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5wYXJhbWV0ZXIuVmlvbGF0aW9uU2V2ZXJpdHk7DQotDQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsNCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOw0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkNCi1AUmV0ZW50aW9uKFJVTlRJTUUpDQotQERvY3VtZW50ZWQNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgQGludGVyZmFjZSBSZXF1aXJlZElmDQotew0KLSAgICBTdHJpbmdbXSB2YWx1ZU9mKCk7DQotDQotICAgIC8qDQotICAgICAqIG9wdGlvbmFsIHNlY3Rpb24NCi0gICAgICovDQotDQotICAgIFJlcXVpcmVkSWZUeXBlIGlzKCkgZGVmYXVsdCBSZXF1aXJlZElmVHlwZS5ub3RfZW1wdHk7DQotDQotICAgIFN0cmluZyB2YWxpZGF0aW9uRXJyb3JNc2dLZXkoKSBkZWZhdWx0ICJlbXB0eV9maWVsZCI7DQotDQotICAgIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUGFyYW1ldGVyPltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IFZpb2xhdGlvblNldmVyaXR5LkVycm9yLmNsYXNzOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmVHlwZS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFjNThkOS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LkFQSSkNCi1wdWJsaWMgZW51bSBSZXF1aXJlZElmVHlwZQ0KLXsNCi0gICAgZW1wdHksIG5vdF9lbXB0eQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2MDc1OS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1JbnB1dCBpcyBkaWZmZXJlbnQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUlucHV0IGlzIGRpZmZlcmVudA0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9U2FtZSBpbnB1dCBpc24ndCBhbGxvd2VkDQotDQotd3JvbmdfZGF0ZT1Xcm9uZyBkYXRlDQotd3JvbmdfZGF0ZV9kZXRhaWw9V3JvbmcgZGF0ZQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGFmdGVyIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9RGF0ZSBoYXMgdG8gYmUgYmVmb3JlIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPURhdGUgaXNuJ3QgZXF1YWwgdG8gezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcyBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZjkzYzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9XHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0IFx1MDY0NVx1MDYyZVx1MDYyYVx1MDY0NFx1MDY0MQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0IFx1MDY0NVx1MDYyZVx1MDYyYVx1MDY0NFx1MDY0MQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9XHUwNjNhXHUwNjRhXHUwNjMxIFx1MDY0NVx1MDYzM1x1MDY0NVx1MDY0OFx1MDYyZCBcdTA2MjhcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgXHUwNjQ2IFx1MDY0MVx1MDYzMyBcdTA2NDJcdTA2NGFcdTA2NDVcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0DQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9XHUwNjNhXHUwNjRhXHUwNjMxIFx1MDY0NVx1MDYzM1x1MDY0NVx1MDY0OFx1MDYyZCBcdTA2MjhcdTA2MjVcdTA2MmZcdTA2MmVcdTA2MjdcdTA2NDQgIFx1MDY0Nlx1MDY0MVx1MDYzMyBcdTA2NDJcdTA2NGFcdTA2NDVcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjJmXHUwNjJlXHUwNjI3XHUwNjQ0DQotDQotd3JvbmdfZGF0ZT1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjJlXHUwNjI3XHUwNjM3XHUwNjQ5XHUwNjIxDQotd3JvbmdfZGF0ZV9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDYyZVx1MDYyN1x1MDYzN1x1MDY0OVx1MDYyMQ0KLQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDNcdTA2NDggXHUwNjQ2IFx1MDYyOFx1MDYzOVx1MDYyZiB7MH0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0MyBcdTA2NDhcdTA2NDYgXHUwNjI4XHUwNjM5XHUwNjJmIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPVx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyZSBcdTA2NGFcdTA2MmNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0YVx1MDY0M1x1MDY0OCBcdTA2NDYgXHUwNjQyXHUwNjI4XHUwNjQ0IHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjRhXHUwNjJjXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NGFcdTA2NDMgXHUwNjQ4XHUwNjQ2IFx1MDY0Mlx1MDYyOFx1MDY0NCB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1cdTA2MjdcdTA2NDRcdTA2MmFcdTA2MjdcdTA2MzFcdTA2NGFcdTA2MmUgXHUwNjQ0XHUwNjI3IFx1MDY0YVx1MDYzM1x1MDYyN1x1MDY0OFx1MDY0OSB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9XHUwNjI3XHUwNjQ0XHUwNjJhXHUwNjI3XHUwNjMxXHUwNjRhXHUwNjJlIFx1MDY0NFx1MDYyNyBcdTA2NGFcdTA2MzNcdTA2MjdcdTA2NDhcdTA2NDkgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcyBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NTRlZDIuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPWVsIHZhbG9yIFx1MDBlOSBkaWZlcmVudAotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1lbCB2YWxvciBcdTAwZTkgZGlmZXJlbnQKLQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1ubyBlcyBwZXJtZXQgZWwgbWF0ZWl4IHZhbG9yCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1ubyBlcyBwZXJtZXQgZWwgbWF0ZWl4IHZhbG9yCi0KLXdyb25nX2RhdGU9ZGF0YSBlcnJcdTAwZjJuaWEKLXdyb25nX2RhdGVfZGV0YWlsPWRhdGEgZXJyXHUwMGYybmlhCi0KLXdyb25nX2RhdGVfbm90X2JlZm9yZT1sYSBkYXRhIGhhIGRlIHNlciBwb3N0ZXJpb3IgYSB7MH0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9bGEgZGF0YSBoYSBkZSBzZXIgcG9zdGVyaW9yIGEgezB9Ci0KLXdyb25nX2RhdGVfbm90X2FmdGVyPWxhIGRhdGEgaGEgZGUgc2VyIGFudGVyaW9yIGEgezB9Ci13cm9uZ19kYXRlX25vdF9hZnRlcl9kZXRhaWw9bGEgZGF0YSBoYSBkZSBzZXIgcG9zdGVyaW9yIGEgezB9Ci0KLXdyb25nX2RhdGVfbm90X2VxdWFsPWxhIGRhdGEgbm8gXHUwMDBlOXMgaWd1YWwgYSB7MH0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1sYSBkYXRhIG5vIFx1MDAwZTlzIGlndWFsIGEgezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcyBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkODcyMzQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9RWluZ2FiZSBpc3QgdW50ZXJzY2hpZWRsaWNoDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1FaW5nYWJlIGlzdCB1bnRlcnNjaGllZGxpY2gNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPURlciBnbGVpY2hlIFdlcnQgaXN0IG5pY2h0IGVybGF1YnQNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1EZXIgZ2xlaWNoZSBXZXJ0IGlzdCBuaWNodCBlcmxhdWJ0DQotDQotd3JvbmdfZGF0ZT1EYXR1bSBpbmtvcnJla3QNCi13cm9uZ19kYXRlX2RldGFpbD1EYXR1bSBpbmtvcnJla3QNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9RGFzIERhdHVtIG11c3MgbmFjaCBkZW0gezB9IHNlaW4NCi13cm9uZ19kYXRlX25vdF9iZWZvcmVfZGV0YWlsPURhcyBEYXR1bSBtdXNzIG5hY2ggZGVtIHswfSBzZWluDQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9RGFzIERhdHVtIG11c3Mgdm9yIGRlbSB7MH0gc2Vpbg0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1EYXMgRGF0dW0gbXVzcyB2b3IgZGVtIHswfSBzZWluDQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9RGFzIERhdHVtIGVudHNwcmljaHQgbmljaHQgZGVtIHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1EYXMgRGF0dW0gZW50c3ByaWNodCBuaWNodCBkZW0gezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcyBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNjA3NTkuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9SW5wdXQgaXMgZGlmZmVyZW50DQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1JbnB1dCBpcyBkaWZmZXJlbnQNCi0NCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPVNhbWUgaW5wdXQgaXNuJ3QgYWxsb3dlZA0KLQ0KLXdyb25nX2RhdGU9V3JvbmcgZGF0ZQ0KLXdyb25nX2RhdGVfZGV0YWlsPVdyb25nIGRhdGUNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9RGF0ZSBoYXMgdG8gYmUgYWZ0ZXIgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1EYXRlIGhhcyB0byBiZSBhZnRlciB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9hZnRlcj1EYXRlIGhhcyB0byBiZSBiZWZvcmUgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPURhdGUgaGFzIHRvIGJlIGJlZm9yZSB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQ0KLXdyb25nX2RhdGVfbm90X2VxdWFsX2RldGFpbD1EYXRlIGlzbid0IGVxdWFsIHRvIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGE5MTcwLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPWxhIGVudHJhZGEgZXMgZGlmZXJlbnRlDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkX2RldGFpbD1sYSBlbnRyYWRhIGVzIGRpZmVyZW50ZQ0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9bm8gc2UgcGVybWl0ZW4gZW50cmFkYXMgaWd1YWxlcw0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWRfZGV0YWlsPW5vIHNlIHBlcm1pdGVuIGVudHJhZGFzIGlndWFsZXMNCi0NCi13cm9uZ19kYXRlPWZlY2hhIGVxdWl2b2NhZGENCi13cm9uZ19kYXRlX2RldGFpbD1mZWNoYSBlcXVpdm9jYWRhDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgbHVlZ28gZGUgezB9DQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlX2RldGFpbD1sYSBmZWNoYSB0aWVuZSBxdWUgc2VyIGx1ZWdvIGRlIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgYW50ZXMgZGUgezB9DQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPWxhIGZlY2hhIHRpZW5lIHF1ZSBzZXIgYW50ZXMgZGUgezB9DQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9bGEgZmVjaGEgbm8gZXMgaWd1YWwgYSB7MH0NCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9bGEgZmVjaGEgbm8gZXMgaWd1YWwgYSB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmMDIxOC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZD1MZXMgY2hhbXBzIHNvbnQgZGlmZiZlYWN1dGU7cmVudHMNCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWRfZGV0YWlsPUxlcyBjaGFtcHMgc29udCBkaWZmJmVhY3V0ZTtyZW50cw0KLQ0KLWR1cGxpY2F0ZWRfY29udGVudF9kZW5pZWQ9TGVzIGNoYW1wcyBkb2l2ZW50ICZlY2lyYzt0cmUgZGlmZiZlYWN1dGU7cmVudHMNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1MZXMgY2hhbXBzIGRvaXZlbnQgJmVjaXJjO3RyZSBkaWZmJmVhY3V0ZTtyZW50cw0KLQ0KLXdyb25nX2RhdGU9TGEgZGF0ZSBlc3QgaW5jb3JyZWN0ZQ0KLXdyb25nX2RhdGVfZGV0YWlsPUxhIGRhdGUgZXN0IGluY29ycmVjdGUNCi0NCi13cm9uZ19kYXRlX25vdF9iZWZvcmU9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXByJmVncmF2ZTtzIHswfQ0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9TGEgZGF0ZSBkb2l0ICZlY2lyYzt0cmUgYXByJmVncmF2ZTtzIHswfQ0KLQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyPUxhIGRhdGUgZG9pdCAmZWNpcmM7dHJlIGF2YW50IHswfQ0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD1MYSBkYXRlIGRvaXQgJmVjaXJjO3RyZSBhdmFudCB7MH0NCi0NCi13cm9uZ19kYXRlX25vdF9lcXVhbD1MYSBkYXRlIG4nZXN0IHBhcyAmZWFjdXRlO2dhbGUgJmFncmF2ZTsgezB9DQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPUxhIGRhdGUgbidlc3QgcGFzICZlYWN1dGU7Z2FsZSAmYWdyYXZlOyB7MH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA0MjgwMS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1kdXBsaWNhdGVkX2NvbnRlbnRfcmVxdWlyZWQ9VmFsb3JpIG5vbiB1Z3VhbGkKLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9SSB2YWxvcmkgaW5zZXJpdGkgbm9uIGNvaW5jaWRvbm8KLQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1MbyBzdGVzc28gdmFsb3JlIG5vbiAmZWdyYXZlOyBwZXJtZXNzbwotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZF9kZXRhaWw9TG8gc3Rlc3NvIHZhbG9yZSBub24gJmVncmF2ZTsgcGVybWVzc28KLQotd3JvbmdfZGF0ZT1EYXRhIGVycmF0YQotd3JvbmdfZGF0ZV9kZXRhaWw9RGF0YSBlcnJhdGEKLQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPUxhIGRhdGEgZGV2ZSBlc3NlcmUgZG9wbyBkaSB7MH0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9TGEgZGF0YSBkZXZlIGVzc2VyZSBkb3BvIGRpIHswfQotCi13cm9uZ19kYXRlX25vdF9hZnRlcj1MYSBkYXRhIGRldmUgZXNzZXJlIHByaW1hIGRpIHswfQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXJfZGV0YWlsPUxhIGRhdGEgZGV2ZSBlc3NlcmUgcHJpbWEgZGkgezB9Ci0KLXdyb25nX2RhdGVfbm90X2VxdWFsPUxhIGRhdGEgbm9uICZlZ3JhdmU7IHVndWFsZSBhIHswfQotd3JvbmdfZGF0ZV9ub3RfZXF1YWxfZGV0YWlsPUxhIGRhdGEgbm9uICZlZ3JhdmU7IHVndWFsZSBhIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWY2YTlkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotDQotZHVwbGljYXRlZF9jb250ZW50X3JlcXVpcmVkPWdpcmlsZW4gZGVcdTAxMWZlciBmYXJrbFx1MDEzMQ0KLWR1cGxpY2F0ZWRfY29udGVudF9yZXF1aXJlZF9kZXRhaWw9Z2lyaWxlbiBkZVx1MDExZmVyIGZhcmtsXHUwMTMxDQotDQotZHVwbGljYXRlZF9jb250ZW50X2RlbmllZD1heW5cdTAxMzEgZGVcdTAxMWZlciBnaXJpbGVtZXoNCi1kdXBsaWNhdGVkX2NvbnRlbnRfZGVuaWVkX2RldGFpbD1heW5cdTAxMzEgZGVcdTAxMWZlciBnaXJpbGVtZXoNCi0NCi13cm9uZ19kYXRlPXlhbmxcdTAxMzFcdTAxNWYgdGFyaWgNCi13cm9uZ19kYXRlX2RldGFpbD15YW5sXHUwMTMxXHUwMTVmIHRhcmloDQotDQotd3JvbmdfZGF0ZV9ub3RfYmVmb3JlPXRhcmloIHswfSBkZVx1MDExZmVyaW5kZW4gc29ucmEgb2xtYWxcdTAxMzFkXHUwMTMxcg0KLXdyb25nX2RhdGVfbm90X2JlZm9yZV9kZXRhaWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBzb25yYSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotDQotd3JvbmdfZGF0ZV9ub3RfYWZ0ZXI9dGFyaWggezB9IGRlXHUwMTFmZXJpbmRlbiBcdTAwZjZuY2Ugb2xtYWxcdTAxMzFkXHUwMTMxcg0KLXdyb25nX2RhdGVfbm90X2FmdGVyX2RldGFpbD10YXJpaCB7MH0gZGVcdTAxMWZlcmluZGVuIFx1MDBmNm5jZSBvbG1hbFx1MDEzMWRcdTAxMzFyDQotDQotd3JvbmdfZGF0ZV9ub3RfZXF1YWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmUgZVx1MDE1Zml0IGRlXHUwMTFmaWwNCi13cm9uZ19kYXRlX25vdF9lcXVhbF9kZXRhaWw9dGFyaWggezB9IGRlXHUwMTFmZXJpbmUgZVx1MDE1Zml0IGRlXHUwMTFmaWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNzY1OWUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLm1lc3NhZ2UucmVzb2x2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyDQotICAgICAgICBleHRlbmRzDQotICAgICAgICBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLm1lc3NhZ2UucmVzb2x2ZXIuRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcg0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZU5hbWUoKQ0KLSAgICB7DQotICAgICAgICBpZiAoYmFzZU5hbWUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBiYXNlTmFtZSA9IHN1cGVyLmdldEJhc2VOYW1lKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gYmFzZU5hbWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlY29yZGVyL0Nyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcmVjb3JkZXIvQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzYjA4ZC4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcmVjb3JkZXIvQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5yZWNvcmRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucmVjb3JkZXIuUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlEZXRhaWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuRWRpdGFibGVWYWx1ZUhvbGRlcjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyIGltcGxlbWVudHMgUHJvY2Vzc2VkSW5mb3JtYXRpb25SZWNvcmRlcg0KLXsNCi0gICAgcHVibGljIHZvaWQgcmVjb3JkVXNlcklucHV0KFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBPYmplY3QgdmFsdWUpDQotICAgIHsNCi0gICAgICAgIGlmICghKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRWRpdGFibGVWYWx1ZUhvbGRlcikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy90byBzdXBwb3J0IGxvY2FsIGNyb3NzLXZhbGlkYXRpb24gKHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkpDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlID0gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMNCi0gICAgICAgICAgICAuZ2V0T3JJbml0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlKCk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSBlbnRyeTsNCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPQ0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0UHJvcGVydHlEZXRhaWxzT2ZWYWx1ZUJpbmRpbmcodWlDb21wb25lbnQpOw0KLQ0KLSAgICAgICAgaWYocHJvcGVydHlEZXRhaWxzID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBlbnRyeSA9IG5ldyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSgpOw0KLSAgICAgICAgZW50cnkuc2V0QmVhbihwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpKTsNCi0gICAgICAgIGVudHJ5LnNldENvbnZlcnRlZFZhbHVlKHZhbHVlKTsNCi0gICAgICAgIGVudHJ5LnNldENvbXBvbmVudCh1aUNvbXBvbmVudCk7DQotICAgICAgICBlbnRyeS5zZXRDbGllbnRJZCh1aUNvbXBvbmVudC5nZXRDbGllbnRJZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkpKTsNCi0NCi0gICAgICAgIFN0cmluZyBrZXkgPSBwcm9wZXJ0eURldGFpbHMuZ2V0S2V5KCk7DQotDQotICAgICAgICAvL2ZvciBsb2NhbCBjcm9zcy12YWxpZGF0aW9uDQotICAgICAgICBpZiAocHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNvbnRhaW5zRW50cnkoa2V5KSAmJg0KLSAgICAgICAgICAgIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5nZXRFbnRyeShrZXkpLmdldEJlYW4oKSAhPSBudWxsICYmDQotICAgICAgICAgICAgIXByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5nZXRFbnRyeShrZXkpLmdldEJlYW4oKS5lcXVhbHMoZW50cnkuZ2V0QmVhbigpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL2ZvciB0aGUgdmFsaWRhdGlvbiB3aXRoaW4gYSBjb21wbGV4IGNvbXBvbmVudCBlLmcuIGEgdGFibGUNCi0gICAgICAgICAgICAvL2Rvbid0IG92ZXJyaWRlIGV4aXN0aW5nIGV4cHJlc3Npb24gKHN0eWxlOiAje2VudHJ5LnByb3BlcnR5fSkgLSBtYWtlIGEgc3BlY2lhbCBtYXBwaW5nDQotDQotICAgICAgICAgICAgTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4gZnVydGhlckVudHJpZXMgPQ0KLSAgICAgICAgICAgICAgICBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkoa2V5KS5nZXRGdXJ0aGVyRW50cmllcygpOw0KLQ0KLSAgICAgICAgICAgIGlmIChmdXJ0aGVyRW50cmllcyA9PSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZnVydGhlckVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5PigpOw0KLQ0KLSAgICAgICAgICAgICAgICBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuZ2V0RW50cnkoa2V5KS5zZXRGdXJ0aGVyRW50cmllcyhmdXJ0aGVyRW50cmllcyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZ1cnRoZXJFbnRyaWVzLmFkZChlbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9mb3Igbm9ybWFsIHZhbGlkYXRpb24NCi0gICAgICAgICAgICBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2Uuc2V0RW50cnkoa2V5LCBlbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDlmYWQ2Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIG5vcm1hbGx5IGl0IHNob3VsZCBiZSBpbiB0aGUgc3RvcmFnZSBwYWNrYWdlIC0gZHVlIHRvIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaXQgaXNuJ3QgdGhlIGNhc2UNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgdm9pZCBhZGQoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5KTsNCi0NCi0gICAgTGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+IGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOWUxZTcuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5LkNyb3NzVmFsaWRhdGlvblN0cmF0ZWd5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsNCi0NCi0vKioNCi0gKiBub3JtYWxseSBpdCBzaG91bGQgYmUgaW4gdGhlIHN0b3JhZ2UgcGFja2FnZSAtIGR1ZSB0byBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGl0IGlzbid0IHRoZSBjYXNlDQotICogDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5BUEkpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeQ0KLXsNCi0gICAgcHJpdmF0ZSBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnk7DQotICAgIC8vZm9yIGNvbXBsZXggY29tcG9uZW50cyAoZS5nLiBhIHRhYmxlKSBzdG9yZXMgdGhlIG9iamVjdCBvZiBlbnRyeSAoI3tlbnRyeS5wcm9wZXJ0eX0pDQotICAgIHByaXZhdGUgVUlDb21wb25lbnQgY29tcG9uZW50Ow0KLSAgICBwcml2YXRlIE9iamVjdCBjb252ZXJ0ZWRPYmplY3Q7DQotICAgIHByaXZhdGUgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICAvL2p1c3QgZm9yIGlucHV0IGNvbXBvbmVudHMgd2l0aGluIGNvbXBsZXggY29tcG9uZW50cyBlLmcuIGRhdGFUYWJsZSwuLi4NCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50SWQ7DQotDQotICAgIHB1YmxpYyBNZXRhRGF0YUVudHJ5IGdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gbWV0YURhdGFFbnRyeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhRGF0YUVudHJ5KE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5tZXRhRGF0YUVudHJ5ID0gbWV0YURhdGFFbnRyeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVUlDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnQoVUlDb21wb25lbnQgY29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldENvbnZlcnRlZE9iamVjdCgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkT2JqZWN0KE9iamVjdCBjb252ZXJ0ZWRPYmplY3QpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY29udmVydGVkT2JqZWN0ID0gY29udmVydGVkT2JqZWN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSBnZXRWYWxpZGF0aW9uU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25TdHJhdGVneShDcm9zc1ZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsaWRhdGlvblN0cmF0ZWd5ID0gdmFsaWRhdGlvblN0cmF0ZWd5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gY2xpZW50SWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50SWQoU3RyaW5nIGNsaWVudElkKQ0KLSAgICB7DQotICAgICAgICB0aGlzLmNsaWVudElkID0gY2xpZW50SWQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMTBhM2IuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGltcGxlbWVudHMgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZQ0KLXsNCi0gICAgcHJpdmF0ZSBMaXN0PENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeT4gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMgPQ0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+KCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZChDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJpZXMuYWRkKGVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk+IGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzKExpc3Q8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5PiBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcykNCi0gICAgew0KLSAgICAgICAgdGhpcy5jcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cmllcyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyaWVzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNDFjOTVkLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnN0b3JhZ2UuQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBjcm9zcy12YWxpZGF0aW9uIGVudHJpZXMNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXINCi0gICAgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI8Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZT4NCi17DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZU1hbmFnZXJLZXkoKQ0KLSAgICB7DQotICAgICAgICAvL2ZvciBiZXR0ZXIgYmFja3dhcmQgY29tcGF0aWJpbGl0eQ0KLSAgICAgICAgcmV0dXJuIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI4ZTE4Ny4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlIGltcGxlbWVudHMgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlDQotew0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5PiBwcm9jZXNzZWRJbmZvcm1hdGlvbk1hcCA9DQotICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5PigpOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnRyeShTdHJpbmcga2V5LCBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSBlbnRyeSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5wcm9jZXNzZWRJbmZvcm1hdGlvbk1hcC5wdXQoa2V5LCBlbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNFbnRyeShTdHJpbmcga2V5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gcHJvY2Vzc2VkSW5mb3JtYXRpb25NYXAuY29udGFpbnNLZXkoa2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgZ2V0RW50cnkoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEluZm9ybWF0aW9uTWFwLmdldChrZXkpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjE4MmM4Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuc3RvcmFnZS5BYnN0cmFjdFJlcXVlc3RTY29wZUF3YXJlU3RvcmFnZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLQ0KLS8qKg0KLSAqIGRlZmF1bHQgc3RvcmFnZS1tYW5hZ2VyIGZvciBwcm9jZXNzZWQgaW5mb3JtYXRpb24gZW50cmllcw0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIERlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyDQotICAgIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0U2NvcGVBd2FyZVN0b3JhZ2VNYW5hZ2VyPENyb3NzVmFsaWRhdGlvblN0b3JhZ2U+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VNYW5hZ2VyS2V5KCkNCi0gICAgew0KLSAgICAgICAgLy9mb3IgYmV0dGVyIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkNCi0gICAgICAgIHJldHVybiBDcm9zc1ZhbGlkYXRpb25VdGlscy5jbGFzcy5nZXROYW1lKCk7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBiMTU2ZS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5LklOVEVSTkFMOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSB4LnguMw0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKElOVEVSTkFMKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlDQotew0KLSAgICB2b2lkIHNldEVudHJ5KFN0cmluZyBrZXksIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5KTsNCi0NCi0gICAgYm9vbGVhbiBjb250YWluc0VudHJ5KFN0cmluZyBrZXkpOw0KLQ0KLSAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSBnZXRFbnRyeShTdHJpbmcga2V5KTsNCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZjc4OWMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogSW4gb3JkZXIgdG8gYnVpbGQgdXAgYSBtYXBwaW5nIHdoaWNoIGlzIHVzZWQgZm9yIGNyb3NzLXZhbGlkYXRpb24uCi0gKgotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrCi0gKiBAc2luY2UgMS54LjEKLSAqLwotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkKLXB1YmxpYyBjbGFzcyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeQotewotICAgIHByaXZhdGUgT2JqZWN0IGJlYW47Ci0gICAgcHJpdmF0ZSBPYmplY3QgY29udmVydGVkVmFsdWU7Ci0gICAgcHJpdmF0ZSBVSUNvbXBvbmVudCBjb21wb25lbnQ7Ci0gICAgLy9mb3IgY29tcGxleCBjb21wb25lbnRzIChlLmcuIGEgdGFibGUgdGhlcmUgYXJlIG11bHRpcGxlIGVudHJpZXMgd2l0aAotICAgIC8vdGhlIHNhbWUga2V5IChoZXJlIHRoZSBlbCBleHByZXNzaW9uICN7ZW50cnkucHJvcGVydHl9KQotICAgIC8vaG93ZXZlciwgZG9uJ3Qgb3ZlcnJpZGUgdGhlIHByZXZpb3VzIGVudHJ5IC0gdGhleSBhcm4ndCB0aGUgc2FtZTsKLSAgICBwcml2YXRlIExpc3Q8UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnk+IGZ1cnRoZXJFbnRyaWVzOwotICAgIC8vanVzdCBmb3IgaW5wdXQgY29tcG9uZW50cyB3aXRoaW4gY29tcGxleCBjb21wb25lbnRzIGUuZy4gZGF0YVRhYmxlLC4uLgotICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudElkOwotCi0gICAgLyoKLSAgICAgKiBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmVhbihPYmplY3QgYmVhbikKLSAgICB7Ci0gICAgICAgIHRoaXMuYmVhbiA9IGJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRDb252ZXJ0ZWRWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udmVydGVkVmFsdWUoT2JqZWN0IGNvbnZlcnRlZFZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy5jb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRlZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBVSUNvbXBvbmVudCBnZXRDb21wb25lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnQoVUlDb21wb25lbnQgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gY2xpZW50SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50SWQoU3RyaW5nIGNsaWVudElkKQotICAgIHsKLSAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5PiBnZXRGdXJ0aGVyRW50cmllcygpCi0gICAgewotICAgICAgICByZXR1cm4gZnVydGhlckVudHJpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RnVydGhlckVudHJpZXMoTGlzdDxQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeT4gZnVydGhlckVudHJpZXMpCi0gICAgewotICAgICAgICB0aGlzLmZ1cnRoZXJFbnRyaWVzID0gZnVydGhlckVudHJpZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvbWFwcGVyL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlYmYzYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLm1hcHBlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWFwcGVyLk5hbWVNYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLkludm9jYXRpb25PcmRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIHgueC4zDQotICovDQotQEludm9jYXRpb25PcmRlcigyMDApDQotQFVzYWdlSW5mb3JtYXRpb24oSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyIGltcGxlbWVudHMgTmFtZU1hcHBlcjxTdHJpbmc+DQotew0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5hbWUoU3RyaW5nIGtleSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoa2V5KSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkgOiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL21hcHBlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODc1MzAzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL21hcHBlci9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5tYXBwZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnkuSU5URVJOQUw7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLm1hcHBlci5OYW1lTWFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5JbnZvY2F0aW9uT3JkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgeC54LjMNCi0gKi8NCi1ASW52b2NhdGlvbk9yZGVyKDIwMCkNCi1AVXNhZ2VJbmZvcm1hdGlvbihJTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlciBpbXBsZW1lbnRzIE5hbWVNYXBwZXI8U3RyaW5nPg0KLXsNCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVOYW1lKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoa2V5KSkgPw0KLSAgICAgICAgICAgICAgICBEZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLmdldE5hbWUoKSA6IG51bGw7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q29tcGFyZVN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMwMjAyYi4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuYXBwbGljYXRpb24uRmFjZXNNZXNzYWdlOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNsYXNzVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5FeHRWYWxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5DdXN0b21JbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3k8QSBleHRlbmRzIEFubm90YXRpb24+IGV4dGVuZHMgQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneQ0KLXsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBMaXN0PFJlZmVyZW5jaW5nU3RyYXRlZ3k+IHJlZmVyZW5jaW5nU3RyYXRlZ2llczsNCi0gICAgcHJvdGVjdGVkIE1hcDxPYmplY3QsIE9iamVjdD4gdmlvbGF0aW9uUmVzdWx0U3RvcmFnZSA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOw0KLQ0KLSAgICBwdWJsaWMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3koKQ0KLSAgICB7DQotICAgICAgICBpbml0UmVmZXJlbmNpbmdTdHJhdGVnaWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFJlZmVyZW5jaW5nU3RyYXRlZ2llcygpDQotICAgIHsNCi0gICAgICAgIGlmIChyZWZlcmVuY2luZ1N0cmF0ZWdpZXMgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMgPSBuZXcgQXJyYXlMaXN0PFJlZmVyZW5jaW5nU3RyYXRlZ3k+KCk7DQotDQotICAgICAgICAgICAgU3RyaW5nIGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3lDbGFzc05hbWUgPQ0KLSAgICAgICAgICAgICAgICBFeHRWYWxDb250ZXh0LmdldENvbnRleHQoKS5nZXRJbmZvcm1hdGlvblByb3ZpZGVyQmVhbigpDQotICAgICAgICAgICAgICAgICAgICAuZ2V0KEN1c3RvbUluZm9ybWF0aW9uLkJBU0VfUEFDS0FHRSkgKyAiUmVmZXJlbmNpbmdTdHJhdGVneSI7DQotDQotICAgICAgICAgICAgUmVmZXJlbmNpbmdTdHJhdGVneSBjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5ID0gKFJlZmVyZW5jaW5nU3RyYXRlZ3kpIENsYXNzVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgIC50cnlUb0luc3RhbnRpYXRlQ2xhc3NGb3JOYW1lKGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3lDbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChjdXN0b21SZWZlcmVuY2luZ1N0cmF0ZWd5ICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKGN1c3RvbVJlZmVyZW5jaW5nU3RyYXRlZ3kpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZWZlcmVuY2luZ1N0cmF0ZWdpZXMuYWRkKG5ldyBFTENvbXBhcmVTdHJhdGVneSgpKTsNCi0gICAgICAgICAgICAvL3JlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IEFsaWFzQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IExvY2FsQ29tcGFyZVN0cmF0ZWd5KCkpOw0KLSAgICAgICAgICAgIHJlZmVyZW5jaW5nU3RyYXRlZ2llcy5hZGQobmV3IExvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlKSB0aHJvd3MgVmFsaWRhdG9yRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIC8vaW5pdENyb3NzVmFsaWRhdGlvbiBpcyBkb25lIGluIHRoZSBDcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyDQotDQotICAgICAgICBTdHJpbmdbXSB2YWxpZGF0aW9uVGFyZ2V0cyA9IGdldFZhbGlkYXRpb25UYXJnZXRzKChBKQ0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSk7DQotDQotICAgICAgICBmb3IgKFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0IDogdmFsaWRhdGlvblRhcmdldHMpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCA9IHZhbGlkYXRpb25UYXJnZXQudHJpbSgpOw0KLQ0KLSAgICAgICAgICAgIC8vc2VsZWN0IHZhbGlkYXRpb24gbWV0aG9kDQotICAgICAgICAgICAgdHJ5VG9WYWxpZGF0ZShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsIHZhbGlkYXRpb25UYXJnZXQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiB0cnlUb1ZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBmb3IgKFJlZmVyZW5jaW5nU3RyYXRlZ3kgcmVmZXJlbmNpbmdTdHJhdGVneSA6IHJlZmVyZW5jaW5nU3RyYXRlZ2llcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAocmVmZXJlbmNpbmdTdHJhdGVneS5ldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLCB2YWxpZGF0aW9uVGFyZ2V0LCB0aGlzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlRocm93YWJsZUluc3RhbmNlTmV2ZXJUaHJvd24ifSkNCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlLA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mVGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWhhbmRsZVRhcmdldFZpb2xhdGlvbihlbnRyeU9mU291cmNlLCBlbnRyeU9mVGFyZ2V0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvL25vIHRhcmdldCAtIGJlY2F1c2UgdGhlcmUgaXMgbm8gdGFyZ2V0IGNvbXBvbmVudCAtIHZhbHVlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbW9kZWwNCi0gICAgICAgICAgICBpZihlbnRyeU9mVGFyZ2V0ID09IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzVGFyZ2V0Q29tcG9uZW50QXNTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihlbnRyeU9mU291cmNlKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICAvL2dldCB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgdGFyZ2V0IGNvbXBvbmVudA0KLSAgICAgICAgU3RyaW5nIHN1bW1hcnkgPSBnZXRFcnJvck1lc3NhZ2VTdW1tYXJ5KChBKWVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCksIHRydWUpOw0KLSAgICAgICAgU3RyaW5nIGRldGFpbHMgPSBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSwgdHJ1ZSk7DQotDQotICAgICAgICAvL3ZhbGlkYXRpb24gdGFyZ2V0IGlzbid0IGJvdW5kIHRvIGEgY29tcG9uZW50IHdpdGhpbmcgdGhlIGN1cnJlbnQgcGFnZSANCi0gICAgICAgIC8vKHNlZSB2YWxpZGF0ZUZvdW5kRW50cnksIHRyeVRvVmFsaWRhdGVMb2NhbGx5IGFuZCB0cnlUb1ZhbGlkYXRlQmluZGluZ09ubHkpDQotICAgICAgICBpZiAoZW50cnlPZlRhcmdldCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGVudHJ5T2ZUYXJnZXQgPSBlbnRyeU9mU291cmNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRmFjZXNNZXNzYWdlIG1lc3NhZ2U7DQotICAgICAgICBpZiAoZW50cnlPZlRhcmdldC5nZXRNZXRhRGF0YUVudHJ5KCkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBtZXNzYWdlID0gZ2V0VGFyZ2V0Q29tcG9uZW50RXJyb3JNZXNzYWdlKChBKWVudHJ5T2ZUYXJnZXQuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKCksIHN1bW1hcnksIGRldGFpbHMpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vVE9ETyBkb2N1bWVudCBwb3NzaWJsZSBzaWRlIGVmZmVjdHMNCi0gICAgICAgICAgICAvL2R1ZSB0byBhIG1pc3NpbmcgdGFyZ2V0IGFubm90YXRpb24gKHNlZTogdHJ5VG9WYWxpZGF0ZUxvY2FsbHkpDQotICAgICAgICAgICAgbWVzc2FnZSA9IGdldFRhcmdldENvbXBvbmVudEVycm9yTWVzc2FnZSgoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpLCBzdW1tYXJ5LCBkZXRhaWxzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICgobWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCB8fCBtZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwpICYmDQotICAgICAgICAgICAgZW50cnlPZlNvdXJjZS5nZXRDbGllbnRJZCgpICE9IG51bGwgJiYgIWVudHJ5T2ZTb3VyY2UuZ2V0Q2xpZW50SWQoKS5lcXVhbHMoZW50cnlPZlRhcmdldC5nZXRDbGllbnRJZCgpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBWYWxpZGF0b3JFeGNlcHRpb24gdmFsaWRhdG9yRXhjZXB0aW9uID0gbmV3IFZhbGlkYXRvckV4Y2VwdGlvbihtZXNzYWdlKTsNCi0NCi0gICAgICAgICAgICBib29sZWFuIGlzU291cmNlTWV0YURhdGFVc2VkID0gZmFsc2U7DQotDQotICAgICAgICAgICAgaWYoZW50cnlPZlRhcmdldC5nZXRNZXRhRGF0YUVudHJ5KCkgPT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByZXBhcmVUYXJnZXRNZXRhRGF0YUZvclNldmVyaXR5QXdhcmVJbnRlcmNlcHRpb24oZW50cnlPZlNvdXJjZSwgZW50cnlPZlRhcmdldCk7DQotICAgICAgICAgICAgICAgIGlzU291cmNlTWV0YURhdGFVc2VkID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgaWYoRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoDQotICAgICAgICAgICAgICAgICAgICBlbnRyeU9mVGFyZ2V0LmdldENvbXBvbmVudCgpLCBlbnRyeU9mVGFyZ2V0LmdldE1ldGFEYXRhRW50cnkoKSwNCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5T2ZUYXJnZXQuZ2V0Q29udmVydGVkT2JqZWN0KCksIHZhbGlkYXRvckV4Y2VwdGlvbiwgdGhpcykpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy50cnlUb0FkZFZpb2xhdGlvbk1lc3NhZ2VGb3JDb21wb25lbnRJZChlbnRyeU9mVGFyZ2V0LmdldENsaWVudElkKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMuY29udmVydEZhY2VzTWVzc2FnZSh2YWxpZGF0b3JFeGNlcHRpb24uZ2V0RmFjZXNNZXNzYWdlKCkpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYoaXNTb3VyY2VNZXRhRGF0YVVzZWQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXNldFRhcmdldE1ldGFEYXRhKGVudHJ5T2ZUYXJnZXQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJlcGFyZVRhcmdldE1ldGFEYXRhRm9yU2V2ZXJpdHlBd2FyZUludGVyY2VwdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSwgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZUYXJnZXQpDQotICAgIHsNCi0gICAgICAgIGVudHJ5T2ZUYXJnZXQuc2V0TWV0YURhdGFFbnRyeShlbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0VGFyZ2V0TWV0YURhdGEoQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGVudHJ5T2ZUYXJnZXQpDQotICAgIHsNCi0gICAgICAgIGVudHJ5T2ZUYXJnZXQuc2V0TWV0YURhdGFFbnRyeShudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlRocm93YWJsZUluc3RhbmNlTmV2ZXJUaHJvd24ifSkNCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NUYXJnZXRDb21wb25lbnRBc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlKQ0KLSAgICB7DQotICAgICAgICAvL2dldCB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQNCi0gICAgICAgIFN0cmluZyBzdW1tYXJ5ID0gZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkoKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSk7DQotICAgICAgICBTdHJpbmcgZGV0YWlscyA9IGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwoKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSk7DQotDQotICAgICAgICBGYWNlc01lc3NhZ2UgbWVzc2FnZSA9IGdldFNvdXJjZUNvbXBvbmVudEVycm9yTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSwgc3VtbWFyeSwgZGV0YWlscyk7DQotDQotICAgICAgICBpZiAobWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCB8fCBtZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9UT0RPDQotICAgICAgICAgICAgaWYoRXh0VmFsVXRpbHMuZXhlY3V0ZUFmdGVyVGhyb3dpbmdJbnRlcmNlcHRvcnMoZW50cnlPZlNvdXJjZS5nZXRDb21wb25lbnQoKSwNCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5T2ZTb3VyY2UuZ2V0TWV0YURhdGFFbnRyeSgpLA0KLSAgICAgICAgICAgICAgICAgICAgZW50cnlPZlNvdXJjZS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgICAgIG5ldyBWYWxpZGF0b3JFeGNlcHRpb24obWVzc2FnZSksDQotICAgICAgICAgICAgICAgICAgICB0aGlzKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvVGhyb3dWYWxpZGF0b3JFeGNlcHRpb25Gb3JDb21wb25lbnQoZW50cnlPZlNvdXJjZS5nZXRDb21wb25lbnQoKSwgbWVzc2FnZSwgbnVsbCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vVE9ETyBsb2dnaW5nDQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHJvY2Vzc1NvdXJjZUNvbXBvbmVudEFmdGVyVmlvbGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlKQ0KLSAgICB7DQotICAgICAgICBpZiAoaGFuZGxlU291cmNlVmlvbGF0aW9uKGVudHJ5T2ZTb3VyY2UpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZ2V0IHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjdXJyZW50IGNvbXBvbmVudA0KLSAgICAgICAgICAgIFN0cmluZyBzdW1tYXJ5ID0gZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeSgoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpLCBmYWxzZSk7DQotICAgICAgICAgICAgU3RyaW5nIGRldGFpbHMgPSBnZXRFcnJvck1lc3NhZ2VEZXRhaWwoKEEpZW50cnlPZlNvdXJjZS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoKSwgZmFsc2UpOw0KLQ0KLSAgICAgICAgICAgIEZhY2VzTWVzc2FnZSBtZXNzYWdlID0gZ2V0U291cmNlQ29tcG9uZW50RXJyb3JNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICAoQSllbnRyeU9mU291cmNlLmdldE1ldGFEYXRhRW50cnkoKS5nZXRWYWx1ZSgpLCBzdW1tYXJ5LCBkZXRhaWxzKTsNCi0NCi0gICAgICAgICAgICBpZiAobWVzc2FnZS5nZXRTdW1tYXJ5KCkgIT0gbnVsbCB8fCBtZXNzYWdlLmdldERldGFpbCgpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvL1RPRE8NCi0gICAgICAgICAgICAgICAgRXh0VmFsVXRpbHMudHJ5VG9UaHJvd1ZhbGlkYXRvckV4Y2VwdGlvbkZvckNvbXBvbmVudChlbnRyeU9mU291cmNlLmdldENvbXBvbmVudCgpLCBtZXNzYWdlLCBudWxsKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvL2p1c3QgdGhyb3cgYSBuZXcgbWVzc2FnZSAtIHRoZSBlcnJvciBtZXNzYWdlIGlzIGF0IHRoZSB0YXJnZXQNCi0gICAgICAgIEV4dFZhbFV0aWxzLnRyeVRvVGhyb3dWYWxpZGF0b3JFeGNlcHRpb25Gb3JDb21wb25lbnQoDQotICAgICAgICAgICAgICAgIGVudHJ5T2ZTb3VyY2UuZ2V0Q29tcG9uZW50KCksIG5ldyBGYWNlc01lc3NhZ2UoRmFjZXNNZXNzYWdlLlNFVkVSSVRZX0VSUk9SLCBudWxsLCBudWxsKSwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEZhY2VzTWVzc2FnZSBnZXRTb3VyY2VDb21wb25lbnRFcnJvck1lc3NhZ2UoQSBhbm5vdGF0aW9uLCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZUZhY2VzTWVzc2FnZShzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBGYWNlc01lc3NhZ2UgZ2V0VGFyZ2V0Q29tcG9uZW50RXJyb3JNZXNzYWdlKEEgZm91bmRBbm5vdGF0aW9uLCBTdHJpbmcgc3VtbWFyeSwgU3RyaW5nIGRldGFpbCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmNyZWF0ZUZhY2VzTWVzc2FnZShzdW1tYXJ5LCBkZXRhaWwpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlU3VtbWFyeShBIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiByZXNvbHZlTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZURldGFpbChBIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgICAgIHJldHVybiAoa2V5ICE9IG51bGwpID8gcmVzb2x2ZU1lc3NhZ2Uoa2V5ICsgREVUQUlMX01FU1NBR0VfS0VZX1BPU1RGSVgpIDogbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvdWxkbid0IGZpbmQga2V5ICIgKyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShBbm5vdGF0aW9uIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoKEEpYW5ub3RhdGlvbiwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVRhcmdldFZpb2xhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlNvdXJjZSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnlPZlRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGVudHJ5T2ZUYXJnZXQgIT0gbnVsbCAmJiBlbnRyeU9mVGFyZ2V0LmdldENvbXBvbmVudCgpICE9IG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlU291cmNlVmlvbGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZyhDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gaGFuZGxlVGFyZ2V0VmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogbm8gdGFyZ2V0IGNvbXBvbmVudCAodmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBtb2RlbCkgLT4gZ2V0IHJldmVyc2UgbWVzc2FnZSBmb3Igc291cmNlIGNvbXBvbmVudA0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlU3VtbWFyeShBIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIC8vaWYgdGhlIG1lc3NhZ2UgaXMgbmV1dHJhbA0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiwgdHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogbm8gdGFyZ2V0IGNvbXBvbmVudCAodmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBtb2RlbCkgLT4gZ2V0IHJldmVyc2UgbWVzc2FnZSBmb3Igc291cmNlIGNvbXBvbmVudA0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXZlcnNlRXJyb3JNZXNzYWdlRGV0YWlsKEEgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgLy9pZiB0aGUgbWVzc2FnZSBpcyBuZXV0cmFsDQotICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKGFubm90YXRpb24sIHRydWUpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIGFic3RyYWN0IG1ldGhvZHMNCi0gICAgICovDQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KEEgYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCk7DQotDQotICAgIC8qDQotICAgICAqIGltcGxlbWVudHMgdGhlIHNwZWNpZmljIHZhbGlkYXRpb24gbG9naWMNCi0gICAgICovDQotDQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwgQSBhbm5vdGF0aW9uKTsNCi0NCi0gICAgLyoNCi0gICAgICogcmV0dXJucyB0aGUgcmVmZXJlbmNlZCB2YWxpZGF0aW9uIHRhcmdldHMgb2YgdGhlIGFubm90YXRpb24NCi0gICAgICogZS5nLiBARGF0ZUlzKHR5cGUgPSBEYXRlSXNUeXBlLmJlZm9yZSwgdmFsdWUgPSAiZmluYWxFeGFtIikNCi0gICAgICogLT4gbWV0aG9kIHJldHVybnMgYW4gYXJyYXkgd2l0aCBvbmUgdmFsdWUgKCJmaW5hbEV4YW0iKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKEEgYW5ub3RhdGlvbik7DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTM3NjEyLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5tZXRhZGF0YS5NZXRhRGF0YUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LkFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuRXh0VmFsVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Ow0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5IGV4dGVuZHMNCi0gICAgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIC8vaW5pdCBjcm9zcy12YWxpZGF0aW9uDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsDQotICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkgPQ0KLSAgICAgICAgICAgIGdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeShmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50LCBtZXRhRGF0YUVudHJ5LCBjb252ZXJ0ZWRPYmplY3QpOw0KLQ0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpLmFkZChlbnRyeSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KQ0KLSAgICB7DQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgZW50cnkgPSBuZXcgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KCk7DQotDQotICAgICAgICBlbnRyeS5zZXRNZXRhRGF0YUVudHJ5KG1ldGFEYXRhRW50cnkpOw0KLSAgICAgICAgZW50cnkuc2V0Q29tcG9uZW50KHVpQ29tcG9uZW50KTsNCi0gICAgICAgIGVudHJ5LnNldENsaWVudElkKHVpQ29tcG9uZW50LmdldENsaWVudElkKGZhY2VzQ29udGV4dCkpOw0KLSAgICAgICAgZW50cnkuc2V0Q29udmVydGVkT2JqZWN0KGNvbnZlcnRlZE9iamVjdCk7DQotICAgICAgICBlbnRyeS5zZXRWYWxpZGF0aW9uU3RyYXRlZ3kodGhpcyk7DQotDQotICAgICAgICByZXR1cm4gZW50cnk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NBZnRlclZhbGlkYXRvckV4Y2VwdGlvbihGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udmVydGVkT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IGF2YWlsYWJsZSBmb3IgY3Jvc3MgdmFsaWRhdGlvbiAtIHVzZSBwcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbiIpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldExhYmVsKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50LCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vdCBhdmFpbGFibGUgZm9yIGNyb3NzIHZhbGlkYXRpb24iKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdFZhbGlkYXRpb24oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YURhdGFFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iamVjdCkNCi0gICAgew0KLSAgICAgICAgLy9ub3QgYXZhaWxhYmxlIGZvciBjcm9zcyB2YWxpZGF0aW9uIC0gdXNlIGluaXRDcm9zc1ZhbGlkYXRpb24NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q3Jvc3NWYWxpZGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIC8vb3ZlcnJpZGUgaWYgbmVlZGVkDQotICAgIH0NCi0NCi0gICAgLy9vdmVycmlkZSBpZiBuZWVkZWQNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24oQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEV4dFZhbFV0aWxzLmV4ZWN1dGVBZnRlclRocm93aW5nSW50ZXJjZXB0b3JzKA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0Q29tcG9uZW50KCksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCksDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwgdmFsaWRhdG9yRXhjZXB0aW9uLCB0aGlzKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uSGVscGVyLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZDQ3NmUuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi17DQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcm9zc1ZhbGlkYXRlQ29tcGFyZVN0cmF0ZWd5KEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSwNCi0gICAgICAgICAgICBib29sZWFuIGlzTW9kZWxBd2FyZVZhbGlkYXRpb24pDQotICAgIHsNCi0gICAgICAgIGlmIChjb21wYXJlU3RyYXRlZ3kuaXNWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCksDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkuZ2V0VmFsdWUoQW5ub3RhdGlvbi5jbGFzcykpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vcHJvY2VzcyBhZnRlciB2aW9sYXRpb24NCi0gICAgICAgICAgICAvL2p1c3QgYWRkIG1lc3NhZ2VzDQotICAgICAgICAgICAgaWYoIWlzTW9kZWxBd2FyZVZhbGlkYXRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcm9jZXNzVGFyZ2V0QWZ0ZXJDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHByb2Nlc3NUYXJnZXRBZnRlck1vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvL3Rob3cgZXhjZXB0aW9uDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc1RhcmdldEFmdGVyQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgc291cmNlQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSkNCi0gICAgew0KLSAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSA9IG5ldyBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoKTsNCi0NCi0gICAgICAgIGlmIChjb21wYXJlU3RyYXRlZ3kudXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coc291cmNlQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29tcG9uZW50KHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDb21wb25lbnQoKSk7DQotICAgICAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENsaWVudElkKHZhbGlkYXRpb25UYXJnZXRFbnRyeS5nZXRDbGllbnRJZCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29tcG9uZW50KHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb21wb25lbnQoKSk7DQotICAgICAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldENsaWVudElkKHNvdXJjZUNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDbGllbnRJZCgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRhcmdldENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb252ZXJ0ZWRPYmplY3QodmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENvbnZlcnRlZFZhbHVlKCkpOw0KLSAgICAgICAgdGFyZ2V0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldFZhbGlkYXRpb25TdHJhdGVneShjb21wYXJlU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgLy9hZGQgbWVzc2FnZQ0KLSAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbigNCi0gICAgICAgICAgICAgICAgc291cmNlQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc1RhcmdldEFmdGVyTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgLy9ubyB0YXJnZXQgLSBiZWNhdXNlIHRoZXJlIGlzIG5vIHRhcmdldCBjb21wb25lbnQgLSB2YWx1ZSB3YXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1vZGVsDQotICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgbnVsbCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMyN2RhNS4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5zdHJhdGVneS5WYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuQVBJKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBWYWxpZGF0aW9uU3RyYXRlZ3kNCi17DQotICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBnZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkoDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQsDQotICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5LCBPYmplY3QgY29udmVydGVkT2JqZWN0KTsNCi0NCi0gICAgdm9pZCBwcm9jZXNzQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlKQ0KLSAgICAgICAgICAgIHRocm93cyBWYWxpZGF0b3JFeGNlcHRpb247DQotfQ0KZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0RhdGVJc1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYWZjOGYuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0RhdGVJc1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkRhdGVJczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uRGF0ZUlzVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0Ow0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjENCi0gKi8NCi1AU2tpcFZhbGlkYXRpb25TdXBwb3J0DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgRGF0ZUlzU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdENvbXBhcmVTdHJhdGVneTxEYXRlSXM+DQotew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUT09fRUFSTFkgPSAiZWFybHkiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUT09fTEFURSA9ICJsYXRlIjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UX0VRVUFMX0RBVEVfVElNRSA9ICJub3QgZXF1YWwiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfS0VZID0gInJlc3VsdCI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBUkVEX1ZBTFVFX0tFWSA9ICJ0YXJnZXQgdmFsdWUiOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVZFUlNFX0NPTVBBUkVEX1ZBTFVFX0tFWSA9ICJyZXZlcnNlIHRhcmdldCB2YWx1ZSI7DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VUYXJnZXRDb21wb25lbnRUb0Rpc3BsYXlFcnJvck1zZygNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICAvL1RPRE8gdGVzdCAmIHJlbW92ZQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlU291cmNlVmlvbGF0aW9uKENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBlbnRyeU9mU291cmNlKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyLCBEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgYm9vbGVhbiB2aW9sYXRpb25Gb3VuZDsNCi0NCi0gICAgICAgIGlmIChhbm5vdGF0aW9uLnR5cGUoKS5lcXVhbHMoRGF0ZUlzVHlwZS5zYW1lKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IG9iamVjdDEgIT0gbnVsbCAmJiAhb2JqZWN0MS5lcXVhbHMob2JqZWN0Mik7DQotDQotICAgICAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVNVTFRfS0VZLCBOT1RfRVFVQUxfREFURV9USU1FKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uLnR5cGUoKS5lcXVhbHMoRGF0ZUlzVHlwZS5iZWZvcmUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHZpb2xhdGlvbkZvdW5kID0gb2JqZWN0MSAhPSBudWxsICYmIG9iamVjdDIgIT0gbnVsbCAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW5ldyBEYXRlKCgoRGF0ZSkgb2JqZWN0MSkuZ2V0VGltZSgpKS5iZWZvcmUoKERhdGUpIG9iamVjdDIpIHx8IG9iamVjdDEuZXF1YWxzKG9iamVjdDIpKTsNCi0NCi0gICAgICAgICAgICBpZiAodmlvbGF0aW9uRm91bmQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KFJFU1VMVF9LRVksIFRPT19MQVRFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSBvYmplY3QxICE9IG51bGwgJiYgb2JqZWN0MiAhPSBudWxsICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICghbmV3IERhdGUoKChEYXRlKSBvYmplY3QxKS5nZXRUaW1lKCkpLmFmdGVyKChEYXRlKSBvYmplY3QyKSB8fCBvYmplY3QxLmVxdWFscyhvYmplY3QyKSk7DQotDQotICAgICAgICAgICAgaWYgKHZpb2xhdGlvbkZvdW5kKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVNVTFRfS0VZLCBUT09fRUFSTFkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh2aW9sYXRpb25Gb3VuZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UucHV0KENPTVBBUkVEX1ZBTFVFX0tFWSwgb2JqZWN0MSk7DQotICAgICAgICAgICAgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLnB1dChSRVZFUlNFX0NPTVBBUkVEX1ZBTFVFX0tFWSwgb2JqZWN0Mik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlvbGF0aW9uRm91bmQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFZhbGlkYXRpb25UYXJnZXRzKERhdGVJcyBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWx1ZU9mKCk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogcHJvdGVjdGVkDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IChTdHJpbmcpIHRoaXMudmlvbGF0aW9uUmVzdWx0U3RvcmFnZS5nZXQoUkVTVUxUX0tFWSk7DQotDQotICAgICAgICBpZiAoIWlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IHJldmVyc2VSZXN1bHQocmVzdWx0KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChUT09fRUFSTFkuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldE5vdEFmdGVyRXJyb3JNc2dLZXkoYW5ub3RhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChUT09fTEFURS5lcXVhbHMocmVzdWx0KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0Tm90QmVmb3JlRXJyb3JNc2dLZXkoYW5ub3RhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldE5vdEVxdWFsRXJyb3JNc2dLZXkoYW5ub3RhdGlvbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmV2ZXJzZVJlc3VsdChTdHJpbmcgcmVzdWx0KQ0KLSAgICB7DQotICAgICAgICBpZiAoVE9PX0VBUkxZLmVxdWFscyhyZXN1bHQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBUT09fTEFURTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gVE9PX0VBUkxZOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZVN1bW1hcnkoRGF0ZUlzIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIGlmICghaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVycm9yTWVzc2FnZVN1bW1hcnkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpLCBhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlRGV0YWlsKERhdGVJcyBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIWlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRFcnJvck1lc3NhZ2VEZXRhaWwoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdldEVycm9yTWVzc2FnZShnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoYW5ub3RhdGlvbiwgaXNUYXJnZXRDb21wb25lbnQpDQotICAgICAgICAgICAgICAgICAgICArIERFVEFJTF9NRVNTQUdFX0tFWV9QT1NURklYLCBhbm5vdGF0aW9uLCBpc1RhcmdldENvbXBvbmVudCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nZ2VyLmlzV2FybkVuYWJsZWQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGtleSAiICsgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmV2ZXJzZUVycm9yTWVzc2FnZVN1bW1hcnkoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGZhbHNlKSwgYW5ub3RhdGlvbiwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJldmVyc2VFcnJvck1lc3NhZ2VEZXRhaWwoRGF0ZUlzIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KGFubm90YXRpb24sIGZhbHNlKQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgYW5ub3RhdGlvbiwgZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiY291bGRuJ3QgZmluZCBrZXkgIiArIGdldFZhbGlkYXRpb25FcnJvck1zZ0tleShhbm5vdGF0aW9uKQ0KLSAgICAgICAgICAgICAgICAgICAgKyBERVRBSUxfTUVTU0FHRV9LRVlfUE9TVEZJWCwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGtleSwgRGF0ZUlzIGFubm90YXRpb24sIGJvb2xlYW4gaXNUYXJnZXRDb21wb25lbnQpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gcmVzb2x2ZU1lc3NhZ2Uoa2V5KTsNCi0NCi0gICAgICAgIERhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKGFubm90YXRpb24uZXJyb3JNZXNzYWdlRGF0ZVN0eWxlKCksDQotICAgICAgICAgICAgRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCkpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlc3VsdDsNCi0NCi0gICAgICAgIGlmKGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IG1lc3NhZ2UucmVwbGFjZSgiezB9IiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0LmZvcm1hdCgoRGF0ZSkgdGhpcy52aW9sYXRpb25SZXN1bHRTdG9yYWdlLmdldChDT01QQVJFRF9WQUxVRV9LRVkpKSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gbWVzc2FnZS5yZXBsYWNlKCJ7MH0iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQuZm9ybWF0KChEYXRlKSB0aGlzLnZpb2xhdGlvblJlc3VsdFN0b3JhZ2UuZ2V0KFJFVkVSU0VfQ09NUEFSRURfVkFMVUVfS0VZKSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9yZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBvdGhlciBjb21wb25lbnQNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogcHJpdmF0ZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90QWZ0ZXJFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RBZnRlckVycm9yTXNnS2V5KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXROb3RCZWZvcmVFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RCZWZvcmVFcnJvck1zZ0tleSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm90RXF1YWxFcnJvck1zZ0tleShEYXRlSXMgYW5ub3RhdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCkuZXF1YWxzKCIiKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi5ub3RFcXVhbEVycm9yTXNnS2V5KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWxpZGF0aW9uRXJyb3JNc2dLZXkoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRUxDb21wYXJlU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjkxMWQ1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5FeHRWYWxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuQ3Jvc3NWYWxpZGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Ub0RvOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuUHJpb3JpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUuZWwuVmFsdWVCaW5kaW5nRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiByZWZlcmVuY2luZyB2YWxpZGF0aW9uIHRhcmdldHMgLSBwb3NzaWJsZSBmb3JtYXRzOg0KLSAqICIje1tiZWFuX25hbWVdLltwcm9wZXJ0eV9uYW1lXX0iIC4uLiBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbiB3aXRoIHZhbHVlIGJpbmRpbmcNCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgRUxDb21wYXJlU3RyYXRlZ3kgaW1wbGVtZW50cyBSZWZlcmVuY2luZ1N0cmF0ZWd5DQotew0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKGdldENsYXNzKCkpOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LCBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmIChFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmlzRUxUZXJtV2VsbEZvcm1lZCh2YWxpZGF0aW9uVGFyZ2V0KSAmJg0KLSAgICAgICAgICAgIEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuaXNFTFRlcm1WYWxpZChGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCksIHZhbGlkYXRpb25UYXJnZXQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeVRvVmFsaWRhdGVWYWx1ZUJpbmRpbmcoDQotICAgICAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgICAgICAgICBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbih2YWxpZGF0aW9uVGFyZ2V0KSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwgY29tcGFyZVN0cmF0ZWd5KTsNCi0NCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAVG9Ebyh2YWx1ZSA9IFByaW9yaXR5Lk1FRElVTSwgZGVzY3JpcHRpb24gPSAidGVzdCIpDQotICAgIHByb3RlY3RlZCBib29sZWFuIHRyeVRvVmFsaWRhdGVWYWx1ZUJpbmRpbmcoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbGlkYXRpb25UYXJnZXQsDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5ID0NCi0gICAgICAgICAgICAgICAgcmVzb2x2ZVRhcmdldEZvckNyb3NzQ29tcG9uZW50VmFsaWRhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXQpOw0KLQ0KLSAgICAgICAgaWYodmFsaWRhdGlvblRhcmdldEVudHJ5ICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHJlc29sdmVUYXJnZXRGb3JDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIHZhbGlkYXRpb25UYXJnZXQpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgPQ0KLSAgICAgICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25VdGlscy5nZXRPckluaXRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UoKTsNCi0NCi0gICAgICAgIHJldHVybiBDcm9zc1ZhbGlkYXRpb25VdGlscy5yZXNvbHZlVmFsaWRhdGlvblRhcmdldEVudHJ5KA0KLSAgICAgICAgICAgICAgICBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblV0aWxzLmNvbnZlcnRWYWx1ZUJpbmRpbmdFeHByZXNzaW9uVG9Qcm9jZXNzZWRJbmZvcm1hdGlvbktleSh2YWxpZGF0aW9uVGFyZ2V0KSwNCi0gICAgICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5LCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFZhbHVlQmluZGluZ0V4cHJlc3Npb24gdmFsaWRhdGlvblRhcmdldCkNCi0gICAgew0KLSAgICAgICAgRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKTsNCi0gICAgICAgIE9iamVjdCB0YXJnZXRWYWx1ZSA9IEV4dFZhbFV0aWxzLmdldEVMSGVscGVyKCkuZ2V0VmFsdWVPZkV4cHJlc3Npb24oZmFjZXNDb250ZXh0LCB2YWxpZGF0aW9uVGFyZ2V0KTsNCi0NCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHRhcmdldEVudHJ5ID0gbmV3IFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5KCk7DQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRCZWFuKA0KLSAgICAgICAgICAgICAgICBFeHRWYWxVdGlscy5nZXRFTEhlbHBlcigpLmdldFZhbHVlT2ZFeHByZXNzaW9uKGZhY2VzQ29udGV4dCwgdmFsaWRhdGlvblRhcmdldC5nZXRCYXNlRXhwcmVzc2lvbigpKSk7DQotICAgICAgICB0YXJnZXRFbnRyeS5zZXRDb252ZXJ0ZWRWYWx1ZSh0YXJnZXRWYWx1ZSk7DQotDQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEVudHJ5LCB0cnVlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FcXVhbHNTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWRiM2Y1Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FcXVhbHNTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0cmF0ZWd5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLkVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBOdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBFbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBFcXVhbHNTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5DQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChFcXVhbHMpIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlvbGF0aW9uKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gb2JqZWN0MSAhPSBudWxsICYmICFvYmplY3QxLmVxdWFscyhvYmplY3QyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChFcXVhbHMpIGFubm90YXRpb24pLnZhbHVlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxDb21wYXJlU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc1MmYzYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxDb21wYXJlU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLmVsLlZhbHVlQmluZGluZ0V4cHJlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Dcm9zc1ZhbGlkYXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWwuUmVmbGVjdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5Qcm94eVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi0NCi0vKioNCi0gKiAiW3Byb3BlcnR5X25hbWVdIiAuLi4gbG9jYWwgdmFsaWRhdGlvbiAtPiBjcm9zcy1jb21wb25lbnQsIGJ1dCBubyBjcm9zcy1lbnRpdHkgdmFsaWRhdGlvbg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1jbGFzcyBMb2NhbENvbXBhcmVTdHJhdGVneSBpbXBsZW1lbnRzIFJlZmVyZW5jaW5nU3RyYXRlZ3kNCi17DQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlUmVmZXJlbmNlQW5kVmFsaWRhdGUoDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRpb25UYXJnZXQsIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSkNCi0gICAgew0KLSAgICAgICAgaWYodmFsaWRhdGlvblRhcmdldC5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5IHdpbGwgY29udGludWUNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ5VG9WYWxpZGF0ZUxvY2FsbHkoDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2UsDQotICAgICAgICAgICAgdmFsaWRhdGlvblRhcmdldCwNCi0gICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXksDQotICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlID0NCi0gICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlKCk7DQotDQotICAgICAgICBib29sZWFuIGlzTW9kZWxBd2FyZVZhbGlkYXRpb24gPQ0KLSAgICAgICAgICAgICAgICBpc01vZGVsQXdhcmVDcm9zc1ZhbGlkYXRpb24oY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UsIHRhcmdldEtleSk7DQotDQotICAgICAgICBTdHJpbmcgdGFyZ2V0UHJvcGVydHkgPSB0YXJnZXRLZXk7DQotDQotICAgICAgICBTdHJpbmcgc291cmNlS2V5ID0gcmVzb2x2ZVNvdXJjZUtleShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgdGFyZ2V0S2V5ID0gc291cmNlS2V5LnN1YnN0cmluZygwLCBzb3VyY2VLZXkubGFzdEluZGV4T2YoIi4iKSArIDEpICsgdGFyZ2V0S2V5Ow0KLQ0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdmFsaWRhdGlvblRhcmdldEVudHJ5ID0gQ3Jvc3NWYWxpZGF0aW9uVXRpbHMucmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFbnRyeSgNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLCB0YXJnZXRLZXksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotDQotICAgICAgICBpZiAodmFsaWRhdGlvblRhcmdldEVudHJ5ICE9IG51bGwgJiYgdmFsaWRhdGlvblRhcmdldEVudHJ5LmdldENvbXBvbmVudCgpICE9IG51bGwgJiYgIWlzTW9kZWxBd2FyZVZhbGlkYXRpb24pDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5KTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vbm8gdGFyZ2V0IC0gYmVjYXVzZSB0aGVyZSBpcyBubyB0YXJnZXQgY29tcG9uZW50IC0gdmFsdWUgd2FzIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBtb2RlbA0KLSAgICAgICAgZWxzZSBpZihpc01vZGVsQXdhcmVWYWxpZGF0aW9uKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKGNvbXBhcmVTdHJhdGVneSwgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCB0YXJnZXRQcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgdW5zdXBwb3J0ZWRDYXNlKGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZVRhcmdldEtleShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LCBTdHJpbmcgdGFyZ2V0S2V5KQ0KLSAgICB7DQotICAgICAgICAvL25vIHJlYWwgdmFsdWUgYmluZGluZyBleHByZXNzaW9uDQotICAgICAgICAvL1ZhbHVlQmluZGluZ0V4cHJlc3Npb24ganVzdCBoZXBscyB0byByZXBsYWNlIHRoZSBwcm9wZXJ0eSBvZiB0aGUga2V5DQotICAgICAgICAvL2hlcmUgb25seSBkb3Qtbm90YXRpb24gaXMgYWxsb3dlZCAtPiBubyBwcm9ibGVtDQotICAgICAgICBWYWx1ZUJpbmRpbmdFeHByZXNzaW9uIGJhc2VFeHByZXNzaW9uID0NCi0gICAgICAgICAgICBuZXcgVmFsdWVCaW5kaW5nRXhwcmVzc2lvbigiI3siICsgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywNCi0gICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGV0YWlscy5jbGFzcykuZ2V0S2V5KCkgKyAifSIpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IFZhbHVlQmluZGluZ0V4cHJlc3Npb24ucmVwbGFjZU9yQWRkUHJvcGVydHkoYmFzZUV4cHJlc3Npb24sIHRhcmdldEtleSkNCi0gICAgICAgICAgICAuZ2V0RXhwcmVzc2lvblN0cmluZygpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC5zdWJzdHJpbmcoMiwgcmVzdWx0Lmxlbmd0aCgpIC0xKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlT2ZQcm9wZXJ0eShPYmplY3QgYmFzZSwgU3RyaW5nIHByb3BlcnR5KQ0KLSAgICB7DQotICAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnR5LnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSwgcHJvcGVydHkubGVuZ3RoKCkpOw0KLSAgICAgICAgQ2xhc3MgdGFyZ2V0Q2xhc3MgPSBQcm94eVV0aWxzLmdldFVucHJveGllZENsYXNzKGJhc2UuZ2V0Q2xhc3MoKSk7DQotICAgICAgICBNZXRob2QgdGFyZ2V0TWV0aG9kID0gUmVmbGVjdGlvblV0aWxzLnRyeVRvR2V0TWV0aG9kKHRhcmdldENsYXNzLCAiZ2V0IiArIHByb3BlcnR5KTsNCi0NCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRhcmdldE1ldGhvZCA9IFJlZmxlY3Rpb25VdGlscy50cnlUb0dldE1ldGhvZCh0YXJnZXRDbGFzcywgImlzIiArIHByb3BlcnR5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKHRhcmdldE1ldGhvZCA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICJjbGFzcyAiICsgYmFzZS5nZXRDbGFzcygpICsgIiBoYXMgbm8gcHVibGljIGdldC9pcyAiICsgcHJvcGVydHkudG9Mb3dlckNhc2UoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gUmVmbGVjdGlvblV0aWxzLnRyeVRvSW52b2tlTWV0aG9kKGJhc2UsIHRhcmdldE1ldGhvZCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSBrZXlDb252ZXJ0ZWRWYWx1ZU1hcHBpbmcsDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIG5ld0tleSA9IGNyZWF0ZVRhcmdldEtleShjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEtleSk7DQotDQotICAgICAgICByZXR1cm4gIWtleUNvbnZlcnRlZFZhbHVlTWFwcGluZy5jb250YWluc0VudHJ5KG5ld0tleSk7DQotDQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZVNvdXJjZUtleShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBQcm9wZXJ0eURldGFpbHMgcHJvcGVydHlEZXRhaWxzID0gY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIFN0cmluZyBzb3VyY2VLZXkgPSBwcm9wZXJ0eURldGFpbHMuZ2V0S2V5KCk7DQotDQotICAgICAgICBpZighc291cmNlS2V5LmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic291cmNlIHBhdGg6ICIgKyBzb3VyY2VLZXkgKyAiIGludmFsaWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzb3VyY2VLZXk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHVuc3VwcG9ydGVkQ2FzZShDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KQ0KLSAgICB7DQotICAgICAgICBpZihsb2dnZXIuaXNXYXJuRW5hYmxlZCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3VsZG4ndCBmaW5kIGNvbnZlcnRlZCBvYmplY3QgZm9yICIgKyAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldE1ldGFEYXRhRW50cnkoKQ0KLSAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpLmdldEtleSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0Nyb3NzQ29tcG9uZW50VmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB2YWxpZGF0aW9uVGFyZ2V0RW50cnkpDQotICAgIHsNCi0gICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdmFsaWRhdGlvblRhcmdldEVudHJ5LCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb2RlbEF3YXJlQ3Jvc3NWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSkNCi0gICAgew0KLSAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgdGFyZ2V0RW50cnkgPSBuZXcgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkoKTsNCi0NCi0gICAgICAgIHRhcmdldEVudHJ5LnNldEJlYW4oDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKS5nZXRCYXNlT2JqZWN0KCkpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkNCi0gICAgICAgICAgICAgICAgLnNldENvbnZlcnRlZFZhbHVlKGdldFZhbHVlT2ZQcm9wZXJ0eSh0YXJnZXRFbnRyeS5nZXRCZWFuKCksIHRhcmdldFByb3BlcnR5KSk7DQotDQotICAgICAgICBDcm9zc1ZhbGlkYXRpb25IZWxwZXINCi0gICAgICAgICAgICAgICAgLmNyb3NzVmFsaWRhdGVDb21wYXJlU3RyYXRlZ3koY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHRhcmdldEVudHJ5LCB0cnVlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5LmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYjY1NmMuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkNyb3NzVmFsaWRhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudXRpbC5SZWZsZWN0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5RGV0YWlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUucHJvcGVydHkuUHJvcGVydHlJbmZvcm1hdGlvbktleXM7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogIltsb2NhbF9wcm9wZXJ0eS5wcm9wZXJ0eTEucHJvcGVydHkyXSINCi0gKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotY2xhc3MgTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5IGV4dGVuZHMgTG9jYWxDb21wYXJlU3RyYXRlZ3kNCi17DQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LCBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3kpDQotICAgIHsNCi0gICAgICAgIGlmKCF2YWxpZGF0aW9uVGFyZ2V0LmNvbnRhaW5zKCIuIikpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy9ub3Qgc3VwcG9ydGVkIC0gVE9ETyBhZGQgbG9nZ2luZw0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnlUb1ZhbGlkYXRlTG9jYWxseSgNCi0gICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIGNvbXBhcmVTdHJhdGVneSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHRyeVRvVmFsaWRhdGVMb2NhbGx5KENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldEtleSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kgY29tcGFyZVN0cmF0ZWd5KQ0KLSAgICB7DQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlID0NCi0gICAgICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuZ2V0T3JJbml0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlKCk7DQotDQotICAgICAgICBTdHJpbmcgbmV3S2V5ID0gY3JlYXRlVGFyZ2V0S2V5KGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIGlmIChwcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY29udGFpbnNFbnRyeShuZXdLZXkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHZhbGlkYXRpb25UYXJnZXRFbnRyeSA9IHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5nZXRFbnRyeShuZXdLZXkpOw0KLQ0KLSAgICAgICAgICAgIHByb2Nlc3NDcm9zc0NvbXBvbmVudFZhbGlkYXRpb24oY29tcGFyZVN0cmF0ZWd5LCBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRpb25UYXJnZXRFbnRyeSk7DQotICAgICAgICB9DQotICAgICAgICAvL25vIHRhcmdldCAtIGJlY2F1c2UgdGhlcmUgaXMgbm8gdGFyZ2V0IGNvbXBvbmVudCAtIHZhbHVlIHdhcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgbW9kZWwNCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbihjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0S2V5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ3Jvc3NDb21wb25lbnRWYWxpZGF0aW9uKA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGNvbXBhcmVTdHJhdGVneSwNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LA0KLSAgICAgICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHRhcmdldEluZm9ybWF0aW9uRW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmIChjb21wYXJlU3RyYXRlZ3kuaXNWaW9sYXRpb24oDQotICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRDb252ZXJ0ZWRPYmplY3QoKSwNCi0gICAgICAgICAgICAgICAgdGFyZ2V0SW5mb3JtYXRpb25FbnRyeS5nZXRDb252ZXJ0ZWRWYWx1ZSgpLA0KLSAgICAgICAgICAgICAgICBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpLmdldFZhbHVlKEFubm90YXRpb24uY2xhc3MpKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5ID0gbmV3IENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSgpOw0KLSAgICAgICAgICAgIHRtcENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5zZXRDb21wb25lbnQoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbXBvbmVudCgpKTsNCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q2xpZW50SWQodGFyZ2V0SW5mb3JtYXRpb25FbnRyeS5nZXRDbGllbnRJZCgpKTsNCi0gICAgICAgICAgICB0bXBDcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuc2V0Q29udmVydGVkT2JqZWN0KHRhcmdldEluZm9ybWF0aW9uRW50cnkuZ2V0Q29udmVydGVkVmFsdWUoKSk7DQotICAgICAgICAgICAgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LnNldFZhbGlkYXRpb25TdHJhdGVneShjb21wYXJlU3RyYXRlZ3kpOw0KLQ0KLSAgICAgICAgICAgIC8vcHJvY2VzcyBhZnRlciB2aW9sYXRpb24NCi0gICAgICAgICAgICAvL2p1c3QgYWRkIG1lc3NhZ2VzDQotICAgICAgICAgICAgaWYoY3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmdldENvbXBvbmVudCgpICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3kucHJvY2Vzc1RhcmdldENvbXBvbmVudEFmdGVyVmlvbGF0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdG1wQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NUYXJnZXRDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIG51bGwpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvL3Rob3cgZXhjZXB0aW9uDQotICAgICAgICAgICAgY29tcGFyZVN0cmF0ZWd5LnByb2Nlc3NTb3VyY2VDb21wb25lbnRBZnRlclZpb2xhdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kZWxBd2FyZUNyb3NzVmFsaWRhdGlvbigNCi0gICAgICAgICAgICBBYnN0cmFjdENvbXBhcmVTdHJhdGVneSBjb21wYXJlU3RyYXRlZ3ksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgU3RyaW5nIHRhcmdldEtleSkNCi0gICAgew0KLSAgICAgICAgUHJvcGVydHlEZXRhaWxzIHByb3BlcnR5RGV0YWlscyA9IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5nZXRNZXRhRGF0YUVudHJ5KCkNCi0gICAgICAgICAgICAuZ2V0UHJvcGVydHkoUHJvcGVydHlJbmZvcm1hdGlvbktleXMuUFJPUEVSVFlfREVUQUlMUywgUHJvcGVydHlEZXRhaWxzLmNsYXNzKTsNCi0NCi0gICAgICAgIE9iamVjdCBuZXdCYXNlID0gUmVmbGVjdGlvblV0aWxzDQotICAgICAgICAgICAgLmdldEJhc2VPZlByb3BlcnR5Q2hhaW4ocHJvcGVydHlEZXRhaWxzLmdldEJhc2VPYmplY3QoKSwgdGFyZ2V0S2V5KTsNCi0NCi0gICAgICAgIGlmKHRhcmdldEtleS5jb250YWlucygiLiIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vZmluZCB0aGUgbGFzdCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIHRhcmdldEtleSA9IHRhcmdldEtleS5zdWJzdHJpbmcodGFyZ2V0S2V5Lmxhc3RJbmRleE9mKCIuIikgKyAxLCB0YXJnZXRLZXkubGVuZ3RoKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgT2JqZWN0IHRhcmdldFZhbHVlID0gZ2V0VmFsdWVPZlByb3BlcnR5KG5ld0Jhc2UsIHRhcmdldEtleSk7DQotDQotICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSB0YXJnZXRFbnRyeSA9IG5ldyBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VFbnRyeSgpOw0KLSAgICAgICAgdGFyZ2V0RW50cnkuc2V0QmVhbihuZXdCYXNlKTsNCi0gICAgICAgIHRhcmdldEVudHJ5LnNldENvbnZlcnRlZFZhbHVlKHRhcmdldFZhbHVlKTsNCi0NCi0gICAgICAgIENyb3NzVmFsaWRhdGlvbkhlbHBlcg0KLSAgICAgICAgICAgICAgICAuY3Jvc3NWYWxpZGF0ZUNvbXBhcmVTdHJhdGVneSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyYXRlZ3ksIGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgdGFyZ2V0RW50cnksIHRydWUpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Ob3RFcXVhbHNTdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L05vdEVxdWFsc1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MDllODQuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L05vdEVxdWFsc1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5hbm5vdGF0aW9uLk5vdEVxdWFsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuYW5ub3RhdGlvbi5Ta2lwVmFsaWRhdGlvblN1cHBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUluZm9ybWF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VDYXRlZ29yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotLyoqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFNraXBWYWxpZGF0aW9uU3VwcG9ydA0KLUBOdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneQ0KLUBFbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBOb3RFcXVhbHNTdHJhdGVneSBleHRlbmRzIEVxdWFsc1N0cmF0ZWd5DQotew0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0aW9uRXJyb3JNc2dLZXkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGlzVGFyZ2V0Q29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChOb3RFcXVhbHMpIGFubm90YXRpb24pLnZhbGlkYXRpb25FcnJvck1zZ0tleSgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpb2xhdGlvbihPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIsDQotICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gIXN1cGVyLmlzVmlvbGF0aW9uKG9iamVjdDEsIG9iamVjdDIsIGFubm90YXRpb24pOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblRhcmdldHMoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKChOb3RFcXVhbHMpIGFubm90YXRpb24pLnZhbHVlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlZmVyZW5jaW5nU3RyYXRlZ3kuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYzUwMTEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlZmVyZW5jaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdHJhdGVneTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLnN0b3JhZ2UuQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotDQotLyoqDQotICogSW50ZXJuYWwgaW50ZXJmYWNlIHRvIGFsbG93IG11bHRpcGxlIHJlZmVyZW5jaW5nIHN0cmF0ZWdpZXMgZm9yIGNyb3NzIGNvbXBvbmVudCB2YWxpZGF0aW9uLg0KLSAqDQotICogQGF1dGhvciBHZXJoYXJkIFBldHJhY2VrDQotICogQHNpbmNlIDEueC4xDQotICovDQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1pbnRlcmZhY2UgUmVmZXJlbmNpbmdTdHJhdGVneQ0KLXsNCi0gICAgYm9vbGVhbiBldmFsdWF0ZVJlZmVyZW5jZUFuZFZhbGlkYXRlKA0KLSAgICAgICAgICAgIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uVGFyZ2V0LA0KLSAgICAgICAgICAgIEFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5IGFic3RyYWN0Q29tcGFyZVN0cmF0ZWd5KTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlcXVpcmVkSWZTdHJhdGVneS5qYXZhIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlcXVpcmVkSWZTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODc1MGIzLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RyYXRlZ3k7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNyb3NzdmFsLmFubm90YXRpb24uUmVxdWlyZWRJZlR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLmFubm90YXRpb24uU2tpcFZhbGlkYXRpb25TdXBwb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnZhbGlkYXRpb24ubWVzc2FnZS5yZXNvbHZlci5BYnN0cmFjdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5OdWxsVmFsdWVBd2FyZVZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUudmFsaWRhdGlvbi5FbXB0eVZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsLkV4dFZhbFV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBTa2lwVmFsaWRhdGlvblN1cHBvcnQNCi1ATnVsbFZhbHVlQXdhcmVWYWxpZGF0aW9uU3RyYXRlZ3kNCi1ARW1wdHlWYWx1ZUF3YXJlVmFsaWRhdGlvblN0cmF0ZWd5DQotQFVzYWdlSW5mb3JtYXRpb24oVXNhZ2VDYXRlZ29yeS5JTlRFUk5BTCkNCi1wdWJsaWMgY2xhc3MgUmVxdWlyZWRJZlN0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3k8UmVxdWlyZWRJZj4NCi17DQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VGYWNlc0J1bmRsZSA9IGZhbHNlOw0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gdXNlVGFyZ2V0Q29tcG9uZW50VG9EaXNwbGF5RXJyb3JNc2coQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVNZXNzYWdlKFN0cmluZyBrZXkpDQotICAgIHsNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBlci5yZXNvbHZlTWVzc2FnZShrZXkpOw0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IEFic3RyYWN0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLk1JU1NJTkdfUkVTT1VSQ0VfTUFSS0VSOw0KLQ0KLSAgICAgICAgaWYoKG1hcmtlciArIGtleSArIG1hcmtlcikuZXF1YWxzKHJlc3VsdCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy51c2VGYWNlc0J1bmRsZSA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdGlvbkVycm9yTXNnS2V5KFJlcXVpcmVkSWYgYW5ub3RhdGlvbiwgYm9vbGVhbiBpc1RhcmdldENvbXBvbmVudCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24udmFsaWRhdGlvbkVycm9yTXNnS2V5KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaW9sYXRpb24oT2JqZWN0IHNvdXJjZSwgT2JqZWN0IHRhcmdldCwgUmVxdWlyZWRJZiBhbm5vdGF0aW9uKQ0KLSAgICB7DQotICAgICAgICBib29sZWFuIHZpb2xhdGlvbkZvdW5kID0gZmFsc2U7DQotDQotICAgICAgICBpZiAoYW5ub3RhdGlvbi5pcygpLmVxdWFscyhSZXF1aXJlZElmVHlwZS5lbXB0eSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdmlvbGF0aW9uRm91bmQgPSAoaXNUYXJnZXRFbXB0eSh0YXJnZXQpIHx8IEJvb2xlYW4uRkFMU0UuZXF1YWxzKHRhcmdldCkpICYmIGlzU291cmNlRW1wdHkoc291cmNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24uaXMoKS5lcXVhbHMoUmVxdWlyZWRJZlR5cGUubm90X2VtcHR5KSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2aW9sYXRpb25Gb3VuZCA9IChpc1RhcmdldE5vdEVtcHR5KHRhcmdldCkgJiYgaXNTb3VyY2VFbXB0eShzb3VyY2UpICYmICEodGFyZ2V0IGluc3RhbmNlb2YgQm9vbGVhbikpIHx8DQotICAgICAgICAgICAgICAgICAgICAoQm9vbGVhbi5UUlVFLmVxdWFscyh0YXJnZXQpICYmIGlzU291cmNlRW1wdHkoc291cmNlKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmlvbGF0aW9uRm91bmQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVGFyZ2V0RW1wdHkoT2JqZWN0IHRhcmdldCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldCA9PSBudWxsIHx8IHRhcmdldC5lcXVhbHMoIiIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NvdXJjZUVtcHR5KE9iamVjdCBzb3VyY2UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBzb3VyY2UgPT0gbnVsbCB8fCBzb3VyY2UuZXF1YWxzKCIiKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNUYXJnZXROb3RFbXB0eShPYmplY3QgdGFyZ2V0KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGFyZ2V0ICE9IG51bGwgJiYgIXRhcmdldC5lcXVhbHMoIiIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uVGFyZ2V0cyhSZXF1aXJlZElmIGFubm90YXRpb24pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLnZhbHVlT2YoKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0FmdGVyQ3Jvc3NWYWxpZGF0b3JFeGNlcHRpb24oDQotICAgICAgICAgICAgQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5IGNyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSwgVmFsaWRhdG9yRXhjZXB0aW9uIHZhbGlkYXRvckV4Y2VwdGlvbikNCi0gICAgew0KLSAgICAgICAgaWYodGhpcy51c2VGYWNlc0J1bmRsZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBFeHRWYWxVdGlscy5yZXBsYWNlV2l0aERlZmF1bHRSZXF1aXJlZE1lc3NhZ2UodmFsaWRhdG9yRXhjZXB0aW9uLmdldEZhY2VzTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzQWZ0ZXJDcm9zc1ZhbGlkYXRvckV4Y2VwdGlvbihjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnksIHZhbGlkYXRvckV4Y2VwdGlvbik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2pwYV9zdHJhdGVneV9tYXBwaW5ncy5wcm9wZXJ0aWVzIGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2pwYV9zdHJhdGVneV9tYXBwaW5ncy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Q5OTI5Li4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1qYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW49b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuQmFzaWM9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuSWQ9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmU9b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuSnBhVmFsaWRhdGlvblN0cmF0ZWd5DQotamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lPW9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5iYXNldmFsLnN0cmF0ZWd5LkpwYVZhbGlkYXRpb25TdHJhdGVneQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Dcm9zc1ZhbGlkYXRpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWY4NTJhLi4wMDAwMDAwCi0tLSBhL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLkNyb3NzVmFsaWRhdGlvblN0b3JhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY3Jvc3N2YWwuc3RvcmFnZS5Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jcm9zc3ZhbC5zdG9yYWdlLlByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlSW5mb3JtYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5pbnRlcm5hbC5Vc2FnZUNhdGVnb3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVG9EbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlByaW9yaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5wcm9wZXJ0eS5Qcm9wZXJ0eURldGFpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS5lbC5WYWx1ZUJpbmRpbmdFeHByZXNzaW9uOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgR2VyaGFyZCBQZXRyYWNlaw0KLSAqIEBzaW5jZSAxLnguMQ0KLSAqLw0KLUBVc2FnZUluZm9ybWF0aW9uKFVzYWdlQ2F0ZWdvcnkuSU5URVJOQUwpDQotcHVibGljIGNsYXNzIENyb3NzVmFsaWRhdGlvblV0aWxzDQotew0KLSAgICBwdWJsaWMgc3RhdGljIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UgZ2V0T3JJbml0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBFeHRWYWxVdGlscy5nZXRTdG9yYWdlKENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MsIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlKCkNCi0gICAgew0KLSAgICAgICAgRXh0VmFsVXRpbHMucmVzZXRTdG9yYWdlKENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MsIENyb3NzVmFsaWRhdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZSBnZXRPckluaXRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRXh0VmFsVXRpbHMuZ2V0U3RvcmFnZSgNCi0gICAgICAgICAgICAgICAgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmNsYXNzLCBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRLZXlUb0NvbnZlcnRlZFZhbHVlTWFwcGluZygpDQotICAgIHsNCi0gICAgICAgIEV4dFZhbFV0aWxzLnJlc2V0U3RvcmFnZShQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuY2xhc3MsIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgcmVzb2x2ZVZhbGlkYXRpb25UYXJnZXRFbnRyeSgNCi0gICAgICAgICAgICBQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UgcHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLA0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRLZXksIENyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkpDQotICAgIHsNCi0gICAgICAgIFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5IHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgPQ0KLSAgICAgICAgICAgIHByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5nZXRFbnRyeSh0YXJnZXRLZXkpOw0KLQ0KLSAgICAgICAgLy92YWx1ZSBub3Qgc3VibWl0dGVkIGF0IHRoaXMgcmVxdWVzdCAtIHVzZSBtb2RlbCB2YWx1ZSAodmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBtb2RlbCkNCi0gICAgICAgIGlmKHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vc2ltcGxlIGNhc2UNCi0gICAgICAgIGlmIChwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEZ1cnRoZXJFbnRyaWVzKCkgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFByb3BlcnR5RGV0YWlscyBwcm9wZXJ0eURldGFpbHMgPSBjcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuZ2V0TWV0YURhdGFFbnRyeSgpDQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5QUk9QRVJUWV9ERVRBSUxTLCBQcm9wZXJ0eURldGFpbHMuY2xhc3MpOw0KLQ0KLSAgICAgICAgT2JqZWN0IHRhcmdldEJlYW4gPSBwcm9wZXJ0eURldGFpbHMuZ2V0QmFzZU9iamVjdCgpOw0KLQ0KLSAgICAgICAgLy9wcm9jZXNzIGNvbXBsZXggY29tcG9uZW50IGVudHJpZXMgKGUuZy4gYSB0YWJsZSkNCi0gICAgICAgIC8vc3VwcG9ydGVkOiBjcm9zcy1jb21wb25lbnQgYnV0IG5vIGNyb3NzLWVudGl0eSB2YWxpZGF0aW9uICg9IGxvY2FsZSB2YWxpZGF0aW9uKQ0KLSAgICAgICAgaWYgKHByb2Nlc3NlZEluZm9ybWF0aW9uRW50cnkuZ2V0QmVhbigpLmVxdWFscyh0YXJnZXRCZWFuKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkSW5mb3JtYXRpb25FbnRyeTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAoUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkgZW50cnkgOiBwcm9jZXNzZWRJbmZvcm1hdGlvbkVudHJ5LmdldEZ1cnRoZXJFbnRyaWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKGVudHJ5LmdldEJlYW4oKS5lcXVhbHModGFyZ2V0QmVhbikpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgQFRvRG8odmFsdWUgPSBQcmlvcml0eS5NRURJVU0sIGRlc2NyaXB0aW9uID0gInN1cHBvcnQgZm9yIG1hcCBzeW50YXgiKQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VmFsdWVCaW5kaW5nRXhwcmVzc2lvblRvUHJvY2Vzc2VkSW5mb3JtYXRpb25LZXkoVmFsdWVCaW5kaW5nRXhwcmVzc2lvbiB2YmUpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB2YmUuZ2V0RXhwcmVzc2lvblN0cmluZygpLnJlcGxhY2UoIiN7IiwgIiIpLnJlcGxhY2UoIn0iLCAiIik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuamF2YSBiL3ByZXBhcmVfcjMvMl8wXzNfcHJlcGFyZS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL1Byb3BlcnR5VmFsaWRhdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNzNhMjguLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuaW50ZXJuYWwuVXNhZ2VJbmZvcm1hdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmludGVybmFsLlVzYWdlQ2F0ZWdvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci5jb3JlLnByb3BlcnR5LlByb3BlcnR5SW5mb3JtYXRpb25LZXlzOw0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IuY29yZS52YWxpZGF0aW9uLnN0cmF0ZWd5LlZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmNvcmUubWV0YWRhdGEuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yLmJhc2V2YWwuc3RyYXRlZ3kuU2tpcFZhbGlkYXRpb25TdHJhdGVneTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIEdlcmhhcmQgUGV0cmFjZWsNCi0gKiBAc2luY2UgMS54LjMNCi0gKi8NCi1AVXNhZ2VJbmZvcm1hdGlvbihVc2FnZUNhdGVnb3J5LklOVEVSTkFMKQ0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25VdGlscw0KLXsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPR0dFUiA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFByb3BlcnR5VmFsaWRhdGlvblV0aWxzLmNsYXNzKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRhdGlvblNraXBwZWQoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25TdHJhdGVneSB2YWxpZGF0aW9uU3RyYXRlZ3ksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpDQotICAgIHsNCi0gICAgICAgIGlmKEV4dFZhbFV0aWxzLmlzU2tpcGFibGVWYWxpZGF0aW9uU3RyYXRlZ3koDQotICAgICAgICAgICAgICAgIFByb3h5VXRpbHMuZ2V0VW5wcm94aWVkQ2xhc3ModmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCksIFZhbGlkYXRpb25TdHJhdGVneS5jbGFzcykpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEJvb2xlYW4gc2tpcFZhbGlkYXRpb24gPSBtZXRhRGF0YUVudHJ5LmdldFByb3BlcnR5KA0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUluZm9ybWF0aW9uS2V5cy5TS0lQX1ZBTElEQVRJT04sIEJvb2xlYW4uY2xhc3MpOw0KLQ0KLSAgICAgICAgICAgIGlmKEJvb2xlYW4uVFJVRS5lcXVhbHMoc2tpcFZhbGlkYXRpb24pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoTE9HR0VSLmlzVHJhY2VFbmFibGVkKCkpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIExPR0dFUi50cmFjZSgidmFsaWRhdGlvbiBvZiAiICsgdmFsaWRhdGlvblN0cmF0ZWd5LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjYW5jZWxlZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYodmFsaWRhdGlvblN0cmF0ZWd5IGluc3RhbmNlb2YgU2tpcFZhbGlkYXRpb25TdHJhdGVneSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWxpZGF0aW9uU3RyYXRlZ3kudmFsaWRhdGUoZmFjZXNDb250ZXh0LCBudWxsLCBtZXRhRGF0YUVudHJ5LCBudWxsKTsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0IGIvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTVlYy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGM5NWEuLjAwMDAwMDAKLS0tIGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvcg0KLUNvcHlyaWdodCAyMDA3LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQ0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotU2VlIHRoZSBmaWxlIExJQ0VOU0UudHh0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHJlcGFyZV9yMy8yXzBfM19wcmVwYXJlL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmODI1Yy4uMDAwMDAwMAotLS0gYS9wcmVwYXJlX3IzLzJfMF8zX3ByZXBhcmUvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAtLS0tLS0NCi1BcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFByb3BlcnR5IFZhbGlkYXRpb24gTW9kdWxlDQotIC0tLS0tLQ0KLQ0KLUFwYWNoZSBNeUZhY2VzIEV4dGVuc2lvbnMgUHJvcGVydHkgVmFsaWRhdGlvbiBNb2R1bGUgT3ZlcnZpZXcNCi0NCi0gICAgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciBQcm9wZXJ0eSBWYWxpZGF0aW9uIHByb3ZpZGVzIGFubm90YXRpb24gYmFzZWQgdmFsaWRhdGlvbiBmb3IgYmVhbiBwcm9wZXJ0aWVzLg0KLSAgICBJdCBhbHNvIHByb3ZpZGVzIEpQQSAxLjAgYmFzZWQgdmFsaWRhdGlvbiBTdXBwb3J0Lg0KLSAgDQotICAgIE15RmFjZXMgRXh0ZW5zaW9ucyBWYWxpZGF0b3IgaXMgY29tcGF0aWJsZSB3aXRoIEpTRiAxLnggYW5kIEpTRiAyLnguIEFsbCB2ZXJzaW9ucyByZXF1aXJlIEphdmEgMS41KwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApyZW5hbWUgdG8gc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3BhcmVudC9zcmMvc2l0ZS9hcHQvamF2YWRvYy5hcHQgYi9zcmMvc2l0ZS9hcHQvamF2YWRvYy5hcHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS9wYXJlbnQvc3JjL3NpdGUvYXB0L2phdmFkb2MuYXB0CnJlbmFtZSB0byBzcmMvc2l0ZS9hcHQvamF2YWRvYy5hcHQKZGlmZiAtLWdpdCBhL3NyYy9zaXRlL3NpdGUueG1sIGIvc3JjL3NpdGUvc2l0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QwMDUyYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zaXRlL3NpdGUueG1sCkBAIC0wLDAgKzEsODIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4NCis8IS0tDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCistLT4NCisNCis8cHJvamVjdCBuYW1lPSJBcGFjaGUgTXlGYWNlcyBFeHRlbnNpb25zIFZhbGlkYXRvciI+DQorICA8YmFubmVyTGVmdD4NCisgICAgPG5hbWU+QXBhY2hlIE15RmFjZXMgRXh0VmFsPC9uYW1lPg0KKyAgICA8c3JjPmltYWdlcy9leHR2YWxfbG9nby5wbmc8L3NyYz4NCisgICAgPGhyZWY+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvci9pbmRleC5odG1sPC9ocmVmPg0KKyAgPC9iYW5uZXJMZWZ0Pg0KKw0KKyAgPGJhbm5lclJpZ2h0Pg0KKyAgICA8bmFtZT5BcGFjaGUgTXlGYWNlczwvbmFtZT4NCisgICAgPHNyYz5pbWcvYmFubmVycy9NeUZhY2VzX2xvZ28uanBnPC9zcmM+DQorICAgIDxocmVmPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbDwvaHJlZj4NCisgIDwvYmFubmVyUmlnaHQ+DQorDQorICA8cHVibGlzaERhdGUgZm9ybWF0PSJkZCBNTU0geXl5eSIvPg0KKw0KKyAgPHNraW4+DQorICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5tYXZlbjwvZ3JvdXBJZD4NCisgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1zaXRlLXNraW48L2FydGlmYWN0SWQ+DQorICAgIDx2ZXJzaW9uPjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICA8L3NraW4+DQorDQorICA8Ym9keT4NCisgICAgPGxpbmtzPg0KKyAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSIgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnIi8+DQorICAgICAgPGl0ZW0gbmFtZT0iTXlGYWNlcyIgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+DQorICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQgTXlmYWNlcyBFeHRWYWwiIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IvZG93bmxvYWQuaHRtbCIvPg0KKyAgICA8L2xpbmtzPg0KKw0KKyAgICA8bWVudSBuYW1lPSJBcGFjaGUgTXlGYWNlcyIgaW5oZXJpdD0idG9wIj4NCisgICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+DQorICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQiICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZG93bmxvYWQuaHRtbCIvPg0KKyAgICA8L21lbnU+DQorDQorICAgIDxtZW51IG5hbWU9IkNvbnRlbnRzIiBpbmhlcml0PSJ0b3AiPg0KKyAgICAgICAgPGl0ZW0gbmFtZT0iTWFpbiBTaXRlIiAgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IvaW5kZXguaHRtbCIvPg0KKyAgICAgICAgPGl0ZW0gbmFtZT0iRXh0VmFsIGZvciBKU0YgMS4xIiAgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvaW5kZXguaHRtbCI+DQorICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJDb3JlIE1vZHVsZSIgICAgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvZXh0ZW5zaW9ucy92YWxpZGF0b3IxMS9teWZhY2VzLWV4dHZhbC1jb3JlL2luZGV4Lmh0bWwiLz4NCisgICAgICAgICAgICAgIDxpdGVtIG5hbWU9IkJlYW4gVmFsaWRhdGlvbiIgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvdmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3QvbXlmYWNlcy1leHR2YWwtYmVhbi12YWxpZGF0aW9uL2luZGV4Lmh0bWwiLz4NCisgICAgICAgICAgICAgIDxpdGVtIG5hbWU9IlByb3BlcnR5IFZhbGlkYXRpb24iICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExL3ZhbGlkYXRpb24tbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLXByb3BlcnR5LXZhbGlkYXRpb24vaW5kZXguaHRtbCIvPg0KKyAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iVHJpbmlkYWQgU3VwcG9ydCIgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLXRyaW5pZGFkLXN1cHBvcnQvaW5kZXguaHRtbCIvPg0KKyAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iR2VuZXJpYyBTdXBwb3J0IiAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2V4dGVuc2lvbnMvdmFsaWRhdG9yMTEvY29tcG9uZW50LXN1cHBvcnQtbW9kdWxlcy1wcm9qZWN0L215ZmFjZXMtZXh0dmFsLWdlbmVyaWMtc3VwcG9ydC9pbmRleC5odG1sIi8+DQorICAgICAgICA8L2l0ZW0+DQorICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAxLjIiICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjEyL2luZGV4Lmh0bWwiIGNvbGxhcHNlPSJ0cnVlIj4NCisgICAgICAgICAgICA8aXRlbSBuYW1lPSJkdW1teSIgICAgICAgIGhyZWY9ImR1bW15Ii8+DQorICAgICAgICA8L2l0ZW0+DQorICAgICAgICA8aXRlbSBuYW1lPSJFeHRWYWwgZm9yIEpTRiAyLjAiICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjIwL2luZGV4Lmh0bWwiIGNvbGxhcHNlPSJ0cnVlIj4NCisgICAgICAgICAgICA8aXRlbSBuYW1lPSJkdW1teSIgICAgICAgIGhyZWY9ImR1bW15Ii8+DQorICAgICAgICA8L2l0ZW0+DQorICAgIDwvbWVudT4NCisJDQorICAgIDxtZW51IG5hbWU9IkRvY3VtZW50YXRpb24iPg0KKyAgICAgIDxpdGVtIG5hbWU9Ildpa2kiICAgICAgICAgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9teWZhY2VzL0V4dGVuc2lvbnMvVmFsaWRhdG9yLyIvPg0KKyAgICAgIDxpdGVtIG5hbWU9IkphdmFkb2MiICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9leHRlbnNpb25zL3ZhbGlkYXRvcjExL2phdmFkb2MuaHRtbCIvPg0KKyAgICA8L21lbnU+DQorDQorICAgIDxtZW51IHJlZj0icmVwb3J0cyIvPg0KKw0KKyAgICA8bWVudSBuYW1lPSJGb3VuZGF0aW9uIiBpbmhlcml0PSJib3R0b20iPg0KKyAgICAgIDxpdGVtIG5hbWU9IkFTRiIgICAgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIiAvPg0KKyAgICAgIDxpdGVtIG5hbWU9IlNwb25zb3JzaGlwIiAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9zcG9uc29yc2hpcC5odG1sIiAvPg0KKyAgICAgIDxpdGVtIG5hbWU9IlRoYW5rcyIgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi90aGFua3MuaHRtbCIgLz4NCisgICAgPC9tZW51Pg0KKyAgPC9ib2R5Pg0KKzwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9wb20ueG1sIGIvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9wb20ueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9wb20ueG1sCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3BvbS54bWwKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9BYnN0cmFjdEV4VmFsVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL0Fic3RyYWN0RXhWYWxUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvQWJzdHJhY3RFeFZhbFRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL0Fic3RyYWN0RXhWYWxUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrRUxIZWxwZXIuamF2YSBiL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svTW9ja0VMSGVscGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL01vY2tFTEhlbHBlci5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL01vY2tFTEhlbHBlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhIGIvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrTWVzc2FnZVJlc29sdmVyRmFjdG9yeS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL01vY2tNZXNzYWdlUmVzb2x2ZXJGYWN0b3J5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL01vY2tNZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeS5qYXZhIGIvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvbW9jay9Nb2NrTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svTW9ja01ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svTW9ja01ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL01vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEgYi90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL01vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS9tb2NrL01vY2tWYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5LmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL21vY2svTW9ja1ZhbGlkYXRpb25TdHJhdGVneUZhY3RvcnkuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvQ2xhc3NMb2FkZXJUZXN0U3VpdGUuamF2YSBiL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvQ2xhc3NMb2FkZXJUZXN0U3VpdGUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvQ2xhc3NMb2FkZXJUZXN0U3VpdGUuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvdXRpbC9DbGFzc0xvYWRlclRlc3RTdWl0ZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvdXRpbC9NZXRob2RVdGlscy5qYXZhIGIvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvdXRpbC9NZXRob2RVdGlscy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvdXRpbC9NZXRob2RVdGlscy5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS91dGlsL01ldGhvZFV0aWxzLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmFzZS10ZXN0LWluZnJhc3RydWN0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmFzZS91dGlsL1Rlc3RVdGlscy5qYXZhIGIvdGVzdC1tb2R1bGVzL2Jhc2UtdGVzdC1pbmZyYXN0cnVjdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2Jhc2UvdXRpbC9UZXN0VXRpbHMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvVGVzdFV0aWxzLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iYXNlLXRlc3QtaW5mcmFzdHJ1Y3R1cmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iYXNlL3V0aWwvVGVzdFV0aWxzLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3BvbS54bWwgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3BvbS54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3BvbS54bWwKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvcG9tLnhtbApkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0Fic3RyYWN0QmVhblZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQWJzdHJhY3RCZWFuVmFsaWRhdGlvblRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQWJzdHJhY3RCZWFuVmFsaWRhdGlvblRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9CYXNlQmVhblZhbFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9CYXNlQmVhblZhbFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9CYXNlQmVhblZhbFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0Jhc2VCZWFuVmFsUHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0Nhc2NhZGVkVmFsaWRhdGlvblRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9DYXNjYWRlZFZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ2FzY2FkZWRWYWxpZGF0aW9uVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ2FzY2FkZWRWYWxpZGF0aW9uVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb24xVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb24xVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb24xVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjFUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjJUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjJUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjJUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Db25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uMlRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Db25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uM1Rlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Db25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uM1Rlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Db25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uM1Rlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb24zVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb240VGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb240VGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb240VGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjRUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjVUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjVUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjVUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Db25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uNVRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Db25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uNlRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Db25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uNlRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Db25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uNlRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb242VGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0N1c3RvbVNldmVyaXR5MVRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9DdXN0b21TZXZlcml0eTFUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL0RlZmF1bHRHcm91cFRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9EZWZhdWx0R3JvdXBUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvRGVmYXVsdEdyb3VwVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvRGVmYXVsdEdyb3VwVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL01vZGVsVmFsaWRhdGlvbjFUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uMVRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24xVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uMVRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24yVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL01vZGVsVmFsaWRhdGlvbjJUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uMlRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL01vZGVsVmFsaWRhdGlvbjJUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uM1Rlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24zVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL01vZGVsVmFsaWRhdGlvbjNUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb24zVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL01vZGVsVmFsaWRhdGlvbjRUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uNFRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Nb2RlbFZhbGlkYXRpb240VGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvTW9kZWxWYWxpZGF0aW9uNFRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9SZXN0cmljdEdyb3Vwc1Rlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9SZXN0cmljdEdyb3Vwc1Rlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9SZXN0cmljdEdyb3Vwc1Rlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL1Jlc3RyaWN0R3JvdXBzVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL1VzZUdyb3VwVmFsaWRhdGlvbjFUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvVXNlR3JvdXBWYWxpZGF0aW9uMVRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Vc2VHcm91cFZhbGlkYXRpb24xVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvVXNlR3JvdXBWYWxpZGF0aW9uMVRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9Vc2VHcm91cFZhbGlkYXRpb24yVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL1VzZUdyb3VwVmFsaWRhdGlvbjJUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvVXNlR3JvdXBWYWxpZGF0aW9uMlRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL1VzZUdyb3VwVmFsaWRhdGlvbjJUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvY3VzdG9tL0N1c3RvbUNvbnN0cmFpbnRTb3VyY2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL2N1c3RvbS9DdXN0b21Db25zdHJhaW50U291cmNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9jdXN0b20vQ3VzdG9tQ29uc3RyYWludFNvdXJjZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9jdXN0b20vQ3VzdG9tQ29uc3RyYWludFNvdXJjZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvY3VzdG9tL0N1c3RvbUlnbm9yZUNvbnN0cmFpbnRTb3VyY2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL2N1c3RvbS9DdXN0b21JZ25vcmVDb25zdHJhaW50U291cmNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9jdXN0b20vQ3VzdG9tSWdub3JlQ29uc3RyYWludFNvdXJjZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9jdXN0b20vQ3VzdG9tSWdub3JlQ29uc3RyYWludFNvdXJjZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvY3VzdG9tL0N1c3RvbVRhcmdldFByb3BlcnR5LmphdmEgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9jdXN0b20vQ3VzdG9tVGFyZ2V0UHJvcGVydHkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL2N1c3RvbS9DdXN0b21UYXJnZXRQcm9wZXJ0eS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9jdXN0b20vQ3VzdG9tVGFyZ2V0UHJvcGVydHkuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL2N1c3RvbS9DdXN0b21UYXJnZXRQcm9wZXJ0eUlkLmphdmEgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9jdXN0b20vQ3VzdG9tVGFyZ2V0UHJvcGVydHlJZC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvY3VzdG9tL0N1c3RvbVRhcmdldFByb3BlcnR5SWQuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvY3VzdG9tL0N1c3RvbVRhcmdldFByb3BlcnR5SWQuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL2N1c3RvbS9DdXN0b21WaW9sYXRpb25TZXZlcml0eS5qYXZhIGIvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvY3VzdG9tL0N1c3RvbVZpb2xhdGlvblNldmVyaXR5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9jdXN0b20vQ3VzdG9tVmlvbGF0aW9uU2V2ZXJpdHkuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvY3VzdG9tL0N1c3RvbVZpb2xhdGlvblNldmVyaXR5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9DYXNjYWRlZFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9DYXNjYWRlZFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9DYXNjYWRlZFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0Nhc2NhZGVkVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTFCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmUxQmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlMUJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlMUJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTFNZXRhRGF0YUJlYW4uamF2YSBiL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTFNZXRhRGF0YUJlYW4uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTFNZXRhRGF0YUJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlMU1ldGFEYXRhQmVhbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlMkJlYW4uamF2YSBiL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTJCZWFuLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmUyQmVhbi5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmUyQmVhbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlMk1ldGFEYXRhQmVhbi5qYXZhIGIvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlMk1ldGFEYXRhQmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlMk1ldGFEYXRhQmVhbi5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmUyTWV0YURhdGFCZWFuLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmUzQmVhbi5qYXZhIGIvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlM0JlYW4uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTNCZWFuLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTNCZWFuLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmUzTWV0YURhdGFCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmUzTWV0YURhdGFCZWFuLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmUzTWV0YURhdGFCZWFuLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTNNZXRhRGF0YUJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTRCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmU0QmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlNEJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlNEJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTRNZXRhRGF0YUJlYW4uamF2YSBiL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTRNZXRhRGF0YUJlYW4uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTRNZXRhRGF0YUJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlNE1ldGFEYXRhQmVhbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlNUJlYW4uamF2YSBiL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTVCZWFuLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmU1QmVhbi5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmU1QmVhbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlNU1ldGFEYXRhQmVhbi5qYXZhIGIvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlNU1ldGFEYXRhQmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlNU1ldGFEYXRhQmVhbi5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmU1TWV0YURhdGFCZWFuLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmU2QmVhbi5qYXZhIGIvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlNkJlYW4uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTZCZWFuLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTZCZWFuLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmU2TWV0YURhdGFCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmU2TWV0YURhdGFCZWFuLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmU2TWV0YURhdGFCZWFuLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTZNZXRhRGF0YUJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0N1c3RvbVR5cGVGb3JDYXNjYWRlZFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9DdXN0b21UeXBlRm9yQ2FzY2FkZWRWYWxpZGF0aW9uVGVzdENhc2UxQmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ3VzdG9tVHlwZUZvckNhc2NhZGVkVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvQ3VzdG9tVHlwZUZvckNhc2NhZGVkVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0dyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4uamF2YSBiL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0dyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL0dyb3VwVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxQmVhbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyQmVhbi5qYXZhIGIvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyQmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyQmVhbi5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Hcm91cFZhbGlkYXRpb25UZXN0Q2FzZTJCZWFuLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFCZWFuLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMUJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4uamF2YSBiL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMkJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyQmVhbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvU2ltdWxhdGVkVXNlckluZm9ybWF0aW9uLmphdmEgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9TaW11bGF0ZWRVc2VySW5mb3JtYXRpb24uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1NpbXVsYXRlZFVzZXJJbmZvcm1hdGlvbi5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9TaW11bGF0ZWRVc2VySW5mb3JtYXRpb24uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1RhcmdldDMuamF2YSBiL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1RhcmdldDMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1RhcmdldDMuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvVGFyZ2V0My5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvVGFyZ2V0NC5qYXZhIGIvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvVGFyZ2V0NC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvbW9kZWwvVGFyZ2V0NC5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9UYXJnZXQ0LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9UZXN0Q2FzZTFCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9UZXN0Q2FzZTFCZWFuLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC9tb2RlbC9UZXN0Q2FzZTFCZWFuLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL21vZGVsL1Rlc3RDYXNlMUJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vQ2xhc3NMZXZlbEVxdWFsLmphdmEgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0NsYXNzTGV2ZWxFcXVhbC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9DbGFzc0xldmVsRXF1YWwuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9DbGFzc0xldmVsRXF1YWwuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vQ2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjEuamF2YSBiL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vQ2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjEuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vQ2xhc3NMZXZlbEVxdWFsc1ZhbGlkYXRvcjEuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9DbGFzc0xldmVsRXF1YWxzVmFsaWRhdG9yMS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9DbGFzc0xldmVsRXF1YWxzVmFsaWRhdG9yMi5qYXZhIGIvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9DbGFzc0xldmVsRXF1YWxzVmFsaWRhdG9yMi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9DbGFzc0xldmVsRXF1YWxzVmFsaWRhdG9yMi5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0NsYXNzTGV2ZWxFcXVhbHNWYWxpZGF0b3IyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0dyb3VwMS5qYXZhIGIvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9Hcm91cDEuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAxLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAxLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0dyb3VwMi5qYXZhIGIvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9Hcm91cDIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAyLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92YWxpZGF0aW9uL0dyb3VwMy5qYXZhIGIvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmFsaWRhdGlvbi9Hcm91cDMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAzLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZhbGlkYXRpb24vR3JvdXAzLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L0N1c3RvbVNldmVyaXR5VGVzdENhc2UxUGFnZUJlYW4uamF2YSBiL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvQ3VzdG9tU2V2ZXJpdHlUZXN0Q2FzZTFQYWdlQmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9DdXN0b21TZXZlcml0eVRlc3RDYXNlMVBhZ2VCZWFuLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvQ3VzdG9tU2V2ZXJpdHlUZXN0Q2FzZTFQYWdlQmVhbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbi5qYXZhIGIvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbi5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L01vZGVsVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UzUGFnZUJlYW4uamF2YSBiL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UzUGFnZUJlYW4uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvTW9kZWxWYWxpZGF0aW9uVGVzdENhc2UzUGFnZUJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTNQYWdlQmVhbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTRQYWdlQmVhbi5qYXZhIGIvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTRQYWdlQmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Nb2RlbFZhbGlkYXRpb25UZXN0Q2FzZTRQYWdlQmVhbi5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L01vZGVsVmFsaWRhdGlvblRlc3RDYXNlNFBhZ2VCZWFuLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L1Jlc3RyaWN0R3JvdXBWYWxpZGF0aW9uVGVzdENhc2UxUGFnZUJlYW4uamF2YSBiL3Rlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvUmVzdHJpY3RHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9SZXN0cmljdEdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvUmVzdHJpY3RHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Vc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbi5qYXZhIGIvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Vc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2JlYW52YWwvdmlldy9Vc2VHcm91cFZhbGlkYXRpb25UZXN0Q2FzZTFQYWdlQmVhbi5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L1VzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMVBhZ2VCZWFuLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L1VzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L1VzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvYmVhbnZhbC92aWV3L1VzZUdyb3VwVmFsaWRhdGlvblRlc3RDYXNlMlBhZ2VCZWFuLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9iZWFudmFsL3ZpZXcvVXNlR3JvdXBWYWxpZGF0aW9uVGVzdENhc2UyUGFnZUJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3BvbS54bWwgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9wb20ueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvcG9tLnhtbApyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvcG9tLnhtbApkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2N1c3RvbS9SZW5kZXJLaXRXcmFwcGVyRmFjdG9yeS5qYXZhIGIvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jdXN0b20vUmVuZGVyS2l0V3JhcHBlckZhY3RvcnkuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3VzdG9tL1JlbmRlcktpdFdyYXBwZXJGYWN0b3J5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvQWJzdHJhY3RFeFZhbENvcmVUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL0Fic3RyYWN0RXhWYWxDb3JlVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9BYnN0cmFjdEV4VmFsQ29yZVRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQWN0aXZhdGVSZXF1aXJlZEluaXRpYWxpemF0aW9uVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25BY3RpdmF0ZVJlcXVpcmVkSW5pdGlhbGl6YXRpb25UZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkFjdGl2YXRlUmVxdWlyZWRJbml0aWFsaXphdGlvblRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25BY3RpdmF0ZVJlcXVpcmVkSW5pdGlhbGl6YXRpb25UZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkNvbnN0cmFpbnRTb3VyY2VBbm5vdGF0aW9uVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25Db25zdHJhaW50U291cmNlQW5ub3RhdGlvblRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ29uc3RyYWludFNvdXJjZUFubm90YXRpb25UZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ29uc3RyYWludFNvdXJjZUFubm90YXRpb25UZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbUJhc2VQYWNrYWdlVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21CYXNlUGFja2FnZVRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tQmFzZVBhY2thZ2VUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tQmFzZVBhY2thZ2VUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbUNvbXBvbmVudEluaXRpYWxpemVyQ2xhc3NOYW1lVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21Db21wb25lbnRJbml0aWFsaXplckNsYXNzTmFtZVRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tQ29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tQ29tcG9uZW50SW5pdGlhbGl6ZXJDbGFzc05hbWVUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbUNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yQ2xhc3NOYW1lVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckNsYXNzTmFtZVRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JDbGFzc05hbWVUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbUNvbXBvbmVudE1ldGFEYXRhRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZVRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21Db21wb25lbnRNZXRhRGF0YUV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tQ29tcG9uZW50TWV0YURhdGFFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21GYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21GYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21GYWNlc01lc3NhZ2VGYWN0b3J5Q2xhc3NOYW1lVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbUZhY2VzTWVzc2FnZUZhY3RvcnlDbGFzc05hbWVUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbUluZm9ybWF0aW9uUHJvdmlkZXJCZWFuQ2xhc3NOYW1lVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21JbmZvcm1hdGlvblByb3ZpZGVyQmVhbkNsYXNzTmFtZVRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tSW5mb3JtYXRpb25Qcm92aWRlckJlYW5DbGFzc05hbWVUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbU1lc3NhZ2VCdW5kbGVCYXNlTmFtZVRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tTWVzc2FnZUJ1bmRsZUJhc2VOYW1lVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21NZXNzYWdlQnVuZGxlQmFzZU5hbWVUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tTWVzc2FnZUJ1bmRsZUJhc2VOYW1lVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21NZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21NZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21NZXNzYWdlUmVzb2x2ZXJGYWN0b3J5Q2xhc3NOYW1lVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbU1lc3NhZ2VSZXNvbHZlckZhY3RvcnlDbGFzc05hbWVUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvckNsYXNzTmFtZVRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbU1ldGFEYXRhU3RvcmFnZUZpbHRlckNsYXNzTmFtZVRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tTWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21NZXRhRGF0YVN0b3JhZ2VGaWx0ZXJDbGFzc05hbWVUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tTWV0YURhdGFTdG9yYWdlRmlsdGVyQ2xhc3NOYW1lVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21NZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlckNsYXNzTmFtZVRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJDbGFzc05hbWVUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbU1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3NOYW1lVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbU1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyQ2xhc3NOYW1lVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21NZXRhRGF0YVRyYW5zZm9ybWVyRmFjdG9yeUNsYXNzTmFtZVRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tTWV0YURhdGFUcmFuc2Zvcm1lckZhY3RvcnlDbGFzc05hbWVUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbU1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbU1ldGFEYXRhVHJhbnNmb3JtZXJGYWN0b3J5Q2xhc3NOYW1lVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvckNsYXNzTmFtZVRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21TdGF0aWNWYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nU291cmNlVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21TdGF0aWNWYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nU291cmNlVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21TdGF0aWNWYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nU291cmNlVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbVN0YXRpY1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmdTb3VyY2VUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbVN0b3JhZ2VNYW5hZ2VyRmFjdG9yeUNsYXNzTmFtZVRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tU3RvcmFnZU1hbmFnZXJGYWN0b3J5Q2xhc3NOYW1lVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21TdG9yYWdlTWFuYWdlckZhY3RvcnlDbGFzc05hbWVUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tU3RvcmFnZU1hbmFnZXJGYWN0b3J5Q2xhc3NOYW1lVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21UZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbVRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbVRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yQ2xhc3NOYW1lVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbVZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvckNsYXNzTmFtZVRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JDbGFzc05hbWVUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbVZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JDbGFzc05hbWVUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbVZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JDbGFzc05hbWVUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbVZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JDbGFzc05hbWVUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckNsYXNzTmFtZVRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tVmFsaWRhdGlvblBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnlDbGFzc05hbWVUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbVZhbGlkYXRpb25QYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5Q2xhc3NOYW1lVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZVRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21WYWxpZGF0aW9uUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeUNsYXNzTmFtZVRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tVmFsaWRhdGlvblBhcmFtZXRlckZhY3RvcnlDbGFzc05hbWVUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbVZhbGlkYXRpb25QYXJhbWV0ZXJGYWN0b3J5Q2xhc3NOYW1lVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21WYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZVRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21WYWxpZGF0aW9uUGFyYW1ldGVyRmFjdG9yeUNsYXNzTmFtZVRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZVRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZVRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tVmFsaWRhdGlvblN0cmF0ZWd5RmFjdG9yeUNsYXNzTmFtZVRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21WYWxpZGF0aW9uU3RyYXRlZ3lGYWN0b3J5Q2xhc3NOYW1lVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21WYWxpZGF0aW9uU3RyYXRlZ3lUb01lc3NhZ2VSZXNvbHZlck5hbWVNYXBwZXJDbGFzc05hbWVUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbVZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzTmFtZVRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyQ2xhc3NOYW1lVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbVZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlckNsYXNzTmFtZVRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzTmFtZVRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzTmFtZVRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlckNsYXNzTmFtZVRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyQ2xhc3NOYW1lVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25EZWFjdGl2YXRlQ29tcG9uZW50SW5pdGlhbGl6YXRpb25UZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkRlYWN0aXZhdGVDb21wb25lbnRJbml0aWFsaXphdGlvblRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uRGVhY3RpdmF0ZUNvbXBvbmVudEluaXRpYWxpemF0aW9uVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkRlYWN0aXZhdGVDb21wb25lbnRJbml0aWFsaXphdGlvblRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uRGVhY3RpdmF0ZURlZmF1bHRDb252ZW50aW9uVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25EZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb25UZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkRlYWN0aXZhdGVEZWZhdWx0Q29udmVudGlvblRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25EZWFjdGl2YXRlRGVmYXVsdENvbnZlbnRpb25UZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkRlYWN0aXZhdGVEZWZhdWx0TmFtZU1hcHBlcnNUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkRlYWN0aXZhdGVEZWZhdWx0TmFtZU1hcHBlcnNUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkRlYWN0aXZhdGVEZWZhdWx0TmFtZU1hcHBlcnNUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uRGVhY3RpdmF0ZURlZmF1bHROYW1lTWFwcGVyc1Rlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uRGVhY3RpdmF0ZVJlbmRlcktpdEZhY3RvcnlUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkRlYWN0aXZhdGVSZW5kZXJLaXRGYWN0b3J5VGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25EZWFjdGl2YXRlUmVuZGVyS2l0RmFjdG9yeVRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25EZWFjdGl2YXRlUmVuZGVyS2l0RmFjdG9yeVRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uRGVhY3RpdmF0ZVJlcXVpcmVkQXR0cmlidXRlU3VwcG9ydFRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uRGVhY3RpdmF0ZVJlcXVpcmVkQXR0cmlidXRlU3VwcG9ydFRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uRGVhY3RpdmF0ZVJlcXVpcmVkQXR0cmlidXRlU3VwcG9ydFRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25EZWFjdGl2YXRlUmVxdWlyZWRBdHRyaWJ1dGVTdXBwb3J0VGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25EZWFjdGl2YXRlVmFsaWRhdGlvblBhcmFtZXRlcnNUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkRlYWN0aXZhdGVWYWxpZGF0aW9uUGFyYW1ldGVyc1Rlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uRGVhY3RpdmF0ZVZhbGlkYXRpb25QYXJhbWV0ZXJzVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkRlYWN0aXZhdGVWYWxpZGF0aW9uUGFyYW1ldGVyc1Rlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uVmFsaWRhdGlvblBhcmFtZXRlclRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uVmFsaWRhdGlvblBhcmFtZXRlclRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uVmFsaWRhdGlvblBhcmFtZXRlclRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb25WYWxpZGF0aW9uUGFyYW1ldGVyVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25JZ25vcmVDb25zdHJhaW50U291cmNlQW5ub3RhdGlvblRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uSWdub3JlQ29uc3RyYWludFNvdXJjZUFubm90YXRpb25UZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbklnbm9yZUNvbnN0cmFpbnRTb3VyY2VBbm5vdGF0aW9uVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbklnbm9yZUNvbnN0cmFpbnRTb3VyY2VBbm5vdGF0aW9uVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25JbnRlcnByZXRFbXB0eVN0cmluZ1N1Ym1pdHRlZFZhbHVlc0FzTnVsbFRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uSW50ZXJwcmV0RW1wdHlTdHJpbmdTdWJtaXR0ZWRWYWx1ZXNBc051bGxUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkludGVycHJldEVtcHR5U3RyaW5nU3VibWl0dGVkVmFsdWVzQXNOdWxsVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkludGVycHJldEVtcHR5U3RyaW5nU3VibWl0dGVkVmFsdWVzQXNOdWxsVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25Qcm9qZWN0U3RhZ2VSZXNvbHZlclRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uUHJvamVjdFN0YWdlUmVzb2x2ZXJUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvblByb2plY3RTdGFnZVJlc29sdmVyVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvblByb2plY3RTdGFnZVJlc29sdmVyVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25Qcm94eUhlbHBlclRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uUHJveHlIZWxwZXJUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvblByb3h5SGVscGVyVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvblByb3h5SGVscGVyVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25SZW5kZXJlclByb3h5VGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25SZW5kZXJlclByb3h5VGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25SZW5kZXJlclByb3h5VGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvblJlbmRlcmVyUHJveHlUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvblRhcmdldFByb3BlcnR5QW5ub3RhdGlvblRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uVGFyZ2V0UHJvcGVydHlBbm5vdGF0aW9uVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25UYXJnZXRQcm9wZXJ0eUFubm90YXRpb25UZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uVGFyZ2V0UHJvcGVydHlBbm5vdGF0aW9uVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25UYXJnZXRQcm9wZXJ0eUlkQW5ub3RhdGlvblRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uVGFyZ2V0UHJvcGVydHlJZEFubm90YXRpb25UZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvblRhcmdldFByb3BlcnR5SWRBbm5vdGF0aW9uVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvblRhcmdldFByb3BlcnR5SWRBbm5vdGF0aW9uVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25UZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvblRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvblRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uVmFsaWRhdGVFbXB0eUZpZWxkc1Rlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uVmFsaWRhdGVFbXB0eUZpZWxkc1Rlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uVmFsaWRhdGVFbXB0eUZpZWxkc1Rlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25WYWxpZGF0ZUVtcHR5RmllbGRzVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25WaW9sYXRpb25TZXZlcml0eVRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uVmlvbGF0aW9uU2V2ZXJpdHlUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvblZpb2xhdGlvblNldmVyaXR5VGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvblZpb2xhdGlvblNldmVyaXR5VGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvc3VwcG9ydC9Db25zdHJhaW50U291cmNlQXdhcmUyTWV0YURhdGFCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL3N1cHBvcnQvQ29uc3RyYWludFNvdXJjZUF3YXJlMk1ldGFEYXRhQmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9zdXBwb3J0L0NvbnN0cmFpbnRTb3VyY2VBd2FyZTJNZXRhRGF0YUJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9zdXBwb3J0L0NvbnN0cmFpbnRTb3VyY2VBd2FyZTJNZXRhRGF0YUJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvc3VwcG9ydC9Db25zdHJhaW50U291cmNlQXdhcmVCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL3N1cHBvcnQvQ29uc3RyYWludFNvdXJjZUF3YXJlQmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9zdXBwb3J0L0NvbnN0cmFpbnRTb3VyY2VBd2FyZUJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9zdXBwb3J0L0NvbnN0cmFpbnRTb3VyY2VBd2FyZUJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvc3VwcG9ydC9Db25zdHJhaW50U291cmNlQXdhcmVNZXRhRGF0YUJlYW4uamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvc3VwcG9ydC9Db25zdHJhaW50U291cmNlQXdhcmVNZXRhRGF0YUJlYW4uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvc3VwcG9ydC9Db25zdHJhaW50U291cmNlQXdhcmVNZXRhRGF0YUJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9zdXBwb3J0L0NvbnN0cmFpbnRTb3VyY2VBd2FyZU1ldGFEYXRhQmVhbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9zdXBwb3J0L0N1c3RvbUNvbnN0cmFpbnRTb3VyY2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvc3VwcG9ydC9DdXN0b21Db25zdHJhaW50U291cmNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL3N1cHBvcnQvQ3VzdG9tQ29uc3RyYWludFNvdXJjZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL3N1cHBvcnQvQ3VzdG9tQ29uc3RyYWludFNvdXJjZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9zdXBwb3J0L0N1c3RvbUlnbm9yZUNvbnN0cmFpbnRTb3VyY2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvc3VwcG9ydC9DdXN0b21JZ25vcmVDb25zdHJhaW50U291cmNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL3N1cHBvcnQvQ3VzdG9tSWdub3JlQ29uc3RyYWludFNvdXJjZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL3N1cHBvcnQvQ3VzdG9tSWdub3JlQ29uc3RyYWludFNvdXJjZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9zdXBwb3J0L0N1c3RvbVRhcmdldFByb3BlcnR5LmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL3N1cHBvcnQvQ3VzdG9tVGFyZ2V0UHJvcGVydHkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvc3VwcG9ydC9DdXN0b21UYXJnZXRQcm9wZXJ0eS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL3N1cHBvcnQvQ3VzdG9tVGFyZ2V0UHJvcGVydHkuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9jb25maWcvc3VwcG9ydC9DdXN0b21UYXJnZXRQcm9wZXJ0eUlkLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvY29uZmlnL3N1cHBvcnQvQ3VzdG9tVGFyZ2V0UHJvcGVydHlJZC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9zdXBwb3J0L0N1c3RvbVRhcmdldFByb3BlcnR5SWQuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2NvbmZpZy9zdXBwb3J0L0N1c3RvbVRhcmdldFByb3BlcnR5SWQuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9lbC9WYWx1ZUJpbmRpbmdFeHByZXNzaW9uVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2VsL1ZhbHVlQmluZGluZ0V4cHJlc3Npb25UZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2luaXRpYWxpemVyL1JlZ2lzdHJhdGlvbkNvbXBvbmVudEluaXRpYWxpemVyVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbml0aWFsaXplci9SZWdpc3RyYXRpb25Db21wb25lbnRJbml0aWFsaXplclRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW5pdGlhbGl6ZXIvUmVnaXN0cmF0aW9uQ29tcG9uZW50SW5pdGlhbGl6ZXJUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW5pdGlhbGl6ZXIvUmVnaXN0cmF0aW9uQ29tcG9uZW50SW5pdGlhbGl6ZXJUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvblByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25Qcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25FeGNlcHRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25WYWxpZGF0aW9uRXhjZXB0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uVmFsaWRhdGlvbkV4Y2VwdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9tYXBwZXIvUmVnaXN0cmF0aW9uTWV0YURhdGFUb1ZhbGlkYXRpb25TdHJhdGVneU5hbWVNYXBwZXJUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25NZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlclRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvbk1ldGFEYXRhVG9WYWxpZGF0aW9uU3RyYXRlZ3lOYW1lTWFwcGVyVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25NZXRhRGF0YVRvVmFsaWRhdGlvblN0cmF0ZWd5TmFtZU1hcHBlclRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlclRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlclRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWVzc2FnZVJlc29sdmVyTmFtZU1hcHBlclRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9tYXBwZXIvUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXNzYWdlUmVzb2x2ZXJOYW1lTWFwcGVyVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9tYXBwZXIvUmVnaXN0cmF0aW9uVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlclRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvbWFwcGVyL1JlZ2lzdHJhdGlvblZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXJUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL21hcHBlci9SZWdpc3RyYXRpb25WYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9DdXN0b21Qcm9qZWN0U3RhZ2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9DdXN0b21Qcm9qZWN0U3RhZ2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9DdXN0b21Qcm9qZWN0U3RhZ2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0N1c3RvbVByb2plY3RTdGFnZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0N1c3RvbVByb2plY3RTdGFnZVRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvQ3VzdG9tUHJvamVjdFN0YWdlVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9DdXN0b21Qcm9qZWN0U3RhZ2VUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvQ3VzdG9tUHJvamVjdFN0YWdlVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9JbmRlcGVuZGVudFByb2plY3RTdGFnZVRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvSW5kZXBlbmRlbnRQcm9qZWN0U3RhZ2VUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0luZGVwZW5kZW50UHJvamVjdFN0YWdlVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0luZGVwZW5kZW50UHJvamVjdFN0YWdlVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvY29yZS9zdGFnZS9Kc2ZQcm9qZWN0U3RhZ2VUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0pzZlByb2plY3RTdGFnZVRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L2NvcmUvc3RhZ2UvSnNmUHJvamVjdFN0YWdlVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9jb3JlL3N0YWdlL0pzZlByb2plY3RTdGFnZVRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3V0aWwvbW9kZWwvQ3VzdG9tQW5ub3RhdGlvbi5qYXZhIGIvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC91dGlsL21vZGVsL0N1c3RvbUFubm90YXRpb24uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdXRpbC9tb2RlbC9DdXN0b21Bbm5vdGF0aW9uLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdXRpbC9tb2RlbC9DdXN0b21Bbm5vdGF0aW9uLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3V0aWwvbW9kZWwvQ3VzdG9tQW5ub3RhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdXRpbC9tb2RlbC9DdXN0b21Bbm5vdGF0aW9uTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC91dGlsL21vZGVsL0N1c3RvbUFubm90YXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdXRpbC9tb2RlbC9DdXN0b21Bbm5vdGF0aW9uTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC91dGlsL21vZGVsL0N1c3RvbUFubm90YXRpb25TdHJhdGVneS5qYXZhIGIvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC91dGlsL21vZGVsL0N1c3RvbUFubm90YXRpb25TdHJhdGVneS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC91dGlsL21vZGVsL0N1c3RvbUFubm90YXRpb25TdHJhdGVneS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3V0aWwvbW9kZWwvQ3VzdG9tQW5ub3RhdGlvblN0cmF0ZWd5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3V0aWwvbW9kZWwvRGF0YUJlYW4uamF2YSBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdXRpbC9tb2RlbC9EYXRhQmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC91dGlsL21vZGVsL0RhdGFCZWFuLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdXRpbC9tb2RlbC9EYXRhQmVhbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC91dGlsL21vZGVsL1Rlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhIGIvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC91dGlsL21vZGVsL1Rlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC91dGlsL21vZGVsL1Rlc3RNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3V0aWwvbW9kZWwvVGVzdE1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tU3RhdGljVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZ1NvdXJjZVRlc3RDYXNlQ3VzdG9tQ29uZmlnLnByb3BlcnRpZXMgYi90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tU3RhdGljVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZ1NvdXJjZVRlc3RDYXNlQ3VzdG9tQ29uZmlnLnByb3BlcnRpZXMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvY29yZS10ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2NvcmUvY29uZmlnL0V4dFZhbENvcmVDb25maWd1cmF0aW9uQ3VzdG9tU3RhdGljVmFsaWRhdGlvblN0cmF0ZWd5TWFwcGluZ1NvdXJjZVRlc3RDYXNlQ3VzdG9tQ29uZmlnLnByb3BlcnRpZXMKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21TdGF0aWNWYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nU291cmNlVGVzdENhc2VDdXN0b21Db25maWcucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21TdGF0aWNWYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nU291cmNlVGVzdENhc2VXZWJYbWwucHJvcGVydGllcyBiL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21TdGF0aWNWYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nU291cmNlVGVzdENhc2VXZWJYbWwucHJvcGVydGllcwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9jb3JlLXRlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY29yZS9jb25maWcvRXh0VmFsQ29yZUNvbmZpZ3VyYXRpb25DdXN0b21TdGF0aWNWYWxpZGF0aW9uU3RyYXRlZ3lNYXBwaW5nU291cmNlVGVzdENhc2VXZWJYbWwucHJvcGVydGllcwpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL2NvcmUtdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jb3JlL2NvbmZpZy9FeHRWYWxDb3JlQ29uZmlndXJhdGlvbkN1c3RvbVN0YXRpY1ZhbGlkYXRpb25TdHJhdGVneU1hcHBpbmdTb3VyY2VUZXN0Q2FzZVdlYlhtbC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS90ZXN0LW1vZHVsZXMvcG9tLnhtbCBiL3Rlc3QtbW9kdWxlcy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYTliZTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LW1vZHVsZXMvcG9tLnhtbApAQCAtMCwwICsxLDE3NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8IS0tDQorICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisNCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCisgICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KKyAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KKy0tPg0KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQorICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KKw0KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KKw0KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuZXh0ZW5zaW9ucy52YWxpZGF0b3IudGVzdC1tb2R1bGVzPC9ncm91cElkPg0KKyAgICA8YXJ0aWZhY3RJZD50ZXN0LW1vZHVsZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4NCisNCisgICAgPG5hbWU+TXlGYWNlcyBFeHRlbnNpb25zLVZhbGlkYXRvciBUZXN0LU1vZHVsZXM8L25hbWU+DQorICAgIDx2ZXJzaW9uPjEuMS40LVNOQVBTSE9UPC92ZXJzaW9uPg0KKw0KKyAgICA8cGFyZW50Pg0KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KKyAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtbW9kdWxlPC9hcnRpZmFjdElkPg0KKyAgICAgICAgPHZlcnNpb24+MS4xLjQtU05BUFNIT1Q8L3ZlcnNpb24+DQorICAgIDwvcGFyZW50Pg0KKw0KKyAgICA8bW9kdWxlcz4NCisgICAgICAgIDxtb2R1bGU+YmFzZS10ZXN0LWluZnJhc3RydWN0dXJlPC9tb2R1bGU+DQorICAgICAgICA8bW9kdWxlPmNvcmUtdGVzdHM8L21vZHVsZT4NCisgICAgICAgIDxtb2R1bGU+cHJvcGVydHktdmFsaWRhdGlvbi10ZXN0czwvbW9kdWxlPg0KKyAgICAgICAgPG1vZHVsZT5iZWFuLXZhbGlkYXRpb24tdGVzdHM8L21vZHVsZT4NCisJCTxtb2R1bGU+dHJpbmlkYWQtY29tcG9uZW50LXN1cHBvcnQtdGVzdHM8L21vZHVsZT4NCisgICAgPC9tb2R1bGVzPg0KKw0KKyAgICA8ZGVwZW5kZW5jaWVzPg0KKyAgICAgICAgPGRlcGVuZGVuY3k+DQorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmV4dGVuc2lvbnMudmFsaWRhdG9yPC9ncm91cElkPg0KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+DQorICAgICAgICAgICAgPHZlcnNpb24+MS4xLjQtU05BUFNIT1Q8L3ZlcnNpb24+DQorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KKyAgICAgICAgPC9kZXBlbmRlbmN5Pg0KKyAgICAgICAgPGRlcGVuZGVuY3k+DQorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcGk8L2FydGlmYWN0SWQ+DQorICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YudmVyc2lvbn08L3ZlcnNpb24+DQorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KKyAgICAgICAgPC9kZXBlbmRlbmN5Pg0KKyAgICAgICAgPGRlcGVuZGVuY3k+DQorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPg0KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLnZlcnNpb259PC92ZXJzaW9uPg0KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCisgICAgICAgIDwvZGVwZW5kZW5jeT4NCisgICAgICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+DQorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+DQorICAgICAgICAgICAgPHZlcnNpb24+Mi41PC92ZXJzaW9uPg0KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCisgICAgICAgIDwvZGVwZW5kZW5jeT4NCisgICAgICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQuanNwPC9ncm91cElkPg0KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcC1hcGk8L2FydGlmYWN0SWQ+DQorICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPg0KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4NCisgICAgICAgIDwvZGVwZW5kZW5jeT4NCisgICAgICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc2hhbGU8L2dyb3VwSWQ+DQorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2hhbGUtdGVzdDwvYXJ0aWZhY3RJZD4NCisgICAgICAgICAgICA8dmVyc2lvbj4xLjAuNDwvdmVyc2lvbj4NCisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQorICAgICAgICAgICAgPGV4Y2x1c2lvbnM+DQorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+DQorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+DQorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bXlmYWNlczwvZ3JvdXBJZD4NCisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPg0KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm15ZmFjZXM8L2dyb3VwSWQ+DQorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWltcGw8L2FydGlmYWN0SWQ+DQorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KKyAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4NCisgICAgICAgIDwvZGVwZW5kZW5jeT4NCisgICAgPC9kZXBlbmRlbmNpZXM+DQorDQorICAgIDxidWlsZD4NCisgICAgICAgIDxyZXNvdXJjZXM+DQorICAgICAgICAgICAgPHJlc291cmNlPg0KKyAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2NvbmZpZzwvZGlyZWN0b3J5Pg0KKyAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qeG1sPC9pbmNsdWRlPg0KKyAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KKyAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4vTUVUQS1JTkY8L3RhcmdldFBhdGg+DQorICAgICAgICAgICAgPC9yZXNvdXJjZT4NCisgICAgICAgICAgICA8cmVzb3VyY2U+DQorICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQorICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPg0KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4NCisgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4NCisgICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+L01FVEEtSU5GPC90YXJnZXRQYXRoPg0KKyAgICAgICAgICAgIDwvcmVzb3VyY2U+DQorICAgICAgICAgICAgPHJlc291cmNlPg0KKyAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4NCisgICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKnByb3BlcnRpZXM8L2luY2x1ZGU+DQorICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQorICAgICAgICAgICAgPC9yZXNvdXJjZT4NCisgICAgICAgIDwvcmVzb3VyY2VzPg0KKyAgICAgICAgPHBsdWdpbnM+DQorICAgICAgICAgICAgPHBsdWdpbj4NCisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCisNCisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+DQorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQorICAgICAgICAgICAgPC9wbHVnaW4+DQorDQorICAgICAgICAgICAgPHBsdWdpbj4NCisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+DQorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnRlc3QtamFyPC9nb2FsPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KKyAgICAgICAgICAgIDwvcGx1Z2luPg0KKw0KKyAgICAgICAgICAgIDxwbHVnaW4+DQorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40LjI8L3ZlcnNpb24+DQorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KKyAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL0Fic3RyYWN0Ki5qYXZhPC9leGNsdWRlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL0Jhc2UqLmphdmE8L2V4Y2x1ZGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovVGVzdFV0aWxzLmphdmE8L2V4Y2x1ZGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKkJlYW4uamF2YTwvZXhjbHVkZT4NCisgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+DQorCQkJCQk8dXNlU3lzdGVtQ2xhc3NMb2FkZXI+dHJ1ZTwvdXNlU3lzdGVtQ2xhc3NMb2FkZXI+DQorCQkJCQk8Zm9ya01vZGU+b25jZTwvZm9ya01vZGU+DQorCQkJCQk8YXJnTGluZT4tWG14MTAyNG0gLVhYOk1heFBlcm1TaXplPTUxMm08L2FyZ0xpbmU+DQorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCisgICAgICAgICAgICA8L3BsdWdpbj4NCisgICAgICAgIDwvcGx1Z2lucz4NCisgICAgPC9idWlsZD4NCisNCis8L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3BvbS54bWwgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9wb20ueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvcG9tLnhtbApyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvcG9tLnhtbApkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9BYnN0cmFjdFByb3BlcnR5VmFsaWRhdGlvblRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvQWJzdHJhY3RQcm9wZXJ0eVZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL0Fic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL0Fic3RyYWN0UHJvcGVydHlWYWxpZGF0aW9uVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9CYXNlVmFsVGVzdEJlYW4uamF2YSBiL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9CYXNlVmFsVGVzdEJlYW4uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9CYXNlVmFsVGVzdEJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL0Jhc2VWYWxUZXN0QmVhbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL0N1c3RvbVNldmVyaXR5VGVzdEJlYW4uamF2YSBiL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9DdXN0b21TZXZlcml0eVRlc3RCZWFuLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvQ3VzdG9tU2V2ZXJpdHlUZXN0QmVhbi5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvQ3VzdG9tU2V2ZXJpdHlUZXN0QmVhbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvQmFzZVZhbFRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9CYXNlVmFsVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL0Jhc2VWYWxUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9CYXNlVmFsVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL0N1c3RvbVNldmVyaXR5MVRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9DdXN0b21TZXZlcml0eTFUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvQ3VzdG9tU2V2ZXJpdHkxVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9BZGRpdGlvbmFsVmFsaWRhdG9yLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvQWRkaXRpb25hbFZhbGlkYXRvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL0FkZGl0aW9uYWxWYWxpZGF0b3IuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL0FkZGl0aW9uYWxWYWxpZGF0b3IuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9QYXJhbWV0ZXJUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1BhcmFtZXRlclRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvUGFyYW1ldGVyVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1BhcmFtZXRlclRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdEFsbG93Q2xpZW50U2lkZVZhbGlkYXRpb24uamF2YSBiL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0QWxsb3dDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RBbGxvd0NsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0QWxsb3dDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3REZW55Q2xpZW50U2lkZVZhbGlkYXRpb24uamF2YSBiL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0RGVueUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdERlbnlDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdERlbnlDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQZXJzb24uamF2YSBiL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UGVyc29uLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFBlcnNvbi5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFBlcnNvbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQcmlvcml0eS5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQcmlvcml0eS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQcmlvcml0eS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5SGlnaC5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RQcmlvcml0eUhpZ2guamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UHJpb3JpdHlIaWdoLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UHJpb3JpdHlIaWdoLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5TG93LmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5TG93LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFByaW9yaXR5TG93LmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0UHJpb3JpdHlMb3cuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdGlvblN0cmF0ZWd5UHJvdmlkZXIuamF2YSBiL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdGlvblN0cmF0ZWd5UHJvdmlkZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9iYXNldmFsL3BhcmFtZXRlci9UZXN0VmFsaWRhdGlvblN0cmF0ZWd5UHJvdmlkZXIuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0aW9uU3RyYXRlZ3lQcm92aWRlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0b3JQcm92aWRlci5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0b3JQcm92aWRlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Jhc2V2YWwvcGFyYW1ldGVyL1Rlc3RWYWxpZGF0b3JQcm92aWRlci5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvYmFzZXZhbC9wYXJhbWV0ZXIvVGVzdFZhbGlkYXRvclByb3ZpZGVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uZmlnL0V4dFZhbEJhc2VWYWxpZGF0aW9uQ29uZmlndXJhdGlvbkN1c3RvbVRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uZmlnL0V4dFZhbEJhc2VWYWxpZGF0aW9uQ29uZmlndXJhdGlvbkN1c3RvbVRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uZmlnL0V4dFZhbEJhc2VWYWxpZGF0aW9uQ29uZmlndXJhdGlvbkN1c3RvbVRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25maWcvRXh0VmFsQmFzZVZhbGlkYXRpb25Db25maWd1cmF0aW9uQ3VzdG9tVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25maWcvRXh0VmFsQmFzZVZhbGlkYXRpb25Db25maWd1cmF0aW9uRGVhY3RpdmF0ZUpwYUJhc2VkVmFsaWRhdGlvblRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uZmlnL0V4dFZhbEJhc2VWYWxpZGF0aW9uQ29uZmlndXJhdGlvbkRlYWN0aXZhdGVKcGFCYXNlZFZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbmZpZy9FeHRWYWxCYXNlVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25EZWFjdGl2YXRlSnBhQmFzZWRWYWxpZGF0aW9uVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbmZpZy9FeHRWYWxCYXNlVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25EZWFjdGl2YXRlSnBhQmFzZWRWYWxpZGF0aW9uVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25maWcvRXh0VmFsQmFzZVZhbGlkYXRpb25Db25maWd1cmF0aW9uSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZXNUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbmZpZy9FeHRWYWxCYXNlVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25KcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlc1Rlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uZmlnL0V4dFZhbEJhc2VWYWxpZGF0aW9uQ29uZmlndXJhdGlvbkpwYVZhbGlkYXRpb25FcnJvck1lc3NhZ2VzVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbmZpZy9FeHRWYWxCYXNlVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25KcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlc1Rlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uZmlnL0V4dFZhbEJhc2VWYWxpZGF0aW9uQ29uZmlndXJhdGlvblRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uZmlnL0V4dFZhbEJhc2VWYWxpZGF0aW9uQ29uZmlndXJhdGlvblRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uZmlnL0V4dFZhbEJhc2VWYWxpZGF0aW9uQ29uZmlndXJhdGlvblRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25maWcvRXh0VmFsQmFzZVZhbGlkYXRpb25Db25maWd1cmF0aW9uVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25maWcvRXh0VmFsQ3Jvc3NWYWxpZGF0aW9uQ29uZmlndXJhdGlvbkN1c3RvbVRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uZmlnL0V4dFZhbENyb3NzVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25DdXN0b21UZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbmZpZy9FeHRWYWxDcm9zc1ZhbGlkYXRpb25Db25maWd1cmF0aW9uQ3VzdG9tVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbmZpZy9FeHRWYWxDcm9zc1ZhbGlkYXRpb25Db25maWd1cmF0aW9uQ3VzdG9tVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25maWcvRXh0VmFsQ3Jvc3NWYWxpZGF0aW9uQ29uZmlndXJhdGlvbkRlYWN0aXZhdGVDcm9zc3ZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbmZpZy9FeHRWYWxDcm9zc1ZhbGlkYXRpb25Db25maWd1cmF0aW9uRGVhY3RpdmF0ZUNyb3NzdmFsaWRhdGlvblRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uZmlnL0V4dFZhbENyb3NzVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25EZWFjdGl2YXRlQ3Jvc3N2YWxpZGF0aW9uVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbmZpZy9FeHRWYWxDcm9zc1ZhbGlkYXRpb25Db25maWd1cmF0aW9uRGVhY3RpdmF0ZUNyb3NzdmFsaWRhdGlvblRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uZmlnL0V4dFZhbENyb3NzVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25UZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbmZpZy9FeHRWYWxDcm9zc1ZhbGlkYXRpb25Db25maWd1cmF0aW9uVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25maWcvRXh0VmFsQ3Jvc3NWYWxpZGF0aW9uQ29uZmlndXJhdGlvblRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25maWcvRXh0VmFsQ3Jvc3NWYWxpZGF0aW9uQ29uZmlndXJhdGlvblRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9BYnN0cmFjdENvbnN0cmFpbnRTb3VyY2VUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvQWJzdHJhY3RDb25zdHJhaW50U291cmNlVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL0Fic3RyYWN0Q29uc3RyYWludFNvdXJjZVRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL0Fic3RyYWN0Q29uc3RyYWludFNvdXJjZVRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9Db25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uMVRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9Db25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uMVRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9Db25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uMVRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb24xVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb24yVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb24yVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb24yVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjJUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjNUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjNUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjNUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9Db25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uM1Rlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9Db25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uNFRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9Db25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uNFRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9Db25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uNFRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb240VGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb241VGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb241VGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL0NvbnN0cmFpbnRTb3VyY2VBd2FyZVZhbGlkYXRpb241VGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjVUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjZUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjZUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvQ29uc3RyYWludFNvdXJjZUF3YXJlVmFsaWRhdGlvbjZUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9Db25zdHJhaW50U291cmNlQXdhcmVWYWxpZGF0aW9uNlRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9jdXN0b20vQ3VzdG9tQ29uc3RyYWludFNvdXJjZS5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvY3VzdG9tL0N1c3RvbUNvbnN0cmFpbnRTb3VyY2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL2N1c3RvbS9DdXN0b21Db25zdHJhaW50U291cmNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL2N1c3RvbS9DdXN0b21Db25zdHJhaW50U291cmNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9jdXN0b20vQ3VzdG9tSWdub3JlQ29uc3RyYWludFNvdXJjZS5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvY3VzdG9tL0N1c3RvbUlnbm9yZUNvbnN0cmFpbnRTb3VyY2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL2N1c3RvbS9DdXN0b21JZ25vcmVDb25zdHJhaW50U291cmNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL2N1c3RvbS9DdXN0b21JZ25vcmVDb25zdHJhaW50U291cmNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9jdXN0b20vQ3VzdG9tVGFyZ2V0UHJvcGVydHkuamF2YSBiL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL2N1c3RvbS9DdXN0b21UYXJnZXRQcm9wZXJ0eS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvY3VzdG9tL0N1c3RvbVRhcmdldFByb3BlcnR5LmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL2N1c3RvbS9DdXN0b21UYXJnZXRQcm9wZXJ0eS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvY3VzdG9tL0N1c3RvbVRhcmdldFByb3BlcnR5SWQuamF2YSBiL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL2N1c3RvbS9DdXN0b21UYXJnZXRQcm9wZXJ0eUlkLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9jdXN0b20vQ3VzdG9tVGFyZ2V0UHJvcGVydHlJZC5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9jdXN0b20vQ3VzdG9tVGFyZ2V0UHJvcGVydHlJZC5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlMUJlYW4uamF2YSBiL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTFCZWFuLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmUxQmVhbi5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmUxQmVhbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlMU1ldGFEYXRhQmVhbi5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlMU1ldGFEYXRhQmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlMU1ldGFEYXRhQmVhbi5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmUxTWV0YURhdGFCZWFuLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmUyQmVhbi5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlMkJlYW4uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTJCZWFuLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTJCZWFuLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmUyTWV0YURhdGFCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmUyTWV0YURhdGFCZWFuLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmUyTWV0YURhdGFCZWFuLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTJNZXRhRGF0YUJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTNCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmUzQmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlM0JlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlM0JlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTNNZXRhRGF0YUJlYW4uamF2YSBiL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTNNZXRhRGF0YUJlYW4uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTNNZXRhRGF0YUJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlM01ldGFEYXRhQmVhbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlNEJlYW4uamF2YSBiL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTRCZWFuLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmU0QmVhbi5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmU0QmVhbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlNE1ldGFEYXRhQmVhbi5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlNE1ldGFEYXRhQmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlNE1ldGFEYXRhQmVhbi5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmU0TWV0YURhdGFCZWFuLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmU1QmVhbi5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlNUJlYW4uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTVCZWFuLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTVCZWFuLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmU1TWV0YURhdGFCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmU1TWV0YURhdGFCZWFuLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmU1TWV0YURhdGFCZWFuLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTVNZXRhRGF0YUJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTZCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9tb2RlbC9Db25zdHJhaW50U291cmNlQXdhcmU2QmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlNkJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlNkJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTZNZXRhRGF0YUJlYW4uamF2YSBiL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTZNZXRhRGF0YUJlYW4uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL21vZGVsL0NvbnN0cmFpbnRTb3VyY2VBd2FyZTZNZXRhRGF0YUJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvbW9kZWwvQ29uc3RyYWludFNvdXJjZUF3YXJlNk1ldGFEYXRhQmVhbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvbW9kZWwvVGFyZ2V0My5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvbW9kZWwvVGFyZ2V0My5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2NvbnN0cmFpbnRzb3VyY2UvbW9kZWwvVGFyZ2V0My5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9tb2RlbC9UYXJnZXQzLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9tb2RlbC9UYXJnZXQ0LmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9tb2RlbC9UYXJnZXQ0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY29uc3RyYWludHNvdXJjZS9tb2RlbC9UYXJnZXQ0LmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jb25zdHJhaW50c291cmNlL21vZGVsL1RhcmdldDQuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0QmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdEJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdEJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Dcm9zc1ZhbFRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0Nyb3NzVmFsVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FTENyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VMQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRUxDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VMQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRUxDcm9zc1ZhbFRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRUxDcm9zc1ZhbFRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRUxDcm9zc1ZhbFRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FTENyb3NzVmFsVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FTENyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRUxDcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VMQ3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FbXB0eUlmMVRlc3RCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRW1wdHlJZjFUZXN0QmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VtcHR5SWYxVGVzdEJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VtcHR5SWYxVGVzdEJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FbXB0eUlmMVRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRW1wdHlJZjFUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VtcHR5SWYxVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VtcHR5SWYxVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FbXB0eUlmMlRlc3RCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRW1wdHlJZjJUZXN0QmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VtcHR5SWYyVGVzdEJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VtcHR5SWYyVGVzdEJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FbXB0eUlmMlRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRW1wdHlJZjJUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VtcHR5SWYyVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VtcHR5SWYyVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FbXB0eUlmM1Rlc3RCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRW1wdHlJZjNUZXN0QmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VtcHR5SWYzVGVzdEJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VtcHR5SWYzVGVzdEJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FbXB0eUlmM1Rlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRW1wdHlJZjNUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VtcHR5SWYzVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VtcHR5SWYzVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FbXB0eUlmNFRlc3RCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRW1wdHlJZjRUZXN0QmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VtcHR5SWY0VGVzdEJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VtcHR5SWY0VGVzdEJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FbXB0eUlmNFRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRW1wdHlJZjRUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VtcHR5SWY0VGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VtcHR5SWY0VGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FcXVhbHNTdHJpbmdUZXN0QmVhbi5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VxdWFsc1N0cmluZ1Rlc3RCZWFuLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRXF1YWxzU3RyaW5nVGVzdEJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VxdWFsc1N0cmluZ1Rlc3RCZWFuLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvRXF1YWxzU3RyaW5nVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FcXVhbHNTdHJpbmdUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0VxdWFsc1N0cmluZ1Rlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9FcXVhbHNTdHJpbmdUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvTG9jYWxQcm9wZXJ0eUNyb3NzVmFsVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YSBiL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Mb2NhbFByb3BlcnR5Q3Jvc3NWYWxUZXN0RGF0ZUJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL0xvY2FsUHJvcGVydHlDcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL05vdEVxdWFsc1N0cmluZ1Rlc3RCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvTm90RXF1YWxzU3RyaW5nVGVzdEJlYW4uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Ob3RFcXVhbHNTdHJpbmdUZXN0QmVhbi5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvTm90RXF1YWxzU3RyaW5nVGVzdEJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Ob3RFcXVhbHNTdHJpbmdUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL05vdEVxdWFsc1N0cmluZ1Rlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvTm90RXF1YWxzU3RyaW5nVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL05vdEVxdWFsc1N0cmluZ1Rlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsUmV2ZXJzZU1lc3NhZ2VUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFJldmVyc2VNZXNzYWdlVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxSZXZlcnNlTWVzc2FnZVRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1Byb3BlcnR5Q2hhaW5Dcm9zc1ZhbFRlc3REYXRlQmVhbi5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVCZWFuLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUHJvcGVydHlDaGFpbkNyb3NzVmFsVGVzdERhdGVTdWJCZWFuLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9Qcm9wZXJ0eUNoYWluQ3Jvc3NWYWxUZXN0RGF0ZVN1YkJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMVRlc3RCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjFUZXN0QmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYxVGVzdEJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYxVGVzdEJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMVRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjFUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYxVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYxVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMlRlc3RCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjJUZXN0QmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYyVGVzdEJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYyVGVzdEJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmMlRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjJUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYyVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYyVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmM1Rlc3RCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjNUZXN0QmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYzVGVzdEJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYzVGVzdEJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmM1Rlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjNUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYzVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWYzVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmNFRlc3RCZWFuLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjRUZXN0QmVhbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWY0VGVzdEJlYW4uamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWY0VGVzdEJlYW4uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9SZXF1aXJlZElmNFRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3Jvc3N2YWwvUmVxdWlyZWRJZjRUZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWY0VGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL1JlcXVpcmVkSWY0VGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9tb2NrL01vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9tb2NrL01vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9jcm9zc3ZhbC9tb2NrL01vY2tFcXVhbHNWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2Nyb3NzdmFsL21vY2svTW9ja0VxdWFsc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2N1c3RvbS9DdXN0b21WaW9sYXRpb25TZXZlcml0eS5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2N1c3RvbS9DdXN0b21WaW9sYXRpb25TZXZlcml0eS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2N1c3RvbS9DdXN0b21WaW9sYXRpb25TZXZlcml0eS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvY3VzdG9tL0N1c3RvbVZpb2xhdGlvblNldmVyaXR5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uTW9kdWxlTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvbk1vZHVsZU1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25Nb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25Nb2R1bGVNZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uTW9kdWxlUHJvcGVydHlWYWxpZGF0aW9uSW50ZXJjZXB0b3JUZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24tdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC9wcm9wdmFsL2ludGVyY2VwdG9yL1JlZ2lzdHJhdGlvbk1vZHVsZVByb3BlcnR5VmFsaWRhdGlvbkludGVyY2VwdG9yVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25Nb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25Nb2R1bGVQcm9wZXJ0eVZhbGlkYXRpb25JbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uUmVuZGVyZXJJbnRlcmNlcHRvclRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uUmVuZGVyZXJJbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3Byb3B2YWwvaW50ZXJjZXB0b3IvUmVnaXN0cmF0aW9uUmVuZGVyZXJJbnRlcmNlcHRvclRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uLXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvcHJvcHZhbC9pbnRlcmNlcHRvci9SZWdpc3RyYXRpb25SZW5kZXJlckludGVyY2VwdG9yVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy90cmluaWRhZC1jb21wb25lbnQtc3VwcG9ydC10ZXN0cy9wb20ueG1sIGIvdGVzdC1tb2R1bGVzL3RyaW5pZGFkLWNvbXBvbmVudC1zdXBwb3J0LXRlc3RzL3BvbS54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvdHJpbmlkYWQtY29tcG9uZW50LXN1cHBvcnQtdGVzdHMvcG9tLnhtbApyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3RyaW5pZGFkLWNvbXBvbmVudC1zdXBwb3J0LXRlc3RzL3BvbS54bWwKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvdHJpbmlkYWQtY29tcG9uZW50LXN1cHBvcnQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC90cmluaWRhZC9BYnN0cmFjdFRyaW5pZGFkU3VwcG9ydFRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvdHJpbmlkYWQtY29tcG9uZW50LXN1cHBvcnQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC90cmluaWRhZC9BYnN0cmFjdFRyaW5pZGFkU3VwcG9ydFRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvdHJpbmlkYWQtY29tcG9uZW50LXN1cHBvcnQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC90cmluaWRhZC9BYnN0cmFjdFRyaW5pZGFkU3VwcG9ydFRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy90cmluaWRhZC1jb21wb25lbnQtc3VwcG9ydC10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3RyaW5pZGFkL0Fic3RyYWN0VHJpbmlkYWRTdXBwb3J0VGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy90cmluaWRhZC1jb21wb25lbnQtc3VwcG9ydC10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3RyaW5pZGFkL2NvbmZpZy9FeHRWYWxUcmluaWRhZFN1cHBvcnRNb2R1bGVDb25maWd1cmF0aW9uQ3VzdG9tVGVzdENhc2UuamF2YSBiL3Rlc3QtbW9kdWxlcy90cmluaWRhZC1jb21wb25lbnQtc3VwcG9ydC10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3RyaW5pZGFkL2NvbmZpZy9FeHRWYWxUcmluaWRhZFN1cHBvcnRNb2R1bGVDb25maWd1cmF0aW9uQ3VzdG9tVGVzdENhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3Rlc3QtbW9kdWxlcy90cmluaWRhZC1jb21wb25lbnQtc3VwcG9ydC10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3RyaW5pZGFkL2NvbmZpZy9FeHRWYWxUcmluaWRhZFN1cHBvcnRNb2R1bGVDb25maWd1cmF0aW9uQ3VzdG9tVGVzdENhc2UuamF2YQpyZW5hbWUgdG8gdGVzdC1tb2R1bGVzL3RyaW5pZGFkLWNvbXBvbmVudC1zdXBwb3J0LXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdHJpbmlkYWQvY29uZmlnL0V4dFZhbFRyaW5pZGFkU3VwcG9ydE1vZHVsZUNvbmZpZ3VyYXRpb25DdXN0b21UZXN0Q2FzZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3RyaW5pZGFkLWNvbXBvbmVudC1zdXBwb3J0LXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdHJpbmlkYWQvY29uZmlnL0V4dFZhbFRyaW5pZGFkU3VwcG9ydE1vZHVsZUNvbmZpZ3VyYXRpb25EZWFjdGl2YXRlQ2xpZW50U2lkZVZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhIGIvdGVzdC1tb2R1bGVzL3RyaW5pZGFkLWNvbXBvbmVudC1zdXBwb3J0LXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdHJpbmlkYWQvY29uZmlnL0V4dFZhbFRyaW5pZGFkU3VwcG9ydE1vZHVsZUNvbmZpZ3VyYXRpb25EZWFjdGl2YXRlQ2xpZW50U2lkZVZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdGVzdC1tb2R1bGVzL3RyaW5pZGFkLWNvbXBvbmVudC1zdXBwb3J0LXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3Rlc3QvdHJpbmlkYWQvY29uZmlnL0V4dFZhbFRyaW5pZGFkU3VwcG9ydE1vZHVsZUNvbmZpZ3VyYXRpb25EZWFjdGl2YXRlQ2xpZW50U2lkZVZhbGlkYXRpb25UZXN0Q2FzZS5qYXZhCnJlbmFtZSB0byB0ZXN0LW1vZHVsZXMvdHJpbmlkYWQtY29tcG9uZW50LXN1cHBvcnQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC90cmluaWRhZC9jb25maWcvRXh0VmFsVHJpbmlkYWRTdXBwb3J0TW9kdWxlQ29uZmlndXJhdGlvbkRlYWN0aXZhdGVDbGllbnRTaWRlVmFsaWRhdGlvblRlc3RDYXNlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvdHJpbmlkYWQtY29tcG9uZW50LXN1cHBvcnQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC90cmluaWRhZC9jb25maWcvRXh0VmFsVHJpbmlkYWRTdXBwb3J0TW9kdWxlQ29uZmlndXJhdGlvblRlc3RDYXNlLmphdmEgYi90ZXN0LW1vZHVsZXMvdHJpbmlkYWQtY29tcG9uZW50LXN1cHBvcnQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC90cmluaWRhZC9jb25maWcvRXh0VmFsVHJpbmlkYWRTdXBwb3J0TW9kdWxlQ29uZmlndXJhdGlvblRlc3RDYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS90ZXN0LW1vZHVsZXMvdHJpbmlkYWQtY29tcG9uZW50LXN1cHBvcnQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdGVzdC90cmluaWRhZC9jb25maWcvRXh0VmFsVHJpbmlkYWRTdXBwb3J0TW9kdWxlQ29uZmlndXJhdGlvblRlc3RDYXNlLmphdmEKcmVuYW1lIHRvIHRlc3QtbW9kdWxlcy90cmluaWRhZC1jb21wb25lbnQtc3VwcG9ydC10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci90ZXN0L3RyaW5pZGFkL2NvbmZpZy9FeHRWYWxUcmluaWRhZFN1cHBvcnRNb2R1bGVDb25maWd1cmF0aW9uVGVzdENhc2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vcG9tLnhtbCBiL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vcG9tLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vcG9tLnhtbApyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9wb20ueG1sCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5Bd2FyZUNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5LmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhbkF3YXJlQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuQXdhcmVDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeS5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhbkF3YXJlQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuQXdhcmVWYWxpZGF0b3JGYWN0b3J5LmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhbkF3YXJlVmFsaWRhdG9yRmFjdG9yeS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5Bd2FyZVZhbGlkYXRvckZhY3RvcnkuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5Bd2FyZVZhbGlkYXRvckZhY3RvcnkuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0JlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9CZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvckludGVybmFscy5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHMuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9EZWZhdWx0RXh0VmFsQmVhblZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvRGVmYXVsdEV4dFZhbEJlYW5WYWxpZGF0aW9uTW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0RlZmF1bHRFeHRWYWxCZWFuVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24uamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0RlZmF1bHRFeHRWYWxCZWFuVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9FeHRWYWxCZWFuVmFsaWRhdGlvbkNvbnRleHQuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0V4dFZhbEJlYW5WYWxpZGF0aW9uQ29udGV4dC5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0V4dFZhbEJlYW5WYWxpZGF0aW9uTW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0V4dFZhbEJlYW5WYWxpZGF0aW9uTW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0V4dFZhbEJlYW5WYWxpZGF0aW9uTW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvRXh0VmFsQmVhblZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL01hcHBlZENvbnN0cmFpbnRTb3VyY2VCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL01hcHBlZENvbnN0cmFpbnRTb3VyY2VCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL01hcHBlZENvbnN0cmFpbnRTb3VyY2VCZWFuVmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvTWFwcGVkQ29uc3RyYWludFNvdXJjZUJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvTWFwcGVkQ29uc3RyYWludFNvdXJjZUJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvTWFwcGVkQ29uc3RyYWludFNvdXJjZUJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvTWFwcGVkQ29uc3RyYWludFNvdXJjZUJlYW5WYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9ySW50ZXJuYWxzLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9NYXBwZWRDb25zdHJhaW50U291cmNlQmVhblZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3JJbnRlcm5hbHMuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL0JlYW5WYWxpZGF0aW9uLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9CZWFuVmFsaWRhdGlvbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vQmVhblZhbGlkYXRpb24uamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vQmVhblZhbGlkYXRpb24uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL01vZGVsVmFsaWRhdGlvbi5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vTW9kZWxWYWxpZGF0aW9uLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9Nb2RlbFZhbGlkYXRpb24uamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2Fubm90YXRpb24vTW9kZWxWYWxpZGF0aW9uLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdEdyb3VwQ29udHJvbGxlclNjYW5uaW5nRXh0cmFjdG9yLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdEdyb3VwQ29udHJvbGxlclNjYW5uaW5nRXh0cmFjdG9yLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdEdyb3VwQ29udHJvbGxlclNjYW5uaW5nRXh0cmFjdG9yLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0R3JvdXBDb250cm9sbGVyU2Nhbm5pbmdFeHRyYWN0b3IuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9pbnRlcmNlcHRvci9FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhRXh0cmFjdGlvbkludGVyY2VwdG9yLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvaW50ZXJjZXB0b3IvRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUV4dHJhY3Rpb25JbnRlcmNlcHRvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0V4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL2ludGVyY2VwdG9yL0V4dFZhbEJlYW5WYWxpZGF0aW9uTWV0YURhdGFFeHRyYWN0aW9uSW50ZXJjZXB0b3IuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0Fic3RyYWN0QmVhblZhbGlkYXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0Fic3RyYWN0QmVhblZhbGlkYXRpb25NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTm90TnVsbE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ob3ROdWxsTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL05vdE51bGxNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ob3ROdWxsTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1N0cmluZ1NpemVNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU3RyaW5nU2l6ZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9TdHJpbmdTaXplTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvU3RyaW5nU2l6ZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvQWJzdHJhY3RCZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3lUb01ldGFEYXRhVHJhbnNmb3JtZXJOYW1lTWFwcGVyLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL0Fic3RyYWN0QmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5VG9NZXRhRGF0YVRyYW5zZm9ybWVyTmFtZU1hcHBlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9BYnN0cmFjdEJlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneVRvTWV0YURhdGFUcmFuc2Zvcm1lck5hbWVNYXBwZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvTm90TnVsbE5hbWVNYXBwZXIuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvTm90TnVsbE5hbWVNYXBwZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9tYXBwZXIvTm90TnVsbE5hbWVNYXBwZXIuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9Ob3ROdWxsTmFtZU1hcHBlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaXplTmFtZU1hcHBlci5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaXplTmFtZU1hcHBlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL21hcHBlci9TaXplTmFtZU1hcHBlci5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvbWFwcGVyL1NpemVOYW1lTWFwcGVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvcGF5bG9hZC9EaXNhYmxlQ2xpZW50U2lkZVZhbGlkYXRpb24uamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wYXlsb2FkL0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3BheWxvYWQvRGlzYWJsZUNsaWVudFNpZGVWYWxpZGF0aW9uLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wYXlsb2FkL0Rpc2FibGVDbGllbnRTaWRlVmFsaWRhdGlvbi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3BheWxvYWQvVmlvbGF0aW9uU2V2ZXJpdHkuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9wYXlsb2FkL1Zpb2xhdGlvblNldmVyaXR5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvcGF5bG9hZC9WaW9sYXRpb25TZXZlcml0eS5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvcGF5bG9hZC9WaW9sYXRpb25TZXZlcml0eS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0YXJ0dXAvQmVhblZhbGlkYXRpb25TdGFydHVwTGlzdGVuZXIuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdGFydHVwL0JlYW5WYWxpZGF0aW9uU3RhcnR1cExpc3RlbmVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RhcnR1cC9CZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lci5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RhcnR1cC9CZWFuVmFsaWRhdGlvblN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdEJlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRCZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZS5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0QmVhblZhbGlkYXRpb25Hcm91cFN0b3JhZ2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL0RlZmF1bHRNb2RlbFZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9EZWZhdWx0TW9kZWxWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvRGVmYXVsdE1vZGVsVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25FbnRyeS5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvTW9kZWxWYWxpZGF0aW9uRW50cnkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvbkVudHJ5LmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvbkVudHJ5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL01vZGVsVmFsaWRhdGlvblN0b3JhZ2UuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9CZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9CZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9CZWFuVmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvbWFwcGVyL0JlYW5WYWxpZGF0aW9uR3JvdXBTdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3N0b3JhZ2UvbWFwcGVyL01vZGVsVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9tYXBwZXIvTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC9zdG9yYWdlL21hcHBlci9Nb2RlbFZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvc3RvcmFnZS9tYXBwZXIvTW9kZWxWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC91dGlsL0JlYW5WYWxpZGF0aW9uVXRpbHMuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC91dGlsL0JlYW5WYWxpZGF0aW9uVXRpbHMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC91dGlsL0JlYW5WYWxpZGF0aW9uVXRpbHMuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvQmVhblZhbGlkYXRpb25VdGlscy5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscy5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvRXh0VmFsQmVhblZhbGlkYXRpb25NZXRhRGF0YUludGVybmFscy5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9FeHRWYWxCZWFuVmFsaWRhdGlvbk1ldGFEYXRhSW50ZXJuYWxzLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdXRpbC9MYWJlbGVkTWVzc2FnZUludGVybmFscy5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3V0aWwvTGFiZWxlZE1lc3NhZ2VJbnRlcm5hbHMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC91dGlsL0xhYmVsZWRNZXNzYWdlSW50ZXJuYWxzLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC91dGlsL0xhYmVsZWRNZXNzYWdlSW50ZXJuYWxzLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvblBoYXNlTGlzdGVuZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL01vZGVsVmFsaWRhdGlvblJlc3VsdC5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vTW9kZWxWYWxpZGF0aW9uUmVzdWx0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9Nb2RlbFZhbGlkYXRpb25SZXN1bHQuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vTW9kZWxWYWxpZGF0aW9uUmVzdWx0LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9tZXNzYWdlL2ludGVycG9sYXRvci9EZWZhdWx0TWVzc2FnZUludGVycG9sYXRvci5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vbWVzc2FnZS9pbnRlcnBvbGF0b3IvRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0RlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0RlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9tZXNzYWdlL2ludGVycG9sYXRvci9FeHRWYWxNZXNzYWdlSW50ZXJwb2xhdG9yQWRhcHRlci5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vbWVzc2FnZS9pbnRlcnBvbGF0b3IvRXh0VmFsTWVzc2FnZUludGVycG9sYXRvckFkYXB0ZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0V4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL21lc3NhZ2UvaW50ZXJwb2xhdG9yL0V4dFZhbE1lc3NhZ2VJbnRlcnBvbGF0b3JBZGFwdGVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2JlYW52YWwvdmFsaWRhdGlvbi9zdHJhdGVneS9CZWFuVmFsaWRhdGlvblZpcnR1YWxWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iZWFudmFsL3ZhbGlkYXRpb24vc3RyYXRlZ3kvQmVhblZhbGlkYXRpb25WaXJ0dWFsVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmVhbnZhbC92YWxpZGF0aW9uL3N0cmF0ZWd5L0JlYW5WYWxpZGF0aW9uVmlydHVhbFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQgYi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dApkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS50eHQgYi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dApyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dApkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi92YWxpZGF0aW9uLW1vZHVsZXMvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZXMtY29uZmlnLnhtbApyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZXMtY29uZmlnLnhtbApkaWZmIC0tZ2l0IGEvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwgYi92YWxpZGF0aW9uLW1vZHVsZXMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWY3ODY0Ci0tLSAvZGV2L251bGwKKysrIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3BvbS54bWwKQEAgLTAsMCArMSw1MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKworICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvci52YWxpZGF0aW9uLW1vZHVsZXM8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1tb2R1bGVzLXByb2plY3Q8L2FydGlmYWN0SWQ+CisKKyAgICA8bmFtZT5NeUZhY2VzIEV4dGVuc2lvbnMtVmFsaWRhdG9yIFZhbGlkYXRpb24tTW9kdWxlczwvbmFtZT4KKyAgICA8dmVyc2lvbj4xLjEuNDwvdmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1leHR2YWwtbW9kdWxlPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjEuNDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPnByb3BlcnR5LXZhbGlkYXRpb248L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5iZWFuLXZhbGlkYXRpb248L21vZHVsZT4KKyAgICA8L21vZHVsZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5leHRlbnNpb25zLnZhbGlkYXRvcjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtZXh0dmFsLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjEuNDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vcG9tLnhtbCBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3BvbS54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9wb20ueG1sCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9wb20ueG1sCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSHRtbENvcmVDb21wb25lbnRzQ29tcG9uZW50SW5pdGlhbGl6ZXIuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0h0bWxDb3JlQ29tcG9uZW50c0NvbXBvbmVudEluaXRpYWxpemVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9IdG1sQ29yZUNvbXBvbmVudHNDb21wb25lbnRJbml0aWFsaXplci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvSm9pblZhbGlkYXRpb25NZXRhRGF0YVN0b3JhZ2VGaWx0ZXIuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL0pvaW5WYWxpZGF0aW9uTWV0YURhdGFTdG9yYWdlRmlsdGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Kb2luVmFsaWRhdGlvbk1ldGFEYXRhU3RvcmFnZUZpbHRlci5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Kb2luVmFsaWRhdGlvbk1ldGFEYXRhU3RvcmFnZUZpbHRlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvTWFwcGVkQ29uc3RyYWludFNvdXJjZVByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvTWFwcGVkQ29uc3RyYWludFNvdXJjZVByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvTWFwcGVkQ29uc3RyYWludFNvdXJjZVByb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9NYXBwZWRDb25zdHJhaW50U291cmNlUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Hcm91cFN0b3JhZ2VOYW1lTWFwcGVyLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbkdyb3VwU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZUtleS5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVLZXkuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlS2V5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVTdGFydHVwTGlzdGVuZXIuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlU3RhcnR1cExpc3RlbmVyLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVN0YXJ0dXBMaXN0ZW5lci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uTW9kdWxlVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvbk1vZHVsZVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Nb2R1bGVWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL1Byb3BlcnR5VmFsaWRhdGlvblNraXBWYWxpZGF0aW9uRXZhbHVhdG9yLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9Qcm9wZXJ0eVZhbGlkYXRpb25Ta2lwVmFsaWRhdGlvbkV2YWx1YXRvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvUHJvcGVydHlWYWxpZGF0aW9uU2tpcFZhbGlkYXRpb25FdmFsdWF0b3IuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvRGVmYXVsdEV4dFZhbEJhc2VWYWxpZGF0aW9uTW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9EZWZhdWx0RXh0VmFsQmFzZVZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL0RlZmF1bHRFeHRWYWxCYXNlVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24uamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9EZWZhdWx0RXh0VmFsQmFzZVZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL0V4dFZhbEJhc2VWYWxpZGF0aW9uTW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9FeHRWYWxCYXNlVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvRXh0VmFsQmFzZVZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvRXh0VmFsQmFzZVZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vRG91YmxlUmFuZ2UuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0RvdWJsZVJhbmdlLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Eb3VibGVSYW5nZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0pvaW5WYWxpZGF0aW9uLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vSm9pblZhbGlkYXRpb24uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Kb2luVmFsaWRhdGlvbi5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vSm9pblZhbGlkYXRpb24uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9MZW5ndGguamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xlbmd0aC5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL0xvbmdSYW5nZS5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vTG9uZ1JhbmdlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUGF0dGVybi5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1BhdHRlcm4uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9QYXR0ZXJuLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vUmVxdWlyZWQuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZC5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb24uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvbi5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vU2tpcFZhbGlkYXRpb24uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9Ta2lwVmFsaWRhdGlvblN1cHBvcnQuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1NraXBWYWxpZGF0aW9uU3VwcG9ydC5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1ZhbGlkYXRvci5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1ZhbGlkYXRvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL1ZhbGlkYXRvci5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vVmFsaWRhdG9yLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL2Fubm90YXRpb24vZXh0cmFjdG9yL0RlZmF1bHRQcm9wZXJ0eVNjYW5uaW5nTWV0YURhdGFFeHRyYWN0b3IuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9hbm5vdGF0aW9uL2V4dHJhY3Rvci9EZWZhdWx0UHJvcGVydHlTY2FubmluZ01ldGFEYXRhRXh0cmFjdG9yLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvYW5ub3RhdGlvbi9leHRyYWN0b3IvRGVmYXVsdFByb3BlcnR5U2Nhbm5pbmdNZXRhRGF0YUV4dHJhY3Rvci5qYXZhCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvcmVzb2x2ZXIvSnBhVmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9yZXNvbHZlci9KcGFWYWxpZGF0aW9uRXJyb3JNZXNzYWdlUmVzb2x2ZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvQWJzdHJhY3RWYWxpZGF0aW9uUGFyYW1ldGVyQXdhcmVUcmFuc2Zvcm1lci5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9BYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0Fic3RyYWN0VmFsaWRhdGlvblBhcmFtZXRlckF3YXJlVHJhbnNmb3JtZXIuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9BYnN0cmFjdFZhbGlkYXRpb25QYXJhbWV0ZXJBd2FyZVRyYW5zZm9ybWVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0RvdWJsZVJhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Eb3VibGVSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvRG91YmxlUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pvaW5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pvaW5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pvaW5NZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSm9pbk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvSnBhTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0pwYU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9KcGFNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xlbmd0aE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTGVuZ3RoTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9MZW5ndGhNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTGVuZ3RoTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Mb25nUmFuZ2VNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvTG9uZ1JhbmdlTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL0xvbmdSYW5nZU1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUGF0dGVybk1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9QYXR0ZXJuTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9SZXF1aXJlZE1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvUmVxdWlyZWRNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1JlcXVpcmVkTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ta2lwTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ta2lwTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9Ta2lwTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1NraXBNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21ldGFkYXRhL3RyYW5zZm9ybWVyL1ZhbGlkYXRvck1ldGFEYXRhVHJhbnNmb3JtZXIuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXRhZGF0YS90cmFuc2Zvcm1lci9WYWxpZGF0b3JNZXRhRGF0YVRyYW5zZm9ybWVyLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWV0YWRhdGEvdHJhbnNmb3JtZXIvVmFsaWRhdG9yTWV0YURhdGFUcmFuc2Zvcm1lci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Eb3VibGVSYW5nZVN0cmF0ZWd5LmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvRG91YmxlUmFuZ2VTdHJhdGVneS5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0RvdWJsZVJhbmdlU3RyYXRlZ3kuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSm9pblZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Kb2luVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pvaW5WYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Kb2luVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0pwYVZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9KcGFWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSnBhVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvSnBhVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvTGVuZ3RoU3RyYXRlZ3kuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9MZW5ndGhTdHJhdGVneS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Mb25nUmFuZ2VTdHJhdGVneS5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L0xvbmdSYW5nZVN0cmF0ZWd5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1BhdHRlcm5TdHJhdGVneS5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9QYXR0ZXJuU3RyYXRlZ3kuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUGF0dGVyblN0cmF0ZWd5LmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUGF0dGVyblN0cmF0ZWd5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1JlcXVpcmVkU3RyYXRlZ3kuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUmVxdWlyZWRTdHJhdGVneS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9SZXF1aXJlZFN0cmF0ZWd5LmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvUmVxdWlyZWRTdHJhdGVneS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9Ta2lwVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1NraXBWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvU2tpcFZhbGlkYXRpb25TdHJhdGVneS5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL3N0cmF0ZWd5L1NraXBWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvc3RyYXRlZ3kvVmFsaWRhdG9yU3RyYXRlZ3kuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9zdHJhdGVneS9WYWxpZGF0b3JTdHJhdGVneS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvQ3Jvc3NWYWxpZGF0aW9uUGhhc2VMaXN0ZW5lci5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9Dcm9zc1ZhbGlkYXRpb25QaGFzZUxpc3RlbmVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9EZWZhdWx0RXh0VmFsQ3Jvc3NWYWxpZGF0aW9uTW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvRGVmYXVsdEV4dFZhbENyb3NzVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0RlZmF1bHRFeHRWYWxDcm9zc1ZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0RlZmF1bHRFeHRWYWxDcm9zc1ZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9FeHRWYWxDcm9zc1ZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9FeHRWYWxDcm9zc1ZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9FeHRWYWxDcm9zc1ZhbGlkYXRpb25Nb2R1bGVDb25maWd1cmF0aW9uLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL0V4dFZhbENyb3NzVmFsaWRhdGlvbk1vZHVsZUNvbmZpZ3VyYXRpb24uamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL1dlYlhtbFBhcmFtZXRlci5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9XZWJYbWxQYXJhbWV0ZXIuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvV2ViWG1sUGFyYW1ldGVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJcy5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRGF0ZUlzLmphdmEKZGlmZiAtLWdpdCBhL3ByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJc1R5cGUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcHJlcGFyZS8xXzFfMi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0RhdGVJc1R5cGUuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9EYXRlSXNUeXBlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0VtcHR5SWYuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRW1wdHlJZi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FbXB0eUlmLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRW1wdHlJZi5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FbXB0eUlmVHlwZS5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FbXB0eUlmVHlwZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FbXB0eUlmVHlwZS5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0VtcHR5SWZUeXBlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL0VxdWFscy5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9FcXVhbHMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vRXF1YWxzLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL01lc3NhZ2VUYXJnZXQuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTWVzc2FnZVRhcmdldC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9NZXNzYWdlVGFyZ2V0LmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTWVzc2FnZVRhcmdldC5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9Ob3RFcXVhbHMuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vTm90RXF1YWxzLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL05vdEVxdWFscy5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL05vdEVxdWFscy5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZi5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9hbm5vdGF0aW9uL1JlcXVpcmVkSWYuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZlR5cGUuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZlR5cGUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL2Fubm90YXRpb24vUmVxdWlyZWRJZlR5cGUuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvYW5ub3RhdGlvbi9SZXF1aXJlZElmVHlwZS5qYXZhCmRpZmYgLS1naXQgYS9wcmVwYXJlLzFfMV8yL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHByZXBhcmUvMV8xXzIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9yZXNvbHZlci9EZWZhdWx0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVJlc29sdmVyLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvcmVzb2x2ZXIvRGVmYXVsdFZhbGlkYXRpb25FcnJvck1lc3NhZ2VSZXNvbHZlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcGFyYW1ldGVyL0Nhc2VJbnNlbnNpdGl2ZS5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcGFyYW1ldGVyL0Nhc2VJbnNlbnNpdGl2ZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcGFyYW1ldGVyL0Nhc2VJbnNlbnNpdGl2ZS5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9wYXJhbWV0ZXIvQ2FzZUluc2Vuc2l0aXZlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9yZWNvcmRlci9Dcm9zc1ZhbGlkYXRpb25Vc2VySW5wdXRSZWNvcmRlci5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvcmVjb3JkZXIvQ3Jvc3NWYWxpZGF0aW9uVXNlcklucHV0UmVjb3JkZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlY29yZGVyL0Nyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3JlY29yZGVyL0Nyb3NzVmFsaWRhdGlvblVzZXJJbnB1dFJlY29yZGVyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2UuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlRW50cnkuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZUVudHJ5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VFbnRyeS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZS5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRDcm9zc1ZhbGlkYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0Q3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU1hbmFnZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdENyb3NzVmFsaWRhdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvRGVmYXVsdFByb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9EZWZhdWx0UHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTWFuYWdlci5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL0RlZmF1bHRQcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2VNYW5hZ2VyLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZS5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9Qcm9jZXNzZWRJbmZvcm1hdGlvblN0b3JhZ2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlLmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5LmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZUVudHJ5LmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlRW50cnkuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvbWFwcGVyL0Nyb3NzVmFsaWRhdGlvblN0b3JhZ2VOYW1lTWFwcGVyLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdG9yYWdlL21hcHBlci9Dcm9zc1ZhbGlkYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvQ3Jvc3NWYWxpZGF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvbWFwcGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvbWFwcGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0b3JhZ2UvbWFwcGVyL1Byb2Nlc3NlZEluZm9ybWF0aW9uU3RvcmFnZU5hbWVNYXBwZXIuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RvcmFnZS9tYXBwZXIvUHJvY2Vzc2VkSW5mb3JtYXRpb25TdG9yYWdlTmFtZU1hcHBlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDb21wYXJlU3RyYXRlZ3kuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Fic3RyYWN0Q29tcGFyZVN0cmF0ZWd5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENvbXBhcmVTdHJhdGVneS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQWJzdHJhY3RDcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9BYnN0cmFjdENyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25IZWxwZXIuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvbkhlbHBlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uSGVscGVyLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvbkhlbHBlci5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvQ3Jvc3NWYWxpZGF0aW9uU3RyYXRlZ3kuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0Nyb3NzVmFsaWRhdGlvblN0cmF0ZWd5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Dcm9zc1ZhbGlkYXRpb25TdHJhdGVneS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRGF0ZUlzU3RyYXRlZ3kuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0RhdGVJc1N0cmF0ZWd5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9EYXRlSXNTdHJhdGVneS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRUxDb21wYXJlU3RyYXRlZ3kuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VMQ29tcGFyZVN0cmF0ZWd5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FTENvbXBhcmVTdHJhdGVneS5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRW1wdHlJZlN0cmF0ZWd5LmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FbXB0eUlmU3RyYXRlZ3kuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VtcHR5SWZTdHJhdGVneS5qYXZhCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FbXB0eUlmU3RyYXRlZ3kuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0VxdWFsc1N0cmF0ZWd5LmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9FcXVhbHNTdHJhdGVneS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvRXF1YWxzU3RyYXRlZ3kuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsQ29tcGFyZVN0cmF0ZWd5LmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbENvbXBhcmVTdHJhdGVneS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxDb21wYXJlU3RyYXRlZ3kuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxDb21wYXJlU3RyYXRlZ3kuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L0xvY2FsUHJvcGVydHlDaGFpbkNvbXBhcmVTdHJhdGVneS5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Mb2NhbFByb3BlcnR5Q2hhaW5Db21wYXJlU3RyYXRlZ3kuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTG9jYWxQcm9wZXJ0eUNoYWluQ29tcGFyZVN0cmF0ZWd5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9Ob3RFcXVhbHNTdHJhdGVneS5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvTm90RXF1YWxzU3RyYXRlZ3kuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L05vdEVxdWFsc1N0cmF0ZWd5LmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L05vdEVxdWFsc1N0cmF0ZWd5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZWZlcmVuY2luZ1N0cmF0ZWd5LmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlZmVyZW5jaW5nU3RyYXRlZ3kuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL3N0cmF0ZWd5L1JlcXVpcmVkSWZTdHJhdGVneS5qYXZhIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVxdWlyZWRJZlN0cmF0ZWd5LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9zdHJhdGVneS9SZXF1aXJlZElmU3RyYXRlZ3kuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvc3RyYXRlZ3kvUmVxdWlyZWRJZlN0cmF0ZWd5LmphdmEKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci91dGlsL0Nyb3NzVmFsaWRhdGlvblV0aWxzLmphdmEKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvQ3Jvc3NWYWxpZGF0aW9uVXRpbHMuamF2YQpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuamF2YSBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL3V0aWwvUHJvcGVydHlWYWxpZGF0aW9uVXRpbHMuamF2YQpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvdXRpbC9Qcm9wZXJ0eVZhbGlkYXRpb25VdGlscy5qYXZhCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0IGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dCBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS50eHQKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0CmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZXMtY29uZmlnLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcueG1sCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZXMtY29uZmlnLnhtbApkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcwpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcwpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcwpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcwpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcwpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcwpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcwpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvYmFzZXZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Jhc2V2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcwpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9iYXNldmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXMucHJvcGVydGllcwpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfYXIucHJvcGVydGllcyBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2FyLnByb3BlcnRpZXMKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19hci5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2NhLnByb3BlcnRpZXMgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19jYS5wcm9wZXJ0aWVzCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfY2EucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZGUucHJvcGVydGllcwpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZW4ucHJvcGVydGllcyBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2VzLnByb3BlcnRpZXMgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19lcy5wcm9wZXJ0aWVzCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZXMucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19mci5wcm9wZXJ0aWVzIGIvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfZnIucHJvcGVydGllcwpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2JyYW5jaF9mb3JfanNmXzFfMS92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfaXQucHJvcGVydGllcyBiL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX2l0LnByb3BlcnRpZXMKcmVuYW1lIHRvIHZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc19pdC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9icmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9jcm9zc3ZhbC9tZXNzYWdlL2J1bmRsZS92YWxpZGF0aW9uX21lc3NhZ2VzX3RyLnByb3BlcnRpZXMgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvY3Jvc3N2YWwvbWVzc2FnZS9idW5kbGUvdmFsaWRhdGlvbl9tZXNzYWdlc190ci5wcm9wZXJ0aWVzCnJlbmFtZSB0byB2YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2Nyb3NzdmFsL21lc3NhZ2UvYnVuZGxlL3ZhbGlkYXRpb25fbWVzc2FnZXNfdHIucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvZXh0ZW5zaW9ucy92YWxpZGF0b3IvanBhX3N0cmF0ZWd5X21hcHBpbmdzLnByb3BlcnRpZXMgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2V4dGVuc2lvbnMvdmFsaWRhdG9yL2pwYV9zdHJhdGVneV9tYXBwaW5ncy5wcm9wZXJ0aWVzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcwpyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9leHRlbnNpb25zL3ZhbGlkYXRvci9qcGFfc3RyYXRlZ3lfbWFwcGluZ3MucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnJhbmNoX2Zvcl9qc2ZfMV8xL3ZhbGlkYXRpb24tbW9kdWxlcy9wcm9wZXJ0eS12YWxpZGF0aW9uL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi92YWxpZGF0aW9uLW1vZHVsZXMvcHJvcGVydHktdmFsaWRhdGlvbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBicmFuY2hfZm9yX2pzZl8xXzEvdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3NpdGUvYXB0L2luZGV4LmFwdApyZW5hbWUgdG8gdmFsaWRhdGlvbi1tb2R1bGVzL3Byb3BlcnR5LXZhbGlkYXRpb24vc3JjL3NpdGUvYXB0L2luZGV4LmFwdAo=